@remnic/core 9.69.39 → 9.69.41

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 (774) hide show
  1. package/dist/access-admin-ops-surface.d.ts +16 -14
  2. package/dist/access-admin-ops-surface.js +75 -74
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +16 -14
  5. package/dist/access-authorization-probe.js +76 -75
  6. package/dist/access-boundary.d.ts +16 -14
  7. package/dist/access-boundary.js +75 -74
  8. package/dist/access-cli.js +173 -170
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +1 -1
  11. package/dist/access-extraction-force-flush.d.ts +16 -14
  12. package/dist/access-extraction-force-flush.js +75 -74
  13. package/dist/access-health-types.d.ts +1 -1
  14. package/dist/access-http-briefing.d.ts +16 -14
  15. package/dist/access-http-briefing.js +76 -75
  16. package/dist/access-http-lcm-compaction.d.ts +16 -14
  17. package/dist/access-http-lifecycle-flush.d.ts +16 -14
  18. package/dist/access-http-offline-stream.d.ts +16 -14
  19. package/dist/access-http-query.d.ts +2 -2
  20. package/dist/access-http-query.js +77 -76
  21. package/dist/access-http.d.ts +17 -15
  22. package/dist/access-http.js +95 -92
  23. package/dist/access-identity-continuity-surface.d.ts +13 -12
  24. package/dist/access-identity-continuity-surface.js +75 -74
  25. package/dist/access-lcm-surface.d.ts +16 -14
  26. package/dist/access-lcm-surface.js +75 -74
  27. package/dist/access-mcp-shared-context-tools.d.ts +156 -0
  28. package/dist/access-mcp-shared-context-tools.js +8 -0
  29. package/dist/access-mcp.d.ts +16 -14
  30. package/dist/access-mcp.js +86 -83
  31. package/dist/access-memory-search-fanout.d.ts +2 -2
  32. package/dist/{access-namespace-preflight-DY4z6L5X.d.ts → access-namespace-preflight-DWsMc9Dh.d.ts} +1 -1
  33. package/dist/access-namespace-preflight.d.ts +3 -3
  34. package/dist/access-namespace-preflight.js +75 -74
  35. package/dist/access-observe-transcript.d.ts +13 -12
  36. package/dist/access-observe-write-category.d.ts +1 -1
  37. package/dist/access-observe-write-category.js +4 -4
  38. package/dist/access-observe-write-surface.d.ts +16 -14
  39. package/dist/access-observe-write-surface.js +75 -74
  40. package/dist/access-offline-manifest.d.ts +37 -13
  41. package/dist/access-offline-manifest.js +15 -11
  42. package/dist/access-operations-batch.js +79 -77
  43. package/dist/access-operations.d.ts +16 -14
  44. package/dist/access-operations.js +84 -82
  45. package/dist/access-recall-concurrency.d.ts +16 -14
  46. package/dist/access-recall-concurrency.js +75 -74
  47. package/dist/access-recall-response.d.ts +16 -14
  48. package/dist/access-recall-response.js +75 -74
  49. package/dist/access-recall-surface.d.ts +16 -14
  50. package/dist/access-recall-surface.js +75 -74
  51. package/dist/access-schema.d.ts +5 -3
  52. package/dist/access-schema.js +3 -3
  53. package/dist/{access-service-MY4bsr_Q.d.ts → access-service-Cisy5YDq.d.ts} +14 -9
  54. package/dist/access-service-helpers.d.ts +16 -14
  55. package/dist/access-service.d.ts +16 -14
  56. package/dist/access-service.js +75 -74
  57. package/dist/access-surface-catalog.d.ts +16 -14
  58. package/dist/access-surface-catalog.js +77 -76
  59. package/dist/access-surface-catalog.js.map +1 -1
  60. package/dist/access-wearables-meetings-surface.d.ts +6 -5
  61. package/dist/action-confidence.d.ts +1 -1
  62. package/dist/active-memory-bridge.d.ts +1 -1
  63. package/dist/active-memory-bridge.js +3 -3
  64. package/dist/active-recall.d.ts +1 -1
  65. package/dist/active-recall.js +10 -9
  66. package/dist/active-recall.js.map +1 -1
  67. package/dist/activity/digest.d.ts +1 -1
  68. package/dist/ambient-provenance.d.ts +1 -1
  69. package/dist/artifact-search.d.ts +1 -1
  70. package/dist/{auto-sync-RP4C6ZPF.js → auto-sync-7PGUFY7U.js} +7 -7
  71. package/dist/background-generation-config.d.ts +1 -1
  72. package/dist/background-generation-config.js +3 -1
  73. package/dist/background-generation.d.ts +1 -1
  74. package/dist/behavior-learner.d.ts +1 -1
  75. package/dist/behavior-signals.d.ts +1 -1
  76. package/dist/bootstrap.d.ts +13 -12
  77. package/dist/briefing-window.d.ts +2 -2
  78. package/dist/briefing.d.ts +2 -2
  79. package/dist/briefing.js +23 -23
  80. package/dist/buffer-surprise-report.d.ts +1 -1
  81. package/dist/buffer-turn-helpers.d.ts +1 -1
  82. package/dist/buffer.d.ts +2 -2
  83. package/dist/buffer.js +7 -7
  84. package/dist/bulk-import/index.d.ts +3 -3
  85. package/dist/calibration.d.ts +3 -2
  86. package/dist/calibration.js +2 -2
  87. package/dist/capabilities.d.ts +1 -1
  88. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  89. package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-3MNURAQ3.js} +2 -2
  90. package/dist/{catalog-CW87xGx8.d.ts → catalog-wcX1QhtQ.d.ts} +1 -1
  91. package/dist/causal-behavior.d.ts +1 -1
  92. package/dist/causal-consolidation.d.ts +1 -1
  93. package/dist/causal-consolidation.js +29 -28
  94. package/dist/causal-consolidation.js.map +1 -1
  95. package/dist/causal-trajectory-graph.d.ts +1 -1
  96. package/dist/{chunk-YFTNZMGR.js → chunk-27NO2KVB.js} +31 -8
  97. package/dist/chunk-27NO2KVB.js.map +1 -0
  98. package/dist/{chunk-M6RORUO5.js → chunk-2EYZ32LH.js} +24 -2
  99. package/dist/{chunk-M6RORUO5.js.map → chunk-2EYZ32LH.js.map} +1 -1
  100. package/dist/{chunk-XH3HGI2N.js → chunk-2HQPE2NM.js} +2 -2
  101. package/dist/{chunk-3EKVN2OP.js → chunk-2ZG2LLZT.js} +2 -2
  102. package/dist/{chunk-6EHM2AV7.js → chunk-3BLHPQHT.js} +5 -5
  103. package/dist/{chunk-YKREX63Z.js → chunk-3D75XIYO.js} +5 -3
  104. package/dist/chunk-3D75XIYO.js.map +1 -0
  105. package/dist/{chunk-J272ODKJ.js → chunk-42DJ235G.js} +2 -2
  106. package/dist/{chunk-F4EHXVP7.js → chunk-46RII65S.js} +2 -2
  107. package/dist/{chunk-YUW66UAH.js → chunk-4AX5OYKC.js} +2 -2
  108. package/dist/{chunk-AECJY3GJ.js → chunk-4IGOLIWM.js} +2 -2
  109. package/dist/{chunk-2ZTDRNCS.js → chunk-54QPOE45.js} +2 -2
  110. package/dist/{chunk-O4M4BDIJ.js → chunk-563X6JJX.js} +2 -2
  111. package/dist/{chunk-IL6ODG6M.js → chunk-5EQT62HH.js} +2 -2
  112. package/dist/{chunk-JKKII6GX.js → chunk-6MQMYXSQ.js} +2 -2
  113. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  114. package/dist/{chunk-BV4ZKIZH.js → chunk-7ZLC4DTZ.js} +5 -4
  115. package/dist/{chunk-WBM2MVBK.js → chunk-A4OIJYCV.js} +2 -2
  116. package/dist/{chunk-RLJHJQUY.js → chunk-AFJHNHAM.js} +8 -8
  117. package/dist/{chunk-6YAIN5XJ.js → chunk-AIVRD66I.js} +44 -6
  118. package/dist/chunk-AIVRD66I.js.map +1 -0
  119. package/dist/{chunk-OEDW4ER7.js → chunk-AJBWVDRV.js} +2 -1
  120. package/dist/chunk-AJBWVDRV.js.map +1 -0
  121. package/dist/{chunk-4RZLTZVM.js → chunk-AKABVXFS.js} +2 -2
  122. package/dist/{chunk-M6HBPLBA.js → chunk-AUSRUOMQ.js} +2 -2
  123. package/dist/{chunk-QHT7MOUF.js → chunk-BTPCP535.js} +25 -14
  124. package/dist/chunk-BTPCP535.js.map +1 -0
  125. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  126. package/dist/{chunk-Q7CLGFA7.js → chunk-C3G6MW4W.js} +3 -3
  127. package/dist/{chunk-O76F5QPP.js → chunk-D6PY63OM.js} +2 -2
  128. package/dist/{chunk-BD7JTBYP.js → chunk-D7MAYFQP.js} +2 -2
  129. package/dist/{chunk-LMLGBG6H.js → chunk-DBB5JPSL.js} +2 -2
  130. package/dist/{chunk-TSP5WH72.js → chunk-DIXZQTGY.js} +2 -2
  131. package/dist/{chunk-P4ZAEYKG.js → chunk-DM5CU5J7.js} +7 -4
  132. package/dist/chunk-DM5CU5J7.js.map +1 -0
  133. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  134. package/dist/{chunk-UHRZ324M.js → chunk-E3I3NDUP.js} +4 -4
  135. package/dist/{chunk-AENM6GKU.js → chunk-E4LMQTST.js} +2 -2
  136. package/dist/{chunk-YDVAM7S4.js → chunk-EH3HNCAM.js} +13 -8
  137. package/dist/chunk-EH3HNCAM.js.map +1 -0
  138. package/dist/{chunk-MUTVRKKY.js → chunk-EMSYMYXO.js} +14 -14
  139. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  140. package/dist/{chunk-FXHOZGSE.js → chunk-F5H6YG5P.js} +2 -2
  141. package/dist/{chunk-TRLOFIQC.js → chunk-FGFC2EFR.js} +14 -13
  142. package/dist/chunk-FGFC2EFR.js.map +1 -0
  143. package/dist/{chunk-TNSCIPBQ.js → chunk-G6NQ3L4T.js} +2 -2
  144. package/dist/{chunk-ZMWSYUUL.js → chunk-GCBIXUPT.js} +2 -2
  145. package/dist/{chunk-EYKIDK33.js → chunk-GMH5QPUU.js} +22 -22
  146. package/dist/chunk-GMH5QPUU.js.map +1 -0
  147. package/dist/{chunk-4BCHFSC7.js → chunk-GWNSKQDA.js} +3 -3
  148. package/dist/{chunk-JDX2OA4R.js → chunk-HNHIHXSD.js} +2 -2
  149. package/dist/{chunk-GG5FHZJJ.js → chunk-I33QYUAF.js} +6 -6
  150. package/dist/{chunk-LPYYY4AP.js → chunk-I46BYY7U.js} +653 -328
  151. package/dist/chunk-I46BYY7U.js.map +1 -0
  152. package/dist/{chunk-CZTPU65V.js → chunk-ICN37XHG.js} +74 -27
  153. package/dist/chunk-ICN37XHG.js.map +1 -0
  154. package/dist/chunk-IFBSZGW3.js +42 -0
  155. package/dist/chunk-IFBSZGW3.js.map +1 -0
  156. package/dist/{chunk-AAZEKXUP.js → chunk-IYIPXAIJ.js} +2 -2
  157. package/dist/{chunk-ACY4ZPF7.js → chunk-J2MGTGKC.js} +10 -5
  158. package/dist/chunk-J2MGTGKC.js.map +1 -0
  159. package/dist/chunk-JATHBCAV.js +94 -0
  160. package/dist/chunk-JATHBCAV.js.map +1 -0
  161. package/dist/{chunk-5U7K4W6K.js → chunk-JDOBQPJY.js} +3 -3
  162. package/dist/{chunk-TG3FAM2S.js → chunk-JL4TQYM5.js} +48 -1
  163. package/dist/{chunk-TG3FAM2S.js.map → chunk-JL4TQYM5.js.map} +1 -1
  164. package/dist/{chunk-UZZ7SQT3.js → chunk-JMWUPUE6.js} +2 -2
  165. package/dist/{chunk-ENBPQEVU.js → chunk-JSD7Q7LD.js} +2 -2
  166. package/dist/{chunk-QTQ6XKGT.js → chunk-K5D2XVNN.js} +4 -4
  167. package/dist/chunk-K5D2XVNN.js.map +1 -0
  168. package/dist/{chunk-3CBI2ZSA.js → chunk-KG2OOAFF.js} +20 -12
  169. package/dist/chunk-KG2OOAFF.js.map +1 -0
  170. package/dist/{chunk-Q432REND.js → chunk-KJLLPG26.js} +2 -2
  171. package/dist/{chunk-JTQR6L2N.js → chunk-KLUC2GSG.js} +6 -6
  172. package/dist/{chunk-OB3XMWX5.js → chunk-KVO2BTA4.js} +2 -2
  173. package/dist/{chunk-PCOVEDPK.js → chunk-KZJM7R4F.js} +3 -3
  174. package/dist/{chunk-X4TD4O2F.js → chunk-LE2KZ72G.js} +3 -3
  175. package/dist/{chunk-HIP6DKJJ.js → chunk-LQVXSRAJ.js} +2 -2
  176. package/dist/{chunk-A7GQBJP5.js → chunk-LVFI5LG7.js} +7 -7
  177. package/dist/{chunk-FWWWUPOE.js → chunk-MCMS4VUK.js} +25 -15
  178. package/dist/chunk-MCMS4VUK.js.map +1 -0
  179. package/dist/{chunk-5SPCMAUC.js → chunk-N6XTC56E.js} +13 -81
  180. package/dist/chunk-N6XTC56E.js.map +1 -0
  181. package/dist/{chunk-VBSNUH4J.js → chunk-ND7MAIJC.js} +2 -2
  182. package/dist/{chunk-TNZNSMVJ.js → chunk-NYWCFC3K.js} +301 -348
  183. package/dist/chunk-NYWCFC3K.js.map +1 -0
  184. package/dist/{chunk-54NX5EG4.js → chunk-P66QH6R6.js} +2 -2
  185. package/dist/{chunk-62D2PAAM.js → chunk-PAAJWQH5.js} +4 -4
  186. package/dist/{chunk-TA4C3XB7.js → chunk-PFKIOYJH.js} +2 -2
  187. package/dist/{chunk-WIWLX65T.js → chunk-PGGPRF6J.js} +2 -2
  188. package/dist/{chunk-V6EGNVUT.js → chunk-PIWFNPQT.js} +4 -4
  189. package/dist/{chunk-BLDBT6HZ.js → chunk-PJRKLB4Z.js} +18 -2
  190. package/dist/chunk-PJRKLB4Z.js.map +1 -0
  191. package/dist/{chunk-4JVQRFZD.js → chunk-PLJ2MQFT.js} +11 -11
  192. package/dist/{chunk-4RX5O34R.js → chunk-PQ42DJNG.js} +2 -2
  193. package/dist/{chunk-37CAEC7E.js → chunk-PWPIERBM.js} +4 -4
  194. package/dist/{chunk-ZEGL7YCC.js → chunk-Q62GA5U2.js} +2 -2
  195. package/dist/{chunk-CC37E3QM.js → chunk-QKCXRS5A.js} +16 -1
  196. package/dist/chunk-QKCXRS5A.js.map +1 -0
  197. package/dist/{chunk-WKDFJXW5.js → chunk-QM2SPLKQ.js} +1 -1
  198. package/dist/chunk-QM2SPLKQ.js.map +1 -0
  199. package/dist/{chunk-GAS7KYC7.js → chunk-RQQO3ORQ.js} +2 -2
  200. package/dist/{chunk-UZEHHXYC.js → chunk-S4MJTIPG.js} +85 -81
  201. package/dist/chunk-S4MJTIPG.js.map +1 -0
  202. package/dist/chunk-SK7D34OL.js +68 -0
  203. package/dist/chunk-SK7D34OL.js.map +1 -0
  204. package/dist/{chunk-LQNRVPTV.js → chunk-TRTLWUDD.js} +164 -130
  205. package/dist/chunk-TRTLWUDD.js.map +1 -0
  206. package/dist/{chunk-JXN77SGO.js → chunk-U2VDCFXW.js} +1 -1
  207. package/dist/chunk-U2VDCFXW.js.map +1 -0
  208. package/dist/{chunk-CWTCMZGE.js → chunk-UHSOPTNB.js} +132 -6
  209. package/dist/chunk-UHSOPTNB.js.map +1 -0
  210. package/dist/{chunk-3NPNBVFR.js → chunk-UZGHKD3T.js} +2 -2
  211. package/dist/{chunk-IQEJIOEU.js → chunk-V2EXYQEQ.js} +20 -12
  212. package/dist/chunk-V2EXYQEQ.js.map +1 -0
  213. package/dist/{chunk-OPBFP4TF.js → chunk-V2TOGJPM.js} +46 -13
  214. package/dist/chunk-V2TOGJPM.js.map +1 -0
  215. package/dist/{chunk-VJIE4D2I.js → chunk-V62YYBBY.js} +4 -4
  216. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  217. package/dist/{chunk-6H2G7RFT.js → chunk-VNQRRUNS.js} +11 -10
  218. package/dist/chunk-VNQRRUNS.js.map +1 -0
  219. package/dist/{chunk-6AGWBKQU.js → chunk-VSN2DMQK.js} +2 -2
  220. package/dist/{chunk-ZHXSOMYH.js → chunk-VVX5PZFS.js} +2 -2
  221. package/dist/{chunk-GI4ZBWPQ.js → chunk-W7UV2ZCA.js} +3 -3
  222. package/dist/{chunk-GMIQV6DD.js → chunk-WBQ4ONQJ.js} +2 -2
  223. package/dist/{chunk-FNHLI2RE.js → chunk-WFMQN7JE.js} +3 -3
  224. package/dist/{chunk-MVAQ2WM3.js → chunk-WGZHSQDV.js} +9 -5
  225. package/dist/chunk-WGZHSQDV.js.map +1 -0
  226. package/dist/{chunk-IYKZJVL5.js → chunk-WN2OXGGH.js} +1 -1
  227. package/dist/chunk-WN2OXGGH.js.map +1 -0
  228. package/dist/{chunk-ZBW7A667.js → chunk-WPGA4RYI.js} +2 -2
  229. package/dist/{chunk-YQNNHLCG.js → chunk-WPGR3RW4.js} +2 -2
  230. package/dist/{chunk-SV4Z2S67.js → chunk-WUUGE7QC.js} +54 -21
  231. package/dist/chunk-WUUGE7QC.js.map +1 -0
  232. package/dist/{chunk-NXGSONWM.js → chunk-WZIO3TW6.js} +2 -2
  233. package/dist/{chunk-ZZUVBZL2.js → chunk-X2QPKLPL.js} +2 -2
  234. package/dist/{chunk-5HYUUFMQ.js → chunk-XCPNH2MG.js} +259 -10
  235. package/dist/chunk-XCPNH2MG.js.map +1 -0
  236. package/dist/{chunk-VSL63CFJ.js → chunk-XRS65T4O.js} +9 -9
  237. package/dist/{chunk-5N4MZLEH.js → chunk-YFXAWGMR.js} +2 -2
  238. package/dist/{chunk-KQW3YGEN.js → chunk-YR5QT4SR.js} +32 -9
  239. package/dist/chunk-YR5QT4SR.js.map +1 -0
  240. package/dist/{chunk-CARRTDKC.js → chunk-Z22M4JCY.js} +4 -3
  241. package/dist/chunk-Z22M4JCY.js.map +1 -0
  242. package/dist/{chunk-D545Z7UH.js → chunk-Z535ADTC.js} +3 -3
  243. package/dist/{chunk-B36GUU6T.js → chunk-Z7NBT6AK.js} +38 -5
  244. package/dist/chunk-Z7NBT6AK.js.map +1 -0
  245. package/dist/{chunk-5YCNDC3C.js → chunk-ZX6NNFSY.js} +3 -3
  246. package/dist/{chunk-3N3PBBEH.js → chunk-ZYSOT6HD.js} +2 -2
  247. package/dist/{chunk-MCRVQ5YQ.js → chunk-ZZEIL3MI.js} +2 -2
  248. package/dist/{cli-DGq0MNpO.d.ts → cli-CUlMlS2N.d.ts} +5 -5
  249. package/dist/cli.d.ts +18 -16
  250. package/dist/cli.js +129 -126
  251. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  252. package/dist/coding/export-okf-codegraph.js +22 -22
  253. package/dist/coding/pre-action-gate.d.ts +1 -1
  254. package/dist/compounding/engine.d.ts +2 -2
  255. package/dist/compounding/engine.js +25 -25
  256. package/dist/compounding/preference-consolidator.d.ts +1 -1
  257. package/dist/compression-optimizer.d.ts +1 -1
  258. package/dist/config.d.ts +1 -1
  259. package/dist/config.js +10 -9
  260. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  261. package/dist/connectors/codex-materialize-runner.js +25 -25
  262. package/dist/connectors/codex-materialize.d.ts +1 -1
  263. package/dist/connectors/codex-materialize.js +2 -2
  264. package/dist/connectors/index.d.ts +1 -1
  265. package/dist/connectors/index.js +25 -25
  266. package/dist/consolidation-provenance-check.d.ts +2 -2
  267. package/dist/consolidation-undo.d.ts +2 -2
  268. package/dist/contradiction/index.d.ts +6 -5
  269. package/dist/contradiction/index.js +4 -4
  270. package/dist/{contradiction-scan-BSGKZHYJ.js → contradiction-scan-GVD4JJ7B.js} +4 -4
  271. package/dist/converge-config.d.ts +1 -1
  272. package/dist/convergence-refresh.d.ts +2 -2
  273. package/dist/convergence-refresh.js +26 -26
  274. package/dist/conversation-index/backend.d.ts +1 -1
  275. package/dist/conversation-index/chunker.d.ts +1 -1
  276. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  277. package/dist/conversation-index/indexer.d.ts +1 -1
  278. package/dist/conversation-index/search.d.ts +1 -1
  279. package/dist/corpus-watermark.d.ts +1 -1
  280. package/dist/corpus-watermark.js +25 -25
  281. package/dist/cross-lingual-recall.d.ts +1 -1
  282. package/dist/dashboard-runtime.js +2 -2
  283. package/dist/day-summary.d.ts +1 -1
  284. package/dist/deep-recall-config.d.ts +12 -1
  285. package/dist/deep-recall-config.js +5 -3
  286. package/dist/deep-recall-http-glue.d.ts +19 -15
  287. package/dist/deep-recall-http-glue.js +7 -4
  288. package/dist/deep-recall-mcp-tools.d.ts +16 -14
  289. package/dist/deep-recall-policy-llm.d.ts +14 -3
  290. package/dist/deep-recall-policy-llm.js +3 -3
  291. package/dist/deep-recall-seeds.d.ts +4 -1
  292. package/dist/deep-recall-seeds.js +1 -1
  293. package/dist/deep-recall.d.ts +12 -1
  294. package/dist/deep-recall.js +3 -2
  295. package/dist/delinearize.d.ts +1 -1
  296. package/dist/dependency-propagation-config.d.ts +1 -1
  297. package/dist/{dependency-propagation-delivery-Cq1ekOwV.d.ts → dependency-propagation-delivery-BDDjImQn.d.ts} +1 -1
  298. package/dist/direct-answer-wiring.d.ts +1 -1
  299. package/dist/direct-answer.d.ts +1 -1
  300. package/dist/embedding-fallback.d.ts +1 -1
  301. package/dist/enrichment/index.d.ts +1 -1
  302. package/dist/entity-origin-fields.d.ts +1 -1
  303. package/dist/entity-retrieval.d.ts +2 -2
  304. package/dist/entity-retrieval.js +24 -24
  305. package/dist/entity-schema.d.ts +1 -1
  306. package/dist/episodic-context.d.ts +1 -1
  307. package/dist/eval-trajectory-contracts.d.ts +1 -1
  308. package/dist/eval-trajectory-store.d.ts +1 -1
  309. package/dist/eval-trajectory.d.ts +1 -1
  310. package/dist/explicit-capture.d.ts +13 -12
  311. package/dist/explicit-capture.js +3 -3
  312. package/dist/external-wiki-access.d.ts +16 -14
  313. package/dist/external-wiki-access.js +76 -75
  314. package/dist/external-wiki-collection-registration.d.ts +1 -1
  315. package/dist/external-wiki-collection.d.ts +1 -1
  316. package/dist/external-wiki-mcp-tools.d.ts +16 -14
  317. package/dist/extraction-error-classification.d.ts +14 -3
  318. package/dist/extraction-error-classification.js +5 -3
  319. package/dist/extraction-faithfulness.d.ts +4 -3
  320. package/dist/extraction-faithfulness.js +3 -3
  321. package/dist/extraction-judge-telemetry.d.ts +4 -3
  322. package/dist/extraction-judge-training.d.ts +4 -3
  323. package/dist/extraction-judge.d.ts +4 -3
  324. package/dist/extraction-judge.js +3 -3
  325. package/dist/extraction-liveness.d.ts +1 -1
  326. package/dist/extraction-normalization.d.ts +1 -1
  327. package/dist/extraction-prompt.d.ts +1 -1
  328. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  329. package/dist/extraction-source-grounding.d.ts +1 -1
  330. package/dist/extraction-span-config.d.ts +1 -1
  331. package/dist/extraction-span-materialize.d.ts +1 -1
  332. package/dist/extraction.d.ts +4 -4
  333. package/dist/extraction.js +40 -38
  334. package/dist/fallback-llm-codex-subscription.d.ts +65 -10
  335. package/dist/fallback-llm-codex-subscription.js +19 -1
  336. package/dist/fallback-llm.d.ts +25 -28
  337. package/dist/fallback-llm.js +4 -3
  338. package/dist/{first-start-migration-ZWMV5CX4.js → first-start-migration-L3UFX5CU.js} +4 -4
  339. package/dist/{generic-recall-paths-BcySh_f9.d.ts → generic-recall-paths-CpDzNO_I.d.ts} +1 -1
  340. package/dist/graph-append-error.d.ts +1 -1
  341. package/dist/graph-dashboard-diff.d.ts +1 -1
  342. package/dist/graph-dashboard-key.d.ts +1 -1
  343. package/dist/graph-dashboard-parser.d.ts +1 -1
  344. package/dist/graph-edge-reinforcement.d.ts +1 -1
  345. package/dist/graph-jsonl.d.ts +1 -1
  346. package/dist/graph-path-reconstruction.d.ts +1 -1
  347. package/dist/graph-path-scoring.d.ts +1 -1
  348. package/dist/graph-snapshot.d.ts +1 -1
  349. package/dist/graph.d.ts +1 -1
  350. package/dist/harmonic-retrieval.js +3 -3
  351. package/dist/importance.d.ts +1 -1
  352. package/dist/importers/index.d.ts +1 -1
  353. package/dist/importers/test-utils.d.ts +1 -1
  354. package/dist/in-flight-reads.d.ts +1 -1
  355. package/dist/{index-DWOb4wz9.d.ts → index-CtmmCJoo.d.ts} +3 -3
  356. package/dist/index.d.ts +80 -40
  357. package/dist/index.js +316 -296
  358. package/dist/intent.d.ts +1 -1
  359. package/dist/lcm/engine.d.ts +1 -1
  360. package/dist/lcm/engine.js +3 -3
  361. package/dist/lcm/index.d.ts +1 -1
  362. package/dist/lcm/index.js +11 -11
  363. package/dist/lcm/tools.d.ts +1 -1
  364. package/dist/lifecycle.d.ts +1 -1
  365. package/dist/live-connectors-runner.d.ts +1 -1
  366. package/dist/local-llm-DpXIvm6F.d.ts +247 -0
  367. package/dist/local-llm-config.d.ts +4 -1
  368. package/dist/local-llm-config.js +4 -2
  369. package/dist/local-llm-helpers.d.ts +18 -69
  370. package/dist/local-llm-helpers.js +1 -1
  371. package/dist/local-llm.d.ts +3 -170
  372. package/dist/local-llm.js +2 -2
  373. package/dist/local-model-endpoint.d.ts +1 -1
  374. package/dist/location/index.d.ts +3 -3
  375. package/dist/location/index.js +25 -25
  376. package/dist/maintenance/memory-governance.d.ts +1 -1
  377. package/dist/maintenance/memory-governance.js +24 -24
  378. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  379. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +23 -23
  380. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  381. package/dist/maintenance/rebuild-memory-projection.js +25 -25
  382. package/dist/{maintenance-CW9wCzMP.d.ts → maintenance-CNgoLsoM.d.ts} +13 -6
  383. package/dist/mcp-memory-inspector-app.d.ts +16 -14
  384. package/dist/memory-action-policy.d.ts +1 -1
  385. package/dist/memory-cache.d.ts +1 -1
  386. package/dist/memory-controller.d.ts +1 -1
  387. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  388. package/dist/memory-projection-store.d.ts +1 -1
  389. package/dist/memory-provenance.d.ts +1 -1
  390. package/dist/memory-snapshot.d.ts +1 -1
  391. package/dist/memory-subject-cli.d.ts +16 -14
  392. package/dist/memory-subject.d.ts +16 -14
  393. package/dist/memory-worth-outcomes.d.ts +2 -2
  394. package/dist/models-json.d.ts +1 -1
  395. package/dist/namespaces/migrate.d.ts +3 -3
  396. package/dist/namespaces/migrate.js +24 -24
  397. package/dist/namespaces/principal.d.ts +1 -1
  398. package/dist/namespaces/search.d.ts +12 -1
  399. package/dist/namespaces/search.js +9 -9
  400. package/dist/namespaces/storage.d.ts +3 -3
  401. package/dist/namespaces/storage.js +23 -23
  402. package/dist/native-knowledge.d.ts +1 -1
  403. package/dist/offline-sync-impression-drain.d.ts +1 -1
  404. package/dist/operator-doctor-corpus.d.ts +1 -1
  405. package/dist/operator-doctor-corpus.js +26 -26
  406. package/dist/operator-doctor-replica.d.ts +1 -1
  407. package/dist/operator-toolkit.d.ts +3 -3
  408. package/dist/operator-toolkit.js +45 -44
  409. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  410. package/dist/orchestration/maintenance.d.ts +4 -4
  411. package/dist/orchestration/maintenance.js +36 -36
  412. package/dist/{orchestrator-ComHLm49.d.ts → orchestrator-DT7ybIFz.d.ts} +32 -11
  413. package/dist/orchestrator.d.ts +13 -12
  414. package/dist/orchestrator.js +176 -171
  415. package/dist/patterns-cli.d.ts +1 -1
  416. package/dist/{pipeline-CiYcqqhl.d.ts → pipeline-CgBEmHcz.d.ts} +1 -1
  417. package/dist/policy-runtime.d.ts +1 -1
  418. package/dist/proactive-contention.d.ts +2 -2
  419. package/dist/provenance.d.ts +1 -1
  420. package/dist/{public-http-CuK4_Cb1.d.ts → public-http-C8P8fyiO.d.ts} +1 -1
  421. package/dist/{qmd-qXD4vatU.d.ts → qmd-BkY8KpCh.d.ts} +2 -2
  422. package/dist/qmd-preflight.d.ts +2 -2
  423. package/dist/qmd-recall-cache.d.ts +1 -1
  424. package/dist/qmd.d.ts +2 -2
  425. package/dist/qmd.js +2 -2
  426. package/dist/recall-concurrency-config.d.ts +1 -1
  427. package/dist/recall-disclosure-escalation.d.ts +1 -1
  428. package/dist/recall-explain-renderer.d.ts +1 -1
  429. package/dist/recall-explain-renderer.js +3 -3
  430. package/dist/recall-memory-map.d.ts +1 -1
  431. package/dist/recall-navigate-access.d.ts +1 -1
  432. package/dist/recall-navigate-access.js +2 -2
  433. package/dist/recall-navigate-disclosure.d.ts +1 -1
  434. package/dist/recall-navigate-disclosure.js +1 -1
  435. package/dist/recall-navigate.d.ts +1 -1
  436. package/dist/recall-navigate.js +2 -2
  437. package/dist/recall-planner-llm.d.ts +3 -2
  438. package/dist/recall-planner-llm.js +4 -3
  439. package/dist/recall-planner-llm.js.map +1 -1
  440. package/dist/recall-state-view-admission.d.ts +13 -3
  441. package/dist/recall-state-view-admission.js +9 -9
  442. package/dist/recall-state-view-anchors.d.ts +1 -1
  443. package/dist/recall-state-view-anchors.js +2 -2
  444. package/dist/recall-state-view-inject.js +2 -2
  445. package/dist/recall-state-view-render.js +2 -2
  446. package/dist/recall-state-view-widen.js +2 -2
  447. package/dist/recall-state-view-wire.js +3 -3
  448. package/dist/recall-state-view.d.ts +10 -1
  449. package/dist/recall-state-view.js +5 -3
  450. package/dist/recall-state.d.ts +1 -1
  451. package/dist/recall-tag-filter.d.ts +1 -1
  452. package/dist/recall-timings.d.ts +1 -1
  453. package/dist/recall-xray-cli.d.ts +1 -1
  454. package/dist/recall-xray-cli.js +4 -4
  455. package/dist/recall-xray-renderer.d.ts +1 -1
  456. package/dist/recall-xray-renderer.js +3 -3
  457. package/dist/recall-xray.d.ts +1 -1
  458. package/dist/recall-xray.js +2 -2
  459. package/dist/reconcile/cursor.d.ts +1 -1
  460. package/dist/reconcile/cursor.js +2 -2
  461. package/dist/reconcile/manifest.d.ts +1 -1
  462. package/dist/reconcile/manifest.js +4 -4
  463. package/dist/reconcile/plan.d.ts +1 -1
  464. package/dist/reconcile/plan.js +2 -2
  465. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  466. package/dist/replay/normalizers/claude.d.ts +1 -1
  467. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  468. package/dist/replay/normalizers/shared.d.ts +1 -1
  469. package/dist/replay/runner.d.ts +1 -1
  470. package/dist/replay/types.d.ts +1 -1
  471. package/dist/replica-divergence.d.ts +1 -1
  472. package/dist/replica-peers-config.d.ts +1 -1
  473. package/dist/{resolution-4GG3QZRJ.js → resolution-LXFQQ4AE.js} +5 -5
  474. package/dist/resolution-LXFQQ4AE.js.map +1 -0
  475. package/dist/resolve-auth-token.d.ts +1 -1
  476. package/dist/resume-bundles.js +12 -11
  477. package/dist/retrieval-agents.d.ts +2 -2
  478. package/dist/retrieval-tiers.d.ts +1 -1
  479. package/dist/routing/engine.d.ts +1 -1
  480. package/dist/routing/store.d.ts +1 -1
  481. package/dist/salvage-envelope.d.ts +1 -1
  482. package/dist/{scope-profiles-BT9rqC3w.d.ts → scope-profiles-BBPjZ9jb.d.ts} +1 -1
  483. package/dist/search/embed-helper.d.ts +1 -1
  484. package/dist/search/factory.d.ts +1 -1
  485. package/dist/search/factory.js +8 -8
  486. package/dist/search/index.d.ts +1 -1
  487. package/dist/search/index.js +12 -12
  488. package/dist/search/lancedb-backend.d.ts +1 -1
  489. package/dist/search/lancedb-backend.js +2 -2
  490. package/dist/search/meilisearch-backend.d.ts +1 -1
  491. package/dist/search/meilisearch-backend.js +2 -2
  492. package/dist/search/noop-backend.d.ts +1 -1
  493. package/dist/search/orama-backend.d.ts +1 -1
  494. package/dist/search/orama-backend.js +2 -2
  495. package/dist/search/port.d.ts +2 -2
  496. package/dist/search/port.js +1 -1
  497. package/dist/search/remote-backend.d.ts +1 -1
  498. package/dist/search/remote-backend.js +2 -2
  499. package/dist/{semantic-consolidation-CmZi7thY.d.ts → semantic-consolidation-BPFFVO84.d.ts} +1 -1
  500. package/dist/semantic-consolidation.d.ts +2 -2
  501. package/dist/semantic-consolidation.js +26 -26
  502. package/dist/semantic-rule-promotion.js +23 -23
  503. package/dist/semantic-rule-verifier.d.ts +1 -1
  504. package/dist/semantic-rule-verifier.js +23 -23
  505. package/dist/{service-CLkA7AQB.d.ts → service-jKcr6Jvr.d.ts} +2 -2
  506. package/dist/session-observer-bands.d.ts +1 -1
  507. package/dist/session-observer-state.d.ts +1 -1
  508. package/dist/shared-context/manager.d.ts +1 -1
  509. package/dist/shared-context/manager.js +2 -2
  510. package/dist/shared-context/write-output-controls.d.ts +34 -0
  511. package/dist/shared-context/write-output-controls.js +10 -0
  512. package/dist/shared-context/write-output-controls.js.map +1 -0
  513. package/dist/signal.d.ts +1 -1
  514. package/dist/source-agent-qualifier.d.ts +1 -1
  515. package/dist/source-agent-qualifier.js +31 -31
  516. package/dist/source-attribution.d.ts +23 -1
  517. package/dist/source-attribution.js +13 -3
  518. package/dist/standup/build.js +23 -23
  519. package/dist/{storage-wvX01lht.d.ts → storage-C-0Ah5OY.d.ts} +2 -1
  520. package/dist/storage.d.ts +2 -2
  521. package/dist/storage.js +22 -22
  522. package/dist/subject-config.d.ts +1 -1
  523. package/dist/summarizer.d.ts +1 -1
  524. package/dist/summarizer.js +6 -6
  525. package/dist/summary-snapshot.d.ts +1 -1
  526. package/dist/support-passport/index.d.ts +18 -17
  527. package/dist/support-passport/index.js +78 -77
  528. package/dist/task-llm-config.d.ts +16 -0
  529. package/dist/task-llm-config.js +12 -0
  530. package/dist/task-llm-config.js.map +1 -0
  531. package/dist/temporal-supersession.d.ts +2 -2
  532. package/dist/temporal-timeline-recall.d.ts +1 -1
  533. package/dist/temporal-validity.d.ts +1 -1
  534. package/dist/threading.d.ts +1 -1
  535. package/dist/tier-migration.d.ts +2 -2
  536. package/dist/tier-routing.d.ts +1 -1
  537. package/dist/tier-routing.js +3 -3
  538. package/dist/{tier-stats-LUSUUNU6.js → tier-stats-VK5PCO2L.js} +4 -4
  539. package/dist/topics.d.ts +1 -1
  540. package/dist/transcript.d.ts +1 -1
  541. package/dist/transfer/backup.js +2 -2
  542. package/dist/transfer/capsule-export.js +2 -2
  543. package/dist/transfer/capsule-import.js +3 -3
  544. package/dist/transfer/export-okf.d.ts +1 -1
  545. package/dist/transfer/export-okf.js +23 -23
  546. package/dist/trust-score-stage.d.ts +1 -1
  547. package/dist/trust-score.d.ts +1 -1
  548. package/dist/{types-Cyr32ABj.d.ts → types-cK5LydjL.d.ts} +6 -1
  549. package/dist/types.d.ts +1 -1
  550. package/dist/types.js +1 -1
  551. package/dist/utility-runtime.d.ts +1 -1
  552. package/dist/verified-recall.js +23 -23
  553. package/dist/who-knows-cli.d.ts +16 -14
  554. package/dist/who-knows-cli.js +24 -24
  555. package/dist/who-knows.d.ts +16 -14
  556. package/dist/who-knows.js +23 -23
  557. package/dist/write-envelope.d.ts +1 -1
  558. package/package.json +12 -2
  559. package/src/access-category-alias.test.ts +93 -0
  560. package/src/access-http.ts +1 -1
  561. package/src/access-mcp-shared-context-tools.ts +103 -0
  562. package/src/access-mcp.ts +4 -74
  563. package/src/access-offline-manifest.ts +52 -2
  564. package/src/access-operations-batch.ts +45 -2
  565. package/src/access-schema.ts +9 -4
  566. package/src/access-service.ts +14 -7
  567. package/src/activity/config.test.ts +61 -0
  568. package/src/activity/config.ts +40 -1
  569. package/src/activity/timeline/analysis-provider.ts +8 -2
  570. package/src/activity/timeline/analysis-run.test.ts +82 -0
  571. package/src/activity/timeline/publish-cli.test.ts +30 -0
  572. package/src/activity/timeline/publish-cli.ts +7 -0
  573. package/src/activity/timeline/query.ts +8 -1
  574. package/src/activity/timeline/regenerate.test.ts +130 -2
  575. package/src/activity/timeline/regenerate.ts +14 -6
  576. package/src/activity/vault-frontmatter.test.ts +99 -1
  577. package/src/activity/vault-frontmatter.ts +131 -0
  578. package/src/activity/vault-publish.ts +6 -0
  579. package/src/activity/vault-publisher.test.ts +172 -0
  580. package/src/activity/vault-publisher.ts +69 -15
  581. package/src/activity/vault-region.test.ts +7 -2
  582. package/src/activity/vault-region.ts +7 -3
  583. package/src/background-generation-config.ts +32 -6
  584. package/src/background-generation.test.ts +10 -1
  585. package/src/cli/deep-recall-commands.ts +22 -10
  586. package/src/cli/timeline-publish-commands.ts +9 -0
  587. package/src/config.test.ts +170 -43
  588. package/src/config.ts +22 -5
  589. package/src/dedup/merge.test.ts +283 -0
  590. package/src/deep-recall-boundary.test.ts +66 -0
  591. package/src/deep-recall-cli.test.ts +82 -0
  592. package/src/deep-recall-config.test.ts +56 -0
  593. package/src/deep-recall-config.ts +32 -0
  594. package/src/deep-recall-http-glue.ts +10 -10
  595. package/src/deep-recall-policy-llm.test.ts +242 -0
  596. package/src/deep-recall-policy-llm.ts +37 -7
  597. package/src/deep-recall-seeds.test.ts +53 -0
  598. package/src/deep-recall-seeds.ts +7 -1
  599. package/src/deep-recall-surface.test.ts +93 -0
  600. package/src/deep-recall.test.ts +121 -0
  601. package/src/deep-recall.ts +88 -28
  602. package/src/extraction-error-classification.ts +36 -1
  603. package/src/extraction-timeout.test.ts +110 -1
  604. package/src/extraction.test.ts +19 -1
  605. package/src/extraction.ts +23 -21
  606. package/src/fallback-llm-codex-subscription.ts +220 -12
  607. package/src/fallback-llm-parse-failure.test.ts +156 -0
  608. package/src/fallback-llm.test.ts +178 -0
  609. package/src/fallback-llm.ts +200 -198
  610. package/src/index.ts +1 -0
  611. package/src/local-llm-config.ts +11 -10
  612. package/src/local-llm-headers-timeout.test.ts +30 -0
  613. package/src/local-llm-helpers.ts +28 -0
  614. package/src/local-llm.ts +8 -19
  615. package/src/meetings/config.test.ts +58 -0
  616. package/src/namespaces/search.test.ts +51 -1
  617. package/src/namespaces/search.ts +48 -3
  618. package/src/orchestration/extraction-persist-promotion.test.ts +228 -2
  619. package/src/orchestration/extraction-persist-promotion.ts +17 -14
  620. package/src/orchestration/extraction-persist.ts +1 -1
  621. package/src/orchestration/orchestrator-helpers.test.ts +104 -0
  622. package/src/orchestration/orchestrator-init.ts +366 -106
  623. package/src/orchestration/recall-entry.ts +15 -1
  624. package/src/orchestration/recall-internal.ts +6 -11
  625. package/src/orchestration/recall-section-coordinator.ts +65 -28
  626. package/src/orchestration/recall-state-view-pipeline.test.ts +8 -2
  627. package/src/orchestration/semantic-merge-commit-effects.ts +45 -16
  628. package/src/orchestration/semantic-merge-persist.ts +23 -36
  629. package/src/orchestration/semantic-merge-promotion-payload.ts +62 -6
  630. package/src/orchestration/startup-collection-checks.ts +85 -0
  631. package/src/orchestrator-flush.test.ts +7 -0
  632. package/src/orchestrator-init.test.ts +1539 -0
  633. package/src/orchestrator.ts +7 -0
  634. package/src/providers/codex-subscription.test.ts +127 -0
  635. package/src/providers/codex-subscription.ts +1 -1
  636. package/src/qmd.ts +21 -10
  637. package/src/recall-state-view-admission.ts +11 -1
  638. package/src/recall-state-view-budget.test.ts +424 -0
  639. package/src/recall-state-view-cron-intent.test.ts +268 -0
  640. package/src/recall-state-view-widen.test.ts +14 -5
  641. package/src/recall-state-view-widen.ts +8 -1
  642. package/src/recall-state-view.ts +35 -18
  643. package/src/reconcile-identity-cache.test.ts +82 -1
  644. package/src/search/port.ts +1 -1
  645. package/src/shared-context/envelope-io.ts +25 -0
  646. package/src/shared-context/envelope-wiring.test.ts +4 -2
  647. package/src/shared-context/manager.ts +1 -0
  648. package/src/shared-context/write-output-controls.test.ts +192 -0
  649. package/src/shared-context/write-output-controls.ts +72 -0
  650. package/src/source-attribution.test.ts +39 -0
  651. package/src/source-attribution.ts +72 -0
  652. package/src/storage/cas-revision-store.test.ts +4 -0
  653. package/src/storage/cas-revision-store.ts +104 -12
  654. package/src/storage-frontmatter-cas.test.ts +19 -17
  655. package/src/summarizer.ts +5 -1
  656. package/src/task-llm-config.test.ts +124 -0
  657. package/src/task-llm-config.ts +88 -0
  658. package/src/testing/subjects/startup-discovery-lifecycle.test.ts +273 -0
  659. package/src/types.ts +6 -0
  660. package/dist/chunk-3CBI2ZSA.js.map +0 -1
  661. package/dist/chunk-5HYUUFMQ.js.map +0 -1
  662. package/dist/chunk-5SPCMAUC.js.map +0 -1
  663. package/dist/chunk-6H2G7RFT.js.map +0 -1
  664. package/dist/chunk-6YAIN5XJ.js.map +0 -1
  665. package/dist/chunk-ACY4ZPF7.js.map +0 -1
  666. package/dist/chunk-B36GUU6T.js.map +0 -1
  667. package/dist/chunk-BLDBT6HZ.js.map +0 -1
  668. package/dist/chunk-CARRTDKC.js.map +0 -1
  669. package/dist/chunk-CC37E3QM.js.map +0 -1
  670. package/dist/chunk-CWTCMZGE.js.map +0 -1
  671. package/dist/chunk-CZTPU65V.js.map +0 -1
  672. package/dist/chunk-EYKIDK33.js.map +0 -1
  673. package/dist/chunk-FWWWUPOE.js.map +0 -1
  674. package/dist/chunk-IQEJIOEU.js.map +0 -1
  675. package/dist/chunk-IYKZJVL5.js.map +0 -1
  676. package/dist/chunk-JXN77SGO.js.map +0 -1
  677. package/dist/chunk-KQW3YGEN.js.map +0 -1
  678. package/dist/chunk-LPYYY4AP.js.map +0 -1
  679. package/dist/chunk-LQNRVPTV.js.map +0 -1
  680. package/dist/chunk-MVAQ2WM3.js.map +0 -1
  681. package/dist/chunk-OEDW4ER7.js.map +0 -1
  682. package/dist/chunk-OPBFP4TF.js.map +0 -1
  683. package/dist/chunk-P4ZAEYKG.js.map +0 -1
  684. package/dist/chunk-QHT7MOUF.js.map +0 -1
  685. package/dist/chunk-QTQ6XKGT.js.map +0 -1
  686. package/dist/chunk-SV4Z2S67.js.map +0 -1
  687. package/dist/chunk-TNZNSMVJ.js.map +0 -1
  688. package/dist/chunk-TRLOFIQC.js.map +0 -1
  689. package/dist/chunk-UZEHHXYC.js.map +0 -1
  690. package/dist/chunk-WKDFJXW5.js.map +0 -1
  691. package/dist/chunk-YDVAM7S4.js.map +0 -1
  692. package/dist/chunk-YFTNZMGR.js.map +0 -1
  693. package/dist/chunk-YKREX63Z.js.map +0 -1
  694. /package/dist/{capsule-crypto-7FJQINUR.js.map → access-mcp-shared-context-tools.js.map} +0 -0
  695. /package/dist/{auto-sync-RP4C6ZPF.js.map → auto-sync-7PGUFY7U.js.map} +0 -0
  696. /package/dist/{contradiction-scan-BSGKZHYJ.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  697. /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-3MNURAQ3.js.map} +0 -0
  698. /package/dist/{chunk-XH3HGI2N.js.map → chunk-2HQPE2NM.js.map} +0 -0
  699. /package/dist/{chunk-3EKVN2OP.js.map → chunk-2ZG2LLZT.js.map} +0 -0
  700. /package/dist/{chunk-6EHM2AV7.js.map → chunk-3BLHPQHT.js.map} +0 -0
  701. /package/dist/{chunk-J272ODKJ.js.map → chunk-42DJ235G.js.map} +0 -0
  702. /package/dist/{chunk-F4EHXVP7.js.map → chunk-46RII65S.js.map} +0 -0
  703. /package/dist/{chunk-YUW66UAH.js.map → chunk-4AX5OYKC.js.map} +0 -0
  704. /package/dist/{chunk-AECJY3GJ.js.map → chunk-4IGOLIWM.js.map} +0 -0
  705. /package/dist/{chunk-2ZTDRNCS.js.map → chunk-54QPOE45.js.map} +0 -0
  706. /package/dist/{chunk-O4M4BDIJ.js.map → chunk-563X6JJX.js.map} +0 -0
  707. /package/dist/{chunk-IL6ODG6M.js.map → chunk-5EQT62HH.js.map} +0 -0
  708. /package/dist/{chunk-JKKII6GX.js.map → chunk-6MQMYXSQ.js.map} +0 -0
  709. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  710. /package/dist/{chunk-BV4ZKIZH.js.map → chunk-7ZLC4DTZ.js.map} +0 -0
  711. /package/dist/{chunk-WBM2MVBK.js.map → chunk-A4OIJYCV.js.map} +0 -0
  712. /package/dist/{chunk-RLJHJQUY.js.map → chunk-AFJHNHAM.js.map} +0 -0
  713. /package/dist/{chunk-4RZLTZVM.js.map → chunk-AKABVXFS.js.map} +0 -0
  714. /package/dist/{chunk-M6HBPLBA.js.map → chunk-AUSRUOMQ.js.map} +0 -0
  715. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  716. /package/dist/{chunk-Q7CLGFA7.js.map → chunk-C3G6MW4W.js.map} +0 -0
  717. /package/dist/{chunk-O76F5QPP.js.map → chunk-D6PY63OM.js.map} +0 -0
  718. /package/dist/{chunk-BD7JTBYP.js.map → chunk-D7MAYFQP.js.map} +0 -0
  719. /package/dist/{chunk-LMLGBG6H.js.map → chunk-DBB5JPSL.js.map} +0 -0
  720. /package/dist/{chunk-TSP5WH72.js.map → chunk-DIXZQTGY.js.map} +0 -0
  721. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  722. /package/dist/{chunk-UHRZ324M.js.map → chunk-E3I3NDUP.js.map} +0 -0
  723. /package/dist/{chunk-AENM6GKU.js.map → chunk-E4LMQTST.js.map} +0 -0
  724. /package/dist/{chunk-MUTVRKKY.js.map → chunk-EMSYMYXO.js.map} +0 -0
  725. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  726. /package/dist/{chunk-FXHOZGSE.js.map → chunk-F5H6YG5P.js.map} +0 -0
  727. /package/dist/{chunk-TNSCIPBQ.js.map → chunk-G6NQ3L4T.js.map} +0 -0
  728. /package/dist/{chunk-ZMWSYUUL.js.map → chunk-GCBIXUPT.js.map} +0 -0
  729. /package/dist/{chunk-4BCHFSC7.js.map → chunk-GWNSKQDA.js.map} +0 -0
  730. /package/dist/{chunk-JDX2OA4R.js.map → chunk-HNHIHXSD.js.map} +0 -0
  731. /package/dist/{chunk-GG5FHZJJ.js.map → chunk-I33QYUAF.js.map} +0 -0
  732. /package/dist/{chunk-AAZEKXUP.js.map → chunk-IYIPXAIJ.js.map} +0 -0
  733. /package/dist/{chunk-5U7K4W6K.js.map → chunk-JDOBQPJY.js.map} +0 -0
  734. /package/dist/{chunk-UZZ7SQT3.js.map → chunk-JMWUPUE6.js.map} +0 -0
  735. /package/dist/{chunk-ENBPQEVU.js.map → chunk-JSD7Q7LD.js.map} +0 -0
  736. /package/dist/{chunk-Q432REND.js.map → chunk-KJLLPG26.js.map} +0 -0
  737. /package/dist/{chunk-JTQR6L2N.js.map → chunk-KLUC2GSG.js.map} +0 -0
  738. /package/dist/{chunk-OB3XMWX5.js.map → chunk-KVO2BTA4.js.map} +0 -0
  739. /package/dist/{chunk-PCOVEDPK.js.map → chunk-KZJM7R4F.js.map} +0 -0
  740. /package/dist/{chunk-X4TD4O2F.js.map → chunk-LE2KZ72G.js.map} +0 -0
  741. /package/dist/{chunk-HIP6DKJJ.js.map → chunk-LQVXSRAJ.js.map} +0 -0
  742. /package/dist/{chunk-A7GQBJP5.js.map → chunk-LVFI5LG7.js.map} +0 -0
  743. /package/dist/{chunk-VBSNUH4J.js.map → chunk-ND7MAIJC.js.map} +0 -0
  744. /package/dist/{chunk-54NX5EG4.js.map → chunk-P66QH6R6.js.map} +0 -0
  745. /package/dist/{chunk-62D2PAAM.js.map → chunk-PAAJWQH5.js.map} +0 -0
  746. /package/dist/{chunk-TA4C3XB7.js.map → chunk-PFKIOYJH.js.map} +0 -0
  747. /package/dist/{chunk-WIWLX65T.js.map → chunk-PGGPRF6J.js.map} +0 -0
  748. /package/dist/{chunk-V6EGNVUT.js.map → chunk-PIWFNPQT.js.map} +0 -0
  749. /package/dist/{chunk-4JVQRFZD.js.map → chunk-PLJ2MQFT.js.map} +0 -0
  750. /package/dist/{chunk-4RX5O34R.js.map → chunk-PQ42DJNG.js.map} +0 -0
  751. /package/dist/{chunk-37CAEC7E.js.map → chunk-PWPIERBM.js.map} +0 -0
  752. /package/dist/{chunk-ZEGL7YCC.js.map → chunk-Q62GA5U2.js.map} +0 -0
  753. /package/dist/{chunk-GAS7KYC7.js.map → chunk-RQQO3ORQ.js.map} +0 -0
  754. /package/dist/{chunk-3NPNBVFR.js.map → chunk-UZGHKD3T.js.map} +0 -0
  755. /package/dist/{chunk-VJIE4D2I.js.map → chunk-V62YYBBY.js.map} +0 -0
  756. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  757. /package/dist/{chunk-6AGWBKQU.js.map → chunk-VSN2DMQK.js.map} +0 -0
  758. /package/dist/{chunk-ZHXSOMYH.js.map → chunk-VVX5PZFS.js.map} +0 -0
  759. /package/dist/{chunk-GI4ZBWPQ.js.map → chunk-W7UV2ZCA.js.map} +0 -0
  760. /package/dist/{chunk-GMIQV6DD.js.map → chunk-WBQ4ONQJ.js.map} +0 -0
  761. /package/dist/{chunk-FNHLI2RE.js.map → chunk-WFMQN7JE.js.map} +0 -0
  762. /package/dist/{chunk-ZBW7A667.js.map → chunk-WPGA4RYI.js.map} +0 -0
  763. /package/dist/{chunk-YQNNHLCG.js.map → chunk-WPGR3RW4.js.map} +0 -0
  764. /package/dist/{chunk-NXGSONWM.js.map → chunk-WZIO3TW6.js.map} +0 -0
  765. /package/dist/{chunk-ZZUVBZL2.js.map → chunk-X2QPKLPL.js.map} +0 -0
  766. /package/dist/{chunk-VSL63CFJ.js.map → chunk-XRS65T4O.js.map} +0 -0
  767. /package/dist/{chunk-5N4MZLEH.js.map → chunk-YFXAWGMR.js.map} +0 -0
  768. /package/dist/{chunk-D545Z7UH.js.map → chunk-Z535ADTC.js.map} +0 -0
  769. /package/dist/{chunk-5YCNDC3C.js.map → chunk-ZX6NNFSY.js.map} +0 -0
  770. /package/dist/{chunk-3N3PBBEH.js.map → chunk-ZYSOT6HD.js.map} +0 -0
  771. /package/dist/{chunk-MCRVQ5YQ.js.map → chunk-ZZEIL3MI.js.map} +0 -0
  772. /package/dist/{resolution-4GG3QZRJ.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
  773. /package/dist/{first-start-migration-ZWMV5CX4.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
  774. /package/dist/{tier-stats-LUSUUNU6.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
@@ -96,11 +96,20 @@ test("#1952 precedence is OR: per-call false never disables a global true", () =
96
96
  assert.equal(labeled[1]?.stateLabel, "historical");
97
97
  });
98
98
 
99
- test("#1952 override true on a non-change query stays identity (change gate applies)", () => {
100
- const input = [CURRENT, HISTORICAL];
101
- assert.equal(widenRecallStateViews(input, NON_CHANGE, { recallStateViews: false }, [], true), input);
102
- assert.equal(applyRecallStateViews(input, NON_CHANGE, { recallStateViews: false }, true), input);
103
- assert.equal(input[0]?.stateLabel, undefined);
99
+ test("#2893 threaded stateViewActive is trusted: no intent re-check at the seam", () => {
100
+ // The threaded flag means change intent was already classified on the
101
+ // ORIGINAL prompt at recall entry (resolveRecallStateViewActive); the
102
+ // query reaching this seam is the cron-normalized retrievalQuery and
103
+ // can lack the intent signal. Non-change ORIGINAL prompts never thread
104
+ // a true flag — pinned in recall-state-view-cron-intent.test.ts.
105
+ const labeled = widenRecallStateViews([CURRENT], NON_CHANGE, { recallStateViews: false }, [HISTORICAL], true);
106
+ assert.deepEqual(
107
+ labeled.map((row) => [row.id, row.stateLabel]),
108
+ [
109
+ ["new-job", "current"],
110
+ ["old-job", "historical"],
111
+ ],
112
+ );
104
113
  });
105
114
 
106
115
  test("asOf mode keeps a pin-filtered predecessor and never widens the pool (#1952)", () => {
@@ -43,7 +43,13 @@ export function widenRecallStateViews<T extends StateViewResult>(
43
43
  ? config.recallStateViews
44
44
  : undefined;
45
45
  const enabled = stateViewActive === true || parseRecallStateViews(raw);
46
- if (!enabled || !isChangeOrientedQuery(query)) return results;
46
+ if (!enabled) return results;
47
+ // #2893 — a threaded stateViewActive was gated on change intent
48
+ // classified from the ORIGINAL prompt at recall entry; `query` here is
49
+ // the cron-normalized retrievalQuery and may have lost the intent
50
+ // signal (truncation / stop-word compaction), so do not re-check it.
51
+ // Only the legacy config-only path re-checks intent against this query.
52
+ if (stateViewActive !== true && !isChangeOrientedQuery(query)) return results;
47
53
  const asOfActive = typeof asOfMs === "number" && Number.isFinite(asOfMs);
48
54
 
49
55
  // #2859: matches are namespace-qualified, and a successor's `supersedes`
@@ -79,6 +85,7 @@ export function widenRecallStateViews<T extends StateViewResult>(
79
85
 
80
86
  return annotateStateView(extra.length > 0 ? results.concat(extra) : results, query, [], {
81
87
  enabled: true,
88
+ ...(stateViewActive === true ? { changeIntent: true } : {}),
82
89
  ...(asOfActive ? { asOfMs } : {}),
83
90
  });
84
91
  }
@@ -205,10 +205,13 @@ export function annotateStateView<T extends StateViewResult>(
205
205
  results: T[],
206
206
  query: string,
207
207
  chains: readonly StateViewChain[],
208
- options: { enabled?: boolean; asOfMs?: number } = {},
208
+ options: { enabled?: boolean; asOfMs?: number; changeIntent?: boolean } = {},
209
209
  ): T[] {
210
210
  const enabled = options.enabled === true;
211
- if (!enabled || !isChangeOrientedQuery(query)) return results;
211
+ // #2893 — changeIntent:true marks intent as already classified from the
212
+ // ORIGINAL prompt; `query` may be cron-normalized (intent signal
213
+ // truncated or stop-worded away) and must not be re-checked then.
214
+ if (!enabled || (options.changeIntent !== true && !isChangeOrientedQuery(query))) return results;
212
215
  // #1952 asOf mode: under a historical pin the pipeline's isValidAsOf
213
216
  // gate already decided validity at the pinned instant, so a predecessor
214
217
  // must not be discarded merely because its successor is absent under
@@ -293,22 +296,15 @@ export function reconcileStateViewPairs<T extends StateViewResult>(results: read
293
296
  }
294
297
 
295
298
  /**
296
- * #2859 — packet-counting cap. A predecessor/successor chain admitted
297
- * together is ONE complete evidence packet: it consumes a single slot of
298
- * the user cap, and the slice never splits a packet at the boundary (no
299
- * underfill from post-cap orphan removal). Rows keep their incoming
300
- * (MMR) order; packets are ordered by first appearance. Call
301
- * reconcileStateViewPairs first so orphans never consume a slot.
299
+ * #2928 — per-row packet root keys for the final output budget. Runs the
300
+ * same namespace-qualified union-find as {@link capStateViewPackets}:
301
+ * every row of one evidence packet shares the root key, so a downstream
302
+ * budget that admits one row of the packet can admit them all or none.
303
+ * Blank-key rows get unique per-index roots (distinct singletons).
302
304
  */
303
- export function capStateViewPackets<T extends StateViewResult>(
305
+ export function stateViewPacketKeys<T extends StateViewResult>(
304
306
  ordered: readonly T[],
305
- limit: number,
306
- ): T[] {
307
- const safeLimit =
308
- typeof limit === "number" && Number.isFinite(limit) ? Math.max(0, Math.floor(limit)) : 0;
309
- if (safeLimit === 0) return [];
310
- if (ordered.length === 0) return [];
311
-
307
+ ): string[] {
312
308
  const byPred = buildSuccessorMap(ordered, []);
313
309
  // Union-find over row keys; blank-key rows become per-index singletons.
314
310
  const parent = new Map<string, string>();
@@ -344,14 +340,35 @@ export function capStateViewPackets<T extends StateViewResult>(
344
340
  const succIdx = keyToIndex.get(succKey);
345
341
  if (predIdx !== undefined && succIdx !== undefined) union(keys[predIdx]!, keys[succIdx]!);
346
342
  }
343
+ return keys.map((key) => root(key));
344
+ }
345
+
346
+ /**
347
+ * #2859 — packet-counting cap. A predecessor/successor chain admitted
348
+ * together is ONE complete evidence packet: it consumes a single slot of
349
+ * the user cap, and the slice never splits a packet at the boundary (no
350
+ * underfill from post-cap orphan removal). Rows keep their incoming
351
+ * (MMR) order; packets are ordered by first appearance. Call
352
+ * reconcileStateViewPairs first so orphans never consume a slot.
353
+ */
354
+ export function capStateViewPackets<T extends StateViewResult>(
355
+ ordered: readonly T[],
356
+ limit: number,
357
+ ): T[] {
358
+ const safeLimit =
359
+ typeof limit === "number" && Number.isFinite(limit) ? Math.max(0, Math.floor(limit)) : 0;
360
+ if (safeLimit === 0) return [];
361
+ if (ordered.length === 0) return [];
362
+
363
+ const keys = stateViewPacketKeys(ordered);
347
364
  // Packets ordered by first appearance; admit whole packets until the cap.
348
365
  const selectedRoots = new Set<string>();
349
366
  for (let i = 0; i < ordered.length && selectedRoots.size < safeLimit; i += 1) {
350
- selectedRoots.add(root(keys[i]!));
367
+ selectedRoots.add(keys[i]!);
351
368
  }
352
369
  const selected: T[] = [];
353
370
  for (let i = 0; i < ordered.length; i += 1) {
354
- if (selectedRoots.has(root(keys[i]!))) selected.push(ordered[i]!);
371
+ if (selectedRoots.has(keys[i]!)) selected.push(ordered[i]!);
355
372
  }
356
373
  return selected;
357
374
  }
@@ -3,9 +3,15 @@ import * as fs from "node:fs";
3
3
  import * as os from "node:os";
4
4
  import * as path from "node:path";
5
5
  import test from "node:test";
6
+ import * as fsp from "node:fs/promises";
6
7
 
7
8
  import { createHash } from "node:crypto";
8
- import { type ServerIdentityCacheEntry, planServerIdentityCacheWrite } from "./access-offline-manifest.js";
9
+ import {
10
+ type ServerIdentityCacheEntry,
11
+ mergeServerIdentityCacheEntries,
12
+ planServerIdentityCacheWrite,
13
+ retainExcludedClassifications,
14
+ } from "./access-offline-manifest.js";
9
15
  import { isInternalRemnicStatePath } from "./offline-sync.js";
10
16
  import { convergeIdentityCachePath } from "./reconcile/cursor.js";
11
17
  import {
@@ -375,4 +381,79 @@ test("a thrown memory-file read is not cached as a reusable negative", async ()
375
381
  assert.equal(reads, 1, "a failed read must not become a warm negative hit");
376
382
  });
377
383
 
384
+ test("the write plan retains never-yielded excluded paths on a completed walk", () => {
385
+ const persisted = new Map<string, ServerIdentityCacheEntry>([
386
+ ["facts/gone.md", { path: "facts/gone.md", sha256: "aa" }],
387
+ ["facts/private.md", { path: "facts/private.md", sha256: "", statIdentity: "s", excluded: true }],
388
+ ]);
389
+ const plan = planServerIdentityCacheWrite({
390
+ persisted,
391
+ yieldedPaths: new Set([]),
392
+ retainedPaths: new Set(["facts/private.md"]),
393
+ streamCompleted: true,
394
+ cacheDirty: false,
395
+ });
396
+ assert.ok(plan.shouldWrite, "the vanished path still forces a write");
397
+ assert.deepEqual(
398
+ plan.entries.map((entry) => entry.path),
399
+ ["facts/private.md"],
400
+ "an excluded file's entry survives the deleted-path prune; a vanished path's does not"
401
+ );
402
+ });
403
+
404
+ test("excluded classifications persist for never-yielded paths without retaining unseen ones", () => {
405
+ const persisted = new Map<string, ServerIdentityCacheEntry>([
406
+ ["facts/deleted.md", { path: "facts/deleted.md", sha256: "aa" }],
407
+ ]);
408
+ const classifications = new Map([
409
+ ["facts/private.md", { statIdentity: "1:1:1:1:1", excluded: true }],
410
+ ["facts/yielded.md", { statIdentity: "2:2:2:2:2", excluded: false }],
411
+ ]);
412
+ const { retained, changed } = retainExcludedClassifications({
413
+ persisted,
414
+ classifications,
415
+ yieldedPaths: new Set(["facts/yielded.md"]),
416
+ });
417
+ assert.deepEqual([...retained], ["facts/private.md"]);
418
+ assert.equal(changed, true);
419
+ assert.equal(persisted.get("facts/private.md")?.excluded, true);
420
+ assert.equal(typeof persisted.get("facts/private.md")?.statIdentity, "string");
421
+ assert.ok(!retained.has("facts/deleted.md"), "a path the walk never saw must not be retained");
422
+ });
423
+
424
+ test("a concurrent server merge preserves the other writer's classification", async () => {
425
+ const dir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "server-identity-merge-"));
426
+ try {
427
+ const cachePath = path.join(dir, "identity.json");
428
+ await fs.promises.writeFile(
429
+ cachePath,
430
+ JSON.stringify({
431
+ citationTemplate: citationTemplateFingerprint(undefined),
432
+ files: [
433
+ { path: "facts/a.md", sha256: "aa", statIdentity: "1:2:3:4:5", excluded: false },
434
+ { path: "facts/dropped.md", sha256: "dd", statIdentity: "9:9:9:9:9", excluded: true },
435
+ ],
436
+ })
437
+ );
438
+ const merged = await mergeServerIdentityCacheEntries(
439
+ fsp,
440
+ cachePath,
441
+ [{ path: "facts/b.md", sha256: "bb" }],
442
+ undefined,
443
+ new Set(["facts/dropped.md"])
444
+ );
445
+ const byPath = new Map(merged.map((entry) => [entry.path, entry]));
446
+ assert.equal(
447
+ byPath.get("facts/a.md")?.statIdentity,
448
+ "1:2:3:4:5",
449
+ "the other writer's classification survives the merge"
450
+ );
451
+ assert.equal(byPath.get("facts/a.md")?.excluded, false);
452
+ assert.ok(byPath.has("facts/b.md"), "this writer's entry survives too");
453
+ assert.equal(byPath.has("facts/dropped.md"), false, "a dropped path is still not resurrected");
454
+ } finally {
455
+ await fs.promises.rm(dir, { recursive: true, force: true });
456
+ }
457
+ });
458
+
378
459
 
@@ -91,7 +91,7 @@ export interface SearchBackendStatus {
91
91
  */
92
92
  export interface SearchBackend {
93
93
  // ── Lifecycle ──
94
- probe(): Promise<boolean>;
94
+ probe(execution?: SearchExecutionOptions): Promise<boolean>;
95
95
  /**
96
96
  * Optional non-mutating availability probe for health/readiness checks.
97
97
  * Implementations must avoid auto-upgrades, collection creation, daemon
@@ -29,6 +29,13 @@ export interface ComposeWriteEnvelopeInput {
29
29
  supersedes?: string;
30
30
  /** Config opt-in (`sharedContextAllowBindingAuthority`). Binding throws without it. */
31
31
  allowBinding: boolean;
32
+ /**
33
+ * Write instant for the expiry TTL policy (issue #2920). When finite, an
34
+ * `expiresAt` must land strictly after it and within the maximum TTL —
35
+ * a past or effectively-immortal expiry is a client input error, never a
36
+ * silently accepted stamp.
37
+ */
38
+ nowMs?: number;
32
39
  }
33
40
 
34
41
  function requireEnvelopeActor(agentId: string): string {
@@ -48,6 +55,21 @@ function optionalEnvelopeAt(expiresAt: string | undefined): string | undefined {
48
55
  return parsed.at;
49
56
  }
50
57
 
58
+ /** Maximum write-side TTL: 10 years. A farther `expiresAt` is rejected. */
59
+ export const MAX_WRITE_EXPIRES_AT_TTL_MS = 3650 * 24 * 60 * 60 * 1000;
60
+
61
+ function assertBoundedFutureExpiry(expiresAt: string, nowMs: number): void {
62
+ const expiresAtMs = Date.parse(expiresAt);
63
+ if (expiresAtMs <= nowMs) {
64
+ throw new Error("composeWriteEnvelope: expiresAt must be an instant strictly after the write time");
65
+ }
66
+ if (expiresAtMs - nowMs > MAX_WRITE_EXPIRES_AT_TTL_MS) {
67
+ throw new Error(
68
+ `composeWriteEnvelope: expiresAt exceeds the maximum TTL of ${MAX_WRITE_EXPIRES_AT_TTL_MS}ms`,
69
+ );
70
+ }
71
+ }
72
+
51
73
  function optionalEnvelopeId(supersedes: string | undefined): string | undefined {
52
74
  if (supersedes === undefined) return undefined;
53
75
  const parsed = parseEnvelopeId(supersedes);
@@ -137,6 +159,9 @@ function requireProducer(value: string): string {
137
159
  export function composeWriteEnvelope(input: ComposeWriteEnvelopeInput): SharedEnvelope {
138
160
  const sharedBy = requireEnvelopeActor(input.origin);
139
161
  const expiresAt = optionalEnvelopeAt(input.expiresAt);
162
+ if (expiresAt !== undefined && Number.isFinite(input.nowMs ?? Number.NaN)) {
163
+ assertBoundedFutureExpiry(expiresAt, input.nowMs as number);
164
+ }
140
165
  const supersedes = optionalEnvelopeId(input.supersedes);
141
166
  return applyDefaultEnvelope(
142
167
  { sharedBy, authority: input.authority, expiresAt, supersedes },
@@ -36,12 +36,14 @@ test("authority envelope round-trips write -> cross-signals -> curation", async
36
36
  const { manager, dir } = await makeManager();
37
37
  t.after(() => rm(dir, { recursive: true, force: true }));
38
38
 
39
+ // Within the write TTL policy (issue #2920): strictly future, ≤10 years.
40
+ const expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString();
39
41
  const fp = await manager.writeAgentOutput({
40
42
  agentId: "agent-alpha",
41
43
  title: "Deploy checklist",
42
44
  content: "Verified the deploy checklist end to end.",
43
45
  authority: "advisory",
44
- expiresAt: "2099-01-01T00:00:00.000Z",
46
+ expiresAt,
45
47
  supersedes: "out-0001",
46
48
  });
47
49
 
@@ -49,7 +51,7 @@ test("authority envelope round-trips write -> cross-signals -> curation", async
49
51
  assert.match(raw, /^kind: agent_output$/m);
50
52
  assert.match(raw, /^sharedBy: "agent-alpha"$/m);
51
53
  assert.match(raw, /^authority: "advisory"$/m);
52
- assert.match(raw, /^expiresAt: "2099-01-01T00:00:00\.000Z"$/m);
54
+ assert.ok(raw.includes(`expiresAt: ${JSON.stringify(expiresAt)}`));
53
55
  assert.match(raw, /^supersedes: "out-0001"$/m);
54
56
 
55
57
  const signals = await manager.synthesizeCrossSignals({ date: today() });
@@ -605,6 +605,7 @@ export class SharedContextManager {
605
605
  expiresAt: opts.expiresAt,
606
606
  supersedes: opts.supersedes,
607
607
  allowBinding: this.allowBindingAuthority,
608
+ nowMs: createdAt.getTime(),
608
609
  });
609
610
 
610
611
  const dir = path.join(this.outputsDir, agentPathSegment, date);
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Regression: governed write-output envelope controls exposed on BOTH
3
+ * documented surfaces (issue #2920).
4
+ *
5
+ * Covers the canonical client-input parse, the Access MCP operation
6
+ * (`shared_context_write_output` via the real operation registry), and the
7
+ * access-service adapter against the REAL manager write path:
8
+ * - authority: finite allow-list, binding gated by config
9
+ * - expiresAt: strict ISO, strictly future, bounded by the 10-year TTL
10
+ * - supersedes: validated id shape
11
+ * - client `principal`/`namespace` overrides are rejected
12
+ * - no idempotent replay/dedup semantics on this surface (two identical
13
+ * calls write two files — nothing silently swallows a re-send)
14
+ *
15
+ * All fixtures are synthetic — no real user data.
16
+ */
17
+
18
+ import assert from "node:assert/strict";
19
+ import test from "node:test";
20
+ import os from "node:os";
21
+ import path from "node:path";
22
+ import { mkdtemp, readFile, rm } from "node:fs/promises";
23
+
24
+ import "../access-operations.js";
25
+ import { getOperation } from "../access-boundary.js";
26
+ import { EngramAccessInputError, EngramAccessService, type EngramAccessService as Service } from "../access-service.js";
27
+ import type { Orchestrator } from "../orchestrator.js";
28
+ import { SharedContextManager } from "./manager.js";
29
+ import { MAX_WRITE_EXPIRES_AT_TTL_MS } from "./envelope-io.js";
30
+ import { parseSharedWriteOutputControls } from "./write-output-controls.js";
31
+ import { parseConfig } from "../config.js";
32
+
33
+ const DAY_MS = 24 * 60 * 60 * 1000;
34
+
35
+ async function makeService(overrides: Record<string, unknown> = {}) {
36
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-shared-controls-"));
37
+ const config = parseConfig({ sharedContextEnabled: true, sharedContextDir: dir, memoryDir: dir, ...overrides });
38
+ const manager = new SharedContextManager(config);
39
+ await manager.ensureStructure();
40
+ const service = new EngramAccessService({ config, sharedContext: manager } as unknown as Orchestrator);
41
+ return { service, manager, dir, config };
42
+ }
43
+
44
+ test("parse: controls are strings-or-absent; empty or non-string values reject", () => {
45
+ assert.deepEqual(parseSharedWriteOutputControls({}), {});
46
+ assert.deepEqual(parseSharedWriteOutputControls(undefined), {});
47
+ assert.deepEqual(parseSharedWriteOutputControls(null), {});
48
+ assert.deepEqual(
49
+ parseSharedWriteOutputControls({ authority: "advisory", expiresAt: "2030-01-01T00:00:00Z", supersedes: "out-1" }),
50
+ { authority: "advisory", expiresAt: "2030-01-01T00:00:00Z", supersedes: "out-1" },
51
+ );
52
+ assert.throws(() => parseSharedWriteOutputControls({ authority: 7 }), /authority must be a string/);
53
+ assert.throws(() => parseSharedWriteOutputControls({ expiresAt: "" }), /expiresAt must be a non-empty string/);
54
+ assert.throws(() => parseSharedWriteOutputControls({ supersedes: " " }), /supersedes must be a non-empty string/);
55
+ });
56
+
57
+ test("parse: client principal/namespace overrides are rejected", () => {
58
+ assert.throws(
59
+ () => parseSharedWriteOutputControls({ principal: "attacker" }),
60
+ /principal is server-resolved and cannot be supplied by the caller/,
61
+ );
62
+ assert.throws(
63
+ () => parseSharedWriteOutputControls({ namespace: "victim-ns" }),
64
+ /namespace is server-resolved and cannot be supplied by the caller/,
65
+ );
66
+ // Absent keys (and stripped nulls) pass through untouched.
67
+ assert.deepEqual(parseSharedWriteOutputControls({ sessionKey: "ctx" }), {});
68
+ });
69
+
70
+ test("operation: forwards the envelope controls with the authenticated principal", async () => {
71
+ let received: Record<string, unknown> | undefined;
72
+ const service = {
73
+ sharedContextWriteOutput: async (request: Record<string, unknown>) => {
74
+ received = request;
75
+ return { written: true, path: "written.md" };
76
+ },
77
+ } as unknown as Service;
78
+ const operation = getOperation("shared_context_write_output");
79
+ assert.ok(operation);
80
+
81
+ await operation.run(
82
+ { agentId: "agent", title: "t", content: "c", authority: "advisory", expiresAt: "2030-01-01T00:00:00Z", supersedes: "out-1" },
83
+ { service, authenticatedPrincipal: "real-principal" },
84
+ );
85
+ assert.equal(received?.authority, "advisory");
86
+ assert.equal(received?.expiresAt, "2030-01-01T00:00:00Z");
87
+ assert.equal(received?.supersedes, "out-1");
88
+ assert.equal(received?.principal, "real-principal");
89
+ });
90
+
91
+ test("operation: client principal/namespace and malformed controls are input errors", async () => {
92
+ const service = {
93
+ sharedContextWriteOutput: async () => ({ written: true, path: "x" }),
94
+ } as unknown as Service;
95
+ const operation = getOperation("shared_context_write_output");
96
+ assert.ok(operation);
97
+
98
+ for (const payload of [
99
+ { agentId: "a", title: "t", content: "c", principal: "spoofed" },
100
+ { agentId: "a", title: "t", content: "c", namespace: "other" },
101
+ { agentId: "a", title: "t", content: "c", authority: "" },
102
+ { agentId: "a", title: "t", content: "c", expiresAt: 42 },
103
+ ]) {
104
+ await assert.rejects(
105
+ () => operation.run(payload, { service, authenticatedPrincipal: "real-principal" }),
106
+ (error: unknown) => error instanceof EngramAccessInputError,
107
+ `must reject ${JSON.stringify(payload)}`,
108
+ );
109
+ }
110
+ });
111
+
112
+ test("service: controls stamp the envelope; absent controls stay informational", async (t) => {
113
+ const { service, dir } = await makeService();
114
+ t.after(() => rm(dir, { recursive: true, force: true }));
115
+
116
+ const expiresAt = new Date(Date.now() + 90 * DAY_MS).toISOString();
117
+ const result = (await service.sharedContextWriteOutput({
118
+ agentId: "agent-alpha",
119
+ title: "Plan",
120
+ content: "x",
121
+ authority: "advisory",
122
+ expiresAt,
123
+ supersedes: "out-0001",
124
+ })) as { written: boolean; path: string };
125
+ const raw = await readFile(result.path, "utf-8");
126
+ assert.match(raw, /^authority: "advisory"$/m);
127
+ assert.ok(raw.includes(`expiresAt: ${JSON.stringify(expiresAt)}`));
128
+ assert.match(raw, /^supersedes: "out-0001"$/m);
129
+
130
+ const plain = (await service.sharedContextWriteOutput({ agentId: "agent-alpha", title: "Plain", content: "x" })) as {
131
+ written: boolean;
132
+ path: string;
133
+ };
134
+ const plainRaw = await readFile(plain.path, "utf-8");
135
+ assert.match(plainRaw, /^authority: "informational"$/m);
136
+ });
137
+
138
+ test("service: binding requires the operator opt-in, else is a client input error", async (t) => {
139
+ const gated = await makeService();
140
+ t.after(() => rm(gated.dir, { recursive: true, force: true }));
141
+ await assert.rejects(
142
+ () =>
143
+ gated.service.sharedContextWriteOutput({ agentId: "agent-alpha", title: "Directive", content: "x", authority: "binding" }),
144
+ (error: unknown) => error instanceof EngramAccessInputError && /requires an explicit binding flag/.test(error.message),
145
+ );
146
+
147
+ const open = await makeService({ sharedContextAllowBindingAuthority: true });
148
+ t.after(() => rm(open.dir, { recursive: true, force: true }));
149
+ const result = (await open.service.sharedContextWriteOutput({
150
+ agentId: "agent-alpha",
151
+ title: "Directive",
152
+ content: "x",
153
+ authority: "binding",
154
+ })) as { path: string };
155
+ assert.match(await readFile(result.path, "utf-8"), /^authority: "binding"$/m);
156
+ });
157
+
158
+ test("service: expiresAt must be strictly future and within the 10-year TTL", async (t) => {
159
+ const { service, dir } = await makeService();
160
+ t.after(() => rm(dir, { recursive: true, force: true }));
161
+
162
+ const cases: Array<{ expiresAt: string; message: string }> = [
163
+ { expiresAt: new Date(Date.now() - DAY_MS).toISOString(), message: "strictly after the write time" },
164
+ { expiresAt: new Date(Date.now() + MAX_WRITE_EXPIRES_AT_TTL_MS + DAY_MS).toISOString(), message: "maximum TTL" },
165
+ { expiresAt: "2030-02-31T00:00:00Z", message: "valid ISO-8601 timestamp" },
166
+ ];
167
+ for (const { expiresAt, message } of cases) {
168
+ await assert.rejects(
169
+ () => service.sharedContextWriteOutput({ agentId: "agent-alpha", title: "Expiry", content: "x", expiresAt }),
170
+ (error: unknown) => error instanceof EngramAccessInputError && error.message.includes(message),
171
+ `must reject expiresAt=${expiresAt}`,
172
+ );
173
+ }
174
+ });
175
+
176
+ test("service: supersedes must be a non-blank single-line id", async (t) => {
177
+ const { service, dir } = await makeService();
178
+ t.after(() => rm(dir, { recursive: true, force: true }));
179
+ await assert.rejects(
180
+ () => service.sharedContextWriteOutput({ agentId: "agent-alpha", title: "Supersede", content: "x", supersedes: "out-1\nout-2" }),
181
+ (error: unknown) => error instanceof EngramAccessInputError && /supersedes/.test(error.message),
182
+ );
183
+ });
184
+
185
+ test("service: no idempotent replay — an identical re-send writes a second file", async (t) => {
186
+ const { service, dir } = await makeService();
187
+ t.after(() => rm(dir, { recursive: true, force: true }));
188
+ const base = { agentId: "agent-alpha", title: "Same", content: "same bytes" };
189
+ const first = (await service.sharedContextWriteOutput(base)) as { path: string };
190
+ const second = (await service.sharedContextWriteOutput(base)) as { path: string };
191
+ assert.notEqual(first.path, second.path, "this surface has no replay/dedup semantics; a re-send must not be swallowed");
192
+ });
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Canonical client-input parse for shared-context write-output envelope
3
+ * controls (issue #2920).
4
+ *
5
+ * One module feeds BOTH documented surfaces — the Access MCP
6
+ * `shared_context_write_output` operation and the OpenClaw
7
+ * `shared_context_write_output` tool — so surface policy can never drift.
8
+ * This layer owns only what is a SURFACE concern: field type/shape and the
9
+ * rejection of client-supplied identity. Semantic validation (authority
10
+ * allow-list, the binding gate, strict ISO instants, the future/TTL expiry
11
+ * policy, id shape) stays in `composeWriteEnvelope`, the single write-side
12
+ * gate every path already routes through — there is no in-process bypass
13
+ * with looser rules than the tool surfaces.
14
+ */
15
+
16
+ export interface SharedWriteOutputControls {
17
+ authority?: string;
18
+ expiresAt?: string;
19
+ supersedes?: string;
20
+ }
21
+
22
+ const CONTROL_FIELDS = ["authority", "expiresAt", "supersedes"] as const;
23
+
24
+ /** Server-resolved fields a caller must never supply (issue #2920). */
25
+ const SERVER_RESOLVED_FIELDS = ["principal", "namespace"] as const;
26
+
27
+ /**
28
+ * Parse the optional envelope controls off a raw client request.
29
+ *
30
+ * - Absent fields are omitted; a control must be a non-blank string when
31
+ * present (an explicit empty string is a client error, not "unspecified").
32
+ * - A client-supplied `principal` or `namespace` is rejected: identity and
33
+ * scoping are resolved by the surface, never accepted from the caller.
34
+ *
35
+ * Throws `Error` with a `shared-context write output:` prefix; access
36
+ * surfaces map that to their input-error class.
37
+ */
38
+ export function parseSharedWriteOutputControls(raw: unknown): SharedWriteOutputControls {
39
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return {};
40
+ const record = raw as Record<string, unknown>;
41
+ for (const field of SERVER_RESOLVED_FIELDS) {
42
+ if (Object.hasOwn(record, field) && record[field] !== undefined) {
43
+ throw new Error(
44
+ `shared-context write output: ${field} is server-resolved and cannot be supplied by the caller`,
45
+ );
46
+ }
47
+ }
48
+ const controls: SharedWriteOutputControls = {};
49
+ for (const field of CONTROL_FIELDS) {
50
+ const value = record[field];
51
+ if (value === undefined) continue;
52
+ if (typeof value !== "string") {
53
+ throw new Error(`shared-context write output: ${field} must be a string`);
54
+ }
55
+ if (value.trim().length === 0) {
56
+ throw new Error(`shared-context write output: ${field} must be a non-empty string`);
57
+ }
58
+ controls[field] = value;
59
+ }
60
+ return controls;
61
+ }
62
+
63
+ const WRITE_INPUT_PREFIXES = [
64
+ "shared-context write origin mismatch",
65
+ "applyDefaultEnvelope:",
66
+ "composeWriteEnvelope:",
67
+ "shared-context write output:",
68
+ ] as const;
69
+
70
+ export function isSharedContextWriteInputError(message: string): boolean {
71
+ return WRITE_INPUT_PREFIXES.some((prefix) => message.startsWith(prefix));
72
+ }
@@ -9,6 +9,9 @@ import { ContentHashIndex, StorageManager } from "./storage.js";
9
9
  import {
10
10
  DEFAULT_CITATION_FORMAT,
11
11
  attachCitation,
12
+ citationTemplateIsDetectable,
13
+ citationTemplatesForMerge,
14
+ citationTemplatesToRecognize,
12
15
  deriveSessionId,
13
16
  formatCitation,
14
17
  hasCitation,
@@ -17,6 +20,7 @@ import {
17
20
  parseCitation,
18
21
  stripCitation,
19
22
  stripCitationForTemplate,
23
+ stripRecognizedCitations,
20
24
  } from "./source-attribution.js";
21
25
 
22
26
  test("formatCitation emits the default template with provided fields", () => {
@@ -171,6 +175,7 @@ test("parseConfig disables inline source attribution by default", () => {
171
175
  cfg.inlineSourceAttributionFormat,
172
176
  "[Source: agent={agent}, session={sessionId}, ts={ts}]",
173
177
  );
178
+ assert.deepEqual(cfg.inlineSourceAttributionFormatHistory, []);
174
179
  });
175
180
 
176
181
  test("parseConfig honors explicit inline source attribution overrides", () => {
@@ -196,6 +201,22 @@ test("parseConfig falls back to default format when override is empty", () => {
196
201
  );
197
202
  });
198
203
 
204
+ test("parseConfig keeps inlineSourceAttributionFormatHistory when format is normalized", () => {
205
+ const prior = "[src:{agent}/{sessionId}@{date}]";
206
+ const current = "[via:{agent}]";
207
+ const cfg = parseConfig({
208
+ inlineSourceAttributionFormat: " ",
209
+ inlineSourceAttributionFormatHistory: [prior, "", 12, " ", current],
210
+ });
211
+ assert.equal(cfg.inlineSourceAttributionFormat, DEFAULT_CITATION_FORMAT);
212
+ assert.deepEqual(cfg.inlineSourceAttributionFormatHistory, [prior, current]);
213
+ assert.deepEqual(citationTemplatesForMerge(cfg), [
214
+ DEFAULT_CITATION_FORMAT,
215
+ prior,
216
+ current,
217
+ ]);
218
+ });
219
+
199
220
  // ── Finding 1 regression: custom citation template dedup detection ────────────
200
221
 
201
222
  test("hasCitationForTemplate detects default [Source:...] marker regardless of template", () => {
@@ -539,6 +560,24 @@ test("hasCitationForTemplate: '{agent}{sessionId}' all-placeholder template retu
539
560
  );
540
561
  });
541
562
 
563
+ test("citationTemplateIsDetectable rejects all-placeholder templates", () => {
564
+ assert.equal(citationTemplateIsDetectable("{agent}{sessionId}"), false);
565
+ assert.equal(citationTemplateIsDetectable(DEFAULT_CITATION_FORMAT), true);
566
+ assert.equal(citationTemplateIsDetectable("[src:{agent}/{sessionId}@{date}]"), true);
567
+ });
568
+
569
+ test("citationTemplatesToRecognize drops undetectable shapes and keeps prior history", () => {
570
+ const prior = "[src:{agent}/{sessionId}@{date}]";
571
+ const recognized = citationTemplatesToRecognize("{agent}{sessionId}", [prior]);
572
+ assert.deepEqual(recognized, [DEFAULT_CITATION_FORMAT, prior]);
573
+ const body = "The cadence is weekly. [src:agent-a/s-old@2026-08-19]";
574
+ assert.equal(stripRecognizedCitations(body, recognized), "The cadence is weekly.");
575
+ assert.deepEqual(citationTemplatesForMerge({ inlineSourceAttributionFormat: prior }), [
576
+ DEFAULT_CITATION_FORMAT,
577
+ prior,
578
+ ]);
579
+ });
580
+
542
581
  test("formatCitation: substituted values containing placeholder syntax are not re-interpreted", () => {
543
582
  // Regression for PR #401 (low-severity): the previous implementation chained
544
583
  // `.replace(/\{agent\}/g, ...)`, `.replace(/\{ts\}/g, ...)` etc. If the agent