@sesamespace/hivemind 0.5.11 → 0.5.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-VRRUD3I5.js → chunk-3GTSMZNL.js} +2 -2
- package/dist/{chunk-7KVMNG6Q.js → chunk-7HIU4UF2.js} +2 -2
- package/dist/{chunk-SCRJ5CKP.js → chunk-KUFSIVPF.js} +3 -3
- package/dist/{chunk-3O2BF2TT.js → chunk-LB6MG36X.js} +12 -4
- package/dist/{chunk-3O2BF2TT.js.map → chunk-LB6MG36X.js.map} +1 -1
- package/dist/{chunk-EHJS5GJT.js → chunk-UJDDOQEE.js} +2 -2
- package/dist/commands/fleet.js +3 -3
- package/dist/commands/start.js +3 -3
- package/dist/commands/watchdog.js +3 -3
- package/dist/index.js +2 -2
- package/dist/main.js +5 -5
- package/dist/start.js +1 -1
- package/package.json +1 -1
- /package/dist/{chunk-VRRUD3I5.js.map → chunk-3GTSMZNL.js.map} +0 -0
- /package/dist/{chunk-7KVMNG6Q.js.map → chunk-7HIU4UF2.js.map} +0 -0
- /package/dist/{chunk-SCRJ5CKP.js.map → chunk-KUFSIVPF.js.map} +0 -0
- /package/dist/{chunk-EHJS5GJT.js.map → chunk-UJDDOQEE.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
FleetManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UJDDOQEE.js";
|
|
4
4
|
|
|
5
5
|
// packages/cli/src/commands/fleet.ts
|
|
6
6
|
function formatUptime(seconds) {
|
|
@@ -183,4 +183,4 @@ Commands:
|
|
|
183
183
|
export {
|
|
184
184
|
runFleetCommand
|
|
185
185
|
};
|
|
186
|
-
//# sourceMappingURL=chunk-
|
|
186
|
+
//# sourceMappingURL=chunk-3GTSMZNL.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
startPipeline
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-LB6MG36X.js";
|
|
4
4
|
|
|
5
5
|
// packages/cli/src/commands/start.ts
|
|
6
6
|
import { resolve } from "path";
|
|
@@ -66,4 +66,4 @@ Options:
|
|
|
66
66
|
export {
|
|
67
67
|
runStartCommand
|
|
68
68
|
};
|
|
69
|
-
//# sourceMappingURL=chunk-
|
|
69
|
+
//# sourceMappingURL=chunk-7HIU4UF2.js.map
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Watchdog
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UJDDOQEE.js";
|
|
4
4
|
import {
|
|
5
5
|
defaultSentinelConfig,
|
|
6
6
|
loadConfig
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-LB6MG36X.js";
|
|
8
8
|
|
|
9
9
|
// packages/cli/src/commands/watchdog.ts
|
|
10
10
|
import { resolve } from "path";
|
|
@@ -76,4 +76,4 @@ Options:
|
|
|
76
76
|
export {
|
|
77
77
|
runWatchdogCommand
|
|
78
78
|
};
|
|
79
|
-
//# sourceMappingURL=chunk-
|
|
79
|
+
//# sourceMappingURL=chunk-KUFSIVPF.js.map
|
|
@@ -1856,9 +1856,17 @@ async function startSesameLoop(config, agent) {
|
|
|
1856
1856
|
}
|
|
1857
1857
|
const ctxPrefix = response.contextSwitched ? `[switched to ${response.context}] ` : "";
|
|
1858
1858
|
let content = response.content;
|
|
1859
|
-
const
|
|
1860
|
-
|
|
1861
|
-
|
|
1859
|
+
const prefixPatterns = [
|
|
1860
|
+
`[${config.agent.name} in group chat]: `,
|
|
1861
|
+
`[${config.agent.name} in group chat]:`,
|
|
1862
|
+
`[${config.agent.name}]: `,
|
|
1863
|
+
`[${config.agent.name}]:`
|
|
1864
|
+
];
|
|
1865
|
+
for (const prefix2 of prefixPatterns) {
|
|
1866
|
+
if (content.startsWith(prefix2)) {
|
|
1867
|
+
content = content.slice(prefix2.length).trimStart();
|
|
1868
|
+
break;
|
|
1869
|
+
}
|
|
1862
1870
|
}
|
|
1863
1871
|
await sesame.sendMessage(msg.channelId, ctxPrefix + content);
|
|
1864
1872
|
console.log(`[sesame] ${config.agent.name} (${response.context}): ${response.content.slice(0, 100)}...`);
|
|
@@ -2415,4 +2423,4 @@ smol-toml/dist/index.js:
|
|
|
2415
2423
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
2416
2424
|
*)
|
|
2417
2425
|
*/
|
|
2418
|
-
//# sourceMappingURL=chunk-
|
|
2426
|
+
//# sourceMappingURL=chunk-LB6MG36X.js.map
|
|
@@ -1 +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/agent.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","../packages/runtime/src/sesame.ts","../packages/runtime/src/pipeline.ts","../packages/runtime/src/health.ts","../packages/runtime/src/fleet/worker-server.ts","../packages/runtime/src/fleet/worker-protocol.ts","../packages/runtime/src/worker.ts"],"sourcesContent":["import type { LLMConfig } from \"./config.js\";\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatResponse {\n content: string;\n model: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\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\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 }\n\n async chat(messages: ChatMessage[]): Promise<ChatResponse> {\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({\n model: this.model,\n messages,\n max_tokens: this.maxTokens,\n temperature: this.temperature,\n }),\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n throw new Error(`LLM request failed: ${resp.status} ${body}`);\n }\n\n const data = (await resp.json()) as {\n choices: Array<{ message: { content: string } }>;\n model: string;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n return {\n content: data.choices[0].message.content,\n model: data.model,\n usage: data.usage,\n };\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 } from \"fs\";\nimport { resolve, basename } 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// 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 function buildSystemPrompt(\n config: AgentConfig,\n episodes: ScoredEpisode[],\n contextName = \"global\",\n l3Knowledge: L3Entry[] = [],\n): string {\n let prompt = `You are ${config.name}. ${config.personality}\\n`;\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 prompt += \"\\n# Workspace Context\\n\";\n for (const [filename, content] of wsFiles) {\n prompt += `\\n## ${filename}\\n${content}\\n`;\n }\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 }\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.\nIf you decide not to respond to a group message, reply with exactly: __SKIP__\n`;\n\n if (contextName !== \"global\") {\n prompt += `\\n## Active Context: ${contextName}\\nYou are currently working in the \"${contextName}\" project context.\\n`;\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 (episodes.length > 0) {\n prompt += \"\\n## Relevant memories from previous conversations\\n\\n\";\n for (const ep of episodes) {\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 prompt;\n}\n\nexport function buildMessages(\n systemPrompt: string,\n conversationHistory: ChatMessage[],\n currentMessage: string,\n): ChatMessage[] {\n return [\n { role: \"system\", content: systemPrompt },\n ...conversationHistory,\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","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\";\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 // 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\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\n if (contextName !== \"global\") {\n this.contextManager.switchContext(contextName);\n }\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 this.conversationHistories.set(contextName, []);\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\n const systemPrompt = buildSystemPrompt(this.config.agent, relevantEpisodes, contextName, l3Knowledge);\n const messages = buildMessages(systemPrompt, conversationHistory, userMessage);\n\n // 3. Call LLM\n const response = await this.llm.chat(messages);\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 // 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 // --- Cross-context commands ---\n\n // \"search all: <query>\" or \"cross-context search: <query>\"\n const searchAllMatch = message.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 = message.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(message);\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","import { readFileSync, existsSync } from \"fs\";\nimport { resolve, dirname } from \"path\";\nimport { parse } from \"smol-toml\";\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 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.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","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 { 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 { 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.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 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\n // Create the agent\n const agent = new Agent(config);\n console.log(`[hivemind] Context manager initialized (active: ${agent.getActiveContext()})`);\n\n // Connect to Sesame if configured\n if (config.sesame.api_key) {\n await startSesameLoop(config, agent);\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): Promise<void> {\n const sesame = new SesameClient(config.sesame);\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 sesame.onMessage(async (msg) => {\n if (shuttingDown) return;\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 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 selfPrefix = `[${config.agent.name}]:`;\n if (content.startsWith(selfPrefix)) {\n content = content.slice(selfPrefix.length).trimStart();\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","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","/**\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":["readFileSync","existsSync","resolve","endPtr","readFileSync","resolve","existsSync","configDir","readFileSync","resolve","dirname","SesameClient","readFileSync","resolve","dirname","fileURLToPath","SesameClient","createServer","resolve","body"]}
|
|
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/agent.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","../packages/runtime/src/sesame.ts","../packages/runtime/src/pipeline.ts","../packages/runtime/src/health.ts","../packages/runtime/src/fleet/worker-server.ts","../packages/runtime/src/fleet/worker-protocol.ts","../packages/runtime/src/worker.ts"],"sourcesContent":["import type { LLMConfig } from \"./config.js\";\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface ChatResponse {\n content: string;\n model: string;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\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\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 }\n\n async chat(messages: ChatMessage[]): Promise<ChatResponse> {\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({\n model: this.model,\n messages,\n max_tokens: this.maxTokens,\n temperature: this.temperature,\n }),\n });\n\n if (!resp.ok) {\n const body = await resp.text();\n throw new Error(`LLM request failed: ${resp.status} ${body}`);\n }\n\n const data = (await resp.json()) as {\n choices: Array<{ message: { content: string } }>;\n model: string;\n usage?: { prompt_tokens: number; completion_tokens: number; total_tokens: number };\n };\n\n return {\n content: data.choices[0].message.content,\n model: data.model,\n usage: data.usage,\n };\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 } from \"fs\";\nimport { resolve, basename } 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// 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 function buildSystemPrompt(\n config: AgentConfig,\n episodes: ScoredEpisode[],\n contextName = \"global\",\n l3Knowledge: L3Entry[] = [],\n): string {\n let prompt = `You are ${config.name}. ${config.personality}\\n`;\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 prompt += \"\\n# Workspace Context\\n\";\n for (const [filename, content] of wsFiles) {\n prompt += `\\n## ${filename}\\n${content}\\n`;\n }\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 }\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.\nIf you decide not to respond to a group message, reply with exactly: __SKIP__\n`;\n\n if (contextName !== \"global\") {\n prompt += `\\n## Active Context: ${contextName}\\nYou are currently working in the \"${contextName}\" project context.\\n`;\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 (episodes.length > 0) {\n prompt += \"\\n## Relevant memories from previous conversations\\n\\n\";\n for (const ep of episodes) {\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 prompt;\n}\n\nexport function buildMessages(\n systemPrompt: string,\n conversationHistory: ChatMessage[],\n currentMessage: string,\n): ChatMessage[] {\n return [\n { role: \"system\", content: systemPrompt },\n ...conversationHistory,\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","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\";\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 // 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\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\n if (contextName !== \"global\") {\n this.contextManager.switchContext(contextName);\n }\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 this.conversationHistories.set(contextName, []);\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\n const systemPrompt = buildSystemPrompt(this.config.agent, relevantEpisodes, contextName, l3Knowledge);\n const messages = buildMessages(systemPrompt, conversationHistory, userMessage);\n\n // 3. Call LLM\n const response = await this.llm.chat(messages);\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 // 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 // --- Cross-context commands ---\n\n // \"search all: <query>\" or \"cross-context search: <query>\"\n const searchAllMatch = message.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 = message.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(message);\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","import { readFileSync, existsSync } from \"fs\";\nimport { resolve, dirname } from \"path\";\nimport { parse } from \"smol-toml\";\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 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.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","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 { 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 { 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.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 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\n // Create the agent\n const agent = new Agent(config);\n console.log(`[hivemind] Context manager initialized (active: ${agent.getActiveContext()})`);\n\n // Connect to Sesame if configured\n if (config.sesame.api_key) {\n await startSesameLoop(config, agent);\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): Promise<void> {\n const sesame = new SesameClient(config.sesame);\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 sesame.onMessage(async (msg) => {\n if (shuttingDown) return;\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 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","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","/**\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":["readFileSync","existsSync","resolve","endPtr","readFileSync","resolve","existsSync","configDir","readFileSync","resolve","dirname","SesameClient","readFileSync","resolve","dirname","fileURLToPath","SesameClient","prefix","createServer","resolve","body"]}
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
PRIMARY_ROUTES,
|
|
7
7
|
SesameClient,
|
|
8
8
|
WORKER_ROUTES
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-LB6MG36X.js";
|
|
10
10
|
|
|
11
11
|
// packages/runtime/src/watchdog.ts
|
|
12
12
|
import { execSync } from "child_process";
|
|
@@ -1048,4 +1048,4 @@ export {
|
|
|
1048
1048
|
WorkerMemorySync,
|
|
1049
1049
|
PrimaryMemorySync
|
|
1050
1050
|
};
|
|
1051
|
-
//# sourceMappingURL=chunk-
|
|
1051
|
+
//# sourceMappingURL=chunk-UJDDOQEE.js.map
|
package/dist/commands/fleet.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runFleetCommand
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-3GTSMZNL.js";
|
|
4
|
+
import "../chunk-UJDDOQEE.js";
|
|
5
|
+
import "../chunk-LB6MG36X.js";
|
|
6
6
|
import "../chunk-GPI4RU7N.js";
|
|
7
7
|
export {
|
|
8
8
|
runFleetCommand
|
package/dist/commands/start.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runStartCommand
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-7HIU4UF2.js";
|
|
4
|
+
import "../chunk-UJDDOQEE.js";
|
|
5
|
+
import "../chunk-LB6MG36X.js";
|
|
6
6
|
import "../chunk-GPI4RU7N.js";
|
|
7
7
|
export {
|
|
8
8
|
runStartCommand
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runWatchdogCommand
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-KUFSIVPF.js";
|
|
4
|
+
import "../chunk-UJDDOQEE.js";
|
|
5
|
+
import "../chunk-LB6MG36X.js";
|
|
6
6
|
import "../chunk-GPI4RU7N.js";
|
|
7
7
|
export {
|
|
8
8
|
runWatchdogCommand
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
PrimaryMemorySync,
|
|
5
5
|
Watchdog,
|
|
6
6
|
WorkerMemorySync
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-UJDDOQEE.js";
|
|
8
8
|
import {
|
|
9
9
|
Agent,
|
|
10
10
|
ContextManager,
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
loadConfig,
|
|
21
21
|
startPipeline,
|
|
22
22
|
startWorker
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-LB6MG36X.js";
|
|
24
24
|
import "./chunk-GPI4RU7N.js";
|
|
25
25
|
export {
|
|
26
26
|
Agent,
|
package/dist/main.js
CHANGED
|
@@ -4,10 +4,10 @@ import {
|
|
|
4
4
|
} from "./chunk-DODOQGIL.js";
|
|
5
5
|
import {
|
|
6
6
|
runStartCommand
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7HIU4UF2.js";
|
|
8
8
|
import {
|
|
9
9
|
runFleetCommand
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-3GTSMZNL.js";
|
|
11
11
|
import {
|
|
12
12
|
runServiceCommand
|
|
13
13
|
} from "./chunk-IJRAVHQC.js";
|
|
@@ -16,9 +16,9 @@ import {
|
|
|
16
16
|
} from "./chunk-LJHJGDKY.js";
|
|
17
17
|
import {
|
|
18
18
|
runWatchdogCommand
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
19
|
+
} from "./chunk-KUFSIVPF.js";
|
|
20
|
+
import "./chunk-UJDDOQEE.js";
|
|
21
|
+
import "./chunk-LB6MG36X.js";
|
|
22
22
|
import "./chunk-GPI4RU7N.js";
|
|
23
23
|
|
|
24
24
|
// packages/cli/src/main.ts
|
package/dist/start.js
CHANGED
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|