@remnic/core 10.0.85 → 10.0.86

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 (417) hide show
  1. package/dist/access-admin-ops-surface.js +72 -71
  2. package/dist/access-authorization-probe.js +73 -72
  3. package/dist/access-boundary.d.ts.map +1 -1
  4. package/dist/access-boundary.js +72 -71
  5. package/dist/access-cli.js +157 -155
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-errors.d.ts +14 -0
  8. package/dist/access-errors.d.ts.map +1 -1
  9. package/dist/access-errors.js +5 -1
  10. package/dist/access-extraction-force-flush.js +72 -71
  11. package/dist/access-http-briefing.js +73 -72
  12. package/dist/access-http-query.js +74 -73
  13. package/dist/access-http.d.ts +12 -0
  14. package/dist/access-http.d.ts.map +1 -1
  15. package/dist/access-http.js +95 -94
  16. package/dist/access-identity-continuity-surface.js +72 -71
  17. package/dist/access-lcm-surface.js +72 -71
  18. package/dist/access-mcp.d.ts.map +1 -1
  19. package/dist/access-mcp.js +82 -81
  20. package/dist/access-memory-search-fanout.js +2 -2
  21. package/dist/access-namespace-preflight.js +72 -71
  22. package/dist/access-observe-write-category.js +10 -9
  23. package/dist/access-observe-write-surface.js +72 -71
  24. package/dist/access-offline-manifest.js +8 -8
  25. package/dist/access-operations-batch.js +73 -72
  26. package/dist/access-operations.js +80 -79
  27. package/dist/access-recall-concurrency.js +72 -71
  28. package/dist/access-recall-diagnostics.js +2 -2
  29. package/dist/access-recall-response.js +72 -71
  30. package/dist/access-recall-surface.js +72 -71
  31. package/dist/access-schema.d.ts.map +1 -1
  32. package/dist/access-schema.js +9 -8
  33. package/dist/access-service.d.ts +3 -3
  34. package/dist/access-service.d.ts.map +1 -1
  35. package/dist/access-service.js +72 -71
  36. package/dist/access-surface-catalog.js +74 -73
  37. package/dist/access-surface-catalog.js.map +1 -1
  38. package/dist/access-token-capabilities.js +2 -2
  39. package/dist/active-recall.js +32 -32
  40. package/dist/adapters/index.js +7 -7
  41. package/dist/adapters/registry.js +3 -3
  42. package/dist/briefing-deadline.d.ts +2 -2
  43. package/dist/briefing-deadline.d.ts.map +1 -1
  44. package/dist/briefing-deadline.js +1 -1
  45. package/dist/briefing.js +23 -23
  46. package/dist/buffer-admission.d.ts +22 -0
  47. package/dist/buffer-admission.d.ts.map +1 -0
  48. package/dist/buffer-admission.js +13 -0
  49. package/dist/buffer-eviction.d.ts +4 -5
  50. package/dist/buffer-eviction.d.ts.map +1 -1
  51. package/dist/buffer-eviction.js +1 -1
  52. package/dist/buffer-turn-helpers.d.ts +7 -0
  53. package/dist/buffer-turn-helpers.d.ts.map +1 -1
  54. package/dist/buffer-turn-helpers.js +9 -1
  55. package/dist/buffer-types.d.ts +24 -1
  56. package/dist/buffer-types.d.ts.map +1 -1
  57. package/dist/buffer.d.ts +17 -18
  58. package/dist/buffer.d.ts.map +1 -1
  59. package/dist/buffer.js +12 -8
  60. package/dist/calibration.js +2 -2
  61. package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
  62. package/dist/capsule-crypto-7FJQINUR.js.map +1 -0
  63. package/dist/capsule-import-gate.d.ts +11 -0
  64. package/dist/capsule-import-gate.d.ts.map +1 -0
  65. package/dist/capsule-import-gate.js +12 -0
  66. package/dist/capsule-import-gate.js.map +1 -0
  67. package/dist/causal-behavior.js +2 -2
  68. package/dist/causal-chain.js +2 -2
  69. package/dist/causal-consolidation.js +25 -25
  70. package/dist/causal-retrieval.js +2 -2
  71. package/dist/causal-trajectory.js +1 -1
  72. package/dist/{chunk-73YVMZ7D.js → chunk-2G4TV2ML.js} +11 -11
  73. package/dist/{chunk-BMIM6ESC.js → chunk-2JG2NI7C.js} +38 -38
  74. package/dist/{chunk-IR4C3DP2.js → chunk-2K3AUDH7.js} +2 -2
  75. package/dist/{chunk-6KFFRMPQ.js → chunk-2N4OUSIA.js} +2 -2
  76. package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
  77. package/dist/{chunk-44FQCC5D.js → chunk-2NUDHVYM.js} +2 -2
  78. package/dist/{chunk-FK4WC6VK.js → chunk-2U4LMSEX.js} +3 -3
  79. package/dist/{chunk-LT3CMO65.js → chunk-2XOFVTTT.js} +2 -2
  80. package/dist/{chunk-I6ORDT54.js → chunk-32CA7B6L.js} +2 -2
  81. package/dist/{chunk-TQVECGUQ.js → chunk-32YX7EJ3.js} +3 -3
  82. package/dist/{chunk-H4D5YURJ.js → chunk-3CTKEXXF.js} +120 -118
  83. package/dist/{chunk-H4D5YURJ.js.map → chunk-3CTKEXXF.js.map} +1 -1
  84. package/dist/{chunk-HLWXCDUQ.js → chunk-3DAWHP5K.js} +5 -5
  85. package/dist/{chunk-GBOYOL5L.js → chunk-3PJEDHLD.js} +2 -2
  86. package/dist/{chunk-ZWTHVUT5.js → chunk-3UZ2VMKD.js} +2 -2
  87. package/dist/{chunk-2XYDL2FG.js → chunk-3Y5X6YFH.js} +2 -2
  88. package/dist/{chunk-23B4HLWG.js → chunk-4GMI5HFH.js} +9 -9
  89. package/dist/{chunk-AP3TSV6S.js → chunk-4LCVA2LW.js} +3 -3
  90. package/dist/{chunk-MZCGHPIJ.js → chunk-4X7HQKAG.js} +2 -2
  91. package/dist/{chunk-YNBMBL4C.js → chunk-4XYAWK5H.js} +2 -2
  92. package/dist/{chunk-2JAT4S7N.js → chunk-5SOSQTVE.js} +2 -2
  93. package/dist/{chunk-G3T6YMBO.js → chunk-64S6X4IU.js} +7 -7
  94. package/dist/{chunk-NIV7RPWQ.js → chunk-6BCWFCDG.js} +7 -7
  95. package/dist/{chunk-V27FK6D6.js → chunk-6XTUZKCZ.js} +2 -2
  96. package/dist/{chunk-KASJJGRG.js → chunk-6ZELOK6O.js} +3 -8
  97. package/dist/chunk-6ZELOK6O.js.map +1 -0
  98. package/dist/{chunk-2ASEDFOA.js → chunk-73UZZFJC.js} +3 -3
  99. package/dist/{chunk-UHPHH74F.js → chunk-77PDJ4OE.js} +3 -3
  100. package/dist/{chunk-BATPQNRG.js → chunk-7GSL4LBG.js} +2 -2
  101. package/dist/{chunk-B6SPPYGJ.js → chunk-7IWRLYFJ.js} +2 -2
  102. package/dist/{chunk-BUKK5SWA.js → chunk-7LCGFUMB.js} +4 -4
  103. package/dist/{chunk-ZXF3O7P4.js → chunk-ARRTLPRC.js} +2 -2
  104. package/dist/{chunk-S5CQI2KF.js → chunk-B3GKQ6DU.js} +2 -2
  105. package/dist/{chunk-2URKYLMK.js → chunk-B56LORLY.js} +2 -2
  106. package/dist/{chunk-4IWEPQEV.js → chunk-BIVKPQ6Q.js} +2 -2
  107. package/dist/{chunk-DM4RRTN7.js → chunk-BLSHFIR6.js} +7 -6
  108. package/dist/chunk-BLSHFIR6.js.map +1 -0
  109. package/dist/{chunk-4DPLCYEK.js → chunk-C2HORX76.js} +3 -3
  110. package/dist/{chunk-ELWI2R6H.js → chunk-CC4V7HNP.js} +22 -22
  111. package/dist/{chunk-LGEH473S.js → chunk-CJCTKL6Y.js} +9 -1
  112. package/dist/chunk-CJCTKL6Y.js.map +1 -0
  113. package/dist/{chunk-WFDWLWDK.js → chunk-CN7Q3T2J.js} +4 -4
  114. package/dist/{chunk-GJVGFKOU.js → chunk-CYCEROPR.js} +3 -3
  115. package/dist/{chunk-CCU7URRP.js → chunk-D5EV6Y2L.js} +3 -3
  116. package/dist/{chunk-N6II66E5.js → chunk-DT7SNJH6.js} +3 -3
  117. package/dist/{chunk-FRM4UTDR.js → chunk-DZ7DPDVW.js} +8 -6
  118. package/dist/chunk-DZ7DPDVW.js.map +1 -0
  119. package/dist/{chunk-MVOJDLXS.js → chunk-EA2LA5RI.js} +2 -2
  120. package/dist/{chunk-WBN66HPI.js → chunk-ELHJK7LM.js} +6 -6
  121. package/dist/{chunk-GKYIRTNX.js → chunk-EQ4U73UH.js} +45 -14
  122. package/dist/chunk-EQ4U73UH.js.map +1 -0
  123. package/dist/{chunk-ONN2E5QD.js → chunk-EUBDYOLD.js} +6 -6
  124. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  125. package/dist/{chunk-3LHPTBWG.js → chunk-F74G4KIH.js} +2 -2
  126. package/dist/{chunk-X7REO4CH.js → chunk-FF3EFLUT.js} +7 -5
  127. package/dist/chunk-FF3EFLUT.js.map +1 -0
  128. package/dist/chunk-FKBGK3NC.js +62 -0
  129. package/dist/chunk-FKBGK3NC.js.map +1 -0
  130. package/dist/{chunk-X2KO4FK5.js → chunk-FNFURZBZ.js} +5 -5
  131. package/dist/chunk-FNFURZBZ.js.map +1 -0
  132. package/dist/{chunk-MYCCO6AA.js → chunk-G54BOKZ6.js} +2 -2
  133. package/dist/{chunk-JFH6JAGY.js → chunk-G67EUQAB.js} +5 -5
  134. package/dist/{chunk-TV65NR7L.js → chunk-GULUWOA5.js} +2 -2
  135. package/dist/{chunk-6DANGCMO.js → chunk-HFUKXOUW.js} +2 -2
  136. package/dist/{chunk-Y3IYKNBY.js → chunk-HLN2HOXX.js} +2 -2
  137. package/dist/{chunk-Y43X3E24.js → chunk-IBDWYRDR.js} +3 -3
  138. package/dist/{chunk-XSFQN7TP.js → chunk-IBGU6AN6.js} +15 -14
  139. package/dist/chunk-IBGU6AN6.js.map +1 -0
  140. package/dist/{chunk-AJG2TAMR.js → chunk-IEEV27BC.js} +2 -2
  141. package/dist/{chunk-FZPDRCOB.js → chunk-IJ3OEECW.js} +4 -4
  142. package/dist/{chunk-D6THW7PA.js → chunk-IPD5GC7C.js} +2 -2
  143. package/dist/{chunk-VCVEMQJK.js → chunk-JM2YZKCQ.js} +2 -2
  144. package/dist/{chunk-H34INI3P.js → chunk-KVSOEVAF.js} +34 -11
  145. package/dist/chunk-KVSOEVAF.js.map +1 -0
  146. package/dist/chunk-M3BEJJNV.js +31 -0
  147. package/dist/chunk-M3BEJJNV.js.map +1 -0
  148. package/dist/{chunk-OSTFDWZJ.js → chunk-NIVKG3DS.js} +4 -4
  149. package/dist/{chunk-VZELUMKK.js → chunk-NQP4ZYGG.js} +2 -2
  150. package/dist/{chunk-3ODZLCHC.js → chunk-NT7F7WJQ.js} +2 -2
  151. package/dist/{chunk-YO2JEX2Z.js → chunk-OGBQMY46.js} +2 -2
  152. package/dist/{chunk-O55AGDTI.js → chunk-OL553AWT.js} +10 -10
  153. package/dist/{chunk-CLVILSBR.js → chunk-OZNBZJ3S.js} +22 -22
  154. package/dist/{chunk-RNGDKFY2.js → chunk-P452SEKO.js} +2 -2
  155. package/dist/{chunk-JX3E4XCW.js → chunk-PDOOUXCS.js} +2 -2
  156. package/dist/{chunk-V45TEVDA.js → chunk-PKZ274PI.js} +3 -3
  157. package/dist/{chunk-MNYQVYJ4.js → chunk-QD5R6U5J.js} +2 -2
  158. package/dist/{chunk-DI5ET2IE.js → chunk-QEZ3DW5O.js} +9 -9
  159. package/dist/{chunk-WYPCJK6K.js → chunk-QKERFEJS.js} +2 -2
  160. package/dist/{chunk-BLMTOIBK.js → chunk-QKES7GU6.js} +2 -2
  161. package/dist/{chunk-PCQWKMOL.js → chunk-QNSZYTSG.js} +2 -2
  162. package/dist/{chunk-433EXTC4.js → chunk-ROGO7FRA.js} +5 -4
  163. package/dist/{chunk-433EXTC4.js.map → chunk-ROGO7FRA.js.map} +1 -1
  164. package/dist/{chunk-MHSBOEH7.js → chunk-ROKDHO74.js} +2 -2
  165. package/dist/{chunk-BLGQUZFB.js → chunk-RWGRSKN5.js} +7 -5
  166. package/dist/chunk-RWGRSKN5.js.map +1 -0
  167. package/dist/{chunk-3VU2FDTU.js → chunk-SYKJBS7S.js} +10 -10
  168. package/dist/{chunk-5BE3FLKL.js → chunk-TAUHAP5J.js} +4 -4
  169. package/dist/{chunk-QCP75JGO.js → chunk-TFA6HPOA.js} +5 -5
  170. package/dist/{chunk-SGHV6LZ7.js → chunk-TQ4SCPGQ.js} +67 -51
  171. package/dist/chunk-TQ4SCPGQ.js.map +1 -0
  172. package/dist/{chunk-E7V5AK7I.js → chunk-TRMZHGIX.js} +8 -8
  173. package/dist/{chunk-WBDIZWJQ.js → chunk-TSS3D7ZY.js} +2 -2
  174. package/dist/{chunk-HVFX2N2G.js → chunk-UAUV3BWS.js} +65 -83
  175. package/dist/chunk-UAUV3BWS.js.map +1 -0
  176. package/dist/{chunk-OMYRPMQC.js → chunk-US7KPQA5.js} +2 -2
  177. package/dist/{chunk-KHZVAISH.js → chunk-UWRHHRDK.js} +2 -2
  178. package/dist/{chunk-WLNWFHX3.js → chunk-UXXK523X.js} +40 -2
  179. package/dist/{chunk-WLNWFHX3.js.map → chunk-UXXK523X.js.map} +1 -1
  180. package/dist/{chunk-SDESKFKT.js → chunk-UYHDMCY2.js} +2 -2
  181. package/dist/{chunk-YAAKVTZA.js → chunk-VKILERSL.js} +2 -2
  182. package/dist/{chunk-2TGIKMMZ.js → chunk-WXDTOE6F.js} +2 -2
  183. package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
  184. package/dist/{chunk-P225W4RQ.js → chunk-XU37EJTW.js} +22 -22
  185. package/dist/chunk-XU37EJTW.js.map +1 -0
  186. package/dist/{chunk-QA3Y2O6H.js → chunk-YAVIBVCU.js} +2 -2
  187. package/dist/{chunk-CMRHXPLQ.js → chunk-YL4UKMD7.js} +117 -51
  188. package/dist/chunk-YL4UKMD7.js.map +1 -0
  189. package/dist/{chunk-GYNRNKMW.js → chunk-YMJRLT7S.js} +28 -8
  190. package/dist/chunk-YMJRLT7S.js.map +1 -0
  191. package/dist/{chunk-E5QEF3JO.js → chunk-YRZPBN46.js} +3 -3
  192. package/dist/{chunk-FMFCQRDM.js → chunk-ZANNIXXE.js} +3 -3
  193. package/dist/{chunk-3KGCHTTK.js → chunk-ZBFLV657.js} +3 -3
  194. package/dist/{chunk-VEFGHRKV.js → chunk-ZOJUWVAU.js} +1 -1
  195. package/dist/cli.js +117 -116
  196. package/dist/coding/export-okf-codegraph.js +21 -21
  197. package/dist/coding/pre-action-gate.js +2 -2
  198. package/dist/compounding/engine.js +23 -23
  199. package/dist/config.js +32 -32
  200. package/dist/connectors/codex-materialize-runner.js +22 -22
  201. package/dist/connectors/index.js +26 -26
  202. package/dist/convergence-refresh.js +24 -24
  203. package/dist/conversation-index/backend.js +2 -2
  204. package/dist/corpus-watermark.js +26 -26
  205. package/dist/dashboard-runtime.js +2 -2
  206. package/dist/deep-recall-config.js +2 -2
  207. package/dist/deep-recall-http-glue.js +11 -11
  208. package/dist/entity-retrieval.js +23 -23
  209. package/dist/explicit-capture.js +1 -1
  210. package/dist/external-wiki-access.js +73 -72
  211. package/dist/extraction-quote-grounding.d.ts +5 -1
  212. package/dist/extraction-quote-grounding.d.ts.map +1 -1
  213. package/dist/extraction-quote-grounding.js +1 -1
  214. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  215. package/dist/extraction-source-grounding-rules.d.ts.map +1 -1
  216. package/dist/extraction-source-grounding-rules.js +2 -2
  217. package/dist/extraction-source-grounding.d.ts +1 -1
  218. package/dist/extraction-source-grounding.d.ts.map +1 -1
  219. package/dist/extraction-source-grounding.js +3 -3
  220. package/dist/extraction.d.ts.map +1 -1
  221. package/dist/extraction.js +40 -40
  222. package/dist/harmonic-retrieval.js +22 -22
  223. package/dist/index.js +196 -194
  224. package/dist/lcm/index.js +3 -3
  225. package/dist/local-llm.js +2 -2
  226. package/dist/location/index.js +25 -25
  227. package/dist/maintenance/memory-governance.js +22 -22
  228. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +22 -22
  229. package/dist/maintenance/rebuild-memory-projection-runner.js +24 -24
  230. package/dist/maintenance/rebuild-memory-projection.js +23 -23
  231. package/dist/memory-browse-http-glue.js +2 -2
  232. package/dist/memory-browse-operations.js +73 -72
  233. package/dist/memory-browse.js +5 -5
  234. package/dist/namespaces/migrate.js +23 -23
  235. package/dist/namespaces/search.d.ts +1 -0
  236. package/dist/namespaces/search.d.ts.map +1 -1
  237. package/dist/namespaces/search.js +10 -8
  238. package/dist/namespaces/storage.js +22 -22
  239. package/dist/offline-sync-changeset-generations.js +3 -3
  240. package/dist/offline-sync-embedding-generation.js +2 -2
  241. package/dist/offline-sync-impression-drain.js +2 -2
  242. package/dist/offline-sync-snapshot-stream.js +6 -6
  243. package/dist/offline-sync.js +5 -5
  244. package/dist/operator-doctor-corpus.js +29 -29
  245. package/dist/operator-doctor-replica.js +4 -4
  246. package/dist/operator-toolkit.js +44 -44
  247. package/dist/orchestration/backlog-scheduler.js +158 -156
  248. package/dist/orchestration/backlog-scheduler.js.map +1 -1
  249. package/dist/orchestration/buffer-drain-runner.js +158 -156
  250. package/dist/orchestration/maintenance.js +36 -36
  251. package/dist/orchestration/turn-ingestion.d.ts +2 -9
  252. package/dist/orchestration/turn-ingestion.d.ts.map +1 -1
  253. package/dist/orchestrator.js +159 -157
  254. package/dist/qmd.js +4 -4
  255. package/dist/recall-navigation-http-glue.js +2 -2
  256. package/dist/recall-navigation-operations.js +73 -72
  257. package/dist/recall-navigation.js +72 -71
  258. package/dist/recall-state-view-admission.js +5 -5
  259. package/dist/recall-why-service.js +5 -5
  260. package/dist/replica-divergence.js +3 -3
  261. package/dist/resume-bundles.js +33 -33
  262. package/dist/search/factory.js +7 -7
  263. package/dist/search/index.js +11 -11
  264. package/dist/semantic-consolidation.js +23 -23
  265. package/dist/semantic-rule-promotion.js +22 -22
  266. package/dist/semantic-rule-verifier.js +22 -22
  267. package/dist/source-agent-qualifier.d.ts +2 -0
  268. package/dist/source-agent-qualifier.d.ts.map +1 -1
  269. package/dist/source-agent-qualifier.js +33 -33
  270. package/dist/standup/build.js +23 -23
  271. package/dist/storage/buffer-drain-claims.js +2 -2
  272. package/dist/storage/buffer-session-files.js +2 -2
  273. package/dist/storage.js +23 -23
  274. package/dist/summarizer.js +3 -3
  275. package/dist/support-passport/index.js +75 -74
  276. package/dist/tokens.js +3 -3
  277. package/dist/transfer/backup.js +2 -2
  278. package/dist/transfer/capsule-export.js +2 -2
  279. package/dist/transfer/capsule-import.js +2 -2
  280. package/dist/transfer/export-okf.js +22 -22
  281. package/dist/verified-recall.js +22 -22
  282. package/dist/who-knows-cli.js +24 -24
  283. package/dist/who-knows.js +23 -23
  284. package/package.json +2 -2
  285. package/src/access-boundary.ts +15 -0
  286. package/src/access-errors.ts +22 -0
  287. package/src/access-fleet-wide-work-peer.test.ts +236 -0
  288. package/src/access-http-peer-fleet-wide.test.ts +192 -0
  289. package/src/access-http.test.ts +249 -4
  290. package/src/access-http.ts +114 -39
  291. package/src/access-mcp.test.ts +64 -0
  292. package/src/access-mcp.ts +17 -7
  293. package/src/access-observe-replay-durability.test.ts +40 -4
  294. package/src/access-operations-batch.ts +23 -12
  295. package/src/access-proto-injection.test.ts +340 -0
  296. package/src/access-schema.ts +31 -5
  297. package/src/access-service-capsule-import.test.ts +235 -0
  298. package/src/access-service.ts +6 -45
  299. package/src/briefing-deadline.ts +5 -4
  300. package/src/buffer-admission.ts +45 -0
  301. package/src/buffer-eviction-backpressure.test.ts +211 -0
  302. package/src/buffer-eviction.ts +8 -14
  303. package/src/buffer-incremental-persistence.test.ts +25 -37
  304. package/src/buffer-session.test.ts +32 -16
  305. package/src/buffer-turn-helpers.ts +41 -0
  306. package/src/buffer-types.ts +28 -1
  307. package/src/buffer.ts +77 -85
  308. package/src/capsule-import-gate.ts +109 -0
  309. package/src/extraction-quote-grounding.test.ts +76 -0
  310. package/src/extraction-quote-grounding.ts +49 -13
  311. package/src/extraction-source-grounding-rules.ts +6 -1
  312. package/src/extraction-source-grounding.ts +2 -0
  313. package/src/extraction.ts +3 -4
  314. package/src/namespaces/search.test.ts +141 -1
  315. package/src/namespaces/search.ts +39 -9
  316. package/src/orchestration/turn-ingestion.ts +38 -39
  317. package/src/recall-navigation-operations.ts +9 -2
  318. package/src/source-agent-qualifier.ts +3 -0
  319. package/dist/chunk-BLGQUZFB.js.map +0 -1
  320. package/dist/chunk-CMRHXPLQ.js.map +0 -1
  321. package/dist/chunk-DM4RRTN7.js.map +0 -1
  322. package/dist/chunk-FRM4UTDR.js.map +0 -1
  323. package/dist/chunk-GKYIRTNX.js.map +0 -1
  324. package/dist/chunk-GYNRNKMW.js.map +0 -1
  325. package/dist/chunk-H34INI3P.js.map +0 -1
  326. package/dist/chunk-HVFX2N2G.js.map +0 -1
  327. package/dist/chunk-KASJJGRG.js.map +0 -1
  328. package/dist/chunk-LGEH473S.js.map +0 -1
  329. package/dist/chunk-P225W4RQ.js.map +0 -1
  330. package/dist/chunk-SGHV6LZ7.js.map +0 -1
  331. package/dist/chunk-X2KO4FK5.js.map +0 -1
  332. package/dist/chunk-X7REO4CH.js.map +0 -1
  333. package/dist/chunk-XSFQN7TP.js.map +0 -1
  334. /package/dist/{capsule-crypto-GWVG7LGC.js.map → buffer-admission.js.map} +0 -0
  335. /package/dist/{chunk-73YVMZ7D.js.map → chunk-2G4TV2ML.js.map} +0 -0
  336. /package/dist/{chunk-BMIM6ESC.js.map → chunk-2JG2NI7C.js.map} +0 -0
  337. /package/dist/{chunk-IR4C3DP2.js.map → chunk-2K3AUDH7.js.map} +0 -0
  338. /package/dist/{chunk-6KFFRMPQ.js.map → chunk-2N4OUSIA.js.map} +0 -0
  339. /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
  340. /package/dist/{chunk-44FQCC5D.js.map → chunk-2NUDHVYM.js.map} +0 -0
  341. /package/dist/{chunk-FK4WC6VK.js.map → chunk-2U4LMSEX.js.map} +0 -0
  342. /package/dist/{chunk-LT3CMO65.js.map → chunk-2XOFVTTT.js.map} +0 -0
  343. /package/dist/{chunk-I6ORDT54.js.map → chunk-32CA7B6L.js.map} +0 -0
  344. /package/dist/{chunk-TQVECGUQ.js.map → chunk-32YX7EJ3.js.map} +0 -0
  345. /package/dist/{chunk-HLWXCDUQ.js.map → chunk-3DAWHP5K.js.map} +0 -0
  346. /package/dist/{chunk-GBOYOL5L.js.map → chunk-3PJEDHLD.js.map} +0 -0
  347. /package/dist/{chunk-ZWTHVUT5.js.map → chunk-3UZ2VMKD.js.map} +0 -0
  348. /package/dist/{chunk-2XYDL2FG.js.map → chunk-3Y5X6YFH.js.map} +0 -0
  349. /package/dist/{chunk-23B4HLWG.js.map → chunk-4GMI5HFH.js.map} +0 -0
  350. /package/dist/{chunk-AP3TSV6S.js.map → chunk-4LCVA2LW.js.map} +0 -0
  351. /package/dist/{chunk-MZCGHPIJ.js.map → chunk-4X7HQKAG.js.map} +0 -0
  352. /package/dist/{chunk-YNBMBL4C.js.map → chunk-4XYAWK5H.js.map} +0 -0
  353. /package/dist/{chunk-2JAT4S7N.js.map → chunk-5SOSQTVE.js.map} +0 -0
  354. /package/dist/{chunk-G3T6YMBO.js.map → chunk-64S6X4IU.js.map} +0 -0
  355. /package/dist/{chunk-NIV7RPWQ.js.map → chunk-6BCWFCDG.js.map} +0 -0
  356. /package/dist/{chunk-V27FK6D6.js.map → chunk-6XTUZKCZ.js.map} +0 -0
  357. /package/dist/{chunk-2ASEDFOA.js.map → chunk-73UZZFJC.js.map} +0 -0
  358. /package/dist/{chunk-UHPHH74F.js.map → chunk-77PDJ4OE.js.map} +0 -0
  359. /package/dist/{chunk-BATPQNRG.js.map → chunk-7GSL4LBG.js.map} +0 -0
  360. /package/dist/{chunk-B6SPPYGJ.js.map → chunk-7IWRLYFJ.js.map} +0 -0
  361. /package/dist/{chunk-BUKK5SWA.js.map → chunk-7LCGFUMB.js.map} +0 -0
  362. /package/dist/{chunk-ZXF3O7P4.js.map → chunk-ARRTLPRC.js.map} +0 -0
  363. /package/dist/{chunk-S5CQI2KF.js.map → chunk-B3GKQ6DU.js.map} +0 -0
  364. /package/dist/{chunk-2URKYLMK.js.map → chunk-B56LORLY.js.map} +0 -0
  365. /package/dist/{chunk-4IWEPQEV.js.map → chunk-BIVKPQ6Q.js.map} +0 -0
  366. /package/dist/{chunk-4DPLCYEK.js.map → chunk-C2HORX76.js.map} +0 -0
  367. /package/dist/{chunk-ELWI2R6H.js.map → chunk-CC4V7HNP.js.map} +0 -0
  368. /package/dist/{chunk-WFDWLWDK.js.map → chunk-CN7Q3T2J.js.map} +0 -0
  369. /package/dist/{chunk-GJVGFKOU.js.map → chunk-CYCEROPR.js.map} +0 -0
  370. /package/dist/{chunk-CCU7URRP.js.map → chunk-D5EV6Y2L.js.map} +0 -0
  371. /package/dist/{chunk-N6II66E5.js.map → chunk-DT7SNJH6.js.map} +0 -0
  372. /package/dist/{chunk-MVOJDLXS.js.map → chunk-EA2LA5RI.js.map} +0 -0
  373. /package/dist/{chunk-WBN66HPI.js.map → chunk-ELHJK7LM.js.map} +0 -0
  374. /package/dist/{chunk-ONN2E5QD.js.map → chunk-EUBDYOLD.js.map} +0 -0
  375. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  376. /package/dist/{chunk-3LHPTBWG.js.map → chunk-F74G4KIH.js.map} +0 -0
  377. /package/dist/{chunk-MYCCO6AA.js.map → chunk-G54BOKZ6.js.map} +0 -0
  378. /package/dist/{chunk-JFH6JAGY.js.map → chunk-G67EUQAB.js.map} +0 -0
  379. /package/dist/{chunk-TV65NR7L.js.map → chunk-GULUWOA5.js.map} +0 -0
  380. /package/dist/{chunk-6DANGCMO.js.map → chunk-HFUKXOUW.js.map} +0 -0
  381. /package/dist/{chunk-Y3IYKNBY.js.map → chunk-HLN2HOXX.js.map} +0 -0
  382. /package/dist/{chunk-Y43X3E24.js.map → chunk-IBDWYRDR.js.map} +0 -0
  383. /package/dist/{chunk-AJG2TAMR.js.map → chunk-IEEV27BC.js.map} +0 -0
  384. /package/dist/{chunk-FZPDRCOB.js.map → chunk-IJ3OEECW.js.map} +0 -0
  385. /package/dist/{chunk-D6THW7PA.js.map → chunk-IPD5GC7C.js.map} +0 -0
  386. /package/dist/{chunk-VCVEMQJK.js.map → chunk-JM2YZKCQ.js.map} +0 -0
  387. /package/dist/{chunk-OSTFDWZJ.js.map → chunk-NIVKG3DS.js.map} +0 -0
  388. /package/dist/{chunk-VZELUMKK.js.map → chunk-NQP4ZYGG.js.map} +0 -0
  389. /package/dist/{chunk-3ODZLCHC.js.map → chunk-NT7F7WJQ.js.map} +0 -0
  390. /package/dist/{chunk-YO2JEX2Z.js.map → chunk-OGBQMY46.js.map} +0 -0
  391. /package/dist/{chunk-O55AGDTI.js.map → chunk-OL553AWT.js.map} +0 -0
  392. /package/dist/{chunk-CLVILSBR.js.map → chunk-OZNBZJ3S.js.map} +0 -0
  393. /package/dist/{chunk-RNGDKFY2.js.map → chunk-P452SEKO.js.map} +0 -0
  394. /package/dist/{chunk-JX3E4XCW.js.map → chunk-PDOOUXCS.js.map} +0 -0
  395. /package/dist/{chunk-V45TEVDA.js.map → chunk-PKZ274PI.js.map} +0 -0
  396. /package/dist/{chunk-MNYQVYJ4.js.map → chunk-QD5R6U5J.js.map} +0 -0
  397. /package/dist/{chunk-DI5ET2IE.js.map → chunk-QEZ3DW5O.js.map} +0 -0
  398. /package/dist/{chunk-WYPCJK6K.js.map → chunk-QKERFEJS.js.map} +0 -0
  399. /package/dist/{chunk-BLMTOIBK.js.map → chunk-QKES7GU6.js.map} +0 -0
  400. /package/dist/{chunk-PCQWKMOL.js.map → chunk-QNSZYTSG.js.map} +0 -0
  401. /package/dist/{chunk-MHSBOEH7.js.map → chunk-ROKDHO74.js.map} +0 -0
  402. /package/dist/{chunk-3VU2FDTU.js.map → chunk-SYKJBS7S.js.map} +0 -0
  403. /package/dist/{chunk-5BE3FLKL.js.map → chunk-TAUHAP5J.js.map} +0 -0
  404. /package/dist/{chunk-QCP75JGO.js.map → chunk-TFA6HPOA.js.map} +0 -0
  405. /package/dist/{chunk-E7V5AK7I.js.map → chunk-TRMZHGIX.js.map} +0 -0
  406. /package/dist/{chunk-WBDIZWJQ.js.map → chunk-TSS3D7ZY.js.map} +0 -0
  407. /package/dist/{chunk-OMYRPMQC.js.map → chunk-US7KPQA5.js.map} +0 -0
  408. /package/dist/{chunk-KHZVAISH.js.map → chunk-UWRHHRDK.js.map} +0 -0
  409. /package/dist/{chunk-SDESKFKT.js.map → chunk-UYHDMCY2.js.map} +0 -0
  410. /package/dist/{chunk-YAAKVTZA.js.map → chunk-VKILERSL.js.map} +0 -0
  411. /package/dist/{chunk-2TGIKMMZ.js.map → chunk-WXDTOE6F.js.map} +0 -0
  412. /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
  413. /package/dist/{chunk-QA3Y2O6H.js.map → chunk-YAVIBVCU.js.map} +0 -0
  414. /package/dist/{chunk-E5QEF3JO.js.map → chunk-YRZPBN46.js.map} +0 -0
  415. /package/dist/{chunk-FMFCQRDM.js.map → chunk-ZANNIXXE.js.map} +0 -0
  416. /package/dist/{chunk-3KGCHTTK.js.map → chunk-ZBFLV657.js.map} +0 -0
  417. /package/dist/{chunk-VEFGHRKV.js.map → chunk-ZOJUWVAU.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/extraction-quote-grounding.ts"],"sourcesContent":["/**\n * Quote-anchored source grounding.\n *\n * An extracted fact carries the exact words that support it in `quote`. A quote\n * that is a verbatim substring of the source (whitespace-normalized) is real\n * evidence: the claim only has to be supported by the text around that span,\n * not by word overlap against the whole conversation. Items without such a\n * quote never get an anchor here and stay on the whole-source rules.\n */\n\nimport type { ExtractionResult } from \"./types.js\";\nimport {\n GROUNDING_MIN_SHARED_TOKENS,\n areGroundingTokensCompatible,\n entityNameStart,\n hasDenialReporting,\n hasNonAssertiveReporting,\n isGroundedEntityName,\n normalizedEntityIdentifierTokens,\n sourceSentences,\n tokenize,\n} from \"./extraction-source-grounding-helpers.js\";\n\n/** Shortest normalized quote that counts as evidence; \"the\" or \"I\" prove nothing. */\nexport const QUOTE_ANCHOR_MIN_CHARS = 12;\n/** Characters of context kept on each side of the quote inside its turn. */\nexport const QUOTE_ANCHOR_CONTEXT_CHARS = 400;\n/** Share of a claim's content words that must occur in the quote's window. */\nexport const QUOTE_ANCHOR_MIN_WINDOW_COVERAGE = 0.35;\n/** Share of a claim's content words that must occur anywhere in the source; the rest is invented. */\nexport const QUOTE_ANCHOR_MIN_SOURCE_COVERAGE = 0.75;\nconst QUOTE_ANCHOR_MAX_OCCURRENCES = 8;\nconst TURN_SEPARATOR = \"\\n\\n\";\nconst NEGATOR_PATTERN = /\\b(?:not|no|never|cannot|without|neither|nor)\\b|n't\\b/iu;\nconst EXCLUSION_PATTERN =\n /\\b(?:exclu\\w*|avoid\\w*|omit\\w*|skip\\w*|ignor\\w*|forbid\\w*|prohibit\\w*|disallow\\w*|prevent\\w*|reject\\w*|refus\\w*|insufficient|instead|rather|unless|except)\\b/iu;\n\n/** A verbatim quote and the text around it inside its turn. */\nexport interface QuoteAnchor {\n /** Whitespace-normalized quote, exactly as it appears in the source. */\n quote: string;\n /** `quote` with its turn-local context; `;` inside the quote is rewritten to `,`. */\n window: string;\n}\n\nexport type TokenPool = (token: string) => boolean;\n\ntype Entity = ExtractionResult[\"entities\"][number];\ntype Relationship = NonNullable<ExtractionResult[\"relationships\"]>[number];\n\nfunction normalizeWhitespaceWithMap(source: string): { text: string; originalIndex: number[] } {\n const chars: string[] = [];\n const originalIndex: number[] = [];\n let inSpace = false;\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index]!;\n if (/\\s/u.test(char)) {\n if (inSpace) continue;\n inSpace = true;\n chars.push(\" \");\n } else {\n inSpace = false;\n chars.push(char);\n }\n originalIndex.push(index);\n }\n return { text: chars.join(\"\"), originalIndex };\n}\n\nfunction turnStartOffsets(source: string, turns: readonly string[]): readonly number[] | undefined {\n const offsets: number[] = [];\n let at = 0;\n for (const turn of turns) {\n if (!source.startsWith(turn, at)) return undefined;\n offsets.push(at);\n at += turn.length + TURN_SEPARATOR.length;\n }\n return at - TURN_SEPARATOR.length === source.length ? offsets : undefined;\n}\n\nfunction findQuoteAnchors(quote: string, source: string, bounds?: readonly number[]): QuoteAnchor[] {\n const needle = quote.replace(/\\s+/gu, \" \").trim();\n if (needle.length < QUOTE_ANCHOR_MIN_CHARS) return [];\n const normalized = normalizeWhitespaceWithMap(source);\n const anchors: QuoteAnchor[] = [];\n let from = 0;\n while (anchors.length < QUOTE_ANCHOR_MAX_OCCURRENCES) {\n const at = normalized.text.indexOf(needle, from);\n if (at < 0) break;\n from = at + 1;\n const start = normalized.originalIndex[at]!;\n const end = normalized.originalIndex[at + needle.length - 1]! + 1;\n\n let before: string;\n let after: string;\n if (bounds === undefined) {\n if (source.slice(start, end).includes(TURN_SEPARATOR)) continue;\n before = source.slice(Math.max(0, start - QUOTE_ANCHOR_CONTEXT_CHARS), start);\n const sepBefore = before.lastIndexOf(TURN_SEPARATOR);\n if (sepBefore >= 0) before = before.slice(sepBefore + TURN_SEPARATOR.length);\n else if (start > QUOTE_ANCHOR_CONTEXT_CHARS) before = before.replace(/^\\S+/u, \"\");\n after = source.slice(end, end + QUOTE_ANCHOR_CONTEXT_CHARS);\n const sepAfter = after.indexOf(TURN_SEPARATOR);\n if (sepAfter >= 0) after = after.slice(0, sepAfter);\n else if (source.length - end > QUOTE_ANCHOR_CONTEXT_CHARS) after = after.replace(/\\S+$/u, \"\");\n } else {\n let turnStart = 0;\n let turnEnd = source.length;\n for (const bound of bounds) {\n if (bound <= start) turnStart = bound;\n else {\n turnEnd = bound - TURN_SEPARATOR.length;\n break;\n }\n }\n if (turnEnd < end) continue;\n before = source.slice(Math.max(turnStart, start - QUOTE_ANCHOR_CONTEXT_CHARS), start);\n if (start - QUOTE_ANCHOR_CONTEXT_CHARS > turnStart) before = before.replace(/^\\S+/u, \"\");\n const contextEnd = Math.min(turnEnd, end + QUOTE_ANCHOR_CONTEXT_CHARS);\n after = source.slice(end, contextEnd);\n if (end + QUOTE_ANCHOR_CONTEXT_CHARS < turnEnd) after = after.replace(/\\S+$/u, \"\");\n }\n\n anchors.push({ quote: needle, window: `${before}${needle.replace(/;/gu, \",\")}${after}` });\n }\n return anchors;\n}\n\n/**\n * Returns one anchor per place `quote` occurs verbatim in `source`, or [] when\n * the quote is absent, too short, or not an exact substring. A quote that\n * spans a turn separator is not one turn's words and yields no anchor; windows\n * never extend past their turn.\n *\n * The quote is one evidence unit: a `;` inside it is rewritten to `,` in the\n * window so sentence splitting cannot cut it, or a claim that merges two of\n * its clauses could never be grounded in a single sentence.\n *\n * `source` may have been rewritten before grounding (temporal anchoring,\n * pronoun resolution) while the model quoted the original words. When the raw\n * quote is not found, `transformQuote` applies the same rewrite to the quote.\n *\n * `turns` are the texts `source` was joined from; when they tile `source`\n * exactly, quotes and windows cut at real turn boundaries instead of any\n * blank line. Without them, every `TURN_SEPARATOR` run is a boundary.\n */\nexport function quoteAnchors(\n quote: string | undefined,\n source: string,\n transformQuote?: (quote: string) => string,\n turns?: readonly string[],\n): QuoteAnchor[] {\n if (typeof quote !== \"string\") return [];\n const bounds = turns === undefined ? undefined : turnStartOffsets(source, turns);\n const exact = findQuoteAnchors(quote, source, bounds);\n if (exact.length > 0 || transformQuote === undefined) return exact;\n return findQuoteAnchors(transformQuote(quote), source, bounds);\n}\n\nexport function tokenPool(tokens: ReadonlySet<string>): TokenPool {\n const list = [...tokens];\n return (token) => tokens.has(token) || list.some((poolToken) => areGroundingTokensCompatible(token, poolToken));\n}\n\nfunction hasNegation(text: string): boolean {\n return NEGATOR_PATTERN.test(text.replace(/[\\u2018\\u2019]/gu, \"'\")) || hasDenialReporting(text);\n}\n\nconst CLAUSE_PATTERN = /[^;.!?\\n]+[;.!?]*/gu;\n/** Split \"X, and Y\" claim coordination without touching list commas. */\nconst CLAIM_COORD_SPLIT = /,\\s{1,8}(?:and|but|or|nor)\\s{1,8}/iu;\n\nfunction splitClaimClauses(content: string): string[] {\n return (content.match(CLAUSE_PATTERN) ?? [content]).flatMap((clause) => {\n const parts = clause\n .split(CLAIM_COORD_SPLIT)\n .map((part) => part.trim())\n .filter((part) => part.length > 0);\n return parts.length > 0 ? parts : [clause];\n });\n}\n\nfunction clauseOverlap(clauseTokens: readonly string[], target: string) {\n const has = tokenPool(tokenize(target));\n const shared = clauseTokens.filter(has).length;\n return { shared, ratio: clauseTokens.length === 0 ? 0 : shared / clauseTokens.length };\n}\n\n/** What a quote clause's first negator governs: the words after it. */\nfunction negatedScope(clause: string): string {\n const match = NEGATOR_PATTERN.exec(clause.replace(/[\\u2018\\u2019]/gu, \"'\"));\n return match ? clause.slice(match.index + match[0].length) : clause;\n}\n\n/**\n * True when the claim asserts what a quote clause denies or does not assert:\n * \"did not approve the budget\" or \"denied approving it\" restated as \"approved\n * the budget\", \"suspects Bob stole funds\" or \"Is Alice the CEO?\" restated as a\n * plain statement. The claim must restate the quote clause, and none of its\n * clauses that share a word with what the negator governs may keep the\n * negator, exclusion word, or reporting marker (\"do not X\" reworded as \"X is\n * excluded\", or \"Alice reviewed it, but she did not approve it\"). A negator in\n * a clause about something else does not count, so a claim that keeps one\n * quote negation can still misstate another quote clause, and a claim clause\n * that shares only the subject does not satisfy the check.\n */\nfunction misstatesQuote(content: string, quote: string): boolean {\n const claimClauses = splitClaimClauses(content);\n return (quote.match(CLAUSE_PATTERN) ?? []).some((quoteClause) => {\n const needsNegation = hasNegation(quoteClause);\n const needsReporting = quoteClause.trim().endsWith(\"?\") || hasNonAssertiveReporting(quoteClause);\n if (!needsNegation && !needsReporting) return false;\n const clauseTokens = [...tokenize(quoteClause)];\n const whole = clauseOverlap(clauseTokens, content);\n if (whole.shared < GROUNDING_MIN_SHARED_TOKENS || whole.ratio < 0.5) return false;\n const clausesSharing = (tokens: readonly string[]) =>\n claimClauses.filter((claimClause) => clauseOverlap(tokens, claimClause).shared > 0);\n if (needsNegation) {\n const scopeTokens = [...tokenize(negatedScope(quoteClause))];\n const related = clausesSharing(scopeTokens.length > 0 ? scopeTokens : clauseTokens);\n if (!related.some((text) => hasNegation(text) || EXCLUSION_PATTERN.test(text))) return true;\n }\n return needsReporting\n && !clausesSharing(clauseTokens).some((text) => hasNonAssertiveReporting(text) || text.trim().endsWith(\"?\"));\n });\n}\n\n/**\n * A claim is supported by a verbatim quote when it shares at least\n * GROUNDING_MIN_SHARED_TOKENS content words with the quote, a good part of its\n * words sit in the text around the quote, nearly all of them occur in the\n * source at all, and it does not invert a negated clause of the quote. Reworded\n * and lightly elaborated claims pass; claims that bring words the conversation\n * never used, or that have nothing to do with the quote, do not.\n */\nexport function isQuoteAnchoredClaim(content: string, anchor: QuoteAnchor, sourceHas: TokenPool): boolean {\n const contentTokens = [...tokenize(content)];\n if (contentTokens.length === 0) return false;\n const quoteHas = tokenPool(tokenize(anchor.quote));\n if (contentTokens.filter(quoteHas).length < GROUNDING_MIN_SHARED_TOKENS) return false;\n const windowHas = tokenPool(tokenize(anchor.window));\n if (contentTokens.filter(windowHas).length / contentTokens.length < QUOTE_ANCHOR_MIN_WINDOW_COVERAGE) {\n return false;\n }\n return contentTokens.filter(sourceHas).length / contentTokens.length >= QUOTE_ANCHOR_MIN_SOURCE_COVERAGE\n && !misstatesQuote(content, anchor.quote);\n}\n\n/** Keeps the entity facts (flat and sectioned) `isSupported` accepts; undefined when none remain. */\nexport function filterEntityFacts(entity: Entity, isSupported: (fact: string) => boolean): Entity | undefined {\n const facts = entity.facts.filter(isSupported);\n const structuredSections = entity.structuredSections?.flatMap((section) => {\n const groundedFacts = section.facts.filter(isSupported);\n return groundedFacts.length > 0 ? [{ ...section, facts: groundedFacts }] : [];\n });\n if (facts.length === 0 && (structuredSections === undefined || structuredSections.length === 0)) {\n return undefined;\n }\n const { structuredSections: _structuredSections, ...entityWithoutSections } = entity;\n return {\n ...entityWithoutSections,\n facts,\n ...(structuredSections && structuredSections.length > 0 ? { structuredSections } : {}),\n };\n}\n\n/**\n * Entities carry no quote of their own; the anchors of facts that kept support\n * them. Returns a fact predicate, or undefined when no anchor window names the entity.\n */\nexport function quoteAnchoredEntitySupport(\n entity: Entity,\n anchors: readonly QuoteAnchor[],\n sourceHas: TokenPool,\n): ((fact: string) => boolean) | undefined {\n const nameAnchors = anchors.filter((anchor) => isGroundedEntityName(entity.name, anchor.window));\n if (nameAnchors.length === 0) return undefined;\n return (fact) => nameAnchors.some((anchor) => isQuoteAnchoredClaim(fact, anchor, sourceHas));\n}\n\n/**\n * The label words and both names must sit in one anchor-window sentence, source\n * before target, so an invented label or a reversed edge never passes.\n */\nexport function isQuoteAnchoredRelationship(\n relationship: Relationship,\n anchors: readonly QuoteAnchor[],\n sourceHas: TokenPool,\n): boolean {\n const labelTokens = [...tokenize(relationship.label)];\n if (labelTokens.length === 0) return false;\n const relationText = [\n normalizedEntityIdentifierTokens(relationship.source).join(\" \"),\n relationship.label,\n normalizedEntityIdentifierTokens(relationship.target).join(\" \"),\n ].join(\" \");\n return anchors.some((anchor) => {\n const windowHas = tokenPool(tokenize(anchor.window));\n return labelTokens.every(windowHas)\n && sourceSentences(anchor.window).some((sentence) => {\n const sourceStart = entityNameStart(relationship.source, sentence);\n return sourceStart >= 0 && entityNameStart(relationship.target, sentence) > sourceStart;\n })\n && isQuoteAnchoredClaim(relationText, anchor, sourceHas);\n });\n}\n"],"mappings":";;;;;;;;;;;;;AAwBO,IAAM,yBAAyB;AAE/B,IAAM,6BAA6B;AAEnC,IAAM,mCAAmC;AAEzC,IAAM,mCAAmC;AAChD,IAAM,+BAA+B;AACrC,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,oBACJ;AAeF,SAAS,2BAA2B,QAA2D;AAC7F,QAAM,QAAkB,CAAC;AACzB,QAAM,gBAA0B,CAAC;AACjC,MAAI,UAAU;AACd,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,UAAM,OAAO,OAAO,KAAK;AACzB,QAAI,MAAM,KAAK,IAAI,GAAG;AACpB,UAAI,QAAS;AACb,gBAAU;AACV,YAAM,KAAK,GAAG;AAAA,IAChB,OAAO;AACL,gBAAU;AACV,YAAM,KAAK,IAAI;AAAA,IACjB;AACA,kBAAc,KAAK,KAAK;AAAA,EAC1B;AACA,SAAO,EAAE,MAAM,MAAM,KAAK,EAAE,GAAG,cAAc;AAC/C;AAEA,SAAS,iBAAiB,QAAgB,OAAyD;AACjG,QAAM,UAAoB,CAAC;AAC3B,MAAI,KAAK;AACT,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,OAAO,WAAW,MAAM,EAAE,EAAG,QAAO;AACzC,YAAQ,KAAK,EAAE;AACf,UAAM,KAAK,SAAS,eAAe;AAAA,EACrC;AACA,SAAO,KAAK,eAAe,WAAW,OAAO,SAAS,UAAU;AAClE;AAEA,SAAS,iBAAiB,OAAe,QAAgB,QAA2C;AAClG,QAAM,SAAS,MAAM,QAAQ,SAAS,GAAG,EAAE,KAAK;AAChD,MAAI,OAAO,SAAS,uBAAwB,QAAO,CAAC;AACpD,QAAM,aAAa,2BAA2B,MAAM;AACpD,QAAM,UAAyB,CAAC;AAChC,MAAI,OAAO;AACX,SAAO,QAAQ,SAAS,8BAA8B;AACpD,UAAM,KAAK,WAAW,KAAK,QAAQ,QAAQ,IAAI;AAC/C,QAAI,KAAK,EAAG;AACZ,WAAO,KAAK;AACZ,UAAM,QAAQ,WAAW,cAAc,EAAE;AACzC,UAAM,MAAM,WAAW,cAAc,KAAK,OAAO,SAAS,CAAC,IAAK;AAEhE,QAAI;AACJ,QAAI;AACJ,QAAI,WAAW,QAAW;AACxB,UAAI,OAAO,MAAM,OAAO,GAAG,EAAE,SAAS,cAAc,EAAG;AACvD,eAAS,OAAO,MAAM,KAAK,IAAI,GAAG,QAAQ,0BAA0B,GAAG,KAAK;AAC5E,YAAM,YAAY,OAAO,YAAY,cAAc;AACnD,UAAI,aAAa,EAAG,UAAS,OAAO,MAAM,YAAY,eAAe,MAAM;AAAA,eAClE,QAAQ,2BAA4B,UAAS,OAAO,QAAQ,SAAS,EAAE;AAChF,cAAQ,OAAO,MAAM,KAAK,MAAM,0BAA0B;AAC1D,YAAM,WAAW,MAAM,QAAQ,cAAc;AAC7C,UAAI,YAAY,EAAG,SAAQ,MAAM,MAAM,GAAG,QAAQ;AAAA,eACzC,OAAO,SAAS,MAAM,2BAA4B,SAAQ,MAAM,QAAQ,SAAS,EAAE;AAAA,IAC9F,OAAO;AACL,UAAI,YAAY;AAChB,UAAI,UAAU,OAAO;AACrB,iBAAW,SAAS,QAAQ;AAC1B,YAAI,SAAS,MAAO,aAAY;AAAA,aAC3B;AACH,oBAAU,QAAQ,eAAe;AACjC;AAAA,QACF;AAAA,MACF;AACA,UAAI,UAAU,IAAK;AACnB,eAAS,OAAO,MAAM,KAAK,IAAI,WAAW,QAAQ,0BAA0B,GAAG,KAAK;AACpF,UAAI,QAAQ,6BAA6B,UAAW,UAAS,OAAO,QAAQ,SAAS,EAAE;AACvF,YAAM,aAAa,KAAK,IAAI,SAAS,MAAM,0BAA0B;AACrE,cAAQ,OAAO,MAAM,KAAK,UAAU;AACpC,UAAI,MAAM,6BAA6B,QAAS,SAAQ,MAAM,QAAQ,SAAS,EAAE;AAAA,IACnF;AAEA,YAAQ,KAAK,EAAE,OAAO,QAAQ,QAAQ,GAAG,MAAM,GAAG,OAAO,QAAQ,OAAO,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC;AAAA,EAC1F;AACA,SAAO;AACT;AAoBO,SAAS,aACd,OACA,QACA,gBACA,OACe;AACf,MAAI,OAAO,UAAU,SAAU,QAAO,CAAC;AACvC,QAAM,SAAS,UAAU,SAAY,SAAY,iBAAiB,QAAQ,KAAK;AAC/E,QAAM,QAAQ,iBAAiB,OAAO,QAAQ,MAAM;AACpD,MAAI,MAAM,SAAS,KAAK,mBAAmB,OAAW,QAAO;AAC7D,SAAO,iBAAiB,eAAe,KAAK,GAAG,QAAQ,MAAM;AAC/D;AAEO,SAAS,UAAU,QAAwC;AAChE,QAAM,OAAO,CAAC,GAAG,MAAM;AACvB,SAAO,CAAC,UAAU,OAAO,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC,cAAc,6BAA6B,OAAO,SAAS,CAAC;AAChH;AAEA,SAAS,YAAY,MAAuB;AAC1C,SAAO,gBAAgB,KAAK,KAAK,QAAQ,oBAAoB,GAAG,CAAC,KAAK,mBAAmB,IAAI;AAC/F;AAEA,IAAM,iBAAiB;AAEvB,IAAM,oBAAoB;AAE1B,SAAS,kBAAkB,SAA2B;AACpD,UAAQ,QAAQ,MAAM,cAAc,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC,WAAW;AACtE,UAAM,QAAQ,OACX,MAAM,iBAAiB,EACvB,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,WAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,MAAM;AAAA,EAC3C,CAAC;AACH;AAEA,SAAS,cAAc,cAAiC,QAAgB;AACtE,QAAM,MAAM,UAAU,SAAS,MAAM,CAAC;AACtC,QAAM,SAAS,aAAa,OAAO,GAAG,EAAE;AACxC,SAAO,EAAE,QAAQ,OAAO,aAAa,WAAW,IAAI,IAAI,SAAS,aAAa,OAAO;AACvF;AAGA,SAAS,aAAa,QAAwB;AAC5C,QAAM,QAAQ,gBAAgB,KAAK,OAAO,QAAQ,oBAAoB,GAAG,CAAC;AAC1E,SAAO,QAAQ,OAAO,MAAM,MAAM,QAAQ,MAAM,CAAC,EAAE,MAAM,IAAI;AAC/D;AAcA,SAAS,eAAe,SAAiB,OAAwB;AAC/D,QAAM,eAAe,kBAAkB,OAAO;AAC9C,UAAQ,MAAM,MAAM,cAAc,KAAK,CAAC,GAAG,KAAK,CAAC,gBAAgB;AAC/D,UAAM,gBAAgB,YAAY,WAAW;AAC7C,UAAM,iBAAiB,YAAY,KAAK,EAAE,SAAS,GAAG,KAAK,yBAAyB,WAAW;AAC/F,QAAI,CAAC,iBAAiB,CAAC,eAAgB,QAAO;AAC9C,UAAM,eAAe,CAAC,GAAG,SAAS,WAAW,CAAC;AAC9C,UAAM,QAAQ,cAAc,cAAc,OAAO;AACjD,QAAI,MAAM,SAAS,+BAA+B,MAAM,QAAQ,IAAK,QAAO;AAC5E,UAAM,iBAAiB,CAAC,WACtB,aAAa,OAAO,CAAC,gBAAgB,cAAc,QAAQ,WAAW,EAAE,SAAS,CAAC;AACpF,QAAI,eAAe;AACjB,YAAM,cAAc,CAAC,GAAG,SAAS,aAAa,WAAW,CAAC,CAAC;AAC3D,YAAM,UAAU,eAAe,YAAY,SAAS,IAAI,cAAc,YAAY;AAClF,UAAI,CAAC,QAAQ,KAAK,CAAC,SAAS,YAAY,IAAI,KAAK,kBAAkB,KAAK,IAAI,CAAC,EAAG,QAAO;AAAA,IACzF;AACA,WAAO,kBACF,CAAC,eAAe,YAAY,EAAE,KAAK,CAAC,SAAS,yBAAyB,IAAI,KAAK,KAAK,KAAK,EAAE,SAAS,GAAG,CAAC;AAAA,EAC/G,CAAC;AACH;AAUO,SAAS,qBAAqB,SAAiB,QAAqB,WAA+B;AACxG,QAAM,gBAAgB,CAAC,GAAG,SAAS,OAAO,CAAC;AAC3C,MAAI,cAAc,WAAW,EAAG,QAAO;AACvC,QAAM,WAAW,UAAU,SAAS,OAAO,KAAK,CAAC;AACjD,MAAI,cAAc,OAAO,QAAQ,EAAE,SAAS,4BAA6B,QAAO;AAChF,QAAM,YAAY,UAAU,SAAS,OAAO,MAAM,CAAC;AACnD,MAAI,cAAc,OAAO,SAAS,EAAE,SAAS,cAAc,SAAS,kCAAkC;AACpG,WAAO;AAAA,EACT;AACA,SAAO,cAAc,OAAO,SAAS,EAAE,SAAS,cAAc,UAAU,oCACnE,CAAC,eAAe,SAAS,OAAO,KAAK;AAC5C;AAGO,SAAS,kBAAkB,QAAgB,aAA4D;AAC5G,QAAM,QAAQ,OAAO,MAAM,OAAO,WAAW;AAC7C,QAAM,qBAAqB,OAAO,oBAAoB,QAAQ,CAAC,YAAY;AACzE,UAAM,gBAAgB,QAAQ,MAAM,OAAO,WAAW;AACtD,WAAO,cAAc,SAAS,IAAI,CAAC,EAAE,GAAG,SAAS,OAAO,cAAc,CAAC,IAAI,CAAC;AAAA,EAC9E,CAAC;AACD,MAAI,MAAM,WAAW,MAAM,uBAAuB,UAAa,mBAAmB,WAAW,IAAI;AAC/F,WAAO;AAAA,EACT;AACA,QAAM,EAAE,oBAAoB,qBAAqB,GAAG,sBAAsB,IAAI;AAC9E,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,GAAI,sBAAsB,mBAAmB,SAAS,IAAI,EAAE,mBAAmB,IAAI,CAAC;AAAA,EACtF;AACF;AAMO,SAAS,2BACd,QACA,SACA,WACyC;AACzC,QAAM,cAAc,QAAQ,OAAO,CAAC,WAAW,qBAAqB,OAAO,MAAM,OAAO,MAAM,CAAC;AAC/F,MAAI,YAAY,WAAW,EAAG,QAAO;AACrC,SAAO,CAAC,SAAS,YAAY,KAAK,CAAC,WAAW,qBAAqB,MAAM,QAAQ,SAAS,CAAC;AAC7F;AAMO,SAAS,4BACd,cACA,SACA,WACS;AACT,QAAM,cAAc,CAAC,GAAG,SAAS,aAAa,KAAK,CAAC;AACpD,MAAI,YAAY,WAAW,EAAG,QAAO;AACrC,QAAM,eAAe;AAAA,IACnB,iCAAiC,aAAa,MAAM,EAAE,KAAK,GAAG;AAAA,IAC9D,aAAa;AAAA,IACb,iCAAiC,aAAa,MAAM,EAAE,KAAK,GAAG;AAAA,EAChE,EAAE,KAAK,GAAG;AACV,SAAO,QAAQ,KAAK,CAAC,WAAW;AAC9B,UAAM,YAAY,UAAU,SAAS,OAAO,MAAM,CAAC;AACnD,WAAO,YAAY,MAAM,SAAS,KAC7B,gBAAgB,OAAO,MAAM,EAAE,KAAK,CAAC,aAAa;AACnD,YAAM,cAAc,gBAAgB,aAAa,QAAQ,QAAQ;AACjE,aAAO,eAAe,KAAK,gBAAgB,aAAa,QAAQ,QAAQ,IAAI;AAAA,IAC9E,CAAC,KACE,qBAAqB,cAAc,QAAQ,SAAS;AAAA,EAC3D,CAAC;AACH;","names":[]}
@@ -1,25 +1,25 @@
1
1
  import {
2
2
  ExtractionDrain,
3
3
  TurnIngestionCoordinator
4
- } from "./chunk-H4D5YURJ.js";
4
+ } from "./chunk-3CTKEXXF.js";
5
5
  import {
6
6
  headerConnector,
7
7
  renderExtractionConversation,
8
8
  resolveSourceConnector
9
- } from "./chunk-DM4RRTN7.js";
9
+ } from "./chunk-BLSHFIR6.js";
10
10
  import {
11
11
  SmartBuffer
12
- } from "./chunk-SGHV6LZ7.js";
12
+ } from "./chunk-TQ4SCPGQ.js";
13
13
  import {
14
14
  shouldSkipImplicitExtraction
15
15
  } from "./chunk-MTTYIXSU.js";
16
16
  import {
17
17
  selfDeps
18
- } from "./chunk-ELWI2R6H.js";
18
+ } from "./chunk-CC4V7HNP.js";
19
19
  import {
20
20
  describeError,
21
21
  groupTurnsByExtractionScope
22
- } from "./chunk-WLNWFHX3.js";
22
+ } from "./chunk-UXXK523X.js";
23
23
  import {
24
24
  resolveMemoryLifecycleCapabilities
25
25
  } from "./chunk-C5LWPYS3.js";
@@ -449,4 +449,4 @@ export {
449
449
  ClaimBufferStorage,
450
450
  BufferDrainRunner
451
451
  };
452
- //# sourceMappingURL=chunk-ONN2E5QD.js.map
452
+ //# sourceMappingURL=chunk-EUBDYOLD.js.map
@@ -1,9 +1,9 @@
1
- import {
2
- diffGraphSnapshots
3
- } from "./chunk-AUDJPF4N.js";
4
1
  import {
5
2
  graphSnapshotFromMemoryDir
6
3
  } from "./chunk-44442YCH.js";
4
+ import {
5
+ diffGraphSnapshots
6
+ } from "./chunk-AUDJPF4N.js";
7
7
 
8
8
  // src/dashboard-runtime.ts
9
9
  import { createHash, timingSafeEqual } from "crypto";
@@ -370,4 +370,4 @@ var GraphDashboardServer = class {
370
370
  export {
371
371
  GraphDashboardServer
372
372
  };
373
- //# sourceMappingURL=chunk-YNDLCWXS.js.map
373
+ //# sourceMappingURL=chunk-EZ25VE3G.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  rebuildMemoryProjection
3
- } from "./chunk-N6II66E5.js";
3
+ } from "./chunk-DT7SNJH6.js";
4
4
 
5
5
  // src/convergence-refresh.ts
6
6
  async function refreshConvergedNamespaces(namespaces, namespaceSearchRouter, getStorage, searchEnabled) {
@@ -32,4 +32,4 @@ async function refreshConvergedNamespaces(namespaces, namespaceSearchRouter, get
32
32
  export {
33
33
  refreshConvergedNamespaces
34
34
  };
35
- //# sourceMappingURL=chunk-3LHPTBWG.js.map
35
+ //# sourceMappingURL=chunk-F74G4KIH.js.map
@@ -1,17 +1,19 @@
1
1
  import {
2
2
  defineOperation
3
- } from "./chunk-HVFX2N2G.js";
3
+ } from "./chunk-UAUV3BWS.js";
4
4
  import {
5
- EngramAccessInputError
6
- } from "./chunk-LGEH473S.js";
5
+ EngramAccessInputError,
6
+ rejectReservedArgumentKey
7
+ } from "./chunk-CJCTKL6Y.js";
7
8
 
8
9
  // src/recall-navigation-operations.ts
9
10
  import { z } from "zod";
10
11
  function stripNulls(data) {
11
12
  if (data !== null && typeof data === "object" && !Array.isArray(data)) {
12
13
  const obj = data;
13
- const cleaned = {};
14
+ const cleaned = /* @__PURE__ */ Object.create(null);
14
15
  for (const [key, value] of Object.entries(obj)) {
16
+ rejectReservedArgumentKey(key);
15
17
  if (value !== null) cleaned[key] = value;
16
18
  }
17
19
  return cleaned;
@@ -92,4 +94,4 @@ defineOperation({
92
94
  };
93
95
  }
94
96
  });
95
- //# sourceMappingURL=chunk-X7REO4CH.js.map
97
+ //# sourceMappingURL=chunk-FF3EFLUT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/recall-navigation-operations.ts"],"sourcesContent":["/**\n * Recall-navigation boundary operations (issue #1956).\n *\n * `memory_expand` / `memory_traverse` route MCP, HTTP, and CLI dispatch\n * through the shared validation + error-mapping layer (access-boundary.ts)\n * to the single `EngramAccessService.recallNavigate` implementation.\n * Sibling module so access-operations-batch.ts stays at its ceiling seam\n * (same layout as deep-recall's extraction).\n */\n\nimport { z } from \"zod\";\n\nimport { defineOperation } from \"./access-boundary.js\";\nimport { EngramAccessInputError, rejectReservedArgumentKey } from \"./access-errors.js\";\n\n/**\n * Null-prototype accumulator for cleaned request arguments, matching the\n * batch preprocessors (issue #3225 B1): a copied own `__proto__` member on a\n * plain `{}` switches the accumulator's prototype and an inherited field then\n * reaches the zod parse.\n */\nfunction stripNulls(data: unknown): unknown {\n if (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n const obj = data as Record<string, unknown>;\n const cleaned = Object.create(null);\n for (const [key, value] of Object.entries(obj)) {\n rejectReservedArgumentKey(key);\n if (value !== null) cleaned[key] = value;\n }\n return cleaned;\n }\n return data;\n}\n\nfunction strictSchema<T extends z.ZodRawShape>(shape: T): z.ZodType<Record<string, unknown>> {\n return z.preprocess(stripNulls, z.object(shape).passthrough()) as unknown as z.ZodType<Record<string, unknown>>;\n}\n\nconst str = z.string().optional();\n\nfunction optStr(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction optInt(value: unknown): number | undefined {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && Number.isFinite(Number(value))) return Number(value);\n return undefined;\n}\n\nfunction reqStr(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new EngramAccessInputError(`${field} is required`);\n }\n return value;\n}\n\nconst baseShape = {\n memoryId: z.string(),\n sessionKey: z.string(),\n namespace: str,\n};\n\ndefineOperation({\n name: \"memory_expand\",\n description: \"Re-render one already-served recall result at a deeper disclosure level (chunk → section → raw).\",\n schema: strictSchema({ ...baseShape, disclosure: z.enum([\"chunk\", \"section\", \"raw\"]).optional() }),\n handler: async (input, ctx) => {\n const disclosure = optStr(input.disclosure);\n return {\n result: await ctx.service.recallNavigate({\n action: \"expand\",\n memoryId: reqStr(input.memoryId, \"memoryId\"),\n sessionKey: reqStr(input.sessionKey, \"sessionKey\"),\n ...(disclosure === \"chunk\" || disclosure === \"section\" || disclosure === \"raw\" ? { disclosure } : {}),\n namespace: optStr(input.namespace),\n authenticatedPrincipal: ctx.authenticatedPrincipal,\n }),\n };\n },\n});\n\ndefineOperation({\n name: \"memory_traverse\",\n description:\n \"Follow typed frontmatter links from an already-served recall result; neighbors return as chunk-level summaries.\",\n schema: strictSchema({\n ...baseShape,\n relation: z\n .enum([\n \"supports\",\n \"contradicts\",\n \"elaborates\",\n \"causes\",\n \"caused_by\",\n \"supersedes\",\n \"follows\",\n \"references\",\n \"related\",\n ])\n .optional(),\n limit: z.union([z.number(), z.string()]).optional(),\n }),\n handler: async (input, ctx) => {\n const relation = optStr(input.relation);\n return {\n result: await ctx.service.recallNavigate({\n action: \"traverse\",\n memoryId: reqStr(input.memoryId, \"memoryId\"),\n sessionKey: reqStr(input.sessionKey, \"sessionKey\"),\n ...(relation !== undefined ? { relation } : {}),\n limit: optInt(input.limit),\n namespace: optStr(input.namespace),\n authenticatedPrincipal: ctx.authenticatedPrincipal,\n }),\n };\n },\n});\n"],"mappings":"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","names":[]}
@@ -0,0 +1,62 @@
1
+ import {
2
+ defaultCapsulesDir
3
+ } from "./chunk-ZY2MNJR6.js";
4
+ import {
5
+ EngramAccessInputError
6
+ } from "./chunk-CJCTKL6Y.js";
7
+
8
+ // src/capsule-import-gate.ts
9
+ import { constants as fsConstants } from "fs";
10
+ import { access, realpath, stat } from "fs/promises";
11
+ import path from "path";
12
+ import { ZodError } from "zod";
13
+ function hasFsErrorCode(cause, code) {
14
+ return cause instanceof Object && "code" in cause && cause.code === code;
15
+ }
16
+ function isInputFsError(cause) {
17
+ return hasFsErrorCode(cause, "ENOENT") || hasFsErrorCode(cause, "ENOTDIR") || hasFsErrorCode(cause, "EACCES") || hasFsErrorCode(cause, "EPERM") || hasFsErrorCode(cause, "ELOOP") || hasFsErrorCode(cause, "ENAMETOOLONG") || hasFsErrorCode(cause, "ERR_INVALID_ARG_VALUE");
18
+ }
19
+ var ZOD_STYLE_CODE = /^Z_/;
20
+ function hasZodStyleErrorCode(cause) {
21
+ return cause instanceof Object && "code" in cause && ZOD_STYLE_CODE.test(String(cause.code));
22
+ }
23
+ function isCapsuleImportArchiveInputError(cause, message) {
24
+ if (cause instanceof ZodError) return true;
25
+ if (hasZodStyleErrorCode(cause)) return true;
26
+ return message.startsWith("importCapsule: archive") || message.startsWith("importCapsule: bundle") || message.startsWith("importCapsule: manifest") || message.startsWith("importCapsule: record") || /incorrect header check|invalid stored block lengths|not in gzip format|unexpected end of file/i.test(message);
27
+ }
28
+ var IMPORT_SOURCE_REFUSED = "capsule import failed: archivePath must be an existing file inside the namespace capsule store";
29
+ async function realpathOrNull(target) {
30
+ try {
31
+ return await realpath(target);
32
+ } catch (cause) {
33
+ if (!isInputFsError(cause)) throw cause;
34
+ return null;
35
+ }
36
+ }
37
+ function isInsideDirectory(directory, target) {
38
+ const rel = path.relative(directory, target);
39
+ return rel !== "" && rel !== ".." && !rel.startsWith(`..${path.sep}`) && !path.isAbsolute(rel);
40
+ }
41
+ async function validateCapsuleImportArchive(archivePath, storageDir) {
42
+ const storeReal = await realpathOrNull(defaultCapsulesDir(storageDir));
43
+ const archiveReal = await realpathOrNull(archivePath);
44
+ if (storeReal === null || archiveReal === null || !isInsideDirectory(storeReal, archiveReal)) {
45
+ throw new EngramAccessInputError(IMPORT_SOURCE_REFUSED);
46
+ }
47
+ if (!(await stat(archiveReal)).isFile()) {
48
+ throw new EngramAccessInputError("capsule import failed: archivePath must point to a file");
49
+ }
50
+ try {
51
+ await access(archiveReal, fsConstants.R_OK);
52
+ } catch (cause) {
53
+ if (!isInputFsError(cause)) throw cause;
54
+ throw new EngramAccessInputError("capsule import failed: archive is not readable");
55
+ }
56
+ }
57
+
58
+ export {
59
+ isCapsuleImportArchiveInputError,
60
+ validateCapsuleImportArchive
61
+ };
62
+ //# sourceMappingURL=chunk-FKBGK3NC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/capsule-import-gate.ts"],"sourcesContent":["import { constants as fsConstants } from \"node:fs\";\nimport { access, realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { ZodError } from \"zod\";\nimport { EngramAccessInputError } from \"./access-errors.js\";\nimport { defaultCapsulesDir } from \"./capsule-cli.js\";\n\n/**\n * Import-path gate for remote capsule imports (issue #3225 C1).\n *\n * `EngramAccessService.capsuleImport` serves the HTTP route and the\n * `capsule_import` MCP operation, where the caller supplies `archivePath`.\n * The destination namespace is authorized, but the source archive previously\n * was not: any path the server process could read was accepted. This module\n * confines the source to the namespace capsule store, `defaultCapsulesDir`\n * of the destination storage dir, which is the same store `capsule export`\n * writes and `capsule_list` lists.\n *\n * The CLI import path does not go through this gate; it is the explicit\n * operator authority and keeps unrestricted local-path imports.\n */\n\n/** True when the caught error carries the given errno-style code. */\nfunction hasFsErrorCode(cause: unknown, code: string): boolean {\n return cause instanceof Object && \"code\" in cause && cause.code === code;\n}\n\n/** True when `cause` is a path error the gate reports as an input error instead of a server fault. */\nfunction isInputFsError(cause: unknown): boolean {\n return (\n hasFsErrorCode(cause, \"ENOENT\") ||\n hasFsErrorCode(cause, \"ENOTDIR\") ||\n hasFsErrorCode(cause, \"EACCES\") ||\n hasFsErrorCode(cause, \"EPERM\") ||\n hasFsErrorCode(cause, \"ELOOP\") ||\n hasFsErrorCode(cause, \"ENAMETOOLONG\") ||\n hasFsErrorCode(cause, \"ERR_INVALID_ARG_VALUE\")\n );\n}\n\n/** Matches zod-style `Z_` error codes carried on error objects. */\nconst ZOD_STYLE_CODE = /^Z_/;\n\n/** True when the caught error carries a zod-style `Z_` code. */\nfunction hasZodStyleErrorCode(cause: unknown): boolean {\n return cause instanceof Object && \"code\" in cause && ZOD_STYLE_CODE.test(String(cause.code));\n}\n\n/** True when the importer failed on archive input (shape, gzip, checksum) rather than backend errors. */\nexport function isCapsuleImportArchiveInputError(cause: unknown, message: string): boolean {\n if (cause instanceof ZodError) return true;\n if (hasZodStyleErrorCode(cause)) return true;\n return (\n message.startsWith(\"importCapsule: archive\") ||\n message.startsWith(\"importCapsule: bundle\") ||\n message.startsWith(\"importCapsule: manifest\") ||\n message.startsWith(\"importCapsule: record\") ||\n /incorrect header check|invalid stored block lengths|not in gzip format|unexpected end of file/i.test(message)\n );\n}\n\n/**\n * One message for every refusal before confinement is proven. A caller that\n * can name any server path must not learn from the error whether that path\n * exists, is a directory, or is unreadable.\n */\nconst IMPORT_SOURCE_REFUSED =\n \"capsule import failed: archivePath must be an existing file inside the namespace capsule store\";\n\n/** Resolve a path to its real path; a missing, looping, or unreadable path resolves to null. */\nasync function realpathOrNull(target: string): Promise<string | null> {\n try {\n return await realpath(target);\n } catch (cause) {\n if (!isInputFsError(cause)) throw cause;\n return null;\n }\n}\n\n/** True when `target` is a strict descendant of `directory` (both already resolved). */\nfunction isInsideDirectory(directory: string, target: string): boolean {\n const rel = path.relative(directory, target);\n return rel !== \"\" && rel !== \"..\" && !rel.startsWith(`..${path.sep}`) && !path.isAbsolute(rel);\n}\n\n/**\n * Validate a remote import source and confine it to the namespace capsule\n * store. Both real paths are resolved first, so `..` segments and store\n * symlinks that point outside are refused. Confinement is checked before the\n * file is inspected in any other way, and every failure before it proves\n * confinement raises the same message.\n */\nexport async function validateCapsuleImportArchive(archivePath: string, storageDir: string): Promise<void> {\n const storeReal = await realpathOrNull(defaultCapsulesDir(storageDir));\n const archiveReal = await realpathOrNull(archivePath);\n if (storeReal === null || archiveReal === null || !isInsideDirectory(storeReal, archiveReal)) {\n throw new EngramAccessInputError(IMPORT_SOURCE_REFUSED);\n }\n // The path now names a store entry, so the checks below only describe the store.\n if (!(await stat(archiveReal)).isFile()) {\n throw new EngramAccessInputError(\"capsule import failed: archivePath must point to a file\");\n }\n try {\n await access(archiveReal, fsConstants.R_OK);\n } catch (cause) {\n if (!isInputFsError(cause)) throw cause;\n throw new EngramAccessInputError(\"capsule import failed: archive is not readable\");\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,aAAa,mBAAmB;AACzC,SAAS,QAAQ,UAAU,YAAY;AACvC,OAAO,UAAU;AACjB,SAAS,gBAAgB;AAoBzB,SAAS,eAAe,OAAgB,MAAuB;AAC7D,SAAO,iBAAiB,UAAU,UAAU,SAAS,MAAM,SAAS;AACtE;AAGA,SAAS,eAAe,OAAyB;AAC/C,SACE,eAAe,OAAO,QAAQ,KAC9B,eAAe,OAAO,SAAS,KAC/B,eAAe,OAAO,QAAQ,KAC9B,eAAe,OAAO,OAAO,KAC7B,eAAe,OAAO,OAAO,KAC7B,eAAe,OAAO,cAAc,KACpC,eAAe,OAAO,uBAAuB;AAEjD;AAGA,IAAM,iBAAiB;AAGvB,SAAS,qBAAqB,OAAyB;AACrD,SAAO,iBAAiB,UAAU,UAAU,SAAS,eAAe,KAAK,OAAO,MAAM,IAAI,CAAC;AAC7F;AAGO,SAAS,iCAAiC,OAAgB,SAA0B;AACzF,MAAI,iBAAiB,SAAU,QAAO;AACtC,MAAI,qBAAqB,KAAK,EAAG,QAAO;AACxC,SACE,QAAQ,WAAW,wBAAwB,KAC3C,QAAQ,WAAW,uBAAuB,KAC1C,QAAQ,WAAW,yBAAyB,KAC5C,QAAQ,WAAW,uBAAuB,KAC1C,iGAAiG,KAAK,OAAO;AAEjH;AAOA,IAAM,wBACJ;AAGF,eAAe,eAAe,QAAwC;AACpE,MAAI;AACF,WAAO,MAAM,SAAS,MAAM;AAAA,EAC9B,SAAS,OAAO;AACd,QAAI,CAAC,eAAe,KAAK,EAAG,OAAM;AAClC,WAAO;AAAA,EACT;AACF;AAGA,SAAS,kBAAkB,WAAmB,QAAyB;AACrE,QAAM,MAAM,KAAK,SAAS,WAAW,MAAM;AAC3C,SAAO,QAAQ,MAAM,QAAQ,QAAQ,CAAC,IAAI,WAAW,KAAK,KAAK,GAAG,EAAE,KAAK,CAAC,KAAK,WAAW,GAAG;AAC/F;AASA,eAAsB,6BAA6B,aAAqB,YAAmC;AACzG,QAAM,YAAY,MAAM,eAAe,mBAAmB,UAAU,CAAC;AACrE,QAAM,cAAc,MAAM,eAAe,WAAW;AACpD,MAAI,cAAc,QAAQ,gBAAgB,QAAQ,CAAC,kBAAkB,WAAW,WAAW,GAAG;AAC5F,UAAM,IAAI,uBAAuB,qBAAqB;AAAA,EACxD;AAEA,MAAI,EAAE,MAAM,KAAK,WAAW,GAAG,OAAO,GAAG;AACvC,UAAM,IAAI,uBAAuB,yDAAyD;AAAA,EAC5F;AACA,MAAI;AACF,UAAM,OAAO,aAAa,YAAY,IAAI;AAAA,EAC5C,SAAS,OAAO;AACd,QAAI,CAAC,eAAe,KAAK,EAAG,OAAM;AAClC,UAAM,IAAI,uBAAuB,gDAAgD;AAAA,EACnF;AACF;","names":[]}
@@ -6,18 +6,18 @@ import {
6
6
  // src/briefing-deadline.ts
7
7
  var BRIEFING_DEADLINE_MS = 3e4;
8
8
  var BriefingTimeoutError = class extends Error {
9
- constructor(deadlineMs) {
10
- super(`briefing timed out after ${deadlineMs}ms`);
9
+ constructor(deadlineMs, label = "briefing") {
10
+ super(`${label} timed out after ${deadlineMs}ms`);
11
11
  this.deadlineMs = deadlineMs;
12
12
  this.name = "TimeoutError";
13
13
  }
14
14
  deadlineMs;
15
15
  };
16
- async function withBriefingDeadline(run, abortSignal) {
16
+ async function withBriefingDeadline(run, abortSignal, label = "briefing") {
17
17
  const controller = new AbortController();
18
18
  const signal = abortSignal ? AbortSignal.any([abortSignal, controller.signal]) : controller.signal;
19
19
  const timer = setTimeout(
20
- () => controller.abort(new BriefingTimeoutError(BRIEFING_DEADLINE_MS)),
20
+ () => controller.abort(new BriefingTimeoutError(BRIEFING_DEADLINE_MS, label)),
21
21
  BRIEFING_DEADLINE_MS
22
22
  );
23
23
  try {
@@ -37,4 +37,4 @@ export {
37
37
  BriefingTimeoutError,
38
38
  withBriefingDeadline
39
39
  };
40
- //# sourceMappingURL=chunk-X2KO4FK5.js.map
40
+ //# sourceMappingURL=chunk-FNFURZBZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/briefing-deadline.ts"],"sourcesContent":["import { isAbortError, raceAbort } from \"./abort-error.js\";\n\nexport const BRIEFING_DEADLINE_MS = 30_000;\n\nexport class BriefingTimeoutError extends Error {\n constructor(readonly deadlineMs: number, label = \"briefing\") {\n super(`${label} timed out after ${deadlineMs}ms`);\n this.name = \"TimeoutError\";\n }\n}\n\nexport async function withBriefingDeadline<T>(\n run: (signal: AbortSignal) => Promise<T>,\n abortSignal?: AbortSignal,\n label = \"briefing\",\n): Promise<T> {\n const controller = new AbortController();\n const signal = abortSignal ? AbortSignal.any([abortSignal, controller.signal]) : controller.signal;\n const timer = setTimeout(\n () => controller.abort(new BriefingTimeoutError(BRIEFING_DEADLINE_MS, label)),\n BRIEFING_DEADLINE_MS\n );\n try {\n signal.throwIfAborted();\n return await raceAbort(run(signal), signal, \"briefing aborted\");\n } catch (err) {\n // raceAbort normalizes cancellation; retain the distinct deadline reason.\n const reason: unknown = signal.reason;\n if (signal.aborted && (reason instanceof BriefingTimeoutError || isAbortError(reason))) throw reason;\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n"],"mappings":";;;;;;AAEO,IAAM,uBAAuB;AAE7B,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9C,YAAqB,YAAoB,QAAQ,YAAY;AAC3D,UAAM,GAAG,KAAK,oBAAoB,UAAU,IAAI;AAD7B;AAEnB,SAAK,OAAO;AAAA,EACd;AAAA,EAHqB;AAIvB;AAEA,eAAsB,qBACpB,KACA,aACA,QAAQ,YACI;AACZ,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,SAAS,cAAc,YAAY,IAAI,CAAC,aAAa,WAAW,MAAM,CAAC,IAAI,WAAW;AAC5F,QAAM,QAAQ;AAAA,IACZ,MAAM,WAAW,MAAM,IAAI,qBAAqB,sBAAsB,KAAK,CAAC;AAAA,IAC5E;AAAA,EACF;AACA,MAAI;AACF,WAAO,eAAe;AACtB,WAAO,MAAM,UAAU,IAAI,MAAM,GAAG,QAAQ,kBAAkB;AAAA,EAChE,SAAS,KAAK;AAEZ,UAAM,SAAkB,OAAO;AAC/B,QAAI,OAAO,YAAY,kBAAkB,wBAAwB,aAAa,MAAM,GAAI,OAAM;AAC9F,UAAM;AAAA,EACR,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  StorageManager
3
- } from "./chunk-ELWI2R6H.js";
3
+ } from "./chunk-CC4V7HNP.js";
4
4
  import {
5
5
  keyring_exports,
6
6
  secureStoreDir
@@ -416,4 +416,4 @@ export {
416
416
  resolveNamespaceStorageRoot,
417
417
  NamespaceStorageRouter
418
418
  };
419
- //# sourceMappingURL=chunk-MYCCO6AA.js.map
419
+ //# sourceMappingURL=chunk-G54BOKZ6.js.map
@@ -16,13 +16,13 @@ import {
16
16
  requestEntityCanonicalIdReconcile,
17
17
  withRawEntityPageMutation
18
18
  } from "./chunk-IAYUTGF2.js";
19
- import {
20
- parseExportBundle
21
- } from "./chunk-WEHSQBFR.js";
22
19
  import {
23
20
  decryptCapsuleFileInMemory,
24
21
  isEncryptedCapsuleFile
25
- } from "./chunk-UVYI6VIX.js";
22
+ } from "./chunk-X7Y7WX73.js";
23
+ import {
24
+ parseExportBundle
25
+ } from "./chunk-WEHSQBFR.js";
26
26
  import {
27
27
  assertIsDirectoryNotSymlink,
28
28
  assertRealpathInsideRoot,
@@ -296,4 +296,4 @@ function mintForkId(capsuleId, originalId, now) {
296
296
  export {
297
297
  importCapsule
298
298
  };
299
- //# sourceMappingURL=chunk-JFH6JAGY.js.map
299
+ //# sourceMappingURL=chunk-G67EUQAB.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SupportPassportCreateGrantRequestSchema,
3
3
  defineOperation
4
- } from "./chunk-HVFX2N2G.js";
4
+ } from "./chunk-UAUV3BWS.js";
5
5
  import {
6
6
  SupportPassportCardCategorySchema,
7
7
  SupportPassportMemoryIdSchema,
@@ -220,4 +220,4 @@ var supportPassportGrantAskOperation = defineOperation({
220
220
  result: await ctx.service.supportPassportAskGrant(grantId, secret, question, ctx.abortSignal)
221
221
  })
222
222
  });
223
- //# sourceMappingURL=chunk-TV65NR7L.js.map
223
+ //# sourceMappingURL=chunk-GULUWOA5.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-7T4TOGMS.js";
4
4
  import {
5
5
  defineOperation
6
- } from "./chunk-HVFX2N2G.js";
6
+ } from "./chunk-UAUV3BWS.js";
7
7
 
8
8
  // src/external-wiki-access.ts
9
9
  import { z } from "zod";
@@ -26,4 +26,4 @@ var externalWikiSearchOperation = defineOperation({
26
26
  export {
27
27
  externalWikiSearchOperation
28
28
  };
29
- //# sourceMappingURL=chunk-6DANGCMO.js.map
29
+ //# sourceMappingURL=chunk-HFUKXOUW.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  resolveDefaultNamespaceRoot,
3
3
  resolveNamespaceStorageRoot
4
- } from "./chunk-MYCCO6AA.js";
4
+ } from "./chunk-G54BOKZ6.js";
5
5
  import {
6
6
  MutationSerializer,
7
7
  withHeldFileLock
@@ -1596,4 +1596,4 @@ export {
1596
1596
  isNamespaceKind,
1597
1597
  NamespaceCatalog
1598
1598
  };
1599
- //# sourceMappingURL=chunk-Y3IYKNBY.js.map
1599
+ //# sourceMappingURL=chunk-HLN2HOXX.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  parseEntityFile
3
- } from "./chunk-ELWI2R6H.js";
3
+ } from "./chunk-CC4V7HNP.js";
4
4
  import {
5
5
  inferMemoryStatus
6
6
  } from "./chunk-7RJUVTVF.js";
7
7
  import {
8
8
  EngramAccessInputError
9
- } from "./chunk-LGEH473S.js";
9
+ } from "./chunk-CJCTKL6Y.js";
10
10
 
11
11
  // src/who-knows.ts
12
12
  var WHO_KNOWS_DEFAULT_LIMIT = 5;
@@ -253,4 +253,4 @@ export {
253
253
  WHO_KNOWS_MCP_TOOLS,
254
254
  handleWhoKnowsHttpQuery
255
255
  };
256
- //# sourceMappingURL=chunk-Y43X3E24.js.map
256
+ //# sourceMappingURL=chunk-IBDWYRDR.js.map
@@ -24,7 +24,7 @@ import {
24
24
  } from "./chunk-E4RMZGRS.js";
25
25
  import {
26
26
  RECALL_WHY_MCP_TOOLS
27
- } from "./chunk-ZXF3O7P4.js";
27
+ } from "./chunk-ARRTLPRC.js";
28
28
  import {
29
29
  McpFrameReader
30
30
  } from "./chunk-IGLJNHOX.js";
@@ -52,22 +52,22 @@ import {
52
52
  } from "./chunk-KIUVEMBI.js";
53
53
  import {
54
54
  getOperation
55
- } from "./chunk-HVFX2N2G.js";
55
+ } from "./chunk-UAUV3BWS.js";
56
56
  import {
57
57
  WHO_KNOWS_MCP_TOOLS
58
- } from "./chunk-Y43X3E24.js";
58
+ } from "./chunk-IBDWYRDR.js";
59
59
  import {
60
60
  PROMOTION_CANDIDATES_MCP_TOOLS
61
61
  } from "./chunk-R6HMAIKM.js";
62
62
  import {
63
63
  validateRequest
64
- } from "./chunk-GYNRNKMW.js";
64
+ } from "./chunk-YMJRLT7S.js";
65
65
  import {
66
66
  assertOperationAllowed,
67
67
  capabilityAllowsOp,
68
68
  enforceNamespaceAllowList,
69
69
  tokenCapabilityStore
70
- } from "./chunk-YO2JEX2Z.js";
70
+ } from "./chunk-OGBQMY46.js";
71
71
  import {
72
72
  SUPPORT_PASSPORT_SOURCE_MEMORY_ID_MAX_LENGTH
73
73
  } from "./chunk-PWPIERBM.js";
@@ -78,7 +78,7 @@ import {
78
78
  EngramAccessForbiddenError,
79
79
  EngramAccessInputError,
80
80
  unknownToolError
81
- } from "./chunk-LGEH473S.js";
81
+ } from "./chunk-CJCTKL6Y.js";
82
82
  import {
83
83
  abortError,
84
84
  isAbortError
@@ -3734,14 +3734,15 @@ var EngramMcpServer = class {
3734
3734
  } catch (err) {
3735
3735
  if (isAbortError(err)) throw err;
3736
3736
  const message = mcpToolErrorMessage(err instanceof Error ? err : new Error(String(err)));
3737
- return {
3738
- jsonrpc: "2.0",
3739
- id,
3740
- result: {
3741
- content: [{ type: "text", text: message }],
3742
- isError: true
3743
- }
3737
+ const admissionBackpressure = err instanceof Error && (err.name === "ReplayAdmissionRefusedError" || err.name === "BufferAdmissionRefusedError");
3738
+ const result = {
3739
+ content: [{ type: "text", text: message }],
3740
+ isError: true
3744
3741
  };
3742
+ if (admissionBackpressure) {
3743
+ result.structuredContent = { code: "buffer_admission_refused", retryable: true };
3744
+ }
3745
+ return { jsonrpc: "2.0", id, result };
3745
3746
  }
3746
3747
  }
3747
3748
  return {
@@ -3985,4 +3986,4 @@ export {
3985
3986
  MCP_MIGRATED_OPERATIONS,
3986
3987
  EngramMcpServer
3987
3988
  };
3988
- //# sourceMappingURL=chunk-XSFQN7TP.js.map
3989
+ //# sourceMappingURL=chunk-IBGU6AN6.js.map