@remnic/core 9.54.5 → 9.54.7

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 (548) hide show
  1. package/dist/access-admin-ops-surface.d.ts +24 -24
  2. package/dist/access-admin-ops-surface.js +32 -29
  3. package/dist/access-authorization-probe.d.ts +25 -23
  4. package/dist/access-authorization-probe.js +35 -30
  5. package/dist/access-boundary.d.ts +26 -24
  6. package/dist/access-boundary.js +36 -31
  7. package/dist/access-cli.js +86 -80
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +19 -19
  11. package/dist/access-extraction-force-flush.js +32 -29
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +22 -22
  14. package/dist/access-http-lifecycle-flush.d.ts +22 -22
  15. package/dist/access-http-offline-stream.d.ts +18 -18
  16. package/dist/access-http-query.js +32 -29
  17. package/dist/access-http.d.ts +55 -37
  18. package/dist/access-http.js +52 -43
  19. package/dist/access-identity-continuity-surface.d.ts +9 -9
  20. package/dist/access-identity-continuity-surface.js +32 -29
  21. package/dist/access-lcm-surface.d.ts +21 -21
  22. package/dist/access-lcm-surface.js +32 -29
  23. package/dist/access-mcp.d.ts +22 -22
  24. package/dist/access-mcp.js +40 -36
  25. package/dist/access-memory-search-fanout.d.ts +2 -2
  26. package/dist/{access-namespace-preflight-BdHlGd_T.d.ts → access-namespace-preflight-CCNn_6NE.d.ts} +1 -1
  27. package/dist/access-namespace-preflight.d.ts +3 -3
  28. package/dist/access-namespace-preflight.js +32 -29
  29. package/dist/access-observe-write-surface.d.ts +22 -22
  30. package/dist/access-observe-write-surface.js +32 -29
  31. package/dist/access-offline-manifest.d.ts +9 -9
  32. package/dist/access-offline-manifest.js +2 -2
  33. package/dist/access-operations-batch.js +34 -31
  34. package/dist/access-operations.d.ts +23 -23
  35. package/dist/access-operations.js +38 -34
  36. package/dist/access-recall-concurrency.d.ts +21 -21
  37. package/dist/access-recall-concurrency.js +32 -29
  38. package/dist/access-recall-response.d.ts +19 -19
  39. package/dist/access-recall-response.js +32 -29
  40. package/dist/access-recall-surface.d.ts +19 -19
  41. package/dist/access-recall-surface.js +32 -29
  42. package/dist/access-schema.js +3 -3
  43. package/dist/{access-service-DL7X9hrg.d.ts → access-service-DK82xdNi.d.ts} +1314 -83
  44. package/dist/access-service-helpers.d.ts +22 -22
  45. package/dist/access-service.d.ts +31 -31
  46. package/dist/access-service.js +32 -29
  47. package/dist/access-surface-catalog.d.ts +22 -22
  48. package/dist/access-surface-catalog.js +209 -2
  49. package/dist/access-surface-catalog.js.map +1 -1
  50. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  51. package/dist/action-confidence.d.ts +1 -1
  52. package/dist/active-memory-bridge.d.ts +6 -5
  53. package/dist/active-memory-bridge.js +2 -2
  54. package/dist/active-recall.d.ts +1 -1
  55. package/dist/active-recall.js +2 -1
  56. package/dist/active-recall.js.map +1 -1
  57. package/dist/adapters/index.js +4 -4
  58. package/dist/adapters/registry.js +2 -2
  59. package/dist/admin-console/public/what-helps-me/app.js +1594 -0
  60. package/dist/admin-console/public/what-helps-me/index.html +339 -0
  61. package/dist/admin-console/public/what-helps-me/model.js +685 -0
  62. package/dist/admin-console/public/what-helps-me/what-helps-me.css +1296 -0
  63. package/dist/ambient-provenance.d.ts +1 -1
  64. package/dist/artifact-search.d.ts +1 -1
  65. package/dist/{auto-sync-TDHLZPVP.js → auto-sync-NR3GPCOA.js} +4 -4
  66. package/dist/behavior-learner.d.ts +1 -1
  67. package/dist/behavior-signals.d.ts +1 -1
  68. package/dist/bootstrap.d.ts +9 -9
  69. package/dist/briefing.d.ts +2 -2
  70. package/dist/briefing.js +14 -14
  71. package/dist/buffer-surprise-report.d.ts +1 -1
  72. package/dist/buffer-turn-helpers.d.ts +1 -1
  73. package/dist/buffer.d.ts +2 -2
  74. package/dist/buffer.js +2 -2
  75. package/dist/bulk-import/index.d.ts +3 -3
  76. package/dist/calibration.d.ts +1 -1
  77. package/dist/calibration.js +1 -1
  78. package/dist/capabilities.d.ts +1 -1
  79. package/dist/{catalog-B90is4d8.d.ts → catalog-DGFf8mD9.d.ts} +1 -1
  80. package/dist/causal-behavior.d.ts +1 -1
  81. package/dist/causal-consolidation.d.ts +1 -1
  82. package/dist/causal-consolidation.js +15 -15
  83. package/dist/causal-trajectory-graph.d.ts +1 -1
  84. package/dist/{chunk-CSY44OKU.js → chunk-26ZXBTYN.js} +4 -4
  85. package/dist/chunk-26ZXBTYN.js.map +1 -0
  86. package/dist/{chunk-LLJMAULE.js → chunk-2FKEIPIT.js} +5 -5
  87. package/dist/{chunk-AU7Q3LSC.js → chunk-2QSZNTDO.js} +4 -4
  88. package/dist/chunk-37DZZFFM.js +502 -0
  89. package/dist/chunk-37DZZFFM.js.map +1 -0
  90. package/dist/chunk-3HSRWJTC.js +9 -0
  91. package/dist/chunk-3HSRWJTC.js.map +1 -0
  92. package/dist/{chunk-TKFGFDPJ.js → chunk-3TIZPSJC.js} +4 -4
  93. package/dist/{chunk-B4T3FQMT.js → chunk-43SEBY2M.js} +1 -1
  94. package/dist/{chunk-LVKYLMSM.js → chunk-46SZBVDS.js} +2 -2
  95. package/dist/{chunk-YKZLOPTC.js → chunk-5FD7JMTX.js} +2 -2
  96. package/dist/{chunk-2PNXOQ4P.js → chunk-5NB726GV.js} +3 -7
  97. package/dist/chunk-5NB726GV.js.map +1 -0
  98. package/dist/chunk-62OKGIJA.js +39 -0
  99. package/dist/chunk-62OKGIJA.js.map +1 -0
  100. package/dist/{chunk-WM5LD6AT.js → chunk-6CYHUWCO.js} +2 -2
  101. package/dist/{chunk-BIF4SHMD.js → chunk-76JJSXK7.js} +1 -1
  102. package/dist/chunk-76JJSXK7.js.map +1 -0
  103. package/dist/{chunk-3SXLD5T3.js → chunk-7BD6O7ZV.js} +189 -4
  104. package/dist/chunk-7BD6O7ZV.js.map +1 -0
  105. package/dist/chunk-7TBXNYLO.js +346 -0
  106. package/dist/chunk-7TBXNYLO.js.map +1 -0
  107. package/dist/{chunk-YR65W7BV.js → chunk-BRR5EUTF.js} +3 -3
  108. package/dist/{chunk-JKW663ZN.js → chunk-CIAI24TQ.js} +2 -2
  109. package/dist/{chunk-3WGI7F4V.js → chunk-D3LBIUWV.js} +9219 -5233
  110. package/dist/chunk-D3LBIUWV.js.map +1 -0
  111. package/dist/{chunk-YDWPYDML.js → chunk-EKTP7MNS.js} +4 -4
  112. package/dist/{chunk-6LEIWWAF.js → chunk-F2JRDPON.js} +2 -2
  113. package/dist/{chunk-VYQ4URQB.js → chunk-FFRTNF3L.js} +2 -2
  114. package/dist/{chunk-TY6MKIWP.js → chunk-FONWBCVY.js} +3 -3
  115. package/dist/{chunk-XSV2YDCJ.js → chunk-FPLM2TKD.js} +2 -2
  116. package/dist/{chunk-VTU5IEKY.js → chunk-FTPONF6B.js} +2 -2
  117. package/dist/{chunk-6PZGKGAO.js → chunk-FWX7W5PM.js} +2 -2
  118. package/dist/{chunk-QPW3PAIH.js → chunk-G6DFSS6A.js} +2 -2
  119. package/dist/{chunk-2DD6ZHOM.js → chunk-GJ776BC2.js} +3 -3
  120. package/dist/{chunk-XKAR4RF6.js → chunk-GN3WRFJY.js} +6 -6
  121. package/dist/{chunk-RG426DJO.js → chunk-H7NAZ3UB.js} +2 -2
  122. package/dist/{chunk-BSXGTDVJ.js → chunk-HBUFQRIM.js} +2 -2
  123. package/dist/{chunk-FFEBSFVT.js → chunk-HGJ6NJ4E.js} +2 -2
  124. package/dist/{chunk-WB7JSQCP.js → chunk-HIEWDJ2O.js} +5 -2
  125. package/dist/{chunk-WB7JSQCP.js.map → chunk-HIEWDJ2O.js.map} +1 -1
  126. package/dist/{chunk-QTO6BMQZ.js → chunk-I3MSGFGD.js} +17 -6
  127. package/dist/chunk-I3MSGFGD.js.map +1 -0
  128. package/dist/{chunk-5JKUSBMX.js → chunk-IKP5OYQQ.js} +2 -2
  129. package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
  130. package/dist/{chunk-DBY26JJJ.js → chunk-IQ4NVWEF.js} +2 -2
  131. package/dist/{chunk-7Q7JWLQ4.js → chunk-JYG4OLWH.js} +2 -2
  132. package/dist/{chunk-3OTSVCPK.js → chunk-K26NWEOC.js} +4 -4
  133. package/dist/{chunk-WZWZRZ2V.js → chunk-K2UGPTYY.js} +484 -43
  134. package/dist/chunk-K2UGPTYY.js.map +1 -0
  135. package/dist/{chunk-L6CQ7WIW.js → chunk-KFBOPMF6.js} +11 -11
  136. package/dist/chunk-KFBOPMF6.js.map +1 -0
  137. package/dist/{chunk-HOIRB77A.js → chunk-L6Z5OAS4.js} +2 -2
  138. package/dist/{chunk-7RZJWZ46.js → chunk-LEPOP46W.js} +5 -5
  139. package/dist/{chunk-QQXWFDRD.js → chunk-M4YHAODQ.js} +270 -684
  140. package/dist/chunk-M4YHAODQ.js.map +1 -0
  141. package/dist/{chunk-NGT35IGQ.js → chunk-MIH3CJPN.js} +3 -3
  142. package/dist/{chunk-QPAQSG3F.js → chunk-MK5VEWCR.js} +2 -2
  143. package/dist/chunk-NISZQW72.js +140 -0
  144. package/dist/chunk-NISZQW72.js.map +1 -0
  145. package/dist/{chunk-L7RTUEDG.js → chunk-OCIP6YMD.js} +2 -2
  146. package/dist/{chunk-2INWPC6E.js → chunk-PG4QBPVG.js} +20 -10
  147. package/dist/chunk-PG4QBPVG.js.map +1 -0
  148. package/dist/{chunk-DDA55IVB.js → chunk-PT54WISF.js} +189 -55
  149. package/dist/chunk-PT54WISF.js.map +1 -0
  150. package/dist/{chunk-UWJNKGBA.js → chunk-QZLDRQ4I.js} +5 -5
  151. package/dist/{chunk-UYOXFFEY.js → chunk-RUNORG2P.js} +3 -3
  152. package/dist/{chunk-LC3FD4BV.js → chunk-RZQ6W2W4.js} +39 -39
  153. package/dist/{chunk-MRGJZ75M.js → chunk-SMNYAMJD.js} +3 -3
  154. package/dist/{chunk-MKQBXQKU.js → chunk-TB6CBZ5V.js} +22 -15
  155. package/dist/chunk-TB6CBZ5V.js.map +1 -0
  156. package/dist/{chunk-DN2IDKI5.js → chunk-TO7ZTWJW.js} +2 -2
  157. package/dist/{chunk-K2TDK7GG.js → chunk-TWTUGCTY.js} +2 -2
  158. package/dist/{chunk-CUTFSLSD.js → chunk-UCTS3DDH.js} +2 -2
  159. package/dist/{chunk-JYIJNNN3.js → chunk-UG6VXIOK.js} +2 -2
  160. package/dist/{chunk-QOQQMVR2.js → chunk-UKYS3NU5.js} +2 -2
  161. package/dist/{chunk-VZRFGJCH.js → chunk-UPLZNJKN.js} +2 -2
  162. package/dist/{chunk-C23BYTJV.js → chunk-UW5NPZJ2.js} +40 -12
  163. package/dist/chunk-UW5NPZJ2.js.map +1 -0
  164. package/dist/{chunk-DOOWFDWN.js → chunk-V6ERBR7U.js} +2 -2
  165. package/dist/{chunk-7HG7MGAP.js → chunk-W5ZKPI34.js} +462 -2673
  166. package/dist/chunk-W5ZKPI34.js.map +1 -0
  167. package/dist/{chunk-HNDIND7P.js → chunk-XX4HPFFM.js} +54 -15
  168. package/dist/chunk-XX4HPFFM.js.map +1 -0
  169. package/dist/{chunk-N7CXQ5TA.js → chunk-XZHE2DEN.js} +1 -1
  170. package/dist/chunk-YXQEKCZM.js +223 -0
  171. package/dist/chunk-YXQEKCZM.js.map +1 -0
  172. package/dist/{chunk-6NNNURLK.js → chunk-Z54EM5YZ.js} +4 -4
  173. package/dist/{chunk-F2Y6I74C.js → chunk-ZRZVLB7O.js} +2 -2
  174. package/dist/{chunk-CLKBV3Z3.js → chunk-ZUKIUXHQ.js} +9 -9
  175. package/dist/{cli-jfuZXixq.d.ts → cli-BPDUXnAl.d.ts} +5 -5
  176. package/dist/cli.d.ts +22 -22
  177. package/dist/cli.js +66 -58
  178. package/dist/coding/pre-action-gate.d.ts +1 -1
  179. package/dist/compounding/engine.d.ts +2 -2
  180. package/dist/compounding/engine.js +14 -14
  181. package/dist/compounding/preference-consolidator.d.ts +1 -1
  182. package/dist/compression-optimizer.d.ts +1 -1
  183. package/dist/config.d.ts +1 -1
  184. package/dist/config.js +2 -1
  185. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  186. package/dist/connectors/codex-materialize-runner.js +14 -14
  187. package/dist/connectors/codex-materialize.d.ts +1 -1
  188. package/dist/connectors/index.d.ts +1 -1
  189. package/dist/connectors/index.js +14 -14
  190. package/dist/consolidation-provenance-check.d.ts +2 -2
  191. package/dist/consolidation-undo.d.ts +2 -2
  192. package/dist/contradiction/index.d.ts +2 -2
  193. package/dist/contradiction/index.js +2 -2
  194. package/dist/{contradiction-scan-KCADHXPE.js → contradiction-scan-JDTBXRGW.js} +3 -3
  195. package/dist/converge-config.d.ts +1 -1
  196. package/dist/convergence-refresh.d.ts +2 -2
  197. package/dist/convergence-refresh.js +16 -16
  198. package/dist/conversation-index/backend.d.ts +1 -1
  199. package/dist/conversation-index/backend.js +2 -2
  200. package/dist/conversation-index/chunker.d.ts +1 -1
  201. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  202. package/dist/conversation-index/indexer.d.ts +1 -1
  203. package/dist/conversation-index/search.d.ts +1 -1
  204. package/dist/corpus-watermark.d.ts +1 -1
  205. package/dist/corpus-watermark.js +16 -16
  206. package/dist/day-summary.d.ts +1 -1
  207. package/dist/delinearize.d.ts +1 -1
  208. package/dist/dependency-propagation-config.d.ts +1 -1
  209. package/dist/{dependency-propagation-delivery-CTDuAVJc.d.ts → dependency-propagation-delivery-CzEfB31P.d.ts} +1 -1
  210. package/dist/direct-answer-wiring.d.ts +1 -1
  211. package/dist/direct-answer.d.ts +1 -1
  212. package/dist/embedding-fallback.d.ts +1 -1
  213. package/dist/enrichment/index.d.ts +1 -1
  214. package/dist/entity-retrieval.d.ts +2 -2
  215. package/dist/entity-retrieval.js +14 -14
  216. package/dist/entity-schema.d.ts +1 -1
  217. package/dist/explicit-capture.d.ts +9 -9
  218. package/dist/explicit-capture.js +4 -3
  219. package/dist/external-wiki-access.d.ts +22 -22
  220. package/dist/external-wiki-access.js +33 -30
  221. package/dist/external-wiki-collection-registration.d.ts +1 -1
  222. package/dist/external-wiki-collection.d.ts +1 -1
  223. package/dist/external-wiki-mcp-tools.d.ts +22 -22
  224. package/dist/extraction-error-classification.d.ts +1 -1
  225. package/dist/extraction-faithfulness.d.ts +1 -1
  226. package/dist/extraction-faithfulness.js +2 -2
  227. package/dist/extraction-judge-telemetry.d.ts +1 -1
  228. package/dist/extraction-judge-training.d.ts +1 -1
  229. package/dist/extraction-judge.d.ts +1 -1
  230. package/dist/extraction-judge.js +2 -2
  231. package/dist/extraction-liveness.d.ts +1 -1
  232. package/dist/extraction-normalization.d.ts +1 -1
  233. package/dist/extraction-prompt.d.ts +1 -1
  234. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  235. package/dist/extraction-source-grounding.d.ts +1 -1
  236. package/dist/extraction.d.ts +1 -1
  237. package/dist/extraction.js +20 -20
  238. package/dist/fallback-llm.d.ts +14 -1
  239. package/dist/fallback-llm.js +1 -1
  240. package/dist/{first-start-migration-LMMZFLKK.js → first-start-migration-CRZCZAJN.js} +5 -5
  241. package/dist/graph-dashboard-diff.d.ts +1 -1
  242. package/dist/graph-dashboard-key.d.ts +1 -1
  243. package/dist/graph-dashboard-parser.d.ts +1 -1
  244. package/dist/graph-edge-reinforcement.d.ts +1 -1
  245. package/dist/graph-path-reconstruction.d.ts +1 -1
  246. package/dist/graph-path-scoring.d.ts +1 -1
  247. package/dist/graph-snapshot.d.ts +1 -1
  248. package/dist/graph.d.ts +1 -1
  249. package/dist/harmonic-retrieval.js +1 -1
  250. package/dist/importance.d.ts +1 -1
  251. package/dist/importers/index.d.ts +1 -1
  252. package/dist/in-flight-reads.d.ts +1 -1
  253. package/dist/index.d.ts +30 -747
  254. package/dist/index.js +203 -118
  255. package/dist/inline-script.d.ts +3 -0
  256. package/dist/inline-script.js +8 -0
  257. package/dist/inline-script.js.map +1 -0
  258. package/dist/intent.d.ts +1 -1
  259. package/dist/lcm/engine.d.ts +1 -1
  260. package/dist/lcm/engine.js +2 -2
  261. package/dist/lcm/index.d.ts +1 -1
  262. package/dist/lcm/index.js +2 -2
  263. package/dist/lcm/tools.d.ts +1 -1
  264. package/dist/lifecycle.d.ts +1 -1
  265. package/dist/live-connectors-runner.d.ts +1 -1
  266. package/dist/local-llm.d.ts +2 -1
  267. package/dist/local-llm.js +2 -2
  268. package/dist/local-model-endpoint.d.ts +1 -1
  269. package/dist/maintenance/memory-governance.d.ts +1 -1
  270. package/dist/maintenance/memory-governance.js +14 -14
  271. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  272. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -14
  273. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  274. package/dist/maintenance/rebuild-memory-projection.js +15 -15
  275. package/dist/{maintenance-heMZSq7G.d.ts → maintenance-C8aRWfhq.d.ts} +3 -3
  276. package/dist/mcp-memory-inspector-app.d.ts +22 -22
  277. package/dist/mcp-read-only-tools.js +1 -1
  278. package/dist/memory-action-policy.d.ts +1 -1
  279. package/dist/memory-cache.d.ts +1 -1
  280. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  281. package/dist/memory-projection-store.d.ts +1 -1
  282. package/dist/memory-provenance.d.ts +1 -1
  283. package/dist/memory-snapshot.d.ts +1 -1
  284. package/dist/memory-worth-outcomes.d.ts +2 -2
  285. package/dist/models-json.d.ts +1 -1
  286. package/dist/namespaces/migrate.d.ts +3 -3
  287. package/dist/namespaces/migrate.js +15 -15
  288. package/dist/namespaces/principal.d.ts +1 -1
  289. package/dist/namespaces/search.d.ts +1 -1
  290. package/dist/namespaces/search.js +6 -6
  291. package/dist/namespaces/storage.d.ts +3 -3
  292. package/dist/namespaces/storage.js +14 -14
  293. package/dist/native-knowledge.d.ts +1 -1
  294. package/dist/offline-sync-impression-drain.d.ts +1 -1
  295. package/dist/operator-doctor-corpus.d.ts +1 -1
  296. package/dist/operator-doctor-corpus.js +17 -17
  297. package/dist/operator-doctor-replica.d.ts +1 -1
  298. package/dist/operator-toolkit.d.ts +3 -3
  299. package/dist/operator-toolkit.js +23 -22
  300. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  301. package/dist/orchestration/maintenance.d.ts +4 -4
  302. package/dist/orchestration/maintenance.js +19 -19
  303. package/dist/{orchestrator-BQQPsSjs.d.ts → orchestrator-D85CzDDY.d.ts} +8 -8
  304. package/dist/orchestrator.d.ts +9 -9
  305. package/dist/orchestrator.js +86 -80
  306. package/dist/patterns-cli.d.ts +1 -1
  307. package/dist/{pipeline-DFfmsnGk.d.ts → pipeline-DPcUifCO.d.ts} +1 -1
  308. package/dist/policy-runtime.d.ts +1 -1
  309. package/dist/proactive-contention.d.ts +1 -1
  310. package/dist/provenance.d.ts +1 -1
  311. package/dist/public-http-D3GBeII4.d.ts +25 -0
  312. package/dist/{qmd-BF5bcVRs.d.ts → qmd-dFCHp1r0.d.ts} +1 -1
  313. package/dist/qmd-preflight.d.ts +2 -2
  314. package/dist/qmd-recall-cache.d.ts +1 -1
  315. package/dist/qmd.d.ts +2 -2
  316. package/dist/recall-concurrency-config.d.ts +1 -1
  317. package/dist/recall-disclosure-escalation.d.ts +1 -1
  318. package/dist/recall-explain-renderer.d.ts +1 -1
  319. package/dist/recall-explain-renderer.js +3 -3
  320. package/dist/recall-memory-map.d.ts +1 -1
  321. package/dist/recall-planner-llm.d.ts +1 -1
  322. package/dist/recall-planner-llm.js +1 -1
  323. package/dist/recall-state.d.ts +1 -1
  324. package/dist/recall-tag-filter.d.ts +1 -1
  325. package/dist/recall-timings.d.ts +1 -1
  326. package/dist/recall-xray-cli.d.ts +1 -1
  327. package/dist/recall-xray-cli.js +4 -4
  328. package/dist/recall-xray-renderer.d.ts +1 -1
  329. package/dist/recall-xray-renderer.js +3 -3
  330. package/dist/recall-xray.d.ts +1 -1
  331. package/dist/recall-xray.js +2 -2
  332. package/dist/reconcile/cursor.d.ts +1 -1
  333. package/dist/reconcile/manifest.d.ts +1 -1
  334. package/dist/reconcile/plan.d.ts +1 -1
  335. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  336. package/dist/replay/normalizers/claude.d.ts +1 -1
  337. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  338. package/dist/replay/normalizers/shared.d.ts +1 -1
  339. package/dist/replay/runner.d.ts +1 -1
  340. package/dist/replay/types.d.ts +1 -1
  341. package/dist/replica-divergence.d.ts +1 -1
  342. package/dist/replica-peers-config.d.ts +1 -1
  343. package/dist/resolve-auth-token.d.ts +1 -1
  344. package/dist/resume-bundles.js +3 -2
  345. package/dist/retrieval-agents.d.ts +2 -2
  346. package/dist/retrieval-tiers.d.ts +1 -1
  347. package/dist/routing/engine.d.ts +1 -1
  348. package/dist/routing/store.d.ts +1 -1
  349. package/dist/salvage-envelope.d.ts +1 -1
  350. package/dist/{scope-profiles-CbUOsE_E.d.ts → scope-profiles-DICK7GtN.d.ts} +1 -1
  351. package/dist/search/embed-helper.d.ts +1 -1
  352. package/dist/search/factory.d.ts +1 -1
  353. package/dist/search/factory.js +5 -5
  354. package/dist/search/index.d.ts +1 -1
  355. package/dist/search/index.js +9 -9
  356. package/dist/search/lancedb-backend.d.ts +1 -1
  357. package/dist/search/meilisearch-backend.d.ts +1 -1
  358. package/dist/search/noop-backend.d.ts +1 -1
  359. package/dist/search/orama-backend.d.ts +1 -1
  360. package/dist/search/port.d.ts +1 -1
  361. package/dist/search/remote-backend.d.ts +1 -1
  362. package/dist/{semantic-consolidation-DAB3xdKM.d.ts → semantic-consolidation-BP7NAX0N.d.ts} +1 -1
  363. package/dist/semantic-consolidation.d.ts +2 -2
  364. package/dist/semantic-consolidation.js +15 -15
  365. package/dist/semantic-rule-promotion.js +14 -14
  366. package/dist/semantic-rule-verifier.d.ts +1 -1
  367. package/dist/semantic-rule-verifier.js +14 -14
  368. package/dist/{service-DGKg2O6r.d.ts → service-DT-pJyda.d.ts} +660 -660
  369. package/dist/session-observer-bands.d.ts +1 -1
  370. package/dist/session-observer-state.d.ts +1 -1
  371. package/dist/shared-context/manager.d.ts +1 -1
  372. package/dist/signal.d.ts +1 -1
  373. package/dist/source-agent-qualifier.d.ts +1 -1
  374. package/dist/source-agent-qualifier.js +16 -16
  375. package/dist/{storage-CC1jKcWg.d.ts → storage-qOnaJ1Lw.d.ts} +4 -1
  376. package/dist/storage.d.ts +2 -2
  377. package/dist/storage.js +13 -13
  378. package/dist/summarizer.d.ts +1 -1
  379. package/dist/summarizer.js +5 -5
  380. package/dist/summary-snapshot.d.ts +1 -1
  381. package/dist/support-passport/index.d.ts +518 -0
  382. package/dist/support-passport/index.js +357 -0
  383. package/dist/support-passport/index.js.map +1 -0
  384. package/dist/temporal-supersession.d.ts +2 -2
  385. package/dist/temporal-timeline-recall.d.ts +1 -1
  386. package/dist/temporal-validity.d.ts +1 -1
  387. package/dist/threading.d.ts +1 -1
  388. package/dist/tier-migration.d.ts +2 -2
  389. package/dist/tier-routing.d.ts +1 -1
  390. package/dist/tier-routing.js +2 -2
  391. package/dist/{tier-stats-JDN6HRNT.js → tier-stats-EXYSKSVN.js} +3 -3
  392. package/dist/topics.d.ts +1 -1
  393. package/dist/transcript.d.ts +1 -1
  394. package/dist/transfer/autodetect.js +1 -1
  395. package/dist/transfer/backup.js +1 -1
  396. package/dist/transfer/capsule-export.js +2 -2
  397. package/dist/transfer/types.d.ts +24 -24
  398. package/dist/trust-score-stage.d.ts +1 -1
  399. package/dist/trust-score.d.ts +1 -1
  400. package/dist/{types-BnQza1y8.d.ts → types-ed-SvS2t.d.ts} +7 -1
  401. package/dist/types.d.ts +1 -1
  402. package/dist/types.js +1 -1
  403. package/dist/utility-runtime.d.ts +1 -1
  404. package/dist/verified-recall.js +14 -14
  405. package/dist/write-envelope.d.ts +1 -1
  406. package/dist/write-rate-limiter.d.ts +11 -5
  407. package/dist/write-rate-limiter.js +1 -1
  408. package/package.json +12 -2
  409. package/scripts/build-with-heap.mjs +11 -1
  410. package/src/access-authorization-probe.ts +20 -2
  411. package/src/access-boundary.ts +32 -0
  412. package/src/access-http.test.ts +1940 -643
  413. package/src/access-http.ts +81 -74
  414. package/src/access-mcp.ts +3 -1
  415. package/src/access-operations.ts +2 -0
  416. package/src/access-service.ts +612 -845
  417. package/src/access-surface-catalog.test.ts +40 -10
  418. package/src/access-surface-catalog.ts +15 -0
  419. package/src/active-memory-bridge.ts +17 -19
  420. package/src/config.ts +18 -9
  421. package/src/fallback-llm.test.ts +54 -0
  422. package/src/fallback-llm.ts +54 -9
  423. package/src/inline-script.ts +6 -0
  424. package/src/local-llm-headers-timeout.test.ts +42 -0
  425. package/src/local-llm.ts +8 -8
  426. package/src/mcp-read-only-tools.ts +3 -0
  427. package/src/relay/mission-access.test.ts +11 -11
  428. package/src/relay/mission-ui.test.ts +3 -1
  429. package/src/storage/tombstone-blocked-capture-sync.ts +31 -0
  430. package/src/storage-contract/failure-semantics.test.ts +102 -0
  431. package/src/support-passport/access-http-base.ts +143 -0
  432. package/src/support-passport/access-http.ts +172 -0
  433. package/src/support-passport/access-operations.ts +272 -0
  434. package/src/support-passport/access-service-base.test.ts +193 -0
  435. package/src/support-passport/access-service-base.ts +176 -0
  436. package/src/support-passport/access-surface.test.ts +283 -0
  437. package/src/support-passport/access-surface.ts +286 -0
  438. package/src/support-passport/card-projection.test.ts +8 -0
  439. package/src/support-passport/card-projection.ts +77 -16
  440. package/src/support-passport/card-replacement.ts +126 -0
  441. package/src/support-passport/card-service-commit-forwarding.test.ts +160 -0
  442. package/src/support-passport/card-service.test.ts +533 -31
  443. package/src/support-passport/card-service.ts +506 -364
  444. package/src/support-passport/card-state.ts +158 -0
  445. package/src/support-passport/config-model-routing.test.ts +37 -0
  446. package/src/support-passport/config.test.ts +34 -0
  447. package/src/support-passport/config.ts +41 -0
  448. package/src/support-passport/contracts.test.ts +15 -2
  449. package/src/support-passport/contracts.ts +13 -0
  450. package/src/support-passport/errors.ts +6 -0
  451. package/src/support-passport/generated-batch.test.ts +185 -0
  452. package/src/support-passport/generated-batch.ts +338 -0
  453. package/src/support-passport/grant-contracts.ts +45 -1
  454. package/src/support-passport/grant-generated-batch-scope.test.ts +201 -0
  455. package/src/support-passport/grant-service-cache.test.ts +2 -2
  456. package/src/support-passport/grant-service-cancellation.test.ts +2 -0
  457. package/src/support-passport/grant-service-marker-cache.test.ts +62 -0
  458. package/src/support-passport/grant-service.test.ts +853 -239
  459. package/src/support-passport/grant-service.ts +206 -57
  460. package/src/support-passport/grant-store.ts +7 -3
  461. package/src/support-passport/index.ts +10 -0
  462. package/src/support-passport/mcp-tools.test.ts +222 -0
  463. package/src/support-passport/mcp-tools.ts +187 -0
  464. package/src/support-passport/model-adapter.test.ts +840 -0
  465. package/src/support-passport/model-adapter.ts +602 -0
  466. package/src/support-passport/model-audit-pinned-write.test.ts +59 -0
  467. package/src/support-passport/model-audit.ts +152 -0
  468. package/src/support-passport/model-bridge.test.ts +456 -0
  469. package/src/support-passport/model-bridge.ts +439 -0
  470. package/src/support-passport/model-contracts.ts +124 -0
  471. package/src/support-passport/model-service.test.ts +1731 -0
  472. package/src/support-passport/model-service.ts +399 -0
  473. package/src/support-passport/owner-http.test.ts +671 -0
  474. package/src/support-passport/owner-lock.ts +26 -9
  475. package/src/support-passport/private-file.test.ts +99 -0
  476. package/src/support-passport/private-file.ts +139 -12
  477. package/src/support-passport/public-http.test.ts +476 -0
  478. package/src/support-passport/public-http.ts +601 -0
  479. package/src/support-passport/ui.test.ts +181 -0
  480. package/src/types.ts +7 -0
  481. package/src/write-rate-limiter.test.ts +30 -6
  482. package/src/write-rate-limiter.ts +29 -18
  483. package/dist/chunk-2INWPC6E.js.map +0 -1
  484. package/dist/chunk-2PNXOQ4P.js.map +0 -1
  485. package/dist/chunk-3SXLD5T3.js.map +0 -1
  486. package/dist/chunk-3WGI7F4V.js.map +0 -1
  487. package/dist/chunk-7HG7MGAP.js.map +0 -1
  488. package/dist/chunk-BIF4SHMD.js.map +0 -1
  489. package/dist/chunk-C23BYTJV.js.map +0 -1
  490. package/dist/chunk-CSY44OKU.js.map +0 -1
  491. package/dist/chunk-DDA55IVB.js.map +0 -1
  492. package/dist/chunk-HNDIND7P.js.map +0 -1
  493. package/dist/chunk-L6CQ7WIW.js.map +0 -1
  494. package/dist/chunk-MKQBXQKU.js.map +0 -1
  495. package/dist/chunk-QQXWFDRD.js.map +0 -1
  496. package/dist/chunk-QTO6BMQZ.js.map +0 -1
  497. package/dist/chunk-WZWZRZ2V.js.map +0 -1
  498. /package/dist/{auto-sync-TDHLZPVP.js.map → auto-sync-NR3GPCOA.js.map} +0 -0
  499. /package/dist/{chunk-LLJMAULE.js.map → chunk-2FKEIPIT.js.map} +0 -0
  500. /package/dist/{chunk-AU7Q3LSC.js.map → chunk-2QSZNTDO.js.map} +0 -0
  501. /package/dist/{chunk-TKFGFDPJ.js.map → chunk-3TIZPSJC.js.map} +0 -0
  502. /package/dist/{chunk-B4T3FQMT.js.map → chunk-43SEBY2M.js.map} +0 -0
  503. /package/dist/{chunk-LVKYLMSM.js.map → chunk-46SZBVDS.js.map} +0 -0
  504. /package/dist/{chunk-YKZLOPTC.js.map → chunk-5FD7JMTX.js.map} +0 -0
  505. /package/dist/{chunk-WM5LD6AT.js.map → chunk-6CYHUWCO.js.map} +0 -0
  506. /package/dist/{chunk-YR65W7BV.js.map → chunk-BRR5EUTF.js.map} +0 -0
  507. /package/dist/{chunk-JKW663ZN.js.map → chunk-CIAI24TQ.js.map} +0 -0
  508. /package/dist/{chunk-YDWPYDML.js.map → chunk-EKTP7MNS.js.map} +0 -0
  509. /package/dist/{chunk-6LEIWWAF.js.map → chunk-F2JRDPON.js.map} +0 -0
  510. /package/dist/{chunk-VYQ4URQB.js.map → chunk-FFRTNF3L.js.map} +0 -0
  511. /package/dist/{chunk-TY6MKIWP.js.map → chunk-FONWBCVY.js.map} +0 -0
  512. /package/dist/{chunk-XSV2YDCJ.js.map → chunk-FPLM2TKD.js.map} +0 -0
  513. /package/dist/{chunk-VTU5IEKY.js.map → chunk-FTPONF6B.js.map} +0 -0
  514. /package/dist/{chunk-6PZGKGAO.js.map → chunk-FWX7W5PM.js.map} +0 -0
  515. /package/dist/{chunk-QPW3PAIH.js.map → chunk-G6DFSS6A.js.map} +0 -0
  516. /package/dist/{chunk-2DD6ZHOM.js.map → chunk-GJ776BC2.js.map} +0 -0
  517. /package/dist/{chunk-XKAR4RF6.js.map → chunk-GN3WRFJY.js.map} +0 -0
  518. /package/dist/{chunk-RG426DJO.js.map → chunk-H7NAZ3UB.js.map} +0 -0
  519. /package/dist/{chunk-BSXGTDVJ.js.map → chunk-HBUFQRIM.js.map} +0 -0
  520. /package/dist/{chunk-FFEBSFVT.js.map → chunk-HGJ6NJ4E.js.map} +0 -0
  521. /package/dist/{chunk-5JKUSBMX.js.map → chunk-IKP5OYQQ.js.map} +0 -0
  522. /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  523. /package/dist/{chunk-DBY26JJJ.js.map → chunk-IQ4NVWEF.js.map} +0 -0
  524. /package/dist/{chunk-7Q7JWLQ4.js.map → chunk-JYG4OLWH.js.map} +0 -0
  525. /package/dist/{chunk-3OTSVCPK.js.map → chunk-K26NWEOC.js.map} +0 -0
  526. /package/dist/{chunk-HOIRB77A.js.map → chunk-L6Z5OAS4.js.map} +0 -0
  527. /package/dist/{chunk-7RZJWZ46.js.map → chunk-LEPOP46W.js.map} +0 -0
  528. /package/dist/{chunk-NGT35IGQ.js.map → chunk-MIH3CJPN.js.map} +0 -0
  529. /package/dist/{chunk-QPAQSG3F.js.map → chunk-MK5VEWCR.js.map} +0 -0
  530. /package/dist/{chunk-L7RTUEDG.js.map → chunk-OCIP6YMD.js.map} +0 -0
  531. /package/dist/{chunk-UWJNKGBA.js.map → chunk-QZLDRQ4I.js.map} +0 -0
  532. /package/dist/{chunk-UYOXFFEY.js.map → chunk-RUNORG2P.js.map} +0 -0
  533. /package/dist/{chunk-LC3FD4BV.js.map → chunk-RZQ6W2W4.js.map} +0 -0
  534. /package/dist/{chunk-MRGJZ75M.js.map → chunk-SMNYAMJD.js.map} +0 -0
  535. /package/dist/{chunk-DN2IDKI5.js.map → chunk-TO7ZTWJW.js.map} +0 -0
  536. /package/dist/{chunk-K2TDK7GG.js.map → chunk-TWTUGCTY.js.map} +0 -0
  537. /package/dist/{chunk-CUTFSLSD.js.map → chunk-UCTS3DDH.js.map} +0 -0
  538. /package/dist/{chunk-JYIJNNN3.js.map → chunk-UG6VXIOK.js.map} +0 -0
  539. /package/dist/{chunk-QOQQMVR2.js.map → chunk-UKYS3NU5.js.map} +0 -0
  540. /package/dist/{chunk-VZRFGJCH.js.map → chunk-UPLZNJKN.js.map} +0 -0
  541. /package/dist/{chunk-DOOWFDWN.js.map → chunk-V6ERBR7U.js.map} +0 -0
  542. /package/dist/{chunk-N7CXQ5TA.js.map → chunk-XZHE2DEN.js.map} +0 -0
  543. /package/dist/{chunk-6NNNURLK.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  544. /package/dist/{chunk-F2Y6I74C.js.map → chunk-ZRZVLB7O.js.map} +0 -0
  545. /package/dist/{chunk-CLKBV3Z3.js.map → chunk-ZUKIUXHQ.js.map} +0 -0
  546. /package/dist/{contradiction-scan-KCADHXPE.js.map → contradiction-scan-JDTBXRGW.js.map} +0 -0
  547. /package/dist/{first-start-migration-LMMZFLKK.js.map → first-start-migration-CRZCZAJN.js.map} +0 -0
  548. /package/dist/{tier-stats-JDN6HRNT.js.map → tier-stats-EXYSKSVN.js.map} +0 -0
@@ -0,0 +1,283 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtemp, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import path from "node:path";
5
+ import { test } from "node:test";
6
+
7
+ import { parseConfig } from "../config.js";
8
+ import { StorageManager } from "../storage.js";
9
+ import { SupportPassportAccessSurface } from "./access-surface.js";
10
+ import { SupportPassportError } from "./errors.js";
11
+ import { SupportPassportModelAdapter, type SupportPassportModelRoute } from "./model-adapter.js";
12
+ import { computeSupportPassportSourceRevision } from "./model-service.js";
13
+
14
+ test("the access surface runs the owner and helper lifecycle without exposing a secret in owner lists", async () => {
15
+ StorageManager.clearAllStaticCaches();
16
+ const root = await mkdtemp(path.join(tmpdir(), "remnic-support-access-"));
17
+ try {
18
+ const storage = new StorageManager(path.join(root, "owner"));
19
+ await storage.ensureDirectories();
20
+ const now = new Date("2026-08-11T12:00:00.000Z");
21
+ const source = await storage.writeMemory("preference", "Tell me before plans change.", { source: "test" });
22
+ const route: SupportPassportModelRoute = {
23
+ kind: "local",
24
+ invoke: async (_messages, options) => ({
25
+ modelUsed: "local/test-model",
26
+ content:
27
+ options.operation === "support-passport-draft"
28
+ ? JSON.stringify({
29
+ cards: [
30
+ {
31
+ title: "Plan changes",
32
+ statement: "Tell me before plans change.",
33
+ category: "transitions",
34
+ sourceMemoryIds: [source.id],
35
+ },
36
+ ],
37
+ })
38
+ : JSON.stringify({
39
+ answer: "Tell this person before plans change.",
40
+ citedCardIds: [approvedCardId],
41
+ coverage: "grounded",
42
+ }),
43
+ }),
44
+ };
45
+ let approvedCardId = "";
46
+ const surface = new SupportPassportAccessSurface({
47
+ config: parseConfig({ memoryDir: root, supportPassport: { enabled: true } }),
48
+ resolveOwner: async (principal) => {
49
+ assert.equal(principal, "owner:test");
50
+ return { principal, namespace: "owner", storage };
51
+ },
52
+ resolveNamespace: async (namespace) => {
53
+ assert.equal(namespace, "owner");
54
+ return storage;
55
+ },
56
+ modelAdapter: new SupportPassportModelAdapter({ routes: [route] }),
57
+ audit: { record: async () => undefined },
58
+ now: () => now,
59
+ });
60
+
61
+ const preview = await surface.previewMemory("owner:test", source.id);
62
+ assert.equal(preview.found, true);
63
+ if (!preview.found) throw new Error("source preview was not found");
64
+ assert.equal(preview.memory.content, "Tell me before plans change.");
65
+ assert.match(preview.memory.revision, /^[a-f0-9]{64}$/);
66
+ const drafts = await surface.generateDrafts("owner:test", {
67
+ sourceMemoryIds: [source.id],
68
+ sourceMemoryRevisions: [{ memoryId: source.id, revision: preview.memory.revision }],
69
+ consent: true,
70
+ });
71
+ const draft = drafts[0];
72
+ assert.ok(draft);
73
+ const approved = await surface.approveCard("owner:test", draft.cardId, {
74
+ expectedRevision: draft.revision,
75
+ reasonCode: "owner-approved",
76
+ });
77
+ approvedCardId = approved.cardId;
78
+ await assert.rejects(
79
+ surface.createGrant("owner:test", {
80
+ cardIds: [approved.cardId],
81
+ cardRevisions: [{ cardId: approved.cardId, revision: "0".repeat(64) }],
82
+ expiresAt: "2026-08-11T14:00:00.123Z",
83
+ }),
84
+ (error: unknown) => error instanceof SupportPassportError && error.code === "revision_conflict"
85
+ );
86
+ await assert.rejects(
87
+ surface.createGrant("owner:test", {
88
+ cardIds: [approved.cardId],
89
+ cardRevisions: [{ cardId: approved.cardId, revision: approved.revision }],
90
+ expiresAt: "2026-08-11T12:04:59.999Z",
91
+ }),
92
+ (error: unknown) => error instanceof SupportPassportError && error.code === "invalid_input"
93
+ );
94
+ const created = await surface.createGrant("owner:test", {
95
+ cardIds: [approved.cardId],
96
+ cardRevisions: [{ cardId: approved.cardId, revision: approved.revision }],
97
+ durationMs: 300_000,
98
+ });
99
+ assert.equal(created.expiresAt, "2026-08-11T12:05:00.000Z");
100
+
101
+ const ownerGrants = await surface.listGrants("owner:test");
102
+ assert.equal(ownerGrants.length, 1);
103
+ assert.equal(JSON.stringify(ownerGrants).includes(created.secret), false);
104
+ const guide = await surface.readGrant(created.grantId, created.secret);
105
+ assert.equal(guide.cards[0]?.cardId, approved.cardId);
106
+ const answer = await surface.askGrant(created.grantId, created.secret, "What should I do?");
107
+ assert.deepEqual(answer.citedCardIds, [approved.cardId]);
108
+ const stopped = await surface.revokeGrant("owner:test", created.grantId, {
109
+ expectedVersion: created.version,
110
+ });
111
+ assert.equal(stopped.version, 2);
112
+ await assert.rejects(
113
+ surface.readGrant(created.grantId, created.secret),
114
+ (error: unknown) => error instanceof SupportPassportError && error.code === "grant_gone"
115
+ );
116
+ } finally {
117
+ StorageManager.clearAllStaticCaches();
118
+ await rm(root, { recursive: true, force: true });
119
+ }
120
+ });
121
+
122
+ test("the access surface fails closed while the feature flag is off", async () => {
123
+ const config = parseConfig({ supportPassport: { enabled: false } });
124
+ const surface = new SupportPassportAccessSurface({
125
+ config,
126
+ resolveOwner: async () => {
127
+ throw new Error("owner resolution must not run");
128
+ },
129
+ resolveNamespace: async () => {
130
+ throw new Error("namespace resolution must not run");
131
+ },
132
+ modelAdapter: new SupportPassportModelAdapter({ routes: [] }),
133
+ audit: { record: async () => undefined },
134
+ });
135
+
136
+ await assert.rejects(
137
+ surface.listCards("owner:test"),
138
+ (error: unknown) => error instanceof SupportPassportError && error.code === "feature_disabled"
139
+ );
140
+ await assert.rejects(
141
+ surface.readGrant("missing", "missing"),
142
+ (error: unknown) => error instanceof SupportPassportError && error.code === "grant_not_found"
143
+ );
144
+ });
145
+
146
+ test("memory preview hides sources that cannot be drafted", async () => {
147
+ StorageManager.clearAllStaticCaches();
148
+ const root = await mkdtemp(path.join(tmpdir(), "remnic-support-preview-"));
149
+ try {
150
+ const storage = new StorageManager(path.join(root, "owner"));
151
+ await storage.ensureDirectories();
152
+ const source = await storage.writeMemory("preference", "Tell me before plans change.", { source: "test" });
153
+ const surface = new SupportPassportAccessSurface({
154
+ config: parseConfig({ memoryDir: root, supportPassport: { enabled: true } }),
155
+ resolveOwner: async (principal) => ({ principal, namespace: "owner", storage }),
156
+ resolveNamespace: async () => storage,
157
+ modelAdapter: new SupportPassportModelAdapter({ routes: [] }),
158
+ audit: { record: async () => undefined },
159
+ });
160
+
161
+ for (const lifecycle of [
162
+ { status: "archived" as const, archivedAt: "2026-08-12T12:00:00.000Z" },
163
+ { status: "active" as const, archivedAt: undefined, blockedBy: "memory-review" },
164
+ { status: "active" as const, blockedBy: undefined, supersededBy: "replacement-memory" },
165
+ ]) {
166
+ const current = await storage.getMemoryById(source.id);
167
+ assert.ok(current);
168
+ assert.equal(
169
+ await storage.writeMemoryFrontmatterIfUnchanged(current, {
170
+ status: lifecycle.status,
171
+ archivedAt: lifecycle.archivedAt,
172
+ blockedBy: lifecycle.blockedBy,
173
+ supersededBy: lifecycle.supersededBy,
174
+ }),
175
+ true
176
+ );
177
+ assert.deepEqual(await surface.previewMemory("owner:test", source.id), { found: false });
178
+ }
179
+ } finally {
180
+ StorageManager.clearAllStaticCaches();
181
+ await rm(root, { recursive: true, force: true });
182
+ }
183
+ });
184
+
185
+ test("memory preview preserves literal attribute-style text without structured attributes", async () => {
186
+ StorageManager.clearAllStaticCaches();
187
+ const root = await mkdtemp(path.join(tmpdir(), "remnic-support-preview-literal-"));
188
+ try {
189
+ const storage = new StorageManager(path.join(root, "owner"));
190
+ await storage.ensureDirectories();
191
+ const content = "Give me time to answer.\n[Attributes: this is part of my note]";
192
+ const source = await storage.writeMemory("preference", content, { source: "test" });
193
+ const surface = new SupportPassportAccessSurface({
194
+ config: parseConfig({ memoryDir: root, supportPassport: { enabled: true } }),
195
+ resolveOwner: async (principal) => ({ principal, namespace: "owner", storage }),
196
+ resolveNamespace: async () => storage,
197
+ modelAdapter: new SupportPassportModelAdapter({ routes: [] }),
198
+ audit: { record: async () => undefined },
199
+ });
200
+
201
+ const preview = await surface.previewMemory("owner:test", source.id);
202
+ assert.equal(preview.found, true);
203
+ if (!preview.found) throw new Error("source preview was not found");
204
+ assert.equal(preview.memory.content, content);
205
+ assert.equal(preview.memory.revision, computeSupportPassportSourceRevision(content));
206
+ } finally {
207
+ StorageManager.clearAllStaticCaches();
208
+ await rm(root, { recursive: true, force: true });
209
+ }
210
+ });
211
+
212
+ test("memory preview validates the resolved owner before reading private text", async () => {
213
+ StorageManager.clearAllStaticCaches();
214
+ const root = await mkdtemp(path.join(tmpdir(), "remnic-support-preview-owner-"));
215
+ try {
216
+ const storage = new StorageManager(path.join(root, "other-owner"));
217
+ await storage.ensureDirectories();
218
+ const source = await storage.writeMemory("preference", "Private text for another owner.", { source: "test" });
219
+ let reads = 0;
220
+ const getMemoryById = storage.getMemoryById.bind(storage);
221
+ storage.getMemoryById = async (memoryId) => {
222
+ reads += 1;
223
+ return await getMemoryById(memoryId);
224
+ };
225
+ const surface = new SupportPassportAccessSurface({
226
+ config: parseConfig({ memoryDir: root, supportPassport: { enabled: true } }),
227
+ resolveOwner: async () => ({ principal: "owner:other", namespace: "other", storage }),
228
+ resolveNamespace: async () => storage,
229
+ modelAdapter: new SupportPassportModelAdapter({ routes: [] }),
230
+ audit: { record: async () => undefined },
231
+ });
232
+
233
+ await assert.rejects(
234
+ surface.previewMemory("owner:test", source.id),
235
+ (error: unknown) => error instanceof SupportPassportError && error.code === "card_data_invalid"
236
+ );
237
+ assert.equal(reads, 0);
238
+ } finally {
239
+ StorageManager.clearAllStaticCaches();
240
+ await rm(root, { recursive: true, force: true });
241
+ }
242
+ });
243
+
244
+ test("memory preview hides sources that exceed the draft model input limit", async () => {
245
+ StorageManager.clearAllStaticCaches();
246
+ const root = await mkdtemp(path.join(tmpdir(), "remnic-support-preview-limit-"));
247
+ try {
248
+ const storage = new StorageManager(path.join(root, "owner"));
249
+ await storage.ensureDirectories();
250
+ const source = await storage.writeMemory("preference", "x".repeat(20_001), { source: "test" });
251
+ const surface = new SupportPassportAccessSurface({
252
+ config: parseConfig({ memoryDir: root, supportPassport: { enabled: true } }),
253
+ resolveOwner: async (principal) => ({ principal, namespace: "owner", storage }),
254
+ resolveNamespace: async () => storage,
255
+ modelAdapter: new SupportPassportModelAdapter({ routes: [] }),
256
+ audit: { record: async () => undefined },
257
+ });
258
+
259
+ assert.deepEqual(await surface.previewMemory("owner:test", source.id), { found: false });
260
+ } finally {
261
+ StorageManager.clearAllStaticCaches();
262
+ await rm(root, { recursive: true, force: true });
263
+ }
264
+ });
265
+
266
+ test("owner operations reject a missing trusted principal as forbidden", async () => {
267
+ const surface = new SupportPassportAccessSurface({
268
+ config: parseConfig({ supportPassport: { enabled: true } }),
269
+ resolveOwner: async () => {
270
+ throw new Error("owner resolution must not run");
271
+ },
272
+ resolveNamespace: async () => {
273
+ throw new Error("namespace resolution must not run");
274
+ },
275
+ modelAdapter: new SupportPassportModelAdapter({ routes: [] }),
276
+ audit: { record: async () => undefined },
277
+ });
278
+
279
+ await assert.rejects(
280
+ surface.listCards(" "),
281
+ (error: unknown) => error instanceof SupportPassportError && error.code === "forbidden" && error.status === 403
282
+ );
283
+ });
@@ -0,0 +1,286 @@
1
+ import type { StorageManager } from "../index.js";
2
+ import { stripAttributesSuffix } from "../structured-attributes.js";
3
+ import type { PluginConfig } from "../types.js";
4
+ import { SupportPassportCardService } from "./card-service.js";
5
+ import { type SupportPassportOwnerScope, validateOwnerScope } from "./card-state.js";
6
+ import type { SupportPassportCard, SupportPassportCardCategory } from "./contracts.js";
7
+ import { SupportPassportError } from "./errors.js";
8
+ import {
9
+ type SupportPassportCreateGrantRequest,
10
+ SupportPassportCreateGrantRequestSchema,
11
+ type SupportPassportOwnerGrant,
12
+ type SupportPassportPublicGuide,
13
+ } from "./grant-contracts.js";
14
+ import { SupportPassportGrantService } from "./grant-service.js";
15
+ import { SupportPassportGrantStore } from "./grant-store.js";
16
+ import { type SupportPassportModelAdapter, createSupportPassportModelAdapter } from "./model-adapter.js";
17
+ import { type SupportPassportModelAuditSink, SupportPassportModelAuditStore } from "./model-audit.js";
18
+ import { type SupportPassportAnswerOutput, SupportPassportDraftModelInputSchema } from "./model-contracts.js";
19
+ import {
20
+ SupportPassportDraftService,
21
+ SupportPassportQuestionService,
22
+ computeSupportPassportSourceRevision,
23
+ isSupportPassportSourceEligible,
24
+ } from "./model-service.js";
25
+ import { supportsSupportPassportPrivateFiles } from "./private-file.js";
26
+
27
+ export interface SupportPassportAccessSurfaceDependencies {
28
+ config: PluginConfig;
29
+ resolveOwner(principal: string): Promise<SupportPassportOwnerScope>;
30
+ resolveNamespace(namespace: string): Promise<StorageManager>;
31
+ modelAdapter?: SupportPassportModelAdapter;
32
+ audit?: SupportPassportModelAuditSink;
33
+ now?: () => Date;
34
+ platform?: NodeJS.Platform;
35
+ }
36
+
37
+ export interface SupportPassportCreateGrantResult {
38
+ grantId: string;
39
+ secret: string;
40
+ expiresAt: string;
41
+ version: number;
42
+ }
43
+
44
+ export interface SupportPassportRevokeGrantResult {
45
+ grantId: string;
46
+ revokedAt: string;
47
+ version: number;
48
+ }
49
+
50
+ export type SupportPassportMemoryPreview =
51
+ | { found: false }
52
+ | { found: true; memory: { id: string; content: string; revision: string } };
53
+
54
+ export class SupportPassportAccessSurface {
55
+ private readonly config: PluginConfig;
56
+ private readonly cardService: SupportPassportCardService;
57
+ private readonly grantService: SupportPassportGrantService;
58
+ private readonly draftService: SupportPassportDraftService;
59
+ private readonly questionService: SupportPassportQuestionService;
60
+ private readonly resolveOwner: SupportPassportAccessSurfaceDependencies["resolveOwner"];
61
+ private readonly now: () => Date;
62
+ private readonly platformSupported: boolean;
63
+
64
+ constructor(dependencies: SupportPassportAccessSurfaceDependencies) {
65
+ this.config = dependencies.config;
66
+ this.resolveOwner = dependencies.resolveOwner;
67
+ this.now = dependencies.now ?? (() => new Date());
68
+ this.platformSupported = supportsSupportPassportPrivateFiles(dependencies.platform);
69
+ this.cardService = new SupportPassportCardService({
70
+ resolveOwner: dependencies.resolveOwner,
71
+ now: this.now,
72
+ });
73
+ this.grantService = new SupportPassportGrantService({
74
+ grantStore: new SupportPassportGrantStore({ memoryDir: dependencies.config.memoryDir, now: this.now }),
75
+ resolveOwner: dependencies.resolveOwner,
76
+ resolveNamespace: dependencies.resolveNamespace,
77
+ now: this.now,
78
+ });
79
+ const modelAdapter = dependencies.modelAdapter ?? createSupportPassportModelAdapter(dependencies.config);
80
+ const audit =
81
+ dependencies.audit ?? new SupportPassportModelAuditStore({ memoryDir: dependencies.config.memoryDir });
82
+ this.draftService = new SupportPassportDraftService({
83
+ cardService: this.cardService,
84
+ modelAdapter,
85
+ resolveOwner: dependencies.resolveOwner,
86
+ audit,
87
+ now: this.now,
88
+ });
89
+ this.questionService = new SupportPassportQuestionService({
90
+ grantService: this.grantService,
91
+ modelAdapter,
92
+ audit,
93
+ now: this.now,
94
+ });
95
+ }
96
+
97
+ async listCards(principal: string): Promise<SupportPassportCard[]> {
98
+ this.requireEnabled();
99
+ return this.cardService.listCards({ principal: this.requirePrincipal(principal) });
100
+ }
101
+
102
+ async previewMemory(principal: string, memoryId: string): Promise<SupportPassportMemoryPreview> {
103
+ this.requireEnabled();
104
+ const requestedPrincipal = this.requirePrincipal(principal);
105
+ const owner = validateOwnerScope(await this.resolveOwner(requestedPrincipal), requestedPrincipal);
106
+ const memory = await owner.storage.getMemoryById(memoryId);
107
+ if (!memory || !isSupportPassportSourceEligible(memory)) return { found: false };
108
+ const structuredAttributes = memory.frontmatter.structuredAttributes;
109
+ const content = structuredAttributes ? stripAttributesSuffix(memory.content) : memory.content;
110
+ if (
111
+ !SupportPassportDraftModelInputSchema.safeParse({
112
+ consent: true,
113
+ memories: [{ memoryId: memory.frontmatter.id, content }],
114
+ }).success
115
+ ) {
116
+ return { found: false };
117
+ }
118
+ return {
119
+ found: true,
120
+ memory: {
121
+ id: memory.frontmatter.id,
122
+ content,
123
+ revision: computeSupportPassportSourceRevision(memory.content, structuredAttributes),
124
+ },
125
+ };
126
+ }
127
+
128
+ async createManualDraft(
129
+ principal: string,
130
+ input: { title: string; statement: string; category: SupportPassportCardCategory; reviewBy: string },
131
+ options: { signal?: AbortSignal; onCommitted?: () => void } = {}
132
+ ): Promise<SupportPassportCard> {
133
+ this.requireEnabled();
134
+ return this.cardService.createManualDraft({ principal: this.requirePrincipal(principal), ...input }, options);
135
+ }
136
+
137
+ async generateDrafts(
138
+ principal: string,
139
+ input: {
140
+ sourceMemoryIds: string[];
141
+ sourceMemoryRevisions: Array<{ memoryId: string; revision: string }>;
142
+ consent: boolean;
143
+ signal?: AbortSignal;
144
+ onCommitted?: () => void;
145
+ }
146
+ ): Promise<SupportPassportCard[]> {
147
+ this.requireEnabled();
148
+ return this.draftService.draftCards({
149
+ principal: this.requirePrincipal(principal),
150
+ sourceMemoryIds: input.sourceMemoryIds,
151
+ sourceMemoryRevisions: input.sourceMemoryRevisions,
152
+ consent: input.consent,
153
+ signal: input.signal,
154
+ ...(input.onCommitted ? { onCommitted: input.onCommitted } : {}),
155
+ });
156
+ }
157
+
158
+ async replaceCard(
159
+ principal: string,
160
+ cardId: string,
161
+ input: {
162
+ title: string;
163
+ statement: string;
164
+ category: SupportPassportCardCategory;
165
+ reviewBy: string;
166
+ expectedRevision: string;
167
+ },
168
+ options: { signal?: AbortSignal; onCommitted?: () => void } = {}
169
+ ): Promise<SupportPassportCard> {
170
+ this.requireEnabled();
171
+ return this.cardService.replaceCard({ principal: this.requirePrincipal(principal), cardId, ...input }, options);
172
+ }
173
+
174
+ async approveCard(
175
+ principal: string,
176
+ cardId: string,
177
+ input: { expectedRevision: string; reasonCode?: string },
178
+ options: { signal?: AbortSignal; onCommitted?: () => void } = {}
179
+ ): Promise<SupportPassportCard> {
180
+ this.requireEnabled();
181
+ return this.cardService.approveCard({ principal: this.requirePrincipal(principal), cardId, ...input }, options);
182
+ }
183
+
184
+ async rejectCard(
185
+ principal: string,
186
+ cardId: string,
187
+ input: { expectedRevision: string; reasonCode?: string },
188
+ options: { signal?: AbortSignal; onCommitted?: () => void } = {}
189
+ ): Promise<SupportPassportCard> {
190
+ this.requireEnabled();
191
+ return this.cardService.rejectCard({ principal: this.requirePrincipal(principal), cardId, ...input }, options);
192
+ }
193
+
194
+ async withdrawCard(
195
+ principal: string,
196
+ cardId: string,
197
+ input: { expectedRevision: string; reasonCode?: string },
198
+ options: { signal?: AbortSignal; onCommitted?: () => void } = {}
199
+ ): Promise<SupportPassportCard> {
200
+ this.requireEnabled();
201
+ return this.cardService.withdrawCard({ principal: this.requirePrincipal(principal), cardId, ...input }, options);
202
+ }
203
+
204
+ async createGrant(
205
+ principal: string,
206
+ input: SupportPassportCreateGrantRequest,
207
+ options: { signal?: AbortSignal; onCommitted?: () => void } = {}
208
+ ): Promise<SupportPassportCreateGrantResult> {
209
+ this.requireEnabled();
210
+ const parsed = SupportPassportCreateGrantRequestSchema.safeParse(input);
211
+ if (!parsed.success) throw this.invalidGrantInput();
212
+ const created = await this.grantService.createGrant(
213
+ {
214
+ principal: this.requirePrincipal(principal),
215
+ cards: parsed.data.cardRevisions,
216
+ ...(parsed.data.expiresAt !== undefined
217
+ ? { expiresAt: parsed.data.expiresAt }
218
+ : { durationMs: parsed.data.durationMs }),
219
+ },
220
+ options
221
+ );
222
+ return {
223
+ grantId: created.grant.grantId,
224
+ secret: created.secret,
225
+ expiresAt: created.grant.expiresAt,
226
+ version: created.grant.stateVersion,
227
+ };
228
+ }
229
+
230
+ async listGrants(principal: string): Promise<SupportPassportOwnerGrant[]> {
231
+ this.requireEnabled();
232
+ return this.grantService.listGrants({ principal: this.requirePrincipal(principal) });
233
+ }
234
+
235
+ async revokeGrant(
236
+ principal: string,
237
+ grantId: string,
238
+ input: { expectedVersion?: number },
239
+ options: { signal?: AbortSignal; onCommitted?: () => void } = {}
240
+ ): Promise<SupportPassportRevokeGrantResult> {
241
+ this.requireEnabled();
242
+ const grant = await this.grantService.revokeGrant(
243
+ {
244
+ principal: this.requirePrincipal(principal),
245
+ grantId,
246
+ expectedStateVersion: input.expectedVersion,
247
+ },
248
+ options
249
+ );
250
+ if (!grant.revokedAt) {
251
+ throw new SupportPassportError("storage_conflict", "The share link could not be stopped.", 500);
252
+ }
253
+ return { grantId: grant.grantId, revokedAt: grant.revokedAt, version: grant.stateVersion };
254
+ }
255
+
256
+ async readGrant(grantId: string, secret: string): Promise<SupportPassportPublicGuide> {
257
+ this.requireEnabled(true);
258
+ return this.grantService.readGrant({ grantId, secret });
259
+ }
260
+
261
+ async askGrant(
262
+ grantId: string,
263
+ secret: string,
264
+ question: string,
265
+ signal?: AbortSignal
266
+ ): Promise<SupportPassportAnswerOutput> {
267
+ this.requireEnabled(true);
268
+ return this.questionService.askGrant({ grantId, secret, question, signal });
269
+ }
270
+
271
+ private requireEnabled(publicRequest = false): void {
272
+ if (this.config.supportPassport.enabled && this.platformSupported) return;
273
+ if (publicRequest) throw new SupportPassportError("grant_not_found", "The share link was not found.", 404);
274
+ throw new SupportPassportError("feature_disabled", "Support passport is disabled.", 404);
275
+ }
276
+
277
+ private requirePrincipal(principal: string): string {
278
+ const normalized = principal?.trim();
279
+ if (!normalized) throw new SupportPassportError("forbidden", "An authenticated owner is required.", 403);
280
+ return normalized;
281
+ }
282
+
283
+ private invalidGrantInput(): SupportPassportError {
284
+ return new SupportPassportError("invalid_input", "The share link request is invalid.", 400);
285
+ }
286
+ }
@@ -86,6 +86,14 @@ test("card projection rejects duplicate normalized source IDs", () => {
86
86
  assert.equal(projectSupportPassportCard(makeMemory({ sourceMemoryIds: "source-1, source-1 " })), null);
87
87
  });
88
88
 
89
+ test("card projection reads opaque source IDs from core lineage", () => {
90
+ const memory = makeMemory();
91
+ memory.frontmatter.lineage = ["Imported memory / café, 1"];
92
+ delete memory.frontmatter.structuredAttributes?.["support-passport-source-ids"];
93
+
94
+ assert.deepEqual(projectSupportPassportCard(memory)?.sourceMemoryIds, ["Imported memory / café, 1"]);
95
+ });
96
+
89
97
  test("card projection rejects superseded status without relying on supersededBy", () => {
90
98
  assert.equal(projectSupportPassportCard(makeMemory({ status: "superseded" })), null);
91
99
  });