/** * Viking Local Adapter - Tauri Sidecar Integration * * Provides local memory operations through the OpenViking CLI sidecar. * This eliminates the need for a Python server dependency. */ import { invoke } from '@tauri-apps/api/core'; // === Types === export interface LocalVikingStatus { available: boolean; version?: string; dataDir?: string; error?: string; } export interface LocalVikingResource { uri: string; name: string; type: string; size?: number; modifiedAt?: string; } export interface LocalVikingFindResult { uri: string; score: number; content: string; level: string; overview?: string; } export interface LocalVikingGrepResult { uri: string; line: number; content: string; matchStart: number; matchEnd: number; } export interface LocalVikingAddResult { uri: string; status: string; } // === Local Viking Client === export class VikingLocalClient { private available: boolean | null = null; async isAvailable(): Promise { if (this.available !== null) { return this.available; } try { const status = await this.status(); this.available = status.available; return status.available; } catch { this.available = false; return false; } } async status(): Promise { return await invoke('viking_status'); } async addResource( uri: string, content: string ): Promise { // For small content, use inline; for large content. use file-based if (content.length < 10000) { return await invoke('viking_add_inline', { uri, content }); } else { return await invoke('viking_add', { uri, content }); } } async find( query: string, options?: { scope?: string; limit?: number; } ): Promise { return await invoke('viking_find', { query, scope: options?.scope, limit: options?.limit, }); } async grep( pattern: string, options?: { uri?: string; caseSensitive?: boolean; limit?: number; } ): Promise { return await invoke('viking_grep', { pattern, uri: options?.uri, caseSensitive: options?.caseSensitive, limit: options?.limit, }); } async ls(path: string): Promise { return await invoke('viking_ls', { path }); } async readContent(uri: string, level?: string): Promise { return await invoke('viking_read', { uri, level }); } async removeResource(uri: string): Promise { await invoke('viking_remove', { uri }); } async tree(path: string, depth?: number): Promise { return await invoke('viking_tree', { path, depth }); } } // === Singleton === let _localClient: VikingLocalClient | null; export function getVikingLocalClient(): VikingLocalClient { if (!_localClient) { _localClient = new VikingLocalClient(); } return _localClient; } export function resetVikingLocalClient(): void { _localClient = null; }