@remnic/core 9.69.12 → 9.69.13

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 (357) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -11
  2. package/dist/access-admin-ops-surface.js +4 -4
  3. package/dist/access-authorization-probe.d.ts +11 -11
  4. package/dist/access-authorization-probe.js +5 -5
  5. package/dist/access-boundary.d.ts +11 -11
  6. package/dist/access-boundary.js +4 -4
  7. package/dist/access-cli.js +28 -28
  8. package/dist/access-coding-context-resolution.d.ts +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +11 -11
  10. package/dist/access-extraction-force-flush.js +4 -4
  11. package/dist/access-health-types.d.ts +1 -1
  12. package/dist/access-http-lcm-compaction.d.ts +11 -11
  13. package/dist/access-http-lifecycle-flush.d.ts +11 -11
  14. package/dist/access-http-offline-stream.d.ts +11 -11
  15. package/dist/access-http-query.d.ts +2 -2
  16. package/dist/access-http-query.js +4 -4
  17. package/dist/access-http.d.ts +12 -12
  18. package/dist/access-http.js +15 -15
  19. package/dist/access-identity-continuity-surface.d.ts +9 -9
  20. package/dist/access-identity-continuity-surface.js +4 -4
  21. package/dist/access-lcm-surface.d.ts +11 -11
  22. package/dist/access-lcm-surface.js +4 -4
  23. package/dist/access-mcp.d.ts +11 -11
  24. package/dist/access-mcp.js +11 -11
  25. package/dist/access-memory-search-fanout.d.ts +2 -2
  26. package/dist/{access-namespace-preflight-Cy0yPsaE.d.ts → access-namespace-preflight-Rzuo1nGR.d.ts} +1 -1
  27. package/dist/access-namespace-preflight.d.ts +3 -3
  28. package/dist/access-namespace-preflight.js +4 -4
  29. package/dist/access-observe-write-surface.d.ts +11 -11
  30. package/dist/access-observe-write-surface.js +4 -4
  31. package/dist/access-offline-manifest.d.ts +9 -9
  32. package/dist/access-operations-batch.js +5 -5
  33. package/dist/access-operations.d.ts +12 -12
  34. package/dist/access-operations.js +10 -10
  35. package/dist/access-recall-concurrency.d.ts +11 -11
  36. package/dist/access-recall-concurrency.js +4 -4
  37. package/dist/access-recall-response.d.ts +11 -11
  38. package/dist/access-recall-response.js +4 -4
  39. package/dist/access-recall-surface.d.ts +11 -11
  40. package/dist/access-recall-surface.js +4 -4
  41. package/dist/{access-service-Baz5xW5X.d.ts → access-service-Bb2Fykzc.d.ts} +7 -7
  42. package/dist/access-service-helpers.d.ts +11 -11
  43. package/dist/access-service.d.ts +11 -11
  44. package/dist/access-service.js +4 -4
  45. package/dist/access-surface-catalog.d.ts +11 -11
  46. package/dist/access-surface-catalog.js +6 -6
  47. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  48. package/dist/action-confidence.d.ts +1 -1
  49. package/dist/active-memory-bridge.d.ts +1 -1
  50. package/dist/active-recall.d.ts +1 -1
  51. package/dist/active-recall.js +4 -4
  52. package/dist/ambient-provenance.d.ts +1 -1
  53. package/dist/artifact-search.d.ts +1 -1
  54. package/dist/behavior-learner.d.ts +1 -1
  55. package/dist/behavior-signals.d.ts +1 -1
  56. package/dist/bootstrap.d.ts +9 -9
  57. package/dist/briefing-window.d.ts +2 -2
  58. package/dist/briefing.d.ts +2 -2
  59. package/dist/buffer-surprise-report.d.ts +1 -1
  60. package/dist/buffer-turn-helpers.d.ts +1 -1
  61. package/dist/buffer.d.ts +2 -2
  62. package/dist/buffer.js +4 -4
  63. package/dist/bulk-import/index.d.ts +3 -3
  64. package/dist/calibration.d.ts +1 -1
  65. package/dist/capabilities.d.ts +1 -1
  66. package/dist/{catalog-9X8WpZNO.d.ts → catalog-DjTLVOYp.d.ts} +1 -1
  67. package/dist/causal-behavior.d.ts +1 -1
  68. package/dist/causal-consolidation.d.ts +1 -1
  69. package/dist/causal-trajectory-graph.d.ts +1 -1
  70. package/dist/{chunk-TEZ2HTC7.js → chunk-33JKYLPX.js} +2 -2
  71. package/dist/{chunk-MNH2GM4O.js → chunk-3BS2OGDT.js} +6 -19
  72. package/dist/{chunk-MNH2GM4O.js.map → chunk-3BS2OGDT.js.map} +1 -1
  73. package/dist/{chunk-5PTS43CH.js → chunk-4LG4CPOC.js} +2 -2
  74. package/dist/{chunk-Z33VUMKY.js → chunk-5H2G5X4R.js} +2 -2
  75. package/dist/{chunk-XFPHV65N.js → chunk-5JQV4T5Q.js} +2 -2
  76. package/dist/{chunk-OASGWNYL.js → chunk-63I7LMLG.js} +2 -2
  77. package/dist/{chunk-J3NGQ5SC.js → chunk-7GSSHAXC.js} +2 -2
  78. package/dist/{chunk-X4FIZAVQ.js → chunk-7JV4JST3.js} +854 -42
  79. package/dist/chunk-7JV4JST3.js.map +1 -0
  80. package/dist/{chunk-VHAKBUBD.js → chunk-B64IVEOH.js} +2 -2
  81. package/dist/{chunk-R7FXPG4T.js → chunk-C25N5HWX.js} +2 -2
  82. package/dist/{chunk-DH3V7RCQ.js → chunk-F2ERDKY2.js} +7 -7
  83. package/dist/{chunk-LJNLLNEM.js → chunk-HODFGQGT.js} +2 -2
  84. package/dist/{chunk-B75VCEX5.js → chunk-K2IJH4D3.js} +2 -2
  85. package/dist/{chunk-227WJVPY.js → chunk-KLSPKMIO.js} +2 -2
  86. package/dist/{chunk-5P2KNFJZ.js → chunk-MSDIETFC.js} +3 -3
  87. package/dist/{chunk-HFRGCNFY.js → chunk-OAKATRAN.js} +2 -2
  88. package/dist/chunk-OGUKSLYZ.js +560 -0
  89. package/dist/chunk-OGUKSLYZ.js.map +1 -0
  90. package/dist/{chunk-M6L7HI7R.js → chunk-P6FHFTZ7.js} +16 -1
  91. package/dist/chunk-P6FHFTZ7.js.map +1 -0
  92. package/dist/{chunk-LWBSEYW3.js → chunk-PAWIY5OQ.js} +5 -5
  93. package/dist/{chunk-3ITTF7YH.js → chunk-QVI63XSO.js} +90 -383
  94. package/dist/chunk-QVI63XSO.js.map +1 -0
  95. package/dist/{chunk-6TOWUN2R.js → chunk-RE3H6Y2X.js} +2 -2
  96. package/dist/{chunk-V3HUBF7T.js → chunk-S35IIP5P.js} +2 -2
  97. package/dist/{chunk-3YKOFCKP.js → chunk-SXHBZXHK.js} +2 -2
  98. package/dist/{chunk-7NCUHD5U.js → chunk-VAMZYOOV.js} +2 -2
  99. package/dist/{chunk-PGCZLHRB.js → chunk-W272SWN7.js} +3 -3
  100. package/dist/{chunk-5HO3QBAD.js → chunk-W6GEMUZM.js} +2 -2
  101. package/dist/{chunk-UCNQV43K.js → chunk-XQYTSZW3.js} +2 -2
  102. package/dist/{chunk-GR4C3FHT.js → chunk-ZKZCJRRO.js} +2 -2
  103. package/dist/{cli-CMtkGBdz.d.ts → cli-DXXy60A4.d.ts} +5 -5
  104. package/dist/cli.d.ts +13 -13
  105. package/dist/cli.js +21 -21
  106. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  107. package/dist/coding/pre-action-gate.d.ts +1 -1
  108. package/dist/compounding/engine.d.ts +2 -2
  109. package/dist/compounding/preference-consolidator.d.ts +1 -1
  110. package/dist/compression-optimizer.d.ts +1 -1
  111. package/dist/config.d.ts +1 -1
  112. package/dist/config.js +4 -4
  113. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  114. package/dist/connectors/codex-materialize.d.ts +1 -1
  115. package/dist/connectors/index.d.ts +1 -1
  116. package/dist/consolidation-provenance-check.d.ts +2 -2
  117. package/dist/consolidation-undo.d.ts +2 -2
  118. package/dist/contradiction/index.d.ts +3 -3
  119. package/dist/converge-config.d.ts +1 -1
  120. package/dist/convergence-refresh.d.ts +2 -2
  121. package/dist/conversation-index/backend.d.ts +1 -1
  122. package/dist/conversation-index/chunker.d.ts +1 -1
  123. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  124. package/dist/conversation-index/indexer.d.ts +1 -1
  125. package/dist/conversation-index/search.d.ts +1 -1
  126. package/dist/corpus-watermark.d.ts +1 -1
  127. package/dist/cross-lingual-recall.d.ts +1 -1
  128. package/dist/day-summary.d.ts +1 -1
  129. package/dist/deep-recall-http-glue.d.ts +11 -11
  130. package/dist/deep-recall-mcp-tools.d.ts +11 -11
  131. package/dist/deep-recall-policy-llm.d.ts +1 -1
  132. package/dist/deep-recall-seeds.d.ts +1 -1
  133. package/dist/delinearize.d.ts +1 -1
  134. package/dist/dependency-propagation-config.d.ts +1 -1
  135. package/dist/{dependency-propagation-delivery-BZGUecZf.d.ts → dependency-propagation-delivery-37JdQv_3.d.ts} +1 -1
  136. package/dist/direct-answer-wiring.d.ts +1 -1
  137. package/dist/direct-answer.d.ts +1 -1
  138. package/dist/embedding-fallback.d.ts +1 -1
  139. package/dist/enrichment/index.d.ts +1 -1
  140. package/dist/entity-origin-fields.d.ts +1 -1
  141. package/dist/entity-retrieval.d.ts +2 -2
  142. package/dist/entity-schema.d.ts +1 -1
  143. package/dist/episodic-context.d.ts +1 -1
  144. package/dist/eval-trajectory-contracts.d.ts +1 -1
  145. package/dist/eval-trajectory-store.d.ts +1 -1
  146. package/dist/eval-trajectory.d.ts +1 -1
  147. package/dist/explicit-capture.d.ts +9 -9
  148. package/dist/external-wiki-access.d.ts +11 -11
  149. package/dist/external-wiki-access.js +5 -5
  150. package/dist/external-wiki-collection-registration.d.ts +1 -1
  151. package/dist/external-wiki-collection.d.ts +1 -1
  152. package/dist/external-wiki-mcp-tools.d.ts +11 -11
  153. package/dist/extraction-error-classification.d.ts +1 -1
  154. package/dist/extraction-faithfulness.d.ts +1 -1
  155. package/dist/extraction-judge-telemetry.d.ts +1 -1
  156. package/dist/extraction-judge-training.d.ts +1 -1
  157. package/dist/extraction-judge.d.ts +1 -1
  158. package/dist/extraction-liveness.d.ts +1 -1
  159. package/dist/extraction-normalization.d.ts +1 -1
  160. package/dist/extraction-prompt.d.ts +1 -1
  161. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  162. package/dist/extraction-source-grounding.d.ts +1 -1
  163. package/dist/extraction.d.ts +1 -1
  164. package/dist/extraction.js +5 -5
  165. package/dist/fallback-llm.d.ts +1 -1
  166. package/dist/graph-dashboard-diff.d.ts +1 -1
  167. package/dist/graph-dashboard-key.d.ts +1 -1
  168. package/dist/graph-dashboard-parser.d.ts +1 -1
  169. package/dist/graph-edge-reinforcement.d.ts +1 -1
  170. package/dist/graph-path-reconstruction.d.ts +1 -1
  171. package/dist/graph-path-scoring.d.ts +1 -1
  172. package/dist/graph-snapshot.d.ts +1 -1
  173. package/dist/graph.d.ts +1 -1
  174. package/dist/importance.d.ts +1 -1
  175. package/dist/importers/index.d.ts +1 -1
  176. package/dist/in-flight-reads.d.ts +1 -1
  177. package/dist/{index-B4iTvT-w.d.ts → index-DquhYqsc.d.ts} +2 -2
  178. package/dist/index.d.ts +200 -62
  179. package/dist/index.js +59 -37
  180. package/dist/intent.d.ts +1 -1
  181. package/dist/lcm/engine.d.ts +1 -1
  182. package/dist/lcm/index.d.ts +1 -1
  183. package/dist/lcm/tools.d.ts +1 -1
  184. package/dist/lifecycle.d.ts +1 -1
  185. package/dist/live-connectors-runner.d.ts +1 -1
  186. package/dist/local-llm.d.ts +1 -1
  187. package/dist/local-model-endpoint.d.ts +1 -1
  188. package/dist/location/index.d.ts +3 -3
  189. package/dist/location/index.js +5 -5
  190. package/dist/maintenance/memory-governance.d.ts +1 -1
  191. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  192. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  193. package/dist/{maintenance-BBpNqEeJ.d.ts → maintenance-CizZOycr.d.ts} +3 -3
  194. package/dist/mcp-memory-inspector-app.d.ts +11 -11
  195. package/dist/memory-action-policy.d.ts +1 -1
  196. package/dist/memory-cache.d.ts +1 -1
  197. package/dist/memory-controller.d.ts +1 -1
  198. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  199. package/dist/memory-projection-store.d.ts +1 -1
  200. package/dist/memory-provenance.d.ts +1 -1
  201. package/dist/memory-snapshot.d.ts +1 -1
  202. package/dist/memory-subject-cli.d.ts +11 -11
  203. package/dist/memory-subject.d.ts +11 -11
  204. package/dist/memory-worth-outcomes.d.ts +2 -2
  205. package/dist/models-json.d.ts +1 -1
  206. package/dist/namespaces/migrate.d.ts +3 -3
  207. package/dist/namespaces/principal.d.ts +1 -1
  208. package/dist/namespaces/search.d.ts +1 -1
  209. package/dist/namespaces/storage.d.ts +3 -3
  210. package/dist/native-knowledge.d.ts +1 -1
  211. package/dist/offline-sync-impression-drain.d.ts +1 -1
  212. package/dist/operator-doctor-corpus.d.ts +1 -1
  213. package/dist/operator-doctor-replica.d.ts +1 -1
  214. package/dist/operator-toolkit.d.ts +3 -3
  215. package/dist/operator-toolkit.js +5 -5
  216. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  217. package/dist/orchestration/maintenance.d.ts +4 -4
  218. package/dist/orchestration/maintenance.js +6 -6
  219. package/dist/{orchestrator-DglY1H0w.d.ts → orchestrator-DqLcuNMP.d.ts} +8 -8
  220. package/dist/orchestrator.d.ts +9 -9
  221. package/dist/orchestrator.js +28 -28
  222. package/dist/patterns-cli.d.ts +1 -1
  223. package/dist/{pipeline-C7qRsy6g.d.ts → pipeline-DbJpmcRu.d.ts} +1 -1
  224. package/dist/policy-runtime.d.ts +1 -1
  225. package/dist/proactive-contention.d.ts +1 -1
  226. package/dist/provenance.d.ts +1 -1
  227. package/dist/{public-http-CU-Cwwdb.d.ts → public-http-NQ3UUp6W.d.ts} +1 -1
  228. package/dist/{qmd-YRLTa3AE.d.ts → qmd-DA_7fbSz.d.ts} +1 -1
  229. package/dist/qmd-preflight.d.ts +2 -2
  230. package/dist/qmd-recall-cache.d.ts +1 -1
  231. package/dist/qmd.d.ts +2 -2
  232. package/dist/recall-concurrency-config.d.ts +1 -1
  233. package/dist/recall-disclosure-escalation.d.ts +1 -1
  234. package/dist/recall-explain-renderer.d.ts +1 -1
  235. package/dist/recall-memory-map.d.ts +1 -1
  236. package/dist/recall-navigate-access.d.ts +1 -1
  237. package/dist/recall-navigate-disclosure.d.ts +1 -1
  238. package/dist/recall-navigate.d.ts +1 -1
  239. package/dist/recall-planner-llm.d.ts +1 -1
  240. package/dist/recall-state.d.ts +1 -1
  241. package/dist/recall-tag-filter.d.ts +1 -1
  242. package/dist/recall-timings.d.ts +1 -1
  243. package/dist/recall-xray-cli.d.ts +1 -1
  244. package/dist/recall-xray-renderer.d.ts +1 -1
  245. package/dist/recall-xray.d.ts +1 -1
  246. package/dist/reconcile/cursor.d.ts +1 -1
  247. package/dist/reconcile/manifest.d.ts +1 -1
  248. package/dist/reconcile/plan.d.ts +1 -1
  249. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  250. package/dist/replay/normalizers/claude.d.ts +1 -1
  251. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  252. package/dist/replay/normalizers/shared.d.ts +1 -1
  253. package/dist/replay/runner.d.ts +1 -1
  254. package/dist/replay/types.d.ts +1 -1
  255. package/dist/replica-divergence.d.ts +1 -1
  256. package/dist/replica-peers-config.d.ts +1 -1
  257. package/dist/resolve-auth-token.d.ts +1 -1
  258. package/dist/resume-bundles.js +5 -5
  259. package/dist/retrieval-agents.d.ts +2 -2
  260. package/dist/retrieval-tiers.d.ts +1 -1
  261. package/dist/routing/engine.d.ts +1 -1
  262. package/dist/routing/store.d.ts +1 -1
  263. package/dist/salvage-envelope.d.ts +1 -1
  264. package/dist/{scope-profiles-BVvqVzJX.d.ts → scope-profiles-BpiWKZzx.d.ts} +1 -1
  265. package/dist/search/embed-helper.d.ts +1 -1
  266. package/dist/search/factory.d.ts +1 -1
  267. package/dist/search/index.d.ts +1 -1
  268. package/dist/search/lancedb-backend.d.ts +1 -1
  269. package/dist/search/meilisearch-backend.d.ts +1 -1
  270. package/dist/search/noop-backend.d.ts +1 -1
  271. package/dist/search/orama-backend.d.ts +1 -1
  272. package/dist/search/port.d.ts +1 -1
  273. package/dist/search/remote-backend.d.ts +1 -1
  274. package/dist/{semantic-consolidation-BzCI6Kuu.d.ts → semantic-consolidation-NJpaZpkY.d.ts} +1 -1
  275. package/dist/semantic-consolidation.d.ts +2 -2
  276. package/dist/semantic-rule-verifier.d.ts +1 -1
  277. package/dist/{service-DQ3Gscy5.d.ts → service-DdlZjX1D.d.ts} +2 -2
  278. package/dist/session-observer-bands.d.ts +1 -1
  279. package/dist/session-observer-state.d.ts +1 -1
  280. package/dist/shared-context/manager.d.ts +1 -1
  281. package/dist/signal.d.ts +1 -1
  282. package/dist/source-agent-qualifier.d.ts +1 -1
  283. package/dist/source-agent-qualifier.js +4 -4
  284. package/dist/standup/build.js +2 -2
  285. package/dist/{storage-DmTbQdD0.d.ts → storage-C7BWrpU9.d.ts} +1 -1
  286. package/dist/storage.d.ts +2 -2
  287. package/dist/subject-config.d.ts +1 -1
  288. package/dist/summarizer.d.ts +1 -1
  289. package/dist/summary-snapshot.d.ts +1 -1
  290. package/dist/support-passport/index.d.ts +14 -14
  291. package/dist/support-passport/index.js +7 -7
  292. package/dist/temporal-supersession.d.ts +2 -2
  293. package/dist/temporal-timeline-recall.d.ts +1 -1
  294. package/dist/temporal-validity.d.ts +1 -1
  295. package/dist/threading.d.ts +1 -1
  296. package/dist/tier-migration.d.ts +2 -2
  297. package/dist/tier-routing.d.ts +1 -1
  298. package/dist/topics.d.ts +1 -1
  299. package/dist/transcript.d.ts +1 -1
  300. package/dist/transfer/export-okf.d.ts +1 -1
  301. package/dist/trust-score-stage.d.ts +1 -1
  302. package/dist/trust-score.d.ts +1 -1
  303. package/dist/{types-CLRTESSD.d.ts → types-Cy1l6fzp.d.ts} +48 -1
  304. package/dist/types.d.ts +1 -1
  305. package/dist/utility-runtime.d.ts +1 -1
  306. package/dist/who-knows-cli.d.ts +11 -11
  307. package/dist/who-knows.d.ts +11 -11
  308. package/dist/write-envelope.d.ts +1 -1
  309. package/package.json +2 -2
  310. package/src/activity/config.test.ts +94 -1
  311. package/src/activity/config.ts +256 -3
  312. package/src/activity/digest.ts +21 -0
  313. package/src/activity/index.ts +2 -0
  314. package/src/activity/runner.ts +2 -17
  315. package/src/activity/timeline/publish-cli.test.ts +169 -0
  316. package/src/activity/timeline/publish-cli.ts +144 -0
  317. package/src/activity/timeline/query.ts +51 -15
  318. package/src/activity/types.ts +45 -0
  319. package/src/activity/vault-insert.ts +14 -33
  320. package/src/activity/vault-path.ts +100 -22
  321. package/src/activity/vault-publish.test.ts +51 -0
  322. package/src/activity/vault-publish.ts +157 -17
  323. package/src/activity/vault-publisher.test.ts +881 -0
  324. package/src/activity/vault-publisher.ts +597 -0
  325. package/src/activity/vault-region.test.ts +5 -0
  326. package/src/activity/vault-region.ts +7 -2
  327. package/src/cli/timeline-publish-commands.ts +34 -0
  328. package/src/cli.ts +2 -2
  329. package/src/config.test.ts +24 -1
  330. package/dist/chunk-3ITTF7YH.js.map +0 -1
  331. package/dist/chunk-KJUWWN3T.js +0 -237
  332. package/dist/chunk-KJUWWN3T.js.map +0 -1
  333. package/dist/chunk-M6L7HI7R.js.map +0 -1
  334. package/dist/chunk-X4FIZAVQ.js.map +0 -1
  335. /package/dist/{chunk-TEZ2HTC7.js.map → chunk-33JKYLPX.js.map} +0 -0
  336. /package/dist/{chunk-5PTS43CH.js.map → chunk-4LG4CPOC.js.map} +0 -0
  337. /package/dist/{chunk-Z33VUMKY.js.map → chunk-5H2G5X4R.js.map} +0 -0
  338. /package/dist/{chunk-XFPHV65N.js.map → chunk-5JQV4T5Q.js.map} +0 -0
  339. /package/dist/{chunk-OASGWNYL.js.map → chunk-63I7LMLG.js.map} +0 -0
  340. /package/dist/{chunk-J3NGQ5SC.js.map → chunk-7GSSHAXC.js.map} +0 -0
  341. /package/dist/{chunk-VHAKBUBD.js.map → chunk-B64IVEOH.js.map} +0 -0
  342. /package/dist/{chunk-R7FXPG4T.js.map → chunk-C25N5HWX.js.map} +0 -0
  343. /package/dist/{chunk-DH3V7RCQ.js.map → chunk-F2ERDKY2.js.map} +0 -0
  344. /package/dist/{chunk-LJNLLNEM.js.map → chunk-HODFGQGT.js.map} +0 -0
  345. /package/dist/{chunk-B75VCEX5.js.map → chunk-K2IJH4D3.js.map} +0 -0
  346. /package/dist/{chunk-227WJVPY.js.map → chunk-KLSPKMIO.js.map} +0 -0
  347. /package/dist/{chunk-5P2KNFJZ.js.map → chunk-MSDIETFC.js.map} +0 -0
  348. /package/dist/{chunk-HFRGCNFY.js.map → chunk-OAKATRAN.js.map} +0 -0
  349. /package/dist/{chunk-LWBSEYW3.js.map → chunk-PAWIY5OQ.js.map} +0 -0
  350. /package/dist/{chunk-6TOWUN2R.js.map → chunk-RE3H6Y2X.js.map} +0 -0
  351. /package/dist/{chunk-V3HUBF7T.js.map → chunk-S35IIP5P.js.map} +0 -0
  352. /package/dist/{chunk-3YKOFCKP.js.map → chunk-SXHBZXHK.js.map} +0 -0
  353. /package/dist/{chunk-7NCUHD5U.js.map → chunk-VAMZYOOV.js.map} +0 -0
  354. /package/dist/{chunk-PGCZLHRB.js.map → chunk-W272SWN7.js.map} +0 -0
  355. /package/dist/{chunk-5HO3QBAD.js.map → chunk-W6GEMUZM.js.map} +0 -0
  356. /package/dist/{chunk-UCNQV43K.js.map → chunk-XQYTSZW3.js.map} +0 -0
  357. /package/dist/{chunk-GR4C3FHT.js.map → chunk-ZKZCJRRO.js.map} +0 -0
@@ -0,0 +1,560 @@
1
+ import {
2
+ assertValidTimezone,
3
+ isValidActivityDate
4
+ } from "./chunk-P6FHFTZ7.js";
5
+ import {
6
+ coerceBooleanLike,
7
+ coerceNumber
8
+ } from "./chunk-PQVCH2AE.js";
9
+
10
+ // src/activity/vault-path.ts
11
+ import path from "path";
12
+ var VAULT_TEMPLATE_TOKENS = [
13
+ "{yyyy}",
14
+ "{yy}",
15
+ "{M}",
16
+ "{MM}",
17
+ "{d}",
18
+ "{dd}",
19
+ "{ww}",
20
+ "{MMM}",
21
+ "{MMMM}",
22
+ "{ddd}",
23
+ "{dddd}"
24
+ ];
25
+ var TOKEN_LOOKUP = Object.fromEntries(VAULT_TEMPLATE_TOKENS.map((t) => [t, true]));
26
+ var ANY_BRACED_RE = /\{[^{}]*\}/g;
27
+ var MONTH_NAMES = [
28
+ "January",
29
+ "February",
30
+ "March",
31
+ "April",
32
+ "May",
33
+ "June",
34
+ "July",
35
+ "August",
36
+ "September",
37
+ "October",
38
+ "November",
39
+ "December"
40
+ ];
41
+ var WEEKDAY_NAMES = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
42
+ function templateValues(date) {
43
+ const [yyyy, mm, dd] = date.split("-");
44
+ const monthIndex = Number(mm) - 1;
45
+ const weekday = new Date(Date.UTC(Number(yyyy), monthIndex, Number(dd))).getUTCDay();
46
+ return {
47
+ "{yyyy}": yyyy,
48
+ "{yy}": yyyy.slice(2),
49
+ "{MM}": mm,
50
+ "{dd}": dd,
51
+ "{M}": String(Number(mm)),
52
+ "{d}": String(Number(dd)),
53
+ "{ww}": isoWeekNumber(date),
54
+ "{MMM}": MONTH_NAMES[monthIndex].slice(0, 3),
55
+ "{MMMM}": MONTH_NAMES[monthIndex],
56
+ "{ddd}": WEEKDAY_NAMES[weekday].slice(0, 3),
57
+ "{dddd}": WEEKDAY_NAMES[weekday]
58
+ };
59
+ }
60
+ function expandVaultTemplateTokens(text, date) {
61
+ if (!isValidActivityDate(date)) {
62
+ throw new RangeError(`Invalid vault date "${date}"; expected YYYY-MM-DD.`);
63
+ }
64
+ if (typeof text !== "string" || text.length === 0) {
65
+ throw new RangeError("Vault template must be a non-empty string.");
66
+ }
67
+ const values = templateValues(date);
68
+ return text.replace(ANY_BRACED_RE, (token) => {
69
+ if (TOKEN_LOOKUP[token] === true) return values[token];
70
+ throw new RangeError(
71
+ `Unknown vault template token ${token}; valid tokens are ${VAULT_TEMPLATE_TOKENS.join(" ")}.`
72
+ );
73
+ });
74
+ }
75
+ function validateVaultNoteTemplate(template) {
76
+ if (typeof template !== "string" || template.length === 0) {
77
+ throw new RangeError("Vault note path template must be a non-empty relative path.");
78
+ }
79
+ if (path.posix.isAbsolute(template) || path.win32.isAbsolute(template)) {
80
+ throw new RangeError("Vault note path template must be relative; absolute templates are rejected.");
81
+ }
82
+ if (template.split(/[\\/]/).some((segment) => segment === "..")) {
83
+ throw new RangeError("Vault note path template must not contain `..` segments.");
84
+ }
85
+ expandVaultTemplateTokens(template, "2026-01-04");
86
+ }
87
+ function resolveVaultNotePath(template, date, options) {
88
+ if (!isValidActivityDate(date)) {
89
+ throw new RangeError(`Invalid vault date "${date}"; expected YYYY-MM-DD.`);
90
+ }
91
+ if (options?.timezone !== void 0) {
92
+ assertValidTimezone(options.timezone);
93
+ }
94
+ validateVaultNoteTemplate(template);
95
+ const expanded = expandVaultTemplateTokens(template, date);
96
+ if (path.posix.isAbsolute(expanded) || path.win32.isAbsolute(expanded)) {
97
+ throw new RangeError("Vault note path template must be relative; absolute templates are rejected.");
98
+ }
99
+ return expanded;
100
+ }
101
+ function isoWeekNumber(date) {
102
+ const [year, month, day] = date.split("-").map(Number);
103
+ const utc = new Date(Date.UTC(year, month - 1, day));
104
+ const dayNum = utc.getUTCDay() || 7;
105
+ utc.setUTCDate(utc.getUTCDate() + 4 - dayNum);
106
+ const yearStart = new Date(Date.UTC(utc.getUTCFullYear(), 0, 1));
107
+ const weekNo = Math.ceil(((utc.getTime() - yearStart.getTime()) / 864e5 + 1) / 7);
108
+ return String(weekNo).padStart(2, "0");
109
+ }
110
+
111
+ // src/activity/vault-region.ts
112
+ function validateRegionName(name) {
113
+ if (typeof name !== "string") {
114
+ return { ok: false, error: "invalid_name" };
115
+ }
116
+ if (name.includes("\n") || name.includes("\r") || name.includes("-->") || name.includes(":")) {
117
+ return { ok: false, error: "invalid_name" };
118
+ }
119
+ const trimmed = name.trim();
120
+ if (trimmed.length === 0) {
121
+ return { ok: false, error: "invalid_name" };
122
+ }
123
+ return { ok: true, name: trimmed };
124
+ }
125
+
126
+ // src/activity/config.ts
127
+ import path2 from "path";
128
+
129
+ // src/activity/journal-source.ts
130
+ function resolveJournalSource(input) {
131
+ if (input.source === "file") return { ok: true, mode: "file" };
132
+ if (input.source === "vault") {
133
+ const heading = input.heading.trim();
134
+ if (heading.length === 0) return { ok: false, error: "missing_heading" };
135
+ return { ok: true, mode: "vault", heading };
136
+ }
137
+ return { ok: false, error: "unknown_source" };
138
+ }
139
+
140
+ // src/activity/config.ts
141
+ var EXTRACTION_MODES = ["off", "smart"];
142
+ var IMPORTANCE_LEVELS = ["critical", "high", "normal", "low", "trivial"];
143
+ var LOOPBACK_HOSTS = { localhost: true, "127.0.0.1": true, "::1": true };
144
+ function defaultActivityConfig() {
145
+ return {
146
+ enabled: false,
147
+ timezone: "UTC",
148
+ syncDays: 1,
149
+ autoSyncIntervalMinutes: 15,
150
+ sources: [],
151
+ extractionMode: "off",
152
+ sourceTrust: 0.6,
153
+ autoApproveTrust: 0.8,
154
+ reviewTrust: 0.5,
155
+ minConfidence: 0.7,
156
+ minImportance: "normal",
157
+ maxMemoriesPerDay: 0,
158
+ timeline: {
159
+ enabled: false,
160
+ journal: { enabled: false, source: "file" },
161
+ qa: { enabled: false, maxRangeDays: 31 },
162
+ vault: parseTimelineVaultConfig(void 0)
163
+ }
164
+ };
165
+ }
166
+ function asRecord(value, name) {
167
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
168
+ throw new TypeError(`${name} must be an object`);
169
+ }
170
+ return value;
171
+ }
172
+ function optionalString(value, name) {
173
+ if (value === void 0) return void 0;
174
+ if (typeof value !== "string" || value.length === 0) throw new TypeError(`${name} must be a non-empty string`);
175
+ return value;
176
+ }
177
+ function parseUnitInterval(value, key, fallback) {
178
+ if (value === void 0) return fallback;
179
+ const parsed = coerceNumber(value);
180
+ if (parsed === void 0 || !Number.isFinite(parsed) || parsed < 0 || parsed > 1) {
181
+ throw new RangeError(`activity.${key} must be a number in [0, 1]`);
182
+ }
183
+ return parsed;
184
+ }
185
+ function validateActivityBaseUrl(baseUrl) {
186
+ let parsed;
187
+ try {
188
+ parsed = new URL(baseUrl);
189
+ } catch {
190
+ throw new RangeError(`activity source baseUrl must be a valid URL: ${baseUrl}`);
191
+ }
192
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
193
+ throw new RangeError("activity source baseUrl must use HTTP or HTTPS");
194
+ }
195
+ const host = parsed.hostname.replace(/^\[|\]$/g, "");
196
+ if (LOOPBACK_HOSTS[host] !== true && !/^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(host)) {
197
+ throw new RangeError(`activity source baseUrl must target a loopback host (got ${parsed.hostname})`);
198
+ }
199
+ return parsed;
200
+ }
201
+ function parseSource(value) {
202
+ const raw = asRecord(value, "activity source");
203
+ const machineLabel = optionalString(raw.machineLabel, "activity source machineLabel");
204
+ const baseUrl = optionalString(raw.baseUrl, "activity source baseUrl");
205
+ if (machineLabel === void 0 || baseUrl === void 0) {
206
+ throw new TypeError("activity source requires machineLabel and baseUrl");
207
+ }
208
+ if (machineLabel.trim().length === 0) {
209
+ throw new RangeError("activity source machineLabel must not be blank");
210
+ }
211
+ validateActivityBaseUrl(baseUrl);
212
+ const token = optionalString(raw.token, "activity source token");
213
+ return { machineLabel, baseUrl, ...token === void 0 ? {} : { token } };
214
+ }
215
+ function parseActivityConfig(raw) {
216
+ const defaults = defaultActivityConfig();
217
+ if (raw === void 0 || raw === null) {
218
+ return { ...defaults };
219
+ }
220
+ const config = asRecord(raw, "activity");
221
+ const enabledValue = coerceBooleanLike(config.enabled, "activity.enabled");
222
+ if (config.enabled !== void 0 && enabledValue === void 0) {
223
+ throw new TypeError("activity.enabled must be a boolean");
224
+ }
225
+ const timezone = optionalString(config.timezone, "activity.timezone") ?? "UTC";
226
+ assertValidTimezone(timezone);
227
+ const syncDaysValue = coerceNumber(config.syncDays, "activity.syncDays");
228
+ if (config.syncDays !== void 0 && syncDaysValue === void 0) {
229
+ throw new TypeError("activity.syncDays must be a finite number");
230
+ }
231
+ const syncDays = syncDaysValue ?? 1;
232
+ if (!Number.isInteger(syncDays) || syncDays < 1 || syncDays > 90) {
233
+ throw new RangeError("activity.syncDays must be an integer from 1 to 90");
234
+ }
235
+ const intervalValue = coerceNumber(config.autoSyncIntervalMinutes, "activity.autoSyncIntervalMinutes");
236
+ if (config.autoSyncIntervalMinutes !== void 0 && intervalValue === void 0) {
237
+ throw new TypeError("activity.autoSyncIntervalMinutes must be a finite number");
238
+ }
239
+ const autoSyncIntervalMinutes = intervalValue ?? 15;
240
+ if (!Number.isInteger(autoSyncIntervalMinutes) || autoSyncIntervalMinutes < 1 || autoSyncIntervalMinutes > 1440) {
241
+ throw new RangeError("activity.autoSyncIntervalMinutes must be an integer from 1 to 1440");
242
+ }
243
+ if (config.sources !== void 0 && !Array.isArray(config.sources)) {
244
+ throw new TypeError("activity.sources must be an array");
245
+ }
246
+ const sources = (config.sources ?? []).map(parseSource);
247
+ const labels = /* @__PURE__ */ new Set();
248
+ for (const source of sources) {
249
+ if (labels.has(source.machineLabel)) {
250
+ throw new RangeError(`activity source machineLabel must be unique: ${source.machineLabel}`);
251
+ }
252
+ labels.add(source.machineLabel);
253
+ }
254
+ const enabled = enabledValue ?? false;
255
+ if (enabled && sources.length === 0) throw new RangeError("activity.enabled requires at least one source");
256
+ const extractionMode = config.extractionMode === void 0 ? defaults.extractionMode : config.extractionMode;
257
+ if (typeof extractionMode !== "string" || !EXTRACTION_MODES.includes(extractionMode)) {
258
+ throw new RangeError(`activity.extractionMode must be one of: ${EXTRACTION_MODES.join(", ")}`);
259
+ }
260
+ const minImportance = config.minImportance === void 0 ? defaults.minImportance : config.minImportance;
261
+ if (typeof minImportance !== "string" || !IMPORTANCE_LEVELS.includes(minImportance)) {
262
+ throw new RangeError(`activity.minImportance must be one of: ${IMPORTANCE_LEVELS.join(", ")}`);
263
+ }
264
+ const rawMaxMemoriesPerDay = config.maxMemoriesPerDay === void 0 ? defaults.maxMemoriesPerDay : config.maxMemoriesPerDay;
265
+ const maxMemoriesPerDay = coerceNumber(rawMaxMemoriesPerDay);
266
+ if (maxMemoriesPerDay === void 0 || !Number.isInteger(maxMemoriesPerDay) || maxMemoriesPerDay < 0) {
267
+ throw new RangeError("activity.maxMemoriesPerDay must be a non-negative integer");
268
+ }
269
+ const autoApproveTrust = parseUnitInterval(config.autoApproveTrust, "autoApproveTrust", defaults.autoApproveTrust);
270
+ const reviewTrust = parseUnitInterval(config.reviewTrust, "reviewTrust", defaults.reviewTrust);
271
+ if (reviewTrust >= autoApproveTrust) {
272
+ throw new RangeError(
273
+ `activity.reviewTrust (${reviewTrust}) must be below autoApproveTrust (${autoApproveTrust})`
274
+ );
275
+ }
276
+ return {
277
+ enabled,
278
+ timezone,
279
+ syncDays,
280
+ autoSyncIntervalMinutes,
281
+ sources,
282
+ extractionMode,
283
+ sourceTrust: parseUnitInterval(config.sourceTrust, "sourceTrust", defaults.sourceTrust),
284
+ autoApproveTrust,
285
+ reviewTrust,
286
+ minConfidence: parseUnitInterval(config.minConfidence, "minConfidence", defaults.minConfidence),
287
+ minImportance,
288
+ maxMemoriesPerDay,
289
+ timeline: parseTimelineConfig(config.timeline)
290
+ };
291
+ }
292
+ function parseTimelineConfig(raw) {
293
+ if (raw === void 0) {
294
+ return {
295
+ enabled: false,
296
+ journal: { enabled: false, source: "file" },
297
+ qa: parseTimelineQaConfig(void 0),
298
+ vault: parseTimelineVaultConfig(void 0)
299
+ };
300
+ }
301
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
302
+ throw new TypeError("activity.timeline must be an object");
303
+ }
304
+ const timeline = raw;
305
+ const enabledValue = coerceBooleanLike(timeline.enabled, "activity.timeline.enabled");
306
+ if (timeline.enabled !== void 0 && enabledValue === void 0) {
307
+ throw new TypeError("activity.timeline.enabled must be a boolean");
308
+ }
309
+ return {
310
+ enabled: enabledValue ?? false,
311
+ journal: parseTimelineJournalConfig(timeline.journal),
312
+ qa: parseTimelineQaConfig(timeline.qa),
313
+ vault: parseTimelineVaultConfig(timeline.vault)
314
+ };
315
+ }
316
+ function parseTimelineVaultConfig(raw) {
317
+ if (raw === void 0) return defaultVaultConfig();
318
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
319
+ throw new TypeError("activity.timeline.vault must be an object");
320
+ }
321
+ const vault = raw;
322
+ const enabled = requireBool(vault.enabled, "activity.timeline.vault.enabled", false);
323
+ const createMissingNotes = requireBool(vault.createMissingNotes, "activity.timeline.vault.createMissingNotes", false);
324
+ const autoPublish = requireBool(vault.autoPublish, "activity.timeline.vault.autoPublish", true);
325
+ const vaultPath = optionalNonEmptyString(vault.vaultPath, "activity.timeline.vault.vaultPath") ?? "";
326
+ const dailyNotePath = optionalNonEmptyString(vault.dailyNotePath, "activity.timeline.vault.dailyNotePath") ?? "{yyyy}-{MM}-{dd}.md";
327
+ const weeklyNotePath = optionalNonEmptyString(vault.weeklyNotePath, "activity.timeline.vault.weeklyNotePath") ?? "";
328
+ const noteTemplate = optionalNonEmptyString(vault.noteTemplate, "activity.timeline.vault.noteTemplate") ?? "";
329
+ const insertUnderHeading = optionalNonEmptyString(vault.insertUnderHeading, "activity.timeline.vault.insertUnderHeading") ?? "";
330
+ if (typeof vault.sectionStrategy !== "undefined" && typeof vault.sectionStrategy !== "string") {
331
+ throw new TypeError("activity.timeline.vault.sectionStrategy must be a string");
332
+ }
333
+ const sectionStrategy = vault.sectionStrategy ?? "markers";
334
+ if (sectionStrategy !== "markers" && sectionStrategy !== "heading") {
335
+ throw new RangeError('activity.timeline.vault.sectionStrategy must be one of "markers", "heading"');
336
+ }
337
+ const tildeRooted = vaultPath === "~" || vaultPath.startsWith("~/") || vaultPath.startsWith("~\\");
338
+ if (enabled && (vaultPath.trim().length === 0 || !tildeRooted && !path2.isAbsolute(vaultPath))) {
339
+ throw new RangeError(
340
+ `activity.timeline.vault.vaultPath must be an absolute or \`~\`-rooted path when activity.timeline.vault.enabled is true; a relative path resolves against the process working directory (got ${JSON.stringify(vaultPath)})`
341
+ );
342
+ }
343
+ try {
344
+ validateVaultNoteTemplate(dailyNotePath);
345
+ } catch (err) {
346
+ throw new RangeError(`activity.timeline.vault.dailyNotePath: ${err.message}`);
347
+ }
348
+ if (weeklyNotePath.length > 0) {
349
+ try {
350
+ validateVaultNoteTemplate(weeklyNotePath);
351
+ } catch (err) {
352
+ throw new RangeError(`activity.timeline.vault.weeklyNotePath: ${err.message}`);
353
+ }
354
+ }
355
+ if (createMissingNotes) {
356
+ if (noteTemplate.length === 0) {
357
+ throw new RangeError(
358
+ "activity.timeline.vault.noteTemplate must name a vault-relative template file when activity.timeline.vault.createMissingNotes is true"
359
+ );
360
+ }
361
+ try {
362
+ validateVaultNoteTemplate(noteTemplate);
363
+ } catch (err) {
364
+ throw new RangeError(`activity.timeline.vault.noteTemplate: ${err.message}`);
365
+ }
366
+ }
367
+ const publish = parseVaultPublishBlock(vault.publish, weeklyNotePath);
368
+ const wikilinksRaw = vault.wikilinks;
369
+ const wikilinks = wikilinksRaw === void 0 ? { places: false, placesFolder: "Places" } : parseVaultWikilinks(wikilinksRaw);
370
+ const propertiesRaw = vault.properties;
371
+ const properties = propertiesRaw === void 0 ? { mode: "off", prefix: "remnic_" } : parseVaultProperties(propertiesRaw);
372
+ return {
373
+ enabled,
374
+ vaultPath,
375
+ dailyNotePath,
376
+ weeklyNotePath,
377
+ createMissingNotes,
378
+ noteTemplate,
379
+ sectionStrategy,
380
+ publish,
381
+ insertUnderHeading,
382
+ wikilinks,
383
+ properties,
384
+ autoPublish
385
+ };
386
+ }
387
+ function defaultVaultConfig() {
388
+ return {
389
+ enabled: false,
390
+ vaultPath: "",
391
+ dailyNotePath: "{yyyy}-{MM}-{dd}.md",
392
+ weeklyNotePath: "",
393
+ createMissingNotes: false,
394
+ noteTemplate: "",
395
+ sectionStrategy: "markers",
396
+ publish: {
397
+ timeline: { enabled: true, target: "daily", section: "Timeline" },
398
+ standup: { enabled: false, target: "daily", section: "Standup" },
399
+ weekly: { enabled: false, target: "weekly", section: "Weekly Review" },
400
+ locations: { enabled: false, target: "daily", section: "Locations" }
401
+ },
402
+ insertUnderHeading: "",
403
+ wikilinks: { places: false, placesFolder: "Places" },
404
+ properties: { mode: "off", prefix: "remnic_" },
405
+ autoPublish: true
406
+ };
407
+ }
408
+ function requireBool(value, key, fallback) {
409
+ const coerced = coerceBooleanLike(value, key);
410
+ if (value === void 0) return fallback;
411
+ if (coerced === void 0) {
412
+ throw new TypeError(`${key} must be a boolean`);
413
+ }
414
+ return coerced;
415
+ }
416
+ function optionalNonEmptyString(value, key) {
417
+ if (value === void 0) return void 0;
418
+ if (typeof value !== "string") {
419
+ throw new TypeError(`${key} must be a string`);
420
+ }
421
+ return value;
422
+ }
423
+ function parseVaultPublishBlock(raw, weeklyNotePath) {
424
+ const defaults = defaultVaultConfig().publish;
425
+ if (raw === void 0) return defaults;
426
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
427
+ throw new TypeError("activity.timeline.vault.publish must be an object");
428
+ }
429
+ const block = raw;
430
+ const publish = {
431
+ timeline: parseVaultTarget(block.timeline, "timeline", defaults.timeline, weeklyNotePath),
432
+ standup: parseVaultTarget(block.standup, "standup", defaults.standup, weeklyNotePath),
433
+ weekly: parseVaultTarget(block.weekly, "weekly", defaults.weekly, weeklyNotePath),
434
+ locations: parseVaultTarget(block.locations, "locations", defaults.locations, weeklyNotePath)
435
+ };
436
+ for (const targetFile of ["daily", "weekly"]) {
437
+ const sections = ["timeline", "standup", "weekly", "locations"].filter((kind) => publish[kind].target === targetFile && publish[kind].enabled).map((kind) => publish[kind].section);
438
+ const duplicates = sections.filter((section, index) => sections.indexOf(section) !== index);
439
+ if (duplicates.length > 0) {
440
+ throw new RangeError(
441
+ `activity.timeline.vault.publish section names must be unique per target file; duplicate ${targetFile} section(s): ${[...new Set(duplicates)].join(", ")}`
442
+ );
443
+ }
444
+ }
445
+ return publish;
446
+ }
447
+ function parseVaultTarget(raw, kind, fallback, weeklyNotePath) {
448
+ if (raw === void 0) return fallback;
449
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
450
+ throw new TypeError(`activity.timeline.vault.publish.${kind} must be an object`);
451
+ }
452
+ const entry = raw;
453
+ const enabled = requireBool(entry.enabled, `activity.timeline.vault.publish.${kind}.enabled`, fallback.enabled);
454
+ const target = entry.target === void 0 ? fallback.target : entry.target;
455
+ if (target !== "daily" && target !== "weekly") {
456
+ throw new RangeError(`activity.timeline.vault.publish.${kind}.target must be one of "daily", "weekly"`);
457
+ }
458
+ const section = entry.section === void 0 ? fallback.section : entry.section;
459
+ if (typeof section !== "string" || section.trim().length === 0 || section !== section.trim()) {
460
+ throw new RangeError(`activity.timeline.vault.publish.${kind}.section must be a non-empty trimmed string`);
461
+ }
462
+ if (!validateRegionName(section).ok) {
463
+ throw new RangeError(
464
+ `activity.timeline.vault.publish.${kind}.section must not contain a line break or "-->"`
465
+ );
466
+ }
467
+ if (enabled && target === "weekly" && weeklyNotePath.length === 0) {
468
+ throw new RangeError(
469
+ `activity.timeline.vault.publish.${kind}.target is "weekly" but activity.timeline.vault.weeklyNotePath is empty; configure weeklyNotePath first`
470
+ );
471
+ }
472
+ return { enabled, target, section };
473
+ }
474
+ function parseVaultWikilinks(raw) {
475
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
476
+ throw new TypeError("activity.timeline.vault.wikilinks must be an object");
477
+ }
478
+ const block = raw;
479
+ const places = requireBool(block.places, "activity.timeline.vault.wikilinks.places", false);
480
+ const placesFolder = optionalNonEmptyString(block.placesFolder, "activity.timeline.vault.wikilinks.placesFolder") ?? "Places";
481
+ return { places, placesFolder };
482
+ }
483
+ function parseVaultProperties(raw) {
484
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
485
+ throw new TypeError("activity.timeline.vault.properties must be an object");
486
+ }
487
+ const block = raw;
488
+ const mode = block.mode === void 0 ? "off" : block.mode;
489
+ if (mode !== "off" && mode !== "frontmatter" && mode !== "dataview-inline") {
490
+ throw new RangeError(
491
+ 'activity.timeline.vault.properties.mode must be one of "off", "frontmatter", "dataview-inline"'
492
+ );
493
+ }
494
+ const prefix = optionalNonEmptyString(block.prefix, "activity.timeline.vault.properties.prefix") ?? "remnic_";
495
+ if (prefix.trim().length === 0 || prefix !== prefix.trim()) {
496
+ throw new RangeError("activity.timeline.vault.properties.prefix must be non-empty and trimmed");
497
+ }
498
+ return { mode, prefix };
499
+ }
500
+ function parseTimelineJournalConfig(raw) {
501
+ if (raw === void 0) return { enabled: false, source: "file" };
502
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
503
+ throw new TypeError("activity.timeline.journal must be an object");
504
+ }
505
+ const journal = raw;
506
+ const enabledValue = coerceBooleanLike(journal.enabled, "activity.timeline.journal.enabled");
507
+ if (journal.enabled !== void 0 && enabledValue === void 0) {
508
+ throw new TypeError("activity.timeline.journal.enabled must be a boolean");
509
+ }
510
+ const heading = journal.heading;
511
+ if (heading !== void 0 && typeof heading !== "string") {
512
+ throw new TypeError("activity.timeline.journal.heading must be a string");
513
+ }
514
+ const source = journal.source === void 0 ? "file" : typeof journal.source === "string" ? journal.source : "";
515
+ const resolved = resolveJournalSource({ source, heading: heading ?? "" });
516
+ if (!resolved.ok) {
517
+ if (resolved.error === "unknown_source") {
518
+ throw new RangeError('activity.timeline.journal.source must be one of "file", "vault"');
519
+ }
520
+ throw new RangeError('activity.timeline.journal.heading must be a non-empty string when source is "vault"');
521
+ }
522
+ if (resolved.mode === "vault") {
523
+ return { enabled: enabledValue ?? false, source: "vault", heading: resolved.heading };
524
+ }
525
+ return { enabled: enabledValue ?? false, source: "file" };
526
+ }
527
+ function parseTimelineQaConfig(raw) {
528
+ if (raw === void 0) return { enabled: false, maxRangeDays: 31 };
529
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
530
+ throw new TypeError("activity.timeline.qa must be an object");
531
+ }
532
+ const qa = raw;
533
+ const enabledValue = coerceBooleanLike(qa.enabled, "activity.timeline.qa.enabled");
534
+ if (qa.enabled !== void 0 && enabledValue === void 0) {
535
+ throw new TypeError("activity.timeline.qa.enabled must be a boolean");
536
+ }
537
+ const maxRangeDaysValue = coerceNumber(qa.maxRangeDays, "activity.timeline.qa.maxRangeDays");
538
+ if (qa.maxRangeDays !== void 0 && maxRangeDaysValue === void 0) {
539
+ throw new TypeError("activity.timeline.qa.maxRangeDays must be an integer from 1 to 366");
540
+ }
541
+ const maxRangeDays = maxRangeDaysValue ?? 31;
542
+ if (!Number.isInteger(maxRangeDays) || maxRangeDays < 1 || maxRangeDays > 366) {
543
+ throw new RangeError("activity.timeline.qa.maxRangeDays must be an integer from 1 to 366");
544
+ }
545
+ return { enabled: enabledValue ?? false, maxRangeDays };
546
+ }
547
+
548
+ export {
549
+ resolveJournalSource,
550
+ VAULT_TEMPLATE_TOKENS,
551
+ expandVaultTemplateTokens,
552
+ validateVaultNoteTemplate,
553
+ resolveVaultNotePath,
554
+ validateRegionName,
555
+ defaultActivityConfig,
556
+ validateActivityBaseUrl,
557
+ parseActivityConfig,
558
+ parseTimelineVaultConfig
559
+ };
560
+ //# sourceMappingURL=chunk-OGUKSLYZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/activity/vault-path.ts","../src/activity/vault-region.ts","../src/activity/config.ts","../src/activity/journal-source.ts"],"sourcesContent":["/**\n * Vault note path templates (issue #1985).\n *\n * Expands date tokens on a YYYY-MM-DD day. Returns a vault-relative path.\n * Rejects `..` segments, absolute templates, and unknown `{...}` tokens —\n * naming the token and the full valid set (never a silent pass-through).\n */\nimport path from \"node:path\";\n\nimport { assertValidTimezone, isValidActivityDate } from \"./digest.js\";\n\n/** Every token a vault template accepts (English names in v1). */\nexport const VAULT_TEMPLATE_TOKENS = [\n \"{yyyy}\",\n \"{yy}\",\n \"{M}\",\n \"{MM}\",\n \"{d}\",\n \"{dd}\",\n \"{ww}\",\n \"{MMM}\",\n \"{MMMM}\",\n \"{ddd}\",\n \"{dddd}\",\n] as const;\n\nexport type VaultTemplateToken = (typeof VAULT_TEMPLATE_TOKENS)[number];\n\nconst TOKEN_LOOKUP: Record<string, true> = Object.fromEntries(VAULT_TEMPLATE_TOKENS.map((t) => [t, true]));\n\nconst ANY_BRACED_RE = /\\{[^{}]*\\}/g;\n\nconst MONTH_NAMES = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n] as const;\n\nconst WEEKDAY_NAMES = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"] as const;\n\nfunction templateValues(date: string): Record<string, string> {\n const [yyyy, mm, dd] = date.split(\"-\");\n const monthIndex = Number(mm) - 1;\n const weekday = new Date(Date.UTC(Number(yyyy), monthIndex, Number(dd))).getUTCDay();\n return {\n \"{yyyy}\": yyyy,\n \"{yy}\": yyyy.slice(2),\n \"{MM}\": mm,\n \"{dd}\": dd,\n \"{M}\": String(Number(mm)),\n \"{d}\": String(Number(dd)),\n \"{ww}\": isoWeekNumber(date),\n \"{MMM}\": MONTH_NAMES[monthIndex]!.slice(0, 3),\n \"{MMMM}\": MONTH_NAMES[monthIndex]!,\n \"{ddd}\": WEEKDAY_NAMES[weekday]!.slice(0, 3),\n \"{dddd}\": WEEKDAY_NAMES[weekday]!,\n };\n}\n\n/**\n * Expand vault date tokens in any template text (a note path or a note\n * template body). Unknown `{...}` tokens are rejected naming the token and\n * the full valid set; an unreplaced token in a path would silently publish\n * to the wrong file.\n */\nexport function expandVaultTemplateTokens(text: string, date: string): string {\n if (!isValidActivityDate(date)) {\n throw new RangeError(`Invalid vault date \"${date}\"; expected YYYY-MM-DD.`);\n }\n if (typeof text !== \"string\" || text.length === 0) {\n throw new RangeError(\"Vault template must be a non-empty string.\");\n }\n const values = templateValues(date);\n return text.replace(ANY_BRACED_RE, (token) => {\n if (TOKEN_LOOKUP[token] === true) return values[token]!;\n throw new RangeError(\n `Unknown vault template token ${token}; valid tokens are ${VAULT_TEMPLATE_TOKENS.join(\" \")}.`,\n );\n });\n}\n\n/**\n * Validate a vault note path template without resolving it to a date:\n * token allow-list plus the relative/no-`..` shape checks shared with\n * `resolveVaultNotePath`.\n */\nexport function validateVaultNoteTemplate(template: string): void {\n if (typeof template !== \"string\" || template.length === 0) {\n throw new RangeError(\"Vault note path template must be a non-empty relative path.\");\n }\n if (path.posix.isAbsolute(template) || path.win32.isAbsolute(template)) {\n throw new RangeError(\"Vault note path template must be relative; absolute templates are rejected.\");\n }\n if (template.split(/[\\\\/]/).some((segment) => segment === \"..\")) {\n throw new RangeError(\"Vault note path template must not contain `..` segments.\");\n }\n expandVaultTemplateTokens(template, \"2026-01-04\");\n}\n\nexport function resolveVaultNotePath(\n template: string,\n date: string,\n options?: { timezone?: string },\n): string {\n if (!isValidActivityDate(date)) {\n throw new RangeError(`Invalid vault date \"${date}\"; expected YYYY-MM-DD.`);\n }\n if (options?.timezone !== undefined) {\n assertValidTimezone(options.timezone);\n }\n validateVaultNoteTemplate(template);\n\n const expanded = expandVaultTemplateTokens(template, date);\n if (path.posix.isAbsolute(expanded) || path.win32.isAbsolute(expanded)) {\n throw new RangeError(\"Vault note path template must be relative; absolute templates are rejected.\");\n }\n return expanded;\n}\n\nfunction isoWeekNumber(date: string): string {\n const [year, month, day] = date.split(\"-\").map(Number);\n const utc = new Date(Date.UTC(year, month - 1, day));\n const dayNum = utc.getUTCDay() || 7;\n utc.setUTCDate(utc.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(utc.getUTCFullYear(), 0, 1));\n const weekNo = Math.ceil(((utc.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n return String(weekNo).padStart(2, \"0\");\n}\n","/**\n * Validate a managed-region name for vault markers (issue #1985).\n *\n * Empty, whitespace-only, newline, and `-->` names are rejected so they\n * cannot break `<!-- remnic:<name>:start -->` markers. `:` is rejected\n * too: the marker grammar is colon-delimited, so a colon-bearing name\n * makes a marker line ambiguous (`remnic:A:B:start` reads as name `A:B`\n * or as name `A` with a `B:start` suffix) and a publisher that resolved\n * that ambiguity differently from the note's own markers would pair a\n * start with a later end and delete the user bytes in between.\n */\n\nexport type ValidateRegionNameResult =\n | { ok: true; name: string }\n | { ok: false; error: \"invalid_name\" };\n\nexport function validateRegionName(name: string): ValidateRegionNameResult {\n if (typeof name !== \"string\") {\n return { ok: false, error: \"invalid_name\" };\n }\n if (name.includes(\"\\n\") || name.includes(\"\\r\") || name.includes(\"-->\") || name.includes(\":\")) {\n return { ok: false, error: \"invalid_name\" };\n }\n const trimmed = name.trim();\n if (trimmed.length === 0) {\n return { ok: false, error: \"invalid_name\" };\n }\n return { ok: true, name: trimmed };\n}\n","import path from \"node:path\";\n\nimport { coerceBooleanLike, coerceNumber } from \"../connectors/coerce.js\";\nimport { assertValidTimezone } from \"./digest.js\";\nimport { resolveJournalSource } from \"./journal-source.js\";\nimport { validateVaultNoteTemplate } from \"./vault-path.js\";\nimport { validateRegionName } from \"./vault-region.js\";\nimport type {\n ActivityConfig,\n ActivityExtractionMode,\n ActivitySourceConfig,\n ActivityTimelineConfig,\n ActivityTimelineJournalConfig,\n ActivityTimelineQaConfig,\n ActivityTimelineVaultConfig,\n ActivityTimelineVaultTargetConfig,\n} from \"./types.js\";\nimport type { ImportanceLevel } from \"../types.js\";\n\nconst EXTRACTION_MODES: readonly ActivityExtractionMode[] = [\"off\", \"smart\"];\nconst IMPORTANCE_LEVELS: readonly ImportanceLevel[] = [\"critical\", \"high\", \"normal\", \"low\", \"trivial\"];\nconst LOOPBACK_HOSTS: Record<string, true> = { localhost: true, \"127.0.0.1\": true, \"::1\": true };\n\n/** The inert default: disabled, search-only, no sources, no extraction. */\nexport function defaultActivityConfig(): ActivityConfig {\n return {\n enabled: false,\n timezone: \"UTC\",\n syncDays: 1,\n autoSyncIntervalMinutes: 15,\n sources: [],\n extractionMode: \"off\",\n sourceTrust: 0.6,\n autoApproveTrust: 0.8,\n reviewTrust: 0.5,\n minConfidence: 0.7,\n minImportance: \"normal\",\n maxMemoriesPerDay: 0,\n timeline: {\n enabled: false,\n journal: { enabled: false, source: \"file\" },\n qa: { enabled: false, maxRangeDays: 31 },\n vault: parseTimelineVaultConfig(undefined),\n },\n };\n}\n\nfunction asRecord(value: unknown, name: string): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${name} must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction optionalString(value: unknown, name: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\" || value.length === 0) throw new TypeError(`${name} must be a non-empty string`);\n return value;\n}\n\nfunction parseUnitInterval(value: unknown, key: string, fallback: number): number {\n if (value === undefined) return fallback;\n const parsed = coerceNumber(value);\n if (parsed === undefined || !Number.isFinite(parsed) || parsed < 0 || parsed > 1) {\n throw new RangeError(`activity.${key} must be a number in [0, 1]`);\n }\n return parsed;\n}\n\n/**\n * Parse, protocol-check, and confine an activity source base URL to a local\n * loopback host. Shared with ActivityHttpSourceClient so config-load and client\n * construction reject the exact same shapes with the same prefixed message. The\n * bearer token travels in an Authorization header, so a non-loopback baseUrl\n * would exfiltrate it; the subsystem contract is local capture daemons only.\n */\nexport function validateActivityBaseUrl(baseUrl: string): URL {\n let parsed: URL;\n try {\n parsed = new URL(baseUrl);\n } catch {\n throw new RangeError(`activity source baseUrl must be a valid URL: ${baseUrl}`);\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new RangeError(\"activity source baseUrl must use HTTP or HTTPS\");\n }\n // URL keeps IPv6 hosts bracketed (e.g. \"[::1]\"); normalize before the lookup.\n const host = parsed.hostname.replace(/^\\[|\\]$/g, \"\");\n if (LOOPBACK_HOSTS[host] !== true && !/^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/.test(host)) {\n throw new RangeError(`activity source baseUrl must target a loopback host (got ${parsed.hostname})`);\n }\n return parsed;\n}\n\nfunction parseSource(value: unknown): ActivitySourceConfig {\n const raw = asRecord(value, \"activity source\");\n const machineLabel = optionalString(raw.machineLabel, \"activity source machineLabel\");\n const baseUrl = optionalString(raw.baseUrl, \"activity source baseUrl\");\n if (machineLabel === undefined || baseUrl === undefined) {\n throw new TypeError(\"activity source requires machineLabel and baseUrl\");\n }\n // Reject whitespace-only labels here so config-load fails loudly rather than\n // parsing clean and then failing on the first sync (the client and pipeline\n // both reject a blank label via trim()).\n if (machineLabel.trim().length === 0) {\n throw new RangeError(\"activity source machineLabel must not be blank\");\n }\n validateActivityBaseUrl(baseUrl);\n const token = optionalString(raw.token, \"activity source token\");\n return { machineLabel, baseUrl, ...(token === undefined ? {} : { token }) };\n}\n\n/**\n * Parse the unified `activity.*` block. `enabled` gates source ingestion (and\n * requires at least one source); `extractionMode` independently gates durable\n * trust-gated memory extraction (default `off`, i.e. search-only).\n */\nexport function parseActivityConfig(raw: unknown): ActivityConfig {\n const defaults = defaultActivityConfig();\n if (raw === undefined || raw === null) {\n return { ...defaults };\n }\n const config = asRecord(raw, \"activity\");\n const enabledValue = coerceBooleanLike(config.enabled, \"activity.enabled\");\n if (config.enabled !== undefined && enabledValue === undefined) {\n throw new TypeError(\"activity.enabled must be a boolean\");\n }\n const timezone = optionalString(config.timezone, \"activity.timezone\") ?? \"UTC\";\n // Validate the IANA zone at parse so a typo fails before any daemon is\n // contacted; otherwise activityDayWindow() throws mid-sync after snapshot\n // pages may already be persisted, and every retry replays the same window.\n assertValidTimezone(timezone);\n const syncDaysValue = coerceNumber(config.syncDays, \"activity.syncDays\");\n if (config.syncDays !== undefined && syncDaysValue === undefined) {\n throw new TypeError(\"activity.syncDays must be a finite number\");\n }\n const syncDays = syncDaysValue ?? 1;\n if (!Number.isInteger(syncDays) || syncDays < 1 || syncDays > 90) {\n throw new RangeError(\"activity.syncDays must be an integer from 1 to 90\");\n }\n const intervalValue = coerceNumber(config.autoSyncIntervalMinutes, \"activity.autoSyncIntervalMinutes\");\n if (config.autoSyncIntervalMinutes !== undefined && intervalValue === undefined) {\n throw new TypeError(\"activity.autoSyncIntervalMinutes must be a finite number\");\n }\n const autoSyncIntervalMinutes = intervalValue ?? 15;\n if (!Number.isInteger(autoSyncIntervalMinutes) || autoSyncIntervalMinutes < 1 || autoSyncIntervalMinutes > 1440) {\n throw new RangeError(\"activity.autoSyncIntervalMinutes must be an integer from 1 to 1440\");\n }\n if (config.sources !== undefined && !Array.isArray(config.sources)) {\n throw new TypeError(\"activity.sources must be an array\");\n }\n const sources = (config.sources ?? []).map(parseSource);\n // Cursors and row dedup are keyed on machineLabel alone; two sources sharing\n // a label would share a cursor and dedup namespace, silently skipping or\n // conflating snapshots. Reject the collision at parse.\n const labels = new Set<string>();\n for (const source of sources) {\n if (labels.has(source.machineLabel)) {\n throw new RangeError(`activity source machineLabel must be unique: ${source.machineLabel}`);\n }\n labels.add(source.machineLabel);\n }\n const enabled = enabledValue ?? false;\n if (enabled && sources.length === 0) throw new RangeError(\"activity.enabled requires at least one source\");\n\n // Extraction gate (independent of `enabled` ingestion). Default `off`.\n // Default only for a missing key; an explicit null/non-string is a malformed\n // enum and must fail rather than silently disabling extraction.\n const extractionMode = config.extractionMode === undefined ? defaults.extractionMode : config.extractionMode;\n if (typeof extractionMode !== \"string\" || !EXTRACTION_MODES.includes(extractionMode as ActivityExtractionMode)) {\n throw new RangeError(`activity.extractionMode must be one of: ${EXTRACTION_MODES.join(\", \")}`);\n }\n const minImportance = config.minImportance === undefined ? defaults.minImportance : config.minImportance;\n if (typeof minImportance !== \"string\" || !IMPORTANCE_LEVELS.includes(minImportance as ImportanceLevel)) {\n throw new RangeError(`activity.minImportance must be one of: ${IMPORTANCE_LEVELS.join(\", \")}`);\n }\n // Default only for a missing key; an explicit null/unparseable value must fail\n // rather than silently uncapping (parity with the enum/unit-interval fields).\n const rawMaxMemoriesPerDay =\n config.maxMemoriesPerDay === undefined ? defaults.maxMemoriesPerDay : config.maxMemoriesPerDay;\n const maxMemoriesPerDay = coerceNumber(rawMaxMemoriesPerDay);\n if (maxMemoriesPerDay === undefined || !Number.isInteger(maxMemoriesPerDay) || maxMemoriesPerDay < 0) {\n throw new RangeError(\"activity.maxMemoriesPerDay must be a non-negative integer\");\n }\n const autoApproveTrust = parseUnitInterval(config.autoApproveTrust, \"autoApproveTrust\", defaults.autoApproveTrust);\n const reviewTrust = parseUnitInterval(config.reviewTrust, \"reviewTrust\", defaults.reviewTrust);\n if (reviewTrust >= autoApproveTrust) {\n throw new RangeError(\n `activity.reviewTrust (${reviewTrust}) must be below autoApproveTrust (${autoApproveTrust})`,\n );\n }\n return {\n enabled,\n timezone,\n syncDays,\n autoSyncIntervalMinutes,\n sources,\n extractionMode: extractionMode as ActivityExtractionMode,\n sourceTrust: parseUnitInterval(config.sourceTrust, \"sourceTrust\", defaults.sourceTrust),\n autoApproveTrust,\n reviewTrust,\n minConfidence: parseUnitInterval(config.minConfidence, \"minConfidence\", defaults.minConfidence),\n minImportance: minImportance as ImportanceLevel,\n maxMemoriesPerDay,\n timeline: parseTimelineConfig(config.timeline),\n };\n}\n\n/**\n * Parse the `activity.timeline.*` block. `enabled` is the master gate for\n * timeline-card derivation (issue #2049); default false. A non-object block\n * is malformed and must fail rather than silently disabling the layer.\n */\nfunction parseTimelineConfig(raw: unknown): ActivityTimelineConfig {\n if (raw === undefined) {\n return {\n enabled: false,\n journal: { enabled: false, source: \"file\" },\n qa: parseTimelineQaConfig(undefined),\n vault: parseTimelineVaultConfig(undefined),\n };\n }\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline must be an object\");\n }\n const timeline = raw as Record<string, unknown>;\n const enabledValue = coerceBooleanLike(timeline.enabled, \"activity.timeline.enabled\");\n if (timeline.enabled !== undefined && enabledValue === undefined) {\n throw new TypeError(\"activity.timeline.enabled must be a boolean\");\n }\n return {\n enabled: enabledValue ?? false,\n journal: parseTimelineJournalConfig(timeline.journal),\n qa: parseTimelineQaConfig(timeline.qa),\n vault: parseTimelineVaultConfig(timeline.vault),\n };\n}\n\n/**\n * Parse the `activity.timeline.vault.*` block (issue #1985). Default off.\n * Invalid values are rejected at parse time naming the missing or invalid\n * prerequisite — never silently defaulted.\n */\nexport function parseTimelineVaultConfig(raw: unknown): ActivityTimelineVaultConfig {\n if (raw === undefined) return defaultVaultConfig();\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.vault must be an object\");\n }\n const vault = raw as Record<string, unknown>;\n const enabled = requireBool(vault.enabled, \"activity.timeline.vault.enabled\", false);\n const createMissingNotes = requireBool(vault.createMissingNotes, \"activity.timeline.vault.createMissingNotes\", false);\n const autoPublish = requireBool(vault.autoPublish, \"activity.timeline.vault.autoPublish\", true);\n const vaultPath = optionalNonEmptyString(vault.vaultPath, \"activity.timeline.vault.vaultPath\") ?? \"\";\n const dailyNotePath =\n optionalNonEmptyString(vault.dailyNotePath, \"activity.timeline.vault.dailyNotePath\") ?? \"{yyyy}-{MM}-{dd}.md\";\n const weeklyNotePath = optionalNonEmptyString(vault.weeklyNotePath, \"activity.timeline.vault.weeklyNotePath\") ?? \"\";\n const noteTemplate = optionalNonEmptyString(vault.noteTemplate, \"activity.timeline.vault.noteTemplate\") ?? \"\";\n const insertUnderHeading =\n optionalNonEmptyString(vault.insertUnderHeading, \"activity.timeline.vault.insertUnderHeading\") ?? \"\";\n\n if (typeof vault.sectionStrategy !== \"undefined\" && typeof vault.sectionStrategy !== \"string\") {\n throw new TypeError(\"activity.timeline.vault.sectionStrategy must be a string\");\n }\n const sectionStrategy = (vault.sectionStrategy as string | undefined) ?? \"markers\";\n if (sectionStrategy !== \"markers\" && sectionStrategy !== \"heading\") {\n throw new RangeError('activity.timeline.vault.sectionStrategy must be one of \"markers\", \"heading\"');\n }\n\n // The documented `vaultPath` contract: absolute on the host platform, or\n // `~` / `~`-rooted for `expandTildePath`. Everything else — `.`, `vault`,\n // `../notes`, whitespace — is relative and would resolve against whatever\n // directory the daemon or CLI happened to launch from, so an enabled vault\n // rejects it at parse time.\n const tildeRooted = vaultPath === \"~\" || vaultPath.startsWith(\"~/\") || vaultPath.startsWith(\"~\\\\\");\n if (enabled && (vaultPath.trim().length === 0 || (!tildeRooted && !path.isAbsolute(vaultPath)))) {\n throw new RangeError(\n \"activity.timeline.vault.vaultPath must be an absolute or `~`-rooted path when activity.timeline.vault.enabled is true; \" +\n `a relative path resolves against the process working directory (got ${JSON.stringify(vaultPath)})`,\n );\n }\n try {\n validateVaultNoteTemplate(dailyNotePath);\n } catch (err) {\n throw new RangeError(`activity.timeline.vault.dailyNotePath: ${(err as Error).message}`);\n }\n if (weeklyNotePath.length > 0) {\n try {\n validateVaultNoteTemplate(weeklyNotePath);\n } catch (err) {\n throw new RangeError(`activity.timeline.vault.weeklyNotePath: ${(err as Error).message}`);\n }\n }\n if (createMissingNotes) {\n if (noteTemplate.length === 0) {\n throw new RangeError(\n \"activity.timeline.vault.noteTemplate must name a vault-relative template file when activity.timeline.vault.createMissingNotes is true\",\n );\n }\n try {\n validateVaultNoteTemplate(noteTemplate);\n } catch (err) {\n throw new RangeError(`activity.timeline.vault.noteTemplate: ${(err as Error).message}`);\n }\n }\n\n const publish = parseVaultPublishBlock(vault.publish, weeklyNotePath);\n const wikilinksRaw = vault.wikilinks;\n const wikilinks =\n wikilinksRaw === undefined\n ? { places: false, placesFolder: \"Places\" }\n : parseVaultWikilinks(wikilinksRaw);\n const propertiesRaw = vault.properties;\n const properties: ActivityTimelineVaultConfig[\"properties\"] =\n propertiesRaw === undefined ? { mode: \"off\", prefix: \"remnic_\" } : parseVaultProperties(propertiesRaw);\n\n return {\n enabled,\n vaultPath,\n dailyNotePath,\n weeklyNotePath,\n createMissingNotes,\n noteTemplate,\n sectionStrategy,\n publish,\n insertUnderHeading,\n wikilinks,\n properties,\n autoPublish,\n };\n}\n\nfunction defaultVaultConfig(): ActivityTimelineVaultConfig {\n return {\n enabled: false,\n vaultPath: \"\",\n dailyNotePath: \"{yyyy}-{MM}-{dd}.md\",\n weeklyNotePath: \"\",\n createMissingNotes: false,\n noteTemplate: \"\",\n sectionStrategy: \"markers\",\n publish: {\n timeline: { enabled: true, target: \"daily\", section: \"Timeline\" },\n standup: { enabled: false, target: \"daily\", section: \"Standup\" },\n weekly: { enabled: false, target: \"weekly\", section: \"Weekly Review\" },\n locations: { enabled: false, target: \"daily\", section: \"Locations\" },\n },\n insertUnderHeading: \"\",\n wikilinks: { places: false, placesFolder: \"Places\" },\n properties: { mode: \"off\", prefix: \"remnic_\" },\n autoPublish: true,\n };\n}\n\nfunction requireBool(value: unknown, key: string, fallback: boolean): boolean {\n const coerced = coerceBooleanLike(value, key);\n if (value === undefined) return fallback;\n if (coerced === undefined) {\n throw new TypeError(`${key} must be a boolean`);\n }\n return coerced;\n}\n\nfunction optionalNonEmptyString(value: unknown, key: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\") {\n throw new TypeError(`${key} must be a string`);\n }\n return value;\n}\n\nfunction parseVaultPublishBlock(\n raw: unknown,\n weeklyNotePath: string,\n): ActivityTimelineVaultConfig[\"publish\"] {\n const defaults = defaultVaultConfig().publish;\n if (raw === undefined) return defaults;\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.vault.publish must be an object\");\n }\n const block = raw as Record<string, unknown>;\n // Each kind is read at its literal path so the config-contract extractor\n // can attribute publish.<kind>.<leaf> to real parse sites (§40).\n const publish = {\n timeline: parseVaultTarget(block.timeline, \"timeline\", defaults.timeline, weeklyNotePath),\n standup: parseVaultTarget(block.standup, \"standup\", defaults.standup, weeklyNotePath),\n weekly: parseVaultTarget(block.weekly, \"weekly\", defaults.weekly, weeklyNotePath),\n locations: parseVaultTarget(block.locations, \"locations\", defaults.locations, weeklyNotePath),\n };\n for (const targetFile of [\"daily\", \"weekly\"] as const) {\n const sections = ([\"timeline\", \"standup\", \"weekly\", \"locations\"] as const)\n .filter((kind) => publish[kind].target === targetFile && publish[kind].enabled)\n .map((kind) => publish[kind].section);\n const duplicates = sections.filter((section, index) => sections.indexOf(section) !== index);\n if (duplicates.length > 0) {\n throw new RangeError(\n `activity.timeline.vault.publish section names must be unique per target file; duplicate ${targetFile} section(s): ${[...new Set(duplicates)].join(\", \")}`,\n );\n }\n }\n return publish;\n}\n\nfunction parseVaultTarget(\n raw: unknown,\n kind: string,\n fallback: ActivityTimelineVaultTargetConfig,\n weeklyNotePath: string,\n): ActivityTimelineVaultTargetConfig {\n if (raw === undefined) return fallback;\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(`activity.timeline.vault.publish.${kind} must be an object`);\n }\n const entry = raw as Record<string, unknown>;\n const enabled = requireBool(entry.enabled, `activity.timeline.vault.publish.${kind}.enabled`, fallback.enabled);\n const target = entry.target === undefined ? fallback.target : entry.target;\n if (target !== \"daily\" && target !== \"weekly\") {\n throw new RangeError(`activity.timeline.vault.publish.${kind}.target must be one of \"daily\", \"weekly\"`);\n }\n const section = entry.section === undefined ? fallback.section : entry.section;\n if (typeof section !== \"string\" || section.trim().length === 0 || section !== section.trim()) {\n throw new RangeError(`activity.timeline.vault.publish.${kind}.section must be a non-empty trimmed string`);\n }\n // The accepted config domain must equal what the publisher accepts: a name\n // containing `-->` or a line break passes the trimmed-string check above\n // but is rejected downstream by `publishVaultNote`, which would turn an\n // apparently valid config into a runtime failure.\n if (!validateRegionName(section).ok) {\n throw new RangeError(\n `activity.timeline.vault.publish.${kind}.section must not contain a line break or \"-->\"`,\n );\n }\n // The path is required only by an entry that will actually publish to the\n // weekly file; a disabled entry must load the same whether its object is\n // explicit (serialized schema default) or omitted entirely.\n if (enabled && target === \"weekly\" && weeklyNotePath.length === 0) {\n throw new RangeError(\n `activity.timeline.vault.publish.${kind}.target is \"weekly\" but activity.timeline.vault.weeklyNotePath is empty; configure weeklyNotePath first`,\n );\n }\n return { enabled, target, section };\n}\n\nfunction parseVaultWikilinks(raw: unknown): ActivityTimelineVaultConfig[\"wikilinks\"] {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.vault.wikilinks must be an object\");\n }\n const block = raw as Record<string, unknown>;\n const places = requireBool(block.places, \"activity.timeline.vault.wikilinks.places\", false);\n const placesFolder =\n optionalNonEmptyString(block.placesFolder, \"activity.timeline.vault.wikilinks.placesFolder\") ?? \"Places\";\n return { places, placesFolder };\n}\n\nfunction parseVaultProperties(raw: unknown): ActivityTimelineVaultConfig[\"properties\"] {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.vault.properties must be an object\");\n }\n const block = raw as Record<string, unknown>;\n const mode = block.mode === undefined ? \"off\" : block.mode;\n if (mode !== \"off\" && mode !== \"frontmatter\" && mode !== \"dataview-inline\") {\n throw new RangeError(\n 'activity.timeline.vault.properties.mode must be one of \"off\", \"frontmatter\", \"dataview-inline\"',\n );\n }\n const prefix = optionalNonEmptyString(block.prefix, \"activity.timeline.vault.properties.prefix\") ?? \"remnic_\";\n if (prefix.trim().length === 0 || prefix !== prefix.trim()) {\n throw new RangeError(\"activity.timeline.vault.properties.prefix must be non-empty and trimmed\");\n }\n return { mode, prefix };\n}\n\nfunction parseTimelineJournalConfig(raw: unknown): ActivityTimelineJournalConfig {\n if (raw === undefined) return { enabled: false, source: \"file\" };\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.journal must be an object\");\n }\n const journal = raw as Record<string, unknown>;\n const enabledValue = coerceBooleanLike(journal.enabled, \"activity.timeline.journal.enabled\");\n if (journal.enabled !== undefined && enabledValue === undefined) {\n throw new TypeError(\"activity.timeline.journal.enabled must be a boolean\");\n }\n const heading = journal.heading;\n if (heading !== undefined && typeof heading !== \"string\") {\n throw new TypeError(\"activity.timeline.journal.heading must be a string\");\n }\n const source = journal.source === undefined ? \"file\" : typeof journal.source === \"string\" ? journal.source : \"\";\n const resolved = resolveJournalSource({ source, heading: heading ?? \"\" });\n if (!resolved.ok) {\n if (resolved.error === \"unknown_source\") {\n throw new RangeError('activity.timeline.journal.source must be one of \"file\", \"vault\"');\n }\n throw new RangeError('activity.timeline.journal.heading must be a non-empty string when source is \"vault\"');\n }\n if (resolved.mode === \"vault\") {\n return { enabled: enabledValue ?? false, source: \"vault\", heading: resolved.heading };\n }\n return { enabled: enabledValue ?? false, source: \"file\" };\n}\n\nfunction parseTimelineQaConfig(raw: unknown): ActivityTimelineQaConfig {\n if (raw === undefined) return { enabled: false, maxRangeDays: 31 };\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new TypeError(\"activity.timeline.qa must be an object\");\n }\n const qa = raw as Record<string, unknown>;\n const enabledValue = coerceBooleanLike(qa.enabled, \"activity.timeline.qa.enabled\");\n if (qa.enabled !== undefined && enabledValue === undefined) {\n throw new TypeError(\"activity.timeline.qa.enabled must be a boolean\");\n }\n const maxRangeDaysValue = coerceNumber(qa.maxRangeDays, \"activity.timeline.qa.maxRangeDays\");\n if (qa.maxRangeDays !== undefined && maxRangeDaysValue === undefined) {\n throw new TypeError(\"activity.timeline.qa.maxRangeDays must be an integer from 1 to 366\");\n }\n const maxRangeDays = maxRangeDaysValue ?? 31;\n if (!Number.isInteger(maxRangeDays) || maxRangeDays < 1 || maxRangeDays > 366) {\n throw new RangeError(\"activity.timeline.qa.maxRangeDays must be an integer from 1 to 366\");\n }\n return { enabled: enabledValue ?? false, maxRangeDays };\n}\n\n","/**\n * Resolve journal source mode (issue #1987 leftover).\n *\n * Pure. File mode ignores heading. Vault mode needs a non-empty heading.\n */\n\nexport type JournalSourceResult =\n | { ok: true; mode: \"file\" }\n | { ok: true; mode: \"vault\"; heading: string }\n | { ok: false; error: \"missing_heading\" | \"unknown_source\" };\n\nexport function resolveJournalSource(input: {\n source: string;\n heading: string;\n}): JournalSourceResult {\n if (input.source === \"file\") return { ok: true, mode: \"file\" };\n if (input.source === \"vault\") {\n const heading = input.heading.trim();\n if (heading.length === 0) return { ok: false, error: \"missing_heading\" };\n return { ok: true, mode: \"vault\", heading };\n }\n return { ok: false, error: \"unknown_source\" };\n}\n"],"mappings":"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","names":["path","path"]}