@langchain/langgraph-sdk 1.9.20 → 1.9.22

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 (132) hide show
  1. package/dist/client/base.cjs +4 -1
  2. package/dist/client/base.cjs.map +1 -1
  3. package/dist/client/base.d.cts +2 -0
  4. package/dist/client/base.d.cts.map +1 -1
  5. package/dist/client/base.d.ts +2 -0
  6. package/dist/client/base.d.ts.map +1 -1
  7. package/dist/client/base.js +5 -2
  8. package/dist/client/base.js.map +1 -1
  9. package/dist/client/index.cjs +1 -1
  10. package/dist/client/index.js +1 -1
  11. package/dist/client/runs/index.cjs +2 -0
  12. package/dist/client/runs/index.cjs.map +1 -1
  13. package/dist/client/runs/index.d.cts +15 -0
  14. package/dist/client/runs/index.d.cts.map +1 -1
  15. package/dist/client/runs/index.d.ts +15 -0
  16. package/dist/client/runs/index.d.ts.map +1 -1
  17. package/dist/client/runs/index.js +2 -0
  18. package/dist/client/runs/index.js.map +1 -1
  19. package/dist/client/stream/error.cjs +21 -0
  20. package/dist/client/stream/error.cjs.map +1 -1
  21. package/dist/client/stream/error.js +21 -1
  22. package/dist/client/stream/error.js.map +1 -1
  23. package/dist/client/stream/index.cjs +24 -1
  24. package/dist/client/stream/index.cjs.map +1 -1
  25. package/dist/client/stream/index.d.cts.map +1 -1
  26. package/dist/client/stream/index.d.ts.map +1 -1
  27. package/dist/client/stream/index.js +24 -1
  28. package/dist/client/stream/index.js.map +1 -1
  29. package/dist/client/stream/transport/agent-server.cjs +8 -2
  30. package/dist/client/stream/transport/agent-server.cjs.map +1 -1
  31. package/dist/client/stream/transport/agent-server.d.cts +17 -2
  32. package/dist/client/stream/transport/agent-server.d.cts.map +1 -1
  33. package/dist/client/stream/transport/agent-server.d.ts +17 -2
  34. package/dist/client/stream/transport/agent-server.d.ts.map +1 -1
  35. package/dist/client/stream/transport/agent-server.js +8 -2
  36. package/dist/client/stream/transport/agent-server.js.map +1 -1
  37. package/dist/client/stream/transport/http.cjs +81 -21
  38. package/dist/client/stream/transport/http.cjs.map +1 -1
  39. package/dist/client/stream/transport/http.d.cts +22 -7
  40. package/dist/client/stream/transport/http.d.cts.map +1 -1
  41. package/dist/client/stream/transport/http.d.ts +22 -7
  42. package/dist/client/stream/transport/http.d.ts.map +1 -1
  43. package/dist/client/stream/transport/http.js +83 -23
  44. package/dist/client/stream/transport/http.js.map +1 -1
  45. package/dist/client/stream/transport/index.cjs +2 -1
  46. package/dist/client/stream/transport/index.js +2 -1
  47. package/dist/client/stream/transport/types.d.cts +85 -5
  48. package/dist/client/stream/transport/types.d.cts.map +1 -1
  49. package/dist/client/stream/transport/types.d.ts +85 -5
  50. package/dist/client/stream/transport/types.d.ts.map +1 -1
  51. package/dist/client/stream/transport/utils.cjs +19 -0
  52. package/dist/client/stream/transport/utils.cjs.map +1 -1
  53. package/dist/client/stream/transport/utils.js +19 -1
  54. package/dist/client/stream/transport/utils.js.map +1 -1
  55. package/dist/client/stream/transport/websocket.cjs +125 -21
  56. package/dist/client/stream/transport/websocket.cjs.map +1 -1
  57. package/dist/client/stream/transport/websocket.d.cts +32 -4
  58. package/dist/client/stream/transport/websocket.d.cts.map +1 -1
  59. package/dist/client/stream/transport/websocket.d.ts +32 -4
  60. package/dist/client/stream/transport/websocket.d.ts.map +1 -1
  61. package/dist/client/stream/transport/websocket.js +126 -23
  62. package/dist/client/stream/transport/websocket.js.map +1 -1
  63. package/dist/client/stream/transport.d.cts +20 -3
  64. package/dist/client/stream/transport.d.cts.map +1 -1
  65. package/dist/client/stream/transport.d.ts +20 -3
  66. package/dist/client/stream/transport.d.ts.map +1 -1
  67. package/dist/client/stream/types.d.cts +31 -0
  68. package/dist/client/stream/types.d.cts.map +1 -1
  69. package/dist/client/stream/types.d.ts +31 -0
  70. package/dist/client/stream/types.d.ts.map +1 -1
  71. package/dist/client/threads/index.cjs +36 -17
  72. package/dist/client/threads/index.cjs.map +1 -1
  73. package/dist/client/threads/index.js +35 -16
  74. package/dist/client/threads/index.js.map +1 -1
  75. package/dist/client.cjs +1 -1
  76. package/dist/client.js +1 -1
  77. package/dist/index.cjs +1 -1
  78. package/dist/index.js +1 -1
  79. package/dist/react-ui/server/server.cjs +2 -2
  80. package/dist/react-ui/server/server.cjs.map +1 -1
  81. package/dist/react-ui/server/server.js +1 -1
  82. package/dist/react-ui/server/server.js.map +1 -1
  83. package/dist/stream/controller.cjs +21 -3
  84. package/dist/stream/controller.cjs.map +1 -1
  85. package/dist/stream/controller.d.cts.map +1 -1
  86. package/dist/stream/controller.d.ts.map +1 -1
  87. package/dist/stream/controller.js +20 -2
  88. package/dist/stream/controller.js.map +1 -1
  89. package/dist/stream/index.cjs +2 -0
  90. package/dist/stream/index.d.cts +2 -1
  91. package/dist/stream/index.d.ts +2 -1
  92. package/dist/stream/index.js +2 -1
  93. package/dist/stream/projections/channel-effect.cjs +52 -0
  94. package/dist/stream/projections/channel-effect.cjs.map +1 -0
  95. package/dist/stream/projections/channel-effect.d.cts +35 -0
  96. package/dist/stream/projections/channel-effect.d.cts.map +1 -0
  97. package/dist/stream/projections/channel-effect.d.ts +35 -0
  98. package/dist/stream/projections/channel-effect.d.ts.map +1 -0
  99. package/dist/stream/projections/channel-effect.js +52 -0
  100. package/dist/stream/projections/channel-effect.js.map +1 -0
  101. package/dist/stream/projections/index.cjs +1 -0
  102. package/dist/stream/projections/index.d.ts +1 -0
  103. package/dist/stream/projections/index.js +1 -0
  104. package/dist/stream/root-message-projection.cjs +55 -0
  105. package/dist/stream/root-message-projection.cjs.map +1 -1
  106. package/dist/stream/root-message-projection.js +55 -0
  107. package/dist/stream/root-message-projection.js.map +1 -1
  108. package/dist/stream/submit-coordinator.cjs +3 -3
  109. package/dist/stream/submit-coordinator.cjs.map +1 -1
  110. package/dist/stream/submit-coordinator.js +1 -1
  111. package/dist/stream/submit-coordinator.js.map +1 -1
  112. package/dist/types.d.cts +20 -0
  113. package/dist/types.d.cts.map +1 -1
  114. package/dist/types.d.ts +20 -0
  115. package/dist/types.d.ts.map +1 -1
  116. package/dist/ui/branching.d.cts +1 -1
  117. package/dist/ui/branching.d.ts +1 -1
  118. package/dist/ui/orchestrator.d.cts +1 -1
  119. package/dist/ui/orchestrator.d.cts.map +1 -1
  120. package/dist/ui/orchestrator.d.ts +1 -1
  121. package/dist/ui/orchestrator.d.ts.map +1 -1
  122. package/dist/utils/index.d.cts +1 -1
  123. package/dist/utils/index.d.ts +1 -1
  124. package/dist/utils/stream.cjs +94 -0
  125. package/dist/utils/stream.cjs.map +1 -1
  126. package/dist/utils/stream.d.cts +16 -2
  127. package/dist/utils/stream.d.cts.map +1 -1
  128. package/dist/utils/stream.d.ts +16 -2
  129. package/dist/utils/stream.d.ts.map +1 -1
  130. package/dist/utils/stream.js +94 -1
  131. package/dist/utils/stream.js.map +1 -1
  132. package/package.json +6 -5
package/dist/client.cjs CHANGED
@@ -6,8 +6,8 @@ const require_messages = require("./client/stream/messages.cjs");
6
6
  const require_media = require("./client/stream/media.cjs");
7
7
  const require_error = require("./client/stream/error.cjs");
8
8
  const require_index$1 = require("./client/stream/index.cjs");
9
- const require_http = require("./client/stream/transport/http.cjs");
10
9
  const require_websocket = require("./client/stream/transport/websocket.cjs");
10
+ const require_http = require("./client/stream/transport/http.cjs");
11
11
  const require_index$2 = require("./client/threads/index.cjs");
12
12
  const require_index$3 = require("./client/runs/index.cjs");
13
13
  const require_index$4 = require("./client/crons/index.cjs");
package/dist/client.js CHANGED
@@ -5,8 +5,8 @@ import { MessageAssembler } from "./client/stream/messages.js";
5
5
  import { MediaAssembler, MediaAssemblyError } from "./client/stream/media.js";
6
6
  import { ProtocolError } from "./client/stream/error.js";
7
7
  import { SubscriptionHandle, ThreadStream } from "./client/stream/index.js";
8
- import { ProtocolSseTransportAdapter } from "./client/stream/transport/http.js";
9
8
  import { ProtocolWebSocketTransportAdapter } from "./client/stream/transport/websocket.js";
9
+ import { ProtocolSseTransportAdapter } from "./client/stream/transport/http.js";
10
10
  import { ThreadsClient } from "./client/threads/index.js";
11
11
  import { RunsClient } from "./client/runs/index.js";
12
12
  import { CronsClient } from "./client/crons/index.js";
package/dist/index.cjs CHANGED
@@ -7,8 +7,8 @@ const require_error = require("./client/stream/error.cjs");
7
7
  const require_constants = require("./stream/constants.cjs");
8
8
  const require_headless_tools = require("./headless-tools.cjs");
9
9
  const require_index = require("./client/stream/index.cjs");
10
- const require_http = require("./client/stream/transport/http.cjs");
11
10
  const require_websocket = require("./client/stream/transport/websocket.cjs");
11
+ const require_http = require("./client/stream/transport/http.cjs");
12
12
  const require_agent_server = require("./client/stream/transport/agent-server.cjs");
13
13
  const require_index$1 = require("./client/index.cjs");
14
14
  require("./client.cjs");
package/dist/index.js CHANGED
@@ -6,8 +6,8 @@ import { ProtocolError } from "./client/stream/error.js";
6
6
  import { NAMESPACE_SEPARATOR } from "./stream/constants.js";
7
7
  import { applyHeadlessToolResumeCommand, executeHeadlessTool, filterOutHeadlessToolInterrupts, findHeadlessTool, flushPendingHeadlessToolInterrupts, handleHeadlessToolInterrupt, headlessToolResumeCommand, isHeadlessToolInterrupt, parseHeadlessToolInterruptPayload, scheduleCoalescedHeadlessToolFlush } from "./headless-tools.js";
8
8
  import { SubscriptionHandle, ThreadStream } from "./client/stream/index.js";
9
- import { ProtocolSseTransportAdapter } from "./client/stream/transport/http.js";
10
9
  import { ProtocolWebSocketTransportAdapter } from "./client/stream/transport/websocket.js";
10
+ import { ProtocolSseTransportAdapter } from "./client/stream/transport/http.js";
11
11
  import { HttpAgentServerAdapter } from "./client/stream/transport/agent-server.js";
12
12
  import { Client } from "./client/index.js";
13
13
  import "./client.js";
@@ -1,5 +1,5 @@
1
1
  require("../../_virtual/_rolldown/runtime.cjs");
2
- let uuid = require("uuid");
2
+ let _langchain_core_utils_uuid = require("@langchain/core/utils/uuid");
3
3
  //#region src/react-ui/server/server.ts
4
4
  /**
5
5
  * Helper to send and persist UI messages. Accepts a map of component names to React components
@@ -17,7 +17,7 @@ const typedUi = (config, options) => {
17
17
  function handlePush(message, options) {
18
18
  const evt = {
19
19
  type: "ui",
20
- id: message?.id ?? (0, uuid.v4)(),
20
+ id: message?.id ?? (0, _langchain_core_utils_uuid.v4)(),
21
21
  name: message?.name,
22
22
  props: message?.props,
23
23
  metadata: {
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs","names":[],"sources":["../../../src/react-ui/server/server.ts"],"sourcesContent":["import { v4 as uuidv4 } from \"uuid\";\nimport type { ComponentPropsWithoutRef, ElementType } from \"react\";\nimport type { RemoveUIMessage, UIMessage } from \"../types.js\";\n\ninterface MessageLike {\n id?: string;\n}\n\n/**\n * Helper to send and persist UI messages. Accepts a map of component names to React components\n * as type argument to provide type safety. Will also write to the `options?.stateKey` state.\n *\n * @param config LangGraphRunnableConfig\n * @param options\n * @returns\n */\nexport const typedUi = <Decl extends Record<string, ElementType>>(\n config: {\n writer?: (chunk: unknown) => void;\n runId?: string;\n metadata?: Record<string, unknown>;\n tags?: string[];\n runName?: string;\n configurable?: {\n __pregel_send?: (writes_: [string, unknown][]) => void;\n [key: string]: unknown;\n };\n },\n options?: {\n /** The key to write the UI messages to. Defaults to `ui`. */\n stateKey?: string;\n }\n) => {\n type PropMap = { [K in keyof Decl]: ComponentPropsWithoutRef<Decl[K]> };\n const items: (UIMessage | RemoveUIMessage)[] = [];\n const stateKey = options?.stateKey ?? \"ui\";\n\n const runId = (config.metadata?.run_id as string | undefined) ?? config.runId;\n if (!runId) throw new Error(\"run_id is required\");\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: PropMap[K];\n metadata?: Record<string, unknown>;\n },\n options?: { message?: MessageLike; merge?: boolean }\n ): UIMessage<K, PropMap[K]>;\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: Partial<PropMap[K]>;\n metadata?: Record<string, unknown>;\n },\n options: { message?: MessageLike; merge: true }\n ): UIMessage<K, Partial<PropMap[K]>>;\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: PropMap[K] | Partial<PropMap[K]>;\n metadata?: Record<string, unknown>;\n },\n options?: { message?: MessageLike; merge?: boolean }\n ): UIMessage<K, PropMap[K] | Partial<PropMap[K]>> {\n const evt: UIMessage<K, PropMap[K] | Partial<PropMap[K]>> = {\n type: \"ui\" as const,\n id: message?.id ?? uuidv4(),\n name: message?.name,\n props: message?.props,\n metadata: {\n merge: options?.merge || undefined,\n run_id: runId,\n tags: config.tags,\n name: config.runName,\n ...message?.metadata,\n ...(options?.message ? { id: options.message.id } : null),\n },\n };\n items.push(evt);\n config.writer?.(evt);\n config.configurable?.__pregel_send?.([[stateKey, evt]]);\n return evt;\n }\n\n const handleDelete = (id: string): RemoveUIMessage => {\n const evt: RemoveUIMessage = { type: \"remove-ui\", id };\n items.push(evt);\n config.writer?.(evt);\n config.configurable?.__pregel_send?.([[stateKey, evt]]);\n return evt;\n };\n\n return { push: handlePush, delete: handleDelete, items };\n};\n"],"mappings":";;;;;;;;;;;AAgBA,MAAa,WACX,QAWA,YAIG;CAEH,MAAM,QAAyC,EAAE;CACjD,MAAM,WAAW,SAAS,YAAY;CAEtC,MAAM,QAAS,OAAO,UAAU,UAAiC,OAAO;AACxE,KAAI,CAAC,MAAO,OAAM,IAAI,MAAM,qBAAqB;CAsBjD,SAAS,WACP,SAMA,SACgD;EAChD,MAAM,MAAsD;GAC1D,MAAM;GACN,IAAI,SAAS,OAAA,GAAA,KAAA,KAAc;GAC3B,MAAM,SAAS;GACf,OAAO,SAAS;GAChB,UAAU;IACR,OAAO,SAAS,SAAS,KAAA;IACzB,QAAQ;IACR,MAAM,OAAO;IACb,MAAM,OAAO;IACb,GAAG,SAAS;IACZ,GAAI,SAAS,UAAU,EAAE,IAAI,QAAQ,QAAQ,IAAI,GAAG;IACrD;GACF;AACD,QAAM,KAAK,IAAI;AACf,SAAO,SAAS,IAAI;AACpB,SAAO,cAAc,gBAAgB,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;AACvD,SAAO;;CAGT,MAAM,gBAAgB,OAAgC;EACpD,MAAM,MAAuB;GAAE,MAAM;GAAa;GAAI;AACtD,QAAM,KAAK,IAAI;AACf,SAAO,SAAS,IAAI;AACpB,SAAO,cAAc,gBAAgB,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;AACvD,SAAO;;AAGT,QAAO;EAAE,MAAM;EAAY,QAAQ;EAAc;EAAO"}
1
+ {"version":3,"file":"server.cjs","names":[],"sources":["../../../src/react-ui/server/server.ts"],"sourcesContent":["import { v4 as uuidv4 } from \"@langchain/core/utils/uuid\";\nimport type { ComponentPropsWithoutRef, ElementType } from \"react\";\nimport type { RemoveUIMessage, UIMessage } from \"../types.js\";\n\ninterface MessageLike {\n id?: string;\n}\n\n/**\n * Helper to send and persist UI messages. Accepts a map of component names to React components\n * as type argument to provide type safety. Will also write to the `options?.stateKey` state.\n *\n * @param config LangGraphRunnableConfig\n * @param options\n * @returns\n */\nexport const typedUi = <Decl extends Record<string, ElementType>>(\n config: {\n writer?: (chunk: unknown) => void;\n runId?: string;\n metadata?: Record<string, unknown>;\n tags?: string[];\n runName?: string;\n configurable?: {\n __pregel_send?: (writes_: [string, unknown][]) => void;\n [key: string]: unknown;\n };\n },\n options?: {\n /** The key to write the UI messages to. Defaults to `ui`. */\n stateKey?: string;\n }\n) => {\n type PropMap = { [K in keyof Decl]: ComponentPropsWithoutRef<Decl[K]> };\n const items: (UIMessage | RemoveUIMessage)[] = [];\n const stateKey = options?.stateKey ?? \"ui\";\n\n const runId = (config.metadata?.run_id as string | undefined) ?? config.runId;\n if (!runId) throw new Error(\"run_id is required\");\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: PropMap[K];\n metadata?: Record<string, unknown>;\n },\n options?: { message?: MessageLike; merge?: boolean }\n ): UIMessage<K, PropMap[K]>;\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: Partial<PropMap[K]>;\n metadata?: Record<string, unknown>;\n },\n options: { message?: MessageLike; merge: true }\n ): UIMessage<K, Partial<PropMap[K]>>;\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: PropMap[K] | Partial<PropMap[K]>;\n metadata?: Record<string, unknown>;\n },\n options?: { message?: MessageLike; merge?: boolean }\n ): UIMessage<K, PropMap[K] | Partial<PropMap[K]>> {\n const evt: UIMessage<K, PropMap[K] | Partial<PropMap[K]>> = {\n type: \"ui\" as const,\n id: message?.id ?? uuidv4(),\n name: message?.name,\n props: message?.props,\n metadata: {\n merge: options?.merge || undefined,\n run_id: runId,\n tags: config.tags,\n name: config.runName,\n ...message?.metadata,\n ...(options?.message ? { id: options.message.id } : null),\n },\n };\n items.push(evt);\n config.writer?.(evt);\n config.configurable?.__pregel_send?.([[stateKey, evt]]);\n return evt;\n }\n\n const handleDelete = (id: string): RemoveUIMessage => {\n const evt: RemoveUIMessage = { type: \"remove-ui\", id };\n items.push(evt);\n config.writer?.(evt);\n config.configurable?.__pregel_send?.([[stateKey, evt]]);\n return evt;\n };\n\n return { push: handlePush, delete: handleDelete, items };\n};\n"],"mappings":";;;;;;;;;;;AAgBA,MAAa,WACX,QAWA,YAIG;CAEH,MAAM,QAAyC,EAAE;CACjD,MAAM,WAAW,SAAS,YAAY;CAEtC,MAAM,QAAS,OAAO,UAAU,UAAiC,OAAO;AACxE,KAAI,CAAC,MAAO,OAAM,IAAI,MAAM,qBAAqB;CAsBjD,SAAS,WACP,SAMA,SACgD;EAChD,MAAM,MAAsD;GAC1D,MAAM;GACN,IAAI,SAAS,OAAA,GAAA,2BAAA,KAAc;GAC3B,MAAM,SAAS;GACf,OAAO,SAAS;GAChB,UAAU;IACR,OAAO,SAAS,SAAS,KAAA;IACzB,QAAQ;IACR,MAAM,OAAO;IACb,MAAM,OAAO;IACb,GAAG,SAAS;IACZ,GAAI,SAAS,UAAU,EAAE,IAAI,QAAQ,QAAQ,IAAI,GAAG;IACrD;GACF;AACD,QAAM,KAAK,IAAI;AACf,SAAO,SAAS,IAAI;AACpB,SAAO,cAAc,gBAAgB,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;AACvD,SAAO;;CAGT,MAAM,gBAAgB,OAAgC;EACpD,MAAM,MAAuB;GAAE,MAAM;GAAa;GAAI;AACtD,QAAM,KAAK,IAAI;AACf,SAAO,SAAS,IAAI;AACpB,SAAO,cAAc,gBAAgB,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;AACvD,SAAO;;AAGT,QAAO;EAAE,MAAM;EAAY,QAAQ;EAAc;EAAO"}
@@ -1,4 +1,4 @@
1
- import { v4 } from "uuid";
1
+ import { v4 } from "@langchain/core/utils/uuid";
2
2
  //#region src/react-ui/server/server.ts
3
3
  /**
4
4
  * Helper to send and persist UI messages. Accepts a map of component names to React components
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","names":["uuidv4"],"sources":["../../../src/react-ui/server/server.ts"],"sourcesContent":["import { v4 as uuidv4 } from \"uuid\";\nimport type { ComponentPropsWithoutRef, ElementType } from \"react\";\nimport type { RemoveUIMessage, UIMessage } from \"../types.js\";\n\ninterface MessageLike {\n id?: string;\n}\n\n/**\n * Helper to send and persist UI messages. Accepts a map of component names to React components\n * as type argument to provide type safety. Will also write to the `options?.stateKey` state.\n *\n * @param config LangGraphRunnableConfig\n * @param options\n * @returns\n */\nexport const typedUi = <Decl extends Record<string, ElementType>>(\n config: {\n writer?: (chunk: unknown) => void;\n runId?: string;\n metadata?: Record<string, unknown>;\n tags?: string[];\n runName?: string;\n configurable?: {\n __pregel_send?: (writes_: [string, unknown][]) => void;\n [key: string]: unknown;\n };\n },\n options?: {\n /** The key to write the UI messages to. Defaults to `ui`. */\n stateKey?: string;\n }\n) => {\n type PropMap = { [K in keyof Decl]: ComponentPropsWithoutRef<Decl[K]> };\n const items: (UIMessage | RemoveUIMessage)[] = [];\n const stateKey = options?.stateKey ?? \"ui\";\n\n const runId = (config.metadata?.run_id as string | undefined) ?? config.runId;\n if (!runId) throw new Error(\"run_id is required\");\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: PropMap[K];\n metadata?: Record<string, unknown>;\n },\n options?: { message?: MessageLike; merge?: boolean }\n ): UIMessage<K, PropMap[K]>;\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: Partial<PropMap[K]>;\n metadata?: Record<string, unknown>;\n },\n options: { message?: MessageLike; merge: true }\n ): UIMessage<K, Partial<PropMap[K]>>;\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: PropMap[K] | Partial<PropMap[K]>;\n metadata?: Record<string, unknown>;\n },\n options?: { message?: MessageLike; merge?: boolean }\n ): UIMessage<K, PropMap[K] | Partial<PropMap[K]>> {\n const evt: UIMessage<K, PropMap[K] | Partial<PropMap[K]>> = {\n type: \"ui\" as const,\n id: message?.id ?? uuidv4(),\n name: message?.name,\n props: message?.props,\n metadata: {\n merge: options?.merge || undefined,\n run_id: runId,\n tags: config.tags,\n name: config.runName,\n ...message?.metadata,\n ...(options?.message ? { id: options.message.id } : null),\n },\n };\n items.push(evt);\n config.writer?.(evt);\n config.configurable?.__pregel_send?.([[stateKey, evt]]);\n return evt;\n }\n\n const handleDelete = (id: string): RemoveUIMessage => {\n const evt: RemoveUIMessage = { type: \"remove-ui\", id };\n items.push(evt);\n config.writer?.(evt);\n config.configurable?.__pregel_send?.([[stateKey, evt]]);\n return evt;\n };\n\n return { push: handlePush, delete: handleDelete, items };\n};\n"],"mappings":";;;;;;;;;;AAgBA,MAAa,WACX,QAWA,YAIG;CAEH,MAAM,QAAyC,EAAE;CACjD,MAAM,WAAW,SAAS,YAAY;CAEtC,MAAM,QAAS,OAAO,UAAU,UAAiC,OAAO;AACxE,KAAI,CAAC,MAAO,OAAM,IAAI,MAAM,qBAAqB;CAsBjD,SAAS,WACP,SAMA,SACgD;EAChD,MAAM,MAAsD;GAC1D,MAAM;GACN,IAAI,SAAS,MAAMA,IAAQ;GAC3B,MAAM,SAAS;GACf,OAAO,SAAS;GAChB,UAAU;IACR,OAAO,SAAS,SAAS,KAAA;IACzB,QAAQ;IACR,MAAM,OAAO;IACb,MAAM,OAAO;IACb,GAAG,SAAS;IACZ,GAAI,SAAS,UAAU,EAAE,IAAI,QAAQ,QAAQ,IAAI,GAAG;IACrD;GACF;AACD,QAAM,KAAK,IAAI;AACf,SAAO,SAAS,IAAI;AACpB,SAAO,cAAc,gBAAgB,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;AACvD,SAAO;;CAGT,MAAM,gBAAgB,OAAgC;EACpD,MAAM,MAAuB;GAAE,MAAM;GAAa;GAAI;AACtD,QAAM,KAAK,IAAI;AACf,SAAO,SAAS,IAAI;AACpB,SAAO,cAAc,gBAAgB,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;AACvD,SAAO;;AAGT,QAAO;EAAE,MAAM;EAAY,QAAQ;EAAc;EAAO"}
1
+ {"version":3,"file":"server.js","names":["uuidv4"],"sources":["../../../src/react-ui/server/server.ts"],"sourcesContent":["import { v4 as uuidv4 } from \"@langchain/core/utils/uuid\";\nimport type { ComponentPropsWithoutRef, ElementType } from \"react\";\nimport type { RemoveUIMessage, UIMessage } from \"../types.js\";\n\ninterface MessageLike {\n id?: string;\n}\n\n/**\n * Helper to send and persist UI messages. Accepts a map of component names to React components\n * as type argument to provide type safety. Will also write to the `options?.stateKey` state.\n *\n * @param config LangGraphRunnableConfig\n * @param options\n * @returns\n */\nexport const typedUi = <Decl extends Record<string, ElementType>>(\n config: {\n writer?: (chunk: unknown) => void;\n runId?: string;\n metadata?: Record<string, unknown>;\n tags?: string[];\n runName?: string;\n configurable?: {\n __pregel_send?: (writes_: [string, unknown][]) => void;\n [key: string]: unknown;\n };\n },\n options?: {\n /** The key to write the UI messages to. Defaults to `ui`. */\n stateKey?: string;\n }\n) => {\n type PropMap = { [K in keyof Decl]: ComponentPropsWithoutRef<Decl[K]> };\n const items: (UIMessage | RemoveUIMessage)[] = [];\n const stateKey = options?.stateKey ?? \"ui\";\n\n const runId = (config.metadata?.run_id as string | undefined) ?? config.runId;\n if (!runId) throw new Error(\"run_id is required\");\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: PropMap[K];\n metadata?: Record<string, unknown>;\n },\n options?: { message?: MessageLike; merge?: boolean }\n ): UIMessage<K, PropMap[K]>;\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: Partial<PropMap[K]>;\n metadata?: Record<string, unknown>;\n },\n options: { message?: MessageLike; merge: true }\n ): UIMessage<K, Partial<PropMap[K]>>;\n\n function handlePush<K extends keyof PropMap & string>(\n message: {\n id?: string;\n name: K;\n props: PropMap[K] | Partial<PropMap[K]>;\n metadata?: Record<string, unknown>;\n },\n options?: { message?: MessageLike; merge?: boolean }\n ): UIMessage<K, PropMap[K] | Partial<PropMap[K]>> {\n const evt: UIMessage<K, PropMap[K] | Partial<PropMap[K]>> = {\n type: \"ui\" as const,\n id: message?.id ?? uuidv4(),\n name: message?.name,\n props: message?.props,\n metadata: {\n merge: options?.merge || undefined,\n run_id: runId,\n tags: config.tags,\n name: config.runName,\n ...message?.metadata,\n ...(options?.message ? { id: options.message.id } : null),\n },\n };\n items.push(evt);\n config.writer?.(evt);\n config.configurable?.__pregel_send?.([[stateKey, evt]]);\n return evt;\n }\n\n const handleDelete = (id: string): RemoveUIMessage => {\n const evt: RemoveUIMessage = { type: \"remove-ui\", id };\n items.push(evt);\n config.writer?.(evt);\n config.configurable?.__pregel_send?.([[stateKey, evt]]);\n return evt;\n };\n\n return { push: handlePush, delete: handleDelete, items };\n};\n"],"mappings":";;;;;;;;;;AAgBA,MAAa,WACX,QAWA,YAIG;CAEH,MAAM,QAAyC,EAAE;CACjD,MAAM,WAAW,SAAS,YAAY;CAEtC,MAAM,QAAS,OAAO,UAAU,UAAiC,OAAO;AACxE,KAAI,CAAC,MAAO,OAAM,IAAI,MAAM,qBAAqB;CAsBjD,SAAS,WACP,SAMA,SACgD;EAChD,MAAM,MAAsD;GAC1D,MAAM;GACN,IAAI,SAAS,MAAMA,IAAQ;GAC3B,MAAM,SAAS;GACf,OAAO,SAAS;GAChB,UAAU;IACR,OAAO,SAAS,SAAS,KAAA;IACzB,QAAQ;IACR,MAAM,OAAO;IACb,MAAM,OAAO;IACb,GAAG,SAAS;IACZ,GAAI,SAAS,UAAU,EAAE,IAAI,QAAQ,QAAQ,IAAI,GAAG;IACrD;GACF;AACD,QAAM,KAAK,IAAI;AACf,SAAO,SAAS,IAAI;AACpB,SAAO,cAAc,gBAAgB,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;AACvD,SAAO;;CAGT,MAAM,gBAAgB,OAAgC;EACpD,MAAM,MAAuB;GAAE,MAAM;GAAa;GAAI;AACtD,QAAM,KAAK,IAAI;AACf,SAAO,SAAS,IAAI;AACpB,SAAO,cAAc,gBAAgB,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;AACvD,SAAO;;AAGT,QAAO;EAAE,MAAM;EAAY,QAAQ;EAAc;EAAO"}
@@ -18,7 +18,7 @@ const require_root_message_projection = require("./root-message-projection.cjs")
18
18
  const require_optimistic_input = require("./optimistic-input.cjs");
19
19
  const require_submit_coordinator = require("./submit-coordinator.cjs");
20
20
  const require_tool_calls = require("./tool-calls.cjs");
21
- let uuid = require("uuid");
21
+ let _langchain_core_utils_uuid = require("@langchain/core/utils/uuid");
22
22
  require("@langchain/core/messages");
23
23
  //#region src/stream/controller.ts
24
24
  /**
@@ -466,7 +466,25 @@ var StreamController = class {
466
466
  * idempotent, so this is safe on re-hydrate.
467
467
  */
468
468
  const seedMessages = state.values[this.#messagesKey];
469
- if (Array.isArray(seedMessages)) this.#subagents.seedFromCheckpointMessages(seedMessages);
469
+ if (Array.isArray(seedMessages)) {
470
+ this.#subagents.seedFromCheckpointMessages(seedMessages);
471
+ /**
472
+ * An idle (finished) thread defers its root SSE pump; the first
473
+ * `submit()` brings it up and the transport replays the finished
474
+ * run from `seq=0`. Seal the seeded message ids so that replay's
475
+ * `messages` channel deltas can't downgrade the already-complete
476
+ * tail to empty partials (a visible "messages replay"). Only safe
477
+ * for idle threads, where every seeded message is final — an
478
+ * active thread's tail may still be streaming and must keep
479
+ * receiving deltas. New ids from the next run are never sealed,
480
+ * and the seal lifts once a newer checkpoint advances the
481
+ * timeline.
482
+ */
483
+ if (!threadActive) {
484
+ const sealedIds = seedMessages.map((message) => message?.id).filter((id) => typeof id === "string");
485
+ if (sealedIds.length > 0) this.#rootMessages.sealMessageIds(sealedIds);
486
+ }
487
+ }
470
488
  }
471
489
  /**
472
490
  * Converge to server truth: drop any optimistic messages the
@@ -1511,7 +1529,7 @@ var StreamController = class {
1511
1529
  #beginOptimistic(input) {
1512
1530
  if (this.#options.optimistic === false) return void 0;
1513
1531
  if (input == null || typeof input !== "object" || Array.isArray(input)) return;
1514
- const prepared = require_optimistic_input.prepareOptimisticInput(input, this.#messagesKey, () => (0, uuid.v7)());
1532
+ const prepared = require_optimistic_input.prepareOptimisticInput(input, this.#messagesKey, () => (0, _langchain_core_utils_uuid.v7)());
1515
1533
  const extraKeys = Object.keys(prepared.extraValues);
1516
1534
  if (prepared.echoedIds.length === 0 && extraKeys.length === 0) return;
1517
1535
  const currentValues = this.rootStore.getSnapshot().values;