zeitlich 0.2.40 → 0.2.42

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 (134) hide show
  1. package/README.md +12 -1
  2. package/dist/{activities-CvUrG3YG.d.cts → activities-Coafq5zr.d.cts} +2 -2
  3. package/dist/{activities-CULxRzJ1.d.ts → activities-CrN-ghLo.d.ts} +2 -2
  4. package/dist/adapters/sandbox/daytona/index.cjs +4 -23
  5. package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
  6. package/dist/adapters/sandbox/daytona/index.d.cts +18 -86
  7. package/dist/adapters/sandbox/daytona/index.d.ts +18 -86
  8. package/dist/adapters/sandbox/daytona/index.js +4 -23
  9. package/dist/adapters/sandbox/daytona/index.js.map +1 -1
  10. package/dist/adapters/sandbox/daytona/workflow.cjs +1 -7
  11. package/dist/adapters/sandbox/daytona/workflow.cjs.map +1 -1
  12. package/dist/adapters/sandbox/daytona/workflow.d.cts +9 -2
  13. package/dist/adapters/sandbox/daytona/workflow.d.ts +9 -2
  14. package/dist/adapters/sandbox/daytona/workflow.js +1 -7
  15. package/dist/adapters/sandbox/daytona/workflow.js.map +1 -1
  16. package/dist/adapters/sandbox/e2b/index.cjs +21 -3
  17. package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
  18. package/dist/adapters/sandbox/e2b/index.d.cts +48 -7
  19. package/dist/adapters/sandbox/e2b/index.d.ts +48 -7
  20. package/dist/adapters/sandbox/e2b/index.js +22 -5
  21. package/dist/adapters/sandbox/e2b/index.js.map +1 -1
  22. package/dist/adapters/sandbox/e2b/workflow.cjs.map +1 -1
  23. package/dist/adapters/sandbox/e2b/workflow.d.cts +4 -2
  24. package/dist/adapters/sandbox/e2b/workflow.d.ts +4 -2
  25. package/dist/adapters/sandbox/e2b/workflow.js.map +1 -1
  26. package/dist/adapters/sandbox/inmemory/index.cjs +11 -0
  27. package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
  28. package/dist/adapters/sandbox/inmemory/index.d.cts +11 -3
  29. package/dist/adapters/sandbox/inmemory/index.d.ts +11 -3
  30. package/dist/adapters/sandbox/inmemory/index.js +11 -1
  31. package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
  32. package/dist/adapters/sandbox/inmemory/workflow.cjs.map +1 -1
  33. package/dist/adapters/sandbox/inmemory/workflow.d.cts +4 -2
  34. package/dist/adapters/sandbox/inmemory/workflow.d.ts +4 -2
  35. package/dist/adapters/sandbox/inmemory/workflow.js.map +1 -1
  36. package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
  37. package/dist/adapters/thread/anthropic/index.d.cts +6 -6
  38. package/dist/adapters/thread/anthropic/index.d.ts +6 -6
  39. package/dist/adapters/thread/anthropic/index.js.map +1 -1
  40. package/dist/adapters/thread/anthropic/workflow.d.cts +6 -6
  41. package/dist/adapters/thread/anthropic/workflow.d.ts +6 -6
  42. package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
  43. package/dist/adapters/thread/google-genai/index.d.cts +6 -6
  44. package/dist/adapters/thread/google-genai/index.d.ts +6 -6
  45. package/dist/adapters/thread/google-genai/index.js.map +1 -1
  46. package/dist/adapters/thread/google-genai/workflow.d.cts +6 -6
  47. package/dist/adapters/thread/google-genai/workflow.d.ts +6 -6
  48. package/dist/adapters/thread/langchain/index.cjs.map +1 -1
  49. package/dist/adapters/thread/langchain/index.d.cts +6 -6
  50. package/dist/adapters/thread/langchain/index.d.ts +6 -6
  51. package/dist/adapters/thread/langchain/index.js.map +1 -1
  52. package/dist/adapters/thread/langchain/workflow.d.cts +6 -6
  53. package/dist/adapters/thread/langchain/workflow.d.ts +6 -6
  54. package/dist/index.cjs +316 -119
  55. package/dist/index.cjs.map +1 -1
  56. package/dist/index.d.cts +93 -17
  57. package/dist/index.d.ts +93 -17
  58. package/dist/index.js +317 -120
  59. package/dist/index.js.map +1 -1
  60. package/dist/{proxy-5EbwzaY4.d.cts → proxy-Bf7uI-Hw.d.cts} +1 -1
  61. package/dist/{proxy-wZufFfBh.d.ts → proxy-COqA95FW.d.ts} +1 -1
  62. package/dist/{thread-manager-BqBAIsED.d.ts → thread-manager-BhkOyQ1I.d.ts} +2 -2
  63. package/dist/{thread-manager-BNiIt5r8.d.ts → thread-manager-Bi1XlbpJ.d.ts} +2 -2
  64. package/dist/{thread-manager-DF8WuCRs.d.cts → thread-manager-BsLO3Fgc.d.cts} +2 -2
  65. package/dist/{thread-manager-BoN5DOvG.d.cts → thread-manager-wRVVBFgj.d.cts} +2 -2
  66. package/dist/{types-C7OoY7h8.d.ts → types-BkX4HLzi.d.ts} +1 -1
  67. package/dist/{types-CuISs0Ub.d.cts → types-C66-BVBr.d.cts} +1 -1
  68. package/dist/types-CJ7tCdl6.d.cts +266 -0
  69. package/dist/types-CJ7tCdl6.d.ts +266 -0
  70. package/dist/{types-DeQH84C_.d.ts → types-CdALEF3z.d.cts} +342 -23
  71. package/dist/{types-Cn2r3ol3.d.cts → types-ChAy_jSP.d.ts} +342 -23
  72. package/dist/types-CjY93AWZ.d.cts +84 -0
  73. package/dist/types-gVa5XCWD.d.ts +84 -0
  74. package/dist/{workflow-DhplIN65.d.cts → workflow-BwT5EybR.d.ts} +7 -6
  75. package/dist/{workflow-C2MZZj5K.d.ts → workflow-DMmiaw6w.d.cts} +7 -6
  76. package/dist/workflow.cjs +138 -77
  77. package/dist/workflow.cjs.map +1 -1
  78. package/dist/workflow.d.cts +4 -4
  79. package/dist/workflow.d.ts +4 -4
  80. package/dist/workflow.js +139 -78
  81. package/dist/workflow.js.map +1 -1
  82. package/package.json +17 -33
  83. package/src/adapters/sandbox/daytona/index.ts +25 -48
  84. package/src/adapters/sandbox/daytona/proxy.ts +7 -8
  85. package/src/adapters/sandbox/e2b/README.md +81 -0
  86. package/src/adapters/sandbox/e2b/index.ts +53 -11
  87. package/src/adapters/sandbox/e2b/keep-alive.test.ts +115 -0
  88. package/src/adapters/sandbox/e2b/proxy.ts +3 -2
  89. package/src/adapters/sandbox/e2b/types.ts +34 -2
  90. package/src/adapters/sandbox/inmemory/index.ts +21 -1
  91. package/src/adapters/sandbox/inmemory/proxy.ts +7 -3
  92. package/src/index.ts +1 -1
  93. package/src/lib/activity.ts +5 -0
  94. package/src/lib/sandbox/capability-types.test.ts +859 -0
  95. package/src/lib/sandbox/index.ts +1 -0
  96. package/src/lib/sandbox/manager.ts +187 -31
  97. package/src/lib/sandbox/types.ts +189 -46
  98. package/src/lib/session/index.ts +1 -0
  99. package/src/lib/session/session.integration.test.ts +58 -0
  100. package/src/lib/session/session.ts +109 -50
  101. package/src/lib/session/types.ts +189 -8
  102. package/src/lib/subagent/handler.ts +66 -43
  103. package/src/lib/subagent/subagent.integration.test.ts +2 -0
  104. package/src/lib/subagent/types.ts +492 -16
  105. package/src/lib/subagent/workflow.ts +11 -1
  106. package/src/lib/tool-router/auto-append-sandbox.integration.test.ts +158 -0
  107. package/src/lib/tool-router/index.ts +1 -1
  108. package/src/lib/tool-router/with-sandbox.ts +45 -2
  109. package/src/lib/virtual-fs/filesystem.ts +41 -16
  110. package/src/lib/virtual-fs/types.ts +19 -0
  111. package/src/lib/virtual-fs/virtual-fs.test.ts +204 -1
  112. package/src/tools/read-file/handler.test.ts +83 -0
  113. package/src/workflow.ts +3 -0
  114. package/tsup.config.ts +0 -4
  115. package/dist/adapters/sandbox/bedrock/index.cjs +0 -457
  116. package/dist/adapters/sandbox/bedrock/index.cjs.map +0 -1
  117. package/dist/adapters/sandbox/bedrock/index.d.cts +0 -25
  118. package/dist/adapters/sandbox/bedrock/index.d.ts +0 -25
  119. package/dist/adapters/sandbox/bedrock/index.js +0 -454
  120. package/dist/adapters/sandbox/bedrock/index.js.map +0 -1
  121. package/dist/adapters/sandbox/bedrock/workflow.cjs +0 -36
  122. package/dist/adapters/sandbox/bedrock/workflow.cjs.map +0 -1
  123. package/dist/adapters/sandbox/bedrock/workflow.d.cts +0 -29
  124. package/dist/adapters/sandbox/bedrock/workflow.d.ts +0 -29
  125. package/dist/adapters/sandbox/bedrock/workflow.js +0 -34
  126. package/dist/adapters/sandbox/bedrock/workflow.js.map +0 -1
  127. package/dist/types-DAsQ21Rt.d.ts +0 -74
  128. package/dist/types-lm8tMNJQ.d.cts +0 -74
  129. package/dist/types-yx0LzPGn.d.cts +0 -173
  130. package/dist/types-yx0LzPGn.d.ts +0 -173
  131. package/src/adapters/sandbox/bedrock/filesystem.ts +0 -340
  132. package/src/adapters/sandbox/bedrock/index.ts +0 -274
  133. package/src/adapters/sandbox/bedrock/proxy.ts +0 -59
  134. package/src/adapters/sandbox/bedrock/types.ts +0 -24
@@ -6,16 +6,19 @@ import {
6
6
  ApplicationFailure,
7
7
  executeChild,
8
8
  } from "@temporalio/workflow";
9
+ import type { Duration } from "@temporalio/common";
9
10
  import { getShortId } from "../thread/id";
10
11
  import type { ToolHandlerResponse, RouterContext } from "../tool-router";
11
12
  import type { JsonValue } from "../state/types";
12
13
  import type {
13
14
  InferSubagentResult,
15
+ ResolvedSubagentSandboxConfig,
14
16
  SubagentConfig,
15
17
  SubagentFnResult,
16
18
  SubagentSandboxConfig,
17
19
  SubagentWorkflowInput,
18
20
  } from "./types";
21
+ import { resolveSubagentLifecycle } from "./types";
19
22
  import type { SubagentArgs } from "./tool";
20
23
  import type { z } from "zod";
21
24
  import type {
@@ -23,9 +26,33 @@ import type {
23
26
  SandboxInit,
24
27
  SubagentSandboxShutdown,
25
28
  } from "../lifecycle";
26
- import type { SandboxOps, SandboxSnapshot } from "../sandbox/types";
29
+ import type {
30
+ SandboxCreateOptions,
31
+ SandboxOps,
32
+ SandboxSnapshot,
33
+ } from "../sandbox/types";
27
34
  import { childSandboxReadySignal } from "./signals";
28
35
 
36
+ /**
37
+ * Methods the parent's subagent handler invokes on a subagent's `proxy`.
38
+ * Kept narrow so the handler's internal maps accept `SandboxOps<…, never>`
39
+ * (e.g. Daytona) and `SandboxOps<…, "snapshot">` (e.g. E2B for
40
+ * snapshot-driven continuations) alike.
41
+ *
42
+ * `destroySandbox` is base — always available.
43
+ * `deleteSandboxSnapshot` is only called for continuations that produce
44
+ * snapshots; it's stored separately and only populated when present on
45
+ * the cfg-specific proxy.
46
+ */
47
+ type ParentDestroyOps = Pick<
48
+ SandboxOps<SandboxCreateOptions, unknown, never>,
49
+ "destroySandbox"
50
+ >;
51
+ type ParentDeleteSnapshotOps = Pick<
52
+ SandboxOps<SandboxCreateOptions, unknown, "snapshot">,
53
+ "deleteSandboxSnapshot"
54
+ >;
55
+
29
56
  /**
30
57
  * Default `workflowRunTimeout` applied to every subagent child workflow
31
58
  * unless overridden via `SubagentConfig.workflowOptions.workflowRunTimeout`.
@@ -40,19 +67,11 @@ import { childSandboxReadySignal } from "./signals";
40
67
  * still catching hangs; agents that legitimately need longer should set an
41
68
  * explicit `workflowOptions.workflowRunTimeout`.
42
69
  */
43
- export const DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT = "1h";
44
-
45
- /** Normalized sandbox config after resolving the union. */
46
- interface ResolvedSandboxConfig {
47
- source: "none" | "inherit" | "own";
48
- init: "per-call" | "once";
49
- continuation: "continue" | "fork" | "snapshot";
50
- shutdown?: SubagentSandboxShutdown;
51
- }
70
+ export const DEFAULT_SUBAGENT_WORKFLOW_RUN_TIMEOUT: Duration = "1h";
52
71
 
53
72
  function resolveSandboxConfig(
54
73
  config?: SubagentSandboxConfig
55
- ): ResolvedSandboxConfig {
74
+ ): ResolvedSubagentSandboxConfig {
56
75
  if (!config || config === "none") {
57
76
  return { source: "none", init: "per-call", continuation: "fork" };
58
77
  }
@@ -96,11 +115,31 @@ export function createSubagentHandler<
96
115
  } {
97
116
  const { taskQueue: parentTaskQueue } = workflowInfo();
98
117
 
99
- /** Sandbox ops proxy per subagent, built eagerly from `sandbox.proxy` factories. */
100
- const agentSandboxOps = new Map<string, SandboxOps>();
118
+ /**
119
+ * Sandbox ops proxy per subagent, built eagerly from `sandbox.proxy`
120
+ * factories.
121
+ *
122
+ * Split into two maps so each accepts only the cap-narrowed slice the
123
+ * parent actually consumes. `destroyOps` accepts every adapter (base
124
+ * `destroySandbox` is always present); `deleteSnapshotOps` is only
125
+ * populated for `continuation: "snapshot"` configs, and the
126
+ * `SubagentSandboxConfig` type guarantees the proxy carries
127
+ * `deleteSandboxSnapshot` when that continuation is selected.
128
+ */
129
+ const agentDestroyOps = new Map<string, ParentDestroyOps>();
130
+ const agentDeleteSnapshotOps = new Map<string, ParentDeleteSnapshotOps>();
101
131
  for (const cfg of subagents) {
102
- if (cfg.sandbox && cfg.sandbox !== "none") {
103
- agentSandboxOps.set(cfg.agentName, cfg.sandbox.proxy(cfg.agentName));
132
+ const cfgSandbox = cfg.sandbox;
133
+ if (!cfgSandbox || cfgSandbox === "none") continue;
134
+ if (cfgSandbox.continuation === "snapshot") {
135
+ // Pull the proxy here so the per-branch narrowing keeps
136
+ // `deleteSandboxSnapshot` in the inferred return type.
137
+ const proxy = cfgSandbox.proxy(cfg.agentName);
138
+ agentDestroyOps.set(cfg.agentName, proxy);
139
+ agentDeleteSnapshotOps.set(cfg.agentName, proxy);
140
+ } else {
141
+ const proxy = cfgSandbox.proxy(cfg.agentName);
142
+ agentDestroyOps.set(cfg.agentName, proxy);
104
143
  }
105
144
  }
106
145
 
@@ -182,7 +221,7 @@ export function createSubagentHandler<
182
221
 
183
222
  if (
184
223
  sandboxCfg.source !== "none" &&
185
- !agentSandboxOps.has(config.agentName)
224
+ !agentDestroyOps.has(config.agentName)
186
225
  ) {
187
226
  throw ApplicationFailure.create({
188
227
  message: `Subagent "${config.agentName}" uses a sandbox but no \`sandbox.proxy\` is configured on its SubagentConfig`,
@@ -272,7 +311,6 @@ export function createSubagentHandler<
272
311
  if (baseSnap) {
273
312
  sandbox = { mode: "from-snapshot", snapshot: baseSnap };
274
313
  }
275
- sandboxShutdownOverride = "snapshot";
276
314
  } else if (sandboxCfg.source === "own") {
277
315
  const isLazy = sandboxCfg.init === "once";
278
316
 
@@ -318,31 +356,16 @@ export function createSubagentHandler<
318
356
  sandboxId: baseSandboxId,
319
357
  };
320
358
  }
359
+ }
321
360
 
322
- // Ensure the sandbox survives for future continuation/fork:
323
- // - first lazy call (creator): pause-until-parent-close so parent can clean up
324
- // - continuation=continue: sandbox must survive for next call
325
- // - lazy+fork (non-creator): template must survive for future forks
326
- //
327
- // Skip the override when the user already configured a *-until-parent-close
328
- // shutdown that already guarantees survival.
329
- const userShutdown = sandboxCfg.shutdown;
330
- const alreadySurvives =
331
- userShutdown === "pause-until-parent-close" ||
332
- userShutdown === "keep-until-parent-close" ||
333
- userShutdown === "pause" ||
334
- userShutdown === "keep";
335
-
336
- const mustSurvive =
337
- isLazyCreator ||
338
- sandboxCfg.continuation === "continue" ||
339
- (isLazy && sandboxCfg.continuation === "fork");
340
-
341
- if (mustSurvive && !alreadySurvives) {
342
- sandboxShutdownOverride = isLazyCreator
343
- ? "pause-until-parent-close"
344
- : "pause";
345
- }
361
+ // Resolve the lifecycle decision (auto-inject pause/snapshot, etc.)
362
+ // through the SSOT same table the type-level `SubagentRequiredCaps`
363
+ // reads. Adding a new branch here means changing both. The matrix
364
+ // in `src/lib/sandbox/capability-types.test.ts` enforces the
365
+ // type-level / runtime agreement.
366
+ {
367
+ const lifecycle = resolveSubagentLifecycle(sandboxCfg, isLazyCreator);
368
+ sandboxShutdownOverride = lifecycle.shutdownOverride;
346
369
  }
347
370
 
348
371
  const workflowInput: SubagentWorkflowInput = {
@@ -555,7 +578,7 @@ export function createSubagentHandler<
555
578
  pendingDestroys.clear();
556
579
  await Promise.all(
557
580
  entries.map(async ({ agentName, sandboxId }) => {
558
- const ops = agentSandboxOps.get(agentName);
581
+ const ops = agentDestroyOps.get(agentName);
559
582
  if (!ops) {
560
583
  log.warn(
561
584
  "Skipping sandbox destroy — no sandbox.proxy registered for agent",
@@ -587,7 +610,7 @@ export function createSubagentHandler<
587
610
 
588
611
  await Promise.all(
589
612
  tagged.map(async ({ agentName, snapshot }) => {
590
- const ops = agentSandboxOps.get(agentName);
613
+ const ops = agentDeleteSnapshotOps.get(agentName);
591
614
  if (!ops) {
592
615
  log.warn(
593
616
  "Skipping snapshot delete — no sandbox.proxy registered for agent",
@@ -2602,6 +2602,7 @@ describe("defineSubagentWorkflow", () => {
2602
2602
  sandboxId: "sb-1",
2603
2603
  snapshot,
2604
2604
  threadId: "t",
2605
+ usage: { totalInputTokens: 0, totalOutputTokens: 0, totalCachedWriteTokens: 0, totalCachedReadTokens: 0, totalReasonTokens: 0, turns: 0 },
2605
2606
  });
2606
2607
  return { toolResponse: "ok", data: null, threadId: "t" };
2607
2608
  }
@@ -2625,6 +2626,7 @@ describe("defineSubagentWorkflow", () => {
2625
2626
  createdAt: new Date().toISOString(),
2626
2627
  },
2627
2628
  threadId: "t",
2629
+ usage: { totalInputTokens: 0, totalOutputTokens: 0, totalCachedWriteTokens: 0, totalCachedReadTokens: 0, totalReasonTokens: 0, turns: 0 },
2628
2630
  });
2629
2631
  return {
2630
2632
  toolResponse: "ok",