@remnic/core 10.0.95 → 10.0.96

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 (227) hide show
  1. package/dist/abstraction-nodes.d.ts.map +1 -1
  2. package/dist/abstraction-nodes.js +7 -1
  3. package/dist/access-admin-ops-surface.js +91 -90
  4. package/dist/access-audit.js +2 -2
  5. package/dist/access-cli.js +91 -90
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-extraction-force-flush.js +91 -90
  8. package/dist/access-http-briefing.js +91 -90
  9. package/dist/access-http-query.js +91 -90
  10. package/dist/access-http.js +91 -90
  11. package/dist/access-identity-continuity-surface.js +91 -90
  12. package/dist/access-lcm-surface.js +91 -90
  13. package/dist/access-mcp.js +91 -90
  14. package/dist/access-observe-write-surface.js +91 -90
  15. package/dist/access-operations-batch.js +91 -90
  16. package/dist/access-operations.js +91 -90
  17. package/dist/access-recall-concurrency.js +91 -90
  18. package/dist/access-recall-response.js +91 -90
  19. package/dist/access-recall-surface.js +91 -90
  20. package/dist/access-schema.d.ts +5 -5
  21. package/dist/access-service.js +91 -90
  22. package/dist/active-recall.js +16 -16
  23. package/dist/briefing.js +15 -15
  24. package/dist/buffer.js +7 -7
  25. package/dist/calibration.js +2 -2
  26. package/dist/{capsule-merge-6IDAYTKG.js → capsule-merge-ILR35DIB.js} +10 -10
  27. package/dist/causal-consolidation.js +16 -16
  28. package/dist/{chunk-QHARXWTC.js → chunk-2LCX6TAD.js} +2 -2
  29. package/dist/{chunk-UN4RVUG2.js → chunk-2R3ACFYN.js} +3 -3
  30. package/dist/{chunk-RQFXZYTF.js → chunk-33C4BK7I.js} +4 -4
  31. package/dist/{chunk-UBEKET2V.js → chunk-3R63SXC5.js} +4 -4
  32. package/dist/{chunk-LNGELD2M.js → chunk-3VWU3KF3.js} +2 -2
  33. package/dist/{chunk-FWRXW7CZ.js → chunk-4CXK3GT3.js} +29 -29
  34. package/dist/{chunk-DNY63QWJ.js → chunk-4HK7DYOL.js} +2 -2
  35. package/dist/{chunk-LLPMMMWG.js → chunk-4IJFJQPD.js} +2 -2
  36. package/dist/{chunk-GBJUTX44.js → chunk-4WKR4P7H.js} +2 -2
  37. package/dist/{chunk-ILY5SSOM.js → chunk-53ZVHXVZ.js} +6 -6
  38. package/dist/{chunk-FQAQ63QA.js → chunk-5AJIGWY4.js} +2 -2
  39. package/dist/{chunk-CIWMTNHW.js → chunk-5NFF2TSD.js} +2 -2
  40. package/dist/{chunk-D5XG2KPS.js → chunk-7E7J7QXB.js} +2 -2
  41. package/dist/{chunk-2WCLTWV2.js → chunk-7NVK6AGC.js} +2 -2
  42. package/dist/{chunk-PC5DRBGD.js → chunk-AP4BFWSW.js} +2 -2
  43. package/dist/{chunk-CL4JU3DF.js → chunk-B7L4ZYFY.js} +3 -3
  44. package/dist/{chunk-LQ5SS4OP.js → chunk-D6IGZYTN.js} +3 -3
  45. package/dist/{chunk-XJ2S5UBF.js → chunk-DWWX3FU3.js} +3 -3
  46. package/dist/{chunk-IL3RHBWM.js → chunk-EJ23D4JG.js} +3 -3
  47. package/dist/{chunk-F4QFU5IZ.js → chunk-EZ7XJJ5L.js} +2 -2
  48. package/dist/{chunk-FZZMLGWQ.js → chunk-F4BUSX3D.js} +2 -2
  49. package/dist/{chunk-LXATZLSC.js → chunk-FL3O34XF.js} +12 -5
  50. package/dist/chunk-FL3O34XF.js.map +1 -0
  51. package/dist/{chunk-DPPLNZ3A.js → chunk-FM4P7HSW.js} +4 -4
  52. package/dist/{chunk-QDESY76F.js → chunk-FQACH7MC.js} +2 -2
  53. package/dist/{chunk-XPXHQI6N.js → chunk-FVMEZ57K.js} +2 -2
  54. package/dist/{chunk-F2XNSIPP.js → chunk-G2CGIFRP.js} +10 -3
  55. package/dist/chunk-G2CGIFRP.js.map +1 -0
  56. package/dist/{chunk-ZDV5YWID.js → chunk-GLDIMGOS.js} +6 -6
  57. package/dist/{chunk-YIXJSW5M.js → chunk-HA5DASDG.js} +3 -3
  58. package/dist/{chunk-S3S72HRM.js → chunk-HCCRWSP7.js} +2 -2
  59. package/dist/{chunk-NMGHGTVR.js → chunk-HRMOKGQM.js} +6 -6
  60. package/dist/{chunk-OUVYYKYU.js → chunk-IBKGQ6EY.js} +2 -2
  61. package/dist/{chunk-RNG7S3FY.js → chunk-ICHLN5L6.js} +6 -6
  62. package/dist/chunk-ITAUMNQU.js +40 -0
  63. package/dist/chunk-ITAUMNQU.js.map +1 -0
  64. package/dist/{chunk-R23JWJD3.js → chunk-J426U7XK.js} +9 -9
  65. package/dist/{chunk-QMFAMOT2.js → chunk-JH5AV542.js} +2 -2
  66. package/dist/{chunk-WGGRZYSQ.js → chunk-KE3JWIZK.js} +8 -8
  67. package/dist/{chunk-SQ3GEIEL.js → chunk-KUQLUYIR.js} +5 -5
  68. package/dist/{chunk-RKABLU5M.js → chunk-KVHGCISP.js} +9 -9
  69. package/dist/{chunk-LS7PT3YD.js → chunk-LRLQ2PRP.js} +5 -5
  70. package/dist/{chunk-X5HGU2EM.js → chunk-NT772J7I.js} +2 -2
  71. package/dist/{chunk-BPK32FRM.js → chunk-NTDHSV7N.js} +61 -6
  72. package/dist/chunk-NTDHSV7N.js.map +1 -0
  73. package/dist/{chunk-4EZWSDFL.js → chunk-NX4XDDFQ.js} +3 -3
  74. package/dist/{chunk-IAYUTGF2.js → chunk-O3GZPLVY.js} +4 -4
  75. package/dist/{chunk-IGOW4TJE.js → chunk-O3JG4PD3.js} +2 -2
  76. package/dist/{chunk-UHMHJX5G.js → chunk-OIG4ZFMB.js} +4 -4
  77. package/dist/{chunk-IQ55QGY5.js → chunk-R4JYSBZE.js} +2 -2
  78. package/dist/{chunk-Z3FTSHT5.js → chunk-RUQE5C32.js} +2 -2
  79. package/dist/{chunk-ESLOLCD4.js → chunk-RUWKIPWJ.js} +2 -2
  80. package/dist/{chunk-W54Z2MOP.js → chunk-RXSGBO7Y.js} +2 -2
  81. package/dist/{chunk-DDATG2SF.js → chunk-TFMLRVMW.js} +127 -126
  82. package/dist/{chunk-DDATG2SF.js.map → chunk-TFMLRVMW.js.map} +1 -1
  83. package/dist/{chunk-BOK6BN5M.js → chunk-THV6PZ7V.js} +2 -2
  84. package/dist/{chunk-J7BIFOYP.js → chunk-U6TC6Z5B.js} +2 -2
  85. package/dist/{chunk-X2BVB74H.js → chunk-UZQXJDOE.js} +2 -2
  86. package/dist/{chunk-SUTEBYGI.js → chunk-V7T45MI6.js} +2 -2
  87. package/dist/{chunk-A4F7OIC5.js → chunk-WVIWDMFB.js} +2 -2
  88. package/dist/{chunk-BN2EBCLB.js → chunk-XPCUKWLE.js} +2 -2
  89. package/dist/{chunk-OJXK5C6Z.js → chunk-ZG4GNPRE.js} +7 -7
  90. package/dist/{chunk-TYRWSE4B.js → chunk-ZUMHQEW4.js} +2 -2
  91. package/dist/{chunk-DAOMWGO2.js → chunk-ZX5N5D6M.js} +4 -4
  92. package/dist/cli.js +91 -90
  93. package/dist/coding/export-okf-codegraph.js +14 -14
  94. package/dist/compounding/engine.js +16 -16
  95. package/dist/config.js +16 -16
  96. package/dist/connectors/codex-materialize-runner.js +15 -15
  97. package/dist/connectors/index.js +15 -15
  98. package/dist/consolidation-provenance-check.js +8 -8
  99. package/dist/consolidation-undo.js +6 -6
  100. package/dist/contradiction/index.js +6 -6
  101. package/dist/convergence-refresh.js +17 -17
  102. package/dist/corpus-watermark.js +17 -17
  103. package/dist/cue-anchors.d.ts.map +1 -1
  104. package/dist/cue-anchors.js +8 -2
  105. package/dist/{entity-canonical-id-migration-JJSTZF73.js → entity-canonical-id-migration-IG77BOGD.js} +5 -5
  106. package/dist/entity-mention-index-cache.js +2 -2
  107. package/dist/entity-retrieval.js +16 -16
  108. package/dist/explicit-capture.js +91 -90
  109. package/dist/extraction.js +21 -21
  110. package/dist/harmonic-construction.js +9 -3
  111. package/dist/harmonic-graph-version.d.ts +14 -0
  112. package/dist/harmonic-graph-version.d.ts.map +1 -0
  113. package/dist/harmonic-graph-version.js +17 -0
  114. package/dist/harmonic-retrieval.d.ts +19 -14
  115. package/dist/harmonic-retrieval.d.ts.map +1 -1
  116. package/dist/harmonic-retrieval.js +22 -17
  117. package/dist/index.js +105 -104
  118. package/dist/lcm/engine.js +3 -3
  119. package/dist/lcm/index.js +8 -8
  120. package/dist/local-llm.js +2 -2
  121. package/dist/location/index.js +16 -16
  122. package/dist/maintenance/memory-governance.js +15 -15
  123. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +15 -15
  124. package/dist/maintenance/rebuild-memory-projection-runner.js +17 -17
  125. package/dist/maintenance/rebuild-memory-projection.js +16 -16
  126. package/dist/memory-browse.js +7 -7
  127. package/dist/namespaces/migrate.js +16 -16
  128. package/dist/namespaces/search.js +6 -6
  129. package/dist/namespaces/storage.js +15 -15
  130. package/dist/operator-doctor-corpus.js +18 -18
  131. package/dist/operator-toolkit.js +24 -24
  132. package/dist/orchestration/backlog-scheduler.js +92 -91
  133. package/dist/orchestration/backlog-scheduler.js.map +1 -1
  134. package/dist/orchestration/buffer-drain-runner.js +92 -91
  135. package/dist/orchestration/maintenance.js +25 -25
  136. package/dist/orchestrator.js +93 -92
  137. package/dist/page-versioning.js +6 -6
  138. package/dist/qmd.js +4 -4
  139. package/dist/recall-navigation.js +91 -90
  140. package/dist/recall-state-view-admission.js +7 -7
  141. package/dist/recall-why-service.js +7 -7
  142. package/dist/{resolution-OVVIF7ZY.js → resolution-G4SLHSEU.js} +7 -7
  143. package/dist/resolution-G4SLHSEU.js.map +1 -0
  144. package/dist/resume-bundles.js +17 -17
  145. package/dist/schemas.d.ts +9 -9
  146. package/dist/search/factory.js +5 -5
  147. package/dist/search/index.js +5 -5
  148. package/dist/semantic-consolidation.js +16 -16
  149. package/dist/semantic-rule-promotion.js +15 -15
  150. package/dist/semantic-rule-verifier.js +15 -15
  151. package/dist/source-agent-qualifier.js +18 -18
  152. package/dist/standup/build.js +15 -15
  153. package/dist/storage.js +14 -14
  154. package/dist/summarizer.js +3 -3
  155. package/dist/support-passport/index.js +3 -3
  156. package/dist/transfer/capsule-import.js +8 -8
  157. package/dist/transfer/export-okf.js +15 -15
  158. package/dist/verified-recall.js +15 -15
  159. package/dist/who-knows-cli.js +16 -16
  160. package/dist/who-knows.js +15 -15
  161. package/package.json +2 -2
  162. package/src/abstraction-nodes.ts +7 -2
  163. package/src/cue-anchors.ts +8 -3
  164. package/src/harmonic-graph-cache.test.ts +244 -0
  165. package/src/harmonic-graph-version.ts +46 -0
  166. package/src/harmonic-retrieval.ts +92 -2
  167. package/src/orchestration/recall-internal.ts +1 -1
  168. package/dist/chunk-BPK32FRM.js.map +0 -1
  169. package/dist/chunk-F2XNSIPP.js.map +0 -1
  170. package/dist/chunk-LXATZLSC.js.map +0 -1
  171. /package/dist/{capsule-merge-6IDAYTKG.js.map → capsule-merge-ILR35DIB.js.map} +0 -0
  172. /package/dist/{chunk-QHARXWTC.js.map → chunk-2LCX6TAD.js.map} +0 -0
  173. /package/dist/{chunk-UN4RVUG2.js.map → chunk-2R3ACFYN.js.map} +0 -0
  174. /package/dist/{chunk-RQFXZYTF.js.map → chunk-33C4BK7I.js.map} +0 -0
  175. /package/dist/{chunk-UBEKET2V.js.map → chunk-3R63SXC5.js.map} +0 -0
  176. /package/dist/{chunk-LNGELD2M.js.map → chunk-3VWU3KF3.js.map} +0 -0
  177. /package/dist/{chunk-FWRXW7CZ.js.map → chunk-4CXK3GT3.js.map} +0 -0
  178. /package/dist/{chunk-DNY63QWJ.js.map → chunk-4HK7DYOL.js.map} +0 -0
  179. /package/dist/{chunk-LLPMMMWG.js.map → chunk-4IJFJQPD.js.map} +0 -0
  180. /package/dist/{chunk-GBJUTX44.js.map → chunk-4WKR4P7H.js.map} +0 -0
  181. /package/dist/{chunk-ILY5SSOM.js.map → chunk-53ZVHXVZ.js.map} +0 -0
  182. /package/dist/{chunk-FQAQ63QA.js.map → chunk-5AJIGWY4.js.map} +0 -0
  183. /package/dist/{chunk-CIWMTNHW.js.map → chunk-5NFF2TSD.js.map} +0 -0
  184. /package/dist/{chunk-D5XG2KPS.js.map → chunk-7E7J7QXB.js.map} +0 -0
  185. /package/dist/{chunk-2WCLTWV2.js.map → chunk-7NVK6AGC.js.map} +0 -0
  186. /package/dist/{chunk-PC5DRBGD.js.map → chunk-AP4BFWSW.js.map} +0 -0
  187. /package/dist/{chunk-CL4JU3DF.js.map → chunk-B7L4ZYFY.js.map} +0 -0
  188. /package/dist/{chunk-LQ5SS4OP.js.map → chunk-D6IGZYTN.js.map} +0 -0
  189. /package/dist/{chunk-XJ2S5UBF.js.map → chunk-DWWX3FU3.js.map} +0 -0
  190. /package/dist/{chunk-IL3RHBWM.js.map → chunk-EJ23D4JG.js.map} +0 -0
  191. /package/dist/{chunk-F4QFU5IZ.js.map → chunk-EZ7XJJ5L.js.map} +0 -0
  192. /package/dist/{chunk-FZZMLGWQ.js.map → chunk-F4BUSX3D.js.map} +0 -0
  193. /package/dist/{chunk-DPPLNZ3A.js.map → chunk-FM4P7HSW.js.map} +0 -0
  194. /package/dist/{chunk-QDESY76F.js.map → chunk-FQACH7MC.js.map} +0 -0
  195. /package/dist/{chunk-XPXHQI6N.js.map → chunk-FVMEZ57K.js.map} +0 -0
  196. /package/dist/{chunk-ZDV5YWID.js.map → chunk-GLDIMGOS.js.map} +0 -0
  197. /package/dist/{chunk-YIXJSW5M.js.map → chunk-HA5DASDG.js.map} +0 -0
  198. /package/dist/{chunk-S3S72HRM.js.map → chunk-HCCRWSP7.js.map} +0 -0
  199. /package/dist/{chunk-NMGHGTVR.js.map → chunk-HRMOKGQM.js.map} +0 -0
  200. /package/dist/{chunk-OUVYYKYU.js.map → chunk-IBKGQ6EY.js.map} +0 -0
  201. /package/dist/{chunk-RNG7S3FY.js.map → chunk-ICHLN5L6.js.map} +0 -0
  202. /package/dist/{chunk-R23JWJD3.js.map → chunk-J426U7XK.js.map} +0 -0
  203. /package/dist/{chunk-QMFAMOT2.js.map → chunk-JH5AV542.js.map} +0 -0
  204. /package/dist/{chunk-WGGRZYSQ.js.map → chunk-KE3JWIZK.js.map} +0 -0
  205. /package/dist/{chunk-SQ3GEIEL.js.map → chunk-KUQLUYIR.js.map} +0 -0
  206. /package/dist/{chunk-RKABLU5M.js.map → chunk-KVHGCISP.js.map} +0 -0
  207. /package/dist/{chunk-LS7PT3YD.js.map → chunk-LRLQ2PRP.js.map} +0 -0
  208. /package/dist/{chunk-X5HGU2EM.js.map → chunk-NT772J7I.js.map} +0 -0
  209. /package/dist/{chunk-4EZWSDFL.js.map → chunk-NX4XDDFQ.js.map} +0 -0
  210. /package/dist/{chunk-IAYUTGF2.js.map → chunk-O3GZPLVY.js.map} +0 -0
  211. /package/dist/{chunk-IGOW4TJE.js.map → chunk-O3JG4PD3.js.map} +0 -0
  212. /package/dist/{chunk-UHMHJX5G.js.map → chunk-OIG4ZFMB.js.map} +0 -0
  213. /package/dist/{chunk-IQ55QGY5.js.map → chunk-R4JYSBZE.js.map} +0 -0
  214. /package/dist/{chunk-Z3FTSHT5.js.map → chunk-RUQE5C32.js.map} +0 -0
  215. /package/dist/{chunk-ESLOLCD4.js.map → chunk-RUWKIPWJ.js.map} +0 -0
  216. /package/dist/{chunk-W54Z2MOP.js.map → chunk-RXSGBO7Y.js.map} +0 -0
  217. /package/dist/{chunk-BOK6BN5M.js.map → chunk-THV6PZ7V.js.map} +0 -0
  218. /package/dist/{chunk-J7BIFOYP.js.map → chunk-U6TC6Z5B.js.map} +0 -0
  219. /package/dist/{chunk-X2BVB74H.js.map → chunk-UZQXJDOE.js.map} +0 -0
  220. /package/dist/{chunk-SUTEBYGI.js.map → chunk-V7T45MI6.js.map} +0 -0
  221. /package/dist/{chunk-A4F7OIC5.js.map → chunk-WVIWDMFB.js.map} +0 -0
  222. /package/dist/{chunk-BN2EBCLB.js.map → chunk-XPCUKWLE.js.map} +0 -0
  223. /package/dist/{chunk-OJXK5C6Z.js.map → chunk-ZG4GNPRE.js.map} +0 -0
  224. /package/dist/{chunk-TYRWSE4B.js.map → chunk-ZUMHQEW4.js.map} +0 -0
  225. /package/dist/{chunk-DAOMWGO2.js.map → chunk-ZX5N5D6M.js.map} +0 -0
  226. /package/dist/{entity-canonical-id-migration-JJSTZF73.js.map → entity-canonical-id-migration-IG77BOGD.js.map} +0 -0
  227. /package/dist/{resolution-OVVIF7ZY.js.map → harmonic-graph-version.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/orchestration/backlog-scheduler.ts"],"sourcesContent":["/**\n * Daemon-owned extraction backlog scheduler.\n *\n * ONE bounded in-process loop that owns ALL persisted extraction backlog:\n * at startup (existing drain claims + buffered sessions), on every poll tick\n * (new persisted work), and by retrying keys that are still pending — with\n * bounded memory (per-key COUNTS only; candidate scans never retain turn\n * payloads) and bounded outstanding work (the extraction queue's own\n * maxConcurrency gates submissions, so live foreground work keeps its share\n * of the queue).\n *\n * Claim authority: an existing claim — including an EMPTY ack tombstone — is\n * authoritative over the live buffer's in-memory copy. A tombstoned key is\n * never re-claimed or counted as work; new ingress consumes the tombstone\n * through the native save handover, which is what makes the key a candidate\n * again. Claim creation is fenced: the key is reserved synchronously on the\n * extraction queue BEFORE the async claim decision, so a queued live task for\n * the same key cannot start past the claimed-session gate until the decision\n * settles; live capture continues via the native merge-into-claim protocol.\n *\n * Failed, deferred, or policy-denied outcomes keep their turns durable in the\n * claim and re-submit after backoff (exponential from `retryBaseMs` to\n * `retryMaxMs`, reset by progress; denials wait the full max) — never a busy\n * retry. `stop()` aborts in-flight drains at their chunk boundary and leaves\n * every claim retryable; a restarted daemon's scheduler adopts them.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { hostname } from \"node:os\";\nimport { log } from \"../logger.js\";\nimport type { Orchestrator } from \"../orchestrator.js\";\nimport type { BufferDrainClaims, DrainLease } from \"../storage/buffer-drain-claims.js\";\nimport { BufferDrainRunner } from \"./buffer-drain-runner.js\";\nimport type { DrainRunnerEvent, DrainSessionOutcome } from \"./buffer-drain-runner.js\";\nimport type { ExtractionQueueCoordinator } from \"./extraction-queue-coordinator.js\";\nimport type { ProviderBreakerSnapshot } from \"./provider-breaker.js\";\n\n/** What the scheduler needs from its host (structurally satisfied by the\n * orchestrator wiring); injectable so tests drive ticks deterministically. */\nexport interface BacklogSchedulerDeps {\n queue: Pick<ExtractionQueueCoordinator, \"tryReserveKey\" | \"releaseKeyReservation\" | \"maxConcurrency\">;\n claims: Pick<BufferDrainClaims, \"list\" | \"listPage\" | \"claimFromSessionFile\" | \"isClaimed\">;\n /** Live per-key pending counts (counts only — never turn payloads). May be\n * async: hosts with a lazily-loaded buffer load it here (idempotent). */\n liveBufferCounts():\n | Map<string, { turns: number; retainedTurns: number }>\n | Promise<Map<string, { turns: number; retainedTurns: number }>>;\n /** Create a fresh lease for a unique owner token. */\n lease(ownerId: string): DrainLease;\n /** Drain one key to quiescence (BufferDrainRunner.drainSession). */\n drainKey(\n key: string,\n options: { ownerId: string; signal: AbortSignal; onEvent?: (event: DrainRunnerEvent) => void }\n ): Promise<DrainSessionOutcome>;\n /** Shared provider circuit-breaker snapshot (the same instance the run\n * coordinator gates attempts on). While OPEN inside its cooldown window\n * the scheduler skips submission entirely — claims stay durable, and the\n * breaker's single half-open probe (one attempt through once the window\n * lapses) keeps recovery automatic. Optional: hosts without a breaker\n * never skip. */\n breakerSnapshot?(): ProviderBreakerSnapshot;\n /** Test seam: monotonic-ish clock for backoff windows. */\n now?(): number;\n}\n\nexport interface BacklogSchedulerOptions {\n /** Optional label prefix; each scheduler instance adds a unique token. */\n ownerId?: string;\n /** Scan cadence in ms (startup + new-work + retry checks). */\n pollMs?: number;\n retryBaseMs?: number;\n retryMaxMs?: number;\n now?: () => number;\n}\n\nexport interface BacklogSchedulerCounters {\n /** Keys submitted to the drain (claimed or adopted) this process lifetime. */\n claimed: number;\n /** Outcomes with genuinely empty claims (durable outputs preceded ack). */\n processed: number;\n /** Sum of durable outputs (memories + entities) across processed drains. */\n durableOutputs: number;\n /** Re-submissions after a failed/deferred/denied outcome. */\n retried: number;\n denied: { keys: number; turns: number };\n failed: number;\n}\n\nexport type BacklogKeyState = \"inflight\" | \"backoff\" | \"denied\";\n\nexport interface BacklogKeySnapshot {\n key: string;\n state: BacklogKeyState;\n turnsRemaining?: number;\n reason?: string;\n}\n\nexport interface BacklogSchedulerSnapshot {\n counters: BacklogSchedulerCounters;\n inFlight: string[];\n reservedKeys: string[];\n keys: BacklogKeySnapshot[];\n}\n\ninterface KeyState {\n state: BacklogKeyState;\n nextAttemptMs: number;\n /** Last observed remaining turns; progress resets the backoff exponent. */\n turnsRemaining: number;\n reason?: string;\n backoffExponent: number;\n}\n\nconst DEFAULT_POLL_MS = 15_000;\nconst DEFAULT_RETRY_BASE_MS = 30_000;\nconst DEFAULT_RETRY_MAX_MS = 15 * 60_000;\n\nexport class BacklogScheduler {\n private readonly deps: BacklogSchedulerDeps;\n private readonly options: Required<Omit<BacklogSchedulerOptions, \"now\">> & Pick<BacklogSchedulerOptions, \"now\">;\n private readonly keys = new Map<string, KeyState>();\n private readonly inFlight = new Map<string, { controller: AbortController; settled: Promise<void> }>();\n private readonly reserved = new Set<string>();\n private readonly counters: BacklogSchedulerCounters = {\n claimed: 0,\n processed: 0,\n durableOutputs: 0,\n retried: 0,\n denied: { keys: 0, turns: 0 },\n failed: 0,\n };\n private claimCursor: string | undefined;\n private timer: ReturnType<typeof setInterval> | undefined;\n private ticking = false;\n private stopped = true;\n\n constructor(deps: BacklogSchedulerDeps, options: BacklogSchedulerOptions = {}) {\n this.deps = deps;\n this.options = {\n ownerId: `${options.ownerId ?? \"daemon-drain\"}-${randomUUID()}`,\n pollMs: options.pollMs ?? DEFAULT_POLL_MS,\n retryBaseMs: options.retryBaseMs ?? DEFAULT_RETRY_BASE_MS,\n retryMaxMs: options.retryMaxMs ?? DEFAULT_RETRY_MAX_MS,\n now: options.now,\n };\n }\n\n /** Idempotent. Starts the poll timer (unref'd) and runs an initial tick. */\n start(): void {\n if (!this.stopped) return;\n this.stopped = false;\n this.timer = setInterval(() => void this.tick(), this.options.pollMs);\n this.timer.unref?.();\n void this.tick();\n }\n\n /** Idempotent. Stops the timer, aborts in-flight drains (their claims stay\n * retryable) and waits for them to settle. */\n async stop(): Promise<void> {\n if (this.stopped) return;\n this.stopped = true;\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n const aborts: Promise<void>[] = [];\n for (const entry of this.inFlight.values()) {\n entry.controller.abort(new Error(\"backlog scheduler stopping\"));\n aborts.push(entry.settled);\n }\n await Promise.allSettled(aborts);\n }\n\n /** Bounded snapshot for ops/watchers: counters + per-key states + live sets. */\n snapshot(): BacklogSchedulerSnapshot {\n return {\n counters: {\n claimed: this.counters.claimed,\n processed: this.counters.processed,\n durableOutputs: this.counters.durableOutputs,\n retried: this.counters.retried,\n denied: { ...this.counters.denied },\n failed: this.counters.failed,\n },\n inFlight: [...this.inFlight.keys()],\n reservedKeys: [...this.reserved],\n keys: [...this.keys.entries()].map(([key, state]) => ({\n key,\n state: state.state,\n turnsRemaining: state.turnsRemaining,\n reason: state.reason,\n })),\n };\n }\n\n /** One scan+submit pass (tests drive this instead of the timer). Waits out\n * any in-progress tick first so the pass always actually scans. */\n async tickForTest(): Promise<void> {\n // setImmediate: yields to the event loop so pending I/O (a slow first\n // scan) can finish; a microtask spin would starve it.\n while (this.ticking) await new Promise((resolve) => setImmediate(resolve));\n await this.tick();\n }\n\n /** Await the settle (slot release) of everything currently in flight,\n * optionally excluding one still-gated key (tests). */\n async settleForTest(exclude?: string): Promise<void> {\n for (;;) {\n const pending = [...this.inFlight.entries()].filter(([key]) => key !== exclude).map(([, entry]) => entry.settled);\n if (pending.length === 0) return;\n await Promise.allSettled(pending);\n }\n }\n\n private now(): number {\n return this.options.now?.() ?? Date.now();\n }\n\n private async tick(): Promise<void> {\n if (this.ticking || this.stopped) return;\n this.ticking = true;\n const cursorBeforeTick = this.claimCursor;\n try {\n // Fast bail: a breaker already open must not pay discovery I/O\n // (listPage reads and parses claim bodies on every poll). The\n // submitCandidates guard below still catches a breaker that opens\n // while discovery awaits.\n const breakerBeforeDiscovery = this.deps.breakerSnapshot?.();\n if (\n breakerBeforeDiscovery &&\n breakerBeforeDiscovery.state === \"open\" &&\n this.now() < breakerBeforeDiscovery.openUntilMs\n ) {\n return;\n }\n // stop() may land while discovery's I/O is pending: re-check before\n // submitting anything, and again per candidate.\n // A discovery failure (EACCES/EIO on the claims dir) must not reject\n // into a detached timer callback: it would be an unhandled rejection\n // that terminates the server. Log, skip this pass, retry next poll.\n let candidates: { key: string; needsClaim: boolean }[];\n try {\n candidates = await this.discoverCandidates();\n } catch (err) {\n // Discovery may have listed a page before it failed: the page cursor\n // already moved, so restore it — otherwise those claims wait for the\n // cursor to wrap instead of the next poll.\n this.claimCursor = cursorBeforeTick;\n log.warn(\n `backlog drain: discovery failed; retrying next poll: ${err instanceof Error ? err.message : String(err)}`\n );\n return;\n }\n if (this.stopped) return;\n const dropped = this.submitCandidates(candidates);\n // The concurrency bound stopped submission mid-page: rewind the page\n // cursor so the unsubmitted claims are re-listed on the next tick\n // (already-submitted ones are gated by inFlight and key backoff).\n if (dropped) this.claimCursor = cursorBeforeTick;\n } finally {\n this.ticking = false;\n }\n }\n\n /** Bounded discovery: ONE page of existing claims with pending turns */\n private async discoverCandidates(): Promise<{ key: string; needsClaim: boolean }[]> {\n const out: { key: string; needsClaim: boolean }[] = [];\n const seen = new Set<string>();\n const pageLimit = Math.max(this.submissionLimit() * 4, 16);\n const page = await this.deps.claims.listPage(this.claimCursor, pageLimit);\n for (const listed of page.entries) {\n seen.add(listed.key);\n out.push({ key: listed.key, needsClaim: false });\n }\n this.claimCursor = page.nextCursor;\n for (const [key, counts] of await this.deps.liveBufferCounts()) {\n if (counts.turns + counts.retainedTurns <= 0) continue;\n if (seen.has(key) || this.deps.claims.isClaimed(key)) continue;\n seen.add(key);\n out.push({ key, needsClaim: true });\n }\n return out;\n }\n\n /** Submission bound: the queue's own concurrency limit, read with the\n * documented \"0 disables\" contract — a zero limit submits nothing. */\n private submissionLimit(): number {\n if (this.deps.queue.maxConcurrency <= 0) return 0;\n return this.deps.queue.maxConcurrency;\n }\n\n /** Submit discovery candidates within the queue's concurrency bound. */\n private submitCandidates(candidates: { key: string; needsClaim: boolean }[]): boolean {\n // Breaker-open churn guard: a full attempt reads the claim, rebuilds the\n // buffer/coordinator and re-renders chunks before the breaker fails it\n // fast — pure heap pressure per poll during a provider stall. Skip while\n // the window is open; once it lapses, submissions resume and the\n // breaker's half-open probe runs as usual.\n const breaker = this.deps.breakerSnapshot?.();\n if (breaker && breaker.state === \"open\" && this.now() < breaker.openUntilMs) {\n return true;\n }\n let dropped = false;\n for (const candidate of candidates) {\n if (this.stopped || this.inFlight.size >= this.submissionLimit()) {\n dropped = true;\n break;\n }\n if (!this.candidateEligible(candidate)) continue;\n // Fence the claim decision: reserve the key synchronously BEFORE the\n // async rename so no queued task for it can pass the claimed gate in\n // the meantime. Release happens when the decision settles.\n if (candidate.needsClaim) {\n if (!this.deps.queue.tryReserveKey(candidate.key)) continue;\n this.reserved.add(candidate.key);\n }\n void this.submit(candidate.key, candidate.needsClaim);\n }\n return dropped;\n }\n\n /** inFlight is the authority for \"already submitted\" — key state only\n * exists once an outcome landed (backoff/denied gating below). */\n private candidateEligible(candidate: { key: string; needsClaim: boolean }): boolean {\n if (this.stopped || this.inFlight.size >= this.submissionLimit()) return false;\n if (this.inFlight.has(candidate.key)) return false;\n const state = this.keys.get(candidate.key);\n return !(state && this.now() < state.nextAttemptMs);\n }\n\n /** Claim (when needed), then drain one key; the reservation spans the async\n * claim decision, the queue entry carries the key afterwards. */\n private async submit(key: string, needsClaim: boolean): Promise<void> {\n const controller = new AbortController();\n const { promise: settled, resolve: settle } = Promise.withResolvers<void>();\n this.inFlight.set(key, { controller, settled });\n try {\n if (!(await this.claimForSubmit(key, needsClaim, this.options.ownerId))) return;\n // Stopped between the claim decision and the task: leave the claim\n // with its lease (it expires; the next start adopts) — never drain.\n if (this.stopped) return;\n await this.drainClaimedKey(key, controller.signal, this.options.ownerId);\n } catch (err) {\n // Claim/drain failures are scheduler-level: the claim content is\n // untouched — count failed and back off (never an unhandled rejection\n // in the detached submission).\n this.counters.failed += 1;\n const message = err instanceof Error ? err.message : String(err);\n // SAFETY: a thrown non-Error (incl. null) carries no retry hint; the\n // optional chain reads the hint off Error throws only.\n this.setBackoff(key, (err as { turnsRemaining?: number } | null | undefined)?.turnsRemaining ?? 0, message);\n log.warn(`backlog drain: ${key} submission failed: ${message}`);\n } finally {\n this.inFlight.delete(key);\n this.reserved.delete(key);\n this.deps.queue.releaseKeyReservation(key);\n settle();\n }\n }\n\n /** after all — the key goes quiet without a task. \"claimed\": ours. */\n private async claimForSubmit(key: string, needsClaim: boolean, ownerId: string): Promise<boolean> {\n if (!needsClaim) return true;\n try {\n const outcome = await this.deps.claims.claimFromSessionFile(key, this.deps.lease(ownerId));\n if (outcome === \"empty\") {\n this.keys.delete(key);\n return false;\n }\n return true;\n } finally {\n this.reserved.delete(key);\n this.deps.queue.releaseKeyReservation(key);\n }\n }\n\n /** Drain one claimed key. drainKey reports failures as outcomes; a thrown\n * error still means the claim content is intact — count it failed and\n * back off. */\n private async drainClaimedKey(key: string, signal: AbortSignal, ownerId: string): Promise<void> {\n this.counters.claimed += 1;\n try {\n const outcome = await this.deps.drainKey(key, {\n ownerId,\n signal,\n });\n this.applyOutcome(key, outcome);\n } catch (err) {\n this.counters.failed += 1;\n const message = err instanceof Error ? err.message : String(err);\n // SAFETY: a thrown non-Error (incl. null) carries no retry hint; the\n // optional chain reads the hint off Error throws only.\n this.setBackoff(key, (err as { turnsRemaining?: number } | null | undefined)?.turnsRemaining ?? 0, message);\n log.warn(`backlog drain: ${key} threw: ${message}`);\n }\n }\n\n private applyOutcome(key: string, outcome: DrainSessionOutcome): void {\n const deniedTurns = outcome.denied?.reduce((sum, entry) => sum + entry.turns, 0) ?? 0;\n const previous = this.keys.get(key);\n const progressed = outcome.turnsRemaining < (previous?.turnsRemaining ?? Number.POSITIVE_INFINITY);\n if (outcome.status === \"drained\") {\n // The claim is now an empty tombstone: authoritative, nothing pending.\n // New ingress consumes it via the native save path and re-candidates.\n this.keys.delete(key);\n this.counters.processed += 1;\n this.counters.durableOutputs += outcome.durableOutputCount;\n log.info(\n `backlog drain: ${key} drained (${outcome.turnsAtStart} turn(s), ${outcome.durableOutputCount} durable output(s))`\n );\n return;\n }\n this.recordNonDrainedCounters(previous, outcome, deniedTurns);\n const denied = deniedTurns > 0 && outcome.turnsRemaining > 0;\n this.keys.set(key, this.nextKeyState(previous, outcome, denied, progressed));\n log.info(\n `backlog drain: ${key} ${outcome.status} (${outcome.turnsRemaining} turn(s) remaining` +\n `${denied ? `, denied: ${deniedTurns}` : \"\"}${outcome.reason ? `, ${outcome.reason}` : \"\"})`\n );\n }\n\n /** Denied backlog counters for a non-drained outcome. */\n private recordNonDrainedCounters(\n previous: KeyState | undefined,\n outcome: DrainSessionOutcome,\n deniedTurns: number\n ): void {\n if (deniedTurns > 0) {\n this.counters.denied.keys += 1;\n this.counters.denied.turns += deniedTurns;\n }\n if (outcome.status === \"failed\") this.counters.failed += 1;\n else if (previous !== undefined && (previous.state === \"backoff\" || previous.state === \"denied\"))\n this.counters.retried += 1;\n }\n\n /** The post-drain key state: denial waits the full max window (its content\n * is valid but currently unauthorized); progress resets the exponent. */\n private nextKeyState(\n previous: KeyState | undefined,\n outcome: DrainSessionOutcome,\n denied: boolean,\n progressed: boolean\n ): KeyState {\n return {\n state: denied ? \"denied\" : \"backoff\",\n nextAttemptMs: this.now() + this.backoffMs(previous, progressed && !denied),\n turnsRemaining: outcome.turnsRemaining,\n reason: outcome.reason,\n backoffExponent: this.nextBackoffExponent(denied, progressed, previous),\n };\n }\n\n private nextBackoffExponent(denied: boolean, progressed: boolean, previous: KeyState | undefined): number {\n return denied || !progressed ? (previous?.backoffExponent ?? 0) + 1 : 0;\n }\n\n private backoffMs(previous: KeyState | undefined, progressed: boolean): number {\n if (previous?.state === \"denied\") return this.options.retryMaxMs;\n const exponent = progressed ? 0 : (previous?.backoffExponent ?? 0) + 1;\n return Math.min(this.options.retryBaseMs * 2 ** exponent, this.options.retryMaxMs);\n }\n\n private setBackoff(key: string, turnsRemaining: number, reason: string): void {\n const previous = this.keys.get(key);\n this.keys.set(key, {\n state: \"backoff\",\n nextAttemptMs: this.now() + this.backoffMs(previous, false),\n turnsRemaining,\n reason,\n backoffExponent: (previous?.backoffExponent ?? 0) + 1,\n });\n }\n}\n\n/** Lease lifetime for claims the scheduler takes (matches the runner default). */\nconst SCHEDULER_LEASE_MS = 120_000;\n\n/** Wire the scheduler to an orchestrator's own queue, claim store, live buffer\n * counts and drain runner — the daemon's single ownership point. */\nexport function wireBacklogScheduler(\n orchestrator: Orchestrator,\n options: BacklogSchedulerOptions = {}\n): BacklogScheduler {\n const runner = new BufferDrainRunner(orchestrator);\n return new BacklogScheduler(\n {\n queue: orchestrator.extractionQueueCoordinator,\n claims: orchestrator.storage.bufferDrainClaims(),\n liveBufferCounts: async () => {\n // The daemon's buffer may be lazy: ensure the persisted state is in\n // memory before counting (load is guarded/idempotent).\n await orchestrator.buffer.load();\n return orchestrator.buffer.entryCounts();\n },\n lease: (ownerId) => {\n const now = new Date().toISOString();\n return {\n ownerId,\n pid: process.pid,\n host: hostname(),\n acquiredAt: now,\n heartbeatAt: now,\n leaseMs: SCHEDULER_LEASE_MS,\n };\n },\n drainKey: (key, drainOptions) => runner.drainSession(key, drainOptions),\n // The orchestrator's one shared provider breaker (foreground and every\n // claim-backed drain accumulate toward the same threshold).\n breakerSnapshot: () => orchestrator.getExtractionResilienceStatus().breaker,\n },\n options\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/orchestration/backlog-scheduler.ts"],"sourcesContent":["/**\n * Daemon-owned extraction backlog scheduler.\n *\n * ONE bounded in-process loop that owns ALL persisted extraction backlog:\n * at startup (existing drain claims + buffered sessions), on every poll tick\n * (new persisted work), and by retrying keys that are still pending — with\n * bounded memory (per-key COUNTS only; candidate scans never retain turn\n * payloads) and bounded outstanding work (the extraction queue's own\n * maxConcurrency gates submissions, so live foreground work keeps its share\n * of the queue).\n *\n * Claim authority: an existing claim — including an EMPTY ack tombstone — is\n * authoritative over the live buffer's in-memory copy. A tombstoned key is\n * never re-claimed or counted as work; new ingress consumes the tombstone\n * through the native save handover, which is what makes the key a candidate\n * again. Claim creation is fenced: the key is reserved synchronously on the\n * extraction queue BEFORE the async claim decision, so a queued live task for\n * the same key cannot start past the claimed-session gate until the decision\n * settles; live capture continues via the native merge-into-claim protocol.\n *\n * Failed, deferred, or policy-denied outcomes keep their turns durable in the\n * claim and re-submit after backoff (exponential from `retryBaseMs` to\n * `retryMaxMs`, reset by progress; denials wait the full max) — never a busy\n * retry. `stop()` aborts in-flight drains at their chunk boundary and leaves\n * every claim retryable; a restarted daemon's scheduler adopts them.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { hostname } from \"node:os\";\nimport { log } from \"../logger.js\";\nimport type { Orchestrator } from \"../orchestrator.js\";\nimport type { BufferDrainClaims, DrainLease } from \"../storage/buffer-drain-claims.js\";\nimport { BufferDrainRunner } from \"./buffer-drain-runner.js\";\nimport type { DrainRunnerEvent, DrainSessionOutcome } from \"./buffer-drain-runner.js\";\nimport type { ExtractionQueueCoordinator } from \"./extraction-queue-coordinator.js\";\nimport type { ProviderBreakerSnapshot } from \"./provider-breaker.js\";\n\n/** What the scheduler needs from its host (structurally satisfied by the\n * orchestrator wiring); injectable so tests drive ticks deterministically. */\nexport interface BacklogSchedulerDeps {\n queue: Pick<ExtractionQueueCoordinator, \"tryReserveKey\" | \"releaseKeyReservation\" | \"maxConcurrency\">;\n claims: Pick<BufferDrainClaims, \"list\" | \"listPage\" | \"claimFromSessionFile\" | \"isClaimed\">;\n /** Live per-key pending counts (counts only — never turn payloads). May be\n * async: hosts with a lazily-loaded buffer load it here (idempotent). */\n liveBufferCounts():\n | Map<string, { turns: number; retainedTurns: number }>\n | Promise<Map<string, { turns: number; retainedTurns: number }>>;\n /** Create a fresh lease for a unique owner token. */\n lease(ownerId: string): DrainLease;\n /** Drain one key to quiescence (BufferDrainRunner.drainSession). */\n drainKey(\n key: string,\n options: { ownerId: string; signal: AbortSignal; onEvent?: (event: DrainRunnerEvent) => void }\n ): Promise<DrainSessionOutcome>;\n /** Shared provider circuit-breaker snapshot (the same instance the run\n * coordinator gates attempts on). While OPEN inside its cooldown window\n * the scheduler skips submission entirely — claims stay durable, and the\n * breaker's single half-open probe (one attempt through once the window\n * lapses) keeps recovery automatic. Optional: hosts without a breaker\n * never skip. */\n breakerSnapshot?(): ProviderBreakerSnapshot;\n /** Test seam: monotonic-ish clock for backoff windows. */\n now?(): number;\n}\n\nexport interface BacklogSchedulerOptions {\n /** Optional label prefix; each scheduler instance adds a unique token. */\n ownerId?: string;\n /** Scan cadence in ms (startup + new-work + retry checks). */\n pollMs?: number;\n retryBaseMs?: number;\n retryMaxMs?: number;\n now?: () => number;\n}\n\nexport interface BacklogSchedulerCounters {\n /** Keys submitted to the drain (claimed or adopted) this process lifetime. */\n claimed: number;\n /** Outcomes with genuinely empty claims (durable outputs preceded ack). */\n processed: number;\n /** Sum of durable outputs (memories + entities) across processed drains. */\n durableOutputs: number;\n /** Re-submissions after a failed/deferred/denied outcome. */\n retried: number;\n denied: { keys: number; turns: number };\n failed: number;\n}\n\nexport type BacklogKeyState = \"inflight\" | \"backoff\" | \"denied\";\n\nexport interface BacklogKeySnapshot {\n key: string;\n state: BacklogKeyState;\n turnsRemaining?: number;\n reason?: string;\n}\n\nexport interface BacklogSchedulerSnapshot {\n counters: BacklogSchedulerCounters;\n inFlight: string[];\n reservedKeys: string[];\n keys: BacklogKeySnapshot[];\n}\n\ninterface KeyState {\n state: BacklogKeyState;\n nextAttemptMs: number;\n /** Last observed remaining turns; progress resets the backoff exponent. */\n turnsRemaining: number;\n reason?: string;\n backoffExponent: number;\n}\n\nconst DEFAULT_POLL_MS = 15_000;\nconst DEFAULT_RETRY_BASE_MS = 30_000;\nconst DEFAULT_RETRY_MAX_MS = 15 * 60_000;\n\nexport class BacklogScheduler {\n private readonly deps: BacklogSchedulerDeps;\n private readonly options: Required<Omit<BacklogSchedulerOptions, \"now\">> & Pick<BacklogSchedulerOptions, \"now\">;\n private readonly keys = new Map<string, KeyState>();\n private readonly inFlight = new Map<string, { controller: AbortController; settled: Promise<void> }>();\n private readonly reserved = new Set<string>();\n private readonly counters: BacklogSchedulerCounters = {\n claimed: 0,\n processed: 0,\n durableOutputs: 0,\n retried: 0,\n denied: { keys: 0, turns: 0 },\n failed: 0,\n };\n private claimCursor: string | undefined;\n private timer: ReturnType<typeof setInterval> | undefined;\n private ticking = false;\n private stopped = true;\n\n constructor(deps: BacklogSchedulerDeps, options: BacklogSchedulerOptions = {}) {\n this.deps = deps;\n this.options = {\n ownerId: `${options.ownerId ?? \"daemon-drain\"}-${randomUUID()}`,\n pollMs: options.pollMs ?? DEFAULT_POLL_MS,\n retryBaseMs: options.retryBaseMs ?? DEFAULT_RETRY_BASE_MS,\n retryMaxMs: options.retryMaxMs ?? DEFAULT_RETRY_MAX_MS,\n now: options.now,\n };\n }\n\n /** Idempotent. Starts the poll timer (unref'd) and runs an initial tick. */\n start(): void {\n if (!this.stopped) return;\n this.stopped = false;\n this.timer = setInterval(() => void this.tick(), this.options.pollMs);\n this.timer.unref?.();\n void this.tick();\n }\n\n /** Idempotent. Stops the timer, aborts in-flight drains (their claims stay\n * retryable) and waits for them to settle. */\n async stop(): Promise<void> {\n if (this.stopped) return;\n this.stopped = true;\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n const aborts: Promise<void>[] = [];\n for (const entry of this.inFlight.values()) {\n entry.controller.abort(new Error(\"backlog scheduler stopping\"));\n aborts.push(entry.settled);\n }\n await Promise.allSettled(aborts);\n }\n\n /** Bounded snapshot for ops/watchers: counters + per-key states + live sets. */\n snapshot(): BacklogSchedulerSnapshot {\n return {\n counters: {\n claimed: this.counters.claimed,\n processed: this.counters.processed,\n durableOutputs: this.counters.durableOutputs,\n retried: this.counters.retried,\n denied: { ...this.counters.denied },\n failed: this.counters.failed,\n },\n inFlight: [...this.inFlight.keys()],\n reservedKeys: [...this.reserved],\n keys: [...this.keys.entries()].map(([key, state]) => ({\n key,\n state: state.state,\n turnsRemaining: state.turnsRemaining,\n reason: state.reason,\n })),\n };\n }\n\n /** One scan+submit pass (tests drive this instead of the timer). Waits out\n * any in-progress tick first so the pass always actually scans. */\n async tickForTest(): Promise<void> {\n // setImmediate: yields to the event loop so pending I/O (a slow first\n // scan) can finish; a microtask spin would starve it.\n while (this.ticking) await new Promise((resolve) => setImmediate(resolve));\n await this.tick();\n }\n\n /** Await the settle (slot release) of everything currently in flight,\n * optionally excluding one still-gated key (tests). */\n async settleForTest(exclude?: string): Promise<void> {\n for (;;) {\n const pending = [...this.inFlight.entries()].filter(([key]) => key !== exclude).map(([, entry]) => entry.settled);\n if (pending.length === 0) return;\n await Promise.allSettled(pending);\n }\n }\n\n private now(): number {\n return this.options.now?.() ?? Date.now();\n }\n\n private async tick(): Promise<void> {\n if (this.ticking || this.stopped) return;\n this.ticking = true;\n const cursorBeforeTick = this.claimCursor;\n try {\n // Fast bail: a breaker already open must not pay discovery I/O\n // (listPage reads and parses claim bodies on every poll). The\n // submitCandidates guard below still catches a breaker that opens\n // while discovery awaits.\n const breakerBeforeDiscovery = this.deps.breakerSnapshot?.();\n if (\n breakerBeforeDiscovery &&\n breakerBeforeDiscovery.state === \"open\" &&\n this.now() < breakerBeforeDiscovery.openUntilMs\n ) {\n return;\n }\n // stop() may land while discovery's I/O is pending: re-check before\n // submitting anything, and again per candidate.\n // A discovery failure (EACCES/EIO on the claims dir) must not reject\n // into a detached timer callback: it would be an unhandled rejection\n // that terminates the server. Log, skip this pass, retry next poll.\n let candidates: { key: string; needsClaim: boolean }[];\n try {\n candidates = await this.discoverCandidates();\n } catch (err) {\n // Discovery may have listed a page before it failed: the page cursor\n // already moved, so restore it — otherwise those claims wait for the\n // cursor to wrap instead of the next poll.\n this.claimCursor = cursorBeforeTick;\n log.warn(\n `backlog drain: discovery failed; retrying next poll: ${err instanceof Error ? err.message : String(err)}`\n );\n return;\n }\n if (this.stopped) return;\n const dropped = this.submitCandidates(candidates);\n // The concurrency bound stopped submission mid-page: rewind the page\n // cursor so the unsubmitted claims are re-listed on the next tick\n // (already-submitted ones are gated by inFlight and key backoff).\n if (dropped) this.claimCursor = cursorBeforeTick;\n } finally {\n this.ticking = false;\n }\n }\n\n /** Bounded discovery: ONE page of existing claims with pending turns */\n private async discoverCandidates(): Promise<{ key: string; needsClaim: boolean }[]> {\n const out: { key: string; needsClaim: boolean }[] = [];\n const seen = new Set<string>();\n const pageLimit = Math.max(this.submissionLimit() * 4, 16);\n const page = await this.deps.claims.listPage(this.claimCursor, pageLimit);\n for (const listed of page.entries) {\n seen.add(listed.key);\n out.push({ key: listed.key, needsClaim: false });\n }\n this.claimCursor = page.nextCursor;\n for (const [key, counts] of await this.deps.liveBufferCounts()) {\n if (counts.turns + counts.retainedTurns <= 0) continue;\n if (seen.has(key) || this.deps.claims.isClaimed(key)) continue;\n seen.add(key);\n out.push({ key, needsClaim: true });\n }\n return out;\n }\n\n /** Submission bound: the queue's own concurrency limit, read with the\n * documented \"0 disables\" contract — a zero limit submits nothing. */\n private submissionLimit(): number {\n if (this.deps.queue.maxConcurrency <= 0) return 0;\n return this.deps.queue.maxConcurrency;\n }\n\n /** Submit discovery candidates within the queue's concurrency bound. */\n private submitCandidates(candidates: { key: string; needsClaim: boolean }[]): boolean {\n // Breaker-open churn guard: a full attempt reads the claim, rebuilds the\n // buffer/coordinator and re-renders chunks before the breaker fails it\n // fast — pure heap pressure per poll during a provider stall. Skip while\n // the window is open; once it lapses, submissions resume and the\n // breaker's half-open probe runs as usual.\n const breaker = this.deps.breakerSnapshot?.();\n if (breaker && breaker.state === \"open\" && this.now() < breaker.openUntilMs) {\n return true;\n }\n let dropped = false;\n for (const candidate of candidates) {\n if (this.stopped || this.inFlight.size >= this.submissionLimit()) {\n dropped = true;\n break;\n }\n if (!this.candidateEligible(candidate)) continue;\n // Fence the claim decision: reserve the key synchronously BEFORE the\n // async rename so no queued task for it can pass the claimed gate in\n // the meantime. Release happens when the decision settles.\n if (candidate.needsClaim) {\n if (!this.deps.queue.tryReserveKey(candidate.key)) continue;\n this.reserved.add(candidate.key);\n }\n void this.submit(candidate.key, candidate.needsClaim);\n }\n return dropped;\n }\n\n /** inFlight is the authority for \"already submitted\" — key state only\n * exists once an outcome landed (backoff/denied gating below). */\n private candidateEligible(candidate: { key: string; needsClaim: boolean }): boolean {\n if (this.stopped || this.inFlight.size >= this.submissionLimit()) return false;\n if (this.inFlight.has(candidate.key)) return false;\n const state = this.keys.get(candidate.key);\n return !(state && this.now() < state.nextAttemptMs);\n }\n\n /** Claim (when needed), then drain one key; the reservation spans the async\n * claim decision, the queue entry carries the key afterwards. */\n private async submit(key: string, needsClaim: boolean): Promise<void> {\n const controller = new AbortController();\n const { promise: settled, resolve: settle } = Promise.withResolvers<void>();\n this.inFlight.set(key, { controller, settled });\n try {\n if (!(await this.claimForSubmit(key, needsClaim, this.options.ownerId))) return;\n // Stopped between the claim decision and the task: leave the claim\n // with its lease (it expires; the next start adopts) — never drain.\n if (this.stopped) return;\n await this.drainClaimedKey(key, controller.signal, this.options.ownerId);\n } catch (err) {\n // Claim/drain failures are scheduler-level: the claim content is\n // untouched — count failed and back off (never an unhandled rejection\n // in the detached submission).\n this.counters.failed += 1;\n const message = err instanceof Error ? err.message : String(err);\n // SAFETY: a thrown non-Error (incl. null) carries no retry hint; the\n // optional chain reads the hint off Error throws only.\n this.setBackoff(key, (err as { turnsRemaining?: number } | null | undefined)?.turnsRemaining ?? 0, message);\n log.warn(`backlog drain: ${key} submission failed: ${message}`);\n } finally {\n this.inFlight.delete(key);\n this.reserved.delete(key);\n this.deps.queue.releaseKeyReservation(key);\n settle();\n }\n }\n\n /** after all — the key goes quiet without a task. \"claimed\": ours. */\n private async claimForSubmit(key: string, needsClaim: boolean, ownerId: string): Promise<boolean> {\n if (!needsClaim) return true;\n try {\n const outcome = await this.deps.claims.claimFromSessionFile(key, this.deps.lease(ownerId));\n if (outcome === \"empty\") {\n this.keys.delete(key);\n return false;\n }\n return true;\n } finally {\n this.reserved.delete(key);\n this.deps.queue.releaseKeyReservation(key);\n }\n }\n\n /** Drain one claimed key. drainKey reports failures as outcomes; a thrown\n * error still means the claim content is intact — count it failed and\n * back off. */\n private async drainClaimedKey(key: string, signal: AbortSignal, ownerId: string): Promise<void> {\n this.counters.claimed += 1;\n try {\n const outcome = await this.deps.drainKey(key, {\n ownerId,\n signal,\n });\n this.applyOutcome(key, outcome);\n } catch (err) {\n this.counters.failed += 1;\n const message = err instanceof Error ? err.message : String(err);\n // SAFETY: a thrown non-Error (incl. null) carries no retry hint; the\n // optional chain reads the hint off Error throws only.\n this.setBackoff(key, (err as { turnsRemaining?: number } | null | undefined)?.turnsRemaining ?? 0, message);\n log.warn(`backlog drain: ${key} threw: ${message}`);\n }\n }\n\n private applyOutcome(key: string, outcome: DrainSessionOutcome): void {\n const deniedTurns = outcome.denied?.reduce((sum, entry) => sum + entry.turns, 0) ?? 0;\n const previous = this.keys.get(key);\n const progressed = outcome.turnsRemaining < (previous?.turnsRemaining ?? Number.POSITIVE_INFINITY);\n if (outcome.status === \"drained\") {\n // The claim is now an empty tombstone: authoritative, nothing pending.\n // New ingress consumes it via the native save path and re-candidates.\n this.keys.delete(key);\n this.counters.processed += 1;\n this.counters.durableOutputs += outcome.durableOutputCount;\n log.info(\n `backlog drain: ${key} drained (${outcome.turnsAtStart} turn(s), ${outcome.durableOutputCount} durable output(s))`\n );\n return;\n }\n this.recordNonDrainedCounters(previous, outcome, deniedTurns);\n const denied = deniedTurns > 0 && outcome.turnsRemaining > 0;\n this.keys.set(key, this.nextKeyState(previous, outcome, denied, progressed));\n log.info(\n `backlog drain: ${key} ${outcome.status} (${outcome.turnsRemaining} turn(s) remaining` +\n `${denied ? `, denied: ${deniedTurns}` : \"\"}${outcome.reason ? `, ${outcome.reason}` : \"\"})`\n );\n }\n\n /** Denied backlog counters for a non-drained outcome. */\n private recordNonDrainedCounters(\n previous: KeyState | undefined,\n outcome: DrainSessionOutcome,\n deniedTurns: number\n ): void {\n if (deniedTurns > 0) {\n this.counters.denied.keys += 1;\n this.counters.denied.turns += deniedTurns;\n }\n if (outcome.status === \"failed\") this.counters.failed += 1;\n else if (previous !== undefined && (previous.state === \"backoff\" || previous.state === \"denied\"))\n this.counters.retried += 1;\n }\n\n /** The post-drain key state: denial waits the full max window (its content\n * is valid but currently unauthorized); progress resets the exponent. */\n private nextKeyState(\n previous: KeyState | undefined,\n outcome: DrainSessionOutcome,\n denied: boolean,\n progressed: boolean\n ): KeyState {\n return {\n state: denied ? \"denied\" : \"backoff\",\n nextAttemptMs: this.now() + this.backoffMs(previous, progressed && !denied),\n turnsRemaining: outcome.turnsRemaining,\n reason: outcome.reason,\n backoffExponent: this.nextBackoffExponent(denied, progressed, previous),\n };\n }\n\n private nextBackoffExponent(denied: boolean, progressed: boolean, previous: KeyState | undefined): number {\n return denied || !progressed ? (previous?.backoffExponent ?? 0) + 1 : 0;\n }\n\n private backoffMs(previous: KeyState | undefined, progressed: boolean): number {\n if (previous?.state === \"denied\") return this.options.retryMaxMs;\n const exponent = progressed ? 0 : (previous?.backoffExponent ?? 0) + 1;\n return Math.min(this.options.retryBaseMs * 2 ** exponent, this.options.retryMaxMs);\n }\n\n private setBackoff(key: string, turnsRemaining: number, reason: string): void {\n const previous = this.keys.get(key);\n this.keys.set(key, {\n state: \"backoff\",\n nextAttemptMs: this.now() + this.backoffMs(previous, false),\n turnsRemaining,\n reason,\n backoffExponent: (previous?.backoffExponent ?? 0) + 1,\n });\n }\n}\n\n/** Lease lifetime for claims the scheduler takes (matches the runner default). */\nconst SCHEDULER_LEASE_MS = 120_000;\n\n/** Wire the scheduler to an orchestrator's own queue, claim store, live buffer\n * counts and drain runner — the daemon's single ownership point. */\nexport function wireBacklogScheduler(\n orchestrator: Orchestrator,\n options: BacklogSchedulerOptions = {}\n): BacklogScheduler {\n const runner = new BufferDrainRunner(orchestrator);\n return new BacklogScheduler(\n {\n queue: orchestrator.extractionQueueCoordinator,\n claims: orchestrator.storage.bufferDrainClaims(),\n liveBufferCounts: async () => {\n // The daemon's buffer may be lazy: ensure the persisted state is in\n // memory before counting (load is guarded/idempotent).\n await orchestrator.buffer.load();\n return orchestrator.buffer.entryCounts();\n },\n lease: (ownerId) => {\n const now = new Date().toISOString();\n return {\n ownerId,\n pid: process.pid,\n host: hostname(),\n acquiredAt: now,\n heartbeatAt: now,\n leaseMs: SCHEDULER_LEASE_MS,\n };\n },\n drainKey: (key, drainOptions) => runner.drainSession(key, drainOptions),\n // The orchestrator's one shared provider breaker (foreground and every\n // claim-backed drain accumulate toward the same threshold).\n breakerSnapshot: () => orchestrator.getExtractionResilienceStatus().breaker,\n },\n options\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  BufferDrainRunner,
3
3
  ClaimBufferStorage
4
- } from "../chunk-LS7PT3YD.js";
5
- import "../chunk-DDATG2SF.js";
6
- import "../chunk-B3DR2JBZ.js";
4
+ } from "../chunk-LRLQ2PRP.js";
5
+ import "../chunk-TFMLRVMW.js";
7
6
  import "../chunk-6P7U3HWG.js";
8
- import "../chunk-H4CKS5B2.js";
9
7
  import "../chunk-PQM3B54K.js";
8
+ import "../chunk-B3DR2JBZ.js";
9
+ import "../chunk-54BGIBCR.js";
10
+ import "../chunk-H4CKS5B2.js";
10
11
  import "../chunk-W4F3C7N7.js";
11
12
  import "../chunk-MPC7TYTZ.js";
12
13
  import "../chunk-MMACM5G2.js";
13
- import "../chunk-54BGIBCR.js";
14
14
  import "../chunk-FXZTL7F7.js";
15
- import "../chunk-SUTEBYGI.js";
15
+ import "../chunk-V7T45MI6.js";
16
16
  import "../chunk-BV2TIZ4F.js";
17
17
  import "../chunk-HDDRVXX4.js";
18
18
  import "../chunk-PYHOAXTI.js";
@@ -21,54 +21,55 @@ import "../chunk-OZKVVUJB.js";
21
21
  import "../chunk-2DL3OFLD.js";
22
22
  import "../chunk-G4IAEX6D.js";
23
23
  import "../chunk-2NLLXCJG.js";
24
- import "../chunk-NMGHGTVR.js";
24
+ import "../chunk-765K3SAT.js";
25
+ import "../chunk-HRMOKGQM.js";
25
26
  import "../chunk-QV2VZKD5.js";
26
27
  import "../chunk-UP6MOYCB.js";
27
- import "../chunk-765K3SAT.js";
28
28
  import "../chunk-IFBSZGW3.js";
29
- import "../chunk-FZZMLGWQ.js";
30
- import "../chunk-W54Z2MOP.js";
29
+ import "../chunk-F4BUSX3D.js";
30
+ import "../chunk-RXSGBO7Y.js";
31
31
  import "../chunk-TBUEE7XF.js";
32
- import "../chunk-WGGRZYSQ.js";
32
+ import "../chunk-5PHOU5QI.js";
33
+ import "../chunk-KE3JWIZK.js";
33
34
  import "../chunk-I74SUMNI.js";
34
35
  import "../chunk-ILNPU5W5.js";
35
36
  import "../chunk-FGDKJJZS.js";
36
37
  import "../chunk-AJVLDJU6.js";
37
38
  import "../chunk-SZDLX763.js";
38
39
  import "../chunk-PYIFUBRK.js";
39
- import "../chunk-5PHOU5QI.js";
40
- import "../chunk-LNGELD2M.js";
41
- import "../chunk-DNY63QWJ.js";
40
+ import "../chunk-EDR6CVWZ.js";
41
+ import "../chunk-3VWU3KF3.js";
42
+ import "../chunk-4HK7DYOL.js";
42
43
  import "../chunk-WHCD4Z3D.js";
44
+ import "../chunk-YQJCWR4R.js";
43
45
  import "../chunk-VZAKYDMJ.js";
44
- import "../chunk-IL3RHBWM.js";
46
+ import "../chunk-EJ23D4JG.js";
45
47
  import "../chunk-7IGMKQWK.js";
46
48
  import "../chunk-666A3MOW.js";
47
- import "../chunk-EDR6CVWZ.js";
48
- import "../chunk-YQJCWR4R.js";
49
49
  import "../chunk-VDC6RZI4.js";
50
50
  import "../chunk-UWK5OXUJ.js";
51
- import "../chunk-OJXK5C6Z.js";
51
+ import "../chunk-ZG4GNPRE.js";
52
+ import "../chunk-AQNHEDXP.js";
53
+ import "../chunk-SDL22RRW.js";
52
54
  import "../chunk-7N4KAIGN.js";
53
55
  import "../chunk-QNN4FYBD.js";
54
56
  import "../chunk-UXPUUL3G.js";
55
57
  import "../chunk-DDA47TES.js";
56
- import "../chunk-AQNHEDXP.js";
57
- import "../chunk-SDL22RRW.js";
58
58
  import "../chunk-TECVW3JP.js";
59
59
  import "../chunk-C5JF6EZ7.js";
60
60
  import "../chunk-KBL3JJR6.js";
61
61
  import "../chunk-RZN4LQ5Y.js";
62
- import "../chunk-4EZWSDFL.js";
62
+ import "../chunk-NX4XDDFQ.js";
63
63
  import "../chunk-JVBAPAWZ.js";
64
64
  import "../chunk-V5OCT34X.js";
65
- import "../chunk-UHMHJX5G.js";
65
+ import "../chunk-OIG4ZFMB.js";
66
66
  import "../chunk-HSSERO3E.js";
67
67
  import "../chunk-NOUJNHWG.js";
68
68
  import "../chunk-K2VRKCPA.js";
69
69
  import "../chunk-I7TR2OCU.js";
70
70
  import "../chunk-VQ7B2Q6M.js";
71
71
  import "../chunk-2524MOWK.js";
72
+ import "../chunk-TB6CBZ5V.js";
72
73
  import "../chunk-XW2T4QAW.js";
73
74
  import "../chunk-XTN54NML.js";
74
75
  import "../chunk-3JKYQBLC.js";
@@ -76,54 +77,53 @@ import "../chunk-7RKSJVOQ.js";
76
77
  import "../chunk-HCAGBFE7.js";
77
78
  import "../chunk-SI36RWC3.js";
78
79
  import "../chunk-NJAIR57U.js";
80
+ import "../chunk-53ZVHXVZ.js";
79
81
  import "../chunk-HL4DB7TO.js";
80
- import "../chunk-J7BIFOYP.js";
81
- import "../chunk-IQ55QGY5.js";
82
+ import "../chunk-U6TC6Z5B.js";
83
+ import "../chunk-R4JYSBZE.js";
82
84
  import "../chunk-BANSBRNX.js";
83
- import "../chunk-TB6CBZ5V.js";
85
+ import "../chunk-JWX2Q6HS.js";
84
86
  import "../chunk-47DU4SGJ.js";
85
87
  import "../chunk-3Q3XD3NO.js";
86
88
  import "../chunk-WLT6LTQP.js";
87
89
  import "../chunk-EOU6V4IN.js";
88
- import "../chunk-ILY5SSOM.js";
89
90
  import "../chunk-KVDUKH5E.js";
90
91
  import "../chunk-GNVZQ5JN.js";
91
92
  import "../chunk-YN2UN7N3.js";
92
- import "../chunk-JWX2Q6HS.js";
93
93
  import "../chunk-VHF73MGU.js";
94
94
  import "../chunk-4EX5WZ4M.js";
95
95
  import "../chunk-VHSQU3RO.js";
96
96
  import "../chunk-YRFAYOFQ.js";
97
97
  import "../chunk-C73N66PR.js";
98
98
  import "../chunk-ECZU5BJH.js";
99
+ import "../chunk-AP4BFWSW.js";
100
+ import "../chunk-HNOSWPKG.js";
99
101
  import "../chunk-77NTFICT.js";
100
102
  import "../chunk-LJLGH2DE.js";
101
- import "../chunk-PC5DRBGD.js";
102
- import "../chunk-HNOSWPKG.js";
103
103
  import "../chunk-ODZKV2F7.js";
104
104
  import "../chunk-WWDO7ZWM.js";
105
- import "../chunk-Z3FTSHT5.js";
106
- import "../chunk-RNG7S3FY.js";
105
+ import "../chunk-RUQE5C32.js";
106
+ import "../chunk-ICHLN5L6.js";
107
+ import "../chunk-FQACH7MC.js";
108
+ import "../chunk-B2NXOVZN.js";
109
+ import "../chunk-WQ4XKIOX.js";
110
+ import "../chunk-ADJXJKU6.js";
111
+ import "../chunk-5Y43VGYB.js";
107
112
  import "../chunk-XMYWYJM2.js";
108
113
  import "../chunk-ZOKZIR5K.js";
109
114
  import "../chunk-5IZL4DCV.js";
110
115
  import "../chunk-5CO5G4MN.js";
116
+ import "../chunk-X7J56GPG.js";
111
117
  import "../chunk-LUDXM7MD.js";
112
118
  import "../chunk-ZKE4CO6B.js";
113
- import "../chunk-QDESY76F.js";
114
- import "../chunk-B2NXOVZN.js";
115
- import "../chunk-WQ4XKIOX.js";
116
- import "../chunk-ADJXJKU6.js";
117
- import "../chunk-5Y43VGYB.js";
118
- import "../chunk-2WCLTWV2.js";
119
+ import "../chunk-7NVK6AGC.js";
119
120
  import "../chunk-NHVAX7MH.js";
120
121
  import "../chunk-X7XN6YU4.js";
121
- import "../chunk-X7J56GPG.js";
122
122
  import "../chunk-MUHGYV2V.js";
123
123
  import "../chunk-CEN6DW6X.js";
124
124
  import "../chunk-2KHIBLO5.js";
125
125
  import "../chunk-5HFVWYHL.js";
126
- import "../chunk-X2BVB74H.js";
126
+ import "../chunk-UZQXJDOE.js";
127
127
  import "../chunk-DBB5JPSL.js";
128
128
  import "../chunk-3D75XIYO.js";
129
129
  import "../chunk-G2DF5MI7.js";
@@ -132,12 +132,12 @@ import "../chunk-TE6S7KDF.js";
132
132
  import "../chunk-2YODOG2O.js";
133
133
  import "../chunk-KIW3OOZE.js";
134
134
  import "../chunk-YE4JBZO5.js";
135
+ import "../chunk-7O5EW7KX.js";
135
136
  import "../chunk-5KVT6G5U.js";
136
137
  import "../chunk-IIK2PD3F.js";
137
138
  import "../chunk-PH5ZQM35.js";
138
139
  import "../chunk-VYDGHJIN.js";
139
140
  import "../chunk-V2KGDESV.js";
140
- import "../chunk-7O5EW7KX.js";
141
141
  import "../chunk-H7XKCNR6.js";
142
142
  import "../chunk-R4BBGPI2.js";
143
143
  import "../chunk-SOBJ6NEY.js";
@@ -146,49 +146,49 @@ import "../chunk-MGN2RQRG.js";
146
146
  import "../chunk-EVWDNKQA.js";
147
147
  import "../chunk-2LA3H54D.js";
148
148
  import "../chunk-ROI7BK7H.js";
149
- import "../chunk-RKABLU5M.js";
150
- import "../chunk-FQAQ63QA.js";
149
+ import "../chunk-KVHGCISP.js";
150
+ import "../chunk-5AJIGWY4.js";
151
151
  import "../chunk-KFY3SGN7.js";
152
152
  import "../chunk-3T74IZB3.js";
153
153
  import "../chunk-CMTINOFS.js";
154
154
  import "../chunk-IQMDQJCD.js";
155
- import "../chunk-GBJUTX44.js";
155
+ import "../chunk-4WKR4P7H.js";
156
156
  import "../chunk-32CA7B6L.js";
157
157
  import "../chunk-7IWRLYFJ.js";
158
- import "../chunk-UD7UNYRD.js";
159
- import "../chunk-LD72P4YS.js";
160
158
  import "../chunk-23L3IXFD.js";
161
- import "../chunk-573TEZCD.js";
162
159
  import "../chunk-3GPTTA4J.js";
160
+ import "../chunk-UD7UNYRD.js";
163
161
  import "../chunk-IISBCCWR.js";
162
+ import "../chunk-LD72P4YS.js";
163
+ import "../chunk-573TEZCD.js";
164
+ import "../chunk-UYHDMCY2.js";
164
165
  import "../chunk-EIB4FJVR.js";
165
166
  import "../chunk-LPV72KRQ.js";
166
- import "../chunk-ESLOLCD4.js";
167
- import "../chunk-F4QFU5IZ.js";
167
+ import "../chunk-RUWKIPWJ.js";
168
+ import "../chunk-EZ7XJJ5L.js";
168
169
  import "../chunk-XKZBZOKV.js";
169
170
  import "../chunk-E4RMZGRS.js";
170
171
  import "../chunk-MZUQVWVC.js";
171
172
  import "../chunk-M4DB6ZNN.js";
172
- import "../chunk-UYHDMCY2.js";
173
173
  import "../chunk-V65H7MI6.js";
174
174
  import "../chunk-MDPT6QFK.js";
175
+ import "../chunk-UOBPK2OS.js";
175
176
  import "../chunk-2YA5N2BY.js";
176
177
  import "../chunk-3HSRWJTC.js";
177
- import "../chunk-BPK32FRM.js";
178
+ import "../chunk-NTDHSV7N.js";
178
179
  import "../chunk-HUDPXTXW.js";
179
180
  import "../chunk-AZEZSQ5R.js";
180
181
  import "../chunk-YAZNBMNF.js";
181
- import "../chunk-UOBPK2OS.js";
182
182
  import "../chunk-XXSOVESA.js";
183
183
  import "../chunk-PHRLJFWZ.js";
184
184
  import "../chunk-64NJRYU2.js";
185
185
  import "../chunk-IHCXMYSE.js";
186
- import "../chunk-LQ5SS4OP.js";
186
+ import "../chunk-D6IGZYTN.js";
187
187
  import "../chunk-W7K5BP3M.js";
188
188
  import "../chunk-LZIOY7ZU.js";
189
- import "../chunk-UN4RVUG2.js";
189
+ import "../chunk-2R3ACFYN.js";
190
190
  import "../chunk-EI6V5UXY.js";
191
- import "../chunk-LLPMMMWG.js";
191
+ import "../chunk-4IJFJQPD.js";
192
192
  import "../chunk-UA2NDTIU.js";
193
193
  import "../chunk-6XTUZKCZ.js";
194
194
  import "../chunk-54V4BZWP.js";
@@ -227,7 +227,7 @@ import "../chunk-DGFU5MSX.js";
227
227
  import "../chunk-3FBAEPCU.js";
228
228
  import "../chunk-7T4TOGMS.js";
229
229
  import "../chunk-7YQ6ESEA.js";
230
- import "../chunk-YIXJSW5M.js";
230
+ import "../chunk-HA5DASDG.js";
231
231
  import "../chunk-NVKO5YKP.js";
232
232
  import "../chunk-SVH57F5Z.js";
233
233
  import "../chunk-MKYRCCSN.js";
@@ -236,7 +236,7 @@ import "../chunk-W2UOAATB.js";
236
236
  import "../chunk-3ZS3NUEI.js";
237
237
  import "../chunk-JKMIGCK6.js";
238
238
  import "../chunk-SP4DB6SX.js";
239
- import "../chunk-DPPLNZ3A.js";
239
+ import "../chunk-FM4P7HSW.js";
240
240
  import "../chunk-ULM7JCDH.js";
241
241
  import "../chunk-GKUA4MGB.js";
242
242
  import "../chunk-WJ6S54ES.js";
@@ -254,29 +254,29 @@ import "../chunk-HRATODNO.js";
254
254
  import "../chunk-WTWQA7BB.js";
255
255
  import "../chunk-VZIAVM72.js";
256
256
  import "../chunk-VEWZZM3H.js";
257
- import "../chunk-D5XG2KPS.js";
258
- import "../chunk-XJ2S5UBF.js";
259
- import "../chunk-QHARXWTC.js";
257
+ import "../chunk-7E7J7QXB.js";
258
+ import "../chunk-DWWX3FU3.js";
259
+ import "../chunk-2LCX6TAD.js";
260
260
  import "../chunk-UFGFMWAD.js";
261
- import "../chunk-LXATZLSC.js";
261
+ import "../chunk-FL3O34XF.js";
262
262
  import "../chunk-YNDLCWXS.js";
263
263
  import "../chunk-AUDJPF4N.js";
264
264
  import "../chunk-44442YCH.js";
265
265
  import "../chunk-Y4Z4I6WK.js";
266
266
  import "../chunk-7G5NTS7F.js";
267
- import "../chunk-QMFAMOT2.js";
268
- import "../chunk-CL4JU3DF.js";
267
+ import "../chunk-JH5AV542.js";
268
+ import "../chunk-B7L4ZYFY.js";
269
269
  import "../chunk-KJTKLXTH.js";
270
- import "../chunk-ZDV5YWID.js";
270
+ import "../chunk-GLDIMGOS.js";
271
271
  import "../chunk-2DQ2XREU.js";
272
272
  import "../chunk-3I4FUAVJ.js";
273
273
  import "../chunk-OKTXM5H4.js";
274
- import "../chunk-TYRWSE4B.js";
274
+ import "../chunk-ZUMHQEW4.js";
275
275
  import "../chunk-D24OXEPB.js";
276
276
  import "../chunk-ZAJLJ35W.js";
277
277
  import "../chunk-4NZQ7IID.js";
278
- import "../chunk-X5HGU2EM.js";
279
- import "../chunk-BN2EBCLB.js";
278
+ import "../chunk-NT772J7I.js";
279
+ import "../chunk-XPCUKWLE.js";
280
280
  import "../chunk-3UXOZBHV.js";
281
281
  import "../chunk-AL3TCNSJ.js";
282
282
  import "../chunk-5JMAGU26.js";
@@ -286,22 +286,22 @@ import "../chunk-GKCXTSFF.js";
286
286
  import "../chunk-2LSZVONP.js";
287
287
  import "../chunk-DEUNUKTD.js";
288
288
  import "../chunk-LXY5VVGM.js";
289
- import "../chunk-CIWMTNHW.js";
290
- import "../chunk-S3S72HRM.js";
291
- import "../chunk-BOK6BN5M.js";
289
+ import "../chunk-5NFF2TSD.js";
290
+ import "../chunk-HCCRWSP7.js";
291
+ import "../chunk-THV6PZ7V.js";
292
292
  import "../chunk-CSAKJVXW.js";
293
293
  import "../chunk-K2XUWZBM.js";
294
294
  import "../chunk-OD4FM2U7.js";
295
- import "../chunk-RQFXZYTF.js";
295
+ import "../chunk-33C4BK7I.js";
296
296
  import "../chunk-FA7SLQ5X.js";
297
+ import "../chunk-5YQXWVCP.js";
297
298
  import "../chunk-MJFL75J6.js";
298
299
  import "../chunk-QEDLJDHP.js";
299
300
  import "../chunk-U4LUIE6Y.js";
300
- import "../chunk-5YQXWVCP.js";
301
301
  import "../chunk-YN2DQ2D6.js";
302
302
  import "../chunk-FKBGK3NC.js";
303
303
  import "../chunk-ZY2MNJR6.js";
304
- import "../chunk-OUVYYKYU.js";
304
+ import "../chunk-IBKGQ6EY.js";
305
305
  import "../chunk-EKUI7I2X.js";
306
306
  import "../chunk-ENQCH3SW.js";
307
307
  import "../chunk-6ZELOK6O.js";
@@ -325,7 +325,7 @@ import "../chunk-43HUVDTD.js";
325
325
  import "../chunk-4RA3C3EV.js";
326
326
  import "../chunk-TOTT6S2V.js";
327
327
  import "../chunk-YMFPFXEX.js";
328
- import "../chunk-UBEKET2V.js";
328
+ import "../chunk-3R63SXC5.js";
329
329
  import "../chunk-ZKOPY4WW.js";
330
330
  import "../chunk-62OKGIJA.js";
331
331
  import "../chunk-OIGJZHDU.js";
@@ -333,8 +333,8 @@ import "../chunk-QNJQCLI6.js";
333
333
  import "../chunk-FEHIOYML.js";
334
334
  import "../chunk-P32IDSHD.js";
335
335
  import "../chunk-CIEEYVUB.js";
336
- import "../chunk-3AUDELZL.js";
337
336
  import "../chunk-LI4APB6M.js";
337
+ import "../chunk-3AUDELZL.js";
338
338
  import "../chunk-Z5LAYHGJ.js";
339
339
  import "../chunk-TNRCDMQT.js";
340
340
  import "../chunk-4KQIWY4A.js";
@@ -366,14 +366,14 @@ import "../chunk-ZCUTSMR2.js";
366
366
  import "../chunk-QDW3E4RD.js";
367
367
  import "../chunk-GKL6QYZO.js";
368
368
  import "../chunk-ZJP66Q4I.js";
369
- import "../chunk-FWRXW7CZ.js";
369
+ import "../chunk-4CXK3GT3.js";
370
370
  import "../chunk-QGVCFVX6.js";
371
371
  import "../chunk-UHVXE24Y.js";
372
- import "../chunk-IGOW4TJE.js";
373
- import "../chunk-RFUL2ZIQ.js";
372
+ import "../chunk-O3JG4PD3.js";
374
373
  import "../chunk-G6OFEGUR.js";
375
- import "../chunk-A4F7OIC5.js";
376
- import "../chunk-XPXHQI6N.js";
374
+ import "../chunk-RFUL2ZIQ.js";
375
+ import "../chunk-WVIWDMFB.js";
376
+ import "../chunk-FVMEZ57K.js";
377
377
  import "../chunk-DOJBV6WR.js";
378
378
  import "../chunk-PFUXPTBT.js";
379
379
  import "../chunk-CYEPCZN5.js";
@@ -405,25 +405,20 @@ import "../chunk-3WU7XOFN.js";
405
405
  import "../chunk-P4GUQSK3.js";
406
406
  import "../chunk-4LZ7SVKM.js";
407
407
  import "../chunk-YHTG64XV.js";
408
- import "../chunk-SQ3GEIEL.js";
409
- import "../chunk-IAYUTGF2.js";
408
+ import "../chunk-KUQLUYIR.js";
409
+ import "../chunk-O3GZPLVY.js";
410
410
  import "../chunk-5WITETWU.js";
411
- import "../chunk-M5GVCJSJ.js";
412
- import "../chunk-RBOJCG4T.js";
413
411
  import "../chunk-6CIAGZ6X.js";
414
- import "../chunk-7CT3AI52.js";
415
412
  import "../chunk-G7D6GZ5J.js";
416
413
  import "../chunk-7VLBZKNB.js";
417
414
  import "../chunk-Y33KJ556.js";
418
- import "../chunk-R23JWJD3.js";
415
+ import "../chunk-J426U7XK.js";
419
416
  import "../chunk-NWA6IXR3.js";
417
+ import "../chunk-AF2XMJKD.js";
420
418
  import "../chunk-OR42ZI54.js";
421
419
  import "../chunk-IUM3VSHI.js";
422
420
  import "../chunk-EZ47HOJ6.js";
423
- import "../chunk-AF2XMJKD.js";
424
421
  import "../chunk-23G5P7TA.js";
425
- import "../chunk-C64XATK7.js";
426
- import "../chunk-42JKGUFJ.js";
427
422
  import "../chunk-MMRTPH3J.js";
428
423
  import "../chunk-I55KAVET.js";
429
424
  import "../chunk-L2EXJQJP.js";
@@ -538,14 +533,20 @@ import "../chunk-ZEFVK7XC.js";
538
533
  import "../chunk-I3V3JJS7.js";
539
534
  import "../chunk-DJSJ4ULL.js";
540
535
  import "../chunk-R2MBW2S4.js";
541
- import "../chunk-F2XNSIPP.js";
536
+ import "../chunk-G2CGIFRP.js";
537
+ import "../chunk-ITAUMNQU.js";
542
538
  import "../chunk-G73MCJKL.js";
539
+ import "../chunk-M5GVCJSJ.js";
540
+ import "../chunk-RBOJCG4T.js";
541
+ import "../chunk-7CT3AI52.js";
542
+ import "../chunk-C64XATK7.js";
543
+ import "../chunk-42JKGUFJ.js";
543
544
  import "../chunk-A2IYSXDQ.js";
544
545
  import "../chunk-2Z5DIDQD.js";
545
546
  import "../chunk-QUIRIG2P.js";
546
- import "../chunk-DAOMWGO2.js";
547
- import "../chunk-RFYAYKTD.js";
547
+ import "../chunk-ZX5N5D6M.js";
548
548
  import "../chunk-4MN27537.js";
549
+ import "../chunk-RFYAYKTD.js";
549
550
  import "../chunk-B377OKUP.js";
550
551
  import "../chunk-JTSSSR4L.js";
551
552
  import "../chunk-OGBQMY46.js";