@remnic/core 9.3.728 → 9.3.730

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 (348) hide show
  1. package/dist/access-boundary.d.ts +6 -5
  2. package/dist/access-boundary.js +13 -13
  3. package/dist/access-cli.js +34 -33
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +6 -5
  6. package/dist/access-http.js +19 -19
  7. package/dist/access-mcp.d.ts +6 -5
  8. package/dist/access-mcp.js +18 -18
  9. package/dist/access-operations-batch.js +16 -16
  10. package/dist/access-operations.d.ts +7 -6
  11. package/dist/access-operations.js +17 -17
  12. package/dist/access-schema.d.ts +4 -4
  13. package/dist/{access-service-Bgpjxo4f.d.ts → access-service-Byoe3HsT.d.ts} +18 -3
  14. package/dist/access-service.d.ts +6 -5
  15. package/dist/access-service.js +12 -12
  16. package/dist/access-surface-catalog.d.ts +6 -5
  17. package/dist/action-confidence.d.ts +1 -1
  18. package/dist/active-memory-bridge.d.ts +1 -1
  19. package/dist/active-recall.d.ts +1 -1
  20. package/dist/active-recall.js +2 -2
  21. package/dist/{auto-sync-F3KCSQFJ.js → auto-sync-G3V5AN4C.js} +2 -2
  22. package/dist/behavior-learner.d.ts +1 -1
  23. package/dist/behavior-signals.d.ts +1 -1
  24. package/dist/bootstrap.d.ts +5 -4
  25. package/dist/briefing.d.ts +1 -1
  26. package/dist/briefing.js +3 -3
  27. package/dist/buffer-surprise-report.d.ts +1 -1
  28. package/dist/buffer.d.ts +1 -1
  29. package/dist/calibration.d.ts +1 -1
  30. package/dist/capabilities.d.ts +55 -2
  31. package/dist/capabilities.js +5 -1
  32. package/dist/{catalog-bMczlO2G.d.ts → catalog-DM1nk7cM.d.ts} +1 -1
  33. package/dist/causal-behavior.d.ts +1 -1
  34. package/dist/causal-consolidation.d.ts +1 -1
  35. package/dist/causal-consolidation.js +4 -4
  36. package/dist/causal-trajectory-graph.d.ts +1 -1
  37. package/dist/{chunk-4NOI577P.js → chunk-24ZLC5QN.js} +2 -2
  38. package/dist/{chunk-DMQWV6SQ.js → chunk-5RZOFIDL.js} +2 -2
  39. package/dist/{chunk-UM5AWJNQ.js → chunk-646B5ERJ.js} +62 -37
  40. package/dist/chunk-646B5ERJ.js.map +1 -0
  41. package/dist/{chunk-H5BWGCRZ.js → chunk-6TUWSUUD.js} +51 -47
  42. package/dist/{chunk-H5BWGCRZ.js.map → chunk-6TUWSUUD.js.map} +1 -1
  43. package/dist/{chunk-36SEDFAU.js → chunk-C5WN74HH.js} +2 -2
  44. package/dist/{chunk-MLKWJOAJ.js → chunk-CGPHMNL4.js} +2 -2
  45. package/dist/{chunk-R6OVFAX6.js → chunk-DJECGBBM.js} +7 -2
  46. package/dist/{chunk-R6OVFAX6.js.map → chunk-DJECGBBM.js.map} +1 -1
  47. package/dist/{chunk-3RCBIOOJ.js → chunk-ESF7TRYJ.js} +18 -2
  48. package/dist/{chunk-3RCBIOOJ.js.map → chunk-ESF7TRYJ.js.map} +1 -1
  49. package/dist/{chunk-EY6MDMHK.js → chunk-F6OEXJQQ.js} +2 -2
  50. package/dist/{chunk-M4V2JVSZ.js → chunk-FFUCCKPN.js} +2 -2
  51. package/dist/{chunk-O6YH5F47.js → chunk-FYWUNVFZ.js} +8 -8
  52. package/dist/{chunk-37436GML.js → chunk-GEXI357K.js} +2 -2
  53. package/dist/{chunk-YGIQORJ3.js → chunk-GGL34GCW.js} +3 -3
  54. package/dist/{chunk-4H4F3BFL.js → chunk-GXTYEG7Q.js} +3 -3
  55. package/dist/{chunk-4H4F3BFL.js.map → chunk-GXTYEG7Q.js.map} +1 -1
  56. package/dist/{chunk-WAS3NV46.js → chunk-H3MB3F62.js} +2 -2
  57. package/dist/{chunk-UTHQPSRC.js → chunk-HHNSLPX7.js} +11 -8
  58. package/dist/chunk-HHNSLPX7.js.map +1 -0
  59. package/dist/{chunk-76NHR6ZL.js → chunk-HJWQJUKQ.js} +4 -4
  60. package/dist/{chunk-Y4YD5TYW.js → chunk-IIBFCZA7.js} +3 -3
  61. package/dist/{chunk-UVPL565C.js → chunk-IQOEW5YV.js} +2 -2
  62. package/dist/{chunk-V4GNSDFH.js → chunk-KQYGNGON.js} +2 -2
  63. package/dist/{chunk-CBWI22JN.js → chunk-KSJCXXOU.js} +2 -2
  64. package/dist/{chunk-M4AYVEWS.js → chunk-LUCARK4W.js} +12 -11
  65. package/dist/chunk-LUCARK4W.js.map +1 -0
  66. package/dist/{chunk-I5REUWLH.js → chunk-NIZQH6AU.js} +3 -3
  67. package/dist/{chunk-4ESAR77N.js → chunk-NOU77OHX.js} +2 -2
  68. package/dist/{chunk-BQCHEV7O.js → chunk-O4ZIBPIW.js} +3 -3
  69. package/dist/{chunk-HOHVIVDR.js → chunk-OBJUKYDO.js} +2 -2
  70. package/dist/{chunk-YKBHOBJK.js → chunk-OEHCMALU.js} +56 -4
  71. package/dist/chunk-OEHCMALU.js.map +1 -0
  72. package/dist/{chunk-YOLZS7NY.js → chunk-OTQE66IX.js} +2 -2
  73. package/dist/{chunk-QNEUZIAH.js → chunk-OUITHS6V.js} +381 -433
  74. package/dist/chunk-OUITHS6V.js.map +1 -0
  75. package/dist/{chunk-4T3BMHKD.js → chunk-OZECYVGI.js} +20 -7
  76. package/dist/chunk-OZECYVGI.js.map +1 -0
  77. package/dist/{chunk-C2PG7IEH.js → chunk-P3VJCTVE.js} +2 -2
  78. package/dist/{chunk-EH5ED3C6.js → chunk-PMAQRUN4.js} +4 -4
  79. package/dist/chunk-PMAQRUN4.js.map +1 -0
  80. package/dist/{chunk-7RLCCNHU.js → chunk-Q6BAA57B.js} +4 -3
  81. package/dist/chunk-Q6BAA57B.js.map +1 -0
  82. package/dist/{chunk-HGNOCPZX.js → chunk-QZHF4BWN.js} +6 -6
  83. package/dist/chunk-SYX73XD7.js +283 -0
  84. package/dist/chunk-SYX73XD7.js.map +1 -0
  85. package/dist/{chunk-ASKXIAHD.js → chunk-WDJCZQB4.js} +2 -2
  86. package/dist/{chunk-AQLOP5F4.js → chunk-WNGXQMRI.js} +95 -6
  87. package/dist/chunk-WNGXQMRI.js.map +1 -0
  88. package/dist/{chunk-JYLFZWUX.js → chunk-XYUFGHUW.js} +2 -2
  89. package/dist/{chunk-3TSTGI6F.js → chunk-ZQUAVZNG.js} +2 -2
  90. package/dist/{chunk-4NR2PDZ5.js → chunk-ZVHRSR2R.js} +14 -4
  91. package/dist/chunk-ZVHRSR2R.js.map +1 -0
  92. package/dist/{cli-BLME420h.d.ts → cli-Dt-tuiYH.d.ts} +3 -3
  93. package/dist/cli.d.ts +7 -6
  94. package/dist/cli.js +35 -35
  95. package/dist/compounding/engine.d.ts +12 -1
  96. package/dist/compounding/engine.js +3 -3
  97. package/dist/compounding/preference-consolidator.d.ts +1 -1
  98. package/dist/compression-optimizer.d.ts +1 -1
  99. package/dist/config.d.ts +1 -1
  100. package/dist/config.js +2 -2
  101. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  102. package/dist/connectors/codex-materialize-runner.js +3 -3
  103. package/dist/connectors/codex-materialize.d.ts +1 -1
  104. package/dist/connectors/index.d.ts +1 -1
  105. package/dist/connectors/index.js +3 -3
  106. package/dist/consolidation-provenance-check.d.ts +1 -1
  107. package/dist/consolidation-undo.d.ts +1 -1
  108. package/dist/contradiction/index.d.ts +1 -1
  109. package/dist/contradiction/index.js +1 -1
  110. package/dist/conversation-index/backend.d.ts +1 -1
  111. package/dist/conversation-index/chunker.d.ts +1 -1
  112. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  113. package/dist/conversation-index/indexer.d.ts +1 -1
  114. package/dist/conversation-index/search.d.ts +1 -1
  115. package/dist/day-summary.d.ts +1 -1
  116. package/dist/delinearize.d.ts +1 -1
  117. package/dist/direct-answer-wiring.d.ts +1 -1
  118. package/dist/direct-answer.d.ts +1 -1
  119. package/dist/embedding-fallback.d.ts +1 -1
  120. package/dist/embedding-fallback.js +2 -2
  121. package/dist/enrichment/index.d.ts +1 -1
  122. package/dist/entity-retrieval.d.ts +1 -1
  123. package/dist/entity-retrieval.js +3 -3
  124. package/dist/entity-schema.d.ts +1 -1
  125. package/dist/explicit-capture.d.ts +6 -4
  126. package/dist/explicit-capture.js +1 -1
  127. package/dist/extraction-faithfulness.d.ts +1 -1
  128. package/dist/extraction-judge-telemetry.d.ts +1 -1
  129. package/dist/extraction-judge-training.d.ts +1 -1
  130. package/dist/extraction-judge.d.ts +1 -1
  131. package/dist/extraction.d.ts +1 -1
  132. package/dist/extraction.js +3 -3
  133. package/dist/fallback-llm.d.ts +1 -1
  134. package/dist/{first-start-migration-22LPFHD5.js → first-start-migration-OOR57AYR.js} +2 -2
  135. package/dist/graph-dashboard-diff.d.ts +1 -1
  136. package/dist/graph-dashboard-key.d.ts +1 -1
  137. package/dist/graph-dashboard-parser.d.ts +1 -1
  138. package/dist/graph-edge-reinforcement.d.ts +1 -1
  139. package/dist/graph-snapshot.d.ts +1 -1
  140. package/dist/graph.d.ts +1 -1
  141. package/dist/identity-continuity.d.ts +1 -1
  142. package/dist/importance.d.ts +1 -1
  143. package/dist/index.d.ts +296 -11
  144. package/dist/index.js +359 -47
  145. package/dist/index.js.map +1 -1
  146. package/dist/intent.d.ts +1 -1
  147. package/dist/lcm/engine.d.ts +1 -1
  148. package/dist/lcm/index.d.ts +1 -1
  149. package/dist/lcm/tools.d.ts +1 -1
  150. package/dist/lifecycle.d.ts +1 -1
  151. package/dist/live-connectors-runner.d.ts +1 -1
  152. package/dist/local-llm.d.ts +1 -1
  153. package/dist/local-model-endpoint.d.ts +1 -1
  154. package/dist/maintenance/memory-governance.d.ts +1 -1
  155. package/dist/maintenance/memory-governance.js +3 -3
  156. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  157. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  158. package/dist/mcp-memory-inspector-app.d.ts +6 -5
  159. package/dist/memory-action-policy.d.ts +1 -1
  160. package/dist/memory-cache.d.ts +1 -1
  161. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  162. package/dist/memory-projection-store.d.ts +1 -1
  163. package/dist/memory-provenance.d.ts +1 -1
  164. package/dist/memory-worth-outcomes.d.ts +1 -1
  165. package/dist/models-json.d.ts +1 -1
  166. package/dist/namespaces/migrate.d.ts +2 -2
  167. package/dist/namespaces/migrate.js +9 -9
  168. package/dist/namespaces/principal.d.ts +1 -1
  169. package/dist/namespaces/search.d.ts +1 -1
  170. package/dist/namespaces/search.js +5 -5
  171. package/dist/namespaces/storage.d.ts +2 -2
  172. package/dist/namespaces/storage.js +3 -3
  173. package/dist/native-knowledge.d.ts +1 -1
  174. package/dist/operator-toolkit.d.ts +1 -1
  175. package/dist/operator-toolkit.js +14 -14
  176. package/dist/orchestration/compression-guideline-coordinator.d.ts +105 -0
  177. package/dist/orchestration/compression-guideline-coordinator.js +12 -0
  178. package/dist/orchestration/maintenance.d.ts +2 -2
  179. package/dist/orchestration/maintenance.js +5 -5
  180. package/dist/{orchestrator-DqPAz8ot.d.ts → orchestrator-B4KjaOtY.d.ts} +128 -34
  181. package/dist/orchestrator.d.ts +5 -4
  182. package/dist/orchestrator.js +28 -26
  183. package/dist/patterns-cli.d.ts +1 -1
  184. package/dist/policy-runtime.d.ts +1 -1
  185. package/dist/provenance.d.ts +1 -1
  186. package/dist/provenance.js +1 -1
  187. package/dist/qmd-recall-cache.d.ts +1 -1
  188. package/dist/qmd.d.ts +1 -1
  189. package/dist/recall-disclosure-escalation.d.ts +1 -1
  190. package/dist/recall-explain-renderer.d.ts +1 -1
  191. package/dist/recall-planner-llm.d.ts +1 -1
  192. package/dist/recall-state.d.ts +1 -1
  193. package/dist/recall-tag-filter.d.ts +1 -1
  194. package/dist/recall-xray-cli.d.ts +1 -1
  195. package/dist/recall-xray-renderer.d.ts +1 -1
  196. package/dist/recall-xray.d.ts +1 -1
  197. package/dist/{resolution-MN36NW5P.js → resolution-33PIX3TT.js} +2 -2
  198. package/dist/resolution-33PIX3TT.js.map +1 -0
  199. package/dist/resolve-auth-token.d.ts +1 -1
  200. package/dist/resume-bundles.js +3 -3
  201. package/dist/retrieval-agents.d.ts +1 -1
  202. package/dist/retrieval-tiers.d.ts +1 -1
  203. package/dist/routing/engine.d.ts +1 -1
  204. package/dist/routing/store.d.ts +1 -1
  205. package/dist/schemas.d.ts +32 -32
  206. package/dist/search/embed-helper.d.ts +1 -1
  207. package/dist/search/embed-helper.js +2 -2
  208. package/dist/search/factory.d.ts +1 -1
  209. package/dist/search/factory.js +4 -4
  210. package/dist/search/index.d.ts +1 -1
  211. package/dist/search/index.js +8 -8
  212. package/dist/search/lancedb-backend.d.ts +1 -1
  213. package/dist/search/meilisearch-backend.d.ts +1 -1
  214. package/dist/search/noop-backend.d.ts +1 -1
  215. package/dist/search/orama-backend.d.ts +1 -1
  216. package/dist/search/port.d.ts +1 -1
  217. package/dist/search/remote-backend.d.ts +1 -1
  218. package/dist/{semantic-consolidation-Cl15ksZy.d.ts → semantic-consolidation-CstTvHPo.d.ts} +1 -1
  219. package/dist/semantic-consolidation.d.ts +2 -2
  220. package/dist/semantic-consolidation.js +4 -4
  221. package/dist/semantic-rule-promotion.js +3 -3
  222. package/dist/semantic-rule-verifier.d.ts +1 -1
  223. package/dist/semantic-rule-verifier.js +3 -3
  224. package/dist/session-observer-bands.d.ts +1 -1
  225. package/dist/session-observer-state.d.ts +1 -1
  226. package/dist/shared-context/manager.d.ts +1 -1
  227. package/dist/signal.d.ts +1 -1
  228. package/dist/storage.d.ts +22 -3
  229. package/dist/storage.js +2 -2
  230. package/dist/summarizer.d.ts +1 -1
  231. package/dist/summary-snapshot.d.ts +1 -1
  232. package/dist/temporal-supersession.d.ts +1 -1
  233. package/dist/temporal-validity.d.ts +1 -1
  234. package/dist/threading.d.ts +1 -1
  235. package/dist/tier-migration.d.ts +1 -1
  236. package/dist/tier-routing.d.ts +1 -1
  237. package/dist/topics.d.ts +1 -1
  238. package/dist/transcript.d.ts +1 -1
  239. package/dist/transfer/types.d.ts +22 -22
  240. package/dist/trust-score-stage.d.ts +1 -1
  241. package/dist/trust-score.d.ts +1 -1
  242. package/dist/{types-ChQb9D6s.d.ts → types-VkxElCHR.d.ts} +8 -1
  243. package/dist/types.d.ts +1 -1
  244. package/dist/utility-runtime.d.ts +1 -1
  245. package/dist/verified-recall.js +3 -3
  246. package/package.json +12 -2
  247. package/src/access-service-coding-write.test.ts +2 -2
  248. package/src/access-service.ts +33 -14
  249. package/src/bitemporal-dedup-backfill.test.ts +10 -10
  250. package/src/bitemporal-frontmatter.test.ts +3 -3
  251. package/src/capabilities.test.ts +185 -0
  252. package/src/capabilities.ts +110 -0
  253. package/src/cli/creation-ledger-commands.ts +22 -21
  254. package/src/coding/architecture-surfaces.test.ts +25 -1
  255. package/src/coding/architecture-surfaces.ts +47 -19
  256. package/src/coding/decision-surfaces.ts +12 -3
  257. package/src/coding/review-context-structural.test.ts +303 -0
  258. package/src/coding/review-context.ts +79 -0
  259. package/src/coding/structural-context.test.ts +259 -0
  260. package/src/coding/structural-context.ts +315 -0
  261. package/src/coding/structural-subprocess-provider.test.ts +430 -0
  262. package/src/coding/structural-subprocess-provider.ts +355 -0
  263. package/src/compounding/engine.test.ts +90 -0
  264. package/src/compounding/engine.ts +25 -1
  265. package/src/contradiction/contradiction.test.ts +1 -1
  266. package/src/contradiction/resolution.ts +9 -1
  267. package/src/correction/correction-access-wiring.ts +21 -3
  268. package/src/correction/correction-contract.ts +7 -0
  269. package/src/correction/correction-planner.test.ts +231 -0
  270. package/src/correction/correction-planner.ts +73 -0
  271. package/src/correction/correction-service.ts +29 -0
  272. package/src/correction/correction-storage-integration.test.ts +2 -2
  273. package/src/dedup/semantic.test.ts +1 -1
  274. package/src/explicit-capture.ts +7 -4
  275. package/src/extraction-eventtime-wiring.test.ts +3 -3
  276. package/src/extraction-redaction-rules.test.ts +172 -0
  277. package/src/index.ts +29 -0
  278. package/src/maintenance/forget.test.ts +1 -1
  279. package/src/maintenance/memory-governance.test.ts +1 -1
  280. package/src/maintenance/pattern-reinforcement.test.ts +2 -2
  281. package/src/operator-toolkit.ts +4 -3
  282. package/src/orchestration/compression-guideline-coordinator.ts +449 -0
  283. package/src/orchestration/extraction-queue-coordinator.ts +175 -0
  284. package/src/orchestrator-extraction-queue.test.ts +26 -38
  285. package/src/orchestrator-flush.test.ts +10 -15
  286. package/src/orchestrator.ts +359 -542
  287. package/src/procedural/procedure-miner.test.ts +2 -2
  288. package/src/provenance-extraction.test.ts +382 -4
  289. package/src/provenance.ts +158 -22
  290. package/src/recall-handles-wiring.test.ts +1 -1
  291. package/src/search/factory.ts +4 -3
  292. package/src/semantic-rule-promotion.ts +1 -1
  293. package/src/source-attribution-roundtrip.test.ts +2 -2
  294. package/src/storage-contract/atomicity.test.ts +1 -1
  295. package/src/storage-contract/cache-coherence.test.ts +2 -2
  296. package/src/storage-contract/content-hash.test.ts +1 -1
  297. package/src/storage-contract/namespace-routing.test.ts +1 -1
  298. package/src/storage-contract/round-trip.test.ts +3 -3
  299. package/src/storage.ts +23 -2
  300. package/src/temporal-supersession.test.ts +12 -11
  301. package/src/temporal-validity.test.ts +11 -11
  302. package/src/wearables/cli.test.ts +30 -0
  303. package/src/wearables/cli.ts +3 -0
  304. package/src/wearables/memory-gen.test.ts +57 -1
  305. package/src/wearables/memory-gen.ts +31 -7
  306. package/src/wearables/pipeline.test.ts +40 -1
  307. package/src/wearables/pipeline.ts +4 -0
  308. package/src/wearables/service.test.ts +2 -2
  309. package/src/wearables/storage-io.test.ts +3 -3
  310. package/src/wearables/types.ts +7 -0
  311. package/dist/chunk-4NR2PDZ5.js.map +0 -1
  312. package/dist/chunk-4T3BMHKD.js.map +0 -1
  313. package/dist/chunk-7RLCCNHU.js.map +0 -1
  314. package/dist/chunk-AQLOP5F4.js.map +0 -1
  315. package/dist/chunk-EH5ED3C6.js.map +0 -1
  316. package/dist/chunk-M4AYVEWS.js.map +0 -1
  317. package/dist/chunk-QNEUZIAH.js.map +0 -1
  318. package/dist/chunk-UM5AWJNQ.js.map +0 -1
  319. package/dist/chunk-UTHQPSRC.js.map +0 -1
  320. package/dist/chunk-YKBHOBJK.js.map +0 -1
  321. /package/dist/{auto-sync-F3KCSQFJ.js.map → auto-sync-G3V5AN4C.js.map} +0 -0
  322. /package/dist/{chunk-4NOI577P.js.map → chunk-24ZLC5QN.js.map} +0 -0
  323. /package/dist/{chunk-DMQWV6SQ.js.map → chunk-5RZOFIDL.js.map} +0 -0
  324. /package/dist/{chunk-36SEDFAU.js.map → chunk-C5WN74HH.js.map} +0 -0
  325. /package/dist/{chunk-MLKWJOAJ.js.map → chunk-CGPHMNL4.js.map} +0 -0
  326. /package/dist/{chunk-EY6MDMHK.js.map → chunk-F6OEXJQQ.js.map} +0 -0
  327. /package/dist/{chunk-M4V2JVSZ.js.map → chunk-FFUCCKPN.js.map} +0 -0
  328. /package/dist/{chunk-O6YH5F47.js.map → chunk-FYWUNVFZ.js.map} +0 -0
  329. /package/dist/{chunk-37436GML.js.map → chunk-GEXI357K.js.map} +0 -0
  330. /package/dist/{chunk-YGIQORJ3.js.map → chunk-GGL34GCW.js.map} +0 -0
  331. /package/dist/{chunk-WAS3NV46.js.map → chunk-H3MB3F62.js.map} +0 -0
  332. /package/dist/{chunk-76NHR6ZL.js.map → chunk-HJWQJUKQ.js.map} +0 -0
  333. /package/dist/{chunk-Y4YD5TYW.js.map → chunk-IIBFCZA7.js.map} +0 -0
  334. /package/dist/{chunk-UVPL565C.js.map → chunk-IQOEW5YV.js.map} +0 -0
  335. /package/dist/{chunk-V4GNSDFH.js.map → chunk-KQYGNGON.js.map} +0 -0
  336. /package/dist/{chunk-CBWI22JN.js.map → chunk-KSJCXXOU.js.map} +0 -0
  337. /package/dist/{chunk-I5REUWLH.js.map → chunk-NIZQH6AU.js.map} +0 -0
  338. /package/dist/{chunk-4ESAR77N.js.map → chunk-NOU77OHX.js.map} +0 -0
  339. /package/dist/{chunk-BQCHEV7O.js.map → chunk-O4ZIBPIW.js.map} +0 -0
  340. /package/dist/{chunk-HOHVIVDR.js.map → chunk-OBJUKYDO.js.map} +0 -0
  341. /package/dist/{chunk-YOLZS7NY.js.map → chunk-OTQE66IX.js.map} +0 -0
  342. /package/dist/{chunk-C2PG7IEH.js.map → chunk-P3VJCTVE.js.map} +0 -0
  343. /package/dist/{chunk-HGNOCPZX.js.map → chunk-QZHF4BWN.js.map} +0 -0
  344. /package/dist/{chunk-ASKXIAHD.js.map → chunk-WDJCZQB4.js.map} +0 -0
  345. /package/dist/{chunk-JYLFZWUX.js.map → chunk-XYUFGHUW.js.map} +0 -0
  346. /package/dist/{chunk-3TSTGI6F.js.map → chunk-ZQUAVZNG.js.map} +0 -0
  347. /package/dist/{first-start-migration-22LPFHD5.js.map → first-start-migration-OOR57AYR.js.map} +0 -0
  348. /package/dist/{resolution-MN36NW5P.js.map → orchestration/compression-guideline-coordinator.js.map} +0 -0
@@ -11,19 +11,19 @@ import {
11
11
  processChatMessage,
12
12
  sessionBelongsToPrincipal,
13
13
  subscribeChatTranscript
14
- } from "./chunk-BQCHEV7O.js";
14
+ } from "./chunk-O4ZIBPIW.js";
15
15
  import {
16
16
  validateRequest
17
17
  } from "./chunk-FVZ2ISIX.js";
18
18
  import {
19
19
  getOperation
20
- } from "./chunk-4ESAR77N.js";
20
+ } from "./chunk-NOU77OHX.js";
21
21
  import {
22
22
  EngramAccessInputError
23
- } from "./chunk-UM5AWJNQ.js";
23
+ } from "./chunk-646B5ERJ.js";
24
24
  import {
25
25
  CorrectionContractError
26
- } from "./chunk-AQLOP5F4.js";
26
+ } from "./chunk-WNGXQMRI.js";
27
27
  import {
28
28
  isTrustZoneName
29
29
  } from "./chunk-JGSKJHF7.js";
@@ -1669,7 +1669,7 @@ var EngramAccessHttpServer = class {
1669
1669
  this.respondJson(res, 400, { error: "pairId and verb are required" });
1670
1670
  return;
1671
1671
  }
1672
- const { isValidResolutionVerb, executeResolution } = await import("./resolution-MN36NW5P.js");
1672
+ const { isValidResolutionVerb, executeResolution } = await import("./resolution-33PIX3TT.js");
1673
1673
  if (!isValidResolutionVerb(verb)) {
1674
1674
  this.respondJson(res, 400, { error: `Invalid verb: ${verb}. Must be one of: keep-a, keep-b, merge, both-valid, needs-more-context` });
1675
1675
  return;
@@ -2629,4 +2629,4 @@ function positiveIntQueryParam(value, label) {
2629
2629
  export {
2630
2630
  EngramAccessHttpServer
2631
2631
  };
2632
- //# sourceMappingURL=chunk-HGNOCPZX.js.map
2632
+ //# sourceMappingURL=chunk-QZHF4BWN.js.map
@@ -0,0 +1,283 @@
1
+ import {
2
+ computeCompressionGuidelineCandidate,
3
+ refineCompressionGuidelineCandidateSemantically,
4
+ renderCompressionGuidelinesMarkdown
5
+ } from "./chunk-OD4FM2U7.js";
6
+ import {
7
+ log
8
+ } from "./chunk-NU3CSQ4H.js";
9
+
10
+ // src/orchestration/compression-guideline-coordinator.ts
11
+ import { createHash } from "crypto";
12
+ var CompressionGuidelineCoordinator = class {
13
+ constructor(deps) {
14
+ this.deps = deps;
15
+ }
16
+ deps;
17
+ get storage() {
18
+ return this.deps.getStorage();
19
+ }
20
+ get config() {
21
+ return this.deps.config;
22
+ }
23
+ async optimizeCompressionGuidelines(options) {
24
+ const dryRun = options?.dryRun === true;
25
+ const eventLimit = typeof options?.eventLimit === "number" ? Math.max(0, Math.floor(options.eventLimit)) : 500;
26
+ const [activeState, draftState] = await Promise.all([
27
+ this.storage.readCompressionGuidelineOptimizerState(),
28
+ this.storage.readCompressionGuidelineDraftState().catch(() => null)
29
+ ]);
30
+ const previousState = draftState && ((activeState?.guidelineVersion ?? 0) < draftState.guidelineVersion || (activeState?.guidelineVersion ?? 0) === draftState.guidelineVersion) ? draftState : activeState;
31
+ if (!this.config.compressionGuidelineLearningEnabled) {
32
+ return {
33
+ enabled: false,
34
+ dryRun,
35
+ eventCount: 0,
36
+ previousGuidelineVersion: previousState?.guidelineVersion ?? null,
37
+ nextGuidelineVersion: previousState?.guidelineVersion ?? 0,
38
+ changedRules: 0,
39
+ semanticRefinementApplied: false,
40
+ persisted: false,
41
+ draftContentHash: null
42
+ };
43
+ }
44
+ let events = await this.storage.readMemoryActionEvents(eventLimit);
45
+ if (eventLimit > 0) {
46
+ let effectiveEvents = events.filter((event) => event.dryRun !== true);
47
+ let fetchLimit = eventLimit;
48
+ while (effectiveEvents.length < eventLimit && events.length === fetchLimit) {
49
+ fetchLimit = Math.min(fetchLimit * 2, fetchLimit + 1e3);
50
+ if (fetchLimit <= events.length) break;
51
+ events = await this.storage.readMemoryActionEvents(fetchLimit);
52
+ effectiveEvents = events.filter((event) => event.dryRun !== true);
53
+ }
54
+ events = effectiveEvents.slice(-eventLimit);
55
+ }
56
+ const generatedAt = (/* @__PURE__ */ new Date()).toISOString();
57
+ const candidate = computeCompressionGuidelineCandidate(events, {
58
+ generatedAtIso: generatedAt,
59
+ previousState
60
+ });
61
+ if (candidate.eventCounts.total === 0) {
62
+ return {
63
+ enabled: true,
64
+ dryRun,
65
+ eventCount: 0,
66
+ previousGuidelineVersion: previousState?.guidelineVersion ?? null,
67
+ nextGuidelineVersion: previousState?.guidelineVersion ?? 0,
68
+ changedRules: 0,
69
+ semanticRefinementApplied: false,
70
+ persisted: false,
71
+ draftContentHash: null
72
+ };
73
+ }
74
+ const refinedCandidate = await refineCompressionGuidelineCandidateSemantically(candidate, {
75
+ enabled: this.config.compressionGuidelineSemanticRefinementEnabled,
76
+ timeoutMs: this.config.compressionGuidelineSemanticTimeoutMs,
77
+ runRefinement: async (baseline) => {
78
+ const prompt = [
79
+ "You refine compression policy suggestions conservatively.",
80
+ "Return JSON only in this shape:",
81
+ '{"updates":[{"action":"summarize_node","delta":0.02,"confidence":"medium","note":"..."}]}',
82
+ "Constraints:",
83
+ "- Keep updates sparse and conservative.",
84
+ "- delta must stay between -0.15 and 0.15.",
85
+ "- Only include actions present in the input.",
86
+ "Input candidate:",
87
+ JSON.stringify(baseline)
88
+ ].join("\n");
89
+ const response = await this.deps.fastChatCompletion(
90
+ [
91
+ {
92
+ role: "system",
93
+ content: "Respond with strict JSON only. No markdown."
94
+ },
95
+ { role: "user", content: prompt }
96
+ ],
97
+ {
98
+ temperature: 0.1,
99
+ maxTokens: 400,
100
+ operation: "compression_guideline_semantic_refinement",
101
+ priority: "background"
102
+ }
103
+ );
104
+ return this.parseCompressionSemanticRefinement(
105
+ response?.content ?? ""
106
+ );
107
+ }
108
+ });
109
+ const content = renderCompressionGuidelinesMarkdown(refinedCandidate);
110
+ const contentHash = createHash("sha256").update(content).digest("hex");
111
+ const semanticRefinementApplied = JSON.stringify(refinedCandidate.ruleUpdates) !== JSON.stringify(candidate.ruleUpdates);
112
+ const changedRules = refinedCandidate.ruleUpdates.filter(
113
+ (rule) => rule.delta !== 0
114
+ ).length;
115
+ if (!dryRun) {
116
+ await this.storage.writeCompressionGuidelineDraft(content);
117
+ await this.storage.writeCompressionGuidelineDraftState({
118
+ version: refinedCandidate.optimizerVersion,
119
+ updatedAt: refinedCandidate.generatedAt,
120
+ sourceWindow: refinedCandidate.sourceWindow,
121
+ eventCounts: refinedCandidate.eventCounts,
122
+ guidelineVersion: refinedCandidate.guidelineVersion,
123
+ contentHash,
124
+ activationState: "draft",
125
+ actionSummaries: refinedCandidate.actionSummaries,
126
+ ruleUpdates: refinedCandidate.ruleUpdates
127
+ });
128
+ }
129
+ return {
130
+ enabled: true,
131
+ dryRun,
132
+ eventCount: candidate.eventCounts.total,
133
+ previousGuidelineVersion: previousState?.guidelineVersion ?? null,
134
+ nextGuidelineVersion: refinedCandidate.guidelineVersion,
135
+ changedRules,
136
+ semanticRefinementApplied,
137
+ persisted: !dryRun,
138
+ draftContentHash: dryRun ? null : contentHash
139
+ };
140
+ }
141
+ async activateCompressionGuidelineDraft(options) {
142
+ if (!this.config.compressionGuidelineLearningEnabled) {
143
+ return {
144
+ enabled: false,
145
+ activated: false,
146
+ guidelineVersion: null,
147
+ reason: "disabled"
148
+ };
149
+ }
150
+ const draftState = await this.storage.readCompressionGuidelineDraftState();
151
+ if (!draftState) {
152
+ return {
153
+ enabled: true,
154
+ activated: false,
155
+ guidelineVersion: null,
156
+ reason: "missing_draft"
157
+ };
158
+ }
159
+ const expectedContentHash = options?.expectedContentHash?.trim();
160
+ const expectedGuidelineVersion = options?.expectedGuidelineVersion;
161
+ if ((!expectedContentHash || expectedContentHash.length === 0) && typeof expectedGuidelineVersion !== "number") {
162
+ return {
163
+ enabled: true,
164
+ activated: false,
165
+ guidelineVersion: null,
166
+ reason: "expected_revision_required"
167
+ };
168
+ }
169
+ if (expectedContentHash && draftState.contentHash !== expectedContentHash) {
170
+ return {
171
+ enabled: true,
172
+ activated: false,
173
+ guidelineVersion: null,
174
+ reason: "content_hash_mismatch"
175
+ };
176
+ }
177
+ if (typeof expectedGuidelineVersion === "number" && draftState.guidelineVersion !== expectedGuidelineVersion) {
178
+ return {
179
+ enabled: true,
180
+ activated: false,
181
+ guidelineVersion: null,
182
+ reason: "guideline_version_mismatch"
183
+ };
184
+ }
185
+ const activated = await this.storage.activateCompressionGuidelineDraft({
186
+ ...expectedContentHash ? { expectedContentHash } : {},
187
+ ...typeof expectedGuidelineVersion === "number" ? { expectedGuidelineVersion } : {}
188
+ });
189
+ return {
190
+ enabled: true,
191
+ activated,
192
+ guidelineVersion: activated ? draftState.guidelineVersion : null,
193
+ ...activated ? {} : { reason: "draft_changed" }
194
+ };
195
+ }
196
+ /** Consolidation-time hook: recompute the draft from recent events. */
197
+ async runCompressionGuidelineLearningPass() {
198
+ if (!this.config.compressionGuidelineLearningEnabled) return;
199
+ try {
200
+ const result = await this.optimizeCompressionGuidelines({
201
+ dryRun: false,
202
+ eventLimit: 500
203
+ });
204
+ log.info(
205
+ `compression guideline learning updated (${result.eventCount} events)`
206
+ );
207
+ } catch (err) {
208
+ log.warn(`compression guideline learning failed (ignored): ${err}`);
209
+ }
210
+ }
211
+ /** Recall-time hook: surface active guidelines as a recall section. */
212
+ async buildCompressionGuidelineRecallSection() {
213
+ if (!this.config.contextCompressionActionsEnabled) return null;
214
+ if (!this.config.compressionGuidelineLearningEnabled) return null;
215
+ const state = await this.storage.readCompressionGuidelineOptimizerState().catch(() => null);
216
+ if (!state || state.guidelineVersion <= 0) return null;
217
+ const raw = await this.storage.readCompressionGuidelines().catch(() => null);
218
+ const summary = raw ? formatCompressionGuidelinesForRecall(raw, 5) : null;
219
+ if (!summary) return null;
220
+ return [
221
+ "## Active Compression Guidelines",
222
+ "",
223
+ `Guideline version: ${state.guidelineVersion}`,
224
+ `Updated: ${state.updatedAt}`,
225
+ "",
226
+ summary
227
+ ].join("\n");
228
+ }
229
+ parseCompressionSemanticRefinement(raw) {
230
+ if (typeof raw !== "string" || raw.trim().length === 0) return null;
231
+ const trimmed = raw.trim();
232
+ const start = trimmed.indexOf("{");
233
+ const end = trimmed.lastIndexOf("}");
234
+ if (start === -1 || end === -1 || end <= start) return null;
235
+ try {
236
+ const parsed = JSON.parse(trimmed.slice(start, end + 1));
237
+ if (!Array.isArray(parsed?.updates)) return null;
238
+ const validActions = /* @__PURE__ */ new Set([
239
+ "store_episode",
240
+ "store_note",
241
+ "update_note",
242
+ "create_artifact",
243
+ "summarize_node",
244
+ "discard",
245
+ "link_graph"
246
+ ]);
247
+ const updates = parsed.updates.filter(
248
+ (item) => item && typeof item.action === "string" && validActions.has(item.action)
249
+ ).map((item) => {
250
+ const confidence = item.confidence === "low" || item.confidence === "medium" || item.confidence === "high" ? item.confidence : void 0;
251
+ return {
252
+ action: item.action,
253
+ delta: typeof item.delta === "number" && Number.isFinite(item.delta) ? item.delta : void 0,
254
+ confidence,
255
+ note: typeof item.note === "string" ? item.note : void 0
256
+ };
257
+ });
258
+ return { updates };
259
+ } catch {
260
+ return null;
261
+ }
262
+ }
263
+ };
264
+ function formatCompressionGuidelinesForRecall(raw, maxLines = 5) {
265
+ if (typeof raw !== "string" || raw.trim().length === 0) return null;
266
+ const sectionMatch = raw.match(
267
+ // End the section at `\n## ` or end-of-string. Plain $ (not \s*$): the
268
+ // \s* branch overlapped the lazy body and backtracked polynomially
269
+ // (CodeQL js/polynomial-redos). Captured lines are trimmed/filtered below,
270
+ // so trailing whitespace handling is unchanged.
271
+ /## Suggested Guidelines\s*\n([\s\S]*?)(?:\n##\s+|$)/i
272
+ );
273
+ if (!sectionMatch) return null;
274
+ const lines = sectionMatch[1].split("\n").map((line) => line.trim()).filter((line) => line.startsWith("- ")).slice(0, Math.max(1, Math.floor(maxLines)));
275
+ if (lines.length === 0) return null;
276
+ return lines.join("\n");
277
+ }
278
+
279
+ export {
280
+ CompressionGuidelineCoordinator,
281
+ formatCompressionGuidelinesForRecall
282
+ };
283
+ //# sourceMappingURL=chunk-SYX73XD7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/orchestration/compression-guideline-coordinator.ts"],"sourcesContent":["/**\n * Compression-guideline learning coordinator — extracted from the\n * orchestrator (issue #1526, seam 4).\n *\n * Owns the compression-guideline learning lifecycle:\n * - candidate computation from recorded memory-action events\n * - optional LLM semantic refinement of the candidate\n * - draft persistence + activation (optimizer/draft state files)\n * - the recall section that surfaces active guidelines during recall\n * - the consolidation-time learning pass that recomputes the draft\n *\n * The orchestrator constructs one instance and delegates the public\n * entrypoints (`optimizeCompressionGuidelines`,\n * `activateCompressionGuidelineDraft`) plus the two internal hooks\n * (`runCompressionGuidelineLearningPass`, called from the consolidation\n * loop; `buildCompressionGuidelineRecallSection`, called from the recall\n * pipeline) to it. Storage is the orchestrator's stable `this.storage`;\n * the fast-tier LLM call arrives as a callback so gateway routing stays\n * owned by the orchestrator.\n *\n * Behavior-preserving move from orchestrator.ts. No logic changes — the\n * orchestrator keeps thin delegating methods so existing call sites and\n * tests that exercise the public API continue to work.\n */\n\nimport { createHash } from \"node:crypto\";\n\n// StorageManager type comes from the package barrel (type-only) so this\n// module does not add a direct storage.ts import (#1533 ratchet).\nimport type { StorageManager } from \"../index.js\";\nimport type { PluginConfig, MemoryActionType, MemoryActionEvent } from \"../types.js\";\nimport { log } from \"../logger.js\";\nimport {\n computeCompressionGuidelineCandidate,\n refineCompressionGuidelineCandidateSemantically,\n renderCompressionGuidelinesMarkdown,\n} from \"../compression-optimizer.js\";\n\n/** Dependencies injected by the orchestrator. All stable references or\n * live accessors. */\nexport interface CompressionGuidelineCoordinatorDeps {\n config: PluginConfig;\n /** Live accessor: the orchestrator's storage manager (stable post-ctor). */\n getStorage: () => StorageManager;\n /** Fast-tier LLM call used for optional semantic refinement. Routes\n * through the gateway chain when configured — owned by the\n * orchestrator, injected here so this module stays LLM-agnostic. */\n fastChatCompletion: (\n messages: Array<{ role: string; content: string }>,\n options: {\n temperature?: number;\n maxTokens?: number;\n timeoutMs?: number;\n operation?: string;\n priority?: \"background\" | \"recall-critical\";\n },\n ) => Promise<{ content: string } | null>;\n}\n\n/**\n * Coordinates compression-guideline learning. Holds no mutable state of\n * its own — all persistence flows through the injected storage manager.\n */\nexport class CompressionGuidelineCoordinator {\n constructor(private readonly deps: CompressionGuidelineCoordinatorDeps) {}\n\n private get storage(): StorageManager {\n return this.deps.getStorage();\n }\n\n private get config(): PluginConfig {\n return this.deps.config;\n }\n\n async optimizeCompressionGuidelines(options?: {\n dryRun?: boolean;\n eventLimit?: number;\n }): Promise<{\n enabled: boolean;\n dryRun: boolean;\n eventCount: number;\n previousGuidelineVersion: number | null;\n nextGuidelineVersion: number;\n changedRules: number;\n semanticRefinementApplied: boolean;\n persisted: boolean;\n draftContentHash: string | null;\n }> {\n const dryRun = options?.dryRun === true;\n const eventLimit =\n typeof options?.eventLimit === \"number\"\n ? Math.max(0, Math.floor(options.eventLimit))\n : 500;\n\n const [activeState, draftState] = await Promise.all([\n this.storage.readCompressionGuidelineOptimizerState(),\n this.storage.readCompressionGuidelineDraftState().catch(() => null),\n ]);\n const previousState =\n draftState &&\n ((activeState?.guidelineVersion ?? 0) < draftState.guidelineVersion ||\n (activeState?.guidelineVersion ?? 0) === draftState.guidelineVersion)\n ? draftState\n : activeState;\n\n if (!this.config.compressionGuidelineLearningEnabled) {\n return {\n enabled: false,\n dryRun,\n eventCount: 0,\n previousGuidelineVersion: previousState?.guidelineVersion ?? null,\n nextGuidelineVersion: previousState?.guidelineVersion ?? 0,\n changedRules: 0,\n semanticRefinementApplied: false,\n persisted: false,\n draftContentHash: null,\n };\n }\n\n let events = await this.storage.readMemoryActionEvents(eventLimit);\n if (eventLimit > 0) {\n let effectiveEvents = events.filter((event) => event.dryRun !== true);\n let fetchLimit = eventLimit;\n while (\n effectiveEvents.length < eventLimit &&\n events.length === fetchLimit\n ) {\n fetchLimit = Math.min(fetchLimit * 2, fetchLimit + 1000);\n if (fetchLimit <= events.length) break;\n events = await this.storage.readMemoryActionEvents(fetchLimit);\n effectiveEvents = events.filter((event) => event.dryRun !== true);\n }\n events = effectiveEvents.slice(-eventLimit);\n }\n const generatedAt = new Date().toISOString();\n const candidate = computeCompressionGuidelineCandidate(events, {\n generatedAtIso: generatedAt,\n previousState,\n });\n if (candidate.eventCounts.total === 0) {\n return {\n enabled: true,\n dryRun,\n eventCount: 0,\n previousGuidelineVersion: previousState?.guidelineVersion ?? null,\n nextGuidelineVersion: previousState?.guidelineVersion ?? 0,\n changedRules: 0,\n semanticRefinementApplied: false,\n persisted: false,\n draftContentHash: null,\n };\n }\n const refinedCandidate =\n await refineCompressionGuidelineCandidateSemantically(candidate, {\n enabled: this.config.compressionGuidelineSemanticRefinementEnabled,\n timeoutMs: this.config.compressionGuidelineSemanticTimeoutMs,\n runRefinement: async (baseline) => {\n const prompt = [\n \"You refine compression policy suggestions conservatively.\",\n \"Return JSON only in this shape:\",\n '{\"updates\":[{\"action\":\"summarize_node\",\"delta\":0.02,\"confidence\":\"medium\",\"note\":\"...\"}]}',\n \"Constraints:\",\n \"- Keep updates sparse and conservative.\",\n \"- delta must stay between -0.15 and 0.15.\",\n \"- Only include actions present in the input.\",\n \"Input candidate:\",\n JSON.stringify(baseline),\n ].join(\"\\n\");\n\n const response = await this.deps.fastChatCompletion(\n [\n {\n role: \"system\",\n content: \"Respond with strict JSON only. No markdown.\",\n },\n { role: \"user\", content: prompt },\n ],\n {\n temperature: 0.1,\n maxTokens: 400,\n operation: \"compression_guideline_semantic_refinement\",\n priority: \"background\",\n },\n );\n\n return this.parseCompressionSemanticRefinement(\n response?.content ?? \"\",\n );\n },\n });\n\n const content = renderCompressionGuidelinesMarkdown(refinedCandidate);\n const contentHash = createHash(\"sha256\").update(content).digest(\"hex\");\n const semanticRefinementApplied =\n JSON.stringify(refinedCandidate.ruleUpdates) !==\n JSON.stringify(candidate.ruleUpdates);\n const changedRules = refinedCandidate.ruleUpdates.filter(\n (rule) => rule.delta !== 0,\n ).length;\n\n if (!dryRun) {\n await this.storage.writeCompressionGuidelineDraft(content);\n await this.storage.writeCompressionGuidelineDraftState({\n version: refinedCandidate.optimizerVersion,\n updatedAt: refinedCandidate.generatedAt,\n sourceWindow: refinedCandidate.sourceWindow,\n eventCounts: refinedCandidate.eventCounts,\n guidelineVersion: refinedCandidate.guidelineVersion,\n contentHash,\n activationState: \"draft\",\n actionSummaries: refinedCandidate.actionSummaries,\n ruleUpdates: refinedCandidate.ruleUpdates,\n });\n }\n\n return {\n enabled: true,\n dryRun,\n eventCount: candidate.eventCounts.total,\n previousGuidelineVersion: previousState?.guidelineVersion ?? null,\n nextGuidelineVersion: refinedCandidate.guidelineVersion,\n changedRules,\n semanticRefinementApplied,\n persisted: !dryRun,\n draftContentHash: dryRun ? null : contentHash,\n };\n }\n\n async activateCompressionGuidelineDraft(options?: {\n expectedContentHash?: string;\n expectedGuidelineVersion?: number;\n }): Promise<{\n enabled: boolean;\n activated: boolean;\n guidelineVersion: number | null;\n reason?:\n | \"disabled\"\n | \"missing_draft\"\n | \"expected_revision_required\"\n | \"content_hash_mismatch\"\n | \"guideline_version_mismatch\"\n | \"draft_changed\";\n }> {\n if (!this.config.compressionGuidelineLearningEnabled) {\n return {\n enabled: false,\n activated: false,\n guidelineVersion: null,\n reason: \"disabled\",\n };\n }\n\n const draftState = await this.storage.readCompressionGuidelineDraftState();\n if (!draftState) {\n return {\n enabled: true,\n activated: false,\n guidelineVersion: null,\n reason: \"missing_draft\",\n };\n }\n\n const expectedContentHash = options?.expectedContentHash?.trim();\n const expectedGuidelineVersion = options?.expectedGuidelineVersion;\n\n if (\n (!expectedContentHash || expectedContentHash.length === 0) &&\n typeof expectedGuidelineVersion !== \"number\"\n ) {\n return {\n enabled: true,\n activated: false,\n guidelineVersion: null,\n reason: \"expected_revision_required\",\n };\n }\n\n if (expectedContentHash && draftState.contentHash !== expectedContentHash) {\n return {\n enabled: true,\n activated: false,\n guidelineVersion: null,\n reason: \"content_hash_mismatch\",\n };\n }\n\n if (\n typeof expectedGuidelineVersion === \"number\" &&\n draftState.guidelineVersion !== expectedGuidelineVersion\n ) {\n return {\n enabled: true,\n activated: false,\n guidelineVersion: null,\n reason: \"guideline_version_mismatch\",\n };\n }\n\n const activated = await this.storage.activateCompressionGuidelineDraft({\n ...(expectedContentHash ? { expectedContentHash } : {}),\n ...(typeof expectedGuidelineVersion === \"number\"\n ? { expectedGuidelineVersion }\n : {}),\n });\n return {\n enabled: true,\n activated,\n guidelineVersion: activated ? draftState.guidelineVersion : null,\n ...(activated ? {} : { reason: \"draft_changed\" as const }),\n };\n }\n\n /** Consolidation-time hook: recompute the draft from recent events. */\n async runCompressionGuidelineLearningPass(): Promise<void> {\n if (!this.config.compressionGuidelineLearningEnabled) return;\n try {\n const result = await this.optimizeCompressionGuidelines({\n dryRun: false,\n eventLimit: 500,\n });\n log.info(\n `compression guideline learning updated (${result.eventCount} events)`,\n );\n } catch (err) {\n log.warn(`compression guideline learning failed (ignored): ${err}`);\n }\n }\n\n /** Recall-time hook: surface active guidelines as a recall section. */\n async buildCompressionGuidelineRecallSection(): Promise<string | null> {\n if (!this.config.contextCompressionActionsEnabled) return null;\n if (!this.config.compressionGuidelineLearningEnabled) return null;\n\n const state = await this.storage\n .readCompressionGuidelineOptimizerState()\n .catch(() => null);\n if (!state || state.guidelineVersion <= 0) return null;\n\n const raw = await this.storage\n .readCompressionGuidelines()\n .catch(() => null);\n const summary = raw ? formatCompressionGuidelinesForRecall(raw, 5) : null;\n if (!summary) return null;\n\n return [\n \"## Active Compression Guidelines\",\n \"\",\n `Guideline version: ${state.guidelineVersion}`,\n `Updated: ${state.updatedAt}`,\n \"\",\n summary,\n ].join(\"\\n\");\n }\n\n private parseCompressionSemanticRefinement(raw: string): {\n updates: Array<{\n action: MemoryActionType;\n delta?: number;\n confidence?: \"low\" | \"medium\" | \"high\";\n note?: string;\n }>;\n } | null {\n if (typeof raw !== \"string\" || raw.trim().length === 0) return null;\n const trimmed = raw.trim();\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start === -1 || end === -1 || end <= start) return null;\n\n try {\n const parsed = JSON.parse(trimmed.slice(start, end + 1)) as {\n updates?: Array<{\n action?: unknown;\n delta?: unknown;\n confidence?: unknown;\n note?: unknown;\n }>;\n };\n if (!Array.isArray(parsed?.updates)) return null;\n\n const validActions = new Set<MemoryActionType>([\n \"store_episode\",\n \"store_note\",\n \"update_note\",\n \"create_artifact\",\n \"summarize_node\",\n \"discard\",\n \"link_graph\",\n ]);\n\n const updates = parsed.updates\n .filter(\n (item) =>\n item &&\n typeof item.action === \"string\" &&\n validActions.has(item.action as MemoryActionType),\n )\n .map((item) => {\n const confidence: \"low\" | \"medium\" | \"high\" | undefined =\n item.confidence === \"low\" ||\n item.confidence === \"medium\" ||\n item.confidence === \"high\"\n ? item.confidence\n : undefined;\n return {\n action: item.action as MemoryActionType,\n delta:\n typeof item.delta === \"number\" && Number.isFinite(item.delta)\n ? item.delta\n : undefined,\n confidence,\n note: typeof item.note === \"string\" ? item.note : undefined,\n };\n });\n\n return { updates };\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Format the active compression-guidelines section for recall. Extracted\n * from the orchestrator (was a module-level export there); re-exported by\n * the orchestrator barrel to preserve the public API. Pure — no state.\n */\nexport function formatCompressionGuidelinesForRecall(\n raw: string,\n maxLines: number = 5,\n): string | null {\n if (typeof raw !== \"string\" || raw.trim().length === 0) return null;\n const sectionMatch = raw.match(\n // End the section at `\\n## ` or end-of-string. Plain $ (not \\s*$): the\n // \\s* branch overlapped the lazy body and backtracked polynomially\n // (CodeQL js/polynomial-redos). Captured lines are trimmed/filtered below,\n // so trailing whitespace handling is unchanged.\n /## Suggested Guidelines\\s*\\n([\\s\\S]*?)(?:\\n##\\s+|$)/i,\n );\n if (!sectionMatch) return null;\n\n const lines = sectionMatch[1]\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.startsWith(\"- \"))\n .slice(0, Math.max(1, Math.floor(maxLines)));\n if (lines.length === 0) return null;\n\n return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":[]}
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-ZBJMUXZH.js";
8
8
  import {
9
9
  StorageManager
10
- } from "./chunk-7RLCCNHU.js";
10
+ } from "./chunk-Q6BAA57B.js";
11
11
  import {
12
12
  getCachedEpisodeMap,
13
13
  setCachedEpisodeMap
@@ -107,4 +107,4 @@ export {
107
107
  compareVerifiedEpisodeResults,
108
108
  searchVerifiedEpisodes
109
109
  };
110
- //# sourceMappingURL=chunk-ASKXIAHD.js.map
110
+ //# sourceMappingURL=chunk-WDJCZQB4.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  enqueuePassiveCorrectionNotification
3
- } from "./chunk-EY6MDMHK.js";
3
+ } from "./chunk-F6OEXJQQ.js";
4
4
  import {
5
5
  stripAttributesSuffix
6
6
  } from "./chunk-SVOZFLIQ.js";
@@ -260,7 +260,7 @@ import { mkdir as mkdir2, writeFile as writeFile2 } from "fs/promises";
260
260
  import { mkdir, readFile, rename, unlink, readdir, writeFile } from "fs/promises";
261
261
  import path from "path";
262
262
  var REDACTED_REQUEST_TEXT = "[redacted \u2014 never-store/redaction correction text withheld from the pending-plan file]";
263
- var CorrectionPlanner = class {
263
+ var CorrectionPlanner = class _CorrectionPlanner {
264
264
  constructor(deps) {
265
265
  this.deps = deps;
266
266
  }
@@ -510,6 +510,11 @@ var CorrectionPlanner = class {
510
510
  const plan = parsePlan(raw);
511
511
  if (!plan) return;
512
512
  plan.status = status;
513
+ if (status === "applying") {
514
+ plan.applyingAt = this.deps.now().toISOString();
515
+ } else {
516
+ delete plan.applyingAt;
517
+ }
513
518
  if (status !== "applying") {
514
519
  plan.actions = plan.actions.map(
515
520
  (a) => a.kind === "redaction_rule" ? { ...a, pattern: "[redacted \u2014 pattern applied]" } : a
@@ -534,6 +539,58 @@ var CorrectionPlanner = class {
534
539
  }
535
540
  });
536
541
  }
542
+ /**
543
+ * Stale-applying TTL: a plan in `applying` state longer than this is
544
+ * assumed to be from a crashed process and is recovered on startup
545
+ * (#1713 Item 2). 10 minutes is generous for an apply that normally
546
+ * completes in seconds, yet short enough to avoid leaving stale state.
547
+ */
548
+ static STALE_APPLYING_TTL_MS = 10 * 60 * 1e3;
549
+ /**
550
+ * Recover stale `applying` plans past the stale-applying TTL (#1713 Item 2).
551
+ *
552
+ * A plan stuck in `applying` means the process died mid-apply. Re-applying
553
+ * wholesale would duplicate succeeded actions (replacements, tombstones,
554
+ * audits), so recovery discards + scrubs the plan instead. The operator
555
+ * inspects the outcome and files a NEW plan for any actions that did not
556
+ * complete. Plans without `applyingAt` (predating this fix) are recovered
557
+ * when they are past their `expiresAt` timestamp.
558
+ *
559
+ * @returns the ids of recovered (discarded) plans.
560
+ */
561
+ async recoverStaleApplyingPlans(namespace, opts) {
562
+ const ttl = opts?.ttlMs ?? _CorrectionPlanner.STALE_APPLYING_TTL_MS;
563
+ const now = (opts?.now ?? this.deps.now()).getTime();
564
+ const dir = await this.pendingDir(namespace);
565
+ let files;
566
+ try {
567
+ files = await readdir(dir);
568
+ } catch (err) {
569
+ const code = err?.code;
570
+ if (code === "ENOENT") return [];
571
+ throw err;
572
+ }
573
+ const recovered = [];
574
+ for (const f of files) {
575
+ if (!f.endsWith(".json")) continue;
576
+ const planId = f.replace(/\.json$/, "");
577
+ let plan;
578
+ try {
579
+ plan = await this.loadPlan(namespace, planId);
580
+ } catch {
581
+ continue;
582
+ }
583
+ if (!plan || plan.status !== "applying") continue;
584
+ const stale = plan.applyingAt ? now - new Date(plan.applyingAt).getTime() >= ttl : now >= new Date(plan.expiresAt).getTime();
585
+ if (!stale) continue;
586
+ try {
587
+ await this.markConsumed(namespace, planId, "discarded");
588
+ recovered.push(planId);
589
+ } catch {
590
+ }
591
+ }
592
+ return recovered;
593
+ }
537
594
  };
538
595
  function assertSafePlanId(planId) {
539
596
  if (typeof planId !== "string" || planId.length === 0 || planId.includes("/") || planId.includes("\\") || planId.includes("\0") || planId === "." || planId === ".." || planId.startsWith(".") || planId.includes("..")) {
@@ -894,6 +951,28 @@ var CorrectionService = class {
894
951
  await this.planner.markConsumed(namespace, planId, "discarded");
895
952
  await this.planner.deletePlan(namespace, planId);
896
953
  }
954
+ /**
955
+ * Recover stale `applying` plans across the given namespaces (#1713 Item 2).
956
+ *
957
+ * Startup maintenance: scans each namespace for plans stuck in `applying`
958
+ * past the stale-applying TTL (process died mid-apply) and discards+scrubs
959
+ * them. Unlike plan/apply/listPending, this is NOT a per-caller request —
960
+ * it operates on all supplied namespaces directly because it is an
961
+ * internal maintenance operation invoked by the orchestrator at init.
962
+ *
963
+ * @returns the total count of recovered plans across all namespaces.
964
+ */
965
+ async recoverStaleApplyingPlans(namespaces) {
966
+ let recovered = 0;
967
+ for (const namespace of namespaces) {
968
+ try {
969
+ const ids = await this.planner.recoverStaleApplyingPlans(namespace);
970
+ recovered += ids.length;
971
+ } catch {
972
+ }
973
+ }
974
+ return recovered;
975
+ }
897
976
  requireEnabled() {
898
977
  if (!this.deps.isEnabled()) {
899
978
  throw new CorrectionContractError(
@@ -1164,7 +1243,7 @@ async function getExecutorMemory(wiring, namespace, memoryId) {
1164
1243
  }
1165
1244
  async function writeReplacementMemory(wiring, namespace, draft) {
1166
1245
  const storage = await wiring.orchestrator.getStorage(namespace);
1167
- const id = await storage.writeMemory(
1246
+ const { id, tombstoneBlocked } = await storage.writeMemory(
1168
1247
  draft.category ?? "fact",
1169
1248
  draft.content,
1170
1249
  {
@@ -1178,6 +1257,11 @@ async function writeReplacementMemory(wiring, namespace, draft) {
1178
1257
  ...draft.supersedes ? { supersedes: draft.supersedes } : {}
1179
1258
  }
1180
1259
  );
1260
+ if (tombstoneBlocked) {
1261
+ throw new CorrectionContractError(
1262
+ `correction replacement was tombstone-blocked (pending_review ${id}) \u2014 cannot supersede with a non-active replacement`
1263
+ );
1264
+ }
1181
1265
  return id;
1182
1266
  }
1183
1267
  async function applyEditMemory(wiring, namespace, memoryId, patch) {
@@ -1219,7 +1303,7 @@ async function rescopeMemoryFn(wiring, namespace, memoryId, toNamespace) {
1219
1303
  const destStorage = await wiring.orchestrator.getStorage(toNamespace);
1220
1304
  const fm = memory.frontmatter;
1221
1305
  const destContent = fm.structuredAttributes ? stripAttributesSuffix(memory.content) : memory.content;
1222
- const destId = await destStorage.writeMemory(fm.category, destContent, {
1306
+ const { id: destId, tombstoneBlocked: destBlocked } = await destStorage.writeMemory(fm.category, destContent, {
1223
1307
  source: `correction:rescope:${namespace}`,
1224
1308
  ...typeof fm.confidence === "number" ? { confidence: fm.confidence } : {},
1225
1309
  ...Array.isArray(fm.tags) ? { tags: fm.tags } : {},
@@ -1231,6 +1315,11 @@ async function rescopeMemoryFn(wiring, namespace, memoryId, toNamespace) {
1231
1315
  ...Array.isArray(fm.links) ? { links: fm.links } : {},
1232
1316
  ...fm.intentGoal ? { intentGoal: fm.intentGoal } : {}
1233
1317
  });
1318
+ if (destBlocked) {
1319
+ throw new CorrectionContractError(
1320
+ `rescope of ${memoryId} into "${toNamespace}" was tombstone-blocked (pending_review ${destId}) \u2014 keeping source active`
1321
+ );
1322
+ }
1234
1323
  try {
1235
1324
  await sourceStorage.writeMemoryFrontmatter(memory, {
1236
1325
  status: "archived",
@@ -1299,7 +1388,7 @@ async function registerRedactionRuleFn(wiring, namespace, pattern) {
1299
1388
  }
1300
1389
  async function appendAuditRecordFn(wiring, namespace, record) {
1301
1390
  const storage = await wiring.orchestrator.getStorage(namespace);
1302
- const id = await storage.writeMemory("correction", buildAuditBody(record), {
1391
+ const { id } = await storage.writeMemory("correction", buildAuditBody(record), {
1303
1392
  source: "correction-contract",
1304
1393
  confidence: 1,
1305
1394
  tags: ["correction-audit", `plan:${record.planId}`, `classification:${record.classification}`]
@@ -1794,4 +1883,4 @@ export {
1794
1883
  capturePassiveCorrections,
1795
1884
  clusterByKey
1796
1885
  };
1797
- //# sourceMappingURL=chunk-AQLOP5F4.js.map
1886
+ //# sourceMappingURL=chunk-WNGXQMRI.js.map