openviber 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -129
- package/dist/cli/index.cjs +18342 -7685
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +18580 -7936
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +4918 -7184
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +282 -905
- package/dist/index.d.ts +282 -905
- package/dist/index.js +4906 -7177
- package/dist/index.js.map +1 -1
- package/package.json +23 -10
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/message.ts","../../src/core/provider.ts","../../src/config.ts","../../src/storage/adapters/local.ts","../../src/storage/base.ts","../../src/storage/adapters/supabase.ts","../../src/storage/space.ts","../../src/utils/id.ts","../../src/data/adapters/local.ts","../../src/data/adapters/supabase-server.ts","../../src/data/factory.ts","../../src/tools/base.ts","../../src/tools/file.ts","../../src/tools/search-config.ts","../../src/tools/search.ts","../../src/tools/web.ts","../../src/tools/browser.ts","../../src/tools/desktop.ts","../../src/tools/index.ts","../../src/core/tool.ts","../../src/skills/registry.ts","../../src/core/agent.ts","../../src/daemon/scheduler.ts","../../src/daemon/runtime.ts","../../src/daemon/terminal.ts","../../src/daemon/controller.ts","../../src/skills/antigravity/index.ts","../../src/skills/cursor-agent/index.ts","../../src/skills/tmux/index.ts","../../src/skills/index.ts","../../src/daemon/local-server.ts","../../src/daemon/hub.ts","../../src/core/task.ts","../../src/core/plan.ts","../../src/core/collaboration.ts","../../src/core/space.ts","../../src/core/viber-agent.ts","../../src/channels/manager.ts","../../src/channels/dingtalk.ts","../../src/channels/wecom.ts","../../src/cli/index.ts"],"sourcesContent":["/**\n * Message types for Viber - Using AI SDK v6 types directly\n */\n\nimport type { ModelMessage } from 'ai';\n\n// Extend CoreMessage to include our metadata\nexport interface ViberMessage {\n role: 'system' | 'user' | 'assistant' | 'function' | 'data' | 'tool';\n content: any;\n id?: string; // Message ID (includes agent prefix for tracking)\n metadata?: {\n agentName?: string;\n timestamp?: number;\n [key: string]: any;\n };\n}\n\n// Use ViberMessage as our Message type\nexport type Message = ViberMessage;\n\n/**\n * Get text content from a message\n */\nexport function getTextContent(message: Message): string {\n if (!message || !message.content) {\n return '';\n }\n\n if (typeof message.content === 'string') {\n return message.content;\n }\n\n if (Array.isArray(message.content)) {\n return message.content\n .filter((part: any) => part && part.type === 'text')\n .map((part: any) => part.text || '')\n .join(' ');\n }\n\n return '';\n}\n\n/**\n * Queued message with metadata\n */\nexport interface QueuedMessage {\n id: string;\n content: string;\n status: 'queued' | 'processing' | 'completed' | 'error';\n timestamp: number;\n edited?: boolean;\n error?: string;\n metadata?: any;\n}\n\n/**\n * Queue state for UI\n */\nexport interface QueueState {\n current?: QueuedMessage;\n queue: QueuedMessage[];\n processing: boolean;\n}\n\n/**\n * Queue listener type\n */\nexport type QueueListener = (state: QueueState) => void;\n\n/**\n * Enhanced Message Queue with management capabilities\n */\nexport class MessageQueue {\n private queue: QueuedMessage[] = [];\n private current?: QueuedMessage;\n private processing = false;\n private listeners = new Set<QueueListener>();\n private nextId = 1;\n\n /**\n * Add message to queue\n */\n add(content: string, metadata?: any): string {\n const message: QueuedMessage = {\n id: `msg-${this.nextId++}`,\n content,\n status: 'queued',\n timestamp: Date.now(),\n metadata,\n };\n\n this.queue.push(message);\n this.notify();\n return message.id;\n }\n\n /**\n * Get next message from queue\n */\n next(): QueuedMessage | undefined {\n const message = this.queue.shift();\n if (message) {\n message.status = 'processing';\n this.current = message;\n this.processing = true;\n this.notify();\n }\n return message;\n }\n\n /**\n * Mark current message as complete\n */\n complete(messageId: string) {\n if (this.current?.id === messageId) {\n this.current.status = 'completed';\n this.current = undefined;\n this.processing = false;\n this.notify();\n }\n }\n\n /**\n * Mark current message as error\n */\n error(messageId: string, error: string) {\n if (this.current?.id === messageId) {\n this.current.status = 'error';\n this.current.error = error;\n this.current = undefined;\n this.processing = false;\n this.notify();\n }\n }\n\n /**\n * Remove message from queue\n */\n remove(messageId: string): boolean {\n const index = this.queue.findIndex(m => m.id === messageId);\n if (index > -1) {\n this.queue.splice(index, 1);\n this.notify();\n return true;\n }\n return false;\n }\n\n /**\n * Reorder queue\n */\n reorder(messageId: string, newIndex: number) {\n const currentIndex = this.queue.findIndex(m => m.id === messageId);\n if (currentIndex > -1 && newIndex >= 0 && newIndex < this.queue.length) {\n const [message] = this.queue.splice(currentIndex, 1);\n this.queue.splice(newIndex, 0, message);\n this.notify();\n }\n }\n\n /**\n * Edit queued message\n */\n edit(messageId: string, content: string) {\n const message = this.queue.find(m => m.id === messageId);\n if (message && message.status === 'queued') {\n message.content = content;\n message.edited = true;\n this.notify();\n }\n }\n\n /**\n * Clear all queued messages\n */\n clear() {\n this.queue = [];\n this.notify();\n }\n\n /**\n * Get queue state\n */\n getState(): QueueState {\n return {\n current: this.current,\n queue: [...this.queue],\n processing: this.processing,\n };\n }\n\n /**\n * Subscribe to queue changes\n */\n subscribe(listener: QueueListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Check if queue is empty\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * Check if processing\n */\n isProcessing(): boolean {\n return this.processing;\n }\n\n /**\n * Notify listeners\n */\n private notify() {\n const state = this.getState();\n this.listeners.forEach(listener => listener(state));\n }\n}\n\n/**\n * Conversation History management\n */\nexport class ConversationHistory {\n public messages: Message[] = [];\n\n add(message: Message): void {\n // Ensure message has an ID\n if (!message.id) {\n const agentName = message.metadata?.agentName || 'unknown';\n const prefix = agentName.toLowerCase().replace(/\\s+/g, '-');\n const randomId = Math.random().toString(36).substring(2, 10);\n message.id = `${prefix}_${randomId}`;\n }\n this.messages.push(message);\n }\n\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n getLastN(n: number): Message[] {\n return this.messages.slice(-n);\n }\n\n clear(): void {\n this.messages = [];\n }\n\n toModelMessages(): ModelMessage[] {\n // Convert to AI SDK format, cleaning content appropriately\n return this.messages\n .map(msg => {\n // Skip tool messages - they can't be passed without their parent tool_calls\n if (msg.role === 'tool') {\n return null;\n }\n\n // Clean content to be AI SDK compatible\n let cleanContent: any = msg.content;\n\n // If content is an array, extract only text parts\n if (Array.isArray(msg.content)) {\n const textParts = msg.content.filter((part: any) => part.type === 'text');\n if (textParts.length > 0) {\n // Join all text parts into a single string\n cleanContent = textParts\n .map((part: any) => part.text || '')\n .filter((text: string) => text)\n .join('\\n');\n } else {\n // No text content, skip this message\n return null;\n }\n }\n\n // Skip messages with no content\n if (!cleanContent) {\n return null;\n }\n\n return {\n role: msg.role,\n content: cleanContent,\n };\n })\n .filter(msg => msg !== null) as ModelMessage[];\n }\n}","/**\n * AI Provider Management\n * Handles initialization and configuration of different AI providers\n *\n * Philosophy: Keep it simple - agents specify their provider and model explicitly.\n *\n * To add a new provider (e.g., Google, Mistral, Cohere):\n * 1. Install: `pnpm add @ai-sdk/google`\n * 2. Import: `import { createGoogleGenerativeAI } from \"@ai-sdk/google\";`\n * 3. Add case: `case \"google\": return createGoogleGenerativeAI({...})`\n * 4. Add environment variable handling\n */\n\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { deepseek } from \"@ai-sdk/deepseek\";\nimport { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\n\nexport type ModelProvider = string; // Allow any provider string for extensibility\n\nexport interface ModelConfig {\n provider: ModelProvider;\n modelName: string;\n apiKey?: string;\n baseURL?: string;\n // Viber-specific options\n spaceId?: string;\n userId?: string; // For usage tracking (e.g., Helicone)\n storageRoot?: string;\n teamConfig?: string;\n defaultGoal?: string;\n}\n\n/**\n * Get the appropriate AI provider instance\n */\nexport function getModelProvider(config: ModelConfig) {\n const {\n provider,\n apiKey,\n baseURL,\n spaceId,\n userId,\n storageRoot,\n teamConfig,\n defaultGoal,\n } = config;\n\n switch (provider) {\n case \"anthropic\":\n return createAnthropic({\n apiKey: apiKey || process.env.ANTHROPIC_API_KEY,\n baseURL: baseURL || process.env.ANTHROPIC_BASE_URL,\n });\n\n case \"openai\":\n return createOpenAI({\n apiKey: apiKey || process.env.OPENAI_API_KEY,\n baseURL: baseURL || process.env.OPENAI_BASE_URL,\n });\n\n case \"deepseek\":\n return deepseek;\n\n case \"openrouter\":\n // Use the official OpenRouter SDK (v2.0.2+ for AI SDK 6 compatibility)\n const openrouterConfig: any = {\n apiKey: apiKey || process.env.OPENROUTER_API_KEY,\n };\n\n // Use Helicone gateway for observability if configured\n if (process.env.HELICONE_API_KEY) {\n openrouterConfig.baseURL =\n baseURL || \"https://openrouter.helicone.ai/api/v1\";\n openrouterConfig.headers = {\n \"Helicone-Auth\": `Bearer ${process.env.HELICONE_API_KEY}`,\n \"Helicone-Property-User\": userId || \"anonymous\",\n \"Helicone-Property-Space\": spaceId || \"default\",\n };\n }\n\n return createOpenRouter(openrouterConfig);\n\n default:\n // For other providers, assume they follow the standard pattern\n // This allows users to add support for Google, Mistral, Cohere, etc.\n // by providing the appropriate imports and configuration\n throw new Error(\n `Provider '${provider}' is not configured. ` +\n `To use ${provider}, add the appropriate AI SDK provider import and configuration to core/provider.ts`,\n );\n }\n}\n\n/**\n * Check if a provider is properly configured\n */\nexport function isProviderConfigured(provider: string): boolean {\n switch (provider) {\n case \"anthropic\":\n return !!process.env.ANTHROPIC_API_KEY;\n case \"openai\":\n return !!process.env.OPENAI_API_KEY;\n case \"deepseek\":\n return !!process.env.DEEPSEEK_API_KEY;\n case \"openrouter\":\n return !!process.env.OPENROUTER_API_KEY;\n case \"google\":\n // Google provider needs to be imported and configured\n return false; // Not yet implemented\n case \"mistral\":\n return false; // Not yet implemented\n case \"cohere\":\n return false; // Not yet implemented\n default:\n return false;\n }\n}\n\n/**\n * Get list of configured providers\n */\nexport function getConfiguredProviders(): string[] {\n const providers = [\n \"anthropic\",\n \"openai\",\n \"deepseek\",\n \"openrouter\",\n \"google\",\n \"mistral\",\n \"cohere\",\n ];\n return providers.filter(isProviderConfigured);\n}\n\n/**\n * Parse model string to extract provider and model name\n * Examples: \"gpt-4o\" -> { provider: \"openai\", modelName: \"gpt-4o\" }\n */\nexport function parseModelString(model: string): ModelConfig {\n // Viber models are handled differently - not through this parser\n // if (model.startsWith(\"viber-\") || model === \"viber\") {\n // return { provider: \"viber\", modelName: model };\n // }\n\n // Anthropic models (direct access)\n if (model.startsWith(\"claude-\")) {\n return { provider: \"anthropic\", modelName: model };\n }\n\n // Deepseek models (direct access)\n if (model.startsWith(\"deepseek-\")) {\n return { provider: \"deepseek\", modelName: model };\n }\n\n // Models with \"/\" are OpenRouter format (e.g., \"deepseek/deepseek-chat\", \"openai/gpt-4o-mini\")\n // OpenRouter API expects upstream provider/model only — never prefix with \"openrouter/\"\n if (model.includes(\"/\")) {\n const modelName = model.startsWith(\"openrouter/\")\n ? model.slice(\"openrouter/\".length)\n : model;\n return { provider: \"openrouter\", modelName };\n }\n\n // Simple model names default to OpenAI (e.g., \"gpt-4o\", \"gpt-4o-mini\")\n return { provider: \"openai\", modelName: model };\n}\n\n/**\n * Get context limit for a model\n */\nexport function getModelContextLimit(modelName: string): number {\n const contextLimits: Record<string, number> = {\n // Viber (uses underlying model limits dynamically)\n viber: 100000,\n \"viber-default\": 100000,\n\n // Deepseek\n \"deepseek-chat\": 65536,\n \"deepseek-reasoner\": 65536,\n\n // OpenRouter models\n \"anthropic/claude-3.5-sonnet\": 150000,\n \"anthropic/claude-3.5-haiku\": 150000,\n \"openai/gpt-4o\": 100000,\n \"openai/o1-preview\": 100000,\n \"google/gemini-2.0-flash-exp:free\": 100000,\n \"meta-llama/llama-3.3-70b-instruct\": 32000,\n\n // Anthropic\n \"claude-3-5-sonnet-20240620\": 150000,\n \"claude-3-haiku-20240307\": 150000,\n \"claude-3-opus-20240229\": 150000,\n\n // OpenAI\n \"gpt-4o\": 100000,\n \"gpt-4o-mini\": 100000,\n \"gpt-4-turbo\": 100000,\n \"gpt-3.5-turbo\": 16000,\n };\n\n return contextLimits[modelName] || 50000; // Default to 50k\n}\n\n/**\n * Get completion token reservation for a model\n */\nexport function getCompletionTokens(modelName: string): number {\n if (modelName.startsWith(\"deepseek-reasoner\")) {\n return 32000; // Deepseek reasoner needs more tokens\n }\n if (modelName.startsWith(\"deepseek-\")) {\n return 8000;\n }\n return 4000; // Default for most models\n}\n","/**\n * OpenViber Configuration\n * \n * Runtime configuration for the openviber framework.\n * Applications should call configure() before using openviber.\n */\n\nimport type { SupabaseClient } from '@supabase/supabase-js';\nimport os from 'os';\nimport path from 'path';\n\nexport interface ViberConfig {\n /** Root directory for file storage */\n storageRoot: string;\n\n /** Supabase client factory for database operations */\n createSupabaseClient?: () => SupabaseClient | null;\n\n /** Supabase service role client factory for admin operations */\n createServiceRoleClient?: () => SupabaseClient | null;\n\n /** Defaults directory path */\n defaultsPath?: string;\n}\n\nlet config: ViberConfig | null = null;\n\n/**\n * Configure viber with application-specific settings\n */\nexport function configure(newConfig: ViberConfig): void {\n config = newConfig;\n}\n\n/**\n * Get current viber configuration\n */\nexport function getConfig(): ViberConfig {\n if (!config) {\n // Default configuration - use ~/.openviber for daemon mode\n return {\n storageRoot: path.join(os.homedir(), '.openviber'),\n defaultsPath: './defaults',\n };\n }\n return config;\n}\n\n/**\n * Get viber storage root path\n */\nexport function getViberRoot(): string {\n return getConfig().storageRoot;\n}\n\n/**\n * Get path relative to viber root\n */\nexport function getViberPath(...segments: string[]): string {\n const root = getViberRoot();\n return [root, ...segments].join('/');\n}\n\n/**\n * ViberPaths - Path utilities\n */\nexport const ViberPaths = {\n getRoot: getViberRoot,\n getPath: getViberPath,\n getDefaultsPath: () => getConfig().defaultsPath || './defaults',\n};\n\n/**\n * Get Supabase client\n */\nexport function getSupabaseClient(): SupabaseClient | null {\n const cfg = getConfig();\n if (cfg.createSupabaseClient) {\n return cfg.createSupabaseClient();\n }\n return null;\n}\n\n/**\n * Get Supabase service role client\n */\nexport function getSupabaseServiceRoleClient(): SupabaseClient | null {\n const cfg = getConfig();\n if (cfg.createServiceRoleClient) {\n return cfg.createServiceRoleClient();\n }\n return null;\n}\n","/**\n * Local filesystem adapter for storage\n */\n\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport type { StorageAdapter, ArtifactInfo } from '../base';\n\n/**\n * Local filesystem adapter\n */\nexport class LocalStorageAdapter implements StorageAdapter {\n async readFile(filepath: string): Promise<Buffer> {\n return fs.readFile(filepath);\n }\n\n async readTextFile(filepath: string): Promise<string> {\n return fs.readFile(filepath, 'utf8');\n }\n\n async writeFile(filepath: string, data: Buffer | string): Promise<void> {\n const dir = path.dirname(filepath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(filepath, data, typeof data === 'string' ? 'utf8' : undefined);\n }\n\n async deleteFile(filepath: string): Promise<void> {\n await fs.unlink(filepath);\n }\n\n async exists(filepath: string): Promise<boolean> {\n try {\n await fs.access(filepath);\n return true;\n } catch {\n return false;\n }\n }\n\n async mkdir(dirpath: string): Promise<void> {\n await fs.mkdir(dirpath, { recursive: true });\n }\n\n async readdir(dirpath: string): Promise<string[]> {\n return fs.readdir(dirpath);\n }\n\n async stat(filepath: string): Promise<any> {\n return fs.stat(filepath);\n }\n\n // ==================== Artifact Operations ====================\n \n async saveArtifact(spaceId: string, artifact: ArtifactInfo, buffer: Buffer): Promise<ArtifactInfo> {\n // Determine base directory for this space\n const baseDir = path.join(process.cwd(), '.viber', 'spaces', spaceId);\n \n // Save file\n const filePath = path.join(baseDir, 'artifacts', artifact.storageKey);\n await this.writeFile(filePath, buffer);\n \n // Save metadata to artifacts.json\n const metadataPath = path.join(baseDir, 'artifacts.json');\n let artifacts: ArtifactInfo[] = [];\n \n try {\n const content = await fs.readFile(metadataPath, 'utf-8');\n artifacts = JSON.parse(content);\n } catch {\n // File doesn't exist yet\n }\n \n // Add or update artifact\n const index = artifacts.findIndex(a => a.id === artifact.id);\n const artifactInfo: ArtifactInfo = {\n ...artifact,\n createdAt: artifact.createdAt || new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n \n if (index >= 0) {\n artifacts[index] = artifactInfo;\n } else {\n artifacts.push(artifactInfo);\n }\n \n await fs.mkdir(path.dirname(metadataPath), { recursive: true });\n await fs.writeFile(metadataPath, JSON.stringify(artifacts, null, 2));\n \n return artifactInfo;\n }\n \n async getArtifact(spaceId: string, artifactId: string): Promise<{ info: ArtifactInfo; buffer: Buffer } | null> {\n const info = await this.getArtifactInfo(spaceId, artifactId);\n if (!info) return null;\n \n const baseDir = path.join(process.cwd(), '.viber', 'spaces', spaceId);\n const filePath = path.join(baseDir, 'artifacts', info.storageKey);\n const buffer = await fs.readFile(filePath);\n \n return { info, buffer };\n }\n \n async getArtifactInfo(spaceId: string, artifactId: string): Promise<ArtifactInfo | null> {\n const baseDir = path.join(process.cwd(), '.viber', 'spaces', spaceId);\n const metadataPath = path.join(baseDir, 'artifacts.json');\n \n try {\n const content = await fs.readFile(metadataPath, 'utf-8');\n const artifacts: ArtifactInfo[] = JSON.parse(content);\n return artifacts.find(a => a.id === artifactId) || null;\n } catch {\n return null;\n }\n }\n \n async listArtifacts(spaceId: string): Promise<ArtifactInfo[]> {\n const baseDir = path.join(process.cwd(), '.viber', 'spaces', spaceId);\n const metadataPath = path.join(baseDir, 'artifacts.json');\n \n try {\n const content = await fs.readFile(metadataPath, 'utf-8');\n return JSON.parse(content);\n } catch {\n return [];\n }\n }\n \n async deleteArtifact(spaceId: string, artifactId: string): Promise<void> {\n const info = await this.getArtifactInfo(spaceId, artifactId);\n if (!info) throw new Error('Artifact not found');\n \n const baseDir = path.join(process.cwd(), '.viber', 'spaces', spaceId);\n \n // Delete file\n const filePath = path.join(baseDir, 'artifacts', info.storageKey);\n await fs.unlink(filePath);\n \n // Update metadata\n const metadataPath = path.join(baseDir, 'artifacts.json');\n const content = await fs.readFile(metadataPath, 'utf-8');\n const artifacts: ArtifactInfo[] = JSON.parse(content);\n const filtered = artifacts.filter(a => a.id !== artifactId);\n await fs.writeFile(metadataPath, JSON.stringify(filtered, null, 2));\n }\n}","/**\n * Base Storage - Abstract storage interface for all Viber storage needs\n */\n\nimport path from \"path\";\nimport { getViberRoot } from \"../config\";\nimport { LocalStorageAdapter } from \"./adapters/local\";\n\nexport interface ArtifactInfo {\n id: string;\n storageKey: string;\n originalName: string;\n mimeType: string;\n sizeBytes: number;\n category?: \"input\" | \"intermediate\" | \"output\";\n metadata?: Record<string, any>;\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface StorageAdapter {\n // Low-level file operations\n readFile(path: string): Promise<Buffer>;\n readTextFile(path: string): Promise<string>;\n writeFile(path: string, data: Buffer | string): Promise<void>;\n deleteFile(path: string): Promise<void>;\n exists(path: string): Promise<boolean>;\n mkdir(path: string): Promise<void>;\n readdir(path: string): Promise<string[]>;\n stat(path: string): Promise<any>;\n\n // High-level artifact operations (encapsulates file + metadata)\n saveArtifact(\n spaceId: string,\n artifact: ArtifactInfo,\n buffer: Buffer\n ): Promise<ArtifactInfo>;\n getArtifact(\n spaceId: string,\n artifactId: string\n ): Promise<{ info: ArtifactInfo; buffer: Buffer } | null>;\n getArtifactInfo(\n spaceId: string,\n artifactId: string\n ): Promise<ArtifactInfo | null>;\n listArtifacts(spaceId: string): Promise<ArtifactInfo[]>;\n deleteArtifact(spaceId: string, artifactId: string): Promise<void>;\n}\n\n/**\n * Base storage class with common operations\n */\nexport class BaseStorage {\n protected adapter: StorageAdapter;\n protected basePath: string;\n\n constructor(basePath?: string, adapter?: StorageAdapter) {\n this.basePath = basePath || getViberRoot();\n // If no adapter provided, create LocalStorageAdapter (server-only)\n if (adapter) {\n this.adapter = adapter;\n } else {\n this.adapter = new LocalStorageAdapter();\n }\n }\n\n /**\n * Get full path relative to base\n */\n protected getPath(...segments: string[]): string {\n return path.join(this.basePath, ...segments);\n }\n\n /**\n * Initialize storage (ensure directories exist)\n */\n async initialize(): Promise<void> {\n await this.adapter.mkdir(this.basePath);\n }\n\n /**\n * Read JSON file\n */\n async readJSON<T = any>(relativePath: string): Promise<T | null> {\n try {\n const fullPath = this.getPath(relativePath);\n const content = await this.adapter.readTextFile(fullPath);\n return JSON.parse(content) as T;\n } catch (error: any) {\n if (error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Read YAML file\n */\n async readYaml<T = any>(relativePath: string): Promise<T | null> {\n try {\n const fullPath = this.getPath(relativePath);\n const content = await this.adapter.readTextFile(fullPath);\n const yaml = await import(\"yaml\");\n return yaml.parse(content) as T;\n } catch (error: any) {\n if (error.code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n }\n\n /**\n * Write JSON file\n */\n async writeJSON(relativePath: string, data: any): Promise<void> {\n const fullPath = this.getPath(relativePath);\n const content = JSON.stringify(data, null, 2);\n await this.adapter.writeFile(fullPath, content);\n }\n\n /**\n * Write YAML file\n */\n async writeYaml(relativePath: string, data: any): Promise<void> {\n const fullPath = this.getPath(relativePath);\n const yaml = await import(\"yaml\");\n const content = yaml.stringify(data);\n await this.adapter.writeFile(fullPath, content);\n }\n\n /**\n * Check if file exists\n */\n async exists(relativePath: string): Promise<boolean> {\n const fullPath = this.getPath(relativePath);\n return this.adapter.exists(fullPath);\n }\n\n /**\n * Read text file\n */\n async readTextFile(relativePath: string): Promise<string> {\n const fullPath = this.getPath(relativePath);\n return this.adapter.readTextFile(fullPath);\n }\n\n /**\n * Write file (text or binary)\n */\n async writeFile(relativePath: string, data: Buffer | string): Promise<void> {\n const fullPath = this.getPath(relativePath);\n await this.adapter.writeFile(fullPath, data);\n }\n\n /**\n * Delete file\n */\n async delete(relativePath: string): Promise<void> {\n const fullPath = this.getPath(relativePath);\n await this.adapter.deleteFile(fullPath);\n }\n\n /**\n * List files in directory\n */\n async list(relativePath: string = \"\"): Promise<string[]> {\n const fullPath = this.getPath(relativePath);\n try {\n return await this.adapter.readdir(fullPath);\n } catch {\n return [];\n }\n }\n\n /**\n * Create directory\n */\n async mkdir(relativePath: string): Promise<void> {\n const fullPath = this.getPath(relativePath);\n await this.adapter.mkdir(fullPath);\n }\n\n /**\n * Read binary file\n */\n async readFile(relativePath: string): Promise<Buffer> {\n const fullPath = this.getPath(relativePath);\n return this.adapter.readFile(fullPath);\n }\n\n /**\n * Copy file from one storage to another\n */\n async copyFileTo(\n relativePath: string,\n targetStorage: BaseStorage,\n targetPath: string\n ): Promise<void> {\n const fileData = await this.readFile(relativePath);\n await targetStorage.writeFile(targetPath, fileData);\n }\n\n /**\n * Get file statistics (size, timestamps, etc.)\n */\n async getArtifactFileStats(relativePath: string): Promise<any> {\n const fullPath = this.getPath(relativePath);\n return this.adapter.stat(fullPath);\n }\n}\n","import { StorageAdapter, ArtifactInfo } from \"../base\";\nimport { getSupabaseClient, getSupabaseServiceRoleClient } from \"../../config\";\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\n\nexport interface SupabaseStorageConfig {\n defaultBucket: string;\n bucketMappings?: Record<string, string>; // pathPrefix -> bucketName\n}\n\nexport class SupabaseStorageAdapter implements StorageAdapter {\n private client: SupabaseClient | null = null;\n private config: SupabaseStorageConfig;\n\n constructor(private userId: string, config?: Partial<SupabaseStorageConfig>) {\n this.config = {\n defaultBucket: \"spaces\",\n ...config,\n };\n }\n\n private async getClient(): Promise<SupabaseClient> {\n if (!this.client) {\n const client = getSupabaseClient();\n if (!client) {\n throw new Error(\"Supabase client not configured\");\n }\n this.client = client;\n }\n return this.client;\n }\n\n private getServiceRoleClient(): SupabaseClient {\n const client = getSupabaseServiceRoleClient();\n if (!client) {\n throw new Error(\"Supabase service role client not configured\");\n }\n return client;\n }\n\n // Helper to normalize path for object storage\n // Removes leading slashes and ensures forward slashes\n private normalizePath(p: string): string {\n return p.replace(/^[\\/\\\\]+/, \"\").replace(/\\\\/g, \"/\");\n }\n\n // Determine which bucket to use based on path\n private getBucket(path: string): string {\n const normalized = this.normalizePath(path);\n if (this.config.bucketMappings) {\n for (const [prefix, bucket] of Object.entries(this.config.bucketMappings)) {\n if (normalized.startsWith(prefix) || path.startsWith(prefix)) {\n return bucket;\n }\n }\n }\n return this.config.defaultBucket;\n }\n\n async readFile(path: string): Promise<Buffer> {\n const client = await this.getClient();\n const normalizedPath = this.normalizePath(path);\n const bucket = this.getBucket(path);\n\n const { data, error } = await client.storage\n .from(bucket)\n .download(normalizedPath);\n\n if (error) {\n // Supabase Storage returns 400 for missing files sometimes\n if ((error as any).statusCode === '400' || (error as any).status === 400) {\n const enoentError = new Error('File not found');\n (enoentError as any).code = 'ENOENT';\n throw enoentError;\n }\n throw error;\n }\n const arrayBuffer = await data.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n\n async readTextFile(path: string): Promise<string> {\n const buffer = await this.readFile(path);\n return buffer.toString(\"utf-8\");\n }\n\n async writeFile(path: string, data: Buffer | string): Promise<void> {\n const client = await this.getClient();\n const normalizedPath = this.normalizePath(path);\n const bucket = this.getBucket(path);\n\n const { error } = await client.storage\n .from(bucket)\n .upload(normalizedPath, data, {\n upsert: true,\n });\n\n if (error) throw error;\n }\n\n async deleteFile(path: string): Promise<void> {\n const client = await this.getClient();\n const normalizedPath = this.normalizePath(path);\n const bucket = this.getBucket(path);\n\n const { error } = await client.storage.from(bucket).remove([normalizedPath]);\n if (error) throw error;\n }\n\n async exists(path: string): Promise<boolean> {\n try {\n const client = await this.getClient();\n const normalizedPath = this.normalizePath(path);\n const bucket = this.getBucket(path);\n const dir = normalizedPath.split(\"/\").slice(0, -1).join(\"/\");\n const filename = normalizedPath.split(\"/\").pop();\n\n const { data } = await client.storage.from(bucket).list(dir, {\n search: filename,\n });\n\n return !!data && data.some(item => item.name === filename);\n } catch {\n return false;\n }\n }\n\n async mkdir(path: string): Promise<void> {\n // Supabase storage is object storage, directories are virtual.\n // No-op.\n }\n\n async readdir(path: string): Promise<string[]> {\n const client = await this.getClient();\n const normalizedPath = this.normalizePath(path);\n const bucket = this.getBucket(path);\n\n const { data, error } = await client.storage.from(bucket).list(normalizedPath);\n if (error) throw error;\n return data.map((item) => item.name);\n }\n\n async stat(path: string): Promise<any> {\n // Basic stat implementation\n return {\n isDirectory: () => false, // Hard to tell without listing, assume file for now\n size: 0,\n };\n }\n\n // ==================== Artifact Operations ====================\n\n async saveArtifact(spaceId: string, artifact: ArtifactInfo, buffer: Buffer): Promise<ArtifactInfo> {\n const client = await this.getClient();\n const serviceClient = this.getServiceRoleClient();\n\n // Save file to storage bucket\n const filePath = `${spaceId}/artifacts/${artifact.storageKey}`;\n const { error: storageError } = await client.storage\n .from(this.config.defaultBucket)\n .upload(filePath, buffer, { upsert: true });\n\n if (storageError) throw storageError;\n\n // Get current user for ownership\n const { data: { user } } = await client.auth.getUser();\n\n // Save metadata to database using service role client (bypasses RLS)\n const { data, error: dbError } = await serviceClient\n .from('artifacts')\n .insert({\n id: artifact.id,\n space_id: spaceId,\n user_id: user?.id || this.userId,\n storage_key: artifact.storageKey,\n original_name: artifact.originalName,\n mime_type: artifact.mimeType,\n size_bytes: artifact.sizeBytes,\n category: artifact.category || 'input',\n metadata: artifact.metadata || {},\n })\n .select()\n .single();\n\n if (dbError) {\n // Clean up uploaded file on metadata save failure\n await client.storage.from(this.config.defaultBucket).remove([filePath]);\n throw dbError;\n }\n\n // Return standardized artifact info\n return {\n id: data.id,\n storageKey: data.storage_key,\n originalName: data.original_name,\n mimeType: data.mime_type,\n sizeBytes: data.size_bytes,\n category: data.category,\n metadata: data.metadata,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n };\n }\n\n async getArtifact(spaceId: string, artifactId: string): Promise<{ info: ArtifactInfo; buffer: Buffer } | null> {\n const info = await this.getArtifactInfo(spaceId, artifactId);\n if (!info) return null;\n\n const filePath = `${spaceId}/artifacts/${info.storageKey}`;\n const buffer = await this.readFile(filePath);\n\n return { info, buffer };\n }\n\n async getArtifactInfo(spaceId: string, artifactId: string): Promise<ArtifactInfo | null> {\n const serviceClient = this.getServiceRoleClient();\n\n const { data, error } = await serviceClient\n .from('artifacts')\n .select('*')\n .eq('id', artifactId)\n .eq('space_id', spaceId)\n .single();\n\n if (error || !data) return null;\n\n return {\n id: data.id,\n storageKey: data.storage_key,\n originalName: data.original_name,\n mimeType: data.mime_type,\n sizeBytes: data.size_bytes,\n category: data.category,\n metadata: data.metadata,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n };\n }\n\n async listArtifacts(spaceId: string): Promise<ArtifactInfo[]> {\n const serviceClient = this.getServiceRoleClient();\n\n const { data, error } = await serviceClient\n .from('artifacts')\n .select('*')\n .eq('space_id', spaceId)\n .order('created_at', { ascending: false });\n\n if (error) throw error;\n\n return (data || []).map(row => ({\n id: row.id,\n storageKey: row.storage_key,\n originalName: row.original_name,\n mimeType: row.mime_type,\n sizeBytes: row.size_bytes,\n category: row.category,\n metadata: row.metadata,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n }));\n }\n\n async deleteArtifact(spaceId: string, artifactId: string): Promise<void> {\n const client = await this.getClient();\n const serviceClient = this.getServiceRoleClient();\n\n // Get artifact info first to know the storage key\n const info = await this.getArtifactInfo(spaceId, artifactId);\n if (!info) throw new Error('Artifact not found');\n\n // Delete from storage\n const filePath = `${spaceId}/artifacts/${info.storageKey}`;\n await client.storage.from(this.config.defaultBucket).remove([filePath]);\n\n // Delete from database\n const { error } = await serviceClient\n .from('artifacts')\n .delete()\n .eq('id', artifactId)\n .eq('space_id', spaceId);\n\n if (error) throw error;\n }\n}\n","/**\n * Space Storage - Handles storage operations for spaces\n */\n\nimport path from \"path\";\nimport { BaseStorage, StorageAdapter, ArtifactInfo } from \"./base\";\nimport { getViberRoot, getSupabaseClient } from \"../config\";\n// LocalStorageAdapter is imported dynamically to avoid bundling Node.js fs module in client\n\nexport interface StorageOptions {\n rootPath: string;\n spaceId: string;\n adapter?: StorageAdapter;\n}\n\nexport class SpaceStorage extends BaseStorage {\n private spaceId: string;\n\n constructor(options: StorageOptions) {\n super(options.rootPath, options.adapter);\n this.spaceId = options.spaceId;\n }\n\n getSpacePath(): string {\n return this.basePath;\n }\n\n getFilePath(filename: string): string {\n return this.getPath(filename);\n }\n\n async saveFile(filename: string, data: any): Promise<void> {\n const content =\n typeof data === \"string\" ? data : JSON.stringify(data, null, 2);\n await this.writeFile(filename, content);\n }\n\n async saveFileBuffer(filename: string, data: Buffer): Promise<void> {\n await this.writeFile(filename, data);\n }\n\n /**\n * DEPRECATED: Use artifact operations below instead\n * Save an artifact file (low-level file operation only)\n */\n async saveArtifact(\n storageKey: string,\n buffer: Buffer,\n metadata: {\n mimeType: string;\n size: number;\n artifactType?: string;\n },\n originalFilename?: string\n ): Promise<void> {\n const artifactPath = `artifacts/${storageKey}`;\n await this.mkdir(\"artifacts\");\n await this.writeFile(artifactPath, buffer);\n }\n\n // ==================== High-Level Artifact Operations ====================\n\n /**\n * Save a complete artifact (both file AND metadata)\n */\n async saveCompleteArtifact(artifact: ArtifactInfo, buffer: Buffer): Promise<ArtifactInfo> {\n return this.adapter.saveArtifact(this.spaceId, artifact, buffer);\n }\n\n /**\n * Get a complete artifact (both file AND metadata)\n */\n async getCompleteArtifact(artifactId: string): Promise<{ info: ArtifactInfo; buffer: Buffer } | null> {\n return this.adapter.getArtifact(this.spaceId, artifactId);\n }\n\n /**\n * Get artifact metadata only (without loading the file)\n */\n async getArtifactInfo(artifactId: string): Promise<ArtifactInfo | null> {\n return this.adapter.getArtifactInfo(this.spaceId, artifactId);\n }\n\n /**\n * List all artifacts in this space\n */\n async listArtifacts(): Promise<ArtifactInfo[]> {\n return this.adapter.listArtifacts(this.spaceId);\n }\n\n /**\n * Delete an artifact (both file AND metadata)\n */\n async deleteCompleteArtifact(artifactId: string): Promise<void> {\n return this.adapter.deleteArtifact(this.spaceId, artifactId);\n }\n\n\n\n async listFiles(): Promise<string[]> {\n return this.list();\n }\n\n async createDirectory(dirname: string): Promise<void> {\n await this.mkdir(dirname);\n }\n\n async getMetadata(): Promise<any> {\n return this.readJSON(\"metadata.json\");\n }\n\n async saveMetadata(metadata: any): Promise<void> {\n await this.writeJSON(\"metadata.json\", metadata);\n }\n\n async getArtifact(\n filename: string\n ): Promise<{ content: Buffer; metadata?: any } | null> {\n try {\n const artifactPath = `artifacts/${filename}`;\n const content = await this.readFile(artifactPath);\n\n // Metadata is now stored in database, not in .xmeta files\n return { content, metadata: null };\n } catch (error: any) {\n // Check if error indicates file not found (adapter specific)\n // For now assume any error means not found or issue\n return null;\n }\n }\n\n async cleanup(): Promise<void> {\n // Optional: Clean up temporary files\n const files = await this.listFiles();\n for (const file of files) {\n if (file.startsWith(\"tmp_\") || file.endsWith(\".tmp\")) {\n await this.delete(file);\n }\n }\n }\n}\n\nexport class SpaceStorageFactory {\n // Get root path dynamically to ensure env vars are loaded\n private static getRootPath(): string {\n return getViberRoot();\n }\n\n private static rootPath: string | null = null;\n\n static setRootPath(rootPath: string): void {\n SpaceStorageFactory.rootPath = rootPath;\n }\n\n static async create(spaceId: string): Promise<SpaceStorage> {\n let adapter: StorageAdapter | undefined;\n let rootPath = \"\";\n\n // Check for explicit Supabase storage mode\n // Note: VIBEX_DATA_MODE controls metadata storage (database), not file storage\n // File storage requires explicit VIBEX_FILE_STORAGE=supabase to use Supabase Storage\n const fileStorageMode = process.env.VIBEX_FILE_STORAGE || 'local';\n\n // Try to use Supabase storage if explicitly enabled\n if (fileStorageMode === 'supabase') {\n try {\n const supabase = getSupabaseClient();\n if (!supabase) {\n throw new Error('Supabase client not configured');\n }\n const { data: { user } } = await supabase.auth.getUser();\n\n if (user) {\n // For Supabase, rootPath is the space prefix\n // We use spaceId for isolation (spaces are already user-isolated via RLS)\n rootPath = spaceId;\n\n const { SupabaseStorageAdapter } = await import(\"./adapters/supabase\");\n\n // Store everything in the 'spaces' bucket under [spaceId]/artifacts/\n // This keeps all space data together and leverages spaceId for isolation\n adapter = new SupabaseStorageAdapter(user.id, {\n defaultBucket: \"spaces\",\n bucketMappings: {},\n });\n\n console.log(`[SpaceStorage] Using Supabase storage for space ${spaceId} (artifacts only)`);\n }\n } catch (e) {\n console.warn(\"[SpaceStorage] Failed to initialize Supabase storage, falling back to local:\", e);\n }\n }\n\n // Use local storage (default for file storage)\n if (!adapter) {\n // Only use LocalStorageAdapter on server\n if (typeof window === 'undefined') {\n // Dynamic import to avoid bundling fs in client\n const { LocalStorageAdapter } = await import(\"./adapters/local\");\n adapter = new LocalStorageAdapter();\n const baseRoot = SpaceStorageFactory.rootPath || SpaceStorageFactory.getRootPath();\n rootPath = path.join(baseRoot, \"spaces\", spaceId);\n console.log(`[SpaceStorage] Using local file storage for space ${spaceId}`);\n } else {\n throw new Error('LocalStorageAdapter cannot be used in client code. Provide a client-compatible adapter.');\n }\n }\n\n const storage = new SpaceStorage({\n rootPath,\n spaceId,\n adapter\n });\n await storage.initialize();\n return storage;\n }\n\n static async list(): Promise<string[]> {\n // Listing spaces is tricky with mixed storage.\n // For now, we'll implement listing for the active storage mode.\n\n const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL;\n\n if (supabaseUrl) {\n try {\n const supabase = getSupabaseClient();\n if (!supabase) {\n throw new Error('Supabase client not configured');\n }\n const { data: { user } } = await supabase.auth.getUser();\n\n if (user) {\n const { SupabaseStorageAdapter } = await import(\"./adapters/supabase\");\n const adapter = new SupabaseStorageAdapter(user.id);\n // List directories in user's folder\n // Supabase storage list returns files/folders in the prefix\n // We need to list folders under userId/\n // But Supabase list is flat-ish or simulates folders.\n // We can list root of userId/\n\n // Actually, SupabaseStorageAdapter.readdir takes a path.\n // If we pass empty string or just userId, it might work depending on implementation.\n // Our adapter implementation of readdir lists contents of a path.\n // So we can list content of `${user.id}`.\n\n // However, SupabaseStorageAdapter constructor takes userId, but it doesn't prefix it automatically \n // in readdir unless we change logic.\n // In create(), we pass `${user.id}/${spaceId}` as rootPath.\n // So the adapter itself is generic.\n\n // Let's create a temporary adapter just to list\n // But we need to list *spaces*, which are subfolders of user.id\n\n // We can use the adapter to list `${user.id}`\n // But wait, SupabaseStorageAdapter constructor takes userId but doesn't use it for prefixing \n // EXCEPT for maybe internal logic? \n // Actually in my implementation:\n // constructor(private userId: string) {}\n // But I didn't use `this.userId` in `readFile` etc!\n // I used `path` passed to methods.\n // AND `SpaceStorage` passes `rootPath` (which includes userId) + relativePath.\n\n // So `SupabaseStorageAdapter` is actually stateless regarding path prefix, \n // `userId` in constructor was unused in my previous implementation!\n // I should fix that or just ignore it if I pass full path.\n\n // If I pass `${user.id}` to readdir, it should list spaces.\n const files = await adapter.readdir(user.id);\n // Filter for what looks like space directories (or just return all)\n return files;\n }\n } catch (e) {\n console.warn(\"Failed to list Supabase spaces:\", e);\n }\n }\n\n // Fallback to local (server-only)\n if (typeof window === 'undefined') {\n try {\n // Dynamic import to avoid bundling fs in client\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const fs = require(\"fs\").promises;\n const rootPath = SpaceStorageFactory.rootPath || SpaceStorageFactory.getRootPath();\n const spacesPath = path.join(rootPath, \"spaces\");\n\n try {\n await fs.access(spacesPath);\n } catch {\n return [];\n }\n\n const entries = await fs.readdir(spacesPath);\n const spaces: string[] = [];\n\n for (const entry of entries) {\n const entryPath = path.join(spacesPath, entry);\n const stat = await fs.stat(entryPath);\n if (stat.isDirectory() && !entry.startsWith(\".\")) {\n spaces.push(entry);\n }\n }\n\n return spaces;\n } catch {\n return [];\n }\n }\n\n // If we reach here (browser environment with no Supabase), return empty\n return [];\n }\n\n static async exists(spaceId: string): Promise<boolean> {\n // Similar logic to create() to check existence\n const storage = await SpaceStorageFactory.create(spaceId);\n // Check if space.json exists as a proxy for space existence\n return storage.exists(\"space.json\");\n }\n\n static async delete(spaceId: string): Promise<void> {\n const storage = await SpaceStorageFactory.create(spaceId);\n // Recursive delete not easily supported in base interface\n // But for Supabase we can delete folder\n // For local we can use fs.rm\n\n // This is a bit hacky, ideally StorageAdapter has rmdir or similar\n // Or we just delete known files.\n\n // For now, let's try to delete metadata.json\n await storage.delete(\"metadata.json\");\n // And maybe artifacts...\n // A proper delete would require listing all files and deleting them.\n\n const files = await storage.list();\n for (const file of files) {\n await storage.delete(file);\n }\n\n // Also artifacts\n try {\n const artifacts = await storage.list(\"artifacts\");\n for (const file of artifacts) {\n await storage.delete(`artifacts/${file}`);\n }\n } catch { }\n }\n}\n\n","/**\n * ID Generator Utilities for Viber\n *\n * Simple, unique ID generation for documents and other entities.\n */\n\nimport { customAlphabet } from \"nanoid\";\n\n// Define safe character set for IDs (A-Za-z0-9_)\nconst ALPHABET_SAFE =\n \"abcdefghijklmnopqrstuvwxyz0123456789_ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n/**\n * Generate a short, unique ID that's URL-safe\n * Uses a custom alphabet to ensure compatibility\n *\n * @param length Length of the ID (default: 8)\n * @returns A short, unique ID string\n */\nexport function generateShortId(length: number = 8): string {\n // Create a custom nanoid generator\n const nanoid = customAlphabet(ALPHABET_SAFE, length);\n\n // Generate ID and ensure first character is a letter\n let id = nanoid();\n while (!/^[a-zA-Z]/.test(id)) {\n id = nanoid();\n }\n\n return id;\n}\n\n/**\n * Generate a space ID with optional topic prefix\n *\n * @param topic Optional topic to use as prefix\n * @returns A space ID like 'aB3x_9Kp' (always clean random ID)\n */\nexport function generateSpaceId(topic?: string): string {\n // Always generate a clean 8-char random ID to avoid URL encoding issues\n // with non-ASCII characters in topics\n return generateShortId(8);\n}\n\n/**\n * Validate a document ID\n * Checks that the ID starts with a letter and contains only letters, numbers, and underscores\n *\n * @param id ID string to validate\n * @returns Boolean indicating if the ID is valid\n */\nexport function validateId(id: string): boolean {\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n return false;\n }\n\n // ID must start with a letter and contain only letters, numbers, and underscores\n const idPattern = /^[a-zA-Z][a-zA-Z0-9_]*$/;\n return idPattern.test(id);\n}\n","/**\n * LocalDataAdapter - File-based data storage using YAML/JSON files\n * Uses ~/.openviber/ directory for local agent mode\n */\n\nimport type { DataAdapter } from \"../adapter\";\nimport type {\n Agent,\n Tool,\n Space,\n Artifact,\n Conversation,\n Task,\n ModelProvider,\n Datasource,\n} from \"../types\";\nimport { SpaceStorageFactory } from \"../../storage/space\";\nimport { BaseStorage } from \"../../storage/base\";\nimport { getViberRoot } from \"../../config\";\nimport * as yaml from \"yaml\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\n// ESM-compatible __dirname\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport class LocalDataAdapter implements DataAdapter {\n // Helper to read and parse YAML file\n private async readYamlFile(storage: BaseStorage, path: string): Promise<any> {\n try {\n const content = await storage.readTextFile(path);\n return yaml.parse(content);\n } catch (error: any) {\n if (error.code === \"ENOENT\") return null;\n throw error;\n }\n }\n\n // ==================== Agents ====================\n\n async getAgents(): Promise<Agent[]> {\n const defaultsStorage = new BaseStorage(\n path.join(__dirname, \"..\", \"defaults\"),\n );\n const rootStorage = new BaseStorage(getViberRoot());\n const agents: Agent[] = [];\n\n // Load built-in agents from defaults/agents/\n try {\n const files = await defaultsStorage.list(\"agents\");\n for (const file of files.filter(\n (f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"),\n )) {\n const agent = await this.readYamlFile(\n defaultsStorage,\n `agents/${file}`,\n );\n if (agent) {\n agents.push({ ...agent, isCustom: false });\n }\n }\n } catch {\n // No built-in agents\n }\n\n // Load user agents from ~/.openviber/agents/\n try {\n const files = await rootStorage.list(\"agents\");\n for (const file of files.filter(\n (f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"),\n )) {\n 0;\n const agent = await this.readYamlFile(rootStorage, `agents/${file}`);\n if (agent) {\n agents.push({ ...agent, isCustom: true });\n }\n }\n } catch {\n // No user agents\n }\n\n return agents;\n }\n\n async getAgent(id: string): Promise<Agent | null> {\n const defaultsPath = path.join(__dirname, \"..\", \"defaults\");\n const defaultsStorage = new BaseStorage(defaultsPath);\n const rootStorage = new BaseStorage(getViberRoot());\n\n // Try built-in first\n for (const ext of [\"yaml\", \"yml\"]) {\n const agent = await this.readYamlFile(\n defaultsStorage,\n `agents/${id}.${ext}`,\n );\n if (agent) return { ...agent, id, isCustom: false };\n }\n\n // Try user agents\n for (const ext of [\"yaml\", \"yml\"]) {\n const agent = await this.readYamlFile(rootStorage, `agents/${id}.${ext}`);\n if (agent) return { ...agent, id, isCustom: true };\n }\n\n return null;\n }\n\n async saveAgent(agent: Agent): Promise<Agent> {\n const rootStorage = new BaseStorage(getViberRoot());\n const content = yaml.stringify(agent);\n await rootStorage.writeFile(`agents/${agent.id}.yaml`, content);\n return agent;\n }\n\n async deleteAgent(id: string): Promise<void> {\n const rootStorage = new BaseStorage(getViberRoot());\n try {\n await rootStorage.delete(`agents/${id}.yaml`);\n } catch {\n await rootStorage.delete(`agents/${id}.yml`);\n }\n }\n\n async cloneAgent(id: string): Promise<Agent> {\n const agent = await this.getAgent(id);\n if (!agent) throw new Error(`Agent ${id} not found`);\n\n const { generateShortId } = await import(\"../../utils/id\");\n const newId = `custom-${generateShortId(8)}`;\n const cloned = { ...agent, id: newId, isCustom: true };\n\n return await this.saveAgent(cloned);\n }\n\n // ==================== Tools ====================\n\n async getTools(): Promise<Tool[]> {\n const defaultsStorage = new BaseStorage(\n path.join(__dirname, \"..\", \"..\", \"defaults\"),\n );\n const tools: Tool[] = [];\n\n // Load built-in tools from defaults/tools/\n try {\n const files = await defaultsStorage.list(\"tools\");\n for (const file of files.filter(\n (f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"),\n )) {\n const tool = await this.readYamlFile(defaultsStorage, `tools/${file}`);\n if (tool) {\n tools.push(tool);\n }\n }\n } catch {\n // No tools\n }\n\n return tools;\n }\n\n async getTool(id: string): Promise<Tool | null> {\n const tools = await this.getTools();\n return tools.find((t) => t.id === id) || null;\n }\n\n async saveTool(tool: Tool): Promise<Tool> {\n const rootStorage = new BaseStorage(getViberRoot());\n await rootStorage.mkdir(\"tools\");\n const content = yaml.stringify(tool);\n await rootStorage.writeFile(`tools/${tool.id}.yaml`, content);\n return tool;\n }\n\n async deleteTool(id: string): Promise<void> {\n const rootStorage = new BaseStorage(getViberRoot());\n try {\n await rootStorage.delete(`tools/${id}.yaml`);\n } catch {\n await rootStorage.delete(`tools/${id}.yml`);\n }\n }\n\n async cloneTool(id: string): Promise<Tool> {\n const tool = await this.getTool(id);\n if (!tool) throw new Error(`Tool ${id} not found`);\n\n const { generateShortId } = await import(\"../../utils/id\");\n const newId = `custom-${generateShortId(8)}`;\n const cloned = { ...tool, id: newId };\n\n return await this.saveTool(cloned);\n }\n\n // ==================== Spaces ====================\n\n async getSpaces(): Promise<Space[]> {\n const spaceIds = await SpaceStorageFactory.list();\n const spaces: Space[] = [];\n\n for (const id of spaceIds) {\n const space = await this.getSpace(id);\n if (space) {\n spaces.push(space);\n }\n }\n\n return spaces;\n }\n\n async getSpace(id: string): Promise<Space | null> {\n try {\n const storage = await SpaceStorageFactory.create(id);\n const data = await storage.readJSON<any>(\"space.json\");\n\n if (!data) return null;\n\n return {\n id,\n name: data.name || id,\n description: data.description,\n config: data.config || {},\n createdAt: data.createdAt,\n updatedAt: data.updatedAt,\n };\n } catch (error) {\n return null;\n }\n }\n\n async saveSpace(space: Space): Promise<Space> {\n const storage = await SpaceStorageFactory.create(space.id);\n\n const data = {\n name: space.name,\n description: space.description,\n config: space.config || {},\n createdAt: space.createdAt || new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n await storage.writeJSON(\"space.json\", data);\n return space;\n }\n\n async deleteSpace(id: string): Promise<void> {\n // Space deletion needs to be handled carefully\n // For now, we just mark it as deleted or remove the directory\n throw new Error(\"Space deletion not implemented in local mode\");\n }\n\n // ==================== Artifacts ====================\n\n async getArtifacts(spaceId: string): Promise<Artifact[]> {\n const storage = await SpaceStorageFactory.create(spaceId);\n const files = await storage.list(\"artifacts\");\n const artifacts: Artifact[] = [];\n\n for (const file of files) {\n // Skip system files\n if (file.startsWith(\".\")) {\n continue;\n }\n\n // In local mode without DB, we can't easily get metadata\n // Just return basic file info\n try {\n const stats = await storage.getArtifactFileStats(`artifacts/${file}`);\n\n artifacts.push({\n id: file, // Storage key as ID\n spaceId,\n storageKey: file,\n originalName: file,\n mimeType: \"application/octet-stream\", // Unknown without metadata\n sizeBytes: stats.size,\n metadata: {},\n createdAt: stats.birthtime.toISOString(),\n updatedAt: stats.mtime.toISOString(),\n });\n } catch (error) {\n // Skip files we can't read\n continue;\n }\n }\n\n return artifacts;\n }\n\n async getArtifact(id: string): Promise<Artifact | null> {\n // In local mode, we need space context to find artifacts\n // This is a limitation of file-based storage\n throw new Error(\"getArtifact requires space context in local mode\");\n }\n\n async saveArtifact(artifact: Artifact): Promise<Artifact> {\n // Artifacts are saved through SpaceStorage.saveArtifact()\n // This method is mainly for metadata updates\n // In local mode without DB, we can't persist metadata separately easily\n // So this is effectively a no-op for metadata persistence in pure local mode\n return artifact;\n }\n\n async deleteArtifact(id: string): Promise<void> {\n // Requires space context\n throw new Error(\"deleteArtifact requires space context in local mode\");\n }\n\n // NEW: Artifact queries by ownership and category\n async getArtifactsBySpace(spaceId: string): Promise<Artifact[]> {\n const allArtifacts = await this.getArtifacts(spaceId);\n return allArtifacts.filter(\n (a) => a.spaceId === spaceId || (a.spaceId === spaceId && !a.taskId),\n );\n }\n\n async getArtifactsByTask(taskId: string): Promise<Artifact[]> {\n // In local mode, we need to iterate through spaces to find task artifacts\n // This is inefficient but necessary for file-based storage\n const spaceIds = await SpaceStorageFactory.list();\n const taskArtifacts: Artifact[] = [];\n\n for (const wsId of spaceIds) {\n const artifacts = await this.getArtifacts(wsId);\n taskArtifacts.push(...artifacts.filter((a) => a.taskId === taskId));\n }\n\n return taskArtifacts;\n }\n\n async getArtifactsByCategory(\n spaceOrTaskId: string,\n category: \"input\" | \"intermediate\" | \"output\",\n isTask = false,\n ): Promise<Artifact[]> {\n const artifacts = isTask\n ? await this.getArtifactsByTask(spaceOrTaskId)\n : await this.getArtifactsBySpace(spaceOrTaskId);\n\n return artifacts.filter((a) => a.category === category);\n }\n\n // ==================== Tasks (formerly Conversations) ====================\n\n async getTasks(spaceId: string): Promise<Task[]> {\n const conversations = await this.getConversations(spaceId);\n // Task extends Conversation, so we can cast\n return conversations as Task[];\n }\n\n async getTask(id: string): Promise<Task | null> {\n const conversation = await this.getConversation(id);\n return conversation as Task | null;\n }\n\n async saveTask(task: Task): Promise<Task> {\n const conversation = await this.saveConversation(task as Conversation);\n return conversation as Task;\n }\n\n async deleteTask(id: string): Promise<void> {\n await this.deleteConversation(id);\n }\n\n // ==================== Conversations (Legacy) ====================\n\n async getConversations(spaceId: string): Promise<Conversation[]> {\n const storage = await SpaceStorageFactory.create(spaceId);\n\n try {\n // In local mode, we might store conversations as individual files\n // or as part of space.json\n const files = await storage.list(\"conversations\");\n const conversations: Conversation[] = [];\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n\n try {\n const data = await storage.readJSON<Conversation>(\n `conversations/${file}`,\n );\n if (data) {\n conversations.push(data);\n }\n } catch (error) {\n continue;\n }\n }\n\n return conversations;\n } catch (error) {\n // Conversations directory doesn't exist yet\n return [];\n }\n }\n\n async getConversation(id: string): Promise<Conversation | null> {\n // Requires space context\n throw new Error(\"getConversation requires space context in local mode\");\n }\n\n async saveConversation(conversation: Conversation): Promise<Conversation> {\n if (!conversation.spaceId) {\n throw new Error(\"Conversation must have a spaceId\");\n }\n const storage = await SpaceStorageFactory.create(conversation.spaceId);\n await storage.mkdir(\"conversations\");\n await storage.writeJSON(\n `conversations/${conversation.id}.json`,\n conversation,\n );\n return conversation;\n }\n\n async deleteConversation(id: string): Promise<void> {\n // Requires space context\n throw new Error(\"deleteConversation requires space context in local mode\");\n }\n\n // ==================== Model Providers ====================\n\n async getModelProviders(): Promise<ModelProvider[]> {\n try {\n const storage = new BaseStorage(getViberRoot());\n const content = await storage.readTextFile(\"models.yaml\");\n const data = yaml.parse(content);\n return Object.entries(data || {}).map(([id, config]: [string, any]) => ({\n id,\n ...config,\n }));\n } catch (error: any) {\n if (error.code === \"ENOENT\") return [];\n throw error;\n }\n }\n\n async getModelProvider(id: string): Promise<ModelProvider | null> {\n const providers = await this.getModelProviders();\n return providers.find((p) => p.id === id) || null;\n }\n\n async saveModelProvider(provider: ModelProvider): Promise<ModelProvider> {\n const storage = new BaseStorage(getViberRoot());\n const providers = await this.getModelProviders();\n const existing = providers.find((p) => p.id === provider.id);\n\n let updated: ModelProvider[];\n if (existing) {\n updated = providers.map((p) => (p.id === provider.id ? provider : p));\n } else {\n updated = [...providers, provider];\n }\n\n // Convert array to object for YAML format\n const data = updated.reduce((acc, p) => ({ ...acc, [p.id]: p }), {});\n const content = yaml.stringify(data);\n await storage.writeFile(\"models.yaml\", content);\n return provider;\n }\n\n async deleteModelProvider(id: string): Promise<void> {\n const storage = new BaseStorage(getViberRoot());\n const providers = await this.getModelProviders();\n const filtered = providers.filter((p) => p.id !== id);\n const data = filtered.reduce((acc, p) => ({ ...acc, [p.id]: p }), {});\n const content = yaml.stringify(data);\n await storage.writeFile(\"models.yaml\", content);\n }\n\n // ==================== Datasources ====================\n\n async getDatasources(): Promise<Datasource[]> {\n try {\n const storage = new BaseStorage(getViberRoot());\n const content = await storage.readTextFile(\"datasources.yaml\");\n const data = yaml.parse(content);\n return Object.entries(data || {}).map(([id, config]: [string, any]) => ({\n id,\n ...config,\n }));\n } catch (error: any) {\n if (error.code === \"ENOENT\") return [];\n throw error;\n }\n }\n\n async getDatasource(id: string): Promise<Datasource | null> {\n const datasources = await this.getDatasources();\n return datasources.find((d) => d.id === id) || null;\n }\n\n async saveDatasource(datasource: Datasource): Promise<Datasource> {\n const storage = new BaseStorage(getViberRoot());\n const datasources = await this.getDatasources();\n const existing = datasources.find((d) => d.id === datasource.id);\n\n let updated: Datasource[];\n if (existing) {\n updated = datasources.map((d) =>\n d.id === datasource.id ? datasource : d,\n );\n } else {\n updated = [...datasources, datasource];\n }\n\n const data = updated.reduce((acc, d) => ({ ...acc, [d.id]: d }), {});\n const content = yaml.stringify(data);\n await storage.writeFile(\"datasources.yaml\", content);\n return datasource;\n }\n\n async deleteDatasource(id: string): Promise<void> {\n const storage = new BaseStorage(getViberRoot());\n const datasources = await this.getDatasources();\n const filtered = datasources.filter((d) => d.id !== id);\n const data = filtered.reduce((acc, d) => ({ ...acc, [d.id]: d }), {});\n const content = yaml.stringify(data);\n await storage.writeFile(\"datasources.yaml\", content);\n }\n}\n","/**\n * SupabaseDatabaseAdapter - Direct Supabase/PostgreSQL database access\n * SERVER-ONLY VERSION - Uses dynamic imports to avoid bundling in client\n * \n * This file should ONLY be imported from server-side code (API routes).\n * For client-side code, use DatabaseDataAdapter which calls API routes.\n */\n\nimport type { DataAdapter } from \"../adapter\";\nimport type {\n Agent,\n Tool,\n Space,\n Artifact,\n Conversation,\n Task,\n ModelProvider,\n Datasource,\n} from \"../types\";\nimport { getSupabaseServiceRoleClient } from \"../../config\";\n\n/**\n * Convert camelCase object keys to snake_case for database\n */\nfunction toSnakeCase(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map(toSnakeCase);\n if (typeof obj !== \"object\") return obj;\n\n const result: any = {};\n for (const [key, value] of Object.entries(obj)) {\n const snakeKey = key.replace(\n /[A-Z]/g,\n (letter) => `_${letter.toLowerCase()}`\n );\n result[snakeKey] =\n typeof value === \"object\" && value !== null ? toSnakeCase(value) : value;\n }\n return result;\n}\n\n/**\n * Convert snake_case object keys to camelCase for TypeScript\n */\nfunction toCamelCase(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map(toCamelCase);\n if (typeof obj !== \"object\") return obj;\n\n const result: any = {};\n for (const [key, value] of Object.entries(obj)) {\n const camelKey = key.replace(/_([a-z])/g, (_, letter) =>\n letter.toUpperCase()\n );\n result[camelKey] =\n typeof value === \"object\" && value !== null ? toCamelCase(value) : value;\n }\n return result;\n}\n\nexport class SupabaseDatabaseAdapter implements DataAdapter {\n private supabase: any;\n private supabasePromise: Promise<any> | null = null;\n\n constructor() {\n // Lazy load Supabase client to avoid bundling server code in client\n if (typeof window !== 'undefined') {\n throw new Error('SupabaseDatabaseAdapter can only be used on the server');\n }\n // Initialize Supabase client lazily\n this.supabasePromise = this.initSupabase();\n }\n\n private async initSupabase() {\n // Use config module for Supabase client\n const client = getSupabaseServiceRoleClient();\n if (!client) {\n throw new Error('Supabase service role client not configured. Call configure() first.');\n }\n return client;\n }\n\n private async getSupabase() {\n if (!this.supabase) {\n this.supabase = await this.supabasePromise;\n }\n return this.supabase;\n }\n\n // ==================== Agents ====================\n\n async getAgents(): Promise<Agent[]> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"agents\")\n .select(\"*\")\n .order(\"created_at\", { ascending: false });\n\n if (error) throw new Error(`Failed to fetch agents: ${error.message}`);\n\n // Transform database format to Agent type\n return (data || []).map((agent: any) => {\n const camelCased = toCamelCase(agent);\n return {\n ...camelCased,\n llm: {\n provider: camelCased.llmProvider,\n model: camelCased.llmModel,\n settings: camelCased.llmSettings,\n },\n // Remove the flat fields\n llmProvider: undefined,\n llmModel: undefined,\n llmSettings: undefined,\n };\n });\n }\n\n async getAgent(id: string): Promise<Agent | null> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"agents\")\n .select(\"*\")\n .eq(\"id\", id)\n .single();\n\n if (error) {\n if (error.code === \"PGRST116\") return null; // Not found\n throw new Error(`Failed to fetch agent: ${error.message}`);\n }\n\n // Transform database format to Agent type\n const camelCased = toCamelCase(data);\n\n return {\n ...camelCased,\n llm: {\n provider: camelCased.llmProvider,\n model: camelCased.llmModel,\n settings: camelCased.llmSettings,\n },\n // Remove the flat fields to avoid confusion\n llmProvider: undefined,\n llmModel: undefined,\n llmSettings: undefined,\n };\n }\n\n async saveAgent(agent: Agent): Promise<Agent> {\n const supabase = await this.getSupabase();\n // Get authenticated user to set user_id if not already set\n const {\n data: { user },\n } = await supabase.auth.getUser();\n\n // Transform Agent type to database format\n // Convert llm object to flat fields\n const { llm, ...restAgent } = agent;\n const flatAgent = {\n ...restAgent,\n llmProvider: llm?.provider,\n llmModel: llm?.model,\n llmSettings: llm?.settings,\n userId: agent.userId || user?.id,\n updatedAt: new Date().toISOString(),\n };\n\n const dbAgent = toSnakeCase(flatAgent);\n\n const { data, error } = await supabase\n .from(\"agents\")\n .upsert(dbAgent)\n .select()\n .single();\n\n if (error) throw new Error(`Failed to save agent: ${error.message}`);\n\n // Transform back to Agent type with llm object\n const camelCased = toCamelCase(data);\n return {\n ...camelCased,\n llm: {\n provider: camelCased.llmProvider,\n model: camelCased.llmModel,\n settings: camelCased.llmSettings,\n },\n llmProvider: undefined,\n llmModel: undefined,\n llmSettings: undefined,\n };\n }\n\n async deleteAgent(id: string): Promise<void> {\n const supabase = await this.getSupabase();\n const { error } = await supabase.from(\"agents\").delete().eq(\"id\", id);\n\n if (error) throw new Error(`Failed to delete agent: ${error.message}`);\n }\n\n async cloneAgent(id: string): Promise<Agent> {\n const original = await this.getAgent(id);\n if (!original) {\n throw new Error(`Agent ${id} not found`);\n }\n\n const cloned = {\n ...original,\n id: `${original.id}-copy-${Date.now()}`,\n name: `${original.name} (Copy)`,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n return this.saveAgent(cloned);\n }\n\n // ==================== Tools ====================\n\n async getTools(): Promise<Tool[]> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"tools\")\n .select(\"*\")\n .order(\"created_at\", { ascending: false });\n\n if (error) throw new Error(`Failed to fetch tools: ${error.message}`);\n\n return (data || []).map(toCamelCase);\n }\n\n async getTool(id: string): Promise<Tool | null> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"tools\")\n .select(\"*\")\n .eq(\"id\", id)\n .single();\n\n if (error) {\n if (error.code === \"PGRST116\") return null; // Not found\n throw new Error(`Failed to fetch tool: ${error.message}`);\n }\n\n return toCamelCase(data);\n }\n\n async saveTool(tool: Tool): Promise<Tool> {\n const supabase = await this.getSupabase();\n const {\n data: { user },\n } = await supabase.auth.getUser();\n\n const dbTool = toSnakeCase({\n ...tool,\n userId: tool.userId || user?.id,\n updatedAt: new Date().toISOString(),\n });\n\n const { data, error } = await supabase\n .from(\"tools\")\n .upsert(dbTool)\n .select()\n .single();\n\n if (error) throw new Error(`Failed to save tool: ${error.message}`);\n\n return toCamelCase(data);\n }\n\n async deleteTool(id: string): Promise<void> {\n const supabase = await this.getSupabase();\n const { error } = await supabase.from(\"tools\").delete().eq(\"id\", id);\n\n if (error) throw new Error(`Failed to delete tool: ${error.message}`);\n }\n\n async cloneTool(id: string): Promise<Tool> {\n const original = await this.getTool(id);\n if (!original) {\n throw new Error(`Tool ${id} not found`);\n }\n\n const cloned = {\n ...original,\n id: `${original.id}-copy-${Date.now()}`,\n name: `${original.name} (Copy)`,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n return this.saveTool(cloned);\n }\n\n // ==================== Spaces ====================\n\n async getSpaces(): Promise<Space[]> {\n const supabase = await this.getSupabase();\n const {\n data: { user },\n } = await supabase.auth.getUser();\n\n const { data, error } = await supabase\n .from(\"spaces\")\n .select(\"*\")\n .eq(\"user_id\", user?.id || \"\")\n .order(\"created_at\", { ascending: false });\n\n if (error) throw new Error(`Failed to fetch spaces: ${error.message}`);\n\n return (data || []).map(toCamelCase);\n }\n\n async getSpace(id: string): Promise<Space | null> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"spaces\")\n .select(\"*\")\n .eq(\"id\", id)\n .single();\n\n if (error) {\n if (error.code === \"PGRST116\") return null; // Not found\n throw new Error(`Failed to fetch space: ${error.message}`);\n }\n\n return toCamelCase(data);\n }\n\n async saveSpace(space: Space): Promise<Space> {\n const supabase = await this.getSupabase();\n const {\n data: { user },\n } = await supabase.auth.getUser();\n\n const dbSpace = toSnakeCase({\n ...space,\n userId: space.userId || user?.id,\n updatedAt: new Date().toISOString(),\n });\n\n const { data, error } = await supabase\n .from(\"spaces\")\n .upsert(dbSpace)\n .select()\n .single();\n\n if (error) throw new Error(`Failed to save space: ${error.message}`);\n\n return toCamelCase(data);\n }\n\n async deleteSpace(id: string): Promise<void> {\n const supabase = await this.getSupabase();\n const { error } = await supabase.from(\"spaces\").delete().eq(\"id\", id);\n\n if (error) throw new Error(`Failed to delete space: ${error.message}`);\n }\n\n // ==================== Artifacts ====================\n\n async getArtifacts(spaceId: string): Promise<Artifact[]> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"artifacts\")\n .select(\"*\")\n .eq(\"space_id\", spaceId)\n .order(\"created_at\", { ascending: false });\n\n if (error) throw new Error(`Failed to fetch artifacts: ${error.message}`);\n\n return (data || []).map(toCamelCase);\n }\n\n async getArtifact(id: string): Promise<Artifact | null> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"artifacts\")\n .select(\"*\")\n .eq(\"id\", id)\n .single();\n\n if (error) {\n if (error.code === \"PGRST116\") return null; // Not found\n throw new Error(`Failed to fetch artifact: ${error.message}`);\n }\n\n return toCamelCase(data);\n }\n\n async saveArtifact(artifact: Artifact): Promise<Artifact> {\n const supabase = await this.getSupabase();\n const {\n data: { user },\n } = await supabase.auth.getUser();\n\n const dbArtifact = toSnakeCase({\n ...artifact,\n userId: artifact.userId || user?.id,\n updatedAt: new Date().toISOString(),\n });\n\n const { data, error } = await supabase\n .from(\"artifacts\")\n .upsert(dbArtifact)\n .select()\n .single();\n\n if (error) throw new Error(`Failed to save artifact: ${error.message}`);\n\n return toCamelCase(data);\n }\n\n async deleteArtifact(id: string): Promise<void> {\n const supabase = await this.getSupabase();\n const { error } = await supabase.from(\"artifacts\").delete().eq(\"id\", id);\n\n if (error) throw new Error(`Failed to delete artifact: ${error.message}`);\n }\n\n // Artifact queries\n async getArtifactsBySpace(spaceId: string): Promise<Artifact[]> {\n return this.getArtifacts(spaceId);\n }\n\n async getArtifactsByTask(taskId: string): Promise<Artifact[]> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"artifacts\")\n .select(\"*\")\n .eq(\"task_id\", taskId)\n .order(\"created_at\", { ascending: false });\n\n if (error) throw new Error(`Failed to fetch artifacts: ${error.message}`);\n\n return (data || []).map(toCamelCase);\n }\n\n async getArtifactsByCategory(\n spaceOrTaskId: string,\n category: 'input' | 'intermediate' | 'output',\n isTask?: boolean\n ): Promise<Artifact[]> {\n const supabase = await this.getSupabase();\n let query = supabase\n .from(\"artifacts\")\n .select(\"*\")\n .eq(\"category\", category);\n\n if (isTask) {\n query = query.eq(\"task_id\", spaceOrTaskId);\n } else {\n query = query.eq(\"space_id\", spaceOrTaskId);\n }\n\n const { data, error } = await query.order(\"created_at\", { ascending: false });\n\n if (error) throw new Error(`Failed to fetch artifacts: ${error.message}`);\n\n return (data || []).map(toCamelCase);\n }\n\n // ==================== Tasks/Conversations ====================\n\n async getTasks(spaceId: string): Promise<Task[]> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"tasks\")\n .select(\"*\")\n .eq(\"space_id\", spaceId)\n .order(\"created_at\", { ascending: false });\n\n if (error) throw new Error(`Failed to fetch tasks: ${error.message}`);\n\n return (data || []).map(toCamelCase);\n }\n\n async getTask(id: string): Promise<Task | null> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"tasks\")\n .select(\"*\")\n .eq(\"id\", id)\n .single();\n\n if (error) {\n if (error.code === \"PGRST116\") return null; // Not found\n throw new Error(`Failed to fetch task: ${error.message}`);\n }\n\n return toCamelCase(data);\n }\n\n async saveTask(task: Task): Promise<Task> {\n const supabase = await this.getSupabase();\n const {\n data: { user },\n } = await supabase.auth.getUser();\n\n const dbTask = toSnakeCase({\n ...task,\n userId: task.userId || user?.id,\n updatedAt: new Date().toISOString(),\n });\n\n const { data, error } = await supabase\n .from(\"tasks\")\n .upsert(dbTask)\n .select()\n .single();\n\n if (error) throw new Error(`Failed to save task: ${error.message}`);\n\n return toCamelCase(data);\n }\n\n async deleteTask(id: string): Promise<void> {\n const supabase = await this.getSupabase();\n const { error } = await supabase.from(\"tasks\").delete().eq(\"id\", id);\n\n if (error) throw new Error(`Failed to delete task: ${error.message}`);\n }\n\n // Legacy conversation methods\n async getConversations(spaceId: string): Promise<Conversation[]> {\n return this.getTasks(spaceId) as Promise<Conversation[]>;\n }\n\n async getConversation(id: string, spaceId?: string): Promise<Conversation | null> {\n const supabase = await this.getSupabase();\n let query = supabase.from(\"tasks\").select(\"*\").eq(\"id\", id);\n\n if (spaceId) {\n query = query.eq(\"space_id\", spaceId);\n }\n\n const { data, error } = await query.single();\n\n if (error) {\n if (error.code === \"PGRST116\") return null; // Not found\n throw new Error(`Failed to fetch conversation: ${error.message}`);\n }\n\n return toCamelCase(data);\n }\n\n async saveConversation(conversation: Conversation): Promise<Conversation> {\n const supabase = await this.getSupabase();\n const {\n data: { user },\n } = await supabase.auth.getUser();\n\n const dbConversation = toSnakeCase({\n ...conversation,\n userId: conversation.userId || user?.id,\n updatedAt: new Date().toISOString(),\n });\n\n const { data, error } = await supabase\n .from(\"tasks\")\n .upsert(dbConversation)\n .select()\n .single();\n\n if (error) throw new Error(`Failed to save conversation: ${error.message}`);\n return toCamelCase(data);\n }\n\n async deleteConversation(id: string, spaceId?: string): Promise<void> {\n const supabase = await this.getSupabase();\n let query = supabase.from(\"tasks\").delete().eq(\"id\", id);\n\n if (spaceId) {\n query = query.eq(\"space_id\", spaceId);\n }\n\n const { error } = await query;\n\n if (error)\n throw new Error(`Failed to delete conversation: ${error.message}`);\n }\n\n // ==================== Model Providers ====================\n\n async getModelProviders(): Promise<ModelProvider[]> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"model_providers\")\n .select(\"*\")\n .order(\"created_at\", { ascending: false });\n\n if (error) throw new Error(`Failed to fetch model providers: ${error.message}`);\n\n return (data || []).map(toCamelCase);\n }\n\n async getModelProvider(id: string): Promise<ModelProvider | null> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"model_providers\")\n .select(\"*\")\n .eq(\"id\", id)\n .single();\n\n if (error) {\n if (error.code === \"PGRST116\") return null;\n throw new Error(`Failed to fetch model provider: ${error.message}`);\n }\n\n return toCamelCase(data);\n }\n\n async saveModelProvider(provider: ModelProvider): Promise<ModelProvider> {\n const supabase = await this.getSupabase();\n const dbProvider = toSnakeCase({\n ...provider,\n updatedAt: new Date().toISOString(),\n });\n\n const { data, error } = await supabase\n .from(\"model_providers\")\n .upsert(dbProvider)\n .select()\n .single();\n\n if (error) throw new Error(`Failed to save model provider: ${error.message}`);\n\n return toCamelCase(data);\n }\n\n async deleteModelProvider(id: string): Promise<void> {\n const supabase = await this.getSupabase();\n const { error } = await supabase.from(\"model_providers\").delete().eq(\"id\", id);\n\n if (error) throw new Error(`Failed to delete model provider: ${error.message}`);\n }\n\n // ==================== Datasources ====================\n\n async getDatasources(): Promise<Datasource[]> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"datasources\")\n .select(\"*\")\n .order(\"created_at\", { ascending: false });\n\n if (error) throw new Error(`Failed to fetch datasources: ${error.message}`);\n\n return (data || []).map(toCamelCase);\n }\n\n async getDatasource(id: string): Promise<Datasource | null> {\n const supabase = await this.getSupabase();\n const { data, error } = await supabase\n .from(\"datasources\")\n .select(\"*\")\n .eq(\"id\", id)\n .single();\n\n if (error) {\n if (error.code === \"PGRST116\") return null;\n throw new Error(`Failed to fetch datasource: ${error.message}`);\n }\n\n return toCamelCase(data);\n }\n\n async saveDatasource(datasource: Datasource): Promise<Datasource> {\n const supabase = await this.getSupabase();\n const dbDatasource = toSnakeCase({\n ...datasource,\n updatedAt: new Date().toISOString(),\n });\n\n const { data, error } = await supabase\n .from(\"datasources\")\n .upsert(dbDatasource)\n .select()\n .single();\n\n if (error) throw new Error(`Failed to save datasource: ${error.message}`);\n\n return toCamelCase(data);\n }\n\n async deleteDatasource(id: string): Promise<void> {\n const supabase = await this.getSupabase();\n const { error } = await supabase.from(\"datasources\").delete().eq(\"id\", id);\n\n if (error) throw new Error(`Failed to delete datasource: ${error.message}`);\n }\n}\n\n","/**\n * DataAdapterFactory - Creates appropriate data adapter based on configuration\n * Internal to Viber - external code should use ViberDataManager\n */\n\nimport type { DataAdapter } from \"./adapter\";\nimport { LocalDataAdapter } from \"./adapters/local\";\n// SupabaseDatabaseAdapter is NOT imported here - it's imported dynamically in getServerDataAdapter()\n// to avoid bundling server code (next/headers) in client bundle\n\nexport type DataMode = \"local\" | \"database\" | \"auto\";\n\nexport class DataAdapterFactory {\n private static instance: DataAdapter | null = null;\n\n /**\n * Create or get singleton data adapter instance\n */\n static create(mode?: DataMode): DataAdapter {\n if (this.instance) {\n return this.instance;\n }\n\n const dataMode = mode || this.detectMode();\n\n if (dataMode === \"database\") {\n // For client-side database mode, we should ideally not be creating an adapter here\n // but rather using server actions. However, for legacy compatibility or\n // if this is called on the server, we might need to handle it.\n if (typeof window !== \"undefined\") {\n throw new Error(\n \"Client-side direct database access is not supported. Use server actions.\"\n );\n }\n console.log(\"[ViberDataAdapter] Using database mode (API-based)\");\n // We can't synchronously return SupabaseDatabaseAdapter here because of dynamic import requirements for server-only code.\n // This method is synchronous. If we are on the server, we should use getServerDataAdapter instead.\n // For now, we'll throw an error to enforce using the async/server-specific path.\n throw new Error(\n \"Synchronous creation of database adapter is not supported. Use getServerDataAdapter().\"\n );\n } else {\n console.log(\"[ViberDataAdapter] Using local mode (file-based)\");\n this.instance = new LocalDataAdapter();\n }\n\n return this.instance;\n }\n\n /**\n * Auto-detect which mode to use based on environment\n */\n private static detectMode(): DataMode {\n // Check explicit environment variable\n const explicitMode = process.env.VIBEX_DATA_MODE as DataMode | undefined;\n if (explicitMode === \"local\" || explicitMode === \"database\") {\n return explicitMode;\n }\n\n // Use database mode only if Supabase is explicitly configured\n if (\n process.env.NEXT_PUBLIC_SUPABASE_URL &&\n process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY\n ) {\n return \"database\";\n }\n\n // Default to local mode for standalone/daemon use\n return \"local\";\n }\n\n /**\n * Reset singleton instance (useful for testing)\n */\n static reset(): void {\n this.instance = null;\n }\n\n /**\n * Get current mode\n */\n static getCurrentMode(): DataMode {\n return this.detectMode();\n }\n}\n\n/**\n * Get data adapter for client-side and general use\n * Internal to Viber - use ViberDataManager instead\n */\nexport function getDataAdapter(): DataAdapter {\n return DataAdapterFactory.create();\n}\n\n/**\n * Get data adapter for server-side API routes\n * Uses direct Supabase access in database mode (not API calls)\n *\n * NOTE: This function uses server-only imports and should only be called\n * from server-side code (API routes, server components, server actions).\n */\nlet serverAdapterInstance: DataAdapter | null = null;\n\nexport function getServerDataAdapter(): DataAdapter {\n // Return cached instance if available\n if (serverAdapterInstance) {\n return serverAdapterInstance;\n }\n\n // Check we're on the server\n if (typeof window !== \"undefined\") {\n throw new Error(\"getServerDataAdapter() can only be called on the server\");\n }\n\n const mode = DataAdapterFactory.getCurrentMode();\n\n if (mode === \"database\") {\n // Dynamic require to avoid bundling server code in client bundle\n // Use server-only version that doesn't import next/headers at module level\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { SupabaseDatabaseAdapter } = require(\"./adapters/supabase-server\");\n // API routes use direct Supabase access to avoid circular dependencies\n console.log(\n \"[ViberDataAdapter] Server: Using Supabase database mode (direct access)\"\n );\n serverAdapterInstance = new SupabaseDatabaseAdapter();\n } else {\n // Local mode uses file system\n console.log(\"[ViberDataAdapter] Server: Using local mode (file-based)\");\n serverAdapterInstance = new LocalDataAdapter();\n }\n\n return serverAdapterInstance!;\n}\n","/**\n * Base classes and decorators for custom tools\n * Provides decorator-based tool extraction for multi-tool providers\n */\n\nimport { z } from \"zod\";\nimport * as path from \"path\";\nimport { promises as fs } from \"fs\";\nimport \"reflect-metadata\";\nimport { CoreTool } from \"../core/tool\";\nimport { getViberRoot } from \"../config\";\n\nconst TOOLS_METADATA_KEY = Symbol(\"tools\");\n\n/**\n * Option definition for select fields\n * Contains semantic information about options (NOT UI concerns like icons)\n */\nexport interface OptionDefinition {\n value: string; // The actual value stored\n label: string; // Human-readable label\n description?: string; // Semantic description of what this option does\n}\n\n/**\n * Base configuration item - shared properties for all field types\n */\ninterface BaseConfigItem {\n name: string; // Human-readable field name\n description?: string; // What this field does/controls\n required?: boolean; // Whether this field is required\n defaultValue?: any; // Default value for the field\n}\n\n/**\n * String field configuration\n * Supports environment variable integration\n */\nexport interface StringConfigItem extends BaseConfigItem {\n type: \"string\";\n envVar?: string; // Environment variable name if applicable\n}\n\n/**\n * Number field configuration\n * Supports min/max validation\n */\nexport interface NumberConfigItem extends BaseConfigItem {\n type: \"number\";\n min?: number; // Minimum value\n max?: number; // Maximum value\n}\n\n/**\n * Boolean field configuration\n */\nexport interface BooleanConfigItem extends BaseConfigItem {\n type: \"boolean\";\n}\n\n/**\n * Select field configuration\n * Supports simple string options or rich option definitions\n */\nexport interface SelectConfigItem extends BaseConfigItem {\n type: \"select\";\n options: string[] | OptionDefinition[]; // Available choices\n}\n\n/**\n * Array field configuration\n */\nexport interface ArrayConfigItem extends BaseConfigItem {\n type: \"array\";\n itemType?: \"string\" | \"number\"; // Type of array items\n}\n\n/**\n * Configuration item - discriminated union of all field types\n * Each type has its own specific properties, ensuring type safety\n */\nexport type ConfigItem =\n | StringConfigItem\n | NumberConfigItem\n | BooleanConfigItem\n | SelectConfigItem\n | ArrayConfigItem;\n\n/**\n * Tool configuration schema using ConfigItem\n */\nexport interface ConfigSchema {\n [key: string]: ConfigItem;\n}\n\n/**\n * Tool function decorator - marks a method as a tool with schema and description\n */\nexport function ToolFunction<T extends z.ZodSchema>(config: {\n name?: string; // Optional, defaults to method name\n description: string;\n input: T; // Input schema\n}) {\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n // Store tool metadata\n const tools = Reflect.getMetadata(TOOLS_METADATA_KEY, target) || [];\n tools.push({\n methodName: propertyKey,\n toolName: config.name || propertyKey,\n description: config.description,\n inputSchema: config.input,\n });\n Reflect.defineMetadata(TOOLS_METADATA_KEY, tools, target);\n\n // Wrap the original method to validate input\n const originalMethod = descriptor.value;\n descriptor.value = async function (input: z.infer<T>) {\n // Validate input\n const validated = config.input.parse(input);\n // Call original method\n return originalMethod.call(this, validated);\n };\n\n return descriptor;\n };\n}\n\n// Shorter alias\nexport { ToolFunction as Function };\n\n/**\n * Configuration schema for tools\n */\nexport interface ToolConfig {\n [key: string]: any;\n}\n\n/**\n * Tool metadata\n */\nexport interface ToolMetadata {\n id: string;\n name: string;\n description: string;\n category: string;\n requiresApiKey?: boolean;\n apiKeyName?: string;\n}\n\n/**\n * Base class for tools - a single class can provide multiple related tool methods\n *\n * Provides standardized space-aware file operations that automatically handle\n * Viber space storage structure (.viber/{spaceId}/artifacts/).\n *\n * Example usage in a custom tool:\n * ```typescript\n * class MyTool extends Tool {\n * @ToolFunction({\n * description: 'Process a file in the space',\n * input: z.object({ fileName: z.string() })\n * })\n * async processFile(input: { fileName: string }) {\n * // Check if file exists in space artifacts\n * if (await this.artifactFileExists(input.fileName)) {\n * // Read file content\n * const content = await this.readArtifactFile(input.fileName);\n *\n * // Process content...\n * const processed = content.toUpperCase();\n *\n * // Write back to artifacts\n * await this.writeArtifactFile('processed_' + input.fileName, processed);\n *\n * return { success: true };\n * }\n * throw new Error('File not found in space artifacts');\n * }\n * }\n * ```\n */\nexport abstract class Tool {\n protected spaceId?: string;\n\n /**\n * Get tool metadata\n */\n abstract getMetadata(): ToolMetadata;\n\n /**\n * Get configuration schema for this tool\n * Returns null if no configuration needed\n */\n getConfigSchema(): ConfigSchema | null {\n return null;\n }\n\n /**\n * Validate configuration\n */\n validateConfig(config: any): boolean {\n const schema = this.getConfigSchema();\n if (!schema) return true;\n\n // Basic validation based on ConfigSchema\n for (const [key, item] of Object.entries(schema)) {\n const value = config[key];\n\n // Check required fields\n if (\n item.required &&\n (value === undefined || value === null || value === \"\")\n ) {\n return false;\n }\n\n // Type validation\n if (value !== undefined && value !== null) {\n switch (item.type) {\n case \"number\": {\n if (typeof value !== \"number\") return false;\n // TypeScript knows item is NumberConfigItem here\n if (item.min !== undefined && value < item.min) return false;\n if (item.max !== undefined && value > item.max) return false;\n break;\n }\n case \"boolean\":\n if (typeof value !== \"boolean\") return false;\n break;\n case \"select\": {\n // TypeScript knows item is SelectConfigItem here\n // Handle both string[] and OptionDefinition[]\n const validValues = item.options.map((opt) =>\n typeof opt === \"string\" ? opt : opt.value\n );\n if (!validValues.includes(value)) return false;\n break;\n }\n case \"array\":\n if (!Array.isArray(value)) return false;\n break;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ToolConfig | null {\n return null;\n }\n\n /**\n * Set configuration\n */\n setConfig(config: ToolConfig): void {\n // Override in subclasses if needed\n // The config parameter is intentionally unused in the base class\n void config;\n }\n\n /**\n * Set space context for this tool instance\n * Called by the tool system when spaceId is available\n */\n setSpaceId(spaceId?: string): void {\n this.spaceId = spaceId;\n }\n\n /**\n * Get the current space ID\n */\n getSpaceId(): string | undefined {\n return this.spaceId;\n }\n\n /**\n * Get space-aware storage path\n * Utility method for tools that need to work with space-specific storage\n */\n protected async getSpacePathAsync(subPath: string = \"\"): Promise<string> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n // Use the storage module properly\n const { SpaceStorageFactory } = await import(\"../storage/space\");\n const storage = await SpaceStorageFactory.create(this.spaceId);\n const basePath = storage.getSpacePath();\n return subPath ? path.join(basePath, subPath) : basePath;\n }\n\n private static getRootPath(): string {\n return getViberRoot();\n }\n\n protected getSpacePath(subPath: string = \"\"): string {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n // Use the exact same root path logic as SpaceStorageFactory\n const rootPath = Tool.getRootPath();\n const basePath = path.join(rootPath, \"spaces\", this.spaceId);\n return subPath ? path.join(basePath, subPath) : basePath;\n }\n\n /**\n * Get space artifacts directory path\n * Utility method for tools that work with space artifacts\n */\n protected getSpaceArtifactsPath(fileName: string = \"\"): string {\n const artifactsPath = this.getSpacePath(\"artifacts\");\n return fileName ? path.join(artifactsPath, fileName) : artifactsPath;\n }\n\n /**\n * Resolve file path within space artifacts directory\n * Handles both relative and absolute paths, with security checks\n */\n protected resolveArtifactPath(filePath: string): string {\n if (path.isAbsolute(filePath)) {\n // For absolute paths, check if they're within the space artifacts directory\n const artifactsPath = this.getSpaceArtifactsPath();\n const resolved = path.resolve(filePath);\n if (!resolved.startsWith(artifactsPath)) {\n throw new Error(\n \"Absolute paths outside space artifacts directory are not allowed\"\n );\n }\n return resolved;\n }\n // For relative paths, resolve within artifacts directory\n return this.getSpaceArtifactsPath(filePath);\n }\n\n /**\n * Read file from space artifacts directory\n */\n protected async readArtifactFile(\n filePath: string,\n encoding: BufferEncoding = \"utf8\"\n ): Promise<string> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n const { SpaceStorageFactory } = await import(\"../storage/space\");\n const storage = await SpaceStorageFactory.create(this.spaceId);\n\n // Normalize path - remove \"artifacts/\" prefix if present since storage methods handle it\n const normalizedPath = filePath.startsWith(\"artifacts/\")\n ? filePath.substring(10)\n : filePath;\n const artifactPath = `artifacts/${normalizedPath}`;\n\n const buffer = await storage.readFile(artifactPath);\n return buffer.toString(encoding);\n }\n\n /**\n * Write file to space artifacts directory\n */\n protected async writeArtifactFile(\n filePath: string,\n content: string,\n encoding: BufferEncoding = \"utf8\"\n ): Promise<void> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n const { SpaceStorageFactory } = await import(\"../storage/space\");\n const storage = await SpaceStorageFactory.create(this.spaceId);\n\n // Normalize path - remove \"artifacts/\" prefix if present\n const normalizedPath = filePath.startsWith(\"artifacts/\")\n ? filePath.substring(10)\n : filePath;\n const artifactPath = `artifacts/${normalizedPath}`;\n\n const buffer = Buffer.from(content, encoding);\n await storage.writeFile(artifactPath, buffer);\n }\n\n /**\n * Check if file exists in space artifacts directory\n */\n protected async artifactFileExists(filename: string): Promise<boolean> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n try {\n const { SpaceStorageFactory } = await import(\"../storage/space\");\n const storage = await SpaceStorageFactory.create(this.spaceId);\n\n // Try to get the artifact by filename - simple and direct\n const artifact = await storage.getArtifact(filename);\n return artifact !== null;\n } catch {\n return false;\n }\n }\n\n /**\n * Get file stats from space artifacts directory\n * Note: This method still uses fs.stat for local storage compatibility\n * For Supabase storage, size info is available through artifact metadata\n */\n protected async getArtifactFileStats(filePath: string) {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n // For local storage, we can still use fs.stat on the resolved path\n // This is acceptable since getArtifactFileStats is primarily used for\n // file metadata that's already available through other means in Supabase\n const fullPath = this.resolveArtifactPath(filePath);\n return await fs.stat(fullPath);\n }\n\n /**\n * List files in space artifacts directory\n */\n protected async listArtifactFiles(\n dirPath: string = \"\",\n recursive: boolean = false\n ): Promise<string[]> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n const { SpaceStorageFactory } = await import(\"../storage/space\");\n const storage = await SpaceStorageFactory.create(this.spaceId);\n\n // Normalize directory path\n const normalizedPath = dirPath.startsWith(\"artifacts/\")\n ? dirPath.substring(10)\n : dirPath;\n const searchPath = normalizedPath ? `artifacts/${normalizedPath}` : \"artifacts\";\n\n // Get list of files from storage\n const allFiles = await storage.list(searchPath);\n\n if (!recursive) {\n // Filter to only direct children (no subdirectories)\n return allFiles.filter((file) => !file.includes(\"/\"));\n }\n\n return allFiles;\n }\n\n /**\n * Delete file from space artifacts directory\n */\n protected async deleteArtifactFile(filePath: string): Promise<void> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n const { SpaceStorageFactory } = await import(\"../storage/space\");\n const storage = await SpaceStorageFactory.create(this.spaceId);\n\n // Normalize path\n const normalizedPath = filePath.startsWith(\"artifacts/\")\n ? filePath.substring(10)\n : filePath;\n const artifactPath = `artifacts/${normalizedPath}`;\n\n await storage.delete(artifactPath);\n }\n\n /**\n * Copy file within space artifacts directory\n */\n protected async copyArtifactFile(\n sourcePath: string,\n destPath: string\n ): Promise<void> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n const { SpaceStorageFactory } = await import(\"../storage/space\");\n const storage = await SpaceStorageFactory.create(this.spaceId);\n\n // Normalize paths\n const normalizedSource = sourcePath.startsWith(\"artifacts/\")\n ? sourcePath.substring(10)\n : sourcePath;\n const normalizedDest = destPath.startsWith(\"artifacts/\")\n ? destPath.substring(10)\n : destPath;\n\n const sourceArtifactPath = `artifacts/${normalizedSource}`;\n const destArtifactPath = `artifacts/${normalizedDest}`;\n\n // Read source file and write to destination\n const content = await storage.readFile(sourceArtifactPath);\n await storage.writeFile(destArtifactPath, content);\n }\n\n /**\n * Move file within space artifacts directory\n */\n protected async moveArtifactFile(\n sourcePath: string,\n destPath: string\n ): Promise<void> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n const { SpaceStorageFactory } = await import(\"../storage/space\");\n const storage = await SpaceStorageFactory.create(this.spaceId);\n\n // Normalize paths\n const normalizedSource = sourcePath.startsWith(\"artifacts/\")\n ? sourcePath.substring(10)\n : sourcePath;\n const normalizedDest = destPath.startsWith(\"artifacts/\")\n ? destPath.substring(10)\n : destPath;\n\n const sourceArtifactPath = `artifacts/${normalizedSource}`;\n const destArtifactPath = `artifacts/${normalizedDest}`;\n\n // Read, write, then delete source\n const content = await storage.readFile(sourceArtifactPath);\n await storage.writeFile(destArtifactPath, content);\n await storage.delete(sourceArtifactPath);\n }\n\n /**\n * Check if tool is available/properly configured\n */\n isAvailable(): boolean {\n return true;\n }\n\n /**\n * Automatically extract all decorated methods as tools\n */\n getTools(): Record<string, CoreTool> {\n const tools: Record<string, CoreTool> = {};\n\n // Get all decorated tool methods\n const toolMetadata = Reflect.getMetadata(TOOLS_METADATA_KEY, this) || [];\n\n for (const {\n methodName,\n toolName,\n description,\n inputSchema,\n } of toolMetadata) {\n // Create CoreTool entry - tool names should already be in snake_case\n tools[toolName] = {\n description,\n inputSchema: inputSchema || z.any(),\n execute: (this as any)[methodName].bind(this),\n };\n }\n\n return tools;\n }\n\n /**\n * Get list of tool names provided by this class\n */\n getToolNames(): string[] {\n const toolMetadata = Reflect.getMetadata(TOOLS_METADATA_KEY, this) || [];\n return toolMetadata.map((t: any) => t.toolName);\n }\n\n /**\n * Get detailed information about all tool functions\n * Returns the same structure as getTools() but without execute functions\n */\n getToolDetails(): Array<{\n name: string;\n description: string;\n parameters: any;\n }> {\n const tools = this.getTools();\n return Object.entries(tools).map(([name, tool]) => ({\n name,\n description: tool.description,\n parameters: tool.inputSchema?._def || tool.inputSchema || {},\n }));\n }\n}\n","/**\n * FileTool using unified decorator for cleaner code\n */\n\nimport { z } from \"zod\";\nimport { promises as fs } from \"fs\";\nimport * as path from \"path\";\nimport {\n Tool,\n ToolFunction,\n ToolMetadata,\n ToolConfig,\n ConfigSchema,\n} from \"./base\";\n\nexport class FileTool extends Tool {\n private config: ToolConfig = {\n basePath: process.cwd(),\n allowAbsolutePaths: true,\n maxFileSize: 10 * 1024 * 1024, // 10MB\n allowedExtensions: null, // null means all extensions allowed\n excludedPaths: [\".git\", \"node_modules\", \".env\"],\n };\n\n getMetadata(): ToolMetadata {\n return {\n id: \"file\",\n name: \"File System Tools\",\n description:\n \"Read, write, manage and manipulate files and directories in the local file system\",\n category: \"file\",\n };\n }\n\n getConfigSchema(): ConfigSchema {\n return {\n basePath: {\n name: \"Base Path\",\n type: \"string\",\n description: \"Base directory for file operations\",\n defaultValue: process.cwd(),\n required: false,\n },\n allowAbsolutePaths: {\n name: \"Allow Absolute Paths\",\n type: \"boolean\",\n description:\n \"Allow operations on absolute paths outside the base directory\",\n defaultValue: false,\n required: false,\n },\n maxFileSize: {\n name: \"Max File Size\",\n type: \"number\",\n description: \"Maximum file size in bytes\",\n defaultValue: 10485760, // 10MB\n required: false,\n },\n allowedExtensions: {\n name: \"Allowed Extensions\",\n type: \"array\",\n description:\n \"List of allowed file extensions (leave empty to allow all)\",\n defaultValue: null,\n required: false,\n },\n excludedPaths: {\n name: \"Excluded Paths\",\n type: \"array\",\n description: \"Directories and paths to exclude from operations\",\n defaultValue: [\".git\", \"node_modules\", \".env\"],\n required: false,\n },\n };\n }\n\n getConfig(): ToolConfig {\n return this.config;\n }\n\n setConfig(config: ToolConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n private getBasePath(): string {\n // If we have a space ID, use the space's artifacts directory\n if (this.spaceId) {\n return this.getSpaceArtifactsPath();\n }\n return this.config.basePath || process.cwd();\n }\n\n private resolvePath(filePath: string): string {\n // If we have space context, use artifact-aware path resolution\n if (this.spaceId) {\n return this.resolveArtifactPath(filePath);\n }\n\n // Fallback to original logic for non-space context\n if (path.isAbsolute(filePath)) {\n if (!this.config.allowAbsolutePaths) {\n throw new Error(\n \"Absolute paths are not allowed. Please use relative paths or enable allowAbsolutePaths in configuration.\"\n );\n }\n return filePath;\n }\n return path.join(this.getBasePath(), filePath);\n }\n\n @ToolFunction({\n description:\n \"Create a new file or overwrite an existing file with the specified content. Creates parent directories if they don't exist.\",\n input: z.object({\n path: z\n .string()\n .describe(\n \"The file path to create or overwrite (relative or absolute)\"\n ),\n content: z.string().describe(\"The content to write to the file\"),\n encoding: z\n .enum([\"utf8\", \"base64\"])\n .optional()\n .default(\"utf8\")\n .describe(\n \"The encoding format for the file content (utf8 for text, base64 for binary)\"\n ),\n }),\n })\n async create_file(input: {\n path: string;\n content: string;\n encoding?: \"utf8\" | \"base64\";\n }) {\n // Use base class method for space context\n if (this.spaceId) {\n await this.writeArtifactFile(input.path, input.content, input.encoding || \"utf8\");\n return {\n success: true,\n path: input.path,\n size: Buffer.byteLength(input.content, input.encoding || \"utf8\"),\n };\n }\n\n // Fallback to fs for non-space operations\n const fullPath = this.resolvePath(input.path);\n\n // Ensure directory exists\n const dir = path.dirname(fullPath);\n await fs.mkdir(dir, { recursive: true });\n\n // Write file\n await fs.writeFile(fullPath, input.content, input.encoding || \"utf8\");\n\n return {\n success: true,\n path: fullPath,\n size: Buffer.byteLength(input.content, input.encoding || \"utf8\"),\n };\n }\n\n @ToolFunction({\n description:\n \"Read the contents of a file from the file system. Returns the file content along with metadata like size and modification time.\",\n input: z.object({\n path: z.string().describe(\"The file path to read (relative or absolute)\"),\n encoding: z\n .enum([\"utf8\", \"base64\"])\n .optional()\n .default(\"utf8\")\n .describe(\n \"The encoding to use when reading the file (utf8 for text files, base64 for binary files)\"\n ),\n }),\n })\n async read_file(input: { path: string; encoding?: \"utf8\" | \"base64\" }) {\n // Use base class method for space context\n if (this.spaceId) {\n const content = await this.readArtifactFile(input.path, input.encoding || \"utf8\");\n const stats = await this.getArtifactFileStats(input.path);\n return {\n content,\n path: input.path,\n size: stats.size,\n modified: stats.mtime.toISOString(),\n };\n }\n\n // Fallback to fs for non-space operations\n const fullPath = this.resolvePath(input.path);\n\n const content = await fs.readFile(fullPath, input.encoding || \"utf8\");\n const stats = await fs.stat(fullPath);\n\n return {\n content,\n path: fullPath,\n size: stats.size,\n modified: stats.mtime.toISOString(),\n };\n }\n\n @ToolFunction({\n description:\n \"Delete a file from the file system. This operation is irreversible. The file must exist or an error will be thrown.\",\n input: z.object({\n path: z\n .string()\n .describe(\"The file path to delete (relative or absolute)\"),\n }),\n })\n async delete_file(input: { path: string }) {\n // Use base class method for space context\n if (this.spaceId) {\n await this.deleteArtifactFile(input.path);\n return {\n success: true,\n path: input.path,\n };\n }\n\n // Fallback to fs for non-space operations\n const fullPath = this.resolvePath(input.path);\n\n await fs.unlink(fullPath);\n\n return {\n success: true,\n path: fullPath,\n };\n }\n\n @ToolFunction({\n description:\n \"List all files in a directory with optional recursive traversal and pattern filtering. Returns an array of file paths.\",\n input: z.object({\n directory: z\n .string()\n .describe(\n \"The directory path to list files from (relative or absolute)\"\n ),\n recursive: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Whether to recursively list files in subdirectories\"),\n pattern: z\n .string()\n .optional()\n .describe(\n \"Optional pattern to filter files (simple string matching, not full glob)\"\n ),\n }),\n })\n async list_files(input: {\n directory: string;\n recursive?: boolean;\n pattern?: string;\n }) {\n // Use base class method for space context\n if (this.spaceId) {\n let files = await this.listArtifactFiles(input.directory, input.recursive || false);\n\n // Apply pattern filter if provided\n if (input.pattern) {\n files = files.filter((file) => file.includes(input.pattern!));\n }\n\n return {\n directory: input.directory,\n files,\n count: files.length,\n };\n }\n\n // Fallback to fs for non-space operations\n const fullPath = this.resolvePath(input.directory);\n\n const files: string[] = [];\n\n async function walk(dir: string) {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n\n if (entry.isDirectory() && input.recursive) {\n await walk(entryPath);\n } else if (entry.isFile()) {\n // Apply pattern filter if provided\n if (!input.pattern || entryPath.includes(input.pattern)) {\n files.push(entryPath);\n }\n }\n }\n }\n\n await walk(fullPath);\n\n return {\n directory: fullPath,\n files,\n count: files.length,\n };\n }\n\n @ToolFunction({\n description:\n \"Move or rename a file from one location to another. Creates parent directories if needed. The source file will no longer exist after this operation.\",\n input: z.object({\n source: z\n .string()\n .describe(\"The source file path to move from (relative or absolute)\"),\n destination: z\n .string()\n .describe(\n \"The destination file path to move to (relative or absolute)\"\n ),\n }),\n })\n async move_file(input: { source: string; destination: string }) {\n // Use base class method for space context\n if (this.spaceId) {\n await this.moveArtifactFile(input.source, input.destination);\n return {\n success: true,\n source: input.source,\n destination: input.destination,\n };\n }\n\n // Fallback to fs for non-space operations\n const sourcePath = this.resolvePath(input.source);\n const destPath = this.resolvePath(input.destination);\n\n // Ensure destination directory exists\n const destDir = path.dirname(destPath);\n await fs.mkdir(destDir, { recursive: true });\n\n await fs.rename(sourcePath, destPath);\n\n return {\n success: true,\n source: sourcePath,\n destination: destPath,\n };\n }\n\n @ToolFunction({\n description:\n \"Copy a file from one location to another. Creates parent directories if needed. The source file remains unchanged.\",\n input: z.object({\n source: z\n .string()\n .describe(\"The source file path to copy from (relative or absolute)\"),\n destination: z\n .string()\n .describe(\n \"The destination file path to copy to (relative or absolute)\"\n ),\n }),\n })\n async copy_file(input: { source: string; destination: string }) {\n // Use base class method for space context\n if (this.spaceId) {\n await this.copyArtifactFile(input.source, input.destination);\n return {\n success: true,\n source: input.source,\n destination: input.destination,\n };\n }\n\n // Fallback to fs for non-space operations\n const sourcePath = this.resolvePath(input.source);\n const destPath = this.resolvePath(input.destination);\n\n // Ensure destination directory exists\n const destDir = path.dirname(destPath);\n await fs.mkdir(destDir, { recursive: true });\n\n await fs.copyFile(sourcePath, destPath);\n\n return {\n success: true,\n source: sourcePath,\n destination: destPath,\n };\n }\n\n @ToolFunction({\n description:\n \"Check if a file or directory exists at the specified path. Returns existence status and file metadata if it exists.\",\n input: z.object({\n path: z\n .string()\n .describe(\"The file or directory path to check (relative or absolute)\"),\n }),\n })\n async file_exists(input: { path: string }) {\n const fullPath = this.resolvePath(input.path);\n\n try {\n // Use base class method for space-aware file existence check when in space context\n if (this.spaceId) {\n const exists = await this.artifactFileExists(input.path);\n if (exists) {\n const stats = await this.getArtifactFileStats(input.path);\n return {\n exists: true,\n path: fullPath,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n size: stats.size,\n };\n } else {\n return {\n exists: false,\n path: fullPath,\n };\n }\n }\n\n // Fallback for non-space context\n await fs.access(fullPath);\n const stats = await fs.stat(fullPath);\n\n return {\n exists: true,\n path: fullPath,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n size: stats.size,\n };\n } catch {\n return {\n exists: false,\n path: fullPath,\n };\n }\n }\n}\n","/**\n * Simplified Search Tool Configuration\n * Focuses on Tavily and Serper as primary providers\n */\n\nimport { z } from 'zod';\n\nexport type SearchProvider = 'tavily' | 'serper';\n\nexport const SearchConfigSchema = z.object({\n tavilyApiKey: z.string().optional(),\n serperApiKey: z.string().optional(),\n defaultProvider: z.enum(['tavily', 'serper', 'auto']).default('auto'),\n enableFallback: z.boolean().default(true),\n});\n\nexport type SearchConfig = z.infer<typeof SearchConfigSchema>;\n\n// Provider metadata\nexport const SEARCH_PROVIDERS = {\n tavily: {\n name: 'Tavily',\n endpoint: 'https://api.tavily.com/search',\n envVar: 'TAVILY_API_KEY',\n priority: 1, // Higher priority\n },\n serper: {\n name: 'Serper', \n endpoint: 'https://google.serper.dev/search',\n envVar: 'SERPER_API_KEY',\n priority: 2,\n },\n} as const;\n\n/**\n * Simplified Search Configuration Manager\n */\nexport class SearchConfigManager {\n private config: SearchConfig;\n \n constructor(config?: Partial<SearchConfig>) {\n this.config = SearchConfigSchema.parse(config || {});\n }\n\n getApiKey(provider: SearchProvider): string | null {\n // First check config, then fall back to env vars\n if (provider === 'tavily' && this.config.tavilyApiKey) {\n return this.config.tavilyApiKey;\n }\n if (provider === 'serper' && this.config.serperApiKey) {\n return this.config.serperApiKey;\n }\n \n // Fall back to environment variable\n return process.env[SEARCH_PROVIDERS[provider].envVar] || null;\n }\n\n isProviderAvailable(provider: SearchProvider): boolean {\n return !!this.getApiKey(provider);\n }\n\n getAvailableProviders(): SearchProvider[] {\n return (Object.keys(SEARCH_PROVIDERS) as SearchProvider[])\n .filter(p => this.isProviderAvailable(p))\n .sort((a, b) => SEARCH_PROVIDERS[a].priority - SEARCH_PROVIDERS[b].priority);\n }\n\n selectProvider(): SearchProvider | null {\n if (this.config.defaultProvider !== 'auto') {\n const provider = this.config.defaultProvider;\n if (this.isProviderAvailable(provider)) {\n return provider;\n }\n }\n \n const available = this.getAvailableProviders();\n return available[0] || null;\n }\n\n getFallbackProvider(excludeProvider: SearchProvider): SearchProvider | null {\n if (!this.config.enableFallback) return null;\n \n const available = this.getAvailableProviders();\n return available.find(p => p !== excludeProvider) || null;\n }\n\n isSearchAvailable(): boolean {\n return this.getAvailableProviders().length > 0;\n }\n\n getStatus() {\n const providers = (Object.keys(SEARCH_PROVIDERS) as SearchProvider[]).map(id => ({\n id,\n name: SEARCH_PROVIDERS[id].name,\n configured: !!this.getApiKey(id),\n available: this.isProviderAvailable(id),\n }));\n\n return {\n available: this.isSearchAvailable(),\n providers,\n defaultProvider: this.config.defaultProvider,\n selectedProvider: this.selectProvider(),\n };\n }\n}","/**\n * Simplified SearchTool - Focuses on essential search functionality\n */\n\nimport { z } from 'zod';\nimport { Tool, ToolFunction, ToolMetadata, ToolConfig, ConfigSchema } from './base';\nimport { SearchConfigManager, SearchProvider, SEARCH_PROVIDERS } from './search-config';\n\n// Search result interfaces\nexport interface SearchResult {\n title: string;\n url: string;\n snippet: string;\n content?: string;\n score?: number;\n publishedDate?: string;\n}\n\nexport interface SearchResponse {\n provider: string;\n query: string;\n results: SearchResult[];\n totalResults?: number;\n}\n\n/**\n * Simplified SearchTool\n */\nexport class SearchTool extends Tool {\n private configManager: SearchConfigManager;\n private config: any = {};\n\n constructor() {\n super();\n this.configManager = new SearchConfigManager();\n }\n\n getMetadata(): ToolMetadata {\n const status = this.configManager.getStatus();\n const availableProviders = status.providers\n .filter(p => p.available)\n .map(p => p.name)\n .join(' and ');\n \n return {\n id: 'search',\n name: 'Web Search',\n description: availableProviders \n ? `Search the web for current information using ${availableProviders}`\n : 'Web search functionality (requires TAVILY_API_KEY or SERPER_API_KEY)',\n category: 'search',\n };\n }\n\n getConfigSchema(): ConfigSchema {\n return {\n defaultProvider: {\n name: '默认搜索提供商',\n type: 'select',\n description: '选择默认使用的搜索引擎提供商',\n options: [\n { value: 'auto', label: '自动选择', description: '根据可用性自动选择最佳搜索引擎' },\n { value: 'tavily', label: 'Tavily', description: '专为 AI 优化的搜索引擎,提供高质量结构化结果' },\n { value: 'serper', label: 'Serper', description: 'Google 搜索 API,提供全面的搜索结果' },\n ],\n defaultValue: 'auto',\n required: false,\n },\n enableFallback: {\n name: '启用备用提供商',\n type: 'boolean',\n description: '当主提供商失败时自动切换到备用提供商',\n defaultValue: true,\n required: false,\n },\n tavilyApiKey: {\n name: 'Tavily API 密钥',\n type: 'string',\n description: '用于 Tavily 网络搜索服务的 API 密钥。可以在此直接设置,或通过环境变量 TAVILY_API_KEY 提供',\n envVar: 'TAVILY_API_KEY',\n required: false,\n },\n serperApiKey: {\n name: 'Serper API 密钥',\n type: 'string',\n description: '用于 Serper (Google 搜索) 服务的 API 密钥。可以在此直接设置,或通过环境变量 SERPER_API_KEY 提供',\n envVar: 'SERPER_API_KEY',\n required: false,\n },\n defaultLanguage: {\n name: '默认语言',\n type: 'select',\n description: '搜索结果的默认语言偏好',\n options: [\n { value: 'auto', label: '自动检测' },\n { value: 'zh-CN', label: '简体中文' },\n { value: 'zh-TW', label: '繁体中文' },\n { value: 'en', label: 'English' },\n { value: 'ja', label: '日本語' },\n { value: 'ko', label: '한국어' },\n ],\n defaultValue: 'auto',\n required: false,\n },\n defaultCountry: {\n name: '默认地区',\n type: 'select',\n description: '搜索结果的默认地区偏好',\n options: [\n { value: 'auto', label: '自动选择' },\n { value: 'CN', label: '中国大陆' },\n { value: 'TW', label: '中国台湾省' },\n { value: 'HK', label: '中国香港' },\n { value: 'US', label: '美国' },\n { value: 'JP', label: '日本' },\n { value: 'KR', label: '韩国' },\n ],\n defaultValue: 'auto',\n required: false,\n },\n defaultSearchType: {\n name: '默认搜索类型',\n type: 'select',\n description: '默认的搜索类型',\n options: [\n { value: 'general', label: '常规搜索' },\n { value: 'news', label: '新闻搜索' },\n ],\n defaultValue: 'general',\n required: false,\n },\n defaultNewsDays: {\n name: '新闻时间范围',\n type: 'number',\n description: '新闻搜索的默认时间范围(天数)',\n defaultValue: 7,\n required: false,\n },\n includeDomains: {\n name: '优先域名',\n type: 'array',\n description: '优先显示这些域名的搜索结果(例如:[\"baidu.com\", \"zhihu.com\"])',\n defaultValue: [],\n required: false,\n },\n excludeDomains: {\n name: '排除域名',\n type: 'array',\n description: '从搜索结果中排除这些域名',\n defaultValue: [],\n required: false,\n },\n };\n }\n\n getConfig(): ToolConfig {\n return {\n ...this.config,\n ...this.configManager.getStatus(),\n };\n }\n\n setConfig(config: ToolConfig): void {\n this.config = config;\n\n // Update config manager with new settings\n this.configManager = new SearchConfigManager({\n tavilyApiKey: config.tavilyApiKey,\n serperApiKey: config.serperApiKey,\n defaultProvider: config.defaultProvider,\n enableFallback: config.enableFallback,\n });\n }\n\n isAvailable(): boolean {\n return this.configManager.isSearchAvailable();\n }\n\n @ToolFunction({\n description: 'Search the web for information using configured search providers (Tavily or Serper). Returns relevant web pages with titles, URLs, and snippets. For news queries, automatically prioritizes recent articles and news sources. Supports multiple languages and locales.',\n input: z.object({\n query: z.string().min(1).describe('The search query or keywords to search for'),\n maxResults: z.number().min(1).max(20).optional().default(10).describe('Maximum number of search results to return (1-20, default: 10)'),\n searchType: z.enum(['general', 'news']).optional().default('general').describe('Type of search: \"general\" for all web results, \"news\" for recent news articles only'),\n days: z.number().min(1).max(365).optional().describe('For news searches, limit results to articles from the last N days (default: 7 for news, unlimited for general)'),\n language: z.string().optional().describe('Language code for results (e.g., \"en\" for English, \"zh\" for Chinese, \"zh-CN\" for Simplified Chinese, \"zh-TW\" for Traditional Chinese, \"ja\" for Japanese, \"ko\" for Korean). Defaults to auto-detect from query.'),\n country: z.string().optional().describe('Country code for localized results (e.g., \"US\", \"CN\", \"JP\", \"KR\", \"TW\", \"HK\"). Helps prioritize region-specific sources.'),\n includeDomains: z.array(z.string()).optional().describe('List of domains to prioritize in results (e.g., [\"baidu.com\", \"zhihu.com\"] for Chinese sources)'),\n excludeDomains: z.array(z.string()).optional().describe('List of domains to exclude from results'),\n })\n } as any)\n async search_web(input: {\n query: string;\n maxResults?: number;\n searchType?: 'general' | 'news';\n days?: number;\n language?: string;\n country?: string;\n includeDomains?: string[];\n excludeDomains?: string[];\n }): Promise<SearchResponse> {\n const provider = this.configManager.selectProvider();\n\n if (!provider) {\n throw new Error('No search provider available. Please configure TAVILY_API_KEY or SERPER_API_KEY.');\n }\n\n // Apply config defaults for missing parameters\n const effectiveInput = {\n ...input,\n searchType: input.searchType || (this.config.defaultSearchType as 'general' | 'news') || 'general',\n days: input.days || (input.searchType === 'news' || this.config.defaultSearchType === 'news' ? (this.config.defaultNewsDays || 7) : undefined),\n language: input.language || (this.config.defaultLanguage !== 'auto' ? this.config.defaultLanguage : undefined),\n country: input.country || (this.config.defaultCountry !== 'auto' ? this.config.defaultCountry : undefined),\n includeDomains: input.includeDomains || this.config.includeDomains || [],\n excludeDomains: input.excludeDomains || this.config.excludeDomains || [],\n };\n\n try {\n return await this.searchWithProvider(provider, effectiveInput);\n } catch (error) {\n // Try fallback if available\n const fallback = this.configManager.getFallbackProvider(provider);\n if (fallback) {\n console.warn(`Primary search provider ${provider} failed, trying fallback provider ${fallback}...`);\n return await this.searchWithProvider(fallback, effectiveInput);\n }\n throw error;\n }\n }\n\n private async searchWithProvider(\n provider: SearchProvider,\n input: {\n query: string;\n maxResults?: number;\n searchType?: 'general' | 'news';\n days?: number;\n language?: string;\n country?: string;\n includeDomains?: string[];\n excludeDomains?: string[];\n }\n ): Promise<SearchResponse> {\n const apiKey = this.configManager.getApiKey(provider);\n if (!apiKey) {\n throw new Error(`${provider} API key is not configured`);\n }\n\n const endpoint = SEARCH_PROVIDERS[provider].endpoint;\n\n switch (provider) {\n case 'tavily':\n return await this.searchWithTavily(endpoint, apiKey, input);\n case 'serper':\n return await this.searchWithSerper(endpoint, apiKey, input);\n default:\n throw new Error(`Search provider ${provider} is not implemented`);\n }\n }\n\n private async searchWithTavily(\n endpoint: string,\n apiKey: string,\n input: {\n query: string;\n maxResults?: number;\n searchType?: 'general' | 'news';\n days?: number;\n language?: string;\n country?: string;\n includeDomains?: string[];\n excludeDomains?: string[];\n }\n ): Promise<SearchResponse> {\n const isNews = input.searchType === 'news';\n const days = input.days || (isNews ? 7 : undefined);\n\n const requestBody: any = {\n query: input.query,\n search_depth: 'advanced',\n max_results: input.maxResults || 10,\n include_raw_content: false,\n include_answer: false,\n };\n\n // Add news-specific parameters\n if (isNews) {\n requestBody.topic = 'news';\n }\n\n // Add language/locale parameters\n // Tavily doesn't have direct language parameter, but we can influence results via include_domains\n const defaultNewsDomains = isNews ? [\n 'reuters.com', 'apnews.com', 'bbc.com', 'cnn.com',\n 'theguardian.com', 'nytimes.com', 'washingtonpost.com',\n ] : [];\n\n // Add language-specific domains\n const languageBasedDomains: string[] = [];\n if (input.language?.startsWith('zh') || input.country === 'CN' || input.country === 'TW' || input.country === 'HK') {\n languageBasedDomains.push(\n 'sina.com.cn', '163.com', 'qq.com', 'sohu.com', 'ifeng.com',\n 'people.com.cn', 'xinhuanet.com', 'chinanews.com', 'thepaper.cn',\n 'caixin.com', 'guancha.cn', 'huanqiu.com', 'chinadaily.com.cn'\n );\n } else if (input.language === 'ja' || input.country === 'JP') {\n languageBasedDomains.push(\n 'nhk.or.jp', 'asahi.com', 'nikkei.com', 'yomiuri.co.jp',\n 'mainichi.jp', 'sankei.com', 'jiji.com'\n );\n } else if (input.language === 'ko' || input.country === 'KR') {\n languageBasedDomains.push(\n 'chosun.com', 'donga.com', 'joins.com', 'hani.co.kr',\n 'khan.co.kr', 'yna.co.kr'\n );\n }\n\n // Combine all domain preferences\n const allIncludeDomains = [\n ...(input.includeDomains || []),\n ...languageBasedDomains,\n ...(languageBasedDomains.length === 0 ? defaultNewsDomains : []),\n ];\n\n if (allIncludeDomains.length > 0) {\n requestBody.include_domains = allIncludeDomains;\n }\n\n // Add exclude domains if specified\n if (input.excludeDomains && input.excludeDomains.length > 0) {\n requestBody.exclude_domains = input.excludeDomains;\n }\n\n // Add time filter if specified\n if (days) {\n requestBody.days = days;\n }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': apiKey,\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n throw new Error(`Tavily search failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n return {\n provider: 'tavily',\n query: input.query,\n results: data.results.map((r: any) => {\n // Extract domain from URL for favicon\n let domain = '';\n let favicon = '';\n try {\n const urlObj = new URL(r.url);\n domain = urlObj.hostname.replace('www.', '');\n // Use Google's favicon service\n favicon = `https://www.google.com/s2/favicons?domain=${domain}&sz=64`;\n } catch {\n // Invalid URL, skip favicon\n }\n\n return {\n title: r.title,\n url: r.url,\n snippet: r.content,\n description: r.content, // Use content as description for consistency\n content: r.content, // Map to content field\n score: r.score,\n publishedDate: r.published_date,\n domain,\n favicon,\n };\n }),\n totalResults: data.results.length,\n };\n }\n\n private async searchWithSerper(\n endpoint: string,\n apiKey: string,\n input: {\n query: string;\n maxResults?: number;\n searchType?: 'general' | 'news';\n days?: number;\n language?: string;\n country?: string;\n includeDomains?: string[];\n excludeDomains?: string[];\n }\n ): Promise<SearchResponse> {\n const isNews = input.searchType === 'news';\n const days = input.days || (isNews ? 7 : undefined);\n\n // Use news endpoint for news searches\n const searchEndpoint = isNews ? 'https://google.serper.dev/news' : endpoint;\n\n const requestBody: any = {\n q: input.query,\n num: input.maxResults || 10,\n };\n\n // Add language parameter (Serper native support)\n // Serper uses hl (host language) parameter\n if (input.language) {\n // Convert language codes to Serper format\n let langCode = input.language;\n if (langCode === 'zh') langCode = 'zh-CN'; // Default Chinese to Simplified\n requestBody.hl = langCode;\n }\n\n // Add country/location parameter (Serper native support)\n // Serper uses gl (geolocation) parameter\n if (input.country) {\n requestBody.gl = input.country.toLowerCase();\n }\n\n // Add domain filters\n if (input.includeDomains && input.includeDomains.length > 0) {\n // Serper doesn't have include_domains, but we can modify the query\n const siteFilters = input.includeDomains.map(d => `site:${d}`).join(' OR ');\n requestBody.q = `${input.query} (${siteFilters})`;\n }\n\n if (input.excludeDomains && input.excludeDomains.length > 0) {\n // Add exclude site filters to query\n const excludeFilters = input.excludeDomains.map(d => `-site:${d}`).join(' ');\n requestBody.q = `${requestBody.q} ${excludeFilters}`;\n }\n\n // Add time range for news\n if (isNews && days) {\n // Serper uses tbs parameter for time filtering\n // qdr:d = past day, qdr:w = past week, qdr:m = past month, qdr:y = past year\n if (days <= 1) {\n requestBody.tbs = 'qdr:d';\n } else if (days <= 7) {\n requestBody.tbs = 'qdr:w';\n } else if (days <= 30) {\n requestBody.tbs = 'qdr:m';\n } else {\n requestBody.tbs = 'qdr:y';\n }\n }\n\n const response = await fetch(searchEndpoint, {\n method: 'POST',\n headers: {\n 'X-API-KEY': apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n throw new Error(`Serper search failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // News results are in data.news array, regular results in data.organic\n const resultsArray = isNews ? (data.news || []) : (data.organic || []);\n\n return {\n provider: 'serper',\n query: input.query,\n results: resultsArray.map((r: any) => {\n // Extract domain from URL for favicon\n let domain = '';\n let favicon = '';\n try {\n const urlObj = new URL(r.link);\n domain = urlObj.hostname.replace('www.', '');\n // Use Google's favicon service\n favicon = `https://www.google.com/s2/favicons?domain=${domain}&sz=64`;\n } catch {\n // Invalid URL, skip favicon\n }\n\n return {\n title: r.title,\n url: r.link,\n snippet: r.snippet,\n description: r.snippet, // Use snippet as description for consistency\n content: r.snippet, // Also map to content for fallback\n publishedDate: r.date,\n domain,\n favicon,\n };\n }),\n totalResults: data.searchInformation?.totalResults,\n };\n }\n}","/**\n * WebTool - Simplified version using external services (Firecrawl/Jina)\n */\n\nimport { z } from 'zod';\nimport { Tool, ToolFunction, ToolMetadata, ToolConfig, ConfigSchema } from './base';\n\nexport class WebTool extends Tool {\n private config: ToolConfig = {\n jinaApiKey: null,\n firecrawlApiKey: null,\n defaultProvider: 'firecrawl', // firecrawl or jina\n timeout: 30000,\n maxContentLength: 100000,\n followRedirects: true,\n userAgent: 'Mozilla/5.0 (compatible; ViberBot/1.0)',\n enableJavaScript: false, // for providers that support it\n };\n\n getMetadata(): ToolMetadata {\n const jinaApiKey = this.getJinaApiKey();\n const firecrawlApiKey = this.getFirecrawlApiKey();\n\n let availableProviders: string[] = [];\n if (jinaApiKey) availableProviders.push('Jina');\n if (firecrawlApiKey) availableProviders.push('Firecrawl');\n\n return {\n id: 'web',\n name: 'Web Tools',\n description: availableProviders.length > 0\n ? `Extract web content, check URL availability, and crawl websites (Providers: ${availableProviders.join(', ')})`\n : 'Web content extraction, URL checking, and website crawling (requires API configuration)',\n category: 'web',\n };\n }\n\n getConfigSchema(): ConfigSchema {\n return {\n jinaApiKey: {\n name: 'Jina API Key',\n type: 'string',\n description: 'Jina API key for advanced content extraction',\n envVar: 'JINA_API_KEY',\n required: false,\n },\n firecrawlApiKey: {\n name: 'Firecrawl API Key',\n type: 'string',\n description: 'Firecrawl API key for JavaScript rendering',\n envVar: 'FIRECRAWL_API_KEY',\n required: false,\n },\n defaultProvider: {\n name: 'Default Provider',\n type: 'select',\n description: 'Default content extraction provider',\n options: ['firecrawl', 'jina'],\n defaultValue: 'firecrawl',\n required: false,\n },\n timeout: {\n name: 'Request Timeout',\n type: 'number',\n description: 'Request timeout in milliseconds',\n defaultValue: 30000,\n min: 1000,\n max: 120000,\n required: false,\n },\n maxContentLength: {\n name: 'Max Content Length',\n type: 'number',\n description: 'Maximum content length to extract (in characters)',\n defaultValue: 500000,\n required: false,\n },\n userAgent: {\n name: 'User Agent',\n type: 'string',\n description: 'Custom user agent string for HTTP requests',\n required: false,\n },\n enableJavaScript: {\n name: 'Enable JavaScript',\n type: 'boolean',\n description: 'Enable JavaScript rendering for dynamic content (requires compatible provider)',\n defaultValue: false,\n required: false,\n },\n };\n }\n\n getConfig(): ToolConfig {\n return this.config;\n }\n\n setConfig(config: ToolConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n isAvailable(): boolean {\n // Tool is available if at least one provider is configured\n return !!(this.getJinaApiKey() || this.getFirecrawlApiKey());\n }\n\n private getJinaApiKey(): string | null {\n return this.config.jinaApiKey || process.env.JINA_API_KEY || null;\n }\n\n private getFirecrawlApiKey(): string | null {\n return this.config.firecrawlApiKey || process.env.FIRECRAWL_API_KEY || null;\n }\n\n private get providers() {\n return {\n jina: {\n apiKey: this.getJinaApiKey(),\n endpoint: 'https://r.jina.ai',\n },\n firecrawl: {\n apiKey: this.getFirecrawlApiKey(),\n endpoint: 'https://api.firecrawl.dev/v0',\n },\n };\n }\n\n @ToolFunction({\n description: 'Extract and parse web page content into structured formats (markdown, text, HTML). Supports JavaScript-rendered pages and can capture metadata, links, and images. Uses Firecrawl or Jina services for reliable extraction.',\n input: z.object({\n url: z.string().url().describe('The URL to extract content from'),\n provider: z.enum(['jina', 'firecrawl']).optional().describe('Extraction provider to use (auto-selects if not specified)'),\n format: z.enum(['markdown', 'text', 'html', 'all']).optional().default('markdown').describe('Output format for the extracted content'),\n includeMetadata: z.boolean().optional().default(true).describe('Include page metadata (title, description, author, etc.)'),\n includeLinks: z.boolean().optional().default(false).describe('Extract and include all links found on the page'),\n includeImages: z.boolean().optional().default(false).describe('Extract and include all images found on the page'),\n waitForSelector: z.string().optional().describe('CSS selector to wait for before extraction (for dynamic content)'),\n screenshot: z.boolean().optional().default(false).describe('Capture a screenshot of the page (Firecrawl only)'),\n maxLength: z.number().optional().describe('Maximum content length in characters (truncates if exceeded)'),\n timeout: z.number().optional().default(30000).describe('Maximum time to wait for page load in milliseconds'),\n })\n })\n async fetch_webpage(input: {\n url: string;\n provider?: 'jina' | 'firecrawl';\n format?: 'markdown' | 'text' | 'html' | 'all';\n includeMetadata?: boolean;\n includeLinks?: boolean;\n includeImages?: boolean;\n waitForSelector?: string;\n screenshot?: boolean;\n maxLength?: number;\n timeout?: number;\n }) {\n // Auto-select provider if not specified\n const provider = input.provider || this.selectProvider();\n\n if (!provider) {\n throw new Error('No web extraction provider configured. Please configure Firecrawl or Jina API key.');\n }\n\n switch (provider) {\n case 'jina':\n return await this.extractWithJina(input);\n case 'firecrawl':\n return await this.extractWithFirecrawl(input);\n default:\n throw new Error(`Unknown provider: ${provider}`);\n }\n }\n\n @ToolFunction({\n description: 'Crawl a website to extract content from multiple pages. Follows links up to a specified depth and returns structured content from all discovered pages. Useful for documentation sites, blogs, or comprehensive site analysis.',\n input: z.object({\n url: z.string().url().describe('The starting URL for the crawl'),\n maxPages: z.number().min(1).max(100).optional().default(10).describe('Maximum number of pages to crawl (1-100)'),\n maxDepth: z.number().min(1).max(5).optional().default(2).describe('Maximum depth to follow links from the starting page (1-5)'),\n includePattern: z.string().optional().describe('Regex pattern - only crawl URLs matching this pattern'),\n excludePattern: z.string().optional().describe('Regex pattern - skip URLs matching this pattern'),\n format: z.enum(['markdown', 'text', 'html']).optional().default('markdown').describe('Output format for extracted content'),\n })\n })\n async crawl_website(input: {\n url: string;\n maxPages?: number;\n maxDepth?: number;\n includePattern?: string;\n excludePattern?: string;\n format?: 'markdown' | 'text' | 'html';\n }) {\n if (!this.providers.firecrawl.apiKey) {\n throw new Error('Web crawling requires Firecrawl API key to be configured');\n }\n\n // Start crawl job\n const startResponse = await fetch(`${this.providers.firecrawl.endpoint}/crawl`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.providers.firecrawl.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n url: input.url,\n crawlerOptions: {\n maxPages: input.maxPages || 10,\n maxDepth: input.maxDepth || 2,\n includes: input.includePattern ? [input.includePattern] : undefined,\n excludes: input.excludePattern ? [input.excludePattern] : undefined,\n },\n pageOptions: {\n onlyMainContent: true,\n },\n }),\n });\n\n if (!startResponse.ok) {\n const error = await startResponse.text();\n throw new Error(`Failed to start crawl: ${error}`);\n }\n\n const { jobId } = await startResponse.json();\n\n // Poll for results\n let attempts = 0;\n const maxAttempts = 60; // 5 minutes with 5 second intervals\n\n while (attempts < maxAttempts) {\n await new Promise(resolve => setTimeout(resolve, 5000)); // Wait 5 seconds\n\n const statusResponse = await fetch(`${this.providers.firecrawl.endpoint}/crawl/status/${jobId}`, {\n headers: {\n 'Authorization': `Bearer ${this.providers.firecrawl.apiKey}`,\n },\n });\n\n if (!statusResponse.ok) {\n throw new Error('Failed to check crawl status');\n }\n\n const status = await statusResponse.json();\n\n if (status.status === 'completed') {\n return {\n url: input.url,\n pages: status.data,\n totalPages: status.total,\n provider: 'firecrawl',\n crawledAt: new Date().toISOString(),\n };\n } else if (status.status === 'failed') {\n throw new Error(`Crawl failed: ${status.error}`);\n }\n\n attempts++;\n }\n\n throw new Error('Crawl timed out after 5 minutes');\n }\n\n @ToolFunction({\n description: 'Check if a URL is accessible and retrieve basic information about the resource. Returns HTTP status, content type, size, and last modified date without downloading the full content.',\n input: z.object({\n url: z.string().url().describe('The URL to check for accessibility'),\n timeout: z.number().optional().default(5000).describe('Maximum time to wait for response in milliseconds'),\n })\n })\n async check_url(input: { url: string; timeout?: number }) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), input.timeout || 5000);\n\n try {\n const response = await fetch(input.url, {\n method: 'HEAD',\n headers: {\n 'User-Agent': this.config.userAgent || 'Mozilla/5.0 (compatible; ViberBot/1.0)',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n return {\n url: input.url,\n accessible: response.ok,\n statusCode: response.status,\n statusText: response.statusText,\n contentType: response.headers.get('content-type'),\n contentLength: response.headers.get('content-length'),\n lastModified: response.headers.get('last-modified'),\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n return {\n url: input.url,\n accessible: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n private selectProvider(): string | null {\n if (this.providers.firecrawl.apiKey) return 'firecrawl';\n if (this.providers.jina.apiKey) return 'jina';\n return null;\n }\n\n private async extractWithJina(input: any) {\n const provider = this.providers.jina;\n\n if (!provider.apiKey) {\n throw new Error('Jina API key not configured');\n }\n\n // Jina uses URL-based API\n const jinaUrl = `${provider.endpoint}/${input.url}`;\n\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n 'Authorization': `Bearer ${provider.apiKey}`,\n };\n\n // Add format preferences\n if (input.format === 'markdown') {\n headers['X-Return-Format'] = 'markdown';\n } else if (input.format === 'text') {\n headers['X-Return-Format'] = 'text';\n }\n\n const response = await fetch(jinaUrl, {\n headers,\n signal: AbortSignal.timeout(input.timeout || 30000),\n });\n\n if (!response.ok) {\n throw new Error(`Jina extraction failed: ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type');\n let result: any;\n\n if (contentType?.includes('application/json')) {\n result = await response.json();\n } else {\n const text = await response.text();\n result = {\n content: text,\n format: input.format || 'markdown',\n };\n }\n\n // Apply max length if specified\n let content = result.content || result.text || result.markdown;\n if (input.maxLength && content && content.length > input.maxLength) {\n content = content.substring(0, input.maxLength) + '...';\n }\n\n return {\n url: input.url,\n title: result.title,\n content,\n markdown: result.markdown,\n text: result.text,\n html: result.html,\n metadata: result.metadata ? {\n description: result.metadata.description,\n author: result.metadata.author,\n publishedDate: result.metadata.publishedDate,\n keywords: result.metadata.keywords,\n language: result.metadata.language,\n image: result.metadata.ogImage || result.metadata.image,\n } : undefined,\n links: input.includeLinks ? result.links : undefined,\n images: input.includeImages ? result.images : undefined,\n provider: 'jina',\n extractedAt: new Date().toISOString(),\n };\n }\n\n private async extractWithFirecrawl(input: any) {\n const provider = this.providers.firecrawl;\n if (!provider.apiKey) {\n throw new Error('Firecrawl API key not configured');\n }\n\n const response = await fetch(`${provider.endpoint}/scrape`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${provider.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n url: input.url,\n pageOptions: {\n onlyMainContent: true,\n includeHtml: input.format === 'html' || input.format === 'all',\n screenshot: input.screenshot,\n waitFor: input.waitForSelector ? parseInt(input.waitForSelector) : undefined,\n },\n timeout: input.timeout,\n }),\n signal: AbortSignal.timeout(input.timeout || 30000),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Firecrawl extraction failed: ${error}`);\n }\n\n const data = await response.json();\n\n if (!data.success) {\n throw new Error(`Firecrawl extraction failed: ${data.error}`);\n }\n\n const result = data.data;\n\n // Apply max length if specified\n let content = result.markdown || result.content;\n if (input.maxLength && content && content.length > input.maxLength) {\n content = content.substring(0, input.maxLength) + '...';\n }\n\n return {\n url: input.url,\n title: result.metadata?.title,\n content,\n markdown: result.markdown,\n text: result.content,\n html: result.html,\n metadata: {\n description: result.metadata?.description,\n author: result.metadata?.author,\n publishedDate: result.metadata?.publishedTime,\n modifiedDate: result.metadata?.modifiedTime,\n keywords: result.metadata?.keywords?.split(',').map((k: string) => k.trim()),\n language: result.metadata?.language,\n image: result.metadata?.ogImage,\n favicon: result.metadata?.favicon,\n },\n links: input.includeLinks ? result.links : undefined,\n images: input.includeImages ? result.images : undefined,\n screenshot: input.screenshot ? result.screenshot : undefined,\n provider: 'firecrawl',\n extractedAt: new Date().toISOString(),\n };\n }\n}","import { z } from \"zod\";\nimport WebSocket from \"ws\";\nimport { Tool, ToolFunction, ToolMetadata, ToolConfig, ConfigSchema } from \"./base\";\n\n// --- BrowserCDP Implementation ---\n\nexport interface CDPTarget {\n id: string;\n type: string;\n title: string;\n url: string;\n webSocketDebuggerUrl?: string;\n}\n\nexport interface BrowserCDPConfig {\n host?: string;\n port?: number;\n}\n\nexport class BrowserCDP {\n private host: string;\n private port: number;\n private messageId = 0;\n\n constructor(config: BrowserCDPConfig = {}) {\n this.host = config.host || \"localhost\";\n this.port = config.port || 9222;\n }\n\n /**\n * List all available targets (pages, iframes, etc.)\n */\n async listTargets(): Promise<CDPTarget[]> {\n const res = await fetch(`http://${this.host}:${this.port}/json`);\n if (!res.ok) {\n throw new Error(`CDP not available at ${this.host}:${this.port}`);\n }\n return await res.json();\n }\n\n /**\n * Find a target by predicate\n */\n async findTarget(predicate: (t: CDPTarget) => boolean): Promise<CDPTarget | undefined> {\n const targets = await this.listTargets();\n return targets.find(predicate);\n }\n\n /**\n * Execute (evaluate) JavaScript in a specific target\n */\n async evaluate<T = any>(\n target: CDPTarget | string,\n expression: string,\n awaitPromise = false\n ): Promise<T> {\n const wsUrl = typeof target === \"string\" ? target : target.webSocketDebuggerUrl;\n if (!wsUrl) throw new Error(\"Target has no WebSocket URL\");\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl);\n const id = ++this.messageId;\n\n const timeout = setTimeout(() => {\n ws.close();\n reject(new Error(\"CDP evaluation timeout\"));\n }, 10000);\n\n ws.on(\"open\", () => {\n ws.send(JSON.stringify({\n id,\n method: \"Runtime.evaluate\",\n params: {\n expression,\n returnByValue: true,\n awaitPromise\n }\n }));\n });\n\n ws.on(\"message\", (data: string) => {\n try {\n const msg = JSON.parse(data);\n if (msg.id === id) {\n clearTimeout(timeout);\n ws.close();\n\n if (msg.error) {\n reject(new Error(msg.error.message));\n } else if (msg.result?.exceptionDetails) {\n reject(new Error(`Runtime exception: ${msg.result.exceptionDetails.text}`));\n } else {\n resolve(msg.result?.result?.value);\n }\n }\n } catch (err) {\n clearTimeout(timeout);\n ws.close();\n reject(err);\n }\n });\n\n ws.on(\"error\", (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n }\n /**\n * Check if text exists in the page body\n */\n async hasText(target: CDPTarget | string, text: string): Promise<boolean> {\n return this.evaluate<boolean>(target, `document.body.innerText.includes(\"${text}\")`);\n }\n\n /**\n * Click an element containing specific text\n */\n async clickOnText(target: CDPTarget | string, text: string, tag: string = \"button\"): Promise<boolean> {\n return this.evaluate<boolean>(target, `\n (function() {\n // Helper to find element by text\n const elements = Array.from(document.querySelectorAll(\"${tag}\"));\n const el = elements.find(e => e.textContent.includes(\"${text}\"));\n if (el) {\n el.click();\n return true;\n }\n return false;\n })()\n `);\n }\n\n /**\n * Get a simplified DOM snapshot (useful for LLM context)\n */\n async getDomSnapshot(target: CDPTarget | string): Promise<string> {\n return this.evaluate<string>(target, `\n (function() {\n // Simple DOM serializer to text\n return document.body.innerText;\n })()\n `);\n }\n}\n\n// --- BrowserTool Wrapper ---\n\nexport class BrowserTool extends Tool {\n private cdp: BrowserCDP | null = null;\n\n getMetadata(): ToolMetadata {\n return {\n id: \"browser\",\n name: \"Browser Automation\",\n description: \"Control a web browser using Chrome DevTools Protocol (CDP)\",\n category: \"browser\",\n };\n }\n\n isAvailable(): boolean {\n return true; // Or check if Chrome is running?\n }\n\n private async getCdp(): Promise<BrowserCDP> {\n if (!this.cdp) {\n this.cdp = new BrowserCDP();\n }\n return this.cdp;\n }\n\n @ToolFunction({\n description: \"Launch or connect to a browser instance\",\n input: z.object({\n headless: z.boolean().optional().default(false),\n })\n })\n async launch_browser(input: { headless?: boolean }) {\n // This might be a no-op if we assume connecting to existing\n return { success: true, message: \"Browser connection managed by CDP\" };\n }\n\n @ToolFunction({\n description: \"List all open browser pages/targets\",\n input: z.object({})\n })\n async list_targets() {\n const cdp = await this.getCdp();\n return await cdp.listTargets();\n }\n\n @ToolFunction({\n description: \"Find a browser page that contains specific text\",\n input: z.object({\n text: z.string().describe(\"Text to search for\"),\n })\n })\n async find_page_with_text(input: { text: string }) {\n const cdp = await this.getCdp();\n const targets = await cdp.listTargets();\n const pages = targets.filter((t: CDPTarget) => t.type === 'page');\n\n for (const page of pages) {\n const hasIt = await cdp.hasText(page, input.text);\n if (hasIt) return { found: true, targetId: page.id, title: page.title, url: page.url };\n }\n return { found: false };\n }\n\n @ToolFunction({\n description: \"Click on an element containing specific text\",\n input: z.object({\n text: z.string().describe(\"Text of the element to click\"),\n targetId: z.string().optional().describe(\"Specific page ID to target (optional)\"),\n })\n })\n async click_element(input: { text: string, targetId?: string }) {\n const cdp = await this.getCdp();\n let page: CDPTarget | undefined; // Initialize page as CDPTarget or undefined\n\n if (input.targetId) {\n // If targetId is provided, we need to find the full CDPTarget object\n // as the evaluate method requires webSocketDebuggerUrl\n const targets = await cdp.listTargets();\n page = targets.find((t: CDPTarget) => t.id === input.targetId);\n } else {\n const targets = await cdp.listTargets();\n page = targets.find((t: CDPTarget) => t.type === 'page' && !t.url.startsWith('chrome'));\n }\n\n if (!page) throw new Error(\"No active page found or targetId not found\");\n\n await cdp.clickOnText(page, input.text);\n return { success: true, message: `Clicked element with text \"${input.text}\"` };\n }\n}\n","import { z } from \"zod\";\nimport { Tool, ToolFunction, ToolMetadata, ToolConfig, ConfigSchema } from \"./base\";\nimport { exec } from \"child_process\";\nimport { promisify } from \"util\";\n\n// --- AppleScript Helper ---\n\nconst execAsync = promisify(exec);\n\nasync function runAppleScript(script: string): Promise<string> {\n const command = `osascript -e '${script}'`;\n try {\n const { stdout } = await execAsync(command);\n return stdout.trim();\n } catch (error: any) {\n throw new Error(`AppleScript failed: ${error.message}`);\n }\n}\n\n// --- DesktopTool Wrapper ---\n\nexport class DesktopTool extends Tool {\n getMetadata(): ToolMetadata {\n return {\n id: \"desktop\",\n name: \"Desktop Automation\",\n description: \"Control desktop applications using AppleScript\",\n category: \"system\",\n };\n }\n\n isAvailable(): boolean {\n return process.platform === \"darwin\";\n }\n\n @ToolFunction({\n description: \"Open an application by name\",\n input: z.object({\n appName: z.string().describe(\"Name of the application\"),\n })\n })\n async open_app(input: { appName: string }) {\n await runAppleScript(`tell application \"${input.appName}\" to activate`);\n return { success: true, message: `Opened/Activated ${input.appName}` };\n }\n\n @ToolFunction({\n description: \"Bring an application to the front\",\n input: z.object({\n appName: z.string().describe(\"Name of the application\"),\n })\n })\n async activate_app(input: { appName: string }) {\n await runAppleScript(`tell application \"${input.appName}\" to activate`);\n return { success: true, message: `Activated ${input.appName}` };\n }\n\n @ToolFunction({\n description: \"Type text into the currently focused window\",\n input: z.object({\n text: z.string().describe(\"Text to type\"),\n })\n })\n async type_text(input: { text: string }) {\n const safeText = input.text.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n await runAppleScript(`tell application \"System Events\" to keystroke \"${safeText}\"`);\n return { success: true, message: `Typed \"${input.text}\"` };\n }\n}\n","/**\n * Tools Registry\n *\n * Dynamic tool discovery and management system.\n * Tools are discovered from tool classes using decorators.\n */\n\nimport { CoreTool } from \"../core/tool\";\nimport { Tool } from \"./base\";\n\n// Import all tools\nimport { FileTool } from \"./file\";\nimport { SearchTool } from \"./search\";\nimport { WebTool } from \"./web\";\nimport { BrowserTool } from \"./browser\";\nimport { DesktopTool } from \"./desktop\";\n\nexport interface ToolInfo {\n id: string;\n name: string;\n description: string;\n category: string;\n icon?: string; // Icon name (Lucide icon name, Icons component key, or URL)\n tags?: string[]; // Tags for categorization and filtering\n features?: string[]; // List of features the tool provides\n tools: string[]; // Keep for backward compatibility\n functions?: any[]; // New field for function names/objects\n functionDetails?: Array<{\n name: string;\n description: string;\n parameters: any;\n }>; // Detailed function info\n configSchema?: any; // Configuration schema for the tool\n enabled?: boolean;\n}\n\n// Tool instances (created on demand)\nconst toolInstances = new Map<string, Tool>();\n\n// Available tool classes\nconst toolClasses = new Map<string, new () => Tool>([\n [\"file\", FileTool],\n [\"search\", SearchTool],\n [\"web\", WebTool],\n [\"browser\", BrowserTool],\n [\"desktop\", DesktopTool],\n]);\n\n/**\n * Load tool configuration through DataAdapter\n */\nasync function loadToolConfig(toolId: string): Promise<any> {\n try {\n const { getServerDataAdapter } = await import(\"../data/factory\");\n const adapter = getServerDataAdapter();\n\n // Get tool from adapter\n const tool = await adapter.getTool(toolId);\n return tool?.config || {};\n } catch (error) {\n console.error(`[loadToolConfig] Error loading config for ${toolId}:`, error);\n return {};\n }\n}\n\n/**\n * Get or create a tool instance\n */\nexport function getToolInstance(toolId: string): Tool | null {\n if (!toolInstances.has(toolId)) {\n const ToolClass = toolClasses.get(toolId);\n if (!ToolClass) return null;\n\n try {\n const instance = new ToolClass();\n\n // Load configuration from file if available\n // This is async but we handle it synchronously for now\n // In production, configuration should be loaded at startup\n loadToolConfig(toolId)\n .then((config) => {\n if (Object.keys(config).length > 0) {\n instance.setConfig(config);\n }\n })\n .catch((error) => {\n console.error(`[getToolInstance] Error loading config for ${toolId}:`, error);\n });\n\n // Check if tool is available\n if (!instance.isAvailable()) {\n console.warn(`[getToolInstance] Tool ${toolId} is not available`);\n return null;\n }\n\n toolInstances.set(toolId, instance);\n } catch (error) {\n console.warn(`[Tools] Failed to initialize tool ${toolId}:`, error);\n return null;\n }\n }\n return toolInstances.get(toolId) || null;\n}\n\n// Static function details for server-side rendering\nconst staticFunctionDetails = {\n file: [\n {\n name: \"createFile\",\n description:\n \"Create a new file or overwrite an existing file with the specified content. Creates parent directories if they don't exist.\",\n parameters: {},\n },\n {\n name: \"readFile\",\n description:\n \"Read the contents of a file from the file system. Returns the file content along with metadata like size and modification time.\",\n parameters: {},\n },\n {\n name: \"deleteFile\",\n description:\n \"Delete a file from the file system. This operation is irreversible. The file must exist or an error will be thrown.\",\n parameters: {},\n },\n {\n name: \"listFiles\",\n description:\n \"List all files in a directory with optional recursive traversal and pattern filtering. Returns an array of file paths.\",\n parameters: {},\n },\n {\n name: \"moveFile\",\n description:\n \"Move or rename a file from one location to another. Creates parent directories if needed. The source file will no longer exist after this operation.\",\n parameters: {},\n },\n {\n name: \"copyFile\",\n description:\n \"Copy a file from one location to another. Creates parent directories if needed. The source file remains unchanged.\",\n parameters: {},\n },\n {\n name: \"fileExists\",\n description:\n \"Check if a file or directory exists at the specified path. Returns existence status and file metadata if it exists.\",\n parameters: {},\n },\n ],\n search: [\n {\n name: \"search\",\n description:\n \"Search the web for information using configured search providers (Tavily or Serper). Returns relevant web pages with titles, URLs, and snippets.\",\n parameters: {},\n },\n ],\n web: [\n {\n name: \"fetchWebpage\",\n description:\n \"Extract and parse web page content into structured formats (markdown, text, HTML). Supports JavaScript-rendered pages and can capture metadata, links, and images. Uses Firecrawl or Jina services for reliable extraction.\",\n parameters: {},\n },\n {\n name: \"crawlWebsite\",\n description:\n \"Crawl a website to extract content from multiple pages. Follows links up to a specified depth and returns structured content from all discovered pages. Useful for documentation sites, blogs, or comprehensive site analysis.\",\n parameters: {},\n },\n {\n name: \"checkUrl\",\n description:\n \"Check if a URL is accessible and retrieve basic information about the resource. Returns HTTP status, content type, size, and last modified date without downloading the full content.\",\n parameters: {},\n },\n ],\n};\n\n/**\n * Get all tools info\n */\nexport function getToolProviders(): ToolInfo[] {\n // Check if we're in a server environment\n if (typeof window === \"undefined\") {\n // In server/edge runtime, some tools might not work due to Node.js dependencies\n // Return tool metadata without instantiation\n const tools: ToolInfo[] = [\n {\n id: \"file\",\n name: \"File System Tools\",\n description:\n \"Read, write, manage and manipulate files and directories in the local file system\",\n category: \"file\",\n icon: \"FolderOpen\",\n tags: [\"Files\", \"Storage\", \"Local\", \"System\", \"IO\"],\n tools: [\n \"createFile\",\n \"readFile\",\n \"deleteFile\",\n \"listFiles\",\n \"moveFile\",\n \"copyFile\",\n \"fileExists\",\n ],\n functions: [\n \"createFile\",\n \"readFile\",\n \"deleteFile\",\n \"listFiles\",\n \"moveFile\",\n \"copyFile\",\n \"fileExists\",\n ],\n functionDetails: staticFunctionDetails.file,\n configSchema: {\n basePath: {\n name: \"Base Path\",\n type: \"string\",\n description: \"Base directory for file operations\",\n defaultValue: process.cwd(),\n required: false,\n },\n allowAbsolutePaths: {\n name: \"Allow Absolute Paths\",\n type: \"boolean\",\n description:\n \"Allow operations on absolute paths outside the base directory\",\n defaultValue: false,\n required: false,\n },\n maxFileSize: {\n name: \"Max File Size\",\n type: \"number\",\n description: \"Maximum file size in bytes\",\n defaultValue: 10485760,\n required: false,\n },\n },\n enabled: true,\n },\n {\n id: \"search\",\n name: \"Web Search\",\n description:\n \"Search the web for current information using configured search providers\",\n category: \"search\",\n icon: \"Search\",\n tags: [\"Search\", \"Web\", \"Research\", \"Internet\", \"Information\"],\n tools: [\"search\"],\n functions: [\"search\"],\n functionDetails: staticFunctionDetails.search,\n configSchema: {\n defaultProvider: {\n name: \"默认搜索提供商\",\n type: \"select\",\n description: \"选择默认使用的搜索引擎提供商\",\n options: [\n { value: \"auto\", label: \"自动选择\", description: \"根据可用性自动选择最佳搜索引擎\" },\n { value: \"tavily\", label: \"Tavily\", description: \"专为 AI 优化的搜索引擎,提供高质量结构化结果\" },\n { value: \"serper\", label: \"Serper\", description: \"Google 搜索 API,提供全面的搜索结果\" },\n ],\n defaultValue: \"auto\",\n required: false,\n },\n enableFallback: {\n name: \"启用备用提供商\",\n type: \"boolean\",\n description: \"当主提供商失败时自动切换到备用提供商\",\n defaultValue: true,\n required: false,\n },\n tavilyApiKey: {\n name: \"Tavily API 密钥\",\n type: \"string\",\n description: \"用于 Tavily 网络搜索服务的 API 密钥。可以在此直接设置,或通过环境变量 TAVILY_API_KEY 提供\",\n envVar: \"TAVILY_API_KEY\",\n required: false,\n },\n serperApiKey: {\n name: \"Serper API 密钥\",\n type: \"string\",\n description: \"用于 Serper (Google 搜索) 服务的 API 密钥。可以在此直接设置,或通过环境变量 SERPER_API_KEY 提供\",\n envVar: \"SERPER_API_KEY\",\n required: false,\n },\n defaultLanguage: {\n name: \"默认语言\",\n type: \"select\",\n description: \"搜索结果的默认语言偏好\",\n options: [\n { value: \"auto\", label: \"自动检测\" },\n { value: \"zh-CN\", label: \"简体中文\" },\n { value: \"zh-TW\", label: \"繁体中文\" },\n { value: \"en\", label: \"English\" },\n { value: \"ja\", label: \"日本語\" },\n { value: \"ko\", label: \"한국어\" },\n ],\n defaultValue: \"auto\",\n required: false,\n },\n defaultCountry: {\n name: \"默认地区\",\n type: \"select\",\n description: \"搜索结果的默认地区偏好\",\n options: [\n { value: \"auto\", label: \"自动选择\" },\n { value: \"CN\", label: \"中国大陆\" },\n { value: \"TW\", label: \"中国台湾省\" },\n { value: \"HK\", label: \"中国香港\" },\n { value: \"US\", label: \"美国\" },\n { value: \"JP\", label: \"日本\" },\n { value: \"KR\", label: \"韩国\" },\n ],\n defaultValue: \"auto\",\n required: false,\n },\n defaultSearchType: {\n name: \"默认搜索类型\",\n type: \"select\",\n description: \"默认的搜索类型\",\n options: [\n { value: \"general\", label: \"常规搜索\" },\n { value: \"news\", label: \"新闻搜索\" },\n ],\n defaultValue: \"general\",\n required: false,\n },\n defaultNewsDays: {\n name: \"新闻时间范围\",\n type: \"number\",\n description: \"新闻搜索的默认时间范围(天数)\",\n defaultValue: 7,\n required: false,\n },\n includeDomains: {\n name: \"优先域名\",\n type: \"array\",\n description: \"优先显示这些域名的搜索结果(例如:[\\\"baidu.com\\\", \\\"zhihu.com\\\"])\",\n defaultValue: [],\n required: false,\n },\n excludeDomains: {\n name: \"排除域名\",\n type: \"array\",\n description: \"从搜索结果中排除这些域名\",\n defaultValue: [],\n required: false,\n },\n },\n enabled: true,\n },\n {\n id: \"web\",\n name: \"Web Tools\",\n description:\n \"Extract web content, check URL availability, and crawl websites\",\n category: \"web\",\n icon: \"Globe\",\n tags: [\"Web\", \"Extraction\", \"Crawling\", \"Content\", \"Scraping\"],\n tools: [\"fetchWebpage\", \"crawlWebsite\", \"checkUrl\"],\n functions: [\"fetchWebpage\", \"crawlWebsite\", \"checkUrl\"],\n functionDetails: staticFunctionDetails.web,\n configSchema: {\n firecrawlApiKey: {\n name: \"Firecrawl API Key\",\n type: \"password\",\n description: \"API key for Firecrawl web extraction service\",\n envVar: \"FIRECRAWL_API_KEY\",\n required: false,\n },\n jinaApiKey: {\n name: \"Jina API Key\",\n type: \"password\",\n description: \"API key for Jina web extraction service\",\n envVar: \"JINA_API_KEY\",\n required: false,\n },\n defaultProvider: {\n name: \"Default Provider\",\n type: \"select\",\n description: \"Preferred web extraction provider\",\n options: [\"firecrawl\", \"jina\"],\n defaultValue: \"firecrawl\",\n required: false,\n },\n },\n enabled: true,\n },\n ];\n return tools;\n }\n\n // Original client-side code\n const tools: ToolInfo[] = [];\n\n for (const [id, ToolClass] of toolClasses) {\n try {\n const instance = new ToolClass();\n const metadata = instance.getMetadata();\n\n // Only include if available\n if (instance.isAvailable()) {\n // Add tags based on tool ID\n const tags =\n id === \"file\"\n ? [\"Files\", \"Storage\", \"Local\", \"System\", \"IO\"]\n : id === \"search\"\n ? [\"Search\", \"Web\", \"Research\", \"Internet\", \"Information\"]\n : id === \"web\"\n ? [\"Web\", \"Extraction\", \"Crawling\", \"Content\", \"Scraping\"]\n : [];\n\n tools.push({\n ...metadata,\n tags,\n tools: instance.getToolNames(),\n functions: instance.getToolNames(),\n functionDetails: instance.getToolDetails(),\n configSchema: instance.getConfigSchema(),\n enabled: true,\n });\n }\n } catch (error) {\n console.warn(`[Tools] Failed to get metadata for tool ${id}:`, error);\n }\n }\n\n return tools;\n}\n\n/**\n * Get a specific tool info\n */\nexport function getToolProvider(toolId: string): ToolInfo | null {\n const ToolClass = toolClasses.get(toolId);\n if (!ToolClass) return null;\n\n try {\n const instance = new ToolClass();\n const metadata = instance.getMetadata();\n\n // Add tags based on tool ID\n const tags =\n toolId === \"file\"\n ? [\"Files\", \"Storage\", \"Local\", \"System\", \"IO\"]\n : toolId === \"search\"\n ? [\"Search\", \"Web\", \"Research\", \"Internet\", \"Information\"]\n : toolId === \"web\"\n ? [\"Web\", \"Extraction\", \"Crawling\", \"Content\", \"Scraping\"]\n : [];\n\n return {\n ...metadata,\n tags,\n tools: instance.getToolNames(),\n functions: instance.getToolNames(),\n functionDetails: instance.getToolDetails(),\n configSchema: instance.getConfigSchema(),\n enabled: instance.isAvailable(),\n };\n } catch (error) {\n console.warn(`[Tools] Failed to get metadata for tool ${toolId}:`, error);\n return null;\n }\n}\n\n/**\n * Enable or disable a tool\n */\nexport function setProviderEnabled(\n _toolId: string,\n _enabled: boolean\n): boolean {\n // For now, this is controlled by availability (API keys, etc)\n // In the future we might store enable/disable state separately\n console.warn(`[Tools] setProviderEnabled is not fully implemented yet`);\n return true;\n}\n\n/**\n * Build a tool map for specific tool IDs\n * This is the ONLY function that core/tool.ts imports\n */\nexport function buildToolMap(\n toolIds: string[],\n context?: { spaceId?: string }\n): Record<string, CoreTool> {\n const tools: Record<string, CoreTool> = {};\n\n for (const toolId of toolIds) {\n // Check if this is a tool class ID (e.g., 'file', 'web', 'search')\n if (toolClasses.has(toolId)) {\n // Get all functions from this tool class\n const tool = getToolInstance(toolId);\n if (tool) {\n // Set space context for space-aware tools\n if (context?.spaceId) {\n tool.setSpaceId(context.spaceId);\n }\n const toolFunctions = tool.getTools();\n // Add all functions from this tool class\n Object.assign(tools, toolFunctions);\n continue;\n }\n }\n\n // Otherwise, try to find it as a specific function\n let found = false;\n\n\n\n for (const [id] of toolClasses) {\n const tool = getToolInstance(id);\n if (!tool) continue;\n\n // Set space context for space-aware tools\n if (context?.spaceId) {\n tool.setSpaceId(context.spaceId);\n }\n\n // Get all tool functions from this class\n const toolFunctions = tool.getTools();\n\n // Check if this tool has the requested function\n if (toolId in toolFunctions) {\n tools[toolId] = toolFunctions[toolId];\n found = true;\n break; // Found the tool, no need to check other classes\n }\n }\n\n if (!found) {\n console.warn(`[Tools] Tool not found: ${toolId}`);\n }\n }\n\n return tools;\n}\n\n/**\n * Get all available tool IDs\n * Useful for discovery/listing\n */\nexport function getAllToolIds(): string[] {\n const ids: string[] = [];\n\n for (const [toolId] of toolClasses) {\n const tool = getToolInstance(toolId);\n if (!tool) continue;\n\n const toolFunctions = tool.getTools();\n ids.push(...Object.keys(toolFunctions));\n }\n\n return ids;\n}\n\n/**\n * Get all available tool IDs for a specific tool\n */\nexport function getProviderToolIds(toolId: string): string[] {\n const tool = getToolInstance(toolId);\n if (!tool) return [];\n\n const toolFunctions = tool.getTools();\n return Object.keys(toolFunctions);\n}\n\n/**\n * Check if a tool ID is available\n */\nexport function isToolAvailable(toolId: string): boolean {\n for (const [id] of toolClasses) {\n const tool = getToolInstance(id);\n if (!tool) continue;\n\n const toolFunctions = tool.getTools();\n if (toolId in toolFunctions) {\n return true;\n }\n }\n\n return false;\n}\n\n// Export for backward compatibility\nexport function getAvailableTools(): string[] {\n return getAllToolIds();\n}\n\n// Backward compatibility exports (to be removed eventually)\nexport type ToolProviderInfo = ToolInfo;\n\n// Export registry functions for static access (no instantiation)\n","/**\n * Tool System for Viber\n *\n * Coordinates between custom tools and MCP tools.\n * Knows nothing about specific tool implementations.\n */\n\nimport { z } from \"zod\";\n\n// Core tool interface that AI SDK expects\nexport interface CoreTool {\n description: string;\n inputSchema: z.ZodSchema | any;\n execute: (args: any, context?: any) => Promise<any>;\n}\n\n// Cache for MCP clients\nconst mcpClients = new Map<string, any>();\n\n/**\n * Build a tool map for streamText from an array of tool IDs\n * Delegates to appropriate providers without knowing their internals\n */\nexport async function buildToolMap(\n toolIds: string[],\n context?: { spaceId?: string }\n): Promise<Record<string, CoreTool>> {\n const tools: Record<string, CoreTool> = {};\n\n // Load MCP server configurations to determine tool types\n const { getServerDataAdapter } = await import(\"../data/factory\");\n const adapter = getServerDataAdapter();\n const mcpServers = await adapter.getTools();\n const mcpServerIds = new Set(mcpServers.map((s: any) => s.id));\n\n // Separate custom tools and MCP tools\n const customToolIds: string[] = [];\n const mcpToolIds: string[] = [];\n\n for (const id of toolIds) {\n // Check if it's an MCP server ID\n if (mcpServerIds.has(id)) {\n mcpToolIds.push(id);\n } else {\n customToolIds.push(id);\n }\n }\n\n // Load custom tools if needed\n if (customToolIds.length > 0) {\n const { buildToolMap: buildCustomToolMap } = await import(\"../tools\");\n const customTools = buildCustomToolMap(customToolIds, context);\n Object.assign(tools, customTools);\n }\n\n // Load MCP tools if needed\n if (mcpToolIds.length > 0) {\n const mcpTools = await loadMcpTools(mcpToolIds);\n Object.assign(tools, mcpTools);\n }\n\n return tools;\n}\n\n/**\n * Load MCP tools by ID\n * This is the only part that knows about MCP specifics\n */\nasync function loadMcpTools(ids: string[]): Promise<Record<string, CoreTool>> {\n const tools: Record<string, CoreTool> = {};\n\n // Group by server for efficient loading\n const serverGroups = new Map<string, string[]>();\n for (const id of ids) {\n // Handle both mcp:serverId format and direct serverId format\n let serverId = id;\n if (id.startsWith(\"mcp:\")) {\n const parts = id.split(\":\");\n serverId = parts[1] || id;\n }\n\n if (!serverGroups.has(serverId)) {\n serverGroups.set(serverId, []);\n }\n serverGroups.get(serverId)!.push(id);\n }\n\n // Load each server's tools\n for (const [serverId, toolIds] of serverGroups) {\n try {\n let mcpClient = mcpClients.get(serverId);\n\n if (!mcpClient) {\n // MCP client creation disabled - would require external mcp library\n // TODO: Implement MCP client when library is available\n console.warn(`[Tools] MCP client creation not implemented for: ${serverId}`);\n continue;\n }\n\n // Extract requested tools\n if (mcpClient && typeof mcpClient === \"object\") {\n // Get all tools from the MCP client\n const mcpTools = await mcpClient.tools();\n\n // Return all tools from this server\n for (const [toolName, tool] of Object.entries(mcpTools)) {\n if (isValidTool(tool)) {\n tools[toolName] = tool as CoreTool;\n }\n }\n }\n } catch (error) {\n console.error(`[Tools] Failed to load MCP server ${serverId}:`, error);\n }\n }\n\n return tools;\n}\n\n/**\n * Check if an object is a valid tool\n */\nexport function isValidTool(obj: any): boolean {\n return !!(\n obj &&\n typeof obj === \"object\" &&\n typeof obj.execute === \"function\" &&\n typeof obj.description === \"string\"\n );\n}\n\n/**\n * Clear MCP cache (useful for testing)\n */\nexport function clearToolCache(): void {\n mcpClients.clear();\n}\n","import * as fs from \"fs/promises\";\nimport * as fsSync from \"fs\";\nimport * as path from \"path\";\nimport * as yaml from \"yaml\";\nimport { Skill, SkillModule } from \"./types\";\nimport { CoreTool } from \"../core/tool\";\n\nexport class SkillRegistry {\n private skills: Map<string, Skill> = new Map();\n private loadedTools: Map<string, Record<string, CoreTool>> = new Map();\n\n constructor(private skillsRoot: string) { }\n\n /**\n * Scan for skills in the skills directory\n */\n async loadAll(): Promise<void> {\n try {\n const entries = await fs.readdir(this.skillsRoot, { withFileTypes: true });\n const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n for (const dirName of dirs) {\n await this.loadSkill(dirName);\n }\n } catch (error) {\n console.warn(`[SkillRegistry] Failed to scan skills at ${this.skillsRoot}:`, error);\n }\n }\n\n /**\n * Load a specific skill by directory name\n */\n async loadSkill(dirName: string): Promise<Skill | undefined> {\n const skillDir = path.join(this.skillsRoot, dirName);\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n\n try {\n // Check if SKILL.md exists\n try {\n await fs.access(skillMdPath);\n } catch {\n return undefined; // Not a skill\n }\n\n // Read SKILL.md\n const content = await fs.readFile(skillMdPath, \"utf8\");\n\n // Parse frontmatter\n // Simple parse: split by ---\n const parts = content.split(/^---$/m);\n if (parts.length < 3) {\n console.warn(`[SkillRegistry] Invalid SKILL.md format in ${dirName}`);\n return undefined;\n }\n\n const frontmatter = parts[1];\n const instructions = parts.slice(2).join(\"---\").trim();\n\n const metadata = yaml.parse(frontmatter);\n const id = metadata.name || dirName;\n\n const skill: Skill = {\n id,\n metadata: {\n name: id,\n description: metadata.description || \"\",\n ...metadata\n },\n instructions,\n dir: skillDir,\n };\n\n this.skills.set(id, skill);\n return skill;\n\n } catch (error) {\n console.error(`[SkillRegistry] Failed to load skill ${dirName}:`, error);\n return undefined;\n }\n }\n\n /**\n * Get tools for a specific skill (lazy load module)\n */\n async getTools(skillId: string, config?: any): Promise<Record<string, CoreTool>> {\n const skill = this.skills.get(skillId);\n if (!skill) {\n throw new Error(`Skill ${skillId} not found`);\n }\n\n if (this.loadedTools.has(skillId)) {\n return this.loadedTools.get(skillId)!;\n }\n\n // Import index.ts\n const idxPath = path.join(skill.dir, \"index.ts\"); // or .js\n try {\n // Dynamic import\n // Note: In strict ESM/TS environments we might need full path or file URL\n const modulePath = path.resolve(idxPath);\n const mod = await import(modulePath) as SkillModule;\n\n let tools: Record<string, CoreTool> = {};\n\n if (mod.getTools) {\n tools = await mod.getTools(config);\n } else if (mod.tools) {\n tools = mod.tools;\n }\n\n this.loadedTools.set(skillId, tools);\n return tools;\n } catch (error) {\n console.error(`[SkillRegistry] Failed to load tools for ${skillId}:`, error);\n return {};\n }\n }\n\n /**\n * Pre-register tools for a skill (used for bundled builds where dynamic import of .ts fails)\n */\n preRegisterTools(skillId: string, tools: Record<string, CoreTool>): void {\n this.loadedTools.set(skillId, tools);\n }\n\n getSkill(id: string): Skill | undefined {\n return this.skills.get(id);\n }\n\n getAllSkills(): Skill[] {\n return Array.from(this.skills.values());\n }\n}\n\nimport { fileURLToPath } from \"url\";\nimport { getViberRoot } from \"../config\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Try multiple paths for skill discovery:\n// 1. User's config directory (~/.openviber/skills) - User custom skills\n// 2. Bundled skills (relative to this file in dist) - Package skills\n// 3. Development mode: src/skills in cwd (only if running from source)\nfunction getDefaultSkillsPath(): string {\n // Option 1: User's config directory (~/.openviber/skills)\n const userSkillsPath = path.join(getViberRoot(), \"skills\");\n try {\n fsSync.accessSync(userSkillsPath);\n console.log(`[SkillRegistry] Using skills path (user): ${userSkillsPath}`);\n return userSkillsPath;\n } catch {\n // Option 2: Bundled skills (relative to this file - works for dist/)\n const bundledPath = path.resolve(__dirname, \".\");\n try {\n fsSync.accessSync(bundledPath);\n // Only use if it looks like a skills directory (not just dist/)\n const hasSkillDirs = fsSync.readdirSync(bundledPath).some(f => {\n const skillMd = path.join(bundledPath, f, \"SKILL.md\");\n try { fsSync.accessSync(skillMd); return true; } catch { return false; }\n });\n if (hasSkillDirs) {\n console.log(`[SkillRegistry] Using skills path (bundled): ${bundledPath}`);\n return bundledPath;\n }\n } catch { /* continue */ }\n\n // Option 3: Development mode - src/skills in cwd\n const devPath = path.resolve(process.cwd(), \"src/skills\");\n try {\n fsSync.accessSync(devPath);\n console.log(`[SkillRegistry] Using skills path (dev): ${devPath}`);\n return devPath;\n } catch {\n // Fallback: just return user path (will be created on demand)\n console.log(`[SkillRegistry] Using skills path (default): ${userSkillsPath}`);\n return userSkillsPath;\n }\n }\n}\n\nexport const defaultRegistry = new SkillRegistry(getDefaultSkillsPath());\n\n","/**\n * Agent - Config-driven agent implementation\n *\n * Agents are defined entirely by configuration, not code.\n * Each agent is instantiated from a config object that defines\n * its role, tools, and LLM settings.\n */\n\nimport { generateText, streamText } from \"ai\";\nimport type { LanguageModel, ModelMessage } from \"ai\";\nimport { getViberPath } from \"../config\";\nimport { AgentConfig } from \"./config\";\nimport { ConversationHistory, ViberMessage } from \"./message\";\nimport { getModelProvider } from \"./provider\";\nimport { buildToolMap } from \"./tool\";\nimport { generateShortId } from \"../utils/id\";\n\nexport interface AgentContext {\n spaceId: string;\n taskId?: string;\n conversationHistory: ConversationHistory;\n metadata?: Record<string, any>;\n}\n\nexport interface AgentResponse {\n text: string;\n toolCalls?: any[];\n reasoning?: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * Config-driven Agent implementation\n * No subclasses needed - behavior is entirely config-driven\n */\nimport { defaultRegistry } from \"../skills/registry\";\n\n/**\n * Config-driven Agent implementation\n * No subclasses needed - behavior is entirely config-driven\n */\nexport class Agent {\n public id: string;\n public name: string;\n public description: string;\n public config: AgentConfig;\n\n // LLM configuration\n public provider: string;\n public model: string;\n public temperature?: number;\n public maxTokens?: number;\n public topP?: number;\n public frequencyPenalty?: number;\n public presencePenalty?: number;\n public systemPrompt?: string;\n\n // Agent configuration\n public tools: string[];\n public skills: string[];\n public personality?: string;\n\n // Skill state\n private skillInstructions: string = \"\";\n private loadedSkillTools: Record<string, any> = {};\n private skillsLoaded: boolean = false;\n\n constructor(config: AgentConfig) {\n this.config = config;\n this.id = config.id || config.name;\n this.name = config.name;\n this.description = config.description;\n\n // LLM settings\n if (config.llm) {\n this.provider = config.llm.provider;\n this.model = config.llm.model;\n this.temperature = config.llm.settings?.temperature;\n this.maxTokens = config.llm.settings?.maxTokens;\n this.topP = config.llm.settings?.topP;\n this.frequencyPenalty = config.llm.settings?.frequencyPenalty;\n this.presencePenalty = config.llm.settings?.presencePenalty;\n this.systemPrompt = config.systemPrompt;\n } else {\n this.provider = config.provider!;\n this.model = config.model!;\n this.temperature = config.temperature;\n this.maxTokens = config.maxTokens;\n this.topP = config.topP;\n this.frequencyPenalty = config.frequencyPenalty;\n this.presencePenalty = config.presencePenalty;\n this.systemPrompt = config.systemPrompt;\n }\n\n if (this.provider === \"viber\" || this.provider?.startsWith(\"viber-\")) {\n throw new Error(\n `Invalid provider '${this.provider}' for agent '${this.name}'. Viber is not an AI provider.`,\n );\n }\n\n this.tools = config.tools || [];\n this.skills = config.skills || [];\n this.personality = config.personality;\n }\n\n /**\n * Ensure skills are loaded from registry\n */\n private async ensureSkillsLoaded(): Promise<void> {\n if (this.skillsLoaded) return;\n\n if (this.skills && this.skills.length > 0) {\n const instructionParts: string[] = [];\n\n for (const skillId of this.skills) {\n // Load skill metadata and instructions\n const skill = await defaultRegistry.loadSkill(skillId);\n if (skill) {\n instructionParts.push(`\\n### Skill: ${skill.metadata.name}`);\n instructionParts.push(skill.metadata.description);\n if (skill.instructions) {\n instructionParts.push(skill.instructions);\n }\n\n // Load tools\n const tools = await defaultRegistry.getTools(skillId);\n Object.assign(this.loadedSkillTools, tools);\n } else {\n console.warn(`[Agent] Skill '${skillId}' not found`);\n }\n }\n\n this.skillInstructions = instructionParts.join(\"\\n\\n\");\n }\n\n this.skillsLoaded = true;\n }\n\n /**\n * Get the system prompt for this agent\n */\n protected getSystemPrompt(context?: AgentContext): string {\n const segments: string[] = [];\n\n // Base identity\n segments.push(`You are ${this.name}.`);\n segments.push(this.description);\n\n // Personality\n if (this.personality) {\n segments.push(`\\nPersonality: ${this.personality}`);\n }\n\n // Skill Instructions\n if (this.skillInstructions) {\n segments.push(\"\\n=== ENABLED SKILLS ===\");\n segments.push(this.skillInstructions);\n segments.push(\"======================\\n\");\n }\n\n // Tool usage instructions\n if (\n (this.tools && this.tools.length > 0) ||\n Object.keys(this.loadedSkillTools).length > 0\n ) {\n segments.push(\"\\nIMPORTANT - TOOL USAGE:\");\n segments.push(\"You have tools available. To use a tool, you MUST:\");\n segments.push(\"1. Use the tool calling mechanism provided by the system\");\n segments.push(\n \"2. NEVER output tool calls as JSON, code blocks, or plain text\",\n );\n segments.push(\n \"When you need to call a tool, simply invoke it directly without any formatting.\",\n );\n if (Object.keys(this.loadedSkillTools).length > 0) {\n segments.push(\n \"When the user asks to use a skill by name (e.g. cursor-agent, tmux), one of your tools is for that—use each tool's description to decide when to call it.\",\n );\n }\n }\n\n // Custom system prompt\n if (this.systemPrompt) {\n segments.push(`\\n${this.systemPrompt}`);\n }\n\n // Context information\n if (context) {\n segments.push(\"\\nCurrent Context:\");\n segments.push(`- Space ID: ${context.spaceId}`);\n if (context.taskId) segments.push(`- Task ID: ${context.taskId}`);\n\n if (context.metadata) {\n // Add metadata fields\n for (const [key, value] of Object.entries(context.metadata)) {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n segments.push(`- ${key}: ${value}`);\n }\n }\n }\n }\n\n // Add current date and time context\n const now = new Date();\n segments.push(\"\\nDate/Time Information:\");\n segments.push(`- Same rules as before...`);\n // Truncating mainly to save space, assuming logic remains similar to original but with skills\n\n return segments.join(\"\\n\");\n }\n\n /**\n * Get the model provider for this agent\n */\n public getModel(context?: {\n spaceId?: string;\n userId?: string;\n }): LanguageModel {\n const modelProvider = getModelProvider({\n provider: this.provider as any,\n modelName: this.model,\n spaceId: context?.spaceId,\n userId: context?.userId,\n });\n\n // OpenRouter API expects upstream provider/model only (e.g. \"deepseek/deepseek-chat\"), not \"openrouter/...\"\n const modelForApi =\n this.provider === \"openrouter\" && this.model.startsWith(\"openrouter/\")\n ? this.model.slice(\"openrouter/\".length)\n : this.model;\n\n return (modelProvider as any)(modelForApi) as LanguageModel;\n }\n\n /**\n * Get tools available to this agent\n */\n protected async getTools(context?: { spaceId?: string }): Promise<any> {\n const tools = { ...this.loadedSkillTools };\n\n // Only load config tools if configured\n if (this.tools && this.tools.length > 0) {\n try {\n const customTools = await buildToolMap(this.tools, context);\n Object.assign(tools, customTools);\n } catch (error) {\n console.error(`Failed to load tools for agent ${this.name}:`, error);\n }\n }\n\n return Object.keys(tools).length > 0 ? tools : undefined;\n }\n\n /**\n * Prepare debug info without actually calling streamText\n */\n async prepareDebugInfo(options: {\n messages: ViberMessage[];\n system?: string;\n spaceId?: string;\n metadata?: Record<string, any>;\n }): Promise<{\n systemPrompt: string;\n tools: any;\n model: any;\n agentInfo: any;\n messages: any[];\n }> {\n await this.ensureSkillsLoaded();\n\n const { messages: viberMessages, system, spaceId, metadata } = options;\n\n // Extract metadata from messages for context enrichment\n let enrichedMetadata = metadata || {};\n\n // Find the last user message to extract any document context or other metadata\n const lastUserMsg = viberMessages.filter((m) => m.role === \"user\").pop();\n if (lastUserMsg?.metadata) {\n enrichedMetadata = { ...lastUserMsg.metadata, ...metadata };\n }\n\n // Build context for system prompt generation using ViberMessages\n const context: AgentContext = {\n spaceId: spaceId || \"default\",\n conversationHistory: new ConversationHistory(),\n metadata: enrichedMetadata,\n };\n\n // Use agent-specific prompt and append any extra system context\n const basePrompt = this.getSystemPrompt(context);\n const systemPrompt = system ? `${basePrompt}\\n\\n${system}` : basePrompt;\n const tools = await this.getTools({ spaceId });\n\n // Convert messages for display\n const modelMessages: any[] = viberMessages\n .filter((m) => m.role !== \"tool\")\n .map((m) => ({\n role: m.role,\n content:\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? (m.content as Array<{ type: string; text?: string }>)\n .filter((p) => p.type === \"text\" && p.text)\n .map((p) => p.text as string)\n .join(\"\\n\")\n : \"\",\n }))\n .filter((m) => m.content);\n\n return {\n systemPrompt,\n tools: Object.entries(tools || {}).map(([id, tool]) => ({\n id,\n name: (tool as any).name || id,\n description: (tool as any).description,\n functions: Object.keys((tool as any).functions || {}),\n })),\n model: {\n provider:\n this.config.llm?.provider || this.config.provider || \"unknown\",\n model: this.config.llm?.model || this.config.model || \"unknown\",\n settings: {\n temperature: this.temperature,\n maxTokens: this.maxTokens,\n topP: this.topP,\n frequencyPenalty: this.frequencyPenalty,\n presencePenalty: this.presencePenalty,\n },\n },\n agentInfo: {\n id: this.id,\n name: this.name,\n description: this.description,\n personality: this.personality,\n },\n messages: modelMessages,\n };\n }\n\n /**\n * Stream text - works with ViberMessage[] internally\n * Converts to ModelMessage[] only when calling AI SDK\n */\n async streamText(options: {\n messages: ViberMessage[];\n system?: string;\n spaceId?: string;\n metadata?: Record<string, any>;\n [key: string]: any; // Allow all other AI SDK options to pass through\n }): Promise<any> {\n await this.ensureSkillsLoaded();\n\n // Extract context-specific options\n const {\n messages: viberMessages,\n system,\n spaceId,\n metadata,\n ...aiSdkOptions\n } = options;\n\n // Extract metadata from messages for context enrichment\n let enrichedMetadata = metadata || {};\n\n // Find the last user message to extract any document context or other metadata\n const lastUserMsg = viberMessages.filter((m) => m.role === \"user\").pop();\n if (lastUserMsg?.metadata) {\n enrichedMetadata = { ...lastUserMsg.metadata, ...metadata };\n }\n\n // Build context for system prompt generation using ViberMessages\n const context: AgentContext = {\n spaceId: spaceId || \"default\",\n conversationHistory: new ConversationHistory(),\n metadata: enrichedMetadata,\n };\n\n // Use agent-specific prompt and append any extra system context\n const basePrompt = this.getSystemPrompt(context);\n const systemPrompt = system ? `${basePrompt}\\n\\n${system}` : basePrompt;\n\n const model = this.getModel({ spaceId, userId: enrichedMetadata.userId });\n const tools = await this.getTools({ spaceId });\n\n // Generate a message ID that includes the agent name\n const agentPrefix = this.name.toLowerCase().replace(/\\s+/g, \"-\");\n\n // Convert ViberMessage[] to ModelMessage[] ONLY here, right before AI SDK call\n const modelMessages: ModelMessage[] = viberMessages\n .filter((m) => m.role !== \"tool\") // Skip tool messages\n .map((m) => ({\n role: m.role as \"system\" | \"user\" | \"assistant\",\n content:\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? (m.content as Array<{ type: string; text?: string }>)\n .filter((p) => p.type === \"text\" && p.text)\n .map((p) => p.text as string)\n .join(\"\\n\")\n : \"\",\n }))\n .filter((m) => m.content); // Remove empty messages\n\n // Pass through to AI SDK's streamText with agent defaults\n const result = streamText({\n model,\n system: systemPrompt,\n messages: modelMessages,\n tools,\n toolChoice: \"auto\", // Explicitly set tool choice mode\n maxSteps: 5, // Allow up to 5 tool call steps\n temperature: this.temperature,\n maxOutputTokens: this.maxTokens,\n topP: this.topP,\n frequencyPenalty: this.frequencyPenalty,\n presencePenalty: this.presencePenalty,\n maxRetries: 3,\n // Add callback to monitor tool calls\n onStepFinish: ({ text, toolCalls, toolResults, finishReason }) => {\n // ... logging logic ...\n },\n // Override with any provided options\n ...aiSdkOptions,\n // Use experimental_generateMessageId to include agent name in message ID\n // @ts-ignore - experimental feature may not be in types yet\n experimental_generateMessageId: () => {\n return `${agentPrefix}_${generateShortId()}`;\n },\n });\n\n // Attach agent metadata to the result for immediate access\n (result as any).agentMetadata = {\n name: this.name,\n };\n\n return result;\n }\n\n /**\n * Generate text - works with ViberMessage[] internally\n * Converts to ModelMessage[] only when calling AI SDK\n */\n async generateText(options: {\n messages: ViberMessage[];\n system?: string;\n spaceId?: string;\n metadata?: Record<string, any>;\n [key: string]: any;\n }): Promise<any> {\n await this.ensureSkillsLoaded();\n\n const {\n messages: viberMessages,\n system,\n spaceId,\n metadata,\n ...aiSdkOptions\n } = options;\n\n // Extract metadata from messages for context enrichment\n let enrichedMetadata = metadata || {};\n\n // Find the last user message to extract any document context or other metadata\n const lastUserMsg = viberMessages.filter((m) => m.role === \"user\").pop();\n if (lastUserMsg?.metadata) {\n enrichedMetadata = { ...lastUserMsg.metadata, ...metadata };\n }\n\n // Build context for system prompt generation\n const context: AgentContext = {\n spaceId: spaceId || \"default\",\n conversationHistory: new ConversationHistory(),\n metadata: enrichedMetadata,\n };\n\n // Use agent-specific prompt and append any extra system context\n const basePrompt = this.getSystemPrompt(context);\n const systemPrompt = system ? `${basePrompt}\\n\\n${system}` : basePrompt;\n\n const model = this.getModel({ spaceId, userId: enrichedMetadata.userId });\n const tools = await this.getTools({ spaceId });\n\n // Convert ViberMessage[] to ModelMessage[] ONLY here, right before AI SDK call\n const modelMessages: ModelMessage[] = viberMessages\n .filter((m) => m.role !== \"tool\") // Skip tool messages\n .map((m) => ({\n role: m.role as \"system\" | \"user\" | \"assistant\",\n content:\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? (m.content as Array<{ type: string; text?: string }>)\n .filter((p) => p.type === \"text\" && p.text)\n .map((p) => p.text as string)\n .join(\"\\n\")\n : \"\",\n }))\n .filter((m) => m.content);\n\n // Pass through to AI SDK's generateText with proper options\n return generateText({\n model,\n system: systemPrompt,\n messages: modelMessages,\n tools,\n temperature: this.temperature,\n maxRetries: 3,\n ...aiSdkOptions,\n // Add model-specific options if they exist\n ...(this.maxTokens && { maxSteps: 5 }), // generateText uses maxSteps not maxTokens\n ...(this.topP && { topP: this.topP }),\n ...(this.frequencyPenalty && { frequencyPenalty: this.frequencyPenalty }),\n ...(this.presencePenalty && { presencePenalty: this.presencePenalty }),\n });\n }\n\n /**\n * Get agent summary\n */\n getSummary(): Record<string, any> {\n return {\n id: this.id,\n name: this.name,\n description: this.description,\n tools: this.tools,\n llmModel: `${this.provider}/${this.model}`,\n };\n }\n}\n","import { Cron } from \"croner\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport * as yaml from \"yaml\";\n\n\nexport interface CronJobConfig {\n name: string;\n description?: string;\n schedule: string;\n agent?: string;\n provider?: string;\n model?: string;\n skills?: string[];\n tools?: string[];\n prompt: string;\n}\n\nexport class JobScheduler {\n private jobs: Map<string, Cron> = new Map();\n private active: boolean = false;\n\n constructor(private jobsDir: string) { }\n\n async start() {\n this.active = true;\n await this.loadJobs();\n }\n\n async stop() {\n this.active = false;\n for (const job of this.jobs.values()) {\n job.stop();\n }\n this.jobs.clear();\n }\n\n private async loadJobs() {\n try {\n // Check if directory exists\n try {\n await fs.access(this.jobsDir);\n } catch {\n console.warn(`[Scheduler] Jobs directory not found: ${this.jobsDir}`);\n return;\n }\n\n const files = await fs.readdir(this.jobsDir);\n for (const file of files) {\n if (file.endsWith(\".yaml\") || file.endsWith(\".yml\")) {\n const content = await fs.readFile(path.join(this.jobsDir, file), \"utf8\");\n try {\n const config = yaml.parse(content) as CronJobConfig;\n this.scheduleJob(config);\n } catch (err) {\n console.error(`[Scheduler] Failed to parse job ${file}:`, err);\n }\n }\n }\n } catch (err) {\n console.error(\"[Scheduler] Error loading jobs:\", err);\n }\n }\n\n private scheduleJob(config: CronJobConfig) {\n console.log(`[Scheduler] Scheduling job: ${config.name} (${config.schedule})`);\n\n // Handle \"interval: 3s\" style if user uses it, though we recommend standard Cron\n // Croner supports \"ISO 8601 duration\" or pattern.\n // If config.schedule starts with \"*\", assume cron.\n // If it is a number, assume ms?\n\n // For specific antigravity case: \"*/3 * * * * *\" is every 3 seconds.\n\n try {\n const job = new Cron(config.schedule, async () => {\n if (!this.active) return;\n await this.executeJob(config);\n });\n\n this.jobs.set(config.name, job);\n } catch (err) {\n console.error(`[Scheduler] Invalid schedule for ${config.name}:`, err);\n }\n }\n\n private async executeJob(config: CronJobConfig) {\n // If model is specified, use full Agent\n if (config.model) {\n try {\n const { Agent } = await import(\"../core/agent\");\n\n const agent = new Agent({\n name: config.name,\n description: config.description || \"Cron Job Agent\",\n skills: config.skills,\n tools: config.tools,\n llm: {\n provider: config.provider || \"openrouter\",\n model: config.model\n },\n });\n\n // Execute prompt\n const result = await agent.generateText({\n messages: [{ role: \"user\", content: config.prompt }]\n });\n\n // Log results comprehensively (single line)\n const parts: string[] = [];\n\n // Tool results (compact) — skip noiseless health OK results\n if (result.toolResults && result.toolResults.length > 0) {\n for (const tr of result.toolResults) {\n const isHealthOk =\n tr.output &&\n typeof tr.output === \"object\" &&\n \"status\" in tr.output &&\n (tr.output as any).status === \"HEALTHY\";\n if (isHealthOk) continue;\n\n const resultStr =\n typeof tr.output === \"object\"\n ? JSON.stringify(tr.output) // No pretty-print\n : String(tr.output);\n parts.push(`${tr.toolName}: ${resultStr}`);\n }\n }\n\n // LLM text response if any\n if (result.text) {\n parts.push(result.text.slice(0, 100)); // Truncate long text\n }\n\n // Final output (single line)\n if (parts.length > 0) {\n console.log(`[${config.name}] ${parts.join(' | ')}`);\n }\n\n } catch (err) {\n console.error(`[${config.name}] Agent execution failed:`, err);\n }\n return;\n }\n\n // Fallback: Hardcoded optimization for BrowserCDP if no model specified (Legacy/Fast Path)\n // This allows \"script-like\" execution without LLM inference cost if the prompt matches known patterns\n // (For now, we keep the Healer optimization as a fallback or if user omits model)\n // Fallback or legacy logic removed for cleaner architecture.\n if (!config.model) {\n console.warn(`[${config.name}] No model specified, skipping execution.`);\n }\n }\n}\n","/**\n * Daemon runtime - thin clawdbot-alike assistant path\n *\n * No Space, no DataAdapter, no Storage. Loads a single agent config from file\n * and runs streamText. Viber Board owns persistence and context; daemon only\n * orchestrates local skills and the LLM.\n */\n\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport * as yaml from \"yaml\";\nimport { getViberPath } from \"../config\";\nimport type { AgentConfig } from \"../core/config\";\nimport { Agent } from \"../core/agent\";\nimport type { ViberMessage } from \"../core/message\";\n\nexport interface DaemonRunTaskOptions {\n model?: string;\n singleAgentId?: string;\n agentConfig?: AgentConfig;\n signal?: AbortSignal;\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst DEFAULTS_AGENTS_DIR = path.join(\n path.dirname(__dirname),\n \"data\",\n \"defaults\",\n \"agents\"\n);\n\n/**\n * Load agent config from file (no DataAdapter).\n * Tries built-in defaults then ~/.openviber/agents/{id}.yaml\n */\nexport async function loadAgentConfig(\n agentId: string\n): Promise<AgentConfig | null> {\n const tryRead = async (filePath: string): Promise<AgentConfig | null> => {\n try {\n const content = await fs.readFile(filePath, \"utf8\");\n const parsed = yaml.parse(content) as Record<string, unknown>;\n if (!parsed || typeof parsed !== \"object\") return null;\n return { ...parsed, id: agentId } as AgentConfig;\n } catch {\n return null;\n }\n };\n\n for (const ext of [\"yaml\", \"yml\"]) {\n const fromDefaults = await tryRead(\n path.join(DEFAULTS_AGENTS_DIR, `${agentId}.${ext}`)\n );\n if (fromDefaults) return fromDefaults;\n }\n\n const root = getViberPath();\n for (const ext of [\"yaml\", \"yml\"]) {\n const fromUser = await tryRead(\n path.join(root, \"agents\", `${agentId}.${ext}`)\n );\n if (fromUser) return fromUser;\n }\n\n // Fallback: in-code default so daemon works out of the box (clawdbot-alike)\n if (agentId === \"default\") {\n return {\n id: \"default\",\n name: \"Default\",\n description: \"General-purpose assistant with local skills.\",\n provider: \"openrouter\",\n model: \"deepseek/deepseek-chat\",\n temperature: 0.7,\n maxTokens: 4096,\n systemPrompt:\n \"You are a helpful AI assistant. You help users accomplish their tasks efficiently and effectively. Be concise, accurate, and helpful.\",\n tools: [],\n skills: [\"tmux\", \"cursor-agent\"],\n } as AgentConfig;\n }\n\n return null;\n}\n\n/**\n * Run a single task: one agent, no Space, no storage.\n * Returns stream result and agent for summary.\n */\nexport async function runTask(\n goal: string,\n options: DaemonRunTaskOptions & { taskId: string },\n messages?: { role: string; content: string }[]\n): Promise<{\n streamResult: Awaited<ReturnType<Agent[\"streamText\"]>>;\n agent: Agent;\n}> {\n const {\n taskId,\n singleAgentId = \"default\",\n agentConfig: overrideConfig,\n model: modelOverride,\n signal,\n } = options;\n\n let config = overrideConfig ?? (await loadAgentConfig(singleAgentId));\n if (!config) {\n throw new Error(\n `Agent '${singleAgentId}' not found. Add ~/.openviber/agents/${singleAgentId}.yaml or use built-in default.`\n );\n }\n\n if (modelOverride) {\n config = { ...config, model: modelOverride };\n }\n\n const agent = new Agent(config as AgentConfig);\n\n const viberMessages: ViberMessage[] =\n messages && messages.length > 0\n ? messages.map((m) => ({\n role: m.role as \"user\" | \"assistant\" | \"system\",\n content: m.content,\n }))\n : [{ role: \"user\" as const, content: goal }];\n\n const streamResult = await agent.streamText({\n messages: viberMessages,\n metadata: { taskId },\n ...(signal && { abortSignal: signal }),\n });\n\n return { streamResult, agent };\n}\n","/**\n * Terminal runtime abstraction.\n *\n * tmux remains the primary backend, while additional app adapters can be\n * plugged in for other execution surfaces.\n */\n\nimport { spawn, spawnSync, execSync, ChildProcess } from \"child_process\";\nimport { EventEmitter } from \"events\";\nimport { randomUUID } from \"crypto\";\n\nexport interface TerminalPane {\n appId: string;\n session: string;\n window: string;\n windowName: string;\n pane: string;\n command: string;\n target: string;\n}\n\nexport interface TerminalSession {\n appId: string;\n name: string;\n windows: number;\n attached: boolean;\n}\n\nexport interface CreateSessionResult {\n ok: boolean;\n appId: string;\n sessionName: string;\n created: boolean;\n error?: string;\n}\n\nexport interface TerminalApp {\n id: string;\n label: string;\n isAvailable(): boolean;\n listSessions(): TerminalSession[];\n listPanes(): TerminalPane[];\n attach(\n target: string,\n onData: (data: string) => void,\n onClose: () => void,\n ): Promise<boolean>;\n detach(target: string): void;\n sendInput(target: string, keys: string): boolean;\n resize(target: string, cols: number, rows: number): boolean;\n createSession(sessionName: string, windowName?: string, cwd?: string): CreateSessionResult;\n detachAll(): void;\n}\n\nconst SAFE_NAME_RE = /[^a-zA-Z0-9_.:-]/g;\n\nfunction sanitizeName(input: string): string {\n return input.replace(SAFE_NAME_RE, \"-\");\n}\n\nfunction resolveAppTarget(target: string, appHint?: string): { appId: string; rawTarget: string } {\n if (target.includes(\"::\")) {\n const [appId, ...rest] = target.split(\"::\");\n return { appId, rawTarget: rest.join(\"::\") };\n }\n return { appId: appHint || \"tmux\", rawTarget: target };\n}\n\n/** tmux app adapter */\nclass TmuxTerminalStream extends EventEmitter {\n private catProcess: ChildProcess | null = null;\n private pipePath: string;\n private isAttached = false;\n\n constructor(private target: string) {\n super();\n this.pipePath = `/tmp/viber-term-${target.replace(/[^a-zA-Z0-9]/g, \"-\")}-${Date.now()}`;\n }\n\n async attach(): Promise<boolean> {\n if (this.isAttached) return true;\n\n try {\n const history = captureTmuxPane(this.target, 200);\n if (history) {\n this.emit(\"data\", history);\n }\n\n execSync(`mkfifo '${this.pipePath}' 2>/dev/null || true`, { stdio: \"pipe\" });\n\n this.catProcess = spawn(\"cat\", [this.pipePath], {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n\n this.catProcess.stdout?.on(\"data\", (chunk: Buffer) => {\n this.emit(\"data\", chunk.toString());\n });\n\n this.catProcess.on(\"close\", () => {\n this.cleanup();\n });\n\n this.catProcess.on(\"error\", (err) => {\n this.emit(\"error\", err);\n this.cleanup();\n });\n\n execSync(`tmux pipe-pane -t '${this.target}' -o 'cat >> ${this.pipePath}'`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n this.isAttached = true;\n return true;\n } catch (err) {\n this.emit(\"error\", err);\n this.cleanup();\n return false;\n }\n }\n\n detach(): void {\n if (!this.isAttached) return;\n try {\n execSync(`tmux pipe-pane -t '${this.target}'`, { stdio: \"pipe\" });\n } catch {\n // ignore\n }\n this.cleanup();\n }\n\n private cleanup(): void {\n this.isAttached = false;\n if (this.catProcess) {\n this.catProcess.kill();\n this.catProcess = null;\n }\n try {\n execSync(`rm -f '${this.pipePath}'`, { stdio: \"pipe\" });\n } catch {\n // ignore\n }\n this.emit(\"close\");\n }\n\n get attached(): boolean {\n return this.isAttached;\n }\n}\n\nclass TmuxTerminalApp implements TerminalApp {\n id = \"tmux\";\n label = \"tmux\";\n private streams: Map<string, TmuxTerminalStream> = new Map();\n\n isAvailable(): boolean {\n try {\n execSync(\"tmux -V\", { stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n }\n\n listSessions(): TerminalSession[] {\n try {\n const out = execSync(\n \"tmux list-sessions -F '#{session_name}|#{session_windows}|#{session_attached}' 2>/dev/null\",\n { encoding: \"utf8\", stdio: \"pipe\" },\n ).trim();\n if (!out) return [];\n return out.split(\"\\n\").map((line) => {\n const [name, windows, attached] = line.split(\"|\");\n return {\n appId: this.id,\n name,\n windows: parseInt(windows, 10) || 0,\n attached: attached === \"1\",\n };\n });\n } catch {\n return [];\n }\n }\n\n listPanes(): TerminalPane[] {\n try {\n const out = execSync(\n \"tmux list-panes -a -F '#{session_name}|#{window_index}|#{window_name}|#{pane_index}|#{pane_current_command}' 2>/dev/null\",\n { encoding: \"utf8\", stdio: \"pipe\" },\n ).trim();\n if (!out) return [];\n return out.split(\"\\n\").map((line) => {\n const [session, window, windowName, pane, command] = line.split(\"|\");\n return {\n appId: this.id,\n session,\n window,\n windowName,\n pane,\n command,\n target: `${session}:${window}.${pane}`,\n };\n });\n } catch {\n return [];\n }\n }\n\n async attach(\n target: string,\n onData: (data: string) => void,\n onClose: () => void,\n ): Promise<boolean> {\n let stream = this.streams.get(target);\n if (stream && stream.attached) {\n stream.on(\"data\", onData);\n stream.on(\"close\", onClose);\n return true;\n }\n\n stream = new TmuxTerminalStream(target);\n stream.on(\"data\", onData);\n stream.on(\"close\", () => {\n this.streams.delete(target);\n onClose();\n });\n\n const ok = await stream.attach();\n if (ok) {\n this.streams.set(target, stream);\n }\n return ok;\n }\n\n detach(target: string): void {\n const stream = this.streams.get(target);\n if (!stream) return;\n stream.detach();\n this.streams.delete(target);\n }\n\n sendInput(target: string, keys: string): boolean {\n return sendTmuxKeys(target, keys);\n }\n\n resize(target: string, cols: number, rows: number): boolean {\n try {\n execSync(`tmux resize-pane -t '${target}' -x ${cols} -y ${rows}`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return true;\n } catch {\n return false;\n }\n }\n\n createSession(sessionName: string, windowName = \"main\", cwd?: string): CreateSessionResult {\n const safeSession = sanitizeName(sessionName || \"coding\");\n const safeWindow = sanitizeName(windowName || \"main\");\n\n try {\n execSync(`tmux has-session -t '${safeSession}' 2>/dev/null`, { stdio: \"pipe\" });\n return { ok: true, appId: this.id, sessionName: safeSession, created: false };\n } catch {\n // create\n }\n\n const args = [\"new-session\", \"-d\", \"-s\", safeSession, \"-n\", safeWindow];\n if (cwd) {\n args.push(\"-c\", cwd);\n }\n\n const result = spawnSync(\"tmux\", args, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n if (result.error) {\n return {\n ok: false,\n appId: this.id,\n sessionName: safeSession,\n created: false,\n error: `Failed to start tmux: ${result.error.message}`,\n };\n }\n\n if (result.status !== 0) {\n return {\n ok: false,\n appId: this.id,\n sessionName: safeSession,\n created: false,\n error: (result.stderr || result.stdout || \"Failed to create tmux session\").trim(),\n };\n }\n\n return { ok: true, appId: this.id, sessionName: safeSession, created: true };\n }\n\n detachAll(): void {\n for (const stream of this.streams.values()) {\n stream.detach();\n }\n this.streams.clear();\n }\n}\n\ninterface ShellProcessState {\n proc: ChildProcess;\n sessionName: string;\n windowName: string;\n pane: string;\n history: string[];\n listeners: Set<(data: string) => void>;\n closeListeners: Set<() => void>;\n}\n\n/**\n * Lightweight process-based adapter that keeps shell sessions available for\n * environments where tmux is unavailable.\n */\nclass ShellTerminalApp implements TerminalApp {\n id = \"shell\";\n label = \"shell\";\n private sessions = new Map<string, ShellProcessState>();\n\n isAvailable(): boolean {\n return true;\n }\n\n listSessions(): TerminalSession[] {\n return Array.from(this.sessions.values()).map((state) => ({\n appId: this.id,\n name: state.sessionName,\n windows: 1,\n attached: state.listeners.size > 0,\n }));\n }\n\n listPanes(): TerminalPane[] {\n return Array.from(this.sessions.entries()).map(([id, state]) => ({\n appId: this.id,\n session: state.sessionName,\n window: \"0\",\n windowName: state.windowName,\n pane: state.pane,\n command: process.env.SHELL || \"sh\",\n target: id,\n }));\n }\n\n async attach(target: string, onData: (data: string) => void, onClose: () => void): Promise<boolean> {\n const state = this.sessions.get(target);\n if (!state) return false;\n\n state.listeners.add(onData);\n state.closeListeners.add(onClose);\n if (state.history.length > 0) {\n onData(state.history.join(\"\"));\n }\n return true;\n }\n\n detach(target: string): void {\n const state = this.sessions.get(target);\n if (!state) return;\n state.listeners.clear();\n state.closeListeners.clear();\n }\n\n sendInput(target: string, keys: string): boolean {\n const state = this.sessions.get(target);\n if (!state || !state.proc.stdin?.writable) return false;\n state.proc.stdin.write(keys);\n return true;\n }\n\n resize(_target: string, _cols: number, _rows: number): boolean {\n return true;\n }\n\n createSession(sessionName: string, windowName = \"main\", cwd?: string): CreateSessionResult {\n const safeSession = sanitizeName(sessionName || `shell-${Date.now()}`);\n const shell = process.env.SHELL || \"sh\";\n const target = `${safeSession}:${randomUUID().slice(0, 8)}`;\n\n if (this.sessions.has(target)) {\n return { ok: true, appId: this.id, sessionName: safeSession, created: false };\n }\n\n const proc = spawn(shell, [], {\n cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n\n if (!proc.pid) {\n return {\n ok: false,\n appId: this.id,\n sessionName: safeSession,\n created: false,\n error: \"Failed to start shell process\",\n };\n }\n\n const state: ShellProcessState = {\n proc,\n sessionName: safeSession,\n windowName,\n pane: \"0\",\n history: [],\n listeners: new Set(),\n closeListeners: new Set(),\n };\n\n const pushChunk = (chunk: Buffer): void => {\n const text = chunk.toString();\n state.history.push(text);\n if (state.history.length > 200) {\n state.history.shift();\n }\n for (const listener of state.listeners) {\n listener(text);\n }\n };\n\n proc.stdout?.on(\"data\", pushChunk);\n proc.stderr?.on(\"data\", pushChunk);\n proc.on(\"close\", () => {\n for (const onClose of state.closeListeners) {\n onClose();\n }\n this.sessions.delete(target);\n });\n\n this.sessions.set(target, state);\n\n return { ok: true, appId: this.id, sessionName: safeSession, created: true };\n }\n\n detachAll(): void {\n for (const [id, state] of this.sessions.entries()) {\n state.proc.kill();\n this.sessions.delete(id);\n }\n }\n}\n\nfunction sendTmuxKeys(target: string, keys: string, pressEnter = false): boolean {\n try {\n const args = [\"send-keys\", \"-t\", target, keys];\n if (pressEnter) args.push(\"Enter\");\n execSync(`tmux ${args.map((a) => `'${a}'`).join(\" \")}`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction captureTmuxPane(target: string, lines = 500): string {\n const cmds = [\n `tmux capture-pane -t '${target}' -pae -S -${lines}`,\n `tmux capture-pane -t '${target}' -pe -S -${lines}`,\n ];\n for (const cmd of cmds) {\n try {\n return execSync(cmd, { encoding: \"utf8\", stdio: \"pipe\" });\n } catch {\n // try next fallback\n }\n }\n return \"\";\n}\n\nexport interface TerminalListResponse {\n apps: Array<{ id: string; label: string; available: boolean }>;\n sessions: TerminalSession[];\n panes: TerminalPane[];\n}\n\n/**\n * TerminalManager multiplexes app adapters and routes operations by app id.\n */\nexport class TerminalManager {\n private readonly apps = new Map<string, TerminalApp>();\n\n constructor(adapters?: TerminalApp[]) {\n const defaultAdapters = adapters ?? [new TmuxTerminalApp(), new ShellTerminalApp()];\n for (const adapter of defaultAdapters) {\n this.apps.set(adapter.id, adapter);\n }\n }\n\n list(): TerminalListResponse {\n const metadata = Array.from(this.apps.values()).map((app) => ({\n id: app.id,\n label: app.label,\n available: app.isAvailable(),\n }));\n\n const sessions: TerminalSession[] = [];\n const panes: TerminalPane[] = [];\n\n for (const app of this.apps.values()) {\n if (!app.isAvailable()) continue;\n sessions.push(...app.listSessions());\n panes.push(...app.listPanes());\n }\n\n return { apps: metadata, sessions, panes };\n }\n\n async attach(\n target: string,\n onData: (data: string) => void,\n onClose: () => void,\n appHint?: string,\n ): Promise<boolean> {\n const { appId, rawTarget } = resolveAppTarget(target, appHint);\n const app = this.apps.get(appId);\n if (!app || !app.isAvailable()) return false;\n return app.attach(rawTarget, onData, onClose);\n }\n\n detach(target: string, appHint?: string): void {\n const { appId, rawTarget } = resolveAppTarget(target, appHint);\n this.apps.get(appId)?.detach(rawTarget);\n }\n\n sendInput(target: string, keys: string, appHint?: string): boolean {\n const { appId, rawTarget } = resolveAppTarget(target, appHint);\n const app = this.apps.get(appId);\n return !!app && app.isAvailable() ? app.sendInput(rawTarget, keys) : false;\n }\n\n resize(target: string, cols: number, rows: number, appHint?: string): boolean {\n const { appId, rawTarget } = resolveAppTarget(target, appHint);\n const app = this.apps.get(appId);\n return !!app && app.isAvailable() ? app.resize(rawTarget, cols, rows) : false;\n }\n\n createSession(\n sessionName: string,\n windowName = \"main\",\n cwd?: string,\n appId = \"tmux\",\n ): CreateSessionResult {\n const app = this.apps.get(appId);\n if (!app || !app.isAvailable()) {\n return {\n ok: false,\n appId,\n sessionName,\n created: false,\n error: `Terminal app '${appId}' is not available`,\n };\n }\n return app.createSession(sessionName, windowName, cwd);\n }\n\n detachAll(): void {\n for (const app of this.apps.values()) {\n app.detachAll();\n }\n }\n}\n\nexport { TmuxTerminalApp, ShellTerminalApp };\n","/**\n * ViberController - Daemon controller for outbound connection to command center\n *\n * A Viber is a local agent daemon that connects OUTBOUND to a central command center\n * (Supen). This eliminates the need for public IPs or port forwarding.\n *\n * Features:\n * - Persistent WebSocket connection to command center\n * - Auto-reconnection on disconnect\n * - Heartbeat/health monitoring\n * - Task execution and event streaming\n */\n\nimport { EventEmitter } from \"events\";\nimport WebSocket from \"ws\";\nimport type { ViberOptions } from \"../core/viber-agent\";\nimport { runTask } from \"./runtime\";\nimport { TerminalManager } from \"./terminal\";\n\n// ==================== Types ====================\n\nexport interface ViberControllerConfig {\n /** WebSocket URL to connect to (e.g., wss://supen.app/vibers/ws) */\n serverUrl: string;\n /** Authentication token */\n token: string;\n /** Unique identifier for this viber */\n viberId: string;\n /** Human-readable name for this viber */\n viberName?: string;\n /** Milliseconds between reconnection attempts */\n reconnectInterval?: number;\n /** Milliseconds between heartbeat messages */\n heartbeatInterval?: number;\n /** Enable desktop control tools */\n enableDesktop?: boolean;\n}\n\nexport interface ViberSkillInfo {\n id: string;\n name: string;\n description: string;\n}\n\nexport interface ViberInfo {\n id: string;\n name: string;\n version: string;\n platform: string;\n capabilities: string[];\n runningTasks: string[];\n /** Skills available on this viber (from SKILL.md) */\n skills?: ViberSkillInfo[];\n}\n\nexport interface ViberStatus {\n platform: string;\n uptime: number;\n memory: NodeJS.MemoryUsage;\n runningTasks: number;\n}\n\n// Server -> Viber messages (messages = full chat history from Viber Board for context)\nexport type ControllerServerMessage =\n | {\n type: \"task:submit\";\n taskId: string;\n goal: string;\n options?: ViberOptions;\n messages?: { role: string; content: string }[];\n }\n | { type: \"task:stop\"; taskId: string }\n | { type: \"task:message\"; taskId: string; message: string }\n | { type: \"ping\" }\n | { type: \"config:update\"; config: Partial<ViberControllerConfig> }\n // Terminal streaming messages\n | { type: \"terminal:list\" }\n | { type: \"terminal:attach\"; target: string; appId?: string }\n | { type: \"terminal:detach\"; target: string; appId?: string }\n | { type: \"terminal:input\"; target: string; keys: string; appId?: string }\n | { type: \"terminal:resize\"; target: string; cols: number; rows: number; appId?: string };\n\n// Viber -> Server messages\nexport type ControllerClientMessage =\n | { type: \"connected\"; viber: ViberInfo }\n | { type: \"task:started\"; taskId: string; spaceId: string }\n | { type: \"task:progress\"; taskId: string; event: any }\n | { type: \"task:completed\"; taskId: string; result: any }\n | { type: \"task:error\"; taskId: string; error: string }\n | { type: \"heartbeat\"; status: ViberStatus }\n | { type: \"pong\" }\n // Terminal streaming messages\n | { type: \"terminal:list\"; apps: any[]; sessions: any[]; panes: any[] }\n | { type: \"terminal:attached\"; target: string; appId?: string; ok: boolean; error?: string }\n | { type: \"terminal:detached\"; target: string; appId?: string }\n | { type: \"terminal:output\"; target: string; appId?: string; data: string }\n | { type: \"terminal:resized\"; target: string; appId?: string; ok: boolean };\n\n// ==================== Controller ====================\n\nexport class ViberController extends EventEmitter {\n private ws: WebSocket | null = null;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n /** taskId -> AbortController for stop (daemon = thin runtime, no Space/agent instance) */\n private runningTasks: Map<string, AbortController> = new Map();\n private isConnected = false;\n private shouldReconnect = true;\n /** Terminal manager for streaming tmux panes */\n private terminalManager = new TerminalManager();\n\n constructor(private config: ViberControllerConfig) {\n super();\n }\n\n /**\n * Start the viber daemon\n */\n async start(): Promise<void> {\n console.log(`[Viber] Starting viber: ${this.config.viberId}`);\n console.log(`[Viber] Connecting to: ${this.config.serverUrl}`);\n this.shouldReconnect = true;\n await this.connect();\n }\n\n /**\n * Stop the viber daemon\n */\n async stop(): Promise<void> {\n console.log(\"[Viber] Stopping viber...\");\n this.shouldReconnect = false;\n\n for (const [taskId, controller] of this.runningTasks) {\n controller.abort();\n this.runningTasks.delete(taskId);\n }\n\n // Detach all terminal streams\n this.terminalManager.detachAll();\n\n // Clear timers\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n // Close connection\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.emit(\"stopped\");\n }\n\n /**\n * Get current connection status\n */\n getStatus(): { connected: boolean; runningTasks: number } {\n return {\n connected: this.isConnected,\n runningTasks: this.runningTasks.size,\n };\n }\n\n // ==================== Connection Management ====================\n\n private async connect(): Promise<void> {\n try {\n this.ws = new WebSocket(this.config.serverUrl, {\n headers: {\n Authorization: `Bearer ${this.config.token}`,\n \"X-Viber-Id\": this.config.viberId,\n \"X-Viber-Version\": \"1.0.0\",\n },\n });\n\n this.ws.on(\"open\", () => {\n void this.onConnected();\n });\n this.ws.on(\"message\", (data) => this.onMessage(data));\n this.ws.on(\"close\", () => this.onDisconnected());\n this.ws.on(\"error\", (err) => this.onError(err));\n } catch (error) {\n console.error(\"[Viber] Connection failed:\", error);\n this.scheduleReconnect();\n }\n }\n\n private async onConnected(): Promise<void> {\n console.log(\"[Viber] Connected to command center\");\n this.isConnected = true;\n\n const capabilities = [\"file\", \"search\", \"web\"];\n if (this.config.enableDesktop) {\n capabilities.push(\"desktop\");\n }\n\n let skills: { id: string; name: string; description: string }[] = [];\n try {\n const { defaultRegistry } = await import(\"../skills/registry\");\n await defaultRegistry.loadAll();\n const all = defaultRegistry.getAllSkills();\n skills = all.map((s) => ({\n id: s.id,\n name: s.metadata.name || s.id,\n description: s.metadata.description || \"\",\n }));\n } catch (err) {\n console.warn(\"[Viber] Could not load skills for capabilities:\", err);\n }\n\n this.send({\n type: \"connected\",\n viber: {\n id: this.config.viberId,\n name: this.config.viberName || this.config.viberId,\n version: \"1.0.0\",\n platform: process.platform,\n capabilities,\n runningTasks: Array.from(this.runningTasks.keys()),\n skills: skills.length > 0 ? skills : undefined,\n },\n });\n\n this.startHeartbeat();\n this.emit(\"connected\");\n }\n\n private onDisconnected(): void {\n console.log(\"[Viber] Disconnected from command center\");\n this.isConnected = false;\n this.stopHeartbeat();\n\n if (this.shouldReconnect) {\n this.scheduleReconnect();\n }\n\n this.emit(\"disconnected\");\n }\n\n private onError(error: Error): void {\n console.error(\"[Viber] WebSocket error:\", error.message);\n this.emit(\"error\", error);\n }\n\n private async onMessage(data: WebSocket.Data): Promise<void> {\n try {\n const message = JSON.parse(data.toString()) as ControllerServerMessage;\n\n switch (message.type) {\n case \"task:submit\":\n await this.handleTaskSubmit(message);\n break;\n\n case \"task:stop\":\n await this.handleTaskStop(message.taskId);\n break;\n\n case \"task:message\":\n await this.handleTaskMessage(message.taskId, message.message);\n break;\n\n case \"ping\":\n this.send({ type: \"pong\" });\n break;\n\n case \"config:update\":\n Object.assign(this.config, message.config);\n this.emit(\"config:update\", message.config);\n break;\n\n // Terminal streaming\n case \"terminal:list\":\n this.handleTerminalList();\n break;\n\n case \"terminal:attach\":\n await this.handleTerminalAttach(message.target, message.appId);\n break;\n\n case \"terminal:detach\":\n this.handleTerminalDetach(message.target, message.appId);\n break;\n\n case \"terminal:input\":\n this.handleTerminalInput(message.target, message.keys, message.appId);\n break;\n\n case \"terminal:resize\":\n this.handleTerminalResize(message.target, message.cols, message.rows, message.appId);\n break;\n }\n } catch (error) {\n console.error(\"[Viber] Failed to process message:\", error);\n }\n }\n\n // ==================== Task Handling ====================\n\n private async handleTaskSubmit(message: {\n taskId: string;\n goal: string;\n options?: ViberOptions;\n messages?: { role: string; content: string }[];\n }): Promise<void> {\n const { taskId, goal, options, messages } = message;\n\n console.log(`[Viber] Received task: ${taskId}`);\n console.log(`[Viber] Goal: ${goal}`);\n\n const controller = new AbortController();\n this.runningTasks.set(taskId, controller);\n\n this.send({\n type: \"task:started\",\n taskId,\n spaceId: taskId,\n });\n\n try {\n const { streamResult, agent } = await runTask(\n goal,\n {\n taskId,\n model: options?.model,\n singleAgentId: options?.singleAgentId || \"default\",\n signal: controller.signal,\n },\n messages\n );\n\n let finalText = \"\";\n let pendingDelta = \"\";\n let lastProgressAt = 0;\n const flushProgress = (force = false): void => {\n if (!pendingDelta) return;\n const now = Date.now();\n if (!force && now - lastProgressAt < 250) return;\n\n this.send({\n type: \"task:progress\",\n taskId,\n event: {\n kind: \"text-delta\",\n delta: pendingDelta,\n totalLength: finalText.length,\n at: new Date(now).toISOString(),\n },\n });\n pendingDelta = \"\";\n lastProgressAt = now;\n };\n\n this.send({\n type: \"task:progress\",\n taskId,\n event: {\n kind: \"status\",\n phase: \"executing\",\n message: \"Agent execution started\",\n at: new Date().toISOString(),\n },\n });\n\n for await (const part of streamResult.fullStream) {\n switch (part.type) {\n case \"text-delta\":\n if (part.text) {\n finalText += part.text;\n pendingDelta += part.text;\n flushProgress(false);\n }\n break;\n case \"tool-call\":\n this.send({\n type: \"task:progress\",\n taskId,\n event: {\n kind: \"tool-call\",\n toolName: part.toolName,\n toolCallId: part.toolCallId,\n at: new Date().toISOString(),\n },\n });\n break;\n case \"tool-result\":\n this.send({\n type: \"task:progress\",\n taskId,\n event: {\n kind: \"tool-result\",\n toolCallId: part.toolCallId,\n at: new Date().toISOString(),\n },\n });\n break;\n case \"error\":\n throw new Error(part.error?.message || \"Task stream error\");\n case \"finish\":\n flushProgress(true);\n this.send({\n type: \"task:progress\",\n taskId,\n event: {\n kind: \"status\",\n phase: \"verifying\",\n message: \"Agent execution finished, preparing final output\",\n at: new Date().toISOString(),\n },\n });\n break;\n default:\n break;\n }\n }\n\n this.send({\n type: \"task:completed\",\n taskId,\n result: {\n spaceId: taskId,\n text: finalText,\n summary: agent.getSummary(),\n },\n });\n } catch (error: any) {\n if (error?.name === \"AbortError\") {\n console.log(`[Viber] Task ${taskId} stopped`);\n } else {\n console.error(`[Viber] Task ${taskId} execution error:`, error);\n this.send({\n type: \"task:error\",\n taskId,\n error: error.message,\n });\n }\n } finally {\n this.runningTasks.delete(taskId);\n }\n }\n\n private async handleTaskStop(taskId: string): Promise<void> {\n const controller = this.runningTasks.get(taskId);\n if (controller) {\n controller.abort();\n this.runningTasks.delete(taskId);\n console.log(`[Viber] Task stopped: ${taskId}`);\n }\n }\n\n private async handleTaskMessage(\n _taskId: string,\n _message: string\n ): Promise<void> {\n // Daemon is thin: no in-memory conversation. Viber Board sends full messages on next task submit.\n }\n\n // ==================== Terminal Streaming ====================\n\n private handleTerminalList(): void {\n const { apps, sessions, panes } = this.terminalManager.list();\n this.send({ type: \"terminal:list\", apps, sessions, panes });\n }\n\n private async handleTerminalAttach(target: string, appId?: string): Promise<void> {\n console.log(`[Viber] Attaching to terminal: ${target}`);\n const ok = await this.terminalManager.attach(\n target,\n (data) => {\n this.send({ type: \"terminal:output\", target, appId, data });\n },\n () => {\n this.send({ type: \"terminal:detached\", target, appId });\n },\n appId\n );\n this.send({ type: \"terminal:attached\", target, appId, ok });\n }\n\n private handleTerminalDetach(target: string, appId?: string): void {\n console.log(`[Viber] Detaching from terminal: ${target}`);\n this.terminalManager.detach(target, appId);\n this.send({ type: \"terminal:detached\", target, appId });\n }\n\n private handleTerminalInput(target: string, keys: string, appId?: string): void {\n this.terminalManager.sendInput(target, keys, appId);\n }\n\n private handleTerminalResize(\n target: string,\n cols: number,\n rows: number,\n appId?: string\n ): void {\n const ok = this.terminalManager.resize(target, cols, rows, appId);\n this.send({ type: \"terminal:resized\", target, appId, ok });\n }\n\n // ==================== Communication ====================\n\n private send(message: ControllerClientMessage): void {\n if (this.ws && this.isConnected) {\n this.ws.send(JSON.stringify(message));\n }\n }\n\n // ==================== Heartbeat ====================\n\n private startHeartbeat(): void {\n const interval = this.config.heartbeatInterval || 30000;\n this.heartbeatTimer = setInterval(() => {\n const status: ViberStatus = {\n platform: process.platform,\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n runningTasks: this.runningTasks.size,\n };\n\n this.send({ type: \"heartbeat\", status });\n }, interval);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n // ==================== Reconnection ====================\n\n private scheduleReconnect(): void {\n if (!this.shouldReconnect) return;\n\n const interval = this.config.reconnectInterval || 5000;\n console.log(`[Viber] Reconnecting in ${interval}ms...`);\n\n this.reconnectTimer = setTimeout(() => {\n this.connect();\n }, interval);\n }\n}\n","import { z } from \"zod\";\nimport { BrowserCDP, CDPTarget } from \"../../tools/browser\";\n\n/**\n * Domain Logic for Antigravity App\n * Auto-healer that detects and recovers from agent errors\n */\n\n// Helper function to click the Retry button\nasync function clickRetryButton(cdp: BrowserCDP, page: CDPTarget): Promise<boolean> {\n const clicked = await cdp.evaluate(page, `\n (function() {\n const iframe = document.getElementById('antigravity.agentPanel');\n if (!iframe) return false;\n \n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n if (!iframeDoc) return false;\n \n const cascadeEl = iframeDoc.getElementById('cascade');\n const searchDoc = cascadeEl || iframeDoc;\n \n const buttons = searchDoc.querySelectorAll('button');\n const retryBtn = Array.from(buttons).find(\n b => b.textContent.trim() === 'Retry'\n );\n \n if (retryBtn) {\n retryBtn.click();\n return true;\n }\n return false;\n })()\n `);\n return !!clicked;\n}\n\nexport function getTools() {\n return {\n antigravity_check_and_heal: {\n description: \"Check Antigravity IDE for errors and automatically recover if found. This is an all-in-one health check that both detects AND fixes issues.\",\n inputSchema: z.object({}),\n execute: async () => {\n const cdp = new BrowserCDP({ port: 9333 });\n const targets = await cdp.listTargets();\n\n const pages = targets.filter(t => t.type === 'page' && !t.url.startsWith('chrome'));\n\n if (pages.length === 0) {\n return { status: \"NO_BROWSER\", message: \"No active browser page found.\" };\n }\n\n // Check ALL pages for errors\n for (const page of pages) {\n let result: any;\n try {\n result = await cdp.evaluate(page, `\n (function() {\n const iframe = document.getElementById('antigravity.agentPanel');\n if (!iframe) {\n return { hasError: false, hasRetryButton: false, iframeFound: false };\n }\n \n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n if (!iframeDoc) {\n return { hasError: false, hasRetryButton: false, iframeFound: true, cannotAccess: true };\n }\n \n const cascadeEl = iframeDoc.getElementById('cascade');\n const searchDoc = cascadeEl || iframeDoc;\n const searchText = (cascadeEl ? cascadeEl.innerText : iframeDoc.body?.innerText) || '';\n \n const hasError = searchText.includes('Agent terminated due to error');\n \n let hasRetryButton = false;\n if (hasError) {\n const buttons = searchDoc.querySelectorAll('button');\n hasRetryButton = Array.from(buttons).some(b => b.textContent.trim() === 'Retry');\n }\n \n return { hasError, hasRetryButton, iframeFound: true, cascadeFound: !!cascadeEl };\n })()\n `);\n } catch (err: any) {\n continue; // Skip this page and try the next\n }\n\n // If error found, AUTO-RECOVER immediately\n if (result?.hasError && result?.hasRetryButton) {\n const clicked = await clickRetryButton(cdp, page);\n\n if (clicked) {\n return {\n status: \"RECOVERED\",\n message: `Found error, clicked Retry button automatically`,\n pageUrl: page.url?.slice(0, 80)\n };\n } else {\n console.log(`[Antigravity] ❌ Failed to click Retry button`);\n return {\n status: \"RECOVERY_FAILED\",\n message: `Found error but failed to click Retry button`,\n pageUrl: page.url?.slice(0, 80)\n };\n }\n }\n\n // Error without retry button\n if (result?.hasError) {\n return {\n status: \"ERROR_NO_RETRY\",\n message: `Error detected but no Retry button found`,\n pageUrl: page.url?.slice(0, 80)\n };\n }\n }\n\n // No errors found\n return { status: \"HEALTHY\", message: `All ${pages.length} page(s) are healthy` };\n },\n },\n };\n}\n","import { z } from \"zod\";\nimport { execSync, spawnSync } from \"child_process\";\nimport * as path from \"path\";\n\nconst TMUX_SESSION = \"cursor-agent\";\n\n/**\n * Run Cursor CLI (agent) inside tmux so it gets a PTY.\n * Direct agent -p \"...\" from subprocess hangs; tmux provides a pseudo-terminal.\n */\nfunction runInTmux(goal: string, cwd: string, waitSeconds: number): string {\n // Ensure tmux session exists (create or reuse)\n execSync(\n `tmux has-session -t ${TMUX_SESSION} 2>/dev/null || tmux new-session -d -s ${TMUX_SESSION}`,\n {\n encoding: \"utf8\",\n stdio: \"pipe\",\n },\n );\n\n // cd to cwd (quote if path has spaces)\n const cdCmd = cwd.includes(\" \")\n ? `cd \"${cwd.replace(/\"/g, '\\\\\"')}\"`\n : `cd ${cwd}`;\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", TMUX_SESSION, cdCmd, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n // Send agent -p 'goal' (spawn avoids shell escaping of goal)\n const sendArg = `agent -p ${JSON.stringify(goal)}`;\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", TMUX_SESSION, sendArg, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n // Workspace trust: after a few seconds send \"a\" to accept (first run only; harmless if not prompted)\n execSync(\"sleep 3\", { encoding: \"utf8\", stdio: \"pipe\" });\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", TMUX_SESSION, \"a\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n // Wait for completion\n execSync(`sleep ${Math.max(10, waitSeconds)}`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n const out = execSync(`tmux capture-pane -t ${TMUX_SESSION} -p -S -200`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return out;\n}\n\nexport function getTools(): Record<string, import(\"../../core/tool\").CoreTool> {\n return {\n cursor_agent_run: {\n description:\n \"Run the Cursor CLI (agent) with the given prompt. Call this whenever the user says 'use cursor-agent', 'cursor agent', 'run the Cursor CLI', or asks to delegate a coding task to Cursor—pass their task as the goal. Runs in tmux (TTY required). Requires tmux and Cursor CLI installed.\",\n inputSchema: z.object({\n goal: z\n .string()\n .describe(\n \"The task or prompt to send to the Cursor agent (e.g. 'Refactor this file to use async/await')\",\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Working directory for the agent (defaults to current process cwd)\",\n ),\n waitSeconds: z\n .number()\n .optional()\n .default(45)\n .describe(\n \"Seconds to wait before capturing output (agent may still be running)\",\n ),\n }),\n execute: async (args: {\n goal: string;\n cwd?: string;\n waitSeconds?: number;\n }) => {\n const cwd = args.cwd ? path.resolve(args.cwd) : process.cwd();\n const waitSeconds = args.waitSeconds ?? 45;\n try {\n const output = runInTmux(args.goal, cwd, waitSeconds);\n return { ok: true, output, cwd };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), cwd };\n }\n },\n },\n };\n}\n","import { z } from \"zod\";\nimport { execSync, spawnSync } from \"child_process\";\nimport * as path from \"path\";\n\nconst SAFE_RE = /[^a-zA-Z0-9_.:-]/g;\n\nfunction safeTarget(t: string): string {\n return t.replace(SAFE_RE, \"-\");\n}\n\n/**\n * Run a command inside a tmux session and capture pane output.\n * Use for CLIs that require a TTY (e.g. Cursor agent, interactive REPLs).\n */\nfunction runInTmux(\n sessionName: string,\n command: string,\n cwd: string,\n waitSeconds: number,\n): string {\n const safeSession = sessionName.replace(SAFE_RE, \"-\");\n execSync(\n `tmux has-session -t ${safeSession} 2>/dev/null || tmux new-session -d -s ${safeSession}`,\n { encoding: \"utf8\", stdio: \"pipe\" },\n );\n\n const cdCmd = cwd.includes(\" \")\n ? `cd \"${cwd.replace(/\"/g, '\\\\\"')}\"`\n : `cd ${cwd}`;\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", safeSession, cdCmd, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", safeSession, command, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n execSync(`sleep ${Math.max(1, waitSeconds)}`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n const out = execSync(`tmux capture-pane -t ${safeSession} -p -S -200`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return out;\n}\n\nexport function getTools(): Record<string, import(\"../../core/tool\").CoreTool> {\n return {\n tmux_install_check: {\n description:\n \"Check if tmux is installed and return its version. Call when the user says 'use tmux' or before using any tmux_* tool; if not installed, tell the user to install (e.g. brew install tmux on macOS).\",\n inputSchema: z.object({}),\n execute: async () => {\n try {\n const out = execSync(\"tmux -V\", {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return { installed: true, version: out.trim() };\n } catch {\n return {\n installed: false,\n hint: \"Install with: brew install tmux (macOS) or sudo apt install tmux (Ubuntu)\",\n };\n }\n },\n },\n tmux_new_session: {\n description:\n \"Create a new detached tmux session. Use when the user asks to set up a coding session or create a new tmux session. Optionally set the first window name and/or start directory.\",\n inputSchema: z.object({\n sessionName: z.string().describe(\"Session name (e.g. 'coding')\"),\n firstWindowName: z\n .string()\n .optional()\n .describe(\"Name for the first window (e.g. 'cursor-1')\"),\n startDirectory: z\n .string()\n .optional()\n .describe(\"Working directory for the first window\"),\n }),\n execute: async (args: {\n sessionName: string;\n firstWindowName?: string;\n startDirectory?: string;\n }) => {\n const target = safeTarget(args.sessionName);\n try {\n const cmd = [\"new-session\", \"-d\", \"-s\", target];\n if (args.firstWindowName) {\n cmd.push(\"-n\", safeTarget(args.firstWindowName));\n }\n if (args.startDirectory) {\n cmd.push(\"-c\", path.resolve(args.startDirectory));\n }\n execSync(`tmux ${cmd.map((c) => `'${c}'`).join(\" \")}`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return {\n ok: true,\n sessionName: target,\n message: `Session '${target}' created. Attach with: tmux attach -t ${target}`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), sessionName: target };\n }\n },\n },\n tmux_new_window: {\n description:\n \"Create a new window in an existing tmux session. Use to add Cursor Agent, Claude Code, Codex CLI, or dev server terminals. Optionally set window name and command to run.\",\n inputSchema: z.object({\n target: z\n .string()\n .describe(\n \"Session name or session:window (e.g. 'coding' or 'coding:1'). New window is created in the session.\",\n ),\n windowName: z\n .string()\n .optional()\n .describe(\"Name for the new window (e.g. 'cursor-2', 'codex-a')\"),\n command: z\n .string()\n .optional()\n .describe(\n \"Command to run in the new window (e.g. 'agent' or 'cd /path && npm run dev'). If omitted, just opens a shell.\",\n ),\n cwd: z.string().optional().describe(\"Working directory for the new window\"),\n }),\n execute: async (args: {\n target: string;\n windowName?: string;\n command?: string;\n cwd?: string;\n }) => {\n const sessionPart = args.target.split(\":\")[0];\n const session = safeTarget(sessionPart);\n try {\n const newWinArgs = [\"new-window\", \"-t\", session, \"-d\"];\n if (args.windowName) {\n newWinArgs.push(\"-n\", safeTarget(args.windowName));\n }\n if (args.cwd) {\n newWinArgs.push(\"-c\", path.resolve(args.cwd));\n }\n spawnSync(\"tmux\", newWinArgs, { encoding: \"utf8\", stdio: \"pipe\" });\n if (args.command) {\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", session, args.command, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n }\n return {\n ok: true,\n session,\n windowName: args.windowName ?? \"(new)\",\n message: `New window created in session '${session}'. Attach with: tmux attach -t ${session}`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), session };\n }\n },\n },\n tmux_split_pane: {\n description:\n \"Split the current pane in a tmux window (horizontal or vertical). Use to add a dev server pane next to a Cursor window, or to run a command in a new pane.\",\n inputSchema: z.object({\n target: z\n .string()\n .describe(\n \"Session, session:window, or session:window.pane (e.g. 'coding:2' or 'coding:cursor-1')\",\n ),\n vertical: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"If true, split vertically (side by side); otherwise split horizontally\"),\n command: z\n .string()\n .optional()\n .describe(\"Command to run in the new pane (e.g. 'npm run dev')\"),\n cwd: z.string().optional().describe(\"Working directory for the new pane\"),\n }),\n execute: async (args: {\n target: string;\n vertical?: boolean;\n command?: string;\n cwd?: string;\n }) => {\n const t = safeTarget(args.target);\n try {\n const splitArgs = [\"split-window\", \"-t\", t, \"-d\"];\n if (args.vertical) {\n splitArgs.push(\"-h\");\n }\n if (args.cwd) {\n splitArgs.push(\"-c\", path.resolve(args.cwd));\n }\n spawnSync(\"tmux\", splitArgs, { encoding: \"utf8\", stdio: \"pipe\" });\n\n if (args.command) {\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", t, args.command, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n }\n return {\n ok: true,\n target: t,\n message: `Pane split in '${t}'. Attach with: tmux attach -t ${t.split(\":\")[0]}`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), target: t };\n }\n },\n },\n tmux_send_keys: {\n description:\n \"Send keys (or a command) to a specific tmux target: session, session:window, or session:window.pane. Use to run a command in an existing pane or to type into a specific terminal.\",\n inputSchema: z.object({\n target: z\n .string()\n .describe(\n \"Tmux target: session (e.g. 'coding'), session:window ('coding:1' or 'coding:cursor-1'), or session:window.pane ('coding:1.0')\",\n ),\n keys: z\n .string()\n .describe(\n \"Keys or command to send (e.g. 'npm run dev' or 'agent -p \\\"task\\\"'). Use 'Enter' for newline.\",\n ),\n pressEnter: z\n .boolean()\n .optional()\n .default(true)\n .describe(\"If true, send Enter after the keys\"),\n }),\n execute: async (args: { target: string; keys: string; pressEnter?: boolean }) => {\n const t = safeTarget(args.target);\n try {\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", t, args.keys, ...(args.pressEnter !== false ? [\"Enter\"] : [])], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return { ok: true, target: t };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), target: t };\n }\n },\n },\n tmux_list: {\n description:\n \"List tmux sessions, or list windows and panes for a session. Use when the user asks 'what is my tmux layout' or 'list my terminals' so you can describe the layout or choose where to open the next window.\",\n inputSchema: z.object({\n sessionName: z\n .string()\n .optional()\n .describe(\n \"If provided, list windows and panes for this session; otherwise list all sessions\",\n ),\n }),\n execute: async (args: { sessionName?: string }) => {\n try {\n if (args.sessionName) {\n const session = safeTarget(args.sessionName);\n const windows = execSync(`tmux list-windows -t ${session} -F '#{window_index} #{window_name}' 2>/dev/null || true`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n }).trim();\n const panes = execSync(`tmux list-panes -t ${session} -F '#{window_index}.#{pane_index} #{pane_current_command}' 2>/dev/null || true`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n }).trim();\n return {\n ok: true,\n session,\n windows: windows ? windows.split(\"\\n\") : [],\n panes: panes ? panes.split(\"\\n\") : [],\n };\n }\n const sessions = execSync(\"tmux list-sessions -F '#{session_name}' 2>/dev/null || true\", {\n encoding: \"utf8\",\n stdio: \"pipe\",\n }).trim();\n return {\n ok: true,\n sessions: sessions ? sessions.split(\"\\n\") : [],\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err) };\n }\n },\n },\n tmux_run: {\n description:\n \"Run a shell command inside a tmux session and return the pane output. Call when the user says 'use tmux' or asks to run a command in a terminal/tmux. Use for CLIs that require a TTY. Requires tmux installed (use tmux_install_check first).\",\n inputSchema: z.object({\n sessionName: z\n .string()\n .describe(\"Tmux session name (e.g. 'cursor-agent' or 'mytask')\"),\n command: z\n .string()\n .describe(\n 'Full command to run (e.g. \"agent -p \\'Refactor this file\\'\" or \"npm run dev\")',\n ),\n cwd: z\n .string()\n .optional()\n .describe(\"Working directory (defaults to process cwd)\"),\n waitSeconds: z\n .number()\n .optional()\n .default(15)\n .describe(\"Seconds to wait before capturing output\"),\n }),\n execute: async (args: {\n sessionName: string;\n command: string;\n cwd?: string;\n waitSeconds?: number;\n }) => {\n const cwd = args.cwd ? path.resolve(args.cwd) : process.cwd();\n const waitSeconds = args.waitSeconds ?? 15;\n try {\n const output = runInTmux(\n args.sessionName,\n args.command,\n cwd,\n waitSeconds,\n );\n return { ok: true, output, cwd, sessionName: args.sessionName };\n } catch (err: any) {\n return {\n ok: false,\n error: err?.message || String(err),\n cwd,\n sessionName: args.sessionName,\n };\n }\n },\n },\n };\n}\n","import { defaultRegistry } from \"./registry\";\nimport { getTools as getAntigravityTools } from \"./antigravity\";\nimport { getTools as getCursorAgentTools } from \"./cursor-agent\";\nimport { getTools as getTmuxTools } from \"./tmux\";\n\n// Register default skills and their tools\n// This is called during module initialization to pre-register tools\n// that would otherwise fail to load at runtime (Node.js can't import .ts files)\nexport function registerDefaultSkills() {\n // Pre-register antigravity tools so they're available at runtime\n defaultRegistry.preRegisterTools(\"antigravity\", getAntigravityTools());\n // Pre-register cursor-agent tools (run Cursor CLI via tmux)\n defaultRegistry.preRegisterTools(\"cursor-agent\", getCursorAgentTools());\n // Pre-register tmux tools (run commands in tmux, check install)\n defaultRegistry.preRegisterTools(\"tmux\", getTmuxTools());\n}\n\n// Auto-register on import\nregisterDefaultSkills();\n","/**\n * Local WebSocket server for terminal streaming (and other local features).\n * \n * This runs alongside the viber daemon and allows the Viber Board to connect\n * directly for terminal streaming without needing an external hub.\n */\n\nimport { WebSocketServer, WebSocket } from \"ws\";\nimport { TerminalManager } from \"./terminal\";\n\nexport interface LocalServerConfig {\n port: number;\n}\n\nexport class LocalServer {\n private wss: WebSocketServer | null = null;\n private terminalManager = new TerminalManager();\n private clients: Set<WebSocket> = new Set();\n\n constructor(private config: LocalServerConfig) {}\n\n async start(): Promise<void> {\n return new Promise((resolve) => {\n this.wss = new WebSocketServer({ port: this.config.port });\n\n this.wss.on(\"listening\", () => {\n console.log(`[Viber] Local WebSocket server listening on port ${this.config.port}`);\n resolve();\n });\n\n this.wss.on(\"connection\", (ws) => {\n console.log(\"[Viber] Local client connected\");\n this.clients.add(ws);\n\n ws.on(\"message\", (data) => {\n try {\n const msg = JSON.parse(data.toString());\n this.handleMessage(ws, msg);\n } catch (err) {\n console.error(\"[Viber] Failed to parse message:\", err);\n }\n });\n\n ws.on(\"close\", () => {\n console.log(\"[Viber] Local client disconnected\");\n this.clients.delete(ws);\n });\n\n ws.on(\"error\", (err) => {\n console.error(\"[Viber] WebSocket error:\", err);\n this.clients.delete(ws);\n });\n });\n\n this.wss.on(\"error\", (err) => {\n console.error(\"[Viber] WebSocket server error:\", err);\n });\n });\n }\n\n async stop(): Promise<void> {\n this.terminalManager.detachAll();\n \n for (const ws of this.clients) {\n ws.close();\n }\n this.clients.clear();\n\n return new Promise((resolve) => {\n if (this.wss) {\n this.wss.close(() => {\n console.log(\"[Viber] Local WebSocket server stopped\");\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n private handleMessage(ws: WebSocket, msg: any): void {\n switch (msg.type) {\n case \"terminal:list\":\n this.handleTerminalList(ws);\n break;\n\n case \"terminal:attach\":\n this.handleTerminalAttach(ws, msg.target, msg.appId);\n break;\n\n case \"terminal:detach\":\n this.handleTerminalDetach(ws, msg.target, msg.appId);\n break;\n\n case \"terminal:input\":\n this.handleTerminalInput(msg.target, msg.keys, msg.appId);\n break;\n\n case \"terminal:resize\":\n this.handleTerminalResize(ws, msg.target, msg.cols, msg.rows, msg.appId);\n break;\n\n case \"terminal:create-session\":\n this.handleTerminalCreateSession(\n ws,\n msg.sessionName,\n msg.windowName,\n msg.cwd,\n msg.appId\n );\n break;\n\n default:\n console.log(`[Viber] Unknown message type: ${msg.type}`);\n }\n }\n\n private handleTerminalList(ws: WebSocket): void {\n const { apps, sessions, panes } = this.terminalManager.list();\n this.send(ws, { type: \"terminal:list\", apps, sessions, panes });\n }\n\n private async handleTerminalAttach(\n ws: WebSocket,\n target: string,\n appId?: string\n ): Promise<void> {\n console.log(`[Viber] Attaching to terminal: ${target}`);\n const ok = await this.terminalManager.attach(\n target,\n (data) => {\n this.send(ws, { type: \"terminal:output\", target, appId, data });\n },\n () => {\n this.send(ws, { type: \"terminal:detached\", target, appId });\n },\n appId\n );\n this.send(ws, { type: \"terminal:attached\", target, appId, ok });\n }\n\n private handleTerminalDetach(ws: WebSocket, target: string, appId?: string): void {\n console.log(`[Viber] Detaching from terminal: ${target}`);\n this.terminalManager.detach(target, appId);\n this.send(ws, { type: \"terminal:detached\", target, appId });\n }\n\n private handleTerminalInput(target: string, keys: string, appId?: string): void {\n this.terminalManager.sendInput(target, keys, appId);\n }\n\n private handleTerminalResize(\n ws: WebSocket,\n target: string,\n cols: number,\n rows: number,\n appId?: string\n ): void {\n const ok = this.terminalManager.resize(target, cols, rows, appId);\n this.send(ws, { type: \"terminal:resized\", target, appId, ok });\n }\n\n private handleTerminalCreateSession(\n ws: WebSocket,\n sessionName?: string,\n windowName?: string,\n cwd?: string,\n appId = \"tmux\"\n ): void {\n const result = this.terminalManager.createSession(\n sessionName || \"coding\",\n windowName || \"main\",\n cwd,\n appId\n );\n\n this.send(ws, {\n type: \"terminal:session-created\",\n ...result,\n });\n\n if (result.ok) {\n // Keep client in sync immediately after creation\n this.handleTerminalList(ws);\n }\n }\n\n private send(ws: WebSocket, msg: any): void {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(msg));\n }\n }\n}\n","/**\n * Hub Server - Central coordinator for viber daemons\n *\n * The hub accepts WebSocket connections from viber daemons and provides\n * a REST API for the Viber Board to manage them.\n *\n * REST API (for Viber Board):\n * GET /health - Health check\n * GET /api/vibers - List connected vibers\n * POST /api/vibers - Submit task to a viber\n * GET /api/tasks - List all tasks\n * GET /api/tasks/:id - Get task status\n * POST /api/tasks/:id/stop - Stop a task\n *\n * WebSocket (for viber daemons):\n * ws://localhost:6007/ws - Viber daemon connection endpoint\n */\n\nimport { createServer, IncomingMessage, ServerResponse } from \"http\";\nimport { WebSocketServer, WebSocket } from \"ws\";\nimport { URL } from \"url\";\n\nexport interface HubConfig {\n port: number;\n}\n\ninterface ConnectedViber {\n id: string;\n name: string;\n version: string;\n platform: string;\n capabilities: string[];\n skills?: { id: string; name: string; description: string }[];\n ws: WebSocket;\n connectedAt: Date;\n lastHeartbeat: Date;\n runningTasks: string[];\n}\n\ninterface TaskEvent {\n at: string;\n event: any;\n}\n\ninterface Task {\n id: string;\n viberId: string;\n goal: string;\n status: \"pending\" | \"running\" | \"completed\" | \"error\" | \"stopped\";\n result?: any;\n error?: string;\n createdAt: Date;\n completedAt?: Date;\n events: TaskEvent[];\n partialText?: string;\n}\n\nexport class HubServer {\n private server: ReturnType<typeof createServer> | null = null;\n private wss: WebSocketServer | null = null;\n private vibers: Map<string, ConnectedViber> = new Map();\n private tasks: Map<string, Task> = new Map();\n\n constructor(private config: HubConfig) {}\n\n async start(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.server = createServer((req, res) => this.handleHttp(req, res));\n\n this.server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n console.error(`[Hub] Port ${this.config.port} is already in use.`);\n console.error(\n `[Hub] Kill the existing process with: lsof -ti :${this.config.port} | xargs kill`\n );\n reject(err);\n } else {\n reject(err);\n }\n });\n\n this.wss = new WebSocketServer({ noServer: true });\n\n this.server.on(\"upgrade\", (request, socket, head) => {\n if (request.url === \"/ws\") {\n this.wss!.handleUpgrade(request, socket, head, (ws) => {\n this.wss!.emit(\"connection\", ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n this.wss.on(\"connection\", (ws, req) => {\n this.handleViberConnection(ws, req);\n });\n\n this.server.listen(this.config.port, () => {\n console.log(`[Hub] Server listening on port ${this.config.port}`);\n console.log(`[Hub] REST API: http://localhost:${this.config.port}`);\n console.log(`[Hub] WebSocket: ws://localhost:${this.config.port}/ws`);\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n // Close all viber connections\n for (const viber of this.vibers.values()) {\n viber.ws.close();\n }\n this.vibers.clear();\n\n return new Promise((resolve) => {\n // Close WebSocket server first\n if (this.wss) {\n this.wss.close(() => {\n // Then close HTTP server\n if (this.server) {\n this.server.close(() => {\n console.log(\"[Hub] Server stopped\");\n resolve();\n });\n } else {\n resolve();\n }\n });\n } else if (this.server) {\n this.server.close(() => {\n console.log(\"[Hub] Server stopped\");\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n\n // ==================== HTTP Handler ====================\n\n private handleHttp(req: IncomingMessage, res: ServerResponse): void {\n const url = new URL(req.url || \"/\", `http://localhost:${this.config.port}`);\n const method = req.method || \"GET\";\n\n // CORS headers\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\n \"Access-Control-Allow-Headers\",\n \"Content-Type, Authorization\"\n );\n\n if (method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n // Route handling\n if (url.pathname === \"/health\" && method === \"GET\") {\n this.handleHealth(res);\n } else if (url.pathname === \"/api/vibers\" && method === \"GET\") {\n this.handleListVibers(res);\n } else if (url.pathname === \"/api/vibers\" && method === \"POST\") {\n this.handleSubmitTask(req, res);\n } else if (url.pathname === \"/api/tasks\" && method === \"GET\") {\n this.handleListTasks(res);\n } else if (\n url.pathname.match(/^\\/api\\/tasks\\/[^/]+$/) &&\n method === \"GET\"\n ) {\n const taskId = url.pathname.split(\"/\").pop()!;\n this.handleGetTask(taskId, res);\n } else if (\n url.pathname.match(/^\\/api\\/tasks\\/[^/]+\\/stop$/) &&\n method === \"POST\"\n ) {\n const taskId = url.pathname.split(\"/\")[3];\n this.handleStopTask(taskId, res);\n } else {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n }\n }\n\n private handleHealth(res: ServerResponse): void {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n status: \"ok\",\n vibers: this.vibers.size,\n tasks: this.tasks.size,\n })\n );\n }\n\n private handleListVibers(res: ServerResponse): void {\n const vibers = Array.from(this.vibers.values()).map((v) => ({\n id: v.id,\n name: v.name,\n version: v.version,\n platform: v.platform,\n capabilities: v.capabilities,\n skills: v.skills,\n connectedAt: v.connectedAt.toISOString(),\n lastHeartbeat: v.lastHeartbeat.toISOString(),\n runningTasks: v.runningTasks,\n }));\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ connected: true, vibers }));\n }\n\n private handleSubmitTask(req: IncomingMessage, res: ServerResponse): void {\n let body = \"\";\n req.on(\"data\", (chunk) => (body += chunk));\n req.on(\"end\", () => {\n try {\n const { goal, viberId, messages } = JSON.parse(body);\n\n if (!goal) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Missing goal\" }));\n return;\n }\n\n // Find viber (use specified or first available)\n let viber: ConnectedViber | undefined;\n if (viberId) {\n viber = this.vibers.get(viberId);\n } else {\n viber = this.vibers.values().next().value;\n }\n\n if (!viber) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"No viber available\" }));\n return;\n }\n\n // Create task\n const taskId = `task-${Date.now()}-${Math.random()\n .toString(36)\n .slice(2, 8)}`;\n const task: Task = {\n id: taskId,\n viberId: viber.id,\n goal,\n status: \"pending\",\n createdAt: new Date(),\n events: [],\n partialText: \"\",\n };\n this.tasks.set(taskId, task);\n\n // Send to viber\n viber.ws.send(\n JSON.stringify({\n type: \"task:submit\",\n taskId,\n goal,\n messages,\n })\n );\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ taskId, viberId: viber.id }));\n } catch (error) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid request body\" }));\n }\n });\n }\n\n private handleListTasks(res: ServerResponse): void {\n const tasks = Array.from(this.tasks.values()).map((t) => ({\n id: t.id,\n viberId: t.viberId,\n goal: t.goal,\n status: t.status,\n createdAt: t.createdAt.toISOString(),\n completedAt: t.completedAt?.toISOString(),\n eventCount: t.events.length,\n partialText: t.partialText,\n }));\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ tasks }));\n }\n\n private handleGetTask(taskId: string, res: ServerResponse): void {\n const task = this.tasks.get(taskId);\n\n if (!task) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Task not found\" }));\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: task.id,\n viberId: task.viberId,\n goal: task.goal,\n status: task.status,\n result: task.result,\n error: task.error,\n createdAt: task.createdAt.toISOString(),\n completedAt: task.completedAt?.toISOString(),\n events: task.events,\n eventCount: task.events.length,\n partialText: task.partialText,\n })\n );\n }\n\n private handleStopTask(taskId: string, res: ServerResponse): void {\n const task = this.tasks.get(taskId);\n\n if (!task) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Task not found\" }));\n return;\n }\n\n const viber = this.vibers.get(task.viberId);\n if (viber) {\n viber.ws.send(JSON.stringify({ type: \"task:stop\", taskId }));\n }\n\n task.status = \"stopped\";\n task.completedAt = new Date();\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n }\n\n // ==================== WebSocket Handler ====================\n\n private handleViberConnection(ws: WebSocket, req: IncomingMessage): void {\n const viberId = req.headers[\"x-viber-id\"] as string;\n console.log(`[Hub] Viber connecting: ${viberId || \"unknown\"}`);\n\n ws.on(\"message\", (data) => {\n try {\n const msg = JSON.parse(data.toString());\n this.handleViberMessage(ws, msg);\n } catch (error) {\n console.error(\"[Hub] Failed to parse viber message:\", error);\n }\n });\n\n ws.on(\"close\", () => {\n // Find and remove viber\n for (const [id, viber] of this.vibers) {\n if (viber.ws === ws) {\n console.log(`[Hub] Viber disconnected: ${id}`);\n this.vibers.delete(id);\n break;\n }\n }\n });\n\n ws.on(\"error\", (error) => {\n console.error(\"[Hub] Viber WebSocket error:\", error);\n });\n }\n\n private handleViberMessage(ws: WebSocket, msg: any): void {\n switch (msg.type) {\n case \"connected\":\n this.handleViberConnected(ws, msg.viber);\n break;\n\n case \"task:started\":\n this.handleTaskStarted(msg.taskId);\n break;\n\n case \"task:progress\":\n this.handleTaskProgress(msg.taskId, msg.event);\n break;\n\n case \"task:completed\":\n this.handleTaskCompleted(msg.taskId, msg.result);\n break;\n\n case \"task:error\":\n this.handleTaskError(msg.taskId, msg.error);\n break;\n\n case \"heartbeat\":\n this.handleHeartbeat(ws);\n break;\n\n case \"pong\":\n // Response to ping, update lastHeartbeat\n this.handleHeartbeat(ws);\n break;\n\n default:\n console.log(`[Hub] Unknown message type: ${msg.type}`);\n }\n }\n\n private handleViberConnected(ws: WebSocket, viber: any): void {\n console.log(`[Hub] Viber registered: ${viber.id} (${viber.name})`);\n\n this.vibers.set(viber.id, {\n id: viber.id,\n name: viber.name,\n version: viber.version,\n platform: viber.platform,\n capabilities: viber.capabilities || [],\n skills: viber.skills,\n ws,\n connectedAt: new Date(),\n lastHeartbeat: new Date(),\n runningTasks: viber.runningTasks || [],\n });\n }\n\n private handleTaskStarted(taskId: string): void {\n const task = this.tasks.get(taskId);\n if (task) {\n task.status = \"running\";\n console.log(`[Hub] Task started: ${taskId}`);\n }\n }\n\n private handleTaskCompleted(taskId: string, result: any): void {\n const task = this.tasks.get(taskId);\n if (task) {\n task.status = \"completed\";\n task.result = result;\n task.completedAt = new Date();\n if (typeof result?.text === \"string\") {\n task.partialText = result.text;\n }\n console.log(`[Hub] Task completed: ${taskId}`);\n }\n }\n\n private handleTaskProgress(taskId: string, event: any): void {\n const task = this.tasks.get(taskId);\n if (!task) return;\n\n const at = new Date().toISOString();\n task.events.push({ at, event });\n if (task.events.length > 500) {\n task.events.shift();\n }\n\n if (event?.kind === \"text-delta\" && typeof event?.delta === \"string\") {\n task.partialText = (task.partialText || \"\") + event.delta;\n if (task.partialText.length > 20000) {\n task.partialText = task.partialText.slice(-20000);\n }\n }\n }\n\n private handleTaskError(taskId: string, error: string): void {\n const task = this.tasks.get(taskId);\n if (task) {\n task.status = \"error\";\n task.error = error;\n task.completedAt = new Date();\n console.log(`[Hub] Task error: ${taskId} - ${error}`);\n }\n }\n\n private handleHeartbeat(ws: WebSocket): void {\n for (const viber of this.vibers.values()) {\n if (viber.ws === ws) {\n viber.lastHeartbeat = new Date();\n break;\n }\n }\n }\n}\n","/**\n * Task - Individual execution units within a space\n */\n\nexport enum TaskStatus {\n PENDING = \"pending\",\n RUNNING = \"running\",\n COMPLETED = \"completed\",\n FAILED = \"failed\",\n BLOCKED = \"blocked\",\n CANCELLED = \"cancelled\",\n}\n\nexport interface TaskStep {\n id: string;\n description: string;\n status: TaskStatus;\n startedAt?: Date;\n completedAt?: Date;\n error?: string;\n}\n\nexport interface TaskDependency {\n taskId: string;\n type: \"required\" | \"optional\";\n}\n\nexport class Task {\n public id: string;\n public title: string;\n public description: string;\n public status: TaskStatus;\n public assignedTo?: string;\n public priority: \"low\" | \"medium\" | \"high\";\n public estimatedTime?: string;\n public actualTime?: string;\n public dependencies: TaskDependency[];\n public steps: TaskStep[];\n public tags: string[];\n public metadata: Record<string, any>;\n public createdAt: Date;\n public updatedAt: Date;\n public startedAt?: Date;\n public completedAt?: Date;\n public error?: string;\n\n constructor({\n id,\n title,\n description,\n status = TaskStatus.PENDING,\n assignedTo,\n priority = \"medium\",\n estimatedTime,\n dependencies = [],\n steps = [],\n tags = [],\n metadata = {},\n }: {\n id: string;\n title: string;\n description: string;\n status?: TaskStatus;\n assignedTo?: string;\n priority?: \"low\" | \"medium\" | \"high\";\n estimatedTime?: string;\n dependencies?: TaskDependency[];\n steps?: TaskStep[];\n tags?: string[];\n metadata?: Record<string, any>;\n }) {\n this.id = id;\n this.title = title;\n this.description = description;\n this.status = status;\n this.assignedTo = assignedTo;\n this.priority = priority;\n this.estimatedTime = estimatedTime;\n this.dependencies = dependencies;\n this.steps = steps;\n this.tags = tags;\n this.metadata = metadata;\n this.createdAt = new Date();\n this.updatedAt = new Date();\n }\n\n start(): void {\n if (this.status !== TaskStatus.PENDING) {\n throw new Error(`Cannot start task in ${this.status} status`);\n }\n this.status = TaskStatus.RUNNING;\n this.startedAt = new Date();\n this.updatedAt = new Date();\n }\n\n complete(): void {\n if (this.status !== TaskStatus.RUNNING) {\n throw new Error(`Cannot complete task in ${this.status} status`);\n }\n this.status = TaskStatus.COMPLETED;\n this.completedAt = new Date();\n this.updatedAt = new Date();\n if (this.startedAt) {\n this.actualTime = this.calculateDuration(\n this.startedAt,\n this.completedAt\n );\n }\n }\n\n fail(error: string): void {\n this.status = TaskStatus.FAILED;\n this.error = error;\n this.completedAt = new Date();\n this.updatedAt = new Date();\n }\n\n block(reason: string): void {\n this.status = TaskStatus.BLOCKED;\n this.error = reason;\n this.updatedAt = new Date();\n }\n\n cancel(): void {\n this.status = TaskStatus.CANCELLED;\n this.completedAt = new Date();\n this.updatedAt = new Date();\n }\n\n isActionable(context?: { getTaskStatus: (id: string) => TaskStatus | undefined }): boolean {\n return (\n this.status === TaskStatus.PENDING && !this.hasBlockingDependencies(context)\n );\n }\n\n hasBlockingDependencies(context?: { getTaskStatus: (id: string) => TaskStatus | undefined }): boolean {\n if (!context || !this.dependencies || this.dependencies.length === 0) {\n return false;\n }\n\n return this.dependencies.some((dep) => {\n // Only required dependencies block execution\n if (dep.type === \"optional\") return false;\n\n const status = context.getTaskStatus(dep.taskId);\n // Block if dependency is not completed (or cancelled/failed if strict, but let's say COMPLETED)\n // If status is undefined (task not found), we assume it's missing -> blocking\n return status !== TaskStatus.COMPLETED;\n });\n }\n\n private calculateDuration(start: Date, end: Date): string {\n const ms = end.getTime() - start.getTime();\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n toJSON(): any {\n return {\n id: this.id,\n title: this.title,\n description: this.description,\n status: this.status,\n assignedTo: this.assignedTo,\n priority: this.priority,\n estimatedTime: this.estimatedTime,\n actualTime: this.actualTime,\n dependencies: this.dependencies,\n steps: this.steps,\n tags: this.tags,\n metadata: this.metadata,\n createdAt: this.createdAt.toISOString(),\n updatedAt: this.updatedAt.toISOString(),\n startedAt: this.startedAt?.toISOString(),\n completedAt: this.completedAt?.toISOString(),\n error: this.error,\n };\n }\n\n static fromJSON(data: any): Task {\n const task = new Task({\n id: data.id,\n title: data.title,\n description: data.description,\n status: data.status,\n assignedTo: data.assignedTo,\n priority: data.priority,\n estimatedTime: data.estimatedTime,\n dependencies: data.dependencies,\n steps: data.steps,\n tags: data.tags,\n metadata: data.metadata,\n });\n\n task.createdAt = new Date(data.createdAt);\n task.updatedAt = new Date(data.updatedAt);\n task.actualTime = data.actualTime;\n task.error = data.error;\n\n if (data.startedAt) {\n task.startedAt = new Date(data.startedAt);\n }\n if (data.completedAt) {\n task.completedAt = new Date(data.completedAt);\n }\n\n return task;\n }\n}\n","/**\n * Plan - Manages the execution plan for a space\n */\n\nimport { Task, TaskStatus } from \"./task\";\n\nexport interface PlanSummary {\n totalTasks: number;\n completedTasks: number;\n runningTasks: number;\n pendingTasks: number;\n failedTasks: number;\n blockedTasks: number;\n progressPercentage: number;\n}\n\nexport class Plan {\n public tasks: Task[];\n public goal: string;\n public createdAt: Date;\n public updatedAt: Date;\n\n constructor({ tasks = [], goal }: { tasks?: Task[]; goal: string }) {\n this.tasks = tasks;\n this.goal = goal;\n this.createdAt = new Date();\n this.updatedAt = new Date();\n }\n\n addTask(task: Task): void {\n this.tasks.push(task);\n this.updatedAt = new Date();\n }\n\n removeTask(taskId: string): boolean {\n const index = this.tasks.findIndex((t) => t.id === taskId);\n if (index >= 0) {\n this.tasks.splice(index, 1);\n this.updatedAt = new Date();\n return true;\n }\n return false;\n }\n\n getTaskById(taskId: string): Task | undefined {\n return this.tasks.find((t) => t.id === taskId);\n }\n\n updateTaskStatus(taskId: string, status: TaskStatus): boolean {\n const task = this.getTaskById(taskId);\n if (task) {\n task.status = status;\n task.updatedAt = new Date();\n this.updatedAt = new Date();\n return true;\n }\n return false;\n }\n\n getNextActionableTask(): Task | undefined {\n return this.tasks.find((task) =>\n task.isActionable({\n getTaskStatus: (id) => this.getTaskById(id)?.status,\n })\n );\n }\n\n getAllActionableTasks(maxTasks?: number): Task[] {\n const actionableTasks = this.tasks.filter((task) =>\n task.isActionable({\n getTaskStatus: (id) => this.getTaskById(id)?.status,\n })\n );\n return maxTasks ? actionableTasks.slice(0, maxTasks) : actionableTasks;\n }\n\n getTasksByStatus(status: TaskStatus): Task[] {\n return this.tasks.filter((task) => task.status === status);\n }\n\n getTasksByAssignee(assignee: string): Task[] {\n return this.tasks.filter((task) => task.assignedTo === assignee);\n }\n\n isComplete(): boolean {\n return this.tasks.every(\n (task) =>\n task.status === TaskStatus.COMPLETED ||\n task.status === TaskStatus.CANCELLED\n );\n }\n\n hasFailedTasks(): boolean {\n return this.tasks.some((task) => task.status === TaskStatus.FAILED);\n }\n\n hasBlockedTasks(): boolean {\n return this.tasks.some((task) => task.status === TaskStatus.BLOCKED);\n }\n\n getProgressSummary(): PlanSummary {\n const summary: PlanSummary = {\n totalTasks: this.tasks.length,\n completedTasks: 0,\n runningTasks: 0,\n pendingTasks: 0,\n failedTasks: 0,\n blockedTasks: 0,\n progressPercentage: 0,\n };\n\n for (const task of this.tasks) {\n switch (task.status) {\n case TaskStatus.COMPLETED:\n summary.completedTasks++;\n break;\n case TaskStatus.RUNNING:\n summary.runningTasks++;\n break;\n case TaskStatus.PENDING:\n summary.pendingTasks++;\n break;\n case TaskStatus.FAILED:\n summary.failedTasks++;\n break;\n case TaskStatus.BLOCKED:\n summary.blockedTasks++;\n break;\n }\n }\n\n if (summary.totalTasks > 0) {\n summary.progressPercentage =\n (summary.completedTasks / summary.totalTasks) * 100;\n }\n\n return summary;\n }\n\n reorderTasks(fromIndex: number, toIndex: number): void {\n if (\n fromIndex < 0 ||\n fromIndex >= this.tasks.length ||\n toIndex < 0 ||\n toIndex >= this.tasks.length\n ) {\n throw new Error(\"Invalid task indices\");\n }\n\n const [task] = this.tasks.splice(fromIndex, 1);\n this.tasks.splice(toIndex, 0, task);\n this.updatedAt = new Date();\n }\n\n toJSON(): any {\n return {\n tasks: this.tasks.map((task) => task.toJSON()),\n goal: this.goal,\n createdAt: this.createdAt.toISOString(),\n updatedAt: this.updatedAt.toISOString(),\n };\n }\n\n static fromJSON(data: any): Plan {\n const plan = new Plan({\n goal: data.goal,\n tasks: data.tasks.map((taskData: any) => Task.fromJSON(taskData)),\n });\n\n plan.createdAt = new Date(data.createdAt);\n plan.updatedAt = new Date(data.updatedAt);\n\n return plan;\n }\n}\n","/**\n * Collaboration Module - Multi-Agent Collaboration Engine\n *\n * Provides:\n * - Parallel agent execution\n * - Agent-to-agent communication\n * - Shared context management\n * - Collaborative planning\n */\n\nimport { Agent } from \"./agent\";\nimport { Space } from \"./space\";\nimport type { AgentResponse } from \"./agent\";\n\nexport interface AgentMessage {\n from: string; // Agent ID\n to: string; // Agent ID or 'broadcast'\n content: string;\n metadata?: Record<string, any>;\n timestamp: Date;\n}\n\nexport interface SharedContext {\n spaceId: string;\n data: Record<string, any>;\n updatedAt: Date;\n updatedBy: string; // Agent ID\n}\n\nexport interface ParallelTask {\n id: string;\n agentId: string;\n messages: any[];\n system?: string;\n metadata?: Record<string, any>;\n priority?: number; // Higher = more important\n}\n\nexport interface ParallelExecutionResult {\n taskId: string;\n agentId: string;\n result: AgentResponse;\n error?: Error;\n duration: number;\n}\n\n/**\n * Agent Collaboration Manager\n * Handles agent-to-agent communication and shared context\n */\nexport class AgentCollaborationManager {\n private space: Space;\n private messageQueue: Map<string, AgentMessage[]>; // Agent ID -> messages\n private sharedContext: SharedContext;\n private listeners: Map<string, Set<(message: AgentMessage) => void>>;\n\n constructor(space: Space) {\n this.space = space;\n this.messageQueue = new Map();\n this.sharedContext = {\n spaceId: space.spaceId,\n data: {},\n updatedAt: new Date(),\n updatedBy: \"system\",\n };\n this.listeners = new Map();\n }\n\n /**\n * Send a message from one agent to another\n */\n sendMessage(\n from: string,\n to: string,\n content: string,\n metadata?: Record<string, any>\n ): void {\n const message: AgentMessage = {\n from,\n to,\n content,\n metadata,\n timestamp: new Date(),\n };\n\n if (to === \"broadcast\") {\n // Broadcast to all agents\n for (const agentId of this.space.agents.keys()) {\n if (agentId !== from) {\n this.queueMessage(agentId, message);\n }\n }\n } else {\n // Send to specific agent\n this.queueMessage(to, message);\n }\n\n // Notify listeners\n this.notifyListeners(to, message);\n if (to !== \"broadcast\") {\n this.notifyListeners(\"broadcast\", message);\n }\n }\n\n /**\n * Queue a message for an agent\n */\n private queueMessage(agentId: string, message: AgentMessage): void {\n if (!this.messageQueue.has(agentId)) {\n this.messageQueue.set(agentId, []);\n }\n this.messageQueue.get(agentId)!.push(message);\n }\n\n /**\n * Get pending messages for an agent\n */\n getMessages(agentId: string): AgentMessage[] {\n const messages = this.messageQueue.get(agentId) || [];\n this.messageQueue.set(agentId, []); // Clear after reading\n return messages;\n }\n\n /**\n * Subscribe to messages for an agent\n */\n subscribe(\n agentId: string,\n callback: (message: AgentMessage) => void\n ): () => void {\n if (!this.listeners.has(agentId)) {\n this.listeners.set(agentId, new Set());\n }\n this.listeners.get(agentId)!.add(callback);\n\n return () => {\n const callbacks = this.listeners.get(agentId);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) {\n this.listeners.delete(agentId);\n }\n }\n };\n }\n\n /**\n * Notify listeners of a new message\n */\n private notifyListeners(agentId: string, message: AgentMessage): void {\n const callbacks = this.listeners.get(agentId);\n if (callbacks) {\n callbacks.forEach((cb) => {\n try {\n cb(message);\n } catch (error) {\n console.error(`[AgentCollaborationManager] Listener error:`, error);\n }\n });\n }\n }\n\n /**\n * Update shared context\n */\n updateContext(agentId: string, updates: Record<string, any>): void {\n this.sharedContext.data = {\n ...this.sharedContext.data,\n ...updates,\n };\n this.sharedContext.updatedAt = new Date();\n this.sharedContext.updatedBy = agentId;\n }\n\n /**\n * Get shared context\n */\n getContext(): SharedContext {\n return { ...this.sharedContext };\n }\n\n /**\n * Get a specific value from shared context\n */\n getContextValue(key: string): any {\n return this.sharedContext.data[key];\n }\n}\n\n/**\n * Parallel Execution Engine\n * Executes multiple agent tasks in parallel\n */\nexport class ParallelExecutionEngine {\n private space: Space;\n private maxConcurrency: number;\n private activeTasks: Map<string, Promise<ParallelExecutionResult>>;\n\n constructor(space: Space, maxConcurrency: number = 3) {\n this.space = space;\n this.maxConcurrency = maxConcurrency;\n this.activeTasks = new Map();\n }\n\n /**\n * Execute multiple tasks in parallel\n */\n async executeParallel(\n tasks: ParallelTask[]\n ): Promise<ParallelExecutionResult[]> {\n // Sort by priority (higher first)\n const sortedTasks = [...tasks].sort(\n (a, b) => (b.priority || 0) - (a.priority || 0)\n );\n\n // Execute in batches\n const results: ParallelExecutionResult[] = [];\n const executing: Promise<ParallelExecutionResult>[] = [];\n\n for (const task of sortedTasks) {\n // Wait if we've reached max concurrency\n if (executing.length >= this.maxConcurrency) {\n const completed = await Promise.race(executing);\n const index = executing.findIndex(\n (p) => p === Promise.resolve(completed)\n );\n if (index >= 0) {\n executing.splice(index, 1);\n }\n results.push(completed);\n }\n\n // Start execution\n const promise = this.executeTask(task);\n executing.push(promise);\n this.activeTasks.set(task.id, promise);\n }\n\n // Wait for remaining tasks\n const remaining = await Promise.allSettled(executing);\n for (const result of remaining) {\n if (result.status === \"fulfilled\") {\n results.push(result.value);\n } else {\n // Handle rejected promises\n console.error(\"[ParallelExecutionEngine] Task failed:\", result.reason);\n }\n }\n\n this.activeTasks.clear();\n return results;\n }\n\n /**\n * Execute a single task\n */\n private async executeTask(\n task: ParallelTask\n ): Promise<ParallelExecutionResult> {\n const startTime = Date.now();\n\n try {\n const agent = this.space.getAgent(task.agentId);\n if (!agent) {\n throw new Error(`Agent ${task.agentId} not found`);\n }\n\n // Execute agent\n const result = await agent.generateText({\n messages: task.messages,\n system: task.system,\n spaceId: this.space.spaceId,\n metadata: {\n ...task.metadata,\n parallelTaskId: task.id,\n },\n });\n\n const duration = Date.now() - startTime;\n\n return {\n taskId: task.id,\n agentId: task.agentId,\n result: {\n text: result.text || \"\",\n toolCalls: result.toolCalls,\n reasoning: result.reasoning,\n metadata: result.metadata,\n },\n duration,\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n return {\n taskId: task.id,\n agentId: task.agentId,\n result: {\n text: \"\",\n metadata: { error: String(error) },\n },\n error: error instanceof Error ? error : new Error(String(error)),\n duration,\n };\n }\n }\n\n /**\n * Cancel a running task\n */\n cancelTask(taskId: string): void {\n const task = this.activeTasks.get(taskId);\n if (task) {\n // Note: We can't actually cancel a running promise, but we can mark it\n // The actual cancellation would need to be handled at the agent level\n this.activeTasks.delete(taskId);\n }\n }\n\n /**\n * Get active task count\n */\n getActiveTaskCount(): number {\n return this.activeTasks.size;\n }\n}\n\n/**\n * Collaborative Planner\n * Helps agents plan together\n */\nexport class CollaborativePlanner {\n private space: Space;\n private collaborationManager: AgentCollaborationManager;\n\n constructor(space: Space, collaborationManager: AgentCollaborationManager) {\n this.space = space;\n this.collaborationManager = collaborationManager;\n }\n\n /**\n * Create a collaborative plan with multiple agents\n */\n async createCollaborativePlan(\n goal: string,\n agentIds: string[]\n ): Promise<{ plan: any; agentAssignments: Map<string, string[]> }> {\n // Get shared context\n const context = this.collaborationManager.getContext();\n\n // Create planning tasks for each agent\n const planningTasks: ParallelTask[] = agentIds.map((agentId, index) => ({\n id: `plan-${agentId}-${Date.now()}`,\n agentId,\n messages: [\n {\n role: \"user\",\n content:\n `We need to create a collaborative plan for: ${goal}\\n\\n` +\n `Shared context: ${JSON.stringify(context.data, null, 2)}\\n\\n` +\n `You are one of ${agentIds.length} agents working together. ` +\n `Propose your part of the plan and identify dependencies on other agents.`,\n },\n ],\n priority: agentIds.length - index, // First agent gets highest priority\n metadata: {\n planningSession: true,\n goal,\n otherAgents: agentIds.filter((id) => id !== agentId),\n },\n }));\n\n // Execute planning in parallel\n const executionEngine = new ParallelExecutionEngine(this.space);\n const results = await executionEngine.executeParallel(planningTasks);\n\n // Aggregate plans\n const agentPlans = new Map<string, any>();\n for (const result of results) {\n if (!result.error) {\n agentPlans.set(result.agentId, result.result);\n }\n }\n\n // Create unified plan\n const plan = this.mergePlans(agentPlans, goal);\n const agentAssignments = this.assignTasks(plan, agentIds);\n\n return { plan, agentAssignments };\n }\n\n /**\n * Merge multiple agent plans into one\n */\n private mergePlans(agentPlans: Map<string, any>, goal: string): any {\n // Simple merge strategy - in a real implementation, this would be more sophisticated\n const tasks: any[] = [];\n let taskId = 1;\n\n for (const [agentId, plan] of agentPlans.entries()) {\n if (plan.text) {\n // Extract tasks from plan text (simplified)\n const lines = plan.text\n .split(\"\\n\")\n .filter(\n (line: string) =>\n line.trim().startsWith(\"-\") || line.trim().match(/^\\d+\\./)\n );\n\n for (const line of lines) {\n tasks.push({\n id: `task-${taskId++}`,\n description: line.replace(/^[-•\\d.]+\\s*/, \"\").trim(),\n assignedAgent: agentId,\n status: \"pending\",\n });\n }\n }\n }\n\n return {\n goal,\n tasks,\n createdAt: new Date().toISOString(),\n };\n }\n\n /**\n * Assign tasks to agents\n */\n private assignTasks(plan: any, agentIds: string[]): Map<string, string[]> {\n const assignments = new Map<string, string[]>();\n\n for (const agentId of agentIds) {\n assignments.set(agentId, []);\n }\n\n for (const task of plan.tasks) {\n const agentId = task.assignedAgent || agentIds[0];\n const tasks = assignments.get(agentId) || [];\n tasks.push(task.id);\n assignments.set(agentId, tasks);\n }\n\n return assignments;\n }\n}\n","/**\n * Space - The top-level container for Viber work (formerly Space)\n *\n * A Space represents a project context that contains multiple tasks.\n * Each space is managed by an XAgent that serves as its orchestrator.\n *\n * Key concepts:\n * - Space: Project container with shared configuration\n * - Task: Individual conversation threads within a space\n * - Each task has its own conversation history and artifacts\n */\n\nimport { Plan } from \"./plan\";\nimport { Task, TaskStatus } from \"./task\";\nimport { ViberAgent, ViberOptions } from \"./viber-agent\";\nimport { SpaceStorage, SpaceStorageFactory } from \"../storage/space\";\nimport { SpaceConfig, AgentConfig } from \"./config\";\nimport { Agent } from \"./agent\";\nimport { MessageQueue, ConversationHistory } from \"./message\";\nimport type { SpaceModel, SpaceState } from \"../types\";\nimport {\n AgentCollaborationManager,\n ParallelExecutionEngine,\n CollaborativePlanner,\n} from \"./collaboration\";\n\n// Re-export for convenience\nexport type { SpaceModel, SpaceState };\n\n// Task within a space\nexport interface SpaceTask {\n id: string;\n spaceId: string;\n title: string;\n history: ConversationHistory;\n artifactIds: string[];\n status: \"active\" | \"completed\" | \"archived\";\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport class Space {\n public spaceId: string;\n public userId?: string; // User ID of space owner\n public config: SpaceConfig;\n public history: ConversationHistory; // Legacy: primary task history\n public tasks: Map<string, SpaceTask>; // NEW: Multiple tasks\n public messageQueue: MessageQueue;\n public agents: Map<string, Agent>;\n public storage: SpaceStorage;\n public goal: string;\n public name: string;\n public viberAgent?: ViberAgent;\n public createdAt: Date;\n public updatedAt: Date;\n public plan?: Plan;\n public artifacts?: any[];\n public collaborationManager?: AgentCollaborationManager;\n public parallelEngine?: ParallelExecutionEngine;\n public collaborativePlanner?: CollaborativePlanner;\n\n constructor({\n spaceId,\n userId,\n config,\n history,\n messageQueue,\n agents,\n storage,\n goal,\n name,\n viberAgent,\n }: {\n spaceId: string;\n userId?: string;\n config: SpaceConfig;\n history: ConversationHistory;\n messageQueue: MessageQueue;\n agents: Map<string, Agent>;\n storage: SpaceStorage;\n goal: string;\n name?: string;\n viberAgent?: ViberAgent;\n }) {\n this.spaceId = spaceId;\n this.userId = userId;\n this.config = config;\n this.history = history; // Legacy: default task history\n this.tasks = new Map(); // NEW: Task storage\n this.messageQueue = messageQueue;\n this.agents = agents;\n this.storage = storage;\n this.goal = goal;\n this.name = name || `Space ${spaceId}`;\n this.viberAgent = viberAgent;\n this.createdAt = new Date();\n this.updatedAt = new Date();\n\n // Initialize collaboration components\n this.collaborationManager = new AgentCollaborationManager(this);\n this.parallelEngine = new ParallelExecutionEngine(this);\n this.collaborativePlanner = new CollaborativePlanner(\n this,\n this.collaborationManager,\n );\n }\n\n /**\n * Get or create a task within this space\n */\n getOrCreateTask(taskId: string, title?: string): SpaceTask {\n if (!this.tasks.has(taskId)) {\n const task: SpaceTask = {\n id: taskId,\n spaceId: this.spaceId,\n title: title || `Task ${taskId}`,\n history: new ConversationHistory(),\n artifactIds: [],\n status: \"active\",\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.tasks.set(taskId, task);\n console.log(`[Space] Created task ${taskId} in space ${this.spaceId}`);\n }\n return this.tasks.get(taskId)!;\n }\n\n /**\n * Get task by ID\n */\n getTask(taskId: string): SpaceTask | undefined {\n return this.tasks.get(taskId);\n }\n\n /**\n * Get all tasks in this space\n */\n getAllTasks(): SpaceTask[] {\n return Array.from(this.tasks.values());\n }\n\n /**\n * Update space task status (for conversation tasks, not Plan tasks)\n */\n updateSpaceTaskStatus(\n taskId: string,\n status: \"active\" | \"completed\" | \"archived\",\n ): boolean {\n const task = this.tasks.get(taskId);\n if (task) {\n task.status = status;\n task.updatedAt = new Date();\n return true;\n }\n return false;\n }\n\n getAgent(name: string): Agent | undefined {\n return this.agents.get(name);\n }\n\n registerAgent(name: string, agent: Agent): void {\n this.agents.set(name, agent);\n console.log(`[Space] Registered agent: ${name} - ${agent.description}`);\n }\n\n complete(): void {\n console.log(`Space ${this.spaceId} completed`);\n }\n\n getContext(): Record<string, any> {\n const context: Record<string, any> = {\n spaceId: this.spaceId,\n goal: this.goal,\n storagePath: this.storage.getSpacePath(),\n agents: Array.from(this.agents.keys()),\n historyLength: this.history.messages.length,\n createdAt: this.createdAt.toISOString(),\n };\n\n if (this.plan) {\n context.plan = {\n goal: this.goal,\n totalTasks: this.plan.tasks.length,\n progress: this.plan.getProgressSummary(),\n };\n }\n\n return context;\n }\n\n async createPlan(plan: Plan): Promise<void> {\n this.plan = plan;\n await this.persistState();\n console.log(\n `Created plan for space ${this.spaceId} with ${plan.tasks.length} tasks`,\n );\n }\n\n async updatePlan(plan: Plan): Promise<void> {\n this.plan = plan;\n this.updatedAt = new Date();\n await this.persistState();\n console.log(`Updated plan for space ${this.spaceId}`);\n }\n\n async setName(name: string): Promise<void> {\n this.name = name;\n this.updatedAt = new Date();\n await this.persistState();\n console.log(`Updated space ${this.spaceId} name to: ${name}`);\n }\n\n async getNextTask(): Promise<Task | undefined> {\n if (!this.plan) {\n return undefined;\n }\n return this.plan.getNextActionableTask();\n }\n\n async getParallelTasks(maxTasks: number = 3): Promise<Task[]> {\n if (!this.plan) {\n return [];\n }\n return this.plan.getAllActionableTasks(maxTasks);\n }\n\n async updateTaskStatus(taskId: string, status: TaskStatus): Promise<boolean> {\n if (!this.plan) {\n return false;\n }\n\n const success = this.plan.updateTaskStatus(taskId, status);\n if (success) {\n this.updatedAt = new Date();\n await this.persistState();\n console.log(`Updated task ${taskId} status to ${status}`);\n }\n\n return success;\n }\n\n async assignTask(taskId: string, agentName: string): Promise<boolean> {\n if (!this.plan) {\n return false;\n }\n\n const task = this.plan.getTaskById(taskId);\n if (!task) {\n return false;\n }\n\n if (!this.agents.has(agentName)) {\n console.error(`Agent '${agentName}' not found in space team`);\n return false;\n }\n\n task.assignedTo = agentName;\n this.updatedAt = new Date();\n await this.persistState();\n console.log(`Assigned task ${taskId} to agent ${agentName}`);\n return true;\n }\n\n isPlanComplete(): boolean {\n if (!this.plan) {\n return false;\n }\n return this.plan.isComplete();\n }\n\n hasFailedTasks(): boolean {\n if (!this.plan) {\n return false;\n }\n return this.plan.hasFailedTasks();\n }\n\n async persistState(): Promise<void> {\n // NOTE: In database mode, space data is persisted through the data adapter (spaces table)\n // Storage is ONLY used for artifacts, not config files\n // This legacy file-based persistence is disabled to avoid conflicts\n // Space persistence is now handled by the API layer using SupabaseDatabaseAdapter\n console.log(\"[Space] State persistence handled by database adapter\");\n }\n\n async loadState(): Promise<boolean> {\n try {\n // NOTE: In database mode, space data is loaded from the database, not storage\n // This method is kept for backward compatibility but returns false\n console.log(\"[Space] State loading handled by database adapter\");\n return false;\n\n // Legacy code disabled:\n // const spaceData = await this.storage.readFile(\"space.json\");\n // if (spaceData) {\n // const data = JSON.parse(spaceData.toString(\"utf-8\")) as SpaceModel;\n // this.createdAt = new Date(data.createdAt || this.createdAt.toISOString());\n // this.updatedAt = new Date(data.updatedAt || this.updatedAt.toISOString());\n // this.name = data.name || this.name;\n // if (data.plan) {\n // this.plan = Plan.fromJSON(data.plan);\n // }\n // // Load artifacts...\n // return true;\n // }\n } catch (error) {\n console.error(\"Failed to load space state:\", error);\n }\n return false;\n }\n\n async loadPlan(): Promise<Plan | undefined> {\n if (await this.loadState()) {\n return this.plan;\n }\n return undefined;\n }\n\n getState(): SpaceState {\n const state: SpaceState = {\n spaceId: this.spaceId,\n name: this.name,\n goal: this.goal,\n createdAt: this.createdAt.toISOString(),\n updatedAt: this.updatedAt.toISOString(),\n teamSize: this.agents.size,\n };\n\n if (this.plan) {\n const taskStats = {\n total: this.plan.tasks.length,\n completed: this.plan.tasks.filter(\n (t) => t.status === TaskStatus.COMPLETED,\n ).length,\n running: this.plan.tasks.filter((t) => t.status === TaskStatus.RUNNING)\n .length,\n pending: this.plan.tasks.filter((t) => t.status === TaskStatus.PENDING)\n .length,\n failed: this.plan.tasks.filter((t) => t.status === TaskStatus.FAILED)\n .length,\n };\n state.tasks = taskStats;\n state.progressPercentage =\n taskStats.total > 0 ? (taskStats.completed / taskStats.total) * 100 : 0;\n }\n\n return state;\n }\n}\n\n/**\n * Start a new space\n */\nexport async function startSpace({\n goal,\n spaceId,\n userId,\n spaceRoot,\n name,\n model,\n}: {\n goal: string;\n spaceId?: string;\n userId?: string;\n spaceRoot?: string;\n name?: string;\n model?: string;\n}): Promise<Space> {\n const id = spaceId || `proj_${Date.now().toString(36)}`;\n\n // Create minimal space config\n const spaceConfig: SpaceConfig = {\n name: name || goal.slice(0, 50),\n autoSave: true,\n checkpointInterval: 300,\n };\n\n console.log(`[Space] Creating space - agents will be loaded on demand`);\n\n // Create storage\n const storage = await SpaceStorageFactory.create(id);\n\n // Create agents map - empty initially, agents loaded on demand\n const agents = new Map<string, Agent>();\n\n console.log(`[Space] Space initialized (agents loaded on demand)`);\n\n // Create message queue and history\n const messageQueue = new MessageQueue();\n const history = new ConversationHistory();\n\n // Create the space\n const space = new Space({\n spaceId: id,\n userId,\n config: spaceConfig,\n history,\n messageQueue,\n agents,\n storage,\n goal,\n name: name || spaceConfig.name,\n });\n\n // Create ViberAgent for the space (includes tmux + cursor-agent so Viber Board can verify skills)\n const viberAgentConfig: AgentConfig = {\n name: \"Viber\",\n description: \"I manage this space and coordinate all work.\",\n provider: \"openrouter\",\n model: model || \"deepseek/deepseek-chat\",\n temperature: 0.7,\n promptFile: \"\", // ViberAgent doesn't use prompt files\n skills: [\"tmux\", \"cursor-agent\"],\n };\n\n const viberAgent = new ViberAgent(viberAgentConfig, space, {\n model,\n spaceId: id,\n });\n space.viberAgent = viberAgent;\n\n // MCP tools are now loaded on-demand by agents, not pre-loaded\n // This avoids the need for a central tool registry\n\n // Save initial state\n await space.persistState();\n\n return space;\n}\n","/**\n * ViberAgent - The space's conversational representative\n *\n * X is the interface between users and their spaces. Each space has an X agent\n * that acts as its representative. When you need to interact with a space, you\n * talk to X. ViberAgent merges TaskExecutor and Orchestrator functionality into a\n * single, user-friendly interface.\n */\n\nimport { Agent, AgentContext, AgentResponse } from \"./agent\";\nimport { AgentConfig } from \"./config\";\nimport { Space } from \"./space\";\nimport { getServerDataAdapter } from \"../data/factory\";\nimport { Plan } from \"./plan\";\nimport { Task, TaskStatus } from \"./task\";\nimport { generateText, Output } from \"ai\";\nimport { z } from \"zod\";\nimport type { ParallelTask } from \"./collaboration\";\n\nexport interface ViberOptions {\n model?: string; // AI model to use\n storageRoot?: string; // Storage location\n defaultGoal?: string; // Default goal for new spaces\n spaceId?: string; // Explicit space ID\n singleAgentId?: string; // If set, route directly to this agent ID\n}\n\nexport interface ViberStreamOptions {\n messages?: any[]; // Message history\n tools?: any; // Tools available\n artifactId?: string; // Artifact context\n [key: string]: any; // Additional options\n}\n\nexport interface ViberAgentResponse extends AgentResponse {\n plan?: Plan;\n taskResults?: any[];\n artifacts?: any[];\n preservedSteps?: string[];\n regeneratedSteps?: string[];\n planChanges?: Record<string, any>;\n}\n\nexport class ViberAgent extends Agent {\n private space: Space;\n public readonly spaceId: string;\n private abortController?: AbortController;\n private singleAgentId?: string; // If set, bypass planning\n\n constructor(config: AgentConfig, space: Space, options?: ViberOptions) {\n // Enhance the config for ViberAgent\n const xConfig: AgentConfig = {\n ...config,\n name: \"X\",\n description: `I am X, the conversational representative for this space. I manage all aspects of the space and coordinate with other agents to achieve our goals.`,\n };\n\n super(xConfig);\n this.space = space;\n this.spaceId = space.spaceId;\n this.singleAgentId = options?.singleAgentId;\n }\n\n /**\n * Getter for space (needed for external access)\n */\n getSpace(): Space {\n return this.space;\n }\n\n /**\n * Override getSystemPrompt to include plan and artifacts context\n */\n public getSystemPrompt(context?: AgentContext): string {\n const basePrompt = super.getSystemPrompt(context);\n return basePrompt + this.getPlanContext() + this.getArtifactsContext();\n }\n\n /**\n * Generate text - uses new AI SDK-style signature\n */\n async generateText(options: {\n messages: any[];\n system?: string;\n [key: string]: any;\n }): Promise<any> {\n // Add space context to options\n return super.generateText({\n ...options,\n spaceId: this.space.spaceId,\n metadata: {\n spaceName: this.space.name,\n spaceGoal: this.space.goal,\n ...options.metadata,\n },\n });\n }\n\n /**\n * ViberAgent streamText - Orchestration Layer\n * Responsibilities: History management, agent delegation, persistence\n */\n async streamText(options: {\n messages: any[];\n system?: string;\n spaceId?: string;\n metadata?: Record<string, any>;\n [key: string]: any;\n }): Promise<any> {\n const {\n messages,\n system: systemMessage,\n spaceId,\n metadata = {},\n ...restOptions\n } = options;\n\n console.log(\"[ViberAgent] Orchestration layer: starting streamText\");\n\n const mode = metadata?.mode;\n if (!mode || mode !== \"agent\") {\n throw new Error(\"ViberAgent only supports 'agent' mode\");\n }\n\n // PHASE 1: History Management\n await this.updateSpaceHistory(messages, metadata);\n\n // PHASE 2: Agent Delegation\n const streamResult = await this.handleAgentMode(\n messages,\n systemMessage,\n spaceId,\n metadata,\n restOptions,\n );\n\n // PHASE 3: Message Persistence\n if (spaceId) {\n this.handleMessagePersistence(streamResult, messages, spaceId, metadata);\n }\n\n return streamResult;\n }\n\n /**\n * Agent Mode Handler - Direct delegation with performance optimization\n * Supports both single agent and parallel execution\n */\n private async handleAgentMode(\n messages: any[],\n systemMessage: string | undefined,\n spaceId: string | undefined,\n metadata: Record<string, any>,\n restOptions: any,\n ): Promise<any> {\n // Check if parallel execution is requested\n const parallelAgents = metadata.parallelAgents as string[] | undefined;\n if (parallelAgents && parallelAgents.length > 1) {\n return this.handleParallelExecution(\n parallelAgents,\n messages,\n systemMessage,\n spaceId,\n metadata,\n restOptions,\n );\n }\n\n // Single agent execution (existing logic)\n const targetAgent = metadata.requestedAgent;\n if (!targetAgent) {\n throw new Error(\"Agent mode requires requestedAgent in metadata\");\n }\n\n console.log(\n `[ViberAgent] Agent mode: direct delegation to '${targetAgent}'`,\n );\n\n // Get or load target agent\n let agent = this.space.getAgent(targetAgent);\n if (!agent) {\n // Load agent on demand\n console.log(`[ViberAgent] Loading agent '${targetAgent}' on demand`);\n const dataAdapter = getServerDataAdapter();\n const agentConfig = await dataAdapter.getAgent(targetAgent);\n if (!agentConfig) {\n throw new Error(`Agent '${targetAgent}' not found`);\n }\n agent = new Agent(agentConfig as AgentConfig);\n this.space.registerAgent(targetAgent, agent);\n }\n\n // Use full conversation history so the LLM has context (e.g. user \"1\" after assistant's numbered list)\n const taskId = metadata?.taskId || metadata?.conversationId || \"default\";\n const task = this.space.getOrCreateTask(taskId);\n const fullHistory = task.history.getMessages();\n const messagesForAgent =\n fullHistory.length > 0\n ? this.optimizeContextForAgent(fullHistory)\n : this.optimizeContextForAgent(messages);\n console.log(\n `[ViberAgent] Agent mode: using ${messagesForAgent.length} messages from history`,\n );\n\n // Direct delegation - no orchestration overhead\n return await agent.streamText({\n messages: messagesForAgent,\n system: systemMessage,\n spaceId,\n metadata: {\n ...metadata,\n delegationType: \"direct\",\n userId: this.space.userId, // Pass space owner ID for tracking\n },\n ...restOptions,\n });\n }\n\n /**\n * Handle parallel execution of multiple agents\n */\n private async handleParallelExecution(\n agentIds: string[],\n messages: any[],\n systemMessage: string | undefined,\n spaceId: string | undefined,\n metadata: Record<string, any>,\n restOptions: any,\n ): Promise<any> {\n console.log(`[ViberAgent] Parallel execution: ${agentIds.length} agents`);\n\n // Ensure all agents are loaded\n const dataAdapter = getServerDataAdapter();\n for (const agentId of agentIds) {\n if (!this.space.getAgent(agentId)) {\n const agentConfig = await dataAdapter.getAgent(agentId);\n if (!agentConfig) {\n throw new Error(`Agent '${agentId}' not found`);\n }\n const agent = new Agent(agentConfig as AgentConfig);\n this.space.registerAgent(agentId, agent);\n }\n }\n\n // Use parallel execution engine\n if (!this.space.parallelEngine) {\n throw new Error(\"Parallel execution engine not initialized\");\n }\n\n // ParallelTask type is imported at top of file\n const tasks = agentIds.map((agentId, index) => ({\n id: `parallel-${agentId}-${Date.now()}-${index}`,\n agentId,\n messages: this.optimizeContextForAgent(messages),\n system: systemMessage,\n metadata: {\n ...metadata,\n delegationType: \"parallel\",\n userId: this.space.userId,\n parallelIndex: index,\n },\n priority: agentIds.length - index, // First agent gets highest priority\n }));\n\n const results = await this.space.parallelEngine.executeParallel(tasks);\n\n // Aggregate results\n return {\n text: results.map((r) => `[${r.agentId}]: ${r.result.text}`).join(\"\\n\\n\"),\n toolCalls: results.flatMap((r) => r.result.toolCalls || []),\n metadata: {\n ...metadata,\n parallelResults: results,\n agentCount: agentIds.length,\n },\n };\n }\n\n /**\n * Update space history with new messages\n * Now supports per-task history\n */\n private async updateSpaceHistory(\n messages: any[],\n metadata?: Record<string, any>,\n ): Promise<void> {\n // Get taskId from metadata, or use \"default\" for legacy support\n const taskId = metadata?.taskId || metadata?.conversationId || \"default\";\n const task = this.space.getOrCreateTask(taskId);\n\n const existingMessages = task.history.getMessages();\n // When client sends only the new message(s), messages.length <= existingMessages.length:\n // append incoming messages. When client sends full thread, take only the new tail.\n const newMessages =\n messages.length > existingMessages.length\n ? messages.slice(existingMessages.length)\n : messages;\n\n if (newMessages.length > 0) {\n for (const msg of newMessages) {\n const formattedMsg = {\n ...msg,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : Array.isArray(msg.content)\n ? msg.content\n : [{ type: \"text\", text: msg.content }],\n };\n task.history.add(formattedMsg);\n }\n console.log(\n `[ViberAgent] Updated task ${taskId} history with ${newMessages.length} new messages`,\n );\n }\n }\n\n /**\n * Optimize message context for single-agent performance\n */\n private optimizeContextForAgent(messages: any[]): any[] {\n // For agent mode, use recent messages only to minimize token usage\n return messages.slice(-4); // Last 4 messages (2 exchanges)\n }\n\n /**\n * Extract user prompt from messages for orchestration\n */\n private extractPromptFromMessages(messages: any[]): string {\n const lastMessage = messages[messages.length - 1];\n if (lastMessage?.role === \"user\") {\n const content = lastMessage.content;\n if (typeof content === \"string\") {\n return content;\n } else if (Array.isArray(content)) {\n return content\n .filter((part) => part.type === \"text\" && part.text)\n .map((part) => part.text)\n .join(\" \");\n }\n }\n return \"\";\n }\n\n /**\n * Handle message persistence after streaming completes\n */\n private handleMessagePersistence(\n streamResult: any,\n messages: any[],\n spaceId: string,\n metadata: any,\n ) {\n (async () => {\n try {\n let finalText = \"\";\n const toolInvocations: any[] = [];\n\n for await (const part of streamResult.fullStream) {\n switch (part.type) {\n case \"text-delta\":\n if (part.text) {\n finalText += part.text;\n }\n break;\n case \"tool-call\":\n toolInvocations.push({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n break;\n case \"tool-result\":\n const toolCall = toolInvocations.find(\n (t) => t.toolCallId === part.toolCallId,\n );\n if (toolCall) {\n toolCall.result = part.result;\n }\n break;\n case \"finish\":\n break;\n case \"error\":\n console.error(\"[ViberAgent] Stream error:\", part.error);\n return;\n }\n }\n\n // Build assistant message in AI SDK v5 format\n const assistantMessage = {\n role: \"assistant\" as const,\n content: [{ type: \"text\" as const, text: finalText }],\n id: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n metadata: {\n agentName: this.singleAgentId || \"team\",\n spaceId,\n timestamp: Date.now(),\n ...metadata,\n },\n ...(toolInvocations.length > 0 && { toolInvocations }),\n };\n\n // Add assistant message to task history so next turn in same run has full context\n const taskId =\n metadata?.taskId || metadata?.conversationId || \"default\";\n const task = this.space.getOrCreateTask(taskId);\n task.history.add(assistantMessage);\n // Chat history is persisted at Viber Board level, not by the viber agent\n } catch (error) {\n console.error(\"[ViberAgent] Failed to persist messages:\", error);\n }\n })();\n }\n\n /**\n * Save space to storage\n */\n private async saveSpace(): Promise<void> {\n try {\n // NOTE: In database mode, space data is persisted through the data adapter (spaces table)\n // Storage is ONLY used for artifacts, not config files\n // This legacy file-based persistence is disabled to avoid conflicts\n\n // Legacy code disabled - space data now in database:\n // const { SpaceStorageFactory } = await import(\"../storage/space\");\n // const storage = await SpaceStorageFactory.create(this.spaceId);\n // await storage.saveFile(\"space.json\", { ... });\n\n // Space persistence is now handled by the API layer using SupabaseDatabaseAdapter\n // which writes to the spaces table, not storage buckets\n\n console.log(\"[ViberAgent] Space persistence handled by database adapter\");\n } catch (error) {\n console.error(\"[ViberAgent] Error saving space:\", error);\n // Don't throw - saving is best effort\n }\n }\n\n /**\n * Stop current operation\n */\n stop() {\n this.space.messageQueue.clear();\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /**\n * Add message to queue (soft interrupt)\n */\n addMessage(message: string, metadata?: any) {\n return this.space.messageQueue.add(message, metadata);\n }\n\n /**\n * Enrich context with space information\n */\n private enrichContext(context?: Partial<AgentContext>): AgentContext {\n return {\n spaceId: this.space.spaceId,\n conversationHistory: this.space.history,\n metadata: {\n spaceName: this.space.name,\n spaceGoal: this.space.goal,\n ...context?.metadata,\n },\n ...context,\n };\n }\n\n /**\n * Create or update the space plan\n */\n async createPlan(goal?: string): Promise<Plan> {\n const planGoal = goal || this.space.goal;\n\n // Generate plan using LLM\n const planSchema = z.object({\n tasks: z.array(\n z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n assignedTo: z.string().optional(),\n priority: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n estimatedTime: z.string().optional(),\n dependencies: z\n .array(\n z.object({\n taskId: z.string(),\n type: z.enum([\"required\", \"optional\"]),\n }),\n )\n .default([]),\n tags: z.array(z.string()).default([]),\n }),\n ),\n });\n\n const result = await generateText({\n model: this.getModel(),\n system:\n this.getSystemPrompt() +\n \"\\n\\nCreate a detailed plan to achieve the goal.\",\n prompt: `Goal: ${planGoal}\\n\\nAvailable agents: ${Array.from(\n this.space.agents.keys(),\n ).join(\", \")}`,\n output: Output.object({ schema: planSchema }),\n });\n\n // Create Plan with Tasks - cast result.output to inferred schema type\n const planData = result.output as z.infer<typeof planSchema>;\n const tasks = planData.tasks.map(\n (taskData: z.infer<typeof planSchema>[\"tasks\"][number]) =>\n new Task({\n ...taskData,\n status: TaskStatus.PENDING,\n }),\n );\n\n const plan = new Plan({\n goal: planGoal,\n tasks,\n });\n\n await this.space.createPlan(plan);\n return plan;\n }\n\n /**\n * Adapt the plan based on new information or user feedback\n */\n async adaptPlan(feedback: string): Promise<Plan> {\n if (!this.space.plan) {\n // No existing plan, create a new one with the feedback\n return this.createPlan(feedback);\n }\n\n const currentPlan = this.space.plan;\n const progress = currentPlan.getProgressSummary();\n\n // Schema for plan adaptation\n const adaptSchema = z.object({\n preserveTasks: z\n .array(z.string())\n .describe(\"IDs of tasks to keep unchanged\"),\n modifyTasks: z\n .array(\n z.object({\n id: z.string(),\n changes: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n priority: z.enum([\"low\", \"medium\", \"high\"]).optional(),\n assignedTo: z.string().optional(),\n }),\n }),\n )\n .describe(\"Tasks to modify\"),\n removeTasks: z.array(z.string()).describe(\"IDs of tasks to remove\"),\n addTasks: z\n .array(\n z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n assignedTo: z.string().optional(),\n priority: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n dependencies: z\n .array(\n z.object({\n taskId: z.string(),\n type: z.enum([\"required\", \"optional\"]),\n }),\n )\n .default([]),\n tags: z.array(z.string()).default([]),\n }),\n )\n .describe(\"New tasks to add\"),\n reasoning: z.string().describe(\"Explanation of the plan changes\"),\n });\n\n const prompt = `\nCurrent Plan Progress:\n- Total tasks: ${progress.totalTasks}\n- Completed: ${progress.completedTasks}\n- In Progress: ${progress.runningTasks}\n- Pending: ${progress.pendingTasks}\n\nCurrent Tasks:\n${currentPlan.tasks\n .map((t) => `- [${t.id}] ${t.title} (${t.status})`)\n .join(\"\\n\")}\n\nUser Feedback: ${feedback}\n\nAnalyze the current plan and adapt it based on the user's feedback.\nKeep completed tasks unless explicitly asked to redo them.\nPreserve tasks that are still relevant.\nModify, remove, or add tasks as needed to better achieve the goal.\n`;\n\n const result = await generateText({\n model: this.getModel(),\n system:\n this.getSystemPrompt() +\n \"\\n\\nAdapt the existing plan based on user feedback.\",\n prompt,\n output: Output.object({ schema: adaptSchema }),\n });\n\n // Apply adaptations - cast result.output to inferred schema type\n const adaptData = result.output as z.infer<typeof adaptSchema>;\n const adaptedTasks: Task[] = [];\n\n // Keep preserved tasks\n for (const taskId of adaptData.preserveTasks) {\n const task = currentPlan.tasks.find((t) => t.id === taskId);\n if (task) {\n adaptedTasks.push(task);\n }\n }\n\n // Modify tasks\n for (const modification of adaptData.modifyTasks) {\n const task = currentPlan.tasks.find((t) => t.id === modification.id);\n if (task) {\n // Apply changes\n if (modification.changes.title) task.title = modification.changes.title;\n if (modification.changes.description)\n task.description = modification.changes.description;\n if (modification.changes.priority)\n task.priority = modification.changes.priority;\n if (modification.changes.assignedTo)\n task.assignedTo = modification.changes.assignedTo;\n adaptedTasks.push(task);\n }\n }\n\n // Add new tasks\n for (const newTaskData of adaptData.addTasks) {\n const newTask = new Task({\n ...newTaskData,\n status: TaskStatus.PENDING,\n });\n adaptedTasks.push(newTask);\n }\n\n // Create adapted plan\n const adaptedPlan = new Plan({\n goal: currentPlan.goal,\n tasks: adaptedTasks,\n });\n\n // Update space with adapted plan\n await this.space.createPlan(adaptedPlan);\n\n // Log the reasoning\n console.log(\"[Plan Adaptation]\", adaptData.reasoning);\n\n return adaptedPlan;\n }\n\n /**\n * Get plan context for system prompt\n */\n private getPlanContext(): string {\n if (!this.space.plan) {\n return \"\\n\\nNo active plan for this space yet.\";\n }\n\n const summary = this.space.plan.getProgressSummary();\n return `\n\nCurrent Plan Status:\n- Total tasks: ${summary.totalTasks}\n- Completed: ${summary.completedTasks}\n- Running: ${summary.runningTasks}\n- Pending: ${summary.pendingTasks}\n- Failed: ${summary.failedTasks}\n- Progress: ${summary.progressPercentage.toFixed(1)}%\n`;\n }\n\n /**\n * Get artifacts context for system prompt\n */\n private getArtifactsContext(): string {\n if (!this.space.artifacts || this.space.artifacts.length === 0) {\n return \"\";\n }\n\n const artifactsList = this.space.artifacts\n .map((a) => `- ${a.title || a.path} (${a.artifactType || \"document\"})`)\n .join(\"\\n\");\n\n return `\n\nAvailable Artifacts:\n${artifactsList}\n\nThese artifacts are pre-loaded in the space and can be referenced in your responses.\n`;\n }\n\n /**\n * Get ViberAgent summary\n */\n getSummary(): Record<string, any> {\n const base = super.getSummary();\n return {\n ...base,\n spaceId: this.space.spaceId,\n spaceName: this.space.name,\n spaceGoal: this.space.goal,\n planStatus: this.space.plan?.getProgressSummary(),\n };\n }\n\n /**\n * Static factory to start a new space\n */\n static async start(\n goal: string,\n options: ViberOptions = {},\n ): Promise<ViberAgent> {\n const { spaceId, model, singleAgentId } = options;\n\n // Use provided spaceId or generate one\n const id =\n spaceId ||\n `proj_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Start space (this creates ViberAgent internally)\n const { startSpace } = await import(\"./space\");\n const space = await startSpace({\n spaceId: id,\n goal,\n name: goal.slice(0, 50),\n model,\n });\n\n if (!space.viberAgent) {\n throw new Error(\"Failed to initialize ViberAgent\");\n }\n\n // Set singleAgentId if provided\n if (singleAgentId) {\n (space.viberAgent as any).singleAgentId = singleAgentId;\n }\n\n return space.viberAgent;\n }\n\n /**\n * Static factory to resume an existing space\n */\n static async resume(\n spaceId: string,\n options: ViberOptions = {},\n ): Promise<ViberAgent> {\n const { model } = options;\n\n // Load existing space\n const { SpaceStorageFactory } = await import(\"../storage/space\");\n const { startSpace } = await import(\"./space\");\n\n // Check if space exists\n const exists = await SpaceStorageFactory.exists(spaceId);\n if (!exists) {\n throw new Error(`Space ${spaceId} not found`);\n }\n\n // Load space data\n const storage = await SpaceStorageFactory.create(spaceId);\n const spaceData = await storage.readJSON<any>(\"space.json\");\n\n if (!spaceData) {\n throw new Error(`Failed to load space ${spaceId}`);\n }\n\n // Recreate space with saved state\n const space = await startSpace({\n spaceId,\n goal: spaceData.goal,\n name: spaceData.name,\n model: model || spaceData.model,\n });\n\n if (!space.viberAgent) {\n throw new Error(\"Failed to initialize ViberAgent\");\n }\n\n // Set singleAgentId if provided\n const agentId = options.singleAgentId || spaceData.singleAgentId;\n if (agentId) {\n (space.viberAgent as any).singleAgentId = agentId;\n }\n\n // Restore conversation messages if exists (e.g. CLI resume from local storage)\n const messages = await storage.readJSON<any[]>(\"messages.json\");\n if (messages && Array.isArray(messages)) {\n space.history.clear();\n for (const msg of messages) {\n const normalizedMsg = { ...msg };\n if (typeof msg.content === \"string\") {\n normalizedMsg.content = [{ type: \"text\", text: msg.content }];\n }\n space.history.add(normalizedMsg);\n }\n }\n\n return space.viberAgent;\n }\n}\n","/**\n * Channel Manager\n *\n * Central registry and router for command center channels.\n * Routes inbound messages to ViberAgent and broadcasts\n * agent events to the originating channel.\n */\n\nimport { EventEmitter } from \"events\";\nimport {\n Channel,\n InboundMessage,\n AgentStreamEvent,\n InterruptSignal,\n} from \"./channel\";\nimport { ViberAgent } from \"../core/viber-agent\";\n\ninterface ActiveConversation {\n channelId: string;\n agent: ViberAgent;\n startedAt: Date;\n}\n\nexport class ChannelManager extends EventEmitter {\n private channels = new Map<string, Channel>();\n private conversations = new Map<string, ActiveConversation>();\n\n /**\n * Register a channel\n */\n register(channel: Channel): void {\n if (this.channels.has(channel.id)) {\n console.warn(`[ChannelManager] Channel ${channel.id} already registered`);\n return;\n }\n this.channels.set(channel.id, channel);\n console.log(`[ChannelManager] Registered channel: ${channel.id}`);\n }\n\n /**\n * Unregister a channel\n */\n unregister(id: string): void {\n this.channels.delete(id);\n console.log(`[ChannelManager] Unregistered channel: ${id}`);\n }\n\n /**\n * Get a channel by ID\n */\n getChannel(id: string): Channel | undefined {\n return this.channels.get(id);\n }\n\n /**\n * Start all registered channels\n */\n async startAll(): Promise<void> {\n for (const [id, channel] of this.channels) {\n try {\n await channel.start();\n console.log(`[ChannelManager] Started channel: ${id}`);\n } catch (error) {\n console.error(`[ChannelManager] Failed to start channel ${id}:`, error);\n }\n }\n }\n\n /**\n * Stop all registered channels\n */\n async stopAll(): Promise<void> {\n for (const [id, channel] of this.channels) {\n try {\n await channel.stop();\n console.log(`[ChannelManager] Stopped channel: ${id}`);\n } catch (error) {\n console.error(`[ChannelManager] Failed to stop channel ${id}:`, error);\n }\n }\n }\n\n /**\n * Route an inbound message to ViberAgent\n */\n async routeMessage(message: InboundMessage): Promise<void> {\n const { source, conversationId, content, userId } = message;\n\n console.log(\n `[ChannelManager] Routing message from ${source}: ${content.substring(0, 50)}...`\n );\n\n // Get or create conversation\n let conversation = this.conversations.get(conversationId);\n\n if (!conversation) {\n // Create new ViberAgent for this conversation\n const agent = await ViberAgent.start(content, {\n // Use conversation ID as space ID for isolation\n spaceId: conversationId,\n });\n\n conversation = {\n channelId: source,\n agent,\n startedAt: new Date(),\n };\n this.conversations.set(conversationId, conversation);\n }\n\n // Execute and stream response\n try {\n const result = await conversation.agent.streamText({\n messages: [{ role: \"user\", content }],\n metadata: { userId, source },\n });\n\n const channel = this.channels.get(source);\n if (!channel) {\n console.error(`[ChannelManager] Channel not found: ${source}`);\n return;\n }\n\n // Stream events back to channel\n for await (const chunk of result.fullStream) {\n await channel.stream(conversationId, this.mapToStreamEvent(chunk));\n }\n\n // Send done event\n await channel.stream(conversationId, {\n type: \"done\",\n agentId: conversation.agent.spaceId,\n });\n } catch (error: any) {\n console.error(`[ChannelManager] Error processing message:`, error);\n\n const channel = this.channels.get(source);\n if (channel) {\n await channel.stream(conversationId, {\n type: \"error\",\n error: error.message,\n agentId: conversation?.agent?.spaceId || \"unknown\",\n });\n }\n }\n }\n\n /**\n * Handle interrupt signal\n */\n async handleInterrupt(signal: InterruptSignal): Promise<void> {\n const conversation = this.conversations.get(signal.conversationId);\n if (conversation) {\n conversation.agent.stop();\n this.conversations.delete(signal.conversationId);\n console.log(\n `[ChannelManager] Interrupted conversation: ${signal.conversationId}`\n );\n }\n }\n\n /**\n * Map AI SDK stream chunk to AgentStreamEvent\n */\n private mapToStreamEvent(chunk: any): AgentStreamEvent {\n if (chunk.type === \"text-delta\") {\n return {\n type: \"text-delta\",\n content: chunk.textDelta,\n agentId: \"viber\",\n };\n }\n if (chunk.type === \"tool-call\") {\n return {\n type: \"tool-call\",\n tool: chunk.toolName,\n args: chunk.args,\n agentId: \"viber\",\n };\n }\n if (chunk.type === \"tool-result\") {\n return {\n type: \"tool-result\",\n tool: chunk.toolName,\n result: chunk.result,\n agentId: \"viber\",\n };\n }\n // Default passthrough\n return {\n type: \"state-change\",\n state: chunk.type,\n agentId: \"viber\",\n };\n }\n}\n\n// Singleton instance\nexport const channelManager = new ChannelManager();\n","/**\n * DingTalk Channel\n *\n * Integrates with DingTalk Enterprise Bot via webhook.\n * Receives messages via HTTP POST and sends replies via DingTalk API.\n *\n * @see https://open.dingtalk.com/document/orgapp/receive-message\n */\n\nimport crypto from \"crypto\";\nimport {\n Channel,\n InboundMessage,\n AgentStreamEvent,\n DingTalkConfig,\n} from \"./channel\";\n\n// ==================== DingTalk Types ====================\n\ninterface DingTalkWebhookPayload {\n msgtype: string;\n text?: { content: string };\n msgId: string;\n createAt: number;\n conversationType: string;\n conversationId: string;\n conversationTitle?: string;\n senderId: string;\n senderNick: string;\n senderCorpId?: string;\n sessionWebhook: string;\n sessionWebhookExpiredTime: number;\n isAdmin?: boolean;\n robotCode?: string;\n}\n\ninterface DingTalkOutgoingMessage {\n msgtype: \"text\" | \"markdown\" | \"actionCard\";\n text?: { content: string };\n markdown?: { title: string; text: string };\n actionCard?: {\n title: string;\n text: string;\n singleTitle?: string;\n singleURL?: string;\n };\n}\n\n// ==================== Channel Implementation ====================\n\nexport class DingTalkChannel implements Channel {\n id = \"dingtalk\";\n type = \"webhook\" as const;\n\n private config: DingTalkConfig;\n private sessionWebhooks = new Map<string, string>();\n private responseBuffers = new Map<string, string>();\n\n constructor(config: DingTalkConfig) {\n this.config = config;\n }\n\n async start(): Promise<void> {\n console.log(\"[DingTalk] Channel started\");\n }\n\n async stop(): Promise<void> {\n this.sessionWebhooks.clear();\n this.responseBuffers.clear();\n console.log(\"[DingTalk] Channel stopped\");\n }\n\n /**\n * Verify webhook signature\n */\n verifySignature(timestamp: string, sign: string): boolean {\n const stringToSign = timestamp + \"\\n\" + this.config.appSecret;\n const hmac = crypto.createHmac(\"sha256\", this.config.appSecret);\n hmac.update(stringToSign);\n const expectedSign = hmac.digest(\"base64\");\n return sign === expectedSign;\n }\n\n /**\n * Parse webhook payload to InboundMessage\n */\n parseWebhook(payload: DingTalkWebhookPayload): InboundMessage {\n // Store session webhook for replying\n this.sessionWebhooks.set(payload.conversationId, payload.sessionWebhook);\n\n return {\n id: payload.msgId,\n source: this.id,\n userId: payload.senderId,\n conversationId: payload.conversationId,\n content: payload.text?.content || \"\",\n metadata: {\n senderNick: payload.senderNick,\n conversationType: payload.conversationType,\n conversationTitle: payload.conversationTitle,\n robotCode: payload.robotCode,\n },\n };\n }\n\n async handleMessage(message: InboundMessage): Promise<void> {\n // Initialize buffer for streaming response\n this.responseBuffers.set(message.conversationId, \"\");\n }\n\n async stream(\n conversationId: string,\n event: AgentStreamEvent\n ): Promise<void> {\n const sessionWebhook = this.sessionWebhooks.get(conversationId);\n if (!sessionWebhook) {\n console.error(\n `[DingTalk] No session webhook for conversation: ${conversationId}`\n );\n return;\n }\n\n if (event.type === \"text-delta\") {\n // Buffer text deltas\n const current = this.responseBuffers.get(conversationId) || \"\";\n this.responseBuffers.set(conversationId, current + event.content);\n } else if (event.type === \"done\") {\n // Send complete response\n const text = this.responseBuffers.get(conversationId) || \"\";\n await this.sendMessage(sessionWebhook, {\n msgtype: \"markdown\",\n markdown: {\n title: \"Reply\",\n text: text,\n },\n });\n this.responseBuffers.delete(conversationId);\n } else if (event.type === \"error\") {\n // Send error message\n await this.sendMessage(sessionWebhook, {\n msgtype: \"text\",\n text: { content: `Error: ${event.error}` },\n });\n this.responseBuffers.delete(conversationId);\n }\n }\n\n /**\n * Send message via DingTalk session webhook\n */\n private async sendMessage(\n webhookUrl: string,\n message: DingTalkOutgoingMessage\n ): Promise<void> {\n try {\n const response = await fetch(webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(message),\n });\n\n if (!response.ok) {\n const error = await response.text();\n console.error(\"[DingTalk] Send message failed:\", error);\n }\n } catch (error) {\n console.error(\"[DingTalk] Send message error:\", error);\n }\n }\n}\n","/**\n * WeCom (WeChat Work) Channel\n *\n * Integrates with WeCom Enterprise Application via webhook.\n * Receives encrypted XML messages and sends replies via WeCom API.\n *\n * @see https://developer.work.weixin.qq.com/document/path/90930\n */\n\nimport crypto from \"crypto\";\nimport {\n Channel,\n InboundMessage,\n AgentStreamEvent,\n WeComConfig,\n} from \"./channel\";\n\n// ==================== WeCom Types ====================\n\ninterface WeComMessage {\n ToUserName: string;\n FromUserName: string;\n CreateTime: number;\n MsgType: string;\n Content?: string;\n MsgId?: string;\n AgentID?: number;\n}\n\n// ==================== Crypto Utils ====================\n\nclass WeComCrypto {\n private token: string;\n private aesKey: Buffer;\n private corpId: string;\n\n constructor(token: string, encodingAESKey: string, corpId: string) {\n this.token = token;\n this.corpId = corpId;\n // AES key is base64 encoded + \"=\" padding, decode to 32 bytes\n this.aesKey = Buffer.from(encodingAESKey + \"=\", \"base64\");\n }\n\n /**\n * Verify callback URL signature\n */\n verifySignature(\n signature: string,\n timestamp: string,\n nonce: string,\n echostr?: string\n ): boolean {\n const sortedParams = [this.token, timestamp, nonce, echostr || \"\"]\n .filter(Boolean)\n .sort()\n .join(\"\");\n const hash = crypto.createHash(\"sha1\").update(sortedParams).digest(\"hex\");\n return hash === signature;\n }\n\n /**\n * Decrypt message\n */\n decrypt(encrypted: string): string {\n const decipher = crypto.createDecipheriv(\n \"aes-256-cbc\",\n this.aesKey,\n this.aesKey.subarray(0, 16)\n );\n decipher.setAutoPadding(false);\n\n let decrypted = Buffer.concat([\n decipher.update(Buffer.from(encrypted, \"base64\")),\n decipher.final(),\n ]);\n\n // Remove PKCS7 padding\n const padLen = decrypted[decrypted.length - 1];\n decrypted = decrypted.subarray(0, decrypted.length - padLen);\n\n // Format: random(16) + msgLen(4) + msg + corpId\n const msgLen = decrypted.readUInt32BE(16);\n const content = decrypted.subarray(20, 20 + msgLen).toString(\"utf-8\");\n\n return content;\n }\n\n /**\n * Encrypt message for reply\n */\n encrypt(message: string): string {\n const random = crypto.randomBytes(16);\n const msgBuffer = Buffer.from(message, \"utf-8\");\n const msgLen = Buffer.alloc(4);\n msgLen.writeUInt32BE(msgBuffer.length);\n const corpIdBuffer = Buffer.from(this.corpId, \"utf-8\");\n\n const plaintext = Buffer.concat([\n random,\n msgLen,\n msgBuffer,\n corpIdBuffer,\n ]);\n\n // PKCS7 padding\n const blockSize = 32;\n const padLen = blockSize - (plaintext.length % blockSize);\n const padding = Buffer.alloc(padLen, padLen);\n const padded = Buffer.concat([plaintext, padding]);\n\n const cipher = crypto.createCipheriv(\n \"aes-256-cbc\",\n this.aesKey,\n this.aesKey.subarray(0, 16)\n );\n cipher.setAutoPadding(false);\n\n const encrypted = Buffer.concat([cipher.update(padded), cipher.final()]);\n return encrypted.toString(\"base64\");\n }\n}\n\n// ==================== Channel Implementation ====================\n\nexport class WeComChannel implements Channel {\n id = \"wecom\";\n type = \"webhook\" as const;\n\n private config: WeComConfig;\n private crypto: WeComCrypto;\n private accessToken: string | null = null;\n private tokenExpiry: number = 0;\n private responseBuffers = new Map<string, string>();\n\n constructor(config: WeComConfig) {\n this.config = config;\n this.crypto = new WeComCrypto(config.token, config.aesKey, config.corpId);\n }\n\n async start(): Promise<void> {\n await this.refreshAccessToken();\n console.log(\"[WeCom] Channel started\");\n }\n\n async stop(): Promise<void> {\n this.accessToken = null;\n this.responseBuffers.clear();\n console.log(\"[WeCom] Channel stopped\");\n }\n\n /**\n * Verify URL callback (for WeCom verification)\n */\n verifyUrl(\n signature: string,\n timestamp: string,\n nonce: string,\n echostr: string\n ): string | null {\n if (this.crypto.verifySignature(signature, timestamp, nonce, echostr)) {\n return this.crypto.decrypt(echostr);\n }\n return null;\n }\n\n /**\n * Parse XML webhook payload\n */\n parseWebhook(xmlContent: string, encrypted: string): InboundMessage | null {\n const decrypted = this.crypto.decrypt(encrypted);\n\n // Simple XML parsing (in production, use a proper XML parser)\n const getTag = (xml: string, tag: string): string => {\n const match = xml.match(new RegExp(`<${tag}><\\\\!\\\\[CDATA\\\\[(.+?)\\\\]\\\\]></${tag}>`));\n return match ? match[1] : \"\";\n };\n\n const fromUser = getTag(decrypted, \"FromUserName\");\n const content = getTag(decrypted, \"Content\");\n const msgId = getTag(decrypted, \"MsgId\");\n\n if (!content) return null;\n\n return {\n id: msgId || crypto.randomUUID(),\n source: this.id,\n userId: fromUser,\n conversationId: fromUser, // Use user ID as conversation ID\n content: content,\n metadata: {\n corpId: this.config.corpId,\n agentId: this.config.agentId,\n },\n };\n }\n\n async handleMessage(message: InboundMessage): Promise<void> {\n this.responseBuffers.set(message.conversationId, \"\");\n }\n\n async stream(\n conversationId: string,\n event: AgentStreamEvent\n ): Promise<void> {\n if (event.type === \"text-delta\") {\n const current = this.responseBuffers.get(conversationId) || \"\";\n this.responseBuffers.set(conversationId, current + event.content);\n } else if (event.type === \"done\") {\n const text = this.responseBuffers.get(conversationId) || \"\";\n await this.sendMessage(conversationId, text);\n this.responseBuffers.delete(conversationId);\n } else if (event.type === \"error\") {\n await this.sendMessage(conversationId, `Error: ${event.error}`);\n this.responseBuffers.delete(conversationId);\n }\n }\n\n /**\n * Send message via WeCom API\n */\n private async sendMessage(userId: string, content: string): Promise<void> {\n const token = await this.getAccessToken();\n const url = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${token}`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n touser: userId,\n msgtype: \"markdown\",\n agentid: this.config.agentId,\n markdown: { content },\n }),\n });\n\n const result = await response.json();\n if (result.errcode !== 0) {\n console.error(\"[WeCom] Send message failed:\", result);\n }\n } catch (error) {\n console.error(\"[WeCom] Send message error:\", error);\n }\n }\n\n /**\n * Get access token (with caching)\n */\n private async getAccessToken(): Promise<string> {\n if (this.accessToken && Date.now() < this.tokenExpiry) {\n return this.accessToken;\n }\n await this.refreshAccessToken();\n return this.accessToken!;\n }\n\n /**\n * Refresh access token from WeCom API\n */\n private async refreshAccessToken(): Promise<void> {\n const url = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${this.config.corpId}&corpsecret=${this.config.secret}`;\n\n try {\n const response = await fetch(url);\n const result = await response.json();\n\n if (result.errcode === 0) {\n this.accessToken = result.access_token;\n // Token expires in 2 hours, refresh 5 minutes early\n this.tokenExpiry = Date.now() + (result.expires_in - 300) * 1000;\n } else {\n console.error(\"[WeCom] Get token failed:\", result);\n }\n } catch (error) {\n console.error(\"[WeCom] Get token error:\", error);\n }\n }\n}\n","#!/usr/bin/env node\n\n// Load environment variables from .env file\nimport \"dotenv/config\";\n\n/**\n * Viber CLI - Command line interface for the Viber framework\n *\n * Commands:\n * viber start - Start the viber daemon (connect to command center)\n * viber run - Run a task locally without connection to command center\n * viber gateway - Start the API gateway server (legacy)\n */\n\nimport { program } from \"commander\";\nimport * as os from \"os\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nconst VERSION = \"1.0.0\";\n\nprogram\n .name(\"openviber\")\n .description(\"OpenViber - Workspace-first assistant runtime (vibers on your machines)\")\n .version(VERSION);\n\n// ==================== viber start ====================\n\nprogram\n .command(\"start\")\n .description(\n \"Start viber with all apps (local mode, or connect to server with --server)\",\n )\n .option(\"-s, --server <url>\", \"Command center URL (enables connected mode)\")\n .option(\"-t, --token <token>\", \"Authentication token (or set VIBER_TOKEN)\")\n .option(\"-n, --name <name>\", \"Viber name\", `${os.hostname()}-viber`)\n .option(\"--desktop\", \"Enable desktop control (UI-TARS)\")\n .option(\"--disable-app <apps...>\", \"Disable specific apps (comma-separated)\")\n .option(\"--no-apps\", \"Disable all apps\")\n .option(\"--reconnect-interval <ms>\", \"Reconnect interval in ms\", \"5000\")\n .option(\"--heartbeat-interval <ms>\", \"Heartbeat interval in ms\", \"30000\")\n .action(async (options) => {\n const { JobScheduler } = await import(\"../daemon/scheduler\");\n const { ViberController } = await import(\"../daemon/controller\");\n const { EventEmitter } = await import(\"events\");\n\n // Import skills module to trigger pre-registration of skill tools\n await import(\"../skills\");\n\n // Get or generate viber ID\n const viberId = await getViberId();\n\n // Token from CLI or env (only required if connecting to server)\n const token = options.token || process.env.VIBER_TOKEN;\n const connectToServer = options.server && token;\n\n if (options.server && !token) {\n console.error(\n \"Error: Authentication token required when using --server.\",\n );\n console.error(\n \"Use --token <token> or set VIBER_TOKEN environment variable.\",\n );\n console.error(\"\\nTo get a token, run: viber login\");\n process.exit(1);\n }\n\n // Initialize Scheduler\n // For demo purposes, we load from \"examples/jobs\". In production, this would be ~/.openviber/jobs\n const jobsDir = path.resolve(process.cwd(), \"examples/jobs\");\n const scheduler = new JobScheduler(jobsDir);\n\n console.log(`[Viber] Initializing Cron Scheduler (jobs: ${jobsDir})...`);\n await scheduler.start();\n\n // Handle graceful shutdown\n const cleanup = async () => {\n console.log(\"\\n[Viber] Shutting down...\");\n await scheduler.stop();\n };\n\n process.on(\"SIGINT\", async () => {\n await cleanup();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n await cleanup();\n process.exit(0);\n });\n\n // Start local WebSocket server for terminal streaming (always, both modes)\n const { LocalServer } = await import(\"../daemon/local-server\");\n const localServer = new LocalServer({ port: 6008 });\n await localServer.start();\n\n // Update cleanup to also stop local server\n const fullCleanup = async () => {\n console.log(\"\\n[Viber] Shutting down...\");\n await localServer.stop();\n await scheduler.stop();\n };\n\n process.removeAllListeners(\"SIGINT\");\n process.removeAllListeners(\"SIGTERM\");\n process.on(\"SIGINT\", async () => {\n await fullCleanup();\n process.exit(0);\n });\n process.on(\"SIGTERM\", async () => {\n await fullCleanup();\n process.exit(0);\n });\n\n // Determine server URL - use provided server, or default to local hub\n const serverUrl = options.server || \"ws://localhost:6007/ws\";\n const authToken = token || \"local-dev-token\"; // Local hub doesn't require auth\n\n const controller = new ViberController({\n serverUrl,\n token: authToken,\n viberId,\n viberName: options.name,\n enableDesktop: options.desktop,\n reconnectInterval: parseInt(options.reconnectInterval, 10),\n heartbeatInterval: parseInt(options.heartbeatInterval, 10),\n });\n\n const isLocalHub = !options.server;\n\n controller.on(\"connected\", () => {\n console.log(`\n╔═══════════════════════════════════════════════════════════╗\n║ VIBER RUNNING ║\n╠═══════════════════════════════════════════════════════════╣\n║ Mode: ${isLocalHub ? \"Local Hub\".padEnd(41) : \"Remote Server\".padEnd(41)\n }║\n║ Viber ID: ${viberId.slice(0, 40).padEnd(40)}║\n║ Server: ${serverUrl.slice(0, 40).padEnd(40)}║\n║ Local WS: ws://localhost:6008 ║\n║ Status: ● Connected ║\n╚═══════════════════════════════════════════════════════════╝\n\nWaiting for tasks...\nPress Ctrl+C to stop.\n `);\n });\n\n controller.on(\"disconnected\", () => {\n if (isLocalHub) {\n console.log(\n \"[Viber] Disconnected from hub. Is the hub running? (pnpm dev:hub)\",\n );\n } else {\n console.log(\"[Viber] Connection lost. Reconnecting...\");\n }\n });\n\n controller.on(\"error\", (error) => {\n console.error(\"[Viber] Error:\", error.message);\n });\n\n await controller.start();\n });\n\n// ==================== viber hub ====================\n\nprogram\n .command(\"hub\")\n .description(\"Start the hub server (coordinator for viber daemons)\")\n .option(\"-p, --port <port>\", \"Port to listen on\", \"6007\")\n .action(async (options) => {\n const { HubServer } = await import(\"../daemon/hub\");\n\n const hub = new HubServer({\n port: parseInt(options.port, 10),\n });\n\n // Handle graceful shutdown\n process.on(\"SIGINT\", async () => {\n console.log(\"\\n[Hub] Shutting down...\");\n await hub.stop();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n console.log(\"\\n[Hub] Shutting down...\");\n await hub.stop();\n process.exit(0);\n });\n\n await hub.start();\n\n console.log(`\n╔═══════════════════════════════════════════════════════════╗\n║ HUB RUNNING ║\n╠═══════════════════════════════════════════════════════════╣\n║ REST API: http://localhost:${options.port.padEnd(27)}║\n║ WebSocket: ws://localhost:${options.port}/ws${\" \".repeat(21)}║\n║ Status: ● Ready for viber connections ║\n╚═══════════════════════════════════════════════════════════╝\n\nWaiting for viber daemons to connect...\nPress Ctrl+C to stop.\n `);\n });\n\n// ==================== viber run ====================\n\nprogram\n .command(\"run <goal>\")\n .description(\"Run a task locally (thin daemon runtime, no Space)\")\n .option(\"-m, --model <model>\", \"LLM model to use\", \"deepseek/deepseek-chat\")\n .option(\"-a, --agent <agent>\", \"Agent config to use\", \"default\")\n .action(async (goal, options) => {\n const { runTask } = await import(\"../daemon/runtime\");\n\n console.log(`[Viber] Running task: ${goal}`);\n\n try {\n const { streamResult } = await runTask(goal, {\n taskId: `run-${Date.now()}`,\n model: options.model,\n singleAgentId: options.agent,\n });\n\n for await (const chunk of streamResult.fullStream) {\n if (chunk.type === \"text-delta\") {\n const text = (chunk as any).text ?? (chunk as any).textDelta;\n if (text) process.stdout.write(text);\n }\n }\n\n console.log(\"\\n\\n[Viber] Task completed\");\n } catch (error: any) {\n console.error(\"[Viber] Task failed:\", error.message);\n process.exit(1);\n }\n });\n\n// ==================== viber login ====================\n\nprogram\n .command(\"login\")\n .description(\"Authenticate with command center and get a token\")\n .option(\"-s, --server <url>\", \"Command center URL\", \"http://localhost:3000\")\n .action(async (options) => {\n console.log(\"[Viber] Opening browser for authentication...\");\n console.log(`\\nVisit: ${options.server}/vibers/register`);\n console.log(\"\\nAfter authentication, you'll receive a token.\");\n console.log(\n \"Set it as VIBER_TOKEN environment variable or use --token option.\\n\",\n );\n\n // Try to open browser\n try {\n const { exec } = await import(\"child_process\");\n const url = `${options.server}/vibers/register`;\n\n if (process.platform === \"darwin\") {\n exec(`open \"${url}\"`);\n } else if (process.platform === \"linux\") {\n exec(`xdg-open \"${url}\"`);\n } else if (process.platform === \"win32\") {\n exec(`start \"${url}\"`);\n }\n } catch {\n // Ignore - user can manually open URL\n }\n });\n\n// ==================== viber status ====================\n\nprogram\n .command(\"status\")\n .description(\"Check viber status and configuration\")\n .action(async () => {\n const viberId = await getViberId();\n const hasToken = !!process.env.VIBER_TOKEN;\n const hasOpenRouter = !!process.env.OPENROUTER_API_KEY;\n\n console.log(`\nViber Status\n────────────────────────────────────\n Viber ID: ${viberId}\n Token: ${hasToken ? \"✓ Set (VIBER_TOKEN)\" : \"✗ Not set\"}\n OpenRouter: ${hasOpenRouter ? \"✓ Set (OPENROUTER_API_KEY)\" : \"✗ Not set\"}\n Config Dir: ${path.join(os.homedir(), \".openviber\")}\n────────────────────────────────────\n `);\n });\n\n// ==================== viber monitor ====================\n\n// Monitor command removed - functionality moved to 'antigravity-healing' app\n// Use `viber start` to run background apps.\n\n// ==================== viber onboard ====================\n\nprogram\n .command(\"onboard\")\n .description(\"Initialize OpenViber configuration (first-time setup)\")\n .action(async () => {\n const configDir = path.join(os.homedir(), \".openviber\");\n const agentsDir = path.join(configDir, \"agents\");\n const jobsDir = path.join(configDir, \"jobs\");\n const spaceDir = path.join(configDir, \"space\");\n\n console.log(`\n╔═══════════════════════════════════════════════════════════╗\n║ OPENVIBER SETUP ║\n╚═══════════════════════════════════════════════════════════╝\n`);\n\n // Create directories\n console.log(\"Creating directories...\");\n await fs.mkdir(configDir, { recursive: true });\n await fs.mkdir(agentsDir, { recursive: true });\n await fs.mkdir(jobsDir, { recursive: true });\n await fs.mkdir(spaceDir, { recursive: true });\n console.log(` ✓ ${configDir}`);\n console.log(` ✓ ${agentsDir}`);\n console.log(` ✓ ${jobsDir}`);\n console.log(` ✓ ${spaceDir}`);\n\n // Create default agent config\n const defaultAgentPath = path.join(agentsDir, \"default.yaml\");\n try {\n await fs.access(defaultAgentPath);\n console.log(`\\n ⏭ agents/default.yaml already exists, skipping`);\n } catch {\n const defaultAgent = `# Default Viber Agent Configuration\nname: default\ndescription: General-purpose assistant\n\n# LLM Provider (openrouter recommended for multi-model access)\nprovider: openrouter\nmodel: anthropic/claude-sonnet-4-20250514\n\n# System prompt\nsystemPrompt: |\n You are a helpful AI assistant running on the user's local machine.\n You have access to files, terminal, and browser tools.\n Be concise and helpful.\n\n# Tools available to this agent\ntools:\n - file\n - terminal\n - browser\n\n# Working mode: \"always-ask\" | \"agent-decides\" | \"always-execute\"\nworkingMode: agent-decides\n`;\n await fs.writeFile(defaultAgentPath, defaultAgent);\n console.log(`\\n ✓ Created agents/default.yaml`);\n }\n\n // Create space bootstrap files\n const taskPath = path.join(spaceDir, \"task.md\");\n try {\n await fs.access(taskPath);\n } catch {\n await fs.writeFile(taskPath, \"# Current Task\\n\\nNo active task.\\n\");\n console.log(` ✓ Created space/task.md`);\n }\n\n const memoryPath = path.join(spaceDir, \"MEMORY.md\");\n try {\n await fs.access(memoryPath);\n } catch {\n await fs.writeFile(memoryPath, \"# Memory\\n\\nLong-term notes and context.\\n\");\n console.log(` ✓ Created space/MEMORY.md`);\n }\n\n // Generate viber ID\n const viberId = await getViberId();\n\n console.log(`\n────────────────────────────────────────────────────────────\nSetup complete!\n\nYour viber ID: ${viberId}\nConfig directory: ${configDir}\n\nNext steps:\n 1. Set your API key:\n export OPENROUTER_API_KEY=\"sk-or-v1-xxx\"\n\n 2. Start your viber:\n openviber start\n\n 3. Or run a quick task:\n openviber run \"Hello, what can you do?\"\n\nGet an API key at: https://openrouter.ai/keys\n────────────────────────────────────────────────────────────\n`);\n });\n\n// ==================== viber gateway ====================\n\nprogram\n .command(\"gateway\")\n .description(\"Start the enterprise channel gateway (DingTalk, WeCom, etc.)\")\n .option(\"-p, --port <port>\", \"Gateway port\", \"6009\")\n .action(async (options) => {\n const { channelManager } = await import(\"../channels/manager\");\n const { DingTalkChannel } = await import(\"../channels/dingtalk\");\n const { WeComChannel } = await import(\"../channels/wecom\");\n\n console.log(`\n╔═══════════════════════════════════════════════════════════╗\n║ GATEWAY STARTING ║\n╚═══════════════════════════════════════════════════════════╝\n`);\n\n // Register channels based on environment\n const channels: string[] = [];\n\n if (process.env.DINGTALK_APP_KEY && process.env.DINGTALK_APP_SECRET) {\n channelManager.register(\n new DingTalkChannel({\n enabled: true,\n appKey: process.env.DINGTALK_APP_KEY,\n appSecret: process.env.DINGTALK_APP_SECRET,\n robotCode: process.env.DINGTALK_ROBOT_CODE,\n })\n );\n channels.push(\"DingTalk\");\n }\n\n if (\n process.env.WECOM_CORP_ID &&\n process.env.WECOM_AGENT_SECRET &&\n process.env.WECOM_TOKEN &&\n process.env.WECOM_ENCODING_AES_KEY\n ) {\n channelManager.register(\n new WeComChannel({\n enabled: true,\n corpId: process.env.WECOM_CORP_ID,\n agentId: process.env.WECOM_AGENT_ID || \"0\",\n secret: process.env.WECOM_AGENT_SECRET,\n token: process.env.WECOM_TOKEN,\n aesKey: process.env.WECOM_ENCODING_AES_KEY,\n })\n );\n channels.push(\"WeCom\");\n }\n\n\n if (channels.length === 0) {\n console.log(`\nNo channels configured. Set environment variables to enable channels:\n\nDingTalk:\n DINGTALK_APP_KEY, DINGTALK_APP_SECRET, DINGTALK_ROBOT_CODE\n\nWeCom:\n WECOM_CORP_ID, WECOM_AGENT_ID, WECOM_AGENT_SECRET\n WECOM_TOKEN, WECOM_ENCODING_AES_KEY (optional)\n\nRun 'openviber gateway' again after setting environment variables.\n`);\n process.exit(1);\n }\n\n // Start all channels\n await channelManager.startAll();\n\n // Handle graceful shutdown\n process.on(\"SIGINT\", async () => {\n console.log(\"\\n[Gateway] Shutting down...\");\n await channelManager.stopAll();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n console.log(\"\\n[Gateway] Shutting down...\");\n await channelManager.stopAll();\n process.exit(0);\n });\n\n console.log(`\n╔═══════════════════════════════════════════════════════════╗\n║ GATEWAY RUNNING ║\n╠═══════════════════════════════════════════════════════════╣\n║ Channels: ${channels.join(\", \").padEnd(41)}║\n║ Status: ● Ready ║\n╚═══════════════════════════════════════════════════════════╝\n\nListening for messages from enterprise channels...\nPress Ctrl+C to stop.\n`);\n });\n\n// ==================== Helpers ====================\n\nasync function getViberId(): Promise<string> {\n const configDir = path.join(os.homedir(), \".openviber\");\n const idFile = path.join(configDir, \"viber-id\");\n\n try {\n await fs.mkdir(configDir, { recursive: true });\n const id = await fs.readFile(idFile, \"utf8\");\n return id.trim();\n } catch {\n // Generate new ID\n const id = `viber-${os\n .hostname()\n .toLowerCase()\n .replace(/[^a-z0-9]/g, \"\")}-${Date.now().toString(36).slice(-6)}`;\n await fs.writeFile(idFile, id);\n return id;\n }\n}\n\n// ==================== Main ====================\n\nprogram.parse();\n"],"mappings":"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","names":["config","path","path","yaml","config","path","path","dirname","SupabaseStorageAdapter","LocalStorageAdapter","fs","path","init_local","generateShortId","config","SupabaseDatabaseAdapter","init_local","path","fs","config","init_base","SpaceStorageFactory","z","fs","path","init_base","config","content","stats","files","z","config","z","init_base","config","z","init_base","config","resolve","z","init_base","config","resolve","z","init_base","getServerDataAdapter","config","tools","buildToolMap","getServerDataAdapter","fs","path","yaml","fileURLToPath","__dirname","__filename","config","config","buildToolMap","fs","path","yaml","config","Agent","fs","path","fileURLToPath","yaml","config","__filename","__dirname","window","EventEmitter","WebSocket","config","defaultRegistry","z","z","execSync","spawnSync","path","getTools","z","execSync","spawnSync","path","runInTmux","getTools","getTools","WebSocket","config","resolve","WebSocketServer","URL","config","resolve","space_exports","init_space","config","generateText","z","config","startSpace","SpaceStorageFactory","EventEmitter","config","crypto","config","os","fs","path","JobScheduler","ViberController","EventEmitter","LocalServer","HubServer","runTask","exec","channelManager","DingTalkChannel","WeComChannel"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/module-path.ts","../../src/utils/version.ts","../../src/utils/paths.ts","../../src/skills/hub/providers/openclaw.ts","../../src/skills/hub/providers/github.ts","../../src/skills/hub/providers/npm.ts","../../src/skills/hub/providers/huggingface.ts","../../src/skills/hub/providers/smithery.ts","../../src/skills/hub/providers/composio.ts","../../src/skills/hub/providers/glama.ts","../../src/skills/hub/providers/index.ts","../../src/skills/hub/manager.ts","../../src/skills/hub/settings.ts","../../src/utils/logger.ts","../../src/skills/registry.ts","../../src/tools/gemini-auth.ts","../../src/skills/health.ts","../../src/cli/auth.ts","../../src/worker/message.ts","../../src/worker/provider.ts","../../src/worker/preflight.ts","../../src/worker/config.ts","../../src/tools/base.ts","../../src/tools/file.ts","../../src/tools/search-config.ts","../../src/tools/search.ts","../../src/tools/web.ts","../../src/tools/browser.ts","../../src/tools/desktop.ts","../../src/utils/security.ts","../../src/tools/shell.ts","../../src/tools/schedule.ts","../../src/tools/notify.ts","../../src/tools/index.ts","../../src/worker/tool.ts","../../src/utils/id.ts","../../src/tools/registry.ts","../../src/worker/agent.ts","../../src/daemon/scheduler.ts","../../src/utils/proxy.ts","../../src/daemon/runtime.ts","../../src/daemon/memory.ts","../../src/daemon/terminal.ts","../../src/daemon/telemetry.ts","../../src/daemon/config-validator.ts","../../src/daemon/controller.ts","../../src/tools/cursor-agent.ts","../../src/tools/codex-cli.ts","../../src/tools/gemini-cli.ts","../../src/tools/github.ts","../../src/tools/terminal.ts","../../src/tools/railway.ts","../../src/tools/gmail.ts","../../src/tools/system-info.ts","../../src/tools/skill-tools.ts","../../src/utils/router.ts","../../src/gateway/tasks.ts","../../src/gateway/vibers.ts","../../src/gateway/events.ts","../../src/gateway/skills.ts","../../src/gateway/server.ts","../../src/daemon/local-server.ts","../../src/skills/hub/index.ts","../../src/worker/task.ts","../../src/worker/plan.ts","../../src/worker/collaboration.ts","../../src/worker/space.ts","../../src/worker/viber-agent.ts","../../src/channels/manager.ts","../../src/channels/webhook.ts","../../src/channels/gateway.ts","../../src/channels/config.ts","../../src/channels/dingtalk.ts","../../src/channels/wecom.ts","../../src/channels/wechat.ts","../../src/channels/web.ts","../../src/channels/chunk.ts","../../src/channels/discord.ts","../../src/channels/feishu.ts","../../src/channels/telegram.ts","../../src/channels/registry.ts","../../src/channels/builtin.ts","../../src/cli/index.ts","../../src/cli/common.ts","../../src/cli/launcher.ts","../../src/cli/gateway-client.ts","../../src/cli/commands/start.ts","../../src/cli/commands/gateway.ts","../../src/cli/commands/run.ts","../../src/cli/commands/chat.ts","../../src/cli/commands/term.ts","../../src/cli/commands/auth.ts","../../src/cli/commands/status.ts","../../src/cli/commands/onboard.ts","../../src/cli/commands/skill.ts","../../src/cli/commands/channels.ts"],"sourcesContent":["import path from \"path\";\nimport { fileURLToPath } from \"url\";\n\n/**\n * Resolve the current module directory in both ESM and CJS runtimes.\n */\nexport function getModuleDirname(): string {\n if (typeof __dirname !== \"undefined\") {\n return __dirname;\n }\n\n try {\n const metaUrl = (0, eval)(\"import.meta.url\") as string | undefined;\n if (metaUrl) {\n return path.dirname(fileURLToPath(metaUrl));\n }\n } catch {\n // Ignore environments where import.meta is unavailable.\n }\n\n return process.cwd();\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport path from \"path\";\nimport { getModuleDirname } from \"./module-path\";\n\ninterface PackageJsonVersion {\n name?: string;\n version?: string;\n}\n\nlet cachedVersion: string | null = null;\n\n/**\n * Resolve the OpenViber package version from the nearest package.json.\n */\nexport function getOpenViberVersion(): string {\n if (cachedVersion) {\n return cachedVersion;\n }\n\n let currentDir = getModuleDirname();\n\n while (true) {\n const packageJsonPath = path.join(currentDir, \"package.json\");\n if (existsSync(packageJsonPath)) {\n try {\n const raw = readFileSync(packageJsonPath, \"utf8\");\n const parsed = JSON.parse(raw) as PackageJsonVersion;\n if (parsed.version && (!parsed.name || parsed.name === \"openviber\")) {\n cachedVersion = parsed.version;\n return cachedVersion;\n }\n } catch {\n // Keep walking up the directory tree.\n }\n }\n\n const parent = path.dirname(currentDir);\n if (parent === currentDir) {\n break;\n }\n currentDir = parent;\n }\n\n cachedVersion = \"0.0.0\";\n return cachedVersion;\n}\n","/**\n * Centralized OpenViber path resolution utility\n *\n * Handles the difference between local development and deployment:\n * - Local: ~/.openviber (os.homedir() + '.openviber')\n * - Railway/override: OPENVIBER_STORAGE_PATH environment variable\n */\n\nimport path from \"path\";\nimport os from \"os\";\n\n/**\n * Get the root OpenViber directory path\n * Respects OPENVIBER_STORAGE_PATH environment variable\n */\nexport function getViberRoot(): string {\n return process.env.OPENVIBER_STORAGE_PATH || path.join(os.homedir(), \".openviber\");\n}\n\n/**\n * Get a path within the OpenViber directory structure\n * @param subPath - Relative path within .openviber directory (e.g., 'vibers/default', 'skills/terminal')\n */\nexport function getViberPath(...subPaths: string[]): string {\n return path.join(getViberRoot(), ...subPaths);\n}\n\n/**\n * Get common OpenViber directory paths\n */\nexport const ViberPaths = {\n root: () => getViberRoot(),\n config: () => getViberPath(\"config\"),\n spaces: () => getViberPath(\"spaces\"),\n defaults: () => getViberPath(\"defaults\"),\n playgrounds: () => getViberPath(\"playgrounds\"),\n\n // MCP server organization\n mcpServers: () => getViberPath(\"mcp-servers\"),\n mcpServerShared: () => getViberPath(\"mcp-servers\", \"shared\"),\n\n // Specific paths\n vibers: () => getViberPath(\"vibers\"),\n datasets: () => getViberPath(\"config\", \"datasets\"),\n tools: () => getViberPath(\"config\", \"tools\"),\n\n // MCP server paths - now using npm package\n officeMcpServer: () => \"office-mcp\", // npm package name\n officeMcpExecutable: () => \"office-mcp\", // npm package command\n\n // Default templates and configuration\n defaultsVibers: () => getViberPath(\"defaults\", \"vibers\"),\n defaultsSpaces: () => getViberPath(\"defaults\", \"spaces\"),\n\n // Space-specific paths\n space: (spaceId: string) => getViberPath(\"spaces\", spaceId),\n spaceArtifacts: (spaceId: string) =>\n getViberPath(\"spaces\", spaceId, \"artifacts\"),\n\n // Note: MCP servers are now distributed as npm packages, not local binaries\n} as const;\n","/**\n * OpenClaw Skill Hub Provider\n *\n * Connects to the OpenClaw community skill registry — a public REST API\n * where users publish and discover OpenViber skills.\n *\n * Default endpoint: https://hub.openclaw.org/api/v1\n * Override with OPENCLAW_HUB_URL environment variable.\n */\n\nimport type {\n SkillHubProvider,\n SkillSearchQuery,\n SkillSearchResult,\n ExternalSkillInfo,\n SkillImportResult,\n SkillHubProviderConfig,\n} from \"../types\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nconst DEFAULT_HUB_URL = \"https://hub.openclaw.org/api/v1\";\n\nexport class OpenClawProvider implements SkillHubProvider {\n readonly type = \"openclaw\" as const;\n readonly displayName = \"OpenClaw Skill Hub\";\n private config: SkillHubProviderConfig;\n\n constructor(config?: SkillHubProviderConfig) {\n this.config = config ?? {};\n }\n\n setConfig(config?: SkillHubProviderConfig): void {\n this.config = config ?? {};\n }\n\n private getHubUrl(): string {\n return (\n this.config.url ||\n process.env.OPENCLAW_HUB_URL ||\n DEFAULT_HUB_URL\n ).replace(/\\/$/, \"\");\n }\n\n async search(query: SkillSearchQuery): Promise<SkillSearchResult> {\n const hubUrl = this.getHubUrl();\n const params = new URLSearchParams();\n\n if (query.query) params.set(\"q\", query.query);\n if (query.tags?.length) params.set(\"tags\", query.tags.join(\",\"));\n if (query.author) params.set(\"author\", query.author);\n if (query.sort) params.set(\"sort\", query.sort);\n params.set(\"page\", String(query.page ?? 1));\n params.set(\"limit\", String(query.limit ?? 20));\n\n try {\n const res = await fetch(`${hubUrl}/skills?${params.toString()}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) {\n console.warn(`[OpenClaw] Search failed: HTTP ${res.status}`);\n return { skills: [], total: 0, page: 1, totalPages: 0 };\n }\n\n const data = (await res.json()) as any;\n\n return {\n skills: (data.skills ?? data.results ?? []).map(mapOpenClawSkill),\n total: data.total ?? 0,\n page: data.page ?? 1,\n totalPages: data.totalPages ?? data.total_pages ?? 0,\n };\n } catch (err: any) {\n console.warn(`[OpenClaw] Search error: ${err?.message || String(err)}`);\n return { skills: [], total: 0, page: 1, totalPages: 0 };\n }\n }\n\n async getSkillInfo(skillId: string): Promise<ExternalSkillInfo | null> {\n const hubUrl = this.getHubUrl();\n\n try {\n const res = await fetch(`${hubUrl}/skills/${encodeURIComponent(skillId)}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) return null;\n\n const data = (await res.json()) as any;\n return mapOpenClawSkill(data);\n } catch {\n return null;\n }\n }\n\n async importSkill(skillId: string, targetDir: string): Promise<SkillImportResult> {\n const hubUrl = this.getHubUrl();\n\n try {\n // Fetch the skill tarball / archive from OpenClaw hub\n const infoRes = await fetch(`${hubUrl}/skills/${encodeURIComponent(skillId)}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n });\n\n if (!infoRes.ok) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Skill not found on OpenClaw hub`,\n error: `HTTP ${infoRes.status}`,\n };\n }\n\n const info = (await infoRes.json()) as any;\n const downloadUrl: string = info.downloadUrl || info.download_url || info.tarball;\n\n if (!downloadUrl) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: \"No download URL available for this skill\",\n };\n }\n\n // Download the skill archive\n const archiveRes = await fetch(downloadUrl, {\n signal: AbortSignal.timeout(60000),\n });\n\n if (!archiveRes.ok) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Failed to download skill archive`,\n error: `HTTP ${archiveRes.status}`,\n };\n }\n\n const safeName = (info.name || skillId).replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const installPath = path.join(targetDir, safeName);\n await fs.mkdir(installPath, { recursive: true });\n\n // Write the archive to a temp file and extract\n const buffer = Buffer.from(await archiveRes.arrayBuffer());\n const archivePath = path.join(installPath, \"__download.tar.gz\");\n await fs.writeFile(archivePath, buffer);\n\n const { execSync } = await import(\"child_process\");\n execSync(`tar -xzf \"${archivePath}\" -C \"${installPath}\" --strip-components=1`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 30000,\n });\n\n // Clean up archive\n await fs.unlink(archivePath).catch(() => { });\n\n return {\n ok: true,\n skillId,\n installPath,\n message: `Skill '${safeName}' imported from OpenClaw to ${installPath}`,\n };\n } catch (err: any) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Failed to import skill from OpenClaw`,\n error: err?.message || String(err),\n };\n }\n }\n}\n\n/** Map an OpenClaw API response to our ExternalSkillInfo type */\nfunction mapOpenClawSkill(raw: any): ExternalSkillInfo {\n return {\n id: raw.id || raw.slug || raw.name || \"unknown\",\n name: raw.name || raw.title || \"Untitled Skill\",\n description: raw.description || raw.summary || \"\",\n author: raw.author || raw.publisher || raw.owner || \"unknown\",\n version: raw.version || raw.latest_version || \"0.0.0\",\n source: \"openclaw\",\n url: raw.url || raw.homepage || \"\",\n tags: raw.tags || raw.categories || [],\n popularity: raw.downloads ?? raw.stars ?? 0,\n updatedAt: raw.updatedAt || raw.updated_at || undefined,\n readme: raw.readme || undefined,\n license: raw.license || undefined,\n dependencies: raw.dependencies || undefined,\n };\n}\n","/**\n * GitHub Skill Provider\n *\n * Imports OpenViber skills directly from GitHub repositories.\n *\n * Supported import formats:\n * - \"owner/repo\" — full repo is a skill (must contain SKILL.md at root)\n * - \"owner/repo/path/to/skill\" — sub-directory skill\n * - \"owner/repo#branch\" — specific branch\n *\n * Skills are cloned/downloaded into ~/.openviber/skills/<skill-name>/\n *\n * Search uses the GitHub Search API to find repos with topic \"openviber-skill\"\n * or that contain a SKILL.md file.\n */\n\nimport type {\n SkillHubProvider,\n SkillSearchQuery,\n SkillSearchResult,\n ExternalSkillInfo,\n SkillImportResult,\n SkillHubProviderConfig,\n} from \"../types\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nconst DEFAULT_GITHUB_API = \"https://api.github.com\";\n\n/**\n * Parse a GitHub skill reference like \"owner/repo\", \"owner/repo#branch\", or\n * \"owner/repo/subdir\"\n */\nfunction parseGitHubRef(ref: string): {\n owner: string;\n repo: string;\n branch?: string;\n subpath?: string;\n} {\n let working = ref.trim();\n\n // Remove github.com URL prefix if present\n working = working\n .replace(/^https?:\\/\\/github\\.com\\//, \"\")\n .replace(/\\.git$/, \"\");\n\n // Extract branch from \"#branch\" suffix\n let branch: string | undefined;\n const hashIdx = working.indexOf(\"#\");\n if (hashIdx !== -1) {\n branch = working.slice(hashIdx + 1);\n working = working.slice(0, hashIdx);\n }\n\n const parts = working.split(\"/\").filter(Boolean);\n const owner = parts[0] || \"\";\n const repo = parts[1] || \"\";\n const subpath = parts.length > 2 ? parts.slice(2).join(\"/\") : undefined;\n\n return { owner, repo, branch, subpath };\n}\n\nexport class GitHubProvider implements SkillHubProvider {\n readonly type = \"github\" as const;\n readonly displayName = \"GitHub\";\n private config: SkillHubProviderConfig;\n\n constructor(config?: SkillHubProviderConfig) {\n this.config = config ?? {};\n }\n\n setConfig(config?: SkillHubProviderConfig): void {\n this.config = config ?? {};\n }\n\n private getApiUrl(): string {\n return (\n this.config.url ||\n process.env.GITHUB_API_URL ||\n DEFAULT_GITHUB_API\n ).replace(/\\/$/, \"\");\n }\n\n private getGitHubHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"OpenViber-SkillHub/1.0\",\n };\n const token =\n this.config.apiKey || process.env.GITHUB_TOKEN || process.env.GH_TOKEN;\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n }\n\n async search(query: SkillSearchQuery): Promise<SkillSearchResult> {\n const headers = this.getGitHubHeaders();\n const apiBase = this.getApiUrl();\n const page = query.page ?? 1;\n const perPage = Math.min(query.limit ?? 20, 100);\n\n // Build GitHub search query\n const searchTerms: string[] = [];\n\n if (query.query) {\n searchTerms.push(query.query);\n }\n\n // Always include the topic filter to find OpenViber skills\n searchTerms.push(\"topic:openviber-skill\");\n\n // Also search for repos with SKILL.md in the filename\n // Combine: topic-based OR filename-based\n const q = searchTerms.join(\" \");\n\n // Determine sort parameter\n let sort = \"best-match\";\n let order = \"desc\";\n if (query.sort === \"popularity\") {\n sort = \"stars\";\n } else if (query.sort === \"recent\") {\n sort = \"updated\";\n } else if (query.sort === \"name\") {\n sort = \"name\";\n order = \"asc\";\n }\n\n try {\n const params = new URLSearchParams({\n q,\n sort: sort === \"best-match\" ? \"\" : sort,\n order,\n page: String(page),\n per_page: String(perPage),\n });\n\n const res = await fetch(\n `${apiBase}/search/repositories?${params.toString()}`,\n {\n headers,\n signal: AbortSignal.timeout(15000),\n },\n );\n\n if (!res.ok) {\n console.warn(`[GitHub] Search failed: HTTP ${res.status}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n\n const data = (await res.json()) as any;\n const total = data.total_count ?? 0;\n const totalPages = Math.ceil(total / perPage);\n\n const skills: ExternalSkillInfo[] = (data.items ?? []).map(\n (repo: any): ExternalSkillInfo => ({\n id: repo.full_name || `${repo.owner?.login}/${repo.name}`,\n name: repo.name || \"unknown\",\n description: repo.description || \"\",\n author: repo.owner?.login || \"unknown\",\n version: \"latest\",\n source: \"github\",\n url: repo.html_url || \"\",\n tags: repo.topics || [],\n popularity: repo.stargazers_count ?? 0,\n updatedAt: repo.updated_at || repo.pushed_at || undefined,\n license: repo.license?.spdx_id || undefined,\n }),\n );\n\n return { skills, total, page, totalPages };\n } catch (err: any) {\n console.warn(`[GitHub] Search error: ${err?.message || String(err)}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n }\n\n async getSkillInfo(skillId: string): Promise<ExternalSkillInfo | null> {\n const { owner, repo } = parseGitHubRef(skillId);\n if (!owner || !repo) return null;\n\n const headers = this.getGitHubHeaders();\n const apiBase = this.getApiUrl();\n\n try {\n const res = await fetch(`${apiBase}/repos/${owner}/${repo}`, {\n headers,\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) return null;\n\n const data = (await res.json()) as any;\n\n // Try to fetch SKILL.md for description\n let readme: string | undefined;\n try {\n const skillMdRes = await fetch(\n `https://raw.githubusercontent.com/${owner}/${repo}/${data.default_branch || \"main\"}/SKILL.md`,\n { signal: AbortSignal.timeout(10000) },\n );\n if (skillMdRes.ok) {\n readme = await skillMdRes.text();\n }\n } catch {\n // ignore\n }\n\n // If no SKILL.md, try README\n if (!readme) {\n try {\n const readmeRes = await fetch(\n `${apiBase}/repos/${owner}/${repo}/readme`,\n {\n headers: { ...headers, Accept: \"application/vnd.github.raw\" },\n signal: AbortSignal.timeout(10000),\n },\n );\n if (readmeRes.ok) {\n readme = await readmeRes.text();\n }\n } catch {\n // ignore\n }\n }\n\n return {\n id: data.full_name || `${owner}/${repo}`,\n name: data.name || repo,\n description: data.description || \"\",\n author: data.owner?.login || owner,\n version: \"latest\",\n source: \"github\",\n url: data.html_url || `https://github.com/${owner}/${repo}`,\n tags: data.topics || [],\n popularity: data.stargazers_count ?? 0,\n updatedAt: data.updated_at || data.pushed_at || undefined,\n readme,\n license: data.license?.spdx_id || undefined,\n };\n } catch {\n return null;\n }\n }\n\n async importSkill(\n skillId: string,\n targetDir: string,\n ): Promise<SkillImportResult> {\n const { owner, repo, branch, subpath } = parseGitHubRef(skillId);\n\n if (!owner || !repo) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Invalid GitHub reference: ${skillId}. Use format: owner/repo`,\n };\n }\n\n const safeName = `${owner}-${repo}`.replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const installPath = path.join(targetDir, safeName);\n\n try {\n // Try cloning via git (preferred — gets the full repo)\n const cloneUrl = `https://github.com/${owner}/${repo}.git`;\n const branchArg = branch ? `--branch ${branch}` : \"\";\n const { execSync } = await import(\"child_process\");\n\n // Check if already exists\n try {\n await fs.access(path.join(installPath, \"SKILL.md\"));\n // Update existing\n try {\n execSync(\"git pull --ff-only\", {\n cwd: installPath,\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 60000,\n });\n return {\n ok: true,\n skillId,\n installPath,\n message: `Skill '${safeName}' updated from GitHub (git pull)`,\n };\n } catch {\n // pull failed, re-clone below\n }\n } catch {\n // doesn't exist yet, clone below\n }\n\n // Clone fresh\n await fs.rm(installPath, { recursive: true, force: true });\n await fs.mkdir(targetDir, { recursive: true });\n\n execSync(\n `git clone --depth 1 ${branchArg} \"${cloneUrl}\" \"${installPath}\"`,\n {\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 120000,\n },\n );\n\n // If subpath, move the sub-directory content up\n if (subpath) {\n const subDir = path.join(installPath, subpath);\n const tmpDir = `${installPath}.__tmp__`;\n await fs.rename(subDir, tmpDir);\n await fs.rm(installPath, { recursive: true, force: true });\n await fs.rename(tmpDir, installPath);\n }\n\n // Verify SKILL.md exists, otherwise generate one\n try {\n await fs.access(path.join(installPath, \"SKILL.md\"));\n } catch {\n // Generate a basic SKILL.md from repo metadata\n await generateSkillMd(installPath, {\n name: safeName,\n owner,\n repo,\n skillId,\n });\n }\n\n return {\n ok: true,\n skillId,\n installPath,\n message: `Skill '${safeName}' imported from GitHub to ${installPath}`,\n };\n } catch (err: any) {\n // Fallback: download tarball\n try {\n return await this.importViaTarball(\n owner,\n repo,\n branch,\n subpath,\n safeName,\n installPath,\n targetDir,\n skillId,\n );\n } catch (fallbackErr: any) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Failed to import skill from GitHub`,\n error: `git clone failed: ${err?.message}; tarball fallback failed: ${fallbackErr?.message}`,\n };\n }\n }\n }\n\n /** Fallback: download as tarball when git clone is not available */\n private async importViaTarball(\n owner: string,\n repo: string,\n branch: string | undefined,\n subpath: string | undefined,\n safeName: string,\n installPath: string,\n targetDir: string,\n skillId: string,\n ): Promise<SkillImportResult> {\n const ref = branch || \"main\";\n const tarballUrl = `https://github.com/${owner}/${repo}/archive/refs/heads/${ref}.tar.gz`;\n\n const res = await fetch(tarballUrl, {\n signal: AbortSignal.timeout(60000),\n });\n\n if (!res.ok) {\n throw new Error(`Tarball download failed: HTTP ${res.status}`);\n }\n\n await fs.mkdir(installPath, { recursive: true });\n\n const buffer = Buffer.from(await res.arrayBuffer());\n const archivePath = path.join(targetDir, `__${safeName}.tar.gz`);\n await fs.writeFile(archivePath, buffer);\n\n const { execSync } = await import(\"child_process\");\n execSync(\n `tar -xzf \"${archivePath}\" -C \"${installPath}\" --strip-components=1`,\n {\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 30000,\n },\n );\n\n await fs.unlink(archivePath).catch(() => { });\n\n // Handle subpath\n if (subpath) {\n const subDir = path.join(installPath, subpath);\n const tmpDir = `${installPath}.__tmp__`;\n await fs.rename(subDir, tmpDir);\n await fs.rm(installPath, { recursive: true, force: true });\n await fs.rename(tmpDir, installPath);\n }\n\n // Verify or generate SKILL.md\n try {\n await fs.access(path.join(installPath, \"SKILL.md\"));\n } catch {\n await generateSkillMd(installPath, {\n name: safeName,\n owner,\n repo,\n skillId,\n });\n }\n\n return {\n ok: true,\n skillId,\n installPath,\n message: `Skill '${safeName}' imported from GitHub (tarball) to ${installPath}`,\n };\n }\n}\n\n/** Generate a basic SKILL.md if the repo doesn't include one */\nasync function generateSkillMd(\n installPath: string,\n meta: { name: string; owner: string; repo: string; skillId: string },\n): Promise<void> {\n const content = `---\nname: ${meta.name}\nversion: 0.0.0\ndescription: Imported from GitHub (${meta.owner}/${meta.repo})\nsource: github\nsourceUrl: https://github.com/${meta.owner}/${meta.repo}\n---\n\n# ${meta.name}\n\nImported from [${meta.owner}/${meta.repo}](https://github.com/${meta.owner}/${meta.repo}).\n\n> This SKILL.md was auto-generated during import. Edit it to customize the skill description and instructions.\n`;\n await fs.writeFile(path.join(installPath, \"SKILL.md\"), content, \"utf8\");\n}\n","/**\n * npm Skill Provider\n *\n * Imports OpenViber skills published as npm packages.\n *\n * Convention: packages are scoped as `@openviber-skills/<name>` or tagged\n * with the \"openviber-skill\" keyword in their package.json.\n *\n * Search uses the npm registry search API.\n * Import downloads and extracts the package to ~/.openviber/skills/<name>/\n */\n\nimport type {\n SkillHubProvider,\n SkillSearchQuery,\n SkillSearchResult,\n ExternalSkillInfo,\n SkillImportResult,\n SkillHubProviderConfig,\n} from \"../types\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nconst DEFAULT_NPM_REGISTRY = \"https://registry.npmjs.org\";\n\nexport class NpmProvider implements SkillHubProvider {\n readonly type = \"npm\" as const;\n readonly displayName = \"npm Registry\";\n private config: SkillHubProviderConfig;\n\n constructor(config?: SkillHubProviderConfig) {\n this.config = config ?? {};\n }\n\n setConfig(config?: SkillHubProviderConfig): void {\n this.config = config ?? {};\n }\n\n private getRegistryBase(): string {\n return (\n this.config.url ||\n process.env.NPM_REGISTRY_URL ||\n DEFAULT_NPM_REGISTRY\n ).replace(/\\/$/, \"\");\n }\n\n async search(query: SkillSearchQuery): Promise<SkillSearchResult> {\n const registryBase = this.getRegistryBase();\n const searchUrl = `${registryBase}/-/v1/search`;\n const page = query.page ?? 1;\n const size = Math.min(query.limit ?? 20, 250);\n const from = (page - 1) * size;\n\n // Build search text — always include \"openviber-skill\" keyword\n const textParts: string[] = [\"keywords:openviber-skill\"];\n if (query.query) textParts.push(query.query);\n if (query.author) textParts.push(`author:${query.author}`);\n\n const params = new URLSearchParams({\n text: textParts.join(\" \"),\n size: String(size),\n from: String(from),\n });\n\n // npm search quality/popularity/maintenance parameters\n if (query.sort === \"popularity\") {\n params.set(\"popularity\", \"1.0\");\n params.set(\"quality\", \"0.0\");\n params.set(\"maintenance\", \"0.0\");\n } else if (query.sort === \"recent\") {\n params.set(\"maintenance\", \"1.0\");\n params.set(\"quality\", \"0.0\");\n params.set(\"popularity\", \"0.0\");\n }\n\n try {\n const res = await fetch(`${searchUrl}?${params.toString()}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) {\n console.warn(`[npm] Search failed: HTTP ${res.status}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n\n const data = (await res.json()) as any;\n const total = data.total ?? 0;\n const totalPages = Math.ceil(total / size);\n\n const skills: ExternalSkillInfo[] = (data.objects ?? []).map(\n (obj: any): ExternalSkillInfo => {\n const pkg = obj.package || {};\n return {\n id: pkg.name || \"unknown\",\n name: pkg.name || \"unknown\",\n description: pkg.description || \"\",\n author:\n (typeof pkg.author === \"string\"\n ? pkg.author\n : pkg.author?.name) || pkg.publisher?.username || \"unknown\",\n version: pkg.version || \"0.0.0\",\n source: \"npm\",\n url:\n pkg.links?.npm ||\n pkg.links?.homepage ||\n `https://www.npmjs.com/package/${pkg.name}`,\n tags: pkg.keywords || [],\n popularity: Math.round((obj.score?.detail?.popularity ?? 0) * 1000),\n updatedAt: pkg.date || undefined,\n license: pkg.license || undefined,\n };\n },\n );\n\n return { skills, total, page, totalPages };\n } catch (err: any) {\n console.warn(`[npm] Search error: ${err?.message || String(err)}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n }\n\n async getSkillInfo(skillId: string): Promise<ExternalSkillInfo | null> {\n try {\n const registryBase = this.getRegistryBase();\n const res = await fetch(\n `${registryBase}/${encodeURIComponent(skillId)}`,\n {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n },\n );\n\n if (!res.ok) return null;\n\n const data = (await res.json()) as any;\n const latest = data[\"dist-tags\"]?.latest;\n const latestVersion = latest ? data.versions?.[latest] : null;\n\n return {\n id: data.name || skillId,\n name: data.name || skillId,\n description: data.description || \"\",\n author:\n (typeof data.author === \"string\"\n ? data.author\n : data.author?.name) || \"unknown\",\n version: latest || \"0.0.0\",\n source: \"npm\",\n url: `https://www.npmjs.com/package/${data.name}`,\n tags: data.keywords || [],\n popularity: 0,\n updatedAt: data.time?.[latest] || data.time?.modified || undefined,\n readme: data.readme || undefined,\n license:\n (typeof data.license === \"string\"\n ? data.license\n : data.license?.type) || undefined,\n dependencies: latestVersion?.dependencies\n ? Object.keys(latestVersion.dependencies)\n : undefined,\n };\n } catch {\n return null;\n }\n }\n\n async importSkill(\n skillId: string,\n targetDir: string,\n ): Promise<SkillImportResult> {\n try {\n const registryBase = this.getRegistryBase();\n // Fetch package metadata to get tarball URL\n const res = await fetch(\n `${registryBase}/${encodeURIComponent(skillId)}`,\n {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n },\n );\n\n if (!res.ok) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Package not found on npm: ${skillId}`,\n error: `HTTP ${res.status}`,\n };\n }\n\n const data = (await res.json()) as any;\n const latest = data[\"dist-tags\"]?.latest;\n const latestVersion = latest ? data.versions?.[latest] : null;\n const tarball = latestVersion?.dist?.tarball;\n\n if (!tarball) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `No tarball found for ${skillId}@${latest || \"latest\"}`,\n };\n }\n\n // Create skill directory — use package short name\n const safeName = (data.name || skillId)\n .replace(/^@[^/]+\\//, \"\") // strip scope\n .replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const installPath = path.join(targetDir, safeName);\n await fs.mkdir(installPath, { recursive: true });\n\n // Download and extract tarball\n const archiveRes = await fetch(tarball, {\n signal: AbortSignal.timeout(60000),\n });\n\n if (!archiveRes.ok) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Failed to download package tarball`,\n error: `HTTP ${archiveRes.status}`,\n };\n }\n\n const buffer = Buffer.from(await archiveRes.arrayBuffer());\n const archivePath = path.join(targetDir, `__${safeName}.tgz`);\n await fs.writeFile(archivePath, buffer);\n\n const { execSync } = await import(\"child_process\");\n\n // npm tarballs have a \"package/\" prefix directory\n execSync(\n `tar -xzf \"${archivePath}\" -C \"${installPath}\" --strip-components=1`,\n {\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 30000,\n },\n );\n\n await fs.unlink(archivePath).catch(() => { });\n\n // Install dependencies if package.json exists\n try {\n await fs.access(path.join(installPath, \"package.json\"));\n try {\n execSync(\"pnpm install --prod\", {\n cwd: installPath,\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 120000,\n });\n } catch {\n // Try npm if pnpm is not available\n try {\n execSync(\"npm install --production\", {\n cwd: installPath,\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 120000,\n });\n } catch {\n console.warn(`[npm] Failed to install dependencies for ${skillId}`);\n }\n }\n } catch {\n // No package.json — skip dependency install\n }\n\n // Verify or generate SKILL.md\n try {\n await fs.access(path.join(installPath, \"SKILL.md\"));\n } catch {\n await generateSkillMdFromPkg(installPath, data);\n }\n\n return {\n ok: true,\n skillId,\n installPath,\n message: `Skill '${safeName}' imported from npm (${skillId}@${latest || \"latest\"}) to ${installPath}`,\n };\n } catch (err: any) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Failed to import skill from npm`,\n error: err?.message || String(err),\n };\n }\n }\n}\n\n/** Generate a SKILL.md from npm package.json metadata */\nasync function generateSkillMdFromPkg(\n installPath: string,\n pkgData: any,\n): Promise<void> {\n const name = (pkgData.name || \"unknown\")\n .replace(/^@[^/]+\\//, \"\")\n .replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const content = `---\nname: ${name}\nversion: ${pkgData[\"dist-tags\"]?.latest || \"0.0.0\"}\ndescription: ${pkgData.description || `Imported from npm (${pkgData.name})`}\nsource: npm\nsourcePackage: ${pkgData.name || \"unknown\"}\n---\n\n# ${name}\n\n${pkgData.description || \"\"}\n\nImported from [npm](https://www.npmjs.com/package/${pkgData.name}).\n\n> This SKILL.md was auto-generated during import. Edit it to customize the skill description and instructions.\n`;\n await fs.writeFile(path.join(installPath, \"SKILL.md\"), content, \"utf8\");\n}\n","/**\n * Hugging Face Spaces Skill Provider\n *\n * Discovers and imports OpenViber-compatible skills published on\n * Hugging Face Spaces. Searches for spaces tagged with \"openviber-skill\".\n *\n * Uses the Hugging Face Hub API:\n * https://huggingface.co/docs/hub/api\n *\n * Override endpoint with HUGGINGFACE_API_URL env var.\n * Provide a token via HUGGINGFACE_TOKEN for higher rate limits.\n */\n\nimport type {\n SkillHubProvider,\n SkillSearchQuery,\n SkillSearchResult,\n ExternalSkillInfo,\n SkillImportResult,\n SkillHubProviderConfig,\n} from \"../types\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nconst DEFAULT_HF_API = \"https://huggingface.co/api\";\n\nexport class HuggingFaceProvider implements SkillHubProvider {\n readonly type = \"huggingface\" as const;\n readonly displayName = \"Hugging Face\";\n private config: SkillHubProviderConfig;\n\n constructor(config?: SkillHubProviderConfig) {\n this.config = config ?? {};\n }\n\n setConfig(config?: SkillHubProviderConfig): void {\n this.config = config ?? {};\n }\n\n private getApiBase(): string {\n return (\n this.config.url ||\n process.env.HUGGINGFACE_API_URL ||\n DEFAULT_HF_API\n ).replace(/\\/$/, \"\");\n }\n\n private getHfHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": \"OpenViber-SkillHub/1.0\",\n };\n const token =\n this.config.apiKey ||\n process.env.HUGGINGFACE_TOKEN ||\n process.env.HF_TOKEN;\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n return headers;\n }\n\n async search(query: SkillSearchQuery): Promise<SkillSearchResult> {\n const apiBase = this.getApiBase();\n const limit = Math.min(query.limit ?? 20, 100);\n const page = query.page ?? 1;\n const offset = (page - 1) * limit;\n\n // Search for models/repos tagged with openviber-skill\n const params = new URLSearchParams({\n limit: String(limit),\n offset: String(offset),\n // Filter by the openviber-skill tag\n filter: \"openviber-skill\",\n });\n\n if (query.query) {\n params.set(\"search\", query.query);\n }\n\n if (query.sort === \"popularity\") {\n params.set(\"sort\", \"likes\");\n params.set(\"direction\", \"-1\");\n } else if (query.sort === \"recent\") {\n params.set(\"sort\", \"lastModified\");\n params.set(\"direction\", \"-1\");\n }\n\n if (query.author) {\n params.set(\"author\", query.author);\n }\n\n try {\n const res = await fetch(`${apiBase}/models?${params.toString()}`, {\n headers: this.getHfHeaders(),\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) {\n console.warn(`[HuggingFace] Search failed: HTTP ${res.status}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n\n const data = (await res.json()) as any[];\n\n const skills: ExternalSkillInfo[] = (data ?? []).map(\n (model: any): ExternalSkillInfo => ({\n id: model.modelId || model.id || \"unknown\",\n name: (model.modelId || model.id || \"\").split(\"/\").pop() || \"unknown\",\n description: model.description || model.cardData?.description || \"\",\n author: model.author || (model.modelId || \"\").split(\"/\")[0] || \"unknown\",\n version: model.sha?.slice(0, 8) || \"latest\",\n source: \"huggingface\",\n url: `https://huggingface.co/${model.modelId || model.id}`,\n tags: model.tags || [],\n popularity: model.likes ?? model.downloads ?? 0,\n updatedAt: model.lastModified || undefined,\n license: model.cardData?.license || undefined,\n }),\n );\n\n // HF API doesn't return total count in list endpoint easily\n const total = skills.length >= limit ? limit * 10 : skills.length; // estimate\n const totalPages = Math.ceil(total / limit);\n\n return { skills, total, page, totalPages };\n } catch (err: any) {\n console.warn(`[HuggingFace] Search error: ${err?.message || String(err)}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n }\n\n async getSkillInfo(skillId: string): Promise<ExternalSkillInfo | null> {\n try {\n const apiBase = this.getApiBase();\n const res = await fetch(`${apiBase}/models/${encodeURIComponent(skillId)}`, {\n headers: this.getHfHeaders(),\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) return null;\n\n const model = (await res.json()) as any;\n\n // Try to fetch README\n let readme: string | undefined;\n try {\n const readmeRes = await fetch(\n `https://huggingface.co/${skillId}/raw/main/README.md`,\n { signal: AbortSignal.timeout(10000) },\n );\n if (readmeRes.ok) {\n readme = await readmeRes.text();\n }\n } catch {\n // ignore\n }\n\n return {\n id: model.modelId || model.id || skillId,\n name: (model.modelId || skillId).split(\"/\").pop() || skillId,\n description: model.description || model.cardData?.description || \"\",\n author: model.author || skillId.split(\"/\")[0] || \"unknown\",\n version: model.sha?.slice(0, 8) || \"latest\",\n source: \"huggingface\",\n url: `https://huggingface.co/${model.modelId || skillId}`,\n tags: model.tags || [],\n popularity: model.likes ?? model.downloads ?? 0,\n updatedAt: model.lastModified || undefined,\n readme,\n license: model.cardData?.license || undefined,\n };\n } catch {\n return null;\n }\n }\n\n async importSkill(skillId: string, targetDir: string): Promise<SkillImportResult> {\n const safeName = skillId.replace(/\\//g, \"-\").replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const installPath = path.join(targetDir, safeName);\n\n try {\n const { execSync } = await import(\"child_process\");\n\n // Try git clone via HF Hub (preferred)\n const cloneUrl = `https://huggingface.co/${skillId}`;\n\n // Check if already exists\n try {\n await fs.access(path.join(installPath, \"SKILL.md\"));\n try {\n execSync(\"git pull --ff-only\", {\n cwd: installPath,\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 60000,\n });\n return {\n ok: true,\n skillId,\n installPath,\n message: `Skill '${safeName}' updated from Hugging Face`,\n };\n } catch {\n // Continue to re-clone\n }\n } catch {\n // Doesn't exist yet\n }\n\n await fs.rm(installPath, { recursive: true, force: true });\n await fs.mkdir(targetDir, { recursive: true });\n\n execSync(`git clone --depth 1 \"${cloneUrl}\" \"${installPath}\"`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 120000,\n });\n\n // Generate SKILL.md if missing\n try {\n await fs.access(path.join(installPath, \"SKILL.md\"));\n } catch {\n const content = `---\nname: ${safeName}\nversion: 0.0.0\ndescription: Imported from Hugging Face (${skillId})\nsource: huggingface\nsourceUrl: https://huggingface.co/${skillId}\n---\n\n# ${safeName}\n\nImported from [Hugging Face](https://huggingface.co/${skillId}).\n\n> This SKILL.md was auto-generated during import.\n`;\n await fs.writeFile(path.join(installPath, \"SKILL.md\"), content, \"utf8\");\n }\n\n return {\n ok: true,\n skillId,\n installPath,\n message: `Skill '${safeName}' imported from Hugging Face to ${installPath}`,\n };\n } catch (err: any) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Failed to import skill from Hugging Face`,\n error: err?.message || String(err),\n };\n }\n }\n}\n","/**\n * Smithery MCP Server Registry Provider\n *\n * Discovers MCP (Model Context Protocol) servers from the Smithery registry.\n * Smithery is a popular directory of MCP servers/tools.\n *\n * Registry API: https://registry.smithery.ai/\n * Override with SMITHERY_REGISTRY_URL env var.\n */\n\nimport type {\n SkillHubProvider,\n SkillSearchQuery,\n SkillSearchResult,\n ExternalSkillInfo,\n SkillImportResult,\n SkillHubProviderConfig,\n} from \"../types\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nconst DEFAULT_REGISTRY_URL = \"https://registry.smithery.ai\";\n\nexport class SmitheryProvider implements SkillHubProvider {\n readonly type = \"smithery\" as const;\n readonly displayName = \"Smithery (MCP)\";\n private config: SkillHubProviderConfig;\n\n constructor(config?: SkillHubProviderConfig) {\n this.config = config ?? {};\n }\n\n setConfig(config?: SkillHubProviderConfig): void {\n this.config = config ?? {};\n }\n\n private getRegistryUrl(): string {\n return (\n this.config.url ||\n process.env.SMITHERY_REGISTRY_URL ||\n DEFAULT_REGISTRY_URL\n ).replace(/\\/$/, \"\");\n }\n\n async search(query: SkillSearchQuery): Promise<SkillSearchResult> {\n const registryUrl = this.getRegistryUrl();\n const page = query.page ?? 1;\n const limit = Math.min(query.limit ?? 20, 100);\n\n const params = new URLSearchParams({\n pageSize: String(limit),\n page: String(page),\n });\n\n if (query.query) {\n params.set(\"q\", query.query);\n }\n\n try {\n const res = await fetch(`${registryUrl}/servers?${params.toString()}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) {\n console.warn(`[Smithery] Search failed: HTTP ${res.status}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n\n const data = (await res.json()) as any;\n const servers = data.servers ?? data.results ?? data.items ?? [];\n const total = data.totalCount ?? data.total ?? servers.length;\n const totalPages = data.totalPages ?? Math.ceil(total / limit);\n\n const skills: ExternalSkillInfo[] = servers.map(\n (server: any): ExternalSkillInfo => ({\n id: server.qualifiedName || server.name || server.id || \"unknown\",\n name: server.displayName || server.name || \"Untitled\",\n description: server.description || \"\",\n author: server.vendor || server.author || server.publisher || \"unknown\",\n version: server.version || \"latest\",\n source: \"smithery\",\n url: server.homepage || server.url || `${registryUrl}/server/${server.qualifiedName || server.name}`,\n tags: server.tags || server.categories || [],\n popularity: server.useCount ?? server.downloads ?? server.stars ?? 0,\n updatedAt: server.updatedAt || server.createdAt || undefined,\n license: server.license || undefined,\n }),\n );\n\n return { skills, total, page, totalPages };\n } catch (err: any) {\n console.warn(`[Smithery] Search error: ${err?.message || String(err)}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n }\n\n async getSkillInfo(skillId: string): Promise<ExternalSkillInfo | null> {\n const registryUrl = this.getRegistryUrl();\n\n try {\n const res = await fetch(`${registryUrl}/servers/${encodeURIComponent(skillId)}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) return null;\n\n const server = (await res.json()) as any;\n\n return {\n id: server.qualifiedName || server.name || skillId,\n name: server.displayName || server.name || skillId,\n description: server.description || \"\",\n author: server.vendor || server.author || \"unknown\",\n version: server.version || \"latest\",\n source: \"smithery\",\n url: server.homepage || `${registryUrl}/server/${server.qualifiedName || server.name}`,\n tags: server.tags || [],\n popularity: server.useCount ?? 0,\n updatedAt: server.updatedAt || undefined,\n readme: server.readme || server.longDescription || undefined,\n license: server.license || undefined,\n dependencies: server.tools?.map((t: any) => t.name) || undefined,\n };\n } catch {\n return null;\n }\n }\n\n async importSkill(skillId: string, targetDir: string): Promise<SkillImportResult> {\n const registryUrl = this.getRegistryUrl();\n const safeName = skillId.replace(/[^a-zA-Z0-9_-]/g, \"-\").replace(/-+/g, \"-\");\n const installPath = path.join(targetDir, safeName);\n\n try {\n // Fetch server details to get repository or npm package info\n const res = await fetch(`${registryUrl}/servers/${encodeURIComponent(skillId)}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `MCP server not found on Smithery: ${skillId}`,\n error: `HTTP ${res.status}`,\n };\n }\n\n const server = (await res.json()) as any;\n\n // Smithery servers typically have a repository URL or npm package\n const repoUrl: string | undefined = server.repository || server.repoUrl || server.homepage;\n const npmPkg: string | undefined = server.npmPackage || server.package;\n\n await fs.mkdir(installPath, { recursive: true });\n\n // Generate an MCP-aware SKILL.md with connection instructions\n const toolsList = (server.tools || [])\n .map((t: any) => `- **${t.name}** — ${t.description || \"\"}`)\n .join(\"\\n\");\n\n const skillMd = `---\nname: ${safeName}\nversion: ${server.version || \"0.0.0\"}\ndescription: \"${(server.description || \"\").replace(/\"/g, '\\\\\"')}\"\nsource: smithery\nmcpServer: true\nqualifiedName: ${server.qualifiedName || skillId}\n${npmPkg ? `npmPackage: ${npmPkg}` : \"\"}\n${repoUrl ? `repository: ${repoUrl}` : \"\"}\n---\n\n# ${server.displayName || safeName}\n\n${server.description || \"\"}\n\n**Source:** [Smithery Registry](${registryUrl}/server/${server.qualifiedName || skillId})\n\n## MCP Server\n\nThis is an MCP (Model Context Protocol) server. It provides tools via the MCP protocol.\n\n${toolsList ? `## Available Tools\\n\\n${toolsList}` : \"\"}\n\n${npmPkg ? `## Installation\\n\\n\\`\\`\\`bash\\nnpx ${npmPkg}\\n\\`\\`\\`\\n` : \"\"}\n${repoUrl ? `## Repository\\n\\n${repoUrl}\\n` : \"\"}\n`;\n\n await fs.writeFile(path.join(installPath, \"SKILL.md\"), skillMd, \"utf8\");\n\n // If there's an npm package, install it\n if (npmPkg) {\n try {\n const { execSync } = await import(\"child_process\");\n // Create a minimal package.json\n const pkgJson = {\n name: safeName,\n version: \"0.0.0\",\n private: true,\n dependencies: { [npmPkg]: \"latest\" },\n };\n await fs.writeFile(\n path.join(installPath, \"package.json\"),\n JSON.stringify(pkgJson, null, 2),\n \"utf8\",\n );\n try {\n execSync(\"pnpm install\", {\n cwd: installPath,\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 120000,\n });\n } catch {\n execSync(\"npm install\", {\n cwd: installPath,\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 120000,\n });\n }\n } catch (installErr: any) {\n console.warn(`[Smithery] npm install warning: ${installErr?.message}`);\n }\n }\n\n // If there's a repo, clone it into a subdirectory\n if (repoUrl && !npmPkg) {\n try {\n const { execSync } = await import(\"child_process\");\n const srcDir = path.join(installPath, \"src\");\n execSync(`git clone --depth 1 \"${repoUrl}\" \"${srcDir}\"`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 120000,\n });\n } catch (cloneErr: any) {\n console.warn(`[Smithery] git clone warning: ${cloneErr?.message}`);\n }\n }\n\n return {\n ok: true,\n skillId,\n installPath,\n message: `MCP server '${server.displayName || safeName}' imported from Smithery to ${installPath}`,\n };\n } catch (err: any) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Failed to import MCP server from Smithery`,\n error: err?.message || String(err),\n };\n }\n }\n}\n","/**\n * Composio Tool Provider\n *\n * Discovers tools and integrations from the Composio platform.\n * Composio provides 250+ tools covering SaaS integrations (GitHub, Slack,\n * Google, etc.) that can be exposed as agent tools.\n *\n * API: https://backend.composio.dev/api/v2\n * Override with COMPOSIO_API_URL env var.\n * Auth: COMPOSIO_API_KEY env var (optional for search, required for install).\n */\n\nimport type {\n SkillHubProvider,\n SkillSearchQuery,\n SkillSearchResult,\n ExternalSkillInfo,\n SkillImportResult,\n SkillHubProviderConfig,\n} from \"../types\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nconst DEFAULT_API_URL = \"https://backend.composio.dev/api/v2\";\n\nexport class ComposioProvider implements SkillHubProvider {\n readonly type = \"composio\" as const;\n readonly displayName = \"Composio\";\n private config: SkillHubProviderConfig;\n\n constructor(config?: SkillHubProviderConfig) {\n this.config = config ?? {};\n }\n\n setConfig(config?: SkillHubProviderConfig): void {\n this.config = config ?? {};\n }\n\n private getApiUrl(): string {\n return (\n this.config.url ||\n process.env.COMPOSIO_API_URL ||\n DEFAULT_API_URL\n ).replace(/\\/$/, \"\");\n }\n\n private getApiHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"User-Agent\": \"OpenViber-SkillHub/1.0\",\n };\n const key = this.config.apiKey || process.env.COMPOSIO_API_KEY;\n if (key) {\n headers[\"x-api-key\"] = key;\n }\n return headers;\n }\n\n async search(query: SkillSearchQuery): Promise<SkillSearchResult> {\n const apiUrl = this.getApiUrl();\n const page = query.page ?? 1;\n const limit = Math.min(query.limit ?? 20, 100);\n\n try {\n // Composio has an apps endpoint that lists available integrations\n const params = new URLSearchParams();\n\n if (query.query) {\n params.set(\"search\", query.query);\n }\n\n const res = await fetch(`${apiUrl}/apps?${params.toString()}`, {\n headers: this.getApiHeaders(),\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) {\n console.warn(`[Composio] Search failed: HTTP ${res.status}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n\n const data = (await res.json()) as any;\n const apps = data.items ?? data.apps ?? data ?? [];\n\n // Filter and paginate client-side since the API may not support pagination\n let filtered = Array.isArray(apps) ? apps : [];\n\n if (query.tags?.length) {\n const tagSet = new Set(query.tags.map((t) => t.toLowerCase()));\n filtered = filtered.filter((app: any) =>\n (app.categories || app.tags || []).some((c: string) =>\n tagSet.has(c.toLowerCase()),\n ),\n );\n }\n\n const total = filtered.length;\n const start = (page - 1) * limit;\n const paged = filtered.slice(start, start + limit);\n const totalPages = Math.ceil(total / limit);\n\n const skills: ExternalSkillInfo[] = paged.map(\n (app: any): ExternalSkillInfo => ({\n id: app.key || app.appId || app.name || \"unknown\",\n name: app.name || app.displayName || app.key || \"Untitled\",\n description: app.description || \"\",\n author: \"Composio\",\n version: app.version || \"latest\",\n source: \"composio\",\n url: app.docsUrl || app.url || `https://composio.dev/tools/${app.key || app.name}`,\n tags: app.categories || app.tags || [],\n popularity: app.activeConnections ?? 0,\n updatedAt: app.updatedAt || undefined,\n license: \"proprietary\",\n }),\n );\n\n return { skills, total, page, totalPages };\n } catch (err: any) {\n console.warn(`[Composio] Search error: ${err?.message || String(err)}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n }\n\n async getSkillInfo(skillId: string): Promise<ExternalSkillInfo | null> {\n const apiUrl = this.getApiUrl();\n\n try {\n const res = await fetch(`${apiUrl}/apps/${encodeURIComponent(skillId)}`, {\n headers: this.getApiHeaders(),\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) return null;\n\n const app = (await res.json()) as any;\n\n // Also try to fetch available actions/tools for this app\n let tools: string[] = [];\n try {\n const actionsRes = await fetch(\n `${apiUrl}/actions?appNames=${encodeURIComponent(skillId)}&limit=50`,\n {\n headers: this.getApiHeaders(),\n signal: AbortSignal.timeout(10000),\n },\n );\n if (actionsRes.ok) {\n const actionsData = (await actionsRes.json()) as any;\n const actions = actionsData.items ?? actionsData ?? [];\n tools = (Array.isArray(actions) ? actions : []).map(\n (a: any) => a.displayName || a.name || a.actionName || \"unknown\",\n );\n }\n } catch {\n // ignore\n }\n\n return {\n id: app.key || app.appId || skillId,\n name: app.name || app.displayName || skillId,\n description: app.description || \"\",\n author: \"Composio\",\n version: app.version || \"latest\",\n source: \"composio\",\n url: app.docsUrl || `https://composio.dev/tools/${app.key || skillId}`,\n tags: app.categories || app.tags || [],\n popularity: app.activeConnections ?? 0,\n updatedAt: app.updatedAt || undefined,\n readme: app.longDescription || undefined,\n license: \"proprietary\",\n dependencies: tools.length > 0 ? tools : undefined,\n };\n } catch {\n return null;\n }\n }\n\n async importSkill(skillId: string, targetDir: string): Promise<SkillImportResult> {\n const apiUrl = this.getApiUrl();\n const safeName = `composio-${skillId}`.replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const installPath = path.join(targetDir, safeName);\n\n try {\n // Fetch app info\n const res = await fetch(`${apiUrl}/apps/${encodeURIComponent(skillId)}`, {\n headers: this.getApiHeaders(),\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `App not found on Composio: ${skillId}`,\n error: `HTTP ${res.status}`,\n };\n }\n\n const app = (await res.json()) as any;\n\n // Fetch actions\n let actions: any[] = [];\n try {\n const actionsRes = await fetch(\n `${apiUrl}/actions?appNames=${encodeURIComponent(skillId)}&limit=100`,\n {\n headers: this.getApiHeaders(),\n signal: AbortSignal.timeout(10000),\n },\n );\n if (actionsRes.ok) {\n const actionsData = (await actionsRes.json()) as any;\n actions = actionsData.items ?? actionsData ?? [];\n if (!Array.isArray(actions)) actions = [];\n }\n } catch {\n // ignore\n }\n\n await fs.mkdir(installPath, { recursive: true });\n\n // Generate SKILL.md with Composio integration details\n const toolsList = actions\n .map((a: any) => `- **${a.displayName || a.name}** — ${a.description || \"\"}`)\n .join(\"\\n\");\n\n const skillMd = `---\nname: ${safeName}\nversion: ${app.version || \"0.0.0\"}\ndescription: \"${(app.description || \"\").replace(/\"/g, '\\\\\"')}\"\nsource: composio\ncomposioApp: ${skillId}\n---\n\n# ${app.name || app.displayName || safeName}\n\n${app.description || \"\"}\n\n**Source:** [Composio](https://composio.dev/tools/${app.key || skillId})\n\n## Integration\n\nThis is a Composio integration. It provides tools for interacting with ${app.name || skillId}.\n\nTo use this integration, you need a Composio API key.\nSet the \\`COMPOSIO_API_KEY\\` environment variable.\n\n${toolsList ? `## Available Actions (${actions.length})\\n\\n${toolsList}` : \"\"}\n\n## Setup\n\n1. Create a Composio account at [composio.dev](https://composio.dev)\n2. Get your API key from the dashboard\n3. Set \\`COMPOSIO_API_KEY\\` in your environment\n4. Connect the ${app.name || skillId} app through Composio's auth flow\n`;\n\n await fs.writeFile(path.join(installPath, \"SKILL.md\"), skillMd, \"utf8\");\n\n return {\n ok: true,\n skillId,\n installPath,\n message: `Composio app '${app.name || safeName}' imported to ${installPath}`,\n };\n } catch (err: any) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Failed to import app from Composio`,\n error: err?.message || String(err),\n };\n }\n }\n}\n","/**\n * Glama MCP Server Directory Provider\n *\n * Discovers MCP servers from the Glama directory — a curated list\n * of MCP (Model Context Protocol) servers for AI agents.\n *\n * Registry: https://glama.ai/mcp/servers\n * API: https://glama.ai/api/mcp\n * Override with GLAMA_API_URL env var.\n */\n\nimport type {\n SkillHubProvider,\n SkillSearchQuery,\n SkillSearchResult,\n ExternalSkillInfo,\n SkillImportResult,\n SkillHubProviderConfig,\n} from \"../types\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\n\nconst DEFAULT_API_URL = \"https://glama.ai/api/mcp/v1\";\n\nexport class GlamaProvider implements SkillHubProvider {\n readonly type = \"glama\" as const;\n readonly displayName = \"Glama (MCP)\";\n private config: SkillHubProviderConfig;\n\n constructor(config?: SkillHubProviderConfig) {\n this.config = config ?? {};\n }\n\n setConfig(config?: SkillHubProviderConfig): void {\n this.config = config ?? {};\n }\n\n private getApiUrl(): string {\n return (\n this.config.url ||\n process.env.GLAMA_API_URL ||\n DEFAULT_API_URL\n ).replace(/\\/$/, \"\");\n }\n\n async search(query: SkillSearchQuery): Promise<SkillSearchResult> {\n const apiUrl = this.getApiUrl();\n const page = query.page ?? 1;\n const limit = Math.min(query.limit ?? 20, 100);\n\n const params = new URLSearchParams({\n limit: String(limit),\n page: String(page),\n });\n\n if (query.query) {\n params.set(\"q\", query.query);\n }\n\n if (query.sort === \"popularity\") {\n params.set(\"sort\", \"stars\");\n } else if (query.sort === \"recent\") {\n params.set(\"sort\", \"updated\");\n }\n\n try {\n const res = await fetch(`${apiUrl}/servers?${params.toString()}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) {\n console.warn(`[Glama] Search failed: HTTP ${res.status}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n\n const data = (await res.json()) as any;\n const servers = data.servers ?? data.results ?? data.data ?? data.items ?? [];\n const total = data.total ?? data.totalCount ?? servers.length;\n const totalPages = data.totalPages ?? Math.ceil(total / limit);\n\n const skills: ExternalSkillInfo[] = (Array.isArray(servers) ? servers : []).map(\n (server: any): ExternalSkillInfo => ({\n id: server.id || server.slug || server.name || \"unknown\",\n name: server.name || server.title || \"Untitled\",\n description: server.description || server.summary || \"\",\n author:\n server.author ||\n server.namespace ||\n server.vendor ||\n server.owner ||\n \"unknown\",\n version: server.version || \"latest\",\n source: \"glama\",\n url:\n server.homepage ||\n server.url ||\n server.repository?.url ||\n server.repository ||\n `https://glama.ai/mcp/servers/${server.id || server.slug}`,\n tags: server.tags || server.categories || [],\n popularity: server.stars ?? server.downloads ?? 0,\n updatedAt: server.updatedAt || server.lastModified || server.createdAt || undefined,\n license: server.license || server.spdxLicense || undefined,\n }),\n );\n\n return { skills, total, page, totalPages };\n } catch (err: any) {\n console.warn(`[Glama] Search error: ${err?.message || String(err)}`);\n return { skills: [], total: 0, page, totalPages: 0 };\n }\n }\n\n async getSkillInfo(skillId: string): Promise<ExternalSkillInfo | null> {\n const apiUrl = this.getApiUrl();\n\n try {\n const res = await fetch(`${apiUrl}/servers/${encodeURIComponent(skillId)}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) return null;\n\n const server = (await res.json()) as any;\n\n return {\n id: server.id || server.slug || skillId,\n name: server.name || server.title || skillId,\n description: server.description || \"\",\n author: server.author || server.namespace || server.vendor || \"unknown\",\n version: server.version || \"latest\",\n source: \"glama\",\n url:\n server.homepage ||\n server.repository?.url ||\n server.repository ||\n `https://glama.ai/mcp/servers/${server.id || server.slug}`,\n tags: server.tags || [],\n popularity: server.stars ?? 0,\n updatedAt: server.updatedAt || undefined,\n readme: server.readme || server.longDescription || undefined,\n license: server.license || server.spdxLicense || undefined,\n dependencies: server.tools?.map((t: any) => t.name || t) || undefined,\n };\n } catch {\n return null;\n }\n }\n\n async importSkill(skillId: string, targetDir: string): Promise<SkillImportResult> {\n const apiUrl = this.getApiUrl();\n const safeName = `glama-${skillId}`.replace(/[^a-zA-Z0-9_-]/g, \"-\");\n const installPath = path.join(targetDir, safeName);\n\n try {\n // Fetch server details\n const res = await fetch(`${apiUrl}/servers/${encodeURIComponent(skillId)}`, {\n headers: { Accept: \"application/json\" },\n signal: AbortSignal.timeout(15000),\n });\n\n if (!res.ok) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `MCP server not found on Glama: ${skillId}`,\n error: `HTTP ${res.status}`,\n };\n }\n\n const server = (await res.json()) as any;\n const repoUrl: string | undefined =\n server.repository?.url || server.repository || server.homepage;\n const npmPkg: string | undefined = server.npmPackage || server.package;\n\n await fs.mkdir(installPath, { recursive: true });\n\n // Generate SKILL.md\n const toolsList = (server.tools || [])\n .map((t: any) => {\n const name = typeof t === \"string\" ? t : t.name || \"unknown\";\n const desc = typeof t === \"string\" ? \"\" : t.description || \"\";\n return `- **${name}**${desc ? ` — ${desc}` : \"\"}`;\n })\n .join(\"\\n\");\n\n const skillMd = `---\nname: ${safeName}\nversion: ${server.version || \"0.0.0\"}\ndescription: \"${(server.description || \"\").replace(/\"/g, '\\\\\"')}\"\nsource: glama\nmcpServer: true\n${npmPkg ? `npmPackage: ${npmPkg}` : \"\"}\n${repoUrl ? `repository: ${repoUrl}` : \"\"}\n---\n\n# ${server.name || server.title || safeName}\n\n${server.description || \"\"}\n\n**Source:** [Glama MCP Directory](https://glama.ai/mcp/servers/${server.id || server.slug || skillId})\n\n## MCP Server\n\nThis is an MCP (Model Context Protocol) server discovered from the Glama directory.\n\n${toolsList ? `## Available Tools\\n\\n${toolsList}` : \"\"}\n\n${npmPkg ? `## Installation\\n\\n\\`\\`\\`bash\\nnpx ${npmPkg}\\n\\`\\`\\`\\n` : \"\"}\n${repoUrl ? `## Repository\\n\\n${repoUrl}\\n` : \"\"}\n`;\n\n await fs.writeFile(path.join(installPath, \"SKILL.md\"), skillMd, \"utf8\");\n\n // If there's a repo URL, clone it\n if (repoUrl) {\n try {\n const { execSync } = await import(\"child_process\");\n const srcDir = path.join(installPath, \"src\");\n execSync(`git clone --depth 1 \"${repoUrl}\" \"${srcDir}\"`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 120000,\n });\n } catch {\n // Cloning is optional\n }\n }\n\n return {\n ok: true,\n skillId,\n installPath,\n message: `MCP server '${server.name || safeName}' imported from Glama to ${installPath}`,\n };\n } catch (err: any) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Failed to import MCP server from Glama`,\n error: err?.message || String(err),\n };\n }\n }\n}\n","export { OpenClawProvider } from \"./openclaw\";\nexport { GitHubProvider } from \"./github\";\nexport { NpmProvider } from \"./npm\";\nexport { HuggingFaceProvider } from \"./huggingface\";\nexport { SmitheryProvider } from \"./smithery\";\nexport { ComposioProvider } from \"./composio\";\nexport { GlamaProvider } from \"./glama\";\n","/**\n * Skill Hub Manager\n *\n * Central orchestrator for exploring and importing skills from external sources.\n * Aggregates results from multiple providers (OpenClaw, GitHub, npm) and\n * manages the local skill install lifecycle.\n */\n\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport { getViberRoot } from \"../../utils/paths\";\nimport type {\n SkillHubProvider,\n SkillHubProviderType,\n SkillSearchQuery,\n SkillSearchResult,\n ExternalSkillInfo,\n SkillImportResult,\n SkillHubProviderConfig,\n} from \"./types\";\nimport {\n OpenClawProvider,\n GitHubProvider,\n NpmProvider,\n HuggingFaceProvider,\n SmitheryProvider,\n ComposioProvider,\n GlamaProvider,\n} from \"./providers\";\n\n/** Per-provider settings that can be toggled in the settings page */\nexport interface SkillSourceSettings {\n /** Whether this source is enabled */\n enabled: boolean;\n /** Custom API/registry URL override (empty = use default) */\n url?: string;\n /** API key / token (for providers that need one) */\n apiKey?: string;\n}\n\n/** Full settings map for all skill sources */\nexport type SkillSourcesConfig = Partial<\n Record<SkillHubProviderType, SkillSourceSettings>\n>;\n\n/** Default source settings — all enabled, no custom URLs */\nexport function getDefaultSourcesConfig(): SkillSourcesConfig {\n return {\n openclaw: { enabled: true },\n github: { enabled: false },\n npm: { enabled: true },\n huggingface: { enabled: true },\n smithery: { enabled: true },\n composio: { enabled: false },\n glama: { enabled: true },\n };\n}\n\nexport class SkillHubManager {\n private providers = new Map<SkillHubProviderType, SkillHubProvider>();\n private sourcesConfig: SkillSourcesConfig;\n\n constructor(sourcesConfig?: SkillSourcesConfig) {\n this.sourcesConfig = sourcesConfig || getDefaultSourcesConfig();\n\n // Register all providers\n this.registerProvider(\n new OpenClawProvider(this.getProviderConfig(\"openclaw\")),\n );\n this.registerProvider(\n new GitHubProvider(this.getProviderConfig(\"github\")),\n );\n this.registerProvider(new NpmProvider(this.getProviderConfig(\"npm\")));\n this.registerProvider(\n new HuggingFaceProvider(this.getProviderConfig(\"huggingface\")),\n );\n this.registerProvider(\n new SmitheryProvider(this.getProviderConfig(\"smithery\")),\n );\n this.registerProvider(\n new ComposioProvider(this.getProviderConfig(\"composio\")),\n );\n this.registerProvider(new GlamaProvider(this.getProviderConfig(\"glama\")));\n }\n\n /** Update source settings at runtime */\n updateSourcesConfig(config: SkillSourcesConfig): void {\n this.sourcesConfig = config;\n for (const provider of this.providers.values()) {\n provider.setConfig?.(this.getProviderConfig(provider.type));\n }\n }\n\n /** Get current sources config */\n getSourcesConfig(): SkillSourcesConfig {\n return { ...this.sourcesConfig };\n }\n\n /** Check if a source is enabled */\n isSourceEnabled(type: SkillHubProviderType): boolean {\n const cfg = this.sourcesConfig[type];\n if (cfg) {\n return cfg.enabled !== false;\n }\n // Fall back to current defaults when a provider is omitted.\n return getDefaultSourcesConfig()[type]?.enabled !== false;\n }\n\n /** Get all enabled provider types */\n getEnabledProviderTypes(): SkillHubProviderType[] {\n return Array.from(this.providers.keys()).filter((t) =>\n this.isSourceEnabled(t),\n );\n }\n\n /** Register a custom provider */\n registerProvider(provider: SkillHubProvider): void {\n provider.setConfig?.(this.getProviderConfig(provider.type));\n this.providers.set(provider.type, provider);\n }\n\n /** Get a provider by type */\n getProvider(type: SkillHubProviderType): SkillHubProvider | undefined {\n return this.providers.get(type);\n }\n\n /** List available provider types */\n getProviderTypes(): SkillHubProviderType[] {\n return Array.from(this.providers.keys());\n }\n\n private getProviderConfig(\n type: SkillHubProviderType,\n ): SkillHubProviderConfig | undefined {\n const config = this.sourcesConfig[type];\n if (!config) return undefined;\n const { url, apiKey } = config;\n if (!url && !apiKey) return undefined;\n return { url, apiKey };\n }\n\n /**\n * Search for skills across one or all providers.\n * If `source` is specified, only that provider is queried.\n * Otherwise, all providers are queried in parallel and results are merged.\n */\n async search(\n query: SkillSearchQuery,\n source?: SkillHubProviderType,\n ): Promise<SkillSearchResult> {\n if (source) {\n const provider = this.providers.get(source);\n if (!provider) {\n return { skills: [], total: 0, page: 1, totalPages: 0 };\n }\n return provider.search(query);\n }\n\n // Query all enabled providers in parallel\n const providerArray = Array.from(this.providers.values()).filter((p) =>\n this.isSourceEnabled(p.type),\n );\n const results = await Promise.allSettled(\n providerArray.map((p) => p.search(query)),\n );\n\n // Merge results\n const allSkills: ExternalSkillInfo[] = [];\n let totalAcross = 0;\n\n for (const result of results) {\n if (result.status === \"fulfilled\") {\n allSkills.push(...result.value.skills);\n totalAcross += result.value.total;\n }\n }\n\n // Sort merged results\n if (query.sort === \"popularity\") {\n allSkills.sort((a, b) => (b.popularity ?? 0) - (a.popularity ?? 0));\n } else if (query.sort === \"recent\") {\n allSkills.sort((a, b) => {\n const dateA = a.updatedAt ? new Date(a.updatedAt).getTime() : 0;\n const dateB = b.updatedAt ? new Date(b.updatedAt).getTime() : 0;\n return dateB - dateA;\n });\n } else if (query.sort === \"name\") {\n allSkills.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n // Apply pagination to merged results\n const limit = query.limit ?? 20;\n const page = query.page ?? 1;\n const start = (page - 1) * limit;\n const paged = allSkills.slice(start, start + limit);\n\n return {\n skills: paged,\n total: totalAcross,\n page,\n totalPages: Math.ceil(totalAcross / limit),\n };\n }\n\n /**\n * Get detailed info about a skill from a specific provider.\n */\n async getSkillInfo(\n skillId: string,\n source: SkillHubProviderType,\n ): Promise<ExternalSkillInfo | null> {\n const provider = this.providers.get(source);\n if (!provider) return null;\n return provider.getSkillInfo(skillId);\n }\n\n /**\n * Import a skill from an external source into the local skills directory.\n *\n * Auto-detects source based on the skill identifier:\n * - Starts with \"npm:\" → npm\n * - Contains \"/\" and looks like owner/repo → GitHub\n * - Otherwise → OpenClaw\n *\n * Or specify `source` explicitly.\n */\n async importSkill(\n skillId: string,\n options?: {\n source?: SkillHubProviderType;\n targetDir?: string;\n },\n ): Promise<SkillImportResult> {\n const source = options?.source ?? detectSource(skillId);\n const provider = this.providers.get(source);\n\n if (!provider) {\n return {\n ok: false,\n skillId,\n installPath: \"\",\n message: `Unknown source: ${source}`,\n error: `No provider registered for '${source}'`,\n };\n }\n\n // Determine target directory\n const targetDir =\n options?.targetDir || path.join(getViberRoot(), \"skills\");\n await fs.mkdir(targetDir, { recursive: true });\n\n // Strip source prefix if present\n const cleanId = skillId.replace(\n /^(npm:|github:|openclaw:|huggingface:|hf:|smithery:|composio:|glama:)/,\n \"\",\n );\n\n console.log(\n `[SkillHub] Importing '${cleanId}' from ${provider.displayName}...`,\n );\n\n const result = await provider.importSkill(cleanId, targetDir);\n\n if (result.ok) {\n console.log(`[SkillHub] ✓ ${result.message}`);\n } else {\n console.error(\n `[SkillHub] ✗ ${result.message}${result.error ? `: ${result.error}` : \"\"}`,\n );\n }\n\n return result;\n }\n\n /**\n * List locally installed external skills (in ~/.openviber/skills/).\n */\n async listInstalled(): Promise<\n Array<{ name: string; dir: string; source?: string; version?: string }>\n > {\n const skillsDir = path.join(getViberRoot(), \"skills\");\n\n try {\n const entries = await fs.readdir(skillsDir, { withFileTypes: true });\n const skills: Array<{\n name: string;\n dir: string;\n source?: string;\n version?: string;\n }> = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillDir = path.join(skillsDir, entry.name);\n\n try {\n const skillMd = await fs.readFile(\n path.join(skillDir, \"SKILL.md\"),\n \"utf8\",\n );\n\n // Parse frontmatter\n const parts = skillMd.split(/^---$/m);\n let source: string | undefined;\n let version: string | undefined;\n let name = entry.name;\n\n if (parts.length >= 3) {\n const { default: YAML } = await import(\"yaml\");\n const meta = YAML.parse(parts[1]);\n name = meta?.name || entry.name;\n source = meta?.source || undefined;\n version = meta?.version || undefined;\n }\n\n skills.push({ name, dir: skillDir, source, version });\n } catch {\n // No SKILL.md — skip\n }\n }\n\n return skills;\n } catch {\n return [];\n }\n }\n\n /**\n * Remove a locally installed skill.\n */\n async removeSkill(skillName: string): Promise<{\n ok: boolean;\n message: string;\n }> {\n const skillsDir = path.join(getViberRoot(), \"skills\");\n const skillDir = path.join(skillsDir, skillName);\n\n try {\n await fs.access(skillDir);\n await fs.rm(skillDir, { recursive: true, force: true });\n return {\n ok: true,\n message: `Skill '${skillName}' removed from ${skillDir}`,\n };\n } catch {\n return {\n ok: false,\n message: `Skill '${skillName}' not found in ${skillsDir}`,\n };\n }\n }\n}\n\n/**\n * Auto-detect the source provider from the skill identifier format.\n */\nfunction detectSource(skillId: string): SkillHubProviderType {\n // Explicit prefix\n if (skillId.startsWith(\"npm:\")) return \"npm\";\n if (skillId.startsWith(\"github:\")) return \"github\";\n if (skillId.startsWith(\"openclaw:\")) return \"openclaw\";\n if (skillId.startsWith(\"huggingface:\") || skillId.startsWith(\"hf:\")) return \"huggingface\";\n if (skillId.startsWith(\"smithery:\")) return \"smithery\";\n if (skillId.startsWith(\"composio:\")) return \"composio\";\n if (skillId.startsWith(\"glama:\")) return \"glama\";\n\n // npm scoped package (e.g. @openviber-skills/web-search)\n if (skillId.startsWith(\"@\")) return \"npm\";\n\n // Hugging Face URL\n if (skillId.includes(\"huggingface.co\")) return \"huggingface\";\n\n // GitHub-style owner/repo (exactly 2 segments, no dots)\n const segments = skillId.split(\"/\").filter(Boolean);\n if (segments.length >= 2 && !skillId.includes(\".\")) {\n return \"github\";\n }\n\n // GitHub URL\n if (skillId.includes(\"github.com\")) return \"github\";\n\n // npm-style package name (lowercase, dashes, no slashes)\n if (/^[a-z0-9@][a-z0-9._-]*$/.test(skillId)) return \"npm\";\n\n // Default: try OpenClaw\n return \"openclaw\";\n}\n\n/** Singleton instance */\nlet _manager: SkillHubManager | null = null;\n\n/** Get the shared SkillHubManager instance */\nexport function getSkillHubManager(): SkillHubManager {\n if (!_manager) {\n _manager = new SkillHubManager();\n }\n return _manager;\n}\n\n/**\n * Get the shared SkillHubManager instance, loading settings from disk.\n * Use this async version when you want settings to be applied on first load.\n */\nexport async function getSkillHubManagerWithSettings(): Promise<SkillHubManager> {\n if (!_manager) {\n const { loadSkillSourcesConfig } = await import(\"./settings\");\n const config = await loadSkillSourcesConfig();\n _manager = new SkillHubManager(config);\n }\n return _manager;\n}\n","/**\n * Skill Hub Settings Persistence\n *\n * Reads/writes skill source configuration from ~/.openviber/settings.yaml.\n * The settings file stores which sources are enabled, custom URLs, and API keys.\n */\n\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport * as YAML from \"yaml\";\nimport { getViberRoot } from \"../../utils/paths\";\nimport { getDefaultSourcesConfig, type SkillSourcesConfig } from \"./manager\";\nimport type { SkillHubProviderType } from \"./types\";\n\n/** Canonical list of coding CLI skill IDs (for validation and UI). */\nexport const CODING_CLI_SKILL_IDS = [\n \"codex-cli\",\n \"cursor-agent\",\n \"gemini-cli\",\n] as const;\n\nexport type PrimaryCodingCliId = (typeof CODING_CLI_SKILL_IDS)[number];\n\n/** Stored configuration for a chat channel integration. */\nexport interface ChannelIntegrationSetting {\n enabled: boolean;\n config?: Record<string, string>;\n}\n\n/** Stored OAuth token pair for standalone skill execution. */\nexport interface OAuthTokenSetting {\n accessToken: string;\n refreshToken?: string | null;\n}\n\n/** Full settings file shape */\nexport interface OpenViberSettings {\n /** Skill hub source configuration */\n skillSources?: SkillSourcesConfig;\n /** Primary coding CLI skill to prefer for coding tasks (null = let agent choose). */\n primaryCodingCli?: string | null;\n /** Configured channel integrations (Discord, Feishu, etc.). */\n channelIntegrations?: Record<string, ChannelIntegrationSetting>;\n /** Additional default skills to enable when running tasks standalone. */\n standaloneSkills?: string[];\n /** OAuth tokens available to local standalone runs (e.g. gmail skill). */\n oauthTokens?: Record<string, OAuthTokenSetting>;\n}\n\nconst SETTINGS_FILENAME = \"settings.yaml\";\n\nfunction getSettingsPath(): string {\n return path.join(getViberRoot(), SETTINGS_FILENAME);\n}\n\n/**\n * Load settings from ~/.openviber/settings.yaml.\n * Returns defaults if file doesn't exist or is invalid.\n */\nexport async function loadSettings(): Promise<OpenViberSettings> {\n try {\n const raw = await fs.readFile(getSettingsPath(), \"utf8\");\n const parsed = YAML.parse(raw);\n if (parsed && typeof parsed === \"object\") {\n return normalizeSettings(parsed);\n }\n return { skillSources: getDefaultSourcesConfig(), channelIntegrations: {} };\n } catch {\n return { skillSources: getDefaultSourcesConfig(), channelIntegrations: {} };\n }\n}\n\n/**\n * Save settings to ~/.openviber/settings.yaml.\n */\nexport async function saveSettings(settings: OpenViberSettings): Promise<void> {\n const settingsPath = getSettingsPath();\n await fs.mkdir(path.dirname(settingsPath), { recursive: true });\n\n const header = `# OpenViber Settings\\n# Manage these from the OpenViber web UI at /settings\\n\\n`;\n const content = header + YAML.stringify(settings, { indent: 2 });\n await fs.writeFile(settingsPath, content, \"utf8\");\n}\n\n/**\n * Load only the skill sources configuration.\n */\nexport async function loadSkillSourcesConfig(): Promise<SkillSourcesConfig> {\n const settings = await loadSettings();\n return settings.skillSources || getDefaultSourcesConfig();\n}\n\n/**\n * Save only the skill sources configuration.\n */\nexport async function saveSkillSourcesConfig(\n config: SkillSourcesConfig,\n): Promise<void> {\n const settings = await loadSettings();\n settings.skillSources = config;\n await saveSettings(settings);\n}\n\n/** Normalize/validate settings read from disk */\nfunction normalizeSettings(raw: any): OpenViberSettings {\n const settings: OpenViberSettings = {};\n\n if (raw.skillSources && typeof raw.skillSources === \"object\") {\n const defaults = getDefaultSourcesConfig();\n const normalized: SkillSourcesConfig = {};\n\n // Merge with defaults to ensure all providers are present\n const allTypes: SkillHubProviderType[] = [\n \"github\",\n \"openclaw\",\n \"npm\",\n \"huggingface\",\n \"smithery\",\n \"composio\",\n \"glama\",\n ];\n\n for (const type of allTypes) {\n const saved = raw.skillSources[type];\n const def = defaults[type] || { enabled: false };\n\n if (saved && typeof saved === \"object\") {\n normalized[type] = {\n enabled: typeof saved.enabled === \"boolean\" ? saved.enabled : def.enabled,\n url: typeof saved.url === \"string\" && saved.url ? saved.url : undefined,\n apiKey:\n typeof saved.apiKey === \"string\" && saved.apiKey\n ? saved.apiKey\n : undefined,\n };\n } else {\n normalized[type] = { ...def };\n }\n }\n\n settings.skillSources = normalized;\n } else {\n settings.skillSources = getDefaultSourcesConfig();\n }\n\n // Normalize primaryCodingCli: only allow known coding CLI ids\n if (\n raw.primaryCodingCli != null &&\n typeof raw.primaryCodingCli === \"string\" &&\n (CODING_CLI_SKILL_IDS as readonly string[]).includes(raw.primaryCodingCli)\n ) {\n settings.primaryCodingCli = raw.primaryCodingCli;\n } else {\n settings.primaryCodingCli = undefined;\n }\n\n if (raw.channelIntegrations && typeof raw.channelIntegrations === \"object\") {\n const normalized: Record<string, ChannelIntegrationSetting> = {};\n for (const [key, value] of Object.entries(raw.channelIntegrations)) {\n if (!value || typeof value !== \"object\") continue;\n const channelValue = value as {\n enabled?: unknown;\n config?: Record<string, unknown>;\n };\n const enabled =\n typeof channelValue.enabled === \"boolean\" ? channelValue.enabled : false;\n const config: Record<string, string> = {};\n if (channelValue.config && typeof channelValue.config === \"object\") {\n for (const [configKey, configValue] of Object.entries(channelValue.config)) {\n if (typeof configValue === \"string\" && configValue.length > 0) {\n config[configKey] = configValue;\n }\n }\n }\n normalized[key] = {\n enabled,\n ...(Object.keys(config).length > 0 ? { config } : {}),\n };\n }\n settings.channelIntegrations = normalized;\n } else {\n settings.channelIntegrations = {};\n }\n\n if (Array.isArray(raw.standaloneSkills)) {\n settings.standaloneSkills = raw.standaloneSkills\n .filter((skillId: unknown): skillId is string => typeof skillId === \"string\")\n .map((skillId: string) => skillId.trim())\n .filter((skillId: string) => skillId.length > 0);\n } else {\n settings.standaloneSkills = [];\n }\n\n if (raw.oauthTokens && typeof raw.oauthTokens === \"object\") {\n const normalizedOauthTokens: Record<string, OAuthTokenSetting> = {};\n for (const [provider, value] of Object.entries(raw.oauthTokens)) {\n if (!value || typeof value !== \"object\") continue;\n const tokenValue = value as {\n accessToken?: unknown;\n refreshToken?: unknown;\n };\n if (typeof tokenValue.accessToken !== \"string\" || tokenValue.accessToken.length === 0) {\n continue;\n }\n normalizedOauthTokens[provider] = {\n accessToken: tokenValue.accessToken,\n ...(typeof tokenValue.refreshToken === \"string\" || tokenValue.refreshToken === null\n ? { refreshToken: tokenValue.refreshToken }\n : {}),\n };\n }\n settings.oauthTokens = normalizedOauthTokens;\n } else {\n settings.oauthTokens = {};\n }\n\n return settings;\n}\n","/**\n * Structured Logger for OpenViber\n *\n * JSON-lines logger that captures agent ID, task ID, and structured\n * metadata for debugging and analytics. Replaces ad-hoc console.log.\n */\n\nexport enum LogLevel {\n DEBUG = \"debug\",\n INFO = \"info\",\n WARN = \"warn\",\n ERROR = \"error\",\n}\n\ninterface LogEntry {\n ts: string;\n level: LogLevel;\n component: string;\n msg: string;\n viberId?: string;\n taskId?: string;\n data?: Record<string, unknown>;\n}\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n [LogLevel.DEBUG]: 0,\n [LogLevel.INFO]: 1,\n [LogLevel.WARN]: 2,\n [LogLevel.ERROR]: 3,\n};\n\nlet minLevel: LogLevel = LogLevel.INFO;\n\n/**\n * Set the minimum log level (default: INFO)\n */\nexport function setLogLevel(level: LogLevel): void {\n minLevel = level;\n}\n\n/**\n * Create a scoped logger for a specific component.\n *\n * Usage:\n * const log = createLogger(\"controller\", { viberId: \"abc\" });\n * log.info(\"Connected to hub\");\n * log.error(\"WebSocket error\", { error: err.message });\n */\nexport function createLogger(\n component: string,\n scope?: { viberId?: string; taskId?: string }\n) {\n function emit(\n level: LogLevel,\n msg: string,\n data?: Record<string, unknown>\n ): void {\n if (LOG_LEVELS[level] < LOG_LEVELS[minLevel]) return;\n\n const entry: LogEntry = {\n ts: new Date().toISOString(),\n level,\n component,\n msg,\n ...scope,\n ...(data ? { data } : {}),\n };\n\n const line = JSON.stringify(entry);\n\n switch (level) {\n case LogLevel.ERROR:\n console.error(line);\n break;\n case LogLevel.WARN:\n console.warn(line);\n break;\n default:\n console.log(line);\n }\n }\n\n return {\n debug: (msg: string, data?: Record<string, unknown>) =>\n emit(LogLevel.DEBUG, msg, data),\n info: (msg: string, data?: Record<string, unknown>) =>\n emit(LogLevel.INFO, msg, data),\n warn: (msg: string, data?: Record<string, unknown>) =>\n emit(LogLevel.WARN, msg, data),\n error: (msg: string, data?: Record<string, unknown>) =>\n emit(LogLevel.ERROR, msg, data),\n\n /** Create a child logger with additional scope */\n child: (childScope: { taskId?: string; viberId?: string }) =>\n createLogger(component, { ...scope, ...childScope }),\n };\n}\n\nexport type Logger = ReturnType<typeof createLogger>;\n","import * as fs from \"fs/promises\";\nimport * as fsSync from \"fs\";\nimport * as path from \"path\";\nimport * as yaml from \"yaml\";\nimport { Skill, SkillMeta } from \"./types\";\nimport type { SkillRequirements } from \"./hub/types\";\nimport { createLogger } from \"../utils/logger\";\n\nconst log = createLogger(\"SkillRegistry\");\n\n/**\n * SkillRegistry — discovery and loading of Agent Skills (SKILL.md + _meta.json).\n *\n * Following the Agent Skills spec (agentskills.io) and ClawHub convention:\n * - Skills are instruction packages, NOT tool containers\n * - Each skill dir has SKILL.md (required), _meta.json (optional),\n * scripts/ (optional), references/ (optional)\n * - Progressive disclosure: only name+description loaded at startup,\n * full body loaded when the skill is activated\n *\n * Tools are managed separately by the ToolRegistry (src/tools/).\n */\nexport class SkillRegistry {\n private skills: Map<string, Skill> = new Map();\n\n constructor(private skillsRoot: string) { }\n\n /**\n * Scan for skills in the skills directory.\n * Only loads metadata (name + description) for each skill — the full\n * instructions are available on demand via getSkill().\n */\n async loadAll(): Promise<void> {\n try {\n const entries = await fs.readdir(this.skillsRoot, { withFileTypes: true });\n const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n for (const dirName of dirs) {\n await this.loadSkill(dirName);\n }\n } catch (error) {\n log.warn(\"Failed to scan skills\", {\n data: { skillsRoot: this.skillsRoot, error: String(error) },\n });\n }\n }\n\n /**\n * Load a specific skill by directory name.\n * Parses SKILL.md frontmatter + body, and _meta.json if present.\n */\n async loadSkill(dirName: string): Promise<Skill | undefined> {\n const skillDir = path.join(this.skillsRoot, dirName);\n const skillMdPath = path.join(skillDir, \"SKILL.md\");\n\n try {\n // Check if SKILL.md exists — a directory without SKILL.md is not a skill\n try {\n await fs.access(skillMdPath);\n } catch {\n return undefined;\n }\n\n // Read SKILL.md\n const content = await fs.readFile(skillMdPath, \"utf8\");\n\n // Parse frontmatter (--- delimited YAML)\n const parts = content.split(/^---$/m);\n if (parts.length < 3) {\n log.warn(\"Invalid SKILL.md format\", { data: { dirName } });\n return undefined;\n }\n\n const frontmatter = parts[1];\n const instructions = parts.slice(2).join(\"---\").trim();\n\n const metadata = yaml.parse(frontmatter);\n const id = metadata.name || dirName;\n\n // Read _meta.json if present (ClawHub registry metadata)\n let meta: SkillMeta | undefined;\n const metaPath = path.join(skillDir, \"_meta.json\");\n try {\n const metaContent = await fs.readFile(metaPath, \"utf8\");\n meta = JSON.parse(metaContent) as SkillMeta;\n } catch {\n // _meta.json is optional\n }\n\n // Check for optional directories\n const hasScripts = await this.dirExists(path.join(skillDir, \"scripts\"));\n const hasReferences = await this.dirExists(path.join(skillDir, \"references\"));\n\n const skill: Skill = {\n id,\n metadata: {\n name: id,\n description: metadata.description || \"\",\n ...metadata\n },\n instructions,\n dir: skillDir,\n meta,\n hasScripts,\n hasReferences,\n };\n\n this.skills.set(id, skill);\n return skill;\n\n } catch (error) {\n log.error(\"Failed to load skill\", {\n data: { dirName, error: String(error) },\n });\n return undefined;\n }\n }\n\n getSkill(id: string): Skill | undefined {\n return this.skills.get(id);\n }\n\n getAllSkills(): Skill[] {\n return Array.from(this.skills.values());\n }\n\n /**\n * Get the requirements for a skill (from SKILL.md frontmatter).\n */\n getRequirements(skillId: string): SkillRequirements | undefined {\n const skill = this.skills.get(skillId);\n return skill?.metadata?.requires;\n }\n\n private async dirExists(dirPath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(dirPath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n }\n}\n\nimport { getViberRoot } from \"../utils/paths\";\nimport { getModuleDirname } from \"../utils/module-path\";\n\nconst __dirname = getModuleDirname();\n\n// Try multiple paths for skill discovery:\n// 1. User's config directory (~/.openviber/skills) - User custom skills\n// 2. Bundled skills (relative to this file in dist) - Package skills\n// 3. Development mode: src/skills in cwd (only if running from source)\nfunction getDefaultSkillsPath(): string {\n // Option 1: User's config directory (~/.openviber/skills)\n const userSkillsPath = path.join(getViberRoot(), \"skills\");\n try {\n fsSync.accessSync(userSkillsPath);\n log.info(\"Using skills path (user)\", { data: { path: userSkillsPath } });\n return userSkillsPath;\n } catch {\n // Option 2: Bundled skills (relative to this file - works for dist/)\n const bundledPath = path.resolve(__dirname, \".\");\n try {\n fsSync.accessSync(bundledPath);\n // Only use if it looks like a skills directory (not just dist/)\n const hasSkillDirs = fsSync.readdirSync(bundledPath).some(f => {\n const skillMd = path.join(bundledPath, f, \"SKILL.md\");\n try { fsSync.accessSync(skillMd); return true; } catch { return false; }\n });\n if (hasSkillDirs) {\n log.info(\"Using skills path (bundled)\", { data: { path: bundledPath } });\n return bundledPath;\n }\n } catch { /* continue */ }\n\n // Option 3: Development mode - src/skills in cwd\n const devPath = path.resolve(process.cwd(), \"src/skills\");\n try {\n fsSync.accessSync(devPath);\n log.info(\"Using skills path (dev)\", { data: { path: devPath } });\n return devPath;\n } catch {\n // Fallback: just return user path (will be created on demand)\n log.info(\"Using skills path (default)\", {\n data: { path: userSkillsPath },\n });\n return userSkillsPath;\n }\n }\n}\n\nexport const defaultRegistry = new SkillRegistry(getDefaultSkillsPath());\n","/**\n * Gemini CLI Credential Sync\n *\n * Writes OAuth tokens (from Supabase-stored web OAuth connections) into\n * the Gemini CLI's credential files (~/.gemini/) so that spinning up\n * `gemini` as a subprocess automatically picks up the user's auth.\n *\n * File formats are based on Gemini CLI's actual storage structure:\n * - oauth_creds.json → access/refresh tokens\n * - settings.json → auth type selection\n * - google_accounts.json → active Google account email\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst GEMINI_DIR = path.join(os.homedir(), \".gemini\");\n\nexport interface GeminiCredentials {\n accessToken: string;\n refreshToken?: string | null;\n accountEmail?: string | null;\n /** Token expiry as epoch-ms. Defaults to 1 hour from now if omitted. */\n expiryDate?: number;\n}\n\n/**\n * Write OAuth tokens to ~/.gemini/ in the format the Gemini CLI expects.\n *\n * This enables the Gemini CLI subprocess to authenticate using web-stored\n * Google OAuth tokens (pulled from Supabase) rather than requiring the\n * user to run `gemini` login on each daemon node.\n */\nexport function syncGeminiCredentials(creds: GeminiCredentials): void {\n fs.mkdirSync(GEMINI_DIR, { recursive: true });\n\n // ── oauth_creds.json ──\n const oauthCreds: Record<string, unknown> = {\n access_token: creds.accessToken,\n scope: [\n \"https://www.googleapis.com/auth/userinfo.profile\",\n \"https://www.googleapis.com/auth/cloud-platform\",\n \"https://www.googleapis.com/auth/userinfo.email\",\n \"openid\",\n ].join(\" \"),\n token_type: \"Bearer\",\n expiry_date: creds.expiryDate ?? Date.now() + 3600 * 1000,\n };\n if (creds.refreshToken) {\n oauthCreds.refresh_token = creds.refreshToken;\n }\n fs.writeFileSync(\n path.join(GEMINI_DIR, \"oauth_creds.json\"),\n JSON.stringify(oauthCreds, null, 2) + \"\\n\",\n { mode: 0o600 },\n );\n\n // ── settings.json ──\n // Preserve existing settings, only ensure auth type is set\n const settingsPath = path.join(GEMINI_DIR, \"settings.json\");\n let settings: Record<string, any> = {};\n try {\n settings = JSON.parse(fs.readFileSync(settingsPath, \"utf8\"));\n } catch {\n // No existing settings — start fresh\n }\n if (!settings.security) settings.security = {};\n if (!settings.security.auth) settings.security.auth = {};\n settings.security.auth.selectedType = \"oauth-personal\";\n fs.writeFileSync(\n settingsPath,\n JSON.stringify(settings, null, 2) + \"\\n\",\n );\n\n // ── google_accounts.json ──\n if (creds.accountEmail) {\n const accountsPath = path.join(GEMINI_DIR, \"google_accounts.json\");\n const accounts = {\n active: creds.accountEmail,\n old: [],\n };\n fs.writeFileSync(\n accountsPath,\n JSON.stringify(accounts, null, 2) + \"\\n\",\n );\n }\n}\n\n/**\n * Check whether Gemini CLI credentials exist on disk (regardless of source).\n */\nexport function hasGeminiCredentials(): boolean {\n try {\n const credsPath = path.join(GEMINI_DIR, \"oauth_creds.json\");\n const content = fs.readFileSync(credsPath, \"utf8\");\n const creds = JSON.parse(content);\n return !!creds.access_token;\n } catch {\n return false;\n }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport { spawnSync } from \"child_process\";\nimport { defaultRegistry } from \"./registry\";\n\nexport type SkillHealthStatus = \"AVAILABLE\" | \"NOT_AVAILABLE\" | \"UNKNOWN\";\n\n/**\n * Classifies what kind of interactive action can resolve a failing check.\n *\n * - `\"env\"` — Missing environment variable (prompt user to paste a key)\n * - `\"oauth\"` — OAuth connection needed (run browser/headless OAuth flow)\n * - `\"binary\"` — CLI binary not found (show install command, offer retry)\n * - `\"auth_cli\"` — CLI auth needed (show login command, offer retry)\n * - `\"manual\"` — Requires manual/external setup (show hint only)\n */\nexport type HealthCheckActionType = \"env\" | \"oauth\" | \"binary\" | \"auth_cli\" | \"manual\";\n\nexport interface SkillHealthCheck {\n id: string;\n label: string;\n ok: boolean;\n required?: boolean;\n message?: string;\n hint?: string;\n /** What kind of interactive action can resolve this check (for onboarding wizard). */\n actionType?: HealthCheckActionType;\n}\n\nexport interface SkillHealthResult {\n id: string;\n name: string;\n status: SkillHealthStatus;\n available: boolean;\n checks: SkillHealthCheck[];\n summary: string;\n}\n\nexport interface SkillHealthReport {\n generatedAt: string;\n skills: SkillHealthResult[];\n}\n\nexport interface SkillInfo {\n id: string;\n name?: string;\n description?: string;\n}\n\ntype CommandResult = {\n ok: boolean;\n stdout: string;\n stderr: string;\n exitCode?: number | null;\n error?: string;\n};\n\nconst COMMAND_TIMEOUT_MS = 3000;\nconst DEFAULT_SKILL_IDS = [\n \"cursor-agent\",\n \"codex-cli\",\n \"gemini-cli\",\n \"github\",\n \"gmail\",\n \"railway\",\n \"system-info\",\n \"terminal\",\n] as const;\n\nfunction formatFirstLine(text: string): string {\n return text.split(/\\r?\\n/).map((line) => line.trim()).find(Boolean) || \"\";\n}\n\nfunction resolveExecutableCandidates(command: string): string[] {\n if (process.platform === \"win32\") {\n return [command, `${command}.exe`, `${command}.cmd`, `${command}.bat`];\n }\n return [command];\n}\n\nfunction findExecutable(command: string): string | null {\n const pathEntries = (process.env.PATH || \"\").split(path.delimiter).filter(Boolean);\n const candidates = resolveExecutableCandidates(command);\n for (const entry of pathEntries) {\n for (const candidate of candidates) {\n const fullPath = path.join(entry, candidate);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n }\n }\n return null;\n}\n\nfunction resolveCommand(candidates: string[]): string | null {\n for (const candidate of candidates) {\n if (findExecutable(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction runCommand(\n command: string,\n args: string[],\n timeoutMs: number = COMMAND_TIMEOUT_MS,\n): CommandResult {\n const result = spawnSync(command, args, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: timeoutMs,\n });\n\n const stdout = result.stdout ? String(result.stdout) : \"\";\n const stderr = result.stderr ? String(result.stderr) : \"\";\n if (result.error) {\n return {\n ok: false,\n stdout,\n stderr,\n exitCode: result.status,\n error: result.error.message,\n };\n }\n\n return {\n ok: result.status === 0,\n stdout,\n stderr,\n exitCode: result.status,\n };\n}\n\nfunction buildResult(skill: SkillInfo, checks: SkillHealthCheck[]): SkillHealthResult {\n if (checks.length === 0) {\n return {\n id: skill.id,\n name: skill.name || skill.id,\n status: \"UNKNOWN\",\n available: false,\n checks,\n summary: \"No automated health checks defined.\",\n };\n }\n\n const failedRequired = checks.filter((check) => (check.required ?? true) && !check.ok);\n const available = failedRequired.length === 0;\n const status: SkillHealthStatus = available ? \"AVAILABLE\" : \"NOT_AVAILABLE\";\n const summary = available\n ? \"All prerequisites satisfied.\"\n : `Missing: ${failedRequired.map((check) => check.label).join(\", \")}`;\n\n return {\n id: skill.id,\n name: skill.name || skill.id,\n status,\n available,\n checks,\n summary,\n };\n}\n\nfunction buildCommandCheck(args: {\n id: string;\n label: string;\n candidates: string[];\n hint: string;\n}): { command: string | null; check: SkillHealthCheck } {\n const command = resolveCommand(args.candidates);\n return {\n command,\n check: {\n id: args.id,\n label: args.label,\n ok: !!command,\n required: true,\n message: command ? `Found: ${command}` : \"Not found in PATH\",\n hint: command ? undefined : args.hint,\n actionType: \"binary\",\n },\n };\n}\n\nfunction buildEnvCheck(args: {\n id: string;\n label: string;\n envVars: string[];\n hint: string;\n actionType?: HealthCheckActionType;\n}): SkillHealthCheck {\n const found = args.envVars.find((key) => !!process.env[key]?.trim());\n return {\n id: args.id,\n label: args.label,\n ok: !!found,\n required: true,\n message: found ? `${found} set` : `${args.envVars.join(\" or \")} not set`,\n hint: found ? undefined : args.hint,\n actionType: args.actionType ?? \"env\",\n };\n}\n\nfunction buildAuthCheck(args: {\n id: string;\n label: string;\n envVars?: string[];\n command?: string | null;\n commandArgs?: string[];\n hint: string;\n}): SkillHealthCheck {\n const envCheck =\n args.envVars && args.envVars.length > 0\n ? buildEnvCheck({\n id: args.id,\n label: args.label,\n envVars: args.envVars,\n hint: args.hint,\n actionType: \"auth_cli\",\n })\n : null;\n\n if (envCheck?.ok) {\n return envCheck;\n }\n\n if (!args.command || !args.commandArgs) {\n return {\n id: args.id,\n label: args.label,\n ok: false,\n required: true,\n message: \"Authentication not verified\",\n hint: args.hint,\n actionType: \"auth_cli\",\n };\n }\n\n const result = runCommand(args.command, args.commandArgs);\n if (result.ok) {\n return {\n id: args.id,\n label: args.label,\n ok: true,\n required: true,\n message: \"Authenticated via CLI\",\n actionType: \"auth_cli\",\n };\n }\n\n const detail = formatFirstLine(result.error || result.stderr) || \"Not authenticated\";\n return {\n id: args.id,\n label: args.label,\n ok: false,\n required: true,\n message: detail,\n hint: args.hint,\n actionType: \"auth_cli\",\n };\n}\n\n\nasync function checkCursorAgentHealth(skill: SkillInfo): Promise<SkillHealthResult> {\n const commandCheck = buildCommandCheck({\n id: \"cursor-cli\",\n label: \"Cursor CLI installed\",\n candidates: [\"agent\", \"cursor-agent\"],\n hint: \"Install with: curl https://cursor.com/install -fsS | bash\",\n });\n const tmuxCheck = buildCommandCheck({\n id: \"tmux\",\n label: \"Terminal backend (tmux) installed\",\n candidates: [\"tmux\"],\n hint: \"Install with: brew install tmux (macOS) or sudo apt install tmux\",\n });\n const authCheck = buildAuthCheck({\n id: \"cursor-auth\",\n label: \"Cursor auth\",\n envVars: [\"CURSOR_API_KEY\"],\n command: commandCheck.command,\n commandArgs: [\"auth\", \"status\"],\n hint: \"Run `agent login` or set CURSOR_API_KEY\",\n });\n\n return buildResult(skill, [commandCheck.check, tmuxCheck.check, authCheck]);\n}\n\nasync function checkCodexHealth(skill: SkillInfo): Promise<SkillHealthResult> {\n const commandCheck = buildCommandCheck({\n id: \"codex-cli\",\n label: \"Codex CLI installed\",\n candidates: [\"codex\"],\n hint: \"Install with: pnpm add -g @openai/codex\",\n });\n const authCheck = buildAuthCheck({\n id: \"codex-auth\",\n label: \"Codex auth\",\n envVars: [\"OPENAI_API_KEY\"],\n command: commandCheck.command,\n commandArgs: [\"auth\", \"status\"],\n hint: \"Run `codex login` or set OPENAI_API_KEY\",\n });\n\n return buildResult(skill, [commandCheck.check, authCheck]);\n}\n\nasync function checkGeminiHealth(skill: SkillInfo): Promise<SkillHealthResult> {\n const commandCheck = buildCommandCheck({\n id: \"gemini-cli\",\n label: \"Gemini CLI installed\",\n candidates: [\"gemini\"],\n hint: \"Install with: pnpm add -g @google/gemini-cli\",\n });\n\n // Check env vars first, then ~/.gemini/oauth_creds.json (web-injected or\n // CLI-native tokens), then fall back to `gemini auth status`.\n let authCheck: SkillHealthCheck;\n const envOk =\n !!process.env.GEMINI_API_KEY || !!process.env.GOOGLE_APPLICATION_CREDENTIALS;\n\n if (envOk) {\n authCheck = {\n id: \"gemini-auth\",\n label: \"Gemini auth\",\n ok: true,\n required: true,\n message: \"Authenticated via environment variable\",\n actionType: \"auth_cli\",\n };\n } else {\n // Try file-based credential detection (fast, no subprocess)\n try {\n const { hasGeminiCredentials } = await import(\"../tools/gemini-auth\");\n if (hasGeminiCredentials()) {\n authCheck = {\n id: \"gemini-auth\",\n label: \"Gemini auth\",\n ok: true,\n required: true,\n message: \"Authenticated via OAuth credentials\",\n actionType: \"auth_cli\",\n };\n } else {\n throw new Error(\"no creds\");\n }\n } catch {\n // Fall back to CLI auth status command\n authCheck = buildAuthCheck({\n id: \"gemini-auth\",\n label: \"Gemini auth\",\n envVars: [],\n command: commandCheck.command,\n commandArgs: [\"auth\", \"status\"],\n hint: \"Run `gemini` to login or set GEMINI_API_KEY\",\n });\n }\n }\n\n return buildResult(skill, [commandCheck.check, authCheck]);\n}\n\nasync function checkGithubHealth(skill: SkillInfo): Promise<SkillHealthResult> {\n const commandCheck = buildCommandCheck({\n id: \"gh-cli\",\n label: \"GitHub CLI installed\",\n candidates: [\"gh\"],\n hint: \"Install with: brew install gh\",\n });\n const authCheck = buildAuthCheck({\n id: \"gh-auth\",\n label: \"GitHub auth\",\n envVars: [\"GH_TOKEN\", \"GITHUB_TOKEN\"],\n command: commandCheck.command,\n commandArgs: [\"auth\", \"status\", \"-h\", \"github.com\"],\n hint: \"Run `gh auth login` or set GH_TOKEN\",\n });\n\n return buildResult(skill, [commandCheck.check, authCheck]);\n}\n\nasync function checkRailwayHealth(skill: SkillInfo): Promise<SkillHealthResult> {\n const commandCheck = buildCommandCheck({\n id: \"railway-cli\",\n label: \"Railway CLI installed\",\n candidates: [\"railway\"],\n hint: \"Install with: pnpm add -g @railway/cli\",\n });\n const authCheck = buildAuthCheck({\n id: \"railway-auth\",\n label: \"Railway auth\",\n envVars: [\"RAILWAY_TOKEN\"],\n command: commandCheck.command,\n commandArgs: [\"whoami\"],\n hint: \"Run `railway login` or set RAILWAY_TOKEN\",\n });\n\n return buildResult(skill, [commandCheck.check, authCheck]);\n}\n\nasync function checkTerminalHealth(skill: SkillInfo): Promise<SkillHealthResult> {\n const commandCheck = buildCommandCheck({\n id: \"tmux\",\n label: \"Terminal backend (tmux) installed\",\n candidates: [\"tmux\"],\n hint: \"Install with: brew install tmux (macOS) or sudo apt install tmux\",\n });\n return buildResult(skill, [commandCheck.check]);\n}\n\nasync function checkGmailHealth(skill: SkillInfo): Promise<SkillHealthResult> {\n // Gmail uses Google OAuth. Three ways to satisfy this:\n // 1. Connected mode: tokens in Supabase (requires GOOGLE_CLIENT_ID on the web server)\n // 2. Standalone: local OAuth tokens in settings.yaml\n // 3. Standalone: tokens passed via CLI flags\n\n // Check for local OAuth tokens first (standalone mode)\n let hasLocalTokens = false;\n try {\n const { loadSettings } = await import(\"./hub/settings\");\n const settings = await loadSettings();\n hasLocalTokens = !!settings.oauthTokens?.google?.accessToken;\n } catch {\n // settings load failed — skip\n }\n\n if (hasLocalTokens) {\n return buildResult(skill, [\n {\n id: \"google-oauth\",\n label: \"Google OAuth\",\n ok: true,\n required: true,\n message: \"Local OAuth tokens configured\",\n actionType: \"oauth\",\n },\n ]);\n }\n\n // Fall back to checking for server-side OAuth config or env vars\n const hasClientId = !!process.env.GOOGLE_CLIENT_ID?.trim();\n return buildResult(skill, [\n {\n id: \"google-oauth\",\n label: \"Google OAuth\",\n ok: hasClientId,\n required: true,\n message: hasClientId\n ? \"GOOGLE_CLIENT_ID set — connect via web or run `viber auth google`\"\n : \"Google account not connected\",\n hint: hasClientId\n ? undefined\n : \"Run `viber auth google` to connect your Google account\",\n actionType: \"oauth\",\n },\n ]);\n}\n\nasync function checkSystemInfoHealth(skill: SkillInfo): Promise<SkillHealthResult> {\n // No external deps — always available (uses only Node.js os module)\n return buildResult(skill, [\n {\n id: \"nodejs-os\",\n label: \"Node.js os module\",\n ok: true,\n required: true,\n message: \"Built-in module always available\",\n },\n ]);\n}\n\nconst SKILL_CHECKERS: Record<\n string,\n (skill: SkillInfo) => Promise<SkillHealthResult>\n> = {\n \"cursor-agent\": checkCursorAgentHealth,\n \"codex-cli\": checkCodexHealth,\n \"gemini-cli\": checkGeminiHealth,\n github: checkGithubHealth,\n gmail: checkGmailHealth,\n railway: checkRailwayHealth,\n \"system-info\": checkSystemInfoHealth,\n terminal: checkTerminalHealth,\n};\n\n/**\n * Load all installed skills and return their metadata for health checks.\n */\nexport async function getInstalledSkills(): Promise<SkillInfo[]> {\n await defaultRegistry.loadAll();\n const skills = defaultRegistry.getAllSkills();\n const merged = new Map<string, SkillInfo>();\n\n for (const skill of skills) {\n merged.set(skill.id, {\n id: skill.id,\n name: skill.metadata?.name || skill.id,\n description: skill.metadata?.description || \"\",\n });\n }\n\n for (const id of DEFAULT_SKILL_IDS) {\n if (!merged.has(id)) {\n merged.set(id, { id, name: id, description: \"\" });\n }\n }\n\n return Array.from(merged.values()).sort((a, b) =>\n a.id.localeCompare(b.id),\n );\n}\n\n/**\n * Run a health check for a single skill.\n */\nexport async function checkSkillHealth(skill: SkillInfo): Promise<SkillHealthResult> {\n const checker = SKILL_CHECKERS[skill.id];\n if (!checker) {\n return buildResult(skill, []);\n }\n return checker(skill);\n}\n\n/**\n * Run health checks for a list of skills.\n */\nexport async function checkSkillsHealth(\n skills: SkillInfo[],\n): Promise<SkillHealthReport> {\n const results: SkillHealthResult[] = [];\n for (const skill of skills) {\n results.push(await checkSkillHealth(skill));\n }\n return {\n generatedAt: new Date().toISOString(),\n skills: results,\n };\n}\n\n/**\n * Convenience helper: load installed skills and return their health report.\n */\nexport async function getSkillHealthReport(): Promise<SkillHealthReport> {\n const skills = await getInstalledSkills();\n return checkSkillsHealth(skills);\n}\n","/**\n * CLI Auth Module\n *\n * Provides interactive API key setup and OAuth flows (Google/Gmail) for the\n * OpenViber CLI. Supports two environments:\n *\n * - **GUI mode** – opens the system browser for OAuth consent and starts a\n * tiny local HTTP server to receive the callback.\n * - **Headless / SSH mode** – prints the consent URL so the user can open it\n * on another machine, then asks them to paste the redirect URL that contains\n * the authorization code.\n *\n * When the node is connected to the OpenViber web app (onboarded), the CLI\n * delegates to the web app for OAuth and polls for token availability.\n */\n\nimport * as http from \"http\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport * as readline from \"readline\";\nimport { exec, spawn } from \"child_process\";\nimport { getViberRoot } from \"../utils/paths\";\nimport { loadSettings, saveSettings } from \"../skills/hub/settings\";\n\n// ────────────────────────────────────────────────────────────\n// Constants\n// ────────────────────────────────────────────────────────────\n\n/** Resolve the OpenViber root dir (testable via config mock). */\nfunction getOpenViberDir(): string {\n return getViberRoot();\n}\n\nfunction getEnvFile(): string {\n return path.join(getOpenViberDir(), \".env\");\n}\n\nfunction getConfigFile(): string {\n return path.join(getOpenViberDir(), \"config.yaml\");\n}\n\n/** Port used by the local callback server (standalone OAuth). */\nexport const LOCAL_CALLBACK_PORT = 9876;\nexport const LOCAL_CALLBACK_PATH = \"/callback\";\nexport const LOCAL_REDIRECT_URI = `http://localhost:${LOCAL_CALLBACK_PORT}${LOCAL_CALLBACK_PATH}`;\n\nconst GOOGLE_AUTH_URL = \"https://accounts.google.com/o/oauth2/v2/auth\";\nconst GOOGLE_TOKEN_URL = \"https://oauth2.googleapis.com/token\";\n\n/** Google OAuth scopes – matches the web app. */\nexport const GOOGLE_OAUTH_SCOPES = [\n \"https://www.googleapis.com/auth/gmail.readonly\",\n \"https://www.googleapis.com/auth/gmail.send\",\n \"https://www.googleapis.com/auth/gmail.modify\",\n \"https://www.googleapis.com/auth/userinfo.email\",\n \"https://www.googleapis.com/auth/cloud-platform\",\n];\n\n/** Supported LLM provider keys that can be configured interactively. */\nexport const PROVIDER_ENV_KEYS: Record<string, { envVar: string; url: string }> = {\n openrouter: {\n envVar: \"OPENROUTER_API_KEY\",\n url: \"https://openrouter.ai/keys\",\n },\n anthropic: {\n envVar: \"ANTHROPIC_API_KEY\",\n url: \"https://console.anthropic.com/settings/keys\",\n },\n openai: {\n envVar: \"OPENAI_API_KEY\",\n url: \"https://platform.openai.com/api-keys\",\n },\n deepseek: {\n envVar: \"DEEPSEEK_API_KEY\",\n url: \"https://platform.deepseek.com/api_keys\",\n },\n};\n\n// ────────────────────────────────────────────────────────────\n// Headless / GUI detection\n// ────────────────────────────────────────────────────────────\n\n/**\n * Detect whether we are running in a headless environment (SSH session,\n * no display, container, etc.) where opening a browser is not possible.\n */\nexport function isHeadless(): boolean {\n // Explicit SSH session indicators\n if (process.env.SSH_CONNECTION || process.env.SSH_TTY) return true;\n\n // Linux: no DISPLAY and no WAYLAND_DISPLAY\n if (\n process.platform === \"linux\" &&\n !process.env.DISPLAY &&\n !process.env.WAYLAND_DISPLAY\n ) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Attempt to open a URL in the default browser.\n * Returns `true` if the command was dispatched (not necessarily successful).\n */\nexport function openBrowser(url: string): boolean {\n try {\n if (process.platform === \"darwin\") {\n exec(`open \"${url}\"`);\n } else if (process.platform === \"linux\") {\n exec(`xdg-open \"${url}\"`);\n } else if (process.platform === \"win32\") {\n exec(`start \"\" \"${url}\"`);\n } else {\n return false;\n }\n return true;\n } catch {\n return false;\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// Readline helpers\n// ────────────────────────────────────────────────────────────\n\nfunction createRl(): readline.Interface {\n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n}\n\nfunction ask(rl: readline.Interface, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => resolve(answer.trim()));\n });\n}\n\nfunction getTmuxInstallCommandForPlatform(): string | null {\n if (process.platform === \"darwin\") {\n return \"brew install tmux\";\n }\n if (process.platform === \"linux\") {\n return \"sudo apt-get update && sudo apt-get install -y tmux\";\n }\n return null;\n}\n\nfunction getAutoInstallCommand(skillId: string, checkId: string): string | null {\n if (checkId === \"tmux\") {\n return getTmuxInstallCommandForPlatform();\n }\n if (skillId === \"cursor-agent\" && checkId === \"cursor-cli\") {\n return \"curl https://cursor.com/install -fsS | bash\";\n }\n if (skillId === \"codex-cli\" && checkId === \"codex-cli\") {\n return \"pnpm add -g @openai/codex\";\n }\n if (skillId === \"gemini-cli\" && checkId === \"gemini-cli\") {\n return \"npm install -g @google/gemini-cli\";\n }\n if (skillId === \"github\" && checkId === \"gh-cli\") {\n if (process.platform === \"darwin\") return \"brew install gh\";\n if (process.platform === \"linux\") {\n return \"sudo apt-get update && sudo apt-get install -y gh\";\n }\n return null;\n }\n if (skillId === \"railway\" && checkId === \"railway-cli\") {\n return \"npm install -g @railway/cli\";\n }\n return null;\n}\n\nfunction getAuthCommand(skillId: string, checkId: string): string | null {\n if (skillId === \"cursor-agent\" && checkId === \"cursor-auth\") {\n return \"agent login || cursor-agent login\";\n }\n if (skillId === \"codex-cli\" && checkId === \"codex-auth\") {\n return \"codex login\";\n }\n if (skillId === \"gemini-cli\" && checkId === \"gemini-auth\") {\n return \"gemini\";\n }\n if (skillId === \"github\" && checkId === \"gh-auth\") {\n return \"gh auth login -h github.com\";\n }\n if (skillId === \"railway\" && checkId === \"railway-auth\") {\n return \"railway login\";\n }\n return null;\n}\n\nfunction getAuthEnvVar(skillId: string, checkId: string): string | null {\n if (skillId === \"cursor-agent\" && checkId === \"cursor-auth\") {\n return \"CURSOR_API_KEY\";\n }\n if (skillId === \"codex-cli\" && checkId === \"codex-auth\") {\n return \"OPENAI_API_KEY\";\n }\n if (skillId === \"gemini-cli\" && checkId === \"gemini-auth\") {\n return \"GEMINI_API_KEY\";\n }\n if (skillId === \"github\" && checkId === \"gh-auth\") {\n return \"GH_TOKEN\";\n }\n if (skillId === \"railway\" && checkId === \"railway-auth\") {\n return \"RAILWAY_TOKEN\";\n }\n return null;\n}\n\nasync function runInteractiveShellCommand(command: string): Promise<boolean> {\n return await new Promise<boolean>((resolve) => {\n const child = spawn(command, {\n shell: true,\n stdio: \"inherit\",\n env: process.env,\n });\n child.once(\"close\", (code) => resolve((code ?? 1) === 0));\n child.once(\"error\", () => resolve(false));\n });\n}\n\n// ────────────────────────────────────────────────────────────\n// Google OAuth URL builder\n// ────────────────────────────────────────────────────────────\n\nexport interface GoogleOAuthConfig {\n clientId: string;\n clientSecret: string;\n}\n\n/**\n * Build the Google OAuth consent URL for the CLI local-callback flow.\n */\nexport function buildGoogleAuthUrl(clientId: string, state: string): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: LOCAL_REDIRECT_URI,\n response_type: \"code\",\n scope: GOOGLE_OAUTH_SCOPES.join(\" \"),\n access_type: \"offline\",\n prompt: \"consent\",\n state,\n });\n return `${GOOGLE_AUTH_URL}?${params.toString()}`;\n}\n\n/**\n * Exchange an authorization code for Google access + refresh tokens.\n */\nexport async function exchangeGoogleCode(\n code: string,\n config: GoogleOAuthConfig,\n): Promise<{ accessToken: string; refreshToken: string | null; expiresIn: number }> {\n const response = await fetch(GOOGLE_TOKEN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n code,\n client_id: config.clientId,\n client_secret: config.clientSecret,\n redirect_uri: LOCAL_REDIRECT_URI,\n grant_type: \"authorization_code\",\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Google token exchange failed (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n };\n\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token ?? null,\n expiresIn: data.expires_in,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// Extract code from redirect URL (headless paste)\n// ────────────────────────────────────────────────────────────\n\n/**\n * Parse the authorization code from a pasted redirect URL.\n * Accepts either a full URL or just the code string.\n */\nexport function extractCodeFromUrl(input: string): string | null {\n const trimmed = input.trim();\n\n // If it looks like a URL, parse the `code` query param\n if (trimmed.startsWith(\"http://\") || trimmed.startsWith(\"https://\")) {\n try {\n const url = new URL(trimmed);\n return url.searchParams.get(\"code\");\n } catch {\n return null;\n }\n }\n\n // If it's not a URL, treat the whole input as the code (user may have\n // extracted it manually)\n if (trimmed.length > 0) {\n return trimmed;\n }\n\n return null;\n}\n\n// ────────────────────────────────────────────────────────────\n// Local callback HTTP server\n// ────────────────────────────────────────────────────────────\n\n/**\n * Start a temporary HTTP server that waits for the Google OAuth callback.\n * Resolves with the authorization code when received.\n */\nexport function startCallbackServer(\n expectedState: string,\n): Promise<{ code: string; server: http.Server }> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n if (!req.url?.startsWith(LOCAL_CALLBACK_PATH)) {\n res.writeHead(404);\n res.end(\"Not found\");\n return;\n }\n\n const url = new URL(req.url, `http://localhost:${LOCAL_CALLBACK_PORT}`);\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n const error = url.searchParams.get(\"error\");\n\n if (error) {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h2>Authorization failed</h2>\" +\n `<p>Error: ${error}</p>` +\n \"<p>You can close this tab.</p></body></html>\",\n );\n server.close();\n reject(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (!code) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h2>Missing authorization code</h2>\" +\n \"<p>You can close this tab.</p></body></html>\",\n );\n return;\n }\n\n if (state !== expectedState) {\n res.writeHead(400, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h2>Invalid state parameter</h2>\" +\n \"<p>Possible CSRF attack. Please try again.</p></body></html>\",\n );\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(\n \"<html><body><h2>Authorization successful!</h2>\" +\n \"<p>You can close this tab and return to the terminal.</p></body></html>\",\n );\n\n resolve({ code, server });\n });\n\n server.on(\"error\", (err) => {\n reject(new Error(`Failed to start callback server: ${err.message}`));\n });\n\n server.listen(LOCAL_CALLBACK_PORT, \"127.0.0.1\", () => {\n // Server ready\n });\n\n // Timeout after 5 minutes\n setTimeout(() => {\n server.close();\n reject(new Error(\"OAuth callback timed out (5 minutes). Please try again.\"));\n }, 5 * 60 * 1000);\n });\n}\n\n// ────────────────────────────────────────────────────────────\n// Resolve Google OAuth credentials\n// ────────────────────────────────────────────────────────────\n\n/**\n * Resolve Google Client ID & Secret from environment variables.\n */\nexport function resolveGoogleCredentials(): GoogleOAuthConfig | null {\n const clientId = process.env.GOOGLE_CLIENT_ID;\n const clientSecret = process.env.GOOGLE_CLIENT_SECRET;\n if (clientId && clientSecret) {\n return { clientId, clientSecret };\n }\n return null;\n}\n\n// ────────────────────────────────────────────────────────────\n// Standalone Google OAuth flow (full)\n// ────────────────────────────────────────────────────────────\n\n/**\n * Run the standalone Google OAuth flow.\n *\n * - GUI: opens browser + local callback server\n * - Headless: prints URL + asks user to paste redirect URL\n */\nexport async function runStandaloneGoogleOAuth(options: {\n noBrowser?: boolean;\n}): Promise<void> {\n const creds = resolveGoogleCredentials();\n if (!creds) {\n console.error(\n \"\\n Google OAuth credentials not found.\\n\" +\n \" Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET environment variables.\\n\" +\n \"\\n You can create credentials at:\\n\" +\n \" https://console.cloud.google.com/apis/credentials\\n\" +\n \" (Choose \\\"Desktop app\\\" as the application type)\\n\",\n );\n process.exit(1);\n }\n\n const state = Math.random().toString(36).slice(2) + Date.now().toString(36);\n const consentUrl = buildGoogleAuthUrl(creds.clientId, state);\n\n const headless = options.noBrowser || isHeadless();\n\n if (headless) {\n await runHeadlessFlow(consentUrl, state, creds);\n } else {\n await runBrowserFlow(consentUrl, state, creds);\n }\n}\n\nasync function runBrowserFlow(\n consentUrl: string,\n state: string,\n creds: GoogleOAuthConfig,\n): Promise<void> {\n console.log(\"\\n Starting local callback server...\");\n\n const serverPromise = startCallbackServer(state);\n\n console.log(\" Opening browser for Google authorization...\\n\");\n const opened = openBrowser(consentUrl);\n\n if (!opened) {\n console.log(\" Could not open browser. Please visit this URL manually:\\n\");\n console.log(` ${consentUrl}\\n`);\n }\n\n console.log(\" Waiting for authorization...\");\n\n try {\n const { code, server } = await serverPromise;\n server.close();\n\n console.log(\" Authorization received! Exchanging code for tokens...\\n\");\n\n const tokens = await exchangeGoogleCode(code, creds);\n await saveGoogleTokens(tokens.accessToken, tokens.refreshToken);\n\n console.log(\" Google account connected successfully!\");\n console.log(\" Tokens saved to ~/.openviber/settings.yaml\\n\");\n } catch (err: any) {\n console.error(`\\n OAuth failed: ${err.message}\\n`);\n process.exit(1);\n }\n}\n\nasync function runHeadlessFlow(\n consentUrl: string,\n _state: string,\n creds: GoogleOAuthConfig,\n): Promise<void> {\n console.log(\"\\n Headless mode detected (SSH / no display).\\n\");\n console.log(\" Open this URL in a browser on another machine:\\n\");\n console.log(` ${consentUrl}\\n`);\n console.log(\n \" After authorizing, the browser will redirect to a localhost URL\",\n );\n console.log(\n \" that won't load. Copy the FULL URL from the browser address bar\",\n );\n console.log(\" and paste it below.\\n\");\n\n const rl = createRl();\n try {\n const input = await ask(rl, \" Paste the redirect URL here: \");\n rl.close();\n\n const code = extractCodeFromUrl(input);\n if (!code) {\n console.error(\"\\n Could not extract authorization code from the URL.\");\n console.error(\" Please try again.\\n\");\n process.exit(1);\n }\n\n console.log(\"\\n Exchanging code for tokens...\");\n const tokens = await exchangeGoogleCode(code, creds);\n await saveGoogleTokens(tokens.accessToken, tokens.refreshToken);\n\n console.log(\" Google account connected successfully!\");\n console.log(\" Tokens saved to ~/.openviber/settings.yaml\\n\");\n } catch (err: any) {\n rl.close();\n console.error(`\\n OAuth failed: ${err.message}\\n`);\n process.exit(1);\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// Connected-mode Google OAuth flow\n// ────────────────────────────────────────────────────────────\n\ninterface SavedConfig {\n webUrl?: string;\n authToken?: string;\n viberId?: string;\n [key: string]: unknown;\n}\n\n/**\n * Load saved config from ~/.openviber/config.yaml.\n */\nasync function loadSavedConfig(): Promise<SavedConfig | null> {\n try {\n const { default: YAML } = await import(\"yaml\");\n const content = await fs.readFile(getConfigFile(), \"utf8\");\n const parsed = YAML.parse(content) as SavedConfig;\n if (parsed && typeof parsed === \"object\") return parsed;\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * Run the connected-mode OAuth flow:\n * open browser to web app's integrations page, poll node config endpoint\n * for OAuth token appearance.\n */\nexport async function runConnectedGoogleOAuth(\n webUrl: string,\n authToken: string,\n viberId: string,\n options: { noBrowser?: boolean },\n): Promise<void> {\n const oauthPageUrl = `${webUrl}/settings/integrations`;\n\n const headless = options.noBrowser || isHeadless();\n\n if (headless) {\n console.log(\"\\n Headless mode detected (SSH / no display).\\n\");\n console.log(\" Open this URL in a browser to connect Google:\\n\");\n console.log(` ${oauthPageUrl}\\n`);\n } else {\n console.log(\"\\n Opening browser to connect Google via web app...\\n\");\n const opened = openBrowser(oauthPageUrl);\n if (!opened) {\n console.log(\" Could not open browser. Visit this URL manually:\\n\");\n console.log(` ${oauthPageUrl}\\n`);\n }\n }\n\n console.log(\" Waiting for Google connection...\");\n console.log(\" (Press Ctrl+C to cancel)\\n\");\n\n // Poll the node config endpoint using Bearer auth (works without session)\n const maxAttempts = 60; // 5 minutes at 5s intervals\n for (let i = 0; i < maxAttempts; i++) {\n await sleep(5000);\n\n try {\n const res = await fetch(`${webUrl}/api/vibers/${viberId}/config`, {\n headers: {\n Authorization: `Bearer ${authToken}`,\n },\n });\n\n if (!res.ok) continue;\n\n const data = (await res.json()) as {\n oauthConnections?: Array<{\n provider: string;\n accessToken?: string;\n }>;\n };\n\n const google = data.oauthConnections?.find(\n (c) => c.provider === \"google\",\n );\n if (google?.accessToken) {\n console.log(\"\\n Google account connected successfully!\");\n console.log(\n \" Tokens are stored encrypted on the web and will be pulled on viber start.\\n\",\n );\n return;\n }\n } catch {\n // Network error, keep polling\n }\n\n // Show progress dots\n process.stdout.write(\".\");\n }\n\n console.log(\n \"\\n\\n Timed out waiting for connection. You can complete it later at:\",\n );\n console.log(` ${oauthPageUrl}\\n`);\n}\n\n// ────────────────────────────────────────────────────────────\n// Token storage helpers\n// ────────────────────────────────────────────────────────────\n\n/**\n * Save Google OAuth tokens to settings.yaml for standalone use.\n */\nasync function saveGoogleTokens(\n accessToken: string,\n refreshToken: string | null,\n): Promise<void> {\n const settings = await loadSettings();\n settings.oauthTokens = {\n ...(settings.oauthTokens || {}),\n google: {\n accessToken,\n ...(refreshToken ? { refreshToken } : {}),\n },\n };\n await saveSettings(settings);\n}\n\n// ────────────────────────────────────────────────────────────\n// Interactive API key setup\n// ────────────────────────────────────────────────────────────\n\n/**\n * Run interactive API key configuration.\n * Prompts the user to select a provider and enter their API key.\n * Saves to ~/.openviber/.env.\n */\nexport async function runApiKeySetup(): Promise<void> {\n const rl = createRl();\n\n try {\n const providers = Object.keys(PROVIDER_ENV_KEYS);\n console.log(\"\\n Available LLM providers:\\n\");\n providers.forEach((p, i) => {\n const currentValue = process.env[PROVIDER_ENV_KEYS[p].envVar];\n const status = currentValue ? \" (configured)\" : \"\";\n console.log(` ${i + 1}. ${p}${status}`);\n });\n\n console.log();\n const choice = await ask(\n rl,\n ` Select provider [1-${providers.length}] or name: `,\n );\n\n // Resolve by number or name\n let providerName: string | undefined;\n const choiceNum = parseInt(choice, 10);\n if (choiceNum >= 1 && choiceNum <= providers.length) {\n providerName = providers[choiceNum - 1];\n } else {\n providerName = providers.find(\n (p) => p.toLowerCase() === choice.toLowerCase(),\n );\n }\n\n if (!providerName) {\n console.error(`\\n Unknown provider: ${choice}\\n`);\n rl.close();\n process.exit(1);\n }\n\n const provider = PROVIDER_ENV_KEYS[providerName];\n console.log(`\\n Get your API key at: ${provider.url}\\n`);\n\n const apiKey = await ask(rl, ` Paste your ${providerName} API key: `);\n rl.close();\n\n if (!apiKey) {\n console.error(\"\\n No key provided. Aborting.\\n\");\n process.exit(1);\n }\n\n // Save to ~/.openviber/.env\n await saveApiKeyToEnv(provider.envVar, apiKey);\n\n // Also set in current process\n process.env[provider.envVar] = apiKey;\n\n console.log(`\\n Saved ${provider.envVar} to ${getEnvFile()}`);\n console.log(\n \" It will be auto-loaded on next 'viber start'.\\n\",\n );\n } catch (err: any) {\n rl.close();\n console.error(`\\n Error: ${err.message}\\n`);\n process.exit(1);\n }\n}\n\n/**\n * Append or update an environment variable in ~/.openviber/.env.\n */\nexport async function saveApiKeyToEnv(\n key: string,\n value: string,\n): Promise<void> {\n const envFile = getEnvFile();\n await fs.mkdir(path.dirname(envFile), { recursive: true });\n\n let existing = \"\";\n try {\n existing = await fs.readFile(envFile, \"utf8\");\n } catch {\n // File doesn't exist yet\n }\n\n // Parse existing entries\n const lines = existing.split(\"\\n\");\n let found = false;\n const updated = lines.map((line) => {\n const trimmed = line.trim();\n if (trimmed.startsWith(`${key}=`) || trimmed.startsWith(`${key} =`)) {\n found = true;\n return `${key}=${value}`;\n }\n return line;\n });\n\n if (!found) {\n // Append to end\n if (existing.length > 0 && !existing.endsWith(\"\\n\")) {\n updated.push(\"\");\n }\n updated.push(`${key}=${value}`);\n }\n\n await fs.writeFile(envFile, updated.join(\"\\n\"), \"utf8\");\n}\n\n// ────────────────────────────────────────────────────────────\n// Auth status\n// ────────────────────────────────────────────────────────────\n\n/**\n * Display current auth status: API keys and OAuth connections.\n */\nexport async function showAuthStatus(): Promise<void> {\n console.log(\"\\n API Keys:\\n\");\n\n for (const [name, info] of Object.entries(PROVIDER_ENV_KEYS)) {\n const value = process.env[info.envVar];\n if (value) {\n const masked = value.slice(0, 8) + \"...\" + value.slice(-4);\n console.log(` ${name}: ${masked} (${info.envVar})`);\n } else {\n console.log(` ${name}: not set (${info.envVar})`);\n }\n }\n\n console.log(\"\\n OAuth Connections:\\n\");\n\n const settings = await loadSettings();\n const oauthTokens = settings.oauthTokens || {};\n\n if (Object.keys(oauthTokens).length === 0) {\n console.log(\" No local OAuth connections.\\n\");\n } else {\n for (const [provider, tokens] of Object.entries(oauthTokens)) {\n const hasRefresh = !!tokens.refreshToken;\n const masked =\n tokens.accessToken.slice(0, 8) + \"...\" + tokens.accessToken.slice(-4);\n console.log(\n ` ${provider}: connected (access: ${masked}, refresh: ${hasRefresh ? \"yes\" : \"no\"})`,\n );\n }\n console.log();\n }\n\n // Also check connected mode\n const savedConfig = await loadSavedConfig();\n if (savedConfig?.webUrl) {\n console.log(` Web app: ${savedConfig.webUrl}`);\n console.log(\n \" (OAuth connections in the web app are pulled automatically on viber start)\\n\",\n );\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// Revoke OAuth\n// ────────────────────────────────────────────────────────────\n\n/**\n * Revoke a local OAuth connection.\n */\nexport async function revokeOAuthProvider(provider: string): Promise<void> {\n const settings = await loadSettings();\n\n if (!settings.oauthTokens?.[provider]) {\n console.error(`\\n No local OAuth connection found for: ${provider}\\n`);\n process.exit(1);\n }\n\n delete settings.oauthTokens[provider];\n await saveSettings(settings);\n\n console.log(`\\n Disconnected ${provider} OAuth tokens from local settings.`);\n console.log(\" Note: this does not revoke the token with the provider.\\n\");\n}\n\n// ────────────────────────────────────────────────────────────\n// Top-level command router\n// ────────────────────────────────────────────────────────────\n\n/**\n * Run the Google OAuth flow, choosing connected or standalone mode\n * based on saved config.\n */\nexport async function runGoogleAuth(options: {\n noBrowser?: boolean;\n}): Promise<void> {\n const savedConfig = await loadSavedConfig();\n\n if (savedConfig?.webUrl && savedConfig?.authToken && savedConfig?.viberId) {\n // Connected mode — delegate to web app\n console.log(\"[Auth] Connected mode — using web app for Google OAuth\");\n await runConnectedGoogleOAuth(\n savedConfig.webUrl,\n savedConfig.authToken,\n savedConfig.viberId,\n options,\n );\n } else {\n // Standalone mode — local OAuth flow\n console.log(\"[Auth] Standalone mode — local Google OAuth flow\");\n await runStandaloneGoogleOAuth(options);\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// .env auto-loader\n// ────────────────────────────────────────────────────────────\n\n/**\n * Load environment variables from ~/.openviber/.env if it exists.\n * Does NOT override variables already set in the current process.\n */\nexport async function loadOpenViberEnv(): Promise<void> {\n try {\n const content = await fs.readFile(getEnvFile(), \"utf8\");\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx < 0) continue;\n\n const key = trimmed.slice(0, eqIdx).trim();\n const value = trimmed.slice(eqIdx + 1).trim();\n\n // Do not override existing env vars\n if (key && value && !process.env[key]) {\n process.env[key] = value;\n }\n }\n } catch {\n // File doesn't exist — that's fine\n }\n}\n\n// ────────────────────────────────────────────────────────────\n// Prompt helpers\n// ────────────────────────────────────────────────────────────\n\n/**\n * Prompt user for a yes/no answer. Defaults to `defaultValue` on empty input.\n */\nexport function promptYesNo(\n rl: readline.Interface,\n question: string,\n defaultValue = true,\n): Promise<boolean> {\n const suffix = defaultValue ? \"[Y/n]\" : \"[y/N]\";\n return new Promise((resolve) => {\n rl.question(`${question} ${suffix} `, (answer) => {\n const a = answer.trim().toLowerCase();\n if (a === \"\") resolve(defaultValue);\n else resolve(a === \"y\" || a === \"yes\");\n });\n });\n}\n\n/**\n * Prompt user to retry (after external action) or skip.\n * Returns `true` to retry, `false` to skip.\n */\nexport function promptRetryOrSkip(\n rl: readline.Interface,\n instruction: string,\n): Promise<boolean> {\n return new Promise((resolve) => {\n console.log(`\\n ${instruction}`);\n rl.question(\" Press Enter to retry, or s to skip: \", (answer) => {\n resolve(answer.trim().toLowerCase() !== \"s\");\n });\n });\n}\n\n// ────────────────────────────────────────────────────────────\n// LLM API key detection & prompt\n// ────────────────────────────────────────────────────────────\n\n/**\n * Check whether any LLM provider API key is configured.\n */\nexport function hasAnyLlmKey(): boolean {\n return Object.values(PROVIDER_ENV_KEYS).some(\n (info) => !!process.env[info.envVar]?.trim(),\n );\n}\n\n/**\n * Prompt the user to set up an LLM API key if none is configured.\n * This is the first step of the onboarding wizard.\n */\nexport async function runLlmKeyPrompt(): Promise<void> {\n if (hasAnyLlmKey()) {\n const configured = Object.entries(PROVIDER_ENV_KEYS)\n .filter(([, info]) => !!process.env[info.envVar]?.trim())\n .map(([name]) => name);\n console.log(`\\n LLM API key: ${configured.join(\", \")} configured`);\n return;\n }\n\n console.log(\"\\n No LLM API key detected. OpenViber needs one to power its AI.\\n\");\n\n const rl = createRl();\n const providers = Object.keys(PROVIDER_ENV_KEYS);\n\n providers.forEach((p, i) => {\n const rec = p === \"openrouter\" ? \" (recommended)\" : \"\";\n console.log(` ${i + 1}. ${p}${rec}`);\n });\n console.log();\n\n const choice = await ask(\n rl,\n ` Select provider [1-${providers.length}] or Enter to skip: `,\n );\n\n if (!choice) {\n rl.close();\n console.log(\n \" Skipped. You can set it later with: viber auth apikey\\n\",\n );\n return;\n }\n\n let providerName: string | undefined;\n const choiceNum = parseInt(choice, 10);\n if (choiceNum >= 1 && choiceNum <= providers.length) {\n providerName = providers[choiceNum - 1];\n } else {\n providerName = providers.find(\n (p) => p.toLowerCase() === choice.toLowerCase(),\n );\n }\n\n if (!providerName) {\n rl.close();\n console.log(` Unknown provider: ${choice}. Skipping.\\n`);\n return;\n }\n\n const provider = PROVIDER_ENV_KEYS[providerName];\n console.log(`\\n Get your API key at: ${provider.url}\\n`);\n\n const apiKey = await ask(rl, ` Paste your ${providerName} API key: `);\n rl.close();\n\n if (!apiKey) {\n console.log(\" No key provided. Skipping.\\n\");\n return;\n }\n\n await saveApiKeyToEnv(provider.envVar, apiKey);\n process.env[provider.envVar] = apiKey;\n console.log(`\\n Saved ${provider.envVar} to ${getEnvFile()}\\n`);\n}\n\n// ────────────────────────────────────────────────────────────\n// Skill picker\n// ────────────────────────────────────────────────────────────\n\n/** Status label for display in the skill picker. */\nexport function getSkillStatusLabel(\n result: import(\"../skills/health\").SkillHealthResult,\n): { label: string; detail: string } {\n if (result.status === \"AVAILABLE\") {\n return { label: \"READY\", detail: \"\" };\n }\n if (result.status === \"UNKNOWN\") {\n return { label: \"UNKNOWN\", detail: \"\" };\n }\n\n // Categorize the failure\n const failed = result.checks.filter(\n (c) => (c.required ?? true) && !c.ok,\n );\n const hasOAuth = failed.some((c) => c.actionType === \"oauth\");\n const hasBinary = failed.some((c) => c.actionType === \"binary\");\n\n if (hasOAuth && !hasBinary) {\n const oauthCheck = failed.find((c) => c.actionType === \"oauth\");\n return {\n label: \"NEEDS SETUP\",\n detail: oauthCheck?.label || \"OAuth required\",\n };\n }\n\n // Show the first failing check as detail\n const firstFail = failed[0];\n return {\n label: \"MISSING\",\n detail: firstFail?.label || result.summary,\n };\n}\n\n/**\n * Interactive skill picker.\n *\n * Displays all skills with live health status, lets the user toggle selection\n * with numbers, refresh with `r`, and confirm with Enter.\n *\n * Returns the IDs of the selected skills.\n */\nexport async function runSkillPicker(\n report: import(\"../skills/health\").SkillHealthReport,\n refreshFn: () => Promise<import(\"../skills/health\").SkillHealthReport>,\n): Promise<{ selectedIds: string[]; report: import(\"../skills/health\").SkillHealthReport }> {\n let currentReport = report;\n // Pre-select skills that are AVAILABLE\n const selected = new Set<string>(\n currentReport.skills\n .filter((s) => s.status === \"AVAILABLE\")\n .map((s) => s.id),\n );\n\n const rl = createRl();\n\n const printList = () => {\n console.log(\n \"\\n Select skills to enable (toggle with number, r=refresh, Enter=confirm):\\n\",\n );\n currentReport.skills.forEach((skill, i) => {\n const check = selected.has(skill.id) ? \"x\" : \" \";\n const num = String(i + 1).padStart(2);\n const name = (skill.name || skill.id).padEnd(18);\n const { label, detail } = getSkillStatusLabel(skill);\n const detailStr = detail ? ` (${detail})` : \"\";\n console.log(` [${check}] ${num}. ${name} ${label}${detailStr}`);\n });\n console.log();\n };\n\n printList();\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const input = await ask(rl, \" > \");\n\n if (input === \"\") {\n // Confirm\n break;\n }\n\n if (input.toLowerCase() === \"r\") {\n console.log(\" Refreshing...\");\n currentReport = await refreshFn();\n printList();\n continue;\n }\n\n const num = parseInt(input, 10);\n if (num >= 1 && num <= currentReport.skills.length) {\n const skillId = currentReport.skills[num - 1].id;\n if (selected.has(skillId)) {\n selected.delete(skillId);\n } else {\n selected.add(skillId);\n }\n printList();\n continue;\n }\n\n console.log(\n ` Invalid input. Enter 1-${currentReport.skills.length}, r, or Enter.`,\n );\n }\n\n rl.close();\n return {\n selectedIds: Array.from(selected),\n report: currentReport,\n };\n}\n\n// ────────────────────────────────────────────────────────────\n// Skill setup walker\n// ────────────────────────────────────────────────────────────\n\n/**\n * Walk selected skills that have unmet requirements and interactively\n * resolve them (prompt for keys, run OAuth, show install commands with retry).\n */\nexport async function runSkillSetup(\n selectedIds: string[],\n report: import(\"../skills/health\").SkillHealthReport,\n): Promise<void> {\n const selectedWithIssues = report.skills.filter(\n (s) => selectedIds.includes(s.id) && s.status !== \"AVAILABLE\",\n );\n\n if (selectedWithIssues.length === 0) {\n console.log(\"\\n All selected skills are ready!\\n\");\n return;\n }\n\n console.log(`\\n Setting up ${selectedWithIssues.length} skill(s)...\\n`);\n\n const rl = createRl();\n const recheckCheck = async (\n skillInfo: { id: string; name?: string },\n checkId: string,\n ): Promise<boolean> => {\n const { checkSkillHealth } = await import(\"../skills/health\");\n const recheck = await checkSkillHealth({\n id: skillInfo.id,\n name: skillInfo.name,\n });\n const recheckItem = recheck.checks.find((c) => c.id === checkId);\n return Boolean(recheckItem?.ok);\n };\n\n for (const skill of selectedWithIssues) {\n const failedChecks = skill.checks.filter(\n (c) => (c.required ?? true) && !c.ok,\n );\n\n if (failedChecks.length === 0) continue;\n\n console.log(` ── ${skill.name || skill.id} ──`);\n\n for (const check of failedChecks) {\n switch (check.actionType) {\n case \"oauth\": {\n console.log(` ${check.label}`);\n const wantOAuth = await promptYesNo(\n rl,\n \" Connect now?\",\n true,\n );\n if (wantOAuth) {\n rl.close();\n // Run the Google OAuth flow (reuses existing auth module)\n await runGoogleAuth({ noBrowser: isHeadless() });\n // Re-create rl since runGoogleAuth may have used stdin\n const newRl = createRl();\n Object.assign(rl, newRl);\n } else {\n console.log(\n \" Skipped. Run `viber auth google` later.\\n\",\n );\n }\n break;\n }\n\n case \"env\": {\n console.log(` ${check.label}: ${check.message || \"not set\"}`);\n // Try to extract the env var name from the check\n const envVarMatch = check.message?.match(\n /^(\\w+)\\s+(not set|or)/,\n );\n const envVarName = envVarMatch?.[1];\n if (envVarName) {\n const value = await ask(\n rl,\n ` Paste ${envVarName} (or Enter to skip): `,\n );\n if (value) {\n await saveApiKeyToEnv(envVarName, value);\n process.env[envVarName] = value;\n console.log(` Saved to ${getEnvFile()}\\n`);\n } else {\n console.log(\" Skipped.\\n\");\n }\n } else {\n console.log(` ${check.hint || \"Set the required env var.\"}\\n`);\n }\n break;\n }\n\n case \"binary\": {\n console.log(\n ` ${check.label}: ${check.message || \"not found\"}`,\n );\n const autoInstallCommand = getAutoInstallCommand(skill.id, check.id);\n if (autoInstallCommand) {\n const installNow = await promptYesNo(\n rl,\n \" Should I install this for you now?\",\n true,\n );\n if (installNow) {\n console.log(`\\n Running: ${autoInstallCommand}\\n`);\n const installed = await runInteractiveShellCommand(autoInstallCommand);\n if (!installed) {\n console.log(\n \" Install command failed. You can retry manually.\\n\",\n );\n } else {\n const ok = await recheckCheck(skill, check.id);\n if (ok) {\n console.log(` ${check.label}: OK\\n`);\n break;\n }\n }\n }\n }\n\n if (check.hint) {\n const shouldRetry = await promptRetryOrSkip(\n rl,\n check.hint,\n );\n if (shouldRetry) {\n const ok = await recheckCheck(skill, check.id);\n if (ok) {\n console.log(` ${check.label}: OK\\n`);\n } else {\n console.log(\n ` Still not found. You can install it later.\\n`,\n );\n }\n }\n } else {\n console.log(\" Skipped (no install instructions).\\n\");\n }\n break;\n }\n\n case \"auth_cli\": {\n console.log(\n ` ${check.label}: ${check.message || \"not authenticated\"}`,\n );\n const authCommand = getAuthCommand(skill.id, check.id);\n const authEnvVar = getAuthEnvVar(skill.id, check.id);\n const setupNow = await promptYesNo(\n rl,\n \" Should I set up auth for you now?\",\n true,\n );\n if (setupNow) {\n const mode = (\n await ask(\n rl,\n \" Press Enter to start login, type 'copy' to show command, 'token' to paste key, or 's' to skip: \",\n )\n )\n .trim()\n .toLowerCase();\n\n if (mode === \"copy\") {\n if (authCommand) {\n console.log(\"\\n Run this command in your terminal:\");\n console.log(` ${authCommand}\\n`);\n } else if (check.hint) {\n console.log(`\\n ${check.hint}\\n`);\n }\n } else if (mode === \"token\") {\n if (authEnvVar) {\n const tokenValue = await ask(\n rl,\n ` Paste ${authEnvVar} (or Enter to skip): `,\n );\n if (tokenValue) {\n await saveApiKeyToEnv(authEnvVar, tokenValue);\n process.env[authEnvVar] = tokenValue;\n console.log(` Saved ${authEnvVar} to ${getEnvFile()}\\n`);\n }\n } else {\n console.log(\" No API key fallback for this skill.\\n\");\n }\n } else if (mode !== \"s\" && mode !== \"skip\") {\n if (authCommand) {\n console.log(\n \"\\n Starting login flow. Follow prompts in terminal/browser...\\n\",\n );\n await runInteractiveShellCommand(authCommand);\n } else if (check.hint) {\n console.log(`\\n ${check.hint}\\n`);\n }\n }\n\n const ok = await recheckCheck(skill, check.id);\n if (ok) {\n console.log(` ${check.label}: OK\\n`);\n break;\n }\n }\n\n if (check.hint) {\n const shouldRetry = await promptRetryOrSkip(\n rl,\n check.hint,\n );\n if (shouldRetry) {\n const ok = await recheckCheck(skill, check.id);\n if (ok) {\n console.log(` ${check.label}: OK\\n`);\n } else {\n console.log(\n ` Still not authenticated. You can set it up later.\\n`,\n );\n }\n }\n } else {\n console.log(\" Skipped.\\n\");\n }\n break;\n }\n\n case \"manual\":\n default: {\n console.log(` ${check.label}: ${check.hint || check.message || \"manual setup required\"}`);\n console.log();\n break;\n }\n }\n }\n }\n\n rl.close();\n}\n\n// ────────────────────────────────────────────────────────────\n// Onboarding wizard orchestrator\n// ────────────────────────────────────────────────────────────\n\n/**\n * Run the full interactive onboarding wizard:\n * Step 1: LLM API key prompt\n * Step 2: Skill picker with live health status\n * Step 3: Setup selected skills with unmet requirements\n * Step 4: Final health report\n *\n * Returns the list of selected skill IDs (to be saved by the caller).\n */\nexport async function runOnboardingWizard(): Promise<string[]> {\n // Step 1: LLM API key\n await runLlmKeyPrompt();\n\n // Step 2: Skill picker\n const { getSkillHealthReport } = await import(\"../skills/health\");\n const initialReport = await getSkillHealthReport();\n\n const { selectedIds, report: latestReport } = await runSkillPicker(\n initialReport,\n getSkillHealthReport,\n );\n\n if (selectedIds.length === 0) {\n console.log(\" No skills selected.\\n\");\n return [];\n }\n\n console.log(\n ` Selected ${selectedIds.length} skill(s): ${selectedIds.join(\", \")}`,\n );\n\n // Step 3: Setup skills that need it\n await runSkillSetup(selectedIds, latestReport);\n\n // Step 4: Final health report\n console.log(\" Running final health check...\");\n const finalReport = await getSkillHealthReport();\n const selectedFinal = finalReport.skills.filter((s) =>\n selectedIds.includes(s.id),\n );\n const ready = selectedFinal.filter((s) => s.status === \"AVAILABLE\").length;\n const total = selectedFinal.length;\n\n console.log(`\\n ${ready}/${total} selected skills ready.\\n`);\n\n return selectedIds;\n}\n\n/**\n * Ensure selected skills are ready right now.\n * Used by chat-first flows (e.g. `openviber start --skills cursor-agent`).\n */\nexport async function ensureSkillsReady(selectedIds: string[]): Promise<void> {\n const uniqueIds = Array.from(new Set(selectedIds.filter(Boolean)));\n if (uniqueIds.length === 0) return;\n\n const { checkSkillsHealth } = await import(\"../skills/health\");\n const report = await checkSkillsHealth(\n uniqueIds.map((id) => ({ id, name: id })),\n );\n await runSkillSetup(uniqueIds, report);\n}\n\n// ────────────────────────────────────────────────────────────\n// Utility\n// ────────────────────────────────────────────────────────────\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Message types for Viber - Using AI SDK v6 types directly\n */\n\nimport type { ModelMessage } from 'ai';\n\n// Extend CoreMessage to include our metadata\nexport interface ViberMessage {\n role: 'system' | 'user' | 'assistant' | 'function' | 'data' | 'tool';\n content: any;\n id?: string; // Message ID (includes agent prefix for tracking)\n metadata?: {\n agentName?: string;\n timestamp?: number;\n [key: string]: any;\n };\n}\n\n// Use ViberMessage as our Message type\nexport type Message = ViberMessage;\n\n/**\n * Get text content from a message\n */\nexport function getTextContent(message: Message): string {\n if (!message || !message.content) {\n return '';\n }\n\n if (typeof message.content === 'string') {\n return message.content;\n }\n\n if (Array.isArray(message.content)) {\n return message.content\n .filter((part: any) => part && part.type === 'text')\n .map((part: any) => part.text || '')\n .join(' ');\n }\n\n return '';\n}\n\n/**\n * Queued message with metadata\n */\nexport interface QueuedMessage {\n id: string;\n content: string;\n status: 'queued' | 'processing' | 'completed' | 'error';\n timestamp: number;\n edited?: boolean;\n error?: string;\n metadata?: any;\n}\n\n/**\n * Queue state for UI\n */\nexport interface QueueState {\n current?: QueuedMessage;\n queue: QueuedMessage[];\n processing: boolean;\n}\n\n/**\n * Queue listener type\n */\nexport type QueueListener = (state: QueueState) => void;\n\n/**\n * Enhanced Message Queue with management capabilities\n */\nexport class MessageQueue {\n private queue: QueuedMessage[] = [];\n private current?: QueuedMessage;\n private processing = false;\n private listeners = new Set<QueueListener>();\n private nextId = 1;\n\n /**\n * Add message to queue\n */\n add(content: string, metadata?: any): string {\n const message: QueuedMessage = {\n id: `msg-${this.nextId++}`,\n content,\n status: 'queued',\n timestamp: Date.now(),\n metadata,\n };\n\n this.queue.push(message);\n this.notify();\n return message.id;\n }\n\n /**\n * Get next message from queue\n */\n next(): QueuedMessage | undefined {\n const message = this.queue.shift();\n if (message) {\n message.status = 'processing';\n this.current = message;\n this.processing = true;\n this.notify();\n }\n return message;\n }\n\n /**\n * Mark current message as complete\n */\n complete(messageId: string) {\n if (this.current?.id === messageId) {\n this.current.status = 'completed';\n this.current = undefined;\n this.processing = false;\n this.notify();\n }\n }\n\n /**\n * Mark current message as error\n */\n error(messageId: string, error: string) {\n if (this.current?.id === messageId) {\n this.current.status = 'error';\n this.current.error = error;\n this.current = undefined;\n this.processing = false;\n this.notify();\n }\n }\n\n /**\n * Remove message from queue\n */\n remove(messageId: string): boolean {\n const index = this.queue.findIndex(m => m.id === messageId);\n if (index > -1) {\n this.queue.splice(index, 1);\n this.notify();\n return true;\n }\n return false;\n }\n\n /**\n * Reorder queue\n */\n reorder(messageId: string, newIndex: number) {\n const currentIndex = this.queue.findIndex(m => m.id === messageId);\n if (currentIndex > -1 && newIndex >= 0 && newIndex < this.queue.length) {\n const [message] = this.queue.splice(currentIndex, 1);\n this.queue.splice(newIndex, 0, message);\n this.notify();\n }\n }\n\n /**\n * Edit queued message\n */\n edit(messageId: string, content: string) {\n const message = this.queue.find(m => m.id === messageId);\n if (message && message.status === 'queued') {\n message.content = content;\n message.edited = true;\n this.notify();\n }\n }\n\n /**\n * Clear all queued messages\n */\n clear() {\n this.queue = [];\n this.notify();\n }\n\n /**\n * Get queue state\n */\n getState(): QueueState {\n return {\n current: this.current,\n queue: [...this.queue],\n processing: this.processing,\n };\n }\n\n /**\n * Subscribe to queue changes\n */\n subscribe(listener: QueueListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /**\n * Check if queue is empty\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * Check if processing\n */\n isProcessing(): boolean {\n return this.processing;\n }\n\n /**\n * Notify listeners\n */\n private notify() {\n const state = this.getState();\n this.listeners.forEach(listener => listener(state));\n }\n}\n\n/**\n * Conversation History management\n */\nexport class ConversationHistory {\n public messages: Message[] = [];\n\n add(message: Message): void {\n // Ensure message has an ID\n if (!message.id) {\n const agentName = message.metadata?.agentName || 'unknown';\n const prefix = agentName.toLowerCase().replace(/\\s+/g, '-');\n const randomId = Math.random().toString(36).substring(2, 10);\n message.id = `${prefix}_${randomId}`;\n }\n this.messages.push(message);\n }\n\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n getLastN(n: number): Message[] {\n return this.messages.slice(-n);\n }\n\n clear(): void {\n this.messages = [];\n }\n\n toModelMessages(): ModelMessage[] {\n // Convert to AI SDK format, cleaning content appropriately\n return this.messages\n .map(msg => {\n // Skip tool messages - they can't be passed without their parent tool_calls\n if (msg.role === 'tool') {\n return null;\n }\n\n // Clean content to be AI SDK compatible\n let cleanContent: any = msg.content;\n\n // If content is an array, extract only text parts\n if (Array.isArray(msg.content)) {\n const textParts = msg.content.filter((part: any) => part.type === 'text');\n if (textParts.length > 0) {\n // Join all text parts into a single string\n cleanContent = textParts\n .map((part: any) => part.text || '')\n .filter((text: string) => text)\n .join('\\n');\n } else {\n // No text content, skip this message\n return null;\n }\n }\n\n // Skip messages with no content\n if (!cleanContent) {\n return null;\n }\n\n return {\n role: msg.role,\n content: cleanContent,\n };\n })\n .filter(msg => msg !== null) as ModelMessage[];\n }\n}","/**\n * AI Provider Management\n * Handles initialization and configuration of different AI providers\n *\n * Philosophy: Keep it simple - agents specify their provider and model explicitly.\n *\n * To add a new provider (e.g., Google, Mistral, Cohere):\n * 1. Install: `pnpm add @ai-sdk/google`\n * 2. Import: `import { createGoogleGenerativeAI } from \"@ai-sdk/google\";`\n * 3. Add case: `case \"google\": return createGoogleGenerativeAI({...})`\n * 4. Add environment variable handling\n */\n\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { deepseek } from \"@ai-sdk/deepseek\";\nimport { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\n\nexport type ModelProvider = string; // Allow any provider string for extensibility\n\nexport interface ModelConfig {\n provider: ModelProvider;\n modelName: string;\n apiKey?: string;\n baseURL?: string;\n /** Optional proxy-aware fetch to route API calls through an HTTP proxy */\n proxyFetch?: typeof fetch;\n // Viber-specific options\n spaceId?: string;\n userId?: string; // For usage tracking (e.g., Helicone)\n storageRoot?: string;\n teamConfig?: string;\n defaultGoal?: string;\n}\n\n/**\n * Get the appropriate AI provider instance\n */\nexport function getModelProvider(config: ModelConfig) {\n const {\n provider,\n apiKey,\n baseURL,\n spaceId,\n userId,\n storageRoot,\n teamConfig,\n defaultGoal,\n } = config;\n\n switch (provider) {\n case \"anthropic\":\n return createAnthropic({\n apiKey: apiKey || process.env.ANTHROPIC_API_KEY,\n baseURL: baseURL || process.env.ANTHROPIC_BASE_URL,\n fetch: config.proxyFetch,\n });\n\n case \"openai\":\n return createOpenAI({\n apiKey: apiKey || process.env.OPENAI_API_KEY,\n baseURL: baseURL || process.env.OPENAI_BASE_URL,\n fetch: config.proxyFetch,\n });\n\n case \"deepseek\":\n return deepseek;\n\n case \"openrouter\":\n // Use the official OpenRouter SDK (v2.0.2+ for AI SDK 6 compatibility)\n const openrouterConfig: any = {\n apiKey: apiKey || process.env.OPENROUTER_API_KEY,\n fetch: config.proxyFetch,\n };\n\n // Use Helicone gateway for observability if configured\n if (process.env.HELICONE_API_KEY) {\n openrouterConfig.baseURL =\n baseURL || \"https://openrouter.helicone.ai/api/v1\";\n openrouterConfig.headers = {\n \"Helicone-Auth\": `Bearer ${process.env.HELICONE_API_KEY}`,\n \"Helicone-Property-User\": userId || \"anonymous\",\n \"Helicone-Property-Space\": spaceId || \"default\",\n };\n }\n\n return createOpenRouter(openrouterConfig);\n\n default:\n // For other providers, assume they follow the standard pattern\n // This allows users to add support for Google, Mistral, Cohere, etc.\n // by providing the appropriate imports and configuration\n throw new Error(\n `Provider '${provider}' is not configured. ` +\n `To use ${provider}, add the appropriate AI SDK provider import and configuration to core/provider.ts`,\n );\n }\n}\n\n/**\n * Check if a provider is properly configured\n */\nexport function isProviderConfigured(provider: string): boolean {\n switch (provider) {\n case \"anthropic\":\n return !!process.env.ANTHROPIC_API_KEY;\n case \"openai\":\n return !!process.env.OPENAI_API_KEY;\n case \"deepseek\":\n return !!process.env.DEEPSEEK_API_KEY;\n case \"openrouter\":\n return !!process.env.OPENROUTER_API_KEY;\n case \"google\":\n // Google provider needs to be imported and configured\n return false; // Not yet implemented\n case \"mistral\":\n return false; // Not yet implemented\n case \"cohere\":\n return false; // Not yet implemented\n default:\n return false;\n }\n}\n\n/**\n * Get list of configured providers\n */\nexport function getConfiguredProviders(): string[] {\n const providers = [\n \"anthropic\",\n \"openai\",\n \"deepseek\",\n \"openrouter\",\n \"google\",\n \"mistral\",\n \"cohere\",\n ];\n return providers.filter(isProviderConfigured);\n}\n\n/**\n * Parse model string to extract provider and model name\n * Examples: \"gpt-4o\" -> { provider: \"openai\", modelName: \"gpt-4o\" }\n */\nexport function parseModelString(model: string): ModelConfig {\n // Viber models are handled differently - not through this parser\n // if (model.startsWith(\"viber-\") || model === \"viber\") {\n // return { provider: \"viber\", modelName: model };\n // }\n\n // Anthropic models (direct access)\n if (model.startsWith(\"claude-\")) {\n return { provider: \"anthropic\", modelName: model };\n }\n\n // Deepseek models (direct access)\n if (model.startsWith(\"deepseek-\")) {\n return { provider: \"deepseek\", modelName: model };\n }\n\n // Models with \"/\" are OpenRouter format (e.g., \"deepseek/deepseek-chat\", \"openai/gpt-4o-mini\")\n // OpenRouter API expects upstream provider/model only — never prefix with \"openrouter/\"\n if (model.includes(\"/\")) {\n const modelName = model.startsWith(\"openrouter/\")\n ? model.slice(\"openrouter/\".length)\n : model;\n return { provider: \"openrouter\", modelName };\n }\n\n // Simple model names default to OpenAI (e.g., \"gpt-4o\", \"gpt-4o-mini\")\n return { provider: \"openai\", modelName: model };\n}\n\n/**\n * Get context limit for a model\n */\nexport function getModelContextLimit(modelName: string): number {\n const contextLimits: Record<string, number> = {\n // Viber (uses underlying model limits dynamically)\n viber: 100000,\n \"viber-default\": 100000,\n\n // Deepseek\n \"deepseek-chat\": 65536,\n \"deepseek-reasoner\": 65536,\n\n // OpenRouter models\n \"anthropic/claude-3.5-sonnet\": 150000,\n \"anthropic/claude-3.5-haiku\": 150000,\n \"openai/gpt-4o\": 100000,\n \"openai/o1-preview\": 100000,\n \"google/gemini-2.0-flash-exp:free\": 100000,\n \"meta-llama/llama-3.3-70b-instruct\": 32000,\n\n // Anthropic\n \"claude-3-5-sonnet-20240620\": 150000,\n \"claude-3-haiku-20240307\": 150000,\n \"claude-3-opus-20240229\": 150000,\n\n // OpenAI\n \"gpt-4o\": 100000,\n \"gpt-4o-mini\": 100000,\n \"gpt-4-turbo\": 100000,\n \"gpt-3.5-turbo\": 16000,\n };\n\n return contextLimits[modelName] || 50000; // Default to 50k\n}\n\n/**\n * Get completion token reservation for a model\n */\nexport function getCompletionTokens(modelName: string): number {\n if (modelName.startsWith(\"deepseek-reasoner\")) {\n return 32000; // Deepseek reasoner needs more tokens\n }\n if (modelName.startsWith(\"deepseek-\")) {\n return 8000;\n }\n return 4000; // Default for most models\n}\n","/**\n * Provider-Model Preflight Validation\n *\n * Validates that a provider + model combination will work before\n * making expensive API calls. Fails fast with clear, actionable errors.\n *\n * @module worker/preflight\n */\n\nimport { isProviderConfigured, parseModelString } from \"./provider\";\n\n/** Known provider → API key env var mapping */\nconst PROVIDER_KEY_ENV: Record<string, string> = {\n anthropic: \"ANTHROPIC_API_KEY\",\n openai: \"OPENAI_API_KEY\",\n deepseek: \"DEEPSEEK_API_KEY\",\n openrouter: \"OPENROUTER_API_KEY\",\n google: \"GOOGLE_GENERATIVE_AI_API_KEY\",\n};\n\n/** Known provider → models-list endpoint for lightweight validation */\nconst PROVIDER_MODELS_URL: Record<string, string> = {\n openai: \"https://api.openai.com/v1/models\",\n openrouter: \"https://openrouter.ai/api/v1/models\",\n};\n\nexport interface PreflightResult {\n ok: boolean;\n provider: string;\n model: string;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Run preflight validation on a provider + model.\n *\n * Checks run in order of cost:\n * 1. Is the provider known/supported?\n * 2. Is the API key present in env?\n * 3. (Optional) Does the model ID exist at the provider?\n *\n * @param provider — e.g. \"openrouter\", \"anthropic\", \"openai\"\n * @param model — e.g. \"deepseek/deepseek-chat\", \"claude-3.5-sonnet\"\n * @param apiKey — explicit API key (overrides env var)\n * @param options — `skipModelCheck` to skip the network call\n */\nexport async function preflightValidate(\n provider: string,\n model: string,\n apiKey?: string,\n options?: { skipModelCheck?: boolean },\n): Promise<PreflightResult> {\n const result: PreflightResult = {\n ok: true,\n provider,\n model,\n errors: [],\n warnings: [],\n };\n\n // ─── 1. Check provider is configured ──────────────────────────────\n const envVar = PROVIDER_KEY_ENV[provider];\n const resolvedKey = apiKey || (envVar ? process.env[envVar] : undefined);\n\n if (!resolvedKey && provider !== \"deepseek\") {\n // DeepSeek uses the deepseek SDK which handles its own auth\n const envHint = envVar ? ` Set ${envVar} in your environment or config.` : \"\";\n result.ok = false;\n result.errors.push(\n `No API key found for provider \"${provider}\".${envHint}`,\n );\n return result; // Can't do further checks without a key\n }\n\n if (!isProviderConfigured(provider) && !apiKey) {\n // Provider check also failed — surface a warning even if key exists\n result.warnings.push(\n `Provider \"${provider}\" may not be fully configured.`,\n );\n }\n\n // ─── 2. Validate model string format ──────────────────────────────\n if (!model || model.trim() === \"\") {\n result.ok = false;\n result.errors.push(\"Model name is empty. Specify a model in your viber config.\");\n return result;\n }\n\n // ─── 3. Optional: Validate model exists at provider ───────────────\n if (!options?.skipModelCheck && resolvedKey) {\n const modelsUrl = PROVIDER_MODELS_URL[provider];\n if (modelsUrl) {\n try {\n const response = await fetch(modelsUrl, {\n headers: { Authorization: `Bearer ${resolvedKey}` },\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) {\n if (response.status === 401 || response.status === 403) {\n result.ok = false;\n result.errors.push(\n `API key for \"${provider}\" is invalid or expired (${response.status}). ` +\n `Check your ${envVar || \"API key\"} configuration.`,\n );\n } else {\n result.warnings.push(\n `Could not verify model availability (HTTP ${response.status}). ` +\n `Proceeding anyway — the model may still work.`,\n );\n }\n } else {\n // Check if model ID is in the response\n const data = await response.json();\n const models: string[] = extractModelIds(data);\n if (models.length > 0 && !models.includes(model)) {\n // For OpenRouter, model IDs are like \"deepseek/deepseek-chat\"\n // Don't hard-fail — the list may be paginated or filtered\n result.warnings.push(\n `Model \"${model}\" was not found in ${provider}'s model list. ` +\n `It may still work if it's a recently added or aliased model.`,\n );\n }\n }\n } catch (error: any) {\n if (error?.name === \"TimeoutError\" || error?.message?.includes(\"timeout\")) {\n result.warnings.push(\n `Model validation timed out for ${provider}. Proceeding without verification.`,\n );\n } else {\n result.warnings.push(\n `Could not verify model: ${error?.message || String(error)}. Proceeding anyway.`,\n );\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Extract model IDs from a provider's models-list response.\n * Handles both OpenAI-style and OpenRouter-style responses.\n */\nfunction extractModelIds(data: any): string[] {\n // OpenAI format: { data: [{ id: \"gpt-4o\" }, ...] }\n // OpenRouter format: { data: [{ id: \"openai/gpt-4o\" }, ...] }\n if (data?.data && Array.isArray(data.data)) {\n return data.data\n .filter((m: any) => m?.id)\n .map((m: any) => m.id as string);\n }\n return [];\n}\n\n/**\n * Format preflight errors into a single actionable error message.\n */\nexport function formatPreflightError(result: PreflightResult): string {\n const lines: string[] = [];\n lines.push(`⚠️ Provider/model preflight failed for ${result.provider}/${result.model}:`);\n for (const err of result.errors) {\n lines.push(` ✗ ${err}`);\n }\n for (const warn of result.warnings) {\n lines.push(` ⚡ ${warn}`);\n }\n return lines.join(\"\\n\");\n}\n","/**\n * Configuration types for Viber agents and spaces\n */\n\n// Re-export types\nexport type { SpaceConfig, SpaceState, SpaceModel, ViberConfig } from \"../types\";\nimport type { ViberConfig } from \"../types\";\nimport path from \"path\";\nimport os from \"os\";\nimport { getModuleDirname } from \"../utils/module-path\";\nimport fs from \"fs/promises\";\nimport * as yaml from \"yaml\";\n\nexport type { SupabaseClient } from \"@supabase/supabase-js\";\n\n\n\n/**\n * OpenViber Runtime Configuration (storage paths, supabase factories, etc.)\n * Separate from ViberConfig which defines an individual viber's agent config.\n */\nexport interface RuntimeConfig {\n /** Root directory for file storage */\n storageRoot: string;\n\n /** Defaults directory path */\n defaultsPath?: string;\n\n /** Supabase client factories (optional for local mode) */\n createSupabaseClient?: () => any;\n createServiceRoleClient?: () => any;\n}\n\n/**\n * MCP Server Configuration\n */\nexport interface McpServerConfig {\n name: string;\n description?: string;\n command: string;\n args?: string[];\n env?: Record<string, string>;\n require_approval?: string[];\n}\n\n/**\n * Global Configuration (config.yaml)\n */\nexport interface GlobalConfig {\n daemon?: any;\n defaults?: any;\n providers?: Record<string, any>;\n budget?: any;\n channels?: Record<string, any>;\n gateway?: any;\n security?: any;\n mcp_servers?: McpServerConfig[];\n}\n\nconst __dirname = getModuleDirname();\n\nlet config: RuntimeConfig | null = null;\n\n/**\n * Configure viber with application-specific settings\n */\nexport function configure(newConfig: RuntimeConfig): void {\n config = newConfig;\n}\n\n/**\n * Get current viber configuration\n */\nexport function getConfig(): RuntimeConfig {\n if (!config) {\n // Default configuration - use ~/.openviber for daemon mode\n return {\n storageRoot: path.join(os.homedir(), \".openviber\"),\n defaultsPath: path.join(__dirname, \"defaults\"),\n };\n }\n return config;\n}\n\n/**\n * Get viber storage root path\n */\nexport function getViberRoot(): string {\n return getConfig().storageRoot;\n}\n\n/**\n * Get path relative to viber root\n */\nexport function getViberPath(...segments: string[]): string {\n const root = getViberRoot();\n return [root, ...segments].join(\"/\");\n}\n\n/**\n * Load agent configuration from defaults\n */\nexport async function loadViberConfig(agentId: string): Promise<ViberConfig | null> {\n const defaultsPath = getConfig().defaultsPath || path.join(__dirname, \"defaults\");\n const agentPath = path.join(defaultsPath, \"agents\", `${agentId}.yaml`);\n\n try {\n const content = await fs.readFile(agentPath, \"utf-8\");\n const config = yaml.parse(content) as ViberConfig;\n return { ...config, id: agentId };\n } catch (error) {\n return null;\n }\n}\n\n/**\n * Load global configuration from ~/.openviber/config.yaml\n */\nexport async function loadGlobalConfig(): Promise<GlobalConfig | null> {\n const configPath = path.join(os.homedir(), \".openviber\", \"config.yaml\");\n try {\n const content = await fs.readFile(configPath, \"utf-8\");\n return yaml.parse(content) as GlobalConfig;\n } catch (error) {\n // Return null if config doesn't exist or is invalid\n return null;\n }\n}\n","/**\n * Base classes and decorators for custom tools\n * Provides decorator-based tool extraction for multi-tool providers\n */\n\nimport { z } from \"zod\";\nimport * as path from \"path\";\nimport { promises as fs } from \"fs\";\nimport \"reflect-metadata\";\nimport { CoreTool } from \"../worker/tool\";\nimport { getViberRoot } from \"../utils/paths\";\n\nconst TOOLS_METADATA_KEY = Symbol(\"tools\");\n\n/**\n * Option definition for select fields\n * Contains semantic information about options (NOT UI concerns like icons)\n */\nexport interface OptionDefinition {\n value: string; // The actual value stored\n label: string; // Human-readable label\n description?: string; // Semantic description of what this option does\n}\n\n/**\n * Base configuration item - shared properties for all field types\n */\ninterface BaseConfigItem {\n name: string; // Human-readable field name\n description?: string; // What this field does/controls\n required?: boolean; // Whether this field is required\n defaultValue?: any; // Default value for the field\n}\n\n/**\n * String field configuration\n * Supports environment variable integration\n */\nexport interface StringConfigItem extends BaseConfigItem {\n type: \"string\";\n envVar?: string; // Environment variable name if applicable\n}\n\n/**\n * Number field configuration\n * Supports min/max validation\n */\nexport interface NumberConfigItem extends BaseConfigItem {\n type: \"number\";\n min?: number; // Minimum value\n max?: number; // Maximum value\n}\n\n/**\n * Boolean field configuration\n */\nexport interface BooleanConfigItem extends BaseConfigItem {\n type: \"boolean\";\n}\n\n/**\n * Select field configuration\n * Supports simple string options or rich option definitions\n */\nexport interface SelectConfigItem extends BaseConfigItem {\n type: \"select\";\n options: string[] | OptionDefinition[]; // Available choices\n}\n\n/**\n * Array field configuration\n */\nexport interface ArrayConfigItem extends BaseConfigItem {\n type: \"array\";\n itemType?: \"string\" | \"number\"; // Type of array items\n}\n\n/**\n * Configuration item - discriminated union of all field types\n * Each type has its own specific properties, ensuring type safety\n */\nexport type ConfigItem =\n | StringConfigItem\n | NumberConfigItem\n | BooleanConfigItem\n | SelectConfigItem\n | ArrayConfigItem;\n\n/**\n * Tool configuration schema using ConfigItem\n */\nexport interface ConfigSchema {\n [key: string]: ConfigItem;\n}\n\n/**\n * Tool function decorator - marks a method as a tool with schema and description\n */\nexport function ToolFunction<T extends z.ZodSchema>(config: {\n name?: string; // Optional, defaults to method name\n description: string;\n input: T; // Input schema\n}) {\n return function (\n target: any,\n propertyKey: string,\n descriptor: PropertyDescriptor\n ) {\n // Store tool metadata\n const tools = Reflect.getMetadata(TOOLS_METADATA_KEY, target) || [];\n tools.push({\n methodName: propertyKey,\n toolName: config.name || propertyKey,\n description: config.description,\n inputSchema: config.input,\n });\n Reflect.defineMetadata(TOOLS_METADATA_KEY, tools, target);\n\n // Wrap the original method to validate input\n const originalMethod = descriptor.value;\n descriptor.value = async function (input: z.infer<T>) {\n // Validate input\n const validated = config.input.parse(input);\n // Call original method\n return originalMethod.call(this, validated);\n };\n\n return descriptor;\n };\n}\n\n// Shorter alias\nexport { ToolFunction as Function };\n\n/**\n * Configuration schema for tools\n */\nexport interface ToolConfig {\n [key: string]: any;\n}\n\n/**\n * Tool metadata\n */\nexport interface ToolMetadata {\n id: string;\n name: string;\n description: string;\n category: string;\n requiresApiKey?: boolean;\n apiKeyName?: string;\n}\n\n/**\n * Base class for tools - a single class can provide multiple related tool methods\n *\n * Provides standardized space-aware file operations that automatically handle\n * Viber space storage structure (.viber/{spaceId}/artifacts/).\n *\n * Example usage in a custom tool:\n * ```typescript\n * class MyTool extends Tool {\n * @ToolFunction({\n * description: 'Process a file in the space',\n * input: z.object({ fileName: z.string() })\n * })\n * async processFile(input: { fileName: string }) {\n * // Check if file exists in space artifacts\n * if (await this.artifactFileExists(input.fileName)) {\n * // Read file content\n * const content = await this.readArtifactFile(input.fileName);\n *\n * // Process content...\n * const processed = content.toUpperCase();\n *\n * // Write back to artifacts\n * await this.writeArtifactFile('processed_' + input.fileName, processed);\n *\n * return { success: true };\n * }\n * throw new Error('File not found in space artifacts');\n * }\n * }\n * ```\n */\nexport abstract class Tool {\n protected spaceId?: string;\n\n /**\n * Get tool metadata\n */\n abstract getMetadata(): ToolMetadata;\n\n /**\n * Get configuration schema for this tool\n * Returns null if no configuration needed\n */\n getConfigSchema(): ConfigSchema | null {\n return null;\n }\n\n /**\n * Validate configuration\n */\n validateConfig(config: any): boolean {\n const schema = this.getConfigSchema();\n if (!schema) return true;\n\n // Basic validation based on ConfigSchema\n for (const [key, item] of Object.entries(schema)) {\n const value = config[key];\n\n // Check required fields\n if (\n item.required &&\n (value === undefined || value === null || value === \"\")\n ) {\n return false;\n }\n\n // Type validation\n if (value !== undefined && value !== null) {\n switch (item.type) {\n case \"number\": {\n if (typeof value !== \"number\") return false;\n // TypeScript knows item is NumberConfigItem here\n if (item.min !== undefined && value < item.min) return false;\n if (item.max !== undefined && value > item.max) return false;\n break;\n }\n case \"boolean\":\n if (typeof value !== \"boolean\") return false;\n break;\n case \"select\": {\n // TypeScript knows item is SelectConfigItem here\n // Handle both string[] and OptionDefinition[]\n const validValues = item.options.map((opt) =>\n typeof opt === \"string\" ? opt : opt.value\n );\n if (!validValues.includes(value)) return false;\n break;\n }\n case \"array\":\n if (!Array.isArray(value)) return false;\n break;\n }\n }\n }\n\n return true;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ToolConfig | null {\n return null;\n }\n\n /**\n * Set configuration\n */\n setConfig(config: ToolConfig): void {\n // Override in subclasses if needed\n // The config parameter is intentionally unused in the base class\n void config;\n }\n\n /**\n * Set space context for this tool instance\n * Called by the tool system when spaceId is available\n */\n setSpaceId(spaceId?: string): void {\n this.spaceId = spaceId;\n }\n\n /**\n * Get the current space ID\n */\n getSpaceId(): string | undefined {\n return this.spaceId;\n }\n\n /**\n * Get space-aware storage path\n * Utility method for tools that need to work with space-specific storage\n */\n protected async getSpacePathAsync(subPath: string = \"\"): Promise<string> {\n return this.getSpacePath(subPath);\n }\n\n private static getRootPath(): string {\n return getViberRoot();\n }\n\n protected getSpacePath(subPath: string = \"\"): string {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n // Use the exact same root path logic as SpaceStore\n const rootPath = Tool.getRootPath();\n const basePath = path.join(rootPath, \"spaces\", this.spaceId);\n return subPath ? path.join(basePath, subPath) : basePath;\n }\n\n /**\n * Get space artifacts directory path\n * Utility method for tools that work with space artifacts\n */\n protected getSpaceArtifactsPath(fileName: string = \"\"): string {\n const artifactsPath = this.getSpacePath(\"artifacts\");\n return fileName ? path.join(artifactsPath, fileName) : artifactsPath;\n }\n\n /**\n * Resolve file path within space artifacts directory\n * Handles both relative and absolute paths, with security checks\n */\n protected resolveArtifactPath(filePath: string): string {\n if (path.isAbsolute(filePath)) {\n // For absolute paths, check if they're within the space artifacts directory\n const artifactsPath = this.getSpaceArtifactsPath();\n const resolved = path.resolve(filePath);\n if (!resolved.startsWith(artifactsPath)) {\n throw new Error(\n \"Absolute paths outside space artifacts directory are not allowed\"\n );\n }\n return resolved;\n }\n // For relative paths, resolve within artifacts directory\n return this.getSpaceArtifactsPath(filePath);\n }\n\n /**\n * Read file from space artifacts directory\n */\n protected async readArtifactFile(\n filePath: string,\n encoding: BufferEncoding = \"utf8\"\n ): Promise<string> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n // Normalize path - remove \"artifacts/\" prefix if present\n const normalizedPath = filePath.startsWith(\"artifacts/\")\n ? filePath.substring(10)\n : filePath;\n const fullPath = this.getSpaceArtifactsPath(normalizedPath);\n\n return await fs.readFile(fullPath, encoding);\n }\n\n /**\n * Write file to space artifacts directory\n */\n protected async writeArtifactFile(\n filePath: string,\n content: string,\n encoding: BufferEncoding = \"utf8\"\n ): Promise<void> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n // Normalize path - remove \"artifacts/\" prefix if present\n const normalizedPath = filePath.startsWith(\"artifacts/\")\n ? filePath.substring(10)\n : filePath;\n const fullPath = this.getSpaceArtifactsPath(normalizedPath);\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(fullPath), { recursive: true });\n await fs.writeFile(fullPath, content, encoding);\n }\n\n /**\n * Check if file exists in space artifacts directory\n */\n protected async artifactFileExists(filename: string): Promise<boolean> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n try {\n const fullPath = this.getSpaceArtifactsPath(filename);\n await fs.access(fullPath);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get file stats from space artifacts directory\n * Note: This method still uses fs.stat for local storage compatibility\n * For Supabase storage, size info is available through artifact metadata\n */\n protected async getArtifactFileStats(filePath: string) {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n // For local storage, we can still use fs.stat on the resolved path\n // This is acceptable since getArtifactFileStats is primarily used for\n // file metadata that's already available through other means in Supabase\n const fullPath = this.resolveArtifactPath(filePath);\n return await fs.stat(fullPath);\n }\n\n /**\n * List files in space artifacts directory\n */\n protected async listArtifactFiles(\n dirPath: string = \"\",\n recursive: boolean = false\n ): Promise<string[]> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n // Normalize directory path\n const normalizedPath = dirPath.startsWith(\"artifacts/\")\n ? dirPath.substring(10)\n : dirPath;\n const fullPath = this.getSpaceArtifactsPath(normalizedPath);\n\n try {\n const entries = await fs.readdir(fullPath, { withFileTypes: true });\n if (!recursive) {\n return entries.filter(e => e.isFile()).map(e => e.name);\n }\n // Recursive listing\n const files: string[] = [];\n const walk = async (dir: string, prefix: string) => {\n const items = await fs.readdir(dir, { withFileTypes: true });\n for (const item of items) {\n const itemPath = prefix ? `${prefix}/${item.name}` : item.name;\n if (item.isFile()) {\n files.push(itemPath);\n } else if (item.isDirectory()) {\n await walk(path.join(dir, item.name), itemPath);\n }\n }\n };\n await walk(fullPath, \"\");\n return files;\n } catch {\n return [];\n }\n }\n\n /**\n * Delete file from space artifacts directory\n */\n protected async deleteArtifactFile(filePath: string): Promise<void> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n // Normalize path\n const normalizedPath = filePath.startsWith(\"artifacts/\")\n ? filePath.substring(10)\n : filePath;\n const fullPath = this.getSpaceArtifactsPath(normalizedPath);\n\n await fs.unlink(fullPath);\n }\n\n /**\n * Copy file within space artifacts directory\n */\n protected async copyArtifactFile(\n sourcePath: string,\n destPath: string\n ): Promise<void> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n // Normalize paths\n const normalizedSource = sourcePath.startsWith(\"artifacts/\")\n ? sourcePath.substring(10)\n : sourcePath;\n const normalizedDest = destPath.startsWith(\"artifacts/\")\n ? destPath.substring(10)\n : destPath;\n\n const srcFullPath = this.getSpaceArtifactsPath(normalizedSource);\n const destFullPath = this.getSpaceArtifactsPath(normalizedDest);\n\n // Ensure destination directory exists\n await fs.mkdir(path.dirname(destFullPath), { recursive: true });\n await fs.copyFile(srcFullPath, destFullPath);\n }\n\n /**\n * Move file within space artifacts directory\n */\n protected async moveArtifactFile(\n sourcePath: string,\n destPath: string\n ): Promise<void> {\n if (!this.spaceId) {\n throw new Error(\n \"Space ID not set. This tool requires space context.\"\n );\n }\n\n // Normalize paths\n const normalizedSource = sourcePath.startsWith(\"artifacts/\")\n ? sourcePath.substring(10)\n : sourcePath;\n const normalizedDest = destPath.startsWith(\"artifacts/\")\n ? destPath.substring(10)\n : destPath;\n\n const srcFullPath = this.getSpaceArtifactsPath(normalizedSource);\n const destFullPath = this.getSpaceArtifactsPath(normalizedDest);\n\n // Ensure destination directory exists\n await fs.mkdir(path.dirname(destFullPath), { recursive: true });\n await fs.rename(srcFullPath, destFullPath);\n }\n\n /**\n * Check if tool is available/properly configured\n */\n isAvailable(): boolean {\n return true;\n }\n\n /**\n * Automatically extract all decorated methods as tools\n */\n getTools(): Record<string, CoreTool> {\n const tools: Record<string, CoreTool> = {};\n\n // Get all decorated tool methods\n const toolMetadata = Reflect.getMetadata(TOOLS_METADATA_KEY, this) || [];\n\n for (const {\n methodName,\n toolName,\n description,\n inputSchema,\n } of toolMetadata) {\n // Create CoreTool entry - tool names should already be in snake_case\n tools[toolName] = {\n description,\n inputSchema: inputSchema || z.any(),\n execute: (this as any)[methodName].bind(this),\n };\n }\n\n return tools;\n }\n\n /**\n * Get list of tool names provided by this class\n */\n getToolNames(): string[] {\n const toolMetadata = Reflect.getMetadata(TOOLS_METADATA_KEY, this) || [];\n return toolMetadata.map((t: any) => t.toolName);\n }\n\n /**\n * Get detailed information about all tool functions\n * Returns the same structure as getTools() but without execute functions\n */\n getToolDetails(): Array<{\n name: string;\n description: string;\n parameters: any;\n }> {\n const tools = this.getTools();\n return Object.entries(tools).map(([name, tool]) => ({\n name,\n description: tool.description,\n parameters: tool.inputSchema?._def || tool.inputSchema || {},\n }));\n }\n}\n","/**\n * FileTool using unified decorator for cleaner code\n */\n\nimport { z } from \"zod\";\nimport { promises as fs } from \"fs\";\nimport * as path from \"path\";\nimport {\n Tool,\n ToolFunction,\n ToolMetadata,\n ToolConfig,\n ConfigSchema,\n} from \"./base\";\n\nexport class FileTool extends Tool {\n private config: ToolConfig = {\n basePath: process.cwd(),\n allowAbsolutePaths: true,\n maxFileSize: 10 * 1024 * 1024, // 10MB\n allowedExtensions: null, // null means all extensions allowed\n excludedPaths: [\".git\", \"node_modules\", \".env\"],\n };\n\n getMetadata(): ToolMetadata {\n return {\n id: \"file\",\n name: \"File System Tools\",\n description:\n \"Read, write, manage and manipulate files and directories in the local file system\",\n category: \"file\",\n };\n }\n\n getConfigSchema(): ConfigSchema {\n return {\n basePath: {\n name: \"Base Path\",\n type: \"string\",\n description: \"Base directory for file operations\",\n defaultValue: process.cwd(),\n required: false,\n },\n allowAbsolutePaths: {\n name: \"Allow Absolute Paths\",\n type: \"boolean\",\n description:\n \"Allow operations on absolute paths outside the base directory\",\n defaultValue: false,\n required: false,\n },\n maxFileSize: {\n name: \"Max File Size\",\n type: \"number\",\n description: \"Maximum file size in bytes\",\n defaultValue: 10485760, // 10MB\n required: false,\n },\n allowedExtensions: {\n name: \"Allowed Extensions\",\n type: \"array\",\n description:\n \"List of allowed file extensions (leave empty to allow all)\",\n defaultValue: null,\n required: false,\n },\n excludedPaths: {\n name: \"Excluded Paths\",\n type: \"array\",\n description: \"Directories and paths to exclude from operations\",\n defaultValue: [\".git\", \"node_modules\", \".env\"],\n required: false,\n },\n };\n }\n\n getConfig(): ToolConfig {\n return this.config;\n }\n\n setConfig(config: ToolConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n private getBasePath(): string {\n // If we have a space ID, use the space's artifacts directory\n if (this.spaceId) {\n return this.getSpaceArtifactsPath();\n }\n return this.config.basePath || process.cwd();\n }\n\n private resolvePath(filePath: string): string {\n // If we have space context, use artifact-aware path resolution\n if (this.spaceId) {\n return this.resolveArtifactPath(filePath);\n }\n\n // Fallback to original logic for non-space context\n if (path.isAbsolute(filePath)) {\n if (!this.config.allowAbsolutePaths) {\n throw new Error(\n \"Absolute paths are not allowed. Please use relative paths or enable allowAbsolutePaths in configuration.\"\n );\n }\n return filePath;\n }\n return path.join(this.getBasePath(), filePath);\n }\n\n @ToolFunction({\n description:\n \"Create a new file or overwrite an existing file with the specified content. Creates parent directories if they don't exist.\",\n input: z.object({\n path: z\n .string()\n .describe(\n \"The file path to create or overwrite (relative or absolute)\"\n ),\n content: z.string().describe(\"The content to write to the file\"),\n encoding: z\n .enum([\"utf8\", \"base64\"])\n .optional()\n .default(\"utf8\")\n .describe(\n \"The encoding format for the file content (utf8 for text, base64 for binary)\"\n ),\n }),\n })\n async create_file(input: {\n path: string;\n content: string;\n encoding?: \"utf8\" | \"base64\";\n }) {\n // Use base class method for space context\n if (this.spaceId) {\n await this.writeArtifactFile(input.path, input.content, input.encoding || \"utf8\");\n return {\n success: true,\n path: input.path,\n size: Buffer.byteLength(input.content, input.encoding || \"utf8\"),\n };\n }\n\n // Fallback to fs for non-space operations\n const fullPath = this.resolvePath(input.path);\n\n // Ensure directory exists\n const dir = path.dirname(fullPath);\n await fs.mkdir(dir, { recursive: true });\n\n // Write file\n await fs.writeFile(fullPath, input.content, input.encoding || \"utf8\");\n\n return {\n success: true,\n path: fullPath,\n size: Buffer.byteLength(input.content, input.encoding || \"utf8\"),\n };\n }\n\n @ToolFunction({\n description:\n \"Read the contents of a file from the file system. Returns the file content along with metadata like size and modification time.\",\n input: z.object({\n path: z.string().describe(\"The file path to read (relative or absolute)\"),\n encoding: z\n .enum([\"utf8\", \"base64\"])\n .optional()\n .default(\"utf8\")\n .describe(\n \"The encoding to use when reading the file (utf8 for text files, base64 for binary files)\"\n ),\n }),\n })\n async read_file(input: { path: string; encoding?: \"utf8\" | \"base64\" }) {\n // Use base class method for space context\n if (this.spaceId) {\n const content = await this.readArtifactFile(input.path, input.encoding || \"utf8\");\n const stats = await this.getArtifactFileStats(input.path);\n return {\n content,\n path: input.path,\n size: stats.size,\n modified: stats.mtime.toISOString(),\n };\n }\n\n // Fallback to fs for non-space operations\n const fullPath = this.resolvePath(input.path);\n\n const content = await fs.readFile(fullPath, input.encoding || \"utf8\");\n const stats = await fs.stat(fullPath);\n\n return {\n content,\n path: fullPath,\n size: stats.size,\n modified: stats.mtime.toISOString(),\n };\n }\n\n @ToolFunction({\n description:\n \"Delete a file from the file system. This operation is irreversible. The file must exist or an error will be thrown.\",\n input: z.object({\n path: z\n .string()\n .describe(\"The file path to delete (relative or absolute)\"),\n }),\n })\n async delete_file(input: { path: string }) {\n // Use base class method for space context\n if (this.spaceId) {\n await this.deleteArtifactFile(input.path);\n return {\n success: true,\n path: input.path,\n };\n }\n\n // Fallback to fs for non-space operations\n const fullPath = this.resolvePath(input.path);\n\n await fs.unlink(fullPath);\n\n return {\n success: true,\n path: fullPath,\n };\n }\n\n @ToolFunction({\n description:\n \"List all files in a directory with optional recursive traversal and pattern filtering. Returns an array of file paths.\",\n input: z.object({\n directory: z\n .string()\n .describe(\n \"The directory path to list files from (relative or absolute)\"\n ),\n recursive: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"Whether to recursively list files in subdirectories\"),\n pattern: z\n .string()\n .optional()\n .describe(\n \"Optional pattern to filter files (simple string matching, not full glob)\"\n ),\n }),\n })\n async list_files(input: {\n directory: string;\n recursive?: boolean;\n pattern?: string;\n }) {\n // Use base class method for space context\n if (this.spaceId) {\n let files = await this.listArtifactFiles(input.directory, input.recursive || false);\n\n // Apply pattern filter if provided\n if (input.pattern) {\n files = files.filter((file) => file.includes(input.pattern!));\n }\n\n return {\n directory: input.directory,\n files,\n count: files.length,\n };\n }\n\n // Fallback to fs for non-space operations\n const fullPath = this.resolvePath(input.directory);\n\n const files: string[] = [];\n\n async function walk(dir: string) {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const entryPath = path.join(dir, entry.name);\n\n if (entry.isDirectory() && input.recursive) {\n await walk(entryPath);\n } else if (entry.isFile()) {\n // Apply pattern filter if provided\n if (!input.pattern || entryPath.includes(input.pattern)) {\n files.push(entryPath);\n }\n }\n }\n }\n\n await walk(fullPath);\n\n return {\n directory: fullPath,\n files,\n count: files.length,\n };\n }\n\n @ToolFunction({\n description:\n \"Move or rename a file from one location to another. Creates parent directories if needed. The source file will no longer exist after this operation.\",\n input: z.object({\n source: z\n .string()\n .describe(\"The source file path to move from (relative or absolute)\"),\n destination: z\n .string()\n .describe(\n \"The destination file path to move to (relative or absolute)\"\n ),\n }),\n })\n async move_file(input: { source: string; destination: string }) {\n // Use base class method for space context\n if (this.spaceId) {\n await this.moveArtifactFile(input.source, input.destination);\n return {\n success: true,\n source: input.source,\n destination: input.destination,\n };\n }\n\n // Fallback to fs for non-space operations\n const sourcePath = this.resolvePath(input.source);\n const destPath = this.resolvePath(input.destination);\n\n // Ensure destination directory exists\n const destDir = path.dirname(destPath);\n await fs.mkdir(destDir, { recursive: true });\n\n await fs.rename(sourcePath, destPath);\n\n return {\n success: true,\n source: sourcePath,\n destination: destPath,\n };\n }\n\n @ToolFunction({\n description:\n \"Copy a file from one location to another. Creates parent directories if needed. The source file remains unchanged.\",\n input: z.object({\n source: z\n .string()\n .describe(\"The source file path to copy from (relative or absolute)\"),\n destination: z\n .string()\n .describe(\n \"The destination file path to copy to (relative or absolute)\"\n ),\n }),\n })\n async copy_file(input: { source: string; destination: string }) {\n // Use base class method for space context\n if (this.spaceId) {\n await this.copyArtifactFile(input.source, input.destination);\n return {\n success: true,\n source: input.source,\n destination: input.destination,\n };\n }\n\n // Fallback to fs for non-space operations\n const sourcePath = this.resolvePath(input.source);\n const destPath = this.resolvePath(input.destination);\n\n // Ensure destination directory exists\n const destDir = path.dirname(destPath);\n await fs.mkdir(destDir, { recursive: true });\n\n await fs.copyFile(sourcePath, destPath);\n\n return {\n success: true,\n source: sourcePath,\n destination: destPath,\n };\n }\n\n @ToolFunction({\n description:\n \"Check if a file or directory exists at the specified path. Returns existence status and file metadata if it exists.\",\n input: z.object({\n path: z\n .string()\n .describe(\"The file or directory path to check (relative or absolute)\"),\n }),\n })\n async file_exists(input: { path: string }) {\n const fullPath = this.resolvePath(input.path);\n\n try {\n // Use base class method for space-aware file existence check when in space context\n if (this.spaceId) {\n const exists = await this.artifactFileExists(input.path);\n if (exists) {\n const stats = await this.getArtifactFileStats(input.path);\n return {\n exists: true,\n path: fullPath,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n size: stats.size,\n };\n } else {\n return {\n exists: false,\n path: fullPath,\n };\n }\n }\n\n // Fallback for non-space context\n await fs.access(fullPath);\n const stats = await fs.stat(fullPath);\n\n return {\n exists: true,\n path: fullPath,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n size: stats.size,\n };\n } catch {\n return {\n exists: false,\n path: fullPath,\n };\n }\n }\n}\n","/**\n * Simplified Search Tool Configuration\n * Focuses on Tavily and Serper as primary providers\n */\n\nimport { z } from 'zod';\n\nexport type SearchProvider = 'exa' | 'tavily' | 'serper' | 'duckduckgo';\n\nexport const SearchConfigSchema = z.object({\n exaApiKey: z.string().optional(),\n tavilyApiKey: z.string().optional(),\n serperApiKey: z.string().optional(),\n defaultProvider: z.enum(['exa', 'tavily', 'serper', 'duckduckgo', 'auto']).default('auto'),\n enableFallback: z.boolean().default(true),\n});\n\nexport type SearchConfig = z.infer<typeof SearchConfigSchema>;\n\n// Provider metadata\nexport const SEARCH_PROVIDERS = {\n exa: {\n name: 'Exa',\n endpoint: 'https://api.exa.ai/search',\n envVar: 'EXA_API_KEY',\n priority: 0, // Highest priority - semantic/neural search preferred for AI agents\n },\n tavily: {\n name: 'Tavily',\n endpoint: 'https://api.tavily.com/search',\n envVar: 'TAVILY_API_KEY',\n priority: 1,\n },\n serper: {\n name: 'Serper',\n endpoint: 'https://google.serper.dev/search',\n envVar: 'SERPER_API_KEY',\n priority: 2,\n },\n duckduckgo: {\n name: 'DuckDuckGo',\n endpoint: 'https://html.duckduckgo.com/html/',\n envVar: '', // No API key required — zero-config fallback\n priority: 10, // Lowest priority: keyed providers always preferred\n },\n} as const;\n\n/**\n * Simplified Search Configuration Manager\n */\nexport class SearchConfigManager {\n private config: SearchConfig;\n\n constructor(config?: Partial<SearchConfig>) {\n this.config = SearchConfigSchema.parse(config || {});\n }\n\n getApiKey(provider: SearchProvider): string | null {\n // First check config, then fall back to env vars\n if (provider === 'exa' && this.config.exaApiKey) {\n return this.config.exaApiKey;\n }\n if (provider === 'tavily' && this.config.tavilyApiKey) {\n return this.config.tavilyApiKey;\n }\n if (provider === 'serper' && this.config.serperApiKey) {\n return this.config.serperApiKey;\n }\n\n // Fall back to environment variable\n return process.env[SEARCH_PROVIDERS[provider].envVar] || null;\n }\n\n isProviderAvailable(provider: SearchProvider): boolean {\n // DuckDuckGo is always available (no API key required)\n if (provider === 'duckduckgo') return true;\n return !!this.getApiKey(provider);\n }\n\n getAvailableProviders(): SearchProvider[] {\n return (Object.keys(SEARCH_PROVIDERS) as SearchProvider[])\n .filter(p => this.isProviderAvailable(p))\n .sort((a, b) => SEARCH_PROVIDERS[a].priority - SEARCH_PROVIDERS[b].priority);\n }\n\n selectProvider(): SearchProvider | null {\n if (this.config.defaultProvider !== 'auto') {\n const provider = this.config.defaultProvider;\n if (this.isProviderAvailable(provider)) {\n return provider;\n }\n }\n\n const available = this.getAvailableProviders();\n return available[0] || null;\n }\n\n getFallbackProvider(excludeProvider: SearchProvider): SearchProvider | null {\n if (!this.config.enableFallback) return null;\n\n const available = this.getAvailableProviders();\n return available.find(p => p !== excludeProvider) || null;\n }\n\n isSearchAvailable(): boolean {\n return this.getAvailableProviders().length > 0;\n }\n\n getStatus() {\n const providers = (Object.keys(SEARCH_PROVIDERS) as SearchProvider[]).map(id => ({\n id,\n name: SEARCH_PROVIDERS[id].name,\n configured: !!this.getApiKey(id),\n available: this.isProviderAvailable(id),\n }));\n\n return {\n available: this.isSearchAvailable(),\n providers,\n defaultProvider: this.config.defaultProvider,\n selectedProvider: this.selectProvider(),\n };\n }\n}","/**\n * Simplified SearchTool - Focuses on essential search functionality\n */\n\nimport { z } from 'zod';\nimport { Tool, ToolFunction, ToolMetadata, ToolConfig, ConfigSchema } from './base';\nimport { SearchConfigManager, SearchProvider, SEARCH_PROVIDERS } from './search-config';\n\n// Search result interfaces\nexport interface SearchResult {\n title: string;\n url: string;\n snippet: string;\n content?: string;\n score?: number;\n publishedDate?: string;\n}\n\nexport interface SearchResponse {\n provider: string;\n query: string;\n results: SearchResult[];\n totalResults?: number;\n}\n\n/**\n * Simplified SearchTool\n */\nexport class SearchTool extends Tool {\n private configManager: SearchConfigManager;\n private config: any = {};\n\n constructor() {\n super();\n this.configManager = new SearchConfigManager();\n }\n\n getMetadata(): ToolMetadata {\n const status = this.configManager.getStatus();\n const availableProviders = status.providers\n .filter(p => p.available)\n .map(p => p.name)\n .join(' and ');\n\n return {\n id: 'search',\n name: 'Web Search',\n description: availableProviders\n ? `Search the web for current information using ${availableProviders}`\n : 'Web search functionality (requires TAVILY_API_KEY or SERPER_API_KEY)',\n category: 'search',\n };\n }\n\n getConfigSchema(): ConfigSchema {\n return {\n defaultProvider: {\n name: '默认搜索提供商',\n type: 'select',\n description: '选择默认使用的搜索引擎提供商',\n options: [\n { value: 'auto', label: '自动选择', description: '根据可用性自动选择最佳搜索引擎' },\n { value: 'exa', label: 'Exa', description: '神经/语义搜索引擎,按意义而非关键词查找结果' },\n { value: 'tavily', label: 'Tavily', description: '专为 AI 优化的搜索引擎,提供高质量结构化结果' },\n { value: 'serper', label: 'Serper', description: 'Google 搜索 API,提供全面的搜索结果' },\n ],\n defaultValue: 'auto',\n required: false,\n },\n enableFallback: {\n name: '启用备用提供商',\n type: 'boolean',\n description: '当主提供商失败时自动切换到备用提供商',\n defaultValue: true,\n required: false,\n },\n exaApiKey: {\n name: 'Exa API 密钥',\n type: 'string',\n description: '用于 Exa 神经/语义搜索服务的 API 密钥。可以在此直接设置,或通过环境变量 EXA_API_KEY 提供',\n envVar: 'EXA_API_KEY',\n required: false,\n },\n tavilyApiKey: {\n name: 'Tavily API 密钥',\n type: 'string',\n description: '用于 Tavily 网络搜索服务的 API 密钥。可以在此直接设置,或通过环境变量 TAVILY_API_KEY 提供',\n envVar: 'TAVILY_API_KEY',\n required: false,\n },\n serperApiKey: {\n name: 'Serper API 密钥',\n type: 'string',\n description: '用于 Serper (Google 搜索) 服务的 API 密钥。可以在此直接设置,或通过环境变量 SERPER_API_KEY 提供',\n envVar: 'SERPER_API_KEY',\n required: false,\n },\n defaultLanguage: {\n name: '默认语言',\n type: 'select',\n description: '搜索结果的默认语言偏好',\n options: [\n { value: 'auto', label: '自动检测' },\n { value: 'zh-CN', label: '简体中文' },\n { value: 'zh-TW', label: '繁体中文' },\n { value: 'en', label: 'English' },\n { value: 'ja', label: '日本語' },\n { value: 'ko', label: '한국어' },\n ],\n defaultValue: 'auto',\n required: false,\n },\n defaultCountry: {\n name: '默认地区',\n type: 'select',\n description: '搜索结果的默认地区偏好',\n options: [\n { value: 'auto', label: '自动选择' },\n { value: 'CN', label: '中国大陆' },\n { value: 'TW', label: '中国台湾省' },\n { value: 'HK', label: '中国香港' },\n { value: 'US', label: '美国' },\n { value: 'JP', label: '日本' },\n { value: 'KR', label: '韩国' },\n ],\n defaultValue: 'auto',\n required: false,\n },\n defaultSearchType: {\n name: '默认搜索类型',\n type: 'select',\n description: '默认的搜索类型',\n options: [\n { value: 'general', label: '常规搜索' },\n { value: 'news', label: '新闻搜索' },\n ],\n defaultValue: 'general',\n required: false,\n },\n defaultNewsDays: {\n name: '新闻时间范围',\n type: 'number',\n description: '新闻搜索的默认时间范围(天数)',\n defaultValue: 7,\n required: false,\n },\n includeDomains: {\n name: '优先域名',\n type: 'array',\n description: '优先显示这些域名的搜索结果(例如:[\"baidu.com\", \"zhihu.com\"])',\n defaultValue: [],\n required: false,\n },\n excludeDomains: {\n name: '排除域名',\n type: 'array',\n description: '从搜索结果中排除这些域名',\n defaultValue: [],\n required: false,\n },\n };\n }\n\n getConfig(): ToolConfig {\n return {\n ...this.config,\n ...this.configManager.getStatus(),\n };\n }\n\n setConfig(config: ToolConfig): void {\n this.config = config;\n\n // Update config manager with new settings\n this.configManager = new SearchConfigManager({\n exaApiKey: config.exaApiKey,\n tavilyApiKey: config.tavilyApiKey,\n serperApiKey: config.serperApiKey,\n defaultProvider: config.defaultProvider,\n enableFallback: config.enableFallback,\n });\n }\n\n isAvailable(): boolean {\n return this.configManager.isSearchAvailable();\n }\n\n @ToolFunction({\n description: 'Search the web for information using configured search providers (Exa, Tavily, or Serper). Exa provides semantic/neural search that finds results by meaning. Returns relevant web pages with titles, URLs, and snippets. For news queries, automatically prioritizes recent articles and news sources. Supports multiple languages and locales.',\n input: z.object({\n query: z.string().min(1).describe('The search query or keywords to search for'),\n maxResults: z.number().min(1).max(20).optional().default(10).describe('Maximum number of search results to return (1-20, default: 10)'),\n searchType: z.enum(['general', 'news']).optional().default('general').describe('Type of search: \"general\" for all web results, \"news\" for recent news articles only'),\n days: z.number().min(1).max(365).optional().describe('For news searches, limit results to articles from the last N days (default: 7 for news, unlimited for general)'),\n language: z.string().optional().describe('Language code for results (e.g., \"en\" for English, \"zh\" for Chinese, \"zh-CN\" for Simplified Chinese, \"zh-TW\" for Traditional Chinese, \"ja\" for Japanese, \"ko\" for Korean). Defaults to auto-detect from query.'),\n country: z.string().optional().describe('Country code for localized results (e.g., \"US\", \"CN\", \"JP\", \"KR\", \"TW\", \"HK\"). Helps prioritize region-specific sources.'),\n includeDomains: z.array(z.string()).optional().describe('List of domains to prioritize in results (e.g., [\"baidu.com\", \"zhihu.com\"] for Chinese sources)'),\n excludeDomains: z.array(z.string()).optional().describe('List of domains to exclude from results'),\n })\n } as any)\n async search_web(input: {\n query: string;\n maxResults?: number;\n searchType?: 'general' | 'news';\n days?: number;\n language?: string;\n country?: string;\n includeDomains?: string[];\n excludeDomains?: string[];\n }): Promise<SearchResponse> {\n const provider = this.configManager.selectProvider();\n\n if (!provider) {\n throw new Error('No search provider available. Configure EXA_API_KEY, TAVILY_API_KEY, or SERPER_API_KEY for best results, or DuckDuckGo will be used as a zero-config fallback.');\n }\n\n // Apply config defaults for missing parameters\n const effectiveInput = {\n ...input,\n searchType: input.searchType || (this.config.defaultSearchType as 'general' | 'news') || 'general',\n days: input.days || (input.searchType === 'news' || this.config.defaultSearchType === 'news' ? (this.config.defaultNewsDays || 7) : undefined),\n language: input.language || (this.config.defaultLanguage !== 'auto' ? this.config.defaultLanguage : undefined),\n country: input.country || (this.config.defaultCountry !== 'auto' ? this.config.defaultCountry : undefined),\n includeDomains: input.includeDomains || this.config.includeDomains || [],\n excludeDomains: input.excludeDomains || this.config.excludeDomains || [],\n };\n\n try {\n return await this.searchWithProvider(provider, effectiveInput);\n } catch (error) {\n // Try fallback if available\n const fallback = this.configManager.getFallbackProvider(provider);\n if (fallback) {\n console.warn(`Primary search provider ${provider} failed, trying fallback provider ${fallback}...`);\n return await this.searchWithProvider(fallback, effectiveInput);\n }\n throw error;\n }\n }\n\n private async searchWithProvider(\n provider: SearchProvider,\n input: {\n query: string;\n maxResults?: number;\n searchType?: 'general' | 'news';\n days?: number;\n language?: string;\n country?: string;\n includeDomains?: string[];\n excludeDomains?: string[];\n }\n ): Promise<SearchResponse> {\n const apiKey = this.configManager.getApiKey(provider);\n if (!apiKey && provider !== 'duckduckgo') {\n throw new Error(`${provider} API key is not configured`);\n }\n\n const endpoint = SEARCH_PROVIDERS[provider].endpoint;\n\n switch (provider) {\n case 'exa':\n return await this.searchWithExa(endpoint, apiKey!, input);\n case 'tavily':\n return await this.searchWithTavily(endpoint, apiKey!, input);\n case 'serper':\n return await this.searchWithSerper(endpoint, apiKey!, input);\n case 'duckduckgo':\n return await this.searchWithDuckDuckGo(endpoint, input);\n default:\n throw new Error(`Search provider ${provider} is not implemented`);\n }\n }\n\n private async searchWithExa(\n endpoint: string,\n apiKey: string,\n input: {\n query: string;\n maxResults?: number;\n searchType?: 'general' | 'news';\n days?: number;\n language?: string;\n country?: string;\n includeDomains?: string[];\n excludeDomains?: string[];\n }\n ): Promise<SearchResponse> {\n const isNews = input.searchType === 'news';\n\n // EXA API request body\n const requestBody: any = {\n query: input.query,\n numResults: input.maxResults || 10,\n type: 'neural', // Use neural/semantic search for better AI results\n useAutoprompt: true, // Let EXA optimize the query\n contents: {\n text: true, // Include extracted text content\n highlights: true, // Include relevant highlights\n },\n };\n\n // Add time filter for news searches\n if (isNews && input.days) {\n const startDate = new Date();\n startDate.setDate(startDate.getDate() - input.days);\n requestBody.startPublishedDate = startDate.toISOString();\n } else if (input.days) {\n const startDate = new Date();\n startDate.setDate(startDate.getDate() - input.days);\n requestBody.startPublishedDate = startDate.toISOString();\n }\n\n // Add domain filters\n if (input.includeDomains && input.includeDomains.length > 0) {\n requestBody.includeDomains = input.includeDomains;\n }\n if (input.excludeDomains && input.excludeDomains.length > 0) {\n requestBody.excludeDomains = input.excludeDomains;\n }\n\n // For news, prefer news-focused categories\n if (isNews) {\n requestBody.category = 'news';\n }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Exa search failed: ${response.statusText} - ${errorText}`);\n }\n\n const data = await response.json();\n\n return {\n provider: 'exa',\n query: input.query,\n results: (data.results || []).map((r: any) => {\n // Extract domain from URL for favicon\n let domain = '';\n let favicon = '';\n try {\n const urlObj = new URL(r.url);\n domain = urlObj.hostname.replace('www.', '');\n favicon = `https://www.google.com/s2/favicons?domain=${domain}&sz=64`;\n } catch {\n // Invalid URL, skip favicon\n }\n\n // Get snippet from highlights or text\n const snippet = r.highlights?.join(' ') || r.text?.substring(0, 300) || r.title || '';\n\n return {\n title: r.title,\n url: r.url,\n snippet: snippet,\n description: snippet,\n content: r.text,\n score: r.score,\n publishedDate: r.publishedDate,\n domain,\n favicon,\n };\n }),\n totalResults: data.results?.length || 0,\n };\n }\n\n private async searchWithTavily(\n endpoint: string,\n apiKey: string,\n input: {\n query: string;\n maxResults?: number;\n searchType?: 'general' | 'news';\n days?: number;\n language?: string;\n country?: string;\n includeDomains?: string[];\n excludeDomains?: string[];\n }\n ): Promise<SearchResponse> {\n const isNews = input.searchType === 'news';\n const days = input.days || (isNews ? 7 : undefined);\n\n const requestBody: any = {\n query: input.query,\n search_depth: 'advanced',\n max_results: input.maxResults || 10,\n include_raw_content: false,\n include_answer: false,\n };\n\n // Add news-specific parameters\n if (isNews) {\n requestBody.topic = 'news';\n }\n\n // Add language/locale parameters\n // Tavily doesn't have direct language parameter, but we can influence results via include_domains\n const defaultNewsDomains = isNews ? [\n 'reuters.com', 'apnews.com', 'bbc.com', 'cnn.com',\n 'theguardian.com', 'nytimes.com', 'washingtonpost.com',\n ] : [];\n\n // Add language-specific domains\n const languageBasedDomains: string[] = [];\n if (input.language?.startsWith('zh') || input.country === 'CN' || input.country === 'TW' || input.country === 'HK') {\n languageBasedDomains.push(\n 'sina.com.cn', '163.com', 'qq.com', 'sohu.com', 'ifeng.com',\n 'people.com.cn', 'xinhuanet.com', 'chinanews.com', 'thepaper.cn',\n 'caixin.com', 'guancha.cn', 'huanqiu.com', 'chinadaily.com.cn'\n );\n } else if (input.language === 'ja' || input.country === 'JP') {\n languageBasedDomains.push(\n 'nhk.or.jp', 'asahi.com', 'nikkei.com', 'yomiuri.co.jp',\n 'mainichi.jp', 'sankei.com', 'jiji.com'\n );\n } else if (input.language === 'ko' || input.country === 'KR') {\n languageBasedDomains.push(\n 'chosun.com', 'donga.com', 'joins.com', 'hani.co.kr',\n 'khan.co.kr', 'yna.co.kr'\n );\n }\n\n // Combine all domain preferences\n const allIncludeDomains = [\n ...(input.includeDomains || []),\n ...languageBasedDomains,\n ...(languageBasedDomains.length === 0 ? defaultNewsDomains : []),\n ];\n\n if (allIncludeDomains.length > 0) {\n requestBody.include_domains = allIncludeDomains;\n }\n\n // Add exclude domains if specified\n if (input.excludeDomains && input.excludeDomains.length > 0) {\n requestBody.exclude_domains = input.excludeDomains;\n }\n\n // Add time filter if specified\n if (days) {\n requestBody.days = days;\n }\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'api-key': apiKey,\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n throw new Error(`Tavily search failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n return {\n provider: 'tavily',\n query: input.query,\n results: data.results.map((r: any) => {\n // Extract domain from URL for favicon\n let domain = '';\n let favicon = '';\n try {\n const urlObj = new URL(r.url);\n domain = urlObj.hostname.replace('www.', '');\n // Use Google's favicon service\n favicon = `https://www.google.com/s2/favicons?domain=${domain}&sz=64`;\n } catch {\n // Invalid URL, skip favicon\n }\n\n return {\n title: r.title,\n url: r.url,\n snippet: r.content,\n description: r.content, // Use content as description for consistency\n content: r.content, // Map to content field\n score: r.score,\n publishedDate: r.published_date,\n domain,\n favicon,\n };\n }),\n totalResults: data.results.length,\n };\n }\n\n private async searchWithSerper(\n endpoint: string,\n apiKey: string,\n input: {\n query: string;\n maxResults?: number;\n searchType?: 'general' | 'news';\n days?: number;\n language?: string;\n country?: string;\n includeDomains?: string[];\n excludeDomains?: string[];\n }\n ): Promise<SearchResponse> {\n const isNews = input.searchType === 'news';\n const days = input.days || (isNews ? 7 : undefined);\n\n // Use news endpoint for news searches\n const searchEndpoint = isNews ? 'https://google.serper.dev/news' : endpoint;\n\n const requestBody: any = {\n q: input.query,\n num: input.maxResults || 10,\n };\n\n // Add language parameter (Serper native support)\n // Serper uses hl (host language) parameter\n if (input.language) {\n // Convert language codes to Serper format\n let langCode = input.language;\n if (langCode === 'zh') langCode = 'zh-CN'; // Default Chinese to Simplified\n requestBody.hl = langCode;\n }\n\n // Add country/location parameter (Serper native support)\n // Serper uses gl (geolocation) parameter\n if (input.country) {\n requestBody.gl = input.country.toLowerCase();\n }\n\n // Add domain filters\n if (input.includeDomains && input.includeDomains.length > 0) {\n // Serper doesn't have include_domains, but we can modify the query\n const siteFilters = input.includeDomains.map(d => `site:${d}`).join(' OR ');\n requestBody.q = `${input.query} (${siteFilters})`;\n }\n\n if (input.excludeDomains && input.excludeDomains.length > 0) {\n // Add exclude site filters to query\n const excludeFilters = input.excludeDomains.map(d => `-site:${d}`).join(' ');\n requestBody.q = `${requestBody.q} ${excludeFilters}`;\n }\n\n // Add time range for news\n if (isNews && days) {\n // Serper uses tbs parameter for time filtering\n // qdr:d = past day, qdr:w = past week, qdr:m = past month, qdr:y = past year\n if (days <= 1) {\n requestBody.tbs = 'qdr:d';\n } else if (days <= 7) {\n requestBody.tbs = 'qdr:w';\n } else if (days <= 30) {\n requestBody.tbs = 'qdr:m';\n } else {\n requestBody.tbs = 'qdr:y';\n }\n }\n\n const response = await fetch(searchEndpoint, {\n method: 'POST',\n headers: {\n 'X-API-KEY': apiKey,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n throw new Error(`Serper search failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n\n // News results are in data.news array, regular results in data.organic\n const resultsArray = isNews ? (data.news || []) : (data.organic || []);\n\n return {\n provider: 'serper',\n query: input.query,\n results: resultsArray.map((r: any) => {\n // Extract domain from URL for favicon\n let domain = '';\n let favicon = '';\n try {\n const urlObj = new URL(r.link);\n domain = urlObj.hostname.replace('www.', '');\n // Use Google's favicon service\n favicon = `https://www.google.com/s2/favicons?domain=${domain}&sz=64`;\n } catch {\n // Invalid URL, skip favicon\n }\n\n return {\n title: r.title,\n url: r.link,\n snippet: r.snippet,\n description: r.snippet, // Use snippet as description for consistency\n content: r.snippet, // Also map to content for fallback\n publishedDate: r.date,\n domain,\n favicon,\n };\n }),\n totalResults: data.searchInformation?.totalResults,\n };\n }\n\n /**\n * DuckDuckGo HTML search — zero-config fallback (no API key needed).\n *\n * Uses the DuckDuckGo HTML endpoint to scrape search results.\n * Lower quality than keyed providers but always available.\n */\n private async searchWithDuckDuckGo(\n endpoint: string,\n input: {\n query: string;\n maxResults?: number;\n searchType?: 'general' | 'news';\n days?: number;\n language?: string;\n country?: string;\n includeDomains?: string[];\n excludeDomains?: string[];\n }\n ): Promise<SearchResponse> {\n const maxResults = input.maxResults || 10;\n\n // Build the query, incorporating domain filters if specified\n let query = input.query;\n if (input.includeDomains && input.includeDomains.length > 0) {\n const siteFilters = input.includeDomains.map(d => `site:${d}`).join(' OR ');\n query = `${query} (${siteFilters})`;\n }\n if (input.excludeDomains && input.excludeDomains.length > 0) {\n const excludeFilters = input.excludeDomains.map(d => `-site:${d}`).join(' ');\n query = `${query} ${excludeFilters}`;\n }\n\n // DuckDuckGo HTML form POST\n const body = new URLSearchParams({ q: query, b: '' });\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'OpenViber/1.0 (search fallback)',\n },\n body: body.toString(),\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n throw new Error(`DuckDuckGo search failed: ${response.status} ${response.statusText}`);\n }\n\n const html = await response.text();\n\n // Parse results from the HTML response\n const results: SearchResult[] = [];\n\n // DuckDuckGo HTML results are in <div class=\"result\"> blocks\n // Each contains an <a class=\"result__a\"> for title+url and\n // <a class=\"result__snippet\"> for the snippet\n const resultBlocks = html.split(/class=\"result\\s/);\n\n for (let i = 1; i < resultBlocks.length && results.length < maxResults; i++) {\n const block = resultBlocks[i];\n\n // Extract URL from result__a href\n const urlMatch = block.match(/class=\"result__a\"\\s+href=\"([^\"]+)\"/);\n if (!urlMatch) continue;\n\n let url = urlMatch[1];\n // DuckDuckGo wraps URLs in a redirect; extract the actual URL\n const uddgMatch = url.match(/uddg=([^&]+)/);\n if (uddgMatch) {\n url = decodeURIComponent(uddgMatch[1]);\n }\n\n // Extract title from result__a inner text\n const titleMatch = block.match(/class=\"result__a\"[^>]*>([^<]+)/);\n const title = titleMatch\n ? titleMatch[1].replace(/'/g, \"'\").replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '\"').trim()\n : url;\n\n // Extract snippet from result__snippet\n const snippetMatch = block.match(/class=\"result__snippet\"[^>]*>([\\s\\S]*?)(?:<\\/a>|<\\/td>)/);\n const snippet = snippetMatch\n ? snippetMatch[1]\n .replace(/<\\/?b>/g, '')\n .replace(/<[^>]+>/g, '')\n .replace(/'/g, \"'\")\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .trim()\n : '';\n\n // Extract domain for favicon\n let domain = '';\n let favicon = '';\n try {\n const urlObj = new URL(url);\n domain = urlObj.hostname.replace('www.', '');\n favicon = `https://www.google.com/s2/favicons?domain=${domain}&sz=64`;\n } catch {\n // Invalid URL, skip favicon\n }\n\n if (url && title) {\n results.push({\n title,\n url,\n snippet,\n content: snippet,\n });\n }\n }\n\n return {\n provider: 'duckduckgo',\n query: input.query,\n results,\n totalResults: results.length,\n };\n }\n}","/**\n * WebTool - Simplified version using external services (Firecrawl/Jina)\n */\n\nimport { z } from 'zod';\nimport { Tool, ToolFunction, ToolMetadata, ToolConfig, ConfigSchema } from './base';\n\nexport class WebTool extends Tool {\n private config: ToolConfig = {\n jinaApiKey: null,\n firecrawlApiKey: null,\n defaultProvider: 'firecrawl', // firecrawl or jina\n timeout: 30000,\n maxContentLength: 100000,\n followRedirects: true,\n userAgent: 'Mozilla/5.0 (compatible; ViberBot/1.0)',\n enableJavaScript: false, // for providers that support it\n };\n\n getMetadata(): ToolMetadata {\n const jinaApiKey = this.getJinaApiKey();\n const firecrawlApiKey = this.getFirecrawlApiKey();\n\n let availableProviders: string[] = [];\n if (jinaApiKey) availableProviders.push('Jina');\n if (firecrawlApiKey) availableProviders.push('Firecrawl');\n\n return {\n id: 'web',\n name: 'Web Tools',\n description: availableProviders.length > 0\n ? `Extract web content, check URL availability, and crawl websites (Providers: ${availableProviders.join(', ')})`\n : 'Web content extraction, URL checking, and website crawling (requires API configuration)',\n category: 'web',\n };\n }\n\n getConfigSchema(): ConfigSchema {\n return {\n jinaApiKey: {\n name: 'Jina API Key',\n type: 'string',\n description: 'Jina API key for advanced content extraction',\n envVar: 'JINA_API_KEY',\n required: false,\n },\n firecrawlApiKey: {\n name: 'Firecrawl API Key',\n type: 'string',\n description: 'Firecrawl API key for JavaScript rendering',\n envVar: 'FIRECRAWL_API_KEY',\n required: false,\n },\n defaultProvider: {\n name: 'Default Provider',\n type: 'select',\n description: 'Default content extraction provider',\n options: ['firecrawl', 'jina'],\n defaultValue: 'firecrawl',\n required: false,\n },\n timeout: {\n name: 'Request Timeout',\n type: 'number',\n description: 'Request timeout in milliseconds',\n defaultValue: 30000,\n min: 1000,\n max: 120000,\n required: false,\n },\n maxContentLength: {\n name: 'Max Content Length',\n type: 'number',\n description: 'Maximum content length to extract (in characters)',\n defaultValue: 500000,\n required: false,\n },\n userAgent: {\n name: 'User Agent',\n type: 'string',\n description: 'Custom user agent string for HTTP requests',\n required: false,\n },\n enableJavaScript: {\n name: 'Enable JavaScript',\n type: 'boolean',\n description: 'Enable JavaScript rendering for dynamic content (requires compatible provider)',\n defaultValue: false,\n required: false,\n },\n };\n }\n\n getConfig(): ToolConfig {\n return this.config;\n }\n\n setConfig(config: ToolConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n isAvailable(): boolean {\n // Tool is available if at least one provider is configured\n return !!(this.getJinaApiKey() || this.getFirecrawlApiKey());\n }\n\n private getJinaApiKey(): string | null {\n return this.config.jinaApiKey || process.env.JINA_API_KEY || null;\n }\n\n private getFirecrawlApiKey(): string | null {\n return this.config.firecrawlApiKey || process.env.FIRECRAWL_API_KEY || null;\n }\n\n private get providers() {\n return {\n jina: {\n apiKey: this.getJinaApiKey(),\n endpoint: 'https://r.jina.ai',\n },\n firecrawl: {\n apiKey: this.getFirecrawlApiKey(),\n endpoint: 'https://api.firecrawl.dev/v0',\n },\n };\n }\n\n @ToolFunction({\n description: 'Extract and parse web page content into structured formats (markdown, text, HTML). Supports JavaScript-rendered pages and can capture metadata, links, and images. Uses Firecrawl or Jina services for reliable extraction.',\n input: z.object({\n url: z.string().url().describe('The URL to extract content from'),\n provider: z.enum(['jina', 'firecrawl']).optional().describe('Extraction provider to use (auto-selects if not specified)'),\n format: z.enum(['markdown', 'text', 'html', 'all']).optional().default('markdown').describe('Output format for the extracted content'),\n includeMetadata: z.boolean().optional().default(true).describe('Include page metadata (title, description, author, etc.)'),\n includeLinks: z.boolean().optional().default(false).describe('Extract and include all links found on the page'),\n includeImages: z.boolean().optional().default(false).describe('Extract and include all images found on the page'),\n waitForSelector: z.string().optional().describe('CSS selector to wait for before extraction (for dynamic content)'),\n screenshot: z.boolean().optional().default(false).describe('Capture a screenshot of the page (Firecrawl only)'),\n maxLength: z.number().optional().describe('Maximum content length in characters (truncates if exceeded)'),\n timeout: z.number().optional().default(30000).describe('Maximum time to wait for page load in milliseconds'),\n })\n })\n async fetch_webpage(input: {\n url: string;\n provider?: 'jina' | 'firecrawl';\n format?: 'markdown' | 'text' | 'html' | 'all';\n includeMetadata?: boolean;\n includeLinks?: boolean;\n includeImages?: boolean;\n waitForSelector?: string;\n screenshot?: boolean;\n maxLength?: number;\n timeout?: number;\n }) {\n // Auto-select provider if not specified\n const provider = input.provider || this.selectProvider();\n\n if (!provider) {\n throw new Error('No web extraction provider configured. Please configure Firecrawl or Jina API key.');\n }\n\n switch (provider) {\n case 'jina':\n return await this.extractWithJina(input);\n case 'firecrawl':\n return await this.extractWithFirecrawl(input);\n default:\n throw new Error(`Unknown provider: ${provider}`);\n }\n }\n\n @ToolFunction({\n description: 'Crawl a website to extract content from multiple pages. Follows links up to a specified depth and returns structured content from all discovered pages. Useful for documentation sites, blogs, or comprehensive site analysis.',\n input: z.object({\n url: z.string().url().describe('The starting URL for the crawl'),\n maxPages: z.number().min(1).max(100).optional().default(10).describe('Maximum number of pages to crawl (1-100)'),\n maxDepth: z.number().min(1).max(5).optional().default(2).describe('Maximum depth to follow links from the starting page (1-5)'),\n includePattern: z.string().optional().describe('Regex pattern - only crawl URLs matching this pattern'),\n excludePattern: z.string().optional().describe('Regex pattern - skip URLs matching this pattern'),\n format: z.enum(['markdown', 'text', 'html']).optional().default('markdown').describe('Output format for extracted content'),\n })\n })\n async crawl_website(input: {\n url: string;\n maxPages?: number;\n maxDepth?: number;\n includePattern?: string;\n excludePattern?: string;\n format?: 'markdown' | 'text' | 'html';\n }) {\n if (!this.providers.firecrawl.apiKey) {\n throw new Error('Web crawling requires Firecrawl API key to be configured');\n }\n\n // Start crawl job\n const startResponse = await fetch(`${this.providers.firecrawl.endpoint}/crawl`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.providers.firecrawl.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n url: input.url,\n crawlerOptions: {\n maxPages: input.maxPages || 10,\n maxDepth: input.maxDepth || 2,\n includes: input.includePattern ? [input.includePattern] : undefined,\n excludes: input.excludePattern ? [input.excludePattern] : undefined,\n },\n pageOptions: {\n onlyMainContent: true,\n },\n }),\n });\n\n if (!startResponse.ok) {\n const error = await startResponse.text();\n throw new Error(`Failed to start crawl: ${error}`);\n }\n\n const { jobId } = await startResponse.json();\n\n // Poll for results\n let attempts = 0;\n const maxAttempts = 60; // 5 minutes with 5 second intervals\n\n while (attempts < maxAttempts) {\n await new Promise(resolve => setTimeout(resolve, 5000)); // Wait 5 seconds\n\n const statusResponse = await fetch(`${this.providers.firecrawl.endpoint}/crawl/status/${jobId}`, {\n headers: {\n 'Authorization': `Bearer ${this.providers.firecrawl.apiKey}`,\n },\n });\n\n if (!statusResponse.ok) {\n throw new Error('Failed to check crawl status');\n }\n\n const status = await statusResponse.json();\n\n if (status.status === 'completed') {\n return {\n url: input.url,\n pages: status.data,\n totalPages: status.total,\n provider: 'firecrawl',\n crawledAt: new Date().toISOString(),\n };\n } else if (status.status === 'failed') {\n throw new Error(`Crawl failed: ${status.error}`);\n }\n\n attempts++;\n }\n\n throw new Error('Crawl timed out after 5 minutes');\n }\n\n @ToolFunction({\n description: 'Check if a URL is accessible and retrieve basic information about the resource. Returns HTTP status, content type, size, and last modified date without downloading the full content.',\n input: z.object({\n url: z.string().url().describe('The URL to check for accessibility'),\n timeout: z.number().optional().default(5000).describe('Maximum time to wait for response in milliseconds'),\n })\n })\n async check_url(input: { url: string; timeout?: number }) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), input.timeout || 5000);\n\n try {\n const response = await fetch(input.url, {\n method: 'HEAD',\n headers: {\n 'User-Agent': this.config.userAgent || 'Mozilla/5.0 (compatible; ViberBot/1.0)',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n return {\n url: input.url,\n accessible: response.ok,\n statusCode: response.status,\n statusText: response.statusText,\n contentType: response.headers.get('content-type'),\n contentLength: response.headers.get('content-length'),\n lastModified: response.headers.get('last-modified'),\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n return {\n url: input.url,\n accessible: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n }\n\n private selectProvider(): string | null {\n if (this.providers.firecrawl.apiKey) return 'firecrawl';\n if (this.providers.jina.apiKey) return 'jina';\n return null;\n }\n\n private async extractWithJina(input: any) {\n const provider = this.providers.jina;\n\n if (!provider.apiKey) {\n throw new Error('Jina API key not configured');\n }\n\n // Jina uses URL-based API\n const jinaUrl = `${provider.endpoint}/${input.url}`;\n\n const headers: Record<string, string> = {\n 'Accept': 'application/json',\n 'Authorization': `Bearer ${provider.apiKey}`,\n };\n\n // Add format preferences\n if (input.format === 'markdown') {\n headers['X-Return-Format'] = 'markdown';\n } else if (input.format === 'text') {\n headers['X-Return-Format'] = 'text';\n }\n\n const response = await fetch(jinaUrl, {\n headers,\n signal: AbortSignal.timeout(input.timeout || 30000),\n });\n\n if (!response.ok) {\n throw new Error(`Jina extraction failed: ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type');\n let result: any;\n\n if (contentType?.includes('application/json')) {\n result = await response.json();\n } else {\n const text = await response.text();\n result = {\n content: text,\n format: input.format || 'markdown',\n };\n }\n\n // Apply max length if specified\n let content = result.content || result.text || result.markdown;\n if (input.maxLength && content && content.length > input.maxLength) {\n content = content.substring(0, input.maxLength) + '...';\n }\n\n return {\n url: input.url,\n title: result.title,\n content,\n markdown: result.markdown,\n text: result.text,\n html: result.html,\n metadata: result.metadata ? {\n description: result.metadata.description,\n author: result.metadata.author,\n publishedDate: result.metadata.publishedDate,\n keywords: result.metadata.keywords,\n language: result.metadata.language,\n image: result.metadata.ogImage || result.metadata.image,\n } : undefined,\n links: input.includeLinks ? result.links : undefined,\n images: input.includeImages ? result.images : undefined,\n provider: 'jina',\n extractedAt: new Date().toISOString(),\n };\n }\n\n private async extractWithFirecrawl(input: any) {\n const provider = this.providers.firecrawl;\n if (!provider.apiKey) {\n throw new Error('Firecrawl API key not configured');\n }\n\n const response = await fetch(`${provider.endpoint}/scrape`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${provider.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n url: input.url,\n pageOptions: {\n onlyMainContent: true,\n includeHtml: input.format === 'html' || input.format === 'all',\n screenshot: input.screenshot,\n waitFor: input.waitForSelector ? parseInt(input.waitForSelector) : undefined,\n },\n timeout: input.timeout,\n }),\n signal: AbortSignal.timeout(input.timeout || 30000),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Firecrawl extraction failed: ${error}`);\n }\n\n const data = await response.json();\n\n if (!data.success) {\n throw new Error(`Firecrawl extraction failed: ${data.error}`);\n }\n\n const result = data.data;\n\n // Apply max length if specified\n let content = result.markdown || result.content;\n if (input.maxLength && content && content.length > input.maxLength) {\n content = content.substring(0, input.maxLength) + '...';\n }\n\n return {\n url: input.url,\n title: result.metadata?.title,\n content,\n markdown: result.markdown,\n text: result.content,\n html: result.html,\n metadata: {\n description: result.metadata?.description,\n author: result.metadata?.author,\n publishedDate: result.metadata?.publishedTime,\n modifiedDate: result.metadata?.modifiedTime,\n keywords: result.metadata?.keywords?.split(',').map((k: string) => k.trim()),\n language: result.metadata?.language,\n image: result.metadata?.ogImage,\n favicon: result.metadata?.favicon,\n },\n links: input.includeLinks ? result.links : undefined,\n images: input.includeImages ? result.images : undefined,\n screenshot: input.screenshot ? result.screenshot : undefined,\n provider: 'firecrawl',\n extractedAt: new Date().toISOString(),\n };\n }\n}","import { z } from \"zod\";\nimport WebSocket from \"ws\";\nimport { Tool, ToolFunction, ToolMetadata, ToolConfig, ConfigSchema } from \"./base\";\n\n// --- BrowserCDP Implementation ---\n\nexport interface CDPTarget {\n id: string;\n type: string;\n title: string;\n url: string;\n webSocketDebuggerUrl?: string;\n}\n\nexport interface BrowserCDPConfig {\n host?: string;\n port?: number;\n}\n\nexport class BrowserCDP {\n private host: string;\n private port: number;\n private messageId = 0;\n\n constructor(config: BrowserCDPConfig = {}) {\n this.host = config.host || \"localhost\";\n this.port = config.port || 9222;\n }\n\n /**\n * List all available targets (pages, iframes, etc.)\n */\n async listTargets(): Promise<CDPTarget[]> {\n const res = await fetch(`http://${this.host}:${this.port}/json`);\n if (!res.ok) {\n throw new Error(`CDP not available at ${this.host}:${this.port}`);\n }\n return await res.json();\n }\n\n /**\n * Find a target by predicate\n */\n async findTarget(predicate: (t: CDPTarget) => boolean): Promise<CDPTarget | undefined> {\n const targets = await this.listTargets();\n return targets.find(predicate);\n }\n\n /**\n * Execute (evaluate) JavaScript in a specific target\n */\n async evaluate<T = any>(\n target: CDPTarget | string,\n expression: string,\n awaitPromise = false\n ): Promise<T> {\n const wsUrl = typeof target === \"string\" ? target : target.webSocketDebuggerUrl;\n if (!wsUrl) throw new Error(\"Target has no WebSocket URL\");\n\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(wsUrl);\n const id = ++this.messageId;\n\n const timeout = setTimeout(() => {\n ws.close();\n reject(new Error(\"CDP evaluation timeout\"));\n }, 10000);\n\n ws.on(\"open\", () => {\n ws.send(JSON.stringify({\n id,\n method: \"Runtime.evaluate\",\n params: {\n expression,\n returnByValue: true,\n awaitPromise\n }\n }));\n });\n\n ws.on(\"message\", (data: string) => {\n try {\n const msg = JSON.parse(data);\n if (msg.id === id) {\n clearTimeout(timeout);\n ws.close();\n\n if (msg.error) {\n reject(new Error(msg.error.message));\n } else if (msg.result?.exceptionDetails) {\n reject(new Error(`Runtime exception: ${msg.result.exceptionDetails.text}`));\n } else {\n resolve(msg.result?.result?.value);\n }\n }\n } catch (err) {\n clearTimeout(timeout);\n ws.close();\n reject(err);\n }\n });\n\n ws.on(\"error\", (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n }\n /**\n * Check if text exists in the page body\n */\n async hasText(target: CDPTarget | string, text: string): Promise<boolean> {\n return this.evaluate<boolean>(target, `document.body.innerText.includes(\"${text}\")`);\n }\n\n /**\n * Click an element containing specific text\n */\n async clickOnText(target: CDPTarget | string, text: string, tag: string = \"button\"): Promise<boolean> {\n return this.evaluate<boolean>(target, `\n (function() {\n // Helper to find element by text\n const elements = Array.from(document.querySelectorAll(\"${tag}\"));\n const el = elements.find(e => e.textContent.includes(\"${text}\"));\n if (el) {\n el.click();\n return true;\n }\n return false;\n })()\n `);\n }\n\n /**\n * Get a simplified DOM snapshot (useful for LLM context)\n */\n async getDomSnapshot(target: CDPTarget | string): Promise<string> {\n return this.evaluate<string>(target, `\n (function() {\n // Simple DOM serializer to text\n return document.body.innerText;\n })()\n `);\n }\n}\n\n// --- BrowserTool Wrapper ---\n\nexport class BrowserTool extends Tool {\n private cdp: BrowserCDP | null = null;\n\n getMetadata(): ToolMetadata {\n return {\n id: \"browser\",\n name: \"Browser Automation\",\n description: \"Control a web browser using Chrome DevTools Protocol (CDP)\",\n category: \"browser\",\n };\n }\n\n isAvailable(): boolean {\n return true; // Or check if Chrome is running?\n }\n\n private async getCdp(): Promise<BrowserCDP> {\n if (!this.cdp) {\n this.cdp = new BrowserCDP();\n }\n return this.cdp;\n }\n\n @ToolFunction({\n description: \"Launch or connect to a browser instance\",\n input: z.object({\n headless: z.boolean().optional().default(false),\n })\n })\n async launch_browser(input: { headless?: boolean }) {\n // This might be a no-op if we assume connecting to existing\n return { success: true, message: \"Browser connection managed by CDP\" };\n }\n\n @ToolFunction({\n description: \"List all open browser pages/targets\",\n input: z.object({})\n })\n async list_targets() {\n const cdp = await this.getCdp();\n return await cdp.listTargets();\n }\n\n @ToolFunction({\n description: \"Find a browser page that contains specific text\",\n input: z.object({\n text: z.string().describe(\"Text to search for\"),\n })\n })\n async find_page_with_text(input: { text: string }) {\n const cdp = await this.getCdp();\n const targets = await cdp.listTargets();\n const pages = targets.filter((t: CDPTarget) => t.type === 'page');\n\n for (const page of pages) {\n const hasIt = await cdp.hasText(page, input.text);\n if (hasIt) return { found: true, targetId: page.id, title: page.title, url: page.url };\n }\n return { found: false };\n }\n\n @ToolFunction({\n description: \"Click on an element containing specific text\",\n input: z.object({\n text: z.string().describe(\"Text of the element to click\"),\n targetId: z.string().optional().describe(\"Specific page ID to target (optional)\"),\n })\n })\n async click_element(input: { text: string, targetId?: string }) {\n const cdp = await this.getCdp();\n let page: CDPTarget | undefined; // Initialize page as CDPTarget or undefined\n\n if (input.targetId) {\n // If targetId is provided, we need to find the full CDPTarget object\n // as the evaluate method requires webSocketDebuggerUrl\n const targets = await cdp.listTargets();\n page = targets.find((t: CDPTarget) => t.id === input.targetId);\n } else {\n const targets = await cdp.listTargets();\n page = targets.find((t: CDPTarget) => t.type === 'page' && !t.url.startsWith('chrome'));\n }\n\n if (!page) throw new Error(\"No active page found or targetId not found\");\n\n await cdp.clickOnText(page, input.text);\n return { success: true, message: `Clicked element with text \"${input.text}\"` };\n }\n}\n","import { z } from \"zod\";\nimport { Tool, ToolFunction, ToolMetadata, ToolConfig, ConfigSchema } from \"./base\";\nimport { exec } from \"child_process\";\nimport { promisify } from \"util\";\n\n// --- AppleScript Helper ---\n\nconst execAsync = promisify(exec);\n\nasync function runAppleScript(script: string): Promise<string> {\n const command = `osascript -e '${script}'`;\n try {\n const { stdout } = await execAsync(command);\n return stdout.trim();\n } catch (error: any) {\n throw new Error(`AppleScript failed: ${error.message}`);\n }\n}\n\n// --- DesktopTool Wrapper ---\n\nexport class DesktopTool extends Tool {\n getMetadata(): ToolMetadata {\n return {\n id: \"desktop\",\n name: \"Desktop Automation\",\n description: \"Control desktop applications using AppleScript\",\n category: \"system\",\n };\n }\n\n isAvailable(): boolean {\n return process.platform === \"darwin\";\n }\n\n @ToolFunction({\n description: \"Open an application by name\",\n input: z.object({\n appName: z.string().describe(\"Name of the application\"),\n })\n })\n async open_app(input: { appName: string }) {\n await runAppleScript(`tell application \"${input.appName}\" to activate`);\n return { success: true, message: `Opened/Activated ${input.appName}` };\n }\n\n @ToolFunction({\n description: \"Bring an application to the front\",\n input: z.object({\n appName: z.string().describe(\"Name of the application\"),\n })\n })\n async activate_app(input: { appName: string }) {\n await runAppleScript(`tell application \"${input.appName}\" to activate`);\n return { success: true, message: `Activated ${input.appName}` };\n }\n\n @ToolFunction({\n description: \"Type text into the currently focused window\",\n input: z.object({\n text: z.string().describe(\"Text to type\"),\n })\n })\n async type_text(input: { text: string }) {\n const safeText = input.text.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n await runAppleScript(`tell application \"System Events\" to keystroke \"${safeText}\"`);\n return { success: true, message: `Typed \"${input.text}\"` };\n }\n}\n","import * as path from \"path\";\n\n/**\n * Security utilities for OpenViber\n * Handles path sandboxing and command sanitization\n */\n\nexport class SecurityGuard {\n private workspaceRoot: string;\n private allowedCommands: RegExp[] | null = null; // null means all allowed except blocked\n private blockedCommands: RegExp[] = [\n // Dangerous system modification\n /\\brm\\s+(-r|-f|-rf|-fr)\\s+(\\/|(\\.|\\.\\.|\\*)(\\/)?(\\s|$))/, // rm -rf /, ., .., *\n /\\bmkfs/, // format disk\n /\\bdd\\b/, // low-level copy\n /\\bchown\\b/, // change ownership\n /\\bchmod\\b/, // change permissions (broadly)\n /:(){:|:&};:/, // fork bomb\n /\\bwget\\b/, // download (use specialized tool instead)\n /\\bcurl\\b/, // download (use specialized tool instead)\n /\\bssh\\b/, // remote connection (use specialized tool)\n /\\bsudo\\b/, // privilege escalation\n ];\n\n constructor(workspaceRoot: string) {\n this.workspaceRoot = path.resolve(workspaceRoot);\n }\n\n /**\n * Validate that a path is within the workspace\n * Returns the resolved absolute path if valid, throws error if not\n */\n validatePath(targetPath: string, allowAbsolute = false): string {\n const resolved = path.resolve(this.workspaceRoot, targetPath);\n \n // Check if path is within workspace\n if (!resolved.startsWith(this.workspaceRoot) && !allowAbsolute) {\n throw new Error(\n `Security Error: Path '${targetPath}' is outside the allowed workspace '${this.workspaceRoot}'`\n );\n }\n\n return resolved;\n }\n\n /**\n * Check if a shell command is safe to execute\n * Throws error if command matches denied patterns\n */\n validateCommand(command: string): void {\n const normalized = command.trim();\n\n // Check blocked patterns\n for (const pattern of this.blockedCommands) {\n if (pattern.test(normalized)) {\n throw new Error(\n `Security Error: Command contains blocked pattern: ${pattern}`\n );\n }\n }\n }\n\n /**\n * Add a custom blocked command pattern\n */\n addBlockedCommand(pattern: RegExp): void {\n this.blockedCommands.push(pattern);\n }\n}\n","/**\n * Secure Shell Tool\n * Provides controlled shell execution with sandboxing and timeout\n */\n\nimport { z } from \"zod\";\nimport { exec } from \"child_process\";\nimport {\n Tool,\n ToolFunction,\n ToolMetadata,\n ToolConfig,\n ConfigSchema,\n} from \"./base\";\nimport { SecurityGuard } from \"../utils/security\";\n\nexport class ShellTool extends Tool {\n private config: ToolConfig = {\n timeoutMs: 30000, // 30 seconds default\n restrictToWorkspace: true,\n };\n private security: SecurityGuard;\n\n constructor() {\n super();\n this.security = new SecurityGuard(process.cwd());\n }\n\n getMetadata(): ToolMetadata {\n return {\n id: \"shell\",\n name: \"Shell Executor\",\n description: \"Execute shell commands securely within the workspace\",\n category: \"system\",\n };\n }\n\n getConfigSchema(): ConfigSchema {\n return {\n timeoutMs: {\n name: \"Timeout (ms)\",\n type: \"number\",\n description: \"Maximum execution time in milliseconds\",\n defaultValue: 30000,\n required: false,\n },\n restrictToWorkspace: {\n name: \"Restrict to Workspace\",\n type: \"boolean\",\n description: \"Enforce workspace path restrictions\",\n defaultValue: true,\n required: false,\n },\n };\n }\n\n getConfig(): ToolConfig {\n return this.config;\n }\n\n setConfig(config: ToolConfig): void {\n this.config = { ...this.config, ...config };\n }\n\n @ToolFunction({\n description: \"Execute a shell command. Use this to run CLI tools, scripts, or system commands.\",\n input: z.object({\n command: z.string().describe(\"The shell command to execute\"),\n cwd: z.string().optional().describe(\"Working directory for execution (defaults to workspace root)\"),\n timeout: z.number().optional().describe(\"Timeout in milliseconds (overrides config)\"),\n }),\n })\n async shell_run(input: { command: string; cwd?: string; timeout?: number }) {\n // 1. Security Check: Command Patterns\n this.security.validateCommand(input.command);\n\n // 2. Security Check: CWD Sandboxing\n // Resolve cwd against workspace root (process.cwd() for now)\n const targetCwd = input.cwd || process.cwd();\n \n // If we have a spaceId, we might want to target the space root?\n // For now, let's stick to the simple SecurityGuard logic which uses the process root.\n // In a real multi-tenant setup, we'd update SecurityGuard with the specific space root.\n if (this.config.restrictToWorkspace) {\n this.security.validatePath(targetCwd);\n }\n\n const timeout = input.timeout || this.config.timeoutMs;\n\n return new Promise((resolve, reject) => {\n exec(\n input.command,\n {\n cwd: targetCwd,\n timeout: timeout,\n maxBuffer: 10 * 1024 * 1024, // 10MB buffer\n },\n (error, stdout, stderr) => {\n if (error) {\n // Return error result instead of throwing, so the agent sees the failure\n return resolve({\n ok: false,\n command: input.command,\n exitCode: error.code || 1,\n stdout: stdout.trim(),\n stderr: stderr.trim() || error.message,\n });\n }\n\n resolve({\n ok: true,\n command: input.command,\n exitCode: 0,\n stdout: stdout.trim(),\n stderr: stderr.trim(),\n });\n }\n );\n });\n }\n}\n","/**\n * Schedule Job Tool - Create and manage scheduled jobs via natural language\n * \n * Enables: \"Check weather at 8am daily\" → Creates YAML job automatically\n */\n\nimport { z } from \"zod\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport * as yaml from \"yaml\";\nimport { homedir } from \"os\";\n\n// Natural language time patterns\nconst TIME_PATTERNS: Array<{ pattern: RegExp; toCron: (m: RegExpMatchArray) => string }> = [\n // \"8am daily\" or \"8:30am every day\"\n {\n pattern: /(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)\\s*(?:daily|every\\s*day)/i,\n toCron: (m) => {\n let hour = parseInt(m[1]);\n const minute = m[2] ? parseInt(m[2]) : 0;\n if (m[3].toLowerCase() === \"pm\" && hour !== 12) hour += 12;\n if (m[3].toLowerCase() === \"am\" && hour === 12) hour = 0;\n return `${minute} ${hour} * * *`;\n }\n },\n // \"every hour\"\n {\n pattern: /every\\s*hour/i,\n toCron: () => \"0 * * * *\"\n },\n // \"every N hours\"\n {\n pattern: /every\\s*(\\d+)\\s*hours?/i,\n toCron: (m) => `0 */${m[1]} * * *`\n },\n // \"every N minutes\"\n {\n pattern: /every\\s*(\\d+)\\s*minutes?/i,\n toCron: (m) => `*/${m[1]} * * * *`\n },\n // \"Monday 9am\" or \"on Monday at 9am\"\n {\n pattern: /(?:on\\s*)?(monday|tuesday|wednesday|thursday|friday|saturday|sunday)\\s*(?:at\\s*)?(\\d{1,2})(?::(\\d{2}))?\\s*(am|pm)?/i,\n toCron: (m) => {\n const days: Record<string, number> = {\n sunday: 0, monday: 1, tuesday: 2, wednesday: 3,\n thursday: 4, friday: 5, saturday: 6\n };\n const day = days[m[1].toLowerCase()];\n let hour = parseInt(m[2]);\n const minute = m[3] ? parseInt(m[3]) : 0;\n if (m[4]?.toLowerCase() === \"pm\" && hour !== 12) hour += 12;\n if (m[4]?.toLowerCase() === \"am\" && hour === 12) hour = 0;\n return `${minute} ${hour} * * ${day}`;\n }\n },\n // \"every 30 seconds\" (6-field cron)\n {\n pattern: /every\\s*(\\d+)\\s*seconds?/i,\n toCron: (m) => `*/${m[1]} * * * * *`\n },\n];\n\n/**\n * Parse natural language time to cron expression\n */\nfunction parseNaturalTime(input: string): string | null {\n for (const { pattern, toCron } of TIME_PATTERNS) {\n const match = input.match(pattern);\n if (match) {\n return toCron(match);\n }\n }\n return null;\n}\n\n/**\n * Get jobs directory path\n */\nfunction getJobsDir(): string {\n return process.env.OPENVIBER_JOBS_DIR || path.join(homedir(), \".openviber\", \"jobs\");\n}\n\n/**\n * Ensure jobs directory exists\n */\nasync function ensureJobsDir(): Promise<string> {\n const dir = getJobsDir();\n await fs.mkdir(dir, { recursive: true });\n return dir;\n}\n\n/**\n * Sanitize job name for filename\n */\nfunction sanitizeName(name: string): string {\n return name.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n}\n\n// Tool definitions using CoreTool interface (zod schema + execute function)\nexport const createJobTool = {\n description: `Create a scheduled job that runs automatically. Use natural language for timing like \"8am daily\", \"every hour\", \"Monday 9am\", \"every 30 minutes\". The job will execute the given task/prompt on the schedule.`,\n inputSchema: z.object({\n name: z.string().describe(\"Short name for the job, e.g. 'daily-weather'\"),\n schedule: z.string().describe(\"When to run, in natural language like '8am daily' or 'every hour'\"),\n task: z.string().describe(\"What the job should do - the prompt/task to execute\"),\n model: z.string().optional().describe(\"Model to use (default: deepseek/deepseek-chat)\"),\n skills: z.array(z.string()).optional().describe(\"Skills to enable for this job\"),\n }),\n execute: async (args: { name: string; schedule: string; task: string; model?: string; skills?: string[] }) => {\n const { name, schedule, task, model, skills } = args;\n // Parse natural language to cron\n let cronExpression = parseNaturalTime(schedule);\n\n // If not parsed, try using as-is (might be valid cron already)\n if (!cronExpression) {\n // Basic validation: should have 5-6 space-separated parts\n if (/^[\\d\\*\\/\\-\\,]+(\\s+[\\d\\*\\/\\-\\,]+){4,5}$/.test(schedule.trim())) {\n cronExpression = schedule.trim();\n } else {\n return {\n success: false,\n error: `Could not parse schedule \"${schedule}\". Try formats like \"8am daily\", \"every hour\", or \"every 30 minutes\".`\n };\n }\n }\n\n const jobName = sanitizeName(name);\n const jobsDir = await ensureJobsDir();\n const jobPath = path.join(jobsDir, `${jobName}.yaml`);\n\n const jobConfig = {\n name: name,\n description: `Scheduled job created via chat`,\n schedule: cronExpression,\n provider: \"openrouter\",\n model: model || \"deepseek/deepseek-chat\",\n skills: skills || [],\n prompt: task,\n };\n\n const yamlContent = yaml.stringify(jobConfig);\n await fs.writeFile(jobPath, yamlContent, \"utf8\");\n\n return {\n success: true,\n message: `Created job \"${name}\" - will run at schedule: ${cronExpression}`,\n jobPath,\n cronExpression,\n nextSteps: \"The scheduler will automatically pick up the new job within a few seconds.\"\n };\n }\n};\n\nexport const listJobsTool = {\n description: \"List all scheduled jobs\",\n inputSchema: z.object({}),\n execute: async () => {\n const jobsDir = getJobsDir();\n\n try {\n await fs.access(jobsDir);\n } catch {\n return { jobs: [], message: \"No jobs directory found. Create a job first.\" };\n }\n\n const files = await fs.readdir(jobsDir);\n const jobs: Array<{ name: string; schedule: string; task: string; enabled: boolean }> = [];\n\n for (const file of files) {\n if (file.endsWith(\".yaml\") || file.endsWith(\".yml\")) {\n const content = await fs.readFile(path.join(jobsDir, file), \"utf8\");\n try {\n const config = yaml.parse(content);\n jobs.push({\n name: config.name || file,\n schedule: config.schedule,\n task: config.prompt?.slice(0, 100) + (config.prompt?.length > 100 ? \"...\" : \"\"),\n enabled: !file.includes(\".disabled\")\n });\n } catch {\n // Skip invalid files\n }\n }\n }\n\n return { jobs, count: jobs.length };\n }\n};\n\nexport const deleteJobTool = {\n description: \"Delete a scheduled job by name\",\n inputSchema: z.object({\n name: z.string().describe(\"Name of the job to delete\")\n }),\n execute: async (args: { name: string }) => {\n const { name } = args;\n const jobsDir = getJobsDir();\n const jobName = sanitizeName(name);\n\n // Try both .yaml and .yml extensions\n for (const ext of [\".yaml\", \".yml\"]) {\n const jobPath = path.join(jobsDir, `${jobName}${ext}`);\n try {\n await fs.unlink(jobPath);\n return {\n success: true,\n message: `Deleted job \"${name}\". Changes take effect on next restart.`\n };\n } catch {\n // Try next extension\n }\n }\n\n return {\n success: false,\n error: `Job \"${name}\" not found`\n };\n }\n};\n\n// Export all schedule tools\nexport const scheduleTools: Record<string, any> = {\n create_scheduled_job: createJobTool,\n list_scheduled_jobs: listJobsTool,\n delete_scheduled_job: deleteJobTool,\n};\n","/**\n * Notify Tool - Send notifications to user\n *\n * Channels:\n * 1. Log file (~/.openviber/notifications.log) — always\n * 2. JSON file (~/.openviber/notifications.json) — for web UI polling\n * 3. macOS native notification (osascript) — if on macOS\n * 4. Console log — always\n */\n\nimport { z } from \"zod\";\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { homedir } from \"os\";\nimport { execSync } from \"child_process\";\n\nfunction getNotificationsDir(): string {\n return path.join(homedir(), \".openviber\");\n}\n\nfunction getLogPath(): string {\n return path.join(getNotificationsDir(), \"notifications.log\");\n}\n\nfunction getJsonPath(): string {\n return path.join(getNotificationsDir(), \"notifications.json\");\n}\n\ninterface Notification {\n id: string;\n timestamp: string;\n title?: string;\n message: string;\n priority: \"low\" | \"normal\" | \"high\";\n read: boolean;\n}\n\n/**\n * Send a macOS native notification via osascript.\n */\nfunction sendMacNotification(title: string, message: string): boolean {\n if (process.platform !== \"darwin\") return false;\n try {\n const safeTitle = title.replace(/\"/g, '\\\\\"');\n const safeMsg = message.replace(/\"/g, '\\\\\"').slice(0, 200);\n execSync(\n `osascript -e 'display notification \"${safeMsg}\" with title \"OpenViber\" subtitle \"${safeTitle}\"'`,\n { encoding: \"utf8\", stdio: \"pipe\", timeout: 5000 },\n );\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Append notification to JSON file (array of notifications).\n */\nasync function appendToJson(notification: Notification): Promise<void> {\n const jsonPath = getJsonPath();\n await fs.mkdir(path.dirname(jsonPath), { recursive: true });\n\n let notifications: Notification[] = [];\n try {\n const raw = await fs.readFile(jsonPath, \"utf8\");\n notifications = JSON.parse(raw);\n } catch {\n // File doesn't exist or is invalid — start fresh\n }\n\n notifications.push(notification);\n\n // Keep only the last 100 notifications\n if (notifications.length > 100) {\n notifications = notifications.slice(-100);\n }\n\n await fs.writeFile(jsonPath, JSON.stringify(notifications, null, 2), \"utf8\");\n}\n\nexport const notifyTool = {\n description:\n \"Send a notification to the user. Sends via macOS native notification, logs to file, and stores in JSON for the web UI. Use after completing an autonomous task to inform the human of results.\",\n inputSchema: z.object({\n message: z.string().describe(\"The notification message to send\"),\n title: z\n .string()\n .optional()\n .describe(\"Optional title/subject for the notification\"),\n priority: z\n .enum([\"low\", \"normal\", \"high\"])\n .optional()\n .describe(\"Priority level (default: normal)\"),\n }),\n execute: async (args: {\n message: string;\n title?: string;\n priority?: \"low\" | \"normal\" | \"high\";\n }) => {\n const { message, title, priority = \"normal\" } = args;\n const timestamp = new Date().toISOString();\n const logPath = getLogPath();\n const channels: string[] = [];\n\n // Ensure parent directory exists\n await fs.mkdir(path.dirname(logPath), { recursive: true });\n\n // 1. Log to file\n const logLine = `[${timestamp}] [${priority.toUpperCase()}] ${title ? title + \": \" : \"\"}${message}\\n`;\n await fs.appendFile(logPath, logLine, \"utf8\");\n channels.push(\"log\");\n\n // 2. JSON for web UI\n const notification: Notification = {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp,\n title,\n message,\n priority,\n read: false,\n };\n await appendToJson(notification);\n channels.push(\"json\");\n\n // 3. macOS native notification\n const macSent = sendMacNotification(title || \"Notification\", message);\n if (macSent) channels.push(\"macos\");\n\n // 4. Console log\n console.log(\n `📬 Notification: ${title ? title + \" - \" : \"\"}${message}`,\n );\n channels.push(\"console\");\n\n return {\n sent: true,\n channels,\n notificationId: notification.id,\n timestamp,\n message: `Notification sent via: ${channels.join(\", \")}`,\n };\n },\n};\n\nexport const listNotificationsTool = {\n description: \"List recent notifications that have been sent\",\n inputSchema: z.object({\n limit: z\n .number()\n .optional()\n .describe(\"Number of notifications to show (default: 10)\"),\n unreadOnly: z\n .boolean()\n .optional()\n .describe(\"If true, show only unread notifications\"),\n }),\n execute: async (args: { limit?: number; unreadOnly?: boolean }) => {\n const { limit = 10, unreadOnly = false } = args;\n const jsonPath = getJsonPath();\n\n try {\n const raw = await fs.readFile(jsonPath, \"utf8\");\n let notifications: Notification[] = JSON.parse(raw);\n\n if (unreadOnly) {\n notifications = notifications.filter((n) => !n.read);\n }\n\n notifications = notifications.slice(-limit);\n\n return {\n notifications,\n count: notifications.length,\n };\n } catch {\n return {\n notifications: [],\n count: 0,\n message: \"No notifications found\",\n };\n }\n },\n};\n\n// Export all notify tools\nexport const notifyTools: Record<string, any> = {\n notify: notifyTool,\n list_notifications: listNotificationsTool,\n};\n","/**\n * Tools Registry\n *\n * Dynamic tool discovery and management system.\n * Tools are discovered from tool classes using decorators.\n */\n\nimport { CoreTool } from \"../worker/tool\";\nimport { Tool } from \"./base\";\n\n// Import all tools\nimport { FileTool } from \"./file\";\nimport { SearchTool } from \"./search\";\nimport { WebTool } from \"./web\";\nimport { BrowserTool } from \"./browser\";\nimport { DesktopTool } from \"./desktop\";\nimport { ShellTool } from \"./shell\";\n\n// Standalone tools (AI SDK format)\nimport { scheduleTools } from \"./schedule\";\nimport { notifyTools } from \"./notify\";\n\nexport interface ToolInfo {\n id: string;\n name: string;\n description: string;\n category: string;\n icon?: string; // Icon name (Lucide icon name, Icons component key, or URL)\n tags?: string[]; // Tags for categorization and filtering\n features?: string[]; // List of features the tool provides\n tools: string[]; // Keep for backward compatibility\n functions?: any[]; // New field for function names/objects\n functionDetails?: Array<{\n name: string;\n description: string;\n parameters: any;\n }>; // Detailed function info\n configSchema?: any; // Configuration schema for the tool\n enabled?: boolean;\n}\n\n// Tool instances (created on demand)\nconst toolInstances = new Map<string, Tool>();\n\n// Available tool classes\nconst toolClasses = new Map<string, new () => Tool>([\n [\"file\", FileTool],\n [\"search\", SearchTool],\n [\"web\", WebTool],\n [\"browser\", BrowserTool],\n [\"desktop\", DesktopTool],\n [\"shell\", ShellTool],\n]);\n\n/**\n * Load tool configuration through DataAdapter\n */\nasync function loadToolConfig(_toolId: string): Promise<any> {\n // Tool configuration via data store was removed during refactoring.\n // Tools use environment variables and inline config instead.\n return {};\n}\n\n/**\n * Get or create a tool instance\n */\nexport function getToolInstance(toolId: string): Tool | null {\n if (!toolInstances.has(toolId)) {\n const ToolClass = toolClasses.get(toolId);\n if (!ToolClass) return null;\n\n try {\n const instance = new ToolClass();\n\n // Load configuration from file if available\n // This is async but we handle it synchronously for now\n // In production, configuration should be loaded at startup\n loadToolConfig(toolId)\n .then((config) => {\n if (Object.keys(config).length > 0) {\n instance.setConfig(config);\n }\n })\n .catch((error) => {\n console.error(`[getToolInstance] Error loading config for ${toolId}:`, error);\n });\n\n // Check if tool is available\n if (!instance.isAvailable()) {\n console.warn(`[getToolInstance] Tool ${toolId} is not available`);\n return null;\n }\n\n toolInstances.set(toolId, instance);\n } catch (error) {\n console.warn(`[Tools] Failed to initialize tool ${toolId}:`, error);\n return null;\n }\n }\n return toolInstances.get(toolId) || null;\n}\n\n// Static function details for server-side rendering\nconst staticFunctionDetails = {\n file: [\n {\n name: \"createFile\",\n description:\n \"Create a new file or overwrite an existing file with the specified content. Creates parent directories if they don't exist.\",\n parameters: {},\n },\n {\n name: \"readFile\",\n description:\n \"Read the contents of a file from the file system. Returns the file content along with metadata like size and modification time.\",\n parameters: {},\n },\n {\n name: \"deleteFile\",\n description:\n \"Delete a file from the file system. This operation is irreversible. The file must exist or an error will be thrown.\",\n parameters: {},\n },\n {\n name: \"listFiles\",\n description:\n \"List all files in a directory with optional recursive traversal and pattern filtering. Returns an array of file paths.\",\n parameters: {},\n },\n {\n name: \"moveFile\",\n description:\n \"Move or rename a file from one location to another. Creates parent directories if needed. The source file will no longer exist after this operation.\",\n parameters: {},\n },\n {\n name: \"copyFile\",\n description:\n \"Copy a file from one location to another. Creates parent directories if needed. The source file remains unchanged.\",\n parameters: {},\n },\n {\n name: \"fileExists\",\n description:\n \"Check if a file or directory exists at the specified path. Returns existence status and file metadata if it exists.\",\n parameters: {},\n },\n ],\n search: [\n {\n name: \"search\",\n description:\n \"Search the web for information using configured search providers (Tavily or Serper). Returns relevant web pages with titles, URLs, and snippets.\",\n parameters: {},\n },\n ],\n web: [\n {\n name: \"fetchWebpage\",\n description:\n \"Extract and parse web page content into structured formats (markdown, text, HTML). Supports JavaScript-rendered pages and can capture metadata, links, and images. Uses Firecrawl or Jina services for reliable extraction.\",\n parameters: {},\n },\n {\n name: \"crawlWebsite\",\n description:\n \"Crawl a website to extract content from multiple pages. Follows links up to a specified depth and returns structured content from all discovered pages. Useful for documentation sites, blogs, or comprehensive site analysis.\",\n parameters: {},\n },\n {\n name: \"checkUrl\",\n description:\n \"Check if a URL is accessible and retrieve basic information about the resource. Returns HTTP status, content type, size, and last modified date without downloading the full content.\",\n parameters: {},\n },\n ],\n shell: [\n {\n name: \"shell_run\",\n description: \"Execute a shell command securely within the workspace.\",\n parameters: {},\n },\n ],\n};\n\n/**\n * Get all tools info\n */\nexport function getToolProviders(): ToolInfo[] {\n // Check if we're in a server environment\n if (typeof window === \"undefined\") {\n // In server/edge runtime, some tools might not work due to Node.js dependencies\n // Return tool metadata without instantiation\n const tools: ToolInfo[] = [\n {\n id: \"file\",\n name: \"File System Tools\",\n description:\n \"Read, write, manage and manipulate files and directories in the local file system\",\n category: \"file\",\n icon: \"FolderOpen\",\n tags: [\"Files\", \"Storage\", \"Local\", \"System\", \"IO\"],\n tools: [\n \"createFile\",\n \"readFile\",\n \"deleteFile\",\n \"listFiles\",\n \"moveFile\",\n \"copyFile\",\n \"fileExists\",\n ],\n functions: [\n \"createFile\",\n \"readFile\",\n \"deleteFile\",\n \"listFiles\",\n \"moveFile\",\n \"copyFile\",\n \"fileExists\",\n ],\n functionDetails: staticFunctionDetails.file,\n configSchema: {\n basePath: {\n name: \"Base Path\",\n type: \"string\",\n description: \"Base directory for file operations\",\n defaultValue: process.cwd(),\n required: false,\n },\n allowAbsolutePaths: {\n name: \"Allow Absolute Paths\",\n type: \"boolean\",\n description:\n \"Allow operations on absolute paths outside the base directory\",\n defaultValue: false,\n required: false,\n },\n maxFileSize: {\n name: \"Max File Size\",\n type: \"number\",\n description: \"Maximum file size in bytes\",\n defaultValue: 10485760,\n required: false,\n },\n },\n enabled: true,\n },\n {\n id: \"shell\",\n name: \"Shell Executor\",\n description: \"Execute shell commands securely within the workspace\",\n category: \"system\",\n icon: \"Terminal\",\n tags: [\"Shell\", \"Command\", \"System\", \"Execute\", \"CLI\"],\n tools: [\"shell_run\"],\n functions: [\"shell_run\"],\n functionDetails: staticFunctionDetails.shell,\n configSchema: {\n timeoutMs: {\n name: \"Timeout (ms)\",\n type: \"number\",\n description: \"Maximum execution time in milliseconds\",\n defaultValue: 30000,\n required: false,\n },\n restrictToWorkspace: {\n name: \"Restrict to Workspace\",\n type: \"boolean\",\n description: \"Enforce workspace path restrictions\",\n defaultValue: true,\n required: false,\n },\n },\n enabled: true,\n },\n {\n id: \"search\",\n name: \"Web Search\",\n description:\n \"Search the web for current information using configured search providers\",\n category: \"search\",\n icon: \"Search\",\n tags: [\"Search\", \"Web\", \"Research\", \"Internet\", \"Information\"],\n tools: [\"search\"],\n functions: [\"search\"],\n functionDetails: staticFunctionDetails.search,\n configSchema: {\n defaultProvider: {\n name: \"默认搜索提供商\",\n type: \"select\",\n description: \"选择默认使用的搜索引擎提供商\",\n options: [\n { value: \"auto\", label: \"自动选择\", description: \"根据可用性自动选择最佳搜索引擎\" },\n { value: \"tavily\", label: \"Tavily\", description: \"专为 AI 优化的搜索引擎,提供高质量结构化结果\" },\n { value: \"serper\", label: \"Serper\", description: \"Google 搜索 API,提供全面的搜索结果\" },\n ],\n defaultValue: \"auto\",\n required: false,\n },\n enableFallback: {\n name: \"启用备用提供商\",\n type: \"boolean\",\n description: \"当主提供商失败时自动切换到备用提供商\",\n defaultValue: true,\n required: false,\n },\n tavilyApiKey: {\n name: \"Tavily API 密钥\",\n type: \"string\",\n description: \"用于 Tavily 网络搜索服务的 API 密钥。可以在此直接设置,或通过环境变量 TAVILY_API_KEY 提供\",\n envVar: \"TAVILY_API_KEY\",\n required: false,\n },\n serperApiKey: {\n name: \"Serper API 密钥\",\n type: \"string\",\n description: \"用于 Serper (Google 搜索) 服务的 API 密钥。可以在此直接设置,或通过环境变量 SERPER_API_KEY 提供\",\n envVar: \"SERPER_API_KEY\",\n required: false,\n },\n defaultLanguage: {\n name: \"默认语言\",\n type: \"select\",\n description: \"搜索结果的默认语言偏好\",\n options: [\n { value: \"auto\", label: \"自动检测\" },\n { value: \"zh-CN\", label: \"简体中文\" },\n { value: \"zh-TW\", label: \"繁体中文\" },\n { value: \"en\", label: \"English\" },\n { value: \"ja\", label: \"日本語\" },\n { value: \"ko\", label: \"한국어\" },\n ],\n defaultValue: \"auto\",\n required: false,\n },\n defaultCountry: {\n name: \"默认地区\",\n type: \"select\",\n description: \"搜索结果的默认地区偏好\",\n options: [\n { value: \"auto\", label: \"自动选择\" },\n { value: \"CN\", label: \"中国大陆\" },\n { value: \"TW\", label: \"中国台湾省\" },\n { value: \"HK\", label: \"中国香港\" },\n { value: \"US\", label: \"美国\" },\n { value: \"JP\", label: \"日本\" },\n { value: \"KR\", label: \"韩国\" },\n ],\n defaultValue: \"auto\",\n required: false,\n },\n defaultSearchType: {\n name: \"默认搜索类型\",\n type: \"select\",\n description: \"默认的搜索类型\",\n options: [\n { value: \"general\", label: \"常规搜索\" },\n { value: \"news\", label: \"新闻搜索\" },\n ],\n defaultValue: \"general\",\n required: false,\n },\n defaultNewsDays: {\n name: \"新闻时间范围\",\n type: \"number\",\n description: \"新闻搜索的默认时间范围(天数)\",\n defaultValue: 7,\n required: false,\n },\n includeDomains: {\n name: \"优先域名\",\n type: \"array\",\n description: \"优先显示这些域名的搜索结果(例如:[\\\"baidu.com\\\", \\\"zhihu.com\\\"])\",\n defaultValue: [],\n required: false,\n },\n excludeDomains: {\n name: \"排除域名\",\n type: \"array\",\n description: \"从搜索结果中排除这些域名\",\n defaultValue: [],\n required: false,\n },\n },\n enabled: true,\n },\n {\n id: \"web\",\n name: \"Web Tools\",\n description:\n \"Extract web content, check URL availability, and crawl websites\",\n category: \"web\",\n icon: \"Globe\",\n tags: [\"Web\", \"Extraction\", \"Crawling\", \"Content\", \"Scraping\"],\n tools: [\"fetchWebpage\", \"crawlWebsite\", \"checkUrl\"],\n functions: [\"fetchWebpage\", \"crawlWebsite\", \"checkUrl\"],\n functionDetails: staticFunctionDetails.web,\n configSchema: {\n firecrawlApiKey: {\n name: \"Firecrawl API Key\",\n type: \"password\",\n description: \"API key for Firecrawl web extraction service\",\n envVar: \"FIRECRAWL_API_KEY\",\n required: false,\n },\n jinaApiKey: {\n name: \"Jina API Key\",\n type: \"password\",\n description: \"API key for Jina web extraction service\",\n envVar: \"JINA_API_KEY\",\n required: false,\n },\n defaultProvider: {\n name: \"Default Provider\",\n type: \"select\",\n description: \"Preferred web extraction provider\",\n options: [\"firecrawl\", \"jina\"],\n defaultValue: \"firecrawl\",\n required: false,\n },\n },\n enabled: true,\n },\n ];\n return tools;\n }\n\n // Original client-side code\n const tools: ToolInfo[] = [];\n\n for (const [id, ToolClass] of toolClasses) {\n try {\n const instance = new ToolClass();\n const metadata = instance.getMetadata();\n\n // Only include if available\n if (instance.isAvailable()) {\n // Add tags based on tool ID\n const tags =\n id === \"file\"\n ? [\"Files\", \"Storage\", \"Local\", \"System\", \"IO\"]\n : id === \"search\"\n ? [\"Search\", \"Web\", \"Research\", \"Internet\", \"Information\"]\n : id === \"web\"\n ? [\"Web\", \"Extraction\", \"Crawling\", \"Content\", \"Scraping\"]\n : [];\n\n tools.push({\n ...metadata,\n tags,\n tools: instance.getToolNames(),\n functions: instance.getToolNames(),\n functionDetails: instance.getToolDetails(),\n configSchema: instance.getConfigSchema(),\n enabled: true,\n });\n }\n } catch (error) {\n console.warn(`[Tools] Failed to get metadata for tool ${id}:`, error);\n }\n }\n\n return tools;\n}\n\n/**\n * Get a specific tool info\n */\nexport function getToolProvider(toolId: string): ToolInfo | null {\n const ToolClass = toolClasses.get(toolId);\n if (!ToolClass) return null;\n\n try {\n const instance = new ToolClass();\n const metadata = instance.getMetadata();\n\n // Add tags based on tool ID\n const tags =\n toolId === \"file\"\n ? [\"Files\", \"Storage\", \"Local\", \"System\", \"IO\"]\n : toolId === \"search\"\n ? [\"Search\", \"Web\", \"Research\", \"Internet\", \"Information\"]\n : toolId === \"web\"\n ? [\"Web\", \"Extraction\", \"Crawling\", \"Content\", \"Scraping\"]\n : [];\n\n return {\n ...metadata,\n tags,\n tools: instance.getToolNames(),\n functions: instance.getToolNames(),\n functionDetails: instance.getToolDetails(),\n configSchema: instance.getConfigSchema(),\n enabled: instance.isAvailable(),\n };\n } catch (error) {\n console.warn(`[Tools] Failed to get metadata for tool ${toolId}:`, error);\n return null;\n }\n}\n\n/**\n * Enable or disable a tool\n */\nexport function setProviderEnabled(\n _toolId: string,\n _enabled: boolean\n): boolean {\n // For now, this is controlled by availability (API keys, etc)\n // In the future we might store enable/disable state separately\n console.warn(`[Tools] setProviderEnabled is not fully implemented yet`);\n return true;\n}\n\n/**\n * Build a tool map for specific tool IDs\n * This is the ONLY function that core/tool.ts imports\n */\nexport function buildToolMap(\n toolIds: string[],\n context?: { spaceId?: string }\n): Record<string, CoreTool> {\n const tools: Record<string, CoreTool> = {};\n\n // Standalone tools (AI SDK format, not class-based)\n const standaloneTools: Record<string, Record<string, any>> = {\n schedule: scheduleTools,\n notify: notifyTools,\n };\n\n for (const toolId of toolIds) {\n // Check if this is a standalone tool group (e.g., 'schedule', 'notify')\n if (toolId in standaloneTools) {\n Object.assign(tools, standaloneTools[toolId]);\n continue;\n }\n\n // Check if this is a tool class ID (e.g., 'file', 'web', 'search')\n if (toolClasses.has(toolId)) {\n // Get all functions from this tool class\n const tool = getToolInstance(toolId);\n if (tool) {\n // Set space context for space-aware tools\n if (context?.spaceId) {\n tool.setSpaceId(context.spaceId);\n }\n const toolFunctions = tool.getTools();\n // Add all functions from this tool class\n Object.assign(tools, toolFunctions);\n continue;\n }\n }\n\n // Check standalone tools for specific function names\n for (const [, standaloneFuncs] of Object.entries(standaloneTools)) {\n if (toolId in standaloneFuncs) {\n tools[toolId] = standaloneFuncs[toolId];\n continue;\n }\n }\n\n // Otherwise, try to find it as a specific function\n let found = false;\n\n\n\n for (const [id] of toolClasses) {\n const tool = getToolInstance(id);\n if (!tool) continue;\n\n // Set space context for space-aware tools\n if (context?.spaceId) {\n tool.setSpaceId(context.spaceId);\n }\n\n // Get all tool functions from this class\n const toolFunctions = tool.getTools();\n\n // Check if this tool has the requested function\n if (toolId in toolFunctions) {\n tools[toolId] = toolFunctions[toolId];\n found = true;\n break; // Found the tool, no need to check other classes\n }\n }\n\n if (!found) {\n console.warn(`[Tools] Tool not found: ${toolId}`);\n }\n }\n\n return tools;\n}\n\n/**\n * Get all available tool IDs\n * Useful for discovery/listing\n */\nexport function getAllToolIds(): string[] {\n const ids: string[] = [];\n\n for (const [toolId] of toolClasses) {\n const tool = getToolInstance(toolId);\n if (!tool) continue;\n\n const toolFunctions = tool.getTools();\n ids.push(...Object.keys(toolFunctions));\n }\n\n return ids;\n}\n\n/**\n * Get all available tool IDs for a specific tool\n */\nexport function getProviderToolIds(toolId: string): string[] {\n const tool = getToolInstance(toolId);\n if (!tool) return [];\n\n const toolFunctions = tool.getTools();\n return Object.keys(toolFunctions);\n}\n\n/**\n * Check if a tool ID is available\n */\nexport function isToolAvailable(toolId: string): boolean {\n for (const [id] of toolClasses) {\n const tool = getToolInstance(id);\n if (!tool) continue;\n\n const toolFunctions = tool.getTools();\n if (toolId in toolFunctions) {\n return true;\n }\n }\n\n return false;\n}\n\n// Export for backward compatibility\nexport function getAvailableTools(): string[] {\n return getAllToolIds();\n}\n\n// Backward compatibility exports (to be removed eventually)\nexport type ToolProviderInfo = ToolInfo;\n\n// Export registry functions for static access (no instantiation)\n","/**\n * Tool System for Viber\n *\n * Coordinates between custom tools and MCP tools.\n * Knows nothing about specific tool implementations.\n */\n\nimport { z } from \"zod\";\nimport { loadGlobalConfig } from \"./config\";\n\n// Core tool interface that AI SDK expects\nexport interface CoreTool {\n description: string;\n inputSchema: z.ZodSchema | any;\n execute: (args: any, context?: any) => Promise<any>;\n}\n\n// Cache for MCP clients\nconst mcpClients = new Map<string, any>();\n\n/** Progress callback for tools to emit intermediate updates */\nexport type ToolProgressCallback = (event: {\n kind: string;\n phase?: string;\n message?: string;\n data?: any;\n}) => void;\n\n/** Context passed through to tool execution */\nexport interface ToolContext {\n spaceId?: string;\n oauthTokens?: {\n google?: { accessToken: string; refreshToken?: string | null };\n [provider: string]: { accessToken: string; refreshToken?: string | null } | undefined;\n };\n /** Optional progress callback for tools to emit intermediate updates */\n onProgress?: ToolProgressCallback;\n}\n\n/**\n * Build a tool map for streamText from an array of tool IDs\n * Delegates to appropriate providers without knowing their internals\n */\nexport async function buildToolMap(\n toolIds: string[],\n context?: ToolContext\n): Promise<Record<string, CoreTool>> {\n const tools: Record<string, CoreTool> = {};\n\n // Load MCP server configurations to determine tool types\n // dataStore usage removed - simplified for now\n const globalConfig = await loadGlobalConfig();\n const mcpServers: any[] = globalConfig?.mcp_servers?.map((s) => ({ ...s, id: s.name })) || [];\n const mcpServerIds = new Set(mcpServers.map((s: any) => s.id));\n\n // Separate custom tools and MCP tools\n const customToolIds: string[] = [];\n const mcpToolIds: string[] = [];\n\n for (const id of toolIds) {\n // Check if it's an MCP server ID\n if (mcpServerIds.has(id)) {\n mcpToolIds.push(id);\n } else {\n customToolIds.push(id);\n }\n }\n\n // Load custom tools if needed\n if (customToolIds.length > 0) {\n const { buildToolMap: buildCustomToolMap } = await import(\"../tools\");\n const customTools = buildCustomToolMap(customToolIds, context);\n Object.assign(tools, customTools);\n }\n\n // Load MCP tools if needed\n if (mcpToolIds.length > 0) {\n const mcpTools = await loadMcpTools(mcpToolIds);\n Object.assign(tools, mcpTools);\n }\n\n return tools;\n}\n\n/**\n * Load MCP tools by ID\n * This is the only part that knows about MCP specifics\n */\nasync function loadMcpTools(ids: string[]): Promise<Record<string, CoreTool>> {\n const tools: Record<string, CoreTool> = {};\n\n // Group by server for efficient loading\n const serverGroups = new Map<string, string[]>();\n for (const id of ids) {\n // Handle both mcp:serverId format and direct serverId format\n let serverId = id;\n if (id.startsWith(\"mcp:\")) {\n const parts = id.split(\":\");\n serverId = parts[1] || id;\n }\n\n if (!serverGroups.has(serverId)) {\n serverGroups.set(serverId, []);\n }\n serverGroups.get(serverId)!.push(id);\n }\n\n // Load each server's tools\n for (const [serverId, toolIds] of serverGroups) {\n try {\n let mcpClient = mcpClients.get(serverId);\n\n if (!mcpClient) {\n // MCP client creation disabled - would require external mcp library\n // TODO: Implement MCP client when library is available\n console.warn(`[Tools] MCP client creation not implemented for: ${serverId}`);\n continue;\n }\n\n // Extract requested tools\n if (mcpClient && typeof mcpClient === \"object\") {\n // Get all tools from the MCP client\n const mcpTools = await mcpClient.tools();\n\n // Return all tools from this server\n for (const [toolName, tool] of Object.entries(mcpTools)) {\n if (isValidTool(tool)) {\n tools[toolName] = tool as CoreTool;\n }\n }\n }\n } catch (error) {\n console.error(`[Tools] Failed to load MCP server ${serverId}:`, error);\n }\n }\n\n return tools;\n}\n\n/**\n * Check if an object is a valid tool\n */\nexport function isValidTool(obj: any): boolean {\n return !!(\n obj &&\n typeof obj === \"object\" &&\n typeof obj.execute === \"function\" &&\n typeof obj.description === \"string\"\n );\n}\n\n/**\n * Clear MCP cache (useful for testing)\n */\nexport function clearToolCache(): void {\n mcpClients.clear();\n}\n","/**\n * ID Generator Utilities for Viber\n *\n * Simple, unique ID generation for documents and other entities.\n */\n\nimport { customAlphabet } from \"nanoid\";\n\n// Define safe character set for IDs (A-Za-z0-9_)\nconst ALPHABET_SAFE =\n \"abcdefghijklmnopqrstuvwxyz0123456789_ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\n/**\n * Generate a short, unique ID that's URL-safe\n * Uses a custom alphabet to ensure compatibility\n *\n * @param length Length of the ID (default: 8)\n * @returns A short, unique ID string\n */\nexport function generateShortId(length: number = 8): string {\n // Create a custom nanoid generator\n const nanoid = customAlphabet(ALPHABET_SAFE, length);\n\n // Generate ID and ensure first character is a letter\n let id = nanoid();\n while (!/^[a-zA-Z]/.test(id)) {\n id = nanoid();\n }\n\n return id;\n}\n\n/**\n * Generate a space ID with optional topic prefix\n *\n * @param topic Optional topic to use as prefix\n * @returns A space ID like 'aB3x_9Kp' (always clean random ID)\n */\nexport function generateSpaceId(topic?: string): string {\n // Always generate a clean 8-char random ID to avoid URL encoding issues\n // with non-ASCII characters in topics\n return generateShortId(8);\n}\n\n/**\n * Validate a document ID\n * Checks that the ID starts with a letter and contains only letters, numbers, and underscores\n *\n * @param id ID string to validate\n * @returns Boolean indicating if the ID is valid\n */\nexport function validateId(id: string): boolean {\n if (!id || typeof id !== \"string\" || id.trim() === \"\") {\n return false;\n }\n\n // ID must start with a letter and contain only letters, numbers, and underscores\n const idPattern = /^[a-zA-Z][a-zA-Z0-9_]*$/;\n return idPattern.test(id);\n}\n","import { CoreTool } from \"../worker/tool\";\nimport { createLogger } from \"../utils/logger\";\n\nconst log = createLogger(\"ToolRegistry\");\n\n/**\n * ToolRegistry — manages CoreTool objects that give the agent executable capabilities.\n *\n * Tools are separate from Skills (which are instruction packages).\n * Tools provide the agent's built-in capabilities: terminal access,\n * file operations, API calls, etc.\n *\n * Skills (SKILL.md) tell the agent HOW and WHEN to use these tools.\n */\nexport class ToolRegistry {\n private tools: Map<string, Record<string, CoreTool>> = new Map();\n\n /**\n * Register tools under a namespace (e.g. \"terminal\", \"github\").\n * Tools can be registered at startup and are available to all agents.\n */\n registerTools(namespace: string, tools: Record<string, CoreTool>): void {\n this.tools.set(namespace, tools);\n const toolNames = Object.keys(tools);\n log.info(`Registered ${toolNames.length} tools under '${namespace}'`, {\n data: { tools: toolNames },\n });\n }\n\n /**\n * Get tools registered under a specific namespace.\n */\n getTools(namespace: string): Record<string, CoreTool> {\n return this.tools.get(namespace) || {};\n }\n\n /**\n * Get all registered tools across all namespaces, flattened into one record.\n */\n getAllTools(): Record<string, CoreTool> {\n const all: Record<string, CoreTool> = {};\n for (const tools of this.tools.values()) {\n Object.assign(all, tools);\n }\n return all;\n }\n\n /**\n * Get tools for specific namespaces, flattened into one record.\n */\n getToolsFor(namespaces: string[]): Record<string, CoreTool> {\n const result: Record<string, CoreTool> = {};\n for (const ns of namespaces) {\n const tools = this.tools.get(ns);\n if (tools) {\n Object.assign(result, tools);\n }\n }\n return result;\n }\n\n /**\n * Check if a namespace has registered tools.\n */\n hasTools(namespace: string): boolean {\n return this.tools.has(namespace);\n }\n\n /**\n * Get all registered namespaces.\n */\n getNamespaces(): string[] {\n return Array.from(this.tools.keys());\n }\n}\n\n/** Global tool registry instance */\nexport const defaultToolRegistry = new ToolRegistry();\n","/**\n * Agent - Config-driven agent implementation\n *\n * Agents are defined entirely by configuration, not code.\n * Each agent is instantiated from a config object that defines\n * its role, tools, and LLM settings.\n */\n\nimport { generateText, streamText, stepCountIs } from \"ai\";\nimport type { LanguageModel, ModelMessage } from \"ai\";\nimport { getViberPath } from \"./config\";\nimport { ViberConfig } from \"../types\";\nimport { ConversationHistory, ViberMessage } from \"./message\";\nimport { getModelProvider } from \"./provider\";\nimport { preflightValidate, formatPreflightError } from \"./preflight\";\nimport { buildToolMap, CoreTool } from \"./tool\";\nimport { generateShortId } from \"../utils/id\";\n\nexport interface AgentContext {\n spaceId: string;\n taskId?: string;\n conversationHistory: ConversationHistory;\n metadata?: Record<string, any>;\n}\n\nexport interface AgentResponse {\n text: string;\n toolCalls?: any[];\n reasoning?: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * Config-driven Agent implementation\n * No subclasses needed - behavior is entirely config-driven\n */\nimport { defaultRegistry } from \"../skills/registry\";\nimport { defaultToolRegistry } from \"../tools/registry\";\n\n/**\n * Config-driven Agent implementation\n * No subclasses needed - behavior is entirely config-driven\n */\nexport class Agent {\n public id: string;\n public name: string;\n public description: string;\n public config: ViberConfig;\n\n // LLM configuration\n public provider: string;\n public model: string;\n public temperature?: number;\n public maxTokens?: number;\n public topP?: number;\n public frequencyPenalty?: number;\n public presencePenalty?: number;\n public systemPrompt?: string;\n\n // Agent configuration\n public tools: string[];\n public skills: string[];\n public personality?: string;\n\n // Execution limits\n public maxSteps: number;\n\n // Working mode\n public mode: \"always_ask\" | \"agent_decides\" | \"always_execute\";\n public requireApproval: Set<string>;\n\n // Skill state\n private skillInstructions: string = \"\";\n private loadedSkillTools: Record<string, any> = {};\n private skillsLoaded: boolean = false;\n\n // Proxy-aware fetch (set by runtime when proxy is configured)\n public proxyFetch?: typeof fetch;\n\n constructor(config: ViberConfig) {\n this.config = config;\n this.id = config.id || config.name;\n this.name = config.name;\n this.description = config.description;\n\n // LLM settings\n if (config.llm) {\n this.provider = config.llm.provider;\n this.model = config.llm.model;\n this.temperature = config.llm.settings?.temperature;\n this.maxTokens = config.llm.settings?.maxTokens;\n this.topP = config.llm.settings?.topP;\n this.frequencyPenalty = config.llm.settings?.frequencyPenalty;\n this.presencePenalty = config.llm.settings?.presencePenalty;\n this.systemPrompt = config.systemPrompt;\n } else {\n this.provider = config.provider!;\n this.model = config.model!;\n // Handle legacy/alternate config structure if needed, though types should prevent it\n // @ts-ignore\n this.temperature = config.temperature;\n // @ts-ignore\n this.maxTokens = config.maxTokens;\n // @ts-ignore\n this.topP = config.topP;\n // @ts-ignore\n this.frequencyPenalty = config.frequencyPenalty;\n // @ts-ignore\n this.presencePenalty = config.presencePenalty;\n this.systemPrompt = config.systemPrompt;\n }\n\n if (this.provider === \"viber\" || this.provider?.startsWith(\"viber-\")) {\n throw new Error(\n `Invalid provider '${this.provider}' for agent '${this.name}'. Viber is not an AI provider.`,\n );\n }\n\n this.tools = config.tools || [];\n this.skills = config.skills || [];\n // @ts-ignore\n this.personality = config.personality;\n // @ts-ignore\n this.maxSteps = config.maxSteps ?? 10;\n this.mode = resolveWorkingMode(config);\n this.requireApproval = resolveRequireApprovalTools(config);\n }\n\n /**\n * Ensure skills are loaded from registry.\n *\n * Skills and tools are separate concepts (per Agent Skills spec):\n * - Skills (SKILL.md) provide instructions — injected into the system prompt\n * for progressive discovery. The agent learns WHEN and HOW to do things.\n * - Tools (CoreTool) provide executable capabilities — registered in the\n * ToolRegistry and loaded by namespace.\n */\n private async ensureSkillsLoaded(): Promise<void> {\n if (this.skillsLoaded) return;\n\n if (this.skills && this.skills.length > 0) {\n const instructionParts: string[] = [];\n\n for (const skillId of this.skills) {\n // 1. Load SKILL.md instructions (progressive disclosure)\n const skill = await defaultRegistry.loadSkill(skillId);\n if (skill) {\n console.log(`[Agent] Loaded skill '${skillId}' with ${skill.instructions ? 'instructions' : 'no instructions'}`);\n instructionParts.push(`\\n### Skill: ${skill.metadata.name}`);\n instructionParts.push(skill.metadata.description);\n if (skill.instructions) {\n instructionParts.push(skill.instructions);\n }\n } else {\n console.warn(`[Agent] Skill '${skillId}' SKILL.md not found`);\n }\n\n // 2. Load tools from ToolRegistry (separate from skills)\n const tools = defaultToolRegistry.getTools(skillId);\n const toolNames = Object.keys(tools);\n if (toolNames.length > 0) {\n console.log(`[Agent] Loaded ${toolNames.length} tools for '${skillId}': ${toolNames.join(', ')}`);\n Object.assign(this.loadedSkillTools, tools);\n }\n }\n\n this.skillInstructions = instructionParts.join(\"\\n\\n\");\n }\n\n this.skillsLoaded = true;\n }\n\n /**\n * Get the system prompt for this agent\n */\n protected getSystemPrompt(context?: AgentContext): string {\n const segments: string[] = [];\n\n // Base identity\n segments.push(`You are ${this.name}.`);\n segments.push(this.description);\n\n // Personality\n if (this.personality) {\n segments.push(`\\nPersonality: ${this.personality}`);\n }\n\n // Skill Instructions\n if (this.skillInstructions) {\n segments.push(\"\\n=== ENABLED SKILLS ===\");\n segments.push(this.skillInstructions);\n segments.push(\"======================\\n\");\n }\n\n // Tool usage instructions\n if (\n (this.tools && this.tools.length > 0) ||\n Object.keys(this.loadedSkillTools).length > 0\n ) {\n segments.push(\"\\nIMPORTANT - TOOL USAGE:\");\n segments.push(\"You have tools available. To use a tool, you MUST:\");\n segments.push(\"1. Use the tool calling mechanism provided by the system\");\n segments.push(\n \"2. NEVER output tool calls as JSON, code blocks, or plain text\",\n );\n segments.push(\n \"When you need to call a tool, simply invoke it directly without any formatting.\",\n );\n if (Object.keys(this.loadedSkillTools).length > 0) {\n segments.push(\n \"When the user asks to use a skill by name (e.g. cursor-agent, terminal), one of your tools is for that—use each tool's description to decide when to call it.\",\n );\n }\n }\n\n // Primary coding CLI preference (from settings): steer agent when multiple coding CLIs are enabled\n // @ts-ignore\n const primaryCodingCli = this.config.primaryCodingCli as string | undefined;\n if (\n primaryCodingCli &&\n this.skills.includes(primaryCodingCli)\n ) {\n segments.push(\n \"\\nFor coding tasks, prefer the tools from the **\" +\n primaryCodingCli +\n \"** skill. Only use another coding CLI (e.g. codex_run, cursor_agent_run, gemini_run) if the user explicitly asks for it by name.\",\n );\n }\n\n // Custom system prompt\n if (this.systemPrompt) {\n segments.push(`\\n${this.systemPrompt}`);\n }\n\n // Context information\n if (context) {\n segments.push(\"\\nCurrent Context:\");\n segments.push(`- Space ID: ${context.spaceId}`);\n if (context.taskId) segments.push(`- Task ID: ${context.taskId}`);\n\n if (context.metadata) {\n // Add metadata fields\n for (const [key, value] of Object.entries(context.metadata)) {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n segments.push(`- ${key}: ${value}`);\n }\n }\n }\n }\n\n // Add current date and time context\n const now = new Date();\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const dayOfWeek = now.toLocaleDateString('en-US', { weekday: 'long' });\n segments.push(\"\\nCurrent Date/Time:\");\n segments.push(`- Date: ${now.toISOString().split('T')[0]} (${dayOfWeek})`);\n segments.push(`- Time: ${now.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: true })}`);\n segments.push(`- Timezone: ${timezone}`);\n\n return segments.join(\"\\n\");\n }\n\n /**\n * Get the model provider for this agent\n */\n public getModel(context?: {\n spaceId?: string;\n userId?: string;\n }): LanguageModel {\n const modelProvider = getModelProvider({\n provider: this.provider as any,\n modelName: this.model,\n spaceId: context?.spaceId,\n userId: context?.userId,\n proxyFetch: this.proxyFetch,\n });\n\n // OpenRouter API expects upstream provider/model only (e.g. \"deepseek/deepseek-chat\"), not \"openrouter/...\"\n const modelForApi =\n this.provider === \"openrouter\" && this.model.startsWith(\"openrouter/\")\n ? this.model.slice(\"openrouter/\".length)\n : this.model;\n\n return (modelProvider as any)(modelForApi) as LanguageModel;\n }\n\n /**\n * Get tools available to this agent.\n *\n * Converts CoreTool format ({inputSchema}) to AI SDK format ({parameters})\n * so that streamText() recognizes and exposes the tools to the model.\n */\n protected async getTools(context?: {\n spaceId?: string;\n metadata?: Record<string, unknown>;\n }): Promise<any> {\n const tools = { ...this.loadedSkillTools };\n\n // Only load config tools if configured\n if (this.tools && this.tools.length > 0) {\n try {\n const customTools = await buildToolMap(this.tools, context);\n Object.assign(tools, customTools);\n } catch (error) {\n console.error(`Failed to load tools for agent ${this.name}:`, error);\n }\n }\n\n // Convert CoreTool ({inputSchema, execute}) → AI SDK ({parameters, execute}).\n // The AI SDK silently ignores tools that lack a `parameters` property.\n // Also injects oauthTokens into the execution context for skills that need it.\n const oauthTokens = (context?.metadata as any)?.oauthTokens;\n const aiSdkTools: Record<string, any> = {};\n for (const [name, tool] of Object.entries(tools) as [string, any][]) {\n let converted: any;\n if (tool.parameters) {\n // Already in AI SDK format\n converted = { ...tool };\n } else if (tool.inputSchema) {\n // Convert CoreTool → AI SDK tool\n converted = {\n ...tool,\n parameters: tool.inputSchema,\n };\n } else {\n // No schema at all — pass through as-is\n converted = { ...tool };\n }\n\n // Wrap execute to inject oauthTokens and progress callback into context if available\n if (typeof converted.execute === \"function\") {\n const originalExecute = converted.execute;\n converted.execute = (args: any, aiSdkContext?: any) => {\n const enrichedContext = { ...aiSdkContext };\n if (oauthTokens) {\n enrichedContext.oauthTokens = oauthTokens;\n }\n // Extract onProgress from metadata if available\n const metadata = context?.metadata as any;\n if (metadata?.onProgress) {\n enrichedContext.onProgress = metadata.onProgress;\n }\n return originalExecute(args, enrichedContext);\n };\n }\n\n aiSdkTools[name] = converted;\n }\n\n const resolvedTools = Object.keys(aiSdkTools).length > 0 ? aiSdkTools : undefined;\n\n return applyWorkingModeToTools(resolvedTools, {\n mode: this.mode,\n requireApproval: this.requireApproval,\n metadata: context?.metadata,\n });\n }\n\n /**\n * Prepare debug info without actually calling streamText\n */\n async prepareDebugInfo(options: {\n messages: ViberMessage[];\n system?: string;\n spaceId?: string;\n metadata?: Record<string, any>;\n }): Promise<{\n systemPrompt: string;\n tools: any;\n model: any;\n agentInfo: any;\n messages: any[];\n }> {\n await this.ensureSkillsLoaded();\n\n const { messages: viberMessages, system, spaceId, metadata } = options;\n\n // Extract metadata from messages for context enrichment\n let enrichedMetadata = metadata || {};\n\n // Find the last user message to extract any document context or other metadata\n const lastUserMsg = viberMessages.filter((m) => m.role === \"user\").pop();\n if (lastUserMsg?.metadata) {\n enrichedMetadata = { ...lastUserMsg.metadata, ...metadata };\n }\n\n // Build context for system prompt generation using ViberMessages\n const context: AgentContext = {\n spaceId: spaceId || \"default\",\n conversationHistory: new ConversationHistory(),\n metadata: enrichedMetadata,\n };\n\n // Use agent-specific prompt and append any extra system context\n const basePrompt = this.getSystemPrompt(context);\n const systemPrompt = system ? `${basePrompt}\\n\\n${system}` : basePrompt;\n const tools = await this.getTools({ spaceId, metadata: enrichedMetadata });\n\n // Convert messages for display\n const modelMessages: any[] = viberMessages\n .filter((m) => m.role !== \"tool\")\n .map((m) => ({\n role: m.role,\n content:\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? (m.content as Array<{ type: string; text?: string }>)\n .filter((p) => p.type === \"text\" && p.text)\n .map((p) => p.text as string)\n .join(\"\\n\")\n : \"\",\n }))\n .filter((m) => m.content);\n\n return {\n systemPrompt,\n tools: Object.entries(tools || {}).map(([id, tool]) => ({\n id,\n name: (tool as any).name || id,\n description: (tool as any).description,\n functions: Object.keys((tool as any).functions || {}),\n })),\n model: {\n provider:\n this.config.llm?.provider || this.config.provider || \"unknown\",\n model: this.config.llm?.model || this.config.model || \"unknown\",\n settings: {\n temperature: this.temperature,\n maxTokens: this.maxTokens,\n topP: this.topP,\n frequencyPenalty: this.frequencyPenalty,\n presencePenalty: this.presencePenalty,\n },\n },\n agentInfo: {\n id: this.id,\n name: this.name,\n description: this.description,\n personality: this.personality,\n },\n messages: modelMessages,\n };\n }\n\n /**\n * Stream text - works with ViberMessage[] internally\n * Converts to ModelMessage[] only when calling AI SDK\n */\n async streamText(options: {\n messages: ViberMessage[];\n system?: string;\n spaceId?: string;\n metadata?: Record<string, any>;\n [key: string]: any; // Allow all other AI SDK options to pass through\n }): Promise<any> {\n await this.ensureSkillsLoaded();\n\n // Preflight: validate provider + model before expensive AI calls\n const preflight = await preflightValidate(this.provider, this.model, undefined, {\n skipModelCheck: true, // Skip network call for speed; key presence is the critical check\n });\n if (!preflight.ok) {\n throw new Error(formatPreflightError(preflight));\n }\n if (preflight.warnings.length > 0) {\n console.warn(`[Agent] Preflight warnings for ${this.name}:`, preflight.warnings.join(\"; \"));\n }\n\n // Extract context-specific options\n const {\n messages: viberMessages,\n system,\n spaceId,\n metadata,\n ...aiSdkOptions\n } = options;\n\n // Extract metadata from messages for context enrichment\n let enrichedMetadata = metadata || {};\n\n // Find the last user message to extract any document context or other metadata\n const lastUserMsg = viberMessages.filter((m) => m.role === \"user\").pop();\n if (lastUserMsg?.metadata) {\n enrichedMetadata = { ...lastUserMsg.metadata, ...metadata };\n }\n\n // Build context for system prompt generation using ViberMessages\n const context: AgentContext = {\n spaceId: spaceId || \"default\",\n conversationHistory: new ConversationHistory(),\n metadata: enrichedMetadata,\n };\n\n // Use agent-specific prompt and append any extra system context\n const basePrompt = this.getSystemPrompt(context);\n const systemPrompt = system ? `${basePrompt}\\n\\n${system}` : basePrompt;\n\n const model = this.getModel({ spaceId, userId: enrichedMetadata.userId });\n const tools = await this.getTools({ spaceId, metadata: enrichedMetadata });\n console.log(`[Agent] ${this.name} streaming with model=${this.provider}/${this.model}, tools=${tools ? Object.keys(tools).length : 0}: ${tools ? Object.keys(tools).join(', ') : 'none'}`);\n\n // Generate a message ID that includes the agent name\n const agentPrefix = this.name.toLowerCase().replace(/\\s+/g, \"-\");\n\n // Convert ViberMessage[] to ModelMessage[] ONLY here, right before AI SDK call\n const modelMessages: ModelMessage[] = viberMessages\n .filter((m) => m.role !== \"tool\") // Skip tool messages\n .map((m) => ({\n role: m.role as \"system\" | \"user\" | \"assistant\",\n content:\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? (m.content as Array<{ type: string; text?: string }>)\n .filter((p) => p.type === \"text\" && p.text)\n .map((p) => p.text as string)\n .join(\"\\n\")\n : \"\",\n }))\n .filter((m) => m.content); // Remove empty messages\n\n // Pass through to AI SDK's streamText with agent defaults\n const result = streamText({\n model,\n system: systemPrompt,\n messages: modelMessages,\n tools,\n toolChoice: \"auto\", // Explicitly set tool choice mode\n stopWhen: stepCountIs(this.maxSteps), // Enable multi-step: continue until no more tool calls or maxSteps reached\n temperature: this.temperature,\n maxOutputTokens: this.maxTokens,\n topP: this.topP,\n frequencyPenalty: this.frequencyPenalty,\n presencePenalty: this.presencePenalty,\n maxRetries: 3,\n // onStepFinish callback for debugging multi-step execution if needed\n onStepFinish: ({ toolCalls }) => {\n if (toolCalls?.length) {\n console.log(`[Agent] Tool calls: ${toolCalls.map(t => t.toolName).join(', ')}`);\n }\n },\n // Override with any provided options\n ...aiSdkOptions,\n // Use experimental_generateMessageId to include agent name in message ID\n // @ts-ignore - experimental feature may not be in types yet\n experimental_generateMessageId: () => {\n return `${agentPrefix}_${generateShortId()}`;\n },\n });\n\n // Attach agent metadata to the result for immediate access\n (result as any).agentMetadata = {\n name: this.name,\n };\n\n return result;\n }\n\n /**\n * Generate text - works with ViberMessage[] internally\n * Converts to ModelMessage[] only when calling AI SDK\n */\n async generateText(options: {\n messages: ViberMessage[];\n system?: string;\n spaceId?: string;\n metadata?: Record<string, any>;\n [key: string]: any;\n }): Promise<any> {\n await this.ensureSkillsLoaded();\n\n // Preflight: validate provider + model before expensive AI calls\n const preflight = await preflightValidate(this.provider, this.model, undefined, {\n skipModelCheck: true,\n });\n if (!preflight.ok) {\n throw new Error(formatPreflightError(preflight));\n }\n if (preflight.warnings.length > 0) {\n console.warn(`[Agent] Preflight warnings for ${this.name}:`, preflight.warnings.join(\"; \"));\n }\n\n const {\n messages: viberMessages,\n system,\n spaceId,\n metadata,\n ...aiSdkOptions\n } = options;\n\n // Extract metadata from messages for context enrichment\n let enrichedMetadata = metadata || {};\n\n // Find the last user message to extract any document context or other metadata\n const lastUserMsg = viberMessages.filter((m) => m.role === \"user\").pop();\n if (lastUserMsg?.metadata) {\n enrichedMetadata = { ...lastUserMsg.metadata, ...metadata };\n }\n\n // Build context for system prompt generation\n const context: AgentContext = {\n spaceId: spaceId || \"default\",\n conversationHistory: new ConversationHistory(),\n metadata: enrichedMetadata,\n };\n\n // Use agent-specific prompt and append any extra system context\n const basePrompt = this.getSystemPrompt(context);\n const systemPrompt = system ? `${basePrompt}\\n\\n${system}` : basePrompt;\n\n const model = this.getModel({ spaceId, userId: enrichedMetadata.userId });\n const tools = await this.getTools({ spaceId, metadata: enrichedMetadata });\n\n // Convert ViberMessage[] to ModelMessage[] ONLY here, right before AI SDK call\n const modelMessages: ModelMessage[] = viberMessages\n .filter((m) => m.role !== \"tool\") // Skip tool messages\n .map((m) => ({\n role: m.role as \"system\" | \"user\" | \"assistant\",\n content:\n typeof m.content === \"string\"\n ? m.content\n : Array.isArray(m.content)\n ? (m.content as Array<{ type: string; text?: string }>)\n .filter((p) => p.type === \"text\" && p.text)\n .map((p) => p.text as string)\n .join(\"\\n\")\n : \"\",\n }))\n .filter((m) => m.content);\n\n // Pass through to AI SDK's generateText with proper options\n return generateText({\n model,\n system: systemPrompt,\n messages: modelMessages,\n tools,\n temperature: this.temperature,\n maxRetries: 3,\n ...aiSdkOptions,\n // Add model-specific options if they exist\n ...(this.maxTokens && { maxSteps: 5 }), // generateText uses maxSteps not maxTokens\n ...(this.topP && { topP: this.topP }),\n ...(this.frequencyPenalty && { frequencyPenalty: this.frequencyPenalty }),\n ...(this.presencePenalty && { presencePenalty: this.presencePenalty }),\n });\n }\n\n /**\n * Get agent summary\n */\n getSummary(): Record<string, any> {\n return {\n id: this.id,\n name: this.name,\n description: this.description,\n tools: this.tools,\n llmModel: `${this.provider}/${this.model}`,\n };\n }\n}\n\n// ==================== Working Mode Logic ====================\n\nexport type WorkingMode = \"always_ask\" | \"agent_decides\" | \"always_execute\";\n\nconst MODE_ALIASES: Record<string, WorkingMode> = {\n \"always_ask\": \"always_ask\",\n \"always-ask\": \"always_ask\",\n \"agent_decides\": \"agent_decides\",\n \"agent-decides\": \"agent_decides\",\n \"viber_decides\": \"agent_decides\",\n \"viber-decides\": \"agent_decides\",\n \"always_execute\": \"always_execute\",\n \"always-execute\": \"always_execute\",\n};\n\n/**\n * Resolve the configured working mode from supported config keys.\n */\nexport function resolveWorkingMode(config: ViberConfig): WorkingMode {\n const rawMode = config.mode ?? config.workingMode;\n\n if (typeof rawMode !== \"string\") {\n return \"agent_decides\";\n }\n\n return MODE_ALIASES[rawMode] ?? \"agent_decides\";\n}\n\n/**\n * Resolve tools that require explicit approval in agent_decides mode.\n */\nexport function resolveRequireApprovalTools(config: ViberConfig): Set<string> {\n const configured = config.require_approval ?? config.requireApproval;\n if (!Array.isArray(configured)) {\n return new Set<string>();\n }\n\n return new Set(\n configured.filter((item): item is string => typeof item === \"string\")\n );\n}\n\n/**\n * Check whether the current request metadata includes approval for a tool.\n */\nexport function hasToolApproval(\n metadata: Record<string, unknown> | undefined,\n toolName: string\n): boolean {\n const approvedTools = metadata?.approvedTools;\n if (!Array.isArray(approvedTools)) {\n return false;\n }\n\n return approvedTools.includes(toolName);\n}\n\n/**\n * Wrap tools with working-mode approval checks.\n */\nexport function applyWorkingModeToTools(\n tools: Record<string, CoreTool> | undefined,\n options: {\n mode: WorkingMode;\n requireApproval: Set<string>;\n metadata?: Record<string, unknown>;\n }\n): Record<string, CoreTool> | undefined {\n if (!tools) return undefined;\n\n const { mode, requireApproval, metadata } = options;\n\n if (mode === \"always_execute\") {\n return tools;\n }\n\n return Object.fromEntries(\n Object.entries(tools).map(([toolName, tool]) => {\n const shouldAsk =\n mode === \"always_ask\" ||\n (mode === \"agent_decides\" && requireApproval.has(toolName));\n\n if (!shouldAsk) {\n return [toolName, tool];\n }\n\n return [\n toolName,\n {\n ...tool,\n execute: async (args: unknown, context?: unknown) => {\n if (hasToolApproval(metadata, toolName)) {\n return tool.execute(args, context);\n }\n\n throw new Error(\n `Approval required for tool '${toolName}'. Ask the user for confirmation and retry with metadata.approvedTools including '${toolName}'.`\n );\n },\n } satisfies CoreTool,\n ];\n })\n );\n}\n","import { Cron } from \"croner\";\nimport { EventEmitter } from \"events\";\nimport * as fs from \"fs/promises\";\nimport { watch as fsWatch, type FSWatcher } from \"fs\";\nimport * as path from \"path\";\nimport * as yaml from \"yaml\";\n\n\nexport interface CronJobConfig {\n name: string;\n description?: string;\n schedule: string;\n agent?: string;\n provider?: string;\n model?: string;\n skills?: string[];\n tools?: string[];\n prompt: string;\n /** When set, job is intended for this node (daemon id). Hub may push only jobs matching this node. */\n viberId?: string;\n}\n\n/**\n * Subset of CronJobConfig safe for reporting over the network.\n * Excludes internal fields like agent, provider, skills, tools.\n */\nexport interface JobSummary {\n name: string;\n description?: string;\n schedule: string;\n prompt: string;\n model?: string;\n viberId?: string;\n}\n\nexport class JobScheduler extends EventEmitter {\n private jobs: Map<string, Cron> = new Map();\n private active: boolean = false;\n private watcher: FSWatcher | null = null;\n private reloadTimer: NodeJS.Timeout | null = null;\n private loadedConfigs: CronJobConfig[] = [];\n\n constructor(private jobsDir: string) {\n super();\n }\n\n /** Get the list of currently loaded job configs (safe for reporting). */\n getLoadedJobs(): JobSummary[] {\n return this.loadedConfigs.map((c) => ({\n name: c.name,\n description: c.description,\n schedule: c.schedule,\n prompt: c.prompt,\n model: c.model,\n viberId: c.viberId,\n }));\n }\n\n async start() {\n this.active = true;\n await this.loadJobs();\n this.startWatcher();\n }\n\n async stop() {\n this.active = false;\n this.stopWatcher();\n for (const job of this.jobs.values()) {\n job.stop();\n }\n this.jobs.clear();\n }\n\n /** Reload jobs from disk (e.g. after receiving a new job from the hub). */\n async reload(): Promise<void> {\n for (const job of this.jobs.values()) {\n job.stop();\n }\n this.jobs.clear();\n await this.loadJobs();\n }\n\n /**\n * Watch the jobs directory for file changes and auto-reload.\n * This ensures jobs created by tools (e.g. create_scheduled_job from chat)\n * are picked up without requiring a daemon restart.\n */\n private startWatcher(): void {\n try {\n this.watcher = fsWatch(this.jobsDir, (_eventType, filename) => {\n if (!filename) return;\n if (!filename.endsWith(\".yaml\") && !filename.endsWith(\".yml\")) return;\n this.debouncedReload();\n });\n this.watcher.on(\"error\", () => {\n // Directory may have been removed; stop watching silently\n this.stopWatcher();\n });\n } catch {\n // Directory might not exist yet — that's fine, watcher is optional\n }\n }\n\n private stopWatcher(): void {\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n if (this.reloadTimer) {\n clearTimeout(this.reloadTimer);\n this.reloadTimer = null;\n }\n }\n\n /** Debounced reload to avoid rapid-fire reloads when multiple files change. */\n private debouncedReload(): void {\n if (this.reloadTimer) clearTimeout(this.reloadTimer);\n this.reloadTimer = setTimeout(async () => {\n this.reloadTimer = null;\n if (!this.active) return;\n console.log(\"[Scheduler] Detected jobs directory change, reloading...\");\n try {\n await this.reload();\n } catch (err) {\n console.error(\"[Scheduler] Reload after file change failed:\", err);\n }\n }, 500);\n }\n\n private async loadJobs() {\n this.loadedConfigs = [];\n try {\n // Check if directory exists\n try {\n await fs.access(this.jobsDir);\n } catch {\n console.warn(`[Scheduler] Jobs directory not found: ${this.jobsDir}`);\n this.emit(\"jobs:loaded\", this.getLoadedJobs());\n return;\n }\n\n const files = await fs.readdir(this.jobsDir);\n for (const file of files) {\n if (file.endsWith(\".yaml\") || file.endsWith(\".yml\")) {\n const content = await fs.readFile(path.join(this.jobsDir, file), \"utf8\");\n try {\n const config = yaml.parse(content) as CronJobConfig;\n this.loadedConfigs.push(config);\n this.scheduleJob(config);\n } catch (err) {\n console.error(`[Scheduler] Failed to parse job ${file}:`, err);\n }\n }\n }\n } catch (err) {\n console.error(\"[Scheduler] Error loading jobs:\", err);\n }\n\n // Notify listeners (e.g. the controller) so they can report to the hub\n this.emit(\"jobs:loaded\", this.getLoadedJobs());\n }\n\n private scheduleJob(config: CronJobConfig) {\n console.log(`[Scheduler] Scheduling job: ${config.name} (${config.schedule})`);\n\n // Handle \"interval: 3s\" style if user uses it, though we recommend standard Cron\n // Croner supports \"ISO 8601 duration\" or pattern.\n // If config.schedule starts with \"*\", assume cron.\n // If it is a number, assume ms?\n\n // Example: \"*/3 * * * * *\" is every 3 seconds.\n\n try {\n const job = new Cron(config.schedule, async () => {\n if (!this.active) return;\n await this.executeJob(config);\n });\n\n this.jobs.set(config.name, job);\n } catch (err) {\n console.error(`[Scheduler] Invalid schedule for ${config.name}:`, err);\n }\n }\n\n private async executeJob(config: CronJobConfig) {\n // If model is specified, use full Agent\n if (config.model) {\n try {\n const { Agent } = await import(\"../worker/agent\");\n\n const agent = new Agent({\n name: config.name,\n description: config.description || \"Cron Job Agent\",\n skills: config.skills,\n tools: config.tools,\n llm: {\n provider: config.provider || \"openrouter\",\n model: config.model\n },\n });\n\n // Execute prompt\n const result = await agent.generateText({\n messages: [{ role: \"user\", content: config.prompt }]\n });\n\n // Log results comprehensively (single line)\n const parts: string[] = [];\n\n // Tool results (compact) — skip noiseless health OK results\n if (result.toolResults && result.toolResults.length > 0) {\n for (const tr of result.toolResults) {\n const isHealthOk =\n tr.output &&\n typeof tr.output === \"object\" &&\n \"status\" in tr.output &&\n (tr.output as any).status === \"HEALTHY\";\n if (isHealthOk) continue;\n\n const resultStr =\n typeof tr.output === \"object\"\n ? JSON.stringify(tr.output) // No pretty-print\n : String(tr.output);\n parts.push(`${tr.toolName}: ${resultStr}`);\n }\n }\n\n // LLM text response if any\n if (result.text) {\n parts.push(result.text.slice(0, 100)); // Truncate long text\n }\n\n // Final output (single line)\n if (parts.length > 0) {\n console.log(`[${config.name}] ${parts.join(' | ')}`);\n }\n\n } catch (err) {\n console.error(`[${config.name}] Agent execution failed:`, err);\n }\n return;\n }\n\n // Fallback: Hardcoded optimization for BrowserCDP if no model specified (Legacy/Fast Path)\n // This allows \"script-like\" execution without LLM inference cost if the prompt matches known patterns\n // (For now, we keep the Healer optimization as a fallback or if user omits model)\n // Fallback or legacy logic removed for cleaner architecture.\n if (!config.model) {\n console.warn(`[${config.name}] No model specified, skipping execution.`);\n }\n }\n}\n","/**\n * Proxy-aware Fetch Utility\n *\n * Creates a custom `fetch` function that routes requests through an HTTP proxy\n * (e.g., Clash Verge, V2Ray) when configured. This is passed to AI SDK providers\n * so all model API calls can be proxied for region-restricted access.\n */\n\nimport { ProxyAgent } from \"undici\";\n\nexport interface ProxyConfig {\n /** Proxy server URL, e.g. \"http://127.0.0.1:7890\" */\n proxyUrl?: string | null;\n /** Whether proxying is enabled */\n proxyEnabled?: boolean;\n}\n\n/**\n * Create a fetch function that routes through a proxy when configured.\n * Returns the native `globalThis.fetch` when proxy is disabled or not configured.\n */\nexport function createProxyFetch(config: ProxyConfig): typeof fetch {\n if (!config.proxyEnabled || !config.proxyUrl) {\n return globalThis.fetch;\n }\n\n const url = config.proxyUrl.trim();\n if (!url) {\n return globalThis.fetch;\n }\n\n try {\n const agent = new ProxyAgent(url);\n return ((input: RequestInfo | URL, init?: RequestInit) =>\n globalThis.fetch(input, {\n ...init,\n // @ts-expect-error -- Node.js 22 supports `dispatcher` via undici but it's not in the DOM RequestInit type\n dispatcher: agent,\n })) as typeof fetch;\n } catch {\n // If ProxyAgent creation fails (e.g., invalid URL), fall back to native fetch\n console.warn(`[proxy-fetch] Failed to create proxy agent for \"${url}\", falling back to native fetch`);\n return globalThis.fetch;\n }\n}\n","/**\n * Daemon runtime - thin assistant runtime path\n *\n * No Space, no DataAdapter, no Storage. Loads a single agent config from file\n * and runs streamText. Viber Board owns persistence and context; daemon only\n * orchestrates local skills and the LLM.\n *\n * Personalization: Loads the four-file pattern (SOUL.md, USER.md, MEMORY.md, IDENTITY.md)\n * from ~/.openviber/ and injects them into every request for agent context.\n * Backwards-compatible: falls back to lowercase filenames and legacy tasks/ paths.\n */\n\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport * as yaml from \"yaml\";\nimport { getViberPath, getViberRoot } from \"../worker/config\";\nimport type { ViberConfig } from \"../worker/config\";\nimport { Agent } from \"../worker/agent\";\nimport { parseModelString } from \"../worker/provider\";\nimport { loadSettings, saveSettings } from \"../skills/hub/settings\";\nimport type { ViberMessage } from \"../worker/message\";\nimport { getModuleDirname } from \"../utils/module-path\";\n\n// Inlined FsStorage for local runtime usage\nclass FsStorage {\n protected basePath: string;\n\n constructor(basePath?: string) {\n this.basePath = basePath || getViberRoot();\n }\n\n protected getPath(...segments: string[]): string {\n return path.join(this.basePath, ...segments);\n }\n\n async readJSON<T = any>(relativePath: string): Promise<T | null> {\n try {\n const fullPath = this.getPath(relativePath);\n const content = await fs.readFile(fullPath, \"utf-8\");\n return JSON.parse(content) as T;\n } catch (error: any) {\n if (error.code === \"ENOENT\") return null;\n throw error;\n }\n }\n\n async writeJSON(relativePath: string, data: any): Promise<void> {\n const fullPath = this.getPath(relativePath);\n const content = JSON.stringify(data, null, 2);\n await fs.mkdir(path.dirname(fullPath), { recursive: true });\n await fs.writeFile(fullPath, content);\n }\n\n async exists(relativePath: string): Promise<boolean> {\n try {\n await fs.access(this.getPath(relativePath));\n return true;\n } catch {\n return false;\n }\n }\n}\n\nexport interface ViberEnvironmentInfo {\n name: string;\n repoUrl?: string;\n repoOrg?: string;\n repoName?: string;\n repoBranch?: string;\n variables?: { key: string; value: string }[];\n}\n\nexport interface DaemonRunTaskOptions {\n model?: string;\n singleAgentId?: string;\n agentConfig?: ViberConfig;\n signal?: AbortSignal;\n environment?: ViberEnvironmentInfo;\n /** Settings from hub (Supabase); overrides local file and updates cache */\n settingsOverride?: { primaryCodingCli?: string; channelIds?: string[]; skills?: string[]; proxyUrl?: string | null; proxyEnabled?: boolean };\n /** OAuth tokens pulled from hub config, injected into tool execution context */\n oauthTokens?: {\n google?: { accessToken: string; refreshToken?: string | null };\n [provider: string]: { accessToken: string; refreshToken?: string | null } | undefined;\n };\n /** Progress callback for tools to emit intermediate updates */\n onProgress?: (event: {\n kind: string;\n phase?: string;\n message?: string;\n data?: any;\n }) => void;\n}\n\nconst __dirname = getModuleDirname();\n\nconst DEFAULTS_VIBERS_DIR = path.join(\n path.dirname(__dirname),\n \"data\",\n \"defaults\",\n \"vibers\"\n);\n\n// ==================== Personalization ====================\n\n/**\n * Read a file if it exists, returning its content or null.\n */\nasync function readFileIfExists(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return null;\n }\n}\n\n/**\n * Load the four-file personalization context (SOUL.md, USER.md, MEMORY.md, IDENTITY.md).\n *\n * Path resolution order (per-viber files):\n * 1. ~/.openviber/vibers/{viberId}/SOUL.md (primary, uppercase)\n * 2. ~/.openviber/vibers/{viberId}/soul.md (backwards compat, lowercase)\n * 3. ~/.openviber/tasks/{viberId}/SOUL.md (legacy path, uppercase)\n * 4. ~/.openviber/tasks/{viberId}/soul.md (legacy path, lowercase)\n * 5. ~/.openviber/SOUL.md (root fallback)\n * 6. ~/.openviber/soul.md (root fallback, lowercase)\n *\n * USER.md and IDENTITY.md are shared (node-level) at ~/.openviber/,\n * with optional per-viber overrides in vibers/{viberId}/.\n *\n * MEMORY.md follows the same per-viber resolution as SOUL.md.\n */\nexport async function loadPersonalization(viberId: string = \"default\"): Promise<string> {\n const root = getViberRoot();\n const viberDir = path.join(root, \"vibers\", viberId);\n const legacyTaskDir = path.join(root, \"tasks\", viberId);\n\n /**\n * Convert filename to uppercase stem with original extension (e.g. \"SOUL.md\")\n * and lowercase stem with original extension (e.g. \"soul.md\").\n */\n function caseVariants(filename: string): { upper: string; lower: string } {\n const ext = path.extname(filename); // \".md\"\n const stem = path.basename(filename, ext); // \"SOUL\"\n return {\n upper: stem.toUpperCase() + ext, // \"SOUL.md\"\n lower: stem.toLowerCase() + ext, // \"soul.md\"\n };\n }\n\n /**\n * Resolve a personalization file with fallback chain:\n * per-viber (uppercase) → per-viber (lowercase) → legacy (uppercase) → legacy (lowercase) → root (uppercase) → root (lowercase)\n */\n async function resolvePerViberFile(filename: string): Promise<string | null> {\n const { upper, lower } = caseVariants(filename);\n return (\n (await readFileIfExists(path.join(viberDir, upper))) ??\n (await readFileIfExists(path.join(viberDir, lower))) ??\n (await readFileIfExists(path.join(legacyTaskDir, upper))) ??\n (await readFileIfExists(path.join(legacyTaskDir, lower))) ??\n (await readFileIfExists(path.join(root, upper))) ??\n (await readFileIfExists(path.join(root, lower)))\n );\n }\n\n /**\n * Resolve a shared (node-level) file with optional per-viber override:\n * per-viber (uppercase) → per-viber (lowercase) → root (uppercase) → root (lowercase)\n */\n async function resolveSharedFile(filename: string): Promise<string | null> {\n const { upper, lower } = caseVariants(filename);\n return (\n (await readFileIfExists(path.join(viberDir, upper))) ??\n (await readFileIfExists(path.join(viberDir, lower))) ??\n (await readFileIfExists(path.join(root, upper))) ??\n (await readFileIfExists(path.join(root, lower)))\n );\n }\n\n // SOUL.md: per-viber with root fallback\n const soul = await resolvePerViberFile(\"SOUL.md\");\n\n // USER.md: shared at root level, with optional per-viber override\n const user = await resolveSharedFile(\"USER.md\");\n\n // MEMORY.md: per-viber with root fallback\n const memory = await resolvePerViberFile(\"MEMORY.md\");\n\n // IDENTITY.md: shared at root level, with optional per-viber override\n const identity = await resolveSharedFile(\"IDENTITY.md\");\n\n const sections: string[] = [];\n\n if (identity) {\n sections.push(`<identity>\\n${identity.trim()}\\n</identity>`);\n }\n if (soul) {\n sections.push(`<soul>\\n${soul.trim()}\\n</soul>`);\n }\n if (user) {\n sections.push(`<user>\\n${user.trim()}\\n</user>`);\n }\n if (memory) {\n sections.push(`<memory>\\n${memory.trim()}\\n</memory>`);\n }\n\n // Inject recent daily memory logs for continuity\n const dailyLogs = await loadRecentDailyLogs(viberId);\n if (dailyLogs) {\n sections.push(`<recent_activity>\\n${dailyLogs}\\n</recent_activity>`);\n }\n\n return sections.join(\"\\n\\n\");\n}\n\n// ==================== Daily Memory Logs ====================\n\n/**\n * Get the path for today's daily memory log.\n * Format: ~/.openviber/vibers/{viberId}/memory/YYYY-MM-DD.md\n */\nfunction getDailyLogPath(viberId: string): string {\n const root = getViberRoot();\n const date = new Date().toISOString().slice(0, 10); // YYYY-MM-DD\n return path.join(root, \"vibers\", viberId, \"memory\", `${date}.md`);\n}\n\n/**\n * Append a task summary to today's daily memory log.\n * Called at the end of each task to build organic memory over time.\n */\nexport async function appendDailyMemory(\n viberId: string,\n summary: {\n taskId: string;\n goal: string;\n outcome: \"completed\" | \"error\" | \"stopped\";\n details?: string;\n }\n): Promise<void> {\n const logPath = getDailyLogPath(viberId);\n const dir = path.dirname(logPath);\n\n try {\n await fs.mkdir(dir, { recursive: true });\n\n const time = new Date().toLocaleTimeString(\"en-US\", { hour12: false });\n const entry = [\n `### ${time} — ${summary.goal}`,\n `- **Task**: \\`${summary.taskId}\\``,\n `- **Outcome**: ${summary.outcome}`,\n ...(summary.details ? [`- **Notes**: ${summary.details}`] : []),\n \"\",\n ].join(\"\\n\");\n\n // If file doesn't exist yet, add a date header\n let content = entry;\n try {\n await fs.access(logPath);\n } catch {\n const date = new Date().toISOString().slice(0, 10);\n content = `# Daily Log — ${date}\\n\\n${entry}`;\n }\n\n await fs.appendFile(logPath, content + \"\\n\");\n } catch (error) {\n // Non-fatal — don't crash the agent over a log write failure\n console.error(`[DailyMemory] Failed to write log for ${viberId}:`, error);\n }\n}\n\n/**\n * Load the most recent N days of daily memory logs for context injection.\n * Returns a concatenated string of recent daily logs, newest first.\n */\nexport async function loadRecentDailyLogs(\n viberId: string,\n days: number = 3\n): Promise<string | null> {\n const root = getViberRoot();\n // Primary: vibers/{viberId}/memory/, fallback: tasks/{viberId}/memory/ (legacy)\n let memoryDir = path.join(root, \"vibers\", viberId, \"memory\");\n\n try {\n await fs.access(memoryDir);\n } catch {\n memoryDir = path.join(root, \"tasks\", viberId, \"memory\");\n }\n\n try {\n await fs.access(memoryDir);\n } catch {\n return null; // No memory directory yet\n }\n\n try {\n const files = await fs.readdir(memoryDir);\n const logFiles = files\n .filter((f) => /^\\d{4}-\\d{2}-\\d{2}\\.md$/.test(f))\n .sort()\n .reverse()\n .slice(0, days);\n\n if (logFiles.length === 0) return null;\n\n const logs: string[] = [];\n for (const file of logFiles) {\n const content = await fs.readFile(path.join(memoryDir, file), \"utf-8\");\n logs.push(content.trim());\n }\n\n return logs.join(\"\\n\\n---\\n\\n\");\n } catch (error) {\n console.error(`[DailyMemory] Failed to load logs for ${viberId}:`, error);\n return null;\n }\n}\n\n// ==================== Coding Task System Prompt ====================\n\n/**\n * System prompt for AI coding tasks.\n *\n * Follows best practices for agentic coding workflows:\n * 1. Plan before coding\n * 2. Implement incrementally\n * 3. Verify changes (tests, lint, typecheck)\n * 4. Report with evidence\n * 5. Git best practices (branch, commit, push)\n */\nconst CODING_TASK_SYSTEM_PROMPT = `You are an expert software engineering assistant. You work autonomously to complete coding tasks end-to-end.\n\n## Workflow (MANDATORY for coding tasks)\n\nFollow this systematic approach for every coding task:\n\n### 1. UNDERSTAND\n- Read the task/issue carefully. Identify acceptance criteria.\n- Explore the codebase: read relevant files, understand the architecture.\n- Check for existing patterns, conventions, and test suites.\n\n### 2. PLAN\n- Break the task into small, concrete steps.\n- Identify which files need changes and why.\n- Consider edge cases and potential regressions.\n- If the task is ambiguous, state your interpretation before proceeding.\n\n### 3. IMPLEMENT\n- Make changes incrementally — one logical change at a time.\n- Follow existing code style and conventions.\n- Add or update tests alongside code changes.\n- Keep changes minimal and focused on the task.\n\n### 4. VERIFY\n- Run the project's test suite after making changes.\n- Run linting and type checking if available.\n- Review your own changes for correctness and completeness.\n- If tests fail, debug and fix before proceeding.\n\n### 5. COMMIT & REPORT\n- Use descriptive commit messages (conventional commits preferred).\n- Summarize what was changed, why, and any caveats.\n- Reference issue numbers when applicable.\n- Report evidence: test results, lint output, before/after behavior.\n\n## Git Best Practices\n\n- Create feature branches for changes (e.g. \\`fix/issue-123\\`, \\`feat/add-widget\\`).\n- Make small, focused commits — one logical change per commit.\n- Write clear commit messages: \\`type(scope): description\\`\n- Push changes and create PRs when appropriate.\n- Never force-push to shared branches without explicit permission.\n\n## Tool Usage\n\n- **IMPORTANT**: Before saying you cannot do something, always check your available tools first. You likely have tools that can accomplish what is being asked. Never claim you lack capabilities without first reviewing the tools provided to you.\n- Use tools proactively to explore the codebase before making changes.\n- When delegating to Cursor Agent CLI, provide clear, specific prompts.\n- When using GitHub tools, follow the clone → branch → fix → commit → PR workflow.\n- Verify tool results before proceeding to the next step.\n\n## Communication\n\n- Be concise but thorough in status updates.\n- Show your reasoning when making architectural decisions.\n- Flag risks, trade-offs, or areas needing human review.\n- If you get stuck, explain what you tried and where you're blocked.\n`;\n\n// ==================== Config Loading ====================\n\n/**\n * Load agent config from file (no DataAdapter).\n * Tries built-in defaults then ~/.openviber/viber.yaml (single-machine mode)\n * and finally legacy ~/.openviber/vibers/{id}.yaml.\n */\nexport async function loadViberConfig(\n agentId: string\n): Promise<ViberConfig | null> {\n const tryRead = async (filePath: string): Promise<ViberConfig | null> => {\n try {\n const content = await fs.readFile(filePath, \"utf8\");\n const parsed = yaml.parse(content) as Record<string, unknown>;\n if (!parsed || typeof parsed !== \"object\") return null;\n return { ...parsed, id: agentId } as ViberConfig;\n } catch {\n return null;\n }\n };\n\n for (const ext of [\"yaml\", \"yml\"]) {\n const fromDefaults = await tryRead(\n path.join(DEFAULTS_VIBERS_DIR, `${agentId}.${ext}`)\n );\n if (fromDefaults) return fromDefaults;\n }\n\n const root = getViberPath();\n for (const fileName of [\"viber.yaml\", \"viber.yml\"]) {\n const singleMachineConfig = await tryRead(path.join(root, fileName));\n if (singleMachineConfig) {\n return { ...singleMachineConfig, id: agentId } as ViberConfig;\n }\n }\n\n for (const ext of [\"yaml\", \"yml\"]) {\n const fromUser = await tryRead(\n path.join(root, \"vibers\", `${agentId}.${ext}`)\n );\n if (fromUser) return fromUser;\n }\n\n // Fallback: in-code default so daemon works out of the box\n if (agentId === \"default\") {\n return {\n id: \"default\",\n name: \"Default\",\n description: \"General-purpose coding assistant with local skills.\",\n provider: \"openrouter\",\n model: \"anthropic/claude-sonnet-4\",\n temperature: 0.7,\n maxTokens: 16384,\n maxSteps: 25,\n systemPrompt: CODING_TASK_SYSTEM_PROMPT,\n tools: [],\n skills: [\"github\", \"codex-cli\", \"cursor-agent\", \"terminal\", \"skill-playground\"],\n } as ViberConfig;\n }\n\n return null;\n}\n\n/**\n * Build a system prompt section that gives the agent project/environment awareness.\n */\nfunction buildEnvironmentPrompt(env: ViberEnvironmentInfo): string {\n const lines: string[] = [];\n lines.push(`## Environment: ${env.name}`);\n lines.push(\"\");\n\n if (env.repoUrl && env.repoOrg && env.repoName) {\n const projectDir = `~/openviber_spaces/${env.repoOrg}/${env.repoName}`;\n const branch = env.repoBranch || \"main\";\n\n lines.push(`You are working on the project **${env.repoOrg}/${env.repoName}**.`);\n lines.push(`- GitHub repository: ${env.repoUrl}`);\n lines.push(`- Branch: \\`${branch}\\``);\n lines.push(`- Local project path: \\`${projectDir}\\``);\n lines.push(\"\");\n lines.push(\"### Setup instructions\");\n lines.push(`1. Check if the project directory exists at \\`${projectDir}\\`.`);\n lines.push(`2. If it does NOT exist, clone the repository:`);\n lines.push(` \\`\\`\\`bash`);\n lines.push(` mkdir -p ~/openviber_spaces/${env.repoOrg}`);\n lines.push(` cd ~/openviber_spaces/${env.repoOrg}`);\n lines.push(` git clone ${env.repoUrl} ${env.repoName}`);\n lines.push(` cd ${env.repoName}`);\n lines.push(` git checkout ${branch}`);\n lines.push(` \\`\\`\\``);\n lines.push(`3. If it DOES exist, make sure you are on the \\`${branch}\\` branch and pull latest changes.`);\n lines.push(`4. Always \\`cd\\` into \\`${projectDir}\\` before running any commands.`);\n }\n\n if (env.variables && env.variables.length > 0) {\n lines.push(\"\");\n lines.push(\"### Environment variables\");\n lines.push(\"The following environment variables are configured for this project.\");\n lines.push(\"If the project has a `.env.example` file, generate a `.env` file using these values:\");\n lines.push(\"\");\n for (const v of env.variables) {\n lines.push(`- \\`${v.key}\\`=\\`${v.value}\\``);\n }\n lines.push(\"\");\n lines.push(\"When generating the `.env` file, match the keys from `.env.example` and fill in the corresponding values from above. Leave any keys not listed above with their example/default values.\");\n }\n\n // Detect GitHub token for gh CLI auth\n const ghTokenVar = env.variables?.find(\n (v) => v.key === \"GH_TOKEN\" || v.key === \"GITHUB_TOKEN\",\n );\n if (ghTokenVar) {\n lines.push(\"\");\n lines.push(\"### GitHub CLI authentication\");\n lines.push(\"A GitHub token is available. Before using `gh` CLI commands (clone, pr create, etc.), export it:\");\n lines.push(\"```bash\");\n lines.push(`export GH_TOKEN=\"${ghTokenVar.value}\"`);\n lines.push(\"```\");\n lines.push(\"This enables `gh repo clone`, `gh pr create`, `gh issue list`, etc.\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Build the complete system prompt for a daemon task.\n *\n * Layers (in order):\n * 1. Personalization (SOUL.md, USER.md, MEMORY.md, IDENTITY.md) — if configured\n * 2. Environment context (repo, branch, variables) — if provided\n * 3. Agent's own system prompt (from config)\n */\nasync function buildDaemonSystemPrompt(\n config: ViberConfig,\n agentId: string,\n environment?: ViberEnvironmentInfo,\n): Promise<string> {\n const sections: string[] = [];\n\n // 1. Personalization\n try {\n const personalization = await loadPersonalization(agentId);\n if (personalization) {\n sections.push(personalization);\n }\n } catch (err) {\n console.warn(\"[Runtime] Failed to load personalization:\", err);\n }\n\n // 2. Environment context\n if (environment) {\n sections.push(buildEnvironmentPrompt(environment));\n }\n\n // 3. Agent system prompt\n if (config.systemPrompt) {\n sections.push(config.systemPrompt);\n }\n\n return sections.join(\"\\n\\n\");\n}\n\n/**\n * Run a single task: one agent, no Space, no storage.\n * Returns stream result and agent for summary.\n *\n * Loads personalization context, environment info, and agent config\n * then streams the response via AI SDK.\n */\nexport async function runTask(\n goal: string,\n options: DaemonRunTaskOptions & { taskId: string },\n messages?: { role: string; content: string }[]\n): Promise<{\n streamResult: Awaited<ReturnType<Agent[\"streamText\"]>>;\n agent: Agent;\n}> {\n const {\n taskId,\n singleAgentId = \"default\",\n agentConfig: overrideConfig,\n model: modelOverride,\n signal,\n environment,\n } = options;\n\n let oauthTokens = options.oauthTokens;\n if (!oauthTokens) {\n try {\n const settings = await loadSettings();\n oauthTokens = settings.oauthTokens;\n } catch (err) {\n console.warn(\"[Runtime] Failed to load settings for oauthTokens:\", err);\n }\n }\n\n let config = overrideConfig ?? (await loadViberConfig(singleAgentId));\n if (!config) {\n throw new Error(\n `Agent '${singleAgentId}' not found. Add ~/.openviber/viber.yaml (or legacy ~/.openviber/vibers/${singleAgentId}.yaml) or use built-in default.`\n );\n }\n\n if (modelOverride) {\n const parsed = parseModelString(modelOverride);\n config = { ...config, provider: parsed.provider, model: parsed.modelName };\n }\n\n // Primary coding CLI: prefer override from hub (Supabase), else local cache file; update cache when override provided\n try {\n const override = options.settingsOverride?.primaryCodingCli;\n if (override != null && override !== \"\") {\n config = { ...config, primaryCodingCli: override };\n const cache = await loadSettings();\n cache.primaryCodingCli = override;\n await saveSettings(cache);\n } else {\n const settings = await loadSettings();\n if (settings.primaryCodingCli != null) {\n config = { ...config, primaryCodingCli: settings.primaryCodingCli };\n }\n }\n } catch (err) {\n console.warn(\"[Runtime] Failed to load settings for primaryCodingCli:\", err);\n }\n\n // Merge additional skills from intent/settings override into the agent config\n let extraSkills = options.settingsOverride?.skills;\n if (!extraSkills || extraSkills.length === 0) {\n try {\n const settings = await loadSettings();\n extraSkills = settings.standaloneSkills;\n } catch (err) {\n console.warn(\"[Runtime] Failed to load settings for standaloneSkills:\", err);\n }\n }\n\n if (extraSkills && extraSkills.length > 0) {\n const existing = new Set(config.skills ?? []);\n const merged = [...(config.skills ?? [])];\n for (const s of extraSkills) {\n if (!existing.has(s)) {\n merged.push(s);\n existing.add(s);\n }\n }\n config = { ...config, skills: merged };\n }\n\n // Build the full system prompt with personalization + environment + agent prompt\n const systemPrompt = await buildDaemonSystemPrompt(\n config,\n singleAgentId,\n environment,\n );\n config = { ...config, systemPrompt: systemPrompt };\n\n const agent = new Agent(config as ViberConfig);\n\n // Set up proxy-aware fetch if configured\n try {\n const proxyUrl = options.settingsOverride?.proxyUrl;\n const proxyEnabled = options.settingsOverride?.proxyEnabled;\n if (proxyUrl && proxyEnabled) {\n const { createProxyFetch } = await import(\"../utils/proxy\");\n agent.proxyFetch = createProxyFetch({ proxyUrl, proxyEnabled });\n console.log(`[Runtime] Proxy enabled: ${proxyUrl}`);\n }\n } catch (err) {\n console.warn(\"[Runtime] Failed to set up proxy fetch:\", err);\n }\n\n const viberMessages: ViberMessage[] =\n messages && messages.length > 0\n ? messages.map((m) => ({\n role: m.role as \"user\" | \"assistant\" | \"system\",\n content: m.content,\n }))\n : [{ role: \"user\" as const, content: goal }];\n\n const streamResult = await agent.streamText({\n messages: viberMessages,\n metadata: {\n taskId,\n oauthTokens,\n onProgress: options.onProgress,\n },\n ...(signal && { abortSignal: signal }),\n });\n\n return { streamResult, agent };\n}\n","\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport { getViberRoot } from \"../worker/config\";\nimport { Agent } from \"../worker/agent\";\nimport type { ViberConfig } from \"../types\";\n\n/**\n * Consolidate recent conversation history into long-term memory (MEMORY.md).\n *\n * This function reads the current MEMORY.md, prompts the LLM to update it based on the recent conversation,\n * and writes the updated content back to disk.\n *\n * @param viberId - The ID of the viber (agent instance).\n * @param messages - The conversation history (array of { role, content }).\n * @param agentConfig - The configuration of the agent that performed the task (reused for consolidation).\n */\nexport async function consolidateMemory(\n viberId: string,\n messages: { role: string; content: string }[],\n agentConfig: ViberConfig\n): Promise<void> {\n const root = getViberRoot();\n // Primary path: ~/.openviber/vibers/{viberId}/MEMORY.md\n const memoryPath = path.join(root, \"vibers\", viberId, \"MEMORY.md\");\n\n // Ensure directory exists\n await fs.mkdir(path.dirname(memoryPath), { recursive: true });\n\n let currentMemory = \"\";\n try {\n currentMemory = await fs.readFile(memoryPath, \"utf-8\");\n } catch {\n // File doesn't exist yet, start empty\n currentMemory = \"(empty)\";\n }\n\n // Filter messages to extract useful context\n // We skip system messages as they contain the prompt (which includes the memory itself)\n // We also skip large tool outputs to keep the context window manageable\n const conversationText = messages\n .filter((m) => m.role !== \"system\")\n .map((m) => {\n const role = m.role.toUpperCase();\n let content = m.content;\n if (typeof content === \"string\" && content.length > 2000) {\n content = content.slice(0, 2000) + \"... (truncated)\";\n } else if (typeof content !== \"string\") {\n content = \"[Complex Content]\";\n }\n return `${role}: ${content}`;\n })\n .join(\"\\n\\n\");\n\n if (!conversationText.trim()) {\n return; // No conversation to consolidate\n }\n\n const prompt = `You are the memory manager for an AI agent.\nYour job is to update the long-term memory (MEMORY.md) based on the latest conversation.\n\n## Current MEMORY.md\n${currentMemory}\n\n## Recent Conversation\n${conversationText}\n\n## Instructions\n1. Extract any permanent facts, user preferences, project context, or important decisions learned during this conversation.\n2. Update existing facts if they have changed.\n3. Remove obsolete information if contradicted by new facts.\n4. Do not store trivial details, short-term context, or greetings.\n5. Maintain a clean, organized Markdown format (e.g., using headers for sections like \"User Preferences\", \"Project Context\").\n6. Output the FULLY UPDATED content of MEMORY.md. Do not use code blocks unless the memory content itself requires them. Do not include any conversational text like \"Here is the updated memory\".\n\nOutput ONLY the raw content of the updated MEMORY.md file.`;\n\n try {\n // Create a temporary agent for consolidation using the same config/model\n // We override the system prompt to force it into \"Memory Manager\" mode\n const memoryAgent = new Agent({\n ...agentConfig,\n systemPrompt: \"You are a precise memory management system. Output only raw text.\",\n // Ensure we don't carry over task-specific tools/skills that might confuse the model\n tools: [],\n skills: [],\n });\n\n const result = await memoryAgent.generateText({\n messages: [{ role: \"user\", content: prompt }],\n });\n\n let updatedMemory = result.text.trim();\n\n // Cleanup: Remove wrapping markdown code blocks if the model added them despite instructions\n if (updatedMemory.startsWith(\"```markdown\")) {\n updatedMemory = updatedMemory.replace(/^```markdown\\n/, \"\").replace(/\\n```$/, \"\");\n } else if (updatedMemory.startsWith(\"```\")) {\n updatedMemory = updatedMemory.replace(/^```\\n/, \"\").replace(/\\n```$/, \"\");\n }\n\n if (updatedMemory && updatedMemory !== currentMemory) {\n await fs.writeFile(memoryPath, updatedMemory, \"utf-8\");\n // console.log(`[Memory] Updated MEMORY.md for ${viberId}`);\n }\n } catch (error) {\n console.error(`[Memory] Failed to consolidate memory for ${viberId}:`, error);\n }\n}\n","/**\n * Terminal runtime abstraction.\n *\n * tmux remains the primary backend, while additional app adapters can be\n * plugged in for other execution surfaces.\n */\n\nimport { spawn, spawnSync, ChildProcess } from \"child_process\";\nimport { EventEmitter } from \"events\";\nimport { randomUUID } from \"crypto\";\nimport { unlinkSync, existsSync } from \"fs\";\n\nexport interface TerminalPane {\n appId: string;\n session: string;\n window: string;\n windowName: string;\n pane: string;\n command: string;\n target: string;\n}\n\nexport interface TerminalSession {\n appId: string;\n name: string;\n windows: number;\n attached: boolean;\n}\n\nexport interface CreateSessionResult {\n ok: boolean;\n appId: string;\n sessionName: string;\n created: boolean;\n error?: string;\n}\n\nexport interface TerminalApp {\n id: string;\n label: string;\n isAvailable(): boolean;\n listSessions(): TerminalSession[];\n listPanes(): TerminalPane[];\n attach(\n target: string,\n onData: (data: string) => void,\n onClose: () => void,\n ): Promise<boolean>;\n detach(target: string): void;\n sendInput(target: string, keys: string): boolean;\n resize(target: string, cols: number, rows: number): boolean;\n createSession(sessionName: string, windowName?: string, cwd?: string): CreateSessionResult;\n detachAll(): void;\n}\n\nconst SAFE_NAME_RE = /[^a-zA-Z0-9_.:-]/g;\n\nfunction sanitizeName(input: string): string {\n return input.replace(SAFE_NAME_RE, \"-\");\n}\n\nfunction resolveAppTarget(target: string, appHint?: string): { appId: string; rawTarget: string } {\n if (target.includes(\"::\")) {\n const [appId, ...rest] = target.split(\"::\");\n return { appId, rawTarget: rest.join(\"::\") };\n }\n return { appId: appHint || \"tmux\", rawTarget: target };\n}\n\n/** tmux app adapter */\nclass TmuxTerminalStream extends EventEmitter {\n private catProcess: ChildProcess | null = null;\n private pipePath: string;\n private isAttached = false;\n\n constructor(private target: string) {\n super();\n this.pipePath = `/tmp/viber-term-${target.replace(/[^a-zA-Z0-9]/g, \"-\")}-${Date.now()}`;\n }\n\n async attach(): Promise<boolean> {\n if (this.isAttached) return true;\n\n try {\n const history = captureTmuxPane(this.target, 200);\n if (history) {\n this.emit(\"data\", history);\n }\n\n try {\n if (!existsSync(this.pipePath)) {\n spawnSync(\"mkfifo\", [this.pipePath], { stdio: \"pipe\" });\n }\n } catch {\n // ignore\n }\n\n this.catProcess = spawn(\"cat\", [this.pipePath], {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n });\n\n this.catProcess.stdout?.on(\"data\", (chunk: Buffer) => {\n this.emit(\"data\", chunk.toString());\n });\n\n this.catProcess.on(\"close\", () => {\n this.cleanup();\n });\n\n this.catProcess.on(\"error\", (err) => {\n this.emit(\"error\", err);\n this.cleanup();\n });\n\n spawnSync(\n \"tmux\",\n [\"pipe-pane\", \"-t\", this.target, \"-o\", `cat >> ${this.pipePath}`],\n {\n encoding: \"utf8\",\n stdio: \"pipe\",\n },\n );\n\n this.isAttached = true;\n return true;\n } catch (err) {\n this.emit(\"error\", err);\n this.cleanup();\n return false;\n }\n }\n\n detach(): void {\n if (!this.isAttached) return;\n try {\n spawnSync(\"tmux\", [\"pipe-pane\", \"-t\", this.target], { stdio: \"pipe\" });\n } catch {\n // ignore\n }\n this.cleanup();\n }\n\n private cleanup(): void {\n this.isAttached = false;\n if (this.catProcess) {\n this.catProcess.kill();\n this.catProcess = null;\n }\n try {\n if (existsSync(this.pipePath)) {\n unlinkSync(this.pipePath);\n }\n } catch {\n // ignore\n }\n this.emit(\"close\");\n }\n\n get attached(): boolean {\n return this.isAttached;\n }\n}\n\nclass TmuxTerminalApp implements TerminalApp {\n id = \"tmux\";\n label = \"tmux\";\n private streams: Map<string, TmuxTerminalStream> = new Map();\n\n isAvailable(): boolean {\n try {\n spawnSync(\"tmux\", [\"-V\"], { stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n }\n\n listSessions(): TerminalSession[] {\n try {\n const result = spawnSync(\n \"tmux\",\n [\n \"list-sessions\",\n \"-F\",\n \"#{session_name}|#{session_windows}|#{session_attached}\",\n ],\n { encoding: \"utf8\", stdio: \"pipe\" },\n );\n if (result.error || result.status !== 0) return [];\n const out = result.stdout.trim();\n if (!out) return [];\n return out.split(\"\\n\").map((line) => {\n const [name, windows, attached] = line.split(\"|\");\n return {\n appId: this.id,\n name,\n windows: parseInt(windows, 10) || 0,\n attached: attached === \"1\",\n };\n });\n } catch {\n return [];\n }\n }\n\n listPanes(): TerminalPane[] {\n try {\n const result = spawnSync(\n \"tmux\",\n [\n \"list-panes\",\n \"-a\",\n \"-F\",\n \"#{session_name}|#{window_index}|#{window_name}|#{pane_index}|#{pane_current_command}\",\n ],\n { encoding: \"utf8\", stdio: \"pipe\" },\n );\n if (result.error || result.status !== 0) return [];\n const out = result.stdout.trim();\n if (!out) return [];\n return out.split(\"\\n\").map((line) => {\n const [session, window, windowName, pane, command] = line.split(\"|\");\n return {\n appId: this.id,\n session,\n window,\n windowName,\n pane,\n command,\n target: `${session}:${window}.${pane}`,\n };\n });\n } catch {\n return [];\n }\n }\n\n async attach(\n target: string,\n onData: (data: string) => void,\n onClose: () => void,\n ): Promise<boolean> {\n let stream = this.streams.get(target);\n if (stream && stream.attached) {\n stream.on(\"data\", onData);\n stream.on(\"close\", onClose);\n return true;\n }\n\n stream = new TmuxTerminalStream(target);\n stream.on(\"data\", onData);\n stream.on(\"close\", () => {\n this.streams.delete(target);\n onClose();\n });\n\n const ok = await stream.attach();\n if (ok) {\n this.streams.set(target, stream);\n }\n return ok;\n }\n\n detach(target: string): void {\n const stream = this.streams.get(target);\n if (!stream) return;\n stream.detach();\n this.streams.delete(target);\n }\n\n sendInput(target: string, keys: string): boolean {\n return sendTmuxKeys(target, keys);\n }\n\n resize(target: string, cols: number, rows: number): boolean {\n try {\n const result = spawnSync(\n \"tmux\",\n [\n \"resize-pane\",\n \"-t\",\n target,\n \"-x\",\n String(cols),\n \"-y\",\n String(rows),\n ],\n {\n encoding: \"utf8\",\n stdio: \"pipe\",\n },\n );\n return result.status === 0;\n } catch {\n return false;\n }\n }\n\n createSession(sessionName: string, windowName = \"main\", cwd?: string): CreateSessionResult {\n const safeSession = sanitizeName(sessionName || \"coding\");\n const safeWindow = sanitizeName(windowName || \"main\");\n\n try {\n const check = spawnSync(\"tmux\", [\"has-session\", \"-t\", safeSession], {\n stdio: \"pipe\",\n });\n if (check.status === 0) {\n return { ok: true, appId: this.id, sessionName: safeSession, created: false };\n }\n } catch {\n // create\n }\n\n const args = [\"new-session\", \"-d\", \"-s\", safeSession, \"-n\", safeWindow];\n if (cwd) {\n args.push(\"-c\", cwd);\n }\n\n const result = spawnSync(\"tmux\", args, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n if (result.error) {\n return {\n ok: false,\n appId: this.id,\n sessionName: safeSession,\n created: false,\n error: `Failed to start tmux: ${result.error.message}`,\n };\n }\n\n if (result.status !== 0) {\n return {\n ok: false,\n appId: this.id,\n sessionName: safeSession,\n created: false,\n error: (result.stderr || result.stdout || \"Failed to create tmux session\").trim(),\n };\n }\n\n return { ok: true, appId: this.id, sessionName: safeSession, created: true };\n }\n\n detachAll(): void {\n for (const stream of this.streams.values()) {\n stream.detach();\n }\n this.streams.clear();\n }\n}\n\ninterface ShellProcessState {\n proc: ChildProcess;\n sessionName: string;\n windowName: string;\n pane: string;\n history: string[];\n listeners: Set<(data: string) => void>;\n closeListeners: Set<() => void>;\n}\n\n/**\n * Lightweight process-based adapter that keeps shell sessions available for\n * environments where tmux is unavailable.\n */\nclass ShellTerminalApp implements TerminalApp {\n id = \"shell\";\n label = \"shell\";\n private sessions = new Map<string, ShellProcessState>();\n\n isAvailable(): boolean {\n return true;\n }\n\n listSessions(): TerminalSession[] {\n return Array.from(this.sessions.values()).map((state) => ({\n appId: this.id,\n name: state.sessionName,\n windows: 1,\n attached: state.listeners.size > 0,\n }));\n }\n\n listPanes(): TerminalPane[] {\n return Array.from(this.sessions.entries()).map(([id, state]) => ({\n appId: this.id,\n session: state.sessionName,\n window: \"0\",\n windowName: state.windowName,\n pane: state.pane,\n command: process.env.SHELL || \"sh\",\n target: id,\n }));\n }\n\n async attach(target: string, onData: (data: string) => void, onClose: () => void): Promise<boolean> {\n const state = this.sessions.get(target);\n if (!state) return false;\n\n state.listeners.add(onData);\n state.closeListeners.add(onClose);\n if (state.history.length > 0) {\n onData(state.history.join(\"\"));\n }\n return true;\n }\n\n detach(target: string): void {\n const state = this.sessions.get(target);\n if (!state) return;\n state.listeners.clear();\n state.closeListeners.clear();\n }\n\n sendInput(target: string, keys: string): boolean {\n const state = this.sessions.get(target);\n if (!state || !state.proc.stdin?.writable) return false;\n state.proc.stdin.write(keys);\n return true;\n }\n\n resize(_target: string, _cols: number, _rows: number): boolean {\n return true;\n }\n\n createSession(sessionName: string, windowName = \"main\", cwd?: string): CreateSessionResult {\n const safeSession = sanitizeName(sessionName || `shell-${Date.now()}`);\n const shell = process.env.SHELL || \"sh\";\n const target = `${safeSession}:${randomUUID().slice(0, 8)}`;\n\n if (this.sessions.has(target)) {\n return { ok: true, appId: this.id, sessionName: safeSession, created: false };\n }\n\n const proc = spawn(shell, [], {\n cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n\n if (!proc.pid) {\n return {\n ok: false,\n appId: this.id,\n sessionName: safeSession,\n created: false,\n error: \"Failed to start shell process\",\n };\n }\n\n const state: ShellProcessState = {\n proc,\n sessionName: safeSession,\n windowName,\n pane: \"0\",\n history: [],\n listeners: new Set(),\n closeListeners: new Set(),\n };\n\n const pushChunk = (chunk: Buffer): void => {\n const text = chunk.toString();\n state.history.push(text);\n if (state.history.length > 200) {\n state.history.shift();\n }\n for (const listener of state.listeners) {\n listener(text);\n }\n };\n\n proc.stdout?.on(\"data\", pushChunk);\n proc.stderr?.on(\"data\", pushChunk);\n proc.on(\"close\", () => {\n for (const onClose of state.closeListeners) {\n onClose();\n }\n this.sessions.delete(target);\n });\n\n this.sessions.set(target, state);\n\n return { ok: true, appId: this.id, sessionName: safeSession, created: true };\n }\n\n detachAll(): void {\n for (const [id, state] of this.sessions.entries()) {\n state.proc.kill();\n this.sessions.delete(id);\n }\n }\n}\n\nfunction sendTmuxKeys(target: string, keys: string, pressEnter = false): boolean {\n try {\n const args = [\"send-keys\", \"-t\", target, keys];\n if (pressEnter) args.push(\"Enter\");\n const result = spawnSync(\"tmux\", args, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\nfunction captureTmuxPane(target: string, lines = 500): string {\n const argsList = [\n [\"capture-pane\", \"-t\", target, \"-pae\", \"-S\", `-${lines}`],\n [\"capture-pane\", \"-t\", target, \"-pe\", \"-S\", `-${lines}`],\n ];\n\n for (const args of argsList) {\n try {\n const result = spawnSync(\"tmux\", args, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n if (result.status === 0 && !result.error) {\n return result.stdout;\n }\n } catch {\n // try next fallback\n }\n }\n return \"\";\n}\n\nexport interface TerminalListResponse {\n apps: Array<{ id: string; label: string; available: boolean }>;\n sessions: TerminalSession[];\n panes: TerminalPane[];\n}\n\n/**\n * TerminalManager multiplexes app adapters and routes operations by app id.\n */\nexport class TerminalManager {\n private readonly apps = new Map<string, TerminalApp>();\n\n constructor(adapters?: TerminalApp[]) {\n const defaultAdapters = adapters ?? [new TmuxTerminalApp(), new ShellTerminalApp()];\n for (const adapter of defaultAdapters) {\n this.apps.set(adapter.id, adapter);\n }\n }\n\n list(): TerminalListResponse {\n const metadata = Array.from(this.apps.values()).map((app) => ({\n id: app.id,\n label: app.label,\n available: app.isAvailable(),\n }));\n\n const sessions: TerminalSession[] = [];\n const panes: TerminalPane[] = [];\n\n for (const app of this.apps.values()) {\n if (!app.isAvailable()) continue;\n sessions.push(...app.listSessions());\n panes.push(...app.listPanes());\n }\n\n return { apps: metadata, sessions, panes };\n }\n\n async attach(\n target: string,\n onData: (data: string) => void,\n onClose: () => void,\n appHint?: string,\n ): Promise<boolean> {\n const { appId, rawTarget } = resolveAppTarget(target, appHint);\n const app = this.apps.get(appId);\n if (!app || !app.isAvailable()) return false;\n return app.attach(rawTarget, onData, onClose);\n }\n\n detach(target: string, appHint?: string): void {\n const { appId, rawTarget } = resolveAppTarget(target, appHint);\n this.apps.get(appId)?.detach(rawTarget);\n }\n\n sendInput(target: string, keys: string, appHint?: string): boolean {\n const { appId, rawTarget } = resolveAppTarget(target, appHint);\n const app = this.apps.get(appId);\n return !!app && app.isAvailable() ? app.sendInput(rawTarget, keys) : false;\n }\n\n resize(target: string, cols: number, rows: number, appHint?: string): boolean {\n const { appId, rawTarget } = resolveAppTarget(target, appHint);\n const app = this.apps.get(appId);\n return !!app && app.isAvailable() ? app.resize(rawTarget, cols, rows) : false;\n }\n\n createSession(\n sessionName: string,\n windowName = \"main\",\n cwd?: string,\n appId = \"tmux\",\n ): CreateSessionResult {\n const app = this.apps.get(appId);\n if (!app || !app.isAvailable()) {\n return {\n ok: false,\n appId,\n sessionName,\n created: false,\n error: `Terminal app '${appId}' is not available`,\n };\n }\n return app.createSession(sessionName, windowName, cwd);\n }\n\n detachAll(): void {\n for (const app of this.apps.values()) {\n app.detachAll();\n }\n }\n}\n\nexport { TmuxTerminalApp, ShellTerminalApp };\n","/**\n * Telemetry & Observability\n *\n * Collects comprehensive observability data for a Viber runtime including:\n * - Machine resources: CPU, memory, disk, load, network\n * - Task runtime status: tasks, uptime, connection health\n *\n * Uses only Node.js built-in modules (os, fs, child_process) — no extra deps.\n */\n\nimport * as os from \"os\";\nimport { exec } from \"child_process\";\nimport type { SkillHealthReport } from \"../skills/health\";\n\nfunction execAsync(\n command: string,\n options: { encoding: \"utf-8\"; timeout?: number }\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n exec(command, options, (error, stdout, stderr) => {\n if (error) {\n reject(error);\n } else {\n resolve({ stdout: stdout as string, stderr: stderr as string });\n }\n });\n });\n}\n\n// ==================== Types ====================\n\n/** Config validation result for a specific category */\nexport interface ConfigValidation {\n category: \"llm_keys\" | \"oauth\" | \"env_secrets\" | \"skills\" | \"binary_deps\";\n status: \"verified\" | \"failed\" | \"unchecked\";\n message?: string;\n checkedAt: string;\n}\n\n/** Config sync state reported by the node */\nexport interface ConfigState {\n configVersion: string; // hash of current config\n lastConfigPullAt: string; // ISO timestamp\n validations: ConfigValidation[];\n}\n\n/** CPU usage snapshot (percentage-based) */\nexport interface CpuStatus {\n /** Number of logical CPU cores */\n cores: number;\n /** CPU model name */\n model: string;\n /** CPU speed in MHz */\n speedMHz: number;\n /** Per-core usage percentages (0-100) */\n coreUsages: number[];\n /** Average CPU usage across all cores (0-100) */\n averageUsage: number;\n}\n\n/** System memory status in bytes */\nexport interface MemoryStatus {\n /** Total system memory */\n totalBytes: number;\n /** Free (available) system memory */\n freeBytes: number;\n /** Used system memory */\n usedBytes: number;\n /** Usage percentage (0-100) */\n usagePercent: number;\n}\n\n/** Disk usage for a mount point */\nexport interface DiskStatus {\n /** Filesystem mount point */\n mount: string;\n /** Filesystem type (e.g., ext4, apfs) */\n fsType?: string;\n /** Total disk space in bytes */\n totalBytes: number;\n /** Used disk space in bytes */\n usedBytes: number;\n /** Available disk space in bytes */\n availableBytes: number;\n /** Usage percentage (0-100) */\n usagePercent: number;\n}\n\n/** Network interface summary */\nexport interface NetworkInterfaceStatus {\n /** Interface name (e.g., eth0, wlan0) */\n name: string;\n /** IPv4 address */\n ipv4?: string;\n /** IPv6 address */\n ipv6?: string;\n /** MAC address */\n mac?: string;\n /** Whether this is an internal (loopback) interface */\n internal: boolean;\n}\n\n/** Full machine resource snapshot */\nexport interface MachineResourceStatus {\n /** Host name */\n hostname: string;\n /** Operating system platform */\n platform: string;\n /** OS release version */\n osRelease: string;\n /** OS architecture (x64, arm64, etc.) */\n arch: string;\n /** System uptime in seconds */\n systemUptimeSeconds: number;\n /** CPU status */\n cpu: CpuStatus;\n /** System memory status */\n memory: MemoryStatus;\n /** Disk usage (primary mounts) */\n disks: DiskStatus[];\n /** System load averages (1, 5, 15 min) */\n loadAverage: [number, number, number];\n /** Active network interfaces */\n network: NetworkInterfaceStatus[];\n /** Timestamp when this snapshot was taken */\n collectedAt: string;\n}\n\n/** Information about a running task on this Viber runtime */\nexport interface RunningTaskInfo {\n /** Task ID */\n taskId: string;\n /** Task goal / description */\n goal: string;\n /** Model being used */\n model?: string;\n /** Whether the task is actively running LLM inference */\n isRunning: boolean;\n /** Number of messages in the conversation */\n messageCount: number;\n}\n\n/** Viber daemon running status */\nexport interface ViberRunningStatus {\n /** Viber daemon ID */\n viberId: string;\n /** Viber name */\n viberName: string;\n /** OpenViber version */\n version: string;\n /** Whether the viber is connected to the hub */\n connected: boolean;\n /** Daemon process uptime in seconds */\n daemonUptimeSeconds: number;\n /** Node.js process memory usage */\n processMemory: {\n rss: number;\n heapTotal: number;\n heapUsed: number;\n external: number;\n };\n /** Number of running tasks */\n runningTaskCount: number;\n /** Detailed info on running tasks */\n runningTasks: RunningTaskInfo[];\n /** Skills loaded on this viber */\n skills: string[];\n /** Capabilities enabled */\n capabilities: string[];\n /** Health status for installed skills (optional, on-demand) */\n skillHealth?: SkillHealthReport;\n /** Total tasks executed since startup */\n totalTasksExecuted: number;\n /** Timestamp of last heartbeat sent */\n lastHeartbeatAt?: string;\n /** Timestamp when this snapshot was taken */\n collectedAt: string;\n}\n\n/** Combined viber observability snapshot */\nexport interface ViberSystemStatus {\n machine: MachineResourceStatus;\n viber: ViberRunningStatus;\n configState?: ConfigState;\n}\n\n// ==================== CPU Usage Tracking ====================\n\nlet previousCpuTimes: os.CpuInfo[] | null = null;\n\n/**\n * Calculate per-core CPU usage percentages by comparing two snapshots.\n * Returns array of per-core usage (0-100) and the average.\n */\nfunction calculateCpuUsage(): { coreUsages: number[]; averageUsage: number } {\n const cpus = os.cpus();\n\n if (!previousCpuTimes) {\n previousCpuTimes = cpus;\n // Return 0 on first call since we need two snapshots\n return {\n coreUsages: cpus.map(() => 0),\n averageUsage: 0,\n };\n }\n\n const coreUsages: number[] = [];\n\n for (let i = 0; i < cpus.length; i++) {\n const prev = previousCpuTimes[i];\n const curr = cpus[i];\n\n if (!prev || !curr) {\n coreUsages.push(0);\n continue;\n }\n\n const prevTotal =\n prev.times.user +\n prev.times.nice +\n prev.times.sys +\n prev.times.idle +\n prev.times.irq;\n const currTotal =\n curr.times.user +\n curr.times.nice +\n curr.times.sys +\n curr.times.idle +\n curr.times.irq;\n\n const totalDiff = currTotal - prevTotal;\n const idleDiff = curr.times.idle - prev.times.idle;\n\n if (totalDiff === 0) {\n coreUsages.push(0);\n } else {\n const usage = ((totalDiff - idleDiff) / totalDiff) * 100;\n coreUsages.push(Math.round(usage * 100) / 100);\n }\n }\n\n previousCpuTimes = cpus;\n\n const averageUsage =\n coreUsages.length > 0\n ? Math.round(\n (coreUsages.reduce((a, b) => a + b, 0) / coreUsages.length) * 100\n ) / 100\n : 0;\n\n return { coreUsages, averageUsage };\n}\n\n// ==================== Disk Usage ====================\n\n/**\n * Collect disk usage for primary mount points.\n * Uses `df` on Linux/macOS. Returns empty array on failure.\n */\nexport async function collectDiskStatus(): Promise<DiskStatus[]> {\n try {\n const { stdout: output } = await execAsync(\"df -kP 2>/dev/null\", {\n encoding: \"utf-8\",\n timeout: 5000,\n });\n\n const lines = output.trim().split(\"\\n\").slice(1); // Skip header\n const disks: DiskStatus[] = [];\n\n for (const line of lines) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 6) continue;\n\n const mount = parts[5];\n // Only include real filesystems, skip tmpfs/devtmpfs/etc.\n if (\n !mount ||\n mount.startsWith(\"/snap\") ||\n mount.startsWith(\"/boot\") ||\n mount === \"/dev\" ||\n mount === \"/dev/shm\"\n ) {\n continue;\n }\n\n // Only include root \"/\" and home-like mounts\n if (mount === \"/\" || mount.startsWith(\"/home\") || mount.startsWith(\"/Users\") || mount === \"/System/Volumes/Data\" || mount === \"/tmp\") {\n const totalKb = parseInt(parts[1], 10);\n const usedKb = parseInt(parts[2], 10);\n const availKb = parseInt(parts[3], 10);\n\n if (isNaN(totalKb) || totalKb === 0) continue;\n\n disks.push({\n mount,\n totalBytes: totalKb * 1024,\n usedBytes: usedKb * 1024,\n availableBytes: availKb * 1024,\n usagePercent:\n Math.round(((usedKb / totalKb) * 100) * 100) / 100,\n });\n }\n }\n\n // On macOS APFS, \"/\" is a read-only system snapshot and\n // \"/System/Volumes/Data\" holds the actual user data. They share\n // the same container, so showing both is misleading. Drop \"/\"\n // when the Data volume is present.\n const hasDataVol = disks.some(d => d.mount === \"/System/Volumes/Data\");\n if (hasDataVol) {\n return disks.filter(d => d.mount !== \"/\");\n }\n\n return disks;\n } catch {\n return [];\n }\n}\n\n// ==================== Network ====================\n\n/**\n * Collect active (non-internal) network interface info.\n */\nfunction collectNetworkStatus(): NetworkInterfaceStatus[] {\n const interfaces = os.networkInterfaces();\n const result: NetworkInterfaceStatus[] = [];\n\n for (const [name, addrs] of Object.entries(interfaces)) {\n if (!addrs) continue;\n\n const iface: NetworkInterfaceStatus = {\n name,\n internal: addrs.some((a) => a.internal) ?? false,\n };\n\n for (const addr of addrs) {\n if (addr.family === \"IPv4\") {\n iface.ipv4 = addr.address;\n iface.mac = addr.mac;\n } else if (addr.family === \"IPv6\" && !addr.address.startsWith(\"fe80\")) {\n iface.ipv6 = addr.address;\n }\n }\n\n // Only include interfaces with at least an IPv4 address\n if (iface.ipv4) {\n result.push(iface);\n }\n }\n\n return result;\n}\n\n// ==================== Public API ====================\n\n/**\n * Collect a full machine resource status snapshot.\n * Safe to call frequently (e.g., every heartbeat interval).\n */\nexport async function collectMachineResourceStatus(): Promise<MachineResourceStatus> {\n const cpus = os.cpus();\n const { coreUsages, averageUsage } = calculateCpuUsage();\n\n return {\n hostname: os.hostname(),\n platform: `${os.platform()} ${os.release()}`,\n osRelease: os.release(),\n arch: os.arch(),\n systemUptimeSeconds: Math.round(os.uptime()),\n cpu: {\n cores: cpus.length,\n model: cpus[0]?.model ?? \"unknown\",\n speedMHz: cpus[0]?.speed ?? 0,\n coreUsages,\n averageUsage,\n },\n memory: {\n totalBytes: os.totalmem(),\n freeBytes: os.freemem(),\n usedBytes: os.totalmem() - os.freemem(),\n usagePercent:\n Math.round(\n ((os.totalmem() - os.freemem()) / os.totalmem()) * 100 * 100\n ) / 100,\n },\n disks: await collectDiskStatus(),\n loadAverage: os.loadavg() as [number, number, number],\n network: collectNetworkStatus(),\n collectedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Collect viber running status.\n * Caller must provide runtime-specific data (tasks, connection state, etc.)\n */\nexport function collectViberRunningStatus(params: {\n viberId: string;\n viberName: string;\n version: string;\n connected: boolean;\n daemonStartTime: number;\n runningTasks: RunningTaskInfo[];\n skills: string[];\n capabilities: string[];\n skillHealth?: SkillHealthReport;\n totalTasksExecuted: number;\n lastHeartbeatAt?: string;\n}): ViberRunningStatus {\n const mem = process.memoryUsage();\n\n return {\n viberId: params.viberId,\n viberName: params.viberName,\n version: params.version,\n connected: params.connected,\n daemonUptimeSeconds: Math.round((Date.now() - params.daemonStartTime) / 1000),\n processMemory: {\n rss: mem.rss,\n heapTotal: mem.heapTotal,\n heapUsed: mem.heapUsed,\n external: mem.external,\n },\n runningTaskCount: params.runningTasks.length,\n runningTasks: params.runningTasks,\n skills: params.skills,\n capabilities: params.capabilities,\n skillHealth: params.skillHealth,\n totalTasksExecuted: params.totalTasksExecuted,\n lastHeartbeatAt: params.lastHeartbeatAt,\n collectedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Collect the full viber observability snapshot.\n */\nexport async function collectViberSystemStatus(params: {\n viberId: string;\n viberName: string;\n version: string;\n connected: boolean;\n daemonStartTime: number;\n runningTasks: RunningTaskInfo[];\n skills: string[];\n capabilities: string[];\n skillHealth?: SkillHealthReport;\n totalTasksExecuted: number;\n lastHeartbeatAt?: string;\n}): Promise<ViberSystemStatus> {\n return {\n machine: await collectMachineResourceStatus(),\n viber: collectViberRunningStatus(params),\n };\n}\n\n// ==================== Formatting Helpers ====================\n\n/**\n * Format bytes into human-readable string (e.g., \"1.5 GB\")\n */\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = bytes / Math.pow(k, i);\n return `${value.toFixed(1)} ${units[i]}`;\n}\n\n/**\n * Format seconds into human-readable uptime (e.g., \"2d 5h 30m\")\n */\nexport function formatUptime(seconds: number): string {\n const days = Math.floor(seconds / 86400);\n const hours = Math.floor((seconds % 86400) / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = Math.floor(seconds % 60);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n if (hours > 0) parts.push(`${hours}h`);\n if (minutes > 0) parts.push(`${minutes}m`);\n if (parts.length === 0) parts.push(`${secs}s`);\n\n return parts.join(\" \");\n}\n\n/**\n * Format a ViberSystemStatus into a human-readable string\n * suitable for CLI display.\n */\nexport function formatViberSystemStatus(status: ViberSystemStatus): string {\n const { machine: m, viber: v } = status;\n const w = 55;\n const border = `+${\"-\".repeat(w + 2)}+`;\n const line = (s: string) => `| ${s.padEnd(w)} |`;\n\n const lines: string[] = [];\n\n lines.push(border);\n lines.push(line(\"VIBER OBSERVABILITY\".padStart(Math.floor((w + 19) / 2))));\n lines.push(border);\n\n // Machine section\n lines.push(line(\"MACHINE RESOURCES\"));\n lines.push(border);\n lines.push(line(\"Host: \" + m.hostname.slice(0, 42)));\n lines.push(line(\"Platform: \" + m.platform.slice(0, 42)));\n lines.push(line(\"Arch: \" + m.arch.slice(0, 42)));\n lines.push(line(\"Uptime: \" + formatUptime(m.systemUptimeSeconds).slice(0, 42)));\n lines.push(line(\"\"));\n lines.push(line(\"CPU: \" + (m.cpu.cores + \" cores, \" + m.cpu.averageUsage.toFixed(1) + \"% avg\").slice(0, 42)));\n lines.push(line(\"Memory: \" + (formatBytes(m.memory.usedBytes) + \" / \" + formatBytes(m.memory.totalBytes) + \" (\" + m.memory.usagePercent.toFixed(1) + \"%)\").slice(0, 42)));\n lines.push(line(\"Load Avg: \" + m.loadAverage.map((l) => l.toFixed(2)).join(\", \").slice(0, 42)));\n\n if (m.disks.length > 0) {\n for (const d of m.disks) {\n lines.push(line(\"Disk \" + d.mount.slice(0, 7).padEnd(7) + (formatBytes(d.usedBytes) + \" / \" + formatBytes(d.totalBytes) + \" (\" + d.usagePercent.toFixed(1) + \"%)\").slice(0, 42)));\n }\n }\n\n if (m.network.length > 0) {\n const nonInternal = m.network.filter((n) => !n.internal);\n if (nonInternal.length > 0) {\n lines.push(line(\"Network: \" + nonInternal.map((n) => n.name + \"=\" + (n.ipv4 || \"?\")).join(\", \").slice(0, 42)));\n }\n }\n\n // Viber section\n lines.push(border);\n lines.push(line(\"TASK RUNTIME STATUS\"));\n lines.push(border);\n lines.push(line(\"Runtime ID: \" + v.viberId.slice(0, 42)));\n lines.push(line(\"Name: \" + v.viberName.slice(0, 42)));\n lines.push(line(\"Version: \" + v.version.slice(0, 42)));\n lines.push(line(\"Connected: \" + (v.connected ? \"* Yes\" : \"o No\")));\n lines.push(line(\"Daemon Up: \" + formatUptime(v.daemonUptimeSeconds).slice(0, 42)));\n lines.push(line(\"Tasks: \" + (v.runningTaskCount + \" running, \" + v.totalTasksExecuted + \" total\").slice(0, 42)));\n lines.push(line(\"Process Mem: \" + (formatBytes(v.processMemory.rss) + \" RSS, \" + formatBytes(v.processMemory.heapUsed) + \" heap\").slice(0, 42)));\n\n if (v.skills.length > 0) {\n lines.push(line(\"Skills: \" + v.skills.join(\", \").slice(0, 42)));\n }\n if (v.capabilities.length > 0) {\n lines.push(line(\"Capabilities:\" + v.capabilities.join(\", \").slice(0, 42)));\n }\n\n if (v.runningTasks.length > 0) {\n lines.push(line(\"\"));\n lines.push(line(\"Active Tasks:\"));\n for (const t of v.runningTasks) {\n const desc = `${t.taskId.slice(0, 16)}... ${t.goal.slice(0, 25)}`;\n lines.push(line(desc.slice(0, w)));\n }\n }\n\n lines.push(border);\n\n return lines.join(\"\\n\");\n}\n","/**\n * Config Validator - Validates node configuration actually works\n *\n * The node is the authority on what works. This module validates that config\n * values (LLM keys, OAuth tokens, env secrets) are not just present, but actually functional.\n */\n\nimport type { ConfigValidation } from \"./telemetry\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOpenRouter } from \"@openrouter/ai-sdk-provider\";\n\nexport interface ConfigValidationResult {\n category: ConfigValidation[\"category\"];\n status: ConfigValidation[\"status\"];\n message?: string;\n}\n\n/**\n * Validate an LLM API key by making a minimal API call.\n * Uses a lightweight models-list or single-token completion to verify the key works.\n */\nexport async function validateLlmKey(\n provider: string,\n apiKey: string,\n baseUrl?: string,\n): Promise<ConfigValidationResult> {\n if (!apiKey || !apiKey.trim()) {\n return {\n category: \"llm_keys\",\n status: \"failed\",\n message: \"API key is empty\",\n };\n }\n\n try {\n // Create provider instance\n let providerInstance: any;\n switch (provider.toLowerCase()) {\n case \"anthropic\":\n providerInstance = createAnthropic({\n apiKey,\n baseURL: baseUrl,\n });\n break;\n case \"openai\":\n providerInstance = createOpenAI({\n apiKey,\n baseURL: baseUrl,\n });\n break;\n case \"openrouter\":\n providerInstance = createOpenRouter({\n apiKey,\n baseURL: baseUrl,\n });\n break;\n default:\n // For unknown providers, just check that key exists\n return {\n category: \"llm_keys\",\n status: \"unchecked\",\n message: `Provider '${provider}' validation not implemented`,\n };\n }\n\n // Make a minimal API call to verify the key works\n // For most providers, we can use a simple completion with minimal tokens\n // For OpenRouter, we can list models\n if (provider.toLowerCase() === \"openrouter\") {\n // OpenRouter: try to list models (lightweight)\n const response = await fetch(\"https://openrouter.ai/api/v1/models\", {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) {\n return {\n category: \"llm_keys\",\n status: \"failed\",\n message: `API key validation failed: ${response.status} ${response.statusText}`,\n };\n }\n } else {\n // For Anthropic/OpenAI: try a minimal completion\n // Use the provider's generateText with a tiny prompt and maxTokens=1\n const result = await providerInstance.generateText({\n model: provider.toLowerCase() === \"anthropic\" ? \"claude-3-haiku-20240307\" : \"gpt-3.5-turbo\",\n prompt: \"Hi\",\n maxTokens: 1,\n });\n\n if (!result || !result.text) {\n return {\n category: \"llm_keys\",\n status: \"failed\",\n message: \"API key validation failed: no response\",\n };\n }\n }\n\n return {\n category: \"llm_keys\",\n status: \"verified\",\n message: `${provider} API key is valid`,\n };\n } catch (error: any) {\n const errorMessage = error?.message || String(error);\n // Check for common error patterns\n if (errorMessage.includes(\"401\") || errorMessage.includes(\"Unauthorized\")) {\n return {\n category: \"llm_keys\",\n status: \"failed\",\n message: \"API key is invalid or unauthorized\",\n };\n }\n if (errorMessage.includes(\"timeout\")) {\n return {\n category: \"llm_keys\",\n status: \"failed\",\n message: \"API key validation timed out\",\n };\n }\n return {\n category: \"llm_keys\",\n status: \"failed\",\n message: `API key validation failed: ${errorMessage}`,\n };\n }\n}\n\n/**\n * Validate an OAuth token by checking expiry and optionally making a test API call.\n */\nexport async function validateOAuthToken(\n provider: string,\n accessToken: string,\n expiresAt?: string,\n): Promise<ConfigValidationResult> {\n if (!accessToken || !accessToken.trim()) {\n return {\n category: \"oauth\",\n status: \"failed\",\n message: \"OAuth token is empty\",\n };\n }\n\n // Check expiry if provided\n if (expiresAt) {\n const expiryDate = new Date(expiresAt);\n if (expiryDate < new Date()) {\n return {\n category: \"oauth\",\n status: \"failed\",\n message: `OAuth token expired on ${expiryDate.toISOString()}`,\n };\n }\n }\n\n // Optionally make a test API call based on provider\n try {\n switch (provider.toLowerCase()) {\n case \"google\":\n // Test Google OAuth by calling userinfo endpoint\n const googleResponse = await fetch(\"https://www.googleapis.com/oauth2/v2/userinfo\", {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n signal: AbortSignal.timeout(5000),\n });\n\n if (!googleResponse.ok) {\n return {\n category: \"oauth\",\n status: \"failed\",\n message: `Google OAuth validation failed: ${googleResponse.status}`,\n };\n }\n break;\n\n case \"github\":\n // Test GitHub OAuth by calling user endpoint\n const githubResponse = await fetch(\"https://api.github.com/user\", {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n Accept: \"application/vnd.github.v3+json\",\n },\n signal: AbortSignal.timeout(5000),\n });\n\n if (!githubResponse.ok) {\n return {\n category: \"oauth\",\n status: \"failed\",\n message: `GitHub OAuth validation failed: ${githubResponse.status}`,\n };\n }\n break;\n\n default:\n // For other providers, just check that token exists and isn't expired\n return {\n category: \"oauth\",\n status: expiresAt ? \"verified\" : \"unchecked\",\n message: expiresAt\n ? `OAuth token valid until ${new Date(expiresAt).toISOString()}`\n : \"OAuth token present (expiry not checked)\",\n };\n }\n\n return {\n category: \"oauth\",\n status: \"verified\",\n message: `${provider} OAuth token is valid`,\n };\n } catch (error: any) {\n const errorMessage = error?.message || String(error);\n if (errorMessage.includes(\"timeout\")) {\n return {\n category: \"oauth\",\n status: \"failed\",\n message: \"OAuth token validation timed out\",\n };\n }\n return {\n category: \"oauth\",\n status: \"failed\",\n message: `OAuth token validation failed: ${errorMessage}`,\n };\n }\n}\n\n/**\n * Validate environment secrets are present and non-empty.\n */\nexport function validateEnvSecrets(\n expected: string[],\n actual: Record<string, string>,\n): ConfigValidationResult {\n const missing: string[] = [];\n const empty: string[] = [];\n\n for (const key of expected) {\n const value = actual[key];\n if (value === undefined || value === null) {\n missing.push(key);\n } else if (typeof value === \"string\" && !value.trim()) {\n empty.push(key);\n }\n }\n\n if (missing.length > 0) {\n return {\n category: \"env_secrets\",\n status: \"failed\",\n message: `Missing environment variables: ${missing.join(\", \")}`,\n };\n }\n\n if (empty.length > 0) {\n return {\n category: \"env_secrets\",\n status: \"failed\",\n message: `Empty environment variables: ${empty.join(\", \")}`,\n };\n }\n\n return {\n category: \"env_secrets\",\n status: \"verified\",\n message: `All ${expected.length} environment variables are present`,\n };\n}\n\n/**\n * Validate all LLM provider keys from a config object.\n */\nexport async function validateAllLlmKeys(\n aiProviders: Record<string, { apiKey?: string; baseUrl?: string }>,\n): Promise<ConfigValidationResult[]> {\n const results: ConfigValidationResult[] = [];\n\n for (const [provider, config] of Object.entries(aiProviders)) {\n if (config.apiKey) {\n const result = await validateLlmKey(provider, config.apiKey, config.baseUrl);\n results.push(result);\n }\n }\n\n return results;\n}\n\n/**\n * Validate all OAuth tokens from a config object.\n */\nexport async function validateAllOAuthTokens(\n oauthConnections: Array<{\n provider: string;\n accessToken: string;\n expiresAt?: string | null;\n }>,\n): Promise<ConfigValidationResult[]> {\n const results: ConfigValidationResult[] = [];\n\n for (const conn of oauthConnections) {\n if (conn.accessToken) {\n const result = await validateOAuthToken(\n conn.provider,\n conn.accessToken,\n conn.expiresAt || undefined,\n );\n results.push(result);\n }\n }\n\n return results;\n}\n","/**\n * ViberController - Daemon controller for outbound connection to gateway\n *\n * A Viber is a local agent daemon that connects OUTBOUND to a central gateway.\n * This eliminates the need for public IPs or port forwarding.\n *\n * Features:\n * - Persistent WebSocket connection to gateway\n * - Auto-reconnection on disconnect\n * - Heartbeat/health monitoring\n * - Task execution and event streaming\n */\n\nimport { EventEmitter } from \"events\";\nimport WebSocket from \"ws\";\nimport { spawnSync } from \"child_process\";\nimport type { ViberOptions } from \"../worker/viber-agent\";\nimport { runTask, appendDailyMemory } from \"./runtime\";\nimport { consolidateMemory } from \"./memory\";\nimport { createLogger } from \"../utils/logger\";\nimport { TerminalManager } from \"./terminal\";\nimport { getOpenViberVersion } from \"../utils/version\";\nimport {\n collectMachineResourceStatus,\n collectViberSystemStatus,\n collectViberRunningStatus,\n type MachineResourceStatus,\n type ViberRunningStatus as ViberNodeRunningStatus,\n type RunningTaskInfo,\n type ViberSystemStatus,\n type ConfigState,\n type ConfigValidation,\n} from \"./telemetry\";\nimport type { SkillHealthReport, SkillHealthResult } from \"../skills/health\";\nimport { createHash } from \"crypto\";\nimport {\n validateAllLlmKeys,\n validateAllOAuthTokens,\n validateEnvSecrets,\n type ConfigValidationResult,\n} from \"./config-validator\";\n\n// ==================== Types ====================\n\nexport interface ViberControllerConfig {\n /** WebSocket URL to connect to the gateway */\n serverUrl?: string;\n /** Authentication token */\n token?: string;\n /** Unique identifier for this viber */\n viberId: string;\n /** Human-readable name for this viber */\n viberName?: string;\n /** Milliseconds between reconnection attempts */\n reconnectInterval?: number;\n /** Milliseconds between heartbeat messages */\n heartbeatInterval?: number;\n /** Enable desktop control tools */\n enableDesktop?: boolean;\n}\n\nexport interface ViberSkillInfo {\n id: string;\n name: string;\n description: string;\n /** Whether this skill is runnable on this node */\n available: boolean;\n /** Health check status */\n status: \"AVAILABLE\" | \"NOT_AVAILABLE\" | \"UNKNOWN\";\n /** Human-readable summary of health check results (e.g. \"Missing: gh CLI\") */\n healthSummary?: string;\n /** Full health check details with actionType for UI actions */\n checks?: Array<{\n id: string;\n label: string;\n ok: boolean;\n required?: boolean;\n message?: string;\n hint?: string;\n actionType?: \"env\" | \"oauth\" | \"binary\" | \"auth_cli\" | \"manual\";\n }>;\n}\n\nexport interface ViberInfo {\n id: string;\n name: string;\n version: string;\n platform: string;\n capabilities: string[];\n runningTasks: string[];\n /** Skills available on this viber (from SKILL.md) */\n skills?: ViberSkillInfo[];\n}\n\nexport interface ViberStatus {\n platform: string;\n uptime: number;\n memory: NodeJS.MemoryUsage;\n runningTasks: number;\n /** Machine resource status snapshot (CPU, memory, disk, network) */\n machine?: MachineResourceStatus;\n /** Viber daemon running status (tasks, skills, process info) */\n viberStatus?: ViberNodeRunningStatus;\n /** Extended skill info with availability (updated periodically) */\n skills?: ViberSkillInfo[];\n /** Config sync state (version, last pull, validations) */\n configState?: import(\"./telemetry\").ConfigState;\n}\n\n// Gateway -> Viber daemon messages\nexport type ControllerServerMessage =\n | {\n type: \"task:create\";\n taskId: string;\n goal: string;\n options?: ViberOptions;\n messages?: { role: string; content: string }[];\n environment?: {\n name: string;\n repoUrl?: string;\n repoOrg?: string;\n repoName?: string;\n repoBranch?: string;\n variables?: { key: string; value: string }[];\n };\n settings?: { primaryCodingCli?: string; channelIds?: string[]; skills?: string[] };\n oauthTokens?: Record<string, { accessToken: string; refreshToken?: string | null }>;\n }\n | { type: \"task:stop\"; taskId: string }\n | {\n type: \"task:message\";\n taskId: string;\n message: string;\n injectionMode?: \"steer\" | \"followup\" | \"collect\";\n }\n | { type: \"ping\" }\n | { type: \"config:update\"; config: Partial<ViberControllerConfig> }\n | { type: \"config:push\" }\n | { type: \"status:request\" }\n | {\n type: \"skill:provision\";\n requestId: string;\n skillId: string;\n install?: boolean;\n authAction?: \"none\" | \"copy\" | \"start\";\n };\n\n// Viber daemon -> Gateway messages\nexport type ControllerClientMessage =\n | { type: \"connected\"; viber: ViberInfo }\n | { type: \"task:started\"; taskId: string; spaceId: string }\n | { type: \"task:progress\"; taskId: string; event: any }\n | { type: \"task:stream-chunk\"; taskId: string; chunk: string }\n | { type: \"task:completed\"; taskId: string; result: any }\n | { type: \"task:error\"; taskId: string; error: string; model?: string }\n | { type: \"heartbeat\"; status: ViberStatus }\n | { type: \"pong\" }\n | { type: \"status:report\"; status: ViberSystemStatus }\n | {\n type: \"skill:provision-result\";\n requestId: string;\n skillId: string;\n ok: boolean;\n ready: boolean;\n before?: SkillHealthResult;\n after?: SkillHealthResult;\n auth?: {\n required: boolean;\n ready: boolean;\n command?: string;\n message?: string;\n };\n installLog?: Array<{\n checkId: string;\n command: string;\n ok: boolean;\n output?: string;\n }>;\n error?: string;\n }\n | { type: \"config:ack\"; configVersion: string; validations: import(\"./telemetry\").ConfigValidation[] }\n | { type: \"jobs:list\"; jobs: Array<{ name: string; schedule: string; prompt: string; description?: string; model?: string; viberId?: string }> };\n\ninterface TaskProgressEnvelope {\n eventId: string;\n sequence: number;\n taskId: string;\n conversationId: string;\n createdAt: string;\n model?: string;\n event: Record<string, unknown>;\n}\n\ninterface TaskRuntimeState {\n taskId: string;\n goal: string;\n options?: ViberOptions;\n sequence: number;\n controller: AbortController;\n running: boolean;\n stopped: boolean;\n messageHistory: { role: string; content: string }[];\n queuedFollowups: string[];\n collectBuffer: string[];\n environment?: {\n name: string;\n repoUrl?: string;\n repoOrg?: string;\n repoName?: string;\n repoBranch?: string;\n variables?: { key: string; value: string }[];\n };\n oauthTokens?: Record<string, { accessToken: string; refreshToken?: string | null }>;\n}\n\n// ==================== Controller ====================\n\nexport class ViberController extends EventEmitter {\n private ws: WebSocket | null = null;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private heartbeatTimer: NodeJS.Timeout | null = null;\n /** taskId -> runtime state */\n private runningTasks: Map<string, TaskRuntimeState> = new Map();\n private isConnected = false;\n private shouldReconnect = true;\n /** Terminal manager for streaming tmux panes */\n private terminalManager = new TerminalManager();\n /** Timestamp when the daemon started */\n private daemonStartTime: number = Date.now();\n /** Total tasks executed since daemon start */\n private totalTasksExecuted: number = 0;\n /** Skills loaded on this viber */\n private loadedSkills: string[] = [];\n /** Capabilities available */\n private loadedCapabilities: string[] = [];\n /** Timestamp of last heartbeat sent */\n private lastHeartbeatAt?: string;\n private skillHealthCache?: SkillHealthReport;\n private skillHealthCachedAt?: number;\n private skillHealthInFlight?: Promise<SkillHealthReport>;\n /** Current config state (version, last pull, validations) */\n private configState?: ConfigState;\n private log = createLogger(\"controller\");\n\n constructor(private config: ViberControllerConfig) {\n super();\n }\n\n /**\n * Start the viber daemon\n */\n async start(): Promise<void> {\n this.log = createLogger(\"controller\", { viberId: this.config.viberId });\n this.log.info(\"Starting viber\", {\n serverUrl: this.config.serverUrl || \"(standalone)\",\n });\n this.shouldReconnect = true;\n\n if (!this.config.serverUrl) {\n await this.initializeLocalStatus();\n this.startHeartbeat();\n this.emit(\"connected\");\n return;\n }\n\n await this.connect();\n }\n\n /**\n * Stop the viber daemon\n */\n async stop(): Promise<void> {\n this.log.info(\"Stopping viber\");\n this.shouldReconnect = false;\n\n for (const [taskId, runtime] of this.runningTasks) {\n runtime.stopped = true;\n runtime.controller.abort();\n this.runningTasks.delete(taskId);\n }\n\n // Detach all terminal streams\n this.terminalManager.detachAll();\n\n // Clear timers\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n // Close connection\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.emit(\"stopped\");\n }\n\n /**\n * Get current connection status\n */\n getStatus(): { connected: boolean; runningTasks: number } {\n return {\n connected: this.isConnected,\n runningTasks: this.runningTasks.size,\n };\n }\n\n /**\n * Get full node observability status including machine resources and viber running status.\n */\n async getNodeObservabilityStatus(): Promise<ViberSystemStatus> {\n const status = await collectViberSystemStatus({\n viberId: this.config.viberId,\n viberName: this.config.viberName || this.config.viberId,\n version: getOpenViberVersion(),\n connected: this.isConnected,\n daemonStartTime: this.daemonStartTime,\n runningTasks: this.getRunningTaskInfos(),\n skills: this.loadedSkills,\n capabilities: this.loadedCapabilities,\n totalTasksExecuted: this.totalTasksExecuted,\n lastHeartbeatAt: this.lastHeartbeatAt,\n });\n // Include config state if available\n if (this.configState) {\n status.configState = this.configState;\n }\n return status;\n }\n\n /**\n * Get running task info for observability\n */\n private getRunningTaskInfos(): RunningTaskInfo[] {\n return Array.from(this.runningTasks.values()).map((rt) => ({\n taskId: rt.taskId,\n goal: rt.goal,\n model: rt.options?.model,\n isRunning: rt.running,\n messageCount: rt.messageHistory.length,\n }));\n }\n\n // ==================== Connection Management ====================\n\n private async connect(): Promise<void> {\n if (!this.config.serverUrl) {\n this.log.info(\"No command center configured; running in standalone mode\");\n return;\n }\n\n try {\n this.ws = new WebSocket(this.config.serverUrl, {\n headers: {\n Authorization: `Bearer ${this.config.token || \"\"}`,\n \"X-Viber-Id\": this.config.viberId,\n \"X-Viber-Version\": getOpenViberVersion(),\n },\n });\n\n this.ws.on(\"open\", () => {\n void this.onConnected();\n });\n this.ws.on(\"message\", (data) => this.onMessage(data));\n this.ws.on(\"close\", () => this.onDisconnected());\n this.ws.on(\"error\", (err) => this.onError(err));\n } catch (error) {\n this.log.error(\"Connection failed\", { error: String(error) });\n this.scheduleReconnect();\n }\n }\n\n private async onConnected(): Promise<void> {\n this.log.info(\"Connected to command center\");\n this.isConnected = true;\n\n const { capabilities, skills } = await this.initializeLocalStatus();\n\n this.send({\n type: \"connected\",\n viber: {\n id: this.config.viberId,\n name: this.config.viberName || this.config.viberId,\n version: getOpenViberVersion(),\n platform: process.platform,\n capabilities,\n runningTasks: Array.from(this.runningTasks.keys()),\n skills: skills.length > 0 ? skills : undefined,\n },\n });\n\n this.startHeartbeat();\n this.emit(\"connected\");\n }\n\n /**\n * Load local capabilities and skill metadata/health for status reporting.\n */\n private async initializeLocalStatus(): Promise<{ capabilities: string[]; skills: ViberSkillInfo[] }> {\n\n const capabilities = [\"file\", \"search\", \"web\"];\n if (this.config.enableDesktop) {\n capabilities.push(\"desktop\");\n }\n\n let skills: ViberSkillInfo[] = [];\n try {\n const { defaultRegistry } = await import(\"../skills/registry\");\n await defaultRegistry.loadAll();\n const all = defaultRegistry.getAllSkills();\n\n // Run health checks to determine skill availability\n const { checkSkillsHealth } = await import(\"../skills/health\");\n const skillInfos = all.map((s) => ({\n id: s.id,\n name: s.metadata.name || s.id,\n description: s.metadata.description || \"\",\n }));\n const healthReport = await checkSkillsHealth(skillInfos);\n // Cache the report so heartbeat can reuse it\n this.skillHealthCache = healthReport;\n this.skillHealthCachedAt = Date.now();\n\n const healthMap = new Map(healthReport.skills.map((r) => [r.id, r]));\n\n skills = all.map((s) => {\n const health = healthMap.get(s.id);\n return {\n id: s.id,\n name: s.metadata.name || s.id,\n description: s.metadata.description || \"\",\n available: health?.available ?? false,\n status: health?.status ?? \"UNKNOWN\",\n healthSummary: health?.summary,\n };\n });\n } catch (err) {\n this.log.warn(\"Could not load skills for capabilities\", { error: String(err) });\n }\n\n // Store loaded capabilities and skills for status reporting\n this.loadedCapabilities = capabilities;\n this.loadedSkills = skills.map((s) => s.id);\n\n return { capabilities, skills };\n }\n\n private onDisconnected(): void {\n this.log.info(\"Disconnected from command center\");\n this.isConnected = false;\n this.stopHeartbeat();\n\n if (this.shouldReconnect) {\n this.scheduleReconnect();\n }\n\n this.emit(\"disconnected\");\n }\n\n private onError(error: Error): void {\n this.log.error(\"WebSocket error\", { error: error.message });\n this.emit(\"error\", error);\n }\n\n private async onMessage(data: WebSocket.Data): Promise<void> {\n try {\n const message = JSON.parse(data.toString()) as ControllerServerMessage;\n\n switch (message.type) {\n case \"task:create\":\n await this.handleTaskSubmit({\n taskId: message.taskId,\n goal: message.goal,\n options: { ...message.options, settings: message.settings },\n messages: message.messages,\n environment: message.environment,\n oauthTokens: message.oauthTokens,\n });\n break;\n\n case \"task:stop\":\n await this.handleTaskStop(message.taskId);\n break;\n\n case \"task:message\":\n await this.handleTaskMessage(\n message.taskId,\n message.message,\n message.injectionMode\n );\n break;\n\n case \"ping\":\n this.send({ type: \"pong\" });\n break;\n\n case \"config:update\":\n Object.assign(this.config, message.config);\n this.emit(\"config:update\", message.config);\n break;\n\n case \"config:push\":\n await this.handleConfigPush();\n break;\n\n case \"status:request\":\n await this.handleStatusRequest();\n break;\n\n case \"skill:provision\":\n await this.handleSkillProvision(message);\n break;\n }\n } catch (error) {\n this.log.error(\"Failed to process message\", { error: String(error) });\n }\n }\n\n // ==================== Task Handling ====================\n\n private async handleTaskSubmit(message: {\n taskId: string;\n goal: string;\n options?: ViberOptions;\n messages?: { role: string; content: string }[];\n environment?: {\n name: string;\n repoUrl?: string;\n repoOrg?: string;\n repoName?: string;\n repoBranch?: string;\n variables?: { key: string; value: string }[];\n };\n oauthTokens?: Record<string, { accessToken: string; refreshToken?: string | null }>;\n }): Promise<void> {\n const { taskId, goal, options, messages, environment, oauthTokens } = message;\n\n const taskLog = this.log.child({ taskId });\n taskLog.info(\"Received task\", { goal });\n\n const runtime: TaskRuntimeState = {\n taskId,\n goal,\n options,\n sequence: 0,\n controller: new AbortController(),\n running: false,\n stopped: false,\n messageHistory:\n messages && messages.length > 0\n ? [...messages]\n : [{ role: \"user\", content: goal }],\n queuedFollowups: [],\n collectBuffer: [],\n environment,\n oauthTokens,\n };\n this.runningTasks.set(taskId, runtime);\n\n this.send({\n type: \"task:started\",\n taskId,\n spaceId: taskId,\n });\n\n try {\n let result = await this.executeTask(runtime);\n\n while (!runtime.stopped) {\n const nextMessage = this.dequeueNextMessage(runtime);\n if (!nextMessage) {\n break;\n }\n\n runtime.messageHistory.push({ role: \"user\", content: nextMessage });\n this.emitTaskProgress(runtime, {\n kind: \"status\",\n phase: \"followup\",\n message: \"Processing follow-up intervention message\",\n });\n try {\n result = await this.executeTask(runtime);\n } catch (error: any) {\n if (error?.name === \"AbortError\" && !runtime.stopped) {\n this.emitTaskProgress(runtime, {\n kind: \"status\",\n phase: \"interrupted\",\n message: \"Run interrupted; applying latest intervention message\",\n });\n continue;\n }\n throw error;\n }\n }\n\n if (!runtime.stopped) {\n const summary = result.agent.getSummary();\n this.send({\n type: \"task:completed\",\n taskId,\n result: {\n spaceId: taskId,\n text: result.finalText,\n summary,\n },\n });\n // Append to daily memory log\n await appendDailyMemory(this.config.viberId, {\n taskId,\n goal,\n outcome: \"completed\",\n details: typeof summary === \"string\" ? summary : JSON.stringify(summary),\n });\n\n // Consolidate into long-term memory (async, best-effort)\n try {\n await consolidateMemory(\n this.config.viberId,\n runtime.messageHistory,\n result.agent.config\n );\n } catch (err) {\n this.log.warn(\"Memory consolidation failed\", { error: String(err) });\n }\n }\n } catch (error: any) {\n if (error?.name === \"AbortError\") {\n taskLog.info(\"Task stopped\");\n await appendDailyMemory(this.config.viberId, {\n taskId, goal, outcome: \"stopped\",\n });\n } else {\n const model = (runtime as any)._resolvedModel || options?.model || \"default\";\n taskLog.error(\"Task execution error\", { error: error.message, model });\n this.send({\n type: \"task:error\",\n taskId,\n error: error.message,\n model,\n });\n await appendDailyMemory(this.config.viberId, {\n taskId, goal, outcome: \"error\", details: `[model: ${model}] ${error.message}`,\n });\n }\n } finally {\n this.runningTasks.delete(taskId);\n this.totalTasksExecuted++;\n }\n }\n\n private async executeTask(\n runtime: TaskRuntimeState\n ): Promise<{ finalText: string; agent: Awaited<ReturnType<typeof runTask>>[\"agent\"] }> {\n runtime.controller = new AbortController();\n runtime.running = true;\n\n // Create progress callback for tools to emit intermediate updates\n const onProgress = (event: {\n kind: string;\n phase?: string;\n message?: string;\n data?: any;\n }) => {\n this.emitTaskProgress(runtime, event);\n };\n\n const { streamResult, agent } = await runTask(\n runtime.goal,\n {\n taskId: runtime.taskId,\n model: runtime.options?.model,\n singleAgentId: runtime.options?.singleAgentId || \"default\",\n signal: runtime.controller.signal,\n environment: runtime.environment,\n settingsOverride: runtime.options?.settings,\n oauthTokens: runtime.oauthTokens,\n onProgress,\n },\n runtime.messageHistory\n );\n\n // Store the resolved model on the runtime so error handlers can reference it\n (runtime as any)._resolvedModel = `${agent.provider}/${agent.model}`;\n\n // Pipe the AI SDK UIMessageStream SSE bytes through to the hub,\n // so the frontend can consume them with @ai-sdk/svelte Chat class.\n const response = streamResult.toUIMessageStreamResponse();\n const body = response.body;\n\n // Capture any stream-level error from the AI SDK (e.g. APICallError).\n // The SDK embeds these as `{\"type\":\"error\",\"errorText\":\"...\"}` SSE chunks\n // before closing the stream, which means `streamResult.text` rejects with\n // a generic \"No output generated\" error and the real message is lost.\n let streamErrorText: string | undefined;\n\n if (body) {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n const chunk = decoder.decode(value, { stream: true });\n if (chunk) {\n // Detect error chunks from the AI SDK UI message stream\n // Format: data: {\"type\":\"error\",\"errorText\":\"...\"}\n if (!streamErrorText) {\n const errorMatch = chunk.match(/\"type\"\\s*:\\s*\"error\"\\s*,\\s*\"errorText\"\\s*:\\s*\"([^\"]*)\"/);\n if (errorMatch) {\n streamErrorText = errorMatch[1];\n }\n }\n this.send({\n type: \"task:stream-chunk\",\n taskId: runtime.taskId,\n chunk,\n });\n }\n }\n } catch (err: any) {\n if (err?.name !== \"AbortError\") {\n this.log.error(\"Stream read error\", { taskId: runtime.taskId, error: String(err) });\n throw err;\n }\n }\n }\n\n // Await the final text for persistence in message history.\n // If the stream contained an error, `streamResult.text` will reject with\n // a generic NoOutputGeneratedError. In that case, re-throw with the\n // actual error captured from the stream so callers see the real reason.\n let finalText: string;\n try {\n finalText = await streamResult.text;\n } catch (textError: any) {\n if (streamErrorText) {\n const enriched = new Error(streamErrorText);\n enriched.name = textError?.name || \"StreamError\";\n throw enriched;\n }\n throw textError;\n }\n\n runtime.running = false;\n runtime.messageHistory.push({ role: \"assistant\", content: finalText });\n return { finalText, agent };\n }\n\n private async handleTaskStop(taskId: string): Promise<void> {\n const runtime = this.runningTasks.get(taskId);\n if (runtime) {\n runtime.stopped = true;\n runtime.controller.abort();\n this.runningTasks.delete(taskId);\n this.log.info(\"Task stopped\", { taskId });\n }\n }\n\n private async handleTaskMessage(\n taskId: string,\n message: string,\n injectionMode: \"steer\" | \"followup\" | \"collect\" = \"followup\"\n ): Promise<void> {\n const runtime = this.runningTasks.get(taskId);\n if (!runtime || runtime.stopped) {\n return;\n }\n\n if (injectionMode === \"collect\") {\n runtime.collectBuffer.push(message);\n return;\n }\n\n if (injectionMode === \"steer\") {\n runtime.queuedFollowups.unshift(message);\n if (runtime.running) {\n runtime.controller.abort();\n }\n return;\n }\n\n runtime.queuedFollowups.push(message);\n }\n\n private dequeueNextMessage(runtime: TaskRuntimeState): string | null {\n const followup = runtime.queuedFollowups.shift();\n if (followup) {\n return followup;\n }\n\n if (runtime.collectBuffer.length > 0) {\n const merged = runtime.collectBuffer.join(\"\\n\");\n runtime.collectBuffer = [];\n return merged;\n }\n\n return null;\n }\n\n private emitTaskProgress(\n runtime: TaskRuntimeState,\n event: Record<string, unknown>\n ): void {\n const createdAt = new Date().toISOString();\n runtime.sequence += 1;\n const envelope: TaskProgressEnvelope = {\n eventId: `${runtime.taskId}-${runtime.sequence}`,\n sequence: runtime.sequence,\n taskId: runtime.taskId,\n conversationId: runtime.taskId,\n createdAt,\n model: runtime.options?.model,\n event: {\n ...event,\n at: createdAt,\n },\n };\n\n this.send({\n type: \"task:progress\",\n taskId: runtime.taskId,\n event: envelope,\n });\n }\n\n // ==================== Status Reporting ====================\n\n private async handleStatusRequest(): Promise<void> {\n const status = await this.getNodeObservabilityStatus();\n const report = await this.getSkillHealthReport();\n if (report && status.viber) {\n status.viber.skillHealth = report;\n }\n this.send({ type: \"status:report\", status });\n }\n\n private async getSkillHealthResult(skillId: string): Promise<SkillHealthResult | null> {\n try {\n const { checkSkillHealth } = await import(\"../skills/health\");\n return await checkSkillHealth({ id: skillId, name: skillId });\n } catch (error) {\n this.log.warn(\"Failed to run skill health check\", {\n skillId,\n error: String(error),\n });\n return null;\n }\n }\n\n private getProvisionInstallCommand(skillId: string, checkId: string): string | null {\n if (checkId === \"tmux\") {\n if (process.platform === \"darwin\") return \"brew install tmux\";\n if (process.platform === \"linux\") {\n return \"sudo apt-get update && sudo apt-get install -y tmux\";\n }\n return null;\n }\n\n if (skillId === \"cursor-agent\" && checkId === \"cursor-cli\") {\n return \"curl https://cursor.com/install -fsS | bash\";\n }\n if (skillId === \"codex-cli\" && checkId === \"codex-cli\") {\n return \"pnpm add -g @openai/codex\";\n }\n if (skillId === \"gemini-cli\" && checkId === \"gemini-cli\") {\n return \"npm install -g @google/gemini-cli\";\n }\n if (skillId === \"github\" && checkId === \"gh-cli\") {\n if (process.platform === \"darwin\") return \"brew install gh\";\n if (process.platform === \"linux\") {\n return \"sudo apt-get update && sudo apt-get install -y gh\";\n }\n return null;\n }\n if (skillId === \"railway\" && checkId === \"railway-cli\") {\n return \"npm install -g @railway/cli\";\n }\n return null;\n }\n\n private getProvisionAuthCommand(skillId: string, checkId: string): string | undefined {\n if (skillId === \"cursor-agent\" && checkId === \"cursor-auth\") {\n return \"agent login || cursor-agent login\";\n }\n if (skillId === \"codex-cli\" && checkId === \"codex-auth\") {\n return \"codex login\";\n }\n if (skillId === \"gemini-cli\" && checkId === \"gemini-auth\") {\n return \"gemini\";\n }\n if (skillId === \"github\" && checkId === \"gh-auth\") {\n return \"gh auth login -h github.com\";\n }\n if (skillId === \"railway\" && checkId === \"railway-auth\") {\n return \"railway login\";\n }\n if (skillId === \"gmail\" && checkId === \"google-oauth\") {\n return \"openviber auth google || viber auth google\";\n }\n return undefined;\n }\n\n private runProvisionCommand(\n command: string,\n timeoutMs: number = 10 * 60 * 1000,\n ): { ok: boolean; output: string } {\n const result = spawnSync(command, {\n shell: true,\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: timeoutMs,\n });\n const stdout = result.stdout ? String(result.stdout) : \"\";\n const stderr = result.stderr ? String(result.stderr) : \"\";\n const output = [stdout, stderr].filter(Boolean).join(\"\\n\").trim();\n\n if (result.error) {\n return {\n ok: false,\n output:\n output ||\n result.error.message ||\n \"Command failed to start.\",\n };\n }\n return {\n ok: (result.status ?? 1) === 0,\n output,\n };\n }\n\n private async handleSkillProvision(message: {\n requestId: string;\n skillId: string;\n install?: boolean;\n authAction?: \"none\" | \"copy\" | \"start\";\n }): Promise<void> {\n const skillId = String(message.skillId || \"\").trim();\n if (!skillId) {\n this.send({\n type: \"skill:provision-result\",\n requestId: message.requestId,\n skillId: \"\",\n ok: false,\n ready: false,\n error: \"Missing skillId\",\n });\n return;\n }\n\n const before = await this.getSkillHealthResult(skillId);\n if (!before) {\n this.send({\n type: \"skill:provision-result\",\n requestId: message.requestId,\n skillId,\n ok: false,\n ready: false,\n error: `Failed to read health status for ${skillId}`,\n });\n return;\n }\n\n const installLog: Array<{\n checkId: string;\n command: string;\n ok: boolean;\n output?: string;\n }> = [];\n\n if (before.available) {\n this.send({\n type: \"skill:provision-result\",\n requestId: message.requestId,\n skillId,\n ok: true,\n ready: true,\n before,\n after: before,\n auth: {\n required: false,\n ready: true,\n },\n installLog,\n });\n return;\n }\n\n if (message.install) {\n const binaryChecks = before.checks.filter(\n (check) =>\n (check.required ?? true) &&\n !check.ok &&\n check.actionType === \"binary\",\n );\n\n for (const check of binaryChecks) {\n const command = this.getProvisionInstallCommand(skillId, check.id);\n if (!command) continue;\n const installResult = this.runProvisionCommand(command);\n installLog.push({\n checkId: check.id,\n command,\n ok: installResult.ok,\n output: installResult.output.slice(0, 1200),\n });\n }\n }\n\n let after = await this.getSkillHealthResult(skillId);\n if (!after) {\n after = before;\n }\n\n const authCheck = after.checks.find(\n (check) =>\n (check.required ?? true) &&\n !check.ok &&\n (check.actionType === \"auth_cli\" || check.actionType === \"oauth\"),\n );\n\n let auth: {\n required: boolean;\n ready: boolean;\n command?: string;\n message?: string;\n } = {\n required: false,\n ready: true,\n };\n\n if (authCheck) {\n const authCommand = this.getProvisionAuthCommand(skillId, authCheck.id);\n auth = {\n required: true,\n ready: false,\n command:\n message.authAction === \"copy\" || message.authAction === \"start\"\n ? authCommand\n : undefined,\n message: authCheck.hint || authCheck.message || \"Authentication is required.\",\n };\n\n // \"start\" currently performs a non-interactive kickoff attempt.\n // Many CLI auth flows still need user interaction in terminal/browser.\n if (message.authAction === \"start\" && authCommand) {\n const kickoff = this.runProvisionCommand(authCommand, 20_000);\n installLog.push({\n checkId: authCheck.id,\n command: authCommand,\n ok: kickoff.ok,\n output: kickoff.output.slice(0, 1200),\n });\n const refreshed = await this.getSkillHealthResult(skillId);\n if (refreshed) {\n after = refreshed;\n if (refreshed.available) {\n auth = {\n required: true,\n ready: true,\n };\n }\n }\n }\n }\n\n this.send({\n type: \"skill:provision-result\",\n requestId: message.requestId,\n skillId,\n ok: true,\n ready: after.available,\n before,\n after,\n auth,\n installLog,\n });\n }\n\n /**\n * Build extended skill info array with availability from the cached health report.\n * Uses the cached report (refreshes if stale) to annotate each loaded skill.\n */\n private async buildSkillsWithHealth(): Promise<ViberSkillInfo[]> {\n try {\n const { defaultRegistry } = await import(\"../skills/registry\");\n const all = defaultRegistry.getAllSkills();\n const report = await this.getSkillHealthReport();\n const healthMap = report\n ? new Map(report.skills.map((r) => [r.id, r]))\n : new Map();\n\n return all.map((s) => {\n const health = healthMap.get(s.id);\n return {\n id: s.id,\n name: s.metadata.name || s.id,\n description: s.metadata.description || \"\",\n available: health?.available ?? false,\n status: (health?.status ?? \"UNKNOWN\") as ViberSkillInfo[\"status\"],\n healthSummary: health?.summary,\n checks: health?.checks?.map((c: import(\"../skills/health\").SkillHealthCheck) => ({\n id: c.id,\n label: c.label,\n ok: c.ok,\n required: c.required,\n message: c.message,\n hint: c.hint,\n actionType: c.actionType,\n })),\n };\n });\n } catch (err) {\n this.log.warn(\"Could not build skills with health info\", { error: String(err) });\n return [];\n }\n }\n\n private async getSkillHealthReport(): Promise<SkillHealthReport | undefined> {\n const now = Date.now();\n const maxAgeMs = 60_000;\n if (\n this.skillHealthCache &&\n this.skillHealthCachedAt &&\n now - this.skillHealthCachedAt < maxAgeMs\n ) {\n return this.skillHealthCache;\n }\n\n const refresh = this.refreshSkillHealth();\n const timeout = new Promise<undefined>((resolve) => {\n setTimeout(() => resolve(undefined), 4000);\n });\n\n try {\n const result = await Promise.race([refresh, timeout]);\n if (result) {\n return result;\n }\n } catch (err: any) {\n this.log.warn(\"Failed to collect skill health report\", {\n error: String(err?.message || err),\n });\n }\n\n return this.skillHealthCache;\n }\n\n private async refreshSkillHealth(): Promise<SkillHealthReport> {\n if (this.skillHealthInFlight) {\n return this.skillHealthInFlight;\n }\n\n this.skillHealthInFlight = (async () => {\n const { getSkillHealthReport } = await import(\"../skills/health\");\n const report = await getSkillHealthReport();\n this.skillHealthCache = report;\n this.skillHealthCachedAt = Date.now();\n return report;\n })();\n\n try {\n return await this.skillHealthInFlight;\n } finally {\n this.skillHealthInFlight = undefined;\n }\n }\n\n\n\n // ==================== Job Reporting ====================\n\n /**\n * Report the daemon's loaded job list to the hub so the web can observe all jobs.\n * Called after the scheduler loads/reloads jobs.\n */\n reportJobs(jobs: Array<{ name: string; schedule: string; prompt: string; description?: string; model?: string; viberId?: string }>): void {\n this.send({ type: \"jobs:list\", jobs });\n }\n\n // ==================== Config Sync ====================\n\n /**\n * Compute a hash of the current config for version tracking.\n */\n private computeConfigVersion(config: Record<string, unknown>): string {\n const json = JSON.stringify(config, Object.keys(config).sort());\n return createHash(\"sha256\").update(json).digest(\"hex\").slice(0, 16);\n }\n\n /**\n * Collect current config state (version, last pull, validations).\n * This will be populated when config is pulled and validated.\n */\n private getConfigState(): ConfigState | undefined {\n return this.configState;\n }\n\n /**\n * Get web API base URL from gateway URL or environment variable.\n */\n private getWebApiUrl(): string | null {\n // Try environment variable first\n if (process.env.OPENVIBER_WEB_API_URL) {\n return process.env.OPENVIBER_WEB_API_URL;\n }\n\n // Derive from gateway URL if available\n if (this.config.serverUrl) {\n try {\n const gatewayUrl = new URL(this.config.serverUrl);\n // Replace ws:// with http:// or wss:// with https://\n const protocol = gatewayUrl.protocol === \"wss:\" ? \"https:\" : \"http:\";\n // Default web port is 6006 (gateway is 6009)\n const port = gatewayUrl.port === \"6009\" ? \"6006\" : gatewayUrl.port;\n return `${protocol}//${gatewayUrl.hostname}${port ? `:${port}` : \"\"}`;\n } catch {\n // Invalid URL, return null\n }\n }\n\n return null;\n }\n\n /**\n * Handle config:push message from gateway.\n * Pulls latest config, validates it, and sends config:ack.\n */\n private async handleConfigPush(): Promise<void> {\n this.log.info(\"Received config:push, pulling latest config\");\n try {\n const now = new Date().toISOString();\n const validations: ConfigValidation[] = [];\n\n // Pull config from web API\n const webApiUrl = this.getWebApiUrl();\n if (!webApiUrl || !this.config.token) {\n this.log.warn(\"Cannot pull config: web API URL or auth token not available\");\n // Fall back to validating environment variables\n const envLlmKeys: Record<string, { apiKey?: string; baseUrl?: string }> = {};\n if (process.env.ANTHROPIC_API_KEY) {\n envLlmKeys.anthropic = { apiKey: process.env.ANTHROPIC_API_KEY };\n }\n if (process.env.OPENAI_API_KEY) {\n envLlmKeys.openai = { apiKey: process.env.OPENAI_API_KEY };\n }\n if (process.env.OPENROUTER_API_KEY) {\n envLlmKeys.openrouter = { apiKey: process.env.OPENROUTER_API_KEY };\n }\n\n if (Object.keys(envLlmKeys).length > 0) {\n const llmResults = await validateAllLlmKeys(envLlmKeys);\n validations.push(\n ...llmResults.map((r: ConfigValidationResult) => ({\n ...r,\n checkedAt: now,\n })),\n );\n }\n\n const configVersion = this.configState?.configVersion || this.computeConfigVersion(envLlmKeys);\n this.configState = {\n configVersion,\n lastConfigPullAt: now,\n validations,\n };\n\n this.send({\n type: \"config:ack\",\n configVersion,\n validations,\n });\n return;\n }\n\n // Call web API to get config\n const configUrl = `${webApiUrl}/api/vibers/${encodeURIComponent(this.config.viberId)}/config`;\n const response = await fetch(configUrl, {\n headers: {\n Authorization: `Bearer ${this.config.token}`,\n \"Content-Type\": \"application/json\",\n },\n signal: AbortSignal.timeout(10000), // 10s timeout\n });\n\n if (!response.ok) {\n throw new Error(`Config API returned ${response.status}: ${response.statusText}`);\n }\n\n const configData = await response.json();\n const pulledConfig = configData.config || {};\n const aiProviders = configData.globalSettings?.aiProviders || {};\n const oauthConnections = configData.oauthConnections || [];\n\n // Validate LLM keys\n if (Object.keys(aiProviders).length > 0) {\n const llmResults = await validateAllLlmKeys(aiProviders);\n validations.push(\n ...llmResults.map((r: ConfigValidationResult) => ({\n ...r,\n checkedAt: now,\n })),\n );\n }\n\n // Validate OAuth tokens\n if (oauthConnections.length > 0) {\n const oauthResults = await validateAllOAuthTokens(oauthConnections);\n validations.push(\n ...oauthResults.map((r: ConfigValidationResult) => ({\n ...r,\n checkedAt: now,\n })),\n );\n }\n\n // Compute config version from pulled config\n const configVersion = this.computeConfigVersion({\n config: pulledConfig,\n aiProviders,\n oauthConnections: oauthConnections.map((c: any) => ({\n provider: c.provider,\n expiresAt: c.expiresAt,\n })),\n });\n\n this.configState = {\n configVersion,\n lastConfigPullAt: now,\n validations,\n };\n\n // Send acknowledgment\n this.send({\n type: \"config:ack\",\n configVersion,\n validations,\n });\n\n this.log.info(\"Config pulled and validated\", {\n configVersion,\n validationCount: validations.length,\n });\n } catch (error) {\n this.log.error(\"Failed to handle config push\", { error: String(error) });\n // Send ack with failed status\n const validations: ConfigValidation[] = [\n {\n category: \"llm_keys\",\n status: \"failed\",\n message: `Config pull failed: ${error instanceof Error ? error.message : String(error)}`,\n checkedAt: new Date().toISOString(),\n },\n ];\n this.send({\n type: \"config:ack\",\n configVersion: this.configState?.configVersion || \"unknown\",\n validations,\n });\n }\n }\n\n // ==================== Communication ====================\n\n private send(message: ControllerClientMessage): void {\n if (this.ws && this.isConnected) {\n this.ws.send(JSON.stringify(message));\n }\n }\n\n // ==================== Heartbeat ====================\n\n private startHeartbeat(): void {\n const interval = this.config.heartbeatInterval || 30000;\n this.heartbeatTimer = setInterval(async () => {\n const machineStatus = await collectMachineResourceStatus();\n const viberStatus = collectViberRunningStatus({\n viberId: this.config.viberId,\n viberName: this.config.viberName || this.config.viberId,\n version: getOpenViberVersion(),\n connected: this.isConnected,\n daemonStartTime: this.daemonStartTime,\n runningTasks: this.getRunningTaskInfos(),\n skills: this.loadedSkills,\n capabilities: this.loadedCapabilities,\n totalTasksExecuted: this.totalTasksExecuted,\n lastHeartbeatAt: this.lastHeartbeatAt,\n });\n\n // Build extended skill info from cached health report\n const skillsWithHealth = await this.buildSkillsWithHealth();\n\n const status: ViberStatus = {\n platform: process.platform,\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n runningTasks: this.runningTasks.size,\n machine: machineStatus,\n viberStatus,\n skills: skillsWithHealth.length > 0 ? skillsWithHealth : undefined,\n configState: this.getConfigState(),\n };\n\n this.lastHeartbeatAt = new Date().toISOString();\n this.send({ type: \"heartbeat\", status });\n }, interval);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n // ==================== Reconnection ====================\n\n private scheduleReconnect(): void {\n if (!this.shouldReconnect || !this.config.serverUrl) return;\n\n const interval = this.config.reconnectInterval || 5000;\n this.log.info(\"Reconnecting\", { intervalMs: interval });\n\n this.reconnectTimer = setTimeout(() => {\n this.connect();\n }, interval);\n }\n}\n","import { z } from \"zod\";\nimport { execSync, spawnSync } from \"child_process\";\nimport * as path from \"path\";\n\nconst DEFAULT_SESSION = \"cursor-agent\";\nconst DEFAULT_WAIT_SECONDS = 120;\nconst MIN_WAIT_SECONDS = 10;\nconst MAX_WAIT_SECONDS = 600;\nconst POLL_INTERVAL_MS = 3000;\nconst MAX_CAPTURE_LINES = 500;\nconst DEFAULT_TAIL_LINES = 100;\n\n/** Patterns that indicate the Cursor agent has finished. */\nconst COMPLETION_PATTERNS = [\n /\\$\\s*$/m, // Shell prompt returned\n /agent\\s+completed/i, // Explicit completion message\n /All done/i, // Common completion phrase\n /Task completed/i,\n /changes have been (?:made|applied|committed)/i,\n /No (?:changes|modifications) (?:needed|required|made)/i,\n];\n\n/** Patterns that indicate the agent is still working. */\nconst IN_PROGRESS_PATTERNS = [\n /Thinking\\.\\.\\./i,\n /Running\\.\\.\\./i,\n /Searching\\.\\.\\./i,\n /Reading\\.\\.\\./i,\n /Writing\\.\\.\\./i,\n /Editing\\.\\.\\./i,\n /Applying\\.\\.\\./i,\n];\n\nconst SAFE_RE = /[^a-zA-Z0-9_.:-]/g;\n\nfunction safeSession(name: string): string {\n return name.replace(SAFE_RE, \"-\");\n}\n\n/**\n * Capture pane output from a tmux session.\n */\nfunction captureTmuxPane(session: string, lines: number = MAX_CAPTURE_LINES): string {\n try {\n return execSync(`tmux capture-pane -t ${session} -p -S -${lines}`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n } catch {\n return \"\";\n }\n}\n\n/**\n * Check if the Cursor agent appears to have finished based on pane output.\n */\nfunction detectCompletion(output: string): { completed: boolean; evidence: string } {\n // Check for completion patterns\n const lastLines = output.split(\"\\n\").slice(-20).join(\"\\n\");\n for (const pattern of COMPLETION_PATTERNS) {\n if (pattern.test(lastLines)) {\n return { completed: true, evidence: `Matched pattern: ${pattern.source}` };\n }\n }\n\n // Check if still in-progress\n for (const pattern of IN_PROGRESS_PATTERNS) {\n if (pattern.test(lastLines)) {\n return { completed: false, evidence: `Still working: ${pattern.source}` };\n }\n }\n\n return { completed: false, evidence: \"No completion signal detected\" };\n}\n\n/**\n * Get the tail of output for chat-friendly display.\n */\nfunction getTailLines(raw: string, maxLines: number = DEFAULT_TAIL_LINES): string {\n const lines = raw\n .split(/\\r?\\n/)\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0);\n\n if (lines.length <= maxLines) {\n return lines.join(\"\\n\");\n }\n\n const tail = lines.slice(-maxLines);\n const hidden = lines.length - tail.length;\n return `...[${hidden} earlier lines omitted]...\\n${tail.join(\"\\n\")}`;\n}\n\n/**\n * Check if a directory is a git repository.\n */\nfunction isGitRepo(cwd: string): boolean {\n try {\n execSync(\"git rev-parse --git-dir\", {\n encoding: \"utf8\",\n stdio: \"pipe\",\n cwd,\n timeout: 5000,\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate a branch name from a task goal.\n */\nfunction generateBranchName(goal: string): string {\n // Extract key words and create a slug\n const words = goal\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 3 && ![\"the\", \"and\", \"for\", \"with\", \"from\", \"that\", \"this\"].includes(w))\n .slice(0, 4);\n \n const slug = words.join(\"-\").slice(0, 40);\n const timestamp = new Date().toISOString().slice(0, 10).replace(/-/g, \"\");\n return `cursor-agent/${timestamp}-${slug || \"task\"}`;\n}\n\n/**\n * Enhance a coding task prompt with git workflow instructions.\n * Automatically adds branch creation and PR creation steps if:\n * - The directory is a git repository\n * - The prompt doesn't already mention branch/PR creation\n * - The prompt appears to be a coding task (mentions files, functions, code changes)\n */\nfunction enhancePromptForCodingTask(goal: string, cwd: string): string {\n // Check if it's a git repo\n if (!isGitRepo(cwd)) {\n return goal;\n }\n\n // Check if prompt already includes branch/PR instructions\n const hasBranchInstruction = /\\b(create|make|new).*branch|branch.*named|checkout.*-b/i.test(goal);\n const hasPRInstruction = /\\b(create|make|open).*(?:pull request|pr|merge request)|pr.*create/i.test(goal);\n const hasCommitInstruction = /\\b(commit|push|git commit|git push)/i.test(goal);\n\n // If already has git workflow instructions, don't modify\n if (hasBranchInstruction && (hasPRInstruction || hasCommitInstruction)) {\n return goal;\n }\n\n // Check if it looks like a coding task (mentions files, functions, code changes)\n const isCodingTask = /\\b(file|function|class|method|code|implement|fix|add|refactor|update|modify|change|create|write|edit)/i.test(goal);\n \n if (!isCodingTask) {\n return goal;\n }\n\n // Generate branch name\n const branchName = generateBranchName(goal);\n\n // Build enhanced prompt\n const parts: string[] = [];\n \n // Add branch creation instruction if not present\n if (!hasBranchInstruction) {\n parts.push(`First, create a new git branch named \"${branchName}\" and switch to it.`);\n }\n\n // Add the original goal\n parts.push(goal);\n\n // Add commit/push/PR instructions if not present\n if (!hasCommitInstruction || !hasPRInstruction) {\n parts.push(`\\n\\nWhen you have completed the task:`);\n if (!hasCommitInstruction) {\n parts.push(`- Commit all changes with a descriptive commit message`);\n parts.push(`- Push the branch to the remote repository`);\n }\n if (!hasPRInstruction) {\n parts.push(`- Create a pull request with a clear title and description of the changes`);\n }\n }\n\n return parts.join(\" \");\n}\n\n\n/**\n * Run Cursor CLI (agent) inside tmux so it gets a PTY.\n *\n * Improvements over v1:\n * - Polls for completion instead of fixed sleep\n * - Configurable session names for parallel runs\n * - Better output capture and parsing\n * - Handles workspace trust prompt automatically\n * - Emits intermediate progress updates via callback\n */\nfunction runInTmux(\n goal: string,\n cwd: string,\n waitSeconds: number,\n sessionName: string,\n onProgress?: (event: { kind: string; phase?: string; message?: string; data?: any }) => void,\n): { output: string; completed: boolean; elapsed: number } {\n const session = safeSession(sessionName);\n\n // Ensure tmux session exists (create or reuse)\n execSync(\n `tmux has-session -t ${session} 2>/dev/null || tmux new-session -d -s ${session}`,\n { encoding: \"utf8\", stdio: \"pipe\" },\n );\n\n // cd to cwd\n const cdCmd = cwd.includes(\" \")\n ? `cd \"${cwd.replace(/\"/g, '\\\\\"')}\"`\n : `cd ${cwd}`;\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", session, cdCmd, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n // Small delay for cd to complete\n execSync(\"sleep 1\", { encoding: \"utf8\", stdio: \"pipe\" });\n\n // Send agent -p 'goal' (JSON.stringify handles escaping)\n const sendArg = `agent -p ${JSON.stringify(goal)}`;\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", session, sendArg, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n // Handle workspace trust prompt: wait a few seconds, then send \"a\" to accept\n // (harmless if not prompted — just sends a character that gets ignored)\n execSync(\"sleep 3\", { encoding: \"utf8\", stdio: \"pipe\" });\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", session, \"a\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n // Poll for completion instead of fixed sleep\n const startTime = Date.now();\n const maxWaitMs = Math.max(MIN_WAIT_SECONDS, waitSeconds) * 1000;\n let lastOutput = \"\";\n let stableCount = 0;\n let completed = false;\n\n // Initial wait before first poll (let the agent start)\n execSync(\"sleep 5\", { encoding: \"utf8\", stdio: \"pipe\" });\n \n // Emit initial progress\n if (onProgress) {\n onProgress({\n kind: \"status\",\n phase: \"starting\",\n message: \"Starting Cursor agent...\",\n data: { goal, cwd, sessionName },\n });\n }\n\n while (Date.now() - startTime < maxWaitMs) {\n const output = captureTmuxPane(session);\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n\n // Emit intermediate progress with latest output\n if (onProgress && output !== lastOutput) {\n const tail = getTailLines(output, 20);\n const detection = detectCompletion(output);\n onProgress({\n kind: \"progress\",\n phase: detection.completed ? \"completing\" : \"working\",\n message: detection.completed \n ? \"Agent appears to be completing...\" \n : `Agent is working... (${elapsed}s elapsed)`,\n data: {\n elapsed,\n outputTail: tail,\n evidence: detection.evidence,\n },\n });\n }\n\n // Check for completion patterns\n const detection = detectCompletion(output);\n if (detection.completed) {\n completed = true;\n if (onProgress) {\n onProgress({\n kind: \"status\",\n phase: \"completed\",\n message: \"Cursor agent completed successfully\",\n data: { elapsed, evidence: detection.evidence },\n });\n }\n break;\n }\n\n // Check if output has stabilized (no new output for several polls)\n if (output === lastOutput) {\n stableCount++;\n // If output hasn't changed for ~15 seconds, likely done\n if (stableCount >= 5) {\n completed = true;\n if (onProgress) {\n onProgress({\n kind: \"status\",\n phase: \"completed\",\n message: \"Cursor agent appears to have finished (output stabilized)\",\n data: { elapsed },\n });\n }\n break;\n }\n } else {\n stableCount = 0;\n lastOutput = output;\n }\n\n // Sleep before next poll\n execSync(`sleep ${Math.floor(POLL_INTERVAL_MS / 1000)}`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n }\n\n const elapsed = Math.round((Date.now() - startTime) / 1000);\n const finalOutput = captureTmuxPane(session);\n\n return { output: finalOutput, completed, elapsed };\n}\n\nexport function getTools(): Record<string, import(\"../worker/tool\").CoreTool> {\n return {\n cursor_agent_run: {\n description:\n \"Run the Cursor CLI (agent) with the given prompt for AI-powered coding tasks. Call this whenever the user says 'use cursor-agent', 'cursor agent', 'run the Cursor CLI', or asks to delegate a coding task to Cursor. Provide a detailed, specific goal with context about the codebase. For coding tasks in git repositories, the tool automatically enhances the prompt to include branch creation and PR creation instructions. The Cursor agent can execute git commands directly. Runs in a persistent terminal session (requires terminal skill).\",\n inputSchema: z.object({\n goal: z\n .string()\n .min(5)\n .describe(\n \"Detailed task prompt for the Cursor agent. Include: (1) specific files/functions to modify, (2) acceptance criteria. For coding tasks in git repositories, the tool will automatically add instructions to create a branch, commit, push, and create a PR. You don't need to include these git workflow steps manually. Example: 'In src/utils/auth.ts, refactor the login function to use async/await instead of Promise chains. Ensure all existing tests pass.'\",\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Working directory for the agent — should be the project root. Defaults to current process cwd.\",\n ),\n waitSeconds: z\n .number()\n .int()\n .min(MIN_WAIT_SECONDS)\n .max(MAX_WAIT_SECONDS)\n .optional()\n .default(DEFAULT_WAIT_SECONDS)\n .describe(\n `Maximum seconds to wait for the agent to complete (default: ${DEFAULT_WAIT_SECONDS}). The tool polls for completion rather than waiting the full duration. Increase for complex multi-file tasks.`,\n ),\n sessionName: z\n .string()\n .optional()\n .default(DEFAULT_SESSION)\n .describe(\n \"Tmux session name (default: 'cursor-agent'). Use distinct names for parallel runs (e.g. 'cursor-1', 'cursor-2').\",\n ),\n }),\n execute: async (args: {\n goal: string;\n cwd?: string;\n waitSeconds?: number;\n sessionName?: string;\n }, context?: any) => {\n const cwd = args.cwd ? path.resolve(args.cwd) : process.cwd();\n const waitSeconds = args.waitSeconds ?? DEFAULT_WAIT_SECONDS;\n const sessionName = args.sessionName ?? DEFAULT_SESSION;\n const onProgress = context?.onProgress;\n\n // Enhance prompt with git workflow instructions for coding tasks\n const enhancedGoal = enhancePromptForCodingTask(args.goal, cwd);\n \n if (enhancedGoal !== args.goal && onProgress) {\n onProgress({\n kind: \"status\",\n phase: \"preparing\",\n message: \"Enhanced prompt with git workflow instructions\",\n data: { originalLength: args.goal.length, enhancedLength: enhancedGoal.length },\n });\n }\n\n try {\n const { output, completed, elapsed } = runInTmux(\n enhancedGoal,\n cwd,\n waitSeconds,\n sessionName,\n onProgress,\n );\n\n const outputTail = getTailLines(output);\n\n const status = completed ? \"completed\" : \"timed_out\";\n const summary = [\n `status=${status}`,\n `cwd=${cwd}`,\n `elapsed=${elapsed}s`,\n `session=${safeSession(sessionName)}`,\n ].join(\" | \");\n\n return {\n ok: completed,\n status,\n summary,\n outputTail,\n output: output.length > 12000\n ? output.slice(0, 6000) + `\\n...[truncated ${output.length - 12000} chars]...\\n` + output.slice(-6000)\n : output,\n cwd,\n elapsed,\n sessionName: safeSession(sessionName),\n ...(completed ? {} : {\n error: `Agent did not complete within ${waitSeconds}s (may still be running).`,\n hint: \"Check with terminal_list or increase waitSeconds.\",\n }),\n };\n } catch (err: any) {\n return {\n ok: false,\n status: \"error\",\n error: err?.message || String(err),\n cwd,\n sessionName: safeSession(sessionName),\n hint: \"Ensure the terminal backend is available (terminal_check) and Cursor CLI is in PATH (agent --version).\",\n };\n }\n },\n },\n };\n}\n","import { z } from \"zod\";\nimport { spawn } from \"child_process\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst MAX_CAPTURE_CHARS = 12000;\nconst MIN_WAIT_SECONDS = 10;\nconst DEFAULT_WAIT_SECONDS = 90;\nconst DEFAULT_TAIL_LINES = 80;\n\n/**\n * codex_run compatibility modes.\n * These keep the existing skill API stable while mapping to current Codex CLI flags.\n */\ntype ApprovalMode = \"full-auto\" | \"auto-edit\" | \"suggest\";\n\ntype CodexRunResult = {\n ok: boolean;\n cwd: string;\n approvalMode: ApprovalMode;\n model?: string;\n command?: string;\n exitCode?: number | null;\n timedOut?: boolean;\n output: string;\n stdoutTail: string;\n stderrTail: string;\n stderr?: string;\n error?: string;\n summary: string;\n};\n\n/**\n * Limit output size so tool results do not explode token usage.\n */\nfunction truncateOutput(raw: string): string {\n if (raw.length <= MAX_CAPTURE_CHARS) {\n return raw;\n }\n const head = raw.slice(0, Math.floor(MAX_CAPTURE_CHARS / 2));\n const tail = raw.slice(-Math.floor(MAX_CAPTURE_CHARS / 2));\n const hidden = raw.length - head.length - tail.length;\n return `${head}\\n...[truncated ${hidden} chars]...\\n${tail}`;\n}\n\n/**\n * Convert full output into a short line-based tail for web chat readability.\n */\nfunction getTailLines(raw: string, maxLines = DEFAULT_TAIL_LINES): string {\n const lines = raw\n .split(/\\r?\\n/)\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0);\n\n if (lines.length <= maxLines) {\n return lines.join(\"\\n\");\n }\n\n const tail = lines.slice(-maxLines);\n const hidden = lines.length - tail.length;\n return `...[${hidden} earlier lines omitted]...\\n${tail.join(\"\\n\")}`;\n}\n\n/**\n * Ensure the cwd exists and is a directory.\n */\nfunction resolveWorkingDirectory(rawCwd?: string): string {\n const cwd = rawCwd ? path.resolve(rawCwd) : process.cwd();\n if (!fs.existsSync(cwd)) {\n throw new Error(`cwd does not exist: ${cwd}`);\n }\n if (!fs.statSync(cwd).isDirectory()) {\n throw new Error(`cwd is not a directory: ${cwd}`);\n }\n return cwd;\n}\n\n/**\n * Ensure the codex binary is available before attempting to spawn.\n */\nfunction ensureCodexInstalled(): void {\n const pathEntries = (process.env.PATH || \"\").split(path.delimiter).filter(Boolean);\n for (const entry of pathEntries) {\n const unixCandidate = path.join(entry, \"codex\");\n if (fs.existsSync(unixCandidate)) {\n return;\n }\n\n const winCandidate = path.join(entry, \"codex.cmd\");\n if (fs.existsSync(winCandidate)) {\n return;\n }\n }\n\n throw new Error(\n \"Codex CLI not found in PATH. Install with `pnpm add -g @openai/codex` and run `codex login`.\",\n );\n}\n\n/**\n * Build `codex exec` arguments from skill parameters.\n */\nfunction buildCodexArgs(\n prompt: string,\n cwd: string,\n approvalMode: ApprovalMode,\n model?: string,\n): string[] {\n const args = [\"exec\"];\n\n switch (approvalMode) {\n case \"full-auto\":\n // Low-friction autonomous mode with writable workspace.\n args.push(\"--full-auto\");\n break;\n case \"auto-edit\":\n // Writable workspace without forcing full-auto behavior.\n args.push(\"-s\", \"workspace-write\");\n break;\n case \"suggest\":\n // Read-only execution for suggestion-only workflows.\n args.push(\"-s\", \"read-only\");\n break;\n }\n\n args.push(\"--skip-git-repo-check\", \"--cd\", cwd, \"--color\", \"never\");\n\n if (model) {\n args.push(\"--model\", model);\n }\n\n args.push(prompt);\n return args;\n}\n\n/**\n * Run Codex CLI non-interactively and capture stdout/stderr.\n */\nasync function runCodexExec(\n prompt: string,\n cwd: string,\n waitSeconds: number,\n approvalMode: ApprovalMode,\n model?: string,\n): Promise<{\n exitCode: number | null;\n stdout: string;\n stderr: string;\n timedOut: boolean;\n command: string;\n}> {\n const args = buildCodexArgs(prompt, cwd, approvalMode, model);\n const command = `codex ${args.map((a) => JSON.stringify(a)).join(\" \")}`;\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"codex\", args, {\n cwd,\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n const timeout = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) {\n child.kill(\"SIGKILL\");\n }\n }, 3_000);\n }, Math.max(MIN_WAIT_SECONDS, waitSeconds) * 1000);\n\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error) => {\n clearTimeout(timeout);\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n clearTimeout(timeout);\n resolve({\n exitCode: code,\n stdout,\n stderr,\n timedOut,\n command,\n });\n });\n });\n}\n\n/**\n * Build a chat-friendly tool result with both full output and compact tails.\n */\nfunction formatResult(\n args: {\n cwd: string;\n approvalMode: ApprovalMode;\n model?: string;\n command?: string;\n result?: Awaited<ReturnType<typeof runCodexExec>>;\n error?: string;\n },\n): CodexRunResult {\n const stdout = args.result?.stdout?.trim() || \"\";\n const stderr = args.result?.stderr?.trim() || \"\";\n const merged = truncateOutput([stdout, stderr].filter(Boolean).join(\"\\n\\n\"));\n\n const timedOut = args.result?.timedOut ?? false;\n const exitCode = args.result?.exitCode;\n\n const status =\n args.error\n ? \"failed\"\n : timedOut\n ? \"timed_out\"\n : exitCode === 0\n ? \"success\"\n : \"failed\";\n\n const summaryParts = [\n `status=${status}`,\n `cwd=${args.cwd}`,\n `approvalMode=${args.approvalMode}`,\n args.model ? `model=${args.model}` : \"model=default\",\n args.result ? `exitCode=${String(exitCode ?? \"unknown\")}` : \"exitCode=not-run\",\n ];\n\n return {\n ok: status === \"success\",\n cwd: args.cwd,\n approvalMode: args.approvalMode,\n model: args.model,\n command: args.command,\n exitCode,\n timedOut,\n output: merged,\n stdoutTail: getTailLines(stdout),\n stderrTail: getTailLines(stderr),\n stderr,\n error: args.error,\n summary: summaryParts.join(\" | \"),\n };\n}\n\nexport function getTools(): Record<string, import(\"../worker/tool\").CoreTool> {\n return {\n codex_run: {\n description:\n \"Run the OpenAI Codex CLI with a prompt for autonomous coding. Optimized for web chat: always returns a compact summary plus stdout/stderr tails for easy follow-up. Call when the user says 'use codex', 'run codex', or asks to delegate coding to Codex.\",\n inputSchema: z.object({\n prompt: z\n .string()\n .min(4)\n .describe(\n \"The coding task or prompt (e.g. 'Fix the failing test in utils.test.ts').\",\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Working directory where Codex will operate (defaults to process cwd). Must exist.\",\n ),\n waitSeconds: z\n .number()\n .int()\n .min(MIN_WAIT_SECONDS)\n .max(1800)\n .optional()\n .default(DEFAULT_WAIT_SECONDS)\n .describe(\n \"Maximum seconds to allow Codex execution before timeout (default: 90, min: 10).\",\n ),\n approvalMode: z\n .enum([\"full-auto\", \"auto-edit\", \"suggest\"])\n .optional()\n .default(\"full-auto\")\n .describe(\n \"Execution mode: full-auto (--full-auto), auto-edit (workspace-write), suggest (read-only).\",\n ),\n model: z\n .string()\n .optional()\n .describe(\n \"Optional Codex model override (e.g. 'gpt-5-codex'). Uses Codex CLI default if omitted.\",\n ),\n }),\n execute: async (args: {\n prompt: string;\n cwd?: string;\n waitSeconds?: number;\n approvalMode?: ApprovalMode;\n model?: string;\n }) => {\n const approvalMode = args.approvalMode ?? \"full-auto\";\n const waitSeconds = args.waitSeconds ?? DEFAULT_WAIT_SECONDS;\n\n try {\n ensureCodexInstalled();\n const cwd = resolveWorkingDirectory(args.cwd);\n const result = await runCodexExec(\n args.prompt,\n cwd,\n waitSeconds,\n approvalMode,\n args.model,\n );\n\n if (result.timedOut) {\n return formatResult({\n cwd,\n approvalMode,\n model: args.model,\n command: result.command,\n result,\n error: `codex execution timed out after ${Math.max(MIN_WAIT_SECONDS, waitSeconds)}s`,\n });\n }\n\n if (result.exitCode !== 0) {\n return formatResult({\n cwd,\n approvalMode,\n model: args.model,\n command: result.command,\n result,\n error: `codex exited with code ${result.exitCode ?? \"unknown\"}`,\n });\n }\n\n return formatResult({\n cwd,\n approvalMode,\n model: args.model,\n command: result.command,\n result,\n });\n } catch (err: any) {\n const cwd = args.cwd ? path.resolve(args.cwd) : process.cwd();\n return formatResult({\n cwd,\n approvalMode,\n model: args.model,\n error: err?.message || String(err),\n });\n }\n },\n },\n };\n}\n\nexport const __private = {\n buildCodexArgs,\n truncateOutput,\n getTailLines,\n resolveWorkingDirectory,\n};\n","import { z } from \"zod\";\nimport { spawn } from \"child_process\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nconst MAX_CAPTURE_CHARS = 12000;\nconst MIN_WAIT_SECONDS = 10;\nconst DEFAULT_WAIT_SECONDS = 120;\nconst DEFAULT_TAIL_LINES = 80;\n\n/**\n * gemini_run approval modes.\n */\ntype ApprovalMode = \"yolo\" | \"default\";\n\ntype GeminiRunResult = {\n ok: boolean;\n cwd: string;\n approvalMode: ApprovalMode;\n model?: string;\n command?: string;\n exitCode?: number | null;\n timedOut?: boolean;\n output: string;\n stdoutTail: string;\n stderrTail: string;\n stderr?: string;\n error?: string;\n summary: string;\n};\n\n/**\n * Limit output size so tool results do not explode token usage.\n */\nfunction truncateOutput(raw: string): string {\n if (raw.length <= MAX_CAPTURE_CHARS) {\n return raw;\n }\n const head = raw.slice(0, Math.floor(MAX_CAPTURE_CHARS / 2));\n const tail = raw.slice(-Math.floor(MAX_CAPTURE_CHARS / 2));\n const hidden = raw.length - head.length - tail.length;\n return `${head}\\n...[truncated ${hidden} chars]...\\n${tail}`;\n}\n\n/**\n * Convert full output into a short line-based tail for web chat readability.\n */\nfunction getTailLines(raw: string, maxLines = DEFAULT_TAIL_LINES): string {\n const lines = raw\n .split(/\\r?\\n/)\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0);\n\n if (lines.length <= maxLines) {\n return lines.join(\"\\n\");\n }\n\n const tail = lines.slice(-maxLines);\n const hidden = lines.length - tail.length;\n return `...[${hidden} earlier lines omitted]...\\n${tail.join(\"\\n\")}`;\n}\n\n/**\n * Ensure the cwd exists and is a directory.\n */\nfunction resolveWorkingDirectory(rawCwd?: string): string {\n const cwd = rawCwd ? path.resolve(rawCwd) : process.cwd();\n if (!fs.existsSync(cwd)) {\n throw new Error(`cwd does not exist: ${cwd}`);\n }\n if (!fs.statSync(cwd).isDirectory()) {\n throw new Error(`cwd is not a directory: ${cwd}`);\n }\n return cwd;\n}\n\n/**\n * Ensure the gemini binary is available before attempting to spawn.\n */\nfunction ensureGeminiInstalled(): void {\n const pathEntries = (process.env.PATH || \"\").split(path.delimiter).filter(Boolean);\n for (const entry of pathEntries) {\n const candidate = path.join(entry, \"gemini\");\n if (fs.existsSync(candidate)) {\n return;\n }\n const winCandidate = path.join(entry, \"gemini.cmd\");\n if (fs.existsSync(winCandidate)) {\n return;\n }\n }\n\n throw new Error(\n \"Gemini CLI not found in PATH. Install with `npm install -g @google/gemini-cli` and authenticate with `gemini` or set GEMINI_API_KEY.\",\n );\n}\n\n/**\n * Build `gemini` arguments from skill parameters.\n */\nfunction buildGeminiArgs(\n prompt: string,\n approvalMode: ApprovalMode,\n model?: string,\n outputFormat?: string,\n): string[] {\n const args: string[] = [];\n\n // Headless mode via --prompt\n args.push(\"--prompt\", prompt);\n\n // Approval mode\n if (approvalMode === \"yolo\") {\n args.push(\"--yolo\");\n }\n\n // Model override\n if (model) {\n args.push(\"--model\", model);\n }\n\n // Output format\n if (outputFormat && outputFormat !== \"text\") {\n args.push(\"--output-format\", outputFormat);\n }\n\n return args;\n}\n\n/**\n * Run Gemini CLI in headless mode and capture stdout/stderr.\n */\nasync function runGemini(\n prompt: string,\n cwd: string,\n waitSeconds: number,\n approvalMode: ApprovalMode,\n model?: string,\n outputFormat?: string,\n): Promise<{\n exitCode: number | null;\n stdout: string;\n stderr: string;\n timedOut: boolean;\n command: string;\n}> {\n const args = buildGeminiArgs(prompt, approvalMode, model, outputFormat);\n const command = `gemini ${args.map((a) => JSON.stringify(a)).join(\" \")}`;\n\n return new Promise((resolve, reject) => {\n const child = spawn(\"gemini\", args, {\n cwd,\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n const timeout = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) {\n child.kill(\"SIGKILL\");\n }\n }, 3_000);\n }, Math.max(MIN_WAIT_SECONDS, waitSeconds) * 1000);\n\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (error) => {\n clearTimeout(timeout);\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n clearTimeout(timeout);\n resolve({\n exitCode: code,\n stdout,\n stderr,\n timedOut,\n command,\n });\n });\n });\n}\n\n/**\n * Build a chat-friendly tool result with both full output and compact tails.\n */\nfunction formatResult(\n args: {\n cwd: string;\n approvalMode: ApprovalMode;\n model?: string;\n command?: string;\n result?: Awaited<ReturnType<typeof runGemini>>;\n error?: string;\n },\n): GeminiRunResult {\n const stdout = args.result?.stdout?.trim() || \"\";\n const stderr = args.result?.stderr?.trim() || \"\";\n const merged = truncateOutput([stdout, stderr].filter(Boolean).join(\"\\n\\n\"));\n\n const timedOut = args.result?.timedOut ?? false;\n const exitCode = args.result?.exitCode;\n\n const status =\n args.error\n ? \"failed\"\n : timedOut\n ? \"timed_out\"\n : exitCode === 0\n ? \"success\"\n : \"failed\";\n\n const summaryParts = [\n `status=${status}`,\n `cwd=${args.cwd}`,\n `approvalMode=${args.approvalMode}`,\n args.model ? `model=${args.model}` : \"model=default\",\n args.result ? `exitCode=${String(exitCode ?? \"unknown\")}` : \"exitCode=not-run\",\n ];\n\n return {\n ok: status === \"success\",\n cwd: args.cwd,\n approvalMode: args.approvalMode,\n model: args.model,\n command: args.command,\n exitCode,\n timedOut,\n output: merged,\n stdoutTail: getTailLines(stdout),\n stderrTail: getTailLines(stderr),\n stderr,\n error: args.error,\n summary: summaryParts.join(\" | \"),\n };\n}\n\nexport function getTools(): Record<string, import(\"../worker/tool\").CoreTool> {\n return {\n gemini_run: {\n description:\n \"Run the Google Gemini CLI with a prompt for autonomous coding or general tasks. Uses headless mode for automation. Always returns a compact summary plus stdout/stderr tails for easy follow-up. Call when the user says 'use gemini', 'run gemini cli', or asks to delegate a task to Gemini.\",\n inputSchema: z.object({\n prompt: z\n .string()\n .min(4)\n .describe(\n \"The task or prompt (e.g. 'Fix the failing test in utils.test.ts').\",\n ),\n cwd: z\n .string()\n .optional()\n .describe(\n \"Working directory where Gemini will operate (defaults to process cwd). Must exist.\",\n ),\n waitSeconds: z\n .number()\n .int()\n .min(MIN_WAIT_SECONDS)\n .max(1800)\n .optional()\n .default(DEFAULT_WAIT_SECONDS)\n .describe(\n \"Maximum seconds to allow Gemini execution before timeout (default: 120, min: 10).\",\n ),\n approvalMode: z\n .enum([\"yolo\", \"default\"])\n .optional()\n .default(\"yolo\")\n .describe(\n \"Execution mode: yolo (--yolo, auto-approve all actions), default (normal mode).\",\n ),\n model: z\n .string()\n .optional()\n .describe(\n \"Optional Gemini model override (e.g. 'gemini-2.5-pro', 'gemini-2.5-flash'). Uses Gemini CLI default if omitted.\",\n ),\n outputFormat: z\n .enum([\"text\", \"json\"])\n .optional()\n .default(\"text\")\n .describe(\n \"Output format: text (default human-readable) or json (structured).\",\n ),\n }),\n execute: async (args: {\n prompt: string;\n cwd?: string;\n waitSeconds?: number;\n approvalMode?: ApprovalMode;\n model?: string;\n outputFormat?: \"text\" | \"json\";\n }, context?: any) => {\n const approvalMode = args.approvalMode ?? \"yolo\";\n const waitSeconds = args.waitSeconds ?? DEFAULT_WAIT_SECONDS;\n\n try {\n // If web-stored Google OAuth tokens are available, sync them to\n // ~/.gemini/ so the CLI subprocess picks them up automatically.\n const googleTokens = context?.oauthTokens?.google;\n if (googleTokens?.accessToken) {\n const { syncGeminiCredentials } = await import(\"./gemini-auth\");\n syncGeminiCredentials({\n accessToken: googleTokens.accessToken,\n refreshToken: googleTokens.refreshToken,\n });\n }\n\n ensureGeminiInstalled();\n const cwd = resolveWorkingDirectory(args.cwd);\n const result = await runGemini(\n args.prompt,\n cwd,\n waitSeconds,\n approvalMode,\n args.model,\n args.outputFormat,\n );\n\n if (result.timedOut) {\n return formatResult({\n cwd,\n approvalMode,\n model: args.model,\n command: result.command,\n result,\n error: `gemini execution timed out after ${Math.max(MIN_WAIT_SECONDS, waitSeconds)}s`,\n });\n }\n\n if (result.exitCode !== 0) {\n return formatResult({\n cwd,\n approvalMode,\n model: args.model,\n command: result.command,\n result,\n error: `gemini exited with code ${result.exitCode ?? \"unknown\"}`,\n });\n }\n\n return formatResult({\n cwd,\n approvalMode,\n model: args.model,\n command: result.command,\n result,\n });\n } catch (err: any) {\n const cwd = args.cwd ? path.resolve(args.cwd) : process.cwd();\n return formatResult({\n cwd,\n approvalMode,\n model: args.model,\n error: err?.message || String(err),\n });\n }\n },\n },\n };\n}\n\nexport const __private = {\n buildGeminiArgs,\n truncateOutput,\n getTailLines,\n resolveWorkingDirectory,\n};\n","import { z } from \"zod\";\nimport { execSync } from \"child_process\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\n/**\n * Run a gh CLI command and return parsed JSON output.\n */\nfunction ghExec(args: string, cwd?: string): string {\n return execSync(`gh ${args}`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n cwd: cwd || process.cwd(),\n timeout: 30000,\n }).trim();\n}\n\n/**\n * Run a git command.\n */\nfunction gitExec(args: string, cwd: string): string {\n return execSync(`git ${args}`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n cwd,\n timeout: 30000,\n }).trim();\n}\n\n/**\n * Base directory for cloned repos — must match runtime environment prompt (~/openviber_spaces).\n */\nconst OPENVIBER_SPACES = \"openviber_spaces\";\n\n/**\n * Get the local path for a repo and ensure parent dir exists. Uses ~/openviber_spaces/owner/repo\n * so clones match the path the daemon runtime tells the agent to use.\n */\nfunction getCloneTargetDir(repo: string): string {\n const parts = repo.split(\"/\").filter(Boolean);\n const org = parts[0] ?? \"unknown\";\n const repoName = parts[1] ?? repo;\n const dir = path.join(os.homedir(), OPENVIBER_SPACES, org, repoName);\n execSync(`mkdir -p \"${path.join(os.homedir(), OPENVIBER_SPACES, org)}\"`, {\n encoding: \"utf8\",\n });\n return dir;\n}\n\nexport function getTools(): Record<string, import(\"../worker/tool\").CoreTool> {\n return {\n gh_list_issues: {\n description:\n \"List open issues for a GitHub repository. Call when the user asks to check issues, find bugs to fix, or as the first step in an automated issue-fixing workflow. Returns issue numbers, titles, labels, and URLs.\",\n inputSchema: z.object({\n repo: z\n .string()\n .describe(\n \"Repository in owner/name format (e.g. 'dustland/openviber')\",\n ),\n limit: z\n .number()\n .optional()\n .default(10)\n .describe(\"Maximum number of issues to return (default: 10)\"),\n labels: z\n .string()\n .optional()\n .describe(\n \"Filter by label (e.g. 'bug' or 'good first issue')\",\n ),\n }),\n execute: async (args: {\n repo: string;\n limit?: number;\n labels?: string;\n }) => {\n try {\n const limit = args.limit ?? 10;\n let cmd = `issue list --repo ${args.repo} --state open --limit ${limit} --json number,title,labels,url,body,createdAt`;\n if (args.labels) {\n cmd += ` --label \"${args.labels}\"`;\n }\n const raw = ghExec(cmd);\n const issues = JSON.parse(raw);\n return {\n ok: true,\n count: issues.length,\n issues: issues.map((i: any) => ({\n number: i.number,\n title: i.title,\n labels: i.labels?.map((l: any) => l.name) || [],\n url: i.url,\n body: i.body?.slice(0, 500) || \"\",\n createdAt: i.createdAt,\n })),\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err) };\n }\n },\n },\n\n gh_get_issue: {\n description:\n \"Get full details of a specific GitHub issue. Use after gh_list_issues to read the full issue body, comments, and labels before fixing it.\",\n inputSchema: z.object({\n repo: z\n .string()\n .describe(\"Repository in owner/name format\"),\n issueNumber: z.number().describe(\"Issue number\"),\n }),\n execute: async (args: { repo: string; issueNumber: number }) => {\n try {\n const raw = ghExec(\n `issue view ${args.issueNumber} --repo ${args.repo} --json number,title,body,labels,comments,url,state`,\n );\n const issue = JSON.parse(raw);\n return {\n ok: true,\n issue: {\n number: issue.number,\n title: issue.title,\n body: issue.body || \"\",\n labels: issue.labels?.map((l: any) => l.name) || [],\n state: issue.state,\n url: issue.url,\n comments: issue.comments?.map((c: any) => ({\n author: c.author?.login || \"unknown\",\n body: c.body?.slice(0, 300) || \"\",\n })) || [],\n },\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err) };\n }\n },\n },\n\n gh_clone_repo: {\n description:\n \"Clone a GitHub repository into ~/openviber_spaces/owner/repo (OpenViber working directory). Use to get a local copy of a repo before fixing issues. Path matches the environment project path the viber is given. Returns the local path.\",\n inputSchema: z.object({\n repo: z\n .string()\n .describe(\"Repository in owner/name format (e.g. 'dustland/openviber')\"),\n branch: z\n .string()\n .optional()\n .describe(\"Branch to clone (default: default branch)\"),\n }),\n execute: async (args: { repo: string; branch?: string }) => {\n try {\n const localPath = getCloneTargetDir(args.repo);\n\n // Check if already cloned\n try {\n gitExec(\"rev-parse --git-dir\", localPath);\n // Already cloned, just pull latest\n gitExec(\"pull --ff-only\", localPath);\n return {\n ok: true,\n path: localPath,\n message: `Repository already cloned. Pulled latest changes.`,\n alreadyCloned: true,\n };\n } catch {\n // Not cloned yet, clone it\n }\n\n let cloneCmd = `repo clone ${args.repo} \"${localPath}\"`;\n if (args.branch) {\n cloneCmd += ` -- --branch ${args.branch}`;\n }\n ghExec(cloneCmd);\n return {\n ok: true,\n path: localPath,\n message: `Cloned ${args.repo} to ${localPath}`,\n alreadyCloned: false,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err) };\n }\n },\n },\n\n gh_create_branch: {\n description:\n \"Create and checkout a new git branch in a local repository. Use after cloning to create a fix branch (e.g. 'fix/issue-123').\",\n inputSchema: z.object({\n cwd: z\n .string()\n .describe(\"Path to the local git repository\"),\n branchName: z\n .string()\n .describe(\"Name for the new branch (e.g. 'fix/issue-123')\"),\n baseBranch: z\n .string()\n .optional()\n .describe(\"Base branch to create from (default: current branch)\"),\n }),\n execute: async (args: {\n cwd: string;\n branchName: string;\n baseBranch?: string;\n }) => {\n try {\n const cwd = path.resolve(args.cwd);\n\n // Ensure we're on the base branch if specified\n if (args.baseBranch) {\n gitExec(`checkout ${args.baseBranch}`, cwd);\n gitExec(\"pull --ff-only\", cwd);\n }\n\n // Create and checkout new branch\n gitExec(`checkout -b ${args.branchName}`, cwd);\n\n return {\n ok: true,\n branch: args.branchName,\n cwd,\n message: `Created and switched to branch '${args.branchName}'`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err) };\n }\n },\n },\n\n gh_commit_and_push: {\n description:\n \"Stage all changes, commit with a message, and push to the remote. Use after Codex has made changes to commit and push the fix.\",\n inputSchema: z.object({\n cwd: z.string().describe(\"Path to the local git repository\"),\n message: z\n .string()\n .describe(\n \"Commit message (e.g. 'fix: resolve null pointer in user service (#123)')\",\n ),\n }),\n execute: async (args: { cwd: string; message: string }) => {\n try {\n const cwd = path.resolve(args.cwd);\n\n // Stage all changes\n gitExec(\"add -A\", cwd);\n\n // Check if there are changes to commit\n try {\n gitExec(\"diff --cached --quiet\", cwd);\n return {\n ok: false,\n error: \"No changes to commit\",\n };\n } catch {\n // diff --quiet exits with 1 when there are changes — this is expected\n }\n\n // Commit\n gitExec(`commit -m ${JSON.stringify(args.message)}`, cwd);\n\n // Push (set upstream on first push)\n const branch = gitExec(\"rev-parse --abbrev-ref HEAD\", cwd);\n try {\n gitExec(`push -u origin ${branch}`, cwd);\n } catch {\n // If push fails, try force push (for rebased branches)\n gitExec(`push -u origin ${branch} --force-with-lease`, cwd);\n }\n\n return {\n ok: true,\n branch,\n message: `Committed and pushed: ${args.message}`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err) };\n }\n },\n },\n\n gh_create_pr: {\n description:\n \"Create a pull request on GitHub from the current branch. Use after committing and pushing the fix. Can reference an issue number.\",\n inputSchema: z.object({\n cwd: z.string().describe(\"Path to the local git repository\"),\n title: z.string().describe(\"PR title\"),\n body: z\n .string()\n .optional()\n .describe(\n \"PR body/description (supports markdown). Include 'Fixes #123' to auto-close the issue.\",\n ),\n baseBranch: z\n .string()\n .optional()\n .describe(\"Target branch for the PR (default: repo default branch)\"),\n }),\n execute: async (args: {\n cwd: string;\n title: string;\n body?: string;\n baseBranch?: string;\n }) => {\n try {\n const cwd = path.resolve(args.cwd);\n let cmd = `pr create --title ${JSON.stringify(args.title)}`;\n if (args.body) {\n cmd += ` --body ${JSON.stringify(args.body)}`;\n }\n if (args.baseBranch) {\n cmd += ` --base ${args.baseBranch}`;\n }\n const raw = ghExec(cmd, cwd);\n\n // gh pr create returns the PR URL\n return {\n ok: true,\n url: raw,\n message: `Pull request created: ${raw}`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err) };\n }\n },\n },\n };\n}\n","/**\n * Terminal skill — persistent terminal session management.\n *\n * Provides tools to create, manage, and monitor terminal sessions.\n * Uses tmux under the hood for persistent PTY sessions that can be\n * attached to from the web UI or CLI.\n *\n * End users interact with \"terminal sessions\" — tmux is an implementation\n * detail they never need to know about.\n */\n\nimport { z } from \"zod\";\nimport { execSync, spawnSync } from \"child_process\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\nimport {\n checkSkillHealth,\n type SkillHealthCheck,\n type SkillHealthResult,\n} from \"../skills/health\";\n\nconst SAFE_RE = /[^a-zA-Z0-9_.:-]/g;\nconst SKILL_SETUP_IDS = [\n \"cursor-agent\",\n \"codex-cli\",\n \"gemini-cli\",\n \"github\",\n \"railway\",\n \"terminal\",\n] as const;\nconst DEFAULT_SETUP_SESSION = \"skill-setup\";\nconst DEFAULT_SETUP_WAIT_SECONDS = 120;\nconst MIN_SETUP_WAIT_SECONDS = 10;\nconst MAX_SETUP_WAIT_SECONDS = 900;\nconst SETUP_POLL_INTERVAL_SECONDS = 3;\n\ntype SkillSetupId = (typeof SKILL_SETUP_IDS)[number];\ntype SkillSetupMode = \"plan\" | \"apply\";\ntype InstallEnv = {\n hasBrew: boolean;\n hasApt: boolean;\n hasCurl: boolean;\n isRoot: boolean;\n};\n\ntype SkillSetupStep = {\n checkId: string;\n label: string;\n kind: \"install\" | \"auth\" | \"manual\";\n status: \"planned\" | \"completed\" | \"failed\" | \"pending\" | \"skipped\";\n command?: string;\n message?: string;\n outputTail?: string;\n};\n\n/**\n * Sanitize a target string to prevent shell injection.\n */\nfunction safeTarget(t: string): string {\n return t.replace(SAFE_RE, \"-\");\n}\n\nfunction hasCommand(command: string): boolean {\n const pathEntries = (process.env.PATH || \"\").split(path.delimiter).filter(Boolean);\n const candidates =\n process.platform === \"win32\"\n ? [command, `${command}.exe`, `${command}.cmd`, `${command}.bat`]\n : [command];\n\n for (const entry of pathEntries) {\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(entry, candidate))) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction detectInstallEnv(): InstallEnv {\n const isRoot = typeof process.getuid === \"function\" ? process.getuid() === 0 : false;\n return {\n hasBrew: hasCommand(\"brew\"),\n hasApt: hasCommand(\"apt-get\"),\n hasCurl: hasCommand(\"curl\"),\n isRoot,\n };\n}\n\nfunction selectInstallCommand(checkId: string, env: InstallEnv): string | null {\n switch (checkId) {\n case \"codex-cli\":\n return \"pnpm add -g @openai/codex\";\n case \"gemini-cli\":\n return \"pnpm add -g @google/gemini-cli\";\n case \"railway-cli\":\n return \"pnpm add -g @railway/cli\";\n case \"cursor-cli\":\n if (env.hasCurl) return \"curl https://cursor.com/install -fsS | bash\";\n if (env.hasBrew) return \"brew install --cask cursor-cli\";\n return null;\n case \"gh-cli\":\n if (env.hasBrew) return \"brew install gh\";\n if (env.hasApt && env.isRoot) return \"apt-get update && apt-get install -y gh\";\n return null;\n case \"tmux\":\n if (env.hasBrew) return \"brew install tmux\";\n if (env.hasApt && env.isRoot) return \"apt-get update && apt-get install -y tmux\";\n return null;\n default:\n return null;\n }\n}\n\nfunction resolveFirstAvailable(candidates: string[]): string | null {\n for (const candidate of candidates) {\n if (hasCommand(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction selectAuthCommand(\n checkId: string,\n resolveCommand: (candidates: string[]) => string | null = resolveFirstAvailable,\n): string | null {\n switch (checkId) {\n case \"cursor-auth\": {\n const cursor = resolveCommand([\"agent\", \"cursor-agent\"]);\n return cursor ? `${cursor} login` : null;\n }\n case \"codex-auth\": {\n const codex = resolveCommand([\"codex\"]);\n return codex ? `${codex} login` : null;\n }\n case \"gemini-auth\": {\n const gemini = resolveCommand([\"gemini\"]);\n return gemini;\n }\n case \"gh-auth\": {\n const gh = resolveCommand([\"gh\"]);\n return gh ? `${gh} auth login -h github.com` : null;\n }\n case \"railway-auth\": {\n const railway = resolveCommand([\"railway\"]);\n return railway ? `${railway} login` : null;\n }\n default:\n return null;\n }\n}\n\nfunction getMissingRequiredChecks(result: SkillHealthResult): SkillHealthCheck[] {\n return result.checks.filter((check) => (check.required ?? true) && !check.ok);\n}\n\nfunction trimOutput(raw: string, maxChars = 4000): string {\n if (!raw) return \"\";\n const text = raw.trim();\n if (text.length <= maxChars) {\n return text;\n }\n return `${text.slice(0, maxChars)}\\n...[truncated ${text.length - maxChars} chars]...`;\n}\n\nfunction runShellCommand(\n command: string,\n cwd: string,\n timeoutMs = 300_000,\n): { ok: boolean; stdout: string; stderr: string; error?: string } {\n try {\n const stdout = execSync(command, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n cwd,\n timeout: timeoutMs,\n });\n return { ok: true, stdout: trimOutput(stdout), stderr: \"\" };\n } catch (err: any) {\n return {\n ok: false,\n stdout: trimOutput(err?.stdout ? String(err.stdout) : \"\"),\n stderr: trimOutput(err?.stderr ? String(err.stderr) : \"\"),\n error: err?.message || String(err),\n };\n }\n}\n\nfunction startAuthFlowInTerminal(args: {\n sessionName: string;\n command: string;\n cwd: string;\n}): { sessionName: string; target: string } {\n const sessionName = safeTarget(args.sessionName);\n execSync(\n `tmux has-session -t '${sessionName}' 2>/dev/null || tmux new-session -d -s '${sessionName}'`,\n { encoding: \"utf8\", stdio: \"pipe\" },\n );\n\n const cdCmd = args.cwd.includes(\" \")\n ? `cd \"${args.cwd.replace(/\"/g, '\\\\\"')}\"`\n : `cd ${args.cwd}`;\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", sessionName, cdCmd, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", sessionName, args.command, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n return {\n sessionName,\n target: `${sessionName}:0.0`,\n };\n}\n\nasync function waitForCheckToPass(args: {\n skillId: SkillSetupId;\n checkId: string;\n waitSeconds: number;\n}): Promise<{ passed: boolean; latest: SkillHealthResult }> {\n const timeoutSeconds = Math.max(MIN_SETUP_WAIT_SECONDS, args.waitSeconds);\n const startedAt = Date.now();\n let latest = await checkSkillHealth({ id: args.skillId });\n\n while (Date.now() - startedAt < timeoutSeconds * 1000) {\n const check = latest.checks.find((item) => item.id === args.checkId);\n if (check?.ok) {\n return { passed: true, latest };\n }\n await sleep(SETUP_POLL_INTERVAL_SECONDS);\n latest = await checkSkillHealth({ id: args.skillId });\n }\n\n return { passed: false, latest };\n}\n\n/**\n * Sleep for a given number of seconds using a non-blocking timer.\n */\nfunction sleep(seconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, Math.max(1, seconds) * 1000));\n}\n\n/**\n * Check whether tmux is available on this system.\n */\nfunction isTmuxInstalled(): { installed: boolean; version?: string } {\n try {\n const out = execSync(\"tmux -V\", { encoding: \"utf8\", stdio: \"pipe\" });\n return { installed: true, version: out.trim() };\n } catch {\n return { installed: false };\n }\n}\n\n/**\n * Capture the current contents of a terminal pane via tmux.\n * Tries ANSI-aware capture first, falls back to plain capture.\n * Throws if all capture strategies fail (e.g. pane does not exist).\n */\nfunction capturePaneOutput(target: string, lines = 200): string {\n const cmds = [\n `tmux capture-pane -t '${target}' -pae -S -${lines}`,\n `tmux capture-pane -t '${target}' -pe -S -${lines}`,\n `tmux capture-pane -t '${target}' -p -S -${lines}`,\n ];\n let lastError: Error | undefined;\n for (const cmd of cmds) {\n try {\n return execSync(cmd, { encoding: \"utf8\", stdio: \"pipe\" });\n } catch (err: any) {\n lastError = err;\n }\n }\n throw lastError ?? new Error(`Failed to capture pane: ${target}`);\n}\n\n/**\n * Run a command inside a terminal session and capture pane output.\n * Creates the session if it does not exist.\n */\nasync function runInSession(\n sessionName: string,\n command: string,\n cwd: string,\n waitSeconds: number,\n): Promise<string> {\n const safeSession = safeTarget(sessionName);\n execSync(\n `tmux has-session -t '${safeSession}' 2>/dev/null || tmux new-session -d -s '${safeSession}'`,\n { encoding: \"utf8\", stdio: \"pipe\" },\n );\n\n const cdCmd = cwd.includes(\" \")\n ? `cd \"${cwd.replace(/\"/g, '\\\\\"')}\"`\n : `cd ${cwd}`;\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", safeSession, cdCmd, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", safeSession, command, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n\n await sleep(waitSeconds);\n\n return capturePaneOutput(safeSession);\n}\n\nexport function getTools(): Record<string, import(\"../worker/tool\").CoreTool> {\n return {\n // ==================== Health check ====================\n\n terminal_check: {\n description:\n \"Check if the terminal backend is available and return its version. Call before using any other terminal_* tool to ensure the system is ready.\",\n inputSchema: z.object({}),\n execute: async () => {\n const result = isTmuxInstalled();\n if (result.installed) {\n return { available: true, backend: \"tmux\", version: result.version };\n }\n return {\n available: false,\n hint: \"Terminal backend (tmux) not found. Install with: brew install tmux (macOS) or sudo apt install tmux (Ubuntu)\",\n };\n },\n },\n\n terminal_prepare_skill_prerequisites: {\n description:\n \"Prepare prerequisites for built-in CLI skills using terminal automation. Use mode='plan' to preview actions, then mode='apply' to install missing CLIs and run interactive auth flows in a terminal session.\",\n inputSchema: z.object({\n skillId: z\n .enum(SKILL_SETUP_IDS)\n .describe(\"Skill to prepare (cursor-agent, codex-cli, gemini-cli, github, railway, terminal).\"),\n mode: z\n .enum([\"plan\", \"apply\"])\n .optional()\n .default(\"plan\")\n .describe(\"plan: preview actions only; apply: execute install/auth actions.\"),\n runAuthFlow: z\n .boolean()\n .optional()\n .default(true)\n .describe(\"When true, start interactive auth commands in a terminal session.\"),\n sessionName: z\n .string()\n .optional()\n .default(DEFAULT_SETUP_SESSION)\n .describe(\"Terminal session name used for interactive auth flows.\"),\n waitSeconds: z\n .number()\n .int()\n .min(MIN_SETUP_WAIT_SECONDS)\n .max(MAX_SETUP_WAIT_SECONDS)\n .optional()\n .default(DEFAULT_SETUP_WAIT_SECONDS)\n .describe(\"How long to wait for interactive auth to complete before returning pending.\"),\n cwd: z\n .string()\n .optional()\n .describe(\"Working directory for install/auth commands (defaults to process cwd).\"),\n }),\n execute: async (args: {\n skillId: SkillSetupId;\n mode?: SkillSetupMode;\n runAuthFlow?: boolean;\n sessionName?: string;\n waitSeconds?: number;\n cwd?: string;\n }) => {\n const mode = args.mode ?? \"plan\";\n const waitSeconds = Math.min(\n MAX_SETUP_WAIT_SECONDS,\n Math.max(MIN_SETUP_WAIT_SECONDS, args.waitSeconds ?? DEFAULT_SETUP_WAIT_SECONDS),\n );\n const cwd = args.cwd ? path.resolve(args.cwd) : process.cwd();\n const runAuthFlow = args.runAuthFlow !== false;\n const installEnv = detectInstallEnv();\n\n const healthSkillId = args.skillId === \"terminal\" ? \"terminal\" : args.skillId;\n const before = await checkSkillHealth({ id: healthSkillId });\n const missing = getMissingRequiredChecks(before);\n if (missing.length === 0) {\n return {\n ok: true,\n skillId: args.skillId,\n mode,\n before,\n after: before,\n steps: [] as SkillSetupStep[],\n summary: \"All prerequisites are already satisfied.\",\n };\n }\n\n const steps: SkillSetupStep[] = [];\n let latest = before;\n let authSessionName: string | undefined;\n let authTarget: string | undefined;\n\n for (const check of missing) {\n const installCommand = selectInstallCommand(check.id, installEnv);\n if (installCommand) {\n if (mode === \"plan\") {\n steps.push({\n checkId: check.id,\n label: check.label,\n kind: \"install\",\n status: \"planned\",\n command: installCommand,\n message: \"This command will be executed in apply mode.\",\n });\n continue;\n }\n\n const result = runShellCommand(installCommand, cwd);\n const outputTail = trimOutput(\n [result.stdout, result.stderr].filter(Boolean).join(\"\\n\"),\n 1500,\n );\n steps.push({\n checkId: check.id,\n label: check.label,\n kind: \"install\",\n status: result.ok ? \"completed\" : \"failed\",\n command: installCommand,\n message: result.ok\n ? \"Install command completed.\"\n : result.error || \"Install command failed.\",\n outputTail: outputTail || undefined,\n });\n latest = await checkSkillHealth({ id: healthSkillId });\n continue;\n }\n\n const authCommand = runAuthFlow ? selectAuthCommand(check.id) : null;\n if (authCommand) {\n if (mode === \"plan\") {\n steps.push({\n checkId: check.id,\n label: check.label,\n kind: \"auth\",\n status: \"planned\",\n command: authCommand,\n message: \"Interactive auth will be launched in a terminal session in apply mode.\",\n });\n continue;\n }\n\n try {\n const authFlow = startAuthFlowInTerminal({\n sessionName: args.sessionName || DEFAULT_SETUP_SESSION,\n command: authCommand,\n cwd,\n });\n authSessionName = authFlow.sessionName;\n authTarget = authFlow.target;\n\n const waited = await waitForCheckToPass({\n skillId: args.skillId,\n checkId: check.id,\n waitSeconds,\n });\n latest = waited.latest;\n\n steps.push({\n checkId: check.id,\n label: check.label,\n kind: \"auth\",\n status: waited.passed ? \"completed\" : \"pending\",\n command: authCommand,\n message: waited.passed\n ? `Authentication completed via terminal session '${authFlow.sessionName}'.`\n : `Authentication still pending. Continue in terminal target '${authFlow.target}'.`,\n });\n } catch (err: any) {\n steps.push({\n checkId: check.id,\n label: check.label,\n kind: \"auth\",\n status: \"failed\",\n command: authCommand,\n message: err?.message || String(err),\n });\n }\n continue;\n }\n\n steps.push({\n checkId: check.id,\n label: check.label,\n kind: \"manual\",\n status: \"skipped\",\n message:\n check.hint ||\n check.message ||\n \"No automated action is available for this requirement.\",\n });\n }\n\n const after = mode === \"apply\" ? latest : before;\n const remaining = getMissingRequiredChecks(after);\n const pendingAuth = steps.some(\n (step) => step.kind === \"auth\" && step.status === \"pending\",\n );\n\n const summary =\n mode === \"plan\"\n ? `Planned ${steps.length} action(s) for ${args.skillId}.`\n : remaining.length === 0\n ? \"All required prerequisites are satisfied.\"\n : pendingAuth\n ? \"Setup is partially complete. User input is still required in terminal.\"\n : \"Setup finished with unresolved checks.\";\n\n return {\n ok: remaining.length === 0,\n skillId: args.skillId,\n mode,\n before,\n after,\n steps,\n remainingChecks: remaining.map((check) => ({\n id: check.id,\n label: check.label,\n hint: check.hint,\n message: check.message,\n })),\n requiresUserInput: pendingAuth,\n ...(authSessionName\n ? {\n authSession: authSessionName,\n authTarget,\n authHint:\n \"Use terminal_send_keys/terminal_read (or attach locally) to complete interactive login.\",\n }\n : {}),\n summary,\n };\n },\n },\n\n // ==================== Session management ====================\n\n terminal_new_session: {\n description:\n \"Create a new persistent terminal session. Use when the user asks to set up a coding session, workspace, or multi-terminal layout. Sessions persist even when disconnected.\",\n inputSchema: z.object({\n sessionName: z.string().describe(\"Session name (e.g. 'coding', 'dev')\"),\n firstWindowName: z\n .string()\n .optional()\n .describe(\"Name for the first window (e.g. 'editor', 'server')\"),\n startDirectory: z\n .string()\n .optional()\n .describe(\"Working directory for the first window\"),\n }),\n execute: async (args: {\n sessionName: string;\n firstWindowName?: string;\n startDirectory?: string;\n }) => {\n const target = safeTarget(args.sessionName);\n try {\n const cmd = [\"new-session\", \"-d\", \"-s\", target];\n if (args.firstWindowName) {\n cmd.push(\"-n\", safeTarget(args.firstWindowName));\n }\n if (args.startDirectory) {\n cmd.push(\"-c\", path.resolve(args.startDirectory));\n }\n spawnSync(\"tmux\", cmd, { encoding: \"utf8\", stdio: \"pipe\" });\n return {\n ok: true,\n sessionName: target,\n message: `Terminal session '${target}' created.`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), sessionName: target };\n }\n },\n },\n\n terminal_kill_session: {\n description:\n \"Destroy a terminal session and all its windows/panes. Use to clean up after a task completes or when the user asks to remove a session.\",\n inputSchema: z.object({\n sessionName: z\n .string()\n .describe(\"Session name to destroy (e.g. 'coding')\"),\n }),\n execute: async (args: { sessionName: string }) => {\n const session = safeTarget(args.sessionName);\n try {\n spawnSync(\"tmux\", [\"kill-session\", \"-t\", session], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return {\n ok: true,\n sessionName: session,\n message: `Session '${session}' destroyed.`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), sessionName: session };\n }\n },\n },\n\n terminal_rename_session: {\n description:\n \"Rename a terminal session. Use when the user wants to reorganize sessions or give a session a more meaningful name.\",\n inputSchema: z.object({\n oldName: z.string().describe(\"Current session name\"),\n newName: z.string().describe(\"New session name\"),\n }),\n execute: async (args: { oldName: string; newName: string }) => {\n const oldSession = safeTarget(args.oldName);\n const newSession = safeTarget(args.newName);\n try {\n spawnSync(\"tmux\", [\"rename-session\", \"-t\", oldSession, newSession], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return {\n ok: true,\n oldName: oldSession,\n newName: newSession,\n message: `Session renamed from '${oldSession}' to '${newSession}'.`,\n };\n } catch (err: any) {\n return {\n ok: false,\n error: err?.message || String(err),\n oldName: oldSession,\n newName: newSession,\n };\n }\n },\n },\n\n // ==================== Window management ====================\n\n terminal_new_window: {\n description:\n \"Create a new window (tab) in an existing terminal session. Use to add Cursor Agent, Claude Code, Codex CLI, or dev server terminals. Optionally run a command in the new window.\",\n inputSchema: z.object({\n target: z\n .string()\n .describe(\n \"Session name or session:window (e.g. 'coding' or 'coding:1').\",\n ),\n windowName: z\n .string()\n .optional()\n .describe(\"Name for the new window (e.g. 'server', 'tests')\"),\n command: z\n .string()\n .optional()\n .describe(\n \"Command to run in the new window (e.g. 'npm run dev'). If omitted, opens a shell.\",\n ),\n cwd: z.string().optional().describe(\"Working directory for the new window\"),\n }),\n execute: async (args: {\n target: string;\n windowName?: string;\n command?: string;\n cwd?: string;\n }) => {\n const sessionPart = args.target.split(\":\")[0];\n const session = safeTarget(sessionPart);\n try {\n const newWinArgs = [\"new-window\", \"-t\", session, \"-d\"];\n if (args.windowName) {\n newWinArgs.push(\"-n\", safeTarget(args.windowName));\n }\n if (args.cwd) {\n newWinArgs.push(\"-c\", path.resolve(args.cwd));\n }\n spawnSync(\"tmux\", newWinArgs, { encoding: \"utf8\", stdio: \"pipe\" });\n if (args.command) {\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", session, args.command, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n }\n return {\n ok: true,\n session,\n windowName: args.windowName ?? \"(new)\",\n message: `New window created in session '${session}'.`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), session };\n }\n },\n },\n\n terminal_kill_window: {\n description:\n \"Close a specific window in a terminal session. Use to clean up windows that are no longer needed.\",\n inputSchema: z.object({\n target: z\n .string()\n .describe(\n \"Window target: session:window (e.g. 'coding:1' or 'coding:server')\",\n ),\n }),\n execute: async (args: { target: string }) => {\n const t = safeTarget(args.target);\n try {\n spawnSync(\"tmux\", [\"kill-window\", \"-t\", t], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return {\n ok: true,\n target: t,\n message: `Window '${t}' closed.`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), target: t };\n }\n },\n },\n\n terminal_rename_window: {\n description:\n \"Rename a window in a terminal session. Use to give a window a meaningful name (e.g. 'server', 'tests').\",\n inputSchema: z.object({\n target: z\n .string()\n .describe(\n \"Window target: session:window (e.g. 'coding:1' or 'coding:old-name')\",\n ),\n newName: z.string().describe(\"New window name\"),\n }),\n execute: async (args: { target: string; newName: string }) => {\n const t = safeTarget(args.target);\n const name = safeTarget(args.newName);\n try {\n spawnSync(\"tmux\", [\"rename-window\", \"-t\", t, name], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return {\n ok: true,\n target: t,\n newName: name,\n message: `Window '${t}' renamed to '${name}'.`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), target: t };\n }\n },\n },\n\n // ==================== Pane management ====================\n\n terminal_split_pane: {\n description:\n \"Split the current pane in a terminal window (horizontal or vertical). Use to create side-by-side terminals, e.g. a dev server next to a coding window.\",\n inputSchema: z.object({\n target: z\n .string()\n .describe(\n \"Target: session, session:window, or session:window.pane (e.g. 'coding:2')\",\n ),\n vertical: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"If true, split vertically (side by side); otherwise split horizontally\"),\n command: z\n .string()\n .optional()\n .describe(\"Command to run in the new pane (e.g. 'npm run dev')\"),\n cwd: z.string().optional().describe(\"Working directory for the new pane\"),\n }),\n execute: async (args: {\n target: string;\n vertical?: boolean;\n command?: string;\n cwd?: string;\n }) => {\n const t = safeTarget(args.target);\n try {\n const splitArgs = [\"split-window\", \"-t\", t, \"-d\"];\n if (args.vertical) {\n splitArgs.push(\"-h\");\n }\n if (args.cwd) {\n splitArgs.push(\"-c\", path.resolve(args.cwd));\n }\n spawnSync(\"tmux\", splitArgs, { encoding: \"utf8\", stdio: \"pipe\" });\n\n if (args.command) {\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", t, args.command, \"Enter\"], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n }\n return {\n ok: true,\n target: t,\n message: `Pane split in '${t}'.`,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), target: t };\n }\n },\n },\n\n // ==================== Input / output ====================\n\n terminal_send_keys: {\n description:\n \"Send keys or a command to a specific terminal. Use to run a command in an existing pane or type into a specific terminal.\",\n inputSchema: z.object({\n target: z\n .string()\n .describe(\n \"Target: session (e.g. 'coding'), session:window ('coding:1'), or session:window.pane ('coding:1.0')\",\n ),\n keys: z\n .string()\n .describe(\n \"Keys or command to send (e.g. 'npm run dev').\",\n ),\n pressEnter: z\n .boolean()\n .optional()\n .default(true)\n .describe(\"If true, press Enter after the keys\"),\n }),\n execute: async (args: { target: string; keys: string; pressEnter?: boolean }) => {\n const t = safeTarget(args.target);\n try {\n spawnSync(\"tmux\", [\"send-keys\", \"-t\", t, args.keys, ...(args.pressEnter !== false ? [\"Enter\"] : [])], {\n encoding: \"utf8\",\n stdio: \"pipe\",\n });\n return { ok: true, target: t };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), target: t };\n }\n },\n },\n\n terminal_read: {\n description:\n \"Read the current visible content of a terminal pane without sending any command. Ideal for monitoring long-running processes, checking build output, or reading interactive CLI state.\",\n inputSchema: z.object({\n target: z\n .string()\n .describe(\n \"Target: session (e.g. 'coding'), session:window ('coding:1'), or session:window.pane ('coding:1.0')\",\n ),\n lines: z\n .number()\n .int()\n .min(1)\n .max(2000)\n .optional()\n .default(200)\n .describe(\"Number of scrollback lines to read (default: 200, max: 2000)\"),\n }),\n execute: async (args: { target: string; lines?: number }) => {\n const t = safeTarget(args.target);\n const lines = args.lines ?? 200;\n try {\n const output = capturePaneOutput(t, lines);\n return {\n ok: true,\n target: t,\n lines,\n output,\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err), target: t };\n }\n },\n },\n\n // ==================== Listing & discovery ====================\n\n terminal_list: {\n description:\n \"List terminal sessions, or list windows and panes for a session. Use when the user asks 'what terminals are running' or 'list my sessions'.\",\n inputSchema: z.object({\n sessionName: z\n .string()\n .optional()\n .describe(\n \"If provided, list windows and panes for this session; otherwise list all sessions\",\n ),\n }),\n execute: async (args: { sessionName?: string }) => {\n try {\n if (args.sessionName) {\n const session = safeTarget(args.sessionName);\n const windows = execSync(`tmux list-windows -t '${session}' -F '#{window_index} #{window_name}' 2>/dev/null || true`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n }).trim();\n const panes = execSync(`tmux list-panes -t '${session}' -F '#{window_index}.#{pane_index} #{pane_current_command}' 2>/dev/null || true`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n }).trim();\n return {\n ok: true,\n session,\n windows: windows ? windows.split(\"\\n\") : [],\n panes: panes ? panes.split(\"\\n\") : [],\n };\n }\n const sessions = execSync(\"tmux list-sessions -F '#{session_name}' 2>/dev/null || true\", {\n encoding: \"utf8\",\n stdio: \"pipe\",\n }).trim();\n return {\n ok: true,\n sessions: sessions ? sessions.split(\"\\n\") : [],\n };\n } catch (err: any) {\n return { ok: false, error: err?.message || String(err) };\n }\n },\n },\n\n // ==================== Run & capture ====================\n\n terminal_run: {\n description:\n \"Run a shell command in a terminal session and return the output after waiting. Creates the session if it does not exist. Use for CLIs that require a TTY (e.g. Cursor agent, interactive REPLs). For reading existing output, use terminal_read instead.\",\n inputSchema: z.object({\n sessionName: z\n .string()\n .describe(\"Terminal session name (e.g. 'build', 'agent-task')\"),\n command: z\n .string()\n .describe(\n 'Command to run (e.g. \"npm run dev\" or \"agent -p \\'Fix the bug\\'\")',\n ),\n cwd: z\n .string()\n .optional()\n .describe(\"Working directory (defaults to process cwd)\"),\n waitSeconds: z\n .number()\n .optional()\n .default(15)\n .describe(\"Seconds to wait before capturing output (default: 15)\"),\n }),\n execute: async (args: {\n sessionName: string;\n command: string;\n cwd?: string;\n waitSeconds?: number;\n }) => {\n const cwd = args.cwd ? path.resolve(args.cwd) : process.cwd();\n const waitSeconds = args.waitSeconds ?? 15;\n try {\n const output = await runInSession(\n args.sessionName,\n args.command,\n cwd,\n waitSeconds,\n );\n return { ok: true, output, cwd, sessionName: args.sessionName };\n } catch (err: any) {\n return {\n ok: false,\n error: err?.message || String(err),\n cwd,\n sessionName: args.sessionName,\n };\n }\n },\n },\n };\n}\n\n/** Exported for testing */\nexport const __private = {\n safeTarget,\n capturePaneOutput,\n sleep,\n isTmuxInstalled,\n detectInstallEnv,\n selectInstallCommand,\n selectAuthCommand,\n getMissingRequiredChecks,\n};\n","import { z } from \"zod\";\nimport { execFile } from \"child_process\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nconst MAX_CAPTURE_CHARS = 12000;\nconst DEFAULT_TAIL_LINES = 80;\nconst DEFAULT_TIMEOUT_SECONDS = 30;\nconst MAX_DISCOVERY_ATTEMPTS = 12;\n\n// ==================== Helpers ====================\n\nfunction truncateOutput(raw: string): string {\n if (raw.length <= MAX_CAPTURE_CHARS) return raw;\n const head = raw.slice(0, Math.floor(MAX_CAPTURE_CHARS / 2));\n const tail = raw.slice(-Math.floor(MAX_CAPTURE_CHARS / 2));\n const hidden = raw.length - head.length - tail.length;\n return `${head}\\n...[truncated ${hidden} chars]...\\n${tail}`;\n}\n\nfunction getTailLines(raw: string, maxLines = DEFAULT_TAIL_LINES): string {\n const lines = raw\n .split(/\\r?\\n/)\n .map((l) => l.trimEnd())\n .filter((l) => l.length > 0);\n if (lines.length <= maxLines) return lines.join(\"\\n\");\n const tail = lines.slice(-maxLines);\n return `...[${lines.length - tail.length} earlier lines omitted]...\\n${tail.join(\"\\n\")}`;\n}\n\nfunction ensureRailwayCli(): void {\n const pathEntries = (process.env.PATH || \"\").split(path.delimiter).filter(Boolean);\n for (const entry of pathEntries) {\n if (fs.existsSync(path.join(entry, \"railway\"))) return;\n if (fs.existsSync(path.join(entry, \"railway.exe\"))) return;\n }\n throw new Error(\n \"Railway CLI not found in PATH. Install with `npm install -g @railway/cli` or `brew install railway`, then run `railway login`.\"\n );\n}\n\nfunction resolveWorkingDirectory(rawCwd?: string): string {\n const cwd = rawCwd ? path.resolve(rawCwd) : process.cwd();\n if (!fs.existsSync(cwd) || !fs.statSync(cwd).isDirectory()) {\n throw new Error(`Working directory does not exist or is not a directory: ${cwd}`);\n }\n return cwd;\n}\n\nfunction safeJsonParse<T>(raw: string): T | null {\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n\nfunction sanitizeName(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \" \").trim();\n}\n\nfunction repoHintsFromCwd(cwd: string): string[] {\n const hints = new Set<string>();\n const base = path.basename(cwd).toLowerCase();\n if (base) {\n hints.add(base);\n hints.add(sanitizeName(base));\n }\n\n const gitConfigPath = path.join(cwd, \".git\", \"config\");\n if (!fs.existsSync(gitConfigPath)) return Array.from(hints);\n\n const config = fs.readFileSync(gitConfigPath, \"utf8\");\n const urls = Array.from(config.matchAll(/^\\s*url\\s*=\\s*(.+)\\s*$/gm)).map(\n (m) => m[1].trim()\n );\n\n for (const url of urls) {\n // Supports:\n // - git@github.com:owner/repo.git\n // - https://github.com/owner/repo.git\n // - ssh://git@github.com/owner/repo.git\n const match =\n url.match(/[:/]([^/:]+)\\/([^/]+?)(?:\\.git)?$/) ||\n url.match(/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/);\n if (!match) continue;\n const owner = match[1].toLowerCase();\n const repo = match[2].toLowerCase();\n hints.add(repo);\n hints.add(`${owner}/${repo}`);\n hints.add(sanitizeName(repo));\n }\n\n return Array.from(hints).filter(Boolean);\n}\n\ninterface RailwayListProject {\n id: string;\n name: string;\n environments?: { edges?: Array<{ node?: { name?: string; canAccess?: boolean } }> };\n services?: {\n edges?: Array<{ node?: { id?: string; name?: string } }>;\n };\n}\n\ninterface RailwayDiscoveryTarget {\n projectId: string;\n projectName: string;\n serviceName?: string;\n serviceId?: string;\n environmentName?: string;\n score: number;\n}\n\nfunction scoreTarget(\n projectName: string,\n serviceName: string | undefined,\n serviceHint: string | undefined,\n hints: string[]\n): number {\n const pn = sanitizeName(projectName);\n const sn = serviceName ? sanitizeName(serviceName) : \"\";\n const sh = serviceHint ? sanitizeName(serviceHint) : \"\";\n let score = 0;\n\n for (const hint of hints) {\n const h = sanitizeName(hint);\n if (!h) continue;\n if (pn === h) score += 120;\n else if (pn.includes(h) || h.includes(pn)) score += 60;\n if (sn && (sn === h || sn.includes(h) || h.includes(sn))) score += 20;\n }\n\n if (sh && sn) {\n if (sn === sh) score += 220;\n else if (sn.includes(sh) || sh.includes(sn)) score += 120;\n }\n\n return score;\n}\n\nasync function discoverTargets(\n cwd: string,\n serviceHint?: string\n): Promise<RailwayDiscoveryTarget[]> {\n const listResult = await runRailway([\"list\", \"--json\"], cwd, 45);\n if (listResult.exitCode !== 0) return [];\n\n const projects = safeJsonParse<RailwayListProject[]>(listResult.stdout);\n if (!projects || !Array.isArray(projects)) return [];\n\n const hints = repoHintsFromCwd(cwd);\n const targets: RailwayDiscoveryTarget[] = [];\n\n for (const project of projects) {\n const projectName = project.name || \"\";\n const projectId = project.id;\n if (!projectId || !projectName) continue;\n const environments = project.environments?.edges ?? [];\n const preferredEnv =\n environments.find((e) => e?.node?.name?.toLowerCase() === \"production\")\n ?.node?.name ||\n environments.find((e) => e?.node?.canAccess)?.node?.name ||\n environments[0]?.node?.name;\n\n const services = project.services?.edges ?? [];\n if (services.length === 0) {\n targets.push({\n projectId,\n projectName,\n environmentName: preferredEnv,\n score: scoreTarget(projectName, undefined, serviceHint, hints),\n });\n continue;\n }\n\n for (const edge of services) {\n const serviceName = edge?.node?.name;\n const serviceId = edge?.node?.id;\n if (!serviceName && !serviceId) continue;\n if (serviceHint) {\n const sh = sanitizeName(serviceHint);\n const sn = sanitizeName(serviceName || \"\");\n if (sh && sn && !(sn.includes(sh) || sh.includes(sn))) {\n continue;\n }\n }\n targets.push({\n projectId,\n projectName,\n serviceName,\n serviceId,\n environmentName: preferredEnv,\n score: scoreTarget(projectName, serviceName, serviceHint, hints),\n });\n }\n }\n\n return targets.sort((a, b) => b.score - a.score);\n}\n\nasync function runInDiscoveredContext(\n target: RailwayDiscoveryTarget,\n commandArgs: string[],\n timeoutSeconds: number\n): Promise<{\n link: { exitCode: number | null; stdout: string; stderr: string; timedOut: boolean; command: string };\n run: { exitCode: number | null; stdout: string; stderr: string; timedOut: boolean; command: string };\n}> {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"openviber-railway-\"));\n try {\n const linkArgs = [\"link\", \"--project\", target.projectId];\n if (target.environmentName) {\n linkArgs.push(\"--environment\", target.environmentName);\n }\n if (target.serviceName || target.serviceId) {\n linkArgs.push(\"--service\", target.serviceName || target.serviceId || \"\");\n }\n const linkResult = await runRailway(linkArgs, tmpDir, 30);\n if (linkResult.exitCode !== 0) {\n return {\n link: linkResult,\n run: {\n exitCode: 1,\n stdout: \"\",\n stderr: \"Link failed, command not executed\",\n timedOut: false,\n command: `railway ${commandArgs.join(\" \")}`,\n },\n };\n }\n const runResult = await runRailway(commandArgs, tmpDir, timeoutSeconds);\n return { link: linkResult, run: runResult };\n } finally {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n}\n\nasync function runWithDiscovery(args: {\n cwd: string;\n serviceHint?: string;\n commandArgs: string[];\n timeoutSeconds?: number;\n}): Promise<RailwayResult> {\n const timeoutSeconds = args.timeoutSeconds ?? DEFAULT_TIMEOUT_SECONDS;\n const direct = await runRailway(args.commandArgs, args.cwd, timeoutSeconds);\n if (direct.exitCode === 0) {\n return formatResult({ ...direct, exitCode: direct.exitCode });\n }\n\n const targets = (await discoverTargets(args.cwd, args.serviceHint)).slice(\n 0,\n MAX_DISCOVERY_ATTEMPTS\n );\n if (targets.length === 0) {\n const failed = formatResult({ ...direct, exitCode: direct.exitCode });\n return {\n ...failed,\n summary: `${failed.summary} | discovery=none`,\n output: [\n failed.output,\n \"\",\n \"Discovery fallback: no candidate Railway projects/services were found.\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n };\n }\n\n let lastFailure: ReturnType<typeof formatResult> | null = null;\n for (const target of targets) {\n const discoveredRun = await runInDiscoveredContext(\n target,\n args.commandArgs,\n timeoutSeconds\n );\n const formatted = formatResult({\n command: `${discoveredRun.link.command} && ${discoveredRun.run.command}`,\n stdout: discoveredRun.run.stdout,\n stderr: discoveredRun.run.stderr || discoveredRun.link.stderr,\n exitCode: discoveredRun.run.exitCode,\n timedOut: discoveredRun.run.timedOut || discoveredRun.link.timedOut,\n });\n if (formatted.ok) {\n return {\n ...formatted,\n summary: `${formatted.summary} | discovery=matched project=${target.projectName} service=${target.serviceName || \"default\"} env=${target.environmentName || \"default\"}`,\n };\n }\n lastFailure = formatted;\n }\n\n return {\n ...(lastFailure ||\n formatResult({\n ...direct,\n exitCode: direct.exitCode,\n })),\n summary: `${\n (lastFailure ||\n formatResult({\n ...direct,\n exitCode: direct.exitCode,\n })).summary\n } | discovery=exhausted attempts=${targets.length}`,\n };\n}\n\ninterface RailwayDeploymentListItem {\n id?: string;\n status?: string;\n createdAt?: string;\n}\n\nasync function resolveLatestDeploymentId(\n cwd: string,\n service?: string\n): Promise<string | null> {\n const args = [\"deployment\", \"list\", \"--json\", \"--limit\", \"1\"];\n if (service) args.push(\"--service\", service);\n\n const result = await runWithDiscovery({\n cwd,\n serviceHint: service,\n commandArgs: args,\n timeoutSeconds: 45,\n });\n if (!result.ok) return null;\n const deployments = safeJsonParse<RailwayDeploymentListItem[]>(result.output);\n if (!deployments || !Array.isArray(deployments) || deployments.length === 0) {\n return null;\n }\n const id = deployments[0]?.id;\n return id && id.length > 0 ? id : null;\n}\n\n/**\n * Execute a Railway CLI command and capture output.\n */\nasync function runRailway(\n args: string[],\n cwd: string,\n timeoutSeconds: number = DEFAULT_TIMEOUT_SECONDS\n): Promise<{ exitCode: number | null; stdout: string; stderr: string; timedOut: boolean; command: string }> {\n const command = `railway ${args.join(\" \")}`;\n\n return new Promise((resolve, reject) => {\n const child = execFile(\n \"railway\",\n args,\n {\n cwd,\n timeout: timeoutSeconds * 1000,\n maxBuffer: 5 * 1024 * 1024,\n env: process.env,\n },\n (error, stdout, stderr) => {\n const timedOut = error?.killed === true;\n const exitCode = error ? (error as any).code ?? 1 : 0;\n resolve({\n exitCode: typeof exitCode === \"number\" ? exitCode : 1,\n stdout: stdout || \"\",\n stderr: stderr || \"\",\n timedOut,\n command,\n });\n }\n );\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n });\n}\n\ntype RailwayResult = {\n ok: boolean;\n command: string;\n output: string;\n stdoutTail: string;\n stderrTail: string;\n error?: string;\n summary: string;\n};\n\nfunction formatResult(args: {\n command: string;\n stdout: string;\n stderr: string;\n exitCode: number | null;\n timedOut: boolean;\n error?: string;\n}): RailwayResult {\n const merged = truncateOutput(\n [args.stdout.trim(), args.stderr.trim()].filter(Boolean).join(\"\\n\\n\")\n );\n const status = args.error\n ? \"failed\"\n : args.timedOut\n ? \"timed_out\"\n : args.exitCode === 0\n ? \"success\"\n : \"failed\";\n\n return {\n ok: status === \"success\",\n command: args.command,\n output: merged,\n stdoutTail: getTailLines(args.stdout),\n stderrTail: getTailLines(args.stderr),\n error: args.error,\n summary: `status=${status} | exitCode=${args.exitCode ?? \"unknown\"}`,\n };\n}\n\n// ==================== Tool exports ====================\n\nexport function getTools(): Record<string, import(\"../worker/tool\").CoreTool> {\n return {\n railway_status: {\n description:\n \"Get Railway deployment status for the linked project or a specific service. Shows service health, deployment state, and URLs.\",\n inputSchema: z.object({\n service: z\n .string()\n .optional()\n .describe(\"Service name to check (omit for all services)\"),\n cwd: z\n .string()\n .optional()\n .describe(\"Project directory (must be railway-linked)\"),\n }),\n execute: async (args: { service?: string; cwd?: string }) => {\n try {\n ensureRailwayCli();\n const cwd = resolveWorkingDirectory(args.cwd);\n const cmdArgs = args.service\n ? [\"service\", \"status\", \"--json\", \"--service\", args.service]\n : [\"status\", \"--json\"];\n return await runWithDiscovery({\n cwd,\n serviceHint: args.service,\n commandArgs: cmdArgs,\n timeoutSeconds: 45,\n });\n } catch (err: any) {\n return {\n ok: false,\n command: \"railway status\",\n output: \"\",\n stdoutTail: \"\",\n stderrTail: \"\",\n error: err?.message || String(err),\n summary: \"status=failed\",\n };\n }\n },\n },\n\n railway_logs: {\n description:\n \"View recent deployment logs from Railway. Useful for debugging deployment failures or monitoring runtime behavior.\",\n inputSchema: z.object({\n service: z\n .string()\n .optional()\n .describe(\"Service name to get logs for\"),\n lines: z\n .number()\n .int()\n .min(1)\n .max(500)\n .optional()\n .default(50)\n .describe(\"Number of log lines to retrieve (default: 50)\"),\n deploymentId: z\n .string()\n .optional()\n .describe(\n \"Specific deployment ID. If omitted, the tool resolves the latest deployment first.\"\n ),\n cwd: z\n .string()\n .optional()\n .describe(\"Project directory (must be railway-linked)\"),\n }),\n execute: async (args: {\n service?: string;\n lines?: number;\n deploymentId?: string;\n cwd?: string;\n }) => {\n try {\n ensureRailwayCli();\n const cwd = resolveWorkingDirectory(args.cwd);\n const deploymentId =\n args.deploymentId ??\n (await resolveLatestDeploymentId(cwd, args.service)) ??\n undefined;\n\n const cmdArgs = deploymentId\n ? [\"logs\", deploymentId, \"--lines\", String(args.lines ?? 50)]\n : [\"logs\", \"--lines\", String(args.lines ?? 50)];\n if (args.service) cmdArgs.push(\"--service\", args.service);\n return await runWithDiscovery({\n cwd,\n serviceHint: args.service,\n commandArgs: cmdArgs,\n timeoutSeconds: 60,\n });\n } catch (err: any) {\n return {\n ok: false,\n command: \"railway logs\",\n output: \"\",\n stdoutTail: \"\",\n stderrTail: \"\",\n error: err?.message || String(err),\n summary: \"status=failed\",\n };\n }\n },\n },\n\n railway_deploy: {\n description:\n \"Trigger a redeployment on Railway. Deploys the latest code to the linked service.\",\n inputSchema: z.object({\n service: z\n .string()\n .optional()\n .describe(\"Service name to redeploy\"),\n cwd: z\n .string()\n .optional()\n .describe(\"Project directory (must be railway-linked)\"),\n }),\n execute: async (args: { service?: string; cwd?: string }) => {\n try {\n ensureRailwayCli();\n const cwd = resolveWorkingDirectory(args.cwd);\n const cmdArgs = [\"up\", \"--detach\"];\n if (args.service) cmdArgs.push(\"--service\", args.service);\n return await runWithDiscovery({\n cwd,\n serviceHint: args.service,\n commandArgs: cmdArgs,\n timeoutSeconds: 120,\n });\n } catch (err: any) {\n return {\n ok: false,\n command: \"railway up\",\n output: \"\",\n stdoutTail: \"\",\n stderrTail: \"\",\n error: err?.message || String(err),\n summary: \"status=failed\",\n };\n }\n },\n },\n\n railway_run: {\n description:\n \"Run any Railway CLI command directly. Use for operations not covered by other railway tools (e.g. `variables list`, `domain list`, `environment`).\",\n inputSchema: z.object({\n command: z\n .string()\n .min(1)\n .describe(\n \"Railway CLI subcommand and arguments (e.g. 'variables list', 'domain list', 'environment')\"\n ),\n cwd: z\n .string()\n .optional()\n .describe(\"Project directory (must be railway-linked)\"),\n }),\n execute: async (args: { command: string; cwd?: string }) => {\n try {\n ensureRailwayCli();\n const cwd = resolveWorkingDirectory(args.cwd);\n const cmdArgs = args.command.split(/\\s+/).filter(Boolean);\n return await runWithDiscovery({\n cwd,\n commandArgs: cmdArgs,\n timeoutSeconds: 60,\n });\n } catch (err: any) {\n return {\n ok: false,\n command: `railway ${args.command}`,\n output: \"\",\n stdoutTail: \"\",\n stderrTail: \"\",\n error: err?.message || String(err),\n summary: \"status=failed\",\n };\n }\n },\n },\n\n railway_deployments: {\n description:\n \"List recent deployments for the linked Railway service. Shows deployment IDs, status (SUCCESS/FAILED/BUILDING), and timestamps. Use this to find failed deployments before fetching their build logs.\",\n inputSchema: z.object({\n cwd: z\n .string()\n .optional()\n .describe(\"Project directory (must be railway-linked)\"),\n }),\n execute: async (args: { cwd?: string }) => {\n try {\n ensureRailwayCli();\n const cwd = resolveWorkingDirectory(args.cwd);\n return await runWithDiscovery({\n cwd,\n commandArgs: [\"deployment\", \"list\", \"--json\"],\n timeoutSeconds: 45,\n });\n } catch (err: any) {\n return {\n ok: false,\n command: \"railway deployment list\",\n output: \"\",\n stdoutTail: \"\",\n stderrTail: \"\",\n error: err?.message || String(err),\n summary: \"status=failed\",\n };\n }\n },\n },\n\n railway_build_logs: {\n description:\n \"Fetch build logs for a specific Railway deployment by its deployment ID. Use this to diagnose build failures. Get the deployment ID from railway_deployments first.\",\n inputSchema: z.object({\n deploymentId: z\n .string()\n .min(1)\n .describe(\"Deployment ID (UUID from railway_deployments output)\"),\n cwd: z\n .string()\n .optional()\n .describe(\"Project directory (must be railway-linked)\"),\n }),\n execute: async (args: { deploymentId: string; cwd?: string }) => {\n try {\n ensureRailwayCli();\n const cwd = resolveWorkingDirectory(args.cwd);\n return await runWithDiscovery({\n cwd,\n commandArgs: [\"logs\", \"--build\", args.deploymentId],\n timeoutSeconds: 60,\n });\n } catch (err: any) {\n return {\n ok: false,\n command: `railway logs -d ${args.deploymentId}`,\n output: \"\",\n stdoutTail: \"\",\n stderrTail: \"\",\n error: err?.message || String(err),\n summary: \"status=failed\",\n };\n }\n },\n },\n };\n}\n","/**\n * Gmail Skill — Native Google API integration\n *\n * Uses the googleapis library with OAuth2 tokens to provide Gmail\n * search, read, send, and modify capabilities. Tokens are injected\n * via the tool execution context from the daemon config.\n */\n\nimport { z } from \"zod\";\nimport type { CoreTool } from \"../worker/tool\";\n\nconst MAX_RESULTS = 100;\nconst MAX_BODY_CHARS = 8000;\n\n// ==================== Helpers ====================\n\ninterface GoogleOAuthTokens {\n accessToken: string;\n refreshToken?: string | null;\n}\n\n/**\n * Get a Gmail client using tokens from the context.\n * Lazily imports googleapis to avoid bundling issues when the skill\n * is loaded but Google OAuth is not configured.\n */\nasync function getGmailClient(tokens: GoogleOAuthTokens) {\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2();\n oauth2Client.setCredentials({\n access_token: tokens.accessToken,\n refresh_token: tokens.refreshToken || undefined,\n });\n return google.gmail({ version: \"v1\", auth: oauth2Client });\n}\n\nfunction extractTokens(context?: any): GoogleOAuthTokens {\n const google = context?.oauthTokens?.google;\n if (!google?.accessToken) {\n throw new Error(\n \"Gmail OAuth tokens not available. Connect your Google account in Settings > Integrations.\",\n );\n }\n return google;\n}\n\n/**\n * Decode a base64url-encoded message body part.\n */\nfunction decodeBase64Url(data: string): string {\n return Buffer.from(data, \"base64url\").toString(\"utf-8\");\n}\n\n/**\n * Extract plain text body from a Gmail message payload.\n */\nfunction extractBody(payload: any): string {\n if (!payload) return \"\";\n\n // Direct body\n if (payload.body?.data) {\n return decodeBase64Url(payload.body.data);\n }\n\n // Multipart — look for text/plain first, then text/html\n if (payload.parts && Array.isArray(payload.parts)) {\n // First pass: text/plain\n for (const part of payload.parts) {\n if (part.mimeType === \"text/plain\" && part.body?.data) {\n return decodeBase64Url(part.body.data);\n }\n }\n // Second pass: text/html (strip tags)\n for (const part of payload.parts) {\n if (part.mimeType === \"text/html\" && part.body?.data) {\n const html = decodeBase64Url(part.body.data);\n return html.replace(/<[^>]+>/g, \"\");\n }\n }\n // Recurse into nested multipart\n for (const part of payload.parts) {\n const nested = extractBody(part);\n if (nested) return nested;\n }\n }\n\n return \"\";\n}\n\n/**\n * Get a header value from a Gmail message payload.\n */\nfunction getHeader(payload: any, name: string): string {\n if (!payload?.headers) return \"\";\n const header = payload.headers.find(\n (h: any) => h.name.toLowerCase() === name.toLowerCase(),\n );\n return header?.value || \"\";\n}\n\n/**\n * Build an RFC 2822 email message for sending.\n */\nfunction buildRawEmail(args: {\n to: string;\n subject: string;\n body: string;\n cc?: string;\n bcc?: string;\n from?: string;\n}): string {\n const lines: string[] = [];\n if (args.from) lines.push(`From: ${args.from}`);\n lines.push(`To: ${args.to}`);\n if (args.cc) lines.push(`Cc: ${args.cc}`);\n if (args.bcc) lines.push(`Bcc: ${args.bcc}`);\n lines.push(`Subject: ${args.subject}`);\n lines.push(\"Content-Type: text/plain; charset=utf-8\");\n lines.push(\"\");\n lines.push(args.body);\n\n const raw = lines.join(\"\\r\\n\");\n return Buffer.from(raw).toString(\"base64url\");\n}\n\n// ==================== Tool exports ====================\n\nexport function getTools(): Record<string, CoreTool> {\n return {\n gmail_search: {\n description:\n \"Search Gmail messages using full Gmail search syntax (same as the Gmail search bar). Returns message IDs, subjects, senders, and dates.\",\n inputSchema: z.object({\n query: z\n .string()\n .min(1)\n .describe(\n \"Gmail search query (e.g. 'is:unread', 'from:alice@example.com newer_than:7d', 'subject:deploy')\",\n ),\n maxResults: z\n .number()\n .int()\n .min(1)\n .max(MAX_RESULTS)\n .optional()\n .default(20)\n .describe(\"Maximum number of messages to return (default: 20)\"),\n }),\n execute: async (\n args: { query: string; maxResults?: number },\n context?: any,\n ) => {\n try {\n const tokens = extractTokens(context);\n const gmail = await getGmailClient(tokens);\n\n const listRes = await gmail.users.messages.list({\n userId: \"me\",\n q: args.query,\n maxResults: args.maxResults ?? 20,\n });\n\n const messageIds = listRes.data.messages || [];\n if (messageIds.length === 0) {\n return {\n ok: true,\n count: 0,\n messages: [],\n summary: `No messages found for \"${args.query}\"`,\n };\n }\n\n // Fetch metadata for each message\n const messages = await Promise.all(\n messageIds.map(async (msg: any) => {\n const detail = await gmail.users.messages.get({\n userId: \"me\",\n id: msg.id,\n format: \"metadata\",\n metadataHeaders: [\"From\", \"Subject\", \"Date\"],\n });\n const payload = detail.data.payload;\n return {\n id: msg.id,\n threadId: msg.threadId,\n from: getHeader(payload, \"From\"),\n subject: getHeader(payload, \"Subject\"),\n date: getHeader(payload, \"Date\"),\n snippet: detail.data.snippet || \"\",\n labelIds: detail.data.labelIds || [],\n };\n }),\n );\n\n return {\n ok: true,\n count: messages.length,\n messages,\n summary: `Found ${messages.length} message(s) for \"${args.query}\"`,\n };\n } catch (err: any) {\n return {\n ok: false,\n count: 0,\n messages: [],\n error: err?.message || String(err),\n summary: \"Search failed\",\n };\n }\n },\n },\n\n gmail_read: {\n description:\n \"Read the full body of a Gmail message by its message ID. Get IDs from gmail_search results.\",\n inputSchema: z.object({\n messageId: z\n .string()\n .min(1)\n .describe(\"Gmail message ID from gmail_search results\"),\n }),\n execute: async (args: { messageId: string }, context?: any) => {\n try {\n const tokens = extractTokens(context);\n const gmail = await getGmailClient(tokens);\n\n const detail = await gmail.users.messages.get({\n userId: \"me\",\n id: args.messageId,\n format: \"full\",\n });\n\n const payload = detail.data.payload;\n let body = extractBody(payload);\n if (body.length > MAX_BODY_CHARS) {\n body =\n body.slice(0, MAX_BODY_CHARS) +\n `\\n...[truncated ${body.length - MAX_BODY_CHARS} chars]`;\n }\n\n const email = {\n id: detail.data.id,\n threadId: detail.data.threadId,\n from: getHeader(payload, \"From\"),\n to: getHeader(payload, \"To\"),\n subject: getHeader(payload, \"Subject\"),\n date: getHeader(payload, \"Date\"),\n body: body.trim(),\n labelIds: detail.data.labelIds || [],\n };\n\n return {\n ok: true,\n email,\n summary: `Read email: \"${email.subject}\" from ${email.from}`,\n };\n } catch (err: any) {\n return {\n ok: false,\n error: err?.message || String(err),\n summary: \"Read failed\",\n };\n }\n },\n },\n\n gmail_send: {\n description:\n \"Send an email via Gmail. Composes and sends a plain text email.\",\n inputSchema: z.object({\n to: z.string().min(1).describe(\"Recipient email address\"),\n subject: z.string().min(1).describe(\"Email subject line\"),\n body: z.string().min(1).describe(\"Email body (plain text)\"),\n cc: z.string().optional().describe(\"CC recipient email address\"),\n bcc: z.string().optional().describe(\"BCC recipient email address\"),\n }),\n execute: async (\n args: {\n to: string;\n subject: string;\n body: string;\n cc?: string;\n bcc?: string;\n },\n context?: any,\n ) => {\n try {\n const tokens = extractTokens(context);\n const gmail = await getGmailClient(tokens);\n\n const raw = buildRawEmail(args);\n const sendRes = await gmail.users.messages.send({\n userId: \"me\",\n requestBody: { raw },\n });\n\n return {\n ok: true,\n messageId: sendRes.data.id,\n threadId: sendRes.data.threadId,\n summary: `Email sent to ${args.to}: \"${args.subject}\"`,\n };\n } catch (err: any) {\n return {\n ok: false,\n error: err?.message || String(err),\n summary: \"Send failed\",\n };\n }\n },\n },\n\n gmail_modify: {\n description:\n \"Modify labels on a Gmail message (e.g. mark as read/unread, archive, star).\",\n inputSchema: z.object({\n messageId: z\n .string()\n .min(1)\n .describe(\"Gmail message ID\"),\n addLabels: z\n .array(z.string())\n .optional()\n .describe(\"Label IDs to add (e.g. ['STARRED', 'UNREAD'])\"),\n removeLabels: z\n .array(z.string())\n .optional()\n .describe(\"Label IDs to remove (e.g. ['UNREAD', 'INBOX'])\"),\n }),\n execute: async (\n args: {\n messageId: string;\n addLabels?: string[];\n removeLabels?: string[];\n },\n context?: any,\n ) => {\n try {\n const tokens = extractTokens(context);\n const gmail = await getGmailClient(tokens);\n\n await gmail.users.messages.modify({\n userId: \"me\",\n id: args.messageId,\n requestBody: {\n addLabelIds: args.addLabels || [],\n removeLabelIds: args.removeLabels || [],\n },\n });\n\n const actions: string[] = [];\n if (args.addLabels?.length) {\n actions.push(`added: ${args.addLabels.join(\", \")}`);\n }\n if (args.removeLabels?.length) {\n actions.push(`removed: ${args.removeLabels.join(\", \")}`);\n }\n\n return {\n ok: true,\n summary: `Modified message ${args.messageId} (${actions.join(\"; \")})`,\n };\n } catch (err: any) {\n return {\n ok: false,\n error: err?.message || String(err),\n summary: \"Modify failed\",\n };\n }\n },\n },\n };\n}\n","/**\n * System Info skill — expose system telemetry as agent tools.\n *\n * Reuses collectMachineResourceStatus() from daemon/telemetry.ts for\n * CPU, memory, disk, load average, and network. Adds process listing\n * via `ps` and optional DNS connectivity checks.\n */\n\nimport { z } from \"zod\";\nimport * as os from \"os\";\nimport { execSync } from \"child_process\";\nimport {\n collectMachineResourceStatus,\n formatBytes,\n formatUptime,\n} from \"../daemon/telemetry\";\n\n// ==================== Helpers ====================\n\ninterface ProcessInfo {\n pid: number;\n user: string;\n cpu: number;\n mem: number;\n vsz: number;\n rss: number;\n command: string;\n}\n\nfunction getTopProcesses(\n sortBy: \"cpu\" | \"mem\" = \"cpu\",\n limit: number = 10,\n): ProcessInfo[] {\n try {\n const flag = sortBy === \"cpu\" ? \"-r\" : \"-m\";\n const output = execSync(`ps aux ${flag}`, {\n encoding: \"utf8\",\n stdio: \"pipe\",\n timeout: 5000,\n });\n\n const lines = output.trim().split(\"\\n\").slice(1); // skip header\n const processes: ProcessInfo[] = [];\n\n for (const line of lines.slice(0, limit)) {\n const parts = line.trim().split(/\\s+/);\n if (parts.length < 11) continue;\n\n processes.push({\n pid: parseInt(parts[1], 10),\n user: parts[0],\n cpu: parseFloat(parts[2]),\n mem: parseFloat(parts[3]),\n vsz: parseInt(parts[4], 10) * 1024, // KB → bytes\n rss: parseInt(parts[5], 10) * 1024, // KB → bytes\n command: parts.slice(10).join(\" \").slice(0, 200),\n });\n }\n\n return processes;\n } catch {\n return [];\n }\n}\n\nfunction checkDnsConnectivity(hostname: string): {\n reachable: boolean;\n resolvedAddress?: string;\n error?: string;\n} {\n try {\n const output = execSync(\n `dig +short +timeout=3 +tries=1 ${hostname.replace(/[^a-zA-Z0-9.\\-]/g, \"\")} 2>/dev/null || host -W 3 ${hostname.replace(/[^a-zA-Z0-9.\\-]/g, \"\")} 2>/dev/null`,\n { encoding: \"utf8\", stdio: \"pipe\", timeout: 5000 },\n );\n const firstLine = output.trim().split(\"\\n\")[0]?.trim();\n if (firstLine) {\n return { reachable: true, resolvedAddress: firstLine };\n }\n return { reachable: false, error: \"No DNS resolution result\" };\n } catch (err: any) {\n return { reachable: false, error: err?.message || String(err) };\n }\n}\n\n// ==================== Tools ====================\n\nexport function getTools(): Record<string, import(\"../worker/tool\").CoreTool> {\n return {\n system_info: {\n description:\n \"Get a full system resource snapshot: CPU (cores, model, usage), memory (total/free/used), disk usage, load averages, hostname, platform, architecture, and uptime. Use when the user asks about system resources, available disk space, memory pressure, or machine specifications.\",\n inputSchema: z.object({\n includePerCoreUsage: z\n .boolean()\n .optional()\n .default(false)\n .describe(\n \"Include per-core CPU usage percentages (can be verbose on many-core machines).\",\n ),\n }),\n execute: async (args: { includePerCoreUsage?: boolean }) => {\n const status = await collectMachineResourceStatus();\n\n // Build a concise human-readable summary alongside the raw data\n const summary = [\n `Host: ${status.hostname} (${status.platform}, ${status.arch})`,\n `Uptime: ${formatUptime(status.systemUptimeSeconds)}`,\n `CPU: ${status.cpu.cores} cores (${status.cpu.model}), ${status.cpu.averageUsage.toFixed(1)}% avg usage`,\n `Memory: ${formatBytes(status.memory.usedBytes)} / ${formatBytes(status.memory.totalBytes)} (${status.memory.usagePercent.toFixed(1)}% used)`,\n `Load: ${status.loadAverage.map((l) => l.toFixed(2)).join(\", \")} (1m, 5m, 15m)`,\n ...status.disks.map(\n (d) =>\n `Disk ${d.mount}: ${formatBytes(d.usedBytes)} / ${formatBytes(d.totalBytes)} (${d.usagePercent.toFixed(1)}% used, ${formatBytes(d.availableBytes)} free)`,\n ),\n ].join(\"\\n\");\n\n const cpu = args.includePerCoreUsage\n ? status.cpu\n : {\n cores: status.cpu.cores,\n model: status.cpu.model,\n speedMHz: status.cpu.speedMHz,\n averageUsage: status.cpu.averageUsage,\n };\n\n return {\n summary,\n hostname: status.hostname,\n platform: status.platform,\n arch: status.arch,\n systemUptimeSeconds: status.systemUptimeSeconds,\n cpu,\n memory: status.memory,\n disks: status.disks,\n loadAverage: status.loadAverage,\n collectedAt: status.collectedAt,\n };\n },\n },\n\n system_processes: {\n description:\n \"List the top processes on this machine sorted by CPU or memory usage. Use to diagnose which processes are consuming the most resources, or to check if a specific process is running.\",\n inputSchema: z.object({\n sortBy: z\n .enum([\"cpu\", \"mem\"])\n .optional()\n .default(\"cpu\")\n .describe(\"Sort processes by CPU usage or memory usage.\"),\n limit: z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .default(10)\n .describe(\"Number of processes to return (default 10, max 50).\"),\n }),\n execute: async (args: { sortBy?: \"cpu\" | \"mem\"; limit?: number }) => {\n const sortBy = args.sortBy ?? \"cpu\";\n const limit = Math.min(50, Math.max(1, args.limit ?? 10));\n const processes = getTopProcesses(sortBy, limit);\n\n if (processes.length === 0) {\n return {\n ok: false,\n error:\n \"Failed to list processes. The `ps` command may not be available.\",\n };\n }\n\n const summary = processes\n .map(\n (p, i) =>\n `${i + 1}. PID ${p.pid} (${p.user}) — CPU ${p.cpu.toFixed(1)}%, Mem ${p.mem.toFixed(1)}% (${formatBytes(p.rss)} RSS) — ${p.command.slice(0, 80)}`,\n )\n .join(\"\\n\");\n\n return {\n ok: true,\n sortBy,\n count: processes.length,\n summary,\n processes,\n };\n },\n },\n\n system_network: {\n description:\n \"List active network interfaces with their IP addresses and MAC addresses. Optionally check DNS connectivity to a hostname. Use to understand network configuration or verify internet access.\",\n inputSchema: z.object({\n checkConnectivity: z\n .string()\n .optional()\n .describe(\n \"Optional hostname to DNS-resolve as a connectivity check (e.g. 'google.com').\",\n ),\n }),\n execute: async (args: { checkConnectivity?: string }) => {\n const interfaces = os.networkInterfaces();\n const result: Array<{\n name: string;\n ipv4?: string;\n ipv6?: string;\n mac?: string;\n internal: boolean;\n }> = [];\n\n for (const [name, addrs] of Object.entries(interfaces)) {\n if (!addrs) continue;\n\n const iface: (typeof result)[number] = {\n name,\n internal: addrs.some((a) => a.internal) ?? false,\n };\n\n for (const addr of addrs) {\n if (addr.family === \"IPv4\") {\n iface.ipv4 = addr.address;\n iface.mac = addr.mac;\n } else if (\n addr.family === \"IPv6\" &&\n !addr.address.startsWith(\"fe80\")\n ) {\n iface.ipv6 = addr.address;\n }\n }\n\n if (iface.ipv4) {\n result.push(iface);\n }\n }\n\n const external = result.filter((i) => !i.internal);\n const summary = external.length > 0\n ? external\n .map((i) => `${i.name}: ${i.ipv4}${i.mac ? ` (MAC ${i.mac})` : \"\"}`)\n .join(\"\\n\")\n : \"No external network interfaces found.\";\n\n const response: Record<string, unknown> = {\n summary,\n interfaces: result,\n };\n\n if (args.checkConnectivity) {\n response.connectivity = checkDnsConnectivity(args.checkConnectivity);\n }\n\n return response;\n },\n },\n };\n}\n","/**\n * Skill-originated tool registration.\n *\n * These are CoreTool objects that live in src/tools/ as standalone modules.\n * The corresponding SKILL.md files (instructions) live in src/skills/<name>/\n * and tell the agent HOW to use these tools.\n *\n * Per the OpenClaw convention, skill directories contain only:\n * SKILL.md, _meta.json, scripts/, references/\n * No TypeScript tool code lives in skill directories.\n */\n\nimport { defaultToolRegistry } from \"./registry\";\nimport { getTools as getCursorAgentTools } from \"./cursor-agent\";\nimport { getTools as getCodexCliTools } from \"./codex-cli\";\nimport { getTools as getGeminiCliTools } from \"./gemini-cli\";\nimport { getTools as getGithubTools } from \"./github\";\nimport { getTools as getTerminalTools } from \"./terminal\";\nimport { getTools as getRailwayTools } from \"./railway\";\nimport { getTools as getGmailTools } from \"./gmail\";\nimport { getTools as getSystemInfoTools } from \"./system-info\";\n\n/**\n * Register all tools into the ToolRegistry.\n *\n * Called during daemon startup alongside other tool initialization.\n * Each namespace corresponds to a skill directory that also has a SKILL.md.\n */\nexport function registerSkillTools() {\n defaultToolRegistry.registerTools(\"cursor-agent\", getCursorAgentTools());\n defaultToolRegistry.registerTools(\"codex-cli\", getCodexCliTools());\n defaultToolRegistry.registerTools(\"gemini-cli\", getGeminiCliTools());\n defaultToolRegistry.registerTools(\"github\", getGithubTools());\n defaultToolRegistry.registerTools(\"terminal\", getTerminalTools());\n defaultToolRegistry.registerTools(\"railway\", getRailwayTools());\n defaultToolRegistry.registerTools(\"gmail\", getGmailTools());\n defaultToolRegistry.registerTools(\"system-info\", getSystemInfoTools());\n}\n","import { IncomingMessage, ServerResponse } from \"http\";\nimport { URL } from \"url\";\n\nexport type RouteHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>\n) => void | Promise<void>;\n\ninterface Route {\n method: string;\n pattern: RegExp;\n keys: string[];\n handler: RouteHandler;\n}\n\nexport class Router {\n private routes: Route[] = [];\n\n constructor() {}\n\n /**\n * Register a route handler for a specific HTTP method and path pattern.\n * Path patterns support parameters like `/users/:id`.\n */\n add(method: string, path: string, handler: RouteHandler): void {\n const keys: string[] = [];\n // Normalize path: remove trailing slash unless it's just \"/\"\n const normalizedPath = path === \"/\" ? path : path.replace(/\\/+$/, \"\");\n\n // Convert path to regex. escape special chars except :param\n // e.g. /api/tasks/:id -> ^/api/tasks/([^/]+)$\n const patternString = normalizedPath\n .replace(/([.+*?^$(){}|[\\]\\\\])/g, \"\\\\$1\") // Escape regex chars\n .replace(/:(\\w+)/g, (_, key) => {\n keys.push(key);\n return \"([^/]+)\";\n });\n\n const pattern = new RegExp(`^${patternString}$`);\n this.routes.push({ method: method.toUpperCase(), pattern, keys, handler });\n }\n\n get(path: string, handler: RouteHandler): void {\n this.add(\"GET\", path, handler);\n }\n\n post(path: string, handler: RouteHandler): void {\n this.add(\"POST\", path, handler);\n }\n\n put(path: string, handler: RouteHandler): void {\n this.add(\"PUT\", path, handler);\n }\n\n delete(path: string, handler: RouteHandler): void {\n this.add(\"DELETE\", path, handler);\n }\n\n options(path: string, handler: RouteHandler): void {\n this.add(\"OPTIONS\", path, handler);\n }\n\n /**\n * Handle an incoming HTTP request.\n * Matches the URL and method against registered routes.\n * Handles CORS preflight automatically if no OPTIONS handler is found.\n */\n async handle(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const method = req.method || \"GET\";\n const url = new URL(req.url || \"/\", `http://${req.headers.host || \"localhost\"}`);\n const pathname = url.pathname === \"/\" ? \"/\" : url.pathname.replace(/\\/+$/, \"\");\n\n // Default CORS headers (can be overridden by handlers)\n if (!res.getHeader(\"Access-Control-Allow-Origin\")) {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n }\n if (!res.getHeader(\"Access-Control-Allow-Methods\")) {\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, PUT, DELETE, OPTIONS\");\n }\n if (!res.getHeader(\"Access-Control-Allow-Headers\")) {\n res.setHeader(\n \"Access-Control-Allow-Headers\",\n \"Content-Type, Authorization, x-vercel-ai-ui-message-stream\"\n );\n }\n if (!res.getHeader(\"Access-Control-Expose-Headers\")) {\n res.setHeader(\"Access-Control-Expose-Headers\", \"x-vercel-ai-ui-message-stream\");\n }\n\n // Handle CORS preflight automatically if no specific OPTIONS handler is matched\n if (method === \"OPTIONS\") {\n // Check if we have a specific OPTIONS handler\n const hasOptionsHandler = this.routes.some(\n (r) => r.method === \"OPTIONS\" && r.pattern.test(pathname)\n );\n if (!hasOptionsHandler) {\n res.writeHead(204);\n res.end();\n return;\n }\n }\n\n for (const route of this.routes) {\n if (route.method !== method) continue;\n\n const match = pathname.match(route.pattern);\n if (match) {\n const params: Record<string, string> = {};\n route.keys.forEach((key, index) => {\n // match[0] is the full match, match[1] is the first capture group\n params[key] = decodeURIComponent(match[index + 1]);\n });\n\n try {\n await route.handler(req, res, params);\n } catch (error) {\n console.error(`[Router] Error handling ${method} ${pathname}:`, error);\n if (!res.writableEnded) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Internal Server Error\" }));\n }\n }\n return;\n }\n }\n\n // 404 Not Found\n if (!res.writableEnded) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n }\n }\n}\n\n/**\n * Helper to read the request body as a string.\n */\nexport function readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = \"\";\n req.on(\"data\", (chunk) => (body += chunk));\n req.on(\"end\", () => resolve(body));\n req.on(\"error\", (err) => reject(err));\n });\n}\n\n/**\n * Helper to read and parse JSON body.\n */\nexport async function readJsonBody<T = any>(req: IncomingMessage): Promise<T> {\n const body = await readBody(req);\n try {\n return JSON.parse(body || \"{}\");\n } catch (err) {\n throw new Error(\"Invalid JSON body\");\n }\n}\n","/**\n * Task Manager — handles task CRUD, streaming, and progress lifecycle.\n */\n\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport { randomUUID } from \"crypto\";\nimport { readJsonBody } from \"../utils/router\";\nimport type {\n GatewayTask,\n ConnectedViber,\n TaskProgressEnvelope,\n} from \"./types\";\n\nconst MAX_STREAM_BUFFER_BYTES = 2_000_000;\n\nexport class TaskManager {\n readonly tasks: Map<string, GatewayTask> = new Map();\n /** Active SSE stream subscribers per task. */\n private streamSubscribers: Map<string, ServerResponse[]> = new Map();\n\n constructor(\n private getVibers: () => Map<string, ConnectedViber>,\n ) { }\n\n // ==================== HTTP Handlers ====================\n\n handleListTasks(_req: IncomingMessage, res: ServerResponse): void {\n const vibers = this.getVibers();\n const tasks = Array.from(this.tasks.values()).map((t) => {\n const connectedViber = vibers.get(t.viberId);\n return {\n id: t.id,\n viberId: t.viberId,\n viberName: connectedViber?.name ?? t.viberId,\n goal: t.goal,\n status: t.status,\n createdAt: t.createdAt.toISOString(),\n completedAt: t.completedAt?.toISOString(),\n eventCount: t.events.length,\n partialText: t.partialText,\n isConnected: !!connectedViber,\n };\n });\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ tasks }));\n }\n\n async handleCreateTask(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n try {\n const {\n goal,\n viberId: requestedViberId,\n messages,\n environment,\n settings,\n oauthTokens,\n model,\n } = await readJsonBody(req);\n\n if (!goal) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Missing goal\" }));\n return;\n }\n\n // Find viber (use specified or first available)\n const vibers = this.getVibers();\n let connectedViber: ConnectedViber | undefined;\n if (requestedViberId) {\n connectedViber = vibers.get(requestedViberId);\n } else {\n connectedViber = vibers.values().next().value;\n }\n\n if (!connectedViber) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"No viber available\" }));\n return;\n }\n\n // Create task\n const taskId = randomUUID();\n const task: GatewayTask = {\n id: taskId,\n viberId: connectedViber.id,\n goal,\n status: \"pending\",\n createdAt: new Date(),\n events: [],\n partialText: \"\",\n streamChunks: [],\n streamBytes: 0,\n };\n this.tasks.set(taskId, task);\n\n // Tell the viber daemon to prepare and run this task\n connectedViber.ws.send(\n JSON.stringify({\n type: \"task:create\",\n taskId,\n goal,\n messages,\n environment,\n settings,\n oauthTokens,\n options: model ? { model } : undefined,\n }),\n );\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ taskId }));\n } catch (error) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid request body\" }));\n }\n }\n\n handleGetTask(\n _req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>,\n ): void {\n const taskId = params.id;\n const task = this.tasks.get(taskId);\n\n if (!task) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Task not found\" }));\n return;\n }\n\n // Include viber info for connectivity\n const connectedViber = this.getVibers().get(task.viberId);\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: task.id,\n viberId: task.viberId,\n viberName: connectedViber?.name ?? task.viberId,\n goal: task.goal,\n status: task.status,\n result: task.result,\n error: task.error,\n createdAt: task.createdAt.toISOString(),\n completedAt: task.completedAt?.toISOString(),\n events: task.events,\n eventCount: task.events.length,\n partialText: task.partialText,\n isConnected: !!connectedViber,\n }),\n );\n }\n\n async handleSendMessage(\n req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>,\n ): Promise<void> {\n const taskId = params.id;\n const task = this.tasks.get(taskId);\n if (!task) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Task not found\" }));\n return;\n }\n\n const connectedViber = this.getVibers().get(task.viberId);\n if (!connectedViber) {\n res.writeHead(503, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Viber not connected\" }));\n return;\n }\n\n try {\n const { messages, goal, environment, settings, oauthTokens, model } =\n await readJsonBody(req);\n\n // Reset task state for the new message\n task.status = \"pending\";\n task.completedAt = undefined;\n task.result = undefined;\n task.error = undefined;\n task.events = [];\n task.partialText = \"\";\n task.streamChunks = [];\n task.streamBytes = 0;\n if (goal) task.goal = goal;\n\n // Close old stream subscribers so the new request gets a fresh stream\n this.closeStreamSubscribers(taskId);\n\n // Send message to the viber daemon\n connectedViber.ws.send(\n JSON.stringify({\n type: \"task:create\",\n taskId,\n goal: goal || task.goal,\n messages,\n environment,\n settings,\n oauthTokens,\n options: model ? { model } : undefined,\n }),\n );\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ taskId }));\n } catch (error) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid request body\" }));\n }\n }\n\n handleStopTask(\n _req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>,\n ): void {\n const taskId = params.id;\n const task = this.tasks.get(taskId);\n\n if (!task) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Task not found\" }));\n return;\n }\n\n const connectedViber = this.getVibers().get(task.viberId);\n if (connectedViber) {\n connectedViber.ws.send(\n JSON.stringify({ type: \"task:stop\", taskId }),\n );\n }\n\n task.status = \"stopped\";\n task.completedAt = new Date();\n\n // Close any SSE stream subscribers for this task\n this.closeStreamSubscribers(taskId);\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n }\n\n handleStreamTask(\n req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>,\n ): void {\n const taskId = params.id;\n const task = this.tasks.get(taskId);\n if (!task) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Task not found\" }));\n return;\n }\n\n // Set SSE headers with AI SDK stream protocol marker\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"x-vercel-ai-ui-message-stream\": \"v1\",\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Expose-Headers\": \"x-vercel-ai-ui-message-stream\",\n });\n\n // Replay stream chunks that were emitted before this SSE subscriber connected.\n for (const chunk of task.streamChunks) {\n res.write(chunk);\n }\n\n // If task is already completed/error/stopped, replay and close immediately.\n if (\n task.status === \"completed\" ||\n task.status === \"error\" ||\n task.status === \"stopped\"\n ) {\n res.end();\n return;\n }\n\n // Register as an active subscriber for live chunks.\n if (!this.streamSubscribers.has(taskId)) {\n this.streamSubscribers.set(taskId, []);\n }\n const subs = this.streamSubscribers.get(taskId)!;\n subs.push(res);\n\n // Handle client disconnect\n req.on(\"close\", () => {\n const idx = subs.indexOf(res);\n if (idx >= 0) subs.splice(idx, 1);\n if (subs.length === 0) this.streamSubscribers.delete(taskId);\n });\n }\n\n // ==================== WebSocket Message Handlers ====================\n\n handleTaskStarted(taskId: string): void {\n const task = this.tasks.get(taskId);\n if (task) {\n task.status = \"running\";\n console.log(`[Gateway] Task started: ${taskId}`);\n }\n }\n\n handleTaskCompleted(taskId: string, result: any): void {\n const task = this.tasks.get(taskId);\n if (task) {\n task.status = \"completed\";\n task.result = result;\n task.completedAt = new Date();\n if (typeof result?.text === \"string\") {\n task.partialText = result.text;\n }\n console.log(`[Gateway] Task completed: ${taskId}`);\n\n // Close SSE stream subscribers\n this.closeStreamSubscribers(taskId);\n }\n }\n\n handleTaskProgress(taskId: string, event: any): void {\n const task = this.tasks.get(taskId);\n if (!task) return;\n\n const envelope = this.normalizeProgressEvent(taskId, event);\n\n task.events.push({ at: envelope.createdAt, event: envelope });\n if (task.events.length > 500) {\n task.events.shift();\n }\n\n if (\n envelope.event?.kind === \"text-delta\" &&\n typeof envelope.event?.delta === \"string\"\n ) {\n task.partialText = (task.partialText || \"\") + envelope.event.delta;\n if (task.partialText.length > 20000) {\n task.partialText = task.partialText.slice(-20000);\n }\n }\n }\n\n handleTaskError(taskId: string, error: string, model?: string): void {\n const task = this.tasks.get(taskId);\n if (task) {\n task.status = \"error\";\n task.error = error;\n task.completedAt = new Date();\n console.log(\n `[Gateway] Task error: ${taskId} - ${error}${model ? ` (model: ${model})` : \"\"}`,\n );\n\n // Push an error event so it appears in the /api/events stream (and Logs page)\n const now = new Date().toISOString();\n task.events.push({\n at: now,\n event: {\n kind: \"error\",\n message: error,\n model: model ?? undefined,\n phase: \"execution\",\n },\n });\n\n // Close SSE stream subscribers\n this.closeStreamSubscribers(taskId);\n }\n }\n\n handleStreamChunk(taskId: string, chunk: string): void {\n const task = this.tasks.get(taskId);\n if (!task) return;\n\n // Buffer chunks on the task so late subscribers can replay the stream.\n task.streamChunks.push(chunk);\n task.streamBytes += Buffer.byteLength(chunk);\n while (\n task.streamChunks.length > 0 &&\n task.streamBytes > MAX_STREAM_BUFFER_BYTES\n ) {\n const removed = task.streamChunks.shift();\n if (removed) {\n task.streamBytes -= Buffer.byteLength(removed);\n }\n }\n\n const subs = this.streamSubscribers.get(taskId) || [];\n for (const sub of subs) {\n if (!sub.writableEnded) {\n sub.write(chunk);\n }\n }\n }\n\n // ==================== Internal Helpers ====================\n\n private normalizeProgressEvent(\n taskId: string,\n payload: any,\n ): TaskProgressEnvelope {\n const now = new Date().toISOString();\n if (\n payload &&\n typeof payload === \"object\" &&\n \"eventId\" in payload &&\n \"sequence\" in payload &&\n \"event\" in payload\n ) {\n return payload as TaskProgressEnvelope;\n }\n\n return {\n eventId: `${taskId}-legacy-${Date.now()}`,\n sequence: 0,\n taskId,\n conversationId: taskId,\n createdAt: now,\n event: payload || {},\n };\n }\n\n closeStreamSubscribers(taskId: string): void {\n const subs = this.streamSubscribers.get(taskId);\n if (subs) {\n for (const sub of subs) {\n if (!sub.writableEnded) {\n sub.end();\n }\n }\n this.streamSubscribers.delete(taskId);\n }\n }\n}\n","/**\n * Viber Manager — manages connected viber daemons over WebSocket.\n *\n * Handles connection lifecycle, heartbeat, status, config push,\n * skill provisioning, and job push for connected vibers.\n */\n\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport type { WebSocket } from \"ws\";\nimport { readJsonBody } from \"../utils/router\";\nimport type { ViberSystemStatus } from \"./types\";\nimport type {\n ConnectedViber,\n SystemEvent,\n JobEntry,\n} from \"./types\";\nimport type { TaskManager } from \"./tasks\";\n\nexport interface ViberManagerDeps {\n pushSystemEvent: (evt: Omit<SystemEvent, \"at\" | \"category\">) => void;\n taskManager: TaskManager;\n webApiUrl?: string;\n webApiToken?: string;\n}\n\nexport class ViberManager {\n readonly vibers: Map<string, ConnectedViber> = new Map();\n /** In-flight skill provisioning requests waiting for viber replies */\n private pendingSkillProvisionResolvers: Map<\n string,\n { resolve: (payload: any) => void; timeout: NodeJS.Timeout }\n > = new Map();\n\n constructor(private deps: ViberManagerDeps) { }\n\n // ==================== HTTP Handlers ====================\n\n handleListVibers(_req: IncomingMessage, res: ServerResponse): void {\n const vibers = Array.from(this.vibers.values()).map((n) => ({\n id: n.id,\n name: n.name,\n version: n.version,\n platform: n.platform,\n capabilities: n.capabilities,\n skills: n.skills,\n connectedAt: n.connectedAt.toISOString(),\n lastHeartbeat: n.lastHeartbeat.toISOString(),\n runningVibers: n.runningVibers,\n // Enriched observability data from heartbeats\n machine: n.machineStatus\n ? {\n hostname: n.machineStatus.hostname,\n arch: n.machineStatus.arch,\n systemUptimeSeconds: n.machineStatus.systemUptimeSeconds,\n cpu: {\n cores: n.machineStatus.cpu.cores,\n averageUsage: n.machineStatus.cpu.averageUsage,\n },\n memory: {\n totalBytes: n.machineStatus.memory.totalBytes,\n usedBytes: n.machineStatus.memory.usedBytes,\n usagePercent: n.machineStatus.memory.usagePercent,\n },\n loadAverage: n.machineStatus.loadAverage,\n }\n : undefined,\n viber: n.viberStatus\n ? {\n daemonUptimeSeconds: n.viberStatus.daemonUptimeSeconds,\n runningTaskCount: n.viberStatus.runningTaskCount,\n totalTasksExecuted: n.viberStatus.totalTasksExecuted,\n processMemory: n.viberStatus.processMemory,\n }\n : undefined,\n }));\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ connected: true, vibers }));\n }\n\n handleGetViberStatus(\n _req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>,\n ): void {\n const viberId = params.id;\n const connectedViber = this.vibers.get(viberId);\n if (!connectedViber) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Viber not found or not connected\" }));\n return;\n }\n\n // If we have recent heartbeat data (within 60s), combine and return it\n const heartbeatAge = Date.now() - connectedViber.lastHeartbeat.getTime();\n\n if (\n connectedViber.machineStatus &&\n connectedViber.viberStatus &&\n heartbeatAge < 60_000 &&\n connectedViber.viberStatus.skillHealth\n ) {\n const status: ViberSystemStatus = {\n machine: connectedViber.machineStatus,\n viber: connectedViber.viberStatus,\n };\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ viberId, status, source: \"heartbeat-cache\" }));\n return;\n }\n\n // Request fresh status from the viber with a timeout\n if (!connectedViber.pendingStatusResolvers) {\n connectedViber.pendingStatusResolvers = [];\n }\n\n const timeout = setTimeout(() => {\n const idx = connectedViber.pendingStatusResolvers?.indexOf(resolver);\n if (idx !== undefined && idx >= 0) {\n connectedViber.pendingStatusResolvers?.splice(idx, 1);\n }\n\n if (connectedViber.machineStatus || connectedViber.viberStatus) {\n const status: Partial<ViberSystemStatus> = {};\n if (connectedViber.machineStatus)\n status.machine = connectedViber.machineStatus;\n if (connectedViber.viberStatus)\n status.viber = connectedViber.viberStatus;\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({ viberId, status, source: \"heartbeat-stale\" }),\n );\n } else {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n viberId,\n status: null,\n source: \"unavailable\",\n message: \"Viber has not reported status yet\",\n }),\n );\n }\n }, 5_000);\n\n const resolver = (status: ViberSystemStatus) => {\n clearTimeout(timeout);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ viberId, status, source: \"live\" }));\n };\n\n connectedViber.pendingStatusResolvers.push(resolver);\n connectedViber.ws.send(JSON.stringify({ type: \"status:request\" }));\n }\n\n async handlePushJobToViber(\n req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>,\n ): Promise<void> {\n const viberId = params.id;\n const connectedViber = this.vibers.get(viberId);\n if (!connectedViber) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Viber not found or not connected\" }));\n return;\n }\n\n try {\n const config = await readJsonBody(req);\n const { name, schedule, prompt, description, model } = config;\n if (!name || !schedule || !prompt) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: \"Missing required fields: name, schedule, prompt\",\n }),\n );\n return;\n }\n const message = {\n type: \"job:create\",\n name: String(name).trim(),\n schedule: String(schedule).trim(),\n prompt: String(prompt).trim(),\n ...(description != null && {\n description: String(description).trim(),\n }),\n ...(model != null && { model: String(model).trim() }),\n ...(config.viberId != null && {\n viberId: String(config.viberId).trim(),\n }),\n };\n connectedViber.ws.send(JSON.stringify(message));\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true, message: \"Job pushed to viber\" }));\n } catch (err) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: err instanceof Error ? err.message : \"Invalid JSON body\",\n }),\n );\n }\n }\n\n async handleProvisionViberSkill(\n req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>,\n ): Promise<void> {\n const viberId = params.id;\n const connectedViber = this.vibers.get(viberId);\n if (!connectedViber) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Viber not found or not connected\" }));\n return;\n }\n\n let requestId = \"\";\n try {\n const parsed = await readJsonBody(req);\n const skillId = String(parsed.skillId || \"\").trim();\n if (!skillId) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Missing skillId\" }));\n return;\n }\n\n requestId = String(\n parsed.requestId ||\n `skill-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n );\n const authAction =\n parsed.authAction === \"none\" ||\n parsed.authAction === \"copy\" ||\n parsed.authAction === \"start\"\n ? parsed.authAction\n : \"copy\";\n\n const timeout = setTimeout(() => {\n this.pendingSkillProvisionResolvers.delete(requestId);\n if (!res.writableEnded) {\n res.writeHead(504, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: \"Timed out waiting for viber skill provisioning result\",\n requestId,\n skillId,\n }),\n );\n }\n }, 90_000);\n\n this.pendingSkillProvisionResolvers.set(requestId, {\n timeout,\n resolve: (payload: any) => {\n if (res.writableEnded) return;\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(payload));\n },\n });\n\n connectedViber.ws.send(\n JSON.stringify({\n type: \"skill:provision\",\n requestId,\n skillId,\n install: parsed.install !== false,\n authAction,\n }),\n );\n } catch (error) {\n if (requestId) {\n const pending =\n this.pendingSkillProvisionResolvers.get(requestId);\n if (pending) {\n clearTimeout(pending.timeout);\n this.pendingSkillProvisionResolvers.delete(requestId);\n }\n }\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error:\n error instanceof Error ? error.message : \"Invalid JSON body\",\n }),\n );\n }\n }\n\n handleConfigPush(\n _req: IncomingMessage,\n res: ServerResponse,\n params: Record<string, string>,\n ): void {\n const viberId = params.id;\n const connectedViber = this.vibers.get(viberId);\n if (!connectedViber) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Viber not found or not connected\" }));\n return;\n }\n\n try {\n connectedViber.ws.send(JSON.stringify({ type: \"config:push\" }));\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({ ok: true, message: \"Config push sent to viber\" }),\n );\n } catch (error) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error:\n error instanceof Error\n ? error.message\n : \"Failed to push config\",\n }),\n );\n }\n }\n\n // ==================== WebSocket Lifecycle ====================\n\n handleViberConnection(ws: WebSocket, req: IncomingMessage): void {\n const viberId = req.headers[\"x-viber-id\"] as string;\n console.log(`[Gateway] Viber connecting: ${viberId || \"unknown\"}`);\n\n ws.on(\"message\", (data) => {\n try {\n const msg = JSON.parse(data.toString());\n this.handleViberMessage(ws, msg);\n } catch (error) {\n console.error(\"[Gateway] Failed to parse viber message:\", error);\n }\n });\n\n ws.on(\"close\", () => {\n for (const [id, connectedViber] of this.vibers) {\n if (connectedViber.ws === ws) {\n console.log(`[Gateway] Viber disconnected: ${id}`);\n this.deps.pushSystemEvent({\n component: \"viber\",\n level: \"warn\",\n message: `Viber disconnected: ${connectedViber.name}`,\n viberId: id,\n viberName: connectedViber.name,\n });\n this.vibers.delete(id);\n break;\n }\n }\n });\n\n ws.on(\"error\", (error) => {\n console.error(\"[Gateway] Viber WebSocket error:\", error);\n });\n }\n\n private handleViberMessage(ws: WebSocket, msg: any): void {\n const tm = this.deps.taskManager;\n switch (msg.type) {\n case \"connected\":\n this.handleViberConnected(ws, msg.viber);\n break;\n\n case \"viber:started\":\n case \"task:started\":\n tm.handleTaskStarted(msg.viberId || msg.taskId);\n break;\n\n case \"viber:progress\":\n case \"task:progress\":\n tm.handleTaskProgress(msg.viberId || msg.taskId, msg.event);\n break;\n\n case \"viber:stream-chunk\":\n case \"task:stream-chunk\":\n tm.handleStreamChunk(msg.viberId || msg.taskId, msg.chunk);\n break;\n\n case \"viber:completed\":\n case \"task:completed\":\n tm.handleTaskCompleted(msg.viberId || msg.taskId, msg.result);\n break;\n\n case \"viber:error\":\n case \"task:error\":\n tm.handleTaskError(\n msg.viberId || msg.taskId,\n msg.error,\n msg.model,\n );\n break;\n\n case \"heartbeat\":\n this.handleHeartbeat(ws, msg.status);\n break;\n\n case \"pong\":\n this.handleHeartbeat(ws);\n break;\n\n case \"jobs:list\":\n this.handleViberJobsList(ws, msg.jobs);\n break;\n\n case \"status:report\":\n this.handleStatusReport(ws, msg.status);\n break;\n\n case \"skill:provision-result\":\n this.handleSkillProvisionResult(msg);\n break;\n\n case \"config:ack\":\n this.handleConfigAck(ws, msg.configVersion, msg.validations);\n break;\n\n default:\n console.log(`[Gateway] Unknown message type: ${msg.type}`);\n }\n }\n\n private handleViberConnected(ws: WebSocket, viberInfo: any): void {\n console.log(\n `[Gateway] Viber registered: ${viberInfo.id} (${viberInfo.name})`,\n );\n\n this.vibers.set(viberInfo.id, {\n id: viberInfo.id,\n name: viberInfo.name,\n version: viberInfo.version,\n platform: viberInfo.platform,\n capabilities: viberInfo.capabilities || [],\n skills: viberInfo.skills,\n ws,\n connectedAt: new Date(),\n lastHeartbeat: new Date(),\n runningVibers: viberInfo.runningTasks || [],\n jobs: [],\n });\n\n this.deps.pushSystemEvent({\n component: \"viber\",\n level: \"info\",\n message: `Viber connected: ${viberInfo.name}`,\n viberId: viberInfo.id,\n viberName: viberInfo.name,\n metadata: {\n version: viberInfo.version,\n platform: viberInfo.platform,\n capabilities: viberInfo.capabilities,\n skillCount: viberInfo.skills?.length ?? 0,\n },\n });\n }\n\n private handleHeartbeat(ws: WebSocket, heartbeatStatus?: any): void {\n for (const connectedViber of this.vibers.values()) {\n if (connectedViber.ws === ws) {\n connectedViber.lastHeartbeat = new Date();\n\n if (heartbeatStatus) {\n if (heartbeatStatus.machine) {\n connectedViber.machineStatus = heartbeatStatus.machine;\n }\n if (heartbeatStatus.viberStatus) {\n connectedViber.viberStatus = heartbeatStatus.viberStatus;\n }\n if (heartbeatStatus.skills) {\n connectedViber.skills = heartbeatStatus.skills;\n }\n }\n\n break;\n }\n }\n }\n\n private handleStatusReport(\n ws: WebSocket,\n status: ViberSystemStatus,\n ): void {\n for (const connectedViber of this.vibers.values()) {\n if (connectedViber.ws === ws) {\n connectedViber.lastHeartbeat = new Date();\n\n if (status.machine) {\n connectedViber.machineStatus = status.machine;\n }\n if (status.viber) {\n connectedViber.viberStatus = status.viber;\n }\n\n if (\n connectedViber.pendingStatusResolvers &&\n connectedViber.pendingStatusResolvers.length > 0\n ) {\n for (const resolver of connectedViber.pendingStatusResolvers) {\n resolver(status);\n }\n connectedViber.pendingStatusResolvers = [];\n }\n\n break;\n }\n }\n }\n\n private handleSkillProvisionResult(msg: any): void {\n const requestId = String(msg?.requestId || \"\").trim();\n if (!requestId) return;\n const pending = this.pendingSkillProvisionResolvers.get(requestId);\n if (!pending) return;\n\n clearTimeout(pending.timeout);\n this.pendingSkillProvisionResolvers.delete(requestId);\n pending.resolve(msg);\n }\n\n private handleViberJobsList(ws: WebSocket, jobs: JobEntry[]): void {\n for (const connectedViber of this.vibers.values()) {\n if (connectedViber.ws === ws) {\n connectedViber.jobs = Array.isArray(jobs) ? jobs : [];\n console.log(\n `[Gateway] Viber ${connectedViber.id} reported ${connectedViber.jobs.length} job(s)`,\n );\n break;\n }\n }\n }\n\n private handleConfigAck(\n ws: WebSocket,\n configVersion: string,\n validations: Array<{\n category: string;\n status: string;\n message?: string;\n checkedAt: string;\n }>,\n ): void {\n for (const connectedViber of this.vibers.values()) {\n if (connectedViber.ws === ws) {\n console.log(\n `[Gateway] Viber ${connectedViber.id} acknowledged config push: version=${configVersion}, validations=${validations.length}`,\n );\n\n // Persist config sync state to Supabase via web API\n const webApiUrl =\n this.deps.webApiUrl || process.env.OPENVIBER_WEB_API_URL;\n const webApiToken =\n this.deps.webApiToken || process.env.VIBER_GATEWAY_API_TOKEN;\n\n if (webApiUrl && webApiToken) {\n const syncState = {\n configVersion,\n lastConfigPullAt: new Date().toISOString(),\n validations,\n };\n\n fetch(\n `${webApiUrl}/api/vibers/${encodeURIComponent(connectedViber.id)}/config-sync-state`,\n {\n method: \"PUT\",\n headers: {\n Authorization: `Bearer ${webApiToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ config_sync_state: syncState }),\n },\n ).catch((error) => {\n console.error(\n `[Gateway] Failed to persist config sync state for viber ${connectedViber.id}:`,\n error,\n );\n });\n } else {\n console.warn(\n `[Gateway] Cannot persist config sync state: web API URL or token not configured`,\n );\n }\n\n break;\n }\n }\n }\n\n /** Clean up on shutdown */\n shutdown(): void {\n for (const connectedViber of this.vibers.values()) {\n connectedViber.ws.close();\n }\n this.vibers.clear();\n for (const pending of this.pendingSkillProvisionResolvers.values()) {\n clearTimeout(pending.timeout);\n }\n this.pendingSkillProvisionResolvers.clear();\n }\n}\n","/**\n * Event Manager — system event ring buffer, health, and unified event feed.\n */\n\nimport type { IncomingMessage, ServerResponse } from \"http\";\nimport { URL } from \"url\";\nimport type { SystemEvent, ConnectedViber, GatewayTask } from \"./types\";\n\nconst MAX_SYSTEM_EVENTS = 200;\n\nexport class EventManager {\n private systemEvents: SystemEvent[] = [];\n\n constructor(\n private getVibers: () => Map<string, ConnectedViber>,\n private getTasks: () => Map<string, GatewayTask>,\n ) { }\n\n pushSystemEvent(evt: Omit<SystemEvent, \"at\" | \"category\">): void {\n this.systemEvents.push({\n ...evt,\n at: new Date().toISOString(),\n category: \"system\",\n });\n if (this.systemEvents.length > MAX_SYSTEM_EVENTS) {\n this.systemEvents.shift();\n }\n }\n\n handleHealth(_req: IncomingMessage, res: ServerResponse): void {\n const vibers = this.getVibers();\n const tasks = this.getTasks();\n\n const vibersSummary = Array.from(vibers.values()).map((n) => {\n const heartbeatAgeMs = Date.now() - n.lastHeartbeat.getTime();\n const isHealthy = heartbeatAgeMs < 90_000;\n\n return {\n id: n.id,\n name: n.name,\n healthy: isHealthy,\n heartbeatAgeMs,\n runningVibers: n.runningVibers.length,\n cpu: n.machineStatus?.cpu.averageUsage,\n memoryUsagePercent: n.machineStatus?.memory.usagePercent,\n };\n });\n\n const totalRunningTasks = tasks.size;\n const healthyVibers = vibersSummary.filter((n) => n.healthy).length;\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n status: \"ok\",\n healthyVibers,\n tasks: totalRunningTasks,\n vibersSummary,\n }),\n );\n }\n\n handleListEvents(req: IncomingMessage, res: ServerResponse): void {\n const url = new URL(\n req.url || \"/\",\n `http://${req.headers.host || \"localhost\"}`,\n );\n const limit = Math.min(\n parseInt(url.searchParams.get(\"limit\") || \"200\", 10),\n 1000,\n );\n const since = url.searchParams.get(\"since\");\n const sinceMs = since ? new Date(since).getTime() : 0;\n\n // Collect task activity events\n const activityEvents: Array<{\n at: string;\n category: \"activity\";\n taskId: string;\n goal: string;\n taskStatus: string;\n event: any;\n }> = [];\n\n for (const [id, task] of this.getTasks()) {\n for (const evt of task.events) {\n if (sinceMs && new Date(evt.at).getTime() <= sinceMs) continue;\n activityEvents.push({\n at: evt.at,\n category: \"activity\",\n taskId: id,\n goal: task.goal,\n taskStatus: task.status,\n event: evt.event,\n });\n }\n }\n\n // Collect system events\n const systemEvents = sinceMs\n ? this.systemEvents.filter(\n (e) => new Date(e.at).getTime() > sinceMs,\n )\n : [...this.systemEvents];\n\n // Merge and sort descending\n const allEvents = [\n ...activityEvents.map((e) => ({ ...e }) as Record<string, unknown>),\n ...systemEvents.map((e) => ({ ...e }) as Record<string, unknown>),\n ];\n allEvents.sort(\n (a, b) =>\n new Date(b.at as string).getTime() -\n new Date(a.at as string).getTime(),\n );\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ events: allEvents.slice(0, limit) }));\n }\n\n handleListAllJobs(_req: IncomingMessage, res: ServerResponse): void {\n const viberJobs = Array.from(this.getVibers().values()).map((n) => ({\n viberId: n.id,\n viberName: n.name,\n jobs: n.jobs.map((j) => ({\n name: j.name,\n description: j.description,\n schedule: j.schedule,\n prompt: j.prompt,\n model: j.model,\n viberId: j.viberId,\n })),\n }));\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ viberJobs }));\n }\n}\n","/**\n * Skills Manager — handles skill-related API endpoints\n *\n * Provides REST API endpoints for:\n * - Listing all skills with health status\n * - Getting health details for a specific skill\n */\n\nimport type { IncomingMessage as Request, ServerResponse as Response } from \"http\";\nimport { getSkillHealthReport, type SkillHealthResult } from \"../skills/health\";\nimport { defaultRegistry } from \"../skills/registry\";\n\nexport class SkillsManager {\n /**\n * GET /api/skills - List all skills with health status\n */\n async handleListSkills(req: Request, res: Response): Promise<void> {\n try {\n // Ensure skills are loaded\n await defaultRegistry.loadAll();\n\n // Get health report for all skills\n const report = await getSkillHealthReport();\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(report));\n } catch (error: any) {\n console.error(\"[SkillsManager] Error listing skills:\", error);\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: error?.message || \"Failed to list skills\" }));\n }\n }\n\n /**\n * GET /api/skills/:id - Get details for a specific skill\n */\n async handleGetSkill(req: Request, res: Response, skillId: string): Promise<void> {\n try {\n // Load the skill\n await defaultRegistry.loadAll();\n const skill = defaultRegistry.getSkill(skillId);\n\n if (!skill) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: `Skill '${skillId}' not found` }));\n return;\n }\n\n // Get health details\n const { checkSkillHealth } = await import(\"../skills/health\");\n const health = await checkSkillHealth({\n id: skill.id,\n name: skill.metadata.name || skill.id,\n description: skill.metadata.description,\n });\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n id: skill.id,\n metadata: skill.metadata,\n health,\n })\n );\n } catch (error: any) {\n console.error(`[SkillsManager] Error getting skill '${skillId}':`, error);\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: error?.message || \"Failed to get skill\" }));\n }\n }\n}\n","/**\n * Gateway Server — Central coordinator for vibers\n *\n * The gateway accepts WebSocket connections from viber daemons and provides\n * a REST API for the Viber Board web app to manage them.\n *\n * REST API (for Viber Board):\n * GET /health - Health check\n * GET /api/vibers - List connected vibers\n * GET /api/vibers/:id/status - Viber observability status\n * POST /api/vibers/:id/job - Push a job to a viber\n * POST /api/vibers/:id/config-push - Push config to a viber\n * POST /api/vibers/:id/skills/provision - Provision a skill on a viber\n * GET /api/skills - List all skills with health status\n * GET /api/jobs - List all jobs across vibers\n * GET /api/events - Unified event stream (activity + system)\n * GET /api/tasks - List all tasks\n * POST /api/tasks - Create a new task on a viber\n * GET /api/tasks/:id - Get task details\n * POST /api/tasks/:id/message - Send a message to a task\n * POST /api/tasks/:id/stop - Stop a task\n * GET /api/tasks/:id/stream - SSE stream for task output\n *\n * WebSocket (for viber daemons):\n * ws://localhost:6009/ws - Viber daemon connection endpoint\n */\n\nimport { createServer } from \"http\";\nimport { WebSocketServer } from \"ws\";\nimport { Router } from \"../utils/router\";\nimport type { GatewayConfig } from \"./types\";\nimport { TaskManager } from \"./tasks\";\nimport { ViberManager } from \"./vibers\";\nimport { EventManager } from \"./events\";\nimport { SkillsManager } from \"./skills\";\n\nexport type { GatewayConfig } from \"./types\";\n\nexport class GatewayServer {\n private server: ReturnType<typeof createServer> | null = null;\n private wss: WebSocketServer | null = null;\n private router = new Router();\n\n private eventManager: EventManager;\n private taskManager: TaskManager;\n private viberManager: ViberManager;\n private skillsManager: SkillsManager;\n\n constructor(private config: GatewayConfig) {\n // Wire up managers with cross-references\n this.taskManager = new TaskManager(\n () => this.viberManager.vibers,\n );\n\n this.eventManager = new EventManager(\n () => this.viberManager.vibers,\n () => this.taskManager.tasks,\n );\n\n this.viberManager = new ViberManager({\n pushSystemEvent: (evt) => this.eventManager.pushSystemEvent(evt),\n taskManager: this.taskManager,\n webApiUrl: config.webApiUrl,\n webApiToken: config.webApiToken,\n });\n\n this.skillsManager = new SkillsManager();\n\n this.setupRoutes();\n }\n\n private setupRoutes(): void {\n this.router.get(\"/health\", this.eventManager.handleHealth.bind(this.eventManager));\n\n this.router.get(\"/api/vibers\", this.viberManager.handleListVibers.bind(this.viberManager));\n this.router.get(\"/api/vibers/:id/status\", this.viberManager.handleGetViberStatus.bind(this.viberManager));\n this.router.post(\"/api/vibers/:id/job\", this.viberManager.handlePushJobToViber.bind(this.viberManager));\n this.router.post(\"/api/vibers/:id/config-push\", this.viberManager.handleConfigPush.bind(this.viberManager));\n this.router.post(\"/api/vibers/:id/skills/provision\", this.viberManager.handleProvisionViberSkill.bind(this.viberManager));\n\n this.router.get(\"/api/skills\", this.skillsManager.handleListSkills.bind(this.skillsManager));\n this.router.get(\"/api/skills/:id\", (req, res) => {\n const id = (req as any).params?.id || \"\";\n this.skillsManager.handleGetSkill(req, res, id);\n });\n\n this.router.get(\"/api/jobs\", this.eventManager.handleListAllJobs.bind(this.eventManager));\n this.router.get(\"/api/events\", this.eventManager.handleListEvents.bind(this.eventManager));\n\n this.router.get(\"/api/tasks\", this.taskManager.handleListTasks.bind(this.taskManager));\n this.router.post(\"/api/tasks\", this.taskManager.handleCreateTask.bind(this.taskManager));\n this.router.get(\"/api/tasks/:id\", this.taskManager.handleGetTask.bind(this.taskManager));\n this.router.post(\"/api/tasks/:id/message\", this.taskManager.handleSendMessage.bind(this.taskManager));\n this.router.post(\"/api/tasks/:id/stop\", this.taskManager.handleStopTask.bind(this.taskManager));\n this.router.get(\"/api/tasks/:id/stream\", this.taskManager.handleStreamTask.bind(this.taskManager));\n }\n\n async start(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.server = createServer((req, res) => this.router.handle(req, res));\n\n this.server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n console.error(`[Gateway] Port ${this.config.port} is already in use.`);\n console.error(\n `[Gateway] Kill the existing process with: lsof -ti :${this.config.port} | xargs kill`,\n );\n reject(err);\n } else {\n reject(err);\n }\n });\n\n this.wss = new WebSocketServer({ noServer: true });\n\n this.server.on(\"upgrade\", (request, socket, head) => {\n if (request.url === \"/ws\") {\n this.wss!.handleUpgrade(request, socket, head, (ws) => {\n this.wss!.emit(\"connection\", ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n this.wss.on(\"connection\", (ws, req) => {\n this.viberManager.handleViberConnection(ws, req);\n });\n\n this.server.listen(this.config.port, () => {\n console.log(`[Gateway] Server listening on port ${this.config.port}`);\n console.log(`[Gateway] REST API: http://localhost:${this.config.port}`);\n console.log(`[Gateway] WebSocket: ws://localhost:${this.config.port}/ws`);\n resolve();\n });\n });\n }\n\n async stop(): Promise<void> {\n this.viberManager.shutdown();\n\n return new Promise((resolve) => {\n if (this.wss) {\n this.wss.close(() => {\n if (this.server) {\n this.server.close(() => {\n console.log(\"[Gateway] Server stopped\");\n resolve();\n });\n } else {\n resolve();\n }\n });\n } else if (this.server) {\n this.server.close(() => {\n console.log(\"[Gateway] Server stopped\");\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n}\n","/**\n * Local WebSocket server for terminal streaming (and other local features).\n * \n * This runs alongside the viber daemon and allows the Viber Board to connect\n * directly for terminal streaming without needing an external hub.\n */\n\nimport { createServer, IncomingMessage, Server } from \"http\";\nimport { WebSocketServer, WebSocket } from \"ws\";\nimport { TerminalManager } from \"./terminal\";\n\nexport interface LocalServerConfig {\n port: number;\n host?: string;\n authToken?: string;\n}\n\nexport class LocalServer {\n private server: Server | null = null;\n private wss: WebSocketServer | null = null;\n private terminalManager = new TerminalManager();\n private clients: Set<WebSocket> = new Set();\n\n constructor(private config: LocalServerConfig) {}\n\n async start(): Promise<void> {\n return new Promise((resolve) => {\n this.server = createServer((req, res) => {\n res.writeHead(404);\n res.end();\n });\n\n this.wss = new WebSocketServer({ noServer: true });\n\n this.server.on(\"upgrade\", (request, socket, head) => {\n if (!this.authenticate(request)) {\n console.log(\"[Viber] Local WS connection rejected: Unauthorized\");\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n\n this.wss!.handleUpgrade(request, socket, head, (ws) => {\n this.wss!.emit(\"connection\", ws, request);\n });\n });\n\n this.server.listen(this.config.port, this.config.host || \"127.0.0.1\", () => {\n console.log(\n `[Viber] Local WebSocket server listening on ${this.config.host || \"127.0.0.1\"}:${this.config.port}`\n );\n resolve();\n });\n\n this.wss.on(\"connection\", (ws) => {\n console.log(\"[Viber] Local client connected\");\n this.clients.add(ws);\n\n ws.on(\"message\", (data) => {\n try {\n const msg = JSON.parse(data.toString());\n this.handleMessage(ws, msg);\n } catch (err) {\n console.error(\"[Viber] Failed to parse message:\", err);\n }\n });\n\n ws.on(\"close\", () => {\n console.log(\"[Viber] Local client disconnected\");\n this.clients.delete(ws);\n });\n\n ws.on(\"error\", (err) => {\n console.error(\"[Viber] WebSocket error:\", err);\n this.clients.delete(ws);\n });\n });\n\n this.wss.on(\"error\", (err) => {\n console.error(\"[Viber] WebSocket server error:\", err);\n });\n });\n }\n\n async stop(): Promise<void> {\n this.terminalManager.detachAll();\n\n for (const ws of this.clients) {\n ws.close();\n }\n this.clients.clear();\n\n return new Promise((resolve) => {\n const closeWss = () => {\n if (this.wss) {\n this.wss.close(() => {\n console.log(\"[Viber] Local WebSocket server stopped\");\n resolve();\n });\n } else {\n resolve();\n }\n };\n\n if (this.server) {\n this.server.close(() => {\n closeWss();\n });\n } else {\n closeWss();\n }\n });\n }\n\n private authenticate(req: IncomingMessage): boolean {\n // 1. Origin check\n const origin = req.headers[\"origin\"];\n if (origin) {\n try {\n const originUrl = new URL(origin);\n if (\n originUrl.hostname !== \"localhost\" &&\n originUrl.hostname !== \"127.0.0.1\"\n ) {\n console.warn(`[Viber] Rejected connection from unauthorized origin: ${origin}`);\n return false;\n }\n } catch (err) {\n return false;\n }\n }\n\n // 2. Token check\n if (!this.config.authToken) return true;\n\n const authHeader = req.headers[\"authorization\"];\n if (authHeader === `Bearer ${this.config.authToken}`) {\n return true;\n }\n\n try {\n const url = new URL(req.url || \"\", `http://${req.headers.host || \"localhost\"}`);\n if (url.searchParams.get(\"token\") === this.config.authToken) {\n return true;\n }\n } catch (err) {\n // ignore\n }\n\n return false;\n }\n\n private handleMessage(ws: WebSocket, msg: any): void {\n switch (msg.type) {\n case \"terminal:list\":\n this.handleTerminalList(ws);\n break;\n\n case \"terminal:attach\":\n this.handleTerminalAttach(ws, msg.target, msg.appId);\n break;\n\n case \"terminal:detach\":\n this.handleTerminalDetach(ws, msg.target, msg.appId);\n break;\n\n case \"terminal:input\":\n this.handleTerminalInput(msg.target, msg.keys, msg.appId);\n break;\n\n case \"terminal:resize\":\n this.handleTerminalResize(ws, msg.target, msg.cols, msg.rows, msg.appId);\n break;\n\n case \"terminal:create-session\":\n this.handleTerminalCreateSession(\n ws,\n msg.sessionName,\n msg.windowName,\n msg.cwd,\n msg.appId\n );\n break;\n\n default:\n console.log(`[Viber] Unknown message type: ${msg.type}`);\n }\n }\n\n private handleTerminalList(ws: WebSocket): void {\n const { apps, sessions, panes } = this.terminalManager.list();\n this.send(ws, { type: \"terminal:list\", apps, sessions, panes });\n }\n\n private async handleTerminalAttach(\n ws: WebSocket,\n target: string,\n appId?: string\n ): Promise<void> {\n console.log(`[Viber] Attaching to terminal: ${target}`);\n const ok = await this.terminalManager.attach(\n target,\n (data) => {\n this.send(ws, { type: \"terminal:output\", target, appId, data });\n },\n () => {\n this.send(ws, { type: \"terminal:detached\", target, appId });\n },\n appId\n );\n this.send(ws, { type: \"terminal:attached\", target, appId, ok });\n }\n\n private handleTerminalDetach(ws: WebSocket, target: string, appId?: string): void {\n console.log(`[Viber] Detaching from terminal: ${target}`);\n this.terminalManager.detach(target, appId);\n this.send(ws, { type: \"terminal:detached\", target, appId });\n }\n\n private handleTerminalInput(target: string, keys: string, appId?: string): void {\n this.terminalManager.sendInput(target, keys, appId);\n }\n\n private handleTerminalResize(\n ws: WebSocket,\n target: string,\n cols: number,\n rows: number,\n appId?: string\n ): void {\n const ok = this.terminalManager.resize(target, cols, rows, appId);\n this.send(ws, { type: \"terminal:resized\", target, appId, ok });\n }\n\n private handleTerminalCreateSession(\n ws: WebSocket,\n sessionName?: string,\n windowName?: string,\n cwd?: string,\n appId = \"tmux\"\n ): void {\n const result = this.terminalManager.createSession(\n sessionName || \"coding\",\n windowName || \"main\",\n cwd,\n appId\n );\n\n this.send(ws, {\n type: \"terminal:session-created\",\n ...result,\n });\n\n if (result.ok) {\n // Keep client in sync immediately after creation\n this.handleTerminalList(ws);\n }\n }\n\n private send(ws: WebSocket, msg: any): void {\n if (ws.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(msg));\n }\n }\n}\n","/**\n * Skill Hub — Explore & Import skills from external sources\n *\n * Supports:\n * - OpenClaw Skill Hub (community registry)\n * - GitHub repositories (tagged with openviber-skill topic)\n * - npm packages (with openviber-skill keyword)\n * - Hugging Face (models/spaces tagged openviber-skill)\n * - Smithery (MCP server registry)\n * - Composio (tool/integration platform)\n * - Glama (MCP server directory)\n */\n\nexport {\n SkillHubManager,\n getSkillHubManager,\n getDefaultSourcesConfig,\n type SkillSourceSettings,\n type SkillSourcesConfig,\n} from \"./manager\";\nexport {\n OpenClawProvider,\n GitHubProvider,\n NpmProvider,\n HuggingFaceProvider,\n SmitheryProvider,\n ComposioProvider,\n GlamaProvider,\n} from \"./providers\";\nexport type {\n ExternalSkillInfo,\n SkillSearchQuery,\n SkillSearchResult,\n SkillImportResult,\n SkillHubProviderConfig,\n SkillHubProvider,\n SkillHubProviderType,\n} from \"./types\";\n","/**\n * Task - Individual execution units within a space\n */\n\nexport enum TaskStatus {\n PENDING = \"pending\",\n RUNNING = \"running\",\n COMPLETED = \"completed\",\n FAILED = \"failed\",\n BLOCKED = \"blocked\",\n CANCELLED = \"cancelled\",\n}\n\nexport interface TaskStep {\n id: string;\n description: string;\n status: TaskStatus;\n startedAt?: Date;\n completedAt?: Date;\n error?: string;\n}\n\nexport interface TaskDependency {\n taskId: string;\n type: \"required\" | \"optional\";\n}\n\nexport class Task {\n public id: string;\n public title: string;\n public description: string;\n public status: TaskStatus;\n public assignedTo?: string;\n public priority: \"low\" | \"medium\" | \"high\";\n public estimatedTime?: string;\n public actualTime?: string;\n public dependencies: TaskDependency[];\n public steps: TaskStep[];\n public tags: string[];\n public metadata: Record<string, any>;\n public createdAt: Date;\n public updatedAt: Date;\n public startedAt?: Date;\n public completedAt?: Date;\n public error?: string;\n\n constructor({\n id,\n title,\n description,\n status = TaskStatus.PENDING,\n assignedTo,\n priority = \"medium\",\n estimatedTime,\n dependencies = [],\n steps = [],\n tags = [],\n metadata = {},\n }: {\n id: string;\n title: string;\n description: string;\n status?: TaskStatus;\n assignedTo?: string;\n priority?: \"low\" | \"medium\" | \"high\";\n estimatedTime?: string;\n dependencies?: TaskDependency[];\n steps?: TaskStep[];\n tags?: string[];\n metadata?: Record<string, any>;\n }) {\n this.id = id;\n this.title = title;\n this.description = description;\n this.status = status;\n this.assignedTo = assignedTo;\n this.priority = priority;\n this.estimatedTime = estimatedTime;\n this.dependencies = dependencies;\n this.steps = steps;\n this.tags = tags;\n this.metadata = metadata;\n this.createdAt = new Date();\n this.updatedAt = new Date();\n }\n\n start(): void {\n if (this.status !== TaskStatus.PENDING) {\n throw new Error(`Cannot start task in ${this.status} status`);\n }\n this.status = TaskStatus.RUNNING;\n this.startedAt = new Date();\n this.updatedAt = new Date();\n }\n\n complete(): void {\n if (this.status !== TaskStatus.RUNNING) {\n throw new Error(`Cannot complete task in ${this.status} status`);\n }\n this.status = TaskStatus.COMPLETED;\n this.completedAt = new Date();\n this.updatedAt = new Date();\n if (this.startedAt) {\n this.actualTime = this.calculateDuration(\n this.startedAt,\n this.completedAt\n );\n }\n }\n\n fail(error: string): void {\n this.status = TaskStatus.FAILED;\n this.error = error;\n this.completedAt = new Date();\n this.updatedAt = new Date();\n }\n\n block(reason: string): void {\n this.status = TaskStatus.BLOCKED;\n this.error = reason;\n this.updatedAt = new Date();\n }\n\n cancel(): void {\n this.status = TaskStatus.CANCELLED;\n this.completedAt = new Date();\n this.updatedAt = new Date();\n }\n\n isActionable(context?: { getTaskStatus: (id: string) => TaskStatus | undefined }): boolean {\n return (\n this.status === TaskStatus.PENDING && !this.hasBlockingDependencies(context)\n );\n }\n\n hasBlockingDependencies(context?: { getTaskStatus: (id: string) => TaskStatus | undefined }): boolean {\n if (!context || !this.dependencies || this.dependencies.length === 0) {\n return false;\n }\n\n return this.dependencies.some((dep) => {\n // Only required dependencies block execution\n if (dep.type === \"optional\") return false;\n\n const status = context.getTaskStatus(dep.taskId);\n // Block if dependency is not completed (or cancelled/failed if strict, but let's say COMPLETED)\n // If status is undefined (task not found), we assume it's missing -> blocking\n return status !== TaskStatus.COMPLETED;\n });\n }\n\n private calculateDuration(start: Date, end: Date): string {\n const ms = end.getTime() - start.getTime();\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n\n toJSON(): any {\n return {\n id: this.id,\n title: this.title,\n description: this.description,\n status: this.status,\n assignedTo: this.assignedTo,\n priority: this.priority,\n estimatedTime: this.estimatedTime,\n actualTime: this.actualTime,\n dependencies: this.dependencies,\n steps: this.steps,\n tags: this.tags,\n metadata: this.metadata,\n createdAt: this.createdAt.toISOString(),\n updatedAt: this.updatedAt.toISOString(),\n startedAt: this.startedAt?.toISOString(),\n completedAt: this.completedAt?.toISOString(),\n error: this.error,\n };\n }\n\n static fromJSON(data: any): Task {\n const task = new Task({\n id: data.id,\n title: data.title,\n description: data.description,\n status: data.status,\n assignedTo: data.assignedTo,\n priority: data.priority,\n estimatedTime: data.estimatedTime,\n dependencies: data.dependencies,\n steps: data.steps,\n tags: data.tags,\n metadata: data.metadata,\n });\n\n task.createdAt = new Date(data.createdAt);\n task.updatedAt = new Date(data.updatedAt);\n task.actualTime = data.actualTime;\n task.error = data.error;\n\n if (data.startedAt) {\n task.startedAt = new Date(data.startedAt);\n }\n if (data.completedAt) {\n task.completedAt = new Date(data.completedAt);\n }\n\n return task;\n }\n}\n","/**\n * Plan - Manages the execution plan for a space\n */\n\nimport { Task, TaskStatus } from \"./task\";\n\nexport interface PlanSummary {\n totalTasks: number;\n completedTasks: number;\n runningTasks: number;\n pendingTasks: number;\n failedTasks: number;\n blockedTasks: number;\n progressPercentage: number;\n}\n\nexport class Plan {\n public tasks: Task[];\n public goal: string;\n public createdAt: Date;\n public updatedAt: Date;\n\n constructor({ tasks = [], goal }: { tasks?: Task[]; goal: string }) {\n this.tasks = tasks;\n this.goal = goal;\n this.createdAt = new Date();\n this.updatedAt = new Date();\n }\n\n addTask(task: Task): void {\n this.tasks.push(task);\n this.updatedAt = new Date();\n }\n\n removeTask(taskId: string): boolean {\n const index = this.tasks.findIndex((t) => t.id === taskId);\n if (index >= 0) {\n this.tasks.splice(index, 1);\n this.updatedAt = new Date();\n return true;\n }\n return false;\n }\n\n getTaskById(taskId: string): Task | undefined {\n return this.tasks.find((t) => t.id === taskId);\n }\n\n updateTaskStatus(taskId: string, status: TaskStatus): boolean {\n const task = this.getTaskById(taskId);\n if (task) {\n task.status = status;\n task.updatedAt = new Date();\n this.updatedAt = new Date();\n return true;\n }\n return false;\n }\n\n getNextActionableTask(): Task | undefined {\n return this.tasks.find((task) =>\n task.isActionable({\n getTaskStatus: (id) => this.getTaskById(id)?.status,\n })\n );\n }\n\n getAllActionableTasks(maxTasks?: number): Task[] {\n const actionableTasks = this.tasks.filter((task) =>\n task.isActionable({\n getTaskStatus: (id) => this.getTaskById(id)?.status,\n })\n );\n return maxTasks ? actionableTasks.slice(0, maxTasks) : actionableTasks;\n }\n\n getTasksByStatus(status: TaskStatus): Task[] {\n return this.tasks.filter((task) => task.status === status);\n }\n\n getTasksByAssignee(assignee: string): Task[] {\n return this.tasks.filter((task) => task.assignedTo === assignee);\n }\n\n isComplete(): boolean {\n return this.tasks.every(\n (task) =>\n task.status === TaskStatus.COMPLETED ||\n task.status === TaskStatus.CANCELLED\n );\n }\n\n hasFailedTasks(): boolean {\n return this.tasks.some((task) => task.status === TaskStatus.FAILED);\n }\n\n hasBlockedTasks(): boolean {\n return this.tasks.some((task) => task.status === TaskStatus.BLOCKED);\n }\n\n getProgressSummary(): PlanSummary {\n const summary: PlanSummary = {\n totalTasks: this.tasks.length,\n completedTasks: 0,\n runningTasks: 0,\n pendingTasks: 0,\n failedTasks: 0,\n blockedTasks: 0,\n progressPercentage: 0,\n };\n\n for (const task of this.tasks) {\n switch (task.status) {\n case TaskStatus.COMPLETED:\n summary.completedTasks++;\n break;\n case TaskStatus.RUNNING:\n summary.runningTasks++;\n break;\n case TaskStatus.PENDING:\n summary.pendingTasks++;\n break;\n case TaskStatus.FAILED:\n summary.failedTasks++;\n break;\n case TaskStatus.BLOCKED:\n summary.blockedTasks++;\n break;\n }\n }\n\n if (summary.totalTasks > 0) {\n summary.progressPercentage =\n (summary.completedTasks / summary.totalTasks) * 100;\n }\n\n return summary;\n }\n\n reorderTasks(fromIndex: number, toIndex: number): void {\n if (\n fromIndex < 0 ||\n fromIndex >= this.tasks.length ||\n toIndex < 0 ||\n toIndex >= this.tasks.length\n ) {\n throw new Error(\"Invalid task indices\");\n }\n\n const [task] = this.tasks.splice(fromIndex, 1);\n this.tasks.splice(toIndex, 0, task);\n this.updatedAt = new Date();\n }\n\n toJSON(): any {\n return {\n tasks: this.tasks.map((task) => task.toJSON()),\n goal: this.goal,\n createdAt: this.createdAt.toISOString(),\n updatedAt: this.updatedAt.toISOString(),\n };\n }\n\n static fromJSON(data: any): Plan {\n const plan = new Plan({\n goal: data.goal,\n tasks: data.tasks.map((taskData: any) => Task.fromJSON(taskData)),\n });\n\n plan.createdAt = new Date(data.createdAt);\n plan.updatedAt = new Date(data.updatedAt);\n\n return plan;\n }\n}\n","/**\n * Collaboration Module - Multi-Agent Collaboration Engine\n *\n * Provides:\n * - Parallel agent execution\n * - Agent-to-agent communication\n * - Shared context management\n * - Collaborative planning\n */\n\nimport { Agent } from \"./agent\";\nimport { Space } from \"./space\";\nimport type { AgentResponse } from \"./agent\";\n\nexport interface AgentMessage {\n from: string; // Agent ID\n to: string; // Agent ID or 'broadcast'\n content: string;\n metadata?: Record<string, any>;\n timestamp: Date;\n}\n\nexport interface SharedContext {\n spaceId: string;\n data: Record<string, any>;\n updatedAt: Date;\n updatedBy: string; // Agent ID\n}\n\nexport interface ParallelTask {\n id: string;\n agentId: string;\n messages: any[];\n system?: string;\n metadata?: Record<string, any>;\n priority?: number; // Higher = more important\n}\n\nexport interface ParallelExecutionResult {\n taskId: string;\n agentId: string;\n result: AgentResponse;\n error?: Error;\n duration: number;\n}\n\n/**\n * Agent Collaboration Manager\n * Handles agent-to-agent communication and shared context\n */\nexport class AgentCollaborationManager {\n private space: Space;\n private messageQueue: Map<string, AgentMessage[]>; // Agent ID -> messages\n private sharedContext: SharedContext;\n private listeners: Map<string, Set<(message: AgentMessage) => void>>;\n\n constructor(space: Space) {\n this.space = space;\n this.messageQueue = new Map();\n this.sharedContext = {\n spaceId: space.spaceId,\n data: {},\n updatedAt: new Date(),\n updatedBy: \"system\",\n };\n this.listeners = new Map();\n }\n\n /**\n * Send a message from one agent to another\n */\n sendMessage(\n from: string,\n to: string,\n content: string,\n metadata?: Record<string, any>\n ): void {\n const message: AgentMessage = {\n from,\n to,\n content,\n metadata,\n timestamp: new Date(),\n };\n\n if (to === \"broadcast\") {\n // Broadcast to all agents\n for (const agentId of this.space.agents.keys()) {\n if (agentId !== from) {\n this.queueMessage(agentId, message);\n }\n }\n } else {\n // Send to specific agent\n this.queueMessage(to, message);\n }\n\n // Notify listeners\n this.notifyListeners(to, message);\n if (to !== \"broadcast\") {\n this.notifyListeners(\"broadcast\", message);\n }\n }\n\n /**\n * Queue a message for an agent\n */\n private queueMessage(agentId: string, message: AgentMessage): void {\n if (!this.messageQueue.has(agentId)) {\n this.messageQueue.set(agentId, []);\n }\n this.messageQueue.get(agentId)!.push(message);\n }\n\n /**\n * Get pending messages for an agent\n */\n getMessages(agentId: string): AgentMessage[] {\n const messages = this.messageQueue.get(agentId) || [];\n this.messageQueue.set(agentId, []); // Clear after reading\n return messages;\n }\n\n /**\n * Subscribe to messages for an agent\n */\n subscribe(\n agentId: string,\n callback: (message: AgentMessage) => void\n ): () => void {\n if (!this.listeners.has(agentId)) {\n this.listeners.set(agentId, new Set());\n }\n this.listeners.get(agentId)!.add(callback);\n\n return () => {\n const callbacks = this.listeners.get(agentId);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) {\n this.listeners.delete(agentId);\n }\n }\n };\n }\n\n /**\n * Notify listeners of a new message\n */\n private notifyListeners(agentId: string, message: AgentMessage): void {\n const callbacks = this.listeners.get(agentId);\n if (callbacks) {\n callbacks.forEach((cb) => {\n try {\n cb(message);\n } catch (error) {\n console.error(`[AgentCollaborationManager] Listener error:`, error);\n }\n });\n }\n }\n\n /**\n * Update shared context\n */\n updateContext(agentId: string, updates: Record<string, any>): void {\n this.sharedContext.data = {\n ...this.sharedContext.data,\n ...updates,\n };\n this.sharedContext.updatedAt = new Date();\n this.sharedContext.updatedBy = agentId;\n }\n\n /**\n * Get shared context\n */\n getContext(): SharedContext {\n return { ...this.sharedContext };\n }\n\n /**\n * Get a specific value from shared context\n */\n getContextValue(key: string): any {\n return this.sharedContext.data[key];\n }\n}\n\n/**\n * Parallel Execution Engine\n * Executes multiple agent tasks in parallel\n */\nexport class ParallelExecutionEngine {\n private space: Space;\n private maxConcurrency: number;\n private activeTasks: Map<string, Promise<ParallelExecutionResult>>;\n\n constructor(space: Space, maxConcurrency: number = 3) {\n this.space = space;\n this.maxConcurrency = maxConcurrency;\n this.activeTasks = new Map();\n }\n\n /**\n * Execute multiple tasks in parallel\n */\n async executeParallel(\n tasks: ParallelTask[]\n ): Promise<ParallelExecutionResult[]> {\n // Sort by priority (higher first)\n const sortedTasks = [...tasks].sort(\n (a, b) => (b.priority || 0) - (a.priority || 0)\n );\n\n // Execute in batches\n const results: ParallelExecutionResult[] = [];\n const executing: Promise<ParallelExecutionResult>[] = [];\n\n for (const task of sortedTasks) {\n // Wait if we've reached max concurrency\n if (executing.length >= this.maxConcurrency) {\n const completed = await Promise.race(executing);\n const index = executing.findIndex(\n (p) => p === Promise.resolve(completed)\n );\n if (index >= 0) {\n executing.splice(index, 1);\n }\n results.push(completed);\n }\n\n // Start execution\n const promise = this.executeTask(task);\n executing.push(promise);\n this.activeTasks.set(task.id, promise);\n }\n\n // Wait for remaining tasks\n const remaining = await Promise.allSettled(executing);\n for (const result of remaining) {\n if (result.status === \"fulfilled\") {\n results.push(result.value);\n } else {\n // Handle rejected promises\n console.error(\"[ParallelExecutionEngine] Task failed:\", result.reason);\n }\n }\n\n this.activeTasks.clear();\n return results;\n }\n\n /**\n * Execute a single task\n */\n private async executeTask(\n task: ParallelTask\n ): Promise<ParallelExecutionResult> {\n const startTime = Date.now();\n\n try {\n const agent = this.space.getAgent(task.agentId);\n if (!agent) {\n throw new Error(`Agent ${task.agentId} not found`);\n }\n\n // Execute agent\n const result = await agent.generateText({\n messages: task.messages,\n system: task.system,\n spaceId: this.space.spaceId,\n metadata: {\n ...task.metadata,\n parallelTaskId: task.id,\n },\n });\n\n const duration = Date.now() - startTime;\n\n return {\n taskId: task.id,\n agentId: task.agentId,\n result: {\n text: result.text || \"\",\n toolCalls: result.toolCalls,\n reasoning: result.reasoning,\n metadata: result.metadata,\n },\n duration,\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n return {\n taskId: task.id,\n agentId: task.agentId,\n result: {\n text: \"\",\n metadata: { error: String(error) },\n },\n error: error instanceof Error ? error : new Error(String(error)),\n duration,\n };\n }\n }\n\n /**\n * Cancel a running task\n */\n cancelTask(taskId: string): void {\n const task = this.activeTasks.get(taskId);\n if (task) {\n // Note: We can't actually cancel a running promise, but we can mark it\n // The actual cancellation would need to be handled at the agent level\n this.activeTasks.delete(taskId);\n }\n }\n\n /**\n * Get active task count\n */\n getActiveTaskCount(): number {\n return this.activeTasks.size;\n }\n}\n\n/**\n * Collaborative Planner\n * Helps agents plan together\n */\nexport class CollaborativePlanner {\n private space: Space;\n private collaborationManager: AgentCollaborationManager;\n\n constructor(space: Space, collaborationManager: AgentCollaborationManager) {\n this.space = space;\n this.collaborationManager = collaborationManager;\n }\n\n /**\n * Create a collaborative plan with multiple agents\n */\n async createCollaborativePlan(\n goal: string,\n agentIds: string[]\n ): Promise<{ plan: any; agentAssignments: Map<string, string[]> }> {\n // Get shared context\n const context = this.collaborationManager.getContext();\n\n // Create planning tasks for each agent\n const planningTasks: ParallelTask[] = agentIds.map((agentId, index) => ({\n id: `plan-${agentId}-${Date.now()}`,\n agentId,\n messages: [\n {\n role: \"user\",\n content:\n `We need to create a collaborative plan for: ${goal}\\n\\n` +\n `Shared context: ${JSON.stringify(context.data, null, 2)}\\n\\n` +\n `You are one of ${agentIds.length} agents working together. ` +\n `Propose your part of the plan and identify dependencies on other agents.`,\n },\n ],\n priority: agentIds.length - index, // First agent gets highest priority\n metadata: {\n planningSession: true,\n goal,\n otherAgents: agentIds.filter((id) => id !== agentId),\n },\n }));\n\n // Execute planning in parallel\n const executionEngine = new ParallelExecutionEngine(this.space);\n const results = await executionEngine.executeParallel(planningTasks);\n\n // Aggregate plans\n const agentPlans = new Map<string, any>();\n for (const result of results) {\n if (!result.error) {\n agentPlans.set(result.agentId, result.result);\n }\n }\n\n // Create unified plan\n const plan = this.mergePlans(agentPlans, goal);\n const agentAssignments = this.assignTasks(plan, agentIds);\n\n return { plan, agentAssignments };\n }\n\n /**\n * Merge multiple agent plans into one\n */\n private mergePlans(agentPlans: Map<string, any>, goal: string): any {\n // Simple merge strategy - in a real implementation, this would be more sophisticated\n const tasks: any[] = [];\n let taskId = 1;\n\n for (const [agentId, plan] of agentPlans.entries()) {\n if (plan.text) {\n // Extract tasks from plan text (simplified)\n const lines = plan.text\n .split(\"\\n\")\n .filter(\n (line: string) =>\n line.trim().startsWith(\"-\") || line.trim().match(/^\\d+\\./)\n );\n\n for (const line of lines) {\n tasks.push({\n id: `task-${taskId++}`,\n description: line.replace(/^[-•\\d.]+\\s*/, \"\").trim(),\n assignedAgent: agentId,\n status: \"pending\",\n });\n }\n }\n }\n\n return {\n goal,\n tasks,\n createdAt: new Date().toISOString(),\n };\n }\n\n /**\n * Assign tasks to agents\n */\n private assignTasks(plan: any, agentIds: string[]): Map<string, string[]> {\n const assignments = new Map<string, string[]>();\n\n for (const agentId of agentIds) {\n assignments.set(agentId, []);\n }\n\n for (const task of plan.tasks) {\n const agentId = task.assignedAgent || agentIds[0];\n const tasks = assignments.get(agentId) || [];\n tasks.push(task.id);\n assignments.set(agentId, tasks);\n }\n\n return assignments;\n }\n}\n","/**\n * Space - The top-level container for Viber work (formerly Space)\n *\n * A Space represents a project context that contains multiple tasks.\n * Each space is managed by an XAgent that serves as its orchestrator.\n *\n * Key concepts:\n * - Space: Project container with shared configuration\n * - Task: Individual conversation tasks within a space\n * - Each task has its own conversation history and artifacts\n */\n\nimport { Plan } from \"./plan\";\nimport { Task, TaskStatus } from \"./task\";\nimport { ViberAgent } from \"./viber-agent\";\n// SpaceStore removed\nimport { Agent } from \"./agent\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport { getViberRoot } from \"./config\";\nimport { MessageQueue, ConversationHistory } from \"./message\";\nimport type { SpaceModel, SpaceState, SpaceConfig, ViberConfig } from \"../types\";\nimport {\n AgentCollaborationManager,\n ParallelExecutionEngine,\n CollaborativePlanner,\n} from \"./collaboration\";\n\n// Re-export for convenience\nexport type { SpaceModel, SpaceState };\n\n// Task within a space\nexport interface SpaceTask {\n id: string;\n spaceId: string;\n title: string;\n history: ConversationHistory;\n artifactIds: string[];\n status: \"active\" | \"completed\" | \"archived\";\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport class Space {\n public spaceId: string;\n public userId?: string; // User ID of space owner\n public config: SpaceConfig;\n public history: ConversationHistory; // Legacy: primary task history\n public tasks: Map<string, SpaceTask>; // NEW: Multiple tasks\n public messageQueue: MessageQueue;\n public agents: Map<string, Agent>; // Agent class\n // storage removed\n public goal: string;\n public name: string;\n public viberAgent?: ViberAgent;\n public createdAt: Date;\n public updatedAt: Date;\n public plan?: Plan;\n public artifacts?: any[];\n public collaborationManager?: AgentCollaborationManager;\n public parallelEngine?: ParallelExecutionEngine;\n public collaborativePlanner?: CollaborativePlanner;\n\n constructor({\n spaceId,\n userId,\n config,\n history,\n messageQueue,\n agents,\n goal,\n name,\n viberAgent,\n }: {\n spaceId: string;\n userId?: string;\n config: SpaceConfig;\n history: ConversationHistory;\n messageQueue: MessageQueue;\n agents: Map<string, Agent>;\n goal: string;\n name?: string;\n viberAgent?: ViberAgent;\n }) {\n this.spaceId = spaceId;\n this.userId = userId;\n this.config = config;\n this.history = history; // Legacy: default task history\n this.tasks = new Map(); // NEW: Task storage\n this.messageQueue = messageQueue;\n this.agents = agents;\n this.goal = goal;\n this.name = name || `Space ${spaceId}`;\n this.viberAgent = viberAgent;\n this.createdAt = new Date();\n this.updatedAt = new Date();\n\n // Initialize collaboration components\n this.collaborationManager = new AgentCollaborationManager(this);\n this.parallelEngine = new ParallelExecutionEngine(this);\n this.collaborativePlanner = new CollaborativePlanner(\n this,\n this.collaborationManager,\n );\n }\n\n /**\n * Get or create a task within this space\n */\n getOrCreateTask(taskId: string, title?: string): SpaceTask {\n if (!this.tasks.has(taskId)) {\n const task: SpaceTask = {\n id: taskId,\n spaceId: this.spaceId,\n title: title || `Task ${taskId}`,\n history: new ConversationHistory(),\n artifactIds: [],\n status: \"active\",\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n this.tasks.set(taskId, task);\n console.log(`[Space] Created task ${taskId} in space ${this.spaceId}`);\n }\n return this.tasks.get(taskId)!;\n }\n\n /**\n * Get task by ID\n */\n getTask(taskId: string): SpaceTask | undefined {\n return this.tasks.get(taskId);\n }\n\n /**\n * Get all tasks in this space\n */\n getAllTasks(): SpaceTask[] {\n return Array.from(this.tasks.values());\n }\n\n /**\n * Update space task status (for conversation tasks, not Plan tasks)\n */\n updateSpaceTaskStatus(\n taskId: string,\n status: \"active\" | \"completed\" | \"archived\",\n ): boolean {\n const task = this.tasks.get(taskId);\n if (task) {\n task.status = status;\n task.updatedAt = new Date();\n return true;\n }\n return false;\n }\n\n getAgent(name: string): Agent | undefined {\n return this.agents.get(name);\n }\n\n registerAgent(name: string, agent: Agent): void {\n this.agents.set(name, agent);\n console.log(`[Space] Registered agent: ${name} - ${agent.description}`);\n }\n\n complete(): void {\n console.log(`Space ${this.spaceId} completed`);\n }\n\n getContext(): Record<string, any> {\n const context: Record<string, any> = {\n spaceId: this.spaceId,\n goal: this.goal,\n storagePath: path.join(getViberRoot(), this.spaceId),\n agents: Array.from(this.agents.keys()),\n historyLength: this.history.messages.length,\n createdAt: this.createdAt.toISOString(),\n };\n\n if (this.plan) {\n context.plan = {\n goal: this.goal,\n totalTasks: this.plan.tasks.length,\n progress: this.plan.getProgressSummary(),\n };\n }\n\n return context;\n }\n\n async createPlan(plan: Plan): Promise<void> {\n this.plan = plan;\n await this.persistState();\n console.log(\n `Created plan for space ${this.spaceId} with ${plan.tasks.length} tasks`,\n );\n }\n\n async updatePlan(plan: Plan): Promise<void> {\n this.plan = plan;\n this.updatedAt = new Date();\n await this.persistState();\n console.log(`Updated plan for space ${this.spaceId}`);\n }\n\n async setName(name: string): Promise<void> {\n this.name = name;\n this.updatedAt = new Date();\n await this.persistState();\n console.log(`Updated space ${this.spaceId} name to: ${name}`);\n }\n\n async getNextTask(): Promise<Task | undefined> {\n if (!this.plan) {\n return undefined;\n }\n return this.plan.getNextActionableTask();\n }\n\n async getParallelTasks(maxTasks: number = 3): Promise<Task[]> {\n if (!this.plan) {\n return [];\n }\n return this.plan.getAllActionableTasks(maxTasks);\n }\n\n async updateTaskStatus(taskId: string, status: TaskStatus): Promise<boolean> {\n if (!this.plan) {\n return false;\n }\n\n const success = this.plan.updateTaskStatus(taskId, status);\n if (success) {\n this.updatedAt = new Date();\n await this.persistState();\n console.log(`Updated task ${taskId} status to ${status}`);\n }\n\n return success;\n }\n\n async assignTask(taskId: string, agentName: string): Promise<boolean> {\n if (!this.plan) {\n return false;\n }\n\n const task = this.plan.getTaskById(taskId);\n if (!task) {\n return false;\n }\n\n if (!this.agents.has(agentName)) {\n console.error(`Agent '${agentName}' not found in space team`);\n return false;\n }\n\n task.assignedTo = agentName;\n this.updatedAt = new Date();\n await this.persistState();\n console.log(`Assigned task ${taskId} to agent ${agentName}`);\n return true;\n }\n\n isPlanComplete(): boolean {\n if (!this.plan) {\n return false;\n }\n return this.plan.isComplete();\n }\n\n hasFailedTasks(): boolean {\n if (!this.plan) {\n return false;\n }\n return this.plan.hasFailedTasks();\n }\n\n /**\n * Persist state\n *\n * @deprecated Space persistence is now handled by the API layer using SupabaseDatabaseAdapter.\n * This method is a no-op kept for interface compatibility.\n */\n async persistState(): Promise<void> {\n // No-op: handled by database adapter\n }\n\n /**\n * Load state\n *\n * @deprecated Space data is loaded from the database.\n * This method is a no-op kept for interface compatibility.\n */\n async loadState(): Promise<boolean> {\n // No-op: handled by database adapter\n return false;\n }\n\n async loadPlan(): Promise<Plan | undefined> {\n if (await this.loadState()) {\n return this.plan;\n }\n return undefined;\n }\n\n getState(): SpaceState {\n const state: SpaceState = {\n spaceId: this.spaceId,\n name: this.name,\n goal: this.goal,\n createdAt: this.createdAt.toISOString(),\n updatedAt: this.updatedAt.toISOString(),\n teamSize: this.agents.size,\n };\n\n if (this.plan) {\n const taskStats = {\n total: this.plan.tasks.length,\n completed: this.plan.tasks.filter(\n (t) => t.status === TaskStatus.COMPLETED,\n ).length,\n running: this.plan.tasks.filter((t) => t.status === TaskStatus.RUNNING)\n .length,\n pending: this.plan.tasks.filter((t) => t.status === TaskStatus.PENDING)\n .length,\n failed: this.plan.tasks.filter((t) => t.status === TaskStatus.FAILED)\n .length,\n };\n state.tasks = taskStats;\n state.progressPercentage =\n taskStats.total > 0 ? (taskStats.completed / taskStats.total) * 100 : 0;\n }\n\n return state;\n }\n}\n\n/**\n * Start a new space\n */\nexport async function startSpace({\n goal,\n spaceId,\n userId,\n spaceRoot,\n name,\n model,\n}: {\n goal: string;\n spaceId?: string;\n userId?: string;\n spaceRoot?: string;\n name?: string;\n model?: string;\n}): Promise<Space> {\n const id = spaceId || `proj_${Date.now().toString(36)}`;\n\n // Create minimal space config\n const spaceConfig: SpaceConfig = {\n name: name || goal.slice(0, 50),\n autoSave: true,\n checkpointInterval: 300,\n };\n\n console.log(`[Space] Creating space - agents will be loaded on demand`);\n\n // Create agents map - empty initially, agents loaded on demand\n const agents = new Map<string, Agent>();\n\n // Create message queue and history\n const messageQueue = new MessageQueue();\n const history = new ConversationHistory();\n\n // Create the space\n const space = new Space({\n spaceId: id,\n userId,\n config: spaceConfig,\n history,\n messageQueue,\n agents,\n goal,\n name: name || spaceConfig.name,\n });\n\n // Create ViberAgent for the space (includes CLI skills so Viber Board can verify skills)\n const viberViberConfig: ViberConfig = {\n name: \"Viber\",\n description: \"I manage this space and coordinate all work.\",\n llm: {\n provider: \"openrouter\",\n model: model || \"deepseek/deepseek-chat\",\n settings: {\n temperature: 0.7,\n },\n },\n promptFile: \"\", // ViberAgent doesn't use prompt files\n skills: [\"terminal\", \"cursor-agent\", \"codex-cli\", \"skill-playground\"],\n };\n\n const viberAgent = new ViberAgent(viberViberConfig, space, {\n model,\n spaceId: id,\n });\n space.viberAgent = viberAgent;\n\n // MCP tools are now loaded on-demand by agents, not pre-loaded\n // This avoids the need for a central tool registry\n\n // Save initial state\n await space.persistState();\n\n return space;\n}\n","\nimport { Agent, AgentContext, AgentResponse } from \"./agent\";\nimport { ViberConfig } from \"../types\";\nimport { Space } from \"./space\";\nimport { Plan } from \"./plan\";\nimport { Task, TaskStatus } from \"./task\";\nimport { generateText, Output } from \"ai\";\nimport { z } from \"zod\";\nimport type { ParallelTask } from \"./collaboration\";\n\nexport interface ViberOptions {\n model?: string; // AI model to use\n storageRoot?: string; // Storage location\n defaultGoal?: string; // Default goal for new spaces\n spaceId?: string; // Explicit space ID\n singleAgentId?: string; // If set, route directly to this agent ID\n /** User settings from Supabase (primary coding CLI etc.); node uses and caches locally */\n settings?: { primaryCodingCli?: string; channelIds?: string[] };\n}\n\nexport interface ViberStreamOptions {\n messages?: any[]; // Message history\n tools?: any; // Tools available\n artifactId?: string; // Artifact context\n [key: string]: any; // Additional options\n}\n\nexport interface ViberAgentResponse extends AgentResponse {\n plan?: Plan;\n taskResults?: any[];\n artifacts?: any[];\n preservedSteps?: string[];\n regeneratedSteps?: string[];\n planChanges?: Record<string, any>;\n}\n\nexport class ViberAgent extends Agent {\n private space: Space;\n public readonly spaceId: string;\n private abortController?: AbortController;\n private singleAgentId?: string; // If set, bypass planning\n\n constructor(config: ViberConfig, space: Space, options?: ViberOptions) {\n // Enhance the config for ViberAgent\n const xConfig: ViberConfig = {\n ...config,\n name: \"X\",\n description: `I am X, the conversational representative for this space. I manage all aspects of the space and coordinate with other agents to achieve our goals.`,\n };\n\n super(xConfig);\n this.space = space;\n this.spaceId = space.spaceId;\n this.singleAgentId = options?.singleAgentId;\n }\n\n /**\n * Getter for space (needed for external access)\n */\n getSpace(): Space {\n return this.space;\n }\n\n /**\n * Override getSystemPrompt to include plan and artifacts context\n */\n public getSystemPrompt(context?: AgentContext): string {\n const basePrompt = super.getSystemPrompt(context);\n return basePrompt + this.getPlanContext() + this.getArtifactsContext();\n }\n\n /**\n * Generate text - uses new AI SDK-style signature\n */\n async generateText(options: {\n messages: any[];\n system?: string;\n [key: string]: any;\n }): Promise<any> {\n // Add space context to options\n return super.generateText({\n ...options,\n spaceId: this.space.spaceId,\n metadata: {\n spaceName: this.space.name,\n spaceGoal: this.space.goal,\n ...options.metadata,\n },\n });\n }\n\n /**\n * ViberAgent streamText - Orchestration Layer\n * Responsibilities: History management, agent delegation, persistence\n */\n async streamText(options: {\n messages: any[];\n system?: string;\n spaceId?: string;\n metadata?: Record<string, any>;\n [key: string]: any;\n }): Promise<any> {\n const {\n messages,\n system: systemMessage,\n spaceId,\n metadata = {},\n ...restOptions\n } = options;\n\n console.log(\"[ViberAgent] Orchestration layer: starting streamText\");\n\n const mode = metadata?.mode;\n if (!mode || mode !== \"agent\") {\n throw new Error(\"ViberAgent only supports 'agent' mode\");\n }\n\n // PHASE 1: History Management\n await this.updateSpaceHistory(messages, metadata);\n\n // PHASE 2: Agent Delegation\n const streamResult = await this.handleAgentMode(\n messages,\n systemMessage,\n spaceId,\n metadata,\n restOptions,\n );\n\n // PHASE 3: Message Persistence\n if (spaceId) {\n this.handleMessagePersistence(streamResult, messages, spaceId, metadata);\n }\n\n return streamResult;\n }\n\n /**\n * Agent Mode Handler - Direct delegation with performance optimization\n * Supports both single agent and parallel execution\n */\n private async handleAgentMode(\n messages: any[],\n systemMessage: string | undefined,\n spaceId: string | undefined,\n metadata: Record<string, any>,\n restOptions: any,\n ): Promise<any> {\n // Check if parallel execution is requested\n const parallelAgents = metadata.parallelAgents as string[] | undefined;\n if (parallelAgents && parallelAgents.length > 1) {\n return this.handleParallelExecution(\n parallelAgents,\n messages,\n systemMessage,\n spaceId,\n metadata,\n restOptions,\n );\n }\n\n // Single agent execution (existing logic)\n const targetAgent = metadata.requestedAgent;\n if (!targetAgent) {\n throw new Error(\"Agent mode requires requestedAgent in metadata\");\n }\n\n console.log(\n `[ViberAgent] Agent mode: direct delegation to '${targetAgent}'`,\n );\n\n // Get or load target agent\n let agent = this.space.getAgent(targetAgent);\n if (!agent) {\n // Load agent on demand\n console.log(`[ViberAgent] Loading agent '${targetAgent}' on demand`);\n const { loadViberConfig } = await import(\"./config\");\n const agentConfig = await loadViberConfig(targetAgent);\n if (!agentConfig) {\n throw new Error(`Agent '${targetAgent}' not found`);\n }\n agent = new Agent(agentConfig as unknown as ViberConfig);\n this.space.registerAgent(targetAgent, agent);\n }\n\n // Use full conversation history so the LLM has context (e.g. user \"1\" after assistant's numbered list)\n const taskId = metadata?.taskId || metadata?.conversationId || \"default\";\n const task = this.space.getOrCreateTask(taskId);\n const fullHistory = task.history.getMessages();\n const messagesForAgent =\n fullHistory.length > 0\n ? this.optimizeContextForAgent(fullHistory)\n : this.optimizeContextForAgent(messages);\n console.log(\n `[ViberAgent] Agent mode: using ${messagesForAgent.length} messages from history`,\n );\n\n // Direct delegation - no orchestration overhead\n return await agent.streamText({\n messages: messagesForAgent,\n system: systemMessage,\n spaceId,\n metadata: {\n ...metadata,\n delegationType: \"direct\",\n userId: this.space.userId, // Pass space owner ID for tracking\n },\n ...restOptions,\n });\n }\n\n /**\n * Handle parallel execution of multiple agents\n */\n private async handleParallelExecution(\n agentIds: string[],\n messages: any[],\n systemMessage: string | undefined,\n spaceId: string | undefined,\n metadata: Record<string, any>,\n restOptions: any,\n ): Promise<any> {\n console.log(`[ViberAgent] Parallel execution: ${agentIds.length} agents`);\n\n // Ensure all agents are loaded\n const { loadViberConfig } = await import(\"./config\");\n for (const agentId of agentIds) {\n if (!this.space.getAgent(agentId)) {\n const agentConfig = await loadViberConfig(agentId);\n if (!agentConfig) {\n throw new Error(`Agent '${agentId}' not found`);\n }\n const agent = new Agent(agentConfig as unknown as ViberConfig);\n this.space.registerAgent(agentId, agent);\n }\n }\n\n // Use parallel execution engine\n if (!this.space.parallelEngine) {\n throw new Error(\"Parallel execution engine not initialized\");\n }\n\n // ParallelTask type is imported at top of file\n const tasks = agentIds.map((agentId, index) => ({\n id: `parallel-${agentId}-${Date.now()}-${index}`,\n agentId,\n messages: this.optimizeContextForAgent(messages),\n system: systemMessage,\n metadata: {\n ...metadata,\n delegationType: \"parallel\",\n userId: this.space.userId,\n parallelIndex: index,\n },\n priority: agentIds.length - index, // First agent gets highest priority\n }));\n\n const results = await this.space.parallelEngine.executeParallel(tasks);\n\n // Aggregate results\n return {\n text: results.map((r) => `[${r.agentId}]: ${r.result.text}`).join(\"\\n\\n\"),\n toolCalls: results.flatMap((r) => r.result.toolCalls || []),\n metadata: {\n ...metadata,\n parallelResults: results,\n agentCount: agentIds.length,\n },\n };\n }\n\n /**\n * Update space history with new messages\n * Now supports per-task history\n */\n private async updateSpaceHistory(\n messages: any[],\n metadata?: Record<string, any>,\n ): Promise<void> {\n // Get taskId from metadata, or use \"default\" for legacy support\n const taskId = metadata?.taskId || metadata?.conversationId || \"default\";\n const task = this.space.getOrCreateTask(taskId);\n\n const existingMessages = task.history.getMessages();\n // When client sends only the new message(s), messages.length <= existingMessages.length:\n // append incoming messages. When client sends full conversation, take only the new tail.\n const newMessages =\n messages.length > existingMessages.length\n ? messages.slice(existingMessages.length)\n : messages;\n\n if (newMessages.length > 0) {\n for (const msg of newMessages) {\n const formattedMsg = {\n ...msg,\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : Array.isArray(msg.content)\n ? msg.content\n : [{ type: \"text\", text: msg.content }],\n };\n task.history.add(formattedMsg);\n }\n console.log(\n `[ViberAgent] Updated task ${taskId} history with ${newMessages.length} new messages`,\n );\n }\n }\n\n /**\n * Optimize message context for single-agent performance\n */\n private optimizeContextForAgent(messages: any[]): any[] {\n // For agent mode, use recent messages only to minimize token usage\n return messages.slice(-4); // Last 4 messages (2 exchanges)\n }\n\n /**\n * Extract user prompt from messages for orchestration\n */\n private extractPromptFromMessages(messages: any[]): string {\n const lastMessage = messages[messages.length - 1];\n if (lastMessage?.role === \"user\") {\n const content = lastMessage.content;\n if (typeof content === \"string\") {\n return content;\n } else if (Array.isArray(content)) {\n return content\n .filter((part) => part.type === \"text\" && part.text)\n .map((part) => part.text)\n .join(\" \");\n }\n }\n return \"\";\n }\n\n /**\n * Handle message persistence after streaming completes\n */\n private handleMessagePersistence(\n streamResult: any,\n messages: any[],\n spaceId: string,\n metadata: any,\n ) {\n (async () => {\n try {\n let finalText = \"\";\n const toolInvocations: any[] = [];\n\n for await (const part of streamResult.fullStream) {\n switch (part.type) {\n case \"text-delta\":\n if (part.text) {\n finalText += part.text;\n }\n break;\n case \"tool-call\":\n toolInvocations.push({\n toolCallId: part.toolCallId,\n toolName: part.toolName,\n args: part.args,\n });\n break;\n case \"tool-result\":\n const toolCall = toolInvocations.find(\n (t) => t.toolCallId === part.toolCallId,\n );\n if (toolCall) {\n toolCall.result = part.result;\n }\n break;\n case \"finish\":\n break;\n case \"error\":\n console.error(\"[ViberAgent] Stream error:\", part.error);\n return;\n }\n }\n\n // Build assistant message in AI SDK v5 format\n const assistantMessage = {\n role: \"assistant\" as const,\n content: [{ type: \"text\" as const, text: finalText }],\n id: `msg_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n metadata: {\n agentName: this.singleAgentId || \"team\",\n spaceId,\n timestamp: Date.now(),\n ...metadata,\n },\n ...(toolInvocations.length > 0 && { toolInvocations }),\n };\n\n // Add assistant message to task history so next turn in same run has full context\n const taskId =\n metadata?.taskId || metadata?.conversationId || \"default\";\n const task = this.space.getOrCreateTask(taskId);\n task.history.add(assistantMessage);\n // Chat history is persisted at Viber Board level, not by the viber agent\n } catch (error) {\n console.error(\"[ViberAgent] Failed to persist messages:\", error);\n }\n })();\n }\n\n /**\n * Save space to storage\n *\n * @deprecated Space data is now persisted through the data adapter (spaces table).\n * This method is kept for interface compatibility but performs no action.\n */\n private async saveSpace(): Promise<void> {\n // No-op: Space persistence is handled by database adapter\n }\n\n /**\n * Stop current operation\n */\n stop() {\n this.space.messageQueue.clear();\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n /**\n * Add message to queue (soft interrupt)\n */\n addMessage(message: string, metadata?: any) {\n return this.space.messageQueue.add(message, metadata);\n }\n\n /**\n * Enrich context with space information\n */\n private enrichContext(context?: Partial<AgentContext>): AgentContext {\n return {\n spaceId: this.space.spaceId,\n conversationHistory: this.space.history,\n metadata: {\n spaceName: this.space.name,\n spaceGoal: this.space.goal,\n ...context?.metadata,\n },\n ...context,\n };\n }\n\n /**\n * Create or update the space plan\n */\n async createPlan(goal?: string): Promise<Plan> {\n const planGoal = goal || this.space.goal;\n\n // Generate plan using LLM\n const planSchema = z.object({\n tasks: z.array(\n z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n assignedTo: z.string().optional(),\n priority: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n estimatedTime: z.string().optional(),\n dependencies: z\n .array(\n z.object({\n taskId: z.string(),\n type: z.enum([\"required\", \"optional\"]),\n }),\n )\n .default([]),\n tags: z.array(z.string()).default([]),\n }),\n ),\n });\n\n const result = await generateText({\n model: this.getModel(),\n system:\n this.getSystemPrompt() +\n \"\\n\\nCreate a detailed plan to achieve the goal.\",\n prompt: `Goal: ${planGoal}\\n\\nAvailable agents: ${Array.from(\n this.space.agents.keys(),\n ).join(\", \")}`,\n output: Output.object({ schema: planSchema }),\n });\n\n // Create Plan with Tasks - cast result.output to inferred schema type\n const planData = result.output as z.infer<typeof planSchema>;\n const tasks = planData.tasks.map(\n (taskData: z.infer<typeof planSchema>[\"tasks\"][number]) =>\n new Task({\n ...taskData,\n status: TaskStatus.PENDING,\n }),\n );\n\n const plan = new Plan({\n goal: planGoal,\n tasks,\n });\n\n await this.space.createPlan(plan);\n return plan;\n }\n\n /**\n * Adapt the plan based on new information or user feedback\n */\n async adaptPlan(feedback: string): Promise<Plan> {\n if (!this.space.plan) {\n // No existing plan, create a new one with the feedback\n return this.createPlan(feedback);\n }\n\n const currentPlan = this.space.plan;\n const progress = currentPlan.getProgressSummary();\n\n // Schema for plan adaptation\n const adaptSchema = z.object({\n preserveTasks: z\n .array(z.string())\n .describe(\"IDs of tasks to keep unchanged\"),\n modifyTasks: z\n .array(\n z.object({\n id: z.string(),\n changes: z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n priority: z.enum([\"low\", \"medium\", \"high\"]).optional(),\n assignedTo: z.string().optional(),\n }),\n }),\n )\n .describe(\"Tasks to modify\"),\n removeTasks: z.array(z.string()).describe(\"IDs of tasks to remove\"),\n addTasks: z\n .array(\n z.object({\n id: z.string(),\n title: z.string(),\n description: z.string(),\n assignedTo: z.string().optional(),\n priority: z.enum([\"low\", \"medium\", \"high\"]).default(\"medium\"),\n dependencies: z\n .array(\n z.object({\n taskId: z.string(),\n type: z.enum([\"required\", \"optional\"]),\n }),\n )\n .default([]),\n tags: z.array(z.string()).default([]),\n }),\n )\n .describe(\"New tasks to add\"),\n reasoning: z.string().describe(\"Explanation of the plan changes\"),\n });\n\n const prompt = `\nCurrent Plan Progress:\n- Total tasks: ${progress.totalTasks}\n- Completed: ${progress.completedTasks}\n- In Progress: ${progress.runningTasks}\n- Pending: ${progress.pendingTasks}\n\nCurrent Tasks:\n${currentPlan.tasks\n .map((t) => `- [${t.id}] ${t.title} (${t.status})`)\n .join(\"\\n\")}\n\nUser Feedback: ${feedback}\n\nAnalyze the current plan and adapt it based on the user's feedback.\nKeep completed tasks unless explicitly asked to redo them.\nPreserve tasks that are still relevant.\nModify, remove, or add tasks as needed to better achieve the goal.\n`;\n\n const result = await generateText({\n model: this.getModel(),\n system:\n this.getSystemPrompt() +\n \"\\n\\nAdapt the existing plan based on user feedback.\",\n prompt,\n output: Output.object({ schema: adaptSchema }),\n });\n\n // Apply adaptations - cast result.output to inferred schema type\n const adaptData = result.output as z.infer<typeof adaptSchema>;\n const adaptedTasks: Task[] = [];\n\n // Keep preserved tasks\n for (const taskId of adaptData.preserveTasks) {\n const task = currentPlan.tasks.find((t) => t.id === taskId);\n if (task) {\n adaptedTasks.push(task);\n }\n }\n\n // Modify tasks\n for (const modification of adaptData.modifyTasks) {\n const task = currentPlan.tasks.find((t) => t.id === modification.id);\n if (task) {\n // Apply changes\n if (modification.changes.title) task.title = modification.changes.title;\n if (modification.changes.description)\n task.description = modification.changes.description;\n if (modification.changes.priority)\n task.priority = modification.changes.priority;\n if (modification.changes.assignedTo)\n task.assignedTo = modification.changes.assignedTo;\n adaptedTasks.push(task);\n }\n }\n\n // Add new tasks\n for (const newTaskData of adaptData.addTasks) {\n const newTask = new Task({\n ...newTaskData,\n status: TaskStatus.PENDING,\n });\n adaptedTasks.push(newTask);\n }\n\n // Create adapted plan\n const adaptedPlan = new Plan({\n goal: currentPlan.goal,\n tasks: adaptedTasks,\n });\n\n // Update space with adapted plan\n await this.space.createPlan(adaptedPlan);\n\n // Log the reasoning\n console.log(\"[Plan Adaptation]\", adaptData.reasoning);\n\n return adaptedPlan;\n }\n\n /**\n * Get plan context for system prompt\n */\n private getPlanContext(): string {\n if (!this.space.plan) {\n return \"\\n\\nNo active plan for this space yet.\";\n }\n\n const summary = this.space.plan.getProgressSummary();\n return `\n\nCurrent Plan Status:\n- Total tasks: ${summary.totalTasks}\n- Completed: ${summary.completedTasks}\n- Running: ${summary.runningTasks}\n- Pending: ${summary.pendingTasks}\n- Failed: ${summary.failedTasks}\n- Progress: ${summary.progressPercentage.toFixed(1)}%\n`;\n }\n\n /**\n * Get artifacts context for system prompt\n */\n private getArtifactsContext(): string {\n if (!this.space.artifacts || this.space.artifacts.length === 0) {\n return \"\";\n }\n\n const artifactsList = this.space.artifacts\n .map((a) => `- ${a.title || a.path} (${a.artifactType || \"document\"})`)\n .join(\"\\n\");\n\n return `\n\nAvailable Artifacts:\n${artifactsList}\n\nThese artifacts are pre-loaded in the space and can be referenced in your responses.\n`;\n }\n\n /**\n * Get ViberAgent summary\n */\n getSummary(): Record<string, any> {\n const base = super.getSummary();\n return {\n ...base,\n spaceId: this.space.spaceId,\n spaceName: this.space.name,\n spaceGoal: this.space.goal,\n planStatus: this.space.plan?.getProgressSummary(),\n };\n }\n\n /**\n * Static factory to start a new space\n */\n static async start(\n goal: string,\n options: ViberOptions = {},\n ): Promise<ViberAgent> {\n const { spaceId, model, singleAgentId } = options;\n\n // Use provided spaceId or generate one\n const id =\n spaceId ||\n `proj_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Start space (this creates ViberAgent internally)\n const { startSpace } = await import(\"./space\");\n const space = await startSpace({\n spaceId: id,\n goal,\n name: goal.slice(0, 50),\n model,\n });\n\n if (!space.viberAgent) {\n throw new Error(\"Failed to initialize ViberAgent\");\n }\n\n // Set singleAgentId if provided\n if (singleAgentId) {\n (space.viberAgent as any).singleAgentId = singleAgentId;\n }\n\n return space.viberAgent;\n }\n\n /**\n * Static factory to resume an existing space\n */\n static async resume(\n spaceId: string,\n options: ViberOptions = {},\n ): Promise<ViberAgent> {\n const { model } = options;\n\n // Load existing space\n const { startSpace } = await import(\"./space\");\n\n // Check if space exists - simplified check or rely on startSpace to fail\n const { getViberRoot } = await import(\"./config\");\n const fs = await import(\"fs/promises\");\n const path = await import(\"path\");\n\n const spacePath = path.join(getViberRoot(), spaceId);\n const exists = await fs.access(spacePath).then(() => true).catch(() => false);\n\n if (!exists) {\n throw new Error(`Space ${spaceId} not found`);\n }\n\n // TODO: Integrate with database adapter to load actual space data\n const spaceData = {\n goal: \"Resumed Space\",\n name: \"Resumed Space\",\n model: undefined,\n singleAgentId: undefined\n };\n\n // Recreate space with saved state\n const space = await startSpace({\n spaceId,\n goal: spaceData.goal,\n name: spaceData.name,\n model: model || spaceData.model,\n });\n\n if (!space.viberAgent) {\n throw new Error(\"Failed to initialize ViberAgent\");\n }\n\n // Set singleAgentId if provided\n const agentId = options.singleAgentId || spaceData.singleAgentId;\n if (agentId) {\n (space.viberAgent as any).singleAgentId = agentId;\n }\n\n return space.viberAgent;\n }\n}\n","/**\n * Channel Manager\n *\n * Central registry and router for command center channels.\n * Routes inbound messages to ViberAgent and broadcasts\n * agent events to the originating channel.\n */\n\nimport { EventEmitter } from \"events\";\nimport {\n Channel,\n InboundMessage,\n AgentStreamEvent,\n InterruptSignal,\n} from \"./channel\";\nimport { ViberAgent } from \"../worker/viber-agent\";\nimport { createLogger } from \"../utils/logger\";\n\nconst log = createLogger(\"ChannelManager\");\n\ninterface ActiveConversation {\n channelId: string;\n agent: ViberAgent;\n startedAt: Date;\n}\n\nexport class ChannelManager extends EventEmitter {\n private channels = new Map<string, Channel>();\n private conversations = new Map<string, ActiveConversation>();\n\n /**\n * Register a channel\n */\n register(channel: Channel): void {\n if (this.channels.has(channel.id)) {\n log.warn(\"Channel already registered\", { channelId: channel.id });\n return;\n }\n this.channels.set(channel.id, channel);\n log.info(\"Registered channel\", { channelId: channel.id });\n }\n\n /**\n * Unregister a channel\n */\n unregister(id: string): void {\n this.channels.delete(id);\n log.info(\"Unregistered channel\", { channelId: id });\n }\n\n /**\n * Get a channel by ID\n */\n getChannel(id: string): Channel | undefined {\n return this.channels.get(id);\n }\n\n /**\n * Start all registered channels\n */\n async startAll(): Promise<void> {\n for (const [id, channel] of this.channels) {\n try {\n await channel.start();\n log.info(\"Started channel\", { channelId: id });\n } catch (error) {\n log.error(\"Failed to start channel\", {\n data: { channelId: id, error: String((error as Error)?.message ?? error) },\n });\n }\n }\n }\n\n /**\n * Stop all registered channels in parallel\n */\n async stopAll(): Promise<void> {\n const stopPromises = Array.from(this.channels.entries()).map(\n async ([id, channel]) => {\n try {\n await channel.stop();\n log.info(\"Stopped channel\", { channelId: id });\n } catch (error) {\n log.error(\"Failed to stop channel\", {\n data: { channelId: id, error: String((error as Error)?.message ?? error) },\n });\n }\n }\n );\n\n await Promise.all(stopPromises);\n }\n\n /**\n * Route an inbound message to ViberAgent\n */\n async routeMessage(message: InboundMessage): Promise<void> {\n const { source, conversationId, content, userId } = message;\n\n log.info(\"Routing message\", {\n source,\n conversationId,\n contentPreview: content.substring(0, 50),\n });\n\n // Get or create conversation\n let conversation = this.conversations.get(conversationId);\n\n if (!conversation) {\n // Create new ViberAgent for this conversation\n const agent = await ViberAgent.start(content, {\n // Use conversation ID as space ID for isolation\n spaceId: conversationId,\n });\n\n conversation = {\n channelId: source,\n agent,\n startedAt: new Date(),\n };\n this.conversations.set(conversationId, conversation);\n }\n\n // Execute and stream response\n try {\n const result = await conversation.agent.streamText({\n messages: [{ role: \"user\", content }],\n metadata: { userId, source },\n });\n\n const channel = this.channels.get(source);\n if (!channel) {\n log.error(\"Channel not found\", { source });\n return;\n }\n\n // Stream events back to channel\n for await (const chunk of result.fullStream) {\n await channel.stream(conversationId, this.mapToStreamEvent(chunk));\n }\n\n // Send done event\n await channel.stream(conversationId, {\n type: \"done\",\n agentId: conversation.agent.spaceId,\n });\n } catch (error: any) {\n log.error(\"Error processing message\", {\n data: { error: String((error as Error)?.message ?? error) },\n });\n\n const channel = this.channels.get(source);\n if (channel) {\n await channel.stream(conversationId, {\n type: \"error\",\n error: error.message,\n agentId: conversation?.agent?.spaceId || \"unknown\",\n });\n }\n }\n }\n\n /**\n * Handle interrupt signal\n */\n async handleInterrupt(signal: InterruptSignal): Promise<void> {\n const conversation = this.conversations.get(signal.conversationId);\n if (conversation) {\n conversation.agent.stop();\n this.conversations.delete(signal.conversationId);\n log.info(\"Interrupted conversation\", {\n conversationId: signal.conversationId,\n });\n }\n }\n\n /**\n * Map AI SDK stream chunk to AgentStreamEvent\n */\n private mapToStreamEvent(chunk: any): AgentStreamEvent {\n if (chunk.type === \"text-delta\") {\n return {\n type: \"text-delta\",\n content: chunk.textDelta,\n agentId: \"viber\",\n };\n }\n if (chunk.type === \"tool-call\") {\n return {\n type: \"tool-call\",\n tool: chunk.toolName,\n args: chunk.args,\n agentId: \"viber\",\n };\n }\n if (chunk.type === \"tool-result\") {\n return {\n type: \"tool-result\",\n tool: chunk.toolName,\n result: chunk.result,\n agentId: \"viber\",\n };\n }\n // Default passthrough\n return {\n type: \"state-change\",\n state: chunk.type,\n agentId: \"viber\",\n };\n }\n}\n\n// Singleton instance\nexport const channelManager = new ChannelManager();\n","import type { IncomingHttpHeaders } from \"http\";\n\n/**\n * GatewayRequest is the normalized HTTP request payload passed to channel webhook handlers.\n */\nexport interface GatewayRequest {\n method: string;\n path: string;\n headers: IncomingHttpHeaders;\n query: URLSearchParams;\n body: string;\n json?: unknown;\n}\n\n/**\n * GatewayResponse is the normalized HTTP response returned by webhook handlers.\n */\nexport interface GatewayResponse {\n status: number;\n headers?: Record<string, string>;\n body?: string;\n json?: unknown;\n}\n\nexport interface ChannelWebhookRoute {\n method: \"GET\" | \"POST\";\n path: string;\n handler: (req: GatewayRequest) => Promise<GatewayResponse>;\n}\n\nexport interface WebhookChannel {\n getWebhookRoutes(): ChannelWebhookRoute[];\n}\n\nexport function isWebhookChannel(channel: unknown): channel is WebhookChannel {\n return typeof (channel as WebhookChannel)?.getWebhookRoutes === \"function\";\n}\n","import { createServer, IncomingMessage, ServerResponse } from \"http\";\nimport { URL } from \"url\";\nimport type { Channel } from \"./channel\";\nimport type { ChannelManager } from \"./manager\";\nimport { isWebhookChannel, type ChannelWebhookRoute, type GatewayRequest } from \"./webhook\";\n\nexport interface ChannelGatewayConfig {\n host: string;\n port: number;\n /** Optional base path prefix for webhook routes */\n basePath?: string;\n}\n\n/**\n * ChannelGateway wires channel plugins to HTTP webhooks and the channel manager.\n * It provides a universal integration surface for webhook-based channels.\n */\nexport class ChannelGateway {\n private server: ReturnType<typeof createServer> | null = null;\n private routes = new Map<string, ChannelWebhookRoute>();\n\n constructor(\n private config: ChannelGatewayConfig,\n private channels: Channel[],\n private manager: ChannelManager,\n ) {}\n\n /**\n * Start all channels and webhook server (if needed).\n */\n async start(): Promise<void> {\n for (const channel of this.channels) {\n this.manager.register(channel);\n if (isWebhookChannel(channel)) {\n for (const route of channel.getWebhookRoutes()) {\n const fullPath = joinPaths(this.config.basePath, route.path);\n const key = `${route.method} ${fullPath}`;\n if (this.routes.has(key)) {\n throw new Error(`Duplicate webhook route: ${key}`);\n }\n this.routes.set(key, { ...route, path: fullPath });\n }\n }\n }\n\n await this.manager.startAll();\n\n if (this.routes.size === 0) {\n return;\n }\n\n await this.startServer();\n }\n\n /**\n * Stop webhook server and all channels.\n */\n async stop(): Promise<void> {\n await this.manager.stopAll();\n if (this.server) {\n await new Promise<void>((resolve) => {\n this.server?.close(() => resolve());\n });\n this.server = null;\n }\n }\n\n private async startServer(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.server = createServer((req, res) => this.handleRequest(req, res));\n this.server.on(\"error\", (err) => reject(err));\n this.server.listen(this.config.port, this.config.host, () => resolve());\n });\n }\n\n private async handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n ): Promise<void> {\n try {\n const method = (req.method || \"GET\").toUpperCase();\n const url = new URL(req.url || \"/\", `http://${this.config.host}:${this.config.port}`);\n const key = `${method} ${url.pathname}`;\n const route = this.routes.get(key);\n\n if (!route) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n return;\n }\n\n const body = await readRequestBody(req);\n let json: unknown;\n const contentType = String(req.headers[\"content-type\"] || \"\");\n if (contentType.includes(\"application/json\")) {\n try {\n json = body ? JSON.parse(body) : undefined;\n } catch {\n json = undefined;\n }\n }\n\n const request: GatewayRequest = {\n method,\n path: url.pathname,\n headers: req.headers,\n query: url.searchParams,\n body,\n json,\n };\n\n const response = await route.handler(request);\n respond(res, response);\n } catch (error: any) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: error?.message || \"Gateway error\" }));\n }\n }\n}\n\nfunction joinPaths(basePath: string | undefined, routePath: string): string {\n const base = basePath ? `/${basePath}`.replace(/\\/+/g, \"/\") : \"\";\n const route = `/${routePath}`.replace(/\\/+/g, \"/\");\n if (!base || base === \"/\") {\n return route;\n }\n return `${base.replace(/\\/$/, \"\")}${route}`;\n}\n\nfunction respond(res: ServerResponse, response: { status: number; headers?: Record<string, string>; body?: string; json?: unknown }): void {\n const headers = response.headers ?? {};\n if (response.json !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n res.writeHead(response.status, headers);\n if (response.json !== undefined) {\n res.end(JSON.stringify(response.json));\n return;\n }\n res.end(response.body ?? \"\");\n}\n\nasync function readRequestBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf8\")));\n req.on(\"error\", (err) => reject(err));\n });\n}\n","import * as fs from \"fs/promises\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport * as YAML from \"yaml\";\nimport type { ChannelsConfig } from \"./channel\";\nimport type { ChannelGatewayConfig } from \"./gateway\";\n\nexport type GatewayConfigSource = \"remote\" | \"local\" | \"env\" | \"default\";\n\nexport interface GatewayBootstrapConfig {\n gateway: ChannelGatewayConfig;\n channels: ChannelsConfig;\n source: GatewayConfigSource;\n}\n\ninterface SavedCliConfig {\n mode?: string;\n viberId?: string;\n name?: string;\n gatewayUrl?: string;\n /** @deprecated Use gatewayUrl instead */\n boardUrl?: string;\n /** @deprecated Use gatewayUrl instead */\n hubUrl?: string;\n authToken?: string;\n webUrl?: string;\n onboardedAt?: string;\n}\n\nconst DEFAULT_GATEWAY: ChannelGatewayConfig = {\n host: \"127.0.0.1\",\n port: 6009,\n basePath: \"\",\n};\n\nconst CONFIG_FILE = path.join(os.homedir(), \".openviber\", \"config.yaml\");\n\n/**\n * Resolve gateway and channel configuration from web, local file, or env.\n */\nexport async function loadGatewayBootstrapConfig(\n overrides: Partial<ChannelGatewayConfig> = {},\n): Promise<GatewayBootstrapConfig> {\n const remote = await loadRemoteNodeConfig();\n if (remote) {\n return {\n gateway: mergeGatewayConfig(remote.gateway, overrides),\n channels: remote.channels ?? {},\n source: \"remote\",\n };\n }\n\n const local = await loadLocalConfig();\n if (local) {\n return {\n gateway: mergeGatewayConfig(local.gateway, overrides),\n channels: local.channels ?? {},\n source: \"local\",\n };\n }\n\n const envChannels = loadEnvChannels();\n if (Object.keys(envChannels).length > 0) {\n return {\n gateway: mergeGatewayConfig(undefined, overrides),\n channels: envChannels,\n source: \"env\",\n };\n }\n\n return {\n gateway: mergeGatewayConfig(undefined, overrides),\n channels: {},\n source: \"default\",\n };\n}\n\nfunction mergeGatewayConfig(\n base?: Partial<ChannelGatewayConfig>,\n overrides?: Partial<ChannelGatewayConfig>,\n): ChannelGatewayConfig {\n return {\n host: overrides?.host || base?.host || DEFAULT_GATEWAY.host,\n port: overrides?.port || base?.port || DEFAULT_GATEWAY.port,\n basePath: overrides?.basePath ?? base?.basePath ?? DEFAULT_GATEWAY.basePath,\n };\n}\n\nasync function loadRemoteNodeConfig(): Promise<{\n gateway?: Partial<ChannelGatewayConfig>;\n channels?: ChannelsConfig;\n} | null> {\n const saved = await loadSavedCliConfig();\n if (!saved?.webUrl || !saved?.authToken || !saved?.viberId) {\n return null;\n }\n\n try {\n const url = `${saved.webUrl.replace(/\\/$/, \"\")}/api/vibers/${saved.viberId}/config`;\n const response = await fetch(url, {\n headers: { Authorization: `Bearer ${saved.authToken}` },\n });\n if (!response.ok) return null;\n const payload = (await response.json()) as any;\n const config = payload?.config;\n if (!config || typeof config !== \"object\") return null;\n return {\n gateway: config.gateway ?? undefined,\n channels: config.channels ?? undefined,\n };\n } catch {\n return null;\n }\n}\n\nasync function loadLocalConfig(): Promise<{\n gateway?: Partial<ChannelGatewayConfig>;\n channels?: ChannelsConfig;\n} | null> {\n try {\n const raw = await fs.readFile(CONFIG_FILE, \"utf8\");\n const parsed = YAML.parse(raw);\n if (!parsed || typeof parsed !== \"object\") return null;\n if (!(\"gateway\" in parsed) && !(\"channels\" in parsed)) {\n return null;\n }\n return {\n gateway: parsed.gateway ?? undefined,\n channels: parsed.channels ?? undefined,\n };\n } catch {\n return null;\n }\n}\n\nasync function loadSavedCliConfig(): Promise<SavedCliConfig | null> {\n try {\n const raw = await fs.readFile(CONFIG_FILE, \"utf8\");\n const parsed = YAML.parse(raw) as SavedCliConfig;\n if (parsed && typeof parsed === \"object\") {\n return parsed;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction loadEnvChannels(): ChannelsConfig {\n const channels: ChannelsConfig = {};\n\n if (process.env.DINGTALK_APP_KEY && process.env.DINGTALK_APP_SECRET) {\n channels.dingtalk = {\n enabled: true,\n appKey: process.env.DINGTALK_APP_KEY,\n appSecret: process.env.DINGTALK_APP_SECRET,\n robotCode: process.env.DINGTALK_ROBOT_CODE,\n };\n }\n\n if (\n process.env.WECOM_CORP_ID &&\n process.env.WECOM_AGENT_SECRET &&\n process.env.WECOM_TOKEN &&\n process.env.WECOM_ENCODING_AES_KEY\n ) {\n channels.wecom = {\n enabled: true,\n corpId: process.env.WECOM_CORP_ID,\n agentId: process.env.WECOM_AGENT_ID || \"0\",\n secret: process.env.WECOM_AGENT_SECRET,\n token: process.env.WECOM_TOKEN,\n aesKey: process.env.WECOM_ENCODING_AES_KEY,\n };\n }\n\n\n if (process.env.WECHAT_API_KEY && process.env.WECHAT_PROXY_URL) {\n channels.wechat = {\n enabled: true,\n apiKey: process.env.WECHAT_API_KEY,\n proxyUrl: process.env.WECHAT_PROXY_URL,\n accountId: process.env.WECHAT_ACCOUNT_ID,\n };\n }\n\n if (process.env.DISCORD_BOT_TOKEN) {\n channels.discord = {\n enabled: true,\n botToken: process.env.DISCORD_BOT_TOKEN,\n appId: process.env.DISCORD_APP_ID,\n allowGuildIds: splitList(process.env.DISCORD_ALLOW_GUILDS),\n allowChannelIds: splitList(process.env.DISCORD_ALLOW_CHANNELS),\n allowUserIds: splitList(process.env.DISCORD_ALLOW_USERS),\n requireMention: parseBool(process.env.DISCORD_REQUIRE_MENTION, true),\n replyMode: (process.env.DISCORD_REPLY_MODE as \"reply\" | \"channel\") || undefined,\n };\n }\n\n if (process.env.FEISHU_APP_ID && process.env.FEISHU_APP_SECRET) {\n channels.feishu = {\n enabled: true,\n appId: process.env.FEISHU_APP_ID,\n appSecret: process.env.FEISHU_APP_SECRET,\n verificationToken: process.env.FEISHU_VERIFICATION_TOKEN,\n encryptKey: process.env.FEISHU_ENCRYPT_KEY,\n domain: process.env.FEISHU_DOMAIN,\n connectionMode: (process.env.FEISHU_CONNECTION_MODE as\n | \"websocket\"\n | \"webhook\") ?? \"websocket\",\n webhookPath: process.env.FEISHU_WEBHOOK_PATH,\n allowGroupMessages: parseBool(process.env.FEISHU_ALLOW_GROUPS, false),\n requireMention: parseBool(process.env.FEISHU_REQUIRE_MENTION, true),\n };\n }\n\n return channels;\n}\n\nfunction splitList(value?: string): string[] | undefined {\n if (!value) return undefined;\n const items = value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n return items.length > 0 ? items : undefined;\n}\n\nfunction parseBool(value: string | undefined, fallback: boolean): boolean {\n if (value === undefined) return fallback;\n if (value === \"true\" || value === \"1\" || value === \"yes\") return true;\n if (value === \"false\" || value === \"0\" || value === \"no\") return false;\n return fallback;\n}\n","/**\n * DingTalk Channel\n *\n * Integrates with DingTalk Enterprise Bot via webhook.\n * Receives messages via HTTP POST and sends replies via DingTalk API.\n *\n * @see https://open.dingtalk.com/document/orgapp/receive-message\n */\n\nimport crypto from \"crypto\";\nimport {\n Channel,\n ChannelRuntimeContext,\n InboundMessage,\n AgentStreamEvent,\n DingTalkConfig,\n} from \"./channel\";\nimport type { ChannelWebhookRoute, GatewayRequest } from \"./webhook\";\n\n// ==================== DingTalk Types ====================\n\ninterface DingTalkWebhookPayload {\n msgtype: string;\n text?: { content: string };\n msgId: string;\n createAt: number;\n conversationType: string;\n conversationId: string;\n conversationTitle?: string;\n senderId: string;\n senderNick: string;\n senderCorpId?: string;\n sessionWebhook: string;\n sessionWebhookExpiredTime: number;\n isAdmin?: boolean;\n robotCode?: string;\n}\n\ninterface DingTalkOutgoingMessage {\n msgtype: \"text\" | \"markdown\" | \"actionCard\";\n text?: { content: string };\n markdown?: { title: string; text: string };\n actionCard?: {\n title: string;\n text: string;\n singleTitle?: string;\n singleURL?: string;\n };\n}\n\n// ==================== Channel Implementation ====================\n\nexport class DingTalkChannel implements Channel {\n id = \"dingtalk\";\n type = \"webhook\" as const;\n\n private config: DingTalkConfig;\n private context: ChannelRuntimeContext;\n private sessionWebhooks = new Map<string, string>();\n private responseBuffers = new Map<string, string>();\n\n constructor(config: DingTalkConfig, context: ChannelRuntimeContext) {\n this.config = config;\n this.context = context;\n }\n\n async start(): Promise<void> {\n console.log(\"[DingTalk] Channel started\");\n }\n\n async stop(): Promise<void> {\n this.sessionWebhooks.clear();\n this.responseBuffers.clear();\n console.log(\"[DingTalk] Channel stopped\");\n }\n\n /**\n * Verify webhook signature\n */\n verifySignature(timestamp: string, sign: string): boolean {\n const stringToSign = timestamp + \"\\n\" + this.config.appSecret;\n const hmac = crypto.createHmac(\"sha256\", this.config.appSecret);\n hmac.update(stringToSign);\n const expectedSign = hmac.digest(\"base64\");\n return sign === expectedSign;\n }\n\n /**\n * Parse webhook payload to InboundMessage\n */\n parseWebhook(payload: DingTalkWebhookPayload): InboundMessage {\n // Store session webhook for replying\n this.sessionWebhooks.set(payload.conversationId, payload.sessionWebhook);\n\n return {\n id: payload.msgId,\n source: this.id,\n userId: payload.senderId,\n conversationId: payload.conversationId,\n content: payload.text?.content || \"\",\n metadata: {\n senderNick: payload.senderNick,\n conversationType: payload.conversationType,\n conversationTitle: payload.conversationTitle,\n robotCode: payload.robotCode,\n },\n };\n }\n\n async handleMessage(message: InboundMessage): Promise<void> {\n // Initialize buffer for streaming response\n this.responseBuffers.set(message.conversationId, \"\");\n }\n\n async stream(\n conversationId: string,\n event: AgentStreamEvent\n ): Promise<void> {\n const sessionWebhook = this.sessionWebhooks.get(conversationId);\n if (!sessionWebhook) {\n console.error(\n `[DingTalk] No session webhook for conversation: ${conversationId}`\n );\n return;\n }\n\n if (event.type === \"text-delta\") {\n // Buffer text deltas\n const current = this.responseBuffers.get(conversationId) || \"\";\n this.responseBuffers.set(conversationId, current + event.content);\n } else if (event.type === \"done\") {\n // Send complete response\n const text = this.responseBuffers.get(conversationId) || \"\";\n await this.sendMessage(sessionWebhook, {\n msgtype: \"markdown\",\n markdown: {\n title: \"Reply\",\n text: text,\n },\n });\n this.responseBuffers.delete(conversationId);\n } else if (event.type === \"error\") {\n // Send error message\n await this.sendMessage(sessionWebhook, {\n msgtype: \"text\",\n text: { content: `Error: ${event.error}` },\n });\n this.responseBuffers.delete(conversationId);\n }\n }\n\n getWebhookRoutes(): ChannelWebhookRoute[] {\n return [\n {\n method: \"POST\",\n path: \"/webhook/dingtalk\",\n handler: async (req) => this.handleWebhook(req),\n },\n ];\n }\n\n private async handleWebhook(req: GatewayRequest) {\n const payload = (req.json || safeJsonParse(req.body)) as DingTalkWebhookPayload;\n if (!payload) {\n return { status: 400, json: { error: \"Invalid payload\" } };\n }\n\n const timestamp =\n req.query.get(\"timestamp\") ||\n (typeof req.headers[\"timestamp\"] === \"string\" ? req.headers[\"timestamp\"] : \"\");\n const sign =\n req.query.get(\"sign\") ||\n (typeof req.headers[\"sign\"] === \"string\" ? req.headers[\"sign\"] : \"\");\n\n if (timestamp && sign && !this.verifySignature(timestamp, sign)) {\n return { status: 401, json: { error: \"Invalid signature\" } };\n }\n\n const inbound = this.parseWebhook(payload);\n await this.handleMessage(inbound);\n await this.context.routeMessage(inbound);\n return { status: 200, json: { ok: true } };\n }\n\n /**\n * Send message via DingTalk session webhook\n */\n private async sendMessage(\n webhookUrl: string,\n message: DingTalkOutgoingMessage\n ): Promise<void> {\n try {\n const response = await fetch(webhookUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(message),\n });\n\n if (!response.ok) {\n const error = await response.text();\n console.error(\"[DingTalk] Send message failed:\", error);\n }\n } catch (error) {\n console.error(\"[DingTalk] Send message error:\", error);\n }\n }\n}\n\nfunction safeJsonParse(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n","/**\n * WeCom (WeChat Work) Channel\n *\n * Integrates with WeCom Enterprise Application via webhook.\n * Receives encrypted XML messages and sends replies via WeCom API.\n *\n * @see https://developer.work.weixin.qq.com/document/path/90930\n */\n\nimport crypto from \"crypto\";\nimport {\n Channel,\n ChannelRuntimeContext,\n InboundMessage,\n AgentStreamEvent,\n WeComConfig,\n} from \"./channel\";\nimport type { ChannelWebhookRoute, GatewayRequest } from \"./webhook\";\n\n// ==================== WeCom Types ====================\n\ninterface WeComMessage {\n ToUserName: string;\n FromUserName: string;\n CreateTime: number;\n MsgType: string;\n Content?: string;\n MsgId?: string;\n AgentID?: number;\n}\n\n// ==================== Crypto Utils ====================\n\nclass WeComCrypto {\n private token: string;\n private aesKey: Buffer;\n private corpId: string;\n\n constructor(token: string, encodingAESKey: string, corpId: string) {\n this.token = token;\n this.corpId = corpId;\n // AES key is base64 encoded + \"=\" padding, decode to 32 bytes\n this.aesKey = Buffer.from(encodingAESKey + \"=\", \"base64\");\n }\n\n /**\n * Verify callback URL signature\n */\n verifySignature(\n signature: string,\n timestamp: string,\n nonce: string,\n echostr?: string\n ): boolean {\n const sortedParams = [this.token, timestamp, nonce, echostr || \"\"]\n .filter(Boolean)\n .sort()\n .join(\"\");\n const hash = crypto.createHash(\"sha1\").update(sortedParams).digest(\"hex\");\n return hash === signature;\n }\n\n /**\n * Decrypt message\n */\n decrypt(encrypted: string): string {\n const decipher = crypto.createDecipheriv(\n \"aes-256-cbc\",\n this.aesKey,\n this.aesKey.subarray(0, 16)\n );\n decipher.setAutoPadding(false);\n\n let decrypted = Buffer.concat([\n decipher.update(Buffer.from(encrypted, \"base64\")),\n decipher.final(),\n ]);\n\n // Remove PKCS7 padding\n const padLen = decrypted[decrypted.length - 1];\n decrypted = decrypted.subarray(0, decrypted.length - padLen);\n\n // Format: random(16) + msgLen(4) + msg + corpId\n const msgLen = decrypted.readUInt32BE(16);\n const content = decrypted.subarray(20, 20 + msgLen).toString(\"utf-8\");\n\n return content;\n }\n\n /**\n * Encrypt message for reply\n */\n encrypt(message: string): string {\n const random = crypto.randomBytes(16);\n const msgBuffer = Buffer.from(message, \"utf-8\");\n const msgLen = Buffer.alloc(4);\n msgLen.writeUInt32BE(msgBuffer.length);\n const corpIdBuffer = Buffer.from(this.corpId, \"utf-8\");\n\n const plaintext = Buffer.concat([\n random,\n msgLen,\n msgBuffer,\n corpIdBuffer,\n ]);\n\n // PKCS7 padding\n const blockSize = 32;\n const padLen = blockSize - (plaintext.length % blockSize);\n const padding = Buffer.alloc(padLen, padLen);\n const padded = Buffer.concat([plaintext, padding]);\n\n const cipher = crypto.createCipheriv(\n \"aes-256-cbc\",\n this.aesKey,\n this.aesKey.subarray(0, 16)\n );\n cipher.setAutoPadding(false);\n\n const encrypted = Buffer.concat([cipher.update(padded), cipher.final()]);\n return encrypted.toString(\"base64\");\n }\n}\n\n// ==================== Channel Implementation ====================\n\nexport class WeComChannel implements Channel {\n id = \"wecom\";\n type = \"webhook\" as const;\n\n private config: WeComConfig;\n private crypto: WeComCrypto;\n private context: ChannelRuntimeContext;\n private accessToken: string | null = null;\n private tokenExpiry: number = 0;\n private responseBuffers = new Map<string, string>();\n\n constructor(config: WeComConfig, context: ChannelRuntimeContext) {\n this.config = config;\n this.crypto = new WeComCrypto(config.token, config.aesKey, config.corpId);\n this.context = context;\n }\n\n async start(): Promise<void> {\n await this.refreshAccessToken();\n console.log(\"[WeCom] Channel started\");\n }\n\n async stop(): Promise<void> {\n this.accessToken = null;\n this.responseBuffers.clear();\n console.log(\"[WeCom] Channel stopped\");\n }\n\n /**\n * Verify URL callback (for WeCom verification)\n */\n verifyUrl(\n signature: string,\n timestamp: string,\n nonce: string,\n echostr: string\n ): string | null {\n if (this.crypto.verifySignature(signature, timestamp, nonce, echostr)) {\n return this.crypto.decrypt(echostr);\n }\n return null;\n }\n\n /**\n * Parse XML webhook payload\n */\n parseWebhook(xmlContent: string, encrypted: string): InboundMessage | null {\n const decrypted = this.crypto.decrypt(encrypted);\n\n // Simple XML parsing (in production, use a proper XML parser)\n const getTag = (xml: string, tag: string): string => {\n const match = xml.match(new RegExp(`<${tag}><\\\\!\\\\[CDATA\\\\[(.+?)\\\\]\\\\]></${tag}>`));\n return match ? match[1] : \"\";\n };\n\n const fromUser = getTag(decrypted, \"FromUserName\");\n const content = getTag(decrypted, \"Content\");\n const msgId = getTag(decrypted, \"MsgId\");\n\n if (!content) return null;\n\n return {\n id: msgId || crypto.randomUUID(),\n source: this.id,\n userId: fromUser,\n conversationId: fromUser, // Use user ID as conversation ID\n content: content,\n metadata: {\n corpId: this.config.corpId,\n agentId: this.config.agentId,\n },\n };\n }\n\n async handleMessage(message: InboundMessage): Promise<void> {\n this.responseBuffers.set(message.conversationId, \"\");\n }\n\n async stream(\n conversationId: string,\n event: AgentStreamEvent\n ): Promise<void> {\n if (event.type === \"text-delta\") {\n const current = this.responseBuffers.get(conversationId) || \"\";\n this.responseBuffers.set(conversationId, current + event.content);\n } else if (event.type === \"done\") {\n const text = this.responseBuffers.get(conversationId) || \"\";\n await this.sendMessage(conversationId, text);\n this.responseBuffers.delete(conversationId);\n } else if (event.type === \"error\") {\n await this.sendMessage(conversationId, `Error: ${event.error}`);\n this.responseBuffers.delete(conversationId);\n }\n }\n\n getWebhookRoutes(): ChannelWebhookRoute[] {\n return [\n {\n method: \"GET\",\n path: \"/webhook/wecom\",\n handler: async (req) => this.handleWebhookVerify(req),\n },\n {\n method: \"POST\",\n path: \"/webhook/wecom\",\n handler: async (req) => this.handleWebhookMessage(req),\n },\n ];\n }\n\n private async handleWebhookVerify(req: GatewayRequest) {\n const signature = req.query.get(\"msg_signature\") || \"\";\n const timestamp = req.query.get(\"timestamp\") || \"\";\n const nonce = req.query.get(\"nonce\") || \"\";\n const echostr = req.query.get(\"echostr\") || \"\";\n\n if (!signature || !timestamp || !nonce || !echostr) {\n return { status: 400, json: { error: \"Missing verification parameters\" } };\n }\n\n const decrypted = this.verifyUrl(signature, timestamp, nonce, echostr);\n if (!decrypted) {\n return { status: 401, json: { error: \"Invalid signature\" } };\n }\n\n return { status: 200, body: decrypted };\n }\n\n private async handleWebhookMessage(req: GatewayRequest) {\n const signature = req.query.get(\"msg_signature\") || \"\";\n const timestamp = req.query.get(\"timestamp\") || \"\";\n const nonce = req.query.get(\"nonce\") || \"\";\n\n const encrypted = extractXmlTag(req.body, \"Encrypt\");\n if (!encrypted) {\n return { status: 400, json: { error: \"Missing encrypted payload\" } };\n }\n\n if (!this.crypto.verifySignature(signature, timestamp, nonce, encrypted)) {\n return { status: 401, json: { error: \"Invalid signature\" } };\n }\n\n const inbound = this.parseWebhook(req.body, encrypted);\n if (inbound) {\n await this.handleMessage(inbound);\n await this.context.routeMessage(inbound);\n }\n\n return { status: 200, body: \"success\" };\n }\n\n /**\n * Send message via WeCom API\n */\n private async sendMessage(userId: string, content: string): Promise<void> {\n const token = await this.getAccessToken();\n const url = `https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${token}`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n touser: userId,\n msgtype: \"markdown\",\n agentid: this.config.agentId,\n markdown: { content },\n }),\n });\n\n const result = await response.json();\n if (result.errcode !== 0) {\n console.error(\"[WeCom] Send message failed:\", result);\n }\n } catch (error) {\n console.error(\"[WeCom] Send message error:\", error);\n }\n }\n\n /**\n * Get access token (with caching)\n */\n private async getAccessToken(): Promise<string> {\n if (this.accessToken && Date.now() < this.tokenExpiry) {\n return this.accessToken;\n }\n await this.refreshAccessToken();\n return this.accessToken!;\n }\n\n /**\n * Refresh access token from WeCom API\n */\n private async refreshAccessToken(): Promise<void> {\n const url = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${this.config.corpId}&corpsecret=${this.config.secret}`;\n\n try {\n const response = await fetch(url);\n const result = await response.json();\n\n if (result.errcode === 0) {\n this.accessToken = result.access_token;\n // Token expires in 2 hours, refresh 5 minutes early\n this.tokenExpiry = Date.now() + (result.expires_in - 300) * 1000;\n } else {\n console.error(\"[WeCom] Get token failed:\", result);\n }\n } catch (error) {\n console.error(\"[WeCom] Get token error:\", error);\n }\n }\n}\n\nfunction extractXmlTag(xml: string, tag: string): string | null {\n const match = xml.match(new RegExp(`<${tag}><\\\\!\\\\[CDATA\\\\[(.+?)\\\\]\\\\]></${tag}>`));\n return match ? match[1] : null;\n}\n","/**\n * WeChat (微信) Channel\n *\n * Integrates with a proxy-based WeChat API service and receives inbound\n * webhook events forwarded to OpenViber.\n */\n\nimport {\n Channel,\n ChannelRuntimeContext,\n InboundMessage,\n AgentStreamEvent,\n WeChatConfig,\n} from \"./channel\";\nimport type { ChannelWebhookRoute, GatewayRequest } from \"./webhook\";\n\ninterface WeChatWebhookPayload {\n messageType?: string;\n wcId?: string;\n fromUser?: string;\n toUser?: string;\n fromGroup?: string;\n content?: string;\n newMsgId?: string | number;\n timestamp?: number;\n contentType?: string;\n raw?: unknown;\n data?: {\n fromUser?: string;\n toUser?: string;\n fromGroup?: string;\n content?: string;\n newMsgId?: string | number;\n timestamp?: number;\n };\n}\n\ninterface WeChatProxyResponse {\n code?: string;\n message?: string;\n error?: string;\n data?: unknown;\n}\n\ninterface NormalizedPayload {\n messageType: string;\n wcId: string;\n fromUser: string;\n toUser?: string;\n fromGroup?: string;\n content: string;\n newMsgId?: string | number;\n timestamp?: number;\n raw: unknown;\n}\n\n/**\n * WeChat webhook and proxy transport channel.\n */\nexport class WeChatChannel implements Channel {\n id = \"wechat\";\n type = \"webhook\" as const;\n\n private config: WeChatConfig;\n private context: ChannelRuntimeContext;\n private responseBuffers = new Map<string, string>();\n private replyTargets = new Map<string, string>();\n\n constructor(config: WeChatConfig, context: ChannelRuntimeContext) {\n this.config = config;\n this.context = context;\n }\n\n async start(): Promise<void> {\n console.log(\"[WeChat] Channel started\");\n }\n\n async stop(): Promise<void> {\n this.responseBuffers.clear();\n this.replyTargets.clear();\n console.log(\"[WeChat] Channel stopped\");\n }\n\n /**\n * Parse incoming webhook payload to a normalized inbound message.\n */\n parseWebhook(payload: WeChatWebhookPayload): InboundMessage | null {\n const normalized = normalizePayload(payload);\n if (!normalized) return null;\n\n if (normalized.messageType === \"30000\") {\n return null;\n }\n\n if (!isChatMessageType(normalized.messageType)) {\n return null;\n }\n\n if (!normalized.content?.trim()) {\n return null;\n }\n\n const isGroup = normalized.messageType.startsWith(\"8\");\n const conversationId = isGroup\n ? `wechat:group:${normalized.fromGroup || normalized.fromUser}`\n : `wechat:direct:${normalized.fromUser}`;\n\n const replyTo = isGroup\n ? normalized.fromGroup || normalized.fromUser\n : normalized.fromUser;\n\n this.replyTargets.set(conversationId, replyTo);\n\n return {\n id: String(normalized.newMsgId || `${Date.now()}`),\n source: this.id,\n userId: normalized.fromUser,\n conversationId,\n content: normalized.content,\n metadata: {\n accountId: this.config.accountId || \"default\",\n wcId: normalized.wcId,\n replyTo,\n isGroup,\n messageType: normalized.messageType,\n toUser: normalized.toUser,\n },\n };\n }\n\n async handleMessage(message: InboundMessage): Promise<void> {\n this.responseBuffers.set(message.conversationId, \"\");\n const replyTo = String(message.metadata?.replyTo || \"\");\n if (replyTo) {\n this.replyTargets.set(message.conversationId, replyTo);\n }\n }\n\n async stream(conversationId: string, event: AgentStreamEvent): Promise<void> {\n if (event.type === \"text-delta\") {\n const current = this.responseBuffers.get(conversationId) || \"\";\n this.responseBuffers.set(conversationId, `${current}${event.content}`);\n return;\n }\n\n if (event.type === \"done\") {\n const text = this.responseBuffers.get(conversationId) || \"\";\n if (text.trim()) {\n await this.sendText(conversationId, text);\n }\n this.responseBuffers.delete(conversationId);\n this.replyTargets.delete(conversationId);\n return;\n }\n\n if (event.type === \"error\") {\n await this.sendText(conversationId, `Error: ${event.error}`);\n this.responseBuffers.delete(conversationId);\n this.replyTargets.delete(conversationId);\n }\n }\n\n /**\n * Return webhook routes for WeChat callback ingestion.\n */\n getWebhookRoutes(): ChannelWebhookRoute[] {\n return [\n {\n method: \"POST\",\n path: \"/webhook/wechat\",\n handler: async (req) => this.handleWebhook(req),\n },\n ];\n }\n\n private async handleWebhook(req: GatewayRequest) {\n const payload = (req.json || safeJsonParse(req.body)) as WeChatWebhookPayload;\n if (!payload || typeof payload !== \"object\") {\n return { status: 400, json: { error: \"Invalid payload\" } };\n }\n\n const inbound = this.parseWebhook(payload);\n if (inbound) {\n await this.handleMessage(inbound);\n await this.context.routeMessage(inbound);\n }\n\n return { status: 200, body: \"OK\" };\n }\n\n private async sendText(conversationId: string, content: string): Promise<void> {\n const replyTo = this.replyTargets.get(conversationId);\n if (!replyTo) {\n console.error(`[WeChat] Missing reply target for conversation: ${conversationId}`);\n return;\n }\n\n const result = await this.proxyRequest(\"/v1/sendText\", {\n wcId: replyTo,\n content,\n });\n\n if (result.code && !isProxySuccessCode(result.code)) {\n console.error(\"[WeChat] Send message failed:\", result);\n }\n }\n\n private async proxyRequest(endpoint: string, body: Record<string, unknown>): Promise<WeChatProxyResponse> {\n const base = this.config.proxyUrl.replace(/\\/$/, \"\");\n const response = await fetch(`${base}${endpoint}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.config.apiKey,\n \"X-Account-ID\": this.config.accountId || \"default\",\n },\n body: JSON.stringify(body),\n });\n\n const json = (await response.json().catch(() => ({}))) as WeChatProxyResponse;\n\n if (!response.ok) {\n throw new Error(json.error || json.message || `HTTP ${response.status}`);\n }\n\n return json;\n }\n}\n\nfunction isProxySuccessCode(code: string): boolean {\n return code === \"1000\" || code === \"1001\" || code === \"1002\";\n}\n\nfunction isChatMessageType(messageType?: string): boolean {\n if (!messageType) return false;\n return messageType.startsWith(\"6\") || messageType.startsWith(\"8\");\n}\n\nfunction normalizePayload(payload: WeChatWebhookPayload): NormalizedPayload | null {\n if (!payload.messageType || !payload.wcId) {\n return null;\n }\n\n if (payload.fromUser) {\n return {\n messageType: payload.messageType,\n wcId: payload.wcId,\n fromUser: payload.fromUser,\n toUser: payload.toUser,\n fromGroup: payload.fromGroup,\n content: payload.content ?? \"\",\n newMsgId: payload.newMsgId,\n timestamp: payload.timestamp,\n raw: payload.raw ?? payload,\n };\n }\n\n const nested = payload.data || {};\n if (!nested.fromUser) {\n return null;\n }\n\n return {\n messageType: payload.messageType,\n wcId: payload.wcId,\n fromUser: nested.fromUser,\n toUser: nested.toUser,\n fromGroup: nested.fromGroup,\n content: nested.content ?? \"\",\n newMsgId: nested.newMsgId,\n timestamp: nested.timestamp,\n raw: payload,\n };\n}\n\nfunction safeJsonParse(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n","/**\n * Web Channel\n *\n * Simple HTTP/SSE channel for web-based chat interfaces.\n * Receives messages via POST and streams responses via SSE.\n * No database required - uses in-memory state.\n */\n\nimport { EventEmitter } from \"events\";\nimport {\n Channel,\n InboundMessage,\n AgentStreamEvent,\n WebConfig,\n} from \"./channel\";\n\n// ==================== Types ====================\n\ninterface WebMessage {\n conversationId: string;\n content: string;\n userId?: string;\n}\n\n// ==================== Channel Implementation ====================\n\nexport class WebChannel extends EventEmitter implements Channel {\n id = \"web\";\n type = \"sse\" as const;\n\n private config: WebConfig;\n private sseConnections = new Map<string, Set<(event: AgentStreamEvent) => void>>();\n\n constructor(config: WebConfig = { enabled: true }) {\n super();\n this.config = config;\n }\n\n async start(): Promise<void> {\n console.log(\"[Web] Channel started\");\n }\n\n async stop(): Promise<void> {\n // Close all SSE connections\n for (const [conversationId, listeners] of this.sseConnections) {\n for (const listener of listeners) {\n listener({ type: \"done\", agentId: \"system\" });\n }\n }\n this.sseConnections.clear();\n console.log(\"[Web] Channel stopped\");\n }\n\n /**\n * Parse HTTP request body to InboundMessage\n */\n parseRequest(body: WebMessage): InboundMessage {\n return {\n id: crypto.randomUUID(),\n source: this.id,\n userId: body.userId || \"anonymous\",\n conversationId: body.conversationId || crypto.randomUUID(),\n content: body.content,\n };\n }\n\n async handleMessage(message: InboundMessage): Promise<void> {\n // Message handling is done via the channel manager\n // This just triggers the routing\n }\n\n /**\n * Register an SSE connection for a conversation\n */\n registerSSEConnection(\n conversationId: string,\n listener: (event: AgentStreamEvent) => void\n ): () => void {\n if (!this.sseConnections.has(conversationId)) {\n this.sseConnections.set(conversationId, new Set());\n }\n this.sseConnections.get(conversationId)!.add(listener);\n\n // Return unsubscribe function\n return () => {\n const listeners = this.sseConnections.get(conversationId);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.sseConnections.delete(conversationId);\n }\n }\n };\n }\n\n async stream(\n conversationId: string,\n event: AgentStreamEvent\n ): Promise<void> {\n const listeners = this.sseConnections.get(conversationId);\n if (listeners) {\n for (const listener of listeners) {\n listener(event);\n }\n }\n }\n\n /**\n * Create SSE response headers\n */\n static createSSEHeaders(): Record<string, string> {\n return {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n };\n }\n\n /**\n * Format event for SSE\n */\n static formatSSEEvent(event: AgentStreamEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n }\n}\n\n// Default instance\nexport const webChannel = new WebChannel();\n","/**\n * Platform-aware, Unicode-safe message chunking utility.\n *\n * Splits long text into chunks that respect platform character limits\n * without breaking Unicode surrogate pairs, emoji, or grapheme clusters.\n *\n * @module channels/chunk\n */\n\n/** Per-channel maximum message lengths (in characters). */\nexport const CHANNEL_LIMITS = {\n telegram: 4096,\n discord: 2000,\n feishu: 30000,\n wecom: 2048,\n dingtalk: 20000,\n wechat: 2048,\n} as const;\n\n/**\n * Split text into chunks that fit within a character limit.\n *\n * Key guarantees:\n * - Never splits in the middle of a Unicode surrogate pair or grapheme cluster\n * - Prefers splitting at line boundaries (\\n)\n * - Falls back to splitting at word boundaries (space)\n * - Only splits mid-word as a last resort (using Array.from for code-point safety)\n * - Preserves content order; no content is dropped\n */\nexport function chunkText(text: string, limit: number): string[] {\n if (limit < 1) throw new RangeError(\"chunkText: limit must be >= 1\");\n\n // Fast path: text fits in a single chunk.\n // Use Array.from to count actual code points, not UTF-16 units.\n if (codePointLength(text) <= limit) return [text];\n\n const lines = text.split(\"\\n\");\n const chunks: string[] = [];\n let current = \"\";\n\n const flush = (): void => {\n const trimmed = current.trim();\n if (trimmed.length > 0) {\n chunks.push(current);\n }\n current = \"\";\n };\n\n for (const line of lines) {\n const lineLen = codePointLength(line);\n\n // Empty line (paragraph break)\n if (!line) {\n if (codePointLength(current) + 1 > limit) {\n flush();\n }\n current += \"\\n\";\n continue;\n }\n\n // Line is longer than limit — must split it further\n if (lineLen > limit) {\n if (current) flush();\n for (const part of splitLongLine(line, limit)) {\n chunks.push(part);\n }\n continue;\n }\n\n // Normal line — try to append\n const separator = current ? \"\\n\" : \"\";\n if (codePointLength(current) + separator.length + lineLen > limit) {\n flush();\n }\n current += (current ? \"\\n\" : \"\") + line;\n }\n\n flush();\n return chunks.length > 0 ? chunks : [text];\n}\n\n/**\n * Split a single long line that exceeds the limit.\n * First tries word boundaries, then falls back to code-point-safe slicing.\n */\nfunction splitLongLine(line: string, limit: number): string[] {\n const words = line.split(/(\\s+)/); // preserve whitespace tokens\n const parts: string[] = [];\n let current = \"\";\n\n for (const word of words) {\n const wordLen = codePointLength(word);\n\n if (wordLen > limit) {\n // Word itself is too long — split at code-point level\n if (current) {\n parts.push(current);\n current = \"\";\n }\n for (const segment of codePointSlice(word, limit)) {\n parts.push(segment);\n }\n continue;\n }\n\n if (codePointLength(current) + wordLen > limit) {\n if (current) parts.push(current);\n current = word;\n } else {\n current += word;\n }\n }\n\n if (current) parts.push(current);\n return parts;\n}\n\n/**\n * Count the number of Unicode code points in a string.\n * This correctly counts surrogate pairs (emoji, CJK extensions) as 1.\n */\nfunction codePointLength(str: string): number {\n // Spreading a string iterates over code points, not UTF-16 units.\n let count = 0;\n for (const _ of str) {\n count++;\n }\n return count;\n}\n\n/**\n * Slice a string into segments of at most `limit` code points each,\n * never breaking surrogate pairs.\n */\nfunction codePointSlice(str: string, limit: number): string[] {\n const segments: string[] = [];\n const codePoints = Array.from(str); // each element is a full code point\n for (let i = 0; i < codePoints.length; i += limit) {\n segments.push(codePoints.slice(i, i + limit).join(\"\"));\n }\n return segments;\n}\n\n/**\n * Convenience: chunk text using a named channel's limit.\n */\nexport function chunkForChannel(\n text: string,\n channel: keyof typeof CHANNEL_LIMITS,\n): string[] {\n return chunkText(text, CHANNEL_LIMITS[channel]);\n}\n","/**\n * Discord Channel\n *\n * Connects to Discord Gateway via discord.js.\n * Receives messages and streams agent responses back.\n */\n\nimport {\n Client,\n GatewayIntentBits,\n Partials,\n type Message,\n type TextBasedChannel,\n} from \"discord.js\";\nimport type {\n AgentStreamEvent,\n Channel,\n ChannelRuntimeContext,\n DiscordConfig,\n InboundMessage,\n} from \"./channel\";\nimport { chunkForChannel } from \"./chunk\";\n\ntype DiscordConversation = {\n channelId: string;\n replyToId?: string;\n userId: string;\n guildId?: string | null;\n};\n\nexport class DiscordChannel implements Channel {\n id = \"discord\";\n type = \"websocket\" as const;\n\n private client: Client | null = null;\n private conversations = new Map<string, DiscordConversation>();\n private responseBuffers = new Map<string, string>();\n\n constructor(\n private config: DiscordConfig,\n private context: ChannelRuntimeContext,\n ) { }\n\n async start(): Promise<void> {\n const intents = [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.DirectMessages,\n GatewayIntentBits.MessageContent,\n ];\n\n this.client = new Client({\n intents,\n partials: [Partials.Channel],\n });\n\n this.client.on(\"messageCreate\", (message) => {\n void this.handleDiscordMessage(message);\n });\n\n await this.client.login(this.config.botToken);\n console.log(\"[Discord] Channel started\");\n }\n\n async stop(): Promise<void> {\n this.responseBuffers.clear();\n this.conversations.clear();\n if (this.client) {\n await this.client.destroy();\n this.client = null;\n }\n console.log(\"[Discord] Channel stopped\");\n }\n\n async handleMessage(message: InboundMessage): Promise<void> {\n this.responseBuffers.set(message.conversationId, \"\");\n }\n\n async stream(\n conversationId: string,\n event: AgentStreamEvent,\n ): Promise<void> {\n if (event.type === \"text-delta\") {\n const current = this.responseBuffers.get(conversationId) || \"\";\n this.responseBuffers.set(conversationId, current + event.content);\n return;\n }\n\n if (event.type === \"done\") {\n const text = this.responseBuffers.get(conversationId) || \"\";\n await this.sendDiscordMessage(conversationId, text);\n this.responseBuffers.delete(conversationId);\n return;\n }\n\n if (event.type === \"error\") {\n await this.sendDiscordMessage(conversationId, `Error: ${event.error}`);\n this.responseBuffers.delete(conversationId);\n }\n }\n\n private async handleDiscordMessage(message: Message): Promise<void> {\n if (!this.client) return;\n if (message.author?.bot) return;\n\n const botId = this.client.user?.id;\n if (!botId) return;\n\n if (!this.isAllowedSender(message)) return;\n\n const isGuild = Boolean(message.guildId);\n if (isGuild) {\n const requireMention = this.config.requireMention !== false;\n if (requireMention && !message.mentions.users.has(botId)) {\n return;\n }\n }\n\n const content = this.stripBotMention(message.content, botId) || \"(no text)\";\n const conversationId = message.channelId;\n\n const inbound: InboundMessage = {\n id: message.id,\n source: this.id,\n userId: message.author.id,\n conversationId,\n content,\n attachments: mapDiscordAttachments(message),\n metadata: {\n channelId: message.channelId,\n guildId: message.guildId,\n messageId: message.id,\n threadId: message.thread?.id,\n },\n };\n\n this.conversations.set(conversationId, {\n channelId: message.channelId,\n replyToId: message.id,\n userId: message.author.id,\n guildId: message.guildId,\n });\n\n await this.handleMessage(inbound);\n await this.context.routeMessage(inbound);\n }\n\n private stripBotMention(text: string, botId: string): string {\n const pattern = new RegExp(`<@!?${botId}>`, \"g\");\n return text.replace(pattern, \"\").trim();\n }\n\n private isAllowedSender(message: Message): boolean {\n const { allowGuildIds, allowChannelIds, allowUserIds } = this.config;\n\n if (allowUserIds?.length && !allowUserIds.includes(message.author.id)) {\n return false;\n }\n\n if (message.guildId && allowGuildIds?.length) {\n if (!allowGuildIds.includes(message.guildId)) return false;\n }\n\n if (allowChannelIds?.length) {\n if (!allowChannelIds.includes(message.channelId)) return false;\n }\n\n return true;\n }\n\n private async sendDiscordMessage(\n conversationId: string,\n content: string,\n ): Promise<void> {\n if (!this.client) return;\n if (!content.trim()) return;\n\n const ctx = this.conversations.get(conversationId);\n if (!ctx) return;\n\n const channel = await this.client.channels.fetch(ctx.channelId);\n if (!channel || !channel.isTextBased()) return;\n\n const chunks = chunkForChannel(content, \"discord\");\n const replyMode = this.config.replyMode ?? \"reply\";\n\n for (let i = 0; i < chunks.length; i += 1) {\n const chunk = chunks[i];\n if (!chunk) continue;\n await sendToTextChannel(\n channel,\n chunk,\n replyMode === \"reply\" && i === 0 ? ctx.replyToId : undefined,\n );\n }\n }\n}\n\nfunction mapDiscordAttachments(message: Message): InboundMessage[\"attachments\"] | undefined {\n if (!message.attachments || message.attachments.size === 0) return undefined;\n const attachments = Array.from(message.attachments.values()).map((att) => ({\n type: (att.contentType?.startsWith(\"image/\") ? \"image\" : \"file\") as \"image\" | \"file\",\n url: att.url,\n name: att.name ?? undefined,\n mimeType: att.contentType ?? undefined,\n }));\n return attachments.length > 0 ? attachments : undefined;\n}\n\nasync function sendToTextChannel(\n channel: TextBasedChannel,\n content: string,\n replyToId?: string,\n): Promise<void> {\n if (replyToId) {\n await (channel as any).send({\n content,\n reply: {\n messageReference: replyToId,\n failIfNotExists: false,\n },\n allowedMentions: { repliedUser: false },\n });\n return;\n }\n (channel as any).send({ content });\n}\n","/**\n * Feishu (Lark) Channel\n *\n * Supports WebSocket event subscription and webhook mode.\n */\n\nimport * as Lark from \"@larksuiteoapi/node-sdk\";\nimport type {\n AgentStreamEvent,\n Channel,\n ChannelRuntimeContext,\n FeishuConfig,\n InboundMessage,\n} from \"./channel\";\nimport type { ChannelWebhookRoute, GatewayRequest } from \"./webhook\";\n\ntype FeishuConversation = {\n chatId: string;\n chatType: \"p2p\" | \"group\";\n senderOpenId: string;\n messageId: string;\n};\n\ntype FeishuMessageEvent = {\n sender: {\n sender_id?: {\n open_id?: string;\n };\n sender_type?: string;\n };\n message: {\n message_id: string;\n chat_id: string;\n chat_type: \"p2p\" | \"group\";\n message_type: string;\n content: string;\n mentions?: Array<{\n id?: { open_id?: string };\n name?: string;\n }>;\n };\n};\n\nexport class FeishuChannel implements Channel {\n id = \"feishu\";\n type: \"webhook\" | \"websocket\" | \"sse\";\n\n private client: Lark.Client | null = null;\n private wsClient: Lark.WSClient | null = null;\n private dispatcher: Lark.EventDispatcher | null = null;\n private responseBuffers = new Map<string, string>();\n private conversations = new Map<string, FeishuConversation>();\n private botOpenId: string | null = null;\n\n constructor(\n private config: FeishuConfig,\n private context: ChannelRuntimeContext,\n ) {\n this.type = config.connectionMode === \"webhook\" ? \"webhook\" : \"websocket\";\n }\n\n async start(): Promise<void> {\n if (this.config.connectionMode === \"webhook\") {\n console.log(\"[Feishu] Channel started in webhook mode\");\n return;\n }\n\n this.client = createFeishuClient(this.config);\n this.wsClient = createFeishuWsClient(this.config);\n this.dispatcher = new Lark.EventDispatcher({\n encryptKey: this.config.encryptKey,\n verificationToken: this.config.verificationToken,\n });\n\n this.dispatcher.register({\n \"im.message.receive_v1\": async (data) => {\n await this.handleFeishuMessage(data as FeishuMessageEvent);\n },\n });\n\n try {\n this.botOpenId = await fetchBotOpenId(this.config);\n } catch {\n this.botOpenId = null;\n }\n\n await this.wsClient.start({ eventDispatcher: this.dispatcher });\n console.log(\"[Feishu] Channel started (websocket)\");\n }\n\n async stop(): Promise<void> {\n this.responseBuffers.clear();\n this.conversations.clear();\n if (this.wsClient && typeof (this.wsClient as any).stop === \"function\") {\n (this.wsClient as any).stop();\n }\n this.wsClient = null;\n this.dispatcher = null;\n this.client = null;\n console.log(\"[Feishu] Channel stopped\");\n }\n\n async handleMessage(message: InboundMessage): Promise<void> {\n this.responseBuffers.set(message.conversationId, \"\");\n }\n\n async stream(conversationId: string, event: AgentStreamEvent): Promise<void> {\n if (event.type === \"text-delta\") {\n const current = this.responseBuffers.get(conversationId) || \"\";\n this.responseBuffers.set(conversationId, current + event.content);\n return;\n }\n\n if (event.type === \"done\") {\n const text = this.responseBuffers.get(conversationId) || \"\";\n await this.sendFeishuMessage(conversationId, text);\n this.responseBuffers.delete(conversationId);\n return;\n }\n\n if (event.type === \"error\") {\n await this.sendFeishuMessage(conversationId, `Error: ${event.error}`);\n this.responseBuffers.delete(conversationId);\n }\n }\n\n getWebhookRoutes(): ChannelWebhookRoute[] {\n if (this.config.connectionMode !== \"webhook\") {\n return [];\n }\n const path = this.config.webhookPath || \"/webhook/feishu\";\n return [\n {\n method: \"POST\",\n path,\n handler: async (req) => this.handleWebhook(req),\n },\n ];\n }\n\n private async handleWebhook(req: GatewayRequest) {\n const payload = (req.json || safeJsonParse(req.body)) as any;\n if (!payload || typeof payload !== \"object\") {\n return { status: 400, json: { error: \"Invalid payload\" } };\n }\n\n if (payload.type === \"url_verification\" && payload.challenge) {\n return { status: 200, json: { challenge: payload.challenge } };\n }\n\n if (this.config.verificationToken && payload.token !== this.config.verificationToken) {\n return { status: 401, json: { error: \"Invalid token\" } };\n }\n\n const event = payload.event as FeishuMessageEvent | undefined;\n if (event) {\n await this.handleFeishuMessage(event);\n }\n\n return { status: 200, json: { ok: true } };\n }\n\n private async handleFeishuMessage(event: FeishuMessageEvent): Promise<void> {\n if (event.sender?.sender_type === \"bot\") return;\n\n const senderOpenId = event.sender?.sender_id?.open_id;\n if (!senderOpenId) return;\n\n const message = event.message;\n const isGroup = message.chat_type === \"group\";\n\n if (isGroup && !this.config.allowGroupMessages) {\n return;\n }\n\n if (isGroup && this.config.requireMention !== false) {\n const mentionedBot = this.isBotMentioned(message.mentions);\n if (!mentionedBot) return;\n }\n\n const content = parseFeishuMessageContent(message.content, message.message_type);\n const conversationId = message.chat_id;\n\n const inbound: InboundMessage = {\n id: message.message_id,\n source: this.id,\n userId: senderOpenId,\n conversationId,\n content,\n metadata: {\n chatId: message.chat_id,\n chatType: message.chat_type,\n messageType: message.message_type,\n },\n };\n\n this.conversations.set(conversationId, {\n chatId: message.chat_id,\n chatType: message.chat_type,\n senderOpenId,\n messageId: message.message_id,\n });\n\n await this.handleMessage(inbound);\n await this.context.routeMessage(inbound);\n }\n\n private isBotMentioned(\n mentions: FeishuMessageEvent[\"message\"][\"mentions\"],\n ): boolean {\n if (!mentions || mentions.length === 0) return false;\n if (!this.botOpenId) return true;\n return mentions.some((mention) => mention.id?.open_id === this.botOpenId);\n }\n\n private async sendFeishuMessage(conversationId: string, text: string): Promise<void> {\n if (!text.trim()) return;\n if (!this.client) {\n this.client = createFeishuClient(this.config);\n }\n const ctx = this.conversations.get(conversationId);\n if (!ctx) return;\n\n const receiveIdType = ctx.chatType === \"p2p\" ? \"open_id\" : \"chat_id\";\n const receiveId = ctx.chatType === \"p2p\" ? ctx.senderOpenId : ctx.chatId;\n\n await this.client.im.message.create({\n params: { receive_id_type: receiveIdType },\n data: {\n receive_id: receiveId,\n msg_type: \"text\",\n content: JSON.stringify({ text }),\n },\n });\n }\n}\n\nfunction parseFeishuMessageContent(content: string, messageType: string): string {\n try {\n const parsed = JSON.parse(content);\n if (messageType === \"text\") {\n return parsed.text || \"\";\n }\n } catch {\n // ignore parsing errors\n }\n return content || \"(no text)\";\n}\n\nfunction createFeishuClient(config: FeishuConfig): Lark.Client {\n return new Lark.Client({\n appId: config.appId,\n appSecret: config.appSecret,\n appType: Lark.AppType.SelfBuild,\n domain: resolveFeishuDomain(config.domain),\n });\n}\n\nfunction createFeishuWsClient(config: FeishuConfig): Lark.WSClient {\n return new Lark.WSClient({\n appId: config.appId,\n appSecret: config.appSecret,\n domain: resolveFeishuDomain(config.domain),\n loggerLevel: Lark.LoggerLevel.error,\n });\n}\n\nfunction resolveFeishuDomain(domain?: string): string | Lark.Domain {\n if (!domain || domain === \"feishu\") return Lark.Domain.Feishu;\n if (domain === \"lark\") return Lark.Domain.Lark;\n return domain.replace(/\\/+$/, \"\");\n}\n\nfunction safeJsonParse(value: string): unknown {\n try {\n return JSON.parse(value);\n } catch {\n return undefined;\n }\n}\n\nasync function fetchBotOpenId(config: FeishuConfig): Promise<string | null> {\n const baseUrl = resolveFeishuBaseUrl(config.domain);\n const tokenRes = await fetch(`${baseUrl}/open-apis/auth/v3/tenant_access_token/internal`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n app_id: config.appId,\n app_secret: config.appSecret,\n }),\n });\n if (!tokenRes.ok) return null;\n const tokenPayload = (await tokenRes.json()) as any;\n const token = tokenPayload?.tenant_access_token;\n if (!token) return null;\n\n const botRes = await fetch(`${baseUrl}/open-apis/bot/v3/info`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!botRes.ok) return null;\n const botPayload = (await botRes.json()) as any;\n return botPayload?.data?.open_id ?? null;\n}\n\nfunction resolveFeishuBaseUrl(domain?: string): string {\n if (!domain || domain === \"feishu\") return \"https://open.feishu.cn\";\n if (domain === \"lark\") return \"https://open.larksuite.com\";\n return domain.replace(/\\/+$/, \"\");\n}\n","import { Telegraf, Context } from \"telegraf\";\nimport {\n Channel,\n ChannelRuntimeContext,\n InboundMessage,\n AgentStreamEvent,\n TelegramConfig,\n InterruptSignal,\n} from \"./channel\";\nimport { chunkForChannel } from \"./chunk\";\n\nexport class TelegramChannel implements Channel {\n readonly id = \"telegram\";\n readonly type = \"websocket\"; // Polling mode\n\n private bot: Telegraf;\n private isRunning = false;\n private responseBuffers = new Map<string, string>(); // conversationId -> text\n\n constructor(\n private config: TelegramConfig,\n private context: ChannelRuntimeContext,\n ) {\n this.bot = new Telegraf(config.botToken);\n this.setupHandlers();\n }\n\n private setupHandlers() {\n this.bot.on(\"text\", async (ctx) => {\n await this.handleTelegramMessage(ctx);\n });\n }\n\n private async handleTelegramMessage(ctx: Context) {\n if (!ctx.message || !(\"text\" in ctx.message)) return;\n\n const userId = ctx.from?.id.toString();\n if (!userId) return;\n\n // Security check\n if (\n this.config.allowUserIds &&\n this.config.allowUserIds.length > 0 &&\n !this.config.allowUserIds.includes(userId)\n ) {\n console.warn(\n `[Telegram] Blocked message from unauthorized user: ${userId}`,\n );\n return;\n }\n\n const conversationId = ctx.chat?.id.toString();\n if (!conversationId) return;\n\n // Clear buffer for new turn\n this.responseBuffers.delete(conversationId);\n\n const inbound: InboundMessage = {\n id: ctx.message.message_id.toString(),\n source: \"telegram\",\n userId: userId,\n conversationId: conversationId,\n content: ctx.message.text,\n metadata: {\n username: ctx.from?.username,\n firstName: ctx.from?.first_name,\n lastName: ctx.from?.last_name,\n chatType: ctx.chat?.type,\n },\n };\n\n await this.handleMessage(inbound);\n }\n\n async start(): Promise<void> {\n if (this.isRunning) return;\n\n console.log(\"[Telegram] Starting polling...\");\n // launch() returns a promise that resolves when the bot stops, so we don't await it.\n this.bot.launch().catch((err) => {\n console.error(\"[Telegram] Failed to launch bot:\", err);\n });\n console.log(\"[Telegram] Bot started\");\n\n this.isRunning = true;\n }\n\n async stop(): Promise<void> {\n if (!this.isRunning) return;\n this.bot.stop(\"SIGINT\");\n this.isRunning = false;\n console.log(\"[Telegram] Channel stopped\");\n }\n\n async handleMessage(message: InboundMessage): Promise<void> {\n await this.context.routeMessage(message);\n }\n\n async handleInterrupt(signal: InterruptSignal): Promise<void> {\n await this.context.handleInterrupt(signal);\n }\n\n async stream(conversationId: string, event: AgentStreamEvent): Promise<void> {\n const chatId = conversationId;\n\n try {\n if (event.type === \"text-delta\") {\n const current = this.responseBuffers.get(conversationId) || \"\";\n this.responseBuffers.set(conversationId, current + event.content);\n return;\n }\n\n if (event.type === \"done\") {\n const text = this.responseBuffers.get(conversationId);\n if (text) {\n await this.sendTelegramMessage(chatId, text);\n this.responseBuffers.delete(conversationId);\n }\n return;\n }\n\n if (event.type === \"error\") {\n await this.bot.telegram.sendMessage(chatId, `❌ Error: ${event.error}`);\n this.responseBuffers.delete(conversationId);\n }\n\n if (event.type === \"tool-call\") {\n // Optional: Notify user about tool usage\n // await this.bot.telegram.sendMessage(chatId, `🛠️ Using tool: ${event.tool}`);\n }\n } catch (error) {\n console.error(`[Telegram] Error streaming to ${chatId}:`, error);\n }\n }\n\n private async sendTelegramMessage(\n chatId: string,\n text: string,\n ): Promise<void> {\n const chunks = chunkForChannel(text, \"telegram\");\n for (const chunk of chunks) {\n await this.bot.telegram.sendMessage(chatId, chunk);\n }\n }\n}\n","import type { Channel, ChannelRuntimeContext, ChannelConfig } from \"./channel\";\n\nexport type ChannelTransportType = \"webhook\" | \"websocket\" | \"sse\";\n\nexport interface ChannelCapabilityMetadata {\n /** Channel transport behavior. */\n transport: ChannelTransportType;\n /** Whether the channel supports inbound attachments natively. */\n supportsInboundAttachments: boolean;\n /** Primary authentication/configuration strategy summary. */\n auth: string;\n /** Optional controls for mention/scope/allowlist behavior. */\n controls?: string[];\n /** Production readiness guidance. */\n productionReadiness: \"ready\" | \"beta\";\n}\n\nexport interface ChannelFactory<TConfig extends ChannelConfig> {\n /** Unique channel identifier (e.g., \"discord\") */\n id: string;\n /** Human-friendly label for UI */\n displayName: string;\n /** Short description for UI/tooling */\n description?: string;\n /** Structured channel capability metadata for docs/tooling. */\n capabilities: ChannelCapabilityMetadata;\n /** Create a channel instance from config */\n create(config: TConfig, context: ChannelRuntimeContext): Channel;\n}\n\n/**\n * ChannelRegistry keeps a catalog of available channel factories.\n * It enables a universal, plugin-like integration model for gateway setup.\n */\nexport class ChannelRegistry {\n private factories = new Map<string, ChannelFactory<any>>();\n\n /**\n * Register a channel factory.\n */\n register<TConfig extends ChannelConfig>(factory: ChannelFactory<TConfig>): void {\n if (this.factories.has(factory.id)) {\n throw new Error(`Channel factory \"${factory.id}\" already registered`);\n }\n this.factories.set(factory.id, factory);\n }\n\n /**\n * Get a channel factory by id.\n */\n get<TConfig extends ChannelConfig>(id: string): ChannelFactory<TConfig> | undefined {\n return this.factories.get(id);\n }\n\n /**\n * List all registered factories.\n */\n list(): ChannelFactory<any>[] {\n return Array.from(this.factories.values());\n }\n\n /**\n * List capability metadata for all registered channels.\n */\n listCapabilities(): Array<\n Pick<ChannelFactory<any>, \"id\" | \"displayName\" | \"description\"> & {\n capabilities: ChannelCapabilityMetadata;\n }\n > {\n return this.list().map((factory) => ({\n id: factory.id,\n displayName: factory.displayName,\n description: factory.description,\n capabilities: factory.capabilities,\n }));\n }\n}\n\nexport const channelRegistry = new ChannelRegistry();\n","import type { Channel, ChannelRuntimeContext, ChannelsConfig } from \"./channel\";\nimport { DingTalkChannel } from \"./dingtalk\";\nimport { WeComChannel } from \"./wecom\";\nimport { WeChatChannel } from \"./wechat\";\nimport { WebChannel } from \"./web\";\nimport { DiscordChannel } from \"./discord\";\nimport { FeishuChannel } from \"./feishu\";\nimport { TelegramChannel } from \"./telegram\";\nimport { channelRegistry } from \"./registry\";\n\n/**\n * Register the built-in channel factories.\n */\nexport function registerBuiltinChannels(): void {\n if (!channelRegistry.get(\"dingtalk\")) {\n channelRegistry.register({\n id: \"dingtalk\",\n displayName: \"DingTalk\",\n description: \"DingTalk enterprise bot integration\",\n capabilities: {\n transport: \"webhook\",\n supportsInboundAttachments: false,\n auth: \"appKey + appSecret (+ optional robotCode)\",\n productionReadiness: \"ready\",\n },\n create: (config, context) => new DingTalkChannel(config as any, context),\n });\n }\n\n if (!channelRegistry.get(\"wecom\")) {\n channelRegistry.register({\n id: \"wecom\",\n displayName: \"WeCom\",\n description: \"WeCom (WeChat Work) enterprise integration\",\n capabilities: {\n transport: \"webhook\",\n supportsInboundAttachments: false,\n auth: \"corpId + agentId + secret + token + aesKey\",\n productionReadiness: \"ready\",\n },\n create: (config, context) => new WeComChannel(config as any, context),\n });\n }\n\n if (!channelRegistry.get(\"wechat\")) {\n channelRegistry.register({\n id: \"wechat\",\n displayName: \"WeChat\",\n description: \"WeChat integration via proxy webhook\",\n capabilities: {\n transport: \"webhook\",\n supportsInboundAttachments: false,\n auth: \"proxy webhook\",\n productionReadiness: \"ready\",\n },\n create: (config, context) => new WeChatChannel(config as any, context),\n });\n }\n\n if (!channelRegistry.get(\"web\")) {\n channelRegistry.register({\n id: \"web\",\n displayName: \"Web\",\n description: \"Local web channel (SSE)\",\n capabilities: {\n transport: \"sse\",\n supportsInboundAttachments: true,\n auth: \"session-based web app context\",\n productionReadiness: \"ready\",\n },\n create: (config, _context) => new WebChannel(config as any),\n });\n }\n\n if (!channelRegistry.get(\"discord\")) {\n channelRegistry.register({\n id: \"discord\",\n displayName: \"Discord\",\n description: \"Discord bot integration via gateway\",\n capabilities: {\n transport: \"websocket\",\n supportsInboundAttachments: true,\n auth: \"botToken (+ optional appId)\",\n controls: [\n \"allowGuildIds\",\n \"allowChannelIds\",\n \"allowUserIds\",\n \"requireMention\",\n \"replyMode\",\n ],\n productionReadiness: \"ready\",\n },\n create: (config, context) => new DiscordChannel(config as any, context),\n });\n }\n\n if (!channelRegistry.get(\"feishu\")) {\n channelRegistry.register({\n id: \"feishu\",\n displayName: \"Feishu\",\n description: \"Feishu/Lark bot integration\",\n capabilities: {\n transport: \"websocket\",\n supportsInboundAttachments: true,\n auth: \"appId + appSecret (+ optional verification/encryption keys)\",\n controls: [\"allowGroupMessages\", \"requireMention\"],\n productionReadiness: \"ready\",\n },\n create: (config, context) => new FeishuChannel(config as any, context),\n });\n }\n\n if (!channelRegistry.get(\"telegram\")) {\n channelRegistry.register({\n id: \"telegram\",\n displayName: \"Telegram\",\n description: \"Telegram bot integration (polling)\",\n capabilities: {\n transport: \"websocket\",\n supportsInboundAttachments: false,\n auth: \"botToken\",\n controls: [\"allowUserIds\"],\n productionReadiness: \"ready\",\n },\n create: (config, context) => new TelegramChannel(config as any, context),\n });\n }\n}\n\n/**\n * Create channel instances for enabled configs.\n */\nexport function createChannelsFromConfig(\n config: ChannelsConfig,\n context: ChannelRuntimeContext,\n): Channel[] {\n const channels: Channel[] = [];\n for (const [id, cfg] of Object.entries(config)) {\n if (!cfg || cfg.enabled === false) continue;\n const factory = channelRegistry.get(id);\n if (!factory) {\n console.warn(`[Gateway] Unknown channel \"${id}\" - skipping`);\n continue;\n }\n channels.push(factory.create(cfg as any, context));\n }\n return channels;\n}\n","#!/usr/bin/env node\n\n// Load environment variables from .env file\nimport \"dotenv/config\";\n\nimport { program } from \"commander\";\nimport * as path from \"path\";\nimport { VERSION } from \"./common\";\nimport { shouldRunInteractiveLauncher, runInteractiveLauncher } from \"./launcher\";\n\n// Commands\nimport { startCommand } from \"./commands/start\";\nimport { gatewayCommand, boardCommand, hubCommand } from \"./commands/gateway\";\nimport { runCommand } from \"./commands/run\";\nimport { chatCommand } from \"./commands/chat\";\nimport { termCommand } from \"./commands/term\";\nimport { authCommand, loginCommand } from \"./commands/auth\";\nimport { statusCommand } from \"./commands/status\";\nimport { onboardCommand } from \"./commands/onboard\";\nimport { skillCommand } from \"./commands/skill\";\nimport { channelsCommand } from \"./commands/channels\";\n\nfunction getCliName(): string {\n const invokedPath = process.argv[1];\n const invokedName = invokedPath ? path.parse(invokedPath).name : \"\";\n if (invokedName === \"viber\" || invokedName === \"openviber\") return invokedName;\n return \"openviber\";\n}\n\nprogram\n .name(getCliName())\n .description(\"OpenViber - Workspace-first assistant runtime (tasks on your Viber)\")\n .version(VERSION);\n\nprogram.addCommand(startCommand);\nprogram.addCommand(gatewayCommand);\nprogram.addCommand(boardCommand); // deprecated alias\nprogram.addCommand(hubCommand); // deprecated alias\nprogram.addCommand(runCommand);\nprogram.addCommand(chatCommand);\nprogram.addCommand(termCommand);\nprogram.addCommand(loginCommand);\nprogram.addCommand(authCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(onboardCommand);\nprogram.addCommand(skillCommand);\nprogram.addCommand(channelsCommand);\n\nasync function main(): Promise<void> {\n if (shouldRunInteractiveLauncher()) {\n await runInteractiveLauncher();\n return;\n }\n await program.parseAsync();\n}\n\nvoid main();\n","import * as os from \"os\";\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport * as readline from \"readline\";\nimport { spawn } from \"child_process\";\nimport YAML from \"yaml\";\nimport { getOpenViberVersion } from \"../utils/version\";\n\nexport const VERSION = getOpenViberVersion();\nexport const OPENVIBER_DIR = path.join(os.homedir(), \".openviber\");\nexport const CONFIG_FILE = path.join(OPENVIBER_DIR, \"config.yaml\");\n\nexport interface SavedConfig {\n mode?: string;\n viberId?: string;\n name?: string;\n gatewayUrl?: string;\n /** @deprecated Use gatewayUrl instead */\n boardUrl?: string;\n /** @deprecated Use gatewayUrl instead */\n hubUrl?: string;\n authToken?: string;\n webUrl?: string;\n onboardedAt?: string;\n}\n\nexport type SkillHealthCheck = {\n label: string;\n ok: boolean;\n required?: boolean;\n message?: string;\n hint?: string;\n};\n\nexport type SkillHealthResult = {\n id: string;\n name: string;\n status: string;\n available: boolean;\n checks: SkillHealthCheck[];\n summary: string;\n};\n\nexport type SkillHealthReport = {\n generatedAt: string;\n skills: SkillHealthResult[];\n};\n\n/**\n * Load saved config from ~/.openviber/config.yaml.\n * Returns null if file doesn't exist or is invalid.\n */\nexport async function loadSavedConfig(): Promise<SavedConfig | null> {\n try {\n const content = await fs.readFile(CONFIG_FILE, \"utf8\");\n const parsed = YAML.parse(content) as SavedConfig;\n if (parsed && typeof parsed === \"object\") {\n return parsed;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport async function getViberId(): Promise<string> {\n const configDir = path.join(os.homedir(), \".openviber\");\n const idFile = path.join(configDir, \"viber-id\");\n\n try {\n await fs.mkdir(configDir, { recursive: true });\n const id = await fs.readFile(idFile, \"utf8\");\n return id.trim();\n } catch {\n // Generate new ID\n const id = `viber-${os\n .hostname()\n .toLowerCase()\n .replace(/[^a-z0-9]/g, \"\")}-${Date.now().toString(36).slice(-6)}`;\n await fs.writeFile(idFile, id);\n return id;\n }\n}\n\nexport function isInteractiveTerminal(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nexport function question(rl: readline.Interface, prompt: string): Promise<string> {\n return new Promise((resolve) => rl.question(prompt, resolve));\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function runSubcommand(args: string[]): Promise<number> {\n return await new Promise<number>((resolve, reject) => {\n const child = spawn(process.execPath, [process.argv[1], ...args], {\n stdio: \"inherit\",\n env: process.env,\n });\n child.on(\"error\", reject);\n child.on(\"close\", (code) => resolve(code ?? 0));\n });\n}\n\nexport function formatSkillHealthReport(report: SkillHealthReport): string[] {\n if (!report || report.skills.length === 0) {\n return [];\n }\n\n const statusLabel = (status: string) => {\n switch (status) {\n case \"AVAILABLE\":\n return \"OK\";\n case \"NOT_AVAILABLE\":\n return \"MISSING\";\n case \"UNKNOWN\":\n return \"UNKNOWN\";\n default:\n return status || \"UNKNOWN\";\n }\n };\n\n const lines: string[] = [];\n lines.push(\"\");\n lines.push(\"Skill Health\");\n lines.push(\"────────────────────────────────────\");\n\n for (const skill of report.skills) {\n const name = (skill.name || skill.id).slice(0, 22);\n const status = statusLabel(skill.status);\n lines.push(` ${name.padEnd(22)} ${status}`);\n\n if (skill.status !== \"AVAILABLE\") {\n const failed = skill.checks.filter(\n (check) => (check.required ?? true) && !check.ok,\n );\n if (failed.length === 0) {\n if (skill.summary) {\n lines.push(` - ${skill.summary}`);\n }\n } else {\n for (const check of failed) {\n const detail = check.hint || check.message || \"missing\";\n lines.push(` - ${check.label}: ${detail}`);\n }\n }\n }\n }\n\n lines.push(\"────────────────────────────────────\");\n return lines;\n}\n","import * as readline from \"readline\";\nimport { isInteractiveTerminal, question, runSubcommand } from \"./common\";\nimport { gatewayGetVibers } from \"./gateway-client\";\n\nexport function shouldRunInteractiveLauncher(): boolean {\n if (process.env.OPENVIBER_NO_LAUNCHER === \"1\") return false;\n return process.argv.slice(2).length === 0 && isInteractiveTerminal();\n}\n\nexport async function runInteractiveLauncher(): Promise<void> {\n const gatewayUrl =\n process.env.VIBER_GATEWAY_URL ||\n process.env.VIBER_BOARD_URL ||\n process.env.VIBER_HUB_URL ||\n \"http://localhost:6009\";\n\n const vibers = await gatewayGetVibers(gatewayUrl);\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true,\n });\n\n type LauncherAction =\n | \"chat\"\n | \"status\"\n | \"onboard\"\n | \"start\"\n | \"run\"\n | \"exit\";\n\n let action: LauncherAction = \"exit\";\n let runGoal = \"\";\n\n try {\n console.log(\"\\nOpenViber — chat-first launcher\\n\");\n\n if (vibers.connected && vibers.vibers.length > 0) {\n const preview = vibers.vibers\n .slice(0, 3)\n .map((v, i) => ` ${i + 1}. ${v.name} (${v.id})`)\n .join(\"\\n\");\n console.log(`Connected vibers (${vibers.vibers.length}):`);\n console.log(preview);\n if (vibers.vibers.length > 3) {\n console.log(` ...and ${vibers.vibers.length - 3} more`);\n }\n console.log(\"\");\n console.log(\"Choose next step:\");\n console.log(\" 1) Jump into chat\");\n console.log(\" 2) Check status\");\n console.log(\" 3) Run onboarding setup\");\n console.log(\" 4) Exit\\n\");\n\n const answer = (await question(rl, \"Select [1-4] (Enter for 1): \"))\n .trim()\n .toLowerCase();\n\n if (answer === \"\" || answer === \"1\" || answer === \"chat\") action = \"chat\";\n else if (answer === \"2\" || answer === \"status\") action = \"status\";\n else if (answer === \"3\" || answer === \"onboard\") action = \"onboard\";\n else action = \"exit\";\n } else {\n console.log(\"No connected vibers detected.\\n\");\n console.log(\"Choose next step:\");\n console.log(\" 1) Run onboarding setup\");\n console.log(\" 2) Start local daemon\");\n console.log(\" 3) Run a one-off task\");\n console.log(\" 4) Exit\\n\");\n\n const answer = (await question(rl, \"Select [1-4] (Enter for 1): \"))\n .trim()\n .toLowerCase();\n\n if (answer === \"\" || answer === \"1\" || answer === \"onboard\") {\n action = \"onboard\";\n } else if (answer === \"2\" || answer === \"start\") {\n action = \"start\";\n } else if (answer === \"3\" || answer === \"run\") {\n action = \"run\";\n runGoal = (await question(rl, \"Task goal: \")).trim();\n } else {\n action = \"exit\";\n }\n }\n } finally {\n rl.close();\n }\n\n if (action === \"exit\") return;\n\n if (action === \"chat\") {\n process.exit(await runSubcommand([\"chat\", \"--gateway\", gatewayUrl]));\n } else if (action === \"status\") {\n process.exit(await runSubcommand([\"status\", \"--gateway\", gatewayUrl]));\n } else if (action === \"onboard\") {\n process.exit(await runSubcommand([\"onboard\"]));\n } else if (action === \"start\") {\n process.exit(await runSubcommand([\"start\"]));\n } else if (action === \"run\") {\n if (!runGoal) {\n console.log(\"No task goal provided. Exiting.\");\n return;\n }\n process.exit(await runSubcommand([\"run\", runGoal]));\n }\n}\n","import { sleep } from \"./common\";\n\nexport interface GatewayViberListResponse {\n connected: boolean;\n vibers: Array<{ id: string; name: string }>;\n}\n\nexport interface GatewayTask {\n id: string;\n viberId: string;\n goal: string;\n status: \"pending\" | \"running\" | \"completed\" | \"error\" | \"stopped\";\n result?: unknown;\n error?: string;\n}\n\nexport function normalizeGatewayUrl(gatewayUrl: string): string {\n return String(gatewayUrl || \"\").trim().replace(/\\/$/, \"\");\n}\n\nexport async function gatewayGetVibers(gatewayUrl: string): Promise<GatewayViberListResponse> {\n try {\n const res = await fetch(`${normalizeGatewayUrl(gatewayUrl)}/api/vibers`);\n if (!res.ok) {\n return { connected: false, vibers: [] };\n }\n const json = (await res.json()) as any;\n return {\n connected: !!json?.connected,\n vibers: Array.isArray(json?.vibers) ? json.vibers\n : Array.isArray(json?.nodes) ? json.nodes\n : [],\n };\n } catch {\n return { connected: false, vibers: [] };\n }\n}\n\nexport async function gatewaySubmitTask(\n gatewayUrl: string,\n args: {\n goal: string;\n viberId: string;\n messages: Array<{ role: string; content: string }>;\n },\n): Promise<{ taskId: string } | null> {\n try {\n const res = await fetch(`${normalizeGatewayUrl(gatewayUrl)}/api/tasks`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n goal: args.goal,\n viberId: args.viberId,\n messages: args.messages,\n }),\n });\n if (!res.ok) return null;\n return (await res.json()) as any;\n } catch {\n return null;\n }\n}\n\nexport async function gatewayGetTask(gatewayUrl: string, taskId: string): Promise<GatewayTask | null> {\n try {\n const res = await fetch(`${normalizeGatewayUrl(gatewayUrl)}/api/tasks/${taskId}`);\n if (!res.ok) return null;\n return (await res.json()) as any;\n } catch {\n return null;\n }\n}\n\nexport async function pollGatewayTask(\n gatewayUrl: string,\n taskId: string,\n options: { pollIntervalMs: number; maxAttempts: number },\n): Promise<GatewayTask | null> {\n for (let attempt = 0; attempt < options.maxAttempts; attempt++) {\n const task = await gatewayGetTask(gatewayUrl, taskId);\n if (task && (task.status === \"completed\" || task.status === \"error\")) {\n return task;\n }\n await sleep(options.pollIntervalMs);\n }\n return await gatewayGetTask(gatewayUrl, taskId);\n}\n","import { Command } from \"commander\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { loadSettings, saveSettings } from \"../../skills/hub/settings\";\nimport { OPENVIBER_DIR, getViberId, loadSavedConfig, isInteractiveTerminal } from \"../common\";\n\nexport const startCommand = new Command(\"start\")\n .description(\n \"Start Viber runtime daemon (auto-connects if previously onboarded with --token)\",\n )\n .option(\"-s, --server <url>\", \"Command center URL (overrides saved config)\")\n .option(\"-t, --token <token>\", \"Authentication token (overrides saved config)\")\n .option(\"-n, --name <name>\", \"Viber name\", `${os.hostname()}-viber`)\n .option(\"--desktop\", \"Enable desktop control (UI-TARS)\")\n .option(\"--disable-app <apps...>\", \"Disable specific apps (comma-separated)\")\n .option(\"--no-apps\", \"Disable all apps\")\n .option(\"--standalone\", \"Run without connecting to gateway/board\")\n .option(\"--skills <skills>\", \"Comma-separated extra skills for standalone runtime\")\n .option(\"--primary-coding-cli <skillId>\", \"Preferred coding CLI skill (codex-cli|cursor-agent|gemini-cli)\")\n .option(\"--google-access-token <token>\", \"Google OAuth access token for standalone skills (e.g. gmail)\")\n .option(\"--google-refresh-token <token>\", \"Google OAuth refresh token for standalone skills\")\n .option(\"--api-port <port>\", \"Local API port (embedded gateway)\", \"6009\")\n .option(\"--reconnect-interval <ms>\", \"Reconnect interval in ms\", \"5000\")\n .option(\"--heartbeat-interval <ms>\", \"Heartbeat interval in ms\", \"30000\")\n .action(async (options) => {\n // Load API keys from ~/.openviber/.env (does not override existing env vars)\n const { loadOpenViberEnv } = await import(\"../auth\");\n await loadOpenViberEnv();\n\n const { JobScheduler } = await import(\"../../daemon/scheduler\");\n const { ViberController } = await import(\"../../daemon/controller\");\n\n // Import skill tools to register them in the ToolRegistry\n const { registerSkillTools } = await import(\"../../tools/skill-tools\");\n registerSkillTools();\n\n // Get or generate viber ID\n const viberId = await getViberId();\n\n // Load saved config from ~/.openviber/config.yaml if it exists\n const savedConfig = await loadSavedConfig();\n\n // Determine connection mode: CLI flags > saved config; otherwise standalone.\n const configuredServerUrl =\n options.server ||\n savedConfig?.gatewayUrl ||\n savedConfig?.boardUrl ||\n savedConfig?.hubUrl;\n const serverUrl = options.standalone ? undefined : configuredServerUrl;\n const authToken =\n options.token ||\n process.env.VIBER_TOKEN ||\n savedConfig?.authToken;\n\n const cliSkills = typeof options.skills === \"string\"\n ? options.skills\n .split(\",\")\n .map((s: string) => s.trim())\n .filter((s: string) => s.length > 0)\n : [];\n if (\n cliSkills.length > 0 ||\n options.primaryCodingCli ||\n options.googleAccessToken ||\n options.googleRefreshToken\n ) {\n const settings = await loadSettings();\n if (cliSkills.length > 0) {\n settings.standaloneSkills = Array.from(new Set(cliSkills));\n }\n if (typeof options.primaryCodingCli === \"string\" && options.primaryCodingCli.trim().length > 0) {\n settings.primaryCodingCli = options.primaryCodingCli.trim();\n }\n if (typeof options.googleAccessToken === \"string\" && options.googleAccessToken.trim().length > 0) {\n settings.oauthTokens = {\n ...(settings.oauthTokens || {}),\n google: {\n accessToken: options.googleAccessToken.trim(),\n ...(typeof options.googleRefreshToken === \"string\"\n ? { refreshToken: options.googleRefreshToken.trim() || null }\n : settings.oauthTokens?.google?.refreshToken !== undefined\n ? { refreshToken: settings.oauthTokens.google.refreshToken }\n : {}),\n },\n };\n }\n await saveSettings(settings);\n }\n\n if (isInteractiveTerminal()) {\n const persistedSettings = await loadSettings();\n const proactiveSkillIds = new Set<string>(cliSkills);\n if (\n typeof options.primaryCodingCli === \"string\" &&\n options.primaryCodingCli.trim().length > 0\n ) {\n proactiveSkillIds.add(options.primaryCodingCli.trim());\n } else if (persistedSettings.primaryCodingCli) {\n proactiveSkillIds.add(persistedSettings.primaryCodingCli);\n }\n for (const skillId of persistedSettings.standaloneSkills || []) {\n proactiveSkillIds.add(skillId);\n }\n if (proactiveSkillIds.size > 0) {\n const { ensureSkillsReady } = await import(\"../auth\");\n await ensureSkillsReady(Array.from(proactiveSkillIds));\n }\n }\n\n const isConnectedMode = !!serverUrl;\n const isStandaloneMode = !isConnectedMode;\n\n if (isConnectedMode) {\n console.log(\"[Viber] Connected mode — using saved config\");\n } else {\n console.log(\"[Viber] Standalone mode — gateway/board connection is optional\");\n }\n\n // Initialize Scheduler from ~/.openviber/jobs (or OPENVIBER_JOBS_DIR)\n const jobsDir =\n process.env.OPENVIBER_JOBS_DIR || path.join(OPENVIBER_DIR, \"jobs\");\n const scheduler = new JobScheduler(jobsDir);\n\n console.log(`[Viber] Initializing Cron Scheduler (jobs: ${jobsDir})...`);\n await scheduler.start();\n\n // Handle graceful shutdown\n const cleanup = async () => {\n console.log(\"\\n[Viber] Shutting down...\");\n await scheduler.stop();\n };\n\n process.on(\"SIGINT\", async () => {\n await cleanup();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n await cleanup();\n process.exit(0);\n });\n\n // Start embedded gateway only in standalone mode.\n // In connected mode the external gateway (pnpm dev:gateway) is already running.\n const apiPort = parseInt(options.apiPort || \"6009\", 10);\n let embeddedGateway: import(\"../../gateway/server\").GatewayServer | null = null;\n if (isStandaloneMode) {\n const { GatewayServer } = await import(\"../../gateway/server\");\n embeddedGateway = new GatewayServer({ port: apiPort });\n await embeddedGateway.start();\n console.log(`[Viber] Local API ready on http://localhost:${apiPort}`);\n }\n\n // Start local WebSocket server for terminal streaming (always, both modes)\n const { LocalServer } = await import(\"../../daemon/local-server\");\n const localServer = new LocalServer({ port: 6008 });\n await localServer.start();\n\n // Update cleanup to also stop local server and embedded gateway\n const fullCleanup = async () => {\n console.log(\"\\n[Viber] Shutting down...\");\n await localServer.stop();\n if (embeddedGateway) await embeddedGateway.stop();\n await scheduler.stop();\n };\n\n process.removeAllListeners(\"SIGINT\");\n process.removeAllListeners(\"SIGTERM\");\n process.on(\"SIGINT\", async () => {\n await fullCleanup();\n process.exit(0);\n });\n process.on(\"SIGTERM\", async () => {\n await fullCleanup();\n process.exit(0);\n });\n\n // Controller connects to the main gateway when available (connected mode),\n // otherwise falls back to the embedded gateway for standalone mode.\n const controller = new ViberController({\n serverUrl: serverUrl || `ws://localhost:${apiPort}/ws`,\n token: authToken,\n viberId,\n viberName: options.name || savedConfig?.name || os.hostname(),\n enableDesktop: options.desktop,\n reconnectInterval: parseInt(options.reconnectInterval, 10),\n heartbeatInterval: parseInt(options.heartbeatInterval, 10),\n });\n\n // When the scheduler loads/reloads jobs, report them to the hub\n // so the web can observe all jobs across all nodes.\n scheduler.on(\"jobs:loaded\", (jobs) => {\n controller.reportJobs(jobs);\n });\n\n controller.on(\"connected\", () => {\n const w = 55;\n const line = (s: string) => `| ${s.padEnd(w)} |`;\n console.log(`\n+${\"-\".repeat(w + 2)}+\n| ${\"VIBER RUNNING\".padStart(Math.floor((w + 12) / 2)).padEnd(w)} |\n+${\"-\".repeat(w + 2)}+\n${line(isStandaloneMode ? \"Mode: Standalone\" : \"Mode: Connected\")}\n${line(\"Viber ID: \" + viberId.slice(0, 42))}\n${line(\"Local API: http://localhost:\" + apiPort)}\n${line(\"Local WS: ws://localhost:6008\")}\n${line(\"Server: \" + (serverUrl ? serverUrl.slice(0, 42) : \"(none)\"))}\n${line(\"Status: \" + (isConnectedMode ? \"* Connected\" : \"* Running\"))}\n+${\"-\".repeat(w + 2)}+\n\nWaiting for tasks...\nPress Ctrl+C to stop.\n `);\n\n // Report current job list only when connected to hub/gateway\n if (isConnectedMode) {\n controller.reportJobs(scheduler.getLoadedJobs());\n }\n });\n\n controller.on(\"disconnected\", () => {\n if (isStandaloneMode) {\n console.log(\"[Viber] Standalone mode active.\");\n } else {\n console.log(\n \"[Viber] Disconnected from gateway. Is the gateway running? (pnpm dev:gateway)\",\n );\n }\n });\n\n controller.on(\"error\", (error) => {\n console.error(\"[Viber] Error:\", error.message);\n });\n\n\n\n await controller.start();\n });\n","import { Command } from \"commander\";\n\nconst gatewayAction = async (options: { port: string }) => {\n const { GatewayServer } = await import(\"../../gateway/server\");\n\n const gateway = new GatewayServer({\n port: parseInt(options.port, 10),\n });\n\n // Handle graceful shutdown\n process.on(\"SIGINT\", async () => {\n console.log(\"\\n[Gateway] Shutting down...\");\n await gateway.stop();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n console.log(\"\\n[Gateway] Shutting down...\");\n await gateway.stop();\n process.exit(0);\n });\n\n await gateway.start();\n\n const w = 55;\n const gLine = (s: string) => `| ${s.padEnd(w)} |`;\n console.log(`\n+${\"-\".repeat(w + 2)}+\n| ${\"GATEWAY RUNNING\".padStart(Math.floor((w + 15) / 2)).padEnd(w)} |\n+${\"-\".repeat(w + 2)}+\n${gLine(\"REST API: http://localhost:\" + options.port)}\n${gLine(\"WebSocket: ws://localhost:\" + options.port + \"/ws\")}\n${gLine(\"Status: * Ready for task connections\")}\n+${\"-\".repeat(w + 2)}+\n\nWaiting for Viber runtimes to connect...\nPress Ctrl+C to stop.\n `);\n};\n\nexport const gatewayCommand = new Command(\"gateway\")\n .description(\"Start the gateway (central coordinator for Viber runtimes)\")\n .option(\"-p, --port <port>\", \"Port to listen on\", \"6009\")\n .action(gatewayAction);\n\nexport const boardCommand = new Command(\"board\")\n .description(\"(deprecated: use 'gateway') Start the gateway\")\n .option(\"-p, --port <port>\", \"Port to listen on\", \"6009\")\n .action(gatewayAction);\n\nexport const hubCommand = new Command(\"hub\")\n .description(\"(deprecated: use 'gateway') Start the gateway\")\n .option(\"-p, --port <port>\", \"Port to listen on\", \"6009\")\n .action(gatewayAction);\n","import { Command } from \"commander\";\n\nexport const runCommand = new Command(\"run\")\n .argument(\"<goal>\", \"Goal to achieve\")\n .description(\"Run a task locally (thin daemon runtime, no Space)\")\n .option(\"-m, --model <model>\", \"LLM model to use\", \"deepseek/deepseek-chat\")\n .option(\"-a, --agent <agent>\", \"Agent config to use\", \"default\")\n .action(async (goal, options) => {\n // Load API keys from ~/.openviber/.env (does not override existing env vars)\n const { loadOpenViberEnv } = await import(\"../auth\");\n await loadOpenViberEnv();\n\n const { registerSkillTools } = await import(\"../../tools/skill-tools\");\n registerSkillTools();\n\n const { runTask } = await import(\"../../daemon/runtime\");\n\n console.log(`[Viber] Running task: ${goal}`);\n\n try {\n const { streamResult } = await runTask(goal, {\n taskId: `run-${Date.now()}`,\n model: options.model,\n singleAgentId: options.agent,\n });\n\n for await (const chunk of streamResult.fullStream) {\n if (chunk.type === \"text-delta\") {\n const text = (chunk as any).text ?? (chunk as any).textDelta;\n if (text) process.stdout.write(text);\n }\n }\n\n console.log(\"\\n\\n[Viber] Task completed\");\n } catch (error: any) {\n console.error(\"[Viber] Task failed:\", error.message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport * as readline from \"readline\";\nimport { isInteractiveTerminal, question, sleep, runSubcommand } from \"../common\";\nimport { gatewayGetVibers, gatewaySubmitTask, pollGatewayTask, GatewayViberListResponse, GatewayTask } from \"../gateway-client\";\n\nconst SAFE_SESSION_NAME_RE = /[^a-zA-Z0-9_.-]/g;\n\nfunction sanitizeSessionName(name: string): string {\n const trimmed = String(name || \"\").trim();\n const replaced = trimmed.replace(SAFE_SESSION_NAME_RE, \"-\").replace(/-+/g, \"-\");\n const safe = replaced.length > 0 ? replaced : \"chat\";\n return safe.slice(0, 120);\n}\n\nasync function promptNoVibersAction(\n gatewayUrl: string,\n): Promise<\"start\" | \"onboard\" | \"exit\"> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true,\n });\n\n try {\n console.log(\n `\\n[Chat] No vibers connected to gateway at ${gatewayUrl}\\n`,\n );\n console.log(\"Choose next step:\");\n console.log(\" 1) Start local daemon now\");\n console.log(\" 2) Run onboarding setup\");\n console.log(\" 3) Exit\\n\");\n\n const answer = (await question(rl, \"Select [1-3] (Enter for 1): \"))\n .trim()\n .toLowerCase();\n\n if (answer === \"\" || answer === \"1\" || answer === \"start\") return \"start\";\n if (answer === \"2\" || answer === \"onboard\") return \"onboard\";\n return \"exit\";\n } finally {\n rl.close();\n }\n}\n\nasync function handleChatCommand(\n input: string,\n ctx: {\n gatewayUrl: string;\n vibers: GatewayViberListResponse;\n getActiveViberId: () => string;\n setActiveViberId: (id: string) => void;\n resetHistory: () => Promise<void>;\n },\n): Promise<\"continue\" | \"exit\"> {\n const [cmd, ...rest] = input.slice(1).trim().split(/\\s+/);\n\n switch (cmd) {\n case \"exit\":\n case \"quit\":\n return \"exit\";\n case \"help\":\n console.log(\n [\n \"Commands:\",\n \" /help Show help\",\n \" /exit Exit chat\",\n \" /vibers List connected tasks\",\n \" /use <viberId> Switch active task runtime\",\n \" /reset Clear local history (and session file)\",\n ].join(\"\\n\"),\n );\n return \"continue\";\n case \"vibers\": {\n const vibers = await gatewayGetVibers(ctx.gatewayUrl);\n if (!vibers.connected || vibers.vibers.length === 0) {\n console.log(\"No tasks connected.\");\n return \"continue\";\n }\n console.log(\"Connected tasks:\");\n for (const v of vibers.vibers) {\n const active = v.id === ctx.getActiveViberId() ? \" (active)\" : \"\";\n console.log(` - ${v.id} (${v.name})${active}`);\n }\n return \"continue\";\n }\n case \"use\": {\n const next = rest[0];\n if (!next) {\n console.log(\"Usage: /use <viberId>\");\n return \"continue\";\n }\n const vibers = await gatewayGetVibers(ctx.gatewayUrl);\n const exists = vibers.vibers.some((v) => v.id === next);\n if (!exists) {\n console.log(`Task runtime not found: ${next}`);\n return \"continue\";\n }\n ctx.setActiveViberId(next);\n console.log(`Active task runtime: ${next}`);\n return \"continue\";\n }\n case \"reset\":\n await ctx.resetHistory();\n console.log(\"History cleared.\");\n return \"continue\";\n default:\n console.log(`Unknown command: /${cmd}. Try /help`);\n return \"continue\";\n }\n}\n\ntype JsonlMessage = { role: \"user\" | \"assistant\" | \"system\"; content: string };\n\nasync function readJsonlMessages(filePath: string): Promise<JsonlMessage[]> {\n try {\n const content = await fs.readFile(filePath, \"utf8\");\n const lines = content.split(\"\\n\").map((l) => l.trim()).filter(Boolean);\n const out: JsonlMessage[] = [];\n for (const line of lines) {\n try {\n const parsed = JSON.parse(line) as any;\n if (\n parsed &&\n (parsed.role === \"user\" ||\n parsed.role === \"assistant\" ||\n parsed.role === \"system\") &&\n typeof parsed.content === \"string\"\n ) {\n out.push({ role: parsed.role, content: parsed.content });\n }\n } catch {\n // ignore bad lines\n }\n }\n return out;\n } catch {\n return [];\n }\n}\n\nasync function appendJsonlMessage(filePath: string, msg: JsonlMessage): Promise<void> {\n const line = JSON.stringify({ ...msg, ts: Date.now() });\n await fs.appendFile(filePath, `${line}\\n`, \"utf8\");\n}\n\nexport const chatCommand = new Command(\"chat\")\n .description(\n \"Chat with a running task via the local gateway (works great inside a terminal session)\",\n )\n .option(\n \"--gateway <url>\",\n \"Gateway URL (defaults to VIBER_GATEWAY_URL or http://localhost:6009)\",\n )\n .option(\n \"--board <url>\",\n \"(deprecated: use --gateway) Gateway URL\",\n )\n .option(\n \"--hub <url>\",\n \"(deprecated: use --gateway) Gateway URL\",\n )\n .option(\"-v, --viber <id>\", \"Target task runtime ID (defaults to first connected)\")\n .option(\n \"-s, --session <name>\",\n \"Session name for local history (saved under ~/.openviber/tasks/default/sessions/)\",\n )\n .option(\"--no-save\", \"Do not write chat history to disk\")\n .action(async (options) => {\n const gatewayUrl: string =\n options.gateway || options.board || options.hub || process.env.VIBER_GATEWAY_URL || process.env.VIBER_BOARD_URL || process.env.VIBER_HUB_URL || \"http://localhost:6009\";\n const agentId = \"default\";\n\n const sessionsDir = path.join(\n os.homedir(),\n \".openviber\",\n \"tasks\",\n agentId,\n \"sessions\",\n );\n const rawSessionName =\n options.session || `chat-${new Date().toISOString().replace(/[:.]/g, \"-\")}`;\n const sessionName = sanitizeSessionName(rawSessionName);\n const sessionPath = path.join(sessionsDir, `${sessionName}.jsonl`);\n\n if (options.save !== false) {\n await fs.mkdir(sessionsDir, { recursive: true });\n }\n\n const vibers = await gatewayGetVibers(gatewayUrl);\n if (!vibers.connected || vibers.vibers.length === 0) {\n if (isInteractiveTerminal()) {\n const action = await promptNoVibersAction(gatewayUrl);\n if (action === \"start\") {\n process.exit(await runSubcommand([\"start\"]));\n }\n if (action === \"onboard\") {\n process.exit(await runSubcommand([\"onboard\"]));\n }\n }\n console.error(`[Chat] No tasks connected to gateway at ${gatewayUrl}`);\n console.error(\"[Chat] Start setup with one of:\");\n console.error(\" openviber onboard\");\n console.error(\" openviber start\");\n console.error(\" pnpm dev (or: pnpm dev:gateway + pnpm dev:viber)\");\n process.exit(1);\n }\n\n let activeViberId: string | undefined = options.viber;\n if (activeViberId) {\n const exists = vibers.vibers.some((v) => v.id === activeViberId);\n if (!exists) {\n console.error(`[Chat] Task runtime not found: ${activeViberId}`);\n console.error(\n `[Chat] Connected tasks:\\n${vibers.vibers.map((v) => ` - ${v.id} (${v.name})`).join(\"\\n\")}`,\n );\n process.exit(1);\n }\n } else {\n activeViberId = vibers.vibers[0]?.id;\n }\n\n const persistedMessages =\n options.save !== false ? await readJsonlMessages(sessionPath) : [];\n const messages: { role: \"user\" | \"assistant\" | \"system\"; content: string }[] =\n [...persistedMessages];\n\n console.log(\n `[Chat] Gateway: ${gatewayUrl}\\n[Chat] Viber: ${activeViberId}\\n[Chat] Session: ${options.save !== false ? sessionPath : \"(not saved)\"}\\n`,\n );\n console.log(\"Type your message and press Enter.\");\n console.log(\"Commands: /help, /exit, /vibers, /use <viberId>, /reset\\n\");\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true,\n });\n\n const cleanup = () => {\n try {\n rl.close();\n } catch {\n // ignore\n }\n };\n\n process.on(\"SIGINT\", () => {\n cleanup();\n process.exit(0);\n });\n\n while (true) {\n const line = await question(rl, \"you> \");\n const input = line.trim();\n if (!input) continue;\n\n if (input.startsWith(\"/\")) {\n const handled = await handleChatCommand(input, {\n gatewayUrl: gatewayUrl,\n vibers,\n getActiveViberId: () => activeViberId!,\n setActiveViberId: (id) => {\n activeViberId = id;\n },\n resetHistory: async () => {\n messages.length = 0;\n if (options.save !== false) {\n await fs.writeFile(sessionPath, \"\", \"utf8\");\n }\n },\n });\n if (handled === \"exit\") break;\n continue;\n }\n\n messages.push({ role: \"user\", content: input });\n if (options.save !== false) {\n await appendJsonlMessage(sessionPath, { role: \"user\", content: input });\n }\n\n const submit = await gatewaySubmitTask(gatewayUrl, {\n goal: input,\n viberId: activeViberId!,\n messages,\n });\n if (!submit) {\n console.error(\"[Chat] Failed to submit task\");\n continue;\n }\n\n process.stdout.write(\"viber> \");\n const result = await pollGatewayTask(gatewayUrl, submit.taskId, {\n pollIntervalMs: 1200,\n maxAttempts: 120,\n });\n\n if (!result) {\n console.log(\"Task timed out. No response received.\");\n continue;\n }\n\n if (result.status === \"error\") {\n const errText = `Error: ${result.error || \"Task failed\"}`;\n console.log(errText);\n messages.push({ role: \"assistant\", content: errText });\n if (options.save !== false) {\n await appendJsonlMessage(sessionPath, {\n role: \"assistant\",\n content: errText,\n });\n }\n continue;\n }\n\n const text =\n (typeof (result.result as any)?.text === \"string\"\n ? ((result.result as any).text as string).trim()\n : \"\") ||\n (typeof (result.result as any)?.summary === \"string\"\n ? ((result.result as any).summary as string).trim()\n : \"\") ||\n \"(No response text)\";\n\n console.log(text);\n messages.push({ role: \"assistant\", content: text });\n if (options.save !== false) {\n await appendJsonlMessage(sessionPath, {\n role: \"assistant\",\n content: text,\n });\n }\n }\n\n cleanup();\n });\n","import { Command } from \"commander\";\nimport WebSocket from \"ws\";\n\nfunction openWebSocket(url: string): Promise<WebSocket> {\n return new Promise((resolve, reject) => {\n const ws = new WebSocket(url);\n const timeout = setTimeout(() => {\n try {\n ws.close();\n } catch {\n // ignore\n }\n reject(new Error(\"WebSocket connect timed out\"));\n }, 5000);\n\n ws.once(\"open\", () => {\n clearTimeout(timeout);\n resolve(ws);\n });\n\n ws.once(\"error\", (err) => {\n clearTimeout(timeout);\n reject(err);\n });\n });\n}\n\nfunction waitForWsMessage(\n ws: WebSocket,\n predicate: (msg: any) => boolean,\n timeoutMs: number,\n): Promise<any> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n cleanup();\n reject(new Error(\"Timed out waiting for message\"));\n }, timeoutMs);\n\n const onMessage = (data: WebSocket.RawData) => {\n try {\n const msg = JSON.parse(data.toString());\n if (predicate(msg)) {\n cleanup();\n resolve(msg);\n }\n } catch {\n // ignore\n }\n };\n\n const onClose = () => {\n cleanup();\n reject(new Error(\"WebSocket closed\"));\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n ws.off(\"message\", onMessage);\n ws.off(\"close\", onClose);\n ws.off(\"error\", onClose as any);\n };\n\n ws.on(\"message\", onMessage);\n ws.once(\"close\", onClose);\n ws.once(\"error\", onClose as any);\n });\n}\n\nexport const termCommand = new Command(\"term\")\n .description(\"Interact with terminal panes via the viber local WS server (port 6008)\")\n .addHelpText(\n \"after\",\n `\nExamples:\n openviber term list\n openviber term create-session coding --window main\n openviber term attach coding:0.0\n openviber term send coding:0.0 \"ls -la\" --enter\n`,\n );\n\ntermCommand\n .command(\"list\")\n .description(\"List terminal sessions and panes\")\n .option(\"--ws <url>\", \"Local WS URL\", \"ws://localhost:6008\")\n .action(async (options) => {\n try {\n const ws = await openWebSocket(options.ws);\n ws.send(JSON.stringify({ type: \"terminal:list\" }));\n\n const msg = await waitForWsMessage(\n ws,\n (m) => m?.type === \"terminal:list\",\n 5000,\n );\n ws.close();\n\n const sessions = Array.isArray(msg?.sessions) ? msg.sessions : [];\n const panes = Array.isArray(msg?.panes) ? msg.panes : [];\n\n if (sessions.length === 0 && panes.length === 0) {\n console.log(\"No terminal sessions found (is the terminal backend installed?).\");\n return;\n }\n\n if (sessions.length > 0) {\n console.log(\"Sessions:\");\n for (const s of sessions) {\n console.log(\n ` - ${s.name} (windows=${s.windows ?? \"?\"}, attached=${s.attached ?? \"?\"})`,\n );\n }\n console.log(\"\");\n }\n\n if (panes.length > 0) {\n console.log(\"Panes:\");\n for (const p of panes) {\n console.log(\n ` - ${p.target} (${p.session}:${p.windowName} cmd=${p.command ?? \"?\"})`,\n );\n }\n }\n } catch (err: any) {\n console.error(\n `[term] Failed to list terminals via ${options.ws}: ${err?.message || String(err)}`,\n );\n process.exit(1);\n }\n });\n\ntermCommand\n .command(\"create-session [sessionName]\")\n .description(\"Create a terminal session (used for web-managed terminals)\")\n .option(\"--ws <url>\", \"Local WS URL\", \"ws://localhost:6008\")\n .option(\"--window <name>\", \"First window name\", \"main\")\n .option(\"--cwd <dir>\", \"Start directory for first window\")\n .action(async (sessionName, options) => {\n try {\n const ws = await openWebSocket(options.ws);\n ws.send(\n JSON.stringify({\n type: \"terminal:create-session\",\n sessionName: sessionName || \"coding\",\n windowName: options.window,\n cwd: options.cwd,\n }),\n );\n\n const msg = await waitForWsMessage(\n ws,\n (m) => m?.type === \"terminal:session-created\",\n 5000,\n );\n ws.close();\n\n if (msg?.ok) {\n console.log(\n `Session '${msg.sessionName}' ${msg.created ? \"created\" : \"already exists\"}.`,\n );\n } else {\n console.error(\n `Failed to create session: ${msg?.error || \"unknown error\"}`,\n );\n process.exit(1);\n }\n } catch (err: any) {\n console.error(\n `[term] Failed to create session via ${options.ws}: ${err?.message || String(err)}`,\n );\n process.exit(1);\n }\n });\n\ntermCommand\n .command(\"attach <target>\")\n .description(\"Attach to a terminal pane and stream output to stdout\")\n .option(\"--ws <url>\", \"Local WS URL\", \"ws://localhost:6008\")\n .action(async (target, options) => {\n let ws: WebSocket;\n try {\n ws = await openWebSocket(options.ws);\n } catch (err: any) {\n console.error(\n `[term] Failed to connect to ${options.ws}: ${err?.message || String(err)}`,\n );\n process.exit(1);\n }\n\n const onSigint = () => {\n try {\n ws.send(JSON.stringify({ type: \"terminal:detach\", target }));\n } catch {\n // ignore\n }\n ws.close();\n process.exit(0);\n };\n process.on(\"SIGINT\", onSigint);\n\n ws.on(\"message\", (data) => {\n try {\n const msg = JSON.parse(data.toString());\n if (msg?.type === \"terminal:output\" && msg?.target === target) {\n process.stdout.write(String(msg.data ?? \"\"));\n } else if (msg?.type === \"terminal:attached\" && msg?.target === target) {\n if (!msg.ok) {\n console.error(msg.error || \"Failed to attach\");\n ws.close();\n process.exit(1);\n }\n }\n } catch {\n // ignore non-JSON\n }\n });\n\n ws.send(JSON.stringify({ type: \"terminal:attach\", target }));\n await new Promise<void>((resolve) => ws.on(\"close\", () => resolve()));\n });\n\ntermCommand\n .command(\"send <target> [keys...]\")\n .description(\"Send keys to a terminal pane (use --enter to press Enter after)\")\n .option(\"--ws <url>\", \"Local WS URL\", \"ws://localhost:6008\")\n .option(\"--enter\", \"Send Enter after the keys\", false)\n .action(async (target, keys, options) => {\n try {\n const ws = await openWebSocket(options.ws);\n const text = Array.isArray(keys) ? keys.join(\" \") : String(keys ?? \"\");\n ws.send(JSON.stringify({ type: \"terminal:input\", target, keys: text }));\n if (options.enter) {\n ws.send(JSON.stringify({ type: \"terminal:input\", target, keys: \"Enter\" }));\n }\n ws.close();\n } catch (err: any) {\n console.error(\n `[term] Failed to send keys via ${options.ws}: ${err?.message || String(err)}`,\n );\n process.exit(1);\n }\n });\n\ntermCommand\n .command(\"resize <target>\")\n .description(\"Resize a terminal pane (cols/rows)\")\n .requiredOption(\"--cols <n>\", \"Columns\", (v) => parseInt(v, 10))\n .requiredOption(\"--rows <n>\", \"Rows\", (v) => parseInt(v, 10))\n .option(\"--ws <url>\", \"Local WS URL\", \"ws://localhost:6008\")\n .action(async (target, options) => {\n try {\n const ws = await openWebSocket(options.ws);\n ws.send(\n JSON.stringify({\n type: \"terminal:resize\",\n target,\n cols: options.cols,\n rows: options.rows,\n }),\n );\n const msg = await waitForWsMessage(\n ws,\n (m) => m?.type === \"terminal:resized\" && m?.target === target,\n 5000,\n );\n ws.close();\n if (!msg?.ok) {\n console.error(\"Resize failed\");\n process.exit(1);\n }\n } catch (err: any) {\n console.error(\n `[term] Failed to resize via ${options.ws}: ${err?.message || String(err)}`,\n );\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\n\nexport const loginCommand = new Command(\"login\")\n .description(\"Authenticate with command center and get a token\")\n .option(\"-s, --server <url>\", \"Command center URL\", \"http://localhost:3000\")\n .action(async (options) => {\n console.log(\"[Viber] Opening browser for authentication...\");\n console.log(`\\nVisit: ${options.server}/vibers/register`);\n console.log(\"\\nAfter authentication, you'll receive a token.\");\n console.log(\n \"Set it as VIBER_TOKEN environment variable or use --token option.\\n\",\n );\n\n // Try to open browser\n try {\n const { exec } = await import(\"child_process\");\n const url = `${options.server}/vibers/register`;\n\n if (process.platform === \"darwin\") {\n exec(`open \"${url}\"`);\n } else if (process.platform === \"linux\") {\n exec(`xdg-open \"${url}\"`);\n } else if (process.platform === \"win32\") {\n exec(`start \"${url}\"`);\n }\n } catch {\n // Ignore - user can manually open URL\n }\n });\n\nexport const authCommand = new Command(\"auth\")\n .description(\"Manage API keys and OAuth connections (Google, etc.)\")\n .addHelpText(\n \"after\",\n `\nSubcommands:\n google Connect Google account (Gmail OAuth)\n apikey Interactive API key setup\n status Show current auth status (keys + OAuth connections)\n revoke Disconnect an OAuth provider\n\nExamples:\n viber auth google # Connect Google (opens browser or shows URL)\n viber auth google --no-browser # Headless: print URL to paste on another machine\n viber auth apikey # Interactively set an LLM API key\n viber auth status # Show all configured credentials\n viber auth revoke google # Remove local Google OAuth tokens\n`,\n );\n\nauthCommand\n .command(\"google\")\n .description(\"Connect a Google account for Gmail and other Google services\")\n .option(\"--no-browser\", \"Headless mode: print URL instead of opening browser\")\n .action(async (options) => {\n const { runGoogleAuth, loadOpenViberEnv } = await import(\"../auth\");\n await loadOpenViberEnv();\n await runGoogleAuth({ noBrowser: options.browser === false });\n });\n\nauthCommand\n .command(\"apikey\")\n .description(\"Interactively configure an LLM provider API key\")\n .action(async () => {\n const { runApiKeySetup } = await import(\"../auth\");\n await runApiKeySetup();\n });\n\nauthCommand\n .command(\"status\")\n .description(\"Show current API keys and OAuth connection status\")\n .action(async () => {\n const { showAuthStatus, loadOpenViberEnv } = await import(\"../auth\");\n await loadOpenViberEnv();\n await showAuthStatus();\n });\n\nauthCommand\n .command(\"revoke\")\n .description(\"Disconnect a local OAuth provider\")\n .argument(\"<provider>\", \"OAuth provider to revoke (e.g. google)\")\n .action(async (provider: string) => {\n const { revokeOAuthProvider } = await import(\"../auth\");\n await revokeOAuthProvider(provider);\n });\n","import { Command } from \"commander\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { formatSkillHealthReport, getViberId, SkillHealthReport } from \"../common\";\n\nexport const statusCommand = new Command(\"status\")\n .description(\"Check viber status, machine resources, and configuration\")\n .option(\"--gateway <url>\", \"Gateway URL to query for node status\")\n .option(\"--board <url>\", \"(deprecated: use --gateway) Gateway URL\")\n .option(\"--hub <url>\", \"(deprecated: use --gateway) Gateway URL\")\n .option(\"--node <id>\", \"Node ID to query (defaults to local viber-id)\")\n .option(\"--json\", \"Output in JSON format\")\n .option(\"--local\", \"Show local machine resources only (no gateway connection)\")\n .action(async (options) => {\n const viberId = await getViberId();\n const hasToken = !!process.env.VIBER_TOKEN;\n const hasOpenRouter = !!process.env.OPENROUTER_API_KEY;\n\n const {\n collectMachineResourceStatus,\n formatBytes,\n formatUptime,\n } = await import(\"../../daemon/telemetry\");\n\n let skillHealthReport: SkillHealthReport | null = null;\n try {\n const { getSkillHealthReport } = await import(\"../../skills/health\");\n skillHealthReport = await getSkillHealthReport();\n } catch (err: any) {\n if (!options.json) {\n console.warn(\n `[status] Skill health check failed: ${err?.message || String(err)}`,\n );\n }\n }\n\n // Always show config status\n if (!options.json) {\n console.log(`\nViber Status\n────────────────────────────────────\n Viber ID: ${viberId}\n Token: ${hasToken ? \"✓ Set (VIBER_TOKEN)\" : \"✗ Not set\"}\n OpenRouter: ${hasOpenRouter ? \"✓ Set (OPENROUTER_API_KEY)\" : \"✗ Not set\"}\n Config Dir: ${path.join(os.homedir(), \".openviber\")}\n────────────────────────────────────`);\n }\n\n // Collect local machine status\n const machineStatus = await collectMachineResourceStatus();\n\n if (options.json) {\n // Try to get gateway status if available\n const statusGatewayUrl =\n options.gateway || options.board || options.hub ||\n process.env.VIBER_GATEWAY_URL || process.env.VIBER_BOARD_URL || process.env.VIBER_HUB_URL ||\n \"http://localhost:6009\";\n\n let gatewayNodeStatus = null;\n if (!options.local) {\n try {\n const daemonId = options.node || viberId;\n const res = await fetch(`${statusGatewayUrl}/api/vibers/${daemonId}/status`);\n if (res.ok) {\n gatewayNodeStatus = await res.json();\n }\n } catch {\n // Gateway not reachable, proceed with local only\n }\n }\n\n console.log(\n JSON.stringify(\n {\n viberId,\n config: {\n token: hasToken,\n openRouter: hasOpenRouter,\n configDir: path.join(os.homedir(), \".openviber\"),\n },\n skills: skillHealthReport,\n machine: machineStatus,\n gateway: gatewayNodeStatus,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (skillHealthReport) {\n const lines = formatSkillHealthReport(skillHealthReport);\n if (lines.length > 0) {\n console.log(lines.join(\"\\n\"));\n }\n }\n\n // Display machine resources\n const m = machineStatus;\n console.log(`\nMachine Resources\n────────────────────────────────────\n Hostname: ${m.hostname}\n Platform: ${m.platform}\n Arch: ${m.arch}\n System Uptime: ${formatUptime(m.systemUptimeSeconds)}\n\n CPU: ${m.cpu.cores} cores (${m.cpu.model.trim()})\n CPU Usage: ${m.cpu.averageUsage.toFixed(1)}% average\n Load Average: ${m.loadAverage.map((l) => l.toFixed(2)).join(\", \")}\n\n Memory Total: ${formatBytes(m.memory.totalBytes)}\n Memory Used: ${formatBytes(m.memory.usedBytes)} (${m.memory.usagePercent.toFixed(1)}%)\n Memory Free: ${formatBytes(m.memory.freeBytes)}`);\n\n if (m.disks.length > 0) {\n console.log(\"\");\n console.log(\" Disks:\");\n for (const d of m.disks) {\n console.log(\n ` ${d.mount.padEnd(12)} ${formatBytes(d.usedBytes)} / ${formatBytes(d.totalBytes)} (${d.usagePercent.toFixed(1)}%)`,\n );\n }\n }\n\n if (m.network.length > 0) {\n const nonInternal = m.network.filter((n) => !n.internal);\n if (nonInternal.length > 0) {\n console.log(\"\");\n console.log(\" Network:\");\n for (const iface of nonInternal) {\n console.log(\n ` ${iface.name.padEnd(12)} ${iface.ipv4 || \"\"}${iface.ipv6 ? \" \" + iface.ipv6 : \"\"}`,\n );\n }\n }\n }\n\n console.log(\"────────────────────────────────────\");\n\n // Try to get gateway-based viber running status\n if (!options.local) {\n const statusGatewayUrl2 =\n options.gateway || options.board || options.hub ||\n process.env.VIBER_GATEWAY_URL || process.env.VIBER_BOARD_URL || process.env.VIBER_HUB_URL ||\n \"http://localhost:6009\";\n\n try {\n const daemonId = options.node || viberId;\n const res = await fetch(`${statusGatewayUrl2}/api/vibers/${daemonId}/status`);\n if (res.ok) {\n const data = await res.json() as any;\n if (data.status?.viber) {\n const v = data.status.viber;\n console.log(`\nViber Running Status (from gateway)\n────────────────────────────────────\n Connected: ● Yes\n Daemon Uptime: ${formatUptime(v.daemonUptimeSeconds)}\n Running Tasks: ${v.runningTaskCount}\n Total Tasks: ${v.totalTasksExecuted}\n Process RSS: ${formatBytes(v.processMemory?.rss || 0)}\n Heap Used: ${formatBytes(v.processMemory?.heapUsed || 0)}\n Skills: ${(v.skills || []).join(\", \") || \"none\"}\n Capabilities: ${(v.capabilities || []).join(\", \") || \"none\"}\n────────────────────────────────────`);\n }\n }\n } catch {\n console.log(`\n (Gateway not reachable at default URL — use --gateway to specify)`);\n }\n }\n\n console.log(\"\");\n });\n","import { Command } from \"commander\";\nimport * as path from \"path\";\nimport * as fs from \"fs/promises\";\nimport YAML from \"yaml\";\nimport {\n OPENVIBER_DIR,\n CONFIG_FILE,\n getViberId,\n formatSkillHealthReport,\n loadSavedConfig,\n} from \"../common\";\nimport { loadSettings, saveSettings } from \"../../skills/hub/settings\";\n\nexport const onboardCommand = new Command(\"onboard\")\n .description(\"Set up OpenViber on this machine (use --token to connect to OpenViber Web)\")\n .option(\"-t, --token <token>\", \"Onboard token from OpenViber Web (connect mode)\")\n .option(\"--gateway <url>\", \"Gateway URL override (default: auto from web)\")\n .option(\"--board <url>\", \"(deprecated: use --gateway) Gateway URL override\")\n .option(\"--hub <url>\", \"(deprecated: use --gateway) Gateway URL override\")\n .option(\"--no-interactive\", \"Skip interactive prompts (just scaffold and show health report)\")\n .action(async (options) => {\n const configDir = OPENVIBER_DIR;\n const vibersDir = path.join(configDir, \"vibers\");\n const skillsDir = path.join(configDir, \"skills\");\n\n console.log(`\n+-------------------------------------------------------+\n| OPENVIBER SETUP |\n+-------------------------------------------------------+\n`);\n\n // Create directories\n console.log(\"Creating directories...\");\n await fs.mkdir(configDir, { recursive: true });\n await fs.mkdir(vibersDir, { recursive: true });\n await fs.mkdir(skillsDir, { recursive: true });\n console.log(` ✓ ${configDir}`);\n console.log(` ✓ ${vibersDir}`);\n console.log(` ✓ ${skillsDir}`);\n\n // ===== Connected mode: onboard with token =====\n if (options.token) {\n console.log(\"\\nConnecting to OpenViber Web...\");\n\n // Determine the web URL to call\n const webBaseUrl = options.gateway || options.board || options.hub || process.env.OPENVIBER_WEB_URL || \"http://localhost:6006\";\n\n try {\n const response = await fetch(`${webBaseUrl}/api/vibers/onboard`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ token: options.token }),\n });\n\n if (!response.ok) {\n const err = await response.json().catch(() => ({ error: \"Unknown error\" }));\n console.error(`\\n ✗ Onboarding failed: ${err.error || \"Invalid or expired token\"}`);\n console.error(\"\\n Create a new viber node on the web and try again.\");\n process.exit(1);\n }\n\n const data = await response.json() as {\n ok: boolean;\n viberId: string;\n name: string;\n authToken: string;\n config: Record<string, unknown>;\n };\n\n // Determine the board server WebSocket URL from the web URL\n const gatewayWsUrl = (options.gateway || options.board || options.hub)\n ? (options.gateway || options.board || options.hub).replace(/^http/, \"ws\") + \"/ws\"\n : webBaseUrl.replace(/^http/, \"ws\").replace(\":6006\", \":6009\") + \"/ws\";\n\n // Save config for future `openviber start` calls\n const savedConfig = {\n mode: \"connected\",\n viberId: data.viberId,\n name: data.name,\n gatewayUrl: gatewayWsUrl,\n boardUrl: gatewayWsUrl, // deprecated compat\n hubUrl: gatewayWsUrl, // deprecated compat\n authToken: data.authToken,\n webUrl: webBaseUrl,\n onboardedAt: new Date().toISOString(),\n };\n\n await fs.writeFile(\n CONFIG_FILE,\n `# OpenViber Config — auto-generated by 'openviber onboard --token'\n# Do not edit manually. Manage your viber at ${webBaseUrl}\n${YAML.stringify(savedConfig)}`,\n );\n\n console.log(` ✓ Connected to ${webBaseUrl}`);\n console.log(` ✓ Viber: ${data.name} (${data.viberId.slice(0, 8)}...)`);\n console.log(` ✓ Config saved to ${CONFIG_FILE}`);\n\n } catch (error: any) {\n console.error(`\\n ✗ Failed to connect: ${error.message}`);\n console.error(`\\n Make sure the OpenViber web is running at ${options.gateway || options.board || options.hub || \"http://localhost:6006\"}.`);\n process.exit(1);\n }\n } else {\n // ===== Standalone mode: local-only setup =====\n console.log(\"Setting up standalone mode (local-only)...\");\n\n // Save standalone config\n const savedConfig = {\n mode: \"standalone\",\n onboardedAt: new Date().toISOString(),\n };\n\n try {\n await fs.access(CONFIG_FILE);\n console.log(`\\n ⏭ config.yaml already exists, skipping`);\n } catch {\n await fs.writeFile(\n CONFIG_FILE,\n `# OpenViber Config — standalone mode\\n# To connect to OpenViber Web, re-run: openviber onboard --token <token>\\n${YAML.stringify(savedConfig)}`,\n );\n console.log(` ✓ Created config.yaml (standalone mode)`);\n }\n }\n\n // Scaffold viber files (both modes)\n const defaultViberPath = path.join(configDir, \"viber.yaml\");\n try {\n await fs.access(defaultViberPath);\n console.log(`\\n ⏭ viber.yaml already exists, skipping`);\n } catch {\n const defaultViber = `# Default Viber Configuration\nname: default\ndescription: General-purpose assistant\n\n# LLM Provider (openrouter recommended for multi-model access)\nprovider: openrouter\nmodel: anthropic/claude-sonnet-4-20250514\n\n# System prompt\nsystemPrompt: |\n You are a helpful AI assistant running on the user's local machine.\n You have access to files, terminal, and browser tools.\n Be concise and helpful.\n\n# Tools available to this viber\ntools:\n - file\n - terminal\n - browser\n\n# Working mode: \"always-ask\" | \"viber-decides\" | \"always-execute\"\nworkingMode: viber-decides\n`;\n await fs.writeFile(defaultViberPath, defaultViber);\n console.log(`\\n ✓ Created viber.yaml`);\n }\n\n // Create USER.md (shared across vibers)\n const userMdPath = path.join(configDir, \"USER.md\");\n try {\n await fs.access(userMdPath);\n } catch {\n await fs.writeFile(userMdPath, \"# User Context\\n\\nDescribe who you are and what you're working on.\\n\");\n console.log(` ✓ Created USER.md`);\n }\n\n // Create IDENTITY.md (shared across vibers)\n const identityMdPath = path.join(configDir, \"IDENTITY.md\");\n try {\n await fs.access(identityMdPath);\n } catch {\n await fs.writeFile(identityMdPath, \"# Identity\\n\\nDefine the identity of this machine or deployment.\\n\");\n console.log(` ✓ Created IDENTITY.md`);\n }\n\n // Create per-viber SOUL.md and MEMORY.md\n const defaultViberDir = path.join(vibersDir, \"default\");\n await fs.mkdir(defaultViberDir, { recursive: true });\n\n const soulPath = path.join(defaultViberDir, \"SOUL.md\");\n try {\n await fs.access(soulPath);\n } catch {\n await fs.writeFile(soulPath, \"# Soul\\n\\nDefine this viber's personality and communication style.\\n\");\n console.log(` ✓ Created vibers/default/SOUL.md`);\n }\n\n const memoryPath = path.join(defaultViberDir, \"MEMORY.md\");\n try {\n await fs.access(memoryPath);\n } catch {\n await fs.writeFile(memoryPath, \"# Memory\\n\\nLong-term notes and context.\\n\");\n console.log(` ✓ Created vibers/default/MEMORY.md`);\n }\n\n // Generate viber ID\n const viberId = await getViberId();\n\n // Load any previously saved API keys from ~/.openviber/.env\n const { loadOpenViberEnv, runOnboardingWizard } = await import(\"../auth\");\n await loadOpenViberEnv();\n\n // Interactive onboarding wizard (LLM key, skill picker, skill setup)\n // or passive health report with --no-interactive\n let selectedSkills: string[] = [];\n\n if (options.interactive === false) {\n // Non-interactive: just show the health report (legacy behavior)\n try {\n const { getSkillHealthReport } = await import(\"../../skills/health\");\n const report = await getSkillHealthReport();\n const lines = formatSkillHealthReport(report);\n if (lines.length > 0) {\n console.log(lines.join(\"\\n\"));\n }\n } catch (err: any) {\n console.warn(\n `[onboard] Skill health check failed: ${err?.message || String(err)}`,\n );\n }\n } else {\n // Interactive: full wizard\n try {\n selectedSkills = await runOnboardingWizard();\n\n // Save selected skills to settings.yaml\n if (selectedSkills.length > 0) {\n const settings = await loadSettings();\n settings.standaloneSkills = Array.from(\n new Set([...(settings.standaloneSkills || []), ...selectedSkills]),\n );\n await saveSettings(settings);\n }\n } catch (err: any) {\n console.warn(\n `[onboard] Interactive setup failed: ${err?.message || String(err)}`,\n );\n // Fall back to passive health report\n try {\n const { getSkillHealthReport } = await import(\"../../skills/health\");\n const report = await getSkillHealthReport();\n const lines = formatSkillHealthReport(report);\n if (lines.length > 0) {\n console.log(lines.join(\"\\n\"));\n }\n } catch {\n // ignore\n }\n }\n }\n\n const mode = options.token ? \"connected\" : \"standalone\";\n const nextCmd = options.token\n ? \"openviber start\"\n : \"openviber start (or: openviber run \\\"Hello!\\\")\";\n const connectHint = options.token\n ? \"\"\n : \"\\n To connect to OpenViber Web later:\\n openviber onboard --token <token-from-web>\\n\";\n\n console.log(`\n────────────────────────────────────────────────────────────\nSetup complete! (${mode} mode)\n\nYour viber ID: ${viberId}\nConfig directory: ${configDir}\n\nNext step:\n ${nextCmd}\n${connectHint}\n────────────────────────────────────────────────────────────\n`);\n });\n","import { Command } from \"commander\";\n\nexport const skillCommand = new Command(\"skill\")\n .description(\"Explore, import, and manage skills from external sources\")\n .addHelpText(\n \"after\",\n `\nSources:\n openclaw OpenClaw Skill Hub (community registry)\n github GitHub repositories (tagged with openviber-skill topic)\n npm npm packages (with openviber-skill keyword)\n huggingface Hugging Face models/spaces\n smithery Smithery MCP server registry\n composio Composio tool integrations (250+ SaaS)\n glama Glama MCP server directory\n\nExamples:\n openviber skill search \"web scraping\"\n openviber skill search --source github \"browser automation\"\n openviber skill search --source smithery \"filesystem\"\n openviber skill info github dustland/openviber-skill-web\n openviber skill import dustland/openviber-skill-web\n openviber skill import npm:@openviber-skills/web-search\n openviber skill import smithery:@anthropic/mcp-server-filesystem\n openviber skill list\n openviber skill remove my-skill\n openviber skill verify cursor-agent\n`,\n );\n\nskillCommand\n .command(\"search [query]\")\n .description(\"Search for skills across external hubs\")\n .option(\"-s, --source <source>\", \"Source to search (openclaw, github, npm, huggingface, smithery, composio, glama)\")\n .option(\"--tags <tags>\", \"Filter by tags (comma-separated)\")\n .option(\"--author <author>\", \"Filter by author\")\n .option(\"--sort <sort>\", \"Sort order: relevance, popularity, recent, name\", \"relevance\")\n .option(\"-n, --limit <limit>\", \"Results per page\", \"20\")\n .option(\"-p, --page <page>\", \"Page number\", \"1\")\n .action(async (query, options) => {\n const { getSkillHubManagerWithSettings } = await import(\"../../skills/hub/manager\");\n const manager = await getSkillHubManagerWithSettings();\n\n const source = options.source as any;\n const searchQuery = {\n query: query || undefined,\n tags: options.tags ? options.tags.split(\",\").map((t: string) => t.trim()) : undefined,\n author: options.author,\n sort: options.sort as any,\n limit: parseInt(options.limit, 10),\n page: parseInt(options.page, 10),\n };\n\n console.log(`\\nSearching for skills${query ? ` matching \"${query}\"` : \"\"}${source ? ` on ${source}` : \" across all sources\"}...\\n`);\n\n const result = await manager.search(searchQuery, source);\n\n if (result.skills.length === 0) {\n console.log(\"No skills found. Try a different query or source.\");\n console.log(\"\\nTip: Use --source github to search GitHub repositories\");\n console.log(\" Use --source npm to search npm packages\");\n return;\n }\n\n // Display results in a table-like format\n console.log(`Found ${result.total} skill(s) (page ${result.page}/${result.totalPages}):\\n`);\n\n const maxNameLen = Math.max(20, ...result.skills.map((s) => s.name.length));\n const nameCol = Math.min(maxNameLen, 35);\n\n for (const skill of result.skills) {\n const name = skill.name.padEnd(nameCol).slice(0, nameCol);\n const desc = (skill.description || \"(no description)\").slice(0, 50);\n const source = skill.source.padEnd(8);\n const stars = skill.popularity ? `★${skill.popularity}` : \"\";\n const version = skill.version !== \"latest\" ? `v${skill.version}` : \"\";\n const meta = [source, stars, version].filter(Boolean).join(\" \");\n\n console.log(` ${name} ${desc}`);\n console.log(` ${\"\".padEnd(nameCol)} ${meta} ${skill.author}`);\n console.log(\"\");\n }\n\n if (result.totalPages > result.page) {\n console.log(`\\nPage ${result.page}/${result.totalPages}. Use --page ${result.page + 1} to see more.`);\n }\n\n console.log(`\\nTo import: openviber skill import <skill-id>`);\n console.log(`For details: openviber skill info <source> <skill-id>`);\n });\n\nskillCommand\n .command(\"info <source> <skillId>\")\n .description(\"Get detailed info about a skill (source: openclaw, github, npm)\")\n .action(async (source, skillId) => {\n const { getSkillHubManager } = await import(\"../../skills/hub\");\n const manager = getSkillHubManager();\n\n console.log(`\\nFetching info for '${skillId}' from ${source}...\\n`);\n\n const info = await manager.getSkillInfo(skillId, source as any);\n\n if (!info) {\n console.error(`Skill not found: ${skillId} on ${source}`);\n process.exit(1);\n }\n\n console.log(`╭─────────────────────────────────────────────────────╮`);\n console.log(`│ ${info.name.padEnd(52)}│`);\n console.log(`├─────────────────────────────────────────────────────┤`);\n console.log(`│ Source: ${info.source.padEnd(38)}│`);\n console.log(`│ Author: ${info.author.padEnd(38)}│`);\n console.log(`│ Version: ${info.version.padEnd(38)}│`);\n if (info.license) {\n console.log(`│ License: ${info.license.padEnd(38)}│`);\n }\n if (info.popularity) {\n console.log(`│ Popularity: ${String(info.popularity).padEnd(38)}│`);\n }\n if (info.tags?.length) {\n console.log(`│ Tags: ${info.tags.slice(0, 5).join(\", \").padEnd(38)}│`);\n }\n if (info.url) {\n console.log(`│ URL: ${info.url.slice(0, 38).padEnd(38)}│`);\n }\n if (info.updatedAt) {\n console.log(`│ Updated: ${info.updatedAt.slice(0, 10).padEnd(38)}│`);\n }\n console.log(`╰─────────────────────────────────────────────────────╯`);\n\n if (info.description) {\n console.log(`\\n${info.description}`);\n }\n\n if (info.readme) {\n console.log(`\\n--- README ---\\n`);\n // Show first 40 lines of readme\n const lines = info.readme.split(\"\\n\");\n console.log(lines.slice(0, 40).join(\"\\n\"));\n if (lines.length > 40) {\n console.log(`\\n... (${lines.length - 40} more lines)`);\n }\n }\n\n if (info.dependencies?.length) {\n console.log(`\\nDependencies: ${info.dependencies.join(\", \")}`);\n }\n\n console.log(`\\nTo import: openviber skill import ${info.source === \"npm\" ? \"npm:\" : info.source === \"github\" ? \"\" : \"openclaw:\"}${info.id}`);\n });\n\nskillCommand\n .command(\"import <skillId>\")\n .description(\"Import a skill from an external source\")\n .option(\"-s, --source <source>\", \"Source override (openclaw, github, npm)\")\n .option(\"-d, --dir <dir>\", \"Custom install directory (default: ~/.openviber/skills)\")\n .action(async (skillId, options) => {\n const { getSkillHubManager } = await import(\"../../skills/hub\");\n const manager = getSkillHubManager();\n\n console.log(`\\nImporting skill '${skillId}'...\\n`);\n\n const result = await manager.importSkill(skillId, {\n source: options.source as any,\n targetDir: options.dir,\n });\n\n if (result.ok) {\n console.log(`\\n✓ ${result.message}`);\n console.log(`\\nThe skill is now available in your local skills directory.`);\n console.log(`Restart your viber to load the new skill.\\n`);\n } else {\n console.error(`\\n✗ ${result.message}`);\n if (result.error) {\n console.error(` Error: ${result.error}`);\n }\n process.exit(1);\n }\n });\n\nskillCommand\n .command(\"list\")\n .description(\"List locally installed skills\")\n .action(async () => {\n const { getSkillHubManager } = await import(\"../../skills/hub\");\n const manager = getSkillHubManager();\n\n const installed = await manager.listInstalled();\n\n if (installed.length === 0) {\n console.log(\"\\nNo external skills installed.\\n\");\n console.log(\"Search for skills: openviber skill search <query>\");\n console.log(\"Import from GitHub: openviber skill import owner/repo\");\n console.log(\"Import from npm: openviber skill import npm:<package>\\n\");\n return;\n }\n\n console.log(`\\nInstalled skills (${installed.length}):\\n`);\n\n const maxNameLen = Math.max(15, ...installed.map((s) => s.name.length));\n const nameCol = Math.min(maxNameLen, 30);\n\n for (const skill of installed) {\n const name = skill.name.padEnd(nameCol).slice(0, nameCol);\n const source = (skill.source || \"local\").padEnd(10);\n const version = skill.version || \"\";\n console.log(` ${name} ${source} ${version}`);\n console.log(` ${\"\".padEnd(nameCol)} ${skill.dir}`);\n console.log(\"\");\n }\n });\n\nskillCommand\n .command(\"remove <name>\")\n .description(\"Remove a locally installed skill\")\n .action(async (name) => {\n const { getSkillHubManager } = await import(\"../../skills/hub\");\n const manager = getSkillHubManager();\n\n const result = await manager.removeSkill(name);\n\n if (result.ok) {\n console.log(`\\n✓ ${result.message}\\n`);\n } else {\n console.error(`\\n✗ ${result.message}\\n`);\n process.exit(1);\n }\n });\n\nskillCommand\n .command(\"verify <skillId>\")\n .description(\"Run a skill playground scenario to verify a skill works\")\n .action(async (skillId) => {\n console.error(`\\n✗ Skill verification is temporarily unavailable for '${skillId}'.`);\n console.error(\n \" The playground verifier tool is not bundled in this release.\\n\",\n );\n process.exit(1);\n });\n","import { Command } from \"commander\";\nimport type { ChannelRuntimeContext, InboundMessage, InterruptSignal } from \"../../channels/channel\";\n\nexport const channelsCommand = new Command(\"channels\")\n .description(\"Start the enterprise channel server (DingTalk, WeCom, WeChat, Discord, Feishu webhooks)\")\n .option(\"-p, --port <port>\", \"Channel server port\", \"6009\")\n .action(async (options) => {\n const { channelManager } = await import(\"../../channels/manager\");\n const { ChannelGateway } = await import(\"../../channels/gateway\");\n const { loadGatewayBootstrapConfig } = await import(\"../../channels/config\");\n const {\n registerBuiltinChannels,\n createChannelsFromConfig,\n } = await import(\"../../channels/builtin\");\n\n console.log(`\n+-------------------------------------------------------+\n| CHANNELS STARTING |\n+-------------------------------------------------------+\n`);\n\n const bootstrap = await loadGatewayBootstrapConfig({\n port: parseInt(options.port, 10),\n });\n\n registerBuiltinChannels();\n\n const context: ChannelRuntimeContext = {\n routeMessage: (message: InboundMessage) => channelManager.routeMessage(message),\n handleInterrupt: (signal: InterruptSignal) => channelManager.handleInterrupt(signal),\n };\n\n const channelInstances = createChannelsFromConfig(bootstrap.channels, context);\n const channelNames = channelInstances.map((channel) => channel.id);\n\n if (channelInstances.length === 0) {\n console.log(`\nNo channels configured. Set environment variables to enable channels:\n\nDingTalk:\n DINGTALK_APP_KEY, DINGTALK_APP_SECRET, DINGTALK_ROBOT_CODE\n\nWeCom:\n WECOM_CORP_ID, WECOM_AGENT_ID, WECOM_AGENT_SECRET\n WECOM_TOKEN, WECOM_ENCODING_AES_KEY (optional)\n\nWeChat:\n WECHAT_API_KEY, WECHAT_PROXY_URL (optional: WECHAT_ACCOUNT_ID)\n\nDiscord:\n DISCORD_BOT_TOKEN (optional: DISCORD_APP_ID, DISCORD_ALLOW_GUILDS, DISCORD_ALLOW_CHANNELS)\n\nFeishu:\n FEISHU_APP_ID, FEISHU_APP_SECRET (optional: FEISHU_VERIFICATION_TOKEN, FEISHU_DOMAIN)\n\nOr configure channels from the OpenViber web and re-run: viber channels\n`);\n process.exit(1);\n }\n\n const gateway = new ChannelGateway(bootstrap.gateway, channelInstances, channelManager);\n\n await gateway.start();\n\n // Handle graceful shutdown\n process.on(\"SIGINT\", async () => {\n console.log(\"\\n[Channels] Shutting down...\");\n await gateway.stop();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n console.log(\"\\n[Channels] Shutting down...\");\n await gateway.stop();\n process.exit(0);\n });\n\n const basePath = bootstrap.gateway.basePath || \"/\";\n\n console.log(`\n+-------------------------------------------------------+\n| CHANNELS RUNNING |\n+-------------------------------------------------------+\n| Channels: ${channelNames.join(\", \").slice(0, 43).padEnd(43)} |\n| Webhooks: ${`${bootstrap.gateway.host}:${bootstrap.gateway.port}${basePath}`.slice(0, 43).padEnd(43)} |\n| Status: * Ready |\n+-------------------------------------------------------+\n\nListening for messages from enterprise channels...\nPress Ctrl+C to stop.\n`);\n });\n"],"mappings":"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","names":["path","path","os","fs","path","config","execSync","fs","path","config","execSync","fs","path","config","execSync","fs","path","config","execSync","fs","path","config","execSync","fs","path","config","fs","path","DEFAULT_API_URL","config","execSync","path","fs","loadSkillSourcesConfig","config","YAML","fs","path","YAML","config","fs","path","__dirname","stat","fs","path","os","fs","path","hasGeminiCredentials","loadSettings","fs","path","readline","spawn","question","resolve","config","loadSavedConfig","YAML","sleep","checkSkillHealth","authCommand","getSkillHealthReport","checkSkillsHealth","config","getViberRoot","path","os","fs","yaml","__dirname","config","path","fs","config","z","fs","path","config","content","stats","files","z","config","z","config","z","config","resolve","z","config","resolve","z","exec","path","z","exec","config","resolve","z","fs","path","yaml","homedir","config","z","fs","path","homedir","config","tools","buildToolMap","log","init_registry","config","init_registry","buildToolMap","fs","path","yaml","config","Agent","config","loadViberConfig","fs","path","yaml","getViberRoot","config","createProxyFetch","__dirname","fs","path","getViberRoot","spawn","spawnSync","EventEmitter","existsSync","sanitizeName","window","safeSession","os","exec","execAsync","resolve","cpus","createAnthropic","createOpenAI","createOpenRouter","config","EventEmitter","WebSocket","spawnSync","config","defaultRegistry","checkSkillsHealth","checkSkillHealth","authCommand","resolve","getSkillHealthReport","configVersion","z","execSync","spawnSync","path","captureTmuxPane","elapsed","detection","z","spawn","fs","path","getTailLines","DEFAULT_TAIL_LINES","resolve","MIN_WAIT_SECONDS","getTools","DEFAULT_WAIT_SECONDS","z","spawn","fs","path","truncateOutput","MAX_CAPTURE_CHARS","getTailLines","DEFAULT_TAIL_LINES","resolveWorkingDirectory","resolve","MIN_WAIT_SECONDS","formatResult","getTools","DEFAULT_WAIT_SECONDS","syncGeminiCredentials","z","execSync","path","os","getTools","init_github","z","execSync","spawnSync","path","fs","SAFE_RE","resolveCommand","sleep","resolve","safeSession","getTools","authCommand","init_terminal","z","fs","os","path","truncateOutput","MAX_CAPTURE_CHARS","getTailLines","DEFAULT_TAIL_LINES","resolveWorkingDirectory","sanitizeName","config","formatResult","resolve","getTools","z","getTools","z","os","execSync","hostname","getTools","getTools","init_registry","init_github","init_terminal","URL","resolve","path","randomUUID","config","URL","checkSkillHealth","createServer","config","resolve","createServer","WebSocketServer","WebSocket","config","resolve","path","config","getViberRoot","generateText","z","config","loadViberConfig","startSpace","getViberRoot","fs","path","manager_exports","EventEmitter","log","init_manager","createServer","URL","resolve","config","config_exports","fs","os","path","YAML","config","CONFIG_FILE","init_config","crypto","safeJsonParse","config","crypto","config","safeJsonParse","config","EventEmitter","init_web","config","config","config","safeJsonParse","path","config","init_registry","config","init_web","init_registry","path","path","resolve","os","path","loadOpenViberEnv","JobScheduler","ViberController","registerSkillTools","ensureSkillsReady","GatewayServer","LocalServer","Command","GatewayServer","Command","runCommand","loadOpenViberEnv","registerSkillTools","runTask","Command","os","path","fs","readline","Command","Command","WebSocket","resolve","Command","exec","runGoogleAuth","loadOpenViberEnv","runApiKeySetup","showAuthStatus","revokeOAuthProvider","Command","path","os","Command","collectMachineResourceStatus","formatBytes","formatUptime","getSkillHealthReport","Command","path","fs","YAML","Command","YAML","loadOpenViberEnv","runOnboardingWizard","getSkillHealthReport","Command","getSkillHubManagerWithSettings","source","getSkillHubManager","Command","channelManager","ChannelGateway","loadGatewayBootstrapConfig","registerBuiltinChannels","createChannelsFromConfig","runCommand"]}
|