@remnic/core 9.69.33 → 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 (759) hide show
  1. package/dist/access-admin-ops-surface.d.ts +13 -11
  2. package/dist/access-admin-ops-surface.js +61 -56
  3. package/dist/access-authorization-probe.d.ts +13 -11
  4. package/dist/access-authorization-probe.js +62 -57
  5. package/dist/access-boundary.d.ts +13 -11
  6. package/dist/access-boundary.js +61 -56
  7. package/dist/access-cli.js +129 -125
  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 +61 -56
  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 +62 -57
  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 +63 -58
  21. package/dist/access-http.d.ts +14 -12
  22. package/dist/access-http.js +82 -78
  23. package/dist/access-identity-continuity-surface.d.ts +11 -9
  24. package/dist/access-identity-continuity-surface.js +61 -56
  25. package/dist/access-lcm-surface.d.ts +13 -11
  26. package/dist/access-lcm-surface.js +61 -56
  27. package/dist/access-mcp.d.ts +13 -11
  28. package/dist/access-mcp.js +70 -66
  29. package/dist/access-memory-search-fanout.d.ts +3 -2
  30. package/dist/{access-namespace-preflight-DMR-jOMS.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 +61 -56
  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 +61 -56
  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 +64 -60
  40. package/dist/access-operations.d.ts +14 -12
  41. package/dist/access-operations.js +69 -65
  42. package/dist/access-recall-concurrency.d.ts +13 -11
  43. package/dist/access-recall-concurrency.js +61 -56
  44. package/dist/access-recall-response.d.ts +13 -11
  45. package/dist/access-recall-response.js +61 -56
  46. package/dist/access-recall-surface.d.ts +13 -11
  47. package/dist/access-recall-surface.js +61 -56
  48. package/dist/access-schema.d.ts +55 -13
  49. package/dist/access-schema.js +15 -1
  50. package/dist/{access-service-CJQoQvRa.d.ts → access-service-WUm2LnXZ.d.ts} +52 -50
  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 +61 -56
  54. package/dist/access-surface-catalog.d.ts +13 -11
  55. package/dist/access-surface-catalog.js +63 -58
  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 +12 -10
  63. package/dist/active-recall.js.map +1 -1
  64. package/dist/activity/digest.d.ts +2 -1
  65. package/dist/adapters/index.d.ts +46 -1
  66. package/dist/adapters/index.js +10 -6
  67. package/dist/adapters/registry.js +2 -2
  68. package/dist/ambient-provenance.d.ts +2 -1
  69. package/dist/artifact-search.d.ts +2 -1
  70. package/dist/{auto-sync-NSHLUAQI.js → auto-sync-4YFATLFQ.js} +10 -9
  71. package/dist/{auto-sync-NSHLUAQI.js.map → auto-sync-4YFATLFQ.js.map} +1 -1
  72. package/dist/behavior-learner.d.ts +2 -1
  73. package/dist/behavior-signals.d.ts +2 -1
  74. package/dist/bootstrap.d.ts +11 -9
  75. package/dist/briefing-window.d.ts +3 -2
  76. package/dist/briefing.d.ts +3 -2
  77. package/dist/briefing.js +25 -24
  78. package/dist/buffer-surprise-report.d.ts +2 -1
  79. package/dist/buffer-turn-helpers.d.ts +2 -1
  80. package/dist/buffer.d.ts +3 -2
  81. package/dist/buffer.js +11 -10
  82. package/dist/bulk-import/index.d.ts +4 -3
  83. package/dist/calibration.d.ts +2 -1
  84. package/dist/calibration.js +3 -2
  85. package/dist/calibration.js.map +1 -1
  86. package/dist/capabilities.d.ts +2 -1
  87. package/dist/{capsule-merge-IPG4IOFP.js → capsule-merge-ZCXUPLNJ.js} +2 -2
  88. package/dist/{catalog-8O9KY9eA.d.ts → catalog-BaCx29iv.d.ts} +1 -1
  89. package/dist/causal-behavior.d.ts +2 -1
  90. package/dist/causal-consolidation.d.ts +2 -1
  91. package/dist/causal-consolidation.js +26 -25
  92. package/dist/causal-consolidation.js.map +1 -1
  93. package/dist/causal-trajectory-graph.d.ts +2 -1
  94. package/dist/{chunk-CDKHKZL5.js → chunk-2524MOWK.js} +2 -2
  95. package/dist/{chunk-HVAEXYPL.js → chunk-255PC37A.js} +47 -25
  96. package/dist/chunk-255PC37A.js.map +1 -0
  97. package/dist/{chunk-7BMXZCOT.js → chunk-2AU4D4HQ.js} +3 -3
  98. package/dist/{chunk-LTIZHLV7.js → chunk-2JCA2PQT.js} +2 -2
  99. package/dist/{chunk-XXIHX75O.js → chunk-2UZ5ZH6W.js} +3 -3
  100. package/dist/{chunk-QOIOACIE.js → chunk-326KUXIR.js} +15 -648
  101. package/dist/chunk-326KUXIR.js.map +1 -0
  102. package/dist/{chunk-P3SB5BNT.js → chunk-34QW2LK2.js} +2 -2
  103. package/dist/{chunk-EONF76DT.js → chunk-36UBSLFN.js} +2 -2
  104. package/dist/{chunk-DBQWVT2H.js → chunk-3CBI2ZSA.js} +2 -2
  105. package/dist/{chunk-NZXEK3UF.js → chunk-3Q3N35W7.js} +2 -2
  106. package/dist/{chunk-YYGZJPOK.js → chunk-42DJ235G.js} +2 -2
  107. package/dist/{chunk-TCUKRAMK.js → chunk-4JVQRFZD.js} +7 -7
  108. package/dist/{chunk-22FVR2KE.js → chunk-4MIS4CQW.js} +6 -2
  109. package/dist/chunk-4MIS4CQW.js.map +1 -0
  110. package/dist/{chunk-PYLL63BF.js → chunk-4PB2MBY6.js} +9 -9
  111. package/dist/{chunk-UUQG7HAD.js → chunk-4WCNPQQ5.js} +4 -4
  112. package/dist/{chunk-UGPUYIET.js → chunk-5A7ZUOBA.js} +220 -399
  113. package/dist/chunk-5A7ZUOBA.js.map +1 -0
  114. package/dist/chunk-5HYUUFMQ.js +1280 -0
  115. package/dist/chunk-5HYUUFMQ.js.map +1 -0
  116. package/dist/{chunk-H4VH5VIB.js → chunk-5QBDLMGG.js} +2 -2
  117. package/dist/{chunk-RKBLRTNT.js → chunk-5SDSVX7N.js} +2 -2
  118. package/dist/{chunk-DGGB65KC.js → chunk-5THU7NFP.js} +3 -3
  119. package/dist/{chunk-N7RWREIQ.js → chunk-65RENJGB.js} +6 -1
  120. package/dist/chunk-65RENJGB.js.map +1 -0
  121. package/dist/{chunk-BPJNF7J2.js → chunk-6CCRSQWT.js} +2 -2
  122. package/dist/{chunk-XXE5P6HJ.js → chunk-6XYC7NM4.js} +2 -2
  123. package/dist/{chunk-J7HFPA6O.js → chunk-6YAIN5XJ.js} +2 -2
  124. package/dist/{chunk-I5DZ3WGR.js → chunk-757NP436.js} +3 -3
  125. package/dist/{chunk-2C3S7J2S.js → chunk-7CAY3YKP.js} +741 -28
  126. package/dist/chunk-7CAY3YKP.js.map +1 -0
  127. package/dist/{chunk-E6TDQRF6.js → chunk-7J2CGXG3.js} +2 -2
  128. package/dist/{chunk-BUTCAMJM.js → chunk-A2YQL2FF.js} +5 -5
  129. package/dist/chunk-A5UQ52YQ.js +211 -0
  130. package/dist/chunk-A5UQ52YQ.js.map +1 -0
  131. package/dist/{chunk-X2NFFBTO.js → chunk-A7GQBJP5.js} +4 -4
  132. package/dist/{chunk-R3HKWWUB.js → chunk-A7WOWDZK.js} +2 -2
  133. package/dist/{chunk-6N3TQFZU.js → chunk-AIKTQVV3.js} +3 -3
  134. package/dist/{chunk-CGC5UQCF.js → chunk-AKE4GGQ3.js} +2 -2
  135. package/dist/{chunk-W27OW7AB.js → chunk-APFKZVJS.js} +2 -2
  136. package/dist/{chunk-B325AGLK.js → chunk-AQIRQUCP.js} +2 -2
  137. package/dist/{chunk-S7T2TY65.js → chunk-AXFR2NQ5.js} +3 -3
  138. package/dist/{chunk-FCSZ4K2X.js → chunk-BJJWRWER.js} +3 -3
  139. package/dist/{chunk-JT3EB7ZL.js → chunk-BNGHPYZU.js} +5 -5
  140. package/dist/chunk-BRZWWUCJ.js +13 -0
  141. package/dist/{chunk-FYDW33ZB.js.map → chunk-BRZWWUCJ.js.map} +1 -1
  142. package/dist/{chunk-N57A4KPV.js → chunk-C2BFTYD7.js} +2 -2
  143. package/dist/{chunk-3JVLGJCY.js → chunk-C6KRO3SU.js} +2 -2
  144. package/dist/{chunk-Q726HSJO.js → chunk-CRUFVJOX.js} +16 -15
  145. package/dist/chunk-CRUFVJOX.js.map +1 -0
  146. package/dist/{chunk-X35W4S3L.js → chunk-D3IZCN5P.js} +4 -4
  147. package/dist/{chunk-44T3Y7SZ.js → chunk-EJIEQOPB.js} +5 -5
  148. package/dist/{chunk-ET356KSB.js → chunk-F4TWWUMP.js} +2 -2
  149. package/dist/{chunk-CLLPJ6QT.js → chunk-FQXJAC3T.js} +2 -2
  150. package/dist/{chunk-DD5JFCWM.js → chunk-GCBIXUPT.js} +2 -2
  151. package/dist/{chunk-N2ZNPHA3.js → chunk-IFFLUCCU.js} +2 -2
  152. package/dist/{chunk-RHQMKJFG.js → chunk-ISYZ5DUI.js} +51 -47
  153. package/dist/{chunk-RHQMKJFG.js.map → chunk-ISYZ5DUI.js.map} +1 -1
  154. package/dist/{chunk-PFFZWDPE.js → chunk-JZDH2ZZK.js} +3 -3
  155. package/dist/{chunk-TX2UTLXC.js → chunk-K6IPSW5B.js} +2 -2
  156. package/dist/{chunk-4MHYKEOM.js → chunk-KDJHLOZP.js} +10 -10
  157. package/dist/{chunk-KCB7F4J7.js → chunk-KYGOQV37.js} +2 -2
  158. package/dist/{chunk-JEIXTYVG.js → chunk-L2QLDZJC.js} +46 -17
  159. package/dist/chunk-L2QLDZJC.js.map +1 -0
  160. package/dist/{chunk-A7XEPMQ6.js → chunk-LAVJC57X.js} +3 -3
  161. package/dist/chunk-LAVJC57X.js.map +1 -0
  162. package/dist/{chunk-VZWXFXLX.js → chunk-LMCD5W5B.js} +2 -2
  163. package/dist/{chunk-3QQTXYZ6.js → chunk-LSLCFCCQ.js} +2 -1
  164. package/dist/chunk-LSLCFCCQ.js.map +1 -0
  165. package/dist/{chunk-MKD3OMPS.js → chunk-M3MYMWXG.js} +2 -2
  166. package/dist/{chunk-PL7FYKHT.js → chunk-MMG5K6XJ.js} +2 -2
  167. package/dist/{chunk-VGXM5B4H.js → chunk-MNIPH6LD.js} +2 -2
  168. package/dist/{chunk-E6JA6XWY.js → chunk-ND2O2PVN.js} +1013 -1317
  169. package/dist/chunk-ND2O2PVN.js.map +1 -0
  170. package/dist/chunk-NPNSKE76.js +220 -0
  171. package/dist/chunk-NPNSKE76.js.map +1 -0
  172. package/dist/{chunk-XU6OEECT.js → chunk-OQQXGYMX.js} +3 -3
  173. package/dist/{chunk-DB5TGMLZ.js → chunk-OZUXKUPD.js} +6 -4
  174. package/dist/{chunk-DB5TGMLZ.js.map → chunk-OZUXKUPD.js.map} +1 -1
  175. package/dist/chunk-PCEYGOSL.js +66 -0
  176. package/dist/chunk-PCEYGOSL.js.map +1 -0
  177. package/dist/{chunk-LSYDG6MJ.js → chunk-PEXW2JCK.js} +2 -2
  178. package/dist/{chunk-EEOUMG3J.js → chunk-PWPIERBM.js} +38 -6
  179. package/dist/chunk-PWPIERBM.js.map +1 -0
  180. package/dist/chunk-Q4AUIFUA.js +111 -0
  181. package/dist/chunk-Q4AUIFUA.js.map +1 -0
  182. package/dist/{chunk-SO7SV523.js → chunk-Q6LCCIZN.js} +1 -1
  183. package/dist/chunk-Q6LCCIZN.js.map +1 -0
  184. package/dist/{chunk-MOZXTRC2.js → chunk-QF4J3KMV.js} +19 -19
  185. package/dist/{chunk-JGHXXQ2G.js → chunk-QLJ6762U.js} +2 -2
  186. package/dist/{chunk-XOVKXJEP.js → chunk-R3TLVTWW.js} +3 -3
  187. package/dist/{chunk-CETXNLEX.js → chunk-RQO3J4MR.js} +2 -2
  188. package/dist/{chunk-5NANRSCD.js → chunk-RR7G2X7C.js} +5 -5
  189. package/dist/{chunk-DCJ3YFIC.js → chunk-S2ULTQZR.js} +2 -2
  190. package/dist/{chunk-EQHDH4C2.js → chunk-S76KRJDG.js} +3 -3
  191. package/dist/{chunk-H272ZPQ3.js → chunk-SHEHQBCG.js} +124 -23
  192. package/dist/chunk-SHEHQBCG.js.map +1 -0
  193. package/dist/{chunk-EEC4PCG5.js → chunk-SZDLX763.js} +2 -2
  194. package/dist/{chunk-MFDTVQJX.js → chunk-SZWEDG3H.js} +12 -6
  195. package/dist/chunk-SZWEDG3H.js.map +1 -0
  196. package/dist/{chunk-E2ZHGBAK.js → chunk-T2JSUEH6.js} +2 -2
  197. package/dist/{chunk-JSN44KIB.js → chunk-T2YFZ27G.js} +9 -9
  198. package/dist/{chunk-227UFSEQ.js → chunk-TFA6HPOA.js} +2 -2
  199. package/dist/{chunk-BA6WOZOT.js → chunk-TK4FHQRN.js} +4 -4
  200. package/dist/chunk-TLHNF6GA.js +647 -0
  201. package/dist/chunk-TLHNF6GA.js.map +1 -0
  202. package/dist/{chunk-NB5BCFUY.js → chunk-TWYTGIBR.js} +4 -4
  203. package/dist/{chunk-FDLDOEO6.js → chunk-UBG4GAEP.js} +51 -6
  204. package/dist/chunk-UBG4GAEP.js.map +1 -0
  205. package/dist/{chunk-MWFGUESQ.js → chunk-UEZKN6VR.js} +2 -2
  206. package/dist/{chunk-H5AFCNGA.js → chunk-UJX4I26O.js} +2 -2
  207. package/dist/{chunk-BLUYQFRH.js → chunk-VELCIWJZ.js} +15 -11
  208. package/dist/chunk-VELCIWJZ.js.map +1 -0
  209. package/dist/{chunk-PBGVVDLY.js → chunk-VIZR45AN.js} +2 -2
  210. package/dist/{chunk-ZG74PWRW.js → chunk-VZAKYDMJ.js} +2 -2
  211. package/dist/{chunk-JTH2SE6B.js → chunk-W5BLTZZJ.js} +8 -8
  212. package/dist/chunk-W6IJMWTZ.js +72 -0
  213. package/dist/chunk-W6IJMWTZ.js.map +1 -0
  214. package/dist/{chunk-H3TKENU4.js → chunk-WIKO4SCR.js} +5 -5
  215. package/dist/{chunk-YFLLGRXO.js → chunk-X2QPKLPL.js} +2 -2
  216. package/dist/{chunk-MN3LK3KN.js → chunk-X424T5JQ.js} +2 -2
  217. package/dist/{chunk-5BCNEBEN.js → chunk-XPJNT6PI.js} +4 -4
  218. package/dist/{chunk-2JVJ7UHC.js → chunk-XQU3CPF2.js} +4 -2
  219. package/dist/chunk-XQU3CPF2.js.map +1 -0
  220. package/dist/chunk-XW2T4QAW.js +1 -0
  221. package/dist/{chunk-D223ZDQV.js → chunk-YEDVOYL2.js} +2 -2
  222. package/dist/{chunk-TLPZ6MKZ.js → chunk-YEN4TREG.js} +541 -5
  223. package/dist/chunk-YEN4TREG.js.map +1 -0
  224. package/dist/{chunk-RC5DXXWC.js → chunk-YM7YN37H.js} +2 -2
  225. package/dist/{chunk-VLXBE57O.js → chunk-YVGXH72Y.js} +2 -2
  226. package/dist/{chunk-YQAXP5AC.js → chunk-YXLUTALO.js} +5 -5
  227. package/dist/{chunk-OQDPBRQ6.js → chunk-Z7YDVHDI.js} +2 -2
  228. package/dist/{chunk-O75CRYGF.js → chunk-ZEFVK7XC.js} +1 -1
  229. package/dist/chunk-ZEFVK7XC.js.map +1 -0
  230. package/dist/{chunk-XUE46UYW.js → chunk-ZLN7AROH.js} +6 -6
  231. package/dist/{chunk-HV7OY4DM.js → chunk-ZMKYCFJ7.js} +640 -199
  232. package/dist/chunk-ZMKYCFJ7.js.map +1 -0
  233. package/dist/{chunk-HK32G473.js → chunk-ZWEZXVYH.js} +2 -2
  234. package/dist/{cli-D57e2Mqt.d.ts → cli-5mTYh1Tn.d.ts} +5 -5
  235. package/dist/cli-fallback.d.ts +11 -4
  236. package/dist/cli-fallback.js +5 -1
  237. package/dist/cli.d.ts +15 -13
  238. package/dist/cli.js +102 -98
  239. package/dist/coding/export-okf-codegraph.d.ts +2 -1
  240. package/dist/coding/export-okf-codegraph.js +31 -29
  241. package/dist/coding/export-okf-codegraph.js.map +1 -1
  242. package/dist/coding/pre-action-gate.d.ts +2 -1
  243. package/dist/compat/checks.js +2 -2
  244. package/dist/compat/codex-cli-fallback.d.ts +1 -1
  245. package/dist/compat/codex-cli-fallback.js +5 -1
  246. package/dist/compat/codex-cli-fallback.js.map +1 -1
  247. package/dist/compounding/engine.d.ts +3 -2
  248. package/dist/compounding/engine.js +26 -25
  249. package/dist/compounding/preference-consolidator.d.ts +2 -1
  250. package/dist/compression-optimizer.d.ts +2 -1
  251. package/dist/config.d.ts +2 -1
  252. package/dist/config.js +12 -10
  253. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  254. package/dist/connectors/codex-materialize-runner.js +25 -24
  255. package/dist/connectors/codex-materialize.d.ts +2 -1
  256. package/dist/connectors/index.d.ts +2 -1
  257. package/dist/connectors/index.js +27 -26
  258. package/dist/consolidation-provenance-check.d.ts +3 -2
  259. package/dist/consolidation-undo.d.ts +3 -2
  260. package/dist/contradiction/index.d.ts +4 -3
  261. package/dist/contradiction/index.js +5 -5
  262. package/dist/{contradiction-scan-NOYMFG66.js → contradiction-scan-GVD4JJ7B.js} +3 -3
  263. package/dist/converge-config.d.ts +2 -1
  264. package/dist/convergence-refresh.d.ts +3 -2
  265. package/dist/convergence-refresh.js +27 -26
  266. package/dist/conversation-index/backend.d.ts +2 -1
  267. package/dist/conversation-index/backend.js +3 -3
  268. package/dist/conversation-index/chunker.d.ts +2 -1
  269. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  270. package/dist/conversation-index/faiss-adapter.js +2 -2
  271. package/dist/conversation-index/indexer.d.ts +2 -1
  272. package/dist/conversation-index/search.d.ts +2 -1
  273. package/dist/corpus-watermark.d.ts +2 -1
  274. package/dist/corpus-watermark.js +28 -27
  275. package/dist/cross-lingual-recall.d.ts +2 -1
  276. package/dist/day-summary.d.ts +2 -1
  277. package/dist/deep-recall-http-glue.d.ts +13 -11
  278. package/dist/deep-recall-http-glue.js +12 -2
  279. package/dist/deep-recall-mcp-tools.d.ts +13 -11
  280. package/dist/deep-recall-policy-llm.d.ts +2 -1
  281. package/dist/deep-recall-policy-llm.js +4 -3
  282. package/dist/deep-recall-seeds.d.ts +2 -1
  283. package/dist/delinearize.d.ts +2 -1
  284. package/dist/dependency-propagation-config.d.ts +2 -1
  285. package/dist/{dependency-propagation-delivery-CmniEsUK.d.ts → dependency-propagation-delivery-CDQCxNll.d.ts} +1 -1
  286. package/dist/direct-answer-wiring.d.ts +2 -1
  287. package/dist/direct-answer.d.ts +2 -1
  288. package/dist/embedding-fallback.d.ts +2 -1
  289. package/dist/enrichment/index.d.ts +2 -1
  290. package/dist/entity-origin-fields.d.ts +2 -1
  291. package/dist/entity-retrieval.d.ts +3 -2
  292. package/dist/entity-retrieval.js +25 -24
  293. package/dist/entity-schema.d.ts +2 -1
  294. package/dist/episodic-context.d.ts +2 -1
  295. package/dist/eval-trajectory-contracts.d.ts +2 -1
  296. package/dist/eval-trajectory-store.d.ts +2 -1
  297. package/dist/eval-trajectory.d.ts +2 -1
  298. package/dist/explicit-capture.d.ts +11 -9
  299. package/dist/explicit-capture.js +6 -6
  300. package/dist/external-wiki-access.d.ts +13 -11
  301. package/dist/external-wiki-access.js +62 -57
  302. package/dist/external-wiki-collection-registration.d.ts +2 -1
  303. package/dist/external-wiki-collection.d.ts +2 -1
  304. package/dist/external-wiki-mcp-tools.d.ts +13 -11
  305. package/dist/extraction-error-classification.d.ts +2 -1
  306. package/dist/extraction-faithfulness.d.ts +2 -1
  307. package/dist/extraction-faithfulness.js +4 -3
  308. package/dist/extraction-judge-telemetry.d.ts +2 -1
  309. package/dist/extraction-judge-training.d.ts +2 -1
  310. package/dist/extraction-judge.d.ts +2 -1
  311. package/dist/extraction-judge.js +5 -4
  312. package/dist/extraction-liveness.d.ts +2 -1
  313. package/dist/extraction-normalization.d.ts +2 -1
  314. package/dist/extraction-prompt.d.ts +2 -1
  315. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  316. package/dist/extraction-source-grounding.d.ts +2 -1
  317. package/dist/extraction.d.ts +2 -1
  318. package/dist/extraction.js +36 -34
  319. package/dist/fallback-llm.d.ts +2 -1
  320. package/dist/fallback-llm.js +3 -2
  321. package/dist/{first-start-migration-RC345GPL.js → first-start-migration-L3UFX5CU.js} +3 -3
  322. package/dist/generic-recall-paths-CqAZyXKX.d.ts +23 -0
  323. package/dist/graph-append-error.d.ts +2 -1
  324. package/dist/graph-dashboard-diff.d.ts +2 -1
  325. package/dist/graph-dashboard-key.d.ts +2 -1
  326. package/dist/graph-dashboard-parser.d.ts +2 -1
  327. package/dist/graph-edge-reinforcement.d.ts +2 -1
  328. package/dist/graph-jsonl.d.ts +2 -1
  329. package/dist/graph-path-reconstruction.d.ts +2 -1
  330. package/dist/graph-path-scoring.d.ts +2 -1
  331. package/dist/graph-snapshot.d.ts +2 -1
  332. package/dist/graph.d.ts +2 -1
  333. package/dist/harmonic-retrieval.js +2 -2
  334. package/dist/importance.d.ts +2 -1
  335. package/dist/importers/index.d.ts +2 -1
  336. package/dist/importers/test-utils.d.ts +2 -1
  337. package/dist/in-flight-reads.d.ts +2 -1
  338. package/dist/{index-BTAsSkPG.d.ts → index-BNluTxBp.d.ts} +2 -2
  339. package/dist/index.d.ts +302 -245
  340. package/dist/index.js +307 -205
  341. package/dist/intent.d.ts +2 -1
  342. package/dist/lcm/engine.d.ts +2 -1
  343. package/dist/lcm/engine.js +2 -2
  344. package/dist/lcm/index.d.ts +2 -1
  345. package/dist/lcm/index.js +4 -4
  346. package/dist/lcm/tools.d.ts +2 -1
  347. package/dist/lifecycle.d.ts +2 -1
  348. package/dist/live-connectors-runner.d.ts +2 -1
  349. package/dist/local-llm.d.ts +4 -1
  350. package/dist/local-llm.js +2 -2
  351. package/dist/local-model-endpoint.d.ts +2 -1
  352. package/dist/location/index.d.ts +4 -3
  353. package/dist/location/index.js +28 -27
  354. package/dist/maintenance/memory-governance.d.ts +2 -1
  355. package/dist/maintenance/memory-governance.js +25 -24
  356. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  357. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +25 -24
  358. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  359. package/dist/maintenance/rebuild-memory-projection.js +26 -25
  360. package/dist/{maintenance-DCvQGTzL.d.ts → maintenance-8hmWOMY_.d.ts} +378 -4
  361. package/dist/mcp-memory-inspector-app.d.ts +13 -11
  362. package/dist/memory-action-policy.d.ts +2 -1
  363. package/dist/memory-cache.d.ts +2 -1
  364. package/dist/memory-controller.d.ts +2 -1
  365. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  366. package/dist/memory-projection-store.d.ts +2 -1
  367. package/dist/memory-provenance.d.ts +2 -1
  368. package/dist/memory-snapshot.d.ts +2 -1
  369. package/dist/memory-subject-cli.d.ts +13 -11
  370. package/dist/memory-subject.d.ts +13 -11
  371. package/dist/memory-worth-outcomes.d.ts +3 -2
  372. package/dist/migrate/from-engram.js +2 -2
  373. package/dist/models-json.d.ts +2 -1
  374. package/dist/namespaces/migrate.d.ts +4 -3
  375. package/dist/namespaces/migrate.js +26 -25
  376. package/dist/namespaces/principal.d.ts +2 -1
  377. package/dist/namespaces/search.d.ts +2 -1
  378. package/dist/namespaces/search.js +8 -8
  379. package/dist/namespaces/storage.d.ts +4 -3
  380. package/dist/namespaces/storage.js +25 -24
  381. package/dist/native-knowledge.d.ts +2 -1
  382. package/dist/network/tailscale.js +2 -2
  383. package/dist/offline-sync-impression-drain.d.ts +2 -1
  384. package/dist/offline-sync-impression-drain.js +6 -6
  385. package/dist/operator-doctor-corpus.d.ts +2 -1
  386. package/dist/operator-doctor-corpus.js +29 -28
  387. package/dist/operator-doctor-replica.d.ts +2 -1
  388. package/dist/operator-toolkit.d.ts +4 -3
  389. package/dist/operator-toolkit.js +43 -41
  390. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  391. package/dist/orchestration/maintenance.d.ts +5 -4
  392. package/dist/orchestration/maintenance.js +43 -38
  393. package/dist/{orchestrator-CvCsp1tz.d.ts → orchestrator-BUd_3Q86.d.ts} +17 -29
  394. package/dist/orchestrator.d.ts +11 -9
  395. package/dist/orchestrator.js +133 -127
  396. package/dist/patterns-cli.d.ts +2 -1
  397. package/dist/{pipeline-JAdwKBS7.d.ts → pipeline-Dv1Bv0ma.d.ts} +1 -1
  398. package/dist/policy-runtime.d.ts +2 -1
  399. package/dist/proactive-contention.d.ts +2 -1
  400. package/dist/provenance.d.ts +2 -1
  401. package/dist/{public-http-h-yWu9rj.d.ts → public-http-L-IymRBN.d.ts} +1 -1
  402. package/dist/{qmd-Cvw9RWKr.d.ts → qmd-Mj508lHA.d.ts} +1 -1
  403. package/dist/qmd-preflight.d.ts +3 -2
  404. package/dist/qmd-recall-cache.d.ts +2 -1
  405. package/dist/qmd.d.ts +3 -2
  406. package/dist/qmd.js +2 -2
  407. package/dist/recall-concurrency-config.d.ts +2 -1
  408. package/dist/recall-disclosure-escalation.d.ts +2 -1
  409. package/dist/recall-explain-renderer.d.ts +2 -1
  410. package/dist/recall-explain-renderer.js +3 -3
  411. package/dist/recall-memory-map.d.ts +2 -1
  412. package/dist/recall-navigate-access.d.ts +2 -1
  413. package/dist/recall-navigate-access.js +2 -2
  414. package/dist/recall-navigate-disclosure.d.ts +2 -1
  415. package/dist/recall-navigate-disclosure.js +1 -1
  416. package/dist/recall-navigate.d.ts +2 -1
  417. package/dist/recall-navigate.js +2 -2
  418. package/dist/recall-planner-llm.d.ts +2 -1
  419. package/dist/recall-planner-llm.js +3 -2
  420. package/dist/recall-planner-llm.js.map +1 -1
  421. package/dist/recall-state-view-admission.d.ts +56 -0
  422. package/dist/recall-state-view-admission.js +39 -0
  423. package/dist/recall-state-view-inject.js +2 -2
  424. package/dist/recall-state-view-render.js +2 -2
  425. package/dist/recall-state-view-widen.d.ts +18 -1
  426. package/dist/recall-state-view-widen.js +2 -2
  427. package/dist/recall-state-view-wire.d.ts +1 -1
  428. package/dist/recall-state-view-wire.js +3 -3
  429. package/dist/recall-state-view.d.ts +1 -0
  430. package/dist/recall-state-view.js +1 -1
  431. package/dist/recall-state.d.ts +2 -1
  432. package/dist/recall-tag-filter.d.ts +2 -1
  433. package/dist/recall-timings.d.ts +2 -1
  434. package/dist/recall-xray-cli.d.ts +2 -1
  435. package/dist/recall-xray-cli.js +4 -4
  436. package/dist/recall-xray-renderer.d.ts +2 -1
  437. package/dist/recall-xray-renderer.js +3 -3
  438. package/dist/recall-xray.d.ts +9 -1
  439. package/dist/recall-xray.js +2 -2
  440. package/dist/reconcile/cursor.d.ts +11 -2
  441. package/dist/reconcile/cursor.js +6 -4
  442. package/dist/reconcile/cursor.js.map +1 -1
  443. package/dist/reconcile/manifest.d.ts +37 -2
  444. package/dist/reconcile/manifest.js +15 -5
  445. package/dist/reconcile/plan.d.ts +2 -1
  446. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  447. package/dist/replay/normalizers/claude.d.ts +2 -1
  448. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  449. package/dist/replay/normalizers/shared.d.ts +2 -1
  450. package/dist/replay/runner.d.ts +2 -1
  451. package/dist/replay/types.d.ts +2 -1
  452. package/dist/replica-divergence.d.ts +2 -1
  453. package/dist/replica-peers-config.d.ts +2 -1
  454. package/dist/{resolution-VKATP2HT.js → resolution-OHJZG45O.js} +6 -6
  455. package/dist/resolution-OHJZG45O.js.map +1 -0
  456. package/dist/resolve-auth-token.d.ts +2 -1
  457. package/dist/resume-bundles.js +13 -11
  458. package/dist/retrieval-agents.d.ts +3 -2
  459. package/dist/retrieval-tiers.d.ts +2 -1
  460. package/dist/routing/engine.d.ts +2 -1
  461. package/dist/routing/store.d.ts +2 -1
  462. package/dist/runtime/child-process.d.ts +1 -1
  463. package/dist/runtime/child-process.js +1 -1
  464. package/dist/salvage-envelope.d.ts +2 -1
  465. package/dist/salvage-envelope.js +2 -2
  466. package/dist/{scope-profiles-BShpTPeV.d.ts → scope-profiles-B6BGVbxm.d.ts} +1 -1
  467. package/dist/search/embed-helper.d.ts +2 -1
  468. package/dist/search/factory.d.ts +2 -1
  469. package/dist/search/factory.js +7 -7
  470. package/dist/search/index.d.ts +2 -1
  471. package/dist/search/index.js +11 -11
  472. package/dist/search/lancedb-backend.d.ts +2 -1
  473. package/dist/search/meilisearch-backend.d.ts +2 -1
  474. package/dist/search/noop-backend.d.ts +2 -1
  475. package/dist/search/orama-backend.d.ts +2 -1
  476. package/dist/search/port.d.ts +2 -1
  477. package/dist/search/remote-backend.d.ts +2 -1
  478. package/dist/{semantic-consolidation-CusOpe9F.d.ts → semantic-consolidation-J-598F5M.d.ts} +1 -1
  479. package/dist/semantic-consolidation.d.ts +3 -2
  480. package/dist/semantic-consolidation.js +26 -25
  481. package/dist/semantic-rule-promotion.js +25 -24
  482. package/dist/semantic-rule-verifier.d.ts +2 -1
  483. package/dist/semantic-rule-verifier.js +25 -24
  484. package/dist/{service-BbuVh1eS.d.ts → service-ZQkJ52cz.d.ts} +2 -2
  485. package/dist/session-observer-bands.d.ts +2 -1
  486. package/dist/session-observer-state.d.ts +2 -1
  487. package/dist/shared-context/manager.d.ts +2 -1
  488. package/dist/signal.d.ts +2 -1
  489. package/dist/source-agent-qualifier.d.ts +2 -1
  490. package/dist/source-agent-qualifier.js +34 -32
  491. package/dist/standup/build.js +25 -24
  492. package/dist/{storage-BBLLuVTF.d.ts → storage-CU_hZUgP.d.ts} +67 -6
  493. package/dist/storage.d.ts +4 -3
  494. package/dist/storage.js +24 -23
  495. package/dist/subject-config.d.ts +2 -1
  496. package/dist/subject-config.js +2 -2
  497. package/dist/summarizer.d.ts +2 -1
  498. package/dist/summarizer.js +5 -5
  499. package/dist/summary-snapshot.d.ts +2 -1
  500. package/dist/support-passport/index.d.ts +49 -15
  501. package/dist/support-passport/index.js +69 -60
  502. package/dist/temporal-supersession.d.ts +3 -2
  503. package/dist/temporal-timeline-recall.d.ts +2 -1
  504. package/dist/temporal-validity.d.ts +2 -1
  505. package/dist/threading.d.ts +2 -1
  506. package/dist/tier-migration.d.ts +3 -2
  507. package/dist/tier-routing.d.ts +2 -1
  508. package/dist/tier-routing.js +2 -2
  509. package/dist/{tier-stats-KA6OZX2C.js → tier-stats-VK5PCO2L.js} +3 -3
  510. package/dist/topics.d.ts +2 -1
  511. package/dist/transcript.d.ts +2 -1
  512. package/dist/transfer/capsule-import.js +1 -1
  513. package/dist/transfer/export-okf.d.ts +2 -1
  514. package/dist/transfer/export-okf.js +26 -25
  515. package/dist/transfer/types.d.ts +24 -24
  516. package/dist/trust-score-stage.d.ts +2 -1
  517. package/dist/trust-score.d.ts +2 -1
  518. package/dist/{types-igV4-sbB.d.ts → types-BGxTvLBO.d.ts} +58 -13
  519. package/dist/types.d.ts +2 -1
  520. package/dist/types.js +1 -1
  521. package/dist/utility-runtime.d.ts +2 -1
  522. package/dist/verified-recall.js +25 -24
  523. package/dist/who-knows-cli.d.ts +13 -11
  524. package/dist/who-knows-cli.js +26 -25
  525. package/dist/who-knows.d.ts +13 -11
  526. package/dist/who-knows.js +25 -24
  527. package/dist/write-envelope.d.ts +4 -2
  528. package/dist/write-envelope.js +3 -1
  529. package/package.json +2 -2
  530. package/src/access-category-alias.test.ts +216 -0
  531. package/src/access-mcp.test.ts +73 -0
  532. package/src/access-mcp.ts +6 -6
  533. package/src/access-observe-write-surface.ts +19 -4
  534. package/src/access-offline-manifest.ts +297 -16
  535. package/src/access-recall-surface.ts +5 -5
  536. package/src/access-schema.ts +76 -7
  537. package/src/access-service.ts +11 -2
  538. package/src/activity/config.test.ts +124 -1
  539. package/src/activity/config.ts +150 -18
  540. package/src/activity/index.ts +3 -0
  541. package/src/activity/journal-extract-storage.test.ts +129 -0
  542. package/src/activity/journal-extract.test.ts +314 -0
  543. package/src/activity/journal-extract.ts +247 -0
  544. package/src/activity/journal-heading.test.ts +24 -1
  545. package/src/activity/journal-heading.ts +36 -0
  546. package/src/activity/journal-read.test.ts +242 -0
  547. package/src/activity/journal-read.ts +183 -0
  548. package/src/activity/journal-source.test.ts +15 -15
  549. package/src/activity/journal-source.ts +21 -14
  550. package/src/activity/journal-state.lock-worker.ts +30 -0
  551. package/src/activity/journal-state.test.ts +144 -0
  552. package/src/activity/journal-state.ts +107 -0
  553. package/src/activity/journal-strip.test.ts +106 -52
  554. package/src/activity/journal-strip.ts +35 -10
  555. package/src/activity/journal-vault-integration.test.ts +230 -0
  556. package/src/activity/journal-vault-provenance.test.ts +9 -7
  557. package/src/activity/journal-vault-provenance.ts +4 -10
  558. package/src/activity/journal-vault-read.test.ts +3 -2
  559. package/src/activity/journal-vault-read.ts +9 -139
  560. package/src/activity/journal.test.ts +74 -23
  561. package/src/activity/runner.test.ts +116 -1
  562. package/src/activity/runner.ts +25 -0
  563. package/src/activity/scheduler.ts +4 -0
  564. package/src/activity/store.test.ts +18 -0
  565. package/src/activity/store.ts +14 -0
  566. package/src/activity/sync-registration.ts +4 -0
  567. package/src/activity/timeline/analysis-metadata.ts +2 -0
  568. package/src/activity/timeline/analysis-provider.ts +140 -0
  569. package/src/activity/timeline/analysis-run.test.ts +419 -0
  570. package/src/activity/timeline/analysis-run.ts +106 -0
  571. package/src/activity/timeline/analysis.ts +66 -37
  572. package/src/activity/timeline/corrections.ts +9 -0
  573. package/src/activity/timeline/index.ts +3 -0
  574. package/src/activity/timeline/query.test.ts +71 -0
  575. package/src/activity/timeline/query.ts +57 -8
  576. package/src/activity/timeline/regenerate.test.ts +505 -0
  577. package/src/activity/timeline/regenerate.ts +373 -0
  578. package/src/activity/types.ts +40 -5
  579. package/src/adapters/grok-opencode.test.ts +146 -0
  580. package/src/adapters/grok.ts +53 -0
  581. package/src/adapters/index.ts +2 -0
  582. package/src/adapters/opencode.ts +52 -0
  583. package/src/adapters/registry.ts +4 -0
  584. package/src/cli-fallback.ts +13 -4
  585. package/src/config.test.ts +3 -1
  586. package/src/config.ts +4 -0
  587. package/src/dedup/merge.test.ts +732 -25
  588. package/src/fallback-llm.test.ts +53 -0
  589. package/src/fallback-llm.ts +12 -0
  590. package/src/index.ts +2 -0
  591. package/src/local-llm.ts +3 -1
  592. package/src/orchestration/dependency-propagation-recovery-replay.ts +1 -1
  593. package/src/orchestration/extraction-persist-deps.ts +9 -0
  594. package/src/orchestration/extraction-persist-promotion.test.ts +265 -6
  595. package/src/orchestration/extraction-persist-promotion.ts +42 -3
  596. package/src/orchestration/extraction-persist.ts +3 -3
  597. package/src/orchestration/harmonic-construction-persist.test.ts +115 -4
  598. package/src/orchestration/harmonic-construction-persist.ts +34 -6
  599. package/src/orchestration/maintenance.ts +1 -0
  600. package/src/orchestration/orchestrator-helpers.ts +6 -0
  601. package/src/orchestration/recall-entry.ts +16 -0
  602. package/src/orchestration/recall-internal-deps.ts +14 -0
  603. package/src/orchestration/recall-internal.ts +41 -58
  604. package/src/orchestration/recall-result-formatter.ts +11 -1
  605. package/src/orchestration/recall-search-pipeline.ts +121 -11
  606. package/src/orchestration/recall-state-view-pipeline.test.ts +211 -0
  607. package/src/orchestration/semantic-merge-commit-effects.ts +76 -17
  608. package/src/orchestration/semantic-merge-persist.ts +121 -16
  609. package/src/orchestration/semantic-merge-promotion-payload.ts +133 -54
  610. package/src/orchestrator.ts +7 -35
  611. package/src/providers/codex-subscription.test.ts +666 -0
  612. package/src/providers/codex-subscription.ts +743 -0
  613. package/src/recall-disclosure.test.ts +20 -0
  614. package/src/recall-state-view-admission.ts +114 -0
  615. package/src/recall-state-view-asof.test.ts +176 -0
  616. package/src/recall-state-view-call.test.ts +175 -0
  617. package/src/recall-state-view-config.test.ts +16 -0
  618. package/src/recall-state-view-widen.test.ts +70 -0
  619. package/src/recall-state-view-widen.ts +28 -7
  620. package/src/recall-state-view-wire.ts +3 -1
  621. package/src/recall-state-view-zero-diff.test.ts +20 -11
  622. package/src/recall-state-view.test.ts +142 -0
  623. package/src/recall-state-view.ts +72 -24
  624. package/src/recall-xray-renderer.test.ts +27 -0
  625. package/src/recall-xray-renderer.ts +4 -0
  626. package/src/recall-xray.ts +13 -0
  627. package/src/reconcile/cursor.ts +23 -33
  628. package/src/reconcile/manifest.ts +96 -11
  629. package/src/reconcile-identity-cache.test.ts +378 -0
  630. package/src/runtime/child-process.ts +1 -1
  631. package/src/storage/cas-revision-host.ts +75 -0
  632. package/src/storage/cas-revision-store.test.ts +459 -0
  633. package/src/storage/cas-revision-store.ts +661 -0
  634. package/src/storage/deletion-revision-store.ts +80 -6
  635. package/src/storage/tombstone-blocked-capture-index.ts +15 -0
  636. package/src/storage/tombstone-blocked-capture-mutation.ts +67 -7
  637. package/src/storage/tombstone-blocked-capture-sync.ts +55 -20
  638. package/src/storage-contract/failure-semantics.test.ts +1 -1
  639. package/src/storage-frontmatter-cas.test.ts +698 -1
  640. package/src/storage-replay.test.ts +166 -3
  641. package/src/storage.ts +41 -41
  642. package/src/support-passport/card-projection.ts +82 -33
  643. package/src/temporal-supersession.test.ts +10 -10
  644. package/src/types.ts +7 -7
  645. package/src/write-envelope.ts +1 -1
  646. package/dist/chunk-22FVR2KE.js.map +0 -1
  647. package/dist/chunk-2C3S7J2S.js.map +0 -1
  648. package/dist/chunk-2JVJ7UHC.js.map +0 -1
  649. package/dist/chunk-2QSZNTDO.js +0 -56
  650. package/dist/chunk-2QSZNTDO.js.map +0 -1
  651. package/dist/chunk-3QQTXYZ6.js.map +0 -1
  652. package/dist/chunk-5VCDKQWQ.js +0 -560
  653. package/dist/chunk-5VCDKQWQ.js.map +0 -1
  654. package/dist/chunk-A7XEPMQ6.js.map +0 -1
  655. package/dist/chunk-BLUYQFRH.js.map +0 -1
  656. package/dist/chunk-E6JA6XWY.js.map +0 -1
  657. package/dist/chunk-EEOUMG3J.js.map +0 -1
  658. package/dist/chunk-FDLDOEO6.js.map +0 -1
  659. package/dist/chunk-FYDW33ZB.js +0 -13
  660. package/dist/chunk-H272ZPQ3.js.map +0 -1
  661. package/dist/chunk-HV7OY4DM.js.map +0 -1
  662. package/dist/chunk-HVAEXYPL.js.map +0 -1
  663. package/dist/chunk-JEIXTYVG.js.map +0 -1
  664. package/dist/chunk-LRICZIGN.js +0 -52
  665. package/dist/chunk-LRICZIGN.js.map +0 -1
  666. package/dist/chunk-MFDTVQJX.js.map +0 -1
  667. package/dist/chunk-N7RWREIQ.js.map +0 -1
  668. package/dist/chunk-O75CRYGF.js.map +0 -1
  669. package/dist/chunk-Q726HSJO.js.map +0 -1
  670. package/dist/chunk-QOIOACIE.js.map +0 -1
  671. package/dist/chunk-SEDEKFYQ.js +0 -1
  672. package/dist/chunk-SO7SV523.js.map +0 -1
  673. package/dist/chunk-TLPZ6MKZ.js.map +0 -1
  674. package/dist/chunk-UGPUYIET.js.map +0 -1
  675. package/src/activity/journal-mode.test.ts +0 -32
  676. package/src/activity/journal-mode.ts +0 -20
  677. /package/dist/{capsule-merge-IPG4IOFP.js.map → capsule-merge-ZCXUPLNJ.js.map} +0 -0
  678. /package/dist/{chunk-CDKHKZL5.js.map → chunk-2524MOWK.js.map} +0 -0
  679. /package/dist/{chunk-7BMXZCOT.js.map → chunk-2AU4D4HQ.js.map} +0 -0
  680. /package/dist/{chunk-LTIZHLV7.js.map → chunk-2JCA2PQT.js.map} +0 -0
  681. /package/dist/{chunk-XXIHX75O.js.map → chunk-2UZ5ZH6W.js.map} +0 -0
  682. /package/dist/{chunk-P3SB5BNT.js.map → chunk-34QW2LK2.js.map} +0 -0
  683. /package/dist/{chunk-EONF76DT.js.map → chunk-36UBSLFN.js.map} +0 -0
  684. /package/dist/{chunk-DBQWVT2H.js.map → chunk-3CBI2ZSA.js.map} +0 -0
  685. /package/dist/{chunk-NZXEK3UF.js.map → chunk-3Q3N35W7.js.map} +0 -0
  686. /package/dist/{chunk-YYGZJPOK.js.map → chunk-42DJ235G.js.map} +0 -0
  687. /package/dist/{chunk-TCUKRAMK.js.map → chunk-4JVQRFZD.js.map} +0 -0
  688. /package/dist/{chunk-PYLL63BF.js.map → chunk-4PB2MBY6.js.map} +0 -0
  689. /package/dist/{chunk-UUQG7HAD.js.map → chunk-4WCNPQQ5.js.map} +0 -0
  690. /package/dist/{chunk-H4VH5VIB.js.map → chunk-5QBDLMGG.js.map} +0 -0
  691. /package/dist/{chunk-RKBLRTNT.js.map → chunk-5SDSVX7N.js.map} +0 -0
  692. /package/dist/{chunk-DGGB65KC.js.map → chunk-5THU7NFP.js.map} +0 -0
  693. /package/dist/{chunk-BPJNF7J2.js.map → chunk-6CCRSQWT.js.map} +0 -0
  694. /package/dist/{chunk-XXE5P6HJ.js.map → chunk-6XYC7NM4.js.map} +0 -0
  695. /package/dist/{chunk-J7HFPA6O.js.map → chunk-6YAIN5XJ.js.map} +0 -0
  696. /package/dist/{chunk-I5DZ3WGR.js.map → chunk-757NP436.js.map} +0 -0
  697. /package/dist/{chunk-E6TDQRF6.js.map → chunk-7J2CGXG3.js.map} +0 -0
  698. /package/dist/{chunk-BUTCAMJM.js.map → chunk-A2YQL2FF.js.map} +0 -0
  699. /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
  700. /package/dist/{chunk-R3HKWWUB.js.map → chunk-A7WOWDZK.js.map} +0 -0
  701. /package/dist/{chunk-6N3TQFZU.js.map → chunk-AIKTQVV3.js.map} +0 -0
  702. /package/dist/{chunk-CGC5UQCF.js.map → chunk-AKE4GGQ3.js.map} +0 -0
  703. /package/dist/{chunk-W27OW7AB.js.map → chunk-APFKZVJS.js.map} +0 -0
  704. /package/dist/{chunk-B325AGLK.js.map → chunk-AQIRQUCP.js.map} +0 -0
  705. /package/dist/{chunk-S7T2TY65.js.map → chunk-AXFR2NQ5.js.map} +0 -0
  706. /package/dist/{chunk-FCSZ4K2X.js.map → chunk-BJJWRWER.js.map} +0 -0
  707. /package/dist/{chunk-JT3EB7ZL.js.map → chunk-BNGHPYZU.js.map} +0 -0
  708. /package/dist/{chunk-N57A4KPV.js.map → chunk-C2BFTYD7.js.map} +0 -0
  709. /package/dist/{chunk-3JVLGJCY.js.map → chunk-C6KRO3SU.js.map} +0 -0
  710. /package/dist/{chunk-X35W4S3L.js.map → chunk-D3IZCN5P.js.map} +0 -0
  711. /package/dist/{chunk-44T3Y7SZ.js.map → chunk-EJIEQOPB.js.map} +0 -0
  712. /package/dist/{chunk-ET356KSB.js.map → chunk-F4TWWUMP.js.map} +0 -0
  713. /package/dist/{chunk-CLLPJ6QT.js.map → chunk-FQXJAC3T.js.map} +0 -0
  714. /package/dist/{chunk-DD5JFCWM.js.map → chunk-GCBIXUPT.js.map} +0 -0
  715. /package/dist/{chunk-N2ZNPHA3.js.map → chunk-IFFLUCCU.js.map} +0 -0
  716. /package/dist/{chunk-PFFZWDPE.js.map → chunk-JZDH2ZZK.js.map} +0 -0
  717. /package/dist/{chunk-TX2UTLXC.js.map → chunk-K6IPSW5B.js.map} +0 -0
  718. /package/dist/{chunk-4MHYKEOM.js.map → chunk-KDJHLOZP.js.map} +0 -0
  719. /package/dist/{chunk-KCB7F4J7.js.map → chunk-KYGOQV37.js.map} +0 -0
  720. /package/dist/{chunk-VZWXFXLX.js.map → chunk-LMCD5W5B.js.map} +0 -0
  721. /package/dist/{chunk-MKD3OMPS.js.map → chunk-M3MYMWXG.js.map} +0 -0
  722. /package/dist/{chunk-PL7FYKHT.js.map → chunk-MMG5K6XJ.js.map} +0 -0
  723. /package/dist/{chunk-VGXM5B4H.js.map → chunk-MNIPH6LD.js.map} +0 -0
  724. /package/dist/{chunk-XU6OEECT.js.map → chunk-OQQXGYMX.js.map} +0 -0
  725. /package/dist/{chunk-LSYDG6MJ.js.map → chunk-PEXW2JCK.js.map} +0 -0
  726. /package/dist/{chunk-MOZXTRC2.js.map → chunk-QF4J3KMV.js.map} +0 -0
  727. /package/dist/{chunk-JGHXXQ2G.js.map → chunk-QLJ6762U.js.map} +0 -0
  728. /package/dist/{chunk-XOVKXJEP.js.map → chunk-R3TLVTWW.js.map} +0 -0
  729. /package/dist/{chunk-CETXNLEX.js.map → chunk-RQO3J4MR.js.map} +0 -0
  730. /package/dist/{chunk-5NANRSCD.js.map → chunk-RR7G2X7C.js.map} +0 -0
  731. /package/dist/{chunk-DCJ3YFIC.js.map → chunk-S2ULTQZR.js.map} +0 -0
  732. /package/dist/{chunk-EQHDH4C2.js.map → chunk-S76KRJDG.js.map} +0 -0
  733. /package/dist/{chunk-EEC4PCG5.js.map → chunk-SZDLX763.js.map} +0 -0
  734. /package/dist/{chunk-E2ZHGBAK.js.map → chunk-T2JSUEH6.js.map} +0 -0
  735. /package/dist/{chunk-JSN44KIB.js.map → chunk-T2YFZ27G.js.map} +0 -0
  736. /package/dist/{chunk-227UFSEQ.js.map → chunk-TFA6HPOA.js.map} +0 -0
  737. /package/dist/{chunk-BA6WOZOT.js.map → chunk-TK4FHQRN.js.map} +0 -0
  738. /package/dist/{chunk-NB5BCFUY.js.map → chunk-TWYTGIBR.js.map} +0 -0
  739. /package/dist/{chunk-MWFGUESQ.js.map → chunk-UEZKN6VR.js.map} +0 -0
  740. /package/dist/{chunk-H5AFCNGA.js.map → chunk-UJX4I26O.js.map} +0 -0
  741. /package/dist/{chunk-PBGVVDLY.js.map → chunk-VIZR45AN.js.map} +0 -0
  742. /package/dist/{chunk-ZG74PWRW.js.map → chunk-VZAKYDMJ.js.map} +0 -0
  743. /package/dist/{chunk-JTH2SE6B.js.map → chunk-W5BLTZZJ.js.map} +0 -0
  744. /package/dist/{chunk-H3TKENU4.js.map → chunk-WIKO4SCR.js.map} +0 -0
  745. /package/dist/{chunk-YFLLGRXO.js.map → chunk-X2QPKLPL.js.map} +0 -0
  746. /package/dist/{chunk-MN3LK3KN.js.map → chunk-X424T5JQ.js.map} +0 -0
  747. /package/dist/{chunk-5BCNEBEN.js.map → chunk-XPJNT6PI.js.map} +0 -0
  748. /package/dist/{chunk-SEDEKFYQ.js.map → chunk-XW2T4QAW.js.map} +0 -0
  749. /package/dist/{chunk-D223ZDQV.js.map → chunk-YEDVOYL2.js.map} +0 -0
  750. /package/dist/{chunk-RC5DXXWC.js.map → chunk-YM7YN37H.js.map} +0 -0
  751. /package/dist/{chunk-VLXBE57O.js.map → chunk-YVGXH72Y.js.map} +0 -0
  752. /package/dist/{chunk-YQAXP5AC.js.map → chunk-YXLUTALO.js.map} +0 -0
  753. /package/dist/{chunk-OQDPBRQ6.js.map → chunk-Z7YDVHDI.js.map} +0 -0
  754. /package/dist/{chunk-XUE46UYW.js.map → chunk-ZLN7AROH.js.map} +0 -0
  755. /package/dist/{chunk-HK32G473.js.map → chunk-ZWEZXVYH.js.map} +0 -0
  756. /package/dist/{contradiction-scan-NOYMFG66.js.map → contradiction-scan-GVD4JJ7B.js.map} +0 -0
  757. /package/dist/{first-start-migration-RC345GPL.js.map → first-start-migration-L3UFX5CU.js.map} +0 -0
  758. /package/dist/{resolution-VKATP2HT.js.map → recall-state-view-admission.js.map} +0 -0
  759. /package/dist/{tier-stats-KA6OZX2C.js.map → tier-stats-VK5PCO2L.js.map} +0 -0
@@ -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
+ }
@@ -1,9 +1,13 @@
1
1
  /**
2
- * Optional AI analysis over deterministic timeline cards (issue #2050 first slice).
3
- *
4
- * Injected provider only. parseConfig, registries, and surfaces wait.
5
- * Failures leave cards unchanged. Disabled makes zero provider calls.
2
+ * Optional evidence-bound AI analysis over deterministic timeline cards
3
+ * (issue #2050). Provider calls arrive through the injected `complete`
4
+ * function; hosts build it from the local/remote seams in analysis-provider.js
5
+ * and the parsed `activity.timeline.analysis` config. Failures leave the
6
+ * cards unchanged and carry a typed failure kind. Disabled makes zero
7
+ * provider calls.
6
8
  */
9
+ import { classifyAnalysisFailure, type AnalysisFailure, type AnalysisFailureKind } from "./analysis-failure.js";
10
+ import { classifyAnalysisProviderError } from "./analysis-provider.js";
7
11
  import { extractJsonCandidates } from "../../json-extract.js";
8
12
  import { log } from "../../logger.js";
9
13
  import { DEFAULT_TIMELINE_CATEGORIES } from "./categories.js";
@@ -55,6 +59,8 @@ export interface TimelineAnalysisResult {
55
59
  provider?: string;
56
60
  model?: string;
57
61
  promptVersion?: number;
62
+ /** Typed failure detail; present only when status is a failure. */
63
+ failure?: AnalysisFailure;
58
64
  }
59
65
 
60
66
  interface AnalysisOp {
@@ -82,6 +88,7 @@ function fail(
82
88
  cards: readonly TimelineCard[],
83
89
  provider: string,
84
90
  model: string,
91
+ kind: AnalysisFailureKind,
85
92
  ): TimelineAnalysisResult {
86
93
  log.info(`timeline analysis status=${status} provider=${provider} model=${model} promptVersion=${TIMELINE_ANALYSIS_PROMPT_VERSION}`);
87
94
  return {
@@ -90,6 +97,7 @@ function fail(
90
97
  provider,
91
98
  model,
92
99
  promptVersion: TIMELINE_ANALYSIS_PROMPT_VERSION,
100
+ failure: classifyAnalysisFailure(kind),
93
101
  };
94
102
  }
95
103
 
@@ -206,32 +214,6 @@ async function callComplete(
206
214
  }
207
215
  }
208
216
 
209
- function parseOps(raw: string): AnalysisOp[] | null {
210
- if (typeof raw !== "string" || raw.trim().length === 0) return null;
211
- for (const candidate of extractJsonCandidates(raw)) {
212
- try {
213
- const parsed: unknown = JSON.parse(candidate);
214
- if (!parsed || typeof parsed !== "object" || Array.isArray(parsed) || !("ops" in parsed)) continue;
215
- const ops = parsed.ops;
216
- if (!Array.isArray(ops)) continue;
217
- const out: AnalysisOp[] = [];
218
- let valid = true;
219
- for (const item of ops) {
220
- const op = asOp(item);
221
- if (!op) {
222
- valid = false;
223
- break;
224
- }
225
- out.push(op);
226
- }
227
- if (valid) return out;
228
- } catch {
229
- continue;
230
- }
231
- }
232
- return null;
233
- }
234
-
235
217
  function asOp(value: unknown): AnalysisOp | null {
236
218
  if (!value || typeof value !== "object" || Array.isArray(value)) return null;
237
219
  if (!("cardId" in value) || typeof value.cardId !== "string" || value.cardId.length === 0) return null;
@@ -262,6 +244,45 @@ function asOp(value: unknown): AnalysisOp | null {
262
244
  };
263
245
  }
264
246
 
247
+ type ParseOpsResult = { ok: true; ops: AnalysisOp[] } | { ok: false; kind: AnalysisFailureKind };
248
+
249
+ /**
250
+ * Parse the provider response. An empty/whitespace body is `partial_output`
251
+ * (nothing came back); a body whose JSON candidates never parse is
252
+ * `malformed_json`; parseable JSON in the wrong shape — missing `ops`, or an
253
+ * op that fails validation — is `invalid_schema`.
254
+ */
255
+ function parseOps(raw: string): ParseOpsResult {
256
+ if (typeof raw !== "string" || raw.trim().length === 0) return { ok: false, kind: "partial_output" };
257
+ let sawParsableShape = false;
258
+ for (const candidate of extractJsonCandidates(raw)) {
259
+ try {
260
+ const parsed: unknown = JSON.parse(candidate);
261
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) continue;
262
+ if (!("ops" in parsed) || !Array.isArray(parsed.ops)) {
263
+ sawParsableShape = true;
264
+ continue;
265
+ }
266
+ const out: AnalysisOp[] = [];
267
+ let valid = true;
268
+ for (const item of parsed.ops) {
269
+ const op = asOp(item);
270
+ if (!op) {
271
+ valid = false;
272
+ break;
273
+ }
274
+ out.push(op);
275
+ }
276
+ if (valid) return { ok: true, ops: out };
277
+ sawParsableShape = true;
278
+ } catch {
279
+ continue;
280
+ }
281
+ }
282
+ if (sawParsableShape) return { ok: false, kind: "invalid_schema" };
283
+ return { ok: false, kind: "malformed_json" };
284
+ }
285
+
265
286
  function knownEvidenceKeys(cards: readonly TimelineCard[], observations: readonly TimelineObservation[]): Set<string> {
266
287
  const keys = new Set<string>();
267
288
  for (const observation of observations) keys.add(evidenceKeyOf(observation));
@@ -320,7 +341,15 @@ export async function analyzeTimelineCards(input: TimelineAnalysisInput): Promis
320
341
  throw new TimelineAnalysisConfigError("timeoutMs must be a positive integer");
321
342
  }
322
343
  if (input.cards.length === 0 && input.observations.length === 0) {
323
- return fail("invalid_output", cards, provider, model);
344
+ // Caller-side guard, not a provider failure: nothing to analyze and zero
345
+ // calls must be made, so no typed response failure is attached.
346
+ return {
347
+ status: "invalid_output",
348
+ cards,
349
+ provider,
350
+ model,
351
+ promptVersion: TIMELINE_ANALYSIS_PROMPT_VERSION,
352
+ };
324
353
  }
325
354
 
326
355
  const categories = input.categories ?? DEFAULT_TIMELINE_CATEGORIES;
@@ -340,16 +369,16 @@ export async function analyzeTimelineCards(input: TimelineAnalysisInput): Promis
340
369
  priorEdits: input.priorEdits,
341
370
  });
342
371
  const raw = await callComplete(complete, prompt, provider, model, timeoutMs, input.signal);
343
- const ops = parseOps(raw);
344
- if (!ops) return fail("invalid_output", cards, provider, model);
345
- for (const op of ops) merged.set(op.cardId, op);
372
+ const parsed = parseOps(raw);
373
+ if (!parsed.ok) return fail("invalid_output", cards, provider, model, parsed.kind);
374
+ for (const op of parsed.ops) merged.set(op.cardId, op);
346
375
  }
347
- } catch {
348
- return fail("provider_failed", cards, provider, model);
376
+ } catch (error) {
377
+ return fail("provider_failed", cards, provider, model, classifyAnalysisProviderError(error));
349
378
  }
350
379
 
351
380
  const applied = applyOps(cards, [...merged.values()], categories, knownEvidenceKeys(cards, ordered));
352
- if (!applied) return fail("invalid_output", cards, provider, model);
381
+ if (!applied) return fail("invalid_output", cards, provider, model, "invalid_schema");
353
382
 
354
383
  log.info(`timeline analysis status=ok provider=${provider} model=${model} promptVersion=${TIMELINE_ANALYSIS_PROMPT_VERSION}`);
355
384
  return {