@remnic/core 9.65.8 → 9.66.0

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 (637) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -12
  2. package/dist/access-admin-ops-surface.js +49 -46
  3. package/dist/access-authorization-probe.d.ts +11 -12
  4. package/dist/access-authorization-probe.js +50 -47
  5. package/dist/access-boundary.d.ts +11 -12
  6. package/dist/access-boundary.js +49 -46
  7. package/dist/access-citation-namespace.js +3 -3
  8. package/dist/access-cli.js +111 -106
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +1 -2
  11. package/dist/access-coding-context-resolution.js +2 -2
  12. package/dist/access-extraction-force-flush.d.ts +11 -12
  13. package/dist/access-extraction-force-flush.js +49 -46
  14. package/dist/access-health-types.d.ts +1 -2
  15. package/dist/access-http-lcm-compaction.d.ts +11 -12
  16. package/dist/access-http-lifecycle-flush.d.ts +11 -12
  17. package/dist/access-http-offline-stream.d.ts +11 -12
  18. package/dist/access-http-query.d.ts +2 -3
  19. package/dist/access-http-query.js +51 -48
  20. package/dist/access-http.d.ts +12 -13
  21. package/dist/access-http.js +68 -65
  22. package/dist/access-identity-continuity-surface.d.ts +9 -10
  23. package/dist/access-identity-continuity-surface.js +49 -46
  24. package/dist/access-lcm-surface.d.ts +11 -12
  25. package/dist/access-lcm-surface.js +49 -46
  26. package/dist/access-mcp-output-schemas.js +1 -1
  27. package/dist/access-mcp.d.ts +11 -12
  28. package/dist/access-mcp.js +62 -59
  29. package/dist/access-memory-search-fanout.d.ts +2 -3
  30. package/dist/{access-namespace-preflight-CpAOrS-9.d.ts → access-namespace-preflight-CLWUoMyW.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +3 -4
  32. package/dist/access-namespace-preflight.js +49 -46
  33. package/dist/access-observe-write-surface.d.ts +11 -12
  34. package/dist/access-observe-write-surface.js +49 -46
  35. package/dist/access-offline-manifest.d.ts +9 -10
  36. package/dist/access-offline-manifest.js +15 -15
  37. package/dist/access-operations-batch.js +54 -51
  38. package/dist/access-operations.d.ts +17 -18
  39. package/dist/access-operations.js +59 -56
  40. package/dist/access-recall-concurrency.d.ts +11 -12
  41. package/dist/access-recall-concurrency.js +49 -46
  42. package/dist/access-recall-response.d.ts +11 -12
  43. package/dist/access-recall-response.js +49 -46
  44. package/dist/access-recall-surface.d.ts +11 -12
  45. package/dist/access-recall-surface.js +49 -46
  46. package/dist/access-schema.d.ts +83 -83
  47. package/dist/access-schema.js +7 -7
  48. package/dist/{access-service-Diu61Cfv.d.ts → access-service-CEUE1Isj.d.ts} +66 -66
  49. package/dist/access-service-helpers.d.ts +11 -12
  50. package/dist/access-service.d.ts +11 -12
  51. package/dist/access-service.js +49 -46
  52. package/dist/access-surface-catalog.d.ts +11 -12
  53. package/dist/access-surface-catalog.js +53 -48
  54. package/dist/access-surface-catalog.js.map +1 -1
  55. package/dist/access-wearables-meetings-surface.d.ts +3 -4
  56. package/dist/action-confidence.d.ts +1 -2
  57. package/dist/active-memory-bridge.d.ts +1 -2
  58. package/dist/active-memory-bridge.js +2 -2
  59. package/dist/active-recall.d.ts +1 -2
  60. package/dist/active-recall.js +11 -11
  61. package/dist/ambient-provenance.d.ts +1 -2
  62. package/dist/artifact-search.d.ts +1 -2
  63. package/dist/{auto-sync-2YPITIWN.js → auto-sync-Q6Q2FVSC.js} +9 -9
  64. package/dist/behavior-learner.d.ts +1 -2
  65. package/dist/behavior-signals.d.ts +1 -2
  66. package/dist/bootstrap.d.ts +9 -10
  67. package/dist/briefing-window.d.ts +2 -3
  68. package/dist/briefing.d.ts +2 -3
  69. package/dist/briefing.js +23 -23
  70. package/dist/buffer-surprise-report.d.ts +1 -2
  71. package/dist/buffer-turn-helpers.d.ts +1 -2
  72. package/dist/buffer.d.ts +2 -3
  73. package/dist/buffer.js +20 -4
  74. package/dist/bulk-import/index.d.ts +3 -4
  75. package/dist/calibration.d.ts +1 -2
  76. package/dist/calibration.js +1 -1
  77. package/dist/capabilities.d.ts +1 -2
  78. package/dist/{capsule-merge-SGIVB3WA.js → capsule-merge-SEHERWWP.js} +4 -4
  79. package/dist/{catalog-9f-vEQLS.d.ts → catalog-D1HgugTA.d.ts} +1 -1
  80. package/dist/causal-behavior.d.ts +1 -2
  81. package/dist/causal-consolidation.d.ts +1 -2
  82. package/dist/causal-consolidation.js +24 -24
  83. package/dist/causal-trajectory-graph.d.ts +1 -2
  84. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  85. package/dist/{chunk-NPFUNWNX.js → chunk-23CVL7HS.js} +2 -2
  86. package/dist/{chunk-PO7NXBG2.js → chunk-2GF27PGH.js} +5 -5
  87. package/dist/{chunk-MY2BC6UE.js → chunk-2LBAFHOQ.js} +11 -11
  88. package/dist/{chunk-AZMLH5UT.js → chunk-33MFRY25.js} +2 -2
  89. package/dist/{chunk-UEBDCMOO.js → chunk-3TSU662L.js} +3 -3
  90. package/dist/{chunk-CAMNRAJF.js → chunk-4FHRZD5T.js} +2 -2
  91. package/dist/{chunk-FP7YTTVO.js → chunk-4OFKZAJG.js} +2 -1
  92. package/dist/chunk-4OFKZAJG.js.map +1 -0
  93. package/dist/{chunk-S5XOSTYM.js → chunk-4STAANV7.js} +3 -3
  94. package/dist/{chunk-LKYIOCWL.js → chunk-56IV4J5W.js} +546 -96
  95. package/dist/chunk-56IV4J5W.js.map +1 -0
  96. package/dist/{chunk-4F4AQFWL.js → chunk-6CEGSTBD.js} +10 -10
  97. package/dist/{chunk-JYSN42VN.js → chunk-6QDXA26G.js} +235 -181
  98. package/dist/chunk-6QDXA26G.js.map +1 -0
  99. package/dist/{chunk-MDD2RINF.js → chunk-6RUHELWR.js} +3 -3
  100. package/dist/{chunk-WNXYT4MK.js → chunk-72OIT7KS.js} +4 -4
  101. package/dist/{chunk-KQAFEZQX.js → chunk-7LCGFUMB.js} +4 -4
  102. package/dist/{chunk-SNOIKAHM.js → chunk-7UTDHQZ5.js} +3 -3
  103. package/dist/{chunk-5HK3CJAR.js → chunk-7XOG75AU.js} +3 -3
  104. package/dist/{chunk-7BDZTALN.js → chunk-AJTG3CP7.js} +12 -2
  105. package/dist/chunk-AJTG3CP7.js.map +1 -0
  106. package/dist/{chunk-2LWQSV6A.js → chunk-AL3UYZ5N.js} +3 -2
  107. package/dist/chunk-AL3UYZ5N.js.map +1 -0
  108. package/dist/{chunk-UPFNQJC7.js → chunk-CN4VKV3S.js} +2 -2
  109. package/dist/{chunk-PMVPCZJZ.js → chunk-CTCGHNWN.js} +6 -6
  110. package/dist/{chunk-EGBDFJ36.js → chunk-DD5JFCWM.js} +2 -2
  111. package/dist/{chunk-XBGHAAKR.js → chunk-DDX6KIXF.js} +2 -2
  112. package/dist/{chunk-JIYDRBVZ.js → chunk-DJORULH3.js} +2 -2
  113. package/dist/{chunk-UENKPWCS.js → chunk-DMEHOEC7.js} +6 -6
  114. package/dist/{chunk-7KQB4EBS.js → chunk-DUAJKRR2.js} +2 -2
  115. package/dist/{chunk-XDL5CYZN.js → chunk-EEOUMG3J.js} +2 -1
  116. package/dist/{chunk-XDL5CYZN.js.map → chunk-EEOUMG3J.js.map} +1 -1
  117. package/dist/{chunk-SEEJOGQX.js → chunk-EFQCDJZ2.js} +4 -4
  118. package/dist/{chunk-Q57GOHLF.js → chunk-EGALNSZ4.js} +3 -3
  119. package/dist/{chunk-KCT36JAW.js → chunk-ESNFSSO4.js} +2 -2
  120. package/dist/{chunk-XQ3HXAQH.js → chunk-ET2CNMLD.js} +4 -4
  121. package/dist/{chunk-PU56CXZA.js → chunk-EZSCW4EM.js} +2 -2
  122. package/dist/{chunk-HMZKGHMD.js → chunk-FESUGFIL.js} +3 -3
  123. package/dist/{chunk-3A2NJP2U.js → chunk-FKKGCGYL.js} +3 -3
  124. package/dist/{chunk-BWGCOLEL.js → chunk-FTTJRVB7.js} +2 -2
  125. package/dist/{chunk-ODU2CNNX.js → chunk-FYWLSFFS.js} +2 -2
  126. package/dist/{chunk-W2BAGGEW.js → chunk-GEJKYA7D.js} +33 -24
  127. package/dist/{chunk-W2BAGGEW.js.map → chunk-GEJKYA7D.js.map} +1 -1
  128. package/dist/chunk-GSKINLAK.js +267 -0
  129. package/dist/chunk-GSKINLAK.js.map +1 -0
  130. package/dist/{chunk-3PKAS6VL.js → chunk-GX6FTSYH.js} +2 -2
  131. package/dist/{chunk-76DIF5KT.js → chunk-H7VDIF2V.js} +2 -2
  132. package/dist/{chunk-F7XUD3PL.js → chunk-HJXA6ZM7.js} +2 -2
  133. package/dist/{chunk-4QEYREAV.js → chunk-HNPE66LB.js} +2 -2
  134. package/dist/{chunk-P36Z4JRA.js → chunk-I5VB44ZK.js} +2 -2
  135. package/dist/{chunk-EUYWQ7TS.js → chunk-IEZ6CGTW.js} +2 -2
  136. package/dist/{chunk-OXRRJXPR.js → chunk-IHGMRDEE.js} +275 -1678
  137. package/dist/chunk-IHGMRDEE.js.map +1 -0
  138. package/dist/{chunk-5DHKCO52.js → chunk-IVIAHQBR.js} +2 -2
  139. package/dist/{chunk-TFR3HG4K.js → chunk-J3OND5QT.js} +4 -4
  140. package/dist/{chunk-UW5NPZJ2.js → chunk-JALOAKSZ.js} +59 -7
  141. package/dist/chunk-JALOAKSZ.js.map +1 -0
  142. package/dist/{chunk-5ACCD4L7.js → chunk-JRRQ747T.js} +7 -7
  143. package/dist/{chunk-V4IDF3EZ.js → chunk-JTWZKNUH.js} +5 -5
  144. package/dist/chunk-K66OY4EI.js +202 -0
  145. package/dist/chunk-K66OY4EI.js.map +1 -0
  146. package/dist/{chunk-XAB6STPO.js → chunk-KODXCHXJ.js} +17 -3
  147. package/dist/chunk-KODXCHXJ.js.map +1 -0
  148. package/dist/{chunk-KZIF6XHX.js → chunk-KXIXO76C.js} +28 -15
  149. package/dist/chunk-KXIXO76C.js.map +1 -0
  150. package/dist/{chunk-5RWZH6PH.js → chunk-L4X4PJYK.js} +2 -2
  151. package/dist/{chunk-UTQUEHC7.js → chunk-LUDBXTBJ.js} +8 -8
  152. package/dist/{chunk-XNWXSGHS.js → chunk-MAH64N55.js} +28 -10
  153. package/dist/chunk-MAH64N55.js.map +1 -0
  154. package/dist/{chunk-LDKPDODJ.js → chunk-ME35HVDJ.js} +2 -2
  155. package/dist/{chunk-DPCXDG7G.js → chunk-MJRGVXPQ.js} +2 -2
  156. package/dist/{chunk-773TRRGT.js → chunk-MJUCDM3C.js} +2 -2
  157. package/dist/{chunk-T6ILXUAH.js → chunk-MN5NOOI7.js} +2 -2
  158. package/dist/{chunk-AHPIFKNG.js → chunk-N4F7ZSSG.js} +2 -2
  159. package/dist/{chunk-JOZUBF4A.js → chunk-NACLNNFQ.js} +2 -2
  160. package/dist/{chunk-LC2BDILZ.js → chunk-NBP4EX5N.js} +2 -2
  161. package/dist/{chunk-ZVPVTPGI.js → chunk-NNZFPYYX.js} +4 -4
  162. package/dist/{chunk-DA7ITC5Z.js → chunk-O57GM3FR.js} +2 -2
  163. package/dist/{chunk-7VZFRUQU.js → chunk-O7ERGZDA.js} +5 -5
  164. package/dist/{chunk-3SZD4CYO.js → chunk-OAJMQKQR.js} +3 -3
  165. package/dist/{chunk-HSZMX3ZJ.js → chunk-ODW5GDFE.js} +2 -2
  166. package/dist/{chunk-7WOWGRAU.js → chunk-PEBH5DCK.js} +10 -7
  167. package/dist/{chunk-7WOWGRAU.js.map → chunk-PEBH5DCK.js.map} +1 -1
  168. package/dist/{chunk-J2WC5LF4.js → chunk-QBC33MPY.js} +2 -1
  169. package/dist/{chunk-T7XP6IZE.js → chunk-QCRJMU5V.js} +2 -2
  170. package/dist/chunk-QJCWK2A7.js +1466 -0
  171. package/dist/chunk-QJCWK2A7.js.map +1 -0
  172. package/dist/{chunk-YEUXERJ6.js → chunk-RDGKVH6T.js} +7 -3
  173. package/dist/{chunk-YEUXERJ6.js.map → chunk-RDGKVH6T.js.map} +1 -1
  174. package/dist/{chunk-OA2O2GJ4.js → chunk-RZ3IZIJG.js} +3 -3
  175. package/dist/{chunk-UL4MKZHI.js → chunk-SN4JXNLL.js} +2 -2
  176. package/dist/chunk-TB2MJRI6.js +866 -0
  177. package/dist/chunk-TB2MJRI6.js.map +1 -0
  178. package/dist/{chunk-7PHI6GUI.js → chunk-TEZ2HTC7.js} +42 -2
  179. package/dist/chunk-TEZ2HTC7.js.map +1 -0
  180. package/dist/{chunk-CPA5NBHN.js → chunk-TNGH4ZYI.js} +2 -2
  181. package/dist/{chunk-F3NVYTTA.js → chunk-TNXNECAN.js} +6 -6
  182. package/dist/{chunk-BEC4YBNA.js → chunk-TVW4C7PV.js} +2 -2
  183. package/dist/{chunk-UFKPQBXH.js → chunk-U62OK7BB.js} +2 -2
  184. package/dist/{chunk-AX7UXCHJ.js → chunk-UYA36DQ7.js} +2 -1
  185. package/dist/chunk-UYA36DQ7.js.map +1 -0
  186. package/dist/{chunk-DEACDKE3.js → chunk-VCKWULAK.js} +112 -87
  187. package/dist/chunk-VCKWULAK.js.map +1 -0
  188. package/dist/chunk-VOSWUO3K.js +100 -0
  189. package/dist/chunk-VOSWUO3K.js.map +1 -0
  190. package/dist/{chunk-TUHBYJXL.js → chunk-VQ4AMTGZ.js} +1 -1
  191. package/dist/{chunk-3BCULS4U.js → chunk-VQNRICAQ.js} +145 -507
  192. package/dist/chunk-VQNRICAQ.js.map +1 -0
  193. package/dist/{chunk-H2YSH3DG.js → chunk-WKAXBXVA.js} +2 -2
  194. package/dist/{chunk-HRHO3ZNG.js → chunk-WKJFIMVN.js} +2 -2
  195. package/dist/{chunk-SXIMQLGV.js → chunk-WVGXCBOC.js} +2 -2
  196. package/dist/{chunk-CRML27CO.js → chunk-X5YYSAZX.js} +4 -4
  197. package/dist/{chunk-FZEEWOI2.js → chunk-XJJYSX6F.js} +2 -2
  198. package/dist/{chunk-U7EW2W4W.js → chunk-XKNHFDTT.js} +26 -6
  199. package/dist/chunk-XKNHFDTT.js.map +1 -0
  200. package/dist/{chunk-UG6VXIOK.js → chunk-XSTNGNJP.js} +2 -2
  201. package/dist/{chunk-YDPAE2RD.js → chunk-YFLLGRXO.js} +2 -2
  202. package/dist/{chunk-LPNCR4QK.js → chunk-YXFCALVT.js} +12 -12
  203. package/dist/{chunk-Q4WONDMJ.js → chunk-YYGZJPOK.js} +2 -2
  204. package/dist/{chunk-GTO56JY5.js → chunk-ZJPM7GZ3.js} +2 -2
  205. package/dist/{chunk-LOXHYCVS.js → chunk-ZW4VXELZ.js} +2 -2
  206. package/dist/{cli-O3F-ht3i.d.ts → cli-BEkm2MEf.d.ts} +5 -5
  207. package/dist/cli.d.ts +13 -14
  208. package/dist/cli.js +90 -85
  209. package/dist/coding/export-okf-codegraph.d.ts +56 -0
  210. package/dist/coding/export-okf-codegraph.js +526 -0
  211. package/dist/coding/export-okf-codegraph.js.map +1 -0
  212. package/dist/coding/pre-action-gate.d.ts +1 -2
  213. package/dist/compounding/engine.d.ts +2 -3
  214. package/dist/compounding/engine.js +24 -24
  215. package/dist/compounding/preference-consolidator.d.ts +1 -2
  216. package/dist/compression-optimizer.d.ts +1 -2
  217. package/dist/config.d.ts +1 -2
  218. package/dist/config.js +11 -11
  219. package/dist/connectors/codex-materialize-runner.d.ts +1 -2
  220. package/dist/connectors/codex-materialize-runner.js +23 -23
  221. package/dist/connectors/codex-materialize.d.ts +1 -2
  222. package/dist/connectors/index.d.ts +1 -2
  223. package/dist/connectors/index.js +23 -23
  224. package/dist/consolidation-provenance-check.d.ts +2 -3
  225. package/dist/consolidation-provenance-check.js +4 -4
  226. package/dist/consolidation-undo.d.ts +2 -3
  227. package/dist/consolidation-undo.js +3 -3
  228. package/dist/contradiction/index.d.ts +3 -4
  229. package/dist/contradiction/index.js +9 -9
  230. package/dist/{contradiction-scan-AKUWPX5N.js → contradiction-scan-NOYMFG66.js} +3 -3
  231. package/dist/converge-config.d.ts +1 -2
  232. package/dist/convergence-refresh.d.ts +2 -3
  233. package/dist/convergence-refresh.js +25 -25
  234. package/dist/conversation-index/backend.d.ts +1 -2
  235. package/dist/conversation-index/backend.js +2 -2
  236. package/dist/conversation-index/chunker.d.ts +1 -2
  237. package/dist/conversation-index/faiss-adapter.d.ts +1 -2
  238. package/dist/conversation-index/indexer.d.ts +1 -2
  239. package/dist/conversation-index/search.d.ts +1 -2
  240. package/dist/corpus-watermark.d.ts +1 -2
  241. package/dist/corpus-watermark.js +25 -25
  242. package/dist/cross-lingual-recall.d.ts +1 -2
  243. package/dist/day-summary.d.ts +1 -2
  244. package/dist/delinearize.d.ts +1 -2
  245. package/dist/dependency-propagation-config.d.ts +1 -2
  246. package/dist/{dependency-propagation-delivery-CL6RWXTA.d.ts → dependency-propagation-delivery-BCpeo14F.d.ts} +1 -1
  247. package/dist/direct-answer-wiring.d.ts +1 -2
  248. package/dist/direct-answer.d.ts +1 -2
  249. package/dist/embedding-fallback.d.ts +1 -2
  250. package/dist/enrichment/index.d.ts +1 -2
  251. package/dist/entity-origin-fields.d.ts +1 -2
  252. package/dist/entity-retrieval.d.ts +2 -3
  253. package/dist/entity-retrieval.js +23 -23
  254. package/dist/entity-schema.d.ts +1 -2
  255. package/dist/episodic-context.d.ts +1 -2
  256. package/dist/eval-trajectory-contracts.d.ts +1 -2
  257. package/dist/eval-trajectory-store.d.ts +1 -2
  258. package/dist/eval-trajectory.d.ts +1 -2
  259. package/dist/explicit-capture.d.ts +9 -10
  260. package/dist/explicit-capture.js +11 -11
  261. package/dist/external-wiki-access.d.ts +11 -12
  262. package/dist/external-wiki-access.js +50 -47
  263. package/dist/external-wiki-collection-registration.d.ts +1 -2
  264. package/dist/external-wiki-collection.d.ts +1 -2
  265. package/dist/external-wiki-mcp-tools.d.ts +11 -12
  266. package/dist/extraction-error-classification.d.ts +1 -2
  267. package/dist/extraction-faithfulness.d.ts +1 -2
  268. package/dist/extraction-faithfulness.js +2 -2
  269. package/dist/extraction-judge-telemetry.d.ts +1 -2
  270. package/dist/extraction-judge-training.d.ts +1 -2
  271. package/dist/extraction-judge.d.ts +1 -2
  272. package/dist/extraction-judge.js +2 -2
  273. package/dist/extraction-liveness.d.ts +1 -2
  274. package/dist/extraction-normalization.d.ts +1 -2
  275. package/dist/extraction-prompt.d.ts +1 -2
  276. package/dist/extraction-source-grounding-rules.d.ts +1 -2
  277. package/dist/extraction-source-grounding.d.ts +1 -2
  278. package/dist/extraction.d.ts +1 -2
  279. package/dist/extraction.js +32 -29
  280. package/dist/fallback-llm.d.ts +7 -2
  281. package/dist/fallback-llm.js +1 -1
  282. package/dist/{first-start-migration-4NETATFF.js → first-start-migration-KHIMCBIC.js} +3 -3
  283. package/dist/graph-dashboard-diff.d.ts +1 -2
  284. package/dist/graph-dashboard-key.d.ts +1 -2
  285. package/dist/graph-dashboard-parser.d.ts +1 -2
  286. package/dist/graph-edge-reinforcement.d.ts +1 -2
  287. package/dist/graph-path-reconstruction.d.ts +1 -2
  288. package/dist/graph-path-scoring.d.ts +1 -2
  289. package/dist/graph-snapshot.d.ts +1 -2
  290. package/dist/graph.d.ts +1 -2
  291. package/dist/harmonic-retrieval.js +1 -1
  292. package/dist/importance.d.ts +1 -2
  293. package/dist/importers/index.d.ts +1 -2
  294. package/dist/in-flight-reads.d.ts +1 -2
  295. package/dist/{index-C7Xep6S9.d.ts → index-D_pyMUaP.d.ts} +2 -2
  296. package/dist/index.d.ts +929 -700
  297. package/dist/index.js +167 -132
  298. package/dist/intent.d.ts +1 -2
  299. package/dist/lcm/engine.d.ts +1 -2
  300. package/dist/lcm/index.d.ts +1 -2
  301. package/dist/lcm/tools.d.ts +1 -2
  302. package/dist/lifecycle.d.ts +1 -2
  303. package/dist/live-connectors-runner.d.ts +1 -2
  304. package/dist/local-llm.d.ts +1 -2
  305. package/dist/local-model-endpoint.d.ts +1 -2
  306. package/dist/location/index.d.ts +315 -6
  307. package/dist/location/index.js +151 -19
  308. package/dist/maintenance/memory-governance.d.ts +1 -2
  309. package/dist/maintenance/memory-governance.js +23 -23
  310. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -3
  311. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +23 -23
  312. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -3
  313. package/dist/maintenance/rebuild-memory-projection.js +24 -24
  314. package/dist/{maintenance-CJ-xqFp0.d.ts → maintenance-DDUX9d6D.d.ts} +3 -3
  315. package/dist/mcp-memory-inspector-app.d.ts +11 -12
  316. package/dist/mcp-read-only-tools.js +1 -1
  317. package/dist/memory-action-policy.d.ts +1 -2
  318. package/dist/memory-cache.d.ts +1 -2
  319. package/dist/memory-controller.d.ts +1 -2
  320. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -2
  321. package/dist/memory-projection-mutations.js +3 -3
  322. package/dist/memory-projection-store.d.ts +1 -2
  323. package/dist/memory-projection-store.js +1 -1
  324. package/dist/memory-provenance.d.ts +1 -2
  325. package/dist/memory-snapshot.d.ts +1 -2
  326. package/dist/memory-subject-cli.d.ts +11 -12
  327. package/dist/memory-subject.d.ts +11 -12
  328. package/dist/memory-subject.js +4 -4
  329. package/dist/memory-worth-outcomes.d.ts +2 -3
  330. package/dist/models-json.d.ts +1 -2
  331. package/dist/namespaces/migrate.d.ts +3 -4
  332. package/dist/namespaces/migrate.js +24 -24
  333. package/dist/namespaces/principal.d.ts +1 -2
  334. package/dist/namespaces/search.d.ts +1 -2
  335. package/dist/namespaces/search.js +5 -5
  336. package/dist/namespaces/storage.d.ts +3 -4
  337. package/dist/namespaces/storage.js +23 -23
  338. package/dist/native-knowledge.d.ts +1 -2
  339. package/dist/offline-sync-file-io.js +3 -3
  340. package/dist/offline-sync-impression-drain.d.ts +1 -2
  341. package/dist/offline-sync-impression-drain.js +9 -9
  342. package/dist/offline-sync.js +4 -4
  343. package/dist/operator-doctor-corpus.d.ts +1 -2
  344. package/dist/operator-doctor-corpus.js +26 -26
  345. package/dist/operator-doctor-replica.d.ts +1 -2
  346. package/dist/operator-toolkit.d.ts +3 -4
  347. package/dist/operator-toolkit.js +42 -42
  348. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -3
  349. package/dist/orchestration/maintenance.d.ts +4 -5
  350. package/dist/orchestration/maintenance.js +37 -36
  351. package/dist/{orchestrator-BsntWxLy.d.ts → orchestrator-3F4jihCo.d.ts} +8 -8
  352. package/dist/orchestrator.d.ts +9 -10
  353. package/dist/orchestrator.js +111 -106
  354. package/dist/page-versioning.js +3 -3
  355. package/dist/patterns-cli.d.ts +1 -2
  356. package/dist/{pipeline-CVoysPm2.d.ts → pipeline-CB1dj6Uh.d.ts} +1 -1
  357. package/dist/policy-runtime.d.ts +1 -2
  358. package/dist/proactive-contention.d.ts +1 -2
  359. package/dist/provenance.d.ts +1 -2
  360. package/dist/{public-http-CuOxlTC2.d.ts → public-http-34-JIAGQ.d.ts} +1 -1
  361. package/dist/{purge-GB7PZHT2.js → purge-OP6BEDFY.js} +2 -2
  362. package/dist/{qmd-DWMAGA5l.d.ts → qmd-edLLZXc5.d.ts} +1 -1
  363. package/dist/qmd-preflight.d.ts +2 -3
  364. package/dist/qmd-recall-cache.d.ts +1 -2
  365. package/dist/qmd.d.ts +2 -3
  366. package/dist/recall-concurrency-config.d.ts +1 -2
  367. package/dist/recall-disclosure-escalation.d.ts +1 -2
  368. package/dist/recall-explain-renderer.d.ts +1 -2
  369. package/dist/recall-memory-map.d.ts +1 -2
  370. package/dist/recall-planner-llm.d.ts +1 -2
  371. package/dist/recall-planner-llm.js +1 -1
  372. package/dist/recall-state.d.ts +1 -2
  373. package/dist/recall-tag-filter.d.ts +1 -2
  374. package/dist/recall-timings.d.ts +1 -2
  375. package/dist/recall-xray-cli.d.ts +1 -2
  376. package/dist/recall-xray-renderer.d.ts +1 -2
  377. package/dist/recall-xray.d.ts +1 -2
  378. package/dist/reconcile/cursor.d.ts +1 -2
  379. package/dist/reconcile/manifest.d.ts +1 -2
  380. package/dist/reconcile/manifest.js +4 -4
  381. package/dist/reconcile/plan.d.ts +1 -2
  382. package/dist/replay/normalizers/chatgpt.d.ts +1 -2
  383. package/dist/replay/normalizers/claude.d.ts +1 -2
  384. package/dist/replay/normalizers/openclaw.d.ts +1 -2
  385. package/dist/replay/normalizers/shared.d.ts +1 -2
  386. package/dist/replay/runner.d.ts +1 -2
  387. package/dist/replay/types.d.ts +1 -2
  388. package/dist/replica-divergence.d.ts +1 -2
  389. package/dist/replica-peers-config.d.ts +1 -2
  390. package/dist/{resolution-XWBPKYFB.js → resolution-4DLI3IOR.js} +10 -10
  391. package/dist/resolve-auth-token.d.ts +1 -2
  392. package/dist/resume-bundles.js +12 -12
  393. package/dist/retrieval-agents.d.ts +2 -3
  394. package/dist/retrieval-tiers.d.ts +1 -2
  395. package/dist/routing/engine.d.ts +1 -2
  396. package/dist/routing/store.d.ts +1 -2
  397. package/dist/salvage-envelope.d.ts +1 -2
  398. package/dist/salvage-envelope.js +6 -6
  399. package/dist/schemas.d.ts +639 -174
  400. package/dist/schemas.js +3 -1
  401. package/dist/{scope-profiles-CPWkW_dI.d.ts → scope-profiles-BF2lu81V.d.ts} +1 -1
  402. package/dist/search/document-scanner.js +1 -1
  403. package/dist/search/embed-helper.d.ts +1 -2
  404. package/dist/search/factory.d.ts +1 -2
  405. package/dist/search/factory.js +4 -4
  406. package/dist/search/index.d.ts +1 -2
  407. package/dist/search/index.js +4 -4
  408. package/dist/search/lancedb-backend.d.ts +1 -2
  409. package/dist/search/lancedb-backend.js +1 -1
  410. package/dist/search/meilisearch-backend.d.ts +1 -2
  411. package/dist/search/meilisearch-backend.js +1 -1
  412. package/dist/search/noop-backend.d.ts +1 -2
  413. package/dist/search/orama-backend.d.ts +1 -2
  414. package/dist/search/orama-backend.js +1 -1
  415. package/dist/search/port.d.ts +1 -2
  416. package/dist/search/remote-backend.d.ts +1 -2
  417. package/dist/secure-store/index.js +3 -3
  418. package/dist/{semantic-consolidation-CNFVBXFc.d.ts → semantic-consolidation-5OuWXBRt.d.ts} +1 -1
  419. package/dist/semantic-consolidation.d.ts +2 -3
  420. package/dist/semantic-consolidation.js +24 -24
  421. package/dist/semantic-rule-promotion.js +23 -23
  422. package/dist/semantic-rule-verifier.d.ts +1 -2
  423. package/dist/semantic-rule-verifier.js +23 -23
  424. package/dist/{service-Bb-JIdQ0.d.ts → service-CrqEhLXD.d.ts} +2 -2
  425. package/dist/session-observer-bands.d.ts +1 -2
  426. package/dist/session-observer-state.d.ts +1 -2
  427. package/dist/shared-context/manager.d.ts +7 -8
  428. package/dist/signal.d.ts +1 -2
  429. package/dist/source-agent-qualifier.d.ts +1 -2
  430. package/dist/source-agent-qualifier.js +30 -27
  431. package/dist/standup/build.d.ts +16 -0
  432. package/dist/standup/build.js +17 -0
  433. package/dist/standup/build.js.map +1 -0
  434. package/dist/{storage-CukrlNKk.d.ts → storage-BQn-xnxm.d.ts} +1 -1
  435. package/dist/storage.d.ts +2 -3
  436. package/dist/storage.js +22 -22
  437. package/dist/subject-config.d.ts +1 -2
  438. package/dist/subject-config.js +5 -5
  439. package/dist/summarizer.d.ts +1 -2
  440. package/dist/summarizer.js +2 -2
  441. package/dist/summary-snapshot.d.ts +1 -2
  442. package/dist/support-passport/index.d.ts +16 -17
  443. package/dist/support-passport/index.js +52 -49
  444. package/dist/temporal-supersession.d.ts +2 -3
  445. package/dist/temporal-timeline-recall.d.ts +1 -2
  446. package/dist/temporal-validity.d.ts +1 -2
  447. package/dist/threading.d.ts +1 -2
  448. package/dist/tier-migration.d.ts +2 -3
  449. package/dist/tier-routing.d.ts +1 -2
  450. package/dist/tier-routing.js +2 -2
  451. package/dist/{tier-stats-4B5IJ3NE.js → tier-stats-2TOW3QNL.js} +3 -3
  452. package/dist/topics.d.ts +1 -2
  453. package/dist/transcript.d.ts +1 -2
  454. package/dist/transfer/capsule-export.js +2 -2
  455. package/dist/transfer/capsule-import.js +5 -5
  456. package/dist/transfer/export-okf.d.ts +39 -0
  457. package/dist/transfer/export-okf.js +112 -0
  458. package/dist/transfer/export-okf.js.map +1 -0
  459. package/dist/transfer/types.d.ts +78 -78
  460. package/dist/trust-score-stage.d.ts +1 -2
  461. package/dist/trust-score.d.ts +1 -2
  462. package/dist/{types-djxQlxJ7.d.ts → types-BRpcNjHZ.d.ts} +117 -2
  463. package/dist/types.d.ts +1 -2
  464. package/dist/utility-runtime.d.ts +1 -2
  465. package/dist/verified-recall.js +23 -23
  466. package/dist/who-knows-cli.d.ts +11 -12
  467. package/dist/who-knows-cli.js +24 -24
  468. package/dist/who-knows.d.ts +11 -12
  469. package/dist/who-knows.js +23 -23
  470. package/dist/write-envelope.d.ts +1 -2
  471. package/dist/write-envelope.js +5 -5
  472. package/package.json +34 -3
  473. package/src/access-admin-ops-surface.ts +6 -1
  474. package/src/access-boundary.ts +1 -0
  475. package/src/access-http.ts +3 -1
  476. package/src/access-mcp-output-schemas.ts +1 -0
  477. package/src/access-mcp.ts +3 -3
  478. package/src/access-operations.ts +1 -0
  479. package/src/access-service-offline-file-content.test.ts +63 -0
  480. package/src/access-surface-catalog.ts +2 -0
  481. package/src/activity/config.test.ts +1 -0
  482. package/src/activity/config.ts +21 -1
  483. package/src/activity/index.ts +1 -0
  484. package/src/activity/timeline/build.ts +279 -0
  485. package/src/activity/timeline/categories.ts +111 -0
  486. package/src/activity/timeline/classify.ts +110 -0
  487. package/src/activity/timeline/corrections.ts +145 -0
  488. package/src/activity/timeline/index.ts +6 -0
  489. package/src/activity/timeline/timeline.test.ts +277 -0
  490. package/src/activity/timeline/types.ts +106 -0
  491. package/src/activity/types.ts +6 -0
  492. package/src/cli/okf-commands.ts +45 -0
  493. package/src/cli.ts +2 -2
  494. package/src/coding/export-okf-codegraph.test.ts +381 -0
  495. package/src/coding/export-okf-codegraph.ts +565 -0
  496. package/src/config.test.ts +1 -0
  497. package/src/extraction-prompt-safety.test.ts +14 -2
  498. package/src/extraction.ts +21 -1
  499. package/src/fallback-llm.test.ts +134 -0
  500. package/src/fallback-llm.ts +77 -5
  501. package/src/location/access-operations.ts +17 -8
  502. package/src/location/backfill.ts +137 -0
  503. package/src/location/config.test.ts +3 -0
  504. package/src/location/config.ts +46 -2
  505. package/src/location/http-glue.ts +1 -1
  506. package/src/location/index.ts +3 -0
  507. package/src/location/intervals.ts +1 -0
  508. package/src/location/matching.test.ts +65 -0
  509. package/src/location/matching.ts +354 -0
  510. package/src/location/mcp-tools.ts +2 -1
  511. package/src/location/surfaces.test.ts +15 -2
  512. package/src/location/surfaces.ts +95 -18
  513. package/src/location/tagging.test.ts +119 -0
  514. package/src/location/tagging.ts +277 -0
  515. package/src/location/types.ts +23 -1
  516. package/src/mcp-read-only-tools.ts +1 -0
  517. package/src/memory-projection-store.ts +3 -1
  518. package/src/okf/cli.ts +18 -5
  519. package/src/okf/config.ts +5 -0
  520. package/src/okf/index-files.test.ts +60 -0
  521. package/src/okf/index-files.ts +114 -0
  522. package/src/okf/render.ts +133 -0
  523. package/src/okf/type-mapping.test.ts +3 -0
  524. package/src/okf/type-mapping.ts +2 -0
  525. package/src/orchestration/extraction-run.ts +2 -1
  526. package/src/orchestration/generic-recall-paths.ts +4 -3
  527. package/src/schemas.ts +17 -1
  528. package/src/standup/access-operations.ts +14 -0
  529. package/src/standup/build.test.ts +34 -0
  530. package/src/standup/build.ts +115 -0
  531. package/src/standup/http-glue.ts +15 -0
  532. package/src/standup/mcp-tools.ts +16 -0
  533. package/src/support-passport/card-projection.ts +1 -0
  534. package/src/support-passport/card-service-commit-forwarding.test.ts +1 -0
  535. package/src/support-passport/card-service.test.ts +75 -1
  536. package/src/support-passport/card-service.ts +6 -3
  537. package/src/support-passport/card-state.ts +5 -1
  538. package/src/support-passport/offline-sync-guard.ts +14 -1
  539. package/src/transfer/export-okf.test.ts +164 -0
  540. package/src/transfer/export-okf.ts +286 -0
  541. package/dist/chunk-2LWQSV6A.js.map +0 -1
  542. package/dist/chunk-3BCULS4U.js.map +0 -1
  543. package/dist/chunk-7BDZTALN.js.map +0 -1
  544. package/dist/chunk-7PHI6GUI.js.map +0 -1
  545. package/dist/chunk-AX7UXCHJ.js.map +0 -1
  546. package/dist/chunk-DEACDKE3.js.map +0 -1
  547. package/dist/chunk-FP7YTTVO.js.map +0 -1
  548. package/dist/chunk-JYSN42VN.js.map +0 -1
  549. package/dist/chunk-KZIF6XHX.js.map +0 -1
  550. package/dist/chunk-LKYIOCWL.js.map +0 -1
  551. package/dist/chunk-OXRRJXPR.js.map +0 -1
  552. package/dist/chunk-U7EW2W4W.js.map +0 -1
  553. package/dist/chunk-UW5NPZJ2.js.map +0 -1
  554. package/dist/chunk-XAB6STPO.js.map +0 -1
  555. package/dist/chunk-XNWXSGHS.js.map +0 -1
  556. package/dist/types-CM86alG1.d.ts +0 -89
  557. /package/dist/{auto-sync-2YPITIWN.js.map → auto-sync-Q6Q2FVSC.js.map} +0 -0
  558. /package/dist/{capsule-merge-SGIVB3WA.js.map → capsule-merge-SEHERWWP.js.map} +0 -0
  559. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  560. /package/dist/{chunk-NPFUNWNX.js.map → chunk-23CVL7HS.js.map} +0 -0
  561. /package/dist/{chunk-PO7NXBG2.js.map → chunk-2GF27PGH.js.map} +0 -0
  562. /package/dist/{chunk-MY2BC6UE.js.map → chunk-2LBAFHOQ.js.map} +0 -0
  563. /package/dist/{chunk-AZMLH5UT.js.map → chunk-33MFRY25.js.map} +0 -0
  564. /package/dist/{chunk-UEBDCMOO.js.map → chunk-3TSU662L.js.map} +0 -0
  565. /package/dist/{chunk-CAMNRAJF.js.map → chunk-4FHRZD5T.js.map} +0 -0
  566. /package/dist/{chunk-S5XOSTYM.js.map → chunk-4STAANV7.js.map} +0 -0
  567. /package/dist/{chunk-4F4AQFWL.js.map → chunk-6CEGSTBD.js.map} +0 -0
  568. /package/dist/{chunk-MDD2RINF.js.map → chunk-6RUHELWR.js.map} +0 -0
  569. /package/dist/{chunk-WNXYT4MK.js.map → chunk-72OIT7KS.js.map} +0 -0
  570. /package/dist/{chunk-KQAFEZQX.js.map → chunk-7LCGFUMB.js.map} +0 -0
  571. /package/dist/{chunk-SNOIKAHM.js.map → chunk-7UTDHQZ5.js.map} +0 -0
  572. /package/dist/{chunk-5HK3CJAR.js.map → chunk-7XOG75AU.js.map} +0 -0
  573. /package/dist/{chunk-UPFNQJC7.js.map → chunk-CN4VKV3S.js.map} +0 -0
  574. /package/dist/{chunk-PMVPCZJZ.js.map → chunk-CTCGHNWN.js.map} +0 -0
  575. /package/dist/{chunk-EGBDFJ36.js.map → chunk-DD5JFCWM.js.map} +0 -0
  576. /package/dist/{chunk-XBGHAAKR.js.map → chunk-DDX6KIXF.js.map} +0 -0
  577. /package/dist/{chunk-JIYDRBVZ.js.map → chunk-DJORULH3.js.map} +0 -0
  578. /package/dist/{chunk-UENKPWCS.js.map → chunk-DMEHOEC7.js.map} +0 -0
  579. /package/dist/{chunk-7KQB4EBS.js.map → chunk-DUAJKRR2.js.map} +0 -0
  580. /package/dist/{chunk-SEEJOGQX.js.map → chunk-EFQCDJZ2.js.map} +0 -0
  581. /package/dist/{chunk-Q57GOHLF.js.map → chunk-EGALNSZ4.js.map} +0 -0
  582. /package/dist/{chunk-KCT36JAW.js.map → chunk-ESNFSSO4.js.map} +0 -0
  583. /package/dist/{chunk-XQ3HXAQH.js.map → chunk-ET2CNMLD.js.map} +0 -0
  584. /package/dist/{chunk-PU56CXZA.js.map → chunk-EZSCW4EM.js.map} +0 -0
  585. /package/dist/{chunk-HMZKGHMD.js.map → chunk-FESUGFIL.js.map} +0 -0
  586. /package/dist/{chunk-3A2NJP2U.js.map → chunk-FKKGCGYL.js.map} +0 -0
  587. /package/dist/{chunk-BWGCOLEL.js.map → chunk-FTTJRVB7.js.map} +0 -0
  588. /package/dist/{chunk-ODU2CNNX.js.map → chunk-FYWLSFFS.js.map} +0 -0
  589. /package/dist/{chunk-3PKAS6VL.js.map → chunk-GX6FTSYH.js.map} +0 -0
  590. /package/dist/{chunk-76DIF5KT.js.map → chunk-H7VDIF2V.js.map} +0 -0
  591. /package/dist/{chunk-F7XUD3PL.js.map → chunk-HJXA6ZM7.js.map} +0 -0
  592. /package/dist/{chunk-4QEYREAV.js.map → chunk-HNPE66LB.js.map} +0 -0
  593. /package/dist/{chunk-P36Z4JRA.js.map → chunk-I5VB44ZK.js.map} +0 -0
  594. /package/dist/{chunk-EUYWQ7TS.js.map → chunk-IEZ6CGTW.js.map} +0 -0
  595. /package/dist/{chunk-5DHKCO52.js.map → chunk-IVIAHQBR.js.map} +0 -0
  596. /package/dist/{chunk-TFR3HG4K.js.map → chunk-J3OND5QT.js.map} +0 -0
  597. /package/dist/{chunk-5ACCD4L7.js.map → chunk-JRRQ747T.js.map} +0 -0
  598. /package/dist/{chunk-V4IDF3EZ.js.map → chunk-JTWZKNUH.js.map} +0 -0
  599. /package/dist/{chunk-5RWZH6PH.js.map → chunk-L4X4PJYK.js.map} +0 -0
  600. /package/dist/{chunk-UTQUEHC7.js.map → chunk-LUDBXTBJ.js.map} +0 -0
  601. /package/dist/{chunk-LDKPDODJ.js.map → chunk-ME35HVDJ.js.map} +0 -0
  602. /package/dist/{chunk-DPCXDG7G.js.map → chunk-MJRGVXPQ.js.map} +0 -0
  603. /package/dist/{chunk-773TRRGT.js.map → chunk-MJUCDM3C.js.map} +0 -0
  604. /package/dist/{chunk-T6ILXUAH.js.map → chunk-MN5NOOI7.js.map} +0 -0
  605. /package/dist/{chunk-AHPIFKNG.js.map → chunk-N4F7ZSSG.js.map} +0 -0
  606. /package/dist/{chunk-JOZUBF4A.js.map → chunk-NACLNNFQ.js.map} +0 -0
  607. /package/dist/{chunk-LC2BDILZ.js.map → chunk-NBP4EX5N.js.map} +0 -0
  608. /package/dist/{chunk-ZVPVTPGI.js.map → chunk-NNZFPYYX.js.map} +0 -0
  609. /package/dist/{chunk-DA7ITC5Z.js.map → chunk-O57GM3FR.js.map} +0 -0
  610. /package/dist/{chunk-7VZFRUQU.js.map → chunk-O7ERGZDA.js.map} +0 -0
  611. /package/dist/{chunk-3SZD4CYO.js.map → chunk-OAJMQKQR.js.map} +0 -0
  612. /package/dist/{chunk-HSZMX3ZJ.js.map → chunk-ODW5GDFE.js.map} +0 -0
  613. /package/dist/{chunk-J2WC5LF4.js.map → chunk-QBC33MPY.js.map} +0 -0
  614. /package/dist/{chunk-T7XP6IZE.js.map → chunk-QCRJMU5V.js.map} +0 -0
  615. /package/dist/{chunk-OA2O2GJ4.js.map → chunk-RZ3IZIJG.js.map} +0 -0
  616. /package/dist/{chunk-UL4MKZHI.js.map → chunk-SN4JXNLL.js.map} +0 -0
  617. /package/dist/{chunk-CPA5NBHN.js.map → chunk-TNGH4ZYI.js.map} +0 -0
  618. /package/dist/{chunk-F3NVYTTA.js.map → chunk-TNXNECAN.js.map} +0 -0
  619. /package/dist/{chunk-BEC4YBNA.js.map → chunk-TVW4C7PV.js.map} +0 -0
  620. /package/dist/{chunk-UFKPQBXH.js.map → chunk-U62OK7BB.js.map} +0 -0
  621. /package/dist/{chunk-TUHBYJXL.js.map → chunk-VQ4AMTGZ.js.map} +0 -0
  622. /package/dist/{chunk-H2YSH3DG.js.map → chunk-WKAXBXVA.js.map} +0 -0
  623. /package/dist/{chunk-HRHO3ZNG.js.map → chunk-WKJFIMVN.js.map} +0 -0
  624. /package/dist/{chunk-SXIMQLGV.js.map → chunk-WVGXCBOC.js.map} +0 -0
  625. /package/dist/{chunk-CRML27CO.js.map → chunk-X5YYSAZX.js.map} +0 -0
  626. /package/dist/{chunk-FZEEWOI2.js.map → chunk-XJJYSX6F.js.map} +0 -0
  627. /package/dist/{chunk-UG6VXIOK.js.map → chunk-XSTNGNJP.js.map} +0 -0
  628. /package/dist/{chunk-YDPAE2RD.js.map → chunk-YFLLGRXO.js.map} +0 -0
  629. /package/dist/{chunk-LPNCR4QK.js.map → chunk-YXFCALVT.js.map} +0 -0
  630. /package/dist/{chunk-Q4WONDMJ.js.map → chunk-YYGZJPOK.js.map} +0 -0
  631. /package/dist/{chunk-GTO56JY5.js.map → chunk-ZJPM7GZ3.js.map} +0 -0
  632. /package/dist/{chunk-LOXHYCVS.js.map → chunk-ZW4VXELZ.js.map} +0 -0
  633. /package/dist/{contradiction-scan-AKUWPX5N.js.map → contradiction-scan-NOYMFG66.js.map} +0 -0
  634. /package/dist/{first-start-migration-4NETATFF.js.map → first-start-migration-KHIMCBIC.js.map} +0 -0
  635. /package/dist/{purge-GB7PZHT2.js.map → purge-OP6BEDFY.js.map} +0 -0
  636. /package/dist/{resolution-XWBPKYFB.js.map → resolution-4DLI3IOR.js.map} +0 -0
  637. /package/dist/{tier-stats-4B5IJ3NE.js.map → tier-stats-2TOW3QNL.js.map} +0 -0
package/src/access-mcp.ts CHANGED
@@ -45,7 +45,7 @@ import { applyToolOutputSchemas } from "./access-mcp-output-schemas.js";
45
45
  import { MCP_READ_ONLY_TOOL_SUFFIXES } from "./mcp-read-only-tools.js";
46
46
  import { MEETINGS_MCP_TOOLS } from "./meetings/mcp-tools.js";
47
47
  import { WEARABLES_MCP_TOOLS } from "./wearables/mcp-tools.js";
48
- import { WHO_KNOWS_MCP_TOOLS } from "./who-knows.js"; import { LOCATION_MCP_TOOLS } from "./location/mcp-tools.js";
48
+ import { WHO_KNOWS_MCP_TOOLS } from "./who-knows.js"; import { LOCATION_MCP_TOOLS } from "./location/mcp-tools.js"; import { STANDUP_MCP_TOOLS } from "./standup/mcp-tools.js";
49
49
  import { PROMOTION_CANDIDATES_MCP_TOOLS } from "./memory-subject.js";
50
50
  import { EXTERNAL_WIKI_MCP_TOOLS } from "./external-wiki-mcp-tools.js";
51
51
  import { abortError, isAbortError } from "./abort-error.js";
@@ -192,7 +192,7 @@ export const MCP_MIGRATED_OPERATIONS: Readonly<Record<string, OperationName>> =
192
192
  "engram.location_status": "location_status", "engram.location_check": "location_check", "engram.location_sync": "location_sync",
193
193
  "engram.location_backfill": "location_backfill", "engram.location_day": "location_day",
194
194
  "engram.transcript_day": "transcript_day", "engram.transcript_search": "transcript_search",
195
- "engram.transcript_memories": "transcript_memories", "engram.meetings_list": "meetings_list", "engram.meetings_get": "meetings_get", "engram.meetings_build": "meetings_build",
195
+ "engram.transcript_memories": "transcript_memories", "engram.meetings_list": "meetings_list", "engram.meetings_get": "meetings_get", "engram.meetings_build": "meetings_build", "engram.standup": "standup",
196
196
  "engram.action_confidence": "action_confidence",
197
197
  "engram.chatgpt_memory_inspector": "chatgpt_memory_inspector",
198
198
  "engram.day_summary": "day_summary",
@@ -706,7 +706,7 @@ export class EngramMcpServer {
706
706
  additionalProperties: false,
707
707
  },
708
708
  },
709
- ...WEARABLES_MCP_TOOLS, ...MEETINGS_MCP_TOOLS, ...WHO_KNOWS_MCP_TOOLS, ...PROMOTION_CANDIDATES_MCP_TOOLS, ...LOCATION_MCP_TOOLS,
709
+ ...WEARABLES_MCP_TOOLS, ...MEETINGS_MCP_TOOLS, ...WHO_KNOWS_MCP_TOOLS, ...PROMOTION_CANDIDATES_MCP_TOOLS, ...LOCATION_MCP_TOOLS, ...STANDUP_MCP_TOOLS,
710
710
  ...(service.supportPassportEnabled ? SUPPORT_PASSPORT_MCP_TOOLS : []),
711
711
  {
712
712
  name: "engram.action_confidence",
@@ -695,6 +695,7 @@ import "./support-passport/access-operations.js";
695
695
  import "./relay/mission-access.js";
696
696
  // Location sync surfaces (issue #2047).
697
697
  import "./location/access-operations.js";
698
+ import "./standup/access-operations.js";
698
699
 
699
700
  export const REGISTERED_OPERATIONS = [
700
701
  memoryGetOperation.spec.name,
@@ -516,6 +516,69 @@ test("offline apply routes reject forged support-passport metadata and allow pub
516
516
  }
517
517
  });
518
518
 
519
+ test("offline apply rejects JSON-escaped support-passport markers (#2387)", async () => {
520
+ const root = await mkdtemp(path.join(os.tmpdir(), "remnic-access-escaped-marker-"));
521
+ try {
522
+ const storage = new StorageManager(root);
523
+ await storage.ensureDirectories();
524
+ const { service } = createManifestService({ root, storage });
525
+ // The raw frontmatter text never contains the literal marker substring;
526
+ // only JSON.parse of the structured-attribute value reconstructs it.
527
+ const escaped = Buffer.from([
528
+ "---",
529
+ "id: escaped-marker",
530
+ "category: fact",
531
+ `structuredAttributes: {"support\\u002dpassport-owner":"${"a".repeat(64)}"}`,
532
+ "---",
533
+ "Ordinary-looking body",
534
+ ].join("\n"));
535
+
536
+ const chunkPath = "facts/2026-08-13/escaped-chunk.md";
537
+ await assert.rejects(
538
+ () => service.offlineSyncApplyFileContent({
539
+ sourceId: "peer",
540
+ path: chunkPath,
541
+ sha256: sha256(escaped),
542
+ bytes: escaped.length,
543
+ mtimeMs: 0,
544
+ offset: 0,
545
+ content: escaped,
546
+ }),
547
+ (error) => error instanceof EngramAccessInputError && /private support-passport record/.test(error.message),
548
+ );
549
+ await assert.rejects(() => readFile(path.join(root, chunkPath)));
550
+
551
+ const changesetPath = "facts/2026-08-13/escaped-changeset.md";
552
+ await assert.rejects(
553
+ () => service.offlineSyncApply({
554
+ returnCurrentFiles: false,
555
+ changeset: {
556
+ format: OFFLINE_SYNC_CHANGESET_FORMAT,
557
+ schemaVersion: 1,
558
+ createdAt: new Date().toISOString(),
559
+ sourceId: "peer",
560
+ includeTranscripts: true,
561
+ changes: [{
562
+ type: "upsert",
563
+ path: changesetPath,
564
+ file: {
565
+ path: changesetPath,
566
+ sha256: sha256(escaped),
567
+ bytes: escaped.length,
568
+ mtimeMs: 0,
569
+ contentBase64: escaped.toString("base64"),
570
+ },
571
+ }],
572
+ },
573
+ }),
574
+ (error) => error instanceof EngramAccessInputError && /private support-passport record/.test(error.message),
575
+ );
576
+ await assert.rejects(() => readFile(path.join(root, changesetPath)));
577
+ } finally {
578
+ await rm(root, { recursive: true, force: true });
579
+ }
580
+ });
581
+
519
582
  test("offline apply-file-content reports invalid metadata as input errors", async () => {
520
583
  const service = createOfflineService();
521
584
  await assert.rejects(
@@ -71,6 +71,7 @@ export const MCP_TOOLS: readonly McpToolEntry[] = [
71
71
  { tool: "meetings_list", operation: "meetings_list" },
72
72
  { tool: "meetings_get", operation: "meetings_get" },
73
73
  { tool: "meetings_build", operation: "meetings_build" },
74
+ { tool: "standup", operation: "standup" },
74
75
  { tool: "action_confidence", operation: "action_confidence" },
75
76
  { tool: "chatgpt_memory_inspector", operation: "chatgpt_memory_inspector" },
76
77
  { tool: "day_summary", operation: "day_summary" },
@@ -234,6 +235,7 @@ export const HTTP_ROUTES: readonly HttpRouteEntry[] = [
234
235
  { method: "GET", pathname: "/engram/v1/meetings", operation: "meetings_list" },
235
236
  { method: "POST", pathname: "/engram/v1/meetings/build", operation: "meetings_build" },
236
237
  { method: "GET", pathname: "/engram/v1/meetings/:id", operation: "meetings_get" },
238
+ { method: "GET", pathname: "/engram/v1/standup", operation: "standup" },
237
239
  { method: "POST", pathname: "/engram/v1/observe", operation: "observe" },
238
240
  { method: "POST", pathname: "/engram/v1/lcm/search", operation: "lcm_search" },
239
241
  { method: "POST", pathname: "/engram/v1/lcm/compaction/flush", operation: "lcm_compaction_flush" },
@@ -17,6 +17,7 @@ test("parseActivityConfig defaults to an inert, search-only configuration", () =
17
17
  minConfidence: 0.7,
18
18
  minImportance: "normal",
19
19
  maxMemoriesPerDay: 0,
20
+ timeline: { enabled: false },
20
21
  });
21
22
  assert.deepEqual(parseActivityConfig(undefined), defaultActivityConfig());
22
23
  });
@@ -1,7 +1,7 @@
1
1
  import { coerceBooleanLike, coerceNumber } from "../connectors/coerce.js";
2
2
  import { assertValidTimezone } from "./digest.js";
3
3
  import type { ImportanceLevel } from "../types.js";
4
- import type { ActivityConfig, ActivityExtractionMode, ActivitySourceConfig } from "./types.js";
4
+ import type { ActivityConfig, ActivityExtractionMode, ActivitySourceConfig, ActivityTimelineConfig } from "./types.js";
5
5
 
6
6
  const EXTRACTION_MODES: readonly ActivityExtractionMode[] = ["off", "smart"];
7
7
  const IMPORTANCE_LEVELS: readonly ImportanceLevel[] = ["critical", "high", "normal", "low", "trivial"];
@@ -22,6 +22,7 @@ export function defaultActivityConfig(): ActivityConfig {
22
22
  minConfidence: 0.7,
23
23
  minImportance: "normal",
24
24
  maxMemoriesPerDay: 0,
25
+ timeline: { enabled: false },
25
26
  };
26
27
  }
27
28
 
@@ -182,5 +183,24 @@ export function parseActivityConfig(raw: unknown): ActivityConfig {
182
183
  minConfidence: parseUnitInterval(config.minConfidence, "minConfidence", defaults.minConfidence),
183
184
  minImportance: minImportance as ImportanceLevel,
184
185
  maxMemoriesPerDay,
186
+ timeline: parseTimelineConfig(config.timeline),
185
187
  };
186
188
  }
189
+
190
+ /**
191
+ * Parse the `activity.timeline.*` block. `enabled` is the master gate for
192
+ * timeline-card derivation (issue #2049); default false. A non-object block
193
+ * is malformed and must fail rather than silently disabling the layer.
194
+ */
195
+ function parseTimelineConfig(raw: unknown): ActivityTimelineConfig {
196
+ if (raw === undefined) return { enabled: false };
197
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
198
+ throw new TypeError("activity.timeline must be an object");
199
+ }
200
+ const timeline = raw as Record<string, unknown>;
201
+ const enabledValue = coerceBooleanLike(timeline.enabled, "activity.timeline.enabled");
202
+ if (timeline.enabled !== undefined && enabledValue === undefined) {
203
+ throw new TypeError("activity.timeline.enabled must be a boolean");
204
+ }
205
+ return { enabled: enabledValue ?? false };
206
+ }
@@ -14,4 +14,5 @@ export * from "./runner.js";
14
14
  export * from "./scheduler.js";
15
15
  export * from "./config.js";
16
16
  export * from "./reindex.js";
17
+ export * from "./timeline/index.js";
17
18
  export * from "./memory-gen.js";
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Deterministic timeline-card day builder (issue #2049).
3
+ *
4
+ * Semantics (all half-open [start, end), all UTC internally):
5
+ * - Observations are grouped per capture machine and sorted by
6
+ * (canonical capture instant, contentHash) — never by array position.
7
+ * - Compatibility rule: two consecutive observations on one machine merge
8
+ * into the same card iff they share the exact (app, windowTitle) pair.
9
+ * - Gap rule: a merge happens only when the inter-observation gap is
10
+ * ≤ MERGE_GAP_MS (2 min). A card's end extends from its last observation
11
+ * by at most MAX_DWELL_MS (15 min, matching the digest dwell cap), is
12
+ * clipped by the next observation on the machine, by any user pause, and
13
+ * by the local day end — so cards never overlap on a track.
14
+ * - Idle: any uncovered remainder between consecutive cards on a machine
15
+ * track (which in practice means a gap > MAX_DWELL_MS) becomes a derived
16
+ * idle card with no evidence. The day's leading/trailing uncovered ranges
17
+ * are represented by the absence of cards, not by invented idle.
18
+ * - Pause: user-declared intervals are unioned, clipped to the day, emitted
19
+ * as pause cards, and never overlapped by activity dwell or idle.
20
+ * - Nothing is invented for gaps: idle/pause cards carry no evidence and are
21
+ * flagged by kind; an app/window match never claims user intent.
22
+ *
23
+ * Output is byte-stable: identical inputs produce identical
24
+ * `serializeTimelineDay()` bytes across runs and process restarts.
25
+ */
26
+
27
+ import { createHash } from "node:crypto";
28
+
29
+ import { activityDayWindow } from "../digest.js";
30
+ import { DEFAULT_TIMELINE_CATEGORIES, TIMELINE_RESERVED_IDLE, TIMELINE_RESERVED_PAUSE, validateTimelineCategories } from "./categories.js";
31
+ import { classifyTimelineObservation } from "./classify.js";
32
+ import type { TimelineCard, TimelineCategory, TimelineDay, TimelineObservation, TimelinePause } from "./types.js";
33
+
34
+ export const TIMELINE_FORMAT_VERSION = 1;
35
+
36
+ /** Max inter-observation gap that still merges into one card. */
37
+ export const TIMELINE_MERGE_GAP_MS = 120_000;
38
+ /** Max dwell attributed past a card's last observation (digest parity). */
39
+ export const TIMELINE_MAX_DWELL_MS = 15 * 60_000;
40
+
41
+ export interface TimelineBuildInput {
42
+ /** Local day, YYYY-MM-DD. */
43
+ date: string;
44
+ timezone: string;
45
+ /** Stored observations for the day (e.g. from ActivityStore.listSnapshotsForDay). */
46
+ observations: readonly TimelineObservation[];
47
+ /** User-declared pauses (UTC, half-open); may overlap and extend past the day. */
48
+ pauses?: readonly TimelinePause[];
49
+ /** Registry override; validated. Defaults to the built-in registry. */
50
+ categories?: readonly TimelineCategory[];
51
+ }
52
+
53
+ /** Canonical UTC ISO instant, or the raw string when unparseable (dropped later). */
54
+ function canonicalMs(iso: string): number {
55
+ const parsed = Date.parse(iso);
56
+ return Number.isFinite(parsed) ? parsed : Number.NaN;
57
+ }
58
+
59
+ function isoOf(ms: number): string {
60
+ return new Date(ms).toISOString();
61
+ }
62
+
63
+ /** Content identity of one observation: machine + instant + content hash. */
64
+ function evidenceKeyOf(observation: TimelineObservation): string {
65
+ return `${observation.machine}|${isoOf(canonicalMs(observation.capturedAtUtc))}|${observation.contentHash}`;
66
+ }
67
+
68
+ function stableCardId(identity: string): string {
69
+ return `tlc_${createHash("sha256").update(identity, "utf8").digest("hex").slice(0, 16)}`;
70
+ }
71
+
72
+ function formatDurationMinutes(ms: number): string {
73
+ return `${Math.round(ms / 60_000)}m`;
74
+ }
75
+
76
+ /** Union overlapping/adjacent [start,end) intervals; returns sorted, disjoint ms pairs. */
77
+ function unionIntervals(intervals: readonly (readonly [number, number])[]): Array<[number, number]> {
78
+ const sorted = [...intervals].sort((a, b) => a[0] - b[0] || a[1] - b[1]);
79
+ const merged: Array<[number, number]> = [];
80
+ for (const interval of sorted) {
81
+ const last = merged[merged.length - 1];
82
+ if (last !== undefined && interval[0] <= last[1]) {
83
+ last[1] = Math.max(last[1], interval[1]);
84
+ } else {
85
+ merged.push([interval[0], interval[1]]);
86
+ }
87
+ }
88
+ return merged;
89
+ }
90
+
91
+ /** Remove [cutStart,cutEnd) from [start,end); returns the remaining pieces. */
92
+ function subtractInterval(start: number, end: number, cutStart: number, cutEnd: number): Array<[number, number]> {
93
+ if (cutEnd <= start || cutStart >= end) return [[start, end]];
94
+ const pieces: Array<[number, number]> = [];
95
+ if (cutStart > start) pieces.push([start, cutStart]);
96
+ if (cutEnd < end) pieces.push([cutEnd, end]);
97
+ return pieces;
98
+ }
99
+
100
+ interface MergedObservations {
101
+ machine: string;
102
+ observations: TimelineObservation[];
103
+ }
104
+
105
+ /** Per-machine merge pass: compatibility + gap rules (see module doc). */
106
+ function mergeTrack(
107
+ machine: string,
108
+ track: TimelineObservation[],
109
+ pauses: readonly (readonly [number, number])[],
110
+ ): MergedObservations[] {
111
+ const cards: MergedObservations[] = [];
112
+ let current: TimelineObservation[] = [];
113
+ const pauseStartsAfter = (fromMs: number, toMs: number): boolean =>
114
+ pauses.some(([ps, pe]) => ps >= fromMs && ps < toMs && pe > ps);
115
+ for (const observation of track) {
116
+ const last = current[current.length - 1];
117
+ if (last !== undefined) {
118
+ const gap = canonicalMs(observation.capturedAtUtc) - canonicalMs(last.capturedAtUtc);
119
+ const sameKey = observation.app === last.app && observation.windowTitle === last.windowTitle;
120
+ const pauseBetween = pauseStartsAfter(canonicalMs(last.capturedAtUtc), canonicalMs(observation.capturedAtUtc));
121
+ if (!sameKey || gap > TIMELINE_MERGE_GAP_MS || pauseBetween) {
122
+ cards.push({ machine, observations: current });
123
+ current = [];
124
+ }
125
+ }
126
+ current.push(observation);
127
+ }
128
+ if (current.length > 0) cards.push({ machine, observations: current });
129
+ return cards;
130
+ }
131
+
132
+ /** Build one replayable local day of timeline cards. Pure; throws on bad input. */
133
+ export function buildTimelineDay(input: TimelineBuildInput): TimelineDay {
134
+ const categories = input.categories ?? DEFAULT_TIMELINE_CATEGORIES;
135
+ validateTimelineCategories(categories);
136
+ const window = activityDayWindow(input.date, input.timezone);
137
+ const dayStartMs = Date.parse(window.startUtc);
138
+ const dayEndMs = Date.parse(window.endUtc);
139
+
140
+ // Observations: canonicalize, drop instants outside the day window.
141
+ const observations = input.observations
142
+ .filter((observation) => Number.isFinite(canonicalMs(observation.capturedAtUtc)))
143
+ .filter((observation) => {
144
+ const ms = canonicalMs(observation.capturedAtUtc);
145
+ return ms >= dayStartMs && ms < dayEndMs;
146
+ });
147
+
148
+ // Pauses: validate instants, clip to the day, union overlaps.
149
+ for (const pause of input.pauses ?? []) {
150
+ const startMs = canonicalMs(pause.startUtc);
151
+ const endMs = canonicalMs(pause.endUtc);
152
+ if (!Number.isFinite(startMs) || !Number.isFinite(endMs) || startMs >= endMs) {
153
+ throw new RangeError("timeline pause must be a valid half-open [startUtc, endUtc) interval");
154
+ }
155
+ }
156
+ const pauseIntervals = unionIntervals(
157
+ (input.pauses ?? [])
158
+ .map((pause) => [canonicalMs(pause.startUtc), canonicalMs(pause.endUtc)] as const)
159
+ .map(([startMs, endMs]) => [Math.max(startMs, dayStartMs), Math.min(endMs, dayEndMs)] as const)
160
+ .filter(([startMs, endMs]) => endMs > startMs),
161
+ );
162
+
163
+ // Group per machine; sort by (instant, contentHash) — position-independent.
164
+ const tracks = new Map<string, TimelineObservation[]>();
165
+ for (const observation of observations) {
166
+ const track = tracks.get(observation.machine) ?? [];
167
+ track.push(observation);
168
+ tracks.set(observation.machine, track);
169
+ }
170
+ for (const track of tracks.values()) {
171
+ track.sort(
172
+ (a, b) => canonicalMs(a.capturedAtUtc) - canonicalMs(b.capturedAtUtc) || (a.contentHash < b.contentHash ? -1 : a.contentHash > b.contentHash ? 1 : 0),
173
+ );
174
+ }
175
+
176
+ const cards: TimelineCard[] = [];
177
+ const machines = [...tracks.keys()].sort();
178
+ for (const machine of machines) {
179
+ const track = tracks.get(machine) ?? [];
180
+ const merged = mergeTrack(machine, track, pauseIntervals);
181
+ // [startMs, endMs] per merged card, reused by the idle pass below.
182
+ const trackIntervals: Array<[number, number]> = [];
183
+ for (let index = 0; index < merged.length; index++) {
184
+ const group = merged[index];
185
+ const first = group.observations[0];
186
+ const last = group.observations[group.observations.length - 1];
187
+ const startMs = canonicalMs(first.capturedAtUtc);
188
+ const lastMs = canonicalMs(last.capturedAtUtc);
189
+ const nextObsMs = index + 1 < merged.length ? canonicalMs(merged[index + 1].observations[0].capturedAtUtc) : Number.POSITIVE_INFINITY;
190
+ const pauseStartMs = pauseIntervals.find(([ps]) => ps > lastMs)?.[0] ?? Number.POSITIVE_INFINITY;
191
+ const endMs = Math.max(lastMs, Math.min(lastMs + TIMELINE_MAX_DWELL_MS, nextObsMs, pauseStartMs, dayEndMs));
192
+ trackIntervals.push([startMs, endMs]);
193
+ const evidenceIds = group.observations.map((observation) => observation.id);
194
+ const classification = classifyTimelineObservation(first, categories);
195
+ cards.push({
196
+ id: stableCardId(`activity|${machine}|${evidenceKeyOf(first)}|${evidenceKeyOf(last)}`),
197
+ kind: "activity",
198
+ title: first.windowTitle.length > 0 ? first.windowTitle : first.app,
199
+ summary: `${first.app} · ${machine} · ${evidenceIds.length} obs · ${formatDurationMinutes(endMs - startMs)}`,
200
+ categoryId: classification.categoryId,
201
+ confidence: classification.confidence,
202
+ startUtc: isoOf(startMs),
203
+ endUtc: isoOf(endMs),
204
+ dayKey: input.date,
205
+ timezone: input.timezone,
206
+ machine,
207
+ evidenceIds,
208
+ evidenceRange: { firstKey: evidenceKeyOf(first), lastKey: evidenceKeyOf(last) },
209
+ });
210
+ }
211
+
212
+ // Idle: uncovered remainders between consecutive cards on this track,
213
+ // pauses removed (a pause wins over idle covering the same minutes).
214
+ for (let index = 0; index + 1 < trackIntervals.length; index++) {
215
+ const gapStart = trackIntervals[index][1];
216
+ const gapEnd = trackIntervals[index + 1][0];
217
+ if (gapEnd <= gapStart) continue;
218
+ let pieces: Array<[number, number]> = [[gapStart, gapEnd]];
219
+ for (const [pauseStart, pauseEnd] of pauseIntervals) {
220
+ pieces = pieces.flatMap(([start, end]) => subtractInterval(start, end, pauseStart, pauseEnd));
221
+ }
222
+ for (const [start, end] of pieces) {
223
+ cards.push({
224
+ id: stableCardId(`idle|${machine}|${isoOf(start)}|${isoOf(end)}`),
225
+ kind: "idle",
226
+ title: "Idle",
227
+ summary: `${formatDurationMinutes(end - start)} gap on ${machine}`,
228
+ categoryId: TIMELINE_RESERVED_IDLE,
229
+ confidence: 1,
230
+ startUtc: isoOf(start),
231
+ endUtc: isoOf(end),
232
+ dayKey: input.date,
233
+ timezone: input.timezone,
234
+ machine,
235
+ evidenceIds: [],
236
+ evidenceRange: null,
237
+ });
238
+ }
239
+ }
240
+ }
241
+
242
+ for (const [pauseStart, pauseEnd] of pauseIntervals) {
243
+ const reason = (input.pauses ?? []).find((pause) => canonicalMs(pause.startUtc) === pauseStart)?.reason;
244
+ cards.push({
245
+ id: stableCardId(`pause|${isoOf(pauseStart)}|${isoOf(pauseEnd)}`),
246
+ kind: "pause",
247
+ title: "Paused",
248
+ summary: reason === undefined ? `${formatDurationMinutes(pauseEnd - pauseStart)} user pause` : `${formatDurationMinutes(pauseEnd - pauseStart)} user pause — ${reason}`,
249
+ categoryId: TIMELINE_RESERVED_PAUSE,
250
+ confidence: 1,
251
+ startUtc: isoOf(pauseStart),
252
+ endUtc: isoOf(pauseEnd),
253
+ dayKey: input.date,
254
+ timezone: input.timezone,
255
+ machine: null,
256
+ evidenceIds: [],
257
+ evidenceRange: null,
258
+ });
259
+ }
260
+
261
+ cards.sort((a, b) => a.startUtc < b.startUtc ? -1 : a.startUtc > b.startUtc ? 1 : a.endUtc < b.endUtc ? -1 : a.endUtc > b.endUtc ? 1 : (a.machine ?? "") < (b.machine ?? "") ? -1 : (a.machine ?? "") > (b.machine ?? "") ? 1 : a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
262
+
263
+ return {
264
+ formatVersion: TIMELINE_FORMAT_VERSION,
265
+ date: input.date,
266
+ timezone: input.timezone,
267
+ startUtc: window.startUtc,
268
+ endUtc: window.endUtc,
269
+ cards,
270
+ };
271
+ }
272
+
273
+ /**
274
+ * Canonical byte-stable serialization. Card objects are constructed in a
275
+ * fixed field order, so `JSON.stringify` output is stable across runs.
276
+ */
277
+ export function serializeTimelineDay(day: TimelineDay): string {
278
+ return JSON.stringify(day);
279
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Timeline category registry (issue #2049): ordered definitions with stable
3
+ * IDs, names, colors, descriptions, and system/idle flags. Reserved system
4
+ * categories (`system.*`) must always be present; unknown activity stays
5
+ * visible in `system.unknown` rather than being silently reassigned.
6
+ */
7
+
8
+ import type { TimelineCategory } from "./types.js";
9
+
10
+ export const TIMELINE_RESERVED_UNKNOWN = "system.unknown";
11
+ export const TIMELINE_RESERVED_IDLE = "system.idle";
12
+ export const TIMELINE_RESERVED_PAUSE = "system.pause";
13
+
14
+ const COLOR_PATTERN = /^#[0-9a-fA-F]{6}$/;
15
+
16
+ function isTimelineCategoryId(id: string): boolean {
17
+ const parts = id.split(".");
18
+ if (parts.length === 0) return false;
19
+ for (const part of parts) {
20
+ if (part.length === 0) return false;
21
+ const first = part.charCodeAt(0);
22
+ if (first < 97 || first > 122) return false;
23
+ for (let i = 1; i < part.length; i += 1) {
24
+ const code = part.charCodeAt(i);
25
+ const ok = (code >= 97 && code <= 122) || (code >= 48 && code <= 57) || code === 45;
26
+ if (!ok) return false;
27
+ }
28
+ }
29
+ return true;
30
+ }
31
+
32
+
33
+ /**
34
+ * Default registry. User category orders step by 10 so a corrected registry
35
+ * can insert between without renumbering; system categories sort last.
36
+ */
37
+ export const DEFAULT_TIMELINE_CATEGORIES: readonly TimelineCategory[] = [
38
+ { id: "development", name: "Development", color: "#3b82f6", description: "Editors, terminals, IDEs, and code forges.", order: 10 },
39
+ { id: "communication", name: "Communication", color: "#f59e0b", description: "Mail, chat, and meetings.", order: 20 },
40
+ { id: "browsing", name: "Browsing", color: "#6366f1", description: "Web browsing without a more specific domain match.", order: 30 },
41
+ { id: "documents", name: "Documents", color: "#10b981", description: "Writing, notes, and PDFs.", order: 40 },
42
+ { id: "design", name: "Design & Media", color: "#ec4899", description: "Design, audio, and video tools.", order: 50 },
43
+ { id: "data", name: "Data & Analysis", color: "#84cc16", description: "Spreadsheets, dashboards, and databases.", order: 60 },
44
+ { id: "admin", name: "Admin", color: "#64748b", description: "File managers, settings, and system utilities.", order: 70 },
45
+ { id: "entertainment", name: "Entertainment", color: "#ef4444", description: "Video, music, and games.", order: 80 },
46
+ { id: TIMELINE_RESERVED_UNKNOWN, name: "Uncategorized", color: "#9ca3af", description: "Activity with no matching classification signal. Kept visible, never silently reassigned.", order: 990, system: true },
47
+ { id: TIMELINE_RESERVED_IDLE, name: "Idle", color: "#d1d5db", description: "Derived gap between cards where no activity was observed.", order: 991, system: true, idle: true },
48
+ { id: TIMELINE_RESERVED_PAUSE, name: "Paused", color: "#a78bfa", description: "User-declared pause interval.", order: 992, system: true },
49
+ ];
50
+
51
+ /**
52
+ * Validate a registry: unique well-formed ids, non-empty names, hex colors,
53
+ * integer orders, reserved categories present and correctly flagged, and the
54
+ * `system.` namespace reserved. Throws with the offending key path.
55
+ */
56
+ export function validateTimelineCategories(categories: readonly TimelineCategory[]): void {
57
+ if (!Array.isArray(categories) || categories.length === 0) {
58
+ throw new RangeError("timeline categories must be a non-empty array");
59
+ }
60
+ const seen = new Set<string>();
61
+ for (const category of categories) {
62
+ if (typeof category.id !== "string" || !isTimelineCategoryId(category.id)) {
63
+ throw new RangeError(`timeline category id must be dotted kebab-case: ${String(category.id)}`);
64
+ }
65
+ if (seen.has(category.id)) {
66
+ throw new RangeError(`timeline category id must be unique: ${category.id}`);
67
+ }
68
+ seen.add(category.id);
69
+ if (typeof category.name !== "string" || category.name.length === 0) {
70
+ throw new RangeError(`timeline category ${category.id}: name must be a non-empty string`);
71
+ }
72
+ if (typeof category.color !== "string" || !COLOR_PATTERN.test(category.color)) {
73
+ throw new RangeError(`timeline category ${category.id}: color must be #RRGGBB`);
74
+ }
75
+ if (typeof category.description !== "string" || category.description.length === 0) {
76
+ throw new RangeError(`timeline category ${category.id}: description must be a non-empty string`);
77
+ }
78
+ if (!Number.isInteger(category.order)) {
79
+ throw new RangeError(`timeline category ${category.id}: order must be an integer`);
80
+ }
81
+ const isReserved = category.id === TIMELINE_RESERVED_UNKNOWN || category.id === TIMELINE_RESERVED_IDLE || category.id === TIMELINE_RESERVED_PAUSE;
82
+ if (isReserved && category.system !== true) {
83
+ throw new RangeError(`timeline category ${category.id} is reserved and must set system: true`);
84
+ }
85
+ if (!isReserved) {
86
+ if (category.id.startsWith("system.")) {
87
+ throw new RangeError(`timeline category id namespace "system." is reserved: ${category.id}`);
88
+ }
89
+ if (category.system === true || category.idle === true) {
90
+ throw new RangeError(`timeline category ${category.id}: only reserved categories may set system/idle flags`);
91
+ }
92
+ }
93
+ }
94
+ const idle = categories.find((category) => category.id === TIMELINE_RESERVED_IDLE);
95
+ if (idle !== undefined && idle.idle !== true) {
96
+ throw new RangeError(`timeline category ${TIMELINE_RESERVED_IDLE} must set idle: true`);
97
+ }
98
+ for (const reserved of [TIMELINE_RESERVED_UNKNOWN, TIMELINE_RESERVED_IDLE, TIMELINE_RESERVED_PAUSE]) {
99
+ if (!categories.some((category) => category.id === reserved)) {
100
+ throw new RangeError(`timeline categories must include the reserved "${reserved}" category`);
101
+ }
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Deterministic presentation order: by `order`, then by id as the equal-order
107
+ * tie-breaker, so two categories sharing an order never swap between runs.
108
+ */
109
+ export function sortTimelineCategories(categories: readonly TimelineCategory[]): TimelineCategory[] {
110
+ return [...categories].sort((a, b) => a.order - b.order || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0));
111
+ }