@truefoundry/trueforge-core 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +27 -0
  2. package/dist/agent-session/TurnResourceResolver.d.ts.map +1 -1
  3. package/dist/agent-session/TurnResourceResolver.js +6 -2
  4. package/dist/agent-session/TurnResourceResolver.js.map +1 -1
  5. package/dist/agent-session/TurnResourceResolver.mjs +6 -2
  6. package/dist/agent-session/TurnResourceResolver.mjs.map +1 -1
  7. package/dist/agent-session/schemas/turn.d.ts.map +1 -1
  8. package/dist/agent-session/schemas/turn.js +3 -1
  9. package/dist/agent-session/schemas/turn.js.map +1 -1
  10. package/dist/agent-session/schemas/turn.mjs +3 -1
  11. package/dist/agent-session/schemas/turn.mjs.map +1 -1
  12. package/dist/agent-session/store/InMemorySessionStore.d.ts.map +1 -1
  13. package/dist/agent-session/store/InMemorySessionStore.js +24 -8
  14. package/dist/agent-session/store/InMemorySessionStore.js.map +1 -1
  15. package/dist/agent-session/store/InMemorySessionStore.mjs +24 -8
  16. package/dist/agent-session/store/InMemorySessionStore.mjs.map +1 -1
  17. package/dist/agent-session/store/OffsetPageToken.d.ts.map +1 -1
  18. package/dist/agent-session/store/OffsetPageToken.js +3 -1
  19. package/dist/agent-session/store/OffsetPageToken.js.map +1 -1
  20. package/dist/agent-session/store/OffsetPageToken.mjs +3 -1
  21. package/dist/agent-session/store/OffsetPageToken.mjs.map +1 -1
  22. package/dist/agent-session/store/SessionListPageToken.d.ts.map +1 -1
  23. package/dist/agent-session/store/SessionListPageToken.js +3 -1
  24. package/dist/agent-session/store/SessionListPageToken.js.map +1 -1
  25. package/dist/agent-session/store/SessionListPageToken.mjs +3 -1
  26. package/dist/agent-session/store/SessionListPageToken.mjs.map +1 -1
  27. package/dist/core/InstructionBuilder.d.ts.map +1 -1
  28. package/dist/core/InstructionBuilder.js +12 -4
  29. package/dist/core/InstructionBuilder.js.map +1 -1
  30. package/dist/core/InstructionBuilder.mjs +12 -4
  31. package/dist/core/InstructionBuilder.mjs.map +1 -1
  32. package/dist/core/capabilities/builtins/AskUserQuestion.d.ts.map +1 -1
  33. package/dist/core/capabilities/builtins/AskUserQuestion.js +5 -0
  34. package/dist/core/capabilities/builtins/AskUserQuestion.js.map +1 -1
  35. package/dist/core/capabilities/builtins/AskUserQuestion.mjs +5 -0
  36. package/dist/core/capabilities/builtins/AskUserQuestion.mjs.map +1 -1
  37. package/dist/core/capabilities/builtins/LargeToolResponse.d.ts.map +1 -1
  38. package/dist/core/capabilities/builtins/LargeToolResponse.js +6 -2
  39. package/dist/core/capabilities/builtins/LargeToolResponse.js.map +1 -1
  40. package/dist/core/capabilities/builtins/LargeToolResponse.mjs +6 -2
  41. package/dist/core/capabilities/builtins/LargeToolResponse.mjs.map +1 -1
  42. package/dist/core/llm/VercelAILLM.d.ts.map +1 -1
  43. package/dist/core/llm/VercelAILLM.js +6 -2
  44. package/dist/core/llm/VercelAILLM.js.map +1 -1
  45. package/dist/core/llm/VercelAILLM.mjs +6 -2
  46. package/dist/core/llm/VercelAILLM.mjs.map +1 -1
  47. package/dist/core/mcp/RemoteMCP.d.ts.map +1 -1
  48. package/dist/core/mcp/RemoteMCP.js +15 -5
  49. package/dist/core/mcp/RemoteMCP.js.map +1 -1
  50. package/dist/core/mcp/RemoteMCP.mjs +15 -5
  51. package/dist/core/mcp/RemoteMCP.mjs.map +1 -1
  52. package/dist/core/mcp/ToolSelectorPolicy.d.ts.map +1 -1
  53. package/dist/core/mcp/ToolSelectorPolicy.js +3 -1
  54. package/dist/core/mcp/ToolSelectorPolicy.js.map +1 -1
  55. package/dist/core/mcp/ToolSelectorPolicy.mjs +3 -1
  56. package/dist/core/mcp/ToolSelectorPolicy.mjs.map +1 -1
  57. package/dist/core/mcp/ToolSet.d.ts.map +1 -1
  58. package/dist/core/mcp/ToolSet.js +9 -3
  59. package/dist/core/mcp/ToolSet.js.map +1 -1
  60. package/dist/core/mcp/ToolSet.mjs +9 -3
  61. package/dist/core/mcp/ToolSet.mjs.map +1 -1
  62. package/dist/core/mcp/convertMCPServers.d.ts.map +1 -1
  63. package/dist/core/mcp/convertMCPServers.js +6 -2
  64. package/dist/core/mcp/convertMCPServers.js.map +1 -1
  65. package/dist/core/mcp/convertMCPServers.mjs +6 -2
  66. package/dist/core/mcp/convertMCPServers.mjs.map +1 -1
  67. package/dist/core/mcp/remoteMcpClient.d.ts.map +1 -1
  68. package/dist/core/mcp/remoteMcpClient.js +21 -7
  69. package/dist/core/mcp/remoteMcpClient.js.map +1 -1
  70. package/dist/core/mcp/remoteMcpClient.mjs +21 -7
  71. package/dist/core/mcp/remoteMcpClient.mjs.map +1 -1
  72. package/dist/core/mcp/toolSelectors.d.ts.map +1 -1
  73. package/dist/core/mcp/toolSelectors.js +18 -6
  74. package/dist/core/mcp/toolSelectors.js.map +1 -1
  75. package/dist/core/mcp/toolSelectors.mjs +18 -6
  76. package/dist/core/mcp/toolSelectors.mjs.map +1 -1
  77. package/dist/core/runtime/AgentThread.d.ts.map +1 -1
  78. package/dist/core/runtime/AgentThread.js +42 -14
  79. package/dist/core/runtime/AgentThread.js.map +1 -1
  80. package/dist/core/runtime/AgentThread.mjs +42 -14
  81. package/dist/core/runtime/AgentThread.mjs.map +1 -1
  82. package/dist/core/runtime/AgentThreadOrchestrator.d.ts.map +1 -1
  83. package/dist/core/runtime/AgentThreadOrchestrator.js +27 -9
  84. package/dist/core/runtime/AgentThreadOrchestrator.js.map +1 -1
  85. package/dist/core/runtime/AgentThreadOrchestrator.mjs +27 -9
  86. package/dist/core/runtime/AgentThreadOrchestrator.mjs.map +1 -1
  87. package/dist/core/runtime/DeferredTool.d.ts.map +1 -1
  88. package/dist/core/runtime/DeferredTool.js +15 -5
  89. package/dist/core/runtime/DeferredTool.js.map +1 -1
  90. package/dist/core/runtime/DeferredTool.mjs +15 -5
  91. package/dist/core/runtime/DeferredTool.mjs.map +1 -1
  92. package/dist/core/runtime/contextUtils.d.ts.map +1 -1
  93. package/dist/core/runtime/contextUtils.js +3 -1
  94. package/dist/core/runtime/contextUtils.js.map +1 -1
  95. package/dist/core/runtime/contextUtils.mjs +3 -1
  96. package/dist/core/runtime/contextUtils.mjs.map +1 -1
  97. package/dist/core/sandbox/Sandbox.d.ts.map +1 -1
  98. package/dist/core/sandbox/Sandbox.js +12 -4
  99. package/dist/core/sandbox/Sandbox.js.map +1 -1
  100. package/dist/core/sandbox/Sandbox.mjs +12 -4
  101. package/dist/core/sandbox/Sandbox.mjs.map +1 -1
  102. package/dist/core/sandbox/codeMode/CodeModeDispatcher.d.ts.map +1 -1
  103. package/dist/core/sandbox/codeMode/CodeModeDispatcher.js +9 -3
  104. package/dist/core/sandbox/codeMode/CodeModeDispatcher.js.map +1 -1
  105. package/dist/core/sandbox/codeMode/CodeModeDispatcher.mjs +9 -3
  106. package/dist/core/sandbox/codeMode/CodeModeDispatcher.mjs.map +1 -1
  107. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.d.ts.map +1 -1
  108. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.js +9 -3
  109. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.js.map +1 -1
  110. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.mjs +9 -3
  111. package/dist/core/sandbox/codeMode/nats/CodeModeNatsTransport.mjs.map +1 -1
  112. package/dist/core/sandbox/provider/DaytonaProvider.d.ts +17 -0
  113. package/dist/core/sandbox/provider/DaytonaProvider.d.ts.map +1 -1
  114. package/dist/core/sandbox/provider/DaytonaProvider.js +83 -17
  115. package/dist/core/sandbox/provider/DaytonaProvider.js.map +1 -1
  116. package/dist/core/sandbox/provider/DaytonaProvider.mjs +83 -17
  117. package/dist/core/sandbox/provider/DaytonaProvider.mjs.map +1 -1
  118. package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts.map +1 -1
  119. package/dist/core/sandbox/provider/TFYSandboxProvider.js +12 -4
  120. package/dist/core/sandbox/provider/TFYSandboxProvider.js.map +1 -1
  121. package/dist/core/sandbox/provider/TFYSandboxProvider.mjs +12 -4
  122. package/dist/core/sandbox/provider/TFYSandboxProvider.mjs.map +1 -1
  123. package/dist/core/sandbox/skills/SkillMounter.d.ts.map +1 -1
  124. package/dist/core/sandbox/skills/SkillMounter.js +3 -1
  125. package/dist/core/sandbox/skills/SkillMounter.js.map +1 -1
  126. package/dist/core/sandbox/skills/SkillMounter.mjs +3 -1
  127. package/dist/core/sandbox/skills/SkillMounter.mjs.map +1 -1
  128. package/dist/core/util/abort.d.ts.map +1 -1
  129. package/dist/core/util/abort.js +3 -1
  130. package/dist/core/util/abort.js.map +1 -1
  131. package/dist/core/util/abort.mjs +3 -1
  132. package/dist/core/util/abort.mjs.map +1 -1
  133. package/package.json +10 -6
package/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # @truefoundry/trueforge-core
2
+
3
+ [Documentation](https://trueforge.dev) · [npm](https://www.npmjs.com/package/@truefoundry/trueforge-core) · [GitHub](https://github.com/truefoundry/trueforge)
4
+
5
+ The agent execution library behind [TrueForge](https://trueforge.dev): the runtime that runs the agent loop — model calls, MCP tools, skills, sandboxing, approvals, context management, and session state.
6
+
7
+ ## Use TrueForge instead
8
+
9
+ This package is the library the TrueForge server is built on. It is **not** a complete product on its own.
10
+
11
+ If you want HTTP APIs, a TypeScript SDK, and a chat UI, use [`@truefoundry/trueforge`](https://www.npmjs.com/package/@truefoundry/trueforge) and start at **[trueforge.dev](https://trueforge.dev)**.
12
+
13
+ ```bash
14
+ npx @truefoundry/trueforge
15
+ ```
16
+
17
+ - [Quickstart](https://trueforge.dev/quickstart)
18
+ - [HTTP API & SDK](https://trueforge.dev/api/overview)
19
+ - [Chat UI](https://trueforge.dev/chat-ui)
20
+
21
+ ## Compatibility
22
+
23
+ `@truefoundry/trueforge-core` does **not** offer backward compatibility guarantees at this time. Public APIs and types may change in any release. Pin an exact version if you depend on this package.
24
+
25
+ ## License
26
+
27
+ [MIT](https://github.com/truefoundry/trueforge/blob/main/LICENSE)
@@ -1 +1 @@
1
- {"version":3,"file":"TurnResourceResolver.d.ts","sourceRoot":"","sources":["../../src/agent-session/TurnResourceResolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TurnResourceResolver.d.ts","sourceRoot":"","sources":["../../src/agent-session/TurnResourceResolver.ts"],"names":[],"mappings":"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"}
@@ -67,7 +67,9 @@ var TurnResourceResolver = class {
67
67
  * close() can release it (or override close() too).
68
68
  */
69
69
  async resolveSandbox(input) {
70
- if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) return void 0;
70
+ if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) {
71
+ return void 0;
72
+ }
71
73
  this.#sandbox = await this.deps.sandboxProvider({
72
74
  spec: input.spec,
73
75
  existingSandboxId: input.existing?.sandbox_id,
@@ -165,7 +167,9 @@ var TurnResourceResolver = class {
165
167
  */
166
168
  getOrCreateToolSource(input) {
167
169
  const cached = this.#sources.get(input.id);
168
- if (cached) return cached;
170
+ if (cached) {
171
+ return cached;
172
+ }
169
173
  const made = input.create();
170
174
  this.#sources.set(input.id, made);
171
175
  return made;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\nimport type { AgentCapability } from '../core/capabilities/AgentCapability';\nimport type { ILLM } from '../core/llm/ILLM';\nimport type { ToolSource } from '../core/mcp/IMCPServer';\nimport { RemoteMCP, type RemoteMcpHeaders } from '../core/mcp/RemoteMCP';\nimport type { ToolSelectorConfig } from '../core/mcp/ToolSelectorPolicy';\nimport { ToolSet } from '../core/mcp/ToolSet';\nimport type { AgentDefinition, ModelParams } from '../core/runtime/AgentDefinition';\nimport type { AgentInfo } from '../core/runtime/AgentThread.types';\nimport type { Sandbox, SandboxInfo } from '../core/sandbox/Sandbox';\nimport type { AgentTracing } from '../core/tracing/AgentTracing';\nimport { NOOP_AGENT_TRACING } from '../core/tracing/NoopAgentTracing';\nimport type { ITurnResourceResolver } from './ITurnResourceResolver';\nimport type { TurnRecord } from './models/TurnRecord';\nimport type { AgentSpec } from './schemas/agentSpec';\n\n/**\n * Factory that creates a Sandbox handle for a run (reattach via\n * existingSandboxId). `spec` carries the sandbox-relevant agent settings\n * (e.g. config.sandbox.file_downloads) so implementations can shape the\n * Sandbox per run without the factory type growing a field per option.\n */\nexport type TurnSandboxFactory = (input: {\n spec: AgentSpec;\n existingSandboxId?: string | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n}) => Promise<Sandbox>;\n\nfunction specWantsSandbox(spec: AgentSpec): boolean {\n return spec.config.sandbox.enabled;\n}\n\nfunction toSelectors(entry: {\n enable_tools: string[];\n disable_tools: string[];\n preload_tools: string[];\n require_approval_for_tools: string[];\n}): ToolSelectorConfig {\n return {\n enableTools: entry.enable_tools,\n disableTools: entry.disable_tools,\n preloadTools: entry.preload_tools,\n requireApprovalForTools: entry.require_approval_for_tools,\n };\n}\n\n/**\n * Batteries-included base implementation. Construct-and-go for the default\n * behavior; subclass and override to customize (tool sources, sandbox,\n * tracing).\n */\nexport class TurnResourceResolver<\n TTurnCustom extends object = Record<string, never>,\n> implements ITurnResourceResolver<TTurnCustom> {\n readonly #sources = new Map<string, Promise<ToolSource>>();\n #sandbox?: Sandbox | undefined;\n\n constructor(\n protected readonly deps: {\n /** Model name → client and defaults. Called once per resolved definition; may load provider config. */\n llm: (model: string) => Promise<{\n modelClient: ILLM;\n defaultModelParams: ModelParams;\n }>;\n /**\n * MCP server name → connection details. Required to use spec.mcp_servers:\n * the AgentSpec carries names only (no url/headers on the wire) — the\n * runtime supplies the catalog. Called once per distinct server name per\n * turn. Throw for unknown names. `headers` supports the async resolver form.\n */\n mcp: (name: string) => Promise<{ url: string; headers?: RemoteMcpHeaders }>;\n mcpRequestTimeoutMs: number;\n mcpConnectTimeoutMs: number;\n /** One sandbox type per runtime. Omit = no sandbox support. */\n sandboxProvider?: TurnSandboxFactory | undefined;\n /**\n * Named-agent lookup (registry id → live AgentSpec). Required when a\n * session is bound by reference; omit only if all sessions use inline agents.\n */\n agent?: ((agentId: string) => Promise<AgentSpec>) | undefined;\n /** Forwarded to RemoteMCP / AgentThread (required by their constructors). */\n logger: Logger;\n },\n ) {}\n\n get logger(): Logger {\n return this.deps.logger;\n }\n\n /** Default: no-op tracing. Override to plug in a real tracer. */\n createTracing(): AgentTracing {\n return NOOP_AGENT_TRACING;\n }\n\n /** Named (ref) session agent → live registry lookup via deps.agent. */\n async resolveAgentSpec(input: { agent_id: string }): Promise<AgentSpec> {\n if (this.deps.agent === undefined) {\n // Host forgot to wire deps.agent — not \"agent id missing from the registry\"\n // (that failure belongs in the lookup callback, e.g. HTTP 422 on the server).\n throw new Error(\n `Named agent '${input.agent_id}' cannot be resolved: no agent lookup configured on the turn resolver`,\n );\n }\n return await this.deps.agent(input.agent_id);\n }\n\n /**\n * Default: creates a sandbox iff a provider is configured AND the spec wants\n * one; reattaches to the previous turn's VM via `existing.sandbox_id` when\n * present. Overrides that resolve their own sandbox must assign it so\n * close() can release it (or override close() too).\n */\n async resolveSandbox(input: {\n spec: AgentSpec;\n existing?: SandboxInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<Sandbox | undefined> {\n if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) return undefined;\n this.#sandbox = await this.deps.sandboxProvider({\n spec: input.spec,\n existingSandboxId: input.existing?.sandbox_id,\n signal: input.signal,\n tracing: input.tracing,\n });\n return this.#sandbox;\n }\n\n /**\n * Closes the sandbox HANDLE if one was resolved. This releases only this\n * process's connection (local bridge); the sandbox VM keeps running and the\n * next turn reattaches via `existing.sandbox_id`.\n *\n * Tool sources (MCP connections) are intentionally NOT closed: the run's\n * AbortSignal already aborts their in-flight calls, and connections are\n * per-run objects that are simply dropped. If deterministic MCP socket\n * release is ever needed, add it here — no contract change required.\n *\n * Subclasses that acquire additional resources MUST override, release\n * their own resources best-effort, and call `await super.close()`.\n * Idempotent; never throws.\n */\n async close(): Promise<void> {\n const sandbox = this.#sandbox;\n this.#sandbox = undefined;\n await sandbox?.close().catch(() => {\n /* no-op */\n });\n }\n\n /**\n * Default: maps the spec directly to a definition — spec.mcp_servers carry\n * names only; deps.mcp resolves each name to url/headers, and the result\n * becomes a RemoteMCP source (deduped per turn via getOrCreateToolSource)\n * wrapped in a per-agent ToolSet view. Passes the previous turn's persisted\n * MCP session_id into RemoteMCP for cross-turn stateful resume.\n */\n async resolveAgentDefinition(input: {\n spec: AgentSpec;\n thread_id: string;\n agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<{\n definition: AgentDefinition;\n extraCapabilities?: AgentCapability[] | undefined;\n }> {\n const { spec, agent_info: agentInfo, previousTurn, signal, tracing } = input;\n const toolSets = await Promise.all(\n (spec.mcp_servers ?? []).map(async entry => {\n const source = await this.getOrCreateToolSource({\n id: entry.name,\n create: async () => {\n const { url, headers } = await this.deps.mcp(entry.name);\n return new RemoteMCP({\n id: entry.name,\n name: entry.name,\n url,\n headers: headers ?? {},\n sessionId: previousTurn?.snapshot.mcp_servers?.[entry.name]?.session_id,\n requestTimeoutMs: this.deps.mcpRequestTimeoutMs,\n connectTimeoutMs: this.deps.mcpConnectTimeoutMs,\n logger: this.deps.logger,\n tracing,\n signal,\n });\n },\n });\n return new ToolSet({\n source,\n selectors: toSelectors(entry),\n preload: entry.preload,\n });\n }),\n );\n // Sub-agents may request a different catalog model via agent_info.model;\n // resolve that name so modelClient matches the override (not just a label).\n const modelName = agentInfo?.model ?? spec.model.name;\n const resolvedModel = await this.deps.llm(modelName);\n return {\n definition: {\n modelClient: resolvedModel.modelClient,\n // Sub-agents receive the delegated task as a user message; their system\n // prompt is SUB_AGENT_IDENTITY (added by AgentThread), not user instructions.\n instruction: agentInfo ? undefined : spec.instructions,\n messages: agentInfo\n ? [{ role: 'user' as const, content: agentInfo.input }]\n : spec.messages?.map(m => ({\n role: 'user' as const,\n content: m.content,\n })),\n modelParams: {\n ...resolvedModel.defaultModelParams,\n ...spec.model.params,\n },\n // Sub-agents should return free-form summaries to the parent, not the user-facing structured response.\n responseFormat: agentInfo ? undefined : spec.response_format,\n iterationLimit: spec.config.iteration_limit,\n toolSets,\n },\n };\n }\n\n /**\n * Returns the tool source for `id`, creating it on first call — use from\n * resolveAgentDefinition overrides so agents sharing a server share one\n * connection. Single-flight by id: the promise is stored synchronously (no\n * await between get and set), so overlapping resolveAgentDefinition calls\n * can never double-create. Rejections stay cached: one attempt per turn.\n * Do not override.\n */\n protected getOrCreateToolSource(input: { id: string; create: () => Promise<ToolSource> }): Promise<ToolSource> {\n const cached = this.#sources.get(input.id);\n if (cached) return cached;\n const made = input.create();\n this.#sources.set(input.id, made);\n return made;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\nimport type { AgentCapability } from '../core/capabilities/AgentCapability';\nimport type { ILLM } from '../core/llm/ILLM';\nimport type { ToolSource } from '../core/mcp/IMCPServer';\nimport { RemoteMCP, type RemoteMcpHeaders } from '../core/mcp/RemoteMCP';\nimport type { ToolSelectorConfig } from '../core/mcp/ToolSelectorPolicy';\nimport { ToolSet } from '../core/mcp/ToolSet';\nimport type { AgentDefinition, ModelParams } from '../core/runtime/AgentDefinition';\nimport type { AgentInfo } from '../core/runtime/AgentThread.types';\nimport type { Sandbox, SandboxInfo } from '../core/sandbox/Sandbox';\nimport type { AgentTracing } from '../core/tracing/AgentTracing';\nimport { NOOP_AGENT_TRACING } from '../core/tracing/NoopAgentTracing';\nimport type { ITurnResourceResolver } from './ITurnResourceResolver';\nimport type { TurnRecord } from './models/TurnRecord';\nimport type { AgentSpec } from './schemas/agentSpec';\n\n/**\n * Factory that creates a Sandbox handle for a run (reattach via\n * existingSandboxId). `spec` carries the sandbox-relevant agent settings\n * (e.g. config.sandbox.file_downloads) so implementations can shape the\n * Sandbox per run without the factory type growing a field per option.\n */\nexport type TurnSandboxFactory = (input: {\n spec: AgentSpec;\n existingSandboxId?: string | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n}) => Promise<Sandbox>;\n\nfunction specWantsSandbox(spec: AgentSpec): boolean {\n return spec.config.sandbox.enabled;\n}\n\nfunction toSelectors(entry: {\n enable_tools: string[];\n disable_tools: string[];\n preload_tools: string[];\n require_approval_for_tools: string[];\n}): ToolSelectorConfig {\n return {\n enableTools: entry.enable_tools,\n disableTools: entry.disable_tools,\n preloadTools: entry.preload_tools,\n requireApprovalForTools: entry.require_approval_for_tools,\n };\n}\n\n/**\n * Batteries-included base implementation. Construct-and-go for the default\n * behavior; subclass and override to customize (tool sources, sandbox,\n * tracing).\n */\nexport class TurnResourceResolver<\n TTurnCustom extends object = Record<string, never>,\n> implements ITurnResourceResolver<TTurnCustom> {\n readonly #sources = new Map<string, Promise<ToolSource>>();\n #sandbox?: Sandbox | undefined;\n\n constructor(\n protected readonly deps: {\n /** Model name → client and defaults. Called once per resolved definition; may load provider config. */\n llm: (model: string) => Promise<{\n modelClient: ILLM;\n defaultModelParams: ModelParams;\n }>;\n /**\n * MCP server name → connection details. Required to use spec.mcp_servers:\n * the AgentSpec carries names only (no url/headers on the wire) — the\n * runtime supplies the catalog. Called once per distinct server name per\n * turn. Throw for unknown names. `headers` supports the async resolver form.\n */\n mcp: (name: string) => Promise<{ url: string; headers?: RemoteMcpHeaders }>;\n mcpRequestTimeoutMs: number;\n mcpConnectTimeoutMs: number;\n /** One sandbox type per runtime. Omit = no sandbox support. */\n sandboxProvider?: TurnSandboxFactory | undefined;\n /**\n * Named-agent lookup (registry id → live AgentSpec). Required when a\n * session is bound by reference; omit only if all sessions use inline agents.\n */\n agent?: ((agentId: string) => Promise<AgentSpec>) | undefined;\n /** Forwarded to RemoteMCP / AgentThread (required by their constructors). */\n logger: Logger;\n },\n ) {}\n\n get logger(): Logger {\n return this.deps.logger;\n }\n\n /** Default: no-op tracing. Override to plug in a real tracer. */\n createTracing(): AgentTracing {\n return NOOP_AGENT_TRACING;\n }\n\n /** Named (ref) session agent → live registry lookup via deps.agent. */\n async resolveAgentSpec(input: { agent_id: string }): Promise<AgentSpec> {\n if (this.deps.agent === undefined) {\n // Host forgot to wire deps.agent — not \"agent id missing from the registry\"\n // (that failure belongs in the lookup callback, e.g. HTTP 422 on the server).\n throw new Error(\n `Named agent '${input.agent_id}' cannot be resolved: no agent lookup configured on the turn resolver`,\n );\n }\n return await this.deps.agent(input.agent_id);\n }\n\n /**\n * Default: creates a sandbox iff a provider is configured AND the spec wants\n * one; reattaches to the previous turn's VM via `existing.sandbox_id` when\n * present. Overrides that resolve their own sandbox must assign it so\n * close() can release it (or override close() too).\n */\n async resolveSandbox(input: {\n spec: AgentSpec;\n existing?: SandboxInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<Sandbox | undefined> {\n if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) {\n return undefined;\n }\n this.#sandbox = await this.deps.sandboxProvider({\n spec: input.spec,\n existingSandboxId: input.existing?.sandbox_id,\n signal: input.signal,\n tracing: input.tracing,\n });\n return this.#sandbox;\n }\n\n /**\n * Closes the sandbox HANDLE if one was resolved. This releases only this\n * process's connection (local bridge); the sandbox VM keeps running and the\n * next turn reattaches via `existing.sandbox_id`.\n *\n * Tool sources (MCP connections) are intentionally NOT closed: the run's\n * AbortSignal already aborts their in-flight calls, and connections are\n * per-run objects that are simply dropped. If deterministic MCP socket\n * release is ever needed, add it here — no contract change required.\n *\n * Subclasses that acquire additional resources MUST override, release\n * their own resources best-effort, and call `await super.close()`.\n * Idempotent; never throws.\n */\n async close(): Promise<void> {\n const sandbox = this.#sandbox;\n this.#sandbox = undefined;\n await sandbox?.close().catch(() => {\n /* no-op */\n });\n }\n\n /**\n * Default: maps the spec directly to a definition — spec.mcp_servers carry\n * names only; deps.mcp resolves each name to url/headers, and the result\n * becomes a RemoteMCP source (deduped per turn via getOrCreateToolSource)\n * wrapped in a per-agent ToolSet view. Passes the previous turn's persisted\n * MCP session_id into RemoteMCP for cross-turn stateful resume.\n */\n async resolveAgentDefinition(input: {\n spec: AgentSpec;\n thread_id: string;\n agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<{\n definition: AgentDefinition;\n extraCapabilities?: AgentCapability[] | undefined;\n }> {\n const { spec, agent_info: agentInfo, previousTurn, signal, tracing } = input;\n const toolSets = await Promise.all(\n (spec.mcp_servers ?? []).map(async entry => {\n const source = await this.getOrCreateToolSource({\n id: entry.name,\n create: async () => {\n const { url, headers } = await this.deps.mcp(entry.name);\n return new RemoteMCP({\n id: entry.name,\n name: entry.name,\n url,\n headers: headers ?? {},\n sessionId: previousTurn?.snapshot.mcp_servers?.[entry.name]?.session_id,\n requestTimeoutMs: this.deps.mcpRequestTimeoutMs,\n connectTimeoutMs: this.deps.mcpConnectTimeoutMs,\n logger: this.deps.logger,\n tracing,\n signal,\n });\n },\n });\n return new ToolSet({\n source,\n selectors: toSelectors(entry),\n preload: entry.preload,\n });\n }),\n );\n // Sub-agents may request a different catalog model via agent_info.model;\n // resolve that name so modelClient matches the override (not just a label).\n const modelName = agentInfo?.model ?? spec.model.name;\n const resolvedModel = await this.deps.llm(modelName);\n return {\n definition: {\n modelClient: resolvedModel.modelClient,\n // Sub-agents receive the delegated task as a user message; their system\n // prompt is SUB_AGENT_IDENTITY (added by AgentThread), not user instructions.\n instruction: agentInfo ? undefined : spec.instructions,\n messages: agentInfo\n ? [{ role: 'user' as const, content: agentInfo.input }]\n : spec.messages?.map(m => ({\n role: 'user' as const,\n content: m.content,\n })),\n modelParams: {\n ...resolvedModel.defaultModelParams,\n ...spec.model.params,\n },\n // Sub-agents should return free-form summaries to the parent, not the user-facing structured response.\n responseFormat: agentInfo ? undefined : spec.response_format,\n iterationLimit: spec.config.iteration_limit,\n toolSets,\n },\n };\n }\n\n /**\n * Returns the tool source for `id`, creating it on first call — use from\n * resolveAgentDefinition overrides so agents sharing a server share one\n * connection. Single-flight by id: the promise is stored synchronously (no\n * await between get and set), so overlapping resolveAgentDefinition calls\n * can never double-create. Rejections stay cached: one attempt per turn.\n * Do not override.\n */\n protected getOrCreateToolSource(input: { id: string; create: () => Promise<ToolSource> }): Promise<ToolSource> {\n const cached = this.#sources.get(input.id);\n if (cached) {\n return cached;\n }\n const made = input.create();\n this.#sources.set(input.id, made);\n return made;\n }\n}\n"],"mappings":"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","names":[]}
@@ -43,7 +43,9 @@ var TurnResourceResolver = class {
43
43
  * close() can release it (or override close() too).
44
44
  */
45
45
  async resolveSandbox(input) {
46
- if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) return void 0;
46
+ if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) {
47
+ return void 0;
48
+ }
47
49
  this.#sandbox = await this.deps.sandboxProvider({
48
50
  spec: input.spec,
49
51
  existingSandboxId: input.existing?.sandbox_id,
@@ -141,7 +143,9 @@ var TurnResourceResolver = class {
141
143
  */
142
144
  getOrCreateToolSource(input) {
143
145
  const cached = this.#sources.get(input.id);
144
- if (cached) return cached;
146
+ if (cached) {
147
+ return cached;
148
+ }
145
149
  const made = input.create();
146
150
  this.#sources.set(input.id, made);
147
151
  return made;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\nimport type { AgentCapability } from '../core/capabilities/AgentCapability';\nimport type { ILLM } from '../core/llm/ILLM';\nimport type { ToolSource } from '../core/mcp/IMCPServer';\nimport { RemoteMCP, type RemoteMcpHeaders } from '../core/mcp/RemoteMCP';\nimport type { ToolSelectorConfig } from '../core/mcp/ToolSelectorPolicy';\nimport { ToolSet } from '../core/mcp/ToolSet';\nimport type { AgentDefinition, ModelParams } from '../core/runtime/AgentDefinition';\nimport type { AgentInfo } from '../core/runtime/AgentThread.types';\nimport type { Sandbox, SandboxInfo } from '../core/sandbox/Sandbox';\nimport type { AgentTracing } from '../core/tracing/AgentTracing';\nimport { NOOP_AGENT_TRACING } from '../core/tracing/NoopAgentTracing';\nimport type { ITurnResourceResolver } from './ITurnResourceResolver';\nimport type { TurnRecord } from './models/TurnRecord';\nimport type { AgentSpec } from './schemas/agentSpec';\n\n/**\n * Factory that creates a Sandbox handle for a run (reattach via\n * existingSandboxId). `spec` carries the sandbox-relevant agent settings\n * (e.g. config.sandbox.file_downloads) so implementations can shape the\n * Sandbox per run without the factory type growing a field per option.\n */\nexport type TurnSandboxFactory = (input: {\n spec: AgentSpec;\n existingSandboxId?: string | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n}) => Promise<Sandbox>;\n\nfunction specWantsSandbox(spec: AgentSpec): boolean {\n return spec.config.sandbox.enabled;\n}\n\nfunction toSelectors(entry: {\n enable_tools: string[];\n disable_tools: string[];\n preload_tools: string[];\n require_approval_for_tools: string[];\n}): ToolSelectorConfig {\n return {\n enableTools: entry.enable_tools,\n disableTools: entry.disable_tools,\n preloadTools: entry.preload_tools,\n requireApprovalForTools: entry.require_approval_for_tools,\n };\n}\n\n/**\n * Batteries-included base implementation. Construct-and-go for the default\n * behavior; subclass and override to customize (tool sources, sandbox,\n * tracing).\n */\nexport class TurnResourceResolver<\n TTurnCustom extends object = Record<string, never>,\n> implements ITurnResourceResolver<TTurnCustom> {\n readonly #sources = new Map<string, Promise<ToolSource>>();\n #sandbox?: Sandbox | undefined;\n\n constructor(\n protected readonly deps: {\n /** Model name → client and defaults. Called once per resolved definition; may load provider config. */\n llm: (model: string) => Promise<{\n modelClient: ILLM;\n defaultModelParams: ModelParams;\n }>;\n /**\n * MCP server name → connection details. Required to use spec.mcp_servers:\n * the AgentSpec carries names only (no url/headers on the wire) — the\n * runtime supplies the catalog. Called once per distinct server name per\n * turn. Throw for unknown names. `headers` supports the async resolver form.\n */\n mcp: (name: string) => Promise<{ url: string; headers?: RemoteMcpHeaders }>;\n mcpRequestTimeoutMs: number;\n mcpConnectTimeoutMs: number;\n /** One sandbox type per runtime. Omit = no sandbox support. */\n sandboxProvider?: TurnSandboxFactory | undefined;\n /**\n * Named-agent lookup (registry id → live AgentSpec). Required when a\n * session is bound by reference; omit only if all sessions use inline agents.\n */\n agent?: ((agentId: string) => Promise<AgentSpec>) | undefined;\n /** Forwarded to RemoteMCP / AgentThread (required by their constructors). */\n logger: Logger;\n },\n ) {}\n\n get logger(): Logger {\n return this.deps.logger;\n }\n\n /** Default: no-op tracing. Override to plug in a real tracer. */\n createTracing(): AgentTracing {\n return NOOP_AGENT_TRACING;\n }\n\n /** Named (ref) session agent → live registry lookup via deps.agent. */\n async resolveAgentSpec(input: { agent_id: string }): Promise<AgentSpec> {\n if (this.deps.agent === undefined) {\n // Host forgot to wire deps.agent — not \"agent id missing from the registry\"\n // (that failure belongs in the lookup callback, e.g. HTTP 422 on the server).\n throw new Error(\n `Named agent '${input.agent_id}' cannot be resolved: no agent lookup configured on the turn resolver`,\n );\n }\n return await this.deps.agent(input.agent_id);\n }\n\n /**\n * Default: creates a sandbox iff a provider is configured AND the spec wants\n * one; reattaches to the previous turn's VM via `existing.sandbox_id` when\n * present. Overrides that resolve their own sandbox must assign it so\n * close() can release it (or override close() too).\n */\n async resolveSandbox(input: {\n spec: AgentSpec;\n existing?: SandboxInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<Sandbox | undefined> {\n if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) return undefined;\n this.#sandbox = await this.deps.sandboxProvider({\n spec: input.spec,\n existingSandboxId: input.existing?.sandbox_id,\n signal: input.signal,\n tracing: input.tracing,\n });\n return this.#sandbox;\n }\n\n /**\n * Closes the sandbox HANDLE if one was resolved. This releases only this\n * process's connection (local bridge); the sandbox VM keeps running and the\n * next turn reattaches via `existing.sandbox_id`.\n *\n * Tool sources (MCP connections) are intentionally NOT closed: the run's\n * AbortSignal already aborts their in-flight calls, and connections are\n * per-run objects that are simply dropped. If deterministic MCP socket\n * release is ever needed, add it here — no contract change required.\n *\n * Subclasses that acquire additional resources MUST override, release\n * their own resources best-effort, and call `await super.close()`.\n * Idempotent; never throws.\n */\n async close(): Promise<void> {\n const sandbox = this.#sandbox;\n this.#sandbox = undefined;\n await sandbox?.close().catch(() => {\n /* no-op */\n });\n }\n\n /**\n * Default: maps the spec directly to a definition — spec.mcp_servers carry\n * names only; deps.mcp resolves each name to url/headers, and the result\n * becomes a RemoteMCP source (deduped per turn via getOrCreateToolSource)\n * wrapped in a per-agent ToolSet view. Passes the previous turn's persisted\n * MCP session_id into RemoteMCP for cross-turn stateful resume.\n */\n async resolveAgentDefinition(input: {\n spec: AgentSpec;\n thread_id: string;\n agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<{\n definition: AgentDefinition;\n extraCapabilities?: AgentCapability[] | undefined;\n }> {\n const { spec, agent_info: agentInfo, previousTurn, signal, tracing } = input;\n const toolSets = await Promise.all(\n (spec.mcp_servers ?? []).map(async entry => {\n const source = await this.getOrCreateToolSource({\n id: entry.name,\n create: async () => {\n const { url, headers } = await this.deps.mcp(entry.name);\n return new RemoteMCP({\n id: entry.name,\n name: entry.name,\n url,\n headers: headers ?? {},\n sessionId: previousTurn?.snapshot.mcp_servers?.[entry.name]?.session_id,\n requestTimeoutMs: this.deps.mcpRequestTimeoutMs,\n connectTimeoutMs: this.deps.mcpConnectTimeoutMs,\n logger: this.deps.logger,\n tracing,\n signal,\n });\n },\n });\n return new ToolSet({\n source,\n selectors: toSelectors(entry),\n preload: entry.preload,\n });\n }),\n );\n // Sub-agents may request a different catalog model via agent_info.model;\n // resolve that name so modelClient matches the override (not just a label).\n const modelName = agentInfo?.model ?? spec.model.name;\n const resolvedModel = await this.deps.llm(modelName);\n return {\n definition: {\n modelClient: resolvedModel.modelClient,\n // Sub-agents receive the delegated task as a user message; their system\n // prompt is SUB_AGENT_IDENTITY (added by AgentThread), not user instructions.\n instruction: agentInfo ? undefined : spec.instructions,\n messages: agentInfo\n ? [{ role: 'user' as const, content: agentInfo.input }]\n : spec.messages?.map(m => ({\n role: 'user' as const,\n content: m.content,\n })),\n modelParams: {\n ...resolvedModel.defaultModelParams,\n ...spec.model.params,\n },\n // Sub-agents should return free-form summaries to the parent, not the user-facing structured response.\n responseFormat: agentInfo ? undefined : spec.response_format,\n iterationLimit: spec.config.iteration_limit,\n toolSets,\n },\n };\n }\n\n /**\n * Returns the tool source for `id`, creating it on first call — use from\n * resolveAgentDefinition overrides so agents sharing a server share one\n * connection. Single-flight by id: the promise is stored synchronously (no\n * await between get and set), so overlapping resolveAgentDefinition calls\n * can never double-create. Rejections stay cached: one attempt per turn.\n * Do not override.\n */\n protected getOrCreateToolSource(input: { id: string; create: () => Promise<ToolSource> }): Promise<ToolSource> {\n const cached = this.#sources.get(input.id);\n if (cached) return cached;\n const made = input.create();\n this.#sources.set(input.id, made);\n return made;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\nimport type { AgentCapability } from '../core/capabilities/AgentCapability';\nimport type { ILLM } from '../core/llm/ILLM';\nimport type { ToolSource } from '../core/mcp/IMCPServer';\nimport { RemoteMCP, type RemoteMcpHeaders } from '../core/mcp/RemoteMCP';\nimport type { ToolSelectorConfig } from '../core/mcp/ToolSelectorPolicy';\nimport { ToolSet } from '../core/mcp/ToolSet';\nimport type { AgentDefinition, ModelParams } from '../core/runtime/AgentDefinition';\nimport type { AgentInfo } from '../core/runtime/AgentThread.types';\nimport type { Sandbox, SandboxInfo } from '../core/sandbox/Sandbox';\nimport type { AgentTracing } from '../core/tracing/AgentTracing';\nimport { NOOP_AGENT_TRACING } from '../core/tracing/NoopAgentTracing';\nimport type { ITurnResourceResolver } from './ITurnResourceResolver';\nimport type { TurnRecord } from './models/TurnRecord';\nimport type { AgentSpec } from './schemas/agentSpec';\n\n/**\n * Factory that creates a Sandbox handle for a run (reattach via\n * existingSandboxId). `spec` carries the sandbox-relevant agent settings\n * (e.g. config.sandbox.file_downloads) so implementations can shape the\n * Sandbox per run without the factory type growing a field per option.\n */\nexport type TurnSandboxFactory = (input: {\n spec: AgentSpec;\n existingSandboxId?: string | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n}) => Promise<Sandbox>;\n\nfunction specWantsSandbox(spec: AgentSpec): boolean {\n return spec.config.sandbox.enabled;\n}\n\nfunction toSelectors(entry: {\n enable_tools: string[];\n disable_tools: string[];\n preload_tools: string[];\n require_approval_for_tools: string[];\n}): ToolSelectorConfig {\n return {\n enableTools: entry.enable_tools,\n disableTools: entry.disable_tools,\n preloadTools: entry.preload_tools,\n requireApprovalForTools: entry.require_approval_for_tools,\n };\n}\n\n/**\n * Batteries-included base implementation. Construct-and-go for the default\n * behavior; subclass and override to customize (tool sources, sandbox,\n * tracing).\n */\nexport class TurnResourceResolver<\n TTurnCustom extends object = Record<string, never>,\n> implements ITurnResourceResolver<TTurnCustom> {\n readonly #sources = new Map<string, Promise<ToolSource>>();\n #sandbox?: Sandbox | undefined;\n\n constructor(\n protected readonly deps: {\n /** Model name → client and defaults. Called once per resolved definition; may load provider config. */\n llm: (model: string) => Promise<{\n modelClient: ILLM;\n defaultModelParams: ModelParams;\n }>;\n /**\n * MCP server name → connection details. Required to use spec.mcp_servers:\n * the AgentSpec carries names only (no url/headers on the wire) — the\n * runtime supplies the catalog. Called once per distinct server name per\n * turn. Throw for unknown names. `headers` supports the async resolver form.\n */\n mcp: (name: string) => Promise<{ url: string; headers?: RemoteMcpHeaders }>;\n mcpRequestTimeoutMs: number;\n mcpConnectTimeoutMs: number;\n /** One sandbox type per runtime. Omit = no sandbox support. */\n sandboxProvider?: TurnSandboxFactory | undefined;\n /**\n * Named-agent lookup (registry id → live AgentSpec). Required when a\n * session is bound by reference; omit only if all sessions use inline agents.\n */\n agent?: ((agentId: string) => Promise<AgentSpec>) | undefined;\n /** Forwarded to RemoteMCP / AgentThread (required by their constructors). */\n logger: Logger;\n },\n ) {}\n\n get logger(): Logger {\n return this.deps.logger;\n }\n\n /** Default: no-op tracing. Override to plug in a real tracer. */\n createTracing(): AgentTracing {\n return NOOP_AGENT_TRACING;\n }\n\n /** Named (ref) session agent → live registry lookup via deps.agent. */\n async resolveAgentSpec(input: { agent_id: string }): Promise<AgentSpec> {\n if (this.deps.agent === undefined) {\n // Host forgot to wire deps.agent — not \"agent id missing from the registry\"\n // (that failure belongs in the lookup callback, e.g. HTTP 422 on the server).\n throw new Error(\n `Named agent '${input.agent_id}' cannot be resolved: no agent lookup configured on the turn resolver`,\n );\n }\n return await this.deps.agent(input.agent_id);\n }\n\n /**\n * Default: creates a sandbox iff a provider is configured AND the spec wants\n * one; reattaches to the previous turn's VM via `existing.sandbox_id` when\n * present. Overrides that resolve their own sandbox must assign it so\n * close() can release it (or override close() too).\n */\n async resolveSandbox(input: {\n spec: AgentSpec;\n existing?: SandboxInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<Sandbox | undefined> {\n if (!this.deps.sandboxProvider || !specWantsSandbox(input.spec)) {\n return undefined;\n }\n this.#sandbox = await this.deps.sandboxProvider({\n spec: input.spec,\n existingSandboxId: input.existing?.sandbox_id,\n signal: input.signal,\n tracing: input.tracing,\n });\n return this.#sandbox;\n }\n\n /**\n * Closes the sandbox HANDLE if one was resolved. This releases only this\n * process's connection (local bridge); the sandbox VM keeps running and the\n * next turn reattaches via `existing.sandbox_id`.\n *\n * Tool sources (MCP connections) are intentionally NOT closed: the run's\n * AbortSignal already aborts their in-flight calls, and connections are\n * per-run objects that are simply dropped. If deterministic MCP socket\n * release is ever needed, add it here — no contract change required.\n *\n * Subclasses that acquire additional resources MUST override, release\n * their own resources best-effort, and call `await super.close()`.\n * Idempotent; never throws.\n */\n async close(): Promise<void> {\n const sandbox = this.#sandbox;\n this.#sandbox = undefined;\n await sandbox?.close().catch(() => {\n /* no-op */\n });\n }\n\n /**\n * Default: maps the spec directly to a definition — spec.mcp_servers carry\n * names only; deps.mcp resolves each name to url/headers, and the result\n * becomes a RemoteMCP source (deduped per turn via getOrCreateToolSource)\n * wrapped in a per-agent ToolSet view. Passes the previous turn's persisted\n * MCP session_id into RemoteMCP for cross-turn stateful resume.\n */\n async resolveAgentDefinition(input: {\n spec: AgentSpec;\n thread_id: string;\n agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<{\n definition: AgentDefinition;\n extraCapabilities?: AgentCapability[] | undefined;\n }> {\n const { spec, agent_info: agentInfo, previousTurn, signal, tracing } = input;\n const toolSets = await Promise.all(\n (spec.mcp_servers ?? []).map(async entry => {\n const source = await this.getOrCreateToolSource({\n id: entry.name,\n create: async () => {\n const { url, headers } = await this.deps.mcp(entry.name);\n return new RemoteMCP({\n id: entry.name,\n name: entry.name,\n url,\n headers: headers ?? {},\n sessionId: previousTurn?.snapshot.mcp_servers?.[entry.name]?.session_id,\n requestTimeoutMs: this.deps.mcpRequestTimeoutMs,\n connectTimeoutMs: this.deps.mcpConnectTimeoutMs,\n logger: this.deps.logger,\n tracing,\n signal,\n });\n },\n });\n return new ToolSet({\n source,\n selectors: toSelectors(entry),\n preload: entry.preload,\n });\n }),\n );\n // Sub-agents may request a different catalog model via agent_info.model;\n // resolve that name so modelClient matches the override (not just a label).\n const modelName = agentInfo?.model ?? spec.model.name;\n const resolvedModel = await this.deps.llm(modelName);\n return {\n definition: {\n modelClient: resolvedModel.modelClient,\n // Sub-agents receive the delegated task as a user message; their system\n // prompt is SUB_AGENT_IDENTITY (added by AgentThread), not user instructions.\n instruction: agentInfo ? undefined : spec.instructions,\n messages: agentInfo\n ? [{ role: 'user' as const, content: agentInfo.input }]\n : spec.messages?.map(m => ({\n role: 'user' as const,\n content: m.content,\n })),\n modelParams: {\n ...resolvedModel.defaultModelParams,\n ...spec.model.params,\n },\n // Sub-agents should return free-form summaries to the parent, not the user-facing structured response.\n responseFormat: agentInfo ? undefined : spec.response_format,\n iterationLimit: spec.config.iteration_limit,\n toolSets,\n },\n };\n }\n\n /**\n * Returns the tool source for `id`, creating it on first call — use from\n * resolveAgentDefinition overrides so agents sharing a server share one\n * connection. Single-flight by id: the promise is stored synchronously (no\n * await between get and set), so overlapping resolveAgentDefinition calls\n * can never double-create. Rejections stay cached: one attempt per turn.\n * Do not override.\n */\n protected getOrCreateToolSource(input: { id: string; create: () => Promise<ToolSource> }): Promise<ToolSource> {\n const cached = this.#sources.get(input.id);\n if (cached) {\n return cached;\n }\n const made = input.create();\n this.#sources.set(input.id, made);\n return made;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"turn.d.ts","sourceRoot":"","sources":["../../../src/agent-session/schemas/turn.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAStC,oBAAY,kBAAkB;IAE5B,sBAAsB,6BAA6B;IAEnD,eAAe,qBAAqB;IAEpC,oBAAoB,4BAA4B;IAEhD,SAAS,cAAc;CACxB;AAED,eAAO,MAAM,sBAAsB;;iBAIL,CAAC;AAE/B,eAAO,MAAM,8BAA8B,sCAGL,CAAC;AAEvC,uCAAuC;AACvC,eAAO,MAAM,iBAAiB;;;;;;;;iBAwCL,CAAC;AAE1B,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;iBAOL,CAAC;AAEjC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;iBAOL,CAAC;AAE7B,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcL,CAAC;AAE5B,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAOL,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;2BAML,CAAC;AAE5B,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBASL,CAAC;AAEnB;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiCL,CAAC;AAEhC,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC9C,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
1
+ {"version":3,"file":"turn.d.ts","sourceRoot":"","sources":["../../../src/agent-session/schemas/turn.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAStC,oBAAY,kBAAkB;IAE5B,sBAAsB,6BAA6B;IAEnD,eAAe,qBAAqB;IAEpC,oBAAoB,4BAA4B;IAEhD,SAAS,cAAc;CACxB;AAED,eAAO,MAAM,sBAAsB;;iBAIL,CAAC;AAE/B,eAAO,MAAM,8BAA8B,sCAGL,CAAC;AAEvC,uCAAuC;AACvC,eAAO,MAAM,iBAAiB;;;;;;;;iBAwCL,CAAC;AAE1B,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;iBAOL,CAAC;AAEjC,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;iBAOL,CAAC;AAE7B,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAcL,CAAC;AAE5B,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAOL,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;2BAML,CAAC;AAE5B,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBASL,CAAC;AAEnB;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmCL,CAAC;AAEhC,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAC9C,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAChE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,EAAE;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -102,7 +102,9 @@ var CreateTurnRequestSchema = import_zod_openapi.z.object({
102
102
  previous_turn_id: import_zod_openapi.z.union([import_zod_openapi.z.literal("auto"), import_zod_openapi.z.literal("none"), import_zod_openapi.z.string().min(1)]).optional().default("auto").describe(`Defaults to 'auto' (chain to session last turn). Use 'none' for a new root turn.`).openapi("PreviousTurnIdInput"),
103
103
  stream: import_zod_openapi.z.boolean().optional().default(true).describe("When true (default), stream turn events as SSE. When false, return the running turn immediately.")
104
104
  }).superRefine((data, ctx) => {
105
- if (!data.input) return;
105
+ if (!data.input) {
106
+ return;
107
+ }
106
108
  const hasUser = data.input.some((msg) => "type" in msg && msg.type === "user.message");
107
109
  const hasApprovalOrToolResponse = data.input.some(
108
110
  (msg) => "type" in msg && (msg.type === "user.tool_approval" || msg.type === "user.tool_response")
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/agent-session/schemas/turn.ts"],"sourcesContent":["/** Turn product schemas: turn state, input items, and create-turn request. */\nimport { z } from '@hono/zod-openapi';\nimport {\n ActionRequiredEventSchema,\n AgentInputUserMessageSchema,\n ModelMessageEventSchema,\n UserToolApprovalMessageSchema,\n UserToolResponseMessageSchema,\n} from '../../core/events/schema';\n\nexport enum CancellationReason {\n // AbortController.abort() reason for the max-execution timer.\n ServerExecutionTimeout = 'server-execution-timeout',\n // Emitted when the client cancels the run.\n ClientCancelled = 'client-cancelled',\n // Prior turn aborted because the client started a new turn.\n CancelledForNextTurn = 'cancelled-for-next-turn',\n // Process shutting down (SIGTERM/SIGINT).\n Abandoned = 'abandoned',\n}\n\nexport const TurnStateRunningSchema = z\n .object({\n status: z.literal('running').describe('Turn is still executing.'),\n })\n .openapi('TurnStateRunning');\n\nexport const TurnStateCancelledReasonSchema = z\n .enum(CancellationReason)\n .describe('Reason for the cancellation.')\n .openapi('TurnStateCancelledReason');\n\n/** Billable aggregate for one turn. */\nexport const TurnMetricsSchema = z\n .object({\n total_input_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total input tokens across model calls in this turn.'),\n total_output_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total output tokens across model calls in this turn.'),\n total_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total tokens (input + output) across model calls in this turn.'),\n total_cache_read_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total cache-read tokens across model calls in this turn.'),\n total_cache_write_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total cache-write tokens across model calls in this turn.'),\n total_reasoning_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total reasoning tokens across model calls in this turn.'),\n total_cost_in_usd: z.number().nonnegative().optional().describe('Estimated total cost in USD for this turn.'),\n })\n .openapi('TurnMetrics');\n\nexport const TurnStateCancelledSchema = z\n .object({\n status: z.literal('cancelled').describe('Turn was cancelled before completion.'),\n reason: TurnStateCancelledReasonSchema,\n completed_at: z.string().describe('ISO 8601 time when cancellation completed.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for work done before cancel.'),\n })\n .openapi('TurnStateCancelled');\n\nexport const TurnStateErrorSchema = z\n .object({\n status: z.literal('error').describe('Turn ended with an error.'),\n message: z.string().describe('Human-readable error message.'),\n completed_at: z.string().describe('ISO 8601 time when the error state was recorded.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for work done before the error.'),\n })\n .openapi('TurnStateError');\n\nexport const TurnStateDoneSchema = z\n .object({\n status: z.literal('done').describe('Turn finished (possibly paused for required actions).'),\n output: z\n .union([ModelMessageEventSchema, z.null()])\n .describe('Final `model.message` for the turn, or null when the turn ended paused without a final message.'),\n required_actions: z\n .array(ActionRequiredEventSchema)\n .describe(\n 'Pending actions (`tool.approval_required`, `tool.response_required`, `mcp.auth_required`); empty when none.',\n ),\n completed_at: z.string().describe('ISO 8601 time when the turn reached a terminal state.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for the whole turn.'),\n })\n .openapi('TurnStateDone');\n\nexport const TurnStateSchema = z\n .discriminatedUnion('status', [\n TurnStateRunningSchema,\n TurnStateDoneSchema,\n TurnStateCancelledSchema,\n TurnStateErrorSchema,\n ])\n .openapi('TurnState');\n\nexport const TurnInputItemSchema = z\n .discriminatedUnion('type', [\n AgentInputUserMessageSchema,\n UserToolApprovalMessageSchema,\n UserToolResponseMessageSchema,\n ])\n .openapi('TurnInputItem');\n\nexport const TurnSchema = z\n .object({\n id: z.string().describe('Unique turn id.'),\n session_id: z.string().describe('Session that owns this turn.'),\n previous_turn_id: z.string().nullable().describe('Prior turn this turn chains from; null for a root turn.'),\n input: z.array(TurnInputItemSchema).optional().describe('Input items supplied when the turn was created.'),\n state: TurnStateSchema,\n created_at: z.string().describe('ISO 8601 creation timestamp.'),\n })\n .openapi('Turn');\n\n/**\n * Wire type for the previous_turn_id field. Includes the default so the schema\n * can be referenced directly without re-wrapping (re-wrapping strips the $ref).\n */\nexport const CreateTurnRequestSchema = z\n .object({\n input: z\n .array(TurnInputItemSchema)\n .optional()\n .describe(\n 'Turn input items: user messages and/or approval/tool-response resumes. Do not mix user messages with approval or tool-response items.',\n ),\n previous_turn_id: z\n .union([z.literal('auto'), z.literal('none'), z.string().min(1)])\n .optional()\n .default('auto')\n .describe(`Defaults to 'auto' (chain to session last turn). Use 'none' for a new root turn.`)\n .openapi('PreviousTurnIdInput'),\n stream: z\n .boolean()\n .optional()\n .default(true)\n .describe('When true (default), stream turn events as SSE. When false, return the running turn immediately.'),\n })\n .superRefine((data, ctx) => {\n if (!data.input) return;\n const hasUser = data.input.some(msg => 'type' in msg && msg.type === 'user.message');\n const hasApprovalOrToolResponse = data.input.some(\n msg => 'type' in msg && (msg.type === 'user.tool_approval' || msg.type === 'user.tool_response'),\n );\n if (hasUser && hasApprovalOrToolResponse) {\n ctx.addIssue({\n code: 'custom',\n message: 'input must not mix user messages with approval decisions or client-side tool responses',\n });\n }\n })\n .openapi('CreateTurnRequest');\n\nexport type Turn = z.infer<typeof TurnSchema>;\nexport type TurnInputItem = z.infer<typeof TurnInputItemSchema>;\nexport type TurnState = z.infer<typeof TurnStateSchema>;\nexport type TerminalTurnState = Exclude<TurnState, { status: 'running' }>;\nexport type TurnMetrics = z.infer<typeof TurnMetricsSchema>;\n"],"mappings":"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","names":["CancellationReason"]}
1
+ {"version":3,"sources":["../../../src/agent-session/schemas/turn.ts"],"sourcesContent":["/** Turn product schemas: turn state, input items, and create-turn request. */\nimport { z } from '@hono/zod-openapi';\nimport {\n ActionRequiredEventSchema,\n AgentInputUserMessageSchema,\n ModelMessageEventSchema,\n UserToolApprovalMessageSchema,\n UserToolResponseMessageSchema,\n} from '../../core/events/schema';\n\nexport enum CancellationReason {\n // AbortController.abort() reason for the max-execution timer.\n ServerExecutionTimeout = 'server-execution-timeout',\n // Emitted when the client cancels the run.\n ClientCancelled = 'client-cancelled',\n // Prior turn aborted because the client started a new turn.\n CancelledForNextTurn = 'cancelled-for-next-turn',\n // Process shutting down (SIGTERM/SIGINT).\n Abandoned = 'abandoned',\n}\n\nexport const TurnStateRunningSchema = z\n .object({\n status: z.literal('running').describe('Turn is still executing.'),\n })\n .openapi('TurnStateRunning');\n\nexport const TurnStateCancelledReasonSchema = z\n .enum(CancellationReason)\n .describe('Reason for the cancellation.')\n .openapi('TurnStateCancelledReason');\n\n/** Billable aggregate for one turn. */\nexport const TurnMetricsSchema = z\n .object({\n total_input_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total input tokens across model calls in this turn.'),\n total_output_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total output tokens across model calls in this turn.'),\n total_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total tokens (input + output) across model calls in this turn.'),\n total_cache_read_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total cache-read tokens across model calls in this turn.'),\n total_cache_write_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total cache-write tokens across model calls in this turn.'),\n total_reasoning_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total reasoning tokens across model calls in this turn.'),\n total_cost_in_usd: z.number().nonnegative().optional().describe('Estimated total cost in USD for this turn.'),\n })\n .openapi('TurnMetrics');\n\nexport const TurnStateCancelledSchema = z\n .object({\n status: z.literal('cancelled').describe('Turn was cancelled before completion.'),\n reason: TurnStateCancelledReasonSchema,\n completed_at: z.string().describe('ISO 8601 time when cancellation completed.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for work done before cancel.'),\n })\n .openapi('TurnStateCancelled');\n\nexport const TurnStateErrorSchema = z\n .object({\n status: z.literal('error').describe('Turn ended with an error.'),\n message: z.string().describe('Human-readable error message.'),\n completed_at: z.string().describe('ISO 8601 time when the error state was recorded.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for work done before the error.'),\n })\n .openapi('TurnStateError');\n\nexport const TurnStateDoneSchema = z\n .object({\n status: z.literal('done').describe('Turn finished (possibly paused for required actions).'),\n output: z\n .union([ModelMessageEventSchema, z.null()])\n .describe('Final `model.message` for the turn, or null when the turn ended paused without a final message.'),\n required_actions: z\n .array(ActionRequiredEventSchema)\n .describe(\n 'Pending actions (`tool.approval_required`, `tool.response_required`, `mcp.auth_required`); empty when none.',\n ),\n completed_at: z.string().describe('ISO 8601 time when the turn reached a terminal state.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for the whole turn.'),\n })\n .openapi('TurnStateDone');\n\nexport const TurnStateSchema = z\n .discriminatedUnion('status', [\n TurnStateRunningSchema,\n TurnStateDoneSchema,\n TurnStateCancelledSchema,\n TurnStateErrorSchema,\n ])\n .openapi('TurnState');\n\nexport const TurnInputItemSchema = z\n .discriminatedUnion('type', [\n AgentInputUserMessageSchema,\n UserToolApprovalMessageSchema,\n UserToolResponseMessageSchema,\n ])\n .openapi('TurnInputItem');\n\nexport const TurnSchema = z\n .object({\n id: z.string().describe('Unique turn id.'),\n session_id: z.string().describe('Session that owns this turn.'),\n previous_turn_id: z.string().nullable().describe('Prior turn this turn chains from; null for a root turn.'),\n input: z.array(TurnInputItemSchema).optional().describe('Input items supplied when the turn was created.'),\n state: TurnStateSchema,\n created_at: z.string().describe('ISO 8601 creation timestamp.'),\n })\n .openapi('Turn');\n\n/**\n * Wire type for the previous_turn_id field. Includes the default so the schema\n * can be referenced directly without re-wrapping (re-wrapping strips the $ref).\n */\nexport const CreateTurnRequestSchema = z\n .object({\n input: z\n .array(TurnInputItemSchema)\n .optional()\n .describe(\n 'Turn input items: user messages and/or approval/tool-response resumes. Do not mix user messages with approval or tool-response items.',\n ),\n previous_turn_id: z\n .union([z.literal('auto'), z.literal('none'), z.string().min(1)])\n .optional()\n .default('auto')\n .describe(`Defaults to 'auto' (chain to session last turn). Use 'none' for a new root turn.`)\n .openapi('PreviousTurnIdInput'),\n stream: z\n .boolean()\n .optional()\n .default(true)\n .describe('When true (default), stream turn events as SSE. When false, return the running turn immediately.'),\n })\n .superRefine((data, ctx) => {\n if (!data.input) {\n return;\n }\n const hasUser = data.input.some(msg => 'type' in msg && msg.type === 'user.message');\n const hasApprovalOrToolResponse = data.input.some(\n msg => 'type' in msg && (msg.type === 'user.tool_approval' || msg.type === 'user.tool_response'),\n );\n if (hasUser && hasApprovalOrToolResponse) {\n ctx.addIssue({\n code: 'custom',\n message: 'input must not mix user messages with approval decisions or client-side tool responses',\n });\n }\n })\n .openapi('CreateTurnRequest');\n\nexport type Turn = z.infer<typeof TurnSchema>;\nexport type TurnInputItem = z.infer<typeof TurnInputItemSchema>;\nexport type TurnState = z.infer<typeof TurnStateSchema>;\nexport type TerminalTurnState = Exclude<TurnState, { status: 'running' }>;\nexport type TurnMetrics = z.infer<typeof TurnMetricsSchema>;\n"],"mappings":"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","names":["CancellationReason"]}
@@ -74,7 +74,9 @@ var CreateTurnRequestSchema = z.object({
74
74
  previous_turn_id: z.union([z.literal("auto"), z.literal("none"), z.string().min(1)]).optional().default("auto").describe(`Defaults to 'auto' (chain to session last turn). Use 'none' for a new root turn.`).openapi("PreviousTurnIdInput"),
75
75
  stream: z.boolean().optional().default(true).describe("When true (default), stream turn events as SSE. When false, return the running turn immediately.")
76
76
  }).superRefine((data, ctx) => {
77
- if (!data.input) return;
77
+ if (!data.input) {
78
+ return;
79
+ }
78
80
  const hasUser = data.input.some((msg) => "type" in msg && msg.type === "user.message");
79
81
  const hasApprovalOrToolResponse = data.input.some(
80
82
  (msg) => "type" in msg && (msg.type === "user.tool_approval" || msg.type === "user.tool_response")
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/agent-session/schemas/turn.ts"],"sourcesContent":["/** Turn product schemas: turn state, input items, and create-turn request. */\nimport { z } from '@hono/zod-openapi';\nimport {\n ActionRequiredEventSchema,\n AgentInputUserMessageSchema,\n ModelMessageEventSchema,\n UserToolApprovalMessageSchema,\n UserToolResponseMessageSchema,\n} from '../../core/events/schema';\n\nexport enum CancellationReason {\n // AbortController.abort() reason for the max-execution timer.\n ServerExecutionTimeout = 'server-execution-timeout',\n // Emitted when the client cancels the run.\n ClientCancelled = 'client-cancelled',\n // Prior turn aborted because the client started a new turn.\n CancelledForNextTurn = 'cancelled-for-next-turn',\n // Process shutting down (SIGTERM/SIGINT).\n Abandoned = 'abandoned',\n}\n\nexport const TurnStateRunningSchema = z\n .object({\n status: z.literal('running').describe('Turn is still executing.'),\n })\n .openapi('TurnStateRunning');\n\nexport const TurnStateCancelledReasonSchema = z\n .enum(CancellationReason)\n .describe('Reason for the cancellation.')\n .openapi('TurnStateCancelledReason');\n\n/** Billable aggregate for one turn. */\nexport const TurnMetricsSchema = z\n .object({\n total_input_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total input tokens across model calls in this turn.'),\n total_output_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total output tokens across model calls in this turn.'),\n total_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total tokens (input + output) across model calls in this turn.'),\n total_cache_read_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total cache-read tokens across model calls in this turn.'),\n total_cache_write_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total cache-write tokens across model calls in this turn.'),\n total_reasoning_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total reasoning tokens across model calls in this turn.'),\n total_cost_in_usd: z.number().nonnegative().optional().describe('Estimated total cost in USD for this turn.'),\n })\n .openapi('TurnMetrics');\n\nexport const TurnStateCancelledSchema = z\n .object({\n status: z.literal('cancelled').describe('Turn was cancelled before completion.'),\n reason: TurnStateCancelledReasonSchema,\n completed_at: z.string().describe('ISO 8601 time when cancellation completed.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for work done before cancel.'),\n })\n .openapi('TurnStateCancelled');\n\nexport const TurnStateErrorSchema = z\n .object({\n status: z.literal('error').describe('Turn ended with an error.'),\n message: z.string().describe('Human-readable error message.'),\n completed_at: z.string().describe('ISO 8601 time when the error state was recorded.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for work done before the error.'),\n })\n .openapi('TurnStateError');\n\nexport const TurnStateDoneSchema = z\n .object({\n status: z.literal('done').describe('Turn finished (possibly paused for required actions).'),\n output: z\n .union([ModelMessageEventSchema, z.null()])\n .describe('Final `model.message` for the turn, or null when the turn ended paused without a final message.'),\n required_actions: z\n .array(ActionRequiredEventSchema)\n .describe(\n 'Pending actions (`tool.approval_required`, `tool.response_required`, `mcp.auth_required`); empty when none.',\n ),\n completed_at: z.string().describe('ISO 8601 time when the turn reached a terminal state.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for the whole turn.'),\n })\n .openapi('TurnStateDone');\n\nexport const TurnStateSchema = z\n .discriminatedUnion('status', [\n TurnStateRunningSchema,\n TurnStateDoneSchema,\n TurnStateCancelledSchema,\n TurnStateErrorSchema,\n ])\n .openapi('TurnState');\n\nexport const TurnInputItemSchema = z\n .discriminatedUnion('type', [\n AgentInputUserMessageSchema,\n UserToolApprovalMessageSchema,\n UserToolResponseMessageSchema,\n ])\n .openapi('TurnInputItem');\n\nexport const TurnSchema = z\n .object({\n id: z.string().describe('Unique turn id.'),\n session_id: z.string().describe('Session that owns this turn.'),\n previous_turn_id: z.string().nullable().describe('Prior turn this turn chains from; null for a root turn.'),\n input: z.array(TurnInputItemSchema).optional().describe('Input items supplied when the turn was created.'),\n state: TurnStateSchema,\n created_at: z.string().describe('ISO 8601 creation timestamp.'),\n })\n .openapi('Turn');\n\n/**\n * Wire type for the previous_turn_id field. Includes the default so the schema\n * can be referenced directly without re-wrapping (re-wrapping strips the $ref).\n */\nexport const CreateTurnRequestSchema = z\n .object({\n input: z\n .array(TurnInputItemSchema)\n .optional()\n .describe(\n 'Turn input items: user messages and/or approval/tool-response resumes. Do not mix user messages with approval or tool-response items.',\n ),\n previous_turn_id: z\n .union([z.literal('auto'), z.literal('none'), z.string().min(1)])\n .optional()\n .default('auto')\n .describe(`Defaults to 'auto' (chain to session last turn). Use 'none' for a new root turn.`)\n .openapi('PreviousTurnIdInput'),\n stream: z\n .boolean()\n .optional()\n .default(true)\n .describe('When true (default), stream turn events as SSE. When false, return the running turn immediately.'),\n })\n .superRefine((data, ctx) => {\n if (!data.input) return;\n const hasUser = data.input.some(msg => 'type' in msg && msg.type === 'user.message');\n const hasApprovalOrToolResponse = data.input.some(\n msg => 'type' in msg && (msg.type === 'user.tool_approval' || msg.type === 'user.tool_response'),\n );\n if (hasUser && hasApprovalOrToolResponse) {\n ctx.addIssue({\n code: 'custom',\n message: 'input must not mix user messages with approval decisions or client-side tool responses',\n });\n }\n })\n .openapi('CreateTurnRequest');\n\nexport type Turn = z.infer<typeof TurnSchema>;\nexport type TurnInputItem = z.infer<typeof TurnInputItemSchema>;\nexport type TurnState = z.infer<typeof TurnStateSchema>;\nexport type TerminalTurnState = Exclude<TurnState, { status: 'running' }>;\nexport type TurnMetrics = z.infer<typeof TurnMetricsSchema>;\n"],"mappings":"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","names":["CancellationReason"]}
1
+ {"version":3,"sources":["../../../src/agent-session/schemas/turn.ts"],"sourcesContent":["/** Turn product schemas: turn state, input items, and create-turn request. */\nimport { z } from '@hono/zod-openapi';\nimport {\n ActionRequiredEventSchema,\n AgentInputUserMessageSchema,\n ModelMessageEventSchema,\n UserToolApprovalMessageSchema,\n UserToolResponseMessageSchema,\n} from '../../core/events/schema';\n\nexport enum CancellationReason {\n // AbortController.abort() reason for the max-execution timer.\n ServerExecutionTimeout = 'server-execution-timeout',\n // Emitted when the client cancels the run.\n ClientCancelled = 'client-cancelled',\n // Prior turn aborted because the client started a new turn.\n CancelledForNextTurn = 'cancelled-for-next-turn',\n // Process shutting down (SIGTERM/SIGINT).\n Abandoned = 'abandoned',\n}\n\nexport const TurnStateRunningSchema = z\n .object({\n status: z.literal('running').describe('Turn is still executing.'),\n })\n .openapi('TurnStateRunning');\n\nexport const TurnStateCancelledReasonSchema = z\n .enum(CancellationReason)\n .describe('Reason for the cancellation.')\n .openapi('TurnStateCancelledReason');\n\n/** Billable aggregate for one turn. */\nexport const TurnMetricsSchema = z\n .object({\n total_input_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total input tokens across model calls in this turn.'),\n total_output_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total output tokens across model calls in this turn.'),\n total_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total tokens (input + output) across model calls in this turn.'),\n total_cache_read_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total cache-read tokens across model calls in this turn.'),\n total_cache_write_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total cache-write tokens across model calls in this turn.'),\n total_reasoning_tokens: z\n .number()\n .int()\n .nonnegative()\n .optional()\n .describe('Total reasoning tokens across model calls in this turn.'),\n total_cost_in_usd: z.number().nonnegative().optional().describe('Estimated total cost in USD for this turn.'),\n })\n .openapi('TurnMetrics');\n\nexport const TurnStateCancelledSchema = z\n .object({\n status: z.literal('cancelled').describe('Turn was cancelled before completion.'),\n reason: TurnStateCancelledReasonSchema,\n completed_at: z.string().describe('ISO 8601 time when cancellation completed.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for work done before cancel.'),\n })\n .openapi('TurnStateCancelled');\n\nexport const TurnStateErrorSchema = z\n .object({\n status: z.literal('error').describe('Turn ended with an error.'),\n message: z.string().describe('Human-readable error message.'),\n completed_at: z.string().describe('ISO 8601 time when the error state was recorded.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for work done before the error.'),\n })\n .openapi('TurnStateError');\n\nexport const TurnStateDoneSchema = z\n .object({\n status: z.literal('done').describe('Turn finished (possibly paused for required actions).'),\n output: z\n .union([ModelMessageEventSchema, z.null()])\n .describe('Final `model.message` for the turn, or null when the turn ended paused without a final message.'),\n required_actions: z\n .array(ActionRequiredEventSchema)\n .describe(\n 'Pending actions (`tool.approval_required`, `tool.response_required`, `mcp.auth_required`); empty when none.',\n ),\n completed_at: z.string().describe('ISO 8601 time when the turn reached a terminal state.'),\n metrics: TurnMetricsSchema.optional().describe('Optional billable aggregate for the whole turn.'),\n })\n .openapi('TurnStateDone');\n\nexport const TurnStateSchema = z\n .discriminatedUnion('status', [\n TurnStateRunningSchema,\n TurnStateDoneSchema,\n TurnStateCancelledSchema,\n TurnStateErrorSchema,\n ])\n .openapi('TurnState');\n\nexport const TurnInputItemSchema = z\n .discriminatedUnion('type', [\n AgentInputUserMessageSchema,\n UserToolApprovalMessageSchema,\n UserToolResponseMessageSchema,\n ])\n .openapi('TurnInputItem');\n\nexport const TurnSchema = z\n .object({\n id: z.string().describe('Unique turn id.'),\n session_id: z.string().describe('Session that owns this turn.'),\n previous_turn_id: z.string().nullable().describe('Prior turn this turn chains from; null for a root turn.'),\n input: z.array(TurnInputItemSchema).optional().describe('Input items supplied when the turn was created.'),\n state: TurnStateSchema,\n created_at: z.string().describe('ISO 8601 creation timestamp.'),\n })\n .openapi('Turn');\n\n/**\n * Wire type for the previous_turn_id field. Includes the default so the schema\n * can be referenced directly without re-wrapping (re-wrapping strips the $ref).\n */\nexport const CreateTurnRequestSchema = z\n .object({\n input: z\n .array(TurnInputItemSchema)\n .optional()\n .describe(\n 'Turn input items: user messages and/or approval/tool-response resumes. Do not mix user messages with approval or tool-response items.',\n ),\n previous_turn_id: z\n .union([z.literal('auto'), z.literal('none'), z.string().min(1)])\n .optional()\n .default('auto')\n .describe(`Defaults to 'auto' (chain to session last turn). Use 'none' for a new root turn.`)\n .openapi('PreviousTurnIdInput'),\n stream: z\n .boolean()\n .optional()\n .default(true)\n .describe('When true (default), stream turn events as SSE. When false, return the running turn immediately.'),\n })\n .superRefine((data, ctx) => {\n if (!data.input) {\n return;\n }\n const hasUser = data.input.some(msg => 'type' in msg && msg.type === 'user.message');\n const hasApprovalOrToolResponse = data.input.some(\n msg => 'type' in msg && (msg.type === 'user.tool_approval' || msg.type === 'user.tool_response'),\n );\n if (hasUser && hasApprovalOrToolResponse) {\n ctx.addIssue({\n code: 'custom',\n message: 'input must not mix user messages with approval decisions or client-side tool responses',\n });\n }\n })\n .openapi('CreateTurnRequest');\n\nexport type Turn = z.infer<typeof TurnSchema>;\nexport type TurnInputItem = z.infer<typeof TurnInputItemSchema>;\nexport type TurnState = z.infer<typeof TurnStateSchema>;\nexport type TerminalTurnState = Exclude<TurnState, { status: 'running' }>;\nexport type TurnMetrics = z.infer<typeof TurnMetricsSchema>;\n"],"mappings":"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","names":["CancellationReason"]}
@@ -1 +1 @@
1
- {"version":3,"file":"InMemorySessionStore.d.ts","sourceRoot":"","sources":["../../../src/agent-session/store/InMemorySessionStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InMemorySessionStore.d.ts","sourceRoot":"","sources":["../../../src/agent-session/store/InMemorySessionStore.ts"],"names":[],"mappings":"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"}
@@ -40,8 +40,12 @@ function turnKey({ session_id, turn_id }) {
40
40
  return `${session_id}:${turn_id}`;
41
41
  }
42
42
  function compareSessionId(a, b) {
43
- if (a < b) return -1;
44
- if (a > b) return 1;
43
+ if (a < b) {
44
+ return -1;
45
+ }
46
+ if (a > b) {
47
+ return 1;
48
+ }
45
49
  return 0;
46
50
  }
47
51
  function newThreadSnapshot(thread) {
@@ -169,7 +173,9 @@ var InMemorySessionStore = class {
169
173
  async listSessions(input) {
170
174
  const records = [];
171
175
  for (const stored of this.sessions.values()) {
172
- if (stored.record.tenant_id !== input.tenant_id) continue;
176
+ if (stored.record.tenant_id !== input.tenant_id) {
177
+ continue;
178
+ }
173
179
  if (input.agent_id !== void 0 && (stored.record.agent.type !== "reference" || stored.record.agent.id !== input.agent_id)) {
174
180
  continue;
175
181
  }
@@ -177,8 +183,12 @@ var InMemorySessionStore = class {
177
183
  continue;
178
184
  }
179
185
  const createdAt = stored.record.created_at.getTime();
180
- if (input.start_timestamp !== void 0 && createdAt < input.start_timestamp.getTime()) continue;
181
- if (input.end_timestamp !== void 0 && createdAt > input.end_timestamp.getTime()) continue;
186
+ if (input.start_timestamp !== void 0 && createdAt < input.start_timestamp.getTime()) {
187
+ continue;
188
+ }
189
+ if (input.end_timestamp !== void 0 && createdAt > input.end_timestamp.getTime()) {
190
+ continue;
191
+ }
182
192
  records.push(stored.record);
183
193
  }
184
194
  records.sort((a, b) => {
@@ -458,11 +468,17 @@ var InMemorySessionStore = class {
458
468
  let oldestId = chain[0];
459
469
  while (oldestId && oldestId !== anchor.turn_id) {
460
470
  const oldest = this.turns.get(turnKey({ session_id: sessionId, turn_id: oldestId }));
461
- if (!oldest) break;
471
+ if (!oldest) {
472
+ break;
473
+ }
462
474
  const older = oldest.ancestor_ids.filter((id) => !seen.has(id));
463
- if (older.length === 0) break;
475
+ if (older.length === 0) {
476
+ break;
477
+ }
464
478
  chain.unshift(...older);
465
- for (const id of older) seen.add(id);
479
+ for (const id of older) {
480
+ seen.add(id);
481
+ }
466
482
  oldestId = older[0];
467
483
  }
468
484
  return chain;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/agent-session/store/InMemorySessionStore.ts"],"sourcesContent":["import type { AgentThreadSnapshot } from '../../core/runtime/AgentThread.types';\nimport { getEmptyCurrentContextUsage } from '../../core/runtime/contextUsage';\nimport type { SessionRecord } from '../models/SessionRecord';\nimport type { TurnRecord, TurnSnapshot } from '../models/TurnRecord';\nimport type { PersistedTurnEvent, SessionEventItem } from '../schemas/events';\nimport type { TokenPagination } from '../schemas/pagination';\nimport { CancellationReason, type TerminalTurnState } from '../schemas/turn';\nimport { assertCreateTurnThreadDelta } from './assertCreateTurnThreadDelta';\nimport type {\n AddThreadsInput,\n AppendToEventsInput,\n AppendToThreadContextInput,\n CreateSessionInput,\n CreateTurnInput,\n DeleteSessionInput,\n FreezeAndGetTurnInput,\n GetSessionInput,\n GetTurnInput,\n ISessionStore,\n ListSessionEventsInput,\n ListSessionsInput,\n ListTurnEventsInput,\n ListTurnsInput,\n NewThreadInit,\n OverwriteThreadContextInput,\n PatchMCPServersInput,\n PatchSandboxInfoInput,\n PatchThreadCapabilityStateInput,\n RemoveThreadsInput,\n TurnContextAppend,\n TurnRecordWithoutSnapshot,\n UpdateSessionInput,\n UpdateTurnStateInput,\n} from './ISessionStore';\nimport { decodeOffsetPageToken, encodeOffsetPageToken } from './OffsetPageToken';\nimport {\n decodeSessionEventPageToken,\n paginateSessionEventRows,\n type SessionEventPageCursor,\n} from './SessionEventPageToken';\nimport { decodeSessionListPageToken, paginateSessionListRows } from './SessionListPageToken';\nimport {\n PreviousTurnRunningError,\n SessionAlreadyExistsError,\n SessionNotFoundError,\n SessionStoreInvariantError,\n TurnAlreadyExistsError,\n TurnNotFoundError,\n TurnNotRunningError,\n} from './SessionStoreErrors';\n\n/* eslint-disable @typescript-eslint/require-await -- in-memory store is synchronous; methods stay async so thrown SessionStore*Error reject as Promises for ISessionStore callers */\n\ntype StoredEvent = PersistedTurnEvent;\n\ninterface StoredSession<TSessionCustom extends object> {\n record: SessionRecord<TSessionCustom>;\n turnIds: string[];\n}\n\nfunction deepCopy<T>(value: T): T {\n return structuredClone(value);\n}\n\nfunction sessionKey(sessionId: string): string {\n return sessionId;\n}\n\nfunction turnKey({ session_id, turn_id }: { session_id: string; turn_id: string }): string {\n return `${session_id}:${turn_id}`;\n}\n\n/** Lexicographic session_id order — shared by listSessions sort and keyset filter. */\nfunction compareSessionId(a: string, b: string): number {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n}\n\nfunction newThreadSnapshot(thread: NewThreadInit): AgentThreadSnapshot {\n return {\n thread_id: thread.thread_id,\n parent: thread.parent ?? null,\n agent_info: thread.agent_info ?? null,\n capability_state: null,\n context: [],\n current_context_usage: getEmptyCurrentContextUsage(),\n completion: null,\n };\n}\n\nfunction applyContextAppends(threads: Record<string, AgentThreadSnapshot>, appends: TurnContextAppend[]): void {\n for (const append of appends) {\n const thread = threads[append.thread_id];\n if (!thread) {\n throw new SessionStoreInvariantError(`new_context_appends references unknown thread ${append.thread_id}`);\n }\n thread.context.push(...deepCopy(append.context));\n if (append.current_context_usage !== null) {\n thread.current_context_usage = deepCopy(append.current_context_usage);\n }\n }\n}\n\nfunction buildSnapshotFromDelta(input: {\n previousSnapshot: TurnSnapshot | undefined;\n new_threads: NewThreadInit[];\n new_context_appends: TurnContextAppend[];\n capability_states: CreateTurnInput['capability_states'];\n}): TurnSnapshot {\n const threads: Record<string, AgentThreadSnapshot> = input.previousSnapshot\n ? deepCopy(input.previousSnapshot.threads)\n : {};\n\n assertCreateTurnThreadDelta({\n previousThreadIds: new Set(Object.keys(threads)),\n new_threads: input.new_threads,\n new_context_appends: input.new_context_appends,\n capability_states: input.capability_states,\n });\n\n for (const nt of input.new_threads) {\n threads[nt.thread_id] = newThreadSnapshot(nt);\n }\n\n applyContextAppends(threads, input.new_context_appends);\n for (const capability of input.capability_states) {\n const thread = threads[capability.thread_id];\n if (thread === undefined) {\n throw new SessionStoreInvariantError(`capability_states references unknown thread ${capability.thread_id}`);\n }\n thread.capability_state = deepCopy(capability.capability_state);\n }\n\n return {\n threads,\n mcp_servers: input.previousSnapshot ? deepCopy(input.previousSnapshot.mcp_servers) : null,\n sandbox_info: input.previousSnapshot ? deepCopy(input.previousSnapshot.sandbox_info) : null,\n };\n}\n\nfunction paginate<T>(items: T[], limit: number, pageToken?: string): { data: T[]; pagination: TokenPagination } {\n const offset = decodeOffsetPageToken(pageToken);\n const slice = items.slice(offset, offset + limit);\n return {\n data: slice,\n pagination: {\n limit,\n ...(offset + limit < items.length ? { next_page_token: encodeOffsetPageToken(offset + limit) } : {}),\n ...(offset > 0 ? { previous_page_token: encodeOffsetPageToken(Math.max(0, offset - limit)) } : {}),\n },\n };\n}\n\n/**\n * Reference ISessionStore implementation. Proves the contract without SSE/subscription\n * hooks. Deep-copies on read/write boundaries so callers cannot mutate stored state.\n */\nexport class InMemorySessionStore<\n TSessionCustom extends object = Record<string, never>,\n TTurnCustom extends object = Record<string, never>,\n> implements ISessionStore<TSessionCustom, TTurnCustom> {\n private readonly sessions = new Map<string, StoredSession<TSessionCustom>>();\n private readonly turns = new Map<string, TurnRecord<TTurnCustom>>();\n private readonly events = new Map<string, StoredEvent[]>();\n\n async createSession(input: CreateSessionInput<TSessionCustom>): Promise<void> {\n const key = sessionKey(input.session_id);\n if (this.sessions.has(key)) {\n throw new SessionAlreadyExistsError(input.session_id);\n }\n const now = new Date();\n const record: SessionRecord<TSessionCustom> = {\n tenant_id: input.tenant_id,\n session_id: input.session_id,\n created_by: input.created_by,\n agent: deepCopy(input.agent),\n title: null,\n last_turn_id: null,\n created_at: now,\n updated_at: now,\n last_activity_timestamp_ms: Date.now(),\n custom: input.custom !== null ? deepCopy(input.custom) : null,\n };\n this.sessions.set(key, { record, turnIds: [] });\n return;\n }\n\n async deleteSession(input: DeleteSessionInput): Promise<void> {\n const sKey = sessionKey(input.session_id);\n const stored = this.sessions.get(sKey);\n if (stored?.record.tenant_id !== input.tenant_id) {\n return;\n }\n for (const turnId of stored.turnIds) {\n const tKey = turnKey({ session_id: input.session_id, turn_id: turnId });\n this.turns.delete(tKey);\n this.events.delete(tKey);\n }\n this.sessions.delete(sKey);\n }\n\n async getSession(input: GetSessionInput): Promise<SessionRecord<TSessionCustom> | undefined> {\n const stored = this.sessions.get(sessionKey(input.session_id));\n return stored?.record.tenant_id === input.tenant_id ? deepCopy(stored.record) : undefined;\n }\n\n async updateSession(input: UpdateSessionInput<TSessionCustom>): Promise<void> {\n const key = sessionKey(input.session_id);\n const stored = this.sessions.get(key);\n if (stored?.record.tenant_id !== input.tenant_id) {\n throw new SessionNotFoundError(input.session_id);\n }\n if (input.agent !== undefined) {\n if (stored.record.agent.type === 'reference') {\n throw new SessionStoreInvariantError(`Session ${input.session_id} is named; agent cannot be updated`);\n }\n stored.record.agent = deepCopy(input.agent);\n }\n if (input.title !== undefined) {\n stored.record.title = input.title;\n }\n const now = Date.now();\n stored.record.updated_at = new Date(now);\n stored.record.last_activity_timestamp_ms = now;\n return;\n }\n\n async listSessions(\n input: ListSessionsInput,\n ): Promise<{ data: SessionRecord<TSessionCustom>[]; pagination: TokenPagination }> {\n const records: SessionRecord<TSessionCustom>[] = [];\n for (const stored of this.sessions.values()) {\n if (stored.record.tenant_id !== input.tenant_id) continue;\n if (\n input.agent_id !== undefined &&\n (stored.record.agent.type !== 'reference' || stored.record.agent.id !== input.agent_id)\n ) {\n continue;\n }\n if (input.created_by !== undefined && stored.record.created_by !== input.created_by) {\n continue;\n }\n const createdAt = stored.record.created_at.getTime();\n if (input.start_timestamp !== undefined && createdAt < input.start_timestamp.getTime()) continue;\n if (input.end_timestamp !== undefined && createdAt > input.end_timestamp.getTime()) continue;\n records.push(stored.record);\n }\n records.sort((a, b) => {\n const aTime = a.updated_at.getTime();\n const bTime = b.updated_at.getTime();\n if (aTime !== bTime) {\n return input.order === 'asc' ? aTime - bTime : bTime - aTime;\n }\n // Same lexicographic order as the keyset predicate below (and Postgres/SQLite).\n return input.order === 'asc'\n ? compareSessionId(a.session_id, b.session_id)\n : compareSessionId(b.session_id, a.session_id);\n });\n\n let filtered = records;\n const cursor = decodeSessionListPageToken(input.page_token);\n if (cursor) {\n const cursorTime = new Date(cursor.updated_at).getTime();\n filtered = records.filter(record => {\n const t = record.updated_at.getTime();\n const idCmp = compareSessionId(record.session_id, cursor.session_id);\n if (input.order === 'asc') {\n return t > cursorTime || (t === cursorTime && idCmp > 0);\n }\n return t < cursorTime || (t === cursorTime && idCmp < 0);\n });\n }\n\n const page = paginateSessionListRows(filtered, input.limit, row => row.updated_at.toISOString());\n return { data: deepCopy(page.data), pagination: page.pagination };\n }\n\n async createTurn(input: CreateTurnInput<TTurnCustom>): Promise<void> {\n // Atomicity is free here: this body is fully synchronous, so Node's\n // run-to-completion guarantees it. Real backends must still use their own\n // locking/transactions to satisfy the ISessionStore createTurn contract.\n const sKey = sessionKey(input.turn.session_id);\n const stored = this.sessions.get(sKey);\n if (!stored) {\n throw new SessionNotFoundError(input.turn.session_id);\n }\n\n const previousTurnId = input.turn.previous_turn_id;\n let previousSnapshot: TurnSnapshot | undefined;\n if (previousTurnId !== null) {\n const prevKey = turnKey({ session_id: input.turn.session_id, turn_id: previousTurnId });\n const prev = this.turns.get(prevKey);\n // Unknown previous_turn_id is allowed (relaxed): treat as no inheritance.\n // A still-running previous must be frozen first.\n if (prev !== undefined) {\n if (prev.state.status === 'running') {\n throw new PreviousTurnRunningError(previousTurnId);\n }\n previousSnapshot = prev.snapshot;\n }\n }\n\n const tKey = turnKey(input.turn);\n if (this.turns.has(tKey)) {\n throw new TurnAlreadyExistsError(input.turn.turn_id);\n }\n\n const snapshot = buildSnapshotFromDelta({\n previousSnapshot,\n new_threads: input.new_threads,\n new_context_appends: input.new_context_appends,\n capability_states: input.capability_states,\n });\n\n const turnRecord: TurnRecord<TTurnCustom> = {\n ...deepCopy(input.turn),\n snapshot,\n };\n\n this.turns.set(tKey, turnRecord);\n this.events.set(tKey, []);\n stored.turnIds.push(input.turn.turn_id);\n stored.record.last_turn_id = input.turn.turn_id;\n stored.record.last_activity_timestamp_ms = Date.now();\n stored.record.updated_at = new Date();\n if (input.update_session_title_if_not_exist !== null && stored.record.title === null) {\n stored.record.title = input.update_session_title_if_not_exist;\n }\n }\n\n async freezeAndGetTurn(input: FreezeAndGetTurnInput): Promise<TurnRecord<TTurnCustom>> {\n const tKey = turnKey(input);\n const turn = this.requireTurn(input.session_id, input.turn_id);\n\n if (turn.state.status === 'running') {\n const cancelledState: TerminalTurnState = {\n status: 'cancelled',\n reason: CancellationReason.CancelledForNextTurn,\n completed_at: new Date().toISOString(),\n };\n turn.state = cancelledState;\n turn.updated_at = new Date();\n const list = this.events.get(tKey);\n if (list) {\n list.push(deepCopy(input.turn_done_event));\n }\n }\n\n return deepCopy(turn);\n }\n\n async getTurn(input: GetTurnInput): Promise<TurnRecord<TTurnCustom> | undefined> {\n const turn = this.turns.get(turnKey(input));\n return turn ? deepCopy(turn) : undefined;\n }\n\n async listTurns(\n input: ListTurnsInput,\n ): Promise<{ data: TurnRecordWithoutSnapshot<TTurnCustom>[]; pagination: TokenPagination }> {\n const stored = this.sessions.get(sessionKey(input.session_id));\n if (!stored) {\n throw new SessionNotFoundError(input.session_id);\n }\n const records = stored.turnIds.map(id => {\n const turn = this.turns.get(turnKey({ session_id: input.session_id, turn_id: id }));\n if (!turn) {\n throw new TurnNotFoundError(id);\n }\n const { snapshot, ...row } = deepCopy(turn);\n void snapshot;\n return row;\n });\n return paginate(records, input.limit, input.page_token);\n }\n\n async updateTurnState(input: UpdateTurnStateInput): Promise<void> {\n // Same as createTurn: synchronous body ⇒ atomic under run-to-completion.\n const tKey = turnKey(input);\n const turn = this.requireTurn(input.session_id, input.turn_id);\n if (turn.state.status !== 'running') {\n throw new TurnNotRunningError(input.turn_id, turn.state);\n }\n turn.state = deepCopy(input.state);\n turn.updated_at = new Date();\n const list = this.events.get(tKey);\n if (list) {\n list.push(deepCopy(input.turn_done_event));\n }\n }\n\n async appendToEvents(input: AppendToEventsInput): Promise<void> {\n this.requireRunningTurn(input.session_id, input.turn_id);\n const tKey = turnKey(input);\n const list = this.events.get(tKey);\n if (!list) {\n throw new TurnNotFoundError(input.turn_id);\n }\n list.push(...deepCopy(input.events));\n return;\n }\n\n private requireTurn(sessionId: string, turnId: string): TurnRecord<TTurnCustom> {\n const turn = this.turns.get(turnKey({ session_id: sessionId, turn_id: turnId }));\n if (!turn) {\n throw new TurnNotFoundError(turnId);\n }\n return turn;\n }\n\n private requireRunningTurn(sessionId: string, turnId: string): TurnRecord<TTurnCustom> {\n const turn = this.requireTurn(sessionId, turnId);\n if (turn.state.status !== 'running') {\n throw new TurnNotRunningError(turnId, turn.state);\n }\n return turn;\n }\n\n async addThreads(input: AddThreadsInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n for (const thread of input.threads) {\n turn.snapshot.threads[thread.thread_id] = deepCopy(thread);\n }\n turn.updated_at = new Date();\n return;\n }\n\n async removeThreads(input: RemoveThreadsInput): Promise<void> {\n if (input.thread_ids.length === 0) {\n return;\n }\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n for (const id of input.thread_ids) {\n Reflect.deleteProperty(turn.snapshot.threads, id);\n }\n turn.updated_at = new Date();\n return;\n }\n\n async appendToThreadContext(input: AppendToThreadContextInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n const thread = turn.snapshot.threads[input.thread_id];\n if (!thread) {\n throw new SessionStoreInvariantError(`Thread not found: ${input.thread_id}`);\n }\n thread.context.push(...deepCopy(input.context));\n if (input.current_context_usage !== null) {\n thread.current_context_usage = deepCopy(input.current_context_usage);\n }\n if (input.completion !== null) {\n thread.completion = deepCopy(input.completion);\n }\n turn.updated_at = new Date();\n return;\n }\n\n async overwriteThreadContext(input: OverwriteThreadContextInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n const threadId = input.event.thread_id;\n const thread = turn.snapshot.threads[threadId];\n if (!thread) {\n throw new SessionStoreInvariantError(`Thread not found: ${threadId}`);\n }\n thread.context = deepCopy(input.event.context);\n thread.current_context_usage = deepCopy(input.event.current_context_usage);\n turn.updated_at = new Date();\n return;\n }\n\n async patchMCPServers(input: PatchMCPServersInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n turn.snapshot.mcp_servers ??= {};\n for (const server of input.mcp_servers) {\n turn.snapshot.mcp_servers[server.id] = deepCopy(server);\n }\n turn.updated_at = new Date();\n return;\n }\n\n async patchSandboxInfo(input: PatchSandboxInfoInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n turn.snapshot.sandbox_info = deepCopy(input.sandbox_info);\n turn.updated_at = new Date();\n return;\n }\n\n async patchThreadCapabilityState(input: PatchThreadCapabilityStateInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n const thread = turn.snapshot.threads[input.thread_id];\n if (!thread) {\n throw new SessionStoreInvariantError(`Thread not found: ${input.thread_id}`);\n }\n thread.capability_state ??= {};\n if (input.state === null) {\n Reflect.deleteProperty(thread.capability_state, input.key);\n if (Object.keys(thread.capability_state).length === 0) {\n thread.capability_state = null;\n }\n } else {\n thread.capability_state[input.key] = deepCopy(input.state);\n }\n turn.updated_at = new Date();\n return;\n }\n\n async listTurnEvents(input: ListTurnEventsInput): Promise<{\n data: PersistedTurnEvent[];\n pagination: TokenPagination;\n }> {\n this.requireTurn(input.session_id, input.turn_id);\n const list = this.events.get(turnKey(input));\n if (!list) {\n throw new TurnNotFoundError(input.turn_id);\n }\n const ordered = [...list].sort((a, b) =>\n input.order === 'desc' ? b.id.localeCompare(a.id) : a.id.localeCompare(b.id),\n );\n const page = paginate(ordered, input.limit, input.page_token);\n return { data: deepCopy(page.data), pagination: page.pagination };\n }\n\n async listSessionEvents(input: ListSessionEventsInput): Promise<{\n data: SessionEventItem[];\n pagination: TokenPagination;\n }> {\n const stored = this.sessions.get(sessionKey(input.session_id));\n if (!stored) {\n throw new SessionNotFoundError(input.session_id);\n }\n\n const decodedCursor = input.page_token === undefined ? undefined : decodeSessionEventPageToken(input.page_token);\n const lastTurnId = decodedCursor?.last_turn_id ?? input.last_turn_id ?? stored.record.last_turn_id;\n if (lastTurnId === null) {\n return { data: [], pagination: { limit: input.limit } };\n }\n const cursor: SessionEventPageCursor = {\n last_turn_id: lastTurnId,\n offset: decodedCursor?.offset ?? 0,\n };\n\n const anchor = this.turns.get(turnKey({ session_id: input.session_id, turn_id: cursor.last_turn_id }));\n if (!anchor) {\n throw new TurnNotFoundError(cursor.last_turn_id);\n }\n const turnIds = this.resolveAncestorChain(input.session_id, anchor);\n const flattened: SessionEventItem[] = [];\n for (const turnId of [...turnIds].reverse()) {\n const evts = this.events.get(turnKey({ session_id: input.session_id, turn_id: turnId })) ?? [];\n for (const event of [...evts].sort((a, b) => b.id.localeCompare(a.id))) {\n flattened.push({ turn_id: turnId, event });\n }\n }\n const page = paginateSessionEventRows(\n flattened.slice(cursor.offset, cursor.offset + input.limit + 1),\n input.limit,\n cursor,\n );\n return { data: deepCopy(page.data), pagination: page.pagination };\n }\n\n /**\n * Full chain (oldest first, anchor last). `ancestor_ids` may be only the\n * previous N ancestors, so spill through the oldest ancestor's own window\n * until a root or gap. A missing turn or repeated id ends the walk.\n */\n private resolveAncestorChain(sessionId: string, anchor: TurnRecord<TTurnCustom>): string[] {\n const chain = [...anchor.ancestor_ids, anchor.turn_id];\n const seen = new Set(chain);\n let oldestId = chain[0];\n while (oldestId && oldestId !== anchor.turn_id) {\n const oldest = this.turns.get(turnKey({ session_id: sessionId, turn_id: oldestId }));\n if (!oldest) break;\n const older = oldest.ancestor_ids.filter(id => !seen.has(id));\n if (older.length === 0) break;\n chain.unshift(...older);\n for (const id of older) seen.add(id);\n oldestId = older[0];\n }\n return chain;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/agent-session/store/InMemorySessionStore.ts"],"sourcesContent":["import type { AgentThreadSnapshot } from '../../core/runtime/AgentThread.types';\nimport { getEmptyCurrentContextUsage } from '../../core/runtime/contextUsage';\nimport type { SessionRecord } from '../models/SessionRecord';\nimport type { TurnRecord, TurnSnapshot } from '../models/TurnRecord';\nimport type { PersistedTurnEvent, SessionEventItem } from '../schemas/events';\nimport type { TokenPagination } from '../schemas/pagination';\nimport { CancellationReason, type TerminalTurnState } from '../schemas/turn';\nimport { assertCreateTurnThreadDelta } from './assertCreateTurnThreadDelta';\nimport type {\n AddThreadsInput,\n AppendToEventsInput,\n AppendToThreadContextInput,\n CreateSessionInput,\n CreateTurnInput,\n DeleteSessionInput,\n FreezeAndGetTurnInput,\n GetSessionInput,\n GetTurnInput,\n ISessionStore,\n ListSessionEventsInput,\n ListSessionsInput,\n ListTurnEventsInput,\n ListTurnsInput,\n NewThreadInit,\n OverwriteThreadContextInput,\n PatchMCPServersInput,\n PatchSandboxInfoInput,\n PatchThreadCapabilityStateInput,\n RemoveThreadsInput,\n TurnContextAppend,\n TurnRecordWithoutSnapshot,\n UpdateSessionInput,\n UpdateTurnStateInput,\n} from './ISessionStore';\nimport { decodeOffsetPageToken, encodeOffsetPageToken } from './OffsetPageToken';\nimport {\n decodeSessionEventPageToken,\n paginateSessionEventRows,\n type SessionEventPageCursor,\n} from './SessionEventPageToken';\nimport { decodeSessionListPageToken, paginateSessionListRows } from './SessionListPageToken';\nimport {\n PreviousTurnRunningError,\n SessionAlreadyExistsError,\n SessionNotFoundError,\n SessionStoreInvariantError,\n TurnAlreadyExistsError,\n TurnNotFoundError,\n TurnNotRunningError,\n} from './SessionStoreErrors';\n\n/* eslint-disable @typescript-eslint/require-await -- in-memory store is synchronous; methods stay async so thrown SessionStore*Error reject as Promises for ISessionStore callers */\n\ntype StoredEvent = PersistedTurnEvent;\n\ninterface StoredSession<TSessionCustom extends object> {\n record: SessionRecord<TSessionCustom>;\n turnIds: string[];\n}\n\nfunction deepCopy<T>(value: T): T {\n return structuredClone(value);\n}\n\nfunction sessionKey(sessionId: string): string {\n return sessionId;\n}\n\nfunction turnKey({ session_id, turn_id }: { session_id: string; turn_id: string }): string {\n return `${session_id}:${turn_id}`;\n}\n\n/** Lexicographic session_id order — shared by listSessions sort and keyset filter. */\nfunction compareSessionId(a: string, b: string): number {\n if (a < b) {\n return -1;\n }\n if (a > b) {\n return 1;\n }\n return 0;\n}\n\nfunction newThreadSnapshot(thread: NewThreadInit): AgentThreadSnapshot {\n return {\n thread_id: thread.thread_id,\n parent: thread.parent ?? null,\n agent_info: thread.agent_info ?? null,\n capability_state: null,\n context: [],\n current_context_usage: getEmptyCurrentContextUsage(),\n completion: null,\n };\n}\n\nfunction applyContextAppends(threads: Record<string, AgentThreadSnapshot>, appends: TurnContextAppend[]): void {\n for (const append of appends) {\n const thread = threads[append.thread_id];\n if (!thread) {\n throw new SessionStoreInvariantError(`new_context_appends references unknown thread ${append.thread_id}`);\n }\n thread.context.push(...deepCopy(append.context));\n if (append.current_context_usage !== null) {\n thread.current_context_usage = deepCopy(append.current_context_usage);\n }\n }\n}\n\nfunction buildSnapshotFromDelta(input: {\n previousSnapshot: TurnSnapshot | undefined;\n new_threads: NewThreadInit[];\n new_context_appends: TurnContextAppend[];\n capability_states: CreateTurnInput['capability_states'];\n}): TurnSnapshot {\n const threads: Record<string, AgentThreadSnapshot> = input.previousSnapshot\n ? deepCopy(input.previousSnapshot.threads)\n : {};\n\n assertCreateTurnThreadDelta({\n previousThreadIds: new Set(Object.keys(threads)),\n new_threads: input.new_threads,\n new_context_appends: input.new_context_appends,\n capability_states: input.capability_states,\n });\n\n for (const nt of input.new_threads) {\n threads[nt.thread_id] = newThreadSnapshot(nt);\n }\n\n applyContextAppends(threads, input.new_context_appends);\n for (const capability of input.capability_states) {\n const thread = threads[capability.thread_id];\n if (thread === undefined) {\n throw new SessionStoreInvariantError(`capability_states references unknown thread ${capability.thread_id}`);\n }\n thread.capability_state = deepCopy(capability.capability_state);\n }\n\n return {\n threads,\n mcp_servers: input.previousSnapshot ? deepCopy(input.previousSnapshot.mcp_servers) : null,\n sandbox_info: input.previousSnapshot ? deepCopy(input.previousSnapshot.sandbox_info) : null,\n };\n}\n\nfunction paginate<T>(items: T[], limit: number, pageToken?: string): { data: T[]; pagination: TokenPagination } {\n const offset = decodeOffsetPageToken(pageToken);\n const slice = items.slice(offset, offset + limit);\n return {\n data: slice,\n pagination: {\n limit,\n ...(offset + limit < items.length ? { next_page_token: encodeOffsetPageToken(offset + limit) } : {}),\n ...(offset > 0 ? { previous_page_token: encodeOffsetPageToken(Math.max(0, offset - limit)) } : {}),\n },\n };\n}\n\n/**\n * Reference ISessionStore implementation. Proves the contract without SSE/subscription\n * hooks. Deep-copies on read/write boundaries so callers cannot mutate stored state.\n */\nexport class InMemorySessionStore<\n TSessionCustom extends object = Record<string, never>,\n TTurnCustom extends object = Record<string, never>,\n> implements ISessionStore<TSessionCustom, TTurnCustom> {\n private readonly sessions = new Map<string, StoredSession<TSessionCustom>>();\n private readonly turns = new Map<string, TurnRecord<TTurnCustom>>();\n private readonly events = new Map<string, StoredEvent[]>();\n\n async createSession(input: CreateSessionInput<TSessionCustom>): Promise<void> {\n const key = sessionKey(input.session_id);\n if (this.sessions.has(key)) {\n throw new SessionAlreadyExistsError(input.session_id);\n }\n const now = new Date();\n const record: SessionRecord<TSessionCustom> = {\n tenant_id: input.tenant_id,\n session_id: input.session_id,\n created_by: input.created_by,\n agent: deepCopy(input.agent),\n title: null,\n last_turn_id: null,\n created_at: now,\n updated_at: now,\n last_activity_timestamp_ms: Date.now(),\n custom: input.custom !== null ? deepCopy(input.custom) : null,\n };\n this.sessions.set(key, { record, turnIds: [] });\n return;\n }\n\n async deleteSession(input: DeleteSessionInput): Promise<void> {\n const sKey = sessionKey(input.session_id);\n const stored = this.sessions.get(sKey);\n if (stored?.record.tenant_id !== input.tenant_id) {\n return;\n }\n for (const turnId of stored.turnIds) {\n const tKey = turnKey({ session_id: input.session_id, turn_id: turnId });\n this.turns.delete(tKey);\n this.events.delete(tKey);\n }\n this.sessions.delete(sKey);\n }\n\n async getSession(input: GetSessionInput): Promise<SessionRecord<TSessionCustom> | undefined> {\n const stored = this.sessions.get(sessionKey(input.session_id));\n return stored?.record.tenant_id === input.tenant_id ? deepCopy(stored.record) : undefined;\n }\n\n async updateSession(input: UpdateSessionInput<TSessionCustom>): Promise<void> {\n const key = sessionKey(input.session_id);\n const stored = this.sessions.get(key);\n if (stored?.record.tenant_id !== input.tenant_id) {\n throw new SessionNotFoundError(input.session_id);\n }\n if (input.agent !== undefined) {\n if (stored.record.agent.type === 'reference') {\n throw new SessionStoreInvariantError(`Session ${input.session_id} is named; agent cannot be updated`);\n }\n stored.record.agent = deepCopy(input.agent);\n }\n if (input.title !== undefined) {\n stored.record.title = input.title;\n }\n const now = Date.now();\n stored.record.updated_at = new Date(now);\n stored.record.last_activity_timestamp_ms = now;\n return;\n }\n\n async listSessions(\n input: ListSessionsInput,\n ): Promise<{ data: SessionRecord<TSessionCustom>[]; pagination: TokenPagination }> {\n const records: SessionRecord<TSessionCustom>[] = [];\n for (const stored of this.sessions.values()) {\n if (stored.record.tenant_id !== input.tenant_id) {\n continue;\n }\n if (\n input.agent_id !== undefined &&\n (stored.record.agent.type !== 'reference' || stored.record.agent.id !== input.agent_id)\n ) {\n continue;\n }\n if (input.created_by !== undefined && stored.record.created_by !== input.created_by) {\n continue;\n }\n const createdAt = stored.record.created_at.getTime();\n if (input.start_timestamp !== undefined && createdAt < input.start_timestamp.getTime()) {\n continue;\n }\n if (input.end_timestamp !== undefined && createdAt > input.end_timestamp.getTime()) {\n continue;\n }\n records.push(stored.record);\n }\n records.sort((a, b) => {\n const aTime = a.updated_at.getTime();\n const bTime = b.updated_at.getTime();\n if (aTime !== bTime) {\n return input.order === 'asc' ? aTime - bTime : bTime - aTime;\n }\n // Same lexicographic order as the keyset predicate below (and Postgres/SQLite).\n return input.order === 'asc'\n ? compareSessionId(a.session_id, b.session_id)\n : compareSessionId(b.session_id, a.session_id);\n });\n\n let filtered = records;\n const cursor = decodeSessionListPageToken(input.page_token);\n if (cursor) {\n const cursorTime = new Date(cursor.updated_at).getTime();\n filtered = records.filter(record => {\n const t = record.updated_at.getTime();\n const idCmp = compareSessionId(record.session_id, cursor.session_id);\n if (input.order === 'asc') {\n return t > cursorTime || (t === cursorTime && idCmp > 0);\n }\n return t < cursorTime || (t === cursorTime && idCmp < 0);\n });\n }\n\n const page = paginateSessionListRows(filtered, input.limit, row => row.updated_at.toISOString());\n return { data: deepCopy(page.data), pagination: page.pagination };\n }\n\n async createTurn(input: CreateTurnInput<TTurnCustom>): Promise<void> {\n // Atomicity is free here: this body is fully synchronous, so Node's\n // run-to-completion guarantees it. Real backends must still use their own\n // locking/transactions to satisfy the ISessionStore createTurn contract.\n const sKey = sessionKey(input.turn.session_id);\n const stored = this.sessions.get(sKey);\n if (!stored) {\n throw new SessionNotFoundError(input.turn.session_id);\n }\n\n const previousTurnId = input.turn.previous_turn_id;\n let previousSnapshot: TurnSnapshot | undefined;\n if (previousTurnId !== null) {\n const prevKey = turnKey({ session_id: input.turn.session_id, turn_id: previousTurnId });\n const prev = this.turns.get(prevKey);\n // Unknown previous_turn_id is allowed (relaxed): treat as no inheritance.\n // A still-running previous must be frozen first.\n if (prev !== undefined) {\n if (prev.state.status === 'running') {\n throw new PreviousTurnRunningError(previousTurnId);\n }\n previousSnapshot = prev.snapshot;\n }\n }\n\n const tKey = turnKey(input.turn);\n if (this.turns.has(tKey)) {\n throw new TurnAlreadyExistsError(input.turn.turn_id);\n }\n\n const snapshot = buildSnapshotFromDelta({\n previousSnapshot,\n new_threads: input.new_threads,\n new_context_appends: input.new_context_appends,\n capability_states: input.capability_states,\n });\n\n const turnRecord: TurnRecord<TTurnCustom> = {\n ...deepCopy(input.turn),\n snapshot,\n };\n\n this.turns.set(tKey, turnRecord);\n this.events.set(tKey, []);\n stored.turnIds.push(input.turn.turn_id);\n stored.record.last_turn_id = input.turn.turn_id;\n stored.record.last_activity_timestamp_ms = Date.now();\n stored.record.updated_at = new Date();\n if (input.update_session_title_if_not_exist !== null && stored.record.title === null) {\n stored.record.title = input.update_session_title_if_not_exist;\n }\n }\n\n async freezeAndGetTurn(input: FreezeAndGetTurnInput): Promise<TurnRecord<TTurnCustom>> {\n const tKey = turnKey(input);\n const turn = this.requireTurn(input.session_id, input.turn_id);\n\n if (turn.state.status === 'running') {\n const cancelledState: TerminalTurnState = {\n status: 'cancelled',\n reason: CancellationReason.CancelledForNextTurn,\n completed_at: new Date().toISOString(),\n };\n turn.state = cancelledState;\n turn.updated_at = new Date();\n const list = this.events.get(tKey);\n if (list) {\n list.push(deepCopy(input.turn_done_event));\n }\n }\n\n return deepCopy(turn);\n }\n\n async getTurn(input: GetTurnInput): Promise<TurnRecord<TTurnCustom> | undefined> {\n const turn = this.turns.get(turnKey(input));\n return turn ? deepCopy(turn) : undefined;\n }\n\n async listTurns(\n input: ListTurnsInput,\n ): Promise<{ data: TurnRecordWithoutSnapshot<TTurnCustom>[]; pagination: TokenPagination }> {\n const stored = this.sessions.get(sessionKey(input.session_id));\n if (!stored) {\n throw new SessionNotFoundError(input.session_id);\n }\n const records = stored.turnIds.map(id => {\n const turn = this.turns.get(turnKey({ session_id: input.session_id, turn_id: id }));\n if (!turn) {\n throw new TurnNotFoundError(id);\n }\n const { snapshot, ...row } = deepCopy(turn);\n void snapshot;\n return row;\n });\n return paginate(records, input.limit, input.page_token);\n }\n\n async updateTurnState(input: UpdateTurnStateInput): Promise<void> {\n // Same as createTurn: synchronous body ⇒ atomic under run-to-completion.\n const tKey = turnKey(input);\n const turn = this.requireTurn(input.session_id, input.turn_id);\n if (turn.state.status !== 'running') {\n throw new TurnNotRunningError(input.turn_id, turn.state);\n }\n turn.state = deepCopy(input.state);\n turn.updated_at = new Date();\n const list = this.events.get(tKey);\n if (list) {\n list.push(deepCopy(input.turn_done_event));\n }\n }\n\n async appendToEvents(input: AppendToEventsInput): Promise<void> {\n this.requireRunningTurn(input.session_id, input.turn_id);\n const tKey = turnKey(input);\n const list = this.events.get(tKey);\n if (!list) {\n throw new TurnNotFoundError(input.turn_id);\n }\n list.push(...deepCopy(input.events));\n return;\n }\n\n private requireTurn(sessionId: string, turnId: string): TurnRecord<TTurnCustom> {\n const turn = this.turns.get(turnKey({ session_id: sessionId, turn_id: turnId }));\n if (!turn) {\n throw new TurnNotFoundError(turnId);\n }\n return turn;\n }\n\n private requireRunningTurn(sessionId: string, turnId: string): TurnRecord<TTurnCustom> {\n const turn = this.requireTurn(sessionId, turnId);\n if (turn.state.status !== 'running') {\n throw new TurnNotRunningError(turnId, turn.state);\n }\n return turn;\n }\n\n async addThreads(input: AddThreadsInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n for (const thread of input.threads) {\n turn.snapshot.threads[thread.thread_id] = deepCopy(thread);\n }\n turn.updated_at = new Date();\n return;\n }\n\n async removeThreads(input: RemoveThreadsInput): Promise<void> {\n if (input.thread_ids.length === 0) {\n return;\n }\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n for (const id of input.thread_ids) {\n Reflect.deleteProperty(turn.snapshot.threads, id);\n }\n turn.updated_at = new Date();\n return;\n }\n\n async appendToThreadContext(input: AppendToThreadContextInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n const thread = turn.snapshot.threads[input.thread_id];\n if (!thread) {\n throw new SessionStoreInvariantError(`Thread not found: ${input.thread_id}`);\n }\n thread.context.push(...deepCopy(input.context));\n if (input.current_context_usage !== null) {\n thread.current_context_usage = deepCopy(input.current_context_usage);\n }\n if (input.completion !== null) {\n thread.completion = deepCopy(input.completion);\n }\n turn.updated_at = new Date();\n return;\n }\n\n async overwriteThreadContext(input: OverwriteThreadContextInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n const threadId = input.event.thread_id;\n const thread = turn.snapshot.threads[threadId];\n if (!thread) {\n throw new SessionStoreInvariantError(`Thread not found: ${threadId}`);\n }\n thread.context = deepCopy(input.event.context);\n thread.current_context_usage = deepCopy(input.event.current_context_usage);\n turn.updated_at = new Date();\n return;\n }\n\n async patchMCPServers(input: PatchMCPServersInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n turn.snapshot.mcp_servers ??= {};\n for (const server of input.mcp_servers) {\n turn.snapshot.mcp_servers[server.id] = deepCopy(server);\n }\n turn.updated_at = new Date();\n return;\n }\n\n async patchSandboxInfo(input: PatchSandboxInfoInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n turn.snapshot.sandbox_info = deepCopy(input.sandbox_info);\n turn.updated_at = new Date();\n return;\n }\n\n async patchThreadCapabilityState(input: PatchThreadCapabilityStateInput): Promise<void> {\n const turn = this.requireRunningTurn(input.session_id, input.turn_id);\n const thread = turn.snapshot.threads[input.thread_id];\n if (!thread) {\n throw new SessionStoreInvariantError(`Thread not found: ${input.thread_id}`);\n }\n thread.capability_state ??= {};\n if (input.state === null) {\n Reflect.deleteProperty(thread.capability_state, input.key);\n if (Object.keys(thread.capability_state).length === 0) {\n thread.capability_state = null;\n }\n } else {\n thread.capability_state[input.key] = deepCopy(input.state);\n }\n turn.updated_at = new Date();\n return;\n }\n\n async listTurnEvents(input: ListTurnEventsInput): Promise<{\n data: PersistedTurnEvent[];\n pagination: TokenPagination;\n }> {\n this.requireTurn(input.session_id, input.turn_id);\n const list = this.events.get(turnKey(input));\n if (!list) {\n throw new TurnNotFoundError(input.turn_id);\n }\n const ordered = [...list].sort((a, b) =>\n input.order === 'desc' ? b.id.localeCompare(a.id) : a.id.localeCompare(b.id),\n );\n const page = paginate(ordered, input.limit, input.page_token);\n return { data: deepCopy(page.data), pagination: page.pagination };\n }\n\n async listSessionEvents(input: ListSessionEventsInput): Promise<{\n data: SessionEventItem[];\n pagination: TokenPagination;\n }> {\n const stored = this.sessions.get(sessionKey(input.session_id));\n if (!stored) {\n throw new SessionNotFoundError(input.session_id);\n }\n\n const decodedCursor = input.page_token === undefined ? undefined : decodeSessionEventPageToken(input.page_token);\n const lastTurnId = decodedCursor?.last_turn_id ?? input.last_turn_id ?? stored.record.last_turn_id;\n if (lastTurnId === null) {\n return { data: [], pagination: { limit: input.limit } };\n }\n const cursor: SessionEventPageCursor = {\n last_turn_id: lastTurnId,\n offset: decodedCursor?.offset ?? 0,\n };\n\n const anchor = this.turns.get(turnKey({ session_id: input.session_id, turn_id: cursor.last_turn_id }));\n if (!anchor) {\n throw new TurnNotFoundError(cursor.last_turn_id);\n }\n const turnIds = this.resolveAncestorChain(input.session_id, anchor);\n const flattened: SessionEventItem[] = [];\n for (const turnId of [...turnIds].reverse()) {\n const evts = this.events.get(turnKey({ session_id: input.session_id, turn_id: turnId })) ?? [];\n for (const event of [...evts].sort((a, b) => b.id.localeCompare(a.id))) {\n flattened.push({ turn_id: turnId, event });\n }\n }\n const page = paginateSessionEventRows(\n flattened.slice(cursor.offset, cursor.offset + input.limit + 1),\n input.limit,\n cursor,\n );\n return { data: deepCopy(page.data), pagination: page.pagination };\n }\n\n /**\n * Full chain (oldest first, anchor last). `ancestor_ids` may be only the\n * previous N ancestors, so spill through the oldest ancestor's own window\n * until a root or gap. A missing turn or repeated id ends the walk.\n */\n private resolveAncestorChain(sessionId: string, anchor: TurnRecord<TTurnCustom>): string[] {\n const chain = [...anchor.ancestor_ids, anchor.turn_id];\n const seen = new Set(chain);\n let oldestId = chain[0];\n while (oldestId && oldestId !== anchor.turn_id) {\n const oldest = this.turns.get(turnKey({ session_id: sessionId, turn_id: oldestId }));\n if (!oldest) {\n break;\n }\n const older = oldest.ancestor_ids.filter(id => !seen.has(id));\n if (older.length === 0) {\n break;\n }\n chain.unshift(...older);\n for (const id of older) {\n seen.add(id);\n }\n oldestId = older[0];\n }\n return chain;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,0BAA4C;AAK5C,kBAA2D;AAC3D,yCAA4C;AA2B5C,6BAA6D;AAC7D,mCAIO;AACP,kCAAoE;AACpE,gCAQO;AAWP,SAAS,SAAY,OAAa;AAChC,SAAO,gBAAgB,KAAK;AAC9B;AAEA,SAAS,WAAW,WAA2B;AAC7C,SAAO;AACT;AAEA,SAAS,QAAQ,EAAE,YAAY,QAAQ,GAAoD;AACzF,SAAO,GAAG,UAAU,IAAI,OAAO;AACjC;AAGA,SAAS,iBAAiB,GAAW,GAAmB;AACtD,MAAI,IAAI,GAAG;AACT,WAAO;AAAA,EACT;AACA,MAAI,IAAI,GAAG;AACT,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAA4C;AACrE,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,QAAQ,OAAO,UAAU;AAAA,IACzB,YAAY,OAAO,cAAc;AAAA,IACjC,kBAAkB;AAAA,IAClB,SAAS,CAAC;AAAA,IACV,2BAAuB,iDAA4B;AAAA,IACnD,YAAY;AAAA,EACd;AACF;AAEA,SAAS,oBAAoB,SAA8C,SAAoC;AAC7G,aAAW,UAAU,SAAS;AAC5B,UAAM,SAAS,QAAQ,OAAO,SAAS;AACvC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,qDAA2B,iDAAiD,OAAO,SAAS,EAAE;AAAA,IAC1G;AACA,WAAO,QAAQ,KAAK,GAAG,SAAS,OAAO,OAAO,CAAC;AAC/C,QAAI,OAAO,0BAA0B,MAAM;AACzC,aAAO,wBAAwB,SAAS,OAAO,qBAAqB;AAAA,IACtE;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,OAKf;AACf,QAAM,UAA+C,MAAM,mBACvD,SAAS,MAAM,iBAAiB,OAAO,IACvC,CAAC;AAEL,sEAA4B;AAAA,IAC1B,mBAAmB,IAAI,IAAI,OAAO,KAAK,OAAO,CAAC;AAAA,IAC/C,aAAa,MAAM;AAAA,IACnB,qBAAqB,MAAM;AAAA,IAC3B,mBAAmB,MAAM;AAAA,EAC3B,CAAC;AAED,aAAW,MAAM,MAAM,aAAa;AAClC,YAAQ,GAAG,SAAS,IAAI,kBAAkB,EAAE;AAAA,EAC9C;AAEA,sBAAoB,SAAS,MAAM,mBAAmB;AACtD,aAAW,cAAc,MAAM,mBAAmB;AAChD,UAAM,SAAS,QAAQ,WAAW,SAAS;AAC3C,QAAI,WAAW,QAAW;AACxB,YAAM,IAAI,qDAA2B,+CAA+C,WAAW,SAAS,EAAE;AAAA,IAC5G;AACA,WAAO,mBAAmB,SAAS,WAAW,gBAAgB;AAAA,EAChE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa,MAAM,mBAAmB,SAAS,MAAM,iBAAiB,WAAW,IAAI;AAAA,IACrF,cAAc,MAAM,mBAAmB,SAAS,MAAM,iBAAiB,YAAY,IAAI;AAAA,EACzF;AACF;AAEA,SAAS,SAAY,OAAY,OAAe,WAAgE;AAC9G,QAAM,aAAS,8CAAsB,SAAS;AAC9C,QAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,KAAK;AAChD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY;AAAA,MACV;AAAA,MACA,GAAI,SAAS,QAAQ,MAAM,SAAS,EAAE,qBAAiB,8CAAsB,SAAS,KAAK,EAAE,IAAI,CAAC;AAAA,MAClG,GAAI,SAAS,IAAI,EAAE,yBAAqB,8CAAsB,KAAK,IAAI,GAAG,SAAS,KAAK,CAAC,EAAE,IAAI,CAAC;AAAA,IAClG;AAAA,EACF;AACF;AAMO,IAAM,uBAAN,MAGiD;AAAA,EACrC,WAAW,oBAAI,IAA2C;AAAA,EAC1D,QAAQ,oBAAI,IAAqC;AAAA,EACjD,SAAS,oBAAI,IAA2B;AAAA,EAEzD,MAAM,cAAc,OAA0D;AAC5E,UAAM,MAAM,WAAW,MAAM,UAAU;AACvC,QAAI,KAAK,SAAS,IAAI,GAAG,GAAG;AAC1B,YAAM,IAAI,oDAA0B,MAAM,UAAU;AAAA,IACtD;AACA,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,SAAwC;AAAA,MAC5C,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,MAClB,OAAO,SAAS,MAAM,KAAK;AAAA,MAC3B,OAAO;AAAA,MACP,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,4BAA4B,KAAK,IAAI;AAAA,MACrC,QAAQ,MAAM,WAAW,OAAO,SAAS,MAAM,MAAM,IAAI;AAAA,IAC3D;AACA,SAAK,SAAS,IAAI,KAAK,EAAE,QAAQ,SAAS,CAAC,EAAE,CAAC;AAC9C;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,OAA0C;AAC5D,UAAM,OAAO,WAAW,MAAM,UAAU;AACxC,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI;AACrC,QAAI,QAAQ,OAAO,cAAc,MAAM,WAAW;AAChD;AAAA,IACF;AACA,eAAW,UAAU,OAAO,SAAS;AACnC,YAAM,OAAO,QAAQ,EAAE,YAAY,MAAM,YAAY,SAAS,OAAO,CAAC;AACtE,WAAK,MAAM,OAAO,IAAI;AACtB,WAAK,OAAO,OAAO,IAAI;AAAA,IACzB;AACA,SAAK,SAAS,OAAO,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,WAAW,OAA4E;AAC3F,UAAM,SAAS,KAAK,SAAS,IAAI,WAAW,MAAM,UAAU,CAAC;AAC7D,WAAO,QAAQ,OAAO,cAAc,MAAM,YAAY,SAAS,OAAO,MAAM,IAAI;AAAA,EAClF;AAAA,EAEA,MAAM,cAAc,OAA0D;AAC5E,UAAM,MAAM,WAAW,MAAM,UAAU;AACvC,UAAM,SAAS,KAAK,SAAS,IAAI,GAAG;AACpC,QAAI,QAAQ,OAAO,cAAc,MAAM,WAAW;AAChD,YAAM,IAAI,+CAAqB,MAAM,UAAU;AAAA,IACjD;AACA,QAAI,MAAM,UAAU,QAAW;AAC7B,UAAI,OAAO,OAAO,MAAM,SAAS,aAAa;AAC5C,cAAM,IAAI,qDAA2B,WAAW,MAAM,UAAU,oCAAoC;AAAA,MACtG;AACA,aAAO,OAAO,QAAQ,SAAS,MAAM,KAAK;AAAA,IAC5C;AACA,QAAI,MAAM,UAAU,QAAW;AAC7B,aAAO,OAAO,QAAQ,MAAM;AAAA,IAC9B;AACA,UAAM,MAAM,KAAK,IAAI;AACrB,WAAO,OAAO,aAAa,IAAI,KAAK,GAAG;AACvC,WAAO,OAAO,6BAA6B;AAC3C;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,OACiF;AACjF,UAAM,UAA2C,CAAC;AAClD,eAAW,UAAU,KAAK,SAAS,OAAO,GAAG;AAC3C,UAAI,OAAO,OAAO,cAAc,MAAM,WAAW;AAC/C;AAAA,MACF;AACA,UACE,MAAM,aAAa,WAClB,OAAO,OAAO,MAAM,SAAS,eAAe,OAAO,OAAO,MAAM,OAAO,MAAM,WAC9E;AACA;AAAA,MACF;AACA,UAAI,MAAM,eAAe,UAAa,OAAO,OAAO,eAAe,MAAM,YAAY;AACnF;AAAA,MACF;AACA,YAAM,YAAY,OAAO,OAAO,WAAW,QAAQ;AACnD,UAAI,MAAM,oBAAoB,UAAa,YAAY,MAAM,gBAAgB,QAAQ,GAAG;AACtF;AAAA,MACF;AACA,UAAI,MAAM,kBAAkB,UAAa,YAAY,MAAM,cAAc,QAAQ,GAAG;AAClF;AAAA,MACF;AACA,cAAQ,KAAK,OAAO,MAAM;AAAA,IAC5B;AACA,YAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,YAAM,QAAQ,EAAE,WAAW,QAAQ;AACnC,YAAM,QAAQ,EAAE,WAAW,QAAQ;AACnC,UAAI,UAAU,OAAO;AACnB,eAAO,MAAM,UAAU,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,MACzD;AAEA,aAAO,MAAM,UAAU,QACnB,iBAAiB,EAAE,YAAY,EAAE,UAAU,IAC3C,iBAAiB,EAAE,YAAY,EAAE,UAAU;AAAA,IACjD,CAAC;AAED,QAAI,WAAW;AACf,UAAM,aAAS,wDAA2B,MAAM,UAAU;AAC1D,QAAI,QAAQ;AACV,YAAM,aAAa,IAAI,KAAK,OAAO,UAAU,EAAE,QAAQ;AACvD,iBAAW,QAAQ,OAAO,YAAU;AAClC,cAAM,IAAI,OAAO,WAAW,QAAQ;AACpC,cAAM,QAAQ,iBAAiB,OAAO,YAAY,OAAO,UAAU;AACnE,YAAI,MAAM,UAAU,OAAO;AACzB,iBAAO,IAAI,cAAe,MAAM,cAAc,QAAQ;AAAA,QACxD;AACA,eAAO,IAAI,cAAe,MAAM,cAAc,QAAQ;AAAA,MACxD,CAAC;AAAA,IACH;AAEA,UAAM,WAAO,qDAAwB,UAAU,MAAM,OAAO,SAAO,IAAI,WAAW,YAAY,CAAC;AAC/F,WAAO,EAAE,MAAM,SAAS,KAAK,IAAI,GAAG,YAAY,KAAK,WAAW;AAAA,EAClE;AAAA,EAEA,MAAM,WAAW,OAAoD;AAInE,UAAM,OAAO,WAAW,MAAM,KAAK,UAAU;AAC7C,UAAM,SAAS,KAAK,SAAS,IAAI,IAAI;AACrC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,+CAAqB,MAAM,KAAK,UAAU;AAAA,IACtD;AAEA,UAAM,iBAAiB,MAAM,KAAK;AAClC,QAAI;AACJ,QAAI,mBAAmB,MAAM;AAC3B,YAAM,UAAU,QAAQ,EAAE,YAAY,MAAM,KAAK,YAAY,SAAS,eAAe,CAAC;AACtF,YAAM,OAAO,KAAK,MAAM,IAAI,OAAO;AAGnC,UAAI,SAAS,QAAW;AACtB,YAAI,KAAK,MAAM,WAAW,WAAW;AACnC,gBAAM,IAAI,mDAAyB,cAAc;AAAA,QACnD;AACA,2BAAmB,KAAK;AAAA,MAC1B;AAAA,IACF;AAEA,UAAM,OAAO,QAAQ,MAAM,IAAI;AAC/B,QAAI,KAAK,MAAM,IAAI,IAAI,GAAG;AACxB,YAAM,IAAI,iDAAuB,MAAM,KAAK,OAAO;AAAA,IACrD;AAEA,UAAM,WAAW,uBAAuB;AAAA,MACtC;AAAA,MACA,aAAa,MAAM;AAAA,MACnB,qBAAqB,MAAM;AAAA,MAC3B,mBAAmB,MAAM;AAAA,IAC3B,CAAC;AAED,UAAM,aAAsC;AAAA,MAC1C,GAAG,SAAS,MAAM,IAAI;AAAA,MACtB;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,MAAM,UAAU;AAC/B,SAAK,OAAO,IAAI,MAAM,CAAC,CAAC;AACxB,WAAO,QAAQ,KAAK,MAAM,KAAK,OAAO;AACtC,WAAO,OAAO,eAAe,MAAM,KAAK;AACxC,WAAO,OAAO,6BAA6B,KAAK,IAAI;AACpD,WAAO,OAAO,aAAa,oBAAI,KAAK;AACpC,QAAI,MAAM,sCAAsC,QAAQ,OAAO,OAAO,UAAU,MAAM;AACpF,aAAO,OAAO,QAAQ,MAAM;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,OAAgE;AACrF,UAAM,OAAO,QAAQ,KAAK;AAC1B,UAAM,OAAO,KAAK,YAAY,MAAM,YAAY,MAAM,OAAO;AAE7D,QAAI,KAAK,MAAM,WAAW,WAAW;AACnC,YAAM,iBAAoC;AAAA,QACxC,QAAQ;AAAA,QACR,QAAQ,+BAAmB;AAAA,QAC3B,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,MACvC;AACA,WAAK,QAAQ;AACb,WAAK,aAAa,oBAAI,KAAK;AAC3B,YAAM,OAAO,KAAK,OAAO,IAAI,IAAI;AACjC,UAAI,MAAM;AACR,aAAK,KAAK,SAAS,MAAM,eAAe,CAAC;AAAA,MAC3C;AAAA,IACF;AAEA,WAAO,SAAS,IAAI;AAAA,EACtB;AAAA,EAEA,MAAM,QAAQ,OAAmE;AAC/E,UAAM,OAAO,KAAK,MAAM,IAAI,QAAQ,KAAK,CAAC;AAC1C,WAAO,OAAO,SAAS,IAAI,IAAI;AAAA,EACjC;AAAA,EAEA,MAAM,UACJ,OAC0F;AAC1F,UAAM,SAAS,KAAK,SAAS,IAAI,WAAW,MAAM,UAAU,CAAC;AAC7D,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,+CAAqB,MAAM,UAAU;AAAA,IACjD;AACA,UAAM,UAAU,OAAO,QAAQ,IAAI,QAAM;AACvC,YAAM,OAAO,KAAK,MAAM,IAAI,QAAQ,EAAE,YAAY,MAAM,YAAY,SAAS,GAAG,CAAC,CAAC;AAClF,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,4CAAkB,EAAE;AAAA,MAChC;AACA,YAAM,EAAE,UAAU,GAAG,IAAI,IAAI,SAAS,IAAI;AAC1C,WAAK;AACL,aAAO;AAAA,IACT,CAAC;AACD,WAAO,SAAS,SAAS,MAAM,OAAO,MAAM,UAAU;AAAA,EACxD;AAAA,EAEA,MAAM,gBAAgB,OAA4C;AAEhE,UAAM,OAAO,QAAQ,KAAK;AAC1B,UAAM,OAAO,KAAK,YAAY,MAAM,YAAY,MAAM,OAAO;AAC7D,QAAI,KAAK,MAAM,WAAW,WAAW;AACnC,YAAM,IAAI,8CAAoB,MAAM,SAAS,KAAK,KAAK;AAAA,IACzD;AACA,SAAK,QAAQ,SAAS,MAAM,KAAK;AACjC,SAAK,aAAa,oBAAI,KAAK;AAC3B,UAAM,OAAO,KAAK,OAAO,IAAI,IAAI;AACjC,QAAI,MAAM;AACR,WAAK,KAAK,SAAS,MAAM,eAAe,CAAC;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,OAA2C;AAC9D,SAAK,mBAAmB,MAAM,YAAY,MAAM,OAAO;AACvD,UAAM,OAAO,QAAQ,KAAK;AAC1B,UAAM,OAAO,KAAK,OAAO,IAAI,IAAI;AACjC,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,4CAAkB,MAAM,OAAO;AAAA,IAC3C;AACA,SAAK,KAAK,GAAG,SAAS,MAAM,MAAM,CAAC;AACnC;AAAA,EACF;AAAA,EAEQ,YAAY,WAAmB,QAAyC;AAC9E,UAAM,OAAO,KAAK,MAAM,IAAI,QAAQ,EAAE,YAAY,WAAW,SAAS,OAAO,CAAC,CAAC;AAC/E,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,4CAAkB,MAAM;AAAA,IACpC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,WAAmB,QAAyC;AACrF,UAAM,OAAO,KAAK,YAAY,WAAW,MAAM;AAC/C,QAAI,KAAK,MAAM,WAAW,WAAW;AACnC,YAAM,IAAI,8CAAoB,QAAQ,KAAK,KAAK;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,OAAuC;AACtD,UAAM,OAAO,KAAK,mBAAmB,MAAM,YAAY,MAAM,OAAO;AACpE,eAAW,UAAU,MAAM,SAAS;AAClC,WAAK,SAAS,QAAQ,OAAO,SAAS,IAAI,SAAS,MAAM;AAAA,IAC3D;AACA,SAAK,aAAa,oBAAI,KAAK;AAC3B;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,OAA0C;AAC5D,QAAI,MAAM,WAAW,WAAW,GAAG;AACjC;AAAA,IACF;AACA,UAAM,OAAO,KAAK,mBAAmB,MAAM,YAAY,MAAM,OAAO;AACpE,eAAW,MAAM,MAAM,YAAY;AACjC,cAAQ,eAAe,KAAK,SAAS,SAAS,EAAE;AAAA,IAClD;AACA,SAAK,aAAa,oBAAI,KAAK;AAC3B;AAAA,EACF;AAAA,EAEA,MAAM,sBAAsB,OAAkD;AAC5E,UAAM,OAAO,KAAK,mBAAmB,MAAM,YAAY,MAAM,OAAO;AACpE,UAAM,SAAS,KAAK,SAAS,QAAQ,MAAM,SAAS;AACpD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,qDAA2B,qBAAqB,MAAM,SAAS,EAAE;AAAA,IAC7E;AACA,WAAO,QAAQ,KAAK,GAAG,SAAS,MAAM,OAAO,CAAC;AAC9C,QAAI,MAAM,0BAA0B,MAAM;AACxC,aAAO,wBAAwB,SAAS,MAAM,qBAAqB;AAAA,IACrE;AACA,QAAI,MAAM,eAAe,MAAM;AAC7B,aAAO,aAAa,SAAS,MAAM,UAAU;AAAA,IAC/C;AACA,SAAK,aAAa,oBAAI,KAAK;AAC3B;AAAA,EACF;AAAA,EAEA,MAAM,uBAAuB,OAAmD;AAC9E,UAAM,OAAO,KAAK,mBAAmB,MAAM,YAAY,MAAM,OAAO;AACpE,UAAM,WAAW,MAAM,MAAM;AAC7B,UAAM,SAAS,KAAK,SAAS,QAAQ,QAAQ;AAC7C,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,qDAA2B,qBAAqB,QAAQ,EAAE;AAAA,IACtE;AACA,WAAO,UAAU,SAAS,MAAM,MAAM,OAAO;AAC7C,WAAO,wBAAwB,SAAS,MAAM,MAAM,qBAAqB;AACzE,SAAK,aAAa,oBAAI,KAAK;AAC3B;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,OAA4C;AAChE,UAAM,OAAO,KAAK,mBAAmB,MAAM,YAAY,MAAM,OAAO;AACpE,SAAK,SAAS,gBAAgB,CAAC;AAC/B,eAAW,UAAU,MAAM,aAAa;AACtC,WAAK,SAAS,YAAY,OAAO,EAAE,IAAI,SAAS,MAAM;AAAA,IACxD;AACA,SAAK,aAAa,oBAAI,KAAK;AAC3B;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,OAA6C;AAClE,UAAM,OAAO,KAAK,mBAAmB,MAAM,YAAY,MAAM,OAAO;AACpE,SAAK,SAAS,eAAe,SAAS,MAAM,YAAY;AACxD,SAAK,aAAa,oBAAI,KAAK;AAC3B;AAAA,EACF;AAAA,EAEA,MAAM,2BAA2B,OAAuD;AACtF,UAAM,OAAO,KAAK,mBAAmB,MAAM,YAAY,MAAM,OAAO;AACpE,UAAM,SAAS,KAAK,SAAS,QAAQ,MAAM,SAAS;AACpD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,qDAA2B,qBAAqB,MAAM,SAAS,EAAE;AAAA,IAC7E;AACA,WAAO,qBAAqB,CAAC;AAC7B,QAAI,MAAM,UAAU,MAAM;AACxB,cAAQ,eAAe,OAAO,kBAAkB,MAAM,GAAG;AACzD,UAAI,OAAO,KAAK,OAAO,gBAAgB,EAAE,WAAW,GAAG;AACrD,eAAO,mBAAmB;AAAA,MAC5B;AAAA,IACF,OAAO;AACL,aAAO,iBAAiB,MAAM,GAAG,IAAI,SAAS,MAAM,KAAK;AAAA,IAC3D;AACA,SAAK,aAAa,oBAAI,KAAK;AAC3B;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,OAGlB;AACD,SAAK,YAAY,MAAM,YAAY,MAAM,OAAO;AAChD,UAAM,OAAO,KAAK,OAAO,IAAI,QAAQ,KAAK,CAAC;AAC3C,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,4CAAkB,MAAM,OAAO;AAAA,IAC3C;AACA,UAAM,UAAU,CAAC,GAAG,IAAI,EAAE;AAAA,MAAK,CAAC,GAAG,MACjC,MAAM,UAAU,SAAS,EAAE,GAAG,cAAc,EAAE,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,EAAE;AAAA,IAC7E;AACA,UAAM,OAAO,SAAS,SAAS,MAAM,OAAO,MAAM,UAAU;AAC5D,WAAO,EAAE,MAAM,SAAS,KAAK,IAAI,GAAG,YAAY,KAAK,WAAW;AAAA,EAClE;AAAA,EAEA,MAAM,kBAAkB,OAGrB;AACD,UAAM,SAAS,KAAK,SAAS,IAAI,WAAW,MAAM,UAAU,CAAC;AAC7D,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,+CAAqB,MAAM,UAAU;AAAA,IACjD;AAEA,UAAM,gBAAgB,MAAM,eAAe,SAAY,aAAY,0DAA4B,MAAM,UAAU;AAC/G,UAAM,aAAa,eAAe,gBAAgB,MAAM,gBAAgB,OAAO,OAAO;AACtF,QAAI,eAAe,MAAM;AACvB,aAAO,EAAE,MAAM,CAAC,GAAG,YAAY,EAAE,OAAO,MAAM,MAAM,EAAE;AAAA,IACxD;AACA,UAAM,SAAiC;AAAA,MACrC,cAAc;AAAA,MACd,QAAQ,eAAe,UAAU;AAAA,IACnC;AAEA,UAAM,SAAS,KAAK,MAAM,IAAI,QAAQ,EAAE,YAAY,MAAM,YAAY,SAAS,OAAO,aAAa,CAAC,CAAC;AACrG,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,4CAAkB,OAAO,YAAY;AAAA,IACjD;AACA,UAAM,UAAU,KAAK,qBAAqB,MAAM,YAAY,MAAM;AAClE,UAAM,YAAgC,CAAC;AACvC,eAAW,UAAU,CAAC,GAAG,OAAO,EAAE,QAAQ,GAAG;AAC3C,YAAM,OAAO,KAAK,OAAO,IAAI,QAAQ,EAAE,YAAY,MAAM,YAAY,SAAS,OAAO,CAAC,CAAC,KAAK,CAAC;AAC7F,iBAAW,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,GAAG;AACtE,kBAAU,KAAK,EAAE,SAAS,QAAQ,MAAM,CAAC;AAAA,MAC3C;AAAA,IACF;AACA,UAAM,WAAO;AAAA,MACX,UAAU,MAAM,OAAO,QAAQ,OAAO,SAAS,MAAM,QAAQ,CAAC;AAAA,MAC9D,MAAM;AAAA,MACN;AAAA,IACF;AACA,WAAO,EAAE,MAAM,SAAS,KAAK,IAAI,GAAG,YAAY,KAAK,WAAW;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,qBAAqB,WAAmB,QAA2C;AACzF,UAAM,QAAQ,CAAC,GAAG,OAAO,cAAc,OAAO,OAAO;AACrD,UAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,QAAI,WAAW,MAAM,CAAC;AACtB,WAAO,YAAY,aAAa,OAAO,SAAS;AAC9C,YAAM,SAAS,KAAK,MAAM,IAAI,QAAQ,EAAE,YAAY,WAAW,SAAS,SAAS,CAAC,CAAC;AACnF,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,YAAM,QAAQ,OAAO,aAAa,OAAO,QAAM,CAAC,KAAK,IAAI,EAAE,CAAC;AAC5D,UAAI,MAAM,WAAW,GAAG;AACtB;AAAA,MACF;AACA,YAAM,QAAQ,GAAG,KAAK;AACtB,iBAAW,MAAM,OAAO;AACtB,aAAK,IAAI,EAAE;AAAA,MACb;AACA,iBAAW,MAAM,CAAC;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AACF;","names":[]}