@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,400 @@
1
+ /** OE-attempt-scoped LangGraph session behavior. */
2
+ import { create, equals } from "@bufbuild/protobuf";
3
+ import { isDeepStrictEqual } from "node:util";
4
+ import { Command, GraphInterrupt, isCommand, isGraphInterrupt, } from "@langchain/langgraph";
5
+ import { runWithOperationPathResolver, ActivityOutcomeKind, ActivityKind, ActivityContextSchema, ActivitySuspensionSchema, OperationPathSchema, OperationPathSegmentSchema, StepSuspensionEntrySchema, WorkflowClient, WorkflowIdentitySchema, currentStepOrdinal, buildActivityCommand, finalizeCurrentStepSuspensionsCommand, getCurrentOeUrl, getCurrentUserId, getCurrentWrapper, interruptedActivities, recordInterruptedActivity, recordObservedActivity, setActivityReconstructionIds, unwrapActivityOutcome, } from "@mongodb-js/agent-engine-runner-shared";
6
+ import { ExecutionSession, } from "./execution_session.js";
7
+ import { interruptSnapshot, invokeSuspendOutput, streamHitlSuspendEvent, } from "./suspend.js";
8
+ import { assignMissingGraphInputMessageIds } from "./messages.js";
9
+ import { UnsupportedDurableGraphError } from "./platform_checkpointer.js";
10
+ const FRAMEWORK_INTERRUPT_REASON = "agent_interrupt";
11
+ const DIRECT_INTERRUPT_ACTIVITY_NAME = "langgraph.interrupt";
12
+ function validateDurableInterruptNumbers(value) {
13
+ if (typeof value === "number" &&
14
+ Number.isInteger(value) &&
15
+ !Number.isSafeInteger(value)) {
16
+ throw new UnsupportedDurableGraphError("durable interrupt integer exceeds the exact ProtoJSON range");
17
+ }
18
+ if (Array.isArray(value)) {
19
+ for (const item of value)
20
+ validateDurableInterruptNumbers(item);
21
+ }
22
+ else if (value !== null && typeof value === "object") {
23
+ for (const item of Object.values(value))
24
+ validateDurableInterruptNumbers(item);
25
+ }
26
+ }
27
+ function uniqueInterrupts(captured) {
28
+ const byId = new Map();
29
+ for (const raw of captured) {
30
+ for (const interrupt of interruptSnapshot([raw])) {
31
+ validateDurableInterruptNumbers(interrupt.value);
32
+ const previous = byId.get(interrupt.id);
33
+ if (previous && !isDeepStrictEqual(previous.value, interrupt.value)) {
34
+ throw new UnsupportedDurableGraphError("LangGraph returned conflicting values for an interrupt id");
35
+ }
36
+ byId.set(interrupt.id, interrupt);
37
+ }
38
+ }
39
+ return [...byId.values()];
40
+ }
41
+ function pendingInterrupts(state) {
42
+ // Parent snapshots can repeat a subgraph interrupt, so visit children first
43
+ // and keep each native id only once.
44
+ const pending = [];
45
+ const valueById = new Map();
46
+ const visit = (snapshot) => {
47
+ for (const task of snapshot.tasks ?? []) {
48
+ const taskState = task.state;
49
+ if (taskState !== undefined &&
50
+ taskState !== null &&
51
+ typeof taskState === "object" &&
52
+ "tasks" in taskState) {
53
+ visit(taskState);
54
+ }
55
+ for (const interrupt of uniqueInterrupts(task.interrupts ?? [])) {
56
+ const previous = valueById.get(interrupt.id);
57
+ if (previous === undefined) {
58
+ valueById.set(interrupt.id, interrupt.value);
59
+ pending.push(interrupt);
60
+ }
61
+ else if (!isDeepStrictEqual(previous, interrupt.value)) {
62
+ throw new UnsupportedDurableGraphError("LangGraph returned conflicting values for an interrupt id");
63
+ }
64
+ }
65
+ }
66
+ };
67
+ visit(state);
68
+ return pending;
69
+ }
70
+ function isDirectInterruptActivity(activity) {
71
+ const segments = activity.command.position?.operationPath?.segments ?? [];
72
+ return (activity.command.activityName === DIRECT_INTERRUPT_ACTIVITY_NAME &&
73
+ segments.length === 1 &&
74
+ segments[0]?.name.startsWith("langgraph.task:") === true);
75
+ }
76
+ function recordDirectInterrupts(attempt, state) {
77
+ const currentActivities = interruptedActivities(currentStepOrdinal());
78
+ const localIds = new Set(currentActivities
79
+ .filter((activity) => !isDirectInterruptActivity(activity))
80
+ .flatMap((activity) => isGraphInterrupt(activity.controlFlow)
81
+ ? activity.controlFlow.interrupts.map((interrupt) => interrupt.id)
82
+ : []));
83
+ // Registered local tools already carry their admitted ActivityCommand.
84
+ // Do not synthesize a second root interrupt activity for the checkpoint view.
85
+ const existing = new Map(currentActivities
86
+ .filter(isDirectInterruptActivity)
87
+ .map((activity) => [positionKey(activity.command.position), activity]));
88
+ const previouslySettled = new Set(existing.keys());
89
+ for (const task of state.tasks ?? []) {
90
+ if (!task.interrupts?.length)
91
+ continue;
92
+ const path = task.path;
93
+ if (!path?.length ||
94
+ path.some((part) => typeof part !== "string" &&
95
+ !(typeof part === "number" && Number.isSafeInteger(part)))) {
96
+ throw new UnsupportedDurableGraphError("durable direct interrupt requires a stable LangGraph task path");
97
+ }
98
+ // JS putWrites receives only the regenerated task ID. The quiescent
99
+ // snapshot exposes the stable path Python receives at its write boundary.
100
+ const direct = uniqueInterrupts(task.interrupts).filter((interrupt) => !localIds.has(interrupt.id));
101
+ for (const [index, interrupt] of direct.entries()) {
102
+ const command = buildActivityCommand({
103
+ attempt,
104
+ kind: ActivityKind.TOOL,
105
+ name: DIRECT_INTERRUPT_ACTIVITY_NAME,
106
+ activityOrdinal: index + 1,
107
+ operationPath: create(OperationPathSchema, {
108
+ segments: [
109
+ create(OperationPathSegmentSchema, {
110
+ name: `langgraph.task:${JSON.stringify(path)}`,
111
+ ordinal: 1n,
112
+ }),
113
+ ],
114
+ }),
115
+ semanticInput: { value: interrupt.value },
116
+ });
117
+ const key = positionKey(command.position);
118
+ if (previouslySettled.has(key)) {
119
+ // A second graph iteration reached another interrupt before this task
120
+ // finished. Native IDs and even payloads may be identical at both calls.
121
+ throw new UnsupportedDurableGraphError("durable workflow does not support multiple sequential direct interrupts in one graph task");
122
+ }
123
+ const previous = existing.get(key);
124
+ if (previous) {
125
+ if (!isGraphInterrupt(previous.controlFlow) ||
126
+ previous.controlFlow.interrupts[0]?.id !== interrupt.id ||
127
+ !isDeepStrictEqual(previous.controlFlow.interrupts[0]?.value, interrupt.value)) {
128
+ throw new UnsupportedDurableGraphError("durable workflow does not support multiple sequential direct interrupts in one graph task");
129
+ }
130
+ continue;
131
+ }
132
+ const controlFlow = new GraphInterrupt([interrupt]);
133
+ if (command.position === undefined) {
134
+ throw new UnsupportedDurableGraphError("durable interrupt requires an activity position");
135
+ }
136
+ recordObservedActivity(command.position);
137
+ recordInterruptedActivity(command, controlFlow);
138
+ existing.set(key, { command, controlFlow });
139
+ }
140
+ }
141
+ }
142
+ function positionKey(position) {
143
+ if (position === undefined) {
144
+ throw new UnsupportedDurableGraphError("durable interrupt settlement returned an entry without a position");
145
+ }
146
+ return JSON.stringify([
147
+ position.stepOrdinal.toString(),
148
+ (position.operationPath?.segments ?? []).map((segment) => [
149
+ segment.name,
150
+ segment.ordinal.toString(),
151
+ ]),
152
+ position.activityOrdinal.toString(),
153
+ ]);
154
+ }
155
+ function suspensionEntry(activity, interrupt) {
156
+ const command = activity.command;
157
+ return create(StepSuspensionEntrySchema, {
158
+ position: command.position,
159
+ activityKind: command.activityKind,
160
+ activityName: command.activityName,
161
+ semanticInput: command.semanticInput,
162
+ suspension: create(ActivitySuspensionSchema, {
163
+ reason: FRAMEWORK_INTERRUPT_REASON,
164
+ context: {
165
+ value: interrupt.value,
166
+ },
167
+ }),
168
+ });
169
+ }
170
+ function validateSettledEntries(attempt, requested, entries) {
171
+ if (entries.length !== requested.length) {
172
+ throw new UnsupportedDurableGraphError("durable interrupt settlement returned an incomplete frontier");
173
+ }
174
+ const requestedPositions = new Set(requested.map((entry) => positionKey(entry.position)));
175
+ const outcomes = new Map();
176
+ for (const entry of entries) {
177
+ const key = positionKey(entry.position);
178
+ if (!requestedPositions.has(key) || outcomes.has(key)) {
179
+ throw new UnsupportedDurableGraphError("durable interrupt settlement returned an unknown or duplicate position");
180
+ }
181
+ if (entry.outcome === undefined || entry.outcome.activityId.length === 0) {
182
+ throw new UnsupportedDurableGraphError("durable interrupt settlement returned an invalid activity outcome");
183
+ }
184
+ if (!attempt.workflowIdentity ||
185
+ !entry.outcome.workflowIdentity ||
186
+ !equals(WorkflowIdentitySchema, attempt.workflowIdentity, entry.outcome.workflowIdentity)) {
187
+ throw new UnsupportedDurableGraphError("durable interrupt settlement returned a cross-workflow outcome");
188
+ }
189
+ if (entry.outcome.attemptId !== attempt.attemptId ||
190
+ entry.outcome.fencingToken !== attempt.fencingToken) {
191
+ throw new UnsupportedDurableGraphError("durable interrupt settlement returned a cross-attempt outcome");
192
+ }
193
+ outcomes.set(key, entry.outcome);
194
+ }
195
+ const suspended = [...outcomes.values()].map((outcome) => outcome.outcomeKind === ActivityOutcomeKind.SUSPENDED);
196
+ if (suspended.some(Boolean) && !suspended.every(Boolean)) {
197
+ throw new UnsupportedDurableGraphError("durable interrupt settlement mixed suspended and resolved outcomes");
198
+ }
199
+ return outcomes;
200
+ }
201
+ export class DurableSession extends ExecutionSession {
202
+ resumed;
203
+ attempt;
204
+ checkpointer;
205
+ executionId;
206
+ resumeActivityIds;
207
+ resumeFrontierSettled = false;
208
+ constructor(graph, ctx, input, options, execution) {
209
+ super(graph, ctx, input, options);
210
+ this.attempt = execution.attempt;
211
+ this.checkpointer = execution.checkpointer;
212
+ this.executionId = execution.executionId;
213
+ this.durableSubgraphs?.validate();
214
+ this.resumed = ctx.resume === true;
215
+ if (this.resumed) {
216
+ if (ctx.resumeData === null ||
217
+ typeof ctx.resumeData !== "object" ||
218
+ Array.isArray(ctx.resumeData)) {
219
+ throw new UnsupportedDurableGraphError("durable resume requires an activity-id-keyed resume map");
220
+ }
221
+ const activityIds = Object.keys(ctx.resumeData);
222
+ if (activityIds.length === 0 ||
223
+ activityIds.some((id) => id.length === 0)) {
224
+ throw new UnsupportedDurableGraphError("durable resume requires a non-empty activity-id-keyed resume map");
225
+ }
226
+ this.resumeActivityIds = new Set(activityIds);
227
+ }
228
+ else {
229
+ this.resumeActivityIds = new Set();
230
+ }
231
+ }
232
+ async prepareRun() {
233
+ setActivityReconstructionIds([...this.resumeActivityIds]);
234
+ // Replacement attempts rebuild the original turn, including tenant hooks.
235
+ const prepareContext = this.attempt.replayMode === true && this.prepareInput !== null
236
+ ? {
237
+ ...this.ctx,
238
+ resume: false,
239
+ resumeData: null,
240
+ metadata: null,
241
+ }
242
+ : this.ctx;
243
+ const config = {
244
+ ...this.baseConfig(),
245
+ durability: "sync",
246
+ };
247
+ const freshInput = this.freshGraphInput(prepareContext);
248
+ if (isCommand(freshInput)) {
249
+ throw new UnsupportedDurableGraphError("Command input is not supported on durable_workflow sessions");
250
+ }
251
+ // Preserve Python's unindexed default message and indexed hook messages.
252
+ const graphInput = assignMissingGraphInputMessageIds(freshInput, this.prepareInput === null
253
+ ? () => `durable-input:${this.executionId}`
254
+ : (index) => `durable-input:${this.executionId}:${index}`);
255
+ await this.checkpointer.seedPreviousState(this.attempt, config);
256
+ return { graphInput, config };
257
+ }
258
+ async invokeInterrupt(config, response, messages) {
259
+ const result = await this.settlePendingInterrupts(config, []);
260
+ if (result === null || result instanceof Command)
261
+ return result;
262
+ return invokeSuspendOutput({
263
+ response,
264
+ threadId: this.threadId,
265
+ checkpointId: undefined,
266
+ interruptValues: result.map((item) => item.value),
267
+ interrupts: result,
268
+ messageCount: messages.length,
269
+ resumed: this.resumed,
270
+ });
271
+ }
272
+ async streamInterrupt(config, captured, messages) {
273
+ const result = await this.settlePendingInterrupts(config, captured);
274
+ if (result === null || result instanceof Command)
275
+ return result;
276
+ return streamHitlSuspendEvent({
277
+ interrupts: result,
278
+ checkpointId: undefined,
279
+ resumed: this.resumed,
280
+ messages,
281
+ });
282
+ }
283
+ async settlePendingInterrupts(config, captured) {
284
+ const graph = this.graph;
285
+ const state = await graph.getState(config, { subgraphs: true });
286
+ const pending = pendingInterrupts(state);
287
+ if (pending.length === 0) {
288
+ if ((state.next?.length ?? 0) > 0 || captured.length > 0) {
289
+ throw new UnsupportedDurableGraphError("durable workflow does not support LangGraph " +
290
+ "interrupt_before or interrupt_after pauses");
291
+ }
292
+ return null;
293
+ }
294
+ recordDirectInterrupts(this.attempt, state);
295
+ const activitiesByNativeId = new Map();
296
+ for (const activity of interruptedActivities(currentStepOrdinal())) {
297
+ if (!isGraphInterrupt(activity.controlFlow))
298
+ continue;
299
+ const native = activity.controlFlow.interrupts;
300
+ if (native.length !== 1) {
301
+ throw new UnsupportedDurableGraphError("a durable interrupt activity must contain exactly one native interrupt");
302
+ }
303
+ const id = native[0]?.id;
304
+ if (!id || activitiesByNativeId.has(id)) {
305
+ throw new UnsupportedDurableGraphError("durable native interrupt has an invalid or duplicate identity");
306
+ }
307
+ activitiesByNativeId.set(id, activity);
308
+ }
309
+ const interruptByPosition = new Map();
310
+ const suspensions = pending.map((interrupt) => {
311
+ const activity = activitiesByNativeId.get(interrupt.id);
312
+ if (activity === undefined) {
313
+ throw new UnsupportedDurableGraphError("durable native interrupt checkpoint did not register an activity");
314
+ }
315
+ const entry = suspensionEntry(activity, interrupt);
316
+ const key = positionKey(entry.position);
317
+ if (interruptByPosition.has(key)) {
318
+ throw new UnsupportedDurableGraphError("durable native interrupts resolved to a duplicate activity position");
319
+ }
320
+ interruptByPosition.set(key, interrupt);
321
+ return entry;
322
+ });
323
+ const oeUrl = getCurrentOeUrl();
324
+ if (!oeUrl) {
325
+ throw new UnsupportedDurableGraphError("durable interrupt requires an orchestration engine URL");
326
+ }
327
+ const entries = await new WorkflowClient(oeUrl).finalizeStep(finalizeCurrentStepSuspensionsCommand(this.attempt, suspensions));
328
+ const outcomes = validateSettledEntries(this.attempt, suspensions, entries);
329
+ const settled = entries.map((entry) => {
330
+ const key = positionKey(entry.position);
331
+ const interrupt = interruptByPosition.get(key);
332
+ const outcome = outcomes.get(key);
333
+ if (interrupt === undefined || outcome === undefined) {
334
+ throw new UnsupportedDurableGraphError("durable interrupt settlement could not join its activity position");
335
+ }
336
+ return { interrupt, outcome };
337
+ });
338
+ const settledIds = new Set(settled.map(({ outcome }) => outcome.activityId));
339
+ if (settledIds.size !== settled.length) {
340
+ throw new UnsupportedDurableGraphError("durable interrupt settlement returned duplicate activity ids");
341
+ }
342
+ if (settled[0]?.outcome.outcomeKind === ActivityOutcomeKind.SUSPENDED) {
343
+ return interruptSnapshot(settled.map(({ interrupt, outcome }) => ({
344
+ id: outcome.activityId,
345
+ value: interrupt.value,
346
+ })));
347
+ }
348
+ const wrapper = getCurrentWrapper();
349
+ const durableMemory = wrapper?.durableMemory;
350
+ // Earlier waits replay before the frontier named by this resume request.
351
+ const targetsRequestedFrontier = this.resumed &&
352
+ [...settledIds].some((id) => this.resumeActivityIds.has(id));
353
+ if (targetsRequestedFrontier &&
354
+ (settledIds.size !== this.resumeActivityIds.size ||
355
+ [...settledIds].some((id) => !this.resumeActivityIds.has(id)))) {
356
+ throw new UnsupportedDurableGraphError("durable resume map does not match the resolved suspension frontier");
357
+ }
358
+ if (targetsRequestedFrontier) {
359
+ this.resumeFrontierSettled = true;
360
+ }
361
+ // Sync only after the frontier is accepted: a rejected resume must not
362
+ // leave durable Memory side effects behind.
363
+ if (durableMemory) {
364
+ const memoryClient = new WorkflowClient(oeUrl);
365
+ for (const { interrupt, outcome } of settled) {
366
+ const activity = activitiesByNativeId.get(interrupt.id);
367
+ if (activity === undefined || !isDirectInterruptActivity(activity)) {
368
+ continue;
369
+ }
370
+ await durableMemory.synchronizeTool(memoryClient, create(ActivityContextSchema, {
371
+ workflowIdentity: outcome.workflowIdentity,
372
+ activityId: outcome.activityId,
373
+ attemptId: outcome.attemptId,
374
+ fencingToken: outcome.fencingToken,
375
+ }), unwrapActivityOutcome(outcome), getCurrentUserId(), `${DIRECT_INTERRUPT_ACTIVITY_NAME}:${outcome.activityId}`, DIRECT_INTERRUPT_ACTIVITY_NAME);
376
+ }
377
+ }
378
+ return new Command({
379
+ resume: Object.fromEntries(settled.map(({ interrupt, outcome }) => [
380
+ interrupt.id,
381
+ unwrapActivityOutcome(outcome),
382
+ ])),
383
+ });
384
+ }
385
+ complete() {
386
+ if (this.resumed && !this.resumeFrontierSettled) {
387
+ throw new UnsupportedDurableGraphError("durable resume did not reconstruct its suspension frontier");
388
+ }
389
+ return this.checkpointer.completeExecution(this.attempt);
390
+ }
391
+ async close() {
392
+ await this.checkpointer.releaseScratch(this.attempt);
393
+ }
394
+ runInGraphScope(fn) {
395
+ return this.durableSubgraphs === null
396
+ ? fn()
397
+ : runWithOperationPathResolver(this.durableSubgraphs.resolve, fn);
398
+ }
399
+ }
400
+ //# sourceMappingURL=durable_session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable_session.js","sourceRoot":"","sources":["../src/durable_session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** Translate LangGraph checkpoint namespaces into durable operation paths. */
2
+ import { CompiledStateGraph } from "@langchain/langgraph";
3
+ import type { ChildOperationBoundary } from "@mongodb-js/agent-engine-runner-shared";
4
+ export declare class DurableSubgraphResolver {
5
+ private readonly topology;
6
+ private readonly validationError;
7
+ constructor(graph: CompiledStateGraph<unknown, unknown>);
8
+ get hasCompiledChildren(): boolean;
9
+ validate(): void;
10
+ resolve: () => readonly ChildOperationBoundary[];
11
+ resolveNamespace(namespace: string): readonly ChildOperationBoundary[];
12
+ }
13
+ //# sourceMappingURL=durable_subgraphs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable_subgraphs.d.ts","sourceRoot":"","sources":["../src/durable_subgraphs.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,OAAO,EAAE,kBAAkB,EAAa,MAAM,sBAAsB,CAAC;AAErE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAqBrF,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;gBAEpC,KAAK,EAAE,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;IAMvD,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED,QAAQ,IAAI,IAAI;IAMhB,OAAO,QAAO,SAAS,sBAAsB,EAAE,CAS7C;IAEF,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,sBAAsB,EAAE;CA6BvE"}
@@ -0,0 +1,82 @@
1
+ /** Translate LangGraph checkpoint namespaces into durable operation paths. */
2
+ import { CompiledStateGraph, getConfig } from "@langchain/langgraph";
3
+ import { UnsupportedDurableGraphError } from "./platform_checkpointer.js";
4
+ export class DurableSubgraphResolver {
5
+ topology;
6
+ validationError;
7
+ constructor(graph) {
8
+ const errors = [];
9
+ this.topology = discover(graph, [], new Set(), errors);
10
+ this.validationError = errors[0] ?? null;
11
+ }
12
+ get hasCompiledChildren() {
13
+ return this.topology.children.size > 0;
14
+ }
15
+ validate() {
16
+ if (this.validationError !== null) {
17
+ throw new UnsupportedDurableGraphError(this.validationError);
18
+ }
19
+ }
20
+ resolve = () => {
21
+ const config = getConfig();
22
+ const namespace = config?.configurable?.["checkpoint_ns"] ?? "";
23
+ if (typeof namespace !== "string") {
24
+ throw new UnsupportedDurableGraphError("LangGraph checkpoint namespace must be a string");
25
+ }
26
+ return this.resolveNamespace(namespace);
27
+ };
28
+ resolveNamespace(namespace) {
29
+ if (namespace === "")
30
+ return [];
31
+ let topology = this.topology;
32
+ const boundaries = [];
33
+ const segments = namespace.split("|");
34
+ for (const [index, segment] of segments.entries()) {
35
+ const separator = segment.indexOf(":");
36
+ const name = separator < 0 ? "" : segment.slice(0, separator);
37
+ const occurrenceKey = separator < 0 ? "" : segment.slice(separator + 1);
38
+ if (name === "" ||
39
+ occurrenceKey === "" ||
40
+ !topology.nodeNames.has(name)) {
41
+ throw unsupportedNamespace(namespace);
42
+ }
43
+ const child = topology.children.get(name);
44
+ if (child === undefined) {
45
+ if (index !== segments.length - 1) {
46
+ throw unsupportedNamespace(namespace);
47
+ }
48
+ break;
49
+ }
50
+ boundaries.push({ name, occurrenceKey });
51
+ topology = child;
52
+ }
53
+ return boundaries;
54
+ }
55
+ }
56
+ function discover(graph, path, ancestors, errors) {
57
+ if (ancestors.has(graph)) {
58
+ errors.push(`compiled subgraph topology at ${path.join("/")} is cyclic and unsupported`);
59
+ return { nodeNames: new Set(), children: new Map() };
60
+ }
61
+ const nodes = graph.builder?.nodes ?? {};
62
+ const descendants = new Set(ancestors);
63
+ descendants.add(graph);
64
+ const children = new Map();
65
+ for (const [name, node] of Object.entries(nodes)) {
66
+ if (!(node.runnable instanceof CompiledStateGraph))
67
+ continue;
68
+ const childPath = [...path, name];
69
+ if (node.runnable.checkpointer !== undefined) {
70
+ errors.push(`compiled subgraph ${JSON.stringify(childPath.join("/"))} must use ` +
71
+ "the default checkpointer=undefined; checkpointer=true, " +
72
+ "checkpointer=false, and independent child checkpointers are not " +
73
+ "supported by durable_workflow");
74
+ }
75
+ children.set(name, discover(node.runnable, childPath, descendants, errors));
76
+ }
77
+ return { nodeNames: new Set(Object.keys(nodes)), children };
78
+ }
79
+ function unsupportedNamespace(namespace) {
80
+ return new UnsupportedDurableGraphError(`unsupported LangGraph checkpoint namespace ${JSON.stringify(namespace)}`);
81
+ }
82
+ //# sourceMappingURL=durable_subgraphs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable_subgraphs.js","sourceRoot":"","sources":["../src/durable_subgraphs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /** Durable replay identity for platform-executed LangGraph tools. */
2
+ import { type createSecureToolFunction } from "@mongodb-js/agent-engine-runner-shared";
3
+ type SecureToolFunction = ReturnType<typeof createSecureToolFunction>;
4
+ /**
5
+ * Give a replayed platform tool result the same LangGraph message ID as its
6
+ * first attempt, preventing the messages reducer from appending it twice.
7
+ * The model-provided tool-call ID remains unchanged and continues to correlate
8
+ * the ToolMessage with the AIMessage that requested it.
9
+ */
10
+ export declare function withDurableToolResultIdentity(wrapped: SecureToolFunction, toolName: string): SecureToolFunction;
11
+ export {};
12
+ //# sourceMappingURL=durable_tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable_tools.d.ts","sourceRoot":"","sources":["../src/durable_tools.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAGrE,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,wCAAwC,CAAC;AAIhD,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAatE;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,MAAM,GACf,kBAAkB,CAsBpB"}
@@ -0,0 +1,41 @@
1
+ /** Durable replay identity for platform-executed LangGraph tools. */
2
+ import { ToolMessage } from "@langchain/core/messages";
3
+ import { currentAttemptContext, currentStepOrdinal, } from "@mongodb-js/agent-engine-runner-shared";
4
+ import { toToolMessageContent } from "./messages.js";
5
+ function durableToolResultMessageId(toolCallId) {
6
+ const attempt = currentAttemptContext();
7
+ if (attempt === null)
8
+ return null;
9
+ const { executionId } = attempt.workflowIdentity;
10
+ return (`durable-tool-result:${executionId}:` +
11
+ `${currentStepOrdinal()}:${toolCallId}`);
12
+ }
13
+ /**
14
+ * Give a replayed platform tool result the same LangGraph message ID as its
15
+ * first attempt, preventing the messages reducer from appending it twice.
16
+ * The model-provided tool-call ID remains unchanged and continues to correlate
17
+ * the ToolMessage with the AIMessage that requested it.
18
+ */
19
+ export function withDurableToolResultIdentity(wrapped, toolName) {
20
+ return async (kwargs, config) => {
21
+ const result = await wrapped(kwargs, config);
22
+ const toolCallId = config?.toolCall?.id ?? config?.configurable?.["tool_call_id"];
23
+ if (typeof toolCallId !== "string" || !toolCallId)
24
+ return result;
25
+ const messageId = durableToolResultMessageId(toolCallId);
26
+ if (messageId === null)
27
+ return result;
28
+ const [content, artifact] = result;
29
+ const message = new ToolMessage({
30
+ content: toToolMessageContent(content),
31
+ artifact,
32
+ tool_call_id: toolCallId,
33
+ name: toolName,
34
+ id: messageId,
35
+ });
36
+ // content_and_artifact unwraps this tuple, then returns the ToolMessage
37
+ // unchanged because the artifact is already attached to the message.
38
+ return [message, null];
39
+ };
40
+ }
41
+ //# sourceMappingURL=durable_tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durable_tools.js","sourceRoot":"","sources":["../src/durable_tools.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EACL,qBAAqB,EACrB,kBAAkB,GAEnB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAIrD,SAAS,0BAA0B,CAAC,UAAkB;IACpD,MAAM,OAAO,GAAG,qBAAqB,EAAE,CAAC;IACxC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAElC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,gBAA2C,CAAC;IAC5E,OAAO,CACL,uBAAuB,WAAW,GAAG;QACrC,GAAG,kBAAkB,EAAE,IAAI,UAAU,EAAE,CACxC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAC3C,OAA2B,EAC3B,QAAgB;IAEhB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,UAAU,GACd,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,MAAM,EAAE,YAAY,EAAE,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU;YAAE,OAAO,MAAM,CAAC;QAEjE,MAAM,SAAS,GAAG,0BAA0B,CAAC,UAAU,CAAC,CAAC;QACzD,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,MAAM,CAAC;QAEtC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAA4B,CAAC;QACzD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;YAC9B,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC;YACtC,QAAQ;YACR,YAAY,EAAE,UAAU;YACxB,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,SAAS;SACd,CAAC,CAAC;QACH,wEAAwE;QACxE,qEAAqE;QACrE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC;AACJ,CAAC"}