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.
Files changed (144) hide show
  1. package/README.md +121 -13
  2. package/dist/{activities-3xj_fEJK.d.ts → activities-BeveyY9b.d.cts} +2 -3
  3. package/dist/{activities-BzYq6jf7.d.cts → activities-NT3rcw66.d.ts} +2 -3
  4. package/dist/adapters/sandbox/bedrock/index.cjs.map +1 -1
  5. package/dist/adapters/sandbox/bedrock/index.d.cts +3 -3
  6. package/dist/adapters/sandbox/bedrock/index.d.ts +3 -3
  7. package/dist/adapters/sandbox/bedrock/index.js.map +1 -1
  8. package/dist/adapters/sandbox/bedrock/workflow.d.cts +2 -2
  9. package/dist/adapters/sandbox/bedrock/workflow.d.ts +2 -2
  10. package/dist/adapters/sandbox/daytona/index.cjs.map +1 -1
  11. package/dist/adapters/sandbox/daytona/index.d.cts +1 -1
  12. package/dist/adapters/sandbox/daytona/index.d.ts +1 -1
  13. package/dist/adapters/sandbox/daytona/index.js.map +1 -1
  14. package/dist/adapters/sandbox/daytona/workflow.d.cts +1 -1
  15. package/dist/adapters/sandbox/daytona/workflow.d.ts +1 -1
  16. package/dist/adapters/sandbox/e2b/index.cjs.map +1 -1
  17. package/dist/adapters/sandbox/e2b/index.d.cts +1 -1
  18. package/dist/adapters/sandbox/e2b/index.d.ts +1 -1
  19. package/dist/adapters/sandbox/e2b/index.js.map +1 -1
  20. package/dist/adapters/sandbox/e2b/workflow.d.cts +1 -1
  21. package/dist/adapters/sandbox/e2b/workflow.d.ts +1 -1
  22. package/dist/adapters/sandbox/inmemory/index.cjs.map +1 -1
  23. package/dist/adapters/sandbox/inmemory/index.d.cts +1 -1
  24. package/dist/adapters/sandbox/inmemory/index.d.ts +1 -1
  25. package/dist/adapters/sandbox/inmemory/index.js.map +1 -1
  26. package/dist/adapters/sandbox/inmemory/workflow.d.cts +1 -1
  27. package/dist/adapters/sandbox/inmemory/workflow.d.ts +1 -1
  28. package/dist/adapters/thread/anthropic/index.cjs +0 -1
  29. package/dist/adapters/thread/anthropic/index.cjs.map +1 -1
  30. package/dist/adapters/thread/anthropic/index.d.cts +6 -7
  31. package/dist/adapters/thread/anthropic/index.d.ts +6 -7
  32. package/dist/adapters/thread/anthropic/index.js +0 -1
  33. package/dist/adapters/thread/anthropic/index.js.map +1 -1
  34. package/dist/adapters/thread/anthropic/workflow.d.cts +5 -6
  35. package/dist/adapters/thread/anthropic/workflow.d.ts +5 -6
  36. package/dist/adapters/thread/google-genai/index.cjs +0 -1
  37. package/dist/adapters/thread/google-genai/index.cjs.map +1 -1
  38. package/dist/adapters/thread/google-genai/index.d.cts +6 -7
  39. package/dist/adapters/thread/google-genai/index.d.ts +6 -7
  40. package/dist/adapters/thread/google-genai/index.js +0 -1
  41. package/dist/adapters/thread/google-genai/index.js.map +1 -1
  42. package/dist/adapters/thread/google-genai/workflow.d.cts +5 -6
  43. package/dist/adapters/thread/google-genai/workflow.d.ts +5 -6
  44. package/dist/adapters/thread/langchain/index.cjs +0 -1
  45. package/dist/adapters/thread/langchain/index.cjs.map +1 -1
  46. package/dist/adapters/thread/langchain/index.d.cts +6 -7
  47. package/dist/adapters/thread/langchain/index.d.ts +6 -7
  48. package/dist/adapters/thread/langchain/index.js +0 -1
  49. package/dist/adapters/thread/langchain/index.js.map +1 -1
  50. package/dist/adapters/thread/langchain/workflow.d.cts +5 -6
  51. package/dist/adapters/thread/langchain/workflow.d.ts +5 -6
  52. package/dist/index.cjs +558 -50
  53. package/dist/index.cjs.map +1 -1
  54. package/dist/index.d.cts +136 -22
  55. package/dist/index.d.ts +136 -22
  56. package/dist/index.js +554 -52
  57. package/dist/index.js.map +1 -1
  58. package/dist/{proxy-7e7v8ccg.d.ts → proxy-BgswT47M.d.ts} +1 -1
  59. package/dist/{proxy-CsB8r0RR.d.cts → proxy-OJihshQF.d.cts} +1 -1
  60. package/dist/{thread-manager-D8C5QvLi.d.ts → thread-manager-BS477gj8.d.ts} +1 -1
  61. package/dist/{thread-manager-DdVFl1IY.d.cts → thread-manager-DH0zv05W.d.cts} +1 -1
  62. package/dist/{thread-manager-B5qA4v7V.d.ts → thread-manager-iUplxEZt.d.ts} +1 -1
  63. package/dist/{thread-manager-DFJ3sKKU.d.cts → thread-manager-lfN0V-gH.d.cts} +1 -1
  64. package/dist/{types-ChAMwU3q.d.cts → types-AujBIMMn.d.cts} +5 -8
  65. package/dist/{types-ChAMwU3q.d.ts → types-AujBIMMn.d.ts} +5 -8
  66. package/dist/{types-BZ75HpYd.d.ts → types-CCIc7Eam.d.ts} +1 -1
  67. package/dist/types-D90Q5aOh.d.ts +1212 -0
  68. package/dist/{types-BdCdR41N.d.ts → types-DBk-C8zM.d.ts} +1 -1
  69. package/dist/{types-ZHs2v9Ap.d.cts → types-DUvEZSDe.d.cts} +1 -1
  70. package/dist/types-DVdT5ybA.d.cts +1212 -0
  71. package/dist/{types-HbjqzyJH.d.cts → types-DgIVPOa1.d.cts} +1 -1
  72. package/dist/workflow-Cj4DxGdM.d.cts +750 -0
  73. package/dist/workflow-CzrBdCcJ.d.ts +750 -0
  74. package/dist/workflow.cjs +194 -40
  75. package/dist/workflow.cjs.map +1 -1
  76. package/dist/workflow.d.cts +5 -579
  77. package/dist/workflow.d.ts +5 -579
  78. package/dist/workflow.js +193 -42
  79. package/dist/workflow.js.map +1 -1
  80. package/package.json +3 -23
  81. package/src/adapters/thread/anthropic/thread-manager.ts +6 -6
  82. package/src/adapters/thread/google-genai/thread-manager.ts +6 -6
  83. package/src/adapters/thread/langchain/thread-manager.ts +6 -6
  84. package/src/index.ts +8 -0
  85. package/src/lib/lifecycle.ts +8 -3
  86. package/src/lib/observability/hooks.ts +117 -0
  87. package/src/lib/observability/index.ts +13 -0
  88. package/src/lib/observability/sinks.ts +88 -0
  89. package/src/lib/sandbox/index.ts +2 -4
  90. package/src/lib/sandbox/manager.ts +131 -16
  91. package/src/lib/sandbox/sandbox.test.ts +136 -16
  92. package/src/lib/sandbox/types.ts +6 -5
  93. package/src/lib/session/session-edge-cases.integration.test.ts +1 -0
  94. package/src/lib/session/session.integration.test.ts +7 -39
  95. package/src/lib/session/session.ts +119 -42
  96. package/src/lib/session/types.ts +39 -9
  97. package/src/lib/state/manager.integration.test.ts +1 -0
  98. package/src/lib/state/types.ts +9 -6
  99. package/src/lib/subagent/handler.ts +35 -12
  100. package/src/lib/subagent/register.ts +11 -12
  101. package/src/lib/subagent/subagent.integration.test.ts +1 -0
  102. package/src/lib/tool-router/router-edge-cases.integration.test.ts +2 -0
  103. package/src/lib/tool-router/router.integration.test.ts +2 -0
  104. package/src/lib/tool-router/router.ts +24 -2
  105. package/src/lib/types.ts +2 -0
  106. package/src/{adapters/sandbox/virtual → lib/virtual-fs}/filesystem.ts +4 -4
  107. package/src/lib/virtual-fs/index.ts +18 -0
  108. package/src/lib/virtual-fs/manager.ts +48 -0
  109. package/src/lib/virtual-fs/proxy.ts +45 -0
  110. package/src/{adapters/sandbox/virtual → lib/virtual-fs}/types.ts +41 -37
  111. package/src/{adapters/sandbox/virtual/virtual-sandbox.test.ts → lib/virtual-fs/virtual-fs.test.ts} +15 -130
  112. package/src/lib/virtual-fs/with-virtual-fs.ts +94 -0
  113. package/src/tools/bash/bash.test.ts +2 -1
  114. package/src/workflow.ts +25 -8
  115. package/tsup.config.ts +0 -2
  116. package/dist/adapters/sandbox/virtual/index.cjs +0 -487
  117. package/dist/adapters/sandbox/virtual/index.cjs.map +0 -1
  118. package/dist/adapters/sandbox/virtual/index.d.cts +0 -90
  119. package/dist/adapters/sandbox/virtual/index.d.ts +0 -90
  120. package/dist/adapters/sandbox/virtual/index.js +0 -479
  121. package/dist/adapters/sandbox/virtual/index.js.map +0 -1
  122. package/dist/adapters/sandbox/virtual/workflow.cjs +0 -33
  123. package/dist/adapters/sandbox/virtual/workflow.cjs.map +0 -1
  124. package/dist/adapters/sandbox/virtual/workflow.d.cts +0 -28
  125. package/dist/adapters/sandbox/virtual/workflow.d.ts +0 -28
  126. package/dist/adapters/sandbox/virtual/workflow.js +0 -31
  127. package/dist/adapters/sandbox/virtual/workflow.js.map +0 -1
  128. package/dist/queries-DVnukByF.d.cts +0 -44
  129. package/dist/queries-kjlvsUfz.d.ts +0 -44
  130. package/dist/types-BclYm5Ic.d.cts +0 -581
  131. package/dist/types-BclYm5Ic.d.ts +0 -581
  132. package/dist/types-BgsAwN3L.d.cts +0 -125
  133. package/dist/types-BtqbM1bO.d.ts +0 -490
  134. package/dist/types-BuCEZ4dF.d.cts +0 -490
  135. package/dist/types-yU5AINiP.d.ts +0 -125
  136. package/src/adapters/sandbox/virtual/index.ts +0 -92
  137. package/src/adapters/sandbox/virtual/provider.ts +0 -121
  138. package/src/adapters/sandbox/virtual/proxy.ts +0 -53
  139. package/src/adapters/sandbox/virtual/with-virtual-sandbox.ts +0 -97
  140. package/src/lib/.env +0 -1
  141. package/src/tools/bash/.env +0 -1
  142. /package/src/{adapters/sandbox/virtual → lib/virtual-fs}/mutations.ts +0 -0
  143. /package/src/{adapters/sandbox/virtual → lib/virtual-fs}/queries.ts +0 -0
  144. /package/src/{adapters/sandbox/virtual → lib/virtual-fs}/tree.ts +0 -0
@@ -1,10 +1,9 @@
1
1
  import { describe, expect, it, beforeEach } from "vitest";
2
2
  import type { FileEntry, FileResolver } from "./types";
3
- import { VirtualSandboxFileSystem } from "./filesystem";
4
- import { createVirtualSandbox } from "./index";
3
+ import { VirtualFileSystem } from "./filesystem";
5
4
  import { applyVirtualTreeMutations } from "./mutations";
6
- import { VirtualSandboxProvider } from "./provider";
7
- import { SandboxNotSupportedError } from "../../../lib/sandbox/types";
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
- // VirtualSandboxFileSystem
114
+ // VirtualFileSystem
116
115
  // ============================================================================
117
116
 
118
- describe("VirtualSandboxFileSystem", () => {
119
- let fs: VirtualSandboxFileSystem<TestCtx>;
117
+ describe("VirtualFileSystem", () => {
118
+ let fs: VirtualFileSystem<TestCtx>;
120
119
 
121
120
  beforeEach(() => {
122
121
  const { resolver } = createMockResolver();
123
- fs = new VirtualSandboxFileSystem(sampleTree, resolver, ctx);
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
- // createVirtualSandbox
329
+ // createVirtualFsActivities
331
330
  // ============================================================================
332
331
 
333
- describe("createVirtualSandbox", () => {
334
- it("creates a sandbox with correct capabilities", () => {
332
+ describe("createVirtualFsActivities", () => {
333
+ it("creates prefixed activity with resolveFileTree", async () => {
335
334
  const { resolver } = createMockResolver();
336
- const sandbox = createVirtualSandbox("test-id", sampleTree, resolver, ctx);
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
- const tree = stateUpdate?.fileTree as FileEntry[];
453
- expect(tree.find((e) => e.path === "/skills/my-skill/SKILL.md")).toBeDefined();
454
- expect(tree.find((e) => e.path === "/skills/my-skill/references/guide.md")).toBeDefined();
455
- expect(stateUpdate).not.toHaveProperty("localFiles");
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
- sandboxId = result.sandboxId;
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 { proxyVirtualSandboxOps } from 'zeitlich/adapters/sandbox/virtual/workflow';
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 sandbox (workflow-safe — imported from leaf modules to avoid
156
- // pulling activity-side code like VirtualSandboxFileSystem / Provider).
157
- export { applyVirtualTreeMutations } from "./adapters/sandbox/virtual/mutations";
158
- export { formatVirtualFileTree } from "./adapters/sandbox/virtual/tree";
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 "./adapters/sandbox/virtual/queries";
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
- VirtualSandboxState,
185
+ VirtualFsOps,
186
+ PrefixedVirtualFsOps,
187
+ VirtualFsState,
171
188
  TreeMutation,
172
- } from "./adapters/sandbox/virtual/types";
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",