zeitlich 0.2.22 → 0.2.24

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 (129) hide show
  1. package/README.md +278 -59
  2. package/dist/adapters/sandbox/bedrock/index.cjs +427 -0
  3. package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -0
  4. package/dist/adapters/sandbox/bedrock/index.d.cts +23 -0
  5. package/dist/adapters/sandbox/bedrock/index.d.ts +23 -0
  6. package/dist/adapters/sandbox/bedrock/index.js +424 -0
  7. package/dist/adapters/sandbox/bedrock/index.js.map +1 -0
  8. package/dist/adapters/sandbox/bedrock/workflow.cjs +33 -0
  9. package/dist/adapters/sandbox/bedrock/workflow.cjs.map +1 -0
  10. package/dist/adapters/sandbox/bedrock/workflow.d.cts +29 -0
  11. package/dist/adapters/sandbox/bedrock/workflow.d.ts +29 -0
  12. package/dist/adapters/sandbox/bedrock/workflow.js +31 -0
  13. package/dist/adapters/sandbox/bedrock/workflow.js.map +1 -0
  14. package/dist/adapters/sandbox/daytona/index.cjs +4 -1
  15. package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
  16. package/dist/adapters/sandbox/daytona/index.d.cts +2 -1
  17. package/dist/adapters/sandbox/daytona/index.d.ts +2 -1
  18. package/dist/adapters/sandbox/daytona/index.js +4 -1
  19. package/dist/adapters/sandbox/daytona/index.js.map +1 -1
  20. package/dist/adapters/sandbox/daytona/workflow.cjs +1 -0
  21. package/dist/adapters/sandbox/daytona/workflow.cjs.map +1 -1
  22. package/dist/adapters/sandbox/daytona/workflow.d.cts +1 -1
  23. package/dist/adapters/sandbox/daytona/workflow.d.ts +1 -1
  24. package/dist/adapters/sandbox/daytona/workflow.js +1 -0
  25. package/dist/adapters/sandbox/daytona/workflow.js.map +1 -1
  26. package/dist/adapters/sandbox/inmemory/index.cjs +16 -2
  27. package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
  28. package/dist/adapters/sandbox/inmemory/index.d.cts +3 -2
  29. package/dist/adapters/sandbox/inmemory/index.d.ts +3 -2
  30. package/dist/adapters/sandbox/inmemory/index.js +16 -2
  31. package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
  32. package/dist/adapters/sandbox/inmemory/workflow.cjs +1 -0
  33. package/dist/adapters/sandbox/inmemory/workflow.cjs.map +1 -1
  34. package/dist/adapters/sandbox/inmemory/workflow.d.cts +1 -1
  35. package/dist/adapters/sandbox/inmemory/workflow.d.ts +1 -1
  36. package/dist/adapters/sandbox/inmemory/workflow.js +1 -0
  37. package/dist/adapters/sandbox/inmemory/workflow.js.map +1 -1
  38. package/dist/adapters/sandbox/virtual/index.cjs +45 -11
  39. package/dist/adapters/sandbox/virtual/index.cjs.map +1 -1
  40. package/dist/adapters/sandbox/virtual/index.d.cts +6 -5
  41. package/dist/adapters/sandbox/virtual/index.d.ts +6 -5
  42. package/dist/adapters/sandbox/virtual/index.js +45 -11
  43. package/dist/adapters/sandbox/virtual/index.js.map +1 -1
  44. package/dist/adapters/sandbox/virtual/workflow.cjs +1 -0
  45. package/dist/adapters/sandbox/virtual/workflow.cjs.map +1 -1
  46. package/dist/adapters/sandbox/virtual/workflow.d.cts +3 -3
  47. package/dist/adapters/sandbox/virtual/workflow.d.ts +3 -3
  48. package/dist/adapters/sandbox/virtual/workflow.js +1 -0
  49. package/dist/adapters/sandbox/virtual/workflow.js.map +1 -1
  50. package/dist/adapters/thread/google-genai/index.d.cts +3 -3
  51. package/dist/adapters/thread/google-genai/index.d.ts +3 -3
  52. package/dist/adapters/thread/google-genai/workflow.d.cts +3 -3
  53. package/dist/adapters/thread/google-genai/workflow.d.ts +3 -3
  54. package/dist/adapters/thread/langchain/index.d.cts +3 -3
  55. package/dist/adapters/thread/langchain/index.d.ts +3 -3
  56. package/dist/adapters/thread/langchain/workflow.d.cts +3 -3
  57. package/dist/adapters/thread/langchain/workflow.d.ts +3 -3
  58. package/dist/index.cjs +443 -71
  59. package/dist/index.cjs.map +1 -1
  60. package/dist/index.d.cts +64 -10
  61. package/dist/index.d.ts +64 -10
  62. package/dist/index.js +442 -71
  63. package/dist/index.js.map +1 -1
  64. package/dist/{queries-Bw6WEPMw.d.cts → queries-BYGBImeC.d.cts} +1 -1
  65. package/dist/{queries-C27raDaB.d.ts → queries-DwBe2CAA.d.ts} +1 -1
  66. package/dist/{types-C5bkx6kQ.d.ts → types-7PeMi1bD.d.cts} +167 -36
  67. package/dist/{types-BJ8itUAl.d.cts → types-Bf8KV0Ci.d.cts} +6 -6
  68. package/dist/{types-HBosetv3.d.cts → types-ChAMwU3q.d.cts} +2 -0
  69. package/dist/{types-HBosetv3.d.ts → types-ChAMwU3q.d.ts} +2 -0
  70. package/dist/{types-YbL7JpEA.d.cts → types-D_igp10o.d.cts} +11 -0
  71. package/dist/{types-YbL7JpEA.d.ts → types-D_igp10o.d.ts} +11 -0
  72. package/dist/types-DhTCEMhr.d.cts +64 -0
  73. package/dist/{types-ENYCKFBk.d.ts → types-LVKmCNds.d.ts} +6 -6
  74. package/dist/types-d9NznUqd.d.ts +64 -0
  75. package/dist/{types-ClsHhtwL.d.cts → types-hmferhc2.d.ts} +167 -36
  76. package/dist/workflow.cjs +308 -63
  77. package/dist/workflow.cjs.map +1 -1
  78. package/dist/workflow.d.cts +54 -32
  79. package/dist/workflow.d.ts +54 -32
  80. package/dist/workflow.js +306 -61
  81. package/dist/workflow.js.map +1 -1
  82. package/package.json +27 -2
  83. package/src/adapters/sandbox/bedrock/filesystem.ts +313 -0
  84. package/src/adapters/sandbox/bedrock/index.ts +259 -0
  85. package/src/adapters/sandbox/bedrock/proxy.ts +56 -0
  86. package/src/adapters/sandbox/bedrock/types.ts +24 -0
  87. package/src/adapters/sandbox/daytona/filesystem.ts +1 -1
  88. package/src/adapters/sandbox/daytona/index.ts +4 -0
  89. package/src/adapters/sandbox/daytona/proxy.ts +4 -3
  90. package/src/adapters/sandbox/e2b/index.ts +5 -0
  91. package/src/adapters/sandbox/inmemory/index.ts +24 -4
  92. package/src/adapters/sandbox/inmemory/proxy.ts +2 -2
  93. package/src/adapters/sandbox/virtual/filesystem.ts +44 -18
  94. package/src/adapters/sandbox/virtual/provider.ts +13 -0
  95. package/src/adapters/sandbox/virtual/proxy.ts +1 -0
  96. package/src/adapters/sandbox/virtual/types.ts +9 -4
  97. package/src/adapters/sandbox/virtual/virtual-sandbox.test.ts +26 -0
  98. package/src/index.ts +2 -1
  99. package/src/lib/lifecycle.ts +57 -0
  100. package/src/lib/sandbox/manager.ts +13 -1
  101. package/src/lib/sandbox/node-fs.ts +115 -0
  102. package/src/lib/sandbox/types.ts +13 -4
  103. package/src/lib/session/index.ts +1 -0
  104. package/src/lib/session/session-edge-cases.integration.test.ts +447 -33
  105. package/src/lib/session/session.integration.test.ts +149 -32
  106. package/src/lib/session/session.ts +138 -33
  107. package/src/lib/session/types.ts +56 -17
  108. package/src/lib/skills/fs-provider.ts +65 -4
  109. package/src/lib/skills/handler.ts +43 -1
  110. package/src/lib/skills/index.ts +0 -1
  111. package/src/lib/skills/register.ts +17 -1
  112. package/src/lib/skills/skills.integration.test.ts +308 -24
  113. package/src/lib/skills/types.ts +6 -0
  114. package/src/lib/subagent/define.ts +5 -4
  115. package/src/lib/subagent/handler.ts +143 -14
  116. package/src/lib/subagent/index.ts +3 -0
  117. package/src/lib/subagent/register.ts +10 -3
  118. package/src/lib/subagent/signals.ts +8 -0
  119. package/src/lib/subagent/subagent.integration.test.ts +853 -150
  120. package/src/lib/subagent/tool.ts +2 -2
  121. package/src/lib/subagent/types.ts +77 -19
  122. package/src/lib/subagent/workflow.ts +83 -12
  123. package/src/lib/tool-router/router.integration.test.ts +137 -4
  124. package/src/lib/tool-router/router.ts +19 -6
  125. package/src/lib/tool-router/types.ts +11 -0
  126. package/src/lib/workflow.test.ts +89 -21
  127. package/src/lib/workflow.ts +33 -18
  128. package/src/workflow.ts +6 -1
  129. package/tsup.config.ts +3 -0
@@ -1,7 +1,7 @@
1
1
  import { Duration } from '@temporalio/common';
2
- import { a as ToolMap, b as ToolRouterHooks, M as MessageContent, S as SessionExitReason, c as ToolHandlerResponse, P as PreToolUseHookResult, d as PostToolUseFailureHookResult, e as RawToolCall, f as TokenUsage, B as BaseAgentState, g as RunAgentConfig, h as AgentStatus, W as WorkflowTask, i as ToolDefinition, j as ToolResultConfig, k as ToolCallResultUnion, I as InferToolResults } from './types-YbL7JpEA.cjs';
2
+ import { a as ToolMap, b as ToolRouterHooks, M as MessageContent, S as SessionExitReason, c as ToolHandlerResponse, P as PreToolUseHookResult, d as PostToolUseFailureHookResult, e as RawToolCall, f as TokenUsage, B as BaseAgentState, g as RunAgentConfig, h as AgentStatus, W as WorkflowTask, i as ToolDefinition, j as ToolResultConfig, k as ToolCallResultUnion, I as InferToolResults } from './types-D_igp10o.js';
3
3
  import { z } from 'zod';
4
- import { g as SandboxOps } from './types-HBosetv3.cjs';
4
+ import { g as SandboxOps } from './types-ChAMwU3q.js';
5
5
  import { QueryDefinition, ActivityInterfaceFor } from '@temporalio/workflow';
6
6
  import { UpdateDefinition } from '@temporalio/common/lib/interfaces';
7
7
 
@@ -69,19 +69,81 @@ interface Hooks<T extends ToolMap, TResult = unknown> extends ToolRouterHooks<T,
69
69
  onSessionEnd?: SessionEndHook;
70
70
  }
71
71
 
72
+ /**
73
+ * Thread initialization strategy.
74
+ *
75
+ * - `"new"` — start a fresh thread (optionally specify its ID).
76
+ * - `"continue"` — append directly to an existing thread in-place.
77
+ * - `"fork"` — copy all messages from an existing thread into a new one and
78
+ * continue there.
79
+ */
80
+ type ThreadInit = {
81
+ mode: "new";
82
+ threadId?: string;
83
+ } | {
84
+ mode: "continue";
85
+ threadId: string;
86
+ } | {
87
+ mode: "fork";
88
+ threadId: string;
89
+ };
90
+ /**
91
+ * Sandbox initialization strategy.
92
+ *
93
+ * - `"new"` — create a fresh sandbox.
94
+ * - `"continue"` — resume a previously-paused sandbox (this session takes
95
+ * ownership and the shutdown policy applies on exit).
96
+ * - `"fork"` — fork from an existing (or paused) sandbox; a new sandbox is
97
+ * created and owned by this session.
98
+ * - `"inherit"` — use a sandbox owned by someone else (e.g. a parent agent).
99
+ * The session will **not** manage its lifecycle on exit.
100
+ */
101
+ type SandboxInit = {
102
+ mode: "new";
103
+ } | {
104
+ mode: "continue";
105
+ sandboxId: string;
106
+ } | {
107
+ mode: "fork";
108
+ sandboxId: string;
109
+ } | {
110
+ mode: "inherit";
111
+ sandboxId: string;
112
+ stateUpdate?: Record<string, unknown>;
113
+ };
114
+ /**
115
+ * What to do with the sandbox when the session exits.
116
+ *
117
+ * - `"destroy"` — tear down the sandbox entirely.
118
+ * - `"pause"` — pause the sandbox so it can be resumed later.
119
+ * - `"keep"` — leave the sandbox running (no-op on exit).
120
+ */
121
+ type SandboxShutdown = "destroy" | "pause" | "keep";
122
+ /**
123
+ * Extended shutdown options available to subagent workflows.
124
+ *
125
+ * Includes all base {@link SandboxShutdown} values plus:
126
+ * - `"pause-until-parent-close"` — pause the sandbox on exit, then wait for
127
+ * the parent workflow to signal when to destroy it.
128
+ */
129
+ type SubagentSandboxShutdown = SandboxShutdown | "pause-until-parent-close";
130
+
72
131
  /** ToolHandlerResponse with threadId required (subagents must always surface their thread) */
73
132
  type SubagentHandlerResponse<TResult = null> = ToolHandlerResponse<TResult> & {
74
133
  threadId: string;
134
+ sandboxId?: string;
75
135
  };
76
136
  /**
77
137
  * Raw workflow input fields passed from parent to child workflow.
78
138
  * `defineSubagentWorkflow` maps this into `SubagentSessionInput`.
79
139
  */
80
140
  interface SubagentWorkflowInput {
81
- /** Thread ID from parent for continuation */
82
- previousThreadId?: string;
83
- /** Sandbox ID inherited from parent */
84
- sandboxId?: string;
141
+ /** Thread initialization strategy forwarded from the parent */
142
+ thread?: ThreadInit;
143
+ /** Sandbox initialization strategy forwarded from the parent */
144
+ sandbox?: SandboxInit;
145
+ /** Sandbox shutdown override from the parent (takes precedence over workflow default) */
146
+ sandboxShutdown?: SubagentSandboxShutdown;
85
147
  }
86
148
  type SubagentWorkflow<TResult extends z.ZodType = z.ZodType> = (prompt: string, workflowInput: SubagentWorkflowInput, context?: Record<string, unknown>) => Promise<SubagentHandlerResponse<z.infer<TResult> | null>>;
87
149
  /**
@@ -95,6 +157,21 @@ type SubagentDefinition<TResult extends z.ZodType = z.ZodType, TContext extends
95
157
  };
96
158
  /** Context value or factory — resolved at invocation time when a function is provided */
97
159
  type SubagentContext = Record<string, unknown> | (() => Record<string, unknown>);
160
+ /**
161
+ * Sandbox configuration for a subagent.
162
+ *
163
+ * String shorthands:
164
+ * - `"none"` — no sandbox (default).
165
+ * - `"inherit"` — reuse the parent's sandbox (shared filesystem/exec).
166
+ * - `"own"` — the child creates and owns its own sandbox (shutdown defaults to `"destroy"`).
167
+ *
168
+ * Object form (only for `source: "own"`):
169
+ * - `{ source: "own", shutdown?: SubagentSandboxShutdown }` — own sandbox with explicit shutdown policy.
170
+ */
171
+ type SubagentSandboxConfig = "none" | "inherit" | "own" | {
172
+ source: "own";
173
+ shutdown?: SubagentSandboxShutdown;
174
+ };
98
175
  /**
99
176
  * Configuration for a subagent that can be spawned by the parent workflow.
100
177
  *
@@ -108,23 +185,34 @@ interface SubagentConfig<TResult extends z.ZodType = z.ZodType> {
108
185
  /** Whether this subagent is available (default: true). Disabled subagents are excluded from the Subagent tool. */
109
186
  enabled?: boolean | (() => boolean);
110
187
  /** Temporal workflow function or type name (used with executeChild) */
111
- workflow: string | SubagentWorkflow<TResult>;
188
+ workflow: SubagentWorkflow<TResult>;
112
189
  /** Optional task queue - defaults to parent's queue if not specified */
113
190
  taskQueue?: string;
114
191
  /** Optional Zod schema to validate the child workflow's result. If omitted, result is passed through as-is. */
115
192
  resultSchema?: TResult;
116
193
  /** Optional context passed to the subagent — a static object or a function evaluated at invocation time */
117
194
  context?: SubagentContext;
118
- /** Allow the parent agent to pass a threadId for this subagent to continue (default: false) */
119
- allowThreadContinuation?: boolean;
120
195
  /** Per-subagent lifecycle hooks */
121
196
  hooks?: SubagentHooks;
197
+ /**
198
+ * Thread mode for this subagent.
199
+ *
200
+ * - `"new"` (default) — always start a fresh thread.
201
+ * - `"fork"` — the parent can pass a `threadId`; messages are copied into
202
+ * a new thread and the subagent continues there.
203
+ * - `"continue"` — the parent can pass a `threadId`; the subagent appends
204
+ * directly to the existing thread in-place.
205
+ */
206
+ thread?: "new" | "fork" | "continue";
122
207
  /**
123
208
  * Sandbox strategy for this subagent.
124
- * - `'inherit'` (default): reuse the parent's sandbox (shared filesystem/exec).
125
- * - `'own'`: the child creates and owns its own sandbox.
209
+ *
210
+ * String shorthands: `"none"` (default) | `"inherit"` | `"own"`.
211
+ * Object form: `{ source: "own", shutdown?: SubagentSandboxShutdown }`.
212
+ *
213
+ * @see {@link SubagentSandboxConfig}
126
214
  */
127
- sandbox?: "inherit" | "own";
215
+ sandbox?: SubagentSandboxConfig;
128
216
  }
129
217
  /**
130
218
  * Per-subagent lifecycle hooks - defined on a SubagentConfig.
@@ -144,6 +232,8 @@ interface SubagentHooks<TArgs = unknown, TResult = unknown> {
144
232
  threadId: string;
145
233
  turn: number;
146
234
  durationMs: number;
235
+ /** Unvalidated metadata from the child workflow (e.g. infrastructure state) */
236
+ metadata?: Record<string, unknown>;
147
237
  }) => void | Promise<void>;
148
238
  /** Called when this subagent execution fails */
149
239
  onExecutionFailure?: (ctx: {
@@ -153,18 +243,31 @@ interface SubagentHooks<TArgs = unknown, TResult = unknown> {
153
243
  turn: number;
154
244
  }) => PostToolUseFailureHookResult | Promise<PostToolUseFailureHookResult>;
155
245
  }
246
+ /**
247
+ * Extended response from the subagent `fn` — includes optional cleanup callbacks
248
+ * stripped before signaling the parent.
249
+ *
250
+ * When `TSandboxShutdown` is `"pause-until-parent-close"`, both `destroySandbox`
251
+ * and `sandboxId` become required so the parent can coordinate cleanup.
252
+ */
253
+ type SubagentFnResult<TResult = null, TSandboxShutdown extends SubagentSandboxShutdown = SubagentSandboxShutdown> = SubagentHandlerResponse<TResult> & (TSandboxShutdown extends "pause-until-parent-close" ? {
254
+ destroySandbox: () => Promise<void>;
255
+ sandboxId: string;
256
+ } : {
257
+ destroySandbox?: () => Promise<void>;
258
+ });
156
259
  /**
157
260
  * Session config fields passed from parent to child workflow.
158
261
  */
159
262
  interface SubagentSessionInput {
160
263
  /** Agent name — spread directly into `createSession` */
161
264
  agentName: string;
162
- /** Thread ID to continue from */
163
- threadId?: string;
164
- /** Whether to continue an existing thread */
165
- continueThread?: boolean;
166
- /** Sandbox ID inherited from the parent agent */
167
- sandboxId?: string;
265
+ /** Thread initialization strategy */
266
+ thread?: ThreadInit;
267
+ /** Sandbox initialization strategy */
268
+ sandbox?: SandboxInit;
269
+ /** Sandbox shutdown policy (default: "destroy") */
270
+ sandboxShutdown?: SubagentSandboxShutdown;
168
271
  }
169
272
 
170
273
  /**
@@ -184,6 +287,8 @@ interface SkillMetadata {
184
287
  metadata?: Record<string, string>;
185
288
  /** Space-delimited list of pre-approved tools the skill may use */
186
289
  allowedTools?: string[];
290
+ /** Absolute path to the skill directory (parent of SKILL.md) */
291
+ location?: string;
187
292
  }
188
293
  /**
189
294
  * A fully-loaded skill including the SKILL.md instruction body.
@@ -193,6 +298,8 @@ interface SkillMetadata {
193
298
  interface Skill extends SkillMetadata {
194
299
  /** The markdown body of SKILL.md (everything after the frontmatter) */
195
300
  instructions: string;
301
+ /** Resource file contents keyed by relative path (e.g. `references/overview.md` → content) */
302
+ resourceContents?: Record<string, string>;
196
303
  }
197
304
  /**
198
305
  * Abstraction for discovering and loading skills.
@@ -205,6 +312,8 @@ interface SkillProvider {
205
312
  listSkills(): Promise<SkillMetadata[]>;
206
313
  /** Load a single skill with full instructions by name */
207
314
  getSkill(name: string): Promise<Skill>;
315
+ /** Load all skills with full instructions */
316
+ loadAll(): Promise<Skill[]>;
208
317
  }
209
318
 
210
319
  /**
@@ -384,8 +493,6 @@ type PrefixedThreadOps<TPrefix extends string> = {
384
493
  interface SessionConfig<T extends ToolMap, M = unknown> {
385
494
  /** The name of the agent, should be unique within the workflows */
386
495
  agentName: string;
387
- /** The thread ID to use for the session (defaults to a short generated ID) */
388
- threadId?: string;
389
496
  /** Metadata for the session */
390
497
  metadata?: Record<string, unknown>;
391
498
  /** Whether to append the system prompt as message to the thread */
@@ -400,7 +507,7 @@ interface SessionConfig<T extends ToolMap, M = unknown> {
400
507
  tools?: T;
401
508
  /** Subagent configurations */
402
509
  subagents?: SubagentConfig[];
403
- /** Skills available to this agent (metadata + instructions, loaded activity-side) */
510
+ /** Skills available to this agent (metadata + instructions, loaded before session creation) */
404
511
  skills?: Skill[];
405
512
  /** Session lifecycle hooks */
406
513
  hooks?: Hooks<T, ToolCallResultUnion<InferToolResults<T>>>;
@@ -411,28 +518,52 @@ interface SessionConfig<T extends ToolMap, M = unknown> {
411
518
  * Returns MessageContent array for the initial HumanMessage.
412
519
  */
413
520
  buildContextMessage: () => MessageContent | Promise<MessageContent>;
414
- /** When true, skip thread initialization and system prompt — append only the new human message to the existing thread. */
415
- continueThread?: boolean;
416
521
  /** How long to wait for input before cancelling the workflow */
417
522
  waitForInputTimeout?: Duration;
523
+ /**
524
+ * Thread initialization strategy (default: `{ mode: "new" }`).
525
+ *
526
+ * - `{ mode: "new" }` — start a fresh thread.
527
+ * - `{ mode: "new", threadId: "..." }` — start a fresh thread with a specific ID.
528
+ * - `{ mode: "continue", threadId: "..." }` — append to an existing thread in-place.
529
+ * - `{ mode: "fork", threadId: "..." }` — fork an existing thread and continue in the copy.
530
+ */
531
+ thread?: ThreadInit;
418
532
  /** Sandbox lifecycle operations (optional — omit for agents that don't need a sandbox) */
419
- sandbox?: SandboxOps;
533
+ sandboxOps?: SandboxOps;
420
534
  /**
421
- * Pre-existing sandbox ID to reuse (e.g. inherited from a parent agent).
422
- * When set, the session skips `createSandbox` and will not destroy the
423
- * sandbox on exit (the owner is responsible for cleanup).
535
+ * Sandbox initialization strategy.
536
+ *
537
+ * - `{ mode: "new" }` create a fresh sandbox.
538
+ * - `{ mode: "continue", sandboxId: "..." }` — resume a paused sandbox (session owns it).
539
+ * - `{ mode: "fork", sandboxId: "..." }` — fork from an existing sandbox.
540
+ * - `{ mode: "inherit", sandboxId: "..." }` — use a parent's sandbox without ownership.
541
+ *
542
+ * When omitted and `sandboxOps` is provided, defaults to `{ mode: "new" }`.
424
543
  */
425
- sandboxId?: string;
544
+ sandbox?: SandboxInit;
545
+ /**
546
+ * What to do with the sandbox when this session exits.
547
+ *
548
+ * Defaults to `"destroy"` when omitted.
549
+ * Has no effect when the sandbox is inherited (`sandbox.mode === "inherit"`).
550
+ */
551
+ sandboxShutdown?: SubagentSandboxShutdown;
426
552
  }
427
- interface ZeitlichSession<M = unknown> {
553
+ type SessionResult<M, TState extends JsonSerializable<TState>, HasSandbox extends boolean = boolean> = {
554
+ threadId: string;
555
+ finalMessage: M | null;
556
+ exitReason: SessionExitReason;
557
+ usage: ReturnType<AgentStateManager<TState>["getTotalUsage"]>;
558
+ } & (HasSandbox extends true ? {
559
+ sandboxId: string;
560
+ } : {
561
+ sandboxId?: undefined;
562
+ });
563
+ interface ZeitlichSession<M = unknown, HasSandbox extends boolean = boolean> {
428
564
  runSession<T extends JsonSerializable<T>>(args: {
429
565
  stateManager: AgentStateManager<T>;
430
- }): Promise<{
431
- threadId: string;
432
- finalMessage: M | null;
433
- exitReason: SessionExitReason;
434
- usage: ReturnType<AgentStateManager<T>["getTotalUsage"]>;
435
- }>;
566
+ }): Promise<SessionResult<M, T, HasSandbox>>;
436
567
  }
437
568
 
438
- export type { AgentResponse as A, Hooks as H, JsonPrimitive as J, ModelInvoker as M, PrefixedThreadOps as P, RunAgentActivity as R, ScopedPrefix as S, ThreadOps as T, ZeitlichSession as Z, ModelInvokerConfig as a, SkillProvider as b, SkillMetadata as c, Skill as d, AgentState as e, AgentStateManager as f, JsonSerializable as g, JsonValue as h, PostHumanMessageAppendHook as i, PostHumanMessageAppendHookContext as j, PreHumanMessageAppendHook as k, PreHumanMessageAppendHookContext as l, SessionConfig as m, SessionEndHook as n, SessionEndHookContext as o, SessionStartHook as p, SessionStartHookContext as q, SubagentConfig as r, SubagentDefinition as s, SubagentHandlerResponse as t, SubagentHooks as u, SubagentSessionInput as v, SubagentWorkflow as w, SubagentWorkflowInput as x };
569
+ export type { AgentResponse as A, SubagentSandboxShutdown as B, SubagentSessionInput as C, SubagentWorkflow as D, SubagentWorkflowInput as E, ThreadInit as F, Hooks as H, JsonPrimitive as J, ModelInvoker as M, PrefixedThreadOps as P, RunAgentActivity as R, ScopedPrefix as S, ThreadOps as T, ZeitlichSession as Z, ModelInvokerConfig as a, SkillProvider as b, SkillMetadata as c, Skill as d, AgentState as e, AgentStateManager as f, JsonSerializable as g, JsonValue as h, PostHumanMessageAppendHook as i, PostHumanMessageAppendHookContext as j, PreHumanMessageAppendHook as k, PreHumanMessageAppendHookContext as l, SandboxInit as m, SandboxShutdown as n, SessionConfig as o, SessionEndHook as p, SessionEndHookContext as q, SessionResult as r, SessionStartHook as s, SessionStartHookContext as t, SubagentConfig as u, SubagentDefinition as v, SubagentFnResult as w, SubagentHandlerResponse as x, SubagentHooks as y, SubagentSandboxConfig as z };