@langchain/langgraph-sdk 1.9.28 → 1.9.29

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.
@@ -180,10 +180,10 @@ interface ThreadModules {
180
180
  * Matches the in-process `InterruptPayload` type.
181
181
  *
182
182
  * {@link ThreadStream.interrupts} collects these entries in arrival order.
183
- * Use them (via {@link StreamController.getThread `getThread()`}) when
184
- * you need the protocol `namespace` tuple for
185
- * {@link StreamController.respond `respond()`} — for example subgraph
186
- * interrupts that are not mirrored on {@link RootSnapshot.interrupts}.
183
+ * The same pending interrupts (including nested namespaces) are also
184
+ * mirrored onto {@link RootSnapshot.interrupts} / framework
185
+ * `stream.interrupts` for UI rendering; `respond()` resolves `namespace`
186
+ * from either list when only `interruptId` is supplied.
187
187
  */
188
188
  interface InterruptPayload<TPayload = unknown> {
189
189
  interruptId: string;
@@ -180,10 +180,10 @@ interface ThreadModules {
180
180
  * Matches the in-process `InterruptPayload` type.
181
181
  *
182
182
  * {@link ThreadStream.interrupts} collects these entries in arrival order.
183
- * Use them (via {@link StreamController.getThread `getThread()`}) when
184
- * you need the protocol `namespace` tuple for
185
- * {@link StreamController.respond `respond()`} — for example subgraph
186
- * interrupts that are not mirrored on {@link RootSnapshot.interrupts}.
183
+ * The same pending interrupts (including nested namespaces) are also
184
+ * mirrored onto {@link RootSnapshot.interrupts} / framework
185
+ * `stream.interrupts` for UI rendering; `respond()` resolves `namespace`
186
+ * from either list when only `interruptId` is supplied.
187
187
  */
188
188
  interface InterruptPayload<TPayload = unknown> {
189
189
  interruptId: string;
package/dist/schema.d.cts CHANGED
@@ -128,6 +128,13 @@ interface Interrupt<TValue = unknown> {
128
128
  * The value of the interrupt.
129
129
  */
130
130
  value?: TValue;
131
+ /**
132
+ * Protocol namespace tuple for resume targeting (`[]` at root).
133
+ * Populated for nested subgraph / subagent interrupts so
134
+ * `respond({ interruptId })` can resume without a separate
135
+ * `getThread()?.interrupts` lookup.
136
+ */
137
+ namespace?: string[];
131
138
  /**
132
139
  * Will be deprecated in the future.
133
140
  * @deprecated Will be removed in the future.
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.cts","names":[],"sources":["../src/schema.ts"],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.cts","names":[],"sources":["../src/schema.ts"],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -128,6 +128,13 @@ interface Interrupt<TValue = unknown> {
128
128
  * The value of the interrupt.
129
129
  */
130
130
  value?: TValue;
131
+ /**
132
+ * Protocol namespace tuple for resume targeting (`[]` at root).
133
+ * Populated for nested subgraph / subagent interrupts so
134
+ * `respond({ interruptId })` can resume without a separate
135
+ * `getThread()?.interrupts` lookup.
136
+ */
137
+ namespace?: string[];
131
138
  /**
132
139
  * Will be deprecated in the future.
133
140
  * @deprecated Will be removed in the future.
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","names":[],"sources":["../src/schema.ts"],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.ts","names":[],"sources":["../src/schema.ts"],"mappings":"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"}
@@ -170,13 +170,23 @@ var StreamController = class {
170
170
  */
171
171
  #submitGeneration = 0;
172
172
  /**
173
- * Thread ids we minted client-side on first `submit()`. Keeping them
174
- * here lets `hydrate()` skip the `threads.getState()` round-trip —
175
- * we know there is nothing checkpointed server-side yet (and the
176
- * request would 404 and surface a spurious error to the UI).
173
+ * Thread ids this controller minted client-side on first `submit()`.
174
+ * `hydrate()` skips `threads.getState()` for these — we know there
175
+ * is nothing checkpointed yet. Cleared once dispatch commits the
176
+ * thread server-side.
177
177
  */
178
178
  #selfCreatedThreadIds = /* @__PURE__ */ new Set();
179
179
  /**
180
+ * Caller-supplied thread ids that 404'd on hydrate. Unlike
181
+ * {@link #selfCreatedThreadIds}, these are revalidated on every
182
+ * hydrate: another client may create the same id between visits.
183
+ * While marked missing, `submit()` still defers the root SSE pump
184
+ * until `run.start` / `commands` commits the row — joining
185
+ * `/stream/events` beforehand leaves a dead subscription on
186
+ * langgraph_api's in-mem runtime.
187
+ */
188
+ #missingThreadIds = /* @__PURE__ */ new Set();
189
+ /**
180
190
  * In-flight per-subagent namespace resolutions, keyed by tool-call
181
191
  * id. De-dupes concurrent {@link resolveSubagentNamespace} calls so
182
192
  * re-renders / multiple consumers of the same subagent don't issue
@@ -271,12 +281,14 @@ var StreamController = class {
271
281
  rememberSelfCreatedThreadId: (threadId) => {
272
282
  this.#selfCreatedThreadIds.add(threadId);
273
283
  },
284
+ isSelfCreatedThreadId: (threadId) => this.#selfCreatedThreadIds.has(threadId) || this.#missingThreadIds.has(threadId),
274
285
  hydrate: (threadId) => this.hydrate(threadId),
275
286
  ensureThread: (threadId, deferRootPump) => this.#ensureThread(threadId, deferRootPump),
276
287
  startDeferredRootPump: () => this.#startDeferredRootPump(),
277
288
  abandonDeferredRootPump: () => this.#abandonDeferredRootPump(),
278
289
  forgetSelfCreatedThreadId: (threadId) => {
279
290
  this.#selfCreatedThreadIds.delete(threadId);
291
+ this.#missingThreadIds.delete(threadId);
280
292
  },
281
293
  waitForRootPumpReady: () => this.#rootPumpReady,
282
294
  awaitNextTerminal: (signal) => this.#awaitNextTerminal(signal),
@@ -427,12 +439,14 @@ var StreamController = class {
427
439
  const hydratedThreadId = this.#currentThreadId;
428
440
  let hydrationError;
429
441
  let threadExists = false;
442
+ let threadMissing = false;
430
443
  let threadActive = true;
431
444
  try {
432
445
  const state = await this.#fetchHydrationState();
433
446
  if (this.#disposed || this.#currentThreadId !== hydratedThreadId) return;
434
447
  threadExists = state != null;
435
448
  threadActive = isThreadStateActive(state);
449
+ this.#missingThreadIds.delete(hydratedThreadId);
436
450
  if (state?.values != null) {
437
451
  /**
438
452
  * `threads.getState()` returns the legacy `ThreadState` shape
@@ -517,6 +531,8 @@ var StreamController = class {
517
531
  const activeIds = /* @__PURE__ */ new Set();
518
532
  for (const task of state.tasks) {
519
533
  if (!Array.isArray(task?.interrupts)) continue;
534
+ const checkpointNs = task?.checkpoint?.checkpoint_ns;
535
+ const namespace = typeof checkpointNs === "string" && checkpointNs.length > 0 ? checkpointNs.split("|").filter((segment) => segment.length > 0) : [...ROOT_NAMESPACE];
520
536
  for (const interrupt of task.interrupts) {
521
537
  const typed = interrupt;
522
538
  const id = typed?.id;
@@ -524,7 +540,8 @@ var StreamController = class {
524
540
  activeIds.add(id);
525
541
  activeInterrupts.push(require_interrupts.normalizeInterruptForClient({
526
542
  id,
527
- value: typed?.value
543
+ value: typed?.value,
544
+ namespace: Array.isArray(typed?.namespace) ? [...typed.namespace] : namespace
528
545
  }));
529
546
  }
530
547
  }
@@ -542,7 +559,7 @@ var StreamController = class {
542
559
  ...s,
543
560
  error
544
561
  }));
545
- }
562
+ } else threadMissing = true;
546
563
  } finally {
547
564
  this.rootStore.setState((s) => ({
548
565
  ...s,
@@ -552,6 +569,20 @@ var StreamController = class {
552
569
  else this.#resolveHydration();
553
570
  }
554
571
  /**
572
+ * Missing threads must not open `/stream/events`. The in-mem
573
+ * runtime accepts the join against a not-yet-created id but the
574
+ * subscription never attaches to the live channel — the first run
575
+ * then delivers 0 bytes until idle reconnect. Park the pump until
576
+ * `submit()`'s `run.start` creates the row (see
577
+ * {@link #startDeferredRootPump}). Tracked in `#missingThreadIds`
578
+ * (not `#selfCreatedThreadIds`) so a later hydrate revalidates —
579
+ * another client may create the same id between visits.
580
+ */
581
+ if (threadMissing) {
582
+ this.#missingThreadIds.add(hydratedThreadId);
583
+ return;
584
+ }
585
+ /**
555
586
  * Open the shared subscription on mount so in-flight server-side
556
587
  * runs are observed even when no local `submit()` is active — BUT
557
588
  * only when the thread is actually active (see
@@ -688,7 +719,7 @@ var StreamController = class {
688
719
  */
689
720
  async #trySeedProjectionFromHistory(params) {
690
721
  const threadId = this.#currentThreadId;
691
- if (this.#disposed || threadId == null || params.namespace.length === 0 || !this.#rootPumpDeferred || this.#selfCreatedThreadIds.has(threadId)) return false;
722
+ if (this.#disposed || threadId == null || params.namespace.length === 0 || !this.#rootPumpDeferred || this.#selfCreatedThreadIds.has(threadId) || this.#missingThreadIds.has(threadId)) return false;
692
723
  if (await this.#skipDefaultSubagentProjection(params.namespace, threadId)) return true;
693
724
  if (this.#disposed || this.#currentThreadId !== threadId || !this.#rootPumpDeferred) return false;
694
725
  const seed = await this.#getScopedHistorySeed(threadId, params.namespace);
@@ -896,14 +927,15 @@ var StreamController = class {
896
927
  * oldest and picks the first entry whose `interruptId` has not already
897
928
  * been resolved by a prior `respond()` call. That entry may be at the
898
929
  * root (`namespace: []`) or inside a subgraph (non-empty `namespace`).
899
- * This is **not** the same as {@link RootSnapshot.interrupts
900
- * `rootStore.interrupts[0]`} / framework `stream.interrupt`, which only
901
- * mirrors root-namespace interrupts for UI convenience.
930
+ * {@link RootSnapshot.interrupts `rootStore.interrupts`} /
931
+ * framework `stream.interrupts` mirrors the same pending interrupts
932
+ * (including nested namespaces) for UI rendering.
902
933
  *
903
934
  * Omitting `interruptId` is fine when exactly one interrupt is pending.
904
935
  * When several can be active (parallel subagents, fan-out, nested
905
- * graphs), pass an explicit `interruptId` (and `namespace` for subgraph
906
- * interrupts) so you resume the interrupt the user acted on.
936
+ * graphs), pass an explicit `interruptId` so you resume the interrupt
937
+ * the user acted on. `namespace` is resolved automatically from
938
+ * `thread.interrupts` / `stream.interrupts` when omitted.
907
939
  *
908
940
  * To resume several interrupts pending at the same checkpoint in one
909
941
  * command, use {@link respondAll} — sequential single `respond()` calls
@@ -911,9 +943,8 @@ var StreamController = class {
911
943
  * others with no interrupted run to respond to.
912
944
  *
913
945
  * The server validates `namespace` against the pending interrupt. Root
914
- * interrupts use `namespace: []` (the default when `namespace` is
915
- * omitted). Subgraph interrupts require the exact tuple from
916
- * `getThread()?.interrupts` — see the example below.
946
+ * interrupts use `namespace: []`. Subgraph interrupts carry the exact
947
+ * tuple on each {@link Interrupt} / {@link InterruptPayload} entry.
917
948
  *
918
949
  * @param response - Payload sent back to the interrupted namespace.
919
950
  * @param options - Optional target (`interruptId` / `namespace`) and
@@ -934,33 +965,22 @@ var StreamController = class {
934
965
  * );
935
966
  * ```
936
967
  *
937
- * @example Multiple root interrupts — target by id
968
+ * @example Multiple / nested interrupts — target by id
938
969
  * ```tsx
939
970
  * for (const intr of stream.interrupts) {
940
971
  * await stream.respond(decide(intr.value), { interruptId: intr.id! });
941
972
  * }
942
973
  * ```
943
974
  *
944
- * @example Subgraph interrupt — read `namespace` from the thread stream
945
- * ```tsx
946
- * const thread = stream.getThread();
947
- * for (const entry of thread?.interrupts ?? []) {
948
- * await stream.respond(buildResponse(entry.payload), {
949
- * interruptId: entry.interruptId,
950
- * namespace: entry.namespace,
951
- * });
952
- * }
953
- * ```
954
- *
955
- * Each {@link InterruptPayload} on `thread.interrupts` mirrors an
956
- * `input.requested` event: `{ interruptId, payload, namespace }`.
957
- * Nested interrupts may appear here but not on `stream.interrupts`.
975
+ * Each {@link InterruptPayload} on `thread.interrupts` and each
976
+ * {@link Interrupt} on `stream.interrupts` mirrors an
977
+ * `input.requested` event with its protocol `namespace`.
958
978
  */
959
979
  async respond(response, options) {
960
980
  if (this.#disposed || this.#thread == null) throw new Error("No active thread to respond to.");
961
981
  const resolved = options?.interruptId != null ? {
962
982
  interruptId: options.interruptId,
963
- namespace: options.namespace ?? [...ROOT_NAMESPACE]
983
+ namespace: this.#resolveNamespaceForInterruptId(options.interruptId, options.namespace)
964
984
  } : this.#resolveInterruptForResume();
965
985
  if (resolved == null) throw new Error("No pending interrupt to respond to.");
966
986
  const thread = this.#thread;
@@ -1030,11 +1050,10 @@ var StreamController = class {
1030
1050
  const entries = Object.entries(responsesById);
1031
1051
  if (entries.length === 0) throw new Error("respondAll() requires at least one response.");
1032
1052
  const thread = this.#thread;
1033
- const pending = thread.interrupts;
1034
1053
  const responses = entries.map(([interruptId, response]) => ({
1035
1054
  interrupt_id: interruptId,
1036
1055
  response: require_hitl_interrupt_payload.normalizeHitlResponseForServer(response),
1037
- namespace: pending.find((entry) => entry.interruptId === interruptId)?.namespace ?? [...ROOT_NAMESPACE]
1056
+ namespace: this.#resolveNamespaceForInterruptId(interruptId)
1038
1057
  }));
1039
1058
  const prepared = options?.update != null ? this.#beginOptimistic(options.update) : void 0;
1040
1059
  const dispatchUpdate = this.#resolveDispatchUpdate(options?.update, prepared);
@@ -1201,16 +1220,11 @@ var StreamController = class {
1201
1220
  * Without this, the controller would be wedged in a state where:
1202
1221
  * - `#thread` is wired but no content pump is open
1203
1222
  * - `#rootPumpDeferred` stays `true`
1204
- * - `selfCreatedThreadIds` still holds the id
1205
1223
  *
1206
- * A retry submit on the same controller would see
1207
- * `wasSelfCreated=false` (because `currentThreadId` is no longer
1208
- * null), `#ensureThread(id, false)` would early-return because
1209
- * `#thread != null`, and the pump would never start. The thread
1210
- * would have an id committed to the URL but no live subscription.
1211
- *
1212
- * Tearing down `#thread` so the next submit re-runs `#ensureThread`
1213
- * from scratch is the simplest recovery — the failed dispatch
1224
+ * A retry submit must re-run `#ensureThread` from scratch (with
1225
+ * `deferRootPump` still true — the id stays in
1226
+ * `#selfCreatedThreadIds` until a successful dispatch). Tearing
1227
+ * down `#thread` is the simplest recovery; the failed dispatch
1214
1228
  * means there was nothing to subscribe to anyway.
1215
1229
  */
1216
1230
  #abandonDeferredRootPump() {
@@ -1413,16 +1427,14 @@ var StreamController = class {
1413
1427
  this.#subgraphs.push(event);
1414
1428
  this.#lifecycleLoading.handle(event);
1415
1429
  /**
1416
- * Nested `input.requested` events (HITL inside a subagent /
1417
- * subgraph) are not observable via the narrow content pump. The
1418
- * `ThreadStream` itself already records them into
1419
- * `thread.interrupts`, which `#latestUnresolvedInterrupt()`
1420
- * consults — so HITL respond() works for any depth. Root-level
1421
- * interrupts are also mirrored into `rootStore.interrupts` here so
1422
- * UI state does not depend on the narrower content pump being the
1423
- * first consumer to see the event.
1430
+ * `input.requested` events (including HITL inside a subagent /
1431
+ * subgraph) are not always observable via the narrow content pump.
1432
+ * Mirror every namespace into `rootStore.interrupts` here so UI
1433
+ * state does not depend on the content pump being the first
1434
+ * consumer. `ThreadStream.interrupts` is updated in parallel for
1435
+ * resume targeting.
1424
1436
  */
1425
- this.#recordRootInterrupt(event);
1437
+ this.#recordInterrupt(event);
1426
1438
  }
1427
1439
  /**
1428
1440
  * Process one root-pump event and update all root projections.
@@ -1515,7 +1527,7 @@ var StreamController = class {
1515
1527
  return;
1516
1528
  }
1517
1529
  if (event.method === "input.requested") {
1518
- this.#recordRootInterrupt(event);
1530
+ this.#recordInterrupt(event);
1519
1531
  return;
1520
1532
  }
1521
1533
  if (event.method === "lifecycle") event.params.data;
@@ -1643,21 +1655,22 @@ var StreamController = class {
1643
1655
  }
1644
1656
  }
1645
1657
  /**
1646
- * Mirror root protocol interrupts into the root snapshot.
1658
+ * Mirror protocol interrupts (any namespace) into the root snapshot.
1647
1659
  *
1648
1660
  * This can be called from both the wildcard lifecycle/input watcher and the
1649
1661
  * root content pump. Store-level dedup keeps the user-facing list stable.
1650
1662
  */
1651
- #recordRootInterrupt(event) {
1663
+ #recordInterrupt(event) {
1652
1664
  if (event.method !== "input.requested") return;
1653
- if (!require_namespace.isRootNamespace(event.params.namespace)) return;
1654
1665
  const data = event.params.data;
1655
1666
  const interruptId = data?.interrupt_id;
1656
1667
  if (typeof interruptId !== "string" || this.#resolvedInterrupts.has(interruptId)) return;
1657
1668
  if (this.#hydratedActiveInterruptIds != null && !this.#hydratedActiveInterruptIds.has(interruptId)) return;
1669
+ const namespace = Array.isArray(event.params.namespace) ? [...event.params.namespace] : [...ROOT_NAMESPACE];
1658
1670
  const interrupt = require_interrupts.normalizeInterruptForClient({
1659
1671
  id: interruptId,
1660
- value: data.payload
1672
+ value: data.payload,
1673
+ namespace
1661
1674
  });
1662
1675
  this.rootStore.setState((s) => {
1663
1676
  if (s.interrupts.some((entry) => entry.id === interruptId)) return s;
@@ -1670,6 +1683,21 @@ var StreamController = class {
1670
1683
  });
1671
1684
  }
1672
1685
  /**
1686
+ * Resolve the protocol namespace for a targeted resume.
1687
+ *
1688
+ * Prefer an explicit caller-supplied namespace, then the matching
1689
+ * {@link ThreadStream.interrupts} entry, then the UI mirror on
1690
+ * `rootStore.interrupts`, finally root (`[]`).
1691
+ */
1692
+ #resolveNamespaceForInterruptId(interruptId, explicitNamespace) {
1693
+ if (explicitNamespace != null) return [...explicitNamespace];
1694
+ const fromThread = this.#thread?.interrupts.find((entry) => entry.interruptId === interruptId)?.namespace;
1695
+ if (fromThread != null) return [...fromThread];
1696
+ const fromRoot = this.rootStore.getSnapshot().interrupts.find((entry) => entry.id === interruptId)?.namespace;
1697
+ if (fromRoot != null) return [...fromRoot];
1698
+ return [...ROOT_NAMESPACE];
1699
+ }
1700
+ /**
1673
1701
  * Mark an interrupt resolved for replay filtering and mirror the
1674
1702
  * removal into the root snapshot the framework hooks read.
1675
1703
  */