@mongodb-js/agent-engine-sdk-langgraph 0.11.3

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 (128) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/LICENSE.md +201 -0
  3. package/README.md +149 -0
  4. package/dist/agent.d.ts +53 -0
  5. package/dist/agent.d.ts.map +1 -0
  6. package/dist/agent.js +508 -0
  7. package/dist/agent.js.map +1 -0
  8. package/dist/backends/tool_sandbox.d.ts +15 -0
  9. package/dist/backends/tool_sandbox.d.ts.map +1 -0
  10. package/dist/backends/tool_sandbox.js +15 -0
  11. package/dist/backends/tool_sandbox.js.map +1 -0
  12. package/dist/backends/toolpod.d.ts +68 -0
  13. package/dist/backends/toolpod.d.ts.map +1 -0
  14. package/dist/backends/toolpod.js +451 -0
  15. package/dist/backends/toolpod.js.map +1 -0
  16. package/dist/call_interrupt.d.ts +20 -0
  17. package/dist/call_interrupt.d.ts.map +1 -0
  18. package/dist/call_interrupt.js +23 -0
  19. package/dist/call_interrupt.js.map +1 -0
  20. package/dist/checkpoint_branch.d.ts +58 -0
  21. package/dist/checkpoint_branch.d.ts.map +1 -0
  22. package/dist/checkpoint_branch.js +239 -0
  23. package/dist/checkpoint_branch.js.map +1 -0
  24. package/dist/checkpointer.d.ts +21 -0
  25. package/dist/checkpointer.d.ts.map +1 -0
  26. package/dist/checkpointer.js +31 -0
  27. package/dist/checkpointer.js.map +1 -0
  28. package/dist/deep_agent.d.ts +49 -0
  29. package/dist/deep_agent.d.ts.map +1 -0
  30. package/dist/deep_agent.js +110 -0
  31. package/dist/deep_agent.js.map +1 -0
  32. package/dist/deep_agent_checkpointer.d.ts +11 -0
  33. package/dist/deep_agent_checkpointer.d.ts.map +1 -0
  34. package/dist/deep_agent_checkpointer.js +19 -0
  35. package/dist/deep_agent_checkpointer.js.map +1 -0
  36. package/dist/deep_agent_task.d.ts +26 -0
  37. package/dist/deep_agent_task.d.ts.map +1 -0
  38. package/dist/deep_agent_task.js +49 -0
  39. package/dist/deep_agent_task.js.map +1 -0
  40. package/dist/durable_deep_agent.d.ts +23 -0
  41. package/dist/durable_deep_agent.d.ts.map +1 -0
  42. package/dist/durable_deep_agent.js +176 -0
  43. package/dist/durable_deep_agent.js.map +1 -0
  44. package/dist/durable_message_identity.d.ts +5 -0
  45. package/dist/durable_message_identity.d.ts.map +1 -0
  46. package/dist/durable_message_identity.js +106 -0
  47. package/dist/durable_message_identity.js.map +1 -0
  48. package/dist/durable_session.d.ts +30 -0
  49. package/dist/durable_session.d.ts.map +1 -0
  50. package/dist/durable_session.js +400 -0
  51. package/dist/durable_session.js.map +1 -0
  52. package/dist/durable_subgraphs.d.ts +13 -0
  53. package/dist/durable_subgraphs.d.ts.map +1 -0
  54. package/dist/durable_subgraphs.js +82 -0
  55. package/dist/durable_subgraphs.js.map +1 -0
  56. package/dist/durable_tools.d.ts +12 -0
  57. package/dist/durable_tools.d.ts.map +1 -0
  58. package/dist/durable_tools.js +41 -0
  59. package/dist/durable_tools.js.map +1 -0
  60. package/dist/execution_session.d.ts +63 -0
  61. package/dist/execution_session.d.ts.map +1 -0
  62. package/dist/execution_session.js +300 -0
  63. package/dist/execution_session.js.map +1 -0
  64. package/dist/index.d.ts +19 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +17 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/llm_adapter.d.ts +41 -0
  69. package/dist/llm_adapter.d.ts.map +1 -0
  70. package/dist/llm_adapter.js +177 -0
  71. package/dist/llm_adapter.js.map +1 -0
  72. package/dist/messages.d.ts +56 -0
  73. package/dist/messages.d.ts.map +1 -0
  74. package/dist/messages.js +592 -0
  75. package/dist/messages.js.map +1 -0
  76. package/dist/node_logger_adapter.d.ts +51 -0
  77. package/dist/node_logger_adapter.d.ts.map +1 -0
  78. package/dist/node_logger_adapter.js +163 -0
  79. package/dist/node_logger_adapter.js.map +1 -0
  80. package/dist/platform_checkpointer.d.ts +70 -0
  81. package/dist/platform_checkpointer.d.ts.map +1 -0
  82. package/dist/platform_checkpointer.js +252 -0
  83. package/dist/platform_checkpointer.js.map +1 -0
  84. package/dist/query.d.ts +103 -0
  85. package/dist/query.d.ts.map +1 -0
  86. package/dist/query.js +623 -0
  87. package/dist/query.js.map +1 -0
  88. package/dist/runtime.d.ts +336 -0
  89. package/dist/runtime.d.ts.map +1 -0
  90. package/dist/runtime.js +881 -0
  91. package/dist/runtime.js.map +1 -0
  92. package/dist/secure_llm.d.ts +93 -0
  93. package/dist/secure_llm.d.ts.map +1 -0
  94. package/dist/secure_llm.js +423 -0
  95. package/dist/secure_llm.js.map +1 -0
  96. package/dist/session_factory.d.ts +6 -0
  97. package/dist/session_factory.d.ts.map +1 -0
  98. package/dist/session_factory.js +29 -0
  99. package/dist/session_factory.js.map +1 -0
  100. package/dist/session_fork.d.ts +76 -0
  101. package/dist/session_fork.d.ts.map +1 -0
  102. package/dist/session_fork.js +428 -0
  103. package/dist/session_fork.js.map +1 -0
  104. package/dist/subagents.d.ts +37 -0
  105. package/dist/subagents.d.ts.map +1 -0
  106. package/dist/subagents.js +67 -0
  107. package/dist/subagents.js.map +1 -0
  108. package/dist/suspend.d.ts +27 -0
  109. package/dist/suspend.d.ts.map +1 -0
  110. package/dist/suspend.js +87 -0
  111. package/dist/suspend.js.map +1 -0
  112. package/dist/thread_id.d.ts +30 -0
  113. package/dist/thread_id.d.ts.map +1 -0
  114. package/dist/thread_id.js +69 -0
  115. package/dist/thread_id.js.map +1 -0
  116. package/dist/workflow_json.d.ts +11 -0
  117. package/dist/workflow_json.d.ts.map +1 -0
  118. package/dist/workflow_json.js +49 -0
  119. package/dist/workflow_json.js.map +1 -0
  120. package/dist/workflow_message.d.ts +11 -0
  121. package/dist/workflow_message.d.ts.map +1 -0
  122. package/dist/workflow_message.js +179 -0
  123. package/dist/workflow_message.js.map +1 -0
  124. package/dist/workflow_state.d.ts +7 -0
  125. package/dist/workflow_state.d.ts.map +1 -0
  126. package/dist/workflow_state.js +62 -0
  127. package/dist/workflow_state.js.map +1 -0
  128. package/package.json +66 -0
@@ -0,0 +1,451 @@
1
+ /**
2
+ * AgentEngineToolPodBackend — routes deep-agent filesystem/shell ops through the
3
+ * secure path (SecureToolWrapper → Orchestration Engine → Tool Pod handlers).
4
+ *
5
+ * Port of Python `agent_engine_sdk_langgraph/backends/toolpod.py`, targeting
6
+ * deepagents' current V2 backend protocol (`SandboxBackendProtocolV2`): every
7
+ * method returns a structured Result object with an optional `error`, so a
8
+ * failure is surfaced through the same channel as success — never thrown into
9
+ * the graph and never leaking internal topology.
10
+ *
11
+ * The active `SecureToolWrapper` is read from the async-context store on every
12
+ * call (not captured at construction): LangGraph builds the backend on one task
13
+ * and invokes it on another, so a captured reference would be stale.
14
+ *
15
+ * Batch downloads (`downloadFiles`) fan out concurrently in native mode, with
16
+ * one `filesystem_download` call per file so OE policy and audit stay
17
+ * independent. Under a durable `AttemptContext` they stay sequential: unkeyed
18
+ * activities are exclusive on the attempt gate, and overlapping them raises
19
+ * CONFLICT.
20
+ */
21
+ import { currentAttemptContext, getCurrentWrapper, getLogger, PolicyDeniedException, TerminalExecutionError, ToolCallTimeoutError, } from "@mongodb-js/agent-engine-runner-shared";
22
+ const logger = getLogger("agent_engine_sdk_langgraph.backends.toolpod");
23
+ const RETRYABLE = "[RETRYABLE]";
24
+ const NON_RETRYABLE = "[NON-RETRYABLE]";
25
+ const MAX_DOWNLOAD_WORKERS = 16;
26
+ // Cluster-internal DNS suffixes (Kubernetes, consul, .local). Catches things
27
+ // like `db.foo.svc.cluster.local` before the host:port pattern below does.
28
+ const INTERNAL_DNS_RE = /\b[a-z0-9][a-z0-9.-]*\.(?:svc\.cluster\.local|cluster\.local|internal|local)\b/gi;
29
+ // Bracketed IPv6 host:port (`[::1]:8080`, `[fd00::1]:27017`). Runs before the
30
+ // alphanumeric host:port regex — that one's leading `[a-z0-9]` class can't
31
+ // match `[`.
32
+ const IPV6_HOST_PORT_RE = /\[[0-9a-fA-F:]+\]:\d{2,5}/g;
33
+ // `host:port` where port is 2–5 digits. Runs after the DNS replacement so
34
+ // `db.internal:27017` loses its port here rather than being orphaned.
35
+ const HOST_PORT_RE = /\b[a-z0-9][a-z0-9.-]*:\d{2,5}\b/gi;
36
+ // Any remaining multi-segment absolute path.
37
+ const ABS_PATH_RE = /\/[^/\s"'()]+(?:\/[^/\s"'()]*)*/g;
38
+ /**
39
+ * Strip internal topology (workspace path, cluster hostnames/ports, absolute
40
+ * paths) from a handler-supplied error string before it reaches the agent
41
+ * graph. Mirrors Python `_sanitize_handler_error`: the "no internal
42
+ * hostnames/ports/paths" invariant applies to handler errors, not only
43
+ * exception-derived ones. Order matters — host:port pairs are consumed before
44
+ * bare DNS names so a port is never left orphaned.
45
+ */
46
+ function sanitizeHandlerError(message) {
47
+ let out = message;
48
+ const workspace = process.env["WORKSPACE_DIR"]?.replace(/\/+$/, "");
49
+ if (workspace)
50
+ out = out.split(workspace).join("<workspace>");
51
+ out = out.replace(IPV6_HOST_PORT_RE, "<host>");
52
+ out = out.replace(HOST_PORT_RE, "<host>");
53
+ out = out.replace(INTERNAL_DNS_RE, "<host>");
54
+ return out.replace(ABS_PATH_RE, "<path>");
55
+ }
56
+ /**
57
+ * Classify a thrown error as retryable or non-retryable and return a generic,
58
+ * topology-free description. Full details are logged by the caller; only this
59
+ * category string reaches the agent. Mirrors Python `_classify_error`.
60
+ *
61
+ * PolicyDenied and programming errors (TypeError/RangeError etc., and the
62
+ * "no wrapper in context" RuntimeError) are non-retryable — retrying with the
63
+ * same inputs can never succeed. Everything else defaults to retryable so the
64
+ * agent doesn't give up on a transient.
65
+ */
66
+ function classifyError(exc) {
67
+ if (exc instanceof PolicyDeniedException) {
68
+ return `${NON_RETRYABLE} Policy denied this operation`;
69
+ }
70
+ if (exc instanceof TerminalExecutionError) {
71
+ return `${NON_RETRYABLE} This execution already ended`;
72
+ }
73
+ if (exc instanceof ToolCallTimeoutError) {
74
+ // Non-retryable: the call already consumed its whole deadline, so an
75
+ // automatic retry spends another full one to most likely fail the same way.
76
+ // The agent decides whether the work is worth re-attempting.
77
+ return `${NON_RETRYABLE} Operation timed out`;
78
+ }
79
+ if (exc instanceof TypeError ||
80
+ exc instanceof RangeError ||
81
+ exc instanceof ReferenceError ||
82
+ exc instanceof SyntaxError ||
83
+ exc instanceof MissingWrapperError) {
84
+ return `${NON_RETRYABLE} Programming error — retry will not help`;
85
+ }
86
+ return `${RETRYABLE} Operation failed`;
87
+ }
88
+ /** Raised when the backend is used outside an AER execution context. */
89
+ class MissingWrapperError extends Error {
90
+ }
91
+ function getWrapper() {
92
+ const wrapper = getCurrentWrapper();
93
+ if (wrapper == null) {
94
+ throw new MissingWrapperError("No SecureToolWrapper in context — " +
95
+ "AgentEngineToolPodBackend must run inside AER execution");
96
+ }
97
+ return wrapper;
98
+ }
99
+ /** Truthy `error` field on a handler result, sanitized; else undefined. */
100
+ function handlerError(result) {
101
+ const err = result["error"];
102
+ return err ? sanitizeHandlerError(String(err)) : undefined;
103
+ }
104
+ function isObject(v) {
105
+ return typeof v === "object" && v !== null && !Array.isArray(v);
106
+ }
107
+ /** Human-readable type for protocol-violation messages (`typeof [] === "object"`). */
108
+ function describeType(v) {
109
+ if (v === null)
110
+ return "null";
111
+ if (Array.isArray(v))
112
+ return "array";
113
+ return typeof v;
114
+ }
115
+ /**
116
+ * Backend that routes every operation through Atlas Agent Engine's secure path. Each
117
+ * method delegates to `SecureToolWrapper.executeTool`, which sends the request
118
+ * to the OE for policy approval and audit logging before it runs in the Tool
119
+ * Pod.
120
+ */
121
+ export class AgentEngineToolPodBackend {
122
+ id = "agent-engine-toolpod";
123
+ /**
124
+ * Execute a Tool Pod handler through the secure wrapper. Returns the wire
125
+ * result on success, or a classified `[RETRYABLE]`/`[NON-RETRYABLE]` error
126
+ * string on failure (exceptions are logged and translated, never rethrown).
127
+ */
128
+ async call(toolName, args) {
129
+ try {
130
+ const wrapper = getWrapper();
131
+ const raw = await wrapper.executeTool(toolName, args, { isLocal: false });
132
+ if (isObject(raw))
133
+ return { ok: true, result: raw };
134
+ return {
135
+ ok: false,
136
+ error: `${NON_RETRYABLE} ${toolName} protocol violation: ` +
137
+ `expected object, got ${describeType(raw)}`,
138
+ };
139
+ }
140
+ catch (exc) {
141
+ const msg = classifyError(exc);
142
+ logger.warn(`Tool call ${toolName} failed: ${String(exc)}`);
143
+ return { ok: false, error: msg };
144
+ }
145
+ }
146
+ // ------------------------------------------------------------------
147
+ // Read operations
148
+ // ------------------------------------------------------------------
149
+ async ls(path) {
150
+ const outcome = await this.call("filesystem_ls", { path });
151
+ if (!outcome.ok)
152
+ return { error: outcome.error };
153
+ const { result } = outcome;
154
+ const handlerErr = handlerError(result);
155
+ if (handlerErr !== undefined)
156
+ return { error: handlerErr };
157
+ const entries = result["entries"];
158
+ if (!Array.isArray(entries)) {
159
+ return {
160
+ error: `${NON_RETRYABLE} filesystem_ls protocol violation: 'entries' not an array`,
161
+ };
162
+ }
163
+ return mapFileInfos(entries, "filesystem_ls", "entry");
164
+ }
165
+ async read(filePath, offset = 0, limit = 2000) {
166
+ const outcome = await this.call("filesystem_read", {
167
+ file_path: filePath,
168
+ offset,
169
+ limit,
170
+ });
171
+ if (!outcome.ok)
172
+ return { error: outcome.error };
173
+ const { result } = outcome;
174
+ const handlerErr = handlerError(result);
175
+ if (handlerErr !== undefined)
176
+ return { error: handlerErr };
177
+ const content = result["content"];
178
+ if (typeof content !== "string") {
179
+ return {
180
+ error: `${NON_RETRYABLE} filesystem_read protocol violation: 'content' not a string`,
181
+ };
182
+ }
183
+ return { content, mimeType: "text/plain" };
184
+ }
185
+ /**
186
+ * Raw read is not backed by a dedicated wire handler; the Tool Pod exposes
187
+ * only line-oriented `filesystem_read`. We wrap its text content in a v2
188
+ * FileData so binary-unaware callers still work. Genuine binary reads should
189
+ * use `downloadFiles`, which carries raw bytes base64-encoded.
190
+ */
191
+ async readRaw(filePath) {
192
+ const res = await this.read(filePath);
193
+ if (res.error !== undefined)
194
+ return { error: res.error };
195
+ const now = new Date().toISOString();
196
+ const data = {
197
+ content: res.content ?? "",
198
+ mimeType: res.mimeType ?? "text/plain",
199
+ created_at: now,
200
+ modified_at: now,
201
+ };
202
+ return { data };
203
+ }
204
+ async grep(pattern, path, glob) {
205
+ const args = { pattern };
206
+ if (path != null)
207
+ args["path"] = path;
208
+ if (glob != null)
209
+ args["glob"] = glob;
210
+ const outcome = await this.call("filesystem_grep", args);
211
+ if (!outcome.ok)
212
+ return { error: outcome.error };
213
+ const { result } = outcome;
214
+ const handlerErr = handlerError(result);
215
+ if (handlerErr !== undefined)
216
+ return { error: handlerErr };
217
+ const raw = result["matches"];
218
+ if (!Array.isArray(raw)) {
219
+ return {
220
+ error: `${NON_RETRYABLE} filesystem_grep protocol violation: 'matches' not an array`,
221
+ };
222
+ }
223
+ const matches = [];
224
+ for (const m of raw) {
225
+ // Validate each element rather than coercing — an unchecked
226
+ // `Number(o["line"])` / `String(o["path"])` would silently yield `NaN` /
227
+ // `"undefined"` on a malformed element instead of surfacing the
228
+ // protocol violation, matching the array-shape checks above.
229
+ if (!isObject(m) ||
230
+ typeof m["path"] !== "string" ||
231
+ typeof m["line"] !== "number" ||
232
+ typeof m["text"] !== "string") {
233
+ return {
234
+ error: `${NON_RETRYABLE} filesystem_grep protocol violation: malformed match (expected {path: string, line: number, text: string})`,
235
+ };
236
+ }
237
+ matches.push({ path: m["path"], line: m["line"], text: m["text"] });
238
+ }
239
+ return { matches };
240
+ }
241
+ async glob(pattern, path = "/") {
242
+ const outcome = await this.call("filesystem_glob", {
243
+ pattern,
244
+ path,
245
+ });
246
+ if (!outcome.ok)
247
+ return { error: outcome.error };
248
+ const { result } = outcome;
249
+ const handlerErr = handlerError(result);
250
+ if (handlerErr !== undefined)
251
+ return { error: handlerErr };
252
+ const raw = result["matches"];
253
+ if (!Array.isArray(raw)) {
254
+ return {
255
+ error: `${NON_RETRYABLE} filesystem_glob protocol violation: 'matches' not an array`,
256
+ };
257
+ }
258
+ return mapFileInfos(raw, "filesystem_glob", "match");
259
+ }
260
+ // ------------------------------------------------------------------
261
+ // Write operations
262
+ // ------------------------------------------------------------------
263
+ async write(filePath, content) {
264
+ const outcome = await this.call("filesystem_write", {
265
+ file_path: filePath,
266
+ content,
267
+ });
268
+ if (!outcome.ok)
269
+ return { error: outcome.error };
270
+ const { result } = outcome;
271
+ const handlerErr = handlerError(result);
272
+ if (handlerErr !== undefined)
273
+ return { error: handlerErr };
274
+ const path = result["path"];
275
+ if (typeof path !== "string") {
276
+ return {
277
+ error: `${NON_RETRYABLE} filesystem_write protocol violation: success response missing 'path' string`,
278
+ };
279
+ }
280
+ return { path };
281
+ }
282
+ async edit(filePath, oldString, newString, replaceAll = false) {
283
+ const outcome = await this.call("filesystem_edit", {
284
+ file_path: filePath,
285
+ old_string: oldString,
286
+ new_string: newString,
287
+ replace_all: replaceAll,
288
+ });
289
+ if (!outcome.ok)
290
+ return { error: outcome.error };
291
+ const { result } = outcome;
292
+ const handlerErr = handlerError(result);
293
+ if (handlerErr !== undefined)
294
+ return { error: handlerErr };
295
+ const occurrences = result["occurrences"];
296
+ if (typeof occurrences !== "number") {
297
+ return {
298
+ error: `${NON_RETRYABLE} filesystem_edit protocol violation: success response missing 'occurrences' int`,
299
+ };
300
+ }
301
+ return { path: filePath, occurrences };
302
+ }
303
+ // ------------------------------------------------------------------
304
+ // Shell execution
305
+ // ------------------------------------------------------------------
306
+ async execute(command) {
307
+ const outcome = await this.call("shell_execute", { command });
308
+ if (!outcome.ok) {
309
+ return { output: outcome.error, exitCode: 1, truncated: false };
310
+ }
311
+ const { result } = outcome;
312
+ // A framework error (e.g. missing /bin/sh) returns an `error` field
313
+ // alongside a non-zero exit_code and empty output. Surface the sanitized
314
+ // message — otherwise the agent sees only an empty output + exit code and
315
+ // loses the cause — and preserve the handler's exit code.
316
+ const handlerErr = handlerError(result);
317
+ if (handlerErr !== undefined) {
318
+ const code = result["exit_code"];
319
+ return {
320
+ output: handlerErr,
321
+ exitCode: typeof code === "number" ? code : 1,
322
+ truncated: false,
323
+ };
324
+ }
325
+ const output = result["output"];
326
+ const exitCode = result["exit_code"];
327
+ if (typeof output !== "string" || typeof exitCode !== "number") {
328
+ return {
329
+ output: `${NON_RETRYABLE} shell_execute protocol violation: response must contain str 'output' and int 'exit_code'`,
330
+ exitCode: 1,
331
+ truncated: false,
332
+ };
333
+ }
334
+ return {
335
+ output,
336
+ exitCode,
337
+ truncated: Boolean(result["truncated"]),
338
+ };
339
+ }
340
+ // ------------------------------------------------------------------
341
+ // Download / upload
342
+ // ------------------------------------------------------------------
343
+ /**
344
+ * Download a single path. Never throws: failures become error responses.
345
+ */
346
+ async downloadOne(path) {
347
+ const outcome = await this.call("filesystem_download", {
348
+ file_path: path,
349
+ });
350
+ if (!outcome.ok) {
351
+ return downloadError(path, outcome.error);
352
+ }
353
+ const { result } = outcome;
354
+ const handlerErr = handlerError(result);
355
+ if (handlerErr !== undefined) {
356
+ return downloadError(path, handlerErr);
357
+ }
358
+ const b64 = result["content_base64"];
359
+ if (typeof b64 !== "string") {
360
+ return downloadError(path, `${NON_RETRYABLE} filesystem_download protocol violation: success response missing 'content_base64' field`);
361
+ }
362
+ return {
363
+ path,
364
+ content: new Uint8Array(Buffer.from(b64, "base64")),
365
+ error: null,
366
+ };
367
+ }
368
+ /**
369
+ * Download files via the audited `filesystem_download` handler — one call per
370
+ * path so each is policy-checked and logged independently — then base64-decode
371
+ * the `content_base64` field into raw bytes. Responses preserve input order;
372
+ * on failure `content` is null and `error` carries a classified message.
373
+ *
374
+ * Native-mode batches fan out on a bounded worker pool so skills loading
375
+ * pays one round-trip of latency instead of a sum. Durable attempts stay
376
+ * sequential: unkeyed activities are exclusive under the attempt gate, and
377
+ * overlapping them raises CONFLICT.
378
+ */
379
+ async downloadFiles(paths) {
380
+ if (paths.length <= 1 || currentAttemptContext() != null) {
381
+ // Single path skips pool overhead. Durable attempts stay sequential:
382
+ // unkeyed activities are exclusive under the attempt gate, and
383
+ // overlapping them raises CONFLICT.
384
+ const responses = [];
385
+ for (const path of paths) {
386
+ responses.push(await this.downloadOne(path));
387
+ }
388
+ return responses;
389
+ }
390
+ return mapLimited(paths, MAX_DOWNLOAD_WORKERS, (path) => this.downloadOne(path));
391
+ }
392
+ async uploadFiles(files) {
393
+ // Return per-file classified errors rather than throwing — a raw throw
394
+ // would bypass the [RETRYABLE]/[NON-RETRYABLE] contract every other method
395
+ // honours. No wire handler exists for upload yet.
396
+ const err = `${NON_RETRYABLE} uploadFiles is not implemented`;
397
+ return files.map(([path]) => uploadError(path, err));
398
+ }
399
+ }
400
+ /**
401
+ * Map raw wire entries to `FileInfo[]`, validating each element. A malformed
402
+ * element (not an object, or a non-string `path`) fails the whole result with a
403
+ * protocol-violation error rather than coercing to `String(undefined)` — the
404
+ * same all-or-nothing contract the array-shape checks in `ls`/`glob` use.
405
+ * `handler`/`elem` name the source for the error message.
406
+ */
407
+ function mapFileInfos(entries, handler, elem) {
408
+ const files = [];
409
+ for (const e of entries) {
410
+ if (!isObject(e) || typeof e["path"] !== "string") {
411
+ return {
412
+ error: `${NON_RETRYABLE} ${handler} protocol violation: malformed ${elem} (expected object with string 'path')`,
413
+ };
414
+ }
415
+ files.push({ path: e["path"], is_dir: Boolean(e["is_dir"]) });
416
+ }
417
+ return { files };
418
+ }
419
+ // `FileDownloadResponse.error` / `FileUploadResponse.error` are typed as a
420
+ // `FileOperationError` enum in the deepagents protocol. We deliberately ship
421
+ // richer strings — sanitized handler messages and [RETRYABLE]/[NON-RETRYABLE]
422
+ // prefixes — so the agent can tell transients from contract bugs. The cast is
423
+ // parked once on each helper instead of at every call site.
424
+ function downloadError(path, err) {
425
+ return { path, content: null, error: err };
426
+ }
427
+ /**
428
+ * Run `fn` over `items` with at most `limit` in-flight promises. Result[i]
429
+ * corresponds to items[i] even when completions finish out of order.
430
+ */
431
+ async function mapLimited(items, limit, fn) {
432
+ const results = new Array(items.length);
433
+ let cursor = 0;
434
+ async function worker() {
435
+ while (cursor < items.length) {
436
+ const index = cursor;
437
+ cursor += 1;
438
+ const item = items[index];
439
+ if (item === undefined)
440
+ return;
441
+ results[index] = await fn(item);
442
+ }
443
+ }
444
+ const workers = Math.min(limit, items.length);
445
+ await Promise.all(Array.from({ length: workers }, () => worker()));
446
+ return results;
447
+ }
448
+ function uploadError(path, err) {
449
+ return { path, error: err };
450
+ }
451
+ //# sourceMappingURL=toolpod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolpod.js","sourceRoot":"","sources":["../../src/backends/toolpod.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Per-call Stop opt-in for local (callback-routed) tools.
3
+ *
4
+ * Node has no preemptive cancel: the runtime can stop *waiting* on a tool
5
+ * body, but only the body can stop its own work. A tool branded with
6
+ * {@link withCallInterruptSupport} declares that its body consumes the
7
+ * per-call signal (via `getCallAbortSignal()` from
8
+ * `@mongodb-js/agent-engine-runner-shared`) and stops at its checkpoints.
9
+ * Only branded tools answer a per-call Stop with `interrupted`; unbranded
10
+ * tools honestly answer `not_cancellable` and run out.
11
+ */
12
+ /**
13
+ * Brand a tool as supporting per-call interrupt. The body must honor the
14
+ * signal from `getCallAbortSignal()` — check `signal.aborted` between steps
15
+ * or pass the signal to APIs that accept one (`fetch`, streams).
16
+ *
17
+ * Returns the same tool for chaining at definition time.
18
+ */
19
+ export declare function withCallInterruptSupport<T>(tool: T): T;
20
+ //# sourceMappingURL=call_interrupt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call_interrupt.d.ts","sourceRoot":"","sources":["../src/call_interrupt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAGtD"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Per-call Stop opt-in for local (callback-routed) tools.
3
+ *
4
+ * Node has no preemptive cancel: the runtime can stop *waiting* on a tool
5
+ * body, but only the body can stop its own work. A tool branded with
6
+ * {@link withCallInterruptSupport} declares that its body consumes the
7
+ * per-call signal (via `getCallAbortSignal()` from
8
+ * `@mongodb-js/agent-engine-runner-shared`) and stops at its checkpoints.
9
+ * Only branded tools answer a per-call Stop with `interrupted`; unbranded
10
+ * tools honestly answer `not_cancellable` and run out.
11
+ */
12
+ /**
13
+ * Brand a tool as supporting per-call interrupt. The body must honor the
14
+ * signal from `getCallAbortSignal()` — check `signal.aborted` between steps
15
+ * or pass the signal to APIs that accept one (`fetch`, streams).
16
+ *
17
+ * Returns the same tool for chaining at definition time.
18
+ */
19
+ export function withCallInterruptSupport(tool) {
20
+ tool.supportsCallInterrupt = true;
21
+ return tool;
22
+ }
23
+ //# sourceMappingURL=call_interrupt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call_interrupt.js","sourceRoot":"","sources":["../src/call_interrupt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAI,IAAO;IAChD,IAA4C,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,58 @@
1
+ /** Copy a LangGraph checkpoint branch point into a new thread. */
2
+ import type { RunnableConfig } from "@langchain/core/runnables";
3
+ import type { CompiledStateGraph } from "@langchain/langgraph";
4
+ export interface LangGraphCheckpoint {
5
+ readonly threadId: string;
6
+ readonly checkpointId: string;
7
+ }
8
+ export declare function branchPointFromMetadata(metadata: Record<string, unknown> | null | undefined): LangGraphCheckpoint | undefined;
9
+ export declare function checkpointMetadata(checkpoint: LangGraphCheckpoint | undefined): {
10
+ langgraph_checkpoint: {
11
+ thread_id: string;
12
+ checkpoint_id: string;
13
+ };
14
+ } | undefined;
15
+ /** Replay plan: the source supersteps a branch copy materializes in order. */
16
+ export type CheckpointReplayPlan = Array<{
17
+ updates: Array<{
18
+ values?: unknown;
19
+ asNode?: string;
20
+ }>;
21
+ }>;
22
+ /**
23
+ * Load a completed root checkpoint, or fail closed.
24
+ *
25
+ * Fork validates this before CreateBranch so a missing or incomplete history
26
+ * point does not create a branch session (Python
27
+ * `completed_root_checkpoint` parity).
28
+ */
29
+ export declare function completedRootCheckpoint(graph: CompiledStateGraph<unknown, unknown>, args: {
30
+ threadId: string;
31
+ historyId: string | null;
32
+ }): Promise<LangGraphCheckpoint>;
33
+ /**
34
+ * Build the copyable superstep plan, or raise before any destination write.
35
+ *
36
+ * Port of Python's `checkpoint_replay_plan`; fork builds this before
37
+ * CreateBranch so the copied snapshot is the one that was validated.
38
+ */
39
+ export declare function checkpointReplayPlan(graph: CompiledStateGraph<unknown, unknown>, source: LangGraphCheckpoint): Promise<CheckpointReplayPlan>;
40
+ /**
41
+ * Rebuild `source` in the empty thread named by `targetConfig`.
42
+ *
43
+ * `plan` is the pre-dispatch validated plan from `checkpointReplayPlan`;
44
+ * callers that validated before a side effect pass it so the copy can only
45
+ * materialize that snapshot.
46
+ */
47
+ export declare function copyCheckpoint(graph: CompiledStateGraph<unknown, unknown>, targetConfig: RunnableConfig, source: LangGraphCheckpoint, plan?: CheckpointReplayPlan): Promise<void>;
48
+ /** True when `config`'s thread has no checkpoints yet. */
49
+ export declare function destinationThreadIsEmpty(graph: CompiledStateGraph<unknown, unknown>, config: RunnableConfig): Promise<boolean>;
50
+ /**
51
+ * Copy `source` onto an empty dest thread.
52
+ *
53
+ * In-app fork already materializes dest; OE still dispatches later dest
54
+ * invokes with the source branch point. If dest already has checkpoints,
55
+ * leave it alone (Python `initialize_checkpoint_branch` parity).
56
+ */
57
+ export declare function initializeCheckpointBranch(graph: CompiledStateGraph<unknown, unknown>, config: RunnableConfig, source: LangGraphCheckpoint): Promise<void>;
58
+ //# sourceMappingURL=checkpoint_branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkpoint_branch.d.ts","sourceRoot":"","sources":["../src/checkpoint_branch.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAGlE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAiB,MAAM,sBAAsB,CAAC;AAG9E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GACnD,mBAAmB,GAAG,SAAS,CAiBjC;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,mBAAmB,GAAG,SAAS,GAEzC;IACE,oBAAoB,EAAE;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH,GACD,SAAS,CAQZ;AAgGD,8EAA8E;AAC9E,MAAM,MAAM,oBAAoB,GAAG,KAAK,CAAC;IACvC,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC3C,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACnD,OAAO,CAAC,mBAAmB,CAAC,CAsB9B;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC3C,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,oBAAoB,CAAC,CAoC/B;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC3C,YAAY,EAAE,cAAc,EAC5B,MAAM,EAAE,mBAAmB,EAC3B,IAAI,CAAC,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED,0DAA0D;AAC1D,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC3C,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,EAC3C,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAGf"}