zeitlich 0.2.40 → 0.2.42

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 (134) hide show
  1. package/README.md +12 -1
  2. package/dist/{activities-CvUrG3YG.d.cts → activities-Coafq5zr.d.cts} +2 -2
  3. package/dist/{activities-CULxRzJ1.d.ts → activities-CrN-ghLo.d.ts} +2 -2
  4. package/dist/adapters/sandbox/daytona/index.cjs +4 -23
  5. package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
  6. package/dist/adapters/sandbox/daytona/index.d.cts +18 -86
  7. package/dist/adapters/sandbox/daytona/index.d.ts +18 -86
  8. package/dist/adapters/sandbox/daytona/index.js +4 -23
  9. package/dist/adapters/sandbox/daytona/index.js.map +1 -1
  10. package/dist/adapters/sandbox/daytona/workflow.cjs +1 -7
  11. package/dist/adapters/sandbox/daytona/workflow.cjs.map +1 -1
  12. package/dist/adapters/sandbox/daytona/workflow.d.cts +9 -2
  13. package/dist/adapters/sandbox/daytona/workflow.d.ts +9 -2
  14. package/dist/adapters/sandbox/daytona/workflow.js +1 -7
  15. package/dist/adapters/sandbox/daytona/workflow.js.map +1 -1
  16. package/dist/adapters/sandbox/e2b/index.cjs +21 -3
  17. package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
  18. package/dist/adapters/sandbox/e2b/index.d.cts +48 -7
  19. package/dist/adapters/sandbox/e2b/index.d.ts +48 -7
  20. package/dist/adapters/sandbox/e2b/index.js +22 -5
  21. package/dist/adapters/sandbox/e2b/index.js.map +1 -1
  22. package/dist/adapters/sandbox/e2b/workflow.cjs.map +1 -1
  23. package/dist/adapters/sandbox/e2b/workflow.d.cts +4 -2
  24. package/dist/adapters/sandbox/e2b/workflow.d.ts +4 -2
  25. package/dist/adapters/sandbox/e2b/workflow.js.map +1 -1
  26. package/dist/adapters/sandbox/inmemory/index.cjs +11 -0
  27. package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
  28. package/dist/adapters/sandbox/inmemory/index.d.cts +11 -3
  29. package/dist/adapters/sandbox/inmemory/index.d.ts +11 -3
  30. package/dist/adapters/sandbox/inmemory/index.js +11 -1
  31. package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
  32. package/dist/adapters/sandbox/inmemory/workflow.cjs.map +1 -1
  33. package/dist/adapters/sandbox/inmemory/workflow.d.cts +4 -2
  34. package/dist/adapters/sandbox/inmemory/workflow.d.ts +4 -2
  35. package/dist/adapters/sandbox/inmemory/workflow.js.map +1 -1
  36. package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
  37. package/dist/adapters/thread/anthropic/index.d.cts +6 -6
  38. package/dist/adapters/thread/anthropic/index.d.ts +6 -6
  39. package/dist/adapters/thread/anthropic/index.js.map +1 -1
  40. package/dist/adapters/thread/anthropic/workflow.d.cts +6 -6
  41. package/dist/adapters/thread/anthropic/workflow.d.ts +6 -6
  42. package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
  43. package/dist/adapters/thread/google-genai/index.d.cts +6 -6
  44. package/dist/adapters/thread/google-genai/index.d.ts +6 -6
  45. package/dist/adapters/thread/google-genai/index.js.map +1 -1
  46. package/dist/adapters/thread/google-genai/workflow.d.cts +6 -6
  47. package/dist/adapters/thread/google-genai/workflow.d.ts +6 -6
  48. package/dist/adapters/thread/langchain/index.cjs.map +1 -1
  49. package/dist/adapters/thread/langchain/index.d.cts +6 -6
  50. package/dist/adapters/thread/langchain/index.d.ts +6 -6
  51. package/dist/adapters/thread/langchain/index.js.map +1 -1
  52. package/dist/adapters/thread/langchain/workflow.d.cts +6 -6
  53. package/dist/adapters/thread/langchain/workflow.d.ts +6 -6
  54. package/dist/index.cjs +316 -119
  55. package/dist/index.cjs.map +1 -1
  56. package/dist/index.d.cts +93 -17
  57. package/dist/index.d.ts +93 -17
  58. package/dist/index.js +317 -120
  59. package/dist/index.js.map +1 -1
  60. package/dist/{proxy-5EbwzaY4.d.cts → proxy-Bf7uI-Hw.d.cts} +1 -1
  61. package/dist/{proxy-wZufFfBh.d.ts → proxy-COqA95FW.d.ts} +1 -1
  62. package/dist/{thread-manager-BqBAIsED.d.ts → thread-manager-BhkOyQ1I.d.ts} +2 -2
  63. package/dist/{thread-manager-BNiIt5r8.d.ts → thread-manager-Bi1XlbpJ.d.ts} +2 -2
  64. package/dist/{thread-manager-DF8WuCRs.d.cts → thread-manager-BsLO3Fgc.d.cts} +2 -2
  65. package/dist/{thread-manager-BoN5DOvG.d.cts → thread-manager-wRVVBFgj.d.cts} +2 -2
  66. package/dist/{types-C7OoY7h8.d.ts → types-BkX4HLzi.d.ts} +1 -1
  67. package/dist/{types-CuISs0Ub.d.cts → types-C66-BVBr.d.cts} +1 -1
  68. package/dist/types-CJ7tCdl6.d.cts +266 -0
  69. package/dist/types-CJ7tCdl6.d.ts +266 -0
  70. package/dist/{types-DeQH84C_.d.ts → types-CdALEF3z.d.cts} +342 -23
  71. package/dist/{types-Cn2r3ol3.d.cts → types-ChAy_jSP.d.ts} +342 -23
  72. package/dist/types-CjY93AWZ.d.cts +84 -0
  73. package/dist/types-gVa5XCWD.d.ts +84 -0
  74. package/dist/{workflow-DhplIN65.d.cts → workflow-BwT5EybR.d.ts} +7 -6
  75. package/dist/{workflow-C2MZZj5K.d.ts → workflow-DMmiaw6w.d.cts} +7 -6
  76. package/dist/workflow.cjs +138 -77
  77. package/dist/workflow.cjs.map +1 -1
  78. package/dist/workflow.d.cts +4 -4
  79. package/dist/workflow.d.ts +4 -4
  80. package/dist/workflow.js +139 -78
  81. package/dist/workflow.js.map +1 -1
  82. package/package.json +17 -33
  83. package/src/adapters/sandbox/daytona/index.ts +25 -48
  84. package/src/adapters/sandbox/daytona/proxy.ts +7 -8
  85. package/src/adapters/sandbox/e2b/README.md +81 -0
  86. package/src/adapters/sandbox/e2b/index.ts +53 -11
  87. package/src/adapters/sandbox/e2b/keep-alive.test.ts +115 -0
  88. package/src/adapters/sandbox/e2b/proxy.ts +3 -2
  89. package/src/adapters/sandbox/e2b/types.ts +34 -2
  90. package/src/adapters/sandbox/inmemory/index.ts +21 -1
  91. package/src/adapters/sandbox/inmemory/proxy.ts +7 -3
  92. package/src/index.ts +1 -1
  93. package/src/lib/activity.ts +5 -0
  94. package/src/lib/sandbox/capability-types.test.ts +859 -0
  95. package/src/lib/sandbox/index.ts +1 -0
  96. package/src/lib/sandbox/manager.ts +187 -31
  97. package/src/lib/sandbox/types.ts +189 -46
  98. package/src/lib/session/index.ts +1 -0
  99. package/src/lib/session/session.integration.test.ts +58 -0
  100. package/src/lib/session/session.ts +109 -50
  101. package/src/lib/session/types.ts +189 -8
  102. package/src/lib/subagent/handler.ts +66 -43
  103. package/src/lib/subagent/subagent.integration.test.ts +2 -0
  104. package/src/lib/subagent/types.ts +492 -16
  105. package/src/lib/subagent/workflow.ts +11 -1
  106. package/src/lib/tool-router/auto-append-sandbox.integration.test.ts +158 -0
  107. package/src/lib/tool-router/index.ts +1 -1
  108. package/src/lib/tool-router/with-sandbox.ts +45 -2
  109. package/src/lib/virtual-fs/filesystem.ts +41 -16
  110. package/src/lib/virtual-fs/types.ts +19 -0
  111. package/src/lib/virtual-fs/virtual-fs.test.ts +204 -1
  112. package/src/tools/read-file/handler.test.ts +83 -0
  113. package/src/workflow.ts +3 -0
  114. package/tsup.config.ts +0 -4
  115. package/dist/adapters/sandbox/bedrock/index.cjs +0 -457
  116. package/dist/adapters/sandbox/bedrock/index.cjs.map +0 -1
  117. package/dist/adapters/sandbox/bedrock/index.d.cts +0 -25
  118. package/dist/adapters/sandbox/bedrock/index.d.ts +0 -25
  119. package/dist/adapters/sandbox/bedrock/index.js +0 -454
  120. package/dist/adapters/sandbox/bedrock/index.js.map +0 -1
  121. package/dist/adapters/sandbox/bedrock/workflow.cjs +0 -36
  122. package/dist/adapters/sandbox/bedrock/workflow.cjs.map +0 -1
  123. package/dist/adapters/sandbox/bedrock/workflow.d.cts +0 -29
  124. package/dist/adapters/sandbox/bedrock/workflow.d.ts +0 -29
  125. package/dist/adapters/sandbox/bedrock/workflow.js +0 -34
  126. package/dist/adapters/sandbox/bedrock/workflow.js.map +0 -1
  127. package/dist/types-DAsQ21Rt.d.ts +0 -74
  128. package/dist/types-lm8tMNJQ.d.cts +0 -74
  129. package/dist/types-yx0LzPGn.d.cts +0 -173
  130. package/dist/types-yx0LzPGn.d.ts +0 -173
  131. package/src/adapters/sandbox/bedrock/filesystem.ts +0 -340
  132. package/src/adapters/sandbox/bedrock/index.ts +0 -274
  133. package/src/adapters/sandbox/bedrock/proxy.ts +0 -59
  134. package/src/adapters/sandbox/bedrock/types.ts +0 -24
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/tool-router/router.ts","../src/lib/thread/id.ts","../src/lib/subagent/tool.ts","../src/lib/subagent/signals.ts","../src/lib/subagent/handler.ts","../src/lib/subagent/register.ts","../src/lib/skills/tool.ts","../src/lib/skills/handler.ts","../src/lib/skills/register.ts","../src/lib/session/session.ts","../src/lib/workflow.ts","../src/lib/thread/keys.ts","../src/lib/types.ts","../src/lib/state/manager.ts","../src/lib/subagent/define.ts","../src/lib/subagent/workflow.ts","../src/lib/observability/hooks.ts","../src/lib/model/proxy.ts","../src/lib/sandbox/types.ts","../src/lib/virtual-fs/mutations.ts","../src/lib/virtual-fs/tree.ts","../src/lib/virtual-fs/queries.ts","../src/lib/virtual-fs/proxy.ts","../src/lib/skills/parse.ts","../src/tools/glob/tool.ts","../src/tools/grep/tool.ts","../src/tools/read-file/tool.ts","../src/tools/write-file/tool.ts","../src/tools/edit/tool.ts","../src/tools/task-create/tool.ts","../src/tools/task-create/handler.ts","../src/tools/task-get/tool.ts","../src/tools/task-get/handler.ts","../src/tools/task-list/tool.ts","../src/tools/task-list/handler.ts","../src/tools/task-update/tool.ts","../src/tools/task-update/handler.ts","../src/tools/bash/tool.ts","../src/tools/ask-user-question/tool.ts","../src/tools/ask-user-question/handler.ts"],"names":["results","uuid4","z","log","setHandler","ApplicationFailure","condition","defineUpdate","workflowInfo","proxyActivities","key","rawVal"],"mappings":"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","file":"workflow.js","sourcesContent":["import type {\n ToolMap,\n ToolDefinition,\n RouterContext,\n ToolHandler,\n RawToolCall,\n ParsedToolCallUnion,\n ParsedToolCall,\n ToolCallResult,\n ToolCallResultUnion,\n InferToolResults,\n ToolRouterOptions,\n ToolRouter,\n ToolNames,\n ToolArgs,\n ToolResult,\n ProcessToolCallsContext,\n ProcessToolCallsResult,\n RewindSignal,\n ToolWithHandler,\n} from \"./types\";\n\nimport type { JsonValue } from \"../state/types\";\nimport type { z } from \"zod\";\nimport {\n uuid4,\n log,\n CancellationScope,\n isCancellation,\n} from \"@temporalio/workflow\";\n\n/**\n * Creates a tool router for declarative tool call processing.\n * Combines tool definitions with handlers in a single API.\n *\n * @example\n * ```typescript\n * const router = createToolRouter({\n * threadId,\n * tools: {\n * Read: {\n * name: \"FileRead\",\n * description: \"Read file contents\",\n * schema: z.object({ path: z.string() }),\n * handler: async (args, ctx) => ({\n * content: `Read ${args.path}`,\n * result: { path: args.path, content: \"...\" },\n * }),\n * },\n * },\n * hooks: { onPreToolUse, onPostToolUse },\n * });\n *\n * // Parse raw tool calls from LLM\n * const parsed = router.parseToolCall(rawToolCall);\n *\n * // Process tool calls\n * const results = await router.processToolCalls([parsed]);\n * ```\n */\nexport function createToolRouter<T extends ToolMap>(\n options: ToolRouterOptions<T>\n): ToolRouter<T> {\n const { appendToolResult } = options;\n type TResults = InferToolResults<T>;\n\n // Build internal lookup map by tool name\n const toolMap = new Map<string, ToolMap[string]>();\n for (const [_key, tool] of Object.entries(options.tools)) {\n toolMap.set(tool.name, tool as T[keyof T]);\n }\n\n const resolve = <T>(v: T | (() => T)): T =>\n typeof v === \"function\" ? (v as () => T)() : v;\n\n const isEnabled = (tool: ToolMap[string]): boolean =>\n resolve(tool.enabled) ?? true;\n\n if (options.plugins) {\n for (const plugin of options.plugins) {\n toolMap.set(plugin.name, plugin);\n }\n }\n\n /** Run global → per-tool pre-hooks. Returns null to skip, or the (possibly modified) args. */\n async function runPreHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n turn: number\n ): Promise<{ skip: true } | { skip: false; args: unknown }> {\n let effectiveArgs: unknown = toolCall.args;\n\n if (options.hooks?.onPreToolUse) {\n const preResult = await options.hooks.onPreToolUse({\n toolCall,\n threadId: options.threadId,\n turn,\n });\n if (preResult?.skip) return { skip: true };\n if (preResult?.modifiedArgs !== undefined)\n effectiveArgs = preResult.modifiedArgs;\n }\n\n if (tool?.hooks?.onPreToolUse) {\n const preResult = await tool.hooks.onPreToolUse({\n args: effectiveArgs,\n threadId: options.threadId,\n turn,\n });\n if (preResult?.skip) return { skip: true };\n if (preResult?.modifiedArgs !== undefined)\n effectiveArgs = preResult.modifiedArgs;\n }\n\n return { skip: false, args: effectiveArgs };\n }\n\n /**\n * Run per-tool → global failure hooks. Returns recovery content/result,\n * or a generic error response if no hook recovers.\n */\n async function runFailureHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n error: unknown,\n effectiveArgs: unknown,\n turn: number\n ): Promise<{ content: JsonValue; result: unknown }> {\n const err = error instanceof Error ? error : new Error(String(error));\n const errorStr = String(error);\n\n if (tool?.hooks?.onPostToolUseFailure) {\n const r = await tool.hooks.onPostToolUseFailure({\n args: effectiveArgs,\n error: err,\n threadId: options.threadId,\n turn,\n });\n if (r?.fallbackContent !== undefined)\n return {\n content: r.fallbackContent,\n result: { error: errorStr, recovered: true },\n };\n if (r?.suppress)\n return {\n content: JSON.stringify({ error: errorStr, suppressed: true }),\n result: { error: errorStr, suppressed: true },\n };\n }\n\n if (options.hooks?.onPostToolUseFailure) {\n const r = await options.hooks.onPostToolUseFailure({\n toolCall,\n error: err,\n threadId: options.threadId,\n turn,\n });\n if (r?.fallbackContent !== undefined)\n return {\n content: r.fallbackContent,\n result: { error: errorStr, recovered: true },\n };\n if (r?.suppress)\n return {\n content: JSON.stringify({ error: errorStr, suppressed: true }),\n result: { error: errorStr, suppressed: true },\n };\n }\n\n return {\n content: JSON.stringify({\n error:\n \"The tool encountered an error. Please try again or use a different approach.\",\n }),\n result: { error: errorStr, suppressed: true },\n };\n }\n\n /** Run per-tool → global post-hooks. */\n async function runPostHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n toolResult: ToolCallResultUnion<TResults>,\n effectiveArgs: unknown,\n turn: number,\n durationMs: number\n ): Promise<void> {\n if (tool?.hooks?.onPostToolUse) {\n await tool.hooks.onPostToolUse({\n args: effectiveArgs,\n result: toolResult.data,\n threadId: options.threadId,\n turn,\n durationMs,\n ...(toolResult.metadata && { metadata: toolResult.metadata }),\n });\n }\n if (options.hooks?.onPostToolUse) {\n await options.hooks.onPostToolUse({\n toolCall,\n result: toolResult,\n threadId: options.threadId,\n turn,\n durationMs,\n });\n }\n }\n\n /**\n * Internal per-tool-call outcome. `rewind` signals the caller that the\n * handler requested a session-level rewind; when present, the result is\n * not appended to the thread and siblings should be cancelled.\n */\n type ProcessedToolCall =\n | { kind: \"result\"; value: ToolCallResultUnion<TResults> }\n | { kind: \"rewind\"; signal: RewindSignal }\n | { kind: \"skipped\" };\n\n async function processToolCall(\n toolCall: ParsedToolCallUnion<T>,\n turn: number,\n sandboxId?: string,\n onRewindRequested?: (signal: RewindSignal) => void\n ): Promise<ProcessedToolCall> {\n const startTime = Date.now();\n const tool = toolMap.get(toolCall.name);\n\n // --- Pre-hooks: may skip or modify args ---\n const preResult = await runPreHooks(toolCall, tool, turn);\n if (preResult.skip) {\n await appendToolResult(uuid4(), {\n threadId: options.threadId,\n threadKey: options.threadKey,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content: JSON.stringify({\n skipped: true,\n reason: \"Skipped by PreToolUse hook\",\n }),\n });\n return { kind: \"skipped\" };\n }\n const effectiveArgs = preResult.args;\n\n log.debug(\"tool call dispatched\", {\n toolName: toolCall.name,\n toolCallId: toolCall.id,\n turn,\n });\n\n // --- Execute handler ---\n let result: unknown;\n let content!: JsonValue;\n let resultAppended = false;\n let metadata: Record<string, unknown> | undefined;\n let rewindRequested = false;\n\n try {\n if (tool) {\n const routerContext: RouterContext = {\n threadId: options.threadId,\n ...(options.threadKey && { threadKey: options.threadKey }),\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n ...(sandboxId !== undefined && { sandboxId }),\n };\n const response = await tool.handler(\n effectiveArgs as Parameters<typeof tool.handler>[0],\n routerContext as Parameters<typeof tool.handler>[1]\n );\n result = response.data;\n content = response.toolResponse as JsonValue;\n resultAppended = response.resultAppended === true;\n metadata = response.metadata;\n rewindRequested = response.rewind === true;\n } else {\n result = { error: `Unknown tool: ${toolCall.name}` };\n content = JSON.stringify(result, null, 2);\n }\n } catch (error) {\n if (isCancellation(error)) {\n throw error;\n }\n log.warn(\"tool call failed\", {\n toolName: toolCall.name,\n toolCallId: toolCall.id,\n turn,\n durationMs: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n });\n const recovery = await runFailureHooks(\n toolCall,\n tool,\n error,\n effectiveArgs,\n turn\n );\n result = recovery.result;\n content = recovery.content;\n }\n\n if (rewindRequested) {\n const signal: RewindSignal = {\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n };\n log.info(\"tool requested rewind\", { ...signal });\n onRewindRequested?.(signal);\n return { kind: \"rewind\", signal };\n }\n\n // --- Append result to thread (unless handler already did) ---\n if (!resultAppended) {\n const config = {\n threadId: options.threadId,\n threadKey: options.threadKey,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content,\n };\n await appendToolResult.executeWithOptions(\n {\n summary: `Append ${toolCall.name} result`,\n },\n [uuid4(), config]\n );\n }\n\n const durationMs = Date.now() - startTime;\n\n const toolResult = {\n toolCallId: toolCall.id,\n name: toolCall.name,\n data: result,\n ...(metadata && { metadata }),\n } as ToolCallResultUnion<TResults>;\n\n log.debug(\"tool call completed\", {\n toolName: toolCall.name,\n toolCallId: toolCall.id,\n turn,\n durationMs,\n });\n\n // --- Post-hooks ---\n await runPostHooks(\n toolCall,\n tool,\n toolResult,\n effectiveArgs,\n turn,\n durationMs\n );\n\n return { kind: \"result\", value: toolResult };\n }\n\n return {\n hasTools(): boolean {\n return Array.from(toolMap.values()).some(isEnabled);\n },\n\n parseToolCall(toolCall: RawToolCall): ParsedToolCallUnion<T> {\n const tool = toolMap.get(toolCall.name);\n\n if (!tool || !isEnabled(tool)) {\n throw new Error(`Tool ${toolCall.name} not found`);\n }\n\n const parsedArgs = resolve(tool.schema).parse(toolCall.args);\n\n return {\n id: toolCall.id ?? \"\",\n name: toolCall.name,\n args: parsedArgs,\n } as ParsedToolCallUnion<T>;\n },\n\n hasTool(name: string): boolean {\n const tool = toolMap.get(name);\n return tool !== undefined && isEnabled(tool);\n },\n\n getToolNames(): ToolNames<T>[] {\n return Array.from(toolMap.entries())\n .filter(([, tool]) => isEnabled(tool))\n .map(([name]) => name) as ToolNames<T>[];\n },\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(toolMap)\n .filter(([, tool]) => isEnabled(tool))\n .map(([name, tool]) => ({\n name,\n description: resolve(tool.description),\n schema: resolve(tool.schema),\n strict: tool.strict,\n max_uses: tool.max_uses,\n }));\n },\n\n async processToolCalls(\n toolCalls: ParsedToolCallUnion<T>[],\n context?: ProcessToolCallsContext\n ): Promise<ProcessToolCallsResult<TResults>> {\n const attachRewind = (\n arr: ToolCallResultUnion<TResults>[],\n rewind: RewindSignal | undefined,\n ): ProcessToolCallsResult<TResults> => {\n if (rewind) {\n (arr as ProcessToolCallsResult<TResults>).rewind = rewind;\n }\n return arr as ProcessToolCallsResult<TResults>;\n };\n\n if (toolCalls.length === 0) {\n return attachRewind([], undefined);\n }\n\n const turn = context?.turn ?? 0;\n const sandboxId = context?.sandboxId;\n\n let rewindSignal: RewindSignal | undefined;\n\n if (options.parallel) {\n const scope = new CancellationScope({ cancellable: true });\n const onRewindRequested = (signal: RewindSignal): void => {\n if (!rewindSignal) {\n rewindSignal = signal;\n // Cancel all other in-flight tool calls in this batch.\n scope.cancel();\n }\n };\n\n const outcomes = await scope.run(async () =>\n Promise.allSettled(\n toolCalls.map((tc) =>\n processToolCall(tc, turn, sandboxId, onRewindRequested)\n )\n )\n );\n\n const results: ToolCallResultUnion<TResults>[] = [];\n for (const outcome of outcomes) {\n if (outcome.status === \"rejected\") {\n if (isCancellation(outcome.reason)) {\n continue;\n }\n throw outcome.reason;\n }\n if (outcome.value.kind === \"result\") {\n results.push(outcome.value.value);\n }\n }\n return attachRewind(results, rewindSignal);\n }\n\n const results: ToolCallResultUnion<TResults>[] = [];\n for (const toolCall of toolCalls) {\n const outcome = await processToolCall(toolCall, turn, sandboxId);\n if (outcome.kind === \"rewind\") {\n rewindSignal = outcome.signal;\n break;\n }\n if (outcome.kind === \"result\") {\n results.push(outcome.value);\n }\n }\n return attachRewind(results, rewindSignal);\n },\n\n async processToolCallsByName<TName extends ToolNames<T>, TResult>(\n toolCalls: ParsedToolCallUnion<T>[],\n toolName: TName,\n handler: ToolHandler<ToolArgs<T, TName>, TResult>,\n context?: ProcessToolCallsContext\n ): Promise<ToolCallResult<TName, TResult>[]> {\n const matchingCalls = toolCalls.filter((tc) => tc.name === toolName);\n\n if (matchingCalls.length === 0) {\n return [];\n }\n\n const processOne = async (\n toolCall: ParsedToolCallUnion<T>\n ): Promise<ToolCallResult<TName, TResult>> => {\n const routerContext: RouterContext = {\n threadId: options.threadId,\n ...(options.threadKey && { threadKey: options.threadKey }),\n toolCallId: toolCall.id,\n toolName: toolCall.name as TName,\n ...(context?.sandboxId !== undefined && {\n sandboxId: context.sandboxId,\n }),\n };\n const response = await handler(\n toolCall.args as ToolArgs<T, TName>,\n routerContext as Parameters<typeof handler>[1]\n );\n\n if (!response.resultAppended) {\n await appendToolResult.executeWithOptions(\n {\n summary: `Append ${toolCall.name} result`,\n },\n [\n uuid4(),\n {\n threadId: options.threadId,\n threadKey: options.threadKey,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content: response.toolResponse as JsonValue,\n },\n ]\n );\n }\n\n return {\n toolCallId: toolCall.id,\n name: toolCall.name as TName,\n data: response.data,\n ...(response.metadata && { metadata: response.metadata }),\n };\n };\n\n if (options.parallel) {\n return Promise.all(matchingCalls.map(processOne));\n }\n\n const results: ToolCallResult<TName, TResult>[] = [];\n for (const toolCall of matchingCalls) {\n results.push(await processOne(toolCall));\n }\n return results;\n },\n\n filterByName<TName extends ToolNames<T>>(\n toolCalls: ParsedToolCallUnion<T>[],\n name: TName\n ): ParsedToolCall<TName, ToolArgs<T, TName>>[] {\n return toolCalls.filter(\n (tc): tc is ParsedToolCall<TName, ToolArgs<T, TName>> =>\n tc.name === name\n );\n },\n\n hasToolCall(\n toolCalls: ParsedToolCallUnion<T>[],\n name: ToolNames<T>\n ): boolean {\n return toolCalls.some((tc) => tc.name === name);\n },\n\n getResultsByName<TName extends ToolNames<T>>(\n results: ToolCallResultUnion<TResults>[],\n name: TName\n ): ToolCallResult<TName, ToolResult<T, TName>>[] {\n return results.filter((r) => r.name === name) as ToolCallResult<\n TName,\n ToolResult<T, TName>\n >[];\n },\n };\n}\n\n/**\n * Identity function that creates a generic inference context for a tool definition.\n * TypeScript infers TResult from the handler and flows it to hooks automatically.\n *\n * @example\n * ```typescript\n * tools: {\n * AskUser: defineTool({\n * ...askUserTool,\n * handler: handleAskUser,\n * hooks: {\n * onPostToolUse: ({ result }) => {\n * // result is correctly typed as the handler's return data type\n * },\n * },\n * }),\n * }\n * ```\n */\nexport function defineTool<\n TName extends string,\n TSchema extends z.ZodType,\n TResult,\n TContext extends RouterContext = RouterContext,\n TToolResponse = JsonValue,\n>(\n tool: ToolWithHandler<TName, TSchema, TResult, TContext, TToolResponse>\n): ToolWithHandler<TName, TSchema, TResult, TContext, TToolResponse> {\n return tool;\n}\n\n/**\n * Utility to check if there were no tool calls besides a specific one\n */\nexport function hasNoOtherToolCalls<T extends ToolMap>(\n toolCalls: ParsedToolCallUnion<T>[],\n excludeName: ToolNames<T>\n): boolean {\n return toolCalls.filter((tc) => tc.name !== excludeName).length === 0;\n}\n","import { uuid4 } from \"@temporalio/workflow\";\n\nconst BASE62 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n/**\n * Generate a compact, workflow-deterministic identifier.\n *\n * Uses Temporal's `uuid4()` internally (seeded by the workflow's RNG),\n * then re-encodes the hex bytes into a base-62 alphabet for a shorter,\n * more token-efficient identifier (~3 tokens vs ~10 for a full UUID).\n *\n * Suitable for thread IDs, child workflow IDs, or any workflow-scoped identifier.\n *\n * @param length - Number of base-62 characters (default 12, ~71 bits of entropy)\n */\nexport function getShortId(length = 12): string {\n const hex = uuid4().replace(/-/g, \"\");\n let result = \"\";\n for (let i = 0; i < length; i++) {\n const byte = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n result += BASE62[byte % BASE62.length];\n }\n return result;\n}\n","import z from \"zod\";\nimport type { SubagentConfig } from \"./types\";\n\nexport const SUBAGENT_TOOL_NAME = \"Subagent\" as const;\n\nfunction buildSubagentDescription(subagents: SubagentConfig[]): string {\n const subagentList = subagents\n .map((s) => {\n const continuation =\n s.thread && s.thread !== \"new\"\n ? \"\\n*(Supports thread continuation — pass a threadId to resume a previous conversation)*\"\n : \"\";\n return `## ${s.agentName}\\n${s.description}${continuation}`;\n })\n .join(\"\\n\\n\");\n\n return `The ${SUBAGENT_TOOL_NAME} tool launches specialized agents (subagents) that autonomously handle complex work. Each agent type has specific capabilities and tools available to it.\n\n# Available subagents:\n${subagentList}\n`;\n}\n\n/**\n * Creates a Subagent tool configured with the available subagents.\n *\n * @param subagents - Array of subagent configurations (must have at least one)\n * @returns A tool definition with dynamic schema based on available subagents\n */\nexport function createSubagentTool<T extends SubagentConfig[]>(\n subagents: T\n): {\n readonly name: typeof SUBAGENT_TOOL_NAME;\n readonly description: string;\n readonly schema: z.ZodObject<z.ZodRawShape>;\n} {\n if (subagents.length === 0) {\n throw new Error(\"createSubagentTool requires at least one subagent\");\n }\n\n const names = subagents.map((s) => s.agentName);\n const hasThreadContinuation = subagents.some(\n (s) => s.thread && s.thread !== \"new\"\n );\n\n const baseFields = {\n subagent: z.enum(names).describe(\"The type of subagent to launch\"),\n description: z\n .string()\n .describe(\"A short (3-5 word) description of the task\"),\n prompt: z.string().describe(\"The task for the agent to perform\"),\n };\n\n const schema = hasThreadContinuation\n ? z.object({\n ...baseFields,\n threadId: z\n .string()\n .nullable()\n .describe(\n \"Thread ID to continue an existing conversation from the same subagent, or null to start a new one\"\n ),\n })\n : z.object(baseFields);\n\n return {\n name: SUBAGENT_TOOL_NAME,\n description: buildSubagentDescription(subagents),\n schema,\n } as const;\n}\n\n/**\n * Subagent tool args type (when subagent names are not known at compile time)\n */\nexport type SubagentArgs = {\n subagent: string;\n description: string;\n prompt: string;\n threadId?: string | null;\n};\n","import { defineSignal } from \"@temporalio/workflow\";\nimport type { ChildSandboxReadySignalPayload } from \"./types\";\n\n/** Sent by a child workflow as soon as its sandbox is created, before the agent loop starts. */\nexport const childSandboxReadySignal =\n defineSignal<[ChildSandboxReadySignalPayload]>(\"childSandboxReady\");\n","import {\n workflowInfo,\n setHandler,\n condition,\n log,\n ApplicationFailure,\n executeChild,\n} from \"@temporalio/workflow\";\nimport { getShortId } from \"../thread/id\";\nimport type { ToolHandlerResponse, RouterContext } from \"../tool-router\";\nimport type { JsonValue } from \"../state/types\";\nimport type {\n InferSubagentResult,\n SubagentConfig,\n SubagentFnResult,\n SubagentSandboxConfig,\n SubagentWorkflowInput,\n} from \"./types\";\nimport type { SubagentArgs } from \"./tool\";\nimport type { z } from \"zod\";\nimport type {\n ThreadInit,\n SandboxInit,\n SubagentSandboxShutdown,\n} from \"../lifecycle\";\nimport type { SandboxOps, SandboxSnapshot } from \"../sandbox/types\";\nimport { childSandboxReadySignal } from \"./signals\";\n\n/**\n * Default `workflowRunTimeout` applied to every subagent child workflow\n * unless overridden via `SubagentConfig.workflowOptions.workflowRunTimeout`.\n *\n * Chosen as a safety bound: Temporal retries failing workflow tasks forever\n * by default, so a child that fails to initialize (e.g. missing workflow\n * export) or is otherwise broken will never reach a terminal state on its\n * own and the parent's `Subagent` tool call would hang indefinitely. A\n * bounded run timeout guarantees the child is eventually terminated and the\n * parent receives a structured `ChildWorkflowFailure` it can surface to the\n * agent. One hour is generous enough for realistic agent sessions while\n * still catching hangs; agents that legitimately need longer should set an\n * explicit `workflowOptions.workflowRunTimeout`.\n */\nexport const DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT = \"1h\";\n\n/** Normalized sandbox config after resolving the union. */\ninterface ResolvedSandboxConfig {\n source: \"none\" | \"inherit\" | \"own\";\n init: \"per-call\" | \"once\";\n continuation: \"continue\" | \"fork\" | \"snapshot\";\n shutdown?: SubagentSandboxShutdown;\n}\n\nfunction resolveSandboxConfig(\n config?: SubagentSandboxConfig\n): ResolvedSandboxConfig {\n if (!config || config === \"none\") {\n return { source: \"none\", init: \"per-call\", continuation: \"fork\" };\n }\n if (config.source === \"inherit\") {\n return {\n source: \"inherit\",\n init: \"per-call\",\n continuation: config.continuation,\n shutdown: config.shutdown,\n };\n }\n return {\n source: \"own\",\n init: config.init ?? \"per-call\",\n continuation: config.continuation,\n shutdown: config.shutdown,\n };\n}\n\n/**\n * Creates a Subagent tool handler that spawns child workflows for configured subagents.\n *\n * Sandbox and snapshot cleanup happens inside the parent via each subagent's\n * `sandbox.proxy` — the proxy factory is invoked once per subagent with\n * `scope = agentName` so it resolves to the same activities the child uses.\n *\n * @param subagents - Array of subagent configurations\n * @returns A tool handler function that can be used with the tool router\n */\nexport function createSubagentHandler<\n const T extends readonly SubagentConfig[],\n>(\n subagents: [...T]\n): {\n handler: (\n args: SubagentArgs,\n context: RouterContext\n ) => Promise<ToolHandlerResponse<InferSubagentResult<T[number]> | null>>;\n destroySubagentSandboxes: () => Promise<void>;\n cleanupSubagentSnapshots: () => Promise<void>;\n} {\n const { taskQueue: parentTaskQueue } = workflowInfo();\n\n /** Sandbox ops proxy per subagent, built eagerly from `sandbox.proxy` factories. */\n const agentSandboxOps = new Map<string, SandboxOps>();\n for (const cfg of subagents) {\n if (cfg.sandbox && cfg.sandbox !== \"none\") {\n agentSandboxOps.set(cfg.agentName, cfg.sandbox.proxy(cfg.agentName));\n }\n }\n\n /**\n * Sandboxes that outlived their child session and must be destroyed by the\n * parent at shutdown (shutdown = `pause-until-parent-close` /\n * `keep-until-parent-close`). Keyed by `persistent:<agent>` for lazy\n * shared sandboxes and by childWorkflowId otherwise.\n */\n const pendingDestroys = new Map<\n string,\n { agentName: string; sandboxId: string }\n >();\n /** Maps childThreadId → sandboxId for sandbox continuation across invocations (init: per-call) */\n const threadSandboxes = new Map<string, string>();\n /** Maps agentName → sandboxId for persistent sandboxes (init: once) */\n const persistentSandboxes = new Map<string, string>();\n /** Tracks agents whose first lazy sandbox creation is in-flight (guards concurrent init) */\n const persistentSandboxCreating = new Set<string>();\n /**\n * Latest failure from a lazy-creator call, keyed by agentName. Populated\n * when a creator's `executeChild` throws, consumed by concurrent waiters so\n * they fail deterministically instead of hanging on a condition predicate\n * that will never be satisfied. Cleared once observed by all current\n * waiters (on the next successful creator attempt).\n */\n const persistentSandboxCreationError = new Map<string, unknown>();\n /** Reverse lookup: childWorkflowId → agentName for in-flight lazy creators */\n const lazyCreatorAgent = new Map<string, string>();\n /** Reverse lookup: childWorkflowId → agentName for in-flight snapshot-base creators */\n const snapshotBaseCreatorAgent = new Map<string, string>();\n /** Maps childThreadId → latest snapshot for sandbox continuation via snapshots */\n const threadSnapshots = new Map<\n string,\n {\n agentName: string;\n snapshot: SandboxSnapshot;\n }\n >();\n /** Maps agentName → reusable base snapshot captured on first-ever call (init: once + continuation: \"snapshot\") */\n const persistentBaseSnapshot = new Map<string, SandboxSnapshot>();\n /** Tracks agents whose first snapshot-backed sandbox creation is in-flight */\n const persistentBaseSnapshotCreating = new Set<string>();\n /** Latest failure from a snapshot-base creator call, keyed by agentName. */\n const persistentBaseSnapshotCreationError = new Map<string, unknown>();\n\n setHandler(\n childSandboxReadySignal,\n ({ childWorkflowId, sandboxId, baseSnapshot }) => {\n const lazyAgent = lazyCreatorAgent.get(childWorkflowId);\n if (lazyAgent && !persistentSandboxes.has(lazyAgent)) {\n persistentSandboxes.set(lazyAgent, sandboxId);\n lazyCreatorAgent.delete(childWorkflowId);\n }\n const snapAgent = snapshotBaseCreatorAgent.get(childWorkflowId);\n if (snapAgent && baseSnapshot && !persistentBaseSnapshot.has(snapAgent)) {\n persistentBaseSnapshot.set(snapAgent, baseSnapshot);\n snapshotBaseCreatorAgent.delete(childWorkflowId);\n }\n }\n );\n\n const handler = async (\n args: SubagentArgs,\n context: RouterContext\n ): Promise<ToolHandlerResponse<InferSubagentResult<T[number]> | null>> => {\n const config = subagents.find((s) => s.agentName === args.subagent);\n\n if (!config) {\n throw new Error(\n `Unknown subagent: ${args.subagent}. Available: ${subagents.map((s) => s.agentName).join(\", \")}`\n );\n }\n\n const childWorkflowId = `${args.subagent}-${getShortId()}`;\n\n const { sandboxId: parentSandboxId } = context;\n const sandboxCfg = resolveSandboxConfig(config.sandbox);\n\n if (\n sandboxCfg.source !== \"none\" &&\n !agentSandboxOps.has(config.agentName)\n ) {\n throw ApplicationFailure.create({\n message: `Subagent \"${config.agentName}\" uses a sandbox but no \\`sandbox.proxy\\` is configured on its SubagentConfig`,\n nonRetryable: true,\n });\n }\n\n if (sandboxCfg.source === \"inherit\" && !parentSandboxId) {\n throw new Error(\n `Subagent \"${config.agentName}\" is configured with sandbox: \"inherit\" but the parent has no sandbox`\n );\n }\n\n const threadMode = config.thread ?? \"new\";\n const allowsContinuation = threadMode !== \"new\";\n const continuationThreadId =\n args.threadId && allowsContinuation ? args.threadId : undefined;\n\n // --- Build thread init ---\n let thread: ThreadInit | undefined;\n if (continuationThreadId) {\n thread = {\n mode: threadMode as \"fork\" | \"continue\",\n threadId: continuationThreadId,\n };\n }\n\n // --- Build sandbox init ---\n let sandbox: SandboxInit | undefined;\n let sandboxShutdownOverride: SubagentSandboxShutdown | undefined;\n let isLazyCreator = false;\n let isSnapshotBaseCreator = false;\n\n if (sandboxCfg.source === \"inherit\" && parentSandboxId) {\n if (sandboxCfg.continuation === \"fork\") {\n sandbox = { mode: \"fork\", sandboxId: parentSandboxId };\n } else if (sandboxCfg.continuation === \"snapshot\") {\n throw new Error(\n `Subagent \"${config.agentName}\" has sandbox source \"inherit\" with continuation \"snapshot\" — snapshot continuation is only supported for source \"own\"`\n );\n } else {\n sandbox = { mode: \"inherit\", sandboxId: parentSandboxId };\n }\n } else if (\n sandboxCfg.source === \"own\" &&\n sandboxCfg.continuation === \"snapshot\"\n ) {\n // Snapshot-driven continuation: each call boots a fresh sandbox from a\n // stored snapshot (per-thread, or a per-agent base for new threads with\n // init: \"once\"). The session destroys its sandbox inline on exit;\n // stored snapshot IDs are cleaned up by the parent at shutdown.\n const isLazy = sandboxCfg.init === \"once\";\n\n let baseSnap: SandboxSnapshot | undefined;\n if (continuationThreadId) {\n baseSnap = threadSnapshots.get(continuationThreadId)?.snapshot;\n }\n\n if (!baseSnap && isLazy) {\n baseSnap = persistentBaseSnapshot.get(config.agentName);\n if (!baseSnap) {\n if (persistentBaseSnapshotCreating.has(config.agentName)) {\n await condition(\n () =>\n persistentBaseSnapshot.has(config.agentName) ||\n persistentBaseSnapshotCreationError.has(config.agentName) ||\n !persistentBaseSnapshotCreating.has(config.agentName)\n );\n const creatorErr = persistentBaseSnapshotCreationError.get(\n config.agentName\n );\n if (creatorErr !== undefined) {\n throw creatorErr;\n }\n baseSnap = persistentBaseSnapshot.get(config.agentName);\n if (!baseSnap) {\n persistentBaseSnapshotCreating.add(config.agentName);\n isSnapshotBaseCreator = true;\n }\n } else {\n persistentBaseSnapshotCreating.add(config.agentName);\n isSnapshotBaseCreator = true;\n }\n }\n }\n\n if (baseSnap) {\n sandbox = { mode: \"from-snapshot\", snapshot: baseSnap };\n }\n sandboxShutdownOverride = \"snapshot\";\n } else if (sandboxCfg.source === \"own\") {\n const isLazy = sandboxCfg.init === \"once\";\n\n let baseSandboxId: string | undefined;\n if (isLazy) {\n baseSandboxId = persistentSandboxes.get(config.agentName);\n if (!baseSandboxId) {\n if (persistentSandboxCreating.has(config.agentName)) {\n // Another call is already creating — wait for it to finish.\n // Also break out if the creator failed, so we can either fail\n // fast with the same error or (if no one has re-claimed the\n // creator role yet) take over ourselves.\n await condition(\n () =>\n persistentSandboxes.has(config.agentName) ||\n persistentSandboxCreationError.has(config.agentName) ||\n !persistentSandboxCreating.has(config.agentName)\n );\n const creatorErr = persistentSandboxCreationError.get(\n config.agentName\n );\n if (creatorErr !== undefined) {\n throw creatorErr;\n }\n baseSandboxId = persistentSandboxes.get(config.agentName);\n if (!baseSandboxId) {\n persistentSandboxCreating.add(config.agentName);\n isLazyCreator = true;\n }\n } else {\n // We're the first concurrent caller — claim the creator role\n persistentSandboxCreating.add(config.agentName);\n isLazyCreator = true;\n }\n }\n } else if (continuationThreadId) {\n baseSandboxId = threadSandboxes.get(continuationThreadId);\n }\n\n if (baseSandboxId) {\n sandbox = {\n mode: sandboxCfg.continuation === \"continue\" ? \"continue\" : \"fork\",\n sandboxId: baseSandboxId,\n };\n }\n\n // Ensure the sandbox survives for future continuation/fork:\n // - first lazy call (creator): pause-until-parent-close so parent can clean up\n // - continuation=continue: sandbox must survive for next call\n // - lazy+fork (non-creator): template must survive for future forks\n //\n // Skip the override when the user already configured a *-until-parent-close\n // shutdown — that already guarantees survival.\n const userShutdown = sandboxCfg.shutdown;\n const alreadySurvives =\n userShutdown === \"pause-until-parent-close\" ||\n userShutdown === \"keep-until-parent-close\" ||\n userShutdown === \"pause\" ||\n userShutdown === \"keep\";\n\n const mustSurvive =\n isLazyCreator ||\n sandboxCfg.continuation === \"continue\" ||\n (isLazy && sandboxCfg.continuation === \"fork\");\n\n if (mustSurvive && !alreadySurvives) {\n sandboxShutdownOverride = isLazyCreator\n ? \"pause-until-parent-close\"\n : \"pause\";\n }\n }\n\n const workflowInput: SubagentWorkflowInput = {\n ...(thread && { thread }),\n ...(sandbox && { sandbox }),\n sandboxShutdown:\n sandboxShutdownOverride ?? sandboxCfg.shutdown ?? undefined,\n };\n\n const resolvedContext =\n config.context === undefined\n ? undefined\n : typeof config.context === \"function\"\n ? config.context()\n : config.context;\n\n const childOpts = {\n // Apply a bounded run timeout by default so a child workflow that\n // fails to initialize or otherwise never reaches a terminal state\n // cannot hang the parent's `Subagent` tool call forever. Callers can\n // raise, lower, or disable it via `workflowOptions.workflowRunTimeout`.\n workflowRunTimeout: DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT,\n ...(config.workflowOptions ?? {}),\n workflowId: childWorkflowId,\n args:\n resolvedContext === undefined\n ? ([args.prompt, workflowInput] as const)\n : ([args.prompt, workflowInput, resolvedContext] as const),\n taskQueue: config.taskQueue ?? parentTaskQueue,\n };\n\n if (isLazyCreator) {\n lazyCreatorAgent.set(childWorkflowId, config.agentName);\n }\n if (isSnapshotBaseCreator) {\n snapshotBaseCreatorAgent.set(childWorkflowId, config.agentName);\n }\n\n log.info(\"subagent spawned\", {\n subagent: config.agentName,\n childWorkflowId,\n threadMode,\n sandboxSource: sandboxCfg.source,\n });\n\n // Always clear in-flight creator bookkeeping, even if `executeChild`\n // throws. Otherwise a failing subagent would strand other concurrent\n // callers waiting on `condition(() => persistentSandboxes.has(...))` /\n // `persistentBaseSnapshot.has(...)` forever, because those conditions are\n // only ever satisfied on the success path below. When we were the\n // creator, also publish the error so any already-waiting concurrent\n // callers fail with the same error instead of silently retrying or\n // hanging.\n let childResult: SubagentFnResult<InferSubagentResult<T[number]> | null>;\n try {\n childResult = (await executeChild(\n config.workflow,\n childOpts\n )) as SubagentFnResult<InferSubagentResult<T[number]> | null>;\n } catch (err) {\n log.warn(\"subagent failed\", {\n subagent: config.agentName,\n childWorkflowId,\n error: err instanceof Error ? err.message : String(err),\n });\n if (isLazyCreator) {\n persistentSandboxCreating.delete(config.agentName);\n persistentSandboxCreationError.set(config.agentName, err);\n lazyCreatorAgent.delete(childWorkflowId);\n }\n if (isSnapshotBaseCreator) {\n persistentBaseSnapshotCreating.delete(config.agentName);\n persistentBaseSnapshotCreationError.set(config.agentName, err);\n snapshotBaseCreatorAgent.delete(childWorkflowId);\n }\n throw err;\n }\n\n const effectiveShutdown =\n sandboxShutdownOverride ?? sandboxCfg.shutdown ?? \"destroy\";\n\n log.info(\"subagent completed\", {\n subagent: config.agentName,\n childWorkflowId,\n ...(childResult.usage && { usage: childResult.usage }),\n });\n\n const {\n toolResponse,\n data,\n usage,\n threadId: childThreadId,\n sandboxId: childSandboxId,\n snapshot: childSnapshot,\n baseSnapshot: childBaseSnapshot,\n metadata,\n } = childResult;\n\n if (childSandboxId) {\n if (\n sandboxCfg.source === \"own\" &&\n sandboxCfg.init === \"once\" &&\n sandboxCfg.continuation !== \"snapshot\" &&\n !persistentSandboxes.has(config.agentName)\n ) {\n // Fallback: signal may have already set this via childSandboxReadySignal\n persistentSandboxes.set(config.agentName, childSandboxId);\n } else if (\n allowsContinuation &&\n childThreadId &&\n sandboxCfg.source === \"own\" &&\n sandboxCfg.continuation !== \"snapshot\"\n ) {\n threadSandboxes.set(childThreadId, childSandboxId);\n }\n }\n\n // Track sandboxes that must be destroyed by the parent at shutdown.\n if (\n childSandboxId &&\n (effectiveShutdown === \"pause-until-parent-close\" ||\n effectiveShutdown === \"keep-until-parent-close\")\n ) {\n const key = isLazyCreator\n ? `persistent:${config.agentName}`\n : childWorkflowId;\n pendingDestroys.set(key, {\n agentName: config.agentName,\n sandboxId: childSandboxId,\n });\n }\n\n // Store snapshots for future snapshot-driven continuation and final sweep.\n // Tag each with `agentName` so `cleanupSubagentSnapshots` knows which\n // sandbox ops to call for deletion.\n if (sandboxCfg.source === \"own\" && sandboxCfg.continuation === \"snapshot\") {\n if (childSnapshot && childThreadId) {\n threadSnapshots.set(childThreadId, {\n agentName: config.agentName,\n snapshot: childSnapshot,\n });\n }\n if (\n isSnapshotBaseCreator &&\n childBaseSnapshot &&\n !persistentBaseSnapshot.has(config.agentName)\n ) {\n persistentBaseSnapshot.set(config.agentName, childBaseSnapshot);\n }\n }\n\n if (isLazyCreator) {\n persistentSandboxCreating.delete(config.agentName);\n persistentSandboxCreationError.delete(config.agentName);\n lazyCreatorAgent.delete(childWorkflowId);\n }\n if (isSnapshotBaseCreator) {\n persistentBaseSnapshotCreating.delete(config.agentName);\n persistentBaseSnapshotCreationError.delete(config.agentName);\n snapshotBaseCreatorAgent.delete(childWorkflowId);\n }\n\n if (!toolResponse) {\n return {\n toolResponse: \"Subagent workflow returned no response\",\n data: null,\n ...(usage && { usage }),\n ...(childSandboxId && { sandboxId: childSandboxId }),\n ...(metadata && { metadata }),\n };\n }\n\n const validated = (\n config.resultSchema ? config.resultSchema.safeParse(data) : null\n ) as z.ZodSafeParseResult<InferSubagentResult<T[number]>> | null;\n\n if (validated && !validated.success) {\n return {\n toolResponse: `Subagent workflow returned invalid data: ${validated.error.message}`,\n data: null,\n ...(usage && { usage }),\n ...(childSandboxId && { sandboxId: childSandboxId }),\n ...(metadata && { metadata }),\n };\n }\n\n let finalToolResponse: JsonValue = toolResponse;\n\n if (allowsContinuation && childThreadId) {\n const responseStr =\n typeof toolResponse === \"string\"\n ? toolResponse\n : JSON.stringify(toolResponse);\n finalToolResponse = `${responseStr}\\n\\n[${config.agentName} Thread ID: ${childThreadId}]`;\n }\n\n return {\n toolResponse: finalToolResponse,\n data: validated\n ? validated.data\n : (data as InferSubagentResult<T[number]> | null),\n ...(usage && { usage }),\n ...(childSandboxId && { sandboxId: childSandboxId }),\n ...(metadata && { metadata }),\n };\n };\n\n const destroySubagentSandboxes = async (): Promise<void> => {\n const entries = [...pendingDestroys.values()];\n pendingDestroys.clear();\n await Promise.all(\n entries.map(async ({ agentName, sandboxId }) => {\n const ops = agentSandboxOps.get(agentName);\n if (!ops) {\n log.warn(\n \"Skipping sandbox destroy — no sandbox.proxy registered for agent\",\n { agentName, sandboxId }\n );\n return;\n }\n try {\n await ops.destroySandbox(sandboxId);\n } catch (err) {\n log.warn(\"Failed to destroy subagent sandbox\", {\n agentName,\n sandboxId,\n error: err,\n });\n }\n })\n );\n };\n\n const cleanupSubagentSnapshots = async (): Promise<void> => {\n const tagged = [];\n for (const entry of threadSnapshots.values()) tagged.push(entry);\n for (const [agentName, snapshot] of persistentBaseSnapshot.entries()) {\n tagged.push({ agentName, snapshot });\n }\n threadSnapshots.clear();\n persistentBaseSnapshot.clear();\n\n await Promise.all(\n tagged.map(async ({ agentName, snapshot }) => {\n const ops = agentSandboxOps.get(agentName);\n if (!ops) {\n log.warn(\n \"Skipping snapshot delete — no sandbox.proxy registered for agent\",\n { agentName }\n );\n return;\n }\n try {\n await ops.deleteSandboxSnapshot(snapshot);\n } catch (err) {\n log.warn(\"Failed to delete subagent snapshot\", {\n agentName,\n error: err,\n });\n }\n })\n );\n };\n\n return { handler, destroySubagentSandboxes, cleanupSubagentSnapshots };\n}\n","import type {\n PreToolUseHookResult,\n PostToolUseFailureHookResult,\n ToolHooks,\n ToolMap,\n} from \"../tool-router/types\";\nimport type { SubagentConfig, SubagentHooks } from \"./types\";\nimport type { z } from \"zod\";\nimport {\n createSubagentTool,\n SUBAGENT_TOOL_NAME,\n type SubagentArgs,\n} from \"./tool\";\nimport { createSubagentHandler } from \"./handler\";\n\n/**\n * Builds a fully wired tool entry for the Subagent tool,\n * including per-subagent hook delegation.\n *\n * Lazily evaluates `enabled` (supports `boolean | () => boolean`)\n * so that `description` and `schema` reflect the current set of\n * active subagents each time getToolDefinitions() is called.\n *\n * Returns null if no subagents are configured.\n */\nexport function buildSubagentRegistration(subagents: SubagentConfig[]): {\n registration: ToolMap[string];\n destroySubagentSandboxes: () => Promise<void>;\n cleanupSubagentSnapshots: () => Promise<void>;\n} | null {\n if (subagents.length === 0) return null;\n\n const getEnabled = (): SubagentConfig[] =>\n subagents.filter((s) =>\n typeof s.enabled === \"function\" ? s.enabled() : (s.enabled ?? true)\n );\n\n const subagentHooksMap = new Map<string, SubagentHooks>();\n for (const s of subagents) {\n if (s.hooks) subagentHooksMap.set(s.agentName, s.hooks);\n }\n\n const resolveSubagentName = (args: unknown): string =>\n (args as SubagentArgs).subagent;\n\n const { handler, destroySubagentSandboxes, cleanupSubagentSnapshots } =\n createSubagentHandler(subagents);\n\n const registration: ToolMap[string] = {\n name: SUBAGENT_TOOL_NAME,\n enabled: (): boolean => getEnabled().length > 0,\n description: (): string => createSubagentTool(getEnabled()).description,\n schema: (): z.ZodObject<z.ZodRawShape> =>\n createSubagentTool(getEnabled()).schema,\n handler,\n ...(subagentHooksMap.size > 0 && {\n hooks: {\n onPreToolUse: async (ctx): Promise<PreToolUseHookResult> => {\n const hooks = subagentHooksMap.get(resolveSubagentName(ctx.args));\n return hooks?.onPreExecution?.(ctx) ?? {};\n },\n onPostToolUse: async (ctx): Promise<void> => {\n const hooks = subagentHooksMap.get(resolveSubagentName(ctx.args));\n await hooks?.onPostExecution?.(ctx);\n },\n onPostToolUseFailure: async (\n ctx\n ): Promise<PostToolUseFailureHookResult> => {\n const hooks = subagentHooksMap.get(resolveSubagentName(ctx.args));\n return hooks?.onExecutionFailure?.(ctx) ?? {};\n },\n } satisfies ToolHooks,\n }),\n };\n\n return { registration, destroySubagentSandboxes, cleanupSubagentSnapshots };\n}\n","import z from \"zod\";\nimport type { Skill } from \"./types\";\n\nexport const READ_SKILL_TOOL_NAME = \"ReadSkill\" as const;\n\nfunction buildReadSkillDescription(skills: Skill[]): string {\n const skillList = skills\n .map((s) => `- **${s.name}**: ${s.description}`)\n .join(\"\\n\");\n\n return `Load the full instructions for a skill. Read the skill before following its instructions.\n\n# Available skills:\n${skillList}\n`;\n}\n\n/**\n * Creates a ReadSkill tool configured with the available skills.\n * The tool description embeds skill metadata so the agent discovers\n * skills purely through the tool definition.\n */\nexport function createReadSkillTool(skills: Skill[]): {\n name: string;\n description: string;\n schema: z.ZodObject<{\n skill_name: z.ZodEnum<Record<string, string>>;\n }>;\n} {\n if (skills.length === 0) {\n throw new Error(\"createReadSkillTool requires at least one skill\");\n }\n\n const names = skills.map((s) => s.name);\n\n return {\n name: READ_SKILL_TOOL_NAME,\n description: buildReadSkillDescription(skills),\n schema: z.object({\n skill_name: z.enum(names).describe(\"The name of the skill to load\"),\n }),\n } as const;\n}\n\nexport type ReadSkillArgs = {\n skill_name: string;\n};\n","import type { Skill } from \"./types\";\nimport type { ToolHandlerResponse } from \"../tool-router\";\nimport type { ReadSkillArgs } from \"./tool\";\n\n/**\n * Formats the skill activation response with structured wrapping.\n *\n * Follows the agentskills.io pattern: the instructions are wrapped in\n * identifying tags and bundled resources are listed so the agent can\n * load them on demand via its file-read tool.\n */\nfunction formatSkillResponse(skill: Skill): string {\n const parts: string[] = [];\n\n parts.push(`<skill_content name=\"${skill.name}\">`);\n parts.push(skill.instructions);\n\n if (skill.location) {\n parts.push(`\\nSkill directory: ${skill.location}`);\n parts.push(\n \"Relative paths in this skill resolve against the skill directory above.\"\n );\n }\n\n const resources = skill.resourceContents\n ? Object.keys(skill.resourceContents)\n : [];\n if (resources.length > 0) {\n parts.push(\"\");\n parts.push(\"<skill_resources>\");\n for (const r of resources) {\n parts.push(` <file>${r}</file>`);\n }\n parts.push(\"</skill_resources>\");\n }\n\n parts.push(\"</skill_content>\");\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Creates a ReadSkill handler that looks up skills from an in-memory array.\n * Runs directly in the workflow (like task tools) — no activity needed.\n *\n * The response uses structured wrapping per the agentskills.io spec:\n * instructions are enclosed in `<skill_content>` tags, the skill directory\n * is included, and bundled resources are listed so the agent can load them\n * individually via its file-read tool.\n */\nexport function createReadSkillHandler(\n skills: Skill[]\n): (args: ReadSkillArgs) => ToolHandlerResponse<null> {\n const skillMap = new Map(skills.map((s) => [s.name, s]));\n\n return (args: ReadSkillArgs): ToolHandlerResponse<null> => {\n const skill = skillMap.get(args.skill_name);\n\n if (!skill) {\n return {\n toolResponse: JSON.stringify({\n error: `Skill \"${args.skill_name}\" not found`,\n }),\n data: null,\n };\n }\n\n return {\n toolResponse: formatSkillResponse(skill),\n data: null,\n };\n };\n}\n","import type { ToolMap } from \"../tool-router/types\";\nimport type { Skill, SkillMetadata } from \"./types\";\nimport { createReadSkillTool } from \"./tool\";\nimport { createReadSkillHandler } from \"./handler\";\n\n/**\n * Validates that all skill names are unique. Throws immediately if duplicates\n * are found so misconfiguration is caught at session wiring time.\n */\nfunction validateSkillNames(skills: SkillMetadata[]): void {\n const names = skills.map((s) => s.name);\n const dupes = names.filter((n, i) => names.indexOf(n) !== i);\n if (dupes.length > 0) {\n throw new Error(`Duplicate skill names: ${[...new Set(dupes)].join(\", \")}`);\n }\n}\n\n/**\n * Builds a fully wired tool entry for the ReadSkill tool.\n *\n * Returns null if no skills are provided.\n */\nexport function buildSkillRegistration(\n skills: Skill[]\n): ToolMap[string] | null {\n if (skills.length === 0) return null;\n\n validateSkillNames(skills);\n\n return {\n ...createReadSkillTool(skills),\n handler: createReadSkillHandler(skills),\n };\n}\n","import {\n condition,\n defineUpdate,\n setHandler,\n ApplicationFailure,\n log,\n} from \"@temporalio/workflow\";\nimport type { SessionExitReason } from \"../types\";\nimport type { SessionConfig, ZeitlichSession } from \"./types\";\nimport type {\n SandboxCreateOptions,\n SandboxOps,\n SandboxSnapshot,\n} from \"../sandbox/types\";\nimport type {\n AgentState,\n AgentStateManager,\n JsonSerializable,\n PersistedThreadState,\n} from \"../state/types\";\nimport { createToolRouter } from \"../tool-router/router\";\nimport type { ParsedToolCallUnion, ToolMap } from \"../tool-router/types\";\nimport { getShortId } from \"../thread/id\";\nimport { buildSubagentRegistration } from \"../subagent/register\";\nimport { buildSkillRegistration } from \"../skills/register\";\nimport type { Skill } from \"../skills/types\";\nimport { uuid4 } from \"@temporalio/workflow\";\n\n/**\n * Collects resource file contents from all skills into a flat map\n * keyed by absolute path (location + relative resource path).\n * Returns undefined when no skills carry resource contents.\n */\nfunction collectSkillFiles(\n skills: Skill[]\n): Record<string, string> | undefined {\n let files: Record<string, string> | undefined;\n for (const skill of skills) {\n if (!skill.resourceContents || !skill.location) continue;\n for (const [relPath, content] of Object.entries(skill.resourceContents)) {\n files ??= {};\n files[`${skill.location}/${relPath}`] = content;\n }\n }\n return files;\n}\n\n/**\n * Creates an agent session that manages the agent loop: LLM invocation,\n * tool routing, subagent coordination, and lifecycle hooks.\n *\n * When `sandboxOps` is provided the returned session result is guaranteed to\n * include `sandboxId: string`. Without it, `sandboxId` is `undefined`.\n *\n * @param config - Session and agent configuration (merged `SessionConfig` and `AgentConfig`)\n * @returns A session object with `runSession()` to start the agent loop\n *\n * @example\n * ```typescript\n * import { createSession, createAgentStateManager, defineTool, bashTool } from 'zeitlich/workflow';\n * import { proxyGoogleGenAIThreadOps } from 'zeitlich/adapters/thread/google-genai/workflow';\n *\n * const session = await createSession({\n * agentName: \"my-agent\",\n * maxTurns: 20,\n * thread: { mode: \"new\" },\n * threadOps: proxyGoogleGenAIThreadOps(),\n * runAgent: runAgentActivity,\n * buildContextMessage: () => [{ type: \"text\", text: prompt }],\n * subagents: [researcherSubagent],\n * tools: {\n * Bash: defineTool({ ...bashTool, handler: bashHandlerActivity }),\n * },\n * });\n *\n * const { finalMessage, exitReason } = await session.runSession({ stateManager });\n * ```\n */\nexport async function createSession<\n T extends ToolMap,\n M = unknown,\n TContent = string,\n>(\n config: SessionConfig<T, M, TContent> & { sandboxOps: SandboxOps }\n): Promise<ZeitlichSession<M, true>>;\nexport async function createSession<\n T extends ToolMap,\n M = unknown,\n TContent = string,\n>(config: SessionConfig<T, M, TContent>): Promise<ZeitlichSession<M, false>>;\nexport async function createSession<\n T extends ToolMap,\n M = unknown,\n TContent = string,\n>({\n agentName,\n maxTurns = 50,\n metadata = {},\n runAgent,\n threadOps,\n buildContextMessage,\n subagents,\n skills,\n tools = {} as T,\n processToolsInParallel = true,\n hooks = {},\n appendSystemPrompt = true,\n waitForInputTimeout = \"48h\",\n threadKey,\n sandboxOps,\n thread: threadInit,\n sandbox: sandboxInit,\n sandboxShutdown = \"destroy\",\n onSandboxReady,\n onSessionExit,\n virtualFs: virtualFsConfig,\n virtualFsOps,\n}: SessionConfig<T, M, TContent>): Promise<ZeitlichSession<M, boolean>> {\n // ---------------------------------------------------------------------------\n // Thread resolution\n // ---------------------------------------------------------------------------\n const threadMode = threadInit?.mode ?? \"new\";\n let threadId: string;\n let sourceThreadId: string | undefined;\n\n switch (threadMode) {\n case \"new\":\n threadId =\n threadInit?.mode === \"new\" && threadInit.threadId\n ? threadInit.threadId\n : getShortId();\n break;\n case \"continue\":\n threadId = (threadInit as { mode: \"continue\"; threadId: string })\n .threadId;\n break;\n case \"fork\":\n sourceThreadId = (threadInit as { mode: \"fork\"; threadId: string })\n .threadId;\n threadId = getShortId();\n break;\n }\n\n const {\n appendToolResult,\n appendHumanMessage,\n initializeThread,\n appendSystemMessage,\n appendAgentMessage,\n forkThread,\n loadThreadState,\n saveThreadState,\n } = threadOps;\n\n const plugins: ToolMap[string][] = [];\n let destroySubagentSandboxes: (() => Promise<void>) | undefined;\n let cleanupSubagentSnapshots: (() => Promise<void>) | undefined;\n\n if (subagents) {\n const result = buildSubagentRegistration(subagents);\n if (result) {\n plugins.push(result.registration);\n destroySubagentSandboxes = result.destroySubagentSandboxes;\n cleanupSubagentSnapshots = result.cleanupSubagentSnapshots;\n }\n }\n if (skills) {\n const reg = buildSkillRegistration(skills);\n if (reg) plugins.push(reg);\n }\n\n const toolRouter = createToolRouter({\n tools,\n appendToolResult,\n threadId,\n threadKey,\n hooks,\n plugins,\n parallel: processToolsInParallel,\n });\n\n const callSessionEnd = async (\n exitReason: SessionExitReason,\n turns: number\n ): Promise<void> => {\n if (hooks.onSessionEnd) {\n await hooks.onSessionEnd({\n threadId,\n agentName,\n exitReason,\n turns,\n metadata,\n });\n }\n };\n\n return {\n runSession: async <TState extends JsonSerializable<TState>>({\n stateManager,\n }: {\n stateManager: AgentStateManager<TState>;\n }) => {\n setHandler(\n defineUpdate<unknown, [TContent]>(`add${agentName}Message`),\n async (message: TContent) => {\n if (hooks.onPreHumanMessageAppend) {\n await hooks.onPreHumanMessageAppend({\n message,\n threadId,\n });\n }\n await appendHumanMessage(threadId, uuid4(), message, threadKey);\n if (hooks.onPostHumanMessageAppend) {\n await hooks.onPostHumanMessageAppend({\n message,\n threadId,\n });\n }\n stateManager.run();\n }\n );\n\n // --- Sandbox lifecycle: create, continue, fork, from-snapshot, or inherit ---\n const sandboxMode = sandboxInit?.mode;\n let sandboxId: string | undefined;\n let sandboxOwned = false;\n let baseSnapshot: SandboxSnapshot | undefined;\n let exitSnapshot: SandboxSnapshot | undefined;\n let freshlyCreated = false;\n\n if (sandboxMode === \"inherit\") {\n const inheritInit = sandboxInit as {\n mode: \"inherit\";\n sandboxId: string;\n };\n sandboxId = inheritInit.sandboxId;\n if (!sandboxOps) {\n throw ApplicationFailure.create({\n message:\n \"sandboxId provided but no sandboxOps — cannot manage sandbox lifecycle\",\n nonRetryable: true,\n });\n }\n } else if (sandboxMode === \"continue\") {\n if (!sandboxOps) {\n throw ApplicationFailure.create({\n message: \"No sandboxOps provided — cannot continue sandbox\",\n nonRetryable: true,\n });\n }\n sandboxId = (sandboxInit as { mode: \"continue\"; sandboxId: string })\n .sandboxId;\n if (sandboxShutdown === \"pause-until-parent-close\") {\n await sandboxOps.resumeSandbox(sandboxId);\n }\n sandboxOwned = true;\n } else if (sandboxMode === \"fork\") {\n if (!sandboxOps) {\n throw ApplicationFailure.create({\n message: \"No sandboxOps provided — cannot fork sandbox\",\n nonRetryable: true,\n });\n }\n const forkInit = sandboxInit as {\n mode: \"fork\";\n sandboxId: string;\n options?: SandboxCreateOptions;\n };\n sandboxId = await sandboxOps.forkSandbox(\n forkInit.sandboxId,\n forkInit.options\n );\n sandboxOwned = true;\n } else if (sandboxMode === \"from-snapshot\") {\n if (!sandboxOps) {\n throw ApplicationFailure.create({\n message: \"No sandboxOps provided — cannot restore sandbox\",\n nonRetryable: true,\n });\n }\n const restoreInit = sandboxInit as {\n mode: \"from-snapshot\";\n snapshot: SandboxSnapshot;\n options?: SandboxCreateOptions;\n };\n sandboxId = await sandboxOps.restoreSandbox(\n restoreInit.snapshot,\n restoreInit.options\n );\n sandboxOwned = true;\n } else if (sandboxOps) {\n const skillFiles = skills ? collectSkillFiles(skills) : undefined;\n const ctx = (sandboxInit as { mode: \"new\"; ctx?: unknown } | undefined)\n ?.ctx;\n const createOptions = skillFiles\n ? { initialFiles: skillFiles }\n : undefined;\n const result = await sandboxOps.createSandbox(createOptions, ctx);\n if (result) {\n sandboxId = result.sandboxId;\n sandboxOwned = true;\n freshlyCreated = true;\n }\n }\n\n // Capture a base snapshot immediately after seeding so it can be reused\n // as a template for future runs that want to skip the (potentially\n // expensive) seed step.\n if (\n sandboxId &&\n sandboxOwned &&\n freshlyCreated &&\n sandboxShutdown === \"snapshot\" &&\n sandboxOps\n ) {\n baseSnapshot = await sandboxOps.snapshotSandbox(sandboxId);\n }\n\n if (sandboxId && sandboxOwned && onSandboxReady) {\n onSandboxReady({\n sandboxId,\n ...(baseSnapshot && { baseSnapshot }),\n });\n }\n\n // --- Virtual filesystem init (independent of sandbox) ----------------\n if (virtualFsConfig) {\n if (!virtualFsOps) {\n throw ApplicationFailure.create({\n message: \"No virtualFsOps provided — cannot resolve file tree\",\n nonRetryable: true,\n });\n }\n const result = await virtualFsOps.resolveFileTree(virtualFsConfig.ctx);\n const skillFiles = skills ? collectSkillFiles(skills) : undefined;\n const fileTree = skillFiles\n ? [\n ...result.fileTree,\n ...Object.entries(skillFiles).map(([path, content]) => ({\n id: `skill:${path}`,\n path,\n size: content.length,\n mtime: new Date().toISOString(),\n metadata: {},\n })),\n ]\n : result.fileTree;\n stateManager.mergeUpdate({\n fileTree,\n virtualFsCtx: virtualFsConfig.ctx,\n ...(skillFiles && { inlineFiles: skillFiles }),\n } as Partial<AgentState<TState>>);\n }\n\n if (hooks.onSessionStart) {\n await hooks.onSessionStart({\n threadId,\n agentName,\n metadata,\n });\n }\n\n log.info(\"session started\", {\n agentName,\n threadId,\n threadMode,\n maxTurns,\n ...(sandboxId && { sandboxId }),\n });\n\n const sessionStartMs = Date.now();\n const systemPrompt = stateManager.getSystemPrompt();\n\n // --- Thread lifecycle: new, continue, or fork ----------------------\n const rehydrateFromSlice = (slice: PersistedThreadState): void => {\n stateManager.mergeUpdate({\n tasks: new Map(slice.tasks),\n ...slice.custom,\n } as Partial<AgentState<TState>>);\n };\n\n if (threadMode === \"fork\" && sourceThreadId) {\n await forkThread(sourceThreadId, threadId, threadKey);\n const forkedSlice = await loadThreadState(threadId, threadKey);\n if (forkedSlice) rehydrateFromSlice(forkedSlice);\n } else if (threadMode === \"continue\") {\n // \"continue\" — thread already exists, just append the new message\n const continuedSlice = await loadThreadState(threadId, threadKey);\n if (continuedSlice) rehydrateFromSlice(continuedSlice);\n } else {\n if (appendSystemPrompt) {\n if (\n systemPrompt == null ||\n (typeof systemPrompt === \"string\" && systemPrompt.trim() === \"\")\n ) {\n throw ApplicationFailure.create({\n message: \"No system prompt in state\",\n nonRetryable: true,\n });\n }\n await appendSystemMessage(threadId, uuid4(), systemPrompt, threadKey);\n } else {\n await initializeThread(threadId, threadKey);\n }\n }\n await appendHumanMessage(\n threadId,\n uuid4(),\n await buildContextMessage(),\n threadKey\n );\n\n let exitReason: SessionExitReason = \"completed\";\n let finalMessage: M | null = null;\n\n try {\n // Per-turn assistant message id. Pre-generated in the workflow\n // so the runAgent activity can truncate the thread from this id\n // on entry (deterministic rewind + time-travel via Temporal\n // workflow reset). On a rewind retry we keep the same id so the\n // prior attempt's assistant + tool results are wiped by the next\n // runAgent call.\n let assistantId: string | undefined;\n while (\n stateManager.isRunning() &&\n !stateManager.isTerminal() &&\n stateManager.getTurns() < maxTurns\n ) {\n stateManager.incrementTurns();\n const currentTurn = stateManager.getTurns();\n\n log.debug(\"turn started\", { agentName, threadId, turn: currentTurn });\n\n stateManager.setTools(toolRouter.getToolDefinitions());\n\n assistantId ??= uuid4();\n\n const { message, rawToolCalls, usage } = await runAgent({\n threadId,\n threadKey,\n agentName,\n metadata,\n assistantMessageId: assistantId,\n });\n\n await appendAgentMessage(threadId, assistantId, message, threadKey);\n\n if (usage) {\n stateManager.updateUsage(usage);\n }\n\n log.debug(\"model response received\", {\n agentName,\n threadId,\n turn: currentTurn,\n toolCallCount: rawToolCalls.length,\n ...(usage && { usage }),\n });\n\n if (!toolRouter.hasTools() || rawToolCalls.length === 0) {\n stateManager.complete();\n exitReason = \"completed\";\n finalMessage = message;\n break;\n }\n\n const parsedToolCalls: ParsedToolCallUnion<T>[] = [];\n for (const tc of rawToolCalls) {\n try {\n parsedToolCalls.push(toolRouter.parseToolCall(tc));\n } catch (error) {\n await appendToolResult(uuid4(), {\n threadId,\n threadKey,\n toolCallId: tc.id ?? \"\",\n toolName: tc.name,\n content: JSON.stringify({\n error: `Invalid tool call for \"${tc.name}\": ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n }\n }\n\n const toolCallResults = await toolRouter.processToolCalls(\n parsedToolCalls,\n {\n turn: currentTurn,\n ...(sandboxId !== undefined && { sandboxId }),\n }\n );\n\n for (const result of toolCallResults) {\n if (result.usage) {\n stateManager.updateUsage(result.usage);\n }\n }\n\n const rewind = toolCallResults.rewind;\n if (rewind) {\n log.info(\"rewinding turn\", {\n agentName,\n threadId,\n turn: currentTurn,\n toolCallId: rewind.toolCallId,\n toolName: rewind.toolName,\n });\n // Keep the same assistantId for the retry. The next\n // runAgent call will call truncateFromId(assistantId) on\n // entry, wiping the bad assistant message + any already\n // appended tool results before re-invoking the LLM. The\n // turn counter is intentionally NOT rolled back — each\n // rewind still consumes one of the `maxTurns` budget so a\n // misbehaving tool cannot spin the session forever.\n continue;\n }\n\n // Turn committed: fresh id for the next turn.\n assistantId = undefined;\n\n if (stateManager.getStatus() === \"WAITING_FOR_INPUT\") {\n const conditionMet = await condition(\n () => stateManager.getStatus() === \"RUNNING\",\n waitForInputTimeout\n );\n if (!conditionMet) {\n stateManager.cancel();\n exitReason = \"cancelled\";\n await condition(() => false, \"2s\");\n break;\n }\n }\n }\n\n if (stateManager.getTurns() >= maxTurns && stateManager.isRunning()) {\n exitReason = \"max_turns\";\n log.warn(\"session hit max turns\", {\n agentName,\n threadId,\n maxTurns,\n });\n }\n } catch (error) {\n exitReason = \"failed\";\n log.error(\"session failed\", {\n agentName,\n threadId,\n turns: stateManager.getTurns(),\n durationMs: Date.now() - sessionStartMs,\n error: error instanceof Error ? error.message : String(error),\n });\n throw ApplicationFailure.fromError(error);\n } finally {\n // Persist the task map + custom state slice alongside the thread so\n // a future `continue` / `fork` run can rehydrate it. Runs on every\n // exit path (completed, failed, cancelled, max_turns,\n // waiting_for_input timeout). Best-effort: failures here must not\n // mask the original exit reason / error.\n try {\n await saveThreadState(\n threadId,\n stateManager.getPersistedSlice(),\n threadKey\n );\n } catch (persistError) {\n log.warn(\"failed to persist thread state\", {\n agentName,\n threadId,\n error:\n persistError instanceof Error\n ? persistError.message\n : String(persistError),\n });\n }\n\n await callSessionEnd(exitReason, stateManager.getTurns());\n\n if (sandboxOwned && sandboxId && sandboxOps) {\n switch (sandboxShutdown) {\n case \"destroy\":\n await sandboxOps.destroySandbox(sandboxId);\n break;\n case \"pause\":\n case \"pause-until-parent-close\":\n await sandboxOps.pauseSandbox(sandboxId);\n break;\n case \"keep\":\n case \"keep-until-parent-close\":\n break;\n case \"snapshot\":\n exitSnapshot = await sandboxOps.snapshotSandbox(sandboxId);\n await sandboxOps.destroySandbox(sandboxId);\n break;\n }\n }\n\n if (destroySubagentSandboxes) {\n await destroySubagentSandboxes();\n }\n\n if (cleanupSubagentSnapshots) {\n await cleanupSubagentSnapshots();\n }\n }\n\n log.info(\"session ended\", {\n agentName,\n threadId,\n exitReason,\n turns: stateManager.getTurns(),\n durationMs: Date.now() - sessionStartMs,\n usage: stateManager.getTotalUsage(),\n ...(baseSnapshot && { hasBaseSnapshot: true }),\n ...(exitSnapshot && { hasExitSnapshot: true }),\n });\n\n if (onSessionExit) {\n onSessionExit({\n ...(sandboxId && { sandboxId }),\n ...(exitSnapshot && { snapshot: exitSnapshot }),\n threadId,\n });\n }\n\n return {\n threadId,\n finalMessage,\n exitReason,\n usage: stateManager.getTotalUsage(),\n sandboxId,\n ...(baseSnapshot && { baseSnapshot }),\n ...(exitSnapshot && { snapshot: exitSnapshot }),\n } as Awaited<ReturnType<ZeitlichSession<M, boolean>[\"runSession\"]>>;\n },\n };\n}\n","import type { ThreadInit, SandboxInit, SandboxShutdown } from \"./lifecycle\";\n\n/**\n * Session config fields derived from a main workflow input, ready to spread\n * into `createSession`.\n */\nexport interface WorkflowSessionInput {\n /** Agent name — spread directly into `createSession` */\n agentName: string;\n /** Thread initialization strategy */\n thread?: ThreadInit;\n /** Sandbox initialization strategy */\n sandbox?: SandboxInit;\n /** Sandbox shutdown policy (default: \"destroy\") */\n sandboxShutdown?: SandboxShutdown;\n}\n\n/** Raw workflow input fields that map into `WorkflowSessionInput`. */\nexport interface WorkflowInput {\n /** Thread initialization strategy (default: `{ mode: \"new\" }`) */\n thread?: ThreadInit;\n /** Sandbox initialization strategy */\n sandbox?: SandboxInit;\n}\n\nexport interface WorkflowConfig {\n /** Workflow name — used as the Temporal workflow function name */\n name: string;\n /**\n * Sandbox shutdown policy applied when the main agent session exits.\n *\n * - `\"destroy\"` (default) — destroy the sandbox on exit.\n * - `\"pause\"` — pause the sandbox so it can be resumed later.\n * - `\"keep\"` — leave the sandbox running (no-op on exit).\n */\n sandboxShutdown?: SandboxShutdown;\n}\n\n/**\n * Wraps a main workflow function, translating workflow input fields into\n * session-compatible fields that can be spread directly into `createSession`.\n *\n * The wrapper:\n * - Accepts a `config` with at least a `name` (used for Temporal workflow naming)\n * - Accepts a handler `fn` receiving `(input, sessionInput)`\n * - Derives thread / sandbox init from `workflowInput`\n * - Applies the configured `sandboxShutdown` policy\n */\nexport function defineWorkflow<TInput, TResult>(\n config: WorkflowConfig,\n fn: (input: TInput, sessionInput: WorkflowSessionInput) => Promise<TResult>\n): (input: TInput, workflowInput?: WorkflowInput) => Promise<TResult> {\n const workflow = async (\n input: TInput,\n workflowInput: WorkflowInput = {}\n ): Promise<TResult> => {\n const sessionInput: WorkflowSessionInput = {\n agentName: config.name,\n sandboxShutdown: config.sandboxShutdown ?? \"destroy\",\n ...(workflowInput.thread && { thread: workflowInput.thread }),\n ...(workflowInput.sandbox && { sandbox: workflowInput.sandbox }),\n };\n return fn(input, sessionInput);\n };\n\n Object.defineProperty(workflow, \"name\", { value: config.name });\n\n return workflow;\n}\n","/**\n * Public helpers for zeitlich's Redis thread storage layout.\n *\n * These are the exact string-building primitives zeitlich's internal thread\n * manager uses for every adapter. Downstream consumers that need to read a\n * persisted thread (for evaluation, observability, admin tooling, etc.)\n * should use these helpers rather than reconstructing the key layout by\n * hand — the layout is versioned with this module, so upgrading zeitlich\n * keeps the consumer in sync.\n *\n * The layout is adapter-agnostic: every thread adapter stores messages the\n * same way.\n *\n * @example\n * ```typescript\n * import {\n * getThreadListKey,\n * getThreadMetaKey,\n * THREAD_TTL_SECONDS,\n * } from 'zeitlich';\n *\n * const listKey = getThreadListKey('messages', threadId);\n * const metaKey = getThreadMetaKey('messages', threadId);\n * const ttl = await redis.ttl(listKey); // <= THREAD_TTL_SECONDS\n * ```\n */\n\n/**\n * TTL (in seconds) applied to every thread list and thread meta key that\n * zeitlich's {@link createThreadManager} writes. Exposed so downstream\n * consumers can size their Redis retention / query windows to match.\n *\n * Current value: 90 days.\n */\nexport const THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;\n\n/**\n * Build the Redis list key that holds a thread's serialized messages.\n *\n * Mirrors the exact key used internally by zeitlich's thread manager,\n * so a consumer calling `redis.lrange(getThreadListKey(key, id), 0, -1)`\n * sees the same data the writer wrote.\n *\n * @param threadKey - Thread key (defaults to `\"messages\"` inside the\n * thread manager, but downstream adapters may pass\n * their own value).\n * @param threadId - Thread id as provided to the thread manager.\n */\nexport function getThreadListKey(\n threadKey: string,\n threadId: string\n): string {\n return `${threadKey}:thread:${threadId}`;\n}\n\n/**\n * Build the Redis key that stores a thread's existence marker / metadata.\n *\n * Zeitlich treats the presence of this key as \"thread has been\n * initialized\"; append/load/fork/truncate operations fail when it is\n * missing. Consumers can use it as a cheap existence probe without\n * scanning the message list.\n *\n * @param threadKey - Thread key (defaults to `\"messages\"` inside the\n * thread manager, but downstream adapters may pass\n * their own value).\n * @param threadId - Thread id as provided to the thread manager.\n */\nexport function getThreadMetaKey(\n threadKey: string,\n threadId: string\n): string {\n return `${threadKey}:meta:thread:${threadId}`;\n}\n\n/**\n * Build the Redis key that stores a thread's persisted state slice\n * (tasks + custom state) written by zeitlich's session loop on every\n * exit path.\n *\n * Consumers can read this key with `redis.get(getThreadStateKey(key, id))`\n * and `JSON.parse` the result into a {@link PersistedThreadState}.\n *\n * @param threadKey - Thread key (defaults to `\"messages\"` inside the\n * thread manager, but downstream adapters may pass\n * their own value).\n * @param threadId - Thread id as provided to the thread manager.\n */\nexport function getThreadStateKey(\n threadKey: string,\n threadId: string\n): string {\n return `${threadKey}:state:thread:${threadId}`;\n}\n","import type { JsonValue } from \"./state/types\";\nimport type { FileEntry } from \"./virtual-fs/types\";\n\n// ============================================================================\n// Agent core types\n// ============================================================================\n\n/**\n * Agent execution status\n */\nexport type AgentStatus =\n | \"RUNNING\"\n | \"WAITING_FOR_INPUT\"\n | \"COMPLETED\"\n | \"FAILED\"\n | \"CANCELLED\";\n\n/**\n * Base state that all agents must have\n */\nexport interface BaseAgentState {\n tools: SerializableToolDefinition[];\n status: AgentStatus;\n version: number;\n turns: number;\n tasks: Map<string, WorkflowTask>;\n fileTree: FileEntry[];\n /** In-memory file contents keyed by path, bypassing the resolver (e.g. skill resources). */\n inlineFiles?: Record<string, string>;\n virtualFsCtx?: unknown;\n systemPrompt?: unknown;\n totalInputTokens: number;\n totalOutputTokens: number;\n cachedWriteTokens: number;\n cachedReadTokens: number;\n}\n\n/**\n * File representation for agent workflows\n */\nexport interface AgentFile {\n /** Database/S3 file ID */\n id: string;\n /** Virtual path for agent (e.g., \"evidence/invoice.pdf\") */\n path: string;\n /** Original filename */\n filename: string;\n /** Generic description for prompt */\n description?: string;\n /** MIME type of the file */\n mimeType?: string;\n}\n\nexport interface TokenUsage {\n inputTokens?: number;\n outputTokens?: number;\n cachedWriteTokens?: number;\n cachedReadTokens?: number;\n reasonTokens?: number;\n}\n\n/**\n * Configuration for a Zeitlich agent\n */\nexport interface AgentConfig {\n /** The name of the agent, should be unique within the workflows, ideally Pascal Case */\n agentName: string;\n /** Description, used for sub agents */\n description?: string;\n}\n\n/**\n * A JSON-serializable tool definition for state storage.\n * Uses a plain JSON Schema object instead of a live Zod instance,\n * so it survives Temporal serialization without losing constraints (min, max, etc.).\n */\nexport interface SerializableToolDefinition {\n name: string;\n description: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n max_uses?: number;\n}\n\n/**\n * Configuration passed to runAgent activity\n */\nexport interface RunAgentConfig extends AgentConfig {\n /** The thread ID to use for the session */\n threadId: string;\n /** Redis key suffix for thread storage. Defaults to 'messages'. */\n threadKey?: string;\n /** Metadata for the session */\n metadata?: Record<string, unknown>;\n /**\n * The id under which the assistant message produced by this call will\n * be appended. The activity truncates the thread from this id on\n * entry (no-op on the first attempt) so that:\n *\n * - Rewind retries can reuse the same id and the previous (bad)\n * assistant + its tool results are wiped before the retry LLM call.\n * - Resetting the Temporal workflow to this activity restores the\n * pre-call thread state: replay re-truncates, re-invokes, and\n * appends under the same id.\n */\n assistantMessageId: string;\n}\n\n/**\n * Configuration for appending a tool result\n */\nexport interface ToolResultConfig {\n threadId: string;\n /** Redis key suffix for thread storage. Defaults to 'messages'. */\n threadKey?: string;\n toolCallId: string;\n /** The name of the tool that produced this result */\n toolName: string;\n /** Content for the tool result — string, object, or array. The adapter converts to its SDK-native format. */\n content: JsonValue;\n}\n\n// ============================================================================\n// Workflow Tasks\n// ============================================================================\n\n/**\n * Status of a workflow task\n */\nexport type TaskStatus = \"pending\" | \"in_progress\" | \"completed\";\n\n/**\n * A task managed within a workflow for tracking work items\n */\nexport interface WorkflowTask {\n /** Unique task identifier */\n id: string;\n /** Brief, actionable title in imperative form */\n subject: string;\n /** Detailed description of what needs to be done */\n description: string;\n /** Present continuous form shown in spinner when in_progress */\n activeForm: string;\n /** Current status of the task */\n status: TaskStatus;\n /** Arbitrary key-value pairs for tracking */\n metadata: Record<string, string>;\n /** IDs of tasks that must complete before this one can start */\n blockedBy: string[];\n /** IDs of tasks that are waiting for this one to complete */\n blocks: string[];\n}\n\n// ============================================================================\n// Session exit\n// ============================================================================\n\n/**\n * Exit reasons for session termination\n */\nexport type SessionExitReason =\n | \"completed\"\n | \"max_turns\"\n | \"waiting_for_input\"\n | \"failed\"\n | \"cancelled\";\n\n/**\n * Helper to check if status is terminal\n */\nexport function isTerminalStatus(status: AgentStatus): boolean {\n return (\n status === \"COMPLETED\" || status === \"FAILED\" || status === \"CANCELLED\"\n );\n}\n","import {\n condition,\n defineQuery,\n defineUpdate,\n setHandler,\n} from \"@temporalio/workflow\";\nimport {\n type AgentStatus,\n type BaseAgentState,\n type WorkflowTask,\n isTerminalStatus,\n} from \"../types\";\nimport type { ToolDefinition } from \"../tool-router/types\";\nimport type {\n AgentState,\n AgentStateManager,\n JsonSerializable,\n JsonValue,\n PersistedThreadState,\n} from \"./types\";\nimport { z } from \"zod\";\n\n/**\n * Creates an agent state manager for tracking workflow state.\n * Automatically registers Temporal query and update handlers for the agent.\n *\n * @param options.agentName - Unique agent name, used to derive query/update handler names\n * @param options.initialState - Optional initial values for base and custom state.\n * Use `systemPrompt` here to set the agent's system prompt.\n * Base state defaults: status=\"RUNNING\", version=0, turns=0, tasks=empty\n *\n * @example\n * ```typescript\n * const stateManager = createAgentStateManager({\n * initialState: {\n * systemPrompt: \"You are a helpful assistant.\",\n * },\n * agentName: \"my-agent\",\n * });\n *\n * // With custom state fields\n * const stateManager = createAgentStateManager({\n * initialState: {\n * systemPrompt: agentConfig.systemPrompt,\n * customField: \"value\",\n * },\n * agentName: agentConfig.agentName,\n * });\n * ```\n */\nexport function createAgentStateManager<\n TCustom extends JsonSerializable<TCustom> = Record<string, never>,\n>({\n initialState,\n}: {\n initialState?: Partial<BaseAgentState> & TCustom;\n}): AgentStateManager<TCustom> {\n let status: AgentStatus = initialState?.status ?? \"RUNNING\";\n let version = initialState?.version ?? 0;\n let turns = initialState?.turns ?? 0;\n let tools = initialState?.tools ?? [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalCachedWriteTokens = 0;\n let totalCachedReadTokens = 0;\n let totalReasonTokens = 0;\n let systemPrompt = initialState?.systemPrompt;\n\n const tasks = new Map<string, WorkflowTask>(initialState?.tasks);\n\n const {\n status: _status,\n version: _version,\n turns: _turns,\n tasks: _tasks,\n tools: _tools,\n systemPrompt: _systemPrompt,\n fileTree: _fileTree,\n inlineFiles: _inlineFiles,\n virtualFsCtx: _virtualFsCtx,\n totalInputTokens: _totalInputTokens,\n totalOutputTokens: _totalOutputTokens,\n cachedWriteTokens: _cachedWriteTokens,\n cachedReadTokens: _cachedReadTokens,\n ...custom\n } = initialState ?? {};\n const customState = custom as TCustom;\n\n function buildState(): AgentState<TCustom> {\n return {\n status,\n version,\n turns,\n tools,\n ...customState,\n } as AgentState<TCustom>;\n }\n\n const stateQuery = defineQuery<AgentState<TCustom>>(\"getAgentState\");\n const stateChangeUpdate = defineUpdate<AgentState<TCustom>, [number]>(\n \"waitForAgentStateChange\"\n );\n\n setHandler(stateQuery, () => buildState());\n setHandler(stateChangeUpdate, async (lastKnownVersion: number) => {\n await condition(\n () => version > lastKnownVersion || isTerminalStatus(status),\n \"55s\"\n );\n return buildState();\n });\n\n return {\n stateQuery,\n stateChangeUpdate,\n\n getStatus(): AgentStatus {\n return status;\n },\n\n isRunning(): boolean {\n return status === \"RUNNING\";\n },\n\n getSystemPrompt(): unknown {\n return systemPrompt;\n },\n\n isTerminal(): boolean {\n return isTerminalStatus(status);\n },\n\n getTurns(): number {\n return turns;\n },\n\n getVersion(): number {\n return version;\n },\n\n run(): void {\n status = \"RUNNING\";\n version++;\n },\n\n waitForInput(): void {\n status = \"WAITING_FOR_INPUT\";\n version++;\n },\n\n complete(): void {\n status = \"COMPLETED\";\n version++;\n },\n\n fail(): void {\n status = \"FAILED\";\n version++;\n },\n\n cancel(): void {\n status = \"CANCELLED\";\n version++;\n },\n\n incrementVersion(): void {\n version++;\n },\n\n incrementTurns(): void {\n turns++;\n },\n\n get<K extends keyof TCustom>(key: K): TCustom[K] {\n return customState[key];\n },\n\n set<K extends keyof TCustom>(key: K, value: TCustom[K]): void {\n customState[key] = value;\n version++;\n },\n\n mergeUpdate(update: Partial<AgentState<TCustom>>): void {\n const { tasks: nextTasks, ...rest } = update as Partial<\n AgentState<TCustom>\n > & { tasks?: Map<string, WorkflowTask> };\n if (nextTasks) {\n tasks.clear();\n for (const [id, task] of nextTasks) {\n tasks.set(id, task);\n }\n }\n Object.assign(customState as object, rest);\n version++;\n },\n\n getCurrentState(): AgentState<TCustom> {\n return buildState();\n },\n\n shouldReturnFromWait(lastKnownVersion: number): boolean {\n return version > lastKnownVersion || isTerminalStatus(status);\n },\n\n getTasks(): WorkflowTask[] {\n return Array.from(tasks.values());\n },\n\n getTask(id: string): WorkflowTask | undefined {\n return tasks.get(id);\n },\n\n setTask(task: WorkflowTask): void {\n tasks.set(task.id, task);\n version++;\n },\n\n setTools(newTools: ToolDefinition[]): void {\n tools = newTools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n schema: z.toJSONSchema(tool.schema) as Record<string, unknown>,\n strict: tool.strict,\n max_uses: tool.max_uses,\n }));\n },\n\n setSystemPrompt(newSystemPrompt: unknown): void {\n systemPrompt = newSystemPrompt;\n },\n\n deleteTask(id: string): boolean {\n const deleted = tasks.delete(id);\n if (deleted) {\n version++;\n }\n return deleted;\n },\n\n getPersistedSlice(): PersistedThreadState {\n return {\n tasks: Array.from(tasks.entries()),\n custom: { ...(customState as unknown as Record<string, JsonValue>) },\n };\n },\n\n updateUsage(usage: {\n inputTokens?: number;\n outputTokens?: number;\n cachedWriteTokens?: number;\n cachedReadTokens?: number;\n reasonTokens?: number;\n }): void {\n totalInputTokens += usage.inputTokens ?? 0;\n totalOutputTokens += usage.outputTokens ?? 0;\n totalCachedWriteTokens += usage.cachedWriteTokens ?? 0;\n totalCachedReadTokens += usage.cachedReadTokens ?? 0;\n totalReasonTokens += usage.reasonTokens ?? 0;\n },\n\n getTotalUsage(): {\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCachedWriteTokens: number;\n totalCachedReadTokens: number;\n totalReasonTokens: number;\n turns: number;\n } {\n return {\n totalInputTokens,\n totalOutputTokens,\n totalCachedWriteTokens,\n totalCachedReadTokens,\n totalReasonTokens,\n turns,\n };\n },\n };\n}\n","import type { z } from \"zod\";\nimport type {\n SubagentConfig,\n SubagentDefinition,\n SubagentHooks,\n SubagentSandboxConfig,\n SubagentWorkflow,\n} from \"./types\";\nimport type { SubagentArgs } from \"./tool\";\n\n/**\n * Creates a `SubagentConfig` from a `SubagentDefinition` (returned by `defineSubagentWorkflow`).\n * Metadata (name, description, resultSchema) is read from the definition — only configure\n * what's specific to this usage in the parent workflow.\n *\n * @example\n * ```ts\n * // Minimal — all metadata comes from the definition\n * export const researcher = defineSubagent(researcherWorkflow);\n *\n * // With parent-specific overrides\n * export const researcher = defineSubagent(researcherWorkflow, {\n * thread: \"fork\",\n * sandbox: { source: \"own\", continuation: \"fork\", shutdown: \"pause\" },\n * hooks: {\n * onPostExecution: ({ result }) => console.log(result),\n * },\n * });\n *\n * // With typed context\n * export const researcher = defineSubagent(researcherWorkflow, {\n * context: { apiKey: \"...\" },\n * });\n * ```\n */\nexport function defineSubagent<\n TResult extends z.ZodType = z.ZodType,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n definition: SubagentDefinition<TResult, TContext>,\n overrides?: {\n context?: TContext | (() => TContext);\n hooks?: SubagentHooks<SubagentArgs, z.infer<TResult>>;\n enabled?: boolean | (() => boolean);\n taskQueue?: string;\n thread?: \"new\" | \"fork\" | \"continue\";\n sandbox?: SubagentSandboxConfig;\n }\n): SubagentConfig<TResult> {\n return {\n agentName: definition.agentName,\n description: definition.description,\n workflow: definition as SubagentWorkflow<TResult>,\n ...(definition.resultSchema !== undefined && {\n resultSchema: definition.resultSchema,\n }),\n ...overrides,\n } as SubagentConfig<TResult>;\n}\n","import type { z } from \"zod\";\nimport {\n workflowInfo,\n getExternalWorkflowHandle,\n ApplicationFailure,\n} from \"@temporalio/workflow\";\nimport type {\n SubagentDefinition,\n SubagentFnResult,\n SubagentHandlerResponse,\n SubagentWorkflowInput,\n SubagentSessionInput,\n} from \"./types\";\nimport type { SubagentSandboxShutdown } from \"../lifecycle\";\nimport type { SandboxSnapshot } from \"../sandbox/types\";\nimport { childSandboxReadySignal } from \"./signals\";\n\n/**\n * Defines a subagent workflow with embedded metadata (name, description, resultSchema).\n * The returned value can be passed directly to `defineSubagent` — no need to repeat\n * the name, description, or resultSchema in the parent workflow.\n *\n * Internally maps `SubagentWorkflowInput` fields to session-compatible `SubagentSessionInput`.\n *\n * @example\n * ```ts\n * import {\n * defineSubagentWorkflow,\n * defineSubagent,\n * createSession,\n * createAgentStateManager,\n * } from 'zeitlich/workflow';\n *\n * // Define once — carries name, description, resultSchema\n * export const researcherWorkflow = defineSubagentWorkflow(\n * {\n * name: \"researcher\",\n * description: \"Researches topics on the web\",\n * resultSchema: z.object({ findings: z.string() }),\n * },\n * async (prompt, sessionInput) => {\n * const stateManager = createAgentStateManager({\n * initialState: { systemPrompt: \"You are a researcher.\" },\n * });\n *\n * const session = await createSession({\n * ...sessionInput,\n * agentName: \"researcher\",\n * runAgent: runAgentActivity,\n * buildContextMessage: () => [{ type: \"text\", text: prompt }],\n * });\n *\n * const { finalMessage, threadId } = await session.runSession({ stateManager });\n * // `sandboxId`, `snapshot`, and `baseSnapshot` are auto-forwarded\n * // from the session — no need to thread them through manually.\n * return { toolResponse: finalMessage ?? \"No response\", data: null, threadId };\n * },\n * );\n *\n * // Use in parent — only configure what's parent-specific\n * export const researcher = defineSubagent(researcherWorkflow, {\n * hooks: { onPostExecution: ({ result }) => console.log(result) },\n * });\n * ```\n */\n// Without resultSchema — data is null\nexport function defineSubagentWorkflow<\n TSandboxShutdown extends SubagentSandboxShutdown = \"destroy\",\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n config: {\n name: string;\n description: string;\n sandboxShutdown?: TSandboxShutdown;\n },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: TContext\n ) => Promise<SubagentFnResult<null, TSandboxShutdown>>\n): SubagentDefinition<z.ZodNull, TContext>;\n// With resultSchema — data is inferred from the schema\nexport function defineSubagentWorkflow<\n TResult extends z.ZodType,\n TSandboxShutdown extends SubagentSandboxShutdown = \"destroy\",\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n config: {\n name: string;\n description: string;\n resultSchema: TResult;\n sandboxShutdown?: TSandboxShutdown;\n },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: TContext\n ) => Promise<SubagentFnResult<z.infer<TResult> | null, TSandboxShutdown>>\n): SubagentDefinition<TResult, TContext>;\nexport function defineSubagentWorkflow(\n config: {\n name: string;\n description: string;\n resultSchema?: z.ZodType;\n sandboxShutdown?: SubagentSandboxShutdown;\n },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: Record<string, unknown>\n ) => Promise<SubagentFnResult<unknown>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): SubagentDefinition<any, any> {\n const workflow = async (\n prompt: string,\n workflowInput: SubagentWorkflowInput,\n context?: Record<string, unknown>\n ): Promise<SubagentHandlerResponse<unknown>> => {\n const effectiveShutdown =\n workflowInput.sandboxShutdown ?? config.sandboxShutdown ?? \"destroy\";\n\n const { parent } = workflowInfo();\n if (!parent) {\n throw ApplicationFailure.create({\n message: \"Subagent workflow called without a parent workflow\",\n nonRetryable: true,\n });\n }\n const parentHandle = getExternalWorkflowHandle(parent.workflowId);\n\n let capturedSandboxId: string | undefined;\n let capturedSnapshot: SandboxSnapshot | undefined;\n let capturedBaseSnapshot: SandboxSnapshot | undefined;\n let capturedThreadId: string | undefined;\n const sessionInput: SubagentSessionInput = {\n agentName: config.name,\n sandboxShutdown: effectiveShutdown,\n ...(workflowInput.thread && { thread: workflowInput.thread }),\n ...(workflowInput.sandbox && { sandbox: workflowInput.sandbox }),\n onSandboxReady: ({ sandboxId, baseSnapshot }) => {\n capturedBaseSnapshot = baseSnapshot;\n const isReuse = workflowInput.sandbox?.mode === \"continue\";\n if (!isReuse) {\n void parentHandle.signal(childSandboxReadySignal, {\n childWorkflowId: workflowInfo().workflowId,\n sandboxId,\n ...(baseSnapshot && { baseSnapshot }),\n });\n }\n },\n onSessionExit: ({ sandboxId, snapshot, threadId }) => {\n capturedSandboxId = sandboxId;\n capturedSnapshot = snapshot;\n capturedThreadId = threadId;\n },\n };\n\n const result = await fn(prompt, sessionInput, context ?? {});\n\n // Auto-forward sandbox outputs captured from the session so user code\n // never has to thread them through manually. Explicit values on the fn\n // result take precedence.\n return {\n ...result,\n ...(capturedThreadId !== undefined && { threadId: capturedThreadId }),\n ...(capturedSandboxId !== undefined && { sandboxId: capturedSandboxId }),\n ...(capturedSnapshot !== undefined && { snapshot: capturedSnapshot }),\n ...(capturedBaseSnapshot !== undefined && {\n baseSnapshot: capturedBaseSnapshot,\n }),\n };\n };\n\n // for temporal workflow name\n Object.defineProperty(workflow, \"name\", { value: config.name });\n\n return Object.assign(workflow, {\n agentName: config.name,\n description: config.description,\n ...(config.resultSchema !== undefined && {\n resultSchema: config.resultSchema,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as SubagentDefinition<any, any>;\n}\n","import { proxySinks } from \"@temporalio/workflow\";\nimport type { ZeitlichObservabilitySinks } from \"./sinks\";\nimport type { SessionStartHook, SessionEndHook } from \"../hooks/types\";\nimport type {\n PostToolUseHook,\n PostToolUseFailureHook,\n} from \"../tool-router/types\";\n\nexport interface ObservabilityHooks {\n onSessionStart: SessionStartHook;\n onSessionEnd: SessionEndHook;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onPostToolUse: PostToolUseHook<any, any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onPostToolUseFailure: PostToolUseFailureHook<any>;\n}\n\n/**\n * Creates session hooks that emit agent lifecycle events to\n * {@link ZeitlichObservabilitySinks}.\n *\n * The returned hooks call `proxySinks()` once and forward each event to\n * the `zeitlichMetrics` sink. If the sink is not registered on the Worker,\n * calls are silently dropped by the Temporal runtime.\n *\n * Combine with your own hooks using spread or {@link composeHooks}:\n *\n * ```typescript\n * const session = await createSession({\n * hooks: {\n * ...createObservabilityHooks(\"myAgent\"),\n * // additional hooks can be composed via composeHooks()\n * },\n * });\n * ```\n *\n * @param agentName - Agent name attached to every emitted event\n */\nexport function createObservabilityHooks(\n agentName: string\n): ObservabilityHooks {\n const { zeitlichMetrics } = proxySinks<ZeitlichObservabilitySinks>();\n let sessionStartMs = Date.now();\n\n return {\n onSessionStart: (ctx) => {\n sessionStartMs = Date.now();\n zeitlichMetrics.sessionStarted({\n agentName,\n threadId: ctx.threadId,\n metadata: ctx.metadata,\n });\n },\n\n onSessionEnd: (ctx) => {\n zeitlichMetrics.sessionEnded({\n agentName,\n threadId: ctx.threadId,\n exitReason: ctx.exitReason,\n turns: ctx.turns,\n usage: {},\n durationMs: Date.now() - sessionStartMs,\n });\n },\n\n onPostToolUse: (ctx) => {\n zeitlichMetrics.toolExecuted({\n agentName,\n toolName: ctx.toolCall.name,\n durationMs: ctx.durationMs,\n success: true,\n threadId: ctx.threadId,\n turn: ctx.turn,\n });\n },\n\n onPostToolUseFailure: (ctx) => {\n zeitlichMetrics.toolExecuted({\n agentName,\n toolName: ctx.toolCall.name,\n durationMs: 0,\n success: false,\n threadId: ctx.threadId,\n turn: ctx.turn,\n });\n return {};\n },\n };\n}\n\n/**\n * Compose multiple hook functions for the same lifecycle event into one.\n *\n * Each hook is called sequentially in order. Return values from\n * `onPreToolUse` / `onPostToolUseFailure` use the **last** non-undefined\n * result (later hooks can override earlier ones).\n *\n * @example\n * ```typescript\n * const obs = createObservabilityHooks(\"myAgent\");\n * const hooks = {\n * onSessionEnd: composeHooks(obs.onSessionEnd, myCustomEndHook),\n * };\n * ```\n */\nexport function composeHooks<TArgs extends unknown[], TReturn>(\n ...fns: ((...args: TArgs) => TReturn | Promise<TReturn>)[]\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n let lastResult!: TReturn;\n for (const fn of fns) {\n lastResult = await fn(...args);\n }\n return lastResult;\n };\n}\n","/**\n * Workflow-safe proxy for runAgent activities with LLM-optimised defaults.\n *\n * Resolves the activity name from the scope using the same convention as\n * {@link createRunAgentActivity}: `run<Scope>`.\n * When no scope is provided, defaults to `workflowInfo().workflowType`.\n *\n * Import this from `zeitlich/workflow` in your Temporal workflow files.\n *\n * @typeParam M - SDK-native message type (e.g. `StoredMessage` for LangChain,\n * `Anthropic.Messages.Message` for Anthropic, `Content` for Google GenAI).\n * Must be provided for `SessionResult.finalMessage` to be correctly typed.\n *\n * @example\n * ```typescript\n * import { proxyRunAgent } from 'zeitlich/workflow';\n * import type { StoredMessage } from '@langchain/core/messages';\n *\n * // Auto-scoped to the current workflow name\n * const runAgent = proxyRunAgent<StoredMessage>();\n *\n * // Explicit scope for subagents\n * const runResearcher = proxyRunAgent<StoredMessage>(\"Researcher\");\n * ```\n */\nimport { proxyActivities, workflowInfo } from \"@temporalio/workflow\";\nimport type { AgentResponse } from \"./types\";\nimport type { RunAgentConfig } from \"../types\";\n\nexport function proxyRunAgent<M = unknown>(\n scope?: string,\n options?: Parameters<typeof proxyActivities>[0]\n): (config: RunAgentConfig) => Promise<AgentResponse<M>> {\n const resolvedScope = scope ?? workflowInfo().workflowType;\n const name = `run${resolvedScope.charAt(0).toUpperCase()}${resolvedScope.slice(1)}`;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const acts = proxyActivities<Record<string, (...args: any[]) => any>>(\n options ?? {\n startToCloseTimeout: \"10m\",\n heartbeatTimeout: \"1m\",\n retry: {\n maximumAttempts: 3,\n initialInterval: \"10s\",\n maximumInterval: \"2m\",\n backoffCoefficient: 3,\n },\n }\n );\n return acts[name] as (config: RunAgentConfig) => Promise<AgentResponse<M>>;\n}\n","// ============================================================================\n// Sandbox Filesystem\n// ============================================================================\n\nexport interface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport interface FileStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mtime: Date;\n}\n\n// ============================================================================\n// Network & lifecycle\n// ============================================================================\n\nexport interface SandboxNetworkConfig {\n allowOut?: string[];\n denyOut?: string[];\n allowPublicTraffic?: boolean;\n}\n\nexport interface SandboxLifecycleConfig {\n onTimeout: \"kill\" | \"pause\";\n autoResume?: boolean;\n}\n\n/**\n * Provider-agnostic filesystem interface.\n *\n * Implementations that don't support a method should throw\n * {@link SandboxNotSupportedError}.\n */\nexport interface SandboxFileSystem {\n /** Base directory used when resolving relative paths. */\n readonly workspaceBase: string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: string | Uint8Array): Promise<void>;\n appendFile(path: string, content: string | Uint8Array): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FileStat>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readdir(path: string): Promise<string[]>;\n readdirWithFileTypes(path: string): Promise<DirentEntry[]>;\n rm(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): Promise<void>;\n cp(\n src: string,\n dest: string,\n options?: { recursive?: boolean }\n ): Promise<void>;\n mv(src: string, dest: string): Promise<void>;\n readlink(path: string): Promise<string>;\n resolvePath(base: string, path: string): string;\n}\n\n// ============================================================================\n// Execution\n// ============================================================================\n\nexport interface ExecOptions {\n timeout?: number;\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport interface ExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// ============================================================================\n// Capabilities\n// ============================================================================\n\nexport interface SandboxCapabilities {\n /** Sandbox supports filesystem operations */\n filesystem: boolean;\n /** Sandbox supports shell/command execution */\n execution: boolean;\n /** Sandbox state can be persisted and restored */\n persistence: boolean;\n}\n\n// ============================================================================\n// Sandbox\n// ============================================================================\n\nexport interface Sandbox {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n readonly fs: SandboxFileSystem;\n\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n destroy(): Promise<void>;\n}\n\n// ============================================================================\n// Snapshots\n// ============================================================================\n\nexport interface SandboxSnapshot {\n sandboxId: string;\n providerId: string;\n /** Provider-specific serialised state */\n data: unknown;\n createdAt: string;\n}\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport interface SandboxCreateOptions {\n /** Preferred sandbox ID (provider may ignore) */\n id?: string;\n /** Seed the filesystem with these files */\n initialFiles?: Record<string, string | Uint8Array>;\n /** Environment variables available inside the sandbox */\n env?: Record<string, string>;\n /** Key-value metadata surfaced via provider list/query APIs */\n metadata?: Record<string, string>;\n /** Sandbox idle timeout in milliseconds */\n timeoutMs?: number;\n /** Enable or disable outbound internet access */\n allowInternetAccess?: boolean;\n /** Outbound network allow/deny rules */\n network?: SandboxNetworkConfig;\n /** Sandbox timeout behaviour */\n lifecycle?: SandboxLifecycleConfig;\n}\n\nexport interface SandboxCreateResult {\n sandbox: Sandbox;\n}\n\nexport interface SandboxProvider<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TSandbox extends Sandbox = Sandbox,\n> {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n\n create(options?: TOptions): Promise<SandboxCreateResult>;\n get(sandboxId: string): Promise<TSandbox>;\n destroy(sandboxId: string): Promise<void>;\n pause(sandboxId: string, ttlSeconds?: number): Promise<void>;\n /** Resume a paused sandbox. No-op if already running. */\n resume(sandboxId: string): Promise<void>;\n /**\n * Capture a snapshot of a running sandbox. `options` is a per-call override\n * merged on top of the provider's static defaults.\n */\n snapshot(sandboxId: string, options?: TOptions): Promise<SandboxSnapshot>;\n /**\n * Restore a sandbox from a snapshot. `options` is a per-call override\n * merged on top of the provider's static defaults.\n */\n restore(snapshot: SandboxSnapshot, options?: TOptions): Promise<Sandbox>;\n /** Delete a previously captured snapshot. No-op if already deleted. */\n deleteSnapshot(snapshot: SandboxSnapshot): Promise<void>;\n /**\n * Fork a running sandbox into a new one. `options` is a per-call override\n * merged on top of the provider's static defaults.\n */\n fork(sandboxId: string, options?: TOptions): Promise<Sandbox>;\n}\n\n// ============================================================================\n// SandboxOps — workflow-side activity interface (like ThreadOps)\n// ============================================================================\n\nexport interface SandboxOps<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TCtx = unknown,\n> {\n createSandbox(\n options?: TOptions,\n ctx?: TCtx\n ): Promise<{ sandboxId: string } | null>;\n destroySandbox(sandboxId: string): Promise<void>;\n pauseSandbox(sandboxId: string): Promise<void>;\n /** Resume a paused sandbox. No-op if already running. */\n resumeSandbox(sandboxId: string): Promise<void>;\n /** Capture a snapshot. `options` is a per-call override merged on top of provider defaults. */\n snapshotSandbox(\n sandboxId: string,\n options?: TOptions\n ): Promise<SandboxSnapshot>;\n /** Create a fresh sandbox from a snapshot. `options` is a per-call override merged on top of provider defaults. */\n restoreSandbox(\n snapshot: SandboxSnapshot,\n options?: TOptions\n ): Promise<string>;\n /** Delete a previously captured snapshot. No-op if already deleted. */\n deleteSandboxSnapshot(snapshot: SandboxSnapshot): Promise<void>;\n /** Fork a running sandbox. `options` is a per-call override merged on top of provider defaults. */\n forkSandbox(sandboxId: string, options?: TOptions): Promise<string>;\n}\n\n/**\n * Maps generic {@link SandboxOps} method names to adapter-prefixed names.\n *\n * @example\n * ```typescript\n * type InMemOps = PrefixedSandboxOps<\"inMemory\">;\n * // → { inMemoryCreateSandbox, inMemoryDestroySandbox, inMemorySnapshotSandbox }\n * ```\n */\nexport type PrefixedSandboxOps<\n TPrefix extends string,\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TCtx = unknown,\n> = {\n [K in keyof SandboxOps<\n TOptions,\n TCtx\n > as `${TPrefix}${Capitalize<K & string>}`]: SandboxOps<TOptions, TCtx>[K];\n};\n\n// ============================================================================\n// Errors\n// ============================================================================\n\nimport { ApplicationFailure } from \"@temporalio/common\";\n\nexport class SandboxNotSupportedError extends ApplicationFailure {\n constructor(operation: string) {\n super(\n `Sandbox does not support: ${operation}`,\n \"SandboxNotSupportedError\",\n true\n );\n }\n}\n\nexport class SandboxNotFoundError extends ApplicationFailure {\n constructor(sandboxId: string) {\n super(`Sandbox not found: ${sandboxId}`, \"SandboxNotFoundError\", true);\n }\n}\n","import type { FileEntryMetadata, VirtualFileTree, TreeMutation } from \"./types\";\n\n/**\n * Apply a list of {@link TreeMutation}s to the `fileTree` stored in a state\n * manager instance, updating it in place and returning the new tree.\n *\n * The `stateManager` parameter is structurally typed so any\n * {@link AgentStateManager} whose custom state includes\n * `fileTree: VirtualFileTree<TMeta>` will satisfy it.\n */\nexport function applyVirtualTreeMutations<TMeta = FileEntryMetadata>(\n stateManager: {\n get(key: \"fileTree\"): VirtualFileTree<TMeta>;\n set(key: \"fileTree\", value: VirtualFileTree<TMeta>): void;\n },\n mutations: TreeMutation<TMeta>[]\n): VirtualFileTree<TMeta> {\n let tree = [...stateManager.get(\"fileTree\")];\n\n for (const m of mutations) {\n switch (m.type) {\n case \"add\":\n tree.push(m.entry);\n break;\n case \"remove\":\n tree = tree.filter((e) => e.path !== m.path);\n break;\n case \"update\":\n tree = tree.map((e) => (e.path === m.path ? { ...e, ...m.entry } : e));\n break;\n }\n }\n\n stateManager.set(\"fileTree\", tree);\n return tree;\n}\n","import type { FileEntry } from \"./types\";\n\ninterface TreeNode {\n name: string;\n children: Map<string, TreeNode>;\n isFile: boolean;\n}\n\nconst buildTree = <T>(entries: FileEntry<T>[]): TreeNode => {\n const root: TreeNode = { name: \"/\", children: new Map(), isFile: false };\n\n for (const entry of entries) {\n const parts = entry.path.split(\"/\").filter(Boolean);\n let current = root;\n for (const part of parts) {\n let child = current.children.get(part);\n if (!child) {\n child = { name: part, children: new Map(), isFile: false };\n current.children.set(part, child);\n }\n current = child;\n }\n current.isFile = current.children.size === 0;\n }\n\n return root;\n};\n\nconst printNode = (node: TreeNode, tab: string, sort: boolean): string => {\n const entries = [...node.children.values()];\n if (sort) {\n entries.sort((a, b) => {\n if (!a.isFile && !b.isFile) return a.name.localeCompare(b.name);\n if (!a.isFile) return -1;\n if (!b.isFile) return 1;\n return a.name.localeCompare(b.name);\n });\n }\n\n let str = \"\";\n for (const [i, entry] of entries.entries()) {\n const isLast = i === entries.length - 1;\n const branch = isLast ? \"└─\" : \"├─\";\n const childTab = tab + (isLast ? \" \" : \"│ \");\n\n if (entry.isFile) {\n str += \"\\n\" + tab + branch + \" \" + entry.name;\n } else {\n const subtree = printNode(entry, childTab, sort);\n str += \"\\n\" + tab + branch + \" \" + entry.name + \"/\" + subtree;\n }\n }\n return str;\n};\n\n/**\n * Generates a formatted file tree string from a flat {@link FileEntry} list.\n * Directories are inferred from file paths — no filesystem access needed.\n *\n * @param entries - Flat list of file entries\n * @param opts - Optional configuration\n * @param opts.sort - Sort entries alphabetically with directories first (defaults to true)\n * @returns Formatted file tree string\n *\n * @example\n * ```typescript\n * const tree = formatVirtualFileTree(state.fileTree);\n * // /\n * // ├─ src/\n * // │ ├─ index.ts\n * // │ └─ utils.ts\n * // └─ package.json\n * ```\n */\nexport function formatVirtualFileTree<T>(\n entries: FileEntry<T>[],\n opts: { sort?: boolean } = {}\n): string {\n const sort = opts.sort ?? true;\n const root = buildTree(entries);\n return \"/\" + printNode(root, \"\", sort);\n}\n","import type { FileEntry } from \"./types\";\n\n/**\n * Structural constraint: accepts any `AgentStateManager<T>` whose custom\n * state includes `fileTree: FileEntry<TMeta>[]`.\n */\nexport interface FileTreeAccessor<TMeta> {\n get(key: \"fileTree\"): FileEntry<TMeta>[];\n}\n\n/**\n * Check whether any file in the tree has a `metadata.mimeType` that matches\n * the given pattern.\n *\n * Patterns:\n * - Exact: `\"application/pdf\"`\n * - Wildcard type: `\"image/*\"`\n *\n * Useful for conditionally enabling tools:\n *\n * ```ts\n * { enabled: hasFileWithMimeType(stateManager, \"image/*\") }\n * { enabled: hasFileWithMimeType(stateManager, [\"image/*\", \"application/pdf\"]) }\n * ```\n */\nexport function hasFileWithMimeType<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string | string[]\n): boolean {\n const tree = stateManager.get(\"fileTree\");\n const matchers = (Array.isArray(pattern) ? pattern : [pattern]).map(\n buildMatcher\n );\n return tree.some((entry) => {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const mime = meta?.mimeType;\n return typeof mime === \"string\" && matchers.some((m) => m(mime));\n });\n}\n\n/**\n * Return all entries whose `metadata.mimeType` matches the given pattern.\n */\nexport function filesWithMimeType<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string\n): FileEntry<TMeta>[] {\n const tree = stateManager.get(\"fileTree\");\n const match = buildMatcher(pattern);\n return tree.filter((entry) => {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const mime = meta?.mimeType;\n return typeof mime === \"string\" && match(mime);\n });\n}\n\n/**\n * Check whether the tree contains a directory whose name matches the given\n * pattern. Directories are inferred from file paths.\n *\n * Patterns:\n * - Exact: `\"src\"`\n * - Glob with `*` wildcard: `\"test*\"`, `\"*.generated\"`\n *\n * ```ts\n * { enabled: hasDirectory(stateManager, \"test*\") }\n * ```\n */\nexport function hasDirectory<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string\n): boolean {\n const tree = stateManager.get(\"fileTree\");\n const match = buildGlobMatcher(pattern);\n return tree.some((entry) => {\n const segments = entry.path.split(\"/\").filter(Boolean);\n return segments.slice(0, -1).some(match);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal matchers\n// ---------------------------------------------------------------------------\n\nfunction buildMatcher(pattern: string): (value: string) => boolean {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -1);\n return (v) => v.startsWith(prefix);\n }\n return (v) => v === pattern;\n}\n\nfunction buildGlobMatcher(pattern: string): (value: string) => boolean {\n if (!pattern.includes(\"*\")) return (v) => v === pattern;\n const re = new RegExp(\n \"^\" +\n pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\") +\n \"$\"\n );\n return (v) => re.test(v);\n}\n","/**\n * Workflow-safe proxy for virtual filesystem operations.\n *\n * Import this from `zeitlich/workflow` in your Temporal workflow files.\n *\n * By default the scope is derived from `workflowInfo().workflowType`,\n * so activities are automatically namespaced per workflow.\n *\n * @example\n * ```typescript\n * import { proxyVirtualFsOps } from 'zeitlich/workflow';\n *\n * const virtualFsOps = proxyVirtualFsOps();\n * ```\n */\nimport { proxyActivities, workflowInfo } from \"@temporalio/workflow\";\nimport type { VirtualFsOps } from \"./types\";\n\nexport function proxyVirtualFsOps<TCtx = unknown>(\n scope?: string,\n options?: Parameters<typeof proxyActivities>[0]\n): VirtualFsOps<TCtx> {\n const resolvedScope = scope ?? workflowInfo().workflowType;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const acts = proxyActivities<Record<string, (...args: any[]) => any>>(\n options ?? {\n startToCloseTimeout: \"30s\",\n retry: {\n maximumAttempts: 3,\n initialInterval: \"2s\",\n maximumInterval: \"30s\",\n backoffCoefficient: 2,\n },\n }\n );\n\n const prefix = `virtualFs${resolvedScope.charAt(0).toUpperCase()}${resolvedScope.slice(1)}`;\n const p = (key: string): string =>\n `${prefix}${key.charAt(0).toUpperCase()}${key.slice(1)}`;\n\n return {\n resolveFileTree: acts[p(\"resolveFileTree\")],\n } as VirtualFsOps<TCtx>;\n}\n","import type { SkillMetadata } from \"./types\";\n\n/**\n * Parse a SKILL.md file into its frontmatter fields and markdown body.\n *\n * Handles the limited YAML subset used by the agentskills.io spec:\n * flat key-value pairs plus one-level nested `metadata` map.\n * No external YAML dependency required.\n */\nexport function parseSkillFile(raw: string): {\n frontmatter: SkillMetadata;\n body: string;\n} {\n const trimmed = raw.replace(/^\\uFEFF/, \"\"); // strip BOM\n const match = trimmed.match(\n /^---[ \\t]*\\r?\\n([\\s\\S]*?)\\r?\\n---[ \\t]*\\r?\\n?([\\s\\S]*)$/\n );\n\n if (!match) {\n throw new Error(\n \"SKILL.md must start with YAML frontmatter delimited by ---\"\n );\n }\n\n const [, yamlBlock, body] = match as [string, string, string];\n const frontmatter = parseSimpleYaml(yamlBlock);\n\n if (!frontmatter.name || typeof frontmatter.name !== \"string\") {\n throw new Error(\"SKILL.md frontmatter must include a 'name' field\");\n }\n if (!frontmatter.description || typeof frontmatter.description !== \"string\") {\n throw new Error(\"SKILL.md frontmatter must include a 'description' field\");\n }\n\n const result: SkillMetadata = {\n name: frontmatter.name,\n description: frontmatter.description,\n };\n\n if (frontmatter.license) result.license = String(frontmatter.license);\n if (frontmatter.compatibility)\n result.compatibility = String(frontmatter.compatibility);\n if (frontmatter[\"allowed-tools\"]) {\n result.allowedTools = String(frontmatter[\"allowed-tools\"])\n .split(/\\s+/)\n .filter(Boolean);\n }\n if (\n frontmatter.metadata &&\n typeof frontmatter.metadata === \"object\" &&\n !Array.isArray(frontmatter.metadata)\n ) {\n result.metadata = frontmatter.metadata as Record<string, string>;\n }\n\n return { frontmatter: result, body: body.trim() };\n}\n\ntype YamlValue = string | Record<string, string>;\n\n/**\n * Minimal YAML parser for the agentskills.io frontmatter subset.\n * Supports: scalar key-value pairs, one-level nested maps (metadata).\n * Does NOT support arrays, multi-line strings, anchors, etc.\n */\nfunction parseSimpleYaml(yaml: string): Record<string, YamlValue> {\n const result: Record<string, YamlValue> = {};\n const lines = yaml.split(/\\r?\\n/);\n\n let currentMapKey: string | null = null;\n let currentMap: Record<string, string> | null = null;\n\n for (const line of lines) {\n if (line.trim() === \"\" || line.trim().startsWith(\"#\")) continue;\n\n const nestedMatch = line.match(/^(\\s{2,}|\\t+)(\\S+)\\s*:\\s*(.*)$/);\n if (nestedMatch && currentMapKey && currentMap) {\n const [, , key, rawVal] = nestedMatch as [string, string, string, string];\n currentMap[key] = unquote(rawVal.trim());\n continue;\n }\n\n // Flush any pending nested map\n if (currentMapKey && currentMap) {\n result[currentMapKey] = currentMap;\n currentMapKey = null;\n currentMap = null;\n }\n\n const topMatch = line.match(/^(\\S+)\\s*:\\s*(.*)$/);\n if (!topMatch) continue;\n\n const [, key, rawVal] = topMatch as [string, string, string];\n const val = rawVal.trim();\n\n if (val === \"\" || val === \"|\" || val === \">\") {\n currentMapKey = key;\n currentMap = {};\n } else {\n result[key] = unquote(val);\n }\n }\n\n if (currentMapKey && currentMap) {\n result[currentMapKey] = currentMap;\n }\n\n return result;\n}\n\nfunction unquote(s: string): string {\n if (\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\n ) {\n return s.slice(1, -1);\n }\n return s;\n}\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const globTool = {\n name: \"Glob\" as const,\n description: `Search for files matching a glob pattern within the available file system.\n\nUsage:\n- Use glob patterns like \"**/*.ts\" to find all TypeScript files\n- Use \"docs/**\" to find all files in the docs directory\n- Patterns are matched against virtual paths in the file system\n\nExamples:\n- \"*.md\" - Find all markdown files in the root\n- \"**/*.test.ts\" - Find all test files recursively\n- \"src/**/*.ts\" - Find all TypeScript files in src directory\n`,\n schema: z.object({\n pattern: z.string().describe(\"Glob pattern to match files against\"),\n root: z\n .string()\n .optional()\n .describe(\"Optional root directory to search from\"),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type GlobArgs = z.infer<typeof globTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const grepTool = {\n name: \"Grep\" as const,\n description: `Search file contents for a pattern within the available file system.\n\nUsage:\n- Searches for a regex pattern across file contents\n- Returns matching lines with file paths and line numbers\n- Can filter by file patterns and limit results\n\nExamples:\n- Search for \"TODO\" in all files\n- Search for function definitions with \"function.*handleClick\"\n- Search case-insensitively with ignoreCase: true\n`,\n schema: z.object({\n pattern: z\n .string()\n .describe(\"Regex pattern to search for in file contents\"),\n ignoreCase: z\n .boolean()\n .optional()\n .describe(\"Case-insensitive search (default: false)\"),\n maxMatches: z\n .number()\n .optional()\n .describe(\"Maximum number of matches to return (default: 50)\"),\n includePatterns: z\n .array(z.string())\n .optional()\n .describe(\"Glob patterns to include (e.g., ['*.ts', '*.js'])\"),\n excludePatterns: z\n .array(z.string())\n .optional()\n .describe(\"Glob patterns to exclude (e.g., ['*.test.ts'])\"),\n contextLines: z\n .number()\n .optional()\n .describe(\"Number of context lines to show around matches\"),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type GrepArgs = z.infer<typeof grepTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const readFileTool = {\n name: \"FileRead\" as const,\n description: `Read file contents with optional pagination.\n\nUsage:\n- Provide the virtual path to the file you want to read\n- Supports text files, images, and PDFs\n- For large files, use offset and limit to read specific portions\n\nThe tool returns the file content in an appropriate format:\n- Text files: Plain text content\n- Images: Base64-encoded image data\n- PDFs: Extracted text content\n`,\n schema: z.object({\n path: z.string().describe(\"Virtual path to the file to read\"),\n offset: z\n .number()\n .optional()\n .describe(\n \"Line number to start reading from (1-indexed, for text files)\"\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of lines to read (for text files)\"),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type FileReadArgs = z.infer<typeof readFileTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const writeFileTool = {\n name: \"FileWrite\" as const,\n description: `Create or overwrite a file with new content.\n\nUsage:\n- The file will be created if it doesn't exist\n- If the file exists, it will be completely overwritten\n\nIMPORTANT:\n- You must read the file first (in this session) before writing to it\n- This is an atomic write operation - the entire file is replaced\n- Path must be relative to the root of the file system (e.g., \"docs/readme.md\", not \"/docs/readme.md\")\n`,\n schema: z.object({\n file_path: z.string().describe(\"The path to the file to write\"),\n content: z.string().describe(\"The content to write to the file\"),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type FileWriteArgs = z.infer<typeof writeFileTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const editTool = {\n name: \"FileEdit\" as const,\n description: `Edit specific sections of a file by replacing text.\n\nUsage:\n- Provide the exact text to find and replace\n- The old_string must match exactly (whitespace-sensitive)\n- By default, only replaces the first occurrence\n- Use replace_all: true to replace all occurrences\n\nIMPORTANT:\n- You must read the file first (in this session) before editing it\n- old_string must be unique in the file (unless using replace_all)\n- The operation fails if old_string is not found\n- old_string and new_string must be different\n`,\n schema: z.object({\n file_path: z\n .string()\n .describe(\"The absolute virtual path to the file to modify\"),\n old_string: z.string().describe(\"The exact text to replace\"),\n new_string: z\n .string()\n .describe(\n \"The text to replace it with (must be different from old_string)\"\n ),\n replace_all: z\n .boolean()\n .optional()\n .describe(\n \"If true, replace all occurrences of old_string (default: false)\"\n ),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type FileEditArgs = z.infer<typeof editTool.schema>;\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskCreateTool = {\n name: \"TaskCreate\" as const,\n description: `Use this tool to create a structured task list. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\n It also helps the user understand the progress of the task and overall progress of their requests.\n \n ## When to Use This Tool\n \n Use this tool proactively in these scenarios:\n \n - Complex multi-step tasks - When a task requires 3 or more distinct steps or actions\n - Non-trivial and complex tasks - Tasks that require careful planning or multiple operations\n - User explicitly requests todo list - When the user directly asks you to use the todo list\n - User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)\n - After receiving new instructions - Immediately capture user requirements as tasks\n - When you start working on a task - Mark it as in_progress BEFORE beginning work\n - After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation\n \n ## When NOT to Use This Tool\n \n Skip using this tool when:\n - There is only a single, straightforward task\n - The task is trivial and tracking it provides no organizational benefit\n - The task can be completed in less than 3 trivial steps\n - The task is purely conversational or informational\n \n NOTE that you should not use this tool if there is only one trivial task to do. In this case you are better off just doing the task directly.\n \n ## Task Fields\n \n - **subject**: A brief, actionable title in imperative form (e.g., \"Fix authentication bug in login flow\")\n - **description**: Detailed description of what needs to be done, including context and acceptance criteria\n - **activeForm**: Present continuous form shown in spinner when task is in_progress (e.g., \"Fixing authentication bug\"). This is displayed to the user while you work on the task.\n \n **IMPORTANT**: Always provide activeForm when creating tasks. The subject should be imperative (\"Run tests\") while activeForm should be present continuous (\"Running tests\"). All tasks are created with status \\`pending\\`.\n \n ## Tips\n \n - Create tasks with clear, specific subjects that describe the outcome\n - Include enough detail in the description for another agent to understand and complete the task\n - After creating tasks, use TaskUpdate to set up dependencies (blocks/blockedBy) if needed\n - Check TaskList first to avoid creating duplicate tasks`,\n schema: z.object({\n subject: z\n .string()\n .describe(\n 'A brief, actionable title in imperative form (e.g., \"Fix authentication bug in login flow\")'\n ),\n description: z\n .string()\n .describe(\n \"Detailed description of what needs to be done, including context and acceptance criteria\"\n ),\n activeForm: z\n .string()\n .describe(\n 'Present continuous form shown in spinner when task is in_progress (e.g., \"Fixing authentication bug\"). This is displayed to the user while you work on the task.'\n ),\n metadata: z\n .record(z.string(), z.string())\n .describe(\"Arbitrary key-value pairs for tracking\"),\n }),\n} satisfies ToolDefinition;\n\nexport type TaskCreateArgs = z.infer<typeof taskCreateTool.schema>;\n","import type { AgentStateManager, JsonSerializable } from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport { getShortId } from \"../../workflow\";\nimport type { TaskCreateArgs } from \"./tool\";\n\n/**\n * Creates a TaskCreate handler that adds tasks to the workflow state.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A ToolHandler for TaskCreate tool calls\n */\nexport function createTaskCreateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskCreateArgs, WorkflowTask> {\n return (args) => {\n const task: WorkflowTask = {\n id: getShortId(),\n subject: args.subject,\n description: args.description,\n activeForm: args.activeForm,\n status: \"pending\",\n metadata: args.metadata ?? {},\n blockedBy: [],\n blocks: [],\n };\n\n stateManager.setTask(task);\n\n return {\n toolResponse: JSON.stringify(task, null, 2),\n data: task,\n };\n };\n}\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskGetTool = {\n name: \"TaskGet\" as const,\n description: `Retrieve full task details including dependencies.`,\n schema: z.object({\n taskId: z.string().describe(\"The ID of the task to get\"),\n }),\n} satisfies ToolDefinition;\n\nexport type TaskGetArgs = z.infer<typeof taskGetTool.schema>;\n","import type { AgentStateManager, JsonSerializable } from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskGetArgs } from \"./tool\";\n\n/**\n * Creates a TaskGet handler that retrieves a task by ID.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A ToolHandler for TaskGet tool calls\n */\nexport function createTaskGetHandler<TCustom extends JsonSerializable<TCustom>>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskGetArgs, WorkflowTask | null> {\n return (args) => {\n const task = stateManager.getTask(args.taskId) ?? null;\n\n if (!task) {\n return {\n toolResponse: JSON.stringify({\n error: `Task not found: ${args.taskId}`,\n }),\n data: null,\n };\n }\n\n return {\n toolResponse: JSON.stringify(task, null, 2),\n data: task,\n };\n };\n}\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskListTool = {\n name: \"TaskList\" as const,\n description: `List all tasks with current state.`,\n schema: z.object({}),\n} satisfies ToolDefinition;\n\nexport type TaskListArgs = z.infer<typeof taskListTool.schema>;\n","import type { AgentStateManager, JsonSerializable } from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskListArgs } from \"./tool\";\n\n/**\n * Creates a TaskList handler that returns all tasks.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A ToolHandler for TaskList tool calls\n */\nexport function createTaskListHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskListArgs, WorkflowTask[]> {\n return () => {\n const taskList = stateManager.getTasks();\n\n return {\n toolResponse: JSON.stringify(taskList, null, 2),\n data: taskList,\n };\n };\n}\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskUpdateTool = {\n name: \"TaskUpdate\" as const,\n description: `Update status, add blockers, modify details.`,\n schema: z.object({\n taskId: z.string().describe(\"The ID of the task to get\"),\n status: z\n .enum([\"pending\", \"in_progress\", \"completed\"])\n .describe(\"The status of the task\"),\n addBlockedBy: z\n .array(z.string())\n .describe(\"The IDs of the tasks that are blocking this task\"),\n addBlocks: z\n .array(z.string())\n .describe(\"The IDs of the tasks that this task is blocking\"),\n }),\n} satisfies ToolDefinition;\n\nexport type TaskUpdateArgs = z.infer<typeof taskUpdateTool.schema>;\n","import type { AgentStateManager, JsonSerializable } from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskUpdateArgs } from \"./tool\";\n\n/**\n * Creates a TaskUpdate handler that modifies task status and dependencies.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A ToolHandler for TaskUpdate tool calls\n */\nexport function createTaskUpdateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskUpdateArgs, WorkflowTask | null> {\n return (args) => {\n const task = stateManager.getTask(args.taskId);\n\n if (!task) {\n return {\n toolResponse: JSON.stringify({\n error: `Task not found: ${args.taskId}`,\n }),\n data: null,\n };\n }\n\n // Update status if provided\n if (args.status) {\n task.status = args.status;\n }\n\n // Add blockedBy relationships (bidirectional)\n if (args.addBlockedBy) {\n for (const blockerId of args.addBlockedBy) {\n if (!task.blockedBy.includes(blockerId)) {\n task.blockedBy.push(blockerId);\n }\n // Update the blocker task's blocks array\n const blockerTask = stateManager.getTask(blockerId);\n if (blockerTask && !blockerTask.blocks.includes(task.id)) {\n blockerTask.blocks.push(task.id);\n stateManager.setTask(blockerTask);\n }\n }\n }\n\n // Add blocks relationships (bidirectional)\n if (args.addBlocks) {\n for (const blockedId of args.addBlocks) {\n if (!task.blocks.includes(blockedId)) {\n task.blocks.push(blockedId);\n }\n // Update the blocked task's blockedBy array\n const blockedTask = stateManager.getTask(blockedId);\n if (blockedTask && !blockedTask.blockedBy.includes(task.id)) {\n blockedTask.blockedBy.push(task.id);\n stateManager.setTask(blockedTask);\n }\n }\n }\n\n stateManager.setTask(task);\n\n return {\n toolResponse: JSON.stringify(task, null, 2),\n data: task,\n };\n };\n}\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const createBashToolDescription = ({\n fileTree,\n}: {\n fileTree: string;\n}): string => `Execute shell commands in a bash environment.\n\nUse this tool to:\n- Run shell commands (ls, cat, grep, find, etc.)\n- Execute scripts and chain commands with pipes (|) or logical operators (&&, ||)\n- Inspect files and directories\n\nCurrent file tree:\n${fileTree}`;\n\nexport const bashTool = {\n name: \"Bash\" as const,\n description: `Execute shell commands in a sandboxed bash environment.\n\nUse this tool to:\n- Run shell commands (ls, cat, grep, find, etc.)\n- Execute scripts and chain commands with pipes (|) or logical operators (&&, ||)\n- Inspect files and directories\n`,\n schema: z.object({\n command: z\n .string()\n .describe(\n \"The bash command to execute. Can include pipes (|), redirects (>, >>), logical operators (&&, ||), and shell features like command substitution $(...).\"\n ),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type BashArgs = z.infer<typeof bashTool.schema>;\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const askUserQuestionTool = {\n name: \"AskUserQuestion\" as const,\n description: `Use this tool when you need to ask the user questions during execution. This allows you to:\n\n1. Gather user preferences or requirements\n2. Clarify ambiguous instructions\n3. Get decisions on implementation choices as you work\n4. Offer choices to the user about what direction to take.\n\nUsage notes:\n\n* Users will always be able to select \"Other\" to provide custom text input\n* Use multiSelect: true to allow multiple answers to be selected for a question\n* If you recommend a specific option, make that the first option in the list and add \"(Recommended)\" at the end of the label\n`,\n schema: z.object({\n questions: z.array(\n z.object({\n question: z.string().describe(\"The full question text to display\"),\n header: z\n .string()\n .describe(\"Short label for the question (max 12 characters)\"),\n options: z\n .array(\n z.object({\n label: z.string(),\n description: z.string(),\n })\n )\n .min(0)\n .max(4)\n .describe(\"Array of 0-4 choices, each with label and description\"),\n multiSelect: z\n .boolean()\n .describe(\"If true, users can select multiple options\"),\n })\n ),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type AskUserQuestionArgs = z.infer<typeof askUserQuestionTool.schema>;\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { AskUserQuestionArgs } from \"./tool\";\n\n/**\n * Creates a handler for the AskUserQuestion tool.\n * Returns question data for display to the user via your UI layer.\n *\n * Typically paired with `stateManager.waitForInput()` in a `hooks.onPostToolUse`\n * callback to pause the agent loop until the user responds.\n *\n * @example\n * ```typescript\n * import { createAskUserQuestionHandler } from 'zeitlich';\n * import { askUserQuestionTool, defineTool } from 'zeitlich/workflow';\n *\n * // In activities\n * const askUserQuestionHandlerActivity = createAskUserQuestionHandler();\n *\n * // In workflow\n * tools: {\n * AskUserQuestion: defineTool({\n * ...askUserQuestionTool,\n * handler: askUserQuestionHandlerActivity,\n * hooks: {\n * onPostToolUse: () => { stateManager.waitForInput(); },\n * },\n * }),\n * }\n * ```\n */\nexport const createAskUserQuestionHandler =\n (): ActivityToolHandler<\n AskUserQuestionArgs,\n {\n questions: {\n question: string;\n header: string;\n options: { label: string; description: string }[];\n multiSelect: boolean;\n }[];\n }\n > =>\n async (args) => {\n return {\n toolResponse: \"Question submitted\",\n data: { questions: args.questions },\n };\n };\n"]}
1
+ {"version":3,"sources":["../src/lib/session/types.ts","../src/lib/tool-router/router.ts","../src/lib/thread/id.ts","../src/lib/subagent/tool.ts","../src/lib/subagent/types.ts","../src/lib/subagent/signals.ts","../src/lib/subagent/handler.ts","../src/lib/subagent/register.ts","../src/lib/skills/tool.ts","../src/lib/skills/handler.ts","../src/lib/skills/register.ts","../src/lib/session/session.ts","../src/lib/workflow.ts","../src/lib/thread/keys.ts","../src/lib/types.ts","../src/lib/state/manager.ts","../src/lib/sandbox/types.ts","../src/lib/subagent/define.ts","../src/lib/subagent/workflow.ts","../src/lib/observability/hooks.ts","../src/lib/model/proxy.ts","../src/lib/virtual-fs/mutations.ts","../src/lib/virtual-fs/tree.ts","../src/lib/virtual-fs/queries.ts","../src/lib/virtual-fs/proxy.ts","../src/lib/skills/parse.ts","../src/tools/glob/tool.ts","../src/tools/grep/tool.ts","../src/tools/read-file/tool.ts","../src/tools/write-file/tool.ts","../src/tools/edit/tool.ts","../src/tools/task-create/tool.ts","../src/tools/task-create/handler.ts","../src/tools/task-get/tool.ts","../src/tools/task-get/handler.ts","../src/tools/task-list/tool.ts","../src/tools/task-list/handler.ts","../src/tools/task-update/tool.ts","../src/tools/task-update/handler.ts","../src/tools/bash/tool.ts","../src/tools/ask-user-question/tool.ts","../src/tools/ask-user-question/handler.ts"],"names":["results","uuid4","z","log","setHandler","ApplicationFailure","defineUpdate","condition","workflowInfo","proxyActivities","key","rawVal"],"mappings":"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","file":"workflow.js","sourcesContent":["import type { SessionExitReason, ToolResultConfig } from \"../types\";\nimport type {\n ToolMap,\n ToolCallResultUnion,\n InferToolResults,\n} from \"../tool-router/types\";\nimport type { Hooks } from \"../hooks/types\";\nimport type { SubagentConfig } from \"../subagent/types\";\nimport type { Skill } from \"../skills/types\";\nimport type {\n SandboxCapability,\n SandboxCreateOptions,\n SandboxOps,\n SandboxSnapshot,\n} from \"../sandbox/types\";\nimport type { VirtualFsOps } from \"../virtual-fs/types\";\nimport type { RunAgentActivity } from \"../model/types\";\nimport type {\n AgentStateManager,\n JsonSerializable,\n PersistedThreadState,\n} from \"../state/types\";\nimport type { ActivityInterfaceFor } from \"@temporalio/workflow\";\nimport type {\n ThreadInit,\n SandboxInit,\n SubagentSandboxShutdown,\n} from \"../lifecycle\";\n\n/**\n * Thread operations required by a session.\n * Consumers provide these — typically by wrapping Temporal activities.\n *\n * `TContent` is the SDK-native content type for human messages.\n * Each adapter supplies its own type (e.g. Anthropic ContentBlockParam[],\n * Google GenAI Part[], LangChain MessageContent). Defaults to `string`.\n */\nexport interface ThreadOps<TContent = string> {\n /** Initialize an empty thread */\n initializeThread(threadId: string, threadKey?: string): Promise<void>;\n /** Append a human message to the thread */\n appendHumanMessage(\n threadId: string,\n id: string,\n content: TContent,\n threadKey?: string\n ): Promise<void>;\n /** Append a tool result to the thread */\n appendToolResult(id: string, config: ToolResultConfig): Promise<void>;\n /** Append the model's response to the thread */\n appendAgentMessage(\n threadId: string,\n id: string,\n message: unknown,\n threadKey?: string\n ): Promise<void>;\n /** Append a system message to the thread */\n appendSystemMessage(\n threadId: string,\n id: string,\n content: unknown,\n threadKey?: string\n ): Promise<void>;\n /**\n * Copy all messages AND the persisted state slice (tasks + custom\n * state) from `sourceThreadId` into a new thread at `targetThreadId`.\n * Adapters that have `onForkPrepareThread` and/or `onForkTransform`\n * hooks configured apply them once to the new thread's messages\n * before returning.\n */\n forkThread(\n sourceThreadId: string,\n targetThreadId: string,\n threadKey?: string\n ): Promise<void>;\n /**\n * Truncate the thread starting at `messageId`: that message and every\n * message after it are removed. If `messageId` is not present the call\n * is a no-op.\n *\n * The `runAgent` activity invokes this on entry with the pre-generated\n * `assistantMessageId`. On the happy path the id is not yet in the\n * thread and the call is a no-op. On a rewind retry (same assistant\n * id reused) or a Temporal workflow reset-to-this-activity the id is\n * present, so the bad assistant + any tool results it produced are\n * wiped and the call is then replayable.\n */\n truncateThread(\n threadId: string,\n messageId: string,\n threadKey?: string\n ): Promise<void>;\n /**\n * Load the persisted state slice (tasks + custom state) associated with\n * the thread, or `null` if none has been saved yet. Called on session\n * start for `continue`/`fork` threads to rehydrate {@link AgentStateManager}.\n */\n loadThreadState(\n threadId: string,\n threadKey?: string\n ): Promise<PersistedThreadState | null>;\n /**\n * Overwrite the persisted state slice for the thread. Called once from\n * the session's `finally` block on every exit path so that \"finish,\n * store, continue later\" works regardless of exit reason.\n */\n saveThreadState(\n threadId: string,\n state: PersistedThreadState,\n threadKey?: string\n ): Promise<void>;\n}\n\n/**\n * Composes an adapter prefix + workflow scope for activity naming.\n *\n * The adapter prefix stays first (camelCase); the workflow scope is\n * capitalised and appended. When `TScope` is empty the adapter prefix\n * is used as-is.\n *\n * @example\n * ```typescript\n * ScopedPrefix<\"codingAgent\", \"googleGenAI\"> // \"googleGenAICodingAgent\"\n * ScopedPrefix<\"\", \"googleGenAI\"> // \"googleGenAI\"\n * ```\n */\nexport type ScopedPrefix<\n TScope extends string,\n TAdapter extends string,\n> = TScope extends \"\" ? TAdapter : `${TAdapter}${Capitalize<TScope>}`;\n\n/**\n * Maps generic {@link ThreadOps} method names to adapter-prefixed names.\n *\n * @example\n * ```typescript\n * type GoogleOps = PrefixedThreadOps<\"googleGenAI\">;\n * // → { googleGenAIInitializeThread, googleGenAIAppendHumanMessage, … }\n * ```\n */\nexport type PrefixedThreadOps<TPrefix extends string, TContent = string> = {\n [K in keyof ThreadOps<TContent> as `${TPrefix}${Capitalize<K & string>}`]: ThreadOps<TContent>[K];\n};\n\n// ============================================================================\n// Session sandbox-lifecycle decision table (SSOT)\n//\n// `createSession` (`src/lib/session/session.ts`) dispatches gated\n// sandbox methods based on `(sandbox.mode, sandboxShutdown)`. When a\n// caller omits either field, the session uses the documented defaults\n// (`sandbox: { mode: \"new\" }` and `sandboxShutdown: \"destroy\"`),\n// which trigger only base ops (`createSandbox` / `destroySandbox`).\n//\n// Two surfaces have to agree on what gated methods may fire for a\n// given config:\n//\n// 1. The runtime — what the session dispatches per `(mode,\n// shutdown)` pair.\n// 2. The type level — what caps `sandboxOps` has to advertise.\n//\n// `SessionRequiredCaps<TInit, TShutdown>` is the SSOT for the type\n// level. `resolveSessionLifecycle(init, shutdown)` (in `session.ts`,\n// re-exported below) is the runtime mirror. Adding a new branch to\n// `session.ts` requires extending **both**; the\n// `(sandbox.mode × sandboxShutdown × adapter)` matrix in\n// `src/lib/sandbox/capability-types.test.ts` enforces agreement.\n// ============================================================================\n\n/**\n * Caps the session's sandbox-init dispatch may invoke for a given\n * `(mode, shutdown)`. Mirror of `src/lib/session/session.ts:241-313`.\n *\n * The conditional branches are written non-distributively (each cap\n * checked against the input `M` / `S` rather than over a union) so\n * that the *omitted* case (defaults: M = \"new\", S = \"destroy\") flows\n * through to `never`, not to \"I don't know, assume everything.\"\n */\ntype _SessionInitCaps<M, S> =\n | (M extends \"fork\" ? \"fork\" : never)\n | (M extends \"from-snapshot\" ? \"restore\" : never)\n | (M extends \"continue\"\n ? S extends \"pause-until-parent-close\"\n ? \"resume\"\n : never\n : never);\n\n/**\n * Caps the session's exit dispatch may invoke. `\"inherit\"` mode keeps\n * `sandboxOwned = false` so exit-shutdown caps NEVER fire — mirror of\n * `src/lib/session/session.ts:598-615`.\n */\ntype _SessionExitCaps<M, S> = M extends \"inherit\"\n ? never\n :\n | (S extends \"snapshot\" ? \"snapshot\" : never)\n | (S extends \"pause\" | \"pause-until-parent-close\" ? \"pause\" : never);\n\n/**\n * Cap captured on entry for `mode: \"new\"` + `shutdown: \"snapshot\"` (the\n * seeding-base-snapshot path). Mirror of\n * `src/lib/session/session.ts:316-317`.\n */\ntype _SessionSeedCaps<M, S> = M extends \"new\"\n ? S extends \"snapshot\"\n ? \"snapshot\"\n : never\n : never;\n\n/**\n * Resolves an omitted `sandbox` field to the runtime default\n * `{ mode: \"new\" }`, and an omitted `sandboxShutdown` field to the\n * runtime default `\"destroy\"`. The two `_Resolve…` helpers are the\n * sole bridge between \"user didn't set the field\" and the SSOT below\n * — keeping the defaults out of the conditional table itself.\n */\ntype _ResolveInit<TInit> = [TInit] extends [undefined]\n ? { mode: \"new\" }\n : Exclude<TInit, undefined> extends infer Defined\n ? // If the user passed `SandboxInit | undefined` (the wide default),\n // collapse `undefined` to the runtime default.\n undefined extends TInit\n ? Defined | { mode: \"new\" }\n : Defined\n : never;\n\ntype _ResolveShutdown<TShutdown> = [TShutdown] extends [undefined]\n ? \"destroy\"\n : Exclude<TShutdown, undefined> extends infer Defined\n ? undefined extends TShutdown\n ? Defined | \"destroy\"\n : Defined\n : never;\n\n/**\n * Sandbox capabilities a session actually invokes on its\n * `sandboxOps`, derived from the literal types of the surrounding\n * `sandbox` and `sandboxShutdown` fields.\n *\n * `TInit` / `TShutdown` default to `undefined` so an un-parameterised\n * `SessionRequiredCaps` resolves to the caps the runtime *defaults*\n * (`{ mode: \"new\" }` + `\"destroy\"`) actually require — i.e.\n * `never`. This lets a narrow adapter (e.g. `proxyDaytonaSandboxOps`)\n * satisfy `sandboxOps?: SandboxOps<…, SessionRequiredCaps<…>>` when\n * the caller doesn't pin literals, matching what's runtime-safe.\n *\n * Pin literals via `as const` or by ascribing `SessionConfig<…, TInit,\n * TShutdown>` to tighten the requirement on a per-call basis.\n */\nexport type SessionRequiredCaps<\n TInit extends SandboxInit | undefined = undefined,\n TShutdown extends SubagentSandboxShutdown | undefined = undefined,\n> = _ResolveInit<TInit> extends infer M\n ? _ResolveShutdown<TShutdown> extends infer S\n ? M extends { mode: infer Mode }\n ? S extends SubagentSandboxShutdown\n ?\n | _SessionInitCaps<Mode, S>\n | _SessionExitCaps<Mode, S>\n | _SessionSeedCaps<Mode, S>\n : never\n : never\n : never\n : never;\n\n/**\n * Runtime mirror of `SessionRequiredCaps`. Returns the names of the\n * gated `sandboxOps` methods the session will invoke for a given\n * `(sandboxInit, sandboxShutdown)` pair (after resolving documented\n * defaults). Mirror of the dispatch in\n * `src/lib/session/session.ts:241-313` and `:598-615`.\n *\n * Both surfaces consult this same table — the `(mode × shutdown ×\n * adapter)` matrix in `src/lib/sandbox/capability-types.test.ts`\n * enforces agreement.\n */\nexport function resolveSessionLifecycle(\n init: SandboxInit | undefined,\n shutdown: SubagentSandboxShutdown | undefined\n): { mode: SandboxInit[\"mode\"]; shutdown: SubagentSandboxShutdown } {\n const resolvedInit: SandboxInit = init ?? { mode: \"new\" };\n const resolvedShutdown: SubagentSandboxShutdown = shutdown ?? \"destroy\";\n return {\n mode: resolvedInit.mode,\n shutdown: resolvedShutdown,\n };\n}\n\n/**\n * Configuration for a Zeitlich agent session.\n *\n * @typeParam T - Tool map\n * @typeParam M - SDK-native message type returned by the model invoker\n * @typeParam TContent - SDK-native content type for human messages (defaults to `string`)\n * @typeParam TInit - Literal type of `sandbox` (a {@link SandboxInit}\n * variant or `undefined`). Defaults to the wide union; pin it via\n * `as const` on the call site to narrow the cap requirement on\n * `sandboxOps`.\n * @typeParam TShutdown - Literal type of `sandboxShutdown`. Defaults\n * to the wide union; pin it via `as const` on the call site to\n * narrow the cap requirement on `sandboxOps`.\n */\nexport interface SessionConfig<\n T extends ToolMap,\n M = unknown,\n TContent = string,\n TInit extends SandboxInit | undefined = SandboxInit | undefined,\n TShutdown extends\n | SubagentSandboxShutdown\n | undefined = SubagentSandboxShutdown | undefined,\n> {\n /** The name of the agent, should be unique within the workflows */\n agentName: string;\n /** Metadata for the session */\n metadata?: Record<string, unknown>;\n /** Whether to append the system prompt as message to the thread */\n appendSystemPrompt?: boolean;\n /** How many turns to run the session for */\n maxTurns?: number;\n /** Workflow-specific runAgent activity (with tools pre-bound) */\n runAgent: RunAgentActivity<M>;\n /** Thread operations (initialize, append messages, parse tool calls) */\n threadOps: ActivityInterfaceFor<ThreadOps<TContent>>;\n /** Tool router for processing tool calls (optional if agent has no tools) */\n tools?: T;\n /** Subagent configurations */\n subagents?: SubagentConfig[];\n /** Skills available to this agent (metadata + instructions, loaded before session creation) */\n skills?: Skill[];\n /** Session lifecycle hooks */\n hooks?: Hooks<T, ToolCallResultUnion<InferToolResults<T>>, TContent>;\n /** Whether to process tools in parallel */\n processToolsInParallel?: boolean;\n /**\n * Build context message content from agent-specific context.\n * Returns SDK-native content for the initial human message.\n */\n buildContextMessage: () => TContent | Promise<TContent>;\n\n // ---------------------------------------------------------------------------\n // Thread lifecycle\n // ---------------------------------------------------------------------------\n\n /**\n * Thread initialization strategy (default: `{ mode: \"new\" }`).\n *\n * - `{ mode: \"new\" }` — start a fresh thread.\n * - `{ mode: \"new\", threadId: \"...\" }` — start a fresh thread with a specific ID.\n * - `{ mode: \"continue\", threadId: \"...\" }` — append to an existing thread in-place.\n * - `{ mode: \"fork\", threadId: \"...\" }` — fork an existing thread and continue in the copy.\n */\n thread?: ThreadInit;\n /**\n * Redis key suffix for thread storage. Defaults to `\"messages\"`.\n *\n * Controls the Redis key layout: `thread:${threadId}:${threadKey}`.\n * Use different keys to isolate storage across sessions sharing the\n * same adapter instance.\n */\n threadKey?: string;\n\n // ---------------------------------------------------------------------------\n // Sandbox lifecycle\n // ---------------------------------------------------------------------------\n\n /**\n * Sandbox lifecycle operations (optional — omit for agents that don't\n * need a sandbox).\n *\n * The `TCaps` argument is derived from {@link SessionRequiredCaps}\n * over the literal types of the surrounding `sandbox` and\n * `sandboxShutdown` fields. With the default wide\n * `TInit` / `TShutdown`, this resolves to the full\n * {@link SandboxCapability} union (current behaviour). When the\n * caller pins those literals via `as const`, the cap requirement\n * tightens so a narrow adapter (e.g. Daytona's\n * `SandboxOps<…, never>`) can satisfy combinations that don't need\n * a gated method.\n */\n sandboxOps?: SandboxOps<\n SandboxCreateOptions,\n unknown,\n SessionRequiredCaps<TInit, TShutdown> & SandboxCapability\n >;\n /**\n * Sandbox initialization strategy.\n *\n * - `{ mode: \"new\" }` — create a fresh sandbox.\n * - `{ mode: \"continue\", sandboxId: \"...\" }` — resume a paused sandbox (session owns it).\n * - `{ mode: \"fork\", sandboxId: \"...\" }` — fork from an existing sandbox.\n * - `{ mode: \"inherit\", sandboxId: \"...\" }` — use a parent's sandbox without ownership.\n *\n * When omitted and `sandboxOps` is provided, defaults to `{ mode: \"new\" }`.\n */\n sandbox?: TInit;\n /**\n * What to do with the sandbox when this session exits.\n *\n * Defaults to `\"destroy\"` when omitted.\n * Has no effect when the sandbox is inherited (`sandbox.mode === \"inherit\"`).\n */\n sandboxShutdown?: TShutdown;\n /**\n * Called as soon as the sandbox is created (or resumed/forked), before the\n * agent loop starts. Useful for signalling sandbox readiness to a parent.\n *\n * `baseSnapshot` is only populated when the sandbox was freshly created\n * this run and `sandboxShutdown === \"snapshot\"` — i.e. when the session\n * captured a seed snapshot intended for reuse.\n */\n onSandboxReady?: (args: {\n sandboxId: string;\n baseSnapshot?: SandboxSnapshot;\n }) => void;\n /**\n * Called right before `runSession` returns, with the session's sandbox\n * outputs. Useful for callers (e.g. `defineSubagentWorkflow`) that want to\n * forward these fields to their own return value without requiring user\n * code to manually thread them through.\n */\n onSessionExit?: (result: {\n threadId: string;\n sandboxId?: string;\n snapshot?: SandboxSnapshot;\n usage: {\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCachedWriteTokens: number;\n totalCachedReadTokens: number;\n totalReasonTokens: number;\n turns: number;\n };\n }) => void;\n\n // ---------------------------------------------------------------------------\n // Virtual filesystem\n // ---------------------------------------------------------------------------\n\n virtualFsOps?: VirtualFsOps;\n\n /**\n * Virtual filesystem configuration (optional — independent of sandbox).\n *\n * When provided, the session resolves the file tree on start and merges\n * `fileTree`, `ctx`, and `workspaceBase` into `AgentState`.\n * Tool handlers wrapped with `withVirtualFs` can then read this state.\n *\n * Can be used alongside `sandboxOps` for agents that need both a real\n * sandbox (e.g. for execution) and a virtual filesystem.\n */\n virtualFs?: {\n ctx: unknown;\n };\n}\n\nexport type SessionResult<\n M,\n TState extends JsonSerializable<TState>,\n HasSandbox extends boolean = boolean,\n> = {\n threadId: string;\n finalMessage: M | null;\n exitReason: SessionExitReason;\n usage: ReturnType<AgentStateManager<TState>[\"getTotalUsage\"]>;\n /**\n * Snapshot captured on exit when `sandboxShutdown === \"snapshot\"`.\n */\n snapshot?: SandboxSnapshot;\n /**\n * Snapshot captured immediately after sandbox seeding (before the agent\n * loop starts) when `sandbox.mode === \"new\"` and\n * `sandboxShutdown === \"snapshot\"`. Intended as a reusable \"base\" for new\n * threads that want to skip re-seeding.\n */\n baseSnapshot?: SandboxSnapshot;\n} & (HasSandbox extends true\n ? { sandboxId: string }\n : { sandboxId?: undefined });\n\nexport interface ZeitlichSession<\n M = unknown,\n HasSandbox extends boolean = boolean,\n> {\n runSession<T extends JsonSerializable<T>>(args: {\n stateManager: AgentStateManager<T>;\n }): Promise<SessionResult<M, T, HasSandbox>>;\n}\n","import type {\n ToolMap,\n ToolDefinition,\n RouterContext,\n ToolHandler,\n RawToolCall,\n ParsedToolCallUnion,\n ParsedToolCall,\n ToolCallResult,\n ToolCallResultUnion,\n InferToolResults,\n ToolRouterOptions,\n ToolRouter,\n ToolNames,\n ToolArgs,\n ToolResult,\n ProcessToolCallsContext,\n ProcessToolCallsResult,\n RewindSignal,\n ToolWithHandler,\n} from \"./types\";\n\nimport type { JsonValue } from \"../state/types\";\nimport type { z } from \"zod\";\nimport {\n uuid4,\n log,\n CancellationScope,\n isCancellation,\n} from \"@temporalio/workflow\";\n\n/**\n * Creates a tool router for declarative tool call processing.\n * Combines tool definitions with handlers in a single API.\n *\n * @example\n * ```typescript\n * const router = createToolRouter({\n * threadId,\n * tools: {\n * Read: {\n * name: \"FileRead\",\n * description: \"Read file contents\",\n * schema: z.object({ path: z.string() }),\n * handler: async (args, ctx) => ({\n * content: `Read ${args.path}`,\n * result: { path: args.path, content: \"...\" },\n * }),\n * },\n * },\n * hooks: { onPreToolUse, onPostToolUse },\n * });\n *\n * // Parse raw tool calls from LLM\n * const parsed = router.parseToolCall(rawToolCall);\n *\n * // Process tool calls\n * const results = await router.processToolCalls([parsed]);\n * ```\n */\nexport function createToolRouter<T extends ToolMap>(\n options: ToolRouterOptions<T>\n): ToolRouter<T> {\n const { appendToolResult } = options;\n type TResults = InferToolResults<T>;\n\n // Build internal lookup map by tool name\n const toolMap = new Map<string, ToolMap[string]>();\n for (const [_key, tool] of Object.entries(options.tools)) {\n toolMap.set(tool.name, tool as T[keyof T]);\n }\n\n const resolve = <T>(v: T | (() => T)): T =>\n typeof v === \"function\" ? (v as () => T)() : v;\n\n const isEnabled = (tool: ToolMap[string]): boolean =>\n resolve(tool.enabled) ?? true;\n\n if (options.plugins) {\n for (const plugin of options.plugins) {\n toolMap.set(plugin.name, plugin);\n }\n }\n\n /** Run global → per-tool pre-hooks. Returns null to skip, or the (possibly modified) args. */\n async function runPreHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n turn: number\n ): Promise<{ skip: true } | { skip: false; args: unknown }> {\n let effectiveArgs: unknown = toolCall.args;\n\n if (options.hooks?.onPreToolUse) {\n const preResult = await options.hooks.onPreToolUse({\n toolCall,\n threadId: options.threadId,\n turn,\n });\n if (preResult?.skip) return { skip: true };\n if (preResult?.modifiedArgs !== undefined)\n effectiveArgs = preResult.modifiedArgs;\n }\n\n if (tool?.hooks?.onPreToolUse) {\n const preResult = await tool.hooks.onPreToolUse({\n args: effectiveArgs,\n threadId: options.threadId,\n turn,\n });\n if (preResult?.skip) return { skip: true };\n if (preResult?.modifiedArgs !== undefined)\n effectiveArgs = preResult.modifiedArgs;\n }\n\n return { skip: false, args: effectiveArgs };\n }\n\n /**\n * Run per-tool → global failure hooks. Returns recovery content/result,\n * or a generic error response if no hook recovers.\n */\n async function runFailureHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n error: unknown,\n effectiveArgs: unknown,\n turn: number\n ): Promise<{ content: JsonValue; result: unknown }> {\n const err = error instanceof Error ? error : new Error(String(error));\n const errorStr = String(error);\n\n if (tool?.hooks?.onPostToolUseFailure) {\n const r = await tool.hooks.onPostToolUseFailure({\n args: effectiveArgs,\n error: err,\n threadId: options.threadId,\n turn,\n });\n if (r?.fallbackContent !== undefined)\n return {\n content: r.fallbackContent,\n result: { error: errorStr, recovered: true },\n };\n if (r?.suppress)\n return {\n content: JSON.stringify({ error: errorStr, suppressed: true }),\n result: { error: errorStr, suppressed: true },\n };\n }\n\n if (options.hooks?.onPostToolUseFailure) {\n const r = await options.hooks.onPostToolUseFailure({\n toolCall,\n error: err,\n threadId: options.threadId,\n turn,\n });\n if (r?.fallbackContent !== undefined)\n return {\n content: r.fallbackContent,\n result: { error: errorStr, recovered: true },\n };\n if (r?.suppress)\n return {\n content: JSON.stringify({ error: errorStr, suppressed: true }),\n result: { error: errorStr, suppressed: true },\n };\n }\n\n return {\n content: JSON.stringify({\n error:\n \"The tool encountered an error. Please try again or use a different approach.\",\n }),\n result: { error: errorStr, suppressed: true },\n };\n }\n\n /** Run per-tool → global post-hooks. */\n async function runPostHooks(\n toolCall: ParsedToolCallUnion<T>,\n tool: ToolMap[string] | undefined,\n toolResult: ToolCallResultUnion<TResults>,\n effectiveArgs: unknown,\n turn: number,\n durationMs: number\n ): Promise<void> {\n if (tool?.hooks?.onPostToolUse) {\n await tool.hooks.onPostToolUse({\n args: effectiveArgs,\n result: toolResult.data,\n threadId: options.threadId,\n turn,\n durationMs,\n ...(toolResult.metadata && { metadata: toolResult.metadata }),\n });\n }\n if (options.hooks?.onPostToolUse) {\n await options.hooks.onPostToolUse({\n toolCall,\n result: toolResult,\n threadId: options.threadId,\n turn,\n durationMs,\n });\n }\n }\n\n /**\n * Internal per-tool-call outcome. `rewind` signals the caller that the\n * handler requested a session-level rewind; when present, the result is\n * not appended to the thread and siblings should be cancelled.\n */\n type ProcessedToolCall =\n | { kind: \"result\"; value: ToolCallResultUnion<TResults> }\n | { kind: \"rewind\"; signal: RewindSignal }\n | { kind: \"skipped\" };\n\n async function processToolCall(\n toolCall: ParsedToolCallUnion<T>,\n turn: number,\n sandboxId?: string,\n onRewindRequested?: (signal: RewindSignal) => void\n ): Promise<ProcessedToolCall> {\n const startTime = Date.now();\n const tool = toolMap.get(toolCall.name);\n\n // --- Pre-hooks: may skip or modify args ---\n const preResult = await runPreHooks(toolCall, tool, turn);\n if (preResult.skip) {\n await appendToolResult(uuid4(), {\n threadId: options.threadId,\n threadKey: options.threadKey,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content: JSON.stringify({\n skipped: true,\n reason: \"Skipped by PreToolUse hook\",\n }),\n });\n return { kind: \"skipped\" };\n }\n const effectiveArgs = preResult.args;\n\n log.debug(\"tool call dispatched\", {\n toolName: toolCall.name,\n toolCallId: toolCall.id,\n turn,\n });\n\n // --- Execute handler ---\n let result: unknown;\n let content!: JsonValue;\n let resultAppended = false;\n let metadata: Record<string, unknown> | undefined;\n let rewindRequested = false;\n\n try {\n if (tool) {\n const routerContext: RouterContext = {\n threadId: options.threadId,\n ...(options.threadKey && { threadKey: options.threadKey }),\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n ...(sandboxId !== undefined && { sandboxId }),\n };\n const response = await tool.handler(\n effectiveArgs as Parameters<typeof tool.handler>[0],\n routerContext as Parameters<typeof tool.handler>[1]\n );\n result = response.data;\n content = response.toolResponse as JsonValue;\n resultAppended = response.resultAppended === true;\n metadata = response.metadata;\n rewindRequested = response.rewind === true;\n } else {\n result = { error: `Unknown tool: ${toolCall.name}` };\n content = JSON.stringify(result, null, 2);\n }\n } catch (error) {\n if (isCancellation(error)) {\n throw error;\n }\n log.warn(\"tool call failed\", {\n toolName: toolCall.name,\n toolCallId: toolCall.id,\n turn,\n durationMs: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n });\n const recovery = await runFailureHooks(\n toolCall,\n tool,\n error,\n effectiveArgs,\n turn\n );\n result = recovery.result;\n content = recovery.content;\n }\n\n if (rewindRequested) {\n const signal: RewindSignal = {\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n };\n log.info(\"tool requested rewind\", { ...signal });\n onRewindRequested?.(signal);\n return { kind: \"rewind\", signal };\n }\n\n // --- Append result to thread (unless handler already did) ---\n if (!resultAppended) {\n const config = {\n threadId: options.threadId,\n threadKey: options.threadKey,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content,\n };\n await appendToolResult.executeWithOptions(\n {\n summary: `Append ${toolCall.name} result`,\n },\n [uuid4(), config]\n );\n }\n\n const durationMs = Date.now() - startTime;\n\n const toolResult = {\n toolCallId: toolCall.id,\n name: toolCall.name,\n data: result,\n ...(metadata && { metadata }),\n } as ToolCallResultUnion<TResults>;\n\n log.debug(\"tool call completed\", {\n toolName: toolCall.name,\n toolCallId: toolCall.id,\n turn,\n durationMs,\n });\n\n // --- Post-hooks ---\n await runPostHooks(\n toolCall,\n tool,\n toolResult,\n effectiveArgs,\n turn,\n durationMs\n );\n\n return { kind: \"result\", value: toolResult };\n }\n\n return {\n hasTools(): boolean {\n return Array.from(toolMap.values()).some(isEnabled);\n },\n\n parseToolCall(toolCall: RawToolCall): ParsedToolCallUnion<T> {\n const tool = toolMap.get(toolCall.name);\n\n if (!tool || !isEnabled(tool)) {\n throw new Error(`Tool ${toolCall.name} not found`);\n }\n\n const parsedArgs = resolve(tool.schema).parse(toolCall.args);\n\n return {\n id: toolCall.id ?? \"\",\n name: toolCall.name,\n args: parsedArgs,\n } as ParsedToolCallUnion<T>;\n },\n\n hasTool(name: string): boolean {\n const tool = toolMap.get(name);\n return tool !== undefined && isEnabled(tool);\n },\n\n getToolNames(): ToolNames<T>[] {\n return Array.from(toolMap.entries())\n .filter(([, tool]) => isEnabled(tool))\n .map(([name]) => name) as ToolNames<T>[];\n },\n\n getToolDefinitions(): ToolDefinition[] {\n return Array.from(toolMap)\n .filter(([, tool]) => isEnabled(tool))\n .map(([name, tool]) => ({\n name,\n description: resolve(tool.description),\n schema: resolve(tool.schema),\n strict: tool.strict,\n max_uses: tool.max_uses,\n }));\n },\n\n async processToolCalls(\n toolCalls: ParsedToolCallUnion<T>[],\n context?: ProcessToolCallsContext\n ): Promise<ProcessToolCallsResult<TResults>> {\n const attachRewind = (\n arr: ToolCallResultUnion<TResults>[],\n rewind: RewindSignal | undefined,\n ): ProcessToolCallsResult<TResults> => {\n if (rewind) {\n (arr as ProcessToolCallsResult<TResults>).rewind = rewind;\n }\n return arr as ProcessToolCallsResult<TResults>;\n };\n\n if (toolCalls.length === 0) {\n return attachRewind([], undefined);\n }\n\n const turn = context?.turn ?? 0;\n const sandboxId = context?.sandboxId;\n\n let rewindSignal: RewindSignal | undefined;\n\n if (options.parallel) {\n const scope = new CancellationScope({ cancellable: true });\n const onRewindRequested = (signal: RewindSignal): void => {\n if (!rewindSignal) {\n rewindSignal = signal;\n // Cancel all other in-flight tool calls in this batch.\n scope.cancel();\n }\n };\n\n const outcomes = await scope.run(async () =>\n Promise.allSettled(\n toolCalls.map((tc) =>\n processToolCall(tc, turn, sandboxId, onRewindRequested)\n )\n )\n );\n\n const results: ToolCallResultUnion<TResults>[] = [];\n for (const outcome of outcomes) {\n if (outcome.status === \"rejected\") {\n if (isCancellation(outcome.reason)) {\n continue;\n }\n throw outcome.reason;\n }\n if (outcome.value.kind === \"result\") {\n results.push(outcome.value.value);\n }\n }\n return attachRewind(results, rewindSignal);\n }\n\n const results: ToolCallResultUnion<TResults>[] = [];\n for (const toolCall of toolCalls) {\n const outcome = await processToolCall(toolCall, turn, sandboxId);\n if (outcome.kind === \"rewind\") {\n rewindSignal = outcome.signal;\n break;\n }\n if (outcome.kind === \"result\") {\n results.push(outcome.value);\n }\n }\n return attachRewind(results, rewindSignal);\n },\n\n async processToolCallsByName<TName extends ToolNames<T>, TResult>(\n toolCalls: ParsedToolCallUnion<T>[],\n toolName: TName,\n handler: ToolHandler<ToolArgs<T, TName>, TResult>,\n context?: ProcessToolCallsContext\n ): Promise<ToolCallResult<TName, TResult>[]> {\n const matchingCalls = toolCalls.filter((tc) => tc.name === toolName);\n\n if (matchingCalls.length === 0) {\n return [];\n }\n\n const processOne = async (\n toolCall: ParsedToolCallUnion<T>\n ): Promise<ToolCallResult<TName, TResult>> => {\n const routerContext: RouterContext = {\n threadId: options.threadId,\n ...(options.threadKey && { threadKey: options.threadKey }),\n toolCallId: toolCall.id,\n toolName: toolCall.name as TName,\n ...(context?.sandboxId !== undefined && {\n sandboxId: context.sandboxId,\n }),\n };\n const response = await handler(\n toolCall.args as ToolArgs<T, TName>,\n routerContext as Parameters<typeof handler>[1]\n );\n\n if (!response.resultAppended) {\n await appendToolResult.executeWithOptions(\n {\n summary: `Append ${toolCall.name} result`,\n },\n [\n uuid4(),\n {\n threadId: options.threadId,\n threadKey: options.threadKey,\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content: response.toolResponse as JsonValue,\n },\n ]\n );\n }\n\n return {\n toolCallId: toolCall.id,\n name: toolCall.name as TName,\n data: response.data,\n ...(response.metadata && { metadata: response.metadata }),\n };\n };\n\n if (options.parallel) {\n return Promise.all(matchingCalls.map(processOne));\n }\n\n const results: ToolCallResult<TName, TResult>[] = [];\n for (const toolCall of matchingCalls) {\n results.push(await processOne(toolCall));\n }\n return results;\n },\n\n filterByName<TName extends ToolNames<T>>(\n toolCalls: ParsedToolCallUnion<T>[],\n name: TName\n ): ParsedToolCall<TName, ToolArgs<T, TName>>[] {\n return toolCalls.filter(\n (tc): tc is ParsedToolCall<TName, ToolArgs<T, TName>> =>\n tc.name === name\n );\n },\n\n hasToolCall(\n toolCalls: ParsedToolCallUnion<T>[],\n name: ToolNames<T>\n ): boolean {\n return toolCalls.some((tc) => tc.name === name);\n },\n\n getResultsByName<TName extends ToolNames<T>>(\n results: ToolCallResultUnion<TResults>[],\n name: TName\n ): ToolCallResult<TName, ToolResult<T, TName>>[] {\n return results.filter((r) => r.name === name) as ToolCallResult<\n TName,\n ToolResult<T, TName>\n >[];\n },\n };\n}\n\n/**\n * Identity function that creates a generic inference context for a tool definition.\n * TypeScript infers TResult from the handler and flows it to hooks automatically.\n *\n * @example\n * ```typescript\n * tools: {\n * AskUser: defineTool({\n * ...askUserTool,\n * handler: handleAskUser,\n * hooks: {\n * onPostToolUse: ({ result }) => {\n * // result is correctly typed as the handler's return data type\n * },\n * },\n * }),\n * }\n * ```\n */\nexport function defineTool<\n TName extends string,\n TSchema extends z.ZodType,\n TResult,\n TContext extends RouterContext = RouterContext,\n TToolResponse = JsonValue,\n>(\n tool: ToolWithHandler<TName, TSchema, TResult, TContext, TToolResponse>\n): ToolWithHandler<TName, TSchema, TResult, TContext, TToolResponse> {\n return tool;\n}\n\n/**\n * Utility to check if there were no tool calls besides a specific one\n */\nexport function hasNoOtherToolCalls<T extends ToolMap>(\n toolCalls: ParsedToolCallUnion<T>[],\n excludeName: ToolNames<T>\n): boolean {\n return toolCalls.filter((tc) => tc.name !== excludeName).length === 0;\n}\n","import { uuid4 } from \"@temporalio/workflow\";\n\nconst BASE62 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n/**\n * Generate a compact, workflow-deterministic identifier.\n *\n * Uses Temporal's `uuid4()` internally (seeded by the workflow's RNG),\n * then re-encodes the hex bytes into a base-62 alphabet for a shorter,\n * more token-efficient identifier (~3 tokens vs ~10 for a full UUID).\n *\n * Suitable for thread IDs, child workflow IDs, or any workflow-scoped identifier.\n *\n * @param length - Number of base-62 characters (default 12, ~71 bits of entropy)\n */\nexport function getShortId(length = 12): string {\n const hex = uuid4().replace(/-/g, \"\");\n let result = \"\";\n for (let i = 0; i < length; i++) {\n const byte = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n result += BASE62[byte % BASE62.length];\n }\n return result;\n}\n","import z from \"zod\";\nimport type { SubagentConfig } from \"./types\";\n\nexport const SUBAGENT_TOOL_NAME = \"Subagent\" as const;\n\nfunction buildSubagentDescription(subagents: SubagentConfig[]): string {\n const subagentList = subagents\n .map((s) => {\n const continuation =\n s.thread && s.thread !== \"new\"\n ? \"\\n*(Supports thread continuation — pass a threadId to resume a previous conversation)*\"\n : \"\";\n return `## ${s.agentName}\\n${s.description}${continuation}`;\n })\n .join(\"\\n\\n\");\n\n return `The ${SUBAGENT_TOOL_NAME} tool launches specialized agents (subagents) that autonomously handle complex work. Each agent type has specific capabilities and tools available to it.\n\n# Available subagents:\n${subagentList}\n`;\n}\n\n/**\n * Creates a Subagent tool configured with the available subagents.\n *\n * @param subagents - Array of subagent configurations (must have at least one)\n * @returns A tool definition with dynamic schema based on available subagents\n */\nexport function createSubagentTool<T extends SubagentConfig[]>(\n subagents: T\n): {\n readonly name: typeof SUBAGENT_TOOL_NAME;\n readonly description: string;\n readonly schema: z.ZodObject<z.ZodRawShape>;\n} {\n if (subagents.length === 0) {\n throw new Error(\"createSubagentTool requires at least one subagent\");\n }\n\n const names = subagents.map((s) => s.agentName);\n const hasThreadContinuation = subagents.some(\n (s) => s.thread && s.thread !== \"new\"\n );\n\n const baseFields = {\n subagent: z.enum(names).describe(\"The type of subagent to launch\"),\n description: z\n .string()\n .describe(\"A short (3-5 word) description of the task\"),\n prompt: z.string().describe(\"The task for the agent to perform\"),\n };\n\n const schema = hasThreadContinuation\n ? z.object({\n ...baseFields,\n threadId: z\n .string()\n .nullable()\n .describe(\n \"Thread ID to continue an existing conversation from the same subagent, or null to start a new one\"\n ),\n })\n : z.object(baseFields);\n\n return {\n name: SUBAGENT_TOOL_NAME,\n description: buildSubagentDescription(subagents),\n schema,\n } as const;\n}\n\n/**\n * Subagent tool args type (when subagent names are not known at compile time)\n */\nexport type SubagentArgs = {\n subagent: string;\n description: string;\n prompt: string;\n threadId?: string | null;\n};\n","import type { z } from \"zod\";\nimport type { ChildWorkflowOptions } from \"@temporalio/workflow\";\nimport type { JsonValue } from \"../state/types\";\nimport type {\n ToolHandlerResponse,\n PreToolUseHookResult,\n PostToolUseFailureHookResult,\n} from \"../tool-router/types\";\nimport type {\n ThreadInit,\n SandboxInit,\n SubagentSandboxShutdown,\n} from \"../lifecycle\";\nimport type {\n SandboxCapability,\n SandboxCreateOptions,\n SandboxOps,\n SandboxSnapshot,\n} from \"../sandbox/types\";\n\n/**\n * Subset of {@link ChildWorkflowOptions} that callers may override when a\n * subagent is invoked. `workflowId`, `taskQueue`, and `args` are managed by\n * the subagent handler itself and therefore cannot be set here.\n *\n * Configuring `workflowRunTimeout` (or `workflowExecutionTimeout`) is strongly\n * recommended: it is the only reliable way to guarantee that a child workflow\n * which fails during initialization or repeatedly fails workflow tasks will\n * eventually be terminated, allowing the parent's `Subagent` tool call to fail\n * deterministically instead of hanging forever waiting for a result.\n */\nexport type SubagentChildWorkflowOptions = Omit<\n ChildWorkflowOptions,\n \"workflowId\" | \"taskQueue\" | \"args\"\n>;\n\n/** ToolHandlerResponse with threadId required (subagents must always surface their thread) */\nexport type SubagentHandlerResponse<\n TResult = null,\n TToolResponse = JsonValue,\n> = ToolHandlerResponse<TResult, TToolResponse>;\n\n/**\n * Raw workflow input fields passed from parent to child workflow.\n * `defineSubagentWorkflow` maps this into `SubagentSessionInput`.\n */\nexport interface SubagentWorkflowInput {\n /** Thread initialization strategy forwarded from the parent */\n thread?: ThreadInit;\n /** Sandbox initialization strategy forwarded from the parent */\n sandbox?: SandboxInit;\n /** Sandbox shutdown override from the parent (takes precedence over workflow default) */\n sandboxShutdown?: SubagentSandboxShutdown;\n}\n\nexport type SubagentWorkflow<TResult extends z.ZodType = z.ZodType> = (\n prompt: string,\n workflowInput: SubagentWorkflowInput,\n context?: Record<string, unknown>\n) => Promise<SubagentHandlerResponse<z.infer<TResult> | null>>;\n\n/**\n * A subagent workflow with embedded metadata (name, description, resultSchema).\n * Created by `defineSubagentWorkflow` — pass directly to `defineSubagent`.\n */\nexport type SubagentDefinition<\n TResult extends z.ZodType = z.ZodType,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n> = ((\n prompt: string,\n workflowInput: SubagentWorkflowInput,\n context?: TContext\n) => Promise<SubagentHandlerResponse<z.infer<TResult> | null>>) & {\n readonly agentName: string;\n readonly description: string;\n readonly resultSchema?: TResult;\n};\n\n/** Context value or factory — resolved at invocation time when a function is provided */\nexport type SubagentContext =\n | Record<string, unknown>\n | (() => Record<string, unknown>);\n\n/** Infer the z.infer'd result type from a SubagentConfig, or null if no schema */\nexport type InferSubagentResult<T extends SubagentConfig> =\n T extends SubagentConfig<infer S> ? z.infer<S> : null;\n\n// ============================================================================\n// Subagent sandbox-lifecycle decision table (SSOT)\n//\n// `createSubagentHandler` (`src/lib/subagent/handler.ts`) auto-injects\n// `sandboxShutdown` for some `(source, continuation, init, shutdown)`\n// combinations (`mustSurvive` + `alreadySurvives` rules). The child\n// session then dispatches gated sandbox methods based on the resolved\n// `(sandbox.mode, sandboxShutdown)` pair (`src/lib/session/session.ts`).\n//\n// Two surfaces have to agree on what gated methods may fire for a given\n// config:\n//\n// 1. The runtime — what the parent injects + what the child session\n// dispatches.\n// 2. The type level — what caps the proxy field has to advertise.\n//\n// `SubagentRequiredCaps<C>` is the SSOT for the type level.\n// `resolveSubagentLifecycle(cfg)` (in `handler.ts`) is the SSOT for the\n// runtime; it returns the specific `(mode, shutdown)` to inject and is\n// the only place the auto-injection rules live. Adding a new runtime\n// branch in `handler.ts` requires extending **both** — the matrix in\n// `src/lib/sandbox/capability-types.test.ts` then locks the agreement.\n//\n// `Continuation`-only / `Shutdown`-only sub-types live below as helpers\n// `_ChildModeCaps` / `_ChildShutdownCaps` so each branch reads cleanly.\n// ============================================================================\n\n/** Shutdown classes that the runtime treats equivalently for cap purposes. */\ntype _ShutdownPauseLike = \"pause\" | \"pause-until-parent-close\";\ntype _ShutdownKeepLike = \"keep\" | \"keep-until-parent-close\";\n\n/**\n * Caps the child session's sandbox-init dispatch invokes for a given\n * `(mode, shutdown)`. Mirror of `src/lib/session/session.ts:230-314`.\n */\ntype _ChildModeCaps<Mode, Shutdown> =\n // mode \"fork\" → forkSandbox\n | (Mode extends \"fork\" ? \"fork\" : never)\n // mode \"from-snapshot\" → restoreSandbox\n | (Mode extends \"from-snapshot\" ? \"restore\" : never)\n // mode \"continue\" + shutdown \"pause-until-parent-close\" → resumeSandbox\n | (Mode extends \"continue\"\n ? Shutdown extends \"pause-until-parent-close\"\n ? \"resume\"\n : never\n : never);\n\n/**\n * Caps the child session's exit dispatch invokes for a given `shutdown`.\n * Only fires when `sandboxOwned` is true (mode != \"inherit\"). Mirror of\n * `src/lib/session/session.ts:598-615`.\n */\ntype _ChildShutdownCaps<Mode, Shutdown> =\n // mode=\"inherit\" → sandboxOwned=false → no exit-shutdown caps fire\n Mode extends \"inherit\"\n ? never\n :\n | (Shutdown extends _ShutdownPauseLike ? \"pause\" : never)\n | (Shutdown extends \"snapshot\" ? \"snapshot\" : never);\n\n/**\n * Caps captured on entry for `mode: \"new\"` + `shutdown: \"snapshot\"`\n * (the seeding-base-snapshot path). Mirror of\n * `src/lib/session/session.ts:316-317`.\n */\ntype _ChildSeedCaps<Mode, Shutdown> = Mode extends \"new\"\n ? Shutdown extends \"snapshot\"\n ? \"snapshot\"\n : never\n : never;\n\n/**\n * Total caps a single child-session invocation calls for the specific\n * `(mode, shutdown)` pair the parent passes. The proxy field's required\n * cap union is the union of this across every `(mode, shutdown)` the\n * runtime might inject for the given config.\n */\ntype _ChildSessionCaps<Mode, Shutdown> =\n | _ChildModeCaps<Mode, Shutdown>\n | _ChildShutdownCaps<Mode, Shutdown>\n | _ChildSeedCaps<Mode, Shutdown>;\n\n/**\n * Resolves the user's `shutdown` value through the auto-injection rules\n * for `(source: \"own\", continuation: \"continue\")`. Mirror of\n * `src/lib/subagent/handler.ts:373-389`:\n *\n * - `pause` / `pause-until-parent-close` / `keep` / `keep-until-parent-close`\n * → propagate (`alreadySurvives = true`).\n * - everything else (undefined, \"destroy\", \"snapshot\") → injected\n * `\"pause\"` (subsequent calls) or `\"pause-until-parent-close\"`\n * (creator first call). Type-level: union both.\n */\ntype _ContinueShutdown<S> = S extends _ShutdownPauseLike | _ShutdownKeepLike\n ? S\n : \"pause\" | \"pause-until-parent-close\";\n\n/**\n * Resolves the user's `shutdown` value through the auto-injection rules\n * for `(source: \"own\", continuation: \"fork\", init: \"once\")`. Same shape\n * as `_ContinueShutdown` because both are `mustSurvive` paths.\n */\ntype _ForkOnceShutdown<S> = _ContinueShutdown<S>;\n\n/**\n * Modes the child session may be invoked under for `(source: \"own\",\n * continuation: \"continue\")`. First call has no `baseSandboxId` (mode\n * \"new\"); subsequent calls reuse it (mode \"continue\"). The type takes\n * the union — the matrix can't tell first vs. subsequent statically.\n */\ntype _OwnContinueModes = \"new\" | \"continue\";\n\n/**\n * Modes the child session may be invoked under for `(source: \"own\",\n * continuation: \"fork\")`. Same first-vs-subsequent shape as continue.\n */\ntype _OwnForkModes = \"new\" | \"fork\";\n\n/**\n * Modes the child session may be invoked under for `(source: \"own\",\n * continuation: \"snapshot\")`. First call (no base snapshot yet) uses\n * \"new\"; subsequent calls (or `init: \"once\"` after the first creator\n * publishes a base) use \"from-snapshot\".\n */\ntype _OwnSnapshotModes = \"new\" | \"from-snapshot\";\n\n/**\n * Caps required on a subagent's `proxy` for the parent's own gated\n * calls. The parent only ever calls `destroySandbox` (base) and\n * `deleteSandboxSnapshot` (`continuation: \"snapshot\"` cleanup).\n */\ntype _ParentLocalCaps<C> = C extends { continuation: \"snapshot\" }\n ? \"snapshot\"\n : never;\n\n/**\n * **SSOT type.** The full cap union a subagent's `proxy` must expose,\n * derived from `(source, continuation, init, shutdown)`.\n *\n * The shape mirrors the rows of the runtime decision table in\n * `resolveSubagentLifecycle` (`src/lib/subagent/handler.ts`): each\n * branch here corresponds to exactly one runtime branch, and adding a\n * new runtime branch requires adding a matching branch here. The\n * `(adapter × continuation × shutdown × init × source)` matrix in\n * `src/lib/sandbox/capability-types.test.ts` enforces agreement.\n */\nexport type SubagentRequiredCaps<C> = C extends \"none\"\n ? never\n : C extends { source: \"inherit\"; continuation: \"continue\" }\n ? // mode=\"inherit\", sandboxOwned=false → no gated calls regardless\n // of shutdown value.\n never\n : C extends { source: \"inherit\"; continuation: \"fork\" }\n ? // mode=\"fork\" + user shutdown propagates verbatim (no\n // auto-injection on the inherit path).\n | \"fork\"\n | _ChildSessionCaps<\n \"fork\",\n C extends { shutdown: infer S } ? S : \"destroy\"\n >\n | _ParentLocalCaps<C>\n : C extends { source: \"own\"; continuation: \"snapshot\" }\n ? // override = \"snapshot\" always; modes vary across calls.\n | _ChildSessionCaps<_OwnSnapshotModes, \"snapshot\">\n | _ParentLocalCaps<C>\n : C extends { source: \"own\"; continuation: \"continue\" }\n ? // mustSurvive=true; injection rules apply.\n | _ChildSessionCaps<\n _OwnContinueModes,\n _ContinueShutdown<\n C extends { shutdown: infer S } ? S : undefined\n >\n >\n | _ParentLocalCaps<C>\n : C extends {\n source: \"own\";\n continuation: \"fork\";\n init?: infer I;\n }\n ? // mustSurvive iff init=once.\n | \"fork\"\n | _ChildSessionCaps<\n _OwnForkModes,\n I extends \"once\"\n ? _ForkOnceShutdown<\n C extends { shutdown: infer S } ? S : undefined\n >\n : C extends { shutdown: infer S }\n ? S extends undefined\n ? \"destroy\"\n : S\n : \"destroy\"\n >\n | _ParentLocalCaps<C>\n : never;\n\n/**\n * Backwards-compatible alias retained for external callers that imported\n * the old name. Resolves through the SSOT against a synthetic\n * `{ source: \"own\", continuation: C }` config.\n *\n * @deprecated Use `SubagentRequiredCaps<C>` against the full subagent\n * sandbox config — `continuation` alone misses `shutdown` and `init`,\n * which is why the previous mapping under-rejected `fork`+`pause` and\n * `continue`+auto-injected pause.\n */\nexport type SubagentContinuationCaps<C extends SubagentContinuation> =\n C extends \"snapshot\"\n ? \"snapshot\" | \"restore\"\n : C extends \"fork\"\n ? \"fork\"\n : never;\n\n// ============================================================================\n// Subagent lifecycle SSOT — runtime mirror of `SubagentRequiredCaps`\n//\n// `resolveSubagentLifecycle` is the runtime side of the same table\n// `SubagentRequiredCaps` reads at the type level. Whenever\n// `createSubagentHandler` (`src/lib/subagent/handler.ts`) needs to\n// decide which `(sandbox.mode, sandboxShutdown)` to inject for the\n// child, it calls this function — so the auto-injection rules\n// (`mustSurvive`, `alreadySurvives`, snapshot override) live in\n// **one** place. Adding a new branch to the runtime means changing\n// this function AND the matching branch in `SubagentRequiredCaps`;\n// the `(adapter × continuation × shutdown × init × source)` matrix\n// in `src/lib/sandbox/capability-types.test.ts` enforces the agree.\n// ============================================================================\n\n/**\n * Resolved sandbox config after normalising defaults. The handler\n * passes one of these into `resolveSubagentLifecycle`.\n */\nexport interface ResolvedSubagentSandboxConfig {\n source: \"none\" | \"inherit\" | \"own\";\n init: \"per-call\" | \"once\";\n continuation: \"continue\" | \"fork\" | \"snapshot\";\n shutdown?: SubagentSandboxShutdown;\n}\n\n/**\n * Output of `resolveSubagentLifecycle`. The handler reads\n * `shutdownOverride` to decide what to forward to the child workflow,\n * and `mustSurvive` / `isLazyCreator` to drive the in-handler\n * bookkeeping (pendingDestroys, persistentSandboxes, etc.).\n */\nexport interface ResolvedSubagentLifecycle {\n /**\n * Sandbox shutdown the parent forwards to the child workflow. May\n * be auto-injected (`\"pause\"` / `\"pause-until-parent-close\"` /\n * `\"snapshot\"`) when the user's literal would not survive long\n * enough for the parent's continuation strategy.\n */\n shutdownOverride: SubagentSandboxShutdown | undefined;\n /**\n * Whether the parent must keep the sandbox alive past the child\n * session's exit. Drives the `pendingDestroys` map population.\n */\n mustSurvive: boolean;\n}\n\n/**\n * Returns true iff the user's `shutdown` already keeps the sandbox\n * alive (so the handler doesn't need to auto-inject one).\n *\n * Mirror of the type-level `_ShutdownPauseLike` / `_ShutdownKeepLike`\n * checks above.\n */\nfunction isSurvivalShutdown(s: SubagentSandboxShutdown | undefined): boolean {\n return (\n s === \"pause\" ||\n s === \"pause-until-parent-close\" ||\n s === \"keep\" ||\n s === \"keep-until-parent-close\"\n );\n}\n\n/**\n * The single runtime decision-table consumer. Returns the shutdown the\n * parent should forward to the child plus survival metadata.\n *\n * Branches must agree, one-for-one, with `SubagentRequiredCaps<C>` in\n * this file. The matrix in `capability-types.test.ts` covers each\n * branch.\n */\nexport function resolveSubagentLifecycle(\n cfg: ResolvedSubagentSandboxConfig,\n isLazyCreator: boolean\n): ResolvedSubagentLifecycle {\n // none / inherit: no auto-injection. Handler still calls\n // destroySandbox on child exit when mode=inherit, but\n // `sandboxOwned` stays false in the child session so no exit-\n // shutdown caps fire. Parent's pendingDestroys is driven entirely\n // by the user's shutdown propagating verbatim.\n if (cfg.source !== \"own\") {\n return {\n shutdownOverride: cfg.shutdown,\n mustSurvive: false,\n };\n }\n\n // own + snapshot: handler always overrides shutdown to \"snapshot\".\n // No survival flag (snapshots are cleaned up via deleteSandboxSnapshot,\n // not via pendingDestroys).\n if (cfg.continuation === \"snapshot\") {\n return {\n shutdownOverride: \"snapshot\",\n mustSurvive: false,\n };\n }\n\n // own + (continue | fork): mustSurvive iff isLazyCreator OR\n // continuation === \"continue\" OR (init === \"once\" + fork).\n const isLazy = cfg.init === \"once\";\n const mustSurvive =\n isLazyCreator ||\n cfg.continuation === \"continue\" ||\n (isLazy && cfg.continuation === \"fork\");\n\n if (!mustSurvive) {\n return { shutdownOverride: cfg.shutdown, mustSurvive: false };\n }\n\n // mustSurvive: auto-inject only if the user's shutdown doesn't\n // already survive.\n if (isSurvivalShutdown(cfg.shutdown)) {\n return { shutdownOverride: cfg.shutdown, mustSurvive };\n }\n return {\n shutdownOverride: isLazyCreator ? \"pause-until-parent-close\" : \"pause\",\n mustSurvive,\n };\n}\n\n/** Continuation values supported when `source` is `\"inherit\"`. */\ntype InheritContinuation = \"continue\" | \"fork\";\n/** Continuation values supported when `source` is `\"own\"`. */\ntype OwnContinuation = \"continue\" | \"fork\" | \"snapshot\";\n/** Union of every continuation value across both sources. */\ntype SubagentContinuation = InheritContinuation | OwnContinuation;\n\n/**\n * Caps required on a subagent's `proxy` when `source: \"inherit\"`,\n * threaded through the SSOT.\n *\n * The `inherit` source has no `init` field, and the `shutdown` field\n * is the user's literal (or `\"destroy\"` if omitted). We don't have a\n * way to detect \"omitted\" in the field type itself, so this row\n * resolves the user's `S | undefined` directly — `undefined` is treated\n * as `\"destroy\"` to match the runtime default in\n * `src/lib/subagent/handler.ts:469`.\n */\ntype _InheritCaps<C extends InheritContinuation, S> = SubagentRequiredCaps<{\n source: \"inherit\";\n continuation: C;\n shutdown: S extends undefined ? \"destroy\" : S;\n}>;\n\n/**\n * Variants for `source: \"inherit\"`. Continuation × shutdown-presence ×\n * shutdown-literal all distribute, with omitted vs. specified\n * `shutdown` encoded as separate variants — for the same reason\n * `OwnVariant` does (forbid TS from matching a permissive cell when\n * the user omits the field).\n */\ntype InheritVariant<TOptions extends SandboxCreateOptions> =\n InheritContinuation extends infer C\n ? C extends InheritContinuation\n ? (\n | { _s: undefined; shutdown?: never }\n | (SubagentSandboxShutdown extends infer SL\n ? SL extends SubagentSandboxShutdown\n ? { _s: SL; shutdown: SL }\n : never\n : never)\n ) extends infer S\n ? S extends {\n _s: SubagentSandboxShutdown | undefined;\n shutdown?: SubagentSandboxShutdown;\n }\n ? Omit<S, \"_s\"> & {\n source: \"inherit\";\n continuation: C;\n proxy: (\n scope: string\n ) => SandboxOps<\n TOptions,\n unknown,\n _InheritCaps<C, S[\"_s\"]> & SandboxCapability\n >;\n }\n : never\n : never\n : never\n : never;\n\ntype _OwnCaps<\n C extends OwnContinuation,\n I extends \"per-call\" | \"once\" | undefined,\n S,\n> = SubagentRequiredCaps<{\n source: \"own\";\n continuation: C;\n init: I extends undefined ? \"per-call\" : I;\n shutdown: S;\n}>;\n\n/**\n * Variants for `source: \"own\"`. Continuation × init-presence × shutdown-\n * presence × shutdown-literal all distribute, so each cell gets its\n * own variant with a precisely-typed `proxy`.\n *\n * Critical: omitted vs. specified `init` / `shutdown` are encoded as\n * *separate* variants. The omitted variant uses `init?: never` /\n * `shutdown?: never` so the field is forbidden when the user doesn't\n * write one — without this, TS would infer `field?: undefined` and\n * happily match an unrelated permissive variant whose caps don't\n * cover the auto-injection.\n */\ntype OwnVariant<TOptions extends SandboxCreateOptions> =\n OwnContinuation extends infer C\n ? C extends OwnContinuation\n ? // Init: omitted (never present) | \"per-call\" required | \"once\" required.\n (\n | { _i: undefined; init?: never }\n | { _i: \"per-call\"; init: \"per-call\" }\n | { _i: \"once\"; init: \"once\" }\n ) extends infer I\n ? I extends {\n _i: \"per-call\" | \"once\" | undefined;\n init?: \"per-call\" | \"once\";\n }\n ? // Shutdown: omitted | one of the literal values required.\n (\n | { _s: undefined; shutdown?: never }\n | (SubagentSandboxShutdown extends infer SL\n ? SL extends SubagentSandboxShutdown\n ? { _s: SL; shutdown: SL }\n : never\n : never)\n ) extends infer S\n ? S extends {\n _s: SubagentSandboxShutdown | undefined;\n shutdown?: SubagentSandboxShutdown;\n }\n ? Omit<I, \"_i\"> &\n Omit<S, \"_s\"> & {\n source: \"own\";\n continuation: C;\n proxy: (\n scope: string\n ) => SandboxOps<\n TOptions,\n unknown,\n _OwnCaps<C, I[\"_i\"], S[\"_s\"]> & SandboxCapability\n >;\n }\n : never\n : never\n : never\n : never\n : never\n : never;\n\n/**\n * Sandbox configuration for a subagent.\n *\n * - `\"none\"` — no sandbox (default).\n * - `{ source: \"inherit\", continuation, proxy }` — reuse the parent's sandbox.\n * `continuation: \"continue\"` shares the parent sandbox directly;\n * `continuation: \"fork\"` forks from the parent on every call.\n * - `{ source: \"own\", init?, continuation, proxy }` — the child gets its own\n * sandbox. `init: \"per-call\"` (default) creates fresh each call (thread\n * continuation uses the previous sandbox). `init: \"once\"` creates on the\n * first call and stores it for all subsequent calls.\n *\n * `proxy` is a factory that returns workflow-safe sandbox ops matching the\n * subagent's own activities. Called once inside `createSubagentHandler` with\n * `scope = agentName`, so the returned proxy resolves to the same activity\n * prefix the child session uses. The parent uses it to destroy lingering\n * sandboxes and delete stored snapshots at shutdown.\n *\n * The `proxy` field's required `TCaps` is derived from\n * {@link SubagentRequiredCaps} — the SSOT that mirrors\n * `resolveSubagentLifecycle` in the handler. It folds in `shutdown` and\n * `init` (including the handler's auto-injected `\"pause\"` /\n * `\"pause-until-parent-close\"` overrides), so any `(adapter, source,\n * continuation, init, shutdown)` cell that can't execute at runtime\n * fails to typecheck at the `defineSubagent` site.\n *\n * `TOptions` defaults to {@link SandboxCreateOptions} so the wide,\n * un-parameterised `SubagentSandboxConfig` keeps working for callers\n * that don't need adapter-specific options.\n */\nexport type SubagentSandboxConfig<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n> = \"none\" | InheritVariant<TOptions> | OwnVariant<TOptions>;\n\n/**\n * Configuration for a subagent that can be spawned by the parent workflow.\n *\n * @template TResult - Zod schema type for validating the child workflow's result\n */\nexport interface SubagentConfig<TResult extends z.ZodType = z.ZodType> {\n /** Identifier used in Task tool's subagent parameter */\n agentName: string;\n /** Description shown to the parent agent explaining what this subagent does */\n description: string;\n /** Whether this subagent is available (default: true). Disabled subagents are excluded from the Subagent tool. */\n enabled?: boolean | (() => boolean);\n /** Temporal workflow function or type name (used with executeChild) */\n workflow: SubagentWorkflow<TResult>;\n /** Optional task queue - defaults to parent's queue if not specified */\n taskQueue?: string;\n /**\n * Optional child workflow options forwarded to `executeChild` when the\n * subagent is spawned. Use this to configure timeouts, retry policies, or\n * parent-close behavior for the child workflow.\n *\n * **Recommended:** configure a `workflowRunTimeout` (or\n * `workflowExecutionTimeout`) so that a child workflow that fails to\n * initialize — or repeatedly fails workflow tasks without ever reaching a\n * terminal state — is eventually terminated by the Temporal server. Without\n * such a timeout, the parent's `Subagent` tool call can hang indefinitely\n * waiting for the child to finish. When Temporal terminates the child, the\n * tool call fails with a structured `ChildWorkflowFailure` that the router's\n * failure hooks can handle just like any other tool error.\n *\n * `workflowId`, `taskQueue`, and `args` are managed by the subagent handler\n * and cannot be overridden here.\n */\n workflowOptions?: SubagentChildWorkflowOptions;\n /** Optional Zod schema to validate the child workflow's result. If omitted, result is passed through as-is. */\n resultSchema?: TResult;\n /** Optional context passed to the subagent — a static object or a function evaluated at invocation time */\n context?: SubagentContext;\n /** Per-subagent lifecycle hooks */\n hooks?: SubagentHooks;\n /**\n * Thread mode for this subagent.\n *\n * - `\"new\"` (default) — always start a fresh thread.\n * - `\"fork\"` — the parent can pass a `threadId`; messages are copied into\n * a new thread and the subagent continues there.\n * - `\"continue\"` — the parent can pass a `threadId`; the subagent appends\n * directly to the existing thread in-place.\n */\n thread?: \"new\" | \"fork\" | \"continue\";\n /**\n * Sandbox strategy for this subagent.\n *\n * @see {@link SubagentSandboxConfig}\n *\n * @example\n * ```ts\n * import { proxyDaytonaSandboxOps } from \"zeitlich/adapters/sandbox/daytona/workflow\";\n *\n * const researcher: SubagentConfig = {\n * agentName: \"researcher\",\n * workflow: researcherWorkflow,\n * sandbox: {\n * source: \"own\",\n * continuation: \"snapshot\",\n * proxy: proxyDaytonaSandboxOps,\n * },\n * };\n * ```\n */\n sandbox?: SubagentSandboxConfig;\n}\n\n/**\n * Per-subagent lifecycle hooks - defined on a SubagentConfig.\n * Runs in addition to global hooks (global pre → subagent pre → execute → subagent post → global post).\n */\nexport interface SubagentHooks<TArgs = unknown, TResult = unknown> {\n /** Called before this subagent executes - can skip or modify args */\n onPreExecution?: (ctx: {\n args: TArgs;\n threadId: string;\n turn: number;\n }) => PreToolUseHookResult | Promise<PreToolUseHookResult>;\n /** Called after this subagent executes successfully */\n onPostExecution?: (ctx: {\n args: TArgs;\n result: TResult;\n threadId: string;\n turn: number;\n durationMs: number;\n /** Unvalidated metadata from the child workflow (e.g. infrastructure state) */\n metadata?: Record<string, unknown>;\n }) => void | Promise<void>;\n /** Called when this subagent execution fails */\n onExecutionFailure?: (ctx: {\n args: TArgs;\n error: Error;\n threadId: string;\n turn: number;\n }) => PostToolUseFailureHookResult | Promise<PostToolUseFailureHookResult>;\n}\n\n/**\n * Response returned from a subagent workflow `fn`.\n *\n * When `TSandboxShutdown` is `\"pause-until-parent-close\"` or\n * `\"keep-until-parent-close\"`, the parent needs the `sandboxId` to destroy\n * the sandbox at its own shutdown, so the field becomes required.\n */\nexport type SubagentFnResult<\n TResult = null,\n TSandboxShutdown extends SubagentSandboxShutdown = SubagentSandboxShutdown,\n> = SubagentHandlerResponse<TResult> &\n (TSandboxShutdown extends\n | \"pause-until-parent-close\"\n | \"keep-until-parent-close\"\n ? { sandboxId: string }\n : { sandboxId?: string });\n\n/** Payload sent by a child workflow as soon as its sandbox is ready */\nexport interface ChildSandboxReadySignalPayload {\n childWorkflowId: string;\n sandboxId: string;\n /**\n * Present only when the session captured a seed snapshot on this run\n * (`continuation === \"snapshot\"` + fresh creation). Allows the parent to\n * publish the reusable base snapshot to concurrent waiters without\n * blocking on the child workflow's completion.\n */\n baseSnapshot?: SandboxSnapshot;\n}\n\n/**\n * Session config fields passed from parent to child workflow.\n */\nexport interface SubagentSessionInput {\n /** Agent name — spread directly into `createSession` */\n agentName: string;\n /** Thread initialization strategy */\n thread?: ThreadInit;\n /** Sandbox initialization strategy */\n sandbox?: SandboxInit;\n /** Sandbox shutdown policy (default: \"destroy\") */\n sandboxShutdown?: SubagentSandboxShutdown;\n /**\n * Called by the session as soon as the sandbox is created, before the\n * agent loop starts. `baseSnapshot` is populated only when the session\n * captured a seed snapshot (fresh creation + `sandboxShutdown === \"snapshot\"`).\n */\n onSandboxReady?: (args: {\n sandboxId: string;\n baseSnapshot?: SandboxSnapshot;\n }) => void;\n /**\n * Called by the session right before `runSession` returns. Installed by\n * `defineSubagentWorkflow` to capture sandbox outputs and auto-forward\n * them to the subagent's final result so user code never has to thread\n * `sandboxId` / `snapshot` manually.\n */\n onSessionExit?: (result: {\n sandboxId?: string;\n snapshot?: SandboxSnapshot;\n threadId: string;\n usage: {\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCachedWriteTokens: number;\n totalCachedReadTokens: number;\n totalReasonTokens: number;\n turns: number;\n };\n }) => void;\n}\n","import { defineSignal } from \"@temporalio/workflow\";\nimport type { ChildSandboxReadySignalPayload } from \"./types\";\n\n/** Sent by a child workflow as soon as its sandbox is created, before the agent loop starts. */\nexport const childSandboxReadySignal =\n defineSignal<[ChildSandboxReadySignalPayload]>(\"childSandboxReady\");\n","import {\n workflowInfo,\n setHandler,\n condition,\n log,\n ApplicationFailure,\n executeChild,\n} from \"@temporalio/workflow\";\nimport type { Duration } from \"@temporalio/common\";\nimport { getShortId } from \"../thread/id\";\nimport type { ToolHandlerResponse, RouterContext } from \"../tool-router\";\nimport type { JsonValue } from \"../state/types\";\nimport type {\n InferSubagentResult,\n ResolvedSubagentSandboxConfig,\n SubagentConfig,\n SubagentFnResult,\n SubagentSandboxConfig,\n SubagentWorkflowInput,\n} from \"./types\";\nimport { resolveSubagentLifecycle } from \"./types\";\nimport type { SubagentArgs } from \"./tool\";\nimport type { z } from \"zod\";\nimport type {\n ThreadInit,\n SandboxInit,\n SubagentSandboxShutdown,\n} from \"../lifecycle\";\nimport type {\n SandboxCreateOptions,\n SandboxOps,\n SandboxSnapshot,\n} from \"../sandbox/types\";\nimport { childSandboxReadySignal } from \"./signals\";\n\n/**\n * Methods the parent's subagent handler invokes on a subagent's `proxy`.\n * Kept narrow so the handler's internal maps accept `SandboxOps<…, never>`\n * (e.g. Daytona) and `SandboxOps<…, \"snapshot\">` (e.g. E2B for\n * snapshot-driven continuations) alike.\n *\n * `destroySandbox` is base — always available.\n * `deleteSandboxSnapshot` is only called for continuations that produce\n * snapshots; it's stored separately and only populated when present on\n * the cfg-specific proxy.\n */\ntype ParentDestroyOps = Pick<\n SandboxOps<SandboxCreateOptions, unknown, never>,\n \"destroySandbox\"\n>;\ntype ParentDeleteSnapshotOps = Pick<\n SandboxOps<SandboxCreateOptions, unknown, \"snapshot\">,\n \"deleteSandboxSnapshot\"\n>;\n\n/**\n * Default `workflowRunTimeout` applied to every subagent child workflow\n * unless overridden via `SubagentConfig.workflowOptions.workflowRunTimeout`.\n *\n * Chosen as a safety bound: Temporal retries failing workflow tasks forever\n * by default, so a child that fails to initialize (e.g. missing workflow\n * export) or is otherwise broken will never reach a terminal state on its\n * own and the parent's `Subagent` tool call would hang indefinitely. A\n * bounded run timeout guarantees the child is eventually terminated and the\n * parent receives a structured `ChildWorkflowFailure` it can surface to the\n * agent. One hour is generous enough for realistic agent sessions while\n * still catching hangs; agents that legitimately need longer should set an\n * explicit `workflowOptions.workflowRunTimeout`.\n */\nexport const DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT: Duration = \"1h\";\n\nfunction resolveSandboxConfig(\n config?: SubagentSandboxConfig\n): ResolvedSubagentSandboxConfig {\n if (!config || config === \"none\") {\n return { source: \"none\", init: \"per-call\", continuation: \"fork\" };\n }\n if (config.source === \"inherit\") {\n return {\n source: \"inherit\",\n init: \"per-call\",\n continuation: config.continuation,\n shutdown: config.shutdown,\n };\n }\n return {\n source: \"own\",\n init: config.init ?? \"per-call\",\n continuation: config.continuation,\n shutdown: config.shutdown,\n };\n}\n\n/**\n * Creates a Subagent tool handler that spawns child workflows for configured subagents.\n *\n * Sandbox and snapshot cleanup happens inside the parent via each subagent's\n * `sandbox.proxy` — the proxy factory is invoked once per subagent with\n * `scope = agentName` so it resolves to the same activities the child uses.\n *\n * @param subagents - Array of subagent configurations\n * @returns A tool handler function that can be used with the tool router\n */\nexport function createSubagentHandler<\n const T extends readonly SubagentConfig[],\n>(\n subagents: [...T]\n): {\n handler: (\n args: SubagentArgs,\n context: RouterContext\n ) => Promise<ToolHandlerResponse<InferSubagentResult<T[number]> | null>>;\n destroySubagentSandboxes: () => Promise<void>;\n cleanupSubagentSnapshots: () => Promise<void>;\n} {\n const { taskQueue: parentTaskQueue } = workflowInfo();\n\n /**\n * Sandbox ops proxy per subagent, built eagerly from `sandbox.proxy`\n * factories.\n *\n * Split into two maps so each accepts only the cap-narrowed slice the\n * parent actually consumes. `destroyOps` accepts every adapter (base\n * `destroySandbox` is always present); `deleteSnapshotOps` is only\n * populated for `continuation: \"snapshot\"` configs, and the\n * `SubagentSandboxConfig` type guarantees the proxy carries\n * `deleteSandboxSnapshot` when that continuation is selected.\n */\n const agentDestroyOps = new Map<string, ParentDestroyOps>();\n const agentDeleteSnapshotOps = new Map<string, ParentDeleteSnapshotOps>();\n for (const cfg of subagents) {\n const cfgSandbox = cfg.sandbox;\n if (!cfgSandbox || cfgSandbox === \"none\") continue;\n if (cfgSandbox.continuation === \"snapshot\") {\n // Pull the proxy here so the per-branch narrowing keeps\n // `deleteSandboxSnapshot` in the inferred return type.\n const proxy = cfgSandbox.proxy(cfg.agentName);\n agentDestroyOps.set(cfg.agentName, proxy);\n agentDeleteSnapshotOps.set(cfg.agentName, proxy);\n } else {\n const proxy = cfgSandbox.proxy(cfg.agentName);\n agentDestroyOps.set(cfg.agentName, proxy);\n }\n }\n\n /**\n * Sandboxes that outlived their child session and must be destroyed by the\n * parent at shutdown (shutdown = `pause-until-parent-close` /\n * `keep-until-parent-close`). Keyed by `persistent:<agent>` for lazy\n * shared sandboxes and by childWorkflowId otherwise.\n */\n const pendingDestroys = new Map<\n string,\n { agentName: string; sandboxId: string }\n >();\n /** Maps childThreadId → sandboxId for sandbox continuation across invocations (init: per-call) */\n const threadSandboxes = new Map<string, string>();\n /** Maps agentName → sandboxId for persistent sandboxes (init: once) */\n const persistentSandboxes = new Map<string, string>();\n /** Tracks agents whose first lazy sandbox creation is in-flight (guards concurrent init) */\n const persistentSandboxCreating = new Set<string>();\n /**\n * Latest failure from a lazy-creator call, keyed by agentName. Populated\n * when a creator's `executeChild` throws, consumed by concurrent waiters so\n * they fail deterministically instead of hanging on a condition predicate\n * that will never be satisfied. Cleared once observed by all current\n * waiters (on the next successful creator attempt).\n */\n const persistentSandboxCreationError = new Map<string, unknown>();\n /** Reverse lookup: childWorkflowId → agentName for in-flight lazy creators */\n const lazyCreatorAgent = new Map<string, string>();\n /** Reverse lookup: childWorkflowId → agentName for in-flight snapshot-base creators */\n const snapshotBaseCreatorAgent = new Map<string, string>();\n /** Maps childThreadId → latest snapshot for sandbox continuation via snapshots */\n const threadSnapshots = new Map<\n string,\n {\n agentName: string;\n snapshot: SandboxSnapshot;\n }\n >();\n /** Maps agentName → reusable base snapshot captured on first-ever call (init: once + continuation: \"snapshot\") */\n const persistentBaseSnapshot = new Map<string, SandboxSnapshot>();\n /** Tracks agents whose first snapshot-backed sandbox creation is in-flight */\n const persistentBaseSnapshotCreating = new Set<string>();\n /** Latest failure from a snapshot-base creator call, keyed by agentName. */\n const persistentBaseSnapshotCreationError = new Map<string, unknown>();\n\n setHandler(\n childSandboxReadySignal,\n ({ childWorkflowId, sandboxId, baseSnapshot }) => {\n const lazyAgent = lazyCreatorAgent.get(childWorkflowId);\n if (lazyAgent && !persistentSandboxes.has(lazyAgent)) {\n persistentSandboxes.set(lazyAgent, sandboxId);\n lazyCreatorAgent.delete(childWorkflowId);\n }\n const snapAgent = snapshotBaseCreatorAgent.get(childWorkflowId);\n if (snapAgent && baseSnapshot && !persistentBaseSnapshot.has(snapAgent)) {\n persistentBaseSnapshot.set(snapAgent, baseSnapshot);\n snapshotBaseCreatorAgent.delete(childWorkflowId);\n }\n }\n );\n\n const handler = async (\n args: SubagentArgs,\n context: RouterContext\n ): Promise<ToolHandlerResponse<InferSubagentResult<T[number]> | null>> => {\n const config = subagents.find((s) => s.agentName === args.subagent);\n\n if (!config) {\n throw new Error(\n `Unknown subagent: ${args.subagent}. Available: ${subagents.map((s) => s.agentName).join(\", \")}`\n );\n }\n\n const childWorkflowId = `${args.subagent}-${getShortId()}`;\n\n const { sandboxId: parentSandboxId } = context;\n const sandboxCfg = resolveSandboxConfig(config.sandbox);\n\n if (\n sandboxCfg.source !== \"none\" &&\n !agentDestroyOps.has(config.agentName)\n ) {\n throw ApplicationFailure.create({\n message: `Subagent \"${config.agentName}\" uses a sandbox but no \\`sandbox.proxy\\` is configured on its SubagentConfig`,\n nonRetryable: true,\n });\n }\n\n if (sandboxCfg.source === \"inherit\" && !parentSandboxId) {\n throw new Error(\n `Subagent \"${config.agentName}\" is configured with sandbox: \"inherit\" but the parent has no sandbox`\n );\n }\n\n const threadMode = config.thread ?? \"new\";\n const allowsContinuation = threadMode !== \"new\";\n const continuationThreadId =\n args.threadId && allowsContinuation ? args.threadId : undefined;\n\n // --- Build thread init ---\n let thread: ThreadInit | undefined;\n if (continuationThreadId) {\n thread = {\n mode: threadMode as \"fork\" | \"continue\",\n threadId: continuationThreadId,\n };\n }\n\n // --- Build sandbox init ---\n let sandbox: SandboxInit | undefined;\n let sandboxShutdownOverride: SubagentSandboxShutdown | undefined;\n let isLazyCreator = false;\n let isSnapshotBaseCreator = false;\n\n if (sandboxCfg.source === \"inherit\" && parentSandboxId) {\n if (sandboxCfg.continuation === \"fork\") {\n sandbox = { mode: \"fork\", sandboxId: parentSandboxId };\n } else if (sandboxCfg.continuation === \"snapshot\") {\n throw new Error(\n `Subagent \"${config.agentName}\" has sandbox source \"inherit\" with continuation \"snapshot\" — snapshot continuation is only supported for source \"own\"`\n );\n } else {\n sandbox = { mode: \"inherit\", sandboxId: parentSandboxId };\n }\n } else if (\n sandboxCfg.source === \"own\" &&\n sandboxCfg.continuation === \"snapshot\"\n ) {\n // Snapshot-driven continuation: each call boots a fresh sandbox from a\n // stored snapshot (per-thread, or a per-agent base for new threads with\n // init: \"once\"). The session destroys its sandbox inline on exit;\n // stored snapshot IDs are cleaned up by the parent at shutdown.\n const isLazy = sandboxCfg.init === \"once\";\n\n let baseSnap: SandboxSnapshot | undefined;\n if (continuationThreadId) {\n baseSnap = threadSnapshots.get(continuationThreadId)?.snapshot;\n }\n\n if (!baseSnap && isLazy) {\n baseSnap = persistentBaseSnapshot.get(config.agentName);\n if (!baseSnap) {\n if (persistentBaseSnapshotCreating.has(config.agentName)) {\n await condition(\n () =>\n persistentBaseSnapshot.has(config.agentName) ||\n persistentBaseSnapshotCreationError.has(config.agentName) ||\n !persistentBaseSnapshotCreating.has(config.agentName)\n );\n const creatorErr = persistentBaseSnapshotCreationError.get(\n config.agentName\n );\n if (creatorErr !== undefined) {\n throw creatorErr;\n }\n baseSnap = persistentBaseSnapshot.get(config.agentName);\n if (!baseSnap) {\n persistentBaseSnapshotCreating.add(config.agentName);\n isSnapshotBaseCreator = true;\n }\n } else {\n persistentBaseSnapshotCreating.add(config.agentName);\n isSnapshotBaseCreator = true;\n }\n }\n }\n\n if (baseSnap) {\n sandbox = { mode: \"from-snapshot\", snapshot: baseSnap };\n }\n } else if (sandboxCfg.source === \"own\") {\n const isLazy = sandboxCfg.init === \"once\";\n\n let baseSandboxId: string | undefined;\n if (isLazy) {\n baseSandboxId = persistentSandboxes.get(config.agentName);\n if (!baseSandboxId) {\n if (persistentSandboxCreating.has(config.agentName)) {\n // Another call is already creating — wait for it to finish.\n // Also break out if the creator failed, so we can either fail\n // fast with the same error or (if no one has re-claimed the\n // creator role yet) take over ourselves.\n await condition(\n () =>\n persistentSandboxes.has(config.agentName) ||\n persistentSandboxCreationError.has(config.agentName) ||\n !persistentSandboxCreating.has(config.agentName)\n );\n const creatorErr = persistentSandboxCreationError.get(\n config.agentName\n );\n if (creatorErr !== undefined) {\n throw creatorErr;\n }\n baseSandboxId = persistentSandboxes.get(config.agentName);\n if (!baseSandboxId) {\n persistentSandboxCreating.add(config.agentName);\n isLazyCreator = true;\n }\n } else {\n // We're the first concurrent caller — claim the creator role\n persistentSandboxCreating.add(config.agentName);\n isLazyCreator = true;\n }\n }\n } else if (continuationThreadId) {\n baseSandboxId = threadSandboxes.get(continuationThreadId);\n }\n\n if (baseSandboxId) {\n sandbox = {\n mode: sandboxCfg.continuation === \"continue\" ? \"continue\" : \"fork\",\n sandboxId: baseSandboxId,\n };\n }\n }\n\n // Resolve the lifecycle decision (auto-inject pause/snapshot, etc.)\n // through the SSOT — same table the type-level `SubagentRequiredCaps`\n // reads. Adding a new branch here means changing both. The matrix\n // in `src/lib/sandbox/capability-types.test.ts` enforces the\n // type-level / runtime agreement.\n {\n const lifecycle = resolveSubagentLifecycle(sandboxCfg, isLazyCreator);\n sandboxShutdownOverride = lifecycle.shutdownOverride;\n }\n\n const workflowInput: SubagentWorkflowInput = {\n ...(thread && { thread }),\n ...(sandbox && { sandbox }),\n sandboxShutdown:\n sandboxShutdownOverride ?? sandboxCfg.shutdown ?? undefined,\n };\n\n const resolvedContext =\n config.context === undefined\n ? undefined\n : typeof config.context === \"function\"\n ? config.context()\n : config.context;\n\n const childOpts = {\n // Apply a bounded run timeout by default so a child workflow that\n // fails to initialize or otherwise never reaches a terminal state\n // cannot hang the parent's `Subagent` tool call forever. Callers can\n // raise, lower, or disable it via `workflowOptions.workflowRunTimeout`.\n workflowRunTimeout: DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT,\n ...(config.workflowOptions ?? {}),\n workflowId: childWorkflowId,\n args:\n resolvedContext === undefined\n ? ([args.prompt, workflowInput] as const)\n : ([args.prompt, workflowInput, resolvedContext] as const),\n taskQueue: config.taskQueue ?? parentTaskQueue,\n };\n\n if (isLazyCreator) {\n lazyCreatorAgent.set(childWorkflowId, config.agentName);\n }\n if (isSnapshotBaseCreator) {\n snapshotBaseCreatorAgent.set(childWorkflowId, config.agentName);\n }\n\n log.info(\"subagent spawned\", {\n subagent: config.agentName,\n childWorkflowId,\n threadMode,\n sandboxSource: sandboxCfg.source,\n });\n\n // Always clear in-flight creator bookkeeping, even if `executeChild`\n // throws. Otherwise a failing subagent would strand other concurrent\n // callers waiting on `condition(() => persistentSandboxes.has(...))` /\n // `persistentBaseSnapshot.has(...)` forever, because those conditions are\n // only ever satisfied on the success path below. When we were the\n // creator, also publish the error so any already-waiting concurrent\n // callers fail with the same error instead of silently retrying or\n // hanging.\n let childResult: SubagentFnResult<InferSubagentResult<T[number]> | null>;\n try {\n childResult = (await executeChild(\n config.workflow,\n childOpts\n )) as SubagentFnResult<InferSubagentResult<T[number]> | null>;\n } catch (err) {\n log.warn(\"subagent failed\", {\n subagent: config.agentName,\n childWorkflowId,\n error: err instanceof Error ? err.message : String(err),\n });\n if (isLazyCreator) {\n persistentSandboxCreating.delete(config.agentName);\n persistentSandboxCreationError.set(config.agentName, err);\n lazyCreatorAgent.delete(childWorkflowId);\n }\n if (isSnapshotBaseCreator) {\n persistentBaseSnapshotCreating.delete(config.agentName);\n persistentBaseSnapshotCreationError.set(config.agentName, err);\n snapshotBaseCreatorAgent.delete(childWorkflowId);\n }\n throw err;\n }\n\n const effectiveShutdown =\n sandboxShutdownOverride ?? sandboxCfg.shutdown ?? \"destroy\";\n\n log.info(\"subagent completed\", {\n subagent: config.agentName,\n childWorkflowId,\n ...(childResult.usage && { usage: childResult.usage }),\n });\n\n const {\n toolResponse,\n data,\n usage,\n threadId: childThreadId,\n sandboxId: childSandboxId,\n snapshot: childSnapshot,\n baseSnapshot: childBaseSnapshot,\n metadata,\n } = childResult;\n\n if (childSandboxId) {\n if (\n sandboxCfg.source === \"own\" &&\n sandboxCfg.init === \"once\" &&\n sandboxCfg.continuation !== \"snapshot\" &&\n !persistentSandboxes.has(config.agentName)\n ) {\n // Fallback: signal may have already set this via childSandboxReadySignal\n persistentSandboxes.set(config.agentName, childSandboxId);\n } else if (\n allowsContinuation &&\n childThreadId &&\n sandboxCfg.source === \"own\" &&\n sandboxCfg.continuation !== \"snapshot\"\n ) {\n threadSandboxes.set(childThreadId, childSandboxId);\n }\n }\n\n // Track sandboxes that must be destroyed by the parent at shutdown.\n if (\n childSandboxId &&\n (effectiveShutdown === \"pause-until-parent-close\" ||\n effectiveShutdown === \"keep-until-parent-close\")\n ) {\n const key = isLazyCreator\n ? `persistent:${config.agentName}`\n : childWorkflowId;\n pendingDestroys.set(key, {\n agentName: config.agentName,\n sandboxId: childSandboxId,\n });\n }\n\n // Store snapshots for future snapshot-driven continuation and final sweep.\n // Tag each with `agentName` so `cleanupSubagentSnapshots` knows which\n // sandbox ops to call for deletion.\n if (sandboxCfg.source === \"own\" && sandboxCfg.continuation === \"snapshot\") {\n if (childSnapshot && childThreadId) {\n threadSnapshots.set(childThreadId, {\n agentName: config.agentName,\n snapshot: childSnapshot,\n });\n }\n if (\n isSnapshotBaseCreator &&\n childBaseSnapshot &&\n !persistentBaseSnapshot.has(config.agentName)\n ) {\n persistentBaseSnapshot.set(config.agentName, childBaseSnapshot);\n }\n }\n\n if (isLazyCreator) {\n persistentSandboxCreating.delete(config.agentName);\n persistentSandboxCreationError.delete(config.agentName);\n lazyCreatorAgent.delete(childWorkflowId);\n }\n if (isSnapshotBaseCreator) {\n persistentBaseSnapshotCreating.delete(config.agentName);\n persistentBaseSnapshotCreationError.delete(config.agentName);\n snapshotBaseCreatorAgent.delete(childWorkflowId);\n }\n\n if (!toolResponse) {\n return {\n toolResponse: \"Subagent workflow returned no response\",\n data: null,\n ...(usage && { usage }),\n ...(childSandboxId && { sandboxId: childSandboxId }),\n ...(metadata && { metadata }),\n };\n }\n\n const validated = (\n config.resultSchema ? config.resultSchema.safeParse(data) : null\n ) as z.ZodSafeParseResult<InferSubagentResult<T[number]>> | null;\n\n if (validated && !validated.success) {\n return {\n toolResponse: `Subagent workflow returned invalid data: ${validated.error.message}`,\n data: null,\n ...(usage && { usage }),\n ...(childSandboxId && { sandboxId: childSandboxId }),\n ...(metadata && { metadata }),\n };\n }\n\n let finalToolResponse: JsonValue = toolResponse;\n\n if (allowsContinuation && childThreadId) {\n const responseStr =\n typeof toolResponse === \"string\"\n ? toolResponse\n : JSON.stringify(toolResponse);\n finalToolResponse = `${responseStr}\\n\\n[${config.agentName} Thread ID: ${childThreadId}]`;\n }\n\n return {\n toolResponse: finalToolResponse,\n data: validated\n ? validated.data\n : (data as InferSubagentResult<T[number]> | null),\n ...(usage && { usage }),\n ...(childSandboxId && { sandboxId: childSandboxId }),\n ...(metadata && { metadata }),\n };\n };\n\n const destroySubagentSandboxes = async (): Promise<void> => {\n const entries = [...pendingDestroys.values()];\n pendingDestroys.clear();\n await Promise.all(\n entries.map(async ({ agentName, sandboxId }) => {\n const ops = agentDestroyOps.get(agentName);\n if (!ops) {\n log.warn(\n \"Skipping sandbox destroy — no sandbox.proxy registered for agent\",\n { agentName, sandboxId }\n );\n return;\n }\n try {\n await ops.destroySandbox(sandboxId);\n } catch (err) {\n log.warn(\"Failed to destroy subagent sandbox\", {\n agentName,\n sandboxId,\n error: err,\n });\n }\n })\n );\n };\n\n const cleanupSubagentSnapshots = async (): Promise<void> => {\n const tagged = [];\n for (const entry of threadSnapshots.values()) tagged.push(entry);\n for (const [agentName, snapshot] of persistentBaseSnapshot.entries()) {\n tagged.push({ agentName, snapshot });\n }\n threadSnapshots.clear();\n persistentBaseSnapshot.clear();\n\n await Promise.all(\n tagged.map(async ({ agentName, snapshot }) => {\n const ops = agentDeleteSnapshotOps.get(agentName);\n if (!ops) {\n log.warn(\n \"Skipping snapshot delete — no sandbox.proxy registered for agent\",\n { agentName }\n );\n return;\n }\n try {\n await ops.deleteSandboxSnapshot(snapshot);\n } catch (err) {\n log.warn(\"Failed to delete subagent snapshot\", {\n agentName,\n error: err,\n });\n }\n })\n );\n };\n\n return { handler, destroySubagentSandboxes, cleanupSubagentSnapshots };\n}\n","import type {\n PreToolUseHookResult,\n PostToolUseFailureHookResult,\n ToolHooks,\n ToolMap,\n} from \"../tool-router/types\";\nimport type { SubagentConfig, SubagentHooks } from \"./types\";\nimport type { z } from \"zod\";\nimport {\n createSubagentTool,\n SUBAGENT_TOOL_NAME,\n type SubagentArgs,\n} from \"./tool\";\nimport { createSubagentHandler } from \"./handler\";\n\n/**\n * Builds a fully wired tool entry for the Subagent tool,\n * including per-subagent hook delegation.\n *\n * Lazily evaluates `enabled` (supports `boolean | () => boolean`)\n * so that `description` and `schema` reflect the current set of\n * active subagents each time getToolDefinitions() is called.\n *\n * Returns null if no subagents are configured.\n */\nexport function buildSubagentRegistration(subagents: SubagentConfig[]): {\n registration: ToolMap[string];\n destroySubagentSandboxes: () => Promise<void>;\n cleanupSubagentSnapshots: () => Promise<void>;\n} | null {\n if (subagents.length === 0) return null;\n\n const getEnabled = (): SubagentConfig[] =>\n subagents.filter((s) =>\n typeof s.enabled === \"function\" ? s.enabled() : (s.enabled ?? true)\n );\n\n const subagentHooksMap = new Map<string, SubagentHooks>();\n for (const s of subagents) {\n if (s.hooks) subagentHooksMap.set(s.agentName, s.hooks);\n }\n\n const resolveSubagentName = (args: unknown): string =>\n (args as SubagentArgs).subagent;\n\n const { handler, destroySubagentSandboxes, cleanupSubagentSnapshots } =\n createSubagentHandler(subagents);\n\n const registration: ToolMap[string] = {\n name: SUBAGENT_TOOL_NAME,\n enabled: (): boolean => getEnabled().length > 0,\n description: (): string => createSubagentTool(getEnabled()).description,\n schema: (): z.ZodObject<z.ZodRawShape> =>\n createSubagentTool(getEnabled()).schema,\n handler,\n ...(subagentHooksMap.size > 0 && {\n hooks: {\n onPreToolUse: async (ctx): Promise<PreToolUseHookResult> => {\n const hooks = subagentHooksMap.get(resolveSubagentName(ctx.args));\n return hooks?.onPreExecution?.(ctx) ?? {};\n },\n onPostToolUse: async (ctx): Promise<void> => {\n const hooks = subagentHooksMap.get(resolveSubagentName(ctx.args));\n await hooks?.onPostExecution?.(ctx);\n },\n onPostToolUseFailure: async (\n ctx\n ): Promise<PostToolUseFailureHookResult> => {\n const hooks = subagentHooksMap.get(resolveSubagentName(ctx.args));\n return hooks?.onExecutionFailure?.(ctx) ?? {};\n },\n } satisfies ToolHooks,\n }),\n };\n\n return { registration, destroySubagentSandboxes, cleanupSubagentSnapshots };\n}\n","import z from \"zod\";\nimport type { Skill } from \"./types\";\n\nexport const READ_SKILL_TOOL_NAME = \"ReadSkill\" as const;\n\nfunction buildReadSkillDescription(skills: Skill[]): string {\n const skillList = skills\n .map((s) => `- **${s.name}**: ${s.description}`)\n .join(\"\\n\");\n\n return `Load the full instructions for a skill. Read the skill before following its instructions.\n\n# Available skills:\n${skillList}\n`;\n}\n\n/**\n * Creates a ReadSkill tool configured with the available skills.\n * The tool description embeds skill metadata so the agent discovers\n * skills purely through the tool definition.\n */\nexport function createReadSkillTool(skills: Skill[]): {\n name: string;\n description: string;\n schema: z.ZodObject<{\n skill_name: z.ZodEnum<Record<string, string>>;\n }>;\n} {\n if (skills.length === 0) {\n throw new Error(\"createReadSkillTool requires at least one skill\");\n }\n\n const names = skills.map((s) => s.name);\n\n return {\n name: READ_SKILL_TOOL_NAME,\n description: buildReadSkillDescription(skills),\n schema: z.object({\n skill_name: z.enum(names).describe(\"The name of the skill to load\"),\n }),\n } as const;\n}\n\nexport type ReadSkillArgs = {\n skill_name: string;\n};\n","import type { Skill } from \"./types\";\nimport type { ToolHandlerResponse } from \"../tool-router\";\nimport type { ReadSkillArgs } from \"./tool\";\n\n/**\n * Formats the skill activation response with structured wrapping.\n *\n * Follows the agentskills.io pattern: the instructions are wrapped in\n * identifying tags and bundled resources are listed so the agent can\n * load them on demand via its file-read tool.\n */\nfunction formatSkillResponse(skill: Skill): string {\n const parts: string[] = [];\n\n parts.push(`<skill_content name=\"${skill.name}\">`);\n parts.push(skill.instructions);\n\n if (skill.location) {\n parts.push(`\\nSkill directory: ${skill.location}`);\n parts.push(\n \"Relative paths in this skill resolve against the skill directory above.\"\n );\n }\n\n const resources = skill.resourceContents\n ? Object.keys(skill.resourceContents)\n : [];\n if (resources.length > 0) {\n parts.push(\"\");\n parts.push(\"<skill_resources>\");\n for (const r of resources) {\n parts.push(` <file>${r}</file>`);\n }\n parts.push(\"</skill_resources>\");\n }\n\n parts.push(\"</skill_content>\");\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Creates a ReadSkill handler that looks up skills from an in-memory array.\n * Runs directly in the workflow (like task tools) — no activity needed.\n *\n * The response uses structured wrapping per the agentskills.io spec:\n * instructions are enclosed in `<skill_content>` tags, the skill directory\n * is included, and bundled resources are listed so the agent can load them\n * individually via its file-read tool.\n */\nexport function createReadSkillHandler(\n skills: Skill[]\n): (args: ReadSkillArgs) => ToolHandlerResponse<null> {\n const skillMap = new Map(skills.map((s) => [s.name, s]));\n\n return (args: ReadSkillArgs): ToolHandlerResponse<null> => {\n const skill = skillMap.get(args.skill_name);\n\n if (!skill) {\n return {\n toolResponse: JSON.stringify({\n error: `Skill \"${args.skill_name}\" not found`,\n }),\n data: null,\n };\n }\n\n return {\n toolResponse: formatSkillResponse(skill),\n data: null,\n };\n };\n}\n","import type { ToolMap } from \"../tool-router/types\";\nimport type { Skill, SkillMetadata } from \"./types\";\nimport { createReadSkillTool } from \"./tool\";\nimport { createReadSkillHandler } from \"./handler\";\n\n/**\n * Validates that all skill names are unique. Throws immediately if duplicates\n * are found so misconfiguration is caught at session wiring time.\n */\nfunction validateSkillNames(skills: SkillMetadata[]): void {\n const names = skills.map((s) => s.name);\n const dupes = names.filter((n, i) => names.indexOf(n) !== i);\n if (dupes.length > 0) {\n throw new Error(`Duplicate skill names: ${[...new Set(dupes)].join(\", \")}`);\n }\n}\n\n/**\n * Builds a fully wired tool entry for the ReadSkill tool.\n *\n * Returns null if no skills are provided.\n */\nexport function buildSkillRegistration(\n skills: Skill[]\n): ToolMap[string] | null {\n if (skills.length === 0) return null;\n\n validateSkillNames(skills);\n\n return {\n ...createReadSkillTool(skills),\n handler: createReadSkillHandler(skills),\n };\n}\n","import {\n defineUpdate,\n setHandler,\n ApplicationFailure,\n log,\n} from \"@temporalio/workflow\";\nimport type { SessionExitReason } from \"../types\";\nimport type { SessionConfig, ZeitlichSession } from \"./types\";\nimport { resolveSessionLifecycle } from \"./types\";\nimport type {\n SandboxCapability,\n SandboxCreateOptions,\n SandboxOps,\n SandboxSnapshot,\n} from \"../sandbox/types\";\nimport type { SandboxInit, SubagentSandboxShutdown } from \"../lifecycle\";\nimport type {\n AgentState,\n AgentStateManager,\n JsonSerializable,\n PersistedThreadState,\n} from \"../state/types\";\nimport { createToolRouter } from \"../tool-router/router\";\nimport type { ParsedToolCallUnion, ToolMap } from \"../tool-router/types\";\nimport { getShortId } from \"../thread/id\";\nimport { buildSubagentRegistration } from \"../subagent/register\";\nimport { buildSkillRegistration } from \"../skills/register\";\nimport type { Skill } from \"../skills/types\";\nimport { uuid4 } from \"@temporalio/workflow\";\n\n/**\n * Collects resource file contents from all skills into a flat map\n * keyed by absolute path (location + relative resource path).\n * Returns undefined when no skills carry resource contents.\n */\nfunction collectSkillFiles(\n skills: Skill[]\n): Record<string, string> | undefined {\n let files: Record<string, string> | undefined;\n for (const skill of skills) {\n if (!skill.resourceContents || !skill.location) continue;\n for (const [relPath, content] of Object.entries(skill.resourceContents)) {\n files ??= {};\n files[`${skill.location}/${relPath}`] = content;\n }\n }\n return files;\n}\n\n/**\n * Creates an agent session that manages the agent loop: LLM invocation,\n * tool routing, subagent coordination, and lifecycle hooks.\n *\n * When `sandboxOps` is provided the returned session result is guaranteed to\n * include `sandboxId: string`. Without it, `sandboxId` is `undefined`.\n *\n * @param config - Session and agent configuration (merged `SessionConfig` and `AgentConfig`)\n * @returns A session object with `runSession()` to start the agent loop\n *\n * @example\n * ```typescript\n * import { createSession, createAgentStateManager, defineTool, bashTool } from 'zeitlich/workflow';\n * import { proxyGoogleGenAIThreadOps } from 'zeitlich/adapters/thread/google-genai/workflow';\n *\n * const session = await createSession({\n * agentName: \"my-agent\",\n * maxTurns: 20,\n * thread: { mode: \"new\" },\n * threadOps: proxyGoogleGenAIThreadOps(),\n * runAgent: runAgentActivity,\n * buildContextMessage: () => [{ type: \"text\", text: prompt }],\n * subagents: [researcherSubagent],\n * tools: {\n * Bash: defineTool({ ...bashTool, handler: bashHandlerActivity }),\n * },\n * });\n *\n * const { finalMessage, exitReason } = await session.runSession({ stateManager });\n * ```\n */\nexport async function createSession<\n T extends ToolMap,\n M = unknown,\n TContent = string,\n TInit extends SandboxInit | undefined = undefined,\n TShutdown extends SubagentSandboxShutdown | undefined = undefined,\n>(\n config: SessionConfig<T, M, TContent, TInit, TShutdown> & {\n sandboxOps: NonNullable<\n SessionConfig<T, M, TContent, TInit, TShutdown>[\"sandboxOps\"]\n >;\n }\n): Promise<ZeitlichSession<M, true>>;\nexport async function createSession<\n T extends ToolMap,\n M = unknown,\n TContent = string,\n TInit extends SandboxInit | undefined = undefined,\n TShutdown extends SubagentSandboxShutdown | undefined = undefined,\n>(\n config: SessionConfig<T, M, TContent, TInit, TShutdown>\n): Promise<ZeitlichSession<M, false>>;\n// Implementation. The overloads above narrow the public contract per\n// `SessionRequiredCaps<TInit, TShutdown>`. The impl signature uses the\n// `never` cap floor — the structurally-narrowest shape that every\n// adapter (including Daytona/Bedrock) satisfies — so each overload's\n// possibly-narrow `sandboxOps` is assignable here. Gated method calls\n// inside the body go through `wideOps()` below, which casts the\n// narrow-typed binding to the wide shape. This is structurally safe:\n// the runtime gates each gated call on `sandboxMode === …` /\n// `resolvedShutdown === …`, and the type system has already ruled out\n// any (mode, shutdown, adapter) cell that would invoke a missing\n// method.\nexport async function createSession<\n T extends ToolMap,\n M = unknown,\n TContent = string,\n>(\n config: Omit<\n SessionConfig<T, M, TContent, SandboxInit | undefined, undefined>,\n \"sandboxOps\"\n > & {\n sandboxOps?: SandboxOps<SandboxCreateOptions, unknown, never>;\n }\n): Promise<ZeitlichSession<M, boolean>> {\n const {\n agentName,\n maxTurns = 50,\n metadata = {},\n runAgent,\n threadOps,\n buildContextMessage,\n subagents,\n skills,\n tools = {} as T,\n processToolsInParallel = true,\n hooks = {},\n appendSystemPrompt = true,\n threadKey,\n sandboxOps,\n thread: threadInit,\n sandbox: sandboxInit,\n sandboxShutdown,\n onSandboxReady,\n onSessionExit,\n virtualFs: virtualFsConfig,\n virtualFsOps,\n } = config;\n\n /**\n * The narrow-typed `sandboxOps` binding cast to its wide\n * (`SandboxCapability`) form. The overload signatures +\n * `SessionRequiredCaps` SSOT have already ruled out `(sandbox.mode,\n * sandboxShutdown, adapter)` combinations where a referenced method\n * would be missing on the proxy, and each gated call site below is\n * guarded by an `if (sandboxOps)` / `sandboxOps &&` runtime check,\n * so the cast is structurally safe. `wideOps` returns the wide-cap\n * shape; callers use it after their own runtime guard establishes\n * that `sandboxOps` is defined.\n */\n type WideSandboxOps = SandboxOps<\n SandboxCreateOptions,\n unknown,\n SandboxCapability\n >;\n const wideOps = (): WideSandboxOps =>\n sandboxOps as unknown as WideSandboxOps;\n // ---------------------------------------------------------------------------\n // Thread resolution\n // ---------------------------------------------------------------------------\n const threadMode = threadInit?.mode ?? \"new\";\n let threadId: string;\n let sourceThreadId: string | undefined;\n\n switch (threadMode) {\n case \"new\":\n threadId =\n threadInit?.mode === \"new\" && threadInit.threadId\n ? threadInit.threadId\n : getShortId();\n break;\n case \"continue\":\n threadId = (threadInit as { mode: \"continue\"; threadId: string })\n .threadId;\n break;\n case \"fork\":\n sourceThreadId = (threadInit as { mode: \"fork\"; threadId: string })\n .threadId;\n threadId = getShortId();\n break;\n }\n\n const {\n appendToolResult,\n appendHumanMessage,\n initializeThread,\n appendSystemMessage,\n appendAgentMessage,\n forkThread,\n loadThreadState,\n saveThreadState,\n } = threadOps;\n\n const plugins: ToolMap[string][] = [];\n let destroySubagentSandboxes: (() => Promise<void>) | undefined;\n let cleanupSubagentSnapshots: (() => Promise<void>) | undefined;\n\n if (subagents) {\n const result = buildSubagentRegistration(subagents);\n if (result) {\n plugins.push(result.registration);\n destroySubagentSandboxes = result.destroySubagentSandboxes;\n cleanupSubagentSnapshots = result.cleanupSubagentSnapshots;\n }\n }\n if (skills) {\n const reg = buildSkillRegistration(skills);\n if (reg) plugins.push(reg);\n }\n\n const toolRouter = createToolRouter({\n tools,\n appendToolResult,\n threadId,\n threadKey,\n hooks,\n plugins,\n parallel: processToolsInParallel,\n });\n\n const callSessionEnd = async (\n exitReason: SessionExitReason,\n turns: number\n ): Promise<void> => {\n if (hooks.onSessionEnd) {\n await hooks.onSessionEnd({\n threadId,\n agentName,\n exitReason,\n turns,\n metadata,\n });\n }\n };\n\n return {\n runSession: async <TState extends JsonSerializable<TState>>({\n stateManager,\n }: {\n stateManager: AgentStateManager<TState>;\n }) => {\n setHandler(\n defineUpdate<unknown, [TContent]>(`add${agentName}Message`),\n async (message: TContent) => {\n if (hooks.onPreHumanMessageAppend) {\n await hooks.onPreHumanMessageAppend({\n message,\n threadId,\n });\n }\n await appendHumanMessage(threadId, uuid4(), message, threadKey);\n if (hooks.onPostHumanMessageAppend) {\n await hooks.onPostHumanMessageAppend({\n message,\n threadId,\n });\n }\n stateManager.run();\n }\n );\n\n // --- Sandbox lifecycle: create, continue, fork, from-snapshot, or inherit ---\n // Resolve `sandbox` / `sandboxShutdown` defaults through the SSOT\n // so the runtime dispatch below and the type-level\n // `SessionRequiredCaps` cannot disagree on what the documented\n // defaults are. Both surfaces consult `resolveSessionLifecycle`\n // (or its type-level equivalent) before checking individual\n // mode/shutdown values.\n const lifecycle = resolveSessionLifecycle(\n sandboxInit,\n sandboxShutdown\n );\n const sandboxMode: SandboxInit[\"mode\"] | undefined = lifecycle.mode;\n const resolvedShutdown: SubagentSandboxShutdown = lifecycle.shutdown;\n let sandboxId: string | undefined;\n let sandboxOwned = false;\n let baseSnapshot: SandboxSnapshot | undefined;\n let exitSnapshot: SandboxSnapshot | undefined;\n let freshlyCreated = false;\n\n if (sandboxMode === \"inherit\") {\n const inheritInit = sandboxInit as {\n mode: \"inherit\";\n sandboxId: string;\n };\n sandboxId = inheritInit.sandboxId;\n if (!sandboxOps) {\n throw ApplicationFailure.create({\n message:\n \"sandboxId provided but no sandboxOps — cannot manage sandbox lifecycle\",\n nonRetryable: true,\n });\n }\n } else if (sandboxMode === \"continue\") {\n if (!sandboxOps) {\n throw ApplicationFailure.create({\n message: \"No sandboxOps provided — cannot continue sandbox\",\n nonRetryable: true,\n });\n }\n sandboxId = (sandboxInit as { mode: \"continue\"; sandboxId: string })\n .sandboxId;\n if (resolvedShutdown === \"pause-until-parent-close\") {\n await wideOps().resumeSandbox(sandboxId);\n }\n sandboxOwned = true;\n } else if (sandboxMode === \"fork\") {\n if (!sandboxOps) {\n throw ApplicationFailure.create({\n message: \"No sandboxOps provided — cannot fork sandbox\",\n nonRetryable: true,\n });\n }\n const forkInit = sandboxInit as {\n mode: \"fork\";\n sandboxId: string;\n options?: SandboxCreateOptions;\n };\n sandboxId = await wideOps().forkSandbox(\n forkInit.sandboxId,\n forkInit.options\n );\n sandboxOwned = true;\n } else if (sandboxMode === \"from-snapshot\") {\n if (!sandboxOps) {\n throw ApplicationFailure.create({\n message: \"No sandboxOps provided — cannot restore sandbox\",\n nonRetryable: true,\n });\n }\n const restoreInit = sandboxInit as {\n mode: \"from-snapshot\";\n snapshot: SandboxSnapshot;\n options?: SandboxCreateOptions;\n };\n sandboxId = await wideOps().restoreSandbox(\n restoreInit.snapshot,\n restoreInit.options\n );\n sandboxOwned = true;\n } else if (sandboxOps) {\n const skillFiles = skills ? collectSkillFiles(skills) : undefined;\n const ctx = (sandboxInit as { mode: \"new\"; ctx?: unknown } | undefined)\n ?.ctx;\n const createOptions = skillFiles\n ? { initialFiles: skillFiles }\n : undefined;\n const result = await sandboxOps.createSandbox(createOptions, ctx);\n if (result) {\n sandboxId = result.sandboxId;\n sandboxOwned = true;\n freshlyCreated = true;\n }\n }\n\n // Capture a base snapshot immediately after seeding so it can be reused\n // as a template for future runs that want to skip the (potentially\n // expensive) seed step.\n if (\n sandboxId &&\n sandboxOwned &&\n freshlyCreated &&\n resolvedShutdown === \"snapshot\" &&\n sandboxOps\n ) {\n baseSnapshot = await wideOps().snapshotSandbox(sandboxId);\n }\n\n if (sandboxId && sandboxOwned && onSandboxReady) {\n onSandboxReady({\n sandboxId,\n ...(baseSnapshot && { baseSnapshot }),\n });\n }\n\n // --- Virtual filesystem init (independent of sandbox) ----------------\n if (virtualFsConfig) {\n if (!virtualFsOps) {\n throw ApplicationFailure.create({\n message: \"No virtualFsOps provided — cannot resolve file tree\",\n nonRetryable: true,\n });\n }\n const result = await virtualFsOps.resolveFileTree(virtualFsConfig.ctx);\n const skillFiles = skills ? collectSkillFiles(skills) : undefined;\n const fileTree = skillFiles\n ? [\n ...result.fileTree,\n ...Object.entries(skillFiles).map(([path, content]) => ({\n id: `skill:${path}`,\n path,\n size: content.length,\n mtime: new Date().toISOString(),\n metadata: {},\n // Carry the content directly on the entry so any handler that\n // constructs a VirtualFileSystem from `fileTree` can read it\n // without needing to also wire up `inlineFiles` from state.\n inlineContent: content,\n })),\n ]\n : result.fileTree;\n stateManager.mergeUpdate({\n fileTree,\n virtualFsCtx: virtualFsConfig.ctx,\n // `inlineFiles` is still the source of truth at read time:\n // VirtualFileSystem checks the inlineFiles map first and only\n // falls through to entry.inlineContent. Embedding the content on\n // the entry is the migration target so that handlers building a\n // VirtualFileSystem from `fileTree` alone (without forwarding\n // `inlineFiles` from state) can read skill resources. Until a\n // follow-up drops `inlineFiles`, both fields are populated.\n ...(skillFiles && { inlineFiles: skillFiles }),\n } as Partial<AgentState<TState>>);\n }\n\n if (hooks.onSessionStart) {\n await hooks.onSessionStart({\n threadId,\n agentName,\n metadata,\n });\n }\n\n log.info(\"session started\", {\n agentName,\n threadId,\n threadMode,\n maxTurns,\n ...(sandboxId && { sandboxId }),\n });\n\n const sessionStartMs = Date.now();\n const systemPrompt = stateManager.getSystemPrompt();\n\n // --- Thread lifecycle: new, continue, or fork ----------------------\n const rehydrateFromSlice = (slice: PersistedThreadState): void => {\n stateManager.mergeUpdate({\n tasks: new Map(slice.tasks),\n ...slice.custom,\n } as Partial<AgentState<TState>>);\n };\n\n if (threadMode === \"fork\" && sourceThreadId) {\n await forkThread(sourceThreadId, threadId, threadKey);\n const forkedSlice = await loadThreadState(threadId, threadKey);\n if (forkedSlice) rehydrateFromSlice(forkedSlice);\n } else if (threadMode === \"continue\") {\n // \"continue\" — thread already exists, just append the new message\n const continuedSlice = await loadThreadState(threadId, threadKey);\n if (continuedSlice) rehydrateFromSlice(continuedSlice);\n } else {\n if (appendSystemPrompt) {\n if (\n systemPrompt == null ||\n (typeof systemPrompt === \"string\" && systemPrompt.trim() === \"\")\n ) {\n throw ApplicationFailure.create({\n message: \"No system prompt in state\",\n nonRetryable: true,\n });\n }\n await appendSystemMessage(threadId, uuid4(), systemPrompt, threadKey);\n } else {\n await initializeThread(threadId, threadKey);\n }\n }\n await appendHumanMessage(\n threadId,\n uuid4(),\n await buildContextMessage(),\n threadKey\n );\n\n let exitReason: SessionExitReason = \"completed\";\n let finalMessage: M | null = null;\n\n try {\n // Per-turn assistant message id. Pre-generated in the workflow\n // so the runAgent activity can truncate the thread from this id\n // on entry (deterministic rewind + time-travel via Temporal\n // workflow reset). On a rewind retry we keep the same id so the\n // prior attempt's assistant + tool results are wiped by the next\n // runAgent call.\n let assistantId: string | undefined;\n while (\n stateManager.isRunning() &&\n !stateManager.isTerminal() &&\n stateManager.getTurns() < maxTurns\n ) {\n stateManager.incrementTurns();\n const currentTurn = stateManager.getTurns();\n\n log.debug(\"turn started\", { agentName, threadId, turn: currentTurn });\n\n stateManager.setTools(toolRouter.getToolDefinitions());\n\n assistantId ??= uuid4();\n\n const { message, rawToolCalls, usage } = await runAgent({\n threadId,\n threadKey,\n agentName,\n metadata,\n assistantMessageId: assistantId,\n });\n\n await appendAgentMessage(threadId, assistantId, message, threadKey);\n\n if (usage) {\n stateManager.updateUsage(usage);\n }\n\n log.debug(\"model response received\", {\n agentName,\n threadId,\n turn: currentTurn,\n toolCallCount: rawToolCalls.length,\n ...(usage && { usage }),\n });\n\n if (!toolRouter.hasTools() || rawToolCalls.length === 0) {\n stateManager.complete();\n exitReason = \"completed\";\n finalMessage = message;\n break;\n }\n\n const parsedToolCalls: ParsedToolCallUnion<T>[] = [];\n for (const tc of rawToolCalls) {\n try {\n parsedToolCalls.push(toolRouter.parseToolCall(tc));\n } catch (error) {\n await appendToolResult(uuid4(), {\n threadId,\n threadKey,\n toolCallId: tc.id ?? \"\",\n toolName: tc.name,\n content: JSON.stringify({\n error: `Invalid tool call for \"${tc.name}\": ${error instanceof Error ? error.message : String(error)}`,\n }),\n });\n }\n }\n\n const toolCallResults = await toolRouter.processToolCalls(\n parsedToolCalls,\n {\n turn: currentTurn,\n ...(sandboxId !== undefined && { sandboxId }),\n }\n );\n\n for (const result of toolCallResults) {\n if (result.usage) {\n stateManager.updateUsage(result.usage);\n }\n }\n\n const rewind = toolCallResults.rewind;\n if (rewind) {\n log.info(\"rewinding turn\", {\n agentName,\n threadId,\n turn: currentTurn,\n toolCallId: rewind.toolCallId,\n toolName: rewind.toolName,\n });\n // Keep the same assistantId for the retry. The next\n // runAgent call will call truncateFromId(assistantId) on\n // entry, wiping the bad assistant message + any already\n // appended tool results before re-invoking the LLM. The\n // turn counter is intentionally NOT rolled back — each\n // rewind still consumes one of the `maxTurns` budget so a\n // misbehaving tool cannot spin the session forever.\n continue;\n }\n\n // Turn committed: fresh id for the next turn.\n assistantId = undefined;\n }\n\n if (stateManager.getTurns() >= maxTurns && stateManager.isRunning()) {\n exitReason = \"max_turns\";\n log.warn(\"session hit max turns\", {\n agentName,\n threadId,\n maxTurns,\n });\n }\n } catch (error) {\n exitReason = \"failed\";\n log.error(\"session failed\", {\n agentName,\n threadId,\n turns: stateManager.getTurns(),\n durationMs: Date.now() - sessionStartMs,\n error: error instanceof Error ? error.message : String(error),\n });\n throw ApplicationFailure.fromError(error);\n } finally {\n // Persist the task map + custom state slice alongside the thread so\n // a future `continue` / `fork` run can rehydrate it. Runs on every\n // exit path (completed, failed, cancelled, max_turns,\n // waiting_for_input timeout). Best-effort: failures here must not\n // mask the original exit reason / error.\n try {\n await saveThreadState(\n threadId,\n stateManager.getPersistedSlice(),\n threadKey\n );\n } catch (persistError) {\n log.warn(\"failed to persist thread state\", {\n agentName,\n threadId,\n error:\n persistError instanceof Error\n ? persistError.message\n : String(persistError),\n });\n }\n\n await callSessionEnd(exitReason, stateManager.getTurns());\n\n if (sandboxOwned && sandboxId && sandboxOps) {\n switch (resolvedShutdown) {\n case \"destroy\":\n await sandboxOps.destroySandbox(sandboxId);\n break;\n case \"pause\":\n case \"pause-until-parent-close\":\n await wideOps().pauseSandbox(sandboxId);\n break;\n case \"keep\":\n case \"keep-until-parent-close\":\n break;\n case \"snapshot\":\n exitSnapshot = await wideOps().snapshotSandbox(sandboxId);\n await sandboxOps.destroySandbox(sandboxId);\n break;\n }\n }\n\n if (destroySubagentSandboxes) {\n await destroySubagentSandboxes();\n }\n\n if (cleanupSubagentSnapshots) {\n await cleanupSubagentSnapshots();\n }\n }\n\n log.info(\"session ended\", {\n agentName,\n threadId,\n exitReason,\n turns: stateManager.getTurns(),\n durationMs: Date.now() - sessionStartMs,\n usage: stateManager.getTotalUsage(),\n ...(baseSnapshot && { hasBaseSnapshot: true }),\n ...(exitSnapshot && { hasExitSnapshot: true }),\n });\n\n if (onSessionExit) {\n onSessionExit({\n ...(sandboxId && { sandboxId }),\n ...(exitSnapshot && { snapshot: exitSnapshot }),\n threadId,\n usage: stateManager.getTotalUsage(),\n });\n }\n\n return {\n threadId,\n finalMessage,\n exitReason,\n usage: stateManager.getTotalUsage(),\n sandboxId,\n ...(baseSnapshot && { baseSnapshot }),\n ...(exitSnapshot && { snapshot: exitSnapshot }),\n } as Awaited<ReturnType<ZeitlichSession<M, boolean>[\"runSession\"]>>;\n },\n };\n}\n","import type { ThreadInit, SandboxInit, SandboxShutdown } from \"./lifecycle\";\n\n/**\n * Session config fields derived from a main workflow input, ready to spread\n * into `createSession`.\n */\nexport interface WorkflowSessionInput {\n /** Agent name — spread directly into `createSession` */\n agentName: string;\n /** Thread initialization strategy */\n thread?: ThreadInit;\n /** Sandbox initialization strategy */\n sandbox?: SandboxInit;\n /** Sandbox shutdown policy (default: \"destroy\") */\n sandboxShutdown?: SandboxShutdown;\n}\n\n/** Raw workflow input fields that map into `WorkflowSessionInput`. */\nexport interface WorkflowInput {\n /** Thread initialization strategy (default: `{ mode: \"new\" }`) */\n thread?: ThreadInit;\n /** Sandbox initialization strategy */\n sandbox?: SandboxInit;\n}\n\nexport interface WorkflowConfig {\n /** Workflow name — used as the Temporal workflow function name */\n name: string;\n /**\n * Sandbox shutdown policy applied when the main agent session exits.\n *\n * - `\"destroy\"` (default) — destroy the sandbox on exit.\n * - `\"pause\"` — pause the sandbox so it can be resumed later.\n * - `\"keep\"` — leave the sandbox running (no-op on exit).\n */\n sandboxShutdown?: SandboxShutdown;\n}\n\n/**\n * Wraps a main workflow function, translating workflow input fields into\n * session-compatible fields that can be spread directly into `createSession`.\n *\n * The wrapper:\n * - Accepts a `config` with at least a `name` (used for Temporal workflow naming)\n * - Accepts a handler `fn` receiving `(input, sessionInput)`\n * - Derives thread / sandbox init from `workflowInput`\n * - Applies the configured `sandboxShutdown` policy\n */\nexport function defineWorkflow<TInput, TResult>(\n config: WorkflowConfig,\n fn: (input: TInput, sessionInput: WorkflowSessionInput) => Promise<TResult>\n): (input: TInput, workflowInput?: WorkflowInput) => Promise<TResult> {\n const workflow = async (\n input: TInput,\n workflowInput: WorkflowInput = {}\n ): Promise<TResult> => {\n const sessionInput: WorkflowSessionInput = {\n agentName: config.name,\n sandboxShutdown: config.sandboxShutdown ?? \"destroy\",\n ...(workflowInput.thread && { thread: workflowInput.thread }),\n ...(workflowInput.sandbox && { sandbox: workflowInput.sandbox }),\n };\n return fn(input, sessionInput);\n };\n\n Object.defineProperty(workflow, \"name\", { value: config.name });\n\n return workflow;\n}\n","/**\n * Public helpers for zeitlich's Redis thread storage layout.\n *\n * These are the exact string-building primitives zeitlich's internal thread\n * manager uses for every adapter. Downstream consumers that need to read a\n * persisted thread (for evaluation, observability, admin tooling, etc.)\n * should use these helpers rather than reconstructing the key layout by\n * hand — the layout is versioned with this module, so upgrading zeitlich\n * keeps the consumer in sync.\n *\n * The layout is adapter-agnostic: every thread adapter stores messages the\n * same way.\n *\n * @example\n * ```typescript\n * import {\n * getThreadListKey,\n * getThreadMetaKey,\n * THREAD_TTL_SECONDS,\n * } from 'zeitlich';\n *\n * const listKey = getThreadListKey('messages', threadId);\n * const metaKey = getThreadMetaKey('messages', threadId);\n * const ttl = await redis.ttl(listKey); // <= THREAD_TTL_SECONDS\n * ```\n */\n\n/**\n * TTL (in seconds) applied to every thread list and thread meta key that\n * zeitlich's {@link createThreadManager} writes. Exposed so downstream\n * consumers can size their Redis retention / query windows to match.\n *\n * Current value: 90 days.\n */\nexport const THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;\n\n/**\n * Build the Redis list key that holds a thread's serialized messages.\n *\n * Mirrors the exact key used internally by zeitlich's thread manager,\n * so a consumer calling `redis.lrange(getThreadListKey(key, id), 0, -1)`\n * sees the same data the writer wrote.\n *\n * @param threadKey - Thread key (defaults to `\"messages\"` inside the\n * thread manager, but downstream adapters may pass\n * their own value).\n * @param threadId - Thread id as provided to the thread manager.\n */\nexport function getThreadListKey(\n threadKey: string,\n threadId: string\n): string {\n return `${threadKey}:thread:${threadId}`;\n}\n\n/**\n * Build the Redis key that stores a thread's existence marker / metadata.\n *\n * Zeitlich treats the presence of this key as \"thread has been\n * initialized\"; append/load/fork/truncate operations fail when it is\n * missing. Consumers can use it as a cheap existence probe without\n * scanning the message list.\n *\n * @param threadKey - Thread key (defaults to `\"messages\"` inside the\n * thread manager, but downstream adapters may pass\n * their own value).\n * @param threadId - Thread id as provided to the thread manager.\n */\nexport function getThreadMetaKey(\n threadKey: string,\n threadId: string\n): string {\n return `${threadKey}:meta:thread:${threadId}`;\n}\n\n/**\n * Build the Redis key that stores a thread's persisted state slice\n * (tasks + custom state) written by zeitlich's session loop on every\n * exit path.\n *\n * Consumers can read this key with `redis.get(getThreadStateKey(key, id))`\n * and `JSON.parse` the result into a {@link PersistedThreadState}.\n *\n * @param threadKey - Thread key (defaults to `\"messages\"` inside the\n * thread manager, but downstream adapters may pass\n * their own value).\n * @param threadId - Thread id as provided to the thread manager.\n */\nexport function getThreadStateKey(\n threadKey: string,\n threadId: string\n): string {\n return `${threadKey}:state:thread:${threadId}`;\n}\n","import type { JsonValue } from \"./state/types\";\nimport type { FileEntry } from \"./virtual-fs/types\";\n\n// ============================================================================\n// Agent core types\n// ============================================================================\n\n/**\n * Agent execution status\n */\nexport type AgentStatus =\n | \"RUNNING\"\n | \"WAITING_FOR_INPUT\"\n | \"COMPLETED\"\n | \"FAILED\"\n | \"CANCELLED\";\n\n/**\n * Base state that all agents must have\n */\nexport interface BaseAgentState {\n tools: SerializableToolDefinition[];\n status: AgentStatus;\n version: number;\n turns: number;\n tasks: Map<string, WorkflowTask>;\n fileTree: FileEntry[];\n /** In-memory file contents keyed by path, bypassing the resolver (e.g. skill resources). */\n inlineFiles?: Record<string, string>;\n virtualFsCtx?: unknown;\n systemPrompt?: unknown;\n totalInputTokens: number;\n totalOutputTokens: number;\n cachedWriteTokens: number;\n cachedReadTokens: number;\n}\n\n/**\n * File representation for agent workflows\n */\nexport interface AgentFile {\n /** Database/S3 file ID */\n id: string;\n /** Virtual path for agent (e.g., \"evidence/invoice.pdf\") */\n path: string;\n /** Original filename */\n filename: string;\n /** Generic description for prompt */\n description?: string;\n /** MIME type of the file */\n mimeType?: string;\n}\n\nexport interface TokenUsage {\n inputTokens?: number;\n outputTokens?: number;\n cachedWriteTokens?: number;\n cachedReadTokens?: number;\n reasonTokens?: number;\n}\n\n/**\n * Configuration for a Zeitlich agent\n */\nexport interface AgentConfig {\n /** The name of the agent, should be unique within the workflows, ideally Pascal Case */\n agentName: string;\n /** Description, used for sub agents */\n description?: string;\n}\n\n/**\n * A JSON-serializable tool definition for state storage.\n * Uses a plain JSON Schema object instead of a live Zod instance,\n * so it survives Temporal serialization without losing constraints (min, max, etc.).\n */\nexport interface SerializableToolDefinition {\n name: string;\n description: string;\n schema: Record<string, unknown>;\n strict?: boolean;\n max_uses?: number;\n}\n\n/**\n * Configuration passed to runAgent activity\n */\nexport interface RunAgentConfig extends AgentConfig {\n /** The thread ID to use for the session */\n threadId: string;\n /** Redis key suffix for thread storage. Defaults to 'messages'. */\n threadKey?: string;\n /** Metadata for the session */\n metadata?: Record<string, unknown>;\n /**\n * The id under which the assistant message produced by this call will\n * be appended. The activity truncates the thread from this id on\n * entry (no-op on the first attempt) so that:\n *\n * - Rewind retries can reuse the same id and the previous (bad)\n * assistant + its tool results are wiped before the retry LLM call.\n * - Resetting the Temporal workflow to this activity restores the\n * pre-call thread state: replay re-truncates, re-invokes, and\n * appends under the same id.\n */\n assistantMessageId: string;\n}\n\n/**\n * Configuration for appending a tool result\n */\nexport interface ToolResultConfig {\n threadId: string;\n /** Redis key suffix for thread storage. Defaults to 'messages'. */\n threadKey?: string;\n toolCallId: string;\n /** The name of the tool that produced this result */\n toolName: string;\n /** Content for the tool result — string, object, or array. The adapter converts to its SDK-native format. */\n content: JsonValue;\n}\n\n// ============================================================================\n// Workflow Tasks\n// ============================================================================\n\n/**\n * Status of a workflow task\n */\nexport type TaskStatus = \"pending\" | \"in_progress\" | \"completed\";\n\n/**\n * A task managed within a workflow for tracking work items\n */\nexport interface WorkflowTask {\n /** Unique task identifier */\n id: string;\n /** Brief, actionable title in imperative form */\n subject: string;\n /** Detailed description of what needs to be done */\n description: string;\n /** Present continuous form shown in spinner when in_progress */\n activeForm: string;\n /** Current status of the task */\n status: TaskStatus;\n /** Arbitrary key-value pairs for tracking */\n metadata: Record<string, string>;\n /** IDs of tasks that must complete before this one can start */\n blockedBy: string[];\n /** IDs of tasks that are waiting for this one to complete */\n blocks: string[];\n}\n\n// ============================================================================\n// Session exit\n// ============================================================================\n\n/**\n * Exit reasons for session termination\n */\nexport type SessionExitReason =\n | \"completed\"\n | \"max_turns\"\n | \"waiting_for_input\"\n | \"failed\"\n | \"cancelled\";\n\n/**\n * Helper to check if status is terminal\n */\nexport function isTerminalStatus(status: AgentStatus): boolean {\n return (\n status === \"COMPLETED\" || status === \"FAILED\" || status === \"CANCELLED\"\n );\n}\n","import {\n condition,\n defineQuery,\n defineUpdate,\n setHandler,\n} from \"@temporalio/workflow\";\nimport {\n type AgentStatus,\n type BaseAgentState,\n type WorkflowTask,\n isTerminalStatus,\n} from \"../types\";\nimport type { ToolDefinition } from \"../tool-router/types\";\nimport type {\n AgentState,\n AgentStateManager,\n JsonSerializable,\n JsonValue,\n PersistedThreadState,\n} from \"./types\";\nimport { z } from \"zod\";\n\n/**\n * Creates an agent state manager for tracking workflow state.\n * Automatically registers Temporal query and update handlers for the agent.\n *\n * @param options.agentName - Unique agent name, used to derive query/update handler names\n * @param options.initialState - Optional initial values for base and custom state.\n * Use `systemPrompt` here to set the agent's system prompt.\n * Base state defaults: status=\"RUNNING\", version=0, turns=0, tasks=empty\n *\n * @example\n * ```typescript\n * const stateManager = createAgentStateManager({\n * initialState: {\n * systemPrompt: \"You are a helpful assistant.\",\n * },\n * agentName: \"my-agent\",\n * });\n *\n * // With custom state fields\n * const stateManager = createAgentStateManager({\n * initialState: {\n * systemPrompt: agentConfig.systemPrompt,\n * customField: \"value\",\n * },\n * agentName: agentConfig.agentName,\n * });\n * ```\n */\nexport function createAgentStateManager<\n TCustom extends JsonSerializable<TCustom> = Record<string, never>,\n>({\n initialState,\n}: {\n initialState?: Partial<BaseAgentState> & TCustom;\n}): AgentStateManager<TCustom> {\n let status: AgentStatus = initialState?.status ?? \"RUNNING\";\n let version = initialState?.version ?? 0;\n let turns = initialState?.turns ?? 0;\n let tools = initialState?.tools ?? [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalCachedWriteTokens = 0;\n let totalCachedReadTokens = 0;\n let totalReasonTokens = 0;\n let systemPrompt = initialState?.systemPrompt;\n\n const tasks = new Map<string, WorkflowTask>(initialState?.tasks);\n\n const {\n status: _status,\n version: _version,\n turns: _turns,\n tasks: _tasks,\n tools: _tools,\n systemPrompt: _systemPrompt,\n fileTree: _fileTree,\n inlineFiles: _inlineFiles,\n virtualFsCtx: _virtualFsCtx,\n totalInputTokens: _totalInputTokens,\n totalOutputTokens: _totalOutputTokens,\n cachedWriteTokens: _cachedWriteTokens,\n cachedReadTokens: _cachedReadTokens,\n ...custom\n } = initialState ?? {};\n const customState = custom as TCustom;\n\n function buildState(): AgentState<TCustom> {\n return {\n status,\n version,\n turns,\n tools,\n ...customState,\n } as AgentState<TCustom>;\n }\n\n const stateQuery = defineQuery<AgentState<TCustom>>(\"getAgentState\");\n const stateChangeUpdate = defineUpdate<AgentState<TCustom>, [number]>(\n \"waitForAgentStateChange\"\n );\n\n setHandler(stateQuery, () => buildState());\n setHandler(stateChangeUpdate, async (lastKnownVersion: number) => {\n await condition(\n () => version > lastKnownVersion || isTerminalStatus(status),\n \"55s\"\n );\n return buildState();\n });\n\n return {\n stateQuery,\n stateChangeUpdate,\n\n getStatus(): AgentStatus {\n return status;\n },\n\n isRunning(): boolean {\n return status === \"RUNNING\";\n },\n\n getSystemPrompt(): unknown {\n return systemPrompt;\n },\n\n isTerminal(): boolean {\n return isTerminalStatus(status);\n },\n\n getTurns(): number {\n return turns;\n },\n\n getVersion(): number {\n return version;\n },\n\n run(): void {\n status = \"RUNNING\";\n version++;\n },\n\n waitForInput(): void {\n status = \"WAITING_FOR_INPUT\";\n version++;\n },\n\n complete(): void {\n status = \"COMPLETED\";\n version++;\n },\n\n fail(): void {\n status = \"FAILED\";\n version++;\n },\n\n cancel(): void {\n status = \"CANCELLED\";\n version++;\n },\n\n incrementVersion(): void {\n version++;\n },\n\n incrementTurns(): void {\n turns++;\n },\n\n get<K extends keyof TCustom>(key: K): TCustom[K] {\n return customState[key];\n },\n\n set<K extends keyof TCustom>(key: K, value: TCustom[K]): void {\n customState[key] = value;\n version++;\n },\n\n mergeUpdate(update: Partial<AgentState<TCustom>>): void {\n const { tasks: nextTasks, ...rest } = update as Partial<\n AgentState<TCustom>\n > & { tasks?: Map<string, WorkflowTask> };\n if (nextTasks) {\n tasks.clear();\n for (const [id, task] of nextTasks) {\n tasks.set(id, task);\n }\n }\n Object.assign(customState as object, rest);\n version++;\n },\n\n getCurrentState(): AgentState<TCustom> {\n return buildState();\n },\n\n shouldReturnFromWait(lastKnownVersion: number): boolean {\n return version > lastKnownVersion || isTerminalStatus(status);\n },\n\n getTasks(): WorkflowTask[] {\n return Array.from(tasks.values());\n },\n\n getTask(id: string): WorkflowTask | undefined {\n return tasks.get(id);\n },\n\n setTask(task: WorkflowTask): void {\n tasks.set(task.id, task);\n version++;\n },\n\n setTools(newTools: ToolDefinition[]): void {\n tools = newTools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n schema: z.toJSONSchema(tool.schema) as Record<string, unknown>,\n strict: tool.strict,\n max_uses: tool.max_uses,\n }));\n },\n\n setSystemPrompt(newSystemPrompt: unknown): void {\n systemPrompt = newSystemPrompt;\n },\n\n deleteTask(id: string): boolean {\n const deleted = tasks.delete(id);\n if (deleted) {\n version++;\n }\n return deleted;\n },\n\n getPersistedSlice(): PersistedThreadState {\n return {\n tasks: Array.from(tasks.entries()),\n custom: { ...(customState as unknown as Record<string, JsonValue>) },\n };\n },\n\n updateUsage(usage: {\n inputTokens?: number;\n outputTokens?: number;\n cachedWriteTokens?: number;\n cachedReadTokens?: number;\n reasonTokens?: number;\n }): void {\n totalInputTokens += usage.inputTokens ?? 0;\n totalOutputTokens += usage.outputTokens ?? 0;\n totalCachedWriteTokens += usage.cachedWriteTokens ?? 0;\n totalCachedReadTokens += usage.cachedReadTokens ?? 0;\n totalReasonTokens += usage.reasonTokens ?? 0;\n },\n\n getTotalUsage(): {\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCachedWriteTokens: number;\n totalCachedReadTokens: number;\n totalReasonTokens: number;\n turns: number;\n } {\n return {\n totalInputTokens,\n totalOutputTokens,\n totalCachedWriteTokens,\n totalCachedReadTokens,\n totalReasonTokens,\n turns,\n };\n },\n };\n}\n","// ============================================================================\n// Sandbox Filesystem\n// ============================================================================\n\nexport interface DirentEntry {\n name: string;\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n}\n\nexport interface FileStat {\n isFile: boolean;\n isDirectory: boolean;\n isSymbolicLink: boolean;\n size: number;\n mtime: Date;\n}\n\n// ============================================================================\n// Network & lifecycle\n// ============================================================================\n\nexport interface SandboxNetworkConfig {\n allowOut?: string[];\n denyOut?: string[];\n allowPublicTraffic?: boolean;\n}\n\nexport interface SandboxLifecycleConfig {\n onTimeout: \"kill\" | \"pause\";\n autoResume?: boolean;\n}\n\n/**\n * Provider-agnostic filesystem interface.\n *\n * Implementations that don't support a method should throw\n * {@link SandboxNotSupportedError}.\n */\nexport interface SandboxFileSystem {\n /** Base directory used when resolving relative paths. */\n readonly workspaceBase: string;\n readFile(path: string): Promise<string>;\n readFileBuffer(path: string): Promise<Uint8Array>;\n writeFile(path: string, content: string | Uint8Array): Promise<void>;\n appendFile(path: string, content: string | Uint8Array): Promise<void>;\n exists(path: string): Promise<boolean>;\n stat(path: string): Promise<FileStat>;\n mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;\n readdir(path: string): Promise<string[]>;\n readdirWithFileTypes(path: string): Promise<DirentEntry[]>;\n rm(\n path: string,\n options?: { recursive?: boolean; force?: boolean }\n ): Promise<void>;\n cp(\n src: string,\n dest: string,\n options?: { recursive?: boolean }\n ): Promise<void>;\n mv(src: string, dest: string): Promise<void>;\n readlink(path: string): Promise<string>;\n resolvePath(base: string, path: string): string;\n}\n\n// ============================================================================\n// Execution\n// ============================================================================\n\nexport interface ExecOptions {\n timeout?: number;\n cwd?: string;\n env?: Record<string, string>;\n}\n\nexport interface ExecResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\n// ============================================================================\n// Capabilities\n// ============================================================================\n\n/**\n * Runtime capability flags carried by a {@link Sandbox} instance.\n *\n * These are an orthogonal mechanism to the type-level\n * {@link SandboxCapability} union: this flag bag is for runtime\n * introspection (\"does the sandbox support a filesystem?\") whereas\n * {@link SandboxCapability} narrows the type-level provider/ops contract.\n */\nexport interface SandboxCapabilities {\n /** Sandbox supports filesystem operations */\n filesystem: boolean;\n /** Sandbox supports shell/command execution */\n execution: boolean;\n /** Sandbox state can be persisted and restored */\n persistence: boolean;\n}\n\n/**\n * Type-level capability vocabulary for {@link SandboxProvider} and\n * {@link SandboxOps}. Adapters declare the subset they actually support; the\n * conditional types on each contract gate the corresponding methods so\n * unsupported calls become a compile-time error rather than a runtime\n * {@link SandboxNotSupportedError}.\n *\n * `pause` and `resume` are split because some adapters might support one\n * direction without the other. The `snapshot` cap covers both `snapshot()`\n * and `deleteSnapshot()` since they always travel together in practice.\n */\nexport type SandboxCapability =\n | \"pause\"\n | \"resume\"\n | \"snapshot\"\n | \"restore\"\n | \"fork\";\n\n// ============================================================================\n// Sandbox\n// ============================================================================\n\nexport interface Sandbox {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n readonly fs: SandboxFileSystem;\n\n exec(command: string, options?: ExecOptions): Promise<ExecResult>;\n destroy(): Promise<void>;\n}\n\n// ============================================================================\n// Snapshots\n// ============================================================================\n\nexport interface SandboxSnapshot {\n sandboxId: string;\n providerId: string;\n /** Provider-specific serialised state */\n data: unknown;\n createdAt: string;\n}\n\n// ============================================================================\n// Provider\n// ============================================================================\n\nexport interface SandboxCreateOptions {\n /** Preferred sandbox ID (provider may ignore) */\n id?: string;\n /** Seed the filesystem with these files */\n initialFiles?: Record<string, string | Uint8Array>;\n /** Environment variables available inside the sandbox */\n env?: Record<string, string>;\n /** Key-value metadata surfaced via provider list/query APIs */\n metadata?: Record<string, string>;\n /** Sandbox idle timeout in milliseconds */\n timeoutMs?: number;\n /** Enable or disable outbound internet access */\n allowInternetAccess?: boolean;\n /** Outbound network allow/deny rules */\n network?: SandboxNetworkConfig;\n /** Sandbox timeout behaviour */\n lifecycle?: SandboxLifecycleConfig;\n}\n\nexport interface SandboxCreateResult {\n sandbox: Sandbox;\n}\n\n/**\n * Internal helper: drop keys whose value is `never` from an object type.\n *\n * Used by the capability-gated contracts below so that an absent capability\n * removes the corresponding key entirely, instead of leaving a required\n * field with type `never` (which would make implementations impossible).\n */\ntype OmitNever<T> = {\n [K in keyof T as [T[K]] extends [never] ? never : K]: T[K];\n};\n\n/**\n * Capability-gated provider lifecycle methods.\n *\n * Each field becomes `never` when its capability is absent from `TCaps`;\n * the wrapping `OmitNever` removes those keys entirely, so the method\n * isn't part of the type surface for adapters that don't support it.\n */\ntype SandboxProviderCapMethods<\n TOptions extends SandboxCreateOptions,\n TSandbox extends Sandbox,\n TCaps extends SandboxCapability,\n> = OmitNever<{\n pause: \"pause\" extends TCaps\n ? (sandboxId: string, ttlSeconds?: number) => Promise<void>\n : never;\n resume: \"resume\" extends TCaps ? (sandboxId: string) => Promise<void> : never;\n snapshot: \"snapshot\" extends TCaps\n ? (sandboxId: string, options?: TOptions) => Promise<SandboxSnapshot>\n : never;\n deleteSnapshot: \"snapshot\" extends TCaps\n ? (snapshot: SandboxSnapshot) => Promise<void>\n : never;\n restore: \"restore\" extends TCaps\n ? (snapshot: SandboxSnapshot, options?: TOptions) => Promise<TSandbox>\n : never;\n fork: \"fork\" extends TCaps\n ? (sandboxId: string, options?: TOptions) => Promise<TSandbox>\n : never;\n}>;\n\n/**\n * Always-present provider lifecycle methods. These do not depend on the\n * capability set and are required by every adapter.\n */\ninterface SandboxProviderBase<\n TOptions extends SandboxCreateOptions,\n TSandbox extends Sandbox,\n TCaps extends SandboxCapability,\n> {\n readonly id: string;\n readonly capabilities: SandboxCapabilities;\n /**\n * Runtime-introspectable list of supported capabilities.\n *\n * Constrained to `ReadonlySet<TCaps & SandboxCapability>` so the runtime\n * set cannot include capabilities not declared at the type level — a\n * provider typed as `SandboxProvider<…, never>` cannot ship a runtime\n * set that contains `\"pause\"`, etc.\n *\n * The other direction (type declares a cap, runtime set omits it)\n * cannot be enforced by TypeScript alone; adapters should derive both\n * `TCaps` and the runtime set from the same `as const` array (see\n * `SandboxManager`'s constructor-time consistency check) so the two\n * surfaces cannot drift.\n */\n readonly supportedCapabilities: ReadonlySet<TCaps & SandboxCapability>;\n\n create(options?: TOptions): Promise<SandboxCreateResult>;\n get(sandboxId: string): Promise<TSandbox>;\n destroy(sandboxId: string): Promise<void>;\n}\n\n/**\n * Provider-side sandbox lifecycle contract.\n *\n * Generic over an optional capability set (`TCaps`). Each capability gates\n * a specific method: when the cap is absent the corresponding key is\n * **removed** from the type entirely, so calling it produces a TypeScript\n * error at the call site instead of a runtime\n * {@link SandboxNotSupportedError}.\n *\n * The default `TCaps = SandboxCapability` resolves to the full union, so\n * existing usages that only pass `TOptions` / `TSandbox` continue to see\n * the full method surface (backwards compatible).\n *\n * Adapters that don't support a method should narrow `TCaps` accordingly:\n *\n * - In-memory / E2B: `SandboxCapability` (default — all caps present).\n * - Bedrock Code Interpreter / Daytona: `never` (only base ops).\n * - Bedrock AgentCore Runtime: `\"pause\" | \"resume\"`.\n */\nexport type SandboxProvider<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TSandbox extends Sandbox = Sandbox,\n TCaps extends SandboxCapability = SandboxCapability,\n> = SandboxProviderBase<TOptions, TSandbox, TCaps> &\n SandboxProviderCapMethods<TOptions, TSandbox, TCaps>;\n\n// ============================================================================\n// SandboxOps — workflow-side activity interface (like ThreadOps)\n// ============================================================================\n\n/**\n * Capability-gated workflow-side methods. Mirrors the provider's gating:\n * keys whose capability is absent from `TCaps` are removed from the type.\n */\ntype SandboxOpsCapMethods<\n TOptions extends SandboxCreateOptions,\n TCaps extends SandboxCapability,\n> = OmitNever<{\n pauseSandbox: \"pause\" extends TCaps\n ? (sandboxId: string) => Promise<void>\n : never;\n resumeSandbox: \"resume\" extends TCaps\n ? (sandboxId: string) => Promise<void>\n : never;\n snapshotSandbox: \"snapshot\" extends TCaps\n ? (sandboxId: string, options?: TOptions) => Promise<SandboxSnapshot>\n : never;\n deleteSandboxSnapshot: \"snapshot\" extends TCaps\n ? (snapshot: SandboxSnapshot) => Promise<void>\n : never;\n restoreSandbox: \"restore\" extends TCaps\n ? (snapshot: SandboxSnapshot, options?: TOptions) => Promise<string>\n : never;\n forkSandbox: \"fork\" extends TCaps\n ? (sandboxId: string, options?: TOptions) => Promise<string>\n : never;\n}>;\n\n/**\n * Always-present workflow-side lifecycle methods.\n */\ninterface SandboxOpsBase<\n TOptions extends SandboxCreateOptions,\n TCtx,\n> {\n createSandbox(\n options?: TOptions,\n ctx?: TCtx\n ): Promise<{ sandboxId: string } | null>;\n destroySandbox(sandboxId: string): Promise<void>;\n}\n\n/**\n * Workflow-side counterpart to {@link SandboxProvider}. Exposed as a set of\n * Temporal activities and consumed by `createSession`'s `sandboxOps` field\n * and by `defineSubagent`'s `sandbox.proxy`.\n *\n * Generic over a capability set (`TCaps`) — same semantics as the provider:\n * keys whose capability is absent are removed from the type, so calling\n * them is a TypeScript error rather than a runtime throw. The default\n * `TCaps = SandboxCapability` keeps the full method surface for existing\n * consumers.\n */\nexport type SandboxOps<\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TCtx = unknown,\n TCaps extends SandboxCapability = SandboxCapability,\n> = SandboxOpsBase<TOptions, TCtx> & SandboxOpsCapMethods<TOptions, TCaps>;\n\n/**\n * Maps generic {@link SandboxOps} method names to adapter-prefixed names.\n *\n * Inherits the capability gating from {@link SandboxOps}: when `TCaps` omits\n * a capability the prefixed key carries the `never` type so call sites are\n * type-protected.\n *\n * @example\n * ```typescript\n * type InMemOps = PrefixedSandboxOps<\"inMemory\">;\n * // → { inMemoryCreateSandbox, inMemoryDestroySandbox, inMemorySnapshotSandbox, … }\n * ```\n */\nexport type PrefixedSandboxOps<\n TPrefix extends string,\n TOptions extends SandboxCreateOptions = SandboxCreateOptions,\n TCtx = unknown,\n TCaps extends SandboxCapability = SandboxCapability,\n> = {\n [K in keyof SandboxOps<\n TOptions,\n TCtx,\n TCaps\n > as `${TPrefix}${Capitalize<K & string>}`]: SandboxOps<\n TOptions,\n TCtx,\n TCaps\n >[K];\n};\n\n// ============================================================================\n// Errors\n// ============================================================================\n\nimport { ApplicationFailure } from \"@temporalio/common\";\n\n/**\n * Thrown by adapters that still surface an unsupported method at runtime.\n *\n * After the capability-generic refactor most adapters drop their\n * unsupported methods entirely so the type system rejects them at call\n * sites. This symbol is still exported so consumers running against older\n * adapter versions can keep their backwards-compatible error-handling\n * paths until they finish migrating.\n */\nexport class SandboxNotSupportedError extends ApplicationFailure {\n constructor(operation: string) {\n super(\n `Sandbox does not support: ${operation}`,\n \"SandboxNotSupportedError\",\n true\n );\n }\n}\n\nexport class SandboxNotFoundError extends ApplicationFailure {\n constructor(sandboxId: string) {\n super(`Sandbox not found: ${sandboxId}`, \"SandboxNotFoundError\", true);\n }\n}\n","import type { z } from \"zod\";\nimport type {\n SubagentConfig,\n SubagentDefinition,\n SubagentHooks,\n SubagentSandboxConfig,\n SubagentWorkflow,\n} from \"./types\";\nimport type { SubagentArgs } from \"./tool\";\n\n/**\n * Creates a `SubagentConfig` from a `SubagentDefinition` (returned by `defineSubagentWorkflow`).\n * Metadata (name, description, resultSchema) is read from the definition — only configure\n * what's specific to this usage in the parent workflow.\n *\n * @example\n * ```ts\n * // Minimal — all metadata comes from the definition\n * export const researcher = defineSubagent(researcherWorkflow);\n *\n * // With parent-specific overrides\n * export const researcher = defineSubagent(researcherWorkflow, {\n * thread: \"fork\",\n * sandbox: { source: \"own\", continuation: \"fork\", shutdown: \"pause\" },\n * hooks: {\n * onPostExecution: ({ result }) => console.log(result),\n * },\n * });\n *\n * // With typed context\n * export const researcher = defineSubagent(researcherWorkflow, {\n * context: { apiKey: \"...\" },\n * });\n * ```\n */\nexport function defineSubagent<\n TResult extends z.ZodType = z.ZodType,\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n definition: SubagentDefinition<TResult, TContext>,\n overrides?: {\n context?: TContext | (() => TContext);\n hooks?: SubagentHooks<SubagentArgs, z.infer<TResult>>;\n enabled?: boolean | (() => boolean);\n taskQueue?: string;\n thread?: \"new\" | \"fork\" | \"continue\";\n sandbox?: SubagentSandboxConfig;\n }\n): SubagentConfig<TResult> {\n return {\n agentName: definition.agentName,\n description: definition.description,\n workflow: definition as SubagentWorkflow<TResult>,\n ...(definition.resultSchema !== undefined && {\n resultSchema: definition.resultSchema,\n }),\n ...overrides,\n } as SubagentConfig<TResult>;\n}\n","import type { z } from \"zod\";\nimport {\n workflowInfo,\n getExternalWorkflowHandle,\n ApplicationFailure,\n} from \"@temporalio/workflow\";\nimport type {\n SubagentDefinition,\n SubagentFnResult,\n SubagentHandlerResponse,\n SubagentWorkflowInput,\n SubagentSessionInput,\n} from \"./types\";\nimport type { SubagentSandboxShutdown } from \"../lifecycle\";\nimport type { SandboxSnapshot } from \"../sandbox/types\";\nimport type { TokenUsage } from \"../types\";\nimport { childSandboxReadySignal } from \"./signals\";\n\n/**\n * Defines a subagent workflow with embedded metadata (name, description, resultSchema).\n * The returned value can be passed directly to `defineSubagent` — no need to repeat\n * the name, description, or resultSchema in the parent workflow.\n *\n * Internally maps `SubagentWorkflowInput` fields to session-compatible `SubagentSessionInput`.\n *\n * @example\n * ```ts\n * import {\n * defineSubagentWorkflow,\n * defineSubagent,\n * createSession,\n * createAgentStateManager,\n * } from 'zeitlich/workflow';\n *\n * // Define once — carries name, description, resultSchema\n * export const researcherWorkflow = defineSubagentWorkflow(\n * {\n * name: \"researcher\",\n * description: \"Researches topics on the web\",\n * resultSchema: z.object({ findings: z.string() }),\n * },\n * async (prompt, sessionInput) => {\n * const stateManager = createAgentStateManager({\n * initialState: { systemPrompt: \"You are a researcher.\" },\n * });\n *\n * const session = await createSession({\n * ...sessionInput,\n * agentName: \"researcher\",\n * runAgent: runAgentActivity,\n * buildContextMessage: () => [{ type: \"text\", text: prompt }],\n * });\n *\n * const { finalMessage, threadId } = await session.runSession({ stateManager });\n * // `sandboxId`, `snapshot`, and `baseSnapshot` are auto-forwarded\n * // from the session — no need to thread them through manually.\n * return { toolResponse: finalMessage ?? \"No response\", data: null, threadId };\n * },\n * );\n *\n * // Use in parent — only configure what's parent-specific\n * export const researcher = defineSubagent(researcherWorkflow, {\n * hooks: { onPostExecution: ({ result }) => console.log(result) },\n * });\n * ```\n */\n// Without resultSchema — data is null\nexport function defineSubagentWorkflow<\n TSandboxShutdown extends SubagentSandboxShutdown = \"destroy\",\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n config: {\n name: string;\n description: string;\n sandboxShutdown?: TSandboxShutdown;\n },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: TContext\n ) => Promise<SubagentFnResult<null, TSandboxShutdown>>\n): SubagentDefinition<z.ZodNull, TContext>;\n// With resultSchema — data is inferred from the schema\nexport function defineSubagentWorkflow<\n TResult extends z.ZodType,\n TSandboxShutdown extends SubagentSandboxShutdown = \"destroy\",\n TContext extends Record<string, unknown> = Record<string, unknown>,\n>(\n config: {\n name: string;\n description: string;\n resultSchema: TResult;\n sandboxShutdown?: TSandboxShutdown;\n },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: TContext\n ) => Promise<SubagentFnResult<z.infer<TResult> | null, TSandboxShutdown>>\n): SubagentDefinition<TResult, TContext>;\nexport function defineSubagentWorkflow(\n config: {\n name: string;\n description: string;\n resultSchema?: z.ZodType;\n sandboxShutdown?: SubagentSandboxShutdown;\n },\n fn: (\n prompt: string,\n sessionInput: SubagentSessionInput,\n context: Record<string, unknown>\n ) => Promise<SubagentFnResult<unknown>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): SubagentDefinition<any, any> {\n const workflow = async (\n prompt: string,\n workflowInput: SubagentWorkflowInput,\n context?: Record<string, unknown>\n ): Promise<SubagentHandlerResponse<unknown>> => {\n const effectiveShutdown =\n workflowInput.sandboxShutdown ?? config.sandboxShutdown ?? \"destroy\";\n\n const { parent } = workflowInfo();\n if (!parent) {\n throw ApplicationFailure.create({\n message: \"Subagent workflow called without a parent workflow\",\n nonRetryable: true,\n });\n }\n const parentHandle = getExternalWorkflowHandle(parent.workflowId);\n\n let capturedSandboxId: string | undefined;\n let capturedSnapshot: SandboxSnapshot | undefined;\n let capturedBaseSnapshot: SandboxSnapshot | undefined;\n let capturedThreadId: string | undefined;\n let capturedUsage: TokenUsage | undefined;\n const sessionInput: SubagentSessionInput = {\n agentName: config.name,\n sandboxShutdown: effectiveShutdown,\n ...(workflowInput.thread && { thread: workflowInput.thread }),\n ...(workflowInput.sandbox && { sandbox: workflowInput.sandbox }),\n onSandboxReady: ({ sandboxId, baseSnapshot }) => {\n capturedBaseSnapshot = baseSnapshot;\n const isReuse = workflowInput.sandbox?.mode === \"continue\";\n if (!isReuse) {\n void parentHandle.signal(childSandboxReadySignal, {\n childWorkflowId: workflowInfo().workflowId,\n sandboxId,\n ...(baseSnapshot && { baseSnapshot }),\n });\n }\n },\n onSessionExit: ({ sandboxId, snapshot, threadId, usage }) => {\n capturedSandboxId = sandboxId;\n capturedSnapshot = snapshot;\n capturedThreadId = threadId;\n capturedUsage = {\n inputTokens: usage.totalInputTokens,\n outputTokens: usage.totalOutputTokens,\n cachedWriteTokens: usage.totalCachedWriteTokens,\n cachedReadTokens: usage.totalCachedReadTokens,\n reasonTokens: usage.totalReasonTokens,\n };\n },\n };\n\n const result = await fn(prompt, sessionInput, context ?? {});\n\n // Auto-forward sandbox outputs captured from the session so user code\n // never has to thread them through manually. Explicit values on the fn\n // result take precedence.\n return {\n ...result,\n ...(capturedThreadId !== undefined && { threadId: capturedThreadId }),\n ...(capturedSandboxId !== undefined && { sandboxId: capturedSandboxId }),\n ...(capturedSnapshot !== undefined && { snapshot: capturedSnapshot }),\n ...(capturedBaseSnapshot !== undefined && {\n baseSnapshot: capturedBaseSnapshot,\n }),\n ...(capturedUsage !== undefined && { usage: capturedUsage }),\n };\n };\n\n // for temporal workflow name\n Object.defineProperty(workflow, \"name\", { value: config.name });\n\n return Object.assign(workflow, {\n agentName: config.name,\n description: config.description,\n ...(config.resultSchema !== undefined && {\n resultSchema: config.resultSchema,\n }),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as SubagentDefinition<any, any>;\n}\n","import { proxySinks } from \"@temporalio/workflow\";\nimport type { ZeitlichObservabilitySinks } from \"./sinks\";\nimport type { SessionStartHook, SessionEndHook } from \"../hooks/types\";\nimport type {\n PostToolUseHook,\n PostToolUseFailureHook,\n} from \"../tool-router/types\";\n\nexport interface ObservabilityHooks {\n onSessionStart: SessionStartHook;\n onSessionEnd: SessionEndHook;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onPostToolUse: PostToolUseHook<any, any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onPostToolUseFailure: PostToolUseFailureHook<any>;\n}\n\n/**\n * Creates session hooks that emit agent lifecycle events to\n * {@link ZeitlichObservabilitySinks}.\n *\n * The returned hooks call `proxySinks()` once and forward each event to\n * the `zeitlichMetrics` sink. If the sink is not registered on the Worker,\n * calls are silently dropped by the Temporal runtime.\n *\n * Combine with your own hooks using spread or {@link composeHooks}:\n *\n * ```typescript\n * const session = await createSession({\n * hooks: {\n * ...createObservabilityHooks(\"myAgent\"),\n * // additional hooks can be composed via composeHooks()\n * },\n * });\n * ```\n *\n * @param agentName - Agent name attached to every emitted event\n */\nexport function createObservabilityHooks(\n agentName: string\n): ObservabilityHooks {\n const { zeitlichMetrics } = proxySinks<ZeitlichObservabilitySinks>();\n let sessionStartMs = Date.now();\n\n return {\n onSessionStart: (ctx) => {\n sessionStartMs = Date.now();\n zeitlichMetrics.sessionStarted({\n agentName,\n threadId: ctx.threadId,\n metadata: ctx.metadata,\n });\n },\n\n onSessionEnd: (ctx) => {\n zeitlichMetrics.sessionEnded({\n agentName,\n threadId: ctx.threadId,\n exitReason: ctx.exitReason,\n turns: ctx.turns,\n usage: {},\n durationMs: Date.now() - sessionStartMs,\n });\n },\n\n onPostToolUse: (ctx) => {\n zeitlichMetrics.toolExecuted({\n agentName,\n toolName: ctx.toolCall.name,\n durationMs: ctx.durationMs,\n success: true,\n threadId: ctx.threadId,\n turn: ctx.turn,\n });\n },\n\n onPostToolUseFailure: (ctx) => {\n zeitlichMetrics.toolExecuted({\n agentName,\n toolName: ctx.toolCall.name,\n durationMs: 0,\n success: false,\n threadId: ctx.threadId,\n turn: ctx.turn,\n });\n return {};\n },\n };\n}\n\n/**\n * Compose multiple hook functions for the same lifecycle event into one.\n *\n * Each hook is called sequentially in order. Return values from\n * `onPreToolUse` / `onPostToolUseFailure` use the **last** non-undefined\n * result (later hooks can override earlier ones).\n *\n * @example\n * ```typescript\n * const obs = createObservabilityHooks(\"myAgent\");\n * const hooks = {\n * onSessionEnd: composeHooks(obs.onSessionEnd, myCustomEndHook),\n * };\n * ```\n */\nexport function composeHooks<TArgs extends unknown[], TReturn>(\n ...fns: ((...args: TArgs) => TReturn | Promise<TReturn>)[]\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n let lastResult!: TReturn;\n for (const fn of fns) {\n lastResult = await fn(...args);\n }\n return lastResult;\n };\n}\n","/**\n * Workflow-safe proxy for runAgent activities with LLM-optimised defaults.\n *\n * Resolves the activity name from the scope using the same convention as\n * {@link createRunAgentActivity}: `run<Scope>`.\n * When no scope is provided, defaults to `workflowInfo().workflowType`.\n *\n * Import this from `zeitlich/workflow` in your Temporal workflow files.\n *\n * @typeParam M - SDK-native message type (e.g. `StoredMessage` for LangChain,\n * `Anthropic.Messages.Message` for Anthropic, `Content` for Google GenAI).\n * Must be provided for `SessionResult.finalMessage` to be correctly typed.\n *\n * @example\n * ```typescript\n * import { proxyRunAgent } from 'zeitlich/workflow';\n * import type { StoredMessage } from '@langchain/core/messages';\n *\n * // Auto-scoped to the current workflow name\n * const runAgent = proxyRunAgent<StoredMessage>();\n *\n * // Explicit scope for subagents\n * const runResearcher = proxyRunAgent<StoredMessage>(\"Researcher\");\n * ```\n */\nimport { proxyActivities, workflowInfo } from \"@temporalio/workflow\";\nimport type { AgentResponse } from \"./types\";\nimport type { RunAgentConfig } from \"../types\";\n\nexport function proxyRunAgent<M = unknown>(\n scope?: string,\n options?: Parameters<typeof proxyActivities>[0]\n): (config: RunAgentConfig) => Promise<AgentResponse<M>> {\n const resolvedScope = scope ?? workflowInfo().workflowType;\n const name = `run${resolvedScope.charAt(0).toUpperCase()}${resolvedScope.slice(1)}`;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const acts = proxyActivities<Record<string, (...args: any[]) => any>>(\n options ?? {\n startToCloseTimeout: \"10m\",\n heartbeatTimeout: \"1m\",\n retry: {\n maximumAttempts: 3,\n initialInterval: \"10s\",\n maximumInterval: \"2m\",\n backoffCoefficient: 3,\n },\n }\n );\n return acts[name] as (config: RunAgentConfig) => Promise<AgentResponse<M>>;\n}\n","import type { FileEntryMetadata, VirtualFileTree, TreeMutation } from \"./types\";\n\n/**\n * Apply a list of {@link TreeMutation}s to the `fileTree` stored in a state\n * manager instance, updating it in place and returning the new tree.\n *\n * The `stateManager` parameter is structurally typed so any\n * {@link AgentStateManager} whose custom state includes\n * `fileTree: VirtualFileTree<TMeta>` will satisfy it.\n */\nexport function applyVirtualTreeMutations<TMeta = FileEntryMetadata>(\n stateManager: {\n get(key: \"fileTree\"): VirtualFileTree<TMeta>;\n set(key: \"fileTree\", value: VirtualFileTree<TMeta>): void;\n },\n mutations: TreeMutation<TMeta>[]\n): VirtualFileTree<TMeta> {\n let tree = [...stateManager.get(\"fileTree\")];\n\n for (const m of mutations) {\n switch (m.type) {\n case \"add\":\n tree.push(m.entry);\n break;\n case \"remove\":\n tree = tree.filter((e) => e.path !== m.path);\n break;\n case \"update\":\n tree = tree.map((e) => (e.path === m.path ? { ...e, ...m.entry } : e));\n break;\n }\n }\n\n stateManager.set(\"fileTree\", tree);\n return tree;\n}\n","import type { FileEntry } from \"./types\";\n\ninterface TreeNode {\n name: string;\n children: Map<string, TreeNode>;\n isFile: boolean;\n}\n\nconst buildTree = <T>(entries: FileEntry<T>[]): TreeNode => {\n const root: TreeNode = { name: \"/\", children: new Map(), isFile: false };\n\n for (const entry of entries) {\n const parts = entry.path.split(\"/\").filter(Boolean);\n let current = root;\n for (const part of parts) {\n let child = current.children.get(part);\n if (!child) {\n child = { name: part, children: new Map(), isFile: false };\n current.children.set(part, child);\n }\n current = child;\n }\n current.isFile = current.children.size === 0;\n }\n\n return root;\n};\n\nconst printNode = (node: TreeNode, tab: string, sort: boolean): string => {\n const entries = [...node.children.values()];\n if (sort) {\n entries.sort((a, b) => {\n if (!a.isFile && !b.isFile) return a.name.localeCompare(b.name);\n if (!a.isFile) return -1;\n if (!b.isFile) return 1;\n return a.name.localeCompare(b.name);\n });\n }\n\n let str = \"\";\n for (const [i, entry] of entries.entries()) {\n const isLast = i === entries.length - 1;\n const branch = isLast ? \"└─\" : \"├─\";\n const childTab = tab + (isLast ? \" \" : \"│ \");\n\n if (entry.isFile) {\n str += \"\\n\" + tab + branch + \" \" + entry.name;\n } else {\n const subtree = printNode(entry, childTab, sort);\n str += \"\\n\" + tab + branch + \" \" + entry.name + \"/\" + subtree;\n }\n }\n return str;\n};\n\n/**\n * Generates a formatted file tree string from a flat {@link FileEntry} list.\n * Directories are inferred from file paths — no filesystem access needed.\n *\n * @param entries - Flat list of file entries\n * @param opts - Optional configuration\n * @param opts.sort - Sort entries alphabetically with directories first (defaults to true)\n * @returns Formatted file tree string\n *\n * @example\n * ```typescript\n * const tree = formatVirtualFileTree(state.fileTree);\n * // /\n * // ├─ src/\n * // │ ├─ index.ts\n * // │ └─ utils.ts\n * // └─ package.json\n * ```\n */\nexport function formatVirtualFileTree<T>(\n entries: FileEntry<T>[],\n opts: { sort?: boolean } = {}\n): string {\n const sort = opts.sort ?? true;\n const root = buildTree(entries);\n return \"/\" + printNode(root, \"\", sort);\n}\n","import type { FileEntry } from \"./types\";\n\n/**\n * Structural constraint: accepts any `AgentStateManager<T>` whose custom\n * state includes `fileTree: FileEntry<TMeta>[]`.\n */\nexport interface FileTreeAccessor<TMeta> {\n get(key: \"fileTree\"): FileEntry<TMeta>[];\n}\n\n/**\n * Check whether any file in the tree has a `metadata.mimeType` that matches\n * the given pattern.\n *\n * Patterns:\n * - Exact: `\"application/pdf\"`\n * - Wildcard type: `\"image/*\"`\n *\n * Useful for conditionally enabling tools:\n *\n * ```ts\n * { enabled: hasFileWithMimeType(stateManager, \"image/*\") }\n * { enabled: hasFileWithMimeType(stateManager, [\"image/*\", \"application/pdf\"]) }\n * ```\n */\nexport function hasFileWithMimeType<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string | string[]\n): boolean {\n const tree = stateManager.get(\"fileTree\");\n const matchers = (Array.isArray(pattern) ? pattern : [pattern]).map(\n buildMatcher\n );\n return tree.some((entry) => {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const mime = meta?.mimeType;\n return typeof mime === \"string\" && matchers.some((m) => m(mime));\n });\n}\n\n/**\n * Return all entries whose `metadata.mimeType` matches the given pattern.\n */\nexport function filesWithMimeType<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string\n): FileEntry<TMeta>[] {\n const tree = stateManager.get(\"fileTree\");\n const match = buildMatcher(pattern);\n return tree.filter((entry) => {\n const meta = entry.metadata as Record<string, unknown> | undefined;\n const mime = meta?.mimeType;\n return typeof mime === \"string\" && match(mime);\n });\n}\n\n/**\n * Check whether the tree contains a directory whose name matches the given\n * pattern. Directories are inferred from file paths.\n *\n * Patterns:\n * - Exact: `\"src\"`\n * - Glob with `*` wildcard: `\"test*\"`, `\"*.generated\"`\n *\n * ```ts\n * { enabled: hasDirectory(stateManager, \"test*\") }\n * ```\n */\nexport function hasDirectory<TMeta>(\n stateManager: FileTreeAccessor<TMeta>,\n pattern: string\n): boolean {\n const tree = stateManager.get(\"fileTree\");\n const match = buildGlobMatcher(pattern);\n return tree.some((entry) => {\n const segments = entry.path.split(\"/\").filter(Boolean);\n return segments.slice(0, -1).some(match);\n });\n}\n\n// ---------------------------------------------------------------------------\n// Internal matchers\n// ---------------------------------------------------------------------------\n\nfunction buildMatcher(pattern: string): (value: string) => boolean {\n if (pattern.endsWith(\"/*\")) {\n const prefix = pattern.slice(0, -1);\n return (v) => v.startsWith(prefix);\n }\n return (v) => v === pattern;\n}\n\nfunction buildGlobMatcher(pattern: string): (value: string) => boolean {\n if (!pattern.includes(\"*\")) return (v) => v === pattern;\n const re = new RegExp(\n \"^\" +\n pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\") +\n \"$\"\n );\n return (v) => re.test(v);\n}\n","/**\n * Workflow-safe proxy for virtual filesystem operations.\n *\n * Import this from `zeitlich/workflow` in your Temporal workflow files.\n *\n * By default the scope is derived from `workflowInfo().workflowType`,\n * so activities are automatically namespaced per workflow.\n *\n * @example\n * ```typescript\n * import { proxyVirtualFsOps } from 'zeitlich/workflow';\n *\n * const virtualFsOps = proxyVirtualFsOps();\n * ```\n */\nimport { proxyActivities, workflowInfo } from \"@temporalio/workflow\";\nimport type { VirtualFsOps } from \"./types\";\n\nexport function proxyVirtualFsOps<TCtx = unknown>(\n scope?: string,\n options?: Parameters<typeof proxyActivities>[0]\n): VirtualFsOps<TCtx> {\n const resolvedScope = scope ?? workflowInfo().workflowType;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const acts = proxyActivities<Record<string, (...args: any[]) => any>>(\n options ?? {\n startToCloseTimeout: \"30s\",\n retry: {\n maximumAttempts: 3,\n initialInterval: \"2s\",\n maximumInterval: \"30s\",\n backoffCoefficient: 2,\n },\n }\n );\n\n const prefix = `virtualFs${resolvedScope.charAt(0).toUpperCase()}${resolvedScope.slice(1)}`;\n const p = (key: string): string =>\n `${prefix}${key.charAt(0).toUpperCase()}${key.slice(1)}`;\n\n return {\n resolveFileTree: acts[p(\"resolveFileTree\")],\n } as VirtualFsOps<TCtx>;\n}\n","import type { SkillMetadata } from \"./types\";\n\n/**\n * Parse a SKILL.md file into its frontmatter fields and markdown body.\n *\n * Handles the limited YAML subset used by the agentskills.io spec:\n * flat key-value pairs plus one-level nested `metadata` map.\n * No external YAML dependency required.\n */\nexport function parseSkillFile(raw: string): {\n frontmatter: SkillMetadata;\n body: string;\n} {\n const trimmed = raw.replace(/^\\uFEFF/, \"\"); // strip BOM\n const match = trimmed.match(\n /^---[ \\t]*\\r?\\n([\\s\\S]*?)\\r?\\n---[ \\t]*\\r?\\n?([\\s\\S]*)$/\n );\n\n if (!match) {\n throw new Error(\n \"SKILL.md must start with YAML frontmatter delimited by ---\"\n );\n }\n\n const [, yamlBlock, body] = match as [string, string, string];\n const frontmatter = parseSimpleYaml(yamlBlock);\n\n if (!frontmatter.name || typeof frontmatter.name !== \"string\") {\n throw new Error(\"SKILL.md frontmatter must include a 'name' field\");\n }\n if (!frontmatter.description || typeof frontmatter.description !== \"string\") {\n throw new Error(\"SKILL.md frontmatter must include a 'description' field\");\n }\n\n const result: SkillMetadata = {\n name: frontmatter.name,\n description: frontmatter.description,\n };\n\n if (frontmatter.license) result.license = String(frontmatter.license);\n if (frontmatter.compatibility)\n result.compatibility = String(frontmatter.compatibility);\n if (frontmatter[\"allowed-tools\"]) {\n result.allowedTools = String(frontmatter[\"allowed-tools\"])\n .split(/\\s+/)\n .filter(Boolean);\n }\n if (\n frontmatter.metadata &&\n typeof frontmatter.metadata === \"object\" &&\n !Array.isArray(frontmatter.metadata)\n ) {\n result.metadata = frontmatter.metadata as Record<string, string>;\n }\n\n return { frontmatter: result, body: body.trim() };\n}\n\ntype YamlValue = string | Record<string, string>;\n\n/**\n * Minimal YAML parser for the agentskills.io frontmatter subset.\n * Supports: scalar key-value pairs, one-level nested maps (metadata).\n * Does NOT support arrays, multi-line strings, anchors, etc.\n */\nfunction parseSimpleYaml(yaml: string): Record<string, YamlValue> {\n const result: Record<string, YamlValue> = {};\n const lines = yaml.split(/\\r?\\n/);\n\n let currentMapKey: string | null = null;\n let currentMap: Record<string, string> | null = null;\n\n for (const line of lines) {\n if (line.trim() === \"\" || line.trim().startsWith(\"#\")) continue;\n\n const nestedMatch = line.match(/^(\\s{2,}|\\t+)(\\S+)\\s*:\\s*(.*)$/);\n if (nestedMatch && currentMapKey && currentMap) {\n const [, , key, rawVal] = nestedMatch as [string, string, string, string];\n currentMap[key] = unquote(rawVal.trim());\n continue;\n }\n\n // Flush any pending nested map\n if (currentMapKey && currentMap) {\n result[currentMapKey] = currentMap;\n currentMapKey = null;\n currentMap = null;\n }\n\n const topMatch = line.match(/^(\\S+)\\s*:\\s*(.*)$/);\n if (!topMatch) continue;\n\n const [, key, rawVal] = topMatch as [string, string, string];\n const val = rawVal.trim();\n\n if (val === \"\" || val === \"|\" || val === \">\") {\n currentMapKey = key;\n currentMap = {};\n } else {\n result[key] = unquote(val);\n }\n }\n\n if (currentMapKey && currentMap) {\n result[currentMapKey] = currentMap;\n }\n\n return result;\n}\n\nfunction unquote(s: string): string {\n if (\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\n ) {\n return s.slice(1, -1);\n }\n return s;\n}\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const globTool = {\n name: \"Glob\" as const,\n description: `Search for files matching a glob pattern within the available file system.\n\nUsage:\n- Use glob patterns like \"**/*.ts\" to find all TypeScript files\n- Use \"docs/**\" to find all files in the docs directory\n- Patterns are matched against virtual paths in the file system\n\nExamples:\n- \"*.md\" - Find all markdown files in the root\n- \"**/*.test.ts\" - Find all test files recursively\n- \"src/**/*.ts\" - Find all TypeScript files in src directory\n`,\n schema: z.object({\n pattern: z.string().describe(\"Glob pattern to match files against\"),\n root: z\n .string()\n .optional()\n .describe(\"Optional root directory to search from\"),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type GlobArgs = z.infer<typeof globTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const grepTool = {\n name: \"Grep\" as const,\n description: `Search file contents for a pattern within the available file system.\n\nUsage:\n- Searches for a regex pattern across file contents\n- Returns matching lines with file paths and line numbers\n- Can filter by file patterns and limit results\n\nExamples:\n- Search for \"TODO\" in all files\n- Search for function definitions with \"function.*handleClick\"\n- Search case-insensitively with ignoreCase: true\n`,\n schema: z.object({\n pattern: z\n .string()\n .describe(\"Regex pattern to search for in file contents\"),\n ignoreCase: z\n .boolean()\n .optional()\n .describe(\"Case-insensitive search (default: false)\"),\n maxMatches: z\n .number()\n .optional()\n .describe(\"Maximum number of matches to return (default: 50)\"),\n includePatterns: z\n .array(z.string())\n .optional()\n .describe(\"Glob patterns to include (e.g., ['*.ts', '*.js'])\"),\n excludePatterns: z\n .array(z.string())\n .optional()\n .describe(\"Glob patterns to exclude (e.g., ['*.test.ts'])\"),\n contextLines: z\n .number()\n .optional()\n .describe(\"Number of context lines to show around matches\"),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type GrepArgs = z.infer<typeof grepTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const readFileTool = {\n name: \"FileRead\" as const,\n description: `Read file contents with optional pagination.\n\nUsage:\n- Provide the virtual path to the file you want to read\n- Supports text files, images, and PDFs\n- For large files, use offset and limit to read specific portions\n\nThe tool returns the file content in an appropriate format:\n- Text files: Plain text content\n- Images: Base64-encoded image data\n- PDFs: Extracted text content\n`,\n schema: z.object({\n path: z.string().describe(\"Virtual path to the file to read\"),\n offset: z\n .number()\n .optional()\n .describe(\n \"Line number to start reading from (1-indexed, for text files)\"\n ),\n limit: z\n .number()\n .optional()\n .describe(\"Maximum number of lines to read (for text files)\"),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type FileReadArgs = z.infer<typeof readFileTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const writeFileTool = {\n name: \"FileWrite\" as const,\n description: `Create or overwrite a file with new content.\n\nUsage:\n- The file will be created if it doesn't exist\n- If the file exists, it will be completely overwritten\n\nIMPORTANT:\n- You must read the file first (in this session) before writing to it\n- This is an atomic write operation - the entire file is replaced\n- Path must be relative to the root of the file system (e.g., \"docs/readme.md\", not \"/docs/readme.md\")\n`,\n schema: z.object({\n file_path: z.string().describe(\"The path to the file to write\"),\n content: z.string().describe(\"The content to write to the file\"),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type FileWriteArgs = z.infer<typeof writeFileTool.schema>;\n","import { z } from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const editTool = {\n name: \"FileEdit\" as const,\n description: `Edit specific sections of a file by replacing text.\n\nUsage:\n- Provide the exact text to find and replace\n- The old_string must match exactly (whitespace-sensitive)\n- By default, only replaces the first occurrence\n- Use replace_all: true to replace all occurrences\n\nIMPORTANT:\n- You must read the file first (in this session) before editing it\n- old_string must be unique in the file (unless using replace_all)\n- The operation fails if old_string is not found\n- old_string and new_string must be different\n`,\n schema: z.object({\n file_path: z\n .string()\n .describe(\"The absolute virtual path to the file to modify\"),\n old_string: z.string().describe(\"The exact text to replace\"),\n new_string: z\n .string()\n .describe(\n \"The text to replace it with (must be different from old_string)\"\n ),\n replace_all: z\n .boolean()\n .optional()\n .describe(\n \"If true, replace all occurrences of old_string (default: false)\"\n ),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type FileEditArgs = z.infer<typeof editTool.schema>;\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskCreateTool = {\n name: \"TaskCreate\" as const,\n description: `Use this tool to create a structured task list. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\n It also helps the user understand the progress of the task and overall progress of their requests.\n \n ## When to Use This Tool\n \n Use this tool proactively in these scenarios:\n \n - Complex multi-step tasks - When a task requires 3 or more distinct steps or actions\n - Non-trivial and complex tasks - Tasks that require careful planning or multiple operations\n - User explicitly requests todo list - When the user directly asks you to use the todo list\n - User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)\n - After receiving new instructions - Immediately capture user requirements as tasks\n - When you start working on a task - Mark it as in_progress BEFORE beginning work\n - After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation\n \n ## When NOT to Use This Tool\n \n Skip using this tool when:\n - There is only a single, straightforward task\n - The task is trivial and tracking it provides no organizational benefit\n - The task can be completed in less than 3 trivial steps\n - The task is purely conversational or informational\n \n NOTE that you should not use this tool if there is only one trivial task to do. In this case you are better off just doing the task directly.\n \n ## Task Fields\n \n - **subject**: A brief, actionable title in imperative form (e.g., \"Fix authentication bug in login flow\")\n - **description**: Detailed description of what needs to be done, including context and acceptance criteria\n - **activeForm**: Present continuous form shown in spinner when task is in_progress (e.g., \"Fixing authentication bug\"). This is displayed to the user while you work on the task.\n \n **IMPORTANT**: Always provide activeForm when creating tasks. The subject should be imperative (\"Run tests\") while activeForm should be present continuous (\"Running tests\"). All tasks are created with status \\`pending\\`.\n \n ## Tips\n \n - Create tasks with clear, specific subjects that describe the outcome\n - Include enough detail in the description for another agent to understand and complete the task\n - After creating tasks, use TaskUpdate to set up dependencies (blocks/blockedBy) if needed\n - Check TaskList first to avoid creating duplicate tasks`,\n schema: z.object({\n subject: z\n .string()\n .describe(\n 'A brief, actionable title in imperative form (e.g., \"Fix authentication bug in login flow\")'\n ),\n description: z\n .string()\n .describe(\n \"Detailed description of what needs to be done, including context and acceptance criteria\"\n ),\n activeForm: z\n .string()\n .describe(\n 'Present continuous form shown in spinner when task is in_progress (e.g., \"Fixing authentication bug\"). This is displayed to the user while you work on the task.'\n ),\n metadata: z\n .record(z.string(), z.string())\n .describe(\"Arbitrary key-value pairs for tracking\"),\n }),\n} satisfies ToolDefinition;\n\nexport type TaskCreateArgs = z.infer<typeof taskCreateTool.schema>;\n","import type { AgentStateManager, JsonSerializable } from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport { getShortId } from \"../../workflow\";\nimport type { TaskCreateArgs } from \"./tool\";\n\n/**\n * Creates a TaskCreate handler that adds tasks to the workflow state.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A ToolHandler for TaskCreate tool calls\n */\nexport function createTaskCreateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskCreateArgs, WorkflowTask> {\n return (args) => {\n const task: WorkflowTask = {\n id: getShortId(),\n subject: args.subject,\n description: args.description,\n activeForm: args.activeForm,\n status: \"pending\",\n metadata: args.metadata ?? {},\n blockedBy: [],\n blocks: [],\n };\n\n stateManager.setTask(task);\n\n return {\n toolResponse: JSON.stringify(task, null, 2),\n data: task,\n };\n };\n}\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskGetTool = {\n name: \"TaskGet\" as const,\n description: `Retrieve full task details including dependencies.`,\n schema: z.object({\n taskId: z.string().describe(\"The ID of the task to get\"),\n }),\n} satisfies ToolDefinition;\n\nexport type TaskGetArgs = z.infer<typeof taskGetTool.schema>;\n","import type { AgentStateManager, JsonSerializable } from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskGetArgs } from \"./tool\";\n\n/**\n * Creates a TaskGet handler that retrieves a task by ID.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A ToolHandler for TaskGet tool calls\n */\nexport function createTaskGetHandler<TCustom extends JsonSerializable<TCustom>>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskGetArgs, WorkflowTask | null> {\n return (args) => {\n const task = stateManager.getTask(args.taskId) ?? null;\n\n if (!task) {\n return {\n toolResponse: JSON.stringify({\n error: `Task not found: ${args.taskId}`,\n }),\n data: null,\n };\n }\n\n return {\n toolResponse: JSON.stringify(task, null, 2),\n data: task,\n };\n };\n}\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskListTool = {\n name: \"TaskList\" as const,\n description: `List all tasks with current state.`,\n schema: z.object({}),\n} satisfies ToolDefinition;\n\nexport type TaskListArgs = z.infer<typeof taskListTool.schema>;\n","import type { AgentStateManager, JsonSerializable } from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskListArgs } from \"./tool\";\n\n/**\n * Creates a TaskList handler that returns all tasks.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A ToolHandler for TaskList tool calls\n */\nexport function createTaskListHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskListArgs, WorkflowTask[]> {\n return () => {\n const taskList = stateManager.getTasks();\n\n return {\n toolResponse: JSON.stringify(taskList, null, 2),\n data: taskList,\n };\n };\n}\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const taskUpdateTool = {\n name: \"TaskUpdate\" as const,\n description: `Update status, add blockers, modify details.`,\n schema: z.object({\n taskId: z.string().describe(\"The ID of the task to get\"),\n status: z\n .enum([\"pending\", \"in_progress\", \"completed\"])\n .describe(\"The status of the task\"),\n addBlockedBy: z\n .array(z.string())\n .describe(\"The IDs of the tasks that are blocking this task\"),\n addBlocks: z\n .array(z.string())\n .describe(\"The IDs of the tasks that this task is blocking\"),\n }),\n} satisfies ToolDefinition;\n\nexport type TaskUpdateArgs = z.infer<typeof taskUpdateTool.schema>;\n","import type { AgentStateManager, JsonSerializable } from \"../../lib/state\";\nimport type { ToolHandler } from \"../../lib/tool-router\";\nimport type { WorkflowTask } from \"../../lib/types\";\nimport type { TaskUpdateArgs } from \"./tool\";\n\n/**\n * Creates a TaskUpdate handler that modifies task status and dependencies.\n *\n * @param stateManager - State manager containing tasks state\n * @returns A ToolHandler for TaskUpdate tool calls\n */\nexport function createTaskUpdateHandler<\n TCustom extends JsonSerializable<TCustom>,\n>(\n stateManager: AgentStateManager<TCustom>\n): ToolHandler<TaskUpdateArgs, WorkflowTask | null> {\n return (args) => {\n const task = stateManager.getTask(args.taskId);\n\n if (!task) {\n return {\n toolResponse: JSON.stringify({\n error: `Task not found: ${args.taskId}`,\n }),\n data: null,\n };\n }\n\n // Update status if provided\n if (args.status) {\n task.status = args.status;\n }\n\n // Add blockedBy relationships (bidirectional)\n if (args.addBlockedBy) {\n for (const blockerId of args.addBlockedBy) {\n if (!task.blockedBy.includes(blockerId)) {\n task.blockedBy.push(blockerId);\n }\n // Update the blocker task's blocks array\n const blockerTask = stateManager.getTask(blockerId);\n if (blockerTask && !blockerTask.blocks.includes(task.id)) {\n blockerTask.blocks.push(task.id);\n stateManager.setTask(blockerTask);\n }\n }\n }\n\n // Add blocks relationships (bidirectional)\n if (args.addBlocks) {\n for (const blockedId of args.addBlocks) {\n if (!task.blocks.includes(blockedId)) {\n task.blocks.push(blockedId);\n }\n // Update the blocked task's blockedBy array\n const blockedTask = stateManager.getTask(blockedId);\n if (blockedTask && !blockedTask.blockedBy.includes(task.id)) {\n blockedTask.blockedBy.push(task.id);\n stateManager.setTask(blockedTask);\n }\n }\n }\n\n stateManager.setTask(task);\n\n return {\n toolResponse: JSON.stringify(task, null, 2),\n data: task,\n };\n };\n}\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const createBashToolDescription = ({\n fileTree,\n}: {\n fileTree: string;\n}): string => `Execute shell commands in a bash environment.\n\nUse this tool to:\n- Run shell commands (ls, cat, grep, find, etc.)\n- Execute scripts and chain commands with pipes (|) or logical operators (&&, ||)\n- Inspect files and directories\n\nCurrent file tree:\n${fileTree}`;\n\nexport const bashTool = {\n name: \"Bash\" as const,\n description: `Execute shell commands in a sandboxed bash environment.\n\nUse this tool to:\n- Run shell commands (ls, cat, grep, find, etc.)\n- Execute scripts and chain commands with pipes (|) or logical operators (&&, ||)\n- Inspect files and directories\n`,\n schema: z.object({\n command: z\n .string()\n .describe(\n \"The bash command to execute. Can include pipes (|), redirects (>, >>), logical operators (&&, ||), and shell features like command substitution $(...).\"\n ),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type BashArgs = z.infer<typeof bashTool.schema>;\n","import z from \"zod\";\nimport type { ToolDefinition } from \"../../lib/tool-router\";\n\nexport const askUserQuestionTool = {\n name: \"AskUserQuestion\" as const,\n description: `Use this tool when you need to ask the user questions during execution. This allows you to:\n\n1. Gather user preferences or requirements\n2. Clarify ambiguous instructions\n3. Get decisions on implementation choices as you work\n4. Offer choices to the user about what direction to take.\n\nUsage notes:\n\n* Users will always be able to select \"Other\" to provide custom text input\n* Use multiSelect: true to allow multiple answers to be selected for a question\n* If you recommend a specific option, make that the first option in the list and add \"(Recommended)\" at the end of the label\n`,\n schema: z.object({\n questions: z.array(\n z.object({\n question: z.string().describe(\"The full question text to display\"),\n header: z\n .string()\n .describe(\"Short label for the question (max 12 characters)\"),\n options: z\n .array(\n z.object({\n label: z.string(),\n description: z.string(),\n })\n )\n .min(0)\n .max(4)\n .describe(\"Array of 0-4 choices, each with label and description\"),\n multiSelect: z\n .boolean()\n .describe(\"If true, users can select multiple options\"),\n })\n ),\n }),\n strict: true,\n} satisfies ToolDefinition;\n\nexport type AskUserQuestionArgs = z.infer<typeof askUserQuestionTool.schema>;\n","import type { ActivityToolHandler } from \"../../lib/tool-router\";\nimport type { AskUserQuestionArgs } from \"./tool\";\n\n/**\n * Creates a handler for the AskUserQuestion tool.\n * Returns question data for display to the user via your UI layer.\n *\n * Typically paired with `stateManager.waitForInput()` in a `hooks.onPostToolUse`\n * callback to pause the agent loop until the user responds.\n *\n * @example\n * ```typescript\n * import { createAskUserQuestionHandler } from 'zeitlich';\n * import { askUserQuestionTool, defineTool } from 'zeitlich/workflow';\n *\n * // In activities\n * const askUserQuestionHandlerActivity = createAskUserQuestionHandler();\n *\n * // In workflow\n * tools: {\n * AskUserQuestion: defineTool({\n * ...askUserQuestionTool,\n * handler: askUserQuestionHandlerActivity,\n * hooks: {\n * onPostToolUse: () => { stateManager.waitForInput(); },\n * },\n * }),\n * }\n * ```\n */\nexport const createAskUserQuestionHandler =\n (): ActivityToolHandler<\n AskUserQuestionArgs,\n {\n questions: {\n question: string;\n header: string;\n options: { label: string; description: string }[];\n multiSelect: boolean;\n }[];\n }\n > =>\n async (args) => {\n return {\n toolResponse: \"Question submitted\",\n data: { questions: args.questions },\n };\n };\n"]}