@remnic/core 10.0.92 → 10.0.94

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 (501) hide show
  1. package/dist/access-admin-ops-surface.js +332 -59
  2. package/dist/access-authorization-probe.js +2 -283
  3. package/dist/access-boundary.d.ts +1 -1
  4. package/dist/access-boundary.d.ts.map +1 -1
  5. package/dist/access-boundary.js +1 -282
  6. package/dist/access-cli.js +287 -303
  7. package/dist/access-cli.js.map +1 -1
  8. package/dist/access-coding-context-resolution.js +3 -3
  9. package/dist/access-extraction-force-flush.js +332 -59
  10. package/dist/access-http-briefing.js +332 -60
  11. package/dist/access-http-query.js +332 -61
  12. package/dist/access-http.js +330 -112
  13. package/dist/access-identity-continuity-surface.js +332 -59
  14. package/dist/access-lcm-surface.js +332 -59
  15. package/dist/access-mcp-frames.d.ts +20 -6
  16. package/dist/access-mcp-frames.d.ts.map +1 -1
  17. package/dist/access-mcp-frames.js +1 -1
  18. package/dist/access-mcp.d.ts +5 -0
  19. package/dist/access-mcp.d.ts.map +1 -1
  20. package/dist/access-mcp.js +330 -87
  21. package/dist/access-namespace-preflight.js +2 -282
  22. package/dist/access-observe-transcript.js +3 -3
  23. package/dist/access-observe-write-category.js +6 -6
  24. package/dist/access-observe-write-surface.js +332 -59
  25. package/dist/access-offline-manifest.js +12 -11
  26. package/dist/access-operations-batch.js +330 -64
  27. package/dist/access-operations.js +330 -73
  28. package/dist/access-recall-concurrency.js +332 -59
  29. package/dist/access-recall-diagnostics.js +5 -4
  30. package/dist/access-recall-response.js +332 -59
  31. package/dist/access-recall-surface.js +332 -59
  32. package/dist/access-schema.js +2 -2
  33. package/dist/access-service.js +335 -62
  34. package/dist/access-surface-catalog.js +6 -283
  35. package/dist/access-surface-catalog.js.map +1 -1
  36. package/dist/active-context-transform.js +1 -1
  37. package/dist/active-memory-bridge.js +3 -2
  38. package/dist/active-recall.js +36 -37
  39. package/dist/active-recall.js.map +1 -1
  40. package/dist/activity/journal-extract.d.ts +13 -1
  41. package/dist/activity/journal-extract.d.ts.map +1 -1
  42. package/dist/{auto-sync-3AZW7MXI.js → auto-sync-BO5YZKM6.js} +13 -15
  43. package/dist/{auto-sync-3AZW7MXI.js.map → auto-sync-BO5YZKM6.js.map} +1 -1
  44. package/dist/briefing.js +20 -20
  45. package/dist/buffer.js +16 -16
  46. package/dist/calibration.js +10 -10
  47. package/dist/{capsule-merge-2IIXFXN5.js → capsule-merge-6IDAYTKG.js} +6 -6
  48. package/dist/causal-consolidation.js +23 -23
  49. package/dist/{chunk-RGUUBAT5.js → chunk-2WCLTWV2.js} +3 -3
  50. package/dist/{chunk-BQZEGOZ4.js → chunk-2YODOG2O.js} +2 -2
  51. package/dist/{chunk-WYG5UNDY.js → chunk-3AUDELZL.js} +2 -2
  52. package/dist/{chunk-MB6ZJDN6.js → chunk-3FBAEPCU.js} +2 -2
  53. package/dist/{chunk-PIITB2YZ.js → chunk-3ZS3NUEI.js} +4 -4
  54. package/dist/{chunk-ATPWZ4F7.js → chunk-4EZWSDFL.js} +5 -5
  55. package/dist/{chunk-ANZZLRUX.js → chunk-4IVRQMZW.js} +2 -2
  56. package/dist/{chunk-63E37JCN.js → chunk-4RAJT5L2.js} +4 -4
  57. package/dist/{chunk-45VUHDV2.js → chunk-5CO5G4MN.js} +2 -2
  58. package/dist/{chunk-LUJCQQ3L.js → chunk-65HWAQ4F.js} +2 -2
  59. package/dist/{chunk-T67LUYCR.js → chunk-77NTFICT.js} +5 -5
  60. package/dist/chunk-A2WFUMUN.js +86 -0
  61. package/dist/chunk-A2WFUMUN.js.map +1 -0
  62. package/dist/{chunk-UE6RRXMF.js → chunk-A4F7OIC5.js} +2 -2
  63. package/dist/chunk-AHA5VQGP.js +117 -0
  64. package/dist/chunk-AHA5VQGP.js.map +1 -0
  65. package/dist/{chunk-RRJBDXAQ.js → chunk-B377OKUP.js} +2 -2
  66. package/dist/{chunk-IUKYFTGW.js → chunk-B3DR2JBZ.js} +140 -125
  67. package/dist/chunk-B3DR2JBZ.js.map +1 -0
  68. package/dist/{chunk-Z7JIZ42P.js → chunk-BN2EBCLB.js} +3 -3
  69. package/dist/{chunk-YYOMGOHB.js → chunk-BOK6BN5M.js} +2 -2
  70. package/dist/{chunk-U6UNF5ZS.js → chunk-BPK32FRM.js} +3 -3
  71. package/dist/{chunk-OH7QLI6W.js → chunk-BPPUH5JM.js} +5 -5
  72. package/dist/{chunk-O6ZSWHVR.js → chunk-C2KE5DMD.js} +4 -4
  73. package/dist/{chunk-47F6WWLQ.js → chunk-C73N66PR.js} +2 -2
  74. package/dist/{chunk-WRT7GJ2D.js → chunk-CIWMTNHW.js} +4 -4
  75. package/dist/{chunk-HF3BKUVV.js → chunk-CL4JU3DF.js} +7 -7
  76. package/dist/{chunk-O55EKIEC.js → chunk-D3ZKHLN2.js} +2 -2
  77. package/dist/chunk-D5S6RL32.js +67137 -0
  78. package/dist/chunk-D5S6RL32.js.map +1 -0
  79. package/dist/{chunk-ETZLQOUR.js → chunk-D5XG2KPS.js} +2 -2
  80. package/dist/{chunk-CD4BCCNP.js → chunk-DJ7WVEWX.js} +2 -2
  81. package/dist/{chunk-PWXPRVLK.js → chunk-DNY63QWJ.js} +2 -2
  82. package/dist/{chunk-4CJTQHEG.js → chunk-ESLOLCD4.js} +3 -3
  83. package/dist/{chunk-VILPVT4S.js → chunk-EZ47HOJ6.js} +4 -4
  84. package/dist/{chunk-EFYN5I7Z.js → chunk-F4QFU5IZ.js} +2 -2
  85. package/dist/{chunk-T6OZW2WR.js → chunk-FA7SLQ5X.js} +7 -1
  86. package/dist/chunk-FA7SLQ5X.js.map +1 -0
  87. package/dist/{chunk-BRLXOZLM.js → chunk-FQAQ63QA.js} +729 -17
  88. package/dist/chunk-FQAQ63QA.js.map +1 -0
  89. package/dist/{chunk-FSO3G4JJ.js → chunk-FWRXW7CZ.js} +5000 -2748
  90. package/dist/chunk-FWRXW7CZ.js.map +1 -0
  91. package/dist/{chunk-XYKBWTWI.js → chunk-FZZMLGWQ.js} +2 -2
  92. package/dist/{chunk-FNXQZGUS.js → chunk-GBJUTX44.js} +2 -2
  93. package/dist/{chunk-YLXETSAH.js → chunk-GCZJ7XRI.js} +2 -2
  94. package/dist/{chunk-UDKWFDV2.js → chunk-HLUHEMN4.js} +27 -3
  95. package/dist/chunk-HLUHEMN4.js.map +1 -0
  96. package/dist/{chunk-SUSW74WU.js → chunk-IL3RHBWM.js} +56 -5
  97. package/dist/chunk-IL3RHBWM.js.map +1 -0
  98. package/dist/{chunk-JV4S6VDH.js → chunk-ILY5SSOM.js} +2 -2
  99. package/dist/{chunk-EXHXJETE.js → chunk-IQ55QGY5.js} +2 -2
  100. package/dist/{chunk-4J363OAA.js → chunk-J7BIFOYP.js} +2 -2
  101. package/dist/{chunk-QFEDITXM.js → chunk-JNDMIAJ4.js} +2 -2
  102. package/dist/chunk-JTSSSR4L.js +359 -0
  103. package/dist/chunk-JTSSSR4L.js.map +1 -0
  104. package/dist/{chunk-5KBIOI4G.js → chunk-JVBAPAWZ.js} +217 -13
  105. package/dist/chunk-JVBAPAWZ.js.map +1 -0
  106. package/dist/{chunk-E5PPE4VA.js → chunk-K2VRKCPA.js} +2 -2
  107. package/dist/{chunk-MKRYQROF.js → chunk-LGEHAQHK.js} +4 -4
  108. package/dist/{chunk-7HTUYFR3.js → chunk-LLPMMMWG.js} +27 -10
  109. package/dist/chunk-LLPMMMWG.js.map +1 -0
  110. package/dist/{chunk-XYTQJD7F.js → chunk-LMJVP5CM.js} +2 -2
  111. package/dist/{chunk-E7YZXWIS.js → chunk-LNGELD2M.js} +2 -2
  112. package/dist/{chunk-FQKBJJYB.js → chunk-LPV72KRQ.js} +2 -2
  113. package/dist/{chunk-2LCRG2YV.js → chunk-M2XR6B6V.js} +2 -2
  114. package/dist/{chunk-EQ4U73UH.js → chunk-MLAMXQAW.js} +14 -2
  115. package/dist/chunk-MLAMXQAW.js.map +1 -0
  116. package/dist/{chunk-ZU5JDLOH.js → chunk-MMRTPH3J.js} +2 -2
  117. package/dist/{chunk-TVIVY7KU.js → chunk-NED7IR7B.js} +4 -4
  118. package/dist/{chunk-6F5MJFXY.js → chunk-NHVAX7MH.js} +2 -2
  119. package/dist/{chunk-TG3R2SID.js → chunk-NMGHGTVR.js} +5 -5
  120. package/dist/{chunk-YCNIGRRF.js → chunk-NS7U4ZYU.js} +13 -117
  121. package/dist/chunk-NS7U4ZYU.js.map +1 -0
  122. package/dist/{chunk-NGHDW6UU.js → chunk-NUQEREIP.js} +2 -2
  123. package/dist/{chunk-5IIQU4JZ.js → chunk-OB72KNMF.js} +4 -4
  124. package/dist/{chunk-RIMK327Y.js → chunk-OUVYYKYU.js} +7 -7
  125. package/dist/{chunk-QJPJXCS4.js → chunk-P3WRNWWM.js} +157 -4
  126. package/dist/chunk-P3WRNWWM.js.map +1 -0
  127. package/dist/{chunk-E6M225BJ.js → chunk-PC5DRBGD.js} +18 -8
  128. package/dist/chunk-PC5DRBGD.js.map +1 -0
  129. package/dist/{chunk-RWGRSKN5.js → chunk-PT4DZDJA.js} +2 -2
  130. package/dist/{chunk-7EPY3IQL.js → chunk-PZJQ46DH.js} +2 -2
  131. package/dist/{chunk-MXHMNKWG.js → chunk-QDESY76F.js} +3 -3
  132. package/dist/{chunk-E3A7ELSG.js → chunk-QHARXWTC.js} +2 -2
  133. package/dist/{chunk-BLJT6JP2.js → chunk-QMFAMOT2.js} +2 -2
  134. package/dist/{chunk-I6QGI65T.js → chunk-QRMG4HK4.js} +3 -3
  135. package/dist/{chunk-ZU3NJNO7.js → chunk-QSF5SJAM.js} +4 -4
  136. package/dist/{chunk-5IYOKDM4.js → chunk-R23JWJD3.js} +5 -5
  137. package/dist/{chunk-RHQLIHMB.js → chunk-R4BBGPI2.js} +218 -218
  138. package/dist/chunk-R4BBGPI2.js.map +1 -0
  139. package/dist/{chunk-NT7F7WJQ.js → chunk-RFUL2ZIQ.js} +291 -93
  140. package/dist/chunk-RFUL2ZIQ.js.map +1 -0
  141. package/dist/{chunk-E4IRW2FG.js → chunk-RKABLU5M.js} +233 -40
  142. package/dist/chunk-RKABLU5M.js.map +1 -0
  143. package/dist/{chunk-P4WNBSTW.js → chunk-RNG7S3FY.js} +2 -2
  144. package/dist/{chunk-IPT2OY4B.js → chunk-RQFXZYTF.js} +35 -33
  145. package/dist/chunk-RQFXZYTF.js.map +1 -0
  146. package/dist/{chunk-5HFXGXE5.js → chunk-RUTN5MMC.js} +7 -9
  147. package/dist/{chunk-5HFXGXE5.js.map → chunk-RUTN5MMC.js.map} +1 -1
  148. package/dist/{chunk-AP6NCP3V.js → chunk-S3S72HRM.js} +8 -6
  149. package/dist/chunk-S3S72HRM.js.map +1 -0
  150. package/dist/{chunk-ZGFLIK5H.js → chunk-SPAKBUJY.js} +2 -2
  151. package/dist/{chunk-ER7XANP3.js → chunk-SQ3GEIEL.js} +4 -4
  152. package/dist/{chunk-PMJFRDJI.js → chunk-SUTEBYGI.js} +2 -2
  153. package/dist/{chunk-HVX4LPNY.js → chunk-T4KY6UYF.js} +5 -3
  154. package/dist/{chunk-HVX4LPNY.js.map → chunk-T4KY6UYF.js.map} +1 -1
  155. package/dist/{chunk-R6HMAIKM.js → chunk-TOSPNM4T.js} +2 -2
  156. package/dist/{chunk-RMXS4I66.js → chunk-TVDJEUV5.js} +2 -2
  157. package/dist/{chunk-PLCYKAWH.js → chunk-TYRWSE4B.js} +2 -2
  158. package/dist/{chunk-B4QYQFGY.js → chunk-UBEKET2V.js} +383 -36
  159. package/dist/chunk-UBEKET2V.js.map +1 -0
  160. package/dist/{chunk-IQWUACVG.js → chunk-UHMHJX5G.js} +3 -3
  161. package/dist/{chunk-YODUDA6R.js → chunk-UN4RVUG2.js} +22 -22
  162. package/dist/{chunk-E6Z4FBX6.js → chunk-V2QSNFCT.js} +2 -2
  163. package/dist/{chunk-NBH6K6G5.js → chunk-V65H7MI6.js} +345 -16
  164. package/dist/chunk-V65H7MI6.js.map +1 -0
  165. package/dist/chunk-W54Z2MOP.js +4500 -0
  166. package/dist/chunk-W54Z2MOP.js.map +1 -0
  167. package/dist/{chunk-7W3RXOIG.js → chunk-WGGRZYSQ.js} +14 -14
  168. package/dist/{chunk-RIZ5NUNN.js → chunk-WQ4XKIOX.js} +4 -4
  169. package/dist/{chunk-QEYTRFR3.js → chunk-X26YOFGS.js} +2 -2
  170. package/dist/{chunk-ITHZFHST.js → chunk-X2BVB74H.js} +2 -2
  171. package/dist/{chunk-6F42QONS.js → chunk-X5HGU2EM.js} +4 -4
  172. package/dist/{chunk-GVGAO3WV.js → chunk-XJ2S5UBF.js} +3 -3
  173. package/dist/{chunk-IBJ6U753.js → chunk-XKZBZOKV.js} +4 -4
  174. package/dist/{chunk-65AUYLU3.js → chunk-XPXHQI6N.js} +2 -2
  175. package/dist/chunk-XRWWCW4H.js +102 -0
  176. package/dist/chunk-XRWWCW4H.js.map +1 -0
  177. package/dist/{chunk-HH5LY6RR.js → chunk-YIXJSW5M.js} +5 -5
  178. package/dist/{chunk-2JSDPUKD.js → chunk-YMFPFXEX.js} +2 -2
  179. package/dist/{chunk-N4KAE2NB.js → chunk-Z3FTSHT5.js} +3 -3
  180. package/dist/{chunk-7GLJMDEQ.js → chunk-ZDV5YWID.js} +6 -6
  181. package/dist/{chunk-645WOU5I.js → chunk-ZDZJNXL6.js} +4 -4
  182. package/dist/{chunk-6TCXIRP5.js → chunk-ZKE4CO6B.js} +4 -4
  183. package/dist/cli.js +303 -185
  184. package/dist/coding/export-okf-codegraph.js +29 -29
  185. package/dist/compounding/engine.js +23 -24
  186. package/dist/config.js +36 -37
  187. package/dist/connectors/codex-materialize-runner.js +20 -20
  188. package/dist/connectors/index.js +21 -21
  189. package/dist/connectors/live/google-drive.d.ts +2 -0
  190. package/dist/connectors/live/google-drive.d.ts.map +1 -1
  191. package/dist/consolidation-provenance-check.js +4 -4
  192. package/dist/consolidation-undo.js +5 -5
  193. package/dist/contradiction/index.js +7 -6
  194. package/dist/{contradiction-scan-P2MHYFVG.js → contradiction-scan-IBPYGQZF.js} +4 -3
  195. package/dist/convergence-refresh.js +22 -22
  196. package/dist/corpus-watermark.js +23 -23
  197. package/dist/deep-recall-http-glue.js +2 -2
  198. package/dist/deep-recall-policy-llm.js +4 -4
  199. package/dist/direct-answer-wiring.js +2 -2
  200. package/dist/embedding-fallback.js +1 -1
  201. package/dist/entity-retrieval.js +21 -21
  202. package/dist/eval-trajectory-store.js +2 -2
  203. package/dist/eval-trajectory.js +2 -2
  204. package/dist/event-order-recall.js +2 -2
  205. package/dist/explicit-capture.d.ts +3 -2
  206. package/dist/explicit-capture.d.ts.map +1 -1
  207. package/dist/explicit-capture.js +530 -6
  208. package/dist/explicit-cue-recall.js +2 -2
  209. package/dist/external-wiki-access.js +2 -283
  210. package/dist/extraction-faithfulness.js +4 -4
  211. package/dist/extraction-judge.js +5 -5
  212. package/dist/extraction-normalization.js +1 -1
  213. package/dist/extraction-quote-grounding.d.ts.map +1 -1
  214. package/dist/extraction-quote-grounding.js +1 -1
  215. package/dist/extraction-source-grounding-rules.js +2 -2
  216. package/dist/extraction-source-grounding.js +3 -3
  217. package/dist/extraction.js +43 -44
  218. package/dist/fallback-llm-codex-subscription.js +2 -2
  219. package/dist/fallback-llm.js +3 -3
  220. package/dist/{first-start-migration-QFI7B5SH.js → first-start-migration-FILJH3RO.js} +6 -5
  221. package/dist/{first-start-migration-QFI7B5SH.js.map → first-start-migration-FILJH3RO.js.map} +1 -1
  222. package/dist/focused-list-recall.js +2 -2
  223. package/dist/harmonic-retrieval.js +20 -20
  224. package/dist/index.js +773 -794
  225. package/dist/lcm/index.js +2 -2
  226. package/dist/live-connectors-runner.js +2 -3
  227. package/dist/local-llm-config.js +2 -2
  228. package/dist/local-llm-helpers.d.ts +4 -0
  229. package/dist/local-llm-helpers.d.ts.map +1 -1
  230. package/dist/local-llm-helpers.js +3 -1
  231. package/dist/local-llm.d.ts +4 -1
  232. package/dist/local-llm.d.ts.map +1 -1
  233. package/dist/local-llm.js +4 -4
  234. package/dist/location/index.js +27 -29
  235. package/dist/maintenance/memory-governance.js +20 -20
  236. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +20 -20
  237. package/dist/maintenance/rebuild-memory-projection-runner.js +22 -22
  238. package/dist/maintenance/rebuild-memory-projection.js +21 -21
  239. package/dist/memory-browse-operations.js +2 -283
  240. package/dist/memory-browse.js +8 -7
  241. package/dist/memory-controller.js +2 -2
  242. package/dist/memory-subject.js +2 -2
  243. package/dist/namespaces/migrate.js +21 -21
  244. package/dist/namespaces/search.js +5 -5
  245. package/dist/namespaces/storage.js +20 -20
  246. package/dist/offline-sync-changeset-generations.js +1 -1
  247. package/dist/offline-sync-embedding-generation.js +1 -1
  248. package/dist/offline-sync-impression-drain.js +6 -6
  249. package/dist/offline-sync-snapshot-stream.js +1 -1
  250. package/dist/offline-sync.js +1 -1
  251. package/dist/operator-doctor-corpus.js +24 -24
  252. package/dist/operator-toolkit.js +58 -61
  253. package/dist/orchestration/backlog-scheduler.js +278 -294
  254. package/dist/orchestration/backlog-scheduler.js.map +1 -1
  255. package/dist/orchestration/buffer-drain-runner.js +278 -294
  256. package/dist/orchestration/extraction-run.d.ts +4 -0
  257. package/dist/orchestration/extraction-run.d.ts.map +1 -1
  258. package/dist/orchestration/fact-dedup-window.d.ts +1 -1
  259. package/dist/orchestration/fact-dedup-window.d.ts.map +1 -1
  260. package/dist/orchestration/maintenance.js +39 -42
  261. package/dist/orchestrator.d.ts +9 -11
  262. package/dist/orchestrator.d.ts.map +1 -1
  263. package/dist/orchestrator.js +290 -307
  264. package/dist/page-versioning.js +3 -3
  265. package/dist/qmd-daemon-session.js +2 -2
  266. package/dist/qmd.js +3 -3
  267. package/dist/recall-explain-renderer.js +1 -1
  268. package/dist/recall-navigation-operations.js +2 -283
  269. package/dist/recall-navigation.js +332 -59
  270. package/dist/recall-planner-llm.js +3 -3
  271. package/dist/recall-state-view-admission.js +6 -6
  272. package/dist/recall-why-service.js +10 -9
  273. package/dist/recall-why.js +4 -3
  274. package/dist/recall-xray-cli.js +2 -2
  275. package/dist/recall-xray-renderer.js +1 -1
  276. package/dist/reconcile/manifest.js +3 -3
  277. package/dist/{resolution-N7H3F2E4.js → resolution-OVVIF7ZY.js} +8 -7
  278. package/dist/response-guidance-recall.js +2 -2
  279. package/dist/resume-bundles.js +40 -41
  280. package/dist/salvage-envelope.js +4 -4
  281. package/dist/search/factory.js +4 -4
  282. package/dist/search/index.js +4 -4
  283. package/dist/semantic-consolidation.js +23 -23
  284. package/dist/semantic-rule-promotion.js +20 -20
  285. package/dist/semantic-rule-verifier.js +20 -20
  286. package/dist/shared-context/manager.js +2 -3
  287. package/dist/source-agent-qualifier.js +32 -33
  288. package/dist/standup/build.js +20 -20
  289. package/dist/storage/buffer-drain-claims.d.ts +97 -12
  290. package/dist/storage/buffer-drain-claims.d.ts.map +1 -1
  291. package/dist/storage/buffer-drain-claims.js +1 -1
  292. package/dist/storage/buffer-session-files.d.ts +4 -0
  293. package/dist/storage/buffer-session-files.d.ts.map +1 -1
  294. package/dist/storage/buffer-session-files.js +1 -1
  295. package/dist/storage/content-hash-index.d.ts +10 -0
  296. package/dist/storage/content-hash-index.d.ts.map +1 -1
  297. package/dist/storage.d.ts.map +1 -1
  298. package/dist/storage.js +19 -19
  299. package/dist/subject-config.js +3 -3
  300. package/dist/summarizer.d.ts +4 -1
  301. package/dist/summarizer.d.ts.map +1 -1
  302. package/dist/summarizer.js +6 -6
  303. package/dist/support-passport/index.js +53 -297
  304. package/dist/targeted-fact-recall.js +2 -2
  305. package/dist/tier-routing.js +3 -2
  306. package/dist/{tier-stats-FQGQSFET.js → tier-stats-FXEUJN73.js} +6 -5
  307. package/dist/{tier-stats-FQGQSFET.js.map → tier-stats-FXEUJN73.js.map} +1 -1
  308. package/dist/transcript.js +2 -2
  309. package/dist/transfer/capsule-import.js +4 -4
  310. package/dist/transfer/export-okf.js +20 -20
  311. package/dist/verified-recall.js +20 -20
  312. package/dist/wearables/memory-gen.d.ts +5 -1
  313. package/dist/wearables/memory-gen.d.ts.map +1 -1
  314. package/dist/wearables/service.d.ts.map +1 -1
  315. package/dist/who-knows-cli.js +21 -21
  316. package/dist/who-knows.js +20 -20
  317. package/dist/write-envelope.js +3 -3
  318. package/package.json +2 -2
  319. package/src/access-boundary.ts +5 -1
  320. package/src/access-category-alias.test.ts +5 -0
  321. package/src/access-mcp-frames.test.ts +60 -5
  322. package/src/access-mcp-frames.ts +72 -18
  323. package/src/access-mcp.test.ts +66 -2
  324. package/src/access-mcp.ts +19 -13
  325. package/src/access-service-coding-write.test.ts +7 -0
  326. package/src/activity/journal-extract-storage.test.ts +31 -0
  327. package/src/activity/journal-extract.test.ts +1 -0
  328. package/src/activity/journal-extract.ts +24 -3
  329. package/src/buffer-drain-handover.test.ts +5 -1
  330. package/src/connectors/live/google-drive.test.ts +39 -0
  331. package/src/connectors/live/google-drive.ts +41 -12
  332. package/src/explicit-capture.test.ts +109 -17
  333. package/src/explicit-capture.ts +90 -37
  334. package/src/extraction-quote-grounding.test.ts +20 -0
  335. package/src/extraction-quote-grounding.ts +21 -11
  336. package/src/fact-dedup-window.test.ts +37 -0
  337. package/src/local-llm-helpers.ts +12 -0
  338. package/src/local-llm-shutdown.test.ts +194 -0
  339. package/src/local-llm.ts +32 -30
  340. package/src/orchestration/extraction-run.ts +12 -3
  341. package/src/orchestration/fact-dedup-window.ts +5 -1
  342. package/src/orchestrator-connector-dedup.test.ts +9 -5
  343. package/src/orchestrator.ts +47 -50
  344. package/src/storage/buffer-drain-claims.test.ts +385 -1
  345. package/src/storage/buffer-drain-claims.ts +380 -97
  346. package/src/storage/buffer-session-files.ts +4 -0
  347. package/src/storage/content-hash-index.ts +27 -2
  348. package/src/storage-fact-hash-publish-failure.test.ts +87 -0
  349. package/src/storage.ts +5 -1
  350. package/src/summarizer-shutdown.test.ts +195 -0
  351. package/src/summarizer.ts +15 -2
  352. package/src/wearables/memory-gen.test.ts +20 -0
  353. package/src/wearables/memory-gen.ts +14 -7
  354. package/src/wearables/service.ts +14 -1
  355. package/src/wearables/storage-io.test.ts +25 -0
  356. package/dist/chunk-2FGLEF7C.js +0 -61
  357. package/dist/chunk-2FGLEF7C.js.map +0 -1
  358. package/dist/chunk-3RLK65ZK.js +0 -203
  359. package/dist/chunk-3RLK65ZK.js.map +0 -1
  360. package/dist/chunk-4WR2OD7K.js +0 -43
  361. package/dist/chunk-4WR2OD7K.js.map +0 -1
  362. package/dist/chunk-5KBIOI4G.js.map +0 -1
  363. package/dist/chunk-5M5M22GW.js +0 -346
  364. package/dist/chunk-5M5M22GW.js.map +0 -1
  365. package/dist/chunk-7HTUYFR3.js.map +0 -1
  366. package/dist/chunk-AP6NCP3V.js.map +0 -1
  367. package/dist/chunk-B4QYQFGY.js.map +0 -1
  368. package/dist/chunk-BJRTMNCB.js +0 -1919
  369. package/dist/chunk-BJRTMNCB.js.map +0 -1
  370. package/dist/chunk-BRLXOZLM.js.map +0 -1
  371. package/dist/chunk-BSACVS6R.js +0 -621
  372. package/dist/chunk-BSACVS6R.js.map +0 -1
  373. package/dist/chunk-DKAA2IHQ.js +0 -3644
  374. package/dist/chunk-DKAA2IHQ.js.map +0 -1
  375. package/dist/chunk-E4IRW2FG.js.map +0 -1
  376. package/dist/chunk-E6M225BJ.js.map +0 -1
  377. package/dist/chunk-EQ4U73UH.js.map +0 -1
  378. package/dist/chunk-ETSJD5IV.js +0 -361
  379. package/dist/chunk-ETSJD5IV.js.map +0 -1
  380. package/dist/chunk-F55YQP7N.js +0 -336
  381. package/dist/chunk-F55YQP7N.js.map +0 -1
  382. package/dist/chunk-FHGWKODN.js +0 -2300
  383. package/dist/chunk-FHGWKODN.js.map +0 -1
  384. package/dist/chunk-FLRP63GU.js +0 -32219
  385. package/dist/chunk-FLRP63GU.js.map +0 -1
  386. package/dist/chunk-FSO3G4JJ.js.map +0 -1
  387. package/dist/chunk-ID6JGIMD.js +0 -25
  388. package/dist/chunk-ID6JGIMD.js.map +0 -1
  389. package/dist/chunk-IGLJNHOX.js +0 -62
  390. package/dist/chunk-IGLJNHOX.js.map +0 -1
  391. package/dist/chunk-IPT2OY4B.js.map +0 -1
  392. package/dist/chunk-IUKYFTGW.js.map +0 -1
  393. package/dist/chunk-NBH6K6G5.js.map +0 -1
  394. package/dist/chunk-NT7F7WJQ.js.map +0 -1
  395. package/dist/chunk-NTRUKAAE.js +0 -223
  396. package/dist/chunk-NTRUKAAE.js.map +0 -1
  397. package/dist/chunk-OGXXGHW6.js +0 -223
  398. package/dist/chunk-OGXXGHW6.js.map +0 -1
  399. package/dist/chunk-PPCLZ4JU.js +0 -28
  400. package/dist/chunk-PPCLZ4JU.js.map +0 -1
  401. package/dist/chunk-QJPJXCS4.js.map +0 -1
  402. package/dist/chunk-R2LBF4HH.js +0 -729
  403. package/dist/chunk-R2LBF4HH.js.map +0 -1
  404. package/dist/chunk-RHQLIHMB.js.map +0 -1
  405. package/dist/chunk-RRTVGD3J.js +0 -792
  406. package/dist/chunk-RRTVGD3J.js.map +0 -1
  407. package/dist/chunk-SUSW74WU.js.map +0 -1
  408. package/dist/chunk-T6OZW2WR.js.map +0 -1
  409. package/dist/chunk-UDKWFDV2.js.map +0 -1
  410. package/dist/chunk-V7IZKJI3.js +0 -22
  411. package/dist/chunk-V7IZKJI3.js.map +0 -1
  412. package/dist/chunk-X562NQFA.js +0 -10144
  413. package/dist/chunk-X562NQFA.js.map +0 -1
  414. package/dist/chunk-XDSCJOH7.js +0 -3991
  415. package/dist/chunk-XDSCJOH7.js.map +0 -1
  416. package/dist/chunk-YCNIGRRF.js.map +0 -1
  417. package/dist/chunk-ZTTCDQ4I.js +0 -18796
  418. package/dist/chunk-ZTTCDQ4I.js.map +0 -1
  419. /package/dist/{capsule-merge-2IIXFXN5.js.map → capsule-merge-6IDAYTKG.js.map} +0 -0
  420. /package/dist/{chunk-RGUUBAT5.js.map → chunk-2WCLTWV2.js.map} +0 -0
  421. /package/dist/{chunk-BQZEGOZ4.js.map → chunk-2YODOG2O.js.map} +0 -0
  422. /package/dist/{chunk-WYG5UNDY.js.map → chunk-3AUDELZL.js.map} +0 -0
  423. /package/dist/{chunk-MB6ZJDN6.js.map → chunk-3FBAEPCU.js.map} +0 -0
  424. /package/dist/{chunk-PIITB2YZ.js.map → chunk-3ZS3NUEI.js.map} +0 -0
  425. /package/dist/{chunk-ATPWZ4F7.js.map → chunk-4EZWSDFL.js.map} +0 -0
  426. /package/dist/{chunk-ANZZLRUX.js.map → chunk-4IVRQMZW.js.map} +0 -0
  427. /package/dist/{chunk-63E37JCN.js.map → chunk-4RAJT5L2.js.map} +0 -0
  428. /package/dist/{chunk-45VUHDV2.js.map → chunk-5CO5G4MN.js.map} +0 -0
  429. /package/dist/{chunk-LUJCQQ3L.js.map → chunk-65HWAQ4F.js.map} +0 -0
  430. /package/dist/{chunk-T67LUYCR.js.map → chunk-77NTFICT.js.map} +0 -0
  431. /package/dist/{chunk-UE6RRXMF.js.map → chunk-A4F7OIC5.js.map} +0 -0
  432. /package/dist/{chunk-RRJBDXAQ.js.map → chunk-B377OKUP.js.map} +0 -0
  433. /package/dist/{chunk-Z7JIZ42P.js.map → chunk-BN2EBCLB.js.map} +0 -0
  434. /package/dist/{chunk-YYOMGOHB.js.map → chunk-BOK6BN5M.js.map} +0 -0
  435. /package/dist/{chunk-U6UNF5ZS.js.map → chunk-BPK32FRM.js.map} +0 -0
  436. /package/dist/{chunk-OH7QLI6W.js.map → chunk-BPPUH5JM.js.map} +0 -0
  437. /package/dist/{chunk-O6ZSWHVR.js.map → chunk-C2KE5DMD.js.map} +0 -0
  438. /package/dist/{chunk-47F6WWLQ.js.map → chunk-C73N66PR.js.map} +0 -0
  439. /package/dist/{chunk-WRT7GJ2D.js.map → chunk-CIWMTNHW.js.map} +0 -0
  440. /package/dist/{chunk-HF3BKUVV.js.map → chunk-CL4JU3DF.js.map} +0 -0
  441. /package/dist/{chunk-O55EKIEC.js.map → chunk-D3ZKHLN2.js.map} +0 -0
  442. /package/dist/{chunk-ETZLQOUR.js.map → chunk-D5XG2KPS.js.map} +0 -0
  443. /package/dist/{chunk-CD4BCCNP.js.map → chunk-DJ7WVEWX.js.map} +0 -0
  444. /package/dist/{chunk-PWXPRVLK.js.map → chunk-DNY63QWJ.js.map} +0 -0
  445. /package/dist/{chunk-4CJTQHEG.js.map → chunk-ESLOLCD4.js.map} +0 -0
  446. /package/dist/{chunk-VILPVT4S.js.map → chunk-EZ47HOJ6.js.map} +0 -0
  447. /package/dist/{chunk-EFYN5I7Z.js.map → chunk-F4QFU5IZ.js.map} +0 -0
  448. /package/dist/{chunk-XYKBWTWI.js.map → chunk-FZZMLGWQ.js.map} +0 -0
  449. /package/dist/{chunk-FNXQZGUS.js.map → chunk-GBJUTX44.js.map} +0 -0
  450. /package/dist/{chunk-YLXETSAH.js.map → chunk-GCZJ7XRI.js.map} +0 -0
  451. /package/dist/{chunk-JV4S6VDH.js.map → chunk-ILY5SSOM.js.map} +0 -0
  452. /package/dist/{chunk-EXHXJETE.js.map → chunk-IQ55QGY5.js.map} +0 -0
  453. /package/dist/{chunk-4J363OAA.js.map → chunk-J7BIFOYP.js.map} +0 -0
  454. /package/dist/{chunk-QFEDITXM.js.map → chunk-JNDMIAJ4.js.map} +0 -0
  455. /package/dist/{chunk-E5PPE4VA.js.map → chunk-K2VRKCPA.js.map} +0 -0
  456. /package/dist/{chunk-MKRYQROF.js.map → chunk-LGEHAQHK.js.map} +0 -0
  457. /package/dist/{chunk-XYTQJD7F.js.map → chunk-LMJVP5CM.js.map} +0 -0
  458. /package/dist/{chunk-E7YZXWIS.js.map → chunk-LNGELD2M.js.map} +0 -0
  459. /package/dist/{chunk-FQKBJJYB.js.map → chunk-LPV72KRQ.js.map} +0 -0
  460. /package/dist/{chunk-2LCRG2YV.js.map → chunk-M2XR6B6V.js.map} +0 -0
  461. /package/dist/{chunk-ZU5JDLOH.js.map → chunk-MMRTPH3J.js.map} +0 -0
  462. /package/dist/{chunk-TVIVY7KU.js.map → chunk-NED7IR7B.js.map} +0 -0
  463. /package/dist/{chunk-6F5MJFXY.js.map → chunk-NHVAX7MH.js.map} +0 -0
  464. /package/dist/{chunk-TG3R2SID.js.map → chunk-NMGHGTVR.js.map} +0 -0
  465. /package/dist/{chunk-NGHDW6UU.js.map → chunk-NUQEREIP.js.map} +0 -0
  466. /package/dist/{chunk-5IIQU4JZ.js.map → chunk-OB72KNMF.js.map} +0 -0
  467. /package/dist/{chunk-RIMK327Y.js.map → chunk-OUVYYKYU.js.map} +0 -0
  468. /package/dist/{chunk-RWGRSKN5.js.map → chunk-PT4DZDJA.js.map} +0 -0
  469. /package/dist/{chunk-7EPY3IQL.js.map → chunk-PZJQ46DH.js.map} +0 -0
  470. /package/dist/{chunk-MXHMNKWG.js.map → chunk-QDESY76F.js.map} +0 -0
  471. /package/dist/{chunk-E3A7ELSG.js.map → chunk-QHARXWTC.js.map} +0 -0
  472. /package/dist/{chunk-BLJT6JP2.js.map → chunk-QMFAMOT2.js.map} +0 -0
  473. /package/dist/{chunk-I6QGI65T.js.map → chunk-QRMG4HK4.js.map} +0 -0
  474. /package/dist/{chunk-ZU3NJNO7.js.map → chunk-QSF5SJAM.js.map} +0 -0
  475. /package/dist/{chunk-5IYOKDM4.js.map → chunk-R23JWJD3.js.map} +0 -0
  476. /package/dist/{chunk-P4WNBSTW.js.map → chunk-RNG7S3FY.js.map} +0 -0
  477. /package/dist/{chunk-ZGFLIK5H.js.map → chunk-SPAKBUJY.js.map} +0 -0
  478. /package/dist/{chunk-ER7XANP3.js.map → chunk-SQ3GEIEL.js.map} +0 -0
  479. /package/dist/{chunk-PMJFRDJI.js.map → chunk-SUTEBYGI.js.map} +0 -0
  480. /package/dist/{chunk-R6HMAIKM.js.map → chunk-TOSPNM4T.js.map} +0 -0
  481. /package/dist/{chunk-RMXS4I66.js.map → chunk-TVDJEUV5.js.map} +0 -0
  482. /package/dist/{chunk-PLCYKAWH.js.map → chunk-TYRWSE4B.js.map} +0 -0
  483. /package/dist/{chunk-IQWUACVG.js.map → chunk-UHMHJX5G.js.map} +0 -0
  484. /package/dist/{chunk-YODUDA6R.js.map → chunk-UN4RVUG2.js.map} +0 -0
  485. /package/dist/{chunk-E6Z4FBX6.js.map → chunk-V2QSNFCT.js.map} +0 -0
  486. /package/dist/{chunk-7W3RXOIG.js.map → chunk-WGGRZYSQ.js.map} +0 -0
  487. /package/dist/{chunk-RIZ5NUNN.js.map → chunk-WQ4XKIOX.js.map} +0 -0
  488. /package/dist/{chunk-QEYTRFR3.js.map → chunk-X26YOFGS.js.map} +0 -0
  489. /package/dist/{chunk-ITHZFHST.js.map → chunk-X2BVB74H.js.map} +0 -0
  490. /package/dist/{chunk-6F42QONS.js.map → chunk-X5HGU2EM.js.map} +0 -0
  491. /package/dist/{chunk-GVGAO3WV.js.map → chunk-XJ2S5UBF.js.map} +0 -0
  492. /package/dist/{chunk-IBJ6U753.js.map → chunk-XKZBZOKV.js.map} +0 -0
  493. /package/dist/{chunk-65AUYLU3.js.map → chunk-XPXHQI6N.js.map} +0 -0
  494. /package/dist/{chunk-HH5LY6RR.js.map → chunk-YIXJSW5M.js.map} +0 -0
  495. /package/dist/{chunk-2JSDPUKD.js.map → chunk-YMFPFXEX.js.map} +0 -0
  496. /package/dist/{chunk-N4KAE2NB.js.map → chunk-Z3FTSHT5.js.map} +0 -0
  497. /package/dist/{chunk-7GLJMDEQ.js.map → chunk-ZDV5YWID.js.map} +0 -0
  498. /package/dist/{chunk-645WOU5I.js.map → chunk-ZDZJNXL6.js.map} +0 -0
  499. /package/dist/{chunk-6TCXIRP5.js.map → chunk-ZKE4CO6B.js.map} +0 -0
  500. /package/dist/{contradiction-scan-P2MHYFVG.js.map → contradiction-scan-IBPYGQZF.js.map} +0 -0
  501. /package/dist/{resolution-N7H3F2E4.js.map → resolution-OVVIF7ZY.js.map} +0 -0
@@ -1,729 +0,0 @@
1
- import {
2
- hasMemoryData
3
- } from "./chunk-BRLXOZLM.js";
4
- import {
5
- resolveNamespaceStorageRoot
6
- } from "./chunk-E3A7ELSG.js";
7
- import {
8
- getConfiguredNamespaces
9
- } from "./chunk-I6QGI65T.js";
10
- import {
11
- displayErrorDetail
12
- } from "./chunk-RL6NEVXT.js";
13
- import {
14
- namespaceIdentityToken
15
- } from "./chunk-VUFL7X3H.js";
16
- import {
17
- resolveConversationContextCapabilities,
18
- resolveNamespaceCapabilities
19
- } from "./chunk-C5LWPYS3.js";
20
-
21
- // src/maintenance/namespace-planner.ts
22
- import { createHash, randomUUID } from "crypto";
23
- import { lstat, mkdir, open, readFile, readdir, rename, rm, rmdir, utimes, writeFile } from "fs/promises";
24
- import path from "path";
25
- var DEFAULT_MAX_NAMESPACES_PER_CYCLE = 20;
26
- var DEFAULT_LOCK_STALE_MS = 10 * 6e4;
27
- var LOCK_BASE = "maintenance-locks";
28
- var STATUS_BASE = "namespace-maintenance-status";
29
- var namespaceMaintenanceFs = { open, rm };
30
- function inferConfiguredKind(config, namespace) {
31
- if (namespace === config.defaultNamespace.trim()) return "default";
32
- if (namespace === config.sharedNamespace.trim()) return "shared";
33
- return "explicit";
34
- }
35
- function maxNamespacesPerCycle(config) {
36
- return Math.max(
37
- 1,
38
- Math.floor(
39
- typeof config.maintenanceMaxNamespacesPerCycle === "number" && Number.isFinite(config.maintenanceMaxNamespacesPerCycle) ? config.maintenanceMaxNamespacesPerCycle : DEFAULT_MAX_NAMESPACES_PER_CYCLE
40
- )
41
- );
42
- }
43
- function namespaceKindAllowed(config, kind) {
44
- switch (kind) {
45
- case "branch":
46
- return config.maintenanceIncludeBranchNamespaces === true;
47
- case "project":
48
- return config.maintenanceIncludeProjectNamespaces !== false;
49
- case "team-project":
50
- return config.maintenanceIncludeTeamProjectNamespaces !== false;
51
- default:
52
- return true;
53
- }
54
- }
55
- function disabledReasonForKind(kind) {
56
- if (kind === "branch") return "branch_disabled";
57
- if (kind === "project") return "project_disabled";
58
- if (kind === "team-project") return "team_project_disabled";
59
- return "fanout_disabled";
60
- }
61
- async function catalogRootIsLive(config, record) {
62
- if (typeof record.storageDir !== "string" || record.storageDir.length === 0) {
63
- return false;
64
- }
65
- try {
66
- const liveRoot = await resolveNamespaceStorageRoot(config, record.namespace);
67
- if (path.resolve(liveRoot) !== path.resolve(record.storageDir)) return false;
68
- return hasMemoryData(liveRoot);
69
- } catch {
70
- return false;
71
- }
72
- }
73
- function candidateSortKey(candidate) {
74
- const write = candidate.lastWriteAt ?? "";
75
- return `${write}\0${candidate.namespace}`;
76
- }
77
- function candidatePriority(candidate) {
78
- if (candidate.kind === "default") return 0;
79
- if (candidate.kind === "shared") return 1;
80
- if (candidate.source === "configured") return 2;
81
- if (candidate.kind === "team-project") return 3;
82
- if (candidate.kind === "project") return 4;
83
- if (candidate.kind === "branch") return 8;
84
- return 7;
85
- }
86
- function sortCandidates(a, b) {
87
- const priority = candidatePriority(a) - candidatePriority(b);
88
- if (priority !== 0) return priority;
89
- const am = Date.parse(a.lastMaintenanceAt ?? "");
90
- const bm = Date.parse(b.lastMaintenanceAt ?? "");
91
- const aMaintained = Number.isFinite(am);
92
- const bMaintained = Number.isFinite(bm);
93
- if (aMaintained && bMaintained && am !== bm) return am - bm;
94
- if (aMaintained !== bMaintained) return aMaintained ? 1 : -1;
95
- const aw = Date.parse(a.lastWriteAt ?? "");
96
- const bw = Date.parse(b.lastWriteAt ?? "");
97
- const aValid = Number.isFinite(aw);
98
- const bValid = Number.isFinite(bw);
99
- if (aValid && bValid && aw !== bw) return bw - aw;
100
- if (aValid !== bValid) return aValid ? -1 : 1;
101
- const byKey = candidateSortKey(a).localeCompare(candidateSortKey(b));
102
- if (byKey !== 0) return byKey;
103
- return a.namespace.localeCompare(b.namespace);
104
- }
105
- async function planNamespaceMaintenance(config, options) {
106
- const generatedAt = (options.now ?? /* @__PURE__ */ new Date()).toISOString();
107
- const configured = resolveNamespaceCapabilities(config).namespaces ? getConfiguredNamespaces(config) : [config.defaultNamespace.trim()].filter(Boolean);
108
- const byNamespace = /* @__PURE__ */ new Map();
109
- const skipped = [];
110
- for (const namespace of configured) {
111
- const kind = inferConfiguredKind(config, namespace);
112
- byNamespace.set(namespace, {
113
- namespace,
114
- kind,
115
- source: "configured"
116
- });
117
- }
118
- if (resolveNamespaceCapabilities(config).namespaces && resolveConversationContextCapabilities(config).maintenanceNamespaceFanout !== false) {
119
- const configuredSet = new Set(configured);
120
- try {
121
- const records = options.catalog?.enabled ? await options.catalog.listNamespaces(void 0, {
122
- onIncomplete: (reason) => skipped.push({ namespace: "*", reason: "catalog_read_failed", detail: reason })
123
- }) : [];
124
- for (const record of records) {
125
- const namespace = record.namespace.trim();
126
- if (!namespace) continue;
127
- const isConfigured = configuredSet.has(namespace);
128
- const kind = isConfigured ? inferConfiguredKind(config, namespace) : record.kind;
129
- if (!namespaceKindAllowed(config, kind)) {
130
- skipped.push({
131
- namespace,
132
- kind,
133
- reason: disabledReasonForKind(kind)
134
- });
135
- continue;
136
- }
137
- if (!isConfigured && !await catalogRootIsLive(config, record)) {
138
- skipped.push({
139
- namespace,
140
- kind,
141
- reason: "unsafe_or_stale_root"
142
- });
143
- continue;
144
- }
145
- byNamespace.set(namespace, {
146
- namespace,
147
- kind,
148
- storageDir: record.storageDir,
149
- source: isConfigured ? "configured" : "catalog",
150
- lastWriteAt: record.lastWriteAt,
151
- lastMaintenanceAt: record.lastMaintenanceAt?.[options.jobName]
152
- });
153
- }
154
- } catch (error) {
155
- skipped.push({
156
- namespace: "*",
157
- reason: "catalog_read_failed",
158
- detail: error instanceof Error ? error.message : String(error)
159
- });
160
- }
161
- } else if (resolveNamespaceCapabilities(config).namespaces) {
162
- skipped.push({
163
- namespace: "*",
164
- reason: "fanout_disabled"
165
- });
166
- }
167
- if (options.budgetMode !== "unbounded") {
168
- const latestStatusAtByNamespace = await readLatestStatusAtByNamespace(config, options.jobName);
169
- for (const candidate of byNamespace.values()) {
170
- if (!candidate.lastMaintenanceAt) {
171
- candidate.lastMaintenanceAt = latestStatusAtByNamespace.get(candidate.namespace);
172
- }
173
- }
174
- }
175
- const candidates = [...byNamespace.values()].filter((candidate) => namespaceKindAllowed(config, candidate.kind)).sort(sortCandidates);
176
- const max = maxNamespacesPerCycle(config);
177
- const applyCycleBudget = options.budgetMode !== "unbounded";
178
- const selected = applyCycleBudget ? candidates.slice(0, max) : candidates;
179
- if (applyCycleBudget) {
180
- for (const candidate of candidates.slice(max)) {
181
- skipped.push({
182
- namespace: candidate.namespace,
183
- kind: candidate.kind,
184
- reason: "budget_exhausted"
185
- });
186
- }
187
- }
188
- return {
189
- jobName: options.jobName,
190
- generatedAt,
191
- namespaces: selected,
192
- skipped,
193
- budget: {
194
- maxNamespacesPerCycle: max,
195
- selected: selected.length
196
- }
197
- };
198
- }
199
- function stablePathSegment(value) {
200
- const sanitized = value.replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 128) || "unnamed";
201
- if (sanitized.length <= 128 && sanitized === value) return sanitized;
202
- return `${sanitized.slice(0, 80)}-${createHash("sha256").update(value).digest("hex").slice(0, 16)}`;
203
- }
204
- function namespacePathSegment(namespace) {
205
- const token = namespaceIdentityToken(namespace);
206
- if (token.length <= 160) return token;
207
- return `ns-${createHash("sha256").update(namespace).digest("hex")}`;
208
- }
209
- function lockPath(config, jobName, namespace) {
210
- return path.join(
211
- config.memoryDir,
212
- "state",
213
- LOCK_BASE,
214
- stablePathSegment(jobName),
215
- `${namespacePathSegment(namespace)}.lock`
216
- );
217
- }
218
- function namespaceMaintenanceLockStaleMs(config) {
219
- if (typeof config.maintenanceNamespaceLockStaleMs === "number" && Number.isFinite(config.maintenanceNamespaceLockStaleMs) && config.maintenanceNamespaceLockStaleMs > 0) {
220
- return Math.floor(config.maintenanceNamespaceLockStaleMs);
221
- }
222
- return DEFAULT_LOCK_STALE_MS;
223
- }
224
- function namespaceMaintenanceLockHeartbeatMs(config) {
225
- const staleMs = namespaceMaintenanceLockStaleMs(config);
226
- return Math.max(1, Math.min(3e4, Math.floor(staleMs / 3) || 1));
227
- }
228
- function errorCode(error) {
229
- return typeof error === "object" && error !== null && "code" in error ? error.code : void 0;
230
- }
231
- async function withNamespaceMaintenanceLockHeartbeat(config, locks, task) {
232
- const activeLocks = Array.isArray(locks) ? locks : [locks];
233
- const interval = setInterval(() => {
234
- for (const lock of activeLocks) {
235
- void lock.touch().catch(() => void 0);
236
- }
237
- }, namespaceMaintenanceLockHeartbeatMs(config));
238
- interval.unref?.();
239
- try {
240
- return await task();
241
- } finally {
242
- clearInterval(interval);
243
- }
244
- }
245
- async function removeStaleLockDirectory(filePath) {
246
- let entries;
247
- try {
248
- entries = await readdir(filePath, { withFileTypes: true });
249
- } catch (error) {
250
- if (errorCode(error) === "ENOENT") return;
251
- throw error;
252
- }
253
- for (const entry of entries) {
254
- if (!entry.isFile()) continue;
255
- await namespaceMaintenanceFs.rm(path.join(filePath, entry.name), { force: true });
256
- }
257
- try {
258
- await rmdir(filePath);
259
- } catch (error) {
260
- if (errorCode(error) === "ENOENT") return;
261
- throw error;
262
- }
263
- }
264
- async function tryAcquireNamespaceMaintenanceLock(config, jobName, namespace) {
265
- const filePath = lockPath(config, jobName, namespace);
266
- await mkdir(path.dirname(filePath), { recursive: true });
267
- try {
268
- const lockId = randomUUID();
269
- await mkdir(filePath);
270
- const ownerPath = path.join(filePath, `${lockId}.json`);
271
- let handle;
272
- try {
273
- handle = await namespaceMaintenanceFs.open(ownerPath, "wx");
274
- await handle.writeFile(
275
- `${JSON.stringify({
276
- lockId,
277
- pid: process.pid,
278
- jobName,
279
- namespace,
280
- acquiredAt: (/* @__PURE__ */ new Date()).toISOString()
281
- })}
282
- `,
283
- "utf8"
284
- );
285
- await handle.close();
286
- } catch (setupError) {
287
- await handle?.close().catch(() => void 0);
288
- await namespaceMaintenanceFs.rm(ownerPath, { force: true }).catch(() => void 0);
289
- await rmdir(filePath).catch(() => void 0);
290
- throw setupError;
291
- }
292
- return {
293
- path: filePath,
294
- async touch() {
295
- try {
296
- const parsed = JSON.parse(await readFile(ownerPath, "utf8"));
297
- if (parsed.lockId === lockId) {
298
- const now = /* @__PURE__ */ new Date();
299
- await utimes(ownerPath, now, now);
300
- await utimes(filePath, now, now);
301
- }
302
- } catch {
303
- }
304
- },
305
- async release() {
306
- try {
307
- const parsed = JSON.parse(await readFile(ownerPath, "utf8"));
308
- if (parsed.lockId === lockId) {
309
- await namespaceMaintenanceFs.rm(ownerPath, { force: true });
310
- await rmdir(filePath).catch(() => void 0);
311
- }
312
- } catch {
313
- }
314
- }
315
- };
316
- } catch (error) {
317
- if (errorCode(error) === "EEXIST") {
318
- const staleMs = namespaceMaintenanceLockStaleMs(config);
319
- try {
320
- const s = await lstat(filePath);
321
- if (s.isSymbolicLink()) {
322
- return null;
323
- }
324
- if ((s.isFile() || s.isDirectory()) && Date.now() - s.mtimeMs > staleMs) {
325
- try {
326
- if (s.isDirectory()) {
327
- await removeStaleLockDirectory(filePath);
328
- } else {
329
- await namespaceMaintenanceFs.rm(filePath, { force: true });
330
- }
331
- } catch (removeError) {
332
- if (errorCode(removeError) === "ENOENT") {
333
- return tryAcquireNamespaceMaintenanceLock(config, jobName, namespace);
334
- }
335
- if (errorCode(removeError) === "ENOTEMPTY") {
336
- return null;
337
- }
338
- throw removeError;
339
- }
340
- return tryAcquireNamespaceMaintenanceLock(config, jobName, namespace);
341
- }
342
- } catch (statError) {
343
- if (errorCode(statError) === "ENOENT") {
344
- return tryAcquireNamespaceMaintenanceLock(config, jobName, namespace);
345
- }
346
- throw statError;
347
- }
348
- return null;
349
- }
350
- throw error;
351
- }
352
- }
353
- function statusBasePath(config) {
354
- return path.join(config.memoryDir, "state", STATUS_BASE);
355
- }
356
- function statusPath(config, jobName, namespace) {
357
- return path.join(statusBasePath(config), stablePathSegment(jobName), `${namespacePathSegment(namespace)}.json`);
358
- }
359
- function lastRanStatusPath(config, jobName, namespace) {
360
- return path.join(statusBasePath(config), stablePathSegment(jobName), `${namespacePathSegment(namespace)}.last-ran.json`);
361
- }
362
- function parseStatus(value) {
363
- if (!value || typeof value !== "object" || Array.isArray(value)) return null;
364
- const v = value;
365
- if (typeof v.namespace === "string" && typeof v.jobName === "string" && (v.state === "ran" || v.state === "skipped" || v.state === "failed") && typeof v.startedAt === "string" && typeof v.completedAt === "string") {
366
- return v;
367
- }
368
- return null;
369
- }
370
- async function readLatestStatusAtByNamespace(config, jobName) {
371
- const latest = /* @__PURE__ */ new Map();
372
- const latestMs = /* @__PURE__ */ new Map();
373
- for (const status of [...await readStatusFiles(config), ...await readLastRanStatusFiles(config)]) {
374
- if (status.state !== "ran") continue;
375
- if (status.jobName !== jobName) continue;
376
- const completedAtMs = Date.parse(status.completedAt);
377
- if (!Number.isFinite(completedAtMs)) continue;
378
- const previousMs = latestMs.get(status.namespace);
379
- if (previousMs !== void 0 && previousMs >= completedAtMs) continue;
380
- latestMs.set(status.namespace, completedAtMs);
381
- latest.set(status.namespace, status.completedAt);
382
- }
383
- return latest;
384
- }
385
- async function readStatusFile(filePath) {
386
- try {
387
- const parsed = JSON.parse(await readFile(filePath, "utf8"));
388
- return parseStatus(parsed);
389
- } catch {
390
- return null;
391
- }
392
- }
393
- async function readStatusFiles(config) {
394
- if (typeof config.memoryDir !== "string" || config.memoryDir.length === 0) {
395
- return [];
396
- }
397
- const root = statusBasePath(config);
398
- const statuses = [];
399
- let jobDirs;
400
- try {
401
- jobDirs = await readdir(root, { withFileTypes: true });
402
- } catch {
403
- return statuses;
404
- }
405
- for (const jobDir of jobDirs) {
406
- if (!jobDir.isDirectory()) continue;
407
- let files;
408
- try {
409
- files = await readdir(path.join(root, jobDir.name), { withFileTypes: true });
410
- } catch {
411
- continue;
412
- }
413
- for (const file of files) {
414
- if (!file.isFile() || !file.name.endsWith(".json")) continue;
415
- if (file.name.endsWith(".last-ran.json")) continue;
416
- const status = await readStatusFile(path.join(root, jobDir.name, file.name));
417
- if (status) statuses.push(status);
418
- }
419
- }
420
- return statuses;
421
- }
422
- async function readLastRanStatusFiles(config) {
423
- if (typeof config.memoryDir !== "string" || config.memoryDir.length === 0) {
424
- return [];
425
- }
426
- const root = statusBasePath(config);
427
- const statuses = [];
428
- let jobDirs;
429
- try {
430
- jobDirs = await readdir(root, { withFileTypes: true });
431
- } catch {
432
- return statuses;
433
- }
434
- for (const jobDir of jobDirs) {
435
- if (!jobDir.isDirectory()) continue;
436
- let files;
437
- try {
438
- files = await readdir(path.join(root, jobDir.name), { withFileTypes: true });
439
- } catch {
440
- continue;
441
- }
442
- for (const file of files) {
443
- if (!file.isFile() || !file.name.endsWith(".last-ran.json")) continue;
444
- const status = await readStatusFile(path.join(root, jobDir.name, file.name));
445
- if (status) statuses.push(status);
446
- }
447
- }
448
- return statuses;
449
- }
450
- async function writeStatusPayload(target, status) {
451
- const dir = path.dirname(target);
452
- await mkdir(dir, { recursive: true });
453
- const temp = `${target}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;
454
- const payload = {
455
- version: 1,
456
- ...status
457
- };
458
- await writeFile(temp, `${JSON.stringify(payload, null, 2)}
459
- `, "utf8");
460
- await rename(temp, target);
461
- }
462
- async function writeStatusFile(config, status) {
463
- await writeStatusPayload(statusPath(config, status.jobName, status.namespace), status);
464
- if (status.state === "ran") {
465
- await writeStatusPayload(lastRanStatusPath(config, status.jobName, status.namespace), status);
466
- }
467
- }
468
- async function recordNamespaceMaintenanceStatusSafely(config, status) {
469
- try {
470
- await writeStatusFile(config, status);
471
- } catch {
472
- }
473
- }
474
- function maintenanceErrorDetail(error) {
475
- return displayErrorDetail(error) || "Error";
476
- }
477
- async function readNamespaceMaintenanceStatuses(config) {
478
- return (await readStatusFiles(config)).sort((a, b) => {
479
- const byJob = a.jobName.localeCompare(b.jobName);
480
- if (byJob !== 0) return byJob;
481
- return a.namespace.localeCompare(b.namespace);
482
- });
483
- }
484
- async function readNamespaceMaintenanceLastRanStatuses(config) {
485
- return (await readLastRanStatusFiles(config)).sort((a, b) => {
486
- const byJob = a.jobName.localeCompare(b.jobName);
487
- if (byJob !== 0) return byJob;
488
- return a.namespace.localeCompare(b.namespace);
489
- });
490
- }
491
- async function runNamespaceMaintenancePlan(config, plan, runner, catalog) {
492
- const statuses = [];
493
- for (const skipped of plan.skipped) {
494
- if (skipped.namespace === "*") continue;
495
- const now = (/* @__PURE__ */ new Date()).toISOString();
496
- const status = {
497
- namespace: skipped.namespace,
498
- jobName: plan.jobName,
499
- state: "skipped",
500
- reason: skipped.reason,
501
- startedAt: now,
502
- completedAt: now
503
- };
504
- statuses.push(status);
505
- await recordNamespaceMaintenanceStatusSafely(config, status);
506
- }
507
- for (const candidate of plan.namespaces) {
508
- const startedAt = (/* @__PURE__ */ new Date()).toISOString();
509
- const lock = await tryAcquireNamespaceMaintenanceLock(config, plan.jobName, candidate.namespace);
510
- if (!lock) {
511
- const completedAt = (/* @__PURE__ */ new Date()).toISOString();
512
- const status = {
513
- namespace: candidate.namespace,
514
- jobName: plan.jobName,
515
- state: "skipped",
516
- reason: "lock_held",
517
- startedAt,
518
- completedAt
519
- };
520
- statuses.push(status);
521
- await recordNamespaceMaintenanceStatusSafely(config, status);
522
- continue;
523
- }
524
- try {
525
- const result = await withNamespaceMaintenanceLockHeartbeat(config, lock, () => runner(candidate));
526
- const completedAt = (/* @__PURE__ */ new Date()).toISOString();
527
- if (result?.skipped) {
528
- const status = {
529
- namespace: candidate.namespace,
530
- jobName: plan.jobName,
531
- state: "skipped",
532
- reason: result.skipReason ?? "throttled",
533
- startedAt,
534
- completedAt
535
- };
536
- statuses.push(status);
537
- await recordNamespaceMaintenanceStatusSafely(config, status);
538
- } else {
539
- const status = {
540
- namespace: candidate.namespace,
541
- jobName: plan.jobName,
542
- state: "ran",
543
- startedAt,
544
- completedAt,
545
- itemCount: result?.itemCount
546
- };
547
- statuses.push(status);
548
- await recordNamespaceMaintenanceStatusSafely(config, status);
549
- try {
550
- await catalog?.markMaintenance(candidate.namespace, plan.jobName, new Date(completedAt));
551
- } catch {
552
- }
553
- }
554
- } catch (error) {
555
- const completedAt = (/* @__PURE__ */ new Date()).toISOString();
556
- const status = {
557
- namespace: candidate.namespace,
558
- jobName: plan.jobName,
559
- state: "failed",
560
- reason: "job_failed",
561
- startedAt,
562
- completedAt,
563
- error: maintenanceErrorDetail(error)
564
- };
565
- statuses.push(status);
566
- await recordNamespaceMaintenanceStatusSafely(config, status);
567
- } finally {
568
- await lock.release().catch(() => void 0);
569
- }
570
- }
571
- return {
572
- jobName: plan.jobName,
573
- generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
574
- ran: statuses.filter((s) => s.state === "ran").length,
575
- skipped: statuses.filter((s) => s.state === "skipped").length,
576
- failed: statuses.filter((s) => s.state === "failed").length,
577
- statuses
578
- };
579
- }
580
- async function runNamespaceMaintenanceBatchPlan(config, plan, runner, catalog, options = {}) {
581
- const statuses = [];
582
- for (const skipped of plan.skipped) {
583
- if (skipped.namespace === "*") continue;
584
- const now = (/* @__PURE__ */ new Date()).toISOString();
585
- const status = {
586
- namespace: skipped.namespace,
587
- jobName: plan.jobName,
588
- state: "skipped",
589
- reason: skipped.reason,
590
- startedAt: now,
591
- completedAt: now
592
- };
593
- statuses.push(status);
594
- await recordNamespaceMaintenanceStatusSafely(config, status);
595
- }
596
- const acquired = [];
597
- try {
598
- for (const candidate of plan.namespaces) {
599
- const startedAt = (/* @__PURE__ */ new Date()).toISOString();
600
- const lock = await tryAcquireNamespaceMaintenanceLock(config, plan.jobName, candidate.namespace);
601
- if (!lock) {
602
- const completedAt = (/* @__PURE__ */ new Date()).toISOString();
603
- const status = {
604
- namespace: candidate.namespace,
605
- jobName: plan.jobName,
606
- state: "skipped",
607
- reason: "lock_held",
608
- startedAt,
609
- completedAt
610
- };
611
- statuses.push(status);
612
- await recordNamespaceMaintenanceStatusSafely(config, status);
613
- continue;
614
- }
615
- acquired.push({ candidate, lock, startedAt });
616
- }
617
- } catch (error) {
618
- await Promise.all(acquired.map(({ lock }) => lock.release().catch(() => void 0)));
619
- throw error;
620
- }
621
- if (options.requireAllLocks && acquired.length > 0 && acquired.length < plan.namespaces.length) {
622
- for (const { candidate, startedAt } of acquired) {
623
- const completedAt = (/* @__PURE__ */ new Date()).toISOString();
624
- const status = {
625
- namespace: candidate.namespace,
626
- jobName: plan.jobName,
627
- state: "skipped",
628
- reason: "batch_lock_incomplete",
629
- startedAt,
630
- completedAt
631
- };
632
- statuses.push(status);
633
- await recordNamespaceMaintenanceStatusSafely(config, status);
634
- }
635
- await Promise.all(acquired.map(({ lock }) => lock.release().catch(() => void 0)));
636
- return {
637
- jobName: plan.jobName,
638
- generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
639
- ran: statuses.filter((s) => s.state === "ran").length,
640
- skipped: statuses.filter((s) => s.state === "skipped").length,
641
- failed: statuses.filter((s) => s.state === "failed").length,
642
- statuses
643
- };
644
- }
645
- if (acquired.length === 0) {
646
- return {
647
- jobName: plan.jobName,
648
- generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
649
- ran: statuses.filter((s) => s.state === "ran").length,
650
- skipped: statuses.filter((s) => s.state === "skipped").length,
651
- failed: statuses.filter((s) => s.state === "failed").length,
652
- statuses
653
- };
654
- }
655
- try {
656
- const result = await withNamespaceMaintenanceLockHeartbeat(
657
- config,
658
- acquired.map(({ lock }) => lock),
659
- () => runner(acquired.map(({ candidate }) => candidate))
660
- );
661
- for (const { candidate, startedAt } of acquired) {
662
- const completedAt = (/* @__PURE__ */ new Date()).toISOString();
663
- const status = {
664
- namespace: candidate.namespace,
665
- jobName: plan.jobName,
666
- state: "ran",
667
- startedAt,
668
- completedAt,
669
- itemCount: itemCountForNamespace(result, candidate.namespace)
670
- };
671
- statuses.push(status);
672
- await recordNamespaceMaintenanceStatusSafely(config, status);
673
- try {
674
- await catalog?.markMaintenance(candidate.namespace, plan.jobName, new Date(completedAt));
675
- } catch {
676
- }
677
- }
678
- } catch (error) {
679
- const skipReason = options.skipReasonForError?.(error);
680
- for (const { candidate, startedAt } of acquired) {
681
- const completedAt = (/* @__PURE__ */ new Date()).toISOString();
682
- const status = skipReason ? {
683
- namespace: candidate.namespace,
684
- jobName: plan.jobName,
685
- state: "skipped",
686
- reason: skipReason,
687
- startedAt,
688
- completedAt
689
- } : {
690
- namespace: candidate.namespace,
691
- jobName: plan.jobName,
692
- state: "failed",
693
- reason: "job_failed",
694
- startedAt,
695
- completedAt,
696
- error: maintenanceErrorDetail(error)
697
- };
698
- statuses.push(status);
699
- await recordNamespaceMaintenanceStatusSafely(config, status);
700
- }
701
- } finally {
702
- await Promise.all(acquired.map(({ lock }) => lock.release().catch(() => void 0)));
703
- }
704
- return {
705
- jobName: plan.jobName,
706
- generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
707
- ran: statuses.filter((s) => s.state === "ran").length,
708
- skipped: statuses.filter((s) => s.state === "skipped").length,
709
- failed: statuses.filter((s) => s.state === "failed").length,
710
- statuses
711
- };
712
- }
713
- function itemCountForNamespace(result, namespace) {
714
- const itemCounts = result?.itemCounts;
715
- if (itemCounts instanceof Map) return itemCounts.get(namespace);
716
- if (itemCounts && Object.prototype.hasOwnProperty.call(itemCounts, namespace)) {
717
- return itemCounts[namespace];
718
- }
719
- return result?.itemCount;
720
- }
721
-
722
- export {
723
- planNamespaceMaintenance,
724
- readNamespaceMaintenanceStatuses,
725
- readNamespaceMaintenanceLastRanStatuses,
726
- runNamespaceMaintenancePlan,
727
- runNamespaceMaintenanceBatchPlan
728
- };
729
- //# sourceMappingURL=chunk-R2LBF4HH.js.map