@sesamespace/hivemind 0.11.5 → 0.12.1

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../packages/runtime/src/logger.ts","../packages/runtime/src/llm-client.ts","../packages/runtime/src/memory-client.ts","../packages/runtime/src/context.ts","../packages/runtime/src/task-engine.ts","../packages/runtime/src/prompt.ts","../packages/runtime/src/session.ts","../packages/runtime/src/compaction.ts","../packages/runtime/src/agent.ts","../packages/runtime/src/events.ts","../packages/runtime/src/config.ts","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js","../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js","../node_modules/.pnpm/@sesamespace+sdk@0.1.6/node_modules/@sesamespace/sdk/src/client.ts","../node_modules/.pnpm/@sesamespace+sdk@0.1.6/node_modules/@sesamespace/sdk/src/auth.ts","../node_modules/.pnpm/@sesamespace+sdk@0.1.6/node_modules/@sesamespace/sdk/src/verify-webhook.ts","../packages/runtime/src/sesame.ts","../packages/runtime/src/skills.ts","../packages/runtime/src/processors/error-registry.ts","../packages/runtime/src/processors/log-watcher.ts","../packages/runtime/src/memory/background-processor.ts","../packages/runtime/src/processors/auto-debugger.ts","../packages/runtime/src/pipeline.ts","../packages/runtime/src/health.ts","../packages/runtime/src/request-logger.ts","../packages/runtime/src/dashboard.ts","../packages/runtime/src/tool-registry.ts","../packages/runtime/src/tools/shell.ts","../packages/runtime/src/tools/files.ts","../packages/runtime/src/tools/web.ts","../packages/runtime/src/tools/memory.ts","../packages/runtime/src/tools/events.ts","../packages/runtime/src/tools/spawn.ts","../packages/runtime/src/tools/vision.ts","../packages/runtime/src/tools/git.ts","../packages/runtime/src/tools/browser.ts","../packages/runtime/src/tools/system.ts","../packages/runtime/src/tools/http-server.ts","../packages/runtime/src/tools/watch.ts","../packages/runtime/src/tools/macos.ts","../packages/runtime/src/tools/data.ts","../packages/runtime/src/tools/coding-agent.ts","../packages/runtime/src/tools/learn.ts","../packages/runtime/src/tools/register.ts","../packages/runtime/src/tools/messaging.ts","../packages/runtime/src/tools/skills-tools.ts","../packages/runtime/src/fleet/worker-server.ts","../packages/runtime/src/fleet/worker-protocol.ts","../packages/runtime/src/worker.ts"],"sourcesContent":["export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst LEVELS: Record<LogLevel, number> = { debug: 0, info: 1, warn: 2, error: 3 };\n\nlet currentLevel: LogLevel = (process.env.HIVEMIND_LOG_LEVEL as LogLevel) || 'info';\n\nexport function setLogLevel(level: LogLevel) { currentLevel = level; }\n\nexport function createLogger(component: string) {\n const log = (level: LogLevel, msg: string, data?: Record<string, unknown>) => {\n if (LEVELS[level] < LEVELS[currentLevel]) return;\n const entry = {\n ts: new Date().toISOString(),\n level,\n component,\n msg,\n ...data,\n };\n const line = JSON.stringify(entry);\n if (level === 'error') console.error(line);\n else if (level === 'warn') console.warn(line);\n else console.log(line);\n };\n\n return {\n debug: (msg: string, data?: Record<string, unknown>) => log('debug', msg, data),\n info: (msg: string, data?: Record<string, unknown>) => log('info', msg, data),\n warn: (msg: string, data?: Record<string, unknown>) => log('warn', msg, data),\n error: (msg: string, data?: Record<string, unknown>) => log('error', msg, data),\n };\n}\n","import { execSync } from \"child_process\";\nimport type { LLMConfig } from \"./config.js\";\nimport type { ToolDefinition, ToolCall } from \"./tool-registry.js\";\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string | null;\n tool_calls?: ToolCall[];\n tool_call_id?: string;\n}\n\nexport interface ChatResponse {\n content: string;\n model: string;\n tool_calls?: ToolCall[];\n finish_reason?: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\n// --- Anthropic format conversion helpers ---\n\nfunction convertMessagesForAnthropic(messages: ChatMessage[]) {\n let system = '';\n const converted: Array<{ role: string; content: any }> = [];\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n system = msg.content ?? '';\n continue;\n }\n if (msg.role === 'tool') {\n // Tool results in Anthropic are user messages with tool_result content blocks\n converted.push({\n role: 'user',\n content: [{\n type: 'tool_result',\n tool_use_id: msg.tool_call_id,\n content: msg.content ?? '',\n }],\n });\n continue;\n }\n if (msg.role === 'assistant' && msg.tool_calls) {\n // Assistant with tool calls — need content blocks\n const content: any[] = [];\n if (msg.content) content.push({ type: 'text', text: msg.content });\n for (const tc of msg.tool_calls) {\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n converted.push({ role: 'assistant', content });\n continue;\n }\n // Regular user/assistant messages\n converted.push({ role: msg.role, content: msg.content ?? '' });\n }\n\n return { system, messages: converted };\n}\n\nfunction convertToolsForAnthropic(tools: ToolDefinition[]) {\n return tools.map((t) => ({\n name: t.function.name,\n description: t.function.description,\n input_schema: t.function.parameters,\n }));\n}\n\nfunction parseAnthropicResponse(data: any): ChatResponse {\n let textContent = '';\n const toolCalls: ToolCall[] = [];\n\n for (const block of data.content) {\n if (block.type === 'text') textContent += block.text;\n if (block.type === 'tool_use') {\n toolCalls.push({\n id: block.id,\n type: 'function',\n function: {\n name: block.name,\n arguments: JSON.stringify(block.input),\n },\n });\n }\n }\n\n return {\n content: textContent,\n model: data.model,\n tool_calls: toolCalls.length > 0 ? toolCalls : undefined,\n finish_reason: data.stop_reason === 'tool_use' ? 'tool_calls' : 'stop',\n usage: data.usage ? {\n prompt_tokens: data.usage.input_tokens,\n completion_tokens: data.usage.output_tokens,\n total_tokens: data.usage.input_tokens + data.usage.output_tokens,\n } : undefined,\n };\n}\n\n// --- Claude Max OAuth ---\n\nexport function getClaudeCodeOAuthToken(): string | null {\n try {\n const raw = execSync(\n 'security find-generic-password -s \"Claude Code-credentials\" -w',\n { encoding: 'utf-8', timeout: 5000 },\n ).trim();\n const data = JSON.parse(raw);\n const oauth = data?.claudeAiOauth;\n if (!oauth?.accessToken) return null;\n\n if (oauth.expiresAt && Date.now() > oauth.expiresAt) {\n console.warn('[llm] Claude Code OAuth token expired. Run: claude auth login');\n return null;\n }\n\n return oauth.accessToken;\n } catch {\n return null;\n }\n}\n\n// --- LLM Client ---\n\nexport class LLMClient {\n private baseUrl: string;\n private model: string;\n private maxTokens: number;\n private temperature: number;\n private apiKey: string;\n private provider: 'openai' | 'anthropic';\n private isOAuth: boolean;\n\n constructor(config: LLMConfig) {\n this.baseUrl = config.base_url;\n this.model = config.model;\n this.maxTokens = config.max_tokens;\n this.temperature = config.temperature;\n this.apiKey = config.api_key ?? \"\";\n this.provider = config.provider ?? 'openai';\n this.isOAuth = false;\n\n // For anthropic provider with no API key, try Claude Code OAuth from keychain\n if (this.provider === 'anthropic' && !this.apiKey) {\n const token = getClaudeCodeOAuthToken();\n if (token) {\n this.apiKey = token;\n this.isOAuth = true;\n if (!this.baseUrl || this.baseUrl.includes('openrouter')) {\n this.baseUrl = 'https://api.anthropic.com';\n }\n console.log('[llm] Auth: Claude Max OAuth (from macOS Keychain)');\n } else {\n console.warn('[llm] Auth: No API key found for Anthropic provider');\n }\n } else if (this.provider === 'anthropic') {\n // Detect OAuth tokens by prefix (set by config.ts from keychain)\n if (this.apiKey.startsWith('sk-ant-oat')) {\n this.isOAuth = true;\n console.log('[llm] Auth: Claude Max OAuth (from config)');\n } else {\n console.log('[llm] Auth: Anthropic API key (from config/env)');\n }\n }\n }\n\n /**\n * Simple chat completion (no tools). Backwards compatible.\n */\n async chat(messages: ChatMessage[]): Promise<ChatResponse> {\n return this.chatWithTools(messages);\n }\n\n /**\n * Chat completion with optional tool definitions.\n * Returns tool_calls if the model wants to use tools.\n */\n async chatWithTools(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n ): Promise<ChatResponse> {\n if (this.provider === 'anthropic') {\n return this.chatAnthropic(messages, tools);\n }\n return this.chatOpenAI(messages, tools);\n }\n\n // --- OpenAI-compatible path (OpenRouter, etc.) ---\n\n private async chatOpenAI(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n ): Promise<ChatResponse> {\n const body: Record<string, unknown> = {\n model: this.model,\n messages,\n max_tokens: this.maxTokens,\n temperature: this.temperature,\n };\n\n if (tools && tools.length > 0) {\n body.tools = tools;\n body.tool_choice = \"auto\";\n }\n\n const RETRYABLE_CODES = [429, 500, 502, 503, 529];\n const MAX_RETRIES = 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n if (attempt > 0) {\n const delayMs = Math.pow(2, attempt) * 1000;\n console.log(`[llm] Retry ${attempt}/${MAX_RETRIES} after ${delayMs}ms...`);\n await new Promise((r) => setTimeout(r, delayMs));\n }\n\n const resp = await fetch(`${this.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),\n },\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const text = await resp.text();\n lastError = new Error(`LLM request failed: ${resp.status} ${text}`);\n if (RETRYABLE_CODES.includes(resp.status) && attempt < MAX_RETRIES) {\n console.warn(`[llm] Retryable error ${resp.status}: ${text.slice(0, 200)}`);\n continue;\n }\n throw lastError;\n }\n\n const data = (await resp.json()) as {\n choices: Array<{\n message: {\n content: string | null;\n tool_calls?: ToolCall[];\n };\n finish_reason: string;\n }>;\n model: string;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n const choice = data.choices[0];\n\n return {\n content: choice.message.content ?? \"\",\n model: data.model,\n tool_calls: choice.message.tool_calls,\n finish_reason: choice.finish_reason,\n usage: data.usage,\n };\n }\n\n throw lastError ?? new Error(\"LLM request failed after retries\");\n }\n\n // --- Anthropic Messages API path ---\n\n private async chatAnthropic(\n messages: ChatMessage[],\n tools?: ToolDefinition[],\n ): Promise<ChatResponse> {\n const { system, messages: convertedMessages } = convertMessagesForAnthropic(messages);\n\n const body: Record<string, unknown> = {\n model: this.model,\n max_tokens: this.maxTokens,\n temperature: this.temperature,\n messages: convertedMessages,\n };\n\n if (system) {\n body.system = system;\n }\n\n if (tools && tools.length > 0) {\n body.tools = convertToolsForAnthropic(tools);\n body.tool_choice = { type: \"auto\" };\n }\n\n const RETRYABLE_CODES = [429, 500, 502, 503, 529];\n const MAX_RETRIES = 3;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n if (attempt > 0) {\n const delayMs = Math.pow(2, attempt) * 1000;\n console.log(`[llm] Retry ${attempt}/${MAX_RETRIES} after ${delayMs}ms...`);\n await new Promise((r) => setTimeout(r, delayMs));\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"anthropic-version\": \"2023-06-01\",\n };\n if (this.isOAuth) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n headers[\"anthropic-beta\"] = \"oauth-2025-04-20\";\n } else {\n headers[\"x-api-key\"] = this.apiKey;\n }\n\n const resp = await fetch(`${this.baseUrl}/v1/messages`, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n\n if (!resp.ok) {\n const text = await resp.text();\n lastError = new Error(`Anthropic request failed: ${resp.status} ${text}`);\n if (RETRYABLE_CODES.includes(resp.status) && attempt < MAX_RETRIES) {\n console.warn(`[llm] Retryable error ${resp.status}: ${text.slice(0, 200)}`);\n continue;\n }\n throw lastError;\n }\n\n const data = await resp.json();\n return parseAnthropicResponse(data);\n }\n\n throw lastError ?? new Error(\"Anthropic request failed after retries\");\n }\n}\n","import type { MemoryConfig } from \"./config.js\";\n\nexport interface Episode {\n id: string;\n timestamp: string;\n context_name: string;\n role: string;\n content: string;\n access_count?: number;\n layer?: string;\n}\n\nexport interface ScoredEpisode {\n id: string;\n timestamp: string;\n context_name: string;\n role: string;\n content: string;\n score: number;\n source_context?: string;\n}\n\nexport interface EpisodeInput {\n context_name?: string;\n role: string;\n content: string;\n}\n\nexport interface ContextInfo {\n name: string;\n description: string;\n created_at: string;\n episode_count: number;\n}\n\nexport interface CrossContextResult {\n context: string;\n episodes: ScoredEpisode[];\n}\n\nexport interface PromotionResult {\n promoted_count: number;\n episode_ids: string[];\n}\n\nexport interface TaskRecord {\n id: string;\n context_name: string;\n title: string;\n description: string;\n status: \"planned\" | \"active\" | \"complete\" | \"archived\";\n blocked_by: string[];\n created_at: string;\n updated_at: string;\n}\n\nexport interface L3Entry {\n id: string;\n source_episode_id: string;\n context_name: string;\n content: string;\n promoted_at: string;\n access_count: number;\n connection_density: number;\n}\n\nexport interface TaskInput {\n context_name: string;\n title: string;\n description: string;\n status?: string;\n blocked_by?: string[];\n}\n\nexport class MemoryClient {\n private baseUrl: string;\n private topK: number;\n\n constructor(config: MemoryConfig) {\n this.baseUrl = config.daemon_url;\n this.topK = config.top_k;\n }\n\n async storeEpisode(input: EpisodeInput): Promise<Episode> {\n const resp = await fetch(`${this.baseUrl}/episodes`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(input),\n });\n\n if (!resp.ok) {\n throw new Error(`Memory store failed: ${resp.status} ${await resp.text()}`);\n }\n\n return resp.json() as Promise<Episode>;\n }\n\n async search(query: string, context?: string, limit?: number): Promise<ScoredEpisode[]> {\n const params = new URLSearchParams({ q: query });\n if (context) params.set(\"context\", context);\n params.set(\"limit\", String(limit ?? this.topK));\n\n const resp = await fetch(`${this.baseUrl}/search?${params}`);\n\n if (!resp.ok) {\n throw new Error(`Memory search failed: ${resp.status} ${await resp.text()}`);\n }\n\n const data = (await resp.json()) as { episodes: ScoredEpisode[] };\n return data.episodes;\n }\n\n async getContext(name: string): Promise<Episode[]> {\n const resp = await fetch(`${this.baseUrl}/contexts/${encodeURIComponent(name)}`);\n\n if (!resp.ok) {\n throw new Error(`Get context failed: ${resp.status} ${await resp.text()}`);\n }\n\n return resp.json() as Promise<Episode[]>;\n }\n\n async createContext(name: string, description = \"\"): Promise<void> {\n const resp = await fetch(`${this.baseUrl}/contexts`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ name, description }),\n });\n\n if (!resp.ok) {\n throw new Error(`Create context failed: ${resp.status} ${await resp.text()}`);\n }\n }\n\n async deleteContext(name: string): Promise<void> {\n const resp = await fetch(`${this.baseUrl}/contexts/${encodeURIComponent(name)}`, {\n method: \"DELETE\",\n });\n\n if (!resp.ok) {\n throw new Error(`Delete context failed: ${resp.status} ${await resp.text()}`);\n }\n }\n\n async listContexts(): Promise<ContextInfo[]> {\n const resp = await fetch(`${this.baseUrl}/contexts`);\n\n if (!resp.ok) {\n throw new Error(`List contexts failed: ${resp.status} ${await resp.text()}`);\n }\n\n const data = (await resp.json()) as { contexts: ContextInfo[] };\n return data.contexts;\n }\n\n async searchCrossContext(query: string, limit?: number): Promise<CrossContextResult[]> {\n const params = new URLSearchParams({ q: query });\n params.set(\"limit\", String(limit ?? this.topK));\n\n const resp = await fetch(`${this.baseUrl}/search/cross-context?${params}`);\n\n if (!resp.ok) {\n throw new Error(`Cross-context search failed: ${resp.status} ${await resp.text()}`);\n }\n\n const data = (await resp.json()) as { results: CrossContextResult[] };\n return data.results;\n }\n\n async shareEpisode(episodeId: string, targetContext: string): Promise<void> {\n const resp = await fetch(`${this.baseUrl}/episodes/${encodeURIComponent(episodeId)}/share`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ target_context: targetContext }),\n });\n\n if (!resp.ok) {\n throw new Error(`Share episode failed: ${resp.status} ${await resp.text()}`);\n }\n }\n\n async runPromotion(contextName?: string): Promise<PromotionResult> {\n const params = new URLSearchParams();\n if (contextName) params.set(\"context\", contextName);\n\n const resp = await fetch(`${this.baseUrl}/promotion/run?${params}`, {\n method: \"POST\",\n });\n\n if (!resp.ok) {\n throw new Error(`Promotion failed: ${resp.status} ${await resp.text()}`);\n }\n\n return resp.json() as Promise<PromotionResult>;\n }\n\n async getL3Knowledge(contextName: string): Promise<L3Entry[]> {\n const resp = await fetch(\n `${this.baseUrl}/promotion/l3?context=${encodeURIComponent(contextName)}`,\n );\n\n if (!resp.ok) {\n throw new Error(`Get L3 failed: ${resp.status} ${await resp.text()}`);\n }\n\n const data = (await resp.json()) as { entries: L3Entry[] };\n return data.entries;\n }\n\n async setContextScoring(contextName: string, halfLifeHours: number): Promise<void> {\n const resp = await fetch(\n `${this.baseUrl}/contexts/${encodeURIComponent(contextName)}/scoring`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ half_life_hours: halfLifeHours }),\n },\n );\n\n if (!resp.ok) {\n throw new Error(`Set scoring failed: ${resp.status} ${await resp.text()}`);\n }\n }\n\n async recordAccess(episodeId: string): Promise<void> {\n const resp = await fetch(`${this.baseUrl}/episodes/${encodeURIComponent(episodeId)}/access`, {\n method: \"POST\",\n });\n\n if (!resp.ok) {\n throw new Error(`Record access failed: ${resp.status} ${await resp.text()}`);\n }\n }\n\n async recordCoAccess(episodeIds: string[]): Promise<void> {\n const resp = await fetch(`${this.baseUrl}/episodes/co-access`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ episode_ids: episodeIds }),\n });\n\n if (!resp.ok) {\n throw new Error(`Co-access failed: ${resp.status} ${await resp.text()}`);\n }\n }\n\n // Task engine methods\n async createTask(input: TaskInput): Promise<TaskRecord> {\n const resp = await fetch(`${this.baseUrl}/tasks`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(input),\n });\n\n if (!resp.ok) {\n throw new Error(`Create task failed: ${resp.status} ${await resp.text()}`);\n }\n\n return resp.json() as Promise<TaskRecord>;\n }\n\n async listTasks(contextName: string, status?: string): Promise<TaskRecord[]> {\n const params = new URLSearchParams({ context: contextName });\n if (status) params.set(\"status\", status);\n\n const resp = await fetch(`${this.baseUrl}/tasks?${params}`);\n\n if (!resp.ok) {\n throw new Error(`List tasks failed: ${resp.status} ${await resp.text()}`);\n }\n\n const data = (await resp.json()) as { tasks: TaskRecord[] };\n return data.tasks;\n }\n\n async updateTask(taskId: string, updates: Partial<Pick<TaskRecord, \"status\" | \"title\" | \"description\" | \"blocked_by\">>): Promise<TaskRecord> {\n const resp = await fetch(`${this.baseUrl}/tasks/${encodeURIComponent(taskId)}`, {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(updates),\n });\n\n if (!resp.ok) {\n throw new Error(`Update task failed: ${resp.status} ${await resp.text()}`);\n }\n\n return resp.json() as Promise<TaskRecord>;\n }\n\n async getNextTask(contextName: string): Promise<TaskRecord | null> {\n const resp = await fetch(`${this.baseUrl}/tasks/next?context=${encodeURIComponent(contextName)}`);\n\n if (!resp.ok) {\n if (resp.status === 404) return null;\n throw new Error(`Get next task failed: ${resp.status} ${await resp.text()}`);\n }\n\n return resp.json() as Promise<TaskRecord>;\n }\n\n async healthCheck(): Promise<boolean> {\n try {\n const resp = await fetch(`${this.baseUrl}/health`);\n return resp.ok;\n } catch {\n return false;\n }\n }\n}\n","import type { MemoryClient } from \"./memory-client.js\";\n\nexport interface ContextMetadata {\n name: string;\n description: string;\n created_at: string;\n last_active: string;\n}\n\nexport interface ContextSwitchResult {\n previousContext: string | null;\n activeContext: string;\n isNew: boolean;\n}\n\nconst SWITCH_PATTERNS = [\n /^switch\\s+to\\s+(\\S+)/i,\n /^context:\\s*(\\S+)/i,\n /^@(\\S+)\\s/,\n /^working\\s+on\\s+(\\S+)/i,\n];\n\nexport class ContextManager {\n private contexts: Map<string, ContextMetadata> = new Map();\n private activeContext: string = \"global\";\n private memory: MemoryClient;\n\n constructor(memory: MemoryClient) {\n this.memory = memory;\n // Global context always exists\n this.contexts.set(\"global\", {\n name: \"global\",\n description: \"Global context — identity, preferences, cross-cutting knowledge\",\n created_at: new Date().toISOString(),\n last_active: new Date().toISOString(),\n });\n }\n\n async createContext(name: string, description = \"\"): Promise<ContextMetadata> {\n if (this.contexts.has(name)) {\n return this.contexts.get(name)!;\n }\n\n const metadata: ContextMetadata = {\n name,\n description,\n created_at: new Date().toISOString(),\n last_active: new Date().toISOString(),\n };\n\n this.contexts.set(name, metadata);\n\n // Register context with memory daemon\n try {\n await this.memory.createContext(name, description);\n } catch (err) {\n console.error(`Failed to register context '${name}' with daemon:`, (err as Error).message);\n }\n\n return metadata;\n }\n\n async deleteContext(name: string): Promise<boolean> {\n if (name === \"global\") {\n console.error(\"Cannot delete global context\");\n return false;\n }\n\n if (!this.contexts.has(name)) {\n return false;\n }\n\n this.contexts.delete(name);\n\n if (this.activeContext === name) {\n this.activeContext = \"global\";\n }\n\n try {\n await this.memory.deleteContext(name);\n } catch (err) {\n console.error(`Failed to delete context '${name}' from daemon:`, (err as Error).message);\n }\n\n return true;\n }\n\n listContexts(): ContextMetadata[] {\n return Array.from(this.contexts.values());\n }\n\n getContext(name: string): ContextMetadata | undefined {\n return this.contexts.get(name);\n }\n\n getActiveContext(): string {\n return this.activeContext;\n }\n\n switchContext(name: string): ContextSwitchResult {\n const previousContext = this.activeContext;\n const isNew = !this.contexts.has(name);\n\n if (isNew) {\n this.contexts.set(name, {\n name,\n description: \"\",\n created_at: new Date().toISOString(),\n last_active: new Date().toISOString(),\n });\n }\n\n this.activeContext = name;\n this.touchContext(name);\n\n return { previousContext, activeContext: name, isNew };\n }\n\n /**\n * Parse a message and determine if it's a context switch command.\n * Returns the context name if a switch is detected, null otherwise.\n */\n parseContextSwitch(message: string): string | null {\n for (const pattern of SWITCH_PATTERNS) {\n const match = message.match(pattern);\n if (match) {\n return match[1].toLowerCase();\n }\n }\n return null;\n }\n\n /**\n * Infer context from message content by checking known context names.\n * Returns the best matching context or current active context.\n */\n inferContext(message: string): string {\n const lower = message.toLowerCase();\n for (const [name] of this.contexts) {\n if (name === \"global\") continue;\n if (lower.includes(name.toLowerCase())) {\n return name;\n }\n }\n return this.activeContext;\n }\n\n /**\n * Route a message: check for explicit switch, then infer context.\n * Returns the resolved context name and whether a switch happened.\n */\n routeMessage(message: string): { context: string; switched: boolean; switchedTo?: string } {\n // Check for explicit switch command\n const switchTarget = this.parseContextSwitch(message);\n if (switchTarget) {\n const result = this.switchContext(switchTarget);\n return { context: switchTarget, switched: true, switchedTo: result.activeContext };\n }\n\n // Infer from content\n const inferred = this.inferContext(message);\n if (inferred !== this.activeContext) {\n this.touchContext(inferred);\n return { context: inferred, switched: false };\n }\n\n this.touchContext(this.activeContext);\n return { context: this.activeContext, switched: false };\n }\n\n /**\n * Returns contexts that should be searched: active context + global.\n */\n getSearchContexts(): string[] {\n const contexts = [this.activeContext];\n if (this.activeContext !== \"global\") {\n contexts.push(\"global\");\n }\n return contexts;\n }\n\n hasContext(name: string): boolean {\n return this.contexts.has(name);\n }\n\n private touchContext(name: string): void {\n const ctx = this.contexts.get(name);\n if (ctx) {\n ctx.last_active = new Date().toISOString();\n }\n }\n}\n","import type { MemoryClient, TaskRecord, TaskInput } from \"./memory-client.js\";\n\nexport type TaskStatus = \"planned\" | \"active\" | \"complete\" | \"archived\";\n\nexport interface TaskEngineOptions {\n contextName: string;\n memory: MemoryClient;\n}\n\nexport class TaskEngine {\n private contextName: string;\n private memory: MemoryClient;\n\n constructor(options: TaskEngineOptions) {\n this.contextName = options.contextName;\n this.memory = options.memory;\n }\n\n async addTask(title: string, description: string, blockedBy: string[] = []): Promise<TaskRecord> {\n return this.memory.createTask({\n context_name: this.contextName,\n title,\n description,\n status: \"planned\",\n blocked_by: blockedBy,\n });\n }\n\n async listTasks(status?: TaskStatus): Promise<TaskRecord[]> {\n return this.memory.listTasks(this.contextName, status);\n }\n\n async startTask(taskId: string): Promise<TaskRecord | null> {\n return this.memory.updateTask(taskId, { status: \"active\" });\n }\n\n async completeTask(taskId: string): Promise<TaskRecord | null> {\n return this.memory.updateTask(taskId, { status: \"complete\" });\n }\n\n async archiveTask(taskId: string): Promise<TaskRecord | null> {\n return this.memory.updateTask(taskId, { status: \"archived\" });\n }\n\n async getNextTask(): Promise<TaskRecord | null> {\n return this.memory.getNextTask(this.contextName);\n }\n\n async pickAndStartNextTask(): Promise<TaskRecord | null> {\n const next = await this.getNextTask();\n if (next) {\n return this.startTask(next.id);\n }\n return null;\n }\n\n setContext(contextName: string): void {\n this.contextName = contextName;\n }\n\n /**\n * Parse a task command from a chat message.\n * Returns the action and parsed parameters, or null if not a task command.\n */\n static parseTaskCommand(message: string): TaskCommand | null {\n const lower = message.trim().toLowerCase();\n\n // \"add task: <title>\"\n const addMatch = message.match(/^(?:add|create)\\s+task[:\\s]+(.+)/i);\n if (addMatch) {\n return { action: \"add\", title: addMatch[1].trim() };\n }\n\n // \"list tasks\"\n if (/^list\\s+tasks/i.test(lower)) {\n const statusMatch = lower.match(/list\\s+tasks\\s+(\\w+)/);\n return { action: \"list\", statusFilter: statusMatch?.[1] as TaskStatus | undefined };\n }\n\n // \"complete task <id>\"\n const completeMatch = message.match(/^complete\\s+task\\s+(\\S+)/i);\n if (completeMatch) {\n return { action: \"complete\", taskId: completeMatch[1] };\n }\n\n // \"start task <id>\"\n const startMatch = message.match(/^start\\s+task\\s+(\\S+)/i);\n if (startMatch) {\n return { action: \"start\", taskId: startMatch[1] };\n }\n\n // \"next task\"\n if (/^next\\s+task/i.test(lower)) {\n return { action: \"next\" };\n }\n\n // \"archive task <id>\"\n const archiveMatch = message.match(/^archive\\s+task\\s+(\\S+)/i);\n if (archiveMatch) {\n return { action: \"archive\", taskId: archiveMatch[1] };\n }\n\n return null;\n }\n}\n\nexport interface TaskCommand {\n action: \"add\" | \"list\" | \"complete\" | \"start\" | \"next\" | \"archive\";\n title?: string;\n description?: string;\n taskId?: string;\n statusFilter?: TaskStatus;\n}\n","import { readFileSync, existsSync, readdirSync, statSync } from \"fs\";\nimport { resolve, basename, join } from \"path\";\nimport type { AgentConfig } from \"./config.js\";\nimport type { ChatMessage } from \"./llm-client.js\";\nimport type { ScoredEpisode, L3Entry } from \"./memory-client.js\";\n\n// ── MEMORY.md loading ──\n\ninterface MemoryFiles {\n global: string | null;\n context: string | null;\n}\n\nfunction loadMemoryFiles(workspace: string | undefined, contextName: string): MemoryFiles {\n const result: MemoryFiles = { global: null, context: null };\n if (!workspace) return result;\n\n // Global MEMORY.md\n const globalPath = resolve(workspace, \"MEMORY.md\");\n if (existsSync(globalPath)) {\n try {\n const content = readFileSync(globalPath, \"utf-8\").trim();\n if (content) result.global = content;\n } catch { /* skip */ }\n }\n\n // Per-context MEMORY.md\n if (contextName !== \"global\") {\n const contextPath = resolve(workspace, \"contexts\", contextName, \"MEMORY.md\");\n if (existsSync(contextPath)) {\n try {\n const content = readFileSync(contextPath, \"utf-8\").trim();\n if (content) result.context = content;\n } catch { /* skip */ }\n }\n }\n\n return result;\n}\n\n// ── Skills discovery ──\n\ninterface SkillInfo {\n name: string;\n description: string;\n path: string;\n}\n\nfunction discoverSkills(workspace: string | undefined): SkillInfo[] {\n if (!workspace) return [];\n const skillsDir = resolve(workspace, \"skills\");\n if (!existsSync(skillsDir)) return [];\n\n const skills: SkillInfo[] = [];\n try {\n const entries = readdirSync(skillsDir);\n for (const entry of entries) {\n const skillMdPath = resolve(skillsDir, entry, \"SKILL.md\");\n if (!existsSync(skillMdPath)) continue;\n\n try {\n const content = readFileSync(skillMdPath, \"utf-8\");\n // Parse YAML frontmatter\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n let name = entry;\n let description = \"\";\n if (fmMatch) {\n const fm = fmMatch[1];\n const nameMatch = fm.match(/^name:\\s*(.+)$/m);\n const descMatch = fm.match(/^description:\\s*(.+)$/m);\n if (nameMatch) name = nameMatch[1].trim().replace(/^[\"']|[\"']$/g, \"\");\n if (descMatch) description = descMatch[1].trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n skills.push({ name, description, path: skillMdPath });\n } catch { /* skip */ }\n }\n } catch { /* skip */ }\n\n return skills;\n}\n\n// ── Events documentation for system prompt ──\n\nfunction buildEventsDoc(dataDir: string | undefined): string {\n if (!dataDir) return \"\";\n return `\n## Events (Scheduling)\nYou can schedule events by writing JSON files to the events directory.\n\n### Event Types\n- **immediate**: Triggers as soon as the file is created\n \\`{\"type\": \"immediate\", \"channelId\": \"<channel>\", \"text\": \"Your message\"}\\`\n- **one-shot**: Triggers once at a specific time, then auto-deletes\n \\`{\"type\": \"one-shot\", \"channelId\": \"<channel>\", \"text\": \"Reminder text\", \"at\": \"2026-03-01T09:00:00-08:00\"}\\`\n- **periodic**: Triggers on a cron schedule\n \\`{\"type\": \"periodic\", \"channelId\": \"<channel>\", \"text\": \"Check inbox\", \"schedule\": \"0 9 * * 1-5\", \"timezone\": \"America/Los_Angeles\"}\\`\n\n### Cron Format\n\\`minute hour day-of-month month day-of-week\\`\n- \\`0 9 * * *\\` = daily at 9:00\n- \\`0 9 * * 1-5\\` = weekdays at 9:00\n- \\`*/30 * * * *\\` = every 30 minutes\n\n### Creating Events\nUse the write_file tool to create JSON files in the events directory.\nUse unique filenames (include timestamp or description): \\`reminder-dentist-1709312400.json\\`\n\n### Managing Events\n- List: use shell tool \\`ls ~/hivemind/data/events/\\`\n- Delete/cancel: use shell tool \\`rm ~/hivemind/data/events/filename.json\\`\n\n### Silent Completion\nFor periodic events with nothing to report, respond with exactly \\`[SILENT]\\` (no other text).\nThis prevents spamming the channel.\n`;\n}\n\n// Cache loaded charter to avoid re-reading every message\nlet charterCache: { path: string; content: string } | null = null;\n\nfunction loadCharter(path: string): string {\n if (charterCache && charterCache.path === path) return charterCache.content;\n if (!existsSync(path)) return \"\";\n const content = readFileSync(path, \"utf-8\");\n charterCache = { path, content };\n return content;\n}\n\n// ── Workspace file loading ──\n// These are identity/config files loaded once from disk into the system prompt.\n// They don't consume conversation tokens — they're part of the static system prompt.\n\n// Priority order for workspace files (loaded in this order)\nconst WORKSPACE_FILE_PRIORITY = [\n \"SOUL.md\", // Who the agent is (personality, values)\n \"IDENTITY.md\", // Name, avatar, creature type\n \"AGENTS.md\", // Operating instructions\n \"USER.md\", // About the human(s)\n \"TOOLS.md\", // Tool-specific notes\n];\n\ninterface WorkspaceFiles {\n dir: string;\n files: Map<string, string>; // filename -> content\n loadedAt: number;\n}\n\nlet workspaceCache: WorkspaceFiles | null = null;\nconst WORKSPACE_CACHE_TTL_MS = 60_000; // Reload every 60s\n\nfunction loadWorkspaceFiles(dir: string): Map<string, string> {\n const now = Date.now();\n if (workspaceCache && workspaceCache.dir === dir && (now - workspaceCache.loadedAt) < WORKSPACE_CACHE_TTL_MS) {\n return workspaceCache.files;\n }\n\n const files = new Map<string, string>();\n if (!existsSync(dir)) return files;\n\n // Load priority files first\n for (const filename of WORKSPACE_FILE_PRIORITY) {\n const filePath = resolve(dir, filename);\n if (existsSync(filePath)) {\n try {\n files.set(filename, readFileSync(filePath, \"utf-8\"));\n } catch {\n // Skip unreadable files\n }\n }\n }\n\n // Load any other .md files not in the priority list\n try {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n if (entry.endsWith(\".md\") && !files.has(entry) && !entry.startsWith(\".\")) {\n const filePath = resolve(dir, entry);\n try {\n files.set(entry, readFileSync(filePath, \"utf-8\"));\n } catch {\n // Skip\n }\n }\n }\n } catch {\n // Skip if dir can't be read\n }\n\n workspaceCache = { dir, files, loadedAt: now };\n const names = [...files.keys()].join(\", \");\n if (files.size > 0) {\n console.log(`[workspace] Loaded ${files.size} files: ${names}`);\n }\n return files;\n}\n\nexport interface SystemPromptResult {\n text: string;\n components: {\n identity: string;\n l3Knowledge: string[];\n l2Episodes: Array<{\n id: string;\n content: string;\n score: number;\n timestamp: string;\n context_name: string;\n role: string;\n }>;\n contextInfo: string;\n };\n}\n\nexport interface BuildSystemPromptOptions {\n config: AgentConfig;\n episodes: ScoredEpisode[];\n contextName?: string;\n l3Knowledge?: L3Entry[];\n dataDir?: string;\n}\n\nexport function buildSystemPrompt(\n configOrOpts: AgentConfig | BuildSystemPromptOptions,\n episodes?: ScoredEpisode[],\n contextName = \"global\",\n l3Knowledge: L3Entry[] = [],\n): SystemPromptResult {\n // Support both old and new call signatures\n let config: AgentConfig;\n let dataDir: string | undefined;\n if (\"config\" in configOrOpts) {\n config = configOrOpts.config;\n episodes = configOrOpts.episodes;\n contextName = configOrOpts.contextName ?? \"global\";\n l3Knowledge = configOrOpts.l3Knowledge ?? [];\n dataDir = configOrOpts.dataDir;\n } else {\n config = configOrOpts;\n }\n const resolvedEpisodes = episodes ?? [];\n\n let prompt = `You are ${config.name}. ${config.personality}\\n`;\n let identityText = prompt;\n\n // Load workspace identity files (SOUL.md, IDENTITY.md, AGENTS.md, etc.)\n // These are loaded from disk and cached — they don't consume conversation tokens.\n if (config.workspace) {\n const wsFiles = loadWorkspaceFiles(config.workspace);\n if (wsFiles.size > 0) {\n let wsBlock = \"\\n# Workspace Context\\n\";\n for (const [filename, content] of wsFiles) {\n wsBlock += `\\n## ${filename}\\n${content}\\n`;\n }\n prompt += wsBlock;\n identityText += wsBlock;\n }\n }\n\n // Load team charter if configured (legacy — workspace files supersede this)\n if (config.team_charter && !config.workspace) {\n const charter = loadCharter(config.team_charter);\n if (charter) {\n prompt += `\\n${charter}\\n`;\n identityText += `\\n${charter}\\n`;\n }\n }\n\n prompt += `\n## Communication\nMessages are prefixed with [sender_handle]: or [sender_handle in group chat]: to tell you who's talking.\nIn group chats, multiple people (humans and agents) may be present. Address them by name when relevant.\nDon't repeat or quote these prefixes in your responses — just respond naturally.\nKeep responses concise — especially in group chats. A few sentences is usually enough. Don't write essays.\nIf you decide not to respond to a group message, reply with exactly: __SKIP__\n\n## Tool Output Integrity\nWhen you use a tool (browse, shell, etc.), report the ACTUAL output returned by the tool.\n- Quote tool results verbatim when sharing them. Never paraphrase, infer, or reconstruct what a tool \"probably\" returned.\n- If a tool errors or returns unexpected results, report the actual error — do not fabricate plausible output.\n- If you are unsure whether you are reading real tool output or generating from memory, say so explicitly.\nThis is critical for trust and debugging. Fabricating tool output is never acceptable.\n`;\n\n let contextInfo = \"\";\n if (contextName !== \"global\") {\n contextInfo = `\\n## Active Context: ${contextName}\\nYou are currently working in the \"${contextName}\" project context.\\n`;\n prompt += contextInfo;\n }\n\n // MEMORY.md — agent-managed working memory (loaded every turn)\n const memoryFiles = loadMemoryFiles(config.workspace, contextName);\n if (memoryFiles.global || memoryFiles.context) {\n prompt += \"\\n## Working Memory (agent-managed)\\n\";\n if (memoryFiles.global) {\n prompt += `\\n### Global Memory\\n${memoryFiles.global}\\n`;\n }\n if (memoryFiles.context) {\n prompt += `\\n### ${contextName} Memory\\n${memoryFiles.context}\\n`;\n }\n prompt += \"\\nUpdate these files with write_file when you learn something important. They persist across sessions.\\n\";\n }\n\n // Skills — auto-discovered from workspace/skills/\n const skills = discoverSkills(config.workspace);\n if (skills.length > 0) {\n prompt += \"\\n## Available Skills\\n\\n\";\n for (const skill of skills) {\n prompt += `- **${skill.name}**: ${skill.description} → read \\`${skill.path}\\` for instructions\\n`;\n }\n prompt += \"\\nTo use a skill, read its SKILL.md with read_file. To create a new skill, write a SKILL.md to workspace/skills/<name>/SKILL.md\\n\";\n }\n\n // Events documentation\n const eventsDoc = buildEventsDoc(dataDir);\n if (eventsDoc) {\n prompt += eventsDoc;\n }\n\n // L3 semantic knowledge (higher-level patterns, decisions, architecture)\n if (l3Knowledge.length > 0) {\n prompt += \"\\n## Established Knowledge (learned patterns)\\n\\n\";\n for (const entry of l3Knowledge) {\n prompt += `- ${entry.content}\\n`;\n }\n }\n\n // L2 episodic memories (recent interactions)\n if (resolvedEpisodes.length > 0) {\n prompt += \"\\n## Relevant memories from previous conversations\\n\\n\";\n for (const ep of resolvedEpisodes) {\n const timeAgo = formatTimeAgo(ep.timestamp);\n const ctxLabel = ep.context_name !== contextName ? ` [from: ${ep.context_name}]` : \"\";\n prompt += `[${timeAgo}]${ctxLabel} ${ep.role}: ${ep.content}\\n`;\n }\n prompt += \"\\nUse these memories naturally — reference past conversations when relevant, but don't force it.\\n\";\n }\n\n return {\n text: prompt,\n components: {\n identity: identityText,\n l3Knowledge: l3Knowledge.map((e) => e.content),\n l2Episodes: resolvedEpisodes.map((ep) => ({\n id: ep.id,\n content: ep.content,\n score: ep.score,\n timestamp: ep.timestamp,\n context_name: ep.context_name,\n role: ep.role,\n })),\n contextInfo,\n },\n };\n}\n\n/**\n * Estimate tokens from a string using chars/4 approximation.\n */\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Build the messages array for the LLM call, with token budget management.\n * Truncates L1 history (oldest first) if the total exceeds the budget.\n * \n * @param contextLimit - Model context window size in tokens (default: 200k for Sonnet)\n * @param reserveForResponse - Tokens reserved for the model's response (default: 4096)\n */\nexport function buildMessages(\n systemPrompt: string,\n conversationHistory: ChatMessage[],\n currentMessage: string,\n contextLimit = 200_000,\n reserveForResponse = 4096,\n): ChatMessage[] {\n const budget = contextLimit - reserveForResponse;\n\n const systemTokens = estimateTokens(systemPrompt);\n const userTokens = estimateTokens(currentMessage);\n const fixedTokens = systemTokens + userTokens;\n\n // If system prompt + user message already exceeds budget, just send them\n if (fixedTokens >= budget) {\n console.warn(`[prompt] System prompt (${systemTokens} est. tokens) + user message (${userTokens}) exceeds budget (${budget}). Sending without history.`);\n return [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: currentMessage },\n ];\n }\n\n // Fit as much conversation history as possible (keep most recent)\n let remainingBudget = budget - fixedTokens;\n const fittingHistory: ChatMessage[] = [];\n\n // Walk history from most recent to oldest\n for (let i = conversationHistory.length - 1; i >= 0; i--) {\n const msg = conversationHistory[i];\n const msgTokens = estimateTokens(msg.content ?? \"\");\n if (msgTokens > remainingBudget) break;\n fittingHistory.unshift(msg);\n remainingBudget -= msgTokens;\n }\n\n if (fittingHistory.length < conversationHistory.length) {\n const dropped = conversationHistory.length - fittingHistory.length;\n console.log(`[prompt] Token budget: dropped ${dropped} oldest L1 turns (kept ${fittingHistory.length}/${conversationHistory.length})`);\n }\n\n return [\n { role: \"system\", content: systemPrompt },\n ...fittingHistory,\n { role: \"user\", content: currentMessage },\n ];\n}\n\nfunction formatTimeAgo(timestamp: string): string {\n const date = new Date(timestamp);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMs / 3_600_000);\n const diffDays = Math.floor(diffMs / 86_400_000);\n\n if (diffMins < 1) return \"just now\";\n if (diffMins < 60) return `${diffMins}m ago`;\n if (diffHours < 24) return `${diffHours}h ago`;\n if (diffDays < 7) return `${diffDays}d ago`;\n return date.toLocaleDateString();\n}\n","/**\n * Session persistence — JSONL file per context.\n * Survives restarts. Agent can grep history.\n */\n\nimport { existsSync, mkdirSync, readFileSync, appendFileSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport type { ChatMessage } from \"./llm-client.js\";\n\nexport interface SessionEntry {\n id: string;\n parentId: string | null;\n role: string;\n content: string | null;\n tool_calls?: unknown[];\n tool_call_id?: string;\n timestamp: number;\n}\n\nexport class SessionStore {\n private sessionDir: string;\n\n constructor(dataDir: string) {\n this.sessionDir = join(dataDir, \"sessions\");\n if (!existsSync(this.sessionDir)) {\n mkdirSync(this.sessionDir, { recursive: true });\n }\n }\n\n private filePath(contextName: string): string {\n // Sanitize context name for filename\n const safe = contextName.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n return join(this.sessionDir, `${safe}.jsonl`);\n }\n\n /**\n * Append a message to the session JSONL file.\n */\n append(contextName: string, message: ChatMessage, parentId?: string): string {\n const fp = this.filePath(contextName);\n const entry: SessionEntry = {\n id: randomUUID(),\n parentId: parentId ?? null,\n role: message.role,\n content: message.content,\n tool_calls: message.tool_calls,\n tool_call_id: message.tool_call_id,\n timestamp: Date.now(),\n };\n appendFileSync(fp, JSON.stringify(entry) + \"\\n\");\n return entry.id;\n }\n\n /**\n * Load all messages from a context's session file.\n */\n load(contextName: string): ChatMessage[] {\n const fp = this.filePath(contextName);\n if (!existsSync(fp)) return [];\n\n const lines = readFileSync(fp, \"utf-8\").trim().split(\"\\n\").filter(Boolean);\n const messages: ChatMessage[] = [];\n\n for (const line of lines) {\n try {\n const entry: SessionEntry = JSON.parse(line);\n const msg: ChatMessage = {\n role: entry.role as ChatMessage[\"role\"],\n content: entry.content,\n };\n if (entry.tool_calls) msg.tool_calls = entry.tool_calls as ChatMessage[\"tool_calls\"];\n if (entry.tool_call_id) msg.tool_call_id = entry.tool_call_id;\n messages.push(msg);\n } catch {\n // Skip malformed lines\n }\n }\n\n return messages;\n }\n\n /**\n * Get the N most recent messages from a context.\n */\n getRecentMessages(contextName: string, n: number): ChatMessage[] {\n const all = this.load(contextName);\n return all.slice(-n);\n }\n\n /**\n * Simple string search across a context's history.\n * Returns matching entries with timestamps.\n */\n grep(contextName: string, query: string, limit = 20): Array<{ role: string; content: string; timestamp: number }> {\n const fp = this.filePath(contextName);\n if (!existsSync(fp)) return [];\n\n const lines = readFileSync(fp, \"utf-8\").trim().split(\"\\n\").filter(Boolean);\n const results: Array<{ role: string; content: string; timestamp: number }> = [];\n const lowerQuery = query.toLowerCase();\n\n for (const line of lines) {\n try {\n const entry: SessionEntry = JSON.parse(line);\n if (entry.content && entry.content.toLowerCase().includes(lowerQuery)) {\n results.push({\n role: entry.role,\n content: entry.content,\n timestamp: entry.timestamp,\n });\n }\n } catch {\n // Skip\n }\n }\n\n return results.slice(-limit);\n }\n\n /**\n * Get total message count for a context.\n */\n messageCount(contextName: string): number {\n const fp = this.filePath(contextName);\n if (!existsSync(fp)) return 0;\n const content = readFileSync(fp, \"utf-8\").trim();\n if (!content) return 0;\n return content.split(\"\\n\").length;\n }\n}\n\n// ── Token estimation ──\n\n/**\n * Estimate token count for a string (chars/4 approximation).\n */\nexport function estimateTokens(text: string): number {\n if (!text) return 0;\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Estimate total tokens for an array of messages.\n */\nexport function estimateMessageTokens(messages: ChatMessage[]): number {\n let total = 0;\n for (const msg of messages) {\n if (msg.content) total += estimateTokens(msg.content);\n if (msg.tool_calls) {\n for (const call of msg.tool_calls) {\n total += estimateTokens(call.function.name);\n total += estimateTokens(call.function.arguments);\n }\n }\n }\n // Add ~4 tokens per message for role/formatting overhead\n total += messages.length * 4;\n return total;\n}\n\n/**\n * Known model context windows.\n */\nexport const MODEL_CONTEXT_WINDOWS: Record<string, number> = {\n \"claude-sonnet-4.5\": 200000,\n \"claude-sonnet-4-5\": 200000,\n \"anthropic/claude-sonnet-4.5\": 200000,\n \"anthropic/claude-sonnet-4-5-20250514\": 200000,\n \"claude-opus-4\": 200000,\n \"anthropic/claude-opus-4\": 200000,\n \"claude-3.5-sonnet\": 200000,\n \"gpt-4o\": 128000,\n \"gpt-4o-mini\": 128000,\n \"gpt-4-turbo\": 128000,\n \"gemini-2.5-pro\": 1000000,\n \"gemini-2.0-flash\": 1000000,\n};\n\n/**\n * Get context window for a model (default 200k if unknown).\n */\nexport function getModelContextWindow(model: string): number {\n // Try exact match first\n if (MODEL_CONTEXT_WINDOWS[model]) return MODEL_CONTEXT_WINDOWS[model];\n // Try matching the model name portion after provider prefix\n const parts = model.split(\"/\");\n const modelName = parts[parts.length - 1];\n if (MODEL_CONTEXT_WINDOWS[modelName]) return MODEL_CONTEXT_WINDOWS[modelName];\n // Check if any key is a substring\n for (const [key, value] of Object.entries(MODEL_CONTEXT_WINDOWS)) {\n if (model.includes(key)) return value;\n }\n return 200000;\n}\n","/**\n * Lossless compaction — summarize old messages but preserve full content in L2 memory.\n * Unlike Pi's lossy compaction, nothing is ever truly lost.\n */\n\nimport type { ChatMessage, ChatResponse } from \"./llm-client.js\";\nimport { LLMClient } from \"./llm-client.js\";\nimport type { MemoryClient } from \"./memory-client.js\";\nimport { estimateTokens, estimateMessageTokens, getModelContextWindow } from \"./session.js\";\n\nexport interface CompactionResult {\n /** The compacted messages (summary + recent) */\n messages: ChatMessage[];\n /** Number of messages that were compacted */\n compactedCount: number;\n /** Tokens before compaction */\n tokensBefore: number;\n /** Tokens after compaction */\n tokensAfter: number;\n /** Number of episodes saved to L2 */\n episodesSaved: number;\n}\n\nexport class CompactionManager {\n /** Compact when total tokens exceed this fraction of context window */\n private readonly COMPACT_THRESHOLD = 0.75;\n /** Keep this many recent turns (turn = user + assistant) */\n private readonly KEEP_RECENT_TURNS = 15;\n /** Reserve tokens for response */\n private readonly RESERVE_TOKENS = 16384;\n\n /**\n * Check if compaction is needed.\n */\n shouldCompact(\n messages: ChatMessage[],\n systemPromptTokens: number,\n model: string,\n ): boolean {\n const contextWindow = getModelContextWindow(model);\n const messageTokens = estimateMessageTokens(messages);\n const totalTokens = systemPromptTokens + messageTokens;\n const threshold = (contextWindow - this.RESERVE_TOKENS) * this.COMPACT_THRESHOLD;\n return totalTokens > threshold;\n }\n\n /**\n * Perform lossless compaction:\n * 1. Save all old messages to L2 (full preservation)\n * 2. Ask LLM to summarize old messages\n * 3. Return summary + recent messages\n */\n async compact(\n messages: ChatMessage[],\n contextName: string,\n memoryClient: MemoryClient | null,\n llmClient: LLMClient,\n model: string,\n ): Promise<CompactionResult> {\n const tokensBefore = estimateMessageTokens(messages);\n\n // Determine split point: keep last N turns\n const keepCount = this.KEEP_RECENT_TURNS * 2; // 2 messages per turn\n const splitIndex = Math.max(0, messages.length - keepCount);\n\n if (splitIndex <= 2) {\n // Not enough messages to compact meaningfully\n return {\n messages,\n compactedCount: 0,\n tokensBefore,\n tokensAfter: tokensBefore,\n episodesSaved: 0,\n };\n }\n\n const oldMessages = messages.slice(0, splitIndex);\n const recentMessages = messages.slice(splitIndex);\n\n // 1. Save old messages to L2 memory (lossless preservation)\n let episodesSaved = 0;\n if (memoryClient) {\n for (const msg of oldMessages) {\n if (msg.content && (msg.role === \"user\" || msg.role === \"assistant\")) {\n try {\n await memoryClient.storeEpisode({\n context_name: contextName,\n role: msg.role,\n content: `[compacted] ${msg.content}`,\n });\n episodesSaved++;\n } catch {\n // Continue even if individual saves fail\n }\n }\n }\n console.log(`[compaction] Saved ${episodesSaved} episodes to L2 before compacting`);\n }\n\n // 2. Ask LLM to summarize the old messages\n const summaryPrompt: ChatMessage[] = [\n {\n role: \"system\",\n content: `You are a context compactor. Summarize the following conversation into a concise but complete context summary. Preserve:\n- Key decisions and their reasoning\n- Important facts, names, and technical details mentioned\n- The current state of any ongoing work\n- Any commitments or action items\n- The emotional/social tone if relevant\n\nBe concise but don't lose critical information. Write in present tense as a context briefing.`,\n },\n {\n role: \"user\",\n content: `Summarize this conversation:\\n\\n${oldMessages\n .filter((m) => m.content)\n .map((m) => `[${m.role}]: ${m.content}`)\n .join(\"\\n\\n\")}`,\n },\n ];\n\n let summary: string;\n try {\n const response: ChatResponse = await llmClient.chat(summaryPrompt);\n summary = response.content;\n } catch (err) {\n // If summary fails, create a basic one from message content\n console.error(\"[compaction] LLM summary failed, using fallback:\", (err as Error).message);\n summary = oldMessages\n .filter((m) => m.content && m.role !== \"system\")\n .map((m) => `[${m.role}]: ${m.content!.slice(0, 200)}`)\n .join(\"\\n\");\n }\n\n // 3. Build compacted message list\n const compactedMessages: ChatMessage[] = [\n {\n role: \"user\",\n content: `[Context from earlier conversation — ${oldMessages.length} messages compacted]\\n\\n${summary}`,\n },\n {\n role: \"assistant\",\n content: \"Understood. I have the context from our earlier conversation. Continuing from where we left off.\",\n },\n ...recentMessages,\n ];\n\n const tokensAfter = estimateMessageTokens(compactedMessages);\n\n console.log(\n `[compaction] Compacted ${oldMessages.length} messages (${tokensBefore} → ${tokensAfter} tokens, saved ${episodesSaved} episodes to L2)`,\n );\n\n return {\n messages: compactedMessages,\n compactedCount: oldMessages.length,\n tokensBefore,\n tokensAfter,\n episodesSaved,\n };\n }\n}\n","import type { HivemindConfig } from \"./config.js\";\nimport type { ChatMessage } from \"./llm-client.js\";\nimport type { L3Entry } from \"./memory-client.js\";\nimport { LLMClient } from \"./llm-client.js\";\nimport { MemoryClient } from \"./memory-client.js\";\nimport { ContextManager } from \"./context.js\";\nimport type { ContextSwitchResult } from \"./context.js\";\nimport { TaskEngine } from \"./task-engine.js\";\nimport { buildMessages, buildSystemPrompt } from \"./prompt.js\";\nimport type { RequestLogger, RequestLogEntry } from \"./request-logger.js\";\nimport type { ToolRegistry } from \"./tool-registry.js\";\nimport { SessionStore, estimateTokens, estimateMessageTokens } from \"./session.js\";\nimport { CompactionManager } from \"./compaction.js\";\nimport { resolve } from \"path\";\n\nexport interface AgentResponse {\n content: string;\n model: string;\n context: string;\n contextSwitched?: boolean;\n}\n\nexport class Agent {\n private config: HivemindConfig;\n private llm: LLMClient;\n private memory: MemoryClient;\n private contextManager: ContextManager;\n private toolRegistry: ToolRegistry | null = null;\n // Per-context conversation histories\n private conversationHistories: Map<string, ChatMessage[]> = new Map();\n private messageCount = 0;\n private readonly PROMOTION_INTERVAL = 10; // Run promotion every N messages\n private readonly MAX_TOOL_ITERATIONS = 25;\n private requestLogger: RequestLogger | null = null;\n private sessionStore: SessionStore;\n private compactionManager: CompactionManager;\n private dataDir: string;\n\n constructor(config: HivemindConfig, contextName = \"global\") {\n this.config = config;\n this.llm = new LLMClient(config.llm);\n this.memory = new MemoryClient(config.memory);\n this.contextManager = new ContextManager(this.memory);\n this.dataDir = resolve(\n process.env.HIVEMIND_HOME || resolve(process.env.HOME || \"/root\", \"hivemind\"),\n \"data\",\n );\n this.sessionStore = new SessionStore(this.dataDir);\n this.compactionManager = new CompactionManager();\n\n if (contextName !== \"global\") {\n this.contextManager.switchContext(contextName);\n }\n\n // Restore conversation histories from session files\n this.restoreFromSession(contextName);\n }\n\n /**\n * Restore L1 conversation history from persisted session.\n */\n private restoreFromSession(contextName: string): void {\n const messages = this.sessionStore.getRecentMessages(contextName, 40);\n if (messages.length > 0) {\n this.conversationHistories.set(contextName, messages);\n console.log(`[session] Restored ${messages.length} messages for context \"${contextName}\"`);\n }\n }\n\n setToolRegistry(registry: ToolRegistry): void {\n this.toolRegistry = registry;\n const toolCount = registry.getDefinitions().length;\n if (toolCount > 0) {\n console.log(`[hivemind] Tool use enabled: ${toolCount} tools registered`);\n }\n }\n\n setRequestLogger(logger: RequestLogger): void {\n this.requestLogger = logger;\n }\n\n async processMessage(userMessage: string): Promise<AgentResponse> {\n // Check for special commands first (cross-context, tasks)\n const specialResult = await this.handleSpecialCommand(userMessage);\n if (specialResult) return specialResult;\n\n // Route message to correct context\n const routing = this.contextManager.routeMessage(userMessage);\n const contextName = routing.context;\n\n // If an explicit context switch was requested, handle it\n if (routing.switched) {\n // Ensure context exists in daemon\n try {\n await this.memory.createContext(contextName);\n } catch {\n // Context may already exist\n }\n }\n\n // Get (or create) conversation history for this context\n if (!this.conversationHistories.has(contextName)) {\n // Try to restore from session file first\n this.restoreFromSession(contextName);\n if (!this.conversationHistories.has(contextName)) {\n this.conversationHistories.set(contextName, []);\n }\n }\n const conversationHistory = this.conversationHistories.get(contextName)!;\n\n // 1. Query memory for relevant episodes from active context + global\n const relevantEpisodes = await this.memory\n .search(userMessage, contextName, this.config.memory.top_k)\n .catch((err) => {\n console.error(\"Memory search failed, continuing without context:\", err.message);\n return [];\n });\n\n // Record access for retrieved episodes (for promotion engine)\n if (relevantEpisodes.length > 0) {\n const episodeIds = relevantEpisodes.map((e) => e.id);\n this.memory.recordCoAccess(episodeIds).catch((err) => console.warn(\"[memory] recordCoAccess failed:\", (err as Error).message));\n for (const ep of relevantEpisodes) {\n this.memory.recordAccess(ep.id).catch((err) => console.warn(\"[memory] recordAccess failed:\", (err as Error).message));\n }\n }\n\n // Fetch L3 semantic knowledge for this context\n const l3Knowledge = await this.memory\n .getL3Knowledge(contextName)\n .catch((err) => { console.warn(\"[memory] getL3Knowledge failed:\", (err as Error).message); return [] as L3Entry[]; });\n\n // 2. Build prompt with identity + L2 memories + L3 knowledge + context info + MEMORY.md + skills + events\n const systemPromptResult = buildSystemPrompt({\n config: this.config.agent,\n episodes: relevantEpisodes,\n contextName,\n l3Knowledge,\n dataDir: this.dataDir,\n });\n\n // Check for compaction before building final messages\n const systemPromptTokens = estimateTokens(systemPromptResult.text);\n if (this.compactionManager.shouldCompact(conversationHistory, systemPromptTokens, this.config.llm.model)) {\n console.log(\"[compaction] Context approaching limit, compacting...\");\n const result = await this.compactionManager.compact(\n conversationHistory,\n contextName,\n this.memory,\n this.llm,\n this.config.llm.model,\n );\n // Replace conversation history with compacted version\n this.conversationHistories.set(contextName, result.messages);\n // Re-read the (now compacted) history\n const updatedHistory = this.conversationHistories.get(contextName)!;\n conversationHistory.length = 0;\n conversationHistory.push(...updatedHistory);\n }\n\n // Context limit: use config if available, default 200k for Sonnet-class models\n const contextLimit = (this.config.llm as any).context_limit ?? 200_000;\n const messages = buildMessages(systemPromptResult.text, conversationHistory, userMessage, contextLimit, this.config.llm.max_tokens);\n\n // 3. Call LLM (with agentic tool loop if tools available)\n const llmStart = Date.now();\n const toolDefs = this.toolRegistry?.getDefinitions() ?? [];\n let response = await this.llm.chatWithTools(messages, toolDefs.length > 0 ? toolDefs : undefined);\n\n // Agentic loop: if the model wants to use tools, execute them and continue\n let iterations = 0;\n while (response.tool_calls && response.tool_calls.length > 0 && iterations < this.MAX_TOOL_ITERATIONS) {\n iterations++;\n\n // Append assistant message with tool_calls to conversation\n messages.push({\n role: \"assistant\",\n content: response.content,\n tool_calls: response.tool_calls,\n });\n\n // Execute each tool call and append results\n for (const call of response.tool_calls) {\n console.log(`[tools] ${call.function.name}(${call.function.arguments.slice(0, 100)})`);\n const result = await this.toolRegistry!.executeCall(call);\n messages.push({\n role: \"tool\",\n content: result.content,\n tool_call_id: result.tool_call_id,\n });\n console.log(`[tools] ${call.function.name} → ${result.content.slice(0, 100)}${result.content.length > 100 ? \"...\" : \"\"}`);\n }\n\n // Call LLM again with tool results\n response = await this.llm.chatWithTools(messages, toolDefs);\n }\n\n if (iterations > 0) {\n console.log(`[tools] Completed after ${iterations} tool iteration(s)`);\n }\n\n const latencyMs = Date.now() - llmStart;\n\n // Log to dashboard\n if (this.requestLogger) {\n try {\n this.requestLogger.log({\n context: contextName,\n contextSwitched: routing.switched,\n routingReason: routing.switched ? `switched:${contextName}` : `active:${contextName}`,\n rawMessage: userMessage,\n systemPromptComponents: {\n identity: systemPromptResult.components.identity,\n l3Knowledge: systemPromptResult.components.l3Knowledge,\n l2Episodes: systemPromptResult.components.l2Episodes,\n contextInfo: systemPromptResult.components.contextInfo,\n fullText: systemPromptResult.text,\n },\n conversationHistory: conversationHistory.map((m) => ({\n role: m.role,\n content: m.content ?? \"\",\n })),\n userMessage,\n response: {\n content: response.content,\n model: response.model,\n latencyMs,\n skipped: response.content.trim() === \"__SKIP__\",\n },\n config: {\n topK: this.config.memory.top_k,\n model: this.config.llm.model,\n maxTokens: this.config.llm.max_tokens,\n temperature: this.config.llm.temperature,\n },\n });\n } catch (err) {\n console.error(\"[dashboard] Failed to log request:\", (err as Error).message);\n }\n }\n\n // 4. Update conversation history (L1 working memory, per-context)\n conversationHistory.push(\n { role: \"user\", content: userMessage },\n { role: \"assistant\", content: response.content },\n );\n\n // Persist to session JSONL\n try {\n this.sessionStore.append(contextName, { role: \"user\", content: userMessage });\n this.sessionStore.append(contextName, { role: \"assistant\", content: response.content });\n } catch (err) {\n console.error(\"[session] Failed to persist messages:\", (err as Error).message);\n }\n\n // Keep working memory bounded (last 20 turns = 40 messages)\n if (conversationHistory.length > 40) {\n const trimmed = conversationHistory.slice(-40);\n this.conversationHistories.set(contextName, trimmed);\n }\n\n // 5. Store episodes in memory daemon (write-through to L2)\n await this.storeEpisodes(contextName, userMessage, response.content);\n\n // 6. Periodically trigger L2→L3 promotion (fire-and-forget)\n this.messageCount++;\n if (this.messageCount % this.PROMOTION_INTERVAL === 0) {\n this.memory.runPromotion(contextName).catch((err) => {\n console.error(\"Promotion run failed:\", (err as Error).message);\n });\n }\n\n return {\n content: response.content,\n model: response.model,\n context: contextName,\n contextSwitched: routing.switched,\n };\n }\n\n private async storeEpisodes(\n contextName: string,\n userMessage: string,\n assistantResponse: string,\n ): Promise<void> {\n try {\n await Promise.all([\n this.memory.storeEpisode({\n context_name: contextName,\n role: \"user\",\n content: userMessage,\n }),\n this.memory.storeEpisode({\n context_name: contextName,\n role: \"assistant\",\n content: assistantResponse,\n }),\n ]);\n } catch (err) {\n console.error(\"Failed to store episodes:\", (err as Error).message);\n }\n }\n\n private async handleSpecialCommand(message: string): Promise<AgentResponse | null> {\n const activeCtx = this.contextManager.getActiveContext();\n\n // Strip Sesame sender prefix so commands work in both DM and group contexts\n // e.g. \"[handle in group chat]: /command\" → \"/command\"\n let stripped = message.replace(/^\\[.+?\\s+in\\s+group\\s+chat\\]:\\s*/, \"\");\n stripped = stripped.replace(/^\\[.+?\\]:\\s*/, \"\");\n // Use stripped version for command matching below\n const cmdText = stripped;\n\n // --- Cross-context commands ---\n\n // \"search all: <query>\" or \"cross-context search: <query>\"\n const searchAllMatch = cmdText.match(/^(?:search\\s+all|cross-context\\s+search)[:\\s]+(.+)/i);\n if (searchAllMatch) {\n const query = searchAllMatch[1].trim();\n try {\n const results = await this.memory.searchCrossContext(query);\n let response = \"## Cross-Context Search Results\\n\\n\";\n if (results.length === 0) {\n response += \"No results found across any context.\";\n } else {\n for (const group of results) {\n response += `### Context: ${group.context}\\n`;\n for (const ep of group.episodes) {\n response += `- [${ep.role}] ${ep.content.slice(0, 200)}${ep.content.length > 200 ? \"...\" : \"\"} (score: ${ep.score.toFixed(3)})\\n`;\n }\n response += \"\\n\";\n }\n }\n return { content: response, model: \"system\", context: activeCtx };\n } catch (err) {\n return { content: `Cross-context search failed: ${(err as Error).message}`, model: \"system\", context: activeCtx };\n }\n }\n\n // \"share <episode_id> with <context>\"\n const shareMatch = cmdText.match(/^share\\s+(\\S+)\\s+with\\s+(\\S+)/i);\n if (shareMatch) {\n const episodeId = shareMatch[1];\n const targetContext = shareMatch[2];\n try {\n await this.memory.shareEpisode(episodeId, targetContext);\n return { content: `Shared episode ${episodeId} with context \"${targetContext}\".`, model: \"system\", context: activeCtx };\n } catch (err) {\n return { content: `Failed to share: ${(err as Error).message}`, model: \"system\", context: activeCtx };\n }\n }\n\n // --- Task commands ---\n const taskCmd = TaskEngine.parseTaskCommand(cmdText);\n if (taskCmd) {\n const engine = new TaskEngine({ contextName: activeCtx, memory: this.memory });\n try {\n switch (taskCmd.action) {\n case \"add\": {\n const task = await engine.addTask(taskCmd.title || \"Untitled\", taskCmd.description || \"\");\n return { content: `Task created: [${task.id.slice(0, 8)}] ${task.title} (status: ${task.status})`, model: \"system\", context: activeCtx };\n }\n case \"list\": {\n const tasks = await engine.listTasks(taskCmd.statusFilter);\n if (tasks.length === 0) {\n return { content: `No tasks${taskCmd.statusFilter ? ` with status \"${taskCmd.statusFilter}\"` : \"\"} in context \"${activeCtx}\".`, model: \"system\", context: activeCtx };\n }\n let response = `## Tasks in ${activeCtx}\\n\\n`;\n for (const t of tasks) {\n const blockedBy: string[] = Array.isArray(t.blocked_by) ? t.blocked_by : JSON.parse(String(t.blocked_by) || \"[]\");\n const blockedStr = blockedBy.length > 0 ? ` (blocked by: ${blockedBy.map((b) => b.slice(0, 8)).join(\", \")})` : \"\";\n response += `- [${t.status}] ${t.id.slice(0, 8)}: ${t.title}${blockedStr}\\n`;\n }\n return { content: response, model: \"system\", context: activeCtx };\n }\n case \"start\": {\n const task = await engine.startTask(taskCmd.taskId!);\n return { content: task ? `Task ${taskCmd.taskId!.slice(0, 8)} started.` : \"Task not found.\", model: \"system\", context: activeCtx };\n }\n case \"complete\": {\n const task = await engine.completeTask(taskCmd.taskId!);\n return { content: task ? `Task ${taskCmd.taskId!.slice(0, 8)} completed.` : \"Task not found.\", model: \"system\", context: activeCtx };\n }\n case \"archive\": {\n const task = await engine.archiveTask(taskCmd.taskId!);\n return { content: task ? `Task ${taskCmd.taskId!.slice(0, 8)} archived.` : \"Task not found.\", model: \"system\", context: activeCtx };\n }\n case \"next\": {\n const task = await engine.pickAndStartNextTask();\n if (task) {\n return { content: `Picked up next task: [${task.id.slice(0, 8)}] ${task.title}`, model: \"system\", context: activeCtx };\n }\n return { content: \"No available tasks to pick up.\", model: \"system\", context: activeCtx };\n }\n }\n } catch (err) {\n return { content: `Task command failed: ${(err as Error).message}`, model: \"system\", context: activeCtx };\n }\n }\n\n return null;\n }\n\n getMemoryClient(): MemoryClient {\n return this.memory;\n }\n\n getContextManager(): ContextManager {\n return this.contextManager;\n }\n\n setContext(name: string): void {\n this.contextManager.switchContext(name);\n }\n\n getActiveContext(): string {\n return this.contextManager.getActiveContext();\n }\n\n getConversationHistories(): Map<string, ChatMessage[]> {\n return this.conversationHistories;\n }\n}\n","/**\n * File-based events system.\n * Agent creates JSON event files, watcher picks them up and triggers.\n * Inspired by Pi/Mom's events system, built from scratch.\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, watch, type FSWatcher } from \"fs\";\nimport { join } from \"path\";\n\n// ── Event Types ──\n\nexport interface ImmediateEvent {\n type: \"immediate\";\n channelId: string;\n text: string;\n}\n\nexport interface OneShotEvent {\n type: \"one-shot\";\n channelId: string;\n text: string;\n at: string; // ISO 8601 with timezone\n}\n\nexport interface PeriodicEvent {\n type: \"periodic\";\n channelId: string;\n text: string;\n schedule: string; // cron expression\n timezone: string; // IANA timezone\n}\n\nexport type HivemindEvent = ImmediateEvent | OneShotEvent | PeriodicEvent;\n\nexport type EventHandler = (channelId: string, text: string, filename: string, eventType: string) => Promise<void>;\n\n// ── Simple Cron Parser ──\n// Supports: minute hour day-of-month month day-of-week\n// No external deps — handles basic patterns: *, numbers, ranges (1-5), lists (1,3,5)\n\nfunction matchCronField(field: string, value: number, _max: number): boolean {\n if (field === \"*\") return true;\n for (const part of field.split(\",\")) {\n if (part.includes(\"-\")) {\n const [lo, hi] = part.split(\"-\").map(Number);\n if (value >= lo && value <= hi) return true;\n } else if (part.includes(\"/\")) {\n const [base, step] = part.split(\"/\");\n const stepN = Number(step);\n const baseN = base === \"*\" ? 0 : Number(base);\n if ((value - baseN) % stepN === 0 && value >= baseN) return true;\n } else {\n if (Number(part) === value) return true;\n }\n }\n return false;\n}\n\nfunction cronMatches(expr: string, date: Date): boolean {\n const parts = expr.trim().split(/\\s+/);\n if (parts.length !== 5) return false;\n const [minute, hour, dayOfMonth, month, dayOfWeek] = parts;\n return (\n matchCronField(minute, date.getMinutes(), 59) &&\n matchCronField(hour, date.getHours(), 23) &&\n matchCronField(dayOfMonth, date.getDate(), 31) &&\n matchCronField(month, date.getMonth() + 1, 12) &&\n matchCronField(dayOfWeek, date.getDay(), 6)\n );\n}\n\n// ── Events Watcher ──\n\nexport class EventsWatcher {\n private eventsDir: string;\n private handler: EventHandler;\n private watcher: FSWatcher | null = null;\n private cronInterval: NodeJS.Timeout | null = null;\n private oneShotTimers: Map<string, NodeJS.Timeout> = new Map();\n private knownFiles: Set<string> = new Set();\n private startTime: number;\n private debounceTimers: Map<string, NodeJS.Timeout> = new Map();\n\n constructor(dataDir: string, handler: EventHandler) {\n this.eventsDir = join(dataDir, \"events\");\n this.handler = handler;\n this.startTime = Date.now();\n }\n\n start(): void {\n if (!existsSync(this.eventsDir)) {\n mkdirSync(this.eventsDir, { recursive: true });\n }\n\n console.log(`[events] Watching ${this.eventsDir}`);\n\n // Scan existing files\n this.scanExisting();\n\n // Watch for new files\n this.watcher = watch(this.eventsDir, (_eventType, filename) => {\n if (!filename || !filename.endsWith(\".json\")) return;\n this.debounce(filename, () => this.handleFileChange(filename));\n });\n\n // Check periodic events every 60 seconds\n this.cronInterval = setInterval(() => this.checkPeriodicEvents(), 60_000);\n\n console.log(`[events] Started, tracking ${this.knownFiles.size} files`);\n }\n\n stop(): void {\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n if (this.cronInterval) {\n clearInterval(this.cronInterval);\n this.cronInterval = null;\n }\n for (const timer of this.oneShotTimers.values()) {\n clearTimeout(timer);\n }\n this.oneShotTimers.clear();\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n\n private debounce(filename: string, fn: () => void): void {\n const existing = this.debounceTimers.get(filename);\n if (existing) clearTimeout(existing);\n this.debounceTimers.set(\n filename,\n setTimeout(() => {\n this.debounceTimers.delete(filename);\n fn();\n }, 200),\n );\n }\n\n private scanExisting(): void {\n try {\n const files = readdirSync(this.eventsDir).filter((f) => f.endsWith(\".json\"));\n for (const file of files) {\n this.knownFiles.add(file);\n this.processEventFile(file);\n }\n } catch {\n // Dir might not exist yet\n }\n }\n\n private handleFileChange(filename: string): void {\n const filePath = join(this.eventsDir, filename);\n if (!existsSync(filePath)) {\n // File was deleted\n this.knownFiles.delete(filename);\n const timer = this.oneShotTimers.get(filename);\n if (timer) {\n clearTimeout(timer);\n this.oneShotTimers.delete(filename);\n }\n return;\n }\n\n if (!this.knownFiles.has(filename)) {\n this.knownFiles.add(filename);\n }\n this.processEventFile(filename);\n }\n\n private processEventFile(filename: string): void {\n const filePath = join(this.eventsDir, filename);\n let event: HivemindEvent;\n\n try {\n const content = readFileSync(filePath, \"utf-8\");\n event = JSON.parse(content);\n } catch (err) {\n console.error(`[events] Failed to parse ${filename}:`, (err as Error).message);\n return;\n }\n\n if (!event.type || !event.channelId || !event.text) {\n console.warn(`[events] Invalid event in ${filename}: missing required fields`);\n return;\n }\n\n switch (event.type) {\n case \"immediate\":\n this.handleImmediate(filename, event);\n break;\n case \"one-shot\":\n this.scheduleOneShot(filename, event);\n break;\n case \"periodic\":\n // Periodic events are checked by the cron interval\n console.log(`[events] Registered periodic event: ${filename} (${event.schedule})`);\n break;\n default:\n console.warn(`[events] Unknown event type in ${filename}: ${(event as any).type}`);\n }\n }\n\n private async handleImmediate(filename: string, event: ImmediateEvent): Promise<void> {\n console.log(`[events] Triggering immediate event: ${filename}`);\n try {\n await this.handler(event.channelId, event.text, filename, \"immediate\");\n } catch (err) {\n console.error(`[events] Handler error for ${filename}:`, (err as Error).message);\n }\n // Delete after triggering\n this.deleteEvent(filename);\n }\n\n private scheduleOneShot(filename: string, event: OneShotEvent): void {\n const targetTime = new Date(event.at).getTime();\n const now = Date.now();\n const delay = targetTime - now;\n\n if (delay <= 0) {\n // Already past, trigger immediately\n console.log(`[events] One-shot event ${filename} is past due, triggering now`);\n this.handler(event.channelId, event.text, filename, \"one-shot\").catch((err) => {\n console.error(`[events] Handler error for ${filename}:`, (err as Error).message);\n });\n this.deleteEvent(filename);\n return;\n }\n\n // Clear existing timer if re-processing\n const existing = this.oneShotTimers.get(filename);\n if (existing) clearTimeout(existing);\n\n console.log(`[events] Scheduled one-shot: ${filename} in ${Math.round(delay / 1000)}s`);\n const timer = setTimeout(async () => {\n this.oneShotTimers.delete(filename);\n try {\n await this.handler(event.channelId, event.text, filename, \"one-shot\");\n } catch (err) {\n console.error(`[events] Handler error for ${filename}:`, (err as Error).message);\n }\n this.deleteEvent(filename);\n }, delay);\n\n this.oneShotTimers.set(filename, timer);\n }\n\n private checkPeriodicEvents(): void {\n const now = new Date();\n\n for (const filename of this.knownFiles) {\n const filePath = join(this.eventsDir, filename);\n if (!existsSync(filePath)) continue;\n\n try {\n const event: HivemindEvent = JSON.parse(readFileSync(filePath, \"utf-8\"));\n if (event.type !== \"periodic\") continue;\n\n // Convert to timezone if specified\n let checkDate = now;\n if (event.timezone) {\n try {\n const tzStr = now.toLocaleString(\"en-US\", { timeZone: event.timezone });\n checkDate = new Date(tzStr);\n } catch {\n // Fall back to local time\n }\n }\n\n if (cronMatches(event.schedule, checkDate)) {\n console.log(`[events] Triggering periodic event: ${filename}`);\n this.handler(event.channelId, event.text, filename, \"periodic\").catch((err) => {\n console.error(`[events] Handler error for ${filename}:`, (err as Error).message);\n });\n }\n } catch {\n // Skip malformed files\n }\n }\n }\n\n private deleteEvent(filename: string): void {\n try {\n const filePath = join(this.eventsDir, filename);\n if (existsSync(filePath)) {\n unlinkSync(filePath);\n }\n this.knownFiles.delete(filename);\n } catch (err) {\n console.error(`[events] Failed to delete ${filename}:`, (err as Error).message);\n }\n }\n}\n","import { readFileSync, existsSync } from \"fs\";\nimport { resolve, dirname } from \"path\";\nimport { parse } from \"smol-toml\";\nimport { getClaudeCodeOAuthToken } from \"./llm-client.js\";\n\nexport interface AgentConfig {\n name: string;\n personality: string;\n team_charter?: string; // Path to team charter markdown file\n workspace?: string; // Path to workspace directory containing .md identity files\n}\n\nexport interface LLMConfig {\n provider?: 'openai' | 'anthropic'; // default: 'openai' (OpenRouter uses OpenAI format)\n base_url: string;\n model: string;\n max_tokens: number;\n temperature: number;\n api_key?: string;\n}\n\nexport interface MemoryConfig {\n daemon_url: string;\n top_k: number;\n embedding_model: string;\n}\n\nexport interface OllamaConfig {\n base_url: string;\n}\n\nexport interface SesameConfig {\n ws_url: string;\n api_url: string;\n api_key: string;\n}\n\nexport interface WorkerModeConfig {\n enabled: boolean;\n primary_url: string;\n worker_port: number;\n worker_id: string;\n max_contexts: number;\n task_poll_interval_ms: number;\n status_report_interval_ms: number;\n}\n\nexport interface SentinelConfig {\n poll_interval_ms: number;\n health_timeout_ms: number;\n max_restart_attempts: number;\n backoff_base_ms: number;\n backoff_max_ms: number;\n agent_startup_grace_ms: number;\n health_port: number;\n pid_file: string;\n stop_flag_file: string;\n}\n\nexport interface AutoDebugConfig {\n enabled: boolean;\n log_files: string[];\n severity_threshold: number;\n auto_pr: boolean;\n repo?: string;\n branch_prefix: string;\n max_concurrent_fixes: number;\n cooldown_minutes: number;\n notify_channel?: string;\n}\n\nexport interface HivemindConfig {\n agent: AgentConfig;\n llm: LLMConfig;\n memory: MemoryConfig;\n ollama: OllamaConfig;\n sesame: SesameConfig;\n worker?: WorkerModeConfig;\n sentinel?: SentinelConfig;\n auto_debug?: AutoDebugConfig;\n}\n\nfunction defaultWorkerConfig(): WorkerModeConfig {\n return {\n enabled: false,\n primary_url: \"http://localhost:3000\",\n worker_port: 3100,\n worker_id: `worker-${process.pid}`,\n max_contexts: 4,\n task_poll_interval_ms: 5_000,\n status_report_interval_ms: 15_000,\n };\n}\n\nexport function defaultSentinelConfig(): SentinelConfig {\n return {\n poll_interval_ms: 5_000,\n health_timeout_ms: 3_000,\n max_restart_attempts: 5,\n backoff_base_ms: 5_000,\n backoff_max_ms: 300_000,\n agent_startup_grace_ms: 15_000,\n health_port: 9484,\n pid_file: \"/tmp/hivemind-agent.pid\",\n stop_flag_file: \"/tmp/hivemind-agent.stopped\",\n };\n}\n\nfunction deepMerge(target: any, source: any): any {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n if (source[key] && typeof source[key] === \"object\" && !Array.isArray(source[key])\n && target[key] && typeof target[key] === \"object\") {\n result[key] = deepMerge(target[key], source[key]);\n } else if (source[key] !== undefined && source[key] !== \"\") {\n result[key] = source[key];\n }\n }\n return result;\n}\n\nexport function loadConfig(path: string): HivemindConfig {\n const raw = readFileSync(path, \"utf-8\");\n let parsed = parse(raw) as unknown as HivemindConfig;\n\n // Layer: merge local.toml if it exists alongside the config\n const configDir = dirname(path);\n const localPath = resolve(configDir, \"local.toml\");\n if (existsSync(localPath)) {\n const localRaw = readFileSync(localPath, \"utf-8\");\n const localParsed = parse(localRaw) as Record<string, unknown>;\n parsed = deepMerge(parsed, localParsed) as HivemindConfig;\n console.log(`[config] Merged overrides from ${localPath}`);\n }\n\n // Allow env overrides\n if (process.env.AGENT_NAME) {\n parsed.agent.name = process.env.AGENT_NAME;\n }\n if (process.env.LLM_API_KEY) {\n parsed.llm.api_key = process.env.LLM_API_KEY;\n }\n if (process.env.ANTHROPIC_API_KEY && !parsed.llm.api_key) {\n parsed.llm.api_key = process.env.ANTHROPIC_API_KEY;\n if (!parsed.llm.provider) parsed.llm.provider = 'anthropic';\n if (!process.env.LLM_BASE_URL && parsed.llm.base_url.includes('openrouter')) {\n parsed.llm.base_url = 'https://api.anthropic.com';\n }\n }\n // Claude Max OAuth fallback: if provider is anthropic and still no api_key, try keychain\n if (parsed.llm.provider === 'anthropic' && !parsed.llm.api_key) {\n const oauthToken = getClaudeCodeOAuthToken();\n if (oauthToken) {\n parsed.llm.api_key = oauthToken;\n if (!process.env.LLM_BASE_URL && parsed.llm.base_url.includes('openrouter')) {\n parsed.llm.base_url = 'https://api.anthropic.com';\n }\n console.log('[config] Auth: Claude Max OAuth (from macOS Keychain)');\n }\n }\n if (process.env.LLM_PROVIDER) {\n parsed.llm.provider = process.env.LLM_PROVIDER as 'openai' | 'anthropic';\n }\n if (process.env.LLM_BASE_URL) {\n parsed.llm.base_url = process.env.LLM_BASE_URL;\n }\n if (process.env.SESAME_API_KEY) {\n parsed.sesame.api_key = process.env.SESAME_API_KEY;\n }\n if (process.env.MEMORY_DAEMON_URL) {\n parsed.memory.daemon_url = process.env.MEMORY_DAEMON_URL;\n }\n if (process.env.WORKER_PRIMARY_URL) {\n if (!parsed.worker) parsed.worker = defaultWorkerConfig();\n parsed.worker.primary_url = process.env.WORKER_PRIMARY_URL;\n }\n if (process.env.WORKER_PORT) {\n if (!parsed.worker) parsed.worker = defaultWorkerConfig();\n parsed.worker.worker_port = parseInt(process.env.WORKER_PORT, 10);\n }\n if (process.env.WORKER_ID) {\n if (!parsed.worker) parsed.worker = defaultWorkerConfig();\n parsed.worker.worker_id = process.env.WORKER_ID;\n }\n\n // Sentinel env overrides\n if (process.env.SENTINEL_POLL_INTERVAL_MS) {\n if (!parsed.sentinel) parsed.sentinel = defaultSentinelConfig();\n parsed.sentinel.poll_interval_ms = parseInt(process.env.SENTINEL_POLL_INTERVAL_MS, 10);\n }\n if (process.env.SENTINEL_HEALTH_PORT) {\n if (!parsed.sentinel) parsed.sentinel = defaultSentinelConfig();\n parsed.sentinel.health_port = parseInt(process.env.SENTINEL_HEALTH_PORT, 10);\n }\n if (process.env.SENTINEL_PID_FILE) {\n if (!parsed.sentinel) parsed.sentinel = defaultSentinelConfig();\n parsed.sentinel.pid_file = process.env.SENTINEL_PID_FILE;\n }\n if (process.env.SENTINEL_STOP_FLAG_FILE) {\n if (!parsed.sentinel) parsed.sentinel = defaultSentinelConfig();\n parsed.sentinel.stop_flag_file = process.env.SENTINEL_STOP_FLAG_FILE;\n }\n\n // Resolve relative workspace path against config directory\n if (parsed.agent.workspace && !parsed.agent.workspace.startsWith(\"/\")) {\n const configDir = dirname(path);\n parsed.agent.workspace = resolve(configDir, \"..\", parsed.agent.workspace);\n }\n\n return parsed;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r\\n|\\n|\\r/g);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\nfunction isEscaped(str, ptr) {\n let i = 0;\n while (str[ptr - ++i] === '\\\\')\n ;\n return --i && (i % 2);\n}\nexport function indexOfNewline(str, start = 0, end = str.length) {\n let idx = str.indexOf('\\n', start);\n if (str[idx - 1] === '\\r')\n idx--;\n return idx <= end ? idx : -1;\n}\nexport function skipComment(str, ptr) {\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '\\n')\n return i;\n if (c === '\\r' && str[i + 1] === '\\n')\n return i + 1;\n if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in comments', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n return str.length;\n}\nexport function skipVoid(str, ptr, banNewLines, banComments) {\n let c;\n while ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || c === '\\r' && str[ptr + 1] === '\\n')))\n ptr++;\n return banComments || c !== '#'\n ? ptr\n : skipVoid(str, skipComment(str, ptr), banNewLines);\n}\nexport function skipUntil(str, ptr, sep, end, banNewLines = false) {\n if (!end) {\n ptr = indexOfNewline(str, ptr);\n return ptr < 0 ? str.length : ptr;\n }\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '#') {\n i = indexOfNewline(str, i);\n }\n else if (c === sep) {\n return i + 1;\n }\n else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n return i;\n }\n }\n throw new TomlError('cannot find end of structure', {\n toml: str,\n ptr: ptr\n });\n}\nexport function getStringEnd(str, seek) {\n let first = str[seek];\n let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2]\n ? str.slice(seek, seek + 3)\n : first;\n seek += target.length - 1;\n do\n seek = str.indexOf(target, ++seek);\n while (seek > -1 && first !== \"'\" && isEscaped(str, seek));\n if (seek > -1) {\n seek += target.length;\n if (target.length > 1) {\n if (str[seek] === first)\n seek++;\n if (str[seek] === first)\n seek++;\n }\n }\n return seek;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n if (typeof date === 'string') {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n date = date.toUpperCase();\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { skipVoid } from './util.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/;\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/;\nlet LEADING_ZERO = /^[+-]?0[0-9_]/;\nlet ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;\nlet ESC_MAP = {\n b: '\\b',\n t: '\\t',\n n: '\\n',\n f: '\\f',\n r: '\\r',\n e: '\\x1b',\n '\"': '\"',\n '\\\\': '\\\\',\n};\nexport function parseString(str, ptr = 0, endPtr = str.length) {\n let isLiteral = str[ptr] === '\\'';\n let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];\n if (isMultiline) {\n endPtr -= 2;\n if (str[ptr += 2] === '\\r')\n ptr++;\n if (str[ptr] === '\\n')\n ptr++;\n }\n let tmp = 0;\n let isEscape;\n let parsed = '';\n let sliceStart = ptr;\n while (ptr < endPtr - 1) {\n let c = str[ptr++];\n if (c === '\\n' || (c === '\\r' && str[ptr] === '\\n')) {\n if (!isMultiline) {\n throw new TomlError('newlines are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n }\n else if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n if (isEscape) {\n isEscape = false;\n if (c === 'x' || c === 'u' || c === 'U') {\n // Unicode escape\n let code = str.slice(ptr, (ptr += (c === 'x' ? 2 : c === 'u' ? 4 : 8)));\n if (!ESCAPE_REGEX.test(code)) {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n try {\n parsed += String.fromCodePoint(parseInt(code, 16));\n }\n catch {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n }\n else if (isMultiline && (c === '\\n' || c === ' ' || c === '\\t' || c === '\\r')) {\n // Multiline escape\n ptr = skipVoid(str, ptr - 1, true);\n if (str[ptr] !== '\\n' && str[ptr] !== '\\r') {\n throw new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n toml: str,\n ptr: tmp,\n });\n }\n ptr = skipVoid(str, ptr);\n }\n else if (c in ESC_MAP) {\n // Classic escape\n parsed += ESC_MAP[c];\n }\n else {\n throw new TomlError('unrecognized escape sequence', {\n toml: str,\n ptr: tmp,\n });\n }\n sliceStart = ptr;\n }\n else if (!isLiteral && c === '\\\\') {\n tmp = ptr - 1;\n isEscape = true;\n parsed += str.slice(sliceStart, tmp);\n }\n }\n return parsed + str.slice(sliceStart, endPtr - 1);\n}\nexport function parseValue(value, toml, ptr, integersAsBigInt) {\n // Constant values\n if (value === 'true')\n return true;\n if (value === 'false')\n return false;\n if (value === '-inf')\n return -Infinity;\n if (value === 'inf' || value === '+inf')\n return Infinity;\n if (value === 'nan' || value === '+nan' || value === '-nan')\n return NaN;\n // Avoid FP representation of -0\n if (value === '-0')\n return integersAsBigInt ? 0n : 0;\n // Numbers\n let isInt = INT_REGEX.test(value);\n if (isInt || FLOAT_REGEX.test(value)) {\n if (LEADING_ZERO.test(value)) {\n throw new TomlError('leading zeroes are not allowed', {\n toml: toml,\n ptr: ptr,\n });\n }\n value = value.replace(/_/g, '');\n let numeric = +value;\n if (isNaN(numeric)) {\n throw new TomlError('invalid number', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt) {\n if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n throw new TomlError('integer value cannot be represented losslessly', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt || integersAsBigInt === true)\n numeric = BigInt(value);\n }\n return numeric;\n }\n const date = new TomlDate(value);\n if (!date.isValid()) {\n throw new TomlError('invalid value', {\n toml: toml,\n ptr: ptr,\n });\n }\n return date;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString, parseValue } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { skipVoid, skipUntil, skipComment, getStringEnd } from './util.js';\nimport { TomlError } from './error.js';\nfunction sliceAndTrimEndOf(str, startPtr, endPtr) {\n let value = str.slice(startPtr, endPtr);\n let commentIdx = value.indexOf('#');\n if (commentIdx > -1) {\n // The call to skipComment allows to \"validate\" the comment\n // (absence of control characters)\n skipComment(str, commentIdx);\n value = value.slice(0, commentIdx);\n }\n return [value.trimEnd(), commentIdx];\n}\nexport function extractValue(str, ptr, end, depth, integersAsBigInt) {\n if (depth === 0) {\n throw new TomlError('document contains excessively nested structures. aborting.', {\n toml: str,\n ptr: ptr\n });\n }\n let c = str[ptr];\n if (c === '[' || c === '{') {\n let [value, endPtr] = c === '['\n ? parseArray(str, ptr, depth, integersAsBigInt)\n : parseInlineTable(str, ptr, depth, integersAsBigInt);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] === ',')\n endPtr++;\n else if (str[endPtr] !== end) {\n throw new TomlError('expected comma or end of structure', {\n toml: str,\n ptr: endPtr,\n });\n }\n }\n return [value, endPtr];\n }\n let endPtr;\n if (c === '\"' || c === \"'\") {\n endPtr = getStringEnd(str, ptr);\n let parsed = parseString(str, ptr, endPtr);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n throw new TomlError('unexpected character encountered', {\n toml: str,\n ptr: endPtr,\n });\n }\n endPtr += (+(str[endPtr] === ','));\n }\n return [parsed, endPtr];\n }\n endPtr = skipUntil(str, ptr, ',', end);\n let slice = sliceAndTrimEndOf(str, ptr, endPtr - (+(str[endPtr - 1] === ',')));\n if (!slice[0]) {\n throw new TomlError('incomplete key-value declaration: no value specified', {\n toml: str,\n ptr: ptr\n });\n }\n if (end && slice[1] > -1) {\n endPtr = skipVoid(str, ptr + slice[1]);\n endPtr += +(str[endPtr] === ',');\n }\n return [\n parseValue(slice[0], str, ptr, integersAsBigInt),\n endPtr,\n ];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { getStringEnd, indexOfNewline, skipComment, skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/;\nexport function parseKey(str, ptr, end = '=') {\n let dot = ptr - 1;\n let parsed = [];\n let endPtr = str.indexOf(end, ptr);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n do {\n let c = str[ptr = ++dot];\n // If it's whitespace, ignore\n if (c !== ' ' && c !== '\\t') {\n // If it's a string\n if (c === '\"' || c === '\\'') {\n if (c === str[ptr + 1] && c === str[ptr + 2]) {\n throw new TomlError('multiline strings are not allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n let eos = getStringEnd(str, ptr);\n if (eos < 0) {\n throw new TomlError('unfinished string encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n dot = str.indexOf('.', eos);\n let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);\n let newLine = indexOfNewline(strEnd);\n if (newLine > -1) {\n throw new TomlError('newlines are not allowed in keys', {\n toml: str,\n ptr: ptr + dot + newLine,\n });\n }\n if (strEnd.trimStart()) {\n throw new TomlError('found extra tokens after the string part', {\n toml: str,\n ptr: eos,\n });\n }\n if (endPtr < eos) {\n endPtr = str.indexOf(end, eos);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n parsed.push(parseString(str, ptr, eos));\n }\n else {\n // Normal raw key part consumption and validation\n dot = str.indexOf('.', ptr);\n let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);\n if (!KEY_PART_RE.test(part)) {\n throw new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n parsed.push(part.trimEnd());\n }\n }\n // Until there's no more dot\n } while (dot + 1 && dot < endPtr);\n return [parsed, skipVoid(str, endPtr + 1, true, true)];\n}\nexport function parseInlineTable(str, ptr, depth, integersAsBigInt) {\n let res = {};\n let seen = new Set();\n let c;\n ptr++;\n while ((c = str[ptr++]) !== '}' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let k;\n let t = res;\n let hasOwn = false;\n let [key, keyEndPtr] = parseKey(str, ptr - 1);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = {});\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n if (!hasOwn && k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n let [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt);\n seen.add(value);\n t[k] = value;\n ptr = valueEndPtr;\n }\n }\n if (!c) {\n throw new TomlError('unfinished table encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\nexport function parseArray(str, ptr, depth, integersAsBigInt) {\n let res = [];\n let c;\n ptr++;\n while ((c = str[ptr++]) !== ']' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt);\n res.push(e[0]);\n ptr = e[1];\n }\n }\n if (!c) {\n throw new TomlError('unfinished array encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = {});\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n if (k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */\n : type,\n d: false,\n i: 0,\n c: {},\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = {});\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: {} });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = {});\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nexport function parse(toml, { maxDepth = 1000, integersAsBigInt } = {}) {\n let res = {};\n let meta = {};\n let tbl = res;\n let m = meta;\n for (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n if (toml[ptr] === '[') {\n let isTableArray = toml[++ptr] === '[';\n let k = parseKey(toml, ptr += +isTableArray, ']');\n if (isTableArray) {\n if (toml[k[1] - 1] !== ']') {\n throw new TomlError('expected end of table declaration', {\n toml: toml,\n ptr: k[1] - 1,\n });\n }\n k[1]++;\n }\n let p = peekTable(k[0], res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n m = p[2];\n tbl = p[1];\n ptr = k[1];\n }\n else {\n let k = parseKey(toml, ptr);\n let p = peekTable(k[0], tbl, m, 0 /* Type.DOTTED */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);\n p[1][p[0]] = v[0];\n ptr = v[1];\n }\n ptr = skipVoid(toml, ptr, true);\n if (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n throw new TomlError('each key-value declaration must be followed by an end-of-line', {\n toml: toml,\n ptr: ptr\n });\n }\n ptr = skipVoid(toml, ptr);\n }\n return res;\n}\n",null,null,null,"import { SesameClient as SesameSDK } from \"@sesamespace/sdk\";\nimport { readFileSync } from \"fs\";\nimport { resolve, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { SesameConfig } from \"./config.js\";\n\n// Read version at module load time\nlet RUNTIME_VERSION = \"unknown\";\ntry {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(resolve(__dirname, \"../package.json\"), \"utf-8\"));\n RUNTIME_VERSION = pkg.version ?? \"unknown\";\n} catch {\n // give up\n}\n\nexport interface SesameMessage {\n id: string;\n channelId: string;\n channelKind: \"dm\" | \"group\" | \"topic\";\n content: string;\n author: {\n id: string;\n handle: string;\n };\n timestamp: string;\n}\n\ntype MessageHandler = (message: SesameMessage) => void | Promise<void>;\ntype UpgradeHandler = (event: UpgradeRequest) => void | Promise<void>;\ntype RestartHandler = (event: RestartRequest) => void | Promise<void>;\n\nexport interface UpgradeRequest {\n targetVersion: string;\n packageName: string;\n requestedBy: string;\n requestId: string;\n}\n\nexport interface RestartRequest {\n requestedBy: string;\n requestId: string;\n}\n\ninterface ChannelInfo {\n kind: \"dm\" | \"group\" | \"topic\";\n name?: string;\n}\n\nexport class SesameClient {\n private config: SesameConfig;\n private sdk: SesameSDK;\n private messageHandler: MessageHandler | null = null;\n private upgradeHandler: UpgradeHandler | null = null;\n private restartHandler: RestartHandler | null = null;\n private agentId: string | null = null;\n private channels: Map<string, ChannelInfo> = new Map();\n private typingIntervals: Map<string, ReturnType<typeof setInterval>> = new Map();\n\n constructor(config: SesameConfig) {\n this.config = config;\n this.sdk = new SesameSDK({\n apiUrl: config.api_url.replace(/\\/api\\/v1$/, \"\"),\n wsUrl: config.ws_url,\n apiKey: config.api_key,\n });\n }\n\n onMessage(handler: MessageHandler): void {\n this.messageHandler = handler;\n }\n\n onUpgrade(handler: UpgradeHandler): void {\n this.upgradeHandler = handler;\n }\n\n onRestart(handler: RestartHandler): void {\n this.restartHandler = handler;\n }\n\n async connect(): Promise<void> {\n const manifest = await this.sdk.getManifest();\n this.agentId = manifest.agent.id;\n console.log(`[sesame] Authenticated as ${manifest.agent.handle} (${this.agentId})`);\n\n // Cache channel info\n for (const ch of manifest.channels) {\n this.channels.set(ch.id, { kind: ch.kind as ChannelInfo[\"kind\"], name: ch.name ?? undefined });\n const label = ch.name || ch.id.slice(0, 8);\n console.log(`[sesame] Channel: ${label} (${ch.kind})`);\n }\n\n // Set presence to online\n this.updatePresence(\"online\", { emoji: \"🟢\" });\n\n // Listen for upgrade.request control events\n this.sdk.on(\"upgrade.request\", (event: any) => {\n console.log(`[sesame] Upgrade request received: ${event.packageName}@${event.targetVersion}`);\n if (this.upgradeHandler) {\n this.upgradeHandler({\n targetVersion: event.targetVersion,\n packageName: event.packageName,\n requestedBy: event.requestedBy,\n requestId: event.requestId,\n });\n }\n });\n\n // Listen for restart.request control events\n this.sdk.on(\"restart.request\", (event: any) => {\n console.log(`[sesame] Restart requested by ${event.requestedBy}`);\n if (this.restartHandler) {\n this.restartHandler({\n requestedBy: event.requestedBy,\n requestId: event.requestId,\n });\n }\n });\n\n // Listen for generic control events\n this.sdk.on(\"control\", (event: any) => {\n console.log(`[sesame] Control event: ${event.action}`, event.payload);\n });\n\n // Listen for message events\n this.sdk.on(\"message\", (event: any) => {\n const msg = event.data || event.message || event;\n const senderId = msg.senderId || msg.sender?.id;\n\n // Ignore our own messages\n if (senderId === this.agentId) return;\n\n if (!this.messageHandler || !msg.content) return;\n\n const channelInfo = this.channels.get(msg.channelId);\n\n this.messageHandler({\n id: msg.id || \"unknown\",\n channelId: msg.channelId || \"unknown\",\n channelKind: channelInfo?.kind || \"dm\",\n content: msg.content,\n author: {\n id: senderId || \"unknown\",\n handle: msg.senderHandle || msg.metadata?.senderHandle || \"unknown\",\n },\n timestamp: msg.createdAt || new Date().toISOString(),\n });\n });\n\n await this.sdk.connect();\n console.log(\"[sesame] WebSocket connected\");\n\n // Report runtime metadata\n const ws = (this.sdk as any).ws;\n if (ws?.readyState === 1) {\n ws.send(JSON.stringify({ type: \"meta\", runtime: \"hivemind\", version: RUNTIME_VERSION }));\n console.log(`[sesame] Reported version: hivemind@${RUNTIME_VERSION}`);\n }\n }\n\n // ── Typing Indicators ──\n\n /**\n * Start sending typing indicators for a channel.\n * Sends immediately, then every 2.5s until stopTyping() is called.\n */\n startTyping(channelId: string): void {\n // Don't double-start\n if (this.typingIntervals.has(channelId)) return;\n\n this.sdk.sendTyping(channelId);\n const interval = setInterval(() => {\n this.sdk.sendTyping(channelId);\n }, 2500);\n this.typingIntervals.set(channelId, interval);\n }\n\n /**\n * Stop sending typing indicators for a channel.\n */\n stopTyping(channelId: string): void {\n const interval = this.typingIntervals.get(channelId);\n if (interval) {\n clearInterval(interval);\n this.typingIntervals.delete(channelId);\n }\n }\n\n /**\n * Stop all active typing indicators.\n */\n stopAllTyping(): void {\n for (const [channelId, interval] of this.typingIntervals) {\n clearInterval(interval);\n }\n this.typingIntervals.clear();\n }\n\n // ── Presence ──\n\n /**\n * Update agent presence/status.\n * @param status - \"online\" | \"thinking\" | \"working\" | \"idle\" | \"offline\"\n * @param options - Optional detail text, progress (0-100), emoji\n */\n updatePresence(status: string, options?: { detail?: string; progress?: number; emoji?: string }): void {\n // Use updatePresence if available (SDK >= 0.3), otherwise fall back to raw WS\n if (typeof (this.sdk as any).updatePresence === \"function\") {\n (this.sdk as any).updatePresence(status, options);\n } else {\n // Direct WS send for older SDK versions\n const ws = (this.sdk as any).ws;\n if (ws?.readyState === 1) {\n ws.send(JSON.stringify({ type: \"status\", status, ...options }));\n }\n }\n }\n\n // ── Read Receipts ──\n\n /**\n * Mark a channel as read up to a given sequence number.\n */\n async markRead(channelId: string, seq: number): Promise<void> {\n await this.sdk.markRead(channelId, seq);\n }\n\n // ── Messages ──\n\n async sendMessage(channelId: string, content: string): Promise<void> {\n await this.sdk.sendMessage(channelId, { content });\n }\n\n getAgentId(): string | null {\n return this.agentId;\n }\n\n getChannelInfo(channelId: string): ChannelInfo | undefined {\n return this.channels.get(channelId);\n }\n\n disconnect(): void {\n this.stopAllTyping();\n this.updatePresence(\"offline\");\n this.sdk.disconnect();\n }\n}\n","import { execSync } from \"child_process\";\nimport { existsSync, readFileSync, readdirSync, watch, mkdirSync, type FSWatcher } from \"fs\";\nimport { resolve, basename } from \"path\";\nimport type { ToolRegistry } from \"./tool-registry.js\";\n\nexport interface SkillToolDef {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n command: string;\n}\n\nexport interface SkillInfo {\n name: string;\n dirName: string;\n description: string;\n path: string;\n tools: string[];\n loaded: boolean;\n}\n\ninterface LoadedSkill {\n name: string;\n dirName: string;\n description: string;\n path: string;\n tools: string[];\n}\n\n/**\n * Shell-escape a value by wrapping in single quotes with internal\n * single quotes escaped as '\\'' (end quote, escaped quote, start quote).\n */\nfunction shellEscape(value: string): string {\n return \"'\" + value.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\n/**\n * Replace mustache-style template variables in a command string.\n * {{param_name}} is replaced with the shell-escaped parameter value.\n * {{skill_dir}} and {{workspace}} are replaced with their respective paths.\n */\nfunction renderCommand(\n template: string,\n params: Record<string, unknown>,\n skillDir: string,\n workspaceDir: string,\n): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n if (key === \"skill_dir\") return shellEscape(skillDir);\n if (key === \"workspace\") return shellEscape(workspaceDir);\n const val = params[key];\n if (val === undefined || val === null) return \"''\";\n return shellEscape(String(val));\n });\n}\n\nfunction parseSkillMd(content: string, fallbackName: string): { name: string; description: string } {\n const fmMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n let name = fallbackName;\n let description = \"\";\n if (fmMatch) {\n const fm = fmMatch[1];\n const nameMatch = fm.match(/^name:\\s*(.+)$/m);\n const descMatch = fm.match(/^description:\\s*(.+)$/m);\n if (nameMatch) name = nameMatch[1].trim().replace(/^[\"']|[\"']$/g, \"\");\n if (descMatch) description = descMatch[1].trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n return { name, description };\n}\n\nexport class SkillsEngine {\n private workspaceDir: string;\n private skillsDir: string;\n private toolRegistry: ToolRegistry;\n private loadedSkills: Map<string, LoadedSkill> = new Map();\n private watcher: FSWatcher | null = null;\n private debounceTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n\n constructor(workspaceDir: string, toolRegistry: ToolRegistry) {\n this.workspaceDir = workspaceDir;\n this.toolRegistry = toolRegistry;\n this.skillsDir = resolve(workspaceDir, \"skills\");\n }\n\n async loadAll(): Promise<void> {\n if (!existsSync(this.skillsDir)) return;\n\n let entries: string[];\n try {\n entries = readdirSync(this.skillsDir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const skillMdPath = resolve(this.skillsDir, entry, \"SKILL.md\");\n if (!existsSync(skillMdPath)) continue;\n try {\n await this.loadSkill(entry);\n } catch (err) {\n console.error(`[skills] Failed to load skill \"${entry}\":`, (err as Error).message);\n }\n }\n }\n\n async loadSkill(dirName: string): Promise<void> {\n const skillDir = resolve(this.skillsDir, dirName);\n const skillMdPath = resolve(skillDir, \"SKILL.md\");\n\n if (!existsSync(skillMdPath)) {\n throw new Error(`SKILL.md not found in ${skillDir}`);\n }\n\n // Parse SKILL.md for metadata\n const mdContent = readFileSync(skillMdPath, \"utf-8\");\n const { name, description } = parseSkillMd(mdContent, dirName);\n\n // Run setup.sh if present\n const setupPath = resolve(skillDir, \"setup.sh\");\n if (existsSync(setupPath)) {\n try {\n execSync(\"bash setup.sh\", { cwd: skillDir, timeout: 30_000, stdio: \"pipe\" });\n console.log(`[skills] Ran setup.sh for \"${name}\"`);\n } catch (err) {\n console.warn(`[skills] setup.sh failed for \"${name}\":`, (err as Error).message);\n }\n }\n\n // Parse and register tools from tools.json\n const toolNames: string[] = [];\n const toolsJsonPath = resolve(skillDir, \"tools.json\");\n if (existsSync(toolsJsonPath)) {\n try {\n const toolsData = JSON.parse(readFileSync(toolsJsonPath, \"utf-8\"));\n const toolDefs: SkillToolDef[] = toolsData.tools || [];\n\n for (const toolDef of toolDefs) {\n if (!toolDef.name || !toolDef.command) continue;\n\n const toolName = toolDef.name;\n const toolDesc = toolDef.description || `Tool from skill \"${name}\"`;\n const toolParams = toolDef.parameters || { type: \"object\", properties: {}, required: [] };\n const commandTemplate = toolDef.command;\n\n this.toolRegistry.register(\n toolName,\n toolDesc,\n toolParams,\n async (params: Record<string, unknown>) => {\n const cmd = renderCommand(commandTemplate, params, skillDir, this.workspaceDir);\n try {\n const output = execSync(cmd, {\n cwd: skillDir,\n timeout: 60_000,\n encoding: \"utf-8\",\n maxBuffer: 1024 * 1024,\n shell: \"/bin/bash\",\n });\n return output || \"(no output)\";\n } catch (err: unknown) {\n const execErr = err as { stderr?: string; message: string };\n return `Error: ${execErr.stderr || execErr.message}`;\n }\n },\n );\n toolNames.push(toolName);\n }\n } catch (err) {\n console.warn(`[skills] Failed to parse tools.json for \"${name}\":`, (err as Error).message);\n }\n }\n\n this.loadedSkills.set(dirName, {\n name,\n dirName,\n description,\n path: skillDir,\n tools: toolNames,\n });\n\n const toolSuffix = toolNames.length > 0 ? ` (${toolNames.length} tools: ${toolNames.join(\", \")})` : \"\";\n console.log(`[skills] Loaded \"${name}\"${toolSuffix}`);\n }\n\n async unloadSkill(dirName: string): Promise<void> {\n const skill = this.loadedSkills.get(dirName);\n if (!skill) return;\n\n // Remove registered tools\n for (const toolName of skill.tools) {\n this.toolRegistry.unregister(toolName);\n }\n\n // Run teardown.sh if present\n const teardownPath = resolve(skill.path, \"teardown.sh\");\n if (existsSync(teardownPath)) {\n try {\n execSync(\"bash teardown.sh\", { cwd: skill.path, timeout: 30_000, stdio: \"pipe\" });\n console.log(`[skills] Ran teardown.sh for \"${skill.name}\"`);\n } catch (err) {\n console.warn(`[skills] teardown.sh failed for \"${skill.name}\":`, (err as Error).message);\n }\n }\n\n this.loadedSkills.delete(dirName);\n console.log(`[skills] Unloaded \"${skill.name}\"`);\n }\n\n async reloadSkill(dirName: string): Promise<void> {\n await this.unloadSkill(dirName);\n await this.loadSkill(dirName);\n }\n\n startWatching(): void {\n if (this.watcher) return;\n if (!existsSync(this.skillsDir)) {\n mkdirSync(this.skillsDir, { recursive: true });\n }\n\n try {\n this.watcher = watch(this.skillsDir, { recursive: true }, (_event, filename) => {\n if (!filename) return;\n\n // Extract the skill directory name from the changed path\n // filename could be \"my-skill/tools.json\" or \"my-skill/SKILL.md\"\n const parts = filename.split(\"/\");\n if (parts.length < 2) return;\n\n const skillDirName = parts[0];\n const changedFile = parts.slice(1).join(\"/\");\n\n // Only react to relevant file changes\n if (changedFile !== \"tools.json\" && changedFile !== \"SKILL.md\") return;\n\n // Debounce per skill\n const existing = this.debounceTimers.get(skillDirName);\n if (existing) clearTimeout(existing);\n\n this.debounceTimers.set(\n skillDirName,\n setTimeout(async () => {\n this.debounceTimers.delete(skillDirName);\n const skillDir = resolve(this.skillsDir, skillDirName);\n const hasMd = existsSync(resolve(skillDir, \"SKILL.md\"));\n\n if (hasMd && this.loadedSkills.has(skillDirName)) {\n console.log(`[skills] Detected change in \"${skillDirName}\", reloading...`);\n try {\n await this.reloadSkill(skillDirName);\n } catch (err) {\n console.error(`[skills] Reload failed for \"${skillDirName}\":`, (err as Error).message);\n }\n } else if (hasMd && !this.loadedSkills.has(skillDirName)) {\n console.log(`[skills] Detected new skill \"${skillDirName}\", loading...`);\n try {\n await this.loadSkill(skillDirName);\n } catch (err) {\n console.error(`[skills] Load failed for \"${skillDirName}\":`, (err as Error).message);\n }\n }\n }, 500),\n );\n });\n console.log(`[skills] Watching ${this.skillsDir} for changes`);\n } catch (err) {\n console.warn(`[skills] Failed to start watcher:`, (err as Error).message);\n }\n }\n\n stopWatching(): void {\n if (this.watcher) {\n this.watcher.close();\n this.watcher = null;\n }\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n }\n\n listSkills(): SkillInfo[] {\n return Array.from(this.loadedSkills.values()).map((s) => ({\n name: s.name,\n dirName: s.dirName,\n description: s.description,\n path: s.path,\n tools: [...s.tools],\n loaded: true,\n }));\n }\n\n getSkill(dirName: string): SkillInfo | undefined {\n const s = this.loadedSkills.get(dirName);\n if (!s) return undefined;\n return {\n name: s.name,\n dirName: s.dirName,\n description: s.description,\n path: s.path,\n tools: [...s.tools],\n loaded: true,\n };\n }\n}\n","/**\n * Error Registry — persistent error tracking and severity scoring.\n *\n * Stores a JSON registry of detected errors keyed by a normalized hash.\n * Tracks occurrence counts, status, and severity so the auto-debugger can\n * decide which errors are worth investigating.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { createHash } from \"crypto\";\nimport { dirname } from \"path\";\nimport { createLogger } from \"../logger.js\";\n\nconst log = createLogger(\"error-registry\");\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ErrorSource = \"agent\" | \"watchdog\" | \"memory\";\nexport type ErrorLevel = \"error\" | \"crash\" | \"repeated-warning\";\nexport type ErrorStatus =\n | \"new\"\n | \"investigating\"\n | \"fix-submitted\"\n | \"resolved\"\n | \"wont-fix\";\n\nexport interface ErrorEvent {\n id: string;\n timestamp: Date;\n source: ErrorSource;\n level: ErrorLevel;\n message: string;\n stackTrace?: string;\n logFile: string;\n lineNumber: number;\n occurrences: number;\n context: string[]; // surrounding log lines (±10)\n}\n\nexport interface ErrorEntry {\n id: string;\n message: string;\n source: ErrorSource;\n level: ErrorLevel;\n stackTrace?: string;\n firstSeen: string; // ISO\n lastSeen: string; // ISO\n totalOccurrences: number;\n status: ErrorStatus;\n prUrl?: string;\n severity: number;\n}\n\ninterface RegistryFile {\n version: 1;\n errors: Record<string, ErrorEntry>;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Strip volatile parts from a stack trace so the same root cause hashes the same. */\nfunction normalizeForHash(msg: string, stack?: string): string {\n let text = msg;\n if (stack) {\n text += \"\\n\" + stack;\n }\n // Strip line/column numbers (e.g. :42:10)\n text = text.replace(/:\\d+:\\d+/g, \":X:X\");\n // Strip timestamps\n text = text.replace(/\\d{4}-\\d{2}-\\d{2}T[\\d:.Z]+/g, \"T\");\n // Strip pids / random ids\n text = text.replace(/\\b\\d{4,}\\b/g, \"N\");\n return text;\n}\n\nexport function hashError(msg: string, stack?: string): string {\n const normalized = normalizeForHash(msg, stack);\n return createHash(\"sha256\").update(normalized).digest(\"hex\").slice(0, 16);\n}\n\n// ---------------------------------------------------------------------------\n// Severity scoring\n// ---------------------------------------------------------------------------\n\nfunction scoreSeverity(entry: ErrorEntry): number {\n let score = 0;\n\n // Crash / uncaught\n if (entry.level === \"crash\") score += 5;\n\n // Occurs on every startup — heuristic: first and last seen close together\n // with multiple occurrences in a short window\n const firstMs = new Date(entry.firstSeen).getTime();\n const lastMs = new Date(entry.lastSeen).getTime();\n const spanMinutes = (lastMs - firstMs) / 60_000;\n if (entry.totalOccurrences >= 3 && spanMinutes < 5) score += 3;\n\n // High frequency (>10/hour)\n const spanHours = Math.max(spanMinutes / 60, 1 / 60); // at least 1 min\n if (entry.totalOccurrences / spanHours > 10) score += 2;\n\n // Sesame-related\n if (/sesame/i.test(entry.message) || /sesame/i.test(entry.stackTrace ?? \"\")) {\n score += 2;\n }\n\n // Memory-related\n if (/memory/i.test(entry.message) || /memory/i.test(entry.stackTrace ?? \"\")) {\n score += 1;\n }\n\n // Already has PR or wont-fix → deprioritize\n if (entry.status === \"fix-submitted\" || entry.status === \"wont-fix\") {\n score -= 10;\n }\n\n return score;\n}\n\n// ---------------------------------------------------------------------------\n// ErrorRegistry class\n// ---------------------------------------------------------------------------\n\nexport class ErrorRegistry {\n private filePath: string;\n private entries: Map<string, ErrorEntry> = new Map();\n\n constructor(dataDir: string) {\n this.filePath = `${dataDir}/error-registry.json`;\n this.load();\n }\n\n // ---- persistence -------------------------------------------------------\n\n private load(): void {\n try {\n if (!existsSync(this.filePath)) return;\n const raw = readFileSync(this.filePath, \"utf-8\");\n const data: RegistryFile = JSON.parse(raw);\n if (data.version === 1 && data.errors) {\n for (const [id, entry] of Object.entries(data.errors)) {\n this.entries.set(id, entry);\n }\n }\n log.debug(\"loaded error registry\", { count: this.entries.size });\n } catch (err) {\n log.warn(\"failed to load error registry, starting fresh\", {\n error: (err as Error).message,\n });\n }\n }\n\n private save(): void {\n try {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n const data: RegistryFile = {\n version: 1,\n errors: Object.fromEntries(this.entries),\n };\n writeFileSync(this.filePath, JSON.stringify(data, null, 2));\n } catch (err) {\n log.error(\"failed to save error registry\", {\n error: (err as Error).message,\n });\n }\n }\n\n // ---- public API --------------------------------------------------------\n\n /** Record an error event, creating or updating the registry entry. */\n recordError(event: ErrorEvent): ErrorEntry {\n const existing = this.entries.get(event.id);\n\n if (existing) {\n existing.lastSeen = event.timestamp.toISOString();\n existing.totalOccurrences += event.occurrences;\n // Escalate level if needed\n if (event.level === \"crash\" && existing.level !== \"crash\") {\n existing.level = \"crash\";\n }\n existing.severity = scoreSeverity(existing);\n this.save();\n log.debug(\"updated error entry\", {\n id: event.id,\n total: existing.totalOccurrences,\n severity: existing.severity,\n });\n return existing;\n }\n\n const entry: ErrorEntry = {\n id: event.id,\n message: event.message,\n source: event.source,\n level: event.level,\n stackTrace: event.stackTrace,\n firstSeen: event.timestamp.toISOString(),\n lastSeen: event.timestamp.toISOString(),\n totalOccurrences: event.occurrences,\n status: \"new\",\n severity: 0,\n };\n entry.severity = scoreSeverity(entry);\n this.entries.set(event.id, entry);\n this.save();\n\n log.info(\"new error registered\", {\n id: event.id,\n message: event.message.slice(0, 120),\n severity: entry.severity,\n });\n return entry;\n }\n\n /** Return errors above the severity threshold that are actionable (new or investigating). */\n getActionable(threshold: number): ErrorEntry[] {\n const results: ErrorEntry[] = [];\n for (const entry of this.entries.values()) {\n // Recalculate in case time has passed\n entry.severity = scoreSeverity(entry);\n if (\n entry.severity >= threshold &&\n (entry.status === \"new\" || entry.status === \"investigating\")\n ) {\n results.push(entry);\n }\n }\n // Highest severity first\n results.sort((a, b) => b.severity - a.severity);\n return results;\n }\n\n /** Update the status (and optional PR url) for an error. */\n updateStatus(id: string, status: ErrorStatus, prUrl?: string): void {\n const entry = this.entries.get(id);\n if (!entry) return;\n entry.status = status;\n if (prUrl) entry.prUrl = prUrl;\n entry.severity = scoreSeverity(entry);\n this.save();\n log.info(\"error status updated\", { id, status, prUrl });\n }\n\n /** Remove entries older than the given date. */\n cleanup(olderThan: Date): number {\n let removed = 0;\n for (const [id, entry] of this.entries) {\n if (new Date(entry.lastSeen) < olderThan) {\n this.entries.delete(id);\n removed++;\n }\n }\n if (removed > 0) {\n this.save();\n log.info(\"cleaned up old errors\", { removed });\n }\n return removed;\n }\n\n /** Get a single entry by id. */\n get(id: string): ErrorEntry | undefined {\n return this.entries.get(id);\n }\n\n /** Total number of tracked errors. */\n get size(): number {\n return this.entries.size;\n }\n}\n","/**\n * Log Watcher — Background processor that tails Hivemind log files,\n * detects errors, and feeds them into the ErrorRegistry for triage.\n *\n * Detection rules:\n * - Stack traces (Error:, TypeError:, at …)\n * - JSON structured log entries with \"level\":\"error\"\n * - Process crash indicators (exit code, SIGKILL/SIGTERM)\n * - Repeated warnings (same message 3+ times in 5 min)\n */\n\nimport { readFileSync, statSync, existsSync } from \"fs\";\nimport { BackgroundProcess, type ProcessContext, type ProcessResult } from \"../memory/background-processor.js\";\nimport { ErrorRegistry, hashError, type ErrorEvent, type ErrorSource, type ErrorLevel } from \"./error-registry.js\";\nimport { createLogger } from \"../logger.js\";\n\nconst log = createLogger(\"log-watcher\");\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface LogWatcherConfig {\n log_files: string[];\n severity_threshold: number;\n auto_pr: boolean;\n repo?: string;\n branch_prefix: string;\n max_concurrent_fixes: number;\n cooldown_minutes: number;\n notify_channel?: string;\n}\n\ninterface WarningAccumulator {\n message: string;\n count: number;\n firstSeen: number; // epoch ms\n logFile: string;\n lastLine: number;\n}\n\n// ---------------------------------------------------------------------------\n// Patterns\n// ---------------------------------------------------------------------------\n\nconst STACK_TRACE_START = /^(?:Error|TypeError|RangeError|ReferenceError|SyntaxError|URIError|EvalError|AggregateError|UnhandledPromiseRejectionWarning|Uncaught):/;\nconst STACK_FRAME = /^\\s+at\\s+/;\nconst CRASH_INDICATOR = /(?:exit\\s+code\\s+[1-9]\\d*|SIGKILL|SIGTERM|SIGSEGV|SIGABRT|uncaughtException|unhandledRejection)/i;\n\nconst WARNING_DEDUP_WINDOW_MS = 5 * 60 * 1000; // 5 minutes\nconst WARNING_THRESHOLD = 3;\n\n// ---------------------------------------------------------------------------\n// LogWatcher processor\n// ---------------------------------------------------------------------------\n\nexport class LogWatcher extends BackgroundProcess {\n private config: LogWatcherConfig;\n private registry: ErrorRegistry;\n private tailPositions: Map<string, number> = new Map();\n private warningAccumulators: Map<string, WarningAccumulator> = new Map();\n private positionsFile: string;\n\n constructor(config: LogWatcherConfig, dataDir: string) {\n super(\"log-watcher\", 10_000); // check every 10 s\n this.config = config;\n this.registry = new ErrorRegistry(dataDir);\n this.positionsFile = `${dataDir}/log-watcher-positions.json`;\n this.loadPositions();\n }\n\n /** Expose the registry so the auto-debugger can consume it. */\n getRegistry(): ErrorRegistry {\n return this.registry;\n }\n\n // ---- BackgroundProcess implementation ------------------------------------\n\n async process(context: ProcessContext): Promise<ProcessResult> {\n const errors: string[] = [];\n let itemsProcessed = 0;\n\n for (const logFile of this.config.log_files) {\n try {\n const result = this.processLogFile(logFile, context);\n itemsProcessed += result.linesRead;\n } catch (err) {\n errors.push(`${logFile}: ${(err as Error).message}`);\n }\n }\n\n // Prune stale warning accumulators\n this.pruneWarnings();\n\n // Persist tail positions\n this.savePositions();\n\n // Clean up errors older than 30 days\n this.registry.cleanup(new Date(Date.now() - 30 * 24 * 60 * 60 * 1000));\n\n return { itemsProcessed, errors };\n }\n\n // ---- log tailing ---------------------------------------------------------\n\n private processLogFile(\n logFile: string,\n context: ProcessContext,\n ): { linesRead: number } {\n if (!existsSync(logFile)) return { linesRead: 0 };\n\n let fileSize: number;\n try {\n fileSize = statSync(logFile).size;\n } catch {\n return { linesRead: 0 };\n }\n\n const lastPos = this.tailPositions.get(logFile) ?? 0;\n\n // File was truncated/rotated — reset position\n if (fileSize < lastPos) {\n this.tailPositions.set(logFile, 0);\n return this.processLogFile(logFile, context);\n }\n\n if (fileSize === lastPos) return { linesRead: 0 };\n\n // Read only new bytes\n let chunk: string;\n try {\n const buf = Buffer.alloc(fileSize - lastPos);\n const fd = require(\"fs\").openSync(logFile, \"r\");\n try {\n require(\"fs\").readSync(fd, buf, 0, buf.length, lastPos);\n } finally {\n require(\"fs\").closeSync(fd);\n }\n chunk = buf.toString(\"utf-8\");\n } catch {\n return { linesRead: 0 };\n }\n\n this.tailPositions.set(logFile, fileSize);\n\n const lines = chunk.split(\"\\n\").filter((l) => l.length > 0);\n if (lines.length === 0) return { linesRead: 0 };\n\n // Determine approximate starting line number\n let baseLineNumber: number;\n try {\n const fullContent = readFileSync(logFile, \"utf-8\");\n const preContent = fullContent.substring(0, lastPos);\n baseLineNumber = preContent.split(\"\\n\").length;\n } catch {\n baseLineNumber = 1;\n }\n\n this.detectErrors(lines, logFile, baseLineNumber, context);\n\n return { linesRead: lines.length };\n }\n\n // ---- error detection -----------------------------------------------------\n\n private detectErrors(\n lines: string[],\n logFile: string,\n baseLineNumber: number,\n context: ProcessContext,\n ): void {\n const source = this.inferSource(logFile);\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const lineNumber = baseLineNumber + i;\n\n // 1. Try parsing as structured JSON log\n const jsonError = this.tryParseJsonError(line);\n if (jsonError) {\n this.emitError({\n message: jsonError.msg,\n stackTrace: jsonError.stack,\n level: jsonError.level === \"crash\" ? \"crash\" : \"error\",\n source,\n logFile,\n lineNumber,\n context: this.getSurroundingLines(lines, i),\n });\n continue;\n }\n\n // 2. Stack trace detection\n if (STACK_TRACE_START.test(line)) {\n const { message, stack } = this.collectStackTrace(lines, i);\n const level: ErrorLevel =\n /uncaught|unhandled/i.test(line) ? \"crash\" : \"error\";\n this.emitError({\n message,\n stackTrace: stack,\n level,\n source,\n logFile,\n lineNumber,\n context: this.getSurroundingLines(lines, i),\n });\n continue;\n }\n\n // 3. Crash indicators in plain text\n if (CRASH_INDICATOR.test(line)) {\n this.emitError({\n message: line.trim(),\n level: \"crash\",\n source,\n logFile,\n lineNumber,\n context: this.getSurroundingLines(lines, i),\n });\n continue;\n }\n\n // 4. Warning accumulation\n this.accumulateWarning(line, logFile, lineNumber);\n }\n }\n\n private tryParseJsonError(\n line: string,\n ): { msg: string; stack?: string; level: string } | null {\n if (!line.startsWith(\"{\")) return null;\n try {\n const entry = JSON.parse(line);\n if (entry.level === \"error\" || entry.level === \"crash\") {\n return {\n msg: entry.msg || entry.message || \"unknown error\",\n stack: entry.stack || entry.stackTrace,\n level: entry.level,\n };\n }\n } catch {\n // not JSON — skip\n }\n return null;\n }\n\n private collectStackTrace(\n lines: string[],\n startIdx: number,\n ): { message: string; stack: string } {\n const message = lines[startIdx].trim();\n const stackLines = [message];\n for (let j = startIdx + 1; j < lines.length; j++) {\n if (STACK_FRAME.test(lines[j])) {\n stackLines.push(lines[j]);\n } else {\n break;\n }\n }\n return { message, stack: stackLines.join(\"\\n\") };\n }\n\n private getSurroundingLines(lines: string[], idx: number): string[] {\n const start = Math.max(0, idx - 10);\n const end = Math.min(lines.length, idx + 11);\n return lines.slice(start, end);\n }\n\n private emitError(params: {\n message: string;\n stackTrace?: string;\n level: ErrorLevel;\n source: ErrorSource;\n logFile: string;\n lineNumber: number;\n context: string[];\n }): void {\n const id = hashError(params.message, params.stackTrace);\n\n const event: ErrorEvent = {\n id,\n timestamp: new Date(),\n source: params.source,\n level: params.level,\n message: params.message,\n stackTrace: params.stackTrace,\n logFile: params.logFile,\n lineNumber: params.lineNumber,\n occurrences: 1,\n context: params.context,\n };\n\n const entry = this.registry.recordError(event);\n log.info(\"error detected\", {\n id,\n severity: entry.severity,\n message: params.message.slice(0, 120),\n logFile: params.logFile,\n });\n }\n\n // ---- repeated warning detection ------------------------------------------\n\n private accumulateWarning(\n line: string,\n logFile: string,\n lineNumber: number,\n ): void {\n // Only accumulate lines that look like warnings\n const isWarning =\n /\\bwarn\\b/i.test(line) ||\n (line.startsWith(\"{\") && line.includes('\"warn\"'));\n if (!isWarning) return;\n\n // Normalize the message for dedup (strip timestamps, pids)\n const normalized = line\n .replace(/\\d{4}-\\d{2}-\\d{2}T[\\d:.Z]+/g, \"T\")\n .replace(/\\b\\d{4,}\\b/g, \"N\")\n .trim();\n\n const key = `${logFile}::${normalized}`;\n const existing = this.warningAccumulators.get(key);\n const now = Date.now();\n\n if (existing) {\n existing.count++;\n existing.lastLine = lineNumber;\n\n if (\n existing.count >= WARNING_THRESHOLD &&\n now - existing.firstSeen <= WARNING_DEDUP_WINDOW_MS\n ) {\n // Emit as repeated-warning error\n const id = hashError(existing.message);\n const event: ErrorEvent = {\n id,\n timestamp: new Date(),\n source: this.inferSource(logFile),\n level: \"repeated-warning\",\n message: `Repeated warning (${existing.count}x in 5 min): ${existing.message}`,\n logFile,\n lineNumber: existing.lastLine,\n occurrences: existing.count,\n context: [],\n };\n this.registry.recordError(event);\n log.info(\"repeated warning detected\", {\n id,\n count: existing.count,\n message: existing.message.slice(0, 100),\n });\n\n // Reset so we don't fire again until next window\n this.warningAccumulators.delete(key);\n }\n } else {\n this.warningAccumulators.set(key, {\n message: normalized,\n count: 1,\n firstSeen: now,\n logFile,\n lastLine: lineNumber,\n });\n }\n }\n\n private pruneWarnings(): void {\n const now = Date.now();\n for (const [key, acc] of this.warningAccumulators) {\n if (now - acc.firstSeen > WARNING_DEDUP_WINDOW_MS) {\n this.warningAccumulators.delete(key);\n }\n }\n }\n\n // ---- helpers -------------------------------------------------------------\n\n private inferSource(logFile: string): ErrorSource {\n if (logFile.includes(\"watchdog\")) return \"watchdog\";\n if (logFile.includes(\"memory\")) return \"memory\";\n return \"agent\";\n }\n\n // ---- position persistence ------------------------------------------------\n\n private loadPositions(): void {\n try {\n if (!existsSync(this.positionsFile)) return;\n const raw = readFileSync(this.positionsFile, \"utf-8\");\n const data = JSON.parse(raw) as Record<string, number>;\n for (const [file, pos] of Object.entries(data)) {\n this.tailPositions.set(file, pos);\n }\n log.debug(\"loaded tail positions\", { count: this.tailPositions.size });\n } catch {\n // start fresh\n }\n }\n\n private savePositions(): void {\n try {\n const { mkdirSync, writeFileSync } = require(\"fs\");\n const { dirname } = require(\"path\");\n const dir = dirname(this.positionsFile);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n const data = Object.fromEntries(this.tailPositions);\n writeFileSync(this.positionsFile, JSON.stringify(data));\n } catch (err) {\n log.warn(\"failed to save tail positions\", {\n error: (err as Error).message,\n });\n }\n }\n}\n","/**\n * Background Process Framework for Continuous Memory Management\n * \n * This system runs lightweight background processes that continuously\n * organize, index, and surface relevant information without requiring\n * LLM calls or agent intervention.\n */\n\nimport { EventEmitter } from 'events';\nimport { MemoryClient } from '../memory-client';\n\nexport interface ProcessContext {\n memoryClient: MemoryClient;\n workspacePath: string;\n currentContext: string;\n agentId: string;\n sharedState: Map<string, any>;\n}\n\nexport interface ProcessResult {\n itemsProcessed: number;\n errors: string[];\n nextRunIn?: number; // Override default interval\n}\n\nexport abstract class BackgroundProcess extends EventEmitter {\n protected name: string;\n protected interval: number;\n protected enabled: boolean = true;\n private timer?: NodeJS.Timer;\n private running: boolean = false;\n protected lastRun?: Date;\n protected lastResult?: ProcessResult;\n\n constructor(name: string, interval: number) {\n super();\n this.name = name;\n this.interval = interval;\n }\n\n /**\n * Main processing logic - implement in subclasses\n */\n abstract process(context: ProcessContext): Promise<ProcessResult>;\n\n /**\n * Determine if this process should run now\n */\n async shouldRun(context: ProcessContext): Promise<boolean> {\n if (!this.enabled || this.running) return false;\n \n // Allow subclasses to add custom logic\n return true;\n }\n\n /**\n * Start the background process\n */\n start(context: ProcessContext): void {\n if (this.timer) return;\n\n // Run immediately on start\n this.runOnce(context);\n\n // Then run on interval\n this.timer = setInterval(() => {\n this.runOnce(context);\n }, this.interval);\n }\n\n /**\n * Stop the background process\n */\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n }\n\n /**\n * Run the process once\n */\n private async runOnce(context: ProcessContext): Promise<void> {\n if (!await this.shouldRun(context)) return;\n\n this.running = true;\n const startTime = Date.now();\n\n try {\n this.emit('start', { name: this.name, time: new Date() });\n \n const result = await this.process(context);\n this.lastResult = result;\n this.lastRun = new Date();\n \n // Adjust next run interval if requested\n if (result.nextRunIn && result.nextRunIn !== this.interval) {\n this.stop();\n this.interval = result.nextRunIn;\n this.start(context);\n }\n\n this.emit('complete', {\n name: this.name,\n duration: Date.now() - startTime,\n result\n });\n\n // Log errors if any\n if (result.errors.length > 0) {\n this.emit('error', {\n name: this.name,\n errors: result.errors\n });\n }\n } catch (error) {\n this.emit('error', {\n name: this.name,\n error: error instanceof Error ? error.message : String(error)\n });\n } finally {\n this.running = false;\n }\n }\n\n /**\n * Get process status\n */\n getStatus(): object {\n return {\n name: this.name,\n enabled: this.enabled,\n running: this.running,\n interval: this.interval,\n lastRun: this.lastRun,\n lastResult: this.lastResult\n };\n }\n}\n\n/**\n * Manages all background processes\n */\nexport class ProcessManager extends EventEmitter {\n private processes: Map<string, BackgroundProcess> = new Map();\n private context: ProcessContext;\n private started: boolean = false;\n\n constructor(context: ProcessContext) {\n super();\n this.context = context;\n }\n\n /**\n * Register a background process\n */\n register(process: BackgroundProcess): void {\n if (this.processes.has(process.name)) {\n throw new Error(`Process ${process.name} already registered`);\n }\n\n // Forward process events\n process.on('start', (data) => this.emit('process:start', data));\n process.on('complete', (data) => this.emit('process:complete', data));\n process.on('error', (data) => this.emit('process:error', data));\n\n this.processes.set(process.name, process);\n\n // Start immediately if manager is already running\n if (this.started) {\n process.start(this.context);\n }\n }\n\n /**\n * Start all registered processes\n */\n start(): void {\n if (this.started) return;\n\n for (const process of this.processes.values()) {\n process.start(this.context);\n }\n\n this.started = true;\n this.emit('started');\n }\n\n /**\n * Stop all processes\n */\n stop(): void {\n if (!this.started) return;\n\n for (const process of this.processes.values()) {\n process.stop();\n }\n\n this.started = false;\n this.emit('stopped');\n }\n\n /**\n * Get status of all processes\n */\n getStatus(): object {\n const statuses: Record<string, object> = {};\n \n for (const [name, process] of this.processes) {\n statuses[name] = process.getStatus();\n }\n\n return {\n started: this.started,\n processCount: this.processes.size,\n processes: statuses\n };\n }\n\n /**\n * Enable/disable a specific process\n */\n setProcessEnabled(name: string, enabled: boolean): void {\n const process = this.processes.get(name);\n if (!process) {\n throw new Error(`Process ${name} not found`);\n }\n\n process.enabled = enabled;\n \n if (!enabled) {\n process.stop();\n } else if (this.started) {\n process.start(this.context);\n }\n }\n\n /**\n * Manually trigger a process run\n */\n async runProcess(name: string): Promise<ProcessResult> {\n const process = this.processes.get(name);\n if (!process) {\n throw new Error(`Process ${name} not found`);\n }\n\n return process.process(this.context);\n }\n}","/**\n * Auto-Debugger — Takes actionable errors from the ErrorRegistry,\n * diagnoses root causes via the agent's LLM, and optionally opens\n * GitHub PRs with fixes.\n *\n * Runs as a BackgroundProcess on a slower cadence than the LogWatcher\n * (every 60 s by default). Rate-limited to avoid PR spam.\n */\n\nimport { execSync } from \"child_process\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { resolve } from \"path\";\nimport { BackgroundProcess, type ProcessContext, type ProcessResult } from \"../memory/background-processor.js\";\nimport { type ErrorRegistry, type ErrorEntry } from \"./error-registry.js\";\nimport { LLMClient, type ChatMessage } from \"../llm-client.js\";\nimport type { LLMConfig } from \"../config.js\";\nimport { createLogger } from \"../logger.js\";\n\nconst log = createLogger(\"auto-debugger\");\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface AutoDebuggerConfig {\n severity_threshold: number;\n auto_pr: boolean;\n repo?: string;\n branch_prefix: string;\n max_concurrent_fixes: number;\n cooldown_minutes: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Patterns that look like secrets/tokens — stripped from PR bodies. */\nconst SECRET_PATTERNS = [\n /(?:api[_-]?key|token|secret|password|credential|auth)[\\s=:]+\\S+/gi,\n /sk-[a-zA-Z0-9]{20,}/g,\n /ghp_[a-zA-Z0-9]{36}/g,\n /Bearer\\s+\\S+/g,\n];\n\nfunction sanitize(text: string): string {\n let clean = text;\n for (const pat of SECRET_PATTERNS) {\n clean = clean.replace(pat, \"[REDACTED]\");\n }\n return clean;\n}\n\n/** Extract file paths from a stack trace that exist in the repo. */\nfunction extractSourceFiles(\n stackTrace: string,\n repoRoot: string,\n): string[] {\n const files = new Set<string>();\n // Match paths like /Users/foo/hivemind/packages/runtime/src/foo.ts:42:10\n // or relative like src/foo.ts:42:10 or (src/foo.ts:42:10)\n const pathPattern = /(?:[(]|\\s)((?:\\/[^\\s:()]+|[a-zA-Z][a-zA-Z0-9/_.-]+)\\.[a-zA-Z]+)(?::\\d+){0,2}/g;\n let m: RegExpExecArray | null;\n while ((m = pathPattern.exec(stackTrace)) !== null) {\n let filePath = m[1];\n // Skip node_modules\n if (filePath.includes(\"node_modules\")) continue;\n // Make absolute\n if (!filePath.startsWith(\"/\")) {\n filePath = resolve(repoRoot, filePath);\n }\n // Must be inside the repo and exist\n if (filePath.startsWith(repoRoot) && existsSync(filePath)) {\n files.add(filePath);\n }\n }\n return [...files].slice(0, 5); // cap at 5 files\n}\n\n/** Check if `gh` CLI is available and authenticated. */\nfunction ghAvailable(): boolean {\n try {\n execSync(\"gh auth status\", { stdio: \"ignore\", timeout: 5000 });\n return true;\n } catch {\n return false;\n }\n}\n\n/** Run a shell command in the repo, return stdout or null on failure. */\nfunction run(cmd: string, cwd: string): string | null {\n try {\n return execSync(cmd, { cwd, encoding: \"utf-8\", timeout: 60_000 }).trim();\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// AutoDebugger processor\n// ---------------------------------------------------------------------------\n\nexport class AutoDebugger extends BackgroundProcess {\n private config: AutoDebuggerConfig;\n private registry: ErrorRegistry;\n private llm: LLMClient | null;\n private repoRoot: string;\n private activeFixes: Set<string> = new Set(); // error ids currently being fixed\n private cooldowns: Map<string, number> = new Map(); // error id → epoch ms of last fix attempt\n\n constructor(\n config: AutoDebuggerConfig,\n registry: ErrorRegistry,\n llmConfig: LLMConfig | null,\n repoRoot: string,\n ) {\n super(\"auto-debugger\", 60_000); // run every 60 s\n this.config = config;\n this.registry = registry;\n this.repoRoot = repoRoot;\n\n // LLM is optional — if not configured, we log-only\n if (llmConfig && llmConfig.api_key) {\n try {\n this.llm = new LLMClient(llmConfig);\n } catch {\n this.llm = null;\n }\n } else {\n this.llm = null;\n }\n }\n\n // ---- BackgroundProcess implementation ------------------------------------\n\n async process(_context: ProcessContext): Promise<ProcessResult> {\n const errors: string[] = [];\n let itemsProcessed = 0;\n\n const actionable = this.registry.getActionable(this.config.severity_threshold);\n if (actionable.length === 0) return { itemsProcessed: 0, errors: [] };\n\n log.info(\"actionable errors found\", { count: actionable.length });\n\n for (const entry of actionable) {\n // Rate limiting: max concurrent fixes\n if (this.activeFixes.size >= this.config.max_concurrent_fixes) {\n log.debug(\"max concurrent fixes reached, skipping remaining\");\n break;\n }\n\n // Cooldown check\n const lastAttempt = this.cooldowns.get(entry.id);\n if (\n lastAttempt &&\n Date.now() - lastAttempt < this.config.cooldown_minutes * 60_000\n ) {\n continue;\n }\n\n try {\n await this.investigate(entry);\n itemsProcessed++;\n } catch (err) {\n errors.push(`${entry.id}: ${(err as Error).message}`);\n log.error(\"investigation failed\", {\n id: entry.id,\n error: (err as Error).message,\n });\n }\n }\n\n return { itemsProcessed, errors };\n }\n\n // ---- investigation pipeline ----------------------------------------------\n\n private async investigate(entry: ErrorEntry): Promise<void> {\n this.registry.updateStatus(entry.id, \"investigating\");\n this.activeFixes.add(entry.id);\n this.cooldowns.set(entry.id, Date.now());\n\n try {\n // 1. Gather source context\n const sourceFiles = entry.stackTrace\n ? extractSourceFiles(entry.stackTrace, this.repoRoot)\n : [];\n\n const fileContents: Record<string, string> = {};\n for (const f of sourceFiles) {\n try {\n const content = readFileSync(f, \"utf-8\");\n // Limit to first 200 lines to keep prompt manageable\n fileContents[f] = content.split(\"\\n\").slice(0, 200).join(\"\\n\");\n } catch {\n // skip unreadable\n }\n }\n\n // 2. Diagnose via LLM (if available)\n if (this.llm) {\n const diagnosis = await this.diagnose(entry, fileContents);\n log.info(\"diagnosis complete\", {\n id: entry.id,\n diagnosis: diagnosis.slice(0, 200),\n });\n\n // 3. Attempt auto-PR if configured\n if (this.config.auto_pr && ghAvailable()) {\n await this.attemptFix(entry, diagnosis, fileContents);\n }\n } else {\n log.info(\"error detected (no LLM configured for diagnosis)\", {\n id: entry.id,\n message: entry.message.slice(0, 120),\n severity: entry.severity,\n sourceFiles,\n });\n }\n } finally {\n this.activeFixes.delete(entry.id);\n }\n }\n\n // ---- LLM diagnosis -------------------------------------------------------\n\n private async diagnose(\n entry: ErrorEntry,\n fileContents: Record<string, string>,\n ): Promise<string> {\n const fileSection = Object.entries(fileContents)\n .map(([path, content]) => `--- ${path} ---\\n${content}`)\n .join(\"\\n\\n\");\n\n const messages: ChatMessage[] = [\n {\n role: \"system\",\n content: [\n \"You are a senior software engineer diagnosing a bug in the Hivemind agent framework (TypeScript/Node.js).\",\n \"Analyze the error, identify the root cause, and suggest a concise fix.\",\n \"Be specific: reference exact lines, variables, and logic flows.\",\n \"If you cannot determine the cause from the given context, say so.\",\n ].join(\"\\n\"),\n },\n {\n role: \"user\",\n content: [\n `## Error`,\n `Message: ${entry.message}`,\n `Level: ${entry.level}`,\n `Source: ${entry.source}`,\n `Occurrences: ${entry.totalOccurrences}`,\n `First seen: ${entry.firstSeen}`,\n `Last seen: ${entry.lastSeen}`,\n entry.stackTrace ? `\\nStack trace:\\n${entry.stackTrace}` : \"\",\n fileSection ? `\\n## Source files\\n${fileSection}` : \"\",\n \"\\n## Task\",\n \"1. What is the root cause?\",\n \"2. What is the minimal fix?\",\n \"3. Are there any risks with the fix?\",\n ].join(\"\\n\"),\n },\n ];\n\n try {\n const response = await this.llm!.chat(messages);\n return response.content;\n } catch (err) {\n log.error(\"LLM diagnosis call failed\", {\n error: (err as Error).message,\n });\n return `Diagnosis failed: ${(err as Error).message}`;\n }\n }\n\n // ---- auto PR -------------------------------------------------------------\n\n private async attemptFix(\n entry: ErrorEntry,\n diagnosis: string,\n fileContents: Record<string, string>,\n ): Promise<void> {\n const shortId = entry.id.slice(0, 8);\n const branchName = `${this.config.branch_prefix}/${shortId}`;\n\n // Check if branch already exists\n if (run(`git rev-parse --verify ${branchName}`, this.repoRoot) !== null) {\n log.info(\"fix branch already exists, skipping\", { branch: branchName });\n return;\n }\n\n // Ask LLM for the actual code fix\n const fix = await this.generateFix(entry, diagnosis, fileContents);\n if (!fix) {\n log.info(\"LLM could not generate a fix\", { id: entry.id });\n return;\n }\n\n // Create branch\n const baseBranch = run(\"git rev-parse --abbrev-ref HEAD\", this.repoRoot) || \"main\";\n if (run(`git checkout -b ${branchName}`, this.repoRoot) === null) {\n log.error(\"failed to create fix branch\", { branch: branchName });\n return;\n }\n\n try {\n // Apply fix: write each patched file\n let anyApplied = false;\n for (const [filePath, newContent] of Object.entries(fix.files)) {\n try {\n require(\"fs\").writeFileSync(filePath, newContent);\n run(`git add \"${filePath}\"`, this.repoRoot);\n anyApplied = true;\n } catch (err) {\n log.warn(\"failed to write fix file\", {\n file: filePath,\n error: (err as Error).message,\n });\n }\n }\n\n if (!anyApplied) {\n log.info(\"no files were patched, aborting PR\", { id: entry.id });\n return;\n }\n\n // Verify build\n const buildResult = run(\"npx tsup\", this.repoRoot);\n if (buildResult === null) {\n log.warn(\"build failed after applying fix, aborting\", { id: entry.id });\n return;\n }\n\n // Commit\n const commitMsg = [\n `fix(auto-debug): ${fix.summary}`,\n \"\",\n `Error: ${entry.message}`,\n `Occurrences: ${entry.totalOccurrences} over ${this.formatTimespan(entry.firstSeen, entry.lastSeen)}`,\n `Source: ${entry.source}`,\n \"\",\n `Root cause: ${fix.rootCause}`,\n \"\",\n \"Auto-generated by hivemind auto-debug processor\",\n ].join(\"\\n\");\n\n if (run(`git commit -m \"${commitMsg.replace(/\"/g, '\\\\\"')}\"`, this.repoRoot) === null) {\n log.error(\"git commit failed\", { id: entry.id });\n return;\n }\n\n // Push\n if (run(`git push -u origin ${branchName}`, this.repoRoot) === null) {\n log.error(\"git push failed\", { id: entry.id });\n return;\n }\n\n // Open PR\n const prBody = this.buildPrBody(entry, diagnosis, fix);\n const prUrl = run(\n `gh pr create --base ${baseBranch} --head ${branchName} --title \"fix(auto-debug): ${fix.summary}\" --body \"${prBody.replace(/\"/g, '\\\\\"')}\"`,\n this.repoRoot,\n );\n\n if (prUrl) {\n this.registry.updateStatus(entry.id, \"fix-submitted\", prUrl);\n log.info(\"PR created\", { id: entry.id, prUrl });\n } else {\n log.error(\"gh pr create failed\", { id: entry.id });\n }\n } finally {\n // Return to original branch\n run(`git checkout ${baseBranch}`, this.repoRoot);\n }\n }\n\n private async generateFix(\n entry: ErrorEntry,\n diagnosis: string,\n fileContents: Record<string, string>,\n ): Promise<{ summary: string; rootCause: string; files: Record<string, string> } | null> {\n if (!this.llm) return null;\n\n const fileSection = Object.entries(fileContents)\n .map(([path, content]) => `--- ${path} ---\\n${content}`)\n .join(\"\\n\\n\");\n\n const messages: ChatMessage[] = [\n {\n role: \"system\",\n content: [\n \"You are a senior TypeScript engineer. Generate a minimal, safe code fix.\",\n \"Output ONLY valid JSON with this shape:\",\n '{ \"summary\": \"short commit subject\", \"rootCause\": \"one sentence\", \"files\": { \"/absolute/path.ts\": \"full file content\" } }',\n \"Do NOT include explanations outside the JSON. Do NOT modify files that don't need changing.\",\n \"If you cannot produce a reliable fix, return null.\",\n ].join(\"\\n\"),\n },\n {\n role: \"user\",\n content: [\n `## Error: ${entry.message}`,\n entry.stackTrace ? `\\nStack trace:\\n${entry.stackTrace}` : \"\",\n `\\n## Diagnosis\\n${diagnosis}`,\n `\\n## Current source files\\n${fileSection}`,\n \"\\nGenerate the fix JSON.\",\n ].join(\"\\n\"),\n },\n ];\n\n try {\n const response = await this.llm.chat(messages);\n const content = response.content.trim();\n\n // Handle LLM returning \"null\"\n if (content === \"null\" || content === \"null.\") return null;\n\n // Extract JSON from possible markdown code fence\n const jsonMatch = content.match(/```(?:json)?\\s*([\\s\\S]*?)```/) ||\n content.match(/(\\{[\\s\\S]*\\})/);\n if (!jsonMatch) return null;\n\n const parsed = JSON.parse(jsonMatch[1]);\n if (!parsed.summary || !parsed.files || Object.keys(parsed.files).length === 0) {\n return null;\n }\n\n // Validate all file paths are inside the repo\n for (const filePath of Object.keys(parsed.files)) {\n if (!filePath.startsWith(this.repoRoot)) {\n log.warn(\"fix targets file outside repo, rejecting\", { file: filePath });\n return null;\n }\n }\n\n return parsed;\n } catch (err) {\n log.error(\"failed to generate fix\", { error: (err as Error).message });\n return null;\n }\n }\n\n // ---- PR body builder -----------------------------------------------------\n\n private buildPrBody(\n entry: ErrorEntry,\n diagnosis: string,\n fix: { summary: string; rootCause: string },\n ): string {\n const logSample = entry.stackTrace\n ? sanitize(entry.stackTrace.split(\"\\n\").slice(0, 15).join(\"\\n\"))\n : sanitize(entry.message);\n\n return [\n \"## Auto-Debug Fix\",\n \"\",\n `**Error:** \\`${sanitize(entry.message).slice(0, 200)}\\``,\n `**Source:** ${entry.source}`,\n `**Frequency:** ${entry.totalOccurrences} occurrences over ${this.formatTimespan(entry.firstSeen, entry.lastSeen)}`,\n `**Severity:** ${entry.severity}/10`,\n \"\",\n \"### Diagnosis\",\n sanitize(diagnosis),\n \"\",\n \"### Fix\",\n sanitize(fix.rootCause),\n \"\",\n \"### Log Sample\",\n \"```\",\n logSample,\n \"```\",\n \"\",\n \"### Verification\",\n \"- [ ] Build passes (`tsup`)\",\n \"- [ ] Error no longer reproduces (monitored for 30 min post-deploy)\",\n \"\",\n \"---\",\n \"*Auto-generated by hivemind auto-debug processor. Review before merging.*\",\n ].join(\"\\n\");\n }\n\n // ---- utils ---------------------------------------------------------------\n\n private formatTimespan(firstSeen: string, lastSeen: string): string {\n const ms = new Date(lastSeen).getTime() - new Date(firstSeen).getTime();\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3_600_000) return `${Math.round(ms / 60_000)}m`;\n if (ms < 86_400_000) return `${Math.round(ms / 3_600_000)}h`;\n return `${Math.round(ms / 86_400_000)}d`;\n }\n}\n","import { createServer, type Server } from \"http\";\nimport { Agent } from \"./agent.js\";\nimport type { HivemindConfig } from \"./config.js\";\nimport { loadConfig, defaultSentinelConfig } from \"./config.js\";\nimport { SesameClient } from \"./sesame.js\";\nimport { MemoryClient } from \"./memory-client.js\";\nimport { HEALTH_PORT, HEALTH_PATH, type HealthStatus } from \"./health.js\";\nimport { RequestLogger } from \"./request-logger.js\";\nimport { startDashboardServer } from \"./dashboard.js\";\nimport { registerAllTools } from \"./tools/register.js\";\nimport { registerMessagingTools } from \"./tools/messaging.js\";\nimport { registerSkillsTools } from \"./tools/skills-tools.js\";\nimport type { ToolRegistry } from \"./tool-registry.js\";\nimport { SkillsEngine } from \"./skills.js\";\nimport { EventsWatcher } from \"./events.js\";\nimport { LogWatcher } from \"./processors/log-watcher.js\";\nimport { AutoDebugger } from \"./processors/auto-debugger.js\";\nimport { ProcessManager, type ProcessContext } from \"./memory/background-processor.js\";\nimport { readFileSync, writeFileSync, unlinkSync } from \"fs\";\nimport { resolve, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\n// Read version at module load time\nlet PACKAGE_VERSION = \"unknown\";\ntry {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkg = JSON.parse(readFileSync(resolve(__dirname, \"../package.json\"), \"utf-8\"));\n PACKAGE_VERSION = pkg.version ?? \"unknown\";\n} catch {\n // give up\n}\n\n// Track connection states for health endpoint\nlet sesameConnected = false;\nlet memoryConnected = false;\nconst startTime = Date.now();\n\nfunction startHealthServer(port: number): Server {\n const server = createServer((req, res) => {\n if (req.method === \"GET\" && req.url === HEALTH_PATH) {\n const status: HealthStatus = {\n status: sesameConnected ? \"ok\" : \"degraded\",\n pid: process.pid,\n uptime_s: Math.floor((Date.now() - startTime) / 1000),\n sesame_connected: sesameConnected,\n memory_connected: memoryConnected,\n version: PACKAGE_VERSION,\n };\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(status));\n } else {\n res.writeHead(404);\n res.end();\n }\n });\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n console.warn(`[hivemind] Health port ${port} in use — retrying in 2s`);\n setTimeout(() => {\n server.close();\n server.listen(port, \"127.0.0.1\");\n }, 2000);\n } else {\n console.error(\"[hivemind] Health server error:\", err.message);\n }\n });\n server.listen(port, \"127.0.0.1\", () => {\n console.log(`[hivemind] Health endpoint listening on http://127.0.0.1:${port}${HEALTH_PATH}`);\n });\n return server;\n}\n\nfunction writePidFile(path: string): void {\n writeFileSync(path, String(process.pid));\n console.log(`[hivemind] PID file written: ${path}`);\n}\n\nfunction cleanupPidFile(path: string): void {\n try {\n unlinkSync(path);\n } catch {\n // already gone\n }\n}\n\nexport async function startPipeline(configPath: string): Promise<void> {\n const config = loadConfig(configPath);\n\n // --- Spawn task mode: process a single task and exit ---\n if (process.env.SPAWN_TASK) {\n await runSpawnTask(config, configPath);\n return;\n }\n\n const sentinel = config.sentinel ?? defaultSentinelConfig();\n const healthPort = sentinel.health_port || HEALTH_PORT;\n const pidFile = sentinel.pid_file;\n\n console.log(`[hivemind] Starting ${config.agent.name} (pid ${process.pid})`);\n\n // Write PID file\n writePidFile(pidFile);\n\n // Start health server\n const healthServer = startHealthServer(healthPort);\n\n // Clean up on exit\n const cleanupOnExit = () => {\n cleanupPidFile(pidFile);\n healthServer.close();\n };\n process.on(\"exit\", cleanupOnExit);\n\n // Verify memory daemon is reachable\n const memory = new MemoryClient(config.memory);\n const memoryOk = await memory.healthCheck();\n if (!memoryOk) {\n console.warn(\"[hivemind] Memory daemon unreachable at\", config.memory.daemon_url);\n console.warn(\"[hivemind] Continuing without persistent memory — episodes will not be stored\");\n } else {\n memoryConnected = true;\n console.log(\"[hivemind] Memory daemon connected\");\n\n // Ensure global context is registered with the daemon\n try {\n await memory.createContext(\"global\", \"Global context — identity, preferences, cross-cutting knowledge\");\n console.log(\"[hivemind] Global context registered with memory daemon\");\n } catch {\n // Context may already exist — that's fine\n console.log(\"[hivemind] Global context already exists in memory daemon\");\n }\n }\n\n // Create request logger + dashboard (agent ref filled in after creation)\n const requestLogger = new RequestLogger(resolve(dirname(configPath), \"data\", \"dashboard.db\"));\n\n // Create the agent\n const agent = new Agent(config);\n\n // Start dashboard with L1 callback now that agent exists\n startDashboardServer(requestLogger, config.memory, () => agent.getConversationHistories());\n agent.setRequestLogger(requestLogger);\n\n // Register tools for agentic capabilities\n const hivemindHome = process.env.HIVEMIND_HOME || resolve(process.env.HOME || \"/root\", \"hivemind\");\n const toolRegistry = registerAllTools(hivemindHome, {\n enabled: true,\n workspace: config.agent.workspace || \"workspace\",\n braveApiKey: process.env.BRAVE_API_KEY,\n memoryDaemonUrl: config.memory.daemon_url,\n configPath,\n llmConfig: config.llm,\n });\n // Skills engine: load skills and register skill management tools\n const workspaceDir = resolve(hivemindHome, config.agent.workspace || \"workspace\");\n const skillsEngine = new SkillsEngine(workspaceDir, toolRegistry);\n await skillsEngine.loadAll();\n registerSkillsTools(toolRegistry, skillsEngine, workspaceDir);\n skillsEngine.startWatching();\n process.on(\"exit\", () => skillsEngine.stopWatching());\n\n agent.setToolRegistry(toolRegistry);\n console.log(`[hivemind] Context manager initialized (active: ${agent.getActiveContext()})`);\n\n // --- Auto-debug processor (opt-in) ---\n if (config.auto_debug?.enabled) {\n const dataDir = resolve(hivemindHome, \"data\");\n const autoDebugConfig = config.auto_debug;\n\n const logWatcher = new LogWatcher(\n {\n log_files: autoDebugConfig.log_files,\n severity_threshold: autoDebugConfig.severity_threshold,\n auto_pr: autoDebugConfig.auto_pr,\n repo: autoDebugConfig.repo,\n branch_prefix: autoDebugConfig.branch_prefix,\n max_concurrent_fixes: autoDebugConfig.max_concurrent_fixes,\n cooldown_minutes: autoDebugConfig.cooldown_minutes,\n notify_channel: autoDebugConfig.notify_channel,\n },\n dataDir,\n );\n\n const autoDebugger = new AutoDebugger(\n {\n severity_threshold: autoDebugConfig.severity_threshold,\n auto_pr: autoDebugConfig.auto_pr,\n repo: autoDebugConfig.repo,\n branch_prefix: autoDebugConfig.branch_prefix,\n max_concurrent_fixes: autoDebugConfig.max_concurrent_fixes,\n cooldown_minutes: autoDebugConfig.cooldown_minutes,\n },\n logWatcher.getRegistry(),\n config.llm,\n hivemindHome,\n );\n\n // Create a lightweight ProcessContext for background processors\n const bgContext: ProcessContext = {\n memoryClient: memory,\n workspacePath: hivemindHome,\n currentContext: \"auto-debug\",\n agentId: config.agent.name,\n sharedState: new Map(),\n };\n\n const processManager = new ProcessManager(bgContext);\n processManager.register(logWatcher);\n processManager.register(autoDebugger);\n processManager.start();\n process.on(\"exit\", () => processManager.stop());\n\n console.log(\"[hivemind] Auto-debug processors started\");\n }\n\n // Events watcher is started inside startSesameLoop (needs sesame client for sending)\n const dataDir = resolve(hivemindHome, \"data\");\n\n // Connect to Sesame if configured\n if (config.sesame.api_key) {\n await startSesameLoop(config, agent, toolRegistry, dataDir);\n } else {\n console.log(\"[hivemind] No Sesame API key configured — running in stdin mode\");\n await startStdinLoop(agent);\n }\n}\n\nasync function startSesameLoop(config: HivemindConfig, agent: Agent, toolRegistry: ToolRegistry, dataDir?: string): Promise<void> {\n const sesame = new SesameClient(config.sesame);\n\n // Register messaging tools now that we have the Sesame client\n registerMessagingTools(toolRegistry, sesame);\n\n // Start events watcher with Sesame send capability\n let eventsWatcher: EventsWatcher | null = null;\n if (dataDir) {\n eventsWatcher = new EventsWatcher(dataDir, async (channelId, text, filename, eventType) => {\n console.log(`[events] Firing ${eventType} event from ${filename}`);\n const eventMessage = `[EVENT:${filename}:${eventType}] ${text}`;\n try {\n const response = await agent.processMessage(eventMessage);\n if (response.content.trim() === \"[SILENT]\" || response.content.trim().startsWith(\"[SILENT]\")) {\n console.log(`[events] Silent response for ${filename}`);\n return;\n }\n if (response.content.trim() === \"__SKIP__\") return;\n if (channelId) {\n await sesame.sendMessage(channelId, response.content);\n }\n } catch (err) {\n console.error(`[events] Error processing event ${filename}:`, (err as Error).message);\n }\n });\n eventsWatcher.start();\n }\n\n // --- Graceful shutdown ---\n let shuttingDown = false;\n const shutdown = (signal: string) => {\n if (shuttingDown) return;\n shuttingDown = true;\n console.log(`\\n[hivemind] Received ${signal}, shutting down...`);\n try {\n sesame.updatePresence(\"offline\", { emoji: \"⭘\" });\n sesame.disconnect();\n console.log(\"[hivemind] Sesame disconnected cleanly\");\n } catch (err) {\n console.error(\"[hivemind] Error during disconnect:\", (err as Error).message);\n }\n process.exit(0);\n };\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n\n // --- Message queue and dedup ---\n const processedIds = new Set<string>();\n const MAX_SEEN = 500;\n let processing = false;\n const messageQueue: Array<typeof sesame extends { onMessage(h: (m: infer M) => any): any } ? M : any> = [];\n\n async function processQueue() {\n if (processing || messageQueue.length === 0) return;\n processing = true;\n\n while (messageQueue.length > 0) {\n const msg = messageQueue.shift()!;\n await handleMessage(msg);\n }\n\n processing = false;\n }\n\n sesame.onMessage(async (msg) => {\n if (shuttingDown) return;\n\n // Dedup: skip messages we've already processed\n if (processedIds.has(msg.id)) {\n console.log(`[sesame] Skipping duplicate message ${msg.id}`);\n return;\n }\n processedIds.add(msg.id);\n // Keep the set bounded\n if (processedIds.size > MAX_SEEN) {\n const iter = processedIds.values();\n for (let i = 0; i < 100; i++) iter.next();\n // Clear oldest entries\n const keep = new Set<string>();\n for (const id of processedIds) {\n if (keep.size >= MAX_SEEN - 100) break;\n keep.add(id);\n }\n processedIds.clear();\n for (const id of keep) processedIds.add(id);\n }\n\n // Queue the message and process sequentially\n messageQueue.push(msg);\n processQueue();\n });\n\n async function handleMessage(msg: any) {\n console.log(`[sesame] ${msg.author.handle} (${msg.channelKind}): ${msg.content}`);\n\n // Start typing indicator + set presence to thinking\n sesame.startTyping(msg.channelId);\n sesame.updatePresence(\"thinking\", { detail: `Replying to ${msg.author.handle}`, emoji: \"💭\" });\n\n try {\n // Prepend sender info so the agent knows who's talking\n const prefix = msg.channelKind === \"group\"\n ? `[${msg.author.handle} in group chat]: `\n : `[${msg.author.handle}]: `;\n const response = await agent.processMessage(prefix + msg.content);\n\n // Stop typing before sending reply\n sesame.stopTyping(msg.channelId);\n\n // Agent chose not to respond (group chat etiquette)\n if (response.content.trim() === \"__SKIP__\") {\n console.log(`[sesame] ${config.agent.name}: skipped (${msg.author.handle} in ${msg.channelKind})`);\n sesame.updatePresence(\"online\", { emoji: \"🟢\" });\n return;\n }\n\n // Silent response (events/periodic checks with nothing to report)\n if (response.content.trim() === \"[SILENT]\" || response.content.trim().startsWith(\"[SILENT]\")) {\n console.log(`[sesame] ${config.agent.name}: silent response`);\n sesame.updatePresence(\"online\", { emoji: \"🟢\" });\n return;\n }\n\n const ctxPrefix = response.contextSwitched\n ? `[switched to ${response.context}] `\n : \"\";\n // Strip self-referencing prefixes the LLM sometimes echoes back\n let content = response.content;\n const prefixPatterns = [\n `[${config.agent.name} in group chat]: `,\n `[${config.agent.name} in group chat]:`,\n `[${config.agent.name}]: `,\n `[${config.agent.name}]:`,\n ];\n for (const prefix of prefixPatterns) {\n if (content.startsWith(prefix)) {\n content = content.slice(prefix.length).trimStart();\n break;\n }\n }\n await sesame.sendMessage(msg.channelId, ctxPrefix + content);\n console.log(`[sesame] ${config.agent.name} (${response.context}): ${response.content.slice(0, 100)}...`);\n\n // Back to online\n sesame.updatePresence(\"online\", { emoji: \"🟢\" });\n } catch (err) {\n sesame.stopTyping(msg.channelId);\n sesame.updatePresence(\"online\", { emoji: \"🟢\" });\n console.error(\"[sesame] Error processing message:\", (err as Error).message);\n }\n }\n\n await sesame.connect();\n sesameConnected = true;\n console.log(\"[hivemind] Listening for Sesame messages\");\n\n // Keep alive\n await new Promise<void>(() => {});\n}\n\nasync function startStdinLoop(agent: Agent): Promise<void> {\n const readline = await import(\"readline\");\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n console.log(\"[hivemind] Ready. Type a message (Ctrl+C to exit)\");\n console.log(\"[hivemind] Commands: 'switch to <name>', 'list contexts', 'create context <name>'\\n\");\n\n rl.on(\"line\", async (line: string) => {\n const input = line.trim();\n if (!input) return;\n\n if (input.toLowerCase() === \"list contexts\") {\n const contexts = agent.getContextManager().listContexts();\n console.log(\"\\nContexts:\");\n for (const ctx of contexts) {\n const active = ctx.name === agent.getActiveContext() ? \" (active)\" : \"\";\n console.log(` - ${ctx.name}${active}: ${ctx.description || \"(no description)\"}`);\n }\n console.log();\n return;\n }\n\n const createMatch = input.match(/^create context (\\S+)\\s*(.*)?$/i);\n if (createMatch) {\n const name = createMatch[1];\n const desc = createMatch[2] || \"\";\n await agent.getContextManager().createContext(name, desc);\n console.log(`\\nCreated context: ${name}\\n`);\n return;\n }\n\n try {\n const response = await agent.processMessage(input);\n if (response.contextSwitched) {\n console.log(`\\n[switched to context: ${response.context}]`);\n }\n console.log(`\\n${response.content}\\n`);\n } catch (err) {\n console.error(\"Error:\", (err as Error).message);\n }\n });\n\n return new Promise((resolve) => {\n rl.on(\"close\", resolve);\n });\n}\n\n/**\n * Spawn task mode: lightweight single-task execution.\n * Skips health server, PID file, dashboard, events watcher, and Sesame loop.\n * Processes the task, writes the result, optionally sends to a Sesame channel, then exits.\n */\nasync function runSpawnTask(config: HivemindConfig, configPath: string): Promise<void> {\n const task = process.env.SPAWN_TASK!;\n const spawnId = process.env.SPAWN_ID || \"unknown\";\n const context = process.env.SPAWN_CONTEXT || `spawn-${spawnId.slice(0, 8)}`;\n const channelId = process.env.SPAWN_CHANNEL_ID;\n const spawnDir = process.env.SPAWN_DIR;\n\n console.log(`[spawn] Sub-agent starting (id: ${spawnId}, context: ${context})`);\n\n // Create agent with spawn context\n const agent = new Agent(config, context);\n\n // Register tools (sub-agents get the same tools as the parent)\n const hivemindHome = process.env.HIVEMIND_HOME || resolve(process.env.HOME || \"/root\", \"hivemind\");\n const toolRegistry = registerAllTools(hivemindHome, {\n enabled: true,\n workspace: config.agent.workspace || \"workspace\",\n braveApiKey: process.env.BRAVE_API_KEY,\n memoryDaemonUrl: config.memory.daemon_url,\n });\n agent.setToolRegistry(toolRegistry);\n\n try {\n // Process the single task\n const response = await agent.processMessage(task);\n const result = response.content;\n\n console.log(`[spawn] Task completed (context: ${response.context})`);\n\n // Write result to spawn directory\n if (spawnDir) {\n writeFileSync(resolve(spawnDir, \"result.txt\"), result);\n }\n\n // Send result to Sesame channel if requested\n if (channelId && config.sesame.api_key) {\n try {\n const sesame = new SesameClient(config.sesame);\n await sesame.connect();\n await sesame.sendMessage(channelId, result);\n sesame.disconnect();\n console.log(`[spawn] Result sent to channel ${channelId}`);\n } catch (err) {\n console.error(`[spawn] Failed to send result to channel:`, (err as Error).message);\n }\n }\n } catch (err) {\n const errorMsg = `[SPAWN ERROR] ${(err as Error).message}`;\n console.error(`[spawn] ${errorMsg}`);\n\n if (spawnDir) {\n writeFileSync(resolve(spawnDir, \"result.txt\"), errorMsg);\n }\n process.exitCode = 1;\n }\n}\n","export const HEALTH_PORT = 9484;\r\nexport const HEALTH_PATH = \"/health\";\r\n\r\nexport interface HealthStatus {\r\n status: \"ok\" | \"degraded\" | \"error\";\r\n pid: number;\r\n uptime_s: number;\r\n sesame_connected: boolean;\r\n memory_connected: boolean;\r\n version: string;\r\n}\r\n","import { randomUUID } from \"crypto\";\nimport { mkdirSync, existsSync, appendFileSync, readFileSync, writeFileSync } from \"fs\";\nimport { dirname } from \"path\";\n\nexport interface RequestLogEntry {\n context: string;\n contextSwitched: boolean;\n routingReason: string;\n channelId?: string;\n channelKind?: \"dm\" | \"group\";\n senderHandle?: string;\n rawMessage: string;\n systemPromptComponents: {\n identity: string;\n l3Knowledge: string[];\n l2Episodes: Array<{\n id: string;\n content: string;\n score: number;\n timestamp: string;\n context_name: string;\n role: string;\n }>;\n contextInfo: string;\n fullText: string;\n };\n conversationHistory: Array<{ role: string; content: string }>;\n userMessage: string;\n response: {\n content: string;\n model: string;\n latencyMs: number;\n skipped: boolean;\n };\n config: {\n topK: number;\n model: string;\n maxTokens: number;\n temperature: number;\n };\n}\n\nexport interface StoredRequest {\n id: string;\n timestamp: string;\n context: string;\n context_switched: boolean;\n routing_reason: string;\n channel_id: string;\n channel_kind: string;\n sender_handle: string;\n raw_message: string;\n system_prompt_components: string; // JSON\n conversation_history: string; // JSON\n user_message: string;\n response_content: string;\n response_model: string;\n response_latency_ms: number;\n response_skipped: boolean;\n config_snapshot: string; // JSON\n token_est_system: number;\n token_est_history: number;\n token_est_user: number;\n token_est_total: number;\n}\n\n/**\n * JSON Lines request logger — zero native dependencies.\n * Each line is a JSON object. Pruning removes entries older than 7 days.\n */\nexport class RequestLogger {\n private logPath: string;\n private maxAgeDays = 7;\n\n constructor(dbPath: string) {\n // Use .jsonl extension instead of .db\n this.logPath = dbPath.replace(/\\.db$/, \".jsonl\");\n if (this.logPath === dbPath) this.logPath = dbPath + \".jsonl\";\n\n const dir = dirname(this.logPath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n this.prune();\n }\n\n private prune(): void {\n if (!existsSync(this.logPath)) return;\n\n const cutoff = new Date(Date.now() - this.maxAgeDays * 24 * 60 * 60 * 1000).toISOString();\n try {\n const lines = readFileSync(this.logPath, \"utf-8\").split(\"\\n\").filter(Boolean);\n const kept: string[] = [];\n let pruned = 0;\n\n for (const line of lines) {\n try {\n const entry = JSON.parse(line);\n if (entry.timestamp >= cutoff) {\n kept.push(line);\n } else {\n pruned++;\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n if (pruned > 0) {\n writeFileSync(this.logPath, kept.join(\"\\n\") + (kept.length > 0 ? \"\\n\" : \"\"));\n console.log(`[dashboard] Pruned ${pruned} old request logs`);\n }\n } catch {\n // File doesn't exist or can't be read — that's fine\n }\n }\n\n log(entry: RequestLogEntry): string {\n const id = randomUUID();\n const timestamp = new Date().toISOString();\n\n const sysTokens = Math.ceil(entry.systemPromptComponents.fullText.length / 4);\n const histTokens = Math.ceil(\n entry.conversationHistory.reduce((sum, m) => sum + m.content.length, 0) / 4,\n );\n const userTokens = Math.ceil(entry.userMessage.length / 4);\n\n const record: StoredRequest = {\n id,\n timestamp,\n context: entry.context,\n context_switched: entry.contextSwitched,\n routing_reason: entry.routingReason,\n channel_id: entry.channelId ?? \"\",\n channel_kind: entry.channelKind ?? \"\",\n sender_handle: entry.senderHandle ?? \"\",\n raw_message: entry.rawMessage,\n system_prompt_components: JSON.stringify(entry.systemPromptComponents),\n conversation_history: JSON.stringify(entry.conversationHistory),\n user_message: entry.userMessage,\n response_content: entry.response.content,\n response_model: entry.response.model,\n response_latency_ms: entry.response.latencyMs,\n response_skipped: entry.response.skipped,\n config_snapshot: JSON.stringify(entry.config),\n token_est_system: sysTokens,\n token_est_history: histTokens,\n token_est_user: userTokens,\n token_est_total: sysTokens + histTokens + userTokens,\n };\n\n appendFileSync(this.logPath, JSON.stringify(record) + \"\\n\");\n return id;\n }\n\n getRequests(opts: {\n limit?: number;\n offset?: number;\n context?: string;\n sender?: string;\n } = {}): { requests: StoredRequest[]; total: number } {\n const limit = opts.limit ?? 50;\n const offset = opts.offset ?? 0;\n\n let entries = this.readAll();\n\n if (opts.context) {\n entries = entries.filter((e) => e.context === opts.context);\n }\n if (opts.sender) {\n entries = entries.filter((e) => e.sender_handle === opts.sender);\n }\n\n // Sort newest first\n entries.sort((a, b) => b.timestamp.localeCompare(a.timestamp));\n\n const total = entries.length;\n const requests = entries.slice(offset, offset + limit);\n\n return { requests, total };\n }\n\n getRequest(id: string): StoredRequest | undefined {\n return this.readAll().find((e) => e.id === id);\n }\n\n close(): void {\n // No-op for file-based logger\n }\n\n private readAll(): StoredRequest[] {\n if (!existsSync(this.logPath)) return [];\n\n try {\n const lines = readFileSync(this.logPath, \"utf-8\").split(\"\\n\").filter(Boolean);\n const entries: StoredRequest[] = [];\n for (const line of lines) {\n try {\n entries.push(JSON.parse(line));\n } catch {\n // Skip malformed\n }\n }\n return entries;\n } catch {\n return [];\n }\n }\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"http\";\nimport { readFileSync } from \"fs\";\nimport { resolve, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport type { RequestLogger } from \"./request-logger.js\";\nimport type { MemoryConfig } from \"./config.js\";\nimport type { ChatMessage } from \"./llm-client.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst DASHBOARD_PORT = 9485;\n\nlet spaHtml: string | null = null;\n\nfunction getSpaHtml(): string {\n if (!spaHtml) {\n // Try dist/ first (built), then src/ (dev)\n for (const dir of [__dirname, resolve(__dirname, \"../src\")]) {\n try {\n spaHtml = readFileSync(resolve(dir, \"dashboard.html\"), \"utf-8\");\n break;\n } catch {\n // continue\n }\n }\n if (!spaHtml) spaHtml = \"<h1>Dashboard HTML not found</h1>\";\n }\n return spaHtml;\n}\n\nfunction json(res: ServerResponse, data: unknown, status = 200): void {\n res.writeHead(status, {\n \"Content-Type\": \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.end(JSON.stringify(data));\n}\n\nfunction parseQuery(url: string): Record<string, string> {\n const idx = url.indexOf(\"?\");\n if (idx === -1) return {};\n const params: Record<string, string> = {};\n for (const pair of url.slice(idx + 1).split(\"&\")) {\n const [k, v] = pair.split(\"=\");\n if (k) params[decodeURIComponent(k)] = decodeURIComponent(v ?? \"\");\n }\n return params;\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString()));\n req.on(\"error\", reject);\n });\n}\n\nasync function proxyMemory(\n memoryUrl: string,\n path: string,\n method: string,\n res: ServerResponse,\n body?: string,\n): Promise<void> {\n try {\n const opts: RequestInit = { method };\n if (body && (method === \"POST\" || method === \"PATCH\" || method === \"PUT\")) {\n opts.body = body;\n opts.headers = { \"Content-Type\": \"application/json\" };\n }\n const resp = await fetch(`${memoryUrl}${path}`, opts);\n const respBody = await resp.text();\n res.writeHead(resp.status, {\n \"Content-Type\": resp.headers.get(\"content-type\") ?? \"application/json\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.end(respBody);\n } catch (err) {\n json(res, { error: (err as Error).message }, 502);\n }\n}\n\nexport type GetL1Callback = () => Map<string, ChatMessage[]>;\n\nexport function startDashboardServer(\n requestLogger: RequestLogger,\n memoryConfig: MemoryConfig,\n getL1?: GetL1Callback,\n): void {\n const memoryUrl = memoryConfig.daemon_url;\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const method = req.method ?? \"GET\";\n const rawUrl = req.url ?? \"/\";\n const urlPath = rawUrl.split(\"?\")[0];\n const queryStr = rawUrl.includes(\"?\") ? rawUrl.slice(rawUrl.indexOf(\"?\")) : \"\";\n\n // CORS preflight\n if (method === \"OPTIONS\") {\n res.writeHead(204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, POST, PATCH, DELETE, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type\",\n });\n res.end();\n return;\n }\n\n try {\n // SPA\n if (method === \"GET\" && urlPath === \"/\") {\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(getSpaHtml());\n return;\n }\n\n // Request logs API\n if (method === \"GET\" && urlPath === \"/api/requests\") {\n const q = parseQuery(rawUrl);\n const result = requestLogger.getRequests({\n limit: q.limit ? parseInt(q.limit, 10) : undefined,\n offset: q.offset ? parseInt(q.offset, 10) : undefined,\n context: q.context || undefined,\n sender: q.sender || undefined,\n });\n json(res, result);\n return;\n }\n\n const reqDetailMatch = urlPath.match(/^\\/api\\/requests\\/([^/]+)$/);\n if (method === \"GET\" && reqDetailMatch) {\n const entry = requestLogger.getRequest(reqDetailMatch[1]);\n if (!entry) {\n json(res, { error: \"Not found\" }, 404);\n } else {\n json(res, entry);\n }\n return;\n }\n\n // --- Health & Stats proxies ---\n\n if (method === \"GET\" && urlPath === \"/api/health\") {\n await proxyMemory(memoryUrl, \"/health\", \"GET\", res);\n return;\n }\n\n if (method === \"GET\" && urlPath === \"/api/stats\") {\n await proxyMemory(memoryUrl, \"/stats\", \"GET\", res);\n return;\n }\n\n // --- Search proxies ---\n\n if (method === \"GET\" && urlPath === \"/api/search\") {\n await proxyMemory(memoryUrl, `/search${queryStr}`, \"GET\", res);\n return;\n }\n\n if (method === \"GET\" && urlPath === \"/api/search/cross-context\") {\n await proxyMemory(memoryUrl, `/search/cross-context${queryStr}`, \"GET\", res);\n return;\n }\n\n // --- Context proxies ---\n\n if (method === \"GET\" && urlPath === \"/api/contexts\") {\n await proxyMemory(memoryUrl, \"/contexts\", \"GET\", res);\n return;\n }\n\n // Delete context\n const ctxDeleteMatch = urlPath.match(/^\\/api\\/contexts\\/([^/]+)$/);\n if (method === \"DELETE\" && ctxDeleteMatch) {\n const name = decodeURIComponent(ctxDeleteMatch[1]);\n await proxyMemory(memoryUrl, `/contexts/${encodeURIComponent(name)}`, \"DELETE\", res);\n return;\n }\n\n // Context episodes\n const episodesMatch = urlPath.match(/^\\/api\\/contexts\\/([^/]+)\\/episodes$/);\n if (method === \"GET\" && episodesMatch) {\n const name = decodeURIComponent(episodesMatch[1]);\n await proxyMemory(memoryUrl, `/contexts/${encodeURIComponent(name)}`, \"GET\", res);\n return;\n }\n\n // Context L3\n const l3Match = urlPath.match(/^\\/api\\/contexts\\/([^/]+)\\/l3$/);\n if (method === \"GET\" && l3Match) {\n const name = decodeURIComponent(l3Match[1]);\n await proxyMemory(\n memoryUrl,\n `/promotion/l3?context=${encodeURIComponent(name)}`,\n \"GET\",\n res,\n );\n return;\n }\n\n // Context scoring GET\n const scoringGetMatch = urlPath.match(/^\\/api\\/contexts\\/([^/]+)\\/scoring$/);\n if (method === \"GET\" && scoringGetMatch) {\n const name = decodeURIComponent(scoringGetMatch[1]);\n await proxyMemory(memoryUrl, `/scoring/${encodeURIComponent(name)}`, \"GET\", res);\n return;\n }\n\n // Context scoring POST\n if (method === \"POST\" && scoringGetMatch) {\n const name = decodeURIComponent(scoringGetMatch[1]);\n const body = await readBody(req);\n await proxyMemory(memoryUrl, `/contexts/${encodeURIComponent(name)}/scoring`, \"POST\", res, body);\n return;\n }\n\n // --- L3 CRUD ---\n\n const l3IdMatch = urlPath.match(/^\\/api\\/l3\\/([^/]+)$/);\n if (method === \"DELETE\" && l3IdMatch) {\n const id = decodeURIComponent(l3IdMatch[1]);\n await proxyMemory(memoryUrl, `/promotion/l3/${encodeURIComponent(id)}`, \"DELETE\", res);\n return;\n }\n\n if (method === \"PATCH\" && l3IdMatch) {\n const id = decodeURIComponent(l3IdMatch[1]);\n const body = await readBody(req);\n await proxyMemory(memoryUrl, `/promotion/l3/${encodeURIComponent(id)}`, \"PATCH\", res, body);\n return;\n }\n\n // --- Promotion ---\n\n if (method === \"POST\" && urlPath === \"/api/promotion/run\") {\n await proxyMemory(memoryUrl, `/promotion/run${queryStr}`, \"POST\", res);\n return;\n }\n\n // --- Access tracking ---\n\n if (method === \"GET\" && urlPath === \"/api/access/top\") {\n await proxyMemory(memoryUrl, `/access/top${queryStr}`, \"GET\", res);\n return;\n }\n\n const accessMatch = urlPath.match(/^\\/api\\/episodes\\/([^/]+)\\/access$/);\n if (method === \"GET\" && accessMatch) {\n const id = decodeURIComponent(accessMatch[1]);\n await proxyMemory(memoryUrl, `/access/${encodeURIComponent(id)}`, \"GET\", res);\n return;\n }\n\n // --- L1 History ---\n\n if (method === \"GET\" && urlPath === \"/api/l1\") {\n if (!getL1) {\n json(res, { contexts: {} });\n return;\n }\n const histories = getL1();\n const result: Record<string, { count: number }> = {};\n for (const [ctx, msgs] of histories) {\n result[ctx] = { count: msgs.length };\n }\n json(res, { contexts: result });\n return;\n }\n\n const l1CtxMatch = urlPath.match(/^\\/api\\/l1\\/([^/]+)$/);\n if (method === \"GET\" && l1CtxMatch) {\n if (!getL1) {\n json(res, { messages: [] });\n return;\n }\n const ctx = decodeURIComponent(l1CtxMatch[1]);\n const histories = getL1();\n const messages = histories.get(ctx) || [];\n json(res, { messages: messages.map(m => ({ role: m.role, content: m.content ?? \"\" })) });\n return;\n }\n\n // 404\n json(res, { error: \"Not found\" }, 404);\n } catch (err) {\n console.error(\"[dashboard] Request error:\", (err as Error).message);\n json(res, { error: \"Internal server error\" }, 500);\n }\n });\n\n server.listen(DASHBOARD_PORT, \"127.0.0.1\", () => {\n console.log(\n `[hivemind] Dashboard listening on http://127.0.0.1:${DASHBOARD_PORT}`,\n );\n });\n}\n","export interface ToolDefinition {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>; // JSON Schema\n };\n}\n\nexport interface ToolCall {\n id: string;\n type: \"function\";\n function: {\n name: string;\n arguments: string; // JSON string\n };\n}\n\nexport interface ToolResult {\n tool_call_id: string;\n role: \"tool\";\n content: string;\n}\n\nexport type ToolExecutor = (params: Record<string, unknown>) => Promise<string>;\n\ninterface RegisteredTool {\n definition: ToolDefinition;\n executor: ToolExecutor;\n}\n\nexport class ToolRegistry {\n private tools: Map<string, RegisteredTool> = new Map();\n\n register(\n name: string,\n description: string,\n parameters: Record<string, unknown>,\n executor: ToolExecutor,\n ): void {\n this.tools.set(name, {\n definition: {\n type: \"function\",\n function: { name, description, parameters },\n },\n executor,\n });\n }\n\n getDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((t) => t.definition);\n }\n\n has(name: string): boolean {\n return this.tools.has(name);\n }\n\n unregister(name: string): boolean {\n return this.tools.delete(name);\n }\n\n async execute(name: string, params: Record<string, unknown>): Promise<string> {\n const tool = this.tools.get(name);\n if (!tool) {\n return `Error: Unknown tool \"${name}\"`;\n }\n\n try {\n return await tool.executor(params);\n } catch (err) {\n return `Error executing ${name}: ${(err as Error).message}`;\n }\n }\n\n async executeCall(call: ToolCall): Promise<ToolResult> {\n let params: Record<string, unknown> = {};\n try {\n const raw = call.function.arguments;\n params = raw && raw.trim() ? JSON.parse(raw) : {};\n } catch {\n return {\n tool_call_id: call.id,\n role: \"tool\",\n content: `Error: Invalid JSON arguments for ${call.function.name}`,\n };\n }\n\n const result = await this.execute(call.function.name, params);\n return {\n tool_call_id: call.id,\n role: \"tool\",\n content: result,\n };\n }\n}\n","import { execSync } from \"child_process\";\nimport { resolve } from \"path\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\nconst MAX_OUTPUT = 50_000; // chars\n\nexport function registerShellTool(registry: ToolRegistry, workspaceDir: string): void {\n registry.register(\n \"shell\",\n \"Execute a shell command and return stdout/stderr. Use for running programs, checking status, installing packages, git operations, etc.\",\n {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"The shell command to execute\",\n },\n workdir: {\n type: \"string\",\n description: \"Working directory (relative to workspace). Defaults to workspace root.\",\n },\n timeout: {\n type: \"number\",\n description: \"Timeout in seconds. Default: 30\",\n },\n },\n required: [\"command\"],\n },\n async (params) => {\n const command = params.command as string;\n const timeout = ((params.timeout as number) || 30) * 1000;\n const cwd = params.workdir\n ? resolve(workspaceDir, params.workdir as string)\n : workspaceDir;\n\n try {\n const output = execSync(command, {\n cwd,\n timeout,\n encoding: \"utf-8\",\n maxBuffer: 10 * 1024 * 1024, // 10MB\n shell: \"/bin/sh\",\n env: { ...process.env, PATH: `${process.env.HOME || '/root'}/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:${process.env.PATH}` },\n });\n\n const trimmed = output.length > MAX_OUTPUT\n ? output.slice(0, MAX_OUTPUT) + `\\n... (truncated, ${output.length} total chars)`\n : output;\n\n return trimmed || \"(no output)\";\n } catch (err: any) {\n const stderr = err.stderr?.toString() || \"\";\n const stdout = err.stdout?.toString() || \"\";\n const output = (stdout + \"\\n\" + stderr).trim();\n const code = err.status ?? \"unknown\";\n return `Command failed (exit code ${code}):\\n${output || err.message}`;\n }\n },\n );\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\nimport { resolve, dirname } from \"path\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\nconst MAX_READ = 100_000; // chars\n\nexport function registerFileTools(registry: ToolRegistry, workspaceDir: string): void {\n // --- read_file ---\n registry.register(\n \"read_file\",\n \"Read the contents of a file. Returns the text content. Use offset/limit for large files.\",\n {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"File path (relative to workspace or absolute)\",\n },\n offset: {\n type: \"number\",\n description: \"Line number to start reading from (1-indexed)\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of lines to read\",\n },\n },\n required: [\"path\"],\n },\n async (params) => {\n const filePath = resolvePath(workspaceDir, params.path as string);\n\n if (!existsSync(filePath)) {\n return `Error: File not found: ${filePath}`;\n }\n\n try {\n let content = readFileSync(filePath, \"utf-8\");\n\n if (params.offset || params.limit) {\n const lines = content.split(\"\\n\");\n const start = ((params.offset as number) || 1) - 1;\n const end = params.limit ? start + (params.limit as number) : lines.length;\n content = lines.slice(start, end).join(\"\\n\");\n }\n\n if (content.length > MAX_READ) {\n content = content.slice(0, MAX_READ) + `\\n... (truncated, ${content.length} total chars)`;\n }\n\n return content || \"(empty file)\";\n } catch (err) {\n return `Error reading file: ${(err as Error).message}`;\n }\n },\n );\n\n // --- write_file ---\n registry.register(\n \"write_file\",\n \"Write content to a file. Creates the file and parent directories if they don't exist. Overwrites existing content.\",\n {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"File path (relative to workspace or absolute)\",\n },\n content: {\n type: \"string\",\n description: \"Content to write to the file\",\n },\n },\n required: [\"path\", \"content\"],\n },\n async (params) => {\n const filePath = resolvePath(workspaceDir, params.path as string);\n\n try {\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(filePath, params.content as string);\n return `Written ${(params.content as string).length} bytes to ${filePath}`;\n } catch (err) {\n return `Error writing file: ${(err as Error).message}`;\n }\n },\n );\n\n // --- edit_file ---\n registry.register(\n \"edit_file\",\n \"Edit a file by finding and replacing exact text. The old text must match exactly (including whitespace).\",\n {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"File path (relative to workspace or absolute)\",\n },\n old_text: {\n type: \"string\",\n description: \"Exact text to find and replace\",\n },\n new_text: {\n type: \"string\",\n description: \"New text to replace with\",\n },\n },\n required: [\"path\", \"old_text\", \"new_text\"],\n },\n async (params) => {\n const filePath = resolvePath(workspaceDir, params.path as string);\n\n if (!existsSync(filePath)) {\n return `Error: File not found: ${filePath}`;\n }\n\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const oldText = params.old_text as string;\n const newText = params.new_text as string;\n\n if (!content.includes(oldText)) {\n return `Error: Could not find the exact text to replace in ${filePath}`;\n }\n\n const updated = content.replace(oldText, newText);\n writeFileSync(filePath, updated);\n return `Edited ${filePath}: replaced ${oldText.length} chars with ${newText.length} chars`;\n } catch (err) {\n return `Error editing file: ${(err as Error).message}`;\n }\n },\n );\n\n // --- list_files ---\n registry.register(\n \"list_files\",\n \"List files and directories in a path.\",\n {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Directory path (relative to workspace or absolute). Defaults to workspace root.\",\n },\n },\n required: [],\n },\n async (params) => {\n const { readdirSync, statSync } = await import(\"fs\");\n const dirPath = params.path\n ? resolvePath(workspaceDir, params.path as string)\n : workspaceDir;\n\n if (!existsSync(dirPath)) {\n return `Error: Directory not found: ${dirPath}`;\n }\n\n try {\n const entries = readdirSync(dirPath);\n const results: string[] = [];\n for (const entry of entries) {\n if (entry.startsWith(\".\")) continue; // skip hidden\n try {\n const stat = statSync(resolve(dirPath, entry));\n results.push(stat.isDirectory() ? `${entry}/` : entry);\n } catch {\n results.push(entry);\n }\n }\n return results.join(\"\\n\") || \"(empty directory)\";\n } catch (err) {\n return `Error listing directory: ${(err as Error).message}`;\n }\n },\n );\n}\n\nfunction resolvePath(workspace: string, path: string): string {\n if (path.startsWith(\"/\") || path.startsWith(\"~\")) {\n return path.replace(/^~/, process.env.HOME || \"/root\");\n }\n return resolve(workspace, path);\n}\n","import type { ToolRegistry } from \"../tool-registry.js\";\n\nexport function registerWebTools(registry: ToolRegistry, config?: { braveApiKey?: string }): void {\n // --- web_search ---\n registry.register(\n \"web_search\",\n \"Search the web using Brave Search API. Returns titles, URLs, and snippets.\",\n {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query string\",\n },\n count: {\n type: \"number\",\n description: \"Number of results (1-10, default 5)\",\n },\n },\n required: [\"query\"],\n },\n async (params) => {\n const apiKey = config?.braveApiKey || process.env.BRAVE_API_KEY;\n if (!apiKey) {\n return \"Error: No Brave Search API key configured. Set BRAVE_API_KEY env var.\";\n }\n\n const query = params.query as string;\n const count = Math.min(Math.max((params.count as number) || 5, 1), 10);\n\n try {\n const url = `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=${count}`;\n const resp = await fetch(url, {\n headers: { \"X-Subscription-Token\": apiKey, Accept: \"application/json\" },\n });\n\n if (!resp.ok) {\n return `Search failed: ${resp.status} ${await resp.text()}`;\n }\n\n const data = (await resp.json()) as {\n web?: { results: Array<{ title: string; url: string; description: string }> };\n };\n\n const results = data.web?.results || [];\n if (results.length === 0) return \"No results found.\";\n\n return results\n .map((r, i) => `${i + 1}. **${r.title}**\\n ${r.url}\\n ${r.description}`)\n .join(\"\\n\\n\");\n } catch (err) {\n return `Search error: ${(err as Error).message}`;\n }\n },\n );\n\n // --- web_fetch ---\n registry.register(\n \"web_fetch\",\n \"Fetch a URL and extract readable content as markdown/text. Good for reading articles, docs, and web pages.\",\n {\n type: \"object\",\n properties: {\n url: {\n type: \"string\",\n description: \"HTTP or HTTPS URL to fetch\",\n },\n max_chars: {\n type: \"number\",\n description: \"Maximum characters to return (default 20000)\",\n },\n },\n required: [\"url\"],\n },\n async (params) => {\n const url = params.url as string;\n const maxChars = (params.max_chars as number) || 20_000;\n\n try {\n const resp = await fetch(url, {\n headers: {\n \"User-Agent\": \"Hivemind/1.0 (Agent Web Fetcher)\",\n Accept: \"text/html,application/xhtml+xml,text/plain,application/json\",\n },\n redirect: \"follow\",\n });\n\n if (!resp.ok) {\n return `Fetch failed: ${resp.status} ${resp.statusText}`;\n }\n\n let text = await resp.text();\n\n // Basic HTML → text extraction (strip tags, decode entities)\n const contentType = resp.headers.get(\"content-type\") || \"\";\n if (contentType.includes(\"html\")) {\n // Remove script/style blocks\n text = text.replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, \"\");\n text = text.replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, \"\");\n // Strip tags\n text = text.replace(/<[^>]+>/g, \" \");\n // Decode common entities\n text = text.replace(/&amp;/g, \"&\").replace(/&lt;/g, \"<\").replace(/&gt;/g, \">\");\n text = text.replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\").replace(/&nbsp;/g, \" \");\n // Collapse whitespace\n text = text.replace(/\\s+/g, \" \").trim();\n }\n\n if (text.length > maxChars) {\n text = text.slice(0, maxChars) + `\\n... (truncated, ${text.length} total chars)`;\n }\n\n return text || \"(empty response)\";\n } catch (err) {\n return `Fetch error: ${(err as Error).message}`;\n }\n },\n );\n}\n","import type { ToolRegistry } from \"../tool-registry.js\";\n\n/**\n * Memory tools — direct access to the Hivemind memory daemon.\n * These let the agent introspect and query its own memory system.\n */\nexport function registerMemoryTools(registry: ToolRegistry, daemonUrl: string): void {\n // --- memory_search ---\n registry.register(\n \"memory_search\",\n \"Search your episodic memory for relevant past conversations and experiences. Returns scored results from your memory system. Use this when you want to recall something from a previous conversation or check what you know about a topic.\",\n {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"What to search for in memory\",\n },\n context: {\n type: \"string\",\n description: \"Context to search in (default: current active context)\",\n },\n top_k: {\n type: \"number\",\n description: \"Number of results to return (default: 10)\",\n },\n },\n required: [\"query\"],\n },\n async (params) => {\n const query = params.query as string;\n const context = (params.context as string) || \"global\";\n const topK = (params.top_k as number) || 10;\n\n try {\n const searchParams = new URLSearchParams({ q: query, context, limit: String(topK) });\n const resp = await fetch(`${daemonUrl}/search?${searchParams}`);\n\n if (!resp.ok) return `Memory search failed: ${resp.status}`;\n\n const data = (await resp.json()) as {\n episodes: Array<{\n id: string;\n content: string;\n role: string;\n context_name: string;\n score: number;\n timestamp: string;\n }>;\n };\n\n if (!data.episodes?.length) return `No memories found for \"${query}\" in context \"${context}\".`;\n\n return data.episodes\n .map((r, i) => `${i + 1}. [score: ${r.score.toFixed(3)}] [${r.context_name}] [${r.role}] ${r.content.slice(0, 200)}`)\n .join(\"\\n\");\n } catch (err) {\n return `Memory daemon unreachable: ${(err as Error).message}`;\n }\n },\n );\n\n // --- memory_stats ---\n registry.register(\n \"memory_stats\",\n \"Get statistics about your memory system — episode counts, contexts, L3 knowledge entries. Use for self-diagnosis or understanding your memory state.\",\n {\n type: \"object\",\n properties: {},\n required: [],\n },\n async () => {\n try {\n // Health check\n const healthResp = await fetch(`${daemonUrl}/health`);\n const health = healthResp.ok ? await healthResp.json() as Record<string, unknown> : { status: \"unreachable\" };\n\n // Contexts\n const ctxResp = await fetch(`${daemonUrl}/contexts`);\n const contexts = ctxResp.ok\n ? ((await ctxResp.json()) as { contexts: Array<{ name: string; episode_count: number }> }).contexts\n : [];\n\n // L3 knowledge counts per context\n const l3Counts: Record<string, number> = {};\n for (const ctx of contexts) {\n try {\n const l3Resp = await fetch(`${daemonUrl}/promotion/l3?context=${encodeURIComponent(ctx.name)}`);\n if (l3Resp.ok) {\n const l3Data = (await l3Resp.json()) as { entries: unknown[] };\n l3Counts[ctx.name] = l3Data.entries?.length ?? 0;\n }\n } catch {}\n }\n\n const totalEpisodes = contexts.reduce((sum, c) => sum + c.episode_count, 0);\n const totalL3 = Object.values(l3Counts).reduce((sum, c) => sum + c, 0);\n\n let output = `Memory Daemon: ${(health as any).status || \"unknown\"}\\n`;\n output += `Total Episodes (L2): ${totalEpisodes}\\n`;\n output += `Total Knowledge (L3): ${totalL3}\\n`;\n output += `\\nContexts:\\n`;\n for (const ctx of contexts) {\n output += ` - ${ctx.name}: ${ctx.episode_count} episodes, ${l3Counts[ctx.name] ?? 0} L3 entries\\n`;\n }\n\n return output;\n } catch (err) {\n return `Memory daemon unreachable: ${(err as Error).message}`;\n }\n },\n );\n\n // --- memory_l3 ---\n registry.register(\n \"memory_l3\",\n \"View your promoted L3 knowledge — high-level patterns, decisions, and insights that have been distilled from your episodic memories. This is your 'long-term wisdom'.\",\n {\n type: \"object\",\n properties: {\n context: {\n type: \"string\",\n description: \"Context to get L3 knowledge for (default: global)\",\n },\n },\n required: [],\n },\n async (params) => {\n const context = (params.context as string) || \"global\";\n\n try {\n const resp = await fetch(`${daemonUrl}/promotion/l3?context=${encodeURIComponent(context)}`);\n if (!resp.ok) return `L3 query failed: ${resp.status}`;\n\n const data = (await resp.json()) as {\n entries: Array<{ content: string; source_episodes: number; created_at: string }>;\n };\n\n if (!data.entries?.length) return `No L3 knowledge in context \"${context}\".`;\n\n return data.entries\n .map((e, i) => `${i + 1}. ${e.content} (from ${e.source_episodes} episodes, ${e.created_at})`)\n .join(\"\\n\");\n } catch (err) {\n return `Memory daemon unreachable: ${(err as Error).message}`;\n }\n },\n );\n\n // --- memory_cross_search ---\n registry.register(\n \"memory_cross_search\",\n \"Search across ALL memory contexts at once. Useful when you're not sure which context a memory belongs to.\",\n {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"What to search for across all contexts\",\n },\n top_k: {\n type: \"number\",\n description: \"Number of results (default: 10)\",\n },\n },\n required: [\"query\"],\n },\n async (params) => {\n const query = params.query as string;\n const topK = (params.top_k as number) || 10;\n\n try {\n const crossParams = new URLSearchParams({ q: query, limit: String(topK) });\n const resp = await fetch(`${daemonUrl}/search/cross-context?${crossParams}`);\n\n if (!resp.ok) return `Cross-context search failed: ${resp.status}`;\n\n const data = (await resp.json()) as {\n results: Array<{ context: string; episodes: Array<{ content: string; role: string; score: number }> }>;\n };\n\n // Flatten grouped results\n const flat: Array<{ content: string; role: string; context_name: string; score: number }> = [];\n for (const group of data.results || []) {\n for (const ep of group.episodes) {\n flat.push({ ...ep, context_name: group.context });\n }\n }\n\n if (!flat.length) return `No memories found across any context for \"${query}\".`;\n\n // Sort by score descending\n flat.sort((a, b) => b.score - a.score);\n\n return flat\n .map((r, i) => `${i + 1}. [${r.score.toFixed(3)}] [${r.context_name}] ${r.content.slice(0, 200)}`)\n .join(\"\\n\");\n } catch (err) {\n return `Memory daemon unreachable: ${(err as Error).message}`;\n }\n },\n );\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\nimport type { HivemindEvent } from \"../events.js\";\n\n/**\n * Event tools — let the agent create, list, and delete scheduled events.\n * Wraps the existing file-based EventsWatcher system.\n */\nexport function registerEventTools(registry: ToolRegistry, dataDir: string): void {\n const eventsDir = join(dataDir, \"events\");\n\n // Ensure events directory exists\n if (!existsSync(eventsDir)) {\n mkdirSync(eventsDir, { recursive: true });\n }\n\n // --- create_event ---\n registry.register(\n \"create_event\",\n \"Create a scheduled event. Immediate events fire right away. One-shot events fire at a specific time. Periodic events fire on a cron schedule. The event will trigger a message to the specified Sesame channel.\",\n {\n type: \"object\",\n properties: {\n type: {\n type: \"string\",\n enum: [\"immediate\", \"one-shot\", \"periodic\"],\n description: \"Event type: 'immediate' fires now, 'one-shot' fires at a specific time, 'periodic' fires on a cron schedule\",\n },\n channelId: {\n type: \"string\",\n description: \"Sesame channel ID to send the event result to\",\n },\n text: {\n type: \"string\",\n description: \"The prompt/message for the event\",\n },\n at: {\n type: \"string\",\n description: \"ISO 8601 datetime for one-shot events (e.g. '2026-03-01T15:00:00Z')\",\n },\n schedule: {\n type: \"string\",\n description: \"Cron expression for periodic events (e.g. '0 9 * * 1-5' for weekdays at 9am)\",\n },\n timezone: {\n type: \"string\",\n description: \"IANA timezone for periodic events (default: 'UTC')\",\n },\n },\n required: [\"type\", \"channelId\", \"text\"],\n },\n async (params) => {\n const type = params.type as string;\n const channelId = params.channelId as string;\n const text = params.text as string;\n\n // Validate type-specific required fields\n if (type === \"one-shot\" && !params.at) {\n return \"Error: 'at' parameter is required for one-shot events (ISO 8601 datetime)\";\n }\n if (type === \"periodic\" && !params.schedule) {\n return \"Error: 'schedule' parameter is required for periodic events (cron expression)\";\n }\n\n let event: HivemindEvent;\n switch (type) {\n case \"immediate\":\n event = { type: \"immediate\", channelId, text };\n break;\n case \"one-shot\":\n event = { type: \"one-shot\", channelId, text, at: params.at as string };\n break;\n case \"periodic\":\n event = {\n type: \"periodic\",\n channelId,\n text,\n schedule: params.schedule as string,\n timezone: (params.timezone as string) || \"UTC\",\n };\n break;\n default:\n return `Error: Unknown event type '${type}'. Use 'immediate', 'one-shot', or 'periodic'.`;\n }\n\n const filename = `${randomUUID()}.json`;\n const filePath = join(eventsDir, filename);\n\n try {\n writeFileSync(filePath, JSON.stringify(event, null, 2));\n return `Event created: ${filename} (type: ${type})`;\n } catch (err) {\n return `Error creating event: ${(err as Error).message}`;\n }\n },\n );\n\n // --- list_events ---\n registry.register(\n \"list_events\",\n \"List all scheduled events with their type and configuration.\",\n {\n type: \"object\",\n properties: {},\n required: [],\n },\n async () => {\n try {\n if (!existsSync(eventsDir)) {\n return \"No events directory found.\";\n }\n\n const files = readdirSync(eventsDir).filter((f) => f.endsWith(\".json\"));\n if (files.length === 0) {\n return \"No events scheduled.\";\n }\n\n const lines: string[] = [];\n for (const file of files) {\n try {\n const content = readFileSync(join(eventsDir, file), \"utf-8\");\n const event: HivemindEvent = JSON.parse(content);\n let detail = `${file} — type: ${event.type}, channel: ${event.channelId}`;\n if (event.type === \"one-shot\") {\n detail += `, at: ${event.at}`;\n } else if (event.type === \"periodic\") {\n detail += `, schedule: ${event.schedule}, tz: ${event.timezone}`;\n }\n detail += `, text: \"${event.text.slice(0, 80)}${event.text.length > 80 ? \"...\" : \"\"}\"`;\n lines.push(detail);\n } catch {\n lines.push(`${file} — (unreadable)`);\n }\n }\n\n return `${files.length} event(s):\\n${lines.join(\"\\n\")}`;\n } catch (err) {\n return `Error listing events: ${(err as Error).message}`;\n }\n },\n );\n\n // --- delete_event ---\n registry.register(\n \"delete_event\",\n \"Delete a scheduled event by filename.\",\n {\n type: \"object\",\n properties: {\n filename: {\n type: \"string\",\n description: \"The event filename to delete (e.g. 'abc123.json')\",\n },\n },\n required: [\"filename\"],\n },\n async (params) => {\n const filename = params.filename as string;\n const filePath = join(eventsDir, filename);\n\n // Prevent path traversal\n if (filename.includes(\"/\") || filename.includes(\"\\\\\") || filename.includes(\"..\")) {\n return \"Error: Invalid filename.\";\n }\n\n if (!existsSync(filePath)) {\n return `Event not found: ${filename}`;\n }\n\n try {\n unlinkSync(filePath);\n return `Event deleted: ${filename}`;\n } catch (err) {\n return `Error deleting event: ${(err as Error).message}`;\n }\n },\n );\n}\n","import { spawn, type ChildProcess } from \"child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\ninterface SpawnedAgent {\n pid: number;\n context: string;\n task: string;\n channelId?: string;\n startTime: number;\n process: ChildProcess;\n exitCode: number | null;\n exited: boolean;\n}\n\nconst spawnedAgents = new Map<string, SpawnedAgent>();\n\n/**\n * Spawn tools — let the agent fork isolated sub-agent processes for\n * parallel or long-running work. Each sub-agent gets its own context\n * and processes a single task, then exits.\n */\nexport function registerSpawnTools(\n registry: ToolRegistry,\n hivemindHome: string,\n dataDir: string,\n configPath: string,\n): void {\n const spawnDir = join(dataDir, \"spawn\");\n if (!existsSync(spawnDir)) {\n mkdirSync(spawnDir, { recursive: true });\n }\n\n // Resolve the hivemind binary\n const hivemindBin = resolve(hivemindHome, \"node_modules\", \".bin\", \"hivemind\");\n\n // --- spawn_agent ---\n registry.register(\n \"spawn_agent\",\n \"Fork a new hivemind process to run an isolated task. The sub-agent gets its own context, processes the task, and exits. Use for parallel work, long-running tasks, or tasks that need isolation.\",\n {\n type: \"object\",\n properties: {\n task: {\n type: \"string\",\n description: \"The prompt/instruction for the sub-agent to process\",\n },\n context: {\n type: \"string\",\n description: \"Context name for the sub-agent (default: 'spawn-<uuid>')\",\n },\n channelId: {\n type: \"string\",\n description: \"Sesame channel ID to post results to when done\",\n },\n timeoutSeconds: {\n type: \"number\",\n description: \"Timeout in seconds (default: 300)\",\n },\n },\n required: [\"task\"],\n },\n async (params) => {\n const task = params.task as string;\n const spawnId = randomUUID();\n const context = (params.context as string) || `spawn-${spawnId.slice(0, 8)}`;\n const channelId = params.channelId as string | undefined;\n const timeoutSeconds = (params.timeoutSeconds as number) || 300;\n\n // Create spawn workspace\n const spawnWorkDir = join(spawnDir, spawnId);\n mkdirSync(spawnWorkDir, { recursive: true });\n\n // Write the task for reference\n writeFileSync(join(spawnWorkDir, \"task.md\"), task);\n\n // Build env for the child process\n const childEnv: Record<string, string> = {\n ...process.env as Record<string, string>,\n SPAWN_TASK: task,\n SPAWN_ID: spawnId,\n SPAWN_CONTEXT: context,\n SPAWN_DIR: spawnWorkDir,\n // Disable health server and PID file for spawned agents\n SENTINEL_HEALTH_PORT: \"0\",\n SENTINEL_PID_FILE: join(spawnWorkDir, \".pid\"),\n };\n if (channelId) {\n childEnv.SPAWN_CHANNEL_ID = channelId;\n }\n\n try {\n const child = spawn(hivemindBin, [\"start\", \"--config\", configPath], {\n env: childEnv,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: false,\n });\n\n if (!child.pid) {\n return `Error: Failed to spawn sub-agent process`;\n }\n\n // Capture stdout/stderr to log file\n const logPath = join(spawnWorkDir, \"output.log\");\n const logChunks: Buffer[] = [];\n child.stdout?.on(\"data\", (chunk: Buffer) => logChunks.push(chunk));\n child.stderr?.on(\"data\", (chunk: Buffer) => logChunks.push(chunk));\n\n const agent: SpawnedAgent = {\n pid: child.pid,\n context,\n task,\n channelId,\n startTime: Date.now(),\n process: child,\n exitCode: null,\n exited: false,\n };\n spawnedAgents.set(spawnId, agent);\n\n // Handle exit\n child.on(\"exit\", (code) => {\n agent.exitCode = code;\n agent.exited = true;\n // Write captured output to log file\n try {\n writeFileSync(logPath, Buffer.concat(logChunks).toString(\"utf-8\"));\n } catch {\n // best effort\n }\n });\n\n // Set timeout\n const timer = setTimeout(() => {\n if (!agent.exited) {\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // already gone\n }\n agent.exited = true;\n agent.exitCode = -1;\n try {\n writeFileSync(\n join(spawnWorkDir, \"result.txt\"),\n `[TIMEOUT] Sub-agent killed after ${timeoutSeconds}s`,\n );\n } catch {\n // best effort\n }\n }\n }, timeoutSeconds * 1000);\n\n // Clean up timer if process exits before timeout\n child.on(\"exit\", () => clearTimeout(timer));\n\n return [\n `Sub-agent spawned successfully.`,\n ` ID: ${spawnId}`,\n ` PID: ${child.pid}`,\n ` Context: ${context}`,\n ` Timeout: ${timeoutSeconds}s`,\n channelId ? ` Channel: ${channelId}` : null,\n ` Log: ${logPath}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n } catch (err) {\n return `Error spawning sub-agent: ${(err as Error).message}`;\n }\n },\n );\n\n // --- list_agents ---\n registry.register(\n \"list_agents\",\n \"List all spawned sub-agent processes with their status (running/completed/failed/timeout).\",\n {\n type: \"object\",\n properties: {},\n required: [],\n },\n async () => {\n if (spawnedAgents.size === 0) {\n return \"No spawned agents.\";\n }\n\n const lines: string[] = [];\n for (const [id, agent] of spawnedAgents) {\n const runtime = Math.floor((Date.now() - agent.startTime) / 1000);\n let status: string;\n if (!agent.exited) {\n status = \"running\";\n } else if (agent.exitCode === 0) {\n status = \"completed\";\n } else if (agent.exitCode === -1) {\n status = \"timeout\";\n } else {\n status = `failed (exit ${agent.exitCode})`;\n }\n\n const taskPreview =\n agent.task.length > 80 ? agent.task.slice(0, 80) + \"...\" : agent.task;\n\n let detail = `${id} — status: ${status}, pid: ${agent.pid}, context: ${agent.context}, runtime: ${runtime}s`;\n if (agent.channelId) detail += `, channel: ${agent.channelId}`;\n detail += `\\n task: \"${taskPreview}\"`;\n\n // If completed, try to show result preview\n if (agent.exited) {\n const resultPath = join(spawnDir, id, \"result.txt\");\n if (existsSync(resultPath)) {\n try {\n const result = readFileSync(resultPath, \"utf-8\");\n const preview =\n result.length > 200 ? result.slice(0, 200) + \"...\" : result;\n detail += `\\n result: \"${preview}\"`;\n } catch {\n // skip\n }\n }\n }\n\n lines.push(detail);\n }\n\n return `${spawnedAgents.size} agent(s):\\n${lines.join(\"\\n\\n\")}`;\n },\n );\n\n // --- kill_agent ---\n registry.register(\n \"kill_agent\",\n \"Kill a spawned sub-agent process by its ID.\",\n {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"The spawn ID of the agent to kill\",\n },\n },\n required: [\"id\"],\n },\n async (params) => {\n const id = params.id as string;\n const agent = spawnedAgents.get(id);\n\n if (!agent) {\n return `Error: No spawned agent found with ID ${id}`;\n }\n\n if (agent.exited) {\n return `Agent ${id} has already exited (code ${agent.exitCode})`;\n }\n\n try {\n agent.process.kill(\"SIGTERM\");\n agent.exited = true;\n agent.exitCode = -2; // killed by parent\n writeFileSync(\n join(spawnDir, id, \"result.txt\"),\n `[KILLED] Sub-agent killed by parent agent`,\n );\n return `Agent ${id} (pid ${agent.pid}) killed`;\n } catch (err) {\n return `Error killing agent ${id}: ${(err as Error).message}`;\n }\n },\n );\n}\n","import type { ToolRegistry } from \"../tool-registry.js\";\n\n/**\n * Vision tools — analyze images using a vision-capable LLM via OpenRouter.\n */\nexport function registerVisionTools(registry: ToolRegistry): void {\n const apiKey = process.env.LLM_API_KEY;\n\n registry.register(\n \"analyze_image\",\n \"Analyze an image using a vision-capable LLM. Accepts an image URL or base64 data URI. Returns a text description/analysis of the image.\",\n {\n type: \"object\",\n properties: {\n image: {\n type: \"string\",\n description: \"URL to the image, or a base64 data URI (e.g. 'data:image/png;base64,...')\",\n },\n prompt: {\n type: \"string\",\n description: \"What to analyze about the image (default: 'Describe this image in detail')\",\n },\n },\n required: [\"image\"],\n },\n async (params) => {\n const key = apiKey || process.env.LLM_API_KEY;\n if (!key) {\n return \"Error: No LLM_API_KEY configured. Set LLM_API_KEY env var for vision analysis.\";\n }\n\n const image = params.image as string;\n const prompt = (params.prompt as string) || \"Describe this image in detail\";\n\n if (!image) {\n return \"Error: 'image' parameter is required (URL or base64 data URI).\";\n }\n\n try {\n const resp = await fetch(\"https://openrouter.ai/api/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Authorization\": `Bearer ${key}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"anthropic/claude-sonnet-4-20250514\",\n messages: [\n {\n role: \"user\",\n content: [\n { type: \"image_url\", image_url: { url: image } },\n { type: \"text\", text: prompt },\n ],\n },\n ],\n }),\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n return `Vision API error (${resp.status}): ${body}`;\n }\n\n const data = (await resp.json()) as {\n choices?: Array<{ message?: { content?: string } }>;\n error?: { message?: string };\n };\n\n if (data.error) {\n return `Vision API error: ${data.error.message}`;\n }\n\n const content = data.choices?.[0]?.message?.content;\n if (!content) {\n return \"Error: No response content from vision model.\";\n }\n\n return content;\n } catch (err) {\n return `Vision analysis error: ${(err as Error).message}`;\n }\n },\n );\n}\n","import { execSync } from \"child_process\";\nimport { resolve, normalize } from \"path\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\nconst MAX_OUTPUT = 50_000; // chars\n\n/**\n * Resolve and validate a repo path. Prevents traversal outside workspace.\n */\nfunction resolveRepoPath(workspaceDir: string, repoPath?: string): string {\n if (!repoPath) return workspaceDir;\n const resolved = resolve(workspaceDir, repoPath);\n const normalizedResolved = normalize(resolved);\n const normalizedWorkspace = normalize(workspaceDir);\n if (!normalizedResolved.startsWith(normalizedWorkspace)) {\n throw new Error(\"Path traversal detected: repoPath must be within the workspace.\");\n }\n return resolved;\n}\n\nfunction runGit(args: string, cwd: string): string {\n const output = execSync(`git ${args}`, {\n cwd,\n timeout: 30_000,\n encoding: \"utf-8\",\n maxBuffer: 10 * 1024 * 1024,\n env: { ...process.env, PATH: `/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:${process.env.PATH}` },\n });\n return output;\n}\n\n/**\n * Git tools — structured git operations that reduce token waste vs raw shell output.\n */\nexport function registerGitTools(registry: ToolRegistry, workspaceDir: string): void {\n // --- git_status ---\n registry.register(\n \"git_status\",\n \"Get repository status: modified, staged, and untracked files in a structured format.\",\n {\n type: \"object\",\n properties: {\n repoPath: {\n type: \"string\",\n description: \"Path to the git repository (relative to workspace). Defaults to workspace root.\",\n },\n },\n required: [],\n },\n async (params) => {\n try {\n const cwd = resolveRepoPath(workspaceDir, params.repoPath as string | undefined);\n const output = runGit(\"status --porcelain\", cwd);\n\n if (!output.trim()) {\n return \"Working tree clean — no changes.\";\n }\n\n const staged: string[] = [];\n const modified: string[] = [];\n const untracked: string[] = [];\n\n for (const line of output.split(\"\\n\")) {\n if (!line.trim()) continue;\n const index = line[0];\n const worktree = line[1];\n const file = line.slice(3);\n\n if (index === \"?\" && worktree === \"?\") {\n untracked.push(file);\n } else {\n if (index !== \" \" && index !== \"?\") staged.push(`${index} ${file}`);\n if (worktree !== \" \" && worktree !== \"?\") modified.push(`${worktree} ${file}`);\n }\n }\n\n const sections: string[] = [];\n if (staged.length) sections.push(`Staged (${staged.length}):\\n${staged.join(\"\\n\")}`);\n if (modified.length) sections.push(`Modified (${modified.length}):\\n${modified.join(\"\\n\")}`);\n if (untracked.length) sections.push(`Untracked (${untracked.length}):\\n${untracked.join(\"\\n\")}`);\n\n return sections.join(\"\\n\\n\");\n } catch (err) {\n return `git_status error: ${(err as Error).message}`;\n }\n },\n );\n\n // --- git_diff ---\n registry.register(\n \"git_diff\",\n \"Show changes in the working directory or between commits. Returns a diff output.\",\n {\n type: \"object\",\n properties: {\n repoPath: {\n type: \"string\",\n description: \"Path to the git repository (relative to workspace). Defaults to workspace root.\",\n },\n target: {\n type: \"string\",\n description: \"Diff target: a branch name, commit hash, or ref like 'HEAD~1' or 'main'.\",\n },\n staged: {\n type: \"boolean\",\n description: \"If true, show staged changes (--staged). Default: false.\",\n },\n },\n required: [],\n },\n async (params) => {\n try {\n const cwd = resolveRepoPath(workspaceDir, params.repoPath as string | undefined);\n const args: string[] = [\"diff\"];\n if (params.staged) args.push(\"--staged\");\n if (params.target) args.push(params.target as string);\n\n let output = runGit(args.join(\" \"), cwd);\n\n if (!output.trim()) {\n return \"No changes.\";\n }\n\n if (output.length > 20_000) {\n output = output.slice(0, 20_000) + `\\n... (truncated, ${output.length} total chars)`;\n }\n\n return output;\n } catch (err) {\n return `git_diff error: ${(err as Error).message}`;\n }\n },\n );\n\n // --- git_commit ---\n registry.register(\n \"git_commit\",\n \"Stage and commit changes to the git repository.\",\n {\n type: \"object\",\n properties: {\n message: {\n type: \"string\",\n description: \"The commit message.\",\n },\n repoPath: {\n type: \"string\",\n description: \"Path to the git repository (relative to workspace). Defaults to workspace root.\",\n },\n all: {\n type: \"boolean\",\n description: \"If true, stage all tracked changes (-a). Default: false.\",\n },\n files: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Specific files to stage before committing.\",\n },\n },\n required: [\"message\"],\n },\n async (params) => {\n try {\n const cwd = resolveRepoPath(workspaceDir, params.repoPath as string | undefined);\n const message = params.message as string;\n const files = params.files as string[] | undefined;\n\n // Stage specific files if provided\n if (files && files.length > 0) {\n const fileArgs = files.map((f) => `\"${f.replace(/\"/g, '\\\\\"')}\"`).join(\" \");\n runGit(`add ${fileArgs}`, cwd);\n }\n\n // Build commit command\n const commitArgs = [\"commit\"];\n if (params.all) commitArgs.push(\"-a\");\n commitArgs.push(\"-m\", `\"${message.replace(/\"/g, '\\\\\"')}\"`);\n\n const output = runGit(commitArgs.join(\" \"), cwd);\n\n // Extract short summary from git commit output\n const firstLine = output.split(\"\\n\")[0] || \"\";\n return `Committed: ${firstLine.trim()}`;\n } catch (err: any) {\n const stderr = err.stderr?.toString() || \"\";\n const stdout = err.stdout?.toString() || \"\";\n return `git_commit error: ${(stdout + \"\\n\" + stderr).trim() || err.message}`;\n }\n },\n );\n\n // --- git_log ---\n registry.register(\n \"git_log\",\n \"Show recent commit history in a concise one-line-per-commit format.\",\n {\n type: \"object\",\n properties: {\n repoPath: {\n type: \"string\",\n description: \"Path to the git repository (relative to workspace). Defaults to workspace root.\",\n },\n count: {\n type: \"number\",\n description: \"Number of recent commits to show (default: 10).\",\n },\n },\n required: [],\n },\n async (params) => {\n try {\n const cwd = resolveRepoPath(workspaceDir, params.repoPath as string | undefined);\n const count = Math.min(Math.max((params.count as number) || 10, 1), 100);\n\n const output = runGit(`log --oneline -n ${count}`, cwd);\n\n if (!output.trim()) {\n return \"No commits found.\";\n }\n\n return output.trim();\n } catch (err) {\n return `git_log error: ${(err as Error).message}`;\n }\n },\n );\n\n // --- git_push ---\n registry.register(\n \"git_push\",\n \"Push commits to a remote repository.\",\n {\n type: \"object\",\n properties: {\n repoPath: {\n type: \"string\",\n description: \"Path to the git repository (relative to workspace). Defaults to workspace root.\",\n },\n remote: {\n type: \"string\",\n description: \"Remote name (default: 'origin').\",\n },\n branch: {\n type: \"string\",\n description: \"Branch to push. Defaults to the current branch.\",\n },\n },\n required: [],\n },\n async (params) => {\n try {\n const cwd = resolveRepoPath(workspaceDir, params.repoPath as string | undefined);\n const remote = (params.remote as string) || \"origin\";\n const args = [\"push\", remote];\n\n if (params.branch) {\n args.push(params.branch as string);\n }\n\n const output = runGit(args.join(\" \"), cwd);\n return `Push successful.${output.trim() ? \"\\n\" + output.trim() : \"\"}`;\n } catch (err: any) {\n const stderr = err.stderr?.toString() || \"\";\n const stdout = err.stdout?.toString() || \"\";\n const combined = (stdout + \"\\n\" + stderr).trim();\n // git push writes progress to stderr even on success\n if (err.status === 0 || combined.includes(\"->\")) {\n return `Push successful.\\n${combined}`;\n }\n return `git_push error: ${combined || err.message}`;\n }\n },\n );\n}\n","import { resolve } from \"path\";\nimport { mkdirSync, existsSync } from \"fs\";\nimport { randomUUID } from \"crypto\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\nconst MAX_OUTPUT = 50_000; // chars\n\n// ---------------------------------------------------------------------------\n// Enhanced browser lifecycle with session persistence and advanced features\n// ---------------------------------------------------------------------------\n\nlet browserInstance: any = null;\nlet contextInstances: Map<string, any> = new Map();\nlet lastUsed = 0;\nlet idleTimer: ReturnType<typeof setInterval> | null = null;\n\nconst IDLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\n\ninterface BrowserOptions {\n session?: string;\n viewport?: { width: number; height: number };\n userAgent?: string;\n locale?: string;\n timezone?: string;\n deviceScaleFactor?: number;\n isMobile?: boolean;\n hasTouch?: boolean;\n colorScheme?: 'light' | 'dark' | 'no-preference';\n reducedMotion?: 'reduce' | 'no-preference';\n permissions?: string[];\n geolocation?: { latitude: number; longitude: number };\n offline?: boolean;\n downloadBehavior?: 'allow' | 'deny';\n}\n\nasync function getBrowser(): Promise<any> {\n try {\n const modName = \"playwright\";\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pw: any = await (Function('m', 'return import(m)')(modName));\n if (!browserInstance) {\n browserInstance = await pw.chromium.launch({ \n headless: true,\n args: [\n '--disable-dev-shm-usage',\n '--disable-setuid-sandbox',\n '--no-sandbox',\n '--disable-web-security',\n '--disable-features=VizDisplayCompositor'\n ]\n });\n // Start idle-check interval when browser is first created\n if (!idleTimer) {\n idleTimer = setInterval(async () => {\n if (browserInstance && Date.now() - lastUsed > IDLE_TIMEOUT_MS) {\n await closeBrowser();\n }\n }, 60_000); // check every minute\n }\n }\n lastUsed = Date.now();\n return browserInstance;\n } catch {\n throw new Error(\n \"Playwright is not installed. Run:\\n npm install playwright\\n npx playwright install chromium\",\n );\n }\n}\n\nasync function getBrowserContext(sessionId: string = 'default', options: BrowserOptions = {}): Promise<any> {\n const browser = await getBrowser();\n \n if (!contextInstances.has(sessionId)) {\n const contextOptions: any = {\n userAgent: options.userAgent || \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36\",\n viewport: options.viewport || { width: 1280, height: 720 },\n locale: options.locale || 'en-US',\n timezoneId: options.timezone || 'America/New_York',\n deviceScaleFactor: options.deviceScaleFactor || 1,\n isMobile: options.isMobile || false,\n hasTouch: options.hasTouch || false,\n colorScheme: options.colorScheme || 'light',\n reducedMotion: options.reducedMotion || 'no-preference',\n permissions: options.permissions || [],\n geolocation: options.geolocation,\n offline: options.offline || false,\n acceptDownloads: options.downloadBehavior !== 'deny'\n };\n\n const context = await browser.newContext(contextOptions);\n \n // Enable request/response interception for debugging\n context.on('request', (request: any) => {\n console.log(`→ ${request.method()} ${request.url()}`);\n });\n \n context.on('response', (response: any) => {\n console.log(`← ${response.status()} ${response.url()}`);\n });\n\n contextInstances.set(sessionId, context);\n }\n \n return contextInstances.get(sessionId);\n}\n\nasync function closeBrowser(): Promise<void> {\n // Close all contexts first\n for (const [sessionId, context] of contextInstances) {\n try {\n await context.close();\n } catch {\n // already closed\n }\n }\n contextInstances.clear();\n\n if (browserInstance) {\n try {\n await browserInstance.close();\n } catch {\n // already closed\n }\n browserInstance = null;\n }\n if (idleTimer) {\n clearInterval(idleTimer);\n idleTimer = null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Tool registration\n// ---------------------------------------------------------------------------\n\nexport function registerBrowserTools(registry: ToolRegistry, workspaceDir: string): void {\n const screenshotDir = resolve(workspaceDir, \"screenshots\");\n\n registry.register(\n \"browse\",\n [\n \"Navigate to a URL and interact with the page using an enhanced headless browser with session persistence.\",\n \"Actions:\",\n \" extract (default) — get the readable text content of the page\",\n \" screenshot — take a PNG screenshot and return the file path\",\n \" click — click an element matching a CSS selector\",\n \" type — type text into an element matching a CSS selector\",\n \" evaluate — run arbitrary JavaScript in the page and return the result\",\n \" form_fill — fill out a form with multiple fields at once\",\n \" scroll — scroll the page (up, down, to element, or to coordinates)\",\n \" hover — hover over an element\",\n \" select — select an option from a dropdown\",\n \" upload — upload a file to a file input\",\n \" download — download a file and return the path\",\n \" pdf — generate a PDF of the page\",\n \" wait_for — wait for various conditions (selector, text, url, timeout)\",\n \" network_logs — get network request/response logs\",\n \" console_logs — get browser console logs\",\n \" cookies — get/set/clear cookies\",\n \" storage — get/set/clear localStorage/sessionStorage\",\n \"Supports session persistence, mobile simulation, and advanced browser features.\",\n ].join(\"\\n\"),\n {\n type: \"object\",\n properties: {\n url: {\n type: \"string\",\n description: \"URL to navigate to.\",\n },\n action: {\n type: \"string\",\n enum: [\n \"extract\", \"screenshot\", \"click\", \"type\", \"evaluate\", \n \"form_fill\", \"scroll\", \"hover\", \"select\", \"upload\", \n \"download\", \"pdf\", \"wait_for\", \"network_logs\", \n \"console_logs\", \"cookies\", \"storage\"\n ],\n description: \"Action to perform (default: extract).\",\n },\n selector: {\n type: \"string\",\n description: \"CSS selector for element-based actions.\",\n },\n text: {\n type: \"string\",\n description: \"Text to type or search for.\",\n },\n javascript: {\n type: \"string\",\n description: \"JavaScript to evaluate in the page (for 'evaluate' action).\",\n },\n formData: {\n type: \"object\",\n description: \"Key-value pairs for form filling (selector: value).\",\n },\n scrollDirection: {\n type: \"string\",\n enum: [\"up\", \"down\", \"left\", \"right\", \"top\", \"bottom\"],\n description: \"Scroll direction or position.\",\n },\n scrollDistance: {\n type: \"number\",\n description: \"Pixels to scroll (default: 500).\",\n },\n coordinates: {\n type: \"object\",\n properties: {\n x: { type: \"number\" },\n y: { type: \"number\" }\n },\n description: \"X,Y coordinates for scrolling or clicking.\",\n },\n filePath: {\n type: \"string\",\n description: \"Path to file for upload action.\",\n },\n waitCondition: {\n type: \"string\",\n enum: [\"selector\", \"text\", \"url\", \"timeout\", \"networkidle\"],\n description: \"What to wait for.\",\n },\n waitValue: {\n type: \"string\",\n description: \"Value to wait for (selector, text, URL pattern).\",\n },\n cookieData: {\n type: \"object\",\n description: \"Cookie data for cookie operations.\",\n },\n storageData: {\n type: \"object\",\n description: \"Storage data for localStorage/sessionStorage operations.\",\n },\n session: {\n type: \"string\",\n description: \"Session ID for persistent browser context (default: 'default').\",\n },\n viewport: {\n type: \"object\",\n properties: {\n width: { type: \"number\" },\n height: { type: \"number\" }\n },\n description: \"Browser viewport size.\",\n },\n userAgent: {\n type: \"string\",\n description: \"Custom user agent string.\",\n },\n mobile: {\n type: \"boolean\",\n description: \"Simulate mobile device.\",\n },\n waitForSelector: {\n type: \"string\",\n description: \"CSS selector to wait for before performing the action.\",\n },\n timeout: {\n type: \"number\",\n description: \"Timeout in milliseconds (default: 30000).\",\n },\n },\n required: [\"url\"],\n },\n async (params) => {\n const url = params.url as string;\n const action = (params.action as string) || \"extract\";\n const selector = params.selector as string | undefined;\n const text = params.text as string | undefined;\n const javascript = params.javascript as string | undefined;\n const formData = params.formData as Record<string, string> | undefined;\n const scrollDirection = params.scrollDirection as string | undefined;\n const scrollDistance = (params.scrollDistance as number) || 500;\n const coordinates = params.coordinates as { x: number; y: number } | undefined;\n const filePath = params.filePath as string | undefined;\n const waitCondition = params.waitCondition as string | undefined;\n const waitValue = params.waitValue as string | undefined;\n const cookieData = params.cookieData as any | undefined;\n const storageData = params.storageData as Record<string, any> | undefined;\n const sessionId = (params.session as string) || 'default';\n const viewport = params.viewport as { width: number; height: number } | undefined;\n const userAgent = params.userAgent as string | undefined;\n const mobile = params.mobile as boolean | undefined;\n const waitForSelector = params.waitForSelector as string | undefined;\n const timeout = (params.timeout as number) || 30_000;\n\n let context: any;\n let page: any;\n \n try {\n const browserOptions: BrowserOptions = {\n session: sessionId,\n viewport,\n userAgent,\n isMobile: mobile,\n hasTouch: mobile\n };\n \n context = await getBrowserContext(sessionId, browserOptions);\n page = await context.newPage();\n page.setDefaultTimeout(timeout);\n\n // Navigate to URL\n await page.goto(url, { waitUntil: \"domcontentloaded\", timeout });\n\n // Wait for selector if specified\n if (waitForSelector) {\n await page.waitForSelector(waitForSelector, { timeout });\n }\n\n // Execute the requested action\n switch (action) {\n case \"extract\": {\n const content: string = await page.evaluate(() => {\n // Strip script/style tags, then get text\n const clone = document.body.cloneNode(true) as HTMLElement;\n clone.querySelectorAll(\"script, style, noscript\").forEach((el) => el.remove());\n return clone.innerText || clone.textContent || \"\";\n });\n const trimmed = content.length > MAX_OUTPUT\n ? content.slice(0, MAX_OUTPUT) + `\\n... (truncated, ${content.length} total chars)`\n : content;\n return trimmed;\n }\n\n case \"screenshot\": {\n if (!existsSync(screenshotDir)) {\n mkdirSync(screenshotDir, { recursive: true });\n }\n const filename = `${randomUUID()}.png`;\n const filepath = resolve(screenshotDir, filename);\n await page.screenshot({ path: filepath, fullPage: true });\n return `Screenshot saved: ${filepath}`;\n }\n\n case \"pdf\": {\n if (!existsSync(screenshotDir)) {\n mkdirSync(screenshotDir, { recursive: true });\n }\n const filename = `${randomUUID()}.pdf`;\n const filepath = resolve(screenshotDir, filename);\n await page.pdf({ \n path: filepath, \n format: 'A4',\n printBackground: true,\n margin: { top: '1cm', right: '1cm', bottom: '1cm', left: '1cm' }\n });\n return `PDF saved: ${filepath}`;\n }\n\n case \"click\": {\n if (!selector) {\n return \"Error: 'selector' parameter is required for click action.\";\n }\n if (coordinates) {\n await page.mouse.click(coordinates.x, coordinates.y);\n return `Clicked at coordinates: (${coordinates.x}, ${coordinates.y})`;\n } else {\n await page.click(selector);\n return `Clicked: ${selector}`;\n }\n }\n\n case \"type\": {\n if (!selector) {\n return \"Error: 'selector' parameter is required for type action.\";\n }\n if (text === undefined) {\n return \"Error: 'text' parameter is required for type action.\";\n }\n await page.fill(selector, text);\n return `Typed into ${selector}: \"${text}\"`;\n }\n\n case \"form_fill\": {\n if (!formData) {\n return \"Error: 'formData' parameter is required for form_fill action.\";\n }\n const results: string[] = [];\n for (const [sel, value] of Object.entries(formData)) {\n await page.fill(sel, value);\n results.push(`${sel}: \"${value}\"`);\n }\n return `Form filled:\\n${results.join('\\n')}`;\n }\n\n case \"scroll\": {\n if (coordinates) {\n await page.evaluate(({ x, y }) => window.scrollTo(x, y), coordinates);\n return `Scrolled to coordinates: (${coordinates.x}, ${coordinates.y})`;\n } else if (selector) {\n await page.locator(selector).scrollIntoViewIfNeeded();\n return `Scrolled to element: ${selector}`;\n } else if (scrollDirection) {\n switch (scrollDirection) {\n case \"up\":\n await page.keyboard.press('PageUp');\n break;\n case \"down\":\n await page.keyboard.press('PageDown');\n break;\n case \"top\":\n await page.keyboard.press('Home');\n break;\n case \"bottom\":\n await page.keyboard.press('End');\n break;\n default:\n await page.mouse.wheel(0, scrollDirection === 'down' ? scrollDistance : -scrollDistance);\n }\n return `Scrolled ${scrollDirection}`;\n }\n return \"Error: scroll requires coordinates, selector, or scrollDirection\";\n }\n\n case \"hover\": {\n if (!selector) {\n return \"Error: 'selector' parameter is required for hover action.\";\n }\n await page.hover(selector);\n return `Hovered over: ${selector}`;\n }\n\n case \"select\": {\n if (!selector || !text) {\n return \"Error: 'selector' and 'text' parameters are required for select action.\";\n }\n await page.selectOption(selector, text);\n return `Selected \"${text}\" in ${selector}`;\n }\n\n case \"upload\": {\n if (!selector || !filePath) {\n return \"Error: 'selector' and 'filePath' parameters are required for upload action.\";\n }\n const absolutePath = resolve(workspaceDir, filePath);\n if (!existsSync(absolutePath)) {\n return `Error: File not found: ${absolutePath}`;\n }\n await page.setInputFiles(selector, absolutePath);\n return `Uploaded file ${filePath} to ${selector}`;\n }\n\n case \"download\": {\n const downloadPromise = page.waitForEvent('download');\n if (selector) {\n await page.click(selector);\n }\n const download = await downloadPromise;\n const filename = download.suggestedFilename() || `download_${randomUUID()}`;\n const downloadPath = resolve(workspaceDir, 'downloads', filename);\n if (!existsSync(resolve(workspaceDir, 'downloads'))) {\n mkdirSync(resolve(workspaceDir, 'downloads'), { recursive: true });\n }\n await download.saveAs(downloadPath);\n return `Downloaded: ${downloadPath}`;\n }\n\n case \"wait_for\": {\n if (!waitCondition || !waitValue) {\n return \"Error: 'waitCondition' and 'waitValue' parameters are required for wait_for action.\";\n }\n switch (waitCondition) {\n case \"selector\":\n await page.waitForSelector(waitValue, { timeout });\n return `Waited for selector: ${waitValue}`;\n case \"text\":\n await page.waitForFunction(\n (text) => document.body.innerText.includes(text),\n waitValue,\n { timeout }\n );\n return `Waited for text: ${waitValue}`;\n case \"url\":\n await page.waitForURL(waitValue, { timeout });\n return `Waited for URL: ${waitValue}`;\n case \"networkidle\":\n await page.waitForLoadState('networkidle', { timeout });\n return \"Waited for network idle\";\n case \"timeout\":\n await page.waitForTimeout(parseInt(waitValue));\n return `Waited for ${waitValue}ms`;\n default:\n return `Unknown wait condition: ${waitCondition}`;\n }\n }\n\n case \"network_logs\": {\n // Get network logs from context\n const logs = await page.evaluate(() => {\n // This would need to be implemented with request/response tracking\n return \"Network logging not yet implemented - use browser dev tools\";\n });\n return logs;\n }\n\n case \"console_logs\": {\n const logs: string[] = [];\n page.on('console', (msg: any) => {\n logs.push(`[${msg.type()}] ${msg.text()}`);\n });\n // Wait a bit to collect logs\n await page.waitForTimeout(1000);\n return logs.length > 0 ? logs.join('\\n') : \"No console logs\";\n }\n\n case \"cookies\": {\n if (cookieData) {\n if (cookieData.action === 'set') {\n await context.addCookies([cookieData.cookie]);\n return `Cookie set: ${cookieData.cookie.name}`;\n } else if (cookieData.action === 'clear') {\n await context.clearCookies();\n return \"Cookies cleared\";\n }\n }\n const cookies = await context.cookies();\n return JSON.stringify(cookies, null, 2);\n }\n\n case \"storage\": {\n if (storageData) {\n const storageType = storageData.type || 'localStorage';\n if (storageData.action === 'set') {\n await page.evaluate(({ type, key, value }) => {\n if (type === 'localStorage') {\n localStorage.setItem(key, value);\n } else {\n sessionStorage.setItem(key, value);\n }\n }, { type: storageType, key: storageData.key, value: storageData.value });\n return `${storageType} set: ${storageData.key}`;\n } else if (storageData.action === 'clear') {\n await page.evaluate((type) => {\n if (type === 'localStorage') {\n localStorage.clear();\n } else {\n sessionStorage.clear();\n }\n }, storageType);\n return `${storageType} cleared`;\n }\n }\n const storage = await page.evaluate(() => ({\n localStorage: Object.fromEntries(Object.entries(localStorage)),\n sessionStorage: Object.fromEntries(Object.entries(sessionStorage))\n }));\n return JSON.stringify(storage, null, 2);\n }\n\n case \"evaluate\": {\n if (!javascript) {\n return \"Error: 'javascript' parameter is required for evaluate action.\";\n }\n // eslint-disable-next-line no-eval\n const result = await page.evaluate(javascript);\n const str = typeof result === \"string\" ? result : JSON.stringify(result, null, 2);\n if (str.length > MAX_OUTPUT) {\n return str.slice(0, MAX_OUTPUT) + `\\n... (truncated, ${str.length} total chars)`;\n }\n return str ?? \"(no result)\";\n }\n\n default:\n return `Unknown action: ${action}. Available actions: extract, screenshot, click, type, evaluate, form_fill, scroll, hover, select, upload, download, pdf, wait_for, network_logs, console_logs, cookies, storage.`;\n }\n } catch (err) {\n return `browse error: ${(err as Error).message}`;\n } finally {\n if (page) {\n try {\n await page.close();\n } catch {\n // ignore\n }\n }\n }\n },\n );\n\n // Add browser session management tool\n registry.register(\n \"browser_session\",\n [\n \"Manage browser sessions for persistent contexts across multiple browse operations.\",\n \"Actions:\",\n \" list — list all active browser sessions\",\n \" create — create a new browser session with custom options\",\n \" close — close a specific browser session\",\n \" close_all — close all browser sessions\",\n \" info — get information about a specific session\",\n ].join(\"\\n\"),\n {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"list\", \"create\", \"close\", \"close_all\", \"info\"],\n description: \"Session management action.\",\n },\n sessionId: {\n type: \"string\",\n description: \"Session ID for create, close, or info actions.\",\n },\n options: {\n type: \"object\",\n description: \"Browser options for create action (viewport, userAgent, mobile, etc.).\",\n },\n },\n required: [\"action\"],\n },\n async (params) => {\n const action = params.action as string;\n const sessionId = params.sessionId as string | undefined;\n const options = params.options as BrowserOptions | undefined;\n\n try {\n switch (action) {\n case \"list\": {\n const sessions = Array.from(contextInstances.keys());\n return sessions.length > 0 \n ? `Active sessions: ${sessions.join(', ')}`\n : \"No active browser sessions\";\n }\n\n case \"create\": {\n if (!sessionId) {\n return \"Error: 'sessionId' parameter is required for create action.\";\n }\n if (contextInstances.has(sessionId)) {\n return `Error: Session '${sessionId}' already exists.`;\n }\n await getBrowserContext(sessionId, options || {});\n return `Created browser session: ${sessionId}`;\n }\n\n case \"close\": {\n if (!sessionId) {\n return \"Error: 'sessionId' parameter is required for close action.\";\n }\n const context = contextInstances.get(sessionId);\n if (!context) {\n return `Error: Session '${sessionId}' not found.`;\n }\n await context.close();\n contextInstances.delete(sessionId);\n return `Closed browser session: ${sessionId}`;\n }\n\n case \"close_all\": {\n const sessionCount = contextInstances.size;\n for (const [id, context] of contextInstances) {\n try {\n await context.close();\n } catch {\n // ignore errors\n }\n }\n contextInstances.clear();\n return `Closed ${sessionCount} browser sessions`;\n }\n\n case \"info\": {\n if (!sessionId) {\n return \"Error: 'sessionId' parameter is required for info action.\";\n }\n const context = contextInstances.get(sessionId);\n if (!context) {\n return `Error: Session '${sessionId}' not found.`;\n }\n const pages = context.pages();\n return `Session '${sessionId}': ${pages.length} active pages`;\n }\n\n default:\n return `Unknown action: ${action}. Available actions: list, create, close, close_all, info.`;\n }\n } catch (err) {\n return `browser_session error: ${(err as Error).message}`;\n }\n },\n );\n}\n","import { execSync } from \"child_process\";\nimport * as os from \"os\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\nconst MAX_OUTPUT = 50_000; // chars\n\nfunction truncate(output: string): string {\n if (output.length > MAX_OUTPUT) {\n return output.slice(0, MAX_OUTPUT) + `\\n... (truncated, ${output.length} total chars)`;\n }\n return output;\n}\n\nfunction exec(cmd: string, timeoutS = 10): string {\n return execSync(cmd, {\n encoding: \"utf-8\",\n timeout: timeoutS * 1000,\n maxBuffer: 10 * 1024 * 1024,\n shell: \"/bin/sh\",\n env: { ...process.env, PATH: `/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:${process.env.PATH}` },\n });\n}\n\nexport function registerSystemTools(registry: ToolRegistry): void {\n // --- system_info ---\n registry.register(\n \"system_info\",\n \"Get system information: hostname, OS, architecture, uptime, CPU, memory, and disk usage.\",\n {\n type: \"object\",\n properties: {},\n required: [],\n },\n async () => {\n try {\n const cpus = os.cpus();\n const cpuModel = cpus.length > 0 ? cpus[0].model : \"unknown\";\n const totalMem = os.totalmem();\n const freeMem = os.freemem();\n\n let disk = \"unavailable\";\n try {\n const dfOut = exec(\"df -h /\");\n const lines = dfOut.trim().split(\"\\n\");\n if (lines.length >= 2) {\n const parts = lines[1].split(/\\s+/);\n // df -h output: Filesystem Size Used Avail Capacity Mounted\n disk = `total=${parts[1]}, used=${parts[2]}, free=${parts[3]}`;\n }\n } catch {\n // disk info unavailable\n }\n\n const info = [\n `hostname: ${os.hostname()}`,\n `os: ${os.platform()} ${os.release()}`,\n `arch: ${os.arch()}`,\n `uptime: ${Math.floor(os.uptime() / 3600)}h ${Math.floor((os.uptime() % 3600) / 60)}m`,\n `cpu: ${cpuModel} (${cpus.length} cores)`,\n `memory: ${fmt(freeMem)} free / ${fmt(totalMem)} total`,\n `disk (/): ${disk}`,\n ];\n\n return info.join(\"\\n\");\n } catch (err) {\n return `Error getting system info: ${(err as Error).message}`;\n }\n },\n );\n\n // --- process_list ---\n registry.register(\n \"process_list\",\n \"List running processes. Optionally filter by name and limit results.\",\n {\n type: \"object\",\n properties: {\n filter: {\n type: \"string\",\n description: \"Filter processes by name (grep pattern)\",\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of processes to return (default 20)\",\n },\n },\n required: [],\n },\n async (params) => {\n const filter = params.filter as string | undefined;\n const limit = (params.limit as number) || 20;\n\n try {\n let cmd: string;\n if (filter) {\n // grep filter, exclude the grep process itself\n cmd = `ps aux | grep -i '${filter.replace(/'/g, \"\\\\'\")}' | grep -v grep | head -n ${limit}`;\n } else {\n cmd = `ps aux -r | head -n ${limit + 1}`; // +1 for header\n }\n\n const output = exec(cmd, 15);\n return truncate(output) || \"(no matching processes)\";\n } catch (err) {\n return `Error listing processes: ${(err as Error).message}`;\n }\n },\n );\n\n // --- process_kill ---\n registry.register(\n \"process_kill\",\n \"Kill a process by PID. Refuses to kill PID 1 or the agent's own process.\",\n {\n type: \"object\",\n properties: {\n pid: {\n type: \"number\",\n description: \"Process ID to kill\",\n },\n signal: {\n type: \"string\",\n description: \"Signal to send (default: TERM). Examples: TERM, KILL, HUP, INT\",\n },\n },\n required: [\"pid\"],\n },\n async (params) => {\n const pid = params.pid as number;\n const signal = (params.signal as string) || \"TERM\";\n\n if (pid === 1) {\n return \"Error: Refusing to kill PID 1 (init/launchd).\";\n }\n\n if (pid === process.pid) {\n return \"Error: Refusing to kill the agent's own process.\";\n }\n\n try {\n const sig = signal.toUpperCase().startsWith(\"SIG\") ? signal.toUpperCase() : `SIG${signal.toUpperCase()}`;\n process.kill(pid, sig as NodeJS.Signals);\n return `Sent ${sig} to PID ${pid}.`;\n } catch (err) {\n return `Error killing process ${pid}: ${(err as Error).message}`;\n }\n },\n );\n\n // --- service_control ---\n registry.register(\n \"service_control\",\n \"Control launchd services on macOS. List, start, stop, restart, or check status of services.\",\n {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n enum: [\"start\", \"stop\", \"restart\", \"status\", \"list\"],\n description: \"Action to perform\",\n },\n service: {\n type: \"string\",\n description: \"Service label (required for start/stop/restart/status)\",\n },\n },\n required: [\"action\"],\n },\n async (params) => {\n const action = params.action as string;\n const service = params.service as string | undefined;\n\n try {\n switch (action) {\n case \"list\": {\n const filter = service || \"hivemind\";\n const output = exec(`launchctl list | grep -i '${filter.replace(/'/g, \"\\\\'\")}'`, 15);\n return truncate(output) || `(no services matching '${filter}')`;\n }\n\n case \"status\": {\n if (!service) return \"Error: 'service' parameter required for status.\";\n const output = exec(`launchctl list '${service.replace(/'/g, \"\\\\'\")}'`, 15);\n return truncate(output);\n }\n\n case \"start\": {\n if (!service) return \"Error: 'service' parameter required for start.\";\n exec(`launchctl start '${service.replace(/'/g, \"\\\\'\")}'`);\n return `Started service: ${service}`;\n }\n\n case \"stop\": {\n if (!service) return \"Error: 'service' parameter required for stop.\";\n exec(`launchctl stop '${service.replace(/'/g, \"\\\\'\")}'`);\n return `Stopped service: ${service}`;\n }\n\n case \"restart\": {\n if (!service) return \"Error: 'service' parameter required for restart.\";\n const escaped = service.replace(/'/g, \"\\\\'\");\n exec(`launchctl stop '${escaped}'`);\n exec(`launchctl start '${escaped}'`);\n return `Restarted service: ${service}`;\n }\n\n default:\n return `Error: Unknown action '${action}'. Use: start, stop, restart, status, list.`;\n }\n } catch (err) {\n return `Error controlling service: ${(err as Error).message}`;\n }\n },\n );\n\n // --- disk_usage ---\n registry.register(\n \"disk_usage\",\n \"Get disk usage for a directory. Returns human-readable sizes.\",\n {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Directory path (default: /)\",\n },\n depth: {\n type: \"number\",\n description: \"Directory depth to report (default: 1)\",\n },\n },\n required: [],\n },\n async (params) => {\n const target = (params.path as string) || \"/\";\n const depth = (params.depth as number) || 1;\n\n try {\n const output = exec(`du -d ${depth} -h '${target.replace(/'/g, \"\\\\'\")}'`, 30);\n return truncate(output) || \"(no output)\";\n } catch (err) {\n return `Error getting disk usage: ${(err as Error).message}`;\n }\n },\n );\n\n // --- network_info ---\n registry.register(\n \"network_info\",\n \"Get network interface information and external IP address.\",\n {\n type: \"object\",\n properties: {},\n required: [],\n },\n async () => {\n try {\n const lines: string[] = [];\n\n // Local IPs from os module\n const interfaces = os.networkInterfaces();\n lines.push(\"Local interfaces:\");\n for (const [name, addrs] of Object.entries(interfaces)) {\n if (!addrs) continue;\n for (const addr of addrs) {\n if (addr.family === \"IPv4\") {\n lines.push(` ${name}: ${addr.address}`);\n }\n }\n }\n\n // External IP\n try {\n const extIp = exec(\"curl -s --max-time 5 ifconfig.me\", 10).trim();\n lines.push(`\\nExternal IP: ${extIp}`);\n } catch {\n lines.push(\"\\nExternal IP: unavailable\");\n }\n\n lines.push(`Hostname: ${os.hostname()}`);\n\n return lines.join(\"\\n\");\n } catch (err) {\n return `Error getting network info: ${(err as Error).message}`;\n }\n },\n );\n}\n\nfunction fmt(bytes: number): string {\n if (bytes >= 1024 ** 3) return `${(bytes / 1024 ** 3).toFixed(1)}GB`;\n if (bytes >= 1024 ** 2) return `${(bytes / 1024 ** 2).toFixed(0)}MB`;\n return `${(bytes / 1024).toFixed(0)}KB`;\n}\n","import { createServer, type IncomingMessage, type ServerResponse, type Server } from \"http\";\nimport { createReadStream, existsSync, statSync } from \"fs\";\nimport { join, extname, resolve } from \"path\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\nconst MAX_BODY = 50_000;\n\nconst activeServers = new Map<number, Server>();\n\nconst MIME_TYPES: Record<string, string> = {\n \".html\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"application/javascript\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".txt\": \"text/plain\",\n};\n\ninterface Route {\n path: string;\n method: string;\n response: string;\n}\n\nfunction serveStatic(baseDir: string, req: IncomingMessage, res: ServerResponse): boolean {\n const urlPath = (req.url || \"/\").split(\"?\")[0];\n let filePath = join(baseDir, urlPath === \"/\" ? \"index.html\" : urlPath);\n\n // Prevent directory traversal\n if (!resolve(filePath).startsWith(resolve(baseDir))) {\n res.writeHead(403);\n res.end(\"Forbidden\");\n return true;\n }\n\n if (!existsSync(filePath)) return false;\n\n const stat = statSync(filePath);\n if (stat.isDirectory()) {\n filePath = join(filePath, \"index.html\");\n if (!existsSync(filePath)) return false;\n }\n\n const ext = extname(filePath);\n const mime = MIME_TYPES[ext] || \"application/octet-stream\";\n res.writeHead(200, { \"Content-Type\": mime });\n createReadStream(filePath).pipe(res);\n return true;\n}\n\nfunction matchRoute(routes: Route[], req: IncomingMessage): Route | undefined {\n const method = (req.method || \"GET\").toUpperCase();\n const urlPath = (req.url || \"/\").split(\"?\")[0];\n return routes.find(\n (r) => r.path === urlPath && r.method.toUpperCase() === method,\n );\n}\n\nexport function registerHttpTools(registry: ToolRegistry, workspaceDir: string): void {\n // --- http_serve ---\n registry.register(\n \"http_serve\",\n \"Start a simple HTTP server. Can serve static files from a directory and/or respond to configured routes. Returns the URL and port. The server persists until stopped with http_stop.\",\n {\n type: \"object\",\n properties: {\n port: {\n type: \"number\",\n description: \"Port to listen on (default: 8080)\",\n },\n directory: {\n type: \"string\",\n description: \"Serve static files from this directory (relative to workspace)\",\n },\n routes: {\n type: \"array\",\n description: \"Array of route handlers: { path, method, response }\",\n items: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"URL path (e.g. '/health')\" },\n method: { type: \"string\", description: \"HTTP method (e.g. 'GET', 'POST')\" },\n response: { type: \"string\", description: \"Response body to return\" },\n },\n required: [\"path\", \"method\", \"response\"],\n },\n },\n },\n required: [],\n },\n async (params) => {\n const port = (params.port as number) || 8080;\n const directory = params.directory as string | undefined;\n const routes = (params.routes as Route[] | undefined) || [];\n\n if (activeServers.has(port)) {\n return `Error: A server is already running on port ${port}. Stop it first with http_stop.`;\n }\n\n const staticDir = directory ? resolve(workspaceDir, directory) : undefined;\n if (staticDir && !existsSync(staticDir)) {\n return `Error: Directory not found: ${directory}`;\n }\n\n return new Promise<string>((resolvePromise) => {\n const server = createServer((req, res) => {\n // Check routes first\n const route = matchRoute(routes, req);\n if (route) {\n res.writeHead(200, { \"Content-Type\": \"text/plain\" });\n res.end(route.response);\n return;\n }\n\n // Then try static files\n if (staticDir && serveStatic(staticDir, req, res)) {\n return;\n }\n\n // 404\n res.writeHead(404);\n res.end(\"Not Found\");\n });\n\n server.on(\"error\", (err) => {\n resolvePromise(`Error starting server: ${err.message}`);\n });\n\n server.listen(port, () => {\n activeServers.set(port, server);\n const parts: string[] = [`Server started on http://localhost:${port}`];\n if (staticDir) parts.push(`Serving static files from: ${directory}`);\n if (routes.length > 0) parts.push(`Routes: ${routes.map((r) => `${r.method} ${r.path}`).join(\", \")}`);\n resolvePromise(parts.join(\"\\n\"));\n });\n });\n },\n );\n\n // --- http_stop ---\n registry.register(\n \"http_stop\",\n \"Stop a running HTTP server by port number.\",\n {\n type: \"object\",\n properties: {\n port: {\n type: \"number\",\n description: \"Port of the server to stop\",\n },\n },\n required: [\"port\"],\n },\n async (params) => {\n const port = params.port as number;\n const server = activeServers.get(port);\n\n if (!server) {\n return `No server running on port ${port}. Active ports: ${activeServers.size > 0 ? [...activeServers.keys()].join(\", \") : \"none\"}`;\n }\n\n return new Promise<string>((resolvePromise) => {\n server.close((err) => {\n activeServers.delete(port);\n if (err) {\n resolvePromise(`Server on port ${port} stopped with warning: ${err.message}`);\n } else {\n resolvePromise(`Server on port ${port} stopped.`);\n }\n });\n });\n },\n );\n\n // --- http_request ---\n registry.register(\n \"http_request\",\n \"Make an HTTP request (like curl). Supports GET, POST, PUT, PATCH, DELETE. Returns status, headers, and body.\",\n {\n type: \"object\",\n properties: {\n url: {\n type: \"string\",\n description: \"The URL to request\",\n },\n method: {\n type: \"string\",\n description: \"HTTP method (default: 'GET')\",\n enum: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"HEAD\", \"OPTIONS\"],\n },\n headers: {\n type: \"object\",\n description: \"Request headers as key-value pairs\",\n },\n body: {\n type: \"string\",\n description: \"Request body (for POST, PUT, PATCH)\",\n },\n timeout: {\n type: \"number\",\n description: \"Timeout in milliseconds (default: 30000)\",\n },\n },\n required: [\"url\"],\n },\n async (params) => {\n const url = params.url as string;\n const method = ((params.method as string) || \"GET\").toUpperCase();\n const headers = (params.headers as Record<string, string>) || {};\n const body = params.body as string | undefined;\n const timeout = (params.timeout as number) || 30_000;\n\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(url, {\n method,\n headers,\n body: body || undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n let responseBody = await response.text();\n const truncated = responseBody.length > MAX_BODY;\n if (truncated) {\n responseBody = responseBody.slice(0, MAX_BODY);\n }\n\n const result = {\n status: response.status,\n statusText: response.statusText,\n headers: responseHeaders,\n body: responseBody,\n truncated,\n };\n\n return JSON.stringify(result, null, 2);\n } catch (err) {\n const message = (err as Error).message;\n if (message.includes(\"abort\")) {\n return `Error: Request timed out after ${timeout}ms`;\n }\n return `Error: ${message}`;\n }\n },\n );\n}\n","import { watch, existsSync, mkdirSync, writeFileSync, type FSWatcher } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\ninterface WatcherEntry {\n id: string;\n path: string; // relative path originally provided\n absolutePath: string;\n channelId?: string;\n watcher: FSWatcher;\n createdAt: string;\n}\n\nconst activeWatchers = new Map<string, WatcherEntry>();\n\nexport function registerWatchTools(\n registry: ToolRegistry,\n workspaceDir: string,\n dataDir: string,\n): void {\n const eventsDir = join(dataDir, \"events\");\n\n // --- watch_start ---\n registry.register(\n \"watch_start\",\n \"Start watching a file or directory for changes. When a change is detected, an immediate event is written to the events directory so the agent can react. Optionally specify a Sesame channel to notify.\",\n {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"File or directory to watch (relative to workspace)\",\n },\n id: {\n type: \"string\",\n description: \"Optional identifier for this watcher (auto-generated if omitted)\",\n },\n channelId: {\n type: \"string\",\n description: \"Sesame channel to notify when changes are detected\",\n },\n },\n required: [\"path\"],\n },\n async (params) => {\n const relPath = params.path as string;\n const id = (params.id as string) || randomUUID().slice(0, 8);\n const channelId = params.channelId as string | undefined;\n\n if (activeWatchers.has(id)) {\n return `Error: A watcher with id '${id}' already exists. Stop it first or use a different id.`;\n }\n\n const absolutePath = resolve(workspaceDir, relPath);\n\n // Prevent directory traversal\n if (!absolutePath.startsWith(resolve(workspaceDir))) {\n return \"Error: Path must be within the workspace directory.\";\n }\n\n if (!existsSync(absolutePath)) {\n return `Error: Path not found: ${relPath}`;\n }\n\n // Ensure events directory exists\n if (!existsSync(eventsDir)) {\n mkdirSync(eventsDir, { recursive: true });\n }\n\n try {\n // Debounce: avoid writing duplicate events for rapid changes\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n const fsWatcher = watch(absolutePath, { recursive: true }, (eventType, filename) => {\n if (debounceTimer) return;\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n }, 500);\n\n const event = {\n type: \"immediate\" as const,\n channelId: channelId || \"default\",\n text: `File watcher '${id}': ${eventType} detected on ${filename || relPath}`,\n };\n\n const eventFile = join(eventsDir, `watch-${id}-${Date.now()}.json`);\n try {\n writeFileSync(eventFile, JSON.stringify(event, null, 2));\n } catch {\n // Best-effort: if we can't write the event file, silently continue\n }\n });\n\n const entry: WatcherEntry = {\n id,\n path: relPath,\n absolutePath,\n channelId,\n watcher: fsWatcher,\n createdAt: new Date().toISOString(),\n };\n\n activeWatchers.set(id, entry);\n\n return `Watcher started: id='${id}', path='${relPath}'${channelId ? `, channel='${channelId}'` : \"\"}`;\n } catch (err) {\n return `Error starting watcher: ${(err as Error).message}`;\n }\n },\n );\n\n // --- watch_stop ---\n registry.register(\n \"watch_stop\",\n \"Stop a file watcher by its ID.\",\n {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Watcher ID to stop\",\n },\n },\n required: [\"id\"],\n },\n async (params) => {\n const id = params.id as string;\n const entry = activeWatchers.get(id);\n\n if (!entry) {\n const ids = activeWatchers.size > 0\n ? [...activeWatchers.keys()].join(\", \")\n : \"none\";\n return `No watcher found with id '${id}'. Active watchers: ${ids}`;\n }\n\n entry.watcher.close();\n activeWatchers.delete(id);\n return `Watcher '${id}' stopped (was watching: ${entry.path}).`;\n },\n );\n\n // --- watch_list ---\n registry.register(\n \"watch_list\",\n \"List all active file watchers with their paths and IDs.\",\n {\n type: \"object\",\n properties: {},\n required: [],\n },\n async () => {\n if (activeWatchers.size === 0) {\n return \"No active watchers.\";\n }\n\n const lines: string[] = [];\n for (const [id, entry] of activeWatchers) {\n let line = `${id}: ${entry.path} (since ${entry.createdAt})`;\n if (entry.channelId) line += ` → channel: ${entry.channelId}`;\n lines.push(line);\n }\n\n return `${activeWatchers.size} active watcher(s):\\n${lines.join(\"\\n\")}`;\n },\n );\n}\n","import { execSync } from \"child_process\";\nimport { resolve, normalize } from \"path\";\nimport { mkdirSync, existsSync } from \"fs\";\nimport { randomUUID } from \"crypto\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\nconst MAX_OUTPUT = 50_000; // chars\n\nfunction shellExec(command: string, timeoutMs: number): string {\n return execSync(command, {\n timeout: timeoutMs,\n encoding: \"utf-8\",\n maxBuffer: 10 * 1024 * 1024,\n shell: \"/bin/sh\",\n env: { ...process.env, PATH: `/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:${process.env.PATH}` },\n });\n}\n\nexport function registerMacOSTools(registry: ToolRegistry, workspaceDir: string): void {\n // --- run_applescript ---\n registry.register(\n \"run_applescript\",\n \"Execute AppleScript code via osascript. Enables controlling any Mac application (Finder, Safari, Mail, System Events, etc.).\",\n {\n type: \"object\",\n properties: {\n script: {\n type: \"string\",\n description: \"AppleScript code to execute.\",\n },\n },\n required: [\"script\"],\n },\n async (params) => {\n const script = params.script as string;\n try {\n const output = shellExec(`osascript -e ${escapeShellArg(script)}`, 15_000);\n const trimmed = output.length > MAX_OUTPUT\n ? output.slice(0, MAX_OUTPUT) + `\\n... (truncated, ${output.length} total chars)`\n : output;\n return trimmed || \"(no output)\";\n } catch (err: any) {\n const stderr = err.stderr?.toString() || \"\";\n const stdout = err.stdout?.toString() || \"\";\n const output = (stdout + \"\\n\" + stderr).trim();\n return `AppleScript error (exit code ${err.status ?? \"unknown\"}):\\n${output || err.message}`;\n }\n },\n );\n\n // --- notify ---\n registry.register(\n \"notify\",\n \"Send a macOS notification with a title, message, and optional sound.\",\n {\n type: \"object\",\n properties: {\n title: {\n type: \"string\",\n description: \"Notification title.\",\n },\n message: {\n type: \"string\",\n description: \"Notification body text.\",\n },\n sound: {\n type: \"string\",\n description: \"Sound name (e.g. 'Glass', 'Ping', 'Pop'). Default: 'default'.\",\n },\n },\n required: [\"title\", \"message\"],\n },\n async (params) => {\n const title = params.title as string;\n const message = params.message as string;\n const sound = (params.sound as string) || \"default\";\n try {\n const script = `display notification ${escapeAppleString(message)} with title ${escapeAppleString(title)} sound name ${escapeAppleString(sound)}`;\n shellExec(`osascript -e ${escapeShellArg(script)}`, 10_000);\n return `Notification sent: \"${title}\"`;\n } catch (err: any) {\n const stderr = err.stderr?.toString() || \"\";\n return `Notification error: ${stderr.trim() || err.message}`;\n }\n },\n );\n\n // --- clipboard_read ---\n registry.register(\n \"clipboard_read\",\n \"Read the current contents of the macOS system clipboard.\",\n {\n type: \"object\",\n properties: {},\n required: [],\n },\n async () => {\n try {\n const output = shellExec(\"pbpaste\", 5_000);\n if (!output) return \"(clipboard is empty)\";\n if (output.length > MAX_OUTPUT) {\n return output.slice(0, MAX_OUTPUT) + `\\n... (truncated, ${output.length} total chars)`;\n }\n return output;\n } catch (err: any) {\n return `Clipboard read error: ${err.message}`;\n }\n },\n );\n\n // --- clipboard_write ---\n registry.register(\n \"clipboard_write\",\n \"Write text content to the macOS system clipboard.\",\n {\n type: \"object\",\n properties: {\n content: {\n type: \"string\",\n description: \"Text to write to the clipboard.\",\n },\n },\n required: [\"content\"],\n },\n async (params) => {\n const content = params.content as string;\n try {\n execSync(\"pbcopy\", {\n input: content,\n timeout: 5_000,\n encoding: \"utf-8\",\n shell: \"/bin/sh\",\n });\n return `Copied ${content.length} chars to clipboard.`;\n } catch (err: any) {\n return `Clipboard write error: ${err.message}`;\n }\n },\n );\n\n // --- open_url ---\n registry.register(\n \"open_url\",\n \"Open a URL in the default browser or a specified application.\",\n {\n type: \"object\",\n properties: {\n url: {\n type: \"string\",\n description: \"The URL to open.\",\n },\n app: {\n type: \"string\",\n description: \"Application name to open the URL with (e.g. 'Google Chrome', 'Safari').\",\n },\n },\n required: [\"url\"],\n },\n async (params) => {\n const url = params.url as string;\n const app = params.app as string | undefined;\n try {\n const args = app\n ? `open -a ${escapeShellArg(app)} ${escapeShellArg(url)}`\n : `open ${escapeShellArg(url)}`;\n shellExec(args, 10_000);\n return `Opened ${url}${app ? ` in ${app}` : \"\"}`;\n } catch (err: any) {\n const stderr = err.stderr?.toString() || \"\";\n return `open_url error: ${stderr.trim() || err.message}`;\n }\n },\n );\n\n // --- screenshot ---\n registry.register(\n \"screenshot\",\n \"Take a screenshot of the screen and save it to a file.\",\n {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Save path for the screenshot (relative to workspace). Defaults to screenshots/<uuid>.png.\",\n },\n region: {\n type: \"boolean\",\n description: \"If true, enable interactive region selection. Default: false.\",\n },\n },\n required: [],\n },\n async (params) => {\n try {\n let savePath: string;\n if (params.path) {\n savePath = resolve(workspaceDir, params.path as string);\n const normalizedSave = normalize(savePath);\n const normalizedWorkspace = normalize(workspaceDir);\n if (!normalizedSave.startsWith(normalizedWorkspace)) {\n return \"Error: path must be within the workspace.\";\n }\n } else {\n const screenshotDir = resolve(workspaceDir, \"screenshots\");\n if (!existsSync(screenshotDir)) {\n mkdirSync(screenshotDir, { recursive: true });\n }\n savePath = resolve(screenshotDir, `${randomUUID()}.png`);\n }\n\n // Ensure parent directory exists\n const parentDir = resolve(savePath, \"..\");\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n const args = params.region ? `screencapture -i ${escapeShellArg(savePath)}` : `screencapture -x ${escapeShellArg(savePath)}`;\n shellExec(args, 15_000);\n\n if (!existsSync(savePath)) {\n return \"Screenshot cancelled or failed — no file was created.\";\n }\n\n return `Screenshot saved: ${savePath}`;\n } catch (err: any) {\n return `Screenshot error: ${err.message}`;\n }\n },\n );\n}\n\n/** Escape a string for safe use as a single-quoted shell argument. */\nfunction escapeShellArg(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n\n/** Wrap a string as a quoted AppleScript string literal. */\nfunction escapeAppleString(s: string): string {\n return `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\n","import { execSync } from \"child_process\";\nimport { resolve, normalize, extname } from \"path\";\nimport { mkdirSync, existsSync } from \"fs\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\nconst MAX_OUTPUT = 50_000; // chars\n\nfunction shellExec(command: string, cwd: string, timeoutMs: number): string {\n return execSync(command, {\n cwd,\n timeout: timeoutMs,\n encoding: \"utf-8\",\n maxBuffer: 10 * 1024 * 1024,\n shell: \"/bin/sh\",\n env: { ...process.env, PATH: `/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:${process.env.PATH}` },\n });\n}\n\n/**\n * Resolve a path relative to workspace and prevent traversal outside it.\n */\nfunction safePath(workspaceDir: string, filePath: string): string {\n const resolved = resolve(workspaceDir, filePath);\n const normalizedResolved = normalize(resolved);\n const normalizedWorkspace = normalize(workspaceDir);\n if (!normalizedResolved.startsWith(normalizedWorkspace)) {\n throw new Error(\"Path traversal detected: path must be within the workspace.\");\n }\n return resolved;\n}\n\n/** Escape a string for safe use as a single-quoted shell argument. */\nfunction escapeShellArg(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport function registerDataTools(registry: ToolRegistry, workspaceDir: string): void {\n // --- sqlite_query ---\n registry.register(\n \"sqlite_query\",\n \"Execute a SQL query against a SQLite database file. Returns JSON for SELECT queries, affected row info for INSERT/UPDATE/DELETE.\",\n {\n type: \"object\",\n properties: {\n database: {\n type: \"string\",\n description: \"Path to the .db file (relative to workspace).\",\n },\n query: {\n type: \"string\",\n description: \"SQL query to execute.\",\n },\n params: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Query parameters for ? placeholders.\",\n },\n },\n required: [\"database\", \"query\"],\n },\n async (params) => {\n const dbRelative = params.database as string;\n const query = params.query as string;\n const queryParams = params.params as string[] | undefined;\n\n try {\n const dbPath = safePath(workspaceDir, dbRelative);\n\n if (!existsSync(dbPath) && !query.trim().toUpperCase().startsWith(\"CREATE\")) {\n return `Error: database file not found: ${dbRelative}`;\n }\n\n // Build the full SQL with parameter binding via sqlite3 CLI\n let fullQuery = query;\n if (queryParams && queryParams.length > 0) {\n // Replace ? placeholders with properly quoted values for sqlite3 CLI\n let paramIdx = 0;\n fullQuery = query.replace(/\\?/g, () => {\n if (paramIdx < queryParams.length) {\n const val = queryParams[paramIdx++];\n // Escape single quotes for SQL\n return `'${val.replace(/'/g, \"''\")}'`;\n }\n return \"?\";\n });\n }\n\n const isSelect = fullQuery.trim().toUpperCase().startsWith(\"SELECT\") ||\n fullQuery.trim().toUpperCase().startsWith(\"PRAGMA\");\n\n const modeFlag = isSelect ? \"-json\" : \"\";\n const command = `sqlite3 ${modeFlag} ${escapeShellArg(dbPath)} ${escapeShellArg(fullQuery)}`;\n\n const output = shellExec(command, workspaceDir, 30_000);\n\n if (!output.trim()) {\n return isSelect ? \"[]\" : \"Query executed successfully (no output).\";\n }\n\n const trimmed = output.length > MAX_OUTPUT\n ? output.slice(0, MAX_OUTPUT) + `\\n... (truncated, ${output.length} total chars)`\n : output;\n\n return trimmed;\n } catch (err: any) {\n const stderr = err.stderr?.toString() || \"\";\n const stdout = err.stdout?.toString() || \"\";\n const output = (stdout + \"\\n\" + stderr).trim();\n return `SQLite error: ${output || err.message}`;\n }\n },\n );\n\n // --- archive_create ---\n registry.register(\n \"archive_create\",\n \"Create a zip or tar.gz archive from a file or directory.\",\n {\n type: \"object\",\n properties: {\n source: {\n type: \"string\",\n description: \"File or directory path to archive (relative to workspace).\",\n },\n output: {\n type: \"string\",\n description: \"Output archive path (relative to workspace).\",\n },\n format: {\n type: \"string\",\n enum: [\"zip\", \"tar.gz\"],\n description: \"Archive format. Default: 'zip'.\",\n },\n },\n required: [\"source\", \"output\"],\n },\n async (params) => {\n const source = params.source as string;\n const output = params.output as string;\n const format = (params.format as string) || \"zip\";\n\n try {\n const sourcePath = safePath(workspaceDir, source);\n const outputPath = safePath(workspaceDir, output);\n\n if (!existsSync(sourcePath)) {\n return `Error: source not found: ${source}`;\n }\n\n // Ensure output parent directory exists\n const outputParent = resolve(outputPath, \"..\");\n if (!existsSync(outputParent)) {\n mkdirSync(outputParent, { recursive: true });\n }\n\n let command: string;\n if (format === \"tar.gz\") {\n command = `tar czf ${escapeShellArg(outputPath)} -C ${escapeShellArg(resolve(sourcePath, \"..\"))} ${escapeShellArg(sourcePath.split(\"/\").pop()!)}`;\n } else {\n command = `zip -r ${escapeShellArg(outputPath)} ${escapeShellArg(source)}`;\n }\n\n shellExec(command, workspaceDir, 60_000);\n return `Archive created: ${output}`;\n } catch (err: any) {\n const stderr = err.stderr?.toString() || \"\";\n return `Archive error: ${stderr.trim() || err.message}`;\n }\n },\n );\n\n // --- archive_extract ---\n registry.register(\n \"archive_extract\",\n \"Extract a zip or tar.gz archive.\",\n {\n type: \"object\",\n properties: {\n archive: {\n type: \"string\",\n description: \"Path to the archive file (relative to workspace).\",\n },\n destination: {\n type: \"string\",\n description: \"Extraction directory (relative to workspace). Defaults to workspace root.\",\n },\n },\n required: [\"archive\"],\n },\n async (params) => {\n const archive = params.archive as string;\n const destination = params.destination as string | undefined;\n\n try {\n const archivePath = safePath(workspaceDir, archive);\n const destPath = destination ? safePath(workspaceDir, destination) : workspaceDir;\n\n if (!existsSync(archivePath)) {\n return `Error: archive not found: ${archive}`;\n }\n\n if (!existsSync(destPath)) {\n mkdirSync(destPath, { recursive: true });\n }\n\n const ext = extname(archivePath).toLowerCase();\n const isGz = archivePath.endsWith(\".tar.gz\") || archivePath.endsWith(\".tgz\");\n\n let command: string;\n if (isGz || ext === \".tar\") {\n const flags = isGz ? \"xzf\" : \"xf\";\n command = `tar ${flags} ${escapeShellArg(archivePath)} -C ${escapeShellArg(destPath)}`;\n } else if (ext === \".zip\") {\n command = `unzip -o ${escapeShellArg(archivePath)} -d ${escapeShellArg(destPath)}`;\n } else {\n return `Error: unsupported archive format: ${ext}. Supported: .zip, .tar, .tar.gz, .tgz`;\n }\n\n const output = shellExec(command, workspaceDir, 60_000);\n const trimmed = output.length > MAX_OUTPUT\n ? output.slice(0, MAX_OUTPUT) + `\\n... (truncated)`\n : output;\n return `Extracted to ${destination || \"workspace root\"}.\\n${trimmed}`.trim();\n } catch (err: any) {\n const stderr = err.stderr?.toString() || \"\";\n return `Extract error: ${stderr.trim() || err.message}`;\n }\n },\n );\n\n // --- pdf_extract ---\n registry.register(\n \"pdf_extract\",\n \"Extract text content from a PDF file. Tries pdftotext (poppler), then textutil, then basic string extraction.\",\n {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Path to the PDF file (relative to workspace).\",\n },\n },\n required: [\"path\"],\n },\n async (params) => {\n const filePath = params.path as string;\n\n try {\n const pdfPath = safePath(workspaceDir, filePath);\n\n if (!existsSync(pdfPath)) {\n return `Error: PDF not found: ${filePath}`;\n }\n\n // Try pdftotext (poppler) first — best quality\n try {\n const output = shellExec(`pdftotext ${escapeShellArg(pdfPath)} -`, workspaceDir, 30_000);\n if (output.trim()) {\n return truncate(output);\n }\n } catch {\n // pdftotext not available, try next\n }\n\n // Try textutil (macOS built-in) — works for some PDFs\n try {\n const output = shellExec(`textutil -convert txt -stdout ${escapeShellArg(pdfPath)}`, workspaceDir, 30_000);\n if (output.trim()) {\n return truncate(output);\n }\n } catch {\n // textutil failed, try next\n }\n\n // Fallback: basic string extraction\n try {\n const output = shellExec(`strings ${escapeShellArg(pdfPath)} | head -1000`, workspaceDir, 15_000);\n if (output.trim()) {\n return `(basic extraction — install poppler for better results)\\n${truncate(output)}`;\n }\n } catch {\n // strings also failed\n }\n\n return \"Error: could not extract text from PDF. Install poppler (brew install poppler) for best results.\";\n } catch (err: any) {\n return `PDF extraction error: ${err.message}`;\n }\n },\n );\n}\n\nfunction truncate(text: string): string {\n if (text.length > MAX_OUTPUT) {\n return text.slice(0, MAX_OUTPUT) + `\\n... (truncated, ${text.length} total chars)`;\n }\n return text;\n}\n","import { execSync } from \"child_process\";\nimport { resolve } from \"path\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\n\nconst MAX_OUTPUT = 50_000; // chars\n\n/**\n * Register the coding_agent tool — spawns Claude Code CLI for coding tasks.\n */\nexport function registerCodingAgentTools(registry: ToolRegistry, workspaceDir: string): void {\n registry.register(\n \"coding_agent\",\n \"Spawn Claude Code CLI to perform a coding task. Use for writing code, debugging, refactoring, or any task that benefits from an AI coding assistant with full filesystem access. Requires the 'claude' CLI to be installed.\",\n {\n type: \"object\",\n properties: {\n task: {\n type: \"string\",\n description: \"The coding task or prompt to send to Claude Code\",\n },\n workdir: {\n type: \"string\",\n description: \"Working directory (relative to workspace). Defaults to workspace root.\",\n },\n timeout: {\n type: \"number\",\n description: \"Timeout in seconds. Default: 300\",\n },\n },\n required: [\"task\"],\n },\n async (params) => {\n const task = params.task as string;\n const timeoutSeconds = (params.timeout as number) || 300;\n const cwd = params.workdir\n ? resolve(workspaceDir, params.workdir as string)\n : workspaceDir;\n\n // Build PATH with common claude install locations\n const homedir = process.env.HOME || \"/root\";\n const extendedPath = `${homedir}/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:${process.env.PATH}`;\n\n // Check if claude binary exists\n try {\n execSync(\"which claude\", { stdio: \"ignore\", env: { ...process.env, PATH: extendedPath } });\n } catch {\n return \"Error: 'claude' CLI not found. Install Claude Code first: https://docs.anthropic.com/en/docs/claude-code\";\n }\n\n // Build the command — use --dangerously-skip-permissions for headless operation\n const escapedTask = task.replace(/'/g, \"'\\\\''\");\n const command = `claude --dangerously-skip-permissions -p '${escapedTask}'`;\n\n try {\n const output = execSync(command, {\n cwd,\n timeout: timeoutSeconds * 1000,\n encoding: \"utf-8\",\n maxBuffer: 10 * 1024 * 1024, // 10MB\n shell: \"/bin/sh\",\n env: {\n ...process.env,\n PATH: extendedPath,\n },\n });\n\n const trimmed = output.length > MAX_OUTPUT\n ? output.slice(0, MAX_OUTPUT) + `\\n... (truncated, ${output.length} total chars)`\n : output;\n\n return trimmed || \"(no output)\";\n } catch (err: any) {\n if (err.killed) {\n return `Error: Claude Code timed out after ${timeoutSeconds}s`;\n }\n const stderr = err.stderr?.toString() || \"\";\n const stdout = err.stdout?.toString() || \"\";\n const output = (stdout + \"\\n\" + stderr).trim();\n const code = err.status ?? \"unknown\";\n return `Claude Code failed (exit code ${code}):\\n${output || err.message}`;\n }\n },\n );\n}\n","/**\n * Learn tool — Structured research and knowledge acquisition.\n *\n * Gives the agent a single-call interface to deeply research any topic\n * (web-based or codebase), synthesize findings via internal LLM calls,\n * and store distilled knowledge in the existing L1/L2/L3 memory architecture.\n */\n\nimport type { ToolRegistry } from \"../tool-registry.js\";\nimport { LLMClient, type ChatMessage } from \"../llm-client.js\";\nimport type { LLMConfig } from \"../config.js\";\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface LearnConfig {\n llmConfig?: LLMConfig;\n memoryDaemonUrl: string;\n workspaceDir: string;\n}\n\n// ---------------------------------------------------------------------------\n// Internal types\n// ---------------------------------------------------------------------------\n\ninterface SourceEntry {\n title: string;\n url: string;\n snippet: string;\n}\n\ninterface Finding {\n source: string;\n keyPoints: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction slugify(topic: string): string {\n return topic\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 60);\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline stages\n// ---------------------------------------------------------------------------\n\nasync function discoverResearch(\n topic: string,\n depth: \"shallow\" | \"deep\",\n registry: ToolRegistry,\n): Promise<SourceEntry[]> {\n if (!registry.has(\"web_search\")) {\n throw new Error(\"web_search tool not available — is BRAVE_API_KEY set?\");\n }\n\n const sources: SourceEntry[] = [];\n\n // Primary search\n const primary = await registry.execute(\"web_search\", { query: topic, count: 8 });\n if (primary.startsWith(\"Error:\")) throw new Error(primary);\n sources.push(...parseSearchResults(primary));\n\n // Deep mode: additional refined searches\n if (depth === \"deep\") {\n const refinedQueries = [\n `\"${topic}\" tutorial`,\n `\"${topic}\" best practices`,\n ];\n for (const q of refinedQueries) {\n const result = await registry.execute(\"web_search\", { query: q, count: 5 });\n if (!result.startsWith(\"Error:\")) {\n sources.push(...parseSearchResults(result));\n }\n }\n }\n\n // Deduplicate by URL\n const seen = new Set<string>();\n return sources.filter((s) => {\n if (seen.has(s.url)) return false;\n seen.add(s.url);\n return true;\n });\n}\n\nfunction parseSearchResults(raw: string): SourceEntry[] {\n const entries: SourceEntry[] = [];\n // Each result: \"N. **Title**\\n URL\\n Description\"\n const blocks = raw.split(/\\n\\n(?=\\d+\\.\\s)/);\n for (const block of blocks) {\n const titleMatch = block.match(/\\*\\*(.+?)\\*\\*/);\n const urlMatch = block.match(/\\s+(https?:\\/\\/\\S+)/);\n const lines = block.split(\"\\n\");\n const snippet = lines.length >= 3 ? lines.slice(2).join(\" \").trim() : \"\";\n if (titleMatch && urlMatch) {\n entries.push({\n title: titleMatch[1],\n url: urlMatch[1],\n snippet,\n });\n }\n }\n return entries;\n}\n\nasync function exploreResearch(\n topic: string,\n sources: SourceEntry[],\n depth: \"shallow\" | \"deep\",\n focusAreas: string[],\n registry: ToolRegistry,\n llm: LLMClient,\n): Promise<Finding[]> {\n if (!registry.has(\"web_fetch\")) {\n throw new Error(\"web_fetch tool not available\");\n }\n\n const maxSources = depth === \"deep\" ? 6 : 3;\n const toFetch = sources.slice(0, maxSources);\n const findings: Finding[] = [];\n\n for (const source of toFetch) {\n try {\n const content = await registry.execute(\"web_fetch\", {\n url: source.url,\n max_chars: 15000,\n });\n\n if (content.startsWith(\"Fetch failed:\") || content.startsWith(\"Fetch error:\")) {\n continue;\n }\n\n // Internal LLM call: extract key facts\n const focusClause = focusAreas.length > 0\n ? `Focus especially on: ${focusAreas.join(\", \")}.`\n : \"\";\n\n const messages: ChatMessage[] = [\n {\n role: \"system\",\n content: \"You are a research assistant. Extract key facts concisely. Return a numbered list of 5-10 key points, one per line.\",\n },\n {\n role: \"user\",\n content: `Extract 5-10 key facts about \"${topic}\" from this text. ${focusClause}\\n\\nSource: ${source.title} (${source.url})\\n\\n${content.slice(0, 12000)}`,\n },\n ];\n\n const response = await llm.chat(messages);\n const keyPoints = response.content\n .split(\"\\n\")\n .map((l) => l.replace(/^\\d+[\\.\\)]\\s*/, \"\").trim())\n .filter((l) => l.length > 0);\n\n findings.push({ source: `${source.title} — ${source.url}`, keyPoints });\n } catch {\n // Skip sources that fail\n }\n }\n\n return findings;\n}\n\nasync function discoverCodebase(\n topic: string,\n registry: ToolRegistry,\n): Promise<SourceEntry[]> {\n if (!registry.has(\"shell\")) {\n throw new Error(\"shell tool not available\");\n }\n\n const sources: SourceEntry[] = [];\n let targetDir = topic;\n\n // If topic is a URL, clone it\n if (topic.startsWith(\"http://\") || topic.startsWith(\"https://\") || topic.startsWith(\"git@\")) {\n const slug = slugify(topic.split(\"/\").pop()?.replace(\".git\", \"\") || \"repo\");\n const cloneDir = `/tmp/learn-${slug}`;\n const cloneResult = await registry.execute(\"shell\", {\n command: `rm -rf ${cloneDir} && git clone --depth 1 ${topic} ${cloneDir} 2>&1 | tail -1`,\n });\n if (cloneResult.toLowerCase().includes(\"fatal\")) {\n throw new Error(`Failed to clone: ${cloneResult}`);\n }\n targetDir = cloneDir;\n }\n\n // Find source files\n const fileList = await registry.execute(\"shell\", {\n command: `find ${targetDir} -type f \\\\( -name '*.ts' -o -name '*.tsx' -o -name '*.js' -o -name '*.jsx' -o -name '*.py' -o -name '*.rs' -o -name '*.go' -o -name '*.java' \\\\) ! -path '*/node_modules/*' ! -path '*/.git/*' ! -path '*/dist/*' ! -path '*/build/*' | head -50`,\n });\n\n for (const line of fileList.split(\"\\n\").filter(Boolean)) {\n sources.push({ title: line.split(\"/\").pop() || line, url: line, snippet: \"\" });\n }\n\n // Check for README\n if (registry.has(\"read_file\")) {\n const readmeResult = await registry.execute(\"read_file\", { path: `${targetDir}/README.md` });\n if (!readmeResult.startsWith(\"Error:\")) {\n sources.unshift({ title: \"README.md\", url: `${targetDir}/README.md`, snippet: readmeResult.slice(0, 200) });\n }\n }\n\n // Check for package manifest\n const manifestCmd = `cat ${targetDir}/package.json 2>/dev/null || cat ${targetDir}/Cargo.toml 2>/dev/null || cat ${targetDir}/go.mod 2>/dev/null || cat ${targetDir}/pyproject.toml 2>/dev/null || echo \"\"`;\n const manifestResult = await registry.execute(\"shell\", { command: manifestCmd });\n if (manifestResult.trim()) {\n sources.unshift({ title: \"manifest\", url: `${targetDir}/package.json`, snippet: manifestResult.slice(0, 200) });\n }\n\n return sources;\n}\n\nasync function exploreCodebase(\n topic: string,\n sources: SourceEntry[],\n depth: \"shallow\" | \"deep\",\n focusAreas: string[],\n registry: ToolRegistry,\n llm: LLMClient,\n): Promise<Finding[]> {\n const maxFiles = depth === \"deep\" ? 12 : 5;\n const toRead = sources.slice(0, maxFiles);\n const findings: Finding[] = [];\n\n for (const source of toRead) {\n try {\n let content: string;\n if (registry.has(\"read_file\")) {\n content = await registry.execute(\"read_file\", { path: source.url });\n } else {\n content = await registry.execute(\"shell\", { command: `cat \"${source.url}\" 2>/dev/null | head -200` });\n }\n\n if (!content || content.startsWith(\"Error:\")) continue;\n\n const focusClause = focusAreas.length > 0\n ? `Pay special attention to: ${focusAreas.join(\", \")}.`\n : \"\";\n\n const messages: ChatMessage[] = [\n {\n role: \"system\",\n content: \"You are a code analyst. Analyze the given code file concisely. Return a numbered list of key observations.\",\n },\n {\n role: \"user\",\n content: `Analyze this code file from a project about \"${topic}\". Extract: purpose, key exports, patterns used, dependencies. ${focusClause}\\n\\nFile: ${source.title}\\n\\n${content.slice(0, 10000)}`,\n },\n ];\n\n const response = await llm.chat(messages);\n const keyPoints = response.content\n .split(\"\\n\")\n .map((l) => l.replace(/^\\d+[\\.\\)]\\s*/, \"\").trim())\n .filter((l) => l.length > 0);\n\n findings.push({ source: source.title, keyPoints });\n } catch {\n // Skip files that fail\n }\n }\n\n return findings;\n}\n\nasync function synthesize(\n topic: string,\n findings: Finding[],\n focusAreas: string[],\n llm: LLMClient,\n): Promise<string> {\n const findingText = findings\n .map((f) => `### ${f.source}\\n${f.keyPoints.map((p) => `- ${p}`).join(\"\\n\")}`)\n .join(\"\\n\\n\");\n\n const focusClause = focusAreas.length > 0\n ? `\\nFocus areas: ${focusAreas.join(\", \")}`\n : \"\";\n\n const messages: ChatMessage[] = [\n {\n role: \"system\",\n content: [\n \"You are a knowledge synthesizer. Distill research findings into structured, actionable knowledge.\",\n \"Output format:\",\n \"## Core Concepts\",\n \"(key ideas and definitions)\",\n \"## Key Relationships\",\n \"(how concepts connect)\",\n \"## Important Details\",\n \"(specifics worth remembering)\",\n \"## Practical Implications\",\n \"(how to apply this knowledge)\",\n \"\",\n \"Be concise but thorough. Maximum 8000 characters.\",\n ].join(\"\\n\"),\n },\n {\n role: \"user\",\n content: `Synthesize all findings about \"${topic}\" into structured knowledge.${focusClause}\\n\\n${findingText}`,\n },\n ];\n\n const response = await llm.chat(messages);\n return response.content.slice(0, 8000);\n}\n\nasync function storeInMemory(\n contextName: string,\n topic: string,\n findings: Finding[],\n synthesis: string,\n daemonUrl: string,\n): Promise<string[]> {\n const storedIds: string[] = [];\n\n // 1. Create the learn context\n try {\n await fetch(`${daemonUrl}/contexts`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n name: contextName,\n description: `Learned knowledge: ${topic}`,\n }),\n });\n } catch {\n // Context may already exist — that's fine\n }\n\n // 2. Store each finding as an L2 episode\n for (const finding of findings) {\n const content = `[Source: ${finding.source}]\\n${finding.keyPoints.join(\"\\n\")}`;\n try {\n const resp = await fetch(`${daemonUrl}/episodes`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n context_name: contextName,\n role: \"system\",\n content,\n }),\n });\n if (resp.ok) {\n const data = (await resp.json()) as { id?: string };\n if (data.id) storedIds.push(data.id);\n }\n } catch {\n // Continue storing other findings\n }\n }\n\n // 3. Store synthesis as a summary episode\n try {\n const resp = await fetch(`${daemonUrl}/episodes`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n context_name: contextName,\n role: \"assistant\",\n content: `[SYNTHESIS: ${topic}]\\n${synthesis}`,\n }),\n });\n if (resp.ok) {\n const data = (await resp.json()) as { id?: string };\n if (data.id) storedIds.push(data.id);\n }\n } catch {\n // Non-fatal\n }\n\n // 4. Trigger promotion pipeline\n try {\n await fetch(`${daemonUrl}/promotion/run?context=${encodeURIComponent(contextName)}`, {\n method: \"POST\",\n });\n } catch {\n // Non-fatal — promotion will run on its regular schedule\n }\n\n return storedIds;\n}\n\n// ---------------------------------------------------------------------------\n// Tool registration\n// ---------------------------------------------------------------------------\n\nexport function registerLearnTools(registry: ToolRegistry, config: LearnConfig): void {\n // Build LLM client for internal synthesis calls (reuses agent's config)\n let llm: LLMClient | null = null;\n if (config.llmConfig) {\n try {\n // Use smaller max_tokens for extraction — synthesis gets 4096\n llm = new LLMClient({\n ...config.llmConfig,\n max_tokens: 2048,\n });\n } catch {\n // LLM not available — tool will return graceful error\n }\n }\n\n let synthesisLlm: LLMClient | null = null;\n if (config.llmConfig) {\n try {\n synthesisLlm = new LLMClient({\n ...config.llmConfig,\n max_tokens: 4096,\n });\n } catch {\n // Non-fatal\n }\n }\n\n // --- learn ---\n registry.register(\n \"learn\",\n [\n \"Deeply research a topic and store organized knowledge in memory.\",\n \"Supports two modes: 'research' (web search + fetch) and 'codebase' (local/remote repo analysis).\",\n \"Findings are synthesized via LLM and stored as L2 episodes in a dedicated memory context,\",\n \"eligible for L3 promotion. Use this when you need thorough understanding of a topic.\",\n ].join(\" \"),\n {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description: \"What to learn about (e.g., 'WebSocket protocol', '/path/to/repo', 'https://github.com/user/repo')\",\n },\n type: {\n type: \"string\",\n enum: [\"research\", \"codebase\"],\n description: \"Learning type: 'research' for web-based topics, 'codebase' for analyzing code (default: research)\",\n },\n depth: {\n type: \"string\",\n enum: [\"shallow\", \"deep\"],\n description: \"How many sources to explore: shallow (3 sources) or deep (6+ sources) (default: shallow)\",\n },\n context: {\n type: \"string\",\n description: \"Custom memory context name (default: auto-generated learn-{slug})\",\n },\n focus_areas: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Specific aspects to focus on (e.g., ['performance', 'security'])\",\n },\n store: {\n type: \"boolean\",\n description: \"Whether to persist findings in memory (default: true)\",\n },\n },\n required: [\"topic\"],\n },\n async (params) => {\n const topic = params.topic as string;\n const type = (params.type as \"research\" | \"codebase\") || \"research\";\n const depth = (params.depth as \"shallow\" | \"deep\") || \"shallow\";\n const contextName = (params.context as string) || `learn-${slugify(topic)}`;\n const focusAreas = (params.focus_areas as string[]) || [];\n const shouldStore = params.store !== false;\n\n if (!llm || !synthesisLlm) {\n return \"Error: LLM not configured — learn tool requires an LLM for synthesis. Check your llm config.\";\n }\n\n try {\n // Stage 1: Discover sources\n let sources: SourceEntry[];\n if (type === \"codebase\") {\n sources = await discoverCodebase(topic, registry);\n } else {\n sources = await discoverResearch(topic, depth, registry);\n }\n\n if (sources.length === 0) {\n return `No sources found for \"${topic}\". Try a different query or check connectivity.`;\n }\n\n // Stage 2: Explore and extract findings\n let findings: Finding[];\n if (type === \"codebase\") {\n findings = await exploreCodebase(topic, sources, depth, focusAreas, registry, llm);\n } else {\n findings = await exploreResearch(topic, sources, depth, focusAreas, registry, llm);\n }\n\n if (findings.length === 0) {\n return `Found ${sources.length} sources but could not extract meaningful findings for \"${topic}\".`;\n }\n\n // Stage 3: Synthesize\n const synthesis = await synthesize(topic, findings, focusAreas, synthesisLlm);\n\n // Stage 4: Store in memory (optional)\n let storageNote = \"\";\n if (shouldStore) {\n const storedIds = await storeInMemory(\n contextName,\n topic,\n findings,\n synthesis,\n config.memoryDaemonUrl,\n );\n storageNote = storedIds.length > 0\n ? `\\n\\n---\\nStored ${storedIds.length} episodes in memory context \"${contextName}\". Use learn_recall to retrieve later.`\n : \"\\n\\n---\\nNote: Could not store in memory (daemon may be offline). Knowledge is shown above but not persisted.\";\n }\n\n return `# Learned: ${topic}\\n\\nSources explored: ${findings.length}\\nType: ${type} | Depth: ${depth}\\n\\n${synthesis}${storageNote}`;\n } catch (err) {\n return `Learn failed: ${(err as Error).message}`;\n }\n },\n );\n\n // --- learn_recall ---\n registry.register(\n \"learn_recall\",\n \"Retrieve knowledge from a previous learn session. Searches across learn-* memory contexts for stored findings and synthesis.\",\n {\n type: \"object\",\n properties: {\n topic: {\n type: \"string\",\n description: \"Search query to find previously learned knowledge\",\n },\n context: {\n type: \"string\",\n description: \"Specific learn context to search (e.g., 'learn-websocket-protocol'). If omitted, searches all learn contexts.\",\n },\n },\n required: [\"topic\"],\n },\n async (params) => {\n const topic = params.topic as string;\n const context = params.context as string | undefined;\n const daemonUrl = config.memoryDaemonUrl;\n\n try {\n if (context) {\n // Search in a specific learn context\n const searchParams = new URLSearchParams({ q: topic, context, limit: \"10\" });\n const resp = await fetch(`${daemonUrl}/search?${searchParams}`);\n\n if (!resp.ok) return `Memory search failed: ${resp.status}`;\n\n const data = (await resp.json()) as {\n episodes: Array<{ content: string; role: string; score: number }>;\n };\n\n if (!data.episodes?.length) return `No learned knowledge found for \"${topic}\" in context \"${context}\".`;\n\n return data.episodes\n .map((r, i) => `${i + 1}. [score: ${r.score.toFixed(3)}] [${r.role}]\\n${r.content.slice(0, 500)}`)\n .join(\"\\n\\n\");\n }\n\n // Search across all contexts, then filter to learn-* contexts\n const crossParams = new URLSearchParams({ q: topic, limit: \"15\" });\n const resp = await fetch(`${daemonUrl}/search/cross-context?${crossParams}`);\n\n if (!resp.ok) return `Memory cross-search failed: ${resp.status}`;\n\n const data = (await resp.json()) as {\n results: Array<{ context: string; episodes: Array<{ content: string; role: string; score: number }> }>;\n };\n\n // Flatten grouped results and filter to learn-* contexts only\n const learnResults: Array<{ content: string; role: string; context_name: string; score: number }> = [];\n for (const group of data.results || []) {\n if (group.context.startsWith(\"learn-\")) {\n for (const ep of group.episodes) {\n learnResults.push({ ...ep, context_name: group.context });\n }\n }\n }\n\n if (learnResults.length === 0) {\n return `No previously learned knowledge found for \"${topic}\". Use the learn tool first.`;\n }\n\n // Sort by score descending\n learnResults.sort((a, b) => b.score - a.score);\n\n return learnResults\n .map((r, i) => `${i + 1}. [score: ${r.score.toFixed(3)}] [${r.context_name}] [${r.role}]\\n${r.content.slice(0, 500)}`)\n .join(\"\\n\\n\");\n } catch (err) {\n return `Memory daemon unreachable: ${(err as Error).message}`;\n }\n },\n );\n}\n","import { ToolRegistry } from \"../tool-registry.js\";\nimport { registerShellTool } from \"./shell.js\";\nimport { registerFileTools } from \"./files.js\";\nimport { registerWebTools } from \"./web.js\";\nimport { registerMemoryTools } from \"./memory.js\";\nimport { registerEventTools } from \"./events.js\";\nimport { registerSpawnTools } from \"./spawn.js\";\nimport { registerVisionTools } from \"./vision.js\";\nimport { registerGitTools } from \"./git.js\";\nimport { registerBrowserTools } from \"./browser.js\";\nimport { registerSystemTools } from \"./system.js\";\nimport { registerHttpTools } from \"./http-server.js\";\nimport { registerWatchTools } from \"./watch.js\";\nimport { registerMacOSTools } from \"./macos.js\";\nimport { registerDataTools } from \"./data.js\";\nimport { registerCodingAgentTools } from \"./coding-agent.js\";\nimport { registerLearnTools } from \"./learn.js\";\nimport { resolve } from \"path\";\nimport { mkdirSync, existsSync } from \"fs\";\nimport type { LLMConfig } from \"../config.js\";\n\nexport interface ToolConfig {\n enabled?: boolean;\n workspace?: string; // workspace dir relative to HIVEMIND_HOME\n braveApiKey?: string;\n memoryDaemonUrl?: string;\n maxIterations?: number;\n shellTimeoutS?: number;\n configPath?: string; // path to config file (needed for spawn tools)\n llmConfig?: LLMConfig; // LLM config for tools that make internal LLM calls (learn)\n}\n\nexport function registerAllTools(\n hivemindHome: string,\n config?: ToolConfig,\n): ToolRegistry {\n const registry = new ToolRegistry();\n\n if (config?.enabled === false) {\n return registry; // Return empty registry — no tools\n }\n\n const workspaceDir = resolve(hivemindHome, config?.workspace || \"workspace\");\n if (!existsSync(workspaceDir)) {\n mkdirSync(workspaceDir, { recursive: true });\n }\n\n registerShellTool(registry, workspaceDir);\n registerFileTools(registry, workspaceDir);\n registerWebTools(registry, { braveApiKey: config?.braveApiKey });\n registerMemoryTools(registry, config?.memoryDaemonUrl || \"http://localhost:3434\");\n\n const dataDir = resolve(hivemindHome, \"data\");\n registerEventTools(registry, dataDir);\n\n // Spawn tools need configPath to fork child processes with the same config.\n // Only register if configPath is available (not in spawn-task mode to prevent recursive spawning).\n if (config?.configPath && !process.env.SPAWN_TASK) {\n registerSpawnTools(registry, hivemindHome, dataDir, config.configPath);\n }\n\n registerVisionTools(registry);\n registerGitTools(registry, workspaceDir);\n registerBrowserTools(registry, workspaceDir);\n registerSystemTools(registry);\n registerHttpTools(registry, workspaceDir);\n registerWatchTools(registry, workspaceDir, dataDir);\n registerMacOSTools(registry, workspaceDir);\n registerDataTools(registry, workspaceDir);\n registerCodingAgentTools(registry, workspaceDir);\n registerLearnTools(registry, {\n llmConfig: config?.llmConfig,\n memoryDaemonUrl: config?.memoryDaemonUrl || \"http://localhost:3434\",\n workspaceDir,\n });\n\n return registry;\n}\n","import type { ToolRegistry } from \"../tool-registry.js\";\nimport type { SesameClient } from \"../sesame.js\";\n\n/**\n * Messaging tools — let the agent proactively send messages to Sesame channels.\n * Registered separately from other tools because it needs the SesameClient,\n * which is only available after connection.\n */\nexport function registerMessagingTools(registry: ToolRegistry, sesame: SesameClient): void {\n // --- send_message ---\n registry.register(\n \"send_message\",\n \"Send a message to a Sesame channel. Use this to proactively reach out to a user or group, not just reply to incoming messages.\",\n {\n type: \"object\",\n properties: {\n channelId: {\n type: \"string\",\n description: \"The Sesame channel ID to send the message to\",\n },\n content: {\n type: \"string\",\n description: \"The message content to send\",\n },\n },\n required: [\"channelId\", \"content\"],\n },\n async (params) => {\n const channelId = params.channelId as string;\n const content = params.content as string;\n\n try {\n await sesame.sendMessage(channelId, content);\n return `Message sent to channel ${channelId}`;\n } catch (err) {\n return `Error sending message: ${(err as Error).message}`;\n }\n },\n );\n}\n","import { existsSync, mkdirSync, writeFileSync, rmSync } from \"fs\";\nimport { resolve } from \"path\";\nimport type { ToolRegistry } from \"../tool-registry.js\";\nimport type { SkillsEngine } from \"../skills.js\";\n\nexport function registerSkillsTools(\n registry: ToolRegistry,\n skillsEngine: SkillsEngine,\n workspaceDir: string,\n): void {\n const skillsDir = resolve(workspaceDir, \"skills\");\n\n // --- skill_list ---\n registry.register(\n \"skill_list\",\n \"List all loaded skills with their registered tools and status.\",\n {\n type: \"object\",\n properties: {},\n required: [],\n },\n async () => {\n const skills = skillsEngine.listSkills();\n if (skills.length === 0) {\n return \"No skills loaded. Create one with skill_create or add a SKILL.md to workspace/skills/<name>/.\";\n }\n\n const lines: string[] = [];\n for (const skill of skills) {\n let line = `${skill.dirName} — \"${skill.name}\"`;\n if (skill.description) line += `: ${skill.description}`;\n if (skill.tools.length > 0) {\n line += `\\n tools: ${skill.tools.join(\", \")}`;\n } else {\n line += `\\n tools: (none)`;\n }\n lines.push(line);\n }\n return `${skills.length} skill(s) loaded:\\n\\n${lines.join(\"\\n\\n\")}`;\n },\n );\n\n // --- skill_create ---\n registry.register(\n \"skill_create\",\n \"Create a new skill with optional tool definitions. Creates the skill directory, SKILL.md, and optionally tools.json, then auto-loads it.\",\n {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"Directory name for the skill (lowercase, hyphens ok)\",\n },\n description: {\n type: \"string\",\n description: \"Human-readable description of what the skill does\",\n },\n tools: {\n type: \"array\",\n description: \"Optional array of tool definitions (each with name, description, parameters, command)\",\n items: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n description: { type: \"string\" },\n parameters: { type: \"object\" },\n command: { type: \"string\" },\n },\n required: [\"name\", \"command\"],\n },\n },\n },\n required: [\"name\", \"description\"],\n },\n async (params) => {\n const name = params.name as string;\n const description = params.description as string;\n const tools = params.tools as Array<{\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n command: string;\n }> | undefined;\n\n const skillDir = resolve(skillsDir, name);\n if (existsSync(skillDir)) {\n return `Error: Skill directory \"${name}\" already exists. Use skill_reload to update it.`;\n }\n\n mkdirSync(skillDir, { recursive: true });\n\n // Write SKILL.md with frontmatter\n const skillMd = `---\\nname: \"${name}\"\\ndescription: \"${description}\"\\n---\\n\\n# ${name}\\n\\n${description}\\n`;\n writeFileSync(resolve(skillDir, \"SKILL.md\"), skillMd);\n\n // Write tools.json if tools provided\n if (tools && tools.length > 0) {\n const toolsDef = {\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description || `Tool from skill \"${name}\"`,\n parameters: t.parameters || { type: \"object\", properties: {}, required: [] },\n command: t.command,\n })),\n };\n writeFileSync(resolve(skillDir, \"tools.json\"), JSON.stringify(toolsDef, null, 2) + \"\\n\");\n }\n\n // Auto-load\n try {\n await skillsEngine.loadSkill(name);\n } catch (err) {\n return `Skill files created at ${skillDir} but failed to load: ${(err as Error).message}`;\n }\n\n const toolSuffix = tools && tools.length > 0\n ? ` with ${tools.length} tool(s): ${tools.map((t) => t.name).join(\", \")}`\n : \"\";\n return `Skill \"${name}\" created${toolSuffix} and loaded.\\nPath: ${skillDir}`;\n },\n );\n\n // --- skill_reload ---\n registry.register(\n \"skill_reload\",\n \"Reload a skill to pick up file changes (re-reads SKILL.md and tools.json, re-runs setup.sh).\",\n {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"The directory name of the skill to reload\",\n },\n },\n required: [\"name\"],\n },\n async (params) => {\n const name = params.name as string;\n try {\n await skillsEngine.reloadSkill(name);\n const skill = skillsEngine.getSkill(name);\n if (!skill) return `Error: Skill \"${name}\" not found after reload.`;\n const toolSuffix = skill.tools.length > 0\n ? ` (tools: ${skill.tools.join(\", \")})`\n : \" (no tools)\";\n return `Skill \"${skill.name}\" reloaded${toolSuffix}.`;\n } catch (err) {\n return `Error reloading skill \"${name}\": ${(err as Error).message}`;\n }\n },\n );\n\n // --- skill_delete ---\n registry.register(\n \"skill_delete\",\n \"Delete a skill entirely — unloads it, removes its tools, and deletes the skill directory.\",\n {\n type: \"object\",\n properties: {\n name: {\n type: \"string\",\n description: \"The directory name of the skill to delete\",\n },\n },\n required: [\"name\"],\n },\n async (params) => {\n const name = params.name as string;\n const skillDir = resolve(skillsDir, name);\n\n if (!existsSync(skillDir)) {\n return `Error: Skill directory \"${name}\" does not exist.`;\n }\n\n // Unload first (teardown + remove tools)\n try {\n await skillsEngine.unloadSkill(name);\n } catch (err) {\n console.warn(`[skills] Error during unload of \"${name}\":`, (err as Error).message);\n }\n\n // Remove the directory\n try {\n rmSync(skillDir, { recursive: true, force: true });\n } catch (err) {\n return `Skill unloaded but failed to delete directory: ${(err as Error).message}`;\n }\n\n return `Skill \"${name}\" deleted.`;\n },\n );\n}\n","/**\n * Worker-side HTTP server that exposes endpoints for the Primary to call.\n *\n * Uses Node's built-in http module — no external framework needed for these few routes.\n *\n * Endpoints:\n * GET /health — Health check\n * POST /assign — Accept a context assignment\n * DELETE /assign/:contextName — Release a context\n * GET /status — Current activity status\n */\n\nimport { createServer, type Server, type IncomingMessage, type ServerResponse } from \"http\";\nimport type {\n WorkerHealthResponse,\n WorkerStatusReport,\n ContextAssignRequest,\n ContextAssignResponse,\n ContextAssignment,\n SyncPushRequest,\n SyncPushResponse,\n} from \"./worker-protocol.js\";\n\nexport interface WorkerServerOptions {\n workerId: string;\n port: number;\n maxContexts?: number;\n memoryDaemonUrl?: string;\n ollamaUrl?: string;\n}\n\nexport class WorkerServer {\n private server: Server | null = null;\n private workerId: string;\n private port: number;\n private startTime: number;\n private assignedContexts: Map<string, ContextAssignment> = new Map();\n private activeContext: string | null = null;\n private currentTask: string | null = null;\n private maxContexts: number;\n private memoryDaemonUrl: string | null;\n private ollamaUrl: string | null;\n private onAssignCallback: ((contextName: string, description: string) => void) | null = null;\n private onSyncPushCallback: ((req: SyncPushRequest) => Promise<SyncPushResponse>) | null = null;\n\n constructor(opts: WorkerServerOptions) {\n this.workerId = opts.workerId;\n this.port = opts.port;\n this.startTime = Date.now();\n this.maxContexts = opts.maxContexts ?? 4;\n this.memoryDaemonUrl = opts.memoryDaemonUrl ?? null;\n this.ollamaUrl = opts.ollamaUrl ?? null;\n }\n\n /** Start listening. */\n async start(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.server = createServer((req, res) => this.handleRequest(req, res));\n\n this.server.on(\"error\", reject);\n this.server.listen(this.port, () => resolve());\n });\n }\n\n /** Stop the server. */\n async stop(): Promise<void> {\n return new Promise((resolve) => {\n if (!this.server) {\n resolve();\n return;\n }\n this.server.close(() => resolve());\n });\n }\n\n getPort(): number {\n return this.port;\n }\n\n getAssignedContexts(): string[] {\n return Array.from(this.assignedContexts.keys());\n }\n\n setActiveContext(name: string | null): void {\n this.activeContext = name;\n }\n\n setCurrentTask(taskId: string | null): void {\n this.currentTask = taskId;\n }\n\n /** Register a callback for when a new context is assigned. */\n onContextAssigned(cb: (contextName: string, description: string) => void): void {\n this.onAssignCallback = cb;\n }\n\n /** Register a handler for incoming sync push requests from Primary. */\n onSyncPush(cb: (req: SyncPushRequest) => Promise<SyncPushResponse>): void {\n this.onSyncPushCallback = cb;\n }\n\n // --- Request Router ---\n\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", `http://localhost:${this.port}`);\n const path = url.pathname;\n const method = req.method ?? \"GET\";\n\n try {\n if (method === \"GET\" && path === \"/health\") {\n return this.handleHealth(res);\n }\n\n if (method === \"POST\" && path === \"/assign\") {\n const body = await readBody(req);\n return this.handleAssign(body, res);\n }\n\n // DELETE /assign/:contextName\n if (method === \"DELETE\" && path.startsWith(\"/assign/\")) {\n const contextName = decodeURIComponent(path.slice(\"/assign/\".length));\n return this.handleUnassign(contextName, res);\n }\n\n if (method === \"GET\" && path === \"/status\") {\n return this.handleStatus(res);\n }\n\n if (method === \"POST\" && path === \"/sync/push\") {\n const body = await readBody(req);\n return this.handleSyncPush(body, res);\n }\n\n sendJson(res, 404, { error: \"Not found\" });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n sendJson(res, 500, { error: msg });\n }\n }\n\n // --- Handlers ---\n\n private handleHealth(res: ServerResponse): void {\n const uptimeMs = Date.now() - this.startTime;\n\n const body: WorkerHealthResponse = {\n worker_id: this.workerId,\n status: \"healthy\",\n uptime_seconds: Math.floor(uptimeMs / 1000),\n assigned_contexts: Array.from(this.assignedContexts.keys()),\n active_context: this.activeContext,\n memory_daemon_ok: this.memoryDaemonUrl !== null,\n ollama_ok: this.ollamaUrl !== null,\n };\n\n sendJson(res, 200, body);\n }\n\n private handleAssign(raw: string, res: ServerResponse): void {\n const req = JSON.parse(raw) as ContextAssignRequest;\n\n if (this.assignedContexts.size >= this.maxContexts) {\n const body: ContextAssignResponse = {\n context_name: req.context_name,\n accepted: false,\n reason: \"Worker at max context capacity\",\n };\n sendJson(res, 200, body);\n return;\n }\n\n const assignment: ContextAssignment = {\n context_name: req.context_name,\n context_description: req.context_description,\n assigned_at: new Date().toISOString(),\n };\n\n this.assignedContexts.set(req.context_name, assignment);\n\n // Notify the worker runtime about the new context\n if (this.onAssignCallback) {\n this.onAssignCallback(req.context_name, req.context_description);\n }\n\n const body: ContextAssignResponse = {\n context_name: req.context_name,\n accepted: true,\n };\n sendJson(res, 200, body);\n }\n\n private handleUnassign(contextName: string, res: ServerResponse): void {\n const existed = this.assignedContexts.delete(contextName);\n\n if (this.activeContext === contextName) {\n this.activeContext = null;\n this.currentTask = null;\n }\n\n sendJson(res, existed ? 200 : 404, {\n context_name: contextName,\n removed: existed,\n });\n }\n\n private handleStatus(res: ServerResponse): void {\n const report: WorkerStatusReport = {\n activity: this.currentTask ? \"working\" : \"idle\",\n current_context: this.activeContext,\n current_task: this.currentTask,\n };\n\n sendJson(res, 200, report);\n }\n\n private async handleSyncPush(raw: string, res: ServerResponse): Promise<void> {\n if (!this.onSyncPushCallback) {\n sendJson(res, 501, { error: \"Sync push handler not registered\" });\n return;\n }\n\n const req = JSON.parse(raw) as SyncPushRequest;\n const result = await this.onSyncPushCallback(req);\n sendJson(res, 200, result);\n }\n}\n\n// --- Helpers ---\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\n\nfunction sendJson(res: ServerResponse, status: number, body: unknown): void {\n const payload = JSON.stringify(body);\n res.writeHead(status, {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(payload),\n });\n res.end(payload);\n}\n","/**\n * Shared types for Primary <-> Worker communication protocol.\n *\n * Communication is HTTP-based:\n * - Primary calls Worker endpoints to assign contexts, check health\n * - Worker calls Primary endpoints to register, report status\n */\n\n// --- Worker Identity & Registration ---\n\nexport interface WorkerInfo {\n id: string;\n url: string;\n capabilities: WorkerCapabilities;\n assigned_contexts: string[];\n registered_at: string;\n last_heartbeat: string;\n}\n\nexport interface WorkerCapabilities {\n max_contexts: number;\n has_ollama: boolean;\n has_memory_daemon: boolean;\n available_models: string[];\n}\n\nexport interface WorkerRegistrationRequest {\n url: string;\n capabilities: WorkerCapabilities;\n}\n\nexport interface WorkerRegistrationResponse {\n worker_id: string;\n registered_at: string;\n}\n\n// --- Health Checks ---\n\nexport type WorkerHealthStatus = \"healthy\" | \"degraded\" | \"unreachable\";\n\nexport interface WorkerHealthResponse {\n worker_id: string;\n status: WorkerHealthStatus;\n uptime_seconds: number;\n assigned_contexts: string[];\n active_context: string | null;\n memory_daemon_ok: boolean;\n ollama_ok: boolean;\n}\n\n// --- Context Assignment ---\n\nexport interface ContextAssignment {\n context_name: string;\n context_description: string;\n assigned_at: string;\n}\n\nexport interface ContextAssignRequest {\n context_name: string;\n context_description: string;\n}\n\nexport interface ContextAssignResponse {\n context_name: string;\n accepted: boolean;\n reason?: string;\n}\n\n// --- Worker Status Reporting ---\n\nexport type WorkerActivity = \"idle\" | \"working\" | \"error\";\n\nexport interface WorkerStatus {\n worker_id: string;\n activity: WorkerActivity;\n current_context: string | null;\n current_task: string | null;\n error?: string;\n reported_at: string;\n}\n\nexport interface WorkerStatusReport {\n activity: WorkerActivity;\n current_context: string | null;\n current_task: string | null;\n error?: string;\n}\n\n// --- Memory Sync ---\n\n/** L3 knowledge entries synced from Worker to Primary. */\nexport interface SyncPullRequest {\n worker_id: string;\n context_name: string;\n entries: SyncL3Entry[];\n}\n\n/** An L3 entry with a last-modified timestamp for conflict resolution. */\nexport interface SyncL3Entry {\n id: string;\n source_episode_id: string;\n context_name: string;\n content: string;\n promoted_at: string;\n access_count: number;\n connection_density: number;\n updated_at: string;\n}\n\nexport interface SyncPullResponse {\n accepted: number;\n rejected: number;\n}\n\n/** Global context updates pushed from Primary to Worker. */\nexport interface SyncPushRequest {\n entries: SyncL3Entry[];\n episodes: SyncL2Episode[];\n}\n\n/** L2 episodes synced as append-only (no conflict resolution needed). */\nexport interface SyncL2Episode {\n id: string;\n timestamp: string;\n context_name: string;\n role: string;\n content: string;\n}\n\nexport interface SyncPushResponse {\n l3_accepted: number;\n l2_appended: number;\n}\n\n// --- Protocol Constants ---\n\nexport const WORKER_API_PREFIX = \"/workers\";\n\n/** Primary-side routes (Worker calls these) */\nexport const PRIMARY_ROUTES = {\n register: `${WORKER_API_PREFIX}/register`,\n status: (workerId: string) => `${WORKER_API_PREFIX}/${encodeURIComponent(workerId)}/status`,\n syncPull: `${WORKER_API_PREFIX}/sync/pull`,\n} as const;\n\n/** Worker-side routes (Primary calls these) */\nexport const WORKER_ROUTES = {\n health: \"/health\",\n assign: \"/assign\",\n unassign: (contextName: string) => `/assign/${encodeURIComponent(contextName)}`,\n status: \"/status\",\n syncPush: \"/sync/push\",\n} as const;\n\nexport const DEFAULT_HEALTH_INTERVAL_MS = 30_000;\nexport const HEALTH_TIMEOUT_MS = 5_000;\nexport const DEFAULT_SYNC_INTERVAL_MS = 60_000;\n","/**\n * Worker mode entry point — distributed context execution.\n *\n * A worker runs autonomously on a separate machine:\n * 1. Starts its HTTP server (for Primary to manage it)\n * 2. Registers with the Primary node\n * 3. Connects to the local memory daemon\n * 4. Picks up tasks from assigned context queues\n * 5. Executes tasks using the agent loop (query memory, call LLM, store episodes)\n * 6. Reports status back to Primary via HTTP\n */\n\nimport type { HivemindConfig, WorkerModeConfig } from \"./config.js\";\nimport type { WorkerRegistrationRequest, WorkerRegistrationResponse, WorkerStatusReport } from \"./fleet/worker-protocol.js\";\nimport { PRIMARY_ROUTES } from \"./fleet/worker-protocol.js\";\nimport { WorkerServer } from \"./fleet/worker-server.js\";\nimport { Agent } from \"./agent.js\";\nimport { MemoryClient } from \"./memory-client.js\";\nimport { TaskEngine } from \"./task-engine.js\";\n\nexport interface WorkerRuntimeOptions {\n config: HivemindConfig;\n workerConfig: WorkerModeConfig;\n}\n\nexport class WorkerRuntime {\n private config: HivemindConfig;\n private workerConfig: WorkerModeConfig;\n private server: WorkerServer;\n private memory: MemoryClient;\n private agent: Agent;\n private taskPollTimer: ReturnType<typeof setInterval> | null = null;\n private statusReportTimer: ReturnType<typeof setInterval> | null = null;\n private registeredWorkerId: string | null = null;\n private running = false;\n private executing = false;\n\n constructor(opts: WorkerRuntimeOptions) {\n this.config = opts.config;\n this.workerConfig = opts.workerConfig;\n\n this.server = new WorkerServer({\n workerId: this.workerConfig.worker_id,\n port: this.workerConfig.worker_port,\n maxContexts: this.workerConfig.max_contexts,\n memoryDaemonUrl: this.config.memory.daemon_url,\n ollamaUrl: this.config.ollama.base_url,\n });\n\n this.memory = new MemoryClient(this.config.memory);\n this.agent = new Agent(this.config);\n }\n\n /**\n * Start the worker: HTTP server, register with Primary, begin task loop.\n */\n async start(): Promise<void> {\n this.running = true;\n\n // 1. Start the worker HTTP server\n this.server.onContextAssigned((contextName, description) => {\n console.log(`[worker] Context assigned: \"${contextName}\" — ${description || \"(no description)\"}`);\n // Create the context in the local memory daemon\n this.memory.createContext(contextName, description).catch((err) => {\n console.warn(`[worker] Failed to create context \"${contextName}\" in daemon:`, (err as Error).message);\n });\n });\n await this.server.start();\n console.log(`[worker] HTTP server listening on port ${this.workerConfig.worker_port}`);\n\n // 2. Verify local memory daemon is reachable\n const memoryOk = await this.memory.healthCheck();\n if (memoryOk) {\n console.log(\"[worker] Local memory daemon connected\");\n } else {\n console.warn(\"[worker] Memory daemon unreachable at\", this.config.memory.daemon_url);\n console.warn(\"[worker] Continuing — episodes will not be stored until daemon is available\");\n }\n\n // 3. Register with Primary\n await this.registerWithPrimary();\n\n // 4. Start the task execution loop\n this.startTaskLoop();\n\n // 5. Start periodic status reporting\n this.startStatusReporting();\n\n console.log(\"[worker] Ready — waiting for context assignments\");\n }\n\n /**\n * Stop the worker gracefully.\n */\n async stop(): Promise<void> {\n this.running = false;\n\n if (this.taskPollTimer) {\n clearInterval(this.taskPollTimer);\n this.taskPollTimer = null;\n }\n\n if (this.statusReportTimer) {\n clearInterval(this.statusReportTimer);\n this.statusReportTimer = null;\n }\n\n await this.server.stop();\n console.log(\"[worker] Stopped\");\n }\n\n /**\n * Register this worker with the Primary node.\n */\n async registerWithPrimary(): Promise<WorkerRegistrationResponse | null> {\n const workerUrl = `http://localhost:${this.workerConfig.worker_port}`;\n\n const registration: WorkerRegistrationRequest = {\n url: workerUrl,\n capabilities: {\n max_contexts: this.workerConfig.max_contexts,\n has_ollama: true,\n has_memory_daemon: true,\n available_models: [this.config.memory.embedding_model],\n },\n };\n\n try {\n const resp = await fetch(\n `${this.workerConfig.primary_url}${PRIMARY_ROUTES.register}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(registration),\n },\n );\n\n if (!resp.ok) {\n console.error(`[worker] Registration failed: ${resp.status} ${await resp.text()}`);\n return null;\n }\n\n const result = (await resp.json()) as WorkerRegistrationResponse;\n this.registeredWorkerId = result.worker_id;\n console.log(`[worker] Registered with Primary as ${result.worker_id}`);\n return result;\n } catch (err) {\n console.error(\"[worker] Could not reach Primary at\", this.workerConfig.primary_url);\n console.error(\"[worker] Will continue in standalone mode — retry registration manually\");\n return null;\n }\n }\n\n /**\n * Start the task execution polling loop.\n * Iterates assigned contexts and picks up tasks from each queue.\n */\n startTaskLoop(): void {\n this.taskPollTimer = setInterval(() => {\n if (!this.running || this.executing) return;\n this.executeNextTask().catch((err) => {\n console.error(\"[worker] Task execution error:\", (err as Error).message);\n });\n }, this.workerConfig.task_poll_interval_ms);\n }\n\n /**\n * Find and execute the next available task across all assigned contexts.\n */\n async executeNextTask(): Promise<void> {\n const contexts = this.server.getAssignedContexts();\n if (contexts.length === 0) return;\n\n for (const contextName of contexts) {\n const engine = new TaskEngine({ contextName, memory: this.memory });\n const task = await engine.getNextTask();\n\n if (task) {\n this.executing = true;\n\n try {\n // Update worker status\n this.server.setActiveContext(contextName);\n this.server.setCurrentTask(task.id);\n\n console.log(`[worker] Executing task [${task.id.slice(0, 8)}] \"${task.title}\" in context \"${contextName}\"`);\n\n // Mark task as active\n await engine.startTask(task.id);\n\n // Switch agent to the correct context\n this.agent.setContext(contextName);\n\n // Ensure context exists in memory daemon\n try {\n await this.memory.createContext(contextName);\n } catch {\n // Context may already exist\n }\n\n // Execute the task via the agent loop:\n // - Agent queries memory for relevant episodes\n // - Builds prompt with context + memories\n // - Calls LLM for a response\n // - Stores episodes (write-through to L2)\n // - Triggers promotion if needed\n const taskPrompt = buildTaskPrompt(task.title, task.description);\n const response = await this.agent.processMessage(taskPrompt);\n\n console.log(`[worker] Task [${task.id.slice(0, 8)}] completed. Response: ${response.content.slice(0, 100)}...`);\n\n // Mark task as complete\n await engine.completeTask(task.id);\n\n // Report status to Primary\n await this.reportStatus(\"working\", contextName, task.id);\n } catch (err) {\n console.error(`[worker] Task [${task.id.slice(0, 8)}] failed:`, (err as Error).message);\n await this.reportStatus(\"error\", contextName, task.id, (err as Error).message);\n } finally {\n this.executing = false;\n this.server.setCurrentTask(null);\n }\n\n // Execute one task per poll cycle to stay responsive\n return;\n }\n }\n\n // No tasks found in any context — go idle\n if (this.server.getAssignedContexts().length > 0) {\n this.server.setActiveContext(null);\n this.server.setCurrentTask(null);\n }\n }\n\n /**\n * Periodically report status back to Primary.\n */\n startStatusReporting(): void {\n this.statusReportTimer = setInterval(() => {\n if (!this.running || !this.registeredWorkerId) return;\n\n const contexts = this.server.getAssignedContexts();\n if (contexts.length === 0) return;\n\n this.reportStatus(\n this.executing ? \"working\" : \"idle\",\n this.executing ? contexts[0] : null,\n null,\n ).catch(() => {});\n }, this.workerConfig.status_report_interval_ms);\n }\n\n /**\n * Send a status report to the Primary.\n */\n async reportStatus(\n activity: \"idle\" | \"working\" | \"error\",\n currentContext: string | null,\n currentTask: string | null,\n error?: string,\n ): Promise<void> {\n if (!this.registeredWorkerId) return;\n\n const report: WorkerStatusReport = {\n activity,\n current_context: currentContext,\n current_task: currentTask,\n error,\n };\n\n try {\n const statusUrl = `${this.workerConfig.primary_url}${PRIMARY_ROUTES.status(this.registeredWorkerId)}`;\n await fetch(statusUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(report),\n });\n } catch {\n // Primary unreachable — non-fatal, will retry next interval\n }\n }\n\n // --- Accessors for testing ---\n\n getServer(): WorkerServer {\n return this.server;\n }\n\n getAgent(): Agent {\n return this.agent;\n }\n\n getMemoryClient(): MemoryClient {\n return this.memory;\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n isExecuting(): boolean {\n return this.executing;\n }\n\n getRegisteredWorkerId(): string | null {\n return this.registeredWorkerId;\n }\n}\n\n/**\n * Build a prompt for executing a task via the agent.\n */\nfunction buildTaskPrompt(title: string, description: string): string {\n let prompt = `[TASK] ${title}`;\n if (description) {\n prompt += `\\n\\n${description}`;\n }\n prompt += \"\\n\\nPlease work on this task. Use your memory and knowledge to provide a thorough response.\";\n return prompt;\n}\n\n/**\n * Start a worker from a config file path (convenience entry point).\n */\nexport async function startWorker(config: HivemindConfig): Promise<WorkerRuntime> {\n if (!config.worker || !config.worker.enabled) {\n throw new Error(\"Worker mode is not enabled in config. Set [worker] enabled = true.\");\n }\n\n const runtime = new WorkerRuntime({\n config,\n workerConfig: config.worker,\n });\n\n await runtime.start();\n return runtime;\n}\n"],"mappings":"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","names":["log","existsSync","readFileSync","join","estimateTokens","resolve","estimateTokens","existsSync","mkdirSync","readdirSync","readFileSync","join","readFileSync","existsSync","resolve","dirname","endPtr","readFileSync","dirname","resolve","existsSync","configDir","resolve","readFileSync","resolve","dirname","__dirname","SesameClient","execSync","existsSync","readFileSync","readdirSync","watch","mkdirSync","resolve","readFileSync","mkdirSync","existsSync","dirname","existsSync","readFileSync","dirname","mkdirSync","readFileSync","statSync","existsSync","startTime","process","log","existsSync","statSync","readFileSync","mkdirSync","writeFileSync","dirname","execSync","readFileSync","existsSync","resolve","log","resolve","existsSync","execSync","readFileSync","createServer","randomUUID","mkdirSync","existsSync","appendFileSync","readFileSync","writeFileSync","dirname","readFileSync","resolve","dirname","fileURLToPath","execSync","resolve","readFileSync","writeFileSync","existsSync","mkdirSync","resolve","dirname","readdirSync","statSync","existsSync","mkdirSync","readdirSync","readFileSync","unlinkSync","writeFileSync","join","randomUUID","existsSync","mkdirSync","readFileSync","writeFileSync","join","resolve","randomUUID","execSync","resolve","resolve","execSync","resolve","mkdirSync","existsSync","randomUUID","MAX_OUTPUT","text","execSync","MAX_OUTPUT","cpus","createServer","existsSync","statSync","join","resolve","watch","existsSync","mkdirSync","writeFileSync","join","resolve","randomUUID","execSync","resolve","normalize","mkdirSync","existsSync","randomUUID","MAX_OUTPUT","execSync","resolve","normalize","extname","mkdirSync","existsSync","MAX_OUTPUT","shellExec","escapeShellArg","truncate","execSync","resolve","MAX_OUTPUT","resp","data","resolve","mkdirSync","existsSync","existsSync","mkdirSync","writeFileSync","resolve","readFileSync","writeFileSync","unlinkSync","resolve","dirname","fileURLToPath","__dirname","createServer","dataDir","SesameClient","prefix","createServer","resolve","readBody","body"]}