@remnic/core 9.65.6 → 9.65.8

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 (623) hide show
  1. package/dist/access-admin-ops-surface.d.ts +15 -13
  2. package/dist/access-admin-ops-surface.js +54 -54
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +15 -13
  5. package/dist/access-authorization-probe.js +55 -55
  6. package/dist/access-boundary.d.ts +15 -13
  7. package/dist/access-boundary.js +54 -54
  8. package/dist/access-cli.js +156 -148
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +2 -1
  11. package/dist/access-extraction-force-flush.d.ts +15 -13
  12. package/dist/access-extraction-force-flush.js +54 -54
  13. package/dist/access-health-types.d.ts +2 -1
  14. package/dist/access-http-lcm-compaction.d.ts +15 -13
  15. package/dist/access-http-lifecycle-flush.d.ts +15 -13
  16. package/dist/access-http-offline-stream.d.ts +15 -13
  17. package/dist/access-http-query.d.ts +3 -2
  18. package/dist/access-http-query.js +56 -56
  19. package/dist/access-http.d.ts +17 -20
  20. package/dist/access-http.js +75 -73
  21. package/dist/access-identity-continuity-surface.d.ts +13 -11
  22. package/dist/access-identity-continuity-surface.js +54 -54
  23. package/dist/access-lcm-surface.d.ts +15 -13
  24. package/dist/access-lcm-surface.js +54 -54
  25. package/dist/access-mcp-output-schemas.js +1 -1
  26. package/dist/access-mcp.d.ts +15 -13
  27. package/dist/access-mcp.js +66 -64
  28. package/dist/access-memory-search-fanout.d.ts +3 -2
  29. package/dist/{access-namespace-preflight-D_6mo8ms.d.ts → access-namespace-preflight-CpAOrS-9.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +4 -3
  31. package/dist/access-namespace-preflight.js +54 -54
  32. package/dist/access-observe-write-surface.d.ts +15 -13
  33. package/dist/access-observe-write-surface.js +54 -54
  34. package/dist/access-offline-manifest.d.ts +13 -11
  35. package/dist/access-offline-manifest.js +6 -6
  36. package/dist/access-operations-batch.js +58 -58
  37. package/dist/access-operations.d.ts +21 -19
  38. package/dist/access-operations.js +63 -61
  39. package/dist/access-recall-concurrency.d.ts +15 -13
  40. package/dist/access-recall-concurrency.js +54 -54
  41. package/dist/access-recall-response.d.ts +15 -13
  42. package/dist/access-recall-response.js +54 -54
  43. package/dist/access-recall-surface.d.ts +15 -13
  44. package/dist/access-recall-surface.js +54 -54
  45. package/dist/access-schema.d.ts +83 -83
  46. package/dist/access-schema.js +3 -3
  47. package/dist/{access-service-sbiNS5UB.d.ts → access-service-Diu61Cfv.d.ts} +72 -72
  48. package/dist/access-service-helpers.d.ts +15 -13
  49. package/dist/access-service.d.ts +15 -13
  50. package/dist/access-service.js +54 -54
  51. package/dist/access-surface-catalog.d.ts +15 -13
  52. package/dist/access-surface-catalog.js +66 -56
  53. package/dist/access-surface-catalog.js.map +1 -1
  54. package/dist/access-wearables-meetings-surface.d.ts +6 -3
  55. package/dist/action-confidence.d.ts +2 -1
  56. package/dist/active-context-config.d.ts +27 -0
  57. package/dist/active-context-config.js +14 -0
  58. package/dist/active-context-transform.d.ts +267 -0
  59. package/dist/active-context-transform.js +31 -0
  60. package/dist/active-memory-bridge.d.ts +2 -1
  61. package/dist/active-recall.d.ts +2 -1
  62. package/dist/active-recall.js +13 -12
  63. package/dist/active-recall.js.map +1 -1
  64. package/dist/adapters/index.js +4 -4
  65. package/dist/adapters/registry.js +2 -2
  66. package/dist/ambient-provenance.d.ts +2 -1
  67. package/dist/artifact-search.d.ts +2 -1
  68. package/dist/{auto-sync-XVMLL2RH.js → auto-sync-2YPITIWN.js} +6 -6
  69. package/dist/behavior-learner.d.ts +2 -1
  70. package/dist/behavior-signals.d.ts +2 -1
  71. package/dist/bootstrap.d.ts +13 -11
  72. package/dist/briefing-window.d.ts +5 -2
  73. package/dist/briefing.d.ts +5 -2
  74. package/dist/briefing.js +25 -25
  75. package/dist/buffer-surprise-report.d.ts +2 -1
  76. package/dist/buffer-turn-helpers.d.ts +2 -1
  77. package/dist/buffer.d.ts +5 -2
  78. package/dist/buffer.js +6 -6
  79. package/dist/bulk-import/index.d.ts +4 -3
  80. package/dist/calibration.d.ts +2 -1
  81. package/dist/capabilities.d.ts +2 -1
  82. package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
  83. package/dist/{catalog-DO_7zfkv.d.ts → catalog-9f-vEQLS.d.ts} +1 -1
  84. package/dist/causal-behavior.d.ts +4 -3
  85. package/dist/causal-behavior.js +2 -2
  86. package/dist/causal-chain.js +2 -2
  87. package/dist/causal-consolidation.d.ts +2 -1
  88. package/dist/causal-consolidation.js +28 -28
  89. package/dist/causal-retrieval.js +2 -2
  90. package/dist/causal-trajectory-graph.d.ts +2 -1
  91. package/dist/causal-trajectory-graph.js +2 -2
  92. package/dist/causal-trajectory.js +1 -1
  93. package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
  94. package/dist/{chunk-NZPFCP5A.js → chunk-2PSX5BJU.js} +2 -2
  95. package/dist/{chunk-RKNJBZ55.js → chunk-2QSZNTDO.js} +4 -4
  96. package/dist/{chunk-X2DWBWOX.js → chunk-3A2NJP2U.js} +2 -2
  97. package/dist/chunk-3BCULS4U.js +1093 -0
  98. package/dist/chunk-3BCULS4U.js.map +1 -0
  99. package/dist/{chunk-JGG5HVI2.js → chunk-3PKAS6VL.js} +2 -2
  100. package/dist/{chunk-LSYD7GHZ.js → chunk-3SZD4CYO.js} +3 -3
  101. package/dist/chunk-43HUVDTD.js +114 -0
  102. package/dist/chunk-43HUVDTD.js.map +1 -0
  103. package/dist/{chunk-5TG4MU2U.js → chunk-4F4AQFWL.js} +8 -8
  104. package/dist/{chunk-D35XLYQ7.js → chunk-4QEYREAV.js} +12 -12
  105. package/dist/{chunk-46WM6JX2.js → chunk-4ZWCQJNM.js} +5 -5
  106. package/dist/{chunk-DVYRD4HY.js → chunk-5ACCD4L7.js} +30 -1
  107. package/dist/chunk-5ACCD4L7.js.map +1 -0
  108. package/dist/{chunk-W6J4POB6.js → chunk-5DHKCO52.js} +2 -2
  109. package/dist/{chunk-IRXMJLTW.js → chunk-5HK3CJAR.js} +2 -2
  110. package/dist/{chunk-NLUCDKLT.js → chunk-5RWZH6PH.js} +2 -2
  111. package/dist/{chunk-H7BZBSP6.js → chunk-645WOU5I.js} +4 -4
  112. package/dist/{chunk-AYAZWXJI.js → chunk-76DIF5KT.js} +2 -2
  113. package/dist/{chunk-OPPBTPUU.js → chunk-7KQB4EBS.js} +4 -4
  114. package/dist/{chunk-I2HTKOOP.js → chunk-7VZFRUQU.js} +3 -3
  115. package/dist/{chunk-DPNXADEI.js → chunk-7WOWGRAU.js} +11 -7
  116. package/dist/chunk-7WOWGRAU.js.map +1 -0
  117. package/dist/{chunk-JCWY73FK.js → chunk-AHPIFKNG.js} +2 -2
  118. package/dist/{chunk-FC7TIRFS.js → chunk-AX7UXCHJ.js} +6 -1
  119. package/dist/chunk-AX7UXCHJ.js.map +1 -0
  120. package/dist/{chunk-3I22VWB3.js → chunk-AZMLH5UT.js} +2 -2
  121. package/dist/chunk-B32WYRXX.js +77 -0
  122. package/dist/chunk-B32WYRXX.js.map +1 -0
  123. package/dist/{chunk-JOEJG4SD.js → chunk-BEC4YBNA.js} +4 -4
  124. package/dist/chunk-BWGCOLEL.js +61 -0
  125. package/dist/chunk-BWGCOLEL.js.map +1 -0
  126. package/dist/{chunk-BXXOPKT5.js → chunk-CAMNRAJF.js} +2 -2
  127. package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
  128. package/dist/{chunk-YOXVZJFM.js → chunk-CFVTRUR3.js} +2 -2
  129. package/dist/{chunk-SVSRPG6M.js → chunk-CPA5NBHN.js} +2 -2
  130. package/dist/{chunk-7BEPVIH3.js → chunk-CRML27CO.js} +3 -3
  131. package/dist/{chunk-AXGFOFNY.js → chunk-DA7ITC5Z.js} +2 -2
  132. package/dist/{chunk-5W7MKXMU.js → chunk-DEACDKE3.js} +144 -78
  133. package/dist/chunk-DEACDKE3.js.map +1 -0
  134. package/dist/{chunk-FEO2CDXR.js → chunk-DPCXDG7G.js} +2 -2
  135. package/dist/{chunk-HZNYJN77.js → chunk-F3NVYTTA.js} +2 -2
  136. package/dist/{chunk-7SSRXEZJ.js → chunk-F7XUD3PL.js} +2 -2
  137. package/dist/{chunk-LDBFXD4F.js → chunk-FP7YTTVO.js} +3 -1
  138. package/dist/chunk-FP7YTTVO.js.map +1 -0
  139. package/dist/{chunk-XZBXINXZ.js → chunk-GIC6BASP.js} +4 -4
  140. package/dist/{chunk-PP7R754B.js → chunk-GPFZFCRN.js} +1 -1
  141. package/dist/{chunk-53MZQEBD.js → chunk-GTO56JY5.js} +2 -2
  142. package/dist/{chunk-RAIUTAZZ.js → chunk-H2YSH3DG.js} +2 -2
  143. package/dist/{chunk-HWVNYNIV.js → chunk-HMZKGHMD.js} +2 -2
  144. package/dist/{chunk-ZXUZ54Z5.js → chunk-HRHO3ZNG.js} +2 -2
  145. package/dist/{chunk-SDEPLF7V.js → chunk-IBJ6U753.js} +2 -2
  146. package/dist/chunk-JCCWJHOP.js +240 -0
  147. package/dist/chunk-JCCWJHOP.js.map +1 -0
  148. package/dist/{chunk-T3JQTCCO.js → chunk-JI7U6AS3.js} +4 -4
  149. package/dist/{chunk-TR7DGXGI.js → chunk-JOZUBF4A.js} +5 -5
  150. package/dist/{chunk-YWBOOBDP.js → chunk-JYSN42VN.js} +71 -71
  151. package/dist/{chunk-ZPUIRTIZ.js → chunk-KOLJJN5G.js} +12 -75
  152. package/dist/chunk-KOLJJN5G.js.map +1 -0
  153. package/dist/{chunk-5W7CTZ2E.js → chunk-KQAFEZQX.js} +4 -4
  154. package/dist/{chunk-D2YNNDML.js → chunk-KWIGDKM2.js} +2 -2
  155. package/dist/{chunk-YUTTMSC7.js → chunk-KZIF6XHX.js} +93 -30
  156. package/dist/chunk-KZIF6XHX.js.map +1 -0
  157. package/dist/chunk-LB7WCZHY.js +553 -0
  158. package/dist/chunk-LB7WCZHY.js.map +1 -0
  159. package/dist/{chunk-RIAM7DND.js → chunk-LDKPDODJ.js} +2 -2
  160. package/dist/{chunk-227UFSEQ.js → chunk-LEPOP46W.js} +4 -4
  161. package/dist/{chunk-2JHRCWHT.js → chunk-LKYIOCWL.js} +107 -107
  162. package/dist/{chunk-XAWIL7TC.js → chunk-LOXHYCVS.js} +2 -2
  163. package/dist/{chunk-OMZLBT4B.js → chunk-LPNCR4QK.js} +48 -27
  164. package/dist/chunk-LPNCR4QK.js.map +1 -0
  165. package/dist/{chunk-OLBZ2WGG.js → chunk-LTBKKSCX.js} +2 -2
  166. package/dist/{chunk-O4BAGJDN.js → chunk-MDD2RINF.js} +2 -2
  167. package/dist/{chunk-H63EDPFJ.js → chunk-MI2OTWV5.js} +15 -2
  168. package/dist/{chunk-H63EDPFJ.js.map → chunk-MI2OTWV5.js.map} +1 -1
  169. package/dist/{chunk-LBFFNDFM.js → chunk-MINHJ55X.js} +1 -1
  170. package/dist/chunk-MINHJ55X.js.map +1 -0
  171. package/dist/{chunk-ROEAEANL.js → chunk-MY2BC6UE.js} +15 -15
  172. package/dist/{chunk-RACZB5HT.js → chunk-N37X5RU7.js} +4 -4
  173. package/dist/{chunk-AG46P24C.js → chunk-NNBZS3DY.js} +4 -4
  174. package/dist/{chunk-PGW64IFQ.js → chunk-NPFUNWNX.js} +2 -2
  175. package/dist/{chunk-MFOSZUIT.js → chunk-NPIBN2VL.js} +2 -2
  176. package/dist/{chunk-IF4EY26E.js → chunk-OA2O2GJ4.js} +3 -3
  177. package/dist/{chunk-6FUMA6AA.js → chunk-ODU2CNNX.js} +2 -2
  178. package/dist/{chunk-PNAGNVGK.js → chunk-OXRRJXPR.js} +42 -37
  179. package/dist/chunk-OXRRJXPR.js.map +1 -0
  180. package/dist/{chunk-TWBQQ3FT.js → chunk-P36Z4JRA.js} +2 -2
  181. package/dist/{chunk-OUKBMQ2O.js → chunk-PD66CVSD.js} +2 -2
  182. package/dist/{chunk-MVIYRRVJ.js → chunk-PMVPCZJZ.js} +5 -5
  183. package/dist/{chunk-US4IRASK.js → chunk-PU56CXZA.js} +6 -6
  184. package/dist/{chunk-IDQ6DKXC.js → chunk-S5XOSTYM.js} +3 -3
  185. package/dist/{chunk-DYO24BNB.js → chunk-SEEJOGQX.js} +5 -5
  186. package/dist/{chunk-7OZSHBWK.js → chunk-SNOIKAHM.js} +2 -2
  187. package/dist/{chunk-SR7JIRAR.js → chunk-T6ILXUAH.js} +2 -2
  188. package/dist/{chunk-2RXUZVPU.js → chunk-T7XP6IZE.js} +2 -2
  189. package/dist/{chunk-KBOG7FJV.js → chunk-TFR3HG4K.js} +3 -3
  190. package/dist/{chunk-XUZ5CIEE.js → chunk-TUHBYJXL.js} +1 -1
  191. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  192. package/dist/{chunk-ZK4BFABK.js → chunk-U7EW2W4W.js} +13 -13
  193. package/dist/{chunk-4K7IW3F7.js → chunk-UD7UNYRD.js} +34 -3
  194. package/dist/chunk-UD7UNYRD.js.map +1 -0
  195. package/dist/{chunk-VFYRYFLL.js → chunk-UEBDCMOO.js} +2 -2
  196. package/dist/{chunk-JFWZRUKP.js → chunk-UENKPWCS.js} +4 -4
  197. package/dist/{chunk-AAXJNINV.js → chunk-UL4MKZHI.js} +2 -2
  198. package/dist/chunk-ULM7JCDH.js +154 -0
  199. package/dist/chunk-ULM7JCDH.js.map +1 -0
  200. package/dist/{chunk-R2MZCYA6.js → chunk-UNUMFURP.js} +3 -3
  201. package/dist/{chunk-5GIZM4RX.js → chunk-UPFNQJC7.js} +2 -2
  202. package/dist/{chunk-W4BMEGQA.js → chunk-UTQUEHC7.js} +2 -2
  203. package/dist/{chunk-I32NKXE2.js → chunk-V4IDF3EZ.js} +2 -2
  204. package/dist/{chunk-6LS5OX3U.js → chunk-W2BAGGEW.js} +50 -18
  205. package/dist/chunk-W2BAGGEW.js.map +1 -0
  206. package/dist/chunk-W2UOAATB.js +521 -0
  207. package/dist/chunk-W2UOAATB.js.map +1 -0
  208. package/dist/{chunk-QMZY3GG6.js → chunk-WNXYT4MK.js} +3 -3
  209. package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
  210. package/dist/{chunk-T42L3S6A.js → chunk-XBGHAAKR.js} +2 -2
  211. package/dist/{chunk-RQ2EQRRR.js → chunk-XNWXSGHS.js} +80 -7
  212. package/dist/chunk-XNWXSGHS.js.map +1 -0
  213. package/dist/{chunk-THG4GYIE.js → chunk-YEUXERJ6.js} +5 -5
  214. package/dist/{chunk-BIJAWZYW.js → chunk-YMOPYG3K.js} +6 -6
  215. package/dist/{chunk-M4AHBM72.js → chunk-Z3YEGSR4.js} +2 -2
  216. package/dist/{cli-Bfgo0n1L.d.ts → cli-O3F-ht3i.d.ts} +5 -5
  217. package/dist/cli.d.ts +17 -15
  218. package/dist/cli.js +106 -104
  219. package/dist/coding/pre-action-gate.d.ts +2 -1
  220. package/dist/coding/pre-action-gate.js +2 -2
  221. package/dist/compounding/engine.d.ts +5 -2
  222. package/dist/compounding/engine.js +26 -26
  223. package/dist/compounding/preference-consolidator.d.ts +4 -3
  224. package/dist/compression-optimizer.d.ts +2 -1
  225. package/dist/config-security.js +2 -2
  226. package/dist/config.d.ts +2 -1
  227. package/dist/config.js +13 -12
  228. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  229. package/dist/connectors/codex-materialize-runner.js +25 -25
  230. package/dist/connectors/codex-materialize.d.ts +2 -1
  231. package/dist/connectors/index.d.ts +2 -1
  232. package/dist/connectors/index.js +25 -25
  233. package/dist/consolidation-provenance-check.d.ts +5 -2
  234. package/dist/consolidation-provenance-check.js +2 -2
  235. package/dist/consolidation-undo.d.ts +5 -2
  236. package/dist/context-summary.d.ts +43 -0
  237. package/dist/context-summary.js +14 -0
  238. package/dist/context-summary.js.map +1 -0
  239. package/dist/contradiction/index.d.ts +6 -3
  240. package/dist/contradiction/index.js +5 -5
  241. package/dist/converge-config.d.ts +2 -1
  242. package/dist/convergence-refresh.d.ts +5 -2
  243. package/dist/convergence-refresh.js +28 -28
  244. package/dist/conversation-index/backend.d.ts +2 -1
  245. package/dist/conversation-index/backend.js +2 -2
  246. package/dist/conversation-index/chunker.d.ts +2 -1
  247. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  248. package/dist/conversation-index/indexer.d.ts +2 -1
  249. package/dist/conversation-index/search.d.ts +2 -1
  250. package/dist/corpus-watermark.d.ts +2 -1
  251. package/dist/corpus-watermark.js +27 -27
  252. package/dist/cross-lingual-recall.d.ts +2 -1
  253. package/dist/day-summary.d.ts +2 -1
  254. package/dist/delinearize.d.ts +2 -1
  255. package/dist/dependency-propagation-config.d.ts +2 -1
  256. package/dist/{dependency-propagation-delivery-D23_x-s5.d.ts → dependency-propagation-delivery-CL6RWXTA.d.ts} +1 -1
  257. package/dist/direct-answer-wiring.d.ts +2 -1
  258. package/dist/direct-answer.d.ts +2 -1
  259. package/dist/embedding-fallback.d.ts +2 -1
  260. package/dist/enrichment/index.d.ts +2 -1
  261. package/dist/entity-origin-fields.d.ts +2 -1
  262. package/dist/entity-retrieval.d.ts +5 -2
  263. package/dist/entity-retrieval.js +26 -26
  264. package/dist/entity-schema.d.ts +2 -1
  265. package/dist/episodic-context.d.ts +2 -1
  266. package/dist/eval-trajectory-contracts.d.ts +257 -0
  267. package/dist/eval-trajectory-contracts.js +56 -0
  268. package/dist/eval-trajectory-contracts.js.map +1 -0
  269. package/dist/eval-trajectory-store.d.ts +40 -0
  270. package/dist/eval-trajectory-store.js +19 -0
  271. package/dist/eval-trajectory-store.js.map +1 -0
  272. package/dist/eval-trajectory.d.ts +68 -0
  273. package/dist/eval-trajectory.js +46 -0
  274. package/dist/eval-trajectory.js.map +1 -0
  275. package/dist/event-order-recall.js +2 -2
  276. package/dist/explicit-capture.d.ts +13 -11
  277. package/dist/explicit-capture.js +6 -6
  278. package/dist/external-wiki-access.d.ts +15 -13
  279. package/dist/external-wiki-access.js +55 -55
  280. package/dist/external-wiki-collection-registration.d.ts +2 -1
  281. package/dist/external-wiki-collection.d.ts +2 -1
  282. package/dist/external-wiki-mcp-tools.d.ts +15 -13
  283. package/dist/extraction-error-classification.d.ts +2 -1
  284. package/dist/extraction-faithfulness.d.ts +2 -1
  285. package/dist/extraction-judge-telemetry.d.ts +2 -1
  286. package/dist/extraction-judge-training.d.ts +2 -1
  287. package/dist/extraction-judge.d.ts +2 -1
  288. package/dist/extraction-liveness.d.ts +2 -1
  289. package/dist/extraction-normalization.d.ts +2 -1
  290. package/dist/extraction-prompt.d.ts +2 -1
  291. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  292. package/dist/extraction-source-grounding.d.ts +2 -1
  293. package/dist/extraction.d.ts +2 -1
  294. package/dist/extraction.js +33 -33
  295. package/dist/fallback-llm.d.ts +2 -1
  296. package/dist/{forget-SZ2BXDGF.js → forget-2AE4MDK3.js} +3 -3
  297. package/dist/graph-dashboard-diff.d.ts +2 -1
  298. package/dist/graph-dashboard-key.d.ts +2 -1
  299. package/dist/graph-dashboard-parser.d.ts +2 -1
  300. package/dist/{graph-edge-decay-FXGELBFA.js → graph-edge-decay-A4SDFMMS.js} +4 -4
  301. package/dist/graph-edge-decay-A4SDFMMS.js.map +1 -0
  302. package/dist/graph-edge-reinforcement.d.ts +2 -1
  303. package/dist/graph-path-reconstruction.d.ts +2 -1
  304. package/dist/graph-path-scoring.d.ts +2 -1
  305. package/dist/graph-snapshot.d.ts +2 -1
  306. package/dist/graph-snapshot.js +3 -3
  307. package/dist/graph.d.ts +2 -1
  308. package/dist/graph.js +3 -3
  309. package/dist/harmonic-retrieval.js +1 -1
  310. package/dist/importance.d.ts +2 -1
  311. package/dist/importers/index.d.ts +2 -1
  312. package/dist/in-flight-reads.d.ts +2 -1
  313. package/dist/{index--QhGIXF2.d.ts → index-C7Xep6S9.d.ts} +2 -2
  314. package/dist/index.d.ts +706 -701
  315. package/dist/index.js +271 -200
  316. package/dist/intent.d.ts +2 -1
  317. package/dist/lcm/engine.d.ts +3 -2
  318. package/dist/lcm/engine.js +3 -2
  319. package/dist/lcm/index.d.ts +4 -2
  320. package/dist/lcm/index.js +6 -5
  321. package/dist/lcm/summarizer.d.ts +4 -6
  322. package/dist/lcm/summarizer.js +2 -1
  323. package/dist/lcm/tools.d.ts +4 -3
  324. package/dist/lifecycle.d.ts +2 -1
  325. package/dist/live-connectors-runner.d.ts +2 -1
  326. package/dist/local-llm.d.ts +2 -1
  327. package/dist/local-model-endpoint.d.ts +2 -1
  328. package/dist/location/index.d.ts +128 -1
  329. package/dist/location/index.js +60 -750
  330. package/dist/location/index.js.map +1 -1
  331. package/dist/maintenance/memory-governance.d.ts +2 -1
  332. package/dist/maintenance/memory-governance.js +26 -26
  333. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +5 -2
  334. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +25 -25
  335. package/dist/maintenance/rebuild-memory-projection.d.ts +5 -2
  336. package/dist/maintenance/rebuild-memory-projection.js +27 -27
  337. package/dist/{maintenance-PFvY1Pw_.d.ts → maintenance-CJ-xqFp0.d.ts} +4 -3
  338. package/dist/mcp-memory-inspector-app.d.ts +15 -13
  339. package/dist/mcp-read-only-tools.js +1 -1
  340. package/dist/memory-action-policy.d.ts +18 -2
  341. package/dist/memory-action-policy.js +3 -1
  342. package/dist/memory-cache.d.ts +2 -1
  343. package/dist/memory-controller.d.ts +2 -1
  344. package/dist/memory-controller.js +2 -2
  345. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  346. package/dist/memory-projection-store.d.ts +2 -1
  347. package/dist/memory-provenance.d.ts +2 -1
  348. package/dist/memory-snapshot.d.ts +2 -1
  349. package/dist/memory-subject-cli.d.ts +15 -13
  350. package/dist/memory-subject.d.ts +15 -13
  351. package/dist/memory-subject.js +3 -3
  352. package/dist/memory-worth-outcomes.d.ts +50 -3
  353. package/dist/memory-worth-outcomes.js +5 -3
  354. package/dist/models-json.d.ts +2 -1
  355. package/dist/namespaces/migrate.d.ts +6 -3
  356. package/dist/namespaces/migrate.js +26 -26
  357. package/dist/namespaces/principal.d.ts +2 -1
  358. package/dist/namespaces/search.d.ts +2 -1
  359. package/dist/namespaces/search.js +11 -11
  360. package/dist/namespaces/storage.d.ts +6 -3
  361. package/dist/namespaces/storage.js +25 -25
  362. package/dist/native-knowledge.d.ts +2 -1
  363. package/dist/offline-sync-impression-drain.d.ts +2 -1
  364. package/dist/offline-sync-impression-drain.js +2 -2
  365. package/dist/operator-doctor-corpus.d.ts +2 -1
  366. package/dist/operator-doctor-corpus.js +28 -28
  367. package/dist/operator-doctor-replica.d.ts +2 -1
  368. package/dist/operator-toolkit.d.ts +6 -3
  369. package/dist/operator-toolkit.js +45 -44
  370. package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -2
  371. package/dist/orchestration/maintenance.d.ts +7 -4
  372. package/dist/orchestration/maintenance.js +34 -32
  373. package/dist/{orchestrator-4wzJrPVm.d.ts → orchestrator-BsntWxLy.d.ts} +8 -8
  374. package/dist/orchestrator.d.ts +13 -11
  375. package/dist/orchestrator.js +156 -148
  376. package/dist/patterns-cli.d.ts +2 -1
  377. package/dist/{pipeline-CgXgdIrF.d.ts → pipeline-CVoysPm2.d.ts} +1 -1
  378. package/dist/policy-runtime.d.ts +2 -1
  379. package/dist/proactive-contention.d.ts +2 -1
  380. package/dist/provenance.d.ts +2 -1
  381. package/dist/{public-http-BP3VQDl5.d.ts → public-http-CuOxlTC2.d.ts} +1 -1
  382. package/dist/{qmd-BppGGxsi.d.ts → qmd-DWMAGA5l.d.ts} +1 -1
  383. package/dist/qmd-preflight.d.ts +3 -2
  384. package/dist/qmd-recall-cache.d.ts +2 -1
  385. package/dist/qmd.d.ts +3 -2
  386. package/dist/qmd.js +4 -4
  387. package/dist/recall-concurrency-config.d.ts +2 -1
  388. package/dist/recall-disclosure-escalation.d.ts +2 -1
  389. package/dist/recall-explain-renderer.d.ts +2 -1
  390. package/dist/recall-explain-renderer.js +3 -3
  391. package/dist/recall-memory-map.d.ts +2 -1
  392. package/dist/recall-planner-llm.d.ts +2 -1
  393. package/dist/recall-state.d.ts +2 -1
  394. package/dist/recall-tag-filter.d.ts +2 -1
  395. package/dist/recall-timings.d.ts +2 -1
  396. package/dist/recall-xray-cli.d.ts +2 -1
  397. package/dist/recall-xray-cli.js +4 -4
  398. package/dist/recall-xray-renderer.d.ts +2 -1
  399. package/dist/recall-xray-renderer.js +3 -3
  400. package/dist/recall-xray.d.ts +2 -1
  401. package/dist/recall-xray.js +2 -2
  402. package/dist/reconcile/cursor.d.ts +2 -1
  403. package/dist/reconcile/manifest.d.ts +2 -1
  404. package/dist/reconcile/manifest.js +3 -3
  405. package/dist/reconcile/plan.d.ts +2 -1
  406. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  407. package/dist/replay/normalizers/claude.d.ts +2 -1
  408. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  409. package/dist/replay/normalizers/shared.d.ts +2 -1
  410. package/dist/replay/runner.d.ts +2 -1
  411. package/dist/replay/types.d.ts +2 -1
  412. package/dist/replica-divergence.d.ts +2 -1
  413. package/dist/replica-peers-config.d.ts +2 -1
  414. package/dist/{resolution-4552BNRV.js → resolution-XWBPKYFB.js} +6 -6
  415. package/dist/resolution-XWBPKYFB.js.map +1 -0
  416. package/dist/resolve-auth-token.d.ts +2 -1
  417. package/dist/resume-bundles.js +14 -13
  418. package/dist/retrieval-agents.d.ts +3 -2
  419. package/dist/retrieval-tiers.d.ts +2 -1
  420. package/dist/routing/engine.d.ts +2 -1
  421. package/dist/routing/store.d.ts +2 -1
  422. package/dist/salvage-envelope.d.ts +2 -1
  423. package/dist/salvage-envelope.js +5 -5
  424. package/dist/schemas.d.ts +124 -124
  425. package/dist/{scope-profiles-ChZUtxDU.d.ts → scope-profiles-CPWkW_dI.d.ts} +1 -1
  426. package/dist/search/embed-helper.d.ts +2 -1
  427. package/dist/search/factory.d.ts +2 -1
  428. package/dist/search/factory.js +10 -10
  429. package/dist/search/index.d.ts +2 -1
  430. package/dist/search/index.js +15 -15
  431. package/dist/search/lancedb-backend.d.ts +2 -1
  432. package/dist/search/lancedb-backend.js +2 -2
  433. package/dist/search/meilisearch-backend.d.ts +2 -1
  434. package/dist/search/meilisearch-backend.js +2 -2
  435. package/dist/search/noop-backend.d.ts +2 -1
  436. package/dist/search/orama-backend.d.ts +2 -1
  437. package/dist/search/orama-backend.js +2 -2
  438. package/dist/search/port.d.ts +2 -1
  439. package/dist/search/remote-backend.d.ts +2 -1
  440. package/dist/{semantic-consolidation-mSPwQSmF.d.ts → semantic-consolidation-CNFVBXFc.d.ts} +1 -1
  441. package/dist/semantic-consolidation.d.ts +3 -2
  442. package/dist/semantic-consolidation.js +31 -31
  443. package/dist/semantic-rule-promotion.js +25 -25
  444. package/dist/semantic-rule-verifier.d.ts +2 -1
  445. package/dist/semantic-rule-verifier.js +25 -25
  446. package/dist/{service-BICWLwSP.d.ts → service-Bb-JIdQ0.d.ts} +2 -2
  447. package/dist/session-observer-bands.d.ts +2 -1
  448. package/dist/session-observer-state.d.ts +2 -1
  449. package/dist/shared-context/manager.d.ts +8 -7
  450. package/dist/signal.d.ts +2 -1
  451. package/dist/source-agent-qualifier.d.ts +2 -1
  452. package/dist/source-agent-qualifier.js +29 -29
  453. package/dist/{storage-B7urx1K3.d.ts → storage-CukrlNKk.d.ts} +4 -1
  454. package/dist/storage.d.ts +5 -2
  455. package/dist/storage.js +24 -24
  456. package/dist/subject-config.d.ts +2 -1
  457. package/dist/subject-config.js +4 -4
  458. package/dist/summarizer.d.ts +2 -1
  459. package/dist/summary-snapshot.d.ts +2 -1
  460. package/dist/support-passport/index.d.ts +18 -16
  461. package/dist/support-passport/index.js +57 -57
  462. package/dist/temporal-supersession.d.ts +3 -2
  463. package/dist/temporal-timeline-recall.d.ts +2 -1
  464. package/dist/temporal-validity.d.ts +2 -1
  465. package/dist/threading.d.ts +2 -1
  466. package/dist/tier-migration.d.ts +5 -2
  467. package/dist/tier-routing.d.ts +2 -1
  468. package/dist/topics.d.ts +2 -1
  469. package/dist/transcript.d.ts +2 -1
  470. package/dist/transfer/backup.js +2 -2
  471. package/dist/transfer/capsule-export.js +2 -2
  472. package/dist/transfer/capsule-import.js +2 -2
  473. package/dist/transfer/types.d.ts +78 -78
  474. package/dist/trust-score-stage.d.ts +2 -1
  475. package/dist/trust-score.d.ts +2 -1
  476. package/dist/{types-ETU5N6nB.d.ts → types-djxQlxJ7.d.ts} +3 -2
  477. package/dist/types.d.ts +2 -1
  478. package/dist/types.js +1 -1
  479. package/dist/utility-runtime.d.ts +2 -1
  480. package/dist/verified-recall.js +25 -25
  481. package/dist/who-knows-cli.d.ts +15 -13
  482. package/dist/who-knows-cli.js +26 -26
  483. package/dist/who-knows.d.ts +15 -13
  484. package/dist/who-knows.js +25 -25
  485. package/dist/write-envelope.d.ts +2 -1
  486. package/dist/write-envelope.js +4 -4
  487. package/package.json +22 -2
  488. package/src/access-boundary.ts +5 -0
  489. package/src/access-http.ts +15 -16
  490. package/src/access-mcp-output-schemas.ts +5 -0
  491. package/src/access-mcp.ts +6 -6
  492. package/src/access-operations.ts +2 -0
  493. package/src/access-surface-catalog.ts +10 -0
  494. package/src/active-context-config.ts +98 -0
  495. package/src/active-context-transform.test.ts +533 -0
  496. package/src/active-context-transform.ts +981 -0
  497. package/src/config.ts +3 -5
  498. package/src/context-summary.ts +182 -0
  499. package/src/eval-trajectory-contracts.ts +411 -0
  500. package/src/eval-trajectory-store.ts +306 -0
  501. package/src/eval-trajectory.test.ts +534 -0
  502. package/src/eval-trajectory.ts +773 -0
  503. package/src/index.ts +6 -11
  504. package/src/lcm/summarizer.ts +14 -93
  505. package/src/location/access-operations.ts +84 -0
  506. package/src/location/http-glue.test.ts +100 -0
  507. package/src/location/http-glue.ts +85 -0
  508. package/src/location/index.ts +3 -0
  509. package/src/location/mcp-tools.ts +82 -0
  510. package/src/location/provider-setup.test.ts +106 -0
  511. package/src/location/provider-setup.ts +103 -0
  512. package/src/location/scheduler.test.ts +113 -0
  513. package/src/location/scheduler.ts +98 -0
  514. package/src/location/surfaces.test.ts +241 -0
  515. package/src/location/surfaces.ts +329 -0
  516. package/src/maintenance/day-summary-cron.ts +45 -0
  517. package/src/mcp-read-only-tools.ts +2 -0
  518. package/src/memory-action-policy.ts +28 -0
  519. package/src/memory-worth-outcomes.test.ts +53 -18
  520. package/src/memory-worth-outcomes.ts +91 -9
  521. package/src/orchestration/maintenance.ts +22 -30
  522. package/src/storage/context-transform-ledger.ts +39 -0
  523. package/src/storage/secure-line-reader.ts +50 -1
  524. package/src/storage.ts +4 -1
  525. package/src/types.ts +2 -3
  526. package/src/wearables/http-glue.ts +28 -0
  527. package/dist/chunk-4K7IW3F7.js.map +0 -1
  528. package/dist/chunk-5W7MKXMU.js.map +0 -1
  529. package/dist/chunk-6LS5OX3U.js.map +0 -1
  530. package/dist/chunk-DPNXADEI.js.map +0 -1
  531. package/dist/chunk-DVYRD4HY.js.map +0 -1
  532. package/dist/chunk-FC7TIRFS.js.map +0 -1
  533. package/dist/chunk-LBFFNDFM.js.map +0 -1
  534. package/dist/chunk-LDBFXD4F.js.map +0 -1
  535. package/dist/chunk-OMZLBT4B.js.map +0 -1
  536. package/dist/chunk-PNAGNVGK.js.map +0 -1
  537. package/dist/chunk-RQ2EQRRR.js.map +0 -1
  538. package/dist/chunk-YUTTMSC7.js.map +0 -1
  539. package/dist/chunk-ZPUIRTIZ.js.map +0 -1
  540. /package/dist/{capsule-crypto-GWVG7LGC.js.map → active-context-config.js.map} +0 -0
  541. /package/dist/{graph-edge-decay-FXGELBFA.js.map → active-context-transform.js.map} +0 -0
  542. /package/dist/{auto-sync-XVMLL2RH.js.map → auto-sync-2YPITIWN.js.map} +0 -0
  543. /package/dist/{resolution-4552BNRV.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  544. /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
  545. /package/dist/{chunk-NZPFCP5A.js.map → chunk-2PSX5BJU.js.map} +0 -0
  546. /package/dist/{chunk-RKNJBZ55.js.map → chunk-2QSZNTDO.js.map} +0 -0
  547. /package/dist/{chunk-X2DWBWOX.js.map → chunk-3A2NJP2U.js.map} +0 -0
  548. /package/dist/{chunk-JGG5HVI2.js.map → chunk-3PKAS6VL.js.map} +0 -0
  549. /package/dist/{chunk-LSYD7GHZ.js.map → chunk-3SZD4CYO.js.map} +0 -0
  550. /package/dist/{chunk-5TG4MU2U.js.map → chunk-4F4AQFWL.js.map} +0 -0
  551. /package/dist/{chunk-D35XLYQ7.js.map → chunk-4QEYREAV.js.map} +0 -0
  552. /package/dist/{chunk-46WM6JX2.js.map → chunk-4ZWCQJNM.js.map} +0 -0
  553. /package/dist/{chunk-W6J4POB6.js.map → chunk-5DHKCO52.js.map} +0 -0
  554. /package/dist/{chunk-IRXMJLTW.js.map → chunk-5HK3CJAR.js.map} +0 -0
  555. /package/dist/{chunk-NLUCDKLT.js.map → chunk-5RWZH6PH.js.map} +0 -0
  556. /package/dist/{chunk-H7BZBSP6.js.map → chunk-645WOU5I.js.map} +0 -0
  557. /package/dist/{chunk-AYAZWXJI.js.map → chunk-76DIF5KT.js.map} +0 -0
  558. /package/dist/{chunk-OPPBTPUU.js.map → chunk-7KQB4EBS.js.map} +0 -0
  559. /package/dist/{chunk-I2HTKOOP.js.map → chunk-7VZFRUQU.js.map} +0 -0
  560. /package/dist/{chunk-JCWY73FK.js.map → chunk-AHPIFKNG.js.map} +0 -0
  561. /package/dist/{chunk-3I22VWB3.js.map → chunk-AZMLH5UT.js.map} +0 -0
  562. /package/dist/{chunk-JOEJG4SD.js.map → chunk-BEC4YBNA.js.map} +0 -0
  563. /package/dist/{chunk-BXXOPKT5.js.map → chunk-CAMNRAJF.js.map} +0 -0
  564. /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
  565. /package/dist/{chunk-YOXVZJFM.js.map → chunk-CFVTRUR3.js.map} +0 -0
  566. /package/dist/{chunk-SVSRPG6M.js.map → chunk-CPA5NBHN.js.map} +0 -0
  567. /package/dist/{chunk-7BEPVIH3.js.map → chunk-CRML27CO.js.map} +0 -0
  568. /package/dist/{chunk-AXGFOFNY.js.map → chunk-DA7ITC5Z.js.map} +0 -0
  569. /package/dist/{chunk-FEO2CDXR.js.map → chunk-DPCXDG7G.js.map} +0 -0
  570. /package/dist/{chunk-HZNYJN77.js.map → chunk-F3NVYTTA.js.map} +0 -0
  571. /package/dist/{chunk-7SSRXEZJ.js.map → chunk-F7XUD3PL.js.map} +0 -0
  572. /package/dist/{chunk-XZBXINXZ.js.map → chunk-GIC6BASP.js.map} +0 -0
  573. /package/dist/{chunk-PP7R754B.js.map → chunk-GPFZFCRN.js.map} +0 -0
  574. /package/dist/{chunk-53MZQEBD.js.map → chunk-GTO56JY5.js.map} +0 -0
  575. /package/dist/{chunk-RAIUTAZZ.js.map → chunk-H2YSH3DG.js.map} +0 -0
  576. /package/dist/{chunk-HWVNYNIV.js.map → chunk-HMZKGHMD.js.map} +0 -0
  577. /package/dist/{chunk-ZXUZ54Z5.js.map → chunk-HRHO3ZNG.js.map} +0 -0
  578. /package/dist/{chunk-SDEPLF7V.js.map → chunk-IBJ6U753.js.map} +0 -0
  579. /package/dist/{chunk-T3JQTCCO.js.map → chunk-JI7U6AS3.js.map} +0 -0
  580. /package/dist/{chunk-TR7DGXGI.js.map → chunk-JOZUBF4A.js.map} +0 -0
  581. /package/dist/{chunk-YWBOOBDP.js.map → chunk-JYSN42VN.js.map} +0 -0
  582. /package/dist/{chunk-5W7CTZ2E.js.map → chunk-KQAFEZQX.js.map} +0 -0
  583. /package/dist/{chunk-D2YNNDML.js.map → chunk-KWIGDKM2.js.map} +0 -0
  584. /package/dist/{chunk-RIAM7DND.js.map → chunk-LDKPDODJ.js.map} +0 -0
  585. /package/dist/{chunk-227UFSEQ.js.map → chunk-LEPOP46W.js.map} +0 -0
  586. /package/dist/{chunk-2JHRCWHT.js.map → chunk-LKYIOCWL.js.map} +0 -0
  587. /package/dist/{chunk-XAWIL7TC.js.map → chunk-LOXHYCVS.js.map} +0 -0
  588. /package/dist/{chunk-OLBZ2WGG.js.map → chunk-LTBKKSCX.js.map} +0 -0
  589. /package/dist/{chunk-O4BAGJDN.js.map → chunk-MDD2RINF.js.map} +0 -0
  590. /package/dist/{chunk-ROEAEANL.js.map → chunk-MY2BC6UE.js.map} +0 -0
  591. /package/dist/{chunk-RACZB5HT.js.map → chunk-N37X5RU7.js.map} +0 -0
  592. /package/dist/{chunk-AG46P24C.js.map → chunk-NNBZS3DY.js.map} +0 -0
  593. /package/dist/{chunk-PGW64IFQ.js.map → chunk-NPFUNWNX.js.map} +0 -0
  594. /package/dist/{chunk-MFOSZUIT.js.map → chunk-NPIBN2VL.js.map} +0 -0
  595. /package/dist/{chunk-IF4EY26E.js.map → chunk-OA2O2GJ4.js.map} +0 -0
  596. /package/dist/{chunk-6FUMA6AA.js.map → chunk-ODU2CNNX.js.map} +0 -0
  597. /package/dist/{chunk-TWBQQ3FT.js.map → chunk-P36Z4JRA.js.map} +0 -0
  598. /package/dist/{chunk-OUKBMQ2O.js.map → chunk-PD66CVSD.js.map} +0 -0
  599. /package/dist/{chunk-MVIYRRVJ.js.map → chunk-PMVPCZJZ.js.map} +0 -0
  600. /package/dist/{chunk-US4IRASK.js.map → chunk-PU56CXZA.js.map} +0 -0
  601. /package/dist/{chunk-IDQ6DKXC.js.map → chunk-S5XOSTYM.js.map} +0 -0
  602. /package/dist/{chunk-DYO24BNB.js.map → chunk-SEEJOGQX.js.map} +0 -0
  603. /package/dist/{chunk-7OZSHBWK.js.map → chunk-SNOIKAHM.js.map} +0 -0
  604. /package/dist/{chunk-SR7JIRAR.js.map → chunk-T6ILXUAH.js.map} +0 -0
  605. /package/dist/{chunk-2RXUZVPU.js.map → chunk-T7XP6IZE.js.map} +0 -0
  606. /package/dist/{chunk-KBOG7FJV.js.map → chunk-TFR3HG4K.js.map} +0 -0
  607. /package/dist/{chunk-XUZ5CIEE.js.map → chunk-TUHBYJXL.js.map} +0 -0
  608. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  609. /package/dist/{chunk-ZK4BFABK.js.map → chunk-U7EW2W4W.js.map} +0 -0
  610. /package/dist/{chunk-VFYRYFLL.js.map → chunk-UEBDCMOO.js.map} +0 -0
  611. /package/dist/{chunk-JFWZRUKP.js.map → chunk-UENKPWCS.js.map} +0 -0
  612. /package/dist/{chunk-AAXJNINV.js.map → chunk-UL4MKZHI.js.map} +0 -0
  613. /package/dist/{chunk-R2MZCYA6.js.map → chunk-UNUMFURP.js.map} +0 -0
  614. /package/dist/{chunk-5GIZM4RX.js.map → chunk-UPFNQJC7.js.map} +0 -0
  615. /package/dist/{chunk-W4BMEGQA.js.map → chunk-UTQUEHC7.js.map} +0 -0
  616. /package/dist/{chunk-I32NKXE2.js.map → chunk-V4IDF3EZ.js.map} +0 -0
  617. /package/dist/{chunk-QMZY3GG6.js.map → chunk-WNXYT4MK.js.map} +0 -0
  618. /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
  619. /package/dist/{chunk-T42L3S6A.js.map → chunk-XBGHAAKR.js.map} +0 -0
  620. /package/dist/{chunk-THG4GYIE.js.map → chunk-YEUXERJ6.js.map} +0 -0
  621. /package/dist/{chunk-BIJAWZYW.js.map → chunk-YMOPYG3K.js.map} +0 -0
  622. /package/dist/{chunk-M4AHBM72.js.map → chunk-Z3YEGSR4.js.map} +0 -0
  623. /package/dist/{forget-SZ2BXDGF.js.map → forget-2AE4MDK3.js.map} +0 -0
package/src/config.ts CHANGED
@@ -43,12 +43,10 @@ import { parseExtractionLivenessConfig } from "./extraction-liveness.js";
43
43
  import { parseReplicaPeersConfig } from "./replica-peers-config.js";
44
44
  import { parseDependencyPropagationConfig } from "./dependency-propagation-config.js";
45
45
  import { parseProceduralMaintenanceConfig } from "./procedural/maintenance-config.js";
46
+ import { parseActiveContextFields } from "./active-context-config.js";
46
47
  import { parseSkillProjectionConfig } from "./procedural/skill-projection.js";
47
48
  import { parseDriftDetectionConfig } from "./preferences/drift-config.js";
48
- import {
49
- parseContradictionLocalizationConfig,
50
- parseContradictionScanConfig,
51
- } from "./contradiction-config.js";
49
+ import { parseContradictionLocalizationConfig, parseContradictionScanConfig } from "./contradiction-config.js";
52
50
  import { parseGraphPathScoringConfig } from "./graph-path-scoring-config.js";
53
51
  import { hasLegacyConnectorEntries } from "./connectors/paths.js";
54
52
  import {
@@ -699,7 +697,6 @@ function resolveMemoryOsPreset(value: unknown): MemoryOsPresetName | undefined {
699
697
  }
700
698
  return MEMORY_OS_PRESET_ALIASES[normalized];
701
699
  }
702
-
703
700
  export function parseConfig(
704
701
  raw: unknown,
705
702
  rawOperatorConfig?: Record<string, unknown> | null,
@@ -3306,6 +3303,7 @@ export function parseConfig(
3306
3303
  typeof cfg.maxCompressionTokensPerHour === "number"
3307
3304
  ? Math.max(0, Math.floor(cfg.maxCompressionTokensPerHour))
3308
3305
  : 1500,
3306
+ ...parseActiveContextFields(cfg),
3309
3307
  behaviorLoopAutoTuneEnabled: cfg.behaviorLoopAutoTuneEnabled === true,
3310
3308
  behaviorLoopLearningWindowDays:
3311
3309
  typeof cfg.behaviorLoopLearningWindowDays === "number"
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Pure context summary seam (issue #2347).
3
+ *
4
+ * The only shared summary path: `LcmSummarizer` and active-context
5
+ * transforms both call `summarizeContextPure`. No DAG writes, no model
6
+ * client construction — callers inject the model seam (`SummarizeFn`).
7
+ */
8
+ import { looksLikeMechanicalTelemetryTranscript } from "./telemetry-transcript.js";
9
+ import { estimateTokenCount } from "./token-estimate.js";
10
+
11
+ /** Model seam injected by the caller (orchestrator LLM path or a test stub). */
12
+ export type SummarizeFn = (
13
+ text: string,
14
+ targetTokens: number,
15
+ aggressive: boolean,
16
+ ) => Promise<string | null>;
17
+
18
+ export type ContextSummaryMethod = "deterministic" | "llm" | "auto";
19
+
20
+ export interface PureContextSummaryResult {
21
+ text: string;
22
+ method: "llm" | "deterministic";
23
+ /** True when the requested path degraded (auto mode only). */
24
+ fallback: boolean;
25
+ modelUsed?: string;
26
+ /**
27
+ * Escalation level preserved for LCM callers: 0 normal LLM, 1 aggressive
28
+ * LLM, 2 deterministic truncation. Undefined when never escalated.
29
+ */
30
+ escalation?: number;
31
+ }
32
+
33
+ export interface SummarizeContextPureOptions {
34
+ /** LLM seam. Required for `llm`; without it `auto` degrades to deterministic. */
35
+ llm?: SummarizeFn;
36
+ /** Hard ceiling for deterministic truncation output. */
37
+ deterministicMaxTokens?: number;
38
+ /** Route obvious mechanical telemetry straight to truncation. */
39
+ telemetryPrefilterEnabled?: boolean;
40
+ /** Recorded verbatim in the result for telemetry. */
41
+ modelUsed?: string;
42
+ }
43
+
44
+ /** Thrown when `llm` mode cannot produce usable text (no silent fallback). */
45
+ export class ContextSummaryUnavailableError extends Error {
46
+ constructor(reason: string) {
47
+ super(`context summary unavailable: ${reason}`);
48
+ this.name = "ContextSummaryUnavailableError";
49
+ }
50
+ }
51
+
52
+ const DEFAULT_DETERMINISTIC_MAX_TOKENS = 256;
53
+ /** LLM output tolerance before an attempt is rejected as too long (LCM parity). */
54
+ const OUTPUT_TOKEN_TOLERANCE = 1.5;
55
+ const MIN_DETERMINISTIC_TOKENS = 1;
56
+
57
+ /**
58
+ * Summarize text through the shared seam.
59
+ *
60
+ * - `deterministic`: safe truncation only, never throws, never calls the LLM.
61
+ * - `llm`: exactly one non-aggressive LLM call; failure or unusable output
62
+ * throws {@link ContextSummaryUnavailableError} (fallback is not allowed).
63
+ * - `auto`: escalation ladder (LLM → aggressive LLM → deterministic), with
64
+ * `fallback: true` and an `escalation` level on degradation.
65
+ */
66
+ export async function summarizeContextPure(
67
+ text: string,
68
+ targetTokens: number,
69
+ method: ContextSummaryMethod,
70
+ options: SummarizeContextPureOptions = {},
71
+ ): Promise<PureContextSummaryResult> {
72
+ const deterministicMaxTokens = Math.max(
73
+ MIN_DETERMINISTIC_TOKENS,
74
+ options.deterministicMaxTokens ?? DEFAULT_DETERMINISTIC_MAX_TOKENS,
75
+ );
76
+
77
+ if (method === "deterministic") {
78
+ return {
79
+ text: deterministicTruncate(text, Math.min(targetTokens, deterministicMaxTokens)),
80
+ method: "deterministic",
81
+ fallback: false,
82
+ };
83
+ }
84
+
85
+ const usableLlm = options.llm ?? null;
86
+ if (method === "llm") {
87
+ if (!usableLlm) {
88
+ throw new ContextSummaryUnavailableError("no llm seam configured");
89
+ }
90
+ const result = await attemptLlm(usableLlm, text, targetTokens, false);
91
+ if (result === null) {
92
+ throw new ContextSummaryUnavailableError("llm path failed");
93
+ }
94
+ return { text: result, method: "llm", fallback: false, modelUsed: options.modelUsed };
95
+ }
96
+
97
+ // auto
98
+ if (options.telemetryPrefilterEnabled && looksLikeMechanicalTelemetryTranscript(text)) {
99
+ return {
100
+ text: deterministicTruncate(text, Math.min(targetTokens, deterministicMaxTokens)),
101
+ method: "deterministic",
102
+ fallback: true,
103
+ escalation: 2,
104
+ };
105
+ }
106
+
107
+ if (usableLlm) {
108
+ const normal = await attemptLlm(usableLlm, text, targetTokens, false);
109
+ if (normal !== null) {
110
+ return { text: normal, method: "llm", fallback: false, escalation: 0, modelUsed: options.modelUsed };
111
+ }
112
+ const aggressiveTarget = Math.max(32, Math.ceil(targetTokens * 0.5));
113
+ const aggressive = await attemptLlm(usableLlm, text, aggressiveTarget, true);
114
+ if (aggressive !== null) {
115
+ return { text: aggressive, method: "llm", fallback: true, escalation: 1, modelUsed: options.modelUsed };
116
+ }
117
+ }
118
+
119
+ return {
120
+ text: deterministicTruncate(text, deterministicMaxTokens),
121
+ method: "deterministic",
122
+ fallback: true,
123
+ escalation: 2,
124
+ };
125
+ }
126
+
127
+ /** One LLM attempt; null on error, empty, or over-tolerance output. */
128
+ async function attemptLlm(
129
+ llm: SummarizeFn,
130
+ text: string,
131
+ targetTokens: number,
132
+ aggressive: boolean,
133
+ ): Promise<string | null> {
134
+ try {
135
+ const result = await llm(text, targetTokens, aggressive);
136
+ if (!result || result.trim().length === 0) return null;
137
+ if (estimateTokenCount(result) > targetTokens * OUTPUT_TOKEN_TOLERANCE) return null;
138
+ return result;
139
+ } catch {
140
+ return null;
141
+ }
142
+ }
143
+
144
+ /** Deterministic truncation: first and last sentence, plus middle truncation. */
145
+ export function deterministicTruncate(text: string, maxTokens: number): string {
146
+ if (maxTokens <= 0 || estimateTokenCount(text) <= maxTokens) return text;
147
+
148
+ const sentences = text.split(/(?<=[.!?])\s+/).filter((s) => s.length > 0);
149
+ if (sentences.length <= 2) return clampToTokenBudget(text, maxTokens);
150
+
151
+ const first = sentences[0];
152
+ const last = sentences[sentences.length - 1];
153
+ const render = (middle: string[], truncated: boolean): string =>
154
+ `${first} ${middle.join(" ")}${truncated ? " [...] " : " "}${last}`;
155
+
156
+ const base = render([], false);
157
+ if (estimateTokenCount(base) > maxTokens) return clampToTokenBudget(text, maxTokens);
158
+ if (estimateTokenCount(render([], true)) > maxTokens) return base;
159
+
160
+ const middle: string[] = [];
161
+ for (let i = 1; i < sentences.length - 1; i++) {
162
+ const candidate = [...middle, sentences[i]];
163
+ const truncated = i < sentences.length - 2;
164
+ if (estimateTokenCount(render(candidate, truncated)) > maxTokens) break;
165
+ middle.push(sentences[i]);
166
+ }
167
+
168
+ const truncated = middle.length < sentences.length - 2;
169
+ return clampToTokenBudget(render(middle, truncated), maxTokens);
170
+ }
171
+
172
+ function clampToTokenBudget(text: string, maxTokens: number): string {
173
+ const codePoints = [...text];
174
+ let low = 0;
175
+ let high = codePoints.length;
176
+ while (low < high) {
177
+ const mid = Math.ceil((low + high) / 2);
178
+ if (estimateTokenCount(codePoints.slice(0, mid).join("")) <= maxTokens) low = mid;
179
+ else high = mid - 1;
180
+ }
181
+ return codePoints.slice(0, low).join("");
182
+ }
@@ -0,0 +1,411 @@
1
+ /**
2
+ * Issue #2345 — internal contracts, config bounds, digests, and validators for
3
+ * the privacy-safe action-to-outcome trajectory evaluator.
4
+ *
5
+ * Internal module: never re-exported from the package root by itself. The
6
+ * public surface is `eval-trajectory.ts` (builder) and `eval-trajectory-store.ts`
7
+ * (validation, persistence, promotion gate). Keeping this layer separate holds
8
+ * every file under the #1995 new-file ratchet cap while preserving one
9
+ * subsystem.
10
+ */
11
+
12
+ import { createHash } from "node:crypto";
13
+ import type { MemoryActionOutcome, MemoryActionPolicyDecision, MemoryActionType } from "./types.js";
14
+
15
+ // ---------------------------------------------------------------------------
16
+ // Constants and bounded config
17
+ // ---------------------------------------------------------------------------
18
+
19
+ export const EVAL_TRAJECTORY_REPORT_SCHEMA_VERSION = 1;
20
+
21
+ /** Default delayed-outcome window: 7 days, half-open `actionAt < outcomeAt < actionAt + window`. */
22
+ export const DEFAULT_EVAL_TRAJECTORY_OUTCOME_WINDOW_MS = 604_800_000;
23
+ /** Default allowed clock skew for input timestamps beyond `asOf`. */
24
+ export const DEFAULT_EVAL_TRAJECTORY_MAX_FUTURE_SKEW_MS = 300_000;
25
+ /** Default cap on emitted rows per report. */
26
+ export const DEFAULT_EVAL_TRAJECTORY_MAX_ROWS = 5_000;
27
+ export const MAX_EVAL_TRAJECTORY_ROWS_LIMIT = 50_000;
28
+ /** Default reader expiry: a report older than 30 days fails the checked read. */
29
+ export const DEFAULT_EVAL_TRAJECTORY_REPORT_MAX_AGE_MS = 2_592_000_000;
30
+
31
+ export interface EvalTrajectoryWeights {
32
+ task: number;
33
+ context: number;
34
+ trust: number;
35
+ stale: number;
36
+ }
37
+
38
+ export const DEFAULT_EVAL_TRAJECTORY_WEIGHTS: Readonly<EvalTrajectoryWeights> = Object.freeze({
39
+ task: 1,
40
+ context: 0.25,
41
+ trust: 1,
42
+ stale: 0.5,
43
+ });
44
+
45
+ const MEMORY_ACTION_TYPES: Record<string, true> = {
46
+ store_episode: true,
47
+ store_note: true,
48
+ update_note: true,
49
+ create_artifact: true,
50
+ summarize_node: true,
51
+ discard: true,
52
+ link_graph: true,
53
+ };
54
+
55
+ /** Action types whose live execution is destructive (irreversible) for promotion gating. */
56
+ export const DESTRUCTIVE_ACTION_TYPES: Record<string, true> = { discard: true };
57
+
58
+ export const STALE_LIFECYCLE_STATES: Record<string, true> = {
59
+ active: true,
60
+ stale: true,
61
+ archived: true,
62
+ superseded: true,
63
+ };
64
+
65
+ export const STALE_OUTCOMES: Record<string, true> = {
66
+ success: true,
67
+ partial: true,
68
+ failure: true,
69
+ unknown: true,
70
+ };
71
+
72
+ /**
73
+ * Fixed promotion thresholds for `deriveUnifiedMemoryPromotionReport`. These
74
+ * are deliberately conservative named constants — #2348 owns application, and
75
+ * any loosening must be a reviewed change, not a config knob.
76
+ */
77
+ export const EVAL_TRAJECTORY_PROMOTION_THRESHOLDS = Object.freeze({
78
+ minJoinedRows: 30,
79
+ minReach: 0.5,
80
+ });
81
+
82
+ export interface EvalTrajectoryRunConfig {
83
+ outcomeWindowMs: number;
84
+ maxFutureSkewMs: number;
85
+ weights: EvalTrajectoryWeights;
86
+ maxRows: number;
87
+ }
88
+
89
+ export function resolveEvalTrajectoryRunConfig(partial?: Partial<EvalTrajectoryRunConfig>): EvalTrajectoryRunConfig {
90
+ const source = partial ?? {};
91
+ const weightsSource = source.weights ?? DEFAULT_EVAL_TRAJECTORY_WEIGHTS;
92
+ const weights: EvalTrajectoryWeights = {
93
+ task: Number(weightsSource.task),
94
+ context: Number(weightsSource.context),
95
+ trust: Number(weightsSource.trust),
96
+ stale: Number(weightsSource.stale),
97
+ };
98
+ for (const [name, value] of Object.entries(weights)) {
99
+ if (!Number.isFinite(value) || value < 0) {
100
+ throw new Error(`eval trajectory weight '${name}' must be a finite non-negative number`);
101
+ }
102
+ }
103
+ const totalWeight = weights.task + weights.context + weights.trust + weights.stale;
104
+ if (!(totalWeight > 0)) {
105
+ throw new Error("eval trajectory weights must have a positive total weight");
106
+ }
107
+
108
+ const outcomeWindowMs = Number(source.outcomeWindowMs ?? DEFAULT_EVAL_TRAJECTORY_OUTCOME_WINDOW_MS);
109
+ if (!Number.isSafeInteger(outcomeWindowMs) || outcomeWindowMs <= 0) {
110
+ throw new Error("outcomeWindowMs must be a positive integer");
111
+ }
112
+ const maxFutureSkewMs = Number(source.maxFutureSkewMs ?? DEFAULT_EVAL_TRAJECTORY_MAX_FUTURE_SKEW_MS);
113
+ if (!Number.isSafeInteger(maxFutureSkewMs) || maxFutureSkewMs < 0) {
114
+ throw new Error("maxFutureSkewMs must be a non-negative integer");
115
+ }
116
+ const maxRows = Number(source.maxRows ?? DEFAULT_EVAL_TRAJECTORY_MAX_ROWS);
117
+ if (!Number.isSafeInteger(maxRows) || maxRows < 1 || maxRows > MAX_EVAL_TRAJECTORY_ROWS_LIMIT) {
118
+ throw new Error(`maxRows must be an integer in [1, ${MAX_EVAL_TRAJECTORY_ROWS_LIMIT}]`);
119
+ }
120
+ return { outcomeWindowMs, maxFutureSkewMs, weights, maxRows };
121
+ }
122
+
123
+ // ---------------------------------------------------------------------------
124
+ // Input contracts (sanitized caller rows — raw IDs live here, never in output)
125
+ // ---------------------------------------------------------------------------
126
+
127
+ export type EvalTrajectoryTaskResult = "success" | "partial" | "failure";
128
+ export type EvalTrajectoryOutcomeSource = "eval_artifact" | "causal_trajectory" | "memory_outcome";
129
+ export type EvalStaleUseLifecycleState = "active" | "stale" | "archived" | "superseded";
130
+ export type EvalStaleUseOutcome = "success" | "partial" | "failure" | "unknown";
131
+
132
+ export interface EvalActionInput {
133
+ schemaVersion: 1;
134
+ /** Stable action identity. Required — rows without it are rejected. */
135
+ actionId: string;
136
+ namespace: string;
137
+ actionAt: string;
138
+ action: MemoryActionType;
139
+ /** Immediate operation status. Never a delayed task result. */
140
+ immediateStatus: MemoryActionOutcome;
141
+ policyDecision?: MemoryActionPolicyDecision;
142
+ policyVersion?: string;
143
+ /** Producing subsystem tag (enum-like; exported through the projection). */
144
+ subsystem?: string;
145
+ sessionKey?: string;
146
+ memoryId?: string;
147
+ trajectoryId?: string;
148
+ contextTokensBefore?: number;
149
+ contextTokensAfter?: number;
150
+ contextTokenBudget?: number;
151
+ contextOverflow?: boolean;
152
+ replayMismatch?: boolean;
153
+ missingReversibleGuard?: boolean;
154
+ outsideEligibility?: boolean;
155
+ }
156
+
157
+ export interface EvalOutcomeInput {
158
+ schemaVersion: 1;
159
+ namespace: string;
160
+ /** Stable local identity used only for digesting/dedup — never exported. */
161
+ outcomeId: string;
162
+ outcomeAt: string;
163
+ source: EvalTrajectoryOutcomeSource;
164
+ /** success | partial | failure. Memory-outcome results never become task results. */
165
+ result?: EvalTrajectoryTaskResult;
166
+ actionId?: string;
167
+ trajectoryId?: string;
168
+ memoryId?: string;
169
+ sessionKey?: string;
170
+ }
171
+
172
+ export interface EvalStaleUseEvidenceInput {
173
+ schemaVersion: 1;
174
+ namespace: string;
175
+ actionId: string;
176
+ memoryId: string;
177
+ lifecycleState: EvalStaleUseLifecycleState;
178
+ usedAt: string;
179
+ outcome: EvalStaleUseOutcome;
180
+ }
181
+
182
+ /**
183
+ * Normalized digest-only projections. Joins run on these, so raw IDs never
184
+ * reach the metric or export layers. Equality joins survive digesting because
185
+ * equal raw keys digest to equal values under the same run salt.
186
+ */
187
+ export interface EvalActionProjection {
188
+ schemaVersion: 1;
189
+ actionDigest: string;
190
+ namespaceDigest: string;
191
+ actionAt: string;
192
+ action: MemoryActionType;
193
+ immediateStatus: MemoryActionOutcome;
194
+ policyDecision: MemoryActionPolicyDecision | null;
195
+ policyVersion: string | null;
196
+ source: string | null;
197
+ actionIdDigest: string;
198
+ sessionKeyDigest: string | null;
199
+ memoryIdDigest: string | null;
200
+ trajectoryIdDigest: string | null;
201
+ contextTokenCost: number | null;
202
+ trustViolation: 0 | 1;
203
+ }
204
+
205
+ export interface EvalOutcomeProjection {
206
+ schemaVersion: 1;
207
+ outcomeDigest: string;
208
+ namespaceDigest: string;
209
+ recordedAt: string;
210
+ kind: EvalTrajectoryOutcomeSource;
211
+ /** 1 | 0.5 | 0 for task sources; null when unknown or memory-sourced. */
212
+ value: number | null;
213
+ sourceRefDigest: string;
214
+ actionIdDigest: string | null;
215
+ trajectoryIdDigest: string | null;
216
+ memoryIdDigest: string | null;
217
+ sessionKeyDigest: string | null;
218
+ }
219
+
220
+ export interface EvalStaleUseEvidence {
221
+ schemaVersion: 1;
222
+ actionDigest: string;
223
+ memoryDigest: string;
224
+ lifecycleState: EvalStaleUseLifecycleState;
225
+ usedAt: string;
226
+ outcome: EvalStaleUseOutcome;
227
+ }
228
+
229
+ // ---------------------------------------------------------------------------
230
+ // Exported report contracts (digests, enums, numbers only)
231
+ // ---------------------------------------------------------------------------
232
+
233
+ export type EvalTrajectoryMetricName = "taskOutcome" | "contextTokenCost" | "trustViolation" | "staleMemoryHarm";
234
+
235
+ export type EvalTrajectoryJoinKind = "action_id" | "trajectory_id" | "memory_scope" | "session_scope";
236
+
237
+ export type EvalTrajectoryRowStatus =
238
+ | "joined"
239
+ | "ambiguous"
240
+ | "late_outcome"
241
+ | "future_outcome"
242
+ | "missing_within_window";
243
+
244
+ export type EvalTrajectoryRejectionReason =
245
+ | "missing_action_id"
246
+ | "namespace_mismatch"
247
+ | "invalid_timestamp"
248
+ | "future_beyond_skew"
249
+ | "malformed_row"
250
+ | "invalid_context_budget"
251
+ | "duplicate_row"
252
+ | "max_rows_exceeded";
253
+
254
+ export interface EvalActionOutcomeRow {
255
+ schemaVersion: 1;
256
+ actionDigest: string;
257
+ outcomeDigest: string | null;
258
+ join: EvalTrajectoryJoinKind | null;
259
+ status: EvalTrajectoryRowStatus;
260
+ outcomeRecordedAt: string | null;
261
+ taskOutcome: number | null;
262
+ contextTokenCost: number | null;
263
+ trustViolation: 0 | 1;
264
+ staleMemoryHarm: 0 | 0.5 | 1;
265
+ actionConditionedUtility: number | null;
266
+ missingDimensions: EvalTrajectoryMetricName[];
267
+ }
268
+
269
+ export interface EvalTrajectoryAggregates {
270
+ rowCount: number;
271
+ statusCounts: Record<EvalTrajectoryRowStatus, number>;
272
+ metricMeans: {
273
+ taskOutcome: number | null;
274
+ contextTokenCost: number | null;
275
+ trustViolation: number | null;
276
+ staleMemoryHarm: number | null;
277
+ actionConditionedUtility: number | null;
278
+ };
279
+ coverage: {
280
+ reach: number | null;
281
+ joined: number;
282
+ missingWithinWindow: number;
283
+ lateOutcome: number;
284
+ futureOutcome: number;
285
+ ambiguous: number;
286
+ excludedFromMeans: number;
287
+ };
288
+ byAction: Array<{ action: MemoryActionType; rowCount: number; meanUtility: number | null }>;
289
+ byPolicyDecision: Array<{ policyDecision: string; rowCount: number; meanUtility: number | null }>;
290
+ }
291
+
292
+ export interface EvalTrajectoryReport {
293
+ schemaVersion: 1;
294
+ reportId: string;
295
+ namespaceDigest: string;
296
+ asOf: string;
297
+ config: EvalTrajectoryRunConfig;
298
+ sourceCounts: { actions: number; outcomes: number; staleUseEvidence: number };
299
+ rejectionCounts: Record<EvalTrajectoryRejectionReason, number>;
300
+ rows: EvalActionOutcomeRow[];
301
+ aggregates: EvalTrajectoryAggregates;
302
+ inputFingerprint: string;
303
+ contentHash: string;
304
+ }
305
+
306
+ export type UnifiedMemoryPromotionState =
307
+ | "insufficient_evidence"
308
+ | "shadow_eligible"
309
+ | "active_reversible_eligible"
310
+ | "active_destructive_review_only"
311
+ | "demote_to_shadow";
312
+
313
+ export interface UnifiedMemoryPromotionReport {
314
+ schemaVersion: 1;
315
+ sourceReportId: string;
316
+ namespaceDigest: string;
317
+ asOf: string;
318
+ inputFingerprint: string;
319
+ state: UnifiedMemoryPromotionState;
320
+ reasons: string[];
321
+ evidence: {
322
+ joinedRows: number;
323
+ reach: number | null;
324
+ meanUtility: number | null;
325
+ trustViolations: number;
326
+ staleHarms: number;
327
+ destructiveJoinedRows: number;
328
+ };
329
+ contentHash: string;
330
+ }
331
+
332
+ // ---------------------------------------------------------------------------
333
+ // Digests and deterministic serialization
334
+ // ---------------------------------------------------------------------------
335
+
336
+ export function sha256Hex(input: string): string {
337
+ return createHash("sha256").update(input, "utf8").digest("hex");
338
+ }
339
+
340
+ export function sortKeysDeep(value: unknown): unknown {
341
+ if (Array.isArray(value)) return value.map(sortKeysDeep);
342
+ if (typeof value === "object" && value !== null) {
343
+ const out: Record<string, unknown> = {};
344
+ for (const key of Object.keys(value as Record<string, unknown>).sort()) {
345
+ out[key] = sortKeysDeep((value as Record<string, unknown>)[key]);
346
+ }
347
+ return out;
348
+ }
349
+ return value;
350
+ }
351
+
352
+ export function canonicalJson(value: unknown): string {
353
+ return JSON.stringify(sortKeysDeep(value));
354
+ }
355
+
356
+ export function digestOf(salt: string, payload: unknown): string {
357
+ return sha256Hex(`${salt}\n${canonicalJson(payload)}`);
358
+ }
359
+
360
+ /** Byte-identical serialization for given report content, independent of construction order. */
361
+ export function serializeEvalTrajectoryReport(report: EvalTrajectoryReport): string {
362
+ return `${JSON.stringify(sortKeysDeep(report), null, 2)}\n`;
363
+ }
364
+
365
+ /** Total-order comparators (equality guarded — never let equal keys claim both orders). */
366
+ export function compareStrings(a: string, b: string): number {
367
+ if (a === b) return 0;
368
+ return a < b ? -1 : 1;
369
+ }
370
+
371
+ export function compareRows(a: EvalActionOutcomeRow, b: EvalActionOutcomeRow): number {
372
+ const byTime = compareStrings(a.outcomeRecordedAt ?? "", b.outcomeRecordedAt ?? "");
373
+ if (byTime !== 0) return byTime;
374
+ return compareStrings(a.actionDigest, b.actionDigest);
375
+ }
376
+
377
+ // ---------------------------------------------------------------------------
378
+ // Small shared validators (local copies — evals.ts is at its ratchet ceiling)
379
+ // ---------------------------------------------------------------------------
380
+
381
+ const ISO_UTC_TIMESTAMP_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;
382
+
383
+ export function isIsoTimestamp(value: unknown): value is string {
384
+ return typeof value === "string" && ISO_UTC_TIMESTAMP_RE.test(value) && !Number.isNaN(Date.parse(value));
385
+ }
386
+
387
+ export function isNonEmptyString(value: unknown): value is string {
388
+ return typeof value === "string" && value.trim().length > 0;
389
+ }
390
+
391
+ export function isFiniteNumber(value: unknown): value is number {
392
+ return typeof value === "number" && Number.isFinite(value);
393
+ }
394
+
395
+ export function isMemoryActionType(value: unknown): value is MemoryActionType {
396
+ return typeof value === "string" && MEMORY_ACTION_TYPES[value] === true;
397
+ }
398
+
399
+ export function isRowStatus(value: unknown): value is EvalTrajectoryRowStatus {
400
+ return (
401
+ value === "joined" ||
402
+ value === "ambiguous" ||
403
+ value === "late_outcome" ||
404
+ value === "future_outcome" ||
405
+ value === "missing_within_window"
406
+ );
407
+ }
408
+
409
+ export function isHexSha256(value: unknown): value is string {
410
+ return typeof value === "string" && /^[0-9a-f]{64}$/.test(value);
411
+ }