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
@@ -63,19 +63,28 @@ export type InferSubagentResult<T extends SubagentConfig> =
63
63
  /**
64
64
  * Sandbox configuration for a subagent.
65
65
  *
66
- * String shorthands:
67
66
  * - `"none"` — no sandbox (default).
68
- * - `"inherit"` — reuse the parent's sandbox (shared filesystem/exec).
69
- * - `"own"` the child creates and owns its own sandbox (shutdown defaults to `"destroy"`).
70
- *
71
- * Object form (only for `source: "own"`):
72
- * - `{ source: "own", shutdown?: SubagentSandboxShutdown }` own sandbox with explicit shutdown policy.
67
+ * - `{ source: "inherit", continuation }` — reuse the parent's sandbox.
68
+ * `continuation: "continue"` shares the parent sandbox directly;
69
+ * `continuation: "fork"` forks from the parent on every call.
70
+ * - `{ source: "own", init?, continuation }` — the child gets its own sandbox.
71
+ * `init: "per-call"` (default) creates fresh each call (thread continuation
72
+ * uses the previous sandbox). `init: "once"` creates on the first call and
73
+ * stores it for all subsequent calls.
73
74
  */
74
75
  export type SubagentSandboxConfig =
75
76
  | "none"
76
- | "inherit"
77
- | "own"
78
- | { source: "own"; shutdown?: SubagentSandboxShutdown };
77
+ | {
78
+ source: "inherit";
79
+ continuation: "continue" | "fork";
80
+ shutdown?: SubagentSandboxShutdown;
81
+ }
82
+ | {
83
+ source: "own";
84
+ init?: "per-call" | "once";
85
+ continuation: "continue" | "fork";
86
+ shutdown?: SubagentSandboxShutdown;
87
+ };
79
88
 
80
89
  /**
81
90
  * Configuration for a subagent that can be spawned by the parent workflow.
@@ -112,9 +121,6 @@ export interface SubagentConfig<TResult extends z.ZodType = z.ZodType> {
112
121
  /**
113
122
  * Sandbox strategy for this subagent.
114
123
  *
115
- * String shorthands: `"none"` (default) | `"inherit"` | `"own"`.
116
- * Object form: `{ source: "own", shutdown?: SubagentSandboxShutdown }`.
117
- *
118
124
  * @see {@link SubagentSandboxConfig}
119
125
  */
120
126
  sandbox?: SubagentSandboxConfig;
@@ -154,14 +160,17 @@ export interface SubagentHooks<TArgs = unknown, TResult = unknown> {
154
160
  * Extended response from the subagent `fn` — includes optional cleanup callbacks
155
161
  * stripped before signaling the parent.
156
162
  *
157
- * When `TSandboxShutdown` is `"pause-until-parent-close"`, both `destroySandbox`
158
- * and `sandboxId` become required so the parent can coordinate cleanup.
163
+ * When `TSandboxShutdown` is `"pause-until-parent-close"` or
164
+ * `"keep-until-parent-close"`, both `destroySandbox` and `sandboxId` become
165
+ * required so the parent can coordinate cleanup.
159
166
  */
160
167
  export type SubagentFnResult<
161
168
  TResult = null,
162
169
  TSandboxShutdown extends SubagentSandboxShutdown = SubagentSandboxShutdown,
163
170
  > = SubagentHandlerResponse<TResult> &
164
- (TSandboxShutdown extends "pause-until-parent-close"
171
+ (TSandboxShutdown extends
172
+ | "pause-until-parent-close"
173
+ | "keep-until-parent-close"
165
174
  ? { destroySandbox: () => Promise<void>; sandboxId: string }
166
175
  : { destroySandbox?: () => Promise<void> });
167
176
 
@@ -171,6 +180,12 @@ export interface ChildResultSignalPayload {
171
180
  result: SubagentHandlerResponse;
172
181
  }
173
182
 
183
+ /** Payload sent by a child workflow as soon as its sandbox is ready */
184
+ export interface ChildSandboxReadySignalPayload {
185
+ childWorkflowId: string;
186
+ sandboxId: string;
187
+ }
188
+
174
189
  /**
175
190
  * Session config fields passed from parent to child workflow.
176
191
  */
@@ -183,4 +198,6 @@ export interface SubagentSessionInput {
183
198
  sandbox?: SandboxInit;
184
199
  /** Sandbox shutdown policy (default: "destroy") */
185
200
  sandboxShutdown?: SubagentSandboxShutdown;
201
+ /** Called by the session as soon as the sandbox is created, before the agent loop starts. */
202
+ onSandboxReady?: (sandboxId: string) => void;
186
203
  }
@@ -14,7 +14,11 @@ import type {
14
14
  SubagentSessionInput,
15
15
  } from "./types";
16
16
  import type { SubagentSandboxShutdown } from "../lifecycle";
17
- import { childResultSignal, destroySandboxSignal } from "./signals";
17
+ import {
18
+ childResultSignal,
19
+ childSandboxReadySignal,
20
+ destroySandboxSignal,
21
+ } from "./signals";
18
22
 
19
23
  /**
20
24
  * Defines a subagent workflow with embedded metadata (name, description, resultSchema).
@@ -118,11 +122,26 @@ export function defineSubagentWorkflow(
118
122
  const effectiveShutdown =
119
123
  workflowInput.sandboxShutdown ?? config.sandboxShutdown ?? "destroy";
120
124
 
125
+ const { parent } = workflowInfo();
126
+ if (!parent) {
127
+ throw ApplicationFailure.create({
128
+ message: "Subagent workflow called without a parent workflow",
129
+ nonRetryable: true,
130
+ });
131
+ }
132
+ const parentHandle = getExternalWorkflowHandle(parent.workflowId);
133
+
121
134
  const sessionInput: SubagentSessionInput = {
122
135
  agentName: config.name,
123
136
  sandboxShutdown: effectiveShutdown,
124
137
  ...(workflowInput.thread && { thread: workflowInput.thread }),
125
138
  ...(workflowInput.sandbox && { sandbox: workflowInput.sandbox }),
139
+ onSandboxReady: (sandboxId: string) => {
140
+ void parentHandle.signal(childSandboxReadySignal, {
141
+ childWorkflowId: workflowInfo().workflowId,
142
+ sandboxId,
143
+ });
144
+ },
126
145
  };
127
146
  const { destroySandbox, ...result } = await fn(
128
147
  prompt,
@@ -130,30 +149,24 @@ export function defineSubagentWorkflow(
130
149
  context ?? {}
131
150
  );
132
151
 
133
- if (effectiveShutdown === "pause-until-parent-close") {
152
+ if (
153
+ effectiveShutdown === "pause-until-parent-close" ||
154
+ effectiveShutdown === "keep-until-parent-close"
155
+ ) {
134
156
  if (!destroySandbox) {
135
157
  throw ApplicationFailure.create({
136
- message: `Subagent "${config.name}" has sandboxShutdown="pause-until-parent-close" but fn did not return a destroySandbox callback`,
158
+ message: `Subagent "${config.name}" has sandboxShutdown="${effectiveShutdown}" but fn did not return a destroySandbox callback`,
137
159
  nonRetryable: true,
138
160
  });
139
161
  }
140
162
  if (!result.sandboxId) {
141
163
  throw ApplicationFailure.create({
142
- message: `Subagent "${config.name}" has sandboxShutdown="pause-until-parent-close" but fn did not return a sandboxId`,
164
+ message: `Subagent "${config.name}" has sandboxShutdown="${effectiveShutdown}" but fn did not return a sandboxId`,
143
165
  nonRetryable: true,
144
166
  });
145
167
  }
146
168
  }
147
169
 
148
- const { parent } = workflowInfo();
149
- if (!parent) {
150
- throw ApplicationFailure.create({
151
- message: "Subagent workflow called without a parent workflow",
152
- nonRetryable: true,
153
- });
154
- }
155
-
156
- const parentHandle = getExternalWorkflowHandle(parent.workflowId);
157
170
  await parentHandle.signal(childResultSignal, {
158
171
  childWorkflowId: workflowInfo().workflowId,
159
172
  result,
@@ -21,7 +21,7 @@ import type {
21
21
  * const activities = {
22
22
  * ...createVirtualFsActivities(resolver, "CodingAgent"),
23
23
  * };
24
- * // registers: codingAgentResolveFileTree
24
+ * // registers: virtualFsCodingAgentResolveFileTree
25
25
  * ```
26
26
  */
27
27
  export function createVirtualFsActivities<
@@ -93,7 +93,7 @@ export interface VirtualFsOps<TCtx = unknown, TMeta = FileEntryMetadata> {
93
93
  * @example
94
94
  * ```typescript
95
95
  * type Ops = PrefixedVirtualFsOps<"codingAgent">;
96
- * // → { codingAgentResolveFileTree: ... }
96
+ * // → { virtualFsCodingAgentResolveFileTree: ... }
97
97
  * ```
98
98
  */
99
99
  export type PrefixedVirtualFsOps<
@@ -104,7 +104,7 @@ export type PrefixedVirtualFsOps<
104
104
  [K in keyof VirtualFsOps<
105
105
  TCtx,
106
106
  TMeta
107
- > as `${TPrefix}${Capitalize<K & string>}`]: VirtualFsOps<TCtx, TMeta>[K];
107
+ > as `virtualFs${Capitalize<TPrefix>}${Capitalize<K & string>}`]: VirtualFsOps<TCtx, TMeta>[K];
108
108
  };
109
109
 
110
110
  // ============================================================================
@@ -398,8 +398,8 @@ describe("createVirtualFsActivities", () => {
398
398
  const { resolver } = createMockResolver();
399
399
  const activities = createVirtualFsActivities(resolver, "codingAgent");
400
400
 
401
- expect(activities).toHaveProperty("codingAgentResolveFileTree");
402
- const result = await activities.codingAgentResolveFileTree(ctx);
401
+ expect(activities).toHaveProperty("virtualFsCodingAgentResolveFileTree");
402
+ const result = await activities.virtualFsCodingAgentResolveFileTree(ctx);
403
403
  expect(result.fileTree).toHaveLength(3);
404
404
  expect(result.fileTree[0]?.path).toMatch(/^\/resolved\//);
405
405
  });
package/src/workflow.ts CHANGED
@@ -133,6 +133,9 @@ export type {
133
133
  ModelInvokerConfig,
134
134
  } from "./lib/model";
135
135
 
136
+ // Model proxy (workflow-safe proxy with LLM-optimised defaults)
137
+ export { proxyRunAgent } from "./lib/model/proxy";
138
+
136
139
  // Subagent types
137
140
  export type {
138
141
  SubagentConfig,
package/src/lib/.env DELETED
@@ -1 +0,0 @@
1
- E2B_API_KEY=e2b_39af116424059782e2aee6942fd70237cc2126c9
@@ -1 +0,0 @@
1
- E2B_API_KEY=e2b_39af116424059782e2aee6942fd70237cc2126c9