arcie 0.1.4 → 0.1.5

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.
Files changed (64) hide show
  1. package/dist/agent/index.d.ts +1 -1
  2. package/dist/build-TWNCPXBU.js +82 -0
  3. package/dist/build-TWNCPXBU.js.map +1 -0
  4. package/dist/channels/index.d.ts +1 -1
  5. package/dist/{chunk-2ZSKZYWK.js → chunk-4WSILP75.js} +37 -164
  6. package/dist/chunk-4WSILP75.js.map +1 -0
  7. package/dist/chunk-HVBDOHTL.js +148 -0
  8. package/dist/chunk-HVBDOHTL.js.map +1 -0
  9. package/dist/chunk-HWD2Z2CH.js +742 -0
  10. package/dist/chunk-HWD2Z2CH.js.map +1 -0
  11. package/dist/chunk-KVSX4MLK.js +139 -0
  12. package/dist/chunk-KVSX4MLK.js.map +1 -0
  13. package/dist/chunk-N5R3TEEZ.js +15 -0
  14. package/dist/chunk-N5R3TEEZ.js.map +1 -0
  15. package/dist/chunk-SGWQZZ2A.js +54 -0
  16. package/dist/chunk-SGWQZZ2A.js.map +1 -0
  17. package/dist/chunk-XOFWQUOO.js +30 -0
  18. package/dist/chunk-XOFWQUOO.js.map +1 -0
  19. package/dist/cli/index.d.ts +7 -0
  20. package/dist/cli/index.js +146 -232
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/context/index.d.ts +1 -1
  23. package/dist/dev-ZZDVOWUZ.js +1967 -0
  24. package/dist/dev-ZZDVOWUZ.js.map +1 -0
  25. package/dist/hooks/index.d.ts +1 -1
  26. package/dist/{index-b4NcDl3m.d.ts → index-CElLRVTP.d.ts} +1 -1
  27. package/dist/index.d.ts +4 -4
  28. package/dist/index.js +4 -2
  29. package/dist/index.js.map +1 -1
  30. package/dist/init-5F7CIVLN.js +822 -0
  31. package/dist/init-5F7CIVLN.js.map +1 -0
  32. package/dist/instructions/index.d.ts +1 -1
  33. package/dist/runner/index.d.ts +2 -2
  34. package/dist/runner/index.js +2 -1
  35. package/dist/scaffold-web-chat-OQL5C2GK.js +7 -0
  36. package/dist/scaffold-web-chat-OQL5C2GK.js.map +1 -0
  37. package/dist/schedules/index.d.ts +1 -1
  38. package/dist/skills/index.d.ts +1 -1
  39. package/dist/tools/index.d.ts +1 -1
  40. package/dist/{types-BxOQTzx1.d.ts → types-DwxwdSa2.d.ts} +1 -1
  41. package/package.json +1 -1
  42. package/templates/default/.env.local +12 -0
  43. package/templates/web-chat/.env.local.example +4 -0
  44. package/templates/web-chat/README.md +51 -0
  45. package/templates/web-chat/app/api/chat/route.ts +43 -0
  46. package/templates/web-chat/app/globals.css +55 -0
  47. package/templates/web-chat/app/layout.tsx +15 -0
  48. package/templates/web-chat/app/page.tsx +9 -0
  49. package/templates/web-chat/components/chat.tsx +196 -0
  50. package/templates/web-chat/components/input-bar.tsx +74 -0
  51. package/templates/web-chat/components/message.tsx +63 -0
  52. package/templates/web-chat/components/tool-call.tsx +79 -0
  53. package/templates/web-chat/components/ui/button.tsx +46 -0
  54. package/templates/web-chat/components/ui/input.tsx +19 -0
  55. package/templates/web-chat/components.json +20 -0
  56. package/templates/web-chat/lib/stream.ts +41 -0
  57. package/templates/web-chat/lib/types.ts +61 -0
  58. package/templates/web-chat/lib/utils.ts +6 -0
  59. package/templates/web-chat/next.config.mjs +4 -0
  60. package/templates/web-chat/package.json +32 -0
  61. package/templates/web-chat/postcss.config.mjs +6 -0
  62. package/templates/web-chat/tailwind.config.ts +59 -0
  63. package/templates/web-chat/tsconfig.json +23 -0
  64. package/dist/chunk-2ZSKZYWK.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/loader.ts","../src/memory/store.ts","../src/memory/sqlite-store.ts","../src/memory/file-store.ts","../src/memory/cencori-store.ts","../src/memory/strategies/lastN.ts","../src/memory/strategies/keyFacts.ts","../src/memory/strategies/summary.ts","../src/memory/semantic.ts","../src/memory/working-memory.ts","../src/memory/processors/message-history.ts","../src/memory/processors/working-memory.ts","../src/memory/processors/semantic-recall.ts","../src/memory/processors/strategy-adapter.ts","../src/memory/index.ts","../src/runner/index.ts"],"sourcesContent":["import { readFileSync, existsSync, readdirSync, statSync } from \"node:fs\";\nimport { resolve, basename, extname } from \"node:path\";\nimport type {\n AgentManifest,\n AgentConfig,\n ToolConfig,\n SkillConfig,\n HookConfig,\n ChannelConfig,\n ConnectionConfig,\n ScheduleConfig,\n SessionConfig,\n PolicyConfig,\n SubagentManifest,\n} from \"./types\";\n\nexport interface LoadedAgent {\n manifest: AgentManifest;\n agentDir: string;\n}\n\nexport async function loadAgent(agentDir: string): Promise<LoadedAgent> {\n const absDir = resolve(process.cwd(), agentDir);\n\n if (!existsSync(absDir)) {\n throw new Error(`Agent directory not found: ${absDir}`);\n }\n\n const agentFile = resolve(absDir, \"agent.ts\");\n let config: AgentConfig = { model: \"gpt-4o\" };\n\n if (existsSync(agentFile)) {\n try {\n const mod = await import(agentFile);\n if (mod.default) {\n config = { ...config, ...mod.default };\n }\n } catch (err) {\n console.warn(`[arcie] Failed to load agent.ts: ${(err as Error).message}. Using defaults.`);\n }\n }\n\n const instructions = loadInstructionsFile(absDir);\n const tools = await loadDirectory<ToolConfig>(absDir, \"tools\");\n const skills = await loadDirectory<SkillConfig>(absDir, \"skills\");\n const hooks = await loadDirectory<HookConfig>(absDir, \"hooks\");\n const channels = await loadDirectory<ChannelConfig>(absDir, \"channels\");\n const connections = await loadDirectory<ConnectionConfig>(absDir, \"connections\");\n const schedules = await loadDirectory<ScheduleConfig>(absDir, \"schedules\");\n const subagents = await loadSubagents(absDir);\n const session = await loadSessionConfig(absDir);\n const policy = await loadPolicyConfig(absDir);\n\n return {\n agentDir: absDir,\n manifest: {\n config,\n instructions,\n tools,\n skills,\n hooks,\n channels,\n connections,\n schedules,\n subagents,\n session: session ?? undefined,\n policy: policy ?? undefined,\n },\n };\n}\n\n/**\n * Loads each `subagents/<id>/` directory as a self-contained child agent.\n * Unlike the other slots, subagents are *directories* (not flat files): every\n * one is a mini-agent with its own config, instructions, tools, and skills.\n * A subagent must declare a `description` so the orchestrator knows when to\n * delegate to it — a missing one is a hard authoring error.\n */\nasync function loadSubagents(\n agentDir: string\n): Promise<Record<string, SubagentManifest>> {\n const dirPath = resolve(agentDir, \"subagents\");\n if (!existsSync(dirPath)) return {};\n\n const result: Record<string, SubagentManifest> = {};\n\n for (const entry of readdirSync(dirPath, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith(\".\")) continue;\n const id = entry.name;\n const subDir = resolve(dirPath, id);\n\n const agentFile = resolve(subDir, \"agent.ts\");\n if (!existsSync(agentFile)) {\n throw new Error(`Subagent \"${id}\" is missing agent.ts`);\n }\n\n let mod: { default?: AgentConfig };\n try {\n mod = await import(agentFile);\n } catch (err) {\n throw new Error(`Failed to load subagent \"${id}\": ${(err as Error).message}`);\n }\n\n const config = mod.default;\n if (!config) {\n throw new Error(`Subagent \"${id}\" agent.ts must have a default export`);\n }\n if (!config.description) {\n throw new Error(`Subagent \"${id}\" must declare a description in agent.ts`);\n }\n\n result[id] = {\n config,\n instructions: loadInstructionsFile(subDir),\n tools: await loadDirectory<ToolConfig>(subDir, \"tools\"),\n skills: await loadDirectory<SkillConfig>(subDir, \"skills\"),\n };\n }\n\n return result;\n}\n\nfunction loadInstructionsFile(agentDir: string): string {\n const mdPath = resolve(agentDir, \"instructions.md\");\n if (existsSync(mdPath)) {\n return readFileSync(mdPath, \"utf-8\");\n }\n return \"You are a helpful AI agent.\";\n}\n\nasync function loadDirectory<T>(\n agentDir: string,\n dirName: string\n): Promise<Record<string, T>> {\n const dirPath = resolve(agentDir, dirName);\n if (!existsSync(dirPath)) return {};\n\n const entries = readdirSync(dirPath).filter(\n (f) => !f.startsWith(\".\") && (f.endsWith(\".ts\") || f.endsWith(\".js\"))\n );\n\n const result: Record<string, T> = {};\n\n for (const entry of entries) {\n const name = basename(entry, extname(entry));\n const filePath = resolve(dirPath, entry);\n\n if (statSync(filePath).isFile()) {\n try {\n const mod = await import(filePath);\n if (mod.default) {\n result[name] = mod.default;\n }\n } catch {\n // skip unloadable files\n }\n }\n }\n\n return result;\n}\n\nasync function loadSessionConfig(agentDir: string): Promise<SessionConfig | null> {\n const tsPath = resolve(agentDir, \"sessions\", \"config.ts\");\n if (existsSync(tsPath)) {\n try {\n const mod = await import(tsPath);\n return mod.default ?? null;\n } catch {\n return null;\n }\n }\n return null;\n}\n\nasync function loadPolicyConfig(agentDir: string): Promise<PolicyConfig | null> {\n const tsPath = resolve(agentDir, \"policies\", \"index.ts\");\n if (existsSync(tsPath)) {\n try {\n const mod = await import(tsPath);\n return mod.default ?? null;\n } catch {\n return null;\n }\n }\n return null;\n}\n","import type { MemoryEntry, MemoryStore, Thread, DeleteMessagesOptions } from \"./types\";\n\nexport class InMemoryStore implements MemoryStore {\n private entries = new Map<string, MemoryEntry[]>();\n private threads = new Map<string, Thread>();\n\n private key(resourceId: string, threadId: string): string {\n return `${resourceId}:${threadId}`;\n }\n\n async save(resourceId: string, threadId: string, entries: MemoryEntry[]): Promise<void> {\n const k = this.key(resourceId, threadId);\n const existing = this.entries.get(k) ?? [];\n existing.push(...entries);\n this.entries.set(k, existing);\n }\n\n async load(resourceId: string, threadId: string, limit?: number): Promise<MemoryEntry[]> {\n const entries = this.entries.get(this.key(resourceId, threadId)) ?? [];\n if (limit === undefined || limit >= entries.length) return [...entries];\n return entries.slice(entries.length - limit);\n }\n\n async search(resourceId: string, threadId: string, query: string, limit?: number): Promise<MemoryEntry[]> {\n const entries = this.entries.get(this.key(resourceId, threadId)) ?? [];\n const lower = query.toLowerCase();\n const matched = entries.filter((e) => e.content.toLowerCase().includes(lower));\n if (limit !== undefined && matched.length > limit) return matched.slice(0, limit);\n return matched;\n }\n\n async clear(resourceId: string, threadId: string): Promise<void> {\n this.entries.delete(this.key(resourceId, threadId));\n }\n\n async close(): Promise<void> {\n // no-op\n }\n\n async createThread(thread: Thread): Promise<void> {\n this.threads.set(thread.id, thread);\n }\n\n async getThread(threadId: string, _resourceId: string): Promise<Thread | null> {\n return this.threads.get(threadId) ?? null;\n }\n\n async listThreads(resourceId: string): Promise<Thread[]> {\n return [...this.threads.values()].filter((t) => t.resourceId === resourceId);\n }\n\n async updateThread(thread: Partial<Thread> & { id: string; resourceId: string }): Promise<void> {\n const existing = this.threads.get(thread.id);\n if (!existing) throw new Error(`Thread not found: ${thread.id}`);\n this.threads.set(thread.id, { ...existing, ...thread, updatedAt: Date.now() });\n }\n\n async deleteThread(threadId: string, _resourceId: string): Promise<void> {\n this.threads.delete(threadId);\n this.entries.delete(this.key(_resourceId, threadId));\n }\n\n async deleteMessages(opts: DeleteMessagesOptions): Promise<number> {\n const k = this.key(opts.resourceId, opts.threadId);\n const existing = this.entries.get(k) ?? [];\n let keep = [...existing];\n\n if (opts.messageIds && opts.messageIds.length > 0) {\n const ids = new Set(opts.messageIds);\n keep = keep.filter((e) => !(e.turnId && ids.has(e.turnId)));\n }\n if (opts.beforeTimestamp !== undefined) {\n keep = keep.filter((e) => e.timestamp >= opts.beforeTimestamp!);\n }\n if (opts.afterTimestamp !== undefined) {\n keep = keep.filter((e) => e.timestamp <= opts.afterTimestamp!);\n }\n\n const deleted = existing.length - keep.length;\n this.entries.set(k, keep);\n return deleted;\n }\n\n async cloneThread(\n source: { threadId: string; resourceId: string },\n dest: { threadId: string; resourceId: string },\n ): Promise<void> {\n const src = this.entries.get(this.key(source.resourceId, source.threadId));\n if (src) {\n this.entries.set(this.key(dest.resourceId, dest.threadId), src.map((e) => ({ ...e })));\n }\n }\n}\n","import { createClient, type Client, type InValue } from \"@libsql/client\";\nimport { resolve, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { mkdirSync } from \"node:fs\";\nimport type { MemoryEntry, MemoryStore, Thread, DeleteMessagesOptions } from \"./types\";\n\nexport class SqliteStore implements MemoryStore {\n private client: Client;\n\n constructor(dbPath?: string) {\n const path = dbPath ?? resolve(homedir(), \".arcie\", \"memory.db\");\n mkdirSync(dirname(path), { recursive: true });\n this.client = createClient({ url: `file:${path}` });\n this.init();\n }\n\n private init(): void {\n this.client.execute(`\n CREATE TABLE IF NOT EXISTS memories (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n resource_id TEXT NOT NULL,\n thread_id TEXT NOT NULL,\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n turn_id TEXT\n )\n `);\n this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_memories_lookup\n ON memories(resource_id, thread_id, timestamp)\n `);\n this.client.execute(`\n CREATE TABLE IF NOT EXISTS threads (\n id TEXT PRIMARY KEY,\n resource_id TEXT NOT NULL,\n title TEXT,\n metadata TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL\n )\n `);\n this.client.execute(`\n CREATE INDEX IF NOT EXISTS idx_threads_resource\n ON threads(resource_id)\n `);\n }\n\n async save(resourceId: string, threadId: string, entries: MemoryEntry[]): Promise<void> {\n const stmt = `INSERT INTO memories (resource_id, thread_id, role, content, timestamp, turn_id) VALUES (?, ?, ?, ?, ?, ?)`;\n for (const entry of entries) {\n await this.client.execute({\n sql: stmt,\n args: [resourceId, threadId, entry.role, entry.content, entry.timestamp, entry.turnId ?? null],\n });\n }\n }\n\n async load(resourceId: string, threadId: string, limit?: number): Promise<MemoryEntry[]> {\n const rows = await this.client.execute({\n sql: `SELECT role, content, timestamp, turn_id FROM memories WHERE resource_id = ? AND thread_id = ? ORDER BY timestamp ASC, id ASC`,\n args: [resourceId, threadId],\n });\n\n let entries = rows.rows.map((r) => ({\n role: r.role as MemoryEntry[\"role\"],\n content: r.content as string,\n timestamp: r.timestamp as number,\n turnId: r.turn_id as string | undefined,\n }));\n\n if (limit !== undefined && entries.length > limit) {\n entries = entries.slice(entries.length - limit);\n }\n\n return entries;\n }\n\n async clear(resourceId: string, threadId: string): Promise<void> {\n await this.client.execute({\n sql: `DELETE FROM memories WHERE resource_id = ? AND thread_id = ?`,\n args: [resourceId, threadId],\n });\n }\n\n async search(resourceId: string, threadId: string, query: string, limit?: number): Promise<MemoryEntry[]> {\n const rows = await this.client.execute({\n sql: `SELECT role, content, timestamp, turn_id FROM memories WHERE resource_id = ? AND thread_id = ? AND content LIKE ? ORDER BY timestamp DESC`,\n args: [resourceId, threadId, `%${query}%`],\n });\n\n let entries = rows.rows.map((r) => ({\n role: r.role as MemoryEntry[\"role\"],\n content: r.content as string,\n timestamp: r.timestamp as number,\n turnId: r.turn_id as string | undefined,\n }));\n\n if (limit !== undefined && entries.length > limit) {\n entries = entries.slice(0, limit);\n }\n\n return entries;\n }\n\n async close(): Promise<void> {\n this.client.close();\n }\n\n async createThread(thread: Thread): Promise<void> {\n await this.client.execute({\n sql: `INSERT INTO threads (id, resource_id, title, metadata, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)`,\n args: [\n thread.id,\n thread.resourceId,\n thread.title ?? null,\n thread.metadata ? JSON.stringify(thread.metadata) : null,\n thread.createdAt,\n thread.updatedAt,\n ],\n });\n }\n\n async getThread(threadId: string, _resourceId: string): Promise<Thread | null> {\n const rows = await this.client.execute({\n sql: `SELECT id, resource_id, title, metadata, created_at, updated_at FROM threads WHERE id = ?`,\n args: [threadId],\n });\n if (rows.rows.length === 0) return null;\n const r = rows.rows[0];\n return {\n id: r.id as string,\n resourceId: r.resource_id as string,\n title: r.title as string | undefined,\n metadata: r.metadata ? JSON.parse(r.metadata as string) : undefined,\n createdAt: r.created_at as number,\n updatedAt: r.updated_at as number,\n };\n }\n\n async listThreads(resourceId: string): Promise<Thread[]> {\n const rows = await this.client.execute({\n sql: `SELECT id, resource_id, title, metadata, created_at, updated_at FROM threads WHERE resource_id = ? ORDER BY updated_at DESC`,\n args: [resourceId],\n });\n return rows.rows.map((r) => ({\n id: r.id as string,\n resourceId: r.resource_id as string,\n title: r.title as string | undefined,\n metadata: r.metadata ? JSON.parse(r.metadata as string) : undefined,\n createdAt: r.created_at as number,\n updatedAt: r.updated_at as number,\n }));\n }\n\n async updateThread(thread: Partial<Thread> & { id: string; resourceId: string }): Promise<void> {\n const fields: string[] = [];\n const args: InValue[] = [];\n\n if (thread.title !== undefined) { fields.push(\"title = ?\"); args.push(thread.title); }\n if (thread.metadata !== undefined) { fields.push(\"metadata = ?\"); args.push(JSON.stringify(thread.metadata)); }\n fields.push(\"updated_at = ?\");\n args.push(Date.now());\n args.push(thread.id);\n\n await this.client.execute({\n sql: `UPDATE threads SET ${fields.join(\", \")} WHERE id = ?`,\n args,\n });\n }\n\n async deleteThread(threadId: string, _resourceId: string): Promise<void> {\n await this.client.execute({\n sql: `DELETE FROM memories WHERE thread_id = ?`,\n args: [threadId],\n });\n await this.client.execute({\n sql: `DELETE FROM threads WHERE id = ?`,\n args: [threadId],\n });\n }\n\n async deleteMessages(opts: DeleteMessagesOptions): Promise<number> {\n const conditions: string[] = [\"resource_id = ?\", \"thread_id = ?\"];\n const args: InValue[] = [opts.resourceId, opts.threadId];\n\n if (opts.messageIds && opts.messageIds.length > 0) {\n const placeholders = opts.messageIds.map(() => \"?\").join(\",\");\n conditions.push(`turn_id IN (${placeholders})`);\n args.push(...opts.messageIds);\n }\n if (opts.beforeTimestamp !== undefined) {\n conditions.push(\"timestamp >= ?\");\n args.push(opts.beforeTimestamp);\n }\n if (opts.afterTimestamp !== undefined) {\n conditions.push(\"timestamp <= ?\");\n args.push(opts.afterTimestamp);\n }\n\n const result = await this.client.execute({\n sql: `DELETE FROM memories WHERE ${conditions.join(\" AND \")}`,\n args,\n });\n return Number(result.rowsAffected);\n }\n\n async cloneThread(\n source: { threadId: string; resourceId: string },\n dest: { threadId: string; resourceId: string },\n ): Promise<void> {\n const rows = await this.client.execute({\n sql: `SELECT role, content, timestamp, turn_id FROM memories WHERE resource_id = ? AND thread_id = ? ORDER BY id ASC`,\n args: [source.resourceId, source.threadId],\n });\n\n const stmt = `INSERT INTO memories (resource_id, thread_id, role, content, timestamp, turn_id) VALUES (?, ?, ?, ?, ?, ?)`;\n for (const r of rows.rows) {\n await this.client.execute({\n sql: stmt,\n args: [\n dest.resourceId,\n dest.threadId,\n r.role as string,\n r.content as string,\n r.timestamp as number,\n r.turn_id as string | null,\n ],\n });\n }\n }\n}\n","import { readFileSync, existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { MemoryEntry, MemoryStore, Thread, DeleteMessagesOptions } from \"./types\";\n\nexport class FileStore implements MemoryStore {\n private baseDir: string;\n\n constructor(baseDir?: string) {\n this.baseDir = baseDir ?? resolve(homedir(), \".arcie\", \"memory\");\n }\n\n private filePath(resourceId: string, threadId: string): string {\n const dir = resolve(this.baseDir, resourceId);\n return resolve(dir, `${threadId}.json`);\n }\n\n private threadsPath(resourceId: string): string {\n return resolve(this.baseDir, resourceId, \"__threads.json\");\n }\n\n private read(resourceId: string, threadId: string): MemoryEntry[] {\n const path = this.filePath(resourceId, threadId);\n if (!existsSync(path)) return [];\n try {\n const raw = readFileSync(path, \"utf-8\");\n return JSON.parse(raw) as MemoryEntry[];\n } catch {\n return [];\n }\n }\n\n private write(resourceId: string, threadId: string, entries: MemoryEntry[]): void {\n const path = this.filePath(resourceId, threadId);\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(entries, null, 2), \"utf-8\");\n }\n\n private readThreads(resourceId: string): Thread[] {\n const path = this.threadsPath(resourceId);\n if (!existsSync(path)) return [];\n try {\n const raw = readFileSync(path, \"utf-8\");\n return JSON.parse(raw) as Thread[];\n } catch {\n return [];\n }\n }\n\n private writeThreads(resourceId: string, threads: Thread[]): void {\n const path = this.threadsPath(resourceId);\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(threads, null, 2), \"utf-8\");\n }\n\n async save(resourceId: string, threadId: string, entries: MemoryEntry[]): Promise<void> {\n const existing = this.read(resourceId, threadId);\n existing.push(...entries);\n this.write(resourceId, threadId, existing);\n }\n\n async load(resourceId: string, threadId: string, limit?: number): Promise<MemoryEntry[]> {\n const entries = this.read(resourceId, threadId);\n if (limit === undefined || limit >= entries.length) return entries;\n return entries.slice(entries.length - limit);\n }\n\n async clear(resourceId: string, threadId: string): Promise<void> {\n this.write(resourceId, threadId, []);\n }\n\n async close(): Promise<void> {\n // no-op\n }\n\n async createThread(thread: Thread): Promise<void> {\n const threads = this.readThreads(thread.resourceId);\n threads.push(thread);\n this.writeThreads(thread.resourceId, threads);\n }\n\n async getThread(threadId: string, resourceId: string): Promise<Thread | null> {\n const threads = this.readThreads(resourceId);\n return threads.find((t) => t.id === threadId) ?? null;\n }\n\n async listThreads(resourceId: string): Promise<Thread[]> {\n return this.readThreads(resourceId);\n }\n\n async updateThread(thread: Partial<Thread> & { id: string; resourceId: string }): Promise<void> {\n const threads = this.readThreads(thread.resourceId);\n const idx = threads.findIndex((t) => t.id === thread.id);\n if (idx === -1) throw new Error(`Thread not found: ${thread.id}`);\n threads[idx] = { ...threads[idx], ...thread, updatedAt: Date.now() };\n this.writeThreads(thread.resourceId, threads);\n }\n\n async deleteThread(threadId: string, resourceId: string): Promise<void> {\n const threads = this.readThreads(resourceId);\n this.writeThreads(resourceId, threads.filter((t) => t.id !== threadId));\n const path = this.filePath(resourceId, threadId);\n if (existsSync(path)) writeFileSync(path, \"[]\", \"utf-8\");\n }\n\n async deleteMessages(opts: DeleteMessagesOptions): Promise<number> {\n let entries = this.read(opts.resourceId, opts.threadId);\n const before = entries.length;\n const { messageIds, beforeTimestamp, afterTimestamp } = opts;\n\n if (messageIds && messageIds.length > 0) {\n const ids = new Set(messageIds);\n entries = entries.filter((e) => !(e.turnId && ids.has(e.turnId)));\n }\n if (beforeTimestamp !== undefined) {\n entries = entries.filter((e) => e.timestamp >= beforeTimestamp);\n }\n if (afterTimestamp !== undefined) {\n entries = entries.filter((e) => e.timestamp <= afterTimestamp);\n }\n\n this.write(opts.resourceId, opts.threadId, entries);\n return before - entries.length;\n }\n\n async cloneThread(\n source: { threadId: string; resourceId: string },\n dest: { threadId: string; resourceId: string },\n ): Promise<void> {\n const entries = this.read(source.resourceId, source.threadId);\n this.write(dest.resourceId, dest.threadId, entries.map((e) => ({ ...e })));\n }\n}\n","import type { MemoryEntry, MemoryStore, Thread, DeleteMessagesOptions } from \"./types\";\n\nexport interface CencoriMemoryClient {\n store(options: {\n namespace: string;\n content: string;\n metadata?: Record<string, unknown>;\n }): Promise<unknown>;\n search(options: {\n namespace: string;\n query: string;\n limit?: number;\n threshold?: number;\n filter?: Record<string, unknown>;\n }): Promise<{ results: Array<{ content: string; metadata: Record<string, unknown>; similarity?: number }> }>;\n delete?(options: {\n namespace: string;\n ids?: string[];\n filter?: Record<string, unknown>;\n }): Promise<unknown>;\n}\n\nexport class CencoriMemoryStore implements MemoryStore {\n private client: CencoriMemoryClient;\n\n constructor(client: CencoriMemoryClient) {\n this.client = client;\n }\n\n async save(resourceId: string, threadId: string, entries: MemoryEntry[]): Promise<void> {\n for (const entry of entries) {\n await this.client.store({\n namespace: resourceId,\n content: entry.content,\n metadata: {\n threadId,\n role: entry.role,\n timestamp: entry.timestamp,\n turnId: entry.turnId,\n },\n });\n }\n }\n\n async load(resourceId: string, threadId: string, limit?: number): Promise<MemoryEntry[]> {\n const result = await this.client.search({\n namespace: resourceId,\n query: \"*\",\n limit: limit ?? 100,\n threshold: 0,\n filter: { threadId },\n });\n\n return result.results.map((r) => ({\n role: (r.metadata.role ?? \"user\") as MemoryEntry[\"role\"],\n content: r.content,\n timestamp: (r.metadata.timestamp as number) ?? Date.now(),\n turnId: r.metadata.turnId as string | undefined,\n score: r.similarity,\n }));\n }\n\n async clear(resourceId: string, threadId: string): Promise<void> {\n if (this.client.delete) {\n await this.client.delete({\n namespace: resourceId,\n filter: { threadId },\n });\n }\n }\n\n async search(resourceId: string, threadId: string, query: string, limit?: number): Promise<MemoryEntry[]> {\n const result = await this.client.search({\n namespace: resourceId,\n query,\n limit: limit ?? 5,\n threshold: 0.5,\n filter: { threadId },\n });\n\n return result.results.map((r) => ({\n role: (r.metadata.role ?? \"user\") as MemoryEntry[\"role\"],\n content: r.content,\n timestamp: (r.metadata.timestamp as number) ?? Date.now(),\n turnId: r.metadata.turnId as string | undefined,\n score: r.similarity,\n }));\n }\n\n async close(): Promise<void> {\n // no-op\n }\n\n async createThread(_thread: Thread): Promise<void> {\n throw new Error(\"Thread management not supported by CencoriMemoryStore\");\n }\n\n async getThread(_threadId: string, _resourceId: string): Promise<Thread | null> {\n throw new Error(\"Thread management not supported by CencoriMemoryStore\");\n }\n\n async listThreads(_resourceId: string): Promise<Thread[]> {\n throw new Error(\"Thread management not supported by CencoriMemoryStore\");\n }\n\n async updateThread(_thread: Partial<Thread> & { id: string; resourceId: string }): Promise<void> {\n throw new Error(\"Thread management not supported by CencoriMemoryStore\");\n }\n\n async deleteThread(_threadId: string, _resourceId: string): Promise<void> {\n throw new Error(\"Thread management not supported by CencoriMemoryStore\");\n }\n\n async deleteMessages(opts: DeleteMessagesOptions): Promise<number> {\n if (!this.client.delete) throw new Error(\"CencoriMemoryClient does not support delete\");\n\n const filter: Record<string, unknown> = { threadId: opts.threadId };\n if (opts.messageIds && opts.messageIds.length > 0) {\n filter.turnId = { $in: opts.messageIds };\n }\n if (opts.beforeTimestamp !== undefined) {\n filter.timestamp = { $gte: opts.beforeTimestamp };\n }\n if (opts.afterTimestamp !== undefined) {\n filter.timestamp = { ...(filter.timestamp as Record<string, unknown> || {}), $lte: opts.afterTimestamp };\n }\n\n await this.client.delete({ namespace: opts.resourceId, filter });\n return -1; // SDK doesn't return count\n }\n\n async cloneThread(\n source: { threadId: string; resourceId: string },\n dest: { threadId: string; resourceId: string },\n ): Promise<void> {\n const entries = await this.load(source.resourceId, source.threadId);\n for (const entry of entries) {\n await this.client.store({\n namespace: dest.resourceId,\n content: entry.content,\n metadata: {\n threadId: dest.threadId,\n role: entry.role,\n timestamp: entry.timestamp,\n turnId: entry.turnId,\n },\n });\n }\n }\n}\n","import type { MemoryStore, MemoryStrategy } from \"../types\";\n\nexport class LastNStrategy implements MemoryStrategy {\n private limit: number;\n\n constructor(limit: number = 10) {\n this.limit = limit;\n }\n\n async getInputContext(store: MemoryStore, resourceId: string, threadId: string): Promise<string> {\n const entries = await store.load(resourceId, threadId, this.limit * 2);\n if (entries.length === 0) return \"\";\n\n const lines = entries.map((e) => {\n const prefix = e.role === \"user\" ? \"User\" : e.role === \"assistant\" ? \"Assistant\" : \"Tool\";\n return `${prefix}: ${e.content}`;\n });\n\n return `## Recent conversation history\\n\\n${lines.join(\"\\n\")}`;\n }\n\n async recordTurn(\n store: MemoryStore,\n resourceId: string,\n threadId: string,\n input: string,\n output: string,\n toolCalls?: { tool: string; input: unknown; output: unknown }[],\n ): Promise<void> {\n const entries: Array<{ role: \"user\" | \"assistant\" | \"tool\"; content: string; timestamp: number }> = [\n { role: \"user\", content: input, timestamp: Date.now() },\n { role: \"assistant\", content: output, timestamp: Date.now() },\n ];\n\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n entries.push({\n role: \"tool\" as const,\n content: JSON.stringify({ tool: tc.tool, result: tc.output }),\n timestamp: Date.now(),\n });\n }\n }\n\n await store.save(resourceId, threadId, entries);\n }\n}\n","import type { MemoryStore, MemoryStrategy } from \"../types\";\n\nconst FACT_PATTERNS = [\n /(?:I am|I'm|my name is)\\s+(\\w+)/i,\n /(?:I (?:work|am)\\s+(?:at|for))\\s+([\\w\\s]+?)(?=[.!,]|$)/i,\n /(?:I (?:like|love|enjoy|prefer)\\s+)([\\w\\s]+?)(?=[.!,]|$)/i,\n /(?:I (?:live|am based|am located)\\s+(?:in|at))\\s+([\\w\\s,]+?)(?=[.!,]|$)/i,\n /(?:my (?:favorite|favourite)\\s+\\w+\\s+is)\\s+([\\w\\s]+?)(?=[.!,]|$)/i,\n /(?:I (?:have|has)\\s+(?:a|an|the)\\s+)([\\w\\s]+?)(?=[.!,]|$)/i,\n /(?:I (?:don't|do not)\\s+)([\\w\\s]+?)(?=[.!,]|$)/i,\n /(?:I (?:use|built|created|developed)\\s+)([\\w\\s]+?)(?=[.!,]|$)/i,\n];\n\nfunction extractFacts(text: string): string[] {\n const facts = new Set<string>();\n for (const pattern of FACT_PATTERNS) {\n const match = text.match(pattern);\n if (match && match[1].trim().length > 1) {\n facts.add(match[1].trim());\n }\n }\n return [...facts];\n}\n\nconst FACTS_PREFIX = \"___keyfacts___:\";\n\nexport class KeyFactsStrategy implements MemoryStrategy {\n private facts = new Map<string, number>();\n private loaded = false;\n\n private async ensureLoaded(store: MemoryStore, resourceId: string, threadId: string): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const entries = await store.load(resourceId, threadId);\n const factEntries = entries\n .filter((e) => e.content.startsWith(FACTS_PREFIX))\n .sort((a, b) => b.timestamp - a.timestamp);\n if (factEntries.length > 0) {\n this.facts = new Map(JSON.parse(factEntries[0].content.slice(FACTS_PREFIX.length)));\n }\n } catch {\n // ignore load errors on cold start\n }\n }\n\n async getInputContext(store: MemoryStore, resourceId: string, threadId: string): Promise<string> {\n await this.ensureLoaded(store, resourceId, threadId);\n if (this.facts.size === 0) return \"\";\n\n const lines = [...this.facts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([fact]) => `- ${fact}`);\n\n return `## Known facts about the user\\n\\n${lines.join(\"\\n\")}`;\n }\n\n async recordTurn(\n store: MemoryStore,\n resourceId: string,\n threadId: string,\n input: string,\n output: string,\n _toolCalls?: { tool: string; input: unknown; output: unknown }[],\n ): Promise<void> {\n await this.ensureLoaded(store, resourceId, threadId);\n\n const extracted = [...extractFacts(input), ...extractFacts(output)];\n for (const fact of extracted) {\n this.facts.set(fact, (this.facts.get(fact) ?? 0) + 1);\n }\n\n await store.save(resourceId, threadId, [\n { role: \"user\", content: input, timestamp: Date.now() },\n { role: \"assistant\", content: output, timestamp: Date.now() },\n {\n role: \"tool\",\n content: `${FACTS_PREFIX}${JSON.stringify([...this.facts.entries()])}`,\n timestamp: Date.now(),\n },\n ]);\n }\n}\n","import type { MemoryStore, MemoryStrategy } from \"../types\";\n\nexport type SummarizeFn = (text: string) => Promise<string>;\n\nfunction truncate(text: string, maxChars: number = 2000): string {\n if (text.length <= maxChars) return text;\n return text.slice(0, maxChars) + \"...\";\n}\n\nexport class SummaryStrategy implements MemoryStrategy {\n private limit: number;\n private summary = \"\";\n private summarize: SummarizeFn;\n private mutex = Promise.resolve();\n\n constructor(limit: number = 10, summarize?: SummarizeFn) {\n this.limit = limit;\n this.summarize = summarize ?? this.defaultSummarize;\n }\n\n private async exclusive<T>(fn: () => Promise<T>): Promise<T> {\n const prev = this.mutex;\n let release: () => void;\n this.mutex = new Promise<void>((resolve) => { release = resolve; });\n await prev;\n try {\n return await fn();\n } finally {\n release!();\n }\n }\n\n private async defaultSummarize(text: string): Promise<string> {\n const truncated = truncate(text);\n const apiKey = process.env.CENCORI_API_KEY;\n const endpoint = process.env.CENCORI_API_URL || \"https://cencori.com/v1\";\n\n if (!apiKey) {\n return `Previous conversation: ${truncated.slice(0, 500)}`;\n }\n\n try {\n const res = await fetch(`${endpoint}/responses`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: \"gpt-4o-mini\",\n input: `Summarize this conversation concisely:\\n\\n${truncated}`,\n max_output_tokens: 300,\n }),\n });\n\n if (!res.ok) return `Previous conversation: ${truncated.slice(0, 500)}`;\n\n const data = await res.json() as { output?: { output?: { content?: { text?: string }[] }[] } };\n const text = data.output?.output?.[0]?.content?.[0]?.text;\n return text ?? `Previous conversation: ${truncated.slice(0, 500)}`;\n } catch {\n return `Previous conversation: ${truncated.slice(0, 500)}`;\n }\n }\n\n async getInputContext(store: MemoryStore, resourceId: string, threadId: string): Promise<string> {\n const entries = await store.load(resourceId, threadId);\n const recentEntries: string[] = [];\n const summarizeEntries: string[] = [];\n\n if (this.summary) {\n summarizeEntries.push(`Summary of earlier conversation: ${this.summary}`);\n }\n\n for (const e of entries) {\n const prefix = e.role === \"user\" ? \"User\" : e.role === \"assistant\" ? \"Assistant\" : \"Tool\";\n recentEntries.push(`${prefix}: ${e.content}`);\n }\n\n const parts = [...summarizeEntries, ...recentEntries];\n if (parts.length === 0) return \"\";\n\n return `## Conversation history\\n\\n${parts.join(\"\\n\")}`;\n }\n\n async recordTurn(\n store: MemoryStore,\n resourceId: string,\n threadId: string,\n input: string,\n output: string,\n toolCalls?: { tool: string; input: unknown; output: unknown }[],\n ): Promise<void> {\n await this.exclusive(async () => {\n const entries: Array<{ role: \"user\" | \"assistant\" | \"tool\"; content: string; timestamp: number }> = [\n { role: \"user\", content: input, timestamp: Date.now() },\n { role: \"assistant\", content: output, timestamp: Date.now() },\n ];\n\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n entries.push({\n role: \"tool\" as const,\n content: JSON.stringify({ tool: tc.tool, result: tc.output }),\n timestamp: Date.now(),\n });\n }\n }\n\n await store.save(resourceId, threadId, entries);\n\n const allEntries = await store.load(resourceId, threadId);\n if (allEntries.length > this.limit * 2) {\n const textToSummarize = allEntries\n .slice(0, allEntries.length - this.limit)\n .map((e) => `${e.role}: ${e.content}`)\n .join(\"\\n\");\n\n this.summary = await this.summarize(textToSummarize);\n\n const recentEntries = allEntries.slice(allEntries.length - this.limit);\n await store.clear(resourceId, threadId);\n await store.save(resourceId, threadId, recentEntries);\n }\n });\n }\n}\n","import type { MemoryEntry, MemoryStore, MemoryStrategy } from \"./types\";\n\nexport class SemanticRecall implements MemoryStrategy {\n private topK: number;\n\n constructor(topK: number = 5) {\n this.topK = topK;\n }\n\n async getInputContext(store: MemoryStore, resourceId: string, threadId: string): Promise<string> {\n if (!store.search) return \"\";\n\n try {\n const entries = await store.search(resourceId, threadId, \"*\", this.topK);\n if (entries.length === 0) return \"\";\n\n const sorted = [...entries].sort((a, b) => {\n const sa = a.score ?? -Infinity;\n const sb = b.score ?? -Infinity;\n if (sa !== sb) return sb - sa;\n return b.timestamp - a.timestamp;\n });\n\n const lines = sorted.map((e) => {\n const prefix = e.role === \"user\" ? \"User\" : e.role === \"assistant\" ? \"Assistant\" : \"Tool\";\n const scoreStr = e.score !== undefined ? ` [relevance: ${(e.score * 100).toFixed(0)}%]` : \"\";\n return `${prefix}${scoreStr}: ${e.content}`;\n });\n\n return `## Relevant memories\\n\\n${lines.join(\"\\n\")}`;\n } catch {\n return \"\";\n }\n }\n\n async recordTurn(\n store: MemoryStore,\n resourceId: string,\n threadId: string,\n input: string,\n output: string,\n toolCalls?: { tool: string; input: unknown; output: unknown }[],\n ): Promise<void> {\n const entries: MemoryEntry[] = [\n { role: \"user\", content: input, timestamp: Date.now() },\n { role: \"assistant\", content: output, timestamp: Date.now() },\n ];\n\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n entries.push({\n role: \"tool\",\n content: JSON.stringify({ tool: tc.tool, result: tc.output }),\n timestamp: Date.now(),\n });\n }\n }\n\n await store.save(resourceId, threadId, entries);\n }\n}\n","import { readFileSync, existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { z } from \"zod\";\nimport type { MemoryStore, MemoryStrategy } from \"./types\";\nimport type { ToolConfig } from \"../types\";\n\nconst updateWorkingMemorySchema = z.object({\n section: z.string().describe(\"The markdown section heading to update (e.g. 'Interests', 'Goals')\"),\n content: z.string().describe(\"The new bullet-list content for the section\"),\n});\n\nexport const DEFAULT_TEMPLATE = `# User Profile\n\n- **Name**:\n- **Interests**:\n- **Goals**:\n- **Preferences**:\n`;\n\nexport const WORKING_MEMORY_SYSTEM_INSTRUCTION = `You have access to a persistent working memory that stores information about the user.\nYou can read the current working memory below and update it using the \\`updateWorkingMemory\\` tool.\n\nWhen the user tells you something about themselves, update the working memory to reflect it.\nUse the \\`updateWorkingMemory\\` tool with \\`section\\` set to the markdown heading (e.g. \"Interests\") and \\`content\\` set to the new bullet list content for that section.`;\n\nexport class WorkingMemory implements MemoryStrategy {\n private template: string;\n private content: string;\n private baseDir: string;\n private resourceId: string;\n private initialized = false;\n\n constructor(template?: string, baseDir?: string, resourceId?: string) {\n this.template = template ?? DEFAULT_TEMPLATE;\n this.content = this.template;\n this.resourceId = resourceId ?? \"default\";\n this.baseDir = baseDir ?? resolve(homedir(), \".arcie\", \"memory\", \"working\");\n }\n\n private ensureDir(): void {\n if (!this.initialized) {\n mkdirSync(this.baseDir, { recursive: true });\n this.initialized = true;\n }\n }\n\n private filePath(resourceId: string): string {\n return resolve(this.baseDir, `${resourceId}.md`);\n }\n\n private loadFromDisk(resourceId: string): void {\n this.ensureDir();\n const path = this.filePath(resourceId);\n if (existsSync(path)) {\n this.content = readFileSync(path, \"utf-8\");\n } else {\n this.content = this.template;\n }\n }\n\n private saveToDisk(resourceId: string): void {\n this.ensureDir();\n writeFileSync(this.filePath(resourceId), this.content, \"utf-8\");\n }\n\n getSystemInstruction(): string {\n return WORKING_MEMORY_SYSTEM_INSTRUCTION;\n }\n\n getCurrentContent(resourceId: string): string {\n this.loadFromDisk(resourceId);\n return this.content;\n }\n\n updateSection(resourceId: string, section: string, content: string): void {\n this.loadFromDisk(resourceId);\n\n const sectionRegex = new RegExp(`(##\\\\s*${escapeRegex(section)}[\\\\s\\\\S]*?)(?=\\\\n##\\\\s|\\\\n*$)`, \"i\");\n const existing = this.content.match(sectionRegex);\n\n if (existing) {\n const headerMatch = existing[0].match(/^##\\s+.+$/m);\n const header = headerMatch ? headerMatch[0] : `## ${section}`;\n this.content = this.content.replace(existing[0], `${header}\\n\\n${content}\\n`);\n } else {\n this.content += `\\n## ${section}\\n\\n${content}\\n`;\n }\n\n this.saveToDisk(resourceId);\n }\n\n getToolDefinitions(): Record<string, ToolConfig> {\n const resourceId = this.resourceId;\n return {\n updateWorkingMemory: {\n description: \"Update a section of the working memory with new content. Use this when the user shares personal information.\",\n inputSchema: updateWorkingMemorySchema,\n execute: async (input: unknown) => {\n const { section, content } = input as { section: string; content: string };\n this.updateSection(resourceId, section, content);\n return { updated: true, section };\n },\n },\n };\n }\n\n async getInputContext(_store: MemoryStore, resourceId: string, _threadId: string): Promise<string> {\n this.loadFromDisk(resourceId);\n if (!this.content || this.content === this.template) return \"\";\n return `## Working Memory (persistent — edit ~/.arcie/memory/working/${resourceId}.md directly)\\n\\n${this.content}`;\n }\n\n async recordTurn(\n _store: MemoryStore,\n _resourceId: string,\n _threadId: string,\n _input: string,\n _output: string,\n _toolCalls?: { tool: string; input: unknown; output: unknown }[],\n ): Promise<void> {\n // Working memory is updated via tool calls, not automatically\n }\n}\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","import type { MemoryStore, InputProcessor, OutputProcessor } from \"../types\";\n\nexport class MessageHistoryProcessor implements InputProcessor, OutputProcessor {\n name = \"message-history\";\n private limit: number;\n\n constructor(limit: number = 10) {\n this.limit = limit;\n }\n\n async processInput(store: MemoryStore, resourceId: string, threadId: string): Promise<string> {\n const entries = await store.load(resourceId, threadId, this.limit);\n if (entries.length === 0) return \"\";\n\n const lines = entries.map((e) => {\n const prefix = e.role === \"user\" ? \"User\" : e.role === \"assistant\" ? \"Assistant\" : \"Tool\";\n return `${prefix}: ${e.content}`;\n });\n\n return `## Recent conversation history\\n\\n${lines.join(\"\\n\")}`;\n }\n\n async processOutput(\n store: MemoryStore,\n resourceId: string,\n threadId: string,\n input: string,\n output: string,\n toolCalls?: { tool: string; input: unknown; output: unknown }[],\n ): Promise<void> {\n const entries: Array<{ role: \"user\" | \"assistant\" | \"tool\"; content: string; timestamp: number }> = [\n { role: \"user\", content: input, timestamp: Date.now() },\n { role: \"assistant\", content: output, timestamp: Date.now() },\n ];\n if (toolCalls && toolCalls.length > 0) {\n for (const tc of toolCalls) {\n entries.push({\n role: \"tool\",\n content: JSON.stringify({ tool: tc.tool, result: tc.output }),\n timestamp: Date.now(),\n });\n }\n }\n await store.save(resourceId, threadId, entries);\n }\n}\n","import { z } from \"zod\";\nimport type { MemoryStore, MemoryProcessor } from \"../types\";\nimport type { ToolConfig } from \"../../types\";\n\nconst WORKING_MEMORY_KEY = \"__working_memory__\";\n\nconst DEFAULT_TEMPLATE = `# User Profile\n\n- **Name**:\n- **Interests**:\n- **Goals**:\n- **Preferences**:\n`;\n\nconst TEMPLATE_SYSTEM_INSTRUCTION = `You have access to a persistent working memory that stores information about the user.\nYou can read the current working memory below and update it using the \\`updateWorkingMemory\\` tool.\n\nWhen the user tells you something about themselves, update the working memory to reflect it.\nUse the \\`updateWorkingMemory\\` tool with \\`content\\` set to the full updated markdown content.`;\n\nconst SCHEMA_SYSTEM_INSTRUCTION = `You have access to a persistent working memory that stores structured data about the user.\nYou can read the current working memory below and update it using the \\`updateWorkingMemory\\` tool.\n\nWhen the user tells you something about themselves, update the working memory to reflect it.\nThe tool uses merge semantics: send only the fields you want to add or change. Set a field to null to delete it.\nObjects are deep-merged. Arrays are replaced entirely.`;\n\nexport interface WorkingMemoryConfig {\n enabled?: boolean;\n template?: string;\n schema?: z.ZodType<any>;\n scope?: \"thread\" | \"resource\";\n}\n\ntype WmMode = { type: \"template\"; template: string } | { type: \"schema\"; schema: z.ZodType<any> };\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n const val = source[key];\n if (val === null) {\n delete result[key];\n } else if (\n val !== null &&\n typeof val === \"object\" &&\n !Array.isArray(val) &&\n typeof result[key] === \"object\" &&\n result[key] !== null &&\n !Array.isArray(result[key])\n ) {\n result[key] = deepMerge(result[key] as Record<string, unknown>, val as Record<string, unknown>);\n } else {\n result[key] = val;\n }\n }\n return result;\n}\n\nexport const WORKING_MEMORY_SYSTEM_INSTRUCTION = TEMPLATE_SYSTEM_INSTRUCTION;\n\nexport class WorkingMemoryProcessor implements MemoryProcessor {\n name = \"working-memory\";\n private store: MemoryStore;\n private resourceId: string;\n private threadId: string;\n private config: WorkingMemoryConfig;\n private mode: WmMode;\n currentContent: string = \"\";\n\n constructor(store: MemoryStore, resourceId: string, threadId: string, config?: WorkingMemoryConfig) {\n this.store = store;\n this.resourceId = resourceId;\n this.threadId = threadId;\n this.config = {\n enabled: true,\n scope: \"resource\",\n ...config,\n };\n\n if (this.config.schema) {\n this.mode = { type: \"schema\", schema: this.config.schema };\n } else {\n this.mode = { type: \"template\", template: this.config.template ?? DEFAULT_TEMPLATE };\n }\n }\n\n private key(): string {\n return this.config.scope === \"resource\" ? this.resourceId : this.threadId;\n }\n\n private defaultContent(): string {\n if (this.mode.type === \"template\") return this.mode.template;\n return JSON.stringify(this.mode.schema.parse({}), null, 2);\n }\n\n async loadContent(): Promise<string> {\n const k = this.key();\n const entries = await this.store.load(k, WORKING_MEMORY_KEY);\n if (entries.length === 0) return this.defaultContent();\n const wm = entries.find((e) => e.role === \"system\");\n return wm?.content ?? this.defaultContent();\n }\n\n async processInput(_store: MemoryStore, _resourceId: string, _threadId: string): Promise<string> {\n if (!this.config.enabled) return \"\";\n this.currentContent = await this.loadContent();\n if (!this.currentContent || this.currentContent === this.defaultContent()) return \"\";\n const label = this.mode.type === \"schema\" ? \"## Working Memory\\n\\n```json\" : \"## Working Memory\";\n const suffix = this.mode.type === \"schema\" ? \"```\" : \"\";\n return `${label}\\n${this.currentContent}${suffix ? `\\n${suffix}` : \"\"}`;\n }\n\n async processOutput(\n _store: MemoryStore,\n _resourceId: string,\n _threadId: string,\n _input: string,\n _output: string,\n _toolCalls?: { tool: string; input: unknown; output: unknown }[],\n ): Promise<void> {\n // Working memory is updated via tool calls, not automatically\n }\n\n getSystemInstruction(): string {\n if (!this.config.enabled) return \"\";\n return this.mode.type === \"schema\" ? SCHEMA_SYSTEM_INSTRUCTION : TEMPLATE_SYSTEM_INSTRUCTION;\n }\n\n getToolDefinitions(): Record<string, ToolConfig> {\n if (!this.config.enabled) return {};\n const self = this;\n\n if (this.mode.type === \"schema\") {\n return {\n updateWorkingMemory: {\n description: \"Update the working memory with new information about the user or conversation. Uses merge semantics: send only the fields to add or change.\",\n inputSchema: z.object({\n updates: z\n .record(z.unknown())\n .describe(\"Partial data to merge into working memory. Objects deep-merge, arrays replace, null deletes.\"),\n }),\n execute: async (input: unknown) => {\n const { updates } = input as { updates: Record<string, unknown> };\n const k = self.key();\n const raw = await self.loadContent();\n let current: Record<string, unknown>;\n try {\n current = JSON.parse(raw);\n } catch {\n current = {};\n }\n const merged = deepMerge(current, updates);\n const content = JSON.stringify(merged, null, 2);\n await self.store.save(k, WORKING_MEMORY_KEY, [\n { role: \"system\", content, timestamp: Date.now() },\n ]);\n return { updated: true };\n },\n },\n };\n }\n\n // Template mode\n const updateWmSchema = z.object({\n content: z.string().describe(\"The full updated markdown content for working memory\"),\n });\n\n return {\n updateWorkingMemory: {\n description: \"Update the working memory with new content about the user.\",\n inputSchema: updateWmSchema,\n execute: async (input: unknown) => {\n const { content } = input as { content: string };\n const k = self.key();\n await self.store.save(k, WORKING_MEMORY_KEY, [\n { role: \"system\", content, timestamp: Date.now() },\n ]);\n return { updated: true };\n },\n },\n };\n }\n}\n","import type { MemoryStore, MemoryProcessor, Embedder, VectorStore } from \"../types\";\n\nexport interface SemanticRecallConfig {\n topK?: number;\n messageRange?: number;\n scope?: \"thread\" | \"resource\";\n}\n\nexport class SemanticRecallProcessor implements MemoryProcessor {\n name = \"semantic-recall\";\n private config: SemanticRecallConfig;\n private embedder: Embedder;\n private vectorStore: VectorStore;\n\n constructor(embedder: Embedder, vectorStore: VectorStore, config?: SemanticRecallConfig) {\n this.embedder = embedder;\n this.vectorStore = vectorStore;\n this.config = {\n topK: 5,\n messageRange: 2,\n scope: \"thread\",\n ...config,\n };\n }\n\n async processInput(store: MemoryStore, resourceId: string, threadId: string): Promise<string> {\n const entries = await store.load(resourceId, threadId, this.config.topK);\n if (entries.length === 0) return \"\";\n\n const lines = entries.map((e) => {\n const prefix = e.role === \"user\" ? \"User\" : e.role === \"assistant\" ? \"Assistant\" : \"Tool\";\n const scoreStr = e.score !== undefined ? ` [relevance: ${(e.score * 100).toFixed(0)}%]` : \"\";\n return `${prefix}${scoreStr}: ${e.content}`;\n });\n\n return `## Relevant past context\\n\\n${lines.join(\"\\n\")}`;\n }\n\n async processOutput(\n store: MemoryStore,\n resourceId: string,\n threadId: string,\n input: string,\n output: string,\n toolCalls?: { tool: string; input: unknown; output: unknown }[],\n ): Promise<void> {\n const texts = [input, output];\n if (toolCalls) {\n for (const tc of toolCalls) {\n texts.push(JSON.stringify({ tool: tc.tool, result: tc.output }));\n }\n }\n const embeddings = await this.embedder.embedBatch(texts);\n const namespace = this.config.scope === \"resource\" ? resourceId : threadId;\n await this.vectorStore.upsert(namespace, embeddings.map((values, i) => ({\n id: `${threadId}:${Date.now()}:${i}`,\n values,\n metadata: { role: i === 0 ? \"user\" : i === 1 ? \"assistant\" : \"tool\", threadId },\n })));\n }\n}\n","import type { MemoryStore, MemoryStrategy, MemoryProcessor } from \"../types\";\nimport type { ToolConfig } from \"../../types\";\n\n/**\n * Wraps a legacy MemoryStrategy into the MemoryProcessor interface.\n * Allows gradual migration: old strategies (LastN, Summary, KeyFacts) work\n * unchanged inside the new processor pipeline.\n */\nexport class StrategyAdapter implements MemoryProcessor {\n name: string;\n private strategy: MemoryStrategy;\n\n constructor(strategy: MemoryStrategy) {\n this.strategy = strategy;\n this.name = `${strategy.constructor.name}Adapter`;\n }\n\n async processInput(store: MemoryStore, resourceId: string, threadId: string): Promise<string> {\n return this.strategy.getInputContext(store, resourceId, threadId);\n }\n\n async processOutput(\n store: MemoryStore,\n resourceId: string,\n threadId: string,\n input: string,\n output: string,\n toolCalls?: { tool: string; input: unknown; output: unknown }[],\n ): Promise<void> {\n await this.strategy.recordTurn(store, resourceId, threadId, input, output, toolCalls);\n }\n\n getToolDefinitions?(): Record<string, ToolConfig> {\n if (\"getToolDefinitions\" in this.strategy) {\n return (this.strategy as { getToolDefinitions(): Record<string, ToolConfig> }).getToolDefinitions();\n }\n return {};\n }\n}\n","import type { MemoryStore, MemoryStrategy, MemoryEntry, MemoryProcessor, RecallOptions, RecallResult, Thread, DeleteMessagesOptions } from \"./types\";\nexport type { MemoryEntry, MemoryStore, MemoryStrategy, MemoryQuery, Thread, RecallOptions, RecallResult, MemoryProcessor, Embedder, VectorStore, InputProcessor, OutputProcessor, DeleteMessagesOptions } from \"./types\";\nexport { InMemoryStore } from \"./store\";\nexport { SqliteStore } from \"./sqlite-store\";\nexport { FileStore } from \"./file-store\";\nexport { CencoriMemoryStore } from \"./cencori-store\";\nexport type { CencoriMemoryClient } from \"./cencori-store\";\nexport { LastNStrategy } from \"./strategies/lastN\";\nexport { KeyFactsStrategy } from \"./strategies/keyFacts\";\nexport { SummaryStrategy } from \"./strategies/summary\";\nexport type { SummarizeFn } from \"./strategies/summary\";\nexport { SemanticRecall } from \"./semantic\";\nexport { WorkingMemory, DEFAULT_TEMPLATE, WORKING_MEMORY_SYSTEM_INSTRUCTION } from \"./working-memory\";\nexport { MessageHistoryProcessor, WorkingMemoryProcessor, SemanticRecallProcessor } from \"./processors/index\";\nexport { StrategyAdapter } from \"./processors/strategy-adapter\";\nexport { asUserTurn } from \"./multi-user\";\nexport type { Speaker } from \"./multi-user\";\nexport type { WorkingMemoryConfig } from \"./processors/working-memory\";\nexport type { SemanticRecallConfig } from \"./processors/semantic-recall\";\n\nimport type { SessionConfig, ToolConfig } from \"../types\";\nimport { InMemoryStore } from \"./store\";\nimport { LastNStrategy } from \"./strategies/lastN\";\nimport { KeyFactsStrategy } from \"./strategies/keyFacts\";\nimport { SummaryStrategy } from \"./strategies/summary\";\nimport { SemanticRecall } from \"./semantic\";\nimport { MessageHistoryProcessor, WorkingMemoryProcessor, SemanticRecallProcessor } from \"./processors/index\";\nimport { StrategyAdapter } from \"./processors/strategy-adapter\";\nimport type { WorkingMemoryConfig } from \"./processors/working-memory\";\nimport type { SemanticRecallConfig } from \"./processors/semantic-recall\";\n\nexport interface MemoryOptions {\n store?: MemoryStore;\n resourceId?: string;\n threadId?: string;\n processors?: (MemoryProcessor | MemoryStrategy)[];\n embedder?: import(\"./types\").Embedder;\n vectorStore?: import(\"./types\").VectorStore;\n lastMessages?: number;\n readOnly?: boolean;\n}\n\ninterface BuildConfig {\n type: \"config\";\n config: SessionConfig[\"memory\"];\n opts: MemoryOptions;\n}\n\ninterface BuildOptions {\n type: \"options\";\n opts: MemoryOptions;\n}\n\ntype BuildSource = BuildConfig | BuildOptions;\n\nexport class Memory {\n store: MemoryStore;\n resourceId: string;\n threadId: string;\n private processors: MemoryProcessor[];\n private readOnly: boolean;\n private buildSource: BuildSource;\n\n constructor(options?: MemoryOptions);\n constructor(config: SessionConfig[\"memory\"], options?: MemoryOptions);\n constructor(configOrOptions?: SessionConfig[\"memory\"] | MemoryOptions, options?: MemoryOptions) {\n let config: SessionConfig[\"memory\"] | undefined;\n let opts: MemoryOptions;\n\n if (configOrOptions && \"store\" in configOrOptions) {\n opts = configOrOptions;\n config = undefined;\n } else {\n config = configOrOptions as SessionConfig[\"memory\"];\n opts = options ?? {};\n }\n\n this.buildSource = config\n ? { type: \"config\", config, opts }\n : { type: \"options\", opts };\n\n this.store = opts.store ?? new InMemoryStore();\n this.resourceId = opts.resourceId ?? \"default\";\n this.threadId = opts.threadId ?? \"default\";\n this.readOnly = opts.readOnly ?? false;\n\n this.processors = [];\n\n if (opts.processors) {\n for (const p of opts.processors) {\n if (\"getInputContext\" in p && \"recordTurn\" in p) {\n this.processors.push(new StrategyAdapter(p as MemoryStrategy));\n } else {\n this.processors.push(p as MemoryProcessor);\n }\n }\n } else if (config) {\n this.buildFromConfig(config, opts);\n } else if (opts.lastMessages) {\n this.processors.push(new MessageHistoryProcessor(opts.lastMessages));\n } else {\n this.processors.push(new MessageHistoryProcessor(10));\n }\n }\n\n private buildFromConfig(config: SessionConfig[\"memory\"], opts: MemoryOptions): void {\n if (!config) return;\n switch (config.strategy) {\n case \"lastN\": {\n const strategy = new LastNStrategy(config.limit ?? 10);\n this.processors.push(new StrategyAdapter(strategy));\n break;\n }\n case \"summary\": {\n const strategy = new SummaryStrategy(config.limit ?? 10);\n this.processors.push(new StrategyAdapter(strategy));\n break;\n }\n case \"keyFacts\": {\n const strategy = new KeyFactsStrategy();\n this.processors.push(new StrategyAdapter(strategy));\n break;\n }\n case \"semantic\": {\n if (opts.embedder && opts.vectorStore) {\n this.processors.push(new SemanticRecallProcessor(opts.embedder, opts.vectorStore, {\n topK: config.limit ?? 5,\n scope: \"resource\",\n }));\n } else {\n const strategy = new SemanticRecall(config.limit ?? 5);\n this.processors.push(new StrategyAdapter(strategy));\n }\n break;\n }\n default:\n this.processors.push(new MessageHistoryProcessor(config.limit ?? 10));\n }\n\n if (config.workingMemory) {\n this.processors.push(new WorkingMemoryProcessor(this.store, this.resourceId, this.threadId, {\n enabled: true,\n template: config.workingMemoryTemplate,\n scope: \"resource\",\n }));\n }\n }\n\n /**\n * Create a new Memory instance sharing the same store and configuration\n * but with overridden resourceId, threadId, and/or readOnly.\n * Useful for per-request memory config.\n */\n with(overrides: { resourceId?: string; threadId?: string; readOnly?: boolean }): Memory {\n if (this.buildSource.type === \"config\") {\n return new Memory(this.buildSource.config, {\n ...this.buildSource.opts,\n resourceId: overrides.resourceId ?? this.resourceId,\n threadId: overrides.threadId ?? this.threadId,\n readOnly: overrides.readOnly ?? this.readOnly,\n });\n }\n return new Memory({\n ...this.buildSource.opts,\n resourceId: overrides.resourceId ?? this.resourceId,\n threadId: overrides.threadId ?? this.threadId,\n readOnly: overrides.readOnly ?? this.readOnly,\n });\n }\n\n async destroy(): Promise<void> {\n await this.store.close?.();\n }\n\n async getInputContext(): Promise<string> {\n const parts: string[] = [];\n for (const p of this.processors) {\n const ctx = await p.processInput(this.store, this.resourceId, this.threadId);\n if (ctx) parts.push(ctx);\n }\n return parts.join(\"\\n\\n\");\n }\n\n getSystemInstruction(): string {\n const parts: string[] = [];\n for (const p of this.processors) {\n if (\"getSystemInstruction\" in p) {\n const si = (p as { getSystemInstruction(): string }).getSystemInstruction();\n if (si) parts.push(si);\n }\n }\n return parts.join(\"\\n\\n\");\n }\n\n getToolDefinitions(): Record<string, ToolConfig> {\n if (this.readOnly) return {};\n for (const p of this.processors) {\n if (\"getToolDefinitions\" in p) {\n const tools = (p as { getToolDefinitions(): Record<string, ToolConfig> }).getToolDefinitions();\n if (Object.keys(tools).length > 0) return tools;\n }\n }\n return {};\n }\n\n async recordTurn(\n input: string,\n output: string,\n toolCalls?: { tool: string; input: unknown; output: unknown }[],\n ): Promise<void> {\n if (this.readOnly) return;\n for (const p of this.processors) {\n if (p.processOutput) {\n await p.processOutput(this.store, this.resourceId, this.threadId, input, output, toolCalls);\n }\n }\n }\n\n async clear(): Promise<void> {\n await this.store.clear(this.resourceId, this.threadId);\n }\n\n // ── Thread API ──\n\n async createThread(thread: Thread): Promise<void> {\n if (!this.store.createThread) throw new Error(\"Store does not support thread creation\");\n await this.store.createThread(thread);\n }\n\n async getThread(threadId: string, resourceId: string): Promise<Thread | null> {\n if (!this.store.getThread) throw new Error(\"Store does not support thread retrieval\");\n return this.store.getThread(threadId, resourceId);\n }\n\n async listThreads(resourceId: string): Promise<Thread[]> {\n if (!this.store.listThreads) throw new Error(\"Store does not support thread listing\");\n return this.store.listThreads(resourceId);\n }\n\n async updateThread(thread: Partial<Thread> & { id: string; resourceId: string }): Promise<void> {\n if (!this.store.updateThread) throw new Error(\"Store does not support thread updates\");\n await this.store.updateThread(thread);\n }\n\n async deleteThread(threadId: string, resourceId: string): Promise<void> {\n if (!this.store.deleteThread) throw new Error(\"Store does not support thread deletion\");\n await this.store.deleteThread(threadId, resourceId);\n }\n\n // ── Delete messages ──\n\n async deleteMessages(opts: DeleteMessagesOptions): Promise<number> {\n if (!this.store.deleteMessages) throw new Error(\"Store does not support message deletion\");\n return this.store.deleteMessages(opts);\n }\n\n // ── Clone thread ──\n\n async cloneThread(\n source: { threadId: string; resourceId: string },\n dest: { threadId: string; resourceId: string },\n ): Promise<void> {\n if (!this.store.cloneThread) throw new Error(\"Store does not support thread cloning\");\n await this.store.cloneThread(source, dest);\n }\n\n // ── Recall API ──\n\n async recall(opts: RecallOptions): Promise<RecallResult> {\n let entries = await this.store.load(opts.resourceId, opts.threadId);\n\n if (opts.dateRange) {\n const start = opts.dateRange.start?.getTime() ?? 0;\n const end = opts.dateRange.end?.getTime() ?? Infinity;\n entries = entries.filter((e) => e.timestamp >= start && e.timestamp <= end);\n }\n\n if (opts.include && opts.include.length > 0) {\n const included: MemoryEntry[] = [];\n for (const inc of opts.include) {\n const idx = entries.findIndex((e) => e.turnId === inc.id);\n if (idx === -1) continue;\n const start = Math.max(0, idx - (inc.withPreviousMessages ?? 0));\n const end = Math.min(entries.length, idx + 1 + (inc.withNextMessages ?? 0));\n for (let i = start; i < end; i++) {\n included.push(entries[i]);\n }\n }\n entries = included;\n }\n\n if (opts.vectorSearchString && this.store.search) {\n entries = await this.store.search(opts.resourceId, opts.threadId, opts.vectorSearchString);\n }\n\n const total = entries.length;\n const perPage = opts.perPage ?? 50;\n const page = opts.page ?? 0;\n const start = page * perPage;\n const hasMore = start + perPage < total;\n\n return {\n messages: entries.slice(start, start + perPage),\n total,\n hasMore,\n };\n }\n}\n","import { loadAgent, type LoadedAgent } from \"../loader\";\nimport { toModelOutput } from \"../tools/index\";\nimport { Memory } from \"../memory/index\";\nimport type { TurnContext, ToolCallContext, ApprovalStrategy } from \"../types\";\nimport {\n createSessionStarted, createTurnStarted, createMessageReceived,\n createMessageAppended, createMessageCompleted, createStepStarted,\n createStepCompleted, createSessionWaiting, createTurnCompleted,\n createSessionCompleted, createToolCallStarted, createToolCallCompleted,\n createSubagentCalled, createSubagentCompleted,\n type StreamEvent,\n} from \"../protocol/events\";\n\nexport interface RunOptions {\n endpoint?: string;\n apiKey?: string;\n maxTurns?: number;\n sessionId?: string;\n resourceId?: string;\n threadId?: string;\n memoryStore?: import(\"../memory/index\").MemoryStore;\n onEvent?: (event: StreamEvent) => void;\n}\n\nexport interface RunResult {\n output: string;\n turns: TurnContext[];\n events: StreamEvent[];\n sessionId: string;\n}\n\nconst DEFAULT_ENDPOINT = \"https://cencori.com/v1\";\n\nasync function createChildSession(\n endpoint: string,\n apiKey: string,\n agent: LoadedAgent,\n subagentId: string,\n): Promise<string> {\n const sub = agent.manifest.subagents[subagentId];\n const res = await fetch(`${endpoint}/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n agent_id: `${agent.manifest.config.name ?? \"unnamed\"}.${subagentId}`,\n metadata: {\n model: sub.config.model,\n instructions: sub.instructions,\n },\n }),\n });\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`Subagent session error (${res.status}): ${err}`);\n }\n const data = await res.json() as { id: string };\n return data.id;\n}\n\nasync function executeSubagent(\n endpoint: string,\n apiKey: string,\n agent: LoadedAgent,\n subagentId: string,\n input: unknown,\n childSessionId?: string,\n): Promise<string> {\n const sub = agent.manifest.subagents[subagentId];\n childSessionId ??= await createChildSession(endpoint, apiKey, agent, subagentId);\n const inputStr = typeof input === \"string\" ? input : JSON.stringify(input);\n const tools = Object.entries(sub.tools).map(([name, tool]) => ({\n name,\n description: tool.description,\n input_schema: {},\n type: \"function\" as const,\n }));\n\n const res = await fetch(`${endpoint}/sessions/${childSessionId}/turns`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n model: sub.config.model,\n input: inputStr,\n instructions: sub.instructions,\n tools: tools.length > 0 ? tools : undefined,\n stream: true,\n pause_on_tool_calls: false,\n }),\n });\n\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`Subagent turn error (${res.status}): ${err}`);\n }\n\n let output = \"\";\n let currentEvent = \"\";\n const reader = res.body?.getReader();\n if (reader) {\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n if (line.startsWith(\"event: \")) {\n currentEvent = line.slice(7);\n } else if (line.startsWith(\"data: \")) {\n const payload = line.slice(6);\n if (payload === \"[DONE]\") continue;\n try {\n const parsed = JSON.parse(payload);\n const eventType = currentEvent || parsed.type;\n if (eventType === \"message.appended\" && parsed.delta) {\n output += parsed.delta;\n }\n } catch {}\n }\n }\n }\n }\n\n return output || inputStr;\n}\n\nfunction headers(apiKey: string, agent: LoadedAgent): Record<string, string> {\n return {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${apiKey}`,\n ...(agent.manifest.config.cencori?.project\n ? { \"X-Project-ID\": agent.manifest.config.cencori.project }\n : {}),\n };\n}\n\nasync function createSession(\n endpoint: string,\n apiKey: string,\n agent: LoadedAgent,\n): Promise<string> {\n const res = await fetch(`${endpoint}/sessions`, {\n method: \"POST\",\n headers: headers(apiKey, agent),\n body: JSON.stringify({\n agent_id: agent.manifest.config.name,\n metadata: {\n model: agent.manifest.config.model,\n instructions: agent.manifest.instructions,\n },\n }),\n });\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`Cencori Sessions API error (${res.status}): ${err}`);\n }\n const data = await res.json() as { id: string };\n return data.id;\n}\n\nexport async function runAgent(\n agentDir: string,\n input: string,\n options: RunOptions = {},\n): Promise<RunResult> {\n const agent = await loadAgent(agentDir);\n const endpoint = options.endpoint || process.env.CENCORI_API_URL || DEFAULT_ENDPOINT;\n const apiKey = options.apiKey || process.env.CENCORI_API_KEY || \"\";\n const events: StreamEvent[] = [];\n let outputText = \"\";\n\n if (!apiKey) {\n throw new Error(\n \"Cencori API key required. Set CENCORI_API_KEY env var or pass apiKey in options.\",\n );\n }\n\n const sessionId = options.sessionId || await createSession(endpoint, apiKey, agent);\n\n for await (const event of streamAgent(agentDir, input, { ...options, sessionId, endpoint, apiKey })) {\n events.push(event);\n options.onEvent?.(event);\n if (event.type === \"message.completed\" && event.data.text) {\n outputText = event.data.text;\n }\n }\n\n const toolCalls: ToolCallContext[] = [];\n for (const e of events) {\n if (e.type === \"tool.started\") {\n const completed = events.find(\n (ev): ev is ReturnType<typeof createToolCallCompleted> =>\n ev.type === \"tool.completed\" && ev.data.callId === e.data.callId\n );\n const error = completed?.data.status === \"failed\" || completed?.data.status === \"rejected\"\n ? new Error(completed.data.error?.message ?? \"Tool failed\")\n : undefined;\n toolCalls.push({\n tool: e.data.name,\n input: e.data.input,\n output: completed?.data.output,\n durationMs: undefined,\n ...(error ? { error } : {}),\n });\n }\n }\n\n return {\n output: outputText,\n turns: [{\n id: events.find(e => e.type === \"turn.started\")?.data.turnId ?? \"\",\n sessionId,\n input,\n output: outputText,\n toolCalls,\n }],\n events,\n sessionId,\n };\n}\n\n// ── SSE event reader ──────────────────────────────────────────────\n\ntype ToolCallInfo = {\n name: string;\n args: unknown;\n actionId: string;\n};\n\ntype TurnResult =\n | { status: \"completed\"; text: string }\n | { status: \"paused\"; toolCalls: ToolCallInfo[]; text: string };\n\nasync function* readTurnSSE(\n response: Response,\n turnId: string,\n): AsyncGenerator<StreamEvent, TurnResult, unknown> {\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Cencori Sessions API error (${response.status}): ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) return { status: \"completed\", text: \"\" } as TurnResult;\n\n const decoder = new TextDecoder();\n let buffer = \"\";\n let currentEvent = \"\";\n let textSoFar = \"\";\n const toolCalls: ToolCallInfo[] = [];\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"event: \")) {\n currentEvent = line.slice(7);\n } else if (line.startsWith(\"data: \")) {\n const payload = line.slice(6);\n if (payload === \"[DONE]\") continue;\n try {\n const parsed = JSON.parse(payload);\n const eventType = currentEvent || parsed.type;\n\n switch (eventType) {\n case \"turn.started\": {\n yield createTurnStarted(parsed.turn_number ?? 1, turnId);\n yield createMessageReceived(parsed.input_text ?? \"\", parsed.turn_number ?? 1, turnId);\n yield createStepStarted(1, 0, turnId);\n break;\n }\n\n case \"output_text.delta\": {\n if (parsed.delta) {\n textSoFar += parsed.delta;\n yield createMessageAppended(parsed.delta, textSoFar, 1, 0, turnId);\n }\n break;\n }\n\n case \"tool_call.started\": {\n toolCalls.push({\n name: parsed.tool,\n args: parsed.arguments,\n actionId: parsed.action_id,\n });\n yield createToolCallStarted(\n parsed.tool,\n parsed.arguments,\n parsed.action_id,\n 1,\n 0,\n turnId,\n );\n break;\n }\n\n case \"turn.paused\": {\n currentEvent = \"\";\n return {\n status: \"paused\",\n toolCalls: [...toolCalls],\n text: textSoFar,\n } as TurnResult;\n }\n\n case \"turn.completed\": {\n const out = parsed.output;\n let finalText = textSoFar;\n let finishReason: \"stop\" | \"error\" = \"stop\";\n if (out?.error) {\n finishReason = \"error\";\n } else if (Array.isArray(out?.output)) {\n for (const item of out.output) {\n if (item.type === \"message\") {\n const tc = item.content?.find((c: { type: string; text?: string }) => c.type === \"output_text\");\n if (tc?.text) finalText = tc.text;\n }\n }\n }\n textSoFar = finalText;\n yield createMessageCompleted(finalText, finishReason, 1, 0, turnId);\n yield createStepCompleted(finishReason, 1, 0, turnId);\n yield createTurnCompleted(1, turnId);\n currentEvent = \"\";\n return { status: \"completed\", text: finalText } as TurnResult;\n }\n\n case \"turn.resumed\": {\n break;\n }\n\n default: {\n break;\n }\n }\n\n currentEvent = \"\";\n } catch {}\n }\n }\n }\n\n return { status: \"completed\", text: textSoFar } as TurnResult;\n}\n\n// ── Multi-turn agent loop ─────────────────────────────────────────\n\nexport async function* streamAgent(\n agentDir: string,\n input: string,\n options: RunOptions = {},\n): AsyncGenerator<StreamEvent, void, unknown> {\n const agent = await loadAgent(agentDir);\n const endpoint = options.endpoint || process.env.CENCORI_API_URL || DEFAULT_ENDPOINT;\n const apiKey = options.apiKey || process.env.CENCORI_API_KEY || \"\";\n\n if (!apiKey) {\n throw new Error(\n \"Cencori API key required. Set CENCORI_API_KEY env var or pass apiKey in options.\",\n );\n }\n\n const sessionId = options.sessionId || await createSession(endpoint, apiKey, agent);\n const model = agent.manifest.config.model;\n\n const memory = agent.manifest.session?.memory\n ? new Memory(agent.manifest.session.memory, {\n store: options.memoryStore,\n resourceId: options.resourceId,\n threadId: options.threadId,\n })\n : null;\n const memoryTools = memory ? memory.getToolDefinitions() : {};\n const allTools = { ...agent.manifest.tools, ...memoryTools };\n const tools = Object.entries(allTools).map(([name, tool]) =>\n toModelOutput(name, tool)\n );\n const memoryContext = memory ? await memory.getInputContext() : \"\";\n const memoryInstruction = memory ? memory.getSystemInstruction() : \"\";\n const instructions = [\n agent.manifest.instructions,\n memoryInstruction,\n memoryContext,\n ].filter(Boolean).join(\"\\n\\n\");\n\n yield createSessionStarted(sessionId, {\n agentId: agent.manifest.config.name ?? \"unnamed\",\n modelId: model,\n arcieVersion: \"0.1.2\",\n });\n\n const turnId = crypto.randomUUID();\n const maxToolLoops = options.maxTurns ?? 25;\n\n let response = await fetch(`${endpoint}/sessions/${sessionId}/turns`, {\n method: \"POST\",\n headers: headers(apiKey, agent),\n body: JSON.stringify({\n model,\n input,\n instructions,\n tools: tools.length > 0 ? tools : undefined,\n stream: true,\n pause_on_tool_calls: true,\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n yield createTurnCompleted(1, turnId);\n yield createSessionCompleted();\n throw new Error(`Cencori Sessions API error (${response.status}): ${error}`);\n }\n\n // Track tools approved via \"once\" strategy within this session\n const approvedTools = new Set<string>();\n const allToolCalls: { tool: string; input: unknown; output: unknown }[] = [];\n\n // Tool call loop: pause → execute → approve → resume → repeat\n for (let loop = 0; loop < maxToolLoops; loop++) {\n const eventGen = readTurnSSE(response, turnId);\n let result: TurnResult;\n\n let iter = await eventGen.next();\n while (!iter.done) {\n yield iter.value;\n iter = await eventGen.next();\n }\n result = iter.value;\n\n if (result.status === \"completed\") {\n if (memory) {\n await memory.recordTurn(input, result.text, allToolCalls.length > 0 ? allToolCalls : undefined);\n }\n break;\n }\n\n if (result.status !== \"paused\" || result.toolCalls.length === 0) break;\n\n const toolResults: Array<{ action_id: string; output: string }> = [];\n let needsUserApproval = false;\n\n for (const tc of result.toolCalls) {\n const toolDef = agent.manifest.tools[tc.name] ?? memoryTools[tc.name];\n const subDef = agent.manifest.subagents[tc.name];\n const strategy: ApprovalStrategy | undefined = toolDef?.needsApproval;\n\n if (strategy === \"always\" || (strategy === \"once\" && !approvedTools.has(tc.name))) {\n needsUserApproval = true;\n yield createToolCallCompleted(tc.name, null, tc.actionId, \"pending\",\n { code: \"needs_approval\", message: `Tool \"${tc.name}\" requires approval` }, 1, 0, turnId);\n continue;\n }\n\n if (strategy === \"once\") approvedTools.add(tc.name);\n\n if (toolDef?.execute) {\n try {\n const output = await toolDef.execute(tc.args);\n const outputStr = typeof output === \"string\" ? output : JSON.stringify(output);\n yield createToolCallCompleted(tc.name, outputStr, tc.actionId, \"completed\", undefined, 1, 0, turnId);\n toolResults.push({ action_id: tc.actionId, output: outputStr });\n allToolCalls.push({ tool: tc.name, input: tc.args, output });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Tool execution failed\";\n yield createToolCallCompleted(tc.name, msg, tc.actionId, \"failed\", { code: \"execution_error\", message: msg }, 1, 0, turnId);\n toolResults.push({ action_id: tc.actionId, output: `Error: ${msg}` });\n allToolCalls.push({ tool: tc.name, input: tc.args, output: `Error: ${msg}` });\n }\n } else if (subDef) {\n const callId = tc.actionId;\n try {\n const childSessionId = await createChildSession(endpoint, apiKey, agent, tc.name);\n yield createSubagentCalled(tc.name, callId, childSessionId, turnId);\n const output = await executeSubagent(endpoint, apiKey, agent, tc.name, tc.args, childSessionId);\n yield createSubagentCompleted(tc.name, callId, output);\n yield createToolCallCompleted(tc.name, output, tc.actionId, \"completed\", undefined, 1, 0, turnId);\n toolResults.push({ action_id: tc.actionId, output });\n allToolCalls.push({ tool: tc.name, input: tc.args, output });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Subagent execution failed\";\n yield createSubagentCompleted(tc.name, callId, `Error: ${msg}`);\n yield createToolCallCompleted(tc.name, msg, tc.actionId, \"failed\", { code: \"execution_error\", message: msg }, 1, 0, turnId);\n toolResults.push({ action_id: tc.actionId, output: `Error: ${msg}` });\n allToolCalls.push({ tool: tc.name, input: tc.args, output: `Error: ${msg}` });\n }\n } else {\n yield createToolCallCompleted(tc.name, \"Tool not found in agent manifest\", tc.actionId, \"failed\", { code: \"tool_not_found\", message: `Tool \"${tc.name}\" not defined in agent` }, 1, 0, turnId);\n toolResults.push({ action_id: tc.actionId, output: \"Error: tool not defined\" });\n allToolCalls.push({ tool: tc.name, input: tc.args, output: \"Error: tool not defined\" });\n }\n }\n\n if (needsUserApproval && toolResults.length === 0) {\n yield createSessionWaiting();\n return;\n }\n\n const firstActionId = toolResults[0]!.action_id;\n\n const approveRes = await fetch(\n `${endpoint}/sessions/${sessionId}/approve`,\n {\n method: \"POST\",\n headers: headers(apiKey, agent),\n body: JSON.stringify({\n action_id: firstActionId,\n tool_results: toolResults,\n }),\n },\n );\n\n if (!approveRes.ok) {\n const errText = await approveRes.text();\n yield createTurnCompleted(1, turnId);\n yield createSessionCompleted();\n throw new Error(`Cencori Sessions approve error (${approveRes.status}): ${errText}`);\n }\n\n response = approveRes;\n }\n\n yield createSessionWaiting();\n}\n"],"mappings":"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","names":["resolve","readFileSync","existsSync","mkdirSync","resolve","dirname","homedir","resolve","text","readFileSync","existsSync","mkdirSync","writeFileSync","resolve","homedir","z","DEFAULT_TEMPLATE","DEFAULT_TEMPLATE","z","start"]}