@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,27 @@
1
+ /** LangGraph interrupt validation and suspension output helpers. */
2
+ import type { BaseMessage } from "@langchain/core/messages";
3
+ import type { Interrupt } from "@langchain/langgraph";
4
+ import { type AgentOutput, type StreamEvent } from "@mongodb-js/agent-engine-sdk";
5
+ export interface PublicInterrupt {
6
+ readonly id: string;
7
+ readonly value: unknown;
8
+ }
9
+ export declare function validateInterruptValue(id: string, value: unknown): void;
10
+ export declare function interruptSnapshot(captured: readonly Interrupt[]): PublicInterrupt[];
11
+ export declare function resumeSchema(interruptIds: readonly string[]): Record<string, unknown>;
12
+ export declare function invokeSuspendOutput(args: {
13
+ response: string;
14
+ threadId: string;
15
+ checkpointId: string | undefined;
16
+ interruptValues: readonly unknown[];
17
+ interrupts?: readonly PublicInterrupt[];
18
+ messageCount: number;
19
+ resumed: boolean;
20
+ }): AgentOutput;
21
+ export declare function streamHitlSuspendEvent(args: {
22
+ interrupts: readonly PublicInterrupt[];
23
+ checkpointId: string | undefined;
24
+ resumed: boolean;
25
+ messages: readonly BaseMessage[];
26
+ }): StreamEvent;
27
+ //# sourceMappingURL=suspend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suspend.d.ts","sourceRoot":"","sources":["../src/suspend.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,8BAA8B,CAAC;AAItC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAUD,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CASvE;AAED,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,SAAS,EAAE,GAC7B,eAAe,EAAE,CAanB;AAED,wBAAgB,YAAY,CAC1B,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAazB;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,eAAe,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,WAAW,CAsBd;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;IACvC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;CAClC,GAAG,WAAW,CAcd"}
@@ -0,0 +1,87 @@
1
+ /** LangGraph interrupt validation and suspension output helpers. */
2
+ import { JsonValueSchema, } from "@mongodb-js/agent-engine-sdk";
3
+ import { lcMessagesToPlatform } from "./messages.js";
4
+ function interruptValueType(value) {
5
+ if (value === null)
6
+ return "null";
7
+ if (typeof value !== "object")
8
+ return typeof value;
9
+ const constructor = value
10
+ .constructor;
11
+ return typeof constructor?.name === "string" ? constructor.name : "object";
12
+ }
13
+ export function validateInterruptValue(id, value) {
14
+ try {
15
+ if (JsonValueSchema.safeParse(value).success)
16
+ return;
17
+ }
18
+ catch {
19
+ // Recursive values can overflow the recursive schema before returning a result.
20
+ }
21
+ throw new Error(`LangGraph interrupt "${id}" has a non-JSON-serializable value of type ${interruptValueType(value)}`);
22
+ }
23
+ export function interruptSnapshot(captured) {
24
+ const interrupts = captured.map((interrupt) => {
25
+ if (typeof interrupt.id !== "string" || interrupt.id.length === 0) {
26
+ throw new Error("LangGraph returned an empty interrupt id");
27
+ }
28
+ validateInterruptValue(interrupt.id, interrupt.value);
29
+ return { id: interrupt.id, value: interrupt.value };
30
+ });
31
+ const interruptIds = interrupts.map((interrupt) => interrupt.id);
32
+ if (new Set(interruptIds).size !== interruptIds.length) {
33
+ throw new Error("LangGraph returned duplicate interrupt ids");
34
+ }
35
+ return interrupts;
36
+ }
37
+ export function resumeSchema(interruptIds) {
38
+ const resumeMap = {
39
+ type: "object",
40
+ required: [...interruptIds],
41
+ properties: Object.fromEntries(interruptIds.map((id) => [id, {}])),
42
+ additionalProperties: false,
43
+ };
44
+ return {
45
+ type: "object",
46
+ required: ["resume_map"],
47
+ properties: { resume_map: resumeMap },
48
+ additionalProperties: true,
49
+ };
50
+ }
51
+ export function invokeSuspendOutput(args) {
52
+ return {
53
+ response: {
54
+ response: args.response,
55
+ execution_id: args.threadId,
56
+ status: "suspended",
57
+ suspend_context: {
58
+ checkpoint_id: args.checkpointId ?? null,
59
+ interrupt_values: args.interruptValues,
60
+ },
61
+ message_count: args.messageCount,
62
+ resumed: args.resumed,
63
+ ...(args.interrupts === undefined
64
+ ? {}
65
+ : {
66
+ interrupts: args.interrupts,
67
+ resume_schema: resumeSchema(args.interrupts.map((item) => item.id)),
68
+ }),
69
+ },
70
+ };
71
+ }
72
+ export function streamHitlSuspendEvent(args) {
73
+ const interruptIds = args.interrupts.map((interrupt) => interrupt.id);
74
+ return {
75
+ data: {
76
+ // Retained so older runners can still consume a new adapter event.
77
+ suspend_payload: args.interrupts[0]?.value,
78
+ interrupts: args.interrupts,
79
+ resume_schema: resumeSchema(interruptIds),
80
+ resumed: args.resumed,
81
+ messages: lcMessagesToPlatform(args.messages),
82
+ metadata: { checkpoint_id: args.checkpointId ?? null },
83
+ },
84
+ event: "suspend",
85
+ };
86
+ }
87
+ //# sourceMappingURL=suspend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suspend.js","sourceRoot":"","sources":["../src/suspend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Workspace-scoped LangGraph `thread_id` composition.
3
+ *
4
+ * Port of Python's `agent_engine_sdk_langgraph/thread_id.py`.
5
+ */
6
+ import type { RequestContext } from "@mongodb-js/agent-engine-sdk";
7
+ /** Tenant hook mapping a `RequestContext` to a checkpoint `thread_id`. */
8
+ export type ResolveThreadIdHook = (ctx: RequestContext) => string;
9
+ /** Compose the workspace-scoped `thread_id` for a checkpoint key. */
10
+ export declare function scopedThreadId(sessionId?: string | null, workspaceId?: string | null): string;
11
+ /**
12
+ * Return the `thread_id` keys that may hold checkpoints for a session.
13
+ *
14
+ * When a workspace scope is known, only the composite key is queried —
15
+ * never the bare `session_id`. Bare keys are shared by every workspace on
16
+ * the same store, so including them would let one tenant read or poison
17
+ * another's conversation history. Legacy unscoped checkpoints are
18
+ * intentionally not queried.
19
+ */
20
+ export declare function threadIdsForQuery(sessionId: string, workspaceId?: string | null): string[];
21
+ /** Flatten `threadIdsForQuery` across many sessions, deduped. */
22
+ export declare function threadIdsForSessionsQuery(sessionIds: string[], workspaceId?: string | null): string[];
23
+ /** Recover the plain `session_id` from a workspace-scoped `thread_id`. */
24
+ export declare function sessionIdFromThreadId(threadId: string, workspaceId?: string | null): string;
25
+ /**
26
+ * LangGraph `thread_id` for a platform request — the same key invoke uses.
27
+ * Port of Python's `checkpoint_thread_id`.
28
+ */
29
+ export declare function checkpointThreadId(ctx: RequestContext, resolveThreadId?: ResolveThreadIdHook | null): string;
30
+ //# sourceMappingURL=thread_id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread_id.d.ts","sourceRoot":"","sources":["../src/thread_id.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEnE,0EAA0E;AAC1E,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,MAAM,CAAC;AAIlE,qEAAqE;AACrE,wBAAgB,cAAc,CAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,MAAM,CAIR;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,MAAM,EAAE,CAGV;AAED,iEAAiE;AACjE,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAAE,EACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,MAAM,EAAE,CAYV;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,MAAM,CAOR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,cAAc,EACnB,eAAe,CAAC,EAAE,mBAAmB,GAAG,IAAI,GAC3C,MAAM,CAeR"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Workspace-scoped LangGraph `thread_id` composition.
3
+ *
4
+ * Port of Python's `agent_engine_sdk_langgraph/thread_id.py`.
5
+ */
6
+ const DEFAULT_SESSION_ID = "default";
7
+ /** Compose the workspace-scoped `thread_id` for a checkpoint key. */
8
+ export function scopedThreadId(sessionId, workspaceId) {
9
+ const sid = sessionId || DEFAULT_SESSION_ID;
10
+ if (!workspaceId)
11
+ return sid;
12
+ return `${sid}:${workspaceId}`;
13
+ }
14
+ /**
15
+ * Return the `thread_id` keys that may hold checkpoints for a session.
16
+ *
17
+ * When a workspace scope is known, only the composite key is queried —
18
+ * never the bare `session_id`. Bare keys are shared by every workspace on
19
+ * the same store, so including them would let one tenant read or poison
20
+ * another's conversation history. Legacy unscoped checkpoints are
21
+ * intentionally not queried.
22
+ */
23
+ export function threadIdsForQuery(sessionId, workspaceId) {
24
+ if (!workspaceId)
25
+ return [sessionId];
26
+ return [scopedThreadId(sessionId, workspaceId)];
27
+ }
28
+ /** Flatten `threadIdsForQuery` across many sessions, deduped. */
29
+ export function threadIdsForSessionsQuery(sessionIds, workspaceId) {
30
+ const seen = new Set();
31
+ const result = [];
32
+ for (const sessionId of sessionIds) {
33
+ for (const threadId of threadIdsForQuery(sessionId, workspaceId)) {
34
+ if (!seen.has(threadId)) {
35
+ seen.add(threadId);
36
+ result.push(threadId);
37
+ }
38
+ }
39
+ }
40
+ return result;
41
+ }
42
+ /** Recover the plain `session_id` from a workspace-scoped `thread_id`. */
43
+ export function sessionIdFromThreadId(threadId, workspaceId) {
44
+ if (!workspaceId)
45
+ return threadId;
46
+ const suffix = `:${workspaceId}`;
47
+ if (threadId.endsWith(suffix)) {
48
+ return threadId.slice(0, -suffix.length);
49
+ }
50
+ return threadId;
51
+ }
52
+ /**
53
+ * LangGraph `thread_id` for a platform request — the same key invoke uses.
54
+ * Port of Python's `checkpoint_thread_id`.
55
+ */
56
+ export function checkpointThreadId(ctx, resolveThreadId) {
57
+ if (resolveThreadId != null) {
58
+ const threadId = resolveThreadId(ctx);
59
+ if (typeof threadId !== "string" || threadId.trim() === "") {
60
+ const rendered = typeof threadId === "string"
61
+ ? JSON.stringify(threadId)
62
+ : typeof threadId;
63
+ throw new Error(`App.resolveThreadId must return a non-empty string; got ${rendered}`);
64
+ }
65
+ return threadId;
66
+ }
67
+ return scopedThreadId(ctx.sessionId, ctx.workspaceId);
68
+ }
69
+ //# sourceMappingURL=thread_id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread_id.js","sourceRoot":"","sources":["../src/thread_id.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAErC,qEAAqE;AACrE,MAAM,UAAU,cAAc,CAC5B,SAAyB,EACzB,WAA2B;IAE3B,MAAM,GAAG,GAAG,SAAS,IAAI,kBAAkB,CAAC;IAC5C,IAAI,CAAC,WAAW;QAAE,OAAO,GAAG,CAAC;IAC7B,OAAO,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAiB,EACjB,WAA2B;IAE3B,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,yBAAyB,CACvC,UAAoB,EACpB,WAA2B;IAE3B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,KAAK,MAAM,QAAQ,IAAI,iBAAiB,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,qBAAqB,CACnC,QAAgB,EAChB,WAA2B;IAE3B,IAAI,CAAC,WAAW;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAmB,EACnB,eAA4C;IAE5C,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3D,MAAM,QAAQ,GACZ,OAAO,QAAQ,KAAK,QAAQ;gBAC1B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;gBAC1B,CAAC,CAAC,OAAO,QAAQ,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,2DAA2D,QAAQ,EAAE,CACtE,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** JSON and protobuf boundary helpers for durable workflow state. */
2
+ import { type JsonObject } from "@bufbuild/protobuf";
3
+ import { type Value } from "@bufbuild/protobuf/wkt";
4
+ import { type JsonValue } from "@mongodb-js/agent-engine-sdk";
5
+ export declare function serializeJsonValue(value: unknown, path: string): JsonValue;
6
+ export declare function serializeJsonObject(value: unknown, path: string): JsonObject;
7
+ export declare function serializeJsonObjectArray(value: unknown, path: string): JsonObject[];
8
+ export declare function requireJsonObject(value: unknown, path: string): JsonObject;
9
+ export declare function protoValueFromUnknown(value: unknown, path: string): Value;
10
+ export declare function jsonValueFromProto(value: Value | undefined): JsonValue;
11
+ //# sourceMappingURL=workflow_json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow_json.d.ts","sourceRoot":"","sources":["../src/workflow_json.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE/E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAW1E;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAU5E;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,GACX,UAAU,EAAE,CAOd;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAW1E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,CAEzE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,CAEtE"}
@@ -0,0 +1,49 @@
1
+ /** JSON and protobuf boundary helpers for durable workflow state. */
2
+ import { fromJson, toJson } from "@bufbuild/protobuf";
3
+ import { ValueSchema } from "@bufbuild/protobuf/wkt";
4
+ import { JsonValueSchema } from "@mongodb-js/agent-engine-sdk";
5
+ export function serializeJsonValue(value, path) {
6
+ let parsed;
7
+ try {
8
+ parsed = JsonValueSchema.safeParse(value);
9
+ }
10
+ catch (error) {
11
+ throw new TypeError(`${path} is not JSON-serializable`, { cause: error });
12
+ }
13
+ if (!parsed.success) {
14
+ throw new TypeError(`${path} is not JSON-serializable`);
15
+ }
16
+ return parsed.data;
17
+ }
18
+ export function serializeJsonObject(value, path) {
19
+ const serialized = serializeJsonValue(value, path);
20
+ if (serialized === null ||
21
+ Array.isArray(serialized) ||
22
+ typeof serialized !== "object") {
23
+ throw new TypeError(`${path} must be an object`);
24
+ }
25
+ return serialized;
26
+ }
27
+ export function serializeJsonObjectArray(value, path) {
28
+ if (!Array.isArray(value)) {
29
+ throw new TypeError(`${path} must be an array`);
30
+ }
31
+ return value.map((item, index) => serializeJsonObject(item, `${path}[${index}]`));
32
+ }
33
+ export function requireJsonObject(value, path) {
34
+ const parsed = JsonValueSchema.safeParse(value);
35
+ if (!parsed.success ||
36
+ parsed.data === null ||
37
+ Array.isArray(parsed.data) ||
38
+ typeof parsed.data !== "object") {
39
+ throw new TypeError(`${path} must be a JSON object`);
40
+ }
41
+ return parsed.data;
42
+ }
43
+ export function protoValueFromUnknown(value, path) {
44
+ return fromJson(ValueSchema, serializeJsonValue(value, path));
45
+ }
46
+ export function jsonValueFromProto(value) {
47
+ return value === undefined ? null : toJson(ValueSchema, value);
48
+ }
49
+ //# sourceMappingURL=workflow_json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow_json.js","sourceRoot":"","sources":["../src/workflow_json.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAmB,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAc,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAkB,MAAM,8BAA8B,CAAC;AAE/E,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,IAAY;IAC7D,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,2BAA2B,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,2BAA2B,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,IAAY;IAC9D,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,IACE,UAAU,KAAK,IAAI;QACnB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QACzB,OAAO,UAAU,KAAK,QAAQ,EAC9B,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,oBAAoB,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAAc,EACd,IAAY;IAEZ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC/B,mBAAmB,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,IAAY;IAC5D,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAChD,IACE,CAAC,MAAM,CAAC,OAAO;QACf,MAAM,CAAC,IAAI,KAAK,IAAI;QACpB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAC1B,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAC/B,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,wBAAwB,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAE,IAAY;IAChE,OAAO,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,MAAM,CAAC,WAAW,EAAE,KAAK,CAAe,CAAC;AAChF,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** LangChain message translation for the OE durable workflow contract. */
2
+ import { type BaseMessage } from "@langchain/core/messages";
3
+ import { type WorkflowMessage } from "@mongodb-js/agent-engine-runner-shared";
4
+ /** Owns LangChain-specific serialization and validation at the workflow edge. */
5
+ export declare class WorkflowMessageCodec {
6
+ static fromLangChainMessage(message: BaseMessage, includeLegacySource?: boolean): WorkflowMessage;
7
+ static toLangChainMessage(message: WorkflowMessage, path?: string): BaseMessage;
8
+ private static canonicalSourceMessage;
9
+ private static fromSourceMessage;
10
+ }
11
+ //# sourceMappingURL=workflow_message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow_message.d.ts","sourceRoot":"","sources":["../src/workflow_message.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAG1E,OAAO,EAEL,KAAK,WAAW,EAOjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,wCAAwC,CAAC;AA6ChD,iFAAiF;AACjF,qBAAa,oBAAoB;IAC/B,MAAM,CAAC,oBAAoB,CACzB,OAAO,EAAE,WAAW,EACpB,mBAAmB,UAAQ,GAC1B,eAAe;IAgFlB,MAAM,CAAC,kBAAkB,CACvB,OAAO,EAAE,eAAe,EACxB,IAAI,SAAY,GACf,WAAW;IA8Dd,OAAO,CAAC,MAAM,CAAC,sBAAsB;IA2BrC,OAAO,CAAC,MAAM,CAAC,iBAAiB;CA+CjC"}
@@ -0,0 +1,179 @@
1
+ /** LangChain message translation for the OE durable workflow contract. */
2
+ import { create } from "@bufbuild/protobuf";
3
+ import { AIMessage, HumanMessage, isBaseMessage, mapStoredMessageToChatMessage, SystemMessage, ToolMessage, } from "@langchain/core/messages";
4
+ import { MessageRole, WorkflowMessageSchema, } from "@mongodb-js/agent-engine-runner-shared";
5
+ import { lcToPlatformMessage } from "./messages.js";
6
+ import { jsonValueFromProto, protoValueFromUnknown, serializeJsonObject, serializeJsonObjectArray, } from "./workflow_json.js";
7
+ const ROLE_TO_WORKFLOW = {
8
+ user: MessageRole.USER,
9
+ assistant: MessageRole.ASSISTANT,
10
+ tool: MessageRole.TOOL,
11
+ system: MessageRole.SYSTEM,
12
+ };
13
+ const ROLE_FROM_WORKFLOW = {
14
+ [MessageRole.USER]: "user",
15
+ [MessageRole.ASSISTANT]: "assistant",
16
+ [MessageRole.TOOL]: "tool",
17
+ [MessageRole.SYSTEM]: "system",
18
+ };
19
+ function definedToolCallFields(toolCall) {
20
+ return Object.fromEntries(Object.entries(toolCall).filter(([, value]) => value !== undefined));
21
+ }
22
+ function durableContent(message, platformContent) {
23
+ // LangGraph can transiently place a direct ToolMessage result inside another
24
+ // message's content tuple. That framework-only object is not JSON state, so
25
+ // keep the adapter's established platform normalization for this one shape.
26
+ if (Array.isArray(message.content) && message.content.some(isBaseMessage)) {
27
+ return platformContent;
28
+ }
29
+ return message.content;
30
+ }
31
+ /** Owns LangChain-specific serialization and validation at the workflow edge. */
32
+ export class WorkflowMessageCodec {
33
+ static fromLangChainMessage(message, includeLegacySource = false) {
34
+ const platformMessage = lcToPlatformMessage(message);
35
+ const artifactMetadata = message.additional_kwargs["artifacts"];
36
+ const rawPlatformArtifacts = artifactMetadata === undefined ? [] : artifactMetadata;
37
+ const rawInvalidToolCalls = message.type === "ai"
38
+ ? (message.invalid_tool_calls ?? [])
39
+ : [];
40
+ const additionalKwargs = { ...platformMessage.additionalKwargs };
41
+ delete additionalKwargs["artifacts"];
42
+ delete additionalKwargs["tool_calls"];
43
+ return create(WorkflowMessageSchema, {
44
+ role: ROLE_TO_WORKFLOW[platformMessage.role],
45
+ content: protoValueFromUnknown(durableContent(message, platformMessage.content), "message content"),
46
+ toolCalls: serializeJsonObjectArray((platformMessage.toolCalls ?? []).map((toolCall) => definedToolCallFields(toolCall)), "message tool_calls"),
47
+ invalidToolCalls: serializeJsonObjectArray(rawInvalidToolCalls.map((toolCall) => definedToolCallFields(toolCall)), "message invalid_tool_calls"),
48
+ ...(Object.keys(additionalKwargs).length > 0 && {
49
+ additionalKwargs: serializeJsonObject(additionalKwargs, "message additional_kwargs"),
50
+ }),
51
+ ...(platformMessage.responseMetadata !== undefined && {
52
+ responseMetadata: serializeJsonObject(platformMessage.responseMetadata, "message response_metadata"),
53
+ }),
54
+ platformArtifacts: serializeJsonObjectArray(rawPlatformArtifacts, "message additional_kwargs.artifacts"),
55
+ ...(includeLegacySource && {
56
+ sourceMessage: protoValueFromUnknown(this.canonicalSourceMessage(message, platformMessage), "message source"),
57
+ artifacts: serializeJsonObjectArray(rawPlatformArtifacts, "message artifacts"),
58
+ }),
59
+ ...(platformMessage.toolCallId !== undefined && {
60
+ toolCallId: platformMessage.toolCallId,
61
+ }),
62
+ ...(platformMessage.name !== undefined && {
63
+ name: platformMessage.name,
64
+ }),
65
+ ...(platformMessage.id !== undefined && { id: platformMessage.id }),
66
+ ...(platformMessage.isError !== undefined && {
67
+ isError: platformMessage.isError,
68
+ }),
69
+ // Checkpoint serializers may materialize an omitted artifact as null;
70
+ // both shapes mean that no machine-readable tool result exists.
71
+ ...(message instanceof ToolMessage &&
72
+ message.artifact !== undefined &&
73
+ message.artifact !== null && {
74
+ toolArtifact: protoValueFromUnknown(message.artifact, "message tool_artifact"),
75
+ }),
76
+ });
77
+ }
78
+ static toLangChainMessage(message, path = "message") {
79
+ const role = ROLE_FROM_WORKFLOW[message.role];
80
+ if (role === undefined) {
81
+ throw new TypeError(`${path}: previous workflow message has an unspecified role`);
82
+ }
83
+ if (message.sourceMessage !== undefined) {
84
+ return this.fromSourceMessage(message, role, path);
85
+ }
86
+ const content = jsonValueFromProto(message.content);
87
+ if (typeof content !== "string" && !Array.isArray(content)) {
88
+ throw new TypeError(`${path}: previous workflow message content is malformed`);
89
+ }
90
+ const additionalKwargs = {
91
+ ...message.additionalKwargs,
92
+ ...(message.platformArtifacts.length > 0 && {
93
+ artifacts: message.platformArtifacts,
94
+ }),
95
+ };
96
+ const baseFields = {
97
+ content: content,
98
+ additional_kwargs: additionalKwargs,
99
+ response_metadata: message.responseMetadata ?? {},
100
+ ...(message.name !== undefined && { name: message.name }),
101
+ ...(message.id !== undefined && { id: message.id }),
102
+ };
103
+ switch (message.role) {
104
+ case MessageRole.USER:
105
+ return new HumanMessage(baseFields);
106
+ case MessageRole.ASSISTANT:
107
+ return new AIMessage({
108
+ ...baseFields,
109
+ tool_calls: message.toolCalls,
110
+ invalid_tool_calls: message.invalidToolCalls,
111
+ });
112
+ case MessageRole.TOOL:
113
+ if (message.toolCallId === undefined || message.toolCallId === "") {
114
+ throw new TypeError(`${path}: previous workflow message cannot be reconstructed`);
115
+ }
116
+ return new ToolMessage({
117
+ ...baseFields,
118
+ tool_call_id: message.toolCallId,
119
+ status: message.isError === true ? "error" : "success",
120
+ ...(message.toolArtifact !== undefined && {
121
+ artifact: jsonValueFromProto(message.toolArtifact),
122
+ }),
123
+ });
124
+ case MessageRole.SYSTEM:
125
+ return new SystemMessage(baseFields);
126
+ default:
127
+ throw new TypeError(`${path}: previous workflow message has an unspecified role`);
128
+ }
129
+ }
130
+ static canonicalSourceMessage(message, platformMessage) {
131
+ const storedMessage = message.toDict();
132
+ if (storedMessage.type !== "ai") {
133
+ return JSON.parse(JSON.stringify(storedMessage));
134
+ }
135
+ const data = { ...storedMessage.data };
136
+ const additionalKwargs = data["additional_kwargs"] !== null &&
137
+ typeof data["additional_kwargs"] === "object" &&
138
+ !Array.isArray(data["additional_kwargs"])
139
+ ? { ...data["additional_kwargs"] }
140
+ : {};
141
+ delete additionalKwargs["tool_calls"];
142
+ delete data["tool_call_chunks"];
143
+ delete data["usage_metadata"];
144
+ data["additional_kwargs"] = additionalKwargs;
145
+ data["tool_calls"] = (platformMessage.toolCalls ?? []).map((toolCall) => toolCall.toLangchainDict());
146
+ storedMessage.data = data;
147
+ return JSON.parse(JSON.stringify(storedMessage));
148
+ }
149
+ static fromSourceMessage(message, role, path) {
150
+ const source = jsonValueFromProto(message.sourceMessage);
151
+ if (source === null ||
152
+ Array.isArray(source) ||
153
+ typeof source !== "object") {
154
+ throw new TypeError(`${path}: previous workflow message is malformed`);
155
+ }
156
+ try {
157
+ const converted = mapStoredMessageToChatMessage(source);
158
+ const restored = lcToPlatformMessage(converted);
159
+ if (restored.role !== role) {
160
+ throw new TypeError(`${path}: previous workflow message role conflicts with source_message`);
161
+ }
162
+ if (message.id !== undefined && restored.id !== message.id) {
163
+ throw new TypeError(`${path}: previous workflow message id conflicts with source_message`);
164
+ }
165
+ if (message.toolCallId !== undefined &&
166
+ restored.toolCallId !== message.toolCallId) {
167
+ throw new TypeError(`${path}: previous workflow tool_call_id conflicts with source_message`);
168
+ }
169
+ return converted;
170
+ }
171
+ catch (error) {
172
+ if (error instanceof TypeError && error.message.startsWith(`${path}:`)) {
173
+ throw error;
174
+ }
175
+ throw new TypeError(`${path}: previous workflow message cannot be reconstructed`, { cause: error });
176
+ }
177
+ }
178
+ }
179
+ //# sourceMappingURL=workflow_message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow_message.js","sourceRoot":"","sources":["../src/workflow_message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** LangGraph application-channel translation for OE durable state. */
2
+ import { type StateSnapshot } from "@mongodb-js/agent-engine-runner-shared";
3
+ /** Convert LangGraph application channels into the OE-owned durable snapshot. */
4
+ export declare function channelValuesToStateSnapshot(channelValues: Record<string, unknown>, includeLegacySource?: boolean): StateSnapshot;
5
+ /** Restore OE durable state into the channels expected by LangGraph. */
6
+ export declare function stateSnapshotToChannelValues(snapshot: StateSnapshot): Record<string, unknown>;
7
+ //# sourceMappingURL=workflow_state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow_state.d.ts","sourceRoot":"","sources":["../src/workflow_state.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAItE,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,wCAAwC,CAAC;AA4BhD,iFAAiF;AACjF,wBAAgB,4BAA4B,CAC1C,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,mBAAmB,UAAQ,GAC1B,aAAa,CAkBf;AAED,wEAAwE;AACxE,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,aAAa,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqBzB"}
@@ -0,0 +1,62 @@
1
+ /** LangGraph application-channel translation for OE durable state. */
2
+ import { create } from "@bufbuild/protobuf";
3
+ import { isBaseMessage } from "@langchain/core/messages";
4
+ import { StateSnapshotSchema, } from "@mongodb-js/agent-engine-runner-shared";
5
+ import { requireJsonObject } from "./workflow_json.js";
6
+ import { WorkflowMessageCodec } from "./workflow_message.js";
7
+ /** LangGraph reserves these channels for execution mechanics, not app state. */
8
+ function isControlChannel(name) {
9
+ return (name.startsWith("__") ||
10
+ name.startsWith("branch:") ||
11
+ name.startsWith("start:"));
12
+ }
13
+ /** Read and validate the conventional LangGraph messages channel. */
14
+ function workflowMessages(value) {
15
+ if (value === undefined)
16
+ return [];
17
+ if (!Array.isArray(value)) {
18
+ throw new TypeError("LangGraph messages channel must be an array");
19
+ }
20
+ return value.map((message, index) => {
21
+ if (!isBaseMessage(message)) {
22
+ throw new TypeError(`LangGraph messages[${index}] is not a BaseMessage`);
23
+ }
24
+ return message;
25
+ });
26
+ }
27
+ /** Convert LangGraph application channels into the OE-owned durable snapshot. */
28
+ export function channelValuesToStateSnapshot(channelValues, includeLegacySource = false) {
29
+ const properties = {};
30
+ for (const name of Object.keys(channelValues).sort()) {
31
+ if (name === "messages" || isControlChannel(name))
32
+ continue;
33
+ // LangGraph materializes optional channels as undefined until they receive
34
+ // a value. JSON has no undefined value; omitting the absent channel
35
+ // reconstructs the same application state.
36
+ if (channelValues[name] === undefined)
37
+ continue;
38
+ properties[name] = channelValues[name];
39
+ }
40
+ return create(StateSnapshotSchema, {
41
+ properties: requireJsonObject(properties, "LangGraph application state"),
42
+ messageEncodingVersion: 1,
43
+ messages: workflowMessages(channelValues["messages"]).map((message) => WorkflowMessageCodec.fromLangChainMessage(message, includeLegacySource)),
44
+ });
45
+ }
46
+ /** Restore OE durable state into the channels expected by LangGraph. */
47
+ export function stateSnapshotToChannelValues(snapshot) {
48
+ const properties = requireJsonObject(snapshot.properties ?? {}, "previous workflow state");
49
+ for (const name of Object.keys(properties).sort()) {
50
+ if (name === "messages" || isControlChannel(name)) {
51
+ throw new TypeError(`previous workflow state contains reserved LangGraph channel "${name}"`);
52
+ }
53
+ }
54
+ const channelValues = {
55
+ ...properties,
56
+ };
57
+ if (snapshot.messages.length > 0) {
58
+ channelValues["messages"] = snapshot.messages.map((message, index) => WorkflowMessageCodec.toLangChainMessage(message, `messages[${index}]`));
59
+ }
60
+ return channelValues;
61
+ }
62
+ //# sourceMappingURL=workflow_state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow_state.js","sourceRoot":"","sources":["../src/workflow_state.ts"],"names":[],"mappings":"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"}