@remnic/core 10.0.76 → 10.0.77

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 (80) hide show
  1. package/dist/access-admin-ops-surface.js +2 -2
  2. package/dist/access-authorization-probe.js +3 -3
  3. package/dist/access-boundary.js +2 -2
  4. package/dist/access-cli.js +17 -17
  5. package/dist/access-extraction-force-flush.js +2 -2
  6. package/dist/access-http-briefing.js +3 -3
  7. package/dist/access-http-query.js +2 -2
  8. package/dist/access-http.js +14 -14
  9. package/dist/access-identity-continuity-surface.js +2 -2
  10. package/dist/access-lcm-surface.js +2 -2
  11. package/dist/access-mcp.js +9 -9
  12. package/dist/access-namespace-preflight.js +2 -2
  13. package/dist/access-observe-helpers.d.ts.map +1 -1
  14. package/dist/access-observe-helpers.js +1 -1
  15. package/dist/access-observe-write-surface.js +2 -2
  16. package/dist/access-operations-batch.js +3 -3
  17. package/dist/access-operations.js +8 -8
  18. package/dist/access-recall-concurrency.js +2 -2
  19. package/dist/access-recall-response.js +2 -2
  20. package/dist/access-recall-surface.js +2 -2
  21. package/dist/access-service.js +2 -2
  22. package/dist/access-surface-catalog.js +4 -4
  23. package/dist/{chunk-R24RYSQX.js → chunk-2JRLKDHV.js} +2 -2
  24. package/dist/{chunk-N6GEGRCT.js → chunk-4NDDRYBY.js} +2 -2
  25. package/dist/{chunk-VEWTHVX2.js → chunk-5HVEYVNQ.js} +2 -2
  26. package/dist/{chunk-KAED7IBB.js → chunk-6L62IDS6.js} +2 -2
  27. package/dist/{chunk-IPHIIRDN.js → chunk-CYTTY4M2.js} +5 -7
  28. package/dist/chunk-CYTTY4M2.js.map +1 -0
  29. package/dist/{chunk-SZBZOUHR.js → chunk-D26XMQP5.js} +2 -2
  30. package/dist/{chunk-VPEMGBTI.js → chunk-D3USVQIV.js} +2 -2
  31. package/dist/{chunk-E22CQZ3H.js → chunk-EYIBIGIU.js} +8 -8
  32. package/dist/{chunk-IBQ7LGUJ.js → chunk-FQU65RJX.js} +3 -3
  33. package/dist/{chunk-FP2AT4WL.js → chunk-G3PBNYDH.js} +2 -2
  34. package/dist/{chunk-HR6NTVYZ.js → chunk-I4W2ADBP.js} +140 -7
  35. package/dist/chunk-I4W2ADBP.js.map +1 -0
  36. package/dist/{chunk-ZG57BEUS.js → chunk-LXDERMOU.js} +2 -2
  37. package/dist/{chunk-SY4AFWUZ.js → chunk-MAURCRPQ.js} +4 -4
  38. package/dist/{chunk-3GGCMRO7.js → chunk-MUZWS6KB.js} +2 -2
  39. package/dist/{chunk-TD5VTVPT.js → chunk-MXQKGSMW.js} +2 -2
  40. package/dist/{chunk-RXGFITWS.js → chunk-NUBOY2LQ.js} +2 -2
  41. package/dist/{chunk-PLGBPFEO.js → chunk-TWHVCSLX.js} +2 -2
  42. package/dist/{chunk-VEQVXNWR.js → chunk-TX627XOF.js} +2 -2
  43. package/dist/cli.js +15 -15
  44. package/dist/external-wiki-access.js +3 -3
  45. package/dist/index.js +17 -17
  46. package/dist/memory-browse-operations.js +3 -3
  47. package/dist/orchestration/backlog-scheduler.js +18 -18
  48. package/dist/orchestration/buffer-drain-runner.js +18 -18
  49. package/dist/orchestration/extraction-queue-snapshot-sharing.d.ts +113 -0
  50. package/dist/orchestration/extraction-queue-snapshot-sharing.d.ts.map +1 -0
  51. package/dist/orchestration/turn-ingestion.d.ts +3 -0
  52. package/dist/orchestration/turn-ingestion.d.ts.map +1 -1
  53. package/dist/orchestrator.js +17 -17
  54. package/dist/recall-navigation-operations.js +3 -3
  55. package/dist/recall-navigation.js +2 -2
  56. package/dist/support-passport/index.js +5 -5
  57. package/package.json +2 -2
  58. package/src/access-observe-helpers.test.ts +156 -0
  59. package/src/access-observe-helpers.ts +6 -6
  60. package/src/orchestration/extraction-queue-bounded-retention.test.ts +548 -0
  61. package/src/orchestration/extraction-queue-snapshot-sharing.ts +257 -0
  62. package/src/orchestration/turn-ingestion.ts +19 -6
  63. package/dist/chunk-HR6NTVYZ.js.map +0 -1
  64. package/dist/chunk-IPHIIRDN.js.map +0 -1
  65. /package/dist/{chunk-R24RYSQX.js.map → chunk-2JRLKDHV.js.map} +0 -0
  66. /package/dist/{chunk-N6GEGRCT.js.map → chunk-4NDDRYBY.js.map} +0 -0
  67. /package/dist/{chunk-VEWTHVX2.js.map → chunk-5HVEYVNQ.js.map} +0 -0
  68. /package/dist/{chunk-KAED7IBB.js.map → chunk-6L62IDS6.js.map} +0 -0
  69. /package/dist/{chunk-SZBZOUHR.js.map → chunk-D26XMQP5.js.map} +0 -0
  70. /package/dist/{chunk-VPEMGBTI.js.map → chunk-D3USVQIV.js.map} +0 -0
  71. /package/dist/{chunk-E22CQZ3H.js.map → chunk-EYIBIGIU.js.map} +0 -0
  72. /package/dist/{chunk-IBQ7LGUJ.js.map → chunk-FQU65RJX.js.map} +0 -0
  73. /package/dist/{chunk-FP2AT4WL.js.map → chunk-G3PBNYDH.js.map} +0 -0
  74. /package/dist/{chunk-ZG57BEUS.js.map → chunk-LXDERMOU.js.map} +0 -0
  75. /package/dist/{chunk-SY4AFWUZ.js.map → chunk-MAURCRPQ.js.map} +0 -0
  76. /package/dist/{chunk-3GGCMRO7.js.map → chunk-MUZWS6KB.js.map} +0 -0
  77. /package/dist/{chunk-TD5VTVPT.js.map → chunk-MXQKGSMW.js.map} +0 -0
  78. /package/dist/{chunk-RXGFITWS.js.map → chunk-NUBOY2LQ.js.map} +0 -0
  79. /package/dist/{chunk-PLGBPFEO.js.map → chunk-TWHVCSLX.js.map} +0 -0
  80. /package/dist/{chunk-VEQVXNWR.js.map → chunk-TX627XOF.js.map} +0 -0
@@ -27,6 +27,7 @@ import { SessionObserverState } from "../session-observer-state.js";
27
27
  import { TranscriptManager } from "../transcript.js";
28
28
  import type { BufferTurn, PluginConfig, SourceConnectorProvenance } from "../types.js";
29
29
  import { type ExtractionTaskExecutionContext } from "./extraction-task-queueing.js";
30
+ import { ExtractionSnapshotSharingRegistry } from "./extraction-queue-snapshot-sharing.js";
30
31
  import { type ResolvedScopeProfilePlan } from "../namespaces/scope-profiles.js";
31
32
  import { type BulkImportBatchIngestResult } from "../orchestrator.js";
32
33
  /**
@@ -102,6 +103,8 @@ export interface TurnIngestionOptions extends SourceConnectorProvenance {
102
103
  export declare class TurnIngestionCoordinator {
103
104
  private readonly deps;
104
105
  private readonly drain;
106
+ /** Queued automatic-snapshot chains: bounded-queue retention via structural sharing. */
107
+ readonly snapshotSharing: ExtractionSnapshotSharingRegistry;
105
108
  constructor(deps: TurnIngestionDeps);
106
109
  processTurn(role: "user" | "assistant", content: string, sessionKey?: string, options?: TurnIngestionOptions): Promise<void>;
107
110
  ingestReplayBatch(turns: ReplayTurn[], options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"turn-ingestion.d.ts","sourceRoot":"","sources":["../../src/orchestration/turn-ingestion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"turn-ingestion.d.ts","sourceRoot":"","sources":["../../src/orchestration/turn-ingestion.ts"],"names":[],"mappings":"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"}
@@ -4,9 +4,9 @@ import {
4
4
  graphPathRelativeToStorage,
5
5
  mergeGraphExpandedResults,
6
6
  qmdStartupCollectionChecksWithTimeout
7
- } from "./chunk-HR6NTVYZ.js";
7
+ } from "./chunk-I4W2ADBP.js";
8
8
  import "./chunk-B36ACJG7.js";
9
- import "./chunk-PLGBPFEO.js";
9
+ import "./chunk-TWHVCSLX.js";
10
10
  import {
11
11
  formatCompressionGuidelinesForRecall
12
12
  } from "./chunk-5PHOU5QI.js";
@@ -122,7 +122,7 @@ import "./chunk-7G5NTS7F.js";
122
122
  import "./chunk-HB5TNQMM.js";
123
123
  import "./chunk-4NZQ7IID.js";
124
124
  import "./chunk-3I4FUAVJ.js";
125
- import "./chunk-SY4AFWUZ.js";
125
+ import "./chunk-MAURCRPQ.js";
126
126
  import "./chunk-MMACM5G2.js";
127
127
  import "./chunk-54BGIBCR.js";
128
128
  import "./chunk-H4CKS5B2.js";
@@ -238,7 +238,7 @@ import "./chunk-43HUVDTD.js";
238
238
  import "./chunk-4RA3C3EV.js";
239
239
  import "./chunk-B32WYRXX.js";
240
240
  import "./chunk-3NF4QUNZ.js";
241
- import "./chunk-E22CQZ3H.js";
241
+ import "./chunk-EYIBIGIU.js";
242
242
  import "./chunk-V7IZKJI3.js";
243
243
  import "./chunk-TB6CBZ5V.js";
244
244
  import "./chunk-XW2T4QAW.js";
@@ -252,27 +252,27 @@ import "./chunk-2TGIKMMZ.js";
252
252
  import "./chunk-SDESKFKT.js";
253
253
  import "./chunk-3HSRWJTC.js";
254
254
  import "./chunk-FETPTCQZ.js";
255
- import "./chunk-SZBZOUHR.js";
256
- import "./chunk-VEWTHVX2.js";
255
+ import "./chunk-D26XMQP5.js";
256
+ import "./chunk-5HVEYVNQ.js";
257
257
  import "./chunk-SRT6SHVZ.js";
258
- import "./chunk-VEQVXNWR.js";
258
+ import "./chunk-TX627XOF.js";
259
259
  import "./chunk-TE6S7KDF.js";
260
260
  import "./chunk-EIB4FJVR.js";
261
261
  import "./chunk-MZUQVWVC.js";
262
262
  import "./chunk-A5KNZSNA.js";
263
263
  import "./chunk-HUSTM6PU.js";
264
264
  import "./chunk-D24OXEPB.js";
265
- import "./chunk-IBQ7LGUJ.js";
265
+ import "./chunk-FQU65RJX.js";
266
266
  import "./chunk-SYDPJUFR.js";
267
- import "./chunk-ZG57BEUS.js";
267
+ import "./chunk-LXDERMOU.js";
268
268
  import "./chunk-233S3MXC.js";
269
- import "./chunk-N6GEGRCT.js";
270
- import "./chunk-3GGCMRO7.js";
271
- import "./chunk-VPEMGBTI.js";
269
+ import "./chunk-4NDDRYBY.js";
270
+ import "./chunk-MUZWS6KB.js";
271
+ import "./chunk-D3USVQIV.js";
272
272
  import "./chunk-7T4TOGMS.js";
273
273
  import "./chunk-7YQ6ESEA.js";
274
274
  import "./chunk-ZXF3O7P4.js";
275
- import "./chunk-RXGFITWS.js";
275
+ import "./chunk-NUBOY2LQ.js";
276
276
  import "./chunk-PQM3B54K.js";
277
277
  import "./chunk-K36RMINQ.js";
278
278
  import "./chunk-2RUTN7PR.js";
@@ -287,14 +287,14 @@ import "./chunk-KNZDGZSY.js";
287
287
  import "./chunk-DEGE32C3.js";
288
288
  import "./chunk-AB3A7EFH.js";
289
289
  import "./chunk-KIUVEMBI.js";
290
- import "./chunk-KAED7IBB.js";
290
+ import "./chunk-6L62IDS6.js";
291
291
  import "./chunk-2BPPGNAQ.js";
292
292
  import "./chunk-DJSJ4ULL.js";
293
- import "./chunk-FP2AT4WL.js";
293
+ import "./chunk-G3PBNYDH.js";
294
294
  import {
295
295
  hasIdentityRecoveryIntent,
296
296
  resolveEffectiveIdentityInjectionMode
297
- } from "./chunk-R24RYSQX.js";
297
+ } from "./chunk-2JRLKDHV.js";
298
298
  import "./chunk-W4F3C7N7.js";
299
299
  import "./chunk-MPC7TYTZ.js";
300
300
  import "./chunk-2R7OCBRR.js";
@@ -592,7 +592,7 @@ import "./chunk-ESG6ITGP.js";
592
592
  import "./chunk-PCXDUHQH.js";
593
593
  import "./chunk-VUFL7X3H.js";
594
594
  import "./chunk-C5LWPYS3.js";
595
- import "./chunk-IPHIIRDN.js";
595
+ import "./chunk-CYTTY4M2.js";
596
596
  import "./chunk-F5GVIPC7.js";
597
597
  import "./chunk-X4OZMANG.js";
598
598
  import "./chunk-NGHDW6UU.js";
@@ -1,5 +1,5 @@
1
- import "./chunk-N6GEGRCT.js";
2
- import "./chunk-R24RYSQX.js";
1
+ import "./chunk-4NDDRYBY.js";
2
+ import "./chunk-2JRLKDHV.js";
3
3
  import "./chunk-W4F3C7N7.js";
4
4
  import "./chunk-MPC7TYTZ.js";
5
5
  import "./chunk-2R7OCBRR.js";
@@ -256,7 +256,7 @@ import "./chunk-ESG6ITGP.js";
256
256
  import "./chunk-PCXDUHQH.js";
257
257
  import "./chunk-VUFL7X3H.js";
258
258
  import "./chunk-C5LWPYS3.js";
259
- import "./chunk-IPHIIRDN.js";
259
+ import "./chunk-CYTTY4M2.js";
260
260
  import "./chunk-F5GVIPC7.js";
261
261
  import "./chunk-X4OZMANG.js";
262
262
  import "./chunk-NGHDW6UU.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  runRecallNavigation
3
- } from "./chunk-R24RYSQX.js";
3
+ } from "./chunk-2JRLKDHV.js";
4
4
  import "./chunk-W4F3C7N7.js";
5
5
  import "./chunk-MPC7TYTZ.js";
6
6
  import "./chunk-2R7OCBRR.js";
@@ -257,7 +257,7 @@ import "./chunk-ESG6ITGP.js";
257
257
  import "./chunk-PCXDUHQH.js";
258
258
  import "./chunk-VUFL7X3H.js";
259
259
  import "./chunk-C5LWPYS3.js";
260
- import "./chunk-IPHIIRDN.js";
260
+ import "./chunk-CYTTY4M2.js";
261
261
  import "./chunk-F5GVIPC7.js";
262
262
  import "./chunk-X4OZMANG.js";
263
263
  import "./chunk-NGHDW6UU.js";
@@ -4,7 +4,7 @@ import {
4
4
  SUPPORT_PASSPORT_MODEL_RESULT_PATH,
5
5
  SupportPassportModelBridge,
6
6
  parseSupportPassportModelJob
7
- } from "../chunk-PLGBPFEO.js";
7
+ } from "../chunk-TWHVCSLX.js";
8
8
  import {
9
9
  DEFAULT_SUPPORT_PASSPORT_CONFIG,
10
10
  parseSupportPassportConfig
@@ -14,8 +14,8 @@ import {
14
14
  buildSupportPassportPublicRequestHandler,
15
15
  composeSupportPassportExternalRequestHandlers,
16
16
  normalizeSupportPassportNetworkAddress
17
- } from "../chunk-VEWTHVX2.js";
18
- import "../chunk-ZG57BEUS.js";
17
+ } from "../chunk-5HVEYVNQ.js";
18
+ import "../chunk-LXDERMOU.js";
19
19
  import {
20
20
  SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,
21
21
  SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES,
@@ -56,7 +56,7 @@ import {
56
56
  notifySupportPassportCommitted,
57
57
  resolveSupportPassportModelRoutePlan,
58
58
  syncDirectoryForDurability
59
- } from "../chunk-R24RYSQX.js";
59
+ } from "../chunk-2JRLKDHV.js";
60
60
  import "../chunk-W4F3C7N7.js";
61
61
  import "../chunk-MPC7TYTZ.js";
62
62
  import "../chunk-2R7OCBRR.js";
@@ -344,7 +344,7 @@ import "../chunk-ESG6ITGP.js";
344
344
  import "../chunk-PCXDUHQH.js";
345
345
  import "../chunk-VUFL7X3H.js";
346
346
  import "../chunk-C5LWPYS3.js";
347
- import "../chunk-IPHIIRDN.js";
347
+ import "../chunk-CYTTY4M2.js";
348
348
  import "../chunk-F5GVIPC7.js";
349
349
  import "../chunk-X4OZMANG.js";
350
350
  import "../chunk-NGHDW6UU.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "10.0.76",
3
+ "version": "10.0.77",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3386,7 +3386,7 @@
3386
3386
  "core"
3387
3387
  ],
3388
3388
  "peerDependencies": {
3389
- "@remnic/coding-graph": "^10.0.76"
3389
+ "@remnic/coding-graph": "^10.0.77"
3390
3390
  },
3391
3391
  "peerDependenciesMeta": {
3392
3392
  "@remnic/coding-graph": {
@@ -1,4 +1,6 @@
1
1
  import assert from "node:assert/strict";
2
+ import { spawn } from "node:child_process";
3
+ import { fileURLToPath } from "node:url";
2
4
  /**
3
5
  * PendingObserveExtractionTracker settle hygiene — issue: `track`'s settle
4
6
  * callback only removed the pending entry when the extraction SUCCEEDED or
@@ -70,3 +72,157 @@ test("a wait overlapping a failing extraction still surfaces the error", async (
70
72
  reject(new Error("extraction failed"));
71
73
  await waiter;
72
74
  });
75
+
76
+ /**
77
+ * Controller retention — issue: `track` copied every prior controller of the
78
+ * key into a fresh Set per tracked extraction, and never-settling promise
79
+ * chains keep every generation reachable, so overlapping stalled tracks grew
80
+ * quadratically (HeapRepro: ~543MB at 6000 tracks; measured 212.8MB at 4000
81
+ * pre-fix vs 4.2MB with the shared per-key set). The fix reuses one Set per
82
+ * key; `abortTracked` iterates a snapshot so a reentrant `track` fired from
83
+ * an abort listener keeps prior semantics (not aborted by the in-flight
84
+ * pass, iteration terminates).
85
+ */
86
+ function stalled(): Promise<void> {
87
+ const { promise } = Promise.withResolvers<void>();
88
+ return promise;
89
+ }
90
+
91
+ function rejectingAfter(controller: AbortController): Promise<void> {
92
+ const { promise, reject } = Promise.withResolvers<void>();
93
+ controller.signal.addEventListener("abort", () => reject(controller.signal.reason), { once: true });
94
+ return promise;
95
+ }
96
+
97
+ // Runs the retention loop in one short-lived child process with --expose-gc,
98
+ // so CI exercises it without exposing gc to the whole test tree. The
99
+ // assertion keeps a wide margin (4.2MB measured post-fix vs 212.8MB pre-fix
100
+ // at the same track count), not a fixed runner heap limit.
101
+ function drain(stream: NodeJS.ReadableStream): Promise<string> {
102
+ return new Promise((resolve) => {
103
+ const chunks: string[] = [];
104
+ stream.on("data", (chunk) => chunks.push(String(chunk)));
105
+ stream.on("end", () => resolve(chunks.join("")));
106
+ });
107
+ }
108
+
109
+ async function retainedHeapInChild(): Promise<number> {
110
+ const trackerSource = fileURLToPath(new URL("./access-observe-helpers.js", import.meta.url));
111
+ const child = spawn(
112
+ process.execPath,
113
+ [
114
+ "--expose-gc",
115
+ "--input-type=module",
116
+ "--import",
117
+ "tsx",
118
+ "-e",
119
+ `import { pathToFileURL } from "node:url";
120
+ const { PendingObserveExtractionTracker } = await import(pathToFileURL(process.argv.at(-1)));
121
+ gc();
122
+ const before = process.memoryUsage().heapUsed;
123
+ const tracker = new PendingObserveExtractionTracker();
124
+ const key = tracker.key("session-a", "alice", "default");
125
+ for (let i = 0; i < 4000; i++) tracker.track(key, new Promise(() => {}), new AbortController());
126
+ gc();
127
+ console.log(JSON.stringify(process.memoryUsage().heapUsed - before));`,
128
+ trackerSource,
129
+ ],
130
+ { cwd: fileURLToPath(new URL("..", import.meta.url)), stdio: ["ignore", "pipe", "pipe"] },
131
+ );
132
+ const [stdout, stderr, code] = await Promise.all([
133
+ drain(child.stdout),
134
+ drain(child.stderr),
135
+ new Promise<number | null>((resolve) => child.on("close", resolve)),
136
+ ]);
137
+ assert.equal(code, 0, `retention child failed (${code}): ${stderr.slice(0, 400)}`);
138
+ const lastLine = stdout.trim().split("\n").at(-1);
139
+ assert.ok(lastLine !== undefined, `retention child printed no output: ${stderr.slice(0, 400)}`);
140
+ return JSON.parse(lastLine);
141
+ }
142
+
143
+ test("retained heap stays bounded across overlapping stalled tracks", { timeout: 15000 }, async () => {
144
+ const retained = await retainedHeapInChild();
145
+ assert.ok(
146
+ retained < 32 * 1024 * 1024,
147
+ `retained ${(retained / 1048576).toFixed(1)}MB for 4000 tracks; quadratic controller-set copies keep dead generations alive`,
148
+ );
149
+ });
150
+
151
+ test("cancel still aborts every distinct controller across overlapping tracks", () => {
152
+ const tracker = new PendingObserveExtractionTracker();
153
+ const key = tracker.key("session-a", "alice", "default");
154
+ const controllers = Array.from({ length: 50 }, () => new AbortController());
155
+ for (const controller of controllers) {
156
+ tracker.track(key, stalled(), controller);
157
+ }
158
+ tracker.cancel("session-a", "alice", "default");
159
+ for (const controller of controllers) {
160
+ assert.ok(controller.signal.aborted, "every tracked controller must be aborted");
161
+ }
162
+ });
163
+
164
+ test("a controller admitted by a reentrant track during cancel is not aborted by that pass", () => {
165
+ const tracker = new PendingObserveExtractionTracker();
166
+ const key = tracker.key("session-a", "alice", "default");
167
+ const first = new AbortController();
168
+ const reentrant = new AbortController();
169
+ first.signal.addEventListener(
170
+ "abort",
171
+ () => {
172
+ tracker.track(key, stalled(), reentrant);
173
+ },
174
+ { once: true },
175
+ );
176
+ tracker.track(key, stalled(), first);
177
+ tracker.cancel("session-a", "alice", "default");
178
+ assert.ok(first.signal.aborted);
179
+ assert.equal(reentrant.signal.aborted, false, "prior behavior: the in-flight abort pass must not abort later admissions");
180
+ });
181
+
182
+ test("each key aborts and cleans up in isolation", { timeout: 2000 }, async () => {
183
+ const tracker = new PendingObserveExtractionTracker();
184
+ const keyA = tracker.key("session-a", "alice", "default");
185
+ const keyB = tracker.key("session-b", "bob", "default");
186
+ const controllerA = new AbortController();
187
+ const controllerB = new AbortController();
188
+ tracker.track(keyA, rejectingAfter(controllerA), controllerA);
189
+ tracker.track(keyB, stalled(), controllerB);
190
+ tracker.cancel("session-a", "alice", "default");
191
+ assert.ok(controllerA.signal.aborted);
192
+ assert.equal(controllerB.signal.aborted, false);
193
+ await settle();
194
+ await tracker.wait("session-a", "alice", "default");
195
+ });
196
+
197
+ test("an aborted chain entry settles once every generation settles and cleans up", { timeout: 2000 }, async () => {
198
+ const tracker = new PendingObserveExtractionTracker();
199
+ const key = tracker.key("session-a", "alice", "default");
200
+ const first = new AbortController();
201
+ tracker.track(key, rejectingAfter(first), first);
202
+ const second = new AbortController();
203
+ const { promise: secondExtraction, resolve } = Promise.withResolvers<void>();
204
+ tracker.track(key, secondExtraction, second);
205
+ first.abort(preemptedExtractionError());
206
+ resolve();
207
+ await settle();
208
+ await tracker.wait("session-a", "alice", "default");
209
+ });
210
+
211
+ test("wait surfaces a chained non-preempted rejection", async () => {
212
+ const tracker = new PendingObserveExtractionTracker();
213
+ const key = tracker.key("session-a", "alice", "default");
214
+ tracker.track(key, Promise.resolve(), new AbortController());
215
+ tracker.track(key, Promise.reject(new Error("extraction failed")), new AbortController());
216
+ await assert.rejects(tracker.wait("session-a", "alice", "default"), /extraction failed/);
217
+ });
218
+
219
+ test("a wait overlapping a preempted rejection returns without throwing", { timeout: 2000 }, async () => {
220
+ const tracker = new PendingObserveExtractionTracker();
221
+ const key = tracker.key("session-a", "alice", "default");
222
+ const controller = new AbortController();
223
+ tracker.track(key, rejectingAfter(controller), controller);
224
+ const waiter = tracker.wait("session-a", "alice", "default");
225
+ await Promise.resolve();
226
+ controller.abort(preemptedExtractionError());
227
+ await waiter;
228
+ });
@@ -142,11 +142,9 @@ export class PendingObserveExtractionTracker {
142
142
  if (rejected) throw rejected.reason;
143
143
  })
144
144
  : extraction;
145
- const entry = {
146
- promise,
147
- running: previous?.running ?? extraction,
148
- controllers: new Set(previous ? [...previous.controllers, controller] : [controller]),
149
- };
145
+ const controllers = previous?.controllers ?? new Set<AbortController>();
146
+ controllers.add(controller);
147
+ const entry = { promise, running: previous?.running ?? extraction, controllers };
150
148
  this.entries.set(key, entry);
151
149
  // Any settle (success OR rejection — preemption is just one rejection
152
150
  // kind) ends the pending entry; leaving a settled failure tracked wedged
@@ -201,7 +199,9 @@ export class PendingObserveExtractionTracker {
201
199
  (principal !== undefined && entryPrincipal !== (principal ?? "")) ||
202
200
  (namespace !== undefined && entryNamespace !== (namespace ?? ""))
203
201
  ) continue;
204
- for (const controller of entry.controllers) controller.abort(reason);
202
+ // Snapshot: an abort listener may track() synchronously; iterating the
203
+ // shared live set would abort that new admission or never terminate.
204
+ for (const controller of [...entry.controllers]) controller.abort(reason);
205
205
  }
206
206
  }
207
207