@remnic/core 9.69.39 → 9.69.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (774) hide show
  1. package/dist/access-admin-ops-surface.d.ts +16 -14
  2. package/dist/access-admin-ops-surface.js +75 -74
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +16 -14
  5. package/dist/access-authorization-probe.js +76 -75
  6. package/dist/access-boundary.d.ts +16 -14
  7. package/dist/access-boundary.js +75 -74
  8. package/dist/access-cli.js +173 -170
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +1 -1
  11. package/dist/access-extraction-force-flush.d.ts +16 -14
  12. package/dist/access-extraction-force-flush.js +75 -74
  13. package/dist/access-health-types.d.ts +1 -1
  14. package/dist/access-http-briefing.d.ts +16 -14
  15. package/dist/access-http-briefing.js +76 -75
  16. package/dist/access-http-lcm-compaction.d.ts +16 -14
  17. package/dist/access-http-lifecycle-flush.d.ts +16 -14
  18. package/dist/access-http-offline-stream.d.ts +16 -14
  19. package/dist/access-http-query.d.ts +2 -2
  20. package/dist/access-http-query.js +77 -76
  21. package/dist/access-http.d.ts +17 -15
  22. package/dist/access-http.js +95 -92
  23. package/dist/access-identity-continuity-surface.d.ts +13 -12
  24. package/dist/access-identity-continuity-surface.js +75 -74
  25. package/dist/access-lcm-surface.d.ts +16 -14
  26. package/dist/access-lcm-surface.js +75 -74
  27. package/dist/access-mcp-shared-context-tools.d.ts +156 -0
  28. package/dist/access-mcp-shared-context-tools.js +8 -0
  29. package/dist/access-mcp.d.ts +16 -14
  30. package/dist/access-mcp.js +86 -83
  31. package/dist/access-memory-search-fanout.d.ts +2 -2
  32. package/dist/{access-namespace-preflight-DY4z6L5X.d.ts → access-namespace-preflight-DWsMc9Dh.d.ts} +1 -1
  33. package/dist/access-namespace-preflight.d.ts +3 -3
  34. package/dist/access-namespace-preflight.js +75 -74
  35. package/dist/access-observe-transcript.d.ts +13 -12
  36. package/dist/access-observe-write-category.d.ts +1 -1
  37. package/dist/access-observe-write-category.js +4 -4
  38. package/dist/access-observe-write-surface.d.ts +16 -14
  39. package/dist/access-observe-write-surface.js +75 -74
  40. package/dist/access-offline-manifest.d.ts +37 -13
  41. package/dist/access-offline-manifest.js +15 -11
  42. package/dist/access-operations-batch.js +79 -77
  43. package/dist/access-operations.d.ts +16 -14
  44. package/dist/access-operations.js +84 -82
  45. package/dist/access-recall-concurrency.d.ts +16 -14
  46. package/dist/access-recall-concurrency.js +75 -74
  47. package/dist/access-recall-response.d.ts +16 -14
  48. package/dist/access-recall-response.js +75 -74
  49. package/dist/access-recall-surface.d.ts +16 -14
  50. package/dist/access-recall-surface.js +75 -74
  51. package/dist/access-schema.d.ts +5 -3
  52. package/dist/access-schema.js +3 -3
  53. package/dist/{access-service-MY4bsr_Q.d.ts → access-service-Cisy5YDq.d.ts} +14 -9
  54. package/dist/access-service-helpers.d.ts +16 -14
  55. package/dist/access-service.d.ts +16 -14
  56. package/dist/access-service.js +75 -74
  57. package/dist/access-surface-catalog.d.ts +16 -14
  58. package/dist/access-surface-catalog.js +77 -76
  59. package/dist/access-surface-catalog.js.map +1 -1
  60. package/dist/access-wearables-meetings-surface.d.ts +6 -5
  61. package/dist/action-confidence.d.ts +1 -1
  62. package/dist/active-memory-bridge.d.ts +1 -1
  63. package/dist/active-memory-bridge.js +3 -3
  64. package/dist/active-recall.d.ts +1 -1
  65. package/dist/active-recall.js +10 -9
  66. package/dist/active-recall.js.map +1 -1
  67. package/dist/activity/digest.d.ts +1 -1
  68. package/dist/ambient-provenance.d.ts +1 -1
  69. package/dist/artifact-search.d.ts +1 -1
  70. package/dist/{auto-sync-RP4C6ZPF.js → auto-sync-7PGUFY7U.js} +7 -7
  71. package/dist/background-generation-config.d.ts +1 -1
  72. package/dist/background-generation-config.js +3 -1
  73. package/dist/background-generation.d.ts +1 -1
  74. package/dist/behavior-learner.d.ts +1 -1
  75. package/dist/behavior-signals.d.ts +1 -1
  76. package/dist/bootstrap.d.ts +13 -12
  77. package/dist/briefing-window.d.ts +2 -2
  78. package/dist/briefing.d.ts +2 -2
  79. package/dist/briefing.js +23 -23
  80. package/dist/buffer-surprise-report.d.ts +1 -1
  81. package/dist/buffer-turn-helpers.d.ts +1 -1
  82. package/dist/buffer.d.ts +2 -2
  83. package/dist/buffer.js +7 -7
  84. package/dist/bulk-import/index.d.ts +3 -3
  85. package/dist/calibration.d.ts +3 -2
  86. package/dist/calibration.js +2 -2
  87. package/dist/capabilities.d.ts +1 -1
  88. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  89. package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-3MNURAQ3.js} +2 -2
  90. package/dist/{catalog-CW87xGx8.d.ts → catalog-wcX1QhtQ.d.ts} +1 -1
  91. package/dist/causal-behavior.d.ts +1 -1
  92. package/dist/causal-consolidation.d.ts +1 -1
  93. package/dist/causal-consolidation.js +29 -28
  94. package/dist/causal-consolidation.js.map +1 -1
  95. package/dist/causal-trajectory-graph.d.ts +1 -1
  96. package/dist/{chunk-YFTNZMGR.js → chunk-27NO2KVB.js} +31 -8
  97. package/dist/chunk-27NO2KVB.js.map +1 -0
  98. package/dist/{chunk-M6RORUO5.js → chunk-2EYZ32LH.js} +24 -2
  99. package/dist/{chunk-M6RORUO5.js.map → chunk-2EYZ32LH.js.map} +1 -1
  100. package/dist/{chunk-XH3HGI2N.js → chunk-2HQPE2NM.js} +2 -2
  101. package/dist/{chunk-3EKVN2OP.js → chunk-2ZG2LLZT.js} +2 -2
  102. package/dist/{chunk-6EHM2AV7.js → chunk-3BLHPQHT.js} +5 -5
  103. package/dist/{chunk-YKREX63Z.js → chunk-3D75XIYO.js} +5 -3
  104. package/dist/chunk-3D75XIYO.js.map +1 -0
  105. package/dist/{chunk-J272ODKJ.js → chunk-42DJ235G.js} +2 -2
  106. package/dist/{chunk-F4EHXVP7.js → chunk-46RII65S.js} +2 -2
  107. package/dist/{chunk-YUW66UAH.js → chunk-4AX5OYKC.js} +2 -2
  108. package/dist/{chunk-AECJY3GJ.js → chunk-4IGOLIWM.js} +2 -2
  109. package/dist/{chunk-2ZTDRNCS.js → chunk-54QPOE45.js} +2 -2
  110. package/dist/{chunk-O4M4BDIJ.js → chunk-563X6JJX.js} +2 -2
  111. package/dist/{chunk-IL6ODG6M.js → chunk-5EQT62HH.js} +2 -2
  112. package/dist/{chunk-JKKII6GX.js → chunk-6MQMYXSQ.js} +2 -2
  113. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  114. package/dist/{chunk-BV4ZKIZH.js → chunk-7ZLC4DTZ.js} +5 -4
  115. package/dist/{chunk-WBM2MVBK.js → chunk-A4OIJYCV.js} +2 -2
  116. package/dist/{chunk-RLJHJQUY.js → chunk-AFJHNHAM.js} +8 -8
  117. package/dist/{chunk-6YAIN5XJ.js → chunk-AIVRD66I.js} +44 -6
  118. package/dist/chunk-AIVRD66I.js.map +1 -0
  119. package/dist/{chunk-OEDW4ER7.js → chunk-AJBWVDRV.js} +2 -1
  120. package/dist/chunk-AJBWVDRV.js.map +1 -0
  121. package/dist/{chunk-4RZLTZVM.js → chunk-AKABVXFS.js} +2 -2
  122. package/dist/{chunk-M6HBPLBA.js → chunk-AUSRUOMQ.js} +2 -2
  123. package/dist/{chunk-QHT7MOUF.js → chunk-BTPCP535.js} +25 -14
  124. package/dist/chunk-BTPCP535.js.map +1 -0
  125. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  126. package/dist/{chunk-Q7CLGFA7.js → chunk-C3G6MW4W.js} +3 -3
  127. package/dist/{chunk-O76F5QPP.js → chunk-D6PY63OM.js} +2 -2
  128. package/dist/{chunk-BD7JTBYP.js → chunk-D7MAYFQP.js} +2 -2
  129. package/dist/{chunk-LMLGBG6H.js → chunk-DBB5JPSL.js} +2 -2
  130. package/dist/{chunk-TSP5WH72.js → chunk-DIXZQTGY.js} +2 -2
  131. package/dist/{chunk-P4ZAEYKG.js → chunk-DM5CU5J7.js} +7 -4
  132. package/dist/chunk-DM5CU5J7.js.map +1 -0
  133. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  134. package/dist/{chunk-UHRZ324M.js → chunk-E3I3NDUP.js} +4 -4
  135. package/dist/{chunk-AENM6GKU.js → chunk-E4LMQTST.js} +2 -2
  136. package/dist/{chunk-YDVAM7S4.js → chunk-EH3HNCAM.js} +13 -8
  137. package/dist/chunk-EH3HNCAM.js.map +1 -0
  138. package/dist/{chunk-MUTVRKKY.js → chunk-EMSYMYXO.js} +14 -14
  139. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  140. package/dist/{chunk-FXHOZGSE.js → chunk-F5H6YG5P.js} +2 -2
  141. package/dist/{chunk-TRLOFIQC.js → chunk-FGFC2EFR.js} +14 -13
  142. package/dist/chunk-FGFC2EFR.js.map +1 -0
  143. package/dist/{chunk-TNSCIPBQ.js → chunk-G6NQ3L4T.js} +2 -2
  144. package/dist/{chunk-ZMWSYUUL.js → chunk-GCBIXUPT.js} +2 -2
  145. package/dist/{chunk-EYKIDK33.js → chunk-GMH5QPUU.js} +22 -22
  146. package/dist/chunk-GMH5QPUU.js.map +1 -0
  147. package/dist/{chunk-4BCHFSC7.js → chunk-GWNSKQDA.js} +3 -3
  148. package/dist/{chunk-JDX2OA4R.js → chunk-HNHIHXSD.js} +2 -2
  149. package/dist/{chunk-GG5FHZJJ.js → chunk-I33QYUAF.js} +6 -6
  150. package/dist/{chunk-LPYYY4AP.js → chunk-I46BYY7U.js} +653 -328
  151. package/dist/chunk-I46BYY7U.js.map +1 -0
  152. package/dist/{chunk-CZTPU65V.js → chunk-ICN37XHG.js} +74 -27
  153. package/dist/chunk-ICN37XHG.js.map +1 -0
  154. package/dist/chunk-IFBSZGW3.js +42 -0
  155. package/dist/chunk-IFBSZGW3.js.map +1 -0
  156. package/dist/{chunk-AAZEKXUP.js → chunk-IYIPXAIJ.js} +2 -2
  157. package/dist/{chunk-ACY4ZPF7.js → chunk-J2MGTGKC.js} +10 -5
  158. package/dist/chunk-J2MGTGKC.js.map +1 -0
  159. package/dist/chunk-JATHBCAV.js +94 -0
  160. package/dist/chunk-JATHBCAV.js.map +1 -0
  161. package/dist/{chunk-5U7K4W6K.js → chunk-JDOBQPJY.js} +3 -3
  162. package/dist/{chunk-TG3FAM2S.js → chunk-JL4TQYM5.js} +48 -1
  163. package/dist/{chunk-TG3FAM2S.js.map → chunk-JL4TQYM5.js.map} +1 -1
  164. package/dist/{chunk-UZZ7SQT3.js → chunk-JMWUPUE6.js} +2 -2
  165. package/dist/{chunk-ENBPQEVU.js → chunk-JSD7Q7LD.js} +2 -2
  166. package/dist/{chunk-QTQ6XKGT.js → chunk-K5D2XVNN.js} +4 -4
  167. package/dist/chunk-K5D2XVNN.js.map +1 -0
  168. package/dist/{chunk-3CBI2ZSA.js → chunk-KG2OOAFF.js} +20 -12
  169. package/dist/chunk-KG2OOAFF.js.map +1 -0
  170. package/dist/{chunk-Q432REND.js → chunk-KJLLPG26.js} +2 -2
  171. package/dist/{chunk-JTQR6L2N.js → chunk-KLUC2GSG.js} +6 -6
  172. package/dist/{chunk-OB3XMWX5.js → chunk-KVO2BTA4.js} +2 -2
  173. package/dist/{chunk-PCOVEDPK.js → chunk-KZJM7R4F.js} +3 -3
  174. package/dist/{chunk-X4TD4O2F.js → chunk-LE2KZ72G.js} +3 -3
  175. package/dist/{chunk-HIP6DKJJ.js → chunk-LQVXSRAJ.js} +2 -2
  176. package/dist/{chunk-A7GQBJP5.js → chunk-LVFI5LG7.js} +7 -7
  177. package/dist/{chunk-FWWWUPOE.js → chunk-MCMS4VUK.js} +25 -15
  178. package/dist/chunk-MCMS4VUK.js.map +1 -0
  179. package/dist/{chunk-5SPCMAUC.js → chunk-N6XTC56E.js} +13 -81
  180. package/dist/chunk-N6XTC56E.js.map +1 -0
  181. package/dist/{chunk-VBSNUH4J.js → chunk-ND7MAIJC.js} +2 -2
  182. package/dist/{chunk-TNZNSMVJ.js → chunk-NYWCFC3K.js} +301 -348
  183. package/dist/chunk-NYWCFC3K.js.map +1 -0
  184. package/dist/{chunk-54NX5EG4.js → chunk-P66QH6R6.js} +2 -2
  185. package/dist/{chunk-62D2PAAM.js → chunk-PAAJWQH5.js} +4 -4
  186. package/dist/{chunk-TA4C3XB7.js → chunk-PFKIOYJH.js} +2 -2
  187. package/dist/{chunk-WIWLX65T.js → chunk-PGGPRF6J.js} +2 -2
  188. package/dist/{chunk-V6EGNVUT.js → chunk-PIWFNPQT.js} +4 -4
  189. package/dist/{chunk-BLDBT6HZ.js → chunk-PJRKLB4Z.js} +18 -2
  190. package/dist/chunk-PJRKLB4Z.js.map +1 -0
  191. package/dist/{chunk-4JVQRFZD.js → chunk-PLJ2MQFT.js} +11 -11
  192. package/dist/{chunk-4RX5O34R.js → chunk-PQ42DJNG.js} +2 -2
  193. package/dist/{chunk-37CAEC7E.js → chunk-PWPIERBM.js} +4 -4
  194. package/dist/{chunk-ZEGL7YCC.js → chunk-Q62GA5U2.js} +2 -2
  195. package/dist/{chunk-CC37E3QM.js → chunk-QKCXRS5A.js} +16 -1
  196. package/dist/chunk-QKCXRS5A.js.map +1 -0
  197. package/dist/{chunk-WKDFJXW5.js → chunk-QM2SPLKQ.js} +1 -1
  198. package/dist/chunk-QM2SPLKQ.js.map +1 -0
  199. package/dist/{chunk-GAS7KYC7.js → chunk-RQQO3ORQ.js} +2 -2
  200. package/dist/{chunk-UZEHHXYC.js → chunk-S4MJTIPG.js} +85 -81
  201. package/dist/chunk-S4MJTIPG.js.map +1 -0
  202. package/dist/chunk-SK7D34OL.js +68 -0
  203. package/dist/chunk-SK7D34OL.js.map +1 -0
  204. package/dist/{chunk-LQNRVPTV.js → chunk-TRTLWUDD.js} +164 -130
  205. package/dist/chunk-TRTLWUDD.js.map +1 -0
  206. package/dist/{chunk-JXN77SGO.js → chunk-U2VDCFXW.js} +1 -1
  207. package/dist/chunk-U2VDCFXW.js.map +1 -0
  208. package/dist/{chunk-CWTCMZGE.js → chunk-UHSOPTNB.js} +132 -6
  209. package/dist/chunk-UHSOPTNB.js.map +1 -0
  210. package/dist/{chunk-3NPNBVFR.js → chunk-UZGHKD3T.js} +2 -2
  211. package/dist/{chunk-IQEJIOEU.js → chunk-V2EXYQEQ.js} +20 -12
  212. package/dist/chunk-V2EXYQEQ.js.map +1 -0
  213. package/dist/{chunk-OPBFP4TF.js → chunk-V2TOGJPM.js} +46 -13
  214. package/dist/chunk-V2TOGJPM.js.map +1 -0
  215. package/dist/{chunk-VJIE4D2I.js → chunk-V62YYBBY.js} +4 -4
  216. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  217. package/dist/{chunk-6H2G7RFT.js → chunk-VNQRRUNS.js} +11 -10
  218. package/dist/chunk-VNQRRUNS.js.map +1 -0
  219. package/dist/{chunk-6AGWBKQU.js → chunk-VSN2DMQK.js} +2 -2
  220. package/dist/{chunk-ZHXSOMYH.js → chunk-VVX5PZFS.js} +2 -2
  221. package/dist/{chunk-GI4ZBWPQ.js → chunk-W7UV2ZCA.js} +3 -3
  222. package/dist/{chunk-GMIQV6DD.js → chunk-WBQ4ONQJ.js} +2 -2
  223. package/dist/{chunk-FNHLI2RE.js → chunk-WFMQN7JE.js} +3 -3
  224. package/dist/{chunk-MVAQ2WM3.js → chunk-WGZHSQDV.js} +9 -5
  225. package/dist/chunk-WGZHSQDV.js.map +1 -0
  226. package/dist/{chunk-IYKZJVL5.js → chunk-WN2OXGGH.js} +1 -1
  227. package/dist/chunk-WN2OXGGH.js.map +1 -0
  228. package/dist/{chunk-ZBW7A667.js → chunk-WPGA4RYI.js} +2 -2
  229. package/dist/{chunk-YQNNHLCG.js → chunk-WPGR3RW4.js} +2 -2
  230. package/dist/{chunk-SV4Z2S67.js → chunk-WUUGE7QC.js} +54 -21
  231. package/dist/chunk-WUUGE7QC.js.map +1 -0
  232. package/dist/{chunk-NXGSONWM.js → chunk-WZIO3TW6.js} +2 -2
  233. package/dist/{chunk-ZZUVBZL2.js → chunk-X2QPKLPL.js} +2 -2
  234. package/dist/{chunk-5HYUUFMQ.js → chunk-XCPNH2MG.js} +259 -10
  235. package/dist/chunk-XCPNH2MG.js.map +1 -0
  236. package/dist/{chunk-VSL63CFJ.js → chunk-XRS65T4O.js} +9 -9
  237. package/dist/{chunk-5N4MZLEH.js → chunk-YFXAWGMR.js} +2 -2
  238. package/dist/{chunk-KQW3YGEN.js → chunk-YR5QT4SR.js} +32 -9
  239. package/dist/chunk-YR5QT4SR.js.map +1 -0
  240. package/dist/{chunk-CARRTDKC.js → chunk-Z22M4JCY.js} +4 -3
  241. package/dist/chunk-Z22M4JCY.js.map +1 -0
  242. package/dist/{chunk-D545Z7UH.js → chunk-Z535ADTC.js} +3 -3
  243. package/dist/{chunk-B36GUU6T.js → chunk-Z7NBT6AK.js} +38 -5
  244. package/dist/chunk-Z7NBT6AK.js.map +1 -0
  245. package/dist/{chunk-5YCNDC3C.js → chunk-ZX6NNFSY.js} +3 -3
  246. package/dist/{chunk-3N3PBBEH.js → chunk-ZYSOT6HD.js} +2 -2
  247. package/dist/{chunk-MCRVQ5YQ.js → chunk-ZZEIL3MI.js} +2 -2
  248. package/dist/{cli-DGq0MNpO.d.ts → cli-CUlMlS2N.d.ts} +5 -5
  249. package/dist/cli.d.ts +18 -16
  250. package/dist/cli.js +129 -126
  251. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  252. package/dist/coding/export-okf-codegraph.js +22 -22
  253. package/dist/coding/pre-action-gate.d.ts +1 -1
  254. package/dist/compounding/engine.d.ts +2 -2
  255. package/dist/compounding/engine.js +25 -25
  256. package/dist/compounding/preference-consolidator.d.ts +1 -1
  257. package/dist/compression-optimizer.d.ts +1 -1
  258. package/dist/config.d.ts +1 -1
  259. package/dist/config.js +10 -9
  260. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  261. package/dist/connectors/codex-materialize-runner.js +25 -25
  262. package/dist/connectors/codex-materialize.d.ts +1 -1
  263. package/dist/connectors/codex-materialize.js +2 -2
  264. package/dist/connectors/index.d.ts +1 -1
  265. package/dist/connectors/index.js +25 -25
  266. package/dist/consolidation-provenance-check.d.ts +2 -2
  267. package/dist/consolidation-undo.d.ts +2 -2
  268. package/dist/contradiction/index.d.ts +6 -5
  269. package/dist/contradiction/index.js +4 -4
  270. package/dist/{contradiction-scan-BSGKZHYJ.js → contradiction-scan-GVD4JJ7B.js} +4 -4
  271. package/dist/converge-config.d.ts +1 -1
  272. package/dist/convergence-refresh.d.ts +2 -2
  273. package/dist/convergence-refresh.js +26 -26
  274. package/dist/conversation-index/backend.d.ts +1 -1
  275. package/dist/conversation-index/chunker.d.ts +1 -1
  276. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  277. package/dist/conversation-index/indexer.d.ts +1 -1
  278. package/dist/conversation-index/search.d.ts +1 -1
  279. package/dist/corpus-watermark.d.ts +1 -1
  280. package/dist/corpus-watermark.js +25 -25
  281. package/dist/cross-lingual-recall.d.ts +1 -1
  282. package/dist/dashboard-runtime.js +2 -2
  283. package/dist/day-summary.d.ts +1 -1
  284. package/dist/deep-recall-config.d.ts +12 -1
  285. package/dist/deep-recall-config.js +5 -3
  286. package/dist/deep-recall-http-glue.d.ts +19 -15
  287. package/dist/deep-recall-http-glue.js +7 -4
  288. package/dist/deep-recall-mcp-tools.d.ts +16 -14
  289. package/dist/deep-recall-policy-llm.d.ts +14 -3
  290. package/dist/deep-recall-policy-llm.js +3 -3
  291. package/dist/deep-recall-seeds.d.ts +4 -1
  292. package/dist/deep-recall-seeds.js +1 -1
  293. package/dist/deep-recall.d.ts +12 -1
  294. package/dist/deep-recall.js +3 -2
  295. package/dist/delinearize.d.ts +1 -1
  296. package/dist/dependency-propagation-config.d.ts +1 -1
  297. package/dist/{dependency-propagation-delivery-Cq1ekOwV.d.ts → dependency-propagation-delivery-BDDjImQn.d.ts} +1 -1
  298. package/dist/direct-answer-wiring.d.ts +1 -1
  299. package/dist/direct-answer.d.ts +1 -1
  300. package/dist/embedding-fallback.d.ts +1 -1
  301. package/dist/enrichment/index.d.ts +1 -1
  302. package/dist/entity-origin-fields.d.ts +1 -1
  303. package/dist/entity-retrieval.d.ts +2 -2
  304. package/dist/entity-retrieval.js +24 -24
  305. package/dist/entity-schema.d.ts +1 -1
  306. package/dist/episodic-context.d.ts +1 -1
  307. package/dist/eval-trajectory-contracts.d.ts +1 -1
  308. package/dist/eval-trajectory-store.d.ts +1 -1
  309. package/dist/eval-trajectory.d.ts +1 -1
  310. package/dist/explicit-capture.d.ts +13 -12
  311. package/dist/explicit-capture.js +3 -3
  312. package/dist/external-wiki-access.d.ts +16 -14
  313. package/dist/external-wiki-access.js +76 -75
  314. package/dist/external-wiki-collection-registration.d.ts +1 -1
  315. package/dist/external-wiki-collection.d.ts +1 -1
  316. package/dist/external-wiki-mcp-tools.d.ts +16 -14
  317. package/dist/extraction-error-classification.d.ts +14 -3
  318. package/dist/extraction-error-classification.js +5 -3
  319. package/dist/extraction-faithfulness.d.ts +4 -3
  320. package/dist/extraction-faithfulness.js +3 -3
  321. package/dist/extraction-judge-telemetry.d.ts +4 -3
  322. package/dist/extraction-judge-training.d.ts +4 -3
  323. package/dist/extraction-judge.d.ts +4 -3
  324. package/dist/extraction-judge.js +3 -3
  325. package/dist/extraction-liveness.d.ts +1 -1
  326. package/dist/extraction-normalization.d.ts +1 -1
  327. package/dist/extraction-prompt.d.ts +1 -1
  328. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  329. package/dist/extraction-source-grounding.d.ts +1 -1
  330. package/dist/extraction-span-config.d.ts +1 -1
  331. package/dist/extraction-span-materialize.d.ts +1 -1
  332. package/dist/extraction.d.ts +4 -4
  333. package/dist/extraction.js +40 -38
  334. package/dist/fallback-llm-codex-subscription.d.ts +65 -10
  335. package/dist/fallback-llm-codex-subscription.js +19 -1
  336. package/dist/fallback-llm.d.ts +25 -28
  337. package/dist/fallback-llm.js +4 -3
  338. package/dist/{first-start-migration-ZWMV5CX4.js → first-start-migration-L3UFX5CU.js} +4 -4
  339. package/dist/{generic-recall-paths-BcySh_f9.d.ts → generic-recall-paths-CpDzNO_I.d.ts} +1 -1
  340. package/dist/graph-append-error.d.ts +1 -1
  341. package/dist/graph-dashboard-diff.d.ts +1 -1
  342. package/dist/graph-dashboard-key.d.ts +1 -1
  343. package/dist/graph-dashboard-parser.d.ts +1 -1
  344. package/dist/graph-edge-reinforcement.d.ts +1 -1
  345. package/dist/graph-jsonl.d.ts +1 -1
  346. package/dist/graph-path-reconstruction.d.ts +1 -1
  347. package/dist/graph-path-scoring.d.ts +1 -1
  348. package/dist/graph-snapshot.d.ts +1 -1
  349. package/dist/graph.d.ts +1 -1
  350. package/dist/harmonic-retrieval.js +3 -3
  351. package/dist/importance.d.ts +1 -1
  352. package/dist/importers/index.d.ts +1 -1
  353. package/dist/importers/test-utils.d.ts +1 -1
  354. package/dist/in-flight-reads.d.ts +1 -1
  355. package/dist/{index-DWOb4wz9.d.ts → index-CtmmCJoo.d.ts} +3 -3
  356. package/dist/index.d.ts +80 -40
  357. package/dist/index.js +316 -296
  358. package/dist/intent.d.ts +1 -1
  359. package/dist/lcm/engine.d.ts +1 -1
  360. package/dist/lcm/engine.js +3 -3
  361. package/dist/lcm/index.d.ts +1 -1
  362. package/dist/lcm/index.js +11 -11
  363. package/dist/lcm/tools.d.ts +1 -1
  364. package/dist/lifecycle.d.ts +1 -1
  365. package/dist/live-connectors-runner.d.ts +1 -1
  366. package/dist/local-llm-DpXIvm6F.d.ts +247 -0
  367. package/dist/local-llm-config.d.ts +4 -1
  368. package/dist/local-llm-config.js +4 -2
  369. package/dist/local-llm-helpers.d.ts +18 -69
  370. package/dist/local-llm-helpers.js +1 -1
  371. package/dist/local-llm.d.ts +3 -170
  372. package/dist/local-llm.js +2 -2
  373. package/dist/local-model-endpoint.d.ts +1 -1
  374. package/dist/location/index.d.ts +3 -3
  375. package/dist/location/index.js +25 -25
  376. package/dist/maintenance/memory-governance.d.ts +1 -1
  377. package/dist/maintenance/memory-governance.js +24 -24
  378. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  379. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +23 -23
  380. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  381. package/dist/maintenance/rebuild-memory-projection.js +25 -25
  382. package/dist/{maintenance-CW9wCzMP.d.ts → maintenance-CNgoLsoM.d.ts} +13 -6
  383. package/dist/mcp-memory-inspector-app.d.ts +16 -14
  384. package/dist/memory-action-policy.d.ts +1 -1
  385. package/dist/memory-cache.d.ts +1 -1
  386. package/dist/memory-controller.d.ts +1 -1
  387. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  388. package/dist/memory-projection-store.d.ts +1 -1
  389. package/dist/memory-provenance.d.ts +1 -1
  390. package/dist/memory-snapshot.d.ts +1 -1
  391. package/dist/memory-subject-cli.d.ts +16 -14
  392. package/dist/memory-subject.d.ts +16 -14
  393. package/dist/memory-worth-outcomes.d.ts +2 -2
  394. package/dist/models-json.d.ts +1 -1
  395. package/dist/namespaces/migrate.d.ts +3 -3
  396. package/dist/namespaces/migrate.js +24 -24
  397. package/dist/namespaces/principal.d.ts +1 -1
  398. package/dist/namespaces/search.d.ts +12 -1
  399. package/dist/namespaces/search.js +9 -9
  400. package/dist/namespaces/storage.d.ts +3 -3
  401. package/dist/namespaces/storage.js +23 -23
  402. package/dist/native-knowledge.d.ts +1 -1
  403. package/dist/offline-sync-impression-drain.d.ts +1 -1
  404. package/dist/operator-doctor-corpus.d.ts +1 -1
  405. package/dist/operator-doctor-corpus.js +26 -26
  406. package/dist/operator-doctor-replica.d.ts +1 -1
  407. package/dist/operator-toolkit.d.ts +3 -3
  408. package/dist/operator-toolkit.js +45 -44
  409. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  410. package/dist/orchestration/maintenance.d.ts +4 -4
  411. package/dist/orchestration/maintenance.js +36 -36
  412. package/dist/{orchestrator-ComHLm49.d.ts → orchestrator-DT7ybIFz.d.ts} +32 -11
  413. package/dist/orchestrator.d.ts +13 -12
  414. package/dist/orchestrator.js +176 -171
  415. package/dist/patterns-cli.d.ts +1 -1
  416. package/dist/{pipeline-CiYcqqhl.d.ts → pipeline-CgBEmHcz.d.ts} +1 -1
  417. package/dist/policy-runtime.d.ts +1 -1
  418. package/dist/proactive-contention.d.ts +2 -2
  419. package/dist/provenance.d.ts +1 -1
  420. package/dist/{public-http-CuK4_Cb1.d.ts → public-http-C8P8fyiO.d.ts} +1 -1
  421. package/dist/{qmd-qXD4vatU.d.ts → qmd-BkY8KpCh.d.ts} +2 -2
  422. package/dist/qmd-preflight.d.ts +2 -2
  423. package/dist/qmd-recall-cache.d.ts +1 -1
  424. package/dist/qmd.d.ts +2 -2
  425. package/dist/qmd.js +2 -2
  426. package/dist/recall-concurrency-config.d.ts +1 -1
  427. package/dist/recall-disclosure-escalation.d.ts +1 -1
  428. package/dist/recall-explain-renderer.d.ts +1 -1
  429. package/dist/recall-explain-renderer.js +3 -3
  430. package/dist/recall-memory-map.d.ts +1 -1
  431. package/dist/recall-navigate-access.d.ts +1 -1
  432. package/dist/recall-navigate-access.js +2 -2
  433. package/dist/recall-navigate-disclosure.d.ts +1 -1
  434. package/dist/recall-navigate-disclosure.js +1 -1
  435. package/dist/recall-navigate.d.ts +1 -1
  436. package/dist/recall-navigate.js +2 -2
  437. package/dist/recall-planner-llm.d.ts +3 -2
  438. package/dist/recall-planner-llm.js +4 -3
  439. package/dist/recall-planner-llm.js.map +1 -1
  440. package/dist/recall-state-view-admission.d.ts +13 -3
  441. package/dist/recall-state-view-admission.js +9 -9
  442. package/dist/recall-state-view-anchors.d.ts +1 -1
  443. package/dist/recall-state-view-anchors.js +2 -2
  444. package/dist/recall-state-view-inject.js +2 -2
  445. package/dist/recall-state-view-render.js +2 -2
  446. package/dist/recall-state-view-widen.js +2 -2
  447. package/dist/recall-state-view-wire.js +3 -3
  448. package/dist/recall-state-view.d.ts +10 -1
  449. package/dist/recall-state-view.js +5 -3
  450. package/dist/recall-state.d.ts +1 -1
  451. package/dist/recall-tag-filter.d.ts +1 -1
  452. package/dist/recall-timings.d.ts +1 -1
  453. package/dist/recall-xray-cli.d.ts +1 -1
  454. package/dist/recall-xray-cli.js +4 -4
  455. package/dist/recall-xray-renderer.d.ts +1 -1
  456. package/dist/recall-xray-renderer.js +3 -3
  457. package/dist/recall-xray.d.ts +1 -1
  458. package/dist/recall-xray.js +2 -2
  459. package/dist/reconcile/cursor.d.ts +1 -1
  460. package/dist/reconcile/cursor.js +2 -2
  461. package/dist/reconcile/manifest.d.ts +1 -1
  462. package/dist/reconcile/manifest.js +4 -4
  463. package/dist/reconcile/plan.d.ts +1 -1
  464. package/dist/reconcile/plan.js +2 -2
  465. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  466. package/dist/replay/normalizers/claude.d.ts +1 -1
  467. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  468. package/dist/replay/normalizers/shared.d.ts +1 -1
  469. package/dist/replay/runner.d.ts +1 -1
  470. package/dist/replay/types.d.ts +1 -1
  471. package/dist/replica-divergence.d.ts +1 -1
  472. package/dist/replica-peers-config.d.ts +1 -1
  473. package/dist/{resolution-4GG3QZRJ.js → resolution-LXFQQ4AE.js} +5 -5
  474. package/dist/resolution-LXFQQ4AE.js.map +1 -0
  475. package/dist/resolve-auth-token.d.ts +1 -1
  476. package/dist/resume-bundles.js +12 -11
  477. package/dist/retrieval-agents.d.ts +2 -2
  478. package/dist/retrieval-tiers.d.ts +1 -1
  479. package/dist/routing/engine.d.ts +1 -1
  480. package/dist/routing/store.d.ts +1 -1
  481. package/dist/salvage-envelope.d.ts +1 -1
  482. package/dist/{scope-profiles-BT9rqC3w.d.ts → scope-profiles-BBPjZ9jb.d.ts} +1 -1
  483. package/dist/search/embed-helper.d.ts +1 -1
  484. package/dist/search/factory.d.ts +1 -1
  485. package/dist/search/factory.js +8 -8
  486. package/dist/search/index.d.ts +1 -1
  487. package/dist/search/index.js +12 -12
  488. package/dist/search/lancedb-backend.d.ts +1 -1
  489. package/dist/search/lancedb-backend.js +2 -2
  490. package/dist/search/meilisearch-backend.d.ts +1 -1
  491. package/dist/search/meilisearch-backend.js +2 -2
  492. package/dist/search/noop-backend.d.ts +1 -1
  493. package/dist/search/orama-backend.d.ts +1 -1
  494. package/dist/search/orama-backend.js +2 -2
  495. package/dist/search/port.d.ts +2 -2
  496. package/dist/search/port.js +1 -1
  497. package/dist/search/remote-backend.d.ts +1 -1
  498. package/dist/search/remote-backend.js +2 -2
  499. package/dist/{semantic-consolidation-CmZi7thY.d.ts → semantic-consolidation-BPFFVO84.d.ts} +1 -1
  500. package/dist/semantic-consolidation.d.ts +2 -2
  501. package/dist/semantic-consolidation.js +26 -26
  502. package/dist/semantic-rule-promotion.js +23 -23
  503. package/dist/semantic-rule-verifier.d.ts +1 -1
  504. package/dist/semantic-rule-verifier.js +23 -23
  505. package/dist/{service-CLkA7AQB.d.ts → service-jKcr6Jvr.d.ts} +2 -2
  506. package/dist/session-observer-bands.d.ts +1 -1
  507. package/dist/session-observer-state.d.ts +1 -1
  508. package/dist/shared-context/manager.d.ts +1 -1
  509. package/dist/shared-context/manager.js +2 -2
  510. package/dist/shared-context/write-output-controls.d.ts +34 -0
  511. package/dist/shared-context/write-output-controls.js +10 -0
  512. package/dist/shared-context/write-output-controls.js.map +1 -0
  513. package/dist/signal.d.ts +1 -1
  514. package/dist/source-agent-qualifier.d.ts +1 -1
  515. package/dist/source-agent-qualifier.js +31 -31
  516. package/dist/source-attribution.d.ts +23 -1
  517. package/dist/source-attribution.js +13 -3
  518. package/dist/standup/build.js +23 -23
  519. package/dist/{storage-wvX01lht.d.ts → storage-C-0Ah5OY.d.ts} +2 -1
  520. package/dist/storage.d.ts +2 -2
  521. package/dist/storage.js +22 -22
  522. package/dist/subject-config.d.ts +1 -1
  523. package/dist/summarizer.d.ts +1 -1
  524. package/dist/summarizer.js +6 -6
  525. package/dist/summary-snapshot.d.ts +1 -1
  526. package/dist/support-passport/index.d.ts +18 -17
  527. package/dist/support-passport/index.js +78 -77
  528. package/dist/task-llm-config.d.ts +16 -0
  529. package/dist/task-llm-config.js +12 -0
  530. package/dist/task-llm-config.js.map +1 -0
  531. package/dist/temporal-supersession.d.ts +2 -2
  532. package/dist/temporal-timeline-recall.d.ts +1 -1
  533. package/dist/temporal-validity.d.ts +1 -1
  534. package/dist/threading.d.ts +1 -1
  535. package/dist/tier-migration.d.ts +2 -2
  536. package/dist/tier-routing.d.ts +1 -1
  537. package/dist/tier-routing.js +3 -3
  538. package/dist/{tier-stats-LUSUUNU6.js → tier-stats-VK5PCO2L.js} +4 -4
  539. package/dist/topics.d.ts +1 -1
  540. package/dist/transcript.d.ts +1 -1
  541. package/dist/transfer/backup.js +2 -2
  542. package/dist/transfer/capsule-export.js +2 -2
  543. package/dist/transfer/capsule-import.js +3 -3
  544. package/dist/transfer/export-okf.d.ts +1 -1
  545. package/dist/transfer/export-okf.js +23 -23
  546. package/dist/trust-score-stage.d.ts +1 -1
  547. package/dist/trust-score.d.ts +1 -1
  548. package/dist/{types-Cyr32ABj.d.ts → types-cK5LydjL.d.ts} +6 -1
  549. package/dist/types.d.ts +1 -1
  550. package/dist/types.js +1 -1
  551. package/dist/utility-runtime.d.ts +1 -1
  552. package/dist/verified-recall.js +23 -23
  553. package/dist/who-knows-cli.d.ts +16 -14
  554. package/dist/who-knows-cli.js +24 -24
  555. package/dist/who-knows.d.ts +16 -14
  556. package/dist/who-knows.js +23 -23
  557. package/dist/write-envelope.d.ts +1 -1
  558. package/package.json +12 -2
  559. package/src/access-category-alias.test.ts +93 -0
  560. package/src/access-http.ts +1 -1
  561. package/src/access-mcp-shared-context-tools.ts +103 -0
  562. package/src/access-mcp.ts +4 -74
  563. package/src/access-offline-manifest.ts +52 -2
  564. package/src/access-operations-batch.ts +45 -2
  565. package/src/access-schema.ts +9 -4
  566. package/src/access-service.ts +14 -7
  567. package/src/activity/config.test.ts +61 -0
  568. package/src/activity/config.ts +40 -1
  569. package/src/activity/timeline/analysis-provider.ts +8 -2
  570. package/src/activity/timeline/analysis-run.test.ts +82 -0
  571. package/src/activity/timeline/publish-cli.test.ts +30 -0
  572. package/src/activity/timeline/publish-cli.ts +7 -0
  573. package/src/activity/timeline/query.ts +8 -1
  574. package/src/activity/timeline/regenerate.test.ts +130 -2
  575. package/src/activity/timeline/regenerate.ts +14 -6
  576. package/src/activity/vault-frontmatter.test.ts +99 -1
  577. package/src/activity/vault-frontmatter.ts +131 -0
  578. package/src/activity/vault-publish.ts +6 -0
  579. package/src/activity/vault-publisher.test.ts +172 -0
  580. package/src/activity/vault-publisher.ts +69 -15
  581. package/src/activity/vault-region.test.ts +7 -2
  582. package/src/activity/vault-region.ts +7 -3
  583. package/src/background-generation-config.ts +32 -6
  584. package/src/background-generation.test.ts +10 -1
  585. package/src/cli/deep-recall-commands.ts +22 -10
  586. package/src/cli/timeline-publish-commands.ts +9 -0
  587. package/src/config.test.ts +170 -43
  588. package/src/config.ts +22 -5
  589. package/src/dedup/merge.test.ts +283 -0
  590. package/src/deep-recall-boundary.test.ts +66 -0
  591. package/src/deep-recall-cli.test.ts +82 -0
  592. package/src/deep-recall-config.test.ts +56 -0
  593. package/src/deep-recall-config.ts +32 -0
  594. package/src/deep-recall-http-glue.ts +10 -10
  595. package/src/deep-recall-policy-llm.test.ts +242 -0
  596. package/src/deep-recall-policy-llm.ts +37 -7
  597. package/src/deep-recall-seeds.test.ts +53 -0
  598. package/src/deep-recall-seeds.ts +7 -1
  599. package/src/deep-recall-surface.test.ts +93 -0
  600. package/src/deep-recall.test.ts +121 -0
  601. package/src/deep-recall.ts +88 -28
  602. package/src/extraction-error-classification.ts +36 -1
  603. package/src/extraction-timeout.test.ts +110 -1
  604. package/src/extraction.test.ts +19 -1
  605. package/src/extraction.ts +23 -21
  606. package/src/fallback-llm-codex-subscription.ts +220 -12
  607. package/src/fallback-llm-parse-failure.test.ts +156 -0
  608. package/src/fallback-llm.test.ts +178 -0
  609. package/src/fallback-llm.ts +200 -198
  610. package/src/index.ts +1 -0
  611. package/src/local-llm-config.ts +11 -10
  612. package/src/local-llm-headers-timeout.test.ts +30 -0
  613. package/src/local-llm-helpers.ts +28 -0
  614. package/src/local-llm.ts +8 -19
  615. package/src/meetings/config.test.ts +58 -0
  616. package/src/namespaces/search.test.ts +51 -1
  617. package/src/namespaces/search.ts +48 -3
  618. package/src/orchestration/extraction-persist-promotion.test.ts +228 -2
  619. package/src/orchestration/extraction-persist-promotion.ts +17 -14
  620. package/src/orchestration/extraction-persist.ts +1 -1
  621. package/src/orchestration/orchestrator-helpers.test.ts +104 -0
  622. package/src/orchestration/orchestrator-init.ts +366 -106
  623. package/src/orchestration/recall-entry.ts +15 -1
  624. package/src/orchestration/recall-internal.ts +6 -11
  625. package/src/orchestration/recall-section-coordinator.ts +65 -28
  626. package/src/orchestration/recall-state-view-pipeline.test.ts +8 -2
  627. package/src/orchestration/semantic-merge-commit-effects.ts +45 -16
  628. package/src/orchestration/semantic-merge-persist.ts +23 -36
  629. package/src/orchestration/semantic-merge-promotion-payload.ts +62 -6
  630. package/src/orchestration/startup-collection-checks.ts +85 -0
  631. package/src/orchestrator-flush.test.ts +7 -0
  632. package/src/orchestrator-init.test.ts +1539 -0
  633. package/src/orchestrator.ts +7 -0
  634. package/src/providers/codex-subscription.test.ts +127 -0
  635. package/src/providers/codex-subscription.ts +1 -1
  636. package/src/qmd.ts +21 -10
  637. package/src/recall-state-view-admission.ts +11 -1
  638. package/src/recall-state-view-budget.test.ts +424 -0
  639. package/src/recall-state-view-cron-intent.test.ts +268 -0
  640. package/src/recall-state-view-widen.test.ts +14 -5
  641. package/src/recall-state-view-widen.ts +8 -1
  642. package/src/recall-state-view.ts +35 -18
  643. package/src/reconcile-identity-cache.test.ts +82 -1
  644. package/src/search/port.ts +1 -1
  645. package/src/shared-context/envelope-io.ts +25 -0
  646. package/src/shared-context/envelope-wiring.test.ts +4 -2
  647. package/src/shared-context/manager.ts +1 -0
  648. package/src/shared-context/write-output-controls.test.ts +192 -0
  649. package/src/shared-context/write-output-controls.ts +72 -0
  650. package/src/source-attribution.test.ts +39 -0
  651. package/src/source-attribution.ts +72 -0
  652. package/src/storage/cas-revision-store.test.ts +4 -0
  653. package/src/storage/cas-revision-store.ts +104 -12
  654. package/src/storage-frontmatter-cas.test.ts +19 -17
  655. package/src/summarizer.ts +5 -1
  656. package/src/task-llm-config.test.ts +124 -0
  657. package/src/task-llm-config.ts +88 -0
  658. package/src/testing/subjects/startup-discovery-lifecycle.test.ts +273 -0
  659. package/src/types.ts +6 -0
  660. package/dist/chunk-3CBI2ZSA.js.map +0 -1
  661. package/dist/chunk-5HYUUFMQ.js.map +0 -1
  662. package/dist/chunk-5SPCMAUC.js.map +0 -1
  663. package/dist/chunk-6H2G7RFT.js.map +0 -1
  664. package/dist/chunk-6YAIN5XJ.js.map +0 -1
  665. package/dist/chunk-ACY4ZPF7.js.map +0 -1
  666. package/dist/chunk-B36GUU6T.js.map +0 -1
  667. package/dist/chunk-BLDBT6HZ.js.map +0 -1
  668. package/dist/chunk-CARRTDKC.js.map +0 -1
  669. package/dist/chunk-CC37E3QM.js.map +0 -1
  670. package/dist/chunk-CWTCMZGE.js.map +0 -1
  671. package/dist/chunk-CZTPU65V.js.map +0 -1
  672. package/dist/chunk-EYKIDK33.js.map +0 -1
  673. package/dist/chunk-FWWWUPOE.js.map +0 -1
  674. package/dist/chunk-IQEJIOEU.js.map +0 -1
  675. package/dist/chunk-IYKZJVL5.js.map +0 -1
  676. package/dist/chunk-JXN77SGO.js.map +0 -1
  677. package/dist/chunk-KQW3YGEN.js.map +0 -1
  678. package/dist/chunk-LPYYY4AP.js.map +0 -1
  679. package/dist/chunk-LQNRVPTV.js.map +0 -1
  680. package/dist/chunk-MVAQ2WM3.js.map +0 -1
  681. package/dist/chunk-OEDW4ER7.js.map +0 -1
  682. package/dist/chunk-OPBFP4TF.js.map +0 -1
  683. package/dist/chunk-P4ZAEYKG.js.map +0 -1
  684. package/dist/chunk-QHT7MOUF.js.map +0 -1
  685. package/dist/chunk-QTQ6XKGT.js.map +0 -1
  686. package/dist/chunk-SV4Z2S67.js.map +0 -1
  687. package/dist/chunk-TNZNSMVJ.js.map +0 -1
  688. package/dist/chunk-TRLOFIQC.js.map +0 -1
  689. package/dist/chunk-UZEHHXYC.js.map +0 -1
  690. package/dist/chunk-WKDFJXW5.js.map +0 -1
  691. package/dist/chunk-YDVAM7S4.js.map +0 -1
  692. package/dist/chunk-YFTNZMGR.js.map +0 -1
  693. package/dist/chunk-YKREX63Z.js.map +0 -1
  694. /package/dist/{capsule-crypto-7FJQINUR.js.map → access-mcp-shared-context-tools.js.map} +0 -0
  695. /package/dist/{auto-sync-RP4C6ZPF.js.map → auto-sync-7PGUFY7U.js.map} +0 -0
  696. /package/dist/{contradiction-scan-BSGKZHYJ.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  697. /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-3MNURAQ3.js.map} +0 -0
  698. /package/dist/{chunk-XH3HGI2N.js.map → chunk-2HQPE2NM.js.map} +0 -0
  699. /package/dist/{chunk-3EKVN2OP.js.map → chunk-2ZG2LLZT.js.map} +0 -0
  700. /package/dist/{chunk-6EHM2AV7.js.map → chunk-3BLHPQHT.js.map} +0 -0
  701. /package/dist/{chunk-J272ODKJ.js.map → chunk-42DJ235G.js.map} +0 -0
  702. /package/dist/{chunk-F4EHXVP7.js.map → chunk-46RII65S.js.map} +0 -0
  703. /package/dist/{chunk-YUW66UAH.js.map → chunk-4AX5OYKC.js.map} +0 -0
  704. /package/dist/{chunk-AECJY3GJ.js.map → chunk-4IGOLIWM.js.map} +0 -0
  705. /package/dist/{chunk-2ZTDRNCS.js.map → chunk-54QPOE45.js.map} +0 -0
  706. /package/dist/{chunk-O4M4BDIJ.js.map → chunk-563X6JJX.js.map} +0 -0
  707. /package/dist/{chunk-IL6ODG6M.js.map → chunk-5EQT62HH.js.map} +0 -0
  708. /package/dist/{chunk-JKKII6GX.js.map → chunk-6MQMYXSQ.js.map} +0 -0
  709. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  710. /package/dist/{chunk-BV4ZKIZH.js.map → chunk-7ZLC4DTZ.js.map} +0 -0
  711. /package/dist/{chunk-WBM2MVBK.js.map → chunk-A4OIJYCV.js.map} +0 -0
  712. /package/dist/{chunk-RLJHJQUY.js.map → chunk-AFJHNHAM.js.map} +0 -0
  713. /package/dist/{chunk-4RZLTZVM.js.map → chunk-AKABVXFS.js.map} +0 -0
  714. /package/dist/{chunk-M6HBPLBA.js.map → chunk-AUSRUOMQ.js.map} +0 -0
  715. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  716. /package/dist/{chunk-Q7CLGFA7.js.map → chunk-C3G6MW4W.js.map} +0 -0
  717. /package/dist/{chunk-O76F5QPP.js.map → chunk-D6PY63OM.js.map} +0 -0
  718. /package/dist/{chunk-BD7JTBYP.js.map → chunk-D7MAYFQP.js.map} +0 -0
  719. /package/dist/{chunk-LMLGBG6H.js.map → chunk-DBB5JPSL.js.map} +0 -0
  720. /package/dist/{chunk-TSP5WH72.js.map → chunk-DIXZQTGY.js.map} +0 -0
  721. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  722. /package/dist/{chunk-UHRZ324M.js.map → chunk-E3I3NDUP.js.map} +0 -0
  723. /package/dist/{chunk-AENM6GKU.js.map → chunk-E4LMQTST.js.map} +0 -0
  724. /package/dist/{chunk-MUTVRKKY.js.map → chunk-EMSYMYXO.js.map} +0 -0
  725. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  726. /package/dist/{chunk-FXHOZGSE.js.map → chunk-F5H6YG5P.js.map} +0 -0
  727. /package/dist/{chunk-TNSCIPBQ.js.map → chunk-G6NQ3L4T.js.map} +0 -0
  728. /package/dist/{chunk-ZMWSYUUL.js.map → chunk-GCBIXUPT.js.map} +0 -0
  729. /package/dist/{chunk-4BCHFSC7.js.map → chunk-GWNSKQDA.js.map} +0 -0
  730. /package/dist/{chunk-JDX2OA4R.js.map → chunk-HNHIHXSD.js.map} +0 -0
  731. /package/dist/{chunk-GG5FHZJJ.js.map → chunk-I33QYUAF.js.map} +0 -0
  732. /package/dist/{chunk-AAZEKXUP.js.map → chunk-IYIPXAIJ.js.map} +0 -0
  733. /package/dist/{chunk-5U7K4W6K.js.map → chunk-JDOBQPJY.js.map} +0 -0
  734. /package/dist/{chunk-UZZ7SQT3.js.map → chunk-JMWUPUE6.js.map} +0 -0
  735. /package/dist/{chunk-ENBPQEVU.js.map → chunk-JSD7Q7LD.js.map} +0 -0
  736. /package/dist/{chunk-Q432REND.js.map → chunk-KJLLPG26.js.map} +0 -0
  737. /package/dist/{chunk-JTQR6L2N.js.map → chunk-KLUC2GSG.js.map} +0 -0
  738. /package/dist/{chunk-OB3XMWX5.js.map → chunk-KVO2BTA4.js.map} +0 -0
  739. /package/dist/{chunk-PCOVEDPK.js.map → chunk-KZJM7R4F.js.map} +0 -0
  740. /package/dist/{chunk-X4TD4O2F.js.map → chunk-LE2KZ72G.js.map} +0 -0
  741. /package/dist/{chunk-HIP6DKJJ.js.map → chunk-LQVXSRAJ.js.map} +0 -0
  742. /package/dist/{chunk-A7GQBJP5.js.map → chunk-LVFI5LG7.js.map} +0 -0
  743. /package/dist/{chunk-VBSNUH4J.js.map → chunk-ND7MAIJC.js.map} +0 -0
  744. /package/dist/{chunk-54NX5EG4.js.map → chunk-P66QH6R6.js.map} +0 -0
  745. /package/dist/{chunk-62D2PAAM.js.map → chunk-PAAJWQH5.js.map} +0 -0
  746. /package/dist/{chunk-TA4C3XB7.js.map → chunk-PFKIOYJH.js.map} +0 -0
  747. /package/dist/{chunk-WIWLX65T.js.map → chunk-PGGPRF6J.js.map} +0 -0
  748. /package/dist/{chunk-V6EGNVUT.js.map → chunk-PIWFNPQT.js.map} +0 -0
  749. /package/dist/{chunk-4JVQRFZD.js.map → chunk-PLJ2MQFT.js.map} +0 -0
  750. /package/dist/{chunk-4RX5O34R.js.map → chunk-PQ42DJNG.js.map} +0 -0
  751. /package/dist/{chunk-37CAEC7E.js.map → chunk-PWPIERBM.js.map} +0 -0
  752. /package/dist/{chunk-ZEGL7YCC.js.map → chunk-Q62GA5U2.js.map} +0 -0
  753. /package/dist/{chunk-GAS7KYC7.js.map → chunk-RQQO3ORQ.js.map} +0 -0
  754. /package/dist/{chunk-3NPNBVFR.js.map → chunk-UZGHKD3T.js.map} +0 -0
  755. /package/dist/{chunk-VJIE4D2I.js.map → chunk-V62YYBBY.js.map} +0 -0
  756. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  757. /package/dist/{chunk-6AGWBKQU.js.map → chunk-VSN2DMQK.js.map} +0 -0
  758. /package/dist/{chunk-ZHXSOMYH.js.map → chunk-VVX5PZFS.js.map} +0 -0
  759. /package/dist/{chunk-GI4ZBWPQ.js.map → chunk-W7UV2ZCA.js.map} +0 -0
  760. /package/dist/{chunk-GMIQV6DD.js.map → chunk-WBQ4ONQJ.js.map} +0 -0
  761. /package/dist/{chunk-FNHLI2RE.js.map → chunk-WFMQN7JE.js.map} +0 -0
  762. /package/dist/{chunk-ZBW7A667.js.map → chunk-WPGA4RYI.js.map} +0 -0
  763. /package/dist/{chunk-YQNNHLCG.js.map → chunk-WPGR3RW4.js.map} +0 -0
  764. /package/dist/{chunk-NXGSONWM.js.map → chunk-WZIO3TW6.js.map} +0 -0
  765. /package/dist/{chunk-ZZUVBZL2.js.map → chunk-X2QPKLPL.js.map} +0 -0
  766. /package/dist/{chunk-VSL63CFJ.js.map → chunk-XRS65T4O.js.map} +0 -0
  767. /package/dist/{chunk-5N4MZLEH.js.map → chunk-YFXAWGMR.js.map} +0 -0
  768. /package/dist/{chunk-D545Z7UH.js.map → chunk-Z535ADTC.js.map} +0 -0
  769. /package/dist/{chunk-5YCNDC3C.js.map → chunk-ZX6NNFSY.js.map} +0 -0
  770. /package/dist/{chunk-3N3PBBEH.js.map → chunk-ZYSOT6HD.js.map} +0 -0
  771. /package/dist/{chunk-MCRVQ5YQ.js.map → chunk-ZZEIL3MI.js.map} +0 -0
  772. /package/dist/{resolution-4GG3QZRJ.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
  773. /package/dist/{first-start-migration-ZWMV5CX4.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
  774. /package/dist/{tier-stats-LUSUUNU6.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
@@ -366,3 +366,64 @@ test("an enabled vault rejects relative or whitespace-only vaultPath at config l
366
366
  const inert = parseActivityConfig({ timeline: { vault: { enabled: false, vaultPath: "." } } });
367
367
  assert.equal(inert.timeline.vault.vaultPath, ".");
368
368
  });
369
+
370
+ test("insertUnderHeading must be a trimmed single-line heading (#2917)", () => {
371
+ for (const insertUnderHeading of [" ", " Journal ", "Journal\nExtra"]) {
372
+ assert.throws(
373
+ () => parseActivityConfig({ timeline: { vault: { insertUnderHeading } } }),
374
+ /insertUnderHeading must be a non-empty trimmed single-line heading/,
375
+ `value ${JSON.stringify(insertUnderHeading)} must be rejected`,
376
+ );
377
+ }
378
+ const ok = parseActivityConfig({ timeline: { vault: { insertUnderHeading: "Journal" } } });
379
+ assert.equal(ok.timeline.vault.insertUnderHeading, "Journal");
380
+ });
381
+
382
+ test("readback.journalSection must be a trimmed single-line heading (#2917)", () => {
383
+ for (const journalSection of [" Journal ", "Journal\r\nExtra"]) {
384
+ assert.throws(
385
+ () => parseActivityConfig({ timeline: { vault: { readback: { journalSection } } } }),
386
+ /journalSection must be a non-empty trimmed single-line heading/,
387
+ );
388
+ }
389
+ const ok = parseActivityConfig({ timeline: { vault: { readback: { journalSection: "Journal" } } } });
390
+ assert.equal(ok.timeline.vault.readback.journalSection, "Journal");
391
+ });
392
+
393
+ test("heading-strategy section names that cannot round-trip are rejected at config load (#2917)", () => {
394
+ // `## Timeline #` parses back as `Timeline`. Accepted at load, every
395
+ // publish would throw before producing a status.
396
+ assert.throws(
397
+ () =>
398
+ parseActivityConfig({
399
+ timeline: {
400
+ vault: { sectionStrategy: "heading", publish: { timeline: { section: "Timeline #" } } },
401
+ },
402
+ }),
403
+ /publish\.timeline\.section must survive a heading render-and-parse round trip/,
404
+ );
405
+ const ok = parseActivityConfig({
406
+ timeline: {
407
+ vault: { sectionStrategy: "heading", publish: { timeline: { section: "Timeline" } } },
408
+ },
409
+ });
410
+ assert.equal(ok.timeline.vault.publish.timeline.section, "Timeline");
411
+ });
412
+
413
+ test("marker-strategy still accepts a section name that would fail heading round-trip (#2917)", () => {
414
+ const ok = parseActivityConfig({
415
+ timeline: {
416
+ vault: { sectionStrategy: "markers", publish: { timeline: { section: "Timeline #" } } },
417
+ },
418
+ });
419
+ assert.equal(ok.timeline.vault.publish.timeline.section, "Timeline #");
420
+ });
421
+
422
+ test("insertUnderHeading that cannot round-trip is rejected at config load (#2917)", () => {
423
+ assert.throws(
424
+ () => parseActivityConfig({ timeline: { vault: { insertUnderHeading: "Timeline #" } } }),
425
+ /insertUnderHeading must survive a heading render-and-parse round trip/,
426
+ );
427
+ const ok = parseActivityConfig({ timeline: { vault: { insertUnderHeading: "Journal" } } });
428
+ assert.equal(ok.timeline.vault.insertUnderHeading, "Journal");
429
+ });
@@ -2,10 +2,11 @@ import path from "node:path";
2
2
 
3
3
  import { coerceBooleanLike, coerceNumber } from "../connectors/coerce.js";
4
4
  import { assertValidTimezone } from "./digest.js";
5
- import { applyLegacyJournalHeading } from "./journal-heading.js";
5
+ import { applyLegacyJournalHeading, normalizeJournalHeading } from "./journal-heading.js";
6
6
  import { checkVaultJournalPrerequisites } from "./journal-vault-prereq.js";
7
7
  import { resolveJournalSource } from "./journal-source.js";
8
8
  import { validateVaultNoteTemplate } from "./vault-path.js";
9
+ import { headingSurvivesRoundTrip } from "./vault-publish.js";
9
10
  import { validateRegionName } from "./vault-region.js";
10
11
  import { TIMELINE_ANALYSIS_DEFAULT_TIMEOUT_MS } from "./timeline/analysis.js";
11
12
  import { ANALYSIS_METADATA_MAX_FIELD_LENGTH, isAnalysisIdentifier } from "./timeline/analysis-metadata.js";
@@ -376,6 +377,23 @@ export function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultCon
376
377
  const noteTemplate = optionalNonEmptyString(vault.noteTemplate, "activity.timeline.vault.noteTemplate") ?? "";
377
378
  const insertUnderHeading =
378
379
  optionalNonEmptyString(vault.insertUnderHeading, "activity.timeline.vault.insertUnderHeading") ?? "";
380
+ // The configured insertion heading is matched against parsed note
381
+ // headings, so a blank, padded, or multi-line value can never match
382
+ // (issue #2917). Reuse the journal work's canonical heading validator —
383
+ // no second parser — and require the trimmed form like publish sections.
384
+ if (insertUnderHeading.length > 0) {
385
+ const heading = normalizeJournalHeading(insertUnderHeading);
386
+ if (!heading.ok || heading.heading !== insertUnderHeading) {
387
+ throw new RangeError(
388
+ "activity.timeline.vault.insertUnderHeading must be a non-empty trimmed single-line heading",
389
+ );
390
+ }
391
+ if (!headingSurvivesRoundTrip(insertUnderHeading)) {
392
+ throw new RangeError(
393
+ "activity.timeline.vault.insertUnderHeading must survive a heading render-and-parse round trip",
394
+ );
395
+ }
396
+ }
379
397
 
380
398
  if (typeof vault.sectionStrategy !== "undefined" && typeof vault.sectionStrategy !== "string") {
381
399
  throw new TypeError("activity.timeline.vault.sectionStrategy must be a string");
@@ -423,6 +441,15 @@ export function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultCon
423
441
  }
424
442
 
425
443
  const publish = parseVaultPublishBlock(vault.publish, weeklyNotePath);
444
+ if (sectionStrategy === "heading") {
445
+ for (const kind of ["timeline", "standup", "weekly", "locations"] as const) {
446
+ if (!headingSurvivesRoundTrip(publish[kind].section)) {
447
+ throw new RangeError(
448
+ `activity.timeline.vault.publish.${kind}.section must survive a heading render-and-parse round trip`,
449
+ );
450
+ }
451
+ }
452
+ }
426
453
  const wikilinksRaw = vault.wikilinks;
427
454
  const wikilinks =
428
455
  wikilinksRaw === undefined
@@ -439,6 +466,18 @@ export function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultCon
439
466
  (readbackRaw as Record<string, unknown> | undefined)?.journalSection,
440
467
  "activity.timeline.vault.readback.journalSection",
441
468
  );
469
+ // Readback matches the section by parsed heading text, so a padded or
470
+ // multi-line journalSection can never match and would silently read back
471
+ // an empty journal (issue #2917). Same canonical validator as the legacy
472
+ // journal.heading alias.
473
+ if (readbackJournalSection !== undefined && readbackJournalSection.length > 0) {
474
+ const heading = normalizeJournalHeading(readbackJournalSection);
475
+ if (!heading.ok || heading.heading !== readbackJournalSection) {
476
+ throw new RangeError(
477
+ "activity.timeline.vault.readback.journalSection must be a non-empty trimmed single-line heading",
478
+ );
479
+ }
480
+ }
442
481
  const readback = {
443
482
  journalSection: readbackJournalSection ?? "",
444
483
  };
@@ -25,6 +25,7 @@ export interface TimelineAnalysisLocalLlm {
25
25
  operation?: string;
26
26
  redactProviderErrors?: boolean;
27
27
  model?: string;
28
+ failureDiag?: { lastError?: unknown };
28
29
  },
29
30
  ): Promise<{ content: string } | null>;
30
31
  }
@@ -40,6 +41,7 @@ export interface TimelineAnalysisRemoteLlm {
40
41
  modelChain?: { primary?: string; fallbacks?: string[] };
41
42
  includeDefaultModelFallback?: boolean;
42
43
  redactProviderErrors?: boolean;
44
+ failureDiag?: { lastError?: unknown };
43
45
  },
44
46
  ): Promise<{ content: string } | null>;
45
47
  }
@@ -99,6 +101,7 @@ export function timelineAnalysisCompleteFromClients(input: {
99
101
  "timeline analysis local provider is not configured",
100
102
  );
101
103
  }
104
+ const failureDiag: { lastError?: unknown } = {};
102
105
  const result = await localLlm.chatCompletion(messages, {
103
106
  temperature: 0,
104
107
  maxTokens: 2048,
@@ -106,10 +109,11 @@ export function timelineAnalysisCompleteFromClients(input: {
106
109
  operation: "timeline-analysis",
107
110
  redactProviderErrors: true,
108
111
  model,
112
+ failureDiag,
109
113
  });
110
114
  if (result === null) {
111
115
  throw new TimelineAnalysisProviderError(
112
- "provider_unavailable",
116
+ classifyAnalysisProviderError(failureDiag.lastError),
113
117
  "timeline analysis local provider returned no completion",
114
118
  );
115
119
  }
@@ -121,6 +125,7 @@ export function timelineAnalysisCompleteFromClients(input: {
121
125
  "timeline analysis remote provider is not configured",
122
126
  );
123
127
  }
128
+ const failureDiag: { lastError?: unknown } = {};
124
129
  const result = await remoteLlm.chatCompletion(messages, {
125
130
  temperature: 0,
126
131
  maxTokens: 2048,
@@ -128,10 +133,11 @@ export function timelineAnalysisCompleteFromClients(input: {
128
133
  modelChain: { primary: `${provider}/${model}` },
129
134
  includeDefaultModelFallback: false,
130
135
  redactProviderErrors: true,
136
+ failureDiag,
131
137
  });
132
138
  if (result === null) {
133
139
  throw new TimelineAnalysisProviderError(
134
- "provider_unavailable",
140
+ classifyAnalysisProviderError(failureDiag.lastError),
135
141
  `timeline analysis provider "${provider}" is not configured`,
136
142
  );
137
143
  }
@@ -417,3 +417,85 @@ test("adapter pins the call-time provider verbatim with no chain fallback", asyn
417
417
  });
418
418
  assert.deepEqual(seen, ["anthropic/claude-4_1"]);
419
419
  });
420
+
421
+ test("remote failureDiag preserves a rate-limited failure as retryable (issue #2891)", async () => {
422
+ const cards = sampleCards();
423
+ const remoteLlm: TimelineAnalysisRemoteLlm = {
424
+ chatCompletion: async (_messages, options) => {
425
+ assert.ok(options.failureDiag, "adapter must pass a failureDiag out-box");
426
+ options.failureDiag.lastError = Object.assign(new Error("provider throttled"), { status: 429 });
427
+ return null;
428
+ },
429
+ };
430
+ const result = await runTimelineCardAnalysis({
431
+ date: DATE,
432
+ timezone: TZ,
433
+ cards,
434
+ observations: [observation()],
435
+ config: ENABLED,
436
+ deps: { remoteLlm },
437
+ });
438
+ assert.equal(result.status, "provider_failed");
439
+ assert.equal(result.failure?.kind, "rate_limited");
440
+ assert.equal(result.failure?.retryable, true);
441
+ assert.equal(result.failure?.preservesDeterministic, true);
442
+ assert.equal(result.cards, cards);
443
+ });
444
+
445
+ test("local failureDiag preserves a rate-limited failure (issue #2891)", async () => {
446
+ const localLlm: TimelineAnalysisLocalLlm = {
447
+ chatCompletion: async (_messages, options) => {
448
+ assert.ok(options.failureDiag, "adapter must pass a failureDiag out-box");
449
+ options.failureDiag.lastError = Object.assign(new Error("local backend throttled"), { status: 429 });
450
+ return null;
451
+ },
452
+ };
453
+ const result = await runTimelineCardAnalysis({
454
+ date: DATE,
455
+ timezone: TZ,
456
+ cards: sampleCards(),
457
+ observations: [observation()],
458
+ config: { enabled: true, provider: "local", model: "local-test" },
459
+ deps: { localLlm },
460
+ });
461
+ assert.equal(result.status, "provider_failed");
462
+ assert.equal(result.failure?.kind, "rate_limited");
463
+ assert.equal(result.failure?.retryable, true);
464
+ });
465
+
466
+ test("failureDiag without a rate limit still classifies as provider_unavailable", async () => {
467
+ const remoteLlm: TimelineAnalysisRemoteLlm = {
468
+ chatCompletion: async (_messages, options) => {
469
+ options.failureDiag!.lastError = Object.assign(new Error("server error"), { status: 500 });
470
+ return null;
471
+ },
472
+ };
473
+ const result = await runTimelineCardAnalysis({
474
+ date: DATE,
475
+ timezone: TZ,
476
+ cards: sampleCards(),
477
+ observations: [observation()],
478
+ config: ENABLED,
479
+ deps: { remoteLlm },
480
+ });
481
+ assert.equal(result.status, "provider_failed");
482
+ assert.equal(result.failure?.kind, "provider_unavailable");
483
+ assert.equal(result.failure?.retryable, true);
484
+ });
485
+
486
+ test("a null completion with no recorded cause keeps the generic kind", async () => {
487
+ const remoteLlm: TimelineAnalysisRemoteLlm = {
488
+ chatCompletion: async () => null,
489
+ };
490
+ const result = await runTimelineCardAnalysis({
491
+ date: DATE,
492
+ timezone: TZ,
493
+ cards: sampleCards(),
494
+ observations: [observation()],
495
+ config: ENABLED,
496
+ deps: { remoteLlm },
497
+ });
498
+ assert.equal(result.status, "provider_failed");
499
+ assert.equal(result.failure?.kind, "provider_unavailable");
500
+ assert.equal(result.failure?.retryable, true);
501
+ });
@@ -167,3 +167,33 @@ test("range and search reject publish-only flags instead of ignoring them", asyn
167
167
  assert.equal(searchCode, 1);
168
168
  assert.match(searchSink.err, /unknown flag --dry-run \(valid: --from, --limit, --query, --to\)/);
169
169
  });
170
+
171
+ test("an explicitly empty --date is invalid, not treated as absent (#2917)", async () => {
172
+ const { config, notePath, note } = makeFixture();
173
+ const sink = capture();
174
+
175
+ const code = await runTimelineCliCommand(
176
+ { cards: null, qa: { enabled: false, maxRangeDays: 31 }, timelineEnabled: true, config },
177
+ ["publish", "--date", ""],
178
+ sink.io,
179
+ );
180
+
181
+ assert.equal(code, 1);
182
+ assert.match(sink.err, /Invalid --date ""/);
183
+ assert.equal(readFileSync(notePath, "utf8"), note, "no note is published on an empty --date");
184
+ });
185
+
186
+ test("publish rejects extra positional arguments instead of discarding them (#2917)", async () => {
187
+ const { config, notePath, note } = makeFixture();
188
+ const sink = capture();
189
+
190
+ const code = await runTimelineCliCommand(
191
+ { cards: null, qa: { enabled: false, maxRangeDays: 31 }, timelineEnabled: true, config },
192
+ ["publish", "extra-arg", "--date", DATE],
193
+ sink.io,
194
+ );
195
+
196
+ assert.equal(code, 1);
197
+ assert.match(sink.err, /takes no positional arguments/);
198
+ assert.equal(readFileSync(notePath, "utf8"), note, "no note is published on excess syntax");
199
+ });
@@ -51,6 +51,13 @@ export function runTimelinePublishCli(
51
51
  return 1;
52
52
  }
53
53
 
54
+ // An explicitly empty --date is invalid, not absent (issue #2917): ""
55
+ // can never be a day, and silently falling back to today would publish
56
+ // the wrong note. Only a missing --date means "today".
57
+ if (options.date !== undefined && (typeof options.date !== "string" || options.date.length === 0)) {
58
+ io.stderr.write(`Invalid --date ${JSON.stringify(options.date ?? "")}; expected YYYY-MM-DD.\n`);
59
+ return 1;
60
+ }
54
61
  // Timeline artifacts are grouped on the configured activity timezone's
55
62
  // calendar day, so "today" must be derived there — the host-local day
56
63
  // drifts by one near either timezone's midnight.
@@ -311,7 +311,14 @@ export async function runTimelineCliCommand(
311
311
  io.stderr.write("timeline publish requires the Remnic config — run `remnic doctor`\n");
312
312
  return 1;
313
313
  }
314
- const publishFlags = parseFlags(rest, PUBLISH_FLAGS).flags;
314
+ const { flags: publishFlags, positional } = parseFlags(rest, PUBLISH_FLAGS);
315
+ // `publish` takes flags only (issue #2917): a stray positional used
316
+ // to be silently discarded while today's note published.
317
+ if (positional.length > 0) {
318
+ throw new TypeError(
319
+ `timeline publish takes no positional arguments (got ${JSON.stringify(positional.join(" "))})`,
320
+ );
321
+ }
315
322
  return runTimelinePublishCli(
316
323
  deps.config,
317
324
  {
@@ -114,7 +114,6 @@ function priorEditsFromPrompt(prompt: string): unknown {
114
114
  return parsed.priorEdits;
115
115
  }
116
116
 
117
-
118
117
  test("disabled analysis persists deterministic cards and makes zero provider calls", async () => {
119
118
  await withStore(async (store, memoryDir) => {
120
119
  store.insertSnapshot(snapshot());
@@ -387,6 +386,54 @@ test("resolveTimelineLoadDates keeps a bounded window and expands an unbounded o
387
386
  assert.deepEqual(empty, ["2026-08-23"]);
388
387
  });
389
388
 
389
+ test("resolveTimelineLoadDates loads the local day of a lone bound, never today (#2931)", () => {
390
+ const store = { snapshotCaptureExtent: () => null };
391
+ const base = { timezone: "UTC" as const, today: "2026-08-23", store, persistedDates: [] as string[] };
392
+
393
+ const loneTo = resolveTimelineLoadDates({
394
+ ...base,
395
+ window: { to: "2026-05-02T12:00:00.000Z" },
396
+ });
397
+ assert.deepEqual(loneTo, ["2026-05-02"], "a lone --to must load the day of the to instant, not today");
398
+
399
+ const loneFrom = resolveTimelineLoadDates({
400
+ ...base,
401
+ window: { from: "2026-05-02T12:00:00.000Z" },
402
+ });
403
+ assert.deepEqual(loneFrom, ["2026-05-02"], "a lone --from keeps loading its own day");
404
+
405
+ const futureTo = resolveTimelineLoadDates({
406
+ ...base,
407
+ window: { to: "2026-09-01T12:00:00.000Z" },
408
+ });
409
+ assert.deepEqual(futureTo, ["2026-09-01"], "a lone future --to loads that future day, not today");
410
+ });
411
+
412
+ test("resolveTimelineLoadDates resolves a lone --to day through the configured timezone (#2931)", () => {
413
+ const store = { snapshotCaptureExtent: () => null };
414
+ // 2026-08-20T23:30Z is 2026-08-21 13:30 in Kiritimati (UTC+14) but still
415
+ // 2026-08-20 in Adak (UTC-10): the same instant must load different local
416
+ // days under the two configured zones, proving the configured timezone —
417
+ // not UTC and not today — drives the resolution.
418
+ const east = resolveTimelineLoadDates({
419
+ window: { to: "2026-08-20T23:30:00.000Z" },
420
+ timezone: "Pacific/Kiritimati",
421
+ today: "2026-08-23",
422
+ store,
423
+ persistedDates: [],
424
+ });
425
+ assert.deepEqual(east, ["2026-08-21"]);
426
+
427
+ const west = resolveTimelineLoadDates({
428
+ window: { to: "2026-08-20T23:30:00.000Z" },
429
+ timezone: "America/Adak",
430
+ today: "2026-08-23",
431
+ store,
432
+ persistedDates: [],
433
+ });
434
+ assert.deepEqual(west, ["2026-08-20"]);
435
+ });
436
+
390
437
  test("localDatesForUtcRange covers a multi-year span for unbounded search", () => {
391
438
  const dates = localDatesForUtcRange(
392
439
  Date.parse("2020-01-01T00:00:00.000Z"),
@@ -413,6 +460,88 @@ test("listPersistedTimelineDates lists only valid day files", async () => {
413
460
  }
414
461
  });
415
462
 
463
+ test("a timezone change invalidates the cached day and re-analyzes (issue #2891)", async () => {
464
+ await withStore(async (store, memoryDir) => {
465
+ store.insertSnapshot(snapshot());
466
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
467
+ const analysis = parseActivityConfig({
468
+ timeline: { analysis: { enabled: true, provider: "openai", model: "gpt-test" } },
469
+ }).timeline.analysis;
470
+ const first = await regenerateTimelineDay({
471
+ date: DATE,
472
+ timezone: TZ,
473
+ memoryDir,
474
+ store,
475
+ timelineEnabled: true,
476
+ analysis,
477
+ deps: { remoteLlm: remote.remoteLlm },
478
+ });
479
+ assert.equal(first.status, "ok");
480
+ assert.equal(remote.calls, 1);
481
+ const sameTz = await regenerateTimelineDay({
482
+ date: DATE,
483
+ timezone: TZ,
484
+ memoryDir,
485
+ store,
486
+ timelineEnabled: true,
487
+ analysis,
488
+ deps: { remoteLlm: remote.remoteLlm },
489
+ });
490
+ assert.equal(sameTz.written, false);
491
+ assert.equal(remote.calls, 1);
492
+ const shifted = await regenerateTimelineDay({
493
+ date: DATE,
494
+ timezone: "America/New_York",
495
+ memoryDir,
496
+ store,
497
+ timelineEnabled: true,
498
+ analysis,
499
+ deps: { remoteLlm: remote.remoteLlm },
500
+ });
501
+ assert.equal(shifted.status, "ok");
502
+ assert.equal(shifted.written, true);
503
+ assert.equal(shifted.analyzed, true);
504
+ assert.equal(remote.calls, 2);
505
+ const persisted = JSON.parse(await readFile(timelineDayPath(memoryDir, DATE), "utf8"));
506
+ assert.equal(persisted.timezone, "America/New_York");
507
+ });
508
+ });
509
+
510
+ test("an empty day cached under one timezone is rebuilt under another (issue #2891)", async () => {
511
+ await withStore(async (store, memoryDir) => {
512
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
513
+ const analysis = parseActivityConfig({
514
+ timeline: { analysis: { enabled: true, provider: "openai", model: "gpt-test" } },
515
+ }).timeline.analysis;
516
+ const first = await regenerateTimelineDay({
517
+ date: DATE,
518
+ timezone: TZ,
519
+ memoryDir,
520
+ store,
521
+ timelineEnabled: true,
522
+ analysis,
523
+ deps: { remoteLlm: remote.remoteLlm },
524
+ });
525
+ assert.equal(first.status, "invalid_output");
526
+ assert.equal(first.analyzed, false);
527
+ assert.equal(remote.calls, 0);
528
+ const shifted = await regenerateTimelineDay({
529
+ date: DATE,
530
+ timezone: "America/New_York",
531
+ memoryDir,
532
+ store,
533
+ timelineEnabled: true,
534
+ analysis,
535
+ deps: { remoteLlm: remote.remoteLlm },
536
+ });
537
+ // Zero observations under any timezone: still a rebuild, never the
538
+ // UTC-cached file served with the old day derivation.
539
+ assert.equal(shifted.written, true);
540
+ const persisted = JSON.parse(await readFile(timelineDayPath(memoryDir, DATE), "utf8"));
541
+ assert.equal(persisted.timezone, "America/New_York");
542
+ });
543
+ });
544
+
416
545
  test("a correction for another day does not change this day's hash, cache, or provider input", async () => {
417
546
  await withStore(async (store, memoryDir) => {
418
547
  store.insertSnapshot(snapshot());
@@ -502,4 +631,3 @@ test("a same-day correction updates hash, cards, and priorEdits", async () => {
502
631
  assert.notEqual(persistedSourceHash(await readFile(timelineDayPath(memoryDir, DATE), "utf8")), firstHash);
503
632
  });
504
633
  });
505
-
@@ -143,9 +143,10 @@ export function listPersistedTimelineDates(memoryDir: string): string[] {
143
143
 
144
144
  /**
145
145
  * Local days a CLI window must load. Bounded windows keep the explicit
146
- * from/to span. An unbounded search loads every day the snapshot store or a
147
- * persisted day file covers (plus today), so historical cards enter the
148
- * search pool instead of only the current day.
146
+ * from/to span; a window with a single bound loads the local day containing
147
+ * that instant (never today). An unbounded search loads every day the
148
+ * snapshot store or a persisted day file covers (plus today), so historical
149
+ * cards enter the search pool instead of only the current day.
149
150
  */
150
151
  export function resolveTimelineLoadDates(input: {
151
152
  window: { from?: string; to?: string };
@@ -156,8 +157,9 @@ export function resolveTimelineLoadDates(input: {
156
157
  }): string[] {
157
158
  const { window, timezone, today, store, persistedDates } = input;
158
159
  if (window.from !== undefined || window.to !== undefined) {
159
- const fromMs = window.from === undefined ? Date.now() : Date.parse(window.from);
160
- const toMs = window.to === undefined ? fromMs + 1 : Date.parse(window.to);
160
+ const parsedTo = window.to === undefined ? Number.NaN : Date.parse(window.to);
161
+ const fromMs = window.from === undefined ? parsedTo : Date.parse(window.from);
162
+ const toMs = window.to === undefined ? fromMs + 1 : parsedTo;
161
163
  if (!Number.isFinite(fromMs) || !Number.isFinite(toMs)) return [];
162
164
  return localDatesForUtcRange(fromMs, toMs > fromMs ? toMs : fromMs + 1, timezone);
163
165
  }
@@ -191,12 +193,18 @@ function resolveClients(input: RegenerateTimelineDayInput): TimelineAnalysisClie
191
193
  }
192
194
 
193
195
  function sourceHash(input: {
196
+ timezone: string;
194
197
  observations: readonly TimelineObservation[];
195
198
  analysis: ActivityTimelineAnalysisConfig;
196
199
  corrections: readonly TimelineCorrection[];
197
200
  }): string {
198
201
  return hashActivityBody(
199
202
  JSON.stringify({
203
+ // The timezone is a day-window determinant (it bounds which
204
+ // observations the day sees), so it belongs to the source identity:
205
+ // identical observations under a different timezone must not reuse
206
+ // the cached day (issue #2891).
207
+ timezone: input.timezone,
200
208
  observations: input.observations.map((observation) => ({
201
209
  id: observation.id,
202
210
  contentHash: observation.contentHash,
@@ -310,7 +318,7 @@ async function regenerateUncached(input: RegenerateTimelineDayInput): Promise<Re
310
318
  const rawCards = buildTimelineDay({ date, timezone, observations }).cards;
311
319
  corrections = correctionsForCards(rawCards, corrections);
312
320
  const built = applyTimelineCorrections(rawCards, corrections);
313
- const hash = sourceHash({ observations, analysis: input.analysis, corrections });
321
+ const hash = sourceHash({ timezone, observations, analysis: input.analysis, corrections });
314
322
  const prior = readPersisted(filePath);
315
323
  if (prior !== null && prior.sourceHash === hash && isCachedDayFinal(prior.status, input.analysis.enabled)) {
316
324
  return toResult(filePath, false, false, prior);
@@ -1,7 +1,14 @@
1
1
  import assert from "node:assert/strict";
2
2
  import test from "node:test";
3
3
 
4
- import { applyVaultFrontmatter } from "./vault-frontmatter.js";
4
+ import {
5
+ applyVaultFrontmatter,
6
+ renderVaultPropertyValue,
7
+ validateVaultProperties,
8
+ VAULT_PROPERTY_LIST_MAX_ITEMS,
9
+ VAULT_PROPERTY_SCALAR_MAX_CHARS,
10
+ VAULT_PROPERTY_TOTAL_MAX_CHARS,
11
+ } from "./vault-frontmatter.js";
5
12
 
6
13
  test("applyVaultFrontmatter merges listed keys and sorts", () => {
7
14
  const merged = applyVaultFrontmatter("zeta: old\nalpha: keep\n", {
@@ -26,3 +33,94 @@ test("applyVaultFrontmatter leaves the original body unchanged when updates are
26
33
  const existing = "zeta: 1\n# comment stays\nalpha: 2\n";
27
34
  assert.equal(applyVaultFrontmatter(existing, {}), existing);
28
35
  });
36
+
37
+ test("accepts a plain scalar and renders it verbatim (#2917)", () => {
38
+ assert.deepEqual(validateVaultProperties([{ key: "remnic_focus", value: "220" }]), { ok: true });
39
+ assert.equal(renderVaultPropertyValue("220"), "220");
40
+ });
41
+
42
+ test("accepts a list of plain scalars and renders a flow list (#2917)", () => {
43
+ assert.deepEqual(validateVaultProperties([{ key: "remnic_cards", value: ["a", "b"] }]), { ok: true });
44
+ assert.equal(renderVaultPropertyValue(["a", "b"]), "[a, b]");
45
+ });
46
+
47
+ test("rejects newline and control characters — the injection primitives (#2917)", () => {
48
+ assert.equal(validateVaultProperties([{ key: "remnic_x", value: "v\ninjected: yes" }]).ok, false);
49
+ assert.equal(validateVaultProperties([{ key: "remnic_x", value: "v\rinjected: yes" }]).ok, false);
50
+ assert.equal(validateVaultProperties([{ key: "remnic_x", value: "v\ttab" }]).ok, false);
51
+ });
52
+
53
+ test("rejects values whose YAML shape would change on re-read (#2917)", () => {
54
+ for (const value of [" padded", "padded ", "[seq]", "{map}", "#comment", "- item", "a #c", "ends:", "a: b"]) {
55
+ assert.equal(
56
+ validateVaultProperties([{ key: "remnic_x", value }]).ok,
57
+ false,
58
+ `value ${JSON.stringify(value)} must be rejected`,
59
+ );
60
+ }
61
+ });
62
+
63
+ test("a negative number stays a plain scalar (#2917)", () => {
64
+ assert.deepEqual(validateVaultProperties([{ key: "remnic_delta", value: "-5" }]), { ok: true });
65
+ });
66
+
67
+ test("rejects unsupported value shapes (#2917)", () => {
68
+ assert.equal(validateVaultProperties([{ key: "remnic_x", value: 42 as unknown as string }]).ok, false);
69
+ assert.equal(validateVaultProperties([{ key: "remnic_x", value: null as unknown as string }]).ok, false);
70
+ assert.equal(
71
+ validateVaultProperties([{ key: "remnic_x", value: { nested: true } as unknown as string }]).ok,
72
+ false,
73
+ );
74
+ assert.equal(validateVaultProperties([{ key: "remnic_x", value: [] as unknown as string[] }]).ok, false);
75
+ });
76
+
77
+ test("rejects oversize scalars, lists, keys, and totals (#2917)", () => {
78
+ assert.equal(
79
+ validateVaultProperties([{ key: "remnic_x", value: "v".repeat(VAULT_PROPERTY_SCALAR_MAX_CHARS + 1) }]).ok,
80
+ false,
81
+ );
82
+ assert.equal(validateVaultProperties([{ key: "x".repeat(65), value: "v" }]).ok, false);
83
+ const tooMany = Array.from({ length: VAULT_PROPERTY_LIST_MAX_ITEMS + 1 }, (_, i) => `item-${i}`);
84
+ assert.equal(validateVaultProperties([{ key: "remnic_x", value: tooMany }]).ok, false);
85
+ const entries = Array.from({ length: 30 }, (_, i) => ({
86
+ key: `remnic_k${i}`,
87
+ value: "v".repeat(100),
88
+ }));
89
+ assert.equal(
90
+ validateVaultProperties(entries).ok,
91
+ false,
92
+ `30 × 100+ chars must exceed the ${VAULT_PROPERTY_TOTAL_MAX_CHARS}-char total`,
93
+ );
94
+ });
95
+
96
+ test("rejects malformed keys (#2917)", () => {
97
+ assert.equal(validateVaultProperties([{ key: "remnic x:", value: "v" }]).ok, false);
98
+ assert.equal(validateVaultProperties([{ key: " padded", value: "v" }]).ok, false);
99
+ assert.equal(validateVaultProperties([{ key: "remnic#x", value: "v" }]).ok, false);
100
+ assert.equal(validateVaultProperties([{ key: "", value: "v" }]).ok, false);
101
+ });
102
+
103
+ test("rejects a final key that starts with a YAML indicator (#2917)", () => {
104
+ // Prefix "[" + key "focus" is the review case: the written line would
105
+ // be `[focus: 220`, which is not a mapping entry.
106
+ for (const key of ["[focus", "{focus", "*focus", "&focus", "!focus", "%focus"]) {
107
+ assert.equal(
108
+ validateVaultProperties([{ key, value: "220" }]).ok,
109
+ false,
110
+ `key ${JSON.stringify(key)} must be rejected`,
111
+ );
112
+ }
113
+ assert.deepEqual(validateVaultProperties([{ key: "remnic_focus", value: "220" }]), { ok: true });
114
+ assert.deepEqual(validateVaultProperties([{ key: "x_focus", value: "220" }]), { ok: true });
115
+ });
116
+
117
+ test("rejects flow delimiters inside list scalar items (#2917)", () => {
118
+ for (const item of ["a{", "a}", "a[", "a]", "a,b"]) {
119
+ assert.equal(
120
+ validateVaultProperties([{ key: "remnic_cards", value: [item] }]).ok,
121
+ false,
122
+ `list item ${JSON.stringify(item)} must be rejected`,
123
+ );
124
+ }
125
+ assert.deepEqual(validateVaultProperties([{ key: "remnic_cards", value: ["a", "b"] }]), { ok: true });
126
+ });