@langchain/langgraph-sdk 1.12.3 → 1.12.5

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 (77) hide show
  1. package/dist/client/stream/handles/subagents.cjs +9 -2
  2. package/dist/client/stream/handles/subagents.cjs.map +1 -1
  3. package/dist/client/stream/handles/subagents.d.cts.map +1 -1
  4. package/dist/client/stream/handles/subagents.d.ts.map +1 -1
  5. package/dist/client/stream/handles/subagents.js +10 -3
  6. package/dist/client/stream/handles/subagents.js.map +1 -1
  7. package/dist/client/stream/handles/subgraphs.cjs +24 -2
  8. package/dist/client/stream/handles/subgraphs.cjs.map +1 -1
  9. package/dist/client/stream/handles/subgraphs.d.cts.map +1 -1
  10. package/dist/client/stream/handles/subgraphs.d.ts.map +1 -1
  11. package/dist/client/stream/handles/subgraphs.js +24 -3
  12. package/dist/client/stream/handles/subgraphs.js.map +1 -1
  13. package/dist/client/stream/index.cjs +17 -7
  14. package/dist/client/stream/index.cjs.map +1 -1
  15. package/dist/client/stream/index.d.cts.map +1 -1
  16. package/dist/client/stream/index.d.ts.map +1 -1
  17. package/dist/client/stream/index.js +17 -7
  18. package/dist/client/stream/index.js.map +1 -1
  19. package/dist/client/stream/messages.cjs +43 -0
  20. package/dist/client/stream/messages.cjs.map +1 -1
  21. package/dist/client/stream/messages.d.cts +8 -0
  22. package/dist/client/stream/messages.d.cts.map +1 -1
  23. package/dist/client/stream/messages.d.ts +8 -0
  24. package/dist/client/stream/messages.d.ts.map +1 -1
  25. package/dist/client/stream/messages.js +43 -0
  26. package/dist/client/stream/messages.js.map +1 -1
  27. package/dist/client/stream/transport/http.cjs +1 -12
  28. package/dist/client/stream/transport/http.cjs.map +1 -1
  29. package/dist/client/stream/transport/http.d.cts.map +1 -1
  30. package/dist/client/stream/transport/http.d.ts.map +1 -1
  31. package/dist/client/stream/transport/http.js +1 -12
  32. package/dist/client/stream/transport/http.js.map +1 -1
  33. package/dist/client/stream/transport/utils.cjs +12 -0
  34. package/dist/client/stream/transport/utils.cjs.map +1 -1
  35. package/dist/client/stream/transport/utils.js +12 -1
  36. package/dist/client/stream/transport/utils.js.map +1 -1
  37. package/dist/client/stream/transport/websocket.cjs +33 -3
  38. package/dist/client/stream/transport/websocket.cjs.map +1 -1
  39. package/dist/client/stream/transport/websocket.d.cts +4 -1
  40. package/dist/client/stream/transport/websocket.d.cts.map +1 -1
  41. package/dist/client/stream/transport/websocket.d.ts +4 -1
  42. package/dist/client/stream/transport/websocket.d.ts.map +1 -1
  43. package/dist/client/stream/transport/websocket.js +34 -4
  44. package/dist/client/stream/transport/websocket.js.map +1 -1
  45. package/dist/stream/controller.cjs +94 -3
  46. package/dist/stream/controller.cjs.map +1 -1
  47. package/dist/stream/controller.d.cts.map +1 -1
  48. package/dist/stream/controller.d.ts.map +1 -1
  49. package/dist/stream/controller.js +94 -3
  50. package/dist/stream/controller.js.map +1 -1
  51. package/dist/stream/discovery/namespace-from-history.cjs +1 -1
  52. package/dist/stream/discovery/namespace-from-history.cjs.map +1 -1
  53. package/dist/stream/discovery/namespace-from-history.js +1 -1
  54. package/dist/stream/discovery/namespace-from-history.js.map +1 -1
  55. package/dist/stream/lifecycle-loading-tracker.cjs +5 -0
  56. package/dist/stream/lifecycle-loading-tracker.cjs.map +1 -1
  57. package/dist/stream/lifecycle-loading-tracker.js +5 -0
  58. package/dist/stream/lifecycle-loading-tracker.js.map +1 -1
  59. package/dist/stream/projections/messages.cjs +45 -12
  60. package/dist/stream/projections/messages.cjs.map +1 -1
  61. package/dist/stream/projections/messages.js +45 -12
  62. package/dist/stream/projections/messages.js.map +1 -1
  63. package/dist/stream/root-message-projection.cjs +71 -8
  64. package/dist/stream/root-message-projection.cjs.map +1 -1
  65. package/dist/stream/root-message-projection.js +71 -8
  66. package/dist/stream/root-message-projection.js.map +1 -1
  67. package/dist/stream/submit-coordinator.cjs +7 -2
  68. package/dist/stream/submit-coordinator.cjs.map +1 -1
  69. package/dist/stream/submit-coordinator.js +7 -2
  70. package/dist/stream/submit-coordinator.js.map +1 -1
  71. package/dist/ui/manager.cjs +1 -1
  72. package/dist/ui/manager.cjs.map +1 -1
  73. package/dist/ui/manager.d.cts.map +1 -1
  74. package/dist/ui/manager.d.ts.map +1 -1
  75. package/dist/ui/manager.js +1 -1
  76. package/dist/ui/manager.js.map +1 -1
  77. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.cts","names":[],"sources":["../../src/stream/controller.ts"],"mappings":";;;;;;;;;;;;;;AA6KA;;cAAa,kBAAA,WAA6B,OAAA;;AAwC1C;;;;;;;;;;;;cAAa,gBAAA,4BACgB,MAAA,8EAEO,MAAA;EAAA;WAEzB,SAAA,EAAW,WAAA,CAAY,YAAA,CAAa,SAAA,EAAW,aAAA;EAAA,SAC/C,aAAA,EAAe,WAAA,CAAY,WAAA;EAAA,SAC3B,aAAA,EAAe,WAAA,CAAY,WAAA;EAAA,SAC3B,mBAAA,EAAqB,WAAA,CAAY,iBAAA;EAAA,SACjC,oBAAA,EAAsB,WAAA,CAAY,kBAAA;EAAA,SAClC,UAAA,EAAY,WAAA,CAAY,uBAAA,CAAwB,SAAA;EAAA,SAChD,QAAA,EAAU,eAAA;EAiK0B;;;;;EAA7C,WAAA,CAAY,OAAA,EAAS,uBAAA,CAAwB,SAAA;EAm0BF;;;;;;;EAAA,IArsBvC,gBAAA,CAAA,GAAoB,OAAA;EA22BS;;;;;;;;EAlzB3B,OAAA,CAAQ,QAAA,mBAA2B,OAAA;EAoiCpB;;;;;;;;;;;;;;EA9pBf,wBAAA,CAAyB,UAAA,WAAqB,OAAA;EAnuB5B;;;;;;;;EAu+BlB,MAAA,CACJ,KAAA,WACA,OAAA,GAAU,mBAAA,CAAoB,SAAA,EAAW,gBAAA,IACxC,OAAA;EAv+B4B;;;;;;EAi/BzB,IAAA,CAAK,OAAA,GAAU,iBAAA,GAAoB,OAAA;EA/+BtB;;;;EAmgCb,UAAA,CAAA,GAAc,OAAA;EApuBhB;;;;;;;;;;;EAoyBE,YAAA,CAAa,EAAA,WAAa,OAAA;EA/FW;;;;EAuGrC,UAAA,CAAA,GAAc,OAAA;EA5FT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyJL,OAAA,CACJ,QAAA,WACA,OAAA,GAAU,oBAAA,CAAqB,gBAAA,IAC9B,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiHG,UAAA,CACJ,aAAA,EAAe,MAAA,mBACf,OAAA,GAAU,uBAAA,CAAwB,gBAAA,IACjC,OAAA;;;;EA4DG,OAAA,CAAA,GAAW,OAAA;;;;;;;;;;;;;;;;EAyBjB,QAAA,CAAA;;;;;;EA4BA,SAAA,CAAA,GAAa,YAAA;;;;;;;;EAWb,eAAA,CACE,QAAA,GAAW,MAAA,EAAQ,YAAA;AAAA"}
1
+ {"version":3,"file":"controller.d.cts","names":[],"sources":["../../src/stream/controller.ts"],"mappings":";;;;;;;;;;;;;;AA6KA;;cAAa,kBAAA,WAA6B,OAAA;;AAwC1C;;;;;;;;;;;;cAAa,gBAAA,4BACgB,MAAA,8EAEO,MAAA;EAAA;WAEzB,SAAA,EAAW,WAAA,CAAY,YAAA,CAAa,SAAA,EAAW,aAAA;EAAA,SAC/C,aAAA,EAAe,WAAA,CAAY,WAAA;EAAA,SAC3B,aAAA,EAAe,WAAA,CAAY,WAAA;EAAA,SAC3B,mBAAA,EAAqB,WAAA,CAAY,iBAAA;EAAA,SACjC,oBAAA,EAAsB,WAAA,CAAY,kBAAA;EAAA,SAClC,UAAA,EAAY,WAAA,CAAY,uBAAA,CAAwB,SAAA;EAAA,SAChD,QAAA,EAAU,eAAA;EAmL0B;;;;;EAA7C,WAAA,CAAY,OAAA,EAAS,uBAAA,CAAwB,SAAA;EAi2BF;;;;;;;EAAA,IA3tBvC,gBAAA,CAAA,GAAoB,OAAA;EA44BS;;;;;;;;EAn1B3B,OAAA,CAAQ,QAAA,mBAA2B,OAAA;EAqkCpB;;;;;;;;;;;;;;EAzqBf,wBAAA,CAAyB,UAAA,WAAqB,OAAA;EAnxB5B;;;;;;;;EAuhClB,MAAA,CACJ,KAAA,WACA,OAAA,GAAU,mBAAA,CAAoB,SAAA,EAAW,gBAAA,IACxC,OAAA;EAvhC4B;;;;;;EAiiCzB,IAAA,CAAK,OAAA,GAAU,iBAAA,GAAoB,OAAA;EA/hCtB;;;;EA2jCb,UAAA,CAAA,GAAc,OAAA;EAlwBhB;;;;;;;;;;;EAq0BE,YAAA,CAAa,EAAA,WAAa,OAAA;EA1GW;;;;EAkHrC,UAAA,CAAA,GAAc,OAAA;EAvGT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoKL,OAAA,CACJ,QAAA,WACA,OAAA,GAAU,oBAAA,CAAqB,gBAAA,IAC9B,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiHG,UAAA,CACJ,aAAA,EAAe,MAAA,mBACf,OAAA,GAAU,uBAAA,CAAwB,gBAAA,IACjC,OAAA;;;;EA4DG,OAAA,CAAA,GAAW,OAAA;;;;;;;;;;;;;;;;EAyBjB,QAAA,CAAA;;;;;;EA4BA,SAAA,CAAA,GAAa,YAAA;;;;;;;;EAWb,eAAA,CACE,QAAA,GAAW,MAAA,EAAQ,YAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","names":[],"sources":["../../src/stream/controller.ts"],"mappings":";;;;;;;;;;;;;;;;cA6Ka,kBAAA,WAA6B,OAAA;;;;AAwC1C;;;;;;;;;;cAAa,gBAAA,4BACgB,MAAA,8EAEO,MAAA;EAAA;WAEzB,SAAA,EAAW,WAAA,CAAY,YAAA,CAAa,SAAA,EAAW,aAAA;EAAA,SAC/C,aAAA,EAAe,WAAA,CAAY,WAAA;EAAA,SAC3B,aAAA,EAAe,WAAA,CAAY,WAAA;EAAA,SAC3B,mBAAA,EAAqB,WAAA,CAAY,iBAAA;EAAA,SACjC,oBAAA,EAAsB,WAAA,CAAY,kBAAA;EAAA,SAClC,UAAA,EAAY,WAAA,CAAY,uBAAA,CAAwB,SAAA;EAAA,SAChD,QAAA,EAAU,eAAA;EADE;;;;;EAkKrB,WAAA,CAAY,OAAA,EAAS,uBAAA,CAAwB,SAAA;EA6jBO;;;;;;;EAAA,IA/bhD,gBAAA,CAAA,GAAoB,OAAA;EAoyBQ;;;;;;;;EA3uB1B,OAAA,CAAQ,QAAA,mBAA2B,OAAA;EAm+BxB;;;;;;;;;;;;;;EA7lBX,wBAAA,CAAyB,UAAA,WAAqB,OAAA;EApuBI;;;;;;;;EAw+BlD,MAAA,CACJ,KAAA,WACA,OAAA,GAAU,mBAAA,CAAoB,SAAA,EAAW,gBAAA,IACxC,OAAA;EAx+BuC;;;;;;EAk/BpC,IAAA,CAAK,OAAA,GAAU,iBAAA,GAAoB,OAAA;EAh/BgB;;;;EAogCnD,UAAA,CAAA,GAAc,OAAA;EAl2ByB;;;;;;;;;;;EAk6BvC,YAAA,CAAa,EAAA,WAAa,OAAA;EA/FpB;;;;EAuGN,UAAA,CAAA,GAAc,OAAA;EA5Fd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyJA,OAAA,CACJ,QAAA,WACA,OAAA,GAAU,oBAAA,CAAqB,gBAAA,IAC9B,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiHG,UAAA,CACJ,aAAA,EAAe,MAAA,mBACf,OAAA,GAAU,uBAAA,CAAwB,gBAAA,IACjC,OAAA;;;;EA4DG,OAAA,CAAA,GAAW,OAAA;;;;;;;;;;;;;;;;EAyBjB,QAAA,CAAA;;;;;;EA4BA,SAAA,CAAA,GAAa,YAAA;;;;;;;;EAWb,eAAA,CACE,QAAA,GAAW,MAAA,EAAQ,YAAA;AAAA"}
1
+ {"version":3,"file":"controller.d.ts","names":[],"sources":["../../src/stream/controller.ts"],"mappings":";;;;;;;;;;;;;;;;cA6Ka,kBAAA,WAA6B,OAAA;;;;AAwC1C;;;;;;;;;;cAAa,gBAAA,4BACgB,MAAA,8EAEO,MAAA;EAAA;WAEzB,SAAA,EAAW,WAAA,CAAY,YAAA,CAAa,SAAA,EAAW,aAAA;EAAA,SAC/C,aAAA,EAAe,WAAA,CAAY,WAAA;EAAA,SAC3B,aAAA,EAAe,WAAA,CAAY,WAAA;EAAA,SAC3B,mBAAA,EAAqB,WAAA,CAAY,iBAAA;EAAA,SACjC,oBAAA,EAAsB,WAAA,CAAY,kBAAA;EAAA,SAClC,UAAA,EAAY,WAAA,CAAY,uBAAA,CAAwB,SAAA;EAAA,SAChD,QAAA,EAAU,eAAA;EADE;;;;;EAoLrB,WAAA,CAAY,OAAA,EAAS,uBAAA,CAAwB,SAAA;EA2lBO;;;;;;;EAAA,IArdhD,gBAAA,CAAA,GAAoB,OAAA;EAq0BQ;;;;;;;;EA5wB1B,OAAA,CAAQ,QAAA,mBAA2B,OAAA;EAogCxB;;;;;;;;;;;;;;EAxmBX,wBAAA,CAAyB,UAAA,WAAqB,OAAA;EApxBI;;;;;;;;EAwhClD,MAAA,CACJ,KAAA,WACA,OAAA,GAAU,mBAAA,CAAoB,SAAA,EAAW,gBAAA,IACxC,OAAA;EAxhCuC;;;;;;EAkiCpC,IAAA,CAAK,OAAA,GAAU,iBAAA,GAAoB,OAAA;EAhiCgB;;;;EA4jCnD,UAAA,CAAA,GAAc,OAAA;EAx4ByB;;;;;;;;;;;EA28BvC,YAAA,CAAa,EAAA,WAAa,OAAA;EA1GpB;;;;EAkHN,UAAA,CAAA,GAAc,OAAA;EAvGd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoKA,OAAA,CACJ,QAAA,WACA,OAAA,GAAU,oBAAA,CAAqB,gBAAA,IAC9B,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiHG,UAAA,CACJ,aAAA,EAAe,MAAA,mBACf,OAAA,GAAU,uBAAA,CAAwB,gBAAA,IACjC,OAAA;;;;EA4DG,OAAA,CAAA,GAAW,OAAA;;;;;;;;;;;;;;;;EAyBjB,QAAA,CAAA;;;;;;EA4BA,SAAA,CAAA,GAAa,YAAA;;;;;;;;EAWb,eAAA,CACE,QAAA,GAAW,MAAA,EAAQ,YAAA;AAAA"}
@@ -171,6 +171,14 @@ var StreamController = class {
171
171
  */
172
172
  #hydratedActiveInterruptIds = null;
173
173
  /**
174
+ * Creation time of the checkpoint the latest {@link hydrate} seeded
175
+ * from. A new stream subscription replays the thread's retained
176
+ * history, and events produced before this moment are already part of
177
+ * the seed: applying them again rewinds `messages`, `values` and
178
+ * `toolCalls` to older turns and then rebuilds them.
179
+ */
180
+ #hydratedCheckpointTime;
181
+ /**
174
182
  * Highest event sequence already applied when the latest run command
175
183
  * was accepted. Interrupts outside the hydrate-time allowlist remain
176
184
  * filtered through this sequence, while newer events are live output
@@ -242,6 +250,16 @@ var StreamController = class {
242
250
  #rootEventListeners = /* @__PURE__ */ new Set();
243
251
  #rootBus;
244
252
  #activeRunId;
253
+ /**
254
+ * Run id `run.start` returned for the in-flight local `submit()`. Kept
255
+ * apart from {@link #activeRunId}, which a rolled-back submit's late
256
+ * response can still overwrite.
257
+ */
258
+ #submittedRunId;
259
+ /** `true` from a local run's dispatch until its `run.start` answers. */
260
+ #submittedRunIdPending = false;
261
+ /** One per armed terminal wait: re-runs the lifecycle events it held until `run.start` answered. */
262
+ #heldLifecycleReleases = /* @__PURE__ */ new Set();
245
263
  #localRunDepth = 0;
246
264
  /**
247
265
  * `true` once a root `values` event has been applied for the current
@@ -301,7 +319,8 @@ var StreamController = class {
301
319
  this.#lifecycleLoading = new LifecycleLoadingTracker({
302
320
  store: this.rootStore,
303
321
  isDisposed: () => this.#disposed,
304
- onSettled: () => this.#submitter.scheduleQueueDrainOnObservedIdle()
322
+ onSettled: () => this.#submitter.scheduleQueueDrainOnObservedIdle(),
323
+ ignore: (event) => this.#submittedRunMatch(event) != null
305
324
  });
306
325
  this.messageMetadataStore = this.#messageMetadata.store;
307
326
  this.queueStore = new StreamStore(EMPTY_QUEUE);
@@ -336,6 +355,11 @@ var StreamController = class {
336
355
  this.#pendingHydrationInterruptEvents = [];
337
356
  },
338
357
  onRunStart: () => this.#markLocalRunStart(),
358
+ onRunStartReturned: (runId) => {
359
+ this.#submittedRunId = runId;
360
+ this.#submittedRunIdPending = false;
361
+ for (const release of [...this.#heldLifecycleReleases]) release();
362
+ },
339
363
  onRunCreated: (runId) => {
340
364
  this.#advanceInterruptReplayBarrier();
341
365
  this.#notifyCreated(runId);
@@ -495,6 +519,8 @@ var StreamController = class {
495
519
  if (this.#disposed || this.#currentThreadId !== hydratedThreadId) return;
496
520
  threadExists = state != null;
497
521
  threadActive = isThreadStateActive(state);
522
+ const checkpointTime = Date.parse(state?.created_at ?? "");
523
+ this.#hydratedCheckpointTime = Number.isNaN(checkpointTime) ? void 0 : checkpointTime;
498
524
  this.#missingThreadIds.delete(hydratedThreadId);
499
525
  if (state?.values != null) {
500
526
  /**
@@ -533,6 +559,11 @@ var StreamController = class {
533
559
  const seedMessages = state.values[this.#messagesKey];
534
560
  if (Array.isArray(seedMessages)) {
535
561
  this.#subagents.seedFromCheckpointMessages(seedMessages);
562
+ const finishedToolCalls = seedToolCallsFromMessages(ROOT_NAMESPACE, ensureMessageInstances(seedMessages)).filter((toolCall) => toolCall.status === "finished");
563
+ if (finishedToolCalls.length > 0) this.rootStore.setState((s) => ({
564
+ ...s,
565
+ toolCalls: finishedToolCalls.reduce((toolCalls, toolCall) => upsertToolCall(toolCalls, toolCall), s.toolCalls)
566
+ }));
536
567
  /**
537
568
  * An idle (finished) thread defers its root SSE pump; the first
538
569
  * `submit()` brings it up and the transport replays the finished
@@ -560,7 +591,7 @@ var StreamController = class {
560
591
  */
561
592
  const unpersisted = this.#messageMetadata.unpersistedOptimisticIds();
562
593
  if (unpersisted.size > 0) {
563
- this.#rootMessages.dropOptimisticMessages(unpersisted);
594
+ this.#rootMessages.dropMessages(unpersisted);
564
595
  this.#messageMetadata.forget(unpersisted);
565
596
  }
566
597
  /**
@@ -912,6 +943,13 @@ var StreamController = class {
912
943
  if (options?.cancel ?? true) {
913
944
  const threadId = this.#currentThreadId;
914
945
  const runId = this.#activeRunId;
946
+ if (runId != null && this.rootStore.getSnapshot().isLoading) {
947
+ const dropped = this.#rootMessages.closeRun({
948
+ sync: true,
949
+ unfinishedOnly: true
950
+ });
951
+ if (dropped.size > 0) this.#messageMetadata.forget(dropped);
952
+ }
915
953
  if (threadId != null && runId != null) try {
916
954
  await this.#options.client.runs.cancel(threadId, runId);
917
955
  } catch {}
@@ -927,9 +965,12 @@ var StreamController = class {
927
965
  }
928
966
  #markLocalRunStart() {
929
967
  this.#localRunDepth += 1;
968
+ this.#submittedRunId = void 0;
969
+ this.#submittedRunIdPending = true;
930
970
  }
931
971
  #markLocalRunEnd() {
932
972
  this.#localRunDepth = Math.max(0, this.#localRunDepth - 1);
973
+ if (this.#localRunDepth === 0) this.#submittedRunIdPending = false;
933
974
  }
934
975
  #notifyCreated(runId) {
935
976
  this.#activeRunId = runId;
@@ -1347,6 +1388,7 @@ var StreamController = class {
1347
1388
  this.#localRunDepth = 0;
1348
1389
  this.#messageMetadata.reset();
1349
1390
  this.#hydratedActiveInterruptIds = null;
1391
+ this.#hydratedCheckpointTime = void 0;
1350
1392
  this.#interruptReplayThroughSeq = void 0;
1351
1393
  this.#pendingHydrationInterruptEvents = [];
1352
1394
  this.#discardPendingInterruptEvents();
@@ -1586,6 +1628,8 @@ var StreamController = class {
1586
1628
  if (this.#rootEventListeners.size > 0) for (const listener of this.#rootEventListeners) try {
1587
1629
  listener(event);
1588
1630
  } catch {}
1631
+ const floor = this.#hydratedCheckpointTime;
1632
+ if (floor != null && event.params.timestamp < floor) return;
1589
1633
  /**
1590
1634
  * `messages` and `tools` events are emitted under a node's
1591
1635
  * namespace — for a typical StateGraph the LLM's token deltas
@@ -1661,7 +1705,32 @@ var StreamController = class {
1661
1705
  this.#recordInterrupt(event);
1662
1706
  return;
1663
1707
  }
1664
- if (event.method === "lifecycle") event.params.data;
1708
+ if (event.method === "lifecycle") {
1709
+ /**
1710
+ * Root lifecycle transitions are observed elsewhere
1711
+ * (#awaitTerminal) to unblock `submit`. Here they drop a closed
1712
+ * run's never-checkpointed messages.
1713
+ */
1714
+ const lifecycle = event.params.data;
1715
+ const dropped = this.#rootMessages.applyLifecycle(lifecycle?.event);
1716
+ if (dropped.size > 0) this.#messageMetadata.forget(dropped);
1717
+ }
1718
+ }
1719
+ /**
1720
+ * How a lifecycle event relates to the run a local `submit()` started.
1721
+ * New subscriptions replay earlier runs' terminals, and accepting one
1722
+ * would end the submitted run early: `"other"` marks those, `"pending"`
1723
+ * an event that names a run before `run.start` has answered. `undefined`
1724
+ * when it can't be told apart (no submit in flight, no run named, or no
1725
+ * run id returned).
1726
+ */
1727
+ #submittedRunMatch(event) {
1728
+ if (event.method !== "lifecycle" || this.#localRunDepth === 0) return;
1729
+ const runId = synthesizedEventRunId(event.event_id);
1730
+ if (runId == null) return void 0;
1731
+ if (this.#submittedRunIdPending) return "pending";
1732
+ if (this.#submittedRunId == null) return void 0;
1733
+ return runId === this.#submittedRunId ? void 0 : "other";
1665
1734
  }
1666
1735
  /**
1667
1736
  * Merge a `values` payload into root values and root messages.
@@ -2007,9 +2076,12 @@ var StreamController = class {
2007
2076
  return new Promise((resolve) => {
2008
2077
  let settled = false;
2009
2078
  let sawRunning = false;
2079
+ const held = [];
2080
+ const heldReleases = this.#heldLifecycleReleases;
2010
2081
  function finish(result) {
2011
2082
  if (settled) return;
2012
2083
  settled = true;
2084
+ heldReleases.delete(releaseHeld);
2013
2085
  unsubscribeRoot?.();
2014
2086
  unsubscribeThread?.();
2015
2087
  unsubscribeError?.();
@@ -2021,6 +2093,12 @@ var StreamController = class {
2021
2093
  if (settled) return;
2022
2094
  if (event.method !== "lifecycle") return;
2023
2095
  if (!isRootNamespace(event.params.namespace)) return;
2096
+ const match = this.#submittedRunMatch(event);
2097
+ if (match === "other") return;
2098
+ if (match === "pending") {
2099
+ held.push(event);
2100
+ return;
2101
+ }
2024
2102
  const lifecycle = event.params.data;
2025
2103
  if (lifecycle?.event === "running") {
2026
2104
  sawRunning = true;
@@ -2036,6 +2114,10 @@ var StreamController = class {
2036
2114
  setTimeout(() => finish({ event: "interrupted" }), 0);
2037
2115
  }
2038
2116
  };
2117
+ const releaseHeld = () => {
2118
+ for (const event of held.splice(0)) onEvent(event);
2119
+ };
2120
+ heldReleases.add(releaseHeld);
2039
2121
  const unsubscribeRoot = this.#rootBus.subscribe(onEvent);
2040
2122
  const unsubscribeThread = this.#thread?.onEvent(onEvent);
2041
2123
  const unsubscribeError = this.#thread?.onError((error) => finish({
@@ -2130,6 +2212,15 @@ function collectActiveInterruptsFromTasks(tasks) {
2130
2212
  activeIds
2131
2213
  };
2132
2214
  }
2215
+ /**
2216
+ * Run id from a `synth:<run_id>:...` event id, the form the agent server
2217
+ * uses for events it synthesizes such as root `lifecycle`. Events carry no
2218
+ * run id field.
2219
+ */
2220
+ function synthesizedEventRunId(eventId) {
2221
+ if (eventId == null || !eventId.startsWith("synth:")) return void 0;
2222
+ return eventId.split(":")[1] || void 0;
2223
+ }
2133
2224
  //#endregion
2134
2225
  export { ROOT_PUMP_CHANNELS, StreamController };
2135
2226