@remnic/core 9.65.1 → 9.65.3

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 (576) hide show
  1. package/dist/access-admin-ops-surface.d.ts +44 -44
  2. package/dist/access-admin-ops-surface.js +36 -35
  3. package/dist/access-authorization-probe.d.ts +39 -40
  4. package/dist/access-authorization-probe.js +37 -36
  5. package/dist/access-boundary.d.ts +41 -185
  6. package/dist/access-boundary.js +36 -35
  7. package/dist/access-cli.js +110 -107
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +3 -1
  10. package/dist/access-extraction-force-flush.d.ts +25 -25
  11. package/dist/access-extraction-force-flush.js +36 -35
  12. package/dist/access-health-types.d.ts +3 -1
  13. package/dist/access-http-lcm-compaction.d.ts +39 -39
  14. package/dist/access-http-lifecycle-flush.d.ts +40 -41
  15. package/dist/access-http-offline-stream.d.ts +25 -25
  16. package/dist/access-http-query.d.ts +4 -2
  17. package/dist/access-http-query.js +38 -37
  18. package/dist/access-http.d.ts +51 -44
  19. package/dist/access-http.js +57 -56
  20. package/dist/access-identity-continuity-surface.d.ts +12 -12
  21. package/dist/access-identity-continuity-surface.js +36 -35
  22. package/dist/access-lcm-surface.d.ts +27 -27
  23. package/dist/access-lcm-surface.js +36 -35
  24. package/dist/access-mcp-admin-tools.d.ts +9 -1
  25. package/dist/access-mcp-admin-tools.js +3 -1
  26. package/dist/access-mcp-output-schemas.js +1 -1
  27. package/dist/access-mcp.d.ts +39 -39
  28. package/dist/access-mcp.js +50 -47
  29. package/dist/access-memory-search-fanout.d.ts +4 -2
  30. package/dist/{access-namespace-preflight-BKUnKsBv.d.ts → access-namespace-preflight-B7Usyz-K.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +5 -3
  32. package/dist/access-namespace-preflight.js +36 -35
  33. package/dist/access-observe-write-surface.d.ts +39 -39
  34. package/dist/access-observe-write-surface.js +36 -35
  35. package/dist/access-offline-manifest.d.ts +12 -12
  36. package/dist/access-offline-manifest.js +5 -5
  37. package/dist/access-operations-batch.js +41 -40
  38. package/dist/access-operations.d.ts +46 -47
  39. package/dist/access-operations.js +44 -43
  40. package/dist/access-recall-concurrency.d.ts +40 -40
  41. package/dist/access-recall-concurrency.js +36 -35
  42. package/dist/access-recall-response.d.ts +24 -24
  43. package/dist/access-recall-response.js +36 -35
  44. package/dist/access-recall-surface.d.ts +24 -24
  45. package/dist/access-recall-surface.js +36 -35
  46. package/dist/access-schema.d.ts +139 -139
  47. package/dist/access-schema.js +3 -3
  48. package/dist/{access-service-B1Lbb-nQ.d.ts → access-service-DkaIG3n8.d.ts} +688 -140
  49. package/dist/access-service-helpers.d.ts +40 -40
  50. package/dist/access-service.d.ts +47 -47
  51. package/dist/access-service.js +36 -35
  52. package/dist/access-surface-catalog.d.ts +41 -42
  53. package/dist/access-surface-catalog.js +44 -37
  54. package/dist/access-surface-catalog.js.map +1 -1
  55. package/dist/access-wearables-meetings-surface.d.ts +5 -3
  56. package/dist/action-confidence.d.ts +3 -1
  57. package/dist/active-memory-bridge.d.ts +3 -1
  58. package/dist/active-recall.d.ts +3 -1
  59. package/dist/active-recall.js +11 -1
  60. package/dist/active-recall.js.map +1 -1
  61. package/dist/adapters/index.js +4 -4
  62. package/dist/adapters/registry.js +2 -2
  63. package/dist/ambient-provenance.d.ts +3 -1
  64. package/dist/artifact-search.d.ts +3 -1
  65. package/dist/{auto-sync-5L7EUZ27.js → auto-sync-H64ZCNIR.js} +13 -5
  66. package/dist/{auto-sync-5L7EUZ27.js.map → auto-sync-H64ZCNIR.js.map} +1 -1
  67. package/dist/behavior-learner.d.ts +3 -1
  68. package/dist/behavior-signals.d.ts +3 -1
  69. package/dist/bootstrap.d.ts +12 -12
  70. package/dist/briefing-window.d.ts +4 -2
  71. package/dist/briefing.d.ts +4 -2
  72. package/dist/briefing.js +16 -15
  73. package/dist/buffer-surprise-report.d.ts +3 -1
  74. package/dist/buffer-turn-helpers.d.ts +3 -1
  75. package/dist/buffer.d.ts +4 -2
  76. package/dist/buffer.js +4 -4
  77. package/dist/bulk-import/index.d.ts +5 -3
  78. package/dist/calibration.d.ts +3 -1
  79. package/dist/calibration.js +1 -1
  80. package/dist/capabilities.d.ts +3 -1
  81. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  82. package/dist/{catalog-DjVhJoRM.d.ts → catalog-CX2BZEJh.d.ts} +1 -1
  83. package/dist/causal-behavior.d.ts +1 -1
  84. package/dist/causal-consolidation.d.ts +3 -1
  85. package/dist/causal-consolidation.js +20 -19
  86. package/dist/causal-consolidation.js.map +1 -1
  87. package/dist/causal-trajectory-graph.d.ts +1 -1
  88. package/dist/{chunk-MIBKEW7A.js → chunk-2VXWFYJE.js} +3 -3
  89. package/dist/{chunk-3YTTAGPB.js → chunk-3DVBKTSO.js} +2 -2
  90. package/dist/{chunk-EIR5VLIH.js → chunk-4K7IW3F7.js} +2 -2
  91. package/dist/chunk-4K7IW3F7.js.map +1 -0
  92. package/dist/{chunk-JTSVMJHV.js → chunk-4XDGYCZI.js} +3 -3
  93. package/dist/chunk-573TEZCD.js +88 -0
  94. package/dist/chunk-573TEZCD.js.map +1 -0
  95. package/dist/{chunk-HQSBYI5X.js → chunk-57HVIG5U.js} +2 -2
  96. package/dist/{chunk-PMVPCZJZ.js → chunk-6433HV72.js} +2 -2
  97. package/dist/{chunk-N6TRHP72.js → chunk-6TAX66IA.js} +2 -2
  98. package/dist/{chunk-AGKIG3YA.js → chunk-6VALIZKG.js} +2 -2
  99. package/dist/{chunk-YQ3CBLL4.js → chunk-76PL4XLG.js} +512 -8
  100. package/dist/chunk-76PL4XLG.js.map +1 -0
  101. package/dist/{chunk-4NZHHGVL.js → chunk-7BDZTALN.js} +4 -1
  102. package/dist/chunk-7BDZTALN.js.map +1 -0
  103. package/dist/{chunk-NS5ETDYD.js → chunk-7BEPVIH3.js} +3 -3
  104. package/dist/{chunk-JG22O53B.js → chunk-7CBKAQIG.js} +2 -1
  105. package/dist/chunk-7CBKAQIG.js.map +1 -0
  106. package/dist/{chunk-LYIZXQYY.js → chunk-7KFIMGMP.js} +2 -2
  107. package/dist/{chunk-LWVO2QZV.js → chunk-7QOO4LGC.js} +56 -56
  108. package/dist/chunk-AAXJNINV.js +55 -0
  109. package/dist/chunk-AAXJNINV.js.map +1 -0
  110. package/dist/{chunk-56BSXSHC.js → chunk-AB3A7EFH.js} +31 -2
  111. package/dist/{chunk-56BSXSHC.js.map → chunk-AB3A7EFH.js.map} +1 -1
  112. package/dist/{chunk-CCTVAVTT.js → chunk-AUO2LJ3K.js} +2 -2
  113. package/dist/{chunk-ALCJRQ72.js → chunk-AYDDB3XI.js} +2 -2
  114. package/dist/{chunk-3TMYV3LP.js → chunk-AYYGRVRP.js} +5 -5
  115. package/dist/{chunk-W6TSGWYS.js → chunk-AZAA5DNP.js} +2 -2
  116. package/dist/{chunk-WTOE7CW4.js → chunk-BKYPJUQL.js} +122 -16
  117. package/dist/chunk-BKYPJUQL.js.map +1 -0
  118. package/dist/{chunk-6JJT5AKI.js → chunk-BQUEAVNW.js} +2 -2
  119. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  120. package/dist/{chunk-CEH2AFXG.js → chunk-C24UZSFW.js} +6 -6
  121. package/dist/{chunk-ZPN7W3OP.js → chunk-CDUUDBWJ.js} +3 -3
  122. package/dist/{chunk-35NN3ZFA.js → chunk-CTVWELNK.js} +21 -3
  123. package/dist/chunk-CTVWELNK.js.map +1 -0
  124. package/dist/{chunk-Y23B2QXP.js → chunk-D27J626P.js} +2 -2
  125. package/dist/{chunk-2572MRP2.js → chunk-DHTQP334.js} +2 -2
  126. package/dist/{chunk-HJQZQUPC.js → chunk-DJZWNKFO.js} +5 -5
  127. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  128. package/dist/{chunk-VJ6ECBIP.js → chunk-E4MVQQVX.js} +2 -2
  129. package/dist/{chunk-SYJ6EKKE.js → chunk-EIVIB73I.js} +2 -2
  130. package/dist/{chunk-HUNSEO5U.js → chunk-EV3YFLCB.js} +2 -2
  131. package/dist/{chunk-GEULB2VI.js → chunk-FC7TIRFS.js} +21 -1
  132. package/dist/chunk-FC7TIRFS.js.map +1 -0
  133. package/dist/{chunk-VPGRXEAB.js → chunk-G57LQRP6.js} +2 -2
  134. package/dist/{chunk-BC4QD3FM.js → chunk-GN55KU2P.js} +2 -2
  135. package/dist/{chunk-4W6INNXO.js → chunk-GUXS322H.js} +2 -2
  136. package/dist/{chunk-DBXZZIDU.js → chunk-H5FW4S5Q.js} +434 -693
  137. package/dist/chunk-H5FW4S5Q.js.map +1 -0
  138. package/dist/chunk-I32NKXE2.js +879 -0
  139. package/dist/chunk-I32NKXE2.js.map +1 -0
  140. package/dist/{chunk-3MADV4YC.js → chunk-IQSC3V2E.js} +2 -2
  141. package/dist/{chunk-UYCIS6V5.js → chunk-JCWY73FK.js} +2 -2
  142. package/dist/{chunk-T42L3S6A.js → chunk-LBWQ65SX.js} +4 -4
  143. package/dist/{chunk-MSTNSVXI.js → chunk-LDBFXD4F.js} +2 -1
  144. package/dist/chunk-LDBFXD4F.js.map +1 -0
  145. package/dist/{chunk-CEQF6L5K.js → chunk-LUNJ3WFO.js} +9 -7
  146. package/dist/chunk-LUNJ3WFO.js.map +1 -0
  147. package/dist/{chunk-256FBCVX.js → chunk-M4AHBM72.js} +7 -7
  148. package/dist/{chunk-YEQEGSJA.js → chunk-MBDJJTAT.js} +3 -3
  149. package/dist/{chunk-IAY7YBXS.js → chunk-MRTUN665.js} +2 -2
  150. package/dist/{chunk-JFJ3MHGV.js → chunk-NXKJHSDN.js} +1 -1
  151. package/dist/chunk-NXKJHSDN.js.map +1 -0
  152. package/dist/{chunk-R3AAOKR2.js → chunk-NZWEEALH.js} +2 -2
  153. package/dist/{chunk-I2HTKOOP.js → chunk-ODZG724P.js} +2 -2
  154. package/dist/{chunk-7QFBLYFP.js → chunk-OJD4WS2E.js} +3 -3
  155. package/dist/{chunk-CUS6S7PN.js → chunk-OLWTCWQ2.js} +9 -9
  156. package/dist/chunk-OLWTCWQ2.js.map +1 -0
  157. package/dist/{chunk-53ENM6F6.js → chunk-P4DHENRE.js} +2 -2
  158. package/dist/{chunk-DEFI2QBT.js → chunk-PAYGC3BD.js} +52 -22
  159. package/dist/chunk-PAYGC3BD.js.map +1 -0
  160. package/dist/{chunk-KPBLJCCV.js → chunk-PDVQ5JU3.js} +2 -2
  161. package/dist/{chunk-7BY7V4YX.js → chunk-Q4WONDMJ.js} +4 -3
  162. package/dist/{chunk-7BY7V4YX.js.map → chunk-Q4WONDMJ.js.map} +1 -1
  163. package/dist/{chunk-ESCQ6LY7.js → chunk-QFMO32TO.js} +3 -3
  164. package/dist/{chunk-HQSPXTQO.js → chunk-QXIQPCCN.js} +1 -1
  165. package/dist/{chunk-CFRBTATE.js → chunk-R47WINCY.js} +3 -3
  166. package/dist/{chunk-G72IPMR7.js → chunk-R4OCGPSH.js} +2 -2
  167. package/dist/{chunk-LCU5R6TQ.js → chunk-RAIUTAZZ.js} +22 -3
  168. package/dist/chunk-RAIUTAZZ.js.map +1 -0
  169. package/dist/chunk-RIAM7DND.js +167 -0
  170. package/dist/chunk-RIAM7DND.js.map +1 -0
  171. package/dist/{chunk-VZVP2W4O.js → chunk-RK4WXUI2.js} +2 -2
  172. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  173. package/dist/{chunk-6L27N6YI.js → chunk-S7Q5CM7E.js} +2 -2
  174. package/dist/{chunk-CTQRPANJ.js → chunk-SVSRPG6M.js} +2 -2
  175. package/dist/{chunk-GXWDWOWP.js → chunk-TDKSCV62.js} +2 -2
  176. package/dist/{chunk-S2VBSTTA.js → chunk-THG4GYIE.js} +2 -2
  177. package/dist/{chunk-IXRC7EQG.js → chunk-TR7DGXGI.js} +2 -2
  178. package/dist/{chunk-63FHSH7E.js → chunk-TYUS5TLG.js} +4 -4
  179. package/dist/{chunk-7PWWGYGO.js → chunk-URHCUXKI.js} +2 -2
  180. package/dist/{chunk-Z54TXZ2F.js → chunk-VA5KMSAE.js} +16 -7
  181. package/dist/chunk-VA5KMSAE.js.map +1 -0
  182. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  183. package/dist/{chunk-MUJ4QFUQ.js → chunk-W4BMEGQA.js} +4 -4
  184. package/dist/{chunk-5HK3CJAR.js → chunk-W675UJCZ.js} +2 -2
  185. package/dist/{chunk-3PXVYJMC.js → chunk-WN5FSGLE.js} +2077 -215
  186. package/dist/chunk-WN5FSGLE.js.map +1 -0
  187. package/dist/{chunk-3RHFGGI5.js → chunk-YF6UHWOV.js} +30 -10
  188. package/dist/chunk-YF6UHWOV.js.map +1 -0
  189. package/dist/{chunk-X5SDZMO7.js → chunk-YHCBJULX.js} +2 -2
  190. package/dist/{chunk-5UYSCYR7.js → chunk-Z4RPXHJH.js} +4 -4
  191. package/dist/{cli-Pulnz-qm.d.ts → cli-ChKeYMZv.d.ts} +5 -5
  192. package/dist/cli.d.ts +25 -25
  193. package/dist/cli.js +81 -78
  194. package/dist/coding/pre-action-gate.d.ts +2 -60
  195. package/dist/compounding/engine.d.ts +4 -2
  196. package/dist/compounding/engine.js +17 -16
  197. package/dist/compounding/preference-consolidator.d.ts +3 -1
  198. package/dist/compression-optimizer.d.ts +3 -1
  199. package/dist/config.d.ts +3 -1
  200. package/dist/config.js +11 -1
  201. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  202. package/dist/connectors/codex-materialize-runner.js +16 -15
  203. package/dist/connectors/codex-materialize.d.ts +3 -1
  204. package/dist/connectors/index.d.ts +3 -1
  205. package/dist/connectors/index.js +16 -15
  206. package/dist/consolidation-provenance-check.d.ts +4 -2
  207. package/dist/consolidation-undo.d.ts +4 -2
  208. package/dist/contradiction/index.d.ts +10 -270
  209. package/dist/contradiction/index.js +20 -7
  210. package/dist/{contradiction-review-QKJH5DKD.js → contradiction-review-WRVLRWHS.js} +6 -2
  211. package/dist/{contradiction-scan-VOTQRRSX.js → contradiction-scan-AKUWPX5N.js} +5 -3
  212. package/dist/converge-config.d.ts +3 -1
  213. package/dist/convergence-refresh.d.ts +4 -2
  214. package/dist/convergence-refresh.js +18 -17
  215. package/dist/conversation-index/backend.d.ts +3 -1
  216. package/dist/conversation-index/chunker.d.ts +3 -1
  217. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  218. package/dist/conversation-index/indexer.d.ts +3 -1
  219. package/dist/conversation-index/search.d.ts +3 -1
  220. package/dist/corpus-watermark.d.ts +3 -1
  221. package/dist/corpus-watermark.js +18 -17
  222. package/dist/cross-lingual-recall.d.ts +3 -1
  223. package/dist/day-summary.d.ts +3 -1
  224. package/dist/delinearize.d.ts +3 -1
  225. package/dist/dependency-propagation-config.d.ts +3 -1
  226. package/dist/{dependency-propagation-delivery-Co17gxYb.d.ts → dependency-propagation-delivery-B8ZMBBCY.d.ts} +1 -1
  227. package/dist/direct-answer-wiring.d.ts +3 -1
  228. package/dist/direct-answer.d.ts +3 -1
  229. package/dist/embedding-fallback.d.ts +3 -1
  230. package/dist/enrichment/index.d.ts +3 -1
  231. package/dist/entity-origin-fields.d.ts +3 -1
  232. package/dist/entity-retrieval.d.ts +4 -2
  233. package/dist/entity-retrieval.js +16 -15
  234. package/dist/entity-schema.d.ts +3 -1
  235. package/dist/episodic-context.d.ts +3 -1
  236. package/dist/explicit-capture.d.ts +12 -12
  237. package/dist/explicit-capture.js +7 -6
  238. package/dist/external-wiki-access.d.ts +41 -42
  239. package/dist/external-wiki-access.js +37 -36
  240. package/dist/external-wiki-collection-registration.d.ts +3 -1
  241. package/dist/external-wiki-collection.d.ts +3 -1
  242. package/dist/external-wiki-mcp-tools.d.ts +40 -40
  243. package/dist/extraction-error-classification.d.ts +3 -1
  244. package/dist/extraction-faithfulness.d.ts +3 -1
  245. package/dist/extraction-judge-telemetry.d.ts +3 -1
  246. package/dist/extraction-judge-training.d.ts +3 -1
  247. package/dist/extraction-judge.d.ts +3 -1
  248. package/dist/extraction-judge.js +2 -2
  249. package/dist/extraction-liveness.d.ts +3 -1
  250. package/dist/extraction-normalization.d.ts +3 -1
  251. package/dist/extraction-normalization.js +2 -2
  252. package/dist/extraction-prompt.d.ts +4 -2
  253. package/dist/extraction-prompt.js +1 -1
  254. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  255. package/dist/extraction-source-grounding.d.ts +3 -1
  256. package/dist/extraction.d.ts +3 -1
  257. package/dist/extraction.js +22 -21
  258. package/dist/fallback-llm.d.ts +3 -1
  259. package/dist/graph-dashboard-diff.d.ts +3 -1
  260. package/dist/graph-dashboard-key.d.ts +3 -1
  261. package/dist/graph-dashboard-parser.d.ts +3 -1
  262. package/dist/graph-edge-reinforcement.d.ts +3 -1
  263. package/dist/graph-path-reconstruction.d.ts +3 -1
  264. package/dist/graph-path-scoring.d.ts +3 -1
  265. package/dist/graph-snapshot.d.ts +3 -1
  266. package/dist/graph.d.ts +3 -1
  267. package/dist/harmonic-retrieval.js +1 -1
  268. package/dist/importance.d.ts +3 -1
  269. package/dist/importers/index.d.ts +3 -1
  270. package/dist/in-flight-reads.d.ts +3 -1
  271. package/dist/index-CexDrJzC.d.ts +284 -0
  272. package/dist/index.d.ts +946 -707
  273. package/dist/index.js +253 -151
  274. package/dist/intent.d.ts +3 -1
  275. package/dist/lcm/engine.d.ts +3 -1
  276. package/dist/lcm/engine.js +3 -3
  277. package/dist/lcm/index.d.ts +3 -1
  278. package/dist/lcm/index.js +6 -6
  279. package/dist/lcm/tools.d.ts +3 -1
  280. package/dist/lifecycle.d.ts +3 -1
  281. package/dist/live-connectors-runner.d.ts +3 -1
  282. package/dist/local-llm.d.ts +3 -1
  283. package/dist/local-model-endpoint.d.ts +3 -1
  284. package/dist/maintenance/memory-governance.d.ts +3 -1
  285. package/dist/maintenance/memory-governance.js +16 -15
  286. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +4 -2
  287. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +16 -15
  288. package/dist/maintenance/rebuild-memory-projection.d.ts +4 -2
  289. package/dist/maintenance/rebuild-memory-projection.js +17 -16
  290. package/dist/{maintenance-DiSLtVN7.d.ts → maintenance-nkdtSrVr.d.ts} +3 -3
  291. package/dist/mcp-memory-inspector-app.d.ts +37 -37
  292. package/dist/mcp-read-only-tools.js +1 -1
  293. package/dist/memory-action-policy.d.ts +3 -1
  294. package/dist/memory-cache.d.ts +3 -1
  295. package/dist/memory-lifecycle-ledger-utils.d.ts +3 -1
  296. package/dist/memory-projection-store.d.ts +3 -1
  297. package/dist/memory-provenance.d.ts +3 -1
  298. package/dist/memory-snapshot.d.ts +3 -1
  299. package/dist/memory-subject-cli.d.ts +177 -0
  300. package/dist/memory-subject-cli.js +16 -0
  301. package/dist/memory-subject.d.ts +128 -0
  302. package/dist/memory-subject.js +44 -0
  303. package/dist/memory-subject.js.map +1 -0
  304. package/dist/memory-worth-outcomes.d.ts +7 -4
  305. package/dist/memory-worth-outcomes.js +1 -1
  306. package/dist/models-json.d.ts +3 -1
  307. package/dist/namespaces/migrate.d.ts +5 -3
  308. package/dist/namespaces/migrate.js +17 -16
  309. package/dist/namespaces/principal.d.ts +3 -1
  310. package/dist/namespaces/search.d.ts +3 -1
  311. package/dist/namespaces/search.js +6 -6
  312. package/dist/namespaces/storage.d.ts +5 -3
  313. package/dist/namespaces/storage.js +16 -15
  314. package/dist/native-knowledge.d.ts +3 -1
  315. package/dist/offline-sync-impression-drain.d.ts +3 -1
  316. package/dist/operator-doctor-corpus.d.ts +3 -1
  317. package/dist/operator-doctor-corpus.js +19 -18
  318. package/dist/operator-doctor-replica.d.ts +3 -1
  319. package/dist/operator-toolkit.d.ts +5 -3
  320. package/dist/operator-toolkit.js +29 -24
  321. package/dist/orchestration/compression-guideline-coordinator.d.ts +4 -2
  322. package/dist/orchestration/maintenance.d.ts +6 -4
  323. package/dist/orchestration/maintenance.js +22 -21
  324. package/dist/{orchestrator-DzCaxNS4.d.ts → orchestrator-Bvq1-RQs.d.ts} +23 -9
  325. package/dist/orchestrator.d.ts +12 -12
  326. package/dist/orchestrator.js +111 -108
  327. package/dist/patterns-cli.d.ts +3 -1
  328. package/dist/{pipeline-HJ8DKbFl.d.ts → pipeline-C8vfIiTX.d.ts} +1 -1
  329. package/dist/policy-runtime.d.ts +3 -1
  330. package/dist/proactive-contention.d.ts +3 -1
  331. package/dist/provenance.d.ts +3 -1
  332. package/dist/{public-http-DwXauTX3.d.ts → public-http-Cy0aYbys.d.ts} +1 -1
  333. package/dist/{qmd-BzxluoLt.d.ts → qmd-B9p1SZTZ.d.ts} +1 -1
  334. package/dist/qmd-preflight.d.ts +4 -2
  335. package/dist/qmd-recall-cache.d.ts +3 -1
  336. package/dist/qmd.d.ts +4 -2
  337. package/dist/qmd.js +4 -4
  338. package/dist/recall-concurrency-config.d.ts +3 -1
  339. package/dist/recall-disclosure-escalation.d.ts +3 -1
  340. package/dist/recall-explain-renderer.d.ts +3 -1
  341. package/dist/recall-explain-renderer.js +3 -3
  342. package/dist/recall-memory-map.d.ts +3 -1
  343. package/dist/recall-planner-llm.d.ts +3 -1
  344. package/dist/recall-state.d.ts +3 -1
  345. package/dist/recall-tag-filter.d.ts +3 -1
  346. package/dist/recall-timings.d.ts +3 -1
  347. package/dist/recall-xray-cli.d.ts +3 -1
  348. package/dist/recall-xray-cli.js +4 -4
  349. package/dist/recall-xray-renderer.d.ts +3 -1
  350. package/dist/recall-xray-renderer.js +3 -3
  351. package/dist/recall-xray.d.ts +3 -1
  352. package/dist/recall-xray.js +2 -2
  353. package/dist/reconcile/cursor.d.ts +3 -1
  354. package/dist/reconcile/manifest.d.ts +3 -1
  355. package/dist/reconcile/manifest.js +3 -3
  356. package/dist/reconcile/plan.d.ts +3 -1
  357. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  358. package/dist/replay/normalizers/claude.d.ts +3 -1
  359. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  360. package/dist/replay/normalizers/shared.d.ts +3 -1
  361. package/dist/replay/runner.d.ts +3 -1
  362. package/dist/replay/types.d.ts +3 -1
  363. package/dist/replica-divergence.d.ts +3 -1
  364. package/dist/replica-peers-config.d.ts +3 -1
  365. package/dist/resolution-4552BNRV.js +36 -0
  366. package/dist/resolution-4552BNRV.js.map +1 -0
  367. package/dist/resolve-auth-token.d.ts +3 -1
  368. package/dist/resume-bundles.js +9 -2
  369. package/dist/retrieval-agents.d.ts +4 -2
  370. package/dist/retrieval-tiers.d.ts +3 -1
  371. package/dist/routing/engine.d.ts +3 -1
  372. package/dist/routing/store.d.ts +3 -1
  373. package/dist/salvage-envelope.d.ts +3 -1
  374. package/dist/salvage-envelope.js +10 -2
  375. package/dist/schemas.d.ts +130 -116
  376. package/dist/schemas.js +1 -1
  377. package/dist/{scope-profiles-CEMZz0t5.d.ts → scope-profiles-DLrRxFWR.d.ts} +1 -1
  378. package/dist/search/embed-helper.d.ts +3 -1
  379. package/dist/search/factory.d.ts +3 -1
  380. package/dist/search/factory.js +5 -5
  381. package/dist/search/index.d.ts +3 -1
  382. package/dist/search/index.js +9 -9
  383. package/dist/search/lancedb-backend.d.ts +3 -1
  384. package/dist/search/meilisearch-backend.d.ts +3 -1
  385. package/dist/search/noop-backend.d.ts +3 -1
  386. package/dist/search/orama-backend.d.ts +3 -1
  387. package/dist/search/port.d.ts +3 -1
  388. package/dist/search/remote-backend.d.ts +3 -1
  389. package/dist/{semantic-TddhF0y7.d.ts → semantic-BalR6EXU.d.ts} +1 -1
  390. package/dist/{semantic-consolidation-D9dYj6vu.d.ts → semantic-consolidation-DlN6xe20.d.ts} +1 -1
  391. package/dist/semantic-consolidation.d.ts +4 -2
  392. package/dist/semantic-consolidation.js +17 -16
  393. package/dist/semantic-rule-promotion.js +16 -15
  394. package/dist/semantic-rule-verifier.d.ts +3 -1
  395. package/dist/semantic-rule-verifier.js +16 -15
  396. package/dist/{service-_qgST_0y.d.ts → service-GkYyVfm9.d.ts} +2 -2
  397. package/dist/session-observer-bands.d.ts +3 -1
  398. package/dist/session-observer-state.d.ts +3 -1
  399. package/dist/shared-context/manager.d.ts +13 -11
  400. package/dist/signal.d.ts +3 -1
  401. package/dist/source-agent-qualifier.d.ts +3 -1
  402. package/dist/source-agent-qualifier.js +18 -17
  403. package/dist/{storage-B9lbNTYE.d.ts → storage-BIDzuKIn.d.ts} +3 -2
  404. package/dist/storage.d.ts +4 -2
  405. package/dist/storage.js +18 -17
  406. package/dist/subject-config.d.ts +40 -0
  407. package/dist/subject-config.js +20 -0
  408. package/dist/subject-config.js.map +1 -0
  409. package/dist/summarizer.d.ts +3 -1
  410. package/dist/summary-snapshot.d.ts +3 -1
  411. package/dist/support-passport/index.d.ts +43 -43
  412. package/dist/support-passport/index.js +39 -38
  413. package/dist/temporal-supersession.d.ts +4 -2
  414. package/dist/temporal-timeline-recall.d.ts +3 -1
  415. package/dist/temporal-validity.d.ts +3 -1
  416. package/dist/threading.d.ts +3 -1
  417. package/dist/tier-migration.d.ts +4 -2
  418. package/dist/tier-routing.d.ts +3 -1
  419. package/dist/topics.d.ts +3 -1
  420. package/dist/transcript.d.ts +3 -1
  421. package/dist/transfer/backup.js +2 -2
  422. package/dist/transfer/capsule-export.js +2 -2
  423. package/dist/transfer/capsule-import.js +2 -2
  424. package/dist/transfer/types.d.ts +86 -86
  425. package/dist/trust-score-stage.d.ts +3 -1
  426. package/dist/trust-score.d.ts +3 -1
  427. package/dist/{types-BrEzuxPA.d.ts → types-BxAcOl5Q.d.ts} +360 -32
  428. package/dist/types.d.ts +3 -1
  429. package/dist/types.js +1 -1
  430. package/dist/utility-runtime.d.ts +3 -1
  431. package/dist/verified-recall.js +16 -15
  432. package/dist/who-knows-cli.d.ts +40 -40
  433. package/dist/who-knows-cli.js +17 -16
  434. package/dist/who-knows.d.ts +42 -42
  435. package/dist/who-knows.js +16 -15
  436. package/dist/write-envelope.d.ts +7 -2
  437. package/dist/write-envelope.js +10 -1
  438. package/package.json +2 -2
  439. package/scripts/build-with-heap.mjs +1 -1
  440. package/src/access-boundary.ts +6 -0
  441. package/src/access-http.ts +6 -5
  442. package/src/access-mcp-admin-tools.ts +38 -0
  443. package/src/access-mcp-output-schemas.ts +20 -0
  444. package/src/access-mcp.ts +8 -8
  445. package/src/access-operations-batch.ts +13 -0
  446. package/src/access-service.ts +112 -0
  447. package/src/access-surface-catalog.test.ts +24 -0
  448. package/src/access-surface-catalog.ts +6 -0
  449. package/src/coding/action-gate.test.ts +341 -0
  450. package/src/coding/action-gate.ts +556 -0
  451. package/src/config.ts +15 -17
  452. package/src/contradiction/contradiction-review.ts +50 -4
  453. package/src/contradiction/contradiction-scan.ts +14 -3
  454. package/src/contradiction/resolution.ts +50 -2
  455. package/src/extraction-prompt.ts +1 -0
  456. package/src/extraction.ts +4 -1
  457. package/src/index.ts +9 -9
  458. package/src/mcp-read-only-tools.ts +1 -0
  459. package/src/memory-subject-cli.ts +135 -0
  460. package/src/memory-subject.test.ts +48 -0
  461. package/src/memory-subject.ts +314 -0
  462. package/src/memory-worth-outcomes.test.ts +6 -2
  463. package/src/memory-worth-outcomes.ts +11 -7
  464. package/src/operator-toolkit.ts +1 -1
  465. package/src/orchestration/extraction-persist.ts +48 -48
  466. package/src/orchestration/recall-internal.ts +6 -5
  467. package/src/orchestration/recall-rerank-coordinator.ts +123 -4
  468. package/src/orchestration/recall-result-formatter.ts +6 -2
  469. package/src/orchestration/recall-search-pipeline.ts +14 -1
  470. package/src/preferences/drift-config.ts +118 -0
  471. package/src/preferences/drift-recall.ts +133 -0
  472. package/src/preferences/drift-types.ts +87 -0
  473. package/src/preferences/index.ts +12 -0
  474. package/src/preferences/preference-drift.test.ts +690 -0
  475. package/src/preferences/preference-drift.ts +724 -0
  476. package/src/procedural/library-maintenance.test.ts +582 -0
  477. package/src/procedural/library-maintenance.ts +546 -0
  478. package/src/procedural/maintenance-config.ts +78 -0
  479. package/src/procedural/procedure-recall.ts +29 -1
  480. package/src/procedural/procedure-stats.ts +20 -0
  481. package/src/review/review-deck-access.test.ts +325 -0
  482. package/src/review/review-deck-http-base.ts +133 -0
  483. package/src/review/review-deck-mutation.test.ts +417 -0
  484. package/src/review/review-deck-mutation.ts +677 -0
  485. package/src/review/review-deck-snapshot.ts +196 -0
  486. package/src/review/review-deck-surface.ts +117 -0
  487. package/src/review/review-deck.test.ts +347 -0
  488. package/src/review/review-deck.ts +311 -0
  489. package/src/schemas.ts +7 -0
  490. package/src/spaces/index.ts +38 -2
  491. package/src/storage.ts +10 -8
  492. package/src/subject-config.ts +80 -0
  493. package/src/types.ts +33 -32
  494. package/src/write-envelope.test.ts +14 -0
  495. package/src/write-envelope.ts +24 -3
  496. package/dist/chunk-35NN3ZFA.js.map +0 -1
  497. package/dist/chunk-3PXVYJMC.js.map +0 -1
  498. package/dist/chunk-3RHFGGI5.js.map +0 -1
  499. package/dist/chunk-4NZHHGVL.js.map +0 -1
  500. package/dist/chunk-CEQF6L5K.js.map +0 -1
  501. package/dist/chunk-CUS6S7PN.js.map +0 -1
  502. package/dist/chunk-DBXZZIDU.js.map +0 -1
  503. package/dist/chunk-DEFI2QBT.js.map +0 -1
  504. package/dist/chunk-EIR5VLIH.js.map +0 -1
  505. package/dist/chunk-GEULB2VI.js.map +0 -1
  506. package/dist/chunk-JFJ3MHGV.js.map +0 -1
  507. package/dist/chunk-JG22O53B.js.map +0 -1
  508. package/dist/chunk-LCU5R6TQ.js.map +0 -1
  509. package/dist/chunk-MDVBCPOS.js +0 -402
  510. package/dist/chunk-MDVBCPOS.js.map +0 -1
  511. package/dist/chunk-MSTNSVXI.js.map +0 -1
  512. package/dist/chunk-WTOE7CW4.js.map +0 -1
  513. package/dist/chunk-YQ3CBLL4.js.map +0 -1
  514. package/dist/chunk-Z54TXZ2F.js.map +0 -1
  515. package/dist/resolution-DKMBPXHI.js +0 -18
  516. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  517. /package/dist/{chunk-MIBKEW7A.js.map → chunk-2VXWFYJE.js.map} +0 -0
  518. /package/dist/{chunk-3YTTAGPB.js.map → chunk-3DVBKTSO.js.map} +0 -0
  519. /package/dist/{chunk-JTSVMJHV.js.map → chunk-4XDGYCZI.js.map} +0 -0
  520. /package/dist/{chunk-HQSBYI5X.js.map → chunk-57HVIG5U.js.map} +0 -0
  521. /package/dist/{chunk-PMVPCZJZ.js.map → chunk-6433HV72.js.map} +0 -0
  522. /package/dist/{chunk-N6TRHP72.js.map → chunk-6TAX66IA.js.map} +0 -0
  523. /package/dist/{chunk-AGKIG3YA.js.map → chunk-6VALIZKG.js.map} +0 -0
  524. /package/dist/{chunk-NS5ETDYD.js.map → chunk-7BEPVIH3.js.map} +0 -0
  525. /package/dist/{chunk-LYIZXQYY.js.map → chunk-7KFIMGMP.js.map} +0 -0
  526. /package/dist/{chunk-LWVO2QZV.js.map → chunk-7QOO4LGC.js.map} +0 -0
  527. /package/dist/{chunk-CCTVAVTT.js.map → chunk-AUO2LJ3K.js.map} +0 -0
  528. /package/dist/{chunk-ALCJRQ72.js.map → chunk-AYDDB3XI.js.map} +0 -0
  529. /package/dist/{chunk-3TMYV3LP.js.map → chunk-AYYGRVRP.js.map} +0 -0
  530. /package/dist/{chunk-W6TSGWYS.js.map → chunk-AZAA5DNP.js.map} +0 -0
  531. /package/dist/{chunk-6JJT5AKI.js.map → chunk-BQUEAVNW.js.map} +0 -0
  532. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  533. /package/dist/{chunk-CEH2AFXG.js.map → chunk-C24UZSFW.js.map} +0 -0
  534. /package/dist/{chunk-ZPN7W3OP.js.map → chunk-CDUUDBWJ.js.map} +0 -0
  535. /package/dist/{chunk-Y23B2QXP.js.map → chunk-D27J626P.js.map} +0 -0
  536. /package/dist/{chunk-2572MRP2.js.map → chunk-DHTQP334.js.map} +0 -0
  537. /package/dist/{chunk-HJQZQUPC.js.map → chunk-DJZWNKFO.js.map} +0 -0
  538. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  539. /package/dist/{chunk-VJ6ECBIP.js.map → chunk-E4MVQQVX.js.map} +0 -0
  540. /package/dist/{chunk-SYJ6EKKE.js.map → chunk-EIVIB73I.js.map} +0 -0
  541. /package/dist/{chunk-HUNSEO5U.js.map → chunk-EV3YFLCB.js.map} +0 -0
  542. /package/dist/{chunk-VPGRXEAB.js.map → chunk-G57LQRP6.js.map} +0 -0
  543. /package/dist/{chunk-BC4QD3FM.js.map → chunk-GN55KU2P.js.map} +0 -0
  544. /package/dist/{chunk-4W6INNXO.js.map → chunk-GUXS322H.js.map} +0 -0
  545. /package/dist/{chunk-3MADV4YC.js.map → chunk-IQSC3V2E.js.map} +0 -0
  546. /package/dist/{chunk-UYCIS6V5.js.map → chunk-JCWY73FK.js.map} +0 -0
  547. /package/dist/{chunk-T42L3S6A.js.map → chunk-LBWQ65SX.js.map} +0 -0
  548. /package/dist/{chunk-256FBCVX.js.map → chunk-M4AHBM72.js.map} +0 -0
  549. /package/dist/{chunk-YEQEGSJA.js.map → chunk-MBDJJTAT.js.map} +0 -0
  550. /package/dist/{chunk-IAY7YBXS.js.map → chunk-MRTUN665.js.map} +0 -0
  551. /package/dist/{chunk-R3AAOKR2.js.map → chunk-NZWEEALH.js.map} +0 -0
  552. /package/dist/{chunk-I2HTKOOP.js.map → chunk-ODZG724P.js.map} +0 -0
  553. /package/dist/{chunk-7QFBLYFP.js.map → chunk-OJD4WS2E.js.map} +0 -0
  554. /package/dist/{chunk-53ENM6F6.js.map → chunk-P4DHENRE.js.map} +0 -0
  555. /package/dist/{chunk-KPBLJCCV.js.map → chunk-PDVQ5JU3.js.map} +0 -0
  556. /package/dist/{chunk-ESCQ6LY7.js.map → chunk-QFMO32TO.js.map} +0 -0
  557. /package/dist/{chunk-HQSPXTQO.js.map → chunk-QXIQPCCN.js.map} +0 -0
  558. /package/dist/{chunk-CFRBTATE.js.map → chunk-R47WINCY.js.map} +0 -0
  559. /package/dist/{chunk-G72IPMR7.js.map → chunk-R4OCGPSH.js.map} +0 -0
  560. /package/dist/{chunk-VZVP2W4O.js.map → chunk-RK4WXUI2.js.map} +0 -0
  561. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  562. /package/dist/{chunk-6L27N6YI.js.map → chunk-S7Q5CM7E.js.map} +0 -0
  563. /package/dist/{chunk-CTQRPANJ.js.map → chunk-SVSRPG6M.js.map} +0 -0
  564. /package/dist/{chunk-GXWDWOWP.js.map → chunk-TDKSCV62.js.map} +0 -0
  565. /package/dist/{chunk-S2VBSTTA.js.map → chunk-THG4GYIE.js.map} +0 -0
  566. /package/dist/{chunk-IXRC7EQG.js.map → chunk-TR7DGXGI.js.map} +0 -0
  567. /package/dist/{chunk-63FHSH7E.js.map → chunk-TYUS5TLG.js.map} +0 -0
  568. /package/dist/{chunk-7PWWGYGO.js.map → chunk-URHCUXKI.js.map} +0 -0
  569. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  570. /package/dist/{chunk-MUJ4QFUQ.js.map → chunk-W4BMEGQA.js.map} +0 -0
  571. /package/dist/{chunk-5HK3CJAR.js.map → chunk-W675UJCZ.js.map} +0 -0
  572. /package/dist/{chunk-X5SDZMO7.js.map → chunk-YHCBJULX.js.map} +0 -0
  573. /package/dist/{chunk-5UYSCYR7.js.map → chunk-Z4RPXHJH.js.map} +0 -0
  574. /package/dist/{contradiction-review-QKJH5DKD.js.map → contradiction-review-WRVLRWHS.js.map} +0 -0
  575. /package/dist/{contradiction-scan-VOTQRRSX.js.map → contradiction-scan-AKUWPX5N.js.map} +0 -0
  576. /package/dist/{resolution-DKMBPXHI.js.map → memory-subject-cli.js.map} +0 -0
@@ -12,6 +12,8 @@
12
12
  */
13
13
  import type { MemoryFile, MemoryStatus, PluginConfig } from "../types.js";
14
14
  import type { StorageManager } from "../storage.js";
15
+ import { isActiveMemoryStatus } from "../memory-lifecycle-ledger-utils.js";
16
+ import { readProcedureMaintenanceMarker } from "./library-maintenance.js";
15
17
 
16
18
  export interface ProcedureStatusCounts {
17
19
  total: number;
@@ -50,6 +52,10 @@ export interface ProcedureStatsReport {
50
52
  counts: ProcedureStatusCounts;
51
53
  recent: ProcedureStatsRecent;
52
54
  config: ProcedureStatsConfigSnapshot;
55
+ /** ISO timestamp of the last library-maintenance run marker, or null (issue #2370). */
56
+ lastMaintenanceAt: string | null;
57
+ /** Active procedures currently carrying a `needsRepair` flag (issue #2370). */
58
+ needsRepairFlags: number;
53
59
  }
54
60
 
55
61
  function snapshotConfig(config: PluginConfig): ProcedureStatsConfigSnapshot {
@@ -102,6 +108,7 @@ export async function computeProcedureStats(options: {
102
108
  let lastWriteMs: number | null = null;
103
109
  let writesLast7Days = 0;
104
110
  let minerSourced = 0;
111
+ let needsRepairFlags = 0;
105
112
 
106
113
  const known: MemoryStatus[] = [
107
114
  "active",
@@ -159,8 +166,15 @@ export async function computeProcedureStats(options: {
159
166
  if (m.frontmatter.source === "procedure-miner") {
160
167
  minerSourced += 1;
161
168
  }
169
+ if (
170
+ m.frontmatter.structuredAttributes?.needsRepair !== undefined &&
171
+ isActiveMemoryStatus(m.frontmatter.status)
172
+ ) {
173
+ needsRepairFlags += 1;
174
+ }
162
175
  }
163
176
 
177
+ const maintenanceMarker = await readProcedureMaintenanceMarker(storage.dir);
164
178
  return {
165
179
  schemaVersion: 1,
166
180
  generatedAt: new Date(nowMs).toISOString(),
@@ -171,6 +185,8 @@ export async function computeProcedureStats(options: {
171
185
  minerSourced,
172
186
  },
173
187
  config: snapshotConfig(config),
188
+ lastMaintenanceAt: maintenanceMarker?.lastRunAt ?? null,
189
+ needsRepairFlags,
174
190
  };
175
191
  }
176
192
 
@@ -210,5 +226,9 @@ export function formatProcedureStatsText(report: ProcedureStatsReport): string {
210
226
  lines.push(` lastWriteAt: ${recent.lastWriteAt ?? "(none)"}`);
211
227
  lines.push(` writesLast7Days: ${recent.writesLast7Days}`);
212
228
  lines.push(` minerSourced: ${recent.minerSourced}`);
229
+ lines.push("");
230
+ lines.push(` maintenance:`);
231
+ lines.push(` lastMaintenanceAt: ${report.lastMaintenanceAt ?? "(never)"}`);
232
+ lines.push(` needsRepairFlags: ${report.needsRepairFlags}`);
213
233
  return lines.join("\n") + "\n";
214
234
  }
@@ -0,0 +1,325 @@
1
+ import assert from "node:assert/strict";
2
+ import { request as httpRequest } from "node:http";
3
+ import test from "node:test";
4
+
5
+ import { EngramAccessHttpServer } from "../access-http.js";
6
+ import type { EngramAccessService } from "../access-service.js";
7
+ import type {
8
+ ReviewDeckActionReceipt,
9
+ ReviewDeckActionRequest,
10
+ ReviewDeckPage,
11
+ ReviewDeckUndoRequest,
12
+ } from "./review-deck.js";
13
+
14
+ const TOKEN = "test-token";
15
+
16
+ function deferred<T = void>(): {
17
+ promise: Promise<T>;
18
+ resolve: (value: T | PromiseLike<T>) => void;
19
+ reject: (reason?: unknown) => void;
20
+ } {
21
+ let resolve!: (value: T | PromiseLike<T>) => void;
22
+ let reject!: (reason?: unknown) => void;
23
+ const promise = new Promise<T>((resolvePromise, rejectPromise) => {
24
+ resolve = resolvePromise;
25
+ reject = rejectPromise;
26
+ });
27
+ return { promise, resolve, reject };
28
+ }
29
+
30
+ function page(): ReviewDeckPage {
31
+ return { schemaVersion: 1, items: [], total: 0 };
32
+ }
33
+
34
+ function receipt(
35
+ action: ReviewDeckActionReceipt["action"] = "keep",
36
+ ): ReviewDeckActionReceipt {
37
+ return {
38
+ schemaVersion: 1,
39
+ receiptId: "receipt-1",
40
+ itemId: "item-1",
41
+ action,
42
+ outcome: "applied",
43
+ effect: action,
44
+ undoAvailable: action !== "undo",
45
+ };
46
+ }
47
+
48
+ function mockService(overrides: Partial<EngramAccessService> = {}): EngramAccessService {
49
+ return {
50
+ reviewDeckEnabled: true,
51
+ reviewDeckList: async () => page(),
52
+ reviewDeckAction: async () => receipt("keep"),
53
+ reviewDeckUndo: async () => receipt("undo"),
54
+ reviewQueue: async () => ({ found: true, runId: "existing-review" }),
55
+ ...overrides,
56
+ } as unknown as EngramAccessService;
57
+ }
58
+
59
+ async function startServer(
60
+ service: EngramAccessService,
61
+ extras: ConstructorParameters<typeof EngramAccessHttpServer>[0] extends infer T
62
+ ? T extends { service: EngramAccessService }
63
+ ? Omit<T, "service" | "port" | "adminConsoleEnabled">
64
+ : never
65
+ : never = { authToken: TOKEN },
66
+ ): Promise<{ port: number; stop: () => Promise<void> }> {
67
+ const server = new EngramAccessHttpServer({
68
+ service,
69
+ port: 0,
70
+ adminConsoleEnabled: false,
71
+ ...extras,
72
+ });
73
+ const status = await server.start();
74
+ return { port: status.port, stop: () => server.stop() };
75
+ }
76
+
77
+ async function jsonRequest(
78
+ port: number,
79
+ path: string,
80
+ options: {
81
+ method?: string;
82
+ token?: string;
83
+ body?: unknown;
84
+ } = {},
85
+ ): Promise<{ status: number; body: Record<string, unknown> }> {
86
+ const res = await fetch(`http://127.0.0.1:${port}${path}`, {
87
+ method: options.method ?? "GET",
88
+ headers: {
89
+ authorization: `Bearer ${options.token ?? TOKEN}`,
90
+ ...(options.body !== undefined ? { "content-type": "application/json" } : {}),
91
+ },
92
+ body: options.body !== undefined ? JSON.stringify(options.body) : undefined,
93
+ });
94
+ return { status: res.status, body: (await res.json()) as Record<string, unknown> };
95
+ }
96
+
97
+ const keepBody: ReviewDeckActionRequest = {
98
+ schemaVersion: 1,
99
+ itemId: "item-1",
100
+ revision: "rv1:abc",
101
+ action: "keep",
102
+ idempotencyKey: "key-1",
103
+ };
104
+
105
+ const undoBody: ReviewDeckUndoRequest = {
106
+ schemaVersion: 1,
107
+ receiptId: "receipt-1",
108
+ expectedRevision: "rv1:abc",
109
+ idempotencyKey: "key-undo",
110
+ };
111
+
112
+ test("canonical and engram alias list routes return schemaVersion 1", async () => {
113
+ const { port, stop } = await startServer(mockService());
114
+ try {
115
+ for (const prefix of ["/remnic/v1", "/engram/v1"] as const) {
116
+ const listed = await jsonRequest(port, `${prefix}/review/deck?limit=1`);
117
+ assert.equal(listed.status, 200);
118
+ assert.equal(listed.body.schemaVersion, 1);
119
+ const acted = await jsonRequest(port, `${prefix}/review/deck/action`, {
120
+ method: "POST",
121
+ body: keepBody,
122
+ });
123
+ assert.equal(acted.status, 200);
124
+ assert.equal(acted.body.schemaVersion, 1);
125
+ const undone = await jsonRequest(port, `${prefix}/review/deck/undo`, {
126
+ method: "POST",
127
+ body: undoBody,
128
+ });
129
+ assert.equal(undone.status, 200);
130
+ assert.equal(undone.body.schemaVersion, 1);
131
+ }
132
+ } finally {
133
+ await stop();
134
+ }
135
+ });
136
+
137
+ test("invalid cursor, limit, action, revision, and missing idempotency key are client errors", async () => {
138
+ const { port, stop } = await startServer(mockService());
139
+ try {
140
+ const cases: Array<{ path: string; method?: string; body?: unknown; message: RegExp }> = [
141
+ { path: "/engram/v1/review/deck?limit=1&cursor=%%%", message: /cursor is malformed/ },
142
+ { path: "/engram/v1/review/deck", message: /limit is required/ },
143
+ { path: "/engram/v1/review/deck?limit=abc", message: /limit must be an integer/ },
144
+ { path: "/engram/v1/review/deck?limit=0", message: /limit must be an integer from 1 to 100/ },
145
+ { path: "/engram/v1/review/deck?limit=101", message: /limit must be an integer from 1 to 100/ },
146
+ {
147
+ path: "/engram/v1/review/deck/action",
148
+ method: "POST",
149
+ body: { ...keepBody, action: "later" },
150
+ message: /action must be one of/,
151
+ },
152
+ {
153
+ path: "/engram/v1/review/deck/action",
154
+ method: "POST",
155
+ body: { ...keepBody, revision: "" },
156
+ message: /revision is required/,
157
+ },
158
+ {
159
+ path: "/engram/v1/review/deck/action",
160
+ method: "POST",
161
+ body: { ...keepBody, idempotencyKey: undefined },
162
+ message: /idempotencyKey is required/,
163
+ },
164
+ {
165
+ path: "/engram/v1/review/deck/action",
166
+ method: "POST",
167
+ body: { ...keepBody, action: "prepare_fix", correctionText: " " },
168
+ message: /correctionText is required/,
169
+ },
170
+ ];
171
+ for (const item of cases) {
172
+ const result = await jsonRequest(port, item.path, { method: item.method, body: item.body });
173
+ assert.equal(result.status, 400, item.path);
174
+ assert.match(String(result.body.error), item.message);
175
+ }
176
+ } finally {
177
+ await stop();
178
+ }
179
+ });
180
+
181
+ test("POST body principal and namespace are ignored in favor of the boundary", async () => {
182
+ let seen: { namespace?: string; principal?: string } | undefined;
183
+ const { port, stop } = await startServer(
184
+ mockService({
185
+ reviewDeckAction: async (_req, opts) => {
186
+ seen = { namespace: opts.namespace, principal: opts.principal };
187
+ return receipt("keep");
188
+ },
189
+ }),
190
+ { authToken: TOKEN, principal: "boundary-principal" },
191
+ );
192
+ try {
193
+ const result = await jsonRequest(
194
+ port,
195
+ "/engram/v1/review/deck/action?namespace=boundary-ns",
196
+ {
197
+ method: "POST",
198
+ body: {
199
+ ...keepBody,
200
+ namespace: "body-ns",
201
+ principal: "body-principal",
202
+ },
203
+ },
204
+ );
205
+ assert.equal(result.status, 200);
206
+ assert.deepEqual(seen, { namespace: "boundary-ns", principal: "boundary-principal" });
207
+ } finally {
208
+ await stop();
209
+ }
210
+ });
211
+
212
+ test("a read-only token cannot call action or undo", async () => {
213
+ const { port, stop } = await startServer(mockService(), {
214
+ authTokenEntriesGetter: () => [
215
+ { token: "reader", capabilities: { version: 1, ops: ["review_deck_list"] } },
216
+ ],
217
+ });
218
+ try {
219
+ const listed = await jsonRequest(port, "/engram/v1/review/deck?limit=1", { token: "reader" });
220
+ assert.equal(listed.status, 200);
221
+ const acted = await jsonRequest(port, "/engram/v1/review/deck/action", {
222
+ method: "POST",
223
+ token: "reader",
224
+ body: keepBody,
225
+ });
226
+ assert.equal(acted.status, 403);
227
+ const undone = await jsonRequest(port, "/engram/v1/review/deck/undo", {
228
+ method: "POST",
229
+ token: "reader",
230
+ body: undoBody,
231
+ });
232
+ assert.equal(undone.status, 403);
233
+ } finally {
234
+ await stop();
235
+ }
236
+ });
237
+
238
+ test("disabled gate returns 404 for deck routes while review-queue still works", async () => {
239
+ let queueCalled = false;
240
+ let deckCalled = false;
241
+ const { port, stop } = await startServer(
242
+ mockService({
243
+ reviewDeckEnabled: false,
244
+ reviewDeckList: async () => {
245
+ deckCalled = true;
246
+ return page();
247
+ },
248
+ reviewQueue: async () => {
249
+ queueCalled = true;
250
+ return { found: true, runId: "existing-review" };
251
+ },
252
+ }),
253
+ );
254
+ try {
255
+ for (const path of [
256
+ "/engram/v1/review/deck?limit=1",
257
+ "/remnic/v1/review/deck?limit=1",
258
+ "/engram/v1/review/deck/action",
259
+ "/remnic/v1/review/deck/undo",
260
+ ]) {
261
+ const method = path.includes("/action") || path.includes("/undo") ? "POST" : "GET";
262
+ const result = await jsonRequest(port, path, {
263
+ method,
264
+ body: method === "POST" ? keepBody : undefined,
265
+ });
266
+ assert.equal(result.status, 404, path);
267
+ assert.equal(result.body.code, "not_found");
268
+ }
269
+ assert.equal(deckCalled, false);
270
+ const queue = await jsonRequest(port, "/engram/v1/review-queue");
271
+ assert.equal(queue.status, 200);
272
+ assert.equal(queueCalled, true);
273
+ } finally {
274
+ await stop();
275
+ }
276
+ });
277
+
278
+ test("cancellation reaches the deck action executor", async () => {
279
+ const started = deferred<void>();
280
+ const settled = deferred<void>();
281
+ const forceRelease = deferred<void>();
282
+ let observed: AbortSignal | undefined;
283
+ const { port, stop } = await startServer(
284
+ mockService({
285
+ reviewDeckAction: async (_req, opts) => {
286
+ observed = opts.signal;
287
+ started.resolve();
288
+ try {
289
+ await Promise.race([
290
+ forceRelease.promise,
291
+ new Promise<void>((_resolve, reject) => {
292
+ opts.signal?.addEventListener("abort", () => reject(opts.signal?.reason), { once: true });
293
+ }),
294
+ ]);
295
+ } finally {
296
+ settled.resolve();
297
+ }
298
+ if (opts.signal?.aborted) throw opts.signal.reason;
299
+ return receipt("keep");
300
+ },
301
+ }),
302
+ );
303
+ try {
304
+ const client = httpRequest({
305
+ host: "127.0.0.1",
306
+ port,
307
+ path: "/engram/v1/review/deck/action",
308
+ method: "POST",
309
+ headers: {
310
+ authorization: `Bearer ${TOKEN}`,
311
+ "content-type": "application/json",
312
+ },
313
+ });
314
+ client.on("error", () => {});
315
+ client.end(JSON.stringify(keepBody));
316
+ await started.promise;
317
+ assert.ok(observed, "abort signal must reach the executor");
318
+ client.destroy();
319
+ await settled.promise;
320
+ assert.equal(observed.aborted, true);
321
+ } finally {
322
+ forceRelease.resolve();
323
+ await stop();
324
+ }
325
+ });
@@ -0,0 +1,133 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+
3
+ import { EngramAccessInputError } from "../access-service.js";
4
+ import type { OperationName } from "../access-boundary.js";
5
+ import { SupportPassportAccessHttpBase } from "../support-passport/access-http-base.js";
6
+ import type {
7
+ ReviewDeckActionRequest,
8
+ ReviewDeckUndoRequest,
9
+ } from "./review-deck.js";
10
+
11
+ const LIST_PATHS = ["/remnic/v1/review/deck", "/engram/v1/review/deck"] as const;
12
+ const ACTION_PATHS = ["/remnic/v1/review/deck/action", "/engram/v1/review/deck/action"] as const;
13
+ const UNDO_PATHS = ["/remnic/v1/review/deck/undo", "/engram/v1/review/deck/undo"] as const;
14
+ const LIMIT_MIN = 1;
15
+ const LIMIT_MAX = 100;
16
+ const CURSOR_RE = /^[^\s%]{1,2048}$/;
17
+
18
+ function requiredString(body: Record<string, unknown>, field: string): string {
19
+ const value = body[field];
20
+ if (typeof value !== "string" || value.trim().length === 0) {
21
+ throw new EngramAccessInputError(`${field} is required`);
22
+ }
23
+ return value.trim();
24
+ }
25
+
26
+ function parseLimit(raw: string | null): number {
27
+ if (raw === null || raw.length === 0) {
28
+ throw new EngramAccessInputError("limit is required and must be an integer");
29
+ }
30
+ if (!/^(?:0|[1-9]\d*)$/.test(raw)) {
31
+ throw new EngramAccessInputError("limit must be an integer");
32
+ }
33
+ const value = Number(raw);
34
+ if (!Number.isInteger(value) || value < LIMIT_MIN || value > LIMIT_MAX) {
35
+ throw new EngramAccessInputError(`limit must be an integer from ${LIMIT_MIN} to ${LIMIT_MAX}`);
36
+ }
37
+ return value;
38
+ }
39
+
40
+ function parseCursor(raw: string | null): string | undefined {
41
+ if (raw === null) return undefined;
42
+ if (!CURSOR_RE.test(raw)) {
43
+ throw new EngramAccessInputError("cursor is malformed");
44
+ }
45
+ return raw;
46
+ }
47
+
48
+ function parseActionBody(body: Record<string, unknown>): ReviewDeckActionRequest {
49
+ const action = body.action;
50
+ if (action !== "keep" && action !== "not_true" && action !== "prepare_fix") {
51
+ throw new EngramAccessInputError("action must be one of: keep, not_true, prepare_fix");
52
+ }
53
+ const itemId = requiredString(body, "itemId");
54
+ const revision = requiredString(body, "revision");
55
+ const idempotencyKey = requiredString(body, "idempotencyKey");
56
+ if (action === "prepare_fix") {
57
+ const correctionText = requiredString(body, "correctionText");
58
+ return { schemaVersion: 1, itemId, revision, action, correctionText, idempotencyKey };
59
+ }
60
+ return { schemaVersion: 1, itemId, revision, action, idempotencyKey };
61
+ }
62
+
63
+ function parseUndoBody(body: Record<string, unknown>): ReviewDeckUndoRequest {
64
+ return {
65
+ schemaVersion: 1,
66
+ receiptId: requiredString(body, "receiptId"),
67
+ expectedRevision: requiredString(body, "expectedRevision"),
68
+ idempotencyKey: requiredString(body, "idempotencyKey"),
69
+ };
70
+ }
71
+
72
+ export abstract class ReviewDeckAccessHttpBase extends SupportPassportAccessHttpBase {
73
+ protected abstract enforceTokenOp(op: OperationName): void;
74
+ protected abstract resolveNamespace(req: IncomingMessage, bodyNamespace?: string): string | undefined;
75
+ protected abstract readonly maxBodyBytes: number;
76
+
77
+ protected async handleReviewDeckRequest(
78
+ req: IncomingMessage,
79
+ res: ServerResponse,
80
+ pathname: string,
81
+ abortSignal?: AbortSignal,
82
+ ): Promise<boolean> {
83
+ const method = req.method;
84
+ const isList = method === "GET" && (pathname === LIST_PATHS[0] || pathname === LIST_PATHS[1]);
85
+ const isAction = method === "POST" && (pathname === ACTION_PATHS[0] || pathname === ACTION_PATHS[1]);
86
+ const isUndo = method === "POST" && (pathname === UNDO_PATHS[0] || pathname === UNDO_PATHS[1]);
87
+ if (!isList && !isAction && !isUndo) return false;
88
+ if (!this.service.reviewDeckEnabled) {
89
+ this.respondJson(res, 404, { error: "not_found", code: "not_found" });
90
+ return true;
91
+ }
92
+
93
+ const parsed = new URL(req.url ?? "/", "http://127.0.0.1");
94
+ const namespace = this.resolveNamespace(req, parsed.searchParams.get("namespace") ?? undefined);
95
+ const principal = this.resolveRequestPrincipal(req);
96
+
97
+ if (isList) {
98
+ this.enforceTokenOp("review_deck_list");
99
+ const page = await this.service.reviewDeckList({
100
+ namespace,
101
+ principal,
102
+ cursor: parseCursor(parsed.searchParams.get("cursor")),
103
+ limit: parseLimit(parsed.searchParams.get("limit")),
104
+ });
105
+ this.respondJson(res, 200, page);
106
+ return true;
107
+ }
108
+
109
+ if (isAction) this.enforceTokenOp("review_deck_action");
110
+ else this.enforceTokenOp("review_deck_undo");
111
+ const writeQuota = this.reserveWriteRateLimitSlot(req);
112
+ try {
113
+ const body = await this.readJsonBody(req, this.maxBodyBytes);
114
+ const result = isAction
115
+ ? await this.service.reviewDeckAction(parseActionBody(body), {
116
+ namespace,
117
+ principal,
118
+ signal: abortSignal,
119
+ })
120
+ : await this.service.reviewDeckUndo(parseUndoBody(body), {
121
+ namespace,
122
+ principal,
123
+ signal: abortSignal,
124
+ });
125
+ writeQuota.commit();
126
+ this.respondJson(res, 200, result);
127
+ } catch (error) {
128
+ writeQuota.release();
129
+ throw error;
130
+ }
131
+ return true;
132
+ }
133
+ }