@truefoundry/trueforge-core 0.2.0-rc.2 → 0.2.0-rc.4

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 (97) hide show
  1. package/dist/agent-session/TurnResourceResolver.d.ts +13 -10
  2. package/dist/agent-session/TurnResourceResolver.d.ts.map +1 -1
  3. package/dist/agent-session/TurnResourceResolver.js +15 -1
  4. package/dist/agent-session/TurnResourceResolver.js.map +1 -1
  5. package/dist/agent-session/TurnResourceResolver.mjs +15 -1
  6. package/dist/agent-session/TurnResourceResolver.mjs.map +1 -1
  7. package/dist/agent-session/index.d.ts +1 -1
  8. package/dist/agent-session/index.d.ts.map +1 -1
  9. package/dist/agent-session/index.js.map +1 -1
  10. package/dist/agent-session/index.mjs.map +1 -1
  11. package/dist/agent-session/schemas/agentSpec.d.ts +4 -2
  12. package/dist/agent-session/schemas/agentSpec.d.ts.map +1 -1
  13. package/dist/agent-session/schemas/agentSpec.js +5 -3
  14. package/dist/agent-session/schemas/agentSpec.js.map +1 -1
  15. package/dist/agent-session/schemas/agentSpec.mjs +5 -3
  16. package/dist/agent-session/schemas/agentSpec.mjs.map +1 -1
  17. package/dist/agent-session/schemas/session.d.ts +3 -0
  18. package/dist/agent-session/schemas/session.d.ts.map +1 -1
  19. package/dist/agent-session/store/ISessionStore.d.ts +10 -0
  20. package/dist/agent-session/store/ISessionStore.d.ts.map +1 -1
  21. package/dist/agent-session/store/ISessionStore.js.map +1 -1
  22. package/dist/agent-session/store/InMemorySessionStore.d.ts +2 -1
  23. package/dist/agent-session/store/InMemorySessionStore.d.ts.map +1 -1
  24. package/dist/agent-session/store/InMemorySessionStore.js +13 -0
  25. package/dist/agent-session/store/InMemorySessionStore.js.map +1 -1
  26. package/dist/agent-session/store/InMemorySessionStore.mjs +13 -0
  27. package/dist/agent-session/store/InMemorySessionStore.mjs.map +1 -1
  28. package/dist/core/index.d.ts +2 -1
  29. package/dist/core/index.d.ts.map +1 -1
  30. package/dist/core/index.js +5 -0
  31. package/dist/core/index.js.map +1 -1
  32. package/dist/core/index.mjs +3 -0
  33. package/dist/core/index.mjs.map +1 -1
  34. package/dist/core/llm/VercelAILLM.d.ts.map +1 -1
  35. package/dist/core/llm/VercelAILLM.js +4 -0
  36. package/dist/core/llm/VercelAILLM.js.map +1 -1
  37. package/dist/core/llm/VercelAILLM.mjs +4 -0
  38. package/dist/core/llm/VercelAILLM.mjs.map +1 -1
  39. package/dist/core/redisKeys.d.ts +7 -0
  40. package/dist/core/redisKeys.d.ts.map +1 -0
  41. package/dist/core/redisKeys.js +36 -0
  42. package/dist/core/redisKeys.js.map +1 -0
  43. package/dist/core/redisKeys.mjs +10 -0
  44. package/dist/core/redisKeys.mjs.map +1 -0
  45. package/dist/core/sandbox/Sandbox.d.ts.map +1 -1
  46. package/dist/core/sandbox/Sandbox.js +8 -1
  47. package/dist/core/sandbox/Sandbox.js.map +1 -1
  48. package/dist/core/sandbox/Sandbox.mjs +8 -1
  49. package/dist/core/sandbox/Sandbox.mjs.map +1 -1
  50. package/dist/core/sandbox/provider/DaytonaProvider.d.ts +1 -1
  51. package/dist/core/sandbox/provider/DaytonaProvider.d.ts.map +1 -1
  52. package/dist/core/sandbox/provider/DaytonaProvider.js +3 -3
  53. package/dist/core/sandbox/provider/DaytonaProvider.js.map +1 -1
  54. package/dist/core/sandbox/provider/DaytonaProvider.mjs +3 -3
  55. package/dist/core/sandbox/provider/DaytonaProvider.mjs.map +1 -1
  56. package/dist/core/sandbox/provider/Provider.d.ts +20 -4
  57. package/dist/core/sandbox/provider/Provider.d.ts.map +1 -1
  58. package/dist/core/sandbox/provider/Provider.js.map +1 -1
  59. package/dist/core/sandbox/provider/Provider.mjs.map +1 -1
  60. package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts +2 -2
  61. package/dist/core/sandbox/provider/TFYSandboxProvider.d.ts.map +1 -1
  62. package/dist/core/sandbox/provider/TFYSandboxProvider.js +7 -6
  63. package/dist/core/sandbox/provider/TFYSandboxProvider.js.map +1 -1
  64. package/dist/core/sandbox/provider/TFYSandboxProvider.mjs +7 -6
  65. package/dist/core/sandbox/provider/TFYSandboxProvider.mjs.map +1 -1
  66. package/dist/core/sandbox/sandboxScripts.gen.d.ts +1 -1
  67. package/dist/core/sandbox/sandboxScripts.gen.d.ts.map +1 -1
  68. package/dist/core/sandbox/sandboxScripts.gen.js +1 -1
  69. package/dist/core/sandbox/sandboxScripts.gen.js.map +1 -1
  70. package/dist/core/sandbox/sandboxScripts.gen.mjs +1 -1
  71. package/dist/core/sandbox/sandboxScripts.gen.mjs.map +1 -1
  72. package/dist/core/sandbox/skills/ISkillMounter.d.ts +1 -1
  73. package/dist/core/sandbox/skills/ISkillMounter.d.ts.map +1 -1
  74. package/dist/core/sandbox/skills/ISkillMounter.js.map +1 -1
  75. package/dist/core/sandbox/skills/SkillMounter.d.ts +20 -2
  76. package/dist/core/sandbox/skills/SkillMounter.d.ts.map +1 -1
  77. package/dist/core/sandbox/skills/SkillMounter.js +59 -23
  78. package/dist/core/sandbox/skills/SkillMounter.js.map +1 -1
  79. package/dist/core/sandbox/skills/SkillMounter.mjs +58 -23
  80. package/dist/core/sandbox/skills/SkillMounter.mjs.map +1 -1
  81. package/dist/core/sandbox/skills/index.d.ts +1 -1
  82. package/dist/core/sandbox/skills/index.d.ts.map +1 -1
  83. package/dist/core/sandbox/skills/index.js.map +1 -1
  84. package/dist/core/sandbox/skills/index.mjs.map +1 -1
  85. package/dist/request-reply/executor.d.ts +1 -1
  86. package/dist/request-reply/executor.d.ts.map +1 -1
  87. package/dist/request-reply/executor.js +1 -1
  88. package/dist/request-reply/executor.js.map +1 -1
  89. package/dist/request-reply/executor.mjs +1 -1
  90. package/dist/request-reply/executor.mjs.map +1 -1
  91. package/dist/request-reply/utils.d.ts +0 -1
  92. package/dist/request-reply/utils.d.ts.map +1 -1
  93. package/dist/request-reply/utils.js +4 -6
  94. package/dist/request-reply/utils.js.map +1 -1
  95. package/dist/request-reply/utils.mjs +4 -5
  96. package/dist/request-reply/utils.mjs.map +1 -1
  97. package/package.json +1 -1
@@ -26,15 +26,16 @@ export type TurnSandboxFactory = (input: {
26
26
  * behavior; subclass and override to customize (tool sources, sandbox,
27
27
  * tracing).
28
28
  */
29
+ interface ResolvedModel {
30
+ modelClient: ILLM;
31
+ defaultModelParams: ModelParams;
32
+ modelProperties?: AgentDefinition['modelProperties'];
33
+ }
29
34
  export declare class TurnResourceResolver<TTurnCustom extends object = Record<string, never>> implements ITurnResourceResolver<TTurnCustom> {
30
35
  #private;
31
36
  protected readonly deps: {
32
37
  /** Model name → client and defaults. Called once per resolved definition; may load provider config. */
33
- llm: (model: string) => Promise<{
34
- modelClient: ILLM;
35
- defaultModelParams: ModelParams;
36
- modelProperties?: AgentDefinition['modelProperties'];
37
- }>;
38
+ llm: (model: string) => Promise<ResolvedModel>;
38
39
  /**
39
40
  * MCP server name → connection details. Required to use spec.mcp_servers:
40
41
  * the AgentSpec carries names only (no url/headers on the wire) — the
@@ -59,11 +60,7 @@ export declare class TurnResourceResolver<TTurnCustom extends object = Record<st
59
60
  };
60
61
  constructor(deps: {
61
62
  /** Model name → client and defaults. Called once per resolved definition; may load provider config. */
62
- llm: (model: string) => Promise<{
63
- modelClient: ILLM;
64
- defaultModelParams: ModelParams;
65
- modelProperties?: AgentDefinition['modelProperties'];
66
- }>;
63
+ llm: (model: string) => Promise<ResolvedModel>;
67
64
  /**
68
65
  * MCP server name → connection details. Required to use spec.mcp_servers:
69
66
  * the AgentSpec carries names only (no url/headers on the wire) — the
@@ -147,5 +144,11 @@ export declare class TurnResourceResolver<TTurnCustom extends object = Record<st
147
144
  id: string;
148
145
  create: () => Promise<ToolSource>;
149
146
  }): Promise<ToolSource>;
147
+ /**
148
+ * Resolves `deps.llm` once per distinct model name for this turn — parent and
149
+ * sub-agents with the same catalog model share one promise.
150
+ */
151
+ protected getModel(modelName: string): Promise<ResolvedModel>;
150
152
  }
153
+ export {};
151
154
  //# sourceMappingURL=TurnResourceResolver.d.ts.map
@@ -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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"}
@@ -43,6 +43,7 @@ var TurnResourceResolver = class {
43
43
  }
44
44
  deps;
45
45
  #sources = /* @__PURE__ */ new Map();
46
+ #models = /* @__PURE__ */ new Map();
46
47
  #sandbox;
47
48
  get logger() {
48
49
  return this.deps.logger;
@@ -135,7 +136,7 @@ var TurnResourceResolver = class {
135
136
  })
136
137
  );
137
138
  const modelName = agentInfo?.model ?? spec.model.name;
138
- const resolvedModel = await this.deps.llm(modelName);
139
+ const resolvedModel = await this.getModel(modelName);
139
140
  return {
140
141
  definition: {
141
142
  modelClient: resolvedModel.modelClient,
@@ -172,6 +173,19 @@ var TurnResourceResolver = class {
172
173
  this.#sources.set(input.id, made);
173
174
  return made;
174
175
  }
176
+ /**
177
+ * Resolves `deps.llm` once per distinct model name for this turn — parent and
178
+ * sub-agents with the same catalog model share one promise.
179
+ */
180
+ getModel(modelName) {
181
+ const cached = this.#models.get(modelName);
182
+ if (cached) {
183
+ return cached;
184
+ }
185
+ const made = this.deps.llm(modelName);
186
+ this.#models.set(modelName, made);
187
+ return made;
188
+ }
175
189
  };
176
190
  // Annotate the CommonJS export names for ESM import in node:
177
191
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\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, ResolvedAgentDefinition } 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 modelProperties?: AgentDefinition['modelProperties'];\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 agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<ResolvedAgentDefinition> {\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 modelProperties: resolvedModel.modelProperties,\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 => ({ role: 'user' as const, content: m.content })),\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
+ {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\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, ResolvedAgentDefinition } 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 */\ninterface ResolvedModel {\n modelClient: ILLM;\n defaultModelParams: ModelParams;\n modelProperties?: AgentDefinition['modelProperties'];\n}\n\nexport class TurnResourceResolver<\n TTurnCustom extends object = Record<string, never>,\n> implements ITurnResourceResolver<TTurnCustom> {\n readonly #sources = new Map<string, Promise<ToolSource>>();\n readonly #models = new Map<string, Promise<ResolvedModel>>();\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<ResolvedModel>;\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 agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<ResolvedAgentDefinition> {\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.getModel(modelName);\n return {\n definition: {\n modelClient: resolvedModel.modelClient,\n modelProperties: resolvedModel.modelProperties,\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 => ({ role: 'user' as const, content: m.content })),\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 /**\n * Resolves `deps.llm` once per distinct model name for this turn — parent and\n * sub-agents with the same catalog model share one promise.\n */\n protected getModel(modelName: string): Promise<ResolvedModel> {\n const cached = this.#models.get(modelName);\n if (cached) {\n return cached;\n }\n const made = this.deps.llm(modelName);\n this.#models.set(modelName, made);\n return made;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,uBAAiD;AAEjD,qBAAwB;AAKxB,8BAAmC;AAkBnC,SAAS,iBAAiB,MAA0B;AAClD,SAAO,KAAK,OAAO,QAAQ;AAC7B;AAEA,SAAS,YAAY,OAKE;AACrB,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,cAAc,MAAM;AAAA,IACpB,yBAAyB,MAAM;AAAA,EACjC;AACF;AAaO,IAAM,uBAAN,MAEyC;AAAA,EAK9C,YACqB,MAsBnB;AAtBmB;AAAA,EAsBlB;AAAA,EAtBkB;AAAA,EALZ,WAAW,oBAAI,IAAiC;AAAA,EAChD,UAAU,oBAAI,IAAoC;AAAA,EAC3D;AAAA,EA2BA,IAAI,SAAiB;AACnB,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA;AAAA,EAGA,gBAA8B;AAC5B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,iBAAiB,OAAiD;AACtE,QAAI,KAAK,KAAK,UAAU,QAAW;AAGjC,YAAM,IAAI;AAAA,QACR,gBAAgB,MAAM,QAAQ;AAAA,MAChC;AAAA,IACF;AACA,WAAO,MAAM,KAAK,KAAK,MAAM,MAAM,QAAQ;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAe,OAMY;AAC/B,QAAI,CAAC,KAAK,KAAK,mBAAmB,CAAC,iBAAiB,MAAM,IAAI,GAAG;AAC/D,aAAO;AAAA,IACT;AACA,SAAK,WAAW,MAAM,KAAK,KAAK,gBAAgB;AAAA,MAC9C,MAAM,MAAM;AAAA,MACZ,mBAAmB,MAAM,UAAU;AAAA,MACnC,QAAQ,MAAM;AAAA,MACd,SAAS,MAAM;AAAA,IACjB,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,QAAuB;AAC3B,UAAM,UAAU,KAAK;AACrB,SAAK,WAAW;AAChB,UAAM,SAAS,MAAM,EAAE,MAAM,MAAM;AAAA,IAEnC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,uBAAuB,OAMQ;AACnC,UAAM,EAAE,MAAM,YAAY,WAAW,cAAc,QAAQ,QAAQ,IAAI;AACvE,UAAM,WAAW,MAAM,QAAQ;AAAA,OAC5B,KAAK,eAAe,CAAC,GAAG,IAAI,OAAM,UAAS;AAC1C,cAAM,SAAS,MAAM,KAAK,sBAAsB;AAAA,UAC9C,IAAI,MAAM;AAAA,UACV,QAAQ,YAAY;AAClB,kBAAM,EAAE,KAAK,QAAQ,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,IAAI;AACvD,mBAAO,IAAI,2BAAU;AAAA,cACnB,IAAI,MAAM;AAAA,cACV,MAAM,MAAM;AAAA,cACZ;AAAA,cACA,SAAS,WAAW,CAAC;AAAA,cACrB,WAAW,cAAc,SAAS,cAAc,MAAM,IAAI,GAAG;AAAA,cAC7D,kBAAkB,KAAK,KAAK;AAAA,cAC5B,kBAAkB,KAAK,KAAK;AAAA,cAC5B,QAAQ,KAAK,KAAK;AAAA,cAClB;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AACD,eAAO,IAAI,uBAAQ;AAAA,UACjB;AAAA,UACA,WAAW,YAAY,KAAK;AAAA,UAC5B,SAAS,MAAM;AAAA,QACjB,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAGA,UAAM,YAAY,WAAW,SAAS,KAAK,MAAM;AACjD,UAAM,gBAAgB,MAAM,KAAK,SAAS,SAAS;AACnD,WAAO;AAAA,MACL,YAAY;AAAA,QACV,aAAa,cAAc;AAAA,QAC3B,iBAAiB,cAAc;AAAA;AAAA;AAAA,QAG/B,aAAa,YAAY,SAAY,KAAK;AAAA,QAC1C,UAAU,YACN,CAAC,EAAE,MAAM,QAAiB,SAAS,UAAU,MAAM,CAAC,IACpD,KAAK,UAAU,IAAI,QAAM,EAAE,MAAM,QAAiB,SAAS,EAAE,QAAQ,EAAE;AAAA,QAC3E,aAAa;AAAA,UACX,GAAG,cAAc;AAAA,UACjB,GAAG,KAAK,MAAM;AAAA,QAChB;AAAA;AAAA,QAEA,gBAAgB,YAAY,SAAY,KAAK;AAAA,QAC7C,gBAAgB,KAAK,OAAO;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUU,sBAAsB,OAA+E;AAC7G,UAAM,SAAS,KAAK,SAAS,IAAI,MAAM,EAAE;AACzC,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,UAAM,OAAO,MAAM,OAAO;AAC1B,SAAK,SAAS,IAAI,MAAM,IAAI,IAAI;AAChC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,SAAS,WAA2C;AAC5D,UAAM,SAAS,KAAK,QAAQ,IAAI,SAAS;AACzC,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,UAAM,OAAO,KAAK,KAAK,IAAI,SAAS;AACpC,SAAK,QAAQ,IAAI,WAAW,IAAI;AAChC,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -19,6 +19,7 @@ var TurnResourceResolver = class {
19
19
  }
20
20
  deps;
21
21
  #sources = /* @__PURE__ */ new Map();
22
+ #models = /* @__PURE__ */ new Map();
22
23
  #sandbox;
23
24
  get logger() {
24
25
  return this.deps.logger;
@@ -111,7 +112,7 @@ var TurnResourceResolver = class {
111
112
  })
112
113
  );
113
114
  const modelName = agentInfo?.model ?? spec.model.name;
114
- const resolvedModel = await this.deps.llm(modelName);
115
+ const resolvedModel = await this.getModel(modelName);
115
116
  return {
116
117
  definition: {
117
118
  modelClient: resolvedModel.modelClient,
@@ -148,6 +149,19 @@ var TurnResourceResolver = class {
148
149
  this.#sources.set(input.id, made);
149
150
  return made;
150
151
  }
152
+ /**
153
+ * Resolves `deps.llm` once per distinct model name for this turn — parent and
154
+ * sub-agents with the same catalog model share one promise.
155
+ */
156
+ getModel(modelName) {
157
+ const cached = this.#models.get(modelName);
158
+ if (cached) {
159
+ return cached;
160
+ }
161
+ const made = this.deps.llm(modelName);
162
+ this.#models.set(modelName, made);
163
+ return made;
164
+ }
151
165
  };
152
166
  export {
153
167
  TurnResourceResolver
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\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, ResolvedAgentDefinition } 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 modelProperties?: AgentDefinition['modelProperties'];\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 agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<ResolvedAgentDefinition> {\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 modelProperties: resolvedModel.modelProperties,\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 => ({ role: 'user' as const, content: m.content })),\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
+ {"version":3,"sources":["../../src/agent-session/TurnResourceResolver.ts"],"sourcesContent":["import type { Logger } from 'winston';\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, ResolvedAgentDefinition } 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 */\ninterface ResolvedModel {\n modelClient: ILLM;\n defaultModelParams: ModelParams;\n modelProperties?: AgentDefinition['modelProperties'];\n}\n\nexport class TurnResourceResolver<\n TTurnCustom extends object = Record<string, never>,\n> implements ITurnResourceResolver<TTurnCustom> {\n readonly #sources = new Map<string, Promise<ToolSource>>();\n readonly #models = new Map<string, Promise<ResolvedModel>>();\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<ResolvedModel>;\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 agent_info?: AgentInfo | undefined;\n previousTurn?: TurnRecord<TTurnCustom> | undefined;\n signal: AbortSignal;\n tracing: AgentTracing;\n }): Promise<ResolvedAgentDefinition> {\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.getModel(modelName);\n return {\n definition: {\n modelClient: resolvedModel.modelClient,\n modelProperties: resolvedModel.modelProperties,\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 => ({ role: 'user' as const, content: m.content })),\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 /**\n * Resolves `deps.llm` once per distinct model name for this turn — parent and\n * sub-agents with the same catalog model share one promise.\n */\n protected getModel(modelName: string): Promise<ResolvedModel> {\n const cached = this.#models.get(modelName);\n if (cached) {\n return cached;\n }\n const made = this.deps.llm(modelName);\n this.#models.set(modelName, made);\n return made;\n }\n}\n"],"mappings":"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","names":[]}
@@ -19,7 +19,7 @@ export { MAIN_THREAD_ID } from './models/TurnRecord';
19
19
  export type { TurnRecord, TurnSnapshot } from './models/TurnRecord';
20
20
  export { assertCreateTurnThreadDelta } from './store/assertCreateTurnThreadDelta';
21
21
  export { InMemorySessionStore } from './store/InMemorySessionStore';
22
- export type { AddThreadsInput, AppendToEventsInput, AppendToThreadContextInput, CreateSessionInput, CreateTurnInput, DeleteSessionInput, FreezeAndGetTurnInput, GetSessionByExternalIdInput, GetSessionInput, GetTurnInput, ISessionStore, ListSessionEventsInput, ListSessionsInput, ListTurnEventsInput, ListTurnsInput, NewThreadInit, OverwriteThreadContextInput, PatchMCPServersInput, PatchSandboxInfoInput, PatchThreadCapabilityStateInput, RemoveThreadsInput, TurnContextAppend, TurnRecordWithoutSnapshot, UpdateSessionInput, UpdateTurnStateInput, } from './store/ISessionStore';
22
+ export type { AddThreadsInput, AppendToEventsInput, AppendToThreadContextInput, CreateSessionInput, CreateTurnInput, DeleteSessionInput, FreezeAndGetTurnInput, GetOwnedIdsInput, GetSessionByExternalIdInput, GetSessionInput, GetTurnInput, ISessionStore, ListSessionEventsInput, ListSessionsInput, ListTurnEventsInput, ListTurnsInput, NewThreadInit, OverwriteThreadContextInput, PatchMCPServersInput, PatchSandboxInfoInput, PatchThreadCapabilityStateInput, RemoveThreadsInput, TurnContextAppend, TurnRecordWithoutSnapshot, UpdateSessionInput, UpdateTurnStateInput, } from './store/ISessionStore';
23
23
  export { InvalidPageTokenError, PreviousTurnRunningError, SessionAlreadyExistsError, SessionExternalIdConflictError, SessionNotFoundError, SessionStoreConflictError, SessionStoreInvariantError, SessionStoreNotFoundError, TurnAlreadyExistsError, TurnNotFoundError, TurnNotRunningError, } from './store/SessionStoreErrors';
24
24
  export type { ITurnResourceResolver } from './ITurnResourceResolver';
25
25
  export { TurnResourceResolver } from './TurnResourceResolver';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent-session/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent-session/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/index.ts"],"sourcesContent":["/**\n * Public agent session middle library.\n * Zod product contracts and session/turn runtime.\n */\n\nexport { AgentSpecSchema, DEFAULT_AGENT_CONFIG_ITERATION_LIMIT, RuntimeConfigSchema } from './schemas/agentSpec';\nexport type { AgentSpec, Skill } from './schemas/agentSpec';\n\nexport {\n CancellationReason,\n CreateTurnRequestSchema,\n TurnInputItemSchema,\n TurnMetricsSchema,\n TurnSchema,\n TurnStateCancelledReasonSchema,\n TurnStateCancelledSchema,\n TurnStateDoneSchema,\n TurnStateErrorSchema,\n TurnStateRunningSchema,\n TurnStateSchema,\n} from './schemas/turn';\nexport type { TerminalTurnState, Turn, TurnInputItem, TurnMetrics, TurnState } from './schemas/turn';\n\nexport {\n SessionMetadataSchema,\n SessionMetricsSchema,\n SessionSchema,\n SessionSourceScheduleSchema,\n SessionSourceSchema,\n SessionSourceTypeSchema,\n} from './schemas/session';\nexport type {\n Session,\n SessionAgent,\n SessionMetadata,\n SessionMetrics,\n SessionSource,\n SessionSourceType,\n} from './schemas/session';\n\nexport { CreatedBySubjectSchema } from './schemas/subject';\nexport type { CreatedBySubject } from './schemas/subject';\n\nexport {\n EventType,\n SessionEventItemSchema,\n SessionEventSchema,\n TurnCreatedEventSchema,\n TurnDoneEventSchema,\n} from './schemas/events';\nexport type {\n PersistedTurnEvent,\n SessionEvent,\n SessionEventItem,\n TurnCreatedEvent,\n TurnDoneEvent,\n} from './schemas/events';\n\nexport { TokenPaginationSchema } from './schemas/pagination';\nexport type { TokenPagination } from './schemas/pagination';\n\nexport type { SessionRecord } from './models/SessionRecord';\nexport { MAIN_THREAD_ID } from './models/TurnRecord';\nexport type { TurnRecord, TurnSnapshot } from './models/TurnRecord';\n\nexport { assertCreateTurnThreadDelta } from './store/assertCreateTurnThreadDelta';\nexport { InMemorySessionStore } from './store/InMemorySessionStore';\nexport type {\n AddThreadsInput,\n AppendToEventsInput,\n AppendToThreadContextInput,\n CreateSessionInput,\n CreateTurnInput,\n DeleteSessionInput,\n FreezeAndGetTurnInput,\n GetSessionByExternalIdInput,\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 './store/ISessionStore';\nexport {\n InvalidPageTokenError,\n PreviousTurnRunningError,\n SessionAlreadyExistsError,\n SessionExternalIdConflictError,\n SessionNotFoundError,\n SessionStoreConflictError,\n SessionStoreInvariantError,\n SessionStoreNotFoundError,\n TurnAlreadyExistsError,\n TurnNotFoundError,\n TurnNotRunningError,\n} from './store/SessionStoreErrors';\n\nexport type { ITurnResourceResolver } from './ITurnResourceResolver';\nexport { TurnResourceResolver } from './TurnResourceResolver';\nexport type { TurnSandboxFactory } from './TurnResourceResolver';\n\nexport { SessionHandle } from './SessionHandle';\nexport { Sessions } from './Sessions';\nexport { TurnHandle } from './TurnHandle';\nexport type { TurnStreamingEvent } from './TurnHandle';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,uBAA2F;AAG3F,kBAYO;AAGP,qBAOO;AAUP,qBAAuC;AAGvC,oBAMO;AASP,wBAAsC;AAItC,wBAA+B;AAG/B,yCAA4C;AAC5C,kCAAqC;AA4BrC,gCAYO;AAGP,kCAAqC;AAGrC,2BAA8B;AAC9B,sBAAyB;AACzB,wBAA2B;","names":[]}
1
+ {"version":3,"sources":["../../src/agent-session/index.ts"],"sourcesContent":["/**\n * Public agent session middle library.\n * Zod product contracts and session/turn runtime.\n */\n\nexport { AgentSpecSchema, DEFAULT_AGENT_CONFIG_ITERATION_LIMIT, RuntimeConfigSchema } from './schemas/agentSpec';\nexport type { AgentSpec, Skill } from './schemas/agentSpec';\n\nexport {\n CancellationReason,\n CreateTurnRequestSchema,\n TurnInputItemSchema,\n TurnMetricsSchema,\n TurnSchema,\n TurnStateCancelledReasonSchema,\n TurnStateCancelledSchema,\n TurnStateDoneSchema,\n TurnStateErrorSchema,\n TurnStateRunningSchema,\n TurnStateSchema,\n} from './schemas/turn';\nexport type { TerminalTurnState, Turn, TurnInputItem, TurnMetrics, TurnState } from './schemas/turn';\n\nexport {\n SessionMetadataSchema,\n SessionMetricsSchema,\n SessionSchema,\n SessionSourceScheduleSchema,\n SessionSourceSchema,\n SessionSourceTypeSchema,\n} from './schemas/session';\nexport type {\n Session,\n SessionAgent,\n SessionMetadata,\n SessionMetrics,\n SessionSource,\n SessionSourceType,\n} from './schemas/session';\n\nexport { CreatedBySubjectSchema } from './schemas/subject';\nexport type { CreatedBySubject } from './schemas/subject';\n\nexport {\n EventType,\n SessionEventItemSchema,\n SessionEventSchema,\n TurnCreatedEventSchema,\n TurnDoneEventSchema,\n} from './schemas/events';\nexport type {\n PersistedTurnEvent,\n SessionEvent,\n SessionEventItem,\n TurnCreatedEvent,\n TurnDoneEvent,\n} from './schemas/events';\n\nexport { TokenPaginationSchema } from './schemas/pagination';\nexport type { TokenPagination } from './schemas/pagination';\n\nexport type { SessionRecord } from './models/SessionRecord';\nexport { MAIN_THREAD_ID } from './models/TurnRecord';\nexport type { TurnRecord, TurnSnapshot } from './models/TurnRecord';\n\nexport { assertCreateTurnThreadDelta } from './store/assertCreateTurnThreadDelta';\nexport { InMemorySessionStore } from './store/InMemorySessionStore';\nexport type {\n AddThreadsInput,\n AppendToEventsInput,\n AppendToThreadContextInput,\n CreateSessionInput,\n CreateTurnInput,\n DeleteSessionInput,\n FreezeAndGetTurnInput,\n GetOwnedIdsInput,\n GetSessionByExternalIdInput,\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 './store/ISessionStore';\nexport {\n InvalidPageTokenError,\n PreviousTurnRunningError,\n SessionAlreadyExistsError,\n SessionExternalIdConflictError,\n SessionNotFoundError,\n SessionStoreConflictError,\n SessionStoreInvariantError,\n SessionStoreNotFoundError,\n TurnAlreadyExistsError,\n TurnNotFoundError,\n TurnNotRunningError,\n} from './store/SessionStoreErrors';\n\nexport type { ITurnResourceResolver } from './ITurnResourceResolver';\nexport { TurnResourceResolver } from './TurnResourceResolver';\nexport type { TurnSandboxFactory } from './TurnResourceResolver';\n\nexport { SessionHandle } from './SessionHandle';\nexport { Sessions } from './Sessions';\nexport { TurnHandle } from './TurnHandle';\nexport type { TurnStreamingEvent } from './TurnHandle';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,uBAA2F;AAG3F,kBAYO;AAGP,qBAOO;AAUP,qBAAuC;AAGvC,oBAMO;AASP,wBAAsC;AAItC,wBAA+B;AAG/B,yCAA4C;AAC5C,kCAAqC;AA6BrC,gCAYO;AAGP,kCAAqC;AAGrC,2BAA8B;AAC9B,sBAAyB;AACzB,wBAA2B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/agent-session/index.ts"],"sourcesContent":["/**\n * Public agent session middle library.\n * Zod product contracts and session/turn runtime.\n */\n\nexport { AgentSpecSchema, DEFAULT_AGENT_CONFIG_ITERATION_LIMIT, RuntimeConfigSchema } from './schemas/agentSpec';\nexport type { AgentSpec, Skill } from './schemas/agentSpec';\n\nexport {\n CancellationReason,\n CreateTurnRequestSchema,\n TurnInputItemSchema,\n TurnMetricsSchema,\n TurnSchema,\n TurnStateCancelledReasonSchema,\n TurnStateCancelledSchema,\n TurnStateDoneSchema,\n TurnStateErrorSchema,\n TurnStateRunningSchema,\n TurnStateSchema,\n} from './schemas/turn';\nexport type { TerminalTurnState, Turn, TurnInputItem, TurnMetrics, TurnState } from './schemas/turn';\n\nexport {\n SessionMetadataSchema,\n SessionMetricsSchema,\n SessionSchema,\n SessionSourceScheduleSchema,\n SessionSourceSchema,\n SessionSourceTypeSchema,\n} from './schemas/session';\nexport type {\n Session,\n SessionAgent,\n SessionMetadata,\n SessionMetrics,\n SessionSource,\n SessionSourceType,\n} from './schemas/session';\n\nexport { CreatedBySubjectSchema } from './schemas/subject';\nexport type { CreatedBySubject } from './schemas/subject';\n\nexport {\n EventType,\n SessionEventItemSchema,\n SessionEventSchema,\n TurnCreatedEventSchema,\n TurnDoneEventSchema,\n} from './schemas/events';\nexport type {\n PersistedTurnEvent,\n SessionEvent,\n SessionEventItem,\n TurnCreatedEvent,\n TurnDoneEvent,\n} from './schemas/events';\n\nexport { TokenPaginationSchema } from './schemas/pagination';\nexport type { TokenPagination } from './schemas/pagination';\n\nexport type { SessionRecord } from './models/SessionRecord';\nexport { MAIN_THREAD_ID } from './models/TurnRecord';\nexport type { TurnRecord, TurnSnapshot } from './models/TurnRecord';\n\nexport { assertCreateTurnThreadDelta } from './store/assertCreateTurnThreadDelta';\nexport { InMemorySessionStore } from './store/InMemorySessionStore';\nexport type {\n AddThreadsInput,\n AppendToEventsInput,\n AppendToThreadContextInput,\n CreateSessionInput,\n CreateTurnInput,\n DeleteSessionInput,\n FreezeAndGetTurnInput,\n GetSessionByExternalIdInput,\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 './store/ISessionStore';\nexport {\n InvalidPageTokenError,\n PreviousTurnRunningError,\n SessionAlreadyExistsError,\n SessionExternalIdConflictError,\n SessionNotFoundError,\n SessionStoreConflictError,\n SessionStoreInvariantError,\n SessionStoreNotFoundError,\n TurnAlreadyExistsError,\n TurnNotFoundError,\n TurnNotRunningError,\n} from './store/SessionStoreErrors';\n\nexport type { ITurnResourceResolver } from './ITurnResourceResolver';\nexport { TurnResourceResolver } from './TurnResourceResolver';\nexport type { TurnSandboxFactory } from './TurnResourceResolver';\n\nexport { SessionHandle } from './SessionHandle';\nexport { Sessions } from './Sessions';\nexport { TurnHandle } from './TurnHandle';\nexport type { TurnStreamingEvent } from './TurnHandle';\n"],"mappings":";AAKA,SAAS,iBAAiB,sCAAsC,2BAA2B;AAG3F;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAUP,SAAS,8BAA8B;AAGvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASP,SAAS,6BAA6B;AAItC,SAAS,sBAAsB;AAG/B,SAAS,mCAAmC;AAC5C,SAAS,4BAA4B;AA4BrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,4BAA4B;AAGrC,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;","names":[]}
1
+ {"version":3,"sources":["../../src/agent-session/index.ts"],"sourcesContent":["/**\n * Public agent session middle library.\n * Zod product contracts and session/turn runtime.\n */\n\nexport { AgentSpecSchema, DEFAULT_AGENT_CONFIG_ITERATION_LIMIT, RuntimeConfigSchema } from './schemas/agentSpec';\nexport type { AgentSpec, Skill } from './schemas/agentSpec';\n\nexport {\n CancellationReason,\n CreateTurnRequestSchema,\n TurnInputItemSchema,\n TurnMetricsSchema,\n TurnSchema,\n TurnStateCancelledReasonSchema,\n TurnStateCancelledSchema,\n TurnStateDoneSchema,\n TurnStateErrorSchema,\n TurnStateRunningSchema,\n TurnStateSchema,\n} from './schemas/turn';\nexport type { TerminalTurnState, Turn, TurnInputItem, TurnMetrics, TurnState } from './schemas/turn';\n\nexport {\n SessionMetadataSchema,\n SessionMetricsSchema,\n SessionSchema,\n SessionSourceScheduleSchema,\n SessionSourceSchema,\n SessionSourceTypeSchema,\n} from './schemas/session';\nexport type {\n Session,\n SessionAgent,\n SessionMetadata,\n SessionMetrics,\n SessionSource,\n SessionSourceType,\n} from './schemas/session';\n\nexport { CreatedBySubjectSchema } from './schemas/subject';\nexport type { CreatedBySubject } from './schemas/subject';\n\nexport {\n EventType,\n SessionEventItemSchema,\n SessionEventSchema,\n TurnCreatedEventSchema,\n TurnDoneEventSchema,\n} from './schemas/events';\nexport type {\n PersistedTurnEvent,\n SessionEvent,\n SessionEventItem,\n TurnCreatedEvent,\n TurnDoneEvent,\n} from './schemas/events';\n\nexport { TokenPaginationSchema } from './schemas/pagination';\nexport type { TokenPagination } from './schemas/pagination';\n\nexport type { SessionRecord } from './models/SessionRecord';\nexport { MAIN_THREAD_ID } from './models/TurnRecord';\nexport type { TurnRecord, TurnSnapshot } from './models/TurnRecord';\n\nexport { assertCreateTurnThreadDelta } from './store/assertCreateTurnThreadDelta';\nexport { InMemorySessionStore } from './store/InMemorySessionStore';\nexport type {\n AddThreadsInput,\n AppendToEventsInput,\n AppendToThreadContextInput,\n CreateSessionInput,\n CreateTurnInput,\n DeleteSessionInput,\n FreezeAndGetTurnInput,\n GetOwnedIdsInput,\n GetSessionByExternalIdInput,\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 './store/ISessionStore';\nexport {\n InvalidPageTokenError,\n PreviousTurnRunningError,\n SessionAlreadyExistsError,\n SessionExternalIdConflictError,\n SessionNotFoundError,\n SessionStoreConflictError,\n SessionStoreInvariantError,\n SessionStoreNotFoundError,\n TurnAlreadyExistsError,\n TurnNotFoundError,\n TurnNotRunningError,\n} from './store/SessionStoreErrors';\n\nexport type { ITurnResourceResolver } from './ITurnResourceResolver';\nexport { TurnResourceResolver } from './TurnResourceResolver';\nexport type { TurnSandboxFactory } from './TurnResourceResolver';\n\nexport { SessionHandle } from './SessionHandle';\nexport { Sessions } from './Sessions';\nexport { TurnHandle } from './TurnHandle';\nexport type { TurnStreamingEvent } from './TurnHandle';\n"],"mappings":";AAKA,SAAS,iBAAiB,sCAAsC,2BAA2B;AAG3F;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAUP,SAAS,8BAA8B;AAGvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AASP,SAAS,6BAA6B;AAItC,SAAS,sBAAsB;AAG/B,SAAS,mCAAmC;AAC5C,SAAS,4BAA4B;AA6BrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,4BAA4B;AAGrC,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;","names":[]}
@@ -1,4 +1,4 @@
1
- /** DB AgentSpec wire schema — FQN model names and name-only skill refs. */
1
+ /** DB AgentSpec wire schema — FQN model names and skill refs (name + optional preload). */
2
2
  import { z } from '@hono/zod-openapi';
3
3
  export declare const DEFAULT_AGENT_CONFIG_ITERATION_LIMIT = 100;
4
4
  export declare const RuntimeConfigSchema: z.ZodObject<{
@@ -29,9 +29,10 @@ export declare const RuntimeConfigSchema: z.ZodObject<{
29
29
  enabled: z.ZodDefault<z.ZodBoolean>;
30
30
  }, z.core.$strip>>;
31
31
  }, z.core.$strip>;
32
- /** Name-only skill selection; mount fields come from the skill store. */
32
+ /** Skill selection; mount fields come from the skill store. */
33
33
  declare const SkillSchema: z.ZodObject<{
34
34
  name: z.ZodString;
35
+ preload: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
35
36
  }, z.core.$strict>;
36
37
  declare const InitialUserMessageSchema: z.ZodObject<{
37
38
  type: z.ZodLiteral<"user.message">;
@@ -90,6 +91,7 @@ export declare const AgentSpecSchema: z.ZodObject<{
90
91
  }, z.core.$loose>], "type">>;
91
92
  skills: z.ZodOptional<z.ZodArray<z.ZodObject<{
92
93
  name: z.ZodString;
94
+ preload: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
93
95
  }, z.core.$strict>>>;
94
96
  config: z.ZodDefault<z.ZodObject<{
95
97
  iteration_limit: z.ZodDefault<z.ZodNumber>;
@@ -1 +1 @@
1
- {"version":3,"file":"agentSpec.d.ts","sourceRoot":"","sources":["../../../src/agent-session/schemas/agentSpec.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAgBtC,eAAO,MAAM,oCAAoC,MAAM,CAAC;AAuLxD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBL,CAAC;AAO5B,yEAAyE;AACzE,QAAA,MAAM,WAAW;;kBAaE,CAAC;AAIpB,QAAA,MAAM,wBAAwB;;;iBASE,CAAC;AAIjC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwBL,CAAC;AAExB,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
1
+ {"version":3,"file":"agentSpec.d.ts","sourceRoot":"","sources":["../../../src/agent-session/schemas/agentSpec.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,OAAO,EAAE,CAAC,EAAE,MAAM,mBAAmB,CAAC;AAgBtC,eAAO,MAAM,oCAAoC,MAAM,CAAC;AAuLxD,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAoBL,CAAC;AAS5B,+DAA+D;AAC/D,QAAA,MAAM,WAAW;;;kBAaE,CAAC;AAIpB,QAAA,MAAM,wBAAwB;;;iBASE,CAAC;AAIjC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqBL,CAAC;AAExB,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AACxD,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAChD,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -119,9 +119,11 @@ var RuntimeConfigSchema = import_zod_openapi.z.object({
119
119
  generative_ui: GenerativeUIConfigSchema.default(() => ({ enabled: true })),
120
120
  ask_user_questions: AskUserQuestionsConfigSchema.default(() => ({ enabled: true }))
121
121
  }).openapi("RuntimeConfig");
122
- var SKILL_NAME_REGEX = /^[A-Za-z0-9._-]+$/;
122
+ var SKILL_NAME_REGEX = /^[A-Za-z0-9._\-/:]+$/;
123
+ var MAX_AGENT_SKILLS = 50;
123
124
  var SkillSchema = import_zod_openapi.z.object({
124
- name: import_zod_openapi.z.string().trim().min(1).max(64).regex(SKILL_NAME_REGEX, 'Name may only contain letters, numbers, ".", "_", and "-"').refine((v) => v !== "." && v !== "..", 'Name must not be "." or ".."').refine((v) => !v.startsWith(".tfy-"), 'Name must not use the reserved ".tfy-" prefix').describe("Name of a configured skill (also used as the skill directory name in the sandbox).")
125
+ name: import_zod_openapi.z.string().trim().min(1).regex(SKILL_NAME_REGEX, 'Name may only contain letters, numbers, ".", "_", "-", "/", and ":"').refine((v) => v !== "." && v !== "..", 'Name must not be "." or ".."').refine((v) => !v.startsWith(".tfy-"), 'Name must not use the reserved ".tfy-" prefix').describe("Skill name."),
126
+ preload: import_zod_openapi.z.boolean().optional().default(false).describe("Inline SKILL.md into the prompt.")
125
127
  }).strict().openapi("Skill");
126
128
  var InitialUserMessageSchema = import_zod_openapi.z.object({
127
129
  type: import_zod_openapi.z.literal("user.message").describe("Initial message type."),
@@ -133,7 +135,7 @@ var AgentSpecSchema = import_zod_openapi.z.object({
133
135
  messages: import_zod_openapi.z.array(InitialUserMessageSchema).optional().describe("Optional initial user messages injected at the start of every session."),
134
136
  mcp_servers: import_zod_openapi.z.array(MCPServerRequestSchema).optional().describe("Optional MCP servers attached by configured name."),
135
137
  response_format: import_responseFormat.ResponseFormatSchema.optional(),
136
- skills: import_zod_openapi.z.array(SkillSchema).optional().describe("Optional name-only skill references. Requires `config.sandbox.enabled: true`."),
138
+ skills: import_zod_openapi.z.array(SkillSchema).max(MAX_AGENT_SKILLS).optional().describe("Skills used in this agent."),
137
139
  // Factory must parse so nested RuntimeConfig field defaults materialize.
138
140
  config: RuntimeConfigSchema.default(() => RuntimeConfigSchema.parse({}))
139
141
  }).describe("Complete agent definition used inline on a session or saved as a named agent.").openapi("AgentSpec");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/agent-session/schemas/agentSpec.ts"],"sourcesContent":["/** DB AgentSpec wire schema — FQN model names and name-only skill refs. */\nimport { z } from '@hono/zod-openapi';\nimport {\n DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD,\n DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS,\n DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD,\n} from '../../core/capabilities/builtins/LargeToolResponse';\nimport { ResponseFormatSchema } from '../../core/llm/responseFormat';\nimport {\n DEFAULT_DISABLE_TOOLS,\n DEFAULT_ENABLE_TOOLS,\n DEFAULT_PRELOAD_TOOLS,\n DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS,\n REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS,\n TOOLS_SELECTOR_TAGS,\n} from '../../core/mcp/toolSelectors';\n\nexport const DEFAULT_AGENT_CONFIG_ITERATION_LIMIT = 100;\n\n// --- Model ---\n\nconst ModelParamsSchema = z\n .object({\n max_tokens: z.number().optional().describe('Maximum tokens to generate in the model response.'),\n temperature: z.number().optional().describe('Sampling temperature; higher values increase randomness.'),\n top_p: z.number().optional().describe('Nucleus sampling probability mass.'),\n top_k: z.number().optional().describe('Top-k sampling; keep only the k highest-probability tokens.'),\n parallel_tool_calls: z\n .boolean()\n .optional()\n .describe('Whether the model may emit multiple tool calls in one response.'),\n reasoning_effort: z.string().optional().describe('Provider-specific reasoning effort (e.g. low/medium/high).'),\n })\n .loose() // this ensures extra model params are allowed\n .describe(\n 'Model call parameters passed through to the provider. Known keys are documented; extra keys are allowed and forwarded as-is.',\n )\n .openapi('ModelParams');\n\n// Opaque runtime identifier; the hosting server owns naming conventions (e.g. provider/model).\nconst ModelSchema = z\n .object({\n name: z\n .string()\n .min(1, 'model.name must not be empty')\n .describe('Model FQN: `provider/model`, e.g. `openai/gpt-5.2`.'),\n params: ModelParamsSchema.optional(),\n })\n .openapi('Model');\n\n// --- MCP servers ---\n\n// Literal tool name (not a tag).\nconst LiteralToolSelectorSchema = z\n .string()\n .min(1)\n .refine(s => !s.startsWith('@'), { message: 'Invalid tool selector tag' });\n\n// enable_tools / disable_tools / preload_tools: @all, @read-only, or a literal name.\nconst EnableToolSelectorSchema = z\n .union([z.enum(TOOLS_SELECTOR_TAGS), LiteralToolSelectorSchema])\n .openapi('MCPServerToolSelector');\n\n// require_approval_for_tools: @all, @write, @destructive, or a literal name.\nconst RequireApprovalToolSelectorSchema = z\n .union([z.enum(REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS), LiteralToolSelectorSchema])\n .openapi('MCPServerApprovalToolSelector');\n\n// `preload` defaults to false; use `preload_tools` to eagerly load specific tools when not fully preloading.\n// Auth headers are not part of the spec — they come from the configured MCP server store.\nconst MCPServerRequestSchema = z\n .object({\n name: z\n .string()\n .min(1, 'mcp_servers[].name must not be empty')\n .describe('Name of a configured MCP server (Settings → Connectors).'),\n // Which tools to enable. Default: all tools.\n enable_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_ENABLE_TOOLS)\n .describe('Tools exposed to the agent: `@all`, `@read-only`, or literal tool names. Default: `[\"@all\"]`.'),\n // Which tools to disable (subtracted from enable_tools). Default: none.\n disable_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_DISABLE_TOOLS)\n .describe('Tools subtracted from the enabled set. Default: none.'),\n // When the server is not fully preloaded (`preload: false`), which tools to\n // still preload into context. A non-empty list implies `preload: false`.\n preload_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_PRELOAD_TOOLS)\n .describe(\n 'Tools loaded eagerly into context while the rest stay deferred. A non-empty list implies `preload: false`.',\n ),\n // Tools that require human approval before execution. Default: @write + @destructive.\n require_approval_for_tools: z\n .array(RequireApprovalToolSelectorSchema)\n .default(DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS)\n .describe(\n 'Tools that pause for human approval: `@all`, `@write`, `@destructive`, or literal names. Default: `[\"@write\", \"@destructive\"]`.',\n ),\n // Whether this server's tools are preloaded into context. Default: false.\n // When false, tools are discovered lazily and only `preload_tools` stay eager.\n preload: z\n .boolean()\n .optional()\n .default(false)\n .describe('When true, load all tool schemas upfront. Default: false (deferred discovery).'),\n })\n .openapi('MCPServer');\n\n// --- Runtime config ---\n\nconst InputTokensCompactionTriggerSchema = z\n .object({\n type: z.literal('input_tokens').describe('Trigger compaction when the estimated input reaches a token limit.'),\n value: z.number().int().positive().describe('Estimated input-token count that triggers compaction.'),\n })\n .strict()\n .openapi('InputTokensCompactionTrigger');\n\nconst CompactionSettingsSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Summarize older history when context grows too large. Default: true.'),\n trigger: InputTokensCompactionTriggerSchema.optional(),\n })\n .strict()\n .describe('Uses 80% of the model context length when the explicit trigger is omitted, or 50000 tokens if unknown.')\n .openapi('CompactionConfig');\n\nconst LargeToolResponseSettingsSchema = z.object({\n enabled: z.boolean().default(true).describe('Offload oversized tool responses to a sandbox file. Default: true.'),\n individual_tool_response_token_threshold: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD)\n .describe(\n `Token threshold for a single tool response before offloading. Default: ${String(DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD)}.`,\n ),\n total_tool_response_token_threshold: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD)\n .describe(\n `Combined tool-response token threshold before offloading. Default: ${String(DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD)}.`,\n ),\n preview_number_of_characters: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS)\n .describe(\n `Characters of preview kept in context after offloading. Default: ${String(DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS)}.`,\n ),\n});\n\nconst SandboxConfigSchema = z\n .object({\n enabled: z.boolean().describe('Give the agent a sandbox. Required for skills and Code Mode.'),\n file_downloads: z\n .boolean()\n .default(true)\n .describe('Allow downloading agent-produced files via the turn download endpoint. Default: true.'),\n })\n .openapi('SandboxConfig');\n\nconst DynamicSubAgentsConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Allow the agent to spawn dynamic subagents. Default: true.'),\n })\n .openapi('DynamicSubAgentsConfig');\n\nconst LargeToolResponseConfigSchema = LargeToolResponseSettingsSchema.pick({\n enabled: true,\n}).openapi('LargeToolResponseConfig');\n\nconst ContextManagementConfigSchema = z\n .object({\n compaction: CompactionSettingsSchema.default(() => ({ enabled: true })),\n large_tool_response: LargeToolResponseConfigSchema.default(() => ({ enabled: true })),\n })\n .openapi('ContextManagementConfig');\n\nconst GenerativeUIConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Enable Generative UI (OpenUI blocks). Default: true.'),\n })\n .openapi('GenerativeUIConfig');\n\nconst AskUserQuestionsConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Enable the `ask_user_question` tool. Default: true.'),\n })\n .openapi('AskUserQuestionsConfig');\n\nexport const RuntimeConfigSchema = z\n .object({\n iteration_limit: z\n .number()\n .int()\n .positive()\n .max(1024)\n .default(DEFAULT_AGENT_CONFIG_ITERATION_LIMIT)\n .describe(\n `Max agent-loop iterations per turn (1–1024). Default: ${String(DEFAULT_AGENT_CONFIG_ITERATION_LIMIT)}.`,\n ),\n sandbox: SandboxConfigSchema.default(() => ({ enabled: false, file_downloads: true })),\n dynamic_sub_agents: DynamicSubAgentsConfigSchema.default(() => ({ enabled: true })),\n context_management: ContextManagementConfigSchema.default(() => ({\n compaction: { enabled: true },\n large_tool_response: { enabled: true },\n })),\n generative_ui: GenerativeUIConfigSchema.default(() => ({ enabled: true })),\n ask_user_questions: AskUserQuestionsConfigSchema.default(() => ({ enabled: true })),\n })\n .openapi('RuntimeConfig');\n\n// --- Skills ---\n// Name-only refs; DB sessions expand mount fields from ISkillStore at turn time.\n\nconst SKILL_NAME_REGEX = /^[A-Za-z0-9._-]+$/;\n\n/** Name-only skill selection; mount fields come from the skill store. */\nconst SkillSchema = z\n .object({\n name: z\n .string()\n .trim()\n .min(1)\n .max(64)\n .regex(SKILL_NAME_REGEX, 'Name may only contain letters, numbers, \".\", \"_\", and \"-\"')\n .refine(v => v !== '.' && v !== '..', 'Name must not be \".\" or \"..\"')\n .refine(v => !v.startsWith('.tfy-'), 'Name must not use the reserved \".tfy-\" prefix')\n .describe('Name of a configured skill (also used as the skill directory name in the sandbox).'),\n })\n .strict()\n .openapi('Skill');\n\n// --- Initial messages (string-only; turn UserMessage also allows file parts) ---\n\nconst InitialUserMessageSchema = z\n .object({\n type: z.literal('user.message').describe('Initial message type.'),\n content: z\n .string()\n .min(1, 'User message content must not be empty')\n .refine(content => content.trim().length > 0, 'User message content must not be empty')\n .describe('Initial user message content injected at the start of every session.'),\n })\n .openapi('InitialUserMessage');\n\n// --- Agent spec ---\n\nexport const AgentSpecSchema = z\n .object({\n model: ModelSchema,\n instructions: z\n .string()\n .optional()\n .describe(\"Optional system prompt — the agent's role, behavior, and constraints.\"),\n messages: z\n .array(InitialUserMessageSchema)\n .optional()\n .describe('Optional initial user messages injected at the start of every session.'),\n mcp_servers: z\n .array(MCPServerRequestSchema)\n .optional()\n .describe('Optional MCP servers attached by configured name.'),\n response_format: ResponseFormatSchema.optional(),\n skills: z\n .array(SkillSchema)\n .optional()\n .describe('Optional name-only skill references. Requires `config.sandbox.enabled: true`.'),\n // Factory must parse so nested RuntimeConfig field defaults materialize.\n config: RuntimeConfigSchema.default(() => RuntimeConfigSchema.parse({})),\n })\n .describe('Complete agent definition used inline on a session or saved as a named agent.')\n .openapi('AgentSpec');\n\nexport type AgentSpec = z.infer<typeof AgentSpecSchema>;\nexport type Skill = z.infer<typeof SkillSchema>;\nexport type InitialUserMessage = z.infer<typeof InitialUserMessageSchema>;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/agent-session/schemas/agentSpec.ts"],"sourcesContent":["/** DB AgentSpec wire schema — FQN model names and skill refs (name + optional preload). */\nimport { z } from '@hono/zod-openapi';\nimport {\n DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD,\n DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS,\n DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD,\n} from '../../core/capabilities/builtins/LargeToolResponse';\nimport { ResponseFormatSchema } from '../../core/llm/responseFormat';\nimport {\n DEFAULT_DISABLE_TOOLS,\n DEFAULT_ENABLE_TOOLS,\n DEFAULT_PRELOAD_TOOLS,\n DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS,\n REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS,\n TOOLS_SELECTOR_TAGS,\n} from '../../core/mcp/toolSelectors';\n\nexport const DEFAULT_AGENT_CONFIG_ITERATION_LIMIT = 100;\n\n// --- Model ---\n\nconst ModelParamsSchema = z\n .object({\n max_tokens: z.number().optional().describe('Maximum tokens to generate in the model response.'),\n temperature: z.number().optional().describe('Sampling temperature; higher values increase randomness.'),\n top_p: z.number().optional().describe('Nucleus sampling probability mass.'),\n top_k: z.number().optional().describe('Top-k sampling; keep only the k highest-probability tokens.'),\n parallel_tool_calls: z\n .boolean()\n .optional()\n .describe('Whether the model may emit multiple tool calls in one response.'),\n reasoning_effort: z.string().optional().describe('Provider-specific reasoning effort (e.g. low/medium/high).'),\n })\n .loose() // this ensures extra model params are allowed\n .describe(\n 'Model call parameters passed through to the provider. Known keys are documented; extra keys are allowed and forwarded as-is.',\n )\n .openapi('ModelParams');\n\n// Opaque runtime identifier; the hosting server owns naming conventions (e.g. provider/model).\nconst ModelSchema = z\n .object({\n name: z\n .string()\n .min(1, 'model.name must not be empty')\n .describe('Model FQN: `provider/model`, e.g. `openai/gpt-5.2`.'),\n params: ModelParamsSchema.optional(),\n })\n .openapi('Model');\n\n// --- MCP servers ---\n\n// Literal tool name (not a tag).\nconst LiteralToolSelectorSchema = z\n .string()\n .min(1)\n .refine(s => !s.startsWith('@'), { message: 'Invalid tool selector tag' });\n\n// enable_tools / disable_tools / preload_tools: @all, @read-only, or a literal name.\nconst EnableToolSelectorSchema = z\n .union([z.enum(TOOLS_SELECTOR_TAGS), LiteralToolSelectorSchema])\n .openapi('MCPServerToolSelector');\n\n// require_approval_for_tools: @all, @write, @destructive, or a literal name.\nconst RequireApprovalToolSelectorSchema = z\n .union([z.enum(REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS), LiteralToolSelectorSchema])\n .openapi('MCPServerApprovalToolSelector');\n\n// `preload` defaults to false; use `preload_tools` to eagerly load specific tools when not fully preloading.\n// Auth headers are not part of the spec — they come from the configured MCP server store.\nconst MCPServerRequestSchema = z\n .object({\n name: z\n .string()\n .min(1, 'mcp_servers[].name must not be empty')\n .describe('Name of a configured MCP server (Settings → Connectors).'),\n // Which tools to enable. Default: all tools.\n enable_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_ENABLE_TOOLS)\n .describe('Tools exposed to the agent: `@all`, `@read-only`, or literal tool names. Default: `[\"@all\"]`.'),\n // Which tools to disable (subtracted from enable_tools). Default: none.\n disable_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_DISABLE_TOOLS)\n .describe('Tools subtracted from the enabled set. Default: none.'),\n // When the server is not fully preloaded (`preload: false`), which tools to\n // still preload into context. A non-empty list implies `preload: false`.\n preload_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_PRELOAD_TOOLS)\n .describe(\n 'Tools loaded eagerly into context while the rest stay deferred. A non-empty list implies `preload: false`.',\n ),\n // Tools that require human approval before execution. Default: @write + @destructive.\n require_approval_for_tools: z\n .array(RequireApprovalToolSelectorSchema)\n .default(DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS)\n .describe(\n 'Tools that pause for human approval: `@all`, `@write`, `@destructive`, or literal names. Default: `[\"@write\", \"@destructive\"]`.',\n ),\n // Whether this server's tools are preloaded into context. Default: false.\n // When false, tools are discovered lazily and only `preload_tools` stay eager.\n preload: z\n .boolean()\n .optional()\n .default(false)\n .describe('When true, load all tool schemas upfront. Default: false (deferred discovery).'),\n })\n .openapi('MCPServer');\n\n// --- Runtime config ---\n\nconst InputTokensCompactionTriggerSchema = z\n .object({\n type: z.literal('input_tokens').describe('Trigger compaction when the estimated input reaches a token limit.'),\n value: z.number().int().positive().describe('Estimated input-token count that triggers compaction.'),\n })\n .strict()\n .openapi('InputTokensCompactionTrigger');\n\nconst CompactionSettingsSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Summarize older history when context grows too large. Default: true.'),\n trigger: InputTokensCompactionTriggerSchema.optional(),\n })\n .strict()\n .describe('Uses 80% of the model context length when the explicit trigger is omitted, or 50000 tokens if unknown.')\n .openapi('CompactionConfig');\n\nconst LargeToolResponseSettingsSchema = z.object({\n enabled: z.boolean().default(true).describe('Offload oversized tool responses to a sandbox file. Default: true.'),\n individual_tool_response_token_threshold: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD)\n .describe(\n `Token threshold for a single tool response before offloading. Default: ${String(DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD)}.`,\n ),\n total_tool_response_token_threshold: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD)\n .describe(\n `Combined tool-response token threshold before offloading. Default: ${String(DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD)}.`,\n ),\n preview_number_of_characters: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS)\n .describe(\n `Characters of preview kept in context after offloading. Default: ${String(DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS)}.`,\n ),\n});\n\nconst SandboxConfigSchema = z\n .object({\n enabled: z.boolean().describe('Give the agent a sandbox. Required for skills and Code Mode.'),\n file_downloads: z\n .boolean()\n .default(true)\n .describe('Allow downloading agent-produced files via the turn download endpoint. Default: true.'),\n })\n .openapi('SandboxConfig');\n\nconst DynamicSubAgentsConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Allow the agent to spawn dynamic subagents. Default: true.'),\n })\n .openapi('DynamicSubAgentsConfig');\n\nconst LargeToolResponseConfigSchema = LargeToolResponseSettingsSchema.pick({\n enabled: true,\n}).openapi('LargeToolResponseConfig');\n\nconst ContextManagementConfigSchema = z\n .object({\n compaction: CompactionSettingsSchema.default(() => ({ enabled: true })),\n large_tool_response: LargeToolResponseConfigSchema.default(() => ({ enabled: true })),\n })\n .openapi('ContextManagementConfig');\n\nconst GenerativeUIConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Enable Generative UI (OpenUI blocks). Default: true.'),\n })\n .openapi('GenerativeUIConfig');\n\nconst AskUserQuestionsConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Enable the `ask_user_question` tool. Default: true.'),\n })\n .openapi('AskUserQuestionsConfig');\n\nexport const RuntimeConfigSchema = z\n .object({\n iteration_limit: z\n .number()\n .int()\n .positive()\n .max(1024)\n .default(DEFAULT_AGENT_CONFIG_ITERATION_LIMIT)\n .describe(\n `Max agent-loop iterations per turn (1–1024). Default: ${String(DEFAULT_AGENT_CONFIG_ITERATION_LIMIT)}.`,\n ),\n sandbox: SandboxConfigSchema.default(() => ({ enabled: false, file_downloads: true })),\n dynamic_sub_agents: DynamicSubAgentsConfigSchema.default(() => ({ enabled: true })),\n context_management: ContextManagementConfigSchema.default(() => ({\n compaction: { enabled: true },\n large_tool_response: { enabled: true },\n })),\n generative_ui: GenerativeUIConfigSchema.default(() => ({ enabled: true })),\n ask_user_questions: AskUserQuestionsConfigSchema.default(() => ({ enabled: true })),\n })\n .openapi('RuntimeConfig');\n\n// --- Skills ---\n// Name (+ optional preload) refs; the skill store expands mounts at turn time.\n\nconst SKILL_NAME_REGEX = /^[A-Za-z0-9._\\-/:]+$/;\n\nconst MAX_AGENT_SKILLS = 50;\n\n/** Skill selection; mount fields come from the skill store. */\nconst SkillSchema = z\n .object({\n name: z\n .string()\n .trim()\n .min(1)\n .regex(SKILL_NAME_REGEX, 'Name may only contain letters, numbers, \".\", \"_\", \"-\", \"/\", and \":\"')\n .refine(v => v !== '.' && v !== '..', 'Name must not be \".\" or \"..\"')\n .refine(v => !v.startsWith('.tfy-'), 'Name must not use the reserved \".tfy-\" prefix')\n .describe('Skill name.'),\n preload: z.boolean().optional().default(false).describe('Inline SKILL.md into the prompt.'),\n })\n .strict()\n .openapi('Skill');\n\n// --- Initial messages (string-only; turn UserMessage also allows file parts) ---\n\nconst InitialUserMessageSchema = z\n .object({\n type: z.literal('user.message').describe('Initial message type.'),\n content: z\n .string()\n .min(1, 'User message content must not be empty')\n .refine(content => content.trim().length > 0, 'User message content must not be empty')\n .describe('Initial user message content injected at the start of every session.'),\n })\n .openapi('InitialUserMessage');\n\n// --- Agent spec ---\n\nexport const AgentSpecSchema = z\n .object({\n model: ModelSchema,\n instructions: z\n .string()\n .optional()\n .describe(\"Optional system prompt — the agent's role, behavior, and constraints.\"),\n messages: z\n .array(InitialUserMessageSchema)\n .optional()\n .describe('Optional initial user messages injected at the start of every session.'),\n mcp_servers: z\n .array(MCPServerRequestSchema)\n .optional()\n .describe('Optional MCP servers attached by configured name.'),\n response_format: ResponseFormatSchema.optional(),\n skills: z.array(SkillSchema).max(MAX_AGENT_SKILLS).optional().describe('Skills used in this agent.'),\n // Factory must parse so nested RuntimeConfig field defaults materialize.\n config: RuntimeConfigSchema.default(() => RuntimeConfigSchema.parse({})),\n })\n .describe('Complete agent definition used inline on a session or saved as a named agent.')\n .openapi('AgentSpec');\n\nexport type AgentSpec = z.infer<typeof AgentSpecSchema>;\nexport type Skill = z.infer<typeof SkillSchema>;\nexport type InitialUserMessage = z.infer<typeof InitialUserMessageSchema>;\n"],"mappings":"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","names":[]}
@@ -104,9 +104,11 @@ var RuntimeConfigSchema = z.object({
104
104
  generative_ui: GenerativeUIConfigSchema.default(() => ({ enabled: true })),
105
105
  ask_user_questions: AskUserQuestionsConfigSchema.default(() => ({ enabled: true }))
106
106
  }).openapi("RuntimeConfig");
107
- var SKILL_NAME_REGEX = /^[A-Za-z0-9._-]+$/;
107
+ var SKILL_NAME_REGEX = /^[A-Za-z0-9._\-/:]+$/;
108
+ var MAX_AGENT_SKILLS = 50;
108
109
  var SkillSchema = z.object({
109
- name: z.string().trim().min(1).max(64).regex(SKILL_NAME_REGEX, 'Name may only contain letters, numbers, ".", "_", and "-"').refine((v) => v !== "." && v !== "..", 'Name must not be "." or ".."').refine((v) => !v.startsWith(".tfy-"), 'Name must not use the reserved ".tfy-" prefix').describe("Name of a configured skill (also used as the skill directory name in the sandbox).")
110
+ name: z.string().trim().min(1).regex(SKILL_NAME_REGEX, 'Name may only contain letters, numbers, ".", "_", "-", "/", and ":"').refine((v) => v !== "." && v !== "..", 'Name must not be "." or ".."').refine((v) => !v.startsWith(".tfy-"), 'Name must not use the reserved ".tfy-" prefix').describe("Skill name."),
111
+ preload: z.boolean().optional().default(false).describe("Inline SKILL.md into the prompt.")
110
112
  }).strict().openapi("Skill");
111
113
  var InitialUserMessageSchema = z.object({
112
114
  type: z.literal("user.message").describe("Initial message type."),
@@ -118,7 +120,7 @@ var AgentSpecSchema = z.object({
118
120
  messages: z.array(InitialUserMessageSchema).optional().describe("Optional initial user messages injected at the start of every session."),
119
121
  mcp_servers: z.array(MCPServerRequestSchema).optional().describe("Optional MCP servers attached by configured name."),
120
122
  response_format: ResponseFormatSchema.optional(),
121
- skills: z.array(SkillSchema).optional().describe("Optional name-only skill references. Requires `config.sandbox.enabled: true`."),
123
+ skills: z.array(SkillSchema).max(MAX_AGENT_SKILLS).optional().describe("Skills used in this agent."),
122
124
  // Factory must parse so nested RuntimeConfig field defaults materialize.
123
125
  config: RuntimeConfigSchema.default(() => RuntimeConfigSchema.parse({}))
124
126
  }).describe("Complete agent definition used inline on a session or saved as a named agent.").openapi("AgentSpec");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/agent-session/schemas/agentSpec.ts"],"sourcesContent":["/** DB AgentSpec wire schema — FQN model names and name-only skill refs. */\nimport { z } from '@hono/zod-openapi';\nimport {\n DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD,\n DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS,\n DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD,\n} from '../../core/capabilities/builtins/LargeToolResponse';\nimport { ResponseFormatSchema } from '../../core/llm/responseFormat';\nimport {\n DEFAULT_DISABLE_TOOLS,\n DEFAULT_ENABLE_TOOLS,\n DEFAULT_PRELOAD_TOOLS,\n DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS,\n REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS,\n TOOLS_SELECTOR_TAGS,\n} from '../../core/mcp/toolSelectors';\n\nexport const DEFAULT_AGENT_CONFIG_ITERATION_LIMIT = 100;\n\n// --- Model ---\n\nconst ModelParamsSchema = z\n .object({\n max_tokens: z.number().optional().describe('Maximum tokens to generate in the model response.'),\n temperature: z.number().optional().describe('Sampling temperature; higher values increase randomness.'),\n top_p: z.number().optional().describe('Nucleus sampling probability mass.'),\n top_k: z.number().optional().describe('Top-k sampling; keep only the k highest-probability tokens.'),\n parallel_tool_calls: z\n .boolean()\n .optional()\n .describe('Whether the model may emit multiple tool calls in one response.'),\n reasoning_effort: z.string().optional().describe('Provider-specific reasoning effort (e.g. low/medium/high).'),\n })\n .loose() // this ensures extra model params are allowed\n .describe(\n 'Model call parameters passed through to the provider. Known keys are documented; extra keys are allowed and forwarded as-is.',\n )\n .openapi('ModelParams');\n\n// Opaque runtime identifier; the hosting server owns naming conventions (e.g. provider/model).\nconst ModelSchema = z\n .object({\n name: z\n .string()\n .min(1, 'model.name must not be empty')\n .describe('Model FQN: `provider/model`, e.g. `openai/gpt-5.2`.'),\n params: ModelParamsSchema.optional(),\n })\n .openapi('Model');\n\n// --- MCP servers ---\n\n// Literal tool name (not a tag).\nconst LiteralToolSelectorSchema = z\n .string()\n .min(1)\n .refine(s => !s.startsWith('@'), { message: 'Invalid tool selector tag' });\n\n// enable_tools / disable_tools / preload_tools: @all, @read-only, or a literal name.\nconst EnableToolSelectorSchema = z\n .union([z.enum(TOOLS_SELECTOR_TAGS), LiteralToolSelectorSchema])\n .openapi('MCPServerToolSelector');\n\n// require_approval_for_tools: @all, @write, @destructive, or a literal name.\nconst RequireApprovalToolSelectorSchema = z\n .union([z.enum(REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS), LiteralToolSelectorSchema])\n .openapi('MCPServerApprovalToolSelector');\n\n// `preload` defaults to false; use `preload_tools` to eagerly load specific tools when not fully preloading.\n// Auth headers are not part of the spec — they come from the configured MCP server store.\nconst MCPServerRequestSchema = z\n .object({\n name: z\n .string()\n .min(1, 'mcp_servers[].name must not be empty')\n .describe('Name of a configured MCP server (Settings → Connectors).'),\n // Which tools to enable. Default: all tools.\n enable_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_ENABLE_TOOLS)\n .describe('Tools exposed to the agent: `@all`, `@read-only`, or literal tool names. Default: `[\"@all\"]`.'),\n // Which tools to disable (subtracted from enable_tools). Default: none.\n disable_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_DISABLE_TOOLS)\n .describe('Tools subtracted from the enabled set. Default: none.'),\n // When the server is not fully preloaded (`preload: false`), which tools to\n // still preload into context. A non-empty list implies `preload: false`.\n preload_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_PRELOAD_TOOLS)\n .describe(\n 'Tools loaded eagerly into context while the rest stay deferred. A non-empty list implies `preload: false`.',\n ),\n // Tools that require human approval before execution. Default: @write + @destructive.\n require_approval_for_tools: z\n .array(RequireApprovalToolSelectorSchema)\n .default(DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS)\n .describe(\n 'Tools that pause for human approval: `@all`, `@write`, `@destructive`, or literal names. Default: `[\"@write\", \"@destructive\"]`.',\n ),\n // Whether this server's tools are preloaded into context. Default: false.\n // When false, tools are discovered lazily and only `preload_tools` stay eager.\n preload: z\n .boolean()\n .optional()\n .default(false)\n .describe('When true, load all tool schemas upfront. Default: false (deferred discovery).'),\n })\n .openapi('MCPServer');\n\n// --- Runtime config ---\n\nconst InputTokensCompactionTriggerSchema = z\n .object({\n type: z.literal('input_tokens').describe('Trigger compaction when the estimated input reaches a token limit.'),\n value: z.number().int().positive().describe('Estimated input-token count that triggers compaction.'),\n })\n .strict()\n .openapi('InputTokensCompactionTrigger');\n\nconst CompactionSettingsSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Summarize older history when context grows too large. Default: true.'),\n trigger: InputTokensCompactionTriggerSchema.optional(),\n })\n .strict()\n .describe('Uses 80% of the model context length when the explicit trigger is omitted, or 50000 tokens if unknown.')\n .openapi('CompactionConfig');\n\nconst LargeToolResponseSettingsSchema = z.object({\n enabled: z.boolean().default(true).describe('Offload oversized tool responses to a sandbox file. Default: true.'),\n individual_tool_response_token_threshold: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD)\n .describe(\n `Token threshold for a single tool response before offloading. Default: ${String(DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD)}.`,\n ),\n total_tool_response_token_threshold: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD)\n .describe(\n `Combined tool-response token threshold before offloading. Default: ${String(DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD)}.`,\n ),\n preview_number_of_characters: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS)\n .describe(\n `Characters of preview kept in context after offloading. Default: ${String(DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS)}.`,\n ),\n});\n\nconst SandboxConfigSchema = z\n .object({\n enabled: z.boolean().describe('Give the agent a sandbox. Required for skills and Code Mode.'),\n file_downloads: z\n .boolean()\n .default(true)\n .describe('Allow downloading agent-produced files via the turn download endpoint. Default: true.'),\n })\n .openapi('SandboxConfig');\n\nconst DynamicSubAgentsConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Allow the agent to spawn dynamic subagents. Default: true.'),\n })\n .openapi('DynamicSubAgentsConfig');\n\nconst LargeToolResponseConfigSchema = LargeToolResponseSettingsSchema.pick({\n enabled: true,\n}).openapi('LargeToolResponseConfig');\n\nconst ContextManagementConfigSchema = z\n .object({\n compaction: CompactionSettingsSchema.default(() => ({ enabled: true })),\n large_tool_response: LargeToolResponseConfigSchema.default(() => ({ enabled: true })),\n })\n .openapi('ContextManagementConfig');\n\nconst GenerativeUIConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Enable Generative UI (OpenUI blocks). Default: true.'),\n })\n .openapi('GenerativeUIConfig');\n\nconst AskUserQuestionsConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Enable the `ask_user_question` tool. Default: true.'),\n })\n .openapi('AskUserQuestionsConfig');\n\nexport const RuntimeConfigSchema = z\n .object({\n iteration_limit: z\n .number()\n .int()\n .positive()\n .max(1024)\n .default(DEFAULT_AGENT_CONFIG_ITERATION_LIMIT)\n .describe(\n `Max agent-loop iterations per turn (1–1024). Default: ${String(DEFAULT_AGENT_CONFIG_ITERATION_LIMIT)}.`,\n ),\n sandbox: SandboxConfigSchema.default(() => ({ enabled: false, file_downloads: true })),\n dynamic_sub_agents: DynamicSubAgentsConfigSchema.default(() => ({ enabled: true })),\n context_management: ContextManagementConfigSchema.default(() => ({\n compaction: { enabled: true },\n large_tool_response: { enabled: true },\n })),\n generative_ui: GenerativeUIConfigSchema.default(() => ({ enabled: true })),\n ask_user_questions: AskUserQuestionsConfigSchema.default(() => ({ enabled: true })),\n })\n .openapi('RuntimeConfig');\n\n// --- Skills ---\n// Name-only refs; DB sessions expand mount fields from ISkillStore at turn time.\n\nconst SKILL_NAME_REGEX = /^[A-Za-z0-9._-]+$/;\n\n/** Name-only skill selection; mount fields come from the skill store. */\nconst SkillSchema = z\n .object({\n name: z\n .string()\n .trim()\n .min(1)\n .max(64)\n .regex(SKILL_NAME_REGEX, 'Name may only contain letters, numbers, \".\", \"_\", and \"-\"')\n .refine(v => v !== '.' && v !== '..', 'Name must not be \".\" or \"..\"')\n .refine(v => !v.startsWith('.tfy-'), 'Name must not use the reserved \".tfy-\" prefix')\n .describe('Name of a configured skill (also used as the skill directory name in the sandbox).'),\n })\n .strict()\n .openapi('Skill');\n\n// --- Initial messages (string-only; turn UserMessage also allows file parts) ---\n\nconst InitialUserMessageSchema = z\n .object({\n type: z.literal('user.message').describe('Initial message type.'),\n content: z\n .string()\n .min(1, 'User message content must not be empty')\n .refine(content => content.trim().length > 0, 'User message content must not be empty')\n .describe('Initial user message content injected at the start of every session.'),\n })\n .openapi('InitialUserMessage');\n\n// --- Agent spec ---\n\nexport const AgentSpecSchema = z\n .object({\n model: ModelSchema,\n instructions: z\n .string()\n .optional()\n .describe(\"Optional system prompt — the agent's role, behavior, and constraints.\"),\n messages: z\n .array(InitialUserMessageSchema)\n .optional()\n .describe('Optional initial user messages injected at the start of every session.'),\n mcp_servers: z\n .array(MCPServerRequestSchema)\n .optional()\n .describe('Optional MCP servers attached by configured name.'),\n response_format: ResponseFormatSchema.optional(),\n skills: z\n .array(SkillSchema)\n .optional()\n .describe('Optional name-only skill references. Requires `config.sandbox.enabled: true`.'),\n // Factory must parse so nested RuntimeConfig field defaults materialize.\n config: RuntimeConfigSchema.default(() => RuntimeConfigSchema.parse({})),\n })\n .describe('Complete agent definition used inline on a session or saved as a named agent.')\n .openapi('AgentSpec');\n\nexport type AgentSpec = z.infer<typeof AgentSpecSchema>;\nexport type Skill = z.infer<typeof SkillSchema>;\nexport type InitialUserMessage = z.infer<typeof InitialUserMessageSchema>;\n"],"mappings":";AACA,SAAS,SAAS;AAClB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEA,IAAM,uCAAuC;AAIpD,IAAM,oBAAoB,EACvB,OAAO;AAAA,EACN,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mDAAmD;AAAA,EAC9F,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,EACtG,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,EAC1E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,EACnG,qBAAqB,EAClB,QAAQ,EACR,SAAS,EACT,SAAS,iEAAiE;AAAA,EAC7E,kBAAkB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4DAA4D;AAC/G,CAAC,EACA,MAAM,EACN;AAAA,EACC;AACF,EACC,QAAQ,aAAa;AAGxB,IAAM,cAAc,EACjB,OAAO;AAAA,EACN,MAAM,EACH,OAAO,EACP,IAAI,GAAG,8BAA8B,EACrC,SAAS,qDAAqD;AAAA,EACjE,QAAQ,kBAAkB,SAAS;AACrC,CAAC,EACA,QAAQ,OAAO;AAKlB,IAAM,4BAA4B,EAC/B,OAAO,EACP,IAAI,CAAC,EACL,OAAO,OAAK,CAAC,EAAE,WAAW,GAAG,GAAG,EAAE,SAAS,4BAA4B,CAAC;AAG3E,IAAM,2BAA2B,EAC9B,MAAM,CAAC,EAAE,KAAK,mBAAmB,GAAG,yBAAyB,CAAC,EAC9D,QAAQ,uBAAuB;AAGlC,IAAM,oCAAoC,EACvC,MAAM,CAAC,EAAE,KAAK,oCAAoC,GAAG,yBAAyB,CAAC,EAC/E,QAAQ,+BAA+B;AAI1C,IAAM,yBAAyB,EAC5B,OAAO;AAAA,EACN,MAAM,EACH,OAAO,EACP,IAAI,GAAG,sCAAsC,EAC7C,SAAS,+DAA0D;AAAA;AAAA,EAEtE,cAAc,EACX,MAAM,wBAAwB,EAC9B,QAAQ,oBAAoB,EAC5B,SAAS,+FAA+F;AAAA;AAAA,EAE3G,eAAe,EACZ,MAAM,wBAAwB,EAC9B,QAAQ,qBAAqB,EAC7B,SAAS,uDAAuD;AAAA;AAAA;AAAA,EAGnE,eAAe,EACZ,MAAM,wBAAwB,EAC9B,QAAQ,qBAAqB,EAC7B;AAAA,IACC;AAAA,EACF;AAAA;AAAA,EAEF,4BAA4B,EACzB,MAAM,iCAAiC,EACvC,QAAQ,kCAAkC,EAC1C;AAAA,IACC;AAAA,EACF;AAAA;AAAA;AAAA,EAGF,SAAS,EACN,QAAQ,EACR,SAAS,EACT,QAAQ,KAAK,EACb,SAAS,gFAAgF;AAC9F,CAAC,EACA,QAAQ,WAAW;AAItB,IAAM,qCAAqC,EACxC,OAAO;AAAA,EACN,MAAM,EAAE,QAAQ,cAAc,EAAE,SAAS,oEAAoE;AAAA,EAC7G,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,uDAAuD;AACrG,CAAC,EACA,OAAO,EACP,QAAQ,8BAA8B;AAEzC,IAAM,2BAA2B,EAC9B,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,sEAAsE;AAAA,EAClH,SAAS,mCAAmC,SAAS;AACvD,CAAC,EACA,OAAO,EACP,SAAS,wGAAwG,EACjH,QAAQ,kBAAkB;AAE7B,IAAM,kCAAkC,EAAE,OAAO;AAAA,EAC/C,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,oEAAoE;AAAA,EAChH,0CAA0C,EACvC,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,QAAQ,uCAAuC,EAC/C;AAAA,IACC,0EAA0E,OAAO,uCAAuC,CAAC;AAAA,EAC3H;AAAA,EACF,qCAAqC,EAClC,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,QAAQ,kCAAkC,EAC1C;AAAA,IACC,sEAAsE,OAAO,kCAAkC,CAAC;AAAA,EAClH;AAAA,EACF,8BAA8B,EAC3B,OAAO,EACP,IAAI,EACJ,SAAS,EACT,SAAS,EACT,QAAQ,oCAAoC,EAC5C;AAAA,IACC,oEAAoE,OAAO,oCAAoC,CAAC;AAAA,EAClH;AACJ,CAAC;AAED,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,SAAS,8DAA8D;AAAA,EAC5F,gBAAgB,EACb,QAAQ,EACR,QAAQ,IAAI,EACZ,SAAS,uFAAuF;AACrG,CAAC,EACA,QAAQ,eAAe;AAE1B,IAAM,+BAA+B,EAClC,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,4DAA4D;AAC1G,CAAC,EACA,QAAQ,wBAAwB;AAEnC,IAAM,gCAAgC,gCAAgC,KAAK;AAAA,EACzE,SAAS;AACX,CAAC,EAAE,QAAQ,yBAAyB;AAEpC,IAAM,gCAAgC,EACnC,OAAO;AAAA,EACN,YAAY,yBAAyB,QAAQ,OAAO,EAAE,SAAS,KAAK,EAAE;AAAA,EACtE,qBAAqB,8BAA8B,QAAQ,OAAO,EAAE,SAAS,KAAK,EAAE;AACtF,CAAC,EACA,QAAQ,yBAAyB;AAEpC,IAAM,2BAA2B,EAC9B,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,sDAAsD;AACpG,CAAC,EACA,QAAQ,oBAAoB;AAE/B,IAAM,+BAA+B,EAClC,OAAO;AAAA,EACN,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,qDAAqD;AACnG,CAAC,EACA,QAAQ,wBAAwB;AAE5B,IAAM,sBAAsB,EAChC,OAAO;AAAA,EACN,iBAAiB,EACd,OAAO,EACP,IAAI,EACJ,SAAS,EACT,IAAI,IAAI,EACR,QAAQ,oCAAoC,EAC5C;AAAA,IACC,8DAAyD,OAAO,oCAAoC,CAAC;AAAA,EACvG;AAAA,EACF,SAAS,oBAAoB,QAAQ,OAAO,EAAE,SAAS,OAAO,gBAAgB,KAAK,EAAE;AAAA,EACrF,oBAAoB,6BAA6B,QAAQ,OAAO,EAAE,SAAS,KAAK,EAAE;AAAA,EAClF,oBAAoB,8BAA8B,QAAQ,OAAO;AAAA,IAC/D,YAAY,EAAE,SAAS,KAAK;AAAA,IAC5B,qBAAqB,EAAE,SAAS,KAAK;AAAA,EACvC,EAAE;AAAA,EACF,eAAe,yBAAyB,QAAQ,OAAO,EAAE,SAAS,KAAK,EAAE;AAAA,EACzE,oBAAoB,6BAA6B,QAAQ,OAAO,EAAE,SAAS,KAAK,EAAE;AACpF,CAAC,EACA,QAAQ,eAAe;AAK1B,IAAM,mBAAmB;AAGzB,IAAM,cAAc,EACjB,OAAO;AAAA,EACN,MAAM,EACH,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,kBAAkB,2DAA2D,EACnF,OAAO,OAAK,MAAM,OAAO,MAAM,MAAM,8BAA8B,EACnE,OAAO,OAAK,CAAC,EAAE,WAAW,OAAO,GAAG,+CAA+C,EACnF,SAAS,oFAAoF;AAClG,CAAC,EACA,OAAO,EACP,QAAQ,OAAO;AAIlB,IAAM,2BAA2B,EAC9B,OAAO;AAAA,EACN,MAAM,EAAE,QAAQ,cAAc,EAAE,SAAS,uBAAuB;AAAA,EAChE,SAAS,EACN,OAAO,EACP,IAAI,GAAG,wCAAwC,EAC/C,OAAO,aAAW,QAAQ,KAAK,EAAE,SAAS,GAAG,wCAAwC,EACrF,SAAS,sEAAsE;AACpF,CAAC,EACA,QAAQ,oBAAoB;AAIxB,IAAM,kBAAkB,EAC5B,OAAO;AAAA,EACN,OAAO;AAAA,EACP,cAAc,EACX,OAAO,EACP,SAAS,EACT,SAAS,4EAAuE;AAAA,EACnF,UAAU,EACP,MAAM,wBAAwB,EAC9B,SAAS,EACT,SAAS,wEAAwE;AAAA,EACpF,aAAa,EACV,MAAM,sBAAsB,EAC5B,SAAS,EACT,SAAS,mDAAmD;AAAA,EAC/D,iBAAiB,qBAAqB,SAAS;AAAA,EAC/C,QAAQ,EACL,MAAM,WAAW,EACjB,SAAS,EACT,SAAS,+EAA+E;AAAA;AAAA,EAE3F,QAAQ,oBAAoB,QAAQ,MAAM,oBAAoB,MAAM,CAAC,CAAC,CAAC;AACzE,CAAC,EACA,SAAS,+EAA+E,EACxF,QAAQ,WAAW;","names":[]}
1
+ {"version":3,"sources":["../../../src/agent-session/schemas/agentSpec.ts"],"sourcesContent":["/** DB AgentSpec wire schema — FQN model names and skill refs (name + optional preload). */\nimport { z } from '@hono/zod-openapi';\nimport {\n DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD,\n DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS,\n DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD,\n} from '../../core/capabilities/builtins/LargeToolResponse';\nimport { ResponseFormatSchema } from '../../core/llm/responseFormat';\nimport {\n DEFAULT_DISABLE_TOOLS,\n DEFAULT_ENABLE_TOOLS,\n DEFAULT_PRELOAD_TOOLS,\n DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS,\n REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS,\n TOOLS_SELECTOR_TAGS,\n} from '../../core/mcp/toolSelectors';\n\nexport const DEFAULT_AGENT_CONFIG_ITERATION_LIMIT = 100;\n\n// --- Model ---\n\nconst ModelParamsSchema = z\n .object({\n max_tokens: z.number().optional().describe('Maximum tokens to generate in the model response.'),\n temperature: z.number().optional().describe('Sampling temperature; higher values increase randomness.'),\n top_p: z.number().optional().describe('Nucleus sampling probability mass.'),\n top_k: z.number().optional().describe('Top-k sampling; keep only the k highest-probability tokens.'),\n parallel_tool_calls: z\n .boolean()\n .optional()\n .describe('Whether the model may emit multiple tool calls in one response.'),\n reasoning_effort: z.string().optional().describe('Provider-specific reasoning effort (e.g. low/medium/high).'),\n })\n .loose() // this ensures extra model params are allowed\n .describe(\n 'Model call parameters passed through to the provider. Known keys are documented; extra keys are allowed and forwarded as-is.',\n )\n .openapi('ModelParams');\n\n// Opaque runtime identifier; the hosting server owns naming conventions (e.g. provider/model).\nconst ModelSchema = z\n .object({\n name: z\n .string()\n .min(1, 'model.name must not be empty')\n .describe('Model FQN: `provider/model`, e.g. `openai/gpt-5.2`.'),\n params: ModelParamsSchema.optional(),\n })\n .openapi('Model');\n\n// --- MCP servers ---\n\n// Literal tool name (not a tag).\nconst LiteralToolSelectorSchema = z\n .string()\n .min(1)\n .refine(s => !s.startsWith('@'), { message: 'Invalid tool selector tag' });\n\n// enable_tools / disable_tools / preload_tools: @all, @read-only, or a literal name.\nconst EnableToolSelectorSchema = z\n .union([z.enum(TOOLS_SELECTOR_TAGS), LiteralToolSelectorSchema])\n .openapi('MCPServerToolSelector');\n\n// require_approval_for_tools: @all, @write, @destructive, or a literal name.\nconst RequireApprovalToolSelectorSchema = z\n .union([z.enum(REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS), LiteralToolSelectorSchema])\n .openapi('MCPServerApprovalToolSelector');\n\n// `preload` defaults to false; use `preload_tools` to eagerly load specific tools when not fully preloading.\n// Auth headers are not part of the spec — they come from the configured MCP server store.\nconst MCPServerRequestSchema = z\n .object({\n name: z\n .string()\n .min(1, 'mcp_servers[].name must not be empty')\n .describe('Name of a configured MCP server (Settings → Connectors).'),\n // Which tools to enable. Default: all tools.\n enable_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_ENABLE_TOOLS)\n .describe('Tools exposed to the agent: `@all`, `@read-only`, or literal tool names. Default: `[\"@all\"]`.'),\n // Which tools to disable (subtracted from enable_tools). Default: none.\n disable_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_DISABLE_TOOLS)\n .describe('Tools subtracted from the enabled set. Default: none.'),\n // When the server is not fully preloaded (`preload: false`), which tools to\n // still preload into context. A non-empty list implies `preload: false`.\n preload_tools: z\n .array(EnableToolSelectorSchema)\n .default(DEFAULT_PRELOAD_TOOLS)\n .describe(\n 'Tools loaded eagerly into context while the rest stay deferred. A non-empty list implies `preload: false`.',\n ),\n // Tools that require human approval before execution. Default: @write + @destructive.\n require_approval_for_tools: z\n .array(RequireApprovalToolSelectorSchema)\n .default(DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS)\n .describe(\n 'Tools that pause for human approval: `@all`, `@write`, `@destructive`, or literal names. Default: `[\"@write\", \"@destructive\"]`.',\n ),\n // Whether this server's tools are preloaded into context. Default: false.\n // When false, tools are discovered lazily and only `preload_tools` stay eager.\n preload: z\n .boolean()\n .optional()\n .default(false)\n .describe('When true, load all tool schemas upfront. Default: false (deferred discovery).'),\n })\n .openapi('MCPServer');\n\n// --- Runtime config ---\n\nconst InputTokensCompactionTriggerSchema = z\n .object({\n type: z.literal('input_tokens').describe('Trigger compaction when the estimated input reaches a token limit.'),\n value: z.number().int().positive().describe('Estimated input-token count that triggers compaction.'),\n })\n .strict()\n .openapi('InputTokensCompactionTrigger');\n\nconst CompactionSettingsSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Summarize older history when context grows too large. Default: true.'),\n trigger: InputTokensCompactionTriggerSchema.optional(),\n })\n .strict()\n .describe('Uses 80% of the model context length when the explicit trigger is omitted, or 50000 tokens if unknown.')\n .openapi('CompactionConfig');\n\nconst LargeToolResponseSettingsSchema = z.object({\n enabled: z.boolean().default(true).describe('Offload oversized tool responses to a sandbox file. Default: true.'),\n individual_tool_response_token_threshold: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD)\n .describe(\n `Token threshold for a single tool response before offloading. Default: ${String(DEFAULT_INDIVIDUAL_TOOL_TOKEN_THRESHOLD)}.`,\n ),\n total_tool_response_token_threshold: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD)\n .describe(\n `Combined tool-response token threshold before offloading. Default: ${String(DEFAULT_TOTAL_TOOL_TOKEN_THRESHOLD)}.`,\n ),\n preview_number_of_characters: z\n .number()\n .int()\n .positive()\n .optional()\n .default(DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS)\n .describe(\n `Characters of preview kept in context after offloading. Default: ${String(DEFAULT_PREVIEW_NUMBER_OF_CHARACTERS)}.`,\n ),\n});\n\nconst SandboxConfigSchema = z\n .object({\n enabled: z.boolean().describe('Give the agent a sandbox. Required for skills and Code Mode.'),\n file_downloads: z\n .boolean()\n .default(true)\n .describe('Allow downloading agent-produced files via the turn download endpoint. Default: true.'),\n })\n .openapi('SandboxConfig');\n\nconst DynamicSubAgentsConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Allow the agent to spawn dynamic subagents. Default: true.'),\n })\n .openapi('DynamicSubAgentsConfig');\n\nconst LargeToolResponseConfigSchema = LargeToolResponseSettingsSchema.pick({\n enabled: true,\n}).openapi('LargeToolResponseConfig');\n\nconst ContextManagementConfigSchema = z\n .object({\n compaction: CompactionSettingsSchema.default(() => ({ enabled: true })),\n large_tool_response: LargeToolResponseConfigSchema.default(() => ({ enabled: true })),\n })\n .openapi('ContextManagementConfig');\n\nconst GenerativeUIConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Enable Generative UI (OpenUI blocks). Default: true.'),\n })\n .openapi('GenerativeUIConfig');\n\nconst AskUserQuestionsConfigSchema = z\n .object({\n enabled: z.boolean().default(true).describe('Enable the `ask_user_question` tool. Default: true.'),\n })\n .openapi('AskUserQuestionsConfig');\n\nexport const RuntimeConfigSchema = z\n .object({\n iteration_limit: z\n .number()\n .int()\n .positive()\n .max(1024)\n .default(DEFAULT_AGENT_CONFIG_ITERATION_LIMIT)\n .describe(\n `Max agent-loop iterations per turn (1–1024). Default: ${String(DEFAULT_AGENT_CONFIG_ITERATION_LIMIT)}.`,\n ),\n sandbox: SandboxConfigSchema.default(() => ({ enabled: false, file_downloads: true })),\n dynamic_sub_agents: DynamicSubAgentsConfigSchema.default(() => ({ enabled: true })),\n context_management: ContextManagementConfigSchema.default(() => ({\n compaction: { enabled: true },\n large_tool_response: { enabled: true },\n })),\n generative_ui: GenerativeUIConfigSchema.default(() => ({ enabled: true })),\n ask_user_questions: AskUserQuestionsConfigSchema.default(() => ({ enabled: true })),\n })\n .openapi('RuntimeConfig');\n\n// --- Skills ---\n// Name (+ optional preload) refs; the skill store expands mounts at turn time.\n\nconst SKILL_NAME_REGEX = /^[A-Za-z0-9._\\-/:]+$/;\n\nconst MAX_AGENT_SKILLS = 50;\n\n/** Skill selection; mount fields come from the skill store. */\nconst SkillSchema = z\n .object({\n name: z\n .string()\n .trim()\n .min(1)\n .regex(SKILL_NAME_REGEX, 'Name may only contain letters, numbers, \".\", \"_\", \"-\", \"/\", and \":\"')\n .refine(v => v !== '.' && v !== '..', 'Name must not be \".\" or \"..\"')\n .refine(v => !v.startsWith('.tfy-'), 'Name must not use the reserved \".tfy-\" prefix')\n .describe('Skill name.'),\n preload: z.boolean().optional().default(false).describe('Inline SKILL.md into the prompt.'),\n })\n .strict()\n .openapi('Skill');\n\n// --- Initial messages (string-only; turn UserMessage also allows file parts) ---\n\nconst InitialUserMessageSchema = z\n .object({\n type: z.literal('user.message').describe('Initial message type.'),\n content: z\n .string()\n .min(1, 'User message content must not be empty')\n .refine(content => content.trim().length > 0, 'User message content must not be empty')\n .describe('Initial user message content injected at the start of every session.'),\n })\n .openapi('InitialUserMessage');\n\n// --- Agent spec ---\n\nexport const AgentSpecSchema = z\n .object({\n model: ModelSchema,\n instructions: z\n .string()\n .optional()\n .describe(\"Optional system prompt — the agent's role, behavior, and constraints.\"),\n messages: z\n .array(InitialUserMessageSchema)\n .optional()\n .describe('Optional initial user messages injected at the start of every session.'),\n mcp_servers: z\n .array(MCPServerRequestSchema)\n .optional()\n .describe('Optional MCP servers attached by configured name.'),\n response_format: ResponseFormatSchema.optional(),\n skills: z.array(SkillSchema).max(MAX_AGENT_SKILLS).optional().describe('Skills used in this agent.'),\n // Factory must parse so nested RuntimeConfig field defaults materialize.\n config: RuntimeConfigSchema.default(() => RuntimeConfigSchema.parse({})),\n })\n .describe('Complete agent definition used inline on a session or saved as a named agent.')\n .openapi('AgentSpec');\n\nexport type AgentSpec = z.infer<typeof AgentSpecSchema>;\nexport type Skill = z.infer<typeof SkillSchema>;\nexport type InitialUserMessage = z.infer<typeof InitialUserMessageSchema>;\n"],"mappings":"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","names":[]}