@remnic/core 10.0.85 → 10.0.87

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
@@ -4,28 +4,28 @@ import {
4
4
  renderWhoKnows,
5
5
  renderWhoKnowsJson,
6
6
  renderWhoKnowsText
7
- } from "./chunk-MNYQVYJ4.js";
8
- import "./chunk-Y43X3E24.js";
9
- import "./chunk-ELWI2R6H.js";
7
+ } from "./chunk-QD5R6U5J.js";
8
+ import "./chunk-IBDWYRDR.js";
9
+ import "./chunk-CC4V7HNP.js";
10
10
  import "./chunk-UHVXE24Y.js";
11
11
  import "./chunk-QGVCFVX6.js";
12
12
  import "./chunk-IGOW4TJE.js";
13
+ import "./chunk-NT7F7WJQ.js";
13
14
  import "./chunk-G6OFEGUR.js";
14
- import "./chunk-3ODZLCHC.js";
15
- import "./chunk-H34INI3P.js";
16
- import "./chunk-DI5ET2IE.js";
15
+ import "./chunk-KVSOEVAF.js";
16
+ import "./chunk-QEZ3DW5O.js";
17
+ import "./chunk-PFUXPTBT.js";
18
+ import "./chunk-CYEPCZN5.js";
17
19
  import "./chunk-DLZGSZVC.js";
18
20
  import "./chunk-OVZIYLBZ.js";
19
21
  import "./chunk-EXYT52NR.js";
20
22
  import "./chunk-DOJBV6WR.js";
21
- import "./chunk-PFUXPTBT.js";
22
23
  import "./chunk-WNEVEMJ3.js";
23
24
  import "./chunk-Y5NLBXPV.js";
24
- import "./chunk-CYEPCZN5.js";
25
- import "./chunk-QCP75JGO.js";
26
- import "./chunk-A7Q43EUZ.js";
25
+ import "./chunk-TFA6HPOA.js";
27
26
  import "./chunk-F4TWWUMP.js";
28
27
  import "./chunk-72A4L5JJ.js";
28
+ import "./chunk-A7Q43EUZ.js";
29
29
  import "./chunk-S2V7RUCL.js";
30
30
  import "./chunk-PPUNC7UX.js";
31
31
  import "./chunk-X3724WL4.js";
@@ -33,19 +33,19 @@ import "./chunk-S2HLHAZ4.js";
33
33
  import "./chunk-MRPOZBJC.js";
34
34
  import "./chunk-DM2T26WE.js";
35
35
  import "./chunk-LDXUBPMO.js";
36
- import "./chunk-S45INSV3.js";
37
36
  import "./chunk-QFEDITXM.js";
38
37
  import "./chunk-AAD2ZS6P.js";
38
+ import "./chunk-S45INSV3.js";
39
39
  import "./chunk-FHGWKODN.js";
40
+ import "./chunk-YXZG5TVN.js";
40
41
  import "./chunk-ZIKENA2C.js";
41
42
  import "./chunk-3OUGSOJP.js";
42
43
  import "./chunk-SCU65EZI.js";
43
44
  import "./chunk-3ONXXHQO.js";
44
- import "./chunk-YXZG5TVN.js";
45
+ import "./chunk-3WU7XOFN.js";
45
46
  import "./chunk-P4GUQSK3.js";
46
47
  import "./chunk-4LZ7SVKM.js";
47
48
  import "./chunk-YHTG64XV.js";
48
- import "./chunk-3WU7XOFN.js";
49
49
  import "./chunk-G7D6GZ5J.js";
50
50
  import "./chunk-ER7XANP3.js";
51
51
  import "./chunk-M5GVCJSJ.js";
@@ -54,6 +54,15 @@ import "./chunk-IAYUTGF2.js";
54
54
  import "./chunk-5WITETWU.js";
55
55
  import "./chunk-6CIAGZ6X.js";
56
56
  import "./chunk-7CT3AI52.js";
57
+ import "./chunk-ELHJK7LM.js";
58
+ import "./chunk-IUM3VSHI.js";
59
+ import "./chunk-NWA6IXR3.js";
60
+ import "./chunk-VILPVT4S.js";
61
+ import "./chunk-AF2XMJKD.js";
62
+ import "./chunk-OR42ZI54.js";
63
+ import "./chunk-23G5P7TA.js";
64
+ import "./chunk-C64XATK7.js";
65
+ import "./chunk-42JKGUFJ.js";
57
66
  import "./chunk-ZU5JDLOH.js";
58
67
  import "./chunk-I55KAVET.js";
59
68
  import "./chunk-L2EXJQJP.js";
@@ -62,16 +71,7 @@ import "./chunk-ZU3NJNO7.js";
62
71
  import "./chunk-E2AWJ7KQ.js";
63
72
  import "./chunk-7VLBZKNB.js";
64
73
  import "./chunk-Y33KJ556.js";
65
- import "./chunk-WBN66HPI.js";
66
- import "./chunk-NWA6IXR3.js";
67
- import "./chunk-VILPVT4S.js";
68
- import "./chunk-AF2XMJKD.js";
69
- import "./chunk-OR42ZI54.js";
70
- import "./chunk-IUM3VSHI.js";
71
- import "./chunk-C64XATK7.js";
72
- import "./chunk-42JKGUFJ.js";
73
- import "./chunk-23G5P7TA.js";
74
- import "./chunk-WLNWFHX3.js";
74
+ import "./chunk-UXXK523X.js";
75
75
  import "./chunk-PJKTFXE2.js";
76
76
  import "./chunk-W5BIQOAJ.js";
77
77
  import "./chunk-HADD45AR.js";
@@ -108,7 +108,7 @@ import "./chunk-X4OZMANG.js";
108
108
  import "./chunk-ZEFVK7XC.js";
109
109
  import "./chunk-6KH5NLQS.js";
110
110
  import "./chunk-P2QRMMVQ.js";
111
- import "./chunk-LGEH473S.js";
111
+ import "./chunk-CJCTKL6Y.js";
112
112
  import "./chunk-R2MBW2S4.js";
113
113
  import "./chunk-QUIRIG2P.js";
114
114
  import "./chunk-LDPPTPO5.js";
package/dist/who-knows.js CHANGED
@@ -9,27 +9,27 @@ import {
9
9
  loadWhoKnowsEntities,
10
10
  tokenizeTopic,
11
11
  validateWhoKnowsInput
12
- } from "./chunk-Y43X3E24.js";
13
- import "./chunk-ELWI2R6H.js";
12
+ } from "./chunk-IBDWYRDR.js";
13
+ import "./chunk-CC4V7HNP.js";
14
14
  import "./chunk-UHVXE24Y.js";
15
15
  import "./chunk-QGVCFVX6.js";
16
16
  import "./chunk-IGOW4TJE.js";
17
+ import "./chunk-NT7F7WJQ.js";
17
18
  import "./chunk-G6OFEGUR.js";
18
- import "./chunk-3ODZLCHC.js";
19
- import "./chunk-H34INI3P.js";
20
- import "./chunk-DI5ET2IE.js";
19
+ import "./chunk-KVSOEVAF.js";
20
+ import "./chunk-QEZ3DW5O.js";
21
+ import "./chunk-PFUXPTBT.js";
22
+ import "./chunk-CYEPCZN5.js";
21
23
  import "./chunk-DLZGSZVC.js";
22
24
  import "./chunk-OVZIYLBZ.js";
23
25
  import "./chunk-EXYT52NR.js";
24
26
  import "./chunk-DOJBV6WR.js";
25
- import "./chunk-PFUXPTBT.js";
26
27
  import "./chunk-WNEVEMJ3.js";
27
28
  import "./chunk-Y5NLBXPV.js";
28
- import "./chunk-CYEPCZN5.js";
29
- import "./chunk-QCP75JGO.js";
30
- import "./chunk-A7Q43EUZ.js";
29
+ import "./chunk-TFA6HPOA.js";
31
30
  import "./chunk-F4TWWUMP.js";
32
31
  import "./chunk-72A4L5JJ.js";
32
+ import "./chunk-A7Q43EUZ.js";
33
33
  import "./chunk-S2V7RUCL.js";
34
34
  import "./chunk-PPUNC7UX.js";
35
35
  import "./chunk-X3724WL4.js";
@@ -37,19 +37,19 @@ import "./chunk-S2HLHAZ4.js";
37
37
  import "./chunk-MRPOZBJC.js";
38
38
  import "./chunk-DM2T26WE.js";
39
39
  import "./chunk-LDXUBPMO.js";
40
- import "./chunk-S45INSV3.js";
41
40
  import "./chunk-QFEDITXM.js";
42
41
  import "./chunk-AAD2ZS6P.js";
42
+ import "./chunk-S45INSV3.js";
43
43
  import "./chunk-FHGWKODN.js";
44
+ import "./chunk-YXZG5TVN.js";
44
45
  import "./chunk-ZIKENA2C.js";
45
46
  import "./chunk-3OUGSOJP.js";
46
47
  import "./chunk-SCU65EZI.js";
47
48
  import "./chunk-3ONXXHQO.js";
48
- import "./chunk-YXZG5TVN.js";
49
+ import "./chunk-3WU7XOFN.js";
49
50
  import "./chunk-P4GUQSK3.js";
50
51
  import "./chunk-4LZ7SVKM.js";
51
52
  import "./chunk-YHTG64XV.js";
52
- import "./chunk-3WU7XOFN.js";
53
53
  import "./chunk-G7D6GZ5J.js";
54
54
  import "./chunk-ER7XANP3.js";
55
55
  import "./chunk-M5GVCJSJ.js";
@@ -58,6 +58,15 @@ import "./chunk-IAYUTGF2.js";
58
58
  import "./chunk-5WITETWU.js";
59
59
  import "./chunk-6CIAGZ6X.js";
60
60
  import "./chunk-7CT3AI52.js";
61
+ import "./chunk-ELHJK7LM.js";
62
+ import "./chunk-IUM3VSHI.js";
63
+ import "./chunk-NWA6IXR3.js";
64
+ import "./chunk-VILPVT4S.js";
65
+ import "./chunk-AF2XMJKD.js";
66
+ import "./chunk-OR42ZI54.js";
67
+ import "./chunk-23G5P7TA.js";
68
+ import "./chunk-C64XATK7.js";
69
+ import "./chunk-42JKGUFJ.js";
61
70
  import "./chunk-ZU5JDLOH.js";
62
71
  import "./chunk-I55KAVET.js";
63
72
  import "./chunk-L2EXJQJP.js";
@@ -66,16 +75,7 @@ import "./chunk-ZU3NJNO7.js";
66
75
  import "./chunk-E2AWJ7KQ.js";
67
76
  import "./chunk-7VLBZKNB.js";
68
77
  import "./chunk-Y33KJ556.js";
69
- import "./chunk-WBN66HPI.js";
70
- import "./chunk-NWA6IXR3.js";
71
- import "./chunk-VILPVT4S.js";
72
- import "./chunk-AF2XMJKD.js";
73
- import "./chunk-OR42ZI54.js";
74
- import "./chunk-IUM3VSHI.js";
75
- import "./chunk-C64XATK7.js";
76
- import "./chunk-42JKGUFJ.js";
77
- import "./chunk-23G5P7TA.js";
78
- import "./chunk-WLNWFHX3.js";
78
+ import "./chunk-UXXK523X.js";
79
79
  import "./chunk-PJKTFXE2.js";
80
80
  import "./chunk-W5BIQOAJ.js";
81
81
  import "./chunk-HADD45AR.js";
@@ -112,7 +112,7 @@ import "./chunk-X4OZMANG.js";
112
112
  import "./chunk-ZEFVK7XC.js";
113
113
  import "./chunk-6KH5NLQS.js";
114
114
  import "./chunk-P2QRMMVQ.js";
115
- import "./chunk-LGEH473S.js";
115
+ import "./chunk-CJCTKL6Y.js";
116
116
  import "./chunk-R2MBW2S4.js";
117
117
  import "./chunk-QUIRIG2P.js";
118
118
  import "./chunk-LDPPTPO5.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "10.0.85",
3
+ "version": "10.0.87",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3386,7 +3386,7 @@
3386
3386
  "core"
3387
3387
  ],
3388
3388
  "peerDependencies": {
3389
- "@remnic/coding-graph": "^10.0.85"
3389
+ "@remnic/coding-graph": "^10.0.87"
3390
3390
  },
3391
3391
  "peerDependenciesMeta": {
3392
3392
  "@remnic/coding-graph": {
@@ -18,6 +18,7 @@
18
18
  import { z } from "zod";
19
19
  import { EngramAccessInputError, type EngramAccessService } from "./access-service.js";
20
20
  import {
21
+ assertNamespaceAllowed,
21
22
  assertOperationAuthorizationAllowed,
22
23
  tokenCapabilityStore,
23
24
  } from "./access-token-capabilities.js";
@@ -493,6 +494,20 @@ export function defineOperation<In, Out>(spec: OperationSpec<In, Out>): BoundOpe
493
494
  throw new EngramAccessInputError(formatZodIssues(parseResult.error));
494
495
  }
495
496
  assertOperationAuthorizationAllowed(tokenCapabilityStore.getStore(), spec);
497
+ // Post-parse namespace re-check (issue #3225 B1): the transports authorize
498
+ // the RAW namespace before preprocessing. Re-check the PARSED value so a
499
+ // namespace that only appears after validation cannot bypass the token
500
+ // allow-list. Absent namespaces keep the transport check; no default is
501
+ // invented here.
502
+ if (operationRequiresAuthorizedNamespace(spec.name)) {
503
+ // SAFETY: namespace-bearing schemas parse `namespace` as a non-empty
504
+ // string, an explicit null (transport null-for-absent idiom), or
505
+ // undefined; falsy spellings mean absent and keep the transport check.
506
+ const parsedNamespace = (parseResult.data as { namespace?: string | null }).namespace;
507
+ if (parsedNamespace) {
508
+ assertNamespaceAllowed(tokenCapabilityStore.getStore(), parsedNamespace);
509
+ }
510
+ }
496
511
  return spec.handler(parseResult.data, { ...ctx, rawInput });
497
512
  },
498
513
  };
@@ -35,6 +35,28 @@ export class NamespaceNotWritableError extends EngramAccessInputError {
35
35
  }
36
36
  }
37
37
 
38
+ // ─── Reserved argument keys (issue #3225 B1) ──────────────────────────────
39
+
40
+ /**
41
+ * Dictionary keys that change object shape or prototype resolution. A JSON
42
+ * body can carry them as own members; the request preprocessors reject them
43
+ * before copying, so a decoded `__proto__` member cannot become an inherited
44
+ * schema field. Lives in this lowest module so the boundary and wire schema
45
+ * layers share one implementation without an import cycle.
46
+ */
47
+ export const RESERVED_PROTO_KEYS: readonly string[] = ["__proto__", "constructor", "prototype"];
48
+
49
+ /**
50
+ * Reject the reserved keys with the input-error type, so a client that
51
+ * submits a magic dictionary key gets a validation error instead of a
52
+ * silently reshaped request object.
53
+ */
54
+ export function rejectReservedArgumentKey(key: string): void {
55
+ if (RESERVED_PROTO_KEYS.includes(key)) {
56
+ throw new EngramAccessInputError(`${key} is not a permitted argument key`);
57
+ }
58
+ }
59
+
38
60
  // ─── Levenshtein distance ─────────────────────────────────────────────────
39
61
 
40
62
  /**
@@ -0,0 +1,236 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdtemp, readdir, readFile, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import path from "node:path";
5
+ import test from "node:test";
6
+
7
+ import "./access-operations-batch.js"; // registration side effect: the real operations
8
+ import { getOperation } from "./access-boundary.js";
9
+ import { EngramAccessService } from "./access-service.js";
10
+ import { EngramAccessForbiddenError } from "./access-errors.js";
11
+ import { tokenCapabilityStore, type TokenCapabilities } from "./access-token-capabilities.js";
12
+ import { Orchestrator } from "./orchestrator.js";
13
+ import { parseConfig } from "./config.js";
14
+ import { writePeer, writePeerProfile } from "./peers/index.js";
15
+ import { WorkStorage } from "./work/storage.js";
16
+
17
+ // Issue #3225 B3: work_task / work_project / work_board and the six peer
18
+ // operations run against GLOBAL stores, so a namespace argument cannot
19
+ // isolate them. They must carry fleetWide: true like the other cross-fleet
20
+ // operations, and the HTTP peer routes must enforce the same policy.
21
+
22
+ const PEER_ID = "b3-target-peer";
23
+ const NOW = "2026-11-11T00:00:00.000Z";
24
+
25
+ /** The nine operations that touch a global store (issue #3225 B3). */
26
+ const GLOBAL_OPS = [
27
+ "work_task",
28
+ "work_project",
29
+ "work_board",
30
+ "peer_list",
31
+ "peer_get",
32
+ "peer_set",
33
+ "peer_delete",
34
+ "peer_profile_get",
35
+ "peer_forget",
36
+ ] as const;
37
+
38
+ type GlobalOpName = (typeof GLOBAL_OPS)[number];
39
+
40
+ /** Envelope fields the operations under test read; their schemas pass open objects through. */
41
+ interface OpEnvelope {
42
+ action?: string;
43
+ id?: string;
44
+ title?: string;
45
+ name?: string;
46
+ projectId?: string;
47
+ snapshotJson?: string;
48
+ kind?: string;
49
+ displayName?: string;
50
+ confirm?: string;
51
+ }
52
+
53
+ /** Every registered handler answers with a `result` envelope. */
54
+ interface OpOutput<T> {
55
+ result: T;
56
+ }
57
+
58
+ interface Fixture {
59
+ root: string;
60
+ service: EngramAccessService;
61
+ cleanup: () => Promise<void>;
62
+ }
63
+
64
+ async function createFixture(): Promise<Fixture> {
65
+ const root = await mkdtemp(path.join(tmpdir(), "remnic-b3-fleet-wide-"));
66
+ const orchestrator = new Orchestrator(
67
+ parseConfig({ memoryDir: root, namespacesEnabled: false, defaultNamespace: "global" }),
68
+ );
69
+ const storage = await orchestrator.getStorage();
70
+ await storage.ensureDirectories();
71
+ const service = new EngramAccessService(orchestrator);
72
+ return { root, service, cleanup: () => rm(root, { recursive: true, force: true }) };
73
+ }
74
+
75
+ /** Seed one synthetic record in each global store the nine operations touch. */
76
+ async function seedGlobalRecords(root: string): Promise<void> {
77
+ const work = new WorkStorage(root);
78
+ await work.ensureDirectories();
79
+ await work.createTask({ title: "seeded task", description: "seeded" });
80
+ await work.createProject({ name: "seeded project", description: "seeded" });
81
+ await writePeer(root, {
82
+ id: PEER_ID,
83
+ kind: "agent",
84
+ displayName: "seeded peer",
85
+ createdAt: NOW,
86
+ updatedAt: NOW,
87
+ });
88
+ await writePeerProfile(root, {
89
+ peerId: PEER_ID,
90
+ updatedAt: NOW,
91
+ fields: { communication_style: "seeded" },
92
+ provenance: {},
93
+ });
94
+ }
95
+
96
+ /** Sorted relpath:content lines for every file under root (mutation detector). */
97
+ async function snapshotDir(root: string): Promise<string[]> {
98
+ const entries = await readdir(root, { recursive: true, withFileTypes: true });
99
+ const lines: string[] = [];
100
+ for (const entry of entries) {
101
+ if (!entry.isFile()) continue;
102
+ const abs = path.join(entry.parentPath, entry.name);
103
+ const content = await readFile(abs, "utf8");
104
+ lines.push(`${path.relative(root, abs)}:${content}`);
105
+ }
106
+ return lines.sort();
107
+ }
108
+
109
+ /**
110
+ * Run the real registered operation under an optional capability record.
111
+ * The generic T names the registered handler's documented result shape.
112
+ */
113
+ async function runOp<T>(
114
+ name: GlobalOpName,
115
+ input: OpEnvelope,
116
+ service: EngramAccessService,
117
+ capabilities?: TokenCapabilities,
118
+ ): Promise<OpOutput<T>> {
119
+ const op = getOperation(name);
120
+ assert.ok(op, `operation must be registered: ${name}`);
121
+ const run = () => op.run(input, { service });
122
+ // SAFETY: the boundary validates the envelope, then the handler returns its
123
+ // documented `{ result }` shape; T is that shape as named by the caller.
124
+ const output = (capabilities === undefined ? await run() : await tokenCapabilityStore.run(capabilities, run)) as OpOutput<T>;
125
+ return output;
126
+ }
127
+
128
+ test("B3: a one-namespace token is denied on every global work and peer op BEFORE any read or mutation", async () => {
129
+ const fixture = await createFixture();
130
+ try {
131
+ await seedGlobalRecords(fixture.root);
132
+ const before = await snapshotDir(fixture.root);
133
+
134
+ const mutatingInput = {
135
+ work_task: { action: "create", title: "intruder task" },
136
+ work_project: { action: "create", name: "intruder project" },
137
+ work_board: { action: "import_snapshot", projectId: "proj-x", snapshotJson: "{}" },
138
+ peer_list: {},
139
+ peer_get: { id: PEER_ID },
140
+ peer_set: { id: PEER_ID, displayName: "hijacked" },
141
+ peer_delete: { id: PEER_ID },
142
+ peer_profile_get: { id: PEER_ID },
143
+ peer_forget: { id: PEER_ID, confirm: "yes" },
144
+ };
145
+
146
+ for (const namespaces of [["ns_a"], []]) {
147
+ const caps: TokenCapabilities = { version: 1, namespaces };
148
+ for (const name of GLOBAL_OPS) {
149
+ await assert.rejects(
150
+ () => runOp(name, mutatingInput[name], fixture.service, caps),
151
+ (err: Error) =>
152
+ err instanceof EngramAccessForbiddenError && /scoped to specific namespaces/.test(err.message),
153
+ `${name} must reject a token restricted to ${JSON.stringify(namespaces)}`,
154
+ );
155
+ }
156
+ }
157
+
158
+ const after = await snapshotDir(fixture.root);
159
+ assert.deepEqual(after, before, "denials must not change any file in any global store");
160
+ } finally {
161
+ await fixture.cleanup();
162
+ }
163
+ });
164
+
165
+ test("B3: an ops-scoped token without a namespace axis may use its permitted global ops", async () => {
166
+ const fixture = await createFixture();
167
+ try {
168
+ const caps: TokenCapabilities = { version: 1, ops: [...GLOBAL_OPS] };
169
+
170
+ const created = await runOp<{ task: { id: string } }>(
171
+ "work_task",
172
+ { action: "create", title: "ops token task" },
173
+ fixture.service,
174
+ caps,
175
+ );
176
+ assert.ok(created.result.task.id, "ops-scoped token creates a work task");
177
+
178
+ const listed = await runOp<{ count: number }>("work_task", { action: "list" }, fixture.service, caps);
179
+ assert.equal(listed.result.count, 1, "ops-scoped token reads its own created task");
180
+
181
+ const peer = await runOp<{ created: boolean }>(
182
+ "peer_set",
183
+ { id: "ops-token-peer", kind: "agent" },
184
+ fixture.service,
185
+ caps,
186
+ );
187
+ assert.equal(peer.result.created, true, "ops-scoped token registers a peer");
188
+
189
+ const got = await runOp<{ found: boolean }>("peer_get", { id: "ops-token-peer" }, fixture.service, caps);
190
+ assert.equal(got.result.found, true, "ops-scoped token reads a peer");
191
+
192
+ const forgotten = await runOp<{ purged: boolean }>(
193
+ "peer_forget",
194
+ { id: "ops-token-peer", confirm: "yes" },
195
+ fixture.service,
196
+ caps,
197
+ );
198
+ assert.equal(forgotten.result.purged, true, "ops-scoped token may run the destructive purge it is granted");
199
+ } finally {
200
+ await fixture.cleanup();
201
+ }
202
+ });
203
+
204
+ test("B3: a legacy unrestricted token (no capability record) retains access to global ops", async () => {
205
+ const fixture = await createFixture();
206
+ try {
207
+ await seedGlobalRecords(fixture.root);
208
+
209
+ const listed = await runOp<{ count: number }>("work_task", { action: "list" }, fixture.service);
210
+ assert.equal(listed.result.count, 1, "legacy token lists work tasks");
211
+
212
+ const peers = await runOp<{ peers: { id: string }[] }>("peer_list", {}, fixture.service);
213
+ assert.deepEqual(
214
+ peers.result.peers.map((p) => p.id),
215
+ [PEER_ID],
216
+ "legacy token lists the seeded peer",
217
+ );
218
+ } finally {
219
+ await fixture.cleanup();
220
+ }
221
+ });
222
+
223
+ test("B3: peer_forget confirmation requirement is unchanged through the boundary", async () => {
224
+ const fixture = await createFixture();
225
+ try {
226
+ await seedGlobalRecords(fixture.root);
227
+ await assert.rejects(
228
+ () => runOp("peer_forget", { id: PEER_ID, confirm: "no" }, fixture.service),
229
+ (err: Error) => /confirm must be 'yes'/.test(err.message),
230
+ );
231
+ const files = await snapshotDir(fixture.root);
232
+ assert.ok(files.some((line) => line.includes(`${PEER_ID}/identity.md`)), "peer survives a rejected confirmation");
233
+ } finally {
234
+ await fixture.cleanup();
235
+ }
236
+ });