@remnic/core 9.54.4 → 9.54.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 (526) hide show
  1. package/dist/access-admin-ops-surface.d.ts +12 -11
  2. package/dist/access-admin-ops-surface.js +46 -44
  3. package/dist/access-authorization-probe.d.ts +12 -11
  4. package/dist/access-authorization-probe.js +47 -45
  5. package/dist/access-boundary.d.ts +12 -11
  6. package/dist/access-boundary.js +46 -44
  7. package/dist/access-cli.js +92 -90
  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 +12 -11
  11. package/dist/access-extraction-force-flush.js +46 -44
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +12 -11
  14. package/dist/access-http-lifecycle-flush.d.ts +12 -11
  15. package/dist/access-http-offline-stream.d.ts +12 -11
  16. package/dist/access-http-query.js +46 -44
  17. package/dist/access-http.d.ts +12 -11
  18. package/dist/access-http.js +56 -54
  19. package/dist/access-identity-continuity-surface.d.ts +9 -9
  20. package/dist/access-identity-continuity-surface.js +46 -44
  21. package/dist/access-lcm-surface.d.ts +12 -11
  22. package/dist/access-lcm-surface.js +46 -44
  23. package/dist/access-mcp.d.ts +12 -11
  24. package/dist/access-mcp.js +52 -50
  25. package/dist/access-memory-search-fanout.d.ts +22 -2
  26. package/dist/access-memory-search-fanout.js +1 -1
  27. package/dist/{access-namespace-preflight-C7n4tgWC.d.ts → access-namespace-preflight-BdHlGd_T.d.ts} +1 -1
  28. package/dist/access-namespace-preflight.d.ts +3 -3
  29. package/dist/access-namespace-preflight.js +46 -44
  30. package/dist/access-observe-write-surface.d.ts +12 -11
  31. package/dist/access-observe-write-surface.js +46 -44
  32. package/dist/access-offline-manifest.d.ts +10 -9
  33. package/dist/access-offline-manifest.js +12 -10
  34. package/dist/access-operations-batch.js +48 -46
  35. package/dist/access-operations.d.ts +15 -14
  36. package/dist/access-operations.js +51 -49
  37. package/dist/access-recall-concurrency.d.ts +12 -11
  38. package/dist/access-recall-concurrency.js +46 -44
  39. package/dist/access-recall-response.d.ts +12 -11
  40. package/dist/access-recall-response.js +46 -44
  41. package/dist/access-recall-surface.d.ts +12 -11
  42. package/dist/access-recall-surface.js +46 -44
  43. package/dist/access-schema.d.ts +90 -90
  44. package/dist/access-schema.js +3 -2
  45. package/dist/{access-service-CXvbxLK-.d.ts → access-service-DL7X9hrg.d.ts} +7 -7
  46. package/dist/access-service-helpers.d.ts +12 -11
  47. package/dist/access-service.d.ts +12 -11
  48. package/dist/access-service.js +46 -44
  49. package/dist/access-surface-catalog.d.ts +12 -11
  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 +13 -1
  53. package/dist/active-memory-bridge.js +6 -1
  54. package/dist/active-recall.d.ts +1 -1
  55. package/dist/active-recall.js +3 -2
  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/ambient-provenance.d.ts +1 -1
  60. package/dist/artifact-search.d.ts +1 -1
  61. package/dist/behavior-learner.d.ts +1 -1
  62. package/dist/behavior-signals.d.ts +1 -1
  63. package/dist/bootstrap.d.ts +9 -9
  64. package/dist/briefing.d.ts +2 -2
  65. package/dist/briefing.js +30 -9
  66. package/dist/buffer-surprise-report.d.ts +1 -1
  67. package/dist/buffer-turn-helpers.d.ts +1 -1
  68. package/dist/buffer.d.ts +2 -2
  69. package/dist/buffer.js +3 -3
  70. package/dist/bulk-import/index.d.ts +3 -3
  71. package/dist/calibration.d.ts +1 -1
  72. package/dist/capabilities.d.ts +1 -1
  73. package/dist/{catalog-BOOxl-I2.d.ts → catalog-B90is4d8.d.ts} +1 -1
  74. package/dist/causal-behavior.d.ts +1 -1
  75. package/dist/causal-consolidation.d.ts +1 -1
  76. package/dist/causal-consolidation.js +31 -10
  77. package/dist/causal-consolidation.js.map +1 -1
  78. package/dist/causal-trajectory-graph.d.ts +1 -1
  79. package/dist/{chunk-6LAPLZOS.js → chunk-2DD6ZHOM.js} +8 -3
  80. package/dist/chunk-2DD6ZHOM.js.map +1 -0
  81. package/dist/{chunk-47P3RYZP.js → chunk-2INWPC6E.js} +2 -2
  82. package/dist/{chunk-3CSX3ETE.js → chunk-2LWQSV6A.js} +23 -11
  83. package/dist/chunk-2LWQSV6A.js.map +1 -0
  84. package/dist/{chunk-7BZOBA5J.js → chunk-2PNXOQ4P.js} +69 -11
  85. package/dist/chunk-2PNXOQ4P.js.map +1 -0
  86. package/dist/{chunk-WOPA3SGI.js → chunk-3OTSVCPK.js} +8 -8
  87. package/dist/{chunk-PX2LSHYM.js → chunk-3SXLD5T3.js} +3 -3
  88. package/dist/{chunk-T2JHZWH6.js → chunk-3WGI7F4V.js} +237 -93
  89. package/dist/chunk-3WGI7F4V.js.map +1 -0
  90. package/dist/{chunk-C4ZNGVK3.js → chunk-5JKUSBMX.js} +2 -2
  91. package/dist/{chunk-S75M5ZRK.js → chunk-6LEIWWAF.js} +16 -1
  92. package/dist/chunk-6LEIWWAF.js.map +1 -0
  93. package/dist/{chunk-MAXVH44E.js → chunk-6NNNURLK.js} +4 -4
  94. package/dist/{chunk-LJS7KUPV.js → chunk-6PZGKGAO.js} +2 -2
  95. package/dist/{chunk-YN6ASZUG.js → chunk-6QPI2ITJ.js} +5 -5
  96. package/dist/{chunk-CYF6WVE7.js → chunk-7HG7MGAP.js} +2688 -496
  97. package/dist/chunk-7HG7MGAP.js.map +1 -0
  98. package/dist/{chunk-CGVHPCP2.js → chunk-7Q7JWLQ4.js} +2 -2
  99. package/dist/{chunk-227UFSEQ.js → chunk-7RZJWZ46.js} +5 -5
  100. package/dist/{chunk-JBPKEARU.js → chunk-AU7Q3LSC.js} +4 -4
  101. package/dist/{chunk-PDDTI7IC.js → chunk-B4T3FQMT.js} +1 -1
  102. package/dist/{chunk-UU3G6GUP.js → chunk-BIF4SHMD.js} +1 -1
  103. package/dist/{chunk-UU3G6GUP.js.map → chunk-BIF4SHMD.js.map} +1 -1
  104. package/dist/{chunk-APPFNGX6.js → chunk-BSXGTDVJ.js} +2 -2
  105. package/dist/{chunk-4IIFL7GC.js → chunk-CLKBV3Z3.js} +10 -10
  106. package/dist/{chunk-ZYLC7NFO.js → chunk-CSY44OKU.js} +4 -4
  107. package/dist/{chunk-HLYR2TQL.js → chunk-CUTFSLSD.js} +2 -2
  108. package/dist/{chunk-RDJRFDJY.js → chunk-DBY26JJJ.js} +2 -2
  109. package/dist/{chunk-QWGE2PUH.js → chunk-DDA55IVB.js} +10 -10
  110. package/dist/{chunk-VMMQDEN5.js → chunk-DN2IDKI5.js} +2 -2
  111. package/dist/{chunk-2GFK22OZ.js → chunk-DOOWFDWN.js} +2 -2
  112. package/dist/{chunk-7FGL6CGA.js → chunk-DVYRD4HY.js} +2 -2
  113. package/dist/{chunk-YGLY6QFV.js → chunk-F2Y6I74C.js} +2 -2
  114. package/dist/{chunk-UU7TRFNE.js → chunk-FFEBSFVT.js} +2 -2
  115. package/dist/chunk-HNDIND7P.js +331 -0
  116. package/dist/chunk-HNDIND7P.js.map +1 -0
  117. package/dist/{chunk-NIS256NW.js → chunk-JKW663ZN.js} +2 -2
  118. package/dist/{chunk-G7A5HLUS.js → chunk-KJH6W2I7.js} +2 -2
  119. package/dist/{chunk-IXEBUYO4.js → chunk-KM55SMLG.js} +11 -2
  120. package/dist/{chunk-IXEBUYO4.js.map → chunk-KM55SMLG.js.map} +1 -1
  121. package/dist/{chunk-G2LUMAUF.js → chunk-L7RTUEDG.js} +12 -5
  122. package/dist/chunk-L7RTUEDG.js.map +1 -0
  123. package/dist/chunk-LC2BDILZ.js +57 -0
  124. package/dist/chunk-LC2BDILZ.js.map +1 -0
  125. package/dist/{chunk-JV5YUBIZ.js → chunk-LC3FD4BV.js} +52 -46
  126. package/dist/chunk-LC3FD4BV.js.map +1 -0
  127. package/dist/{chunk-HWRD23DW.js → chunk-LVKYLMSM.js} +3 -3
  128. package/dist/{chunk-RUMNY5DT.js → chunk-MRGJZ75M.js} +6 -2
  129. package/dist/chunk-MRGJZ75M.js.map +1 -0
  130. package/dist/{chunk-ZMYDYNI4.js → chunk-N7CXQ5TA.js} +4 -4
  131. package/dist/{chunk-3JLPGJ43.js → chunk-NGT35IGQ.js} +5 -5
  132. package/dist/{chunk-GUKBW4HL.js → chunk-NQMSEB5D.js} +6 -6
  133. package/dist/{chunk-WRJVB3C2.js → chunk-PO7NXBG2.js} +2 -2
  134. package/dist/{chunk-WM65LU67.js → chunk-QOQQMVR2.js} +2 -2
  135. package/dist/{chunk-QHFV6VNU.js → chunk-QPAQSG3F.js} +2 -2
  136. package/dist/{chunk-UTRO5UJU.js → chunk-QPW3PAIH.js} +5 -1
  137. package/dist/chunk-QPW3PAIH.js.map +1 -0
  138. package/dist/{chunk-6R4G7N4S.js → chunk-QQXWFDRD.js} +128 -74
  139. package/dist/chunk-QQXWFDRD.js.map +1 -0
  140. package/dist/{chunk-UES4BHA2.js → chunk-QTO6BMQZ.js} +2 -2
  141. package/dist/{chunk-THPPCISA.js → chunk-RBII7637.js} +5 -5
  142. package/dist/{chunk-QT2FRYI4.js → chunk-RG426DJO.js} +2 -2
  143. package/dist/{chunk-XUAMCLY4.js → chunk-TKFGFDPJ.js} +17 -13
  144. package/dist/chunk-TKFGFDPJ.js.map +1 -0
  145. package/dist/{chunk-VKXWK44Q.js → chunk-TY6MKIWP.js} +3 -3
  146. package/dist/{chunk-AZM4CCAC.js → chunk-UWJNKGBA.js} +5 -5
  147. package/dist/{chunk-JDZPNCMA.js → chunk-UYOXFFEY.js} +6 -3
  148. package/dist/chunk-UYOXFFEY.js.map +1 -0
  149. package/dist/{chunk-ZPJ4QSGP.js → chunk-VTU5IEKY.js} +2 -2
  150. package/dist/{chunk-RZ4XGKOJ.js → chunk-VYQ4URQB.js} +8 -8
  151. package/dist/{chunk-WDBX6VER.js → chunk-VZRFGJCH.js} +5 -5
  152. package/dist/{chunk-IBKR2TFR.js → chunk-WM5LD6AT.js} +2 -2
  153. package/dist/{chunk-K4QS7LXU.js → chunk-WZWZRZ2V.js} +2 -2
  154. package/dist/{chunk-G4T7L557.js → chunk-XKAR4RF6.js} +2 -2
  155. package/dist/{chunk-DZD576ZU.js → chunk-XSV2YDCJ.js} +2 -2
  156. package/dist/{chunk-G7Z6EENO.js → chunk-YDWPYDML.js} +4 -4
  157. package/dist/{chunk-6HPHEFXT.js → chunk-YKZLOPTC.js} +2 -2
  158. package/dist/{chunk-NH5IR2WM.js → chunk-YR65W7BV.js} +6 -2
  159. package/dist/chunk-YR65W7BV.js.map +1 -0
  160. package/dist/{chunk-GYPQL6XN.js → chunk-Z4N7SVVF.js} +35 -47
  161. package/dist/chunk-Z4N7SVVF.js.map +1 -0
  162. package/dist/{cli-DVUFIa5E.d.ts → cli-jfuZXixq.d.ts} +5 -5
  163. package/dist/cli.d.ts +14 -13
  164. package/dist/cli.js +74 -72
  165. package/dist/coding/pre-action-gate.d.ts +1 -1
  166. package/dist/compounding/engine.d.ts +2 -2
  167. package/dist/compounding/engine.js +30 -9
  168. package/dist/compounding/preference-consolidator.d.ts +1 -1
  169. package/dist/compression-optimizer.d.ts +1 -1
  170. package/dist/config.d.ts +1 -1
  171. package/dist/config.js +3 -2
  172. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  173. package/dist/connectors/codex-materialize-runner.js +30 -9
  174. package/dist/connectors/codex-materialize.d.ts +1 -1
  175. package/dist/connectors/index.d.ts +1 -1
  176. package/dist/connectors/index.js +29 -9
  177. package/dist/consolidation-provenance-check.d.ts +2 -2
  178. package/dist/consolidation-undo.d.ts +2 -2
  179. package/dist/contradiction/index.d.ts +2 -2
  180. package/dist/contradiction/index.js +3 -1
  181. package/dist/contradiction-scan-KCADHXPE.js +20 -0
  182. package/dist/converge-config.d.ts +1 -1
  183. package/dist/convergence-refresh.d.ts +2 -2
  184. package/dist/convergence-refresh.js +32 -11
  185. package/dist/conversation-index/backend.d.ts +1 -1
  186. package/dist/conversation-index/backend.js +2 -2
  187. package/dist/conversation-index/chunker.d.ts +1 -1
  188. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  189. package/dist/conversation-index/indexer.d.ts +1 -1
  190. package/dist/conversation-index/search.d.ts +1 -1
  191. package/dist/corpus-watermark.d.ts +1 -1
  192. package/dist/corpus-watermark.js +21 -20
  193. package/dist/day-summary.d.ts +1 -1
  194. package/dist/delinearize.d.ts +1 -1
  195. package/dist/dependency-propagation-config.d.ts +1 -1
  196. package/dist/{dependency-propagation-delivery-XzF76C9n.d.ts → dependency-propagation-delivery-CTDuAVJc.d.ts} +1 -1
  197. package/dist/direct-answer-wiring.d.ts +1 -1
  198. package/dist/direct-answer.d.ts +1 -1
  199. package/dist/embedding-fallback.d.ts +1 -1
  200. package/dist/enrichment/index.d.ts +1 -1
  201. package/dist/entity-retrieval.d.ts +2 -2
  202. package/dist/entity-retrieval.js +30 -9
  203. package/dist/entity-schema.d.ts +1 -1
  204. package/dist/explicit-capture.d.ts +9 -9
  205. package/dist/explicit-capture.js +6 -4
  206. package/dist/external-wiki-access.d.ts +12 -11
  207. package/dist/external-wiki-access.js +47 -45
  208. package/dist/external-wiki-collection-registration.d.ts +1 -1
  209. package/dist/external-wiki-collection.d.ts +1 -1
  210. package/dist/external-wiki-mcp-tools.d.ts +12 -11
  211. package/dist/extraction-error-classification.d.ts +1 -1
  212. package/dist/extraction-faithfulness.d.ts +1 -1
  213. package/dist/extraction-judge-telemetry.d.ts +1 -1
  214. package/dist/extraction-judge-training.d.ts +1 -1
  215. package/dist/extraction-judge.d.ts +1 -1
  216. package/dist/extraction-liveness.d.ts +1 -1
  217. package/dist/extraction-normalization.d.ts +1 -1
  218. package/dist/extraction-prompt.d.ts +1 -1
  219. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  220. package/dist/extraction-source-grounding.d.ts +1 -1
  221. package/dist/extraction.d.ts +1 -1
  222. package/dist/extraction.js +29 -13
  223. package/dist/fallback-llm.d.ts +1 -1
  224. package/dist/{first-start-migration-626C5554.js → first-start-migration-LMMZFLKK.js} +13 -5
  225. package/dist/first-start-migration-LMMZFLKK.js.map +1 -0
  226. package/dist/graph-dashboard-diff.d.ts +1 -1
  227. package/dist/graph-dashboard-key.d.ts +1 -1
  228. package/dist/graph-dashboard-parser.d.ts +1 -1
  229. package/dist/graph-edge-reinforcement.d.ts +1 -1
  230. package/dist/graph-path-reconstruction.d.ts +1 -1
  231. package/dist/graph-path-scoring.d.ts +1 -1
  232. package/dist/graph-snapshot.d.ts +1 -1
  233. package/dist/graph.d.ts +1 -1
  234. package/dist/harmonic-retrieval.js +1 -1
  235. package/dist/importance.d.ts +1 -1
  236. package/dist/importers/index.d.ts +1 -1
  237. package/dist/in-flight-reads.d.ts +1 -1
  238. package/dist/index.d.ts +1439 -716
  239. package/dist/index.js +207 -121
  240. package/dist/intent.d.ts +1 -1
  241. package/dist/lcm/engine.d.ts +1 -1
  242. package/dist/lcm/engine.js +2 -2
  243. package/dist/lcm/index.d.ts +1 -1
  244. package/dist/lcm/index.js +5 -5
  245. package/dist/lcm/tools.d.ts +1 -1
  246. package/dist/lifecycle.d.ts +1 -1
  247. package/dist/live-connectors-runner.d.ts +1 -1
  248. package/dist/local-llm.d.ts +1 -1
  249. package/dist/local-model-endpoint.d.ts +1 -1
  250. package/dist/maintenance/memory-governance.d.ts +1 -1
  251. package/dist/maintenance/memory-governance.js +30 -9
  252. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  253. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +30 -9
  254. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  255. package/dist/maintenance/rebuild-memory-projection.js +31 -10
  256. package/dist/{maintenance-BJzNIKBE.d.ts → maintenance-heMZSq7G.d.ts} +3 -3
  257. package/dist/mcp-memory-inspector-app.d.ts +12 -11
  258. package/dist/memory-action-policy.d.ts +1 -1
  259. package/dist/memory-cache.d.ts +1 -1
  260. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  261. package/dist/memory-projection-mutations.js +2 -2
  262. package/dist/memory-projection-store.d.ts +6 -2
  263. package/dist/memory-projection-store.js +1 -1
  264. package/dist/memory-provenance.d.ts +1 -1
  265. package/dist/memory-snapshot.d.ts +1 -1
  266. package/dist/memory-worth-outcomes.d.ts +2 -2
  267. package/dist/models-json.d.ts +1 -1
  268. package/dist/namespaces/migrate.d.ts +3 -3
  269. package/dist/namespaces/migrate.js +20 -19
  270. package/dist/namespaces/principal.d.ts +1 -1
  271. package/dist/namespaces/search.d.ts +1 -1
  272. package/dist/namespaces/search.js +6 -6
  273. package/dist/namespaces/storage.d.ts +3 -3
  274. package/dist/namespaces/storage.js +30 -9
  275. package/dist/native-knowledge.d.ts +1 -1
  276. package/dist/offline-sync-file-io.d.ts +20 -0
  277. package/dist/offline-sync-file-io.js +18 -0
  278. package/dist/offline-sync-file-io.js.map +1 -0
  279. package/dist/offline-sync-impression-drain.d.ts +1 -1
  280. package/dist/offline-sync-impression-drain.js +5 -5
  281. package/dist/offline-sync.d.ts +8 -6
  282. package/dist/offline-sync.js +2 -1
  283. package/dist/operator-doctor-corpus.d.ts +1 -1
  284. package/dist/operator-doctor-corpus.js +22 -21
  285. package/dist/operator-doctor-replica.d.ts +1 -1
  286. package/dist/operator-toolkit.d.ts +3 -3
  287. package/dist/operator-toolkit.js +34 -32
  288. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  289. package/dist/orchestration/maintenance.d.ts +4 -4
  290. package/dist/orchestration/maintenance.js +35 -15
  291. package/dist/{orchestrator-BiXgBJBQ.d.ts → orchestrator-BQQPsSjs.d.ts} +11 -8
  292. package/dist/orchestrator.d.ts +9 -9
  293. package/dist/orchestrator.js +93 -91
  294. package/dist/patterns-cli.d.ts +1 -1
  295. package/dist/{pipeline-sz_dcuLg.d.ts → pipeline-DFfmsnGk.d.ts} +1 -1
  296. package/dist/policy-runtime.d.ts +1 -1
  297. package/dist/proactive-contention.d.ts +1 -1
  298. package/dist/provenance.d.ts +1 -1
  299. package/dist/{purge-533FZLS4.js → purge-GB7PZHT2.js} +2 -2
  300. package/dist/{qmd-eAWObK4M.d.ts → qmd-BF5bcVRs.d.ts} +1 -1
  301. package/dist/qmd-preflight.d.ts +2 -2
  302. package/dist/qmd-recall-cache.d.ts +1 -1
  303. package/dist/qmd.d.ts +2 -2
  304. package/dist/recall-concurrency-config.d.ts +1 -1
  305. package/dist/recall-disclosure-escalation.d.ts +1 -1
  306. package/dist/recall-explain-renderer.d.ts +1 -1
  307. package/dist/recall-explain-renderer.js +3 -3
  308. package/dist/recall-memory-map.d.ts +1 -1
  309. package/dist/recall-planner-llm.d.ts +1 -1
  310. package/dist/recall-state.d.ts +1 -1
  311. package/dist/recall-tag-filter.d.ts +1 -1
  312. package/dist/recall-timings.d.ts +1 -1
  313. package/dist/recall-xray-cli.d.ts +1 -1
  314. package/dist/recall-xray-cli.js +4 -4
  315. package/dist/recall-xray-renderer.d.ts +1 -1
  316. package/dist/recall-xray-renderer.js +3 -3
  317. package/dist/recall-xray.d.ts +1 -1
  318. package/dist/recall-xray.js +2 -2
  319. package/dist/reconcile/cursor.d.ts +2 -1
  320. package/dist/reconcile/manifest.d.ts +2 -1
  321. package/dist/reconcile/manifest.js +6 -5
  322. package/dist/reconcile/plan.d.ts +2 -1
  323. package/dist/reconcile/plan.js +3 -2
  324. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  325. package/dist/replay/normalizers/claude.d.ts +1 -1
  326. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  327. package/dist/replay/normalizers/shared.d.ts +1 -1
  328. package/dist/replay/runner.d.ts +1 -1
  329. package/dist/replay/types.d.ts +1 -1
  330. package/dist/replica-divergence.d.ts +1 -1
  331. package/dist/replica-peers-config.d.ts +1 -1
  332. package/dist/resolve-auth-token.d.ts +1 -1
  333. package/dist/resume-bundles.js +4 -3
  334. package/dist/retrieval-agents.d.ts +2 -2
  335. package/dist/retrieval-tiers.d.ts +1 -1
  336. package/dist/routing/engine.d.ts +1 -1
  337. package/dist/routing/store.d.ts +1 -1
  338. package/dist/salvage-envelope.d.ts +1 -1
  339. package/dist/schemas.d.ts +138 -138
  340. package/dist/{scope-profiles-BBQsXuyj.d.ts → scope-profiles-CbUOsE_E.d.ts} +1 -1
  341. package/dist/search/embed-helper.d.ts +1 -1
  342. package/dist/search/factory.d.ts +1 -1
  343. package/dist/search/factory.js +4 -4
  344. package/dist/search/index.d.ts +1 -1
  345. package/dist/search/index.js +6 -6
  346. package/dist/search/lancedb-backend.d.ts +1 -1
  347. package/dist/search/meilisearch-backend.d.ts +1 -1
  348. package/dist/search/noop-backend.d.ts +1 -1
  349. package/dist/search/orama-backend.d.ts +1 -1
  350. package/dist/search/port.d.ts +1 -1
  351. package/dist/search/remote-backend.d.ts +1 -1
  352. package/dist/{semantic-consolidation-HD8RkzVA.d.ts → semantic-consolidation-DAB3xdKM.d.ts} +1 -1
  353. package/dist/semantic-consolidation.d.ts +2 -2
  354. package/dist/semantic-consolidation.js +31 -10
  355. package/dist/semantic-rule-promotion.js +30 -9
  356. package/dist/semantic-rule-verifier.d.ts +1 -1
  357. package/dist/semantic-rule-verifier.js +30 -9
  358. package/dist/{service-DIrtHHEg.d.ts → service-DGKg2O6r.d.ts} +2 -2
  359. package/dist/session-observer-bands.d.ts +1 -1
  360. package/dist/session-observer-state.d.ts +1 -1
  361. package/dist/shared-context/manager.d.ts +9 -9
  362. package/dist/signal.d.ts +1 -1
  363. package/dist/source-agent-qualifier.d.ts +1 -1
  364. package/dist/source-agent-qualifier.js +28 -12
  365. package/dist/{storage-DqCzXi56.d.ts → storage-CC1jKcWg.d.ts} +46 -13
  366. package/dist/storage.d.ts +2 -2
  367. package/dist/storage.js +30 -9
  368. package/dist/summarizer.d.ts +1 -1
  369. package/dist/summary-snapshot.d.ts +1 -1
  370. package/dist/temporal-supersession.d.ts +2 -2
  371. package/dist/temporal-timeline-recall.d.ts +1 -1
  372. package/dist/temporal-validity.d.ts +1 -1
  373. package/dist/threading.d.ts +1 -1
  374. package/dist/tier-migration.d.ts +2 -2
  375. package/dist/tier-routing.d.ts +2 -2
  376. package/dist/tier-routing.js +7 -1
  377. package/dist/{tier-stats-2JCZYEF7.js → tier-stats-JDN6HRNT.js} +8 -2
  378. package/dist/{tier-stats-2JCZYEF7.js.map → tier-stats-JDN6HRNT.js.map} +1 -1
  379. package/dist/topics.d.ts +1 -1
  380. package/dist/transcript.d.ts +1 -1
  381. package/dist/transfer/types.d.ts +66 -66
  382. package/dist/trust-score-stage.d.ts +1 -1
  383. package/dist/trust-score.d.ts +1 -1
  384. package/dist/{types-d_j4vC6N.d.ts → types-BnQza1y8.d.ts} +2 -1
  385. package/dist/types.d.ts +1 -1
  386. package/dist/types.js +1 -1
  387. package/dist/utility-runtime.d.ts +2 -2
  388. package/dist/verified-recall.js +30 -9
  389. package/dist/write-envelope.d.ts +1 -1
  390. package/package.json +2 -2
  391. package/src/access-http.test.ts +31 -0
  392. package/src/access-memory-search-fanout.ts +24 -1
  393. package/src/access-offline-manifest.ts +5 -0
  394. package/src/access-service-namespace.test.ts +14 -0
  395. package/src/access-service-observe-scope.test.ts +2 -0
  396. package/src/access-service-offline-file-content.test.ts +211 -0
  397. package/src/access-service.ts +20 -43
  398. package/src/active-memory-bridge.test.ts +151 -0
  399. package/src/active-memory-bridge.ts +87 -11
  400. package/src/briefing.test.ts +38 -0
  401. package/src/briefing.ts +3 -3
  402. package/src/cli.ts +6 -1
  403. package/src/connectors/codex-materialize-runner.ts +2 -0
  404. package/src/contradiction/contradiction-scan.ts +2 -0
  405. package/src/contradiction/contradiction.test.ts +42 -0
  406. package/src/correction/correction-access-wiring.ts +8 -2
  407. package/src/correction/correction-storage-integration.test.ts +7 -0
  408. package/src/explicit-capture.test.ts +24 -0
  409. package/src/explicit-capture.ts +2 -0
  410. package/src/index.ts +3 -0
  411. package/src/maintenance/first-start-migration.ts +2 -1
  412. package/src/maintenance/memory-governance.test.ts +25 -0
  413. package/src/maintenance/memory-governance.ts +4 -1
  414. package/src/maintenance/pattern-reinforcement.test.ts +20 -0
  415. package/src/maintenance/pattern-reinforcement.ts +2 -1
  416. package/src/maintenance/rebuild-memory-projection.ts +8 -8
  417. package/src/memory-projection-store.ts +25 -27
  418. package/src/offline-sync-file-io.ts +68 -0
  419. package/src/offline-sync.ts +43 -57
  420. package/src/orchestration/consolidation-run.ts +5 -4
  421. package/src/orchestration/contradiction-linking-coordinator.ts +7 -0
  422. package/src/orchestration/contradiction-localization.integration.test.ts +115 -0
  423. package/src/orchestration/lifecycle-policy-coordinator.ts +2 -1
  424. package/src/orchestration/qmd-result-resolver.test.ts +215 -14
  425. package/src/orchestration/qmd-result-resolver.ts +142 -82
  426. package/src/orchestration/recall-search-pipeline.test.ts +41 -0
  427. package/src/orchestration/recall-search-pipeline.ts +12 -0
  428. package/src/orchestration/semantic-consolidation-coordinator.ts +2 -1
  429. package/src/orchestration/tier-migration-coordinator.ts +23 -56
  430. package/src/orchestration/workspace-ops.test.ts +37 -0
  431. package/src/orchestration/workspace-ops.ts +5 -29
  432. package/src/orchestrator.ts +7 -8
  433. package/src/storage/supersession-audit.ts +7 -1
  434. package/src/storage/supersession-side-effects.ts +17 -5
  435. package/src/storage.ts +18 -19
  436. package/src/support-passport/card-projection.test.ts +129 -0
  437. package/src/support-passport/card-projection.ts +287 -0
  438. package/src/support-passport/card-service.test.ts +2462 -0
  439. package/src/support-passport/card-service.ts +1042 -0
  440. package/src/support-passport/contracts.test.ts +143 -0
  441. package/src/support-passport/contracts.ts +136 -0
  442. package/src/support-passport/errors.ts +24 -0
  443. package/src/support-passport/grant-contracts.ts +139 -0
  444. package/src/support-passport/grant-service-cache.test.ts +148 -0
  445. package/src/support-passport/grant-service-cancellation.test.ts +81 -0
  446. package/src/support-passport/grant-service.test.ts +2882 -0
  447. package/src/support-passport/grant-service.ts +364 -0
  448. package/src/support-passport/grant-store-commit-hook.test.ts +123 -0
  449. package/src/support-passport/grant-store-order.test.ts +60 -0
  450. package/src/support-passport/grant-store-path-safety.test.ts +30 -0
  451. package/src/support-passport/grant-store-recovery.test.ts +448 -0
  452. package/src/support-passport/grant-store.ts +902 -0
  453. package/src/support-passport/index.ts +7 -0
  454. package/src/support-passport/offline-sync-guard.ts +230 -0
  455. package/src/support-passport/owner-lock.ts +53 -0
  456. package/src/support-passport/private-file.ts +371 -0
  457. package/src/tier-routing.ts +28 -17
  458. package/src/training-export/converter.test.ts +24 -0
  459. package/src/training-export/converter.ts +2 -0
  460. package/src/types.ts +1 -1
  461. package/src/wearables/service.test.ts +13 -0
  462. package/src/wearables/service.ts +2 -0
  463. package/dist/chunk-3CSX3ETE.js.map +0 -1
  464. package/dist/chunk-6LAPLZOS.js.map +0 -1
  465. package/dist/chunk-6R4G7N4S.js.map +0 -1
  466. package/dist/chunk-7BZOBA5J.js.map +0 -1
  467. package/dist/chunk-CYF6WVE7.js.map +0 -1
  468. package/dist/chunk-G2LUMAUF.js.map +0 -1
  469. package/dist/chunk-GYPQL6XN.js.map +0 -1
  470. package/dist/chunk-JDZPNCMA.js.map +0 -1
  471. package/dist/chunk-JV5YUBIZ.js.map +0 -1
  472. package/dist/chunk-NH5IR2WM.js.map +0 -1
  473. package/dist/chunk-RUMNY5DT.js.map +0 -1
  474. package/dist/chunk-S75M5ZRK.js.map +0 -1
  475. package/dist/chunk-T2JHZWH6.js.map +0 -1
  476. package/dist/chunk-UTRO5UJU.js.map +0 -1
  477. package/dist/chunk-XUAMCLY4.js.map +0 -1
  478. package/dist/contradiction-scan-HYLIRMJ2.js +0 -14
  479. package/dist/first-start-migration-626C5554.js.map +0 -1
  480. /package/dist/{chunk-47P3RYZP.js.map → chunk-2INWPC6E.js.map} +0 -0
  481. /package/dist/{chunk-WOPA3SGI.js.map → chunk-3OTSVCPK.js.map} +0 -0
  482. /package/dist/{chunk-PX2LSHYM.js.map → chunk-3SXLD5T3.js.map} +0 -0
  483. /package/dist/{chunk-C4ZNGVK3.js.map → chunk-5JKUSBMX.js.map} +0 -0
  484. /package/dist/{chunk-MAXVH44E.js.map → chunk-6NNNURLK.js.map} +0 -0
  485. /package/dist/{chunk-LJS7KUPV.js.map → chunk-6PZGKGAO.js.map} +0 -0
  486. /package/dist/{chunk-YN6ASZUG.js.map → chunk-6QPI2ITJ.js.map} +0 -0
  487. /package/dist/{chunk-CGVHPCP2.js.map → chunk-7Q7JWLQ4.js.map} +0 -0
  488. /package/dist/{chunk-227UFSEQ.js.map → chunk-7RZJWZ46.js.map} +0 -0
  489. /package/dist/{chunk-JBPKEARU.js.map → chunk-AU7Q3LSC.js.map} +0 -0
  490. /package/dist/{chunk-PDDTI7IC.js.map → chunk-B4T3FQMT.js.map} +0 -0
  491. /package/dist/{chunk-APPFNGX6.js.map → chunk-BSXGTDVJ.js.map} +0 -0
  492. /package/dist/{chunk-4IIFL7GC.js.map → chunk-CLKBV3Z3.js.map} +0 -0
  493. /package/dist/{chunk-ZYLC7NFO.js.map → chunk-CSY44OKU.js.map} +0 -0
  494. /package/dist/{chunk-HLYR2TQL.js.map → chunk-CUTFSLSD.js.map} +0 -0
  495. /package/dist/{chunk-RDJRFDJY.js.map → chunk-DBY26JJJ.js.map} +0 -0
  496. /package/dist/{chunk-QWGE2PUH.js.map → chunk-DDA55IVB.js.map} +0 -0
  497. /package/dist/{chunk-VMMQDEN5.js.map → chunk-DN2IDKI5.js.map} +0 -0
  498. /package/dist/{chunk-2GFK22OZ.js.map → chunk-DOOWFDWN.js.map} +0 -0
  499. /package/dist/{chunk-7FGL6CGA.js.map → chunk-DVYRD4HY.js.map} +0 -0
  500. /package/dist/{chunk-YGLY6QFV.js.map → chunk-F2Y6I74C.js.map} +0 -0
  501. /package/dist/{chunk-UU7TRFNE.js.map → chunk-FFEBSFVT.js.map} +0 -0
  502. /package/dist/{chunk-NIS256NW.js.map → chunk-JKW663ZN.js.map} +0 -0
  503. /package/dist/{chunk-G7A5HLUS.js.map → chunk-KJH6W2I7.js.map} +0 -0
  504. /package/dist/{chunk-HWRD23DW.js.map → chunk-LVKYLMSM.js.map} +0 -0
  505. /package/dist/{chunk-ZMYDYNI4.js.map → chunk-N7CXQ5TA.js.map} +0 -0
  506. /package/dist/{chunk-3JLPGJ43.js.map → chunk-NGT35IGQ.js.map} +0 -0
  507. /package/dist/{chunk-GUKBW4HL.js.map → chunk-NQMSEB5D.js.map} +0 -0
  508. /package/dist/{chunk-WRJVB3C2.js.map → chunk-PO7NXBG2.js.map} +0 -0
  509. /package/dist/{chunk-WM65LU67.js.map → chunk-QOQQMVR2.js.map} +0 -0
  510. /package/dist/{chunk-QHFV6VNU.js.map → chunk-QPAQSG3F.js.map} +0 -0
  511. /package/dist/{chunk-UES4BHA2.js.map → chunk-QTO6BMQZ.js.map} +0 -0
  512. /package/dist/{chunk-THPPCISA.js.map → chunk-RBII7637.js.map} +0 -0
  513. /package/dist/{chunk-QT2FRYI4.js.map → chunk-RG426DJO.js.map} +0 -0
  514. /package/dist/{chunk-VKXWK44Q.js.map → chunk-TY6MKIWP.js.map} +0 -0
  515. /package/dist/{chunk-AZM4CCAC.js.map → chunk-UWJNKGBA.js.map} +0 -0
  516. /package/dist/{chunk-ZPJ4QSGP.js.map → chunk-VTU5IEKY.js.map} +0 -0
  517. /package/dist/{chunk-RZ4XGKOJ.js.map → chunk-VYQ4URQB.js.map} +0 -0
  518. /package/dist/{chunk-WDBX6VER.js.map → chunk-VZRFGJCH.js.map} +0 -0
  519. /package/dist/{chunk-IBKR2TFR.js.map → chunk-WM5LD6AT.js.map} +0 -0
  520. /package/dist/{chunk-K4QS7LXU.js.map → chunk-WZWZRZ2V.js.map} +0 -0
  521. /package/dist/{chunk-G4T7L557.js.map → chunk-XKAR4RF6.js.map} +0 -0
  522. /package/dist/{chunk-DZD576ZU.js.map → chunk-XSV2YDCJ.js.map} +0 -0
  523. /package/dist/{chunk-G7Z6EENO.js.map → chunk-YDWPYDML.js.map} +0 -0
  524. /package/dist/{chunk-6HPHEFXT.js.map → chunk-YKZLOPTC.js.map} +0 -0
  525. /package/dist/{contradiction-scan-HYLIRMJ2.js.map → contradiction-scan-KCADHXPE.js.map} +0 -0
  526. /package/dist/{purge-533FZLS4.js.map → purge-GB7PZHT2.js.map} +0 -0
@@ -0,0 +1,143 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+
4
+ import {
5
+ SupportPassportCardListSchema,
6
+ SupportPassportCardSchema,
7
+ SupportPassportManualDraftInputSchema,
8
+ SupportPassportNamespaceSchema,
9
+ SupportPassportReplaceCardInputSchema,
10
+ computeSupportPassportCardRevision,
11
+ } from "./contracts.js";
12
+
13
+ function makeCard(cardId: string) {
14
+ const fields = {
15
+ cardId,
16
+ title: "Quiet space",
17
+ statement: "Offer me a quiet place and time.",
18
+ category: "environment" as const,
19
+ status: "active" as const,
20
+ updatedAt: "2026-08-11T12:00:00.000Z",
21
+ reviewBy: "2027-02-07T12:00:00.000Z",
22
+ };
23
+ return { ...fields, revision: computeSupportPassportCardRevision(fields) };
24
+ }
25
+
26
+ test("the public support card contract rejects unknown fields", () => {
27
+ assert.equal(SupportPassportCardSchema.safeParse({ ...makeCard("card-1"), note: "private" }).success, false);
28
+ });
29
+
30
+ test("the support card list contract rejects duplicate card IDs", () => {
31
+ const card = makeCard("card-1");
32
+ assert.equal(SupportPassportCardListSchema.safeParse([card, card]).success, false);
33
+ });
34
+
35
+ test("manual and replacement drafts require the owner's review date", () => {
36
+ const draft = {
37
+ principal: "owner:alice",
38
+ title: "Quiet space",
39
+ statement: "Offer me a quiet place and time.",
40
+ category: "environment",
41
+ };
42
+ assert.equal(SupportPassportManualDraftInputSchema.safeParse(draft).success, false);
43
+ assert.equal(
44
+ SupportPassportReplaceCardInputSchema.safeParse({
45
+ ...draft,
46
+ cardId: "card-1",
47
+ expectedRevision: "a".repeat(64),
48
+ }).success,
49
+ false
50
+ );
51
+ });
52
+
53
+ test("support card dates reject invalid calendar values and timezone offsets", () => {
54
+ for (const reviewBy of ["2027-02-31T12:00:00Z", "2027-01-01T00:00:00+25:00"]) {
55
+ const draft = {
56
+ principal: "owner:alice",
57
+ title: "Quiet space",
58
+ statement: "Offer me a quiet place and time.",
59
+ category: "environment",
60
+ reviewBy,
61
+ };
62
+ assert.equal(SupportPassportManualDraftInputSchema.safeParse(draft).success, false);
63
+ assert.equal(
64
+ SupportPassportReplaceCardInputSchema.safeParse({
65
+ ...draft,
66
+ cardId: "card-1",
67
+ expectedRevision: "a".repeat(64),
68
+ }).success,
69
+ false
70
+ );
71
+ assert.equal(SupportPassportCardSchema.safeParse({ ...makeCard("card-1"), reviewBy }).success, false);
72
+ }
73
+ });
74
+
75
+ test("support card titles reject attribute delimiters and line breaks", () => {
76
+ for (const title of ["Quiet ] space", "Quiet\nspace", "Quiet\rspace"]) {
77
+ const manualDraft = {
78
+ principal: "owner:alice",
79
+ title,
80
+ statement: "Offer me a quiet place and time.",
81
+ category: "environment",
82
+ reviewBy: "2027-02-07T12:00:00.000Z",
83
+ };
84
+ assert.equal(SupportPassportManualDraftInputSchema.safeParse(manualDraft).success, false);
85
+ assert.equal(
86
+ SupportPassportReplaceCardInputSchema.safeParse({
87
+ ...manualDraft,
88
+ cardId: "card-1",
89
+ expectedRevision: "a".repeat(64),
90
+ }).success,
91
+ false
92
+ );
93
+ assert.equal(SupportPassportCardSchema.safeParse({ ...makeCard("card-1"), title }).success, false);
94
+ }
95
+ });
96
+
97
+ test("support passport namespaces use the shared canonical identity grammar", () => {
98
+ for (const namespace of ["", " alice", "alice "]) {
99
+ assert.equal(SupportPassportNamespaceSchema.safeParse(namespace).success, false);
100
+ }
101
+ for (const namespace of [
102
+ "team.alpha-1",
103
+ "team support:primary",
104
+ "tenant/default",
105
+ "alice\\bob",
106
+ "alice]bob",
107
+ "alice..bob",
108
+ "alice\nbob",
109
+ "alice\0bob",
110
+ "n".repeat(4096),
111
+ ]) {
112
+ assert.equal(SupportPassportNamespaceSchema.safeParse(namespace).success, true);
113
+ }
114
+ });
115
+
116
+ test("support card revisions change when any public field changes", () => {
117
+ const initial = makeCard("card-1");
118
+ const changed = computeSupportPassportCardRevision({
119
+ cardId: initial.cardId,
120
+ title: initial.title,
121
+ statement: "Offer me a quiet room and time.",
122
+ category: initial.category,
123
+ status: initial.status,
124
+ updatedAt: initial.updatedAt,
125
+ reviewBy: initial.reviewBy,
126
+ });
127
+ assert.notEqual(changed, initial.revision);
128
+ });
129
+
130
+ test("support card revisions ignore object key insertion order", () => {
131
+ const initial = makeCard("card-1");
132
+ const reordered = {
133
+ reviewBy: initial.reviewBy,
134
+ updatedAt: initial.updatedAt,
135
+ status: initial.status,
136
+ category: initial.category,
137
+ statement: initial.statement,
138
+ title: initial.title,
139
+ cardId: initial.cardId,
140
+ };
141
+
142
+ assert.equal(computeSupportPassportCardRevision(reordered), initial.revision);
143
+ });
@@ -0,0 +1,136 @@
1
+ import { createHash } from "node:crypto";
2
+ import { z } from "zod";
3
+
4
+ import { normalizeNamespaceIdentity } from "../namespaces/identity.js";
5
+ import { parseIsoOffsetTimestamp } from "../utils/iso-timestamp.js";
6
+
7
+ export const SUPPORT_PASSPORT_CARD_CATEGORIES = [
8
+ "communication",
9
+ "environment",
10
+ "transitions",
11
+ "sensory",
12
+ "regulation",
13
+ "interests",
14
+ "other",
15
+ ] as const;
16
+
17
+ export const SUPPORT_PASSPORT_CARD_STATUSES = [
18
+ "pending_review",
19
+ "active",
20
+ "rejected",
21
+ "superseded",
22
+ "archived",
23
+ ] as const;
24
+
25
+ export const SupportPassportCardCategorySchema = z.enum(SUPPORT_PASSPORT_CARD_CATEGORIES);
26
+ export const SupportPassportCardStatusSchema = z.enum(SUPPORT_PASSPORT_CARD_STATUSES);
27
+ export const SupportPassportCardTitleSchema = z
28
+ .string()
29
+ .trim()
30
+ .min(1)
31
+ .max(80)
32
+ .refine((title) => !title.includes("]") && !title.includes("\n") && !title.includes("\r"), {
33
+ message: "card titles cannot contain closing brackets or line breaks",
34
+ });
35
+
36
+ const IsoTimestampSchema = z
37
+ .string()
38
+ .datetime({ offset: true })
39
+ .refine((value) => parseIsoOffsetTimestamp(value) !== null, {
40
+ message: "timestamps must be valid ISO 8601 values",
41
+ });
42
+ export const SupportPassportNamespaceSchema = z
43
+ .string()
44
+ .min(1)
45
+ .refine((namespace) => namespace === normalizeNamespaceIdentity(namespace), {
46
+ message: "namespaces must be canonical",
47
+ });
48
+ export const SupportPassportMemoryIdSchema = z
49
+ .string()
50
+ .trim()
51
+ .min(1)
52
+ .max(128)
53
+ .regex(/^[A-Za-z0-9._:-]+$/);
54
+
55
+ export const SupportPassportCardSchema = z
56
+ .object({
57
+ cardId: SupportPassportMemoryIdSchema,
58
+ title: SupportPassportCardTitleSchema,
59
+ statement: z.string().trim().min(1).max(500),
60
+ category: SupportPassportCardCategorySchema,
61
+ status: SupportPassportCardStatusSchema,
62
+ updatedAt: IsoTimestampSchema,
63
+ reviewBy: IsoTimestampSchema,
64
+ revision: z.string().regex(/^[a-f0-9]{64}$/),
65
+ })
66
+ .strict();
67
+
68
+ export const SupportPassportCardListSchema = z
69
+ .array(SupportPassportCardSchema)
70
+ .max(100)
71
+ .superRefine((cards, ctx) => {
72
+ const seen = new Set<string>();
73
+ for (const [index, card] of cards.entries()) {
74
+ if (seen.has(card.cardId)) {
75
+ ctx.addIssue({
76
+ code: z.ZodIssueCode.custom,
77
+ message: "card IDs must be unique",
78
+ path: [index, "cardId"],
79
+ });
80
+ }
81
+ seen.add(card.cardId);
82
+ }
83
+ });
84
+
85
+ export const SupportPassportListCardsInputSchema = z
86
+ .object({
87
+ principal: z.string().trim().min(1).max(512),
88
+ })
89
+ .strict();
90
+
91
+ export const SupportPassportManualDraftInputSchema = z
92
+ .object({
93
+ principal: z.string().trim().min(1).max(512),
94
+ title: SupportPassportCardTitleSchema,
95
+ statement: z.string().trim().min(1).max(500),
96
+ category: SupportPassportCardCategorySchema,
97
+ reviewBy: IsoTimestampSchema,
98
+ })
99
+ .strict();
100
+
101
+ export const SupportPassportCardMutationInputSchema = z
102
+ .object({
103
+ principal: z.string().trim().min(1).max(512),
104
+ cardId: SupportPassportMemoryIdSchema,
105
+ expectedRevision: z.string().regex(/^[a-f0-9]{64}$/),
106
+ })
107
+ .strict();
108
+
109
+ export const SupportPassportReplaceCardInputSchema = SupportPassportCardMutationInputSchema.extend({
110
+ title: SupportPassportCardTitleSchema,
111
+ statement: z.string().trim().min(1).max(500),
112
+ category: SupportPassportCardCategorySchema,
113
+ reviewBy: IsoTimestampSchema,
114
+ }).strict();
115
+
116
+ export type SupportPassportCard = z.infer<typeof SupportPassportCardSchema>;
117
+ export type SupportPassportCardCategory = z.infer<typeof SupportPassportCardCategorySchema>;
118
+ export type SupportPassportCardStatus = z.infer<typeof SupportPassportCardStatusSchema>;
119
+ export type SupportPassportManualDraftInput = z.input<typeof SupportPassportManualDraftInputSchema>;
120
+ export type SupportPassportCardMutationInput = z.input<typeof SupportPassportCardMutationInputSchema>;
121
+ export type SupportPassportReplaceCardInput = z.input<typeof SupportPassportReplaceCardInputSchema>;
122
+
123
+ type RevisionFields = Omit<SupportPassportCard, "revision">;
124
+
125
+ export function computeSupportPassportCardRevision(fields: RevisionFields): string {
126
+ const canonicalFields = {
127
+ cardId: fields.cardId,
128
+ category: fields.category,
129
+ reviewBy: fields.reviewBy,
130
+ statement: fields.statement,
131
+ status: fields.status,
132
+ title: fields.title,
133
+ updatedAt: fields.updatedAt,
134
+ };
135
+ return createHash("sha256").update(JSON.stringify(canonicalFields)).digest("hex");
136
+ }
@@ -0,0 +1,24 @@
1
+ export type SupportPassportErrorCode =
2
+ | "card_data_invalid"
3
+ | "card_not_found"
4
+ | "grant_expired"
5
+ | "grant_gone"
6
+ | "grant_not_found"
7
+ | "grant_stale"
8
+ | "invalid_card_status"
9
+ | "invalid_input"
10
+ | "revision_conflict"
11
+ | "state_conflict"
12
+ | "storage_conflict";
13
+
14
+ export class SupportPassportError extends Error {
15
+ readonly code: SupportPassportErrorCode;
16
+ readonly status: number;
17
+
18
+ constructor(code: SupportPassportErrorCode, message: string, status: number) {
19
+ super(message);
20
+ this.name = "SupportPassportError";
21
+ this.code = code;
22
+ this.status = status;
23
+ }
24
+ }
@@ -0,0 +1,139 @@
1
+ import { z } from "zod";
2
+
3
+ import { parseIsoOffsetTimestamp } from "../utils/iso-timestamp.js";
4
+ import {
5
+ SupportPassportCardCategorySchema,
6
+ SupportPassportMemoryIdSchema,
7
+ SupportPassportNamespaceSchema,
8
+ } from "./contracts.js";
9
+
10
+ const IsoTimestampSchema = z
11
+ .string()
12
+ .datetime({ offset: true })
13
+ .refine((value) => parseIsoOffsetTimestamp(value) !== null, "timestamp must be a real date");
14
+ const RevisionSchema = z.string().regex(/^[a-f0-9]{64}$/);
15
+ const GrantIdSchema = z
16
+ .string()
17
+ .uuid()
18
+ .transform((value) => value.toLowerCase());
19
+
20
+ export const SupportPassportGrantCardRefSchema = z
21
+ .object({
22
+ cardId: SupportPassportMemoryIdSchema,
23
+ revision: RevisionSchema,
24
+ })
25
+ .strict();
26
+
27
+ export const SupportPassportGrantStateSchema = z
28
+ .object({
29
+ schemaVersion: z.literal(1),
30
+ stateVersion: z.number().int().positive(),
31
+ grantId: GrantIdSchema,
32
+ namespace: SupportPassportNamespaceSchema,
33
+ principalHash: RevisionSchema,
34
+ ownerLockKey: RevisionSchema,
35
+ secretHash: RevisionSchema,
36
+ cards: z.array(SupportPassportGrantCardRefSchema).min(1).max(8),
37
+ createdAt: IsoTimestampSchema,
38
+ expiresAt: IsoTimestampSchema,
39
+ revokedAt: IsoTimestampSchema.optional(),
40
+ })
41
+ .strict()
42
+ .superRefine((grant, ctx) => {
43
+ const ids = new Set<string>();
44
+ for (const [index, card] of grant.cards.entries()) {
45
+ if (ids.has(card.cardId)) {
46
+ ctx.addIssue({
47
+ code: z.ZodIssueCode.custom,
48
+ message: "card IDs must be unique",
49
+ path: ["cards", index, "cardId"],
50
+ });
51
+ }
52
+ ids.add(card.cardId);
53
+ }
54
+ if (Date.parse(grant.expiresAt) <= Date.parse(grant.createdAt)) {
55
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: "expiresAt must follow createdAt", path: ["expiresAt"] });
56
+ }
57
+ });
58
+
59
+ export const SupportPassportCreateGrantInputSchema = z
60
+ .object({
61
+ principal: z.string().trim().min(1).max(512),
62
+ cards: z.array(SupportPassportGrantCardRefSchema).min(1).max(8),
63
+ expiresAt: IsoTimestampSchema,
64
+ })
65
+ .strict()
66
+ .superRefine((input, ctx) => {
67
+ const ids = new Set<string>();
68
+ for (const [index, card] of input.cards.entries()) {
69
+ if (ids.has(card.cardId)) {
70
+ ctx.addIssue({
71
+ code: z.ZodIssueCode.custom,
72
+ message: "card IDs must be unique",
73
+ path: ["cards", index, "cardId"],
74
+ });
75
+ }
76
+ ids.add(card.cardId);
77
+ }
78
+ });
79
+
80
+ export const SupportPassportOwnerGrantSchema = z
81
+ .object({
82
+ grantId: GrantIdSchema,
83
+ stateVersion: z.number().int().positive(),
84
+ cards: z.array(SupportPassportGrantCardRefSchema).min(1).max(8),
85
+ createdAt: IsoTimestampSchema,
86
+ expiresAt: IsoTimestampSchema,
87
+ revokedAt: IsoTimestampSchema.optional(),
88
+ status: z.enum(["active", "expired", "revoked"]),
89
+ })
90
+ .strict();
91
+
92
+ export const SupportPassportCreatedGrantSchema = z
93
+ .object({
94
+ grant: SupportPassportOwnerGrantSchema,
95
+ secret: z.string().regex(/^[A-Za-z0-9_-]{43}$/),
96
+ })
97
+ .strict();
98
+
99
+ export const SupportPassportPublicCardSchema = z
100
+ .object({
101
+ cardId: SupportPassportMemoryIdSchema,
102
+ title: z.string().trim().min(1).max(80),
103
+ statement: z.string().trim().min(1).max(500),
104
+ category: SupportPassportCardCategorySchema,
105
+ updatedAt: IsoTimestampSchema,
106
+ })
107
+ .strict();
108
+
109
+ export const SupportPassportPublicGuideSchema = z
110
+ .object({
111
+ schemaVersion: z.literal(1),
112
+ grantId: GrantIdSchema,
113
+ expiresAt: IsoTimestampSchema,
114
+ updatedAt: IsoTimestampSchema,
115
+ cards: z.array(SupportPassportPublicCardSchema).min(1).max(8),
116
+ })
117
+ .strict();
118
+
119
+ export const SupportPassportRevokeGrantInputSchema = z
120
+ .object({
121
+ principal: z.string().trim().min(1).max(512),
122
+ grantId: GrantIdSchema,
123
+ expectedStateVersion: z.number().int().positive().optional(),
124
+ })
125
+ .strict();
126
+
127
+ export const SupportPassportListGrantsInputSchema = z
128
+ .object({
129
+ principal: z.string().trim().min(1).max(512),
130
+ })
131
+ .strict();
132
+
133
+ export type SupportPassportGrantCardRef = z.infer<typeof SupportPassportGrantCardRefSchema>;
134
+ export type SupportPassportGrantState = z.infer<typeof SupportPassportGrantStateSchema>;
135
+ export type SupportPassportCreateGrantInput = z.input<typeof SupportPassportCreateGrantInputSchema>;
136
+ export type SupportPassportOwnerGrant = z.infer<typeof SupportPassportOwnerGrantSchema>;
137
+ export type SupportPassportCreatedGrant = z.infer<typeof SupportPassportCreatedGrantSchema>;
138
+ export type SupportPassportPublicGuide = z.infer<typeof SupportPassportPublicGuideSchema>;
139
+ export type SupportPassportRevokeGrantInput = z.input<typeof SupportPassportRevokeGrantInputSchema>;
@@ -0,0 +1,148 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdir, 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 type { StorageManager } from "../index.js";
8
+ import type { MemoryFile } from "../types.js";
9
+ import { computeSupportPassportOwnerKey, projectSupportPassportCard } from "./card-projection.js";
10
+ import { SupportPassportError } from "./errors.js";
11
+ import type { SupportPassportGrantState } from "./grant-contracts.js";
12
+ import { SupportPassportGrantService } from "./grant-service.js";
13
+ import type { SupportPassportGrantStore } from "./grant-store.js";
14
+
15
+ function supportCardMemory(): MemoryFile {
16
+ return {
17
+ path: path.resolve(import.meta.dirname, "fixtures", "support-card.md"),
18
+ content: "Offer me a quiet place and time.",
19
+ frontmatter: {
20
+ id: "support-card-1",
21
+ category: "preference",
22
+ source: "support-passport",
23
+ confidence: 1,
24
+ confidenceTier: "explicit",
25
+ created: "2026-08-11T12:00:00.000Z",
26
+ updated: "2026-08-11T12:00:00.000Z",
27
+ status: "active",
28
+ tags: ["support-passport-card"],
29
+ structuredAttributes: {
30
+ "support-passport-namespace": "alice",
31
+ "support-passport-owner": computeSupportPassportOwnerKey("owner:alice"),
32
+ "support-passport-title": "Quiet space",
33
+ "support-passport-category": "environment",
34
+ "support-passport-order": "0",
35
+ "support-passport-review-by": "2026-09-01T12:00:00.000Z",
36
+ "support-passport-source-ids": "source-1",
37
+ },
38
+ },
39
+ } as MemoryFile;
40
+ }
41
+
42
+ test("card snapshots match the storage cache freshness window", async () => {
43
+ let nowMs = Date.parse("2026-08-11T12:00:00.000Z");
44
+ let diskMemories = [supportCardMemory()];
45
+ let cachedMemories: MemoryFile[] | undefined;
46
+ let cacheLoadedAt = 0;
47
+ let calls = 0;
48
+ let diskReads = 0;
49
+ const storage = {
50
+ getCorpusScanVersion: () => 1,
51
+ hotCacheKeyId: () => "stable",
52
+ hotCacheTtlMs: () => 60_000,
53
+ isHotCacheEnabled: () => true,
54
+ readAllMemories: async () => {
55
+ calls += 1;
56
+ if (cachedMemories && nowMs - cacheLoadedAt <= 60_000) return cachedMemories;
57
+ diskReads += 1;
58
+ cachedMemories = diskMemories;
59
+ cacheLoadedAt = nowMs;
60
+ return cachedMemories;
61
+ },
62
+ } as unknown as StorageManager;
63
+ const service = new SupportPassportGrantService({
64
+ grantStore: {} as SupportPassportGrantStore,
65
+ resolveOwner: async (principal) => ({ principal, namespace: "alice", storage }),
66
+ resolveNamespace: async () => storage,
67
+ now: () => new Date(nowMs),
68
+ });
69
+ const inspected = service as unknown as {
70
+ readStoredCardSnapshot(
71
+ storage: StorageManager,
72
+ namespace?: string,
73
+ ownerKey?: string
74
+ ): Promise<{ cardsById: ReadonlyMap<string, unknown> }>;
75
+ };
76
+ const ownerKey = computeSupportPassportOwnerKey("owner:alice");
77
+
78
+ assert.equal((await inspected.readStoredCardSnapshot(storage, "alice", ownerKey)).cardsById.size, 1);
79
+ diskMemories = [];
80
+ nowMs += 1_001;
81
+ assert.equal((await inspected.readStoredCardSnapshot(storage, "alice", ownerKey)).cardsById.size, 1);
82
+ assert.equal(calls, 2);
83
+ assert.equal(diskReads, 1);
84
+ nowMs += 59_000;
85
+
86
+ assert.equal((await inspected.readStoredCardSnapshot(storage, "alice", ownerKey)).cardsById.size, 0);
87
+ assert.equal(calls, 3);
88
+ assert.equal(diskReads, 2);
89
+ });
90
+
91
+ test("guide assembly rechecks snapshot age after owner-lock delay", async () => {
92
+ const root = await mkdtemp(path.join(tmpdir(), "remnic-support-grant-cache-"));
93
+ try {
94
+ await mkdir(path.join(root, "state"), { recursive: true });
95
+ let nowMs = Date.parse("2026-08-11T12:00:00.000Z");
96
+ let memories = [supportCardMemory()];
97
+ const projected = projectSupportPassportCard(memories[0]);
98
+ assert.ok(projected);
99
+ const state: SupportPassportGrantState = {
100
+ schemaVersion: 1,
101
+ stateVersion: 1,
102
+ grantId: "00000000-0000-4000-8000-000000000001",
103
+ namespace: "alice",
104
+ principalHash: computeSupportPassportOwnerKey("owner:alice"),
105
+ ownerLockKey: "a".repeat(64),
106
+ secretHash: "b".repeat(64),
107
+ cards: [{ cardId: projected.card.cardId, revision: projected.card.revision }],
108
+ createdAt: "2026-08-11T12:00:00.000Z",
109
+ expiresAt: "2026-08-11T13:00:00.000Z",
110
+ };
111
+ const storage = {
112
+ dir: root,
113
+ getCorpusScanVersion: () => 1,
114
+ hotCacheKeyId: () => "stable",
115
+ hotCacheTtlMs: () => 1_000,
116
+ isHotCacheEnabled: () => true,
117
+ readAllMemories: async () => memories,
118
+ } as unknown as StorageManager;
119
+ const grantStore = {
120
+ authenticate: async () => state,
121
+ withAuthenticatedGrant: async <T>(
122
+ _grantId: string,
123
+ _secret: string,
124
+ task: (current: SupportPassportGrantState) => Promise<T>,
125
+ beforeReturn?: (current: SupportPassportGrantState) => Promise<void>
126
+ ): Promise<T> => {
127
+ nowMs += 1_001;
128
+ memories = [];
129
+ const result = await task(state);
130
+ await beforeReturn?.(state);
131
+ return result;
132
+ },
133
+ } as unknown as SupportPassportGrantStore;
134
+ const service = new SupportPassportGrantService({
135
+ grantStore,
136
+ resolveOwner: async (principal) => ({ principal, namespace: "alice", storage }),
137
+ resolveNamespace: async () => storage,
138
+ now: () => new Date(nowMs),
139
+ });
140
+
141
+ await assert.rejects(
142
+ service.readGrant({ grantId: state.grantId, secret: "secret" }),
143
+ (error: unknown) => error instanceof SupportPassportError && error.code === "grant_stale"
144
+ );
145
+ } finally {
146
+ await rm(root, { recursive: true, force: true });
147
+ }
148
+ });
@@ -0,0 +1,81 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdir, 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 type { StorageManager } from "../index.js";
8
+ import type { MemoryFile } from "../types.js";
9
+ import { computeSupportPassportOwnerKey, projectSupportPassportCard } from "./card-projection.js";
10
+ import { SupportPassportGrantService } from "./grant-service.js";
11
+ import type { SupportPassportGrantStore } from "./grant-store.js";
12
+
13
+ test("grant creation checks cancellation again before commit", async () => {
14
+ const root = await mkdtemp(path.join(tmpdir(), "remnic-support-grant-cancel-"));
15
+ try {
16
+ await mkdir(path.join(root, "state"), { recursive: true });
17
+ const memory = {
18
+ path: path.join(root, "preferences", "support-card.md"),
19
+ content: "Offer me a quiet place and time.",
20
+ frontmatter: {
21
+ id: "support-card-1",
22
+ category: "preference",
23
+ source: "support-passport",
24
+ confidence: 1,
25
+ confidenceTier: "explicit",
26
+ created: "2026-08-11T12:00:00.000Z",
27
+ updated: "2026-08-11T12:00:00.000Z",
28
+ status: "active",
29
+ tags: ["support-passport-card"],
30
+ structuredAttributes: {
31
+ "support-passport-namespace": "alice",
32
+ "support-passport-owner": computeSupportPassportOwnerKey("owner:alice"),
33
+ "support-passport-title": "Quiet space",
34
+ "support-passport-category": "environment",
35
+ "support-passport-order": "0",
36
+ "support-passport-review-by": "2026-09-01T12:00:00.000Z",
37
+ "support-passport-source-ids": "source-1",
38
+ },
39
+ },
40
+ } as MemoryFile;
41
+ const projected = projectSupportPassportCard(memory);
42
+ assert.ok(projected);
43
+ const storage = {
44
+ dir: root,
45
+ readAllMemories: async () => [memory],
46
+ getCorpusScanVersion: () => 1,
47
+ hotCacheKeyId: () => "owner-cache",
48
+ } as unknown as StorageManager;
49
+ const controller = new AbortController();
50
+ let committed = false;
51
+ const grantStore = {
52
+ create: async (_input: unknown, hooks: { beforeCommit?: () => Promise<void> }) => {
53
+ controller.abort();
54
+ await hooks.beforeCommit?.();
55
+ committed = true;
56
+ throw new Error("commit should not run");
57
+ },
58
+ } as unknown as SupportPassportGrantStore;
59
+ const service = new SupportPassportGrantService({
60
+ grantStore,
61
+ resolveOwner: async (principal) => ({ principal, namespace: "alice", storage }),
62
+ resolveNamespace: async () => storage,
63
+ now: () => new Date("2026-08-11T12:00:00.000Z"),
64
+ });
65
+
66
+ await assert.rejects(
67
+ service.createGrant(
68
+ {
69
+ principal: "owner:alice",
70
+ cards: [{ cardId: projected.card.cardId, revision: projected.card.revision }],
71
+ expiresAt: "2026-08-11T13:00:00.000Z",
72
+ },
73
+ { signal: controller.signal }
74
+ ),
75
+ (error: unknown) => error instanceof Error && error.name === "AbortError"
76
+ );
77
+ assert.equal(committed, false);
78
+ } finally {
79
+ await rm(root, { recursive: true, force: true });
80
+ }
81
+ });