@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.
- package/dist/client/stream/types.d.cts +4 -4
- package/dist/client/stream/types.d.ts +4 -4
- package/dist/schema.d.cts +7 -0
- package/dist/schema.d.cts.map +1 -1
- package/dist/schema.d.ts +7 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/stream/controller.cjs +84 -56
- package/dist/stream/controller.cjs.map +1 -1
- package/dist/stream/controller.d.cts +12 -23
- package/dist/stream/controller.d.cts.map +1 -1
- package/dist/stream/controller.d.ts +12 -23
- package/dist/stream/controller.d.ts.map +1 -1
- package/dist/stream/controller.js +84 -56
- package/dist/stream/controller.js.map +1 -1
- package/dist/stream/projections/channel.cjs +4 -6
- package/dist/stream/projections/channel.cjs.map +1 -1
- package/dist/stream/projections/channel.d.cts.map +1 -1
- package/dist/stream/projections/channel.d.ts.map +1 -1
- package/dist/stream/projections/channel.js +4 -6
- package/dist/stream/projections/channel.js.map +1 -1
- package/dist/stream/submit-coordinator.cjs +6 -5
- package/dist/stream/submit-coordinator.cjs.map +1 -1
- package/dist/stream/submit-coordinator.js +6 -5
- package/dist/stream/submit-coordinator.js.map +1 -1
- package/dist/stream/types.d.cts +3 -3
- package/dist/stream/types.d.ts +3 -3
- package/dist/utils/async_caller.cjs +1 -1
- package/dist/utils/async_caller.cjs.map +1 -1
- package/dist/utils/async_caller.d.cts.map +1 -1
- package/dist/utils/async_caller.d.ts.map +1 -1
- package/dist/utils/async_caller.js +1 -1
- package/dist/utils/async_caller.js.map +1 -1
- package/package.json +7 -7
|
@@ -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
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
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
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
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.
|
package/dist/schema.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.cts","names":[],"sources":["../src/schema.ts"],"mappings":";;;KAEK,QAAA,MAAc,CAAA;AAAA,KAEP,SAAA;AAAA,KAQA,YAAA;AAAA,KAEP,iBAAA;AAAA,KAEO,YAAA;AAAA,KAEA,MAAA;EAhBQ;AAEpB;;;EAmBE,IAAA;EAnBmB;AAQrB;;;EAiBE,eAAA;EAjBsB;AAA6C;;EAsBnE,YAAA;IApBoB;;AAEtB;IAsBI,SAAA,GAAY,QAAA;IAtBQ;;;IA2BpB,aAAA,GAAgB,QAAA;IAAA,CAEf,GAAA;EAAA;AAAA;AAAA,UAIY,WAAA;EApBf;;;EAwBA,QAAA;EAVE;;;;EAgBF,YAAA,GAAe,WAAA;EAVA;;;;EAgBf,aAAA,GAAgB,WAAA;EAMD;;;;EAAf,YAAA,GAAe,WAAA;EAlBf;;;;EAwBA,aAAA,GAAgB,WAAA;EANhB;;;;EAYA,cAAA,GAAiB,WAAA;AAAA;AAAA,KAGP,SAAA,GAAY,MAAA,SAAe,WAAA;AAAA,KAE3B,QAAA,GAAW,QAAA;EACrB,MAAA;EAEA,IAAA;EAEA,MAAA,GAAS,MAAA;EAET,OAAA,GAAU,MAAA;EAAA,CAET,GAAA;AAAA;AAAA,UAGc,aAAA;;EAEf,YAAA;EAPU;EAUV,QAAA;EAjB6B;EAoB7B,MAAA,EAAQ,MAAA;EApBa;EAuBrB,OAAA;EApBA;EAuBA,UAAA;EArBS;EAwBT,QAAA,EAAU,QAAA;EAtBA;EAyBV,OAAA;EAvBY;EA0BZ,IAAA;EAvBe;EA0Bf,WAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,aAAA;AAAA,UAEzB,SAAA,SAAkB,aAAA;EAvBjC;EAyBA,UAAA;AAAA;AAAA,UAGe,wBAAA;EAnBf;EAqBA,UAAA,EAAY,SAAA;EAlBZ;EAoBA,IAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA,EAAO,KAAA;IACL,EAAA;IACA,IAAA;IAEA,IAAA,GAAO,MAAA;IACP,QAAA;EAAA;EAEF,KAAA,EAAO,KAAA;IACL,MAAA;IACA,MAAA;IACA,IAAA;IACA,WAAA;EAAA;AAAA;;;;UAOa,SAAA;EAtBf;;;EA0BA,EAAA;EAvB6B;;;EA4B7B,KAAA,GAAQ,MAAA;EApBD;;;;
|
|
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.
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","names":[],"sources":["../src/schema.ts"],"mappings":";;;KAEK,QAAA,MAAc,CAAA;AAAA,KAEP,SAAA;AAAA,KAQA,YAAA;AAAA,KAEP,iBAAA;AAAA,KAEO,YAAA;AAAA,KAEA,MAAA;EAhBQ;AAEpB;;;EAmBE,IAAA;EAnBmB;AAQrB;;;EAiBE,eAAA;EAjBsB;AAA6C;;EAsBnE,YAAA;IApBoB;;AAEtB;IAsBI,SAAA,GAAY,QAAA;IAtBQ;;;IA2BpB,aAAA,GAAgB,QAAA;IAAA,CAEf,GAAA;EAAA;AAAA;AAAA,UAIY,WAAA;EApBf;;;EAwBA,QAAA;EAVE;;;;EAgBF,YAAA,GAAe,WAAA;EAVA;;;;EAgBf,aAAA,GAAgB,WAAA;EAMD;;;;EAAf,YAAA,GAAe,WAAA;EAlBf;;;;EAwBA,aAAA,GAAgB,WAAA;EANhB;;;;EAYA,cAAA,GAAiB,WAAA;AAAA;AAAA,KAGP,SAAA,GAAY,MAAA,SAAe,WAAA;AAAA,KAE3B,QAAA,GAAW,QAAA;EACrB,MAAA;EAEA,IAAA;EAEA,MAAA,GAAS,MAAA;EAET,OAAA,GAAU,MAAA;EAAA,CAET,GAAA;AAAA;AAAA,UAGc,aAAA;;EAEf,YAAA;EAPU;EAUV,QAAA;EAjB6B;EAoB7B,MAAA,EAAQ,MAAA;EApBa;EAuBrB,OAAA;EApBA;EAuBA,UAAA;EArBS;EAwBT,QAAA,EAAU,QAAA;EAtBA;EAyBV,OAAA;EAvBY;EA0BZ,IAAA;EAvBe;EA0Bf,WAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,aAAA;AAAA,UAEzB,SAAA,SAAkB,aAAA;EAvBjC;EAyBA,UAAA;AAAA;AAAA,UAGe,wBAAA;EAnBf;EAqBA,UAAA,EAAY,SAAA;EAlBZ;EAoBA,IAAA;AAAA;AAAA,UAGe,cAAA;EACf,KAAA,EAAO,KAAA;IACL,EAAA;IACA,IAAA;IAEA,IAAA,GAAO,MAAA;IACP,QAAA;EAAA;EAEF,KAAA,EAAO,KAAA;IACL,MAAA;IACA,MAAA;IACA,IAAA;IACA,WAAA;EAAA;AAAA;;;;UAOa,SAAA;EAtBf;;;EA0BA,EAAA;EAvB6B;;;EA4B7B,KAAA,GAAQ,MAAA;EApBD;;;;
|
|
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
|
|
174
|
-
*
|
|
175
|
-
*
|
|
176
|
-
*
|
|
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
|
-
*
|
|
900
|
-
* `
|
|
901
|
-
*
|
|
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`
|
|
906
|
-
*
|
|
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: []
|
|
915
|
-
*
|
|
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
|
|
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
|
-
* @
|
|
945
|
-
*
|
|
946
|
-
*
|
|
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
|
|
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:
|
|
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
|
|
1207
|
-
* `
|
|
1208
|
-
*
|
|
1209
|
-
* `#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
|
-
*
|
|
1417
|
-
* subgraph) are not observable via the narrow content pump.
|
|
1418
|
-
* `
|
|
1419
|
-
*
|
|
1420
|
-
*
|
|
1421
|
-
*
|
|
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.#
|
|
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.#
|
|
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
|
|
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
|
-
#
|
|
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
|
*/
|