@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
@@ -36,6 +36,8 @@ import {
36
36
  type HttpRouteEntry,
37
37
  type McpToolEntry,
38
38
  } from "./access-surface-catalog.js";
39
+ import { SUPPORT_PASSPORT_OWNER_HTTP_ROUTES } from "./support-passport/access-http.js";
40
+ import { SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES } from "./support-passport/public-http.js";
39
41
 
40
42
  // #1668: all remaining MCP tools migrated through the strict-schema boundary
41
43
  // (recall, capsule, continuity, work, shared-context, peer, dreams, etc.).
@@ -62,7 +64,7 @@ function shortToolName(advertised: string): string {
62
64
 
63
65
  /** Spin up a server with emitLegacyTools=true and read the deduped short names. */
64
66
  async function liveMcpToolShortNames(): Promise<ReadonlySet<string>> {
65
- const stub = { briefingEnabled: true } as unknown as EngramAccessService;
67
+ const stub = { briefingEnabled: true, supportPassportEnabled: true } as unknown as EngramAccessService;
66
68
  const server = new EngramMcpServer(stub, { emitLegacyTools: true, codingDecisionVisible: true, architectureCardVisible: true, codegraphVisible: true, sessionDeltaVisible: true, chatVisible: true });
67
69
  const response = await server.handleRequest({ jsonrpc: "2.0", id: 1, method: "tools/list" });
68
70
  const result = (response as { result?: { tools?: Array<{ name: string }> } }).result;
@@ -142,22 +144,35 @@ function formatViolations(violations: readonly CoverageViolation[]): string {
142
144
  * catalog row is not a false migration — the surface code must also wire
143
145
  * the dispatch.
144
146
  */
145
- function extractMcpDispatchMap(): Map<string, string> {
146
- const source = readFileSync(
147
- new URL("./access-mcp.ts", import.meta.url),
148
- "utf-8",
149
- );
147
+ function extractMcpOperationMap(
148
+ sourceUrl: URL,
149
+ constantName: string,
150
+ ): Map<string, string> {
151
+ const source = readFileSync(sourceUrl, "utf-8");
150
152
  const blockMatch = source.match(
151
- /MCP_MIGRATED_OPERATIONS[^{]*\{([\s\S]*?)\}/,
153
+ new RegExp(`(?:export\\s+)?const\\s+${constantName}[^=]*=\\s*\\{([\\s\\S]*?)\\}\\s*(?:as const)?;`),
152
154
  );
153
- const body = blockMatch?.[1] ?? "";
155
+ assert.ok(blockMatch, `could not find ${constantName} in ${sourceUrl.pathname}`);
154
156
  const map = new Map<string, string>();
155
- for (const m of body.matchAll(/"engram\.(\w+)"\s*:\s*"(\w+)"/g)) {
157
+ for (const m of blockMatch[1]!.matchAll(/"engram\.(\w+)"\s*:\s*"(\w+)"/g)) {
156
158
  map.set(m[1]!, m[2]!);
157
159
  }
158
160
  return map;
159
161
  }
160
162
 
163
+ function extractMcpDispatchMap(): Map<string, string> {
164
+ return new Map([
165
+ ...extractMcpOperationMap(
166
+ new URL("./access-mcp.ts", import.meta.url),
167
+ "MCP_MIGRATED_OPERATIONS",
168
+ ),
169
+ ...extractMcpOperationMap(
170
+ new URL("./support-passport/mcp-tools.ts", import.meta.url),
171
+ "SUPPORT_PASSPORT_MCP_MIGRATED_OPERATIONS",
172
+ ),
173
+ ]);
174
+ }
175
+
161
176
  /**
162
177
  * Normalize a regex route body (e.g. `\/engram\/v1\/peers\/([^/]+)`) to the
163
178
  * catalog pathname form (`/engram/v1/peers/:id`).
@@ -302,6 +317,21 @@ function extractHttpRouteDispatchMap(): Map<string, Set<string>> {
302
317
  }
303
318
  }
304
319
  }
320
+ for (const [sourcePath, routes] of [
321
+ ["./support-passport/access-http.ts", SUPPORT_PASSPORT_OWNER_HTTP_ROUTES],
322
+ ["./support-passport/public-http.ts", SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES],
323
+ ] as const) {
324
+ const routeSource = readFileSync(new URL(sourcePath, import.meta.url), "utf-8");
325
+ for (const route of routes) {
326
+ const dynamicCardMutation =
327
+ route.operation.startsWith("support_passport_card_") &&
328
+ routeSource.includes("operation = `support_passport_card_${cardMatch[2]}`");
329
+ const publicDispatch = new RegExp(`runPublicOperation\\(\\s*service,\\s*"${route.operation}"`).test(routeSource);
330
+ if (routeSource.includes(`operation = "${route.operation}"`) || dynamicCardMutation || publicDispatch) {
331
+ routeOps.set(`${route.method} ${route.pathname}`, new Set([route.operation]));
332
+ }
333
+ }
334
+ }
305
335
  return routeOps;
306
336
  }
307
337
 
@@ -824,4 +854,4 @@ test("memory_get operation resolves through the boundary without hooks (read par
824
854
  { service },
825
855
  )) as { result: { found: boolean } };
826
856
  assert.equal(output.result.found, false);
827
- });
857
+ });
@@ -22,6 +22,8 @@
22
22
  */
23
23
 
24
24
  import type { OperationName } from "./access-boundary.js";
25
+ import { SUPPORT_PASSPORT_OWNER_HTTP_ROUTES } from "./support-passport/access-http.js";
26
+ import { SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES } from "./support-passport/public-http.js";
25
27
 
26
28
  /**
27
29
  * One row per MCP tool, keyed by the canonical SHORT name (no `engram.`/
@@ -162,6 +164,17 @@ export const MCP_TOOLS: readonly McpToolEntry[] = [
162
164
  { tool: "console_state", operation: "console_state" },
163
165
  { tool: "dreams_status", operation: "dreams_status" },
164
166
  { tool: "dreams_run", operation: "dreams_run" },
167
+ { tool: "support_passport_memory_preview", operation: "support_passport_memory_preview" },
168
+ { tool: "support_passport_cards_list", operation: "support_passport_cards_list" },
169
+ { tool: "support_passport_draft_create", operation: "support_passport_draft_create" },
170
+ { tool: "support_passport_drafts_generate", operation: "support_passport_drafts_generate" },
171
+ { tool: "support_passport_card_replace", operation: "support_passport_card_replace" },
172
+ { tool: "support_passport_card_approve", operation: "support_passport_card_approve" },
173
+ { tool: "support_passport_card_reject", operation: "support_passport_card_reject" },
174
+ { tool: "support_passport_card_withdraw", operation: "support_passport_card_withdraw" },
175
+ { tool: "support_passport_grant_create", operation: "support_passport_grant_create" },
176
+ { tool: "support_passport_grants_list", operation: "support_passport_grants_list" },
177
+ { tool: "support_passport_grant_revoke", operation: "support_passport_grant_revoke" },
165
178
  ];
166
179
 
167
180
  // Each route below corresponds 1:1 to a service-invoking route branch in
@@ -260,6 +273,8 @@ export const HTTP_ROUTES: readonly HttpRouteEntry[] = [
260
273
  { method: "GET", pathname: "/engram/v1/graph/events", operation: "graph_events" },
261
274
  { method: "POST", pathname: "/engram/v1/chat/message", operation: "chat_message" },
262
275
  { method: "GET", pathname: "/engram/v1/chat/events/:id", operation: "chat_events" },
276
+ ...SUPPORT_PASSPORT_OWNER_HTTP_ROUTES,
277
+ ...SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES,
263
278
  ];
264
279
 
265
280
  /**
@@ -1,9 +1,9 @@
1
1
  import { resolveNamespaceCapabilities } from "./capabilities.js";
2
2
  import { canReadNamespace, defaultNamespaceForPrincipal, resolvePrincipal } from "./namespaces/principal.js";
3
- import type { MemoryFile, PluginConfig, QmdSearchResult } from "./types.js";
4
- import { collapseWhitespace, truncateCodePointSafe } from "./whitespace.js";
5
3
  import { isHandleToken } from "./recall-handles.js";
6
4
  import { isSupportPassportPrivateMemory } from "./support-passport/card-projection.js";
5
+ import type { MemoryFile, PluginConfig, QmdSearchResult } from "./types.js";
6
+ import { collapseWhitespace, truncateCodePointSafe } from "./whitespace.js";
7
7
 
8
8
  export interface ActiveMemoryMetadata {
9
9
  type?: "fact" | "preference";
@@ -39,14 +39,16 @@ export interface ActiveMemoryRecallParams {
39
39
  snippetMaxChars?: number;
40
40
  }
41
41
 
42
+ interface ActiveMemoryStorage {
43
+ readMemoryByPath?: (path: string) => Promise<MemoryFile | null>;
44
+ getMemoryById?: (id: string) => Promise<MemoryFile | null>;
45
+ }
46
+
42
47
  interface ActiveMemoryScopedOrchestrator {
43
48
  config?: PluginConfig;
44
49
  resolvePrincipal?: (sessionKey?: string) => string | undefined;
45
50
  resolveSelfNamespace?: (sessionKey?: string) => string;
46
- getStorageForNamespace?: (namespace: string) => Promise<{
47
- readMemoryByPath?: (path: string) => Promise<MemoryFile | null>;
48
- getMemoryById?: (id: string) => Promise<MemoryFile | null>;
49
- }>;
51
+ getStorageForNamespace?: (namespace: string) => Promise<ActiveMemoryStorage>;
50
52
  filterPrivateSearchResults?: (
51
53
  results: QmdSearchResult[],
52
54
  namespaces?: readonly string[],
@@ -71,13 +73,13 @@ function isArtifactPath(value: string | undefined): boolean {
71
73
  async function filterVisibleActiveMemoryCandidates(
72
74
  orchestrator: ActiveMemoryScopedOrchestrator,
73
75
  namespace: string,
74
- storage: Awaited<ReturnType<NonNullable<ActiveMemoryScopedOrchestrator["getStorageForNamespace"]>>> | undefined,
76
+ storage: ActiveMemoryStorage | undefined,
75
77
  candidates: ActiveMemorySearchCandidate[],
76
78
  visibilityCache?: Map<string, boolean>,
77
79
  ): Promise<ActiveMemorySearchCandidate[]> {
78
80
  const visible = new Set<ActiveMemorySearchCandidate>();
79
81
  const pathCandidates = candidates.filter(
80
- (candidate) => typeof candidate.path === "string" && !isArtifactPath(candidate.path),
82
+ (candidate) => typeof candidate.path === "string" && !isArtifactPath(candidate.path)
81
83
  );
82
84
  if (pathCandidates.length > 0 && typeof orchestrator.filterPrivateSearchResults === "function") {
83
85
  const qmdCandidates = pathCandidates.map((candidate): QmdSearchResult => ({
@@ -100,14 +102,14 @@ async function filterVisibleActiveMemoryCandidates(
100
102
  }
101
103
 
102
104
  const idCandidates = candidates.filter(
103
- (candidate) => candidate.path === undefined && typeof candidate.id === "string",
105
+ (candidate) => candidate.path === undefined && typeof candidate.id === "string"
104
106
  );
105
107
  if (storage) {
106
108
  const idVisibility = await Promise.all(
107
109
  idCandidates.map(async (candidate) => {
108
110
  const memory = await storage.getMemoryById?.(candidate.id!);
109
111
  return memory !== null && memory !== undefined && !isSupportPassportPrivateMemory(memory);
110
- }),
112
+ })
111
113
  );
112
114
  idCandidates.forEach((candidate, index) => {
113
115
  if (idVisibility[index]) visible.add(candidate);
@@ -139,7 +141,7 @@ function pickMetadata(value: Record<string, unknown> | undefined): ActiveMemoryM
139
141
  function resolveActiveMemoryNamespace(
140
142
  orchestrator: ActiveMemoryScopedOrchestrator,
141
143
  sessionKey: string | undefined,
142
- requestedNamespace: string | undefined,
144
+ requestedNamespace: string | undefined
143
145
  ): string {
144
146
  const explicitNamespace =
145
147
  typeof requestedNamespace === "string" && requestedNamespace.trim().length > 0
@@ -195,7 +197,7 @@ export async function recallForActiveMemory(
195
197
  mode?: string;
196
198
  }) => Promise<ActiveMemorySearchCandidate[]>;
197
199
  },
198
- params: ActiveMemoryRecallParams,
200
+ params: ActiveMemoryRecallParams
199
201
  ): Promise<ActiveMemorySearchOutput> {
200
202
  const limit = clampLimit(params.limit);
201
203
  const snippetMaxChars =
@@ -205,7 +207,7 @@ export async function recallForActiveMemory(
205
207
  const namespace = resolveActiveMemoryNamespace(
206
208
  orchestrator,
207
209
  params.sessionKey,
208
- typeof params.filters?.namespace === "string" ? params.filters.namespace : undefined,
210
+ typeof params.filters?.namespace === "string" ? params.filters.namespace : undefined
209
211
  );
210
212
 
211
213
  const storage = await orchestrator.getStorageForNamespace?.(namespace);
@@ -277,13 +279,9 @@ export async function getMemoryForActiveMemory(
277
279
  options: {
278
280
  namespace?: string;
279
281
  sessionKey?: string;
280
- } = {},
282
+ } = {}
281
283
  ): Promise<ActiveMemoryGetOutput> {
282
- const namespace = resolveActiveMemoryNamespace(
283
- orchestrator,
284
- options.sessionKey,
285
- options.namespace,
286
- );
284
+ const namespace = resolveActiveMemoryNamespace(orchestrator, options.sessionKey, options.namespace);
287
285
 
288
286
  const storage =
289
287
  typeof orchestrator.getStorageForNamespace === "function"
package/src/config.ts CHANGED
@@ -66,6 +66,7 @@ import { parseProvenanceConfig } from "./provenance.js";
66
66
  import { parseBoundedJsonlStateConfig } from "./bounded-jsonl-state.js";
67
67
  import { parseCodingKnowledgeConfig } from "./coding/coding-knowledge-config.js";
68
68
  import { parseChatConfig } from "./chat/chat-config.js";
69
+ import { parseSupportPassportConfig } from "./support-passport/config.js";
69
70
  import { parseCorrectionIntentConfig, parseFaithfulnessGateConfig } from "./faithfulness-config.js";
70
71
  import { parseOfflineSyncExcludes } from "./offline-sync.js";
71
72
  import { parseExternalWikiRoots } from "./external-wiki-config.js";
@@ -469,23 +470,27 @@ export function resolveEnvVars(value: string): string {
469
470
  }
470
471
 
471
472
  function normalizeOpenaiBaseUrl(value: string | undefined, source: "config" | "env"): string | undefined {
472
- if (!value) return undefined;
473
+ if (value === undefined) return undefined;
473
474
  const trimmed = value.trim();
474
- if (trimmed.length === 0) return undefined;
475
+ if (trimmed.length === 0) {
476
+ throw new Error(`${source === "env" ? "OPENAI_BASE_URL" : "openaiBaseUrl"} must be an absolute HTTP or HTTPS URL`);
477
+ }
475
478
 
476
479
  let parsed: URL;
477
480
  try {
478
481
  parsed = new URL(trimmed);
479
482
  } catch {
480
- log.warn(`ignoring invalid openaiBaseUrl from ${source}: not a valid URL`);
481
- return undefined;
483
+ throw new Error(`${source === "env" ? "OPENAI_BASE_URL" : "openaiBaseUrl"} must be an absolute HTTP or HTTPS URL`);
482
484
  }
483
485
 
484
486
  if (parsed.protocol !== "https:" && parsed.protocol !== "http:") {
485
- log.warn(
486
- `ignoring openaiBaseUrl from ${source}: unsupported URL scheme (${parsed.protocol.replace(":", "")})`,
487
+ throw new Error(`${source === "env" ? "OPENAI_BASE_URL" : "openaiBaseUrl"} must use HTTP or HTTPS`);
488
+ }
489
+
490
+ if (parsed.username || parsed.password || parsed.search || parsed.hash) {
491
+ throw new Error(
492
+ `${source === "env" ? "OPENAI_BASE_URL" : "openaiBaseUrl"} must not include credentials, query parameters, or fragments`,
487
493
  );
488
- return undefined;
489
494
  }
490
495
 
491
496
  if (parsed.protocol === "http:") {
@@ -1461,9 +1466,12 @@ export function parseConfig(
1461
1466
  };
1462
1467
 
1463
1468
  let baseUrl: string | undefined;
1464
- if (typeof cfg.openaiBaseUrl === "string" && cfg.openaiBaseUrl.length > 0) {
1469
+ if (cfg.openaiBaseUrl !== undefined && typeof cfg.openaiBaseUrl !== "string") {
1470
+ throw new Error("openaiBaseUrl must be a string");
1471
+ }
1472
+ if (cfg.openaiBaseUrl !== undefined) {
1465
1473
  baseUrl = normalizeOpenaiBaseUrl(resolveEnvVars(cfg.openaiBaseUrl), "config");
1466
- } else {
1474
+ } else if (apiKey !== undefined) {
1467
1475
  baseUrl = normalizeOpenaiBaseUrl(readEnvVar("OPENAI_BASE_URL"), "env");
1468
1476
  }
1469
1477
 
@@ -2325,6 +2333,7 @@ export function parseConfig(
2325
2333
  codexCompat,
2326
2334
  codingKnowledge: parseCodingKnowledgeConfig(cfg.codingKnowledge),
2327
2335
  chat: parseChatConfig(cfg.chat),
2336
+ supportPassport: parseSupportPassportConfig(cfg.supportPassport),
2328
2337
  hourlySummariesEnabled: cfg.hourlySummariesEnabled !== false, // default: true
2329
2338
  daySummaryEnabled: cfg.daySummaryEnabled !== false, // default: true
2330
2339
  hourlySummaryCronAutoRegister: cfg.hourlySummaryCronAutoRegister === true,
@@ -4,6 +4,7 @@ import test from "node:test";
4
4
 
5
5
  import { FallbackLlmClient, gatewayTaskChainOptions } from "./fallback-llm.js";
6
6
  import { __codexCliFallbackTestHooks } from "./cli-fallback.js";
7
+ import { initLogger, resetLogger } from "./logger.js";
7
8
  import { clearModelsJsonCache, __setModelsJsonForTest } from "./models-json.js";
8
9
  import {
9
10
  __setGatewayRuntimeAuthForModelForTest,
@@ -1654,6 +1655,59 @@ test("fallback llm does NOT append default for a primary-less override that fall
1654
1655
  }
1655
1656
  });
1656
1657
 
1658
+ test("fallback llm redacts provider error bodies for sensitive calls", { concurrency: false }, async () => {
1659
+ clearModelsJsonCache();
1660
+ clearSecretCache();
1661
+ const privateMarker = "private-support-note-must-not-log";
1662
+ const lines: string[] = [];
1663
+ initLogger(
1664
+ {
1665
+ info: (message) => lines.push(message),
1666
+ warn: (message) => lines.push(message),
1667
+ error: (message) => lines.push(message),
1668
+ debug: (message) => lines.push(message),
1669
+ },
1670
+ true,
1671
+ { timestamps: false },
1672
+ );
1673
+ const llm = new FallbackLlmClient({
1674
+ agents: { defaults: { model: { primary: "private-provider/test-model" } } },
1675
+ models: {
1676
+ providers: {
1677
+ "private-provider": {
1678
+ baseUrl: "https://private-provider.example/v1",
1679
+ api: "openai-completions",
1680
+ apiKey: "test-key",
1681
+ models: [],
1682
+ },
1683
+ },
1684
+ },
1685
+ });
1686
+ const originalFetch = globalThis.fetch;
1687
+ globalThis.fetch = (async () =>
1688
+ new Response(JSON.stringify({ error: { message: privateMarker } }), {
1689
+ status: 400,
1690
+ headers: { "content-type": "application/json" },
1691
+ })) as typeof fetch;
1692
+
1693
+ try {
1694
+ assert.equal(
1695
+ await llm.chatCompletion(
1696
+ [{ role: "user", content: privateMarker }],
1697
+ { redactProviderErrors: true },
1698
+ ),
1699
+ null,
1700
+ );
1701
+ assert.equal(lines.join("\n").includes(privateMarker), false);
1702
+ assert.match(lines.join("\n"), /provider error details redacted/);
1703
+ } finally {
1704
+ globalThis.fetch = originalFetch;
1705
+ resetLogger();
1706
+ clearModelsJsonCache();
1707
+ clearSecretCache();
1708
+ }
1709
+ });
1710
+
1657
1711
  function disableGatewaySecretResolverForTest(): void {
1658
1712
  __setGatewayResolverForTest(async () => null);
1659
1713
  }
@@ -23,12 +23,22 @@ export interface FallbackLlmOptions {
23
23
  maxTokens?: number;
24
24
  timeoutMs?: number;
25
25
  signal?: AbortSignal;
26
+ /** Set the Responses API storage policy. Other transports ignore this value. */
27
+ store?: boolean;
28
+ /** Request strict JSON output when a route uses the Responses API. */
29
+ responsesJsonSchema?: { name: string; schema: Record<string, unknown> };
30
+ /** Hide provider error details that could echo private request content. */
31
+ redactProviderErrors?: boolean;
26
32
  /** Explicit "provider/model" override to try before the configured chain. */
27
33
  model?: string;
28
34
  /** Explicit model chain override to use instead of the configured agent/default chain. */
29
35
  modelChain?: AgentPersonaModelConfig;
36
+ /** Append the gateway default chain after an explicit model chain. */
37
+ includeDefaultModelFallback?: boolean;
30
38
  /** Override which agent persona's model chain to use (by ID from agents.list[]). */
31
39
  agentId?: string;
40
+ /** Reject a transport-successful response and continue through the configured model chain. */
41
+ acceptResponse?: (response: FallbackLlmResponse) => boolean;
32
42
  }
33
43
 
34
44
  export interface FallbackLlmAvailabilityOptions {
@@ -177,7 +187,12 @@ export class FallbackLlmClient {
177
187
  messages: Array<{ role: "system" | "user" | "assistant"; content: string }>,
178
188
  options: FallbackLlmOptions = {},
179
189
  ): Promise<FallbackLlmResponse | null> {
180
- const models = this.getModelChain(options.agentId, options.model, options.modelChain);
190
+ const models = this.getModelChain(
191
+ options.agentId,
192
+ options.model,
193
+ options.modelChain,
194
+ options.includeDefaultModelFallback,
195
+ );
181
196
  if (models.length === 0) {
182
197
  log.warn("fallback LLM: no models configured in gateway");
183
198
  return null;
@@ -186,6 +201,7 @@ export class FallbackLlmClient {
186
201
  const runChain = async (
187
202
  runOptions: FallbackLlmOptions,
188
203
  ): Promise<FallbackLlmResponse | null> => {
204
+ let lastRejectedResponse: FallbackLlmResponse | null = null;
189
205
  // Try each model in the chain
190
206
  for (let i = 0; i < models.length; i++) {
191
207
  if (runOptions.signal?.aborted) {
@@ -197,27 +213,37 @@ export class FallbackLlmClient {
197
213
  try {
198
214
  const result = await this.tryModel(model, messages, runOptions);
199
215
  if (result) {
200
- if (isFallback) {
201
- log.debug(`fallback LLM: succeeded using ${model.modelString} (fallback ${i})`);
202
- }
203
- return {
216
+ const response = {
204
217
  content: result.content,
205
218
  modelUsed: model.modelString,
206
219
  usage: result.usage,
207
220
  };
221
+ if (runOptions.acceptResponse && !runOptions.acceptResponse(response)) {
222
+ lastRejectedResponse = response;
223
+ log.debug(`fallback LLM: ${model.modelString} returned rejected output, trying next...`);
224
+ continue;
225
+ }
226
+ if (isFallback) {
227
+ log.debug(`fallback LLM: succeeded using ${model.modelString} (fallback ${i})`);
228
+ }
229
+ return response;
208
230
  }
209
231
  } catch (err) {
210
232
  if (runOptions.signal?.aborted) {
211
233
  throw abortReason(runOptions.signal);
212
234
  }
213
- const errorMsg = err instanceof Error ? err.message : String(err);
235
+ const errorMsg = runOptions.redactProviderErrors
236
+ ? "provider error details redacted"
237
+ : err instanceof Error
238
+ ? err.message
239
+ : String(err);
214
240
  log.debug(`fallback LLM: ${model.modelString} failed (${errorMsg}), trying next...`);
215
241
  // Continue to next model in chain
216
242
  }
217
243
  }
218
244
 
219
245
  log.warn(`fallback LLM: all ${models.length} models in chain failed`);
220
- return null;
246
+ return lastRejectedResponse;
221
247
  };
222
248
 
223
249
  if (typeof options.timeoutMs === "number") {
@@ -301,7 +327,12 @@ export class FallbackLlmClient {
301
327
  // Disambiguate via the resolved model chain so the retry layer can pick
302
328
  // the right failure class.
303
329
  const hasModels =
304
- this.getModelChain(options.agentId, options.model, options.modelChain).length > 0;
330
+ this.getModelChain(
331
+ options.agentId,
332
+ options.model,
333
+ options.modelChain,
334
+ options.includeDefaultModelFallback,
335
+ ).length > 0;
305
336
  return { result: null, failureReason: hasModels ? "http_error" : "no_models" };
306
337
  }
307
338
 
@@ -335,6 +366,7 @@ export class FallbackLlmClient {
335
366
  agentId?: string,
336
367
  modelOverride?: string,
337
368
  modelChainOverride?: AgentPersonaModelConfig,
369
+ includeDefaultModelFallback = true,
338
370
  ): ModelRef[] {
339
371
  const chain: ModelRef[] = [];
340
372
  const providers = this.gatewayConfig?.models?.providers ?? {};
@@ -402,7 +434,7 @@ export class FallbackLlmClient {
402
434
  // the SAME activation condition chain resolution uses above — so a
403
435
  // primary-less override (e.g. {}) that falls through to a persona/default
404
436
  // chain does NOT get the default appended (gotcha #39). Issue #1365 / PR #1370.
405
- if (modelChainOverride?.primary && modelStrings.length > 0) {
437
+ if (includeDefaultModelFallback && modelChainOverride?.primary && modelStrings.length > 0) {
406
438
  // Append the FULL gateway default chain (primary + fallbacks), not just
407
439
  // the primary — if the default primary is also unreachable, a listed
408
440
  // default fallback may still succeed (cursor review #1425).
@@ -858,6 +890,19 @@ export class FallbackLlmClient {
858
890
  ...buildChatCompletionTemperature(modelId, options.temperature ?? 0.3, {
859
891
  assumeOpenAI: shouldAssumeOpenAiChatCompletions(config.baseUrl),
860
892
  }),
893
+ ...(options.store === undefined ? {} : { store: options.store }),
894
+ ...(options.responsesJsonSchema
895
+ ? {
896
+ text: {
897
+ format: {
898
+ type: "json_schema",
899
+ name: options.responsesJsonSchema.name,
900
+ strict: true,
901
+ schema: options.responsesJsonSchema.schema,
902
+ },
903
+ },
904
+ }
905
+ : {}),
861
906
  };
862
907
  if (instructions.length > 0) {
863
908
  body.instructions = instructions;
@@ -0,0 +1,6 @@
1
+ export function serializeInlineScriptValue(value: string): string {
2
+ return JSON.stringify(value)
3
+ .replaceAll("<", "\\u003c")
4
+ .replaceAll("\u2028", "\\u2028")
5
+ .replaceAll("\u2029", "\\u2029");
6
+ }
@@ -13,6 +13,7 @@ import {
13
13
 
14
14
  import { LocalLlmClient } from "./local-llm.js";
15
15
  import { ChatTransport } from "./local-llm-transport.js";
16
+ import { initLogger, resetLogger } from "./logger.js";
16
17
  import type { PluginConfig } from "./types.js";
17
18
 
18
19
  /**
@@ -511,3 +512,44 @@ test("availability probes stop after the caller aborts", async () => {
511
512
  await new Promise<void>((resolve) => server.close(() => resolve()));
512
513
  }
513
514
  });
515
+
516
+ test("sensitive local requests do not log provider error bodies", { concurrency: false }, async () => {
517
+ const original = globalThis.fetch;
518
+ const privateMarker = "private-local-support-note-must-not-log";
519
+ const privateStatusText = "private-provider-status-must-not-log";
520
+ const lines: string[] = [];
521
+ initLogger(
522
+ {
523
+ info: (message) => lines.push(message),
524
+ warn: (message) => lines.push(message),
525
+ error: (message) => lines.push(message),
526
+ debug: (message) => lines.push(message),
527
+ },
528
+ true,
529
+ { timestamps: false },
530
+ );
531
+ globalThis.fetch = (async () =>
532
+ new Response(JSON.stringify({ error: { message: privateMarker } }), {
533
+ status: 400,
534
+ statusText: privateStatusText,
535
+ headers: { "content-type": "application/json" },
536
+ })) as typeof fetch;
537
+ const client = new LocalLlmClient(createConfig());
538
+
539
+ try {
540
+ primeClient(client);
541
+ assert.equal(
542
+ await client.chatCompletion(
543
+ [{ role: "user", content: privateMarker }],
544
+ { redactProviderErrors: true },
545
+ ),
546
+ null,
547
+ );
548
+ assert.equal(lines.join("\n").includes(privateMarker), false);
549
+ assert.equal(lines.join("\n").includes(privateStatusText), false);
550
+ } finally {
551
+ globalThis.fetch = original;
552
+ resetLogger();
553
+ await dispatcherOf(client).close();
554
+ }
555
+ });
package/src/local-llm.ts CHANGED
@@ -235,8 +235,8 @@ interface LocalLlmChatCompletionOptions {
235
235
  disableThinking?: boolean;
236
236
  priority?: LocalLlmRequestPriority;
237
237
  signal?: AbortSignal;
238
+ redactProviderErrors?: boolean;
238
239
  }
239
-
240
240
  interface LocalLlmQueuedRequest {
241
241
  messages: Array<{ role: string; content: string }>;
242
242
  options: LocalLlmChatCompletionOptions;
@@ -917,7 +917,7 @@ export class LocalLlmClient {
917
917
  enqueuedAtMs: next.enqueuedAtMs,
918
918
  });
919
919
  } catch (err) {
920
- log.warn(`local LLM queue drain failed open: ${err instanceof Error ? err.message : String(err)}`);
920
+ log.warn(`local LLM queue drain failed open: ${next.options.redactProviderErrors ? "provider error details redacted" : err instanceof Error ? err.message : String(err)}`);
921
921
  }
922
922
  next.resolve(result);
923
923
  } finally {
@@ -1071,7 +1071,7 @@ export class LocalLlmClient {
1071
1071
  break;
1072
1072
  }
1073
1073
  if (response && !response.ok) {
1074
- log.debug(`local LLM failed to read ${response.status} response body: ${error.message}`);
1074
+ log.debug(`local LLM failed to read ${response.status} response body: ${options.redactProviderErrors ? "details redacted" : error.message}`);
1075
1075
  } else {
1076
1076
  response = null;
1077
1077
  if (!isAbortError(err)) throw err;
@@ -1132,10 +1132,10 @@ export class LocalLlmClient {
1132
1132
  const parsed = JSON.parse(responseBody) as { error?: { message?: string } };
1133
1133
  reason = parsed?.error?.message ? ` — ${parsed.error.message}` : "";
1134
1134
  } catch {
1135
- log.debug(`local LLM error body: ${responseBody.slice(0, 500)}`);
1135
+ if (!options.redactProviderErrors) log.debug(`local LLM error body: ${responseBody.slice(0, 500)}`);
1136
1136
  }
1137
1137
  log.warn(
1138
- `local LLM request failed: ${response.status} ${response.statusText}${reason} ` +
1138
+ `local LLM request failed: ${response.status}${options.redactProviderErrors ? "" : ` ${response.statusText}${reason}`} ` +
1139
1139
  `(op=${operation}, model=${this.config.localLlmModel}, url=${chatUrl}, promptChars=${promptChars}, maxTokens=${requestBody.max_tokens as number})`,
1140
1140
  );
1141
1141
  const nonRecoverableReason =
@@ -1187,7 +1187,7 @@ export class LocalLlmClient {
1187
1187
  const msg = data.choices?.[0]?.message;
1188
1188
  const content = msg?.content || msg?.reasoning_content || "";
1189
1189
  if (!content) {
1190
- log.warn(`local LLM returned empty content. choices=${JSON.stringify(data.choices)?.slice(0, 200)}`);
1190
+ log.warn(`local LLM returned empty content.${options.redactProviderErrors ? "" : ` choices=${JSON.stringify(data.choices)?.slice(0, 200)}`}`);
1191
1191
  return null;
1192
1192
  }
1193
1193
 
@@ -1216,11 +1216,11 @@ export class LocalLlmClient {
1216
1216
  const durationMs = Date.now() - startedAtMs;
1217
1217
  if (isAbortError(err)) {
1218
1218
  log.warn(
1219
- `local LLM request aborted: op=${operation} timeoutMs=${options.timeoutMs ?? this.config.localLlmTimeoutMs} model=${this.config.localLlmModel} durationMs=${durationMs} error=${errMsg}`,
1219
+ `local LLM request aborted: op=${operation} timeoutMs=${options.timeoutMs ?? this.config.localLlmTimeoutMs} model=${this.config.localLlmModel} durationMs=${durationMs} error=${options.redactProviderErrors ? "provider error details redacted" : errMsg}`,
1220
1220
  );
1221
1221
  return null;
1222
1222
  }
1223
- log.warn(`local LLM request error: op=${operation} error=${errMsg}`);
1223
+ log.warn(`local LLM request error: op=${operation} error=${options.redactProviderErrors ? "provider error details redacted" : errMsg}`);
1224
1224
  this.isAvailable = false; // Mark as unavailable on non-abort errors
1225
1225
  const nonRecoverableReason = extractNonRecoverableBackendReason(errMsg);
1226
1226
  if (nonRecoverableReason) {
@@ -61,4 +61,7 @@ export const MCP_READ_ONLY_TOOL_SUFFIXES: Readonly<Record<string, true>> = {
61
61
  codegraph_get_snippet: true,
62
62
  codegraph_get_architecture: true,
63
63
  codegraph_search_code: true,
64
+ support_passport_memory_preview: true,
65
+ support_passport_cards_list: true,
66
+ support_passport_grants_list: true,
64
67
  };