@remnic/core 9.3.689 → 9.3.691

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 (322) hide show
  1. package/dist/access-boundary.d.ts +7 -6
  2. package/dist/access-boundary.js +19 -18
  3. package/dist/access-cli.js +111 -47
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +6 -5
  6. package/dist/access-http.js +25 -24
  7. package/dist/access-mcp.d.ts +13 -5
  8. package/dist/access-mcp.js +22 -21
  9. package/dist/access-operations.d.ts +13 -7
  10. package/dist/access-operations.js +23 -20
  11. package/dist/access-schema.js +3 -3
  12. package/dist/{access-service-DmCHJ4cH.d.ts → access-service-CKnFdxH-.d.ts} +63 -3
  13. package/dist/access-service.d.ts +6 -5
  14. package/dist/access-service.js +18 -17
  15. package/dist/access-surface-catalog.d.ts +6 -5
  16. package/dist/access-surface-catalog.js +2 -0
  17. package/dist/access-surface-catalog.js.map +1 -1
  18. package/dist/action-confidence.d.ts +1 -1
  19. package/dist/active-memory-bridge.d.ts +1 -1
  20. package/dist/active-recall.d.ts +1 -1
  21. package/dist/active-recall.js +1 -1
  22. package/dist/adapters/index.js +4 -4
  23. package/dist/adapters/registry.js +2 -2
  24. package/dist/{auto-sync-NUQWSFQD.js → auto-sync-RWXT6P5M.js} +5 -5
  25. package/dist/behavior-learner.d.ts +1 -1
  26. package/dist/behavior-signals.d.ts +1 -1
  27. package/dist/bootstrap.d.ts +5 -4
  28. package/dist/briefing.d.ts +2 -1
  29. package/dist/briefing.js +6 -5
  30. package/dist/buffer-surprise-report.d.ts +1 -1
  31. package/dist/buffer.d.ts +2 -1
  32. package/dist/calibration.d.ts +1 -1
  33. package/dist/calibration.js +2 -2
  34. package/dist/capabilities.d.ts +1 -1
  35. package/dist/{catalog-COqWZlZ6.d.ts → catalog-BEWLjdOr.d.ts} +2 -2
  36. package/dist/causal-behavior.d.ts +1 -1
  37. package/dist/causal-consolidation.d.ts +1 -1
  38. package/dist/causal-consolidation.js +9 -8
  39. package/dist/causal-consolidation.js.map +1 -1
  40. package/dist/{chunk-GTDH3IUH.js → chunk-2D27ODNX.js} +2 -2
  41. package/dist/{chunk-3K37VPM3.js → chunk-3BRA3N5A.js} +2 -2
  42. package/dist/{chunk-4FE2K57M.js → chunk-3VVH6ZQW.js} +2 -2
  43. package/dist/{chunk-FIVDN2SM.js → chunk-4RGWCRIJ.js} +4 -4
  44. package/dist/{chunk-AGJH5ISO.js → chunk-5KBNNUXS.js} +2 -2
  45. package/dist/{chunk-OV4D5T7V.js → chunk-66HROLW5.js} +2 -2
  46. package/dist/{chunk-Z2M6YTAJ.js → chunk-7UVDIWLL.js} +34 -5
  47. package/dist/chunk-7UVDIWLL.js.map +1 -0
  48. package/dist/{chunk-QANVLERJ.js → chunk-ADUAF5EV.js} +2 -2
  49. package/dist/{chunk-LLONI6PY.js → chunk-AFWEUTMS.js} +2 -2
  50. package/dist/{chunk-W63OY3J7.js → chunk-D3DNGQNQ.js} +3 -3
  51. package/dist/{chunk-T422SYM6.js → chunk-DCWIQFNA.js} +5 -5
  52. package/dist/{chunk-NGFEWFNK.js → chunk-DQHZA7Y3.js} +1 -1
  53. package/dist/chunk-DQHZA7Y3.js.map +1 -0
  54. package/dist/{chunk-OBXTMFZQ.js → chunk-ECZPWSB5.js} +2 -2
  55. package/dist/{chunk-BFVPIKDY.js → chunk-GCOSQBQ2.js} +3 -3
  56. package/dist/{chunk-SAEZIIID.js → chunk-IPJD7WJH.js} +2 -2
  57. package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
  58. package/dist/{chunk-MDYG7VI7.js → chunk-IREVVFTM.js} +10 -1
  59. package/dist/{chunk-MDYG7VI7.js.map → chunk-IREVVFTM.js.map} +1 -1
  60. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  61. package/dist/{chunk-RHXFYIHA.js → chunk-K7I24ZO2.js} +42 -27
  62. package/dist/chunk-K7I24ZO2.js.map +1 -0
  63. package/dist/{chunk-XU7363OX.js → chunk-KO6OL4I7.js} +617 -23
  64. package/dist/chunk-KO6OL4I7.js.map +1 -0
  65. package/dist/{chunk-UTYBJR7M.js → chunk-MCV2DD6F.js} +2 -2
  66. package/dist/{chunk-3FC6LW6T.js → chunk-MRFVMSTR.js} +2 -2
  67. package/dist/{chunk-WDXCNJSF.js → chunk-MXZWKOOR.js} +2 -2
  68. package/dist/{chunk-QSQW54U5.js → chunk-NCRDCTEJ.js} +33 -10
  69. package/dist/chunk-NCRDCTEJ.js.map +1 -0
  70. package/dist/{chunk-6O6A6YUO.js → chunk-NUZ3N445.js} +7 -7
  71. package/dist/{chunk-UHUZXWDX.js → chunk-OOO7ZKOD.js} +16 -5
  72. package/dist/chunk-OOO7ZKOD.js.map +1 -0
  73. package/dist/{chunk-GS55WYRL.js → chunk-QFG23CRE.js} +2 -2
  74. package/dist/{chunk-UDJLF3BO.js → chunk-QLRYXOAD.js} +2 -2
  75. package/dist/chunk-QNG35H27.js +2190 -0
  76. package/dist/chunk-QNG35H27.js.map +1 -0
  77. package/dist/{chunk-A4HH2EWA.js → chunk-QVG4LAQO.js} +2 -2
  78. package/dist/{chunk-4N3TFFPH.js → chunk-SAC5V6JT.js} +2 -2
  79. package/dist/chunk-SVOZFLIQ.js +16 -0
  80. package/dist/chunk-SVOZFLIQ.js.map +1 -0
  81. package/dist/{chunk-JZBFL7RI.js → chunk-TJ5IIQIR.js} +468 -2265
  82. package/dist/chunk-TJ5IIQIR.js.map +1 -0
  83. package/dist/{chunk-UXLZOVCN.js → chunk-TSGREOYY.js} +38 -6
  84. package/dist/chunk-TSGREOYY.js.map +1 -0
  85. package/dist/{chunk-B4XVLHJA.js → chunk-U2OBZSGG.js} +2 -2
  86. package/dist/{chunk-STOEE37X.js → chunk-UOCLRM74.js} +2 -2
  87. package/dist/{chunk-A7UZR6RA.js → chunk-UTUYAPLY.js} +14 -1
  88. package/dist/chunk-UTUYAPLY.js.map +1 -0
  89. package/dist/{chunk-JPETDXED.js → chunk-UUMYB3FR.js} +2 -2
  90. package/dist/{chunk-BLIWOONZ.js → chunk-VFVG4NS2.js} +33 -20
  91. package/dist/chunk-VFVG4NS2.js.map +1 -0
  92. package/dist/{chunk-OWFY6NGQ.js → chunk-VH2DHBHG.js} +2 -2
  93. package/dist/chunk-VH2DHBHG.js.map +1 -0
  94. package/dist/{chunk-WIHPNY65.js → chunk-W4ELOUNX.js} +2 -2
  95. package/dist/{chunk-VX6OBUDW.js → chunk-WIKNVFBS.js} +2 -2
  96. package/dist/{chunk-2SNKUSQC.js → chunk-X5J3JZR3.js} +4 -4
  97. package/dist/{chunk-PH3HOKYW.js → chunk-ZLXGFAML.js} +2 -2
  98. package/dist/{cli-D8nZ2MPH.d.ts → cli-CrSW_KRq.d.ts} +3 -3
  99. package/dist/cli.d.ts +7 -6
  100. package/dist/cli.js +40 -38
  101. package/dist/compounding/engine.d.ts +2 -1
  102. package/dist/compounding/engine.js +6 -5
  103. package/dist/compounding/preference-consolidator.d.ts +1 -1
  104. package/dist/compression-optimizer.d.ts +1 -1
  105. package/dist/config.d.ts +1 -1
  106. package/dist/config.js +1 -1
  107. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  108. package/dist/connectors/codex-materialize-runner.js +6 -5
  109. package/dist/connectors/codex-materialize.d.ts +1 -1
  110. package/dist/connectors/index.d.ts +1 -1
  111. package/dist/connectors/index.js +6 -5
  112. package/dist/consolidation-provenance-check.d.ts +2 -1
  113. package/dist/consolidation-undo.d.ts +2 -1
  114. package/dist/contradiction/index.d.ts +2 -1
  115. package/dist/contradiction/index.js +4 -4
  116. package/dist/conversation-index/backend.d.ts +1 -1
  117. package/dist/conversation-index/backend.js +2 -2
  118. package/dist/conversation-index/chunker.d.ts +1 -1
  119. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  120. package/dist/conversation-index/indexer.d.ts +1 -1
  121. package/dist/conversation-index/search.d.ts +1 -1
  122. package/dist/day-summary.d.ts +1 -1
  123. package/dist/delinearize.d.ts +1 -1
  124. package/dist/direct-answer-wiring.d.ts +1 -1
  125. package/dist/direct-answer.d.ts +1 -1
  126. package/dist/embedding-fallback.d.ts +1 -1
  127. package/dist/enrichment/index.d.ts +1 -1
  128. package/dist/entity-retrieval.d.ts +2 -1
  129. package/dist/entity-retrieval.js +6 -5
  130. package/dist/entity-schema.d.ts +1 -1
  131. package/dist/event-time.d.ts +35 -0
  132. package/dist/event-time.js +325 -0
  133. package/dist/event-time.js.map +1 -0
  134. package/dist/explicit-capture.d.ts +5 -4
  135. package/dist/extraction-judge-telemetry.d.ts +1 -1
  136. package/dist/extraction-judge-training.d.ts +1 -1
  137. package/dist/extraction-judge.d.ts +1 -1
  138. package/dist/extraction-judge.js +3 -3
  139. package/dist/extraction.d.ts +1 -1
  140. package/dist/extraction.js +3 -3
  141. package/dist/fallback-llm.d.ts +1 -1
  142. package/dist/fallback-llm.js +2 -2
  143. package/dist/identity-continuity.d.ts +1 -1
  144. package/dist/importance.d.ts +1 -1
  145. package/dist/index.d.ts +10 -9
  146. package/dist/index.js +78 -75
  147. package/dist/index.js.map +1 -1
  148. package/dist/intent.d.ts +1 -1
  149. package/dist/lcm/engine.d.ts +1 -1
  150. package/dist/lcm/engine.js +2 -2
  151. package/dist/lcm/index.d.ts +1 -1
  152. package/dist/lcm/index.js +2 -2
  153. package/dist/lcm/tools.d.ts +1 -1
  154. package/dist/lifecycle.d.ts +1 -1
  155. package/dist/live-connectors-runner.d.ts +1 -1
  156. package/dist/local-llm.d.ts +1 -1
  157. package/dist/maintenance/memory-governance.d.ts +1 -1
  158. package/dist/maintenance/memory-governance.js +6 -5
  159. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +6 -5
  160. package/dist/maintenance/rebuild-memory-projection.js +7 -6
  161. package/dist/mcp-memory-inspector-app.d.ts +6 -5
  162. package/dist/memory-action-policy.d.ts +1 -1
  163. package/dist/memory-cache.d.ts +1 -1
  164. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  165. package/dist/memory-projection-store.d.ts +1 -1
  166. package/dist/memory-provenance.d.ts +1 -1
  167. package/dist/memory-worth-outcomes.d.ts +2 -1
  168. package/dist/models-json.d.ts +1 -1
  169. package/dist/namespaces/migrate.d.ts +3 -2
  170. package/dist/namespaces/migrate.js +11 -10
  171. package/dist/namespaces/principal.d.ts +1 -1
  172. package/dist/namespaces/search.d.ts +1 -1
  173. package/dist/namespaces/search.js +4 -4
  174. package/dist/namespaces/storage.d.ts +3 -2
  175. package/dist/namespaces/storage.js +6 -5
  176. package/dist/native-knowledge.d.ts +1 -1
  177. package/dist/operator-toolkit.d.ts +2 -1
  178. package/dist/operator-toolkit.js +15 -13
  179. package/dist/{orchestrator-CA6ouzBn.d.ts → orchestrator-DvswGK76.d.ts} +147 -3
  180. package/dist/orchestrator.d.ts +5 -4
  181. package/dist/orchestrator.js +37 -35
  182. package/dist/patterns-cli.d.ts +1 -1
  183. package/dist/policy-runtime.d.ts +1 -1
  184. package/dist/provenance.d.ts +1 -1
  185. package/dist/qmd-recall-cache.d.ts +1 -1
  186. package/dist/qmd.d.ts +1 -1
  187. package/dist/recall-disclosure-escalation.d.ts +1 -1
  188. package/dist/recall-explain-renderer.d.ts +1 -1
  189. package/dist/recall-explain-renderer.js +3 -3
  190. package/dist/recall-planner-llm.d.ts +1 -1
  191. package/dist/recall-planner-llm.js +2 -2
  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-cli.js +4 -4
  196. package/dist/recall-xray-renderer.d.ts +1 -1
  197. package/dist/recall-xray-renderer.js +3 -3
  198. package/dist/recall-xray.d.ts +1 -1
  199. package/dist/recall-xray.js +2 -2
  200. package/dist/resolve-auth-token.d.ts +1 -1
  201. package/dist/resume-bundles.js +2 -2
  202. package/dist/retrieval-agents.d.ts +1 -1
  203. package/dist/retrieval-tiers.d.ts +1 -1
  204. package/dist/routing/engine.d.ts +1 -1
  205. package/dist/routing/store.d.ts +1 -1
  206. package/dist/schemas.d.ts +10 -10
  207. package/dist/search/embed-helper.d.ts +1 -1
  208. package/dist/search/factory.d.ts +1 -1
  209. package/dist/search/factory.js +3 -3
  210. package/dist/search/index.d.ts +1 -1
  211. package/dist/search/index.js +3 -3
  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-CWch5uM7.d.ts → semantic-consolidation-D5U0Mrdb.d.ts} +1 -1
  219. package/dist/semantic-consolidation.d.ts +2 -2
  220. package/dist/semantic-consolidation.js +7 -6
  221. package/dist/semantic-rule-promotion.js +6 -5
  222. package/dist/semantic-rule-verifier.d.ts +1 -1
  223. package/dist/semantic-rule-verifier.js +6 -5
  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 +6 -28
  229. package/dist/storage.js +8 -6
  230. package/dist/structured-attributes.d.ts +29 -0
  231. package/dist/structured-attributes.js +8 -0
  232. package/dist/structured-attributes.js.map +1 -0
  233. package/dist/summarizer.d.ts +1 -1
  234. package/dist/summarizer.js +3 -3
  235. package/dist/summary-snapshot.d.ts +1 -1
  236. package/dist/temporal-supersession.d.ts +2 -1
  237. package/dist/temporal-supersession.js +2 -2
  238. package/dist/temporal-validity.d.ts +22 -2
  239. package/dist/temporal-validity.js +3 -1
  240. package/dist/threading.d.ts +1 -1
  241. package/dist/tier-migration.d.ts +2 -1
  242. package/dist/tier-routing.d.ts +1 -1
  243. package/dist/topics.d.ts +1 -1
  244. package/dist/transcript.d.ts +1 -1
  245. package/dist/transfer/autodetect.js +1 -1
  246. package/dist/transfer/backup.js +1 -1
  247. package/dist/transfer/capsule-export.js +2 -2
  248. package/dist/{types-Dm5xxVrr.d.ts → types-2NoBoRBM.d.ts} +38 -0
  249. package/dist/types.d.ts +1 -1
  250. package/dist/types.js +1 -1
  251. package/dist/utility-runtime.d.ts +1 -1
  252. package/dist/verified-recall.js +6 -5
  253. package/package.json +2 -2
  254. package/src/access-boundary.ts +2 -1
  255. package/src/access-cli.test.ts +40 -0
  256. package/src/access-cli.ts +90 -2
  257. package/src/access-http.ts +35 -6
  258. package/src/access-mcp.ts +34 -0
  259. package/src/access-operations.ts +45 -0
  260. package/src/access-service.ts +60 -0
  261. package/src/access-surface-catalog.test.ts +1 -1
  262. package/src/access-surface-catalog.ts +2 -0
  263. package/src/bitemporal-frontmatter.test.ts +177 -0
  264. package/src/cli.ts +18 -0
  265. package/src/coding/architecture-card.test.ts +544 -0
  266. package/src/coding/architecture-card.ts +687 -0
  267. package/src/coding/architecture-surfaces.test.ts +579 -0
  268. package/src/coding/architecture-surfaces.ts +457 -0
  269. package/src/config.ts +13 -0
  270. package/src/event-time.test.ts +514 -0
  271. package/src/event-time.ts +548 -0
  272. package/src/maintenance/namespace-maintenance-fanout.test.ts +595 -0
  273. package/src/maintenance/namespace-maintenance-fanout.ts +318 -0
  274. package/src/maintenance/namespace-planner.ts +74 -16
  275. package/src/operator-toolkit.ts +25 -0
  276. package/src/orchestrator.ts +171 -1
  277. package/src/storage.ts +40 -20
  278. package/src/structured-attributes.ts +39 -0
  279. package/src/temporal-validity.ts +34 -0
  280. package/src/types.ts +38 -0
  281. package/dist/chunk-A7UZR6RA.js.map +0 -1
  282. package/dist/chunk-BLIWOONZ.js.map +0 -1
  283. package/dist/chunk-JZBFL7RI.js.map +0 -1
  284. package/dist/chunk-NGFEWFNK.js.map +0 -1
  285. package/dist/chunk-OWFY6NGQ.js.map +0 -1
  286. package/dist/chunk-QSQW54U5.js.map +0 -1
  287. package/dist/chunk-RHXFYIHA.js.map +0 -1
  288. package/dist/chunk-UHUZXWDX.js.map +0 -1
  289. package/dist/chunk-UXLZOVCN.js.map +0 -1
  290. package/dist/chunk-XU7363OX.js.map +0 -1
  291. package/dist/chunk-Z2M6YTAJ.js.map +0 -1
  292. /package/dist/{auto-sync-NUQWSFQD.js.map → auto-sync-RWXT6P5M.js.map} +0 -0
  293. /package/dist/{chunk-GTDH3IUH.js.map → chunk-2D27ODNX.js.map} +0 -0
  294. /package/dist/{chunk-3K37VPM3.js.map → chunk-3BRA3N5A.js.map} +0 -0
  295. /package/dist/{chunk-4FE2K57M.js.map → chunk-3VVH6ZQW.js.map} +0 -0
  296. /package/dist/{chunk-FIVDN2SM.js.map → chunk-4RGWCRIJ.js.map} +0 -0
  297. /package/dist/{chunk-AGJH5ISO.js.map → chunk-5KBNNUXS.js.map} +0 -0
  298. /package/dist/{chunk-OV4D5T7V.js.map → chunk-66HROLW5.js.map} +0 -0
  299. /package/dist/{chunk-QANVLERJ.js.map → chunk-ADUAF5EV.js.map} +0 -0
  300. /package/dist/{chunk-LLONI6PY.js.map → chunk-AFWEUTMS.js.map} +0 -0
  301. /package/dist/{chunk-W63OY3J7.js.map → chunk-D3DNGQNQ.js.map} +0 -0
  302. /package/dist/{chunk-T422SYM6.js.map → chunk-DCWIQFNA.js.map} +0 -0
  303. /package/dist/{chunk-OBXTMFZQ.js.map → chunk-ECZPWSB5.js.map} +0 -0
  304. /package/dist/{chunk-BFVPIKDY.js.map → chunk-GCOSQBQ2.js.map} +0 -0
  305. /package/dist/{chunk-SAEZIIID.js.map → chunk-IPJD7WJH.js.map} +0 -0
  306. /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  307. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  308. /package/dist/{chunk-UTYBJR7M.js.map → chunk-MCV2DD6F.js.map} +0 -0
  309. /package/dist/{chunk-3FC6LW6T.js.map → chunk-MRFVMSTR.js.map} +0 -0
  310. /package/dist/{chunk-WDXCNJSF.js.map → chunk-MXZWKOOR.js.map} +0 -0
  311. /package/dist/{chunk-6O6A6YUO.js.map → chunk-NUZ3N445.js.map} +0 -0
  312. /package/dist/{chunk-GS55WYRL.js.map → chunk-QFG23CRE.js.map} +0 -0
  313. /package/dist/{chunk-UDJLF3BO.js.map → chunk-QLRYXOAD.js.map} +0 -0
  314. /package/dist/{chunk-A4HH2EWA.js.map → chunk-QVG4LAQO.js.map} +0 -0
  315. /package/dist/{chunk-4N3TFFPH.js.map → chunk-SAC5V6JT.js.map} +0 -0
  316. /package/dist/{chunk-B4XVLHJA.js.map → chunk-U2OBZSGG.js.map} +0 -0
  317. /package/dist/{chunk-STOEE37X.js.map → chunk-UOCLRM74.js.map} +0 -0
  318. /package/dist/{chunk-JPETDXED.js.map → chunk-UUMYB3FR.js.map} +0 -0
  319. /package/dist/{chunk-WIHPNY65.js.map → chunk-W4ELOUNX.js.map} +0 -0
  320. /package/dist/{chunk-VX6OBUDW.js.map → chunk-WIKNVFBS.js.map} +0 -0
  321. /package/dist/{chunk-2SNKUSQC.js.map → chunk-X5J3JZR3.js.map} +0 -0
  322. /package/dist/{chunk-PH3HOKYW.js.map → chunk-ZLXGFAML.js.map} +0 -0
@@ -67,7 +67,7 @@ function shortToolName(advertised: string): string {
67
67
  /** Spin up a server with emitLegacyTools=true and read the deduped short names. */
68
68
  async function liveMcpToolShortNames(): Promise<ReadonlySet<string>> {
69
69
  const stub = { briefingEnabled: true } as unknown as EngramAccessService;
70
- const server = new EngramMcpServer(stub, { emitLegacyTools: true, codingDecisionVisible: true });
70
+ const server = new EngramMcpServer(stub, { emitLegacyTools: true, codingDecisionVisible: true, architectureCardVisible: true });
71
71
  const response = await server.handleRequest({ jsonrpc: "2.0", id: 1, method: "tools/list" });
72
72
  const result = (response as { result?: { tools?: Array<{ name: string }> } }).result;
73
73
  const names = new Set<string>();
@@ -73,6 +73,7 @@ export const MCP_TOOLS: readonly McpToolEntry[] = [
73
73
  { tool: "memory_timeline", operation: null },
74
74
  { tool: "memory_store", operation: "memory_store" },
75
75
  { tool: "coding_decision", operation: "coding_decision" },
76
+ { tool: "coding_architecture", operation: "coding_architecture" },
76
77
  { tool: "suggestion_submit", operation: null },
77
78
  { tool: "entity_get", operation: null },
78
79
  { tool: "review_queue_list", operation: null },
@@ -170,6 +171,7 @@ export const HTTP_ROUTES: readonly HttpRouteEntry[] = [
170
171
  { method: "GET", pathname: "/engram/v1/lcm/status", operation: null },
171
172
  { method: "POST", pathname: "/engram/v1/memories", operation: "memory_store" },
172
173
  { method: "POST", pathname: "/engram/v1/coding/decisions", operation: "coding_decision" },
174
+ { method: "POST", pathname: "/engram/v1/coding/architecture", operation: "coding_architecture" },
173
175
  { method: "POST", pathname: "/engram/v1/suggestions", operation: null },
174
176
  { method: "GET", pathname: "/engram/v1/memories", operation: null },
175
177
  { method: "GET", pathname: "/engram/v1/memories/:id", operation: "memory_get" },
@@ -0,0 +1,177 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { mkdtemp, rm } from "node:fs/promises";
6
+
7
+ import { StorageManager } from "./storage.js";
8
+ import { isValidityExpiredNow } from "./temporal-validity.js";
9
+
10
+ /**
11
+ * Issue #1578 PR 1 — bi-temporal validity frontmatter round-trip + injection
12
+ * filter unit tests.
13
+ *
14
+ * These tests pin the on-disk contract added by #1578 (`observedAt`,
15
+ * `eventTimeSource`) AND prove the pre-existing temporal/lifecycle fields
16
+ * (`created`, `updated`, `source`, `valid_at`, `invalid_at`, `forgottenAt`)
17
+ * round-trip unchanged alongside them — i.e. the parser was not corrupted by
18
+ * the additive change. Every test goes through the public StorageManager API
19
+ * (`writeMemory` + `writeMemoryFrontmatter`, both of which route through the
20
+ * `serializeFrontmatter` chokepoint) so the serialize → parse round trip is
21
+ * exercised end to end.
22
+ *
23
+ * The injection filter (`isValidityExpiredNow`) is a pure function, so it is
24
+ * unit-tested directly with minimal frontmatter fragments.
25
+ */
26
+
27
+ const OBSERVED = "2026-06-20T14:02:11.000Z";
28
+ const VALID_FROM = "2026-03-01T00:00:00.000Z";
29
+ const VALID_UNTIL = "2026-06-15T00:00:00.000Z";
30
+
31
+ test("round-trip: observedAt + eventTimeSource + valid_at survive write → readAllMemories", async () => {
32
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-bitemporal-rt-"));
33
+ try {
34
+ const storage = new StorageManager(dir);
35
+ await storage.ensureDirectories();
36
+
37
+ const id = await storage.writeMemory("fact", "We moved offices in March.", {
38
+ observedAt: OBSERVED,
39
+ eventTimeSource: "extracted",
40
+ validAt: VALID_FROM,
41
+ });
42
+
43
+ const memories = await storage.readAllMemories();
44
+ const written = memories.find((m) => m.frontmatter.id === id);
45
+ assert.ok(written, "fact must be discoverable after write");
46
+ assert.equal(written!.frontmatter.observedAt, OBSERVED);
47
+ assert.equal(written!.frontmatter.eventTimeSource, "extracted");
48
+ assert.equal(written!.frontmatter.valid_at, VALID_FROM);
49
+ // The auto-set baseline fields must remain present and well-formed.
50
+ assert.ok(typeof written!.frontmatter.created === "string" && written!.frontmatter.created!.length > 0);
51
+ assert.ok(typeof written!.frontmatter.updated === "string" && written!.frontmatter.updated!.length > 0);
52
+ assert.equal(written!.frontmatter.source, "extraction");
53
+ } finally {
54
+ await rm(dir, { recursive: true, force: true });
55
+ }
56
+ });
57
+
58
+ test("round-trip: invalid_at + forgottenAt coexist with observedAt/eventTimeSource (parser not corrupted)", async () => {
59
+ // Exercises the full serialize→parse round trip through the
60
+ // writeMemoryFrontmatter chokepoint for the fields writeMemory does not
61
+ // accept as options (invalid_at, forgottenAt). This is the direct
62
+ // regression guard for the "frontmatter parser corruption" risk: every
63
+ // pre-existing field must survive alongside the new bi-temporal fields,
64
+ // with no field dropped or duplicated.
65
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-bitemporal-coexist-"));
66
+ try {
67
+ const storage = new StorageManager(dir);
68
+ await storage.ensureDirectories();
69
+
70
+ const id = await storage.writeMemory("fact", "Old stack was Node 18.", {
71
+ observedAt: OBSERVED,
72
+ eventTimeSource: "assumed",
73
+ validAt: VALID_FROM,
74
+ });
75
+
76
+ const before = await storage.readAllMemories();
77
+ const memory = before.find((m) => m.frontmatter.id === id);
78
+ assert.ok(memory);
79
+
80
+ const ok = await storage.writeMemoryFrontmatter(memory!, {
81
+ invalid_at: VALID_UNTIL,
82
+ forgottenAt: "2026-07-01T00:00:00.000Z",
83
+ });
84
+ assert.equal(ok, true);
85
+
86
+ const after = await storage.readAllMemories();
87
+ const patched = after.find((m) => m.frontmatter.id === id);
88
+ assert.ok(patched, "patched fact must be readable");
89
+ const fm = patched!.frontmatter;
90
+ // New bi-temporal fields.
91
+ assert.equal(fm.observedAt, OBSERVED);
92
+ assert.equal(fm.eventTimeSource, "assumed");
93
+ // Pre-existing temporal/lifecycle fields — all present, correct values.
94
+ assert.equal(fm.valid_at, VALID_FROM);
95
+ assert.equal(fm.invalid_at, VALID_UNTIL);
96
+ assert.equal(fm.forgottenAt, "2026-07-01T00:00:00.000Z");
97
+ // Baseline identity fields untouched by the patch.
98
+ assert.ok(typeof fm.created === "string" && fm.created!.length > 0);
99
+ assert.ok(typeof fm.source === "string" && fm.source!.length > 0);
100
+ } finally {
101
+ await rm(dir, { recursive: true, force: true });
102
+ }
103
+ });
104
+
105
+ test("legacy memory without bi-temporal fields reads cleanly — observedAt/eventTimeSource undefined", async () => {
106
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-bitemporal-legacy-"));
107
+ try {
108
+ const storage = new StorageManager(dir);
109
+ await storage.ensureDirectories();
110
+
111
+ const id = await storage.writeMemory("fact", "Legacy fact pre-dating #1578.");
112
+
113
+ const memories = await storage.readAllMemories();
114
+ const written = memories.find((m) => m.frontmatter.id === id);
115
+ assert.ok(written);
116
+ assert.equal(written!.frontmatter.observedAt, undefined);
117
+ assert.equal(written!.frontmatter.eventTimeSource, undefined);
118
+ } finally {
119
+ await rm(dir, { recursive: true, force: true });
120
+ }
121
+ });
122
+
123
+ test("garbage observedAt is rejected on write — corrupt timestamps cannot leak to disk", async () => {
124
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-bitemporal-reject-"));
125
+ try {
126
+ const storage = new StorageManager(dir);
127
+ await storage.ensureDirectories();
128
+
129
+ await assert.rejects(
130
+ () => storage.writeMemory("fact", "Bad observedAt.", { observedAt: "not-a-timestamp" }),
131
+ /observedAt must be a valid ISO timestamp/,
132
+ );
133
+ } finally {
134
+ await rm(dir, { recursive: true, force: true });
135
+ }
136
+ });
137
+
138
+ test("isValidityExpiredNow: absent invalid_at → never expired (still valid)", () => {
139
+ assert.equal(isValidityExpiredNow({ invalid_at: undefined }, Date.now()), false);
140
+ assert.equal(isValidityExpiredNow({ invalid_at: "" }, Date.now()), false);
141
+ });
142
+
143
+ test("isValidityExpiredNow: invalid_at in the past → expired (interval ended)", () => {
144
+ const now = Date.parse("2026-06-20T00:00:00.000Z");
145
+ assert.equal(
146
+ isValidityExpiredNow({ invalid_at: "2026-06-15T00:00:00.000Z" }, now),
147
+ true,
148
+ );
149
+ });
150
+
151
+ test("isValidityExpiredNow: invalid_at in the future → not expired (still within window)", () => {
152
+ const now = Date.parse("2026-06-20T00:00:00.000Z");
153
+ assert.equal(
154
+ isValidityExpiredNow({ invalid_at: "2026-12-31T00:00:00.000Z" }, now),
155
+ false,
156
+ );
157
+ });
158
+
159
+ test("isValidityExpiredNow: exclusive end — invalid_at == now is EXPIRED ([from, until) ended)", () => {
160
+ const boundary = Date.parse("2026-06-15T00:00:00.000Z");
161
+ // At the exact exclusive boundary the interval has ended.
162
+ assert.equal(
163
+ isValidityExpiredNow({ invalid_at: "2026-06-15T00:00:00.000Z" }, boundary),
164
+ true,
165
+ );
166
+ });
167
+
168
+ test("isValidityExpiredNow: status-orthogonal — considers invalid_at only, ignores status", () => {
169
+ // The filter must be status-orthogonal (issue pitfall matrix): an `active`
170
+ // memory can be validity-expired. isValidityExpiredNow only receives the
171
+ // invalid_at field, so status never enters the decision.
172
+ const now = Date.parse("2026-06-20T00:00:00.000Z");
173
+ assert.equal(
174
+ isValidityExpiredNow({ invalid_at: "2026-06-15T00:00:00.000Z" }, now),
175
+ true,
176
+ );
177
+ });
package/src/cli.ts CHANGED
@@ -57,6 +57,7 @@ import {
57
57
  } from "./maintenance/rebuild-memory-projection.js";
58
58
  import { rebuildObservations } from "./maintenance/rebuild-observations.js";
59
59
  import { migrateObservations } from "./maintenance/migrate-observations.js";
60
+ import { formatNamespaceMaintenanceHealthText } from "./maintenance/namespace-maintenance-fanout.js";
60
61
  import {
61
62
  listNamespaces,
62
63
  runNamespaceMigration,
@@ -2801,6 +2802,7 @@ export async function runAccessMcpServeCliCommand(
2801
2802
  principal: options.principal,
2802
2803
  emitLegacyTools: options.emitLegacyTools,
2803
2804
  codingDecisionVisible: service.decisionRecordSurfaceVisible,
2805
+ architectureCardVisible: service.architectureCardSurfaceVisible,
2804
2806
  });
2805
2807
  await server.runStdio(options.stdin ?? process.stdin, options.stdout ?? process.stdout);
2806
2808
  return { ok: true };
@@ -4292,6 +4294,22 @@ export function registerCli(
4292
4294
  }
4293
4295
  });
4294
4296
 
4297
+ namespacesCmd
4298
+ .command("maintenance")
4299
+ .description(
4300
+ "Show per-namespace maintenance status (issue #1500). Reports which namespaces were maintained, skipped, or failed for each standard job.",
4301
+ )
4302
+ .option("--json", "Emit machine-readable JSON only")
4303
+ .action(async (...args: unknown[]) => {
4304
+ const options = (args[0] ?? {}) as Record<string, unknown>;
4305
+ const summary = await orchestrator.readNamespaceMaintenanceHealth();
4306
+ if (reportHasMachineReadableOutput(options)) {
4307
+ console.log(JSON.stringify(summary, null, 2));
4308
+ } else {
4309
+ console.log(formatNamespaceMaintenanceHealthText(summary));
4310
+ }
4311
+ });
4312
+
4295
4313
  cmd
4296
4314
  .command("export")
4297
4315
  .description("Export Remnic memory to JSON, Markdown bundle, or SQLite")