zeitlich 0.2.21 → 0.2.23
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 +303 -105
- package/dist/adapters/sandbox/daytona/index.cjs +7 -1
- package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/index.d.cts +3 -1
- package/dist/adapters/sandbox/daytona/index.d.ts +3 -1
- package/dist/adapters/sandbox/daytona/index.js +7 -1
- package/dist/adapters/sandbox/daytona/index.js.map +1 -1
- package/dist/adapters/sandbox/daytona/workflow.cjs +33 -0
- package/dist/adapters/sandbox/daytona/workflow.cjs.map +1 -0
- package/dist/adapters/sandbox/daytona/workflow.d.cts +27 -0
- package/dist/adapters/sandbox/daytona/workflow.d.ts +27 -0
- package/dist/adapters/sandbox/daytona/workflow.js +31 -0
- package/dist/adapters/sandbox/daytona/workflow.js.map +1 -0
- package/dist/adapters/sandbox/inmemory/index.cjs +18 -1
- package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
- package/dist/adapters/sandbox/inmemory/index.d.cts +4 -2
- package/dist/adapters/sandbox/inmemory/index.d.ts +4 -2
- package/dist/adapters/sandbox/inmemory/index.js +18 -1
- package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
- package/dist/adapters/sandbox/inmemory/workflow.cjs +33 -0
- package/dist/adapters/sandbox/inmemory/workflow.cjs.map +1 -0
- package/dist/adapters/sandbox/inmemory/workflow.d.cts +25 -0
- package/dist/adapters/sandbox/inmemory/workflow.d.ts +25 -0
- package/dist/adapters/sandbox/inmemory/workflow.js +31 -0
- package/dist/adapters/sandbox/inmemory/workflow.js.map +1 -0
- package/dist/adapters/sandbox/virtual/index.cjs +36 -9
- package/dist/adapters/sandbox/virtual/index.cjs.map +1 -1
- package/dist/adapters/sandbox/virtual/index.d.cts +8 -5
- package/dist/adapters/sandbox/virtual/index.d.ts +8 -5
- package/dist/adapters/sandbox/virtual/index.js +36 -9
- package/dist/adapters/sandbox/virtual/index.js.map +1 -1
- package/dist/adapters/sandbox/virtual/workflow.cjs +33 -0
- package/dist/adapters/sandbox/virtual/workflow.cjs.map +1 -0
- package/dist/adapters/sandbox/virtual/workflow.d.cts +27 -0
- package/dist/adapters/sandbox/virtual/workflow.d.ts +27 -0
- package/dist/adapters/sandbox/virtual/workflow.js +31 -0
- package/dist/adapters/sandbox/virtual/workflow.js.map +1 -0
- package/dist/adapters/thread/google-genai/index.cjs +9 -1
- package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/index.d.cts +31 -19
- package/dist/adapters/thread/google-genai/index.d.ts +31 -19
- package/dist/adapters/thread/google-genai/index.js +9 -1
- package/dist/adapters/thread/google-genai/index.js.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.cjs +33 -0
- package/dist/adapters/thread/google-genai/workflow.cjs.map +1 -0
- package/dist/adapters/thread/google-genai/workflow.d.cts +32 -0
- package/dist/adapters/thread/google-genai/workflow.d.ts +32 -0
- package/dist/adapters/thread/google-genai/workflow.js +31 -0
- package/dist/adapters/thread/google-genai/workflow.js.map +1 -0
- package/dist/adapters/thread/langchain/index.cjs +9 -1
- package/dist/adapters/thread/langchain/index.cjs.map +1 -1
- package/dist/adapters/thread/langchain/index.d.cts +27 -16
- package/dist/adapters/thread/langchain/index.d.ts +27 -16
- package/dist/adapters/thread/langchain/index.js +9 -1
- package/dist/adapters/thread/langchain/index.js.map +1 -1
- package/dist/adapters/thread/langchain/workflow.cjs +33 -0
- package/dist/adapters/thread/langchain/workflow.cjs.map +1 -0
- package/dist/adapters/thread/langchain/workflow.d.cts +32 -0
- package/dist/adapters/thread/langchain/workflow.d.ts +32 -0
- package/dist/adapters/thread/langchain/workflow.js +31 -0
- package/dist/adapters/thread/langchain/workflow.js.map +1 -0
- package/dist/index.cjs +282 -90
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +38 -16
- package/dist/index.d.ts +38 -16
- package/dist/index.js +281 -87
- package/dist/index.js.map +1 -1
- package/dist/queries-DModcWRy.d.cts +44 -0
- package/dist/queries-byD0jr1Y.d.ts +44 -0
- package/dist/{types-BkAYmc96.d.ts → types-B50pBPEV.d.ts} +190 -38
- package/dist/{types-YbL7JpEA.d.cts → types-Bll19FZJ.d.cts} +7 -0
- package/dist/{types-YbL7JpEA.d.ts → types-Bll19FZJ.d.ts} +7 -0
- package/dist/{queries-6Avfh74U.d.ts → types-BuXdFhaZ.d.cts} +7 -48
- package/dist/{types-BMRzfELQ.d.cts → types-ChAMwU3q.d.cts} +17 -1
- package/dist/{types-BMRzfELQ.d.ts → types-ChAMwU3q.d.ts} +17 -1
- package/dist/{types-CES_30qx.d.cts → types-DQW8l7pY.d.cts} +190 -38
- package/dist/{queries-CHa2iv_I.d.cts → types-GZ76HZSj.d.ts} +7 -48
- package/dist/workflow.cjs +244 -86
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +54 -65
- package/dist/workflow.d.ts +54 -65
- package/dist/workflow.js +243 -83
- package/dist/workflow.js.map +1 -1
- package/package.json +54 -2
- package/src/adapters/sandbox/daytona/filesystem.ts +1 -1
- package/src/adapters/sandbox/daytona/index.ts +8 -0
- package/src/adapters/sandbox/daytona/proxy.ts +56 -0
- package/src/adapters/sandbox/e2b/filesystem.ts +147 -0
- package/src/adapters/sandbox/e2b/index.ts +164 -0
- package/src/adapters/sandbox/e2b/types.ts +23 -0
- package/src/adapters/sandbox/inmemory/index.ts +27 -3
- package/src/adapters/sandbox/inmemory/proxy.ts +53 -0
- package/src/adapters/sandbox/virtual/filesystem.ts +41 -17
- package/src/adapters/sandbox/virtual/provider.ts +9 -1
- package/src/adapters/sandbox/virtual/proxy.ts +53 -0
- package/src/adapters/sandbox/virtual/types.ts +9 -4
- package/src/adapters/thread/google-genai/activities.ts +51 -17
- package/src/adapters/thread/google-genai/index.ts +1 -0
- package/src/adapters/thread/google-genai/proxy.ts +61 -0
- package/src/adapters/thread/langchain/activities.ts +47 -14
- package/src/adapters/thread/langchain/index.ts +1 -0
- package/src/adapters/thread/langchain/proxy.ts +61 -0
- package/src/lib/lifecycle.ts +57 -0
- package/src/lib/sandbox/manager.ts +52 -6
- package/src/lib/sandbox/sandbox.test.ts +12 -11
- package/src/lib/sandbox/types.ts +31 -4
- package/src/lib/session/index.ts +4 -5
- package/src/lib/session/session-edge-cases.integration.test.ts +491 -66
- package/src/lib/session/session.integration.test.ts +92 -80
- package/src/lib/session/session.ts +108 -96
- package/src/lib/session/types.ts +87 -17
- package/src/lib/subagent/define.ts +6 -5
- package/src/lib/subagent/handler.ts +148 -16
- package/src/lib/subagent/index.ts +4 -0
- package/src/lib/subagent/register.ts +10 -3
- package/src/lib/subagent/signals.ts +8 -0
- package/src/lib/subagent/subagent.integration.test.ts +893 -128
- package/src/lib/subagent/tool.ts +2 -2
- package/src/lib/subagent/types.ts +84 -21
- package/src/lib/subagent/workflow.ts +83 -12
- package/src/lib/tool-router/router-edge-cases.integration.test.ts +4 -1
- package/src/lib/tool-router/router.integration.test.ts +141 -5
- package/src/lib/tool-router/router.ts +13 -3
- package/src/lib/tool-router/types.ts +7 -0
- package/src/lib/workflow.test.ts +104 -27
- package/src/lib/workflow.ts +37 -19
- package/src/tools/bash/bash.test.ts +16 -7
- package/src/workflow.ts +11 -14
- package/tsup.config.ts +6 -0
package/src/lib/workflow.test.ts
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
const cfg = { name: "test-workflow" };
|
|
9
9
|
|
|
10
10
|
describe("defineWorkflow", () => {
|
|
11
|
-
it("maps
|
|
11
|
+
it("maps thread fork into sessionInput", async () => {
|
|
12
12
|
let capturedSession: WorkflowSessionInput | undefined;
|
|
13
13
|
|
|
14
14
|
const workflow = defineWorkflow(cfg, async (_input, sessionInput) => {
|
|
@@ -16,15 +16,16 @@ describe("defineWorkflow", () => {
|
|
|
16
16
|
return { ok: true };
|
|
17
17
|
});
|
|
18
18
|
|
|
19
|
-
await workflow({}, {
|
|
19
|
+
await workflow({}, { thread: { mode: "fork", threadId: "prev-42" } });
|
|
20
20
|
|
|
21
21
|
expect(capturedSession).toEqual({
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
agentName: "test-workflow",
|
|
23
|
+
sandboxShutdown: "destroy",
|
|
24
|
+
thread: { mode: "fork", threadId: "prev-42" },
|
|
24
25
|
});
|
|
25
26
|
});
|
|
26
27
|
|
|
27
|
-
it("maps
|
|
28
|
+
it("maps sandbox inherit", async () => {
|
|
28
29
|
let capturedSession: WorkflowSessionInput | undefined;
|
|
29
30
|
|
|
30
31
|
const workflow = defineWorkflow(cfg, async (_input, sessionInput) => {
|
|
@@ -32,12 +33,16 @@ describe("defineWorkflow", () => {
|
|
|
32
33
|
return { ok: true };
|
|
33
34
|
});
|
|
34
35
|
|
|
35
|
-
await workflow({}, { sandboxId: "sb-123" });
|
|
36
|
+
await workflow({}, { sandbox: { mode: "inherit", sandboxId: "sb-123" } });
|
|
36
37
|
|
|
37
|
-
expect(capturedSession).toEqual({
|
|
38
|
+
expect(capturedSession).toEqual({
|
|
39
|
+
agentName: "test-workflow",
|
|
40
|
+
sandboxShutdown: "destroy",
|
|
41
|
+
sandbox: { mode: "inherit", sandboxId: "sb-123" },
|
|
42
|
+
});
|
|
38
43
|
});
|
|
39
44
|
|
|
40
|
-
it("maps
|
|
45
|
+
it("maps thread fork and sandbox together", async () => {
|
|
41
46
|
let capturedSession: WorkflowSessionInput | undefined;
|
|
42
47
|
|
|
43
48
|
const workflow = defineWorkflow(cfg, async (_input, sessionInput) => {
|
|
@@ -45,16 +50,20 @@ describe("defineWorkflow", () => {
|
|
|
45
50
|
return { ok: true };
|
|
46
51
|
});
|
|
47
52
|
|
|
48
|
-
await workflow({}, {
|
|
53
|
+
await workflow({}, {
|
|
54
|
+
thread: { mode: "fork", threadId: "prev-1" },
|
|
55
|
+
sandbox: { mode: "continue", sandboxId: "sb-1" },
|
|
56
|
+
});
|
|
49
57
|
|
|
50
58
|
expect(capturedSession).toEqual({
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
59
|
+
agentName: "test-workflow",
|
|
60
|
+
sandboxShutdown: "destroy",
|
|
61
|
+
thread: { mode: "fork", threadId: "prev-1" },
|
|
62
|
+
sandbox: { mode: "continue", sandboxId: "sb-1" },
|
|
54
63
|
});
|
|
55
64
|
});
|
|
56
65
|
|
|
57
|
-
it("
|
|
66
|
+
it("defaults sandboxShutdown to destroy when no workflowInput", async () => {
|
|
58
67
|
let capturedSession: WorkflowSessionInput | undefined;
|
|
59
68
|
|
|
60
69
|
const workflow = defineWorkflow(cfg, async (_input, sessionInput) => {
|
|
@@ -64,18 +73,85 @@ describe("defineWorkflow", () => {
|
|
|
64
73
|
|
|
65
74
|
await workflow({});
|
|
66
75
|
|
|
67
|
-
expect(capturedSession).toEqual({
|
|
76
|
+
expect(capturedSession).toEqual({
|
|
77
|
+
agentName: "test-workflow",
|
|
78
|
+
sandboxShutdown: "destroy",
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("maps sandbox fork from workflowInput", async () => {
|
|
83
|
+
let capturedSession: WorkflowSessionInput | undefined;
|
|
84
|
+
|
|
85
|
+
const workflow = defineWorkflow(cfg, async (_input, sessionInput) => {
|
|
86
|
+
capturedSession = sessionInput;
|
|
87
|
+
return { ok: true };
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
await workflow({}, { sandbox: { mode: "fork", sandboxId: "prev-sb-1" } });
|
|
91
|
+
|
|
92
|
+
expect(capturedSession).toEqual({
|
|
93
|
+
agentName: "test-workflow",
|
|
94
|
+
sandboxShutdown: "destroy",
|
|
95
|
+
sandbox: { mode: "fork", sandboxId: "prev-sb-1" },
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("uses sandboxShutdown from config", async () => {
|
|
100
|
+
let capturedSession: WorkflowSessionInput | undefined;
|
|
101
|
+
|
|
102
|
+
const workflow = defineWorkflow(
|
|
103
|
+
{ name: "test-workflow", sandboxShutdown: "pause" },
|
|
104
|
+
async (_input, sessionInput) => {
|
|
105
|
+
capturedSession = sessionInput;
|
|
106
|
+
return { ok: true };
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
await workflow({});
|
|
111
|
+
|
|
112
|
+
expect(capturedSession).toEqual({
|
|
113
|
+
agentName: "test-workflow",
|
|
114
|
+
sandboxShutdown: "pause",
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("maps all lifecycle fields together", async () => {
|
|
119
|
+
let capturedSession: WorkflowSessionInput | undefined;
|
|
120
|
+
|
|
121
|
+
const workflow = defineWorkflow(
|
|
122
|
+
{ name: "test-workflow", sandboxShutdown: "pause" },
|
|
123
|
+
async (_input, sessionInput) => {
|
|
124
|
+
capturedSession = sessionInput;
|
|
125
|
+
return { ok: true };
|
|
126
|
+
}
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
await workflow(
|
|
130
|
+
{},
|
|
131
|
+
{
|
|
132
|
+
thread: { mode: "fork", threadId: "prev-t" },
|
|
133
|
+
sandbox: { mode: "fork", sandboxId: "prev-sb-1" },
|
|
134
|
+
}
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
expect(capturedSession).toEqual({
|
|
138
|
+
agentName: "test-workflow",
|
|
139
|
+
sandboxShutdown: "pause",
|
|
140
|
+
thread: { mode: "fork", threadId: "prev-t" },
|
|
141
|
+
sandbox: { mode: "fork", sandboxId: "prev-sb-1" },
|
|
142
|
+
});
|
|
68
143
|
});
|
|
69
144
|
|
|
70
145
|
it("passes full input as first argument", async () => {
|
|
71
146
|
let capturedInput: unknown;
|
|
72
147
|
|
|
73
|
-
const workflow = defineWorkflow<
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
148
|
+
const workflow = defineWorkflow<
|
|
149
|
+
{
|
|
150
|
+
prompt: string;
|
|
151
|
+
metadata: { key: string };
|
|
152
|
+
},
|
|
153
|
+
{ ok: boolean }
|
|
154
|
+
>(cfg, async (input, _sessionInput) => {
|
|
79
155
|
capturedInput = input;
|
|
80
156
|
return { ok: true };
|
|
81
157
|
});
|
|
@@ -101,20 +177,21 @@ describe("defineWorkflow", () => {
|
|
|
101
177
|
capturedInput = input;
|
|
102
178
|
capturedSession = sessionInput;
|
|
103
179
|
return { ok: true };
|
|
104
|
-
}
|
|
180
|
+
}
|
|
105
181
|
);
|
|
106
182
|
|
|
107
183
|
const workflowInput: WorkflowInput = {
|
|
108
|
-
|
|
109
|
-
sandboxId: "sb",
|
|
184
|
+
thread: { mode: "fork", threadId: "prev" },
|
|
185
|
+
sandbox: { mode: "continue", sandboxId: "sb" },
|
|
110
186
|
};
|
|
111
187
|
await workflow({ prompt: "go" }, workflowInput);
|
|
112
188
|
|
|
113
189
|
expect(capturedInput).toEqual({ prompt: "go" });
|
|
114
190
|
expect(capturedSession).toEqual({
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
191
|
+
agentName: "test-workflow",
|
|
192
|
+
sandboxShutdown: "destroy",
|
|
193
|
+
thread: { mode: "fork", threadId: "prev" },
|
|
194
|
+
sandbox: { mode: "continue", sandboxId: "sb" },
|
|
118
195
|
});
|
|
119
196
|
});
|
|
120
197
|
|
|
@@ -135,7 +212,7 @@ describe("defineWorkflow", () => {
|
|
|
135
212
|
it("sets the function name from config", () => {
|
|
136
213
|
const workflow = defineWorkflow(
|
|
137
214
|
{ name: "my-main-workflow" },
|
|
138
|
-
async () => ({})
|
|
215
|
+
async () => ({})
|
|
139
216
|
);
|
|
140
217
|
|
|
141
218
|
expect(workflow.name).toBe("my-main-workflow");
|
package/src/lib/workflow.ts
CHANGED
|
@@ -1,27 +1,43 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ThreadInit,
|
|
3
|
+
SandboxInit,
|
|
4
|
+
SandboxShutdown,
|
|
5
|
+
} from "./lifecycle";
|
|
6
|
+
|
|
1
7
|
/**
|
|
2
8
|
* Session config fields derived from a main workflow input, ready to spread
|
|
3
9
|
* into `createSession`.
|
|
4
10
|
*/
|
|
5
11
|
export interface WorkflowSessionInput {
|
|
6
|
-
/**
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
+
/** Agent name — spread directly into `createSession` */
|
|
13
|
+
agentName: string;
|
|
14
|
+
/** Thread initialization strategy */
|
|
15
|
+
thread?: ThreadInit;
|
|
16
|
+
/** Sandbox initialization strategy */
|
|
17
|
+
sandbox?: SandboxInit;
|
|
18
|
+
/** Sandbox shutdown policy (default: "destroy") */
|
|
19
|
+
sandboxShutdown?: SandboxShutdown;
|
|
12
20
|
}
|
|
13
21
|
|
|
14
22
|
/** Raw workflow input fields that map into `WorkflowSessionInput`. */
|
|
15
23
|
export interface WorkflowInput {
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
|
|
24
|
+
/** Thread initialization strategy (default: `{ mode: "new" }`) */
|
|
25
|
+
thread?: ThreadInit;
|
|
26
|
+
/** Sandbox initialization strategy */
|
|
27
|
+
sandbox?: SandboxInit;
|
|
20
28
|
}
|
|
21
29
|
|
|
22
30
|
export interface WorkflowConfig {
|
|
23
31
|
/** Workflow name — used as the Temporal workflow function name */
|
|
24
32
|
name: string;
|
|
33
|
+
/**
|
|
34
|
+
* Sandbox shutdown policy applied when the main agent session exits.
|
|
35
|
+
*
|
|
36
|
+
* - `"destroy"` (default) — destroy the sandbox on exit.
|
|
37
|
+
* - `"pause"` — pause the sandbox so it can be resumed later.
|
|
38
|
+
* - `"keep"` — leave the sandbox running (no-op on exit).
|
|
39
|
+
*/
|
|
40
|
+
sandboxShutdown?: SandboxShutdown;
|
|
25
41
|
}
|
|
26
42
|
|
|
27
43
|
/**
|
|
@@ -31,20 +47,22 @@ export interface WorkflowConfig {
|
|
|
31
47
|
* The wrapper:
|
|
32
48
|
* - Accepts a `config` with at least a `name` (used for Temporal workflow naming)
|
|
33
49
|
* - Accepts a handler `fn` receiving `(input, sessionInput)`
|
|
34
|
-
* - Derives
|
|
35
|
-
* -
|
|
50
|
+
* - Derives thread / sandbox init from `workflowInput`
|
|
51
|
+
* - Applies the configured `sandboxShutdown` policy
|
|
36
52
|
*/
|
|
37
53
|
export function defineWorkflow<TInput, TResult>(
|
|
38
54
|
config: WorkflowConfig,
|
|
39
|
-
fn: (input: TInput, sessionInput: WorkflowSessionInput) => Promise<TResult
|
|
55
|
+
fn: (input: TInput, sessionInput: WorkflowSessionInput) => Promise<TResult>
|
|
40
56
|
): (input: TInput, workflowInput?: WorkflowInput) => Promise<TResult> {
|
|
41
|
-
const workflow = async (
|
|
57
|
+
const workflow = async (
|
|
58
|
+
input: TInput,
|
|
59
|
+
workflowInput: WorkflowInput = {}
|
|
60
|
+
): Promise<TResult> => {
|
|
42
61
|
const sessionInput: WorkflowSessionInput = {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}),
|
|
47
|
-
...(workflowInput.sandboxId && { sandboxId: workflowInput.sandboxId }),
|
|
62
|
+
agentName: config.name,
|
|
63
|
+
sandboxShutdown: config.sandboxShutdown ?? "destroy",
|
|
64
|
+
...(workflowInput.thread && { thread: workflowInput.thread }),
|
|
65
|
+
...(workflowInput.sandbox && { sandbox: workflowInput.sandbox }),
|
|
48
66
|
};
|
|
49
67
|
return fn(input, sessionInput);
|
|
50
68
|
};
|
|
@@ -4,11 +4,17 @@ import { withSandbox } from "../../lib/tool-router/with-sandbox";
|
|
|
4
4
|
import { SandboxManager } from "../../lib/sandbox/manager";
|
|
5
5
|
import { InMemorySandboxProvider } from "../../adapters/sandbox/inmemory/index";
|
|
6
6
|
import type { RouterContext } from "../../lib/tool-router/types";
|
|
7
|
+
import type { Sandbox, SandboxCreateOptions } from "../../lib/sandbox";
|
|
7
8
|
|
|
8
9
|
describe("bash handler with sandbox", () => {
|
|
9
|
-
let manager: SandboxManager
|
|
10
|
+
let manager: SandboxManager<SandboxCreateOptions, Sandbox, "inMemory">;
|
|
10
11
|
let sandboxId: string;
|
|
11
|
-
let handler: ReturnType<
|
|
12
|
+
let handler: ReturnType<
|
|
13
|
+
typeof withSandbox<
|
|
14
|
+
Parameters<typeof bashHandler>[0],
|
|
15
|
+
Awaited<ReturnType<typeof bashHandler>>["data"]
|
|
16
|
+
>
|
|
17
|
+
>;
|
|
12
18
|
|
|
13
19
|
beforeEach(async () => {
|
|
14
20
|
manager = new SandboxManager(new InMemorySandboxProvider());
|
|
@@ -83,11 +89,14 @@ describe("bash handler with sandbox", () => {
|
|
|
83
89
|
});
|
|
84
90
|
|
|
85
91
|
it("returns error when no sandboxId in context", async () => {
|
|
86
|
-
const { toolResponse, data } = await handler(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
92
|
+
const { toolResponse, data } = await handler(
|
|
93
|
+
{ command: "echo hi" },
|
|
94
|
+
{
|
|
95
|
+
threadId: "test-thread",
|
|
96
|
+
toolCallId: "test-call",
|
|
97
|
+
toolName: "Bash",
|
|
98
|
+
}
|
|
99
|
+
);
|
|
91
100
|
expect(toolResponse).toContain("No sandbox configured");
|
|
92
101
|
expect(data).toBeNull();
|
|
93
102
|
});
|
package/src/workflow.ts
CHANGED
|
@@ -7,27 +7,21 @@
|
|
|
7
7
|
* @example
|
|
8
8
|
* ```typescript
|
|
9
9
|
* // In your workflow file
|
|
10
|
-
* import {
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* askUserQuestionTool,
|
|
14
|
-
* bashTool,
|
|
15
|
-
* defineTool,
|
|
16
|
-
* type SubagentWorkflow,
|
|
17
|
-
* } from 'zeitlich/workflow';
|
|
10
|
+
* import { createSession, defineWorkflow, defineTool, bashTool } from 'zeitlich/workflow';
|
|
11
|
+
* import { proxyLangChainThreadOps } from 'zeitlich/adapters/thread/langchain/workflow';
|
|
12
|
+
* import { proxyVirtualSandboxOps } from 'zeitlich/adapters/sandbox/virtual/workflow';
|
|
18
13
|
* ```
|
|
19
14
|
*/
|
|
20
15
|
|
|
21
16
|
// Session
|
|
22
|
-
export {
|
|
23
|
-
|
|
24
|
-
proxyDefaultThreadOps,
|
|
25
|
-
proxySandboxOps,
|
|
26
|
-
} from "./lib/session";
|
|
27
|
-
export type { ZeitlichSession, ThreadOps, SessionConfig } from "./lib/session";
|
|
17
|
+
export { createSession } from "./lib/session";
|
|
18
|
+
export type { ZeitlichSession, SessionResult, ThreadOps, PrefixedThreadOps, ScopedPrefix, SessionConfig } from "./lib/session";
|
|
28
19
|
export { defineWorkflow } from "./lib/workflow";
|
|
29
20
|
export type { WorkflowConfig, WorkflowInput, WorkflowSessionInput } from "./lib/workflow";
|
|
30
21
|
|
|
22
|
+
// Lifecycle types
|
|
23
|
+
export type { ThreadInit, SandboxInit, SandboxShutdown, SubagentSandboxShutdown } from "./lib/lifecycle";
|
|
24
|
+
|
|
31
25
|
// Thread utilities
|
|
32
26
|
export { getShortId } from "./lib/thread/id";
|
|
33
27
|
|
|
@@ -133,8 +127,10 @@ export type {
|
|
|
133
127
|
export type {
|
|
134
128
|
SubagentConfig,
|
|
135
129
|
SubagentDefinition,
|
|
130
|
+
SubagentFnResult,
|
|
136
131
|
SubagentHooks,
|
|
137
132
|
SubagentHandlerResponse,
|
|
133
|
+
SubagentSandboxConfig,
|
|
138
134
|
SubagentWorkflow,
|
|
139
135
|
SubagentWorkflowInput,
|
|
140
136
|
SubagentSessionInput,
|
|
@@ -147,6 +143,7 @@ export type {
|
|
|
147
143
|
SandboxCreateResult,
|
|
148
144
|
SandboxFileSystem,
|
|
149
145
|
SandboxOps,
|
|
146
|
+
PrefixedSandboxOps,
|
|
150
147
|
SandboxProvider,
|
|
151
148
|
SandboxSnapshot,
|
|
152
149
|
ExecOptions,
|
package/tsup.config.ts
CHANGED
|
@@ -5,11 +5,17 @@ export default defineConfig({
|
|
|
5
5
|
index: "src/index.ts",
|
|
6
6
|
workflow: "src/workflow.ts",
|
|
7
7
|
"adapters/thread/langchain/index": "src/adapters/thread/langchain/index.ts",
|
|
8
|
+
"adapters/thread/langchain/workflow": "src/adapters/thread/langchain/proxy.ts",
|
|
8
9
|
"adapters/thread/google-genai/index":
|
|
9
10
|
"src/adapters/thread/google-genai/index.ts",
|
|
11
|
+
"adapters/thread/google-genai/workflow":
|
|
12
|
+
"src/adapters/thread/google-genai/proxy.ts",
|
|
10
13
|
"adapters/sandbox/inmemory/index": "src/adapters/sandbox/inmemory/index.ts",
|
|
14
|
+
"adapters/sandbox/inmemory/workflow": "src/adapters/sandbox/inmemory/proxy.ts",
|
|
11
15
|
"adapters/sandbox/daytona/index": "src/adapters/sandbox/daytona/index.ts",
|
|
16
|
+
"adapters/sandbox/daytona/workflow": "src/adapters/sandbox/daytona/proxy.ts",
|
|
12
17
|
"adapters/sandbox/virtual/index": "src/adapters/sandbox/virtual/index.ts",
|
|
18
|
+
"adapters/sandbox/virtual/workflow": "src/adapters/sandbox/virtual/proxy.ts",
|
|
13
19
|
},
|
|
14
20
|
format: ["esm", "cjs"],
|
|
15
21
|
dts: true,
|