@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,502 @@
1
+ import {
2
+ SupportPassportError,
3
+ getOperation
4
+ } from "./chunk-D3LBIUWV.js";
5
+ import {
6
+ abortError,
7
+ isAbortError
8
+ } from "./chunk-BTTPKDIL.js";
9
+
10
+ // src/support-passport/public-http.ts
11
+ import { createHash } from "crypto";
12
+ import { isIP } from "net";
13
+ var PUBLIC_RATE_LIMIT_MAX_KEYS = 2e4;
14
+ var PUBLIC_AUTH_MAX_IN_FLIGHT_PER_NETWORK = 8;
15
+ var PUBLIC_AUTH_MAX_IN_FLIGHT_TOTAL = 256;
16
+ var PUBLIC_MODEL_MAX_IN_FLIGHT_PER_NETWORK = 8;
17
+ var PUBLIC_MODEL_MAX_IN_FLIGHT_TOTAL = 256;
18
+ var SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES = [
19
+ {
20
+ method: "GET",
21
+ pathname: "/engram/v1/support-passport/public/grants/:id",
22
+ operation: "support_passport_grant_read"
23
+ },
24
+ {
25
+ method: "POST",
26
+ pathname: "/engram/v1/support-passport/public/grants/:id/ask",
27
+ operation: "support_passport_grant_ask"
28
+ }
29
+ ];
30
+ var UnreadSupportPassportRequestError = class extends Error {
31
+ constructor(response) {
32
+ super(response.message);
33
+ this.response = response;
34
+ this.name = "UnreadSupportPassportRequestError";
35
+ }
36
+ response;
37
+ };
38
+ var FixedWindowLimiter = class {
39
+ constructor(limit, windowMs, now) {
40
+ this.limit = limit;
41
+ this.windowMs = windowMs;
42
+ this.now = now;
43
+ }
44
+ limit;
45
+ windowMs;
46
+ now;
47
+ entries = /* @__PURE__ */ new Map();
48
+ consume(key) {
49
+ const reservation = this.reserve(key);
50
+ if (!reservation) return false;
51
+ reservation.commit();
52
+ return true;
53
+ }
54
+ reserve(key) {
55
+ const now = this.now();
56
+ let entry = this.entries.get(key);
57
+ if (!entry || entry.resetAt <= now) {
58
+ if (!entry && this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) {
59
+ this.prune(now);
60
+ if (this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) return void 0;
61
+ }
62
+ entry = { count: 0, resetAt: now + this.windowMs };
63
+ this.entries.set(key, entry);
64
+ }
65
+ if (entry.count >= this.limit) return void 0;
66
+ entry.count += 1;
67
+ let active = true;
68
+ return {
69
+ commit: () => {
70
+ active = false;
71
+ },
72
+ release: () => {
73
+ if (!active) return;
74
+ active = false;
75
+ if (this.entries.get(key) !== entry) return;
76
+ entry.count -= 1;
77
+ if (entry.count === 0) this.entries.delete(key);
78
+ }
79
+ };
80
+ }
81
+ allows(key) {
82
+ const now = this.now();
83
+ const current = this.entries.get(key);
84
+ if (current && current.resetAt > now) return current.count < this.limit;
85
+ if (!current && this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) {
86
+ this.prune(now);
87
+ if (this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) return false;
88
+ }
89
+ return true;
90
+ }
91
+ prune(now) {
92
+ for (const [key, entry] of this.entries) {
93
+ if (entry.resetAt <= now) this.entries.delete(key);
94
+ }
95
+ }
96
+ };
97
+ var InFlightLimiter = class {
98
+ constructor(perKeyLimit, totalLimit) {
99
+ this.perKeyLimit = perKeyLimit;
100
+ this.totalLimit = totalLimit;
101
+ }
102
+ perKeyLimit;
103
+ totalLimit;
104
+ counts = /* @__PURE__ */ new Map();
105
+ total = 0;
106
+ reserve(key) {
107
+ const current = this.counts.get(key) ?? 0;
108
+ if (current >= this.perKeyLimit || this.total >= this.totalLimit) return void 0;
109
+ this.counts.set(key, current + 1);
110
+ this.total += 1;
111
+ let active = true;
112
+ return () => {
113
+ if (!active) return;
114
+ active = false;
115
+ const count = this.counts.get(key) ?? 0;
116
+ if (count <= 1) this.counts.delete(key);
117
+ else this.counts.set(key, count - 1);
118
+ this.total -= 1;
119
+ };
120
+ }
121
+ };
122
+ function createRateLimits(now) {
123
+ return {
124
+ authentications: new InFlightLimiter(PUBLIC_AUTH_MAX_IN_FLIGHT_PER_NETWORK, PUBLIC_AUTH_MAX_IN_FLIGHT_TOTAL),
125
+ modelCalls: new InFlightLimiter(PUBLIC_MODEL_MAX_IN_FLIGHT_PER_NETWORK, PUBLIC_MODEL_MAX_IN_FLIGHT_TOTAL),
126
+ grantReads: new FixedWindowLimiter(60, 6e4, now),
127
+ networkReads: new FixedWindowLimiter(60, 6e4, now),
128
+ networkReadFailures: new FixedWindowLimiter(60, 6e4, now),
129
+ grantQuestions: new FixedWindowLimiter(20, 10 * 6e4, now),
130
+ networkQuestions: new FixedWindowLimiter(20, 10 * 6e4, now),
131
+ networkQuestionFailures: new FixedWindowLimiter(20, 10 * 6e4, now)
132
+ };
133
+ }
134
+ function rateLimited() {
135
+ return new SupportPassportError("rate_limited", "Too many helper requests.", 429);
136
+ }
137
+ async function runPublicOperation(service, name, input, signal) {
138
+ const operation = getOperation(name);
139
+ if (!operation) throw new Error(`access-boundary: operation not registered: ${name}`);
140
+ const output = await operation.run(input, {
141
+ service,
142
+ ...signal ? { abortSignal: signal } : {}
143
+ });
144
+ return output.result;
145
+ }
146
+ function reserveAuthenticatedLimits(networkLimiter, grantLimiter, networkKey, grantId) {
147
+ const network = networkLimiter.reserve(networkKey);
148
+ if (!network) throw rateLimited();
149
+ const grant = grantLimiter.reserve(grantId);
150
+ if (!grant) {
151
+ network.release();
152
+ throw rateLimited();
153
+ }
154
+ let active = true;
155
+ return {
156
+ commit: () => {
157
+ if (!active) return;
158
+ active = false;
159
+ network.commit();
160
+ grant.commit();
161
+ },
162
+ release: () => {
163
+ if (!active) return;
164
+ active = false;
165
+ grant.release();
166
+ network.release();
167
+ }
168
+ };
169
+ }
170
+ async function readGrantUnderAuthenticationReservation(service, grantId, secret, networkKey, networkLimiter, grantLimiter, failureLimiter) {
171
+ if (!failureLimiter.allows(networkKey)) throw rateLimited();
172
+ const limits = reserveAuthenticatedLimits(networkLimiter, grantLimiter, networkKey, grantId);
173
+ let guide;
174
+ try {
175
+ guide = await runPublicOperation(service, "support_passport_grant_read", { grantId, secret });
176
+ } catch (error) {
177
+ if (error instanceof SupportPassportError) {
178
+ if (error.code === "grant_not_found") {
179
+ limits.release();
180
+ if (!failureLimiter.consume(networkKey)) throw rateLimited();
181
+ } else {
182
+ limits.commit();
183
+ }
184
+ } else {
185
+ limits.release();
186
+ }
187
+ throw error;
188
+ }
189
+ limits.commit();
190
+ return guide;
191
+ }
192
+ async function readGrantWithRateLimits(service, grantId, secret, networkKey, networkLimiter, grantLimiter, failureLimiter, authenticationLimiter) {
193
+ const releaseAuthentication = authenticationLimiter.reserve(networkKey);
194
+ if (!releaseAuthentication) throw rateLimited();
195
+ try {
196
+ return await readGrantUnderAuthenticationReservation(
197
+ service,
198
+ grantId,
199
+ secret,
200
+ networkKey,
201
+ networkLimiter,
202
+ grantLimiter,
203
+ failureLimiter
204
+ );
205
+ } finally {
206
+ releaseAuthentication();
207
+ }
208
+ }
209
+ function normalizeSupportPassportNetworkAddress(value) {
210
+ if (!value) return void 0;
211
+ const address = value.trim().toLowerCase();
212
+ const family = isIP(address);
213
+ if (family === 0) return void 0;
214
+ if (family === 4) return address;
215
+ const canonical = new URL(`http://[${address}]/`).hostname.slice(1, -1);
216
+ const mapped = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(canonical);
217
+ if (!mapped) return canonical;
218
+ const high = Number.parseInt(mapped[1] ?? "", 16);
219
+ const low = Number.parseInt(mapped[2] ?? "", 16);
220
+ return `${high >>> 8}.${high & 255}.${low >>> 8}.${low & 255}`;
221
+ }
222
+ function requestNetworkAddress(req, trustedProxyAddresses) {
223
+ const directAddress = normalizeSupportPassportNetworkAddress(req.socket.remoteAddress) ?? "unknown";
224
+ if (!trustedProxyAddresses.has(directAddress)) return directAddress;
225
+ const forwarded = req.headers["x-forwarded-for"];
226
+ if (typeof forwarded !== "string") return directAddress;
227
+ const rawAddresses = forwarded.split(",");
228
+ if (rawAddresses.length < 1 || rawAddresses.length > 32) return directAddress;
229
+ const addresses = rawAddresses.map((address) => normalizeSupportPassportNetworkAddress(address));
230
+ if (addresses.some((address) => address === void 0)) return directAddress;
231
+ for (let index = addresses.length - 1; index >= 0; index -= 1) {
232
+ const address = addresses[index];
233
+ if (address && !trustedProxyAddresses.has(address)) return address;
234
+ }
235
+ return addresses[0] ?? directAddress;
236
+ }
237
+ function networkDigest(req, trustedProxyAddresses) {
238
+ return createHash("sha256").update(requestNetworkAddress(req, trustedProxyAddresses)).digest("hex");
239
+ }
240
+ function parseSecret(req) {
241
+ const raw = req.headers.authorization;
242
+ if (typeof raw !== "string") return void 0;
243
+ const match = /^(\S+)[ \t]+(\S+)$/.exec(raw);
244
+ if (!match || match[1]?.toLowerCase() !== "supportpassport") return void 0;
245
+ const secret = match[2] ?? "";
246
+ if (!/^[A-Za-z0-9_-]{32,256}$/.test(secret)) return void 0;
247
+ return secret;
248
+ }
249
+ function requestDeclaresBody(req) {
250
+ const contentLength = req.headers["content-length"];
251
+ const transferEncoding = req.headers["transfer-encoding"];
252
+ return transferEncoding !== void 0 || contentLength !== void 0 && contentLength !== "0";
253
+ }
254
+ function respondJson(res, status, payload) {
255
+ const body = JSON.stringify(payload);
256
+ res.statusCode = status;
257
+ res.setHeader("cache-control", "private, no-store");
258
+ res.setHeader("vary", "Authorization");
259
+ res.setHeader("content-type", "application/json; charset=utf-8");
260
+ res.setHeader("content-length", String(Buffer.byteLength(body)));
261
+ res.end(body);
262
+ }
263
+ function respondJsonAndCloseUnreadRequest(req, res, status, payload) {
264
+ res.shouldKeepAlive = false;
265
+ res.setHeader("connection", "close");
266
+ res.once("finish", () => req.destroy());
267
+ respondJson(res, status, payload);
268
+ }
269
+ function respondBeforeReadingBody(req, res, status, payload) {
270
+ if (requestDeclaresBody(req)) {
271
+ respondJsonAndCloseUnreadRequest(req, res, status, payload);
272
+ return;
273
+ }
274
+ respondJson(res, status, payload);
275
+ }
276
+ async function readQuestionBody(req, signal) {
277
+ const content = await new Promise((resolve, reject) => {
278
+ const chunks = [];
279
+ let bytes = 0;
280
+ let settled = false;
281
+ const cleanup = () => {
282
+ req.off("data", onData);
283
+ req.off("end", onEnd);
284
+ req.off("error", onError);
285
+ req.off("aborted", onAborted);
286
+ signal.removeEventListener("abort", onSignalAbort);
287
+ };
288
+ const fail = (error) => {
289
+ if (settled) return;
290
+ settled = true;
291
+ cleanup();
292
+ reject(error);
293
+ };
294
+ const helperLeft = () => isAbortError(signal.reason) ? signal.reason : abortError("The helper left.");
295
+ const onData = (chunk) => {
296
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
297
+ bytes += buffer.length;
298
+ if (bytes > 4096) {
299
+ req.pause();
300
+ fail(
301
+ new UnreadSupportPassportRequestError(
302
+ new SupportPassportError("invalid_input", "The helper question is invalid.", 400)
303
+ )
304
+ );
305
+ return;
306
+ }
307
+ chunks.push(buffer);
308
+ };
309
+ const onEnd = () => {
310
+ if (settled) return;
311
+ settled = true;
312
+ cleanup();
313
+ resolve(Buffer.concat(chunks, bytes));
314
+ };
315
+ const onError = (error) => fail(signal.aborted || req.aborted ? helperLeft() : error);
316
+ const onAborted = () => fail(helperLeft());
317
+ const onSignalAbort = () => fail(helperLeft());
318
+ req.on("data", onData);
319
+ req.once("end", onEnd);
320
+ req.once("error", onError);
321
+ req.once("aborted", onAborted);
322
+ signal.addEventListener("abort", onSignalAbort, { once: true });
323
+ if (signal.aborted) onSignalAbort();
324
+ });
325
+ let parsed;
326
+ try {
327
+ parsed = JSON.parse(content.toString("utf8"));
328
+ } catch {
329
+ throw new SupportPassportError("invalid_input", "The helper question is invalid.", 400);
330
+ }
331
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
332
+ throw new SupportPassportError("invalid_input", "The helper question is invalid.", 400);
333
+ }
334
+ const body = parsed;
335
+ if (Object.keys(body).length !== 1 || typeof body.question !== "string") {
336
+ throw new SupportPassportError("invalid_input", "The helper question is invalid.", 400);
337
+ }
338
+ const question = body.question.trim();
339
+ if (question.length < 1 || question.length > 500) {
340
+ throw new SupportPassportError("invalid_input", "The helper question is invalid.", 400);
341
+ }
342
+ return question;
343
+ }
344
+ function requestSignal(req, res) {
345
+ const controller = new AbortController();
346
+ const abort = () => {
347
+ if (!res.writableFinished && !controller.signal.aborted) controller.abort(abortError("The helper left."));
348
+ };
349
+ req.once("aborted", abort);
350
+ res.once("close", abort);
351
+ return {
352
+ signal: controller.signal,
353
+ cleanup: () => {
354
+ req.off("aborted", abort);
355
+ res.off("close", abort);
356
+ }
357
+ };
358
+ }
359
+ function decodeGrantId(raw) {
360
+ try {
361
+ const value = decodeURIComponent(raw);
362
+ return /^[A-Za-z0-9_-]{1,128}$/.test(value) ? value.toLowerCase() : void 0;
363
+ } catch {
364
+ return void 0;
365
+ }
366
+ }
367
+ function buildSupportPassportPublicRequestHandler(service, options = {}) {
368
+ const rateLimits = createRateLimits(options.now ?? Date.now);
369
+ const trustedProxyAddresses = new Set(
370
+ (options.trustedProxyAddresses ?? []).map((address) => normalizeSupportPassportNetworkAddress(address)).filter((address) => address !== void 0)
371
+ );
372
+ return async (req, res) => {
373
+ let parsed;
374
+ try {
375
+ parsed = new URL(req.url ?? "/", "http://placeholder");
376
+ } catch {
377
+ return false;
378
+ }
379
+ const readMatch = /^\/engram\/v1\/support-passport\/public\/grants\/([^/]+)$/.exec(parsed.pathname);
380
+ const askMatch = /^\/engram\/v1\/support-passport\/public\/grants\/([^/]+)\/ask$/.exec(parsed.pathname);
381
+ const ownedRead = req.method === "GET" && readMatch;
382
+ const ownedQuestion = req.method === "POST" && askMatch;
383
+ if (!ownedRead && !ownedQuestion) return false;
384
+ res.setHeader("cache-control", "private, no-store");
385
+ res.setHeader("vary", "Authorization");
386
+ const grantId = decodeGrantId((ownedRead ? readMatch?.[1] : askMatch?.[1]) ?? "");
387
+ const secret = parseSecret(req);
388
+ if (parsed.search.length > 0) {
389
+ respondBeforeReadingBody(req, res, 400, {
390
+ error: "The share link request is invalid.",
391
+ code: "invalid_input"
392
+ });
393
+ return true;
394
+ }
395
+ if (ownedRead && requestDeclaresBody(req)) {
396
+ respondJsonAndCloseUnreadRequest(req, res, 400, {
397
+ error: "The share link request is invalid.",
398
+ code: "invalid_input"
399
+ });
400
+ return true;
401
+ }
402
+ if (!grantId || !secret) {
403
+ respondBeforeReadingBody(req, res, 404, {
404
+ error: "The share link was not found.",
405
+ code: "grant_not_found"
406
+ });
407
+ return true;
408
+ }
409
+ const lifecycle = requestSignal(req, res);
410
+ try {
411
+ const digest = networkDigest(req, trustedProxyAddresses);
412
+ if (ownedRead) {
413
+ const guide = await readGrantWithRateLimits(
414
+ service,
415
+ grantId,
416
+ secret,
417
+ digest,
418
+ rateLimits.networkReads,
419
+ rateLimits.grantReads,
420
+ rateLimits.networkReadFailures,
421
+ rateLimits.authentications
422
+ );
423
+ respondJson(res, 200, guide);
424
+ } else {
425
+ let releaseAuthentication = rateLimits.authentications.reserve(digest);
426
+ if (!releaseAuthentication) throw new UnreadSupportPassportRequestError(rateLimited());
427
+ try {
428
+ let question;
429
+ const bodyFailure = rateLimits.networkQuestionFailures.reserve(digest);
430
+ if (!bodyFailure) throw new UnreadSupportPassportRequestError(rateLimited());
431
+ try {
432
+ question = await readQuestionBody(req, lifecycle.signal);
433
+ bodyFailure.release();
434
+ } catch (error) {
435
+ const supportError = error instanceof UnreadSupportPassportRequestError ? error.response : error;
436
+ if (supportError instanceof SupportPassportError && supportError.code === "invalid_input") {
437
+ bodyFailure.commit();
438
+ } else {
439
+ bodyFailure.release();
440
+ }
441
+ throw error;
442
+ }
443
+ const releaseModelCall = rateLimits.modelCalls.reserve(digest);
444
+ if (!releaseModelCall) throw rateLimited();
445
+ try {
446
+ await readGrantUnderAuthenticationReservation(
447
+ service,
448
+ grantId,
449
+ secret,
450
+ digest,
451
+ rateLimits.networkQuestions,
452
+ rateLimits.grantQuestions,
453
+ rateLimits.networkQuestionFailures
454
+ );
455
+ releaseAuthentication();
456
+ releaseAuthentication = void 0;
457
+ const answer = await runPublicOperation(
458
+ service,
459
+ "support_passport_grant_ask",
460
+ { grantId, secret, question },
461
+ lifecycle.signal
462
+ );
463
+ respondJson(res, 200, answer);
464
+ } finally {
465
+ releaseModelCall();
466
+ }
467
+ } finally {
468
+ releaseAuthentication?.();
469
+ }
470
+ }
471
+ } catch (error) {
472
+ if (error instanceof UnreadSupportPassportRequestError) {
473
+ respondJsonAndCloseUnreadRequest(req, res, error.response.status, {
474
+ error: error.response.message,
475
+ code: error.response.code
476
+ });
477
+ return true;
478
+ }
479
+ if (!(error instanceof SupportPassportError)) throw error;
480
+ respondJson(res, error.status, { error: error.message, code: error.code });
481
+ } finally {
482
+ lifecycle.cleanup();
483
+ }
484
+ return true;
485
+ };
486
+ }
487
+ function composeSupportPassportExternalRequestHandlers(...handlers) {
488
+ return async (req, res, ctx) => {
489
+ for (const handler of handlers) {
490
+ if (handler && await handler(req, res, ctx)) return true;
491
+ }
492
+ return false;
493
+ };
494
+ }
495
+
496
+ export {
497
+ SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES,
498
+ normalizeSupportPassportNetworkAddress,
499
+ buildSupportPassportPublicRequestHandler,
500
+ composeSupportPassportExternalRequestHandlers
501
+ };
502
+ //# sourceMappingURL=chunk-37DZZFFM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/support-passport/public-http.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { isIP } from \"node:net\";\n\nimport { abortError, isAbortError } from \"../abort-error.js\";\nimport { type OperationName, getOperation } from \"../access-boundary.js\";\nimport type { EngramAccessService } from \"../access-service.js\";\nimport { SupportPassportError } from \"./errors.js\";\n\nconst PUBLIC_RATE_LIMIT_MAX_KEYS = 20_000;\nconst PUBLIC_AUTH_MAX_IN_FLIGHT_PER_NETWORK = 8;\nconst PUBLIC_AUTH_MAX_IN_FLIGHT_TOTAL = 256;\nconst PUBLIC_MODEL_MAX_IN_FLIGHT_PER_NETWORK = 8;\nconst PUBLIC_MODEL_MAX_IN_FLIGHT_TOTAL = 256;\n\nexport const SUPPORT_PASSPORT_PUBLIC_HTTP_ROUTES = [\n {\n method: \"GET\",\n pathname: \"/engram/v1/support-passport/public/grants/:id\",\n operation: \"support_passport_grant_read\",\n },\n {\n method: \"POST\",\n pathname: \"/engram/v1/support-passport/public/grants/:id/ask\",\n operation: \"support_passport_grant_ask\",\n },\n] as const satisfies ReadonlyArray<{ method: string; pathname: string; operation: OperationName }>;\n\nexport type SupportPassportExternalRequestHandler = (\n req: IncomingMessage,\n res: ServerResponse,\n ctx: {\n authorized: boolean;\n tokenAuthorized: boolean;\n }\n) => Promise<boolean>;\n\ninterface WindowEntry {\n count: number;\n resetAt: number;\n}\n\ninterface WindowReservation {\n commit(): void;\n release(): void;\n}\n\nclass UnreadSupportPassportRequestError extends Error {\n constructor(readonly response: SupportPassportError) {\n super(response.message);\n this.name = \"UnreadSupportPassportRequestError\";\n }\n}\n\nclass FixedWindowLimiter {\n private readonly entries = new Map<string, WindowEntry>();\n\n constructor(\n private readonly limit: number,\n private readonly windowMs: number,\n private readonly now: () => number\n ) {}\n\n consume(key: string): boolean {\n const reservation = this.reserve(key);\n if (!reservation) return false;\n reservation.commit();\n return true;\n }\n\n reserve(key: string): WindowReservation | undefined {\n const now = this.now();\n let entry = this.entries.get(key);\n if (!entry || entry.resetAt <= now) {\n if (!entry && this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) {\n this.prune(now);\n if (this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) return undefined;\n }\n entry = { count: 0, resetAt: now + this.windowMs };\n this.entries.set(key, entry);\n }\n if (entry.count >= this.limit) return undefined;\n entry.count += 1;\n let active = true;\n return {\n commit: () => {\n active = false;\n },\n release: () => {\n if (!active) return;\n active = false;\n if (this.entries.get(key) !== entry) return;\n entry.count -= 1;\n if (entry.count === 0) this.entries.delete(key);\n },\n };\n }\n\n allows(key: string): boolean {\n const now = this.now();\n const current = this.entries.get(key);\n if (current && current.resetAt > now) return current.count < this.limit;\n if (!current && this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) {\n this.prune(now);\n if (this.entries.size >= PUBLIC_RATE_LIMIT_MAX_KEYS) return false;\n }\n return true;\n }\n\n private prune(now: number): void {\n for (const [key, entry] of this.entries) {\n if (entry.resetAt <= now) this.entries.delete(key);\n }\n }\n}\n\nclass InFlightLimiter {\n private readonly counts = new Map<string, number>();\n private total = 0;\n\n constructor(\n private readonly perKeyLimit: number,\n private readonly totalLimit: number\n ) {}\n\n reserve(key: string): (() => void) | undefined {\n const current = this.counts.get(key) ?? 0;\n if (current >= this.perKeyLimit || this.total >= this.totalLimit) return undefined;\n this.counts.set(key, current + 1);\n this.total += 1;\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const count = this.counts.get(key) ?? 0;\n if (count <= 1) this.counts.delete(key);\n else this.counts.set(key, count - 1);\n this.total -= 1;\n };\n }\n}\n\ninterface PublicRateLimits {\n authentications: InFlightLimiter;\n modelCalls: InFlightLimiter;\n grantReads: FixedWindowLimiter;\n networkReads: FixedWindowLimiter;\n networkReadFailures: FixedWindowLimiter;\n grantQuestions: FixedWindowLimiter;\n networkQuestions: FixedWindowLimiter;\n networkQuestionFailures: FixedWindowLimiter;\n}\n\nexport interface SupportPassportPublicHandlerOptions {\n now?: () => number;\n trustedProxyAddresses?: readonly string[];\n}\n\nfunction createRateLimits(now: () => number): PublicRateLimits {\n return {\n authentications: new InFlightLimiter(PUBLIC_AUTH_MAX_IN_FLIGHT_PER_NETWORK, PUBLIC_AUTH_MAX_IN_FLIGHT_TOTAL),\n modelCalls: new InFlightLimiter(PUBLIC_MODEL_MAX_IN_FLIGHT_PER_NETWORK, PUBLIC_MODEL_MAX_IN_FLIGHT_TOTAL),\n grantReads: new FixedWindowLimiter(60, 60_000, now),\n networkReads: new FixedWindowLimiter(60, 60_000, now),\n networkReadFailures: new FixedWindowLimiter(60, 60_000, now),\n grantQuestions: new FixedWindowLimiter(20, 10 * 60_000, now),\n networkQuestions: new FixedWindowLimiter(20, 10 * 60_000, now),\n networkQuestionFailures: new FixedWindowLimiter(20, 10 * 60_000, now),\n };\n}\n\nfunction rateLimited(): SupportPassportError {\n return new SupportPassportError(\"rate_limited\", \"Too many helper requests.\", 429);\n}\n\nasync function runPublicOperation(\n service: EngramAccessService,\n name: \"support_passport_grant_read\" | \"support_passport_grant_ask\",\n input: Record<string, unknown>,\n signal?: AbortSignal\n): Promise<unknown> {\n const operation = getOperation(name);\n if (!operation) throw new Error(`access-boundary: operation not registered: ${name}`);\n const output = (await operation.run(input, {\n service,\n ...(signal ? { abortSignal: signal } : {}),\n })) as { result: unknown };\n return output.result;\n}\n\nfunction reserveAuthenticatedLimits(\n networkLimiter: FixedWindowLimiter,\n grantLimiter: FixedWindowLimiter,\n networkKey: string,\n grantId: string\n): WindowReservation {\n const network = networkLimiter.reserve(networkKey);\n if (!network) throw rateLimited();\n const grant = grantLimiter.reserve(grantId);\n if (!grant) {\n network.release();\n throw rateLimited();\n }\n let active = true;\n return {\n commit: () => {\n if (!active) return;\n active = false;\n network.commit();\n grant.commit();\n },\n release: () => {\n if (!active) return;\n active = false;\n grant.release();\n network.release();\n },\n };\n}\n\nasync function readGrantUnderAuthenticationReservation(\n service: EngramAccessService,\n grantId: string,\n secret: string,\n networkKey: string,\n networkLimiter: FixedWindowLimiter,\n grantLimiter: FixedWindowLimiter,\n failureLimiter: FixedWindowLimiter\n) {\n if (!failureLimiter.allows(networkKey)) throw rateLimited();\n const limits = reserveAuthenticatedLimits(networkLimiter, grantLimiter, networkKey, grantId);\n let guide: Awaited<ReturnType<EngramAccessService[\"supportPassportReadGrant\"]>>;\n try {\n guide = (await runPublicOperation(service, \"support_passport_grant_read\", { grantId, secret })) as Awaited<\n ReturnType<EngramAccessService[\"supportPassportReadGrant\"]>\n >;\n } catch (error) {\n if (error instanceof SupportPassportError) {\n if (error.code === \"grant_not_found\") {\n limits.release();\n if (!failureLimiter.consume(networkKey)) throw rateLimited();\n } else {\n limits.commit();\n }\n } else {\n limits.release();\n }\n throw error;\n }\n limits.commit();\n return guide;\n}\n\nasync function readGrantWithRateLimits(\n service: EngramAccessService,\n grantId: string,\n secret: string,\n networkKey: string,\n networkLimiter: FixedWindowLimiter,\n grantLimiter: FixedWindowLimiter,\n failureLimiter: FixedWindowLimiter,\n authenticationLimiter: InFlightLimiter\n) {\n const releaseAuthentication = authenticationLimiter.reserve(networkKey);\n if (!releaseAuthentication) throw rateLimited();\n try {\n return await readGrantUnderAuthenticationReservation(\n service,\n grantId,\n secret,\n networkKey,\n networkLimiter,\n grantLimiter,\n failureLimiter\n );\n } finally {\n releaseAuthentication();\n }\n}\n\nexport function normalizeSupportPassportNetworkAddress(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const address = value.trim().toLowerCase();\n const family = isIP(address);\n if (family === 0) return undefined;\n if (family === 4) return address;\n const canonical = new URL(`http://[${address}]/`).hostname.slice(1, -1);\n const mapped = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(canonical);\n if (!mapped) return canonical;\n const high = Number.parseInt(mapped[1] ?? \"\", 16);\n const low = Number.parseInt(mapped[2] ?? \"\", 16);\n return `${high >>> 8}.${high & 0xff}.${low >>> 8}.${low & 0xff}`;\n}\n\nfunction requestNetworkAddress(req: IncomingMessage, trustedProxyAddresses: ReadonlySet<string>): string {\n const directAddress = normalizeSupportPassportNetworkAddress(req.socket.remoteAddress) ?? \"unknown\";\n if (!trustedProxyAddresses.has(directAddress)) return directAddress;\n const forwarded = req.headers[\"x-forwarded-for\"];\n if (typeof forwarded !== \"string\") return directAddress;\n const rawAddresses = forwarded.split(\",\");\n if (rawAddresses.length < 1 || rawAddresses.length > 32) return directAddress;\n const addresses = rawAddresses.map((address) => normalizeSupportPassportNetworkAddress(address));\n if (addresses.some((address) => address === undefined)) return directAddress;\n for (let index = addresses.length - 1; index >= 0; index -= 1) {\n const address = addresses[index];\n if (address && !trustedProxyAddresses.has(address)) return address;\n }\n return addresses[0] ?? directAddress;\n}\n\nfunction networkDigest(req: IncomingMessage, trustedProxyAddresses: ReadonlySet<string>): string {\n return createHash(\"sha256\")\n .update(requestNetworkAddress(req, trustedProxyAddresses))\n .digest(\"hex\");\n}\n\nfunction parseSecret(req: IncomingMessage): string | undefined {\n const raw = req.headers.authorization;\n if (typeof raw !== \"string\") return undefined;\n const match = /^(\\S+)[ \\t]+(\\S+)$/.exec(raw);\n if (!match || match[1]?.toLowerCase() !== \"supportpassport\") return undefined;\n const secret = match[2] ?? \"\";\n if (!/^[A-Za-z0-9_-]{32,256}$/.test(secret)) return undefined;\n return secret;\n}\n\nfunction requestDeclaresBody(req: IncomingMessage): boolean {\n const contentLength = req.headers[\"content-length\"];\n const transferEncoding = req.headers[\"transfer-encoding\"];\n return transferEncoding !== undefined || (contentLength !== undefined && contentLength !== \"0\");\n}\n\nfunction respondJson(res: ServerResponse, status: number, payload: unknown): void {\n const body = JSON.stringify(payload);\n res.statusCode = status;\n res.setHeader(\"cache-control\", \"private, no-store\");\n res.setHeader(\"vary\", \"Authorization\");\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.setHeader(\"content-length\", String(Buffer.byteLength(body)));\n res.end(body);\n}\n\nfunction respondJsonAndCloseUnreadRequest(\n req: IncomingMessage,\n res: ServerResponse,\n status: number,\n payload: unknown\n): void {\n res.shouldKeepAlive = false;\n res.setHeader(\"connection\", \"close\");\n res.once(\"finish\", () => req.destroy());\n respondJson(res, status, payload);\n}\n\nfunction respondBeforeReadingBody(\n req: IncomingMessage,\n res: ServerResponse,\n status: number,\n payload: unknown\n): void {\n if (requestDeclaresBody(req)) {\n respondJsonAndCloseUnreadRequest(req, res, status, payload);\n return;\n }\n respondJson(res, status, payload);\n}\n\nasync function readQuestionBody(req: IncomingMessage, signal: AbortSignal): Promise<string> {\n const content = await new Promise<Buffer>((resolve, reject) => {\n const chunks: Buffer[] = [];\n let bytes = 0;\n let settled = false;\n const cleanup = () => {\n req.off(\"data\", onData);\n req.off(\"end\", onEnd);\n req.off(\"error\", onError);\n req.off(\"aborted\", onAborted);\n signal.removeEventListener(\"abort\", onSignalAbort);\n };\n const fail = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(error);\n };\n const helperLeft = () =>\n isAbortError(signal.reason) ? signal.reason : abortError(\"The helper left.\");\n const onData = (chunk: Buffer | string) => {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n bytes += buffer.length;\n if (bytes > 4_096) {\n req.pause();\n fail(\n new UnreadSupportPassportRequestError(\n new SupportPassportError(\"invalid_input\", \"The helper question is invalid.\", 400)\n )\n );\n return;\n }\n chunks.push(buffer);\n };\n const onEnd = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(Buffer.concat(chunks, bytes));\n };\n const onError = (error: Error) => fail(signal.aborted || req.aborted ? helperLeft() : error);\n const onAborted = () => fail(helperLeft());\n const onSignalAbort = () => fail(helperLeft());\n req.on(\"data\", onData);\n req.once(\"end\", onEnd);\n req.once(\"error\", onError);\n req.once(\"aborted\", onAborted);\n signal.addEventListener(\"abort\", onSignalAbort, { once: true });\n if (signal.aborted) onSignalAbort();\n });\n let parsed: unknown;\n try {\n parsed = JSON.parse(content.toString(\"utf8\"));\n } catch {\n throw new SupportPassportError(\"invalid_input\", \"The helper question is invalid.\", 400);\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new SupportPassportError(\"invalid_input\", \"The helper question is invalid.\", 400);\n }\n const body = parsed as Record<string, unknown>;\n if (Object.keys(body).length !== 1 || typeof body.question !== \"string\") {\n throw new SupportPassportError(\"invalid_input\", \"The helper question is invalid.\", 400);\n }\n const question = body.question.trim();\n if (question.length < 1 || question.length > 500) {\n throw new SupportPassportError(\"invalid_input\", \"The helper question is invalid.\", 400);\n }\n return question;\n}\n\nfunction requestSignal(req: IncomingMessage, res: ServerResponse): { signal: AbortSignal; cleanup(): void } {\n const controller = new AbortController();\n const abort = () => {\n if (!res.writableFinished && !controller.signal.aborted) controller.abort(abortError(\"The helper left.\"));\n };\n req.once(\"aborted\", abort);\n res.once(\"close\", abort);\n return {\n signal: controller.signal,\n cleanup: () => {\n req.off(\"aborted\", abort);\n res.off(\"close\", abort);\n },\n };\n}\n\nfunction decodeGrantId(raw: string): string | undefined {\n try {\n const value = decodeURIComponent(raw);\n return /^[A-Za-z0-9_-]{1,128}$/.test(value) ? value.toLowerCase() : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function buildSupportPassportPublicRequestHandler(\n service: EngramAccessService,\n options: SupportPassportPublicHandlerOptions = {}\n): SupportPassportExternalRequestHandler {\n const rateLimits = createRateLimits(options.now ?? Date.now);\n const trustedProxyAddresses = new Set(\n (options.trustedProxyAddresses ?? [])\n .map((address) => normalizeSupportPassportNetworkAddress(address))\n .filter((address): address is string => address !== undefined)\n );\n return async (req, res) => {\n let parsed: URL;\n try {\n parsed = new URL(req.url ?? \"/\", \"http://placeholder\");\n } catch {\n return false;\n }\n const readMatch = /^\\/engram\\/v1\\/support-passport\\/public\\/grants\\/([^/]+)$/.exec(parsed.pathname);\n const askMatch = /^\\/engram\\/v1\\/support-passport\\/public\\/grants\\/([^/]+)\\/ask$/.exec(parsed.pathname);\n const ownedRead = req.method === \"GET\" && readMatch;\n const ownedQuestion = req.method === \"POST\" && askMatch;\n if (!ownedRead && !ownedQuestion) return false;\n\n res.setHeader(\"cache-control\", \"private, no-store\");\n res.setHeader(\"vary\", \"Authorization\");\n const grantId = decodeGrantId((ownedRead ? readMatch?.[1] : askMatch?.[1]) ?? \"\");\n const secret = parseSecret(req);\n if (parsed.search.length > 0) {\n respondBeforeReadingBody(req, res, 400, {\n error: \"The share link request is invalid.\",\n code: \"invalid_input\",\n });\n return true;\n }\n if (ownedRead && requestDeclaresBody(req)) {\n respondJsonAndCloseUnreadRequest(req, res, 400, {\n error: \"The share link request is invalid.\",\n code: \"invalid_input\",\n });\n return true;\n }\n if (!grantId || !secret) {\n respondBeforeReadingBody(req, res, 404, {\n error: \"The share link was not found.\",\n code: \"grant_not_found\",\n });\n return true;\n }\n\n const lifecycle = requestSignal(req, res);\n try {\n const digest = networkDigest(req, trustedProxyAddresses);\n if (ownedRead) {\n const guide = await readGrantWithRateLimits(\n service,\n grantId,\n secret,\n digest,\n rateLimits.networkReads,\n rateLimits.grantReads,\n rateLimits.networkReadFailures,\n rateLimits.authentications\n );\n respondJson(res, 200, guide);\n } else {\n let releaseAuthentication = rateLimits.authentications.reserve(digest);\n if (!releaseAuthentication) throw new UnreadSupportPassportRequestError(rateLimited());\n try {\n let question: string;\n const bodyFailure = rateLimits.networkQuestionFailures.reserve(digest);\n if (!bodyFailure) throw new UnreadSupportPassportRequestError(rateLimited());\n try {\n question = await readQuestionBody(req, lifecycle.signal);\n bodyFailure.release();\n } catch (error) {\n const supportError =\n error instanceof UnreadSupportPassportRequestError ? error.response : error;\n if (supportError instanceof SupportPassportError && supportError.code === \"invalid_input\") {\n bodyFailure.commit();\n } else {\n bodyFailure.release();\n }\n throw error;\n }\n const releaseModelCall = rateLimits.modelCalls.reserve(digest);\n if (!releaseModelCall) throw rateLimited();\n try {\n await readGrantUnderAuthenticationReservation(\n service,\n grantId,\n secret,\n digest,\n rateLimits.networkQuestions,\n rateLimits.grantQuestions,\n rateLimits.networkQuestionFailures\n );\n releaseAuthentication();\n releaseAuthentication = undefined;\n const answer = await runPublicOperation(\n service,\n \"support_passport_grant_ask\",\n { grantId, secret, question },\n lifecycle.signal\n );\n respondJson(res, 200, answer);\n } finally {\n releaseModelCall();\n }\n } finally {\n releaseAuthentication?.();\n }\n }\n } catch (error) {\n if (error instanceof UnreadSupportPassportRequestError) {\n respondJsonAndCloseUnreadRequest(req, res, error.response.status, {\n error: error.response.message,\n code: error.response.code,\n });\n return true;\n }\n if (!(error instanceof SupportPassportError)) throw error;\n respondJson(res, error.status, { error: error.message, code: error.code });\n } finally {\n lifecycle.cleanup();\n }\n return true;\n };\n}\n\nexport function composeSupportPassportExternalRequestHandlers(\n ...handlers: Array<SupportPassportExternalRequestHandler | undefined>\n): SupportPassportExternalRequestHandler {\n return async (req, res, ctx) => {\n for (const handler of handlers) {\n if (handler && (await handler(req, res, ctx))) return true;\n }\n return false;\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,9 @@
1
+ // src/inline-script.ts
2
+ function serializeInlineScriptValue(value) {
3
+ return JSON.stringify(value).replaceAll("<", "\\u003c").replaceAll("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029");
4
+ }
5
+
6
+ export {
7
+ serializeInlineScriptValue
8
+ };
9
+ //# sourceMappingURL=chunk-3HSRWJTC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/inline-script.ts"],"sourcesContent":["export function serializeInlineScriptValue(value: string): string {\n return JSON.stringify(value)\n .replaceAll(\"<\", \"\\\\u003c\")\n .replaceAll(\"\\u2028\", \"\\\\u2028\")\n .replaceAll(\"\\u2029\", \"\\\\u2029\");\n}\n"],"mappings":";AAAO,SAAS,2BAA2B,OAAuB;AAChE,SAAO,KAAK,UAAU,KAAK,EACxB,WAAW,KAAK,SAAS,EACzB,WAAW,UAAU,SAAS,EAC9B,WAAW,UAAU,SAAS;AACnC;","names":[]}
@@ -7,10 +7,10 @@ import {
7
7
  import {
8
8
  listMemoryGovernanceRuns,
9
9
  readMemoryGovernanceRunArtifact
10
- } from "./chunk-2DD6ZHOM.js";
10
+ } from "./chunk-GJ776BC2.js";
11
11
  import {
12
12
  StorageManager
13
- } from "./chunk-QQXWFDRD.js";
13
+ } from "./chunk-M4YHAODQ.js";
14
14
  import {
15
15
  normalizeProjectionPreview,
16
16
  normalizeProjectionTags
@@ -47,7 +47,7 @@ import {
47
47
  } from "./chunk-RL6NEVXT.js";
48
48
  import {
49
49
  isSupportPassportPrivateMemory
50
- } from "./chunk-HNDIND7P.js";
50
+ } from "./chunk-XX4HPFFM.js";
51
51
  import {
52
52
  log
53
53
  } from "./chunk-3WCASNQZ.js";
@@ -1005,4 +1005,4 @@ export {
1005
1005
  verifyMemoryProjection,
1006
1006
  repairMemoryProjection
1007
1007
  };
1008
- //# sourceMappingURL=chunk-TKFGFDPJ.js.map
1008
+ //# sourceMappingURL=chunk-3TIZPSJC.js.map
@@ -279,4 +279,4 @@ async function searchHarmonicRetrieval(options) {
279
279
  export {
280
280
  searchHarmonicRetrieval
281
281
  };
282
- //# sourceMappingURL=chunk-B4T3FQMT.js.map
282
+ //# sourceMappingURL=chunk-43SEBY2M.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KJTKLXTH.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-QQXWFDRD.js";
6
+ } from "./chunk-M4YHAODQ.js";
7
7
  import {
8
8
  copyExistingFileToBackup,
9
9
  writeFileAtomically
@@ -260,4 +260,4 @@ export {
260
260
  backupExistingLedger,
261
261
  rebuildMemoryLifecycleLedger
262
262
  };
263
- //# sourceMappingURL=chunk-LVKYLMSM.js.map
263
+ //# sourceMappingURL=chunk-46SZBVDS.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-B7RWBZXW.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-QQXWFDRD.js";
6
+ } from "./chunk-M4YHAODQ.js";
7
7
  import {
8
8
  getCachedEpisodeMap,
9
9
  setCachedEpisodeMap
@@ -109,4 +109,4 @@ export {
109
109
  compareVerifiedEpisodeResults,
110
110
  searchVerifiedEpisodes
111
111
  };
112
- //# sourceMappingURL=chunk-YKZLOPTC.js.map
112
+ //# sourceMappingURL=chunk-5FD7JMTX.js.map