zeitlich 0.2.33 → 0.2.35
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.
- package/README.md +17 -6
- package/dist/{activities-YBD5BaHh.d.ts → activities-BVI2lTwr.d.ts} +6 -4
- package/dist/{activities-fnX8-vhR.d.cts → activities-hd4aNnZE.d.cts} +6 -4
- package/dist/adapters/sandbox/bedrock/index.cjs +2 -0
- package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -1
- package/dist/adapters/sandbox/bedrock/index.d.cts +4 -3
- package/dist/adapters/sandbox/bedrock/index.d.ts +4 -3
- package/dist/adapters/sandbox/bedrock/index.js +2 -0
- package/dist/adapters/sandbox/bedrock/index.js.map +1 -1
- package/dist/adapters/sandbox/bedrock/workflow.cjs +1 -0
- package/dist/adapters/sandbox/bedrock/workflow.cjs.map +1 -1
- package/dist/adapters/sandbox/bedrock/workflow.d.cts +2 -2
- package/dist/adapters/sandbox/bedrock/workflow.d.ts +2 -2
- package/dist/adapters/sandbox/bedrock/workflow.js +1 -0
- package/dist/adapters/sandbox/bedrock/workflow.js.map +1 -1
- package/dist/adapters/sandbox/daytona/index.cjs +2 -0
- package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/index.d.cts +2 -1
- package/dist/adapters/sandbox/daytona/index.d.ts +2 -1
- package/dist/adapters/sandbox/daytona/index.js +2 -0
- package/dist/adapters/sandbox/daytona/index.js.map +1 -1
- package/dist/adapters/sandbox/daytona/workflow.cjs +1 -0
- package/dist/adapters/sandbox/daytona/workflow.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/workflow.d.cts +1 -1
- package/dist/adapters/sandbox/daytona/workflow.d.ts +1 -1
- package/dist/adapters/sandbox/daytona/workflow.js +1 -0
- package/dist/adapters/sandbox/daytona/workflow.js.map +1 -1
- package/dist/adapters/sandbox/e2b/index.cjs +3 -0
- package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
- package/dist/adapters/sandbox/e2b/index.d.cts +2 -1
- package/dist/adapters/sandbox/e2b/index.d.ts +2 -1
- package/dist/adapters/sandbox/e2b/index.js +3 -0
- package/dist/adapters/sandbox/e2b/index.js.map +1 -1
- package/dist/adapters/sandbox/e2b/workflow.cjs +1 -0
- package/dist/adapters/sandbox/e2b/workflow.cjs.map +1 -1
- package/dist/adapters/sandbox/e2b/workflow.d.cts +1 -1
- package/dist/adapters/sandbox/e2b/workflow.d.ts +1 -1
- package/dist/adapters/sandbox/e2b/workflow.js +1 -0
- package/dist/adapters/sandbox/e2b/workflow.js.map +1 -1
- package/dist/adapters/sandbox/inmemory/index.cjs +2 -0
- package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
- package/dist/adapters/sandbox/inmemory/index.d.cts +2 -1
- package/dist/adapters/sandbox/inmemory/index.d.ts +2 -1
- package/dist/adapters/sandbox/inmemory/index.js +2 -0
- package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.cjs +1 -0
- package/dist/adapters/sandbox/inmemory/workflow.cjs.map +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.d.cts +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.d.ts +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.js +1 -0
- package/dist/adapters/sandbox/inmemory/workflow.js.map +1 -1
- package/dist/adapters/thread/anthropic/index.cjs +7 -2
- package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
- package/dist/adapters/thread/anthropic/index.d.cts +5 -5
- package/dist/adapters/thread/anthropic/index.d.ts +5 -5
- package/dist/adapters/thread/anthropic/index.js +7 -2
- package/dist/adapters/thread/anthropic/index.js.map +1 -1
- package/dist/adapters/thread/anthropic/workflow.d.cts +5 -5
- package/dist/adapters/thread/anthropic/workflow.d.ts +5 -5
- package/dist/adapters/thread/google-genai/index.cjs +4 -3
- package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/index.d.cts +5 -5
- package/dist/adapters/thread/google-genai/index.d.ts +5 -5
- package/dist/adapters/thread/google-genai/index.js +4 -3
- package/dist/adapters/thread/google-genai/index.js.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.d.cts +5 -5
- package/dist/adapters/thread/google-genai/workflow.d.ts +5 -5
- package/dist/adapters/thread/langchain/index.cjs +4 -1
- package/dist/adapters/thread/langchain/index.cjs.map +1 -1
- package/dist/adapters/thread/langchain/index.d.cts +5 -5
- package/dist/adapters/thread/langchain/index.d.ts +5 -5
- package/dist/adapters/thread/langchain/index.js +4 -1
- package/dist/adapters/thread/langchain/index.js.map +1 -1
- package/dist/adapters/thread/langchain/workflow.d.cts +5 -5
- package/dist/adapters/thread/langchain/workflow.d.ts +5 -5
- package/dist/index.cjs +115 -31
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -9
- package/dist/index.d.ts +10 -9
- package/dist/index.js +115 -31
- package/dist/index.js.map +1 -1
- package/dist/{proxy-CTCYWjkr.d.cts → proxy-7RnVaPdJ.d.cts} +1 -1
- package/dist/{proxy-Br4unLTC.d.ts → proxy-BjdFGPTm.d.ts} +1 -1
- package/dist/{thread-manager-DKWxHUzD.d.ts → thread-manager-BBzNgQWH.d.cts} +5 -2
- package/dist/{thread-manager-CUubPYPH.d.cts → thread-manager-CbpiGq1L.d.ts} +6 -3
- package/dist/{thread-manager-Cv_BR28i.d.cts → thread-manager-DjN5JYul.d.ts} +5 -2
- package/dist/{thread-manager-YJLoc1vH.d.ts → thread-manager-DzXm9eeI.d.cts} +6 -3
- package/dist/{types-Bpq5fDI5.d.cts → types-CADc5V_P.d.ts} +39 -24
- package/dist/{types-DUvEZSDe.d.cts → types-CBH54cwr.d.cts} +1 -1
- package/dist/{types-CheCTLeV.d.ts → types-DQ1l_gXL.d.cts} +39 -24
- package/dist/{types-AujBIMMn.d.cts → types-DxCpFNv_.d.cts} +4 -0
- package/dist/{types-AujBIMMn.d.ts → types-DxCpFNv_.d.ts} +4 -0
- package/dist/{types-NJDyMyUx.d.cts → types-Mc_4BCfT.d.cts} +3 -3
- package/dist/{types-DBk-C8zM.d.ts → types-wiGLvxWf.d.ts} +1 -1
- package/dist/{types-BxiT8w9d.d.ts → types-yiXmqedU.d.ts} +3 -3
- package/dist/{workflow-Od9vx5Jk.d.cts → workflow-DhtWRovz.d.cts} +3 -3
- package/dist/{workflow-D9nNERvs.d.ts → workflow-P2pTSfKu.d.ts} +3 -3
- package/dist/workflow.cjs +109 -31
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +3 -3
- package/dist/workflow.d.ts +3 -3
- package/dist/workflow.js +109 -31
- package/dist/workflow.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/sandbox/bedrock/index.ts +4 -0
- package/src/adapters/sandbox/bedrock/proxy.ts +1 -0
- package/src/adapters/sandbox/daytona/index.ts +4 -0
- package/src/adapters/sandbox/daytona/proxy.ts +1 -0
- package/src/adapters/sandbox/e2b/index.ts +4 -0
- package/src/adapters/sandbox/e2b/proxy.ts +1 -0
- package/src/adapters/sandbox/inmemory/index.ts +4 -0
- package/src/adapters/sandbox/inmemory/proxy.ts +1 -0
- package/src/adapters/thread/anthropic/activities.ts +2 -1
- package/src/adapters/thread/anthropic/thread-manager.ts +21 -9
- package/src/adapters/thread/google-genai/activities.ts +2 -1
- package/src/adapters/thread/google-genai/thread-manager.test.ts +1 -1
- package/src/adapters/thread/google-genai/thread-manager.ts +15 -7
- package/src/adapters/thread/langchain/activities.ts +2 -1
- package/src/adapters/thread/langchain/thread-manager.ts +12 -3
- package/src/lib/lifecycle.ts +7 -3
- package/src/lib/sandbox/manager.ts +7 -0
- package/src/lib/sandbox/types.ts +4 -0
- package/src/lib/session/session-edge-cases.integration.test.ts +194 -0
- package/src/lib/session/session.integration.test.ts +5 -0
- package/src/lib/session/session.ts +13 -1
- package/src/lib/session/types.ts +10 -2
- package/src/lib/state/manager.ts +2 -2
- package/src/lib/state/types.ts +2 -2
- package/src/lib/subagent/define.ts +1 -1
- package/src/lib/subagent/handler.ts +142 -32
- package/src/lib/subagent/index.ts +5 -1
- package/src/lib/subagent/signals.ts +8 -1
- package/src/lib/subagent/subagent.integration.test.ts +532 -25
- package/src/lib/subagent/types.ts +32 -15
- package/src/lib/subagent/workflow.ts +26 -13
- package/src/lib/thread/types.ts +2 -2
- package/src/lib/types.ts +1 -1
- package/src/lib/virtual-fs/manager.ts +1 -1
- package/src/lib/virtual-fs/types.ts +2 -2
- package/src/lib/virtual-fs/virtual-fs.test.ts +2 -2
- package/src/workflow.ts +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
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
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
|
-
|
|
|
77
|
-
|
|
78
|
-
|
|
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"
|
|
158
|
-
* and `sandboxId` become
|
|
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
|
|
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 {
|
|
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 (
|
|
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="
|
|
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="
|
|
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,
|
package/src/lib/thread/types.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type Redis from "ioredis";
|
|
2
2
|
import type { JsonValue } from "../state/types";
|
|
3
|
-
|
|
4
3
|
export interface ThreadManagerConfig<T> {
|
|
5
4
|
redis: Redis;
|
|
6
5
|
threadId: string;
|
|
@@ -71,9 +70,10 @@ export interface ProviderThreadManager<
|
|
|
71
70
|
TStored,
|
|
72
71
|
TContent = string,
|
|
73
72
|
TToolContent = JsonValue,
|
|
73
|
+
TSystemContent = string,
|
|
74
74
|
> extends BaseThreadManager<TStored> {
|
|
75
75
|
appendUserMessage(id: string, content: TContent): Promise<void>;
|
|
76
|
-
appendSystemMessage(id: string, content:
|
|
76
|
+
appendSystemMessage(id: string, content: TSystemContent): Promise<void>;
|
|
77
77
|
appendToolResult(
|
|
78
78
|
id: string,
|
|
79
79
|
toolCallId: string,
|
package/src/lib/types.ts
CHANGED
|
@@ -28,7 +28,7 @@ export interface BaseAgentState {
|
|
|
28
28
|
/** In-memory file contents keyed by path, bypassing the resolver (e.g. skill resources). */
|
|
29
29
|
inlineFiles?: Record<string, string>;
|
|
30
30
|
virtualFsCtx?: unknown;
|
|
31
|
-
systemPrompt?:
|
|
31
|
+
systemPrompt?: unknown;
|
|
32
32
|
totalInputTokens: number;
|
|
33
33
|
totalOutputTokens: number;
|
|
34
34
|
cachedWriteTokens: number;
|
|
@@ -21,7 +21,7 @@ import type {
|
|
|
21
21
|
* const activities = {
|
|
22
22
|
* ...createVirtualFsActivities(resolver, "CodingAgent"),
|
|
23
23
|
* };
|
|
24
|
-
* // registers:
|
|
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
|
-
* // → {
|
|
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
|
|
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("
|
|
402
|
-
const result = await activities.
|
|
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
|
});
|