zeitlich 0.2.38 → 0.2.40

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 (125) hide show
  1. package/README.md +18 -0
  2. package/dist/{activities-BKhMtKDd.d.ts → activities-CULxRzJ1.d.ts} +4 -6
  3. package/dist/{activities-CDcwkRZs.d.cts → activities-CvUrG3YG.d.cts} +4 -6
  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/thread/anthropic/index.cjs +140 -23
  11. package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
  12. package/dist/adapters/thread/anthropic/index.d.cts +8 -7
  13. package/dist/adapters/thread/anthropic/index.d.ts +8 -7
  14. package/dist/adapters/thread/anthropic/index.js +140 -24
  15. package/dist/adapters/thread/anthropic/index.js.map +1 -1
  16. package/dist/adapters/thread/anthropic/workflow.cjs +8 -3
  17. package/dist/adapters/thread/anthropic/workflow.cjs.map +1 -1
  18. package/dist/adapters/thread/anthropic/workflow.d.cts +5 -4
  19. package/dist/adapters/thread/anthropic/workflow.d.ts +5 -4
  20. package/dist/adapters/thread/anthropic/workflow.js +8 -4
  21. package/dist/adapters/thread/anthropic/workflow.js.map +1 -1
  22. package/dist/adapters/thread/google-genai/index.cjs +140 -23
  23. package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
  24. package/dist/adapters/thread/google-genai/index.d.cts +5 -4
  25. package/dist/adapters/thread/google-genai/index.d.ts +5 -4
  26. package/dist/adapters/thread/google-genai/index.js +140 -24
  27. package/dist/adapters/thread/google-genai/index.js.map +1 -1
  28. package/dist/adapters/thread/google-genai/workflow.cjs +8 -3
  29. package/dist/adapters/thread/google-genai/workflow.cjs.map +1 -1
  30. package/dist/adapters/thread/google-genai/workflow.d.cts +5 -4
  31. package/dist/adapters/thread/google-genai/workflow.d.ts +5 -4
  32. package/dist/adapters/thread/google-genai/workflow.js +8 -4
  33. package/dist/adapters/thread/google-genai/workflow.js.map +1 -1
  34. package/dist/adapters/thread/index.cjs +16 -0
  35. package/dist/adapters/thread/index.cjs.map +1 -0
  36. package/dist/adapters/thread/index.d.cts +34 -0
  37. package/dist/adapters/thread/index.d.ts +34 -0
  38. package/dist/adapters/thread/index.js +12 -0
  39. package/dist/adapters/thread/index.js.map +1 -0
  40. package/dist/adapters/thread/langchain/index.cjs +139 -24
  41. package/dist/adapters/thread/langchain/index.cjs.map +1 -1
  42. package/dist/adapters/thread/langchain/index.d.cts +8 -7
  43. package/dist/adapters/thread/langchain/index.d.ts +8 -7
  44. package/dist/adapters/thread/langchain/index.js +139 -25
  45. package/dist/adapters/thread/langchain/index.js.map +1 -1
  46. package/dist/adapters/thread/langchain/workflow.cjs +8 -3
  47. package/dist/adapters/thread/langchain/workflow.cjs.map +1 -1
  48. package/dist/adapters/thread/langchain/workflow.d.cts +5 -4
  49. package/dist/adapters/thread/langchain/workflow.d.ts +5 -4
  50. package/dist/adapters/thread/langchain/workflow.js +8 -4
  51. package/dist/adapters/thread/langchain/workflow.js.map +1 -1
  52. package/dist/index.cjs +267 -48
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.cts +6 -6
  55. package/dist/index.d.ts +6 -6
  56. package/dist/index.js +264 -49
  57. package/dist/index.js.map +1 -1
  58. package/dist/{proxy-D_3x7RN4.d.cts → proxy-5EbwzaY4.d.cts} +1 -1
  59. package/dist/{proxy-CUlKSvZS.d.ts → proxy-wZufFfBh.d.ts} +1 -1
  60. package/dist/{thread-manager-CVu7o2cs.d.ts → thread-manager-BNiIt5r8.d.ts} +2 -4
  61. package/dist/{thread-manager-c1gPopAG.d.ts → thread-manager-BoN5DOvG.d.cts} +2 -4
  62. package/dist/{thread-manager-wGi-LqIP.d.cts → thread-manager-BqBAIsED.d.ts} +2 -4
  63. package/dist/{thread-manager-HSwyh28L.d.cts → thread-manager-DF8WuCRs.d.cts} +2 -4
  64. package/dist/{types-BH_IRryz.d.ts → types-C7OoY7h8.d.ts} +54 -6
  65. package/dist/{types-C06FwR96.d.cts → types-Cn2r3ol3.d.cts} +163 -44
  66. package/dist/{types-BaOw4hKI.d.cts → types-CuISs0Ub.d.cts} +54 -6
  67. package/dist/{types-DNr31FzL.d.ts → types-DeQH84C_.d.ts} +163 -44
  68. package/dist/{workflow-CSCkpwAL.d.ts → workflow-C2MZZj5K.d.ts} +82 -2
  69. package/dist/{workflow-DuvMZ8Vm.d.cts → workflow-DhplIN65.d.cts} +82 -2
  70. package/dist/workflow.cjs +189 -37
  71. package/dist/workflow.cjs.map +1 -1
  72. package/dist/workflow.d.cts +2 -2
  73. package/dist/workflow.d.ts +2 -2
  74. package/dist/workflow.js +186 -38
  75. package/dist/workflow.js.map +1 -1
  76. package/package.json +11 -1
  77. package/src/adapters/thread/adapter-id.test.ts +42 -0
  78. package/src/adapters/thread/anthropic/activities.ts +33 -7
  79. package/src/adapters/thread/anthropic/adapter-id.ts +16 -0
  80. package/src/adapters/thread/anthropic/fork-transform.test.ts +291 -0
  81. package/src/adapters/thread/anthropic/index.ts +3 -0
  82. package/src/adapters/thread/anthropic/model-invoker.ts +8 -4
  83. package/src/adapters/thread/anthropic/proxy.ts +3 -2
  84. package/src/adapters/thread/anthropic/thread-manager.ts +27 -4
  85. package/src/adapters/thread/google-genai/activities.ts +33 -7
  86. package/src/adapters/thread/google-genai/adapter-id.ts +16 -0
  87. package/src/adapters/thread/google-genai/fork-transform.test.ts +149 -0
  88. package/src/adapters/thread/google-genai/index.ts +3 -0
  89. package/src/adapters/thread/google-genai/model-invoker.ts +7 -3
  90. package/src/adapters/thread/google-genai/proxy.ts +3 -2
  91. package/src/adapters/thread/google-genai/thread-manager.ts +27 -4
  92. package/src/adapters/thread/index.ts +39 -0
  93. package/src/adapters/thread/langchain/activities.ts +33 -7
  94. package/src/adapters/thread/langchain/adapter-id.ts +16 -0
  95. package/src/adapters/thread/langchain/fork-transform.test.ts +142 -0
  96. package/src/adapters/thread/langchain/index.ts +3 -0
  97. package/src/adapters/thread/langchain/model-invoker.ts +8 -3
  98. package/src/adapters/thread/langchain/proxy.ts +3 -2
  99. package/src/adapters/thread/langchain/thread-manager.ts +27 -4
  100. package/src/lib/lifecycle.ts +3 -1
  101. package/src/lib/model/types.ts +7 -10
  102. package/src/lib/session/session-edge-cases.integration.test.ts +131 -63
  103. package/src/lib/session/session.integration.test.ts +174 -5
  104. package/src/lib/session/session.ts +69 -28
  105. package/src/lib/session/types.ts +61 -9
  106. package/src/lib/state/index.ts +1 -0
  107. package/src/lib/state/manager.integration.test.ts +109 -0
  108. package/src/lib/state/manager.ts +38 -8
  109. package/src/lib/state/types.ts +25 -0
  110. package/src/lib/subagent/handler.ts +124 -11
  111. package/src/lib/subagent/index.ts +5 -1
  112. package/src/lib/subagent/subagent.integration.test.ts +528 -0
  113. package/src/lib/subagent/types.ts +63 -14
  114. package/src/lib/subagent/workflow.ts +29 -2
  115. package/src/lib/thread/index.ts +5 -0
  116. package/src/lib/thread/keys.test.ts +101 -0
  117. package/src/lib/thread/keys.ts +94 -0
  118. package/src/lib/thread/manager.test.ts +139 -0
  119. package/src/lib/thread/manager.ts +92 -14
  120. package/src/lib/thread/proxy.ts +2 -0
  121. package/src/lib/thread/types.ts +60 -6
  122. package/src/lib/tool-router/types.ts +16 -8
  123. package/src/lib/types.ts +12 -0
  124. package/src/workflow.ts +12 -1
  125. package/tsup.config.ts +1 -0
package/dist/index.d.cts CHANGED
@@ -1,12 +1,12 @@
1
- import { B as BashArgs, F as FileEditArgs, G as GlobArgs, a as FileReadArgs, b as FileWriteArgs } from './workflow-DuvMZ8Vm.cjs';
2
- export { A as AskUserQuestionArgs, c as FileTreeAccessor, 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-DuvMZ8Vm.cjs';
3
- import { R as RouterContext, d as ToolResultConfig, c as ActivityToolHandler, J as JsonValue, b as ToolHandlerResponse, B as BaseAgentState, e as RunAgentConfig, f as SkillProvider, g as SkillMetadata, h as Skill, F as FileEntryMetadata, i as FileResolver, V as VirtualFsContext, j as TreeMutation, k as PrefixedVirtualFsOps } from './types-C06FwR96.cjs';
4
- export { l as AgentConfig, m as AgentFile, A as AgentResponse, n as AgentState, o as AgentStateManager, p as AgentStatus, q as AppendToolResultFn, r as FileEntry, H as Hooks, I as InferToolResults, s as JsonPrimitive, t as JsonSerializable, 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, Q as ProcessToolCallsContext, U as ProcessToolCallsResult, W as RawToolCall, X as RewindSignal, Y as RunAgentActivity, Z as SandboxInit, _ as SandboxShutdown, S as ScopedPrefix, $ as SerializableToolDefinition, a0 as SessionConfig, a1 as SessionEndHook, a2 as SessionEndHookContext, a3 as SessionExitReason, a4 as SessionResult, a5 as SessionStartHook, a6 as SessionStartHookContext, a7 as SubagentConfig, a8 as SubagentDefinition, a9 as SubagentFnResult, aa as SubagentHandlerResponse, ab as SubagentHooks, ac as SubagentSandboxConfig, ad as SubagentSandboxShutdown, ae as SubagentSessionInput, af as SubagentWorkflow, ag as SubagentWorkflowInput, ah as TaskStatus, ai as ThreadInit, T as ThreadOps, aj as TokenUsage, ak as ToolArgs, al as ToolCallResult, am as ToolCallResultUnion, an as ToolDefinition, ao as ToolHandler, ap as ToolHooks, aq as ToolMap, ar as ToolNames, as as ToolResult, at as ToolRouter, au as ToolRouterHooks, av as ToolWithHandler, aw as VirtualFileSystem, ax as VirtualFileTree, ay as VirtualFsOps, az as VirtualFsState, aA as WorkflowTask, aB as ZeitlichSession, aC as isTerminalStatus } from './types-C06FwR96.cjs';
1
+ import { B as BashArgs, F as FileEditArgs, G as GlobArgs, a as FileReadArgs, b as FileWriteArgs } from './workflow-DhplIN65.cjs';
2
+ export { A as AskUserQuestionArgs, D as DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT, c as FileTreeAccessor, 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-DhplIN65.cjs';
3
+ import { R as RouterContext, e as ToolResultConfig, d as ActivityToolHandler, J as JsonValue, c as ToolHandlerResponse, B as BaseAgentState, f as RunAgentConfig, g as SkillProvider, h as SkillMetadata, i as Skill, F as FileEntryMetadata, j as FileResolver, V as VirtualFsContext, k as TreeMutation, l as PrefixedVirtualFsOps } from './types-Cn2r3ol3.cjs';
4
+ export { m as AgentConfig, n as AgentFile, A as AgentResponse, o as AgentState, p as AgentStateManager, q as AgentStatus, r as AppendToolResultFn, s as FileEntry, H as Hooks, I as InferToolResults, t as JsonPrimitive, u as JsonSerializable, 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, U as ProcessToolCallsContext, W as ProcessToolCallsResult, X as RawToolCall, Y as RewindSignal, Z as RunAgentActivity, _ 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, 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, ar as ToolHooks, as as ToolMap, at as ToolNames, au as ToolResult, av as ToolRouter, aw as ToolRouterHooks, ax as ToolWithHandler, ay as VirtualFileSystem, az as VirtualFileTree, aA as VirtualFsOps, aB as VirtualFsState, aC as WorkflowTask, aD as ZeitlichSession, aE as isTerminalStatus } from './types-Cn2r3ol3.cjs';
5
5
  import { S as Sandbox, a as SandboxFileSystem, d as SandboxCreateOptions, b as SandboxProvider, f as SandboxSnapshot, P as PrefixedSandboxOps, F as FileStat, D as DirentEntry, E as ExecResult } from './types-yx0LzPGn.cjs';
6
6
  export { h as ExecOptions, c as SandboxCapabilities, e as SandboxCreateResult, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps } from './types-yx0LzPGn.cjs';
7
7
  import { WorkflowClient } from '@temporalio/client';
8
- import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-BaOw4hKI.cjs';
9
- export { P as ProviderThreadManager } from './types-BaOw4hKI.cjs';
8
+ import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-CuISs0Ub.cjs';
9
+ export { P as ProviderThreadManager } from './types-CuISs0Ub.cjs';
10
10
  import 'zod';
11
11
  import '@temporalio/workflow';
12
12
  import '@temporalio/common';
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
- import { B as BashArgs, F as FileEditArgs, G as GlobArgs, a as FileReadArgs, b as FileWriteArgs } from './workflow-CSCkpwAL.js';
2
- export { A as AskUserQuestionArgs, c as FileTreeAccessor, 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-CSCkpwAL.js';
3
- import { R as RouterContext, d as ToolResultConfig, c as ActivityToolHandler, J as JsonValue, b as ToolHandlerResponse, B as BaseAgentState, e as RunAgentConfig, f as SkillProvider, g as SkillMetadata, h as Skill, F as FileEntryMetadata, i as FileResolver, V as VirtualFsContext, j as TreeMutation, k as PrefixedVirtualFsOps } from './types-DNr31FzL.js';
4
- export { l as AgentConfig, m as AgentFile, A as AgentResponse, n as AgentState, o as AgentStateManager, p as AgentStatus, q as AppendToolResultFn, r as FileEntry, H as Hooks, I as InferToolResults, s as JsonPrimitive, t as JsonSerializable, 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, Q as ProcessToolCallsContext, U as ProcessToolCallsResult, W as RawToolCall, X as RewindSignal, Y as RunAgentActivity, Z as SandboxInit, _ as SandboxShutdown, S as ScopedPrefix, $ as SerializableToolDefinition, a0 as SessionConfig, a1 as SessionEndHook, a2 as SessionEndHookContext, a3 as SessionExitReason, a4 as SessionResult, a5 as SessionStartHook, a6 as SessionStartHookContext, a7 as SubagentConfig, a8 as SubagentDefinition, a9 as SubagentFnResult, aa as SubagentHandlerResponse, ab as SubagentHooks, ac as SubagentSandboxConfig, ad as SubagentSandboxShutdown, ae as SubagentSessionInput, af as SubagentWorkflow, ag as SubagentWorkflowInput, ah as TaskStatus, ai as ThreadInit, T as ThreadOps, aj as TokenUsage, ak as ToolArgs, al as ToolCallResult, am as ToolCallResultUnion, an as ToolDefinition, ao as ToolHandler, ap as ToolHooks, aq as ToolMap, ar as ToolNames, as as ToolResult, at as ToolRouter, au as ToolRouterHooks, av as ToolWithHandler, aw as VirtualFileSystem, ax as VirtualFileTree, ay as VirtualFsOps, az as VirtualFsState, aA as WorkflowTask, aB as ZeitlichSession, aC as isTerminalStatus } from './types-DNr31FzL.js';
1
+ import { B as BashArgs, F as FileEditArgs, G as GlobArgs, a as FileReadArgs, b as FileWriteArgs } from './workflow-C2MZZj5K.js';
2
+ export { A as AskUserQuestionArgs, D as DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT, c as FileTreeAccessor, 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-C2MZZj5K.js';
3
+ import { R as RouterContext, e as ToolResultConfig, d as ActivityToolHandler, J as JsonValue, c as ToolHandlerResponse, B as BaseAgentState, f as RunAgentConfig, g as SkillProvider, h as SkillMetadata, i as Skill, F as FileEntryMetadata, j as FileResolver, V as VirtualFsContext, k as TreeMutation, l as PrefixedVirtualFsOps } from './types-DeQH84C_.js';
4
+ export { m as AgentConfig, n as AgentFile, A as AgentResponse, o as AgentState, p as AgentStateManager, q as AgentStatus, r as AppendToolResultFn, s as FileEntry, H as Hooks, I as InferToolResults, t as JsonPrimitive, u as JsonSerializable, 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, U as ProcessToolCallsContext, W as ProcessToolCallsResult, X as RawToolCall, Y as RewindSignal, Z as RunAgentActivity, _ 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, 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, ar as ToolHooks, as as ToolMap, at as ToolNames, au as ToolResult, av as ToolRouter, aw as ToolRouterHooks, ax as ToolWithHandler, ay as VirtualFileSystem, az as VirtualFileTree, aA as VirtualFsOps, aB as VirtualFsState, aC as WorkflowTask, aD as ZeitlichSession, aE as isTerminalStatus } from './types-DeQH84C_.js';
5
5
  import { S as Sandbox, a as SandboxFileSystem, d as SandboxCreateOptions, b as SandboxProvider, f as SandboxSnapshot, P as PrefixedSandboxOps, F as FileStat, D as DirentEntry, E as ExecResult } from './types-yx0LzPGn.js';
6
6
  export { h as ExecOptions, c as SandboxCapabilities, e as SandboxCreateResult, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps } from './types-yx0LzPGn.js';
7
7
  import { WorkflowClient } from '@temporalio/client';
8
- import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-BH_IRryz.js';
9
- export { P as ProviderThreadManager } from './types-BH_IRryz.js';
8
+ import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-C7OoY7h8.js';
9
+ export { P as ProviderThreadManager } from './types-C7OoY7h8.js';
10
10
  import 'zod';
11
11
  import '@temporalio/workflow';
12
12
  import '@temporalio/common';
package/dist/index.js CHANGED
@@ -438,6 +438,7 @@ function createSubagentTool(subagents) {
438
438
  var childSandboxReadySignal = defineSignal("childSandboxReady");
439
439
 
440
440
  // src/lib/subagent/handler.ts
441
+ var DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT = "1h";
441
442
  function resolveSandboxConfig(config) {
442
443
  if (!config || config === "none") {
443
444
  return { source: "none", init: "per-call", continuation: "fork" };
@@ -469,17 +470,28 @@ function createSubagentHandler(subagents) {
469
470
  const threadSandboxes = /* @__PURE__ */ new Map();
470
471
  const persistentSandboxes = /* @__PURE__ */ new Map();
471
472
  const persistentSandboxCreating = /* @__PURE__ */ new Set();
473
+ const persistentSandboxCreationError = /* @__PURE__ */ new Map();
472
474
  const lazyCreatorAgent = /* @__PURE__ */ new Map();
475
+ const snapshotBaseCreatorAgent = /* @__PURE__ */ new Map();
473
476
  const threadSnapshots = /* @__PURE__ */ new Map();
474
477
  const persistentBaseSnapshot = /* @__PURE__ */ new Map();
475
478
  const persistentBaseSnapshotCreating = /* @__PURE__ */ new Set();
476
- setHandler(childSandboxReadySignal, ({ childWorkflowId, sandboxId }) => {
477
- const agentName = lazyCreatorAgent.get(childWorkflowId);
478
- if (agentName && !persistentSandboxes.has(agentName)) {
479
- persistentSandboxes.set(agentName, sandboxId);
480
- lazyCreatorAgent.delete(childWorkflowId);
479
+ const persistentBaseSnapshotCreationError = /* @__PURE__ */ new Map();
480
+ setHandler(
481
+ childSandboxReadySignal,
482
+ ({ childWorkflowId, sandboxId, baseSnapshot }) => {
483
+ const lazyAgent = lazyCreatorAgent.get(childWorkflowId);
484
+ if (lazyAgent && !persistentSandboxes.has(lazyAgent)) {
485
+ persistentSandboxes.set(lazyAgent, sandboxId);
486
+ lazyCreatorAgent.delete(childWorkflowId);
487
+ }
488
+ const snapAgent = snapshotBaseCreatorAgent.get(childWorkflowId);
489
+ if (snapAgent && baseSnapshot && !persistentBaseSnapshot.has(snapAgent)) {
490
+ persistentBaseSnapshot.set(snapAgent, baseSnapshot);
491
+ snapshotBaseCreatorAgent.delete(childWorkflowId);
492
+ }
481
493
  }
482
- });
494
+ );
483
495
  const handler = async (args, context) => {
484
496
  const config = subagents.find((s) => s.agentName === args.subagent);
485
497
  if (!config) {
@@ -535,8 +547,20 @@ function createSubagentHandler(subagents) {
535
547
  baseSnap = persistentBaseSnapshot.get(config.agentName);
536
548
  if (!baseSnap) {
537
549
  if (persistentBaseSnapshotCreating.has(config.agentName)) {
538
- await condition(() => persistentBaseSnapshot.has(config.agentName));
550
+ await condition(
551
+ () => persistentBaseSnapshot.has(config.agentName) || persistentBaseSnapshotCreationError.has(config.agentName) || !persistentBaseSnapshotCreating.has(config.agentName)
552
+ );
553
+ const creatorErr = persistentBaseSnapshotCreationError.get(
554
+ config.agentName
555
+ );
556
+ if (creatorErr !== void 0) {
557
+ throw creatorErr;
558
+ }
539
559
  baseSnap = persistentBaseSnapshot.get(config.agentName);
560
+ if (!baseSnap) {
561
+ persistentBaseSnapshotCreating.add(config.agentName);
562
+ isSnapshotBaseCreator = true;
563
+ }
540
564
  } else {
541
565
  persistentBaseSnapshotCreating.add(config.agentName);
542
566
  isSnapshotBaseCreator = true;
@@ -554,8 +578,20 @@ function createSubagentHandler(subagents) {
554
578
  baseSandboxId = persistentSandboxes.get(config.agentName);
555
579
  if (!baseSandboxId) {
556
580
  if (persistentSandboxCreating.has(config.agentName)) {
557
- await condition(() => persistentSandboxes.has(config.agentName));
581
+ await condition(
582
+ () => persistentSandboxes.has(config.agentName) || persistentSandboxCreationError.has(config.agentName) || !persistentSandboxCreating.has(config.agentName)
583
+ );
584
+ const creatorErr = persistentSandboxCreationError.get(
585
+ config.agentName
586
+ );
587
+ if (creatorErr !== void 0) {
588
+ throw creatorErr;
589
+ }
558
590
  baseSandboxId = persistentSandboxes.get(config.agentName);
591
+ if (!baseSandboxId) {
592
+ persistentSandboxCreating.add(config.agentName);
593
+ isLazyCreator = true;
594
+ }
559
595
  } else {
560
596
  persistentSandboxCreating.add(config.agentName);
561
597
  isLazyCreator = true;
@@ -584,6 +620,12 @@ function createSubagentHandler(subagents) {
584
620
  };
585
621
  const resolvedContext = config.context === void 0 ? void 0 : typeof config.context === "function" ? config.context() : config.context;
586
622
  const childOpts = {
623
+ // Apply a bounded run timeout by default so a child workflow that
624
+ // fails to initialize or otherwise never reaches a terminal state
625
+ // cannot hang the parent's `Subagent` tool call forever. Callers can
626
+ // raise, lower, or disable it via `workflowOptions.workflowRunTimeout`.
627
+ workflowRunTimeout: DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT,
628
+ ...config.workflowOptions ?? {},
587
629
  workflowId: childWorkflowId,
588
630
  args: resolvedContext === void 0 ? [args.prompt, workflowInput] : [args.prompt, workflowInput, resolvedContext],
589
631
  taskQueue: config.taskQueue ?? parentTaskQueue
@@ -591,13 +633,39 @@ function createSubagentHandler(subagents) {
591
633
  if (isLazyCreator) {
592
634
  lazyCreatorAgent.set(childWorkflowId, config.agentName);
593
635
  }
636
+ if (isSnapshotBaseCreator) {
637
+ snapshotBaseCreatorAgent.set(childWorkflowId, config.agentName);
638
+ }
594
639
  log.info("subagent spawned", {
595
640
  subagent: config.agentName,
596
641
  childWorkflowId,
597
642
  threadMode,
598
643
  sandboxSource: sandboxCfg.source
599
644
  });
600
- const childResult = await executeChild(config.workflow, childOpts);
645
+ let childResult;
646
+ try {
647
+ childResult = await executeChild(
648
+ config.workflow,
649
+ childOpts
650
+ );
651
+ } catch (err) {
652
+ log.warn("subagent failed", {
653
+ subagent: config.agentName,
654
+ childWorkflowId,
655
+ error: err instanceof Error ? err.message : String(err)
656
+ });
657
+ if (isLazyCreator) {
658
+ persistentSandboxCreating.delete(config.agentName);
659
+ persistentSandboxCreationError.set(config.agentName, err);
660
+ lazyCreatorAgent.delete(childWorkflowId);
661
+ }
662
+ if (isSnapshotBaseCreator) {
663
+ persistentBaseSnapshotCreating.delete(config.agentName);
664
+ persistentBaseSnapshotCreationError.set(config.agentName, err);
665
+ snapshotBaseCreatorAgent.delete(childWorkflowId);
666
+ }
667
+ throw err;
668
+ }
601
669
  const effectiveShutdown = sandboxShutdownOverride ?? sandboxCfg.shutdown ?? "destroy";
602
670
  log.info("subagent completed", {
603
671
  subagent: config.agentName,
@@ -641,10 +709,13 @@ function createSubagentHandler(subagents) {
641
709
  }
642
710
  if (isLazyCreator) {
643
711
  persistentSandboxCreating.delete(config.agentName);
712
+ persistentSandboxCreationError.delete(config.agentName);
644
713
  lazyCreatorAgent.delete(childWorkflowId);
645
714
  }
646
715
  if (isSnapshotBaseCreator) {
647
716
  persistentBaseSnapshotCreating.delete(config.agentName);
717
+ persistentBaseSnapshotCreationError.delete(config.agentName);
718
+ snapshotBaseCreatorAgent.delete(childWorkflowId);
648
719
  }
649
720
  if (!toolResponse) {
650
721
  return {
@@ -887,6 +958,7 @@ async function createSession({
887
958
  sandbox: sandboxInit,
888
959
  sandboxShutdown = "destroy",
889
960
  onSandboxReady,
961
+ onSessionExit,
890
962
  virtualFs: virtualFsConfig,
891
963
  virtualFsOps
892
964
  }) {
@@ -912,7 +984,8 @@ async function createSession({
912
984
  appendSystemMessage,
913
985
  appendAgentMessage,
914
986
  forkThread,
915
- truncateThread
987
+ loadThreadState,
988
+ saveThreadState
916
989
  } = threadOps;
917
990
  const plugins = [];
918
991
  let destroySubagentSandboxes;
@@ -1040,7 +1113,10 @@ async function createSession({
1040
1113
  baseSnapshot = await sandboxOps.snapshotSandbox(sandboxId);
1041
1114
  }
1042
1115
  if (sandboxId && sandboxOwned && onSandboxReady) {
1043
- onSandboxReady(sandboxId);
1116
+ onSandboxReady({
1117
+ sandboxId,
1118
+ ...baseSnapshot && { baseSnapshot }
1119
+ });
1044
1120
  }
1045
1121
  if (virtualFsConfig) {
1046
1122
  if (!virtualFsOps) {
@@ -1083,9 +1159,20 @@ async function createSession({
1083
1159
  });
1084
1160
  const sessionStartMs = Date.now();
1085
1161
  const systemPrompt = stateManager.getSystemPrompt();
1162
+ const rehydrateFromSlice = (slice) => {
1163
+ stateManager.mergeUpdate({
1164
+ tasks: new Map(slice.tasks),
1165
+ ...slice.custom
1166
+ });
1167
+ };
1086
1168
  if (threadMode === "fork" && sourceThreadId) {
1087
1169
  await forkThread(sourceThreadId, threadId, threadKey);
1088
- } else if (threadMode === "continue") ; else {
1170
+ const forkedSlice = await loadThreadState(threadId, threadKey);
1171
+ if (forkedSlice) rehydrateFromSlice(forkedSlice);
1172
+ } else if (threadMode === "continue") {
1173
+ const continuedSlice = await loadThreadState(threadId, threadKey);
1174
+ if (continuedSlice) rehydrateFromSlice(continuedSlice);
1175
+ } else {
1089
1176
  if (appendSystemPrompt) {
1090
1177
  if (systemPrompt == null || typeof systemPrompt === "string" && systemPrompt.trim() === "") {
1091
1178
  throw ApplicationFailure.create({
@@ -1107,24 +1194,21 @@ async function createSession({
1107
1194
  let exitReason = "completed";
1108
1195
  let finalMessage = null;
1109
1196
  try {
1197
+ let assistantId;
1110
1198
  while (stateManager.isRunning() && !stateManager.isTerminal() && stateManager.getTurns() < maxTurns) {
1111
1199
  stateManager.incrementTurns();
1112
1200
  const currentTurn = stateManager.getTurns();
1113
1201
  log.debug("turn started", { agentName, threadId, turn: currentTurn });
1114
1202
  stateManager.setTools(toolRouter.getToolDefinitions());
1115
- const {
1116
- message,
1117
- rawToolCalls,
1118
- usage,
1119
- threadLengthAtCall
1120
- } = await runAgent({
1203
+ assistantId ??= uuid4();
1204
+ const { message, rawToolCalls, usage } = await runAgent({
1121
1205
  threadId,
1122
1206
  threadKey,
1123
1207
  agentName,
1124
- metadata
1208
+ metadata,
1209
+ assistantMessageId: assistantId
1125
1210
  });
1126
- const preAssistantLength = threadLengthAtCall;
1127
- await appendAgentMessage(threadId, uuid4(), message, threadKey);
1211
+ await appendAgentMessage(threadId, assistantId, message, threadKey);
1128
1212
  if (usage) {
1129
1213
  stateManager.updateUsage(usage);
1130
1214
  }
@@ -1178,15 +1262,9 @@ async function createSession({
1178
1262
  toolCallId: rewind.toolCallId,
1179
1263
  toolName: rewind.toolName
1180
1264
  });
1181
- if (preAssistantLength === void 0) {
1182
- throw ApplicationFailure.create({
1183
- message: "Rewind requested but runAgent did not report `threadLengthAtCall`; the adapter must populate it to support rewinds.",
1184
- nonRetryable: true
1185
- });
1186
- }
1187
- await truncateThread(threadId, preAssistantLength, threadKey);
1188
1265
  continue;
1189
1266
  }
1267
+ assistantId = void 0;
1190
1268
  if (stateManager.getStatus() === "WAITING_FOR_INPUT") {
1191
1269
  const conditionMet = await condition(
1192
1270
  () => stateManager.getStatus() === "RUNNING",
@@ -1219,6 +1297,19 @@ async function createSession({
1219
1297
  });
1220
1298
  throw ApplicationFailure.fromError(error);
1221
1299
  } finally {
1300
+ try {
1301
+ await saveThreadState(
1302
+ threadId,
1303
+ stateManager.getPersistedSlice(),
1304
+ threadKey
1305
+ );
1306
+ } catch (persistError) {
1307
+ log.warn("failed to persist thread state", {
1308
+ agentName,
1309
+ threadId,
1310
+ error: persistError instanceof Error ? persistError.message : String(persistError)
1311
+ });
1312
+ }
1222
1313
  await callSessionEnd(exitReason, stateManager.getTurns());
1223
1314
  if (sandboxOwned && sandboxId && sandboxOps) {
1224
1315
  switch (sandboxShutdown) {
@@ -1255,6 +1346,13 @@ async function createSession({
1255
1346
  ...baseSnapshot && { hasBaseSnapshot: true },
1256
1347
  ...exitSnapshot && { hasExitSnapshot: true }
1257
1348
  });
1349
+ if (onSessionExit) {
1350
+ onSessionExit({
1351
+ ...sandboxId && { sandboxId },
1352
+ ...exitSnapshot && { snapshot: exitSnapshot },
1353
+ threadId
1354
+ });
1355
+ }
1258
1356
  return {
1259
1357
  threadId,
1260
1358
  finalMessage,
@@ -1283,6 +1381,18 @@ function defineWorkflow(config, fn) {
1283
1381
  return workflow;
1284
1382
  }
1285
1383
 
1384
+ // src/lib/thread/keys.ts
1385
+ var THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;
1386
+ function getThreadListKey(threadKey, threadId) {
1387
+ return `${threadKey}:thread:${threadId}`;
1388
+ }
1389
+ function getThreadMetaKey(threadKey, threadId) {
1390
+ return `${threadKey}:meta:thread:${threadId}`;
1391
+ }
1392
+ function getThreadStateKey(threadKey, threadId) {
1393
+ return `${threadKey}:state:thread:${threadId}`;
1394
+ }
1395
+
1286
1396
  // src/lib/types.ts
1287
1397
  function isTerminalStatus(status) {
1288
1398
  return status === "COMPLETED" || status === "FAILED" || status === "CANCELLED";
@@ -1302,11 +1412,19 @@ function createAgentStateManager({
1302
1412
  let systemPrompt = initialState?.systemPrompt;
1303
1413
  const tasks = new Map(initialState?.tasks);
1304
1414
  const {
1305
- status: _,
1306
- version: __,
1307
- turns: ___,
1308
- tasks: ____,
1309
- tools: _____,
1415
+ status: _status,
1416
+ version: _version,
1417
+ turns: _turns,
1418
+ tasks: _tasks,
1419
+ tools: _tools,
1420
+ systemPrompt: _systemPrompt,
1421
+ fileTree: _fileTree,
1422
+ inlineFiles: _inlineFiles,
1423
+ virtualFsCtx: _virtualFsCtx,
1424
+ totalInputTokens: _totalInputTokens,
1425
+ totalOutputTokens: _totalOutputTokens,
1426
+ cachedWriteTokens: _cachedWriteTokens,
1427
+ cachedReadTokens: _cachedReadTokens,
1310
1428
  ...custom
1311
1429
  } = initialState ?? {};
1312
1430
  const customState = custom;
@@ -1386,7 +1504,14 @@ function createAgentStateManager({
1386
1504
  version++;
1387
1505
  },
1388
1506
  mergeUpdate(update) {
1389
- Object.assign(customState, update);
1507
+ const { tasks: nextTasks, ...rest } = update;
1508
+ if (nextTasks) {
1509
+ tasks.clear();
1510
+ for (const [id, task] of nextTasks) {
1511
+ tasks.set(id, task);
1512
+ }
1513
+ }
1514
+ Object.assign(customState, rest);
1390
1515
  version++;
1391
1516
  },
1392
1517
  getCurrentState() {
@@ -1424,6 +1549,12 @@ function createAgentStateManager({
1424
1549
  }
1425
1550
  return deleted;
1426
1551
  },
1552
+ getPersistedSlice() {
1553
+ return {
1554
+ tasks: Array.from(tasks.entries()),
1555
+ custom: { ...customState }
1556
+ };
1557
+ },
1427
1558
  updateUsage(usage) {
1428
1559
  totalInputTokens += usage.inputTokens ?? 0;
1429
1560
  totalOutputTokens += usage.outputTokens ?? 0;
@@ -1545,22 +1676,42 @@ function defineSubagentWorkflow(config, fn) {
1545
1676
  });
1546
1677
  }
1547
1678
  const parentHandle = getExternalWorkflowHandle(parent.workflowId);
1679
+ let capturedSandboxId;
1680
+ let capturedSnapshot;
1681
+ let capturedBaseSnapshot;
1682
+ let capturedThreadId;
1548
1683
  const sessionInput = {
1549
1684
  agentName: config.name,
1550
1685
  sandboxShutdown: effectiveShutdown,
1551
1686
  ...workflowInput.thread && { thread: workflowInput.thread },
1552
1687
  ...workflowInput.sandbox && { sandbox: workflowInput.sandbox },
1553
- onSandboxReady: (sandboxId) => {
1688
+ onSandboxReady: ({ sandboxId, baseSnapshot }) => {
1689
+ capturedBaseSnapshot = baseSnapshot;
1554
1690
  const isReuse = workflowInput.sandbox?.mode === "continue";
1555
1691
  if (!isReuse) {
1556
1692
  void parentHandle.signal(childSandboxReadySignal, {
1557
1693
  childWorkflowId: workflowInfo().workflowId,
1558
- sandboxId
1694
+ sandboxId,
1695
+ ...baseSnapshot && { baseSnapshot }
1559
1696
  });
1560
1697
  }
1698
+ },
1699
+ onSessionExit: ({ sandboxId, snapshot, threadId }) => {
1700
+ capturedSandboxId = sandboxId;
1701
+ capturedSnapshot = snapshot;
1702
+ capturedThreadId = threadId;
1703
+ }
1704
+ };
1705
+ const result = await fn(prompt, sessionInput, context ?? {});
1706
+ return {
1707
+ ...result,
1708
+ ...capturedThreadId !== void 0 && { threadId: capturedThreadId },
1709
+ ...capturedSandboxId !== void 0 && { sandboxId: capturedSandboxId },
1710
+ ...capturedSnapshot !== void 0 && { snapshot: capturedSnapshot },
1711
+ ...capturedBaseSnapshot !== void 0 && {
1712
+ baseSnapshot: capturedBaseSnapshot
1561
1713
  }
1562
1714
  };
1563
- return fn(prompt, sessionInput, context ?? {});
1564
1715
  };
1565
1716
  Object.defineProperty(workflow, "name", { value: config.name });
1566
1717
  return Object.assign(workflow, {
@@ -2330,7 +2481,6 @@ var FileSystemSkillProvider = class {
2330
2481
  };
2331
2482
 
2332
2483
  // src/lib/thread/manager.ts
2333
- var THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;
2334
2484
  var APPEND_IDEMPOTENT_SCRIPT = `
2335
2485
  if redis.call('EXISTS', KEYS[1]) == 1 then
2336
2486
  return 0
@@ -2342,8 +2492,8 @@ redis.call('EXPIRE', KEYS[2], tonumber(ARGV[1]))
2342
2492
  redis.call('SET', KEYS[1], '1', 'EX', tonumber(ARGV[1]))
2343
2493
  return 1
2344
2494
  `;
2345
- function getThreadKey(threadId, key) {
2346
- return `${key}:thread:${threadId}`;
2495
+ function getDedupKey(threadId, id) {
2496
+ return `dedup:${id}:thread:${threadId}`;
2347
2497
  }
2348
2498
  function createThreadManager(config) {
2349
2499
  const {
@@ -2354,8 +2504,9 @@ function createThreadManager(config) {
2354
2504
  deserialize = (raw) => JSON.parse(raw),
2355
2505
  idOf
2356
2506
  } = config;
2357
- const redisKey = getThreadKey(threadId, key);
2358
- const metaKey = getThreadKey(threadId, `${key}:meta`);
2507
+ const redisKey = getThreadListKey(key, threadId);
2508
+ const metaKey = getThreadMetaKey(key, threadId);
2509
+ const stateKey = getThreadStateKey(key, threadId);
2359
2510
  async function assertThreadExists() {
2360
2511
  const exists = await redis.exists(metaKey);
2361
2512
  if (!exists) {
@@ -2377,7 +2528,7 @@ function createThreadManager(config) {
2377
2528
  await assertThreadExists();
2378
2529
  if (idOf) {
2379
2530
  const dedupId = messages.map(idOf).join(":");
2380
- const dedupKey = getThreadKey(threadId, `dedup:${dedupId}`);
2531
+ const dedupKey = getDedupKey(threadId, dedupId);
2381
2532
  await redis.eval(
2382
2533
  APPEND_IDEMPOTENT_SCRIPT,
2383
2534
  2,
@@ -2394,34 +2545,98 @@ function createThreadManager(config) {
2394
2545
  async fork(newThreadId) {
2395
2546
  await assertThreadExists();
2396
2547
  const data = await redis.lrange(redisKey, 0, -1);
2548
+ const stateRaw = await redis.get(stateKey);
2397
2549
  const forked = createThreadManager({
2398
2550
  ...config,
2399
2551
  threadId: newThreadId
2400
2552
  });
2401
2553
  await forked.initialize();
2402
2554
  if (data.length > 0) {
2403
- const newKey = getThreadKey(newThreadId, key);
2555
+ const newKey = getThreadListKey(key, newThreadId);
2404
2556
  await redis.rpush(newKey, ...data);
2405
2557
  await redis.expire(newKey, THREAD_TTL_SECONDS);
2406
2558
  }
2559
+ if (stateRaw != null) {
2560
+ const newStateKey = getThreadStateKey(key, newThreadId);
2561
+ await redis.set(newStateKey, stateRaw, "EX", THREAD_TTL_SECONDS);
2562
+ }
2407
2563
  return forked;
2408
2564
  },
2565
+ async replaceAll(messages) {
2566
+ await assertThreadExists();
2567
+ if (!idOf) {
2568
+ throw new Error(
2569
+ "replaceAll requires the thread manager to be configured with `idOf`"
2570
+ );
2571
+ }
2572
+ const existing = await redis.lrange(redisKey, 0, -1);
2573
+ const existingIds = existing.map((raw) => idOf(deserialize(raw))).filter((id) => typeof id === "string");
2574
+ await redis.del(redisKey);
2575
+ if (existingIds.length > 0) {
2576
+ await redis.del(
2577
+ ...existingIds.map((id) => getDedupKey(threadId, id))
2578
+ );
2579
+ }
2580
+ if (messages.length > 0) {
2581
+ await redis.rpush(redisKey, ...messages.map(serialize));
2582
+ await redis.expire(redisKey, THREAD_TTL_SECONDS);
2583
+ }
2584
+ await redis.expire(metaKey, THREAD_TTL_SECONDS);
2585
+ },
2409
2586
  async delete() {
2410
- await redis.del(redisKey, metaKey);
2587
+ await redis.del(redisKey, metaKey, stateKey);
2588
+ },
2589
+ async loadState() {
2590
+ const raw = await redis.get(stateKey);
2591
+ if (raw == null) return null;
2592
+ return JSON.parse(raw);
2593
+ },
2594
+ async saveState(state) {
2595
+ await assertThreadExists();
2596
+ await redis.set(
2597
+ stateKey,
2598
+ JSON.stringify(state),
2599
+ "EX",
2600
+ THREAD_TTL_SECONDS
2601
+ );
2602
+ },
2603
+ async deleteState() {
2604
+ await redis.del(stateKey);
2411
2605
  },
2412
2606
  async length() {
2413
2607
  await assertThreadExists();
2414
2608
  return redis.llen(redisKey);
2415
2609
  },
2416
- async truncate(length) {
2610
+ async truncateFromId(messageId) {
2417
2611
  await assertThreadExists();
2418
- if (length <= 0) {
2612
+ if (!idOf) {
2613
+ throw new Error(
2614
+ "truncateFromId requires the thread manager to be configured with `idOf`"
2615
+ );
2616
+ }
2617
+ const data = await redis.lrange(redisKey, 0, -1);
2618
+ let idx = -1;
2619
+ const removedIds = [];
2620
+ for (let i = 0; i < data.length; i++) {
2621
+ const raw = data[i];
2622
+ if (raw === void 0) continue;
2623
+ const id = idOf(deserialize(raw));
2624
+ if (idx === -1 && id === messageId) idx = i;
2625
+ if (idx !== -1) removedIds.push(id);
2626
+ }
2627
+ if (idx === -1) return;
2628
+ if (idx === 0) {
2419
2629
  await redis.del(redisKey);
2420
2630
  await redis.expire(metaKey, THREAD_TTL_SECONDS);
2421
2631
  } else {
2422
- await redis.ltrim(redisKey, 0, length - 1);
2632
+ await redis.ltrim(redisKey, 0, idx - 1);
2423
2633
  await redis.expire(redisKey, THREAD_TTL_SECONDS);
2424
2634
  }
2635
+ if (removedIds.length > 0) {
2636
+ await redis.del(
2637
+ ...removedIds.map((id) => getDedupKey(threadId, id))
2638
+ );
2639
+ }
2425
2640
  }
2426
2641
  };
2427
2642
  }
@@ -3236,6 +3451,6 @@ var toTree = async (fs, opts = {}) => {
3236
3451
  return base + subtree;
3237
3452
  };
3238
3453
 
3239
- export { FileSystemSkillProvider, NodeFsSandboxFileSystem, SandboxManager, SandboxNotFoundError, SandboxNotSupportedError, VirtualFileSystem, applyVirtualTreeMutations, askUserQuestionTool, bashHandler, bashTool, composeHooks, createAgentStateManager, createAskUserQuestionHandler, createBashToolDescription, createObservabilityHooks, createReadSkillHandler, createReadSkillTool, createRunAgentActivity, createSession, createTaskCreateHandler, createTaskGetHandler, createTaskListHandler, createTaskUpdateHandler, createThreadManager, createToolRouter, createVirtualFsActivities, defineSubagent, defineSubagentWorkflow, defineTool, defineWorkflow, editHandler, editTool, filesWithMimeType, formatVirtualFileTree, getActivityContext, getShortId, globHandler, globTool, grepTool, hasDirectory, hasFileWithMimeType, hasNoOtherToolCalls, isTerminalStatus, parseSkillFile, proxyRunAgent, proxyVirtualFsOps, queryParentWorkflowState, readFileHandler, readFileTool, taskCreateTool, taskGetTool, taskListTool, taskUpdateTool, toTree, withAutoAppend, withParentWorkflowState, withSandbox, withVirtualFs, writeFileHandler, writeFileTool };
3454
+ export { DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT, FileSystemSkillProvider, NodeFsSandboxFileSystem, SandboxManager, SandboxNotFoundError, SandboxNotSupportedError, THREAD_TTL_SECONDS, VirtualFileSystem, applyVirtualTreeMutations, askUserQuestionTool, bashHandler, bashTool, composeHooks, createAgentStateManager, createAskUserQuestionHandler, createBashToolDescription, createObservabilityHooks, createReadSkillHandler, createReadSkillTool, createRunAgentActivity, createSession, createTaskCreateHandler, createTaskGetHandler, createTaskListHandler, createTaskUpdateHandler, createThreadManager, createToolRouter, createVirtualFsActivities, defineSubagent, defineSubagentWorkflow, defineTool, defineWorkflow, editHandler, editTool, filesWithMimeType, formatVirtualFileTree, getActivityContext, getShortId, getThreadListKey, getThreadMetaKey, globHandler, globTool, grepTool, hasDirectory, hasFileWithMimeType, hasNoOtherToolCalls, isTerminalStatus, parseSkillFile, proxyRunAgent, proxyVirtualFsOps, queryParentWorkflowState, readFileHandler, readFileTool, taskCreateTool, taskGetTool, taskListTool, taskUpdateTool, toTree, withAutoAppend, withParentWorkflowState, withSandbox, withVirtualFs, writeFileHandler, writeFileTool };
3240
3455
  //# sourceMappingURL=index.js.map
3241
3456
  //# sourceMappingURL=index.js.map