zeitlich 0.2.28 → 0.2.30
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 +121 -13
- package/dist/{activities-3xj_fEJK.d.ts → activities-BeveyY9b.d.cts} +2 -3
- package/dist/{activities-BzYq6jf7.d.cts → activities-NT3rcw66.d.ts} +2 -3
- package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -1
- package/dist/adapters/sandbox/bedrock/index.d.cts +3 -3
- package/dist/adapters/sandbox/bedrock/index.d.ts +3 -3
- package/dist/adapters/sandbox/bedrock/index.js.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/daytona/index.cjs.map +1 -1
- package/dist/adapters/sandbox/daytona/index.d.cts +1 -1
- package/dist/adapters/sandbox/daytona/index.d.ts +1 -1
- package/dist/adapters/sandbox/daytona/index.js.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/e2b/index.cjs.map +1 -1
- package/dist/adapters/sandbox/e2b/index.d.cts +1 -1
- package/dist/adapters/sandbox/e2b/index.d.ts +1 -1
- package/dist/adapters/sandbox/e2b/index.js.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/inmemory/index.cjs.map +1 -1
- package/dist/adapters/sandbox/inmemory/index.d.cts +1 -1
- package/dist/adapters/sandbox/inmemory/index.d.ts +1 -1
- package/dist/adapters/sandbox/inmemory/index.js.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/thread/anthropic/index.cjs +0 -1
- package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
- package/dist/adapters/thread/anthropic/index.d.cts +6 -7
- package/dist/adapters/thread/anthropic/index.d.ts +6 -7
- package/dist/adapters/thread/anthropic/index.js +0 -1
- package/dist/adapters/thread/anthropic/index.js.map +1 -1
- package/dist/adapters/thread/anthropic/workflow.d.cts +5 -6
- package/dist/adapters/thread/anthropic/workflow.d.ts +5 -6
- package/dist/adapters/thread/google-genai/index.cjs +0 -1
- package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
- package/dist/adapters/thread/google-genai/index.d.cts +6 -7
- package/dist/adapters/thread/google-genai/index.d.ts +6 -7
- package/dist/adapters/thread/google-genai/index.js +0 -1
- package/dist/adapters/thread/google-genai/index.js.map +1 -1
- package/dist/adapters/thread/google-genai/workflow.d.cts +5 -6
- package/dist/adapters/thread/google-genai/workflow.d.ts +5 -6
- package/dist/adapters/thread/langchain/index.cjs +0 -1
- package/dist/adapters/thread/langchain/index.cjs.map +1 -1
- package/dist/adapters/thread/langchain/index.d.cts +6 -7
- package/dist/adapters/thread/langchain/index.d.ts +6 -7
- package/dist/adapters/thread/langchain/index.js +0 -1
- package/dist/adapters/thread/langchain/index.js.map +1 -1
- package/dist/adapters/thread/langchain/workflow.d.cts +5 -6
- package/dist/adapters/thread/langchain/workflow.d.ts +5 -6
- package/dist/index.cjs +558 -50
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +136 -22
- package/dist/index.d.ts +136 -22
- package/dist/index.js +554 -52
- package/dist/index.js.map +1 -1
- package/dist/{proxy-7e7v8ccg.d.ts → proxy-BgswT47M.d.ts} +1 -1
- package/dist/{proxy-CsB8r0RR.d.cts → proxy-OJihshQF.d.cts} +1 -1
- package/dist/{thread-manager-D8C5QvLi.d.ts → thread-manager-BS477gj8.d.ts} +1 -1
- package/dist/{thread-manager-DdVFl1IY.d.cts → thread-manager-DH0zv05W.d.cts} +1 -1
- package/dist/{thread-manager-B5qA4v7V.d.ts → thread-manager-iUplxEZt.d.ts} +1 -1
- package/dist/{thread-manager-DFJ3sKKU.d.cts → thread-manager-lfN0V-gH.d.cts} +1 -1
- package/dist/{types-ChAMwU3q.d.cts → types-AujBIMMn.d.cts} +5 -8
- package/dist/{types-ChAMwU3q.d.ts → types-AujBIMMn.d.ts} +5 -8
- package/dist/{types-BZ75HpYd.d.ts → types-CCIc7Eam.d.ts} +1 -1
- package/dist/types-D90Q5aOh.d.ts +1212 -0
- package/dist/{types-BdCdR41N.d.ts → types-DBk-C8zM.d.ts} +1 -1
- package/dist/{types-ZHs2v9Ap.d.cts → types-DUvEZSDe.d.cts} +1 -1
- package/dist/types-DVdT5ybA.d.cts +1212 -0
- package/dist/{types-HbjqzyJH.d.cts → types-DgIVPOa1.d.cts} +1 -1
- package/dist/workflow-Cj4DxGdM.d.cts +750 -0
- package/dist/workflow-CzrBdCcJ.d.ts +750 -0
- package/dist/workflow.cjs +194 -40
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +5 -579
- package/dist/workflow.d.ts +5 -579
- package/dist/workflow.js +193 -42
- package/dist/workflow.js.map +1 -1
- package/package.json +3 -23
- package/src/adapters/thread/anthropic/thread-manager.ts +6 -6
- package/src/adapters/thread/google-genai/thread-manager.ts +6 -6
- package/src/adapters/thread/langchain/thread-manager.ts +6 -6
- package/src/index.ts +8 -0
- package/src/lib/lifecycle.ts +8 -3
- package/src/lib/observability/hooks.ts +117 -0
- package/src/lib/observability/index.ts +13 -0
- package/src/lib/observability/sinks.ts +88 -0
- package/src/lib/sandbox/index.ts +2 -4
- package/src/lib/sandbox/manager.ts +131 -16
- package/src/lib/sandbox/sandbox.test.ts +136 -16
- package/src/lib/sandbox/types.ts +6 -5
- package/src/lib/session/session-edge-cases.integration.test.ts +1 -0
- package/src/lib/session/session.integration.test.ts +7 -39
- package/src/lib/session/session.ts +119 -42
- package/src/lib/session/types.ts +39 -9
- package/src/lib/state/manager.integration.test.ts +1 -0
- package/src/lib/state/types.ts +9 -6
- package/src/lib/subagent/handler.ts +35 -12
- package/src/lib/subagent/register.ts +11 -12
- package/src/lib/subagent/subagent.integration.test.ts +1 -0
- package/src/lib/tool-router/router-edge-cases.integration.test.ts +2 -0
- package/src/lib/tool-router/router.integration.test.ts +2 -0
- package/src/lib/tool-router/router.ts +24 -2
- package/src/lib/types.ts +2 -0
- package/src/{adapters/sandbox/virtual → lib/virtual-fs}/filesystem.ts +4 -4
- package/src/lib/virtual-fs/index.ts +18 -0
- package/src/lib/virtual-fs/manager.ts +48 -0
- package/src/lib/virtual-fs/proxy.ts +45 -0
- package/src/{adapters/sandbox/virtual → lib/virtual-fs}/types.ts +41 -37
- package/src/{adapters/sandbox/virtual/virtual-sandbox.test.ts → lib/virtual-fs/virtual-fs.test.ts} +15 -130
- package/src/lib/virtual-fs/with-virtual-fs.ts +94 -0
- package/src/tools/bash/bash.test.ts +2 -1
- package/src/workflow.ts +25 -8
- package/tsup.config.ts +0 -2
- package/dist/adapters/sandbox/virtual/index.cjs +0 -487
- package/dist/adapters/sandbox/virtual/index.cjs.map +0 -1
- package/dist/adapters/sandbox/virtual/index.d.cts +0 -90
- package/dist/adapters/sandbox/virtual/index.d.ts +0 -90
- package/dist/adapters/sandbox/virtual/index.js +0 -479
- package/dist/adapters/sandbox/virtual/index.js.map +0 -1
- package/dist/adapters/sandbox/virtual/workflow.cjs +0 -33
- package/dist/adapters/sandbox/virtual/workflow.cjs.map +0 -1
- package/dist/adapters/sandbox/virtual/workflow.d.cts +0 -28
- package/dist/adapters/sandbox/virtual/workflow.d.ts +0 -28
- package/dist/adapters/sandbox/virtual/workflow.js +0 -31
- package/dist/adapters/sandbox/virtual/workflow.js.map +0 -1
- package/dist/queries-DVnukByF.d.cts +0 -44
- package/dist/queries-kjlvsUfz.d.ts +0 -44
- package/dist/types-BclYm5Ic.d.cts +0 -581
- package/dist/types-BclYm5Ic.d.ts +0 -581
- package/dist/types-BgsAwN3L.d.cts +0 -125
- package/dist/types-BtqbM1bO.d.ts +0 -490
- package/dist/types-BuCEZ4dF.d.cts +0 -490
- package/dist/types-yU5AINiP.d.ts +0 -125
- package/src/adapters/sandbox/virtual/index.ts +0 -92
- package/src/adapters/sandbox/virtual/provider.ts +0 -121
- package/src/adapters/sandbox/virtual/proxy.ts +0 -53
- package/src/adapters/sandbox/virtual/with-virtual-sandbox.ts +0 -97
- package/src/lib/.env +0 -1
- package/src/tools/bash/.env +0 -1
- /package/src/{adapters/sandbox/virtual → lib/virtual-fs}/mutations.ts +0 -0
- /package/src/{adapters/sandbox/virtual → lib/virtual-fs}/queries.ts +0 -0
- /package/src/{adapters/sandbox/virtual → lib/virtual-fs}/tree.ts +0 -0
package/src/{adapters/sandbox/virtual/virtual-sandbox.test.ts → lib/virtual-fs/virtual-fs.test.ts}
RENAMED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { describe, expect, it, beforeEach } from "vitest";
|
|
2
2
|
import type { FileEntry, FileResolver } from "./types";
|
|
3
|
-
import {
|
|
4
|
-
import { createVirtualSandbox } from "./index";
|
|
3
|
+
import { VirtualFileSystem } from "./filesystem";
|
|
5
4
|
import { applyVirtualTreeMutations } from "./mutations";
|
|
6
|
-
import {
|
|
7
|
-
import { SandboxNotSupportedError } from "
|
|
5
|
+
import { createVirtualFsActivities } from "./manager";
|
|
6
|
+
import { SandboxNotSupportedError } from "../sandbox/types";
|
|
8
7
|
|
|
9
8
|
// ============================================================================
|
|
10
9
|
// Mock resolver
|
|
@@ -112,15 +111,15 @@ const sampleTree: FileEntry[] = [
|
|
|
112
111
|
const ctx: TestCtx = { projectId: "proj-42" };
|
|
113
112
|
|
|
114
113
|
// ============================================================================
|
|
115
|
-
//
|
|
114
|
+
// VirtualFileSystem
|
|
116
115
|
// ============================================================================
|
|
117
116
|
|
|
118
|
-
describe("
|
|
119
|
-
let fs:
|
|
117
|
+
describe("VirtualFileSystem", () => {
|
|
118
|
+
let fs: VirtualFileSystem<TestCtx>;
|
|
120
119
|
|
|
121
120
|
beforeEach(() => {
|
|
122
121
|
const { resolver } = createMockResolver();
|
|
123
|
-
fs = new
|
|
122
|
+
fs = new VirtualFileSystem(sampleTree, resolver, ctx);
|
|
124
123
|
});
|
|
125
124
|
|
|
126
125
|
// --- exists / stat ---
|
|
@@ -327,132 +326,18 @@ describe("VirtualSandboxFileSystem", () => {
|
|
|
327
326
|
});
|
|
328
327
|
|
|
329
328
|
// ============================================================================
|
|
330
|
-
//
|
|
329
|
+
// createVirtualFsActivities
|
|
331
330
|
// ============================================================================
|
|
332
331
|
|
|
333
|
-
describe("
|
|
334
|
-
it("creates
|
|
332
|
+
describe("createVirtualFsActivities", () => {
|
|
333
|
+
it("creates prefixed activity with resolveFileTree", async () => {
|
|
335
334
|
const { resolver } = createMockResolver();
|
|
336
|
-
const
|
|
337
|
-
expect(sandbox.capabilities.filesystem).toBe(true);
|
|
338
|
-
expect(sandbox.capabilities.execution).toBe(false);
|
|
339
|
-
expect(sandbox.capabilities.persistence).toBe(true);
|
|
340
|
-
});
|
|
341
|
-
|
|
342
|
-
it("exec throws SandboxNotSupportedError", async () => {
|
|
343
|
-
const { resolver } = createMockResolver();
|
|
344
|
-
const sandbox = createVirtualSandbox("test-id", sampleTree, resolver, ctx);
|
|
345
|
-
await expect(sandbox.exec("ls")).rejects.toThrow(SandboxNotSupportedError);
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
it("fs operations work through the sandbox", async () => {
|
|
349
|
-
const { resolver } = createMockResolver();
|
|
350
|
-
const sandbox = createVirtualSandbox("test-id", sampleTree, resolver, ctx);
|
|
351
|
-
const content = await sandbox.fs.readFile("/README.md");
|
|
352
|
-
expect(content).toBe("# README\nThis is a readme.");
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
it("getMutations is accessible", async () => {
|
|
356
|
-
const { resolver } = createMockResolver();
|
|
357
|
-
const sandbox = createVirtualSandbox("test-id", sampleTree, resolver, ctx);
|
|
358
|
-
await sandbox.fs.writeFile("/new.txt", "hi");
|
|
359
|
-
expect(sandbox.fs.getMutations()).toHaveLength(1);
|
|
360
|
-
});
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
// ============================================================================
|
|
364
|
-
// VirtualSandboxProvider
|
|
365
|
-
// ============================================================================
|
|
366
|
-
|
|
367
|
-
describe("VirtualSandboxProvider", () => {
|
|
368
|
-
it("create resolves entries and returns sandbox + stateUpdate", async () => {
|
|
369
|
-
const { resolver } = createMockResolver();
|
|
370
|
-
const provider = new VirtualSandboxProvider(resolver);
|
|
371
|
-
const { sandbox, stateUpdate } = await provider.create({
|
|
372
|
-
resolverContext: ctx,
|
|
373
|
-
});
|
|
374
|
-
expect(sandbox.capabilities.filesystem).toBe(true);
|
|
375
|
-
expect(sandbox.capabilities.execution).toBe(false);
|
|
376
|
-
const content = await sandbox.fs.readFile("/resolved/file-1.txt");
|
|
377
|
-
expect(content).toBe('console.log("hello");');
|
|
378
|
-
|
|
379
|
-
expect(stateUpdate).toBeDefined();
|
|
380
|
-
expect(stateUpdate?.resolverContext).toEqual(ctx);
|
|
381
|
-
expect(Array.isArray(stateUpdate?.fileTree)).toBe(true);
|
|
382
|
-
expect((stateUpdate?.fileTree as FileEntry[]).length).toBe(3);
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
it("create uses provided id as sandbox id", async () => {
|
|
386
|
-
const { resolver } = createMockResolver();
|
|
387
|
-
const provider = new VirtualSandboxProvider(resolver);
|
|
388
|
-
const { sandbox, stateUpdate } = await provider.create({
|
|
389
|
-
id: "my-sandbox",
|
|
390
|
-
resolverContext: ctx,
|
|
391
|
-
});
|
|
392
|
-
expect(sandbox.id).toBe("my-sandbox");
|
|
393
|
-
expect(stateUpdate?.sandboxId).toBe("my-sandbox");
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
it("get throws (state lives in workflow)", async () => {
|
|
397
|
-
const { resolver } = createMockResolver();
|
|
398
|
-
const provider = new VirtualSandboxProvider(resolver);
|
|
399
|
-
await expect(provider.get()).rejects.toThrow("Sandbox does not support");
|
|
400
|
-
});
|
|
401
|
-
|
|
402
|
-
it("snapshot throws (state lives in workflow)", async () => {
|
|
403
|
-
const { resolver } = createMockResolver();
|
|
404
|
-
const provider = new VirtualSandboxProvider(resolver);
|
|
405
|
-
await expect(provider.snapshot()).rejects.toThrow(
|
|
406
|
-
"Sandbox does not support",
|
|
407
|
-
);
|
|
408
|
-
});
|
|
409
|
-
|
|
410
|
-
it("restore throws (state lives in workflow)", async () => {
|
|
411
|
-
const { resolver } = createMockResolver();
|
|
412
|
-
const provider = new VirtualSandboxProvider(resolver);
|
|
413
|
-
await expect(provider.restore()).rejects.toThrow(
|
|
414
|
-
"Sandbox does not support",
|
|
415
|
-
);
|
|
416
|
-
});
|
|
417
|
-
|
|
418
|
-
it("destroy is a no-op", async () => {
|
|
419
|
-
const { resolver } = createMockResolver();
|
|
420
|
-
const provider = new VirtualSandboxProvider(resolver);
|
|
421
|
-
await expect(provider.destroy()).resolves.not.toThrow();
|
|
422
|
-
});
|
|
423
|
-
|
|
424
|
-
it("create throws without required options", async () => {
|
|
425
|
-
const { resolver } = createMockResolver();
|
|
426
|
-
const provider = new VirtualSandboxProvider(resolver);
|
|
427
|
-
await expect(provider.create()).rejects.toThrow(
|
|
428
|
-
"requires resolverContext",
|
|
429
|
-
);
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
it("create seeds initialFiles via writeFile into sandbox and fileTree", async () => {
|
|
433
|
-
const { resolver } = createMockResolver();
|
|
434
|
-
const provider = new VirtualSandboxProvider(resolver);
|
|
435
|
-
const { sandbox, stateUpdate } = await provider.create({
|
|
436
|
-
resolverContext: ctx,
|
|
437
|
-
initialFiles: {
|
|
438
|
-
"/skills/my-skill/SKILL.md": "---\nname: my-skill\n---\nDo things.",
|
|
439
|
-
"/skills/my-skill/references/guide.md": "# Guide\nStep 1...",
|
|
440
|
-
},
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
expect(await sandbox.fs.readFile("/skills/my-skill/SKILL.md")).toBe(
|
|
444
|
-
"---\nname: my-skill\n---\nDo things.",
|
|
445
|
-
);
|
|
446
|
-
expect(await sandbox.fs.readFile("/skills/my-skill/references/guide.md")).toBe(
|
|
447
|
-
"# Guide\nStep 1...",
|
|
448
|
-
);
|
|
449
|
-
expect(await sandbox.fs.exists("/skills/my-skill")).toBe(true);
|
|
450
|
-
expect(await sandbox.fs.exists("/skills/my-skill/references")).toBe(true);
|
|
335
|
+
const activities = createVirtualFsActivities(resolver, "codingAgent");
|
|
451
336
|
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
expect(
|
|
455
|
-
expect(
|
|
337
|
+
expect(activities).toHaveProperty("codingAgentResolveFileTree");
|
|
338
|
+
const result = await activities.codingAgentResolveFileTree(ctx);
|
|
339
|
+
expect(result.fileTree).toHaveLength(3);
|
|
340
|
+
expect(result.fileTree[0]?.path).toMatch(/^\/resolved\//);
|
|
456
341
|
});
|
|
457
342
|
});
|
|
458
343
|
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { WorkflowClient } from "@temporalio/client";
|
|
2
|
+
import { queryParentWorkflowState } from "../activity";
|
|
3
|
+
import type { JsonValue } from "../state/types";
|
|
4
|
+
import type { ActivityToolHandler, RouterContext } from "../tool-router/types";
|
|
5
|
+
import type {
|
|
6
|
+
FileEntryMetadata,
|
|
7
|
+
FileResolver,
|
|
8
|
+
TreeMutation,
|
|
9
|
+
VirtualFsContext,
|
|
10
|
+
VirtualFsState,
|
|
11
|
+
} from "./types";
|
|
12
|
+
import { VirtualFileSystem } from "./filesystem";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Wraps a tool handler that needs a virtual filesystem, automatically querying
|
|
16
|
+
* the parent workflow for the current file tree and resolver context.
|
|
17
|
+
*
|
|
18
|
+
* On each invocation the wrapper:
|
|
19
|
+
* 1. Queries the workflow's `AgentState` for `fileTree`, `ctx`, and `workspaceBase`
|
|
20
|
+
* 2. Creates an ephemeral {@link VirtualFileSystem} from tree + resolver
|
|
21
|
+
* 3. Runs the inner handler
|
|
22
|
+
* 4. Returns the handler's result together with any {@link TreeMutation}s
|
|
23
|
+
*
|
|
24
|
+
* The consumer applies mutations back to workflow state via a post-tool hook.
|
|
25
|
+
*
|
|
26
|
+
* @param client - Temporal `WorkflowClient` for querying the parent workflow
|
|
27
|
+
* @param resolver - {@link FileResolver} bridging to the consumer's data layer
|
|
28
|
+
* @param handler - Inner handler expecting a {@link VirtualFsContext}
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import { withVirtualFs, type VirtualFsContext } from 'zeitlich';
|
|
33
|
+
*
|
|
34
|
+
* const readHandler: ActivityToolHandler<FileReadArgs, ReadResult, VirtualFsContext> =
|
|
35
|
+
* async (args, { virtualFs }) => {
|
|
36
|
+
* const content = await virtualFs.readFile(args.path);
|
|
37
|
+
* return { toolResponse: content, data: { path: args.path, content } };
|
|
38
|
+
* };
|
|
39
|
+
*
|
|
40
|
+
* // At activity registration:
|
|
41
|
+
* const handler = withVirtualFs(client, resolver, readHandler);
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function withVirtualFs<
|
|
45
|
+
TArgs,
|
|
46
|
+
TResult,
|
|
47
|
+
TCtx,
|
|
48
|
+
TMeta = FileEntryMetadata,
|
|
49
|
+
TToolResponse = JsonValue,
|
|
50
|
+
>(
|
|
51
|
+
client: WorkflowClient,
|
|
52
|
+
resolver: FileResolver<TCtx, TMeta>,
|
|
53
|
+
handler: ActivityToolHandler<
|
|
54
|
+
TArgs,
|
|
55
|
+
TResult,
|
|
56
|
+
VirtualFsContext<TCtx, TMeta>,
|
|
57
|
+
TToolResponse
|
|
58
|
+
>
|
|
59
|
+
): ActivityToolHandler<
|
|
60
|
+
TArgs,
|
|
61
|
+
(TResult & { treeMutations: TreeMutation<TMeta>[] }) | null,
|
|
62
|
+
RouterContext,
|
|
63
|
+
TToolResponse | string
|
|
64
|
+
> {
|
|
65
|
+
return async (args, context) => {
|
|
66
|
+
const state =
|
|
67
|
+
await queryParentWorkflowState<VirtualFsState<TCtx, TMeta>>(client);
|
|
68
|
+
|
|
69
|
+
const { fileTree, ctx, workspaceBase } = state;
|
|
70
|
+
if (!fileTree) {
|
|
71
|
+
return {
|
|
72
|
+
toolResponse: `Error: No fileTree in agent state. The ${context.toolName} tool requires a virtual filesystem.`,
|
|
73
|
+
data: null,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const virtualFs = new VirtualFileSystem(
|
|
78
|
+
fileTree,
|
|
79
|
+
resolver,
|
|
80
|
+
ctx,
|
|
81
|
+
workspaceBase ?? "/"
|
|
82
|
+
);
|
|
83
|
+
const response = await handler(args, { ...context, virtualFs });
|
|
84
|
+
const mutations = virtualFs.getMutations();
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
toolResponse: response.toolResponse,
|
|
88
|
+
data: {
|
|
89
|
+
...(response.data ?? {}),
|
|
90
|
+
treeMutations: mutations,
|
|
91
|
+
} as TResult & { treeMutations: TreeMutation<TMeta>[] },
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -21,7 +21,8 @@ describe("bash handler with sandbox", () => {
|
|
|
21
21
|
const result = await manager.create({
|
|
22
22
|
initialFiles: { "/home/user/hello.txt": "world" },
|
|
23
23
|
});
|
|
24
|
-
|
|
24
|
+
expect(result).not.toBeNull();
|
|
25
|
+
sandboxId = (result as NonNullable<typeof result>).sandboxId;
|
|
25
26
|
handler = withSandbox(manager, bashHandler);
|
|
26
27
|
});
|
|
27
28
|
|
package/src/workflow.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* // In your workflow file
|
|
10
10
|
* import { createSession, defineWorkflow, defineTool, bashTool } from 'zeitlich/workflow';
|
|
11
11
|
* import { proxyLangChainThreadOps } from 'zeitlich/adapters/thread/langchain/workflow';
|
|
12
|
-
* import {
|
|
12
|
+
* import { proxyVirtualFsOps } from 'zeitlich/workflow';
|
|
13
13
|
* ```
|
|
14
14
|
*/
|
|
15
15
|
|
|
@@ -93,6 +93,20 @@ export type {
|
|
|
93
93
|
PostHumanMessageAppendHookContext,
|
|
94
94
|
} from "./lib/hooks";
|
|
95
95
|
|
|
96
|
+
// Observability
|
|
97
|
+
export {
|
|
98
|
+
createObservabilityHooks,
|
|
99
|
+
composeHooks,
|
|
100
|
+
} from "./lib/observability";
|
|
101
|
+
export type {
|
|
102
|
+
ObservabilityHooks,
|
|
103
|
+
ZeitlichObservabilitySinks,
|
|
104
|
+
SessionStartedEvent,
|
|
105
|
+
SessionEndedEvent,
|
|
106
|
+
TurnCompletedEvent,
|
|
107
|
+
ToolExecutedEvent,
|
|
108
|
+
} from "./lib/observability";
|
|
109
|
+
|
|
96
110
|
// Core types
|
|
97
111
|
export type {
|
|
98
112
|
TokenUsage,
|
|
@@ -152,24 +166,27 @@ export {
|
|
|
152
166
|
SandboxNotSupportedError,
|
|
153
167
|
} from "./lib/sandbox/types";
|
|
154
168
|
|
|
155
|
-
// Virtual
|
|
156
|
-
// pulling activity-side code like
|
|
157
|
-
export { applyVirtualTreeMutations } from "./
|
|
158
|
-
export { formatVirtualFileTree } from "./
|
|
169
|
+
// Virtual filesystem (workflow-safe — imported from leaf modules to avoid
|
|
170
|
+
// pulling activity-side code like VirtualFileSystem).
|
|
171
|
+
export { applyVirtualTreeMutations } from "./lib/virtual-fs/mutations";
|
|
172
|
+
export { formatVirtualFileTree } from "./lib/virtual-fs/tree";
|
|
159
173
|
export {
|
|
160
174
|
hasFileWithMimeType,
|
|
161
175
|
filesWithMimeType,
|
|
162
176
|
hasDirectory,
|
|
163
|
-
} from "./
|
|
177
|
+
} from "./lib/virtual-fs/queries";
|
|
178
|
+
export { proxyVirtualFsOps } from "./lib/virtual-fs/proxy";
|
|
164
179
|
|
|
165
180
|
export type {
|
|
166
181
|
FileEntry,
|
|
167
182
|
FileEntryMetadata,
|
|
168
183
|
FileResolver,
|
|
169
184
|
VirtualFileTree,
|
|
170
|
-
|
|
185
|
+
VirtualFsOps,
|
|
186
|
+
PrefixedVirtualFsOps,
|
|
187
|
+
VirtualFsState,
|
|
171
188
|
TreeMutation,
|
|
172
|
-
} from "./
|
|
189
|
+
} from "./lib/virtual-fs/types";
|
|
173
190
|
|
|
174
191
|
// Subagent support
|
|
175
192
|
export type { SubagentArgs } from "./lib/subagent";
|
package/tsup.config.ts
CHANGED
|
@@ -18,8 +18,6 @@ export default defineConfig({
|
|
|
18
18
|
"adapters/sandbox/inmemory/workflow": "src/adapters/sandbox/inmemory/proxy.ts",
|
|
19
19
|
"adapters/sandbox/daytona/index": "src/adapters/sandbox/daytona/index.ts",
|
|
20
20
|
"adapters/sandbox/daytona/workflow": "src/adapters/sandbox/daytona/proxy.ts",
|
|
21
|
-
"adapters/sandbox/virtual/index": "src/adapters/sandbox/virtual/index.ts",
|
|
22
|
-
"adapters/sandbox/virtual/workflow": "src/adapters/sandbox/virtual/proxy.ts",
|
|
23
21
|
"adapters/sandbox/e2b/index": "src/adapters/sandbox/e2b/index.ts",
|
|
24
22
|
"adapters/sandbox/e2b/workflow": "src/adapters/sandbox/e2b/proxy.ts",
|
|
25
23
|
"adapters/sandbox/bedrock/index": "src/adapters/sandbox/bedrock/index.ts",
|