@remnic/core 9.69.32 → 9.69.34

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 (775) hide show
  1. package/dist/access-admin-ops-surface.d.ts +13 -11
  2. package/dist/access-admin-ops-surface.js +64 -59
  3. package/dist/access-authorization-probe.d.ts +13 -11
  4. package/dist/access-authorization-probe.js +65 -60
  5. package/dist/access-boundary.d.ts +13 -11
  6. package/dist/access-boundary.js +64 -59
  7. package/dist/access-cli.js +140 -136
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +2 -1
  10. package/dist/access-coding-context-resolution.js +3 -3
  11. package/dist/access-extraction-force-flush.d.ts +13 -11
  12. package/dist/access-extraction-force-flush.js +64 -59
  13. package/dist/access-health-types.d.ts +2 -1
  14. package/dist/access-http-briefing.d.ts +13 -11
  15. package/dist/access-http-briefing.js +65 -60
  16. package/dist/access-http-lcm-compaction.d.ts +13 -11
  17. package/dist/access-http-lifecycle-flush.d.ts +13 -11
  18. package/dist/access-http-offline-stream.d.ts +13 -11
  19. package/dist/access-http-query.d.ts +3 -2
  20. package/dist/access-http-query.js +66 -61
  21. package/dist/access-http.d.ts +14 -12
  22. package/dist/access-http.js +86 -82
  23. package/dist/access-identity-continuity-surface.d.ts +11 -9
  24. package/dist/access-identity-continuity-surface.js +64 -59
  25. package/dist/access-lcm-surface.d.ts +13 -11
  26. package/dist/access-lcm-surface.js +64 -59
  27. package/dist/access-mcp.d.ts +13 -11
  28. package/dist/access-mcp.js +73 -69
  29. package/dist/access-memory-search-fanout.d.ts +3 -2
  30. package/dist/{access-namespace-preflight-BsvmyENS.d.ts → access-namespace-preflight-kXG8MvYx.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +4 -3
  32. package/dist/access-namespace-preflight.js +64 -59
  33. package/dist/access-observe-transcript.d.ts +11 -9
  34. package/dist/access-observe-transcript.js +3 -3
  35. package/dist/access-observe-write-surface.d.ts +15 -13
  36. package/dist/access-observe-write-surface.js +64 -59
  37. package/dist/access-offline-manifest.d.ts +47 -11
  38. package/dist/access-offline-manifest.js +18 -16
  39. package/dist/access-operations-batch.js +67 -63
  40. package/dist/access-operations.d.ts +18 -16
  41. package/dist/access-operations.js +72 -68
  42. package/dist/access-recall-concurrency.d.ts +13 -11
  43. package/dist/access-recall-concurrency.js +64 -59
  44. package/dist/access-recall-response.d.ts +13 -11
  45. package/dist/access-recall-response.js +64 -59
  46. package/dist/access-recall-surface.d.ts +13 -11
  47. package/dist/access-recall-surface.js +64 -59
  48. package/dist/access-schema.d.ts +138 -96
  49. package/dist/access-schema.js +15 -1
  50. package/dist/{access-service-CCpOuS46.d.ts → access-service-WUm2LnXZ.d.ts} +110 -108
  51. package/dist/access-service-helpers.d.ts +13 -11
  52. package/dist/access-service.d.ts +13 -11
  53. package/dist/access-service.js +64 -59
  54. package/dist/access-surface-catalog.d.ts +13 -11
  55. package/dist/access-surface-catalog.js +66 -61
  56. package/dist/access-surface-catalog.js.map +1 -1
  57. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  58. package/dist/action-confidence.d.ts +2 -1
  59. package/dist/active-memory-bridge.d.ts +2 -1
  60. package/dist/active-memory-bridge.js +2 -2
  61. package/dist/active-recall.d.ts +2 -1
  62. package/dist/active-recall.js +14 -12
  63. package/dist/active-recall.js.map +1 -1
  64. package/dist/activity/digest.d.ts +56 -0
  65. package/dist/activity/digest.js +32 -0
  66. package/dist/adapters/index.d.ts +46 -1
  67. package/dist/adapters/index.js +13 -9
  68. package/dist/adapters/registry.js +3 -3
  69. package/dist/ambient-provenance.d.ts +2 -1
  70. package/dist/artifact-search.d.ts +2 -1
  71. package/dist/{auto-sync-NSHLUAQI.js → auto-sync-4YFATLFQ.js} +10 -9
  72. package/dist/{auto-sync-NSHLUAQI.js.map → auto-sync-4YFATLFQ.js.map} +1 -1
  73. package/dist/behavior-learner.d.ts +2 -1
  74. package/dist/behavior-signals.d.ts +2 -1
  75. package/dist/bootstrap.d.ts +11 -9
  76. package/dist/briefing-window.d.ts +3 -2
  77. package/dist/briefing.d.ts +3 -2
  78. package/dist/briefing.js +28 -27
  79. package/dist/buffer-surprise-report.d.ts +2 -1
  80. package/dist/buffer-turn-helpers.d.ts +2 -1
  81. package/dist/buffer.d.ts +3 -2
  82. package/dist/buffer.js +12 -11
  83. package/dist/bulk-import/index.d.ts +4 -3
  84. package/dist/calibration.d.ts +2 -1
  85. package/dist/calibration.js +3 -2
  86. package/dist/calibration.js.map +1 -1
  87. package/dist/capabilities.d.ts +2 -1
  88. package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-ZCXUPLNJ.js} +2 -2
  89. package/dist/{catalog-CDZLyiXL.d.ts → catalog-BaCx29iv.d.ts} +1 -1
  90. package/dist/causal-behavior.d.ts +2 -1
  91. package/dist/causal-consolidation.d.ts +2 -1
  92. package/dist/causal-consolidation.js +29 -28
  93. package/dist/causal-consolidation.js.map +1 -1
  94. package/dist/causal-trajectory-graph.d.ts +2 -1
  95. package/dist/{chunk-CDKHKZL5.js → chunk-2524MOWK.js} +2 -2
  96. package/dist/{chunk-HVAEXYPL.js → chunk-255PC37A.js} +47 -25
  97. package/dist/chunk-255PC37A.js.map +1 -0
  98. package/dist/{chunk-IY2FVXM6.js → chunk-2AU4D4HQ.js} +3 -3
  99. package/dist/{chunk-QDY6KYTN.js → chunk-2JCA2PQT.js} +3 -3
  100. package/dist/{chunk-RSVEP77Y.js → chunk-2UZ5ZH6W.js} +3 -3
  101. package/dist/{chunk-XQ2Q43XD.js → chunk-326KUXIR.js} +15 -648
  102. package/dist/chunk-326KUXIR.js.map +1 -0
  103. package/dist/{chunk-NWWXSJX5.js → chunk-34QW2LK2.js} +2 -2
  104. package/dist/{chunk-S7DPKM5W.js → chunk-353C5UNV.js} +1 -1
  105. package/dist/{chunk-GQOMZ3MK.js → chunk-36UBSLFN.js} +2 -2
  106. package/dist/{chunk-DBQWVT2H.js → chunk-3CBI2ZSA.js} +2 -2
  107. package/dist/{chunk-NZXEK3UF.js → chunk-3Q3N35W7.js} +2 -2
  108. package/dist/{chunk-YYGZJPOK.js → chunk-42DJ235G.js} +2 -2
  109. package/dist/{chunk-7VJXIDOC.js → chunk-4JVQRFZD.js} +9 -9
  110. package/dist/{chunk-22FVR2KE.js → chunk-4MIS4CQW.js} +6 -2
  111. package/dist/chunk-4MIS4CQW.js.map +1 -0
  112. package/dist/{chunk-WHBVXTUI.js → chunk-4PB2MBY6.js} +9 -9
  113. package/dist/{chunk-TEYN7ZYF.js → chunk-4WCNPQQ5.js} +4 -4
  114. package/dist/{chunk-Z4PCVRTN.js → chunk-5A7ZUOBA.js} +217 -396
  115. package/dist/chunk-5A7ZUOBA.js.map +1 -0
  116. package/dist/chunk-5HYUUFMQ.js +1280 -0
  117. package/dist/chunk-5HYUUFMQ.js.map +1 -0
  118. package/dist/{chunk-RBGREYVJ.js → chunk-5QBDLMGG.js} +2 -2
  119. package/dist/{chunk-RKBLRTNT.js → chunk-5SDSVX7N.js} +2 -2
  120. package/dist/{chunk-LPECRQO4.js → chunk-5THU7NFP.js} +3 -3
  121. package/dist/{chunk-N7RWREIQ.js → chunk-65RENJGB.js} +6 -1
  122. package/dist/chunk-65RENJGB.js.map +1 -0
  123. package/dist/{chunk-LWA7MDVO.js → chunk-6CCRSQWT.js} +2 -2
  124. package/dist/{chunk-TIT2C6WX.js → chunk-6XYC7NM4.js} +2 -2
  125. package/dist/{chunk-FHQSPTPZ.js → chunk-6YAIN5XJ.js} +2 -2
  126. package/dist/{chunk-PV36INNL.js → chunk-757NP436.js} +3 -3
  127. package/dist/{chunk-WJBZMNNS.js → chunk-7CAY3YKP.js} +742 -29
  128. package/dist/chunk-7CAY3YKP.js.map +1 -0
  129. package/dist/{chunk-6H5JYDOM.js → chunk-7J2CGXG3.js} +2 -2
  130. package/dist/{chunk-FBMYGNOC.js → chunk-A2YQL2FF.js} +6 -6
  131. package/dist/chunk-A5UQ52YQ.js +211 -0
  132. package/dist/chunk-A5UQ52YQ.js.map +1 -0
  133. package/dist/{chunk-X2NFFBTO.js → chunk-A7GQBJP5.js} +4 -4
  134. package/dist/{chunk-MPYD657E.js → chunk-A7WOWDZK.js} +2 -2
  135. package/dist/{chunk-C4OTC6WY.js → chunk-AIKTQVV3.js} +3 -3
  136. package/dist/{chunk-CGC5UQCF.js → chunk-AKE4GGQ3.js} +2 -2
  137. package/dist/{chunk-VP67GZ7T.js → chunk-APFKZVJS.js} +2 -2
  138. package/dist/{chunk-M75RYSHS.js → chunk-AQIRQUCP.js} +2 -2
  139. package/dist/{chunk-S7T2TY65.js → chunk-AXFR2NQ5.js} +3 -3
  140. package/dist/{chunk-PSPABFN2.js → chunk-BD7JTBYP.js} +4 -4
  141. package/dist/{chunk-FCSZ4K2X.js → chunk-BJJWRWER.js} +3 -3
  142. package/dist/{chunk-JT3EB7ZL.js → chunk-BNGHPYZU.js} +5 -5
  143. package/dist/chunk-BRZWWUCJ.js +13 -0
  144. package/dist/{chunk-FYDW33ZB.js.map → chunk-BRZWWUCJ.js.map} +1 -1
  145. package/dist/{chunk-MFJBANPX.js → chunk-C2BFTYD7.js} +2 -2
  146. package/dist/{chunk-3JVLGJCY.js → chunk-C6KRO3SU.js} +2 -2
  147. package/dist/{chunk-Q3O3VKRB.js → chunk-CRUFVJOX.js} +16 -15
  148. package/dist/chunk-CRUFVJOX.js.map +1 -0
  149. package/dist/{chunk-AOCP6JA7.js → chunk-D3IZCN5P.js} +4 -4
  150. package/dist/{chunk-ROKKIMON.js → chunk-EJIEQOPB.js} +5 -5
  151. package/dist/{chunk-ET356KSB.js → chunk-F4TWWUMP.js} +2 -2
  152. package/dist/{chunk-CLLPJ6QT.js → chunk-FQXJAC3T.js} +2 -2
  153. package/dist/{chunk-DD5JFCWM.js → chunk-GCBIXUPT.js} +2 -2
  154. package/dist/{chunk-ROGRI25A.js → chunk-I3H5LFOI.js} +2 -2
  155. package/dist/{chunk-S65WXHNK.js → chunk-IFFLUCCU.js} +2 -2
  156. package/dist/{chunk-MYMNC6O5.js → chunk-ISYZ5DUI.js} +64 -60
  157. package/dist/{chunk-MYMNC6O5.js.map → chunk-ISYZ5DUI.js.map} +1 -1
  158. package/dist/{chunk-D5LORF7A.js → chunk-JZDH2ZZK.js} +3 -3
  159. package/dist/{chunk-2GPE5UCR.js → chunk-K6IPSW5B.js} +2 -2
  160. package/dist/{chunk-HG6HXVHQ.js → chunk-KDJHLOZP.js} +10 -10
  161. package/dist/{chunk-I27RSQRR.js → chunk-KYGOQV37.js} +2 -2
  162. package/dist/{chunk-JEIXTYVG.js → chunk-L2QLDZJC.js} +46 -17
  163. package/dist/chunk-L2QLDZJC.js.map +1 -0
  164. package/dist/{chunk-A7XEPMQ6.js → chunk-LAVJC57X.js} +3 -3
  165. package/dist/chunk-LAVJC57X.js.map +1 -0
  166. package/dist/{chunk-VZWXFXLX.js → chunk-LMCD5W5B.js} +2 -2
  167. package/dist/{chunk-3QQTXYZ6.js → chunk-LSLCFCCQ.js} +2 -1
  168. package/dist/chunk-LSLCFCCQ.js.map +1 -0
  169. package/dist/{chunk-MKD3OMPS.js → chunk-M3MYMWXG.js} +2 -2
  170. package/dist/{chunk-DITMGZOL.js → chunk-MMG5K6XJ.js} +2 -2
  171. package/dist/{chunk-VGXM5B4H.js → chunk-MNIPH6LD.js} +2 -2
  172. package/dist/{chunk-CZYYJZB6.js → chunk-ND2O2PVN.js} +1014 -1318
  173. package/dist/chunk-ND2O2PVN.js.map +1 -0
  174. package/dist/chunk-NPNSKE76.js +220 -0
  175. package/dist/chunk-NPNSKE76.js.map +1 -0
  176. package/dist/{chunk-MKWKYHXJ.js → chunk-OB3XMWX5.js} +4 -4
  177. package/dist/{chunk-XU6OEECT.js → chunk-OQQXGYMX.js} +3 -3
  178. package/dist/{chunk-GTWHVXPA.js → chunk-OZUXKUPD.js} +6 -4
  179. package/dist/{chunk-GTWHVXPA.js.map → chunk-OZUXKUPD.js.map} +1 -1
  180. package/dist/chunk-PCEYGOSL.js +66 -0
  181. package/dist/chunk-PCEYGOSL.js.map +1 -0
  182. package/dist/{chunk-47DEYNMR.js → chunk-PEXW2JCK.js} +2 -2
  183. package/dist/{chunk-EEOUMG3J.js → chunk-PWPIERBM.js} +38 -6
  184. package/dist/chunk-PWPIERBM.js.map +1 -0
  185. package/dist/chunk-Q4AUIFUA.js +111 -0
  186. package/dist/chunk-Q4AUIFUA.js.map +1 -0
  187. package/dist/{chunk-SO7SV523.js → chunk-Q6LCCIZN.js} +1 -1
  188. package/dist/chunk-Q6LCCIZN.js.map +1 -0
  189. package/dist/{chunk-42SDNZCU.js → chunk-QF4J3KMV.js} +19 -19
  190. package/dist/{chunk-SB6PSOP7.js → chunk-QLJ6762U.js} +2 -2
  191. package/dist/{chunk-XOVKXJEP.js → chunk-R3TLVTWW.js} +3 -3
  192. package/dist/{chunk-PHNAB54Q.js → chunk-RQO3J4MR.js} +2 -2
  193. package/dist/{chunk-5N53UBH2.js → chunk-RR7G2X7C.js} +5 -5
  194. package/dist/{chunk-DCJ3YFIC.js → chunk-S2ULTQZR.js} +2 -2
  195. package/dist/{chunk-GY5WZBA6.js → chunk-S76KRJDG.js} +3 -3
  196. package/dist/{chunk-H272ZPQ3.js → chunk-SHEHQBCG.js} +124 -23
  197. package/dist/chunk-SHEHQBCG.js.map +1 -0
  198. package/dist/{chunk-EEC4PCG5.js → chunk-SZDLX763.js} +2 -2
  199. package/dist/{chunk-SQJ3SDIW.js → chunk-SZWEDG3H.js} +13 -7
  200. package/dist/chunk-SZWEDG3H.js.map +1 -0
  201. package/dist/{chunk-E2ZHGBAK.js → chunk-T2JSUEH6.js} +2 -2
  202. package/dist/{chunk-QMGXMJ2O.js → chunk-T2YFZ27G.js} +9 -9
  203. package/dist/{chunk-LEPOP46W.js → chunk-TFA6HPOA.js} +4 -4
  204. package/dist/{chunk-BA6WOZOT.js → chunk-TK4FHQRN.js} +4 -4
  205. package/dist/chunk-TLHNF6GA.js +647 -0
  206. package/dist/chunk-TLHNF6GA.js.map +1 -0
  207. package/dist/{chunk-ZNJSBIP4.js → chunk-TNSCIPBQ.js} +4 -4
  208. package/dist/{chunk-YUMDFDUA.js → chunk-TWYTGIBR.js} +4 -4
  209. package/dist/{chunk-FDLDOEO6.js → chunk-UBG4GAEP.js} +51 -6
  210. package/dist/chunk-UBG4GAEP.js.map +1 -0
  211. package/dist/{chunk-EZZV7OQL.js → chunk-UEZKN6VR.js} +2 -2
  212. package/dist/{chunk-HY55QQD7.js → chunk-UJX4I26O.js} +2 -2
  213. package/dist/{chunk-BLUYQFRH.js → chunk-VELCIWJZ.js} +15 -11
  214. package/dist/chunk-VELCIWJZ.js.map +1 -0
  215. package/dist/{chunk-CBCNKKZD.js → chunk-VIZR45AN.js} +2 -2
  216. package/dist/{chunk-ZG74PWRW.js → chunk-VZAKYDMJ.js} +2 -2
  217. package/dist/{chunk-ITPS5DDH.js → chunk-W5BLTZZJ.js} +8 -8
  218. package/dist/chunk-W6IJMWTZ.js +72 -0
  219. package/dist/chunk-W6IJMWTZ.js.map +1 -0
  220. package/dist/{chunk-H3TKENU4.js → chunk-WIKO4SCR.js} +5 -5
  221. package/dist/{chunk-YFLLGRXO.js → chunk-X2QPKLPL.js} +2 -2
  222. package/dist/{chunk-FGGYSN4P.js → chunk-X424T5JQ.js} +2 -2
  223. package/dist/{chunk-NAXDPKVM.js → chunk-XPJNT6PI.js} +4 -4
  224. package/dist/{chunk-2JVJ7UHC.js → chunk-XQU3CPF2.js} +4 -2
  225. package/dist/chunk-XQU3CPF2.js.map +1 -0
  226. package/dist/chunk-XW2T4QAW.js +1 -0
  227. package/dist/{chunk-VED2YHUD.js → chunk-YEDVOYL2.js} +2 -2
  228. package/dist/{chunk-TLPZ6MKZ.js → chunk-YEN4TREG.js} +541 -5
  229. package/dist/chunk-YEN4TREG.js.map +1 -0
  230. package/dist/{chunk-RC5DXXWC.js → chunk-YM7YN37H.js} +2 -2
  231. package/dist/{chunk-VLXBE57O.js → chunk-YVGXH72Y.js} +2 -2
  232. package/dist/{chunk-YQAXP5AC.js → chunk-YXLUTALO.js} +5 -5
  233. package/dist/{chunk-565C6ZFO.js → chunk-Z7YDVHDI.js} +2 -2
  234. package/dist/{chunk-O75CRYGF.js → chunk-ZEFVK7XC.js} +1 -1
  235. package/dist/chunk-ZEFVK7XC.js.map +1 -0
  236. package/dist/{chunk-XUE46UYW.js → chunk-ZLN7AROH.js} +6 -6
  237. package/dist/{chunk-GVG3JYBI.js → chunk-ZMKYCFJ7.js} +640 -199
  238. package/dist/chunk-ZMKYCFJ7.js.map +1 -0
  239. package/dist/{chunk-HK32G473.js → chunk-ZWEZXVYH.js} +2 -2
  240. package/dist/{cli-NEEdq5Rt.d.ts → cli-5mTYh1Tn.d.ts} +5 -5
  241. package/dist/cli-fallback.d.ts +11 -4
  242. package/dist/cli-fallback.js +5 -1
  243. package/dist/cli.d.ts +15 -13
  244. package/dist/cli.js +110 -106
  245. package/dist/coding/export-okf-codegraph.d.ts +2 -1
  246. package/dist/coding/export-okf-codegraph.js +34 -32
  247. package/dist/coding/export-okf-codegraph.js.map +1 -1
  248. package/dist/coding/pre-action-gate.d.ts +2 -1
  249. package/dist/compat/checks.js +2 -2
  250. package/dist/compat/codex-cli-fallback.d.ts +1 -1
  251. package/dist/compat/codex-cli-fallback.js +5 -1
  252. package/dist/compat/codex-cli-fallback.js.map +1 -1
  253. package/dist/compounding/engine.d.ts +3 -2
  254. package/dist/compounding/engine.js +29 -28
  255. package/dist/compounding/preference-consolidator.d.ts +2 -1
  256. package/dist/compression-optimizer.d.ts +2 -1
  257. package/dist/config.d.ts +2 -1
  258. package/dist/config.js +14 -12
  259. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  260. package/dist/connectors/codex-materialize-runner.js +28 -27
  261. package/dist/connectors/codex-materialize.d.ts +2 -1
  262. package/dist/connectors/index.d.ts +2 -1
  263. package/dist/connectors/index.js +30 -29
  264. package/dist/consolidation-provenance-check.d.ts +3 -2
  265. package/dist/consolidation-undo.d.ts +3 -2
  266. package/dist/contradiction/index.d.ts +4 -3
  267. package/dist/contradiction/index.js +5 -5
  268. package/dist/{contradiction-scan-NOYMFG66.js → contradiction-scan-GVD4JJ7B.js} +3 -3
  269. package/dist/converge-config.d.ts +2 -1
  270. package/dist/convergence-refresh.d.ts +3 -2
  271. package/dist/convergence-refresh.js +30 -29
  272. package/dist/conversation-index/backend.d.ts +2 -1
  273. package/dist/conversation-index/backend.js +3 -3
  274. package/dist/conversation-index/chunker.d.ts +2 -1
  275. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  276. package/dist/conversation-index/faiss-adapter.js +2 -2
  277. package/dist/conversation-index/indexer.d.ts +2 -1
  278. package/dist/conversation-index/search.d.ts +2 -1
  279. package/dist/corpus-watermark.d.ts +2 -1
  280. package/dist/corpus-watermark.js +31 -30
  281. package/dist/cross-lingual-recall.d.ts +2 -1
  282. package/dist/day-summary.d.ts +2 -1
  283. package/dist/deep-recall-http-glue.d.ts +13 -11
  284. package/dist/deep-recall-http-glue.js +12 -2
  285. package/dist/deep-recall-mcp-tools.d.ts +13 -11
  286. package/dist/deep-recall-policy-llm.d.ts +2 -1
  287. package/dist/deep-recall-policy-llm.js +4 -3
  288. package/dist/deep-recall-seeds.d.ts +2 -1
  289. package/dist/delinearize.d.ts +2 -1
  290. package/dist/dependency-propagation-config.d.ts +2 -1
  291. package/dist/{dependency-propagation-delivery-CQPCu0o5.d.ts → dependency-propagation-delivery-CDQCxNll.d.ts} +1 -1
  292. package/dist/direct-answer-wiring.d.ts +2 -1
  293. package/dist/direct-answer.d.ts +2 -1
  294. package/dist/embedding-fallback.d.ts +2 -1
  295. package/dist/enrichment/index.d.ts +2 -1
  296. package/dist/entity-origin-fields.d.ts +2 -1
  297. package/dist/entity-retrieval.d.ts +3 -2
  298. package/dist/entity-retrieval.js +28 -27
  299. package/dist/entity-schema.d.ts +2 -1
  300. package/dist/episodic-context.d.ts +2 -1
  301. package/dist/eval-trajectory-contracts.d.ts +2 -1
  302. package/dist/eval-trajectory-store.d.ts +2 -1
  303. package/dist/eval-trajectory.d.ts +2 -1
  304. package/dist/explicit-capture.d.ts +11 -9
  305. package/dist/explicit-capture.js +6 -6
  306. package/dist/external-wiki-access.d.ts +13 -11
  307. package/dist/external-wiki-access.js +65 -60
  308. package/dist/external-wiki-collection-registration.d.ts +2 -1
  309. package/dist/external-wiki-collection.d.ts +2 -1
  310. package/dist/external-wiki-mcp-tools.d.ts +13 -11
  311. package/dist/extraction-error-classification.d.ts +2 -1
  312. package/dist/extraction-faithfulness.d.ts +2 -1
  313. package/dist/extraction-faithfulness.js +4 -3
  314. package/dist/extraction-judge-telemetry.d.ts +2 -1
  315. package/dist/extraction-judge-training.d.ts +2 -1
  316. package/dist/extraction-judge.d.ts +2 -1
  317. package/dist/extraction-judge.js +5 -4
  318. package/dist/extraction-liveness.d.ts +2 -1
  319. package/dist/extraction-normalization.d.ts +2 -1
  320. package/dist/extraction-prompt.d.ts +2 -1
  321. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  322. package/dist/extraction-source-grounding.d.ts +2 -1
  323. package/dist/extraction.d.ts +2 -1
  324. package/dist/extraction.js +40 -38
  325. package/dist/fallback-llm.d.ts +2 -1
  326. package/dist/fallback-llm.js +3 -2
  327. package/dist/{first-start-migration-RC345GPL.js → first-start-migration-L3UFX5CU.js} +3 -3
  328. package/dist/generic-recall-paths-CqAZyXKX.d.ts +23 -0
  329. package/dist/graph-append-error.d.ts +2 -1
  330. package/dist/graph-dashboard-diff.d.ts +2 -1
  331. package/dist/graph-dashboard-key.d.ts +2 -1
  332. package/dist/graph-dashboard-parser.d.ts +2 -1
  333. package/dist/graph-edge-reinforcement.d.ts +2 -1
  334. package/dist/graph-jsonl.d.ts +2 -1
  335. package/dist/graph-path-reconstruction.d.ts +2 -1
  336. package/dist/graph-path-scoring.d.ts +2 -1
  337. package/dist/graph-snapshot.d.ts +2 -1
  338. package/dist/graph.d.ts +2 -1
  339. package/dist/harmonic-retrieval.js +2 -2
  340. package/dist/importance.d.ts +2 -1
  341. package/dist/importers/index.d.ts +2 -1
  342. package/dist/importers/test-utils.d.ts +2 -1
  343. package/dist/in-flight-reads.d.ts +2 -1
  344. package/dist/{index-C9VXenR8.d.ts → index-BNluTxBp.d.ts} +2 -2
  345. package/dist/index.d.ts +963 -945
  346. package/dist/index.js +323 -221
  347. package/dist/intent.d.ts +2 -1
  348. package/dist/lcm/engine.d.ts +2 -1
  349. package/dist/lcm/engine.js +2 -2
  350. package/dist/lcm/index.d.ts +2 -1
  351. package/dist/lcm/index.js +7 -7
  352. package/dist/lcm/tools.d.ts +2 -1
  353. package/dist/lifecycle.d.ts +2 -1
  354. package/dist/live-connectors-runner.d.ts +2 -1
  355. package/dist/local-llm.d.ts +4 -1
  356. package/dist/local-llm.js +2 -2
  357. package/dist/local-model-endpoint.d.ts +2 -1
  358. package/dist/location/index.d.ts +4 -3
  359. package/dist/location/index.js +33 -32
  360. package/dist/maintenance/memory-governance.d.ts +2 -1
  361. package/dist/maintenance/memory-governance.js +28 -27
  362. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  363. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +28 -27
  364. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  365. package/dist/maintenance/rebuild-memory-projection.js +29 -28
  366. package/dist/{maintenance-C14sorKa.d.ts → maintenance-8hmWOMY_.d.ts} +378 -4
  367. package/dist/mcp-memory-inspector-app.d.ts +13 -11
  368. package/dist/memory-action-policy.d.ts +2 -1
  369. package/dist/memory-cache.d.ts +2 -1
  370. package/dist/memory-controller.d.ts +2 -1
  371. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  372. package/dist/memory-projection-store.d.ts +2 -1
  373. package/dist/memory-provenance.d.ts +2 -1
  374. package/dist/memory-snapshot.d.ts +2 -1
  375. package/dist/memory-subject-cli.d.ts +13 -11
  376. package/dist/memory-subject.d.ts +13 -11
  377. package/dist/memory-worth-outcomes.d.ts +3 -2
  378. package/dist/migrate/from-engram.js +2 -2
  379. package/dist/models-json.d.ts +2 -1
  380. package/dist/namespaces/migrate.d.ts +4 -3
  381. package/dist/namespaces/migrate.js +29 -28
  382. package/dist/namespaces/principal.d.ts +2 -1
  383. package/dist/namespaces/search.d.ts +2 -1
  384. package/dist/namespaces/search.js +11 -11
  385. package/dist/namespaces/storage.d.ts +4 -3
  386. package/dist/namespaces/storage.js +28 -27
  387. package/dist/native-knowledge.d.ts +2 -1
  388. package/dist/network/tailscale.js +2 -2
  389. package/dist/offline-sync-impression-drain.d.ts +2 -1
  390. package/dist/offline-sync-impression-drain.js +6 -6
  391. package/dist/operator-doctor-corpus.d.ts +2 -1
  392. package/dist/operator-doctor-corpus.js +32 -31
  393. package/dist/operator-doctor-replica.d.ts +2 -1
  394. package/dist/operator-toolkit.d.ts +4 -3
  395. package/dist/operator-toolkit.js +48 -46
  396. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  397. package/dist/orchestration/maintenance.d.ts +5 -4
  398. package/dist/orchestration/maintenance.js +47 -42
  399. package/dist/{orchestrator-kqSzGv7e.d.ts → orchestrator-BUd_3Q86.d.ts} +17 -29
  400. package/dist/orchestrator.d.ts +11 -9
  401. package/dist/orchestrator.js +144 -138
  402. package/dist/patterns-cli.d.ts +2 -1
  403. package/dist/{pipeline-DRUwHb1X.d.ts → pipeline-Dv1Bv0ma.d.ts} +1 -1
  404. package/dist/policy-runtime.d.ts +2 -1
  405. package/dist/proactive-contention.d.ts +2 -1
  406. package/dist/provenance.d.ts +2 -1
  407. package/dist/{public-http-CW3l0g3P.d.ts → public-http-L-IymRBN.d.ts} +1 -1
  408. package/dist/{qmd-BVWlg1YS.d.ts → qmd-Mj508lHA.d.ts} +1 -1
  409. package/dist/qmd-preflight.d.ts +3 -2
  410. package/dist/qmd-recall-cache.d.ts +2 -1
  411. package/dist/qmd.d.ts +3 -2
  412. package/dist/qmd.js +2 -2
  413. package/dist/recall-concurrency-config.d.ts +2 -1
  414. package/dist/recall-disclosure-escalation.d.ts +2 -1
  415. package/dist/recall-explain-renderer.d.ts +2 -1
  416. package/dist/recall-explain-renderer.js +3 -3
  417. package/dist/recall-memory-map.d.ts +2 -1
  418. package/dist/recall-navigate-access.d.ts +2 -1
  419. package/dist/recall-navigate-access.js +2 -2
  420. package/dist/recall-navigate-disclosure.d.ts +2 -1
  421. package/dist/recall-navigate-disclosure.js +1 -1
  422. package/dist/recall-navigate.d.ts +2 -1
  423. package/dist/recall-navigate.js +2 -2
  424. package/dist/recall-planner-llm.d.ts +2 -1
  425. package/dist/recall-planner-llm.js +3 -2
  426. package/dist/recall-planner-llm.js.map +1 -1
  427. package/dist/recall-state-view-admission.d.ts +56 -0
  428. package/dist/recall-state-view-admission.js +39 -0
  429. package/dist/recall-state-view-admission.js.map +1 -0
  430. package/dist/recall-state-view-inject.js +2 -2
  431. package/dist/recall-state-view-render.js +2 -2
  432. package/dist/recall-state-view-widen.d.ts +18 -1
  433. package/dist/recall-state-view-widen.js +2 -2
  434. package/dist/recall-state-view-wire.d.ts +1 -1
  435. package/dist/recall-state-view-wire.js +3 -3
  436. package/dist/recall-state-view.d.ts +1 -0
  437. package/dist/recall-state-view.js +1 -1
  438. package/dist/recall-state.d.ts +2 -1
  439. package/dist/recall-tag-filter.d.ts +2 -1
  440. package/dist/recall-timings.d.ts +2 -1
  441. package/dist/recall-xray-cli.d.ts +2 -1
  442. package/dist/recall-xray-cli.js +4 -4
  443. package/dist/recall-xray-renderer.d.ts +2 -1
  444. package/dist/recall-xray-renderer.js +3 -3
  445. package/dist/recall-xray.d.ts +9 -1
  446. package/dist/recall-xray.js +2 -2
  447. package/dist/reconcile/cursor.d.ts +11 -2
  448. package/dist/reconcile/cursor.js +6 -4
  449. package/dist/reconcile/cursor.js.map +1 -1
  450. package/dist/reconcile/manifest.d.ts +37 -2
  451. package/dist/reconcile/manifest.js +15 -5
  452. package/dist/reconcile/plan.d.ts +2 -1
  453. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  454. package/dist/replay/normalizers/claude.d.ts +2 -1
  455. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  456. package/dist/replay/normalizers/shared.d.ts +2 -1
  457. package/dist/replay/runner.d.ts +2 -1
  458. package/dist/replay/types.d.ts +2 -1
  459. package/dist/replica-divergence.d.ts +2 -1
  460. package/dist/replica-peers-config.d.ts +2 -1
  461. package/dist/{resolution-VKATP2HT.js → resolution-OHJZG45O.js} +6 -6
  462. package/dist/resolution-OHJZG45O.js.map +1 -0
  463. package/dist/resolve-auth-token.d.ts +2 -1
  464. package/dist/resume-bundles.js +15 -13
  465. package/dist/retrieval-agents.d.ts +3 -2
  466. package/dist/retrieval-tiers.d.ts +2 -1
  467. package/dist/routing/engine.d.ts +2 -1
  468. package/dist/routing/store.d.ts +2 -1
  469. package/dist/runtime/child-process.d.ts +1 -1
  470. package/dist/runtime/child-process.js +1 -1
  471. package/dist/salvage-envelope.d.ts +2 -1
  472. package/dist/salvage-envelope.js +2 -2
  473. package/dist/schemas.d.ts +176 -176
  474. package/dist/{scope-profiles-Vl00B1KU.d.ts → scope-profiles-B6BGVbxm.d.ts} +1 -1
  475. package/dist/search/embed-helper.d.ts +2 -1
  476. package/dist/search/factory.d.ts +2 -1
  477. package/dist/search/factory.js +10 -10
  478. package/dist/search/index.d.ts +2 -1
  479. package/dist/search/index.js +14 -14
  480. package/dist/search/lancedb-backend.d.ts +2 -1
  481. package/dist/search/lancedb-backend.js +2 -2
  482. package/dist/search/meilisearch-backend.d.ts +2 -1
  483. package/dist/search/meilisearch-backend.js +2 -2
  484. package/dist/search/noop-backend.d.ts +2 -1
  485. package/dist/search/orama-backend.d.ts +2 -1
  486. package/dist/search/orama-backend.js +2 -2
  487. package/dist/search/port.d.ts +2 -1
  488. package/dist/search/remote-backend.d.ts +2 -1
  489. package/dist/{semantic-consolidation-BC9-GFuT.d.ts → semantic-consolidation-J-598F5M.d.ts} +1 -1
  490. package/dist/semantic-consolidation.d.ts +3 -2
  491. package/dist/semantic-consolidation.js +29 -28
  492. package/dist/semantic-rule-promotion.js +28 -27
  493. package/dist/semantic-rule-verifier.d.ts +2 -1
  494. package/dist/semantic-rule-verifier.js +28 -27
  495. package/dist/{service-BOy6dHfc.d.ts → service-ZQkJ52cz.d.ts} +2 -2
  496. package/dist/session-observer-bands.d.ts +2 -1
  497. package/dist/session-observer-state.d.ts +2 -1
  498. package/dist/shared-context/manager.d.ts +8 -7
  499. package/dist/signal.d.ts +2 -1
  500. package/dist/source-agent-qualifier.d.ts +2 -1
  501. package/dist/source-agent-qualifier.js +38 -36
  502. package/dist/standup/build.js +29 -28
  503. package/dist/{storage-BLJRnFi6.d.ts → storage-CU_hZUgP.d.ts} +67 -6
  504. package/dist/storage.d.ts +4 -3
  505. package/dist/storage.js +27 -26
  506. package/dist/subject-config.d.ts +2 -1
  507. package/dist/subject-config.js +2 -2
  508. package/dist/summarizer.d.ts +2 -1
  509. package/dist/summarizer.js +5 -5
  510. package/dist/summary-snapshot.d.ts +2 -1
  511. package/dist/support-passport/index.d.ts +49 -15
  512. package/dist/support-passport/index.js +72 -63
  513. package/dist/temporal-supersession.d.ts +3 -2
  514. package/dist/temporal-timeline-recall.d.ts +2 -1
  515. package/dist/temporal-validity.d.ts +2 -1
  516. package/dist/threading.d.ts +2 -1
  517. package/dist/tier-migration.d.ts +3 -2
  518. package/dist/tier-routing.d.ts +2 -1
  519. package/dist/tier-routing.js +2 -2
  520. package/dist/{tier-stats-KA6OZX2C.js → tier-stats-VK5PCO2L.js} +3 -3
  521. package/dist/topics.d.ts +2 -1
  522. package/dist/transcript.d.ts +2 -1
  523. package/dist/transfer/capsule-import.js +1 -1
  524. package/dist/transfer/export-okf.d.ts +2 -1
  525. package/dist/transfer/export-okf.js +29 -28
  526. package/dist/transfer/types.d.ts +102 -102
  527. package/dist/trust-score-stage.d.ts +2 -1
  528. package/dist/trust-score.d.ts +2 -1
  529. package/dist/{types-YY-eKKU7.d.ts → types-BGxTvLBO.d.ts} +58 -13
  530. package/dist/types.d.ts +2 -1
  531. package/dist/types.js +1 -1
  532. package/dist/utility-runtime.d.ts +2 -1
  533. package/dist/verified-recall.js +28 -27
  534. package/dist/who-knows-cli.d.ts +13 -11
  535. package/dist/who-knows-cli.js +29 -28
  536. package/dist/who-knows.d.ts +13 -11
  537. package/dist/who-knows.js +28 -27
  538. package/dist/write-envelope.d.ts +4 -2
  539. package/dist/write-envelope.js +3 -1
  540. package/package.json +12 -2
  541. package/src/access-category-alias.test.ts +216 -0
  542. package/src/access-mcp.test.ts +73 -0
  543. package/src/access-mcp.ts +6 -6
  544. package/src/access-observe-write-surface.ts +19 -4
  545. package/src/access-offline-manifest.ts +297 -16
  546. package/src/access-recall-surface.ts +5 -5
  547. package/src/access-schema.ts +76 -7
  548. package/src/access-service.ts +11 -2
  549. package/src/activity/config.test.ts +124 -1
  550. package/src/activity/config.ts +150 -18
  551. package/src/activity/index.ts +3 -0
  552. package/src/activity/journal-extract-storage.test.ts +129 -0
  553. package/src/activity/journal-extract.test.ts +314 -0
  554. package/src/activity/journal-extract.ts +247 -0
  555. package/src/activity/journal-heading.test.ts +24 -1
  556. package/src/activity/journal-heading.ts +36 -0
  557. package/src/activity/journal-read.test.ts +242 -0
  558. package/src/activity/journal-read.ts +183 -0
  559. package/src/activity/journal-source.test.ts +15 -15
  560. package/src/activity/journal-source.ts +21 -14
  561. package/src/activity/journal-state.lock-worker.ts +30 -0
  562. package/src/activity/journal-state.test.ts +144 -0
  563. package/src/activity/journal-state.ts +107 -0
  564. package/src/activity/journal-strip.test.ts +106 -52
  565. package/src/activity/journal-strip.ts +35 -10
  566. package/src/activity/journal-vault-integration.test.ts +230 -0
  567. package/src/activity/journal-vault-provenance.test.ts +9 -7
  568. package/src/activity/journal-vault-provenance.ts +4 -10
  569. package/src/activity/journal-vault-read.test.ts +3 -2
  570. package/src/activity/journal-vault-read.ts +9 -139
  571. package/src/activity/journal.test.ts +74 -23
  572. package/src/activity/runner.test.ts +116 -1
  573. package/src/activity/runner.ts +25 -0
  574. package/src/activity/scheduler.ts +4 -0
  575. package/src/activity/store.test.ts +18 -0
  576. package/src/activity/store.ts +14 -0
  577. package/src/activity/sync-registration.ts +4 -0
  578. package/src/activity/timeline/analysis-metadata.ts +2 -0
  579. package/src/activity/timeline/analysis-provider.ts +140 -0
  580. package/src/activity/timeline/analysis-run.test.ts +419 -0
  581. package/src/activity/timeline/analysis-run.ts +106 -0
  582. package/src/activity/timeline/analysis.ts +66 -37
  583. package/src/activity/timeline/corrections.ts +9 -0
  584. package/src/activity/timeline/index.ts +3 -0
  585. package/src/activity/timeline/query.test.ts +71 -0
  586. package/src/activity/timeline/query.ts +57 -8
  587. package/src/activity/timeline/regenerate.test.ts +505 -0
  588. package/src/activity/timeline/regenerate.ts +373 -0
  589. package/src/activity/types.ts +40 -5
  590. package/src/adapters/grok-opencode.test.ts +146 -0
  591. package/src/adapters/grok.ts +53 -0
  592. package/src/adapters/index.ts +2 -0
  593. package/src/adapters/opencode.ts +52 -0
  594. package/src/adapters/registry.ts +4 -0
  595. package/src/cli-fallback.ts +13 -4
  596. package/src/config.test.ts +3 -1
  597. package/src/config.ts +4 -0
  598. package/src/dedup/merge.test.ts +732 -25
  599. package/src/fallback-llm.test.ts +53 -0
  600. package/src/fallback-llm.ts +12 -0
  601. package/src/index.ts +2 -0
  602. package/src/local-llm.ts +3 -1
  603. package/src/orchestration/dependency-propagation-recovery-replay.ts +1 -1
  604. package/src/orchestration/extraction-persist-deps.ts +9 -0
  605. package/src/orchestration/extraction-persist-promotion.test.ts +265 -6
  606. package/src/orchestration/extraction-persist-promotion.ts +42 -3
  607. package/src/orchestration/extraction-persist.ts +3 -3
  608. package/src/orchestration/harmonic-construction-persist.test.ts +115 -4
  609. package/src/orchestration/harmonic-construction-persist.ts +34 -6
  610. package/src/orchestration/maintenance.ts +1 -0
  611. package/src/orchestration/orchestrator-helpers.ts +6 -0
  612. package/src/orchestration/recall-entry.ts +16 -0
  613. package/src/orchestration/recall-internal-deps.ts +14 -0
  614. package/src/orchestration/recall-internal.ts +41 -58
  615. package/src/orchestration/recall-result-formatter.ts +11 -1
  616. package/src/orchestration/recall-search-pipeline.ts +121 -11
  617. package/src/orchestration/recall-state-view-pipeline.test.ts +211 -0
  618. package/src/orchestration/semantic-merge-commit-effects.ts +76 -17
  619. package/src/orchestration/semantic-merge-persist.ts +121 -16
  620. package/src/orchestration/semantic-merge-promotion-payload.ts +133 -54
  621. package/src/orchestrator.ts +7 -35
  622. package/src/providers/codex-subscription.test.ts +666 -0
  623. package/src/providers/codex-subscription.ts +743 -0
  624. package/src/recall-disclosure.test.ts +20 -0
  625. package/src/recall-state-view-admission.ts +114 -0
  626. package/src/recall-state-view-asof.test.ts +176 -0
  627. package/src/recall-state-view-call.test.ts +175 -0
  628. package/src/recall-state-view-config.test.ts +16 -0
  629. package/src/recall-state-view-widen.test.ts +70 -0
  630. package/src/recall-state-view-widen.ts +28 -7
  631. package/src/recall-state-view-wire.ts +3 -1
  632. package/src/recall-state-view-zero-diff.test.ts +20 -11
  633. package/src/recall-state-view.test.ts +142 -0
  634. package/src/recall-state-view.ts +72 -24
  635. package/src/recall-xray-renderer.test.ts +27 -0
  636. package/src/recall-xray-renderer.ts +4 -0
  637. package/src/recall-xray.ts +13 -0
  638. package/src/reconcile/cursor.ts +23 -33
  639. package/src/reconcile/manifest.ts +96 -11
  640. package/src/reconcile-identity-cache.test.ts +378 -0
  641. package/src/runtime/child-process.ts +1 -1
  642. package/src/storage/cas-revision-host.ts +75 -0
  643. package/src/storage/cas-revision-store.test.ts +459 -0
  644. package/src/storage/cas-revision-store.ts +661 -0
  645. package/src/storage/deletion-revision-store.ts +80 -6
  646. package/src/storage/tombstone-blocked-capture-index.ts +15 -0
  647. package/src/storage/tombstone-blocked-capture-mutation.ts +67 -7
  648. package/src/storage/tombstone-blocked-capture-sync.ts +55 -20
  649. package/src/storage-contract/failure-semantics.test.ts +1 -1
  650. package/src/storage-frontmatter-cas.test.ts +698 -1
  651. package/src/storage-replay.test.ts +166 -3
  652. package/src/storage.ts +41 -41
  653. package/src/support-passport/card-projection.ts +82 -33
  654. package/src/temporal-supersession.test.ts +10 -10
  655. package/src/types.ts +7 -7
  656. package/src/write-envelope.ts +1 -1
  657. package/dist/chunk-22FVR2KE.js.map +0 -1
  658. package/dist/chunk-2JVJ7UHC.js.map +0 -1
  659. package/dist/chunk-3QQTXYZ6.js.map +0 -1
  660. package/dist/chunk-4UDQUPT5.js +0 -560
  661. package/dist/chunk-4UDQUPT5.js.map +0 -1
  662. package/dist/chunk-A7XEPMQ6.js.map +0 -1
  663. package/dist/chunk-AU7Q3LSC.js +0 -56
  664. package/dist/chunk-AU7Q3LSC.js.map +0 -1
  665. package/dist/chunk-BLUYQFRH.js.map +0 -1
  666. package/dist/chunk-CZYYJZB6.js.map +0 -1
  667. package/dist/chunk-EEOUMG3J.js.map +0 -1
  668. package/dist/chunk-FDLDOEO6.js.map +0 -1
  669. package/dist/chunk-FYDW33ZB.js +0 -13
  670. package/dist/chunk-GVG3JYBI.js.map +0 -1
  671. package/dist/chunk-H272ZPQ3.js.map +0 -1
  672. package/dist/chunk-HVAEXYPL.js.map +0 -1
  673. package/dist/chunk-JEIXTYVG.js.map +0 -1
  674. package/dist/chunk-LRICZIGN.js +0 -52
  675. package/dist/chunk-LRICZIGN.js.map +0 -1
  676. package/dist/chunk-N7RWREIQ.js.map +0 -1
  677. package/dist/chunk-O75CRYGF.js.map +0 -1
  678. package/dist/chunk-Q3O3VKRB.js.map +0 -1
  679. package/dist/chunk-SEDEKFYQ.js +0 -1
  680. package/dist/chunk-SO7SV523.js.map +0 -1
  681. package/dist/chunk-SQJ3SDIW.js.map +0 -1
  682. package/dist/chunk-TLPZ6MKZ.js.map +0 -1
  683. package/dist/chunk-WJBZMNNS.js.map +0 -1
  684. package/dist/chunk-XQ2Q43XD.js.map +0 -1
  685. package/dist/chunk-Z4PCVRTN.js.map +0 -1
  686. package/src/activity/journal-mode.test.ts +0 -32
  687. package/src/activity/journal-mode.ts +0 -20
  688. /package/dist/{chunk-SEDEKFYQ.js.map → activity/digest.js.map} +0 -0
  689. /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-ZCXUPLNJ.js.map} +0 -0
  690. /package/dist/{chunk-CDKHKZL5.js.map → chunk-2524MOWK.js.map} +0 -0
  691. /package/dist/{chunk-IY2FVXM6.js.map → chunk-2AU4D4HQ.js.map} +0 -0
  692. /package/dist/{chunk-QDY6KYTN.js.map → chunk-2JCA2PQT.js.map} +0 -0
  693. /package/dist/{chunk-RSVEP77Y.js.map → chunk-2UZ5ZH6W.js.map} +0 -0
  694. /package/dist/{chunk-NWWXSJX5.js.map → chunk-34QW2LK2.js.map} +0 -0
  695. /package/dist/{chunk-S7DPKM5W.js.map → chunk-353C5UNV.js.map} +0 -0
  696. /package/dist/{chunk-GQOMZ3MK.js.map → chunk-36UBSLFN.js.map} +0 -0
  697. /package/dist/{chunk-DBQWVT2H.js.map → chunk-3CBI2ZSA.js.map} +0 -0
  698. /package/dist/{chunk-NZXEK3UF.js.map → chunk-3Q3N35W7.js.map} +0 -0
  699. /package/dist/{chunk-YYGZJPOK.js.map → chunk-42DJ235G.js.map} +0 -0
  700. /package/dist/{chunk-7VJXIDOC.js.map → chunk-4JVQRFZD.js.map} +0 -0
  701. /package/dist/{chunk-WHBVXTUI.js.map → chunk-4PB2MBY6.js.map} +0 -0
  702. /package/dist/{chunk-TEYN7ZYF.js.map → chunk-4WCNPQQ5.js.map} +0 -0
  703. /package/dist/{chunk-RBGREYVJ.js.map → chunk-5QBDLMGG.js.map} +0 -0
  704. /package/dist/{chunk-RKBLRTNT.js.map → chunk-5SDSVX7N.js.map} +0 -0
  705. /package/dist/{chunk-LPECRQO4.js.map → chunk-5THU7NFP.js.map} +0 -0
  706. /package/dist/{chunk-LWA7MDVO.js.map → chunk-6CCRSQWT.js.map} +0 -0
  707. /package/dist/{chunk-TIT2C6WX.js.map → chunk-6XYC7NM4.js.map} +0 -0
  708. /package/dist/{chunk-FHQSPTPZ.js.map → chunk-6YAIN5XJ.js.map} +0 -0
  709. /package/dist/{chunk-PV36INNL.js.map → chunk-757NP436.js.map} +0 -0
  710. /package/dist/{chunk-6H5JYDOM.js.map → chunk-7J2CGXG3.js.map} +0 -0
  711. /package/dist/{chunk-FBMYGNOC.js.map → chunk-A2YQL2FF.js.map} +0 -0
  712. /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
  713. /package/dist/{chunk-MPYD657E.js.map → chunk-A7WOWDZK.js.map} +0 -0
  714. /package/dist/{chunk-C4OTC6WY.js.map → chunk-AIKTQVV3.js.map} +0 -0
  715. /package/dist/{chunk-CGC5UQCF.js.map → chunk-AKE4GGQ3.js.map} +0 -0
  716. /package/dist/{chunk-VP67GZ7T.js.map → chunk-APFKZVJS.js.map} +0 -0
  717. /package/dist/{chunk-M75RYSHS.js.map → chunk-AQIRQUCP.js.map} +0 -0
  718. /package/dist/{chunk-S7T2TY65.js.map → chunk-AXFR2NQ5.js.map} +0 -0
  719. /package/dist/{chunk-PSPABFN2.js.map → chunk-BD7JTBYP.js.map} +0 -0
  720. /package/dist/{chunk-FCSZ4K2X.js.map → chunk-BJJWRWER.js.map} +0 -0
  721. /package/dist/{chunk-JT3EB7ZL.js.map → chunk-BNGHPYZU.js.map} +0 -0
  722. /package/dist/{chunk-MFJBANPX.js.map → chunk-C2BFTYD7.js.map} +0 -0
  723. /package/dist/{chunk-3JVLGJCY.js.map → chunk-C6KRO3SU.js.map} +0 -0
  724. /package/dist/{chunk-AOCP6JA7.js.map → chunk-D3IZCN5P.js.map} +0 -0
  725. /package/dist/{chunk-ROKKIMON.js.map → chunk-EJIEQOPB.js.map} +0 -0
  726. /package/dist/{chunk-ET356KSB.js.map → chunk-F4TWWUMP.js.map} +0 -0
  727. /package/dist/{chunk-CLLPJ6QT.js.map → chunk-FQXJAC3T.js.map} +0 -0
  728. /package/dist/{chunk-DD5JFCWM.js.map → chunk-GCBIXUPT.js.map} +0 -0
  729. /package/dist/{chunk-ROGRI25A.js.map → chunk-I3H5LFOI.js.map} +0 -0
  730. /package/dist/{chunk-S65WXHNK.js.map → chunk-IFFLUCCU.js.map} +0 -0
  731. /package/dist/{chunk-D5LORF7A.js.map → chunk-JZDH2ZZK.js.map} +0 -0
  732. /package/dist/{chunk-2GPE5UCR.js.map → chunk-K6IPSW5B.js.map} +0 -0
  733. /package/dist/{chunk-HG6HXVHQ.js.map → chunk-KDJHLOZP.js.map} +0 -0
  734. /package/dist/{chunk-I27RSQRR.js.map → chunk-KYGOQV37.js.map} +0 -0
  735. /package/dist/{chunk-VZWXFXLX.js.map → chunk-LMCD5W5B.js.map} +0 -0
  736. /package/dist/{chunk-MKD3OMPS.js.map → chunk-M3MYMWXG.js.map} +0 -0
  737. /package/dist/{chunk-DITMGZOL.js.map → chunk-MMG5K6XJ.js.map} +0 -0
  738. /package/dist/{chunk-VGXM5B4H.js.map → chunk-MNIPH6LD.js.map} +0 -0
  739. /package/dist/{chunk-MKWKYHXJ.js.map → chunk-OB3XMWX5.js.map} +0 -0
  740. /package/dist/{chunk-XU6OEECT.js.map → chunk-OQQXGYMX.js.map} +0 -0
  741. /package/dist/{chunk-47DEYNMR.js.map → chunk-PEXW2JCK.js.map} +0 -0
  742. /package/dist/{chunk-42SDNZCU.js.map → chunk-QF4J3KMV.js.map} +0 -0
  743. /package/dist/{chunk-SB6PSOP7.js.map → chunk-QLJ6762U.js.map} +0 -0
  744. /package/dist/{chunk-XOVKXJEP.js.map → chunk-R3TLVTWW.js.map} +0 -0
  745. /package/dist/{chunk-PHNAB54Q.js.map → chunk-RQO3J4MR.js.map} +0 -0
  746. /package/dist/{chunk-5N53UBH2.js.map → chunk-RR7G2X7C.js.map} +0 -0
  747. /package/dist/{chunk-DCJ3YFIC.js.map → chunk-S2ULTQZR.js.map} +0 -0
  748. /package/dist/{chunk-GY5WZBA6.js.map → chunk-S76KRJDG.js.map} +0 -0
  749. /package/dist/{chunk-EEC4PCG5.js.map → chunk-SZDLX763.js.map} +0 -0
  750. /package/dist/{chunk-E2ZHGBAK.js.map → chunk-T2JSUEH6.js.map} +0 -0
  751. /package/dist/{chunk-QMGXMJ2O.js.map → chunk-T2YFZ27G.js.map} +0 -0
  752. /package/dist/{chunk-LEPOP46W.js.map → chunk-TFA6HPOA.js.map} +0 -0
  753. /package/dist/{chunk-BA6WOZOT.js.map → chunk-TK4FHQRN.js.map} +0 -0
  754. /package/dist/{chunk-ZNJSBIP4.js.map → chunk-TNSCIPBQ.js.map} +0 -0
  755. /package/dist/{chunk-YUMDFDUA.js.map → chunk-TWYTGIBR.js.map} +0 -0
  756. /package/dist/{chunk-EZZV7OQL.js.map → chunk-UEZKN6VR.js.map} +0 -0
  757. /package/dist/{chunk-HY55QQD7.js.map → chunk-UJX4I26O.js.map} +0 -0
  758. /package/dist/{chunk-CBCNKKZD.js.map → chunk-VIZR45AN.js.map} +0 -0
  759. /package/dist/{chunk-ZG74PWRW.js.map → chunk-VZAKYDMJ.js.map} +0 -0
  760. /package/dist/{chunk-ITPS5DDH.js.map → chunk-W5BLTZZJ.js.map} +0 -0
  761. /package/dist/{chunk-H3TKENU4.js.map → chunk-WIKO4SCR.js.map} +0 -0
  762. /package/dist/{chunk-YFLLGRXO.js.map → chunk-X2QPKLPL.js.map} +0 -0
  763. /package/dist/{chunk-FGGYSN4P.js.map → chunk-X424T5JQ.js.map} +0 -0
  764. /package/dist/{chunk-NAXDPKVM.js.map → chunk-XPJNT6PI.js.map} +0 -0
  765. /package/dist/{contradiction-scan-NOYMFG66.js.map → chunk-XW2T4QAW.js.map} +0 -0
  766. /package/dist/{chunk-VED2YHUD.js.map → chunk-YEDVOYL2.js.map} +0 -0
  767. /package/dist/{chunk-RC5DXXWC.js.map → chunk-YM7YN37H.js.map} +0 -0
  768. /package/dist/{chunk-VLXBE57O.js.map → chunk-YVGXH72Y.js.map} +0 -0
  769. /package/dist/{chunk-YQAXP5AC.js.map → chunk-YXLUTALO.js.map} +0 -0
  770. /package/dist/{chunk-565C6ZFO.js.map → chunk-Z7YDVHDI.js.map} +0 -0
  771. /package/dist/{chunk-XUE46UYW.js.map → chunk-ZLN7AROH.js.map} +0 -0
  772. /package/dist/{chunk-HK32G473.js.map → chunk-ZWEZXVYH.js.map} +0 -0
  773. /package/dist/{resolution-VKATP2HT.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
  774. /package/dist/{first-start-migration-RC345GPL.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
  775. /package/dist/{tier-stats-KA6OZX2C.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Provider-neutral completion adapter for timeline analysis (issue #2050).
3
+ *
4
+ * Routes the analysis prompt through the existing LLM contracts — the local
5
+ * client (`provider: "local"`) or the gateway fallback client pinned to the
6
+ * ONE explicitly configured remote provider/model. An invalid or missing
7
+ * explicit provider surfaces as a typed failure; there is no chain fallback,
8
+ * so a bad config can never silently answer from a different provider.
9
+ *
10
+ * Structural seams (not concrete classes) so hosts and tests inject fakes.
11
+ * Never logs prompt or response content.
12
+ */
13
+ import type { AnalysisFailureKind } from "./analysis-failure.js";
14
+ import type { TimelineAnalysisComplete } from "./analysis.js";
15
+
16
+ /** Structural slice of LocalLlmClient.chatCompletion (local seam). */
17
+ export interface TimelineAnalysisLocalLlm {
18
+ chatCompletion(
19
+ messages: Array<{ role: "system" | "user"; content: string }>,
20
+ options: {
21
+ temperature?: number;
22
+ maxTokens?: number;
23
+ responseFormat?: { type: string };
24
+ signal?: AbortSignal;
25
+ operation?: string;
26
+ redactProviderErrors?: boolean;
27
+ model?: string;
28
+ },
29
+ ): Promise<{ content: string } | null>;
30
+ }
31
+
32
+ /** Structural slice of FallbackLlmClient.chatCompletion (remote seam). */
33
+ export interface TimelineAnalysisRemoteLlm {
34
+ chatCompletion(
35
+ messages: Array<{ role: "system" | "user" | "assistant"; content: string }>,
36
+ options: {
37
+ temperature?: number;
38
+ maxTokens?: number;
39
+ signal?: AbortSignal;
40
+ modelChain?: { primary?: string; fallbacks?: string[] };
41
+ includeDefaultModelFallback?: boolean;
42
+ redactProviderErrors?: boolean;
43
+ },
44
+ ): Promise<{ content: string } | null>;
45
+ }
46
+
47
+ /** Marker base for provider errors the analysis run classifies by kind. */
48
+ export class TimelineAnalysisProviderError extends Error {
49
+ override readonly name = "TimelineAnalysisProviderError";
50
+ constructor(
51
+ readonly kind: AnalysisFailureKind,
52
+ message: string,
53
+ ) {
54
+ super(message);
55
+ }
56
+ }
57
+
58
+ /** The provider id that routes to the local LLM client. */
59
+ export const TIMELINE_ANALYSIS_LOCAL_PROVIDER_ID = "local";
60
+
61
+ const RATE_LIMIT_MESSAGE = /rate limit|too many requests/i;
62
+
63
+ /**
64
+ * Map a thrown provider error onto the typed failure kinds. Name- and
65
+ * status-based only: the message is matched, never logged, so provider error
66
+ * text cannot become a log line.
67
+ */
68
+ export function classifyAnalysisProviderError(error: unknown): AnalysisFailureKind {
69
+ if (error instanceof TimelineAnalysisProviderError) return error.kind;
70
+ if (error instanceof Error) {
71
+ if (error.name === "AbortError" || ("code" in error && error.code === "ABORT_ERR")) {
72
+ return "aborted";
73
+ }
74
+ if (error.name === "TimeoutError") return "timeout";
75
+ const status = "status" in error ? error.status : "statusCode" in error ? error.statusCode : undefined;
76
+ if (status === 429 || RATE_LIMIT_MESSAGE.test(error.message)) return "rate_limited";
77
+ }
78
+ return "provider_unavailable";
79
+ }
80
+
81
+ /**
82
+ * Build the `complete` function `analyzeTimelineCards` calls, from the local
83
+ * and remote client seams. Selection is by the explicit provider id carried
84
+ * on each call: `"local"` uses the local client; anything else is a remote
85
+ * provider id pinned as the single-model chain (no default-chain fallback is
86
+ * ever appended).
87
+ */
88
+ export function timelineAnalysisCompleteFromClients(input: {
89
+ localLlm: TimelineAnalysisLocalLlm | null;
90
+ remoteLlm: TimelineAnalysisRemoteLlm | null;
91
+ }): TimelineAnalysisComplete {
92
+ const { localLlm, remoteLlm } = input;
93
+ return async ({ prompt, provider, model, signal }) => {
94
+ const messages = [{ role: "user" as const, content: prompt }];
95
+ if (provider === TIMELINE_ANALYSIS_LOCAL_PROVIDER_ID) {
96
+ if (!localLlm) {
97
+ throw new TimelineAnalysisProviderError(
98
+ "provider_unavailable",
99
+ "timeline analysis local provider is not configured",
100
+ );
101
+ }
102
+ const result = await localLlm.chatCompletion(messages, {
103
+ temperature: 0,
104
+ maxTokens: 2048,
105
+ signal,
106
+ operation: "timeline-analysis",
107
+ redactProviderErrors: true,
108
+ model,
109
+ });
110
+ if (result === null) {
111
+ throw new TimelineAnalysisProviderError(
112
+ "provider_unavailable",
113
+ "timeline analysis local provider returned no completion",
114
+ );
115
+ }
116
+ return result.content;
117
+ }
118
+ if (!remoteLlm) {
119
+ throw new TimelineAnalysisProviderError(
120
+ "provider_unavailable",
121
+ "timeline analysis remote provider is not configured",
122
+ );
123
+ }
124
+ const result = await remoteLlm.chatCompletion(messages, {
125
+ temperature: 0,
126
+ maxTokens: 2048,
127
+ signal,
128
+ modelChain: { primary: `${provider}/${model}` },
129
+ includeDefaultModelFallback: false,
130
+ redactProviderErrors: true,
131
+ });
132
+ if (result === null) {
133
+ throw new TimelineAnalysisProviderError(
134
+ "provider_unavailable",
135
+ `timeline analysis provider "${provider}" is not configured`,
136
+ );
137
+ }
138
+ return result.content;
139
+ };
140
+ }
@@ -0,0 +1,419 @@
1
+ /**
2
+ * Provider-contract and surface tests for timeline-card analysis (issue #2050).
3
+ *
4
+ * Every acceptance path runs against synthetic observations through the
5
+ * local/remote client seams — no network, no real provider. Prompt and
6
+ * response content are captured by the fakes and asserted locally.
7
+ */
8
+ import assert from "node:assert/strict";
9
+ import test from "node:test";
10
+
11
+ import { runTimelineCardAnalysis } from "./analysis-run.js";
12
+ import {
13
+ classifyAnalysisProviderError,
14
+ timelineAnalysisCompleteFromClients,
15
+ TimelineAnalysisProviderError,
16
+ } from "./analysis-provider.js";
17
+ import type { TimelineAnalysisLocalLlm, TimelineAnalysisRemoteLlm } from "./analysis-provider.js";
18
+ import type { ActivityTimelineAnalysisConfig } from "../types.js";
19
+ import type { TimelineCard, TimelineObservation } from "./types.js";
20
+
21
+ const DATE = "2026-08-17";
22
+ const TZ = "UTC";
23
+
24
+ function card(
25
+ overrides: Partial<TimelineCard> & Pick<TimelineCard, "id" | "startUtc" | "endUtc">,
26
+ ): TimelineCard {
27
+ return {
28
+ kind: "activity",
29
+ title: "main.ts — editor",
30
+ summary: "Code editor on ws-a",
31
+ categoryId: "development",
32
+ confidence: 0.8,
33
+ dayKey: DATE,
34
+ timezone: TZ,
35
+ machine: "ws-a",
36
+ evidenceIds: [1],
37
+ evidenceRange: {
38
+ firstKey: "ws-a|2026-08-17T10:00:00.000Z|hash-1",
39
+ lastKey: "ws-a|2026-08-17T10:00:00.000Z|hash-1",
40
+ },
41
+ ...overrides,
42
+ };
43
+ }
44
+
45
+ function observation(overrides: Partial<TimelineObservation> = {}): TimelineObservation {
46
+ return {
47
+ id: 1,
48
+ machine: "ws-a",
49
+ capturedAtUtc: "2026-08-17T10:00:00.000Z",
50
+ app: "editor",
51
+ windowTitle: "main.ts — editor",
52
+ contentHash: "hash-1",
53
+ ...overrides,
54
+ };
55
+ }
56
+
57
+ function sampleCards(): TimelineCard[] {
58
+ return [card({ id: "card-1", startUtc: "2026-08-17T10:00:00.000Z", endUtc: "2026-08-17T10:15:00.000Z" })];
59
+ }
60
+
61
+ const ENABLED: ActivityTimelineAnalysisConfig = { enabled: true, provider: "openai", model: "gpt-test" };
62
+
63
+ interface RecordedCall {
64
+ messages: Array<{ role: string; content: string }>;
65
+ options: Record<string, unknown>;
66
+ }
67
+
68
+ function fakeLocal(handler: (call: RecordedCall) => Promise<{ content: string } | null>) {
69
+ const calls: RecordedCall[] = [];
70
+ const localLlm: TimelineAnalysisLocalLlm = {
71
+ chatCompletion: async (messages, options) => {
72
+ const call = { messages, options: options as unknown as Record<string, unknown> };
73
+ calls.push(call);
74
+ return handler(call);
75
+ },
76
+ };
77
+ return { localLlm, calls };
78
+ }
79
+
80
+ function fakeRemote(handler: (call: RecordedCall) => Promise<{ content: string } | null>) {
81
+ const calls: RecordedCall[] = [];
82
+ const remoteLlm: TimelineAnalysisRemoteLlm = {
83
+ chatCompletion: async (messages, options) => {
84
+ const call = { messages, options: options as unknown as Record<string, unknown> };
85
+ calls.push(call);
86
+ return handler(call);
87
+ },
88
+ };
89
+ return { remoteLlm, calls };
90
+ }
91
+
92
+ test("disabled config makes zero provider calls and produces zero analysis artifacts", async () => {
93
+ const cards = sampleCards();
94
+ const local = fakeLocal(async () => ({ content: '{"ops":[]}' }));
95
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
96
+ const result = await runTimelineCardAnalysis({
97
+ date: DATE,
98
+ timezone: TZ,
99
+ cards,
100
+ observations: [observation()],
101
+ config: { enabled: false },
102
+ deps: { localLlm: local.localLlm, remoteLlm: remote.remoteLlm },
103
+ });
104
+ assert.equal(result.status, "disabled");
105
+ assert.equal(result.cards, cards);
106
+ assert.equal(local.calls.length + remote.calls.length, 0);
107
+ assert.equal(result.failure, undefined);
108
+ assert.equal(result.metadata, undefined);
109
+ });
110
+
111
+ test("remote provider is pinned to the single configured model with no chain fallback", async () => {
112
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
113
+ const result = await runTimelineCardAnalysis({
114
+ date: DATE,
115
+ timezone: TZ,
116
+ cards: sampleCards(),
117
+ observations: [observation()],
118
+ config: ENABLED,
119
+ deps: { remoteLlm: remote.remoteLlm },
120
+ });
121
+ assert.equal(result.status, "ok");
122
+ assert.equal(remote.calls.length, 1);
123
+ assert.deepEqual(remote.calls[0]?.options.modelChain, { primary: "openai/gpt-test" });
124
+ assert.equal(remote.calls[0]?.options.includeDefaultModelFallback, false);
125
+ assert.deepEqual(result.metadata, {
126
+ provider: "openai",
127
+ model: "gpt-test",
128
+ promptVersion: "1",
129
+ observationCount: 1,
130
+ });
131
+ });
132
+
133
+ test("local provider routes to the local client seam", async () => {
134
+ const local = fakeLocal(async () => ({ content: '{"ops":[]}' }));
135
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
136
+ const result = await runTimelineCardAnalysis({
137
+ date: DATE,
138
+ timezone: TZ,
139
+ cards: sampleCards(),
140
+ observations: [observation()],
141
+ config: { ...ENABLED, provider: "local", model: "qwen3.8-27b" },
142
+ deps: { localLlm: local.localLlm, remoteLlm: remote.remoteLlm },
143
+ });
144
+ assert.equal(result.status, "ok");
145
+ assert.equal(local.calls.length, 1);
146
+ assert.equal(remote.calls.length, 0);
147
+ assert.equal(local.calls[0]?.options.operation, "timeline-analysis");
148
+ assert.equal(local.calls[0]?.options.model, "qwen3.8-27b");
149
+ assert.equal(result.metadata?.provider, "local");
150
+ assert.equal(result.metadata?.model, "qwen3.8-27b");
151
+ });
152
+
153
+ test("prompt carries evidence-only chronology and strict-output instructions with only safe fields", async () => {
154
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
155
+ await runTimelineCardAnalysis({
156
+ date: DATE,
157
+ timezone: TZ,
158
+ cards: sampleCards(),
159
+ observations: [observation({ browserUrl: "https://example.test/repo" })],
160
+ config: ENABLED,
161
+ deps: { remoteLlm: remote.remoteLlm },
162
+ });
163
+ const prompt = remote.calls[0]?.messages[0]?.content ?? "";
164
+ for (const phrase of [
165
+ "Use only supplied evidence",
166
+ "Preserve chronology",
167
+ "Do not invent people, places, or tasks",
168
+ "Avoid productivity or emotional claims",
169
+ "Return strict JSON",
170
+ ]) {
171
+ assert.ok(prompt.includes(phrase), `prompt must instruct: ${phrase}`);
172
+ }
173
+ // The prompt is "<instructions>\n<payload JSON>"; the payload is line 2.
174
+ const payload = JSON.parse(prompt.slice(prompt.indexOf("\n") + 1));
175
+ assert.deepEqual(Object.keys(payload.observations[0]).sort(), [
176
+ "app",
177
+ "browserUrl",
178
+ "capturedAtUtc",
179
+ "contentHash",
180
+ "id",
181
+ "machine",
182
+ "windowTitle",
183
+ ]);
184
+ // No raw capture channels exist on the observation payload: the type carries
185
+ // none, and the wire shape proves nothing extra was smuggled in.
186
+ assert.equal(JSON.stringify(payload).includes("textSource"), false);
187
+ });
188
+
189
+ test("observations outside the day window are never sent", async () => {
190
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
191
+ const result = await runTimelineCardAnalysis({
192
+ date: DATE,
193
+ timezone: TZ,
194
+ cards: sampleCards(),
195
+ observations: [
196
+ observation({ id: 1 }),
197
+ observation({ id: 2, capturedAtUtc: "2026-08-16T23:59:59.999Z", contentHash: "hash-2" }),
198
+ ],
199
+ config: ENABLED,
200
+ deps: { remoteLlm: remote.remoteLlm },
201
+ });
202
+ const prompt = remote.calls[0]?.messages[0]?.content ?? "";
203
+ const payload = JSON.parse(prompt.slice(prompt.indexOf("\n") + 1));
204
+ assert.equal(payload.observations.length, 1);
205
+ assert.equal(result.metadata?.observationCount, 1);
206
+ });
207
+
208
+ test("an impossible date or timezone throws before any provider contact", async () => {
209
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
210
+ await assert.rejects(
211
+ () =>
212
+ runTimelineCardAnalysis({
213
+ date: "2026-02-30",
214
+ timezone: TZ,
215
+ cards: sampleCards(),
216
+ observations: [observation()],
217
+ config: ENABLED,
218
+ deps: { remoteLlm: remote.remoteLlm },
219
+ }),
220
+ RangeError,
221
+ );
222
+ await assert.rejects(
223
+ () =>
224
+ runTimelineCardAnalysis({
225
+ date: DATE,
226
+ timezone: "Not/AZone",
227
+ cards: sampleCards(),
228
+ observations: [observation()],
229
+ config: ENABLED,
230
+ deps: { remoteLlm: remote.remoteLlm },
231
+ }),
232
+ RangeError,
233
+ );
234
+ assert.equal(remote.calls.length, 0);
235
+ });
236
+
237
+ test("missing provider seam returns a typed provider_unavailable failure and unchanged cards", async () => {
238
+ const cards = sampleCards();
239
+ const result = await runTimelineCardAnalysis({
240
+ date: DATE,
241
+ timezone: TZ,
242
+ cards,
243
+ observations: [observation()],
244
+ config: { ...ENABLED, provider: "local" },
245
+ deps: { localLlm: null, remoteLlm: null },
246
+ });
247
+ assert.equal(result.status, "provider_failed");
248
+ assert.equal(result.cards, cards);
249
+ assert.deepEqual(result.failure, { kind: "provider_unavailable", retryable: true, preservesDeterministic: true });
250
+ });
251
+
252
+ test("unconfigured remote provider returns null and never falls back to another provider", async () => {
253
+ const remote = fakeRemote(async () => null);
254
+ const cards = sampleCards();
255
+ const result = await runTimelineCardAnalysis({
256
+ date: DATE,
257
+ timezone: TZ,
258
+ cards,
259
+ observations: [observation()],
260
+ config: { ...ENABLED, provider: "no-such-provider" },
261
+ deps: { remoteLlm: remote.remoteLlm },
262
+ });
263
+ assert.equal(result.status, "provider_failed");
264
+ assert.equal(result.cards, cards);
265
+ assert.equal(result.failure?.kind, "provider_unavailable");
266
+ assert.equal(remote.calls.length, 1);
267
+ assert.deepEqual(remote.calls[0]?.options.modelChain, { primary: "no-such-provider/gpt-test" });
268
+ });
269
+
270
+ for (const [name, error, kind] of [
271
+ ["timeout", Object.assign(new Error("timeline analysis timed out"), { name: "TimeoutError" }), "timeout"],
272
+ ["abort", Object.assign(new Error("aborted"), { name: "AbortError" }), "aborted"],
273
+ ["rate limit status", Object.assign(new Error("HTTP 429"), { status: 429 }), "rate_limited"],
274
+ ["generic provider crash", new Error("socket hang up"), "provider_unavailable"],
275
+ ] as const) {
276
+ test(`${name} returns the typed failure kind and leaves cards byte-identical`, async () => {
277
+ const cards = sampleCards();
278
+ const remote = fakeRemote(async () => {
279
+ throw error;
280
+ });
281
+ const result = await runTimelineCardAnalysis({
282
+ date: DATE,
283
+ timezone: TZ,
284
+ cards,
285
+ observations: [observation()],
286
+ config: ENABLED,
287
+ deps: { remoteLlm: remote.remoteLlm },
288
+ });
289
+ assert.equal(result.status, "provider_failed");
290
+ assert.equal(result.cards, cards);
291
+ assert.equal(result.failure?.kind, kind);
292
+ assert.equal(result.failure?.preservesDeterministic, true);
293
+ });
294
+ }
295
+
296
+ for (const [name, body, kind] of [
297
+ ["empty response body", "", "partial_output"],
298
+ ["malformed JSON", "the model rambled, no json here", "malformed_json"],
299
+ ["json without ops", '{"summary":"no ops key"}', "invalid_schema"],
300
+ ["ops with an invalid entry", '{"ops":[{"cardId":"card-1"}]}', "invalid_schema"],
301
+ ] as const) {
302
+ test(`${name} is typed ${kind} and leaves cards unchanged`, async () => {
303
+ const cards = sampleCards();
304
+ const remote = fakeRemote(async () => ({ content: body }));
305
+ const result = await runTimelineCardAnalysis({
306
+ date: DATE,
307
+ timezone: TZ,
308
+ cards,
309
+ observations: [observation()],
310
+ config: ENABLED,
311
+ deps: { remoteLlm: remote.remoteLlm },
312
+ });
313
+ assert.equal(result.status, "invalid_output");
314
+ assert.equal(result.cards, cards);
315
+ assert.equal(result.failure?.kind, kind);
316
+ });
317
+ }
318
+
319
+ test("a valid op updates only allowed fields and preserves manual edits and evidence", async () => {
320
+ const locked = card({
321
+ id: "locked",
322
+ startUtc: "2026-08-17T11:00:00.000Z",
323
+ endUtc: "2026-08-17T11:15:00.000Z",
324
+ manualEdit: { editedAtUtc: "2026-08-17T12:00:00.000Z", title: "kept" },
325
+ });
326
+ const open = card({ id: "open", startUtc: "2026-08-17T10:00:00.000Z", endUtc: "2026-08-17T10:15:00.000Z" });
327
+ const remote = fakeRemote(
328
+ async () =>
329
+ ({
330
+ content: JSON.stringify({
331
+ ops: [
332
+ {
333
+ cardId: "open",
334
+ title: "Refined title",
335
+ summary: "Editor work bound to the supplied window",
336
+ categoryId: "development",
337
+ confidence: 0.9,
338
+ uncertainty: "Title inferred from window title only",
339
+ evidenceRange: { firstKey: "ws-a|2026-08-17T10:00:00.000Z|hash-1", lastKey: "ws-a|2026-08-17T10:00:00.000Z|hash-1" },
340
+ },
341
+ ],
342
+ }),
343
+ }) as { content: string },
344
+ );
345
+ const result = await runTimelineCardAnalysis({
346
+ date: DATE,
347
+ timezone: TZ,
348
+ cards: [locked, open],
349
+ observations: [observation()],
350
+ config: ENABLED,
351
+ deps: { remoteLlm: remote.remoteLlm },
352
+ });
353
+ assert.equal(result.status, "ok");
354
+ const updated = result.cards.find((entry) => entry.id === "open");
355
+ const untouched = result.cards.find((entry) => entry.id === "locked");
356
+ assert.equal(updated?.title, "Refined title");
357
+ assert.equal(updated?.confidence, 0.9);
358
+ assert.deepEqual(updated?.evidenceRange, open.evidenceRange);
359
+ assert.deepEqual(updated?.evidenceIds, [1]);
360
+ assert.equal(untouched?.title, "main.ts — editor");
361
+ assert.ok(untouched?.manualEdit);
362
+ });
363
+
364
+ test("empty input returns invalid_output with zero provider calls", async () => {
365
+ const remote = fakeRemote(async () => ({ content: '{"ops":[]}' }));
366
+ const cards: TimelineCard[] = [];
367
+ const result = await runTimelineCardAnalysis({
368
+ date: DATE,
369
+ timezone: TZ,
370
+ cards,
371
+ observations: [],
372
+ config: ENABLED,
373
+ deps: { remoteLlm: remote.remoteLlm },
374
+ });
375
+ assert.equal(result.status, "invalid_output");
376
+ assert.equal(result.cards, cards);
377
+ assert.equal(remote.calls.length, 0);
378
+ });
379
+
380
+ test("provider error classification is name/status based and total", () => {
381
+ assert.equal(classifyAnalysisProviderError(new TimelineAnalysisProviderError("rate_limited", "x")), "rate_limited");
382
+ assert.equal(
383
+ classifyAnalysisProviderError(Object.assign(new Error("HTTP 429"), { status: 429 })),
384
+ "rate_limited",
385
+ );
386
+ assert.equal(
387
+ classifyAnalysisProviderError(new Error("Rate limit exceeded, retry later")),
388
+ "rate_limited",
389
+ );
390
+ assert.equal(
391
+ classifyAnalysisProviderError(Object.assign(new Error("x"), { name: "AbortError" })),
392
+ "aborted",
393
+ );
394
+ assert.equal(
395
+ classifyAnalysisProviderError(Object.assign(new Error("x"), { name: "TimeoutError" })),
396
+ "timeout",
397
+ );
398
+ assert.equal(classifyAnalysisProviderError(new Error("socket hang up")), "provider_unavailable");
399
+ assert.equal(classifyAnalysisProviderError("not an error"), "provider_unavailable");
400
+ });
401
+
402
+ test("adapter pins the call-time provider verbatim with no chain fallback", async () => {
403
+ const seen: string[] = [];
404
+ const remoteLlm: TimelineAnalysisRemoteLlm = {
405
+ chatCompletion: async (_messages, options) => {
406
+ seen.push(options.modelChain?.primary ?? "");
407
+ assert.equal(options.includeDefaultModelFallback, false);
408
+ return { content: '{"ops":[]}' };
409
+ },
410
+ };
411
+ const complete = timelineAnalysisCompleteFromClients({ localLlm: null, remoteLlm });
412
+ await complete({
413
+ prompt: "p",
414
+ provider: "anthropic",
415
+ model: "claude-4_1",
416
+ signal: new AbortController().signal,
417
+ });
418
+ assert.deepEqual(seen, ["anthropic/claude-4_1"]);
419
+ });
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Config-driven surface for evidence-bound timeline-card analysis (issue #2050).
3
+ *
4
+ * Composes the parsed `activity.timeline.analysis` config with the local/remote
5
+ * provider seams and `analyzeTimelineCards`. The AI gate is independent of
6
+ * activity capture, timeline derivation, and memory creation: disabled means
7
+ * zero provider calls and zero analysis artifacts. Every failure leaves the
8
+ * deterministic cards byte-identical and returns a typed status.
9
+ */
10
+ import { activityDayWindow } from "../digest.js";
11
+ import type { ActivityTimelineAnalysisConfig } from "../types.js";
12
+ import { analyzeTimelineCards, type TimelineAnalysisStatus } from "./analysis.js";
13
+ import type { AnalysisFailure } from "./analysis-failure.js";
14
+ import {
15
+ timelineAnalysisCompleteFromClients,
16
+ type TimelineAnalysisLocalLlm,
17
+ type TimelineAnalysisRemoteLlm,
18
+ } from "./analysis-provider.js";
19
+ import { buildAnalysisRunMetadata, type AnalysisRunMetadata } from "./analysis-metadata.js";
20
+ import type { TimelineCard, TimelineCategory, TimelineCorrection, TimelineObservation } from "./types.js";
21
+
22
+ export interface TimelineAnalysisRunInput {
23
+ /** Local calendar day being analyzed (YYYY-MM-DD). */
24
+ date: string;
25
+ /** IANA timezone the day is bucketed in. */
26
+ timezone: string;
27
+ /** Deterministic cards for the day (the bytes that must survive failure). */
28
+ cards: readonly TimelineCard[];
29
+ /** Day observations — the only evidence the provider may see. */
30
+ observations: readonly TimelineObservation[];
31
+ categories?: readonly TimelineCategory[];
32
+ /** Prior accepted manual corrections, surfaced to the prompt as edits. */
33
+ corrections?: readonly TimelineCorrection[];
34
+ config: ActivityTimelineAnalysisConfig;
35
+ deps: {
36
+ localLlm?: TimelineAnalysisLocalLlm | null;
37
+ remoteLlm?: TimelineAnalysisRemoteLlm | null;
38
+ };
39
+ signal?: AbortSignal;
40
+ }
41
+
42
+ export interface TimelineAnalysisRunResult {
43
+ status: TimelineAnalysisStatus;
44
+ /** Same card objects as the input on any non-ok status. */
45
+ cards: TimelineCard[];
46
+ failure?: AnalysisFailure;
47
+ /** Provider/model/prompt-version provenance; identifiers only, never content. */
48
+ metadata?: AnalysisRunMetadata;
49
+ }
50
+
51
+ /**
52
+ * Run the optional analysis for one day. Observations are confined to the
53
+ * DST-aware day window before anything is sent, so a mis-scoped caller cannot
54
+ * widen the evidence the provider sees.
55
+ */
56
+ export async function runTimelineCardAnalysis(
57
+ input: TimelineAnalysisRunInput,
58
+ ): Promise<TimelineAnalysisRunResult> {
59
+ // Throws RangeError on an impossible date or invalid timezone before any
60
+ // provider contact — the window bounds the whole run.
61
+ const { startUtc, endUtc } = activityDayWindow(input.date, input.timezone);
62
+ if (!input.config.enabled) {
63
+ return { status: "disabled", cards: input.cards as TimelineCard[] };
64
+ }
65
+ const start = Date.parse(startUtc);
66
+ const end = Date.parse(endUtc);
67
+ const observations = input.observations.filter((observation) => {
68
+ const captured = Date.parse(observation.capturedAtUtc);
69
+ return Number.isFinite(captured) && captured >= start && captured < end;
70
+ });
71
+ const result = await analyzeTimelineCards({
72
+ enabled: true,
73
+ cards: input.cards,
74
+ observations,
75
+ provider: input.config.provider,
76
+ model: input.config.model,
77
+ complete: timelineAnalysisCompleteFromClients({
78
+ localLlm: input.deps.localLlm ?? null,
79
+ remoteLlm: input.deps.remoteLlm ?? null,
80
+ }),
81
+ ...(input.config.timeoutMs === undefined ? {} : { timeoutMs: input.config.timeoutMs }),
82
+ date: input.date,
83
+ timezone: input.timezone,
84
+ ...(input.categories === undefined ? {} : { categories: input.categories }),
85
+ ...(input.config.preferences === undefined ? {} : { preferences: input.config.preferences }),
86
+ ...(input.corrections === undefined ? {} : { priorEdits: input.corrections }),
87
+ ...(input.signal === undefined ? {} : { signal: input.signal }),
88
+ });
89
+ if (result.status !== "ok") {
90
+ return {
91
+ status: result.status,
92
+ cards: result.cards,
93
+ ...(result.failure === undefined ? {} : { failure: result.failure }),
94
+ };
95
+ }
96
+ return {
97
+ status: "ok",
98
+ cards: result.cards,
99
+ metadata: buildAnalysisRunMetadata({
100
+ provider: result.provider ?? "unknown",
101
+ model: result.model ?? "unknown",
102
+ promptVersion: String(result.promptVersion ?? "v0"),
103
+ observationCount: observations.length,
104
+ }),
105
+ };
106
+ }