@remnic/core 9.54.5 → 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 (550) hide show
  1. package/dist/access-admin-ops-surface.d.ts +24 -24
  2. package/dist/access-admin-ops-surface.js +32 -29
  3. package/dist/access-authorization-probe.d.ts +25 -23
  4. package/dist/access-authorization-probe.js +35 -30
  5. package/dist/access-boundary.d.ts +26 -24
  6. package/dist/access-boundary.js +36 -31
  7. package/dist/access-cli.js +86 -80
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +19 -19
  11. package/dist/access-extraction-force-flush.js +32 -29
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +22 -22
  14. package/dist/access-http-lifecycle-flush.d.ts +22 -22
  15. package/dist/access-http-offline-stream.d.ts +18 -18
  16. package/dist/access-http-query.js +32 -29
  17. package/dist/access-http.d.ts +55 -37
  18. package/dist/access-http.js +52 -43
  19. package/dist/access-identity-continuity-surface.d.ts +9 -9
  20. package/dist/access-identity-continuity-surface.js +32 -29
  21. package/dist/access-lcm-surface.d.ts +21 -21
  22. package/dist/access-lcm-surface.js +32 -29
  23. package/dist/access-mcp.d.ts +22 -22
  24. package/dist/access-mcp.js +40 -36
  25. package/dist/access-memory-search-fanout.d.ts +2 -2
  26. package/dist/{access-namespace-preflight-BdHlGd_T.d.ts → access-namespace-preflight-CCNn_6NE.d.ts} +1 -1
  27. package/dist/access-namespace-preflight.d.ts +3 -3
  28. package/dist/access-namespace-preflight.js +32 -29
  29. package/dist/access-observe-write-surface.d.ts +22 -22
  30. package/dist/access-observe-write-surface.js +32 -29
  31. package/dist/access-offline-manifest.d.ts +9 -9
  32. package/dist/access-offline-manifest.js +2 -2
  33. package/dist/access-operations-batch.js +34 -31
  34. package/dist/access-operations.d.ts +26 -26
  35. package/dist/access-operations.js +38 -34
  36. package/dist/access-recall-concurrency.d.ts +21 -21
  37. package/dist/access-recall-concurrency.js +32 -29
  38. package/dist/access-recall-response.d.ts +19 -19
  39. package/dist/access-recall-response.js +32 -29
  40. package/dist/access-recall-surface.d.ts +19 -19
  41. package/dist/access-recall-surface.js +32 -29
  42. package/dist/access-schema.d.ts +88 -88
  43. package/dist/access-schema.js +3 -3
  44. package/dist/{access-service-DL7X9hrg.d.ts → access-service-DkSdXK4S.d.ts} +1314 -83
  45. package/dist/access-service-helpers.d.ts +22 -22
  46. package/dist/access-service.d.ts +31 -31
  47. package/dist/access-service.js +32 -29
  48. package/dist/access-surface-catalog.d.ts +22 -22
  49. package/dist/access-surface-catalog.js +209 -2
  50. package/dist/access-surface-catalog.js.map +1 -1
  51. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  52. package/dist/action-confidence.d.ts +1 -1
  53. package/dist/active-memory-bridge.d.ts +6 -5
  54. package/dist/active-memory-bridge.js +2 -2
  55. package/dist/active-recall.d.ts +1 -1
  56. package/dist/active-recall.js +2 -1
  57. package/dist/active-recall.js.map +1 -1
  58. package/dist/adapters/index.js +4 -4
  59. package/dist/adapters/registry.js +2 -2
  60. package/dist/admin-console/public/what-helps-me/app.js +1594 -0
  61. package/dist/admin-console/public/what-helps-me/index.html +339 -0
  62. package/dist/admin-console/public/what-helps-me/model.js +685 -0
  63. package/dist/admin-console/public/what-helps-me/what-helps-me.css +1296 -0
  64. package/dist/ambient-provenance.d.ts +1 -1
  65. package/dist/artifact-search.d.ts +1 -1
  66. package/dist/{auto-sync-TDHLZPVP.js → auto-sync-NR3GPCOA.js} +4 -4
  67. package/dist/behavior-learner.d.ts +1 -1
  68. package/dist/behavior-signals.d.ts +1 -1
  69. package/dist/bootstrap.d.ts +9 -9
  70. package/dist/briefing.d.ts +2 -2
  71. package/dist/briefing.js +14 -14
  72. package/dist/buffer-surprise-report.d.ts +1 -1
  73. package/dist/buffer-turn-helpers.d.ts +1 -1
  74. package/dist/buffer.d.ts +2 -2
  75. package/dist/buffer.js +2 -2
  76. package/dist/bulk-import/index.d.ts +3 -3
  77. package/dist/calibration.d.ts +1 -1
  78. package/dist/calibration.js +1 -1
  79. package/dist/capabilities.d.ts +1 -1
  80. package/dist/{catalog-B90is4d8.d.ts → catalog-DGFf8mD9.d.ts} +1 -1
  81. package/dist/causal-behavior.d.ts +1 -1
  82. package/dist/causal-consolidation.d.ts +1 -1
  83. package/dist/causal-consolidation.js +15 -15
  84. package/dist/causal-trajectory-graph.d.ts +1 -1
  85. package/dist/{chunk-CSY44OKU.js → chunk-26ZXBTYN.js} +4 -4
  86. package/dist/chunk-26ZXBTYN.js.map +1 -0
  87. package/dist/{chunk-LLJMAULE.js → chunk-2FKEIPIT.js} +5 -5
  88. package/dist/{chunk-AU7Q3LSC.js → chunk-2QSZNTDO.js} +4 -4
  89. package/dist/chunk-37DZZFFM.js +502 -0
  90. package/dist/chunk-37DZZFFM.js.map +1 -0
  91. package/dist/chunk-3HSRWJTC.js +9 -0
  92. package/dist/chunk-3HSRWJTC.js.map +1 -0
  93. package/dist/{chunk-TKFGFDPJ.js → chunk-3TIZPSJC.js} +4 -4
  94. package/dist/{chunk-B4T3FQMT.js → chunk-43SEBY2M.js} +1 -1
  95. package/dist/{chunk-LVKYLMSM.js → chunk-46SZBVDS.js} +2 -2
  96. package/dist/{chunk-YKZLOPTC.js → chunk-5FD7JMTX.js} +2 -2
  97. package/dist/{chunk-2PNXOQ4P.js → chunk-5NB726GV.js} +3 -7
  98. package/dist/chunk-5NB726GV.js.map +1 -0
  99. package/dist/chunk-62OKGIJA.js +39 -0
  100. package/dist/chunk-62OKGIJA.js.map +1 -0
  101. package/dist/{chunk-WM5LD6AT.js → chunk-6CYHUWCO.js} +2 -2
  102. package/dist/{chunk-BIF4SHMD.js → chunk-76JJSXK7.js} +1 -1
  103. package/dist/chunk-76JJSXK7.js.map +1 -0
  104. package/dist/{chunk-3SXLD5T3.js → chunk-7BD6O7ZV.js} +189 -4
  105. package/dist/chunk-7BD6O7ZV.js.map +1 -0
  106. package/dist/chunk-7TBXNYLO.js +346 -0
  107. package/dist/chunk-7TBXNYLO.js.map +1 -0
  108. package/dist/{chunk-YR65W7BV.js → chunk-BRR5EUTF.js} +3 -3
  109. package/dist/{chunk-JKW663ZN.js → chunk-CIAI24TQ.js} +2 -2
  110. package/dist/{chunk-3WGI7F4V.js → chunk-D3LBIUWV.js} +9219 -5233
  111. package/dist/chunk-D3LBIUWV.js.map +1 -0
  112. package/dist/{chunk-YDWPYDML.js → chunk-EKTP7MNS.js} +4 -4
  113. package/dist/{chunk-6LEIWWAF.js → chunk-F2JRDPON.js} +2 -2
  114. package/dist/{chunk-VYQ4URQB.js → chunk-FFRTNF3L.js} +2 -2
  115. package/dist/{chunk-TY6MKIWP.js → chunk-FONWBCVY.js} +3 -3
  116. package/dist/{chunk-XSV2YDCJ.js → chunk-FPLM2TKD.js} +2 -2
  117. package/dist/{chunk-VTU5IEKY.js → chunk-FTPONF6B.js} +2 -2
  118. package/dist/{chunk-6PZGKGAO.js → chunk-FWX7W5PM.js} +2 -2
  119. package/dist/{chunk-QPW3PAIH.js → chunk-G6DFSS6A.js} +2 -2
  120. package/dist/{chunk-2DD6ZHOM.js → chunk-GJ776BC2.js} +3 -3
  121. package/dist/{chunk-XKAR4RF6.js → chunk-GN3WRFJY.js} +6 -6
  122. package/dist/{chunk-RG426DJO.js → chunk-H7NAZ3UB.js} +2 -2
  123. package/dist/{chunk-BSXGTDVJ.js → chunk-HBUFQRIM.js} +2 -2
  124. package/dist/{chunk-FFEBSFVT.js → chunk-HGJ6NJ4E.js} +2 -2
  125. package/dist/{chunk-WB7JSQCP.js → chunk-HIEWDJ2O.js} +5 -2
  126. package/dist/{chunk-WB7JSQCP.js.map → chunk-HIEWDJ2O.js.map} +1 -1
  127. package/dist/{chunk-QTO6BMQZ.js → chunk-I3MSGFGD.js} +17 -6
  128. package/dist/chunk-I3MSGFGD.js.map +1 -0
  129. package/dist/{chunk-5JKUSBMX.js → chunk-IKP5OYQQ.js} +2 -2
  130. package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
  131. package/dist/{chunk-DBY26JJJ.js → chunk-IQ4NVWEF.js} +2 -2
  132. package/dist/{chunk-7Q7JWLQ4.js → chunk-JYG4OLWH.js} +2 -2
  133. package/dist/{chunk-3OTSVCPK.js → chunk-K26NWEOC.js} +4 -4
  134. package/dist/{chunk-WZWZRZ2V.js → chunk-K2UGPTYY.js} +484 -43
  135. package/dist/chunk-K2UGPTYY.js.map +1 -0
  136. package/dist/{chunk-L6CQ7WIW.js → chunk-KFBOPMF6.js} +11 -11
  137. package/dist/chunk-KFBOPMF6.js.map +1 -0
  138. package/dist/{chunk-HOIRB77A.js → chunk-L6Z5OAS4.js} +2 -2
  139. package/dist/{chunk-7RZJWZ46.js → chunk-LEPOP46W.js} +5 -5
  140. package/dist/{chunk-QQXWFDRD.js → chunk-M4YHAODQ.js} +270 -684
  141. package/dist/chunk-M4YHAODQ.js.map +1 -0
  142. package/dist/{chunk-NGT35IGQ.js → chunk-MIH3CJPN.js} +3 -3
  143. package/dist/{chunk-QPAQSG3F.js → chunk-MK5VEWCR.js} +2 -2
  144. package/dist/chunk-NISZQW72.js +140 -0
  145. package/dist/chunk-NISZQW72.js.map +1 -0
  146. package/dist/{chunk-L7RTUEDG.js → chunk-OCIP6YMD.js} +2 -2
  147. package/dist/{chunk-2INWPC6E.js → chunk-PG4QBPVG.js} +20 -10
  148. package/dist/chunk-PG4QBPVG.js.map +1 -0
  149. package/dist/{chunk-DDA55IVB.js → chunk-PT54WISF.js} +189 -55
  150. package/dist/chunk-PT54WISF.js.map +1 -0
  151. package/dist/{chunk-UWJNKGBA.js → chunk-QZLDRQ4I.js} +5 -5
  152. package/dist/{chunk-UYOXFFEY.js → chunk-RUNORG2P.js} +3 -3
  153. package/dist/{chunk-LC3FD4BV.js → chunk-RZQ6W2W4.js} +39 -39
  154. package/dist/{chunk-MRGJZ75M.js → chunk-SMNYAMJD.js} +3 -3
  155. package/dist/{chunk-MKQBXQKU.js → chunk-TB6CBZ5V.js} +22 -15
  156. package/dist/chunk-TB6CBZ5V.js.map +1 -0
  157. package/dist/{chunk-DN2IDKI5.js → chunk-TO7ZTWJW.js} +2 -2
  158. package/dist/{chunk-K2TDK7GG.js → chunk-TWTUGCTY.js} +2 -2
  159. package/dist/{chunk-CUTFSLSD.js → chunk-UCTS3DDH.js} +2 -2
  160. package/dist/{chunk-JYIJNNN3.js → chunk-UG6VXIOK.js} +2 -2
  161. package/dist/{chunk-QOQQMVR2.js → chunk-UKYS3NU5.js} +2 -2
  162. package/dist/{chunk-VZRFGJCH.js → chunk-UPLZNJKN.js} +2 -2
  163. package/dist/{chunk-C23BYTJV.js → chunk-UW5NPZJ2.js} +40 -12
  164. package/dist/chunk-UW5NPZJ2.js.map +1 -0
  165. package/dist/{chunk-DOOWFDWN.js → chunk-V6ERBR7U.js} +2 -2
  166. package/dist/{chunk-7HG7MGAP.js → chunk-W5ZKPI34.js} +462 -2673
  167. package/dist/chunk-W5ZKPI34.js.map +1 -0
  168. package/dist/{chunk-HNDIND7P.js → chunk-XX4HPFFM.js} +54 -15
  169. package/dist/chunk-XX4HPFFM.js.map +1 -0
  170. package/dist/{chunk-N7CXQ5TA.js → chunk-XZHE2DEN.js} +1 -1
  171. package/dist/chunk-YXQEKCZM.js +223 -0
  172. package/dist/chunk-YXQEKCZM.js.map +1 -0
  173. package/dist/{chunk-6NNNURLK.js → chunk-Z54EM5YZ.js} +4 -4
  174. package/dist/{chunk-F2Y6I74C.js → chunk-ZRZVLB7O.js} +2 -2
  175. package/dist/{chunk-CLKBV3Z3.js → chunk-ZUKIUXHQ.js} +9 -9
  176. package/dist/{cli-jfuZXixq.d.ts → cli-Bze8S0Qs.d.ts} +5 -5
  177. package/dist/cli.d.ts +22 -22
  178. package/dist/cli.js +66 -58
  179. package/dist/coding/pre-action-gate.d.ts +1 -1
  180. package/dist/compounding/engine.d.ts +2 -2
  181. package/dist/compounding/engine.js +14 -14
  182. package/dist/compounding/preference-consolidator.d.ts +1 -1
  183. package/dist/compression-optimizer.d.ts +1 -1
  184. package/dist/config.d.ts +1 -1
  185. package/dist/config.js +2 -1
  186. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  187. package/dist/connectors/codex-materialize-runner.js +14 -14
  188. package/dist/connectors/codex-materialize.d.ts +1 -1
  189. package/dist/connectors/index.d.ts +1 -1
  190. package/dist/connectors/index.js +14 -14
  191. package/dist/consolidation-provenance-check.d.ts +2 -2
  192. package/dist/consolidation-undo.d.ts +2 -2
  193. package/dist/contradiction/index.d.ts +2 -2
  194. package/dist/contradiction/index.js +2 -2
  195. package/dist/{contradiction-scan-KCADHXPE.js → contradiction-scan-JDTBXRGW.js} +3 -3
  196. package/dist/converge-config.d.ts +1 -1
  197. package/dist/convergence-refresh.d.ts +2 -2
  198. package/dist/convergence-refresh.js +16 -16
  199. package/dist/conversation-index/backend.d.ts +1 -1
  200. package/dist/conversation-index/backend.js +2 -2
  201. package/dist/conversation-index/chunker.d.ts +1 -1
  202. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  203. package/dist/conversation-index/indexer.d.ts +1 -1
  204. package/dist/conversation-index/search.d.ts +1 -1
  205. package/dist/corpus-watermark.d.ts +1 -1
  206. package/dist/corpus-watermark.js +16 -16
  207. package/dist/day-summary.d.ts +1 -1
  208. package/dist/delinearize.d.ts +1 -1
  209. package/dist/dependency-propagation-config.d.ts +1 -1
  210. package/dist/{dependency-propagation-delivery-CTDuAVJc.d.ts → dependency-propagation-delivery-CzEfB31P.d.ts} +1 -1
  211. package/dist/direct-answer-wiring.d.ts +1 -1
  212. package/dist/direct-answer.d.ts +1 -1
  213. package/dist/embedding-fallback.d.ts +1 -1
  214. package/dist/enrichment/index.d.ts +1 -1
  215. package/dist/entity-retrieval.d.ts +2 -2
  216. package/dist/entity-retrieval.js +14 -14
  217. package/dist/entity-schema.d.ts +1 -1
  218. package/dist/explicit-capture.d.ts +9 -9
  219. package/dist/explicit-capture.js +4 -3
  220. package/dist/external-wiki-access.d.ts +22 -22
  221. package/dist/external-wiki-access.js +33 -30
  222. package/dist/external-wiki-collection-registration.d.ts +1 -1
  223. package/dist/external-wiki-collection.d.ts +1 -1
  224. package/dist/external-wiki-mcp-tools.d.ts +22 -22
  225. package/dist/extraction-error-classification.d.ts +1 -1
  226. package/dist/extraction-faithfulness.d.ts +1 -1
  227. package/dist/extraction-faithfulness.js +2 -2
  228. package/dist/extraction-judge-telemetry.d.ts +1 -1
  229. package/dist/extraction-judge-training.d.ts +1 -1
  230. package/dist/extraction-judge.d.ts +1 -1
  231. package/dist/extraction-judge.js +2 -2
  232. package/dist/extraction-liveness.d.ts +1 -1
  233. package/dist/extraction-normalization.d.ts +1 -1
  234. package/dist/extraction-prompt.d.ts +1 -1
  235. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  236. package/dist/extraction-source-grounding.d.ts +1 -1
  237. package/dist/extraction.d.ts +1 -1
  238. package/dist/extraction.js +20 -20
  239. package/dist/fallback-llm.d.ts +14 -1
  240. package/dist/fallback-llm.js +1 -1
  241. package/dist/{first-start-migration-LMMZFLKK.js → first-start-migration-CRZCZAJN.js} +5 -5
  242. package/dist/graph-dashboard-diff.d.ts +1 -1
  243. package/dist/graph-dashboard-key.d.ts +1 -1
  244. package/dist/graph-dashboard-parser.d.ts +1 -1
  245. package/dist/graph-edge-reinforcement.d.ts +1 -1
  246. package/dist/graph-path-reconstruction.d.ts +1 -1
  247. package/dist/graph-path-scoring.d.ts +1 -1
  248. package/dist/graph-snapshot.d.ts +1 -1
  249. package/dist/graph.d.ts +1 -1
  250. package/dist/harmonic-retrieval.js +1 -1
  251. package/dist/importance.d.ts +1 -1
  252. package/dist/importers/index.d.ts +1 -1
  253. package/dist/in-flight-reads.d.ts +1 -1
  254. package/dist/index.d.ts +704 -1421
  255. package/dist/index.js +203 -118
  256. package/dist/inline-script.d.ts +3 -0
  257. package/dist/inline-script.js +8 -0
  258. package/dist/inline-script.js.map +1 -0
  259. package/dist/intent.d.ts +1 -1
  260. package/dist/lcm/engine.d.ts +1 -1
  261. package/dist/lcm/engine.js +2 -2
  262. package/dist/lcm/index.d.ts +1 -1
  263. package/dist/lcm/index.js +2 -2
  264. package/dist/lcm/tools.d.ts +1 -1
  265. package/dist/lifecycle.d.ts +1 -1
  266. package/dist/live-connectors-runner.d.ts +1 -1
  267. package/dist/local-llm.d.ts +2 -1
  268. package/dist/local-llm.js +2 -2
  269. package/dist/local-model-endpoint.d.ts +1 -1
  270. package/dist/maintenance/memory-governance.d.ts +1 -1
  271. package/dist/maintenance/memory-governance.js +14 -14
  272. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  273. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -14
  274. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  275. package/dist/maintenance/rebuild-memory-projection.js +15 -15
  276. package/dist/{maintenance-heMZSq7G.d.ts → maintenance-C8aRWfhq.d.ts} +3 -3
  277. package/dist/mcp-memory-inspector-app.d.ts +22 -22
  278. package/dist/mcp-read-only-tools.js +1 -1
  279. package/dist/memory-action-policy.d.ts +1 -1
  280. package/dist/memory-cache.d.ts +1 -1
  281. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  282. package/dist/memory-projection-store.d.ts +1 -1
  283. package/dist/memory-provenance.d.ts +1 -1
  284. package/dist/memory-snapshot.d.ts +1 -1
  285. package/dist/memory-worth-outcomes.d.ts +2 -2
  286. package/dist/models-json.d.ts +1 -1
  287. package/dist/namespaces/migrate.d.ts +3 -3
  288. package/dist/namespaces/migrate.js +15 -15
  289. package/dist/namespaces/principal.d.ts +1 -1
  290. package/dist/namespaces/search.d.ts +1 -1
  291. package/dist/namespaces/search.js +6 -6
  292. package/dist/namespaces/storage.d.ts +3 -3
  293. package/dist/namespaces/storage.js +14 -14
  294. package/dist/native-knowledge.d.ts +1 -1
  295. package/dist/offline-sync-impression-drain.d.ts +1 -1
  296. package/dist/operator-doctor-corpus.d.ts +1 -1
  297. package/dist/operator-doctor-corpus.js +17 -17
  298. package/dist/operator-doctor-replica.d.ts +1 -1
  299. package/dist/operator-toolkit.d.ts +3 -3
  300. package/dist/operator-toolkit.js +23 -22
  301. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  302. package/dist/orchestration/maintenance.d.ts +4 -4
  303. package/dist/orchestration/maintenance.js +19 -19
  304. package/dist/{orchestrator-BQQPsSjs.d.ts → orchestrator-D85CzDDY.d.ts} +8 -8
  305. package/dist/orchestrator.d.ts +9 -9
  306. package/dist/orchestrator.js +86 -80
  307. package/dist/patterns-cli.d.ts +1 -1
  308. package/dist/{pipeline-DFfmsnGk.d.ts → pipeline-DPcUifCO.d.ts} +1 -1
  309. package/dist/policy-runtime.d.ts +1 -1
  310. package/dist/proactive-contention.d.ts +1 -1
  311. package/dist/provenance.d.ts +1 -1
  312. package/dist/public-http-D-SyWNj6.d.ts +25 -0
  313. package/dist/{qmd-BF5bcVRs.d.ts → qmd-dFCHp1r0.d.ts} +1 -1
  314. package/dist/qmd-preflight.d.ts +2 -2
  315. package/dist/qmd-recall-cache.d.ts +1 -1
  316. package/dist/qmd.d.ts +2 -2
  317. package/dist/recall-concurrency-config.d.ts +1 -1
  318. package/dist/recall-disclosure-escalation.d.ts +1 -1
  319. package/dist/recall-explain-renderer.d.ts +1 -1
  320. package/dist/recall-explain-renderer.js +3 -3
  321. package/dist/recall-memory-map.d.ts +1 -1
  322. package/dist/recall-planner-llm.d.ts +1 -1
  323. package/dist/recall-planner-llm.js +1 -1
  324. package/dist/recall-state.d.ts +1 -1
  325. package/dist/recall-tag-filter.d.ts +1 -1
  326. package/dist/recall-timings.d.ts +1 -1
  327. package/dist/recall-xray-cli.d.ts +1 -1
  328. package/dist/recall-xray-cli.js +4 -4
  329. package/dist/recall-xray-renderer.d.ts +1 -1
  330. package/dist/recall-xray-renderer.js +3 -3
  331. package/dist/recall-xray.d.ts +1 -1
  332. package/dist/recall-xray.js +2 -2
  333. package/dist/reconcile/cursor.d.ts +1 -1
  334. package/dist/reconcile/manifest.d.ts +1 -1
  335. package/dist/reconcile/plan.d.ts +1 -1
  336. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  337. package/dist/replay/normalizers/claude.d.ts +1 -1
  338. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  339. package/dist/replay/normalizers/shared.d.ts +1 -1
  340. package/dist/replay/runner.d.ts +1 -1
  341. package/dist/replay/types.d.ts +1 -1
  342. package/dist/replica-divergence.d.ts +1 -1
  343. package/dist/replica-peers-config.d.ts +1 -1
  344. package/dist/resolve-auth-token.d.ts +1 -1
  345. package/dist/resume-bundles.js +3 -2
  346. package/dist/retrieval-agents.d.ts +2 -2
  347. package/dist/retrieval-tiers.d.ts +1 -1
  348. package/dist/routing/engine.d.ts +1 -1
  349. package/dist/routing/store.d.ts +1 -1
  350. package/dist/salvage-envelope.d.ts +1 -1
  351. package/dist/schemas.d.ts +116 -116
  352. package/dist/{scope-profiles-CbUOsE_E.d.ts → scope-profiles-DICK7GtN.d.ts} +1 -1
  353. package/dist/search/embed-helper.d.ts +1 -1
  354. package/dist/search/factory.d.ts +1 -1
  355. package/dist/search/factory.js +5 -5
  356. package/dist/search/index.d.ts +1 -1
  357. package/dist/search/index.js +9 -9
  358. package/dist/search/lancedb-backend.d.ts +1 -1
  359. package/dist/search/meilisearch-backend.d.ts +1 -1
  360. package/dist/search/noop-backend.d.ts +1 -1
  361. package/dist/search/orama-backend.d.ts +1 -1
  362. package/dist/search/port.d.ts +1 -1
  363. package/dist/search/remote-backend.d.ts +1 -1
  364. package/dist/{semantic-consolidation-DAB3xdKM.d.ts → semantic-consolidation-BP7NAX0N.d.ts} +1 -1
  365. package/dist/semantic-consolidation.d.ts +2 -2
  366. package/dist/semantic-consolidation.js +15 -15
  367. package/dist/semantic-rule-promotion.js +14 -14
  368. package/dist/semantic-rule-verifier.d.ts +1 -1
  369. package/dist/semantic-rule-verifier.js +14 -14
  370. package/dist/{service-DGKg2O6r.d.ts → service-DT-pJyda.d.ts} +660 -660
  371. package/dist/session-observer-bands.d.ts +1 -1
  372. package/dist/session-observer-state.d.ts +1 -1
  373. package/dist/shared-context/manager.d.ts +9 -9
  374. package/dist/signal.d.ts +1 -1
  375. package/dist/source-agent-qualifier.d.ts +1 -1
  376. package/dist/source-agent-qualifier.js +16 -16
  377. package/dist/{storage-CC1jKcWg.d.ts → storage-qOnaJ1Lw.d.ts} +4 -1
  378. package/dist/storage.d.ts +2 -2
  379. package/dist/storage.js +13 -13
  380. package/dist/summarizer.d.ts +1 -1
  381. package/dist/summarizer.js +5 -5
  382. package/dist/summary-snapshot.d.ts +1 -1
  383. package/dist/support-passport/index.d.ts +518 -0
  384. package/dist/support-passport/index.js +357 -0
  385. package/dist/support-passport/index.js.map +1 -0
  386. package/dist/temporal-supersession.d.ts +2 -2
  387. package/dist/temporal-timeline-recall.d.ts +1 -1
  388. package/dist/temporal-validity.d.ts +1 -1
  389. package/dist/threading.d.ts +1 -1
  390. package/dist/tier-migration.d.ts +2 -2
  391. package/dist/tier-routing.d.ts +1 -1
  392. package/dist/tier-routing.js +2 -2
  393. package/dist/{tier-stats-JDN6HRNT.js → tier-stats-EXYSKSVN.js} +3 -3
  394. package/dist/topics.d.ts +1 -1
  395. package/dist/transcript.d.ts +1 -1
  396. package/dist/transfer/autodetect.js +1 -1
  397. package/dist/transfer/backup.js +1 -1
  398. package/dist/transfer/capsule-export.js +2 -2
  399. package/dist/transfer/types.d.ts +90 -90
  400. package/dist/trust-score-stage.d.ts +1 -1
  401. package/dist/trust-score.d.ts +1 -1
  402. package/dist/{types-BnQza1y8.d.ts → types-ed-SvS2t.d.ts} +7 -1
  403. package/dist/types.d.ts +1 -1
  404. package/dist/types.js +1 -1
  405. package/dist/utility-runtime.d.ts +1 -1
  406. package/dist/verified-recall.js +14 -14
  407. package/dist/write-envelope.d.ts +1 -1
  408. package/dist/write-rate-limiter.d.ts +11 -5
  409. package/dist/write-rate-limiter.js +1 -1
  410. package/package.json +12 -2
  411. package/scripts/build-with-heap.mjs +11 -1
  412. package/src/access-authorization-probe.ts +20 -2
  413. package/src/access-boundary.ts +32 -0
  414. package/src/access-http.test.ts +1940 -643
  415. package/src/access-http.ts +81 -74
  416. package/src/access-mcp.ts +3 -1
  417. package/src/access-operations.ts +2 -0
  418. package/src/access-service.ts +612 -845
  419. package/src/access-surface-catalog.test.ts +40 -10
  420. package/src/access-surface-catalog.ts +15 -0
  421. package/src/active-memory-bridge.ts +17 -19
  422. package/src/config.ts +18 -9
  423. package/src/fallback-llm.test.ts +54 -0
  424. package/src/fallback-llm.ts +54 -9
  425. package/src/inline-script.ts +6 -0
  426. package/src/local-llm-headers-timeout.test.ts +42 -0
  427. package/src/local-llm.ts +8 -8
  428. package/src/mcp-read-only-tools.ts +3 -0
  429. package/src/relay/mission-access.test.ts +11 -11
  430. package/src/relay/mission-ui.test.ts +3 -1
  431. package/src/storage/tombstone-blocked-capture-sync.ts +31 -0
  432. package/src/storage-contract/failure-semantics.test.ts +102 -0
  433. package/src/support-passport/access-http-base.ts +143 -0
  434. package/src/support-passport/access-http.ts +172 -0
  435. package/src/support-passport/access-operations.ts +272 -0
  436. package/src/support-passport/access-service-base.test.ts +193 -0
  437. package/src/support-passport/access-service-base.ts +176 -0
  438. package/src/support-passport/access-surface.test.ts +283 -0
  439. package/src/support-passport/access-surface.ts +286 -0
  440. package/src/support-passport/card-projection.test.ts +8 -0
  441. package/src/support-passport/card-projection.ts +77 -16
  442. package/src/support-passport/card-replacement.ts +126 -0
  443. package/src/support-passport/card-service-commit-forwarding.test.ts +160 -0
  444. package/src/support-passport/card-service.test.ts +533 -31
  445. package/src/support-passport/card-service.ts +506 -364
  446. package/src/support-passport/card-state.ts +158 -0
  447. package/src/support-passport/config-model-routing.test.ts +37 -0
  448. package/src/support-passport/config.test.ts +34 -0
  449. package/src/support-passport/config.ts +41 -0
  450. package/src/support-passport/contracts.test.ts +15 -2
  451. package/src/support-passport/contracts.ts +13 -0
  452. package/src/support-passport/errors.ts +6 -0
  453. package/src/support-passport/generated-batch.test.ts +185 -0
  454. package/src/support-passport/generated-batch.ts +338 -0
  455. package/src/support-passport/grant-contracts.ts +45 -1
  456. package/src/support-passport/grant-generated-batch-scope.test.ts +201 -0
  457. package/src/support-passport/grant-service-cache.test.ts +2 -2
  458. package/src/support-passport/grant-service-cancellation.test.ts +2 -0
  459. package/src/support-passport/grant-service-marker-cache.test.ts +62 -0
  460. package/src/support-passport/grant-service.test.ts +853 -239
  461. package/src/support-passport/grant-service.ts +206 -57
  462. package/src/support-passport/grant-store.ts +7 -3
  463. package/src/support-passport/index.ts +10 -0
  464. package/src/support-passport/mcp-tools.test.ts +222 -0
  465. package/src/support-passport/mcp-tools.ts +187 -0
  466. package/src/support-passport/model-adapter.test.ts +840 -0
  467. package/src/support-passport/model-adapter.ts +602 -0
  468. package/src/support-passport/model-audit-pinned-write.test.ts +59 -0
  469. package/src/support-passport/model-audit.ts +152 -0
  470. package/src/support-passport/model-bridge.test.ts +456 -0
  471. package/src/support-passport/model-bridge.ts +439 -0
  472. package/src/support-passport/model-contracts.ts +124 -0
  473. package/src/support-passport/model-service.test.ts +1731 -0
  474. package/src/support-passport/model-service.ts +399 -0
  475. package/src/support-passport/owner-http.test.ts +671 -0
  476. package/src/support-passport/owner-lock.ts +26 -9
  477. package/src/support-passport/private-file.test.ts +99 -0
  478. package/src/support-passport/private-file.ts +139 -12
  479. package/src/support-passport/public-http.test.ts +476 -0
  480. package/src/support-passport/public-http.ts +601 -0
  481. package/src/support-passport/ui.test.ts +181 -0
  482. package/src/types.ts +7 -0
  483. package/src/write-rate-limiter.test.ts +30 -6
  484. package/src/write-rate-limiter.ts +29 -18
  485. package/dist/chunk-2INWPC6E.js.map +0 -1
  486. package/dist/chunk-2PNXOQ4P.js.map +0 -1
  487. package/dist/chunk-3SXLD5T3.js.map +0 -1
  488. package/dist/chunk-3WGI7F4V.js.map +0 -1
  489. package/dist/chunk-7HG7MGAP.js.map +0 -1
  490. package/dist/chunk-BIF4SHMD.js.map +0 -1
  491. package/dist/chunk-C23BYTJV.js.map +0 -1
  492. package/dist/chunk-CSY44OKU.js.map +0 -1
  493. package/dist/chunk-DDA55IVB.js.map +0 -1
  494. package/dist/chunk-HNDIND7P.js.map +0 -1
  495. package/dist/chunk-L6CQ7WIW.js.map +0 -1
  496. package/dist/chunk-MKQBXQKU.js.map +0 -1
  497. package/dist/chunk-QQXWFDRD.js.map +0 -1
  498. package/dist/chunk-QTO6BMQZ.js.map +0 -1
  499. package/dist/chunk-WZWZRZ2V.js.map +0 -1
  500. /package/dist/{auto-sync-TDHLZPVP.js.map → auto-sync-NR3GPCOA.js.map} +0 -0
  501. /package/dist/{chunk-LLJMAULE.js.map → chunk-2FKEIPIT.js.map} +0 -0
  502. /package/dist/{chunk-AU7Q3LSC.js.map → chunk-2QSZNTDO.js.map} +0 -0
  503. /package/dist/{chunk-TKFGFDPJ.js.map → chunk-3TIZPSJC.js.map} +0 -0
  504. /package/dist/{chunk-B4T3FQMT.js.map → chunk-43SEBY2M.js.map} +0 -0
  505. /package/dist/{chunk-LVKYLMSM.js.map → chunk-46SZBVDS.js.map} +0 -0
  506. /package/dist/{chunk-YKZLOPTC.js.map → chunk-5FD7JMTX.js.map} +0 -0
  507. /package/dist/{chunk-WM5LD6AT.js.map → chunk-6CYHUWCO.js.map} +0 -0
  508. /package/dist/{chunk-YR65W7BV.js.map → chunk-BRR5EUTF.js.map} +0 -0
  509. /package/dist/{chunk-JKW663ZN.js.map → chunk-CIAI24TQ.js.map} +0 -0
  510. /package/dist/{chunk-YDWPYDML.js.map → chunk-EKTP7MNS.js.map} +0 -0
  511. /package/dist/{chunk-6LEIWWAF.js.map → chunk-F2JRDPON.js.map} +0 -0
  512. /package/dist/{chunk-VYQ4URQB.js.map → chunk-FFRTNF3L.js.map} +0 -0
  513. /package/dist/{chunk-TY6MKIWP.js.map → chunk-FONWBCVY.js.map} +0 -0
  514. /package/dist/{chunk-XSV2YDCJ.js.map → chunk-FPLM2TKD.js.map} +0 -0
  515. /package/dist/{chunk-VTU5IEKY.js.map → chunk-FTPONF6B.js.map} +0 -0
  516. /package/dist/{chunk-6PZGKGAO.js.map → chunk-FWX7W5PM.js.map} +0 -0
  517. /package/dist/{chunk-QPW3PAIH.js.map → chunk-G6DFSS6A.js.map} +0 -0
  518. /package/dist/{chunk-2DD6ZHOM.js.map → chunk-GJ776BC2.js.map} +0 -0
  519. /package/dist/{chunk-XKAR4RF6.js.map → chunk-GN3WRFJY.js.map} +0 -0
  520. /package/dist/{chunk-RG426DJO.js.map → chunk-H7NAZ3UB.js.map} +0 -0
  521. /package/dist/{chunk-BSXGTDVJ.js.map → chunk-HBUFQRIM.js.map} +0 -0
  522. /package/dist/{chunk-FFEBSFVT.js.map → chunk-HGJ6NJ4E.js.map} +0 -0
  523. /package/dist/{chunk-5JKUSBMX.js.map → chunk-IKP5OYQQ.js.map} +0 -0
  524. /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  525. /package/dist/{chunk-DBY26JJJ.js.map → chunk-IQ4NVWEF.js.map} +0 -0
  526. /package/dist/{chunk-7Q7JWLQ4.js.map → chunk-JYG4OLWH.js.map} +0 -0
  527. /package/dist/{chunk-3OTSVCPK.js.map → chunk-K26NWEOC.js.map} +0 -0
  528. /package/dist/{chunk-HOIRB77A.js.map → chunk-L6Z5OAS4.js.map} +0 -0
  529. /package/dist/{chunk-7RZJWZ46.js.map → chunk-LEPOP46W.js.map} +0 -0
  530. /package/dist/{chunk-NGT35IGQ.js.map → chunk-MIH3CJPN.js.map} +0 -0
  531. /package/dist/{chunk-QPAQSG3F.js.map → chunk-MK5VEWCR.js.map} +0 -0
  532. /package/dist/{chunk-L7RTUEDG.js.map → chunk-OCIP6YMD.js.map} +0 -0
  533. /package/dist/{chunk-UWJNKGBA.js.map → chunk-QZLDRQ4I.js.map} +0 -0
  534. /package/dist/{chunk-UYOXFFEY.js.map → chunk-RUNORG2P.js.map} +0 -0
  535. /package/dist/{chunk-LC3FD4BV.js.map → chunk-RZQ6W2W4.js.map} +0 -0
  536. /package/dist/{chunk-MRGJZ75M.js.map → chunk-SMNYAMJD.js.map} +0 -0
  537. /package/dist/{chunk-DN2IDKI5.js.map → chunk-TO7ZTWJW.js.map} +0 -0
  538. /package/dist/{chunk-K2TDK7GG.js.map → chunk-TWTUGCTY.js.map} +0 -0
  539. /package/dist/{chunk-CUTFSLSD.js.map → chunk-UCTS3DDH.js.map} +0 -0
  540. /package/dist/{chunk-JYIJNNN3.js.map → chunk-UG6VXIOK.js.map} +0 -0
  541. /package/dist/{chunk-QOQQMVR2.js.map → chunk-UKYS3NU5.js.map} +0 -0
  542. /package/dist/{chunk-VZRFGJCH.js.map → chunk-UPLZNJKN.js.map} +0 -0
  543. /package/dist/{chunk-DOOWFDWN.js.map → chunk-V6ERBR7U.js.map} +0 -0
  544. /package/dist/{chunk-N7CXQ5TA.js.map → chunk-XZHE2DEN.js.map} +0 -0
  545. /package/dist/{chunk-6NNNURLK.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  546. /package/dist/{chunk-F2Y6I74C.js.map → chunk-ZRZVLB7O.js.map} +0 -0
  547. /package/dist/{chunk-CLKBV3Z3.js.map → chunk-ZUKIUXHQ.js.map} +0 -0
  548. /package/dist/{contradiction-scan-KCADHXPE.js.map → contradiction-scan-JDTBXRGW.js.map} +0 -0
  549. /package/dist/{first-start-migration-LMMZFLKK.js.map → first-start-migration-CRZCZAJN.js.map} +0 -0
  550. /package/dist/{tier-stats-JDN6HRNT.js.map → tier-stats-EXYSKSVN.js.map} +0 -0
@@ -0,0 +1,399 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ import { z } from "zod";
4
+
5
+ import { raceAbort, throwIfAborted } from "../abort-error.js";
6
+ import { log } from "../logger.js";
7
+ import { stripAttributesSuffix } from "../structured-attributes.js";
8
+ import type { MemoryFile } from "../types.js";
9
+ import { isSupportPassportPrivateMemory } from "./card-projection.js";
10
+ import type { SupportPassportCardService } from "./card-service.js";
11
+ import type { SupportPassportOwnerScope } from "./card-state.js";
12
+ import {
13
+ type SupportPassportCard,
14
+ SupportPassportListCardsInputSchema,
15
+ SupportPassportNamespaceSchema,
16
+ SupportPassportSourceMemoryIdSchema,
17
+ } from "./contracts.js";
18
+ import { SupportPassportError } from "./errors.js";
19
+ import type { SupportPassportGrantService } from "./grant-service.js";
20
+ import { type SupportPassportModelAdapter, SupportPassportModelCallError } from "./model-adapter.js";
21
+ import {
22
+ type SupportPassportModelAuditRecord,
23
+ type SupportPassportModelAuditSink,
24
+ hashSupportPassportAuditValues,
25
+ } from "./model-audit.js";
26
+ import type { SupportPassportAnswerOutput } from "./model-contracts.js";
27
+
28
+ const DraftServiceInputSchema = z
29
+ .object({
30
+ principal: z.string().trim().min(1).max(512),
31
+ sourceMemoryIds: z.array(SupportPassportSourceMemoryIdSchema).min(1).max(20),
32
+ sourceMemoryRevisions: z
33
+ .array(
34
+ z
35
+ .object({
36
+ memoryId: SupportPassportSourceMemoryIdSchema,
37
+ revision: z.string().regex(/^[0-9a-f]{64}$/),
38
+ })
39
+ .strict()
40
+ )
41
+ .min(1)
42
+ .max(20),
43
+ consent: z.literal(true),
44
+ })
45
+ .strict()
46
+ .superRefine((input, ctx) => {
47
+ if (new Set(input.sourceMemoryIds).size !== input.sourceMemoryIds.length) {
48
+ ctx.addIssue({
49
+ code: z.ZodIssueCode.custom,
50
+ message: "source memory IDs must be unique",
51
+ path: ["sourceMemoryIds"],
52
+ });
53
+ }
54
+ const revisionIds = input.sourceMemoryRevisions.map((source) => source.memoryId);
55
+ if (
56
+ new Set(revisionIds).size !== revisionIds.length ||
57
+ revisionIds.length !== input.sourceMemoryIds.length ||
58
+ input.sourceMemoryIds.some((memoryId) => !revisionIds.includes(memoryId))
59
+ ) {
60
+ ctx.addIssue({
61
+ code: z.ZodIssueCode.custom,
62
+ message: "source memory revisions must match the selected memory IDs",
63
+ path: ["sourceMemoryRevisions"],
64
+ });
65
+ }
66
+ });
67
+
68
+ function hasStructuredAttributes(attributes: Readonly<Record<string, string>> | undefined): boolean {
69
+ return attributes !== undefined && Object.keys(attributes).length > 0;
70
+ }
71
+
72
+ function supportPassportSourceContent(memory: Pick<MemoryFile, "content" | "frontmatter">): string {
73
+ return hasStructuredAttributes(memory.frontmatter.structuredAttributes)
74
+ ? stripAttributesSuffix(memory.content)
75
+ : memory.content;
76
+ }
77
+
78
+ export function computeSupportPassportSourceRevision(
79
+ content: string,
80
+ structuredAttributes?: Record<string, string>
81
+ ): string {
82
+ return createHash("sha256")
83
+ .update("support-passport-source:v1\0")
84
+ .update(hasStructuredAttributes(structuredAttributes) ? stripAttributesSuffix(content) : content)
85
+ .digest("hex");
86
+ }
87
+
88
+ export interface SupportPassportDraftServiceDependencies {
89
+ cardService: SupportPassportCardService;
90
+ modelAdapter: SupportPassportModelAdapter;
91
+ resolveOwner(principal: string): Promise<SupportPassportOwnerScope>;
92
+ audit: SupportPassportModelAuditSink;
93
+ now?: () => Date;
94
+ }
95
+
96
+ export interface SupportPassportQuestionServiceDependencies {
97
+ grantService: SupportPassportGrantService;
98
+ modelAdapter: SupportPassportModelAdapter;
99
+ audit: SupportPassportModelAuditSink;
100
+ now?: () => Date;
101
+ }
102
+
103
+ export function isSupportPassportSourceEligible(memory: MemoryFile): boolean {
104
+ const status = memory.frontmatter.status ?? "active";
105
+ return (
106
+ status === "active" &&
107
+ !isSupportPassportPrivateMemory(memory) &&
108
+ !memory.frontmatter.archivedAt &&
109
+ !memory.frontmatter.blockedBy &&
110
+ !memory.frontmatter.supersededBy
111
+ );
112
+ }
113
+
114
+ function modelFailureAuditFields(error: unknown, signal: AbortSignal | undefined, latencyMs: number) {
115
+ if (error instanceof SupportPassportModelCallError) {
116
+ return { ...error.metadata, latencyMs };
117
+ }
118
+ if (error instanceof SupportPassportError) {
119
+ return {
120
+ modelUsed: "unavailable",
121
+ route: "unavailable" as const,
122
+ latencyMs,
123
+ errorClass: error.code,
124
+ };
125
+ }
126
+ return {
127
+ modelUsed: "unavailable",
128
+ route: "unavailable" as const,
129
+ latencyMs,
130
+ errorClass: signal?.aborted ? "aborted" : "provider_error",
131
+ };
132
+ }
133
+
134
+ function operationErrorClass(error: unknown): string {
135
+ return error instanceof SupportPassportError ? error.code : "operation_error";
136
+ }
137
+
138
+ async function recordAuditSafely(
139
+ audit: SupportPassportModelAuditSink,
140
+ record: SupportPassportModelAuditRecord
141
+ ): Promise<void> {
142
+ try {
143
+ await audit.record(record);
144
+ } catch {
145
+ log.warn("support passport model audit write failed");
146
+ }
147
+ }
148
+
149
+ function scheduleAudit(audit: SupportPassportModelAuditSink, record: SupportPassportModelAuditRecord): void {
150
+ setImmediate(() => {
151
+ void recordAuditSafely(audit, record);
152
+ });
153
+ }
154
+
155
+ export class SupportPassportDraftService {
156
+ private readonly cardService: SupportPassportCardService;
157
+ private readonly modelAdapter: SupportPassportModelAdapter;
158
+ private readonly resolveOwner: SupportPassportDraftServiceDependencies["resolveOwner"];
159
+ private readonly audit: SupportPassportModelAuditSink;
160
+ private readonly now: () => Date;
161
+
162
+ constructor(dependencies: SupportPassportDraftServiceDependencies) {
163
+ this.cardService = dependencies.cardService;
164
+ this.modelAdapter = dependencies.modelAdapter;
165
+ this.resolveOwner = dependencies.resolveOwner;
166
+ this.audit = dependencies.audit;
167
+ this.now = dependencies.now ?? (() => new Date());
168
+ }
169
+
170
+ async draftCards(input: {
171
+ principal: string;
172
+ sourceMemoryIds: string[];
173
+ sourceMemoryRevisions: Array<{ memoryId: string; revision: string }>;
174
+ consent: boolean;
175
+ signal?: AbortSignal;
176
+ onCommitted?: () => void;
177
+ }): Promise<SupportPassportCard[]> {
178
+ if (input.consent !== true) {
179
+ throw new SupportPassportError("consent_required", "Drafting requires explicit consent.", 400);
180
+ }
181
+ const parsed = DraftServiceInputSchema.safeParse({
182
+ principal: input.principal,
183
+ sourceMemoryIds: input.sourceMemoryIds,
184
+ sourceMemoryRevisions: input.sourceMemoryRevisions,
185
+ consent: input.consent,
186
+ });
187
+ if (!parsed.success) throw new SupportPassportError("invalid_input", "The drafting request is invalid.", 400);
188
+ const cancellationMessage = "The support guide draft was cancelled.";
189
+ throwIfAborted(input.signal, cancellationMessage);
190
+ const resolvedOwner = await raceAbort(this.resolveOwner(parsed.data.principal), input.signal, cancellationMessage);
191
+ const owner = this.validateOwnerScope(resolvedOwner, parsed.data.principal);
192
+ throwIfAborted(input.signal, cancellationMessage);
193
+ const revisions = new Map(
194
+ parsed.data.sourceMemoryRevisions.map((source) => [source.memoryId, source.revision] as const)
195
+ );
196
+ const selectedMemories: MemoryFile[] = [];
197
+ const memories: Array<{ memoryId: string; content: string }> = [];
198
+ for (const memoryId of parsed.data.sourceMemoryIds) {
199
+ throwIfAborted(input.signal, cancellationMessage);
200
+ const memory = await raceAbort(owner.storage.getMemoryById(memoryId), input.signal, cancellationMessage);
201
+ throwIfAborted(input.signal, cancellationMessage);
202
+ if (!memory || !isSupportPassportSourceEligible(memory)) {
203
+ throw new SupportPassportError("invalid_input", "A selected memory is not available.", 400);
204
+ }
205
+ if (
206
+ computeSupportPassportSourceRevision(memory.content, memory.frontmatter.structuredAttributes) !==
207
+ revisions.get(memoryId)
208
+ ) {
209
+ throw new SupportPassportError("revision_conflict", "A selected memory changed after it was reviewed.", 409);
210
+ }
211
+ selectedMemories.push(memory);
212
+ memories.push({ memoryId, content: supportPassportSourceContent(memory) });
213
+ }
214
+ await this.revalidateSources(owner.storage, selectedMemories, input.signal, cancellationMessage);
215
+ const startedAt = Date.now();
216
+ let modelResult: Awaited<ReturnType<SupportPassportModelAdapter["draftCards"]>>;
217
+ try {
218
+ modelResult = await this.modelAdapter.draftCards(
219
+ {
220
+ consent: true,
221
+ memories,
222
+ },
223
+ input.signal
224
+ );
225
+ } catch (error) {
226
+ scheduleAudit(this.audit, {
227
+ schemaVersion: 1,
228
+ operation: "draft_cards",
229
+ actorHash: hashSupportPassportAuditValues("owner", [owner.principal]),
230
+ subjectIdsHash: hashSupportPassportAuditValues("source-memory-ids", parsed.data.sourceMemoryIds),
231
+ outputSchemaVersion: 1,
232
+ outcome: "error",
233
+ occurredAt: this.now().toISOString(),
234
+ ...modelFailureAuditFields(error, input.signal, Math.max(0, Date.now() - startedAt)),
235
+ });
236
+ throw error;
237
+ }
238
+ const auditBase = {
239
+ schemaVersion: 1 as const,
240
+ operation: "draft_cards" as const,
241
+ actorHash: hashSupportPassportAuditValues("owner", [owner.principal]),
242
+ subjectIdsHash: hashSupportPassportAuditValues("source-memory-ids", parsed.data.sourceMemoryIds),
243
+ modelUsed: modelResult.modelUsed,
244
+ route: modelResult.route,
245
+ outputSchemaVersion: 1 as const,
246
+ occurredAt: this.now().toISOString(),
247
+ latencyMs: Math.floor(modelResult.latencyMs),
248
+ usage: modelResult.usage,
249
+ };
250
+ try {
251
+ const cards = await this.cardService.createGeneratedDraftsForOwner({
252
+ authenticatedPrincipal: owner.principal,
253
+ owner,
254
+ cards: modelResult.cards,
255
+ signal: input.signal,
256
+ ...(input.onCommitted ? { onCommitted: input.onCommitted } : {}),
257
+ commitWithValidatedSources: async (commit) => {
258
+ throwIfAborted(input.signal, cancellationMessage);
259
+ const committed = await owner.storage.withMemorySnapshotsIfUnchanged(
260
+ selectedMemories,
261
+ async (memories) => {
262
+ if (memories.some((memory) => !isSupportPassportSourceEligible(memory))) return false;
263
+ throwIfAborted(input.signal, cancellationMessage);
264
+ await commit();
265
+ return true;
266
+ },
267
+ );
268
+ if (committed !== true) {
269
+ throw new SupportPassportError("invalid_input", "A selected memory is not available.", 400);
270
+ }
271
+ },
272
+ });
273
+ scheduleAudit(this.audit, { ...auditBase, outcome: "success" });
274
+ return cards;
275
+ } catch (error) {
276
+ scheduleAudit(this.audit, {
277
+ ...auditBase,
278
+ outcome: "error",
279
+ errorClass:
280
+ error instanceof SupportPassportError
281
+ ? error.code
282
+ : input.signal?.aborted
283
+ ? "aborted"
284
+ : operationErrorClass(error),
285
+ });
286
+ throw error;
287
+ }
288
+ }
289
+
290
+ private async revalidateSources(
291
+ storage: SupportPassportOwnerScope["storage"],
292
+ expected: readonly MemoryFile[],
293
+ signal: AbortSignal | undefined,
294
+ cancellationMessage: string
295
+ ): Promise<void> {
296
+ throwIfAborted(signal, cancellationMessage);
297
+ const memories = await raceAbort(storage.readMemorySnapshotsIfUnchanged(expected), signal, cancellationMessage);
298
+ throwIfAborted(signal, cancellationMessage);
299
+ if (!memories || memories.some((memory) => !isSupportPassportSourceEligible(memory))) {
300
+ throw new SupportPassportError("invalid_input", "A selected memory is not available.", 400);
301
+ }
302
+ }
303
+
304
+ private validateOwnerScope(owner: SupportPassportOwnerScope, principal: string): SupportPassportOwnerScope {
305
+ const requestedPrincipal = SupportPassportListCardsInputSchema.safeParse({ principal });
306
+ const ownerPrincipal = SupportPassportListCardsInputSchema.safeParse({ principal: owner.principal });
307
+ const namespace = SupportPassportNamespaceSchema.safeParse(owner.namespace);
308
+ if (
309
+ !requestedPrincipal.success ||
310
+ !ownerPrincipal.success ||
311
+ !namespace.success ||
312
+ ownerPrincipal.data.principal !== requestedPrincipal.data.principal
313
+ ) {
314
+ throw new SupportPassportError("card_data_invalid", "The support passport owner scope is invalid.", 500);
315
+ }
316
+ return { ...owner, principal: ownerPrincipal.data.principal, namespace: namespace.data };
317
+ }
318
+ }
319
+
320
+ export class SupportPassportQuestionService {
321
+ private readonly grantService: SupportPassportGrantService;
322
+ private readonly modelAdapter: SupportPassportModelAdapter;
323
+ private readonly audit: SupportPassportModelAuditSink;
324
+ private readonly now: () => Date;
325
+
326
+ constructor(dependencies: SupportPassportQuestionServiceDependencies) {
327
+ this.grantService = dependencies.grantService;
328
+ this.modelAdapter = dependencies.modelAdapter;
329
+ this.audit = dependencies.audit;
330
+ this.now = dependencies.now ?? (() => new Date());
331
+ }
332
+
333
+ async askGrant(input: {
334
+ grantId: string;
335
+ secret: string;
336
+ question: string;
337
+ signal?: AbortSignal;
338
+ }): Promise<SupportPassportAnswerOutput> {
339
+ const cancellationMessage = "The helper question was cancelled.";
340
+ throwIfAborted(input.signal, cancellationMessage);
341
+ const guide = await raceAbort(this.grantService.readGrant(input), input.signal, cancellationMessage);
342
+ throwIfAborted(input.signal, cancellationMessage);
343
+ const startedAt = Date.now();
344
+ let modelResult: Awaited<ReturnType<SupportPassportModelAdapter["answerQuestion"]>>;
345
+ try {
346
+ modelResult = await this.modelAdapter.answerQuestion({ guide, question: input.question }, input.signal);
347
+ } catch (error) {
348
+ scheduleAudit(this.audit, {
349
+ schemaVersion: 1,
350
+ operation: "answer_question",
351
+ actorHash: hashSupportPassportAuditValues("helper-grant", [guide.grantId]),
352
+ subjectIdsHash: hashSupportPassportAuditValues(
353
+ "shared-card-ids",
354
+ guide.cards.map((card) => card.cardId)
355
+ ),
356
+ outputSchemaVersion: 1,
357
+ outcome: "error",
358
+ occurredAt: this.now().toISOString(),
359
+ ...modelFailureAuditFields(error, input.signal, Math.max(0, Date.now() - startedAt)),
360
+ });
361
+ throw error;
362
+ }
363
+ const auditBase = {
364
+ schemaVersion: 1,
365
+ operation: "answer_question" as const,
366
+ actorHash: hashSupportPassportAuditValues("helper-grant", [guide.grantId]),
367
+ subjectIdsHash: hashSupportPassportAuditValues(
368
+ "shared-card-ids",
369
+ guide.cards.map((card) => card.cardId)
370
+ ),
371
+ modelUsed: modelResult.modelUsed,
372
+ route: modelResult.route,
373
+ outputSchemaVersion: 1 as const,
374
+ occurredAt: this.now().toISOString(),
375
+ latencyMs: Math.floor(modelResult.latencyMs),
376
+ usage: modelResult.usage,
377
+ };
378
+ try {
379
+ throwIfAborted(input.signal, cancellationMessage);
380
+ await raceAbort(this.grantService.readGrant(input), input.signal, cancellationMessage);
381
+ throwIfAborted(input.signal, cancellationMessage);
382
+ const answer = {
383
+ answer: modelResult.answer,
384
+ citedCardIds: modelResult.citedCardIds,
385
+ coverage: modelResult.coverage,
386
+ };
387
+ scheduleAudit(this.audit, { ...auditBase, schemaVersion: 1, outcome: "success" });
388
+ return answer;
389
+ } catch (error) {
390
+ scheduleAudit(this.audit, {
391
+ ...auditBase,
392
+ schemaVersion: 1,
393
+ outcome: "error",
394
+ errorClass: input.signal?.aborted ? "aborted" : operationErrorClass(error),
395
+ });
396
+ throw error;
397
+ }
398
+ }
399
+ }