@remnic/core 9.54.5 → 9.54.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) hide show
  1. package/dist/access-admin-ops-surface.d.ts +24 -24
  2. package/dist/access-admin-ops-surface.js +32 -29
  3. package/dist/access-authorization-probe.d.ts +25 -23
  4. package/dist/access-authorization-probe.js +35 -30
  5. package/dist/access-boundary.d.ts +26 -24
  6. package/dist/access-boundary.js +36 -31
  7. package/dist/access-cli.js +86 -80
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +19 -19
  11. package/dist/access-extraction-force-flush.js +32 -29
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +22 -22
  14. package/dist/access-http-lifecycle-flush.d.ts +22 -22
  15. package/dist/access-http-offline-stream.d.ts +18 -18
  16. package/dist/access-http-query.js +32 -29
  17. package/dist/access-http.d.ts +55 -37
  18. package/dist/access-http.js +52 -43
  19. package/dist/access-identity-continuity-surface.d.ts +9 -9
  20. package/dist/access-identity-continuity-surface.js +32 -29
  21. package/dist/access-lcm-surface.d.ts +21 -21
  22. package/dist/access-lcm-surface.js +32 -29
  23. package/dist/access-mcp.d.ts +22 -22
  24. package/dist/access-mcp.js +40 -36
  25. package/dist/access-memory-search-fanout.d.ts +2 -2
  26. package/dist/{access-namespace-preflight-BdHlGd_T.d.ts → access-namespace-preflight-CCNn_6NE.d.ts} +1 -1
  27. package/dist/access-namespace-preflight.d.ts +3 -3
  28. package/dist/access-namespace-preflight.js +32 -29
  29. package/dist/access-observe-write-surface.d.ts +22 -22
  30. package/dist/access-observe-write-surface.js +32 -29
  31. package/dist/access-offline-manifest.d.ts +9 -9
  32. package/dist/access-offline-manifest.js +2 -2
  33. package/dist/access-operations-batch.js +34 -31
  34. package/dist/access-operations.d.ts +23 -23
  35. package/dist/access-operations.js +38 -34
  36. package/dist/access-recall-concurrency.d.ts +21 -21
  37. package/dist/access-recall-concurrency.js +32 -29
  38. package/dist/access-recall-response.d.ts +19 -19
  39. package/dist/access-recall-response.js +32 -29
  40. package/dist/access-recall-surface.d.ts +19 -19
  41. package/dist/access-recall-surface.js +32 -29
  42. package/dist/access-schema.js +3 -3
  43. package/dist/{access-service-DL7X9hrg.d.ts → access-service-DK82xdNi.d.ts} +1314 -83
  44. package/dist/access-service-helpers.d.ts +22 -22
  45. package/dist/access-service.d.ts +31 -31
  46. package/dist/access-service.js +32 -29
  47. package/dist/access-surface-catalog.d.ts +22 -22
  48. package/dist/access-surface-catalog.js +209 -2
  49. package/dist/access-surface-catalog.js.map +1 -1
  50. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  51. package/dist/action-confidence.d.ts +1 -1
  52. package/dist/active-memory-bridge.d.ts +6 -5
  53. package/dist/active-memory-bridge.js +2 -2
  54. package/dist/active-recall.d.ts +1 -1
  55. package/dist/active-recall.js +2 -1
  56. package/dist/active-recall.js.map +1 -1
  57. package/dist/adapters/index.js +4 -4
  58. package/dist/adapters/registry.js +2 -2
  59. package/dist/admin-console/public/what-helps-me/app.js +1594 -0
  60. package/dist/admin-console/public/what-helps-me/index.html +339 -0
  61. package/dist/admin-console/public/what-helps-me/model.js +685 -0
  62. package/dist/admin-console/public/what-helps-me/what-helps-me.css +1296 -0
  63. package/dist/ambient-provenance.d.ts +1 -1
  64. package/dist/artifact-search.d.ts +1 -1
  65. package/dist/{auto-sync-TDHLZPVP.js → auto-sync-NR3GPCOA.js} +4 -4
  66. package/dist/behavior-learner.d.ts +1 -1
  67. package/dist/behavior-signals.d.ts +1 -1
  68. package/dist/bootstrap.d.ts +9 -9
  69. package/dist/briefing.d.ts +2 -2
  70. package/dist/briefing.js +14 -14
  71. package/dist/buffer-surprise-report.d.ts +1 -1
  72. package/dist/buffer-turn-helpers.d.ts +1 -1
  73. package/dist/buffer.d.ts +2 -2
  74. package/dist/buffer.js +2 -2
  75. package/dist/bulk-import/index.d.ts +3 -3
  76. package/dist/calibration.d.ts +1 -1
  77. package/dist/calibration.js +1 -1
  78. package/dist/capabilities.d.ts +1 -1
  79. package/dist/{catalog-B90is4d8.d.ts → catalog-DGFf8mD9.d.ts} +1 -1
  80. package/dist/causal-behavior.d.ts +1 -1
  81. package/dist/causal-consolidation.d.ts +1 -1
  82. package/dist/causal-consolidation.js +15 -15
  83. package/dist/causal-trajectory-graph.d.ts +1 -1
  84. package/dist/{chunk-CSY44OKU.js → chunk-26ZXBTYN.js} +4 -4
  85. package/dist/chunk-26ZXBTYN.js.map +1 -0
  86. package/dist/{chunk-LLJMAULE.js → chunk-2FKEIPIT.js} +5 -5
  87. package/dist/{chunk-AU7Q3LSC.js → chunk-2QSZNTDO.js} +4 -4
  88. package/dist/chunk-37DZZFFM.js +502 -0
  89. package/dist/chunk-37DZZFFM.js.map +1 -0
  90. package/dist/chunk-3HSRWJTC.js +9 -0
  91. package/dist/chunk-3HSRWJTC.js.map +1 -0
  92. package/dist/{chunk-TKFGFDPJ.js → chunk-3TIZPSJC.js} +4 -4
  93. package/dist/{chunk-B4T3FQMT.js → chunk-43SEBY2M.js} +1 -1
  94. package/dist/{chunk-LVKYLMSM.js → chunk-46SZBVDS.js} +2 -2
  95. package/dist/{chunk-YKZLOPTC.js → chunk-5FD7JMTX.js} +2 -2
  96. package/dist/{chunk-2PNXOQ4P.js → chunk-5NB726GV.js} +3 -7
  97. package/dist/chunk-5NB726GV.js.map +1 -0
  98. package/dist/chunk-62OKGIJA.js +39 -0
  99. package/dist/chunk-62OKGIJA.js.map +1 -0
  100. package/dist/{chunk-WM5LD6AT.js → chunk-6CYHUWCO.js} +2 -2
  101. package/dist/{chunk-BIF4SHMD.js → chunk-76JJSXK7.js} +1 -1
  102. package/dist/chunk-76JJSXK7.js.map +1 -0
  103. package/dist/{chunk-3SXLD5T3.js → chunk-7BD6O7ZV.js} +189 -4
  104. package/dist/chunk-7BD6O7ZV.js.map +1 -0
  105. package/dist/chunk-7TBXNYLO.js +346 -0
  106. package/dist/chunk-7TBXNYLO.js.map +1 -0
  107. package/dist/{chunk-YR65W7BV.js → chunk-BRR5EUTF.js} +3 -3
  108. package/dist/{chunk-JKW663ZN.js → chunk-CIAI24TQ.js} +2 -2
  109. package/dist/{chunk-3WGI7F4V.js → chunk-D3LBIUWV.js} +9219 -5233
  110. package/dist/chunk-D3LBIUWV.js.map +1 -0
  111. package/dist/{chunk-YDWPYDML.js → chunk-EKTP7MNS.js} +4 -4
  112. package/dist/{chunk-6LEIWWAF.js → chunk-F2JRDPON.js} +2 -2
  113. package/dist/{chunk-VYQ4URQB.js → chunk-FFRTNF3L.js} +2 -2
  114. package/dist/{chunk-TY6MKIWP.js → chunk-FONWBCVY.js} +3 -3
  115. package/dist/{chunk-XSV2YDCJ.js → chunk-FPLM2TKD.js} +2 -2
  116. package/dist/{chunk-VTU5IEKY.js → chunk-FTPONF6B.js} +2 -2
  117. package/dist/{chunk-6PZGKGAO.js → chunk-FWX7W5PM.js} +2 -2
  118. package/dist/{chunk-QPW3PAIH.js → chunk-G6DFSS6A.js} +2 -2
  119. package/dist/{chunk-2DD6ZHOM.js → chunk-GJ776BC2.js} +3 -3
  120. package/dist/{chunk-XKAR4RF6.js → chunk-GN3WRFJY.js} +6 -6
  121. package/dist/{chunk-RG426DJO.js → chunk-H7NAZ3UB.js} +2 -2
  122. package/dist/{chunk-BSXGTDVJ.js → chunk-HBUFQRIM.js} +2 -2
  123. package/dist/{chunk-FFEBSFVT.js → chunk-HGJ6NJ4E.js} +2 -2
  124. package/dist/{chunk-WB7JSQCP.js → chunk-HIEWDJ2O.js} +5 -2
  125. package/dist/{chunk-WB7JSQCP.js.map → chunk-HIEWDJ2O.js.map} +1 -1
  126. package/dist/{chunk-QTO6BMQZ.js → chunk-I3MSGFGD.js} +17 -6
  127. package/dist/chunk-I3MSGFGD.js.map +1 -0
  128. package/dist/{chunk-5JKUSBMX.js → chunk-IKP5OYQQ.js} +2 -2
  129. package/dist/{chunk-KQAFEZQX.js → chunk-IPLYGWQF.js} +5 -5
  130. package/dist/{chunk-DBY26JJJ.js → chunk-IQ4NVWEF.js} +2 -2
  131. package/dist/{chunk-7Q7JWLQ4.js → chunk-JYG4OLWH.js} +2 -2
  132. package/dist/{chunk-3OTSVCPK.js → chunk-K26NWEOC.js} +4 -4
  133. package/dist/{chunk-WZWZRZ2V.js → chunk-K2UGPTYY.js} +484 -43
  134. package/dist/chunk-K2UGPTYY.js.map +1 -0
  135. package/dist/{chunk-L6CQ7WIW.js → chunk-KFBOPMF6.js} +11 -11
  136. package/dist/chunk-KFBOPMF6.js.map +1 -0
  137. package/dist/{chunk-HOIRB77A.js → chunk-L6Z5OAS4.js} +2 -2
  138. package/dist/{chunk-7RZJWZ46.js → chunk-LEPOP46W.js} +5 -5
  139. package/dist/{chunk-QQXWFDRD.js → chunk-M4YHAODQ.js} +270 -684
  140. package/dist/chunk-M4YHAODQ.js.map +1 -0
  141. package/dist/{chunk-NGT35IGQ.js → chunk-MIH3CJPN.js} +3 -3
  142. package/dist/{chunk-QPAQSG3F.js → chunk-MK5VEWCR.js} +2 -2
  143. package/dist/chunk-NISZQW72.js +140 -0
  144. package/dist/chunk-NISZQW72.js.map +1 -0
  145. package/dist/{chunk-L7RTUEDG.js → chunk-OCIP6YMD.js} +2 -2
  146. package/dist/{chunk-2INWPC6E.js → chunk-PG4QBPVG.js} +20 -10
  147. package/dist/chunk-PG4QBPVG.js.map +1 -0
  148. package/dist/{chunk-DDA55IVB.js → chunk-PT54WISF.js} +189 -55
  149. package/dist/chunk-PT54WISF.js.map +1 -0
  150. package/dist/{chunk-UWJNKGBA.js → chunk-QZLDRQ4I.js} +5 -5
  151. package/dist/{chunk-UYOXFFEY.js → chunk-RUNORG2P.js} +3 -3
  152. package/dist/{chunk-LC3FD4BV.js → chunk-RZQ6W2W4.js} +39 -39
  153. package/dist/{chunk-MRGJZ75M.js → chunk-SMNYAMJD.js} +3 -3
  154. package/dist/{chunk-MKQBXQKU.js → chunk-TB6CBZ5V.js} +22 -15
  155. package/dist/chunk-TB6CBZ5V.js.map +1 -0
  156. package/dist/{chunk-DN2IDKI5.js → chunk-TO7ZTWJW.js} +2 -2
  157. package/dist/{chunk-K2TDK7GG.js → chunk-TWTUGCTY.js} +2 -2
  158. package/dist/{chunk-CUTFSLSD.js → chunk-UCTS3DDH.js} +2 -2
  159. package/dist/{chunk-JYIJNNN3.js → chunk-UG6VXIOK.js} +2 -2
  160. package/dist/{chunk-QOQQMVR2.js → chunk-UKYS3NU5.js} +2 -2
  161. package/dist/{chunk-VZRFGJCH.js → chunk-UPLZNJKN.js} +2 -2
  162. package/dist/{chunk-C23BYTJV.js → chunk-UW5NPZJ2.js} +40 -12
  163. package/dist/chunk-UW5NPZJ2.js.map +1 -0
  164. package/dist/{chunk-DOOWFDWN.js → chunk-V6ERBR7U.js} +2 -2
  165. package/dist/{chunk-7HG7MGAP.js → chunk-W5ZKPI34.js} +462 -2673
  166. package/dist/chunk-W5ZKPI34.js.map +1 -0
  167. package/dist/{chunk-HNDIND7P.js → chunk-XX4HPFFM.js} +54 -15
  168. package/dist/chunk-XX4HPFFM.js.map +1 -0
  169. package/dist/{chunk-N7CXQ5TA.js → chunk-XZHE2DEN.js} +1 -1
  170. package/dist/chunk-YXQEKCZM.js +223 -0
  171. package/dist/chunk-YXQEKCZM.js.map +1 -0
  172. package/dist/{chunk-6NNNURLK.js → chunk-Z54EM5YZ.js} +4 -4
  173. package/dist/{chunk-F2Y6I74C.js → chunk-ZRZVLB7O.js} +2 -2
  174. package/dist/{chunk-CLKBV3Z3.js → chunk-ZUKIUXHQ.js} +9 -9
  175. package/dist/{cli-jfuZXixq.d.ts → cli-BPDUXnAl.d.ts} +5 -5
  176. package/dist/cli.d.ts +22 -22
  177. package/dist/cli.js +66 -58
  178. package/dist/coding/pre-action-gate.d.ts +1 -1
  179. package/dist/compounding/engine.d.ts +2 -2
  180. package/dist/compounding/engine.js +14 -14
  181. package/dist/compounding/preference-consolidator.d.ts +1 -1
  182. package/dist/compression-optimizer.d.ts +1 -1
  183. package/dist/config.d.ts +1 -1
  184. package/dist/config.js +2 -1
  185. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  186. package/dist/connectors/codex-materialize-runner.js +14 -14
  187. package/dist/connectors/codex-materialize.d.ts +1 -1
  188. package/dist/connectors/index.d.ts +1 -1
  189. package/dist/connectors/index.js +14 -14
  190. package/dist/consolidation-provenance-check.d.ts +2 -2
  191. package/dist/consolidation-undo.d.ts +2 -2
  192. package/dist/contradiction/index.d.ts +2 -2
  193. package/dist/contradiction/index.js +2 -2
  194. package/dist/{contradiction-scan-KCADHXPE.js → contradiction-scan-JDTBXRGW.js} +3 -3
  195. package/dist/converge-config.d.ts +1 -1
  196. package/dist/convergence-refresh.d.ts +2 -2
  197. package/dist/convergence-refresh.js +16 -16
  198. package/dist/conversation-index/backend.d.ts +1 -1
  199. package/dist/conversation-index/backend.js +2 -2
  200. package/dist/conversation-index/chunker.d.ts +1 -1
  201. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  202. package/dist/conversation-index/indexer.d.ts +1 -1
  203. package/dist/conversation-index/search.d.ts +1 -1
  204. package/dist/corpus-watermark.d.ts +1 -1
  205. package/dist/corpus-watermark.js +16 -16
  206. package/dist/day-summary.d.ts +1 -1
  207. package/dist/delinearize.d.ts +1 -1
  208. package/dist/dependency-propagation-config.d.ts +1 -1
  209. package/dist/{dependency-propagation-delivery-CTDuAVJc.d.ts → dependency-propagation-delivery-CzEfB31P.d.ts} +1 -1
  210. package/dist/direct-answer-wiring.d.ts +1 -1
  211. package/dist/direct-answer.d.ts +1 -1
  212. package/dist/embedding-fallback.d.ts +1 -1
  213. package/dist/enrichment/index.d.ts +1 -1
  214. package/dist/entity-retrieval.d.ts +2 -2
  215. package/dist/entity-retrieval.js +14 -14
  216. package/dist/entity-schema.d.ts +1 -1
  217. package/dist/explicit-capture.d.ts +9 -9
  218. package/dist/explicit-capture.js +4 -3
  219. package/dist/external-wiki-access.d.ts +22 -22
  220. package/dist/external-wiki-access.js +33 -30
  221. package/dist/external-wiki-collection-registration.d.ts +1 -1
  222. package/dist/external-wiki-collection.d.ts +1 -1
  223. package/dist/external-wiki-mcp-tools.d.ts +22 -22
  224. package/dist/extraction-error-classification.d.ts +1 -1
  225. package/dist/extraction-faithfulness.d.ts +1 -1
  226. package/dist/extraction-faithfulness.js +2 -2
  227. package/dist/extraction-judge-telemetry.d.ts +1 -1
  228. package/dist/extraction-judge-training.d.ts +1 -1
  229. package/dist/extraction-judge.d.ts +1 -1
  230. package/dist/extraction-judge.js +2 -2
  231. package/dist/extraction-liveness.d.ts +1 -1
  232. package/dist/extraction-normalization.d.ts +1 -1
  233. package/dist/extraction-prompt.d.ts +1 -1
  234. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  235. package/dist/extraction-source-grounding.d.ts +1 -1
  236. package/dist/extraction.d.ts +1 -1
  237. package/dist/extraction.js +20 -20
  238. package/dist/fallback-llm.d.ts +14 -1
  239. package/dist/fallback-llm.js +1 -1
  240. package/dist/{first-start-migration-LMMZFLKK.js → first-start-migration-CRZCZAJN.js} +5 -5
  241. package/dist/graph-dashboard-diff.d.ts +1 -1
  242. package/dist/graph-dashboard-key.d.ts +1 -1
  243. package/dist/graph-dashboard-parser.d.ts +1 -1
  244. package/dist/graph-edge-reinforcement.d.ts +1 -1
  245. package/dist/graph-path-reconstruction.d.ts +1 -1
  246. package/dist/graph-path-scoring.d.ts +1 -1
  247. package/dist/graph-snapshot.d.ts +1 -1
  248. package/dist/graph.d.ts +1 -1
  249. package/dist/harmonic-retrieval.js +1 -1
  250. package/dist/importance.d.ts +1 -1
  251. package/dist/importers/index.d.ts +1 -1
  252. package/dist/in-flight-reads.d.ts +1 -1
  253. package/dist/index.d.ts +30 -747
  254. package/dist/index.js +203 -118
  255. package/dist/inline-script.d.ts +3 -0
  256. package/dist/inline-script.js +8 -0
  257. package/dist/inline-script.js.map +1 -0
  258. package/dist/intent.d.ts +1 -1
  259. package/dist/lcm/engine.d.ts +1 -1
  260. package/dist/lcm/engine.js +2 -2
  261. package/dist/lcm/index.d.ts +1 -1
  262. package/dist/lcm/index.js +2 -2
  263. package/dist/lcm/tools.d.ts +1 -1
  264. package/dist/lifecycle.d.ts +1 -1
  265. package/dist/live-connectors-runner.d.ts +1 -1
  266. package/dist/local-llm.d.ts +2 -1
  267. package/dist/local-llm.js +2 -2
  268. package/dist/local-model-endpoint.d.ts +1 -1
  269. package/dist/maintenance/memory-governance.d.ts +1 -1
  270. package/dist/maintenance/memory-governance.js +14 -14
  271. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  272. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -14
  273. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  274. package/dist/maintenance/rebuild-memory-projection.js +15 -15
  275. package/dist/{maintenance-heMZSq7G.d.ts → maintenance-C8aRWfhq.d.ts} +3 -3
  276. package/dist/mcp-memory-inspector-app.d.ts +22 -22
  277. package/dist/mcp-read-only-tools.js +1 -1
  278. package/dist/memory-action-policy.d.ts +1 -1
  279. package/dist/memory-cache.d.ts +1 -1
  280. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  281. package/dist/memory-projection-store.d.ts +1 -1
  282. package/dist/memory-provenance.d.ts +1 -1
  283. package/dist/memory-snapshot.d.ts +1 -1
  284. package/dist/memory-worth-outcomes.d.ts +2 -2
  285. package/dist/models-json.d.ts +1 -1
  286. package/dist/namespaces/migrate.d.ts +3 -3
  287. package/dist/namespaces/migrate.js +15 -15
  288. package/dist/namespaces/principal.d.ts +1 -1
  289. package/dist/namespaces/search.d.ts +1 -1
  290. package/dist/namespaces/search.js +6 -6
  291. package/dist/namespaces/storage.d.ts +3 -3
  292. package/dist/namespaces/storage.js +14 -14
  293. package/dist/native-knowledge.d.ts +1 -1
  294. package/dist/offline-sync-impression-drain.d.ts +1 -1
  295. package/dist/operator-doctor-corpus.d.ts +1 -1
  296. package/dist/operator-doctor-corpus.js +17 -17
  297. package/dist/operator-doctor-replica.d.ts +1 -1
  298. package/dist/operator-toolkit.d.ts +3 -3
  299. package/dist/operator-toolkit.js +23 -22
  300. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  301. package/dist/orchestration/maintenance.d.ts +4 -4
  302. package/dist/orchestration/maintenance.js +19 -19
  303. package/dist/{orchestrator-BQQPsSjs.d.ts → orchestrator-D85CzDDY.d.ts} +8 -8
  304. package/dist/orchestrator.d.ts +9 -9
  305. package/dist/orchestrator.js +86 -80
  306. package/dist/patterns-cli.d.ts +1 -1
  307. package/dist/{pipeline-DFfmsnGk.d.ts → pipeline-DPcUifCO.d.ts} +1 -1
  308. package/dist/policy-runtime.d.ts +1 -1
  309. package/dist/proactive-contention.d.ts +1 -1
  310. package/dist/provenance.d.ts +1 -1
  311. package/dist/public-http-D3GBeII4.d.ts +25 -0
  312. package/dist/{qmd-BF5bcVRs.d.ts → qmd-dFCHp1r0.d.ts} +1 -1
  313. package/dist/qmd-preflight.d.ts +2 -2
  314. package/dist/qmd-recall-cache.d.ts +1 -1
  315. package/dist/qmd.d.ts +2 -2
  316. package/dist/recall-concurrency-config.d.ts +1 -1
  317. package/dist/recall-disclosure-escalation.d.ts +1 -1
  318. package/dist/recall-explain-renderer.d.ts +1 -1
  319. package/dist/recall-explain-renderer.js +3 -3
  320. package/dist/recall-memory-map.d.ts +1 -1
  321. package/dist/recall-planner-llm.d.ts +1 -1
  322. package/dist/recall-planner-llm.js +1 -1
  323. package/dist/recall-state.d.ts +1 -1
  324. package/dist/recall-tag-filter.d.ts +1 -1
  325. package/dist/recall-timings.d.ts +1 -1
  326. package/dist/recall-xray-cli.d.ts +1 -1
  327. package/dist/recall-xray-cli.js +4 -4
  328. package/dist/recall-xray-renderer.d.ts +1 -1
  329. package/dist/recall-xray-renderer.js +3 -3
  330. package/dist/recall-xray.d.ts +1 -1
  331. package/dist/recall-xray.js +2 -2
  332. package/dist/reconcile/cursor.d.ts +1 -1
  333. package/dist/reconcile/manifest.d.ts +1 -1
  334. package/dist/reconcile/plan.d.ts +1 -1
  335. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  336. package/dist/replay/normalizers/claude.d.ts +1 -1
  337. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  338. package/dist/replay/normalizers/shared.d.ts +1 -1
  339. package/dist/replay/runner.d.ts +1 -1
  340. package/dist/replay/types.d.ts +1 -1
  341. package/dist/replica-divergence.d.ts +1 -1
  342. package/dist/replica-peers-config.d.ts +1 -1
  343. package/dist/resolve-auth-token.d.ts +1 -1
  344. package/dist/resume-bundles.js +3 -2
  345. package/dist/retrieval-agents.d.ts +2 -2
  346. package/dist/retrieval-tiers.d.ts +1 -1
  347. package/dist/routing/engine.d.ts +1 -1
  348. package/dist/routing/store.d.ts +1 -1
  349. package/dist/salvage-envelope.d.ts +1 -1
  350. package/dist/{scope-profiles-CbUOsE_E.d.ts → scope-profiles-DICK7GtN.d.ts} +1 -1
  351. package/dist/search/embed-helper.d.ts +1 -1
  352. package/dist/search/factory.d.ts +1 -1
  353. package/dist/search/factory.js +5 -5
  354. package/dist/search/index.d.ts +1 -1
  355. package/dist/search/index.js +9 -9
  356. package/dist/search/lancedb-backend.d.ts +1 -1
  357. package/dist/search/meilisearch-backend.d.ts +1 -1
  358. package/dist/search/noop-backend.d.ts +1 -1
  359. package/dist/search/orama-backend.d.ts +1 -1
  360. package/dist/search/port.d.ts +1 -1
  361. package/dist/search/remote-backend.d.ts +1 -1
  362. package/dist/{semantic-consolidation-DAB3xdKM.d.ts → semantic-consolidation-BP7NAX0N.d.ts} +1 -1
  363. package/dist/semantic-consolidation.d.ts +2 -2
  364. package/dist/semantic-consolidation.js +15 -15
  365. package/dist/semantic-rule-promotion.js +14 -14
  366. package/dist/semantic-rule-verifier.d.ts +1 -1
  367. package/dist/semantic-rule-verifier.js +14 -14
  368. package/dist/{service-DGKg2O6r.d.ts → service-DT-pJyda.d.ts} +660 -660
  369. package/dist/session-observer-bands.d.ts +1 -1
  370. package/dist/session-observer-state.d.ts +1 -1
  371. package/dist/shared-context/manager.d.ts +1 -1
  372. package/dist/signal.d.ts +1 -1
  373. package/dist/source-agent-qualifier.d.ts +1 -1
  374. package/dist/source-agent-qualifier.js +16 -16
  375. package/dist/{storage-CC1jKcWg.d.ts → storage-qOnaJ1Lw.d.ts} +4 -1
  376. package/dist/storage.d.ts +2 -2
  377. package/dist/storage.js +13 -13
  378. package/dist/summarizer.d.ts +1 -1
  379. package/dist/summarizer.js +5 -5
  380. package/dist/summary-snapshot.d.ts +1 -1
  381. package/dist/support-passport/index.d.ts +518 -0
  382. package/dist/support-passport/index.js +357 -0
  383. package/dist/support-passport/index.js.map +1 -0
  384. package/dist/temporal-supersession.d.ts +2 -2
  385. package/dist/temporal-timeline-recall.d.ts +1 -1
  386. package/dist/temporal-validity.d.ts +1 -1
  387. package/dist/threading.d.ts +1 -1
  388. package/dist/tier-migration.d.ts +2 -2
  389. package/dist/tier-routing.d.ts +1 -1
  390. package/dist/tier-routing.js +2 -2
  391. package/dist/{tier-stats-JDN6HRNT.js → tier-stats-EXYSKSVN.js} +3 -3
  392. package/dist/topics.d.ts +1 -1
  393. package/dist/transcript.d.ts +1 -1
  394. package/dist/transfer/autodetect.js +1 -1
  395. package/dist/transfer/backup.js +1 -1
  396. package/dist/transfer/capsule-export.js +2 -2
  397. package/dist/transfer/types.d.ts +24 -24
  398. package/dist/trust-score-stage.d.ts +1 -1
  399. package/dist/trust-score.d.ts +1 -1
  400. package/dist/{types-BnQza1y8.d.ts → types-ed-SvS2t.d.ts} +7 -1
  401. package/dist/types.d.ts +1 -1
  402. package/dist/types.js +1 -1
  403. package/dist/utility-runtime.d.ts +1 -1
  404. package/dist/verified-recall.js +14 -14
  405. package/dist/write-envelope.d.ts +1 -1
  406. package/dist/write-rate-limiter.d.ts +11 -5
  407. package/dist/write-rate-limiter.js +1 -1
  408. package/package.json +12 -2
  409. package/scripts/build-with-heap.mjs +11 -1
  410. package/src/access-authorization-probe.ts +20 -2
  411. package/src/access-boundary.ts +32 -0
  412. package/src/access-http.test.ts +1940 -643
  413. package/src/access-http.ts +81 -74
  414. package/src/access-mcp.ts +3 -1
  415. package/src/access-operations.ts +2 -0
  416. package/src/access-service.ts +612 -845
  417. package/src/access-surface-catalog.test.ts +40 -10
  418. package/src/access-surface-catalog.ts +15 -0
  419. package/src/active-memory-bridge.ts +17 -19
  420. package/src/config.ts +18 -9
  421. package/src/fallback-llm.test.ts +54 -0
  422. package/src/fallback-llm.ts +54 -9
  423. package/src/inline-script.ts +6 -0
  424. package/src/local-llm-headers-timeout.test.ts +42 -0
  425. package/src/local-llm.ts +8 -8
  426. package/src/mcp-read-only-tools.ts +3 -0
  427. package/src/relay/mission-access.test.ts +11 -11
  428. package/src/relay/mission-ui.test.ts +3 -1
  429. package/src/storage/tombstone-blocked-capture-sync.ts +31 -0
  430. package/src/storage-contract/failure-semantics.test.ts +102 -0
  431. package/src/support-passport/access-http-base.ts +143 -0
  432. package/src/support-passport/access-http.ts +172 -0
  433. package/src/support-passport/access-operations.ts +272 -0
  434. package/src/support-passport/access-service-base.test.ts +193 -0
  435. package/src/support-passport/access-service-base.ts +176 -0
  436. package/src/support-passport/access-surface.test.ts +283 -0
  437. package/src/support-passport/access-surface.ts +286 -0
  438. package/src/support-passport/card-projection.test.ts +8 -0
  439. package/src/support-passport/card-projection.ts +77 -16
  440. package/src/support-passport/card-replacement.ts +126 -0
  441. package/src/support-passport/card-service-commit-forwarding.test.ts +160 -0
  442. package/src/support-passport/card-service.test.ts +533 -31
  443. package/src/support-passport/card-service.ts +506 -364
  444. package/src/support-passport/card-state.ts +158 -0
  445. package/src/support-passport/config-model-routing.test.ts +37 -0
  446. package/src/support-passport/config.test.ts +34 -0
  447. package/src/support-passport/config.ts +41 -0
  448. package/src/support-passport/contracts.test.ts +15 -2
  449. package/src/support-passport/contracts.ts +13 -0
  450. package/src/support-passport/errors.ts +6 -0
  451. package/src/support-passport/generated-batch.test.ts +185 -0
  452. package/src/support-passport/generated-batch.ts +338 -0
  453. package/src/support-passport/grant-contracts.ts +45 -1
  454. package/src/support-passport/grant-generated-batch-scope.test.ts +201 -0
  455. package/src/support-passport/grant-service-cache.test.ts +2 -2
  456. package/src/support-passport/grant-service-cancellation.test.ts +2 -0
  457. package/src/support-passport/grant-service-marker-cache.test.ts +62 -0
  458. package/src/support-passport/grant-service.test.ts +853 -239
  459. package/src/support-passport/grant-service.ts +206 -57
  460. package/src/support-passport/grant-store.ts +7 -3
  461. package/src/support-passport/index.ts +10 -0
  462. package/src/support-passport/mcp-tools.test.ts +222 -0
  463. package/src/support-passport/mcp-tools.ts +187 -0
  464. package/src/support-passport/model-adapter.test.ts +840 -0
  465. package/src/support-passport/model-adapter.ts +602 -0
  466. package/src/support-passport/model-audit-pinned-write.test.ts +59 -0
  467. package/src/support-passport/model-audit.ts +152 -0
  468. package/src/support-passport/model-bridge.test.ts +456 -0
  469. package/src/support-passport/model-bridge.ts +439 -0
  470. package/src/support-passport/model-contracts.ts +124 -0
  471. package/src/support-passport/model-service.test.ts +1731 -0
  472. package/src/support-passport/model-service.ts +399 -0
  473. package/src/support-passport/owner-http.test.ts +671 -0
  474. package/src/support-passport/owner-lock.ts +26 -9
  475. package/src/support-passport/private-file.test.ts +99 -0
  476. package/src/support-passport/private-file.ts +139 -12
  477. package/src/support-passport/public-http.test.ts +476 -0
  478. package/src/support-passport/public-http.ts +601 -0
  479. package/src/support-passport/ui.test.ts +181 -0
  480. package/src/types.ts +7 -0
  481. package/src/write-rate-limiter.test.ts +30 -6
  482. package/src/write-rate-limiter.ts +29 -18
  483. package/dist/chunk-2INWPC6E.js.map +0 -1
  484. package/dist/chunk-2PNXOQ4P.js.map +0 -1
  485. package/dist/chunk-3SXLD5T3.js.map +0 -1
  486. package/dist/chunk-3WGI7F4V.js.map +0 -1
  487. package/dist/chunk-7HG7MGAP.js.map +0 -1
  488. package/dist/chunk-BIF4SHMD.js.map +0 -1
  489. package/dist/chunk-C23BYTJV.js.map +0 -1
  490. package/dist/chunk-CSY44OKU.js.map +0 -1
  491. package/dist/chunk-DDA55IVB.js.map +0 -1
  492. package/dist/chunk-HNDIND7P.js.map +0 -1
  493. package/dist/chunk-L6CQ7WIW.js.map +0 -1
  494. package/dist/chunk-MKQBXQKU.js.map +0 -1
  495. package/dist/chunk-QQXWFDRD.js.map +0 -1
  496. package/dist/chunk-QTO6BMQZ.js.map +0 -1
  497. package/dist/chunk-WZWZRZ2V.js.map +0 -1
  498. /package/dist/{auto-sync-TDHLZPVP.js.map → auto-sync-NR3GPCOA.js.map} +0 -0
  499. /package/dist/{chunk-LLJMAULE.js.map → chunk-2FKEIPIT.js.map} +0 -0
  500. /package/dist/{chunk-AU7Q3LSC.js.map → chunk-2QSZNTDO.js.map} +0 -0
  501. /package/dist/{chunk-TKFGFDPJ.js.map → chunk-3TIZPSJC.js.map} +0 -0
  502. /package/dist/{chunk-B4T3FQMT.js.map → chunk-43SEBY2M.js.map} +0 -0
  503. /package/dist/{chunk-LVKYLMSM.js.map → chunk-46SZBVDS.js.map} +0 -0
  504. /package/dist/{chunk-YKZLOPTC.js.map → chunk-5FD7JMTX.js.map} +0 -0
  505. /package/dist/{chunk-WM5LD6AT.js.map → chunk-6CYHUWCO.js.map} +0 -0
  506. /package/dist/{chunk-YR65W7BV.js.map → chunk-BRR5EUTF.js.map} +0 -0
  507. /package/dist/{chunk-JKW663ZN.js.map → chunk-CIAI24TQ.js.map} +0 -0
  508. /package/dist/{chunk-YDWPYDML.js.map → chunk-EKTP7MNS.js.map} +0 -0
  509. /package/dist/{chunk-6LEIWWAF.js.map → chunk-F2JRDPON.js.map} +0 -0
  510. /package/dist/{chunk-VYQ4URQB.js.map → chunk-FFRTNF3L.js.map} +0 -0
  511. /package/dist/{chunk-TY6MKIWP.js.map → chunk-FONWBCVY.js.map} +0 -0
  512. /package/dist/{chunk-XSV2YDCJ.js.map → chunk-FPLM2TKD.js.map} +0 -0
  513. /package/dist/{chunk-VTU5IEKY.js.map → chunk-FTPONF6B.js.map} +0 -0
  514. /package/dist/{chunk-6PZGKGAO.js.map → chunk-FWX7W5PM.js.map} +0 -0
  515. /package/dist/{chunk-QPW3PAIH.js.map → chunk-G6DFSS6A.js.map} +0 -0
  516. /package/dist/{chunk-2DD6ZHOM.js.map → chunk-GJ776BC2.js.map} +0 -0
  517. /package/dist/{chunk-XKAR4RF6.js.map → chunk-GN3WRFJY.js.map} +0 -0
  518. /package/dist/{chunk-RG426DJO.js.map → chunk-H7NAZ3UB.js.map} +0 -0
  519. /package/dist/{chunk-BSXGTDVJ.js.map → chunk-HBUFQRIM.js.map} +0 -0
  520. /package/dist/{chunk-FFEBSFVT.js.map → chunk-HGJ6NJ4E.js.map} +0 -0
  521. /package/dist/{chunk-5JKUSBMX.js.map → chunk-IKP5OYQQ.js.map} +0 -0
  522. /package/dist/{chunk-KQAFEZQX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  523. /package/dist/{chunk-DBY26JJJ.js.map → chunk-IQ4NVWEF.js.map} +0 -0
  524. /package/dist/{chunk-7Q7JWLQ4.js.map → chunk-JYG4OLWH.js.map} +0 -0
  525. /package/dist/{chunk-3OTSVCPK.js.map → chunk-K26NWEOC.js.map} +0 -0
  526. /package/dist/{chunk-HOIRB77A.js.map → chunk-L6Z5OAS4.js.map} +0 -0
  527. /package/dist/{chunk-7RZJWZ46.js.map → chunk-LEPOP46W.js.map} +0 -0
  528. /package/dist/{chunk-NGT35IGQ.js.map → chunk-MIH3CJPN.js.map} +0 -0
  529. /package/dist/{chunk-QPAQSG3F.js.map → chunk-MK5VEWCR.js.map} +0 -0
  530. /package/dist/{chunk-L7RTUEDG.js.map → chunk-OCIP6YMD.js.map} +0 -0
  531. /package/dist/{chunk-UWJNKGBA.js.map → chunk-QZLDRQ4I.js.map} +0 -0
  532. /package/dist/{chunk-UYOXFFEY.js.map → chunk-RUNORG2P.js.map} +0 -0
  533. /package/dist/{chunk-LC3FD4BV.js.map → chunk-RZQ6W2W4.js.map} +0 -0
  534. /package/dist/{chunk-MRGJZ75M.js.map → chunk-SMNYAMJD.js.map} +0 -0
  535. /package/dist/{chunk-DN2IDKI5.js.map → chunk-TO7ZTWJW.js.map} +0 -0
  536. /package/dist/{chunk-K2TDK7GG.js.map → chunk-TWTUGCTY.js.map} +0 -0
  537. /package/dist/{chunk-CUTFSLSD.js.map → chunk-UCTS3DDH.js.map} +0 -0
  538. /package/dist/{chunk-JYIJNNN3.js.map → chunk-UG6VXIOK.js.map} +0 -0
  539. /package/dist/{chunk-QOQQMVR2.js.map → chunk-UKYS3NU5.js.map} +0 -0
  540. /package/dist/{chunk-VZRFGJCH.js.map → chunk-UPLZNJKN.js.map} +0 -0
  541. /package/dist/{chunk-DOOWFDWN.js.map → chunk-V6ERBR7U.js.map} +0 -0
  542. /package/dist/{chunk-N7CXQ5TA.js.map → chunk-XZHE2DEN.js.map} +0 -0
  543. /package/dist/{chunk-6NNNURLK.js.map → chunk-Z54EM5YZ.js.map} +0 -0
  544. /package/dist/{chunk-F2Y6I74C.js.map → chunk-ZRZVLB7O.js.map} +0 -0
  545. /package/dist/{chunk-CLKBV3Z3.js.map → chunk-ZUKIUXHQ.js.map} +0 -0
  546. /package/dist/{contradiction-scan-KCADHXPE.js.map → contradiction-scan-JDTBXRGW.js.map} +0 -0
  547. /package/dist/{first-start-migration-LMMZFLKK.js.map → first-start-migration-CRZCZAJN.js.map} +0 -0
  548. /package/dist/{tier-stats-JDN6HRNT.js.map → tier-stats-EXYSKSVN.js.map} +0 -0
@@ -0,0 +1,152 @@
1
+ import { createHash } from "node:crypto";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+
5
+ import { expandTildePath } from "../utils/path.js";
6
+ import { serializeMutations, withHeldFileLock } from "../utils/serialize-mutations.js";
7
+ import {
8
+ appendPrivateFileInPinnedDirectory,
9
+ ensurePrivateDirectoryNoFollow,
10
+ ensurePrivateDirectoryTreeNoFollow,
11
+ withPrivateDirectoryNoFollow,
12
+ } from "./private-file.js";
13
+
14
+ const HashSchema = z.string().regex(/^[a-f0-9]{64}$/);
15
+
16
+ export const SupportPassportModelAuditRecordSchema = z
17
+ .object({
18
+ schemaVersion: z.literal(1),
19
+ operation: z.enum(["draft_cards", "answer_question"]),
20
+ actorHash: HashSchema,
21
+ subjectIdsHash: HashSchema,
22
+ modelUsed: z.string().trim().min(1).max(256),
23
+ route: z.enum(["local", "direct", "gateway", "unavailable"]),
24
+ outputSchemaVersion: z.literal(1),
25
+ outcome: z.enum(["success", "error"]),
26
+ errorClass: z
27
+ .string()
28
+ .trim()
29
+ .min(1)
30
+ .max(64)
31
+ .regex(/^[a-z0-9_-]+$/)
32
+ .optional(),
33
+ occurredAt: z.string().datetime({ offset: true }),
34
+ latencyMs: z.number().int().nonnegative(),
35
+ usage: z
36
+ .object({
37
+ inputTokens: z.number().int().nonnegative().optional(),
38
+ outputTokens: z.number().int().nonnegative().optional(),
39
+ totalTokens: z.number().int().nonnegative().optional(),
40
+ })
41
+ .strict()
42
+ .optional(),
43
+ })
44
+ .strict()
45
+ .superRefine((record, ctx) => {
46
+ if (record.outcome === "error" && !record.errorClass) {
47
+ ctx.addIssue({
48
+ code: z.ZodIssueCode.custom,
49
+ message: "error records require an error class",
50
+ path: ["errorClass"],
51
+ });
52
+ }
53
+ if (record.outcome === "success" && record.errorClass) {
54
+ ctx.addIssue({
55
+ code: z.ZodIssueCode.custom,
56
+ message: "success records cannot have an error class",
57
+ path: ["errorClass"],
58
+ });
59
+ }
60
+ });
61
+
62
+ export type SupportPassportModelAuditRecord = z.infer<typeof SupportPassportModelAuditRecordSchema>;
63
+
64
+ export interface SupportPassportModelAuditSink {
65
+ record(record: SupportPassportModelAuditRecord): Promise<void>;
66
+ }
67
+
68
+ export function hashSupportPassportAuditValues(domain: string, values: string[]): string {
69
+ return createHash("sha256")
70
+ .update(`support-passport-audit:${domain}:v1`)
71
+ .update("\0")
72
+ .update([...values].sort().join("\0"))
73
+ .digest("hex");
74
+ }
75
+
76
+ export class SupportPassportModelAuditStore implements SupportPassportModelAuditSink {
77
+ private memoryDir: string;
78
+ private auditDir: string;
79
+ private memoryRootReady?: Promise<void>;
80
+ private readonly runWithHeldFileLock: typeof withHeldFileLock;
81
+
82
+ constructor(options: {
83
+ memoryDir: string;
84
+ withHeldFileLock?: typeof withHeldFileLock;
85
+ }) {
86
+ this.memoryDir = path.resolve(expandTildePath(options.memoryDir));
87
+ this.auditDir = path.join(this.memoryDir, "state", "support-passport", "audit");
88
+ this.runWithHeldFileLock = options.withHeldFileLock ?? withHeldFileLock;
89
+ }
90
+
91
+ async record(input: SupportPassportModelAuditRecord): Promise<void> {
92
+ const record = SupportPassportModelAuditRecordSchema.parse(input);
93
+ await this.ensureSafeDirectories();
94
+ const day = record.occurredAt.slice(0, 10);
95
+ const filePath = path.join(this.auditDir, `${day}.jsonl`);
96
+ await serializeMutations(`support-passport-audit:${filePath}`, () =>
97
+ withPrivateDirectoryNoFollow(
98
+ this.memoryDir,
99
+ this.auditDir,
100
+ "support passport audit directory must remain inside the memory directory",
101
+ async (pinnedDirectory) =>
102
+ await this.runWithHeldFileLock(
103
+ path.join(pinnedDirectory, `.${day}.lock`),
104
+ {
105
+ staleMs: 30_000,
106
+ maxWaitMs: 5_000,
107
+ heartbeatMs: 10_000,
108
+ },
109
+ async (acquired) => {
110
+ if (!acquired) throw new Error("could not acquire the support passport audit lock");
111
+ await appendPrivateFileInPinnedDirectory(
112
+ pinnedDirectory,
113
+ `${day}.jsonl`,
114
+ `${JSON.stringify(record)}\n`,
115
+ "support passport audit paths must be regular files in a stable directory"
116
+ );
117
+ }
118
+ )
119
+ )
120
+ );
121
+ }
122
+
123
+ private async ensureSafeDirectories(): Promise<void> {
124
+ await this.ensureMemoryRoot();
125
+ await ensurePrivateDirectoryNoFollow(
126
+ this.memoryDir,
127
+ this.auditDir,
128
+ "support passport audit directory must remain inside the memory directory"
129
+ );
130
+ }
131
+
132
+ private async ensureMemoryRoot(): Promise<void> {
133
+ if (!this.memoryRootReady) {
134
+ const configuredMemoryDir = this.memoryDir;
135
+ this.memoryRootReady = (async () => {
136
+ await ensurePrivateDirectoryTreeNoFollow(
137
+ configuredMemoryDir,
138
+ "support passport memory directory must be a stable directory"
139
+ );
140
+ this.memoryDir = configuredMemoryDir;
141
+ this.auditDir = path.join(configuredMemoryDir, "state", "support-passport", "audit");
142
+ })();
143
+ }
144
+ const currentAttempt = this.memoryRootReady;
145
+ try {
146
+ await currentAttempt;
147
+ } catch (error) {
148
+ if (this.memoryRootReady === currentAttempt) this.memoryRootReady = undefined;
149
+ throw error;
150
+ }
151
+ }
152
+ }
@@ -0,0 +1,456 @@
1
+ import assert from "node:assert/strict";
2
+ import http from "node:http";
3
+ import test from "node:test";
4
+
5
+ import {
6
+ SUPPORT_PASSPORT_MODEL_ACK_PATH,
7
+ SUPPORT_PASSPORT_MODEL_JOB_PATH,
8
+ SUPPORT_PASSPORT_MODEL_RESULT_PATH,
9
+ SupportPassportModelBridge,
10
+ } from "./model-bridge.js";
11
+ import { SupportPassportDraftModelInputSchema } from "./model-contracts.js";
12
+
13
+ function startBridgeServer(bridge: SupportPassportModelBridge) {
14
+ const server = http.createServer((req, res) => {
15
+ void bridge.requestHandler(req, res, {
16
+ authorized: req.headers.authorization === "Bearer owner-token",
17
+ tokenAuthorized:
18
+ req.headers.authorization === "Bearer owner-token" || req.headers.authorization === "Bearer scoped-token",
19
+ ...(req.headers.authorization === "Bearer scoped-token"
20
+ ? { capabilities: { version: 1 as const, ops: ["recall"] } }
21
+ : {}),
22
+ });
23
+ });
24
+ return new Promise<{ origin: string; close(): Promise<void> }>((resolve, reject) => {
25
+ server.once("error", reject);
26
+ server.listen(0, "127.0.0.1", () => {
27
+ const address = server.address();
28
+ if (!address || typeof address === "string") throw new Error("server did not bind");
29
+ resolve({
30
+ origin: `http://127.0.0.1:${address.port}`,
31
+ close: () => new Promise((done) => server.close(() => done())),
32
+ });
33
+ });
34
+ });
35
+ }
36
+
37
+ const messages = [
38
+ { role: "system" as const, content: "Return JSON." },
39
+ { role: "user" as const, content: JSON.stringify({ sourceNotes: [{ memoryId: "memory-1" }] }) },
40
+ ];
41
+
42
+ async function announceWorker(origin: string): Promise<void> {
43
+ const response = await fetch(`${origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
44
+ method: "POST",
45
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
46
+ body: JSON.stringify({ timeoutMs: 0 }),
47
+ });
48
+ assert.equal(response.status, 204);
49
+ }
50
+
51
+ test("the model bridge moves a provider-neutral job through authenticated memory only", async () => {
52
+ const bridge = new SupportPassportModelBridge();
53
+ const server = await startBridgeServer(bridge);
54
+ const controller = new AbortController();
55
+ try {
56
+ await announceWorker(server.origin);
57
+ const resultPromise = bridge.route.invoke(messages, {
58
+ temperature: 0.2,
59
+ maxTokens: 500,
60
+ timeoutMs: 5_000,
61
+ signal: controller.signal,
62
+ operation: "support-passport-draft",
63
+ jsonSchema: { name: "drafts", schema: { type: "object" } },
64
+ });
65
+ const jobResponse = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
66
+ method: "POST",
67
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
68
+ body: JSON.stringify({ timeoutMs: 0 }),
69
+ });
70
+ assert.equal(jobResponse.status, 200);
71
+ const job = (await jobResponse.json()) as { id: string; messages: unknown; timeoutMs: number };
72
+ assert.deepEqual(job.messages, messages);
73
+ assert.ok(job.timeoutMs > 0);
74
+ assert.ok(job.timeoutMs <= 5_000);
75
+ assert.equal("deadlineAt" in job, false);
76
+
77
+ const completion = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_RESULT_PATH}`, {
78
+ method: "POST",
79
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
80
+ body: JSON.stringify({
81
+ id: job.id,
82
+ result: { content: '{"cards":[]}', modelUsed: "gateway/test" },
83
+ }),
84
+ });
85
+ assert.equal(completion.status, 204);
86
+ assert.deepEqual(await resultPromise, {
87
+ content: '{"cards":[]}',
88
+ modelUsed: "gateway/test",
89
+ });
90
+ } finally {
91
+ controller.abort();
92
+ bridge.close();
93
+ await server.close();
94
+ }
95
+ });
96
+
97
+ test("the model bridge accepts the maximum JSON-escaped valid draft payload", async () => {
98
+ const bridge = new SupportPassportModelBridge();
99
+ const server = await startBridgeServer(bridge);
100
+ const controller = new AbortController();
101
+ try {
102
+ const draft = SupportPassportDraftModelInputSchema.parse({
103
+ consent: true,
104
+ memories: Array.from({ length: 20 }, (_, index) => ({
105
+ memoryId: `${"\0".repeat(510)}${String(index).padStart(2, "0")}`,
106
+ content: "\0".repeat(5_000),
107
+ })),
108
+ });
109
+ const escapedMessages = [
110
+ { role: "system" as const, content: "Return JSON." },
111
+ { role: "user" as const, content: JSON.stringify({ sourceNotes: draft.memories }) },
112
+ ];
113
+ assert.ok(escapedMessages[1].content.length > 600_000);
114
+ await announceWorker(server.origin);
115
+
116
+ const resultPromise = bridge.route.invoke(escapedMessages, {
117
+ temperature: 0.2,
118
+ maxTokens: 500,
119
+ timeoutMs: 5_000,
120
+ signal: controller.signal,
121
+ operation: "support-passport-draft",
122
+ jsonSchema: { name: "drafts", schema: { type: "object" } },
123
+ });
124
+ const jobResponse = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
125
+ method: "POST",
126
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
127
+ body: JSON.stringify({ timeoutMs: 0 }),
128
+ });
129
+
130
+ assert.equal(jobResponse.status, 200);
131
+ const job = (await jobResponse.json()) as { messages: unknown };
132
+ assert.deepEqual(job.messages, escapedMessages);
133
+ controller.abort();
134
+ assert.equal(await resultPromise, null);
135
+ } finally {
136
+ controller.abort();
137
+ bridge.close();
138
+ await server.close();
139
+ }
140
+ });
141
+
142
+ test("the model bridge rejects missing and scoped operator credentials", async () => {
143
+ const bridge = new SupportPassportModelBridge();
144
+ const server = await startBridgeServer(bridge);
145
+ try {
146
+ const request = (authorization?: string) =>
147
+ fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
148
+ method: "POST",
149
+ headers: {
150
+ ...(authorization ? { authorization } : {}),
151
+ "content-type": "application/json",
152
+ },
153
+ body: JSON.stringify({ timeoutMs: 0 }),
154
+ });
155
+ assert.equal((await request()).status, 401);
156
+ assert.equal((await request("Bearer scoped-token")).status, 403);
157
+ } finally {
158
+ bridge.close();
159
+ await server.close();
160
+ }
161
+ });
162
+
163
+ test("an aborted model caller removes its queued job", async () => {
164
+ const bridge = new SupportPassportModelBridge();
165
+ const server = await startBridgeServer(bridge);
166
+ const controller = new AbortController();
167
+ try {
168
+ await announceWorker(server.origin);
169
+ const resultPromise = bridge.route.invoke(messages, {
170
+ temperature: 0,
171
+ maxTokens: 500,
172
+ timeoutMs: 5_000,
173
+ signal: controller.signal,
174
+ operation: "support-passport-draft",
175
+ jsonSchema: { name: "drafts", schema: { type: "object" } },
176
+ });
177
+ controller.abort();
178
+ assert.equal(await resultPromise, null);
179
+ const response = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
180
+ method: "POST",
181
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
182
+ body: JSON.stringify({ timeoutMs: 0 }),
183
+ });
184
+ assert.equal(response.status, 204);
185
+ } finally {
186
+ bridge.close();
187
+ await server.close();
188
+ }
189
+ });
190
+
191
+ test("an unclaimed model job expires without relying on the caller's wrapper", async () => {
192
+ const bridge = new SupportPassportModelBridge();
193
+ const server = await startBridgeServer(bridge);
194
+ const started = Date.now();
195
+ try {
196
+ await announceWorker(server.origin);
197
+ const result = await bridge.route.invoke(messages, {
198
+ temperature: 0,
199
+ maxTokens: 500,
200
+ timeoutMs: 20,
201
+ operation: "support-passport-draft",
202
+ jsonSchema: { name: "drafts", schema: { type: "object" } },
203
+ });
204
+ assert.equal(result, null);
205
+ assert.ok(Date.now() - started < 1_000);
206
+ } finally {
207
+ bridge.close();
208
+ await server.close();
209
+ }
210
+ });
211
+
212
+ test("an unacknowledged leased job becomes available to another worker", async () => {
213
+ const bridge = new SupportPassportModelBridge({ claimAckTimeoutMs: 20 });
214
+ const server = await startBridgeServer(bridge);
215
+ const controller = new AbortController();
216
+ try {
217
+ await announceWorker(server.origin);
218
+ const resultPromise = bridge.route.invoke(messages, {
219
+ temperature: 0,
220
+ maxTokens: 500,
221
+ timeoutMs: 5_000,
222
+ signal: controller.signal,
223
+ operation: "support-passport-draft",
224
+ jsonSchema: { name: "drafts", schema: { type: "object" } },
225
+ });
226
+ const poll = () =>
227
+ fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
228
+ method: "POST",
229
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
230
+ body: JSON.stringify({ timeoutMs: 100, claimLease: true }),
231
+ });
232
+ const firstResponse = await poll();
233
+ assert.equal(firstResponse.status, 200);
234
+ const first = (await firstResponse.json()) as { id: string; claimId: string; claimAckTimeoutMs: number };
235
+ assert.equal(first.claimAckTimeoutMs, 20);
236
+
237
+ await new Promise((resolve) => setTimeout(resolve, 30));
238
+ const secondResponse = await poll();
239
+ assert.equal(secondResponse.status, 200);
240
+ const second = (await secondResponse.json()) as { id: string; claimId: string };
241
+ assert.equal(second.id, first.id);
242
+ assert.notEqual(second.claimId, first.claimId);
243
+
244
+ const staleAck = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_ACK_PATH}`, {
245
+ method: "POST",
246
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
247
+ body: JSON.stringify({ id: first.id, claimId: first.claimId }),
248
+ });
249
+ assert.equal(staleAck.status, 404);
250
+ const currentAck = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_ACK_PATH}`, {
251
+ method: "POST",
252
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
253
+ body: JSON.stringify({ id: second.id, claimId: second.claimId }),
254
+ });
255
+ assert.equal(currentAck.status, 204);
256
+
257
+ const completion = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_RESULT_PATH}`, {
258
+ method: "POST",
259
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
260
+ body: JSON.stringify({
261
+ id: second.id,
262
+ claimId: second.claimId,
263
+ result: { content: "{}", modelUsed: "gateway/local" },
264
+ }),
265
+ });
266
+ assert.equal(completion.status, 204);
267
+ assert.deepEqual(await resultPromise, { content: "{}", modelUsed: "gateway/local" });
268
+ } finally {
269
+ controller.abort();
270
+ bridge.close();
271
+ await server.close();
272
+ }
273
+ });
274
+
275
+ test("an acknowledged leased job is requeued when its worker stops renewing", async () => {
276
+ const bridge = new SupportPassportModelBridge({ claimAckTimeoutMs: 100, executionLeaseTimeoutMs: 30 });
277
+ const server = await startBridgeServer(bridge);
278
+ const controller = new AbortController();
279
+ try {
280
+ await announceWorker(server.origin);
281
+ const resultPromise = bridge.route.invoke(messages, {
282
+ temperature: 0,
283
+ maxTokens: 500,
284
+ timeoutMs: 5_000,
285
+ signal: controller.signal,
286
+ operation: "support-passport-draft",
287
+ jsonSchema: { name: "drafts", schema: { type: "object" } },
288
+ });
289
+ const poll = () =>
290
+ fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
291
+ method: "POST",
292
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
293
+ body: JSON.stringify({ timeoutMs: 100, claimLease: true }),
294
+ });
295
+ const firstResponse = await poll();
296
+ assert.equal(firstResponse.status, 200);
297
+ const first = (await firstResponse.json()) as {
298
+ id: string;
299
+ claimId: string;
300
+ executionLeaseTimeoutMs: number;
301
+ };
302
+ assert.equal(first.executionLeaseTimeoutMs, 30);
303
+
304
+ const acknowledgement = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_ACK_PATH}`, {
305
+ method: "POST",
306
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
307
+ body: JSON.stringify({ id: first.id, claimId: first.claimId }),
308
+ });
309
+ assert.equal(acknowledgement.status, 204);
310
+
311
+ await new Promise((resolve) => setTimeout(resolve, 50));
312
+ const secondResponse = await poll();
313
+ assert.equal(secondResponse.status, 200);
314
+ const second = (await secondResponse.json()) as { id: string; claimId: string };
315
+ assert.equal(second.id, first.id);
316
+ assert.notEqual(second.claimId, first.claimId);
317
+
318
+ const staleResult = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_RESULT_PATH}`, {
319
+ method: "POST",
320
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
321
+ body: JSON.stringify({
322
+ id: first.id,
323
+ claimId: first.claimId,
324
+ result: { content: "{}", modelUsed: "stale-worker" },
325
+ }),
326
+ });
327
+ assert.equal(staleResult.status, 404);
328
+
329
+ const completion = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_RESULT_PATH}`, {
330
+ method: "POST",
331
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
332
+ body: JSON.stringify({
333
+ id: second.id,
334
+ claimId: second.claimId,
335
+ result: { content: "{}", modelUsed: "gateway/local" },
336
+ }),
337
+ });
338
+ assert.equal(completion.status, 204);
339
+ assert.deepEqual(await resultPromise, { content: "{}", modelUsed: "gateway/local" });
340
+ } finally {
341
+ controller.abort();
342
+ bridge.close();
343
+ await server.close();
344
+ }
345
+ });
346
+
347
+ test("an empty long poll keeps the bridge available during worker handoff", async () => {
348
+ const bridge = new SupportPassportModelBridge();
349
+ const server = await startBridgeServer(bridge);
350
+ const controller = new AbortController();
351
+ try {
352
+ const emptyPoll = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
353
+ method: "POST",
354
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
355
+ body: JSON.stringify({ timeoutMs: 1_100 }),
356
+ });
357
+ assert.equal(emptyPoll.status, 204);
358
+
359
+ const resultPromise = bridge.route.invoke(messages, {
360
+ temperature: 0,
361
+ maxTokens: 500,
362
+ timeoutMs: 5_000,
363
+ signal: controller.signal,
364
+ operation: "support-passport-draft",
365
+ jsonSchema: { name: "drafts", schema: { type: "object" } },
366
+ });
367
+ const jobResponse = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
368
+ method: "POST",
369
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
370
+ body: JSON.stringify({ timeoutMs: 0 }),
371
+ });
372
+ assert.equal(jobResponse.status, 200);
373
+ const job = (await jobResponse.json()) as { id: string };
374
+
375
+ const completion = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_RESULT_PATH}`, {
376
+ method: "POST",
377
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
378
+ body: JSON.stringify({
379
+ id: job.id,
380
+ result: { content: "{}", modelUsed: "gateway/local" },
381
+ }),
382
+ });
383
+ assert.equal(completion.status, 204);
384
+ assert.deepEqual(await resultPromise, { content: "{}", modelUsed: "gateway/local" });
385
+ } finally {
386
+ controller.abort();
387
+ bridge.close();
388
+ await server.close();
389
+ }
390
+ });
391
+
392
+ test("a completed job keeps the bridge available until its worker polls again", async () => {
393
+ const bridge = new SupportPassportModelBridge();
394
+ const server = await startBridgeServer(bridge);
395
+ const controller = new AbortController();
396
+ const invoke = () =>
397
+ bridge.route.invoke(messages, {
398
+ temperature: 0,
399
+ maxTokens: 500,
400
+ timeoutMs: 5_000,
401
+ signal: controller.signal,
402
+ operation: "support-passport-draft",
403
+ jsonSchema: { name: "drafts", schema: { type: "object" } },
404
+ });
405
+ const poll = () =>
406
+ fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
407
+ method: "POST",
408
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
409
+ body: JSON.stringify({ timeoutMs: 0 }),
410
+ });
411
+ const complete = (id: string, content: string) =>
412
+ fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_RESULT_PATH}`, {
413
+ method: "POST",
414
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
415
+ body: JSON.stringify({ id, result: { content, modelUsed: "gateway/local" } }),
416
+ });
417
+ try {
418
+ await announceWorker(server.origin);
419
+ const firstResult = invoke();
420
+ const firstResponse = await poll();
421
+ assert.equal(firstResponse.status, 200);
422
+ const first = (await firstResponse.json()) as { id: string };
423
+ (bridge as unknown as { lastConsumerPollAt: number }).lastConsumerPollAt = 0;
424
+ assert.equal((await complete(first.id, '{"first":true}')).status, 204);
425
+ assert.deepEqual(await firstResult, { content: '{"first":true}', modelUsed: "gateway/local" });
426
+
427
+ const secondResult = invoke();
428
+ const secondResponse = await poll();
429
+ assert.equal(secondResponse.status, 200);
430
+ const second = (await secondResponse.json()) as { id: string };
431
+ assert.equal((await complete(second.id, '{"second":true}')).status, 204);
432
+ assert.deepEqual(await secondResult, { content: '{"second":true}', modelUsed: "gateway/local" });
433
+ } finally {
434
+ controller.abort();
435
+ bridge.close();
436
+ await server.close();
437
+ }
438
+ });
439
+
440
+ test("a closed model bridge tells pollers to back off", async () => {
441
+ const bridge = new SupportPassportModelBridge();
442
+ const server = await startBridgeServer(bridge);
443
+ try {
444
+ bridge.close();
445
+ const response = await fetch(`${server.origin}${SUPPORT_PASSPORT_MODEL_JOB_PATH}`, {
446
+ method: "POST",
447
+ headers: { authorization: "Bearer owner-token", "content-type": "application/json" },
448
+ body: JSON.stringify({ timeoutMs: 20_000, claimLease: true }),
449
+ });
450
+ assert.equal(response.status, 410);
451
+ assert.deepEqual(await response.json(), { error: "bridge_closed", code: "bridge_closed" });
452
+ } finally {
453
+ bridge.close();
454
+ await server.close();
455
+ }
456
+ });