zeitlich 0.2.32 → 0.2.34

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 (143) hide show
  1. package/README.md +28 -16
  2. package/dist/{activities-FIXVz7DT.d.ts → activities-JOqPfKP0.d.cts} +6 -5
  3. package/dist/{activities-DA-bQM12.d.cts → activities-WwMsjRwm.d.ts} +6 -5
  4. package/dist/adapters/sandbox/bedrock/index.cjs +2 -0
  5. package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -1
  6. package/dist/adapters/sandbox/bedrock/index.d.cts +4 -3
  7. package/dist/adapters/sandbox/bedrock/index.d.ts +4 -3
  8. package/dist/adapters/sandbox/bedrock/index.js +2 -0
  9. package/dist/adapters/sandbox/bedrock/index.js.map +1 -1
  10. package/dist/adapters/sandbox/bedrock/workflow.cjs +1 -0
  11. package/dist/adapters/sandbox/bedrock/workflow.cjs.map +1 -1
  12. package/dist/adapters/sandbox/bedrock/workflow.d.cts +2 -2
  13. package/dist/adapters/sandbox/bedrock/workflow.d.ts +2 -2
  14. package/dist/adapters/sandbox/bedrock/workflow.js +1 -0
  15. package/dist/adapters/sandbox/bedrock/workflow.js.map +1 -1
  16. package/dist/adapters/sandbox/daytona/index.cjs +2 -0
  17. package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
  18. package/dist/adapters/sandbox/daytona/index.d.cts +2 -1
  19. package/dist/adapters/sandbox/daytona/index.d.ts +2 -1
  20. package/dist/adapters/sandbox/daytona/index.js +2 -0
  21. package/dist/adapters/sandbox/daytona/index.js.map +1 -1
  22. package/dist/adapters/sandbox/daytona/workflow.cjs +1 -0
  23. package/dist/adapters/sandbox/daytona/workflow.cjs.map +1 -1
  24. package/dist/adapters/sandbox/daytona/workflow.d.cts +1 -1
  25. package/dist/adapters/sandbox/daytona/workflow.d.ts +1 -1
  26. package/dist/adapters/sandbox/daytona/workflow.js +1 -0
  27. package/dist/adapters/sandbox/daytona/workflow.js.map +1 -1
  28. package/dist/adapters/sandbox/e2b/index.cjs +3 -0
  29. package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
  30. package/dist/adapters/sandbox/e2b/index.d.cts +2 -1
  31. package/dist/adapters/sandbox/e2b/index.d.ts +2 -1
  32. package/dist/adapters/sandbox/e2b/index.js +3 -0
  33. package/dist/adapters/sandbox/e2b/index.js.map +1 -1
  34. package/dist/adapters/sandbox/e2b/workflow.cjs +1 -0
  35. package/dist/adapters/sandbox/e2b/workflow.cjs.map +1 -1
  36. package/dist/adapters/sandbox/e2b/workflow.d.cts +1 -1
  37. package/dist/adapters/sandbox/e2b/workflow.d.ts +1 -1
  38. package/dist/adapters/sandbox/e2b/workflow.js +1 -0
  39. package/dist/adapters/sandbox/e2b/workflow.js.map +1 -1
  40. package/dist/adapters/sandbox/inmemory/index.cjs +2 -0
  41. package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
  42. package/dist/adapters/sandbox/inmemory/index.d.cts +2 -1
  43. package/dist/adapters/sandbox/inmemory/index.d.ts +2 -1
  44. package/dist/adapters/sandbox/inmemory/index.js +2 -0
  45. package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
  46. package/dist/adapters/sandbox/inmemory/workflow.cjs +1 -0
  47. package/dist/adapters/sandbox/inmemory/workflow.cjs.map +1 -1
  48. package/dist/adapters/sandbox/inmemory/workflow.d.cts +1 -1
  49. package/dist/adapters/sandbox/inmemory/workflow.d.ts +1 -1
  50. package/dist/adapters/sandbox/inmemory/workflow.js +1 -0
  51. package/dist/adapters/sandbox/inmemory/workflow.js.map +1 -1
  52. package/dist/adapters/thread/anthropic/index.cjs +18 -2
  53. package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
  54. package/dist/adapters/thread/anthropic/index.d.cts +12 -11
  55. package/dist/adapters/thread/anthropic/index.d.ts +12 -11
  56. package/dist/adapters/thread/anthropic/index.js +18 -2
  57. package/dist/adapters/thread/anthropic/index.js.map +1 -1
  58. package/dist/adapters/thread/anthropic/workflow.d.cts +5 -5
  59. package/dist/adapters/thread/anthropic/workflow.d.ts +5 -5
  60. package/dist/adapters/thread/google-genai/index.cjs +29 -8
  61. package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
  62. package/dist/adapters/thread/google-genai/index.d.cts +8 -8
  63. package/dist/adapters/thread/google-genai/index.d.ts +8 -8
  64. package/dist/adapters/thread/google-genai/index.js +29 -8
  65. package/dist/adapters/thread/google-genai/index.js.map +1 -1
  66. package/dist/adapters/thread/google-genai/workflow.d.cts +5 -5
  67. package/dist/adapters/thread/google-genai/workflow.d.ts +5 -5
  68. package/dist/adapters/thread/langchain/index.cjs +42 -23
  69. package/dist/adapters/thread/langchain/index.cjs.map +1 -1
  70. package/dist/adapters/thread/langchain/index.d.cts +13 -11
  71. package/dist/adapters/thread/langchain/index.d.ts +13 -11
  72. package/dist/adapters/thread/langchain/index.js +42 -23
  73. package/dist/adapters/thread/langchain/index.js.map +1 -1
  74. package/dist/adapters/thread/langchain/workflow.d.cts +5 -5
  75. package/dist/adapters/thread/langchain/workflow.d.ts +5 -5
  76. package/dist/index.cjs +148 -34
  77. package/dist/index.cjs.map +1 -1
  78. package/dist/index.d.cts +32 -16
  79. package/dist/index.d.ts +32 -16
  80. package/dist/index.js +147 -35
  81. package/dist/index.js.map +1 -1
  82. package/dist/{proxy-CTCYWjkr.d.cts → proxy-BesT2ioL.d.cts} +1 -1
  83. package/dist/{proxy-Br4unLTC.d.ts → proxy-Bz6wXYW-.d.ts} +1 -1
  84. package/dist/{thread-manager-Cv_BR28i.d.cts → thread-manager-CCVAOK8g.d.cts} +1 -1
  85. package/dist/{thread-manager-CUubPYPH.d.cts → thread-manager-Cf_34H8w.d.cts} +1 -1
  86. package/dist/{thread-manager-YJLoc1vH.d.ts → thread-manager-ClKAQx78.d.ts} +1 -1
  87. package/dist/{thread-manager-DKWxHUzD.d.ts → thread-manager-DarJIK_b.d.ts} +1 -1
  88. package/dist/{types-Bpq5fDI5.d.cts → types-BGLW5Zyj.d.ts} +35 -20
  89. package/dist/{types-BxiT8w9d.d.ts → types-BVUmLYpj.d.ts} +1 -1
  90. package/dist/{types-DUvEZSDe.d.cts → types-CBH54cwr.d.cts} +1 -1
  91. package/dist/{types-NJDyMyUx.d.cts → types-DPAZ3KCs.d.cts} +1 -1
  92. package/dist/{types-CheCTLeV.d.ts → types-DlLajQcu.d.cts} +35 -20
  93. package/dist/{types-AujBIMMn.d.cts → types-DxCpFNv_.d.cts} +4 -0
  94. package/dist/{types-AujBIMMn.d.ts → types-DxCpFNv_.d.ts} +4 -0
  95. package/dist/{types-DBk-C8zM.d.ts → types-wiGLvxWf.d.ts} +1 -1
  96. package/dist/{workflow-BWKQcz9d.d.cts → workflow-_ZGcacCK.d.ts} +32 -4
  97. package/dist/{workflow-D8wK7TJY.d.ts → workflow-hocXpLwg.d.cts} +32 -4
  98. package/dist/workflow.cjs +126 -30
  99. package/dist/workflow.cjs.map +1 -1
  100. package/dist/workflow.d.cts +3 -3
  101. package/dist/workflow.d.ts +3 -3
  102. package/dist/workflow.js +126 -31
  103. package/dist/workflow.js.map +1 -1
  104. package/package.json +1 -1
  105. package/src/adapters/sandbox/bedrock/index.ts +4 -0
  106. package/src/adapters/sandbox/bedrock/proxy.ts +1 -0
  107. package/src/adapters/sandbox/daytona/index.ts +4 -0
  108. package/src/adapters/sandbox/daytona/proxy.ts +1 -0
  109. package/src/adapters/sandbox/e2b/index.ts +4 -0
  110. package/src/adapters/sandbox/e2b/proxy.ts +1 -0
  111. package/src/adapters/sandbox/inmemory/index.ts +4 -0
  112. package/src/adapters/sandbox/inmemory/proxy.ts +1 -0
  113. package/src/adapters/thread/anthropic/activities.ts +4 -3
  114. package/src/adapters/thread/anthropic/model-invoker.ts +15 -5
  115. package/src/adapters/thread/google-genai/activities.ts +4 -3
  116. package/src/adapters/thread/google-genai/model-invoker.ts +24 -11
  117. package/src/adapters/thread/langchain/activities.ts +3 -3
  118. package/src/adapters/thread/langchain/model-invoker.ts +63 -34
  119. package/src/index.ts +1 -0
  120. package/src/lib/activity.ts +36 -9
  121. package/src/lib/lifecycle.ts +7 -3
  122. package/src/lib/model/helpers.ts +1 -0
  123. package/src/lib/model/index.ts +1 -0
  124. package/src/lib/model/proxy.ts +50 -0
  125. package/src/lib/sandbox/manager.ts +7 -0
  126. package/src/lib/sandbox/types.ts +4 -0
  127. package/src/lib/session/session-edge-cases.integration.test.ts +194 -0
  128. package/src/lib/session/session.integration.test.ts +5 -0
  129. package/src/lib/session/session.ts +9 -0
  130. package/src/lib/session/types.ts +5 -0
  131. package/src/lib/subagent/define.ts +1 -1
  132. package/src/lib/subagent/handler.ts +142 -32
  133. package/src/lib/subagent/index.ts +5 -1
  134. package/src/lib/subagent/signals.ts +8 -1
  135. package/src/lib/subagent/subagent.integration.test.ts +532 -25
  136. package/src/lib/subagent/types.ts +32 -15
  137. package/src/lib/subagent/workflow.ts +26 -13
  138. package/src/lib/virtual-fs/manager.ts +1 -1
  139. package/src/lib/virtual-fs/types.ts +2 -2
  140. package/src/lib/virtual-fs/virtual-fs.test.ts +2 -2
  141. package/src/workflow.ts +3 -0
  142. package/src/lib/.env +0 -1
  143. package/src/tools/bash/.env +0 -1
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-BWKQcz9d.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 proxyVirtualFsOps, a0 as readFileTool, a1 as taskCreateTool, a2 as taskGetTool, a3 as taskListTool, a4 as taskUpdateTool, a5 as writeFileTool } from './workflow-BWKQcz9d.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-Bpq5fDI5.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 RawToolCall, W as RunAgentActivity, X as SandboxInit, Y as SandboxShutdown, S as ScopedPrefix, Z as SerializableToolDefinition, _ as SessionConfig, $ as SessionEndHook, a0 as SessionEndHookContext, a1 as SessionExitReason, a2 as SessionResult, a3 as SessionStartHook, a4 as SessionStartHookContext, a5 as SubagentConfig, a6 as SubagentDefinition, a7 as SubagentFnResult, a8 as SubagentHandlerResponse, a9 as SubagentHooks, aa as SubagentSandboxConfig, ab as SubagentSandboxShutdown, ac as SubagentSessionInput, ad as SubagentWorkflow, ae as SubagentWorkflowInput, af as TaskStatus, ag as ThreadInit, T as ThreadOps, ah as TokenUsage, ai as ToolArgs, aj as ToolCallResult, ak as ToolCallResultUnion, al as ToolDefinition, am as ToolHandler, an as ToolHooks, ao as ToolMap, ap as ToolNames, aq as ToolResult, ar as ToolRouter, as as ToolRouterHooks, at as ToolWithHandler, au as VirtualFileSystem, av as VirtualFileTree, aw as VirtualFsOps, ax as VirtualFsState, ay as WorkflowTask, az as ZeitlichSession, aA as isTerminalStatus } from './types-Bpq5fDI5.cjs';
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-AujBIMMn.cjs';
6
- export { h as ExecOptions, c as SandboxCapabilities, e as SandboxCreateResult, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps } from './types-AujBIMMn.cjs';
1
+ import { B as BashArgs, F as FileEditArgs, G as GlobArgs, a as FileReadArgs, b as FileWriteArgs } from './workflow-hocXpLwg.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-hocXpLwg.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-DlLajQcu.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 RawToolCall, W as RunAgentActivity, X as SandboxInit, Y as SandboxShutdown, S as ScopedPrefix, Z as SerializableToolDefinition, _ as SessionConfig, $ as SessionEndHook, a0 as SessionEndHookContext, a1 as SessionExitReason, a2 as SessionResult, a3 as SessionStartHook, a4 as SessionStartHookContext, a5 as SubagentConfig, a6 as SubagentDefinition, a7 as SubagentFnResult, a8 as SubagentHandlerResponse, a9 as SubagentHooks, aa as SubagentSandboxConfig, ab as SubagentSandboxShutdown, ac as SubagentSessionInput, ad as SubagentWorkflow, ae as SubagentWorkflowInput, af as TaskStatus, ag as ThreadInit, T as ThreadOps, ah as TokenUsage, ai as ToolArgs, aj as ToolCallResult, ak as ToolCallResultUnion, al as ToolDefinition, am as ToolHandler, an as ToolHooks, ao as ToolMap, ap as ToolNames, aq as ToolResult, ar as ToolRouter, as as ToolRouterHooks, at as ToolWithHandler, au as VirtualFileSystem, av as VirtualFileTree, aw as VirtualFsOps, ax as VirtualFsState, ay as WorkflowTask, az as ZeitlichSession, aA as isTerminalStatus } from './types-DlLajQcu.cjs';
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-DxCpFNv_.cjs';
6
+ export { h as ExecOptions, c as SandboxCapabilities, e as SandboxCreateResult, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps } from './types-DxCpFNv_.cjs';
7
7
  import { WorkflowClient } from '@temporalio/client';
8
- import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-NJDyMyUx.cjs';
9
- export { P as ProviderThreadManager } from './types-NJDyMyUx.cjs';
8
+ import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-DPAZ3KCs.cjs';
9
+ export { P as ProviderThreadManager } from './types-DPAZ3KCs.cjs';
10
10
  import 'zod';
11
11
  import '@temporalio/workflow';
12
12
  import '@temporalio/common';
@@ -97,27 +97,42 @@ declare function withSandbox<TArgs, TResult, TSandbox extends Sandbox = Sandbox,
97
97
  sandboxId: string;
98
98
  }) => Promise<ToolHandlerResponse<TResult, TToolResponse>>): ActivityToolHandler<TArgs, TResult | null, RouterContext, TToolResponse | string>;
99
99
 
100
+ /**
101
+ * Safely retrieve Temporal activity heartbeat and cancellation signal.
102
+ * Returns empty object when called outside a Temporal activity (e.g. tests).
103
+ */
104
+ declare function getActivityContext(): {
105
+ heartbeat?: () => void;
106
+ signal?: AbortSignal;
107
+ };
100
108
  /**
101
109
  * Query the parent workflow's state from within an activity.
102
110
  * Resolves the workflow handle from the current activity context.
103
111
  */
104
112
  declare function queryParentWorkflowState<T>(client: WorkflowClient): Promise<T>;
105
113
  /**
106
- * Wraps a handler into a `RunAgentActivity` by auto-fetching the parent
107
- * workflow's agent state before each invocation.
114
+ * Wraps a handler into a scope-prefixed `RunAgentActivity` by auto-fetching
115
+ * the parent workflow's agent state before each invocation.
116
+ *
117
+ * Returns a `Record` with a single key `run<Scope>` so it can be spread
118
+ * into the activities object alongside adapter activities.
119
+ *
120
+ * @param scope - Workflow scope used to derive the activity name.
121
+ * `"myAgentWorkflow"` produces `{ runMyAgentWorkflow: fn }`.
108
122
  *
109
123
  * @example
110
124
  * ```typescript
111
125
  * import { createRunAgentActivity } from 'zeitlich';
112
- * import { createLangChainModelInvoker } from 'zeitlich/adapters/thread/langchain';
113
126
  *
114
- * const invoker = createLangChainModelInvoker({ redis, model });
115
- * return { runAgent: createRunAgentActivity(client, invoker) };
127
+ * return {
128
+ * ...adapter.createActivities("myAgentWorkflow"),
129
+ * ...createRunAgentActivity(client, adapter.invoker, "myAgentWorkflow"),
130
+ * };
116
131
  * ```
117
132
  */
118
133
  declare function createRunAgentActivity<R, S extends BaseAgentState = BaseAgentState>(client: WorkflowClient, handler: (config: RunAgentConfig & {
119
134
  state: S;
120
- }) => Promise<R>): (config: RunAgentConfig) => Promise<R>;
135
+ }) => Promise<R>, scope: string): Record<string, (config: RunAgentConfig) => Promise<R>>;
121
136
  /**
122
137
  * Context injected into tool handlers created via {@link withParentWorkflowState}.
123
138
  */
@@ -282,6 +297,7 @@ declare class SandboxManager<TOptions extends SandboxCreateOptions = SandboxCrea
282
297
  getSandbox(id: string): Promise<TSandbox>;
283
298
  destroy(id: string): Promise<void>;
284
299
  pause(id: string, ttlSeconds?: number): Promise<void>;
300
+ resume(id: string): Promise<void>;
285
301
  snapshot(id: string): Promise<SandboxSnapshot>;
286
302
  restore(snapshot: SandboxSnapshot): Promise<string>;
287
303
  fork(sandboxId: string): Promise<string>;
@@ -401,7 +417,7 @@ declare function withVirtualFs<TArgs, TResult, TCtx, TMeta = FileEntryMetadata,
401
417
  * const activities = {
402
418
  * ...createVirtualFsActivities(resolver, "CodingAgent"),
403
419
  * };
404
- * // registers: codingAgentResolveFileTree
420
+ * // registers: virtualFsCodingAgentResolveFileTree
405
421
  * ```
406
422
  */
407
423
  declare function createVirtualFsActivities<S extends string, TCtx = unknown, TMeta = FileEntryMetadata>(resolver: FileResolver<TCtx, TMeta>, scope: S): PrefixedVirtualFsOps<S, TCtx, TMeta>;
@@ -496,4 +512,4 @@ declare const toTree: (fs: SandboxFileSystem, opts?: {
496
512
  sort?: boolean;
497
513
  }) => Promise<string>;
498
514
 
499
- export { ActivityToolHandler, type AgentStateContext, BaseAgentState, BaseThreadManager, BashArgs, ExecResult, FileEditArgs, FileEntryMetadata, FileReadArgs, FileResolver, FileSystemSkillProvider, FileWriteArgs, GlobArgs, JsonValue, NodeFsSandboxFileSystem, type PreCreateHookResult, PrefixedSandboxOps, PrefixedVirtualFsOps, RouterContext, RunAgentConfig, Sandbox, type SandboxContext, SandboxCreateOptions, DirentEntry as SandboxDirentEntry, FileStat as SandboxFileStat, SandboxFileSystem, SandboxManager, type SandboxManagerHooks, SandboxProvider, SandboxSnapshot, Skill, SkillMetadata, SkillProvider, ThreadManagerConfig, ToolHandlerResponse, ToolResultConfig, TreeMutation, VirtualFsContext, bashHandler, createRunAgentActivity, createThreadManager, createVirtualFsActivities, editHandler, globHandler, queryParentWorkflowState, readFileHandler, toTree, withAutoAppend, withParentWorkflowState, withSandbox, withVirtualFs, writeFileHandler };
515
+ export { ActivityToolHandler, type AgentStateContext, BaseAgentState, BaseThreadManager, BashArgs, ExecResult, FileEditArgs, FileEntryMetadata, FileReadArgs, FileResolver, FileSystemSkillProvider, FileWriteArgs, GlobArgs, JsonValue, NodeFsSandboxFileSystem, type PreCreateHookResult, PrefixedSandboxOps, PrefixedVirtualFsOps, RouterContext, RunAgentConfig, Sandbox, type SandboxContext, SandboxCreateOptions, DirentEntry as SandboxDirentEntry, FileStat as SandboxFileStat, SandboxFileSystem, SandboxManager, type SandboxManagerHooks, SandboxProvider, SandboxSnapshot, Skill, SkillMetadata, SkillProvider, ThreadManagerConfig, ToolHandlerResponse, ToolResultConfig, TreeMutation, VirtualFsContext, bashHandler, createRunAgentActivity, createThreadManager, createVirtualFsActivities, editHandler, getActivityContext, globHandler, queryParentWorkflowState, readFileHandler, toTree, withAutoAppend, withParentWorkflowState, withSandbox, withVirtualFs, writeFileHandler };
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-D8wK7TJY.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 proxyVirtualFsOps, a0 as readFileTool, a1 as taskCreateTool, a2 as taskGetTool, a3 as taskListTool, a4 as taskUpdateTool, a5 as writeFileTool } from './workflow-D8wK7TJY.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-CheCTLeV.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 RawToolCall, W as RunAgentActivity, X as SandboxInit, Y as SandboxShutdown, S as ScopedPrefix, Z as SerializableToolDefinition, _ as SessionConfig, $ as SessionEndHook, a0 as SessionEndHookContext, a1 as SessionExitReason, a2 as SessionResult, a3 as SessionStartHook, a4 as SessionStartHookContext, a5 as SubagentConfig, a6 as SubagentDefinition, a7 as SubagentFnResult, a8 as SubagentHandlerResponse, a9 as SubagentHooks, aa as SubagentSandboxConfig, ab as SubagentSandboxShutdown, ac as SubagentSessionInput, ad as SubagentWorkflow, ae as SubagentWorkflowInput, af as TaskStatus, ag as ThreadInit, T as ThreadOps, ah as TokenUsage, ai as ToolArgs, aj as ToolCallResult, ak as ToolCallResultUnion, al as ToolDefinition, am as ToolHandler, an as ToolHooks, ao as ToolMap, ap as ToolNames, aq as ToolResult, ar as ToolRouter, as as ToolRouterHooks, at as ToolWithHandler, au as VirtualFileSystem, av as VirtualFileTree, aw as VirtualFsOps, ax as VirtualFsState, ay as WorkflowTask, az as ZeitlichSession, aA as isTerminalStatus } from './types-CheCTLeV.js';
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-AujBIMMn.js';
6
- export { h as ExecOptions, c as SandboxCapabilities, e as SandboxCreateResult, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps } from './types-AujBIMMn.js';
1
+ import { B as BashArgs, F as FileEditArgs, G as GlobArgs, a as FileReadArgs, b as FileWriteArgs } from './workflow-_ZGcacCK.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-_ZGcacCK.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-BGLW5Zyj.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 RawToolCall, W as RunAgentActivity, X as SandboxInit, Y as SandboxShutdown, S as ScopedPrefix, Z as SerializableToolDefinition, _ as SessionConfig, $ as SessionEndHook, a0 as SessionEndHookContext, a1 as SessionExitReason, a2 as SessionResult, a3 as SessionStartHook, a4 as SessionStartHookContext, a5 as SubagentConfig, a6 as SubagentDefinition, a7 as SubagentFnResult, a8 as SubagentHandlerResponse, a9 as SubagentHooks, aa as SubagentSandboxConfig, ab as SubagentSandboxShutdown, ac as SubagentSessionInput, ad as SubagentWorkflow, ae as SubagentWorkflowInput, af as TaskStatus, ag as ThreadInit, T as ThreadOps, ah as TokenUsage, ai as ToolArgs, aj as ToolCallResult, ak as ToolCallResultUnion, al as ToolDefinition, am as ToolHandler, an as ToolHooks, ao as ToolMap, ap as ToolNames, aq as ToolResult, ar as ToolRouter, as as ToolRouterHooks, at as ToolWithHandler, au as VirtualFileSystem, av as VirtualFileTree, aw as VirtualFsOps, ax as VirtualFsState, ay as WorkflowTask, az as ZeitlichSession, aA as isTerminalStatus } from './types-BGLW5Zyj.js';
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-DxCpFNv_.js';
6
+ export { h as ExecOptions, c as SandboxCapabilities, e as SandboxCreateResult, i as SandboxNotFoundError, j as SandboxNotSupportedError, g as SandboxOps } from './types-DxCpFNv_.js';
7
7
  import { WorkflowClient } from '@temporalio/client';
8
- import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-BxiT8w9d.js';
9
- export { P as ProviderThreadManager } from './types-BxiT8w9d.js';
8
+ import { a as ThreadManagerConfig, B as BaseThreadManager } from './types-BVUmLYpj.js';
9
+ export { P as ProviderThreadManager } from './types-BVUmLYpj.js';
10
10
  import 'zod';
11
11
  import '@temporalio/workflow';
12
12
  import '@temporalio/common';
@@ -97,27 +97,42 @@ declare function withSandbox<TArgs, TResult, TSandbox extends Sandbox = Sandbox,
97
97
  sandboxId: string;
98
98
  }) => Promise<ToolHandlerResponse<TResult, TToolResponse>>): ActivityToolHandler<TArgs, TResult | null, RouterContext, TToolResponse | string>;
99
99
 
100
+ /**
101
+ * Safely retrieve Temporal activity heartbeat and cancellation signal.
102
+ * Returns empty object when called outside a Temporal activity (e.g. tests).
103
+ */
104
+ declare function getActivityContext(): {
105
+ heartbeat?: () => void;
106
+ signal?: AbortSignal;
107
+ };
100
108
  /**
101
109
  * Query the parent workflow's state from within an activity.
102
110
  * Resolves the workflow handle from the current activity context.
103
111
  */
104
112
  declare function queryParentWorkflowState<T>(client: WorkflowClient): Promise<T>;
105
113
  /**
106
- * Wraps a handler into a `RunAgentActivity` by auto-fetching the parent
107
- * workflow's agent state before each invocation.
114
+ * Wraps a handler into a scope-prefixed `RunAgentActivity` by auto-fetching
115
+ * the parent workflow's agent state before each invocation.
116
+ *
117
+ * Returns a `Record` with a single key `run<Scope>` so it can be spread
118
+ * into the activities object alongside adapter activities.
119
+ *
120
+ * @param scope - Workflow scope used to derive the activity name.
121
+ * `"myAgentWorkflow"` produces `{ runMyAgentWorkflow: fn }`.
108
122
  *
109
123
  * @example
110
124
  * ```typescript
111
125
  * import { createRunAgentActivity } from 'zeitlich';
112
- * import { createLangChainModelInvoker } from 'zeitlich/adapters/thread/langchain';
113
126
  *
114
- * const invoker = createLangChainModelInvoker({ redis, model });
115
- * return { runAgent: createRunAgentActivity(client, invoker) };
127
+ * return {
128
+ * ...adapter.createActivities("myAgentWorkflow"),
129
+ * ...createRunAgentActivity(client, adapter.invoker, "myAgentWorkflow"),
130
+ * };
116
131
  * ```
117
132
  */
118
133
  declare function createRunAgentActivity<R, S extends BaseAgentState = BaseAgentState>(client: WorkflowClient, handler: (config: RunAgentConfig & {
119
134
  state: S;
120
- }) => Promise<R>): (config: RunAgentConfig) => Promise<R>;
135
+ }) => Promise<R>, scope: string): Record<string, (config: RunAgentConfig) => Promise<R>>;
121
136
  /**
122
137
  * Context injected into tool handlers created via {@link withParentWorkflowState}.
123
138
  */
@@ -282,6 +297,7 @@ declare class SandboxManager<TOptions extends SandboxCreateOptions = SandboxCrea
282
297
  getSandbox(id: string): Promise<TSandbox>;
283
298
  destroy(id: string): Promise<void>;
284
299
  pause(id: string, ttlSeconds?: number): Promise<void>;
300
+ resume(id: string): Promise<void>;
285
301
  snapshot(id: string): Promise<SandboxSnapshot>;
286
302
  restore(snapshot: SandboxSnapshot): Promise<string>;
287
303
  fork(sandboxId: string): Promise<string>;
@@ -401,7 +417,7 @@ declare function withVirtualFs<TArgs, TResult, TCtx, TMeta = FileEntryMetadata,
401
417
  * const activities = {
402
418
  * ...createVirtualFsActivities(resolver, "CodingAgent"),
403
419
  * };
404
- * // registers: codingAgentResolveFileTree
420
+ * // registers: virtualFsCodingAgentResolveFileTree
405
421
  * ```
406
422
  */
407
423
  declare function createVirtualFsActivities<S extends string, TCtx = unknown, TMeta = FileEntryMetadata>(resolver: FileResolver<TCtx, TMeta>, scope: S): PrefixedVirtualFsOps<S, TCtx, TMeta>;
@@ -496,4 +512,4 @@ declare const toTree: (fs: SandboxFileSystem, opts?: {
496
512
  sort?: boolean;
497
513
  }) => Promise<string>;
498
514
 
499
- export { ActivityToolHandler, type AgentStateContext, BaseAgentState, BaseThreadManager, BashArgs, ExecResult, FileEditArgs, FileEntryMetadata, FileReadArgs, FileResolver, FileSystemSkillProvider, FileWriteArgs, GlobArgs, JsonValue, NodeFsSandboxFileSystem, type PreCreateHookResult, PrefixedSandboxOps, PrefixedVirtualFsOps, RouterContext, RunAgentConfig, Sandbox, type SandboxContext, SandboxCreateOptions, DirentEntry as SandboxDirentEntry, FileStat as SandboxFileStat, SandboxFileSystem, SandboxManager, type SandboxManagerHooks, SandboxProvider, SandboxSnapshot, Skill, SkillMetadata, SkillProvider, ThreadManagerConfig, ToolHandlerResponse, ToolResultConfig, TreeMutation, VirtualFsContext, bashHandler, createRunAgentActivity, createThreadManager, createVirtualFsActivities, editHandler, globHandler, queryParentWorkflowState, readFileHandler, toTree, withAutoAppend, withParentWorkflowState, withSandbox, withVirtualFs, writeFileHandler };
515
+ export { ActivityToolHandler, type AgentStateContext, BaseAgentState, BaseThreadManager, BashArgs, ExecResult, FileEditArgs, FileEntryMetadata, FileReadArgs, FileResolver, FileSystemSkillProvider, FileWriteArgs, GlobArgs, JsonValue, NodeFsSandboxFileSystem, type PreCreateHookResult, PrefixedSandboxOps, PrefixedVirtualFsOps, RouterContext, RunAgentConfig, Sandbox, type SandboxContext, SandboxCreateOptions, DirentEntry as SandboxDirentEntry, FileStat as SandboxFileStat, SandboxFileSystem, SandboxManager, type SandboxManagerHooks, SandboxProvider, SandboxSnapshot, Skill, SkillMetadata, SkillProvider, ThreadManagerConfig, ToolHandlerResponse, ToolResultConfig, TreeMutation, VirtualFsContext, bashHandler, createRunAgentActivity, createThreadManager, createVirtualFsActivities, editHandler, getActivityContext, globHandler, queryParentWorkflowState, readFileHandler, toTree, withAutoAppend, withParentWorkflowState, withSandbox, withVirtualFs, writeFileHandler };
package/dist/index.js CHANGED
@@ -390,23 +390,50 @@ function createSubagentTool(subagents) {
390
390
  };
391
391
  }
392
392
  var childResultSignal = defineSignal("childResult");
393
+ var childSandboxReadySignal = defineSignal("childSandboxReady");
393
394
  var destroySandboxSignal = defineSignal("destroySandbox");
394
395
 
395
396
  // src/lib/subagent/handler.ts
396
397
  function resolveSandboxConfig(config) {
397
- if (!config || config === "none") return { source: "none" };
398
- if (config === "inherit") return { source: "inherit" };
399
- if (config === "own") return { source: "own" };
400
- return { source: "own", shutdown: config.shutdown };
398
+ if (!config || config === "none") {
399
+ return { source: "none", init: "per-call", continuation: "fork" };
400
+ }
401
+ if (config.source === "inherit") {
402
+ return {
403
+ source: "inherit",
404
+ init: "per-call",
405
+ continuation: config.continuation,
406
+ shutdown: config.shutdown
407
+ };
408
+ }
409
+ return {
410
+ source: "own",
411
+ init: config.init ?? "per-call",
412
+ continuation: config.continuation,
413
+ shutdown: config.shutdown
414
+ };
401
415
  }
402
416
  function createSubagentHandler(subagents) {
403
417
  const { taskQueue: parentTaskQueue } = workflowInfo();
404
418
  const childResults = /* @__PURE__ */ new Map();
405
419
  const pendingDestroys = /* @__PURE__ */ new Map();
406
420
  const threadSandboxes = /* @__PURE__ */ new Map();
421
+ const persistentSandboxes = /* @__PURE__ */ new Map();
422
+ const persistentSandboxCreating = /* @__PURE__ */ new Set();
423
+ const lazyCreatorAgent = /* @__PURE__ */ new Map();
407
424
  setHandler(childResultSignal, ({ childWorkflowId, result }) => {
408
425
  childResults.set(childWorkflowId, result);
409
426
  });
427
+ setHandler(
428
+ childSandboxReadySignal,
429
+ ({ childWorkflowId, sandboxId }) => {
430
+ const agentName = lazyCreatorAgent.get(childWorkflowId);
431
+ if (agentName && !persistentSandboxes.has(agentName)) {
432
+ persistentSandboxes.set(agentName, sandboxId);
433
+ lazyCreatorAgent.delete(childWorkflowId);
434
+ }
435
+ }
436
+ );
410
437
  const handler = async (args, context) => {
411
438
  const config = subagents.find((s) => s.agentName === args.subagent);
412
439
  if (!config) {
@@ -433,21 +460,48 @@ function createSubagentHandler(subagents) {
433
460
  };
434
461
  }
435
462
  let sandbox;
463
+ let sandboxShutdownOverride;
464
+ let isLazyCreator = false;
436
465
  if (sandboxCfg.source === "inherit" && parentSandboxId) {
437
- sandbox = {
438
- mode: "inherit",
439
- sandboxId: parentSandboxId
440
- };
466
+ if (sandboxCfg.continuation === "fork") {
467
+ sandbox = { mode: "fork", sandboxId: parentSandboxId };
468
+ } else {
469
+ sandbox = { mode: "inherit", sandboxId: parentSandboxId };
470
+ }
441
471
  } else if (sandboxCfg.source === "own") {
442
- const prevSbId = continuationThreadId ? threadSandboxes.get(continuationThreadId) : void 0;
443
- if (prevSbId) {
444
- sandbox = { mode: "fork", sandboxId: prevSbId };
472
+ const isLazy = sandboxCfg.init === "once";
473
+ let baseSandboxId;
474
+ if (isLazy) {
475
+ baseSandboxId = persistentSandboxes.get(config.agentName);
476
+ if (!baseSandboxId) {
477
+ if (persistentSandboxCreating.has(config.agentName)) {
478
+ await condition(() => persistentSandboxes.has(config.agentName));
479
+ baseSandboxId = persistentSandboxes.get(config.agentName);
480
+ } else {
481
+ persistentSandboxCreating.add(config.agentName);
482
+ isLazyCreator = true;
483
+ }
484
+ }
485
+ } else if (continuationThreadId) {
486
+ baseSandboxId = threadSandboxes.get(continuationThreadId);
487
+ }
488
+ if (baseSandboxId) {
489
+ sandbox = {
490
+ mode: sandboxCfg.continuation === "continue" ? "continue" : "fork",
491
+ sandboxId: baseSandboxId
492
+ };
493
+ }
494
+ const userShutdown = sandboxCfg.shutdown;
495
+ const alreadySurvives = userShutdown === "pause-until-parent-close" || userShutdown === "keep-until-parent-close" || userShutdown === "pause" || userShutdown === "keep";
496
+ const mustSurvive = isLazyCreator || sandboxCfg.continuation === "continue" || isLazy && sandboxCfg.continuation === "fork";
497
+ if (mustSurvive && !alreadySurvives) {
498
+ sandboxShutdownOverride = isLazyCreator ? "pause-until-parent-close" : "pause";
445
499
  }
446
500
  }
447
501
  const workflowInput = {
448
502
  ...thread && { thread },
449
503
  ...sandbox && { sandbox },
450
- ...sandboxCfg.shutdown && { sandboxShutdown: sandboxCfg.shutdown }
504
+ sandboxShutdown: sandboxShutdownOverride ?? sandboxCfg.shutdown ?? void 0
451
505
  };
452
506
  const resolvedContext = config.context === void 0 ? void 0 : typeof config.context === "function" ? config.context() : config.context;
453
507
  const childOpts = {
@@ -455,6 +509,9 @@ function createSubagentHandler(subagents) {
455
509
  args: resolvedContext === void 0 ? [args.prompt, workflowInput] : [args.prompt, workflowInput, resolvedContext],
456
510
  taskQueue: config.taskQueue ?? parentTaskQueue
457
511
  };
512
+ if (isLazyCreator) {
513
+ lazyCreatorAgent.set(childWorkflowId, config.agentName);
514
+ }
458
515
  log.info("subagent spawned", {
459
516
  subagent: config.agentName,
460
517
  childWorkflowId,
@@ -462,10 +519,10 @@ function createSubagentHandler(subagents) {
462
519
  sandboxSource: sandboxCfg.source
463
520
  });
464
521
  const childHandle = await startChild(config.workflow, childOpts);
465
- const effectiveShutdown = sandboxCfg.shutdown ?? "destroy";
466
- const shouldDeferDestroy = effectiveShutdown === "pause-until-parent-close" && (sandboxCfg.source === "own" || allowsContinuation && sandboxCfg.source !== "inherit");
467
- if (shouldDeferDestroy) {
468
- pendingDestroys.set(childWorkflowId, childHandle);
522
+ const effectiveShutdown = sandboxShutdownOverride ?? sandboxCfg.shutdown ?? "destroy";
523
+ if (effectiveShutdown === "pause-until-parent-close" || effectiveShutdown === "keep-until-parent-close") {
524
+ const key = isLazyCreator ? `persistent:${config.agentName}` : childWorkflowId;
525
+ pendingDestroys.set(key, childHandle);
469
526
  }
470
527
  await Promise.race([
471
528
  condition(() => childResults.has(childWorkflowId)),
@@ -499,8 +556,16 @@ function createSubagentHandler(subagents) {
499
556
  sandboxId: childSandboxId,
500
557
  metadata
501
558
  } = childResult;
502
- if (allowsContinuation && childSandboxId && childThreadId) {
503
- threadSandboxes.set(childThreadId, childSandboxId);
559
+ if (childSandboxId) {
560
+ if (sandboxCfg.source === "own" && sandboxCfg.init === "once" && !persistentSandboxes.has(config.agentName)) {
561
+ persistentSandboxes.set(config.agentName, childSandboxId);
562
+ } else if (allowsContinuation && childThreadId) {
563
+ threadSandboxes.set(childThreadId, childSandboxId);
564
+ }
565
+ }
566
+ if (isLazyCreator) {
567
+ persistentSandboxCreating.delete(config.agentName);
568
+ lazyCreatorAgent.delete(childWorkflowId);
504
569
  }
505
570
  if (!toolResponse) {
506
571
  return {
@@ -706,6 +771,7 @@ async function createSession({
706
771
  thread: threadInit,
707
772
  sandbox: sandboxInit,
708
773
  sandboxShutdown = "destroy",
774
+ onSandboxReady,
709
775
  virtualFs: virtualFsConfig,
710
776
  virtualFsOps
711
777
  }) {
@@ -808,6 +874,9 @@ async function createSession({
808
874
  });
809
875
  }
810
876
  sandboxId = sandboxInit.sandboxId;
877
+ if (sandboxShutdown === "pause-until-parent-close") {
878
+ await sandboxOps.resumeSandbox(sandboxId);
879
+ }
811
880
  sandboxOwned = true;
812
881
  } else if (sandboxMode === "fork") {
813
882
  if (!sandboxOps) {
@@ -830,6 +899,9 @@ async function createSession({
830
899
  sandboxOwned = true;
831
900
  }
832
901
  }
902
+ if (sandboxId && onSandboxReady) {
903
+ onSandboxReady(sandboxId);
904
+ }
833
905
  if (virtualFsConfig) {
834
906
  if (!virtualFsOps) {
835
907
  throw ApplicationFailure.create({
@@ -1299,39 +1371,45 @@ function defineSubagent(definition, overrides) {
1299
1371
  function defineSubagentWorkflow(config, fn) {
1300
1372
  const workflow = async (prompt, workflowInput, context) => {
1301
1373
  const effectiveShutdown = workflowInput.sandboxShutdown ?? config.sandboxShutdown ?? "destroy";
1374
+ const { parent } = workflowInfo();
1375
+ if (!parent) {
1376
+ throw ApplicationFailure.create({
1377
+ message: "Subagent workflow called without a parent workflow",
1378
+ nonRetryable: true
1379
+ });
1380
+ }
1381
+ const parentHandle = getExternalWorkflowHandle(parent.workflowId);
1302
1382
  const sessionInput = {
1303
1383
  agentName: config.name,
1304
1384
  sandboxShutdown: effectiveShutdown,
1305
1385
  ...workflowInput.thread && { thread: workflowInput.thread },
1306
- ...workflowInput.sandbox && { sandbox: workflowInput.sandbox }
1386
+ ...workflowInput.sandbox && { sandbox: workflowInput.sandbox },
1387
+ onSandboxReady: (sandboxId) => {
1388
+ void parentHandle.signal(childSandboxReadySignal, {
1389
+ childWorkflowId: workflowInfo().workflowId,
1390
+ sandboxId
1391
+ });
1392
+ }
1307
1393
  };
1308
1394
  const { destroySandbox, ...result } = await fn(
1309
1395
  prompt,
1310
1396
  sessionInput,
1311
1397
  context ?? {}
1312
1398
  );
1313
- if (effectiveShutdown === "pause-until-parent-close") {
1399
+ if (effectiveShutdown === "pause-until-parent-close" || effectiveShutdown === "keep-until-parent-close") {
1314
1400
  if (!destroySandbox) {
1315
1401
  throw ApplicationFailure.create({
1316
- message: `Subagent "${config.name}" has sandboxShutdown="pause-until-parent-close" but fn did not return a destroySandbox callback`,
1402
+ message: `Subagent "${config.name}" has sandboxShutdown="${effectiveShutdown}" but fn did not return a destroySandbox callback`,
1317
1403
  nonRetryable: true
1318
1404
  });
1319
1405
  }
1320
1406
  if (!result.sandboxId) {
1321
1407
  throw ApplicationFailure.create({
1322
- message: `Subagent "${config.name}" has sandboxShutdown="pause-until-parent-close" but fn did not return a sandboxId`,
1408
+ message: `Subagent "${config.name}" has sandboxShutdown="${effectiveShutdown}" but fn did not return a sandboxId`,
1323
1409
  nonRetryable: true
1324
1410
  });
1325
1411
  }
1326
1412
  }
1327
- const { parent } = workflowInfo();
1328
- if (!parent) {
1329
- throw ApplicationFailure.create({
1330
- message: "Subagent workflow called without a parent workflow",
1331
- nonRetryable: true
1332
- });
1333
- }
1334
- const parentHandle = getExternalWorkflowHandle(parent.workflowId);
1335
1413
  await parentHandle.signal(childResultSignal, {
1336
1414
  childWorkflowId: workflowInfo().workflowId,
1337
1415
  result
@@ -1410,6 +1488,23 @@ function composeHooks(...fns) {
1410
1488
  return lastResult;
1411
1489
  };
1412
1490
  }
1491
+ function proxyRunAgent(scope, options) {
1492
+ const resolvedScope = scope ?? workflowInfo().workflowType;
1493
+ const name = `run${resolvedScope.charAt(0).toUpperCase()}${resolvedScope.slice(1)}`;
1494
+ const acts = proxyActivities(
1495
+ options ?? {
1496
+ startToCloseTimeout: "10m",
1497
+ heartbeatTimeout: "1m",
1498
+ retry: {
1499
+ maximumAttempts: 3,
1500
+ initialInterval: "10s",
1501
+ maximumInterval: "2m",
1502
+ backoffCoefficient: 3
1503
+ }
1504
+ }
1505
+ );
1506
+ return acts[name];
1507
+ }
1413
1508
  var SandboxNotSupportedError = class extends ApplicationFailure$1 {
1414
1509
  constructor(operation) {
1415
1510
  super(
@@ -2166,6 +2261,14 @@ function createThreadManager(config) {
2166
2261
  }
2167
2262
  };
2168
2263
  }
2264
+ function getActivityContext() {
2265
+ try {
2266
+ const ctx = Context.current();
2267
+ return { heartbeat: () => ctx.heartbeat(), signal: ctx.cancellationSignal };
2268
+ } catch {
2269
+ return {};
2270
+ }
2271
+ }
2169
2272
  async function queryParentWorkflowState(client) {
2170
2273
  const { workflowExecution } = Context.current().info;
2171
2274
  const handle = client.getHandle(
@@ -2174,10 +2277,13 @@ async function queryParentWorkflowState(client) {
2174
2277
  );
2175
2278
  return handle.query("getAgentState");
2176
2279
  }
2177
- function createRunAgentActivity(client, handler) {
2178
- return async (config) => {
2179
- const state = await queryParentWorkflowState(client);
2180
- return handler({ ...config, state });
2280
+ function createRunAgentActivity(client, handler, scope) {
2281
+ const name = `run${scope.charAt(0).toUpperCase()}${scope.slice(1)}`;
2282
+ return {
2283
+ [name]: async (config) => {
2284
+ const state = await queryParentWorkflowState(client);
2285
+ return handler({ ...config, state });
2286
+ }
2181
2287
  };
2182
2288
  }
2183
2289
  function withParentWorkflowState(client, handler) {
@@ -2234,6 +2340,9 @@ var SandboxManager = class {
2234
2340
  async pause(id, ttlSeconds) {
2235
2341
  await this.provider.pause(id, ttlSeconds);
2236
2342
  }
2343
+ async resume(id) {
2344
+ await this.provider.resume(id);
2345
+ }
2237
2346
  async snapshot(id) {
2238
2347
  return this.provider.snapshot(id);
2239
2348
  }
@@ -2277,6 +2386,9 @@ var SandboxManager = class {
2277
2386
  pauseSandbox: async (sandboxId, ttlSeconds) => {
2278
2387
  await this.pause(sandboxId, ttlSeconds);
2279
2388
  },
2389
+ resumeSandbox: async (sandboxId) => {
2390
+ await this.resume(sandboxId);
2391
+ },
2280
2392
  snapshotSandbox: async (sandboxId) => {
2281
2393
  return this.snapshot(sandboxId);
2282
2394
  },
@@ -2948,6 +3060,6 @@ var toTree = async (fs, opts = {}) => {
2948
3060
  return base + subtree;
2949
3061
  };
2950
3062
 
2951
- 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, getShortId, globHandler, globTool, grepTool, hasDirectory, hasFileWithMimeType, hasNoOtherToolCalls, isTerminalStatus, parseSkillFile, proxyVirtualFsOps, queryParentWorkflowState, readFileHandler, readFileTool, taskCreateTool, taskGetTool, taskListTool, taskUpdateTool, toTree, withAutoAppend, withParentWorkflowState, withSandbox, withVirtualFs, writeFileHandler, writeFileTool };
3063
+ 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 };
2952
3064
  //# sourceMappingURL=index.js.map
2953
3065
  //# sourceMappingURL=index.js.map