@jussmor/sdk-ai 0.2.0

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 (111) hide show
  1. package/dist/conversation-kIkMQdYK.d.cts +105 -0
  2. package/dist/conversation-kIkMQdYK.d.ts +105 -0
  3. package/dist/conversation-store-CAyPuBjk.d.ts +10 -0
  4. package/dist/conversation-store-Cl42jpsA.d.cts +10 -0
  5. package/dist/index.cjs +1630 -0
  6. package/dist/index.cjs.map +1 -0
  7. package/dist/index.d.cts +251 -0
  8. package/dist/index.d.ts +251 -0
  9. package/dist/index.js +1536 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/memory-uBLqrQRY.d.cts +28 -0
  12. package/dist/memory-uBLqrQRY.d.ts +28 -0
  13. package/dist/providers/llm/anthropic.cjs +275 -0
  14. package/dist/providers/llm/anthropic.cjs.map +1 -0
  15. package/dist/providers/llm/anthropic.d.cts +22 -0
  16. package/dist/providers/llm/anthropic.d.ts +22 -0
  17. package/dist/providers/llm/anthropic.js +240 -0
  18. package/dist/providers/llm/anthropic.js.map +1 -0
  19. package/dist/providers/llm/ollama.cjs +195 -0
  20. package/dist/providers/llm/ollama.cjs.map +1 -0
  21. package/dist/providers/llm/ollama.d.cts +23 -0
  22. package/dist/providers/llm/ollama.d.ts +23 -0
  23. package/dist/providers/llm/ollama.js +170 -0
  24. package/dist/providers/llm/ollama.js.map +1 -0
  25. package/dist/providers/llm/openai.cjs +213 -0
  26. package/dist/providers/llm/openai.cjs.map +1 -0
  27. package/dist/providers/llm/openai.d.cts +22 -0
  28. package/dist/providers/llm/openai.d.ts +22 -0
  29. package/dist/providers/llm/openai.js +178 -0
  30. package/dist/providers/llm/openai.js.map +1 -0
  31. package/dist/providers/memory/filesystem.cjs +112 -0
  32. package/dist/providers/memory/filesystem.cjs.map +1 -0
  33. package/dist/providers/memory/filesystem.d.cts +17 -0
  34. package/dist/providers/memory/filesystem.d.ts +17 -0
  35. package/dist/providers/memory/filesystem.js +87 -0
  36. package/dist/providers/memory/filesystem.js.map +1 -0
  37. package/dist/providers/store/filesystem.cjs +87 -0
  38. package/dist/providers/store/filesystem.cjs.map +1 -0
  39. package/dist/providers/store/filesystem.d.cts +14 -0
  40. package/dist/providers/store/filesystem.d.ts +14 -0
  41. package/dist/providers/store/filesystem.js +62 -0
  42. package/dist/providers/store/filesystem.js.map +1 -0
  43. package/dist/providers/thread/memory.cjs +81 -0
  44. package/dist/providers/thread/memory.cjs.map +1 -0
  45. package/dist/providers/thread/memory.d.cts +14 -0
  46. package/dist/providers/thread/memory.d.ts +14 -0
  47. package/dist/providers/thread/memory.js +56 -0
  48. package/dist/providers/thread/memory.js.map +1 -0
  49. package/dist/providers/thread/sqlite.cjs +917 -0
  50. package/dist/providers/thread/sqlite.cjs.map +1 -0
  51. package/dist/providers/thread/sqlite.d.cts +17 -0
  52. package/dist/providers/thread/sqlite.d.ts +17 -0
  53. package/dist/providers/thread/sqlite.js +911 -0
  54. package/dist/providers/thread/sqlite.js.map +1 -0
  55. package/dist/providers/tokenizers/auto.cjs +136 -0
  56. package/dist/providers/tokenizers/auto.cjs.map +1 -0
  57. package/dist/providers/tokenizers/auto.d.cts +24 -0
  58. package/dist/providers/tokenizers/auto.d.ts +24 -0
  59. package/dist/providers/tokenizers/auto.js +107 -0
  60. package/dist/providers/tokenizers/auto.js.map +1 -0
  61. package/dist/streaming-B-P6Fw_k.d.cts +372 -0
  62. package/dist/streaming-BtD23BE0.d.ts +372 -0
  63. package/dist/thread-C2b9xRMJ.d.cts +30 -0
  64. package/dist/thread-C2b9xRMJ.d.ts +30 -0
  65. package/dist/tokenizer-BhG_RGUk.d.cts +13 -0
  66. package/dist/tokenizer-BhG_RGUk.d.ts +13 -0
  67. package/package.json +84 -0
  68. package/src/agent-loop.ts +311 -0
  69. package/src/agent-source.ts +12 -0
  70. package/src/artifact.ts +31 -0
  71. package/src/compaction.ts +75 -0
  72. package/src/context-budget.ts +65 -0
  73. package/src/conversation-store.ts +8 -0
  74. package/src/conversation.ts +42 -0
  75. package/src/dispatch.ts +207 -0
  76. package/src/engine.ts +53 -0
  77. package/src/execution-context.ts +31 -0
  78. package/src/index.ts +37 -0
  79. package/src/interrupt-store.ts +25 -0
  80. package/src/interrupt.ts +55 -0
  81. package/src/llm-router.ts +34 -0
  82. package/src/llm.ts +100 -0
  83. package/src/memory-selector.ts +38 -0
  84. package/src/memory.ts +34 -0
  85. package/src/mode.ts +81 -0
  86. package/src/permissions.ts +104 -0
  87. package/src/protocol.ts +1 -0
  88. package/src/providers/llm/anthropic.ts +298 -0
  89. package/src/providers/llm/ollama.ts +219 -0
  90. package/src/providers/llm/openai.ts +215 -0
  91. package/src/providers/memory/filesystem.ts +99 -0
  92. package/src/providers/store/filesystem.ts +64 -0
  93. package/src/providers/thread/memory.ts +67 -0
  94. package/src/providers/thread/sqlite.ts +147 -0
  95. package/src/providers/tokenizers/auto.ts +26 -0
  96. package/src/providers/tokenizers/byte.ts +27 -0
  97. package/src/providers/tokenizers/tiktoken.ts +91 -0
  98. package/src/reasoning.ts +7 -0
  99. package/src/rule-matcher.ts +32 -0
  100. package/src/runtime.ts +416 -0
  101. package/src/safety.ts +56 -0
  102. package/src/sandbox.ts +23 -0
  103. package/src/session-context.ts +33 -0
  104. package/src/skill-source.ts +21 -0
  105. package/src/streaming.ts +124 -0
  106. package/src/system-prompt.ts +71 -0
  107. package/src/system-reminder.ts +9 -0
  108. package/src/thread.ts +33 -0
  109. package/src/tokenizer.ts +31 -0
  110. package/src/tool.ts +175 -0
  111. package/src/tracing.ts +63 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/protocol.ts","../src/tool.ts","../src/streaming.ts","../src/conversation.ts","../src/mode.ts","../src/memory.ts","../src/thread.ts","../src/artifact.ts","../src/interrupt.ts","../src/safety.ts","../src/tracing.ts","../src/tokenizer.ts","../src/system-prompt.ts","../src/system-reminder.ts","../src/context-budget.ts","../src/compaction.ts","../src/permissions.ts","../src/session-context.ts","../src/execution-context.ts","../src/interrupt-store.ts","../src/memory-selector.ts","../src/rule-matcher.ts","../src/engine.ts","../src/dispatch.ts","../src/llm-router.ts","../src/agent-loop.ts","../src/runtime.ts"],"sourcesContent":["// Core types\nexport * from \"./protocol.js\";\nexport * from \"./llm.js\";\nexport * from \"./tool.js\";\nexport * from \"./streaming.js\";\nexport * from \"./conversation.js\";\nexport * from \"./conversation-store.js\";\nexport * from \"./mode.js\";\nexport * from \"./memory.js\";\nexport * from \"./thread.js\";\nexport * from \"./sandbox.js\";\nexport * from \"./artifact.js\";\nexport * from \"./interrupt.js\";\nexport * from \"./safety.js\";\nexport * from \"./tracing.js\";\nexport * from \"./reasoning.js\";\nexport * from \"./tokenizer.js\";\nexport * from \"./system-prompt.js\";\nexport * from \"./system-reminder.js\";\nexport * from \"./context-budget.js\";\nexport * from \"./compaction.js\";\nexport * from \"./permissions.js\";\nexport * from \"./session-context.js\";\n\nexport * from \"./execution-context.js\";\nexport * from \"./interrupt-store.js\";\nexport * from \"./agent-source.js\";\nexport * from \"./memory-selector.js\";\nexport * from \"./rule-matcher.js\";\nexport * from \"./skill-source.js\";\n\n// Core components\nexport * from \"./engine.js\";\nexport * from \"./dispatch.js\";\nexport * from \"./agent-loop.js\";\nexport * from \"./llm-router.js\";\nexport * from \"./runtime.js\";\n","export const PROTOCOL_VERSION = \"1\" as const;\n","import type { ToolDef, ToolFuncParams } from \"./llm.js\";\n\nexport type ToolCategory =\n | \"workspace\"\n | \"compute\"\n | \"data\"\n | \"web\"\n | \"planning\"\n | \"communication\"\n | \"integrations\"\n | \"memory\"\n | \"custom\";\n\nexport type ToolExecuteFunc = (\n ctx: AbortSignal | undefined,\n sandboxId: string,\n args: Record<string, unknown>,\n) => Promise<string>;\n\nexport type ToolPredicate = (args: Record<string, unknown>) => boolean;\n\nexport type ToolValidator = (\n ctx: AbortSignal | undefined,\n args: Record<string, unknown>,\n) => Promise<void>;\n\nexport type PermissionDecision = \"allow\" | \"deny\" | \"ask_user\";\n\nexport interface PermissionResult {\n decision: PermissionDecision;\n reason?: string;\n updatedArgs?: Record<string, unknown>;\n}\n\nexport type ToolPermissionFn = (\n ctx: AbortSignal | undefined,\n args: Record<string, unknown>,\n) => Promise<PermissionResult>;\n\nexport type ToolReminderFn = (\n ctx: AbortSignal | undefined,\n) => Promise<string>;\n\nexport interface Tool {\n name: string;\n description: string;\n category: ToolCategory;\n parameters: ToolFuncParams;\n execute: ToolExecuteFunc;\n aliases?: string[];\n searchHint?: string;\n isReadOnly?: ToolPredicate;\n isConcurrencySafe?: ToolPredicate;\n isDestructive?: ToolPredicate;\n validate?: ToolValidator;\n checkPermissions?: ToolPermissionFn;\n dynamicReminder?: ToolReminderFn;\n hidden?: boolean;\n deferred?: boolean;\n alwaysLoad?: boolean;\n maxResultSizeChars?: number;\n}\n\nexport interface ToolMatch {\n tool: Tool;\n score: number;\n}\n\nfunction toToolDef(t: Tool): ToolDef {\n return {\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters,\n },\n };\n}\n\nfunction scoreToolMatch(t: Tool, query: string): number {\n let score = 0;\n if (t.name.toLowerCase().includes(query)) score += 0.6;\n if (t.searchHint?.toLowerCase().includes(query)) score += 0.4;\n if (t.description.toLowerCase().includes(query)) score += 0.3;\n if (t.category.toLowerCase().includes(query)) score += 0.1;\n if (t.aliases?.some((a) => a.toLowerCase().includes(query))) score += 0.2;\n return score;\n}\n\nexport class ToolRegistry {\n private tools = new Map<string, Tool>();\n private aliases = new Map<string, string>();\n\n register(tool: Tool): void {\n this.tools.set(tool.name, tool);\n for (const alias of tool.aliases ?? []) {\n const trimmed = alias.trim();\n if (trimmed && trimmed !== tool.name) {\n this.aliases.set(trimmed, tool.name);\n }\n }\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name) ?? this.tools.get(this.aliases.get(name) ?? \"\");\n }\n\n list(): Tool[] {\n return Array.from(this.tools.values());\n }\n\n byCategory(category: ToolCategory): Tool[] {\n return this.list().filter((t) => t.category === category);\n }\n\n names(): string[] {\n return Array.from(this.tools.keys()).sort();\n }\n\n describeAvailable(): string {\n const tools = this.list().sort((a, b) => a.name.localeCompare(b.name));\n if (tools.length === 0) return \"- none\";\n const lines = tools\n .filter((t) => t.name.trim())\n .map((t) => {\n const desc = t.description.trim();\n return desc ? `- ${t.name}: ${desc}` : `- ${t.name}`;\n });\n return lines.length === 0 ? \"- none\" : lines.join(\"\\n\");\n }\n\n toolDefs(): ToolDef[] {\n return this.list()\n .filter((t) => !t.hidden && !t.deferred)\n .map(toToolDef);\n }\n\n async collectDynamicReminders(\n signal?: AbortSignal,\n ): Promise<string[]> {\n const tools = this.list()\n .filter((t) => t.dynamicReminder != null)\n .sort((a, b) => a.name.localeCompare(b.name));\n\n const results: string[] = [];\n for (const t of tools) {\n const block = await t.dynamicReminder!(signal);\n if (block.trim()) results.push(block);\n }\n return results;\n }\n\n search(query: string): ToolMatch[] {\n const q = query.toLowerCase().trim();\n if (!q) return [];\n return this.list()\n .map((t) => ({ tool: t, score: scoreToolMatch(t, q) }))\n .filter((m) => m.score > 0)\n .sort((a, b) => b.score - a.score);\n }\n\n reveal(name: string): void {\n const tool = this.tools.get(name);\n if (!tool) throw new Error(`tool \"${name}\" not found`);\n tool.hidden = false;\n }\n\n hide(name: string): void {\n const tool = this.tools.get(name);\n if (!tool) throw new Error(`tool \"${name}\" not found`);\n tool.hidden = true;\n }\n}\n\nexport { toToolDef };\n","import type { AgentLoopResult } from \"./agent-loop.js\";\nimport type { Artifact } from \"./artifact.js\";\nimport type { InterruptRequest } from \"./interrupt.js\";\nimport type { ToolCallEntry, ToolResult } from \"./dispatch.js\";\nimport type { LLMProvider, ChatRequest } from \"./llm.js\";\n\nexport type StreamEventType =\n | \"delta\"\n | \"thinking\"\n | \"tool_call\"\n | \"tool_result\"\n | \"turn_complete\"\n | \"agent_result\"\n | \"interrupt_required\"\n | \"interrupt_resolved\"\n | \"artifact_created\"\n | \"artifact_updated\"\n | \"compaction\"\n | \"plan_mode_changed\"\n | \"done\"\n | \"error\";\n\nexport interface CompactionEvent {\n messagesDropped: number;\n overflowTokens: number;\n summary?: string;\n}\n\nexport interface PlanModeEvent {\n state: \"entered\" | \"exited\";\n plan?: string;\n reason?: string;\n}\n\nexport interface AgentResult {\n agentId: string;\n result: AgentLoopResult;\n}\n\nexport interface StreamEvent {\n type: StreamEventType;\n delta?: string;\n thinking?: string;\n toolCall?: ToolCallEntry;\n toolResult?: ToolResult;\n agentResult?: AgentResult;\n interrupt?: InterruptRequest;\n artifact?: Artifact;\n final?: AgentLoopResult;\n compaction?: CompactionEvent;\n planMode?: PlanModeEvent;\n error?: Error;\n}\n\nexport interface StreamingLLMProvider extends LLMProvider {\n chatStream(\n req: ChatRequest,\n signal?: AbortSignal,\n ): AsyncGenerator<StreamEvent>;\n}\n\nexport async function collectStream(\n events: AsyncGenerator<StreamEvent>,\n): Promise<{ text: string; final: AgentLoopResult | undefined; error: Error | undefined }> {\n let text = \"\";\n let final: AgentLoopResult | undefined;\n let error: Error | undefined;\n\n for await (const ev of events) {\n if (ev.type === \"delta\" && ev.delta) text += ev.delta;\n if (ev.type === \"done\") final = ev.final;\n if (ev.type === \"error\") error = ev.error;\n }\n return { text, final, error };\n}\n\nexport function fanOutStream(\n source: AsyncGenerator<StreamEvent>,\n consumers: number,\n): AsyncGenerator<StreamEvent>[] {\n const queues: StreamEvent[][] = Array.from({ length: consumers }, () => []);\n const resolvers: Array<((value: IteratorResult<StreamEvent>) => void) | null> = Array(consumers).fill(null);\n let done = false;\n\n void (async () => {\n for await (const ev of source) {\n for (let i = 0; i < consumers; i++) {\n const resolve = resolvers[i];\n if (resolve) {\n resolvers[i] = null;\n resolve({ value: ev, done: false });\n } else {\n queues[i]!.push(ev);\n }\n }\n }\n done = true;\n for (let i = 0; i < consumers; i++) {\n const resolve = resolvers[i];\n if (resolve) {\n resolvers[i] = null;\n resolve({ value: undefined as unknown as StreamEvent, done: true });\n }\n }\n })();\n\n return Array.from({ length: consumers }, (_, i) => {\n return (async function* (): AsyncGenerator<StreamEvent> {\n while (true) {\n const queued = queues[i]!.shift();\n if (queued !== undefined) {\n yield queued;\n continue;\n }\n if (done) return;\n const ev = await new Promise<IteratorResult<StreamEvent>>((resolve) => {\n resolvers[i] = resolve;\n });\n if (ev.done) return;\n yield ev.value;\n }\n })();\n });\n}\n","import type { ChatMessage } from \"./llm.js\";\n\nexport interface Conversation {\n id: string;\n threadId?: string;\n messages: ChatMessage[];\n memoryRead: boolean;\n turnCount: number;\n createdAt: Date;\n lastTurnAt?: Date;\n}\n\nexport function newConversation(id: string): Conversation {\n return {\n id,\n messages: [],\n memoryRead: false,\n turnCount: 0,\n createdAt: new Date(),\n };\n}\n\nexport function isCold(conv: Conversation): boolean {\n return conv.turnCount === 0;\n}\n\nexport function appendUser(conv: Conversation, content: string): void {\n conv.messages.push({ role: \"user\", content });\n}\n\nexport function appendAssistant(conv: Conversation, content: string): void {\n conv.messages.push({ role: \"assistant\", content });\n}\n\nexport function incrementTurn(conv: Conversation): void {\n conv.turnCount++;\n conv.lastTurnAt = new Date();\n}\n\nexport function messageCount(conv: Conversation): number {\n return conv.messages.length;\n}\n","export type BaseMode = \"balanced\" | \"analyst\" | \"deep_work\";\n\nexport type ToolsMode = \"allowlist\" | \"denylist\";\n\nexport interface ModeMeta {\n id: string;\n name: string;\n baseMode?: string;\n toolsMode?: ToolsMode;\n tools?: string[];\n model?: string;\n reasoningEffort?: string;\n temperature?: string;\n author?: string;\n created?: string;\n}\n\nexport interface ModelSettings {\n model?: string;\n reasoningEffort?: string;\n temperature?: number;\n}\n\nexport interface Mode {\n meta: ModeMeta;\n id: string;\n name: string;\n baseModeId?: BaseMode;\n promptContent?: string;\n modelSettings?: ModelSettings;\n toolsMode?: ToolsMode;\n toolsList?: string[];\n}\n\nexport function isToolAllowed(mode: Mode, toolName: string): boolean {\n if (!mode.toolsMode || !mode.toolsList?.length) return true;\n const listed = mode.toolsList.includes(toolName);\n if (mode.toolsMode === \"allowlist\") return listed;\n if (mode.toolsMode === \"denylist\") return !listed;\n return true;\n}\n\nexport interface ModeProvider {\n get(modeId: string, signal?: AbortSignal): Promise<Mode>;\n list(signal?: AbortSignal): Promise<Mode[]>;\n create(mode: Mode, signal?: AbortSignal): Promise<Mode>;\n builtinModes(): Mode[];\n}\n\nexport class StaticModeProvider implements ModeProvider {\n private modes: Map<string, Mode>;\n private modeList: Mode[];\n\n constructor(modes: Mode[]) {\n this.modes = new Map();\n this.modeList = [];\n for (const mode of modes) {\n if (!mode.id) continue;\n this.modes.set(mode.id, mode);\n this.modeList.push(mode);\n }\n }\n\n async get(modeId: string): Promise<Mode> {\n const mode = this.modes.get(modeId);\n if (!mode) throw new Error(`mode not found: ${modeId}`);\n return mode;\n }\n\n async list(): Promise<Mode[]> {\n return this.modeList;\n }\n\n async create(): Promise<Mode> {\n throw new Error(\"mode creation not supported by static mode provider\");\n }\n\n builtinModes(): Mode[] {\n return [];\n }\n}\n","export type Scope = \"user\" | \"project\";\n\nexport interface MemoryEntry {\n path: string;\n scope: Scope;\n content?: string;\n source?: string;\n updatedAt?: number;\n}\n\nexport interface MemorySearchResult extends MemoryEntry {\n score: number;\n}\n\nexport interface MemoryProvider {\n view(scope: Scope, path: string, signal?: AbortSignal): Promise<string>;\n create(scope: Scope, path: string, content: string, signal?: AbortSignal): Promise<void>;\n strReplace(scope: Scope, path: string, oldStr: string, newStr: string, signal?: AbortSignal): Promise<void>;\n delete(scope: Scope, path: string, signal?: AbortSignal): Promise<void>;\n rename(scope: Scope, oldPath: string, newPath: string, signal?: AbortSignal): Promise<void>;\n list(scope: Scope, path: string, signal?: AbortSignal): Promise<string[]>;\n search(scope: Scope, query: string, signal?: AbortSignal): Promise<MemoryEntry[]>;\n}\n\nexport interface MemoryRoot {\n scope: Scope;\n path: string;\n label: string;\n}\n\nexport const DEFAULT_MEMORY_ROOTS: MemoryRoot[] = [\n { scope: \"user\", path: \"/\", label: \"User memory\" },\n { scope: \"project\", path: \"/\", label: \"Project memory\" },\n];\n","export type ThreadStatus = \"active\" | \"completed\" | \"failed\" | \"archived\";\n\nexport interface Thread {\n id: string;\n userId?: string;\n projectId?: string;\n modeId?: string;\n status: ThreadStatus;\n parentId?: string;\n}\n\nexport interface Message {\n id?: string;\n fromThreadId: string;\n toThreadId: string;\n content: string;\n sentAt?: Date;\n}\n\nexport interface ThreadProvider {\n create(projectId: string, modeId: string, signal?: AbortSignal): Promise<Thread>;\n get(threadId: string, signal?: AbortSignal): Promise<Thread>;\n archive(threadId: string, signal?: AbortSignal): Promise<void>;\n sendMessage(msg: Message, signal?: AbortSignal): Promise<void>;\n}\n\nexport interface MultiUserThreadProvider extends ThreadProvider {\n createForUser(userId: string, projectId: string, modeId: string, signal?: AbortSignal): Promise<Thread>;\n getForUser(userId: string, threadId: string, signal?: AbortSignal): Promise<Thread>;\n listByUser(userId: string, status: ThreadStatus, signal?: AbortSignal): Promise<Thread[]>;\n}\n\nexport const ErrThreadAccessDenied = new Error(\"thread: access denied\");\n","export type ArtifactType = \"file\" | \"component\" | \"data\";\n\nexport interface Artifact {\n id: string;\n type: ArtifactType;\n title?: string;\n content: string;\n mediaType?: string;\n props?: Record<string, unknown>;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport type ArtifactEmitter = (artifact: Artifact) => void;\n\nconst ARTIFACT_EMITTER_KEY = Symbol(\"artifactEmitter\");\n\nexport interface ArtifactContext {\n [ARTIFACT_EMITTER_KEY]?: ArtifactEmitter;\n}\n\nexport function withArtifactEmitter<T extends ArtifactContext>(\n ctx: T,\n emitter: ArtifactEmitter,\n): T & ArtifactContext {\n return { ...ctx, [ARTIFACT_EMITTER_KEY]: emitter };\n}\n\nexport function emitArtifact(ctx: ArtifactContext, artifact: Artifact): void {\n ctx[ARTIFACT_EMITTER_KEY]?.(artifact);\n}\n","export type InterruptKind = \"approval\" | \"question\" | \"form_input\";\n\nexport interface FormField {\n name: string;\n label: string;\n type: \"text\" | \"textarea\" | \"select\" | \"checkbox\";\n options?: string[];\n required?: boolean;\n defaultValue?: string;\n}\n\nexport interface InterruptRequest {\n id: string;\n kind: InterruptKind;\n title: string;\n description?: string;\n toolName?: string;\n toolArgs?: Record<string, unknown>;\n fields?: FormField[];\n createdAt: Date;\n}\n\nexport interface InterruptResponse {\n id: string;\n approved?: boolean;\n answer?: unknown;\n modifiedArgs?: string;\n}\n\nexport type InterruptRequester = (\n req: InterruptRequest,\n signal?: AbortSignal,\n) => Promise<InterruptResponse>;\n\nexport class InterruptGate {\n private requester: InterruptRequester;\n private pending = new Map<string, InterruptRequest>();\n\n constructor(requester: InterruptRequester) {\n this.requester = requester;\n }\n\n async wait(req: InterruptRequest, signal?: AbortSignal): Promise<InterruptResponse> {\n this.pending.set(req.id, req);\n try {\n return await this.requester(req, signal);\n } finally {\n this.pending.delete(req.id);\n }\n }\n\n pendingRequests(): InterruptRequest[] {\n return Array.from(this.pending.values());\n }\n}\n","import type { ToolCallEntry } from \"./llm.js\";\n\nexport type SafetyDecision = \"allow\" | \"block\" | \"transform\";\n\nexport interface SafetyVerdict {\n decision: SafetyDecision;\n reason?: string;\n newArgs?: string;\n}\n\nexport interface SafetyFilter {\n inspect(call: ToolCallEntry, signal?: AbortSignal): SafetyVerdict;\n}\n\nconst DANGEROUS_PATTERNS = [\n /rm\\s+-rf\\s+\\/[^a-z]/i,\n /curl.*\\|\\s*(?:bash|sh|python)/i,\n /wget.*\\|\\s*(?:bash|sh|python)/i,\n /mkfs/i,\n /dd\\s+if=/i,\n />\\s*\\/dev\\/sd[a-z]/i,\n];\n\nconst SECRET_PATTERNS = [\n /sk-[a-zA-Z0-9]{20,}/,\n /AKIA[0-9A-Z]{16}/,\n /ghp_[a-zA-Z0-9]{36}/,\n /-----BEGIN (?:RSA |EC )?PRIVATE KEY-----/,\n /password\\s*[:=]\\s*['\"][^'\"]{8,}['\"]/i,\n];\n\nexport class DefaultSafetyFilter implements SafetyFilter {\n inspect(call: ToolCallEntry): SafetyVerdict {\n const args = call.arguments;\n\n for (const pattern of DANGEROUS_PATTERNS) {\n if (pattern.test(args)) {\n return {\n decision: \"block\",\n reason: `dangerous command pattern detected: ${pattern.source}`,\n };\n }\n }\n\n for (const pattern of SECRET_PATTERNS) {\n if (pattern.test(args)) {\n return {\n decision: \"block\",\n reason: \"potential secret leak detected in tool arguments\",\n };\n }\n }\n\n return { decision: \"allow\" };\n }\n}\n","import { randomUUID } from \"node:crypto\";\n\nexport interface Span {\n traceId: string;\n spanId: string;\n parentId?: string;\n name: string;\n startedAt: Date;\n finishedAt?: Date;\n attrs?: Record<string, unknown>;\n error?: string;\n}\n\nexport class Tracer {\n private readonly _traceId: string;\n private spans: Span[] = [];\n private stack: string[] = [];\n\n constructor() {\n this._traceId = randomUUID();\n }\n\n traceId(): string {\n return this._traceId;\n }\n\n startSpan(name: string, attrs?: Record<string, unknown>): Span {\n const span: Span = {\n traceId: this._traceId,\n spanId: randomUUID(),\n parentId: this.stack[this.stack.length - 1],\n name,\n startedAt: new Date(),\n attrs,\n };\n this.spans.push(span);\n this.stack.push(span.spanId);\n return span;\n }\n\n finishSpan(span: Span, error?: Error): void {\n span.finishedAt = new Date();\n if (error) span.error = error.message;\n const idx = this.stack.lastIndexOf(span.spanId);\n if (idx !== -1) this.stack.splice(idx, 1);\n }\n\n allSpans(): Span[] {\n return this.spans.slice();\n }\n}\n\nexport interface TracedContext {\n __tracer?: Tracer;\n}\n\nexport function withTracer<T extends TracedContext>(ctx: T, tracer: Tracer): T {\n return { ...ctx, __tracer: tracer };\n}\n\nexport function tracerFromContext(ctx: TracedContext): Tracer | undefined {\n return ctx.__tracer;\n}\n","export interface Tokenizer {\n count(text: string): number;\n encode(text: string): number[];\n decode(tokens: number[]): string;\n}\n\nexport class HeuristicTokenizer implements Tokenizer {\n count(text: string): number {\n return Math.ceil(text.length / 4);\n }\n encode(_text: string): number[] {\n return [];\n }\n decode(_tokens: number[]): string {\n return \"\";\n }\n}\n\nexport function truncateToTokens(\n text: string,\n maxTokens: number,\n tok: Tokenizer,\n): string {\n if (tok.count(text) <= maxTokens) return text;\n const tokens = tok.encode(text);\n if (tokens.length > 0 && tokens.length > maxTokens) {\n return tok.decode(tokens.slice(0, maxTokens));\n }\n const limit = Math.min(maxTokens * 4, text.length);\n return text.slice(0, limit);\n}\n","import type { Tokenizer } from \"./tokenizer.js\";\nimport { truncateToTokens } from \"./tokenizer.js\";\n\nexport type SystemPromptLayer =\n | \"core\"\n | \"behavior\"\n | \"memory\"\n | \"session\"\n | \"mode\";\n\nconst LAYER_ORDER: SystemPromptLayer[] = [\n \"core\",\n \"behavior\",\n \"memory\",\n \"session\",\n \"mode\",\n];\n\nexport class SystemPromptBuilder {\n private layers = new Map<SystemPromptLayer, string>();\n private maxLayerTokens = new Map<SystemPromptLayer, number>();\n\n setMaxLayerTokens(layer: SystemPromptLayer, maxTokens: number): void {\n this.maxLayerTokens.set(layer, maxTokens);\n }\n\n build(): string {\n return this.buildWithBudget();\n }\n\n buildWithBudget(tok?: Tokenizer): string {\n const parts: string[] = [];\n for (const layer of LAYER_ORDER) {\n let content = (this.layers.get(layer) ?? \"\").trim();\n if (!content) continue;\n if (tok) {\n const cap = this.maxLayerTokens.get(layer);\n if (cap && cap > 0 && tok.count(content) > cap) {\n content = truncateToTokens(content, cap, tok);\n }\n }\n parts.push(content);\n }\n return parts.join(\"\\n\\n\");\n }\n\n get(layer: SystemPromptLayer): string {\n return this.layers.get(layer) ?? \"\";\n }\n\n has(layer: SystemPromptLayer): boolean {\n return (this.layers.get(layer) ?? \"\").trim().length > 0;\n }\n\n set(layer: SystemPromptLayer, content: string): void {\n this.layers.set(layer, content.trim());\n }\n\n append(layer: SystemPromptLayer, content: string): void {\n const existing = this.layers.get(layer) ?? \"\";\n if (!existing) {\n this.layers.set(layer, content.trim());\n } else {\n this.layers.set(layer, existing + \"\\n\\n\" + content.trim());\n }\n }\n\n clear(layer: SystemPromptLayer): void {\n this.layers.delete(layer);\n }\n}\n","export function systemReminder(content: string): string {\n const trimmed = content.trim();\n if (!trimmed) return \"\";\n return `<system-reminder>\\n${trimmed}\\n</system-reminder>`;\n}\n\nexport function joinSystemReminders(...reminders: string[]): string {\n return reminders.filter(Boolean).join(\"\\n\\n\");\n}\n","import type { ChatMessage } from \"./llm.js\";\nimport type { Tokenizer } from \"./tokenizer.js\";\nimport type { Conversation } from \"./conversation.js\";\n\nexport interface ContextBudget {\n windowSize: number;\n skillsReserve: number;\n memoryReserve: number;\n historyReserve: number;\n reserveBuffer: number;\n}\n\nexport interface EnforcementResult {\n overflowTokens: number;\n truncatedHistory: boolean;\n historyDropped: number;\n stillOverflow: boolean;\n}\n\nexport function defaultContextBudget(windowSize: number): ContextBudget {\n return {\n windowSize,\n skillsReserve: Math.floor(windowSize * 0.1),\n memoryReserve: Math.floor(windowSize * 0.15),\n historyReserve: Math.floor(windowSize * 0.6),\n reserveBuffer: Math.floor(windowSize * 0.05),\n };\n}\n\nexport function enforceContextBudget(\n budget: ContextBudget,\n conv: Conversation,\n memoryTokens: number,\n tok: Tokenizer,\n): EnforcementResult {\n const result: EnforcementResult = {\n overflowTokens: 0,\n truncatedHistory: false,\n historyDropped: 0,\n stillOverflow: false,\n };\n\n const available = budget.historyReserve;\n let used = 0;\n const kept: ChatMessage[] = [];\n\n for (let i = conv.messages.length - 1; i >= 0; i--) {\n const msg = conv.messages[i]!;\n const tokens = tok.count(msg.content);\n if (used + tokens > available && kept.length > 0) {\n result.truncatedHistory = true;\n result.historyDropped = i + 1;\n result.overflowTokens = used + tokens - available;\n break;\n }\n used += tokens;\n kept.unshift(msg);\n }\n\n if (result.truncatedHistory) {\n conv.messages = kept;\n }\n\n return result;\n}\n","import type { ChatMessage, LLMProvider } from \"./llm.js\";\nimport type { EnforcementResult } from \"./context-budget.js\";\nimport type { Conversation } from \"./conversation.js\";\nimport type { ContextBudget } from \"./context-budget.js\";\nimport { enforceContextBudget } from \"./context-budget.js\";\nimport type { Tokenizer } from \"./tokenizer.js\";\nimport { HeuristicTokenizer } from \"./tokenizer.js\";\n\nexport interface CompactionResult {\n enforcementResult: EnforcementResult;\n summary: string;\n}\n\nexport interface Compactor {\n summarize(messages: ChatMessage[], signal?: AbortSignal): Promise<string>;\n}\n\nexport class LLMCompactor implements Compactor {\n constructor(private llm: LLMProvider) {}\n\n async summarize(messages: ChatMessage[], signal?: AbortSignal): Promise<string> {\n const history = messages\n .map((m) => `${m.role.toUpperCase()}: ${m.content}`)\n .join(\"\\n\\n\");\n\n const resp = await this.llm.chat(\n {\n messages: [\n {\n role: \"user\",\n content: `Summarize the following conversation history concisely, preserving key decisions, facts, and context:\\n\\n${history}`,\n },\n ],\n maxTokens: 1024,\n },\n signal,\n );\n return resp.content;\n }\n}\n\nexport class BulletCompactor implements Compactor {\n async summarize(messages: ChatMessage[]): Promise<string> {\n const points: string[] = [];\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.content.trim()) {\n const first = msg.content.split(\"\\n\")[0]?.trim() ?? \"\";\n if (first) points.push(`- ${first.slice(0, 120)}`);\n }\n }\n return points.join(\"\\n\");\n }\n}\n\nexport async function enforceWithCompaction(\n budget: ContextBudget,\n compactor: Compactor | undefined,\n conv: Conversation,\n memoryTokens: number,\n tok: Tokenizer = new HeuristicTokenizer(),\n signal?: AbortSignal,\n): Promise<CompactionResult> {\n const enforcementResult = enforceContextBudget(budget, conv, memoryTokens, tok);\n\n let summary = \"\";\n if (compactor && enforcementResult.truncatedHistory) {\n try {\n summary = await compactor.summarize(conv.messages.slice(0, enforcementResult.historyDropped), signal);\n } catch {\n // compaction failure is non-fatal\n }\n }\n\n return { enforcementResult, summary };\n}\n","import type { Tool } from \"./tool.js\";\nimport type { InterruptRequester } from \"./interrupt.js\";\nimport type { InterruptRequest } from \"./interrupt.js\";\nimport { randomUUID } from \"node:crypto\";\n\nexport type PermissionBehavior = \"allow\" | \"deny\" | \"ask\";\n\nexport interface PermissionRule {\n toolName?: string;\n pathPrefix?: string;\n behavior: PermissionBehavior;\n reason?: string;\n}\n\nexport interface PermissionDecisionResult {\n behavior: PermissionBehavior;\n reason?: string;\n updatedInput?: Record<string, unknown>;\n}\n\nexport interface PermissionApprover {\n ask(\n tool: Tool,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<PermissionDecisionResult>;\n}\n\nexport class InterruptApprover implements PermissionApprover {\n constructor(private requester: InterruptRequester) {}\n\n async ask(\n tool: Tool,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<PermissionDecisionResult> {\n const req: InterruptRequest = {\n id: randomUUID(),\n kind: \"approval\",\n title: `Allow ${tool.name}?`,\n description: tool.description,\n toolName: tool.name,\n toolArgs: args,\n createdAt: new Date(),\n };\n const resp = await this.requester(req, signal);\n if (resp.approved) {\n return { behavior: \"allow\" };\n }\n return { behavior: \"deny\", reason: \"user denied\" };\n }\n}\n\nexport class PermissionEngine {\n private rules: PermissionRule[] = [];\n private approver?: PermissionApprover;\n\n withRules(rules: PermissionRule[]): this {\n this.rules = rules;\n return this;\n }\n\n withApprover(approver: PermissionApprover): this {\n this.approver = approver;\n return this;\n }\n\n async decide(\n tool: Tool,\n args: Record<string, unknown>,\n signal?: AbortSignal,\n ): Promise<PermissionDecisionResult> {\n for (const rule of this.rules) {\n if (rule.toolName && rule.toolName !== tool.name) continue;\n if (rule.pathPrefix) {\n const path =\n typeof args[\"path\"] === \"string\" ? args[\"path\"] : \"\";\n if (!path.startsWith(rule.pathPrefix)) continue;\n }\n if (rule.behavior === \"ask\") break;\n return { behavior: rule.behavior, reason: rule.reason };\n }\n\n if (tool.checkPermissions) {\n const result = await tool.checkPermissions(signal, args);\n if (result.decision === \"deny\" || result.decision === \"ask_user\") {\n if (this.approver && result.decision === \"ask_user\") {\n return this.approver.ask(tool, args, signal);\n }\n return { behavior: \"deny\", reason: result.reason };\n }\n return {\n behavior: \"allow\",\n updatedInput: result.updatedArgs as Record<string, unknown> | undefined,\n };\n }\n\n if (this.approver && tool.isDestructive?.(args)) {\n return this.approver.ask(tool, args, signal);\n }\n\n return { behavior: \"allow\" };\n }\n}\n","import type { Conversation } from \"./conversation.js\";\n\nexport interface SessionContext {\n currentTime?: Date;\n timezone?: string;\n userId?: string;\n username?: string;\n projectId?: string;\n activeArtifactId?: string;\n extras?: Record<string, string>;\n}\n\nexport function formatSessionContext(sc: SessionContext): string {\n const parts: string[] = [];\n if (sc.currentTime) {\n parts.push(`Current time: ${sc.currentTime.toISOString()}`);\n }\n if (sc.timezone) parts.push(`Timezone: ${sc.timezone}`);\n if (sc.userId) parts.push(`User ID: ${sc.userId}`);\n if (sc.username) parts.push(`Username: ${sc.username}`);\n if (sc.projectId) parts.push(`Project: ${sc.projectId}`);\n if (sc.activeArtifactId) parts.push(`Active artifact: ${sc.activeArtifactId}`);\n if (sc.extras) {\n for (const [k, v] of Object.entries(sc.extras)) {\n parts.push(`${k}: ${v}`);\n }\n }\n return parts.join(\"\\n\");\n}\n\nexport interface SessionContextProvider {\n get(conv: Conversation, signal?: AbortSignal): Promise<SessionContext | undefined>;\n}\n","export type TodoStatus = \"pending\" | \"in_progress\" | \"completed\";\n\nexport interface Todo {\n id: string;\n content: string;\n activeForm?: string;\n status: TodoStatus;\n}\n\nexport interface ExecutionContext {\n todos(): Todo[];\n setTodos(todos: Todo[]): void;\n markDone(id: string): void;\n}\n\nexport class InMemoryExecutionContext implements ExecutionContext {\n private _todos: Todo[] = [];\n\n todos(): Todo[] {\n return this._todos.slice();\n }\n\n setTodos(todos: Todo[]): void {\n this._todos = todos.slice();\n }\n\n markDone(id: string): void {\n const todo = this._todos.find((t) => t.id === id);\n if (todo) todo.status = \"completed\";\n }\n}\n","import type { InterruptRequest } from \"./interrupt.js\";\n\nexport interface InterruptStore {\n put(req: InterruptRequest, signal?: AbortSignal): Promise<void>;\n get(id: string, signal?: AbortSignal): Promise<{ req: InterruptRequest; ok: true } | { ok: false }>;\n delete(id: string, signal?: AbortSignal): Promise<void>;\n}\n\nexport class InMemoryInterruptStore implements InterruptStore {\n private store = new Map<string, InterruptRequest>();\n\n async put(req: InterruptRequest): Promise<void> {\n this.store.set(req.id, req);\n }\n\n async get(id: string): Promise<{ req: InterruptRequest; ok: true } | { ok: false }> {\n const req = this.store.get(id);\n if (!req) return { ok: false };\n return { req, ok: true };\n }\n\n async delete(id: string): Promise<void> {\n this.store.delete(id);\n }\n}\n","export interface MemoryHeader {\n path: string;\n title?: string;\n description?: string;\n type?: string;\n}\n\nexport interface MemorySelector {\n select(\n query: string,\n headers: MemoryHeader[],\n limit: number,\n signal?: AbortSignal,\n ): Promise<MemoryHeader[]>;\n}\n\nexport class KeywordMemorySelector implements MemorySelector {\n async select(\n query: string,\n headers: MemoryHeader[],\n limit: number,\n ): Promise<MemoryHeader[]> {\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n if (!terms.length || !headers.length) return [];\n\n const scored = headers.map((h) => {\n const text = `${h.title ?? \"\"} ${h.description ?? \"\"} ${h.type ?? \"\"} ${h.path}`.toLowerCase();\n const score = terms.reduce((acc, t) => acc + (text.includes(t) ? 1 : 0), 0);\n return { h, score };\n });\n\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n .map((s) => s.h);\n }\n}\n","export interface RuleMatcher {\n match(ruleContent: string, input: Record<string, unknown>): boolean;\n}\n\nexport type RuleMatcherFunc = (\n ruleContent: string,\n input: Record<string, unknown>,\n) => boolean;\n\nexport function ruleMatcherFromFn(fn: RuleMatcherFunc): RuleMatcher {\n return { match: fn };\n}\n\nexport function prefixMatcher(argKey: string): RuleMatcher {\n return {\n match(rule: string, input: Record<string, unknown>): boolean {\n if (!rule) return true;\n const val = input[argKey];\n return typeof val === \"string\" && val.startsWith(rule);\n },\n };\n}\n\nexport function exactMatcher(): RuleMatcher {\n return {\n match(rule: string, input: Record<string, unknown>): boolean {\n if (!rule) return true;\n const primary = Object.values(input)[0];\n return String(primary) === rule;\n },\n };\n}\n","import type { LLMProvider } from \"./llm.js\";\nimport type { MemoryProvider } from \"./memory.js\";\nimport type { SandboxDriver } from \"./sandbox.js\";\nimport type { ThreadProvider } from \"./thread.js\";\nimport type { ModeProvider } from \"./mode.js\";\nimport type { ContextBudget } from \"./context-budget.js\";\nimport { defaultContextBudget } from \"./context-budget.js\";\nimport { SystemPromptBuilder } from \"./system-prompt.js\";\nimport { ToolRegistry } from \"./tool.js\";\n\nexport interface Engine {\n memory?: MemoryProvider;\n sandbox?: SandboxDriver;\n tools?: ToolRegistry;\n threads?: ThreadProvider;\n modes?: ModeProvider;\n llm?: LLMProvider;\n prompt?: SystemPromptBuilder;\n budget?: ContextBudget;\n}\n\nexport function newEngine(...opts: Array<(e: Engine) => void>): Engine {\n const e: Engine = {};\n for (const opt of opts) opt(e);\n return e;\n}\n\nexport function newEngineWithDefaults(windowSize: number): Engine {\n const budget = defaultContextBudget(windowSize);\n return {\n prompt: new SystemPromptBuilder(),\n budget,\n };\n}\n\nexport const hasMemory = (e: Engine) => e.memory != null;\nexport const hasSandbox = (e: Engine) => e.sandbox != null;\nexport const hasTools = (e: Engine) => e.tools != null;\nexport const hasThreads = (e: Engine) => e.threads != null;\nexport const hasModes = (e: Engine) => e.modes != null;\nexport const hasLLM = (e: Engine) => e.llm != null;\nexport const hasPrompt = (e: Engine) => e.prompt != null;\nexport const hasBudget = (e: Engine) => e.budget != null;\n\n// Functional options\nexport const withMemory = (p: MemoryProvider) => (e: Engine) => { e.memory = p; };\nexport const withSandbox = (p: SandboxDriver) => (e: Engine) => { e.sandbox = p; };\nexport const withTools = (r: ToolRegistry) => (e: Engine) => { e.tools = r; };\nexport const withThreads = (p: ThreadProvider) => (e: Engine) => { e.threads = p; };\nexport const withModes = (p: ModeProvider) => (e: Engine) => { e.modes = p; };\nexport const withLLM = (p: LLMProvider) => (e: Engine) => { e.llm = p; };\nexport const withPrompt = (b: SystemPromptBuilder) => (e: Engine) => { e.prompt = b; };\nexport const withBudget = (b: ContextBudget) => (e: Engine) => { e.budget = b; };\n","import type { ToolCallEntry } from \"./llm.js\";\nimport type { ToolRegistry } from \"./tool.js\";\nimport type { SandboxDriver } from \"./sandbox.js\";\nimport type { PermissionEngine } from \"./permissions.js\";\nimport type { ChatMessage } from \"./llm.js\";\n\nexport type { ToolCallEntry };\n\nexport interface ToolResult {\n toolCallId: string;\n name: string;\n content: string;\n error?: Error;\n}\n\nexport class ToolDispatcher {\n private permissions?: PermissionEngine;\n\n constructor(\n private tools: ToolRegistry,\n private sandbox?: SandboxDriver,\n ) {}\n\n withPermissions(engine: PermissionEngine): this {\n this.permissions = engine;\n return this;\n }\n\n async dispatch(\n call: ToolCallEntry,\n sandboxId: string,\n signal?: AbortSignal,\n ): Promise<ToolResult> {\n const tool = this.tools.get(call.name);\n if (!tool) {\n const err = new Error(`tool \"${call.name}\" not found`);\n return {\n toolCallId: call.id,\n name: call.name,\n content: `error: tool \"${call.name}\" not found in registry`,\n error: err,\n };\n }\n\n let args: Record<string, unknown> = {};\n if (call.arguments && call.arguments !== \"{}\") {\n try {\n args = JSON.parse(call.arguments) as Record<string, unknown>;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n return {\n toolCallId: call.id,\n name: call.name,\n content: `error: invalid JSON arguments: ${err.message}`,\n error: err,\n };\n }\n }\n\n if (tool.validate) {\n try {\n await tool.validate(signal, args);\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n return {\n toolCallId: call.id,\n name: call.name,\n content: `error: ${err.message}`,\n error: err,\n };\n }\n }\n\n if (this.permissions) {\n const dec = await this.permissions.decide(tool, args, signal);\n if (dec.behavior === \"deny\" || dec.behavior === \"ask\") {\n const reason = dec.reason?.trim() || \"permission denied\";\n const content = `<tool_use_error>The user did not approve this ${tool.name} call. Reason: ${reason}.\\n\\nThe tool was NOT executed. Do NOT claim success. Do NOT retry the same call. Acknowledge the rejection and ask the user how to proceed (or stop).</tool_use_error>`;\n return {\n toolCallId: call.id,\n name: call.name,\n content,\n error: new Error(reason),\n };\n }\n if (dec.updatedInput) args = dec.updatedInput;\n } else if (tool.checkPermissions) {\n try {\n const result = await tool.checkPermissions(signal, args);\n if (result.decision === \"deny\" || result.decision === \"ask_user\") {\n const reason = result.reason?.trim() || \"permission denied\";\n return {\n toolCallId: call.id,\n name: call.name,\n content: `error: ${reason}`,\n error: new Error(reason),\n };\n }\n if (result.updatedArgs) args = result.updatedArgs as Record<string, unknown>;\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n return {\n toolCallId: call.id,\n name: call.name,\n content: `error: permission check failed: ${err.message}`,\n error: err,\n };\n }\n }\n\n try {\n const content = await tool.execute(signal, sandboxId, args);\n return { toolCallId: call.id, name: call.name, content };\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n return {\n toolCallId: call.id,\n name: call.name,\n content: `error: ${err.message}`,\n error: err,\n };\n }\n }\n\n async dispatchAll(\n calls: ToolCallEntry[],\n sandboxId: string,\n signal?: AbortSignal,\n ): Promise<ToolResult[]> {\n const results: ToolResult[] = [];\n for (const call of calls) {\n results.push(await this.dispatch(call, sandboxId, signal));\n }\n return results;\n }\n\n async dispatchParallel(\n calls: ToolCallEntry[],\n sandboxId: string,\n signal?: AbortSignal,\n ): Promise<ToolResult[]> {\n if (calls.length === 0) return [];\n if (calls.length === 1) return [await this.dispatch(calls[0]!, sandboxId, signal)];\n\n const results = new Array<ToolResult>(calls.length);\n\n const safe: Array<{ idx: number; call: ToolCallEntry }> = [];\n const unsafe: Array<{ idx: number; call: ToolCallEntry }> = [];\n\n for (let i = 0; i < calls.length; i++) {\n const call = calls[i]!;\n const tool = this.tools.get(call.name);\n let isSafe = false;\n if (tool?.isConcurrencySafe) {\n let args: Record<string, unknown> = {};\n try {\n if (call.arguments && call.arguments !== \"{}\") {\n args = JSON.parse(call.arguments) as Record<string, unknown>;\n }\n } catch {}\n isSafe = tool.isConcurrencySafe(args);\n }\n if (isSafe) {\n safe.push({ idx: i, call });\n } else {\n unsafe.push({ idx: i, call });\n }\n }\n\n await Promise.all(\n safe.map(async ({ idx, call }) => {\n results[idx] = await this.dispatch(call, sandboxId, signal);\n }),\n );\n\n for (const { idx, call } of unsafe) {\n results[idx] = await this.dispatch(call, sandboxId, signal);\n }\n\n return results as ToolResult[];\n }\n}\n\nexport function toolResultsToMessages(\n assistantToolCalls: ToolCallEntry[],\n results: ToolResult[],\n): ChatMessage[] {\n const msgs: ChatMessage[] = [\n { role: \"assistant\", content: \"\", toolCalls: assistantToolCalls },\n ];\n for (const r of results) {\n msgs.push({\n role: \"tool\",\n name: r.name,\n toolCallId: r.toolCallId,\n content: r.content,\n });\n }\n return msgs;\n}\n\nexport function areIndependent(calls: ToolCallEntry[]): boolean {\n if (calls.length <= 1) return true;\n return !calls.some(\n (c) => c.arguments.includes(\"${\") || c.arguments.includes(\"{{\"),\n );\n}\n","import type { LLMProvider, ChatRequest, ChatResponse } from \"./llm.js\";\n\nexport function parseModelRef(ref: string): [string, string] {\n const slash = ref.indexOf(\"/\");\n if (slash === -1) return [\"\", ref];\n return [ref.slice(0, slash), ref.slice(slash + 1)];\n}\n\nexport class RoutedLLMProvider implements LLMProvider {\n private routes = new Map<string, LLMProvider>();\n private fallback?: LLMProvider;\n\n register(provider: string, llm: LLMProvider): this {\n this.routes.set(provider, llm);\n return this;\n }\n\n withFallback(llm: LLMProvider): this {\n this.fallback = llm;\n return this;\n }\n\n route(model: string): LLMProvider {\n const [provider] = parseModelRef(model);\n const resolved = provider ? this.routes.get(provider) : undefined;\n if (resolved) return resolved;\n if (this.fallback) return this.fallback;\n throw new Error(`no provider registered for model: ${model}`);\n }\n\n async chat(req: ChatRequest, signal?: AbortSignal): Promise<ChatResponse> {\n return this.route(req.model ?? \"\").chat(req, signal);\n }\n}\n","import type { LLMProvider, ChatRequest, ChatMessage, ChatResponse } from \"./llm.js\";\nimport type { ToolRegistry } from \"./tool.js\";\nimport type { SandboxDriver } from \"./sandbox.js\";\nimport type { PermissionEngine } from \"./permissions.js\";\nimport type { Engine } from \"./engine.js\";\nimport type { ReasoningStep } from \"./reasoning.js\";\nimport { ToolDispatcher, toolResultsToMessages } from \"./dispatch.js\";\nimport { hasLLM, hasTools, hasSandbox, hasModes, hasPrompt } from \"./engine.js\";\nimport { parseModelRef } from \"./llm-router.js\";\n\nexport interface AgentLoopConfig {\n provider?: LLMProvider;\n systemPrompt?: string;\n model?: string;\n tools?: ToolRegistry;\n sandbox?: SandboxDriver;\n sandboxId?: string;\n permissions?: PermissionEngine;\n maxTurns?: number;\n maxRetries?: number;\n onTurn?: (turn: number, resp: ChatResponse) => boolean;\n onToolCall?: (call: { id: string; name: string; arguments: string }) => boolean;\n onToolResult?: (\n call: { id: string; name: string; arguments: string },\n result: { toolCallId: string; name: string; content: string; error?: Error },\n ) => { toolCallId: string; name: string; content: string; error?: Error };\n shouldStop?: (turn: number, resp: ChatResponse) => boolean;\n onError?: (err: Error, attempt: number) => boolean;\n buildRequest?: (\n systemPrompt: string,\n messages: ChatMessage[],\n tools?: ToolRegistry,\n ) => ChatRequest;\n}\n\nexport interface AgentLoopResult {\n finalContent: string;\n providerReasoning: string;\n totalTurns: number;\n totalUsage: { promptTokens: number; completionTokens: number; totalTokens: number };\n messages: ChatMessage[];\n reasoningTrace: ReasoningStep[];\n stopReason: \"complete\" | \"max_turns\" | \"aborted\" | \"stopped\" | \"error\";\n}\n\nfunction previewText(value: string, limit: number): string {\n const trimmed = value.trim().replace(/\\s+/g, \" \");\n if (trimmed.length <= limit || limit <= 3) return trimmed;\n return trimmed.slice(0, limit - 3) + \"...\";\n}\n\nfunction previewJson(value: string, limit: number): string {\n const trimmed = value.trim();\n if (!trimmed) return \"\";\n try {\n const parsed = JSON.parse(trimmed);\n return previewText(JSON.stringify(parsed), limit);\n } catch {\n return previewText(trimmed, limit);\n }\n}\n\nfunction buildDefaultRequest(cfg: AgentLoopConfig, messages: ChatMessage[]): ChatRequest {\n const req: ChatRequest = {\n model: cfg.model,\n messages: [],\n };\n if (cfg.systemPrompt) {\n req.messages.push({ role: \"system\", content: cfg.systemPrompt });\n }\n req.messages.push(...messages);\n if (cfg.tools) {\n req.tools = cfg.tools.toolDefs();\n }\n return req;\n}\n\nfunction buildRequest(cfg: AgentLoopConfig, messages: ChatMessage[]): ChatRequest {\n if (cfg.buildRequest) {\n return cfg.buildRequest(cfg.systemPrompt ?? \"\", messages, cfg.tools);\n }\n return buildDefaultRequest(cfg, messages);\n}\n\ntype ErrorClass = \"transient\" | \"permanent\" | \"unknown\";\n\nfunction classifyError(err: Error): ErrorClass {\n const msg = err.message.toLowerCase();\n const permanent = [\"unauthorized\", \"401\", \"403\", \"forbidden\", \"invalid api key\",\n \"authentication\", \"invalid request\", \"400\", \"not found\", \"404\",\n \"context length\", \"context window\", \"content_filter\", \"content filter\"];\n if (permanent.some((p) => msg.includes(p))) return \"permanent\";\n\n const transient = [\"rate limit\", \"429\", \"too many requests\", \"timeout\", \"deadline\",\n \"connection reset\", \"connection refused\", \"eof\", \"broken pipe\",\n \"500\", \"502\", \"503\", \"504\", \"server error\", \"service unavailable\", \"temporary\"];\n if (transient.some((t) => msg.includes(t))) return \"transient\";\n\n return \"unknown\";\n}\n\nasync function callWithRetry(\n provider: LLMProvider,\n req: ChatRequest,\n maxRetries: number,\n onError?: (err: Error, attempt: number) => boolean,\n signal?: AbortSignal,\n): Promise<ChatResponse> {\n let lastErr: Error = new Error(\"unknown\");\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await provider.chat(req, signal);\n } catch (e) {\n lastErr = e instanceof Error ? e : new Error(String(e));\n\n switch (classifyError(lastErr)) {\n case \"permanent\":\n throw lastErr;\n case \"transient\":\n if (attempt < maxRetries) {\n const delay = Math.min(1000 * 2 ** (attempt - 1), 30000);\n await new Promise((resolve) => setTimeout(resolve, delay));\n continue;\n }\n break;\n default:\n if (onError == null || !onError(lastErr, attempt)) throw lastErr;\n }\n }\n }\n throw new Error(`max retries (${maxRetries}) exceeded: ${lastErr.message}`);\n}\n\nexport async function runAgentLoop(\n cfg: AgentLoopConfig,\n messages: ChatMessage[],\n signal?: AbortSignal,\n): Promise<AgentLoopResult> {\n if (!cfg.provider) throw new Error(\"AgentLoopConfig.provider is required\");\n\n const maxTurns = cfg.maxTurns && cfg.maxTurns > 0 ? cfg.maxTurns : 50;\n const maxRetries = cfg.maxRetries && cfg.maxRetries > 0 ? cfg.maxRetries : 3;\n\n let req = buildRequest(cfg, messages);\n\n const dispatcher = cfg.tools\n ? new ToolDispatcher(cfg.tools, cfg.sandbox)\n : undefined;\n if (dispatcher && cfg.permissions) {\n dispatcher.withPermissions(cfg.permissions);\n }\n\n const result: AgentLoopResult = {\n finalContent: \"\",\n providerReasoning: \"\",\n totalTurns: 0,\n totalUsage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n messages: req.messages.slice(),\n reasoningTrace: [],\n stopReason: \"complete\",\n };\n\n let traceSeq = 0;\n const appendTrace = (\n type: ReasoningStep[\"type\"],\n title: string,\n content?: string,\n details?: string[],\n ) => {\n result.reasoningTrace.push({\n id: `trace-${++traceSeq}`,\n type,\n title,\n content,\n details,\n });\n };\n\n for (let turn = 1; turn <= maxTurns; turn++) {\n if (signal?.aborted) {\n result.stopReason = \"aborted\";\n return result;\n }\n\n const resp = await callWithRetry(cfg.provider, req, maxRetries, cfg.onError, signal);\n\n result.totalTurns = turn;\n result.totalUsage.promptTokens += resp.usage.promptTokens;\n result.totalUsage.completionTokens += resp.usage.completionTokens;\n result.totalUsage.totalTokens += resp.usage.totalTokens;\n\n if (resp.reasoning?.trim()) {\n result.providerReasoning = result.providerReasoning\n ? result.providerReasoning + \"\\n\\n\" + resp.reasoning\n : resp.reasoning;\n appendTrace(\"thinking\", `Provider reasoning ${turn}`, previewText(resp.reasoning, 220));\n }\n appendTrace(\"thinking\", `Turn ${turn}`, undefined, [\n `Finish reason: ${resp.finishReason}`,\n `Tool calls requested: ${resp.toolCalls?.length ?? 0}`,\n `Tokens this turn: ${resp.usage.totalTokens}`,\n ]);\n\n if (cfg.onTurn && !cfg.onTurn(turn, resp)) {\n result.finalContent = resp.content;\n result.stopReason = \"aborted\";\n return result;\n }\n\n if (cfg.shouldStop?.(turn, resp)) {\n result.finalContent = resp.content;\n result.stopReason = \"stopped\";\n result.messages.push({ role: \"assistant\", content: resp.content });\n return result;\n }\n\n if (!resp.toolCalls?.length) {\n result.finalContent = resp.content;\n result.stopReason = \"complete\";\n result.messages.push({ role: \"assistant\", content: resp.content });\n return result;\n }\n\n if (!dispatcher) {\n result.stopReason = \"error\";\n throw new Error(\"LLM requested tool calls but no ToolRegistry is configured\");\n }\n\n const callsToRun = resp.toolCalls.filter(\n (tc) => cfg.onToolCall == null || cfg.onToolCall(tc),\n );\n\n for (const tc of callsToRun) {\n appendTrace(\"action\", `Tool call: ${tc.name}`, previewJson(tc.arguments, 220));\n }\n\n let toolResults = await dispatcher.dispatchAll(callsToRun, cfg.sandboxId ?? \"\", signal);\n\n if (cfg.onToolResult) {\n toolResults = toolResults.map((tr, i) =>\n cfg.onToolResult!(callsToRun[i]!, tr),\n );\n }\n\n for (const tr of toolResults) {\n appendTrace(tr.error ? \"thinking\" : \"result\", `Tool result: ${tr.name}`, previewText(tr.content, 220));\n }\n\n const toolMsgs = toolResultsToMessages(resp.toolCalls, toolResults);\n result.messages.push(...toolMsgs);\n req = buildRequest(cfg, result.messages);\n }\n\n result.stopReason = \"max_turns\";\n return result;\n}\n\nexport async function runAgentLoopWithEngine(\n engine: Engine,\n modeId: string,\n cfg: AgentLoopConfig,\n messages: ChatMessage[],\n signal?: AbortSignal,\n): Promise<AgentLoopResult> {\n const callerSuppliedPrompt = Boolean(cfg.systemPrompt);\n let resolvedModel = cfg.model ?? \"\";\n\n if (hasModes(engine) && modeId) {\n const mode = await engine.modes!.get(modeId, signal);\n if (!cfg.model && mode.modelSettings?.model) {\n cfg.model = mode.modelSettings.model;\n }\n if (!callerSuppliedPrompt) {\n if (hasPrompt(engine)) {\n engine.prompt!.set(\"mode\", mode.promptContent ?? \"\");\n cfg.systemPrompt = engine.prompt!.build();\n } else {\n cfg.systemPrompt = mode.promptContent ?? \"\";\n }\n }\n resolvedModel = cfg.model ?? \"\";\n } else if (!callerSuppliedPrompt && hasPrompt(engine)) {\n cfg.systemPrompt = engine.prompt!.build();\n }\n\n if (!resolvedModel) resolvedModel = cfg.model ?? \"\";\n\n if (!cfg.provider) {\n if (!hasLLM(engine)) throw new Error(\"no LLM provider configured\");\n cfg.provider = resolveProvider(engine, resolvedModel);\n const [, modelOnly] = parseModelRef(cfg.model ?? \"\");\n if (modelOnly) cfg.model = modelOnly;\n }\n\n if (!cfg.tools && hasTools(engine)) cfg.tools = engine.tools;\n if (!cfg.sandbox && hasSandbox(engine)) cfg.sandbox = engine.sandbox;\n\n return runAgentLoop(cfg, messages, signal);\n}\n\nfunction resolveProvider(engine: Engine, model: string): LLMProvider {\n if (!hasLLM(engine)) throw new Error(\"no LLM provider configured\");\n if (model) {\n const llm = engine.llm!;\n if (\"route\" in llm && typeof (llm as { route?: unknown }).route === \"function\") {\n return (llm as { route: (m: string) => LLMProvider }).route(model);\n }\n }\n return engine.llm!;\n}\n","import type { Engine } from \"./engine.js\";\nimport { hasLLM, hasMemory, hasPrompt, hasBudget, hasModes, hasTools } from \"./engine.js\";\nimport type { Conversation } from \"./conversation.js\";\nimport {\n isCold,\n appendUser,\n appendAssistant,\n incrementTurn,\n} from \"./conversation.js\";\nimport type { Tokenizer } from \"./tokenizer.js\";\nimport { HeuristicTokenizer } from \"./tokenizer.js\";\nimport type { ConversationStore } from \"./conversation-store.js\";\nimport type { SafetyFilter } from \"./safety.js\";\nimport type { Compactor } from \"./compaction.js\";\nimport { enforceWithCompaction } from \"./compaction.js\";\nimport type { SessionContextProvider } from \"./session-context.js\";\nimport { formatSessionContext } from \"./session-context.js\";\nimport type { PermissionEngine } from \"./permissions.js\";\nimport type { InterruptGate } from \"./interrupt.js\";\nimport type { MemoryRoot } from \"./memory.js\";\nimport { DEFAULT_MEMORY_ROOTS } from \"./memory.js\";\nimport type { Span } from \"./tracing.js\";\nimport { Tracer } from \"./tracing.js\";\nimport type { AgentLoopResult } from \"./agent-loop.js\";\nimport { runAgentLoopWithEngine } from \"./agent-loop.js\";\nimport type { StreamEvent } from \"./streaming.js\";\nimport type { ChatMessage } from \"./llm.js\";\nimport { ToolDispatcher } from \"./dispatch.js\";\nimport { systemReminder, joinSystemReminders } from \"./system-reminder.js\";\n\nexport interface RuntimeResult {\n response: string;\n turns: number;\n usage: { promptTokens: number; completionTokens: number; totalTokens: number };\n stopReason: string;\n trace: Span[];\n traceId: string;\n memoryRead: boolean;\n memoryWritten: string[];\n warnings: string[];\n startedAt: Date;\n completedAt?: Date;\n}\n\nexport interface PlanController {\n onStateChanged?: (ev: { state: string; plan?: string; reason?: string }) => void;\n}\n\nexport class Runtime {\n private engine: Engine;\n private mode = \"\";\n private model = \"\";\n private safety?: SafetyFilter;\n private tokenizer: Tokenizer = new HeuristicTokenizer();\n private store?: ConversationStore;\n private sessionContext?: SessionContextProvider;\n private compactor?: Compactor;\n private maxMemoryTokens = 0;\n private memoryRoots: MemoryRoot[] = DEFAULT_MEMORY_ROOTS;\n private thinkingBudget = 0;\n private interruptGate?: InterruptGate;\n private permissions?: PermissionEngine;\n private planController?: PlanController;\n private _emit?: (ev: StreamEvent) => void;\n\n constructor(engine: Engine) {\n this.engine = engine;\n }\n\n withMode(modeId: string): this { this.mode = modeId; return this; }\n withModel(model: string): this { this.model = model; return this; }\n withSafety(s: SafetyFilter): this { this.safety = s; return this; }\n withPermissions(e: PermissionEngine): this { this.permissions = e; return this; }\n withTokenizer(t: Tokenizer): this { this.tokenizer = t; return this; }\n withConversationStore(s: ConversationStore): this { this.store = s; return this; }\n withSessionContext(p: SessionContextProvider): this { this.sessionContext = p; return this; }\n withCompactor(c: Compactor): this { this.compactor = c; return this; }\n withMaxMemoryTokens(n: number): this { this.maxMemoryTokens = n; return this; }\n withMemoryRoots(...roots: MemoryRoot[]): this { this.memoryRoots = roots; return this; }\n withThinkingBudget(tokens: number): this { this.thinkingBudget = tokens; return this; }\n withInterruptGate(gate: InterruptGate): this { this.interruptGate = gate; return this; }\n withPlanController(pc: PlanController): this {\n const prev = pc.onStateChanged;\n pc.onStateChanged = (ev) => {\n prev?.(ev);\n const planMode = { state: ev.state as \"entered\" | \"exited\", plan: ev.plan, reason: ev.reason };\n this._emit?.({ type: \"plan_mode_changed\", planMode });\n };\n this.planController = pc;\n return this;\n }\n\n async run(\n conv: Conversation,\n userMessage: string,\n signal?: AbortSignal,\n ): Promise<RuntimeResult> {\n if (!hasLLM(this.engine)) throw new Error(\"runtime: no LLM provider\");\n if (!conv) throw new Error(\"runtime: conversation is required\");\n\n const tracer = new Tracer();\n const rr: RuntimeResult = {\n response: \"\",\n turns: 0,\n usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0 },\n stopReason: \"\",\n trace: [],\n traceId: tracer.traceId(),\n memoryRead: false,\n memoryWritten: [],\n warnings: [],\n startedAt: new Date(),\n };\n\n appendUser(conv, userMessage);\n\n // Orientation\n if (isCold(conv)) {\n await this.orientation(conv, userMessage, rr, signal);\n } else {\n await this.warmRefresh(conv, userMessage, signal);\n }\n\n if (signal?.aborted) return rr;\n\n // Preparation\n await this.preparation(conv, rr, signal);\n\n if (signal?.aborted) return rr;\n\n // Execution\n const loopResult = await this.execution(conv, rr, signal);\n\n if (loopResult?.finalContent) {\n appendAssistant(conv, loopResult.finalContent);\n }\n\n if (signal?.aborted) return rr;\n\n // Closure (no-op in v3 — memory writes go through the tool)\n\n incrementTurn(conv);\n\n if (this.store) {\n try {\n await this.store.save(conv, signal);\n } catch (e) {\n rr.warnings.push(`save conversation: ${(e as Error).message}`);\n }\n }\n\n rr.completedAt = new Date();\n rr.trace = tracer.allSpans();\n return rr;\n }\n\n async *runStream(\n conv: Conversation,\n userMessage: string,\n signal?: AbortSignal,\n ): AsyncGenerator<StreamEvent> {\n const out: StreamEvent[] = [];\n let resolve: (() => void) | null = null;\n let done = false;\n\n this._emit = (ev: StreamEvent) => {\n out.push(ev);\n resolve?.();\n };\n\n const runPromise = this.run(conv, userMessage, signal).then(\n (result) => {\n if (result.response) {\n for (const chunk of chunkBySentence(result.response)) {\n out.push({ type: \"delta\", delta: chunk });\n }\n }\n out.push({ type: \"done\" });\n done = true;\n resolve?.();\n },\n (err: Error) => {\n out.push({ type: \"error\", error: err });\n out.push({ type: \"done\" });\n done = true;\n resolve?.();\n },\n ).finally(() => {\n this._emit = undefined;\n });\n\n while (!done || out.length > 0) {\n if (out.length === 0) {\n await new Promise<void>((r) => { resolve = r; });\n resolve = null;\n continue;\n }\n yield out.shift()!;\n }\n\n await runPromise;\n }\n\n private async orientation(\n conv: Conversation,\n userMessage: string,\n rr: RuntimeResult,\n signal?: AbortSignal,\n ): Promise<void> {\n if (hasMemory(this.engine) && hasPrompt(this.engine)) {\n const scopes = [...new Set(this.memoryRoots.map((r) => r.scope))];\n const sections: string[] = [];\n for (const scope of scopes) {\n try {\n const index = await this.engine.memory!.view(scope, \"MEMORY.md\", signal);\n if (index.trim()) sections.push(index.trim());\n } catch {\n // no MEMORY.md yet — that's fine\n }\n }\n if (sections.length > 0) {\n let section = sections.join(\"\\n\\n\");\n if (this.maxMemoryTokens > 0 && this.tokenizer.count(section) > this.maxMemoryTokens) {\n section = evictMemoryToTokenBudget(section, this.maxMemoryTokens, this.tokenizer);\n }\n this.engine.prompt!.set(\"memory\", section);\n rr.memoryRead = true;\n conv.memoryRead = true;\n }\n }\n await this.buildSessionLayer(conv, userMessage, signal);\n }\n\n private async warmRefresh(\n conv: Conversation,\n userMessage: string,\n signal?: AbortSignal,\n ): Promise<void> {\n await this.buildSessionLayer(conv, userMessage, signal);\n }\n\n private async buildSessionLayer(\n conv: Conversation,\n _userMessage: string,\n signal?: AbortSignal,\n ): Promise<void> {\n if (!hasPrompt(this.engine)) return;\n if (!this.sessionContext) {\n this.engine.prompt!.clear(\"session\");\n return;\n }\n try {\n const sc = await this.sessionContext.get(conv, signal);\n if (!sc) { this.engine.prompt!.clear(\"session\"); return; }\n const rendered = formatSessionContext(sc);\n if (!rendered) { this.engine.prompt!.clear(\"session\"); return; }\n this.engine.prompt!.set(\"session\", rendered);\n } catch {\n this.engine.prompt!.clear(\"session\");\n }\n }\n\n private async preparation(\n conv: Conversation,\n rr: RuntimeResult,\n signal?: AbortSignal,\n ): Promise<void> {\n if (!hasBudget(this.engine) || !hasPrompt(this.engine)) return;\n const memoryTokens = this.tokenizer.count(\n this.engine.prompt!.get(\"memory\"),\n );\n const compResult = await enforceWithCompaction(\n this.engine.budget!,\n this.compactor,\n conv,\n memoryTokens,\n this.tokenizer,\n signal,\n );\n const enforce = compResult.enforcementResult;\n if (enforce.overflowTokens > 0) {\n if (enforce.truncatedHistory) {\n rr.warnings.push(`budget: dropped ${enforce.historyDropped} messages`);\n }\n if (enforce.stillOverflow) {\n rr.warnings.push(\"budget: still over after enforcement\");\n }\n }\n if (compResult.summary) {\n this.engine.prompt!.append(\n \"memory\",\n `\\n\\nContext summary (from earlier turns):\\n${compResult.summary}`,\n );\n }\n if (this._emit && enforce.truncatedHistory) {\n this._emit({\n type: \"compaction\",\n compaction: {\n messagesDropped: enforce.historyDropped,\n overflowTokens: enforce.overflowTokens,\n summary: compResult.summary,\n },\n });\n }\n }\n\n private async execution(\n conv: Conversation,\n rr: RuntimeResult,\n signal?: AbortSignal,\n ): Promise<AgentLoopResult | undefined> {\n let systemPrompt = \"\";\n if (hasPrompt(this.engine)) {\n if (this.mode && hasModes(this.engine)) {\n try {\n const mode = await this.engine.modes!.get(this.mode, signal);\n this.engine.prompt!.set(\"mode\", mode.promptContent ?? \"\");\n } catch {}\n }\n systemPrompt = this.engine.prompt!.build();\n }\n\n // Collect dynamic reminders\n if (hasTools(this.engine)) {\n const blocks = await this.engine.tools!.collectDynamicReminders(signal);\n if (blocks.length > 0) {\n const wrapped = blocks.map(systemReminder).filter(Boolean);\n const joined = joinSystemReminders(...wrapped);\n if (joined) {\n systemPrompt = systemPrompt ? systemPrompt + \"\\n\\n\" + joined : joined;\n }\n }\n }\n\n const cfg = {\n systemPrompt,\n model: this.model,\n permissions: this.permissions,\n maxTurns: 50,\n onToolCall: (call: { name: string; arguments: string; id: string }) => {\n if (this.safety) {\n const verdict = this.safety.inspect(call);\n return verdict.decision !== \"block\";\n }\n return true;\n },\n };\n\n const loopResult = await runAgentLoopWithEngine(\n this.engine,\n this.mode,\n cfg,\n conv.messages,\n signal,\n );\n\n rr.turns += loopResult.totalTurns;\n rr.usage.promptTokens += loopResult.totalUsage.promptTokens;\n rr.usage.completionTokens += loopResult.totalUsage.completionTokens;\n rr.usage.totalTokens += loopResult.totalUsage.totalTokens;\n rr.stopReason = loopResult.stopReason;\n rr.response = loopResult.finalContent;\n\n conv.messages = loopResult.messages;\n\n return loopResult;\n }\n}\n\nfunction evictMemoryToTokenBudget(\n content: string,\n maxTokens: number,\n tok: Tokenizer,\n): string {\n const paragraphs = content.trim().split(/\\n\\n+/);\n const kept: string[] = [];\n let used = 0;\n\n for (let i = paragraphs.length - 1; i >= 0; i--) {\n const p = paragraphs[i]!.trim();\n if (!p) continue;\n const tokens = tok.count(p);\n if (used + tokens > maxTokens && kept.length > 0) break;\n kept.unshift(p);\n used += tokens;\n }\n\n if (kept.length < paragraphs.length) {\n kept.unshift(\"[Earlier memory entries omitted — token budget exceeded]\");\n }\n return kept.join(\"\\n\\n\");\n}\n\nfunction chunkBySentence(text: string): string[] {\n if (!text) return [];\n const chunks: string[] = [];\n let current = \"\";\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]!;\n current += ch;\n if (ch === \".\" || ch === \"!\" || ch === \"?\" || ch === \"\\n\") {\n const next = text[i + 1];\n if (!next || next === \" \" || next === \"\\n\" || next === \"\\t\") {\n const chunk = current.trim();\n if (chunk) chunks.push(chunk + \" \");\n current = \"\";\n }\n }\n }\n if (current.trim()) chunks.push(current.trim());\n return chunks;\n}\n\nexport function newRuntime(engine: Engine): Runtime {\n return new Runtime(engine);\n}\n"],"mappings":"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","names":["import_node_crypto"]}
@@ -0,0 +1,251 @@
1
+ import { T as ToolCallEntry, C as ChatMessage, L as LLMProvider, a as Conversation, b as ChatRequest, c as ChatResponse } from './conversation-kIkMQdYK.cjs';
2
+ export { D as DocumentContent, I as ImageContent, M as ModelRouter, R as Role, d as TokenUsage, e as ToolChoice, f as ToolDef, g as ToolFuncParams, h as ToolParam, i as appendAssistant, j as appendUser, k as incrementTurn, l as isCold, m as messageCount, n as newConversation } from './conversation-kIkMQdYK.cjs';
3
+ import { E as EnforcementResult, C as ContextBudget, I as InterruptRequest, a as Engine, P as PermissionEngine, b as InterruptGate, S as StreamEvent } from './streaming-B-P6Fw_k.cjs';
4
+ export { A as AgentLoopConfig, c as AgentLoopResult, d as AgentResult, e as Artifact, f as ArtifactContext, g as ArtifactEmitter, h as ArtifactType, B as BaseMode, i as CompactionEvent, F as FormField, j as InterruptApprover, k as InterruptKind, l as InterruptRequester, m as InterruptResponse, M as Mode, n as ModeMeta, o as ModeProvider, p as ModelSettings, q as PermissionApprover, r as PermissionBehavior, s as PermissionDecision, t as PermissionDecisionResult, u as PermissionResult, v as PermissionRule, w as PlanModeEvent, R as ReasoningStep, x as SandboxDriver, y as SandboxExecResult, z as StaticModeProvider, D as StreamEventType, G as StreamingLLMProvider, H as SystemPromptBuilder, J as SystemPromptLayer, T as Tool, K as ToolCategory, L as ToolDispatcher, N as ToolExecuteFunc, O as ToolMatch, Q as ToolPermissionFn, U as ToolPredicate, V as ToolRegistry, W as ToolReminderFn, X as ToolResult, Y as ToolValidator, Z as ToolsMode, _ as areIndependent, $ as collectStream, a0 as defaultContextBudget, a1 as emitArtifact, a2 as enforceContextBudget, a3 as fanOutStream, a4 as hasBudget, a5 as hasLLM, a6 as hasMemory, a7 as hasModes, a8 as hasPrompt, a9 as hasSandbox, aa as hasThreads, ab as hasTools, ac as isToolAllowed, ad as newEngine, ae as newEngineWithDefaults, af as runAgentLoop, ag as runAgentLoopWithEngine, ah as toToolDef, ai as toolResultsToMessages, aj as withArtifactEmitter, ak as withBudget, al as withLLM, am as withMemory, an as withModes, ao as withPrompt, ap as withSandbox, aq as withThreads, ar as withTools } from './streaming-B-P6Fw_k.cjs';
5
+ import { C as ConversationStore } from './conversation-store-Cl42jpsA.cjs';
6
+ import { M as MemoryRoot } from './memory-uBLqrQRY.cjs';
7
+ export { D as DEFAULT_MEMORY_ROOTS, a as MemoryEntry, b as MemoryProvider, c as MemorySearchResult, S as Scope } from './memory-uBLqrQRY.cjs';
8
+ export { E as ErrThreadAccessDenied, M as Message, a as MultiUserThreadProvider, T as Thread, b as ThreadProvider, c as ThreadStatus } from './thread-C2b9xRMJ.cjs';
9
+ import { T as Tokenizer } from './tokenizer-BhG_RGUk.cjs';
10
+ export { H as HeuristicTokenizer, t as truncateToTokens } from './tokenizer-BhG_RGUk.cjs';
11
+
12
+ declare const PROTOCOL_VERSION: "1";
13
+
14
+ type SafetyDecision = "allow" | "block" | "transform";
15
+ interface SafetyVerdict {
16
+ decision: SafetyDecision;
17
+ reason?: string;
18
+ newArgs?: string;
19
+ }
20
+ interface SafetyFilter {
21
+ inspect(call: ToolCallEntry, signal?: AbortSignal): SafetyVerdict;
22
+ }
23
+ declare class DefaultSafetyFilter implements SafetyFilter {
24
+ inspect(call: ToolCallEntry): SafetyVerdict;
25
+ }
26
+
27
+ interface Span {
28
+ traceId: string;
29
+ spanId: string;
30
+ parentId?: string;
31
+ name: string;
32
+ startedAt: Date;
33
+ finishedAt?: Date;
34
+ attrs?: Record<string, unknown>;
35
+ error?: string;
36
+ }
37
+ declare class Tracer {
38
+ private readonly _traceId;
39
+ private spans;
40
+ private stack;
41
+ constructor();
42
+ traceId(): string;
43
+ startSpan(name: string, attrs?: Record<string, unknown>): Span;
44
+ finishSpan(span: Span, error?: Error): void;
45
+ allSpans(): Span[];
46
+ }
47
+ interface TracedContext {
48
+ __tracer?: Tracer;
49
+ }
50
+ declare function withTracer<T extends TracedContext>(ctx: T, tracer: Tracer): T;
51
+ declare function tracerFromContext(ctx: TracedContext): Tracer | undefined;
52
+
53
+ declare function systemReminder(content: string): string;
54
+ declare function joinSystemReminders(...reminders: string[]): string;
55
+
56
+ interface CompactionResult {
57
+ enforcementResult: EnforcementResult;
58
+ summary: string;
59
+ }
60
+ interface Compactor {
61
+ summarize(messages: ChatMessage[], signal?: AbortSignal): Promise<string>;
62
+ }
63
+ declare class LLMCompactor implements Compactor {
64
+ private llm;
65
+ constructor(llm: LLMProvider);
66
+ summarize(messages: ChatMessage[], signal?: AbortSignal): Promise<string>;
67
+ }
68
+ declare class BulletCompactor implements Compactor {
69
+ summarize(messages: ChatMessage[]): Promise<string>;
70
+ }
71
+ declare function enforceWithCompaction(budget: ContextBudget, compactor: Compactor | undefined, conv: Conversation, memoryTokens: number, tok?: Tokenizer, signal?: AbortSignal): Promise<CompactionResult>;
72
+
73
+ interface SessionContext {
74
+ currentTime?: Date;
75
+ timezone?: string;
76
+ userId?: string;
77
+ username?: string;
78
+ projectId?: string;
79
+ activeArtifactId?: string;
80
+ extras?: Record<string, string>;
81
+ }
82
+ declare function formatSessionContext(sc: SessionContext): string;
83
+ interface SessionContextProvider {
84
+ get(conv: Conversation, signal?: AbortSignal): Promise<SessionContext | undefined>;
85
+ }
86
+
87
+ type TodoStatus = "pending" | "in_progress" | "completed";
88
+ interface Todo {
89
+ id: string;
90
+ content: string;
91
+ activeForm?: string;
92
+ status: TodoStatus;
93
+ }
94
+ interface ExecutionContext {
95
+ todos(): Todo[];
96
+ setTodos(todos: Todo[]): void;
97
+ markDone(id: string): void;
98
+ }
99
+ declare class InMemoryExecutionContext implements ExecutionContext {
100
+ private _todos;
101
+ todos(): Todo[];
102
+ setTodos(todos: Todo[]): void;
103
+ markDone(id: string): void;
104
+ }
105
+
106
+ interface InterruptStore {
107
+ put(req: InterruptRequest, signal?: AbortSignal): Promise<void>;
108
+ get(id: string, signal?: AbortSignal): Promise<{
109
+ req: InterruptRequest;
110
+ ok: true;
111
+ } | {
112
+ ok: false;
113
+ }>;
114
+ delete(id: string, signal?: AbortSignal): Promise<void>;
115
+ }
116
+ declare class InMemoryInterruptStore implements InterruptStore {
117
+ private store;
118
+ put(req: InterruptRequest): Promise<void>;
119
+ get(id: string): Promise<{
120
+ req: InterruptRequest;
121
+ ok: true;
122
+ } | {
123
+ ok: false;
124
+ }>;
125
+ delete(id: string): Promise<void>;
126
+ }
127
+
128
+ interface Agent {
129
+ id: string;
130
+ name: string;
131
+ description?: string;
132
+ promptContent?: string;
133
+ sourceKind?: string;
134
+ }
135
+ interface AgentSource {
136
+ sourceName(): string;
137
+ list(signal?: AbortSignal): Promise<Agent[]>;
138
+ }
139
+
140
+ interface MemoryHeader {
141
+ path: string;
142
+ title?: string;
143
+ description?: string;
144
+ type?: string;
145
+ }
146
+ interface MemorySelector {
147
+ select(query: string, headers: MemoryHeader[], limit: number, signal?: AbortSignal): Promise<MemoryHeader[]>;
148
+ }
149
+ declare class KeywordMemorySelector implements MemorySelector {
150
+ select(query: string, headers: MemoryHeader[], limit: number): Promise<MemoryHeader[]>;
151
+ }
152
+
153
+ interface RuleMatcher {
154
+ match(ruleContent: string, input: Record<string, unknown>): boolean;
155
+ }
156
+ type RuleMatcherFunc = (ruleContent: string, input: Record<string, unknown>) => boolean;
157
+ declare function ruleMatcherFromFn(fn: RuleMatcherFunc): RuleMatcher;
158
+ declare function prefixMatcher(argKey: string): RuleMatcher;
159
+ declare function exactMatcher(): RuleMatcher;
160
+
161
+ interface Skill {
162
+ id: string;
163
+ name: string;
164
+ description?: string;
165
+ promptContent?: string;
166
+ sourceKind?: string;
167
+ allowedTools?: string[];
168
+ }
169
+ interface SkillSource {
170
+ sourceName(): string;
171
+ list(signal?: AbortSignal): Promise<Skill[]>;
172
+ }
173
+ interface SkillBashExecutor {
174
+ execute(command: string, allowedTools: string[], signal?: AbortSignal): Promise<string>;
175
+ }
176
+
177
+ declare function parseModelRef(ref: string): [string, string];
178
+ declare class RoutedLLMProvider implements LLMProvider {
179
+ private routes;
180
+ private fallback?;
181
+ register(provider: string, llm: LLMProvider): this;
182
+ withFallback(llm: LLMProvider): this;
183
+ route(model: string): LLMProvider;
184
+ chat(req: ChatRequest, signal?: AbortSignal): Promise<ChatResponse>;
185
+ }
186
+
187
+ interface RuntimeResult {
188
+ response: string;
189
+ turns: number;
190
+ usage: {
191
+ promptTokens: number;
192
+ completionTokens: number;
193
+ totalTokens: number;
194
+ };
195
+ stopReason: string;
196
+ trace: Span[];
197
+ traceId: string;
198
+ memoryRead: boolean;
199
+ memoryWritten: string[];
200
+ warnings: string[];
201
+ startedAt: Date;
202
+ completedAt?: Date;
203
+ }
204
+ interface PlanController {
205
+ onStateChanged?: (ev: {
206
+ state: string;
207
+ plan?: string;
208
+ reason?: string;
209
+ }) => void;
210
+ }
211
+ declare class Runtime {
212
+ private engine;
213
+ private mode;
214
+ private model;
215
+ private safety?;
216
+ private tokenizer;
217
+ private store?;
218
+ private sessionContext?;
219
+ private compactor?;
220
+ private maxMemoryTokens;
221
+ private memoryRoots;
222
+ private thinkingBudget;
223
+ private interruptGate?;
224
+ private permissions?;
225
+ private planController?;
226
+ private _emit?;
227
+ constructor(engine: Engine);
228
+ withMode(modeId: string): this;
229
+ withModel(model: string): this;
230
+ withSafety(s: SafetyFilter): this;
231
+ withPermissions(e: PermissionEngine): this;
232
+ withTokenizer(t: Tokenizer): this;
233
+ withConversationStore(s: ConversationStore): this;
234
+ withSessionContext(p: SessionContextProvider): this;
235
+ withCompactor(c: Compactor): this;
236
+ withMaxMemoryTokens(n: number): this;
237
+ withMemoryRoots(...roots: MemoryRoot[]): this;
238
+ withThinkingBudget(tokens: number): this;
239
+ withInterruptGate(gate: InterruptGate): this;
240
+ withPlanController(pc: PlanController): this;
241
+ run(conv: Conversation, userMessage: string, signal?: AbortSignal): Promise<RuntimeResult>;
242
+ runStream(conv: Conversation, userMessage: string, signal?: AbortSignal): AsyncGenerator<StreamEvent>;
243
+ private orientation;
244
+ private warmRefresh;
245
+ private buildSessionLayer;
246
+ private preparation;
247
+ private execution;
248
+ }
249
+ declare function newRuntime(engine: Engine): Runtime;
250
+
251
+ export { type Agent, type AgentSource, BulletCompactor, ChatMessage, ChatRequest, ChatResponse, type CompactionResult, type Compactor, ContextBudget, Conversation, ConversationStore, DefaultSafetyFilter, EnforcementResult, Engine, type ExecutionContext, InMemoryExecutionContext, InMemoryInterruptStore, InterruptGate, InterruptRequest, type InterruptStore, KeywordMemorySelector, LLMCompactor, LLMProvider, type MemoryHeader, MemoryRoot, type MemorySelector, PROTOCOL_VERSION, PermissionEngine, type PlanController, RoutedLLMProvider, type RuleMatcher, type RuleMatcherFunc, Runtime, type RuntimeResult, type SafetyDecision, type SafetyFilter, type SafetyVerdict, type SessionContext, type SessionContextProvider, type Skill, type SkillBashExecutor, type SkillSource, type Span, StreamEvent, type Todo, type TodoStatus, Tokenizer, ToolCallEntry, type TracedContext, Tracer, enforceWithCompaction, exactMatcher, formatSessionContext, joinSystemReminders, newRuntime, parseModelRef, prefixMatcher, ruleMatcherFromFn, systemReminder, tracerFromContext, withTracer };