@remnic/core 9.65.7 → 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 (713) hide show
  1. package/dist/access-admin-ops-surface.d.ts +15 -14
  2. package/dist/access-admin-ops-surface.js +65 -62
  3. package/dist/access-authorization-probe.d.ts +15 -14
  4. package/dist/access-authorization-probe.js +66 -63
  5. package/dist/access-boundary.d.ts +15 -14
  6. package/dist/access-boundary.js +65 -62
  7. package/dist/access-citation-namespace.js +3 -3
  8. package/dist/access-cli.js +182 -174
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +2 -2
  11. package/dist/access-coding-context-resolution.js +2 -2
  12. package/dist/access-extraction-force-flush.d.ts +15 -14
  13. package/dist/access-extraction-force-flush.js +65 -62
  14. package/dist/access-health-types.d.ts +2 -2
  15. package/dist/access-http-lcm-compaction.d.ts +15 -14
  16. package/dist/access-http-lifecycle-flush.d.ts +15 -14
  17. package/dist/access-http-offline-stream.d.ts +15 -14
  18. package/dist/access-http-query.d.ts +3 -3
  19. package/dist/access-http-query.js +67 -64
  20. package/dist/access-http.d.ts +16 -15
  21. package/dist/access-http.js +87 -84
  22. package/dist/access-identity-continuity-surface.d.ts +13 -12
  23. package/dist/access-identity-continuity-surface.js +65 -62
  24. package/dist/access-lcm-surface.d.ts +15 -14
  25. package/dist/access-lcm-surface.js +65 -62
  26. package/dist/access-mcp-output-schemas.js +1 -1
  27. package/dist/access-mcp.d.ts +15 -14
  28. package/dist/access-mcp.js +77 -74
  29. package/dist/access-memory-search-fanout.d.ts +3 -3
  30. package/dist/{access-namespace-preflight-8VYKmRX0.d.ts → access-namespace-preflight-CLWUoMyW.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +4 -4
  32. package/dist/access-namespace-preflight.js +65 -62
  33. package/dist/access-observe-write-surface.d.ts +15 -14
  34. package/dist/access-observe-write-surface.js +65 -62
  35. package/dist/access-offline-manifest.d.ts +13 -12
  36. package/dist/access-offline-manifest.js +16 -16
  37. package/dist/access-operations-batch.js +69 -66
  38. package/dist/access-operations.d.ts +16 -15
  39. package/dist/access-operations.js +74 -71
  40. package/dist/access-recall-concurrency.d.ts +15 -14
  41. package/dist/access-recall-concurrency.js +65 -62
  42. package/dist/access-recall-response.d.ts +15 -14
  43. package/dist/access-recall-response.js +65 -62
  44. package/dist/access-recall-surface.d.ts +15 -14
  45. package/dist/access-recall-surface.js +65 -62
  46. package/dist/access-schema.js +7 -7
  47. package/dist/{access-service-Crk__Git.d.ts → access-service-CEUE1Isj.d.ts} +14 -14
  48. package/dist/access-service-helpers.d.ts +15 -14
  49. package/dist/access-service.d.ts +15 -14
  50. package/dist/access-service.js +65 -62
  51. package/dist/access-surface-catalog.d.ts +15 -14
  52. package/dist/access-surface-catalog.js +69 -64
  53. package/dist/access-surface-catalog.js.map +1 -1
  54. package/dist/access-wearables-meetings-surface.d.ts +6 -4
  55. package/dist/action-confidence.d.ts +2 -2
  56. package/dist/active-context-config.d.ts +27 -0
  57. package/dist/active-context-config.js +14 -0
  58. package/dist/active-context-transform.d.ts +267 -0
  59. package/dist/active-context-transform.js +31 -0
  60. package/dist/active-memory-bridge.d.ts +2 -2
  61. package/dist/active-memory-bridge.js +2 -2
  62. package/dist/active-recall.d.ts +2 -2
  63. package/dist/active-recall.js +17 -16
  64. package/dist/active-recall.js.map +1 -1
  65. package/dist/adapters/index.js +7 -7
  66. package/dist/adapters/registry.js +3 -3
  67. package/dist/ambient-provenance.d.ts +2 -2
  68. package/dist/artifact-search.d.ts +2 -2
  69. package/dist/{auto-sync-XVMLL2RH.js → auto-sync-Q6Q2FVSC.js} +10 -10
  70. package/dist/behavior-learner.d.ts +2 -2
  71. package/dist/behavior-signals.d.ts +2 -2
  72. package/dist/bootstrap.d.ts +13 -12
  73. package/dist/briefing-window.d.ts +5 -3
  74. package/dist/briefing.d.ts +5 -3
  75. package/dist/briefing.js +33 -33
  76. package/dist/buffer-surprise-report.d.ts +2 -2
  77. package/dist/buffer-turn-helpers.d.ts +2 -2
  78. package/dist/buffer.d.ts +5 -3
  79. package/dist/buffer.js +24 -8
  80. package/dist/bulk-import/index.d.ts +4 -4
  81. package/dist/calibration.d.ts +2 -2
  82. package/dist/calibration.js +1 -1
  83. package/dist/capabilities.d.ts +2 -2
  84. package/dist/{capsule-merge-SGIVB3WA.js → capsule-merge-SEHERWWP.js} +4 -4
  85. package/dist/{catalog-DybwVNW3.d.ts → catalog-D1HgugTA.d.ts} +1 -1
  86. package/dist/causal-behavior.d.ts +4 -4
  87. package/dist/causal-consolidation.d.ts +2 -2
  88. package/dist/causal-consolidation.js +34 -34
  89. package/dist/causal-trajectory-graph.d.ts +2 -2
  90. package/dist/{chunk-CFGU52XJ.js → chunk-23CVL7HS.js} +2 -2
  91. package/dist/{chunk-PO7NXBG2.js → chunk-2GF27PGH.js} +5 -5
  92. package/dist/{chunk-6CPUQ5D6.js → chunk-2LBAFHOQ.js} +15 -15
  93. package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
  94. package/dist/{chunk-IP4ZNT4U.js → chunk-33MFRY25.js} +2 -2
  95. package/dist/{chunk-VFYRYFLL.js → chunk-3TSU662L.js} +3 -3
  96. package/dist/chunk-43HUVDTD.js +114 -0
  97. package/dist/chunk-43HUVDTD.js.map +1 -0
  98. package/dist/{chunk-VXVZ2GM3.js → chunk-4FHRZD5T.js} +2 -2
  99. package/dist/{chunk-FP7YTTVO.js → chunk-4OFKZAJG.js} +2 -1
  100. package/dist/chunk-4OFKZAJG.js.map +1 -0
  101. package/dist/{chunk-5VPQSRQO.js → chunk-4STAANV7.js} +3 -3
  102. package/dist/{chunk-46WM6JX2.js → chunk-4ZWCQJNM.js} +5 -5
  103. package/dist/{chunk-LLQCM2U2.js → chunk-56IV4J5W.js} +617 -167
  104. package/dist/chunk-56IV4J5W.js.map +1 -0
  105. package/dist/{chunk-52II7PB6.js → chunk-645WOU5I.js} +4 -4
  106. package/dist/{chunk-YKWFK7XA.js → chunk-6CEGSTBD.js} +7 -7
  107. package/dist/{chunk-I7EX6KSH.js → chunk-6QDXA26G.js} +264 -210
  108. package/dist/chunk-6QDXA26G.js.map +1 -0
  109. package/dist/{chunk-GEPACVWN.js → chunk-6RUHELWR.js} +3 -3
  110. package/dist/{chunk-ZAOHJDKH.js → chunk-72OIT7KS.js} +4 -4
  111. package/dist/{chunk-KQAFEZQX.js → chunk-7LCGFUMB.js} +4 -4
  112. package/dist/{chunk-7TCGNUVP.js → chunk-7UTDHQZ5.js} +3 -3
  113. package/dist/{chunk-5HK3CJAR.js → chunk-7XOG75AU.js} +3 -3
  114. package/dist/{chunk-7BDZTALN.js → chunk-AJTG3CP7.js} +12 -2
  115. package/dist/chunk-AJTG3CP7.js.map +1 -0
  116. package/dist/{chunk-2LWQSV6A.js → chunk-AL3UYZ5N.js} +3 -2
  117. package/dist/chunk-AL3UYZ5N.js.map +1 -0
  118. package/dist/chunk-B32WYRXX.js +77 -0
  119. package/dist/chunk-B32WYRXX.js.map +1 -0
  120. package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
  121. package/dist/{chunk-YOXVZJFM.js → chunk-CFVTRUR3.js} +2 -2
  122. package/dist/{chunk-ACOC27BB.js → chunk-CN4VKV3S.js} +2 -2
  123. package/dist/{chunk-PMVPCZJZ.js → chunk-CTCGHNWN.js} +6 -6
  124. package/dist/{chunk-EGBDFJ36.js → chunk-DD5JFCWM.js} +2 -2
  125. package/dist/{chunk-T42L3S6A.js → chunk-DDX6KIXF.js} +2 -2
  126. package/dist/{chunk-JIYDRBVZ.js → chunk-DJORULH3.js} +2 -2
  127. package/dist/{chunk-WTOZBZNN.js → chunk-DMEHOEC7.js} +6 -6
  128. package/dist/{chunk-OPPBTPUU.js → chunk-DUAJKRR2.js} +4 -4
  129. package/dist/{chunk-XDL5CYZN.js → chunk-EEOUMG3J.js} +2 -1
  130. package/dist/{chunk-XDL5CYZN.js.map → chunk-EEOUMG3J.js.map} +1 -1
  131. package/dist/{chunk-SVVIASVX.js → chunk-EFQCDJZ2.js} +7 -7
  132. package/dist/{chunk-Q57GOHLF.js → chunk-EGALNSZ4.js} +3 -3
  133. package/dist/{chunk-KCT36JAW.js → chunk-ESNFSSO4.js} +2 -2
  134. package/dist/{chunk-XQ3HXAQH.js → chunk-ET2CNMLD.js} +4 -4
  135. package/dist/{chunk-Z4U3UN56.js → chunk-EZSCW4EM.js} +6 -6
  136. package/dist/{chunk-F6QHHRWP.js → chunk-FESUGFIL.js} +3 -3
  137. package/dist/{chunk-S3K2CIK5.js → chunk-FKKGCGYL.js} +3 -3
  138. package/dist/{chunk-BWGCOLEL.js → chunk-FTTJRVB7.js} +2 -2
  139. package/dist/{chunk-JAQXUGLN.js → chunk-FYWLSFFS.js} +2 -2
  140. package/dist/{chunk-BJTHRFFC.js → chunk-GEJKYA7D.js} +77 -36
  141. package/dist/chunk-GEJKYA7D.js.map +1 -0
  142. package/dist/chunk-GSKINLAK.js +267 -0
  143. package/dist/chunk-GSKINLAK.js.map +1 -0
  144. package/dist/{chunk-OPGL46PX.js → chunk-GX6FTSYH.js} +2 -2
  145. package/dist/{chunk-A32YEQAM.js → chunk-H7VDIF2V.js} +2 -2
  146. package/dist/{chunk-PDDSFELN.js → chunk-HJXA6ZM7.js} +2 -2
  147. package/dist/{chunk-RGCF4XNH.js → chunk-HNPE66LB.js} +8 -8
  148. package/dist/{chunk-SEA6M7SS.js → chunk-I5VB44ZK.js} +2 -2
  149. package/dist/{chunk-SDEPLF7V.js → chunk-IBJ6U753.js} +2 -2
  150. package/dist/{chunk-EUYWQ7TS.js → chunk-IEZ6CGTW.js} +2 -2
  151. package/dist/{chunk-RQE4TITU.js → chunk-IHGMRDEE.js} +431 -1834
  152. package/dist/chunk-IHGMRDEE.js.map +1 -0
  153. package/dist/{chunk-3RI5Y7KU.js → chunk-IVIAHQBR.js} +2 -2
  154. package/dist/{chunk-7WR462EM.js → chunk-J3OND5QT.js} +4 -4
  155. package/dist/{chunk-UW5NPZJ2.js → chunk-JALOAKSZ.js} +59 -7
  156. package/dist/chunk-JALOAKSZ.js.map +1 -0
  157. package/dist/{chunk-T3JQTCCO.js → chunk-JI7U6AS3.js} +4 -4
  158. package/dist/{chunk-DVYRD4HY.js → chunk-JRRQ747T.js} +36 -7
  159. package/dist/chunk-JRRQ747T.js.map +1 -0
  160. package/dist/{chunk-I32NKXE2.js → chunk-JTWZKNUH.js} +5 -5
  161. package/dist/chunk-K66OY4EI.js +202 -0
  162. package/dist/chunk-K66OY4EI.js.map +1 -0
  163. package/dist/{chunk-XAB6STPO.js → chunk-KODXCHXJ.js} +17 -3
  164. package/dist/chunk-KODXCHXJ.js.map +1 -0
  165. package/dist/{chunk-ZPUIRTIZ.js → chunk-KOLJJN5G.js} +12 -75
  166. package/dist/chunk-KOLJJN5G.js.map +1 -0
  167. package/dist/{chunk-FMQ4MOQO.js → chunk-KXIXO76C.js} +32 -19
  168. package/dist/chunk-KXIXO76C.js.map +1 -0
  169. package/dist/{chunk-VKCAHCBI.js → chunk-L4X4PJYK.js} +2 -2
  170. package/dist/chunk-LB7WCZHY.js +553 -0
  171. package/dist/chunk-LB7WCZHY.js.map +1 -0
  172. package/dist/{chunk-W4BMEGQA.js → chunk-LUDBXTBJ.js} +8 -8
  173. package/dist/{chunk-I4343FIA.js → chunk-MAH64N55.js} +28 -10
  174. package/dist/chunk-MAH64N55.js.map +1 -0
  175. package/dist/{chunk-RIAM7DND.js → chunk-ME35HVDJ.js} +2 -2
  176. package/dist/{chunk-H63EDPFJ.js → chunk-MI2OTWV5.js} +15 -2
  177. package/dist/{chunk-H63EDPFJ.js.map → chunk-MI2OTWV5.js.map} +1 -1
  178. package/dist/{chunk-LBFFNDFM.js → chunk-MINHJ55X.js} +1 -1
  179. package/dist/chunk-MINHJ55X.js.map +1 -0
  180. package/dist/{chunk-NG3MBQV4.js → chunk-MJRGVXPQ.js} +2 -2
  181. package/dist/{chunk-773TRRGT.js → chunk-MJUCDM3C.js} +2 -2
  182. package/dist/{chunk-7F27PCSN.js → chunk-MN5NOOI7.js} +2 -2
  183. package/dist/{chunk-JCWY73FK.js → chunk-N4F7ZSSG.js} +2 -2
  184. package/dist/{chunk-TR7DGXGI.js → chunk-NACLNNFQ.js} +5 -5
  185. package/dist/{chunk-LC2BDILZ.js → chunk-NBP4EX5N.js} +2 -2
  186. package/dist/{chunk-ZVPVTPGI.js → chunk-NNZFPYYX.js} +4 -4
  187. package/dist/{chunk-MFOSZUIT.js → chunk-NPIBN2VL.js} +2 -2
  188. package/dist/{chunk-IY7UXD3J.js → chunk-O57GM3FR.js} +2 -2
  189. package/dist/{chunk-I2HTKOOP.js → chunk-O7ERGZDA.js} +5 -5
  190. package/dist/{chunk-GTSVEEP3.js → chunk-OAJMQKQR.js} +3 -3
  191. package/dist/{chunk-HSZMX3ZJ.js → chunk-ODW5GDFE.js} +2 -2
  192. package/dist/{chunk-D4QVPP3G.js → chunk-PEBH5DCK.js} +18 -11
  193. package/dist/chunk-PEBH5DCK.js.map +1 -0
  194. package/dist/{chunk-J2WC5LF4.js → chunk-QBC33MPY.js} +2 -1
  195. package/dist/{chunk-EOHKUWXW.js → chunk-QCRJMU5V.js} +2 -2
  196. package/dist/chunk-QJCWK2A7.js +1466 -0
  197. package/dist/chunk-QJCWK2A7.js.map +1 -0
  198. package/dist/{chunk-THG4GYIE.js → chunk-RDGKVH6T.js} +11 -7
  199. package/dist/{chunk-THG4GYIE.js.map → chunk-RDGKVH6T.js.map} +1 -1
  200. package/dist/{chunk-5DH6PG4B.js → chunk-RZ3IZIJG.js} +3 -3
  201. package/dist/{chunk-AAXJNINV.js → chunk-SN4JXNLL.js} +2 -2
  202. package/dist/chunk-TB2MJRI6.js +866 -0
  203. package/dist/chunk-TB2MJRI6.js.map +1 -0
  204. package/dist/{chunk-7PHI6GUI.js → chunk-TEZ2HTC7.js} +42 -2
  205. package/dist/chunk-TEZ2HTC7.js.map +1 -0
  206. package/dist/{chunk-SVSRPG6M.js → chunk-TNGH4ZYI.js} +2 -2
  207. package/dist/{chunk-HZNYJN77.js → chunk-TNXNECAN.js} +6 -6
  208. package/dist/{chunk-JOEJG4SD.js → chunk-TVW4C7PV.js} +5 -5
  209. package/dist/{chunk-UFKPQBXH.js → chunk-U62OK7BB.js} +2 -2
  210. package/dist/{chunk-R2MZCYA6.js → chunk-UNUMFURP.js} +3 -3
  211. package/dist/{chunk-AX7UXCHJ.js → chunk-UYA36DQ7.js} +2 -1
  212. package/dist/chunk-UYA36DQ7.js.map +1 -0
  213. package/dist/{chunk-AFR6AIM4.js → chunk-VCKWULAK.js} +112 -87
  214. package/dist/chunk-VCKWULAK.js.map +1 -0
  215. package/dist/chunk-VOSWUO3K.js +100 -0
  216. package/dist/chunk-VOSWUO3K.js.map +1 -0
  217. package/dist/{chunk-YRVAKONL.js → chunk-VQ4AMTGZ.js} +1 -1
  218. package/dist/{chunk-3BCULS4U.js → chunk-VQNRICAQ.js} +145 -507
  219. package/dist/chunk-VQNRICAQ.js.map +1 -0
  220. package/dist/{chunk-RAIUTAZZ.js → chunk-WKAXBXVA.js} +2 -2
  221. package/dist/{chunk-ZIJDI4CP.js → chunk-WKJFIMVN.js} +2 -2
  222. package/dist/{chunk-SXIMQLGV.js → chunk-WVGXCBOC.js} +2 -2
  223. package/dist/{chunk-7BEPVIH3.js → chunk-X5YYSAZX.js} +4 -4
  224. package/dist/{chunk-FZEEWOI2.js → chunk-XJJYSX6F.js} +2 -2
  225. package/dist/{chunk-F635GAL7.js → chunk-XKNHFDTT.js} +33 -13
  226. package/dist/chunk-XKNHFDTT.js.map +1 -0
  227. package/dist/{chunk-UG6VXIOK.js → chunk-XSTNGNJP.js} +2 -2
  228. package/dist/{chunk-YDPAE2RD.js → chunk-YFLLGRXO.js} +2 -2
  229. package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
  230. package/dist/{chunk-ANJXPFRS.js → chunk-YXFCALVT.js} +14 -14
  231. package/dist/{chunk-Q4WONDMJ.js → chunk-YYGZJPOK.js} +2 -2
  232. package/dist/{chunk-5HERQ5FX.js → chunk-Z3YEGSR4.js} +10 -10
  233. package/dist/{chunk-YWSQD2IB.js → chunk-ZJPM7GZ3.js} +2 -2
  234. package/dist/{chunk-5S4LQOPE.js → chunk-ZW4VXELZ.js} +2 -2
  235. package/dist/{cli-B322UMvB.d.ts → cli-BEkm2MEf.d.ts} +5 -5
  236. package/dist/cli.d.ts +17 -16
  237. package/dist/cli.js +126 -120
  238. package/dist/coding/export-okf-codegraph.d.ts +56 -0
  239. package/dist/coding/export-okf-codegraph.js +526 -0
  240. package/dist/coding/export-okf-codegraph.js.map +1 -0
  241. package/dist/coding/pre-action-gate.d.ts +2 -2
  242. package/dist/compounding/engine.d.ts +5 -3
  243. package/dist/compounding/engine.js +34 -34
  244. package/dist/compounding/preference-consolidator.d.ts +4 -4
  245. package/dist/compression-optimizer.d.ts +2 -2
  246. package/dist/config-security.js +2 -2
  247. package/dist/config.d.ts +2 -2
  248. package/dist/config.js +17 -16
  249. package/dist/connectors/codex-materialize-runner.d.ts +2 -2
  250. package/dist/connectors/codex-materialize-runner.js +33 -33
  251. package/dist/connectors/codex-materialize.d.ts +2 -2
  252. package/dist/connectors/index.d.ts +2 -2
  253. package/dist/connectors/index.js +33 -33
  254. package/dist/consolidation-provenance-check.d.ts +5 -3
  255. package/dist/consolidation-provenance-check.js +5 -5
  256. package/dist/consolidation-undo.d.ts +5 -3
  257. package/dist/consolidation-undo.js +3 -3
  258. package/dist/context-summary.d.ts +43 -0
  259. package/dist/context-summary.js +14 -0
  260. package/dist/context-summary.js.map +1 -0
  261. package/dist/contradiction/index.d.ts +6 -4
  262. package/dist/contradiction/index.js +10 -10
  263. package/dist/{contradiction-scan-AKUWPX5N.js → contradiction-scan-NOYMFG66.js} +3 -3
  264. package/dist/contradiction-scan-NOYMFG66.js.map +1 -0
  265. package/dist/converge-config.d.ts +2 -2
  266. package/dist/convergence-refresh.d.ts +5 -3
  267. package/dist/convergence-refresh.js +36 -36
  268. package/dist/conversation-index/backend.d.ts +2 -2
  269. package/dist/conversation-index/chunker.d.ts +2 -2
  270. package/dist/conversation-index/faiss-adapter.d.ts +2 -2
  271. package/dist/conversation-index/indexer.d.ts +2 -2
  272. package/dist/conversation-index/search.d.ts +2 -2
  273. package/dist/corpus-watermark.d.ts +2 -2
  274. package/dist/corpus-watermark.js +35 -35
  275. package/dist/cross-lingual-recall.d.ts +2 -2
  276. package/dist/dashboard-runtime.js +2 -2
  277. package/dist/day-summary.d.ts +2 -2
  278. package/dist/delinearize.d.ts +2 -2
  279. package/dist/dependency-propagation-config.d.ts +2 -2
  280. package/dist/{dependency-propagation-delivery-BGcNairQ.d.ts → dependency-propagation-delivery-BCpeo14F.d.ts} +1 -1
  281. package/dist/direct-answer-wiring.d.ts +2 -2
  282. package/dist/direct-answer.d.ts +2 -2
  283. package/dist/embedding-fallback.d.ts +2 -2
  284. package/dist/enrichment/index.d.ts +2 -2
  285. package/dist/entity-origin-fields.d.ts +2 -2
  286. package/dist/entity-retrieval.d.ts +5 -3
  287. package/dist/entity-retrieval.js +34 -34
  288. package/dist/entity-schema.d.ts +2 -2
  289. package/dist/episodic-context.d.ts +2 -2
  290. package/dist/eval-trajectory-contracts.d.ts +2 -2
  291. package/dist/eval-trajectory-store.d.ts +2 -2
  292. package/dist/eval-trajectory.d.ts +2 -2
  293. package/dist/event-order-recall.js +3 -3
  294. package/dist/explicit-capture.d.ts +13 -12
  295. package/dist/explicit-capture.js +12 -12
  296. package/dist/external-wiki-access.d.ts +15 -14
  297. package/dist/external-wiki-access.js +66 -63
  298. package/dist/external-wiki-collection-registration.d.ts +2 -2
  299. package/dist/external-wiki-collection.d.ts +2 -2
  300. package/dist/external-wiki-mcp-tools.d.ts +15 -14
  301. package/dist/extraction-error-classification.d.ts +2 -2
  302. package/dist/extraction-faithfulness.d.ts +2 -2
  303. package/dist/extraction-faithfulness.js +2 -2
  304. package/dist/extraction-judge-telemetry.d.ts +2 -2
  305. package/dist/extraction-judge-training.d.ts +2 -2
  306. package/dist/extraction-judge.d.ts +2 -2
  307. package/dist/extraction-judge.js +2 -2
  308. package/dist/extraction-liveness.d.ts +2 -2
  309. package/dist/extraction-normalization.d.ts +2 -2
  310. package/dist/extraction-prompt.d.ts +2 -2
  311. package/dist/extraction-source-grounding-rules.d.ts +2 -2
  312. package/dist/extraction-source-grounding.d.ts +2 -2
  313. package/dist/extraction.d.ts +2 -2
  314. package/dist/extraction.js +47 -44
  315. package/dist/fallback-llm.d.ts +8 -2
  316. package/dist/fallback-llm.js +1 -1
  317. package/dist/{first-start-migration-4NETATFF.js → first-start-migration-KHIMCBIC.js} +3 -3
  318. package/dist/{forget-SZ2BXDGF.js → forget-2AE4MDK3.js} +3 -3
  319. package/dist/graph-dashboard-diff.d.ts +2 -2
  320. package/dist/graph-dashboard-key.d.ts +2 -2
  321. package/dist/graph-dashboard-parser.d.ts +2 -2
  322. package/dist/graph-edge-reinforcement.d.ts +2 -2
  323. package/dist/graph-path-reconstruction.d.ts +2 -2
  324. package/dist/graph-path-scoring.d.ts +2 -2
  325. package/dist/graph-snapshot.d.ts +2 -2
  326. package/dist/graph.d.ts +2 -2
  327. package/dist/harmonic-retrieval.js +1 -1
  328. package/dist/importance.d.ts +2 -2
  329. package/dist/importers/index.d.ts +2 -2
  330. package/dist/in-flight-reads.d.ts +2 -2
  331. package/dist/{index-By2QUAMh.d.ts → index-D_pyMUaP.d.ts} +2 -2
  332. package/dist/index.d.ts +261 -30
  333. package/dist/index.js +321 -257
  334. package/dist/intent.d.ts +2 -2
  335. package/dist/lcm/engine.d.ts +3 -3
  336. package/dist/lcm/engine.js +5 -4
  337. package/dist/lcm/index.d.ts +4 -3
  338. package/dist/lcm/index.js +12 -11
  339. package/dist/lcm/summarizer.d.ts +4 -6
  340. package/dist/lcm/summarizer.js +2 -1
  341. package/dist/lcm/tools.d.ts +4 -4
  342. package/dist/lifecycle.d.ts +2 -2
  343. package/dist/live-connectors-runner.d.ts +2 -2
  344. package/dist/local-llm.d.ts +2 -2
  345. package/dist/local-model-endpoint.d.ts +2 -2
  346. package/dist/location/index.d.ts +315 -6
  347. package/dist/location/index.js +151 -19
  348. package/dist/maintenance/memory-governance.d.ts +2 -2
  349. package/dist/maintenance/memory-governance.js +34 -34
  350. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +5 -3
  351. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +33 -33
  352. package/dist/maintenance/rebuild-memory-projection.d.ts +5 -3
  353. package/dist/maintenance/rebuild-memory-projection.js +35 -35
  354. package/dist/{maintenance-Dm2McrIx.d.ts → maintenance-DDUX9d6D.d.ts} +3 -3
  355. package/dist/mcp-memory-inspector-app.d.ts +15 -14
  356. package/dist/mcp-read-only-tools.js +1 -1
  357. package/dist/memory-action-policy.d.ts +18 -3
  358. package/dist/memory-action-policy.js +3 -1
  359. package/dist/memory-cache.d.ts +2 -2
  360. package/dist/memory-controller.d.ts +2 -2
  361. package/dist/memory-controller.js +2 -2
  362. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -2
  363. package/dist/memory-projection-mutations.js +3 -3
  364. package/dist/memory-projection-store.d.ts +2 -2
  365. package/dist/memory-projection-store.js +1 -1
  366. package/dist/memory-provenance.d.ts +2 -2
  367. package/dist/memory-snapshot.d.ts +2 -2
  368. package/dist/memory-subject-cli.d.ts +15 -14
  369. package/dist/memory-subject.d.ts +15 -14
  370. package/dist/memory-subject.js +5 -5
  371. package/dist/memory-worth-outcomes.d.ts +5 -3
  372. package/dist/models-json.d.ts +2 -2
  373. package/dist/namespaces/migrate.d.ts +6 -4
  374. package/dist/namespaces/migrate.js +34 -34
  375. package/dist/namespaces/principal.d.ts +2 -2
  376. package/dist/namespaces/search.d.ts +2 -2
  377. package/dist/namespaces/search.js +8 -8
  378. package/dist/namespaces/storage.d.ts +6 -4
  379. package/dist/namespaces/storage.js +33 -33
  380. package/dist/native-knowledge.d.ts +2 -2
  381. package/dist/offline-sync-file-io.js +3 -3
  382. package/dist/offline-sync-impression-drain.d.ts +2 -2
  383. package/dist/offline-sync-impression-drain.js +9 -9
  384. package/dist/offline-sync.js +4 -4
  385. package/dist/operator-doctor-corpus.d.ts +2 -2
  386. package/dist/operator-doctor-corpus.js +36 -36
  387. package/dist/operator-doctor-replica.d.ts +2 -2
  388. package/dist/operator-toolkit.d.ts +6 -4
  389. package/dist/operator-toolkit.js +56 -55
  390. package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -3
  391. package/dist/orchestration/maintenance.d.ts +7 -5
  392. package/dist/orchestration/maintenance.js +48 -47
  393. package/dist/{orchestrator-Co1DyfuP.d.ts → orchestrator-3F4jihCo.d.ts} +8 -8
  394. package/dist/orchestrator.d.ts +13 -12
  395. package/dist/orchestrator.js +182 -174
  396. package/dist/page-versioning.js +3 -3
  397. package/dist/patterns-cli.d.ts +2 -2
  398. package/dist/{pipeline-DotMnb6y.d.ts → pipeline-CB1dj6Uh.d.ts} +1 -1
  399. package/dist/policy-runtime.d.ts +2 -2
  400. package/dist/proactive-contention.d.ts +2 -2
  401. package/dist/provenance.d.ts +2 -2
  402. package/dist/{public-http-PJRtnSi-.d.ts → public-http-34-JIAGQ.d.ts} +1 -1
  403. package/dist/{purge-GB7PZHT2.js → purge-OP6BEDFY.js} +2 -2
  404. package/dist/{qmd-BP0n11fR.d.ts → qmd-edLLZXc5.d.ts} +1 -1
  405. package/dist/qmd-preflight.d.ts +3 -3
  406. package/dist/qmd-recall-cache.d.ts +2 -2
  407. package/dist/qmd.d.ts +3 -3
  408. package/dist/qmd.js +4 -4
  409. package/dist/recall-concurrency-config.d.ts +2 -2
  410. package/dist/recall-disclosure-escalation.d.ts +2 -2
  411. package/dist/recall-explain-renderer.d.ts +2 -2
  412. package/dist/recall-explain-renderer.js +3 -3
  413. package/dist/recall-memory-map.d.ts +2 -2
  414. package/dist/recall-planner-llm.d.ts +2 -2
  415. package/dist/recall-planner-llm.js +1 -1
  416. package/dist/recall-state.d.ts +2 -2
  417. package/dist/recall-tag-filter.d.ts +2 -2
  418. package/dist/recall-timings.d.ts +2 -2
  419. package/dist/recall-xray-cli.d.ts +2 -2
  420. package/dist/recall-xray-cli.js +4 -4
  421. package/dist/recall-xray-renderer.d.ts +2 -2
  422. package/dist/recall-xray-renderer.js +3 -3
  423. package/dist/recall-xray.d.ts +2 -2
  424. package/dist/recall-xray.js +2 -2
  425. package/dist/reconcile/cursor.d.ts +2 -2
  426. package/dist/reconcile/manifest.d.ts +2 -2
  427. package/dist/reconcile/manifest.js +5 -5
  428. package/dist/reconcile/plan.d.ts +2 -2
  429. package/dist/replay/normalizers/chatgpt.d.ts +2 -2
  430. package/dist/replay/normalizers/claude.d.ts +2 -2
  431. package/dist/replay/normalizers/openclaw.d.ts +2 -2
  432. package/dist/replay/normalizers/shared.d.ts +2 -2
  433. package/dist/replay/runner.d.ts +2 -2
  434. package/dist/replay/types.d.ts +2 -2
  435. package/dist/replica-divergence.d.ts +2 -2
  436. package/dist/replica-peers-config.d.ts +2 -2
  437. package/dist/{resolution-4552BNRV.js → resolution-4DLI3IOR.js} +11 -11
  438. package/dist/resolution-4DLI3IOR.js.map +1 -0
  439. package/dist/resolve-auth-token.d.ts +2 -2
  440. package/dist/resume-bundles.js +18 -17
  441. package/dist/retrieval-agents.d.ts +3 -3
  442. package/dist/retrieval-tiers.d.ts +2 -2
  443. package/dist/routing/engine.d.ts +2 -2
  444. package/dist/routing/store.d.ts +2 -2
  445. package/dist/salvage-envelope.d.ts +2 -2
  446. package/dist/salvage-envelope.js +7 -7
  447. package/dist/schemas.d.ts +572 -107
  448. package/dist/schemas.js +3 -1
  449. package/dist/{scope-profiles-6ChZKTy-.d.ts → scope-profiles-BF2lu81V.d.ts} +1 -1
  450. package/dist/search/document-scanner.js +1 -1
  451. package/dist/search/embed-helper.d.ts +2 -2
  452. package/dist/search/factory.d.ts +2 -2
  453. package/dist/search/factory.js +7 -7
  454. package/dist/search/index.d.ts +2 -2
  455. package/dist/search/index.js +13 -13
  456. package/dist/search/lancedb-backend.d.ts +2 -2
  457. package/dist/search/lancedb-backend.js +1 -1
  458. package/dist/search/meilisearch-backend.d.ts +2 -2
  459. package/dist/search/meilisearch-backend.js +1 -1
  460. package/dist/search/noop-backend.d.ts +2 -2
  461. package/dist/search/orama-backend.d.ts +2 -2
  462. package/dist/search/orama-backend.js +1 -1
  463. package/dist/search/port.d.ts +2 -2
  464. package/dist/search/remote-backend.d.ts +2 -2
  465. package/dist/secure-store/index.js +3 -3
  466. package/dist/{semantic-consolidation-DziYcW5J.d.ts → semantic-consolidation-5OuWXBRt.d.ts} +1 -1
  467. package/dist/semantic-consolidation.d.ts +3 -3
  468. package/dist/semantic-consolidation.js +37 -37
  469. package/dist/semantic-rule-promotion.js +33 -33
  470. package/dist/semantic-rule-verifier.d.ts +2 -2
  471. package/dist/semantic-rule-verifier.js +33 -33
  472. package/dist/{service-C7rIBuK_.d.ts → service-CrqEhLXD.d.ts} +2 -2
  473. package/dist/session-observer-bands.d.ts +2 -2
  474. package/dist/session-observer-state.d.ts +2 -2
  475. package/dist/shared-context/manager.d.ts +2 -2
  476. package/dist/signal.d.ts +2 -2
  477. package/dist/source-agent-qualifier.d.ts +2 -2
  478. package/dist/source-agent-qualifier.js +42 -39
  479. package/dist/standup/build.d.ts +16 -0
  480. package/dist/standup/build.js +17 -0
  481. package/dist/standup/build.js.map +1 -0
  482. package/dist/{storage-B1hEx8Xg.d.ts → storage-BQn-xnxm.d.ts} +4 -1
  483. package/dist/storage.d.ts +5 -3
  484. package/dist/storage.js +32 -32
  485. package/dist/subject-config.d.ts +2 -2
  486. package/dist/subject-config.js +6 -6
  487. package/dist/summarizer.d.ts +2 -2
  488. package/dist/summarizer.js +2 -2
  489. package/dist/summary-snapshot.d.ts +2 -2
  490. package/dist/support-passport/index.d.ts +20 -19
  491. package/dist/support-passport/index.js +68 -65
  492. package/dist/temporal-supersession.d.ts +3 -3
  493. package/dist/temporal-timeline-recall.d.ts +2 -2
  494. package/dist/temporal-validity.d.ts +2 -2
  495. package/dist/threading.d.ts +2 -2
  496. package/dist/tier-migration.d.ts +5 -3
  497. package/dist/tier-routing.d.ts +2 -2
  498. package/dist/tier-routing.js +2 -2
  499. package/dist/{tier-stats-4B5IJ3NE.js → tier-stats-2TOW3QNL.js} +3 -3
  500. package/dist/topics.d.ts +2 -2
  501. package/dist/transcript.d.ts +2 -2
  502. package/dist/transfer/capsule-export.js +2 -2
  503. package/dist/transfer/capsule-import.js +5 -5
  504. package/dist/transfer/export-okf.d.ts +39 -0
  505. package/dist/transfer/export-okf.js +112 -0
  506. package/dist/transfer/export-okf.js.map +1 -0
  507. package/dist/transfer/types.d.ts +12 -12
  508. package/dist/trust-score-stage.d.ts +2 -2
  509. package/dist/trust-score.d.ts +2 -2
  510. package/dist/{types-BHDNxGTT.d.ts → types-BRpcNjHZ.d.ts} +119 -3
  511. package/dist/types.d.ts +2 -2
  512. package/dist/types.js +1 -1
  513. package/dist/utility-runtime.d.ts +2 -2
  514. package/dist/verified-recall.js +33 -33
  515. package/dist/who-knows-cli.d.ts +15 -14
  516. package/dist/who-knows-cli.js +34 -34
  517. package/dist/who-knows.d.ts +15 -14
  518. package/dist/who-knows.js +33 -33
  519. package/dist/write-envelope.d.ts +2 -2
  520. package/dist/write-envelope.js +6 -6
  521. package/package.json +54 -3
  522. package/src/access-admin-ops-surface.ts +6 -1
  523. package/src/access-boundary.ts +1 -0
  524. package/src/access-http.ts +3 -1
  525. package/src/access-mcp-output-schemas.ts +1 -0
  526. package/src/access-mcp.ts +3 -3
  527. package/src/access-operations.ts +1 -0
  528. package/src/access-service-offline-file-content.test.ts +63 -0
  529. package/src/access-surface-catalog.ts +2 -0
  530. package/src/active-context-config.ts +98 -0
  531. package/src/active-context-transform.test.ts +533 -0
  532. package/src/active-context-transform.ts +981 -0
  533. package/src/activity/config.test.ts +1 -0
  534. package/src/activity/config.ts +21 -1
  535. package/src/activity/index.ts +1 -0
  536. package/src/activity/timeline/build.ts +279 -0
  537. package/src/activity/timeline/categories.ts +111 -0
  538. package/src/activity/timeline/classify.ts +110 -0
  539. package/src/activity/timeline/corrections.ts +145 -0
  540. package/src/activity/timeline/index.ts +6 -0
  541. package/src/activity/timeline/timeline.test.ts +277 -0
  542. package/src/activity/timeline/types.ts +106 -0
  543. package/src/activity/types.ts +6 -0
  544. package/src/cli/okf-commands.ts +45 -0
  545. package/src/cli.ts +2 -2
  546. package/src/coding/export-okf-codegraph.test.ts +381 -0
  547. package/src/coding/export-okf-codegraph.ts +565 -0
  548. package/src/config.test.ts +1 -0
  549. package/src/config.ts +3 -5
  550. package/src/context-summary.ts +182 -0
  551. package/src/extraction-prompt-safety.test.ts +14 -2
  552. package/src/extraction.ts +21 -1
  553. package/src/fallback-llm.test.ts +134 -0
  554. package/src/fallback-llm.ts +77 -5
  555. package/src/index.ts +4 -11
  556. package/src/lcm/summarizer.ts +14 -93
  557. package/src/location/access-operations.ts +17 -8
  558. package/src/location/backfill.ts +137 -0
  559. package/src/location/config.test.ts +3 -0
  560. package/src/location/config.ts +46 -2
  561. package/src/location/http-glue.ts +1 -1
  562. package/src/location/index.ts +3 -0
  563. package/src/location/intervals.ts +1 -0
  564. package/src/location/matching.test.ts +65 -0
  565. package/src/location/matching.ts +354 -0
  566. package/src/location/mcp-tools.ts +2 -1
  567. package/src/location/surfaces.test.ts +15 -2
  568. package/src/location/surfaces.ts +95 -18
  569. package/src/location/tagging.test.ts +119 -0
  570. package/src/location/tagging.ts +277 -0
  571. package/src/location/types.ts +23 -1
  572. package/src/mcp-read-only-tools.ts +1 -0
  573. package/src/memory-action-policy.ts +28 -0
  574. package/src/memory-projection-store.ts +3 -1
  575. package/src/okf/cli.ts +18 -5
  576. package/src/okf/config.ts +5 -0
  577. package/src/okf/index-files.test.ts +60 -0
  578. package/src/okf/index-files.ts +114 -0
  579. package/src/okf/render.ts +133 -0
  580. package/src/okf/type-mapping.test.ts +3 -0
  581. package/src/okf/type-mapping.ts +2 -0
  582. package/src/orchestration/extraction-run.ts +2 -1
  583. package/src/orchestration/generic-recall-paths.ts +4 -3
  584. package/src/schemas.ts +17 -1
  585. package/src/standup/access-operations.ts +14 -0
  586. package/src/standup/build.test.ts +34 -0
  587. package/src/standup/build.ts +115 -0
  588. package/src/standup/http-glue.ts +15 -0
  589. package/src/standup/mcp-tools.ts +16 -0
  590. package/src/storage/context-transform-ledger.ts +39 -0
  591. package/src/storage/secure-line-reader.ts +50 -1
  592. package/src/storage.ts +4 -1
  593. package/src/support-passport/card-projection.ts +1 -0
  594. package/src/support-passport/card-service-commit-forwarding.test.ts +1 -0
  595. package/src/support-passport/card-service.test.ts +75 -1
  596. package/src/support-passport/card-service.ts +6 -3
  597. package/src/support-passport/card-state.ts +5 -1
  598. package/src/support-passport/offline-sync-guard.ts +14 -1
  599. package/src/transfer/export-okf.test.ts +164 -0
  600. package/src/transfer/export-okf.ts +286 -0
  601. package/src/types.ts +2 -3
  602. package/dist/chunk-2LWQSV6A.js.map +0 -1
  603. package/dist/chunk-3BCULS4U.js.map +0 -1
  604. package/dist/chunk-7BDZTALN.js.map +0 -1
  605. package/dist/chunk-7PHI6GUI.js.map +0 -1
  606. package/dist/chunk-AFR6AIM4.js.map +0 -1
  607. package/dist/chunk-AX7UXCHJ.js.map +0 -1
  608. package/dist/chunk-BJTHRFFC.js.map +0 -1
  609. package/dist/chunk-D4QVPP3G.js.map +0 -1
  610. package/dist/chunk-DVYRD4HY.js.map +0 -1
  611. package/dist/chunk-F635GAL7.js.map +0 -1
  612. package/dist/chunk-FMQ4MOQO.js.map +0 -1
  613. package/dist/chunk-FP7YTTVO.js.map +0 -1
  614. package/dist/chunk-I4343FIA.js.map +0 -1
  615. package/dist/chunk-I7EX6KSH.js.map +0 -1
  616. package/dist/chunk-LBFFNDFM.js.map +0 -1
  617. package/dist/chunk-LLQCM2U2.js.map +0 -1
  618. package/dist/chunk-RQE4TITU.js.map +0 -1
  619. package/dist/chunk-UW5NPZJ2.js.map +0 -1
  620. package/dist/chunk-XAB6STPO.js.map +0 -1
  621. package/dist/chunk-ZPUIRTIZ.js.map +0 -1
  622. package/dist/types-CM86alG1.d.ts +0 -89
  623. /package/dist/{contradiction-scan-AKUWPX5N.js.map → active-context-config.js.map} +0 -0
  624. /package/dist/{resolution-4552BNRV.js.map → active-context-transform.js.map} +0 -0
  625. /package/dist/{auto-sync-XVMLL2RH.js.map → auto-sync-Q6Q2FVSC.js.map} +0 -0
  626. /package/dist/{capsule-merge-SGIVB3WA.js.map → capsule-merge-SEHERWWP.js.map} +0 -0
  627. /package/dist/{chunk-CFGU52XJ.js.map → chunk-23CVL7HS.js.map} +0 -0
  628. /package/dist/{chunk-PO7NXBG2.js.map → chunk-2GF27PGH.js.map} +0 -0
  629. /package/dist/{chunk-6CPUQ5D6.js.map → chunk-2LBAFHOQ.js.map} +0 -0
  630. /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
  631. /package/dist/{chunk-IP4ZNT4U.js.map → chunk-33MFRY25.js.map} +0 -0
  632. /package/dist/{chunk-VFYRYFLL.js.map → chunk-3TSU662L.js.map} +0 -0
  633. /package/dist/{chunk-VXVZ2GM3.js.map → chunk-4FHRZD5T.js.map} +0 -0
  634. /package/dist/{chunk-5VPQSRQO.js.map → chunk-4STAANV7.js.map} +0 -0
  635. /package/dist/{chunk-46WM6JX2.js.map → chunk-4ZWCQJNM.js.map} +0 -0
  636. /package/dist/{chunk-52II7PB6.js.map → chunk-645WOU5I.js.map} +0 -0
  637. /package/dist/{chunk-YKWFK7XA.js.map → chunk-6CEGSTBD.js.map} +0 -0
  638. /package/dist/{chunk-GEPACVWN.js.map → chunk-6RUHELWR.js.map} +0 -0
  639. /package/dist/{chunk-ZAOHJDKH.js.map → chunk-72OIT7KS.js.map} +0 -0
  640. /package/dist/{chunk-KQAFEZQX.js.map → chunk-7LCGFUMB.js.map} +0 -0
  641. /package/dist/{chunk-7TCGNUVP.js.map → chunk-7UTDHQZ5.js.map} +0 -0
  642. /package/dist/{chunk-5HK3CJAR.js.map → chunk-7XOG75AU.js.map} +0 -0
  643. /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
  644. /package/dist/{chunk-YOXVZJFM.js.map → chunk-CFVTRUR3.js.map} +0 -0
  645. /package/dist/{chunk-ACOC27BB.js.map → chunk-CN4VKV3S.js.map} +0 -0
  646. /package/dist/{chunk-PMVPCZJZ.js.map → chunk-CTCGHNWN.js.map} +0 -0
  647. /package/dist/{chunk-EGBDFJ36.js.map → chunk-DD5JFCWM.js.map} +0 -0
  648. /package/dist/{chunk-T42L3S6A.js.map → chunk-DDX6KIXF.js.map} +0 -0
  649. /package/dist/{chunk-JIYDRBVZ.js.map → chunk-DJORULH3.js.map} +0 -0
  650. /package/dist/{chunk-WTOZBZNN.js.map → chunk-DMEHOEC7.js.map} +0 -0
  651. /package/dist/{chunk-OPPBTPUU.js.map → chunk-DUAJKRR2.js.map} +0 -0
  652. /package/dist/{chunk-SVVIASVX.js.map → chunk-EFQCDJZ2.js.map} +0 -0
  653. /package/dist/{chunk-Q57GOHLF.js.map → chunk-EGALNSZ4.js.map} +0 -0
  654. /package/dist/{chunk-KCT36JAW.js.map → chunk-ESNFSSO4.js.map} +0 -0
  655. /package/dist/{chunk-XQ3HXAQH.js.map → chunk-ET2CNMLD.js.map} +0 -0
  656. /package/dist/{chunk-Z4U3UN56.js.map → chunk-EZSCW4EM.js.map} +0 -0
  657. /package/dist/{chunk-F6QHHRWP.js.map → chunk-FESUGFIL.js.map} +0 -0
  658. /package/dist/{chunk-S3K2CIK5.js.map → chunk-FKKGCGYL.js.map} +0 -0
  659. /package/dist/{chunk-BWGCOLEL.js.map → chunk-FTTJRVB7.js.map} +0 -0
  660. /package/dist/{chunk-JAQXUGLN.js.map → chunk-FYWLSFFS.js.map} +0 -0
  661. /package/dist/{chunk-OPGL46PX.js.map → chunk-GX6FTSYH.js.map} +0 -0
  662. /package/dist/{chunk-A32YEQAM.js.map → chunk-H7VDIF2V.js.map} +0 -0
  663. /package/dist/{chunk-PDDSFELN.js.map → chunk-HJXA6ZM7.js.map} +0 -0
  664. /package/dist/{chunk-RGCF4XNH.js.map → chunk-HNPE66LB.js.map} +0 -0
  665. /package/dist/{chunk-SEA6M7SS.js.map → chunk-I5VB44ZK.js.map} +0 -0
  666. /package/dist/{chunk-SDEPLF7V.js.map → chunk-IBJ6U753.js.map} +0 -0
  667. /package/dist/{chunk-EUYWQ7TS.js.map → chunk-IEZ6CGTW.js.map} +0 -0
  668. /package/dist/{chunk-3RI5Y7KU.js.map → chunk-IVIAHQBR.js.map} +0 -0
  669. /package/dist/{chunk-7WR462EM.js.map → chunk-J3OND5QT.js.map} +0 -0
  670. /package/dist/{chunk-T3JQTCCO.js.map → chunk-JI7U6AS3.js.map} +0 -0
  671. /package/dist/{chunk-I32NKXE2.js.map → chunk-JTWZKNUH.js.map} +0 -0
  672. /package/dist/{chunk-VKCAHCBI.js.map → chunk-L4X4PJYK.js.map} +0 -0
  673. /package/dist/{chunk-W4BMEGQA.js.map → chunk-LUDBXTBJ.js.map} +0 -0
  674. /package/dist/{chunk-RIAM7DND.js.map → chunk-ME35HVDJ.js.map} +0 -0
  675. /package/dist/{chunk-NG3MBQV4.js.map → chunk-MJRGVXPQ.js.map} +0 -0
  676. /package/dist/{chunk-773TRRGT.js.map → chunk-MJUCDM3C.js.map} +0 -0
  677. /package/dist/{chunk-7F27PCSN.js.map → chunk-MN5NOOI7.js.map} +0 -0
  678. /package/dist/{chunk-JCWY73FK.js.map → chunk-N4F7ZSSG.js.map} +0 -0
  679. /package/dist/{chunk-TR7DGXGI.js.map → chunk-NACLNNFQ.js.map} +0 -0
  680. /package/dist/{chunk-LC2BDILZ.js.map → chunk-NBP4EX5N.js.map} +0 -0
  681. /package/dist/{chunk-ZVPVTPGI.js.map → chunk-NNZFPYYX.js.map} +0 -0
  682. /package/dist/{chunk-MFOSZUIT.js.map → chunk-NPIBN2VL.js.map} +0 -0
  683. /package/dist/{chunk-IY7UXD3J.js.map → chunk-O57GM3FR.js.map} +0 -0
  684. /package/dist/{chunk-I2HTKOOP.js.map → chunk-O7ERGZDA.js.map} +0 -0
  685. /package/dist/{chunk-GTSVEEP3.js.map → chunk-OAJMQKQR.js.map} +0 -0
  686. /package/dist/{chunk-HSZMX3ZJ.js.map → chunk-ODW5GDFE.js.map} +0 -0
  687. /package/dist/{chunk-J2WC5LF4.js.map → chunk-QBC33MPY.js.map} +0 -0
  688. /package/dist/{chunk-EOHKUWXW.js.map → chunk-QCRJMU5V.js.map} +0 -0
  689. /package/dist/{chunk-5DH6PG4B.js.map → chunk-RZ3IZIJG.js.map} +0 -0
  690. /package/dist/{chunk-AAXJNINV.js.map → chunk-SN4JXNLL.js.map} +0 -0
  691. /package/dist/{chunk-SVSRPG6M.js.map → chunk-TNGH4ZYI.js.map} +0 -0
  692. /package/dist/{chunk-HZNYJN77.js.map → chunk-TNXNECAN.js.map} +0 -0
  693. /package/dist/{chunk-JOEJG4SD.js.map → chunk-TVW4C7PV.js.map} +0 -0
  694. /package/dist/{chunk-UFKPQBXH.js.map → chunk-U62OK7BB.js.map} +0 -0
  695. /package/dist/{chunk-R2MZCYA6.js.map → chunk-UNUMFURP.js.map} +0 -0
  696. /package/dist/{chunk-YRVAKONL.js.map → chunk-VQ4AMTGZ.js.map} +0 -0
  697. /package/dist/{chunk-RAIUTAZZ.js.map → chunk-WKAXBXVA.js.map} +0 -0
  698. /package/dist/{chunk-ZIJDI4CP.js.map → chunk-WKJFIMVN.js.map} +0 -0
  699. /package/dist/{chunk-SXIMQLGV.js.map → chunk-WVGXCBOC.js.map} +0 -0
  700. /package/dist/{chunk-7BEPVIH3.js.map → chunk-X5YYSAZX.js.map} +0 -0
  701. /package/dist/{chunk-FZEEWOI2.js.map → chunk-XJJYSX6F.js.map} +0 -0
  702. /package/dist/{chunk-UG6VXIOK.js.map → chunk-XSTNGNJP.js.map} +0 -0
  703. /package/dist/{chunk-YDPAE2RD.js.map → chunk-YFLLGRXO.js.map} +0 -0
  704. /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
  705. /package/dist/{chunk-ANJXPFRS.js.map → chunk-YXFCALVT.js.map} +0 -0
  706. /package/dist/{chunk-Q4WONDMJ.js.map → chunk-YYGZJPOK.js.map} +0 -0
  707. /package/dist/{chunk-5HERQ5FX.js.map → chunk-Z3YEGSR4.js.map} +0 -0
  708. /package/dist/{chunk-YWSQD2IB.js.map → chunk-ZJPM7GZ3.js.map} +0 -0
  709. /package/dist/{chunk-5S4LQOPE.js.map → chunk-ZW4VXELZ.js.map} +0 -0
  710. /package/dist/{first-start-migration-4NETATFF.js.map → first-start-migration-KHIMCBIC.js.map} +0 -0
  711. /package/dist/{forget-SZ2BXDGF.js.map → forget-2AE4MDK3.js.map} +0 -0
  712. /package/dist/{purge-GB7PZHT2.js.map → purge-OP6BEDFY.js.map} +0 -0
  713. /package/dist/{tier-stats-4B5IJ3NE.js.map → tier-stats-2TOW3QNL.js.map} +0 -0
@@ -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
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Deterministic first-pass timeline classification (issue #2049).
3
+ *
4
+ * Signal-only: application name, browser domain, and window-title keywords.
5
+ * No LLM, no scoring, no intent inference — an app/window match says what was
6
+ * on screen, never that the user meant it. First matching rule (in declared
7
+ * order: domain, then app, then title) wins; no match stays visible in the
8
+ * reserved `system.unknown` category with confidence 0.
9
+ */
10
+
11
+ import type { TimelineCategory, TimelineObservation } from "./types.js";
12
+ import { TIMELINE_RESERVED_UNKNOWN } from "./categories.js";
13
+
14
+ const DOMAIN_CONFIDENCE = 0.85;
15
+ const APP_CONFIDENCE = 0.9;
16
+ const TITLE_CONFIDENCE = 0.7;
17
+ const UNKNOWN_CONFIDENCE = 0;
18
+
19
+ interface ClassificationRule {
20
+ categoryId: string;
21
+ /** Substring matches against the browser URL host (most specific signal). */
22
+ domains?: readonly string[];
23
+ /** Substring matches against the application name. */
24
+ apps?: readonly string[];
25
+ /** Substring matches against the window title (weakest signal). */
26
+ titles?: readonly string[];
27
+ }
28
+
29
+ /**
30
+ * Ordered rules. Domain rules come first (a browser on github.com is
31
+ * development even though the app is Chrome), then app rules, then title
32
+ * keywords. Order is part of the contract: inserting a rule changes only
33
+ * classifications below it.
34
+ */
35
+ const RULES: readonly ClassificationRule[] = [
36
+ { categoryId: "development", domains: ["github.com", "gitlab.com", "stackoverflow.com", "linear.app", "atlassian.net"] },
37
+ { categoryId: "communication", domains: ["mail.google.com", "gmail.com", "outlook.com", "outlook.office.com", "slack.com"] },
38
+ { categoryId: "design", domains: ["figma.com", "canva.com"] },
39
+ { categoryId: "documents", domains: ["docs.google.com", "notion.so", "dropbox.com"] },
40
+ { categoryId: "entertainment", domains: ["youtube.com", "netflix.com", "spotify.com"] },
41
+ { categoryId: "data", domains: ["metabase", "tableau", "grafana"] },
42
+
43
+ { categoryId: "development", apps: ["code", "cursor", "neovim", "vim", "emacs", "xcode", "intellij", "terminal", "iterm", "warp", "wezterm", "kitty", "alacritty", "zed", "sublime", "datagrip"] },
44
+ { categoryId: "communication", apps: ["slack", "discord", "teams", "mail", "outlook", "thunderbird", "messages", "signal", "whatsapp", "telegram", "zoom", "facetime", "meet"] },
45
+ { categoryId: "design", apps: ["figma", "sketch", "photoshop", "illustrator", "indesign", "premiere", "after effects", "davinci", "blender", "ableton", "logic pro", "final cut"] },
46
+ { categoryId: "documents", apps: ["word", "pages", "notion", "obsidian", "notes", "typora", "bear", "preview", "acrobat"] },
47
+ { categoryId: "data", apps: ["excel", "numbers", "sheets", "tableau"] },
48
+ { categoryId: "admin", apps: ["finder", "settings", "system preferences", "activity monitor", "files", "explorer"] },
49
+ { categoryId: "entertainment", apps: ["spotify", "music", "youtube", "vlc", "quicktime", "steam", "netflix", "podcast", "tv"] },
50
+ { categoryId: "browsing", apps: ["chrome", "safari", "firefox", "edge", "arc", "brave", "browser"] },
51
+
52
+ { categoryId: "development", titles: ["pull request", "merge conflict", "terminal —", "repository"] },
53
+ { categoryId: "communication", titles: ["inbox"] },
54
+ { categoryId: "data", titles: ["spreadsheet", "pivot table"] },
55
+ ];
56
+
57
+ export interface TimelineClassification {
58
+ categoryId: string;
59
+ confidence: number;
60
+ }
61
+
62
+ /**
63
+ * Classify one observation. Throws if a rule targets a category missing from
64
+ * the registry (configuration error must fail loudly, not fall back silently).
65
+ */
66
+ export function classifyTimelineObservation(
67
+ observation: Pick<TimelineObservation, "app" | "windowTitle" | "browserUrl">,
68
+ categories: readonly TimelineCategory[],
69
+ ): TimelineClassification {
70
+ const app = observation.app.toLowerCase();
71
+ const title = observation.windowTitle.toLowerCase();
72
+ const domain = observation.browserUrl === undefined ? "" : hostOf(observation.browserUrl);
73
+ for (const rule of RULES) {
74
+ if (rule.domains !== undefined && domain !== "" && rule.domains.some((pattern) => domain.includes(pattern))) {
75
+ return checkedRule(rule, DOMAIN_CONFIDENCE, categories);
76
+ }
77
+ }
78
+ for (const rule of RULES) {
79
+ if (rule.apps !== undefined && rule.apps.some((pattern) => app.includes(pattern))) {
80
+ return checkedRule(rule, APP_CONFIDENCE, categories);
81
+ }
82
+ }
83
+ for (const rule of RULES) {
84
+ if (rule.titles !== undefined && rule.titles.some((pattern) => title.includes(pattern))) {
85
+ return checkedRule(rule, TITLE_CONFIDENCE, categories);
86
+ }
87
+ }
88
+ return { categoryId: TIMELINE_RESERVED_UNKNOWN, confidence: UNKNOWN_CONFIDENCE };
89
+ }
90
+
91
+ /** Verify the rule's target exists in the registry before returning it. */
92
+ function checkedRule(
93
+ rule: ClassificationRule,
94
+ confidence: number,
95
+ categories: readonly TimelineCategory[],
96
+ ): TimelineClassification {
97
+ if (!categories.some((category) => category.id === rule.categoryId)) {
98
+ throw new RangeError(`timeline classification rule targets unknown category: ${rule.categoryId}`);
99
+ }
100
+ return { categoryId: rule.categoryId, confidence };
101
+ }
102
+
103
+ /** Lowercased hostname of a URL, or "" when unparseable (never throws). */
104
+ function hostOf(url: string): string {
105
+ try {
106
+ return new URL(url).hostname.toLowerCase();
107
+ } catch {
108
+ return url.toLowerCase();
109
+ }
110
+ }