@n8n/agents 0.20.3 → 0.21.1

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 (91) hide show
  1. package/dist/build.tsbuildinfo +1 -1
  2. package/dist/index.d.ts +2 -2
  3. package/dist/index.js +4 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/runtime/loop/agent-runtime.d.ts +2 -0
  6. package/dist/runtime/loop/agent-runtime.js +26 -2
  7. package/dist/runtime/loop/agent-runtime.js.map +1 -1
  8. package/dist/runtime/loop/generate-sink.js +1 -0
  9. package/dist/runtime/loop/generate-sink.js.map +1 -1
  10. package/dist/runtime/loop/run-output-sink.d.ts +1 -0
  11. package/dist/runtime/loop/runtime-context.d.ts +1 -0
  12. package/dist/runtime/loop/runtime-context.js +1 -0
  13. package/dist/runtime/loop/runtime-context.js.map +1 -1
  14. package/dist/runtime/loop/runtime-helpers.d.ts +1 -0
  15. package/dist/runtime/loop/runtime-helpers.js +12 -7
  16. package/dist/runtime/loop/runtime-helpers.js.map +1 -1
  17. package/dist/runtime/loop/stream-sink.js +1 -0
  18. package/dist/runtime/loop/stream-sink.js.map +1 -1
  19. package/dist/runtime/mcp/mcp-connection.js +4 -1
  20. package/dist/runtime/mcp/mcp-connection.js.map +1 -1
  21. package/dist/runtime/memory/memory-orchestrator.js +3 -2
  22. package/dist/runtime/memory/memory-orchestrator.js.map +1 -1
  23. package/dist/runtime/model/model-factory.js +68 -23
  24. package/dist/runtime/model/model-factory.js.map +1 -1
  25. package/dist/runtime/model/prompt-cache.d.ts +1 -0
  26. package/dist/runtime/model/prompt-cache.js +8 -4
  27. package/dist/runtime/model/prompt-cache.js.map +1 -1
  28. package/dist/runtime/model/provider-credentials.d.ts +35 -0
  29. package/dist/runtime/model/provider-credentials.js +9 -0
  30. package/dist/runtime/model/provider-credentials.js.map +1 -1
  31. package/dist/runtime/model/provider-quirks.d.ts +3 -0
  32. package/dist/runtime/model/provider-quirks.js +50 -20
  33. package/dist/runtime/model/provider-quirks.js.map +1 -1
  34. package/dist/runtime/model/raw-usage.js +1 -0
  35. package/dist/runtime/model/raw-usage.js.map +1 -1
  36. package/dist/runtime/state/run-state.js +1 -6
  37. package/dist/runtime/state/run-state.js.map +1 -1
  38. package/dist/runtime/tools/delegate-sub-agent-tool.d.ts +2 -1
  39. package/dist/runtime/tools/delegate-sub-agent-tool.js +3 -0
  40. package/dist/runtime/tools/delegate-sub-agent-tool.js.map +1 -1
  41. package/dist/runtime/tools/tool-call-executor.d.ts +3 -0
  42. package/dist/runtime/tools/tool-call-executor.js +16 -4
  43. package/dist/runtime/tools/tool-call-executor.js.map +1 -1
  44. package/dist/runtime/tools/tool-result-guard.d.ts +16 -4
  45. package/dist/runtime/tools/tool-result-guard.js +94 -15
  46. package/dist/runtime/tools/tool-result-guard.js.map +1 -1
  47. package/dist/sdk/agent.js +3 -0
  48. package/dist/sdk/agent.js.map +1 -1
  49. package/dist/sdk/catalog.js +1 -0
  50. package/dist/sdk/catalog.js.map +1 -1
  51. package/dist/sdk/guardrails/redactor.d.ts +1 -0
  52. package/dist/sdk/guardrails/redactor.js +14 -3
  53. package/dist/sdk/guardrails/redactor.js.map +1 -1
  54. package/dist/types/index.d.ts +1 -1
  55. package/dist/types/index.js.map +1 -1
  56. package/dist/types/sdk/agent.d.ts +3 -1
  57. package/dist/types/sdk/provider.d.ts +8 -5
  58. package/dist/types/sdk/tool.d.ts +2 -1
  59. package/dist/workspace/filesystem/n8n-sandbox-filesystem.d.ts +1 -1
  60. package/dist/workspace/filesystem/n8n-sandbox-filesystem.js +1 -1
  61. package/dist/workspace/filesystem/n8n-sandbox-filesystem.js.map +1 -1
  62. package/dist/workspace/index.d.ts +3 -1
  63. package/dist/workspace/index.js +8 -1
  64. package/dist/workspace/index.js.map +1 -1
  65. package/dist/workspace/sandbox/n8n-sandbox-sandbox.d.ts +2 -0
  66. package/dist/workspace/sandbox/n8n-sandbox-sandbox.js +21 -2
  67. package/dist/workspace/sandbox/n8n-sandbox-sandbox.js.map +1 -1
  68. package/dist/workspace/sandbox/workspace-root.d.ts +1 -0
  69. package/dist/workspace/sandbox/workspace-root.js +9 -12
  70. package/dist/workspace/sandbox/workspace-root.js.map +1 -1
  71. package/dist/workspace/scoped-workspace.d.ts +2 -0
  72. package/dist/workspace/scoped-workspace.js +135 -0
  73. package/dist/workspace/scoped-workspace.js.map +1 -0
  74. package/dist/workspace/tool-result-storage.d.ts +12 -0
  75. package/dist/workspace/tool-result-storage.js +89 -0
  76. package/dist/workspace/tool-result-storage.js.map +1 -0
  77. package/dist/workspace/tools/execute-command.js +0 -2
  78. package/dist/workspace/tools/execute-command.js.map +1 -1
  79. package/dist/workspace/tools/{batch-str-replace-file.d.ts → read-tool-result.d.ts} +1 -1
  80. package/dist/workspace/tools/read-tool-result.js +321 -0
  81. package/dist/workspace/tools/read-tool-result.js.map +1 -0
  82. package/dist/workspace/tools/str-replace-file.js +28 -11
  83. package/dist/workspace/tools/str-replace-file.js.map +1 -1
  84. package/dist/workspace/tools/workspace-tools.d.ts +1 -0
  85. package/dist/workspace/tools/workspace-tools.js +10 -2
  86. package/dist/workspace/tools/workspace-tools.js.map +1 -1
  87. package/dist/workspace/types.d.ts +0 -1
  88. package/dist/workspace/types.js.map +1 -1
  89. package/package.json +12 -11
  90. package/dist/workspace/tools/batch-str-replace-file.js +0 -76
  91. package/dist/workspace/tools/batch-str-replace-file.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import { Workspace } from './workspace';
2
+ export declare function createScopedWorkspace(workspace: Workspace, root: string, env?: NodeJS.ProcessEnv): Workspace;
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createScopedWorkspace = createScopedWorkspace;
4
+ const posix_1 = require("node:path/posix");
5
+ const workspace_1 = require("./workspace");
6
+ function isInsideRoot(path, root) {
7
+ const boundary = root.endsWith('/') ? root : `${root}/`;
8
+ return path === root || path.startsWith(boundary);
9
+ }
10
+ function resolvePath(root, path) {
11
+ const normalizedRoot = (0, posix_1.normalize)(root);
12
+ const normalizedPath = path.startsWith('/')
13
+ ? (0, posix_1.normalize)(path)
14
+ : (0, posix_1.normalize)((0, posix_1.join)(normalizedRoot, path));
15
+ if (!isInsideRoot(normalizedPath, normalizedRoot)) {
16
+ throw new Error(`Path escapes workspace root: ${path}`);
17
+ }
18
+ return normalizedPath;
19
+ }
20
+ class ScopedFilesystem {
21
+ constructor(filesystem, root) {
22
+ this.filesystem = filesystem;
23
+ this.root = root;
24
+ }
25
+ get id() {
26
+ return `${this.filesystem.id}:scoped`;
27
+ }
28
+ get name() {
29
+ return `${this.filesystem.name} (scoped)`;
30
+ }
31
+ get provider() {
32
+ return this.filesystem.provider;
33
+ }
34
+ get status() {
35
+ return this.filesystem.status;
36
+ }
37
+ set status(status) {
38
+ this.filesystem.status = status;
39
+ }
40
+ get readOnly() {
41
+ return this.filesystem.readOnly;
42
+ }
43
+ get basePath() {
44
+ return this.root;
45
+ }
46
+ getInstructions() {
47
+ const base = this.filesystem.getInstructions?.() ?? '';
48
+ return [base, `Filesystem access is scoped to ${this.root}.`].filter(Boolean).join('\n');
49
+ }
50
+ async readFile(path, options) {
51
+ return await this.filesystem.readFile(resolvePath(this.root, path), options);
52
+ }
53
+ async writeFile(path, content, options) {
54
+ await this.filesystem.writeFile(resolvePath(this.root, path), content, options);
55
+ }
56
+ async appendFile(path, content, options) {
57
+ await this.filesystem.appendFile(resolvePath(this.root, path), content, options);
58
+ }
59
+ async deleteFile(path, options) {
60
+ await this.filesystem.deleteFile(resolvePath(this.root, path), options);
61
+ }
62
+ async copyFile(src, dest, options) {
63
+ await this.filesystem.copyFile(resolvePath(this.root, src), resolvePath(this.root, dest), options);
64
+ }
65
+ async moveFile(src, dest, options) {
66
+ await this.filesystem.moveFile(resolvePath(this.root, src), resolvePath(this.root, dest), options);
67
+ }
68
+ async mkdir(path, options) {
69
+ await this.filesystem.mkdir(resolvePath(this.root, path), options);
70
+ }
71
+ async rmdir(path, options) {
72
+ await this.filesystem.rmdir(resolvePath(this.root, path), options);
73
+ }
74
+ async readdir(path, options) {
75
+ return await this.filesystem.readdir(resolvePath(this.root, path), options);
76
+ }
77
+ async exists(path, options) {
78
+ return await this.filesystem.exists(resolvePath(this.root, path), options);
79
+ }
80
+ async stat(path, options) {
81
+ return await this.filesystem.stat(resolvePath(this.root, path), options);
82
+ }
83
+ }
84
+ class ScopedSandbox {
85
+ constructor(sandbox, root, env = {}) {
86
+ this.sandbox = sandbox;
87
+ this.root = root;
88
+ this.env = env;
89
+ if (sandbox.executeCommand) {
90
+ const executeCommand = sandbox.executeCommand.bind(sandbox);
91
+ this.executeCommand = async (command, args, options = {}) => {
92
+ const cwd = options.cwd ? resolvePath(this.root, options.cwd) : this.root;
93
+ return await executeCommand(command, args, {
94
+ ...options,
95
+ cwd,
96
+ env: {
97
+ ...this.env,
98
+ ...options.env,
99
+ },
100
+ });
101
+ };
102
+ }
103
+ }
104
+ get id() {
105
+ return `${this.sandbox.id}:scoped`;
106
+ }
107
+ get name() {
108
+ return `${this.sandbox.name} (scoped)`;
109
+ }
110
+ get provider() {
111
+ return this.sandbox.provider;
112
+ }
113
+ get status() {
114
+ return this.sandbox.status;
115
+ }
116
+ set status(status) {
117
+ this.sandbox.status = status;
118
+ }
119
+ get processes() {
120
+ return this.sandbox.processes;
121
+ }
122
+ getInstructions() {
123
+ const base = this.sandbox.getInstructions?.() ?? '';
124
+ return [base, `Run commands from ${this.root}.`].filter(Boolean).join('\n');
125
+ }
126
+ }
127
+ function createScopedWorkspace(workspace, root, env) {
128
+ return new workspace_1.Workspace({
129
+ id: `${workspace.id}:${root}`,
130
+ name: `${workspace.name} (${root})`,
131
+ filesystem: workspace.filesystem ? new ScopedFilesystem(workspace.filesystem, root) : undefined,
132
+ sandbox: workspace.sandbox ? new ScopedSandbox(workspace.sandbox, root, env) : undefined,
133
+ });
134
+ }
135
+ //# sourceMappingURL=scoped-workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoped-workspace.js","sourceRoot":"","sources":["../../src/workspace/scoped-workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { WorkspaceFilesystem } from './types';
2
+ export type ToolResultKind = 'result' | 'error' | 'message';
3
+ export interface ToolResultStorageScope {
4
+ runId: string;
5
+ toolCallId: string;
6
+ abortSignal?: AbortSignal;
7
+ }
8
+ export declare function getToolResultRunDirectory(runId: string): string;
9
+ export declare function isToolResultPath(path: string): boolean;
10
+ export declare function storeToolResult(filesystem: WorkspaceFilesystem, scope: ToolResultStorageScope, kind: ToolResultKind, serialized: string): Promise<string>;
11
+ export declare function removeToolResultRun(filesystem: WorkspaceFilesystem, runId: string): Promise<void>;
12
+ export declare function reconcileToolResultRuns(filesystem: WorkspaceFilesystem, protectedRunIds: Iterable<string>, ttlMs: number): Promise<void>;
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getToolResultRunDirectory = getToolResultRunDirectory;
4
+ exports.isToolResultPath = isToolResultPath;
5
+ exports.storeToolResult = storeToolResult;
6
+ exports.removeToolResultRun = removeToolResultRun;
7
+ exports.reconcileToolResultRuns = reconcileToolResultRuns;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const abort_1 = require("../sdk/abort");
10
+ const TOOL_RESULTS_DIRECTORY = 'tool-results';
11
+ const TOOL_RESULT_RUNS_DIRECTORY = `${TOOL_RESULTS_DIRECTORY}/runs`;
12
+ const HASHED_PATH_SEGMENT_PATTERN = /^[A-Za-z0-9_-]{43}$/;
13
+ const TOOL_RESULT_FILE_PATTERN = /^([A-Za-z0-9_-]{43})\.(result|error|message)\.json$/;
14
+ const MAX_RECONCILIATION_CANDIDATES = 100;
15
+ const TOOL_RESULT_CLEANUP_TIMEOUT_MS = 1_000;
16
+ const TOOL_RESULT_RECONCILIATION_TIMEOUT_MS = 5_000;
17
+ function hashPathSegment(value) {
18
+ return (0, node_crypto_1.createHash)('sha256').update(value).digest('base64url');
19
+ }
20
+ function getToolResultRunDirectory(runId) {
21
+ return `${TOOL_RESULT_RUNS_DIRECTORY}/${hashPathSegment(runId)}`;
22
+ }
23
+ function isToolResultPath(path) {
24
+ const segments = path.split('/');
25
+ return (segments.length === 4 &&
26
+ segments[0] === TOOL_RESULTS_DIRECTORY &&
27
+ segments[1] === 'runs' &&
28
+ HASHED_PATH_SEGMENT_PATTERN.test(segments[2]) &&
29
+ TOOL_RESULT_FILE_PATTERN.test(segments[3]));
30
+ }
31
+ function getToolResultPath(scope, kind) {
32
+ return `${getToolResultRunDirectory(scope.runId)}/${hashPathSegment(scope.toolCallId)}.${kind}.json`;
33
+ }
34
+ async function storeToolResult(filesystem, scope, kind, serialized) {
35
+ const path = getToolResultPath(scope, kind);
36
+ await filesystem.writeFile(path, serialized, {
37
+ recursive: true,
38
+ overwrite: true,
39
+ abortSignal: scope.abortSignal,
40
+ });
41
+ return path;
42
+ }
43
+ async function removeToolResultRun(filesystem, runId) {
44
+ const abortSignal = AbortSignal.timeout(TOOL_RESULT_CLEANUP_TIMEOUT_MS);
45
+ await (0, abort_1.raceWithAbort)(async () => {
46
+ const runDirectory = getToolResultRunDirectory(runId);
47
+ if (!(await filesystem.exists(runDirectory, { abortSignal })))
48
+ return;
49
+ await filesystem.rmdir(runDirectory, { recursive: true, force: true, abortSignal });
50
+ }, abortSignal);
51
+ }
52
+ async function reconcileToolResultRuns(filesystem, protectedRunIds, ttlMs) {
53
+ const abortSignal = AbortSignal.timeout(TOOL_RESULT_RECONCILIATION_TIMEOUT_MS);
54
+ await (0, abort_1.raceWithAbort)(async () => {
55
+ let entries;
56
+ try {
57
+ entries = await filesystem.readdir(TOOL_RESULT_RUNS_DIRECTORY, { abortSignal });
58
+ }
59
+ catch {
60
+ return;
61
+ }
62
+ const protectedDirectories = new Set(Array.from(protectedRunIds, (runId) => hashPathSegment(runId)));
63
+ const cutoff = Date.now() - ttlMs;
64
+ let examined = 0;
65
+ for (const entry of entries) {
66
+ if (examined >= MAX_RECONCILIATION_CANDIDATES)
67
+ break;
68
+ if (entry.type !== 'directory' || !HASHED_PATH_SEGMENT_PATTERN.test(entry.name)) {
69
+ continue;
70
+ }
71
+ if (protectedDirectories.has(entry.name))
72
+ continue;
73
+ examined++;
74
+ const path = `${TOOL_RESULT_RUNS_DIRECTORY}/${entry.name}`;
75
+ try {
76
+ const { modifiedAt } = await filesystem.stat(path, { abortSignal });
77
+ const modifiedAtMs = modifiedAt.getTime();
78
+ if (!Number.isFinite(modifiedAtMs) || modifiedAtMs >= cutoff)
79
+ continue;
80
+ await filesystem.rmdir(path, { recursive: true, force: true, abortSignal });
81
+ }
82
+ catch {
83
+ if (abortSignal.aborted)
84
+ return;
85
+ }
86
+ }
87
+ }, abortSignal);
88
+ }
89
+ //# sourceMappingURL=tool-result-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result-storage.js","sourceRoot":"","sources":["../../src/workspace/tool-result-storage.ts"],"names":[],"mappings":"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"}
@@ -22,10 +22,8 @@ function createExecuteCommandTool(sandbox) {
22
22
  if (!sandbox.executeCommand) {
23
23
  throw new Error('Sandbox does not support command execution');
24
24
  }
25
- const env = sandbox.getDefaultCommandEnv?.();
26
25
  const result = await sandbox.executeCommand(input.command, undefined, {
27
26
  cwd: input.cwd,
28
- ...(env ? { env } : {}),
29
27
  timeout: input.timeout,
30
28
  abortSignal: ctx.abortSignal,
31
29
  });
@@ -1 +1 @@
1
- {"version":3,"file":"execute-command.js","sourceRoot":"","sources":["../../../src/workspace/tools/execute-command.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,yCAAsC;AAItC,kCAAyC,OAAyB;IACjE,OAAO,IAAI,WAAI,CAAC,2BAA2B,CAAC;SAC1C,WAAW,CAAC,wCAAwC,CAAC;SACrD,KAAK,CACL,OAAC,CAAC,MAAM,CAAC;QACR,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC5D,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACxE,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAClE,CAAC,CACF;SACA,MAAM,CACN,OAAC,CAAC,MAAM,CAAC;QACR,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE;QACpB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;QAClB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;QAClB,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE;KAC3B,CAAC,CACF;SACA,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7B,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE;YACrE,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,GAAG,CAAC,WAAW;SAC5B,CAAC,CAAC;QACH,OAAO;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,eAAe,EAAE,MAAM,CAAC,eAAe;SACvC,CAAC;IACH,CAAC,CAAC;SACD,KAAK,EAAE,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"execute-command.js","sourceRoot":"","sources":["../../../src/workspace/tools/execute-command.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAExB,yCAAsC;AAItC,kCAAyC,OAAyB;IACjE,OAAO,IAAI,WAAI,CAAC,2BAA2B,CAAC;SAC1C,WAAW,CAAC,wCAAwC,CAAC;SACrD,KAAK,CACL,OAAC,CAAC,MAAM,CAAC;QACR,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC5D,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACxE,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAClE,CAAC,CACF;SACA,MAAM,CACN,OAAC,CAAC,MAAM,CAAC;QACR,OAAO,EAAE,OAAC,CAAC,OAAO,EAAE;QACpB,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;QACpB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;QAClB,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;QAClB,eAAe,EAAE,OAAC,CAAC,MAAM,EAAE;KAC3B,CAAC,CACF;SACA,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7B,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE;YACrE,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,GAAG,CAAC,WAAW;SAC5B,CAAC,CAAC;QACH,OAAO;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,eAAe,EAAE,MAAM,CAAC,eAAe;SACvC,CAAC;IACH,CAAC,CAAC;SACD,KAAK,EAAE,CAAC;AACX,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { BuiltTool } from '../../types/sdk/tool';
2
2
  import type { WorkspaceFilesystem } from '../types';
3
- export declare function createBatchStrReplaceFileTool(filesystem: WorkspaceFilesystem): BuiltTool;
3
+ export declare function createReadToolResultTool(filesystem: WorkspaceFilesystem): BuiltTool;
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createReadToolResultTool = createReadToolResultTool;
4
+ const zod_1 = require("zod");
5
+ const tool_1 = require("../../sdk/tool");
6
+ const tool_result_storage_1 = require("../tool-result-storage");
7
+ const DEFAULT_CONTAINER_LIMIT = 20;
8
+ const MAX_CONTAINER_LIMIT = 100;
9
+ const MAX_STRING_CHARS = 20_000;
10
+ const MAX_INLINE_STRING_CHARS = 500;
11
+ const MAX_SERIALIZED_OUTPUT_BYTES = 40_000;
12
+ const jsonValueTypeSchema = zod_1.z.enum(['null', 'boolean', 'number', 'string', 'array', 'object']);
13
+ const scalarValueSchema = zod_1.z.union([zod_1.z.null(), zod_1.z.boolean(), zod_1.z.number(), zod_1.z.string()]);
14
+ const childSchema = zod_1.z.object({
15
+ pointer: zod_1.z.string(),
16
+ type: jsonValueTypeSchema,
17
+ key: zod_1.z.string().optional(),
18
+ index: zod_1.z.number().int().nonnegative().optional(),
19
+ childCount: zod_1.z.number().int().nonnegative().optional(),
20
+ charCount: zod_1.z.number().int().nonnegative().optional(),
21
+ value: scalarValueSchema.optional(),
22
+ });
23
+ const describeOutputSchema = zod_1.z.object({
24
+ view: zod_1.z.literal('describe'),
25
+ pointer: zod_1.z.string(),
26
+ type: jsonValueTypeSchema,
27
+ childCount: zod_1.z.number().int().nonnegative().optional(),
28
+ charCount: zod_1.z.number().int().nonnegative().optional(),
29
+ });
30
+ const stringOutputSchema = zod_1.z.object({
31
+ view: zod_1.z.literal('json'),
32
+ pointer: zod_1.z.string(),
33
+ type: zod_1.z.literal('string'),
34
+ content: zod_1.z.string(),
35
+ offset: zod_1.z.number().int().nonnegative(),
36
+ totalChars: zod_1.z.number().int().nonnegative(),
37
+ nextOffset: zod_1.z.number().int().nonnegative().nullable(),
38
+ hasMore: zod_1.z.boolean(),
39
+ });
40
+ const containerOutputSchema = zod_1.z.object({
41
+ view: zod_1.z.literal('json'),
42
+ pointer: zod_1.z.string(),
43
+ type: zod_1.z.enum(['array', 'object']),
44
+ children: zod_1.z.array(childSchema),
45
+ offset: zod_1.z.number().int().nonnegative(),
46
+ totalChildren: zod_1.z.number().int().nonnegative(),
47
+ nextOffset: zod_1.z.number().int().nonnegative().nullable(),
48
+ hasMore: zod_1.z.boolean(),
49
+ });
50
+ const scalarOutputSchema = zod_1.z.object({
51
+ view: zod_1.z.literal('json'),
52
+ pointer: zod_1.z.string(),
53
+ type: zod_1.z.enum(['null', 'boolean', 'number']),
54
+ value: zod_1.z.union([zod_1.z.null(), zod_1.z.boolean(), zod_1.z.number()]),
55
+ });
56
+ const outputSchema = zod_1.z.union([
57
+ describeOutputSchema,
58
+ stringOutputSchema,
59
+ containerOutputSchema,
60
+ scalarOutputSchema,
61
+ ]);
62
+ const inputSchema = zod_1.z
63
+ .object({
64
+ path: zod_1.z.string().describe('Exact path from an oversized tool-result envelope'),
65
+ view: zod_1.z
66
+ .enum(['describe', 'json'])
67
+ .optional()
68
+ .describe('Inspect the selected value shape, or read a bounded JSON value'),
69
+ pointer: zod_1.z
70
+ .string()
71
+ .optional()
72
+ .describe('RFC 6901 JSON Pointer. Omit or use an empty string for the root value.'),
73
+ offset: zod_1.z
74
+ .number()
75
+ .int()
76
+ .min(0)
77
+ .optional()
78
+ .describe('String character or container child offset'),
79
+ maxChars: zod_1.z
80
+ .number()
81
+ .int()
82
+ .min(1)
83
+ .max(MAX_STRING_CHARS)
84
+ .optional()
85
+ .describe('Maximum characters to return from a selected JSON string'),
86
+ limit: zod_1.z
87
+ .number()
88
+ .int()
89
+ .min(1)
90
+ .max(MAX_CONTAINER_LIMIT)
91
+ .optional()
92
+ .describe('Maximum object or array children to return'),
93
+ })
94
+ .strict();
95
+ function createReadToolResultTool(filesystem) {
96
+ return new tool_1.Tool('workspace_read_tool_result')
97
+ .description('Inspect an oversized tool result stored in the workspace. Start with view=describe, then use view=json with relevant JSON Pointers and nextOffset values. Continue until you have enough evidence for the user request; do not assume the first page is complete when hasMore is true.')
98
+ .systemInstruction('When a tool result is offloaded, inspect it with workspace_read_tool_result before answering. Continue through relevant JSON Pointers and nextOffset pages until you have enough evidence for the user request. Do not read the entire result when the remaining content cannot affect the answer.')
99
+ .input(inputSchema)
100
+ .output(outputSchema)
101
+ .handler(async (input, ctx) => await readToolResult(filesystem, input, ctx.abortSignal))
102
+ .build();
103
+ }
104
+ async function readToolResult(filesystem, input, abortSignal) {
105
+ if (!(0, tool_result_storage_1.isToolResultPath)(input.path)) {
106
+ throw new Error('Path is not a stored tool result');
107
+ }
108
+ const content = await filesystem.readFile(input.path, {
109
+ encoding: 'utf-8',
110
+ abortSignal,
111
+ });
112
+ const serialized = typeof content === 'string' ? content : content.toString('utf-8');
113
+ let root;
114
+ try {
115
+ root = JSON.parse(serialized);
116
+ }
117
+ catch {
118
+ throw new Error('Stored tool result is not valid JSON');
119
+ }
120
+ const pointer = input.pointer ?? '';
121
+ const value = resolveJsonPointer(root, pointer);
122
+ if ((input.view ?? 'describe') === 'describe') {
123
+ return ensureWithinOutputBudget(describeValue(value, pointer));
124
+ }
125
+ return readJsonValue(value, pointer, input);
126
+ }
127
+ function readJsonValue(value, pointer, input) {
128
+ if (value === null) {
129
+ return ensureWithinOutputBudget({ view: 'json', pointer, type: 'null', value: null });
130
+ }
131
+ if (typeof value === 'boolean') {
132
+ return ensureWithinOutputBudget({ view: 'json', pointer, type: 'boolean', value });
133
+ }
134
+ if (typeof value === 'number') {
135
+ return ensureWithinOutputBudget({ view: 'json', pointer, type: 'number', value });
136
+ }
137
+ if (typeof value === 'string') {
138
+ return readStringPage(value, pointer, input.offset ?? 0, input.maxChars ?? MAX_STRING_CHARS);
139
+ }
140
+ if (Array.isArray(value)) {
141
+ return readContainerPage(value, pointer, 'array', input.offset ?? 0, input.limit ?? DEFAULT_CONTAINER_LIMIT);
142
+ }
143
+ if (isJsonObject(value)) {
144
+ return readContainerPage(value, pointer, 'object', input.offset ?? 0, input.limit ?? DEFAULT_CONTAINER_LIMIT);
145
+ }
146
+ throw new Error('Stored tool result contains an unsupported JSON value');
147
+ }
148
+ function describeValue(value, pointer) {
149
+ const type = getJsonValueType(value);
150
+ const output = { view: 'describe', pointer, type };
151
+ if (typeof value === 'string') {
152
+ output.charCount = value.length;
153
+ }
154
+ else if (Array.isArray(value)) {
155
+ output.childCount = value.length;
156
+ }
157
+ else if (isJsonObject(value)) {
158
+ output.childCount = Object.keys(value).length;
159
+ }
160
+ return output;
161
+ }
162
+ function readStringPage(value, pointer, offset, maxChars) {
163
+ const available = Math.max(0, value.length - offset);
164
+ let low = 0;
165
+ let high = Math.min(maxChars, available);
166
+ let best;
167
+ while (low <= high) {
168
+ const length = Math.floor((low + high) / 2);
169
+ const output = buildStringOutput(value, pointer, offset, length);
170
+ if (isWithinOutputBudget(output)) {
171
+ best = output;
172
+ low = length + 1;
173
+ }
174
+ else {
175
+ high = length - 1;
176
+ }
177
+ }
178
+ if (!best || (available > 0 && best.content.length === 0)) {
179
+ throw new Error('Tool result value cannot fit within the read limit');
180
+ }
181
+ return best;
182
+ }
183
+ function buildStringOutput(value, pointer, offset, length) {
184
+ const content = value.slice(offset, offset + length);
185
+ const consumedOffset = offset + content.length;
186
+ const hasMore = consumedOffset < value.length;
187
+ return {
188
+ view: 'json',
189
+ pointer,
190
+ type: 'string',
191
+ content,
192
+ offset,
193
+ totalChars: value.length,
194
+ nextOffset: hasMore ? consumedOffset : null,
195
+ hasMore,
196
+ };
197
+ }
198
+ function readContainerPage(value, pointer, type, offset, limit) {
199
+ const keys = Array.isArray(value) ? undefined : Object.keys(value);
200
+ const totalChildren = Array.isArray(value) ? value.length : (keys?.length ?? 0);
201
+ const children = [];
202
+ const pageEnd = Math.min(totalChildren, offset + limit);
203
+ for (let index = offset; index < pageEnd; index++) {
204
+ const key = keys?.[index];
205
+ const childValue = Array.isArray(value) ? value[index] : value[key ?? ''];
206
+ const child = describeChild(childValue, pointer, key, Array.isArray(value) ? index : undefined);
207
+ const candidate = buildContainerOutput(type, pointer, children.concat(child), offset, totalChildren);
208
+ if (!isWithinOutputBudget(candidate)) {
209
+ if (children.length === 0) {
210
+ throw new Error('Tool result child cannot fit within the read limit');
211
+ }
212
+ break;
213
+ }
214
+ children.push(child);
215
+ }
216
+ return ensureWithinOutputBudget(buildContainerOutput(type, pointer, children, offset, totalChildren));
217
+ }
218
+ function buildContainerOutput(type, pointer, children, offset, totalChildren) {
219
+ const consumedOffset = Math.min(totalChildren, offset + children.length);
220
+ const hasMore = consumedOffset < totalChildren;
221
+ return {
222
+ view: 'json',
223
+ pointer,
224
+ type,
225
+ children,
226
+ offset,
227
+ totalChildren,
228
+ nextOffset: hasMore ? consumedOffset : null,
229
+ hasMore,
230
+ };
231
+ }
232
+ function describeChild(value, parentPointer, key, index) {
233
+ const segment = key ?? String(index);
234
+ const type = getJsonValueType(value);
235
+ const child = {
236
+ pointer: appendJsonPointer(parentPointer, segment),
237
+ type,
238
+ ...(key === undefined ? {} : { key }),
239
+ ...(index === undefined ? {} : { index }),
240
+ };
241
+ if (typeof value === 'string') {
242
+ child.charCount = value.length;
243
+ if (value.length <= MAX_INLINE_STRING_CHARS)
244
+ child.value = value;
245
+ }
246
+ else if (Array.isArray(value)) {
247
+ child.childCount = value.length;
248
+ }
249
+ else if (isJsonObject(value)) {
250
+ child.childCount = Object.keys(value).length;
251
+ }
252
+ else if (value === null || typeof value === 'boolean' || typeof value === 'number') {
253
+ child.value = value;
254
+ }
255
+ return child;
256
+ }
257
+ function resolveJsonPointer(root, pointer) {
258
+ if (pointer === '')
259
+ return root;
260
+ if (!pointer.startsWith('/')) {
261
+ throw new Error('Invalid JSON Pointer');
262
+ }
263
+ let value = root;
264
+ for (const encodedSegment of pointer.slice(1).split('/')) {
265
+ const segment = decodeJsonPointerSegment(encodedSegment);
266
+ if (Array.isArray(value)) {
267
+ if (!/^(0|[1-9]\d*)$/.test(segment)) {
268
+ throw new Error('JSON Pointer does not reference a stored value');
269
+ }
270
+ const index = Number(segment);
271
+ if (!Number.isSafeInteger(index) || index >= value.length) {
272
+ throw new Error('JSON Pointer does not reference a stored value');
273
+ }
274
+ value = value[index];
275
+ continue;
276
+ }
277
+ if (isJsonObject(value) && Object.hasOwn(value, segment)) {
278
+ value = value[segment];
279
+ continue;
280
+ }
281
+ throw new Error('JSON Pointer does not reference a stored value');
282
+ }
283
+ return value;
284
+ }
285
+ function decodeJsonPointerSegment(segment) {
286
+ if (/~(?:[^01]|$)/.test(segment)) {
287
+ throw new Error('Invalid JSON Pointer');
288
+ }
289
+ return segment.replaceAll('~1', '/').replaceAll('~0', '~');
290
+ }
291
+ function appendJsonPointer(pointer, segment) {
292
+ return `${pointer}/${segment.replaceAll('~', '~0').replaceAll('/', '~1')}`;
293
+ }
294
+ function getJsonValueType(value) {
295
+ if (value === null)
296
+ return 'null';
297
+ if (Array.isArray(value))
298
+ return 'array';
299
+ if (isJsonObject(value))
300
+ return 'object';
301
+ if (typeof value === 'string')
302
+ return 'string';
303
+ if (typeof value === 'number')
304
+ return 'number';
305
+ if (typeof value === 'boolean')
306
+ return 'boolean';
307
+ throw new Error('Stored tool result contains an unsupported JSON value');
308
+ }
309
+ function isJsonObject(value) {
310
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
311
+ }
312
+ function isWithinOutputBudget(output) {
313
+ return Buffer.byteLength(JSON.stringify(output), 'utf-8') <= MAX_SERIALIZED_OUTPUT_BYTES;
314
+ }
315
+ function ensureWithinOutputBudget(output) {
316
+ if (!isWithinOutputBudget(output)) {
317
+ throw new Error('Tool result response cannot fit within the read limit');
318
+ }
319
+ return output;
320
+ }
321
+ //# sourceMappingURL=read-tool-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-tool-result.js","sourceRoot":"","sources":["../../../src/workspace/tools/read-tool-result.ts"],"names":[],"mappings":"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"}