@remnic/core 10.0.92 → 10.0.93

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 (486) hide show
  1. package/dist/access-admin-ops-surface.js +331 -58
  2. package/dist/access-authorization-probe.js +2 -283
  3. package/dist/access-boundary.d.ts +1 -1
  4. package/dist/access-boundary.d.ts.map +1 -1
  5. package/dist/access-boundary.js +1 -282
  6. package/dist/access-cli.js +286 -302
  7. package/dist/access-cli.js.map +1 -1
  8. package/dist/access-coding-context-resolution.js +3 -3
  9. package/dist/access-extraction-force-flush.js +331 -58
  10. package/dist/access-http-briefing.js +331 -59
  11. package/dist/access-http-query.js +331 -60
  12. package/dist/access-http.js +329 -111
  13. package/dist/access-identity-continuity-surface.js +331 -58
  14. package/dist/access-lcm-surface.js +331 -58
  15. package/dist/access-mcp-frames.d.ts +20 -6
  16. package/dist/access-mcp-frames.d.ts.map +1 -1
  17. package/dist/access-mcp-frames.js +1 -1
  18. package/dist/access-mcp.d.ts +5 -0
  19. package/dist/access-mcp.d.ts.map +1 -1
  20. package/dist/access-mcp.js +329 -86
  21. package/dist/access-namespace-preflight.js +2 -282
  22. package/dist/access-observe-transcript.js +3 -3
  23. package/dist/access-observe-write-category.js +6 -6
  24. package/dist/access-observe-write-surface.js +331 -58
  25. package/dist/access-offline-manifest.js +12 -11
  26. package/dist/access-operations-batch.js +329 -63
  27. package/dist/access-operations.js +329 -72
  28. package/dist/access-recall-concurrency.js +331 -58
  29. package/dist/access-recall-diagnostics.js +5 -4
  30. package/dist/access-recall-response.js +331 -58
  31. package/dist/access-recall-surface.js +331 -58
  32. package/dist/access-schema.js +2 -2
  33. package/dist/access-service.js +334 -61
  34. package/dist/access-surface-catalog.js +6 -283
  35. package/dist/access-surface-catalog.js.map +1 -1
  36. package/dist/active-context-transform.js +1 -1
  37. package/dist/active-memory-bridge.js +3 -2
  38. package/dist/active-recall.js +35 -36
  39. package/dist/active-recall.js.map +1 -1
  40. package/dist/activity/journal-extract.d.ts +13 -1
  41. package/dist/activity/journal-extract.d.ts.map +1 -1
  42. package/dist/{auto-sync-3AZW7MXI.js → auto-sync-BO5YZKM6.js} +13 -15
  43. package/dist/{auto-sync-3AZW7MXI.js.map → auto-sync-BO5YZKM6.js.map} +1 -1
  44. package/dist/briefing.js +19 -19
  45. package/dist/buffer.js +16 -16
  46. package/dist/calibration.js +10 -10
  47. package/dist/{capsule-merge-2IIXFXN5.js → capsule-merge-6IDAYTKG.js} +6 -6
  48. package/dist/causal-consolidation.js +22 -22
  49. package/dist/{chunk-ATPWZ4F7.js → chunk-2LMA22UU.js} +5 -5
  50. package/dist/{chunk-RGUUBAT5.js → chunk-2WCLTWV2.js} +3 -3
  51. package/dist/{chunk-BQZEGOZ4.js → chunk-2YODOG2O.js} +2 -2
  52. package/dist/{chunk-WYG5UNDY.js → chunk-3AUDELZL.js} +2 -2
  53. package/dist/{chunk-N4KAE2NB.js → chunk-3CYOCE6U.js} +3 -3
  54. package/dist/{chunk-MB6ZJDN6.js → chunk-3FBAEPCU.js} +2 -2
  55. package/dist/{chunk-PIITB2YZ.js → chunk-3ZS3NUEI.js} +4 -4
  56. package/dist/{chunk-ANZZLRUX.js → chunk-4IVRQMZW.js} +2 -2
  57. package/dist/{chunk-63E37JCN.js → chunk-4RAJT5L2.js} +4 -4
  58. package/dist/{chunk-45VUHDV2.js → chunk-5CO5G4MN.js} +2 -2
  59. package/dist/{chunk-BRLXOZLM.js → chunk-5YT2IIFX.js} +729 -17
  60. package/dist/chunk-5YT2IIFX.js.map +1 -0
  61. package/dist/{chunk-E4IRW2FG.js → chunk-622V2AZA.js} +233 -40
  62. package/dist/chunk-622V2AZA.js.map +1 -0
  63. package/dist/{chunk-LUJCQQ3L.js → chunk-65HWAQ4F.js} +2 -2
  64. package/dist/{chunk-T67LUYCR.js → chunk-77NTFICT.js} +5 -5
  65. package/dist/chunk-A2WFUMUN.js +86 -0
  66. package/dist/chunk-A2WFUMUN.js.map +1 -0
  67. package/dist/{chunk-UE6RRXMF.js → chunk-A4F7OIC5.js} +2 -2
  68. package/dist/chunk-AHA5VQGP.js +117 -0
  69. package/dist/chunk-AHA5VQGP.js.map +1 -0
  70. package/dist/{chunk-SUSW74WU.js → chunk-ATG2PQ4V.js} +56 -5
  71. package/dist/chunk-ATG2PQ4V.js.map +1 -0
  72. package/dist/{chunk-U6UNF5ZS.js → chunk-B33YWUJV.js} +3 -3
  73. package/dist/{chunk-RRJBDXAQ.js → chunk-B377OKUP.js} +2 -2
  74. package/dist/{chunk-IUKYFTGW.js → chunk-B3DR2JBZ.js} +140 -125
  75. package/dist/chunk-B3DR2JBZ.js.map +1 -0
  76. package/dist/{chunk-ETZLQOUR.js → chunk-BGHCSLE5.js} +2 -2
  77. package/dist/{chunk-YYOMGOHB.js → chunk-BOK6BN5M.js} +2 -2
  78. package/dist/{chunk-OH7QLI6W.js → chunk-BPPUH5JM.js} +5 -5
  79. package/dist/{chunk-4J363OAA.js → chunk-BTI4C4MA.js} +2 -2
  80. package/dist/{chunk-O6ZSWHVR.js → chunk-C2KE5DMD.js} +4 -4
  81. package/dist/{chunk-47F6WWLQ.js → chunk-C73N66PR.js} +2 -2
  82. package/dist/{chunk-E3A7ELSG.js → chunk-CGJYL633.js} +2 -2
  83. package/dist/{chunk-WRT7GJ2D.js → chunk-CIWMTNHW.js} +4 -4
  84. package/dist/{chunk-O55EKIEC.js → chunk-D3ZKHLN2.js} +2 -2
  85. package/dist/{chunk-CD4BCCNP.js → chunk-DJ7WVEWX.js} +2 -2
  86. package/dist/{chunk-PWXPRVLK.js → chunk-EFL24KOI.js} +2 -2
  87. package/dist/{chunk-4CJTQHEG.js → chunk-ESLOLCD4.js} +3 -3
  88. package/dist/{chunk-6F42QONS.js → chunk-ETBVCRVL.js} +4 -4
  89. package/dist/{chunk-VILPVT4S.js → chunk-EZ47HOJ6.js} +4 -4
  90. package/dist/{chunk-EFYN5I7Z.js → chunk-F4QFU5IZ.js} +2 -2
  91. package/dist/{chunk-T6OZW2WR.js → chunk-FA7SLQ5X.js} +7 -1
  92. package/dist/chunk-FA7SLQ5X.js.map +1 -0
  93. package/dist/{chunk-7W3RXOIG.js → chunk-FMKILENU.js} +14 -14
  94. package/dist/{chunk-YLXETSAH.js → chunk-GCZJ7XRI.js} +2 -2
  95. package/dist/{chunk-5HFXGXE5.js → chunk-GQXOBKPL.js} +7 -9
  96. package/dist/{chunk-5HFXGXE5.js.map → chunk-GQXOBKPL.js.map} +1 -1
  97. package/dist/{chunk-UDKWFDV2.js → chunk-HLUHEMN4.js} +27 -3
  98. package/dist/chunk-HLUHEMN4.js.map +1 -0
  99. package/dist/{chunk-QFEDITXM.js → chunk-JNDMIAJ4.js} +2 -2
  100. package/dist/chunk-JTSSSR4L.js +359 -0
  101. package/dist/chunk-JTSSSR4L.js.map +1 -0
  102. package/dist/{chunk-5KBIOI4G.js → chunk-JVBAPAWZ.js} +217 -13
  103. package/dist/chunk-JVBAPAWZ.js.map +1 -0
  104. package/dist/{chunk-E5PPE4VA.js → chunk-K2VRKCPA.js} +2 -2
  105. package/dist/{chunk-MKRYQROF.js → chunk-LGEHAQHK.js} +4 -4
  106. package/dist/{chunk-7HTUYFR3.js → chunk-LLPMMMWG.js} +27 -10
  107. package/dist/chunk-LLPMMMWG.js.map +1 -0
  108. package/dist/{chunk-XYTQJD7F.js → chunk-LMJVP5CM.js} +2 -2
  109. package/dist/{chunk-FQKBJJYB.js → chunk-LPV72KRQ.js} +2 -2
  110. package/dist/{chunk-2LCRG2YV.js → chunk-M2XR6B6V.js} +2 -2
  111. package/dist/{chunk-P4WNBSTW.js → chunk-MH632KPO.js} +2 -2
  112. package/dist/{chunk-EQ4U73UH.js → chunk-MLAMXQAW.js} +14 -2
  113. package/dist/chunk-MLAMXQAW.js.map +1 -0
  114. package/dist/{chunk-ZU5JDLOH.js → chunk-MMRTPH3J.js} +2 -2
  115. package/dist/{chunk-PMJFRDJI.js → chunk-MUX7IL77.js} +2 -2
  116. package/dist/{chunk-HF3BKUVV.js → chunk-NAQ4A5IX.js} +7 -7
  117. package/dist/{chunk-TVIVY7KU.js → chunk-NED7IR7B.js} +4 -4
  118. package/dist/{chunk-6F5MJFXY.js → chunk-NHVAX7MH.js} +2 -2
  119. package/dist/{chunk-TG3R2SID.js → chunk-NMGHGTVR.js} +5 -5
  120. package/dist/{chunk-YCNIGRRF.js → chunk-NS7U4ZYU.js} +13 -117
  121. package/dist/chunk-NS7U4ZYU.js.map +1 -0
  122. package/dist/{chunk-NGHDW6UU.js → chunk-NUQEREIP.js} +2 -2
  123. package/dist/{chunk-5IIQU4JZ.js → chunk-OB72KNMF.js} +4 -4
  124. package/dist/{chunk-JV4S6VDH.js → chunk-OJXJWNFY.js} +2 -2
  125. package/dist/{chunk-QJPJXCS4.js → chunk-P3WRNWWM.js} +157 -4
  126. package/dist/chunk-P3WRNWWM.js.map +1 -0
  127. package/dist/{chunk-E6M225BJ.js → chunk-PC5DRBGD.js} +18 -8
  128. package/dist/chunk-PC5DRBGD.js.map +1 -0
  129. package/dist/{chunk-Z7JIZ42P.js → chunk-PRAUN6PN.js} +3 -3
  130. package/dist/{chunk-RWGRSKN5.js → chunk-PT4DZDJA.js} +2 -2
  131. package/dist/{chunk-7EPY3IQL.js → chunk-PZJQ46DH.js} +2 -2
  132. package/dist/{chunk-MXHMNKWG.js → chunk-QDESY76F.js} +3 -3
  133. package/dist/{chunk-I6QGI65T.js → chunk-QRMG4HK4.js} +3 -3
  134. package/dist/{chunk-ZU3NJNO7.js → chunk-QSF5SJAM.js} +4 -4
  135. package/dist/{chunk-5IYOKDM4.js → chunk-R23JWJD3.js} +5 -5
  136. package/dist/{chunk-RHQLIHMB.js → chunk-R4BBGPI2.js} +218 -218
  137. package/dist/chunk-R4BBGPI2.js.map +1 -0
  138. package/dist/{chunk-7GLJMDEQ.js → chunk-RM2YUFH6.js} +6 -6
  139. package/dist/{chunk-IPT2OY4B.js → chunk-RQFXZYTF.js} +35 -33
  140. package/dist/chunk-RQFXZYTF.js.map +1 -0
  141. package/dist/{chunk-AP6NCP3V.js → chunk-S3S72HRM.js} +8 -6
  142. package/dist/chunk-S3S72HRM.js.map +1 -0
  143. package/dist/{chunk-RIMK327Y.js → chunk-SGQPR5SX.js} +7 -7
  144. package/dist/{chunk-ZGFLIK5H.js → chunk-SPAKBUJY.js} +2 -2
  145. package/dist/{chunk-ER7XANP3.js → chunk-SQ3GEIEL.js} +4 -4
  146. package/dist/{chunk-BLJT6JP2.js → chunk-SVT5IA2H.js} +2 -2
  147. package/dist/{chunk-HVX4LPNY.js → chunk-T4KY6UYF.js} +5 -3
  148. package/dist/{chunk-HVX4LPNY.js.map → chunk-T4KY6UYF.js.map} +1 -1
  149. package/dist/{chunk-GVGAO3WV.js → chunk-TJ4F6H4H.js} +3 -3
  150. package/dist/{chunk-R6HMAIKM.js → chunk-TOSPNM4T.js} +2 -2
  151. package/dist/{chunk-HH5LY6RR.js → chunk-TRQE3RYR.js} +5 -5
  152. package/dist/{chunk-RMXS4I66.js → chunk-TVDJEUV5.js} +2 -2
  153. package/dist/{chunk-PLCYKAWH.js → chunk-TYRWSE4B.js} +2 -2
  154. package/dist/{chunk-B4QYQFGY.js → chunk-UBEKET2V.js} +383 -36
  155. package/dist/chunk-UBEKET2V.js.map +1 -0
  156. package/dist/{chunk-IQWUACVG.js → chunk-UHMHJX5G.js} +3 -3
  157. package/dist/{chunk-YODUDA6R.js → chunk-UN4RVUG2.js} +22 -22
  158. package/dist/{chunk-E6Z4FBX6.js → chunk-V2QSNFCT.js} +2 -2
  159. package/dist/{chunk-NBH6K6G5.js → chunk-V65H7MI6.js} +345 -16
  160. package/dist/chunk-V65H7MI6.js.map +1 -0
  161. package/dist/chunk-W54Z2MOP.js +4500 -0
  162. package/dist/chunk-W54Z2MOP.js.map +1 -0
  163. package/dist/{chunk-E7YZXWIS.js → chunk-WKSQTMU7.js} +2 -2
  164. package/dist/{chunk-RIZ5NUNN.js → chunk-WQ4XKIOX.js} +4 -4
  165. package/dist/{chunk-FSO3G4JJ.js → chunk-WQURALGV.js} +4995 -2747
  166. package/dist/chunk-WQURALGV.js.map +1 -0
  167. package/dist/{chunk-QEYTRFR3.js → chunk-X26YOFGS.js} +2 -2
  168. package/dist/{chunk-ITHZFHST.js → chunk-X2BVB74H.js} +2 -2
  169. package/dist/{chunk-XYKBWTWI.js → chunk-XIYLWEXC.js} +2 -2
  170. package/dist/{chunk-IBJ6U753.js → chunk-XKZBZOKV.js} +4 -4
  171. package/dist/{chunk-65AUYLU3.js → chunk-XPXHQI6N.js} +2 -2
  172. package/dist/{chunk-EXHXJETE.js → chunk-XRDYRWZI.js} +2 -2
  173. package/dist/chunk-XRWWCW4H.js +102 -0
  174. package/dist/chunk-XRWWCW4H.js.map +1 -0
  175. package/dist/chunk-YKJBSMMP.js +67137 -0
  176. package/dist/chunk-YKJBSMMP.js.map +1 -0
  177. package/dist/{chunk-2JSDPUKD.js → chunk-YMFPFXEX.js} +2 -2
  178. package/dist/{chunk-645WOU5I.js → chunk-ZDZJNXL6.js} +4 -4
  179. package/dist/{chunk-6TCXIRP5.js → chunk-ZKE4CO6B.js} +4 -4
  180. package/dist/{chunk-FNXQZGUS.js → chunk-ZSE774RV.js} +2 -2
  181. package/dist/cli.js +302 -184
  182. package/dist/coding/export-okf-codegraph.js +28 -28
  183. package/dist/compounding/engine.js +22 -23
  184. package/dist/config.js +35 -36
  185. package/dist/connectors/codex-materialize-runner.js +19 -19
  186. package/dist/connectors/index.js +20 -20
  187. package/dist/connectors/live/google-drive.d.ts +2 -0
  188. package/dist/connectors/live/google-drive.d.ts.map +1 -1
  189. package/dist/consolidation-provenance-check.js +4 -4
  190. package/dist/consolidation-undo.js +5 -5
  191. package/dist/contradiction/index.js +7 -6
  192. package/dist/{contradiction-scan-P2MHYFVG.js → contradiction-scan-IBPYGQZF.js} +4 -3
  193. package/dist/convergence-refresh.js +21 -21
  194. package/dist/corpus-watermark.js +22 -22
  195. package/dist/deep-recall-http-glue.js +2 -2
  196. package/dist/deep-recall-policy-llm.js +4 -4
  197. package/dist/direct-answer-wiring.js +2 -2
  198. package/dist/embedding-fallback.js +1 -1
  199. package/dist/entity-retrieval.js +20 -20
  200. package/dist/eval-trajectory-store.js +2 -2
  201. package/dist/eval-trajectory.js +2 -2
  202. package/dist/event-order-recall.js +2 -2
  203. package/dist/explicit-capture.d.ts +3 -2
  204. package/dist/explicit-capture.d.ts.map +1 -1
  205. package/dist/explicit-capture.js +530 -6
  206. package/dist/explicit-cue-recall.js +2 -2
  207. package/dist/external-wiki-access.js +2 -283
  208. package/dist/extraction-faithfulness.js +4 -4
  209. package/dist/extraction-judge.js +5 -5
  210. package/dist/extraction-normalization.js +1 -1
  211. package/dist/extraction-quote-grounding.d.ts.map +1 -1
  212. package/dist/extraction-quote-grounding.js +1 -1
  213. package/dist/extraction-source-grounding-rules.js +2 -2
  214. package/dist/extraction-source-grounding.js +3 -3
  215. package/dist/extraction.js +42 -43
  216. package/dist/fallback-llm-codex-subscription.js +2 -2
  217. package/dist/fallback-llm.js +3 -3
  218. package/dist/{first-start-migration-QFI7B5SH.js → first-start-migration-FILJH3RO.js} +6 -5
  219. package/dist/{first-start-migration-QFI7B5SH.js.map → first-start-migration-FILJH3RO.js.map} +1 -1
  220. package/dist/focused-list-recall.js +2 -2
  221. package/dist/harmonic-retrieval.js +19 -19
  222. package/dist/index.js +772 -793
  223. package/dist/lcm/index.js +2 -2
  224. package/dist/live-connectors-runner.js +2 -3
  225. package/dist/local-llm-config.js +2 -2
  226. package/dist/local-llm-helpers.d.ts +4 -0
  227. package/dist/local-llm-helpers.d.ts.map +1 -1
  228. package/dist/local-llm-helpers.js +3 -1
  229. package/dist/local-llm.d.ts +4 -1
  230. package/dist/local-llm.d.ts.map +1 -1
  231. package/dist/local-llm.js +4 -4
  232. package/dist/location/index.js +26 -28
  233. package/dist/maintenance/memory-governance.js +19 -19
  234. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +19 -19
  235. package/dist/maintenance/rebuild-memory-projection-runner.js +21 -21
  236. package/dist/maintenance/rebuild-memory-projection.js +20 -20
  237. package/dist/memory-browse-operations.js +2 -283
  238. package/dist/memory-browse.js +8 -7
  239. package/dist/memory-controller.js +2 -2
  240. package/dist/memory-subject.js +2 -2
  241. package/dist/namespaces/migrate.js +20 -20
  242. package/dist/namespaces/search.js +5 -5
  243. package/dist/namespaces/storage.js +19 -19
  244. package/dist/offline-sync-changeset-generations.js +1 -1
  245. package/dist/offline-sync-embedding-generation.js +1 -1
  246. package/dist/offline-sync-impression-drain.js +6 -6
  247. package/dist/offline-sync-snapshot-stream.js +1 -1
  248. package/dist/offline-sync.js +1 -1
  249. package/dist/operator-doctor-corpus.js +23 -23
  250. package/dist/operator-toolkit.js +57 -60
  251. package/dist/orchestration/backlog-scheduler.js +277 -293
  252. package/dist/orchestration/backlog-scheduler.js.map +1 -1
  253. package/dist/orchestration/buffer-drain-runner.js +277 -293
  254. package/dist/orchestration/extraction-run.d.ts +4 -0
  255. package/dist/orchestration/extraction-run.d.ts.map +1 -1
  256. package/dist/orchestration/fact-dedup-window.d.ts +1 -1
  257. package/dist/orchestration/fact-dedup-window.d.ts.map +1 -1
  258. package/dist/orchestration/maintenance.js +38 -41
  259. package/dist/orchestrator.d.ts +9 -11
  260. package/dist/orchestrator.d.ts.map +1 -1
  261. package/dist/orchestrator.js +289 -306
  262. package/dist/page-versioning.js +3 -3
  263. package/dist/qmd-daemon-session.js +2 -2
  264. package/dist/qmd.js +3 -3
  265. package/dist/recall-explain-renderer.js +1 -1
  266. package/dist/recall-navigation-operations.js +2 -283
  267. package/dist/recall-navigation.js +331 -58
  268. package/dist/recall-planner-llm.js +3 -3
  269. package/dist/recall-state-view-admission.js +6 -6
  270. package/dist/recall-why-service.js +10 -9
  271. package/dist/recall-why.js +4 -3
  272. package/dist/recall-xray-cli.js +2 -2
  273. package/dist/recall-xray-renderer.js +1 -1
  274. package/dist/reconcile/manifest.js +3 -3
  275. package/dist/{resolution-N7H3F2E4.js → resolution-OVVIF7ZY.js} +8 -7
  276. package/dist/response-guidance-recall.js +2 -2
  277. package/dist/resume-bundles.js +39 -40
  278. package/dist/salvage-envelope.js +4 -4
  279. package/dist/search/factory.js +4 -4
  280. package/dist/search/index.js +4 -4
  281. package/dist/semantic-consolidation.js +22 -22
  282. package/dist/semantic-rule-promotion.js +19 -19
  283. package/dist/semantic-rule-verifier.js +19 -19
  284. package/dist/shared-context/manager.js +2 -3
  285. package/dist/source-agent-qualifier.js +31 -32
  286. package/dist/standup/build.js +19 -19
  287. package/dist/storage/content-hash-index.d.ts +10 -0
  288. package/dist/storage/content-hash-index.d.ts.map +1 -1
  289. package/dist/storage.js +18 -18
  290. package/dist/subject-config.js +3 -3
  291. package/dist/summarizer.d.ts +4 -1
  292. package/dist/summarizer.d.ts.map +1 -1
  293. package/dist/summarizer.js +6 -6
  294. package/dist/support-passport/index.js +53 -297
  295. package/dist/targeted-fact-recall.js +2 -2
  296. package/dist/tier-routing.js +3 -2
  297. package/dist/{tier-stats-FQGQSFET.js → tier-stats-FXEUJN73.js} +6 -5
  298. package/dist/{tier-stats-FQGQSFET.js.map → tier-stats-FXEUJN73.js.map} +1 -1
  299. package/dist/transcript.js +2 -2
  300. package/dist/transfer/capsule-import.js +4 -4
  301. package/dist/transfer/export-okf.js +19 -19
  302. package/dist/verified-recall.js +19 -19
  303. package/dist/wearables/memory-gen.d.ts +5 -1
  304. package/dist/wearables/memory-gen.d.ts.map +1 -1
  305. package/dist/wearables/service.d.ts.map +1 -1
  306. package/dist/who-knows-cli.js +20 -20
  307. package/dist/who-knows.js +19 -19
  308. package/dist/write-envelope.js +3 -3
  309. package/package.json +2 -2
  310. package/src/access-boundary.ts +5 -1
  311. package/src/access-category-alias.test.ts +5 -0
  312. package/src/access-mcp-frames.test.ts +60 -5
  313. package/src/access-mcp-frames.ts +72 -18
  314. package/src/access-mcp.test.ts +66 -2
  315. package/src/access-mcp.ts +19 -13
  316. package/src/access-service-coding-write.test.ts +7 -0
  317. package/src/activity/journal-extract-storage.test.ts +31 -0
  318. package/src/activity/journal-extract.test.ts +1 -0
  319. package/src/activity/journal-extract.ts +24 -3
  320. package/src/connectors/live/google-drive.test.ts +39 -0
  321. package/src/connectors/live/google-drive.ts +41 -12
  322. package/src/explicit-capture.test.ts +109 -17
  323. package/src/explicit-capture.ts +90 -37
  324. package/src/extraction-quote-grounding.test.ts +20 -0
  325. package/src/extraction-quote-grounding.ts +21 -11
  326. package/src/fact-dedup-window.test.ts +37 -0
  327. package/src/local-llm-helpers.ts +12 -0
  328. package/src/local-llm-shutdown.test.ts +194 -0
  329. package/src/local-llm.ts +32 -30
  330. package/src/orchestration/extraction-run.ts +12 -3
  331. package/src/orchestration/fact-dedup-window.ts +5 -1
  332. package/src/orchestrator-connector-dedup.test.ts +9 -5
  333. package/src/orchestrator.ts +47 -50
  334. package/src/storage/content-hash-index.ts +27 -2
  335. package/src/storage-fact-hash-publish-failure.test.ts +87 -0
  336. package/src/summarizer-shutdown.test.ts +195 -0
  337. package/src/summarizer.ts +15 -2
  338. package/src/wearables/memory-gen.test.ts +20 -0
  339. package/src/wearables/memory-gen.ts +14 -7
  340. package/src/wearables/service.ts +14 -1
  341. package/src/wearables/storage-io.test.ts +25 -0
  342. package/dist/chunk-2FGLEF7C.js +0 -61
  343. package/dist/chunk-2FGLEF7C.js.map +0 -1
  344. package/dist/chunk-3RLK65ZK.js +0 -203
  345. package/dist/chunk-3RLK65ZK.js.map +0 -1
  346. package/dist/chunk-4WR2OD7K.js +0 -43
  347. package/dist/chunk-4WR2OD7K.js.map +0 -1
  348. package/dist/chunk-5KBIOI4G.js.map +0 -1
  349. package/dist/chunk-5M5M22GW.js +0 -346
  350. package/dist/chunk-5M5M22GW.js.map +0 -1
  351. package/dist/chunk-7HTUYFR3.js.map +0 -1
  352. package/dist/chunk-AP6NCP3V.js.map +0 -1
  353. package/dist/chunk-B4QYQFGY.js.map +0 -1
  354. package/dist/chunk-BJRTMNCB.js +0 -1919
  355. package/dist/chunk-BJRTMNCB.js.map +0 -1
  356. package/dist/chunk-BRLXOZLM.js.map +0 -1
  357. package/dist/chunk-BSACVS6R.js +0 -621
  358. package/dist/chunk-BSACVS6R.js.map +0 -1
  359. package/dist/chunk-DKAA2IHQ.js +0 -3644
  360. package/dist/chunk-DKAA2IHQ.js.map +0 -1
  361. package/dist/chunk-E4IRW2FG.js.map +0 -1
  362. package/dist/chunk-E6M225BJ.js.map +0 -1
  363. package/dist/chunk-EQ4U73UH.js.map +0 -1
  364. package/dist/chunk-ETSJD5IV.js +0 -361
  365. package/dist/chunk-ETSJD5IV.js.map +0 -1
  366. package/dist/chunk-F55YQP7N.js +0 -336
  367. package/dist/chunk-F55YQP7N.js.map +0 -1
  368. package/dist/chunk-FHGWKODN.js +0 -2300
  369. package/dist/chunk-FHGWKODN.js.map +0 -1
  370. package/dist/chunk-FLRP63GU.js +0 -32219
  371. package/dist/chunk-FLRP63GU.js.map +0 -1
  372. package/dist/chunk-FSO3G4JJ.js.map +0 -1
  373. package/dist/chunk-ID6JGIMD.js +0 -25
  374. package/dist/chunk-ID6JGIMD.js.map +0 -1
  375. package/dist/chunk-IGLJNHOX.js +0 -62
  376. package/dist/chunk-IGLJNHOX.js.map +0 -1
  377. package/dist/chunk-IPT2OY4B.js.map +0 -1
  378. package/dist/chunk-IUKYFTGW.js.map +0 -1
  379. package/dist/chunk-NBH6K6G5.js.map +0 -1
  380. package/dist/chunk-NTRUKAAE.js +0 -223
  381. package/dist/chunk-NTRUKAAE.js.map +0 -1
  382. package/dist/chunk-OGXXGHW6.js +0 -223
  383. package/dist/chunk-OGXXGHW6.js.map +0 -1
  384. package/dist/chunk-PPCLZ4JU.js +0 -28
  385. package/dist/chunk-PPCLZ4JU.js.map +0 -1
  386. package/dist/chunk-QJPJXCS4.js.map +0 -1
  387. package/dist/chunk-R2LBF4HH.js +0 -729
  388. package/dist/chunk-R2LBF4HH.js.map +0 -1
  389. package/dist/chunk-RHQLIHMB.js.map +0 -1
  390. package/dist/chunk-RRTVGD3J.js +0 -792
  391. package/dist/chunk-RRTVGD3J.js.map +0 -1
  392. package/dist/chunk-SUSW74WU.js.map +0 -1
  393. package/dist/chunk-T6OZW2WR.js.map +0 -1
  394. package/dist/chunk-UDKWFDV2.js.map +0 -1
  395. package/dist/chunk-V7IZKJI3.js +0 -22
  396. package/dist/chunk-V7IZKJI3.js.map +0 -1
  397. package/dist/chunk-X562NQFA.js +0 -10144
  398. package/dist/chunk-X562NQFA.js.map +0 -1
  399. package/dist/chunk-XDSCJOH7.js +0 -3991
  400. package/dist/chunk-XDSCJOH7.js.map +0 -1
  401. package/dist/chunk-YCNIGRRF.js.map +0 -1
  402. package/dist/chunk-ZTTCDQ4I.js +0 -18796
  403. package/dist/chunk-ZTTCDQ4I.js.map +0 -1
  404. /package/dist/{capsule-merge-2IIXFXN5.js.map → capsule-merge-6IDAYTKG.js.map} +0 -0
  405. /package/dist/{chunk-ATPWZ4F7.js.map → chunk-2LMA22UU.js.map} +0 -0
  406. /package/dist/{chunk-RGUUBAT5.js.map → chunk-2WCLTWV2.js.map} +0 -0
  407. /package/dist/{chunk-BQZEGOZ4.js.map → chunk-2YODOG2O.js.map} +0 -0
  408. /package/dist/{chunk-WYG5UNDY.js.map → chunk-3AUDELZL.js.map} +0 -0
  409. /package/dist/{chunk-N4KAE2NB.js.map → chunk-3CYOCE6U.js.map} +0 -0
  410. /package/dist/{chunk-MB6ZJDN6.js.map → chunk-3FBAEPCU.js.map} +0 -0
  411. /package/dist/{chunk-PIITB2YZ.js.map → chunk-3ZS3NUEI.js.map} +0 -0
  412. /package/dist/{chunk-ANZZLRUX.js.map → chunk-4IVRQMZW.js.map} +0 -0
  413. /package/dist/{chunk-63E37JCN.js.map → chunk-4RAJT5L2.js.map} +0 -0
  414. /package/dist/{chunk-45VUHDV2.js.map → chunk-5CO5G4MN.js.map} +0 -0
  415. /package/dist/{chunk-LUJCQQ3L.js.map → chunk-65HWAQ4F.js.map} +0 -0
  416. /package/dist/{chunk-T67LUYCR.js.map → chunk-77NTFICT.js.map} +0 -0
  417. /package/dist/{chunk-UE6RRXMF.js.map → chunk-A4F7OIC5.js.map} +0 -0
  418. /package/dist/{chunk-U6UNF5ZS.js.map → chunk-B33YWUJV.js.map} +0 -0
  419. /package/dist/{chunk-RRJBDXAQ.js.map → chunk-B377OKUP.js.map} +0 -0
  420. /package/dist/{chunk-ETZLQOUR.js.map → chunk-BGHCSLE5.js.map} +0 -0
  421. /package/dist/{chunk-YYOMGOHB.js.map → chunk-BOK6BN5M.js.map} +0 -0
  422. /package/dist/{chunk-OH7QLI6W.js.map → chunk-BPPUH5JM.js.map} +0 -0
  423. /package/dist/{chunk-4J363OAA.js.map → chunk-BTI4C4MA.js.map} +0 -0
  424. /package/dist/{chunk-O6ZSWHVR.js.map → chunk-C2KE5DMD.js.map} +0 -0
  425. /package/dist/{chunk-47F6WWLQ.js.map → chunk-C73N66PR.js.map} +0 -0
  426. /package/dist/{chunk-E3A7ELSG.js.map → chunk-CGJYL633.js.map} +0 -0
  427. /package/dist/{chunk-WRT7GJ2D.js.map → chunk-CIWMTNHW.js.map} +0 -0
  428. /package/dist/{chunk-O55EKIEC.js.map → chunk-D3ZKHLN2.js.map} +0 -0
  429. /package/dist/{chunk-CD4BCCNP.js.map → chunk-DJ7WVEWX.js.map} +0 -0
  430. /package/dist/{chunk-PWXPRVLK.js.map → chunk-EFL24KOI.js.map} +0 -0
  431. /package/dist/{chunk-4CJTQHEG.js.map → chunk-ESLOLCD4.js.map} +0 -0
  432. /package/dist/{chunk-6F42QONS.js.map → chunk-ETBVCRVL.js.map} +0 -0
  433. /package/dist/{chunk-VILPVT4S.js.map → chunk-EZ47HOJ6.js.map} +0 -0
  434. /package/dist/{chunk-EFYN5I7Z.js.map → chunk-F4QFU5IZ.js.map} +0 -0
  435. /package/dist/{chunk-7W3RXOIG.js.map → chunk-FMKILENU.js.map} +0 -0
  436. /package/dist/{chunk-YLXETSAH.js.map → chunk-GCZJ7XRI.js.map} +0 -0
  437. /package/dist/{chunk-QFEDITXM.js.map → chunk-JNDMIAJ4.js.map} +0 -0
  438. /package/dist/{chunk-E5PPE4VA.js.map → chunk-K2VRKCPA.js.map} +0 -0
  439. /package/dist/{chunk-MKRYQROF.js.map → chunk-LGEHAQHK.js.map} +0 -0
  440. /package/dist/{chunk-XYTQJD7F.js.map → chunk-LMJVP5CM.js.map} +0 -0
  441. /package/dist/{chunk-FQKBJJYB.js.map → chunk-LPV72KRQ.js.map} +0 -0
  442. /package/dist/{chunk-2LCRG2YV.js.map → chunk-M2XR6B6V.js.map} +0 -0
  443. /package/dist/{chunk-P4WNBSTW.js.map → chunk-MH632KPO.js.map} +0 -0
  444. /package/dist/{chunk-ZU5JDLOH.js.map → chunk-MMRTPH3J.js.map} +0 -0
  445. /package/dist/{chunk-PMJFRDJI.js.map → chunk-MUX7IL77.js.map} +0 -0
  446. /package/dist/{chunk-HF3BKUVV.js.map → chunk-NAQ4A5IX.js.map} +0 -0
  447. /package/dist/{chunk-TVIVY7KU.js.map → chunk-NED7IR7B.js.map} +0 -0
  448. /package/dist/{chunk-6F5MJFXY.js.map → chunk-NHVAX7MH.js.map} +0 -0
  449. /package/dist/{chunk-TG3R2SID.js.map → chunk-NMGHGTVR.js.map} +0 -0
  450. /package/dist/{chunk-NGHDW6UU.js.map → chunk-NUQEREIP.js.map} +0 -0
  451. /package/dist/{chunk-5IIQU4JZ.js.map → chunk-OB72KNMF.js.map} +0 -0
  452. /package/dist/{chunk-JV4S6VDH.js.map → chunk-OJXJWNFY.js.map} +0 -0
  453. /package/dist/{chunk-Z7JIZ42P.js.map → chunk-PRAUN6PN.js.map} +0 -0
  454. /package/dist/{chunk-RWGRSKN5.js.map → chunk-PT4DZDJA.js.map} +0 -0
  455. /package/dist/{chunk-7EPY3IQL.js.map → chunk-PZJQ46DH.js.map} +0 -0
  456. /package/dist/{chunk-MXHMNKWG.js.map → chunk-QDESY76F.js.map} +0 -0
  457. /package/dist/{chunk-I6QGI65T.js.map → chunk-QRMG4HK4.js.map} +0 -0
  458. /package/dist/{chunk-ZU3NJNO7.js.map → chunk-QSF5SJAM.js.map} +0 -0
  459. /package/dist/{chunk-5IYOKDM4.js.map → chunk-R23JWJD3.js.map} +0 -0
  460. /package/dist/{chunk-7GLJMDEQ.js.map → chunk-RM2YUFH6.js.map} +0 -0
  461. /package/dist/{chunk-RIMK327Y.js.map → chunk-SGQPR5SX.js.map} +0 -0
  462. /package/dist/{chunk-ZGFLIK5H.js.map → chunk-SPAKBUJY.js.map} +0 -0
  463. /package/dist/{chunk-ER7XANP3.js.map → chunk-SQ3GEIEL.js.map} +0 -0
  464. /package/dist/{chunk-BLJT6JP2.js.map → chunk-SVT5IA2H.js.map} +0 -0
  465. /package/dist/{chunk-GVGAO3WV.js.map → chunk-TJ4F6H4H.js.map} +0 -0
  466. /package/dist/{chunk-R6HMAIKM.js.map → chunk-TOSPNM4T.js.map} +0 -0
  467. /package/dist/{chunk-HH5LY6RR.js.map → chunk-TRQE3RYR.js.map} +0 -0
  468. /package/dist/{chunk-RMXS4I66.js.map → chunk-TVDJEUV5.js.map} +0 -0
  469. /package/dist/{chunk-PLCYKAWH.js.map → chunk-TYRWSE4B.js.map} +0 -0
  470. /package/dist/{chunk-IQWUACVG.js.map → chunk-UHMHJX5G.js.map} +0 -0
  471. /package/dist/{chunk-YODUDA6R.js.map → chunk-UN4RVUG2.js.map} +0 -0
  472. /package/dist/{chunk-E6Z4FBX6.js.map → chunk-V2QSNFCT.js.map} +0 -0
  473. /package/dist/{chunk-E7YZXWIS.js.map → chunk-WKSQTMU7.js.map} +0 -0
  474. /package/dist/{chunk-RIZ5NUNN.js.map → chunk-WQ4XKIOX.js.map} +0 -0
  475. /package/dist/{chunk-QEYTRFR3.js.map → chunk-X26YOFGS.js.map} +0 -0
  476. /package/dist/{chunk-ITHZFHST.js.map → chunk-X2BVB74H.js.map} +0 -0
  477. /package/dist/{chunk-XYKBWTWI.js.map → chunk-XIYLWEXC.js.map} +0 -0
  478. /package/dist/{chunk-IBJ6U753.js.map → chunk-XKZBZOKV.js.map} +0 -0
  479. /package/dist/{chunk-65AUYLU3.js.map → chunk-XPXHQI6N.js.map} +0 -0
  480. /package/dist/{chunk-EXHXJETE.js.map → chunk-XRDYRWZI.js.map} +0 -0
  481. /package/dist/{chunk-2JSDPUKD.js.map → chunk-YMFPFXEX.js.map} +0 -0
  482. /package/dist/{chunk-645WOU5I.js.map → chunk-ZDZJNXL6.js.map} +0 -0
  483. /package/dist/{chunk-6TCXIRP5.js.map → chunk-ZKE4CO6B.js.map} +0 -0
  484. /package/dist/{chunk-FNXQZGUS.js.map → chunk-ZSE774RV.js.map} +0 -0
  485. /package/dist/{contradiction-scan-P2MHYFVG.js.map → contradiction-scan-IBPYGQZF.js.map} +0 -0
  486. /package/dist/{resolution-N7H3F2E4.js.map → resolution-OVVIF7ZY.js.map} +0 -0
@@ -1,203 +0,0 @@
1
- import {
2
- resolveCorpusNamespaceRoots
3
- } from "./chunk-ETZLQOUR.js";
4
- import {
5
- capabilityAllowsNamespace
6
- } from "./chunk-OGBQMY46.js";
7
- import {
8
- normalizeNamespaceIdentity
9
- } from "./chunk-VUFL7X3H.js";
10
- import {
11
- resolveNamespaceCapabilities
12
- } from "./chunk-C5LWPYS3.js";
13
-
14
- // src/orchestration/extraction-watermark.ts
15
- import path from "path";
16
- function readFailure(reason) {
17
- return {
18
- lastExtractionAt: null,
19
- readFailed: true,
20
- readError: reason
21
- };
22
- }
23
- function errorMessage(error) {
24
- return error instanceof Error ? error.message : String(error);
25
- }
26
- var ISO_TIMESTAMP_PATTERN = /^([+-]?\d{4,6})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?(?:\.(\d+))?(Z|[+-]\d{2}:?\d{2})$/i;
27
- function validatedTimestampMs(value) {
28
- const match = ISO_TIMESTAMP_PATTERN.exec(value);
29
- const parsed = Date.parse(value);
30
- if (!match || !Number.isFinite(parsed)) return null;
31
- const [, yearText, monthText, dayText, hourText, minuteText, secondText, fraction, zone] = match;
32
- const normalizedZone = zone.toUpperCase();
33
- const offsetMinuteText = normalizedZone.includes(":") ? normalizedZone.slice(4, 6) : normalizedZone.slice(3, 5);
34
- const year = Number(yearText);
35
- const month = Number(monthText);
36
- const day = Number(dayText);
37
- const hour = Number(hourText);
38
- const minute = Number(minuteText);
39
- const second = secondText !== void 0 ? Number(secondText) : 0;
40
- const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
41
- const daysInMonth = [31, leapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
42
- if (month < 1 || month > 12 || day < 1 || day > daysInMonth[month - 1]) return null;
43
- if (hour === 24) {
44
- const isEndOfDay = minute === 0 && second === 0 && /^0*$/.test(fraction ?? "");
45
- return isEndOfDay ? parsed : null;
46
- }
47
- const zoneSign = normalizedZone === "Z" || normalizedZone[0] === "+" ? 1 : -1;
48
- const offsetMinutes = normalizedZone === "Z" ? 0 : zoneSign * (Number(normalizedZone.slice(1, 3)) * 60 + Number(offsetMinuteText));
49
- const representedCalendar = new Date(parsed + offsetMinutes * 6e4);
50
- const millisecond = Number((fraction ?? "").padEnd(3, "0").slice(0, 3));
51
- const expected = [
52
- year,
53
- month,
54
- day,
55
- hour,
56
- minute,
57
- second,
58
- millisecond
59
- ];
60
- const actual = [
61
- representedCalendar.getUTCFullYear(),
62
- representedCalendar.getUTCMonth() + 1,
63
- representedCalendar.getUTCDate(),
64
- representedCalendar.getUTCHours(),
65
- representedCalendar.getUTCMinutes(),
66
- representedCalendar.getUTCSeconds(),
67
- representedCalendar.getUTCMilliseconds()
68
- ];
69
- return actual.every((part, index) => part === expected[index]) ? parsed : null;
70
- }
71
- function mergeRootStats(current, candidate) {
72
- if (!current && !candidate) return void 0;
73
- const currentCount = current?.extractionCount;
74
- const candidateCount = candidate?.extractionCount;
75
- const extractionCount = currentCount === void 0 && candidateCount === void 0 ? void 0 : (currentCount ?? 0) + (candidateCount ?? 0);
76
- const currentConsolidation = current?.lastConsolidationAt;
77
- const candidateConsolidation = candidate?.lastConsolidationAt;
78
- const hasConsolidation = currentConsolidation !== void 0 || candidateConsolidation !== void 0;
79
- return {
80
- ...extractionCount === void 0 ? {} : { extractionCount },
81
- ...hasConsolidation ? {
82
- lastConsolidationAt: newerWatermark(
83
- currentConsolidation ?? null,
84
- candidateConsolidation ?? null
85
- )
86
- } : {}
87
- };
88
- }
89
- function watermarkFromMeta(meta, name) {
90
- if (meta.lastExtractionAt !== null && meta.lastExtractionAt !== void 0 && validatedTimestampMs(meta.lastExtractionAt) === null) {
91
- return readFailure(`${name} watermark timestamp invalid`);
92
- }
93
- if (meta.lastConsolidationAt !== null && meta.lastConsolidationAt !== void 0 && validatedTimestampMs(meta.lastConsolidationAt) === null) {
94
- return readFailure(`${name} consolidation timestamp invalid`);
95
- }
96
- const hasRootStats = meta.extractionCount !== void 0 || meta.lastConsolidationAt !== void 0;
97
- return {
98
- lastExtractionAt: meta.lastExtractionAt ?? null,
99
- readFailed: false,
100
- ...hasRootStats ? {
101
- rootStats: {
102
- extractionCount: meta.extractionCount,
103
- lastConsolidationAt: meta.lastConsolidationAt
104
- }
105
- } : {}
106
- };
107
- }
108
- async function readWatermark(storage, name) {
109
- try {
110
- return watermarkFromMeta(await storage.loadMeta(), name);
111
- } catch (error) {
112
- return readFailure(`${name} watermark unreadable: ${errorMessage(error)}`);
113
- }
114
- }
115
- async function resolveRoots(options) {
116
- const compute = () => resolveCorpusNamespaceRoots({
117
- config: options.config,
118
- propagateDiscoveryErrors: true
119
- });
120
- if (options.rootsCache) {
121
- const { roots, refreshError } = options.rootsCache.getResolvedRootsStatus(compute);
122
- if (refreshError !== void 0) {
123
- return readFailure(`namespace watermark enumeration failed: ${errorMessage(refreshError)}`);
124
- }
125
- return roots ?? { lastExtractionAt: null, readFailed: false, pending: true };
126
- }
127
- try {
128
- return await compute();
129
- } catch (error) {
130
- return readFailure(`namespace watermark enumeration failed: ${errorMessage(error)}`);
131
- }
132
- }
133
- function isReadFailure(value) {
134
- return !Array.isArray(value);
135
- }
136
- function newerWatermark(current, candidate) {
137
- if (candidate === null) return current;
138
- const candidateMs = validatedTimestampMs(candidate);
139
- if (candidateMs === null) return current;
140
- if (current === null) return candidate;
141
- const currentMs = validatedTimestampMs(current);
142
- return currentMs === null || candidateMs > currentMs ? candidate : current;
143
- }
144
- async function readAggregateExtractionWatermark(options) {
145
- if (!resolveNamespaceCapabilities(options.config).namespaces) {
146
- return options.rootMeta ? watermarkFromMeta(options.rootMeta, "root store") : readWatermark(options.rootStorage, "root store");
147
- }
148
- const resolved = await resolveRoots(options);
149
- if (isReadFailure(resolved)) return resolved;
150
- const rootDir = path.resolve(options.rootStorage.dir);
151
- const seenDirs = /* @__PURE__ */ new Set([rootDir]);
152
- const targets = [];
153
- for (const root of resolved) {
154
- if (options.caps && !root.namespaces.some(
155
- (ns) => capabilityAllowsNamespace(options.caps, normalizeNamespaceIdentity(ns))
156
- )) {
157
- continue;
158
- }
159
- const resolvedDir = path.resolve(root.rootDir);
160
- if (seenDirs.has(resolvedDir)) continue;
161
- seenDirs.add(resolvedDir);
162
- targets.push(root);
163
- }
164
- const defaultNamespace = normalizeNamespaceIdentity(options.config.defaultNamespace);
165
- const hasMigratedDefault = resolved.some(
166
- (root) => path.resolve(root.rootDir) !== rootDir && root.namespaces.some((namespace) => normalizeNamespaceIdentity(namespace) === defaultNamespace)
167
- );
168
- const canAccessRoot = !hasMigratedDefault && (!options.caps || capabilityAllowsNamespace(options.caps, defaultNamespace));
169
- let rootRead = { lastExtractionAt: null, readFailed: false };
170
- if (canAccessRoot) {
171
- rootRead = options.rootMeta ? watermarkFromMeta(options.rootMeta, "root store") : await readWatermark(options.rootStorage, "root store");
172
- if (rootRead.readFailed) return rootRead;
173
- }
174
- let lastExtractionAt = rootRead.lastExtractionAt;
175
- let rootStats = rootRead.rootStats;
176
- const reads = await Promise.all(
177
- targets.map(async (target) => {
178
- try {
179
- const storage = await options.storageForNamespace(target.namespace, target.rootDir);
180
- return await readWatermark(storage, "namespace");
181
- } catch (error) {
182
- return readFailure(`namespace watermark storage unavailable: ${errorMessage(error)}`);
183
- }
184
- })
185
- );
186
- for (const read of reads) {
187
- if (read.readFailed) {
188
- return readFailure(read.readError ?? "namespace watermark unreadable");
189
- }
190
- lastExtractionAt = newerWatermark(lastExtractionAt, read.lastExtractionAt);
191
- rootStats = mergeRootStats(rootStats, read.rootStats);
192
- }
193
- return {
194
- lastExtractionAt,
195
- readFailed: false,
196
- ...rootStats ? { rootStats } : {}
197
- };
198
- }
199
-
200
- export {
201
- readAggregateExtractionWatermark
202
- };
203
- //# sourceMappingURL=chunk-3RLK65ZK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/orchestration/extraction-watermark.ts"],"sourcesContent":["import path from \"node:path\";\n\nimport { capabilityAllowsNamespace, type TokenCapabilities } from \"../access-token-capabilities.js\";\nimport { resolveNamespaceCapabilities } from \"../capabilities.js\";\nimport { resolveCorpusNamespaceRoots, type CorpusNamespaceRoot } from \"../corpus-watermark.js\";\nimport { normalizeNamespaceIdentity } from \"../namespaces/identity.js\";\nimport type { ExtractionRootStats, ExtractionWatermarkRead } from \"../extraction-liveness.js\";\nimport type { MetaState, PluginConfig } from \"../types.js\";\n\nexport interface ExtractionWatermarkMeta extends Pick<MetaState, \"lastExtractionAt\"> {\n extractionCount?: number;\n lastConsolidationAt?: string | null;\n}\n\nexport interface ExtractionWatermarkStorage {\n readonly dir: string;\n loadMeta(): Promise<ExtractionWatermarkMeta>;\n}\n\nexport interface ExtractionNamespaceRootCache {\n getResolvedRootsStatus(compute: () => Promise<CorpusNamespaceRoot[]>): {\n roots: CorpusNamespaceRoot[] | undefined;\n refreshError: unknown;\n };\n}\n\nexport interface AggregateExtractionWatermarkOptions {\n config: PluginConfig;\n rootStorage: ExtractionWatermarkStorage;\n rootMeta?: ExtractionWatermarkMeta;\n storageForNamespace(\n namespace: string,\n rootDir: string\n ): ExtractionWatermarkStorage | Promise<ExtractionWatermarkStorage>;\n rootsCache?: ExtractionNamespaceRootCache;\n caps?: TokenCapabilities;\n}\n\nfunction readFailure(reason: string): ExtractionWatermarkRead {\n return {\n lastExtractionAt: null,\n readFailed: true,\n readError: reason,\n };\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nconst ISO_TIMESTAMP_PATTERN =\n /^([+-]?\\d{4,6})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})(?::(\\d{2}))?(?:\\.(\\d+))?(Z|[+-]\\d{2}:?\\d{2})$/i;\n\nfunction validatedTimestampMs(value: string): number | null {\n const match = ISO_TIMESTAMP_PATTERN.exec(value);\n const parsed = Date.parse(value);\n if (!match || !Number.isFinite(parsed)) return null;\n const [, yearText, monthText, dayText, hourText, minuteText, secondText, fraction, zone] = match;\n const normalizedZone = zone.toUpperCase();\n const offsetMinuteText = normalizedZone.includes(\":\")\n ? normalizedZone.slice(4, 6)\n : normalizedZone.slice(3, 5);\n const year = Number(yearText);\n const month = Number(monthText);\n const day = Number(dayText);\n const hour = Number(hourText);\n const minute = Number(minuteText);\n const second = secondText !== undefined ? Number(secondText) : 0;\n const leapYear = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n const daysInMonth = [31, leapYear ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n if (month < 1 || month > 12 || day < 1 || day > daysInMonth[month - 1]!) return null;\n if (hour === 24) {\n const isEndOfDay = minute === 0 && second === 0 && /^0*$/.test(fraction ?? \"\");\n return isEndOfDay ? parsed : null;\n }\n const zoneSign = normalizedZone === \"Z\" || normalizedZone[0] === \"+\" ? 1 : -1;\n const offsetMinutes =\n normalizedZone === \"Z\"\n ? 0\n : zoneSign * (Number(normalizedZone.slice(1, 3)) * 60 + Number(offsetMinuteText));\n const representedCalendar = new Date(parsed + offsetMinutes * 60_000);\n const millisecond = Number((fraction ?? \"\").padEnd(3, \"0\").slice(0, 3));\n const expected = [\n year,\n month,\n day,\n hour,\n minute,\n second,\n millisecond,\n ];\n const actual = [\n representedCalendar.getUTCFullYear(),\n representedCalendar.getUTCMonth() + 1,\n representedCalendar.getUTCDate(),\n representedCalendar.getUTCHours(),\n representedCalendar.getUTCMinutes(),\n representedCalendar.getUTCSeconds(),\n representedCalendar.getUTCMilliseconds(),\n ];\n return actual.every((part, index) => part === expected[index]) ? parsed : null;\n}\n\nfunction mergeRootStats(\n current: ExtractionRootStats | undefined,\n candidate: ExtractionRootStats | undefined,\n): ExtractionRootStats | undefined {\n if (!current && !candidate) return undefined;\n const currentCount = current?.extractionCount;\n const candidateCount = candidate?.extractionCount;\n const extractionCount =\n currentCount === undefined && candidateCount === undefined\n ? undefined\n : (currentCount ?? 0) + (candidateCount ?? 0);\n const currentConsolidation = current?.lastConsolidationAt;\n const candidateConsolidation = candidate?.lastConsolidationAt;\n const hasConsolidation =\n currentConsolidation !== undefined || candidateConsolidation !== undefined;\n return {\n ...(extractionCount === undefined ? {} : { extractionCount }),\n ...(hasConsolidation\n ? {\n lastConsolidationAt: newerWatermark(\n currentConsolidation ?? null,\n candidateConsolidation ?? null,\n ),\n }\n : {}),\n };\n}\n\nfunction watermarkFromMeta(meta: ExtractionWatermarkMeta, name: string): ExtractionWatermarkRead {\n if (\n meta.lastExtractionAt !== null &&\n meta.lastExtractionAt !== undefined &&\n validatedTimestampMs(meta.lastExtractionAt) === null\n ) {\n return readFailure(`${name} watermark timestamp invalid`);\n }\n if (\n meta.lastConsolidationAt !== null &&\n meta.lastConsolidationAt !== undefined &&\n validatedTimestampMs(meta.lastConsolidationAt) === null\n ) {\n return readFailure(`${name} consolidation timestamp invalid`);\n }\n const hasRootStats = meta.extractionCount !== undefined || meta.lastConsolidationAt !== undefined;\n return {\n lastExtractionAt: meta.lastExtractionAt ?? null,\n readFailed: false,\n ...(hasRootStats\n ? {\n rootStats: {\n extractionCount: meta.extractionCount,\n lastConsolidationAt: meta.lastConsolidationAt,\n },\n }\n : {}),\n };\n}\n\nasync function readWatermark(storage: ExtractionWatermarkStorage, name: string): Promise<ExtractionWatermarkRead> {\n try {\n return watermarkFromMeta(await storage.loadMeta(), name);\n } catch (error) {\n return readFailure(`${name} watermark unreadable: ${errorMessage(error)}`);\n }\n}\n\nasync function resolveRoots(\n options: AggregateExtractionWatermarkOptions\n): Promise<CorpusNamespaceRoot[] | ExtractionWatermarkRead> {\n const compute = () =>\n resolveCorpusNamespaceRoots({\n config: options.config,\n propagateDiscoveryErrors: true,\n });\n if (options.rootsCache) {\n const { roots, refreshError } = options.rootsCache.getResolvedRootsStatus(compute);\n if (refreshError !== undefined) {\n return readFailure(`namespace watermark enumeration failed: ${errorMessage(refreshError)}`);\n }\n return roots ?? { lastExtractionAt: null, readFailed: false, pending: true };\n }\n try {\n return await compute();\n } catch (error) {\n return readFailure(`namespace watermark enumeration failed: ${errorMessage(error)}`);\n }\n}\n\nfunction isReadFailure(value: CorpusNamespaceRoot[] | ExtractionWatermarkRead): value is ExtractionWatermarkRead {\n return !Array.isArray(value);\n}\n\nfunction newerWatermark(current: string | null, candidate: string | null): string | null {\n if (candidate === null) return current;\n const candidateMs = validatedTimestampMs(candidate);\n if (candidateMs === null) return current;\n if (current === null) return candidate;\n const currentMs = validatedTimestampMs(current);\n return currentMs === null || candidateMs > currentMs ? candidate : current;\n}\n\nexport async function readAggregateExtractionWatermark(\n options: AggregateExtractionWatermarkOptions\n): Promise<ExtractionWatermarkRead> {\n if (!resolveNamespaceCapabilities(options.config).namespaces) {\n return options.rootMeta\n ? watermarkFromMeta(options.rootMeta, \"root store\")\n : readWatermark(options.rootStorage, \"root store\");\n }\n\n const resolved = await resolveRoots(options);\n if (isReadFailure(resolved)) return resolved;\n\n const rootDir = path.resolve(options.rootStorage.dir);\n const seenDirs = new Set<string>([rootDir]);\n const targets: CorpusNamespaceRoot[] = [];\n for (const root of resolved) {\n if (\n options.caps &&\n !root.namespaces.some((ns) =>\n capabilityAllowsNamespace(options.caps, normalizeNamespaceIdentity(ns)),\n )\n ) {\n continue;\n }\n const resolvedDir = path.resolve(root.rootDir);\n if (seenDirs.has(resolvedDir)) continue;\n seenDirs.add(resolvedDir);\n targets.push(root);\n }\n\n const defaultNamespace = normalizeNamespaceIdentity(options.config.defaultNamespace);\n const hasMigratedDefault = resolved.some(\n (root) =>\n path.resolve(root.rootDir) !== rootDir &&\n root.namespaces.some((namespace) => normalizeNamespaceIdentity(namespace) === defaultNamespace),\n );\n const canAccessRoot =\n !hasMigratedDefault &&\n (!options.caps || capabilityAllowsNamespace(options.caps, defaultNamespace));\n let rootRead: ExtractionWatermarkRead = { lastExtractionAt: null, readFailed: false };\n if (canAccessRoot) {\n rootRead = options.rootMeta\n ? watermarkFromMeta(options.rootMeta, \"root store\")\n : await readWatermark(options.rootStorage, \"root store\");\n if (rootRead.readFailed) return rootRead;\n }\n let lastExtractionAt = rootRead.lastExtractionAt;\n let rootStats = rootRead.rootStats;\n\n const reads = await Promise.all(\n targets.map(async (target) => {\n try {\n const storage = await options.storageForNamespace(target.namespace, target.rootDir);\n return await readWatermark(storage, \"namespace\");\n } catch (error) {\n return readFailure(`namespace watermark storage unavailable: ${errorMessage(error)}`);\n }\n })\n );\n\n for (const read of reads) {\n if (read.readFailed) {\n return readFailure(read.readError ?? \"namespace watermark unreadable\");\n }\n lastExtractionAt = newerWatermark(lastExtractionAt, read.lastExtractionAt);\n rootStats = mergeRootStats(rootStats, read.rootStats);\n }\n return {\n lastExtractionAt,\n readFailed: false,\n ...(rootStats ? { rootStats } : {}),\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,43 +0,0 @@
1
- import {
2
- isNamespaceKind
3
- } from "./chunk-BRLXOZLM.js";
4
- import {
5
- EngramAccessInputError
6
- } from "./chunk-CJCTKL6Y.js";
7
-
8
- // src/access-http-query.ts
9
- function optionalQueryString(value, label) {
10
- if (value === void 0 || value === null || value === "") return void 0;
11
- if (typeof value !== "string") {
12
- throw new EngramAccessInputError(`${label} must be a string (got ${JSON.stringify(value)})`);
13
- }
14
- return value;
15
- }
16
- function nonEmptyQueryParam(value) {
17
- return value !== null && value.length > 0 ? value : void 0;
18
- }
19
- function positiveIntQueryParam(value, label) {
20
- if (value === null || value.length === 0) return void 0;
21
- const parsed = Number(value);
22
- if (!Number.isFinite(parsed) || parsed <= 0 || !Number.isInteger(parsed)) {
23
- throw new EngramAccessInputError(`${label} expects a positive integer`);
24
- }
25
- return parsed;
26
- }
27
- function optionalNamespaceKindQueryParam(value) {
28
- if (value === null || value.length === 0) return void 0;
29
- if (!isNamespaceKind(value)) {
30
- throw new EngramAccessInputError(
31
- "kind must be one of: default, shared, project, branch, team-project, explicit"
32
- );
33
- }
34
- return value;
35
- }
36
-
37
- export {
38
- optionalQueryString,
39
- nonEmptyQueryParam,
40
- positiveIntQueryParam,
41
- optionalNamespaceKindQueryParam
42
- };
43
- //# sourceMappingURL=chunk-4WR2OD7K.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/access-http-query.ts"],"sourcesContent":["import { EngramAccessInputError } from \"./access-service.js\";\nimport { isNamespaceKind, type NamespaceKind } from \"./namespaces/catalog.js\";\n\n/** Optional string field from a JSON body: absent/null/\"\" → undefined. */\nexport function optionalQueryString(value: unknown, label: string): string | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n if (typeof value !== \"string\") {\n throw new EngramAccessInputError(`${label} must be a string (got ${JSON.stringify(value)})`);\n }\n return value;\n}\n\n/** Optional non-empty query param: null/\"\" → undefined. */\nexport function nonEmptyQueryParam(value: string | null): string | undefined {\n return value !== null && value.length > 0 ? value : undefined;\n}\n\n/** Optional positive-integer query param; rejects invalid values. */\nexport function positiveIntQueryParam(value: string | null, label: string): number | undefined {\n if (value === null || value.length === 0) return undefined;\n const parsed = Number(value);\n if (!Number.isFinite(parsed) || parsed <= 0 || !Number.isInteger(parsed)) {\n throw new EngramAccessInputError(`${label} expects a positive integer`);\n }\n return parsed;\n}\n\n/** Optional namespace-kind query param; rejects dead or unknown kinds. */\nexport function optionalNamespaceKindQueryParam(value: string | null): NamespaceKind | undefined {\n if (value === null || value.length === 0) return undefined;\n if (!isNamespaceKind(value)) {\n throw new EngramAccessInputError(\n \"kind must be one of: default, shared, project, branch, team-project, explicit\",\n );\n }\n return value;\n}\n"],"mappings":";;;;;;;;AAIO,SAAS,oBAAoB,OAAgB,OAAmC;AACrF,MAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,GAAI,QAAO;AAClE,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,uBAAuB,GAAG,KAAK,0BAA0B,KAAK,UAAU,KAAK,CAAC,GAAG;AAAA,EAC7F;AACA,SAAO;AACT;AAGO,SAAS,mBAAmB,OAA0C;AAC3E,SAAO,UAAU,QAAQ,MAAM,SAAS,IAAI,QAAQ;AACtD;AAGO,SAAS,sBAAsB,OAAsB,OAAmC;AAC7F,MAAI,UAAU,QAAQ,MAAM,WAAW,EAAG,QAAO;AACjD,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,KAAK,CAAC,OAAO,UAAU,MAAM,GAAG;AACxE,UAAM,IAAI,uBAAuB,GAAG,KAAK,6BAA6B;AAAA,EACxE;AACA,SAAO;AACT;AAGO,SAAS,gCAAgC,OAAiD;AAC/F,MAAI,UAAU,QAAQ,MAAM,WAAW,EAAG,QAAO;AACjD,MAAI,CAAC,gBAAgB,KAAK,GAAG;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shared-context/manager.ts","../src/shared-context/contradictions.ts","../src/shared-context/curation-lint.ts","../src/shared-context/provenance.ts","../src/shared-context/staleness.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { Stats } from \"node:fs\";\nimport { mkdir, readFile, readdir, appendFile, writeFile, stat, lstat, realpath, rename, rm } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { log } from \"../logger.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\nimport { expandTildePath } from \"../utils/path.js\";\nimport { pathIsInside } from \"../utils/path-containment.js\";\nimport { resolveConversationContextCapabilities } from \"../capabilities.js\";\nimport { throwIfAborted } from \"../abort-error.js\";\nimport {\n composeWriteEnvelope,\n envelopeFromScalars,\n envelopeToFrontmatterLines,\n resolveReadAuthority,\n resolveWriteOrigin,\n} from \"./envelope-io.js\";\nimport type { SharedAuthority, SharedEnvelope } from \"./governance.js\";\nimport { detectContradictionPair } from \"./contradictions.js\";\nimport { lintCuratedClaims } from \"./curation-lint.js\";\nimport { stampProvenance } from \"./provenance.js\";\nimport { filterLiveEnvelopes, markSupersededCirculation } from \"./staleness.js\";\n\nexport const SharedFeedbackEntrySchema = z.object({\n agent: z.string().min(1),\n decision: z.enum([\"approved\", \"approved_with_feedback\", \"rejected\"]),\n reason: z.string().min(1),\n date: z.string().min(8), // ISO-ish; keep loose\n learning: z.string().optional(),\n outcome: z.string().optional(),\n severity: z.enum([\"low\", \"medium\", \"high\"]).optional(),\n confidence: z.number().min(0).max(1).optional(),\n workflow: z.string().min(1).optional(),\n tags: z.array(z.string().min(1)).optional(),\n evidenceWindowStart: z.string().min(8).optional(),\n evidenceWindowEnd: z.string().min(8).optional(),\n refs: z.array(z.string()).optional(),\n});\n\nexport type SharedFeedbackEntry = z.infer<typeof SharedFeedbackEntrySchema>;\n\nfunction safeSlug(s: string): string {\n let slug = s.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n // Trim leading/trailing dashes without ReDoS-prone anchored quantifiers\n let start = 0;\n while (start < slug.length && slug[start] === \"-\") start++;\n let end = slug.length;\n while (end > start && slug[end - 1] === \"-\") end--;\n return slug.slice(start, end).slice(0, 80) || \"output\";\n}\n\nfunction safePathSegment(s: string, label: string): string {\n if (s.length === 0) throw new Error(`${label} must not be empty`);\n if (/[\\r\\n]/.test(s)) throw new Error(`${label} must not contain line breaks`);\n const encoded = encodeURIComponent(s);\n if (encoded === \".\" || encoded === \"..\") {\n return encoded.replace(/\\./g, \"%2E\");\n }\n return encoded;\n}\n\nfunction safeDecodePathSegment(s: string): string {\n try {\n return decodeURIComponent(s);\n } catch {\n return s;\n }\n}\n\nfunction normalizeFrontmatterScalar(value: string): string {\n if (value.length >= 2 && value.startsWith('\"') && value.endsWith('\"')) {\n try {\n const parsed = JSON.parse(value);\n if (typeof parsed === \"string\") return parsed;\n } catch {\n // Fall through to the legacy partial unescape below.\n }\n return value.slice(1, -1).replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\");\n }\n if (value.length >= 2 && value.startsWith(\"'\") && value.endsWith(\"'\")) {\n return value.slice(1, -1).replace(/''/g, \"'\");\n }\n return value;\n}\n\nfunction formatFrontmatterScalar(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction readFrontmatterScalar(raw: string, key: string): string | null {\n const frontmatter = raw.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---(?:\\r?\\n|$)/)?.[1];\n if (!frontmatter) return null;\n for (const line of frontmatter.split(/\\r?\\n/)) {\n if (!line.startsWith(`${key}:`)) continue;\n const value = line.slice(key.length + 1).trim();\n return value ? normalizeFrontmatterScalar(value) : null;\n }\n return null;\n}\n\nfunction ymd(d: Date): string {\n return d.toISOString().slice(0, 10);\n}\n\nfunction safeDateSegment(date: string): string {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(date)) {\n throw new Error(`Invalid shared-context date: ${JSON.stringify(date)}; expected YYYY-MM-DD`);\n }\n const parsed = new Date(`${date}T00:00:00.000Z`);\n if (!Number.isFinite(parsed.getTime()) || parsed.toISOString().slice(0, 10) !== date) {\n throw new Error(`Invalid shared-context date: ${JSON.stringify(date)}; expected a real calendar date`);\n }\n return date;\n}\n\nconst CROSS_SIGNAL_STOPWORDS = new Set([\n \"a\",\n \"an\",\n \"and\",\n \"are\",\n \"as\",\n \"at\",\n \"be\",\n \"by\",\n \"for\",\n \"from\",\n \"has\",\n \"have\",\n \"in\",\n \"is\",\n \"it\",\n \"of\",\n \"on\",\n \"or\",\n \"that\",\n \"the\",\n \"this\",\n \"to\",\n \"was\",\n \"were\",\n \"with\",\n \"agent\",\n \"output\",\n \"today\",\n \"daily\",\n \"notes\",\n \"note\",\n \"summary\",\n]);\n\nfunction extractTopicTokens(text: string, maxTokens: number = 12): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n const tokens = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .map((token) => token.trim())\n .filter((token) => token.length >= 4)\n .filter((token) => !CROSS_SIGNAL_STOPWORDS.has(token));\n\n for (const token of tokens) {\n if (seen.has(token)) continue;\n seen.add(token);\n out.push(token);\n if (out.length >= maxTokens) break;\n }\n return out;\n}\n\nfunction stripYamlFrontmatter(text: string): string {\n if (!text.startsWith(\"---\\n\")) return text;\n const closing = text.indexOf(\"\\n---\\n\", 4);\n if (closing === -1) return text;\n return text.slice(closing + 5);\n}\n\nfunction semanticRoot(token: string): string {\n let root = token.toLowerCase();\n if (root.endsWith(\"izations\") && root.length > 9) {\n root = `${root.slice(0, -8)}ize`;\n }\n else if (root.endsWith(\"ization\") && root.length > 8) {\n root = `${root.slice(0, -7)}ize`;\n } else if (root.endsWith(\"isations\") && root.length > 9) {\n root = `${root.slice(0, -8)}ise`;\n } else if (root.endsWith(\"isation\") && root.length > 8) {\n root = `${root.slice(0, -7)}ise`;\n } else {\n const suffixes = [\n \"ations\",\n \"ation\",\n \"ments\",\n \"ment\",\n \"ingly\",\n \"edly\",\n \"ings\",\n \"ing\",\n \"ers\",\n \"er\",\n \"ies\",\n \"ied\",\n \"ions\",\n \"ion\",\n \"es\",\n \"ed\",\n \"s\",\n ];\n for (const suffix of suffixes) {\n if (root.length > suffix.length + 3 && root.endsWith(suffix)) {\n root = root.slice(0, -suffix.length);\n break;\n }\n }\n }\n if (root.length > 4 && root.endsWith(\"e\")) {\n root = root.slice(0, -1);\n }\n return root;\n}\n\nfunction mergeOverlaps(\n base: SharedCrossSignalOverlap[],\n extra: SharedCrossSignalOverlap[],\n): SharedCrossSignalOverlap[] {\n const merged = new Map<string, { agents: Set<string>; sourcePaths: Set<string> }>();\n for (const entry of [...base, ...extra]) {\n const existing = merged.get(entry.token);\n if (existing) {\n for (const agent of entry.agents) existing.agents.add(agent);\n for (const sourcePath of entry.sourcePaths) existing.sourcePaths.add(sourcePath);\n } else {\n merged.set(entry.token, {\n agents: new Set(entry.agents),\n sourcePaths: new Set(entry.sourcePaths),\n });\n }\n }\n return [...merged.entries()]\n .map(([token, value]) => ({\n token,\n agents: [...value.agents].sort(),\n sourcePaths: [...value.sourcePaths].sort(),\n agentCount: value.agents.size,\n }))\n .filter((entry) => entry.agentCount >= 2)\n .sort((a, b) => b.agentCount - a.agentCount || a.token.localeCompare(b.token));\n}\n\nasync function computeSemanticOverlapCandidates(\n sources: SharedCrossSignalSource[],\n maxCandidates: number,\n timeoutAtMs: number,\n): Promise<{ overlaps: SharedCrossSignalOverlap[]; candidateCount: number; timedOut: boolean }> {\n const tokenRows: Array<{ token: string; agent: string; path: string }> = [];\n for (const source of sources) {\n for (const token of source.topics) {\n if (Date.now() >= timeoutAtMs) return { overlaps: [], candidateCount: tokenRows.length, timedOut: true };\n await new Promise<void>((resolve) => setImmediate(resolve));\n tokenRows.push({ token, agent: source.agent, path: source.path });\n if (tokenRows.length >= maxCandidates) break;\n }\n if (tokenRows.length >= maxCandidates) break;\n }\n\n const byRoot = new Map<string, Map<string, { agents: Set<string>; paths: Set<string> }>>();\n for (const row of tokenRows) {\n if (Date.now() >= timeoutAtMs) return { overlaps: [], candidateCount: tokenRows.length, timedOut: true };\n await new Promise<void>((resolve) => setImmediate(resolve));\n const root = semanticRoot(row.token);\n if (root.length < 4) continue;\n const rootGroup = byRoot.get(root) ?? new Map<string, { agents: Set<string>; paths: Set<string> }>();\n const tokenGroup = rootGroup.get(row.token) ?? { agents: new Set<string>(), paths: new Set<string>() };\n tokenGroup.agents.add(row.agent);\n tokenGroup.paths.add(row.path);\n rootGroup.set(row.token, tokenGroup);\n byRoot.set(root, rootGroup);\n }\n\n const overlaps: SharedCrossSignalOverlap[] = [];\n for (const [root, tokenMap] of byRoot.entries()) {\n if (Date.now() >= timeoutAtMs) return { overlaps: [], candidateCount: tokenRows.length, timedOut: true };\n await new Promise<void>((resolve) => setImmediate(resolve));\n if (tokenMap.size < 2) continue;\n const agents = new Set<string>();\n const sourcePaths = new Set<string>();\n for (const value of tokenMap.values()) {\n for (const agent of value.agents) agents.add(agent);\n for (const sourcePath of value.paths) sourcePaths.add(sourcePath);\n }\n if (agents.size < 2) continue;\n overlaps.push({\n token: `semantic:${root}`,\n agents: [...agents].sort(),\n sourcePaths: [...sourcePaths].sort(),\n agentCount: agents.size,\n });\n }\n\n overlaps.sort((a, b) => b.agentCount - a.agentCount || a.token.localeCompare(b.token));\n return {\n overlaps,\n candidateCount: tokenRows.length,\n timedOut: false,\n };\n}\n\nasync function computeSemanticOverlapsWithTimeout(\n sources: SharedCrossSignalSource[],\n timeoutMs: number,\n maxCandidates: number,\n): Promise<{ overlaps: SharedCrossSignalOverlap[]; candidateCount: number; timedOut: boolean }> {\n const safeTimeoutMs = Math.max(1, Math.floor(timeoutMs));\n const safeMaxCandidates = Math.max(0, Math.floor(maxCandidates));\n if (safeMaxCandidates === 0 || sources.length === 0) {\n return { overlaps: [], candidateCount: 0, timedOut: false };\n }\n const timeoutAtMs = Date.now() + safeTimeoutMs;\n return computeSemanticOverlapCandidates(sources, safeMaxCandidates, timeoutAtMs);\n}\n\ninterface SharedCrossSignalSource {\n agent: string;\n path: string;\n title: string;\n topics: string[];\n /** Resolved least-privilege authority from the item's envelope (issue #1957). */\n authority: SharedAuthority;\n /** Envelope origin agent id; legacy items fall back to the agent field. */\n sharedBy: string;\n}\n\ninterface SharedCrossSignalOverlap {\n token: string;\n agents: string[];\n sourcePaths: string[];\n agentCount: number;\n}\n\ninterface SharedCrossSignalReport {\n date: string;\n generatedAt: string;\n sourceCount: number;\n feedbackCount: number;\n feedbackByDecision: Record<\"approved\" | \"approved_with_feedback\" | \"rejected\", number>;\n feedbackEntries: SharedFeedbackEntry[];\n sources: SharedCrossSignalSource[];\n overlaps: SharedCrossSignalOverlap[];\n /** Control 2 (issue #1957): expiry drops and supersession circulation. */\n staleness: {\n expiredDropped: number;\n supersededStillCirculating: string[];\n };\n /** Control 3 (issue #1957): refs two agents ruled on differently. */\n disputed: Array<{ ref: string; agents: string[]; decisions: string[] }>;\n /** Control 4 (issue #1957): who synthesized this report and when. */\n provenance: { actor: string; at: string };\n semantic: {\n enabled: boolean;\n applied: boolean;\n timedOut: boolean;\n candidateCount: number;\n maxCandidates: number;\n addedOverlapCount: number;\n };\n}\n\nexport interface SharedCrossSignalSynthesisResult {\n date: string;\n crossSignalsPath: string;\n crossSignalsMarkdownPath: string;\n overlapCount: number;\n report: SharedCrossSignalReport;\n}\n\nexport interface SharedDailyCurationResult {\n date: string;\n roundtablePath: string;\n crossSignalsPath: string;\n crossSignalsMarkdownPath: string;\n overlapCount: number;\n}\n\nfunction feedbackDecisionPriority(decision: SharedFeedbackEntry[\"decision\"]): number {\n switch (decision) {\n case \"rejected\":\n return 3;\n case \"approved_with_feedback\":\n return 2;\n case \"approved\":\n return 1;\n }\n}\n\nfunction feedbackSeverityPriority(severity: SharedFeedbackEntry[\"severity\"]): number {\n switch (severity) {\n case \"high\":\n return 3;\n case \"medium\":\n return 2;\n case \"low\":\n return 1;\n default:\n return 0;\n }\n}\n\nfunction compareFeedbackPriority(a: SharedFeedbackEntry, b: SharedFeedbackEntry): number {\n return (\n feedbackDecisionPriority(b.decision) - feedbackDecisionPriority(a.decision)\n || feedbackSeverityPriority(b.severity) - feedbackSeverityPriority(a.severity)\n || a.date.localeCompare(b.date)\n );\n}\n\nfunction markdownLineText(value: string): string {\n return value.replace(/[\\r\\n]+/g, \" \").replace(/\\s+/g, \" \").trim();\n}\n\nfunction markdownLineList(values: readonly string[]): string {\n return values.map(markdownLineText).filter(Boolean).join(\", \");\n}\n\nfunction formatFeedbackLine(entry: SharedFeedbackEntry): string {\n const extras: string[] = [`feedback: ${markdownLineText(entry.date)}`];\n if (entry.severity) extras.push(`severity: ${markdownLineText(entry.severity)}`);\n if (entry.refs?.length) extras.push(`refs: ${markdownLineList(entry.refs)}`);\n return `- [${markdownLineText(entry.agent)}] ${entry.decision}: ${markdownLineText(entry.reason)} [${extras.join(\"; \")}]`;\n}\n\nfunction formatOverlapLine(entry: SharedCrossSignalOverlap): string {\n return `- \\`${entry.token}\\` (${entry.agentCount} agents: ${markdownLineList(entry.agents)}) [sources: ${markdownLineList(entry.sourcePaths)}]`;\n}\n\nfunction formatStalenessLines(report: SharedCrossSignalReport): string[] {\n const circulating = report.staleness.supersededStillCirculating;\n return [\n `- Expired items dropped: ${report.staleness.expiredDropped}`,\n circulating.length === 0\n ? \"- Superseded items still circulating: 0\"\n : `- Superseded items still circulating: ${circulating.length} (${markdownLineList(circulating)})`,\n ];\n}\n\nfunction formatDisputedLines(report: SharedCrossSignalReport): string[] {\n if (report.disputed.length === 0) return [\"- No contradictory agent judgments recorded.\"];\n return report.disputed.map((entry) =>\n `- \\`${entry.ref}\\` disputed by ${markdownLineList(entry.agents)} (decisions: ${markdownLineList(entry.decisions)})`\n );\n}\n\nasync function writeFileAtomic(filePath: string, content: string): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true });\n const tempPath = path.join(\n path.dirname(filePath),\n `.${path.basename(filePath)}.${process.pid}.${randomUUID()}.tmp`,\n );\n try {\n await writeFile(tempPath, content, { encoding: \"utf-8\", flag: \"wx\" });\n await rename(tempPath, filePath);\n } catch (error) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nexport function resolveSharedContextDir(config: PluginConfig): string {\n return typeof config.sharedContextDir === \"string\" && config.sharedContextDir.length > 0\n ? expandTildePath(config.sharedContextDir)\n : path.join(expandTildePath(config.workspaceDir), \"shared-context\");\n}\n\n/**\n * Feedback inbox path. An explicit `sharedContextDir` keeps the inbox beside\n * the other shared-context files. When that override is unset, the inbox\n * lives under the memory directory so a standalone store replicates it.\n * Priorities, outputs, and roundtable stay on {@link resolveSharedContextDir}.\n */\nexport function resolveFeedbackInboxPath(config: PluginConfig): string {\n if (typeof config.sharedContextDir === \"string\" && config.sharedContextDir.length > 0) {\n return path.join(resolveSharedContextDir(config), \"feedback\", \"inbox.jsonl\");\n }\n return path.join(expandTildePath(config.memoryDir), \"shared-context\", \"feedback\", \"inbox.jsonl\");\n}\n\n/**\n * Copy a pre-upgrade workspace inbox into the memory-dir inbox once.\n *\n * Older builds stored `feedback/inbox.jsonl` under the workspace\n * shared-context directory even when `sharedContextDir` was unset. The copy\n * runs only while the memory-dir inbox is missing or empty, and only for a\n * regular legacy file that stays inside the workspace. A non-empty memory-dir\n * inbox is left untouched, so a later workspace file is not read again.\n * An explicit `sharedContextDir` does not migrate.\n */\nexport async function migrateLegacyFeedbackInbox(config: PluginConfig): Promise<void> {\n if (typeof config.sharedContextDir === \"string\" && config.sharedContextDir.length > 0) return;\n const nextPath = resolveFeedbackInboxPath(config);\n const legacyPath = path.join(resolveSharedContextDir(config), \"feedback\", \"inbox.jsonl\");\n if (path.resolve(nextPath) === path.resolve(legacyPath)) return;\n if (!(await legacyInboxCanMigrate(legacyPath))) return;\n try {\n const nextProbe = await lstat(nextPath);\n if (nextProbe.isSymbolicLink() || !nextProbe.isFile() || nextProbe.size > 0) return;\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n }\n\n await mkdir(path.dirname(nextPath), { recursive: true });\n await withFeedbackMigrateLock(`${nextPath}.migrate.lock`, async () => {\n let nextStat: Stats | undefined;\n try {\n nextStat = await lstat(nextPath);\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n }\n if (nextStat && (nextStat.isSymbolicLink() || !nextStat.isFile() || nextStat.size > 0)) return;\n if (!(await legacyInboxCanMigrate(legacyPath))) return;\n\n const workspaceReal = await realpath(expandTildePath(config.workspaceDir));\n const legacyReal = await realpath(legacyPath);\n if (!pathIsInside(workspaceReal, legacyReal)) return;\n const memoryDir = expandTildePath(config.memoryDir);\n const memoryReal = await realpath(memoryDir);\n const nextParentReal = await realpath(path.dirname(nextPath));\n if (!pathIsInside(memoryReal, nextParentReal)) return;\n if (nextStat) {\n const nextReal = await realpath(nextPath);\n if (!pathIsInside(memoryReal, nextReal)) return;\n }\n\n const body = await readFile(legacyReal);\n const tempPath = path.join(\n path.dirname(nextPath),\n `.${path.basename(nextPath)}.${process.pid}.${randomUUID()}.migrate.tmp`,\n );\n await writeFile(tempPath, body, { flag: \"wx\" });\n try {\n let current: Stats | undefined;\n try {\n current = await lstat(nextPath);\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n }\n if (current && (current.isSymbolicLink() || !current.isFile() || current.size > 0)) return;\n await rename(tempPath, nextPath);\n } finally {\n await rm(tempPath, { force: true }).catch(() => undefined);\n }\n });\n}\n\nasync function legacyInboxCanMigrate(legacyPath: string): Promise<boolean> {\n let legacyStat: Stats;\n try {\n legacyStat = await lstat(legacyPath);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return false;\n throw err;\n }\n return !legacyStat.isSymbolicLink() && legacyStat.isFile() && legacyStat.size > 0;\n}\n\n/** One migration at a time. A lock older than 30s is stale and is replaced. */\nasync function withFeedbackMigrateLock(lockPath: string, body: () => Promise<void>): Promise<void> {\n const deadline = Date.now() + 2_000;\n while (Date.now() < deadline) {\n try {\n await writeFile(lockPath, \"\", { flag: \"wx\" });\n } catch (err) {\n if (!isErrnoCode(err, \"EEXIST\")) throw err;\n let lockStat: Stats;\n try {\n lockStat = await lstat(lockPath);\n } catch (statErr) {\n if (isErrnoCode(statErr, \"ENOENT\")) continue;\n throw statErr;\n }\n if (!lockStat.isSymbolicLink() && lockStat.isFile() && Date.now() - lockStat.mtimeMs > 30_000) {\n await rm(lockPath, { force: true });\n continue;\n }\n await new Promise((resolve) => setTimeout(resolve, 20));\n continue;\n }\n try {\n await body();\n } finally {\n await rm(lockPath, { force: true });\n }\n return;\n }\n throw new Error(\"feedback inbox migration did not acquire its lock before the wait elapsed\");\n}\n\nexport class SharedContextManager {\n readonly dir: string;\n private readonly prioritiesPath: string;\n private readonly prioritiesInboxPath: string;\n private readonly outputsDir: string;\n private readonly roundtableDir: string;\n private readonly feedbackDir: string;\n private readonly feedbackInboxPath: string;\n private readonly crossSignalsDir: string;\n private readonly allowBindingAuthority: boolean;\n private readonly dailySynthesisChains = new Map<string, Promise<void>>();\n\n constructor(private readonly config: PluginConfig) {\n const base = resolveSharedContextDir(config);\n\n this.dir = base;\n this.prioritiesPath = path.join(base, \"priorities.md\");\n this.prioritiesInboxPath = path.join(base, \"priorities.inbox.md\");\n this.outputsDir = path.join(base, \"agent-outputs\");\n this.roundtableDir = path.join(base, \"roundtable\");\n this.feedbackInboxPath = resolveFeedbackInboxPath(config);\n this.feedbackDir = path.dirname(this.feedbackInboxPath);\n this.crossSignalsDir = path.join(base, \"cross-signals\");\n this.allowBindingAuthority = config.sharedContextAllowBindingAuthority === true;\n }\n\n async ensureStructure(): Promise<void> {\n await mkdir(this.dir, { recursive: true });\n await mkdir(this.outputsDir, { recursive: true });\n await mkdir(this.roundtableDir, { recursive: true });\n await mkdir(this.feedbackDir, { recursive: true });\n await mkdir(this.crossSignalsDir, { recursive: true });\n await mkdir(path.join(this.dir, \"staging\"), { recursive: true });\n await mkdir(path.join(this.dir, \"kpis\"), { recursive: true });\n await mkdir(path.join(this.dir, \"calendar\"), { recursive: true });\n await mkdir(path.join(this.dir, \"content-calendar\"), { recursive: true });\n\n // Bootstrap files if missing.\n await this.ensureFile(\n this.prioritiesPath,\n [\n \"# Priorities\",\n \"\",\n \"This is the shared priority stack. Agents should read this before acting.\",\n \"\",\n \"## Current\",\n \"- (empty)\",\n \"\",\n \"## Notes\",\n \"- (empty)\",\n \"\",\n ].join(\"\\n\"),\n );\n await this.ensureFile(\n this.prioritiesInboxPath,\n [\n \"# Priorities Inbox\",\n \"\",\n \"Append-only inbox. Curator merges into priorities.md.\",\n \"\",\n ].join(\"\\n\"),\n );\n await migrateLegacyFeedbackInbox(this.config);\n await this.ensureFile(this.feedbackInboxPath, \"\");\n }\n\n private async ensureFile(fp: string, content: string): Promise<void> {\n try {\n await stat(fp);\n } catch {\n await writeFile(fp, content, \"utf-8\");\n }\n }\n\n async readPriorities(signal?: AbortSignal): Promise<string> {\n throwIfAborted(signal, \"shared context priorities read aborted\");\n try {\n const content = await readFile(this.prioritiesPath, { encoding: \"utf-8\", signal });\n throwIfAborted(signal, \"shared context priorities read aborted\");\n return content;\n } catch {\n throwIfAborted(signal, \"shared context priorities read aborted\");\n return \"\";\n }\n }\n\n async readLatestRoundtable(signal?: AbortSignal): Promise<string> {\n throwIfAborted(signal, \"shared context roundtable read aborted\");\n try {\n const files = (await readdir(this.roundtableDir))\n .filter((f) => f.endsWith(\".md\"))\n .sort()\n .reverse();\n throwIfAborted(signal, \"shared context roundtable read aborted\");\n const fp = files[0] ? path.join(this.roundtableDir, files[0]) : null;\n if (!fp) return \"\";\n const content = await readFile(fp, { encoding: \"utf-8\", signal });\n throwIfAborted(signal, \"shared context roundtable read aborted\");\n return content;\n } catch {\n throwIfAborted(signal, \"shared context roundtable read aborted\");\n return \"\";\n }\n }\n\n async readLatestCrossSignals(signal?: AbortSignal): Promise<string> {\n throwIfAborted(signal, \"shared context cross-signals read aborted\");\n try {\n const files = (await readdir(this.crossSignalsDir))\n .filter((f) => f.endsWith(\".md\"))\n .sort()\n .reverse();\n throwIfAborted(signal, \"shared context cross-signals read aborted\");\n const fp = files[0] ? path.join(this.crossSignalsDir, files[0]) : null;\n if (!fp) return \"\";\n const content = await readFile(fp, { encoding: \"utf-8\", signal });\n throwIfAborted(signal, \"shared context cross-signals read aborted\");\n return content;\n } catch {\n throwIfAborted(signal, \"shared context cross-signals read aborted\");\n return \"\";\n }\n }\n\n async writeAgentOutput(opts: {\n agentId: string;\n title: string;\n content: string;\n createdAt?: Date;\n /** Envelope authority class (issue #1957). Unrecognized values throw. */\n authority?: string;\n /** Optional ISO-8601 expiry stamped on the item. */\n expiresAt?: string;\n /** Optional id of the shared item this output supersedes. */\n supersedes?: string;\n /**\n * Server-resolved identity of the caller, supplied by the access\n * surface (issue #1957 review). When present it IS both the producer\n * and the envelope origin; a disagreeing caller-supplied `agentId` is\n * rejected so no caller can publish as another agent.\n */\n authenticatedIdentity?: string;\n /**\n * Server-owned origin token for a write that crosses an external\n * boundary but resolved no identity (issue #1957 review round 4).\n * Stamped as the envelope origin (`sharedBy`); the caller label stays\n * the producer so grouping never collapses.\n */\n unattributedOrigin?: string;\n }): Promise<string> {\n const identity = resolveWriteOrigin({\n agentId: opts.agentId,\n authenticatedIdentity: opts.authenticatedIdentity,\n unattributedOrigin: opts.unattributedOrigin,\n });\n const createdAt = opts.createdAt ?? new Date();\n const date = ymd(createdAt);\n const time = createdAt.toISOString().slice(11, 19).replace(/:/g, \"\");\n const slug = safeSlug(opts.title);\n const agentPathSegment = safePathSegment(identity.agent, \"agentId\");\n\n const envelope = composeWriteEnvelope({\n origin: identity.origin,\n authority: opts.authority,\n expiresAt: opts.expiresAt,\n supersedes: opts.supersedes,\n allowBinding: this.allowBindingAuthority,\n nowMs: createdAt.getTime(),\n });\n\n const dir = path.join(this.outputsDir, agentPathSegment, date);\n await mkdir(dir, { recursive: true });\n\n const body = [\n \"---\",\n \"kind: agent_output\",\n `agent: ${formatFrontmatterScalar(identity.agent)}`,\n `createdAt: ${createdAt.toISOString()}`,\n `title: ${formatFrontmatterScalar(opts.title.replace(/\\n/g, \" \").slice(0, 200))}`,\n ...envelopeToFrontmatterLines(envelope),\n \"---\",\n \"\",\n opts.content.trimEnd(),\n \"\",\n ].join(\"\\n\");\n\n for (let attempt = 0; attempt < 100; attempt++) {\n const suffix = attempt === 0 ? \"\" : `-${attempt + 1}`;\n const fp = path.join(dir, `${time}-${slug}${suffix}.md`);\n try {\n await writeFile(fp, body, { encoding: \"utf-8\", flag: \"wx\" });\n return fp;\n } catch (error) {\n if (error instanceof Error && \"code\" in error && error.code === \"EEXIST\") continue;\n throw error;\n }\n }\n\n throw new Error(`Unable to allocate unique shared-context output path for ${identity.agent}`);\n }\n\n async appendFeedback(entry: SharedFeedbackEntry): Promise<void> {\n const parsed = SharedFeedbackEntrySchema.parse(entry);\n await migrateLegacyFeedbackInbox(this.config);\n await appendFile(this.feedbackInboxPath, JSON.stringify(parsed) + \"\\n\", \"utf-8\");\n }\n\n async appendPrioritiesInbox(opts: { agentId: string; text: string }): Promise<void> {\n const stamp = new Date().toISOString();\n const lines = [\n \"\",\n `## ${stamp} (${opts.agentId})`,\n \"\",\n opts.text.trimEnd(),\n \"\",\n ].join(\"\\n\");\n await appendFile(this.prioritiesInboxPath, lines, \"utf-8\");\n }\n\n private async withDailySynthesisLock<T>(date: string, fn: () => Promise<T>): Promise<T> {\n const previous = this.dailySynthesisChains.get(date) ?? Promise.resolve();\n let releaseCurrent!: () => void;\n const current = new Promise<void>((resolve) => {\n releaseCurrent = resolve;\n });\n const queued = previous.catch(() => undefined).then(() => current);\n this.dailySynthesisChains.set(date, queued);\n await previous.catch(() => undefined);\n try {\n return await fn();\n } finally {\n releaseCurrent();\n if (this.dailySynthesisChains.get(date) === queued) {\n this.dailySynthesisChains.delete(date);\n }\n }\n }\n\n async synthesizeCrossSignals(opts: {\n date?: string;\n maxSummaryItems?: number;\n }): Promise<SharedCrossSignalSynthesisResult> {\n const date = safeDateSegment(opts.date ?? ymd(new Date()));\n return this.withDailySynthesisLock(date, () => this.synthesizeCrossSignalsUnlocked({\n date,\n maxSummaryItems: opts.maxSummaryItems,\n }));\n }\n\n private async synthesizeCrossSignalsUnlocked(opts: {\n date: string;\n maxSummaryItems?: number;\n }): Promise<SharedCrossSignalSynthesisResult> {\n const date = opts.date;\n const maxSummaryItems = Math.max(1, opts.maxSummaryItems ?? 8);\n\n // Collect outputs for the day (best-effort).\n const outputs: Array<{ agent: string; path: string; title: string; raw: string; envelope: SharedEnvelope }> = [];\n try {\n const agents = (await readdir(this.outputsDir, { withFileTypes: true }))\n .sort((a, b) => a.name.localeCompare(b.name));\n for (const a of agents) {\n if (!a.isDirectory()) continue;\n const dayDir = path.join(this.outputsDir, a.name, date);\n try {\n const files = (await readdir(dayDir)).filter((f) => f.endsWith(\".md\")).sort();\n for (const f of files) {\n const p = path.join(dayDir, f);\n const raw = await readFile(p, \"utf-8\");\n const title = readFrontmatterScalar(raw, \"title\") ?? f;\n const agent = readFrontmatterScalar(raw, \"agent\") ?? safeDecodePathSegment(a.name);\n const envelope = envelopeFromScalars({\n sharedBy: readFrontmatterScalar(raw, \"sharedBy\"),\n authority: readFrontmatterScalar(raw, \"authority\"),\n expiresAt: readFrontmatterScalar(raw, \"expiresAt\"),\n supersedes: readFrontmatterScalar(raw, \"supersedes\"),\n });\n outputs.push({ agent, path: p, title, raw, envelope });\n }\n } catch {\n // no outputs for this agent/date\n }\n }\n } catch {\n // ignore\n }\n outputs.sort(\n (a, b) =>\n a.agent.localeCompare(b.agent)\n || a.path.localeCompare(b.path)\n || a.title.localeCompare(b.title),\n );\n\n // Control 2 (issue #1957): expired items never enter the working set;\n // items another live item supersedes are marked while they circulate.\n const liveOutputs = filterLiveEnvelopes(\n outputs.map((output) => ({ output, expiresAt: output.envelope.expiresAt })),\n Date.now(),\n ).map((entry) => entry.output);\n const expiredDropped = outputs.length - liveOutputs.length;\n const supersededStillCirculating = markSupersededCirculation(\n liveOutputs.map((output) => ({ id: output.path, supersedes: output.envelope.supersedes })),\n )\n .filter((item) => item.circulating === true)\n .map((item) => item.id)\n .sort();\n\n // Collect feedback entries for the day.\n const feedback: SharedFeedbackEntry[] = [];\n try {\n await migrateLegacyFeedbackInbox(this.config);\n const raw = await readFile(this.feedbackInboxPath, \"utf-8\");\n for (const line of raw.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n const obj = JSON.parse(line);\n const parsed = SharedFeedbackEntrySchema.safeParse(obj);\n if (!parsed.success) continue;\n if (String(parsed.data.date).startsWith(date)) feedback.push(parsed.data);\n } catch {\n // ignore\n }\n }\n } catch {\n // ignore\n }\n\n const sources: SharedCrossSignalSource[] = liveOutputs.map((output) => {\n const body = stripYamlFrontmatter(output.raw);\n return {\n agent: output.agent,\n path: output.path,\n title: output.title,\n topics: extractTopicTokens(`${output.title}\\n${body}`),\n authority: resolveReadAuthority(output.envelope, this.allowBindingAuthority),\n sharedBy: output.envelope.sharedBy ?? output.agent,\n };\n });\n\n const overlapMap = new Map<string, { agents: Set<string>; sourcePaths: Set<string> }>();\n for (const source of sources) {\n for (const token of source.topics) {\n const existing = overlapMap.get(token);\n if (existing) {\n existing.agents.add(source.agent);\n existing.sourcePaths.add(source.path);\n } else {\n overlapMap.set(token, {\n agents: new Set([source.agent]),\n sourcePaths: new Set([source.path]),\n });\n }\n }\n }\n\n const overlaps: SharedCrossSignalOverlap[] = [...overlapMap.entries()]\n .map(([token, v]) => ({\n token,\n agents: [...v.agents].sort(),\n sourcePaths: [...v.sourcePaths].sort(),\n agentCount: v.agents.size,\n }))\n .filter((entry) => entry.agentCount >= 2)\n .sort((a, b) => b.agentCount - a.agentCount || a.token.localeCompare(b.token));\n\n const semanticEnabled =\n resolveConversationContextCapabilities(this.config).sharedCrossSignalSemantic === true\n || resolveConversationContextCapabilities(this.config).crossSignalsSemantic === true;\n const semanticTimeoutMs =\n this.config.sharedCrossSignalSemanticTimeoutMs\n ?? this.config.crossSignalsSemanticTimeoutMs\n ?? 4000;\n const semanticMaxCandidates = this.config.sharedCrossSignalSemanticMaxCandidates ?? 120;\n let semanticApplied = false;\n let semanticTimedOut = false;\n let semanticCandidateCount = 0;\n let semanticAddedOverlapCount = 0;\n let mergedOverlaps = overlaps;\n if (semanticEnabled) {\n try {\n const semanticResult = await computeSemanticOverlapsWithTimeout(\n sources,\n semanticTimeoutMs,\n semanticMaxCandidates,\n );\n semanticTimedOut = semanticResult.timedOut;\n semanticCandidateCount = semanticResult.candidateCount;\n if (!semanticResult.timedOut && semanticResult.overlaps.length > 0) {\n mergedOverlaps = mergeOverlaps(overlaps, semanticResult.overlaps);\n semanticAddedOverlapCount = Math.max(0, mergedOverlaps.length - overlaps.length);\n semanticApplied = semanticAddedOverlapCount > 0;\n }\n } catch (err) {\n log.warn(`shared-context semantic cross-signals failed; fail-open to deterministic output: ${err}`);\n }\n }\n\n const feedbackByDecision: SharedCrossSignalReport[\"feedbackByDecision\"] = {\n approved: 0,\n approved_with_feedback: 0,\n rejected: 0,\n };\n for (const entry of feedback) {\n feedbackByDecision[entry.decision] += 1;\n }\n\n // Control 3 (issue #1957): feedback refs are claim keys; two agents\n // ruling differently on the same ref surface as disputed, never silently\n // averaged. Pairwise scan is bounded by one day's feedback entries.\n const claimItems = feedback.map((entry, index) => ({\n id: `${entry.agent}#${index}`,\n claims: Object.fromEntries((entry.refs ?? []).map((ref) => [ref, entry.decision])),\n }));\n const disputedByRef = new Map<string, { agents: Set<string>; decisions: Set<string> }>();\n for (let i = 0; i < claimItems.length; i++) {\n for (let j = i + 1; j < claimItems.length; j++) {\n const pair = detectContradictionPair(claimItems[i]!, claimItems[j]!);\n if (pair.kind !== \"conflict\") continue;\n for (const ref of pair.keys) {\n const slot = disputedByRef.get(ref) ?? { agents: new Set<string>(), decisions: new Set<string>() };\n slot.agents.add(feedback[i]!.agent);\n slot.agents.add(feedback[j]!.agent);\n slot.decisions.add(feedback[i]!.decision);\n slot.decisions.add(feedback[j]!.decision);\n disputedByRef.set(ref, slot);\n }\n }\n }\n const disputed = [...disputedByRef.entries()]\n .map(([ref, slot]) => ({ ref, agents: [...slot.agents].sort(), decisions: [...slot.decisions].sort() }))\n .sort((a, b) => a.ref.localeCompare(b.ref));\n\n const generatedAt = new Date().toISOString();\n const baseReport = {\n date,\n generatedAt,\n sourceCount: sources.length,\n feedbackCount: feedback.length,\n feedbackByDecision,\n feedbackEntries: [...feedback].sort(compareFeedbackPriority),\n sources,\n overlaps: mergedOverlaps,\n staleness: { expiredDropped, supersededStillCirculating },\n disputed,\n semantic: {\n enabled: semanticEnabled,\n applied: semanticApplied,\n timedOut: semanticTimedOut,\n candidateCount: semanticCandidateCount,\n maxCandidates: Math.max(0, Math.floor(semanticMaxCandidates)),\n addedOverlapCount: semanticAddedOverlapCount,\n },\n };\n // Control 4 (issue #1957): stamp who synthesized the report and when.\n const report = stampProvenance(baseReport, { actor: \"shared-context:curation\", at: generatedAt });\n\n const crossSignalsPath = path.join(this.crossSignalsDir, `${date}.json`);\n await writeFileAtomic(crossSignalsPath, `${JSON.stringify(report, null, 2)}\\n`);\n\n const recurringThemeLines = mergedOverlaps.length === 0\n ? [\"- No multi-agent topic overlap detected.\"]\n : mergedOverlaps.slice(0, maxSummaryItems).map((entry) => formatOverlapLine(entry));\n const riskSignals = [...feedback]\n .filter((entry) => entry.decision !== \"approved\" || entry.severity === \"high\" || entry.severity === \"medium\")\n .sort(compareFeedbackPriority)\n .slice(0, maxSummaryItems);\n const riskLines = riskSignals.length === 0\n ? [\"- No explicit blockers or elevated review risks recorded.\"]\n : riskSignals.map((entry) => formatFeedbackLine(entry));\n const promotionCandidates = mergedOverlaps\n .filter((entry) => entry.agentCount >= 3)\n .slice(0, maxSummaryItems);\n const promotionLines = promotionCandidates.length === 0\n ? [\"- No promotion candidates yet.\"]\n : promotionCandidates.map((entry) =>\n `- Consider promoting \\`${entry.token}\\` into priorities or operating rules [sources: ${markdownLineList(entry.sourcePaths)}]`\n );\n\n const crossSignalsMarkdown = [\n `# Cross-Signals — ${date}`,\n \"\",\n \"## Overview\",\n `- Source outputs analyzed: ${sources.length}`,\n `- Feedback entries analyzed: ${feedback.length}`,\n `- Decision totals: approved=${feedbackByDecision.approved}, approved_with_feedback=${feedbackByDecision.approved_with_feedback}, rejected=${feedbackByDecision.rejected}`,\n `- Semantic enhancer: ${semanticEnabled ? (semanticTimedOut ? \"enabled (timed out, fail-open)\" : semanticApplied ? \"enabled (applied)\" : \"enabled (no additional overlaps)\") : \"disabled\"}`,\n `- JSON report: ${crossSignalsPath}`,\n \"\",\n \"## Staleness\",\n ...formatStalenessLines(report),\n \"\",\n \"## Disputed\",\n ...formatDisputedLines(report),\n \"\",\n \"## Recurring Themes\",\n ...recurringThemeLines,\n \"\",\n \"## Risks And Blockers\",\n ...riskLines,\n \"\",\n \"## Potential Promotions\",\n ...promotionLines,\n \"\",\n \"## Sources\",\n ...(sources.length === 0 ? [\"- (none)\"] : sources.map((source) =>\n `- [${markdownLineText(source.agent)}] ${markdownLineText(source.title)} (${markdownLineText(source.path)}) [authority: ${source.authority}; sharedBy: ${markdownLineText(source.sharedBy)}]`\n )),\n \"\",\n ].join(\"\\n\");\n\n const crossSignalsMarkdownPath = path.join(this.crossSignalsDir, `${date}.md`);\n await writeFileAtomic(crossSignalsMarkdownPath, crossSignalsMarkdown);\n\n return {\n date,\n crossSignalsPath,\n crossSignalsMarkdownPath,\n overlapCount: mergedOverlaps.length,\n report,\n };\n }\n\n async curateDaily(opts: { date?: string; maxChars?: number }): Promise<SharedDailyCurationResult> {\n const date = safeDateSegment(opts.date ?? ymd(new Date()));\n return this.withDailySynthesisLock(date, () => this.curateDailyUnlocked({ ...opts, date }));\n }\n\n private async curateDailyUnlocked(opts: { date: string; maxChars?: number }): Promise<SharedDailyCurationResult> {\n const date = opts.date;\n const maxChars = Math.max(2_000, opts.maxChars ?? 20_000);\n const crossSignals = await this.synthesizeCrossSignalsUnlocked({ date });\n // Control 4 (issue #1957): every synthesized claim must cite at least one\n // item this run actually had. Overlaps are built from sources, so this is\n // a tripwire — it fires only if a synthesized section stops citing.\n const lintFindings = lintCuratedClaims({\n claims: crossSignals.report.overlaps.map((overlap) => ({\n claimId: `overlap:${overlap.token}`,\n citedItemIds: overlap.sourcePaths,\n })),\n availableItemIds: crossSignals.report.sources.map((source) => source.path),\n });\n if (lintFindings.length > 0) {\n throw new Error(`shared-context curation self-check failed: ${JSON.stringify(lintFindings)}`);\n }\n const feedbackLines = crossSignals.report.feedbackEntries.length === 0\n ? [\"- (none)\"]\n : crossSignals.report.feedbackEntries.map((entry) => formatFeedbackLine(entry));\n const overlapBullets = crossSignals.report.overlaps.length === 0\n ? [\"- No multi-agent topic overlap detected.\"]\n : crossSignals.report.overlaps.slice(0, 8).map((entry) => formatOverlapLine(entry));\n\n const md: string[] = [\n `# Roundtable — ${date}`,\n \"\",\n \"## Notable Agent Outputs\",\n ...(crossSignals.report.sources.length === 0\n ? [\"- (none)\"]\n : crossSignals.report.sources.map((source) =>\n `- ${markdownLineText(source.title)} (${markdownLineText(source.path)}) [authority: ${source.authority}; sharedBy: ${markdownLineText(source.sharedBy)}]`)),\n \"\",\n \"## Feedback (Approve/Reject)\",\n ...feedbackLines,\n \"\",\n \"## Cross-Signals\",\n `- Source outputs analyzed: ${crossSignals.report.sourceCount}`,\n `- Feedback entries analyzed: ${crossSignals.report.feedbackCount}`,\n `- Decision totals: approved=${crossSignals.report.feedbackByDecision.approved}, approved_with_feedback=${crossSignals.report.feedbackByDecision.approved_with_feedback}, rejected=${crossSignals.report.feedbackByDecision.rejected}`,\n `- Semantic enhancer: ${crossSignals.report.semantic.enabled ? (crossSignals.report.semantic.timedOut ? \"enabled (timed out, fail-open)\" : crossSignals.report.semantic.applied ? \"enabled (applied)\" : \"enabled (no additional overlaps)\") : \"disabled\"}`,\n `- Cross-signals JSON: ${crossSignals.crossSignalsPath}`,\n `- Cross-signals markdown: ${crossSignals.crossSignalsMarkdownPath}`,\n ...overlapBullets,\n \"\",\n \"## Staleness\",\n ...formatStalenessLines(crossSignals.report),\n \"\",\n \"## Disputed\",\n ...formatDisputedLines(crossSignals.report),\n \"\",\n ];\n\n\n const out = md.join(\"\\n\");\n const trimmed = out.length > maxChars ? out.slice(0, maxChars) + \"\\n\\n...(trimmed)\\n\" : out;\n\n const roundtablePath = path.join(this.roundtableDir, `${date}.md`);\n await writeFileAtomic(roundtablePath, trimmed);\n\n log.info(`shared-context curated daily roundtable: ${roundtablePath}`);\n return {\n date,\n roundtablePath,\n crossSignalsPath: crossSignals.crossSignalsPath,\n crossSignalsMarkdownPath: crossSignals.crossSignalsMarkdownPath,\n overlapCount: crossSignals.overlapCount,\n };\n }\n}\n","/**\n * Shared-item contradiction detection (issue #1957).\n *\n * Pure helper. Same-id items are one item; overlapping claim keys with\n * unequal values are a conflict. No deletes, no persistence.\n */\n\nexport interface SharedClaimItem {\n id: string;\n claims: Record<string, string>;\n}\n\nexport type ContradictionPairResult =\n | { kind: \"same\" }\n | { kind: \"conflict\"; keys: string[] }\n | { kind: \"none\" };\n\nexport function detectContradictionPair(\n a: SharedClaimItem,\n b: SharedClaimItem,\n): ContradictionPairResult {\n if (a.id === b.id) {\n return { kind: \"same\" };\n }\n const keys: string[] = [];\n for (const key of Object.keys(a.claims)) {\n if (key in b.claims && a.claims[key] !== b.claims[key]) {\n keys.push(key);\n }\n }\n return keys.length > 0 ? { kind: \"conflict\", keys: keys.sort() } : { kind: \"none\" };\n}\n","/**\n * Shared-context curation self-check (issue #1957 requirement 4).\n *\n * Pure. A synthesized claim with no traceable source is a lint error:\n * report claims whose citations are missing, blank, or absent from the\n * item ids the curation run actually had available.\n */\n\nexport interface CuratedClaim {\n claimId: string;\n /** Shared-context item ids this claim was synthesized from. */\n citedItemIds?: readonly string[];\n}\n\nexport interface CurationLintFinding {\n claimId: string;\n reason: \"no_citations\" | \"unknown_citation\";\n /** Cited ids that are not in the available set. Only for unknown_citation. */\n unknownIds?: string[];\n}\n\nexport function lintCuratedClaims(input: {\n claims: readonly CuratedClaim[];\n availableItemIds: readonly string[];\n}): CurationLintFinding[] {\n const available = new Set(input.availableItemIds);\n const findings: CurationLintFinding[] = [];\n\n for (const claim of input.claims) {\n const claimId = claim.claimId;\n if (typeof claimId !== \"string\" || claimId.trim().length === 0) {\n throw new RangeError(\"claimId must be a non-blank string\");\n }\n\n const unknown = new Set<string>();\n let validCount = 0;\n for (const id of claim.citedItemIds ?? []) {\n if (id.trim().length === 0) continue;\n if (available.has(id)) {\n validCount += 1;\n } else {\n unknown.add(id);\n }\n }\n\n if (validCount === 0) {\n findings.push({ claimId, reason: \"no_citations\" });\n continue;\n }\n if (unknown.size > 0) {\n findings.push({ claimId, reason: \"unknown_citation\", unknownIds: [...unknown].sort() });\n }\n }\n\n findings.sort((a, b) => {\n if (a.claimId !== b.claimId) return a.claimId < b.claimId ? -1 : 1;\n if (a.reason !== b.reason) return a.reason < b.reason ? -1 : 1;\n // Duplicate claim ids are linted independently, so two findings can share\n // both keys above and still differ. Without this tertiary key the result\n // would depend on upstream iteration order, which the deterministic-output\n // contract forbids.\n const left = (a.unknownIds ?? []).join(\",\");\n const right = (b.unknownIds ?? []).join(\",\");\n if (left !== right) return left < right ? -1 : 1;\n return 0;\n });\n return findings;\n}\n","/**\n * Shared-item provenance stamp (issue #1957).\n *\n * First slice: stamp actor + at onto a new object. Curation wiring\n * comes later. Does not mutate the input.\n */\n\nimport { isStrictIsoInstant } from \"./iso-instant.js\";\n\nexport interface ProvenanceStamp {\n actor: string;\n at: string;\n}\n\nexport interface StampProvenanceOptions {\n actor: string;\n at: string;\n}\n\nfunction requireActor(actor: string): string {\n if (typeof actor !== \"string\" || actor.trim().length === 0) {\n throw new Error(\"stampProvenance: actor must be a non-empty string\");\n }\n return actor;\n}\n\nfunction requireAt(at: unknown): string {\n if (typeof at !== \"string\" || !isStrictIsoInstant(at)) {\n throw new Error(\"stampProvenance: at must be a valid ISO-8601 timestamp\");\n }\n return at;\n}\n\nexport function stampProvenance<T extends object>(\n item: T,\n stamp: StampProvenanceOptions,\n): T & { provenance: ProvenanceStamp } {\n return {\n ...item,\n provenance: {\n actor: requireActor(stamp.actor),\n at: requireAt(stamp.at),\n },\n };\n}\n","/**\n * Shared-item staleness (issue #1957).\n *\n * Pure helpers. Expired items drop; superseded items that still circulate\n * get a marker. Callers never `rm`.\n */\nimport { isExpired } from \"./governance.js\";\n\nexport interface SharedStalenessItem {\n id: string;\n expiresAt?: string;\n supersedes?: string;\n circulating?: boolean;\n}\n\n/** Drop expired items. Half-open: `nowMs >= expiresAt` is expired. */\nexport function filterLiveEnvelopes<T extends { expiresAt?: string }>(\n items: readonly T[],\n nowMs: number,\n): T[] {\n return items.filter((item) => !isExpired(item, nowMs));\n}\n\n/**\n * Mark items whose id appears in another item's `supersedes`.\n * Returns a new array. Does not mutate input and does not delete files.\n */\nexport function markSupersededCirculation<T extends SharedStalenessItem>(\n items: readonly T[],\n): (T & { circulating?: boolean })[] {\n const supersededIds = new Set<string>();\n for (const item of items) {\n if (item.supersedes) supersededIds.add(item.supersedes);\n }\n return items.map((item) =>\n supersededIds.has(item.id) ? { ...item, circulating: true } : item,\n );\n}\n"],"mappings":"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","names":[]}