zeitlich 0.2.38 → 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 (125) hide show
  1. package/README.md +18 -0
  2. package/dist/{activities-BKhMtKDd.d.ts → activities-Bmu7XnaG.d.ts} +4 -6
  3. package/dist/{activities-CDcwkRZs.d.cts → activities-ByBFLvm2.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 +266 -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 +263 -49
  57. package/dist/index.js.map +1 -1
  58. package/dist/{proxy-D_3x7RN4.d.cts → proxy-BAKzNGRq.d.cts} +1 -1
  59. package/dist/{proxy-CUlKSvZS.d.ts → proxy-DO_MXbY4.d.ts} +1 -1
  60. package/dist/{thread-manager-CVu7o2cs.d.ts → thread-manager-CcRXasqs.d.ts} +2 -4
  61. package/dist/{thread-manager-HSwyh28L.d.cts → thread-manager-ClwSaUnj.d.cts} +2 -4
  62. package/dist/{thread-manager-c1gPopAG.d.ts → thread-manager-D-7lp1JK.d.ts} +2 -4
  63. package/dist/{thread-manager-wGi-LqIP.d.cts → thread-manager-Y8Ucf0Tf.d.cts} +2 -4
  64. package/dist/{types-C06FwR96.d.cts → types-Bcbiq8iv.d.cts} +162 -44
  65. package/dist/{types-BH_IRryz.d.ts → types-DpHTX-iO.d.ts} +54 -6
  66. package/dist/{types-DNr31FzL.d.ts → types-Dt8-HBBT.d.ts} +162 -44
  67. package/dist/{types-BaOw4hKI.d.cts → types-hFFi-Zd9.d.cts} +54 -6
  68. package/dist/{workflow-CSCkpwAL.d.ts → workflow-Bmf9EtDW.d.ts} +82 -2
  69. package/dist/{workflow-DuvMZ8Vm.d.cts → workflow-Bx9utBwb.d.cts} +82 -2
  70. package/dist/workflow.cjs +188 -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 +185 -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 +68 -28
  105. package/src/lib/session/types.ts +60 -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-Bx9utBwb.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-Bx9utBwb.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-Bcbiq8iv.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-Bcbiq8iv.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-hFFi-Zd9.cjs';
9
+ export { P as ProviderThreadManager } from './types-hFFi-Zd9.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-Bmf9EtDW.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-Bmf9EtDW.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-Dt8-HBBT.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-Dt8-HBBT.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-DpHTX-iO.js';
9
+ export { P as ProviderThreadManager } from './types-DpHTX-iO.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,12 @@ 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
+ });
1354
+ }
1258
1355
  return {
1259
1356
  threadId,
1260
1357
  finalMessage,
@@ -1283,6 +1380,18 @@ function defineWorkflow(config, fn) {
1283
1380
  return workflow;
1284
1381
  }
1285
1382
 
1383
+ // src/lib/thread/keys.ts
1384
+ var THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;
1385
+ function getThreadListKey(threadKey, threadId) {
1386
+ return `${threadKey}:thread:${threadId}`;
1387
+ }
1388
+ function getThreadMetaKey(threadKey, threadId) {
1389
+ return `${threadKey}:meta:thread:${threadId}`;
1390
+ }
1391
+ function getThreadStateKey(threadKey, threadId) {
1392
+ return `${threadKey}:state:thread:${threadId}`;
1393
+ }
1394
+
1286
1395
  // src/lib/types.ts
1287
1396
  function isTerminalStatus(status) {
1288
1397
  return status === "COMPLETED" || status === "FAILED" || status === "CANCELLED";
@@ -1302,11 +1411,19 @@ function createAgentStateManager({
1302
1411
  let systemPrompt = initialState?.systemPrompt;
1303
1412
  const tasks = new Map(initialState?.tasks);
1304
1413
  const {
1305
- status: _,
1306
- version: __,
1307
- turns: ___,
1308
- tasks: ____,
1309
- tools: _____,
1414
+ status: _status,
1415
+ version: _version,
1416
+ turns: _turns,
1417
+ tasks: _tasks,
1418
+ tools: _tools,
1419
+ systemPrompt: _systemPrompt,
1420
+ fileTree: _fileTree,
1421
+ inlineFiles: _inlineFiles,
1422
+ virtualFsCtx: _virtualFsCtx,
1423
+ totalInputTokens: _totalInputTokens,
1424
+ totalOutputTokens: _totalOutputTokens,
1425
+ cachedWriteTokens: _cachedWriteTokens,
1426
+ cachedReadTokens: _cachedReadTokens,
1310
1427
  ...custom
1311
1428
  } = initialState ?? {};
1312
1429
  const customState = custom;
@@ -1386,7 +1503,14 @@ function createAgentStateManager({
1386
1503
  version++;
1387
1504
  },
1388
1505
  mergeUpdate(update) {
1389
- Object.assign(customState, update);
1506
+ const { tasks: nextTasks, ...rest } = update;
1507
+ if (nextTasks) {
1508
+ tasks.clear();
1509
+ for (const [id, task] of nextTasks) {
1510
+ tasks.set(id, task);
1511
+ }
1512
+ }
1513
+ Object.assign(customState, rest);
1390
1514
  version++;
1391
1515
  },
1392
1516
  getCurrentState() {
@@ -1424,6 +1548,12 @@ function createAgentStateManager({
1424
1548
  }
1425
1549
  return deleted;
1426
1550
  },
1551
+ getPersistedSlice() {
1552
+ return {
1553
+ tasks: Array.from(tasks.entries()),
1554
+ custom: { ...customState }
1555
+ };
1556
+ },
1427
1557
  updateUsage(usage) {
1428
1558
  totalInputTokens += usage.inputTokens ?? 0;
1429
1559
  totalOutputTokens += usage.outputTokens ?? 0;
@@ -1545,22 +1675,42 @@ function defineSubagentWorkflow(config, fn) {
1545
1675
  });
1546
1676
  }
1547
1677
  const parentHandle = getExternalWorkflowHandle(parent.workflowId);
1678
+ let capturedSandboxId;
1679
+ let capturedSnapshot;
1680
+ let capturedBaseSnapshot;
1681
+ let capturedThreadId;
1548
1682
  const sessionInput = {
1549
1683
  agentName: config.name,
1550
1684
  sandboxShutdown: effectiveShutdown,
1551
1685
  ...workflowInput.thread && { thread: workflowInput.thread },
1552
1686
  ...workflowInput.sandbox && { sandbox: workflowInput.sandbox },
1553
- onSandboxReady: (sandboxId) => {
1687
+ onSandboxReady: ({ sandboxId, baseSnapshot }) => {
1688
+ capturedBaseSnapshot = baseSnapshot;
1554
1689
  const isReuse = workflowInput.sandbox?.mode === "continue";
1555
1690
  if (!isReuse) {
1556
1691
  void parentHandle.signal(childSandboxReadySignal, {
1557
1692
  childWorkflowId: workflowInfo().workflowId,
1558
- sandboxId
1693
+ sandboxId,
1694
+ ...baseSnapshot && { baseSnapshot }
1559
1695
  });
1560
1696
  }
1697
+ },
1698
+ onSessionExit: ({ sandboxId, snapshot, threadId }) => {
1699
+ capturedSandboxId = sandboxId;
1700
+ capturedSnapshot = snapshot;
1701
+ capturedThreadId = threadId;
1702
+ }
1703
+ };
1704
+ const result = await fn(prompt, sessionInput, context ?? {});
1705
+ return {
1706
+ ...result,
1707
+ ...capturedThreadId !== void 0 && { threadId: capturedThreadId },
1708
+ ...capturedSandboxId !== void 0 && { sandboxId: capturedSandboxId },
1709
+ ...capturedSnapshot !== void 0 && { snapshot: capturedSnapshot },
1710
+ ...capturedBaseSnapshot !== void 0 && {
1711
+ baseSnapshot: capturedBaseSnapshot
1561
1712
  }
1562
1713
  };
1563
- return fn(prompt, sessionInput, context ?? {});
1564
1714
  };
1565
1715
  Object.defineProperty(workflow, "name", { value: config.name });
1566
1716
  return Object.assign(workflow, {
@@ -2330,7 +2480,6 @@ var FileSystemSkillProvider = class {
2330
2480
  };
2331
2481
 
2332
2482
  // src/lib/thread/manager.ts
2333
- var THREAD_TTL_SECONDS = 60 * 60 * 24 * 90;
2334
2483
  var APPEND_IDEMPOTENT_SCRIPT = `
2335
2484
  if redis.call('EXISTS', KEYS[1]) == 1 then
2336
2485
  return 0
@@ -2342,8 +2491,8 @@ redis.call('EXPIRE', KEYS[2], tonumber(ARGV[1]))
2342
2491
  redis.call('SET', KEYS[1], '1', 'EX', tonumber(ARGV[1]))
2343
2492
  return 1
2344
2493
  `;
2345
- function getThreadKey(threadId, key) {
2346
- return `${key}:thread:${threadId}`;
2494
+ function getDedupKey(threadId, id) {
2495
+ return `dedup:${id}:thread:${threadId}`;
2347
2496
  }
2348
2497
  function createThreadManager(config) {
2349
2498
  const {
@@ -2354,8 +2503,9 @@ function createThreadManager(config) {
2354
2503
  deserialize = (raw) => JSON.parse(raw),
2355
2504
  idOf
2356
2505
  } = config;
2357
- const redisKey = getThreadKey(threadId, key);
2358
- const metaKey = getThreadKey(threadId, `${key}:meta`);
2506
+ const redisKey = getThreadListKey(key, threadId);
2507
+ const metaKey = getThreadMetaKey(key, threadId);
2508
+ const stateKey = getThreadStateKey(key, threadId);
2359
2509
  async function assertThreadExists() {
2360
2510
  const exists = await redis.exists(metaKey);
2361
2511
  if (!exists) {
@@ -2377,7 +2527,7 @@ function createThreadManager(config) {
2377
2527
  await assertThreadExists();
2378
2528
  if (idOf) {
2379
2529
  const dedupId = messages.map(idOf).join(":");
2380
- const dedupKey = getThreadKey(threadId, `dedup:${dedupId}`);
2530
+ const dedupKey = getDedupKey(threadId, dedupId);
2381
2531
  await redis.eval(
2382
2532
  APPEND_IDEMPOTENT_SCRIPT,
2383
2533
  2,
@@ -2394,34 +2544,98 @@ function createThreadManager(config) {
2394
2544
  async fork(newThreadId) {
2395
2545
  await assertThreadExists();
2396
2546
  const data = await redis.lrange(redisKey, 0, -1);
2547
+ const stateRaw = await redis.get(stateKey);
2397
2548
  const forked = createThreadManager({
2398
2549
  ...config,
2399
2550
  threadId: newThreadId
2400
2551
  });
2401
2552
  await forked.initialize();
2402
2553
  if (data.length > 0) {
2403
- const newKey = getThreadKey(newThreadId, key);
2554
+ const newKey = getThreadListKey(key, newThreadId);
2404
2555
  await redis.rpush(newKey, ...data);
2405
2556
  await redis.expire(newKey, THREAD_TTL_SECONDS);
2406
2557
  }
2558
+ if (stateRaw != null) {
2559
+ const newStateKey = getThreadStateKey(key, newThreadId);
2560
+ await redis.set(newStateKey, stateRaw, "EX", THREAD_TTL_SECONDS);
2561
+ }
2407
2562
  return forked;
2408
2563
  },
2564
+ async replaceAll(messages) {
2565
+ await assertThreadExists();
2566
+ if (!idOf) {
2567
+ throw new Error(
2568
+ "replaceAll requires the thread manager to be configured with `idOf`"
2569
+ );
2570
+ }
2571
+ const existing = await redis.lrange(redisKey, 0, -1);
2572
+ const existingIds = existing.map((raw) => idOf(deserialize(raw))).filter((id) => typeof id === "string");
2573
+ await redis.del(redisKey);
2574
+ if (existingIds.length > 0) {
2575
+ await redis.del(
2576
+ ...existingIds.map((id) => getDedupKey(threadId, id))
2577
+ );
2578
+ }
2579
+ if (messages.length > 0) {
2580
+ await redis.rpush(redisKey, ...messages.map(serialize));
2581
+ await redis.expire(redisKey, THREAD_TTL_SECONDS);
2582
+ }
2583
+ await redis.expire(metaKey, THREAD_TTL_SECONDS);
2584
+ },
2409
2585
  async delete() {
2410
- await redis.del(redisKey, metaKey);
2586
+ await redis.del(redisKey, metaKey, stateKey);
2587
+ },
2588
+ async loadState() {
2589
+ const raw = await redis.get(stateKey);
2590
+ if (raw == null) return null;
2591
+ return JSON.parse(raw);
2592
+ },
2593
+ async saveState(state) {
2594
+ await assertThreadExists();
2595
+ await redis.set(
2596
+ stateKey,
2597
+ JSON.stringify(state),
2598
+ "EX",
2599
+ THREAD_TTL_SECONDS
2600
+ );
2601
+ },
2602
+ async deleteState() {
2603
+ await redis.del(stateKey);
2411
2604
  },
2412
2605
  async length() {
2413
2606
  await assertThreadExists();
2414
2607
  return redis.llen(redisKey);
2415
2608
  },
2416
- async truncate(length) {
2609
+ async truncateFromId(messageId) {
2417
2610
  await assertThreadExists();
2418
- if (length <= 0) {
2611
+ if (!idOf) {
2612
+ throw new Error(
2613
+ "truncateFromId requires the thread manager to be configured with `idOf`"
2614
+ );
2615
+ }
2616
+ const data = await redis.lrange(redisKey, 0, -1);
2617
+ let idx = -1;
2618
+ const removedIds = [];
2619
+ for (let i = 0; i < data.length; i++) {
2620
+ const raw = data[i];
2621
+ if (raw === void 0) continue;
2622
+ const id = idOf(deserialize(raw));
2623
+ if (idx === -1 && id === messageId) idx = i;
2624
+ if (idx !== -1) removedIds.push(id);
2625
+ }
2626
+ if (idx === -1) return;
2627
+ if (idx === 0) {
2419
2628
  await redis.del(redisKey);
2420
2629
  await redis.expire(metaKey, THREAD_TTL_SECONDS);
2421
2630
  } else {
2422
- await redis.ltrim(redisKey, 0, length - 1);
2631
+ await redis.ltrim(redisKey, 0, idx - 1);
2423
2632
  await redis.expire(redisKey, THREAD_TTL_SECONDS);
2424
2633
  }
2634
+ if (removedIds.length > 0) {
2635
+ await redis.del(
2636
+ ...removedIds.map((id) => getDedupKey(threadId, id))
2637
+ );
2638
+ }
2425
2639
  }
2426
2640
  };
2427
2641
  }
@@ -3236,6 +3450,6 @@ var toTree = async (fs, opts = {}) => {
3236
3450
  return base + subtree;
3237
3451
  };
3238
3452
 
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 };
3453
+ 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
3454
  //# sourceMappingURL=index.js.map
3241
3455
  //# sourceMappingURL=index.js.map