@sesamespace/hivemind 0.8.8 → 0.8.10

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../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/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/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":["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(() => {});\n for (const ep of relevantEpisodes) {\n this.memory.recordAccess(ep.id).catch(() => {});\n }\n }\n\n // Fetch L3 semantic knowledge for this context\n const l3Knowledge = await this.memory\n .getL3Knowledge(contextName)\n .catch(() => [] 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","/**\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 HivemindConfig {\n agent: AgentConfig;\n llm: LLMConfig;\n memory: MemoryConfig;\n ollama: OllamaConfig;\n sesame: SesameConfig;\n worker?: WorkerModeConfig;\n sentinel?: SentinelConfig;\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","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 { 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\n const requestLogger = new RequestLogger(resolve(dirname(configPath), \"data\", \"dashboard.db\"));\n startDashboardServer(requestLogger, config.memory);\n\n // Create the agent\n const agent = new Agent(config);\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 });\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 // 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\";\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\nasync function proxyMemory(\n memoryUrl: string,\n path: string,\n method: string,\n res: ServerResponse,\n): Promise<void> {\n try {\n const resp = await fetch(`${memoryUrl}${path}`, { method });\n const body = 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(body);\n } catch (err) {\n json(res, { error: (err as Error).message }, 502);\n }\n}\n\nexport function startDashboardServer(\n requestLogger: RequestLogger,\n memoryConfig: MemoryConfig,\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\n // CORS preflight\n if (method === \"OPTIONS\") {\n res.writeHead(204, {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, 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 // Memory proxy: contexts\n if (method === \"GET\" && urlPath === \"/api/contexts\") {\n await proxyMemory(memoryUrl, \"/contexts\", \"GET\", res);\n return;\n }\n\n // Memory proxy: episodes for context\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 // Memory proxy: L3 for context\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 // Memory proxy: delete L3\n const l3DeleteMatch = urlPath.match(/^\\/api\\/l3\\/([^/]+)$/);\n if (method === \"DELETE\" && l3DeleteMatch) {\n const id = decodeURIComponent(l3DeleteMatch[1]);\n await proxyMemory(memoryUrl, `/promotion/l3/${encodeURIComponent(id)}`, \"DELETE\", res);\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 resp = await fetch(`${daemonUrl}/api/search`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ query, context_name: context, top_k: topK }),\n });\n\n if (!resp.ok) return `Memory search failed: ${resp.status}`;\n\n const data = (await resp.json()) as {\n results: 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.results?.length) return `No memories found for \"${query}\" in context \"${context}\".`;\n\n return data.results\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}/api/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}/api/l3/${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}/api/l3/${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 resp = await fetch(`${daemonUrl}/api/search/cross-context`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ query, top_k: topK }),\n });\n\n if (!resp.ok) return `Cross-context search failed: ${resp.status}`;\n\n const data = (await resp.json()) as {\n results: Array<{\n content: string;\n role: string;\n context_name: string;\n score: number;\n }>;\n };\n\n if (!data.results?.length) return `No memories found across any context for \"${query}\".`;\n\n return data.results\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// Lazy browser lifecycle — single instance, auto-close after 5 min idle\n// ---------------------------------------------------------------------------\n\nlet browserInstance: any = null;\nlet lastUsed = 0;\nlet idleTimer: ReturnType<typeof setInterval> | null = null;\n\nconst IDLE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes\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({ headless: true });\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 closeBrowser(): Promise<void> {\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 a headless browser.\",\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 \"Supports waitForSelector to wait for dynamic content before acting.\",\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: [\"extract\", \"screenshot\", \"click\", \"type\", \"evaluate\"],\n description: \"Action to perform (default: extract).\",\n },\n selector: {\n type: \"string\",\n description: \"CSS selector for click/type actions.\",\n },\n text: {\n type: \"string\",\n description: \"Text to type (for 'type' action).\",\n },\n javascript: {\n type: \"string\",\n description: \"JavaScript to evaluate in the page (for 'evaluate' action).\",\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 waitForSelector = params.waitForSelector as string | undefined;\n const timeout = (params.timeout as number) || 30_000;\n\n let browser: any;\n try {\n browser = await getBrowser();\n } catch (err) {\n return (err as Error).message;\n }\n\n let page: any;\n try {\n page = await browser.newPage({\n 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 });\n page.setDefaultTimeout(timeout);\n\n await page.goto(url, { waitUntil: \"domcontentloaded\", timeout });\n\n if (waitForSelector) {\n await page.waitForSelector(waitForSelector, { timeout });\n }\n\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 \"click\": {\n if (!selector) {\n return \"Error: 'selector' parameter is required for click action.\";\n }\n await page.click(selector);\n return `Clicked: ${selector}`;\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 \"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}. Use: extract, screenshot, click, type, evaluate.`;\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","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","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 { resolve } from \"path\";\nimport { mkdirSync, existsSync } from \"fs\";\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}\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\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":["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","createServer","randomUUID","mkdirSync","existsSync","appendFileSync","readFileSync","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","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","resolve","mkdirSync","existsSync","existsSync","mkdirSync","writeFileSync","resolve","readFileSync","writeFileSync","unlinkSync","resolve","dirname","fileURLToPath","__dirname","createServer","SesameClient","prefix","createServer","resolve","body"]}