@langchain/langgraph-sdk 1.9.20 → 1.9.21

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 (90) hide show
  1. package/dist/client/index.cjs +1 -1
  2. package/dist/client/index.js +1 -1
  3. package/dist/client/stream/error.cjs +21 -0
  4. package/dist/client/stream/error.cjs.map +1 -1
  5. package/dist/client/stream/error.js +21 -1
  6. package/dist/client/stream/error.js.map +1 -1
  7. package/dist/client/stream/index.cjs +24 -1
  8. package/dist/client/stream/index.cjs.map +1 -1
  9. package/dist/client/stream/index.d.cts.map +1 -1
  10. package/dist/client/stream/index.d.ts.map +1 -1
  11. package/dist/client/stream/index.js +24 -1
  12. package/dist/client/stream/index.js.map +1 -1
  13. package/dist/client/stream/transport/agent-server.cjs +2 -1
  14. package/dist/client/stream/transport/agent-server.cjs.map +1 -1
  15. package/dist/client/stream/transport/agent-server.d.cts +7 -0
  16. package/dist/client/stream/transport/agent-server.d.cts.map +1 -1
  17. package/dist/client/stream/transport/agent-server.d.ts +7 -0
  18. package/dist/client/stream/transport/agent-server.d.ts.map +1 -1
  19. package/dist/client/stream/transport/agent-server.js +2 -1
  20. package/dist/client/stream/transport/agent-server.js.map +1 -1
  21. package/dist/client/stream/transport/http.cjs +48 -9
  22. package/dist/client/stream/transport/http.cjs.map +1 -1
  23. package/dist/client/stream/transport/http.d.cts +4 -0
  24. package/dist/client/stream/transport/http.d.cts.map +1 -1
  25. package/dist/client/stream/transport/http.d.ts +4 -0
  26. package/dist/client/stream/transport/http.d.ts.map +1 -1
  27. package/dist/client/stream/transport/http.js +48 -9
  28. package/dist/client/stream/transport/http.js.map +1 -1
  29. package/dist/client/stream/transport/index.cjs +2 -1
  30. package/dist/client/stream/transport/index.js +2 -1
  31. package/dist/client/stream/transport/types.d.cts +44 -0
  32. package/dist/client/stream/transport/types.d.cts.map +1 -1
  33. package/dist/client/stream/transport/types.d.ts +44 -0
  34. package/dist/client/stream/transport/types.d.ts.map +1 -1
  35. package/dist/client/stream/transport/websocket.cjs +105 -16
  36. package/dist/client/stream/transport/websocket.cjs.map +1 -1
  37. package/dist/client/stream/transport/websocket.d.cts +19 -0
  38. package/dist/client/stream/transport/websocket.d.cts.map +1 -1
  39. package/dist/client/stream/transport/websocket.d.ts +19 -0
  40. package/dist/client/stream/transport/websocket.d.ts.map +1 -1
  41. package/dist/client/stream/transport/websocket.js +105 -17
  42. package/dist/client/stream/transport/websocket.js.map +1 -1
  43. package/dist/client/stream/types.d.cts +17 -0
  44. package/dist/client/stream/types.d.cts.map +1 -1
  45. package/dist/client/stream/types.d.ts +17 -0
  46. package/dist/client/stream/types.d.ts.map +1 -1
  47. package/dist/client/threads/index.cjs +30 -14
  48. package/dist/client/threads/index.cjs.map +1 -1
  49. package/dist/client/threads/index.js +30 -14
  50. package/dist/client/threads/index.js.map +1 -1
  51. package/dist/client.cjs +1 -1
  52. package/dist/client.js +1 -1
  53. package/dist/index.cjs +1 -1
  54. package/dist/index.js +1 -1
  55. package/dist/stream/controller.cjs +19 -1
  56. package/dist/stream/controller.cjs.map +1 -1
  57. package/dist/stream/controller.d.cts.map +1 -1
  58. package/dist/stream/controller.d.ts.map +1 -1
  59. package/dist/stream/controller.js +19 -1
  60. package/dist/stream/controller.js.map +1 -1
  61. package/dist/stream/index.cjs +2 -0
  62. package/dist/stream/index.d.cts +2 -1
  63. package/dist/stream/index.d.ts +2 -1
  64. package/dist/stream/index.js +2 -1
  65. package/dist/stream/projections/channel-effect.cjs +52 -0
  66. package/dist/stream/projections/channel-effect.cjs.map +1 -0
  67. package/dist/stream/projections/channel-effect.d.cts +35 -0
  68. package/dist/stream/projections/channel-effect.d.cts.map +1 -0
  69. package/dist/stream/projections/channel-effect.d.ts +35 -0
  70. package/dist/stream/projections/channel-effect.d.ts.map +1 -0
  71. package/dist/stream/projections/channel-effect.js +52 -0
  72. package/dist/stream/projections/channel-effect.js.map +1 -0
  73. package/dist/stream/projections/index.cjs +1 -0
  74. package/dist/stream/projections/index.d.ts +1 -0
  75. package/dist/stream/projections/index.js +1 -0
  76. package/dist/stream/root-message-projection.cjs +55 -0
  77. package/dist/stream/root-message-projection.cjs.map +1 -1
  78. package/dist/stream/root-message-projection.js +55 -0
  79. package/dist/stream/root-message-projection.js.map +1 -1
  80. package/dist/ui/branching.d.cts +1 -1
  81. package/dist/ui/branching.d.ts +1 -1
  82. package/dist/ui/orchestrator.d.cts +1 -1
  83. package/dist/ui/orchestrator.d.cts.map +1 -1
  84. package/dist/ui/orchestrator.d.ts +1 -1
  85. package/dist/ui/orchestrator.d.ts.map +1 -1
  86. package/dist/utils/stream.d.cts +1 -1
  87. package/dist/utils/stream.d.cts.map +1 -1
  88. package/dist/utils/stream.d.ts +1 -1
  89. package/dist/utils/stream.d.ts.map +1 -1
  90. package/package.json +5 -2
@@ -8,8 +8,8 @@ require("./stream/handles/subgraphs.cjs");
8
8
  require("./stream/handles/subagents.cjs");
9
9
  require("./stream/error.cjs");
10
10
  require("./stream/index.cjs");
11
- require("./stream/transport/http.cjs");
12
11
  require("./stream/transport/websocket.cjs");
12
+ require("./stream/transport/http.cjs");
13
13
  const require_index$2 = require("./threads/index.cjs");
14
14
  const require_index$3 = require("./runs/index.cjs");
15
15
  const require_index$4 = require("./crons/index.cjs");
@@ -8,8 +8,8 @@ import "./stream/handles/subgraphs.js";
8
8
  import "./stream/handles/subagents.js";
9
9
  import "./stream/error.js";
10
10
  import "./stream/index.js";
11
- import "./stream/transport/http.js";
12
11
  import "./stream/transport/websocket.js";
12
+ import "./stream/transport/http.js";
13
13
  import { ThreadsClient } from "./threads/index.js";
14
14
  import { RunsClient } from "./runs/index.js";
15
15
  import { CronsClient } from "./crons/index.js";
@@ -12,7 +12,28 @@ var ProtocolError = class extends Error {
12
12
  this.response = response;
13
13
  }
14
14
  };
15
+ /**
16
+ * Thrown when the v2 WebSocket transport exhausts its automatic reconnect
17
+ * budget (`maxReconnectAttempts`) after an unexpected socket close or error.
18
+ *
19
+ * The transport closes its event queue with this error so consumers of
20
+ * `events()` can treat the stream as terminally failed. Set
21
+ * `maxReconnectAttempts` to `0` on `client.threads.stream({ transport:
22
+ * "websocket" })` to disable reconnect and fail fast on the first drop
23
+ * instead.
24
+ */
25
+ var MaxWebSocketReconnectAttemptsError = class extends Error {
26
+ /** The configured `maxReconnectAttempts` value that was exceeded. */
27
+ maxAttempts;
28
+ constructor(maxAttempts, cause) {
29
+ super(`Exceeded maximum WebSocket reconnection attempts (${maxAttempts})`);
30
+ this.name = "MaxWebSocketReconnectAttemptsError";
31
+ this.maxAttempts = maxAttempts;
32
+ this.cause = cause;
33
+ }
34
+ };
15
35
  //#endregion
36
+ exports.MaxWebSocketReconnectAttemptsError = MaxWebSocketReconnectAttemptsError;
16
37
  exports.ProtocolError = ProtocolError;
17
38
 
18
39
  //# sourceMappingURL=error.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.cjs","names":[],"sources":["../../../src/client/stream/error.ts"],"sourcesContent":["import type { ErrorResponse } from \"@langchain/protocol\";\n\n/**\n * Error wrapper for protocol-level error responses returned by the server.\n */\nexport class ProtocolError extends Error {\n readonly code: ErrorResponse[\"error\"];\n readonly response: ErrorResponse;\n\n constructor(response: ErrorResponse) {\n super(response.message);\n this.name = \"ProtocolError\";\n this.code = response.error;\n this.response = response;\n }\n}\n"],"mappings":";;;;AAKA,IAAa,gBAAb,cAAmC,MAAM;CACvC;CACA;CAEA,YAAY,UAAyB;AACnC,QAAM,SAAS,QAAQ;AACvB,OAAK,OAAO;AACZ,OAAK,OAAO,SAAS;AACrB,OAAK,WAAW"}
1
+ {"version":3,"file":"error.cjs","names":[],"sources":["../../../src/client/stream/error.ts"],"sourcesContent":["import type { ErrorResponse } from \"@langchain/protocol\";\n\n/**\n * Error wrapper for protocol-level error responses returned by the server.\n */\nexport class ProtocolError extends Error {\n readonly code: ErrorResponse[\"error\"];\n readonly response: ErrorResponse;\n\n constructor(response: ErrorResponse) {\n super(response.message);\n this.name = \"ProtocolError\";\n this.code = response.error;\n this.response = response;\n }\n}\n\n/**\n * Thrown when the v2 WebSocket transport exhausts its automatic reconnect\n * budget (`maxReconnectAttempts`) after an unexpected socket close or error.\n *\n * The transport closes its event queue with this error so consumers of\n * `events()` can treat the stream as terminally failed. Set\n * `maxReconnectAttempts` to `0` on `client.threads.stream({ transport:\n * \"websocket\" })` to disable reconnect and fail fast on the first drop\n * instead.\n */\nexport class MaxWebSocketReconnectAttemptsError extends Error {\n /** The configured `maxReconnectAttempts` value that was exceeded. */\n readonly maxAttempts: number;\n\n constructor(maxAttempts: number, cause: unknown) {\n super(`Exceeded maximum WebSocket reconnection attempts (${maxAttempts})`);\n this.name = \"MaxWebSocketReconnectAttemptsError\";\n this.maxAttempts = maxAttempts;\n this.cause = cause;\n }\n}\n"],"mappings":";;;;AAKA,IAAa,gBAAb,cAAmC,MAAM;CACvC;CACA;CAEA,YAAY,UAAyB;AACnC,QAAM,SAAS,QAAQ;AACvB,OAAK,OAAO;AACZ,OAAK,OAAO,SAAS;AACrB,OAAK,WAAW;;;;;;;;;;;;;AAcpB,IAAa,qCAAb,cAAwD,MAAM;;CAE5D;CAEA,YAAY,aAAqB,OAAgB;AAC/C,QAAM,qDAAqD,YAAY,GAAG;AAC1E,OAAK,OAAO;AACZ,OAAK,cAAc;AACnB,OAAK,QAAQ"}
@@ -12,7 +12,27 @@ var ProtocolError = class extends Error {
12
12
  this.response = response;
13
13
  }
14
14
  };
15
+ /**
16
+ * Thrown when the v2 WebSocket transport exhausts its automatic reconnect
17
+ * budget (`maxReconnectAttempts`) after an unexpected socket close or error.
18
+ *
19
+ * The transport closes its event queue with this error so consumers of
20
+ * `events()` can treat the stream as terminally failed. Set
21
+ * `maxReconnectAttempts` to `0` on `client.threads.stream({ transport:
22
+ * "websocket" })` to disable reconnect and fail fast on the first drop
23
+ * instead.
24
+ */
25
+ var MaxWebSocketReconnectAttemptsError = class extends Error {
26
+ /** The configured `maxReconnectAttempts` value that was exceeded. */
27
+ maxAttempts;
28
+ constructor(maxAttempts, cause) {
29
+ super(`Exceeded maximum WebSocket reconnection attempts (${maxAttempts})`);
30
+ this.name = "MaxWebSocketReconnectAttemptsError";
31
+ this.maxAttempts = maxAttempts;
32
+ this.cause = cause;
33
+ }
34
+ };
15
35
  //#endregion
16
- export { ProtocolError };
36
+ export { MaxWebSocketReconnectAttemptsError, ProtocolError };
17
37
 
18
38
  //# sourceMappingURL=error.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.js","names":[],"sources":["../../../src/client/stream/error.ts"],"sourcesContent":["import type { ErrorResponse } from \"@langchain/protocol\";\n\n/**\n * Error wrapper for protocol-level error responses returned by the server.\n */\nexport class ProtocolError extends Error {\n readonly code: ErrorResponse[\"error\"];\n readonly response: ErrorResponse;\n\n constructor(response: ErrorResponse) {\n super(response.message);\n this.name = \"ProtocolError\";\n this.code = response.error;\n this.response = response;\n }\n}\n"],"mappings":";;;;AAKA,IAAa,gBAAb,cAAmC,MAAM;CACvC;CACA;CAEA,YAAY,UAAyB;AACnC,QAAM,SAAS,QAAQ;AACvB,OAAK,OAAO;AACZ,OAAK,OAAO,SAAS;AACrB,OAAK,WAAW"}
1
+ {"version":3,"file":"error.js","names":[],"sources":["../../../src/client/stream/error.ts"],"sourcesContent":["import type { ErrorResponse } from \"@langchain/protocol\";\n\n/**\n * Error wrapper for protocol-level error responses returned by the server.\n */\nexport class ProtocolError extends Error {\n readonly code: ErrorResponse[\"error\"];\n readonly response: ErrorResponse;\n\n constructor(response: ErrorResponse) {\n super(response.message);\n this.name = \"ProtocolError\";\n this.code = response.error;\n this.response = response;\n }\n}\n\n/**\n * Thrown when the v2 WebSocket transport exhausts its automatic reconnect\n * budget (`maxReconnectAttempts`) after an unexpected socket close or error.\n *\n * The transport closes its event queue with this error so consumers of\n * `events()` can treat the stream as terminally failed. Set\n * `maxReconnectAttempts` to `0` on `client.threads.stream({ transport:\n * \"websocket\" })` to disable reconnect and fail fast on the first drop\n * instead.\n */\nexport class MaxWebSocketReconnectAttemptsError extends Error {\n /** The configured `maxReconnectAttempts` value that was exceeded. */\n readonly maxAttempts: number;\n\n constructor(maxAttempts: number, cause: unknown) {\n super(`Exceeded maximum WebSocket reconnection attempts (${maxAttempts})`);\n this.name = \"MaxWebSocketReconnectAttemptsError\";\n this.maxAttempts = maxAttempts;\n this.cause = cause;\n }\n}\n"],"mappings":";;;;AAKA,IAAa,gBAAb,cAAmC,MAAM;CACvC;CACA;CAEA,YAAY,UAAyB;AACnC,QAAM,SAAS,QAAQ;AACvB,OAAK,OAAO;AACZ,OAAK,OAAO,SAAS;AACrB,OAAK,WAAW;;;;;;;;;;;;;AAcpB,IAAa,qCAAb,cAAwD,MAAM;;CAE5D;CAEA,YAAY,aAAqB,OAAgB;AAC/C,QAAM,qDAAqD,YAAY,GAAG;AAC1E,OAAK,OAAO;AACZ,OAAK,cAAc;AACnB,OAAK,QAAQ"}
@@ -436,7 +436,10 @@ var ThreadStream = class {
436
436
  listCheckpoints: async (params) => await this.#send("state.listCheckpoints", params),
437
437
  fork: async (params) => await this.#send("state.fork", params)
438
438
  };
439
- if (this.#transportAdapter.openEventStream == null) this.#consumeEvents();
439
+ if (this.#transportAdapter.openEventStream == null) {
440
+ this.#transportAdapter.setOnReconnected?.(() => this.#resubscribeWebSocketSubscriptions());
441
+ this.#consumeEvents();
442
+ }
440
443
  }
441
444
  /**
442
445
  * Ensure the underlying transport is connected.
@@ -1375,6 +1378,26 @@ var ThreadStream = class {
1375
1378
  this.#subscriptions.set(resolvedId, subscription);
1376
1379
  return handle;
1377
1380
  }
1381
+ /**
1382
+ * Re-issue `subscription.subscribe` for every active WS subscription
1383
+ * after the transport reconnects. The server replays buffered events on
1384
+ * the new socket; client-side `event_id` dedup suppresses duplicates.
1385
+ */
1386
+ async #resubscribeWebSocketSubscriptions() {
1387
+ if (this.#transportAdapter.openEventStream != null || this.#closed) return;
1388
+ const entries = [...this.#subscriptions.entries()];
1389
+ await Promise.all(entries.map(async ([id, subscription]) => {
1390
+ if (id.startsWith("pending:")) return;
1391
+ try {
1392
+ const nextId = (await this.#send("subscription.subscribe", subscription.filter)).subscription_id;
1393
+ if (nextId === id) return;
1394
+ this.#subscriptions.delete(id);
1395
+ subscription.subscriptionId = nextId;
1396
+ this.#subscriptions.set(nextId, subscription);
1397
+ if (this.#lifecycleSubId === id) this.#lifecycleSubId = nextId;
1398
+ } catch {}
1399
+ }));
1400
+ }
1378
1401
  async #consumeEvents() {
1379
1402
  try {
1380
1403
  for await (const message of this.#transportAdapter.events()) this.#handleIncoming(message);