zeitlich 0.2.37 → 0.2.39

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 (172) hide show
  1. package/README.md +18 -0
  2. package/dist/{activities-Bb-nAjwQ.d.ts → activities-Bmu7XnaG.d.ts} +4 -4
  3. package/dist/{activities-vkI4_3CC.d.cts → activities-ByBFLvm2.d.cts} +4 -4
  4. package/dist/adapter-id-BB-mmrts.d.cts +17 -0
  5. package/dist/adapter-id-BB-mmrts.d.ts +17 -0
  6. package/dist/adapter-id-CMwVrVqv.d.cts +17 -0
  7. package/dist/adapter-id-CMwVrVqv.d.ts +17 -0
  8. package/dist/adapter-id-CbY2zeSt.d.cts +17 -0
  9. package/dist/adapter-id-CbY2zeSt.d.ts +17 -0
  10. package/dist/adapters/sandbox/bedrock/index.cjs +3 -3
  11. package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -1
  12. package/dist/adapters/sandbox/bedrock/index.d.cts +6 -6
  13. package/dist/adapters/sandbox/bedrock/index.d.ts +6 -6
  14. package/dist/adapters/sandbox/bedrock/index.js +3 -3
  15. package/dist/adapters/sandbox/bedrock/index.js.map +1 -1
  16. package/dist/adapters/sandbox/bedrock/workflow.d.cts +2 -2
  17. package/dist/adapters/sandbox/bedrock/workflow.d.ts +2 -2
  18. package/dist/adapters/sandbox/daytona/index.cjs +3 -3
  19. package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
  20. package/dist/adapters/sandbox/daytona/index.d.cts +4 -4
  21. package/dist/adapters/sandbox/daytona/index.d.ts +4 -4
  22. package/dist/adapters/sandbox/daytona/index.js +3 -3
  23. package/dist/adapters/sandbox/daytona/index.js.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/e2b/index.cjs +26 -14
  27. package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
  28. package/dist/adapters/sandbox/e2b/index.d.cts +24 -4
  29. package/dist/adapters/sandbox/e2b/index.d.ts +24 -4
  30. package/dist/adapters/sandbox/e2b/index.js +26 -14
  31. package/dist/adapters/sandbox/e2b/index.js.map +1 -1
  32. package/dist/adapters/sandbox/e2b/workflow.d.cts +1 -1
  33. package/dist/adapters/sandbox/e2b/workflow.d.ts +1 -1
  34. package/dist/adapters/sandbox/inmemory/index.cjs +3 -3
  35. package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
  36. package/dist/adapters/sandbox/inmemory/index.d.cts +4 -4
  37. package/dist/adapters/sandbox/inmemory/index.d.ts +4 -4
  38. package/dist/adapters/sandbox/inmemory/index.js +3 -3
  39. package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
  40. package/dist/adapters/sandbox/inmemory/workflow.d.cts +1 -1
  41. package/dist/adapters/sandbox/inmemory/workflow.d.ts +1 -1
  42. package/dist/adapters/thread/anthropic/index.cjs +150 -13
  43. package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
  44. package/dist/adapters/thread/anthropic/index.d.cts +9 -8
  45. package/dist/adapters/thread/anthropic/index.d.ts +9 -8
  46. package/dist/adapters/thread/anthropic/index.js +150 -14
  47. package/dist/adapters/thread/anthropic/index.js.map +1 -1
  48. package/dist/adapters/thread/anthropic/workflow.cjs +9 -3
  49. package/dist/adapters/thread/anthropic/workflow.cjs.map +1 -1
  50. package/dist/adapters/thread/anthropic/workflow.d.cts +6 -5
  51. package/dist/adapters/thread/anthropic/workflow.d.ts +6 -5
  52. package/dist/adapters/thread/anthropic/workflow.js +9 -4
  53. package/dist/adapters/thread/anthropic/workflow.js.map +1 -1
  54. package/dist/adapters/thread/google-genai/index.cjs +154 -13
  55. package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
  56. package/dist/adapters/thread/google-genai/index.d.cts +6 -5
  57. package/dist/adapters/thread/google-genai/index.d.ts +6 -5
  58. package/dist/adapters/thread/google-genai/index.js +154 -14
  59. package/dist/adapters/thread/google-genai/index.js.map +1 -1
  60. package/dist/adapters/thread/google-genai/workflow.cjs +9 -3
  61. package/dist/adapters/thread/google-genai/workflow.cjs.map +1 -1
  62. package/dist/adapters/thread/google-genai/workflow.d.cts +6 -5
  63. package/dist/adapters/thread/google-genai/workflow.d.ts +6 -5
  64. package/dist/adapters/thread/google-genai/workflow.js +9 -4
  65. package/dist/adapters/thread/google-genai/workflow.js.map +1 -1
  66. package/dist/adapters/thread/index.cjs +16 -0
  67. package/dist/adapters/thread/index.cjs.map +1 -0
  68. package/dist/adapters/thread/index.d.cts +34 -0
  69. package/dist/adapters/thread/index.d.ts +34 -0
  70. package/dist/adapters/thread/index.js +12 -0
  71. package/dist/adapters/thread/index.js.map +1 -0
  72. package/dist/adapters/thread/langchain/index.cjs +149 -14
  73. package/dist/adapters/thread/langchain/index.cjs.map +1 -1
  74. package/dist/adapters/thread/langchain/index.d.cts +9 -8
  75. package/dist/adapters/thread/langchain/index.d.ts +9 -8
  76. package/dist/adapters/thread/langchain/index.js +149 -15
  77. package/dist/adapters/thread/langchain/index.js.map +1 -1
  78. package/dist/adapters/thread/langchain/workflow.cjs +9 -3
  79. package/dist/adapters/thread/langchain/workflow.cjs.map +1 -1
  80. package/dist/adapters/thread/langchain/workflow.d.cts +6 -5
  81. package/dist/adapters/thread/langchain/workflow.d.ts +6 -5
  82. package/dist/adapters/thread/langchain/workflow.js +9 -4
  83. package/dist/adapters/thread/langchain/workflow.js.map +1 -1
  84. package/dist/index.cjs +367 -59
  85. package/dist/index.cjs.map +1 -1
  86. package/dist/index.d.cts +11 -11
  87. package/dist/index.d.ts +11 -11
  88. package/dist/index.js +365 -61
  89. package/dist/index.js.map +1 -1
  90. package/dist/{proxy-DEtowJyd.d.cts → proxy-BAKzNGRq.d.cts} +1 -1
  91. package/dist/{proxy-0smGKvx8.d.ts → proxy-DO_MXbY4.d.ts} +1 -1
  92. package/dist/{thread-manager-C-C4pI2z.d.ts → thread-manager-CcRXasqs.d.ts} +2 -2
  93. package/dist/{thread-manager-D4vgzYrh.d.cts → thread-manager-ClwSaUnj.d.cts} +2 -2
  94. package/dist/{thread-manager-3fszQih4.d.ts → thread-manager-D-7lp1JK.d.ts} +2 -2
  95. package/dist/{thread-manager-CzYln2OC.d.cts → thread-manager-Y8Ucf0Tf.d.cts} +2 -2
  96. package/dist/{types-CPKDl-y_.d.ts → types-Bcbiq8iv.d.cts} +195 -22
  97. package/dist/{types-CNuWnvy9.d.ts → types-DAsQ21Rt.d.ts} +1 -1
  98. package/dist/{types-B37hKoWA.d.ts → types-DpHTX-iO.d.ts} +58 -1
  99. package/dist/{types-BO7Yju20.d.cts → types-Dt8-HBBT.d.ts} +195 -22
  100. package/dist/{types-D08CXPh8.d.cts → types-hFFi-Zd9.d.cts} +58 -1
  101. package/dist/{types-DWEUmYAJ.d.cts → types-lm8tMNJQ.d.cts} +1 -1
  102. package/dist/{types-tQL9njTu.d.cts → types-yx0LzPGn.d.cts} +21 -7
  103. package/dist/{types-tQL9njTu.d.ts → types-yx0LzPGn.d.ts} +21 -7
  104. package/dist/{workflow-CjXHbZZc.d.ts → workflow-Bmf9EtDW.d.ts} +83 -3
  105. package/dist/{workflow-Do_lzJpT.d.cts → workflow-Bx9utBwb.d.cts} +83 -3
  106. package/dist/workflow.cjs +266 -39
  107. package/dist/workflow.cjs.map +1 -1
  108. package/dist/workflow.d.cts +3 -3
  109. package/dist/workflow.d.ts +3 -3
  110. package/dist/workflow.js +264 -41
  111. package/dist/workflow.js.map +1 -1
  112. package/package.json +12 -2
  113. package/src/adapters/sandbox/bedrock/index.ts +12 -3
  114. package/src/adapters/sandbox/daytona/index.ts +12 -3
  115. package/src/adapters/sandbox/e2b/index.ts +36 -14
  116. package/src/adapters/sandbox/e2b/types.ts +16 -0
  117. package/src/adapters/sandbox/inmemory/index.ts +12 -3
  118. package/src/adapters/thread/adapter-id.test.ts +42 -0
  119. package/src/adapters/thread/anthropic/activities.ts +40 -5
  120. package/src/adapters/thread/anthropic/adapter-id.ts +16 -0
  121. package/src/adapters/thread/anthropic/fork-transform.test.ts +291 -0
  122. package/src/adapters/thread/anthropic/index.ts +3 -0
  123. package/src/adapters/thread/anthropic/model-invoker.ts +7 -1
  124. package/src/adapters/thread/anthropic/proxy.ts +3 -2
  125. package/src/adapters/thread/anthropic/thread-manager.ts +27 -1
  126. package/src/adapters/thread/google-genai/activities.ts +44 -5
  127. package/src/adapters/thread/google-genai/adapter-id.ts +16 -0
  128. package/src/adapters/thread/google-genai/fork-transform.test.ts +149 -0
  129. package/src/adapters/thread/google-genai/index.ts +3 -0
  130. package/src/adapters/thread/google-genai/model-invoker.ts +8 -2
  131. package/src/adapters/thread/google-genai/proxy.ts +3 -2
  132. package/src/adapters/thread/google-genai/thread-manager.ts +27 -1
  133. package/src/adapters/thread/index.ts +39 -0
  134. package/src/adapters/thread/langchain/activities.ts +40 -5
  135. package/src/adapters/thread/langchain/adapter-id.ts +16 -0
  136. package/src/adapters/thread/langchain/fork-transform.test.ts +142 -0
  137. package/src/adapters/thread/langchain/index.ts +3 -0
  138. package/src/adapters/thread/langchain/model-invoker.ts +7 -1
  139. package/src/adapters/thread/langchain/proxy.ts +3 -2
  140. package/src/adapters/thread/langchain/thread-manager.ts +27 -1
  141. package/src/lib/lifecycle.ts +14 -5
  142. package/src/lib/model/types.ts +7 -0
  143. package/src/lib/sandbox/manager.ts +26 -18
  144. package/src/lib/sandbox/types.ts +27 -7
  145. package/src/lib/session/session-edge-cases.integration.test.ts +336 -4
  146. package/src/lib/session/session.integration.test.ts +192 -2
  147. package/src/lib/session/session.ts +102 -8
  148. package/src/lib/session/types.ts +66 -3
  149. package/src/lib/state/index.ts +1 -0
  150. package/src/lib/state/manager.integration.test.ts +109 -0
  151. package/src/lib/state/manager.ts +38 -8
  152. package/src/lib/state/types.ts +25 -0
  153. package/src/lib/subagent/handler.ts +124 -11
  154. package/src/lib/subagent/index.ts +5 -1
  155. package/src/lib/subagent/subagent.integration.test.ts +628 -104
  156. package/src/lib/subagent/types.ts +63 -14
  157. package/src/lib/subagent/workflow.ts +29 -2
  158. package/src/lib/thread/index.ts +5 -0
  159. package/src/lib/thread/keys.test.ts +101 -0
  160. package/src/lib/thread/keys.ts +94 -0
  161. package/src/lib/thread/manager.test.ts +139 -0
  162. package/src/lib/thread/manager.ts +105 -9
  163. package/src/lib/thread/proxy.ts +3 -0
  164. package/src/lib/thread/types.ts +64 -1
  165. package/src/lib/tool-router/index.ts +2 -0
  166. package/src/lib/tool-router/router-edge-cases.integration.test.ts +92 -0
  167. package/src/lib/tool-router/router.integration.test.ts +12 -0
  168. package/src/lib/tool-router/router.ts +89 -16
  169. package/src/lib/tool-router/types.ts +42 -1
  170. package/src/lib/types.ts +12 -0
  171. package/src/workflow.ts +14 -1
  172. package/tsup.config.ts +1 -0
@@ -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-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';
1
+ export { A as AskUserQuestionArgs, B as BashArgs, D as DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT, 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 THREAD_TTL_SECONDS, g as TaskCreateArgs, h as TaskGetArgs, i as TaskListArgs, j as TaskUpdateArgs, k as ToolExecutedEvent, l as TurnCompletedEvent, W as WorkflowConfig, m as WorkflowInput, n as WorkflowSessionInput, Z as ZeitlichObservabilitySinks, o as applyVirtualTreeMutations, p as askUserQuestionTool, q as bashTool, r as composeHooks, s as createAgentStateManager, t as createAskUserQuestionHandler, u as createBashToolDescription, v as createObservabilityHooks, w as createReadSkillHandler, x as createReadSkillTool, y as createSession, z as createTaskCreateHandler, C as createTaskGetHandler, E as createTaskListHandler, H as createTaskUpdateHandler, I as createToolRouter, J as defineSubagent, K as defineSubagentWorkflow, L as defineTool, M as defineWorkflow, N as editTool, P as filesWithMimeType, Q as formatVirtualFileTree, U as getShortId, V as getThreadListKey, X as getThreadMetaKey, Y as globTool, _ as grepTool, $ as hasDirectory, a0 as hasFileWithMimeType, a1 as hasNoOtherToolCalls, a2 as parseSkillFile, a3 as proxyRunAgent, a4 as proxyVirtualFsOps, a5 as readFileTool, a6 as taskCreateTool, a7 as taskGetTool, a8 as taskListTool, a9 as taskUpdateTool, aa as writeFileTool } from './workflow-Bx9utBwb.cjs';
2
+ export { d as ActivityToolHandler, m as AgentConfig, n as AgentFile, A as AgentResponse, o as AgentState, p as AgentStateManager, q as AgentStatus, r as AppendToolResultFn, B as BaseAgentState, s as FileEntry, F as FileEntryMetadata, j as FileResolver, H as Hooks, I as InferToolResults, t as JsonPrimitive, u as JsonSerializable, J as JsonValue, a as ModelInvoker, M as ModelInvokerConfig, v as ParsedToolCall, w as ParsedToolCallUnion, P as PersistedThreadState, x as PostHumanMessageAppendHook, y as PostHumanMessageAppendHookContext, z as PostToolUseFailureHook, C as PostToolUseFailureHookContext, D as PostToolUseFailureHookResult, E as PostToolUseHook, G as PostToolUseHookContext, K as PreHumanMessageAppendHook, L as PreHumanMessageAppendHookContext, N as PreToolUseHook, O as PreToolUseHookContext, Q as PreToolUseHookResult, b as PrefixedThreadOps, l as PrefixedVirtualFsOps, U as ProcessToolCallsContext, W as ProcessToolCallsResult, X as RawToolCall, Y as RewindSignal, R as RouterContext, Z as RunAgentActivity, f as RunAgentConfig, _ as SandboxInit, $ as SandboxShutdown, S as ScopedPrefix, a0 as SerializableToolDefinition, a1 as SessionConfig, a2 as SessionEndHook, a3 as SessionEndHookContext, a4 as SessionExitReason, a5 as SessionResult, a6 as SessionStartHook, a7 as SessionStartHookContext, i as Skill, h as SkillMetadata, g as SkillProvider, a8 as SubagentChildWorkflowOptions, a9 as SubagentConfig, aa as SubagentDefinition, ab as SubagentFnResult, ac as SubagentHandlerResponse, ad as SubagentHooks, ae as SubagentSandboxConfig, af as SubagentSandboxShutdown, ag as SubagentSessionInput, ah as SubagentWorkflow, ai as SubagentWorkflowInput, aj as TaskStatus, ak as ThreadInit, T as ThreadOps, al as TokenUsage, am as ToolArgs, an as ToolCallResult, ao as ToolCallResultUnion, ap as ToolDefinition, aq as ToolHandler, c as ToolHandlerResponse, ar as ToolHooks, as as ToolMap, at as ToolNames, au as ToolResult, e as ToolResultConfig, av as ToolRouter, aw as ToolRouterHooks, ax as ToolWithHandler, k as TreeMutation, az as VirtualFileTree, aA as VirtualFsOps, aB as VirtualFsState, aC as WorkflowTask, aD as ZeitlichSession, aE as isTerminalStatus } from './types-Bcbiq8iv.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-yx0LzPGn.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-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';
1
+ export { A as AskUserQuestionArgs, B as BashArgs, D as DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT, 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 THREAD_TTL_SECONDS, g as TaskCreateArgs, h as TaskGetArgs, i as TaskListArgs, j as TaskUpdateArgs, k as ToolExecutedEvent, l as TurnCompletedEvent, W as WorkflowConfig, m as WorkflowInput, n as WorkflowSessionInput, Z as ZeitlichObservabilitySinks, o as applyVirtualTreeMutations, p as askUserQuestionTool, q as bashTool, r as composeHooks, s as createAgentStateManager, t as createAskUserQuestionHandler, u as createBashToolDescription, v as createObservabilityHooks, w as createReadSkillHandler, x as createReadSkillTool, y as createSession, z as createTaskCreateHandler, C as createTaskGetHandler, E as createTaskListHandler, H as createTaskUpdateHandler, I as createToolRouter, J as defineSubagent, K as defineSubagentWorkflow, L as defineTool, M as defineWorkflow, N as editTool, P as filesWithMimeType, Q as formatVirtualFileTree, U as getShortId, V as getThreadListKey, X as getThreadMetaKey, Y as globTool, _ as grepTool, $ as hasDirectory, a0 as hasFileWithMimeType, a1 as hasNoOtherToolCalls, a2 as parseSkillFile, a3 as proxyRunAgent, a4 as proxyVirtualFsOps, a5 as readFileTool, a6 as taskCreateTool, a7 as taskGetTool, a8 as taskListTool, a9 as taskUpdateTool, aa as writeFileTool } from './workflow-Bmf9EtDW.js';
2
+ export { d as ActivityToolHandler, m as AgentConfig, n as AgentFile, A as AgentResponse, o as AgentState, p as AgentStateManager, q as AgentStatus, r as AppendToolResultFn, B as BaseAgentState, s as FileEntry, F as FileEntryMetadata, j as FileResolver, H as Hooks, I as InferToolResults, t as JsonPrimitive, u as JsonSerializable, J as JsonValue, a as ModelInvoker, M as ModelInvokerConfig, v as ParsedToolCall, w as ParsedToolCallUnion, P as PersistedThreadState, x as PostHumanMessageAppendHook, y as PostHumanMessageAppendHookContext, z as PostToolUseFailureHook, C as PostToolUseFailureHookContext, D as PostToolUseFailureHookResult, E as PostToolUseHook, G as PostToolUseHookContext, K as PreHumanMessageAppendHook, L as PreHumanMessageAppendHookContext, N as PreToolUseHook, O as PreToolUseHookContext, Q as PreToolUseHookResult, b as PrefixedThreadOps, l as PrefixedVirtualFsOps, U as ProcessToolCallsContext, W as ProcessToolCallsResult, X as RawToolCall, Y as RewindSignal, R as RouterContext, Z as RunAgentActivity, f as RunAgentConfig, _ as SandboxInit, $ as SandboxShutdown, S as ScopedPrefix, a0 as SerializableToolDefinition, a1 as SessionConfig, a2 as SessionEndHook, a3 as SessionEndHookContext, a4 as SessionExitReason, a5 as SessionResult, a6 as SessionStartHook, a7 as SessionStartHookContext, i as Skill, h as SkillMetadata, g as SkillProvider, a8 as SubagentChildWorkflowOptions, a9 as SubagentConfig, aa as SubagentDefinition, ab as SubagentFnResult, ac as SubagentHandlerResponse, ad as SubagentHooks, ae as SubagentSandboxConfig, af as SubagentSandboxShutdown, ag as SubagentSessionInput, ah as SubagentWorkflow, ai as SubagentWorkflowInput, aj as TaskStatus, ak as ThreadInit, T as ThreadOps, al as TokenUsage, am as ToolArgs, an as ToolCallResult, ao as ToolCallResultUnion, ap as ToolDefinition, aq as ToolHandler, c as ToolHandlerResponse, ar as ToolHooks, as as ToolMap, at as ToolNames, au as ToolResult, e as ToolResultConfig, av as ToolRouter, aw as ToolRouterHooks, ax as ToolWithHandler, k as TreeMutation, az as VirtualFileTree, aA as VirtualFsOps, aB as VirtualFsState, aC as WorkflowTask, aD as ZeitlichSession, aE as isTerminalStatus } from './types-Dt8-HBBT.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-yx0LzPGn.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, executeChild } from '@temporalio/workflow';
1
+ import { defineSignal, CancellationScope, isCancellation, 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
 
@@ -107,7 +107,7 @@ function createToolRouter(options) {
107
107
  });
108
108
  }
109
109
  }
110
- async function processToolCall(toolCall, turn, sandboxId) {
110
+ async function processToolCall(toolCall, turn, sandboxId, onRewindRequested) {
111
111
  const startTime = Date.now();
112
112
  const tool = toolMap.get(toolCall.name);
113
113
  const preResult = await runPreHooks(toolCall, tool, turn);
@@ -122,7 +122,7 @@ function createToolRouter(options) {
122
122
  reason: "Skipped by PreToolUse hook"
123
123
  })
124
124
  });
125
- return null;
125
+ return { kind: "skipped" };
126
126
  }
127
127
  const effectiveArgs = preResult.args;
128
128
  log.debug("tool call dispatched", {
@@ -134,6 +134,7 @@ function createToolRouter(options) {
134
134
  let content;
135
135
  let resultAppended = false;
136
136
  let metadata;
137
+ let rewindRequested = false;
137
138
  try {
138
139
  if (tool) {
139
140
  const routerContext = {
@@ -151,11 +152,15 @@ function createToolRouter(options) {
151
152
  content = response.toolResponse;
152
153
  resultAppended = response.resultAppended === true;
153
154
  metadata = response.metadata;
155
+ rewindRequested = response.rewind === true;
154
156
  } else {
155
157
  result = { error: `Unknown tool: ${toolCall.name}` };
156
158
  content = JSON.stringify(result, null, 2);
157
159
  }
158
160
  } catch (error) {
161
+ if (isCancellation(error)) {
162
+ throw error;
163
+ }
159
164
  log.warn("tool call failed", {
160
165
  toolName: toolCall.name,
161
166
  toolCallId: toolCall.id,
@@ -173,6 +178,15 @@ function createToolRouter(options) {
173
178
  result = recovery.result;
174
179
  content = recovery.content;
175
180
  }
181
+ if (rewindRequested) {
182
+ const signal = {
183
+ toolCallId: toolCall.id,
184
+ toolName: toolCall.name
185
+ };
186
+ log.info("tool requested rewind", { ...signal });
187
+ onRewindRequested?.(signal);
188
+ return { kind: "rewind", signal };
189
+ }
176
190
  if (!resultAppended) {
177
191
  const config = {
178
192
  threadId: options.threadId,
@@ -209,7 +223,7 @@ function createToolRouter(options) {
209
223
  turn,
210
224
  durationMs
211
225
  );
212
- return toolResult;
226
+ return { kind: "result", value: toolResult };
213
227
  }
214
228
  return {
215
229
  hasTools() {
@@ -244,27 +258,59 @@ function createToolRouter(options) {
244
258
  }));
245
259
  },
246
260
  async processToolCalls(toolCalls, context) {
261
+ const attachRewind = (arr, rewind) => {
262
+ if (rewind) {
263
+ arr.rewind = rewind;
264
+ }
265
+ return arr;
266
+ };
247
267
  if (toolCalls.length === 0) {
248
- return [];
268
+ return attachRewind([], void 0);
249
269
  }
250
270
  const turn = context?.turn ?? 0;
251
271
  const sandboxId = context?.sandboxId;
272
+ let rewindSignal;
252
273
  if (options.parallel) {
253
- const results2 = await Promise.all(
254
- toolCalls.map((tc) => processToolCall(tc, turn, sandboxId))
255
- );
256
- return results2.filter(
257
- (r) => r !== null
274
+ const scope = new CancellationScope({ cancellable: true });
275
+ const onRewindRequested = (signal) => {
276
+ if (!rewindSignal) {
277
+ rewindSignal = signal;
278
+ scope.cancel();
279
+ }
280
+ };
281
+ const outcomes = await scope.run(
282
+ async () => Promise.allSettled(
283
+ toolCalls.map(
284
+ (tc) => processToolCall(tc, turn, sandboxId, onRewindRequested)
285
+ )
286
+ )
258
287
  );
288
+ const results2 = [];
289
+ for (const outcome of outcomes) {
290
+ if (outcome.status === "rejected") {
291
+ if (isCancellation(outcome.reason)) {
292
+ continue;
293
+ }
294
+ throw outcome.reason;
295
+ }
296
+ if (outcome.value.kind === "result") {
297
+ results2.push(outcome.value.value);
298
+ }
299
+ }
300
+ return attachRewind(results2, rewindSignal);
259
301
  }
260
302
  const results = [];
261
303
  for (const toolCall of toolCalls) {
262
- const result = await processToolCall(toolCall, turn, sandboxId);
263
- if (result !== null) {
264
- results.push(result);
304
+ const outcome = await processToolCall(toolCall, turn, sandboxId);
305
+ if (outcome.kind === "rewind") {
306
+ rewindSignal = outcome.signal;
307
+ break;
308
+ }
309
+ if (outcome.kind === "result") {
310
+ results.push(outcome.value);
265
311
  }
266
312
  }
267
- return results;
313
+ return attachRewind(results, rewindSignal);
268
314
  },
269
315
  async processToolCallsByName(toolCalls, toolName, handler, context) {
270
316
  const matchingCalls = toolCalls.filter((tc) => tc.name === toolName);
@@ -388,6 +434,7 @@ function createSubagentTool(subagents) {
388
434
  var childSandboxReadySignal = defineSignal("childSandboxReady");
389
435
 
390
436
  // src/lib/subagent/handler.ts
437
+ var DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT = "1h";
391
438
  function resolveSandboxConfig(config) {
392
439
  if (!config || config === "none") {
393
440
  return { source: "none", init: "per-call", continuation: "fork" };
@@ -419,17 +466,28 @@ function createSubagentHandler(subagents) {
419
466
  const threadSandboxes = /* @__PURE__ */ new Map();
420
467
  const persistentSandboxes = /* @__PURE__ */ new Map();
421
468
  const persistentSandboxCreating = /* @__PURE__ */ new Set();
469
+ const persistentSandboxCreationError = /* @__PURE__ */ new Map();
422
470
  const lazyCreatorAgent = /* @__PURE__ */ new Map();
471
+ const snapshotBaseCreatorAgent = /* @__PURE__ */ new Map();
423
472
  const threadSnapshots = /* @__PURE__ */ new Map();
424
473
  const persistentBaseSnapshot = /* @__PURE__ */ new Map();
425
474
  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);
475
+ const persistentBaseSnapshotCreationError = /* @__PURE__ */ new Map();
476
+ setHandler(
477
+ childSandboxReadySignal,
478
+ ({ childWorkflowId, sandboxId, baseSnapshot }) => {
479
+ const lazyAgent = lazyCreatorAgent.get(childWorkflowId);
480
+ if (lazyAgent && !persistentSandboxes.has(lazyAgent)) {
481
+ persistentSandboxes.set(lazyAgent, sandboxId);
482
+ lazyCreatorAgent.delete(childWorkflowId);
483
+ }
484
+ const snapAgent = snapshotBaseCreatorAgent.get(childWorkflowId);
485
+ if (snapAgent && baseSnapshot && !persistentBaseSnapshot.has(snapAgent)) {
486
+ persistentBaseSnapshot.set(snapAgent, baseSnapshot);
487
+ snapshotBaseCreatorAgent.delete(childWorkflowId);
488
+ }
431
489
  }
432
- });
490
+ );
433
491
  const handler = async (args, context) => {
434
492
  const config = subagents.find((s) => s.agentName === args.subagent);
435
493
  if (!config) {
@@ -485,8 +543,20 @@ function createSubagentHandler(subagents) {
485
543
  baseSnap = persistentBaseSnapshot.get(config.agentName);
486
544
  if (!baseSnap) {
487
545
  if (persistentBaseSnapshotCreating.has(config.agentName)) {
488
- await condition(() => persistentBaseSnapshot.has(config.agentName));
546
+ await condition(
547
+ () => persistentBaseSnapshot.has(config.agentName) || persistentBaseSnapshotCreationError.has(config.agentName) || !persistentBaseSnapshotCreating.has(config.agentName)
548
+ );
549
+ const creatorErr = persistentBaseSnapshotCreationError.get(
550
+ config.agentName
551
+ );
552
+ if (creatorErr !== void 0) {
553
+ throw creatorErr;
554
+ }
489
555
  baseSnap = persistentBaseSnapshot.get(config.agentName);
556
+ if (!baseSnap) {
557
+ persistentBaseSnapshotCreating.add(config.agentName);
558
+ isSnapshotBaseCreator = true;
559
+ }
490
560
  } else {
491
561
  persistentBaseSnapshotCreating.add(config.agentName);
492
562
  isSnapshotBaseCreator = true;
@@ -504,8 +574,20 @@ function createSubagentHandler(subagents) {
504
574
  baseSandboxId = persistentSandboxes.get(config.agentName);
505
575
  if (!baseSandboxId) {
506
576
  if (persistentSandboxCreating.has(config.agentName)) {
507
- await condition(() => persistentSandboxes.has(config.agentName));
577
+ await condition(
578
+ () => persistentSandboxes.has(config.agentName) || persistentSandboxCreationError.has(config.agentName) || !persistentSandboxCreating.has(config.agentName)
579
+ );
580
+ const creatorErr = persistentSandboxCreationError.get(
581
+ config.agentName
582
+ );
583
+ if (creatorErr !== void 0) {
584
+ throw creatorErr;
585
+ }
508
586
  baseSandboxId = persistentSandboxes.get(config.agentName);
587
+ if (!baseSandboxId) {
588
+ persistentSandboxCreating.add(config.agentName);
589
+ isLazyCreator = true;
590
+ }
509
591
  } else {
510
592
  persistentSandboxCreating.add(config.agentName);
511
593
  isLazyCreator = true;
@@ -534,6 +616,12 @@ function createSubagentHandler(subagents) {
534
616
  };
535
617
  const resolvedContext = config.context === void 0 ? void 0 : typeof config.context === "function" ? config.context() : config.context;
536
618
  const childOpts = {
619
+ // Apply a bounded run timeout by default so a child workflow that
620
+ // fails to initialize or otherwise never reaches a terminal state
621
+ // cannot hang the parent's `Subagent` tool call forever. Callers can
622
+ // raise, lower, or disable it via `workflowOptions.workflowRunTimeout`.
623
+ workflowRunTimeout: DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT,
624
+ ...config.workflowOptions ?? {},
537
625
  workflowId: childWorkflowId,
538
626
  args: resolvedContext === void 0 ? [args.prompt, workflowInput] : [args.prompt, workflowInput, resolvedContext],
539
627
  taskQueue: config.taskQueue ?? parentTaskQueue
@@ -541,13 +629,39 @@ function createSubagentHandler(subagents) {
541
629
  if (isLazyCreator) {
542
630
  lazyCreatorAgent.set(childWorkflowId, config.agentName);
543
631
  }
632
+ if (isSnapshotBaseCreator) {
633
+ snapshotBaseCreatorAgent.set(childWorkflowId, config.agentName);
634
+ }
544
635
  log.info("subagent spawned", {
545
636
  subagent: config.agentName,
546
637
  childWorkflowId,
547
638
  threadMode,
548
639
  sandboxSource: sandboxCfg.source
549
640
  });
550
- const childResult = await executeChild(config.workflow, childOpts);
641
+ let childResult;
642
+ try {
643
+ childResult = await executeChild(
644
+ config.workflow,
645
+ childOpts
646
+ );
647
+ } catch (err) {
648
+ log.warn("subagent failed", {
649
+ subagent: config.agentName,
650
+ childWorkflowId,
651
+ error: err instanceof Error ? err.message : String(err)
652
+ });
653
+ if (isLazyCreator) {
654
+ persistentSandboxCreating.delete(config.agentName);
655
+ persistentSandboxCreationError.set(config.agentName, err);
656
+ lazyCreatorAgent.delete(childWorkflowId);
657
+ }
658
+ if (isSnapshotBaseCreator) {
659
+ persistentBaseSnapshotCreating.delete(config.agentName);
660
+ persistentBaseSnapshotCreationError.set(config.agentName, err);
661
+ snapshotBaseCreatorAgent.delete(childWorkflowId);
662
+ }
663
+ throw err;
664
+ }
551
665
  const effectiveShutdown = sandboxShutdownOverride ?? sandboxCfg.shutdown ?? "destroy";
552
666
  log.info("subagent completed", {
553
667
  subagent: config.agentName,
@@ -591,10 +705,13 @@ function createSubagentHandler(subagents) {
591
705
  }
592
706
  if (isLazyCreator) {
593
707
  persistentSandboxCreating.delete(config.agentName);
708
+ persistentSandboxCreationError.delete(config.agentName);
594
709
  lazyCreatorAgent.delete(childWorkflowId);
595
710
  }
596
711
  if (isSnapshotBaseCreator) {
597
712
  persistentBaseSnapshotCreating.delete(config.agentName);
713
+ persistentBaseSnapshotCreationError.delete(config.agentName);
714
+ snapshotBaseCreatorAgent.delete(childWorkflowId);
598
715
  }
599
716
  if (!toolResponse) {
600
717
  return {
@@ -837,6 +954,7 @@ async function createSession({
837
954
  sandbox: sandboxInit,
838
955
  sandboxShutdown = "destroy",
839
956
  onSandboxReady,
957
+ onSessionExit,
840
958
  virtualFs: virtualFsConfig,
841
959
  virtualFsOps
842
960
  }) {
@@ -861,7 +979,9 @@ async function createSession({
861
979
  initializeThread,
862
980
  appendSystemMessage,
863
981
  appendAgentMessage,
864
- forkThread
982
+ forkThread,
983
+ loadThreadState,
984
+ saveThreadState
865
985
  } = threadOps;
866
986
  const plugins = [];
867
987
  let destroySubagentSandboxes;
@@ -955,8 +1075,10 @@ async function createSession({
955
1075
  nonRetryable: true
956
1076
  });
957
1077
  }
1078
+ const forkInit = sandboxInit;
958
1079
  sandboxId = await sandboxOps.forkSandbox(
959
- sandboxInit.sandboxId
1080
+ forkInit.sandboxId,
1081
+ forkInit.options
960
1082
  );
961
1083
  sandboxOwned = true;
962
1084
  } else if (sandboxMode === "from-snapshot") {
@@ -966,8 +1088,11 @@ async function createSession({
966
1088
  nonRetryable: true
967
1089
  });
968
1090
  }
969
- const snap = sandboxInit.snapshot;
970
- sandboxId = await sandboxOps.restoreSandbox(snap);
1091
+ const restoreInit = sandboxInit;
1092
+ sandboxId = await sandboxOps.restoreSandbox(
1093
+ restoreInit.snapshot,
1094
+ restoreInit.options
1095
+ );
971
1096
  sandboxOwned = true;
972
1097
  } else if (sandboxOps) {
973
1098
  const skillFiles = skills ? collectSkillFiles(skills) : void 0;
@@ -984,7 +1109,10 @@ async function createSession({
984
1109
  baseSnapshot = await sandboxOps.snapshotSandbox(sandboxId);
985
1110
  }
986
1111
  if (sandboxId && sandboxOwned && onSandboxReady) {
987
- onSandboxReady(sandboxId);
1112
+ onSandboxReady({
1113
+ sandboxId,
1114
+ ...baseSnapshot && { baseSnapshot }
1115
+ });
988
1116
  }
989
1117
  if (virtualFsConfig) {
990
1118
  if (!virtualFsOps) {
@@ -1027,9 +1155,20 @@ async function createSession({
1027
1155
  });
1028
1156
  const sessionStartMs = Date.now();
1029
1157
  const systemPrompt = stateManager.getSystemPrompt();
1158
+ const rehydrateFromSlice = (slice) => {
1159
+ stateManager.mergeUpdate({
1160
+ tasks: new Map(slice.tasks),
1161
+ ...slice.custom
1162
+ });
1163
+ };
1030
1164
  if (threadMode === "fork" && sourceThreadId) {
1031
1165
  await forkThread(sourceThreadId, threadId, threadKey);
1032
- } else if (threadMode === "continue") ; else {
1166
+ const forkedSlice = await loadThreadState(threadId, threadKey);
1167
+ if (forkedSlice) rehydrateFromSlice(forkedSlice);
1168
+ } else if (threadMode === "continue") {
1169
+ const continuedSlice = await loadThreadState(threadId, threadKey);
1170
+ if (continuedSlice) rehydrateFromSlice(continuedSlice);
1171
+ } else {
1033
1172
  if (appendSystemPrompt) {
1034
1173
  if (systemPrompt == null || typeof systemPrompt === "string" && systemPrompt.trim() === "") {
1035
1174
  throw ApplicationFailure.create({
@@ -1051,18 +1190,21 @@ async function createSession({
1051
1190
  let exitReason = "completed";
1052
1191
  let finalMessage = null;
1053
1192
  try {
1193
+ let assistantId;
1054
1194
  while (stateManager.isRunning() && !stateManager.isTerminal() && stateManager.getTurns() < maxTurns) {
1055
1195
  stateManager.incrementTurns();
1056
1196
  const currentTurn = stateManager.getTurns();
1057
1197
  log.debug("turn started", { agentName, threadId, turn: currentTurn });
1058
1198
  stateManager.setTools(toolRouter.getToolDefinitions());
1199
+ assistantId ??= uuid4();
1059
1200
  const { message, rawToolCalls, usage } = await runAgent({
1060
1201
  threadId,
1061
1202
  threadKey,
1062
1203
  agentName,
1063
- metadata
1204
+ metadata,
1205
+ assistantMessageId: assistantId
1064
1206
  });
1065
- await appendAgentMessage(threadId, uuid4(), message, threadKey);
1207
+ await appendAgentMessage(threadId, assistantId, message, threadKey);
1066
1208
  if (usage) {
1067
1209
  stateManager.updateUsage(usage);
1068
1210
  }
@@ -1107,6 +1249,18 @@ async function createSession({
1107
1249
  stateManager.updateUsage(result.usage);
1108
1250
  }
1109
1251
  }
1252
+ const rewind = toolCallResults.rewind;
1253
+ if (rewind) {
1254
+ log.info("rewinding turn", {
1255
+ agentName,
1256
+ threadId,
1257
+ turn: currentTurn,
1258
+ toolCallId: rewind.toolCallId,
1259
+ toolName: rewind.toolName
1260
+ });
1261
+ continue;
1262
+ }
1263
+ assistantId = void 0;
1110
1264
  if (stateManager.getStatus() === "WAITING_FOR_INPUT") {
1111
1265
  const conditionMet = await condition(
1112
1266
  () => stateManager.getStatus() === "RUNNING",
@@ -1139,6 +1293,19 @@ async function createSession({
1139
1293
  });
1140
1294
  throw ApplicationFailure.fromError(error);
1141
1295
  } finally {
1296
+ try {
1297
+ await saveThreadState(
1298
+ threadId,
1299
+ stateManager.getPersistedSlice(),
1300
+ threadKey
1301
+ );
1302
+ } catch (persistError) {
1303
+ log.warn("failed to persist thread state", {
1304
+ agentName,
1305
+ threadId,
1306
+ error: persistError instanceof Error ? persistError.message : String(persistError)
1307
+ });
1308
+ }
1142
1309
  await callSessionEnd(exitReason, stateManager.getTurns());
1143
1310
  if (sandboxOwned && sandboxId && sandboxOps) {
1144
1311
  switch (sandboxShutdown) {
@@ -1175,6 +1342,12 @@ async function createSession({
1175
1342
  ...baseSnapshot && { hasBaseSnapshot: true },
1176
1343
  ...exitSnapshot && { hasExitSnapshot: true }
1177
1344
  });
1345
+ if (onSessionExit) {
1346
+ onSessionExit({
1347
+ ...sandboxId && { sandboxId },
1348
+ ...exitSnapshot && { snapshot: exitSnapshot }
1349
+ });
1350
+ }
1178
1351
  return {
1179
1352
  threadId,
1180
1353
  finalMessage,
@@ -1203,6 +1376,15 @@ function defineWorkflow(config, fn) {
1203
1376
  return workflow;
1204
1377
  }
1205
1378
 
1379
+ // src/lib/thread/keys.ts
1380
+ var THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;
1381
+ function getThreadListKey(threadKey, threadId) {
1382
+ return `${threadKey}:thread:${threadId}`;
1383
+ }
1384
+ function getThreadMetaKey(threadKey, threadId) {
1385
+ return `${threadKey}:meta:thread:${threadId}`;
1386
+ }
1387
+
1206
1388
  // src/lib/types.ts
1207
1389
  function isTerminalStatus(status) {
1208
1390
  return status === "COMPLETED" || status === "FAILED" || status === "CANCELLED";
@@ -1222,11 +1404,19 @@ function createAgentStateManager({
1222
1404
  let systemPrompt = initialState?.systemPrompt;
1223
1405
  const tasks = new Map(initialState?.tasks);
1224
1406
  const {
1225
- status: _,
1226
- version: __,
1227
- turns: ___,
1228
- tasks: ____,
1229
- tools: _____,
1407
+ status: _status,
1408
+ version: _version,
1409
+ turns: _turns,
1410
+ tasks: _tasks,
1411
+ tools: _tools,
1412
+ systemPrompt: _systemPrompt,
1413
+ fileTree: _fileTree,
1414
+ inlineFiles: _inlineFiles,
1415
+ virtualFsCtx: _virtualFsCtx,
1416
+ totalInputTokens: _totalInputTokens,
1417
+ totalOutputTokens: _totalOutputTokens,
1418
+ cachedWriteTokens: _cachedWriteTokens,
1419
+ cachedReadTokens: _cachedReadTokens,
1230
1420
  ...custom
1231
1421
  } = initialState ?? {};
1232
1422
  const customState = custom;
@@ -1306,7 +1496,14 @@ function createAgentStateManager({
1306
1496
  version++;
1307
1497
  },
1308
1498
  mergeUpdate(update) {
1309
- Object.assign(customState, update);
1499
+ const { tasks: nextTasks, ...rest } = update;
1500
+ if (nextTasks) {
1501
+ tasks.clear();
1502
+ for (const [id, task] of nextTasks) {
1503
+ tasks.set(id, task);
1504
+ }
1505
+ }
1506
+ Object.assign(customState, rest);
1310
1507
  version++;
1311
1508
  },
1312
1509
  getCurrentState() {
@@ -1344,6 +1541,12 @@ function createAgentStateManager({
1344
1541
  }
1345
1542
  return deleted;
1346
1543
  },
1544
+ getPersistedSlice() {
1545
+ return {
1546
+ tasks: Array.from(tasks.entries()),
1547
+ custom: { ...customState }
1548
+ };
1549
+ },
1347
1550
  updateUsage(usage) {
1348
1551
  totalInputTokens += usage.inputTokens ?? 0;
1349
1552
  totalOutputTokens += usage.outputTokens ?? 0;
@@ -1387,22 +1590,42 @@ function defineSubagentWorkflow(config, fn) {
1387
1590
  });
1388
1591
  }
1389
1592
  const parentHandle = getExternalWorkflowHandle(parent.workflowId);
1593
+ let capturedSandboxId;
1594
+ let capturedSnapshot;
1595
+ let capturedBaseSnapshot;
1596
+ let capturedThreadId;
1390
1597
  const sessionInput = {
1391
1598
  agentName: config.name,
1392
1599
  sandboxShutdown: effectiveShutdown,
1393
1600
  ...workflowInput.thread && { thread: workflowInput.thread },
1394
1601
  ...workflowInput.sandbox && { sandbox: workflowInput.sandbox },
1395
- onSandboxReady: (sandboxId) => {
1602
+ onSandboxReady: ({ sandboxId, baseSnapshot }) => {
1603
+ capturedBaseSnapshot = baseSnapshot;
1396
1604
  const isReuse = workflowInput.sandbox?.mode === "continue";
1397
1605
  if (!isReuse) {
1398
1606
  void parentHandle.signal(childSandboxReadySignal, {
1399
1607
  childWorkflowId: workflowInfo().workflowId,
1400
- sandboxId
1608
+ sandboxId,
1609
+ ...baseSnapshot && { baseSnapshot }
1401
1610
  });
1402
1611
  }
1612
+ },
1613
+ onSessionExit: ({ sandboxId, snapshot, threadId }) => {
1614
+ capturedSandboxId = sandboxId;
1615
+ capturedSnapshot = snapshot;
1616
+ capturedThreadId = threadId;
1617
+ }
1618
+ };
1619
+ const result = await fn(prompt, sessionInput, context ?? {});
1620
+ return {
1621
+ ...result,
1622
+ ...capturedThreadId !== void 0 && { threadId: capturedThreadId },
1623
+ ...capturedSandboxId !== void 0 && { sandboxId: capturedSandboxId },
1624
+ ...capturedSnapshot !== void 0 && { snapshot: capturedSnapshot },
1625
+ ...capturedBaseSnapshot !== void 0 && {
1626
+ baseSnapshot: capturedBaseSnapshot
1403
1627
  }
1404
1628
  };
1405
- return fn(prompt, sessionInput, context ?? {});
1406
1629
  };
1407
1630
  Object.defineProperty(workflow, "name", { value: config.name });
1408
1631
  return Object.assign(workflow, {
@@ -2061,6 +2284,6 @@ var createAskUserQuestionHandler = () => async (args) => {
2061
2284
  };
2062
2285
  };
2063
2286
 
2064
- export { SandboxNotFoundError, SandboxNotSupportedError, applyVirtualTreeMutations, askUserQuestionTool, bashTool, composeHooks, createAgentStateManager, createAskUserQuestionHandler, createBashToolDescription, createObservabilityHooks, createReadSkillHandler, createReadSkillTool, createSession, createTaskCreateHandler, createTaskGetHandler, createTaskListHandler, createTaskUpdateHandler, createToolRouter, defineSubagent, defineSubagentWorkflow, defineTool, defineWorkflow, editTool, filesWithMimeType, formatVirtualFileTree, getShortId, globTool, grepTool, hasDirectory, hasFileWithMimeType, hasNoOtherToolCalls, isTerminalStatus, parseSkillFile, proxyRunAgent, proxyVirtualFsOps, readFileTool, taskCreateTool, taskGetTool, taskListTool, taskUpdateTool, writeFileTool };
2287
+ export { DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT, SandboxNotFoundError, SandboxNotSupportedError, THREAD_TTL_SECONDS, applyVirtualTreeMutations, askUserQuestionTool, bashTool, composeHooks, createAgentStateManager, createAskUserQuestionHandler, createBashToolDescription, createObservabilityHooks, createReadSkillHandler, createReadSkillTool, createSession, createTaskCreateHandler, createTaskGetHandler, createTaskListHandler, createTaskUpdateHandler, createToolRouter, defineSubagent, defineSubagentWorkflow, defineTool, defineWorkflow, editTool, filesWithMimeType, formatVirtualFileTree, getShortId, getThreadListKey, getThreadMetaKey, globTool, grepTool, hasDirectory, hasFileWithMimeType, hasNoOtherToolCalls, isTerminalStatus, parseSkillFile, proxyRunAgent, proxyVirtualFsOps, readFileTool, taskCreateTool, taskGetTool, taskListTool, taskUpdateTool, writeFileTool };
2065
2288
  //# sourceMappingURL=workflow.js.map
2066
2289
  //# sourceMappingURL=workflow.js.map