@remnic/core 9.54.4 → 9.54.6

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 (648) hide show
  1. package/dist/access-admin-ops-surface.d.ts +24 -23
  2. package/dist/access-admin-ops-surface.js +55 -50
  3. package/dist/access-authorization-probe.d.ts +25 -22
  4. package/dist/access-authorization-probe.js +58 -51
  5. package/dist/access-boundary.d.ts +26 -23
  6. package/dist/access-boundary.js +59 -52
  7. package/dist/access-cli.js +115 -107
  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 -18
  11. package/dist/access-extraction-force-flush.js +55 -50
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +22 -21
  14. package/dist/access-http-lifecycle-flush.d.ts +22 -21
  15. package/dist/access-http-offline-stream.d.ts +19 -18
  16. package/dist/access-http-query.js +55 -50
  17. package/dist/access-http.d.ts +55 -36
  18. package/dist/access-http.js +76 -65
  19. package/dist/access-identity-continuity-surface.d.ts +9 -9
  20. package/dist/access-identity-continuity-surface.js +55 -50
  21. package/dist/access-lcm-surface.d.ts +21 -20
  22. package/dist/access-lcm-surface.js +55 -50
  23. package/dist/access-mcp.d.ts +22 -21
  24. package/dist/access-mcp.js +63 -57
  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-CCNn_6NE.d.ts} +1 -1
  28. package/dist/access-namespace-preflight.d.ts +3 -3
  29. package/dist/access-namespace-preflight.js +55 -50
  30. package/dist/access-observe-write-surface.d.ts +22 -21
  31. package/dist/access-observe-write-surface.js +55 -50
  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 +57 -52
  35. package/dist/access-operations.d.ts +23 -22
  36. package/dist/access-operations.js +61 -55
  37. package/dist/access-recall-concurrency.d.ts +21 -20
  38. package/dist/access-recall-concurrency.js +55 -50
  39. package/dist/access-recall-response.d.ts +19 -18
  40. package/dist/access-recall-response.js +55 -50
  41. package/dist/access-recall-surface.d.ts +19 -18
  42. package/dist/access-recall-surface.js +55 -50
  43. package/dist/access-schema.d.ts +2 -2
  44. package/dist/access-schema.js +5 -4
  45. package/dist/{access-service-CXvbxLK-.d.ts → access-service-DkSdXK4S.d.ts} +1314 -83
  46. package/dist/access-service-helpers.d.ts +22 -21
  47. package/dist/access-service.d.ts +31 -30
  48. package/dist/access-service.js +55 -50
  49. package/dist/access-surface-catalog.d.ts +22 -21
  50. package/dist/access-surface-catalog.js +209 -2
  51. package/dist/access-surface-catalog.js.map +1 -1
  52. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  53. package/dist/action-confidence.d.ts +1 -1
  54. package/dist/active-memory-bridge.d.ts +14 -1
  55. package/dist/active-memory-bridge.js +6 -1
  56. package/dist/active-recall.d.ts +1 -1
  57. package/dist/active-recall.js +4 -2
  58. package/dist/active-recall.js.map +1 -1
  59. package/dist/adapters/index.js +7 -7
  60. package/dist/adapters/registry.js +3 -3
  61. package/dist/admin-console/public/what-helps-me/app.js +1594 -0
  62. package/dist/admin-console/public/what-helps-me/index.html +339 -0
  63. package/dist/admin-console/public/what-helps-me/model.js +685 -0
  64. package/dist/admin-console/public/what-helps-me/what-helps-me.css +1296 -0
  65. package/dist/ambient-provenance.d.ts +1 -1
  66. package/dist/artifact-search.d.ts +1 -1
  67. package/dist/{auto-sync-TDHLZPVP.js → auto-sync-NR3GPCOA.js} +4 -4
  68. package/dist/behavior-learner.d.ts +1 -1
  69. package/dist/behavior-signals.d.ts +1 -1
  70. package/dist/bootstrap.d.ts +9 -9
  71. package/dist/briefing.d.ts +2 -2
  72. package/dist/briefing.js +33 -12
  73. package/dist/buffer-surprise-report.d.ts +1 -1
  74. package/dist/buffer-turn-helpers.d.ts +1 -1
  75. package/dist/buffer.d.ts +2 -2
  76. package/dist/buffer.js +3 -3
  77. package/dist/bulk-import/index.d.ts +3 -3
  78. package/dist/calibration.d.ts +1 -1
  79. package/dist/calibration.js +1 -1
  80. package/dist/capabilities.d.ts +1 -1
  81. package/dist/{catalog-BOOxl-I2.d.ts → catalog-DGFf8mD9.d.ts} +1 -1
  82. package/dist/causal-behavior.d.ts +1 -1
  83. package/dist/causal-consolidation.d.ts +1 -1
  84. package/dist/causal-consolidation.js +34 -13
  85. package/dist/causal-consolidation.js.map +1 -1
  86. package/dist/causal-trajectory-graph.d.ts +1 -1
  87. package/dist/{chunk-ZYLC7NFO.js → chunk-26ZXBTYN.js} +4 -4
  88. package/dist/chunk-26ZXBTYN.js.map +1 -0
  89. package/dist/{chunk-LLJMAULE.js → chunk-2FKEIPIT.js} +5 -5
  90. package/dist/{chunk-3CSX3ETE.js → chunk-2LWQSV6A.js} +23 -11
  91. package/dist/chunk-2LWQSV6A.js.map +1 -0
  92. package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
  93. package/dist/chunk-37DZZFFM.js +502 -0
  94. package/dist/chunk-37DZZFFM.js.map +1 -0
  95. package/dist/chunk-3HSRWJTC.js +9 -0
  96. package/dist/chunk-3HSRWJTC.js.map +1 -0
  97. package/dist/{chunk-XUAMCLY4.js → chunk-3TIZPSJC.js} +17 -13
  98. package/dist/chunk-3TIZPSJC.js.map +1 -0
  99. package/dist/{chunk-PDDTI7IC.js → chunk-43SEBY2M.js} +1 -1
  100. package/dist/{chunk-HWRD23DW.js → chunk-46SZBVDS.js} +3 -3
  101. package/dist/{chunk-6HPHEFXT.js → chunk-5FD7JMTX.js} +2 -2
  102. package/dist/{chunk-7BZOBA5J.js → chunk-5NB726GV.js} +70 -16
  103. package/dist/chunk-5NB726GV.js.map +1 -0
  104. package/dist/chunk-62OKGIJA.js +39 -0
  105. package/dist/chunk-62OKGIJA.js.map +1 -0
  106. package/dist/{chunk-IBKR2TFR.js → chunk-6CYHUWCO.js} +2 -2
  107. package/dist/{chunk-YN6ASZUG.js → chunk-6QPI2ITJ.js} +5 -5
  108. package/dist/{chunk-UU3G6GUP.js → chunk-76JJSXK7.js} +1 -1
  109. package/dist/chunk-76JJSXK7.js.map +1 -0
  110. package/dist/{chunk-PX2LSHYM.js → chunk-7BD6O7ZV.js} +189 -4
  111. package/dist/chunk-7BD6O7ZV.js.map +1 -0
  112. package/dist/chunk-7TBXNYLO.js +346 -0
  113. package/dist/chunk-7TBXNYLO.js.map +1 -0
  114. package/dist/{chunk-NH5IR2WM.js → chunk-BRR5EUTF.js} +6 -2
  115. package/dist/chunk-BRR5EUTF.js.map +1 -0
  116. package/dist/{chunk-NIS256NW.js → chunk-CIAI24TQ.js} +3 -3
  117. package/dist/{chunk-T2JHZWH6.js → chunk-D3LBIUWV.js} +11703 -7573
  118. package/dist/chunk-D3LBIUWV.js.map +1 -0
  119. package/dist/{chunk-7FGL6CGA.js → chunk-DVYRD4HY.js} +2 -2
  120. package/dist/{chunk-G7Z6EENO.js → chunk-EKTP7MNS.js} +4 -4
  121. package/dist/{chunk-S75M5ZRK.js → chunk-F2JRDPON.js} +16 -1
  122. package/dist/chunk-F2JRDPON.js.map +1 -0
  123. package/dist/{chunk-RZ4XGKOJ.js → chunk-FFRTNF3L.js} +8 -8
  124. package/dist/{chunk-VKXWK44Q.js → chunk-FONWBCVY.js} +3 -3
  125. package/dist/{chunk-DZD576ZU.js → chunk-FPLM2TKD.js} +2 -2
  126. package/dist/{chunk-ZPJ4QSGP.js → chunk-FTPONF6B.js} +2 -2
  127. package/dist/{chunk-LJS7KUPV.js → chunk-FWX7W5PM.js} +2 -2
  128. package/dist/{chunk-UTRO5UJU.js → chunk-G6DFSS6A.js} +5 -1
  129. package/dist/chunk-G6DFSS6A.js.map +1 -0
  130. package/dist/{chunk-6LAPLZOS.js → chunk-GJ776BC2.js} +8 -3
  131. package/dist/chunk-GJ776BC2.js.map +1 -0
  132. package/dist/{chunk-G4T7L557.js → chunk-GN3WRFJY.js} +6 -6
  133. package/dist/{chunk-QT2FRYI4.js → chunk-H7NAZ3UB.js} +2 -2
  134. package/dist/{chunk-APPFNGX6.js → chunk-HBUFQRIM.js} +2 -2
  135. package/dist/{chunk-UU7TRFNE.js → chunk-HGJ6NJ4E.js} +2 -2
  136. package/dist/{chunk-WB7JSQCP.js → chunk-HIEWDJ2O.js} +5 -2
  137. package/dist/{chunk-WB7JSQCP.js.map → chunk-HIEWDJ2O.js.map} +1 -1
  138. package/dist/{chunk-UES4BHA2.js → chunk-I3MSGFGD.js} +17 -6
  139. package/dist/chunk-I3MSGFGD.js.map +1 -0
  140. package/dist/{chunk-C4ZNGVK3.js → chunk-IKP5OYQQ.js} +2 -2
  141. package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
  142. package/dist/{chunk-RDJRFDJY.js → chunk-IQ4NVWEF.js} +2 -2
  143. package/dist/{chunk-CGVHPCP2.js → chunk-JYG4OLWH.js} +2 -2
  144. package/dist/{chunk-WOPA3SGI.js → chunk-K26NWEOC.js} +8 -8
  145. package/dist/{chunk-K4QS7LXU.js → chunk-K2UGPTYY.js} +485 -44
  146. package/dist/chunk-K2UGPTYY.js.map +1 -0
  147. package/dist/{chunk-L6CQ7WIW.js → chunk-KFBOPMF6.js} +11 -11
  148. package/dist/chunk-KFBOPMF6.js.map +1 -0
  149. package/dist/{chunk-G7A5HLUS.js → chunk-KJH6W2I7.js} +2 -2
  150. package/dist/{chunk-IXEBUYO4.js → chunk-KM55SMLG.js} +11 -2
  151. package/dist/{chunk-IXEBUYO4.js.map → chunk-KM55SMLG.js.map} +1 -1
  152. package/dist/{chunk-HOIRB77A.js → chunk-L6Z5OAS4.js} +2 -2
  153. package/dist/chunk-LC2BDILZ.js +57 -0
  154. package/dist/chunk-LC2BDILZ.js.map +1 -0
  155. package/dist/{chunk-227UFSEQ.js → chunk-LEPOP46W.js} +4 -4
  156. package/dist/{chunk-6R4G7N4S.js → chunk-M4YHAODQ.js} +388 -748
  157. package/dist/chunk-M4YHAODQ.js.map +1 -0
  158. package/dist/{chunk-3JLPGJ43.js → chunk-MIH3CJPN.js} +5 -5
  159. package/dist/{chunk-QHFV6VNU.js → chunk-MK5VEWCR.js} +2 -2
  160. package/dist/chunk-NISZQW72.js +140 -0
  161. package/dist/chunk-NISZQW72.js.map +1 -0
  162. package/dist/{chunk-GUKBW4HL.js → chunk-NQMSEB5D.js} +6 -6
  163. package/dist/{chunk-G2LUMAUF.js → chunk-OCIP6YMD.js} +12 -5
  164. package/dist/chunk-OCIP6YMD.js.map +1 -0
  165. package/dist/{chunk-47P3RYZP.js → chunk-PG4QBPVG.js} +21 -11
  166. package/dist/chunk-PG4QBPVG.js.map +1 -0
  167. package/dist/{chunk-WRJVB3C2.js → chunk-PO7NXBG2.js} +2 -2
  168. package/dist/{chunk-QWGE2PUH.js → chunk-PT54WISF.js} +190 -56
  169. package/dist/chunk-PT54WISF.js.map +1 -0
  170. package/dist/{chunk-AZM4CCAC.js → chunk-QZLDRQ4I.js} +8 -8
  171. package/dist/{chunk-THPPCISA.js → chunk-RBII7637.js} +5 -5
  172. package/dist/{chunk-JDZPNCMA.js → chunk-RUNORG2P.js} +6 -3
  173. package/dist/chunk-RUNORG2P.js.map +1 -0
  174. package/dist/{chunk-JV5YUBIZ.js → chunk-RZQ6W2W4.js} +50 -44
  175. package/dist/chunk-RZQ6W2W4.js.map +1 -0
  176. package/dist/{chunk-RUMNY5DT.js → chunk-SMNYAMJD.js} +6 -2
  177. package/dist/chunk-SMNYAMJD.js.map +1 -0
  178. package/dist/{chunk-MKQBXQKU.js → chunk-TB6CBZ5V.js} +22 -15
  179. package/dist/chunk-TB6CBZ5V.js.map +1 -0
  180. package/dist/{chunk-VMMQDEN5.js → chunk-TO7ZTWJW.js} +2 -2
  181. package/dist/{chunk-K2TDK7GG.js → chunk-TWTUGCTY.js} +2 -2
  182. package/dist/{chunk-HLYR2TQL.js → chunk-UCTS3DDH.js} +2 -2
  183. package/dist/{chunk-JYIJNNN3.js → chunk-UG6VXIOK.js} +2 -2
  184. package/dist/{chunk-WM65LU67.js → chunk-UKYS3NU5.js} +2 -2
  185. package/dist/{chunk-WDBX6VER.js → chunk-UPLZNJKN.js} +5 -5
  186. package/dist/{chunk-C23BYTJV.js → chunk-UW5NPZJ2.js} +40 -12
  187. package/dist/chunk-UW5NPZJ2.js.map +1 -0
  188. package/dist/{chunk-2GFK22OZ.js → chunk-V6ERBR7U.js} +2 -2
  189. package/dist/{chunk-CYF6WVE7.js → chunk-W5ZKPI34.js} +139 -158
  190. package/dist/chunk-W5ZKPI34.js.map +1 -0
  191. package/dist/chunk-XX4HPFFM.js +370 -0
  192. package/dist/chunk-XX4HPFFM.js.map +1 -0
  193. package/dist/{chunk-ZMYDYNI4.js → chunk-XZHE2DEN.js} +4 -4
  194. package/dist/chunk-YXQEKCZM.js +223 -0
  195. package/dist/chunk-YXQEKCZM.js.map +1 -0
  196. package/dist/{chunk-GYPQL6XN.js → chunk-Z4N7SVVF.js} +35 -47
  197. package/dist/chunk-Z4N7SVVF.js.map +1 -0
  198. package/dist/{chunk-MAXVH44E.js → chunk-Z54EM5YZ.js} +7 -7
  199. package/dist/{chunk-YGLY6QFV.js → chunk-ZRZVLB7O.js} +2 -2
  200. package/dist/{chunk-4IIFL7GC.js → chunk-ZUKIUXHQ.js} +10 -10
  201. package/dist/{cli-DVUFIa5E.d.ts → cli-Bze8S0Qs.d.ts} +5 -5
  202. package/dist/cli.d.ts +22 -21
  203. package/dist/cli.js +90 -80
  204. package/dist/coding/pre-action-gate.d.ts +1 -1
  205. package/dist/compounding/engine.d.ts +2 -2
  206. package/dist/compounding/engine.js +33 -12
  207. package/dist/compounding/preference-consolidator.d.ts +1 -1
  208. package/dist/compression-optimizer.d.ts +1 -1
  209. package/dist/config.d.ts +1 -1
  210. package/dist/config.js +4 -2
  211. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  212. package/dist/connectors/codex-materialize-runner.js +33 -12
  213. package/dist/connectors/codex-materialize.d.ts +1 -1
  214. package/dist/connectors/index.d.ts +1 -1
  215. package/dist/connectors/index.js +32 -12
  216. package/dist/consolidation-provenance-check.d.ts +2 -2
  217. package/dist/consolidation-undo.d.ts +2 -2
  218. package/dist/contradiction/index.d.ts +2 -2
  219. package/dist/contradiction/index.js +3 -1
  220. package/dist/contradiction-scan-JDTBXRGW.js +20 -0
  221. package/dist/converge-config.d.ts +1 -1
  222. package/dist/convergence-refresh.d.ts +2 -2
  223. package/dist/convergence-refresh.js +35 -14
  224. package/dist/conversation-index/backend.d.ts +1 -1
  225. package/dist/conversation-index/backend.js +2 -2
  226. package/dist/conversation-index/chunker.d.ts +1 -1
  227. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  228. package/dist/conversation-index/indexer.d.ts +1 -1
  229. package/dist/conversation-index/search.d.ts +1 -1
  230. package/dist/corpus-watermark.d.ts +1 -1
  231. package/dist/corpus-watermark.js +25 -24
  232. package/dist/day-summary.d.ts +1 -1
  233. package/dist/delinearize.d.ts +1 -1
  234. package/dist/dependency-propagation-config.d.ts +1 -1
  235. package/dist/{dependency-propagation-delivery-XzF76C9n.d.ts → dependency-propagation-delivery-CzEfB31P.d.ts} +1 -1
  236. package/dist/direct-answer-wiring.d.ts +1 -1
  237. package/dist/direct-answer.d.ts +1 -1
  238. package/dist/embedding-fallback.d.ts +1 -1
  239. package/dist/enrichment/index.d.ts +1 -1
  240. package/dist/entity-retrieval.d.ts +2 -2
  241. package/dist/entity-retrieval.js +33 -12
  242. package/dist/entity-schema.d.ts +1 -1
  243. package/dist/explicit-capture.d.ts +9 -9
  244. package/dist/explicit-capture.js +7 -4
  245. package/dist/external-wiki-access.d.ts +22 -21
  246. package/dist/external-wiki-access.js +56 -51
  247. package/dist/external-wiki-collection-registration.d.ts +1 -1
  248. package/dist/external-wiki-collection.d.ts +1 -1
  249. package/dist/external-wiki-mcp-tools.d.ts +22 -21
  250. package/dist/extraction-error-classification.d.ts +1 -1
  251. package/dist/extraction-faithfulness.d.ts +1 -1
  252. package/dist/extraction-faithfulness.js +2 -2
  253. package/dist/extraction-judge-telemetry.d.ts +1 -1
  254. package/dist/extraction-judge-training.d.ts +1 -1
  255. package/dist/extraction-judge.d.ts +1 -1
  256. package/dist/extraction-judge.js +2 -2
  257. package/dist/extraction-liveness.d.ts +1 -1
  258. package/dist/extraction-normalization.d.ts +1 -1
  259. package/dist/extraction-prompt.d.ts +1 -1
  260. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  261. package/dist/extraction-source-grounding.d.ts +1 -1
  262. package/dist/extraction.d.ts +1 -1
  263. package/dist/extraction.js +35 -19
  264. package/dist/fallback-llm.d.ts +14 -1
  265. package/dist/fallback-llm.js +1 -1
  266. package/dist/{first-start-migration-626C5554.js → first-start-migration-CRZCZAJN.js} +11 -3
  267. package/dist/first-start-migration-CRZCZAJN.js.map +1 -0
  268. package/dist/graph-dashboard-diff.d.ts +1 -1
  269. package/dist/graph-dashboard-key.d.ts +1 -1
  270. package/dist/graph-dashboard-parser.d.ts +1 -1
  271. package/dist/graph-edge-reinforcement.d.ts +1 -1
  272. package/dist/graph-path-reconstruction.d.ts +1 -1
  273. package/dist/graph-path-scoring.d.ts +1 -1
  274. package/dist/graph-snapshot.d.ts +1 -1
  275. package/dist/graph.d.ts +1 -1
  276. package/dist/harmonic-retrieval.js +1 -1
  277. package/dist/importance.d.ts +1 -1
  278. package/dist/importers/index.d.ts +1 -1
  279. package/dist/in-flight-reads.d.ts +1 -1
  280. package/dist/index.d.ts +314 -308
  281. package/dist/index.js +304 -133
  282. package/dist/inline-script.d.ts +3 -0
  283. package/dist/inline-script.js +8 -0
  284. package/dist/inline-script.js.map +1 -0
  285. package/dist/intent.d.ts +1 -1
  286. package/dist/lcm/engine.d.ts +1 -1
  287. package/dist/lcm/engine.js +3 -3
  288. package/dist/lcm/index.d.ts +1 -1
  289. package/dist/lcm/index.js +6 -6
  290. package/dist/lcm/tools.d.ts +1 -1
  291. package/dist/lifecycle.d.ts +1 -1
  292. package/dist/live-connectors-runner.d.ts +1 -1
  293. package/dist/local-llm.d.ts +2 -1
  294. package/dist/local-llm.js +2 -2
  295. package/dist/local-model-endpoint.d.ts +1 -1
  296. package/dist/maintenance/memory-governance.d.ts +1 -1
  297. package/dist/maintenance/memory-governance.js +33 -12
  298. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  299. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +33 -12
  300. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  301. package/dist/maintenance/rebuild-memory-projection.js +34 -13
  302. package/dist/{maintenance-BJzNIKBE.d.ts → maintenance-C8aRWfhq.d.ts} +3 -3
  303. package/dist/mcp-memory-inspector-app.d.ts +22 -21
  304. package/dist/mcp-read-only-tools.js +1 -1
  305. package/dist/memory-action-policy.d.ts +1 -1
  306. package/dist/memory-cache.d.ts +1 -1
  307. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  308. package/dist/memory-projection-mutations.js +2 -2
  309. package/dist/memory-projection-store.d.ts +6 -2
  310. package/dist/memory-projection-store.js +1 -1
  311. package/dist/memory-provenance.d.ts +1 -1
  312. package/dist/memory-snapshot.d.ts +1 -1
  313. package/dist/memory-worth-outcomes.d.ts +2 -2
  314. package/dist/models-json.d.ts +1 -1
  315. package/dist/namespaces/migrate.d.ts +3 -3
  316. package/dist/namespaces/migrate.js +24 -23
  317. package/dist/namespaces/principal.d.ts +1 -1
  318. package/dist/namespaces/search.d.ts +1 -1
  319. package/dist/namespaces/search.js +8 -8
  320. package/dist/namespaces/storage.d.ts +3 -3
  321. package/dist/namespaces/storage.js +33 -12
  322. package/dist/native-knowledge.d.ts +1 -1
  323. package/dist/offline-sync-file-io.d.ts +20 -0
  324. package/dist/offline-sync-file-io.js +18 -0
  325. package/dist/offline-sync-file-io.js.map +1 -0
  326. package/dist/offline-sync-impression-drain.d.ts +1 -1
  327. package/dist/offline-sync-impression-drain.js +5 -5
  328. package/dist/offline-sync.d.ts +8 -6
  329. package/dist/offline-sync.js +2 -1
  330. package/dist/operator-doctor-corpus.d.ts +1 -1
  331. package/dist/operator-doctor-corpus.js +26 -25
  332. package/dist/operator-doctor-replica.d.ts +1 -1
  333. package/dist/operator-toolkit.d.ts +3 -3
  334. package/dist/operator-toolkit.js +39 -36
  335. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  336. package/dist/orchestration/maintenance.d.ts +4 -4
  337. package/dist/orchestration/maintenance.js +38 -18
  338. package/dist/{orchestrator-BiXgBJBQ.d.ts → orchestrator-D85CzDDY.d.ts} +11 -8
  339. package/dist/orchestrator.d.ts +9 -9
  340. package/dist/orchestrator.js +117 -109
  341. package/dist/patterns-cli.d.ts +1 -1
  342. package/dist/{pipeline-sz_dcuLg.d.ts → pipeline-DPcUifCO.d.ts} +1 -1
  343. package/dist/policy-runtime.d.ts +1 -1
  344. package/dist/proactive-contention.d.ts +1 -1
  345. package/dist/provenance.d.ts +1 -1
  346. package/dist/public-http-D-SyWNj6.d.ts +25 -0
  347. package/dist/{purge-533FZLS4.js → purge-GB7PZHT2.js} +2 -2
  348. package/dist/{qmd-eAWObK4M.d.ts → qmd-dFCHp1r0.d.ts} +1 -1
  349. package/dist/qmd-preflight.d.ts +2 -2
  350. package/dist/qmd-recall-cache.d.ts +1 -1
  351. package/dist/qmd.d.ts +2 -2
  352. package/dist/recall-concurrency-config.d.ts +1 -1
  353. package/dist/recall-disclosure-escalation.d.ts +1 -1
  354. package/dist/recall-explain-renderer.d.ts +1 -1
  355. package/dist/recall-explain-renderer.js +3 -3
  356. package/dist/recall-memory-map.d.ts +1 -1
  357. package/dist/recall-planner-llm.d.ts +1 -1
  358. package/dist/recall-planner-llm.js +1 -1
  359. package/dist/recall-state.d.ts +1 -1
  360. package/dist/recall-tag-filter.d.ts +1 -1
  361. package/dist/recall-timings.d.ts +1 -1
  362. package/dist/recall-xray-cli.d.ts +1 -1
  363. package/dist/recall-xray-cli.js +4 -4
  364. package/dist/recall-xray-renderer.d.ts +1 -1
  365. package/dist/recall-xray-renderer.js +3 -3
  366. package/dist/recall-xray.d.ts +1 -1
  367. package/dist/recall-xray.js +2 -2
  368. package/dist/reconcile/cursor.d.ts +2 -1
  369. package/dist/reconcile/manifest.d.ts +2 -1
  370. package/dist/reconcile/manifest.js +6 -5
  371. package/dist/reconcile/plan.d.ts +2 -1
  372. package/dist/reconcile/plan.js +3 -2
  373. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  374. package/dist/replay/normalizers/claude.d.ts +1 -1
  375. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  376. package/dist/replay/normalizers/shared.d.ts +1 -1
  377. package/dist/replay/runner.d.ts +1 -1
  378. package/dist/replay/types.d.ts +1 -1
  379. package/dist/replica-divergence.d.ts +1 -1
  380. package/dist/replica-peers-config.d.ts +1 -1
  381. package/dist/resolve-auth-token.d.ts +1 -1
  382. package/dist/resume-bundles.js +5 -3
  383. package/dist/retrieval-agents.d.ts +2 -2
  384. package/dist/retrieval-tiers.d.ts +1 -1
  385. package/dist/routing/engine.d.ts +1 -1
  386. package/dist/routing/store.d.ts +1 -1
  387. package/dist/salvage-envelope.d.ts +1 -1
  388. package/dist/schemas.d.ts +38 -38
  389. package/dist/{scope-profiles-BBQsXuyj.d.ts → scope-profiles-DICK7GtN.d.ts} +1 -1
  390. package/dist/search/embed-helper.d.ts +1 -1
  391. package/dist/search/factory.d.ts +1 -1
  392. package/dist/search/factory.js +6 -6
  393. package/dist/search/index.d.ts +1 -1
  394. package/dist/search/index.js +12 -12
  395. package/dist/search/lancedb-backend.d.ts +1 -1
  396. package/dist/search/meilisearch-backend.d.ts +1 -1
  397. package/dist/search/noop-backend.d.ts +1 -1
  398. package/dist/search/orama-backend.d.ts +1 -1
  399. package/dist/search/port.d.ts +1 -1
  400. package/dist/search/remote-backend.d.ts +1 -1
  401. package/dist/{semantic-consolidation-HD8RkzVA.d.ts → semantic-consolidation-BP7NAX0N.d.ts} +1 -1
  402. package/dist/semantic-consolidation.d.ts +2 -2
  403. package/dist/semantic-consolidation.js +34 -13
  404. package/dist/semantic-rule-promotion.js +33 -12
  405. package/dist/semantic-rule-verifier.d.ts +1 -1
  406. package/dist/semantic-rule-verifier.js +33 -12
  407. package/dist/{service-DIrtHHEg.d.ts → service-DT-pJyda.d.ts} +660 -660
  408. package/dist/session-observer-bands.d.ts +1 -1
  409. package/dist/session-observer-state.d.ts +1 -1
  410. package/dist/shared-context/manager.d.ts +1 -1
  411. package/dist/signal.d.ts +1 -1
  412. package/dist/source-agent-qualifier.d.ts +1 -1
  413. package/dist/source-agent-qualifier.js +31 -15
  414. package/dist/{storage-DqCzXi56.d.ts → storage-qOnaJ1Lw.d.ts} +49 -13
  415. package/dist/storage.d.ts +2 -2
  416. package/dist/storage.js +33 -12
  417. package/dist/summarizer.d.ts +1 -1
  418. package/dist/summarizer.js +5 -5
  419. package/dist/summary-snapshot.d.ts +1 -1
  420. package/dist/support-passport/index.d.ts +518 -0
  421. package/dist/support-passport/index.js +357 -0
  422. package/dist/support-passport/index.js.map +1 -0
  423. package/dist/temporal-supersession.d.ts +2 -2
  424. package/dist/temporal-timeline-recall.d.ts +1 -1
  425. package/dist/temporal-validity.d.ts +1 -1
  426. package/dist/threading.d.ts +1 -1
  427. package/dist/tier-migration.d.ts +2 -2
  428. package/dist/tier-routing.d.ts +2 -2
  429. package/dist/tier-routing.js +7 -1
  430. package/dist/{tier-stats-2JCZYEF7.js → tier-stats-EXYSKSVN.js} +8 -2
  431. package/dist/{tier-stats-2JCZYEF7.js.map → tier-stats-EXYSKSVN.js.map} +1 -1
  432. package/dist/topics.d.ts +1 -1
  433. package/dist/transcript.d.ts +1 -1
  434. package/dist/transfer/autodetect.js +1 -1
  435. package/dist/transfer/backup.js +1 -1
  436. package/dist/transfer/capsule-export.js +2 -2
  437. package/dist/transfer/types.d.ts +36 -36
  438. package/dist/trust-score-stage.d.ts +1 -1
  439. package/dist/trust-score.d.ts +1 -1
  440. package/dist/{types-d_j4vC6N.d.ts → types-ed-SvS2t.d.ts} +8 -1
  441. package/dist/types.d.ts +1 -1
  442. package/dist/types.js +1 -1
  443. package/dist/utility-runtime.d.ts +2 -2
  444. package/dist/verified-recall.js +33 -12
  445. package/dist/write-envelope.d.ts +1 -1
  446. package/dist/write-rate-limiter.d.ts +11 -5
  447. package/dist/write-rate-limiter.js +1 -1
  448. package/package.json +12 -2
  449. package/scripts/build-with-heap.mjs +11 -1
  450. package/src/access-authorization-probe.ts +20 -2
  451. package/src/access-boundary.ts +32 -0
  452. package/src/access-http.test.ts +1971 -643
  453. package/src/access-http.ts +81 -74
  454. package/src/access-mcp.ts +3 -1
  455. package/src/access-memory-search-fanout.ts +24 -1
  456. package/src/access-offline-manifest.ts +5 -0
  457. package/src/access-operations.ts +2 -0
  458. package/src/access-service-namespace.test.ts +14 -0
  459. package/src/access-service-observe-scope.test.ts +2 -0
  460. package/src/access-service-offline-file-content.test.ts +211 -0
  461. package/src/access-service.ts +628 -884
  462. package/src/access-surface-catalog.test.ts +40 -10
  463. package/src/access-surface-catalog.ts +15 -0
  464. package/src/active-memory-bridge.test.ts +151 -0
  465. package/src/active-memory-bridge.ts +95 -21
  466. package/src/briefing.test.ts +38 -0
  467. package/src/briefing.ts +3 -3
  468. package/src/cli.ts +6 -1
  469. package/src/config.ts +18 -9
  470. package/src/connectors/codex-materialize-runner.ts +2 -0
  471. package/src/contradiction/contradiction-scan.ts +2 -0
  472. package/src/contradiction/contradiction.test.ts +42 -0
  473. package/src/correction/correction-access-wiring.ts +8 -2
  474. package/src/correction/correction-storage-integration.test.ts +7 -0
  475. package/src/explicit-capture.test.ts +24 -0
  476. package/src/explicit-capture.ts +2 -0
  477. package/src/fallback-llm.test.ts +54 -0
  478. package/src/fallback-llm.ts +54 -9
  479. package/src/index.ts +3 -0
  480. package/src/inline-script.ts +6 -0
  481. package/src/local-llm-headers-timeout.test.ts +42 -0
  482. package/src/local-llm.ts +8 -8
  483. package/src/maintenance/first-start-migration.ts +2 -1
  484. package/src/maintenance/memory-governance.test.ts +25 -0
  485. package/src/maintenance/memory-governance.ts +4 -1
  486. package/src/maintenance/pattern-reinforcement.test.ts +20 -0
  487. package/src/maintenance/pattern-reinforcement.ts +2 -1
  488. package/src/maintenance/rebuild-memory-projection.ts +8 -8
  489. package/src/mcp-read-only-tools.ts +3 -0
  490. package/src/memory-projection-store.ts +25 -27
  491. package/src/offline-sync-file-io.ts +68 -0
  492. package/src/offline-sync.ts +43 -57
  493. package/src/orchestration/consolidation-run.ts +5 -4
  494. package/src/orchestration/contradiction-linking-coordinator.ts +7 -0
  495. package/src/orchestration/contradiction-localization.integration.test.ts +115 -0
  496. package/src/orchestration/lifecycle-policy-coordinator.ts +2 -1
  497. package/src/orchestration/qmd-result-resolver.test.ts +215 -14
  498. package/src/orchestration/qmd-result-resolver.ts +142 -82
  499. package/src/orchestration/recall-search-pipeline.test.ts +41 -0
  500. package/src/orchestration/recall-search-pipeline.ts +12 -0
  501. package/src/orchestration/semantic-consolidation-coordinator.ts +2 -1
  502. package/src/orchestration/tier-migration-coordinator.ts +23 -56
  503. package/src/orchestration/workspace-ops.test.ts +37 -0
  504. package/src/orchestration/workspace-ops.ts +5 -29
  505. package/src/orchestrator.ts +7 -8
  506. package/src/relay/mission-access.test.ts +11 -11
  507. package/src/relay/mission-ui.test.ts +3 -1
  508. package/src/storage/supersession-audit.ts +7 -1
  509. package/src/storage/supersession-side-effects.ts +17 -5
  510. package/src/storage/tombstone-blocked-capture-sync.ts +31 -0
  511. package/src/storage-contract/failure-semantics.test.ts +102 -0
  512. package/src/storage.ts +18 -19
  513. package/src/support-passport/access-http-base.ts +143 -0
  514. package/src/support-passport/access-http.ts +172 -0
  515. package/src/support-passport/access-operations.ts +272 -0
  516. package/src/support-passport/access-service-base.test.ts +193 -0
  517. package/src/support-passport/access-service-base.ts +176 -0
  518. package/src/support-passport/access-surface.test.ts +283 -0
  519. package/src/support-passport/access-surface.ts +286 -0
  520. package/src/support-passport/card-projection.test.ts +137 -0
  521. package/src/support-passport/card-projection.ts +348 -0
  522. package/src/support-passport/card-replacement.ts +126 -0
  523. package/src/support-passport/card-service-commit-forwarding.test.ts +160 -0
  524. package/src/support-passport/card-service.test.ts +2964 -0
  525. package/src/support-passport/card-service.ts +1184 -0
  526. package/src/support-passport/card-state.ts +158 -0
  527. package/src/support-passport/config-model-routing.test.ts +37 -0
  528. package/src/support-passport/config.test.ts +34 -0
  529. package/src/support-passport/config.ts +41 -0
  530. package/src/support-passport/contracts.test.ts +156 -0
  531. package/src/support-passport/contracts.ts +149 -0
  532. package/src/support-passport/errors.ts +30 -0
  533. package/src/support-passport/generated-batch.test.ts +185 -0
  534. package/src/support-passport/generated-batch.ts +338 -0
  535. package/src/support-passport/grant-contracts.ts +183 -0
  536. package/src/support-passport/grant-generated-batch-scope.test.ts +201 -0
  537. package/src/support-passport/grant-service-cache.test.ts +148 -0
  538. package/src/support-passport/grant-service-cancellation.test.ts +83 -0
  539. package/src/support-passport/grant-service-marker-cache.test.ts +62 -0
  540. package/src/support-passport/grant-service.test.ts +3496 -0
  541. package/src/support-passport/grant-service.ts +513 -0
  542. package/src/support-passport/grant-store-commit-hook.test.ts +123 -0
  543. package/src/support-passport/grant-store-order.test.ts +60 -0
  544. package/src/support-passport/grant-store-path-safety.test.ts +30 -0
  545. package/src/support-passport/grant-store-recovery.test.ts +448 -0
  546. package/src/support-passport/grant-store.ts +906 -0
  547. package/src/support-passport/index.ts +17 -0
  548. package/src/support-passport/mcp-tools.test.ts +222 -0
  549. package/src/support-passport/mcp-tools.ts +187 -0
  550. package/src/support-passport/model-adapter.test.ts +840 -0
  551. package/src/support-passport/model-adapter.ts +602 -0
  552. package/src/support-passport/model-audit-pinned-write.test.ts +59 -0
  553. package/src/support-passport/model-audit.ts +152 -0
  554. package/src/support-passport/model-bridge.test.ts +456 -0
  555. package/src/support-passport/model-bridge.ts +439 -0
  556. package/src/support-passport/model-contracts.ts +124 -0
  557. package/src/support-passport/model-service.test.ts +1731 -0
  558. package/src/support-passport/model-service.ts +399 -0
  559. package/src/support-passport/offline-sync-guard.ts +230 -0
  560. package/src/support-passport/owner-http.test.ts +671 -0
  561. package/src/support-passport/owner-lock.ts +70 -0
  562. package/src/support-passport/private-file.test.ts +99 -0
  563. package/src/support-passport/private-file.ts +498 -0
  564. package/src/support-passport/public-http.test.ts +476 -0
  565. package/src/support-passport/public-http.ts +601 -0
  566. package/src/support-passport/ui.test.ts +181 -0
  567. package/src/tier-routing.ts +28 -17
  568. package/src/training-export/converter.test.ts +24 -0
  569. package/src/training-export/converter.ts +2 -0
  570. package/src/types.ts +8 -1
  571. package/src/wearables/service.test.ts +13 -0
  572. package/src/wearables/service.ts +2 -0
  573. package/src/write-rate-limiter.test.ts +30 -6
  574. package/src/write-rate-limiter.ts +29 -18
  575. package/dist/chunk-3CSX3ETE.js.map +0 -1
  576. package/dist/chunk-47P3RYZP.js.map +0 -1
  577. package/dist/chunk-6LAPLZOS.js.map +0 -1
  578. package/dist/chunk-6R4G7N4S.js.map +0 -1
  579. package/dist/chunk-7BZOBA5J.js.map +0 -1
  580. package/dist/chunk-C23BYTJV.js.map +0 -1
  581. package/dist/chunk-CYF6WVE7.js.map +0 -1
  582. package/dist/chunk-G2LUMAUF.js.map +0 -1
  583. package/dist/chunk-GYPQL6XN.js.map +0 -1
  584. package/dist/chunk-JDZPNCMA.js.map +0 -1
  585. package/dist/chunk-JV5YUBIZ.js.map +0 -1
  586. package/dist/chunk-K4QS7LXU.js.map +0 -1
  587. package/dist/chunk-L6CQ7WIW.js.map +0 -1
  588. package/dist/chunk-MKQBXQKU.js.map +0 -1
  589. package/dist/chunk-NH5IR2WM.js.map +0 -1
  590. package/dist/chunk-PX2LSHYM.js.map +0 -1
  591. package/dist/chunk-QWGE2PUH.js.map +0 -1
  592. package/dist/chunk-RUMNY5DT.js.map +0 -1
  593. package/dist/chunk-S75M5ZRK.js.map +0 -1
  594. package/dist/chunk-T2JHZWH6.js.map +0 -1
  595. package/dist/chunk-UES4BHA2.js.map +0 -1
  596. package/dist/chunk-UTRO5UJU.js.map +0 -1
  597. package/dist/chunk-UU3G6GUP.js.map +0 -1
  598. package/dist/chunk-XUAMCLY4.js.map +0 -1
  599. package/dist/chunk-ZYLC7NFO.js.map +0 -1
  600. package/dist/contradiction-scan-HYLIRMJ2.js +0 -14
  601. package/dist/first-start-migration-626C5554.js.map +0 -1
  602. /package/dist/{auto-sync-TDHLZPVP.js.map → auto-sync-NR3GPCOA.js.map} +0 -0
  603. /package/dist/{chunk-LLJMAULE.js.map → chunk-2FKEIPIT.js.map} +0 -0
  604. /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
  605. /package/dist/{chunk-PDDTI7IC.js.map → chunk-43SEBY2M.js.map} +0 -0
  606. /package/dist/{chunk-HWRD23DW.js.map → chunk-46SZBVDS.js.map} +0 -0
  607. /package/dist/{chunk-6HPHEFXT.js.map → chunk-5FD7JMTX.js.map} +0 -0
  608. /package/dist/{chunk-IBKR2TFR.js.map → chunk-6CYHUWCO.js.map} +0 -0
  609. /package/dist/{chunk-YN6ASZUG.js.map → chunk-6QPI2ITJ.js.map} +0 -0
  610. /package/dist/{chunk-NIS256NW.js.map → chunk-CIAI24TQ.js.map} +0 -0
  611. /package/dist/{chunk-7FGL6CGA.js.map → chunk-DVYRD4HY.js.map} +0 -0
  612. /package/dist/{chunk-G7Z6EENO.js.map → chunk-EKTP7MNS.js.map} +0 -0
  613. /package/dist/{chunk-RZ4XGKOJ.js.map → chunk-FFRTNF3L.js.map} +0 -0
  614. /package/dist/{chunk-VKXWK44Q.js.map → chunk-FONWBCVY.js.map} +0 -0
  615. /package/dist/{chunk-DZD576ZU.js.map → chunk-FPLM2TKD.js.map} +0 -0
  616. /package/dist/{chunk-ZPJ4QSGP.js.map → chunk-FTPONF6B.js.map} +0 -0
  617. /package/dist/{chunk-LJS7KUPV.js.map → chunk-FWX7W5PM.js.map} +0 -0
  618. /package/dist/{chunk-G4T7L557.js.map → chunk-GN3WRFJY.js.map} +0 -0
  619. /package/dist/{chunk-QT2FRYI4.js.map → chunk-H7NAZ3UB.js.map} +0 -0
  620. /package/dist/{chunk-APPFNGX6.js.map → chunk-HBUFQRIM.js.map} +0 -0
  621. /package/dist/{chunk-UU7TRFNE.js.map → chunk-HGJ6NJ4E.js.map} +0 -0
  622. /package/dist/{chunk-C4ZNGVK3.js.map → chunk-IKP5OYQQ.js.map} +0 -0
  623. /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  624. /package/dist/{chunk-RDJRFDJY.js.map → chunk-IQ4NVWEF.js.map} +0 -0
  625. /package/dist/{chunk-CGVHPCP2.js.map → chunk-JYG4OLWH.js.map} +0 -0
  626. /package/dist/{chunk-WOPA3SGI.js.map → chunk-K26NWEOC.js.map} +0 -0
  627. /package/dist/{chunk-G7A5HLUS.js.map → chunk-KJH6W2I7.js.map} +0 -0
  628. /package/dist/{chunk-HOIRB77A.js.map → chunk-L6Z5OAS4.js.map} +0 -0
  629. /package/dist/{chunk-227UFSEQ.js.map → chunk-LEPOP46W.js.map} +0 -0
  630. /package/dist/{chunk-3JLPGJ43.js.map → chunk-MIH3CJPN.js.map} +0 -0
  631. /package/dist/{chunk-QHFV6VNU.js.map → chunk-MK5VEWCR.js.map} +0 -0
  632. /package/dist/{chunk-GUKBW4HL.js.map → chunk-NQMSEB5D.js.map} +0 -0
  633. /package/dist/{chunk-WRJVB3C2.js.map → chunk-PO7NXBG2.js.map} +0 -0
  634. /package/dist/{chunk-AZM4CCAC.js.map → chunk-QZLDRQ4I.js.map} +0 -0
  635. /package/dist/{chunk-THPPCISA.js.map → chunk-RBII7637.js.map} +0 -0
  636. /package/dist/{chunk-VMMQDEN5.js.map → chunk-TO7ZTWJW.js.map} +0 -0
  637. /package/dist/{chunk-K2TDK7GG.js.map → chunk-TWTUGCTY.js.map} +0 -0
  638. /package/dist/{chunk-HLYR2TQL.js.map → chunk-UCTS3DDH.js.map} +0 -0
  639. /package/dist/{chunk-JYIJNNN3.js.map → chunk-UG6VXIOK.js.map} +0 -0
  640. /package/dist/{chunk-WM65LU67.js.map → chunk-UKYS3NU5.js.map} +0 -0
  641. /package/dist/{chunk-WDBX6VER.js.map → chunk-UPLZNJKN.js.map} +0 -0
  642. /package/dist/{chunk-2GFK22OZ.js.map → chunk-V6ERBR7U.js.map} +0 -0
  643. /package/dist/{chunk-ZMYDYNI4.js.map → chunk-XZHE2DEN.js.map} +0 -0
  644. /package/dist/{chunk-MAXVH44E.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  645. /package/dist/{chunk-YGLY6QFV.js.map → chunk-ZRZVLB7O.js.map} +0 -0
  646. /package/dist/{chunk-4IIFL7GC.js.map → chunk-ZUKIUXHQ.js.map} +0 -0
  647. /package/dist/{contradiction-scan-HYLIRMJ2.js.map → contradiction-scan-JDTBXRGW.js.map} +0 -0
  648. /package/dist/{purge-533FZLS4.js.map → purge-GB7PZHT2.js.map} +0 -0
@@ -0,0 +1,685 @@
1
+ (function attachWhatHelpsMeModel(globalScope) {
2
+ const CARD_CATEGORIES = Object.freeze([
3
+ "communication",
4
+ "environment",
5
+ "transitions",
6
+ "sensory",
7
+ "regulation",
8
+ "interests",
9
+ "other",
10
+ ]);
11
+ const CARD_STATUSES = Object.freeze(["pending_review", "active", "rejected", "superseded", "archived"]);
12
+ const SHARE_REQUEST_MARGIN_MS = 60_000;
13
+ const CATEGORY_LABELS = Object.freeze({
14
+ communication: "Communication",
15
+ environment: "Environment",
16
+ transitions: "Changes and transitions",
17
+ sensory: "Sensory comfort",
18
+ regulation: "Feeling settled",
19
+ interests: "Interests and connection",
20
+ other: "Other support",
21
+ });
22
+ const LOCK_STATES = Object.freeze({
23
+ bad_link: {
24
+ key: "bad-link",
25
+ eyebrow: "Share link not found",
26
+ title: "This link does not open a support passport.",
27
+ detail: "Ask the person who shared it for a new link.",
28
+ },
29
+ expired: {
30
+ key: "expired",
31
+ eyebrow: "Share time ended",
32
+ title: "This share link has expired.",
33
+ detail: "Ask the person for a new link if they still want to share.",
34
+ },
35
+ stopped: {
36
+ key: "stopped",
37
+ eyebrow: "Sharing stopped",
38
+ title: "This support passport is locked.",
39
+ detail: "The person controls this guide and has ended this share link.",
40
+ },
41
+ session_ended: {
42
+ key: "session-ended",
43
+ eyebrow: "Session ended",
44
+ title: "This helper session ended.",
45
+ detail: "Open the original share link again to view this support passport.",
46
+ },
47
+ stale: {
48
+ key: "stale",
49
+ eyebrow: "Guide changed",
50
+ title: "This share link is no longer current.",
51
+ detail: "Ask the person for a new link with the support cards they choose.",
52
+ },
53
+ error: {
54
+ key: "error",
55
+ eyebrow: "Guide unavailable",
56
+ title: "The support passport did not load.",
57
+ detail: "Check the connection and try this link again.",
58
+ },
59
+ });
60
+ const REPLAY_NOTES = Object.freeze([
61
+ Object.freeze({
62
+ memoryId: "synthetic-note-light",
63
+ content: "Bright lights make it hard for me to think.",
64
+ }),
65
+ Object.freeze({
66
+ memoryId: "synthetic-note-change",
67
+ content: "Tell me before plans change.",
68
+ }),
69
+ Object.freeze({
70
+ memoryId: "synthetic-note-quiet",
71
+ content: "If I stop speaking, offer a quiet place and time.",
72
+ }),
73
+ ]);
74
+ const REPLAY_DRAFTS = Object.freeze([
75
+ Object.freeze({
76
+ title: "Lighting",
77
+ statement: "Bright lights make it hard for me to think.",
78
+ category: "sensory",
79
+ }),
80
+ Object.freeze({
81
+ title: "Plan changes",
82
+ statement: "Tell me before plans change.",
83
+ category: "transitions",
84
+ }),
85
+ Object.freeze({
86
+ title: "When I stop speaking",
87
+ statement: "If I stop speaking, offer a quiet place and time.",
88
+ category: "communication",
89
+ }),
90
+ ]);
91
+
92
+ function isObject(value) {
93
+ return value !== null && typeof value === "object" && !Array.isArray(value);
94
+ }
95
+
96
+ function hasExactKeys(value, keys) {
97
+ if (!isObject(value)) return false;
98
+ const actual = Object.keys(value).sort();
99
+ const expected = [...keys].sort();
100
+ return actual.length === expected.length && actual.every((key, index) => key === expected[index]);
101
+ }
102
+
103
+ function isIsoTimestamp(value) {
104
+ return typeof value === "string" && Number.isFinite(Date.parse(value));
105
+ }
106
+
107
+ function isMemoryId(value) {
108
+ return typeof value === "string" && /^[A-Za-z0-9._:-]{1,128}$/.test(value);
109
+ }
110
+
111
+ function isGrantId(value) {
112
+ return (
113
+ typeof value === "string" &&
114
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value)
115
+ );
116
+ }
117
+
118
+ function isRevision(value) {
119
+ return typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
120
+ }
121
+
122
+ function assertCard(value) {
123
+ const keys = ["cardId", "title", "statement", "category", "status", "updatedAt", "reviewBy", "revision"];
124
+ if (!hasExactKeys(value, keys)) throw new Error("The support card response has an unexpected shape.");
125
+ if (
126
+ !isMemoryId(value.cardId) ||
127
+ typeof value.title !== "string" ||
128
+ value.title.length < 1 ||
129
+ value.title.length > 80
130
+ ) {
131
+ throw new Error("The support card response is invalid.");
132
+ }
133
+ if (typeof value.statement !== "string" || value.statement.length < 1 || value.statement.length > 500) {
134
+ throw new Error("The support card response is invalid.");
135
+ }
136
+ if (!CARD_CATEGORIES.includes(value.category) || !CARD_STATUSES.includes(value.status)) {
137
+ throw new Error("The support card response is invalid.");
138
+ }
139
+ if (!isIsoTimestamp(value.updatedAt) || !isIsoTimestamp(value.reviewBy) || !isRevision(value.revision)) {
140
+ throw new Error("The support card response is invalid.");
141
+ }
142
+ return value;
143
+ }
144
+
145
+ function parseCardList(payload) {
146
+ if (!hasExactKeys(payload, ["cards"]) || !Array.isArray(payload.cards) || payload.cards.length > 100) {
147
+ throw new Error("The support card list has an unexpected shape.");
148
+ }
149
+ const cards = payload.cards.map(assertCard);
150
+ if (new Set(cards.map((card) => card.cardId)).size !== cards.length) {
151
+ throw new Error("The support card list contains duplicate cards.");
152
+ }
153
+ return cards;
154
+ }
155
+
156
+ function parseMemoryPreview(payload) {
157
+ if (hasExactKeys(payload, ["found"]) && payload.found === false) return payload;
158
+ if (!hasExactKeys(payload, ["found", "memory"]) || payload.found !== true) {
159
+ throw new Error("The selected note response has an unexpected shape.");
160
+ }
161
+ if (
162
+ !hasExactKeys(payload.memory, ["id", "content", "revision"]) ||
163
+ !isMemoryId(payload.memory.id) ||
164
+ typeof payload.memory.content !== "string" ||
165
+ payload.memory.content.length < 1 ||
166
+ payload.memory.content.length > 20_000 ||
167
+ !isRevision(payload.memory.revision)
168
+ ) {
169
+ throw new Error("The selected note response is invalid.");
170
+ }
171
+ return payload;
172
+ }
173
+
174
+ function assertGrant(value) {
175
+ const required = ["grantId", "stateVersion", "cards", "createdAt", "expiresAt", "status"];
176
+ const optional = value?.revokedAt === undefined ? [] : ["revokedAt"];
177
+ if (!hasExactKeys(value, [...required, ...optional]))
178
+ throw new Error("The share link response has an unexpected shape.");
179
+ if (
180
+ typeof value.grantId !== "string" ||
181
+ !Array.isArray(value.cards) ||
182
+ value.cards.length < 1 ||
183
+ value.cards.length > 8
184
+ ) {
185
+ throw new Error("The share link response is invalid.");
186
+ }
187
+ if (
188
+ !Number.isInteger(value.stateVersion) ||
189
+ value.stateVersion < 1 ||
190
+ !["active", "expired", "revoked"].includes(value.status)
191
+ ) {
192
+ throw new Error("The share link response is invalid.");
193
+ }
194
+ if (
195
+ !isIsoTimestamp(value.createdAt) ||
196
+ !isIsoTimestamp(value.expiresAt) ||
197
+ (value.revokedAt !== undefined && !isIsoTimestamp(value.revokedAt))
198
+ ) {
199
+ throw new Error("The share link response is invalid.");
200
+ }
201
+ for (const card of value.cards) {
202
+ if (!hasExactKeys(card, ["cardId", "revision"]) || !isMemoryId(card.cardId) || !isRevision(card.revision)) {
203
+ throw new Error("The share link response is invalid.");
204
+ }
205
+ }
206
+ return value;
207
+ }
208
+
209
+ function parseGrantList(payload) {
210
+ if (!hasExactKeys(payload, ["grants"]) || !Array.isArray(payload.grants)) {
211
+ throw new Error("The share link list has an unexpected shape.");
212
+ }
213
+ return payload.grants.map(assertGrant);
214
+ }
215
+
216
+ function parseCreatedGrant(payload) {
217
+ if (!hasExactKeys(payload, ["grantId", "secret", "expiresAt", "version"])) {
218
+ throw new Error("The new share link response has an unexpected shape.");
219
+ }
220
+ if (
221
+ !isGrantId(payload.grantId) ||
222
+ typeof payload.secret !== "string" ||
223
+ !/^[A-Za-z0-9_-]{43}$/.test(payload.secret) ||
224
+ !isIsoTimestamp(payload.expiresAt) ||
225
+ !Number.isInteger(payload.version) ||
226
+ payload.version < 1
227
+ ) {
228
+ throw new Error("The new share link response is invalid.");
229
+ }
230
+ return payload;
231
+ }
232
+
233
+ function assertPublicCard(value) {
234
+ const keys = ["cardId", "title", "statement", "category", "updatedAt"];
235
+ if (!hasExactKeys(value, keys) || !isMemoryId(value.cardId)) throw new Error("The public support card is invalid.");
236
+ if (typeof value.title !== "string" || value.title.length < 1 || value.title.length > 80) {
237
+ throw new Error("The public support card is invalid.");
238
+ }
239
+ if (typeof value.statement !== "string" || value.statement.length < 1 || value.statement.length > 500) {
240
+ throw new Error("The public support card is invalid.");
241
+ }
242
+ if (!CARD_CATEGORIES.includes(value.category) || !isIsoTimestamp(value.updatedAt)) {
243
+ throw new Error("The public support card is invalid.");
244
+ }
245
+ return value;
246
+ }
247
+
248
+ function parsePublicGuide(payload) {
249
+ if (!hasExactKeys(payload, ["schemaVersion", "grantId", "expiresAt", "updatedAt", "cards"])) {
250
+ throw new Error("The support passport response has an unexpected shape.");
251
+ }
252
+ if (payload.schemaVersion !== 1 || typeof payload.grantId !== "string") {
253
+ throw new Error("The support passport response is invalid.");
254
+ }
255
+ if (!isIsoTimestamp(payload.expiresAt) || !isIsoTimestamp(payload.updatedAt) || !Array.isArray(payload.cards)) {
256
+ throw new Error("The support passport response is invalid.");
257
+ }
258
+ const cards = payload.cards.map(assertPublicCard);
259
+ if (cards.length < 1 || cards.length > 8 || new Set(cards.map((card) => card.cardId)).size !== cards.length) {
260
+ throw new Error("The support passport response is invalid.");
261
+ }
262
+ return { ...payload, cards };
263
+ }
264
+
265
+ function parseAnswer(payload, guide) {
266
+ if (!hasExactKeys(payload, ["answer", "citedCardIds", "coverage"])) {
267
+ throw new Error("The helper answer has an unexpected shape.");
268
+ }
269
+ if (typeof payload.answer !== "string" || payload.answer.length < 1 || payload.answer.length > 800) {
270
+ throw new Error("The helper answer is invalid.");
271
+ }
272
+ if (!Array.isArray(payload.citedCardIds) || !["grounded", "not_in_guide"].includes(payload.coverage)) {
273
+ throw new Error("The helper answer is invalid.");
274
+ }
275
+ const allowed = new Set(guide.cards.map((card) => card.cardId));
276
+ if (payload.citedCardIds.length > 8 || payload.citedCardIds.some((cardId) => !allowed.has(cardId))) {
277
+ throw new Error("The helper answer cites a card outside this guide.");
278
+ }
279
+ if (new Set(payload.citedCardIds).size !== payload.citedCardIds.length) {
280
+ throw new Error("The helper answer contains duplicate citations.");
281
+ }
282
+ if (payload.coverage === "grounded" && payload.citedCardIds.length === 0) {
283
+ throw new Error("The helper answer needs a support card citation.");
284
+ }
285
+ if (payload.coverage === "not_in_guide" && payload.citedCardIds.length !== 0) {
286
+ throw new Error("An uncovered answer cannot cite a support card.");
287
+ }
288
+ return payload;
289
+ }
290
+
291
+ function parseSecret(hash) {
292
+ if (typeof hash !== "string" || !hash.startsWith("#")) return "";
293
+ const params = new URLSearchParams(hash.slice(1));
294
+ if ([...params.keys()].some((key) => key !== "secret")) return "";
295
+ const secret = params.get("secret") ?? "";
296
+ return /^[A-Za-z0-9_-]{32,256}$/.test(secret) ? secret : "";
297
+ }
298
+
299
+ function buildShareUrl(currentUrl, grantId, secret, replay, replayChannelId = "") {
300
+ const url = new URL(currentUrl);
301
+ url.pathname = "/remnic/ui/what-helps-me/";
302
+ url.search = "";
303
+ url.hash = "";
304
+ url.searchParams.set("grant", grantId);
305
+ if (replay) {
306
+ url.searchParams.set("mode", "replay");
307
+ url.searchParams.set("replayChannel", replayChannelId);
308
+ }
309
+ url.hash = `secret=${encodeURIComponent(secret)}`;
310
+ return url.toString();
311
+ }
312
+
313
+ function lockState(error, lastGuide, now = Date.now()) {
314
+ const code = typeof error?.code === "string" ? error.code : "";
315
+ if (code === "grant_stale") return LOCK_STATES.stale;
316
+ if (code === "grant_not_found" || code === "missing_link") return LOCK_STATES.bad_link;
317
+ if (code === "grant_expired") return LOCK_STATES.expired;
318
+ if (code === "session_ended") return LOCK_STATES.session_ended;
319
+ if (code === "grant_gone") {
320
+ return lastGuide && Date.parse(lastGuide.expiresAt) <= now ? LOCK_STATES.expired : LOCK_STATES.stopped;
321
+ }
322
+ return LOCK_STATES.error;
323
+ }
324
+
325
+ function groupCards(cards) {
326
+ const groups = [];
327
+ for (const category of CARD_CATEGORIES) {
328
+ const matches = cards.filter((card) => card.category === category);
329
+ if (matches.length > 0) groups.push({ category, label: CATEGORY_LABELS[category], cards: matches });
330
+ }
331
+ return groups;
332
+ }
333
+
334
+ function expiryForChoice(choice, customValue, now = Date.now()) {
335
+ const durations = { "30m": 30 * 60_000, "2h": 2 * 60 * 60_000, "1d": 24 * 60 * 60_000 };
336
+ if (Object.hasOwn(durations, choice)) return { durationMs: durations[choice] };
337
+ const timestamp = Date.parse(customValue);
338
+ if (
339
+ !Number.isFinite(timestamp) ||
340
+ timestamp < now + 300_000 + SHARE_REQUEST_MARGIN_MS ||
341
+ timestamp > now + 7 * 24 * 60 * 60_000
342
+ ) {
343
+ throw new Error("Choose a share time at least six minutes from now and no more than seven days away.");
344
+ }
345
+ return { expiresAt: new Date(timestamp).toISOString() };
346
+ }
347
+
348
+ function formatDate(value) {
349
+ if (!isIsoTimestamp(value)) return "Date unavailable";
350
+ return new Intl.DateTimeFormat(undefined, {
351
+ dateStyle: "medium",
352
+ timeStyle: "short",
353
+ }).format(new Date(value));
354
+ }
355
+
356
+ function replayRevision(seed) {
357
+ let output = "";
358
+ let value = 2166136261;
359
+ for (let index = 0; index < seed.length; index += 1) {
360
+ value ^= seed.charCodeAt(index);
361
+ value = Math.imul(value, 16777619);
362
+ }
363
+ for (let index = 0; index < 8; index += 1) {
364
+ value = Math.imul(value ^ index, 2246822519);
365
+ output += (value >>> 0).toString(16).padStart(8, "0");
366
+ }
367
+ return output;
368
+ }
369
+
370
+ function replayId(prefix) {
371
+ if (!globalScope.crypto?.getRandomValues) {
372
+ throw new Error("Synthetic replay needs a secure browser context.");
373
+ }
374
+ const bytes = new Uint8Array(8);
375
+ globalScope.crypto.getRandomValues(bytes);
376
+ return `${prefix}-${[...bytes].map((value) => value.toString(16).padStart(2, "0")).join("")}`;
377
+ }
378
+
379
+ async function replaySecretProof(secret, requestId, grantId) {
380
+ const key = await globalScope.crypto.subtle.importKey(
381
+ "raw",
382
+ new TextEncoder().encode(secret),
383
+ { name: "HMAC", hash: "SHA-256" },
384
+ false,
385
+ ["sign"]
386
+ );
387
+ const signature = await globalScope.crypto.subtle.sign(
388
+ "HMAC",
389
+ key,
390
+ new TextEncoder().encode(`${requestId}:${grantId}`)
391
+ );
392
+ return [...new Uint8Array(signature)].map((value) => value.toString(16).padStart(2, "0")).join("");
393
+ }
394
+
395
+ function equalReplayProof(left, right) {
396
+ if (!/^[a-f0-9]{64}$/.test(left) || !/^[a-f0-9]{64}$/.test(right)) return false;
397
+ let difference = 0;
398
+ for (let index = 0; index < left.length; index += 1) {
399
+ difference |= left.charCodeAt(index) ^ right.charCodeAt(index);
400
+ }
401
+ return difference === 0;
402
+ }
403
+
404
+ function hasMatchingTransitionIntent(cardText, question) {
405
+ const intents = [
406
+ /\bplans?\b/i,
407
+ /\bschedul(?:e|es|ed|ing)\b/i,
408
+ /\broutines?\b/i,
409
+ /\b(?:changes|transitions?|transitioning)\b/i,
410
+ ];
411
+ return intents.some((intent) => intent.test(cardText) && intent.test(question));
412
+ }
413
+
414
+ function hasMatchingQuietSupportIntent(cardText, question) {
415
+ const intents = [
416
+ /\boverwhelm(?:ed|ing|s)?\b/i,
417
+ /\bstop(?:s|ped|ping)? speaking\b/i,
418
+ /\bquiet (?:place|space|room)\b/i,
419
+ /\b(?:shut(?:s|ting)? down|shutdown)\b/i,
420
+ /\bsettle(?:s|d|ing)?\b/i,
421
+ ];
422
+ return intents.some((intent) => intent.test(cardText) && intent.test(question));
423
+ }
424
+
425
+ function createReplayStore(now = () => new Date()) {
426
+ let cards = [];
427
+ let grants = [];
428
+ const secrets = new Map();
429
+ const replacements = new Map();
430
+
431
+ function makeCard(input, status = "pending_review") {
432
+ const updatedAt = now().toISOString();
433
+ const cardId = replayId("replay-card");
434
+ const reviewBy = input.reviewBy || new Date(now().getTime() + 180 * 24 * 60 * 60_000).toISOString();
435
+ return {
436
+ cardId,
437
+ title: input.title,
438
+ statement: input.statement,
439
+ category: input.category,
440
+ status,
441
+ updatedAt,
442
+ reviewBy,
443
+ revision: replayRevision(`${cardId}:${status}:${updatedAt}:${input.statement}`),
444
+ };
445
+ }
446
+
447
+ function publicGuide(grant) {
448
+ const selected = grant.cards.map((reference) =>
449
+ cards.find((card) => card.cardId === reference.cardId && card.revision === reference.revision)
450
+ );
451
+ if (selected.length === 0 || selected.some((card) => !card || card.status !== "active")) {
452
+ const error = new Error("The shared support guide has changed.");
453
+ error.code = "grant_stale";
454
+ throw error;
455
+ }
456
+ return {
457
+ schemaVersion: 1,
458
+ grantId: grant.grantId,
459
+ expiresAt: grant.expiresAt,
460
+ updatedAt: selected.reduce(
461
+ (latest, card) => (card.updatedAt > latest ? card.updatedAt : latest),
462
+ selected[0].updatedAt
463
+ ),
464
+ cards: selected.map(({ cardId, title, statement, category, updatedAt }) => ({
465
+ cardId,
466
+ title,
467
+ statement,
468
+ category,
469
+ updatedAt,
470
+ })),
471
+ };
472
+ }
473
+
474
+ return {
475
+ notes: REPLAY_NOTES.map((note) => ({
476
+ ...note,
477
+ revision: replayRevision(`${note.memoryId}:${note.content}`),
478
+ })),
479
+ async listCards() {
480
+ return {
481
+ cards: cards
482
+ .filter((card) => card.status === "pending_review" || card.status === "active")
483
+ .map((card) => ({ ...card })),
484
+ };
485
+ },
486
+ async createManualDraft(input) {
487
+ const card = makeCard(input);
488
+ cards = [...cards, card];
489
+ return { card: { ...card } };
490
+ },
491
+ async generateDrafts(input) {
492
+ if (input.consent !== true) throw new Error("Consent is required.");
493
+ const created = REPLAY_DRAFTS.map((draft) => makeCard(draft));
494
+ cards = [...cards, ...created];
495
+ return { cards: created.map((card) => ({ ...card })) };
496
+ },
497
+ async replaceCard(cardId, input) {
498
+ const prior = cards.find((card) => card.cardId === cardId && card.revision === input.expectedRevision);
499
+ if (!prior) throw new Error("The support card changed after it was loaded.");
500
+ const card = makeCard(input);
501
+ if (prior.status === "active") replacements.set(card.cardId, prior.cardId);
502
+ else prior.status = "rejected";
503
+ cards = [...cards, card];
504
+ return { card: { ...card } };
505
+ },
506
+ async mutateCard(cardId, input, action) {
507
+ const nextStatus = {
508
+ approve: "active",
509
+ reject: "rejected",
510
+ withdraw: "archived",
511
+ }[action];
512
+ if (!nextStatus) throw new Error("The support card action is invalid.");
513
+ const card = cards.find(
514
+ (candidate) => candidate.cardId === cardId && candidate.revision === input.expectedRevision
515
+ );
516
+ if (!card) throw new Error("The support card changed after it was loaded.");
517
+ const expected = action === "withdraw" ? "active" : "pending_review";
518
+ if (card.status !== expected) throw new Error(`The support card must have status ${expected}.`);
519
+ const invalidatedCardIds = [];
520
+ card.status = nextStatus;
521
+ card.updatedAt = now().toISOString();
522
+ card.revision = replayRevision(`${card.cardId}:${card.status}:${card.updatedAt}:${card.statement}`);
523
+ if (action === "withdraw") invalidatedCardIds.push(card.cardId);
524
+ if (action === "approve" && replacements.has(card.cardId)) {
525
+ const prior = cards.find((candidate) => candidate.cardId === replacements.get(card.cardId));
526
+ if (prior) {
527
+ prior.status = "superseded";
528
+ prior.updatedAt = card.updatedAt;
529
+ prior.revision = replayRevision(`${prior.cardId}:${prior.status}:${prior.updatedAt}:${prior.statement}`);
530
+ invalidatedCardIds.push(prior.cardId);
531
+ }
532
+ replacements.delete(card.cardId);
533
+ }
534
+ return { card: { ...card }, invalidatedCardIds };
535
+ },
536
+ seedSharedGuide(grantId, secret, sharedState) {
537
+ if (!hasExactKeys(sharedState, ["grant", "cards"])) {
538
+ throw new Error("The replay share state is invalid.");
539
+ }
540
+ const sharedGrant = assertGrant(sharedState.grant);
541
+ const sharedCards = parseCardList({ cards: sharedState.cards });
542
+ const cardsById = new Map(sharedCards.map((card) => [card.cardId, card]));
543
+ if (
544
+ sharedGrant.grantId !== grantId ||
545
+ sharedCards.length !== sharedGrant.cards.length ||
546
+ sharedGrant.cards.some((reference) => cardsById.get(reference.cardId)?.revision !== reference.revision)
547
+ ) {
548
+ throw new Error("The replay share state is invalid.");
549
+ }
550
+ cards = sharedCards.map((card) => ({ ...card }));
551
+ grants = [{ ...sharedGrant, cards: sharedGrant.cards.map((card) => ({ ...card })) }];
552
+ secrets.set(grantId, secret);
553
+ },
554
+ async exportSharedGuide(grantId, requestId, proof) {
555
+ const grant = grants.find((candidate) => candidate.grantId === grantId);
556
+ const secret = secrets.get(grantId);
557
+ if (!grant || !secret) return { errorCode: "grant_not_found" };
558
+ const expectedProof = await replaySecretProof(secret, requestId, grantId);
559
+ if (!equalReplayProof(expectedProof, proof)) return { errorCode: "grant_not_found" };
560
+ if (grant.status !== "active") return { errorCode: "grant_gone" };
561
+ const selected = grant.cards.map((reference) =>
562
+ cards.find((card) => card.cardId === reference.cardId && card.revision === reference.revision)
563
+ );
564
+ if (selected.some((card) => !card || card.status !== "active")) return { errorCode: "grant_stale" };
565
+ return {
566
+ grant: { ...grant, cards: grant.cards.map((card) => ({ ...card })) },
567
+ cards: selected.map((card) => ({ ...card })),
568
+ };
569
+ },
570
+ async createGrant(input) {
571
+ const selected = input.cardIds.map((cardId) => cards.find((card) => card.cardId === cardId));
572
+ const revisions = new Map(input.cardRevisions.map((card) => [card.cardId, card.revision]));
573
+ if (
574
+ revisions.size !== input.cardIds.length ||
575
+ selected.some((card) => !card || card.status !== "active" || revisions.get(card.cardId) !== card.revision)
576
+ )
577
+ throw new Error("Only approved support cards can be shared.");
578
+ if (!globalScope.crypto?.randomUUID) {
579
+ throw new Error("Synthetic replay needs a secure browser context.");
580
+ }
581
+ const grantId = globalScope.crypto.randomUUID();
582
+ const secret = replayId("replay-secret").padEnd(43, "x");
583
+ const expiresAt = input.expiresAt ?? new Date(now().getTime() + input.durationMs).toISOString();
584
+ const grant = {
585
+ grantId,
586
+ stateVersion: 1,
587
+ cards: input.cardRevisions.map((card) => ({ ...card })),
588
+ createdAt: now().toISOString(),
589
+ expiresAt,
590
+ status: "active",
591
+ };
592
+ grants = [grant, ...grants];
593
+ secrets.set(grantId, secret);
594
+ return { grantId, secret, expiresAt: grant.expiresAt, version: grant.stateVersion };
595
+ },
596
+ async listGrants() {
597
+ return { grants: grants.map((grant) => ({ ...grant, cards: grant.cards.map((card) => ({ ...card })) })) };
598
+ },
599
+ async revokeGrant(grantId, input) {
600
+ const grant = grants.find(
601
+ (candidate) => candidate.grantId === grantId && candidate.stateVersion === input.expectedVersion
602
+ );
603
+ if (!grant) throw new Error("The share link changed after it was loaded.");
604
+ grant.status = "revoked";
605
+ grant.revokedAt = now().toISOString();
606
+ grant.stateVersion += 1;
607
+ return { grantId, revokedAt: grant.revokedAt, version: grant.stateVersion };
608
+ },
609
+ async readGrant(grantId, secret) {
610
+ const grant = grants.find((candidate) => candidate.grantId === grantId);
611
+ if (!grant || secrets.get(grantId) !== secret) {
612
+ const error = new Error("The share link was not found.");
613
+ error.code = "grant_not_found";
614
+ throw error;
615
+ }
616
+ if (grant.status !== "active") {
617
+ const error = new Error("The share link is no longer active.");
618
+ error.code = "grant_gone";
619
+ throw error;
620
+ }
621
+ if (Date.parse(grant.expiresAt) <= now().getTime()) {
622
+ const error = new Error("The share link has expired.");
623
+ error.code = "grant_expired";
624
+ throw error;
625
+ }
626
+ return publicGuide(grant);
627
+ },
628
+ async askGrant(grantId, secret, question) {
629
+ const guide = await this.readGrant(grantId, secret);
630
+ const transitionCard = guide.cards.find(
631
+ (card) =>
632
+ card.category === "transitions" &&
633
+ hasMatchingTransitionIntent(`${card.title} ${card.statement}`, question)
634
+ );
635
+ if (transitionCard) {
636
+ return {
637
+ answer: transitionCard.statement,
638
+ citedCardIds: [transitionCard.cardId],
639
+ coverage: "grounded",
640
+ };
641
+ }
642
+ const quietCard = guide.cards.find(
643
+ (card) =>
644
+ (card.category === "communication" ||
645
+ card.category === "environment" ||
646
+ card.category === "regulation") &&
647
+ hasMatchingQuietSupportIntent(`${card.title} ${card.statement}`, question)
648
+ );
649
+ if (!quietCard) {
650
+ return {
651
+ answer: "That is not covered in this person's support guide.",
652
+ citedCardIds: [],
653
+ coverage: "not_in_guide",
654
+ };
655
+ }
656
+ return {
657
+ answer: quietCard.statement,
658
+ citedCardIds: [quietCard.cardId],
659
+ coverage: "grounded",
660
+ };
661
+ },
662
+ };
663
+ }
664
+
665
+ globalScope.WhatHelpsMeModel = Object.freeze({
666
+ CARD_CATEGORIES,
667
+ CATEGORY_LABELS,
668
+ LOCK_STATES,
669
+ REPLAY_NOTES,
670
+ buildShareUrl,
671
+ createReplayStore,
672
+ expiryForChoice,
673
+ formatDate,
674
+ groupCards,
675
+ lockState,
676
+ parseAnswer,
677
+ parseCardList,
678
+ parseCreatedGrant,
679
+ parseGrantList,
680
+ parseMemoryPreview,
681
+ parsePublicGuide,
682
+ parseSecret,
683
+ replaySecretProof,
684
+ });
685
+ })(window);