zeitlich 0.2.35 → 0.2.37

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 (199) hide show
  1. package/README.md +146 -92
  2. package/dist/{activities-BVI2lTwr.d.ts → activities-Bb-nAjwQ.d.ts} +2 -2
  3. package/dist/{activities-hd4aNnZE.d.cts → activities-vkI4_3CC.d.cts} +2 -2
  4. package/dist/adapters/sandbox/bedrock/index.cjs +14 -11
  5. package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -1
  6. package/dist/adapters/sandbox/bedrock/index.d.cts +4 -3
  7. package/dist/adapters/sandbox/bedrock/index.d.ts +4 -3
  8. package/dist/adapters/sandbox/bedrock/index.js +14 -11
  9. package/dist/adapters/sandbox/bedrock/index.js.map +1 -1
  10. package/dist/adapters/sandbox/bedrock/workflow.cjs +2 -0
  11. package/dist/adapters/sandbox/bedrock/workflow.cjs.map +1 -1
  12. package/dist/adapters/sandbox/bedrock/workflow.d.cts +2 -2
  13. package/dist/adapters/sandbox/bedrock/workflow.d.ts +2 -2
  14. package/dist/adapters/sandbox/bedrock/workflow.js +2 -0
  15. package/dist/adapters/sandbox/bedrock/workflow.js.map +1 -1
  16. package/dist/adapters/sandbox/daytona/index.cjs +35 -6
  17. package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
  18. package/dist/adapters/sandbox/daytona/index.d.cts +3 -1
  19. package/dist/adapters/sandbox/daytona/index.d.ts +3 -1
  20. package/dist/adapters/sandbox/daytona/index.js +35 -6
  21. package/dist/adapters/sandbox/daytona/index.js.map +1 -1
  22. package/dist/adapters/sandbox/daytona/workflow.cjs +2 -0
  23. package/dist/adapters/sandbox/daytona/workflow.cjs.map +1 -1
  24. package/dist/adapters/sandbox/daytona/workflow.d.cts +1 -1
  25. package/dist/adapters/sandbox/daytona/workflow.d.ts +1 -1
  26. package/dist/adapters/sandbox/daytona/workflow.js +2 -0
  27. package/dist/adapters/sandbox/daytona/workflow.js.map +1 -1
  28. package/dist/adapters/sandbox/e2b/index.cjs +59 -10
  29. package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
  30. package/dist/adapters/sandbox/e2b/index.d.cts +5 -3
  31. package/dist/adapters/sandbox/e2b/index.d.ts +5 -3
  32. package/dist/adapters/sandbox/e2b/index.js +59 -10
  33. package/dist/adapters/sandbox/e2b/index.js.map +1 -1
  34. package/dist/adapters/sandbox/e2b/workflow.cjs +2 -0
  35. package/dist/adapters/sandbox/e2b/workflow.cjs.map +1 -1
  36. package/dist/adapters/sandbox/e2b/workflow.d.cts +1 -1
  37. package/dist/adapters/sandbox/e2b/workflow.d.ts +1 -1
  38. package/dist/adapters/sandbox/e2b/workflow.js +2 -0
  39. package/dist/adapters/sandbox/e2b/workflow.js.map +1 -1
  40. package/dist/adapters/sandbox/inmemory/index.cjs +5 -0
  41. package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
  42. package/dist/adapters/sandbox/inmemory/index.d.cts +2 -1
  43. package/dist/adapters/sandbox/inmemory/index.d.ts +2 -1
  44. package/dist/adapters/sandbox/inmemory/index.js +5 -0
  45. package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
  46. package/dist/adapters/sandbox/inmemory/workflow.cjs +2 -0
  47. package/dist/adapters/sandbox/inmemory/workflow.cjs.map +1 -1
  48. package/dist/adapters/sandbox/inmemory/workflow.d.cts +1 -1
  49. package/dist/adapters/sandbox/inmemory/workflow.d.ts +1 -1
  50. package/dist/adapters/sandbox/inmemory/workflow.js +2 -0
  51. package/dist/adapters/sandbox/inmemory/workflow.js.map +1 -1
  52. package/dist/adapters/thread/anthropic/index.cjs +71 -36
  53. package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
  54. package/dist/adapters/thread/anthropic/index.d.cts +5 -5
  55. package/dist/adapters/thread/anthropic/index.d.ts +5 -5
  56. package/dist/adapters/thread/anthropic/index.js +71 -36
  57. package/dist/adapters/thread/anthropic/index.js.map +1 -1
  58. package/dist/adapters/thread/anthropic/workflow.cjs +5 -1
  59. package/dist/adapters/thread/anthropic/workflow.cjs.map +1 -1
  60. package/dist/adapters/thread/anthropic/workflow.d.cts +5 -5
  61. package/dist/adapters/thread/anthropic/workflow.d.ts +5 -5
  62. package/dist/adapters/thread/anthropic/workflow.js +5 -1
  63. package/dist/adapters/thread/anthropic/workflow.js.map +1 -1
  64. package/dist/adapters/thread/google-genai/index.cjs +50 -25
  65. package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
  66. package/dist/adapters/thread/google-genai/index.d.cts +5 -5
  67. package/dist/adapters/thread/google-genai/index.d.ts +5 -5
  68. package/dist/adapters/thread/google-genai/index.js +50 -25
  69. package/dist/adapters/thread/google-genai/index.js.map +1 -1
  70. package/dist/adapters/thread/google-genai/workflow.cjs +5 -1
  71. package/dist/adapters/thread/google-genai/workflow.cjs.map +1 -1
  72. package/dist/adapters/thread/google-genai/workflow.d.cts +5 -5
  73. package/dist/adapters/thread/google-genai/workflow.d.ts +5 -5
  74. package/dist/adapters/thread/google-genai/workflow.js +5 -1
  75. package/dist/adapters/thread/google-genai/workflow.js.map +1 -1
  76. package/dist/adapters/thread/langchain/index.cjs +34 -7
  77. package/dist/adapters/thread/langchain/index.cjs.map +1 -1
  78. package/dist/adapters/thread/langchain/index.d.cts +5 -5
  79. package/dist/adapters/thread/langchain/index.d.ts +5 -5
  80. package/dist/adapters/thread/langchain/index.js +34 -7
  81. package/dist/adapters/thread/langchain/index.js.map +1 -1
  82. package/dist/adapters/thread/langchain/workflow.cjs +5 -1
  83. package/dist/adapters/thread/langchain/workflow.cjs.map +1 -1
  84. package/dist/adapters/thread/langchain/workflow.d.cts +5 -5
  85. package/dist/adapters/thread/langchain/workflow.d.ts +5 -5
  86. package/dist/adapters/thread/langchain/workflow.js +5 -1
  87. package/dist/adapters/thread/langchain/workflow.js.map +1 -1
  88. package/dist/index.cjs +206 -120
  89. package/dist/index.cjs.map +1 -1
  90. package/dist/index.d.cts +17 -11
  91. package/dist/index.d.ts +17 -11
  92. package/dist/index.js +207 -121
  93. package/dist/index.js.map +1 -1
  94. package/dist/{proxy-BjdFGPTm.d.ts → proxy-0smGKvx8.d.ts} +1 -1
  95. package/dist/{proxy-7RnVaPdJ.d.cts → proxy-DEtowJyd.d.cts} +1 -1
  96. package/dist/{thread-manager-DjN5JYul.d.ts → thread-manager-3fszQih4.d.ts} +2 -2
  97. package/dist/{thread-manager-CbpiGq1L.d.ts → thread-manager-C-C4pI2z.d.ts} +2 -2
  98. package/dist/{thread-manager-BBzNgQWH.d.cts → thread-manager-CzYln2OC.d.cts} +2 -2
  99. package/dist/{thread-manager-DzXm9eeI.d.cts → thread-manager-D4vgzYrh.d.cts} +2 -2
  100. package/dist/{types-yiXmqedU.d.ts → types-B37hKoWA.d.ts} +1 -1
  101. package/dist/{types-DQ1l_gXL.d.cts → types-BO7Yju20.d.cts} +63 -14
  102. package/dist/{types-wiGLvxWf.d.ts → types-CNuWnvy9.d.ts} +1 -1
  103. package/dist/{types-CADc5V_P.d.ts → types-CPKDl-y_.d.ts} +63 -14
  104. package/dist/{types-Mc_4BCfT.d.cts → types-D08CXPh8.d.cts} +1 -1
  105. package/dist/{types-CBH54cwr.d.cts → types-DWEUmYAJ.d.cts} +1 -1
  106. package/dist/{types-DxCpFNv_.d.cts → types-tQL9njTu.d.cts} +25 -0
  107. package/dist/{types-DxCpFNv_.d.ts → types-tQL9njTu.d.ts} +25 -0
  108. package/dist/{workflow-P2pTSfKu.d.ts → workflow-CjXHbZZc.d.ts} +2 -2
  109. package/dist/{workflow-DhtWRovz.d.cts → workflow-Do_lzJpT.d.cts} +2 -2
  110. package/dist/workflow.cjs +182 -114
  111. package/dist/workflow.cjs.map +1 -1
  112. package/dist/workflow.d.cts +3 -3
  113. package/dist/workflow.d.ts +3 -3
  114. package/dist/workflow.js +183 -115
  115. package/dist/workflow.js.map +1 -1
  116. package/package.json +1 -1
  117. package/src/adapters/sandbox/bedrock/filesystem.ts +6 -12
  118. package/src/adapters/sandbox/bedrock/index.ts +10 -8
  119. package/src/adapters/sandbox/bedrock/proxy.ts +2 -0
  120. package/src/adapters/sandbox/daytona/filesystem.ts +29 -6
  121. package/src/adapters/sandbox/daytona/index.ts +6 -0
  122. package/src/adapters/sandbox/daytona/proxy.ts +2 -0
  123. package/src/adapters/sandbox/e2b/filesystem.ts +5 -4
  124. package/src/adapters/sandbox/e2b/index.ts +63 -12
  125. package/src/adapters/sandbox/e2b/proxy.ts +2 -0
  126. package/src/adapters/sandbox/inmemory/index.ts +5 -0
  127. package/src/adapters/sandbox/inmemory/proxy.ts +2 -0
  128. package/src/adapters/thread/anthropic/activities.ts +49 -26
  129. package/src/adapters/thread/anthropic/model-invoker.ts +15 -6
  130. package/src/adapters/thread/anthropic/proxy.ts +6 -2
  131. package/src/adapters/thread/anthropic/thread-manager.test.ts +26 -7
  132. package/src/adapters/thread/anthropic/thread-manager.ts +60 -46
  133. package/src/adapters/thread/google-genai/activities.ts +7 -2
  134. package/src/adapters/thread/google-genai/model-invoker.ts +26 -8
  135. package/src/adapters/thread/google-genai/proxy.ts +6 -2
  136. package/src/adapters/thread/google-genai/thread-manager.test.ts +13 -3
  137. package/src/adapters/thread/google-genai/thread-manager.ts +54 -33
  138. package/src/adapters/thread/langchain/activities.ts +46 -24
  139. package/src/adapters/thread/langchain/hooks.test.ts +36 -49
  140. package/src/adapters/thread/langchain/hooks.ts +18 -5
  141. package/src/adapters/thread/langchain/model-invoker.ts +3 -3
  142. package/src/adapters/thread/langchain/proxy.ts +6 -2
  143. package/src/adapters/thread/langchain/thread-manager.test.ts +5 -1
  144. package/src/adapters/thread/langchain/thread-manager.ts +20 -9
  145. package/src/index.ts +4 -1
  146. package/src/lib/activity.ts +16 -6
  147. package/src/lib/hooks/types.ts +6 -6
  148. package/src/lib/lifecycle.ts +9 -1
  149. package/src/lib/model/proxy.ts +2 -2
  150. package/src/lib/observability/hooks.ts +4 -5
  151. package/src/lib/observability/index.ts +1 -4
  152. package/src/lib/sandbox/manager.ts +21 -4
  153. package/src/lib/sandbox/node-fs.ts +3 -6
  154. package/src/lib/sandbox/sandbox.test.ts +36 -3
  155. package/src/lib/sandbox/tree.integration.test.ts +10 -3
  156. package/src/lib/sandbox/types.ts +35 -1
  157. package/src/lib/session/session-edge-cases.integration.test.ts +51 -13
  158. package/src/lib/session/session.integration.test.ts +139 -0
  159. package/src/lib/session/session.ts +50 -19
  160. package/src/lib/session/types.ts +13 -5
  161. package/src/lib/skills/fs-provider.ts +12 -8
  162. package/src/lib/skills/handler.ts +1 -1
  163. package/src/lib/skills/parse.ts +3 -1
  164. package/src/lib/skills/register.ts +1 -3
  165. package/src/lib/skills/skills.integration.test.ts +25 -15
  166. package/src/lib/state/manager.integration.test.ts +12 -2
  167. package/src/lib/subagent/define.ts +1 -1
  168. package/src/lib/subagent/handler.ts +186 -71
  169. package/src/lib/subagent/index.ts +1 -5
  170. package/src/lib/subagent/register.ts +3 -2
  171. package/src/lib/subagent/signals.ts +1 -10
  172. package/src/lib/subagent/subagent.integration.test.ts +438 -156
  173. package/src/lib/subagent/tool.ts +4 -3
  174. package/src/lib/subagent/types.ts +50 -20
  175. package/src/lib/subagent/workflow.ts +9 -49
  176. package/src/lib/thread/id.test.ts +1 -1
  177. package/src/lib/thread/id.ts +1 -2
  178. package/src/lib/thread/proxy.ts +3 -4
  179. package/src/lib/thread/types.ts +11 -3
  180. package/src/lib/tool-router/index.ts +1 -5
  181. package/src/lib/tool-router/router-edge-cases.integration.test.ts +1 -1
  182. package/src/lib/tool-router/router.ts +3 -2
  183. package/src/lib/tool-router/types.ts +11 -3
  184. package/src/lib/tool-router/with-sandbox.ts +19 -5
  185. package/src/lib/virtual-fs/filesystem.ts +1 -1
  186. package/src/lib/virtual-fs/index.ts +5 -1
  187. package/src/lib/virtual-fs/mutations.ts +2 -4
  188. package/src/lib/virtual-fs/queries.ts +9 -5
  189. package/src/lib/virtual-fs/types.ts +4 -1
  190. package/src/lib/virtual-fs/virtual-fs.test.ts +9 -11
  191. package/src/lib/workflow.test.ts +7 -4
  192. package/src/lib/workflow.ts +1 -5
  193. package/src/tools/ask-user-question/tool.ts +1 -3
  194. package/src/tools/glob/handler.ts +1 -4
  195. package/src/tools/task-get/handler.ts +4 -5
  196. package/src/tools/task-list/handler.ts +1 -4
  197. package/src/tools/task-update/handler.ts +4 -5
  198. package/src/workflow.ts +20 -7
  199. package/tsup.config.ts +9 -6
@@ -1,6 +1,6 @@
1
- export { A as AskUserQuestionArgs, B as BashArgs, F as FileEditArgs, a as FileReadArgs, b as FileWriteArgs, G as GlobArgs, d as GrepArgs, O as ObservabilityHooks, R as ReadSkillArgs, S as SessionEndedEvent, e as SessionStartedEvent, f as SubagentArgs, T as TaskCreateArgs, g as TaskGetArgs, h as TaskListArgs, i as TaskUpdateArgs, j as ToolExecutedEvent, k as TurnCompletedEvent, W as WorkflowConfig, l as WorkflowInput, m as WorkflowSessionInput, Z as ZeitlichObservabilitySinks, n as applyVirtualTreeMutations, o as askUserQuestionTool, p as bashTool, q as composeHooks, r as createAgentStateManager, s as createAskUserQuestionHandler, t as createBashToolDescription, u as createObservabilityHooks, v as createReadSkillHandler, w as createReadSkillTool, x as createSession, y as createTaskCreateHandler, z as createTaskGetHandler, C as createTaskListHandler, D as createTaskUpdateHandler, E as createToolRouter, H as defineSubagent, I as defineSubagentWorkflow, J as defineTool, K as defineWorkflow, L as editTool, M as filesWithMimeType, N as formatVirtualFileTree, P as getShortId, Q as globTool, U as grepTool, V as hasDirectory, X as hasFileWithMimeType, Y as hasNoOtherToolCalls, _ as parseSkillFile, $ as proxyRunAgent, a0 as proxyVirtualFsOps, a1 as readFileTool, a2 as taskCreateTool, a3 as taskGetTool, a4 as taskListTool, a5 as taskUpdateTool, a6 as writeFileTool } from './workflow-DhtWRovz.cjs';
2
- export { c as ActivityToolHandler, l as AgentConfig, m as AgentFile, A as AgentResponse, n as AgentState, o as AgentStateManager, p as AgentStatus, q as AppendToolResultFn, B as BaseAgentState, r as FileEntry, F as FileEntryMetadata, i as FileResolver, H as Hooks, I as InferToolResults, s as JsonPrimitive, t as JsonSerializable, J as JsonValue, a as ModelInvoker, M as ModelInvokerConfig, u as ParsedToolCall, v as ParsedToolCallUnion, w as PostHumanMessageAppendHook, x as PostHumanMessageAppendHookContext, y as PostToolUseFailureHook, z as PostToolUseFailureHookContext, C as PostToolUseFailureHookResult, D as PostToolUseHook, E as PostToolUseHookContext, G as PreHumanMessageAppendHook, K as PreHumanMessageAppendHookContext, L as PreToolUseHook, N as PreToolUseHookContext, O as PreToolUseHookResult, P as PrefixedThreadOps, k as PrefixedVirtualFsOps, Q as ProcessToolCallsContext, U as RawToolCall, R as RouterContext, W as RunAgentActivity, e as RunAgentConfig, X as SandboxInit, Y as SandboxShutdown, S as ScopedPrefix, Z as SerializableToolDefinition, _ as SessionConfig, $ as SessionEndHook, a0 as SessionEndHookContext, a1 as SessionExitReason, a2 as SessionResult, a3 as SessionStartHook, a4 as SessionStartHookContext, h as Skill, g as SkillMetadata, f as SkillProvider, a5 as SubagentConfig, a6 as SubagentDefinition, a7 as SubagentFnResult, a8 as SubagentHandlerResponse, a9 as SubagentHooks, aa as SubagentSandboxConfig, ab as SubagentSandboxShutdown, ac as SubagentSessionInput, ad as SubagentWorkflow, ae as SubagentWorkflowInput, af as TaskStatus, ag as ThreadInit, T as ThreadOps, ah as TokenUsage, ai as ToolArgs, aj as ToolCallResult, ak as ToolCallResultUnion, al as ToolDefinition, am as ToolHandler, b as ToolHandlerResponse, an as ToolHooks, ao as ToolMap, ap as ToolNames, aq as ToolResult, d as ToolResultConfig, ar as ToolRouter, as as ToolRouterHooks, at as ToolWithHandler, j as TreeMutation, av as VirtualFileTree, aw as VirtualFsOps, ax as VirtualFsState, ay as WorkflowTask, az as ZeitlichSession, aA as isTerminalStatus } from './types-DQ1l_gXL.cjs';
3
- export { h as ExecOptions, E as ExecResult, P as PrefixedSandboxOps, S as Sandbox, c as SandboxCapabilities, d as SandboxCreateOptions, e as SandboxCreateResult, D as SandboxDirentEntry, F as SandboxFileStat, a as SandboxFileSystem, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps, b as SandboxProvider, f as SandboxSnapshot } from './types-DxCpFNv_.cjs';
1
+ export { A as AskUserQuestionArgs, B as BashArgs, F as FileEditArgs, a as FileReadArgs, b as FileWriteArgs, G as GlobArgs, d as GrepArgs, O as ObservabilityHooks, R as ReadSkillArgs, S as SessionEndedEvent, e as SessionStartedEvent, f as SubagentArgs, T as TaskCreateArgs, g as TaskGetArgs, h as TaskListArgs, i as TaskUpdateArgs, j as ToolExecutedEvent, k as TurnCompletedEvent, W as WorkflowConfig, l as WorkflowInput, m as WorkflowSessionInput, Z as ZeitlichObservabilitySinks, n as applyVirtualTreeMutations, o as askUserQuestionTool, p as bashTool, q as composeHooks, r as createAgentStateManager, s as createAskUserQuestionHandler, t as createBashToolDescription, u as createObservabilityHooks, v as createReadSkillHandler, w as createReadSkillTool, x as createSession, y as createTaskCreateHandler, z as createTaskGetHandler, C as createTaskListHandler, D as createTaskUpdateHandler, E as createToolRouter, H as defineSubagent, I as defineSubagentWorkflow, J as defineTool, K as defineWorkflow, L as editTool, M as filesWithMimeType, N as formatVirtualFileTree, P as getShortId, Q as globTool, U as grepTool, V as hasDirectory, X as hasFileWithMimeType, Y as hasNoOtherToolCalls, _ as parseSkillFile, $ as proxyRunAgent, a0 as proxyVirtualFsOps, a1 as readFileTool, a2 as taskCreateTool, a3 as taskGetTool, a4 as taskListTool, a5 as taskUpdateTool, a6 as writeFileTool } from './workflow-Do_lzJpT.cjs';
2
+ export { c as ActivityToolHandler, l as AgentConfig, m as AgentFile, A as AgentResponse, n as AgentState, o as AgentStateManager, p as AgentStatus, q as AppendToolResultFn, B as BaseAgentState, r as FileEntry, F as FileEntryMetadata, i as FileResolver, H as Hooks, I as InferToolResults, s as JsonPrimitive, t as JsonSerializable, J as JsonValue, a as ModelInvoker, M as ModelInvokerConfig, u as ParsedToolCall, v as ParsedToolCallUnion, w as PostHumanMessageAppendHook, x as PostHumanMessageAppendHookContext, y as PostToolUseFailureHook, z as PostToolUseFailureHookContext, C as PostToolUseFailureHookResult, D as PostToolUseHook, E as PostToolUseHookContext, G as PreHumanMessageAppendHook, K as PreHumanMessageAppendHookContext, L as PreToolUseHook, N as PreToolUseHookContext, O as PreToolUseHookResult, P as PrefixedThreadOps, k as PrefixedVirtualFsOps, Q as ProcessToolCallsContext, U as RawToolCall, R as RouterContext, W as RunAgentActivity, e as RunAgentConfig, X as SandboxInit, Y as SandboxShutdown, S as ScopedPrefix, Z as SerializableToolDefinition, _ as SessionConfig, $ as SessionEndHook, a0 as SessionEndHookContext, a1 as SessionExitReason, a2 as SessionResult, a3 as SessionStartHook, a4 as SessionStartHookContext, h as Skill, g as SkillMetadata, f as SkillProvider, a5 as SubagentConfig, a6 as SubagentDefinition, a7 as SubagentFnResult, a8 as SubagentHandlerResponse, a9 as SubagentHooks, aa as SubagentSandboxConfig, ab as SubagentSandboxShutdown, ac as SubagentSessionInput, ad as SubagentWorkflow, ae as SubagentWorkflowInput, af as TaskStatus, ag as ThreadInit, T as ThreadOps, ah as TokenUsage, ai as ToolArgs, aj as ToolCallResult, ak as ToolCallResultUnion, al as ToolDefinition, am as ToolHandler, b as ToolHandlerResponse, an as ToolHooks, ao as ToolMap, ap as ToolNames, aq as ToolResult, d as ToolResultConfig, ar as ToolRouter, as as ToolRouterHooks, at as ToolWithHandler, j as TreeMutation, av as VirtualFileTree, aw as VirtualFsOps, ax as VirtualFsState, ay as WorkflowTask, az as ZeitlichSession, aA as isTerminalStatus } from './types-BO7Yju20.cjs';
3
+ export { h as ExecOptions, E as ExecResult, P as PrefixedSandboxOps, S as Sandbox, c as SandboxCapabilities, d as SandboxCreateOptions, e as SandboxCreateResult, D as SandboxDirentEntry, F as SandboxFileStat, a as SandboxFileSystem, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps, b as SandboxProvider, f as SandboxSnapshot } from './types-tQL9njTu.cjs';
4
4
  import 'zod';
5
5
  import '@temporalio/workflow';
6
6
  import '@temporalio/common';
@@ -1,6 +1,6 @@
1
- export { A as AskUserQuestionArgs, B as BashArgs, F as FileEditArgs, a as FileReadArgs, b as FileWriteArgs, G as GlobArgs, d as GrepArgs, O as ObservabilityHooks, R as ReadSkillArgs, S as SessionEndedEvent, e as SessionStartedEvent, f as SubagentArgs, T as TaskCreateArgs, g as TaskGetArgs, h as TaskListArgs, i as TaskUpdateArgs, j as ToolExecutedEvent, k as TurnCompletedEvent, W as WorkflowConfig, l as WorkflowInput, m as WorkflowSessionInput, Z as ZeitlichObservabilitySinks, n as applyVirtualTreeMutations, o as askUserQuestionTool, p as bashTool, q as composeHooks, r as createAgentStateManager, s as createAskUserQuestionHandler, t as createBashToolDescription, u as createObservabilityHooks, v as createReadSkillHandler, w as createReadSkillTool, x as createSession, y as createTaskCreateHandler, z as createTaskGetHandler, C as createTaskListHandler, D as createTaskUpdateHandler, E as createToolRouter, H as defineSubagent, I as defineSubagentWorkflow, J as defineTool, K as defineWorkflow, L as editTool, M as filesWithMimeType, N as formatVirtualFileTree, P as getShortId, Q as globTool, U as grepTool, V as hasDirectory, X as hasFileWithMimeType, Y as hasNoOtherToolCalls, _ as parseSkillFile, $ as proxyRunAgent, a0 as proxyVirtualFsOps, a1 as readFileTool, a2 as taskCreateTool, a3 as taskGetTool, a4 as taskListTool, a5 as taskUpdateTool, a6 as writeFileTool } from './workflow-P2pTSfKu.js';
2
- export { c as ActivityToolHandler, l as AgentConfig, m as AgentFile, A as AgentResponse, n as AgentState, o as AgentStateManager, p as AgentStatus, q as AppendToolResultFn, B as BaseAgentState, r as FileEntry, F as FileEntryMetadata, i as FileResolver, H as Hooks, I as InferToolResults, s as JsonPrimitive, t as JsonSerializable, J as JsonValue, a as ModelInvoker, M as ModelInvokerConfig, u as ParsedToolCall, v as ParsedToolCallUnion, w as PostHumanMessageAppendHook, x as PostHumanMessageAppendHookContext, y as PostToolUseFailureHook, z as PostToolUseFailureHookContext, C as PostToolUseFailureHookResult, D as PostToolUseHook, E as PostToolUseHookContext, G as PreHumanMessageAppendHook, K as PreHumanMessageAppendHookContext, L as PreToolUseHook, N as PreToolUseHookContext, O as PreToolUseHookResult, P as PrefixedThreadOps, k as PrefixedVirtualFsOps, Q as ProcessToolCallsContext, U as RawToolCall, R as RouterContext, W as RunAgentActivity, e as RunAgentConfig, X as SandboxInit, Y as SandboxShutdown, S as ScopedPrefix, Z as SerializableToolDefinition, _ as SessionConfig, $ as SessionEndHook, a0 as SessionEndHookContext, a1 as SessionExitReason, a2 as SessionResult, a3 as SessionStartHook, a4 as SessionStartHookContext, h as Skill, g as SkillMetadata, f as SkillProvider, a5 as SubagentConfig, a6 as SubagentDefinition, a7 as SubagentFnResult, a8 as SubagentHandlerResponse, a9 as SubagentHooks, aa as SubagentSandboxConfig, ab as SubagentSandboxShutdown, ac as SubagentSessionInput, ad as SubagentWorkflow, ae as SubagentWorkflowInput, af as TaskStatus, ag as ThreadInit, T as ThreadOps, ah as TokenUsage, ai as ToolArgs, aj as ToolCallResult, ak as ToolCallResultUnion, al as ToolDefinition, am as ToolHandler, b as ToolHandlerResponse, an as ToolHooks, ao as ToolMap, ap as ToolNames, aq as ToolResult, d as ToolResultConfig, ar as ToolRouter, as as ToolRouterHooks, at as ToolWithHandler, j as TreeMutation, av as VirtualFileTree, aw as VirtualFsOps, ax as VirtualFsState, ay as WorkflowTask, az as ZeitlichSession, aA as isTerminalStatus } from './types-CADc5V_P.js';
3
- export { h as ExecOptions, E as ExecResult, P as PrefixedSandboxOps, S as Sandbox, c as SandboxCapabilities, d as SandboxCreateOptions, e as SandboxCreateResult, D as SandboxDirentEntry, F as SandboxFileStat, a as SandboxFileSystem, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps, b as SandboxProvider, f as SandboxSnapshot } from './types-DxCpFNv_.js';
1
+ export { A as AskUserQuestionArgs, B as BashArgs, F as FileEditArgs, a as FileReadArgs, b as FileWriteArgs, G as GlobArgs, d as GrepArgs, O as ObservabilityHooks, R as ReadSkillArgs, S as SessionEndedEvent, e as SessionStartedEvent, f as SubagentArgs, T as TaskCreateArgs, g as TaskGetArgs, h as TaskListArgs, i as TaskUpdateArgs, j as ToolExecutedEvent, k as TurnCompletedEvent, W as WorkflowConfig, l as WorkflowInput, m as WorkflowSessionInput, Z as ZeitlichObservabilitySinks, n as applyVirtualTreeMutations, o as askUserQuestionTool, p as bashTool, q as composeHooks, r as createAgentStateManager, s as createAskUserQuestionHandler, t as createBashToolDescription, u as createObservabilityHooks, v as createReadSkillHandler, w as createReadSkillTool, x as createSession, y as createTaskCreateHandler, z as createTaskGetHandler, C as createTaskListHandler, D as createTaskUpdateHandler, E as createToolRouter, H as defineSubagent, I as defineSubagentWorkflow, J as defineTool, K as defineWorkflow, L as editTool, M as filesWithMimeType, N as formatVirtualFileTree, P as getShortId, Q as globTool, U as grepTool, V as hasDirectory, X as hasFileWithMimeType, Y as hasNoOtherToolCalls, _ as parseSkillFile, $ as proxyRunAgent, a0 as proxyVirtualFsOps, a1 as readFileTool, a2 as taskCreateTool, a3 as taskGetTool, a4 as taskListTool, a5 as taskUpdateTool, a6 as writeFileTool } from './workflow-CjXHbZZc.js';
2
+ export { c as ActivityToolHandler, l as AgentConfig, m as AgentFile, A as AgentResponse, n as AgentState, o as AgentStateManager, p as AgentStatus, q as AppendToolResultFn, B as BaseAgentState, r as FileEntry, F as FileEntryMetadata, i as FileResolver, H as Hooks, I as InferToolResults, s as JsonPrimitive, t as JsonSerializable, J as JsonValue, a as ModelInvoker, M as ModelInvokerConfig, u as ParsedToolCall, v as ParsedToolCallUnion, w as PostHumanMessageAppendHook, x as PostHumanMessageAppendHookContext, y as PostToolUseFailureHook, z as PostToolUseFailureHookContext, C as PostToolUseFailureHookResult, D as PostToolUseHook, E as PostToolUseHookContext, G as PreHumanMessageAppendHook, K as PreHumanMessageAppendHookContext, L as PreToolUseHook, N as PreToolUseHookContext, O as PreToolUseHookResult, P as PrefixedThreadOps, k as PrefixedVirtualFsOps, Q as ProcessToolCallsContext, U as RawToolCall, R as RouterContext, W as RunAgentActivity, e as RunAgentConfig, X as SandboxInit, Y as SandboxShutdown, S as ScopedPrefix, Z as SerializableToolDefinition, _ as SessionConfig, $ as SessionEndHook, a0 as SessionEndHookContext, a1 as SessionExitReason, a2 as SessionResult, a3 as SessionStartHook, a4 as SessionStartHookContext, h as Skill, g as SkillMetadata, f as SkillProvider, a5 as SubagentConfig, a6 as SubagentDefinition, a7 as SubagentFnResult, a8 as SubagentHandlerResponse, a9 as SubagentHooks, aa as SubagentSandboxConfig, ab as SubagentSandboxShutdown, ac as SubagentSessionInput, ad as SubagentWorkflow, ae as SubagentWorkflowInput, af as TaskStatus, ag as ThreadInit, T as ThreadOps, ah as TokenUsage, ai as ToolArgs, aj as ToolCallResult, ak as ToolCallResultUnion, al as ToolDefinition, am as ToolHandler, b as ToolHandlerResponse, an as ToolHooks, ao as ToolMap, ap as ToolNames, aq as ToolResult, d as ToolResultConfig, ar as ToolRouter, as as ToolRouterHooks, at as ToolWithHandler, j as TreeMutation, av as VirtualFileTree, aw as VirtualFsOps, ax as VirtualFsState, ay as WorkflowTask, az as ZeitlichSession, aA as isTerminalStatus } from './types-CPKDl-y_.js';
3
+ export { h as ExecOptions, E as ExecResult, P as PrefixedSandboxOps, S as Sandbox, c as SandboxCapabilities, d as SandboxCreateOptions, e as SandboxCreateResult, D as SandboxDirentEntry, F as SandboxFileStat, a as SandboxFileSystem, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps, b as SandboxProvider, f as SandboxSnapshot } from './types-tQL9njTu.js';
4
4
  import 'zod';
5
5
  import '@temporalio/workflow';
6
6
  import '@temporalio/common';
package/dist/workflow.js CHANGED
@@ -1,4 +1,4 @@
1
- import { defineSignal, uuid4, setHandler, defineUpdate, ApplicationFailure, log, condition, defineQuery, proxySinks, workflowInfo, proxyActivities, getExternalWorkflowHandle, startChild } from '@temporalio/workflow';
1
+ import { defineSignal, uuid4, setHandler, defineUpdate, ApplicationFailure, log, condition, defineQuery, proxySinks, workflowInfo, proxyActivities, getExternalWorkflowHandle, executeChild } from '@temporalio/workflow';
2
2
  import z14, { z } from 'zod';
3
3
  import { ApplicationFailure as ApplicationFailure$1 } from '@temporalio/common';
4
4
 
@@ -385,9 +385,7 @@ function createSubagentTool(subagents) {
385
385
  schema
386
386
  };
387
387
  }
388
- var childResultSignal = defineSignal("childResult");
389
388
  var childSandboxReadySignal = defineSignal("childSandboxReady");
390
- var destroySandboxSignal = defineSignal("destroySandbox");
391
389
 
392
390
  // src/lib/subagent/handler.ts
393
391
  function resolveSandboxConfig(config) {
@@ -411,25 +409,27 @@ function resolveSandboxConfig(config) {
411
409
  }
412
410
  function createSubagentHandler(subagents) {
413
411
  const { taskQueue: parentTaskQueue } = workflowInfo();
414
- const childResults = /* @__PURE__ */ new Map();
412
+ const agentSandboxOps = /* @__PURE__ */ new Map();
413
+ for (const cfg of subagents) {
414
+ if (cfg.sandbox && cfg.sandbox !== "none") {
415
+ agentSandboxOps.set(cfg.agentName, cfg.sandbox.proxy(cfg.agentName));
416
+ }
417
+ }
415
418
  const pendingDestroys = /* @__PURE__ */ new Map();
416
419
  const threadSandboxes = /* @__PURE__ */ new Map();
417
420
  const persistentSandboxes = /* @__PURE__ */ new Map();
418
421
  const persistentSandboxCreating = /* @__PURE__ */ new Set();
419
422
  const lazyCreatorAgent = /* @__PURE__ */ new Map();
420
- setHandler(childResultSignal, ({ childWorkflowId, result }) => {
421
- childResults.set(childWorkflowId, result);
422
- });
423
- setHandler(
424
- childSandboxReadySignal,
425
- ({ childWorkflowId, sandboxId }) => {
426
- const agentName = lazyCreatorAgent.get(childWorkflowId);
427
- if (agentName && !persistentSandboxes.has(agentName)) {
428
- persistentSandboxes.set(agentName, sandboxId);
429
- lazyCreatorAgent.delete(childWorkflowId);
430
- }
423
+ const threadSnapshots = /* @__PURE__ */ new Map();
424
+ const persistentBaseSnapshot = /* @__PURE__ */ new Map();
425
+ const persistentBaseSnapshotCreating = /* @__PURE__ */ new Set();
426
+ setHandler(childSandboxReadySignal, ({ childWorkflowId, sandboxId }) => {
427
+ const agentName = lazyCreatorAgent.get(childWorkflowId);
428
+ if (agentName && !persistentSandboxes.has(agentName)) {
429
+ persistentSandboxes.set(agentName, sandboxId);
430
+ lazyCreatorAgent.delete(childWorkflowId);
431
431
  }
432
- );
432
+ });
433
433
  const handler = async (args, context) => {
434
434
  const config = subagents.find((s) => s.agentName === args.subagent);
435
435
  if (!config) {
@@ -440,6 +440,12 @@ function createSubagentHandler(subagents) {
440
440
  const childWorkflowId = `${args.subagent}-${getShortId()}`;
441
441
  const { sandboxId: parentSandboxId } = context;
442
442
  const sandboxCfg = resolveSandboxConfig(config.sandbox);
443
+ if (sandboxCfg.source !== "none" && !agentSandboxOps.has(config.agentName)) {
444
+ throw ApplicationFailure.create({
445
+ message: `Subagent "${config.agentName}" uses a sandbox but no \`sandbox.proxy\` is configured on its SubagentConfig`,
446
+ nonRetryable: true
447
+ });
448
+ }
443
449
  if (sandboxCfg.source === "inherit" && !parentSandboxId) {
444
450
  throw new Error(
445
451
  `Subagent "${config.agentName}" is configured with sandbox: "inherit" but the parent has no sandbox`
@@ -458,12 +464,39 @@ function createSubagentHandler(subagents) {
458
464
  let sandbox;
459
465
  let sandboxShutdownOverride;
460
466
  let isLazyCreator = false;
467
+ let isSnapshotBaseCreator = false;
461
468
  if (sandboxCfg.source === "inherit" && parentSandboxId) {
462
469
  if (sandboxCfg.continuation === "fork") {
463
470
  sandbox = { mode: "fork", sandboxId: parentSandboxId };
471
+ } else if (sandboxCfg.continuation === "snapshot") {
472
+ throw new Error(
473
+ `Subagent "${config.agentName}" has sandbox source "inherit" with continuation "snapshot" \u2014 snapshot continuation is only supported for source "own"`
474
+ );
464
475
  } else {
465
476
  sandbox = { mode: "inherit", sandboxId: parentSandboxId };
466
477
  }
478
+ } else if (sandboxCfg.source === "own" && sandboxCfg.continuation === "snapshot") {
479
+ const isLazy = sandboxCfg.init === "once";
480
+ let baseSnap;
481
+ if (continuationThreadId) {
482
+ baseSnap = threadSnapshots.get(continuationThreadId)?.snapshot;
483
+ }
484
+ if (!baseSnap && isLazy) {
485
+ baseSnap = persistentBaseSnapshot.get(config.agentName);
486
+ if (!baseSnap) {
487
+ if (persistentBaseSnapshotCreating.has(config.agentName)) {
488
+ await condition(() => persistentBaseSnapshot.has(config.agentName));
489
+ baseSnap = persistentBaseSnapshot.get(config.agentName);
490
+ } else {
491
+ persistentBaseSnapshotCreating.add(config.agentName);
492
+ isSnapshotBaseCreator = true;
493
+ }
494
+ }
495
+ }
496
+ if (baseSnap) {
497
+ sandbox = { mode: "from-snapshot", snapshot: baseSnap };
498
+ }
499
+ sandboxShutdownOverride = "snapshot";
467
500
  } else if (sandboxCfg.source === "own") {
468
501
  const isLazy = sandboxCfg.init === "once";
469
502
  let baseSandboxId;
@@ -514,31 +547,8 @@ function createSubagentHandler(subagents) {
514
547
  threadMode,
515
548
  sandboxSource: sandboxCfg.source
516
549
  });
517
- const childHandle = await startChild(config.workflow, childOpts);
550
+ const childResult = await executeChild(config.workflow, childOpts);
518
551
  const effectiveShutdown = sandboxShutdownOverride ?? sandboxCfg.shutdown ?? "destroy";
519
- if (effectiveShutdown === "pause-until-parent-close" || effectiveShutdown === "keep-until-parent-close") {
520
- const key = isLazyCreator ? `persistent:${config.agentName}` : childWorkflowId;
521
- pendingDestroys.set(key, childHandle);
522
- }
523
- await Promise.race([
524
- condition(() => childResults.has(childWorkflowId)),
525
- childHandle.result()
526
- ]);
527
- if (!childResults.has(childWorkflowId)) {
528
- await condition(() => childResults.has(childWorkflowId));
529
- }
530
- const childResult = childResults.get(childWorkflowId);
531
- childResults.delete(childWorkflowId);
532
- if (!childResult) {
533
- log.warn("subagent returned no result", {
534
- subagent: config.agentName,
535
- childWorkflowId
536
- });
537
- return {
538
- toolResponse: "Subagent workflow did not signal a result",
539
- data: null
540
- };
541
- }
542
552
  log.info("subagent completed", {
543
553
  subagent: config.agentName,
544
554
  childWorkflowId,
@@ -550,19 +560,42 @@ function createSubagentHandler(subagents) {
550
560
  usage,
551
561
  threadId: childThreadId,
552
562
  sandboxId: childSandboxId,
563
+ snapshot: childSnapshot,
564
+ baseSnapshot: childBaseSnapshot,
553
565
  metadata
554
566
  } = childResult;
555
567
  if (childSandboxId) {
556
- if (sandboxCfg.source === "own" && sandboxCfg.init === "once" && !persistentSandboxes.has(config.agentName)) {
568
+ if (sandboxCfg.source === "own" && sandboxCfg.init === "once" && sandboxCfg.continuation !== "snapshot" && !persistentSandboxes.has(config.agentName)) {
557
569
  persistentSandboxes.set(config.agentName, childSandboxId);
558
- } else if (allowsContinuation && childThreadId) {
570
+ } else if (allowsContinuation && childThreadId && sandboxCfg.source === "own" && sandboxCfg.continuation !== "snapshot") {
559
571
  threadSandboxes.set(childThreadId, childSandboxId);
560
572
  }
561
573
  }
574
+ if (childSandboxId && (effectiveShutdown === "pause-until-parent-close" || effectiveShutdown === "keep-until-parent-close")) {
575
+ const key = isLazyCreator ? `persistent:${config.agentName}` : childWorkflowId;
576
+ pendingDestroys.set(key, {
577
+ agentName: config.agentName,
578
+ sandboxId: childSandboxId
579
+ });
580
+ }
581
+ if (sandboxCfg.source === "own" && sandboxCfg.continuation === "snapshot") {
582
+ if (childSnapshot && childThreadId) {
583
+ threadSnapshots.set(childThreadId, {
584
+ agentName: config.agentName,
585
+ snapshot: childSnapshot
586
+ });
587
+ }
588
+ if (isSnapshotBaseCreator && childBaseSnapshot && !persistentBaseSnapshot.has(config.agentName)) {
589
+ persistentBaseSnapshot.set(config.agentName, childBaseSnapshot);
590
+ }
591
+ }
562
592
  if (isLazyCreator) {
563
593
  persistentSandboxCreating.delete(config.agentName);
564
594
  lazyCreatorAgent.delete(childWorkflowId);
565
595
  }
596
+ if (isSnapshotBaseCreator) {
597
+ persistentBaseSnapshotCreating.delete(config.agentName);
598
+ }
566
599
  if (!toolResponse) {
567
600
  return {
568
601
  toolResponse: "Subagent workflow returned no response",
@@ -598,22 +631,60 @@ function createSubagentHandler(subagents) {
598
631
  };
599
632
  };
600
633
  const destroySubagentSandboxes = async () => {
601
- const handles = [...pendingDestroys.values()];
634
+ const entries = [...pendingDestroys.values()];
602
635
  pendingDestroys.clear();
603
636
  await Promise.all(
604
- handles.map(async (handle) => {
637
+ entries.map(async ({ agentName, sandboxId }) => {
638
+ const ops = agentSandboxOps.get(agentName);
639
+ if (!ops) {
640
+ log.warn(
641
+ "Skipping sandbox destroy \u2014 no sandbox.proxy registered for agent",
642
+ { agentName, sandboxId }
643
+ );
644
+ return;
645
+ }
605
646
  try {
606
- await handle.signal(destroySandboxSignal);
607
- await handle.result();
647
+ await ops.destroySandbox(sandboxId);
608
648
  } catch (err) {
609
- log.warn("Failed to signal destroySandbox to child workflow", {
649
+ log.warn("Failed to destroy subagent sandbox", {
650
+ agentName,
651
+ sandboxId,
610
652
  error: err
611
653
  });
612
654
  }
613
655
  })
614
656
  );
615
657
  };
616
- return { handler, destroySubagentSandboxes };
658
+ const cleanupSubagentSnapshots = async () => {
659
+ const tagged = [];
660
+ for (const entry of threadSnapshots.values()) tagged.push(entry);
661
+ for (const [agentName, snapshot] of persistentBaseSnapshot.entries()) {
662
+ tagged.push({ agentName, snapshot });
663
+ }
664
+ threadSnapshots.clear();
665
+ persistentBaseSnapshot.clear();
666
+ await Promise.all(
667
+ tagged.map(async ({ agentName, snapshot }) => {
668
+ const ops = agentSandboxOps.get(agentName);
669
+ if (!ops) {
670
+ log.warn(
671
+ "Skipping snapshot delete \u2014 no sandbox.proxy registered for agent",
672
+ { agentName }
673
+ );
674
+ return;
675
+ }
676
+ try {
677
+ await ops.deleteSandboxSnapshot(snapshot);
678
+ } catch (err) {
679
+ log.warn("Failed to delete subagent snapshot", {
680
+ agentName,
681
+ error: err
682
+ });
683
+ }
684
+ })
685
+ );
686
+ };
687
+ return { handler, destroySubagentSandboxes, cleanupSubagentSnapshots };
617
688
  }
618
689
 
619
690
  // src/lib/subagent/register.ts
@@ -627,7 +698,7 @@ function buildSubagentRegistration(subagents) {
627
698
  if (s.hooks) subagentHooksMap.set(s.agentName, s.hooks);
628
699
  }
629
700
  const resolveSubagentName = (args) => args.subagent;
630
- const { handler, destroySubagentSandboxes } = createSubagentHandler(subagents);
701
+ const { handler, destroySubagentSandboxes, cleanupSubagentSnapshots } = createSubagentHandler(subagents);
631
702
  const registration = {
632
703
  name: SUBAGENT_TOOL_NAME,
633
704
  enabled: () => getEnabled().length > 0,
@@ -651,7 +722,7 @@ function buildSubagentRegistration(subagents) {
651
722
  }
652
723
  }
653
724
  };
654
- return { registration, destroySubagentSandboxes };
725
+ return { registration, destroySubagentSandboxes, cleanupSubagentSnapshots };
655
726
  }
656
727
  var READ_SKILL_TOOL_NAME = "ReadSkill";
657
728
  function buildReadSkillDescription(skills) {
@@ -724,9 +795,7 @@ function validateSkillNames(skills) {
724
795
  const names = skills.map((s) => s.name);
725
796
  const dupes = names.filter((n, i) => names.indexOf(n) !== i);
726
797
  if (dupes.length > 0) {
727
- throw new Error(
728
- `Duplicate skill names: ${[...new Set(dupes)].join(", ")}`
729
- );
798
+ throw new Error(`Duplicate skill names: ${[...new Set(dupes)].join(", ")}`);
730
799
  }
731
800
  }
732
801
  function buildSkillRegistration(skills) {
@@ -796,11 +865,13 @@ async function createSession({
796
865
  } = threadOps;
797
866
  const plugins = [];
798
867
  let destroySubagentSandboxes;
868
+ let cleanupSubagentSnapshots;
799
869
  if (subagents) {
800
870
  const result = buildSubagentRegistration(subagents);
801
871
  if (result) {
802
872
  plugins.push(result.registration);
803
873
  destroySubagentSandboxes = result.destroySubagentSandboxes;
874
+ cleanupSubagentSnapshots = result.cleanupSubagentSnapshots;
804
875
  }
805
876
  }
806
877
  if (skills) {
@@ -853,6 +924,9 @@ async function createSession({
853
924
  const sandboxMode = sandboxInit?.mode;
854
925
  let sandboxId;
855
926
  let sandboxOwned = false;
927
+ let baseSnapshot;
928
+ let exitSnapshot;
929
+ let freshlyCreated = false;
856
930
  if (sandboxMode === "inherit") {
857
931
  const inheritInit = sandboxInit;
858
932
  sandboxId = inheritInit.sandboxId;
@@ -885,6 +959,16 @@ async function createSession({
885
959
  sandboxInit.sandboxId
886
960
  );
887
961
  sandboxOwned = true;
962
+ } else if (sandboxMode === "from-snapshot") {
963
+ if (!sandboxOps) {
964
+ throw ApplicationFailure.create({
965
+ message: "No sandboxOps provided \u2014 cannot restore sandbox",
966
+ nonRetryable: true
967
+ });
968
+ }
969
+ const snap = sandboxInit.snapshot;
970
+ sandboxId = await sandboxOps.restoreSandbox(snap);
971
+ sandboxOwned = true;
888
972
  } else if (sandboxOps) {
889
973
  const skillFiles = skills ? collectSkillFiles(skills) : void 0;
890
974
  const ctx = sandboxInit?.ctx;
@@ -893,9 +977,13 @@ async function createSession({
893
977
  if (result) {
894
978
  sandboxId = result.sandboxId;
895
979
  sandboxOwned = true;
980
+ freshlyCreated = true;
896
981
  }
897
982
  }
898
- if (sandboxId && onSandboxReady) {
983
+ if (sandboxId && sandboxOwned && freshlyCreated && sandboxShutdown === "snapshot" && sandboxOps) {
984
+ baseSnapshot = await sandboxOps.snapshotSandbox(sandboxId);
985
+ }
986
+ if (sandboxId && sandboxOwned && onSandboxReady) {
899
987
  onSandboxReady(sandboxId);
900
988
  }
901
989
  if (virtualFsConfig) {
@@ -961,6 +1049,7 @@ async function createSession({
961
1049
  threadKey
962
1050
  );
963
1051
  let exitReason = "completed";
1052
+ let finalMessage = null;
964
1053
  try {
965
1054
  while (stateManager.isRunning() && !stateManager.isTerminal() && stateManager.getTurns() < maxTurns) {
966
1055
  stateManager.incrementTurns();
@@ -987,21 +1076,8 @@ async function createSession({
987
1076
  if (!toolRouter.hasTools() || rawToolCalls.length === 0) {
988
1077
  stateManager.complete();
989
1078
  exitReason = "completed";
990
- log.info("session ended", {
991
- agentName,
992
- threadId,
993
- exitReason,
994
- turns: currentTurn,
995
- durationMs: Date.now() - sessionStartMs,
996
- usage: stateManager.getTotalUsage()
997
- });
998
- return {
999
- threadId,
1000
- finalMessage: message,
1001
- exitReason,
1002
- usage: stateManager.getTotalUsage(),
1003
- sandboxId
1004
- };
1079
+ finalMessage = message;
1080
+ break;
1005
1081
  }
1006
1082
  const parsedToolCalls = [];
1007
1083
  for (const tc of rawToolCalls) {
@@ -1073,11 +1149,21 @@ async function createSession({
1073
1149
  case "pause-until-parent-close":
1074
1150
  await sandboxOps.pauseSandbox(sandboxId);
1075
1151
  break;
1152
+ case "keep":
1153
+ case "keep-until-parent-close":
1154
+ break;
1155
+ case "snapshot":
1156
+ exitSnapshot = await sandboxOps.snapshotSandbox(sandboxId);
1157
+ await sandboxOps.destroySandbox(sandboxId);
1158
+ break;
1076
1159
  }
1077
1160
  }
1078
1161
  if (destroySubagentSandboxes) {
1079
1162
  await destroySubagentSandboxes();
1080
1163
  }
1164
+ if (cleanupSubagentSnapshots) {
1165
+ await cleanupSubagentSnapshots();
1166
+ }
1081
1167
  }
1082
1168
  log.info("session ended", {
1083
1169
  agentName,
@@ -1085,14 +1171,18 @@ async function createSession({
1085
1171
  exitReason,
1086
1172
  turns: stateManager.getTurns(),
1087
1173
  durationMs: Date.now() - sessionStartMs,
1088
- usage: stateManager.getTotalUsage()
1174
+ usage: stateManager.getTotalUsage(),
1175
+ ...baseSnapshot && { hasBaseSnapshot: true },
1176
+ ...exitSnapshot && { hasExitSnapshot: true }
1089
1177
  });
1090
1178
  return {
1091
1179
  threadId,
1092
- finalMessage: null,
1180
+ finalMessage,
1093
1181
  exitReason,
1094
1182
  usage: stateManager.getTotalUsage(),
1095
- sandboxId
1183
+ sandboxId,
1184
+ ...baseSnapshot && { baseSnapshot },
1185
+ ...exitSnapshot && { snapshot: exitSnapshot }
1096
1186
  };
1097
1187
  }
1098
1188
  };
@@ -1303,44 +1393,16 @@ function defineSubagentWorkflow(config, fn) {
1303
1393
  ...workflowInput.thread && { thread: workflowInput.thread },
1304
1394
  ...workflowInput.sandbox && { sandbox: workflowInput.sandbox },
1305
1395
  onSandboxReady: (sandboxId) => {
1306
- void parentHandle.signal(childSandboxReadySignal, {
1307
- childWorkflowId: workflowInfo().workflowId,
1308
- sandboxId
1309
- });
1396
+ const isReuse = workflowInput.sandbox?.mode === "continue";
1397
+ if (!isReuse) {
1398
+ void parentHandle.signal(childSandboxReadySignal, {
1399
+ childWorkflowId: workflowInfo().workflowId,
1400
+ sandboxId
1401
+ });
1402
+ }
1310
1403
  }
1311
1404
  };
1312
- const { destroySandbox, ...result } = await fn(
1313
- prompt,
1314
- sessionInput,
1315
- context ?? {}
1316
- );
1317
- if (effectiveShutdown === "pause-until-parent-close" || effectiveShutdown === "keep-until-parent-close") {
1318
- if (!destroySandbox) {
1319
- throw ApplicationFailure.create({
1320
- message: `Subagent "${config.name}" has sandboxShutdown="${effectiveShutdown}" but fn did not return a destroySandbox callback`,
1321
- nonRetryable: true
1322
- });
1323
- }
1324
- if (!result.sandboxId) {
1325
- throw ApplicationFailure.create({
1326
- message: `Subagent "${config.name}" has sandboxShutdown="${effectiveShutdown}" but fn did not return a sandboxId`,
1327
- nonRetryable: true
1328
- });
1329
- }
1330
- }
1331
- await parentHandle.signal(childResultSignal, {
1332
- childWorkflowId: workflowInfo().workflowId,
1333
- result
1334
- });
1335
- if (destroySandbox) {
1336
- let destroyRequested = false;
1337
- setHandler(destroySandboxSignal, () => {
1338
- destroyRequested = true;
1339
- });
1340
- await condition(() => destroyRequested);
1341
- await destroySandbox();
1342
- }
1343
- return result;
1405
+ return fn(prompt, sessionInput, context ?? {});
1344
1406
  };
1345
1407
  Object.defineProperty(workflow, "name", { value: config.name });
1346
1408
  return Object.assign(workflow, {
@@ -1450,9 +1512,7 @@ function applyVirtualTreeMutations(stateManager, mutations) {
1450
1512
  tree = tree.filter((e) => e.path !== m.path);
1451
1513
  break;
1452
1514
  case "update":
1453
- tree = tree.map(
1454
- (e) => e.path === m.path ? { ...e, ...m.entry } : e
1455
- );
1515
+ tree = tree.map((e) => e.path === m.path ? { ...e, ...m.entry } : e);
1456
1516
  break;
1457
1517
  }
1458
1518
  }
@@ -1511,7 +1571,9 @@ function formatVirtualFileTree(entries, opts = {}) {
1511
1571
  // src/lib/virtual-fs/queries.ts
1512
1572
  function hasFileWithMimeType(stateManager, pattern) {
1513
1573
  const tree = stateManager.get("fileTree");
1514
- const matchers = (Array.isArray(pattern) ? pattern : [pattern]).map(buildMatcher);
1574
+ const matchers = (Array.isArray(pattern) ? pattern : [pattern]).map(
1575
+ buildMatcher
1576
+ );
1515
1577
  return tree.some((entry) => {
1516
1578
  const meta = entry.metadata;
1517
1579
  const mime = meta?.mimeType;
@@ -1572,7 +1634,9 @@ function proxyVirtualFsOps(scope, options) {
1572
1634
  // src/lib/skills/parse.ts
1573
1635
  function parseSkillFile(raw) {
1574
1636
  const trimmed = raw.replace(/^\uFEFF/, "");
1575
- const match = trimmed.match(/^---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*\r?\n?([\s\S]*)$/);
1637
+ const match = trimmed.match(
1638
+ /^---[ \t]*\r?\n([\s\S]*?)\r?\n---[ \t]*\r?\n?([\s\S]*)$/
1639
+ );
1576
1640
  if (!match) {
1577
1641
  throw new Error(
1578
1642
  "SKILL.md must start with YAML frontmatter delimited by ---"
@@ -1844,7 +1908,9 @@ function createTaskGetHandler(stateManager) {
1844
1908
  const task = stateManager.getTask(args.taskId) ?? null;
1845
1909
  if (!task) {
1846
1910
  return {
1847
- toolResponse: JSON.stringify({ error: `Task not found: ${args.taskId}` }),
1911
+ toolResponse: JSON.stringify({
1912
+ error: `Task not found: ${args.taskId}`
1913
+ }),
1848
1914
  data: null
1849
1915
  };
1850
1916
  }
@@ -1887,7 +1953,9 @@ function createTaskUpdateHandler(stateManager) {
1887
1953
  const task = stateManager.getTask(args.taskId);
1888
1954
  if (!task) {
1889
1955
  return {
1890
- toolResponse: JSON.stringify({ error: `Task not found: ${args.taskId}` }),
1956
+ toolResponse: JSON.stringify({
1957
+ error: `Task not found: ${args.taskId}`
1958
+ }),
1891
1959
  data: null
1892
1960
  };
1893
1961
  }