@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
package/dist/agent.js ADDED
@@ -0,0 +1,508 @@
1
+ /**
2
+ * LangGraph BaseAgent adapter.
3
+ *
4
+ * Wraps a LangGraph compiled graph to implement the framework-neutral
5
+ * `BaseAgent` protocol from agent-engine-sdk. Execution-session setup lives in
6
+ * `execution_session.ts`; this adapter owns graph invocation and event/result
7
+ * translation.
8
+ *
9
+ * Port of `agent_engine_sdk_langgraph/agent.py`.
10
+ */
11
+ import { AIMessage, AIMessageChunk, ToolMessage, } from "@langchain/core/messages";
12
+ import { Command } from "@langchain/langgraph";
13
+ import { isDeepStrictEqual } from "node:util";
14
+ import {} from "@mongodb-js/agent-engine-sdk";
15
+ import { getLogger } from "@mongodb-js/agent-engine-runner-shared";
16
+ import {} from "./execution_session.js";
17
+ import { installDurableMessageIdentity } from "./durable_message_identity.js";
18
+ import { DurableSubgraphResolver } from "./durable_subgraphs.js";
19
+ import { iterTaskCalls } from "./deep_agent_task.js";
20
+ import { lcMessagesToPlatform, unwrapMessageValues } from "./messages.js";
21
+ import { wrapSessionForkUpdateState } from "./session_fork.js";
22
+ import { executionSession } from "./session_factory.js";
23
+ const logger = getLogger("agent_engine_sdk_langgraph.agent");
24
+ // LangGraph namespace segment shape: ``"<node_name>:<task_id>"``.
25
+ const NS_TASK_SEP = ":";
26
+ // LangChain/LangGraph pregel node names; never identify a real subagent.
27
+ const NS_SENTINEL_NAMES = new Set(["agent", "model", "tools"]);
28
+ // ---------------------------------------------------------------------------
29
+ // Internal helpers
30
+ // ---------------------------------------------------------------------------
31
+ /** Extract subagent attribution from a LangGraph subgraph namespace tuple. */
32
+ function sourceFromNamespace(namespace) {
33
+ for (let i = namespace.length - 1; i >= 0; i--) {
34
+ const segment = namespace[i];
35
+ const name = segment.split(NS_TASK_SEP, 1)[0] ?? "";
36
+ if (name !== "" && !NS_SENTINEL_NAMES.has(name))
37
+ return name;
38
+ }
39
+ return "";
40
+ }
41
+ function startEvent(task) {
42
+ return {
43
+ data: {
44
+ source: task.name,
45
+ subagent_name: task.name,
46
+ tool_call_id: task.tcId,
47
+ description: task.description,
48
+ },
49
+ event: "subagent_start",
50
+ };
51
+ }
52
+ function endEvent(task, summary = "") {
53
+ return {
54
+ data: {
55
+ source: task.name,
56
+ subagent_name: task.name,
57
+ tool_call_id: task.tcId,
58
+ summary,
59
+ },
60
+ event: "subagent_end",
61
+ };
62
+ }
63
+ function tcIdForSource(source, tasksById) {
64
+ if (source === "")
65
+ return "";
66
+ for (const task of tasksById.values()) {
67
+ if (task.name === source)
68
+ return task.tcId;
69
+ }
70
+ return "";
71
+ }
72
+ async function* onTaskCall(call, tasksById, pending) {
73
+ const placeholder = pending.get(call.subagentName);
74
+ if (placeholder !== undefined) {
75
+ pending.delete(call.subagentName);
76
+ placeholder.tcId = call.toolCallId;
77
+ if (call.description !== "" && placeholder.description === "") {
78
+ placeholder.description = call.description;
79
+ }
80
+ tasksById.set(call.toolCallId, placeholder);
81
+ yield startEvent(placeholder);
82
+ return;
83
+ }
84
+ const existing = tasksById.get(call.toolCallId);
85
+ if (existing !== undefined) {
86
+ if (call.description !== "" && existing.description === "") {
87
+ existing.description = call.description;
88
+ }
89
+ return;
90
+ }
91
+ const task = {
92
+ name: call.subagentName,
93
+ tcId: call.toolCallId,
94
+ description: call.description,
95
+ };
96
+ tasksById.set(call.toolCallId, task);
97
+ yield startEvent(task);
98
+ }
99
+ function onSourcedToken(source, tasksById, pending) {
100
+ // First sourced token signal — insert a synthetic placeholder in `pending`
101
+ // if no entry exists. Strategy A: do NOT emit subagent_start here.
102
+ for (const task of tasksById.values()) {
103
+ if (task.name === source)
104
+ return;
105
+ }
106
+ if (pending.has(source))
107
+ return;
108
+ pending.set(source, { name: source, tcId: "", description: "" });
109
+ }
110
+ async function* drainOpenTasks(tasksById, pending) {
111
+ for (const task of [...tasksById.values()]) {
112
+ yield endEvent(task);
113
+ }
114
+ for (const task of [...pending.values()]) {
115
+ yield startEvent(task);
116
+ yield endEvent(task);
117
+ }
118
+ tasksById.clear();
119
+ pending.clear();
120
+ }
121
+ function normalizeContent(content) {
122
+ if (typeof content === "string")
123
+ return content;
124
+ if (Array.isArray(content)) {
125
+ const parts = [];
126
+ for (const block of content) {
127
+ if (block !== null && typeof block === "object") {
128
+ const b = block;
129
+ if (b["type"] === "text" && typeof b["text"] === "string")
130
+ parts.push(b["text"]);
131
+ }
132
+ else if (typeof block === "string") {
133
+ parts.push(block);
134
+ }
135
+ }
136
+ return parts.join("");
137
+ }
138
+ if (content === null || content === undefined)
139
+ return "";
140
+ return String(content);
141
+ }
142
+ function findLastAiContent(messages) {
143
+ for (let i = messages.length - 1; i >= 0; i--) {
144
+ const msg = messages[i];
145
+ if (msg &&
146
+ (msg instanceof AIMessage ||
147
+ msg instanceof AIMessageChunk ||
148
+ msg.type === "ai")) {
149
+ const content = normalizeContent(msg.content);
150
+ if (content !== "")
151
+ return content;
152
+ }
153
+ }
154
+ return "";
155
+ }
156
+ /**
157
+ * Detect cancellation / abort errors. The TS equivalents of Python's
158
+ * `asyncio.CancelledError` / `GeneratorExit` are `AbortError` (DOMException)
159
+ * and any error whose name signals cancellation by upstream cancellation
160
+ * sources.
161
+ */
162
+ function isCancellationError(exc) {
163
+ if (exc instanceof Error) {
164
+ return exc.name === "AbortError" || exc.name === "CancelledError";
165
+ }
166
+ return false;
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // ExecutionResult wrapper
170
+ // ---------------------------------------------------------------------------
171
+ /**
172
+ * Concrete `ExecutionResult` — dual-mode handle.
173
+ *
174
+ * Implements `PromiseLike<AgentOutput>` (so callers can `await`) and
175
+ * `AsyncIterable<StreamEvent>` (so callers can `for await`). Mirrors the
176
+ * Python dual-shape via `__await__` + `__aiter__`.
177
+ */
178
+ class _ExecutionResult {
179
+ invokeFn;
180
+ streamFn;
181
+ constructor(invokeFn, streamFn) {
182
+ this.invokeFn = invokeFn;
183
+ this.streamFn = streamFn;
184
+ }
185
+ // PromiseLike — `await execResult` resolves to the final AgentOutput.
186
+ then(onfulfilled, onrejected) {
187
+ return this.invokeFn().then(onfulfilled, onrejected);
188
+ }
189
+ // AsyncIterable — `for await (const e of execResult)` streams StreamEvents.
190
+ [Symbol.asyncIterator]() {
191
+ return this.streamFn()[Symbol.asyncIterator]();
192
+ }
193
+ }
194
+ // ---------------------------------------------------------------------------
195
+ // LangGraphBaseAgent
196
+ // ---------------------------------------------------------------------------
197
+ /** LangGraph adapter implementing the BaseAgent protocol. */
198
+ export class LangGraphBaseAgent {
199
+ graph;
200
+ callbacks;
201
+ prepareInput;
202
+ resolveThreadIdFn;
203
+ durableSubgraphs;
204
+ constructor(graph, callbacks, prepareInput, resolveThreadId) {
205
+ this.graph = graph;
206
+ installDurableMessageIdentity(this.graph);
207
+ const durableSubgraphs = new DurableSubgraphResolver(this.graph);
208
+ this.durableSubgraphs = durableSubgraphs.hasCompiledChildren
209
+ ? durableSubgraphs
210
+ : null;
211
+ this.callbacks = callbacks ?? [];
212
+ this.prepareInput = prepareInput ?? null;
213
+ this.resolveThreadIdFn = resolveThreadId ?? null;
214
+ // The platform maps live updateState to a new session+thread, not LangGraph
215
+ // same-thread time-travel. See docs/session-fork.md.
216
+ wrapSessionForkUpdateState(this.graph, {
217
+ resolveThreadId: this.resolveThreadIdFn,
218
+ });
219
+ }
220
+ /** The wrapped compiled graph (Python `compiled_graph` parity). */
221
+ get compiledGraph() {
222
+ return this.graph;
223
+ }
224
+ /** The tenant thread-id hook, or null (Python `_resolve_thread_id` parity). */
225
+ get resolveThreadId() {
226
+ return this.resolveThreadIdFn;
227
+ }
228
+ execute(ctx, input) {
229
+ return new _ExecutionResult(() => this.invoke(ctx, input), () => this.stream(ctx, input));
230
+ }
231
+ session(ctx, input) {
232
+ return executionSession(this.graph, ctx, input, {
233
+ callbacks: this.callbacks,
234
+ prepareInput: this.prepareInput,
235
+ resolveThreadId: this.resolveThreadIdFn,
236
+ durableSubgraphs: this.durableSubgraphs,
237
+ });
238
+ }
239
+ async invoke(ctx, input) {
240
+ const session = this.session(ctx, input);
241
+ try {
242
+ return await session.runInGraphScope(() => this.invokeGraph(session));
243
+ }
244
+ finally {
245
+ await session.close();
246
+ }
247
+ }
248
+ async invokeGraph(session) {
249
+ const { graphInput, config } = await session.prepareRun();
250
+ let nextInput = graphInput;
251
+ const graphAny = this.graph;
252
+ while (true) {
253
+ const result = (await graphAny.invoke(nextInput, config));
254
+ const messages = Array.isArray(result["messages"])
255
+ ? result["messages"]
256
+ : [];
257
+ const response = findLastAiContent(messages);
258
+ const interrupt = await session.invokeInterrupt(config, response, messages);
259
+ if (interrupt instanceof Command) {
260
+ nextInput = interrupt;
261
+ continue;
262
+ }
263
+ if (interrupt !== null)
264
+ return interrupt;
265
+ const metadata = await session.complete();
266
+ return {
267
+ response: {
268
+ response,
269
+ execution_id: session.threadId,
270
+ status: "completed",
271
+ message_count: messages.length,
272
+ resumed: session.resumed,
273
+ ...(metadata === undefined ? {} : { metadata }),
274
+ },
275
+ };
276
+ }
277
+ }
278
+ async resume(ctx, input, decision) {
279
+ // Resume state lives on the context, not the caller payload.
280
+ const resumeCtx = {
281
+ ...ctx,
282
+ resume: true,
283
+ resumeData: decision,
284
+ };
285
+ return this.invoke(resumeCtx, input);
286
+ }
287
+ // ------------------------------------------------------------------------
288
+ // Streaming
289
+ // ------------------------------------------------------------------------
290
+ async *processMessagesChunk(chunk, source, tasksById, pending) {
291
+ if (!(chunk instanceof AIMessageChunk))
292
+ return;
293
+ if (source === "") {
294
+ for (const call of iterTaskCalls([chunk])) {
295
+ if (call.subagentName === "")
296
+ continue;
297
+ for await (const ev of onTaskCall(call, tasksById, pending))
298
+ yield ev;
299
+ }
300
+ }
301
+ else {
302
+ onSourcedToken(source, tasksById, pending);
303
+ }
304
+ const token = normalizeContent(chunk.content);
305
+ if (token !== "") {
306
+ yield {
307
+ data: {
308
+ content: token,
309
+ source,
310
+ tool_call_id: tcIdForSource(source, tasksById),
311
+ },
312
+ event: "token",
313
+ };
314
+ }
315
+ }
316
+ async *processAddMessagesUpdate(msgs, tasksById, pending, allMessages) {
317
+ const extracted = unwrapMessageValues(msgs);
318
+ allMessages.push(...extracted);
319
+ for (const call of iterTaskCalls(extracted)) {
320
+ if (call.subagentName === "")
321
+ continue;
322
+ for await (const ev of onTaskCall(call, tasksById, pending))
323
+ yield ev;
324
+ }
325
+ for (const msg of extracted) {
326
+ if (!(msg instanceof ToolMessage))
327
+ continue;
328
+ const tcId = msg.tool_call_id;
329
+ if (typeof tcId !== "string" || tcId === "")
330
+ continue;
331
+ const task = tasksById.get(tcId);
332
+ if (task === undefined)
333
+ continue;
334
+ tasksById.delete(tcId);
335
+ const summary = normalizeContent(msg.content ?? "");
336
+ yield endEvent(task, summary);
337
+ }
338
+ }
339
+ async *processCommandUpdate(cmd, tasksById, allMessages) {
340
+ const cmdAny = cmd;
341
+ const cmdUpdate = cmdAny.update;
342
+ if (cmdUpdate === null ||
343
+ typeof cmdUpdate !== "object" ||
344
+ Array.isArray(cmdUpdate))
345
+ return;
346
+ const cmdDict = cmdUpdate;
347
+ if (!("messages" in cmdDict))
348
+ return;
349
+ const extracted = unwrapMessageValues(cmdDict["messages"]);
350
+ allMessages.push(...extracted);
351
+ for (const msg of extracted) {
352
+ const tcId = msg.tool_call_id;
353
+ if (typeof tcId !== "string" || tcId === "")
354
+ continue;
355
+ const task = tasksById.get(tcId);
356
+ if (task === undefined)
357
+ continue;
358
+ tasksById.delete(tcId);
359
+ const summary = normalizeContent(msg.content ?? "");
360
+ yield endEvent(task, summary);
361
+ }
362
+ }
363
+ async *stream(ctx, input) {
364
+ const session = this.session(ctx, input);
365
+ try {
366
+ yield* session.iterateInGraphScope(this.streamGraph(session));
367
+ }
368
+ finally {
369
+ await session.close();
370
+ }
371
+ }
372
+ async *streamGraph(session) {
373
+ const { graphInput, config } = await session.prepareRun();
374
+ let nextInput = graphInput;
375
+ const allMessages = [];
376
+ const tasksById = new Map();
377
+ const pending = new Map();
378
+ const graphAny = this.graph;
379
+ while (true) {
380
+ const capturedInterrupts = [];
381
+ const capturedInterruptValues = new Map();
382
+ let streamError;
383
+ try {
384
+ const streamOpts = {
385
+ ...config,
386
+ streamMode: ["messages", "updates"],
387
+ subgraphs: true,
388
+ };
389
+ for await (const event of await graphAny.stream(nextInput, streamOpts)) {
390
+ // LangGraph.js emits `[namespace, streamMode, payload]` when subgraphs=true.
391
+ if (!Array.isArray(event) || event.length < 3)
392
+ continue;
393
+ const namespace = Array.isArray(event[0])
394
+ ? event[0]
395
+ : [];
396
+ const streamMode = event[1];
397
+ const eventPayload = event[2];
398
+ if (streamMode === "messages") {
399
+ const tuple = Array.isArray(eventPayload)
400
+ ? eventPayload
401
+ : [eventPayload];
402
+ const chunk = tuple[0];
403
+ const source = sourceFromNamespace(namespace);
404
+ for await (const ev of this.processMessagesChunk(chunk, source, tasksById, pending)) {
405
+ yield ev;
406
+ }
407
+ }
408
+ else if (streamMode === "updates") {
409
+ if (eventPayload === null ||
410
+ typeof eventPayload !== "object" ||
411
+ Array.isArray(eventPayload)) {
412
+ logger.warn(`Unexpected non-dict updates payload: ${typeof eventPayload}`);
413
+ continue;
414
+ }
415
+ const updateDict = eventPayload;
416
+ const interrupts = updateDict["__interrupt__"];
417
+ if (Array.isArray(interrupts)) {
418
+ // A nested subgraph's interrupt projects onto its parent, so the
419
+ // same native id legitimately streams twice (child + root) with
420
+ // an identical value. Keep one copy. A repeated id with a
421
+ // different value stays in the list for interruptSnapshot to
422
+ // reject as conflicting framework state.
423
+ for (const interrupt of interrupts) {
424
+ const id = interrupt.id;
425
+ if (typeof id === "string") {
426
+ const previous = capturedInterruptValues.get(id);
427
+ const value = interrupt.value;
428
+ if (previous !== undefined &&
429
+ isDeepStrictEqual(previous, value)) {
430
+ continue;
431
+ }
432
+ capturedInterruptValues.set(id, value);
433
+ }
434
+ capturedInterrupts.push(interrupt);
435
+ }
436
+ }
437
+ for (const nodeOutput of Object.values(updateDict)) {
438
+ // `Command` IS an object, so it must be checked BEFORE the generic
439
+ // object branch below — otherwise Command instances fall into the
440
+ // `'messages' in node` check (which is false for Command, whose
441
+ // payload lives under `.update`) and their messages are silently
442
+ // dropped. See tests/agent.test.ts (Command.update coverage).
443
+ if (nodeOutput instanceof Command) {
444
+ for await (const ev of this.processCommandUpdate(nodeOutput, tasksById, allMessages)) {
445
+ yield ev;
446
+ }
447
+ }
448
+ else if (nodeOutput !== null &&
449
+ typeof nodeOutput === "object" &&
450
+ !Array.isArray(nodeOutput)) {
451
+ const node = nodeOutput;
452
+ if ("messages" in node) {
453
+ for await (const ev of this.processAddMessagesUpdate(node["messages"], tasksById, pending, allMessages)) {
454
+ yield ev;
455
+ }
456
+ }
457
+ }
458
+ }
459
+ }
460
+ }
461
+ }
462
+ catch (exc) {
463
+ streamError = exc;
464
+ }
465
+ if (streamError !== undefined) {
466
+ // Mirror Python's `except (GeneratorExit, asyncio.CancelledError): raise`:
467
+ // skip the drain on cancellation so we don't try to yield while the
468
+ // surrounding task is being torn down.
469
+ if (!isCancellationError(streamError)) {
470
+ for await (const ev of drainOpenTasks(tasksById, pending))
471
+ yield ev;
472
+ }
473
+ throw streamError;
474
+ }
475
+ const interrupt = await session.streamInterrupt(config, capturedInterrupts, allMessages);
476
+ if (interrupt instanceof Command) {
477
+ nextInput = interrupt;
478
+ continue;
479
+ }
480
+ if (interrupt !== null) {
481
+ yield interrupt;
482
+ return;
483
+ }
484
+ break;
485
+ }
486
+ for await (const ev of drainOpenTasks(tasksById, pending))
487
+ yield ev;
488
+ if (allMessages.length === 0) {
489
+ throw new Error("Graph completed without producing messages");
490
+ }
491
+ const response = findLastAiContent(allMessages);
492
+ const metadata = await session.complete();
493
+ yield {
494
+ data: {
495
+ response,
496
+ // Convert to platform Messages ({role, content, ...}) so the runner-shared
497
+ // AER path receives the expected shape — matches Python's
498
+ // `lc_messages_to_platform(...)` before emitting the result (agent.py).
499
+ messages: lcMessagesToPlatform(allMessages),
500
+ message_count: allMessages.length,
501
+ resumed: session.resumed,
502
+ ...(metadata === undefined ? {} : { metadata }),
503
+ },
504
+ event: "result",
505
+ };
506
+ }
507
+ }
508
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * AgentEngineToolSandboxBackend — canonical name for AgentEngineToolPodBackend.
3
+ *
4
+ * This module exists so agent authors can use the stable sandbox terminology
5
+ * without depending on the legacy AER/ToolPod names. The implementation is
6
+ * identical; both names refer to the same class.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // The package `exports` map only exposes the root, so import from there.
11
+ * import { AgentEngineToolSandboxBackend } from "@mongodb-js/agent-engine-sdk-langgraph";
12
+ * ```
13
+ */
14
+ export { AgentEngineToolPodBackend as AgentEngineToolSandboxBackend } from "./toolpod.js";
15
+ //# sourceMappingURL=tool_sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool_sandbox.d.ts","sourceRoot":"","sources":["../../src/backends/tool_sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,yBAAyB,IAAI,6BAA6B,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * AgentEngineToolSandboxBackend — canonical name for AgentEngineToolPodBackend.
3
+ *
4
+ * This module exists so agent authors can use the stable sandbox terminology
5
+ * without depending on the legacy AER/ToolPod names. The implementation is
6
+ * identical; both names refer to the same class.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // The package `exports` map only exposes the root, so import from there.
11
+ * import { AgentEngineToolSandboxBackend } from "@mongodb-js/agent-engine-sdk-langgraph";
12
+ * ```
13
+ */
14
+ export { AgentEngineToolPodBackend as AgentEngineToolSandboxBackend } from "./toolpod.js";
15
+ //# sourceMappingURL=tool_sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool_sandbox.js","sourceRoot":"","sources":["../../src/backends/tool_sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,yBAAyB,IAAI,6BAA6B,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,68 @@
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 type { EditResult, ExecuteResponse, FileDownloadResponse, FileUploadResponse, GlobResult, GrepResult, LsResult, ReadRawResult, ReadResult, SandboxBackendProtocolV2, WriteResult } from "deepagents";
22
+ /**
23
+ * Backend that routes every operation through Atlas Agent Engine's secure path. Each
24
+ * method delegates to `SecureToolWrapper.executeTool`, which sends the request
25
+ * to the OE for policy approval and audit logging before it runs in the Tool
26
+ * Pod.
27
+ */
28
+ export declare class AgentEngineToolPodBackend implements SandboxBackendProtocolV2 {
29
+ readonly id = "agent-engine-toolpod";
30
+ /**
31
+ * Execute a Tool Pod handler through the secure wrapper. Returns the wire
32
+ * result on success, or a classified `[RETRYABLE]`/`[NON-RETRYABLE]` error
33
+ * string on failure (exceptions are logged and translated, never rethrown).
34
+ */
35
+ private call;
36
+ ls(path: string): Promise<LsResult>;
37
+ read(filePath: string, offset?: number, limit?: number): Promise<ReadResult>;
38
+ /**
39
+ * Raw read is not backed by a dedicated wire handler; the Tool Pod exposes
40
+ * only line-oriented `filesystem_read`. We wrap its text content in a v2
41
+ * FileData so binary-unaware callers still work. Genuine binary reads should
42
+ * use `downloadFiles`, which carries raw bytes base64-encoded.
43
+ */
44
+ readRaw(filePath: string): Promise<ReadRawResult>;
45
+ grep(pattern: string, path?: string | null, glob?: string | null): Promise<GrepResult>;
46
+ glob(pattern: string, path?: string): Promise<GlobResult>;
47
+ write(filePath: string, content: string): Promise<WriteResult>;
48
+ edit(filePath: string, oldString: string, newString: string, replaceAll?: boolean): Promise<EditResult>;
49
+ execute(command: string): Promise<ExecuteResponse>;
50
+ /**
51
+ * Download a single path. Never throws: failures become error responses.
52
+ */
53
+ private downloadOne;
54
+ /**
55
+ * Download files via the audited `filesystem_download` handler — one call per
56
+ * path so each is policy-checked and logged independently — then base64-decode
57
+ * the `content_base64` field into raw bytes. Responses preserve input order;
58
+ * on failure `content` is null and `error` carries a classified message.
59
+ *
60
+ * Native-mode batches fan out on a bounded worker pool so skills loading
61
+ * pays one round-trip of latency instead of a sum. Durable attempts stay
62
+ * sequential: unkeyed activities are exclusive under the attempt gate, and
63
+ * overlapping them raises CONFLICT.
64
+ */
65
+ downloadFiles(paths: string[]): Promise<FileDownloadResponse[]>;
66
+ uploadFiles(files: Array<[string, Uint8Array]>): Promise<FileUploadResponse[]>;
67
+ }
68
+ //# sourceMappingURL=toolpod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolpod.d.ts","sourceRoot":"","sources":["../../src/backends/toolpod.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAEf,oBAAoB,EAEpB,kBAAkB,EAClB,UAAU,EAEV,UAAU,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,wBAAwB,EACxB,WAAW,EACZ,MAAM,YAAY,CAAC;AA8HpB;;;;;GAKG;AACH,qBAAa,yBAA0B,YAAW,wBAAwB;IACxE,QAAQ,CAAC,EAAE,0BAA0B;IAErC;;;;OAIG;YACW,IAAI;IAyBZ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgBnC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,KAAK,SAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAoB3E;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAajD,IAAI,CACR,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO,CAAC,UAAU,CAAC;IAsChB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBtD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAmB9D,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,UAAQ,GACjB,OAAO,CAAC,UAAU,CAAC;IAyBhB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAuCxD;;OAEG;YACW,WAAW;IA0BzB;;;;;;;;;;OAUG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAgB/D,WAAW,CACf,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,GACjC,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAOjC"}