@remnic/core 9.69.38 → 9.69.40

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 (656) hide show
  1. package/dist/access-admin-ops-surface.d.ts +16 -14
  2. package/dist/access-admin-ops-surface.js +39 -39
  3. package/dist/access-authorization-probe.d.ts +16 -14
  4. package/dist/access-authorization-probe.js +40 -40
  5. package/dist/access-boundary.d.ts +16 -14
  6. package/dist/access-boundary.js +39 -39
  7. package/dist/access-cli.js +107 -105
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +16 -14
  11. package/dist/access-extraction-force-flush.js +39 -39
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-briefing.d.ts +16 -14
  14. package/dist/access-http-briefing.js +40 -40
  15. package/dist/access-http-lcm-compaction.d.ts +16 -14
  16. package/dist/access-http-lifecycle-flush.d.ts +16 -14
  17. package/dist/access-http-offline-stream.d.ts +16 -14
  18. package/dist/access-http-query.d.ts +2 -2
  19. package/dist/access-http-query.js +41 -41
  20. package/dist/access-http.d.ts +17 -15
  21. package/dist/access-http.js +58 -58
  22. package/dist/access-identity-continuity-surface.d.ts +13 -12
  23. package/dist/access-identity-continuity-surface.js +39 -39
  24. package/dist/access-lcm-surface.d.ts +16 -14
  25. package/dist/access-lcm-surface.js +39 -39
  26. package/dist/access-mcp.d.ts +16 -14
  27. package/dist/access-mcp.js +47 -47
  28. package/dist/access-memory-search-fanout.d.ts +2 -2
  29. package/dist/{access-namespace-preflight-DY4z6L5X.d.ts → access-namespace-preflight-CKBumJ8W.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +3 -3
  31. package/dist/access-namespace-preflight.js +39 -39
  32. package/dist/access-observe-transcript.d.ts +13 -12
  33. package/dist/access-observe-write-category.d.ts +1 -1
  34. package/dist/access-observe-write-category.js +2 -2
  35. package/dist/access-observe-write-surface.d.ts +16 -14
  36. package/dist/access-observe-write-surface.js +39 -39
  37. package/dist/access-offline-manifest.d.ts +37 -13
  38. package/dist/access-offline-manifest.js +7 -3
  39. package/dist/access-operations-batch.js +41 -41
  40. package/dist/access-operations.d.ts +16 -14
  41. package/dist/access-operations.js +46 -46
  42. package/dist/access-recall-concurrency.d.ts +16 -14
  43. package/dist/access-recall-concurrency.js +39 -39
  44. package/dist/access-recall-response.d.ts +16 -14
  45. package/dist/access-recall-response.js +39 -39
  46. package/dist/access-recall-surface.d.ts +16 -14
  47. package/dist/access-recall-surface.js +39 -39
  48. package/dist/access-schema.d.ts +5 -3
  49. package/dist/access-schema.js +1 -1
  50. package/dist/{access-service-gBcdRUHY.d.ts → access-service-DJ3qogNt.d.ts} +8 -8
  51. package/dist/access-service-helpers.d.ts +16 -14
  52. package/dist/access-service.d.ts +16 -14
  53. package/dist/access-service.js +39 -39
  54. package/dist/access-surface-catalog.d.ts +16 -14
  55. package/dist/access-surface-catalog.js +41 -41
  56. package/dist/access-wearables-meetings-surface.d.ts +6 -5
  57. package/dist/action-confidence.d.ts +1 -1
  58. package/dist/active-memory-bridge.d.ts +1 -1
  59. package/dist/active-recall.d.ts +1 -1
  60. package/dist/active-recall.js +6 -5
  61. package/dist/active-recall.js.map +1 -1
  62. package/dist/activity/digest.d.ts +1 -1
  63. package/dist/adapters/index.js +4 -4
  64. package/dist/adapters/registry.js +2 -2
  65. package/dist/ambient-provenance.d.ts +1 -1
  66. package/dist/artifact-search.d.ts +1 -1
  67. package/dist/{auto-sync-RP4C6ZPF.js → auto-sync-D6BAPIJV.js} +5 -5
  68. package/dist/background-generation-config.d.ts +1 -1
  69. package/dist/background-generation-config.js +3 -1
  70. package/dist/background-generation.d.ts +1 -1
  71. package/dist/behavior-learner.d.ts +1 -1
  72. package/dist/behavior-signals.d.ts +1 -1
  73. package/dist/bootstrap.d.ts +13 -12
  74. package/dist/briefing-window.d.ts +2 -2
  75. package/dist/briefing.d.ts +2 -2
  76. package/dist/briefing.js +16 -16
  77. package/dist/buffer-surprise-report.d.ts +1 -1
  78. package/dist/buffer-turn-helpers.d.ts +1 -1
  79. package/dist/buffer.d.ts +2 -2
  80. package/dist/buffer.js +5 -5
  81. package/dist/bulk-import/index.d.ts +3 -3
  82. package/dist/calibration.d.ts +3 -2
  83. package/dist/calibration.js +2 -2
  84. package/dist/capabilities.d.ts +1 -1
  85. package/dist/{catalog-CW87xGx8.d.ts → catalog-BHXkBVhg.d.ts} +1 -1
  86. package/dist/causal-behavior.d.ts +1 -1
  87. package/dist/causal-consolidation.d.ts +1 -1
  88. package/dist/causal-consolidation.js +20 -19
  89. package/dist/causal-consolidation.js.map +1 -1
  90. package/dist/causal-trajectory-graph.d.ts +1 -1
  91. package/dist/{chunk-B36GUU6T.js → chunk-23HFXQ5J.js} +36 -3
  92. package/dist/chunk-23HFXQ5J.js.map +1 -0
  93. package/dist/{chunk-YFTNZMGR.js → chunk-27NO2KVB.js} +31 -8
  94. package/dist/chunk-27NO2KVB.js.map +1 -0
  95. package/dist/{chunk-T32B72QX.js → chunk-2SKMZUOW.js} +2 -2
  96. package/dist/{chunk-VHOSM5G4.js → chunk-2SNCQHJZ.js} +2 -2
  97. package/dist/{chunk-VV4ZVUE6.js → chunk-3QEVOQF5.js} +2 -2
  98. package/dist/{chunk-3N3PBBEH.js → chunk-3XPN7AVY.js} +2 -2
  99. package/dist/{chunk-XN6XT6GR.js → chunk-46Z3VGWF.js} +2 -2
  100. package/dist/{chunk-2PTNJTBE.js → chunk-4CMXI55L.js} +2 -2
  101. package/dist/{chunk-2MT4ADLQ.js → chunk-5LYSEZOF.js} +18 -9
  102. package/dist/chunk-5LYSEZOF.js.map +1 -0
  103. package/dist/{chunk-XWLLFKHM.js → chunk-62HFZNCJ.js} +19 -12
  104. package/dist/chunk-62HFZNCJ.js.map +1 -0
  105. package/dist/{chunk-VELCIWJZ.js → chunk-6L2II3KS.js} +22 -11
  106. package/dist/chunk-6L2II3KS.js.map +1 -0
  107. package/dist/{chunk-A6CKMIPK.js → chunk-7D6SER6A.js} +8 -8
  108. package/dist/{chunk-4B3HBIFX.js → chunk-7Z54NXVS.js} +2 -2
  109. package/dist/{chunk-X2NFFBTO.js → chunk-A7GQBJP5.js} +4 -4
  110. package/dist/{chunk-ACY4ZPF7.js → chunk-AEOOGXMQ.js} +10 -5
  111. package/dist/chunk-AEOOGXMQ.js.map +1 -0
  112. package/dist/{chunk-NWMUSKED.js → chunk-BGRTZOJB.js} +3 -3
  113. package/dist/{chunk-ZEGL7YCC.js → chunk-BXIJSPCL.js} +2 -2
  114. package/dist/{chunk-MLWMR2GE.js → chunk-BYQX4IOG.js} +2 -2
  115. package/dist/{chunk-ULDBGA5W.js → chunk-C5R73BON.js} +2 -2
  116. package/dist/{chunk-BD7JTBYP.js → chunk-D7MAYFQP.js} +2 -2
  117. package/dist/{chunk-V6G2PSXA.js → chunk-DAZANIYU.js} +251 -297
  118. package/dist/chunk-DAZANIYU.js.map +1 -0
  119. package/dist/{chunk-BRZWWUCJ.js → chunk-DFVSJFHK.js} +2 -2
  120. package/dist/{chunk-DPMTLJCT.js → chunk-ES5BUPYB.js} +2 -2
  121. package/dist/{chunk-MVAQ2WM3.js → chunk-G2XZFGYN.js} +6 -2
  122. package/dist/chunk-G2XZFGYN.js.map +1 -0
  123. package/dist/{chunk-TNSCIPBQ.js → chunk-G6NQ3L4T.js} +2 -2
  124. package/dist/{chunk-5N4MZLEH.js → chunk-GO5LOHCD.js} +2 -2
  125. package/dist/{chunk-AECJY3GJ.js → chunk-GSSDHAYH.js} +2 -2
  126. package/dist/{chunk-JA2QJOAX.js → chunk-HJUP3K6L.js} +2 -2
  127. package/dist/{chunk-ZKZFFWLV.js → chunk-ICNJ6J46.js} +2 -2
  128. package/dist/{chunk-6EHM2AV7.js → chunk-IMBQFHRV.js} +2 -2
  129. package/dist/{chunk-6PRY6CLC.js → chunk-IOPIGX7Y.js} +1 -1
  130. package/dist/{chunk-TRHBQVVO.js → chunk-IS2IDFJP.js} +14 -14
  131. package/dist/{chunk-R4VAUNNC.js → chunk-J4WGTN2N.js} +2 -2
  132. package/dist/{chunk-JPOX2AJB.js → chunk-J7FVMLBR.js} +2 -2
  133. package/dist/{chunk-BYZKLEWG.js → chunk-JAJIMTFB.js} +6 -6
  134. package/dist/{chunk-OKO57IXB.js → chunk-JOP7W24J.js} +11 -11
  135. package/dist/{chunk-YUW66UAH.js → chunk-JUDT33RX.js} +2 -2
  136. package/dist/{chunk-QHT7MOUF.js → chunk-K4A6UVPB.js} +22 -11
  137. package/dist/chunk-K4A6UVPB.js.map +1 -0
  138. package/dist/{chunk-UQNYPK7G.js → chunk-K4JKAXMO.js} +2 -2
  139. package/dist/{chunk-BV4ZKIZH.js → chunk-K75A5XWU.js} +3 -2
  140. package/dist/{chunk-3CBI2ZSA.js → chunk-KG2OOAFF.js} +20 -12
  141. package/dist/chunk-KG2OOAFF.js.map +1 -0
  142. package/dist/{chunk-M6HBPLBA.js → chunk-KOTG3RXE.js} +2 -2
  143. package/dist/{chunk-CWTCMZGE.js → chunk-KTOXQMW3.js} +119 -3
  144. package/dist/chunk-KTOXQMW3.js.map +1 -0
  145. package/dist/{chunk-OB3XMWX5.js → chunk-KVO2BTA4.js} +2 -2
  146. package/dist/{chunk-CBFYCDYO.js → chunk-KY236SP5.js} +3 -3
  147. package/dist/{chunk-4BCHFSC7.js → chunk-LFVZD5EC.js} +3 -3
  148. package/dist/{chunk-GGAXFTNH.js → chunk-LKFVVN7R.js} +2 -2
  149. package/dist/{chunk-IYKZJVL5.js → chunk-MDIEES23.js} +1 -1
  150. package/dist/chunk-MDIEES23.js.map +1 -0
  151. package/dist/{chunk-4RX5O34R.js → chunk-MJC7UKH7.js} +2 -2
  152. package/dist/{chunk-7S53BPTU.js → chunk-MVG3KXON.js} +69 -22
  153. package/dist/chunk-MVG3KXON.js.map +1 -0
  154. package/dist/chunk-NETQXOPY.js +221 -0
  155. package/dist/chunk-NETQXOPY.js.map +1 -0
  156. package/dist/{chunk-UZZ7SQT3.js → chunk-NVVZPBKI.js} +2 -2
  157. package/dist/{chunk-BLDBT6HZ.js → chunk-PJRKLB4Z.js} +18 -2
  158. package/dist/chunk-PJRKLB4Z.js.map +1 -0
  159. package/dist/{chunk-TTSJ7WUC.js → chunk-PKUJNICO.js} +2 -2
  160. package/dist/{chunk-QMWKENNK.js → chunk-Q4AUIFUA.js} +4 -4
  161. package/dist/{chunk-G43PMSME.js → chunk-QE6YVNP5.js} +7 -7
  162. package/dist/{chunk-WKDFJXW5.js → chunk-QM2SPLKQ.js} +1 -1
  163. package/dist/chunk-QM2SPLKQ.js.map +1 -0
  164. package/dist/{chunk-GT4ZHOKT.js → chunk-QPVNK2VE.js} +2 -2
  165. package/dist/{chunk-K5DA5TRG.js → chunk-QS5Q5RBV.js} +2 -2
  166. package/dist/{chunk-BX4EOMKT.js → chunk-RDLPFM7I.js} +2 -2
  167. package/dist/{chunk-EY5JAWZC.js → chunk-RJQAP333.js} +2 -2
  168. package/dist/{chunk-5AERZWJD.js → chunk-RLU2Y5GV.js} +4 -4
  169. package/dist/chunk-RLU2Y5GV.js.map +1 -0
  170. package/dist/{chunk-2OGTN37H.js → chunk-ROEFLU37.js} +4 -4
  171. package/dist/{chunk-62QIQEUC.js → chunk-SFHLQPBF.js} +25 -25
  172. package/dist/chunk-SK7D34OL.js +68 -0
  173. package/dist/chunk-SK7D34OL.js.map +1 -0
  174. package/dist/{chunk-HVS7TH2Y.js → chunk-SUEOG2S4.js} +2 -2
  175. package/dist/{chunk-74AHCL56.js → chunk-TEMKBSV6.js} +2 -2
  176. package/dist/{chunk-LQNRVPTV.js → chunk-THTF2W7M.js} +151 -118
  177. package/dist/chunk-THTF2W7M.js.map +1 -0
  178. package/dist/{chunk-KDFDXEXZ.js → chunk-TO36VPZI.js} +2 -2
  179. package/dist/{chunk-BJEJUOGM.js → chunk-TZ44E732.js} +44 -6
  180. package/dist/chunk-TZ44E732.js.map +1 -0
  181. package/dist/{chunk-JXN77SGO.js → chunk-U2VDCFXW.js} +1 -1
  182. package/dist/chunk-U2VDCFXW.js.map +1 -0
  183. package/dist/{chunk-3OYSIVOO.js → chunk-UZ6JYPJ6.js} +611 -289
  184. package/dist/chunk-UZ6JYPJ6.js.map +1 -0
  185. package/dist/{chunk-M3MYMWXG.js → chunk-V2ZA4YWE.js} +2 -2
  186. package/dist/{chunk-UIOIDW3L.js → chunk-VHKXRYQN.js} +2 -2
  187. package/dist/{chunk-GAS7KYC7.js → chunk-VKWFNPBH.js} +2 -2
  188. package/dist/{chunk-6H2G7RFT.js → chunk-VNQRRUNS.js} +11 -10
  189. package/dist/chunk-VNQRRUNS.js.map +1 -0
  190. package/dist/{chunk-XGRXQR6T.js → chunk-VQWBUPSJ.js} +2 -2
  191. package/dist/{chunk-TUKGXQ5T.js → chunk-VQYWKCDR.js} +2 -2
  192. package/dist/{chunk-PPQEP4OH.js → chunk-W23JARAQ.js} +2 -2
  193. package/dist/{chunk-YQNNHLCG.js → chunk-WPGR3RW4.js} +2 -2
  194. package/dist/{chunk-474DL7UB.js → chunk-WZYHPAG5.js} +3 -3
  195. package/dist/{chunk-5HYUUFMQ.js → chunk-XCPNH2MG.js} +259 -10
  196. package/dist/chunk-XCPNH2MG.js.map +1 -0
  197. package/dist/{chunk-GQQVEH6V.js → chunk-XM46Y66S.js} +2 -2
  198. package/dist/{chunk-JNSENHV5.js → chunk-YRIFXXMI.js} +3 -3
  199. package/dist/{chunk-TRLOFIQC.js → chunk-YTK5MVNF.js} +2 -2
  200. package/dist/{chunk-VMNCZ627.js → chunk-YTZN2UZO.js} +2 -2
  201. package/dist/chunk-Z4GUX2M6.js +94 -0
  202. package/dist/chunk-Z4GUX2M6.js.map +1 -0
  203. package/dist/{chunk-6ZMNTRU3.js → chunk-ZAEPD4C2.js} +2 -2
  204. package/dist/{chunk-KQW3YGEN.js → chunk-ZRMMXWYI.js} +2 -2
  205. package/dist/{chunk-P4ZAEYKG.js → chunk-ZX3AYNNV.js} +6 -3
  206. package/dist/chunk-ZX3AYNNV.js.map +1 -0
  207. package/dist/{chunk-MCRVQ5YQ.js → chunk-ZZCR2QYL.js} +2 -2
  208. package/dist/{cli-BNg-TAlz.d.ts → cli-BWri5-am.d.ts} +5 -5
  209. package/dist/cli.d.ts +18 -16
  210. package/dist/cli.js +80 -79
  211. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  212. package/dist/coding/export-okf-codegraph.js +15 -15
  213. package/dist/coding/pre-action-gate.d.ts +1 -1
  214. package/dist/compounding/engine.d.ts +2 -2
  215. package/dist/compounding/engine.js +16 -16
  216. package/dist/compounding/preference-consolidator.d.ts +1 -1
  217. package/dist/compression-optimizer.d.ts +1 -1
  218. package/dist/config.d.ts +1 -1
  219. package/dist/config.js +6 -5
  220. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  221. package/dist/connectors/codex-materialize-runner.js +16 -16
  222. package/dist/connectors/codex-materialize.d.ts +1 -1
  223. package/dist/connectors/index.d.ts +1 -1
  224. package/dist/connectors/index.js +16 -16
  225. package/dist/consolidation-provenance-check.d.ts +2 -2
  226. package/dist/consolidation-undo.d.ts +2 -2
  227. package/dist/contradiction/index.d.ts +6 -5
  228. package/dist/converge-config.d.ts +1 -1
  229. package/dist/convergence-refresh.d.ts +2 -2
  230. package/dist/convergence-refresh.js +18 -18
  231. package/dist/conversation-index/backend.d.ts +1 -1
  232. package/dist/conversation-index/chunker.d.ts +1 -1
  233. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  234. package/dist/conversation-index/indexer.d.ts +1 -1
  235. package/dist/conversation-index/search.d.ts +1 -1
  236. package/dist/corpus-watermark.d.ts +1 -1
  237. package/dist/corpus-watermark.js +18 -18
  238. package/dist/cross-lingual-recall.d.ts +1 -1
  239. package/dist/day-summary.d.ts +1 -1
  240. package/dist/deep-recall-http-glue.d.ts +16 -14
  241. package/dist/deep-recall-http-glue.js +2 -2
  242. package/dist/deep-recall-mcp-tools.d.ts +16 -14
  243. package/dist/deep-recall-policy-llm.d.ts +4 -3
  244. package/dist/deep-recall-policy-llm.js +3 -3
  245. package/dist/deep-recall-seeds.d.ts +1 -1
  246. package/dist/delinearize.d.ts +1 -1
  247. package/dist/dependency-propagation-config.d.ts +1 -1
  248. package/dist/{dependency-propagation-delivery-Cq1ekOwV.d.ts → dependency-propagation-delivery-ueZlKTQB.d.ts} +1 -1
  249. package/dist/direct-answer-wiring.d.ts +1 -1
  250. package/dist/direct-answer.d.ts +1 -1
  251. package/dist/embedding-fallback.d.ts +1 -1
  252. package/dist/enrichment/index.d.ts +1 -1
  253. package/dist/entity-origin-fields.d.ts +1 -1
  254. package/dist/entity-retrieval.d.ts +2 -2
  255. package/dist/entity-retrieval.js +16 -16
  256. package/dist/entity-schema.d.ts +1 -1
  257. package/dist/episodic-context.d.ts +1 -1
  258. package/dist/eval-trajectory-contracts.d.ts +1 -1
  259. package/dist/eval-trajectory-store.d.ts +1 -1
  260. package/dist/eval-trajectory.d.ts +1 -1
  261. package/dist/explicit-capture.d.ts +13 -12
  262. package/dist/external-wiki-access.d.ts +16 -14
  263. package/dist/external-wiki-access.js +40 -40
  264. package/dist/external-wiki-collection-registration.d.ts +1 -1
  265. package/dist/external-wiki-collection.d.ts +1 -1
  266. package/dist/external-wiki-mcp-tools.d.ts +16 -14
  267. package/dist/extraction-error-classification.d.ts +14 -3
  268. package/dist/extraction-error-classification.js +5 -3
  269. package/dist/extraction-faithfulness.d.ts +4 -3
  270. package/dist/extraction-faithfulness.js +3 -3
  271. package/dist/extraction-judge-telemetry.d.ts +4 -3
  272. package/dist/extraction-judge-training.d.ts +4 -3
  273. package/dist/extraction-judge.d.ts +4 -3
  274. package/dist/extraction-judge.js +3 -3
  275. package/dist/extraction-liveness.d.ts +1 -1
  276. package/dist/extraction-normalization.d.ts +1 -1
  277. package/dist/extraction-prompt.d.ts +1 -1
  278. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  279. package/dist/extraction-source-grounding.d.ts +1 -1
  280. package/dist/extraction-span-config.d.ts +1 -1
  281. package/dist/extraction-span-materialize.d.ts +1 -1
  282. package/dist/extraction.d.ts +4 -4
  283. package/dist/extraction.js +26 -24
  284. package/dist/fallback-llm-codex-subscription.d.ts +52 -7
  285. package/dist/fallback-llm-codex-subscription.js +17 -1
  286. package/dist/fallback-llm.d.ts +25 -28
  287. package/dist/fallback-llm.js +4 -3
  288. package/dist/{generic-recall-paths-BcySh_f9.d.ts → generic-recall-paths-CpyVmA88.d.ts} +1 -1
  289. package/dist/graph-append-error.d.ts +1 -1
  290. package/dist/graph-dashboard-diff.d.ts +1 -1
  291. package/dist/graph-dashboard-key.d.ts +1 -1
  292. package/dist/graph-dashboard-parser.d.ts +1 -1
  293. package/dist/graph-edge-reinforcement.d.ts +1 -1
  294. package/dist/graph-jsonl.d.ts +1 -1
  295. package/dist/graph-path-reconstruction.d.ts +1 -1
  296. package/dist/graph-path-scoring.d.ts +1 -1
  297. package/dist/graph-snapshot.d.ts +1 -1
  298. package/dist/graph.d.ts +1 -1
  299. package/dist/harmonic-retrieval.js +1 -1
  300. package/dist/importance.d.ts +1 -1
  301. package/dist/importers/index.d.ts +1 -1
  302. package/dist/importers/test-utils.d.ts +1 -1
  303. package/dist/in-flight-reads.d.ts +1 -1
  304. package/dist/{index-DWOb4wz9.d.ts → index-BvUA4S7M.d.ts} +3 -3
  305. package/dist/index.d.ts +80 -40
  306. package/dist/index.js +140 -115
  307. package/dist/intent.d.ts +1 -1
  308. package/dist/lcm/engine.d.ts +1 -1
  309. package/dist/lcm/engine.js +2 -2
  310. package/dist/lcm/index.d.ts +1 -1
  311. package/dist/lcm/index.js +7 -7
  312. package/dist/lcm/tools.d.ts +1 -1
  313. package/dist/lifecycle.d.ts +1 -1
  314. package/dist/live-connectors-runner.d.ts +1 -1
  315. package/dist/local-llm-BsJGulur.d.ts +247 -0
  316. package/dist/local-llm-config.d.ts +4 -1
  317. package/dist/local-llm-config.js +4 -2
  318. package/dist/local-llm-helpers.d.ts +18 -69
  319. package/dist/local-llm-helpers.js +1 -1
  320. package/dist/local-llm.d.ts +3 -170
  321. package/dist/local-llm.js +2 -2
  322. package/dist/local-model-endpoint.d.ts +1 -1
  323. package/dist/location/index.d.ts +3 -3
  324. package/dist/location/index.js +18 -18
  325. package/dist/maintenance/memory-governance.d.ts +1 -1
  326. package/dist/maintenance/memory-governance.js +16 -16
  327. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  328. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +16 -16
  329. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  330. package/dist/maintenance/rebuild-memory-projection.js +17 -17
  331. package/dist/{maintenance-CW9wCzMP.d.ts → maintenance-CYubtIRr.d.ts} +9 -3
  332. package/dist/mcp-memory-inspector-app.d.ts +16 -14
  333. package/dist/memory-action-policy.d.ts +1 -1
  334. package/dist/memory-cache.d.ts +1 -1
  335. package/dist/memory-controller.d.ts +1 -1
  336. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  337. package/dist/memory-projection-store.d.ts +1 -1
  338. package/dist/memory-provenance.d.ts +1 -1
  339. package/dist/memory-snapshot.d.ts +1 -1
  340. package/dist/memory-subject-cli.d.ts +16 -14
  341. package/dist/memory-subject.d.ts +16 -14
  342. package/dist/memory-worth-outcomes.d.ts +2 -2
  343. package/dist/models-json.d.ts +1 -1
  344. package/dist/namespaces/migrate.d.ts +3 -3
  345. package/dist/namespaces/migrate.js +17 -17
  346. package/dist/namespaces/principal.d.ts +1 -1
  347. package/dist/namespaces/search.d.ts +12 -1
  348. package/dist/namespaces/search.js +9 -9
  349. package/dist/namespaces/storage.d.ts +3 -3
  350. package/dist/namespaces/storage.js +16 -16
  351. package/dist/native-knowledge.d.ts +1 -1
  352. package/dist/offline-sync-impression-drain.d.ts +1 -1
  353. package/dist/operator-doctor-corpus.d.ts +1 -1
  354. package/dist/operator-doctor-corpus.js +19 -19
  355. package/dist/operator-doctor-replica.d.ts +1 -1
  356. package/dist/operator-toolkit.d.ts +3 -3
  357. package/dist/operator-toolkit.js +30 -29
  358. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  359. package/dist/orchestration/maintenance.d.ts +4 -4
  360. package/dist/orchestration/maintenance.js +27 -27
  361. package/dist/{orchestrator-DocO0_hw.d.ts → orchestrator-BWDRJ_0d.d.ts} +37 -13
  362. package/dist/orchestrator.d.ts +13 -12
  363. package/dist/orchestrator.js +110 -106
  364. package/dist/patterns-cli.d.ts +1 -1
  365. package/dist/{pipeline-CiYcqqhl.d.ts → pipeline-7JMn2yMH.d.ts} +1 -1
  366. package/dist/policy-runtime.d.ts +1 -1
  367. package/dist/proactive-contention.d.ts +2 -2
  368. package/dist/provenance.d.ts +1 -1
  369. package/dist/{public-http-C0FoTiL_.d.ts → public-http-CJWs3mo9.d.ts} +1 -1
  370. package/dist/{qmd-qXD4vatU.d.ts → qmd-CxCH9G9m.d.ts} +2 -2
  371. package/dist/qmd-preflight.d.ts +2 -2
  372. package/dist/qmd-recall-cache.d.ts +1 -1
  373. package/dist/qmd.d.ts +2 -2
  374. package/dist/qmd.js +2 -2
  375. package/dist/recall-concurrency-config.d.ts +1 -1
  376. package/dist/recall-disclosure-escalation.d.ts +1 -1
  377. package/dist/recall-explain-renderer.d.ts +1 -1
  378. package/dist/recall-explain-renderer.js +3 -3
  379. package/dist/recall-memory-map.d.ts +1 -1
  380. package/dist/recall-navigate-access.d.ts +1 -1
  381. package/dist/recall-navigate-access.js +2 -2
  382. package/dist/recall-navigate-disclosure.d.ts +1 -1
  383. package/dist/recall-navigate-disclosure.js +1 -1
  384. package/dist/recall-navigate.d.ts +1 -1
  385. package/dist/recall-navigate.js +2 -2
  386. package/dist/recall-planner-llm.d.ts +3 -2
  387. package/dist/recall-planner-llm.js +4 -3
  388. package/dist/recall-planner-llm.js.map +1 -1
  389. package/dist/recall-state-view-admission.d.ts +13 -3
  390. package/dist/recall-state-view-admission.js +8 -8
  391. package/dist/recall-state-view-anchors.d.ts +85 -0
  392. package/dist/recall-state-view-anchors.js +21 -0
  393. package/dist/recall-state-view-anchors.js.map +1 -0
  394. package/dist/recall-state-view-inject.js +2 -2
  395. package/dist/recall-state-view-render.js +2 -2
  396. package/dist/recall-state-view-widen.js +2 -2
  397. package/dist/recall-state-view-wire.js +3 -3
  398. package/dist/recall-state-view.d.ts +38 -1
  399. package/dist/recall-state-view.js +11 -3
  400. package/dist/recall-state.d.ts +1 -1
  401. package/dist/recall-tag-filter.d.ts +1 -1
  402. package/dist/recall-timings.d.ts +1 -1
  403. package/dist/recall-xray-cli.d.ts +1 -1
  404. package/dist/recall-xray-cli.js +4 -4
  405. package/dist/recall-xray-renderer.d.ts +1 -1
  406. package/dist/recall-xray-renderer.js +3 -3
  407. package/dist/recall-xray.d.ts +1 -1
  408. package/dist/recall-xray.js +2 -2
  409. package/dist/reconcile/cursor.d.ts +1 -1
  410. package/dist/reconcile/manifest.d.ts +1 -1
  411. package/dist/reconcile/plan.d.ts +1 -1
  412. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  413. package/dist/replay/normalizers/claude.d.ts +1 -1
  414. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  415. package/dist/replay/normalizers/shared.d.ts +1 -1
  416. package/dist/replay/runner.d.ts +1 -1
  417. package/dist/replay/types.d.ts +1 -1
  418. package/dist/replica-divergence.d.ts +1 -1
  419. package/dist/replica-peers-config.d.ts +1 -1
  420. package/dist/resolve-auth-token.d.ts +1 -1
  421. package/dist/resume-bundles.js +7 -6
  422. package/dist/retrieval-agents.d.ts +2 -2
  423. package/dist/retrieval-tiers.d.ts +1 -1
  424. package/dist/routing/engine.d.ts +1 -1
  425. package/dist/routing/store.d.ts +1 -1
  426. package/dist/salvage-envelope.d.ts +1 -1
  427. package/dist/{scope-profiles-BT9rqC3w.d.ts → scope-profiles-BGAUqhBR.d.ts} +1 -1
  428. package/dist/search/embed-helper.d.ts +1 -1
  429. package/dist/search/factory.d.ts +1 -1
  430. package/dist/search/factory.js +8 -8
  431. package/dist/search/index.d.ts +1 -1
  432. package/dist/search/index.js +12 -12
  433. package/dist/search/lancedb-backend.d.ts +1 -1
  434. package/dist/search/lancedb-backend.js +2 -2
  435. package/dist/search/meilisearch-backend.d.ts +1 -1
  436. package/dist/search/meilisearch-backend.js +2 -2
  437. package/dist/search/noop-backend.d.ts +1 -1
  438. package/dist/search/orama-backend.d.ts +1 -1
  439. package/dist/search/orama-backend.js +2 -2
  440. package/dist/search/port.d.ts +2 -2
  441. package/dist/search/port.js +1 -1
  442. package/dist/search/remote-backend.d.ts +1 -1
  443. package/dist/search/remote-backend.js +2 -2
  444. package/dist/{semantic-consolidation-CmZi7thY.d.ts → semantic-consolidation-CCeRD9pV.d.ts} +1 -1
  445. package/dist/semantic-consolidation.d.ts +2 -2
  446. package/dist/semantic-consolidation.js +17 -17
  447. package/dist/semantic-rule-promotion.js +16 -16
  448. package/dist/semantic-rule-verifier.d.ts +1 -1
  449. package/dist/semantic-rule-verifier.js +16 -16
  450. package/dist/{service-CLkA7AQB.d.ts → service-BwpzRduk.d.ts} +2 -2
  451. package/dist/session-observer-bands.d.ts +1 -1
  452. package/dist/session-observer-state.d.ts +1 -1
  453. package/dist/shared-context/manager.d.ts +1 -1
  454. package/dist/signal.d.ts +1 -1
  455. package/dist/source-agent-qualifier.d.ts +1 -1
  456. package/dist/source-agent-qualifier.js +19 -19
  457. package/dist/standup/build.js +16 -16
  458. package/dist/{storage-wvX01lht.d.ts → storage-BprAGBG0.d.ts} +2 -1
  459. package/dist/storage.d.ts +2 -2
  460. package/dist/storage.js +15 -15
  461. package/dist/subject-config.d.ts +1 -1
  462. package/dist/summarizer.d.ts +1 -1
  463. package/dist/summarizer.js +5 -5
  464. package/dist/summary-snapshot.d.ts +1 -1
  465. package/dist/support-passport/index.d.ts +18 -17
  466. package/dist/support-passport/index.js +42 -42
  467. package/dist/task-llm-config.d.ts +16 -0
  468. package/dist/task-llm-config.js +12 -0
  469. package/dist/task-llm-config.js.map +1 -0
  470. package/dist/temporal-supersession.d.ts +2 -2
  471. package/dist/temporal-timeline-recall.d.ts +1 -1
  472. package/dist/temporal-validity.d.ts +1 -1
  473. package/dist/threading.d.ts +1 -1
  474. package/dist/tier-migration.d.ts +2 -2
  475. package/dist/tier-routing.d.ts +1 -1
  476. package/dist/topics.d.ts +1 -1
  477. package/dist/transcript.d.ts +1 -1
  478. package/dist/transfer/export-okf.d.ts +1 -1
  479. package/dist/transfer/export-okf.js +16 -16
  480. package/dist/trust-score-stage.d.ts +1 -1
  481. package/dist/trust-score.d.ts +1 -1
  482. package/dist/{types-Cyr32ABj.d.ts → types-nJV23pa3.d.ts} +1 -1
  483. package/dist/types.d.ts +1 -1
  484. package/dist/types.js +1 -1
  485. package/dist/utility-runtime.d.ts +1 -1
  486. package/dist/verified-recall.js +16 -16
  487. package/dist/who-knows-cli.d.ts +16 -14
  488. package/dist/who-knows-cli.js +17 -17
  489. package/dist/who-knows.d.ts +16 -14
  490. package/dist/who-knows.js +16 -16
  491. package/dist/write-envelope.d.ts +1 -1
  492. package/package.json +2 -2
  493. package/src/access-category-alias.test.ts +93 -0
  494. package/src/access-offline-manifest.ts +52 -2
  495. package/src/access-schema.ts +9 -4
  496. package/src/activity/config.test.ts +61 -0
  497. package/src/activity/config.ts +40 -1
  498. package/src/activity/timeline/analysis-provider.ts +8 -2
  499. package/src/activity/timeline/analysis-run.test.ts +82 -0
  500. package/src/activity/timeline/publish-cli.test.ts +30 -0
  501. package/src/activity/timeline/publish-cli.ts +7 -0
  502. package/src/activity/timeline/query.ts +8 -1
  503. package/src/activity/timeline/regenerate.test.ts +82 -2
  504. package/src/activity/timeline/regenerate.ts +7 -1
  505. package/src/activity/vault-frontmatter.test.ts +99 -1
  506. package/src/activity/vault-frontmatter.ts +131 -0
  507. package/src/activity/vault-publish.ts +6 -0
  508. package/src/activity/vault-publisher.test.ts +172 -0
  509. package/src/activity/vault-publisher.ts +69 -15
  510. package/src/activity/vault-region.test.ts +7 -2
  511. package/src/activity/vault-region.ts +7 -3
  512. package/src/background-generation-config.ts +32 -6
  513. package/src/background-generation.test.ts +10 -1
  514. package/src/cli/timeline-publish-commands.ts +9 -0
  515. package/src/config.test.ts +170 -43
  516. package/src/config.ts +17 -5
  517. package/src/extraction-error-classification.ts +36 -1
  518. package/src/extraction-timeout.test.ts +110 -1
  519. package/src/extraction.test.ts +19 -1
  520. package/src/extraction.ts +23 -21
  521. package/src/fallback-llm-codex-subscription.ts +193 -7
  522. package/src/fallback-llm-parse-failure.test.ts +156 -0
  523. package/src/fallback-llm.test.ts +58 -0
  524. package/src/fallback-llm.ts +187 -186
  525. package/src/index.ts +1 -0
  526. package/src/local-llm-config.ts +11 -10
  527. package/src/local-llm-headers-timeout.test.ts +30 -0
  528. package/src/local-llm-helpers.ts +28 -0
  529. package/src/local-llm.ts +8 -19
  530. package/src/namespaces/search.test.ts +51 -1
  531. package/src/namespaces/search.ts +48 -3
  532. package/src/orchestration/extraction-persist-promotion.test.ts +228 -2
  533. package/src/orchestration/extraction-persist-promotion.ts +17 -14
  534. package/src/orchestration/orchestrator-helpers.test.ts +104 -0
  535. package/src/orchestration/orchestrator-init.ts +366 -106
  536. package/src/orchestration/recall-internal.ts +85 -74
  537. package/src/orchestration/recall-rerank-coordinator.ts +41 -4
  538. package/src/orchestration/recall-search-pipeline.ts +25 -18
  539. package/src/orchestration/recall-state-view-pipeline.test.ts +89 -0
  540. package/src/orchestration/semantic-merge-promotion-payload.ts +62 -6
  541. package/src/orchestration/startup-collection-checks.ts +85 -0
  542. package/src/orchestrator-flush.test.ts +7 -0
  543. package/src/orchestrator-init.test.ts +1539 -0
  544. package/src/orchestrator.ts +7 -0
  545. package/src/qmd.ts +21 -10
  546. package/src/recall-rerank-coordinator.test.ts +153 -0
  547. package/src/recall-state-view-admission.ts +11 -1
  548. package/src/recall-state-view-anchors.ts +163 -0
  549. package/src/recall-state-view-cron-intent.test.ts +268 -0
  550. package/src/recall-state-view-widen.test.ts +14 -5
  551. package/src/recall-state-view-widen.ts +29 -8
  552. package/src/recall-state-view-zero-diff.test.ts +30 -0
  553. package/src/recall-state-view.test.ts +161 -0
  554. package/src/recall-state-view.ts +211 -37
  555. package/src/reconcile-identity-cache.test.ts +82 -1
  556. package/src/search/port.ts +1 -1
  557. package/src/storage/cas-revision-store.test.ts +4 -0
  558. package/src/storage/cas-revision-store.ts +104 -12
  559. package/src/storage-frontmatter-cas.test.ts +19 -17
  560. package/src/summarizer.ts +5 -1
  561. package/src/task-llm-config.test.ts +124 -0
  562. package/src/task-llm-config.ts +88 -0
  563. package/src/testing/subjects/startup-discovery-lifecycle.test.ts +273 -0
  564. package/src/trust-score-recall-paths.test.ts +1 -1
  565. package/src/types.ts +1 -0
  566. package/dist/chunk-255PC37A.js +0 -120
  567. package/dist/chunk-255PC37A.js.map +0 -1
  568. package/dist/chunk-2MT4ADLQ.js.map +0 -1
  569. package/dist/chunk-3CBI2ZSA.js.map +0 -1
  570. package/dist/chunk-3OYSIVOO.js.map +0 -1
  571. package/dist/chunk-5AERZWJD.js.map +0 -1
  572. package/dist/chunk-5HYUUFMQ.js.map +0 -1
  573. package/dist/chunk-6H2G7RFT.js.map +0 -1
  574. package/dist/chunk-7S53BPTU.js.map +0 -1
  575. package/dist/chunk-ACY4ZPF7.js.map +0 -1
  576. package/dist/chunk-B36GUU6T.js.map +0 -1
  577. package/dist/chunk-BJEJUOGM.js.map +0 -1
  578. package/dist/chunk-BLDBT6HZ.js.map +0 -1
  579. package/dist/chunk-CWTCMZGE.js.map +0 -1
  580. package/dist/chunk-IYKZJVL5.js.map +0 -1
  581. package/dist/chunk-JXN77SGO.js.map +0 -1
  582. package/dist/chunk-LQNRVPTV.js.map +0 -1
  583. package/dist/chunk-MVAQ2WM3.js.map +0 -1
  584. package/dist/chunk-P4ZAEYKG.js.map +0 -1
  585. package/dist/chunk-QHT7MOUF.js.map +0 -1
  586. package/dist/chunk-V6G2PSXA.js.map +0 -1
  587. package/dist/chunk-VELCIWJZ.js.map +0 -1
  588. package/dist/chunk-WKDFJXW5.js.map +0 -1
  589. package/dist/chunk-XWLLFKHM.js.map +0 -1
  590. package/dist/chunk-YFTNZMGR.js.map +0 -1
  591. /package/dist/{auto-sync-RP4C6ZPF.js.map → auto-sync-D6BAPIJV.js.map} +0 -0
  592. /package/dist/{chunk-T32B72QX.js.map → chunk-2SKMZUOW.js.map} +0 -0
  593. /package/dist/{chunk-VHOSM5G4.js.map → chunk-2SNCQHJZ.js.map} +0 -0
  594. /package/dist/{chunk-VV4ZVUE6.js.map → chunk-3QEVOQF5.js.map} +0 -0
  595. /package/dist/{chunk-3N3PBBEH.js.map → chunk-3XPN7AVY.js.map} +0 -0
  596. /package/dist/{chunk-XN6XT6GR.js.map → chunk-46Z3VGWF.js.map} +0 -0
  597. /package/dist/{chunk-2PTNJTBE.js.map → chunk-4CMXI55L.js.map} +0 -0
  598. /package/dist/{chunk-A6CKMIPK.js.map → chunk-7D6SER6A.js.map} +0 -0
  599. /package/dist/{chunk-4B3HBIFX.js.map → chunk-7Z54NXVS.js.map} +0 -0
  600. /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
  601. /package/dist/{chunk-NWMUSKED.js.map → chunk-BGRTZOJB.js.map} +0 -0
  602. /package/dist/{chunk-ZEGL7YCC.js.map → chunk-BXIJSPCL.js.map} +0 -0
  603. /package/dist/{chunk-MLWMR2GE.js.map → chunk-BYQX4IOG.js.map} +0 -0
  604. /package/dist/{chunk-ULDBGA5W.js.map → chunk-C5R73BON.js.map} +0 -0
  605. /package/dist/{chunk-BD7JTBYP.js.map → chunk-D7MAYFQP.js.map} +0 -0
  606. /package/dist/{chunk-BRZWWUCJ.js.map → chunk-DFVSJFHK.js.map} +0 -0
  607. /package/dist/{chunk-DPMTLJCT.js.map → chunk-ES5BUPYB.js.map} +0 -0
  608. /package/dist/{chunk-TNSCIPBQ.js.map → chunk-G6NQ3L4T.js.map} +0 -0
  609. /package/dist/{chunk-5N4MZLEH.js.map → chunk-GO5LOHCD.js.map} +0 -0
  610. /package/dist/{chunk-AECJY3GJ.js.map → chunk-GSSDHAYH.js.map} +0 -0
  611. /package/dist/{chunk-JA2QJOAX.js.map → chunk-HJUP3K6L.js.map} +0 -0
  612. /package/dist/{chunk-ZKZFFWLV.js.map → chunk-ICNJ6J46.js.map} +0 -0
  613. /package/dist/{chunk-6EHM2AV7.js.map → chunk-IMBQFHRV.js.map} +0 -0
  614. /package/dist/{chunk-6PRY6CLC.js.map → chunk-IOPIGX7Y.js.map} +0 -0
  615. /package/dist/{chunk-TRHBQVVO.js.map → chunk-IS2IDFJP.js.map} +0 -0
  616. /package/dist/{chunk-R4VAUNNC.js.map → chunk-J4WGTN2N.js.map} +0 -0
  617. /package/dist/{chunk-JPOX2AJB.js.map → chunk-J7FVMLBR.js.map} +0 -0
  618. /package/dist/{chunk-BYZKLEWG.js.map → chunk-JAJIMTFB.js.map} +0 -0
  619. /package/dist/{chunk-OKO57IXB.js.map → chunk-JOP7W24J.js.map} +0 -0
  620. /package/dist/{chunk-YUW66UAH.js.map → chunk-JUDT33RX.js.map} +0 -0
  621. /package/dist/{chunk-UQNYPK7G.js.map → chunk-K4JKAXMO.js.map} +0 -0
  622. /package/dist/{chunk-BV4ZKIZH.js.map → chunk-K75A5XWU.js.map} +0 -0
  623. /package/dist/{chunk-M6HBPLBA.js.map → chunk-KOTG3RXE.js.map} +0 -0
  624. /package/dist/{chunk-OB3XMWX5.js.map → chunk-KVO2BTA4.js.map} +0 -0
  625. /package/dist/{chunk-CBFYCDYO.js.map → chunk-KY236SP5.js.map} +0 -0
  626. /package/dist/{chunk-4BCHFSC7.js.map → chunk-LFVZD5EC.js.map} +0 -0
  627. /package/dist/{chunk-GGAXFTNH.js.map → chunk-LKFVVN7R.js.map} +0 -0
  628. /package/dist/{chunk-4RX5O34R.js.map → chunk-MJC7UKH7.js.map} +0 -0
  629. /package/dist/{chunk-UZZ7SQT3.js.map → chunk-NVVZPBKI.js.map} +0 -0
  630. /package/dist/{chunk-TTSJ7WUC.js.map → chunk-PKUJNICO.js.map} +0 -0
  631. /package/dist/{chunk-QMWKENNK.js.map → chunk-Q4AUIFUA.js.map} +0 -0
  632. /package/dist/{chunk-G43PMSME.js.map → chunk-QE6YVNP5.js.map} +0 -0
  633. /package/dist/{chunk-GT4ZHOKT.js.map → chunk-QPVNK2VE.js.map} +0 -0
  634. /package/dist/{chunk-K5DA5TRG.js.map → chunk-QS5Q5RBV.js.map} +0 -0
  635. /package/dist/{chunk-BX4EOMKT.js.map → chunk-RDLPFM7I.js.map} +0 -0
  636. /package/dist/{chunk-EY5JAWZC.js.map → chunk-RJQAP333.js.map} +0 -0
  637. /package/dist/{chunk-2OGTN37H.js.map → chunk-ROEFLU37.js.map} +0 -0
  638. /package/dist/{chunk-62QIQEUC.js.map → chunk-SFHLQPBF.js.map} +0 -0
  639. /package/dist/{chunk-HVS7TH2Y.js.map → chunk-SUEOG2S4.js.map} +0 -0
  640. /package/dist/{chunk-74AHCL56.js.map → chunk-TEMKBSV6.js.map} +0 -0
  641. /package/dist/{chunk-KDFDXEXZ.js.map → chunk-TO36VPZI.js.map} +0 -0
  642. /package/dist/{chunk-M3MYMWXG.js.map → chunk-V2ZA4YWE.js.map} +0 -0
  643. /package/dist/{chunk-UIOIDW3L.js.map → chunk-VHKXRYQN.js.map} +0 -0
  644. /package/dist/{chunk-GAS7KYC7.js.map → chunk-VKWFNPBH.js.map} +0 -0
  645. /package/dist/{chunk-XGRXQR6T.js.map → chunk-VQWBUPSJ.js.map} +0 -0
  646. /package/dist/{chunk-TUKGXQ5T.js.map → chunk-VQYWKCDR.js.map} +0 -0
  647. /package/dist/{chunk-PPQEP4OH.js.map → chunk-W23JARAQ.js.map} +0 -0
  648. /package/dist/{chunk-YQNNHLCG.js.map → chunk-WPGR3RW4.js.map} +0 -0
  649. /package/dist/{chunk-474DL7UB.js.map → chunk-WZYHPAG5.js.map} +0 -0
  650. /package/dist/{chunk-GQQVEH6V.js.map → chunk-XM46Y66S.js.map} +0 -0
  651. /package/dist/{chunk-JNSENHV5.js.map → chunk-YRIFXXMI.js.map} +0 -0
  652. /package/dist/{chunk-TRLOFIQC.js.map → chunk-YTK5MVNF.js.map} +0 -0
  653. /package/dist/{chunk-VMNCZ627.js.map → chunk-YTZN2UZO.js.map} +0 -0
  654. /package/dist/{chunk-6ZMNTRU3.js.map → chunk-ZAEPD4C2.js.map} +0 -0
  655. /package/dist/{chunk-KQW3YGEN.js.map → chunk-ZRMMXWYI.js.map} +0 -0
  656. /package/dist/{chunk-MCRVQ5YQ.js.map → chunk-ZZCR2QYL.js.map} +0 -0
@@ -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());
@@ -413,6 +412,88 @@ test("listPersistedTimelineDates lists only valid day files", async () => {
413
412
  }
414
413
  });
415
414
 
415
+ test("a timezone change invalidates the cached day and re-analyzes (issue #2891)", async () => {
416
+ await withStore(async (store, memoryDir) => {
417
+ store.insertSnapshot(snapshot());
418
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
419
+ const analysis = parseActivityConfig({
420
+ timeline: { analysis: { enabled: true, provider: "openai", model: "gpt-test" } },
421
+ }).timeline.analysis;
422
+ const first = await regenerateTimelineDay({
423
+ date: DATE,
424
+ timezone: TZ,
425
+ memoryDir,
426
+ store,
427
+ timelineEnabled: true,
428
+ analysis,
429
+ deps: { remoteLlm: remote.remoteLlm },
430
+ });
431
+ assert.equal(first.status, "ok");
432
+ assert.equal(remote.calls, 1);
433
+ const sameTz = await regenerateTimelineDay({
434
+ date: DATE,
435
+ timezone: TZ,
436
+ memoryDir,
437
+ store,
438
+ timelineEnabled: true,
439
+ analysis,
440
+ deps: { remoteLlm: remote.remoteLlm },
441
+ });
442
+ assert.equal(sameTz.written, false);
443
+ assert.equal(remote.calls, 1);
444
+ const shifted = await regenerateTimelineDay({
445
+ date: DATE,
446
+ timezone: "America/New_York",
447
+ memoryDir,
448
+ store,
449
+ timelineEnabled: true,
450
+ analysis,
451
+ deps: { remoteLlm: remote.remoteLlm },
452
+ });
453
+ assert.equal(shifted.status, "ok");
454
+ assert.equal(shifted.written, true);
455
+ assert.equal(shifted.analyzed, true);
456
+ assert.equal(remote.calls, 2);
457
+ const persisted = JSON.parse(await readFile(timelineDayPath(memoryDir, DATE), "utf8"));
458
+ assert.equal(persisted.timezone, "America/New_York");
459
+ });
460
+ });
461
+
462
+ test("an empty day cached under one timezone is rebuilt under another (issue #2891)", async () => {
463
+ await withStore(async (store, memoryDir) => {
464
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
465
+ const analysis = parseActivityConfig({
466
+ timeline: { analysis: { enabled: true, provider: "openai", model: "gpt-test" } },
467
+ }).timeline.analysis;
468
+ const first = await regenerateTimelineDay({
469
+ date: DATE,
470
+ timezone: TZ,
471
+ memoryDir,
472
+ store,
473
+ timelineEnabled: true,
474
+ analysis,
475
+ deps: { remoteLlm: remote.remoteLlm },
476
+ });
477
+ assert.equal(first.status, "invalid_output");
478
+ assert.equal(first.analyzed, false);
479
+ assert.equal(remote.calls, 0);
480
+ const shifted = await regenerateTimelineDay({
481
+ date: DATE,
482
+ timezone: "America/New_York",
483
+ memoryDir,
484
+ store,
485
+ timelineEnabled: true,
486
+ analysis,
487
+ deps: { remoteLlm: remote.remoteLlm },
488
+ });
489
+ // Zero observations under any timezone: still a rebuild, never the
490
+ // UTC-cached file served with the old day derivation.
491
+ assert.equal(shifted.written, true);
492
+ const persisted = JSON.parse(await readFile(timelineDayPath(memoryDir, DATE), "utf8"));
493
+ assert.equal(persisted.timezone, "America/New_York");
494
+ });
495
+ });
496
+
416
497
  test("a correction for another day does not change this day's hash, cache, or provider input", async () => {
417
498
  await withStore(async (store, memoryDir) => {
418
499
  store.insertSnapshot(snapshot());
@@ -502,4 +583,3 @@ test("a same-day correction updates hash, cards, and priorEdits", async () => {
502
583
  assert.notEqual(persistedSourceHash(await readFile(timelineDayPath(memoryDir, DATE), "utf8")), firstHash);
503
584
  });
504
585
  });
505
-
@@ -191,12 +191,18 @@ function resolveClients(input: RegenerateTimelineDayInput): TimelineAnalysisClie
191
191
  }
192
192
 
193
193
  function sourceHash(input: {
194
+ timezone: string;
194
195
  observations: readonly TimelineObservation[];
195
196
  analysis: ActivityTimelineAnalysisConfig;
196
197
  corrections: readonly TimelineCorrection[];
197
198
  }): string {
198
199
  return hashActivityBody(
199
200
  JSON.stringify({
201
+ // The timezone is a day-window determinant (it bounds which
202
+ // observations the day sees), so it belongs to the source identity:
203
+ // identical observations under a different timezone must not reuse
204
+ // the cached day (issue #2891).
205
+ timezone: input.timezone,
200
206
  observations: input.observations.map((observation) => ({
201
207
  id: observation.id,
202
208
  contentHash: observation.contentHash,
@@ -310,7 +316,7 @@ async function regenerateUncached(input: RegenerateTimelineDayInput): Promise<Re
310
316
  const rawCards = buildTimelineDay({ date, timezone, observations }).cards;
311
317
  corrections = correctionsForCards(rawCards, corrections);
312
318
  const built = applyTimelineCorrections(rawCards, corrections);
313
- const hash = sourceHash({ observations, analysis: input.analysis, corrections });
319
+ const hash = sourceHash({ timezone, observations, analysis: input.analysis, corrections });
314
320
  const prior = readPersisted(filePath);
315
321
  if (prior !== null && prior.sourceHash === hash && isCachedDayFinal(prior.status, input.analysis.enabled)) {
316
322
  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
+ });
@@ -37,3 +37,134 @@ export function applyVaultFrontmatter(
37
37
  .map((key) => `${key}: ${merged.get(key)}`)
38
38
  .join("\n");
39
39
  }
40
+
41
+ /**
42
+ * Frontmatter property boundary for the vault publisher (issue #2917).
43
+ *
44
+ * Property values written into note frontmatter must be single-line
45
+ * plain YAML scalars (or lists of them) whose rendered `key: value` line
46
+ * cannot change shape or inject keys when a YAML parser reads the note
47
+ * back. Validation is pure and total; the publisher runs it before any
48
+ * note byte is read or written, so a rejection can never leave a
49
+ * half-merged note behind.
50
+ */
51
+
52
+ /** A supported property value: one plain scalar, or a list of them. */
53
+ export type VaultPropertyValue = string | readonly string[];
54
+
55
+ export const VAULT_PROPERTY_KEY_MAX_CHARS = 64;
56
+ export const VAULT_PROPERTY_SCALAR_MAX_CHARS = 200;
57
+ export const VAULT_PROPERTY_LIST_MAX_ITEMS = 20;
58
+ export const VAULT_PROPERTY_TOTAL_MAX_CHARS = 2_000;
59
+
60
+ // C0 controls, DEL, and C1 controls. Covers \n, \r, \t — a newline is the
61
+ // frontmatter-injection primitive (`v\ninjected: yes` becomes a new key).
62
+ const CONTROL_RE = /[\u0000-\u001f\u007f-\u009f]/;
63
+ // Characters that make the first character a YAML indicator. `-`, `?`,
64
+ // and `:` only indicate when followed by a space, so `-5` stays a plain
65
+ // scalar while `- 5` does not.
66
+ const INDICATOR_CHARS = ",[]{}#&*!|>'\"%@`";
67
+ const INJECTION_RE = /: | #/;
68
+ // Flow-collection delimiters. Lists render as `[a, b]`; a bare delimiter
69
+ // inside an item splits or closes the sequence on re-read.
70
+ const FLOW_ITEM_DELIM_RE = /[[\]{},]/;
71
+
72
+ export type ValidateVaultPropertyResult = { ok: true } | { ok: false; reason: string };
73
+
74
+ /** Render a validated value the way `mergeFrontmatterKeys` writes it. */
75
+ export function renderVaultPropertyValue(value: VaultPropertyValue): string {
76
+ return typeof value === "string" ? value : `[${value.join(", ")}]`;
77
+ }
78
+
79
+ function hasLeadingYamlIndicator(text: string): boolean {
80
+ const first = text[0];
81
+ if (first === undefined) return false;
82
+ return INDICATOR_CHARS.includes(first) || ("-?:".includes(first) && text[1] === " ");
83
+ }
84
+
85
+ function validateScalar(value: string, label: string): ValidateVaultPropertyResult {
86
+ if (value.length === 0) {
87
+ return { ok: false, reason: `${label} must not be empty` };
88
+ }
89
+ if (value.length > VAULT_PROPERTY_SCALAR_MAX_CHARS) {
90
+ return { ok: false, reason: `${label} exceeds ${VAULT_PROPERTY_SCALAR_MAX_CHARS} characters` };
91
+ }
92
+ if (CONTROL_RE.test(value)) {
93
+ return { ok: false, reason: `${label} must not contain control characters or line breaks` };
94
+ }
95
+ if (value !== value.trim()) {
96
+ return { ok: false, reason: `${label} must not carry leading or trailing whitespace` };
97
+ }
98
+ if (hasLeadingYamlIndicator(value)) {
99
+ return { ok: false, reason: `${label} must be a plain scalar (leading "${value[0]}" changes its YAML shape)` };
100
+ }
101
+ if (INJECTION_RE.test(value)) {
102
+ return { ok: false, reason: `${label} must not contain ": " or " #"` };
103
+ }
104
+ if (value.endsWith(":")) {
105
+ return { ok: false, reason: `${label} must not end with ":"` };
106
+ }
107
+ return { ok: true };
108
+ }
109
+
110
+ /**
111
+ * Validate the final (already-prefixed) property set a publish would
112
+ * write: key shape, per-value scalar/list shape, per-value bounds, and
113
+ * the total rendered size across every entry.
114
+ */
115
+ export function validateVaultProperties(
116
+ entries: ReadonlyArray<{ key: string; value: VaultPropertyValue }>,
117
+ ): ValidateVaultPropertyResult {
118
+ let total = 0;
119
+ for (const { key, value } of entries) {
120
+ if (key.length === 0) {
121
+ return { ok: false, reason: "property keys must not be empty" };
122
+ }
123
+ if (key.length > VAULT_PROPERTY_KEY_MAX_CHARS) {
124
+ return { ok: false, reason: `property key exceeds ${VAULT_PROPERTY_KEY_MAX_CHARS} characters` };
125
+ }
126
+ if (
127
+ CONTROL_RE.test(key) ||
128
+ key !== key.trim() ||
129
+ key.includes(":") ||
130
+ key.includes("#") ||
131
+ hasLeadingYamlIndicator(key)
132
+ ) {
133
+ return { ok: false, reason: `property key ${JSON.stringify(key)} is not a plain mapping key` };
134
+ }
135
+ if (typeof value === "string") {
136
+ const scalar = validateScalar(value, `property ${key}`);
137
+ if (!scalar.ok) return scalar;
138
+ } else {
139
+ if (!Array.isArray(value) || value.length === 0) {
140
+ return { ok: false, reason: `property ${key} must be a scalar string or a non-empty list of scalar strings` };
141
+ }
142
+ if (value.length > VAULT_PROPERTY_LIST_MAX_ITEMS) {
143
+ return { ok: false, reason: `property ${key} exceeds ${VAULT_PROPERTY_LIST_MAX_ITEMS} list items` };
144
+ }
145
+ for (const item of value) {
146
+ if (typeof item !== "string") {
147
+ return { ok: false, reason: `property ${key} must be a scalar string or a list of scalar strings` };
148
+ }
149
+ const scalar = validateScalar(item, `property ${key} list item`);
150
+ if (!scalar.ok) return scalar;
151
+ // Lists render in flow form `[a, b]`; a bare delimiter inside an
152
+ // item would split or close the sequence on re-read.
153
+ if (FLOW_ITEM_DELIM_RE.test(item)) {
154
+ return {
155
+ ok: false,
156
+ reason: `property ${key} list item must not contain flow delimiters "[", "]", "{", "}", or ","`,
157
+ };
158
+ }
159
+ }
160
+ }
161
+ total += key.length + 2 + renderVaultPropertyValue(value).length;
162
+ if (total > VAULT_PROPERTY_TOTAL_MAX_CHARS) {
163
+ return {
164
+ ok: false,
165
+ reason: `frontmatter properties exceed the ${VAULT_PROPERTY_TOTAL_MAX_CHARS}-character total`,
166
+ };
167
+ }
168
+ }
169
+ return { ok: true };
170
+ }
@@ -261,6 +261,12 @@ export function parseAtxHeading(line: string): { level: number; text: string } |
261
261
  return { level, text: line.slice(start, end) };
262
262
  }
263
263
 
264
+ /** True when `## ${name}` parses back to the same heading text. */
265
+ export function headingSurvivesRoundTrip(name: string): boolean {
266
+ const parsed = parseAtxHeading(`## ${name}`);
267
+ return parsed !== null && parsed.text === name;
268
+ }
269
+
264
270
  export function publishVaultRegion(input: {
265
271
  vaultPath: string;
266
272
  relativeFile: string;