@langchain/langgraph-sdk 1.11.1 → 1.12.0-rc.0

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 (68) hide show
  1. package/dist/client/base.cjs +7 -0
  2. package/dist/client/base.cjs.map +1 -1
  3. package/dist/client/base.d.cts.map +1 -1
  4. package/dist/client/base.d.ts.map +1 -1
  5. package/dist/client/base.js +7 -0
  6. package/dist/client/base.js.map +1 -1
  7. package/dist/client/stream/messages.cjs +54 -17
  8. package/dist/client/stream/messages.cjs.map +1 -1
  9. package/dist/client/stream/messages.d.cts +3 -0
  10. package/dist/client/stream/messages.d.cts.map +1 -1
  11. package/dist/client/stream/messages.d.ts +3 -0
  12. package/dist/client/stream/messages.d.ts.map +1 -1
  13. package/dist/client/stream/messages.js +54 -17
  14. package/dist/client/stream/messages.js.map +1 -1
  15. package/dist/stream/assembled-to-message.cjs +42 -8
  16. package/dist/stream/assembled-to-message.cjs.map +1 -1
  17. package/dist/stream/assembled-to-message.d.cts +11 -0
  18. package/dist/stream/assembled-to-message.d.cts.map +1 -1
  19. package/dist/stream/assembled-to-message.d.ts +11 -0
  20. package/dist/stream/assembled-to-message.d.ts.map +1 -1
  21. package/dist/stream/assembled-to-message.js +42 -8
  22. package/dist/stream/assembled-to-message.js.map +1 -1
  23. package/dist/stream/controller.cjs +39 -10
  24. package/dist/stream/controller.cjs.map +1 -1
  25. package/dist/stream/controller.d.cts +7 -6
  26. package/dist/stream/controller.d.cts.map +1 -1
  27. package/dist/stream/controller.d.ts +7 -6
  28. package/dist/stream/controller.d.ts.map +1 -1
  29. package/dist/stream/controller.js +37 -8
  30. package/dist/stream/controller.js.map +1 -1
  31. package/dist/stream/dispatch-config.cjs +23 -0
  32. package/dist/stream/dispatch-config.cjs.map +1 -0
  33. package/dist/stream/dispatch-config.js +23 -0
  34. package/dist/stream/dispatch-config.js.map +1 -0
  35. package/dist/stream/index.d.cts +1 -1
  36. package/dist/stream/index.d.ts +1 -1
  37. package/dist/stream/lifecycle-loading-tracker.cjs +8 -0
  38. package/dist/stream/lifecycle-loading-tracker.cjs.map +1 -1
  39. package/dist/stream/lifecycle-loading-tracker.js +8 -0
  40. package/dist/stream/lifecycle-loading-tracker.js.map +1 -1
  41. package/dist/stream/queue-adapter-agent-server.cjs +204 -0
  42. package/dist/stream/queue-adapter-agent-server.cjs.map +1 -0
  43. package/dist/stream/queue-adapter-agent-server.js +203 -0
  44. package/dist/stream/queue-adapter-agent-server.js.map +1 -0
  45. package/dist/stream/queue-adapter-local.cjs +50 -0
  46. package/dist/stream/queue-adapter-local.cjs.map +1 -0
  47. package/dist/stream/queue-adapter-local.js +49 -0
  48. package/dist/stream/queue-adapter-local.js.map +1 -0
  49. package/dist/stream/queue-adapter.cjs +7 -0
  50. package/dist/stream/queue-adapter.cjs.map +1 -0
  51. package/dist/stream/{submit-coordinator.d.cts → queue-adapter.d.cts} +6 -9
  52. package/dist/stream/queue-adapter.d.cts.map +1 -0
  53. package/dist/stream/queue-adapter.d.ts +24 -0
  54. package/dist/stream/queue-adapter.d.ts.map +1 -0
  55. package/dist/stream/queue-adapter.js +7 -0
  56. package/dist/stream/queue-adapter.js.map +1 -0
  57. package/dist/stream/submit-coordinator.cjs +82 -86
  58. package/dist/stream/submit-coordinator.cjs.map +1 -1
  59. package/dist/stream/submit-coordinator.d.ts +1 -26
  60. package/dist/stream/submit-coordinator.js +82 -85
  61. package/dist/stream/submit-coordinator.js.map +1 -1
  62. package/dist/stream/types.d.cts +25 -4
  63. package/dist/stream/types.d.cts.map +1 -1
  64. package/dist/stream/types.d.ts +25 -4
  65. package/dist/stream/types.d.ts.map +1 -1
  66. package/package.json +1 -1
  67. package/dist/stream/submit-coordinator.d.cts.map +0 -1
  68. package/dist/stream/submit-coordinator.d.ts.map +0 -1
@@ -16,6 +16,7 @@ const require_message_metadata_tracker = require("./message-metadata-tracker.cjs
16
16
  const require_lifecycle_loading_tracker = require("./lifecycle-loading-tracker.cjs");
17
17
  const require_root_message_projection = require("./root-message-projection.cjs");
18
18
  const require_optimistic_input = require("./optimistic-input.cjs");
19
+ const require_queue_adapter = require("./queue-adapter.cjs");
19
20
  const require_submit_coordinator = require("./submit-coordinator.cjs");
20
21
  const require_tool_calls = require("./tool-calls.cjs");
21
22
  let _langchain_core_utils_uuid = require("@langchain/core/utils/uuid");
@@ -300,10 +301,11 @@ var StreamController = class {
300
301
  });
301
302
  this.#lifecycleLoading = new require_lifecycle_loading_tracker.LifecycleLoadingTracker({
302
303
  store: this.rootStore,
303
- isDisposed: () => this.#disposed
304
+ isDisposed: () => this.#disposed,
305
+ onSettled: () => this.#submitter.scheduleQueueDrainOnObservedIdle()
304
306
  });
305
307
  this.messageMetadataStore = this.#messageMetadata.store;
306
- this.queueStore = new require_store.StreamStore(require_submit_coordinator.EMPTY_QUEUE);
308
+ this.queueStore = new require_store.StreamStore(require_queue_adapter.EMPTY_QUEUE);
307
309
  this.#submitter = new require_submit_coordinator.SubmitCoordinator({
308
310
  options: this.#options,
309
311
  rootStore: this.rootStore,
@@ -454,7 +456,7 @@ var StreamController = class {
454
456
  * thread so dispatching them against the new thread would be
455
457
  * surprising. Mirrors the legacy `StreamOrchestrator` behaviour.
456
458
  */
457
- this.queueStore.setState(() => require_submit_coordinator.EMPTY_QUEUE);
459
+ this.queueStore.setState(() => require_queue_adapter.EMPTY_QUEUE);
458
460
  await teardown;
459
461
  }
460
462
  if (this.#currentThreadId == null) {
@@ -488,6 +490,7 @@ var StreamController = class {
488
490
  let threadExists = false;
489
491
  let threadMissing = false;
490
492
  let threadActive = true;
493
+ let hasActiveInterrupts = false;
491
494
  try {
492
495
  const state = await this.#fetchHydrationState();
493
496
  if (this.#disposed || this.#currentThreadId !== hydratedThreadId) return;
@@ -575,6 +578,7 @@ var StreamController = class {
575
578
  if (Array.isArray(state?.tasks)) {
576
579
  const generationAtFetch = this.#submitGeneration;
577
580
  const { activeInterrupts, activeIds } = collectActiveInterruptsFromTasks(state.tasks);
581
+ hasActiveInterrupts = activeInterrupts.length > 0;
578
582
  for (const id of activeIds) this.#resolvedInterrupts.delete(id);
579
583
  this.rootStore.setState((s) => ({
580
584
  ...s,
@@ -631,6 +635,15 @@ var StreamController = class {
631
635
  */
632
636
  const thread = this.#ensureThread(hydratedThreadId, !threadActive);
633
637
  /**
638
+ * Picks up runs pending from before this page load, or another tab.
639
+ * Fire-and-forget. Must run after `#ensureThread` above, not before:
640
+ * `AgentServerQueueAdapter`'s own `getThread` callback also calls
641
+ * `#ensureThread(threadId, true)`, which would otherwise create
642
+ * `#thread` with the pump deferred before the line above decides it
643
+ * should be eager.
644
+ */
645
+ this.#submitter.hydrateQueue(hydratedThreadId);
646
+ /**
634
647
  * Start the wildcard lifecycle watcher up-front for existing,
635
648
  * active threads. The root content pump runs at `depth: 1`, which
636
649
  * covers root-namespace and one-deep events but not arbitrarily-
@@ -645,7 +658,21 @@ var StreamController = class {
645
658
  * against a not-yet-existent thread; `submitRun` / `respondInput`
646
659
  * call `startLifecycleWatcher` on first submission instead.
647
660
  */
648
- if (threadExists && threadActive) thread.startLifecycleWatcher();
661
+ if (threadExists && threadActive) {
662
+ thread.startLifecycleWatcher();
663
+ /**
664
+ * Seed `isLoading` from the checkpoint itself, not just a live
665
+ * lifecycle event: a subscriber that joins after a foreign run's
666
+ * own `running` event already fired would otherwise never observe
667
+ * it. Excludes a thread merely parked at an interrupt — that's
668
+ * waiting on a human, not "loading", matching
669
+ * `LifecycleLoadingTracker`'s own `interrupted → isLoading = false`.
670
+ */
671
+ if (threadActive && !hasActiveInterrupts) this.rootStore.setState((s) => s.isLoading ? s : {
672
+ ...s,
673
+ isLoading: true
674
+ });
675
+ }
649
676
  if (threadExists) {
650
677
  /**
651
678
  * Seed subgraph discovery and promote subagent execution
@@ -937,10 +964,10 @@ var StreamController = class {
937
964
  * Cancel a queued submission by id. Returns `true` when the entry
938
965
  * was found and removed, `false` otherwise.
939
966
  *
940
- * Today this only removes the entry from the client-side mirror —
941
- * once the server exposes queue cancel (roadmap A0.3) the
942
- * controller will additionally issue a cancel call against the
943
- * active transport.
967
+ * Removes the client-side entry either way; also issues a server-side
968
+ * cancel when the configured queue adapter is server-backed (see
969
+ * `AgentServerAdapter.serverQueue`). A no-op for the default,
970
+ * client-only adapter.
944
971
  *
945
972
  * @param id - Client-side queue entry id to remove.
946
973
  */
@@ -948,7 +975,8 @@ var StreamController = class {
948
975
  return this.#submitter.cancelQueued(id);
949
976
  }
950
977
  /**
951
- * Drop every queued submission. Server-side cancel arrives with A0.3.
978
+ * Drop every queued submission. Cancels the underlying server-side
979
+ * runs too when the configured queue adapter is server-backed.
952
980
  */
953
981
  async clearQueue() {
954
982
  await this.#submitter.clearQueue();
@@ -1323,7 +1351,8 @@ var StreamController = class {
1323
1351
  this.#interruptReplayThroughSeq = void 0;
1324
1352
  this.#pendingHydrationInterruptEvents = [];
1325
1353
  this.#discardPendingInterruptEvents();
1326
- this.queueStore.setState(() => require_submit_coordinator.EMPTY_QUEUE);
1354
+ this.queueStore.setState(() => require_queue_adapter.EMPTY_QUEUE);
1355
+ this.#submitter.detachQueue();
1327
1356
  try {
1328
1357
  await subscription?.unsubscribe();
1329
1358
  } catch {}