@remnic/core 9.66.3 → 9.66.5

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 (285) hide show
  1. package/dist/access-admin-ops-surface.d.ts +1 -1
  2. package/dist/access-admin-ops-surface.js +27 -27
  3. package/dist/access-authorization-probe.d.ts +1 -1
  4. package/dist/access-authorization-probe.js +28 -28
  5. package/dist/access-boundary.d.ts +1 -1
  6. package/dist/access-boundary.js +27 -27
  7. package/dist/access-cli.js +100 -99
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.js +27 -27
  11. package/dist/access-http-lcm-compaction.d.ts +1 -1
  12. package/dist/access-http-lifecycle-flush.d.ts +1 -1
  13. package/dist/access-http-offline-stream.d.ts +1 -1
  14. package/dist/access-http-query.js +29 -29
  15. package/dist/access-http.d.ts +2 -2
  16. package/dist/access-http.js +47 -46
  17. package/dist/access-identity-continuity-surface.js +27 -27
  18. package/dist/access-lcm-surface.d.ts +1 -1
  19. package/dist/access-lcm-surface.js +27 -27
  20. package/dist/access-mcp-output-schemas.d.ts +1 -1
  21. package/dist/access-mcp-output-schemas.js +1 -1
  22. package/dist/access-mcp-tool-names.d.ts +19 -0
  23. package/dist/access-mcp-tool-names.js +22 -0
  24. package/dist/access-mcp.d.ts +1 -1
  25. package/dist/access-mcp.js +38 -37
  26. package/dist/access-namespace-preflight.js +27 -27
  27. package/dist/access-observe-write-surface.d.ts +1 -1
  28. package/dist/access-observe-write-surface.js +27 -27
  29. package/dist/access-operations-batch.js +31 -31
  30. package/dist/access-operations.d.ts +6 -6
  31. package/dist/access-operations.js +35 -35
  32. package/dist/access-recall-concurrency.d.ts +1 -1
  33. package/dist/access-recall-concurrency.js +27 -27
  34. package/dist/access-recall-response.d.ts +1 -1
  35. package/dist/access-recall-response.js +27 -27
  36. package/dist/access-recall-surface.d.ts +1 -1
  37. package/dist/access-recall-surface.js +27 -27
  38. package/dist/access-schema.d.ts +89 -89
  39. package/dist/access-schema.js +3 -3
  40. package/dist/access-service-helpers.d.ts +1 -1
  41. package/dist/access-service.d.ts +1 -1
  42. package/dist/access-service.js +27 -27
  43. package/dist/access-surface-catalog.d.ts +1 -1
  44. package/dist/access-surface-catalog.js +29 -29
  45. package/dist/active-recall.js +3 -3
  46. package/dist/adapters/index.js +7 -7
  47. package/dist/adapters/registry.js +3 -3
  48. package/dist/briefing.js +9 -9
  49. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-7FJQINUR.js} +2 -2
  50. package/dist/causal-behavior.js +2 -2
  51. package/dist/causal-chain.js +2 -2
  52. package/dist/causal-consolidation.js +12 -12
  53. package/dist/causal-retrieval.js +2 -2
  54. package/dist/causal-trajectory-graph.js +2 -2
  55. package/dist/causal-trajectory.js +1 -1
  56. package/dist/{chunk-7RZJWZ46.js → chunk-227UFSEQ.js} +5 -5
  57. package/dist/{chunk-BXLOS5AJ.js → chunk-2NLLXCJG.js} +2 -2
  58. package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
  59. package/dist/{chunk-4XESAT4V.js → chunk-34UT52QN.js} +2 -2
  60. package/dist/{chunk-G5UKF2GJ.js → chunk-3AJZMX4G.js} +2 -2
  61. package/dist/{chunk-3Z4SFJA5.js → chunk-475F5NXP.js} +2 -2
  62. package/dist/{chunk-GGY2747C.js → chunk-4WCGTONM.js} +2 -2
  63. package/dist/{chunk-3PO35HUU.js → chunk-4XZPXNSO.js} +58 -58
  64. package/dist/{chunk-U4RGSLI4.js → chunk-5ACBDUD7.js} +3 -3
  65. package/dist/{chunk-TCJO7LOG.js → chunk-5MOGH5KI.js} +6 -6
  66. package/dist/{chunk-ZDMTCO7N.js → chunk-5ZS6RSZI.js} +2 -2
  67. package/dist/{chunk-VDX2J7OX.js → chunk-7LCGFUMB.js} +4 -4
  68. package/dist/{chunk-PGD3DXZP.js → chunk-7XOG75AU.js} +2 -2
  69. package/dist/{chunk-B7AGLMGP.js → chunk-7Y5PVMNW.js} +5 -5
  70. package/dist/{chunk-U3L6GRUX.js → chunk-A2GLFKH5.js} +2 -2
  71. package/dist/{chunk-OPQKVVYG.js → chunk-AWGXR2PV.js} +2 -2
  72. package/dist/{chunk-VA2CSIPC.js → chunk-BBDC7THW.js} +2 -2
  73. package/dist/{chunk-F5H5QINZ.js → chunk-CDCQHE6C.js} +2 -2
  74. package/dist/{chunk-ZBYOXIIF.js → chunk-CGFQE4JY.js} +3 -3
  75. package/dist/{chunk-7DXW5V2W.js → chunk-CTCGHNWN.js} +5 -5
  76. package/dist/{chunk-5XRZANCW.js → chunk-CXMY6YY7.js} +15 -15
  77. package/dist/{chunk-JJAOVJ3E.js → chunk-DJZWNKFO.js} +2 -2
  78. package/dist/{chunk-T4WDJPEZ.js → chunk-E4RMZGRS.js} +2 -2
  79. package/dist/{chunk-T4WDJPEZ.js.map → chunk-E4RMZGRS.js.map} +1 -1
  80. package/dist/{chunk-7NNMRMLZ.js → chunk-EDPJFQIP.js} +2 -2
  81. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  82. package/dist/{chunk-S6PRJGQL.js → chunk-F7CAL3GZ.js} +2 -2
  83. package/dist/{chunk-5KGLNBUB.js → chunk-GBGLNWBW.js} +2 -2
  84. package/dist/{chunk-IDEPEHUG.js → chunk-GICQOFYG.js} +2 -2
  85. package/dist/{chunk-Q6LC3ZD5.js → chunk-GO657WPH.js} +2 -2
  86. package/dist/{chunk-VPJNGE2R.js → chunk-GUG4LW4I.js} +2 -2
  87. package/dist/{chunk-645WOU5I.js → chunk-H7BZBSP6.js} +4 -4
  88. package/dist/{chunk-D4R3OUZA.js → chunk-HBXIGKYD.js} +2 -2
  89. package/dist/{chunk-TO5U47YK.js → chunk-HUL6X5SZ.js} +2 -2
  90. package/dist/{chunk-MLTGALDY.js → chunk-I4WQPUCY.js} +2 -2
  91. package/dist/{chunk-UYA36DQ7.js → chunk-IGOINKTD.js} +1 -1
  92. package/dist/{chunk-UYA36DQ7.js.map → chunk-IGOINKTD.js.map} +1 -1
  93. package/dist/{chunk-EGGNFLAT.js → chunk-IW5DRPZ6.js} +2 -2
  94. package/dist/{chunk-UH53XVQ3.js → chunk-JA5EZ63P.js} +2 -2
  95. package/dist/{chunk-XSTMPZMY.js → chunk-JDKSSYSP.js} +2 -2
  96. package/dist/{chunk-3A2Z4OOS.js → chunk-KDYU3KZT.js} +10 -10
  97. package/dist/{chunk-ZVAKRZZD.js → chunk-KQNL5VE6.js} +2 -2
  98. package/dist/{chunk-UXERIBOJ.js → chunk-LICB4CEI.js} +2 -2
  99. package/dist/{chunk-ESDOAP7W.js → chunk-LRGYB2YF.js} +3 -3
  100. package/dist/{chunk-VTJZSLDR.js → chunk-LSRJDI6E.js} +2 -2
  101. package/dist/{chunk-C2JCVZWX.js → chunk-LTBKKSCX.js} +2 -2
  102. package/dist/{chunk-FPSOXMLK.js → chunk-MCWEVIJD.js} +3 -3
  103. package/dist/{chunk-OKGQDI4Y.js → chunk-MTYS6XMP.js} +38 -38
  104. package/dist/{chunk-JWCS3VYQ.js → chunk-NCYS4EJV.js} +65 -65
  105. package/dist/{chunk-3HHTN5X7.js → chunk-OHLDQ64J.js} +2 -2
  106. package/dist/{chunk-GZPGI45F.js → chunk-OTB4IRDI.js} +2 -2
  107. package/dist/{chunk-Z3SQEEB6.js → chunk-PD66CVSD.js} +2 -2
  108. package/dist/{chunk-73CAEYI3.js → chunk-PUTLM67J.js} +2 -2
  109. package/dist/{chunk-WHFFAS4A.js → chunk-QIRBQH5P.js} +16 -26
  110. package/dist/chunk-QIRBQH5P.js.map +1 -0
  111. package/dist/{chunk-KWJNEWTM.js → chunk-SDCEOIV7.js} +5 -5
  112. package/dist/{chunk-ZC5IHL5X.js → chunk-SFUCQ7ZQ.js} +9 -9
  113. package/dist/{chunk-QELYSDAU.js → chunk-TLSHEAHI.js} +2 -2
  114. package/dist/{chunk-4PTTMTTQ.js → chunk-TR76RJNY.js} +1 -1
  115. package/dist/{chunk-7JJHIVMG.js → chunk-WFG3SZ6I.js} +6 -6
  116. package/dist/{chunk-B2OKCCXX.js → chunk-WUEDPNTM.js} +1 -1
  117. package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
  118. package/dist/{chunk-ZET6A3OF.js → chunk-YHCBJULX.js} +2 -2
  119. package/dist/{chunk-OLT3YTDH.js → chunk-YMOPYG3K.js} +4 -4
  120. package/dist/{chunk-6DODJYBY.js → chunk-YRS2SZM7.js} +2 -2
  121. package/dist/{chunk-WVNETF4Q.js → chunk-YY7IG7EF.js} +2 -2
  122. package/dist/{chunk-IN5EUWCA.js → chunk-Z3LZFKO5.js} +3 -3
  123. package/dist/{chunk-EZWIEFYD.js → chunk-Z3YEGSR4.js} +4 -4
  124. package/dist/{chunk-KE23ZIEW.js → chunk-ZDPDYRSL.js} +20 -17
  125. package/dist/chunk-ZDPDYRSL.js.map +1 -0
  126. package/dist/chunk-ZQUVBZI4.js +45 -0
  127. package/dist/chunk-ZQUVBZI4.js.map +1 -0
  128. package/dist/{cli-CsfFMe6n.d.ts → cli-BOuEb4Ia.d.ts} +1 -1
  129. package/dist/cli.d.ts +2 -2
  130. package/dist/cli.js +73 -72
  131. package/dist/coding/export-okf-codegraph.js +9 -9
  132. package/dist/coding/pre-action-gate.js +2 -2
  133. package/dist/compounding/engine.js +9 -9
  134. package/dist/config.js +3 -3
  135. package/dist/connectors/codex-materialize-runner.js +9 -9
  136. package/dist/connectors/index.js +9 -9
  137. package/dist/convergence-refresh.js +11 -11
  138. package/dist/conversation-index/backend.js +2 -2
  139. package/dist/corpus-watermark.js +11 -11
  140. package/dist/dashboard-runtime.js +2 -2
  141. package/dist/entity-retrieval.js +10 -10
  142. package/dist/event-order-recall.js +2 -2
  143. package/dist/external-wiki-access.d.ts +1 -1
  144. package/dist/external-wiki-access.js +28 -28
  145. package/dist/external-wiki-mcp-tools.d.ts +1 -1
  146. package/dist/extraction-span-gap.d.ts +14 -0
  147. package/dist/extraction-span-gap.js +18 -0
  148. package/dist/extraction-span-gap.js.map +1 -0
  149. package/dist/extraction.js +12 -12
  150. package/dist/{graph-edge-decay-DGTBFALQ.js → graph-edge-decay-A4SDFMMS.js} +4 -4
  151. package/dist/graph-edge-decay-A4SDFMMS.js.map +1 -0
  152. package/dist/graph-snapshot.js +3 -3
  153. package/dist/graph.js +2 -2
  154. package/dist/harmonic-retrieval.js +1 -1
  155. package/dist/index.d.ts +680 -680
  156. package/dist/index.js +131 -130
  157. package/dist/lcm/engine.js +2 -2
  158. package/dist/lcm/index.js +2 -2
  159. package/dist/location/index.js +11 -11
  160. package/dist/maintenance/memory-governance.js +9 -9
  161. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +9 -9
  162. package/dist/maintenance/rebuild-memory-projection.js +10 -10
  163. package/dist/mcp-memory-inspector-app.d.ts +2 -2
  164. package/dist/mcp-memory-inspector-app.js +1 -1
  165. package/dist/memory-subject-cli.d.ts +1 -1
  166. package/dist/memory-subject.d.ts +1 -1
  167. package/dist/namespaces/migrate.js +10 -10
  168. package/dist/namespaces/search.js +4 -4
  169. package/dist/namespaces/storage.js +9 -9
  170. package/dist/operator-doctor-corpus.js +12 -12
  171. package/dist/operator-toolkit.js +23 -23
  172. package/dist/orchestration/maintenance.js +17 -17
  173. package/dist/orchestrator.js +102 -101
  174. package/dist/{public-http-Cwvl4QZr.d.ts → public-http-CmQRjQCD.d.ts} +1 -1
  175. package/dist/resume-bundles.js +4 -4
  176. package/dist/schemas.d.ts +176 -176
  177. package/dist/search/factory.js +3 -3
  178. package/dist/search/index.js +3 -3
  179. package/dist/semantic-consolidation.js +10 -10
  180. package/dist/semantic-rule-promotion.js +9 -9
  181. package/dist/semantic-rule-verifier.js +9 -9
  182. package/dist/shared-context/manager.d.ts +6 -6
  183. package/dist/source-agent-qualifier.js +9 -9
  184. package/dist/storage.js +8 -8
  185. package/dist/support-passport/index.d.ts +4 -4
  186. package/dist/support-passport/index.js +30 -30
  187. package/dist/transfer/backup.js +2 -2
  188. package/dist/transfer/capsule-export.js +2 -2
  189. package/dist/transfer/capsule-import.js +2 -2
  190. package/dist/transfer/export-okf.js +10 -10
  191. package/dist/transfer/types.d.ts +78 -78
  192. package/dist/verified-recall.js +9 -9
  193. package/dist/who-knows-cli.d.ts +1 -1
  194. package/dist/who-knows-cli.js +10 -10
  195. package/dist/who-knows.d.ts +1 -1
  196. package/dist/who-knows.js +9 -9
  197. package/package.json +2 -2
  198. package/src/access-http.ts +2 -1
  199. package/src/access-mcp-output-schemas.ts +1 -1
  200. package/src/access-mcp-tool-names.test.ts +56 -0
  201. package/src/access-mcp-tool-names.ts +45 -0
  202. package/src/access-mcp.test.ts +23 -18
  203. package/src/access-mcp.ts +16 -35
  204. package/src/access-surface-catalog.test.ts +2 -2
  205. package/src/activity/timeline/analysis-overlap.test.ts +26 -0
  206. package/src/activity/timeline/analysis-overlap.ts +17 -0
  207. package/src/activity/timeline/recap-card-count.test.ts +19 -0
  208. package/src/activity/timeline/recap-card-count.ts +13 -0
  209. package/src/activity/timeline/week-span.test.ts +21 -0
  210. package/src/activity/timeline/week-span.ts +18 -0
  211. package/src/coding/architecture-surfaces.test.ts +2 -2
  212. package/src/coding/codegraph-surfaces.test.ts +4 -4
  213. package/src/coding/decision-surfaces.test.ts +1 -1
  214. package/src/correction/correction-surfaces.test.ts +4 -4
  215. package/src/extraction-span-gap.test.ts +29 -0
  216. package/src/extraction-span-gap.ts +25 -0
  217. package/src/mcp-memory-inspector-app.ts +1 -1
  218. package/src/support-passport/mcp-tools.test.ts +3 -3
  219. package/dist/chunk-KE23ZIEW.js.map +0 -1
  220. package/dist/chunk-WHFFAS4A.js.map +0 -1
  221. package/dist/{capsule-crypto-YO5QJ6L3.js.map → access-mcp-tool-names.js.map} +0 -0
  222. package/dist/{access-service-C2tV2-uL.d.ts → access-service-Dz6I9AZ-.d.ts} +64 -64
  223. /package/dist/{graph-edge-decay-DGTBFALQ.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  224. /package/dist/{chunk-7RZJWZ46.js.map → chunk-227UFSEQ.js.map} +0 -0
  225. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
  226. /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
  227. /package/dist/{chunk-4XESAT4V.js.map → chunk-34UT52QN.js.map} +0 -0
  228. /package/dist/{chunk-G5UKF2GJ.js.map → chunk-3AJZMX4G.js.map} +0 -0
  229. /package/dist/{chunk-3Z4SFJA5.js.map → chunk-475F5NXP.js.map} +0 -0
  230. /package/dist/{chunk-GGY2747C.js.map → chunk-4WCGTONM.js.map} +0 -0
  231. /package/dist/{chunk-3PO35HUU.js.map → chunk-4XZPXNSO.js.map} +0 -0
  232. /package/dist/{chunk-U4RGSLI4.js.map → chunk-5ACBDUD7.js.map} +0 -0
  233. /package/dist/{chunk-TCJO7LOG.js.map → chunk-5MOGH5KI.js.map} +0 -0
  234. /package/dist/{chunk-ZDMTCO7N.js.map → chunk-5ZS6RSZI.js.map} +0 -0
  235. /package/dist/{chunk-VDX2J7OX.js.map → chunk-7LCGFUMB.js.map} +0 -0
  236. /package/dist/{chunk-PGD3DXZP.js.map → chunk-7XOG75AU.js.map} +0 -0
  237. /package/dist/{chunk-B7AGLMGP.js.map → chunk-7Y5PVMNW.js.map} +0 -0
  238. /package/dist/{chunk-U3L6GRUX.js.map → chunk-A2GLFKH5.js.map} +0 -0
  239. /package/dist/{chunk-OPQKVVYG.js.map → chunk-AWGXR2PV.js.map} +0 -0
  240. /package/dist/{chunk-VA2CSIPC.js.map → chunk-BBDC7THW.js.map} +0 -0
  241. /package/dist/{chunk-F5H5QINZ.js.map → chunk-CDCQHE6C.js.map} +0 -0
  242. /package/dist/{chunk-ZBYOXIIF.js.map → chunk-CGFQE4JY.js.map} +0 -0
  243. /package/dist/{chunk-7DXW5V2W.js.map → chunk-CTCGHNWN.js.map} +0 -0
  244. /package/dist/{chunk-5XRZANCW.js.map → chunk-CXMY6YY7.js.map} +0 -0
  245. /package/dist/{chunk-JJAOVJ3E.js.map → chunk-DJZWNKFO.js.map} +0 -0
  246. /package/dist/{chunk-7NNMRMLZ.js.map → chunk-EDPJFQIP.js.map} +0 -0
  247. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  248. /package/dist/{chunk-S6PRJGQL.js.map → chunk-F7CAL3GZ.js.map} +0 -0
  249. /package/dist/{chunk-5KGLNBUB.js.map → chunk-GBGLNWBW.js.map} +0 -0
  250. /package/dist/{chunk-IDEPEHUG.js.map → chunk-GICQOFYG.js.map} +0 -0
  251. /package/dist/{chunk-Q6LC3ZD5.js.map → chunk-GO657WPH.js.map} +0 -0
  252. /package/dist/{chunk-VPJNGE2R.js.map → chunk-GUG4LW4I.js.map} +0 -0
  253. /package/dist/{chunk-645WOU5I.js.map → chunk-H7BZBSP6.js.map} +0 -0
  254. /package/dist/{chunk-D4R3OUZA.js.map → chunk-HBXIGKYD.js.map} +0 -0
  255. /package/dist/{chunk-TO5U47YK.js.map → chunk-HUL6X5SZ.js.map} +0 -0
  256. /package/dist/{chunk-MLTGALDY.js.map → chunk-I4WQPUCY.js.map} +0 -0
  257. /package/dist/{chunk-EGGNFLAT.js.map → chunk-IW5DRPZ6.js.map} +0 -0
  258. /package/dist/{chunk-UH53XVQ3.js.map → chunk-JA5EZ63P.js.map} +0 -0
  259. /package/dist/{chunk-XSTMPZMY.js.map → chunk-JDKSSYSP.js.map} +0 -0
  260. /package/dist/{chunk-3A2Z4OOS.js.map → chunk-KDYU3KZT.js.map} +0 -0
  261. /package/dist/{chunk-ZVAKRZZD.js.map → chunk-KQNL5VE6.js.map} +0 -0
  262. /package/dist/{chunk-UXERIBOJ.js.map → chunk-LICB4CEI.js.map} +0 -0
  263. /package/dist/{chunk-ESDOAP7W.js.map → chunk-LRGYB2YF.js.map} +0 -0
  264. /package/dist/{chunk-VTJZSLDR.js.map → chunk-LSRJDI6E.js.map} +0 -0
  265. /package/dist/{chunk-C2JCVZWX.js.map → chunk-LTBKKSCX.js.map} +0 -0
  266. /package/dist/{chunk-FPSOXMLK.js.map → chunk-MCWEVIJD.js.map} +0 -0
  267. /package/dist/{chunk-OKGQDI4Y.js.map → chunk-MTYS6XMP.js.map} +0 -0
  268. /package/dist/{chunk-JWCS3VYQ.js.map → chunk-NCYS4EJV.js.map} +0 -0
  269. /package/dist/{chunk-3HHTN5X7.js.map → chunk-OHLDQ64J.js.map} +0 -0
  270. /package/dist/{chunk-GZPGI45F.js.map → chunk-OTB4IRDI.js.map} +0 -0
  271. /package/dist/{chunk-Z3SQEEB6.js.map → chunk-PD66CVSD.js.map} +0 -0
  272. /package/dist/{chunk-73CAEYI3.js.map → chunk-PUTLM67J.js.map} +0 -0
  273. /package/dist/{chunk-KWJNEWTM.js.map → chunk-SDCEOIV7.js.map} +0 -0
  274. /package/dist/{chunk-ZC5IHL5X.js.map → chunk-SFUCQ7ZQ.js.map} +0 -0
  275. /package/dist/{chunk-QELYSDAU.js.map → chunk-TLSHEAHI.js.map} +0 -0
  276. /package/dist/{chunk-4PTTMTTQ.js.map → chunk-TR76RJNY.js.map} +0 -0
  277. /package/dist/{chunk-7JJHIVMG.js.map → chunk-WFG3SZ6I.js.map} +0 -0
  278. /package/dist/{chunk-B2OKCCXX.js.map → chunk-WUEDPNTM.js.map} +0 -0
  279. /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
  280. /package/dist/{chunk-ZET6A3OF.js.map → chunk-YHCBJULX.js.map} +0 -0
  281. /package/dist/{chunk-OLT3YTDH.js.map → chunk-YMOPYG3K.js.map} +0 -0
  282. /package/dist/{chunk-6DODJYBY.js.map → chunk-YRS2SZM7.js.map} +0 -0
  283. /package/dist/{chunk-WVNETF4Q.js.map → chunk-YY7IG7EF.js.map} +0 -0
  284. /package/dist/{chunk-IN5EUWCA.js.map → chunk-Z3LZFKO5.js.map} +0 -0
  285. /package/dist/{chunk-EZWIEFYD.js.map → chunk-Z3YEGSR4.js.map} +0 -0
@@ -0,0 +1,56 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import {
5
+ CANONICAL_MCP_PREFIX,
6
+ toCanonicalToolName,
7
+ toLegacyToolName,
8
+ withToolAliases,
9
+ } from "./access-mcp-tool-names.js";
10
+
11
+ const ANTHROPIC_TOOL_NAME = /^[a-zA-Z0-9_-]{1,64}$/;
12
+
13
+ test("toCanonicalToolName maps remnic_ / remnic. / engram. to remnic_suffix", () => {
14
+ assert.equal(toCanonicalToolName("remnic_recall"), "remnic_recall");
15
+ assert.equal(toCanonicalToolName("remnic.recall"), "remnic_recall");
16
+ assert.equal(toCanonicalToolName("engram.recall"), "remnic_recall");
17
+ assert.equal(toCanonicalToolName("unknown"), "unknown");
18
+ });
19
+
20
+ test("toLegacyToolName maps remnic_ / remnic. / engram. to engram.suffix", () => {
21
+ assert.equal(toLegacyToolName("remnic_recall"), "engram.recall");
22
+ assert.equal(toLegacyToolName("remnic.recall"), "engram.recall");
23
+ assert.equal(toLegacyToolName("engram.recall"), "engram.recall");
24
+ });
25
+
26
+ test("withToolAliases advertises remnic_<suffix> and optional engram.*", () => {
27
+ const tool = { name: "engram.recall" };
28
+ const both = withToolAliases(tool, true);
29
+ assert.deepEqual(
30
+ both.map((entry) => entry.name),
31
+ ["remnic_recall", "engram.recall"],
32
+ );
33
+ const canonicalOnly = withToolAliases(tool, false);
34
+ assert.deepEqual(
35
+ canonicalOnly.map((entry) => entry.name),
36
+ ["remnic_recall"],
37
+ );
38
+ assert.ok(canonicalOnly.every((entry) => ANTHROPIC_TOOL_NAME.test(entry.name)));
39
+ assert.equal(CANONICAL_MCP_PREFIX, "remnic_");
40
+ });
41
+
42
+ test("withToolAliases emits the engram.* alias for canonical-named tools too", () => {
43
+ const tool = { name: "remnic_recall" };
44
+ assert.deepEqual(
45
+ withToolAliases(tool, true).map((entry) => entry.name),
46
+ ["remnic_recall", "engram.recall"],
47
+ );
48
+ assert.deepEqual(
49
+ withToolAliases(tool, false).map((entry) => entry.name),
50
+ ["remnic_recall"],
51
+ );
52
+ assert.deepEqual(
53
+ withToolAliases({ name: "remnic.recall" }, true).map((entry) => entry.name),
54
+ ["remnic_recall", "engram.recall"],
55
+ );
56
+ });
@@ -0,0 +1,45 @@
1
+ /**
2
+ * MCP tool-name prefixes (issue #2705).
3
+ *
4
+ * Anthropic tool names must match `^[a-zA-Z0-9_-]{1,64}$`.
5
+ * Advertised canonical form is `remnic_<suffix>`.
6
+ * `remnic.` and `engram.` stay callable.
7
+ */
8
+ export const CANONICAL_MCP_PREFIX = "remnic_";
9
+ export const LEGACY_MCP_PREFIX = "engram.";
10
+ export const DOTTED_REMNIC_PREFIX = "remnic.";
11
+
12
+ const KNOWN_PREFIXES = [CANONICAL_MCP_PREFIX, DOTTED_REMNIC_PREFIX, LEGACY_MCP_PREFIX] as const;
13
+
14
+ export function toolNameSuffix(name: string): string | null {
15
+ for (const prefix of KNOWN_PREFIXES) {
16
+ if (name.startsWith(prefix)) return name.slice(prefix.length);
17
+ }
18
+ return null;
19
+ }
20
+
21
+ export function toCanonicalToolName(name: string): string {
22
+ const suffix = toolNameSuffix(name);
23
+ return suffix === null ? name : `${CANONICAL_MCP_PREFIX}${suffix}`;
24
+ }
25
+
26
+ export function toLegacyToolName(name: string): string {
27
+ const suffix = toolNameSuffix(name);
28
+ return suffix === null ? name : `${LEGACY_MCP_PREFIX}${suffix}`;
29
+ }
30
+
31
+ export function toDottedRemnicName(name: string): string {
32
+ const suffix = toolNameSuffix(name);
33
+ return suffix === null ? name : `${DOTTED_REMNIC_PREFIX}${suffix}`;
34
+ }
35
+
36
+ export function withToolAliases<T extends { name: string }>(tool: T, emitLegacyTools = true): T[] {
37
+ const suffix = toolNameSuffix(tool.name);
38
+ if (suffix === null) return [tool];
39
+ const canonicalName = `${CANONICAL_MCP_PREFIX}${suffix}`;
40
+ const canonicalTool = canonicalName === tool.name ? tool : { ...tool, name: canonicalName };
41
+ if (!emitLegacyTools) return [canonicalTool];
42
+ const legacyName = `${LEGACY_MCP_PREFIX}${suffix}`;
43
+ const legacyTool = legacyName === tool.name ? tool : { ...tool, name: legacyName };
44
+ return [canonicalTool, legacyTool];
45
+ }
@@ -910,9 +910,9 @@ test("MCP tools/list exposes LCM compaction tools under remnic aliases", async (
910
910
  (tool) => tool.name,
911
911
  );
912
912
 
913
- assert.ok(listed.includes("remnic.lcm_compaction_flush"));
913
+ assert.ok(listed.includes("remnic_lcm_compaction_flush"));
914
914
  assert.ok(listed.includes("engram.lcm_compaction_flush"));
915
- assert.ok(listed.includes("remnic.lcm_compaction_record"));
915
+ assert.ok(listed.includes("remnic_lcm_compaction_record"));
916
916
  assert.ok(listed.includes("engram.lcm_compaction_record"));
917
917
  });
918
918
 
@@ -977,10 +977,10 @@ function listToolNames(response: unknown): string[] {
977
977
 
978
978
  const TOOLS_LIST_REQUEST = { jsonrpc: "2.0", id: 1, method: "tools/list", params: {} };
979
979
 
980
- test("tools/list advertises both remnic.* and engram.* by default (back-compat)", async () => {
980
+ test("tools/list advertises remnic_* and engram.* by default (back-compat)", async () => {
981
981
  const server = new EngramMcpServer(makeMockService());
982
982
  const names = listToolNames(await server.handleRequest(TOOLS_LIST_REQUEST));
983
- assert.ok(names.includes("remnic.recall"), "canonical name present");
983
+ assert.ok(names.includes("remnic_recall"), "canonical name present");
984
984
  assert.ok(names.includes("engram.recall"), "legacy alias present by default");
985
985
  const legacyCount = names.filter((n) => n.startsWith("engram.")).length;
986
986
  assert.ok(legacyCount > 0, "legacy aliases advertised by default");
@@ -989,26 +989,31 @@ test("tools/list advertises both remnic.* and engram.* by default (back-compat)"
989
989
  test("tools/list omits engram.* aliases when emitLegacyTools is false", async () => {
990
990
  const server = new EngramMcpServer(makeMockService(), { emitLegacyTools: false });
991
991
  const names = listToolNames(await server.handleRequest(TOOLS_LIST_REQUEST));
992
- assert.ok(names.includes("remnic.recall"), "canonical name still present");
992
+ assert.ok(names.includes("remnic_recall"), "canonical name still present");
993
993
  assert.equal(
994
994
  names.filter((n) => n.startsWith("engram.")).length,
995
995
  0,
996
996
  "no engram.* aliases advertised when opted out",
997
997
  );
998
- // Every advertised tool uses the canonical prefix; the surface is halved.
999
- assert.ok(names.every((n) => n.startsWith("remnic.")), "all advertised tools are canonical");
998
+ // Every advertised tool uses the Anthropic-safe remnic_* prefix.
999
+ assert.ok(names.every((n) => n.startsWith("remnic_")), "all advertised tools are canonical");
1000
+ assert.ok(names.every((n) => /^[a-zA-Z0-9_-]{1,64}$/.test(n)), "Anthropic tool-name pattern");
1000
1001
  });
1001
1002
 
1002
1003
  test("emitLegacyTools=false still allows calling tools under BOTH names (advertising-only opt-out)", async () => {
1003
1004
  const server = new EngramMcpServer(makeMockService(), { emitLegacyTools: false });
1004
- // Canonical call works.
1005
- const canonical = await server.handleRequest(makeToolRequest("remnic.recall", { query: "hello" }));
1005
+ const advertised = await server.handleRequest(makeToolRequest("remnic_recall", { query: "hello" }));
1006
1006
  assert.notEqual(
1007
- (canonical as { result?: { isError?: boolean } }).result?.isError,
1007
+ (advertised as { result?: { isError?: boolean } }).result?.isError,
1008
1008
  true,
1009
- "canonical remnic.recall call succeeds",
1009
+ "advertised remnic_recall call succeeds",
1010
+ );
1011
+ const dotted = await server.handleRequest(makeToolRequest("remnic.recall", { query: "hello" }));
1012
+ assert.notEqual(
1013
+ (dotted as { result?: { isError?: boolean } }).result?.isError,
1014
+ true,
1015
+ "dotted remnic.recall call still dispatches",
1010
1016
  );
1011
- // Legacy call still dispatches even though it is no longer advertised.
1012
1017
  const legacy = await server.handleRequest(makeToolRequest("engram.recall", { query: "hello" }));
1013
1018
  assert.notEqual(
1014
1019
  (legacy as { result?: { isError?: boolean } }).result?.isError,
@@ -1034,10 +1039,10 @@ test("tools/list: ops-scoped token sees ONLY its permitted tools (issue #1850 fi
1034
1039
  const names = await tokenCapabilityStore.run({ version: 1, ops: ["recall", "memory_get"] }, async () =>
1035
1040
  listToolNames(await server.handleRequest(TOOLS_LIST_REQUEST)),
1036
1041
  );
1037
- assert.ok(names.includes("remnic.recall"), "permitted recall tool advertised");
1038
- assert.ok(names.includes("remnic.memory_get"), "permitted memory_get tool advertised");
1039
- assert.ok(!names.includes("remnic.memory_store"), "non-permitted tool must NOT be advertised");
1040
- assert.ok(!names.includes("remnic.observe"), "non-permitted tool must NOT be advertised");
1042
+ assert.ok(names.includes("remnic_recall"), "permitted recall tool advertised");
1043
+ assert.ok(names.includes("remnic_memory_get"), "permitted memory_get tool advertised");
1044
+ assert.ok(!names.includes("remnic_memory_store"), "non-permitted tool must NOT be advertised");
1045
+ assert.ok(!names.includes("remnic_observe"), "non-permitted tool must NOT be advertised");
1041
1046
  assert.equal(names.length, 2, "exactly the two permitted tools advertised");
1042
1047
  });
1043
1048
 
@@ -1330,11 +1335,11 @@ test("MCP external_wiki_search exposes aliases and dispatches the stable result"
1330
1335
  ? [tool.name]
1331
1336
  : []
1332
1337
  );
1333
- assert.ok(toolNames.includes("remnic.external_wiki_search"));
1338
+ assert.ok(toolNames.includes("remnic_external_wiki_search"));
1334
1339
  assert.ok(toolNames.includes("engram.external_wiki_search"));
1335
1340
 
1336
1341
  let canonicalResult: unknown;
1337
- for (const name of ["remnic.external_wiki_search", "engram.external_wiki_search"]) {
1342
+ for (const name of ["remnic_external_wiki_search", "engram.external_wiki_search", "remnic.external_wiki_search"]) {
1338
1343
  const response = await server.handleRequest(makeToolRequest(name, {
1339
1344
  query: "hybrid retrieval",
1340
1345
  limit: 3,
package/src/access-mcp.ts CHANGED
@@ -42,6 +42,14 @@ import { readEnvVar } from "./runtime/env.js";
42
42
  import type { RecallDisclosure, RecallPlanMode } from "./types.js";
43
43
  import { expandTildePath } from "./utils/path.js";
44
44
  import { applyToolOutputSchemas } from "./access-mcp-output-schemas.js";
45
+ import {
46
+ CANONICAL_MCP_PREFIX,
47
+ LEGACY_MCP_PREFIX,
48
+ toCanonicalToolName,
49
+ toLegacyToolName,
50
+ toolNameSuffix,
51
+ withToolAliases,
52
+ } from "./access-mcp-tool-names.js";
45
53
  import { MCP_READ_ONLY_TOOL_SUFFIXES } from "./mcp-read-only-tools.js";
46
54
  import { MEETINGS_MCP_TOOLS } from "./meetings/mcp-tools.js";
47
55
  import { WEARABLES_MCP_TOOLS } from "./wearables/mcp-tools.js";
@@ -119,42 +127,15 @@ type McpResource = {
119
127
  */
120
128
  export const MCP_SUPPORTED_PROTOCOL_VERSIONS: readonly string[] = ["2025-06-18", "2025-03-26", "2024-11-05"];
121
129
  const MCP_DEFAULT_PROTOCOL_VERSION: string = MCP_SUPPORTED_PROTOCOL_VERSIONS[0] ?? "2025-06-18";
122
- const LEGACY_MCP_PREFIX = "engram.";
123
- const CANONICAL_MCP_PREFIX = "remnic.";
124
-
125
- function toCanonicalToolName(name: string): string {
126
- return name.startsWith(LEGACY_MCP_PREFIX) ? `${CANONICAL_MCP_PREFIX}${name.slice(LEGACY_MCP_PREFIX.length)}` : name;
127
- }
128
- function toLegacyToolName(name: string): string {
129
- return name.startsWith(CANONICAL_MCP_PREFIX)
130
- ? `${LEGACY_MCP_PREFIX}${name.slice(CANONICAL_MCP_PREFIX.length)}`
131
- : name;
132
- }
133
-
134
130
  /**
135
131
  * Suffix-based allowlist matcher. Returns true for tools whose canonical
136
- * suffix (after stripping `remnic.` or `engram.`) is in
132
+ * suffix (after stripping `remnic_`, `remnic.`, or `engram.`) is in
137
133
  * {@link MCP_READ_ONLY_TOOL_SUFFIXES}. Unprefixed names are treated as
138
134
  * unannotated.
139
135
  */
140
136
  function isReadOnlyToolName(name: string): boolean {
141
- for (const prefix of [CANONICAL_MCP_PREFIX, LEGACY_MCP_PREFIX]) {
142
- if (name.startsWith(prefix)) {
143
- return MCP_READ_ONLY_TOOL_SUFFIXES[name.slice(prefix.length)] === true;
144
- }
145
- }
146
- return false;
147
- }
148
-
149
- function withToolAliases(tool: McpTool, emitLegacyTools = true): McpTool[] {
150
- const canonicalName = toCanonicalToolName(tool.name);
151
- const canonicalTool = canonicalName === tool.name ? tool : { ...tool, name: canonicalName };
152
- if (canonicalName === tool.name) return [canonicalTool];
153
- // Issue #1427: when legacy aliases are opted out, advertise only the
154
- // canonical `remnic.*` name and drop the `engram.*` duplicate. Tool *calls*
155
- // still accept both names (the dispatch canonicalizes), so suppressing the
156
- // alias only trims `tools/list`, not callability.
157
- return emitLegacyTools ? [canonicalTool, tool] : [canonicalTool];
137
+ const suffix = toolNameSuffix(name);
138
+ return suffix !== null && MCP_READ_ONLY_TOOL_SUFFIXES[suffix] === true;
158
139
  }
159
140
 
160
141
  export const MCP_MIGRATED_OPERATIONS: Readonly<Record<string, OperationName>> = {
@@ -2247,7 +2228,7 @@ export class EngramMcpServer {
2247
2228
  // allowlist. Done as a final pass so every spread (chat, codegraph,
2248
2229
  // coding_*, correction, etc.) inherits the annotation without
2249
2230
  // scattering the same logic across every `withToolAliases` call site.
2250
- // Suffix-based matching covers both the `remnic.*` and `engram.*`
2231
+ // Suffix-based matching covers both the `remnic_*` and `engram.*`
2251
2232
  // naming forms emitted by `withToolAliases`.
2252
2233
  this.tools = this.tools.map((tool) =>
2253
2234
  isReadOnlyToolName(tool.name) && tool.annotations?.readOnlyHint !== true
@@ -2256,7 +2237,7 @@ export class EngramMcpServer {
2256
2237
  );
2257
2238
  // Apply `outputSchema` declarations from the registry. Like the
2258
2239
  // readOnlyHint pass above, this is a final suffix-based pass so every
2259
- // tool (including both `remnic.*` and `engram.*` aliases) gets a
2240
+ // tool (including both `remnic_*` and `engram.*` aliases) gets a
2260
2241
  // schema. Tools that already declare an outputSchema (e.g.
2261
2242
  // chatgpt_memory_inspector) are left untouched.
2262
2243
  this.tools = applyToolOutputSchemas(this.tools, CANONICAL_MCP_PREFIX, LEGACY_MCP_PREFIX);
@@ -2589,9 +2570,9 @@ export class EngramMcpServer {
2589
2570
 
2590
2571
  private toolAcceptsArgument(name: string, key: string): boolean {
2591
2572
  // Match by canonical name so argument validation resolves whether the
2592
- // caller used the `engram.*` or `remnic.*` name and regardless of whether
2593
- // legacy aliases are advertised (issue #1427) — a tool stays callable under
2594
- // both names even when only the canonical alias appears in `tools/list`.
2573
+ // caller used `engram.*`, `remnic.*`, or `remnic_*` and regardless of
2574
+ // whether legacy aliases are advertised (issue #1427) — a tool stays
2575
+ // callable under those names even when only remnic_* appears in tools/list.
2595
2576
  const target = toCanonicalToolName(name);
2596
2577
  const tool = this.tools.find((entry) => toCanonicalToolName(entry.name) === target);
2597
2578
  const inputSchema = getObjectProperties(tool?.inputSchema);
@@ -53,9 +53,9 @@ void getOperation;
53
53
  // ---------------------------------------------------------------------------
54
54
 
55
55
  const LEGACY_PREFIX = "engram.";
56
- const CANONICAL_PREFIX = "remnic.";
56
+ const CANONICAL_PREFIX = "remnic_";
57
57
 
58
- /** Strip the `engram.`/`remnic.` prefix to get the canonical short name. */
58
+ /** Strip the `engram.`/`remnic_` prefix to get the canonical short name. */
59
59
  function shortToolName(advertised: string): string {
60
60
  if (advertised.startsWith(LEGACY_PREFIX)) return advertised.slice(LEGACY_PREFIX.length);
61
61
  if (advertised.startsWith(CANONICAL_PREFIX)) return advertised.slice(CANONICAL_PREFIX.length);
@@ -0,0 +1,26 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { parseOverlap } from "./analysis-overlap.js";
5
+
6
+ test("overlap 0 is allowed", () => {
7
+ assert.equal(parseOverlap(0, 8), 0);
8
+ assert.equal(parseOverlap(0, 0), 0);
9
+ });
10
+
11
+ test("overlap 3 with maxBatch 8 is returned", () => {
12
+ assert.equal(parseOverlap(3, 8), 3);
13
+ });
14
+
15
+ test("overlap >= maxBatch throws when maxBatch > 0", () => {
16
+ assert.throws(() => parseOverlap(8, 8), /less than maxBatch/);
17
+ assert.throws(() => parseOverlap(5, 4), /less than maxBatch/);
18
+ });
19
+
20
+ test("negative overlap throws", () => {
21
+ assert.throws(() => parseOverlap(-1, 8), /non-negative integer/);
22
+ });
23
+
24
+ test("float overlap throws", () => {
25
+ assert.throws(() => parseOverlap(1.5, 8), /non-negative integer/);
26
+ });
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Timeline analysis overlap parse (issue #2050 leftover).
3
+ *
4
+ * Pure. 0 is allowed. Negative or non-integer throws.
5
+ * When maxBatch > 0, overlap must be less than maxBatch.
6
+ */
7
+ export function parseOverlap(value: unknown, maxBatch: number): number {
8
+ if (typeof value !== "number" || !Number.isFinite(value) || !Number.isInteger(value) || value < 0) {
9
+ throw new RangeError(
10
+ `analysis overlap must be a non-negative integer; got ${JSON.stringify(value)}`,
11
+ );
12
+ }
13
+ if (maxBatch > 0 && value >= maxBatch) {
14
+ throw new RangeError(`analysis overlap must be less than maxBatch; got ${value} >= ${maxBatch}`);
15
+ }
16
+ return value;
17
+ }
@@ -0,0 +1,19 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { countRecapCards } from "./recap-card-count.js";
5
+
6
+ test("empty list is 0", () => {
7
+ assert.equal(countRecapCards([]), 0);
8
+ });
9
+
10
+ test("counts unique ids", () => {
11
+ assert.equal(countRecapCards(["card-a", "card-b", "card-a"]), 2);
12
+ assert.equal(countRecapCards(["card-a", "card-b", "card-c"]), 3);
13
+ });
14
+
15
+ test("drops empty strings and does not mutate", () => {
16
+ const cards = ["card-a", "", "card-b", "", "card-a"];
17
+ assert.equal(countRecapCards(cards), 2);
18
+ assert.deepEqual(cards, ["card-a", "", "card-b", "", "card-a"]);
19
+ });
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Recap card counter (issue #2051 leftover).
3
+ *
4
+ * Unique ids after dropping empty strings. Does not mutate input.
5
+ */
6
+
7
+ export function countRecapCards(cards: readonly string[]): number {
8
+ const unique = new Set<string>();
9
+ for (const id of cards) {
10
+ if (id !== "") unique.add(id);
11
+ }
12
+ return unique.size;
13
+ }
@@ -0,0 +1,21 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { daysBetweenIso } from "./week-span.js";
5
+
6
+ test("seven-day week is [start, end)", () => {
7
+ assert.equal(daysBetweenIso("2026-07-13", "2026-07-20"), 7);
8
+ });
9
+
10
+ test("same day throws", () => {
11
+ assert.throws(() => daysBetweenIso("2026-07-13", "2026-07-13"), /end/);
12
+ });
13
+
14
+ test("inverted range throws", () => {
15
+ assert.throws(() => daysBetweenIso("2026-07-20", "2026-07-13"), /end/);
16
+ });
17
+
18
+ test("invalid date throws", () => {
19
+ assert.throws(() => daysBetweenIso("2026-02-30", "2026-03-02"), /YYYY-MM-DD/);
20
+ assert.throws(() => daysBetweenIso("2026-07-13", "not-a-date"), /YYYY-MM-DD/);
21
+ });
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Half-open day span between two YYYY-MM-DD dates (issue #2052 leftover).
3
+ *
4
+ * Inclusive start, exclusive end. Invalid dates throw. end<=start throws.
5
+ */
6
+ import { isValidActivityDate } from "../digest.js";
7
+
8
+ export function daysBetweenIso(startIso: string, endIso: string): number {
9
+ if (!isValidActivityDate(startIso) || !isValidActivityDate(endIso)) {
10
+ throw new RangeError(`Invalid date; expected YYYY-MM-DD.`);
11
+ }
12
+ const start = Date.parse(`${startIso}T00:00:00Z`);
13
+ const end = Date.parse(`${endIso}T00:00:00Z`);
14
+ if (end <= start) {
15
+ throw new RangeError("end must be after start");
16
+ }
17
+ return (end - start) / 86_400_000;
18
+ }
@@ -543,7 +543,7 @@ test("tools/list: engram.coding_architecture absent when gate off (byte-identica
543
543
  const response = await server.handleRequest({ jsonrpc: "2.0", id: 1, method: "tools/list" });
544
544
  const names = extractToolNames(response);
545
545
  assert.equal(names.has("engram.coding_architecture"), false, "tool must be absent when gate is off");
546
- assert.equal(names.has("remnic.coding_architecture"), false, "alias must be absent when gate is off");
546
+ assert.equal(names.has("remnic_coding_architecture"), false, "alias must be absent when gate is off");
547
547
  });
548
548
 
549
549
  test("tools/list: engram.coding_architecture present when gate on", async () => {
@@ -552,7 +552,7 @@ test("tools/list: engram.coding_architecture present when gate on", async () =>
552
552
  const response = await server.handleRequest({ jsonrpc: "2.0", id: 1, method: "tools/list" });
553
553
  const names = extractToolNames(response);
554
554
  assert.equal(names.has("engram.coding_architecture"), true, "tool must be advertised when gate is on");
555
- assert.equal(names.has("remnic.coding_architecture"), true, "alias must be advertised when gate is on");
555
+ assert.equal(names.has("remnic_coding_architecture"), true, "alias must be advertised when gate is on");
556
556
  });
557
557
 
558
558
  // ──────────────────────────────────────────────────────────────────────────
@@ -277,9 +277,9 @@ test("tools/list gate: all 14 codegraph tools absent when codegraphVisible off (
277
277
  `engram.codegraph_${suffix} must be absent when gate is off`,
278
278
  );
279
279
  assert.equal(
280
- names.has(`remnic.codegraph_${suffix}`),
280
+ names.has(`remnic_codegraph_${suffix}`),
281
281
  false,
282
- `remnic.codegraph_${suffix} must be absent when gate is off`,
282
+ `remnic_codegraph_${suffix} must be absent when gate is off`,
283
283
  );
284
284
  }
285
285
  });
@@ -296,9 +296,9 @@ test("tools/list gate: all 14 codegraph tools present when codegraphVisible on",
296
296
  `engram.codegraph_${suffix} must be present when gate is on`,
297
297
  );
298
298
  assert.equal(
299
- names.has(`remnic.codegraph_${suffix}`),
299
+ names.has(`remnic_codegraph_${suffix}`),
300
300
  true,
301
- `remnic.codegraph_${suffix} alias must be present when gate is on`,
301
+ `remnic_codegraph_${suffix} alias must be present when gate is on`,
302
302
  );
303
303
  }
304
304
  });
@@ -168,7 +168,7 @@ test("tools/list: engram.coding_decision absent when gate off (byte-identical to
168
168
  const tools = (response as { result?: { tools?: Array<{ name: string }> } }).result?.tools ?? [];
169
169
  const names = new Set(tools.map((t) => t.name));
170
170
  assert.equal(names.has("engram.coding_decision"), false, "tool must be absent when gate is off");
171
- assert.equal(names.has("remnic.coding_decision"), false, "alias must be absent when gate is off");
171
+ assert.equal(names.has("remnic_coding_decision"), false, "alias must be absent when gate is off");
172
172
  });
173
173
 
174
174
  // ──────────────────────────────────────────────────────────────────────────
@@ -114,8 +114,8 @@ test("tools/list gate: correction tools absent when correctionVisible off (byte-
114
114
  const names = extractToolNames(response);
115
115
  assert.equal(names.has("engram.memory_correct_plan"), false, "plan tool must be absent when gate off");
116
116
  assert.equal(names.has("engram.memory_correct_apply"), false, "apply tool must be absent when gate off");
117
- assert.equal(names.has("remnic.memory_correct_plan"), false, "plan alias must be absent when gate off");
118
- assert.equal(names.has("remnic.memory_correct_apply"), false, "apply alias must be absent when gate off");
117
+ assert.equal(names.has("remnic_memory_correct_plan"), false, "plan alias must be absent when gate off");
118
+ assert.equal(names.has("remnic_memory_correct_apply"), false, "apply alias must be absent when gate off");
119
119
  });
120
120
 
121
121
  test("tools/list gate: correction tools present when correctionVisible on (default)", async () => {
@@ -126,8 +126,8 @@ test("tools/list gate: correction tools present when correctionVisible on (defau
126
126
  const names = extractToolNames(response);
127
127
  assert.equal(names.has("engram.memory_correct_plan"), true, "plan tool must be present by default");
128
128
  assert.equal(names.has("engram.memory_correct_apply"), true, "apply tool must be present by default");
129
- assert.equal(names.has("remnic.memory_correct_plan"), true, "plan alias must be present");
130
- assert.equal(names.has("remnic.memory_correct_apply"), true, "apply alias must be present");
129
+ assert.equal(names.has("remnic_memory_correct_plan"), true, "plan alias must be present");
130
+ assert.equal(names.has("remnic_memory_correct_apply"), true, "apply alias must be present");
131
131
  });
132
132
 
133
133
  // ---------------------------------------------------------------------------
@@ -0,0 +1,29 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+ import { spanGap } from "./extraction-span-gap.js";
4
+
5
+ test("spanGap: disjoint half-open gap is b.start - a.end", () => {
6
+ assert.equal(spanGap({ start: 0, end: 2 }, { start: 4, end: 6 }), 2);
7
+ assert.equal(spanGap({ start: 0, end: 3 }, { start: 3, end: 5 }), 0);
8
+ assert.equal(spanGap({ start: 4, end: 6 }, { start: 0, end: 2 }), 2);
9
+ });
10
+
11
+ test("spanGap: overlap is 0", () => {
12
+ assert.equal(spanGap({ start: 0, end: 4 }, { start: 2, end: 6 }), 0);
13
+ assert.equal(spanGap({ start: 1, end: 5 }, { start: 2, end: 3 }), 0);
14
+ });
15
+
16
+ test("spanGap: inverted span throws", () => {
17
+ assert.throws(() => spanGap({ start: 3, end: 2 }, { start: 0, end: 1 }), /inverted/i);
18
+ assert.throws(() => spanGap({ start: 0, end: 1 }, { start: 5, end: 4 }), /inverted/i);
19
+ });
20
+
21
+ test("spanGap: non-integers throw", () => {
22
+ assert.throws(() => spanGap({ start: 1.5, end: 3 }, { start: 3, end: 5 }), /integers/);
23
+ assert.throws(() => spanGap({ start: 0, end: 3 }, { start: 3, end: 5.2 }), /integers/);
24
+ assert.throws(
25
+ () => spanGap({ start: Number.NaN, end: 3 }, { start: 3, end: 5 }),
26
+ /integers/,
27
+ );
28
+ });
29
+
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Isolated span-gap helper (issue #2333 leftover).
3
+ *
4
+ * Pure. Extraction wiring waits on the Phase A bench gate.
5
+ */
6
+
7
+ export function spanGap(
8
+ a: { start: number; end: number },
9
+ b: { start: number; end: number },
10
+ ): number {
11
+ if (
12
+ !Number.isInteger(a.start) ||
13
+ !Number.isInteger(a.end) ||
14
+ !Number.isInteger(b.start) ||
15
+ !Number.isInteger(b.end)
16
+ ) {
17
+ throw new TypeError("span offsets must be integers");
18
+ }
19
+ if (a.end < a.start || b.end < b.start) {
20
+ throw new RangeError("span offsets inverted");
21
+ }
22
+ if (a.end <= b.start) return b.start - a.end;
23
+ if (b.end <= a.start) return a.start - b.end;
24
+ return 0;
25
+ }
@@ -7,7 +7,7 @@ import type { RetrievedMemoryProvenance } from "./memory-provenance.js";
7
7
  export const REMNIC_CHATGPT_MEMORY_INSPECTOR_TOOL =
8
8
  "engram.chatgpt_memory_inspector" as const;
9
9
  export const REMNIC_CHATGPT_MEMORY_INSPECTOR_CANONICAL_TOOL =
10
- "remnic.chatgpt_memory_inspector" as const;
10
+ "remnic_chatgpt_memory_inspector" as const;
11
11
  export const REMNIC_CHATGPT_MEMORY_INSPECTOR_WIDGET_URI =
12
12
  "ui://remnic/memory-inspector.v1.html" as const;
13
13
  export const REMNIC_CHATGPT_MEMORY_INSPECTOR_MIME_TYPE =
@@ -42,10 +42,10 @@ test("support passport MCP tools are hidden until the feature is enabled", async
42
42
  false
43
43
  );
44
44
  assert.equal(enabledNames.filter((name) => name.includes("support_passport")).length, 22);
45
- assert.ok(enabledNames.includes("remnic.support_passport_memory_preview"));
46
- assert.ok(enabledNames.includes("remnic.support_passport_cards_list"));
45
+ assert.ok(enabledNames.includes("remnic_support_passport_memory_preview"));
46
+ assert.ok(enabledNames.includes("remnic_support_passport_cards_list"));
47
47
  assert.ok(enabledNames.includes("engram.support_passport_grant_revoke"));
48
- for (const name of ["remnic.support_passport_memory_preview", "engram.support_passport_memory_preview"]) {
48
+ for (const name of ["remnic_support_passport_memory_preview", "engram.support_passport_memory_preview"]) {
49
49
  assert.equal(enabledTools.find((tool) => tool.name === name)?.annotations?.readOnlyHint, true);
50
50
  }
51
51
  });