@remnic/core 10.0.75 → 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 (84) 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-VYOAYFDV.js → chunk-I4W2ADBP.js} +144 -26
  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-URS56HGW.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-coordinator.d.ts +4 -9
  50. package/dist/orchestration/extraction-queue-coordinator.d.ts.map +1 -1
  51. package/dist/orchestration/extraction-queue-snapshot-sharing.d.ts +113 -0
  52. package/dist/orchestration/extraction-queue-snapshot-sharing.d.ts.map +1 -0
  53. package/dist/orchestration/turn-ingestion.d.ts +3 -0
  54. package/dist/orchestration/turn-ingestion.d.ts.map +1 -1
  55. package/dist/orchestrator.js +17 -17
  56. package/dist/recall-navigation-operations.js +3 -3
  57. package/dist/recall-navigation.js +2 -2
  58. package/dist/support-passport/index.js +5 -5
  59. package/package.json +2 -2
  60. package/src/access-observe-helpers.test.ts +156 -0
  61. package/src/access-observe-helpers.ts +6 -6
  62. package/src/orchestration/extraction-queue-bounded-retention.test.ts +548 -0
  63. package/src/orchestration/extraction-queue-coordinator.ts +4 -19
  64. package/src/orchestration/extraction-queue-snapshot-sharing.ts +257 -0
  65. package/src/orchestration/turn-ingestion.ts +19 -6
  66. package/src/orchestrator-extraction-queue.test.ts +70 -13
  67. package/dist/chunk-IPHIIRDN.js.map +0 -1
  68. package/dist/chunk-VYOAYFDV.js.map +0 -1
  69. /package/dist/{chunk-R24RYSQX.js.map → chunk-2JRLKDHV.js.map} +0 -0
  70. /package/dist/{chunk-N6GEGRCT.js.map → chunk-4NDDRYBY.js.map} +0 -0
  71. /package/dist/{chunk-VEWTHVX2.js.map → chunk-5HVEYVNQ.js.map} +0 -0
  72. /package/dist/{chunk-KAED7IBB.js.map → chunk-6L62IDS6.js.map} +0 -0
  73. /package/dist/{chunk-SZBZOUHR.js.map → chunk-D26XMQP5.js.map} +0 -0
  74. /package/dist/{chunk-VPEMGBTI.js.map → chunk-D3USVQIV.js.map} +0 -0
  75. /package/dist/{chunk-E22CQZ3H.js.map → chunk-EYIBIGIU.js.map} +0 -0
  76. /package/dist/{chunk-IBQ7LGUJ.js.map → chunk-FQU65RJX.js.map} +0 -0
  77. /package/dist/{chunk-FP2AT4WL.js.map → chunk-G3PBNYDH.js.map} +0 -0
  78. /package/dist/{chunk-ZG57BEUS.js.map → chunk-LXDERMOU.js.map} +0 -0
  79. /package/dist/{chunk-SY4AFWUZ.js.map → chunk-MAURCRPQ.js.map} +0 -0
  80. /package/dist/{chunk-3GGCMRO7.js.map → chunk-MUZWS6KB.js.map} +0 -0
  81. /package/dist/{chunk-URS56HGW.js.map → chunk-MXQKGSMW.js.map} +0 -0
  82. /package/dist/{chunk-RXGFITWS.js.map → chunk-NUBOY2LQ.js.map} +0 -0
  83. /package/dist/{chunk-PLGBPFEO.js.map → chunk-TWHVCSLX.js.map} +0 -0
  84. /package/dist/{chunk-VEQVXNWR.js.map → chunk-TX627XOF.js.map} +0 -0
@@ -88,11 +88,9 @@ var PendingObserveExtractionTracker = class {
88
88
  );
89
89
  if (rejected) throw rejected.reason;
90
90
  }) : extraction;
91
- const entry = {
92
- promise,
93
- running: previous?.running ?? extraction,
94
- controllers: new Set(previous ? [...previous.controllers, controller] : [controller])
95
- };
91
+ const controllers = previous?.controllers ?? /* @__PURE__ */ new Set();
92
+ controllers.add(controller);
93
+ const entry = { promise, running: previous?.running ?? extraction, controllers };
96
94
  this.entries.set(key, entry);
97
95
  void promise.then(() => {
98
96
  if (this.entries.get(key) === entry) this.entries.delete(key);
@@ -119,7 +117,7 @@ var PendingObserveExtractionTracker = class {
119
117
  for (const [key, entry] of this.entries) {
120
118
  const [entrySessionKey, entryPrincipal, entryNamespace] = key.split("\0");
121
119
  if (entrySessionKey !== sessionKey || principal !== void 0 && entryPrincipal !== (principal ?? "") || namespace !== void 0 && entryNamespace !== (namespace ?? "")) continue;
122
- for (const controller of entry.controllers) controller.abort(reason);
120
+ for (const controller of [...entry.controllers]) controller.abort(reason);
123
121
  }
124
122
  }
125
123
  async wait(sessionKey, principal, namespace, abortSignal, registerCancellation, scopeHint, preemptAfterAdmission) {
@@ -171,4 +169,4 @@ export {
171
169
  pendingObserveScopeHint,
172
170
  PendingObserveExtractionTracker
173
171
  };
174
- //# sourceMappingURL=chunk-IPHIIRDN.js.map
172
+ //# sourceMappingURL=chunk-CYTTY4M2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/access-observe-helpers.ts"],"sourcesContent":["import { isPreemptedExtraction } from \"./abort-error.js\";\n\ntype PendingObservePreparation = {\n cancelled: boolean;\n scopeHint?: string;\n principal?: string;\n namespace?: string;\n scopeResolved: boolean;\n resolvedScopeFences: Array<{ principal?: string; namespace?: string }>;\n released: Promise<void>;\n release: () => void;\n};\n\nfunction resolvedScopesMatch(\n left: { principal?: string; namespace?: string },\n right: { principal?: string; namespace?: string },\n): boolean {\n return left.principal === right.principal && left.namespace === right.namespace;\n}\n\nfunction preparationMatchesScope(\n reservation: PendingObservePreparation,\n principal: string | undefined,\n namespace: string | undefined,\n scopeHint: string | undefined,\n): boolean {\n if (reservation.scopeResolved) {\n return resolvedScopesMatch(reservation, { principal, namespace });\n }\n return reservation.scopeHint === undefined || scopeHint === undefined || reservation.scopeHint === scopeHint;\n}\n\nexport type PendingObservePreparationHandle = {\n isCancelled(): boolean;\n setScope(principal?: string, namespace?: string): void;\n release(): void;\n};\n\nexport function pendingObserveScopeHint(options: {\n namespace?: string;\n projectTag?: string;\n cwd?: string;\n}): string | undefined {\n const namespace = options.namespace?.trim();\n if (namespace) return `namespace:${namespace}`;\n const projectTag = options.projectTag?.trim();\n if (projectTag) return `projectTag:${projectTag}`;\n const cwd = options.cwd?.trim();\n return cwd ? `cwd:${cwd}` : undefined;\n}\n\ntype PendingObserveExtraction = {\n promise: Promise<void>;\n running: Promise<void>;\n controllers: Set<AbortController>;\n};\n\nexport class PendingObserveExtractionTracker {\n private readonly entries = new Map<string, PendingObserveExtraction>();\n private readonly preparations = new Map<string, Set<PendingObservePreparation>>();\n\n reserve(sessionKey: string, scopeHint?: string): PendingObservePreparationHandle {\n let released = false;\n let resolveReleased: () => void = () => {};\n const reservation: PendingObservePreparation = {\n cancelled: false,\n scopeResolved: false,\n resolvedScopeFences: [],\n scopeHint,\n released: new Promise<void>((resolve) => {\n resolveReleased = resolve;\n }),\n release: () => {\n if (released) return;\n released = true;\n const entries = this.preparations.get(sessionKey);\n entries?.delete(reservation);\n if (entries?.size === 0) this.preparations.delete(sessionKey);\n resolveReleased();\n },\n };\n const entries = this.preparations.get(sessionKey) ?? new Set<PendingObservePreparation>();\n entries.add(reservation);\n this.preparations.set(sessionKey, entries);\n return {\n isCancelled: () => reservation.cancelled,\n setScope: (principal, namespace) => {\n reservation.principal = principal;\n reservation.namespace = namespace;\n reservation.scopeResolved = true;\n if (reservation.resolvedScopeFences.some((fence) => resolvedScopesMatch(reservation, fence))) {\n reservation.cancelled = true;\n }\n },\n release: reservation.release,\n };\n }\n\n private async waitForPreparations(\n sessionKey: string,\n principal: string | undefined,\n namespace: string | undefined,\n scopeHint: string | undefined,\n ): Promise<void> {\n while (true) {\n const reservations = [...(this.preparations.get(sessionKey) ?? [])];\n for (const reservation of reservations) {\n if (\n !reservation.cancelled &&\n !reservation.scopeResolved &&\n !preparationMatchesScope(reservation, principal, namespace, scopeHint) &&\n !reservation.resolvedScopeFences.some((fence) =>\n resolvedScopesMatch(fence, { principal, namespace }),\n )\n ) {\n reservation.resolvedScopeFences.push({ principal, namespace });\n }\n }\n const pending = reservations.filter(\n (reservation) =>\n !reservation.cancelled && preparationMatchesScope(reservation, principal, namespace, scopeHint),\n );\n if (pending.length === 0) return;\n await Promise.all(pending.map((reservation) => reservation.released));\n }\n }\n\n\n key(sessionKey: string, principal: string | undefined, namespace: string | undefined): string {\n return `${sessionKey}\\u0000${principal ?? \"\"}\\u0000${namespace ?? \"\"}`;\n }\n\n track(key: string, extraction: Promise<void>, controller: AbortController): void {\n const previous = this.entries.get(key);\n const promise = previous\n ? Promise.allSettled([previous.promise, extraction]).then((results) => {\n const rejected = results.find(\n (result): result is PromiseRejectedResult =>\n result.status === \"rejected\" &&\n !(result.reason instanceof Error && isPreemptedExtraction(result.reason)),\n );\n if (rejected) throw rejected.reason;\n })\n : extraction;\n const controllers = previous?.controllers ?? new Set<AbortController>();\n controllers.add(controller);\n const entry = { promise, running: previous?.running ?? extraction, controllers };\n this.entries.set(key, entry);\n // Any settle (success OR rejection — preemption is just one rejection\n // kind) ends the pending entry; leaving a settled failure tracked wedged\n // the key and kept every controller ever registered for it alive.\n void promise\n .then(() => {\n if (this.entries.get(key) === entry) this.entries.delete(key);\n })\n .catch(() => {\n if (this.entries.get(key) === entry) this.entries.delete(key);\n });\n }\n\n cancelPreparations(sessionKey: string, scopeHint?: string): void {\n for (const reservation of this.preparations.get(sessionKey) ?? []) {\n if (\n scopeHint !== undefined &&\n reservation.scopeHint !== undefined &&\n reservation.scopeHint !== scopeHint\n ) {\n continue;\n }\n reservation.cancelled = true;\n }\n }\n\n cancel(\n sessionKey: string,\n principal?: string,\n namespace?: string,\n scopeHint?: string,\n reason?: Error,\n ): void {\n for (const reservation of this.preparations.get(sessionKey) ?? []) {\n if (!preparationMatchesScope(reservation, principal, namespace, scopeHint)) continue;\n reservation.cancelled = true;\n }\n\n this.abortTracked(sessionKey, principal, namespace, reason);\n }\n\n private abortTracked(\n sessionKey: string,\n principal: string | undefined,\n namespace: string | undefined,\n reason?: Error,\n ): void {\n for (const [key, entry] of this.entries) {\n const [entrySessionKey, entryPrincipal, entryNamespace] = key.split(\"\\u0000\");\n if (\n entrySessionKey !== sessionKey ||\n (principal !== undefined && entryPrincipal !== (principal ?? \"\")) ||\n (namespace !== undefined && entryNamespace !== (namespace ?? \"\"))\n ) continue;\n // Snapshot: an abort listener may track() synchronously; iterating the\n // shared live set would abort that new admission or never terminate.\n for (const controller of [...entry.controllers]) controller.abort(reason);\n }\n }\n\n async wait(\n sessionKey: string,\n principal: string | undefined,\n namespace: string | undefined,\n abortSignal?: AbortSignal,\n registerCancellation?: (cancel: () => void) => void,\n scopeHint?: string,\n preemptAfterAdmission?: () => void,\n ): Promise<void> {\n const key = this.key(sessionKey, principal, namespace);\n let cancelled = abortSignal?.aborted === true;\n const abortTracked = (): void => {\n cancelled = true;\n this.cancel(sessionKey, principal, namespace, scopeHint);\n };\n registerCancellation?.(abortTracked);\n abortSignal?.addEventListener(\"abort\", abortTracked, { once: true });\n try {\n await this.waitForPreparations(sessionKey, principal, namespace, scopeHint);\n if (cancelled || abortSignal?.aborted) return;\n if (preemptAfterAdmission) {\n preemptAfterAdmission();\n const running = this.entries.get(key)?.running;\n if (!running) return;\n try {\n await running;\n } catch (error) {\n if (this.entries.get(key)?.running === running) this.entries.delete(key);\n if (!(error instanceof Error && isPreemptedExtraction(error))) throw error;\n }\n return;\n }\n while (true) {\n const entry = this.entries.get(key);\n if (!entry) return;\n try {\n await entry.promise;\n } catch (error) {\n if (this.entries.get(key) !== entry) continue;\n this.entries.delete(key);\n if (error instanceof Error && isPreemptedExtraction(error)) return;\n throw error;\n }\n if (this.entries.get(key) !== entry) continue;\n this.entries.delete(key);\n return;\n }\n } finally {\n abortSignal?.removeEventListener(\"abort\", abortTracked);\n }\n }\n}\n"],"mappings":"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","names":["entries"]}
@@ -2,7 +2,7 @@ import {
2
2
  SupportPassportError,
3
3
  SupportPassportOwnerCreateGrantRequestSchema,
4
4
  getOperation
5
- } from "./chunk-R24RYSQX.js";
5
+ } from "./chunk-2JRLKDHV.js";
6
6
 
7
7
  // src/support-passport/access-http.ts
8
8
  var OWNER_ROOT = "/engram/v1/support-passport";
@@ -137,4 +137,4 @@ export {
137
137
  SUPPORT_PASSPORT_OWNER_HTTP_ROUTES,
138
138
  handleSupportPassportOwnerHttp
139
139
  };
140
- //# sourceMappingURL=chunk-SZBZOUHR.js.map
140
+ //# sourceMappingURL=chunk-D26XMQP5.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-7T4TOGMS.js";
4
4
  import {
5
5
  defineOperation
6
- } from "./chunk-R24RYSQX.js";
6
+ } from "./chunk-2JRLKDHV.js";
7
7
 
8
8
  // src/external-wiki-access.ts
9
9
  import { z } from "zod";
@@ -26,4 +26,4 @@ var externalWikiSearchOperation = defineOperation({
26
26
  export {
27
27
  externalWikiSearchOperation
28
28
  };
29
- //# sourceMappingURL=chunk-VPEMGBTI.js.map
29
+ //# sourceMappingURL=chunk-D3USVQIV.js.map
@@ -21,10 +21,10 @@ import {
21
21
  } from "./chunk-FETPTCQZ.js";
22
22
  import {
23
23
  handleSupportPassportOwnerHttp
24
- } from "./chunk-SZBZOUHR.js";
24
+ } from "./chunk-D26XMQP5.js";
25
25
  import {
26
26
  buildSupportPassportPublicRequestHandler
27
- } from "./chunk-VEWTHVX2.js";
27
+ } from "./chunk-5HVEYVNQ.js";
28
28
  import {
29
29
  handleMcpGetSse
30
30
  } from "./chunk-SRT6SHVZ.js";
@@ -37,10 +37,10 @@ import {
37
37
  processChatMessage,
38
38
  sessionBelongsToPrincipal,
39
39
  subscribeChatTranscript
40
- } from "./chunk-VEQVXNWR.js";
40
+ } from "./chunk-TX627XOF.js";
41
41
  import {
42
42
  RelayMissionStoreError
43
- } from "./chunk-IBQ7LGUJ.js";
43
+ } from "./chunk-FQU65RJX.js";
44
44
  import {
45
45
  handleRecallWhyHttpQuery,
46
46
  handleRecallXrayHttpQuery
@@ -64,7 +64,7 @@ import {
64
64
  } from "./chunk-KNZDGZSY.js";
65
65
  import {
66
66
  respondBriefingHttp
67
- } from "./chunk-KAED7IBB.js";
67
+ } from "./chunk-6L62IDS6.js";
68
68
  import {
69
69
  maybeHandleLifecycleFlush
70
70
  } from "./chunk-2BPPGNAQ.js";
@@ -75,11 +75,11 @@ import {
75
75
  authorizationProbeNamespaces,
76
76
  authorizationProbeRequiresPrincipalNamespace,
77
77
  probeOperationAuthorization
78
- } from "./chunk-FP2AT4WL.js";
78
+ } from "./chunk-G3PBNYDH.js";
79
79
  import {
80
80
  getOperation,
81
81
  resolveQueryNamespaceWritablePreflight
82
- } from "./chunk-R24RYSQX.js";
82
+ } from "./chunk-2JRLKDHV.js";
83
83
  import {
84
84
  handleWhoKnowsHttpQuery
85
85
  } from "./chunk-ELUG6NKQ.js";
@@ -3573,4 +3573,4 @@ export {
3573
3573
  resolveDefaultAdminConsolePublicDir,
3574
3574
  EngramAccessHttpServer
3575
3575
  };
3576
- //# sourceMappingURL=chunk-E22CQZ3H.js.map
3576
+ //# sourceMappingURL=chunk-EYIBIGIU.js.map
@@ -12,13 +12,13 @@ import {
12
12
  } from "./chunk-233S3MXC.js";
13
13
  import {
14
14
  externalWikiSearchOperation
15
- } from "./chunk-VPEMGBTI.js";
15
+ } from "./chunk-D3USVQIV.js";
16
16
  import {
17
17
  DECISION_SUBCOMMANDS,
18
18
  DELTA_SUBCOMMANDS,
19
19
  defineOperation,
20
20
  isCodegraphToolName
21
- } from "./chunk-R24RYSQX.js";
21
+ } from "./chunk-2JRLKDHV.js";
22
22
  import {
23
23
  CorrectionContractError
24
24
  } from "./chunk-ETSJD5IV.js";
@@ -1916,4 +1916,4 @@ export {
1916
1916
  codegraphIngestTracesOperation,
1917
1917
  REGISTERED_OPERATIONS
1918
1918
  };
1919
- //# sourceMappingURL=chunk-IBQ7LGUJ.js.map
1919
+ //# sourceMappingURL=chunk-FQU65RJX.js.map
@@ -3,7 +3,7 @@ import {
3
3
  getOperation,
4
4
  operationRequiresAuthorizedNamespace,
5
5
  operationUsesPrincipalNamespace
6
- } from "./chunk-R24RYSQX.js";
6
+ } from "./chunk-2JRLKDHV.js";
7
7
  import {
8
8
  assertOperationAuthorizationAllowed
9
9
  } from "./chunk-YO2JEX2Z.js";
@@ -60,4 +60,4 @@ export {
60
60
  authorizationProbeNamespaces,
61
61
  authorizationProbeRequiresPrincipalNamespace
62
62
  };
63
- //# sourceMappingURL=chunk-FP2AT4WL.js.map
63
+ //# sourceMappingURL=chunk-G3PBNYDH.js.map
@@ -234,7 +234,7 @@ import {
234
234
  runTimelinePublishCli,
235
235
  screenCandidateFact,
236
236
  summarizeVaultPublish
237
- } from "./chunk-SY4AFWUZ.js";
237
+ } from "./chunk-MAURCRPQ.js";
238
238
  import {
239
239
  RoutingRulesStore
240
240
  } from "./chunk-TBUEE7XF.js";
@@ -373,7 +373,7 @@ import {
373
373
  } from "./chunk-MI2OTWV5.js";
374
374
  import {
375
375
  MeetingsInputError
376
- } from "./chunk-E22CQZ3H.js";
376
+ } from "./chunk-EYIBIGIU.js";
377
377
  import {
378
378
  WearablesInputError,
379
379
  describeErrorForOperator
@@ -400,7 +400,7 @@ import {
400
400
  detectPassiveCorrections,
401
401
  renderSessionExperiencePreview,
402
402
  scoreSessionExperienceForPrompt
403
- } from "./chunk-R24RYSQX.js";
403
+ } from "./chunk-2JRLKDHV.js";
404
404
  import {
405
405
  importCapsule
406
406
  } from "./chunk-2R7OCBRR.js";
@@ -671,7 +671,8 @@ import {
671
671
  import {
672
672
  bufferTurnsEqual,
673
673
  describeError,
674
- groupTurnsByExtractionScope
674
+ groupTurnsByExtractionScope,
675
+ scopeProfilePlanIdentity
675
676
  } from "./chunk-4KLQI3L2.js";
676
677
  import {
677
678
  FallbackLlmClient,
@@ -1119,29 +1120,14 @@ var ExtractionQueueCoordinator = class {
1119
1120
  return this.concurrency;
1120
1121
  }
1121
1122
  /**
1122
- * Enqueue a task and start the processor when capacity is free. This is
1123
- * the production entry point — the orchestrator's `queueBufferedExtraction`
1124
- * builds each task closure and hands it here with its buffer key.
1125
- *
1126
- * Per-key coalescing: a queued-not-started task for key K is superseded by
1127
- * a newer enqueue for K instead of stacking another full turn snapshot
1128
- * behind it (extraction reads live state at run time, so the newest
1129
- * closure is the authoritative one). Keyless tasks are independent work
1130
- * and never coalesce.
1123
+ * Enqueue a task and start the processor when capacity is free. Each task
1124
+ * keeps its own captured work and settlement; keyed tasks serialize behind
1125
+ * other tasks for that key. A front task may jump the queue but does not
1126
+ * discard queued work.
1131
1127
  */
1132
1128
  enqueue(task, options) {
1133
1129
  if (!this.accepting) return false;
1134
1130
  const key = options?.key;
1135
- if (key !== void 0) {
1136
- const queuedAt = this.queue.findIndex((entry2) => entry2.key === key);
1137
- if (!options?.front && queuedAt >= 0) {
1138
- this.queue[queuedAt] = { run: task, key };
1139
- return true;
1140
- }
1141
- if (options?.front && queuedAt >= 0) {
1142
- this.queue.splice(queuedAt, 1);
1143
- }
1144
- }
1145
1131
  const entry = { run: task, key };
1146
1132
  if (options?.front) {
1147
1133
  this.preemptRunning(options.key);
@@ -16369,6 +16355,132 @@ function queueBufferedCaptureScopeGroups(queueBufferedExtraction, extractionTurn
16369
16355
  }
16370
16356
  }
16371
16357
 
16358
+ // src/orchestration/extraction-queue-snapshot-sharing.ts
16359
+ function automaticSnapshotSharingEligible(options) {
16360
+ return options.execution === void 0 && options.preemptable === true && options.failOnExtractionFailure !== true && options.forceExtractionAttempt !== true && options.preemptRunning !== true;
16361
+ }
16362
+ function turnRepresentationEquivalent(left, right) {
16363
+ return bufferTurnsEqual(left, right) && left.extractionContextOnly === right.extractionContextOnly && left.importProvenance === right.importProvenance && left.parts === right.parts && left.rawContent === right.rawContent && left.sourceFormat === right.sourceFormat;
16364
+ }
16365
+ function scopeClassKey(turn) {
16366
+ return [
16367
+ turn.writeNamespaceOverride ?? "",
16368
+ turn.principalOverride ?? "",
16369
+ scopeProfilePlanIdentity(turn.scopeProfileWritePlan),
16370
+ turn.acceptedCapture === true ? "accepted" : "",
16371
+ turn.codingContext?.projectId ?? "",
16372
+ turn.codingContext?.rootPath ?? "",
16373
+ turn.codingContext?.branch ?? "",
16374
+ turn.codingContext?.defaultBranch ?? ""
16375
+ ].join("\0");
16376
+ }
16377
+ function chainNodes(chain) {
16378
+ const nodes = [];
16379
+ for (let node = chain; node; node = node.base) nodes.push(node);
16380
+ return [...nodes].reverse();
16381
+ }
16382
+ function chainPrefixEquivalent(chain, turns) {
16383
+ let offset = 0;
16384
+ for (const node of chainNodes(chain)) {
16385
+ for (const chained of node.tail) {
16386
+ const incoming = turns[offset];
16387
+ if (incoming === void 0) return false;
16388
+ if (!turnRepresentationEquivalent(chained, incoming)) return false;
16389
+ offset += 1;
16390
+ }
16391
+ }
16392
+ return offset === chain.total;
16393
+ }
16394
+ function materializeChain(chain) {
16395
+ const out = [];
16396
+ for (const node of chainNodes(chain)) {
16397
+ for (const turn of node.tail) out.push(turn);
16398
+ }
16399
+ return out;
16400
+ }
16401
+ var ExtractionSnapshotSharingRegistry = class {
16402
+ buckets = /* @__PURE__ */ new Map();
16403
+ /**
16404
+ * Admit one automatic snapshot for `bufferKey`: chain it onto the newest
16405
+ * queued same-scope snapshot when that is a verified prefix-extension,
16406
+ * otherwise start a fresh chain. The caller's array is never mutated.
16407
+ */
16408
+ admit(bufferKey, turns) {
16409
+ const scopeClass = turns.length > 0 ? scopeClassKey(turns[0]) : "";
16410
+ const bucketKey = `${bufferKey}\0${scopeClass}`;
16411
+ const list = this.buckets.get(bucketKey);
16412
+ const base = list !== void 0 && list.length > 0 ? list[list.length - 1] : void 0;
16413
+ if (base && base.total === turns.length && chainPrefixEquivalent(base, turns)) {
16414
+ base.holders += 1;
16415
+ return base;
16416
+ }
16417
+ const node = base && base.total <= turns.length && chainPrefixEquivalent(base, turns) ? {
16418
+ key: bufferKey,
16419
+ scopeClass,
16420
+ base,
16421
+ baseLength: base.total,
16422
+ tail: turns.slice(base.total),
16423
+ total: turns.length,
16424
+ holders: 1
16425
+ } : {
16426
+ key: bufferKey,
16427
+ scopeClass,
16428
+ base: void 0,
16429
+ baseLength: 0,
16430
+ tail: [...turns],
16431
+ total: turns.length,
16432
+ holders: 1
16433
+ };
16434
+ if (list) list.push(node);
16435
+ else this.buckets.set(bucketKey, [node]);
16436
+ return node;
16437
+ }
16438
+ /** Release one holder of a node when its task exits (or on enqueue
16439
+ * refusal). CONTRACT: called EXACTLY ONCE per admit, by the task that
16440
+ * admitted it — the registry has no task identity, so a second call by the
16441
+ * same task would steal another holder's count. The only production caller
16442
+ * (queueBufferedExtraction) enforces this structurally: the closure-finally
16443
+ * and the enqueue-refusal branch are mutually exclusive. Defensively, a
16444
+ * release past zero is a no-op. */
16445
+ release(node) {
16446
+ if (node.holders <= 0) return;
16447
+ node.holders -= 1;
16448
+ if (node.holders > 0) return;
16449
+ const list = this.buckets.get(`${node.key}\0${node.scopeClass}`);
16450
+ if (!list) return;
16451
+ const index = list.indexOf(node);
16452
+ if (index >= 0) list.splice(index, 1);
16453
+ if (list.length === 0) this.buckets.delete(`${node.key}\0${node.scopeClass}`);
16454
+ }
16455
+ /** Proof seam: what the queue retains right now. */
16456
+ stats() {
16457
+ const visited = /* @__PURE__ */ new Set();
16458
+ let queuedNodes = 0;
16459
+ let queuedTailRefs = 0;
16460
+ let queuedReachableDepth = 0;
16461
+ let queuedHolders = 0;
16462
+ let unsharedEquivalentRefs = 0;
16463
+ let queuedTotalRefs = 0;
16464
+ for (const list of this.buckets.values()) {
16465
+ for (const node of list) {
16466
+ queuedNodes += 1;
16467
+ unsharedEquivalentRefs += node.total * node.holders;
16468
+ queuedTotalRefs += node.total;
16469
+ let depth = 0;
16470
+ for (let walk = node; walk; walk = walk.base) {
16471
+ depth += 1;
16472
+ if (visited.has(walk)) continue;
16473
+ visited.add(walk);
16474
+ queuedTailRefs += walk.tail.length;
16475
+ queuedHolders += walk.holders;
16476
+ }
16477
+ if (depth > queuedReachableDepth) queuedReachableDepth = depth;
16478
+ }
16479
+ }
16480
+ return { queuedNodes, queuedTotalRefs, queuedTailRefs, queuedReachableDepth, queuedHolders, unsharedEquivalentRefs };
16481
+ }
16482
+ };
16483
+
16372
16484
  // src/orchestration/turn-ingestion.ts
16373
16485
  var ReplayAdmissionRefusedError = class extends Error {
16374
16486
  constructor(message) {
@@ -16382,13 +16494,15 @@ function isFlushPlanRecoveryTurn(turn) {
16382
16494
  return typeof provenance?.sourceId === "string" && /:flush-plan(:\d+\/\d+)?$/.test(provenance.sourceId);
16383
16495
  }
16384
16496
  var TurnIngestionCoordinator = class {
16385
- // chunked trigger-drain (extraction-drain.ts)
16386
16497
  constructor(deps) {
16387
16498
  this.deps = deps;
16388
16499
  this.drain = new ExtractionDrain(deps);
16389
16500
  }
16390
16501
  deps;
16391
16502
  drain;
16503
+ // chunked trigger-drain (extraction-drain.ts)
16504
+ /** Queued automatic-snapshot chains: bounded-queue retention via structural sharing. */
16505
+ snapshotSharing = new ExtractionSnapshotSharingRegistry();
16392
16506
  async processTurn(role, content, sessionKey, options = {}) {
16393
16507
  if (role !== "user" && role !== "assistant") {
16394
16508
  log.debug(`processTurn: ignoring unsupported role=${String(role)}`);
@@ -16870,6 +16984,8 @@ var TurnIngestionCoordinator = class {
16870
16984
  }
16871
16985
  if (settled) return;
16872
16986
  const preemptable = options.preemptable === true && options.preemptRunning !== true;
16987
+ const sharingNode = automaticSnapshotSharingEligible(options) && turnsToExtract.length > 0 ? this.snapshotSharing.admit(bufferKey, turnsToExtract) : void 0;
16988
+ const queuedTurnsSource = sharingNode ? { chain: sharingNode } : { direct: turnsToExtract };
16873
16989
  const accepted = this.deps.extractionQueueCoordinator.enqueue(async (preemptHandle) => {
16874
16990
  try {
16875
16991
  await this.deps.extractionQueueCoordinator.runPreemptable(preemptHandle, preemptable, options.abortSignal, async (abortSignal) => {
@@ -16881,7 +16997,7 @@ var TurnIngestionCoordinator = class {
16881
16997
  clearQueueWaitTimer();
16882
16998
  if (options.execution === void 0 && skipClaimedSession(this.deps.buffer, bufferKey, (result) => settleTask(void 0, result))) return;
16883
16999
  try {
16884
- let effectiveTurns = turnsToExtract;
17000
+ let effectiveTurns = "chain" in queuedTurnsSource ? materializeChain(queuedTurnsSource.chain) : queuedTurnsSource.direct;
16885
17001
  let effectiveScopePlan = options.scopeProfileWritePlan;
16886
17002
  const executionBuffer = options.execution?.buffer;
16887
17003
  if (effectiveTurns.some((turn) => turn.acceptedCapture === true)) {
@@ -16998,10 +17114,12 @@ var TurnIngestionCoordinator = class {
16998
17114
  }
16999
17115
  });
17000
17116
  } finally {
17117
+ if (sharingNode) this.snapshotSharing.release(sharingNode);
17001
17118
  options.onTaskExit?.();
17002
17119
  }
17003
17120
  }, { front: options.preemptRunning === true, key: bufferKey });
17004
17121
  if (!accepted) {
17122
+ if (sharingNode) this.snapshotSharing.release(sharingNode);
17005
17123
  settleTask(new Error("extraction queue is stopped"));
17006
17124
  options.onTaskExit?.();
17007
17125
  return;
@@ -32100,4 +32218,4 @@ export {
32100
32218
  qmdStartupCollectionChecksWithTimeout,
32101
32219
  Orchestrator
32102
32220
  };
32103
- //# sourceMappingURL=chunk-VYOAYFDV.js.map
32221
+ //# sourceMappingURL=chunk-I4W2ADBP.js.map