@remnic/core 1.1.11 → 1.1.12

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 (298) hide show
  1. package/README.md +3 -3
  2. package/dist/access-cli.js +67 -59
  3. package/dist/access-cli.js.map +1 -1
  4. package/dist/access-http.d.ts +7 -4
  5. package/dist/access-http.js +30 -26
  6. package/dist/access-mcp.d.ts +9 -4
  7. package/dist/access-mcp.js +29 -25
  8. package/dist/access-schema.d.ts +188 -8
  9. package/dist/access-schema.js +12 -3
  10. package/dist/{access-service-BkXt3di1.d.ts → access-service-DDjzFALq.d.ts} +60 -11
  11. package/dist/access-service.d.ts +7 -4
  12. package/dist/access-service.js +26 -23
  13. package/dist/action-confidence.d.ts +83 -0
  14. package/dist/action-confidence.js +22 -0
  15. package/dist/active-memory-bridge.d.ts +1 -1
  16. package/dist/active-recall.d.ts +1 -1
  17. package/dist/behavior-learner.d.ts +1 -1
  18. package/dist/behavior-signals.d.ts +1 -1
  19. package/dist/bootstrap.d.ts +4 -2
  20. package/dist/briefing.d.ts +1 -1
  21. package/dist/briefing.js +5 -5
  22. package/dist/buffer-surprise-report.d.ts +1 -1
  23. package/dist/buffer.d.ts +1 -1
  24. package/dist/calibration.d.ts +1 -1
  25. package/dist/calibration.js +4 -4
  26. package/dist/{capsule-export-LLEVB2RG.js → capsule-export-7QNCBZOQ.js} +3 -3
  27. package/dist/{capsule-import-UW45R2MZ.js → capsule-import-EPBHD2EN.js} +3 -3
  28. package/dist/causal-behavior.d.ts +1 -1
  29. package/dist/causal-consolidation.d.ts +1 -1
  30. package/dist/causal-consolidation.js +11 -11
  31. package/dist/{chunk-VQXK37XA.js → chunk-23ZZK64Y.js} +1 -1
  32. package/dist/chunk-23ZZK64Y.js.map +1 -0
  33. package/dist/{chunk-HJYHRE4S.js → chunk-242S3I2A.js} +2 -2
  34. package/dist/{chunk-MCC6KDQF.js → chunk-3B6KIRBH.js} +131 -13
  35. package/dist/chunk-3B6KIRBH.js.map +1 -0
  36. package/dist/chunk-4RA3C3EV.js +60 -0
  37. package/dist/chunk-4RA3C3EV.js.map +1 -0
  38. package/dist/{chunk-EYNQTST2.js → chunk-4YM32CRU.js} +4 -4
  39. package/dist/{chunk-6AUUAZEX.js → chunk-5NXIJZFX.js} +38 -8
  40. package/dist/chunk-5NXIJZFX.js.map +1 -0
  41. package/dist/chunk-6NKAQ74D.js +2237 -0
  42. package/dist/chunk-6NKAQ74D.js.map +1 -0
  43. package/dist/{chunk-PHNGXFQ6.js → chunk-7V22HTMD.js} +3 -3
  44. package/dist/{chunk-363MWCD3.js → chunk-7ZM3BFKK.js} +84 -62
  45. package/dist/chunk-7ZM3BFKK.js.map +1 -0
  46. package/dist/chunk-AC5LO7IU.js +308 -0
  47. package/dist/chunk-AC5LO7IU.js.map +1 -0
  48. package/dist/chunk-AH2JUU6X.js +336 -0
  49. package/dist/chunk-AH2JUU6X.js.map +1 -0
  50. package/dist/{chunk-VX2IUQFE.js → chunk-AQJNPMOA.js} +41 -11
  51. package/dist/chunk-AQJNPMOA.js.map +1 -0
  52. package/dist/{chunk-P73JTV34.js → chunk-BBE34QBJ.js} +4 -4
  53. package/dist/{chunk-KUHRUM6B.js → chunk-BZSQEPRW.js} +452 -139
  54. package/dist/chunk-BZSQEPRW.js.map +1 -0
  55. package/dist/chunk-C5BCH4ZS.js +317 -0
  56. package/dist/chunk-C5BCH4ZS.js.map +1 -0
  57. package/dist/{chunk-C5HUWVH2.js → chunk-CPKTBRS2.js} +6 -6
  58. package/dist/{chunk-IBX3VFOM.js → chunk-D4GAOFF6.js} +118 -2
  59. package/dist/chunk-D4GAOFF6.js.map +1 -0
  60. package/dist/chunk-DB5A3NHS.js +906 -0
  61. package/dist/chunk-DB5A3NHS.js.map +1 -0
  62. package/dist/{chunk-I6BQZSML.js → chunk-DZZPC36E.js} +10 -10
  63. package/dist/{chunk-O4XJUPSF.js → chunk-E2UCDP5S.js} +39 -2
  64. package/dist/chunk-E2UCDP5S.js.map +1 -0
  65. package/dist/{chunk-SRBJUAMP.js → chunk-FMEBPEAO.js} +11 -67
  66. package/dist/chunk-FMEBPEAO.js.map +1 -0
  67. package/dist/{chunk-4DXC6HQQ.js → chunk-FQDPCE3I.js} +5 -5
  68. package/dist/{chunk-NN3LPQ5D.js → chunk-HELQZFZO.js} +155 -16
  69. package/dist/chunk-HELQZFZO.js.map +1 -0
  70. package/dist/{chunk-57QNCUEZ.js → chunk-HL5LRPNA.js} +2 -2
  71. package/dist/{chunk-VTU2B4VF.js → chunk-HQZVVSVB.js} +2 -1
  72. package/dist/chunk-HQZVVSVB.js.map +1 -0
  73. package/dist/{chunk-6Z6UH6TK.js → chunk-HY3L4WKC.js} +69 -3
  74. package/dist/chunk-HY3L4WKC.js.map +1 -0
  75. package/dist/{chunk-QIGOEM65.js → chunk-IB3BFHGN.js} +5 -5
  76. package/dist/{chunk-RXTFCYQF.js → chunk-JESOB2HO.js} +6 -6
  77. package/dist/{chunk-2YMTO4ZJ.js → chunk-JKDVIE52.js} +9 -2
  78. package/dist/chunk-JKDVIE52.js.map +1 -0
  79. package/dist/{chunk-WGK4VHGP.js → chunk-MNU6ZBWT.js} +302 -140
  80. package/dist/chunk-MNU6ZBWT.js.map +1 -0
  81. package/dist/chunk-OAZ5MFUB.js +4124 -0
  82. package/dist/chunk-OAZ5MFUB.js.map +1 -0
  83. package/dist/{chunk-ZTSE2ZJ6.js → chunk-OIGNEXKZ.js} +50 -3
  84. package/dist/chunk-OIGNEXKZ.js.map +1 -0
  85. package/dist/chunk-OZKZ2TRP.js +3729 -0
  86. package/dist/chunk-OZKZ2TRP.js.map +1 -0
  87. package/dist/{chunk-GGD5W7TB.js → chunk-PD6O7AXF.js} +7 -2
  88. package/dist/chunk-PD6O7AXF.js.map +1 -0
  89. package/dist/{chunk-S3IP6R6K.js → chunk-PH4C2U43.js} +23 -3
  90. package/dist/chunk-PH4C2U43.js.map +1 -0
  91. package/dist/chunk-PYPOFEMK.js +294 -0
  92. package/dist/chunk-PYPOFEMK.js.map +1 -0
  93. package/dist/{chunk-EQINRHYR.js → chunk-QDZ2RLEC.js} +243 -7
  94. package/dist/chunk-QDZ2RLEC.js.map +1 -0
  95. package/dist/{chunk-KWBPHZUU.js → chunk-RK6F44Y6.js} +3 -2
  96. package/dist/chunk-RK6F44Y6.js.map +1 -0
  97. package/dist/{chunk-36CTNQY7.js → chunk-RVPLBATS.js} +42 -10
  98. package/dist/chunk-RVPLBATS.js.map +1 -0
  99. package/dist/chunk-SOAU2OE2.js +125 -0
  100. package/dist/chunk-SOAU2OE2.js.map +1 -0
  101. package/dist/{chunk-A4ACKWIW.js → chunk-U5JMRGKX.js} +55 -4
  102. package/dist/chunk-U5JMRGKX.js.map +1 -0
  103. package/dist/{chunk-LIO5X3CM.js → chunk-UVMUAWVT.js} +2 -2
  104. package/dist/chunk-VWT3F4IV.js +2161 -0
  105. package/dist/chunk-VWT3F4IV.js.map +1 -0
  106. package/dist/{chunk-PB5KW5PL.js → chunk-WEJG4TB5.js} +6 -6
  107. package/dist/{chunk-KBYWQWSB.js → chunk-X7HPGUVG.js} +2 -2
  108. package/dist/{chunk-Y5KDIOKF.js → chunk-XAMBKFQS.js} +383 -9
  109. package/dist/chunk-XAMBKFQS.js.map +1 -0
  110. package/dist/{chunk-ZL4S7ARC.js → chunk-Y3VMVTYX.js} +3 -3
  111. package/dist/{chunk-Z5S5HNGY.js → chunk-ZG7PTKBK.js} +21 -5
  112. package/dist/chunk-ZG7PTKBK.js.map +1 -0
  113. package/dist/{chunk-6XA7UN4Z.js → chunk-ZNQN6ZTA.js} +2 -2
  114. package/dist/{chunk-WTFWLUSX.js → chunk-ZVTKDVVM.js} +2 -2
  115. package/dist/{cli-Cvy2SNhF.d.ts → cli-BR8KpIU0.d.ts} +2 -2
  116. package/dist/cli.d.ts +7 -4
  117. package/dist/cli.js +44 -40
  118. package/dist/codex-cli-fallback.d.ts +1 -0
  119. package/dist/codex-cli-fallback.js +1 -1
  120. package/dist/compression-optimizer.d.ts +1 -1
  121. package/dist/config.d.ts +1 -1
  122. package/dist/config.js +1 -1
  123. package/dist/consolidation-provenance-check.d.ts +1 -1
  124. package/dist/consolidation-undo.d.ts +1 -1
  125. package/dist/{contradiction-scan-3Z6YW7YA.js → contradiction-scan-QTXAMBUA.js} +3 -2
  126. package/dist/contradiction-scan-QTXAMBUA.js.map +1 -0
  127. package/dist/day-summary.d.ts +1 -1
  128. package/dist/delinearize.d.ts +1 -1
  129. package/dist/direct-answer-wiring.d.ts +1 -1
  130. package/dist/direct-answer-wiring.js +1 -1
  131. package/dist/direct-answer.d.ts +1 -1
  132. package/dist/embedding-fallback.d.ts +1 -1
  133. package/dist/{engine-FOC3IJLA.js → engine-35M5BKQ7.js} +7 -7
  134. package/dist/entity-retrieval.d.ts +1 -1
  135. package/dist/entity-retrieval.js +5 -5
  136. package/dist/entity-schema.d.ts +1 -1
  137. package/dist/event-order-recall.d.ts +17 -0
  138. package/dist/event-order-recall.js +11 -0
  139. package/dist/event-order-recall.js.map +1 -0
  140. package/dist/evidence-pack.d.ts +3 -1
  141. package/dist/evidence-pack.js +5 -3
  142. package/dist/explicit-capture.d.ts +4 -2
  143. package/dist/explicit-cue-recall.d.ts +4 -1
  144. package/dist/explicit-cue-recall.js +4 -2
  145. package/dist/extraction-judge-telemetry.d.ts +1 -1
  146. package/dist/extraction-judge-training.d.ts +1 -1
  147. package/dist/extraction-judge.d.ts +1 -1
  148. package/dist/extraction.d.ts +1 -1
  149. package/dist/extraction.js +8 -7
  150. package/dist/fallback-llm.d.ts +2 -1
  151. package/dist/fallback-llm.js +4 -4
  152. package/dist/focused-list-recall.d.ts +17 -0
  153. package/dist/focused-list-recall.js +11 -0
  154. package/dist/focused-list-recall.js.map +1 -0
  155. package/dist/identity-continuity.d.ts +1 -1
  156. package/dist/importance.d.ts +1 -1
  157. package/dist/{index-1qIcnbG1.d.ts → index-DJ9QWMw-.d.ts} +3 -2
  158. package/dist/index.d.ts +49 -12
  159. package/dist/index.js +284 -114
  160. package/dist/index.js.map +1 -1
  161. package/dist/intent.d.ts +1 -1
  162. package/dist/intent.js +1 -1
  163. package/dist/lifecycle.d.ts +1 -1
  164. package/dist/live-connectors-runner.d.ts +1 -1
  165. package/dist/local-llm.d.ts +8 -4
  166. package/dist/local-llm.js +1 -1
  167. package/dist/mcp-memory-inspector-app.d.ts +106 -0
  168. package/dist/mcp-memory-inspector-app.js +20 -0
  169. package/dist/mcp-memory-inspector-app.js.map +1 -0
  170. package/dist/memory-action-policy.d.ts +1 -1
  171. package/dist/memory-cache.d.ts +1 -1
  172. package/dist/{memory-governance-F3QOJGEY.js → memory-governance-IMPQZXFC.js} +7 -7
  173. package/dist/memory-governance-IMPQZXFC.js.map +1 -0
  174. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  175. package/dist/memory-projection-store.d.ts +1 -1
  176. package/dist/memory-provenance.d.ts +57 -0
  177. package/dist/memory-provenance.js +13 -0
  178. package/dist/memory-provenance.js.map +1 -0
  179. package/dist/memory-worth-outcomes.d.ts +1 -1
  180. package/dist/models-json.d.ts +1 -1
  181. package/dist/native-knowledge.d.ts +1 -1
  182. package/dist/objective-state-writers.d.ts +1 -1
  183. package/dist/objective-state-writers.js +2 -2
  184. package/dist/operator-toolkit.d.ts +1 -1
  185. package/dist/operator-toolkit.js +11 -11
  186. package/dist/{orchestrator-AOQMo7QI.d.ts → orchestrator-DDMPqU6R.d.ts} +9 -1
  187. package/dist/orchestrator.d.ts +4 -2
  188. package/dist/orchestrator.js +53 -46
  189. package/dist/patterns-cli.d.ts +1 -1
  190. package/dist/policy-runtime.d.ts +1 -1
  191. package/dist/qmd-recall-cache.d.ts +1 -1
  192. package/dist/qmd.d.ts +1 -1
  193. package/dist/recall-disclosure-escalation.d.ts +1 -1
  194. package/dist/recall-explain-renderer.d.ts +3 -1
  195. package/dist/recall-explain-renderer.js +5 -3
  196. package/dist/recall-state.d.ts +1 -1
  197. package/dist/recall-tag-filter.d.ts +3 -1
  198. package/dist/recall-xray-cli.d.ts +3 -1
  199. package/dist/recall-xray-cli.js +6 -4
  200. package/dist/recall-xray-renderer.d.ts +3 -1
  201. package/dist/recall-xray-renderer.js +5 -3
  202. package/dist/recall-xray.d.ts +8 -1
  203. package/dist/recall-xray.js +4 -2
  204. package/dist/resolve-auth-token.d.ts +1 -1
  205. package/dist/resolve-provider-secret.js +1 -1
  206. package/dist/response-guidance-recall.d.ts +18 -0
  207. package/dist/response-guidance-recall.js +11 -0
  208. package/dist/response-guidance-recall.js.map +1 -0
  209. package/dist/resume-bundles.js +3 -3
  210. package/dist/retrieval-agents.d.ts +1 -1
  211. package/dist/retrieval-tiers.d.ts +1 -1
  212. package/dist/schemas.d.ts +22 -22
  213. package/dist/semantic-consolidation.d.ts +1 -1
  214. package/dist/semantic-consolidation.js +6 -6
  215. package/dist/semantic-rule-promotion.js +5 -5
  216. package/dist/semantic-rule-verifier.d.ts +1 -1
  217. package/dist/semantic-rule-verifier.js +6 -6
  218. package/dist/session-observer-bands.d.ts +1 -1
  219. package/dist/session-observer-state.d.ts +1 -1
  220. package/dist/signal.d.ts +1 -1
  221. package/dist/storage.d.ts +3 -1
  222. package/dist/storage.js +4 -4
  223. package/dist/summarizer.d.ts +1 -1
  224. package/dist/summarizer.js +6 -6
  225. package/dist/summary-snapshot.d.ts +1 -1
  226. package/dist/targeted-fact-recall.d.ts +17 -0
  227. package/dist/targeted-fact-recall.js +11 -0
  228. package/dist/targeted-fact-recall.js.map +1 -0
  229. package/dist/telemetry-transcript.d.ts +7 -0
  230. package/dist/telemetry-transcript.js +16 -0
  231. package/dist/telemetry-transcript.js.map +1 -0
  232. package/dist/temporal-supersession.d.ts +1 -1
  233. package/dist/temporal-supersession.js +2 -1
  234. package/dist/temporal-validity.d.ts +1 -1
  235. package/dist/threading.d.ts +1 -1
  236. package/dist/tier-migration.d.ts +1 -1
  237. package/dist/tier-routing.d.ts +1 -1
  238. package/dist/tokens.js +1 -1
  239. package/dist/topics.d.ts +1 -1
  240. package/dist/transcript.d.ts +1 -1
  241. package/dist/trust-zones.d.ts +3 -2
  242. package/dist/trust-zones.js +1 -1
  243. package/dist/types.d.ts +60 -2
  244. package/dist/types.js +1 -1
  245. package/dist/user-model.d.ts +37 -0
  246. package/dist/user-model.js +28 -0
  247. package/dist/user-model.js.map +1 -0
  248. package/dist/utility-runtime.d.ts +1 -1
  249. package/dist/verified-recall.js +6 -6
  250. package/package.json +1 -1
  251. package/dist/chunk-2YMTO4ZJ.js.map +0 -1
  252. package/dist/chunk-363MWCD3.js.map +0 -1
  253. package/dist/chunk-36CTNQY7.js.map +0 -1
  254. package/dist/chunk-6AUUAZEX.js.map +0 -1
  255. package/dist/chunk-6Z6UH6TK.js.map +0 -1
  256. package/dist/chunk-74WWN7ZW.js +0 -82
  257. package/dist/chunk-74WWN7ZW.js.map +0 -1
  258. package/dist/chunk-A4ACKWIW.js.map +0 -1
  259. package/dist/chunk-EQINRHYR.js.map +0 -1
  260. package/dist/chunk-GGD5W7TB.js.map +0 -1
  261. package/dist/chunk-IBX3VFOM.js.map +0 -1
  262. package/dist/chunk-KUHRUM6B.js.map +0 -1
  263. package/dist/chunk-KWBPHZUU.js.map +0 -1
  264. package/dist/chunk-MCC6KDQF.js.map +0 -1
  265. package/dist/chunk-NN3LPQ5D.js.map +0 -1
  266. package/dist/chunk-O4XJUPSF.js.map +0 -1
  267. package/dist/chunk-S2JJBLJG.js +0 -2101
  268. package/dist/chunk-S2JJBLJG.js.map +0 -1
  269. package/dist/chunk-S3IP6R6K.js.map +0 -1
  270. package/dist/chunk-SRBJUAMP.js.map +0 -1
  271. package/dist/chunk-VQXK37XA.js.map +0 -1
  272. package/dist/chunk-VTU2B4VF.js.map +0 -1
  273. package/dist/chunk-VX2IUQFE.js.map +0 -1
  274. package/dist/chunk-WGK4VHGP.js.map +0 -1
  275. package/dist/chunk-Y5KDIOKF.js.map +0 -1
  276. package/dist/chunk-Z5S5HNGY.js.map +0 -1
  277. package/dist/chunk-ZTSE2ZJ6.js.map +0 -1
  278. package/dist/contradiction-scan-3Z6YW7YA.js.map +0 -1
  279. /package/dist/{capsule-export-LLEVB2RG.js.map → action-confidence.js.map} +0 -0
  280. /package/dist/{capsule-import-UW45R2MZ.js.map → capsule-export-7QNCBZOQ.js.map} +0 -0
  281. /package/dist/{engine-FOC3IJLA.js.map → capsule-import-EPBHD2EN.js.map} +0 -0
  282. /package/dist/{chunk-HJYHRE4S.js.map → chunk-242S3I2A.js.map} +0 -0
  283. /package/dist/{chunk-EYNQTST2.js.map → chunk-4YM32CRU.js.map} +0 -0
  284. /package/dist/{chunk-PHNGXFQ6.js.map → chunk-7V22HTMD.js.map} +0 -0
  285. /package/dist/{chunk-P73JTV34.js.map → chunk-BBE34QBJ.js.map} +0 -0
  286. /package/dist/{chunk-C5HUWVH2.js.map → chunk-CPKTBRS2.js.map} +0 -0
  287. /package/dist/{chunk-I6BQZSML.js.map → chunk-DZZPC36E.js.map} +0 -0
  288. /package/dist/{chunk-4DXC6HQQ.js.map → chunk-FQDPCE3I.js.map} +0 -0
  289. /package/dist/{chunk-57QNCUEZ.js.map → chunk-HL5LRPNA.js.map} +0 -0
  290. /package/dist/{chunk-QIGOEM65.js.map → chunk-IB3BFHGN.js.map} +0 -0
  291. /package/dist/{chunk-RXTFCYQF.js.map → chunk-JESOB2HO.js.map} +0 -0
  292. /package/dist/{chunk-LIO5X3CM.js.map → chunk-UVMUAWVT.js.map} +0 -0
  293. /package/dist/{chunk-PB5KW5PL.js.map → chunk-WEJG4TB5.js.map} +0 -0
  294. /package/dist/{chunk-KBYWQWSB.js.map → chunk-X7HPGUVG.js.map} +0 -0
  295. /package/dist/{chunk-ZL4S7ARC.js.map → chunk-Y3VMVTYX.js.map} +0 -0
  296. /package/dist/{chunk-6XA7UN4Z.js.map → chunk-ZNQN6ZTA.js.map} +0 -0
  297. /package/dist/{chunk-WTFWLUSX.js.map → chunk-ZVTKDVVM.js.map} +0 -0
  298. /package/dist/{memory-governance-F3QOJGEY.js.map → engine-35M5BKQ7.js.map} +0 -0
@@ -23,6 +23,10 @@ import { mkdir, writeFile } from "fs/promises";
23
23
  function isTrustZoneName(value) {
24
24
  return value === "quarantine" || value === "working" || value === "trusted";
25
25
  }
26
+ var TRUST_ZONE_DEMO_SCENARIOS = [
27
+ "enterprise-buyer-v1",
28
+ "agentic-commerce-v1"
29
+ ];
26
30
  function validateMetadata(raw) {
27
31
  return validateStringRecord(raw, "metadata");
28
32
  }
@@ -106,7 +110,7 @@ function hasOverlap(left, right) {
106
110
  }
107
111
  function corroborationTags(record) {
108
112
  if (!record.tags || record.tags.length === 0) return void 0;
109
- const filtered = record.tags.filter((tag) => tag !== "trust-zone-demo" && tag !== "enterprise-demo");
113
+ const filtered = record.tags.filter((tag) => tag !== "trust-zone-demo" && tag !== "enterprise-demo" && tag !== "commerce-demo");
110
114
  return filtered.length > 0 ? filtered : void 0;
111
115
  }
112
116
  function requiresCorroboration(record, targetZone, poisoningDefenseEnabled) {
@@ -437,7 +441,14 @@ function buildTrustZoneDemoSeedRunId(baseRecordedAt) {
437
441
  function buildTrustZoneDemoRecordId(baseId, seedRunId) {
438
442
  return `${baseId}-${seedRunId}`;
439
443
  }
440
- function buildTrustZoneDemoRecords(baseRecordedAt, scenario) {
444
+ function parseTrustZoneDemoScenario(raw) {
445
+ const scenario = (raw ?? "enterprise-buyer-v1").trim();
446
+ if (!TRUST_ZONE_DEMO_SCENARIOS.includes(scenario)) {
447
+ throw new Error(`unsupported trust-zone demo scenario: ${scenario}`);
448
+ }
449
+ return scenario;
450
+ }
451
+ function buildEnterpriseBuyerTrustZoneDemoRecords(baseRecordedAt, scenario) {
441
452
  const demoTag = "trust-zone-demo";
442
453
  const commonMetadata = {
443
454
  demoScenario: scenario,
@@ -572,14 +583,239 @@ function buildTrustZoneDemoRecords(baseRecordedAt, scenario) {
572
583
  }
573
584
  ];
574
585
  }
586
+ function buildAgenticCommerceTrustZoneDemoRecords(baseRecordedAt, scenario) {
587
+ const demoTag = "trust-zone-demo";
588
+ const commerceTag = "commerce-demo";
589
+ const commonMetadata = {
590
+ demoScenario: scenario,
591
+ demoSeed: "true",
592
+ category: "user-aware-commerce"
593
+ };
594
+ const seedRunId = buildTrustZoneDemoSeedRunId(baseRecordedAt);
595
+ return [
596
+ {
597
+ schemaVersion: 1,
598
+ recordId: buildTrustZoneDemoRecordId("tz-demo-agentic-commerce-v1-quarantine-catalog-rainshell", seedRunId),
599
+ zone: "quarantine",
600
+ recordedAt: addMinutes(baseRecordedAt, 0),
601
+ kind: "external",
602
+ summary: "Merchant catalog candidate: ArcTrail rain shell, price $148, recycled nylon, medium regular fit, two-day shipping eligible.",
603
+ provenance: {
604
+ sourceClass: "web_content",
605
+ observedAt: addMinutes(baseRecordedAt, -3),
606
+ sessionKey: "demo:agentic-commerce-v1",
607
+ sourceId: "acp-catalog:merchant.example/products/arctrail-rain-shell",
608
+ evidenceHash: "sha256:acp-catalog-arctrail-rain-shell"
609
+ },
610
+ entityRefs: ["product:arctrail-rain-shell", "merchant:trailhead-outfitters"],
611
+ tags: [demoTag, commerceTag, "catalog-product", "rain-shell"],
612
+ metadata: {
613
+ ...commonMetadata,
614
+ story: "catalog-candidate-before-personalization",
615
+ commerceFacet: "product_discovery",
616
+ scope: "commerce/catalog"
617
+ }
618
+ },
619
+ {
620
+ schemaVersion: 1,
621
+ recordId: buildTrustZoneDemoRecordId("tz-demo-agentic-commerce-v1-trusted-brand-preferences", seedRunId),
622
+ zone: "trusted",
623
+ recordedAt: addMinutes(baseRecordedAt, 2),
624
+ kind: "memory",
625
+ summary: "Buyer prefers repairable outdoor brands such as Patagonia, REI, and Arc'teryx, and avoids fast-fashion marketplaces.",
626
+ provenance: {
627
+ sourceClass: "user_input",
628
+ observedAt: addMinutes(baseRecordedAt, 1),
629
+ sessionKey: "demo:agentic-commerce-v1",
630
+ sourceId: "conversation:buyer-preferences",
631
+ evidenceHash: "sha256:buyer-brand-preferences"
632
+ },
633
+ entityRefs: ["buyer:self", "preference:brand"],
634
+ tags: [demoTag, commerceTag, "brand-preference"],
635
+ metadata: {
636
+ ...commonMetadata,
637
+ story: "trusted-brand-preferences",
638
+ commerceFacet: "brand_preferences",
639
+ scope: "personal/commerce"
640
+ }
641
+ },
642
+ {
643
+ schemaVersion: 1,
644
+ recordId: buildTrustZoneDemoRecordId("tz-demo-agentic-commerce-v1-trusted-size-fit", seedRunId),
645
+ zone: "trusted",
646
+ recordedAt: addMinutes(baseRecordedAt, 4),
647
+ kind: "memory",
648
+ summary: "Buyer wears medium tops, 32x32 pants, and prefers relaxed fit with an easy return window.",
649
+ provenance: {
650
+ sourceClass: "user_input",
651
+ observedAt: addMinutes(baseRecordedAt, 3),
652
+ sessionKey: "demo:agentic-commerce-v1",
653
+ sourceId: "conversation:size-fit",
654
+ evidenceHash: "sha256:buyer-size-fit"
655
+ },
656
+ entityRefs: ["buyer:self", "preference:size-fit"],
657
+ tags: [demoTag, commerceTag, "size-fit"],
658
+ metadata: {
659
+ ...commonMetadata,
660
+ story: "trusted-size-fit",
661
+ commerceFacet: "size_fit",
662
+ scope: "personal/commerce"
663
+ }
664
+ },
665
+ {
666
+ schemaVersion: 1,
667
+ recordId: buildTrustZoneDemoRecordId("tz-demo-agentic-commerce-v1-trusted-budget", seedRunId),
668
+ zone: "trusted",
669
+ recordedAt: addMinutes(baseRecordedAt, 6),
670
+ kind: "memory",
671
+ summary: "Routine apparel recommendations should stay under $180, and any checkout above $75 requires an explicit ask before purchase.",
672
+ provenance: {
673
+ sourceClass: "manual",
674
+ observedAt: addMinutes(baseRecordedAt, 5),
675
+ sessionKey: "demo:agentic-commerce-v1",
676
+ sourceId: "review:buyer-commerce-rules",
677
+ evidenceHash: "sha256:buyer-budget-thresholds"
678
+ },
679
+ entityRefs: ["buyer:self", "rule:ask-before-checkout", "constraint:budget"],
680
+ tags: [demoTag, commerceTag, "budget-threshold", "ask-before-checkout"],
681
+ metadata: {
682
+ ...commonMetadata,
683
+ story: "trusted-budget-and-ask-before-checkout",
684
+ commerceFacet: "budget_thresholds",
685
+ askBefore: "checkout-over-75",
686
+ scope: "personal/commerce"
687
+ }
688
+ },
689
+ {
690
+ schemaVersion: 1,
691
+ recordId: buildTrustZoneDemoRecordId("tz-demo-agentic-commerce-v1-trusted-exclusions", seedRunId),
692
+ zone: "trusted",
693
+ recordedAt: addMinutes(baseRecordedAt, 8),
694
+ kind: "memory",
695
+ summary: "Never suggest leather goods, fragrances, or final-sale shoes for this buyer.",
696
+ provenance: {
697
+ sourceClass: "user_input",
698
+ observedAt: addMinutes(baseRecordedAt, 7),
699
+ sessionKey: "demo:agentic-commerce-v1",
700
+ sourceId: "conversation:excluded-products",
701
+ evidenceHash: "sha256:buyer-exclusions"
702
+ },
703
+ entityRefs: ["buyer:self", "rule:never-suggest", "constraint:excluded-products"],
704
+ tags: [demoTag, commerceTag, "excluded-products", "never-suggest"],
705
+ metadata: {
706
+ ...commonMetadata,
707
+ story: "trusted-excluded-products",
708
+ commerceFacet: "excluded_products",
709
+ neverSuggest: "leather,fragrance,final-sale-shoes",
710
+ scope: "personal/commerce"
711
+ }
712
+ },
713
+ {
714
+ schemaVersion: 1,
715
+ recordId: buildTrustZoneDemoRecordId("tz-demo-agentic-commerce-v1-working-shipping-estimate", seedRunId),
716
+ zone: "working",
717
+ recordedAt: addMinutes(baseRecordedAt, 10),
718
+ kind: "state",
719
+ summary: "Shipping estimator says the weekend-trip gift can arrive before Friday with two-day delivery.",
720
+ provenance: {
721
+ sourceClass: "tool_output",
722
+ observedAt: addMinutes(baseRecordedAt, 9),
723
+ sessionKey: "demo:agentic-commerce-v1",
724
+ sourceId: "tool:shipping-estimate-run-17",
725
+ evidenceHash: "sha256:shipping-estimate-weekend-trip"
726
+ },
727
+ entityRefs: ["purchase:weekend-trip-gift", "constraint:shipping-urgency"],
728
+ tags: [demoTag, commerceTag, "shipping-urgency", "gift-purchase"],
729
+ metadata: {
730
+ ...commonMetadata,
731
+ story: "working-shipping-urgency",
732
+ commerceFacet: "shipping_urgency",
733
+ scope: "commerce/session"
734
+ }
735
+ },
736
+ {
737
+ schemaVersion: 1,
738
+ recordId: buildTrustZoneDemoRecordId("tz-demo-agentic-commerce-v1-working-shipping-corroboration", seedRunId),
739
+ zone: "working",
740
+ recordedAt: addMinutes(baseRecordedAt, 12),
741
+ kind: "external",
742
+ summary: "Merchant shipping policy independently confirms two-day delivery cutoff for the same weekend-trip gift window.",
743
+ provenance: {
744
+ sourceClass: "web_content",
745
+ observedAt: addMinutes(baseRecordedAt, 11),
746
+ sessionKey: "demo:agentic-commerce-v1",
747
+ sourceId: "https://merchant.example/shipping/two-day-cutoff",
748
+ evidenceHash: "sha256:merchant-two-day-cutoff"
749
+ },
750
+ entityRefs: ["purchase:weekend-trip-gift", "constraint:shipping-urgency"],
751
+ tags: [demoTag, commerceTag, "shipping-urgency", "gift-purchase"],
752
+ metadata: {
753
+ ...commonMetadata,
754
+ story: "working-shipping-corroboration",
755
+ commerceFacet: "shipping_urgency",
756
+ scope: "commerce/session"
757
+ }
758
+ },
759
+ {
760
+ schemaVersion: 1,
761
+ recordId: buildTrustZoneDemoRecordId("tz-demo-agentic-commerce-v1-working-blocked-upsell", seedRunId),
762
+ zone: "working",
763
+ recordedAt: addMinutes(baseRecordedAt, 14),
764
+ kind: "external",
765
+ summary: "Unverified influencer note claims the buyer wants luxury watch gifts over $500.",
766
+ provenance: {
767
+ sourceClass: "subagent_trace",
768
+ observedAt: addMinutes(baseRecordedAt, 13),
769
+ sessionKey: "demo:agentic-commerce-v1"
770
+ },
771
+ entityRefs: ["buyer:self", "risk:upsell"],
772
+ tags: [demoTag, commerceTag, "blocked-upsell", "needs-evidence"],
773
+ metadata: {
774
+ ...commonMetadata,
775
+ story: "commerce-blocked-unverified-upsell",
776
+ commerceFacet: "risk_tolerance",
777
+ scope: "commerce/session"
778
+ }
779
+ },
780
+ {
781
+ schemaVersion: 1,
782
+ recordId: buildTrustZoneDemoRecordId("tz-demo-agentic-commerce-v1-trusted-checkout-boundary", seedRunId),
783
+ zone: "trusted",
784
+ recordedAt: addMinutes(baseRecordedAt, 16),
785
+ kind: "memory",
786
+ summary: "The agent may recommend products and draft a cart, but must ask before checkout, subscription enrollment, or irreversible purchase actions.",
787
+ provenance: {
788
+ sourceClass: "manual",
789
+ observedAt: addMinutes(baseRecordedAt, 15),
790
+ sessionKey: "demo:agentic-commerce-v1",
791
+ sourceId: "review:commerce-action-boundaries",
792
+ evidenceHash: "sha256:commerce-action-boundaries"
793
+ },
794
+ entityRefs: ["buyer:self", "rule:ask-before-checkout", "policy:action-confidence"],
795
+ tags: [demoTag, commerceTag, "ask-before-checkout", "action-confidence"],
796
+ metadata: {
797
+ ...commonMetadata,
798
+ story: "trusted-checkout-boundary",
799
+ commerceFacet: "ask_before_checkout",
800
+ riskTolerance: "low-for-irreversible-purchase-actions",
801
+ scope: "personal/commerce"
802
+ }
803
+ }
804
+ ];
805
+ }
806
+ function buildTrustZoneDemoRecords(baseRecordedAt, scenario) {
807
+ switch (scenario) {
808
+ case "enterprise-buyer-v1":
809
+ return buildEnterpriseBuyerTrustZoneDemoRecords(baseRecordedAt, scenario);
810
+ case "agentic-commerce-v1":
811
+ return buildAgenticCommerceTrustZoneDemoRecords(baseRecordedAt, scenario);
812
+ }
813
+ }
575
814
  async function seedTrustZoneDemoDataset(options) {
576
815
  if (options.enabled !== true) {
577
816
  throw new Error("trust zone demo seed requires trustZonesEnabled=true");
578
817
  }
579
- const scenario = (options.scenario ?? "enterprise-buyer-v1").trim();
580
- if (scenario !== "enterprise-buyer-v1") {
581
- throw new Error(`unsupported trust-zone demo scenario: ${scenario}`);
582
- }
818
+ const scenario = parseTrustZoneDemoScenario(options.scenario);
583
819
  const baseRecordedAt = assertIsoRecordedAt(options.recordedAt ?? (/* @__PURE__ */ new Date()).toISOString(), "recordedAt");
584
820
  if (!Number.isFinite(Date.parse(baseRecordedAt))) {
585
821
  throw new Error("recordedAt must be a valid ISO timestamp");
@@ -669,4 +905,4 @@ export {
669
905
  seedTrustZoneDemoDataset,
670
906
  getTrustZoneStoreStatus
671
907
  };
672
- //# sourceMappingURL=chunk-EQINRHYR.js.map
908
+ //# sourceMappingURL=chunk-QDZ2RLEC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/trust-zones.ts"],"sourcesContent":["import path from \"node:path\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { listJsonFiles, readJsonFile } from \"./json-store.js\";\nimport { countRecallTokenOverlap, normalizeRecallTokens } from \"./recall-tokenization.js\";\nimport {\n assertIsoRecordedAt,\n assertSafePathSegment,\n assertString,\n isRecord,\n optionalString,\n optionalStringArray,\n recordStoreDay,\n validateStringRecord,\n} from \"./store-contract.js\";\n\nexport type TrustZoneName = \"quarantine\" | \"working\" | \"trusted\";\nexport type TrustZoneRecordKind = \"memory\" | \"artifact\" | \"state\" | \"trajectory\" | \"external\";\nexport type TrustZoneSourceClass =\n | \"tool_output\"\n | \"web_content\"\n | \"subagent_trace\"\n | \"system_memory\"\n | \"user_input\"\n | \"manual\";\n\nexport function isTrustZoneName(value: string): value is TrustZoneName {\n return value === \"quarantine\" || value === \"working\" || value === \"trusted\";\n}\n\nexport interface TrustZoneProvenance {\n sourceClass: TrustZoneSourceClass;\n observedAt: string;\n sessionKey?: string;\n sourceId?: string;\n evidenceHash?: string;\n}\n\nexport interface TrustZoneRecord {\n schemaVersion: 1;\n recordId: string;\n zone: TrustZoneName;\n recordedAt: string;\n kind: TrustZoneRecordKind;\n summary: string;\n provenance: TrustZoneProvenance;\n promotedFromZone?: TrustZoneName;\n entityRefs?: string[];\n tags?: string[];\n metadata?: Record<string, string>;\n}\n\nexport type TrustZoneScoreBand = \"low\" | \"medium\" | \"high\";\n\nexport interface TrustZoneProvenanceScore {\n total: number;\n band: TrustZoneScoreBand;\n anchored: boolean;\n sourceClassWeight: number;\n sourceIdBonus: number;\n evidenceHashBonus: number;\n sessionKeyBonus: number;\n}\n\nexport interface TrustZoneStoreStatus {\n enabled: boolean;\n promotionEnabled: boolean;\n poisoningDefenseEnabled: boolean;\n rootDir: string;\n zonesDir: string;\n records: {\n total: number;\n valid: number;\n invalid: number;\n byZone: Partial<Record<TrustZoneName, number>>;\n byKind: Partial<Record<TrustZoneRecordKind, number>>;\n latestRecordId?: string;\n latestRecordedAt?: string;\n latestZone?: TrustZoneName;\n averageTrustScore?: number;\n byTrustBand?: Partial<Record<TrustZoneScoreBand, number>>;\n };\n latestRecord?: TrustZoneRecord;\n latestRecordTrustScore?: TrustZoneProvenanceScore;\n invalidRecords: Array<{\n path: string;\n error: string;\n }>;\n}\n\nexport interface TrustZonePromotionPlan {\n allowed: boolean;\n reasons: string[];\n sourceRecordId: string;\n sourceZone: TrustZoneName;\n targetZone: TrustZoneName;\n provenanceAnchored: boolean;\n}\n\nexport interface TrustZonePromotionResult {\n plan: TrustZonePromotionPlan;\n wroteRecord: boolean;\n record: TrustZoneRecord;\n filePath?: string;\n sourceRecord: TrustZoneRecord;\n}\n\ninterface TrustZoneCorroborationSummary {\n count: number;\n sourceClasses: TrustZoneSourceClass[];\n}\n\nexport interface TrustZoneSearchResult {\n record: TrustZoneRecord;\n score: number;\n matchedFields: string[];\n}\n\nexport interface TrustZoneRecordEntry {\n filePath: string;\n record: TrustZoneRecord;\n}\n\nexport interface TrustZoneListResult {\n total: number;\n count: number;\n limit: number;\n offset: number;\n records: TrustZoneRecordEntry[];\n allRecords: TrustZoneRecord[];\n}\n\nexport interface TrustZonePromotionReadiness {\n nextTargetZone?: TrustZoneName;\n allowed: boolean;\n reasons: string[];\n requiresCorroboration: boolean;\n corroborationCount: number;\n corroborationSourceClasses: TrustZoneSourceClass[];\n}\n\nexport interface TrustZoneDemoSeedResult {\n scenario: TrustZoneDemoScenario;\n dryRun: boolean;\n recordsWritten: number;\n records: TrustZoneRecord[];\n filePaths: string[];\n}\n\nexport type TrustZoneDemoScenario = \"enterprise-buyer-v1\" | \"agentic-commerce-v1\";\n\nconst TRUST_ZONE_DEMO_SCENARIOS: TrustZoneDemoScenario[] = [\n \"enterprise-buyer-v1\",\n \"agentic-commerce-v1\",\n];\n\nfunction validateMetadata(raw: unknown): Record<string, string> | undefined {\n return validateStringRecord(raw, \"metadata\");\n}\n\nfunction validateZone(raw: unknown, field: string): TrustZoneName {\n const value = assertString(raw, field);\n if (![\"quarantine\", \"working\", \"trusted\"].includes(value)) {\n throw new Error(`${field} must be one of quarantine|working|trusted`);\n }\n return value as TrustZoneName;\n}\n\nfunction validateKind(raw: unknown): TrustZoneRecordKind {\n const value = assertString(raw, \"kind\");\n if (![\"memory\", \"artifact\", \"state\", \"trajectory\", \"external\"].includes(value)) {\n throw new Error(\"kind must be one of memory|artifact|state|trajectory|external\");\n }\n return value as TrustZoneRecordKind;\n}\n\nfunction validateProvenance(raw: unknown): TrustZoneProvenance {\n if (!isRecord(raw)) throw new Error(\"provenance must be an object\");\n const sourceClass = assertString(raw.sourceClass, \"provenance.sourceClass\");\n if (![\"tool_output\", \"web_content\", \"subagent_trace\", \"system_memory\", \"user_input\", \"manual\"].includes(sourceClass)) {\n throw new Error(\"provenance.sourceClass must be one of tool_output|web_content|subagent_trace|system_memory|user_input|manual\");\n }\n return {\n sourceClass: sourceClass as TrustZoneSourceClass,\n observedAt: assertIsoRecordedAt(assertString(raw.observedAt, \"provenance.observedAt\"), \"provenance.observedAt\"),\n sessionKey: optionalString(raw.sessionKey),\n sourceId: optionalString(raw.sourceId),\n evidenceHash: optionalString(raw.evidenceHash),\n };\n}\n\nexport function resolveTrustZoneStoreDir(memoryDir: string, overrideDir?: string): string {\n if (typeof overrideDir === \"string\" && overrideDir.trim().length > 0) {\n return overrideDir.trim();\n }\n return path.join(memoryDir, \"state\", \"trust-zones\");\n}\n\nexport function validateTrustZoneRecord(raw: unknown): TrustZoneRecord {\n if (!isRecord(raw)) throw new Error(\"trust-zone record must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n\n return {\n schemaVersion: 1,\n recordId: assertSafePathSegment(assertString(raw.recordId, \"recordId\"), \"recordId\"),\n zone: validateZone(raw.zone, \"zone\"),\n recordedAt: assertIsoRecordedAt(assertString(raw.recordedAt, \"recordedAt\")),\n kind: validateKind(raw.kind),\n summary: assertString(raw.summary, \"summary\"),\n provenance: validateProvenance(raw.provenance),\n promotedFromZone: raw.promotedFromZone === undefined ? undefined : validateZone(raw.promotedFromZone, \"promotedFromZone\"),\n entityRefs: optionalStringArray(raw.entityRefs, \"entityRefs\"),\n tags: optionalStringArray(raw.tags, \"tags\"),\n metadata: validateMetadata(raw.metadata),\n };\n}\n\nexport async function recordTrustZoneRecord(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n record: TrustZoneRecord;\n}): Promise<string> {\n const rootDir = resolveTrustZoneStoreDir(options.memoryDir, options.trustZoneStoreDir);\n const validated = validateTrustZoneRecord(options.record);\n const day = recordStoreDay(validated.recordedAt);\n const zoneDir = path.join(rootDir, \"zones\", validated.zone, day);\n const filePath = path.join(zoneDir, `${validated.recordId}.json`);\n await mkdir(zoneDir, { recursive: true });\n await writeFile(filePath, JSON.stringify(validated, null, 2), \"utf8\");\n return filePath;\n}\n\nfunction hasAnchoredProvenance(record: TrustZoneRecord): boolean {\n return Boolean(record.provenance.sourceId && record.provenance.evidenceHash);\n}\n\nfunction buildPromotionRecordId(sourceRecordId: string, targetZone: TrustZoneName, recordedAt: string): string {\n const suffix = recordedAt.replace(/[^0-9]/g, \"\").slice(0, 14);\n return `${sourceRecordId}-${targetZone}-${suffix}`;\n}\n\nfunction dedupeStrings(values: Array<string | undefined>): string[] | undefined {\n const out = values.filter((value): value is string => typeof value === \"string\" && value.length > 0);\n if (out.length === 0) return undefined;\n return [...new Set(out)];\n}\n\nfunction hasOverlap(left: string[] | undefined, right: string[] | undefined): boolean {\n if (!left || !right || left.length === 0 || right.length === 0) return false;\n const rightSet = new Set(right);\n return left.some((value) => rightSet.has(value));\n}\n\nfunction corroborationTags(record: TrustZoneRecord): string[] | undefined {\n if (!record.tags || record.tags.length === 0) return undefined;\n const filtered = record.tags.filter((tag) => tag !== \"trust-zone-demo\" && tag !== \"enterprise-demo\" && tag !== \"commerce-demo\");\n return filtered.length > 0 ? filtered : undefined;\n}\n\nfunction requiresCorroboration(record: TrustZoneRecord, targetZone: TrustZoneName, poisoningDefenseEnabled: boolean): boolean {\n return (\n poisoningDefenseEnabled === true\n && targetZone === \"trusted\"\n && record.zone === \"working\"\n && [\"tool_output\", \"web_content\", \"subagent_trace\"].includes(record.provenance.sourceClass)\n );\n}\n\nfunction summarizeCorroboration(options: {\n sourceRecord: TrustZoneRecord;\n records: TrustZoneRecord[];\n}): TrustZoneCorroborationSummary {\n const corroborating = options.records.filter((candidate) => {\n if (candidate.recordId === options.sourceRecord.recordId) return false;\n if (candidate.zone === \"quarantine\") return false;\n if (hasAnchoredProvenance(candidate) !== true) return false;\n if (candidate.provenance.sourceClass === options.sourceRecord.provenance.sourceClass) return false;\n return (\n hasOverlap(candidate.entityRefs, options.sourceRecord.entityRefs)\n || hasOverlap(corroborationTags(candidate), corroborationTags(options.sourceRecord))\n );\n });\n\n return {\n count: corroborating.length,\n sourceClasses: [...new Set(corroborating.map((record) => record.provenance.sourceClass))],\n };\n}\n\nconst SOURCE_CLASS_WEIGHTS: Record<TrustZoneSourceClass, number> = {\n manual: 0.9,\n system_memory: 0.85,\n user_input: 0.75,\n tool_output: 0.55,\n subagent_trace: 0.45,\n web_content: 0.35,\n};\n\nfunction roundTrustScore(value: number): number {\n return Math.round(value * 1000) / 1000;\n}\n\nfunction trustScoreBand(total: number): TrustZoneScoreBand {\n if (total >= 0.8) return \"high\";\n if (total >= 0.5) return \"medium\";\n return \"low\";\n}\n\nexport function scoreTrustZoneProvenance(record: TrustZoneRecord): TrustZoneProvenanceScore {\n const sourceClassWeight = SOURCE_CLASS_WEIGHTS[record.provenance.sourceClass];\n const sourceIdBonus = typeof record.provenance.sourceId === \"string\" ? 0.1 : 0;\n const evidenceHashBonus = typeof record.provenance.evidenceHash === \"string\" ? 0.2 : 0;\n const sessionKeyBonus = typeof record.provenance.sessionKey === \"string\" ? 0.05 : 0;\n const total = roundTrustScore(\n Math.min(1, sourceClassWeight + sourceIdBonus + evidenceHashBonus + sessionKeyBonus),\n );\n\n return {\n total,\n band: trustScoreBand(total),\n anchored: hasAnchoredProvenance(record),\n sourceClassWeight,\n sourceIdBonus,\n evidenceHashBonus,\n sessionKeyBonus,\n };\n}\n\nexport function planTrustZonePromotion(options: {\n record: TrustZoneRecord;\n targetZone: TrustZoneName;\n}): TrustZonePromotionPlan {\n const { record, targetZone } = options;\n const reasons: string[] = [];\n const provenanceAnchored = hasAnchoredProvenance(record);\n\n if (record.zone === targetZone) {\n reasons.push(`record is already in the ${targetZone} zone`);\n }\n if (record.zone === \"trusted\") {\n reasons.push(\"trusted records are terminal and cannot be promoted again\");\n }\n if (record.zone === \"quarantine\" && targetZone === \"trusted\") {\n reasons.push(\"quarantine records must pass through working before trusted promotion\");\n }\n if (record.zone === \"working\" && targetZone === \"quarantine\") {\n reasons.push(\"working records cannot be demoted back into quarantine in this promotion path\");\n }\n if (record.zone === \"quarantine\" && targetZone !== \"working\") {\n reasons.push(\"quarantine promotions only support the working zone\");\n }\n if (record.zone === \"working\" && targetZone !== \"trusted\") {\n reasons.push(\"working promotions only support the trusted zone\");\n }\n if (\n targetZone === \"trusted\" &&\n [\"tool_output\", \"web_content\", \"subagent_trace\"].includes(record.provenance.sourceClass) &&\n provenanceAnchored !== true\n ) {\n reasons.push(\"trusted promotion for external/tool-derived provenance requires both provenance.sourceId and provenance.evidenceHash\");\n }\n\n return {\n allowed: reasons.length === 0,\n reasons,\n sourceRecordId: record.recordId,\n sourceZone: record.zone,\n targetZone,\n provenanceAnchored,\n };\n}\n\nasync function findTrustZoneRecordById(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n recordId: string;\n}): Promise<TrustZoneRecord | null> {\n const { entries } = await readTrustZoneRecordEntries(options);\n entries.sort((a, b) => b.record.recordedAt.localeCompare(a.record.recordedAt));\n return entries.find((entry) => entry.record.recordId === options.recordId)?.record ?? null;\n}\n\nexport async function promoteTrustZoneRecord(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n enabled: boolean;\n promotionEnabled: boolean;\n poisoningDefenseEnabled?: boolean;\n sourceRecordId: string;\n targetZone: TrustZoneName;\n recordedAt: string;\n promotionReason: string;\n summary?: string;\n dryRun?: boolean;\n}): Promise<TrustZonePromotionResult> {\n if (options.enabled !== true) {\n throw new Error(\"trust zone promotion requires trustZonesEnabled=true\");\n }\n if (options.promotionEnabled !== true) {\n throw new Error(\"trust zone promotion requires quarantinePromotionEnabled=true\");\n }\n\n const sourceRecord = await findTrustZoneRecordById({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n recordId: assertSafePathSegment(assertString(options.sourceRecordId, \"sourceRecordId\"), \"sourceRecordId\"),\n });\n if (!sourceRecord) {\n throw new Error(`source trust-zone record not found: ${options.sourceRecordId}`);\n }\n\n const plan = planTrustZonePromotion({\n record: sourceRecord,\n targetZone: options.targetZone,\n });\n if (!plan.allowed) {\n throw new Error(`trust-zone promotion denied: ${plan.reasons.join(\"; \")}`);\n }\n\n const corroboration = requiresCorroboration(sourceRecord, options.targetZone, options.poisoningDefenseEnabled === true)\n ? summarizeCorroboration({\n sourceRecord,\n records: (await readTrustZoneRecordEntries({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n })).entries.map((entry) => entry.record),\n })\n : null;\n\n if (corroboration && corroboration.count === 0) {\n throw new Error(\"trust-zone promotion denied: corroboration is required for risky trusted promotions\");\n }\n\n const recordedAt = assertIsoRecordedAt(assertString(options.recordedAt, \"recordedAt\"));\n const promotionReason = assertString(options.promotionReason, \"promotionReason\");\n const nextRecord: TrustZoneRecord = {\n schemaVersion: 1,\n recordId: buildPromotionRecordId(sourceRecord.recordId, options.targetZone, recordedAt),\n zone: options.targetZone,\n recordedAt,\n kind: sourceRecord.kind,\n summary: optionalString(options.summary) ?? sourceRecord.summary,\n provenance: sourceRecord.provenance,\n promotedFromZone: sourceRecord.zone,\n entityRefs: sourceRecord.entityRefs,\n tags: dedupeStrings([...(sourceRecord.tags ?? []), \"promotion\"]),\n metadata: {\n ...(sourceRecord.metadata ?? {}),\n sourceRecordId: sourceRecord.recordId,\n promotionReason,\n ...(corroboration\n ? {\n corroborated: \"true\",\n corroborationCount: String(corroboration.count),\n corroborationSources: corroboration.sourceClasses.join(\",\"),\n }\n : {}),\n },\n };\n\n if (options.dryRun === true) {\n return {\n plan,\n wroteRecord: false,\n record: nextRecord,\n sourceRecord,\n };\n }\n\n const filePath = await recordTrustZoneRecord({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n record: nextRecord,\n });\n\n return {\n plan,\n wroteRecord: true,\n record: nextRecord,\n filePath,\n sourceRecord,\n };\n}\n\nasync function readTrustZoneRecordEntries(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n}): Promise<{\n files: string[];\n entries: TrustZoneRecordEntry[];\n invalidRecords: Array<{ path: string; error: string }>;\n}> {\n const rootDir = resolveTrustZoneStoreDir(options.memoryDir, options.trustZoneStoreDir);\n const files = await listJsonFiles(path.join(rootDir, \"zones\"));\n const entries: TrustZoneRecordEntry[] = [];\n const invalidRecords: Array<{ path: string; error: string }> = [];\n for (const filePath of files) {\n try {\n entries.push({\n filePath,\n record: validateTrustZoneRecord(await readJsonFile(filePath)),\n });\n } catch (error) {\n invalidRecords.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n return { files, entries, invalidRecords };\n}\n\nfunction lexicalScoreTrustZoneRecord(\n record: TrustZoneRecord,\n queryTokens: Set<string>,\n): { score: number; matchedFields: string[] } {\n const weightedFields: Array<[field: string, value: string | undefined, weight: number]> = [\n [\"summary\", record.summary, 4],\n [\"kind\", record.kind, 1],\n [\"zone\", record.zone, 1],\n [\"sourceClass\", record.provenance.sourceClass, 1],\n [\"entityRefs\", record.entityRefs?.join(\" \"), 2],\n [\"tags\", record.tags?.join(\" \"), 2],\n [\"metadata\", record.metadata ? Object.values(record.metadata).join(\" \") : undefined, 1],\n ];\n\n let score = 0;\n const matchedFields: string[] = [];\n for (const [field, value, weight] of weightedFields) {\n const matches = countRecallTokenOverlap(queryTokens, value, [\"what\"]);\n if (matches > 0) matchedFields.push(field);\n score += matches * weight;\n }\n return { score, matchedFields };\n}\n\nfunction zonePriority(zone: TrustZoneName): number {\n switch (zone) {\n case \"trusted\":\n return 3;\n case \"working\":\n return 2;\n case \"quarantine\":\n return 1;\n }\n}\n\nfunction scoreTrustZoneRecord(\n record: TrustZoneRecord,\n lexicalScore: number,\n sessionKey?: string,\n): number {\n let score = lexicalScore;\n score += zonePriority(record.zone);\n if (sessionKey && record.provenance.sessionKey === sessionKey) score += 1;\n\n const recordedAtMs = Date.parse(record.recordedAt);\n if (Number.isFinite(recordedAtMs)) {\n const ageHours = Math.max(0, (Date.now() - recordedAtMs) / 3_600_000);\n score += 1 / (1 + ageHours);\n }\n return score;\n}\n\nexport async function searchTrustZoneRecords(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n query: string;\n maxResults: number;\n sessionKey?: string;\n}): Promise<TrustZoneSearchResult[]> {\n const maxResults = Math.max(0, Math.floor(options.maxResults));\n if (maxResults === 0) return [];\n\n const { entries } = await readTrustZoneRecordEntries(options);\n const records = entries.map((entry) => entry.record);\n const candidates = records.filter((record) => record.zone !== \"quarantine\");\n if (candidates.length === 0) return [];\n\n const queryTokens = new Set(normalizeRecallTokens(options.query, [\"what\"]));\n if (queryTokens.size === 0) return [];\n\n const scored = candidates.map((record) => {\n const lexical = lexicalScoreTrustZoneRecord(record, queryTokens);\n return {\n record,\n matchedFields: lexical.matchedFields,\n lexicalScore: lexical.score,\n score: scoreTrustZoneRecord(record, lexical.score, options.sessionKey),\n };\n });\n\n const filtered = scored.filter((result) => result.lexicalScore > 0);\n filtered.sort((left, right) => {\n if (right.score !== left.score) return right.score - left.score;\n return right.record.recordedAt.localeCompare(left.record.recordedAt);\n });\n\n return filtered.slice(0, maxResults).map(({ record, score, matchedFields }) => ({\n record,\n score,\n matchedFields,\n }));\n}\n\nexport async function listTrustZoneRecords(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n query?: string;\n zone?: TrustZoneName;\n kind?: TrustZoneRecordKind;\n sourceClass?: TrustZoneSourceClass;\n limit?: number;\n offset?: number;\n}): Promise<TrustZoneListResult> {\n const limit = Number.isFinite(options.limit) ? Math.max(1, Math.min(200, Math.floor(options.limit ?? 25))) : 25;\n const offset = Number.isFinite(options.offset) ? Math.max(0, Math.floor(options.offset ?? 0)) : 0;\n const zoneFilter = options.zone?.trim();\n const kindFilter = options.kind?.trim();\n const sourceClassFilter = options.sourceClass?.trim();\n const queryTokens = new Set(normalizeRecallTokens(options.query ?? \"\", [\"what\"]));\n\n const { entries } = await readTrustZoneRecordEntries(options);\n const filtered = entries\n .filter((entry) => !zoneFilter || entry.record.zone === zoneFilter)\n .filter((entry) => !kindFilter || entry.record.kind === kindFilter)\n .filter((entry) => !sourceClassFilter || entry.record.provenance.sourceClass === sourceClassFilter)\n .map((entry) => ({\n entry,\n lexical: queryTokens.size > 0 ? lexicalScoreTrustZoneRecord(entry.record, queryTokens) : null,\n }))\n .filter((candidate) => queryTokens.size === 0 || (candidate.lexical?.score ?? 0) > 0);\n\n filtered.sort((left, right) => {\n const leftScore = left.lexical?.score ?? 0;\n const rightScore = right.lexical?.score ?? 0;\n if (rightScore !== leftScore) return rightScore - leftScore;\n return right.entry.record.recordedAt.localeCompare(left.entry.record.recordedAt);\n });\n\n return {\n total: filtered.length,\n count: filtered.slice(offset, offset + limit).length,\n limit,\n offset,\n records: filtered.slice(offset, offset + limit).map((candidate) => candidate.entry),\n allRecords: entries.map((entry) => entry.record),\n };\n}\n\nexport function summarizeTrustZonePromotionReadiness(options: {\n record: TrustZoneRecord;\n allRecords: TrustZoneRecord[];\n poisoningDefenseEnabled: boolean;\n}): TrustZonePromotionReadiness {\n if (options.record.zone === \"trusted\") {\n return {\n allowed: false,\n reasons: [\"trusted records are terminal and do not have a next promotion step\"],\n requiresCorroboration: false,\n corroborationCount: 0,\n corroborationSourceClasses: [],\n };\n }\n\n const nextTargetZone: TrustZoneName = options.record.zone === \"quarantine\" ? \"working\" : \"trusted\";\n const plan = planTrustZonePromotion({\n record: options.record,\n targetZone: nextTargetZone,\n });\n const requires = requiresCorroboration(options.record, nextTargetZone, options.poisoningDefenseEnabled);\n const corroboration = requires\n ? summarizeCorroboration({\n sourceRecord: options.record,\n records: options.allRecords,\n })\n : { count: 0, sourceClasses: [] };\n\n const reasons = [...plan.reasons];\n if (requires && corroboration.count === 0) {\n reasons.push(\"trusted promotion requires corroboration from an independent non-quarantine source\");\n }\n\n return {\n nextTargetZone,\n allowed: plan.allowed && (!requires || corroboration.count > 0),\n reasons,\n requiresCorroboration: requires,\n corroborationCount: corroboration.count,\n corroborationSourceClasses: corroboration.sourceClasses,\n };\n}\n\nfunction addMinutes(baseIso: string, minutes: number): string {\n const baseMs = Date.parse(baseIso);\n if (!Number.isFinite(baseMs)) {\n throw new Error(\"recordedAt must be a valid ISO timestamp\");\n }\n return new Date(baseMs + minutes * 60_000).toISOString();\n}\n\nfunction buildTrustZoneDemoSeedRunId(baseRecordedAt: string): string {\n return baseRecordedAt.replace(/[^0-9]/g, \"\");\n}\n\nfunction buildTrustZoneDemoRecordId(baseId: string, seedRunId: string): string {\n return `${baseId}-${seedRunId}`;\n}\n\nfunction parseTrustZoneDemoScenario(raw: string | undefined): TrustZoneDemoScenario {\n const scenario = (raw ?? \"enterprise-buyer-v1\").trim();\n if (!TRUST_ZONE_DEMO_SCENARIOS.includes(scenario as TrustZoneDemoScenario)) {\n throw new Error(`unsupported trust-zone demo scenario: ${scenario}`);\n }\n return scenario as TrustZoneDemoScenario;\n}\n\nfunction buildEnterpriseBuyerTrustZoneDemoRecords(baseRecordedAt: string, scenario: TrustZoneDemoScenario): TrustZoneRecord[] {\n const demoTag = \"trust-zone-demo\";\n const commonMetadata = {\n demoScenario: scenario,\n demoSeed: \"true\",\n };\n const seedRunId = buildTrustZoneDemoSeedRunId(baseRecordedAt);\n return [\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-quarantine-ready\", seedRunId),\n zone: \"quarantine\",\n recordedAt: addMinutes(baseRecordedAt, 0),\n kind: \"external\",\n summary: \"Vendor portal policy excerpt captured before validation for Acme Industrial onboarding.\",\n provenance: {\n sourceClass: \"web_content\",\n observedAt: addMinutes(baseRecordedAt, -2),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"https://vendor.example.com/policies/acme-industrial.pdf\",\n evidenceHash: \"sha256:vendor-portal-policy-proof\",\n },\n entityRefs: [\"account:acme-industrial\", \"policy:vendor-onboarding\"],\n tags: [demoTag, \"enterprise-demo\", \"vendor-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"captured-external-policy\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-blocked\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 2),\n kind: \"external\",\n summary: \"Unverified rumor about a production freeze captured without source evidence.\",\n provenance: {\n sourceClass: \"subagent_trace\",\n observedAt: addMinutes(baseRecordedAt, 1),\n sessionKey: \"demo:enterprise-buyer-v1\",\n },\n entityRefs: [\"workspace:finance\", \"incident:freeze-rumor\"],\n tags: [demoTag, \"enterprise-demo\", \"needs-evidence\"],\n metadata: {\n ...commonMetadata,\n story: \"working-missing-provenance\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-awaiting-corroboration\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 6),\n kind: \"state\",\n summary: \"Tool output says the finance SSO certificate rotation completed successfully.\",\n provenance: {\n sourceClass: \"tool_output\",\n observedAt: addMinutes(baseRecordedAt, 5),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"tool:sso-rotation-run-42\",\n evidenceHash: \"sha256:sso-rotation-log\",\n },\n entityRefs: [\"finding:finance-sso-certificate-rotation-tool-output-pending\"],\n tags: [demoTag, \"enterprise-demo\", \"sso-rotation-pending\"],\n metadata: {\n ...commonMetadata,\n story: \"working-awaiting-corroboration\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-corroborated\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 7),\n kind: \"state\",\n summary: \"Tool output says the vendor onboarding policy sync completed with anchored evidence ready for promotion.\",\n provenance: {\n sourceClass: \"tool_output\",\n observedAt: addMinutes(baseRecordedAt, 6),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"tool:vendor-policy-sync-run-9\",\n evidenceHash: \"sha256:vendor-policy-sync-log\",\n },\n entityRefs: [\"account:acme-industrial\", \"policy:vendor-onboarding\"],\n tags: [demoTag, \"enterprise-demo\", \"vendor-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"working-with-corroboration\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-working-corroboration\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 9),\n kind: \"external\",\n summary: \"Change ticket confirms the same vendor onboarding policy sync with matching artifact hash.\",\n provenance: {\n sourceClass: \"web_content\",\n observedAt: addMinutes(baseRecordedAt, 7),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"https://tickets.example.com/changes/CHG-4821\",\n evidenceHash: \"sha256:sso-rotation-ticket-proof\",\n },\n entityRefs: [\"account:acme-industrial\", \"policy:vendor-onboarding\"],\n tags: [demoTag, \"enterprise-demo\", \"vendor-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"independent-corroboration\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-enterprise-buyer-v1-trusted-governance-rule\", seedRunId),\n zone: \"trusted\",\n recordedAt: addMinutes(baseRecordedAt, 13),\n kind: \"memory\",\n summary: \"Trusted promotion requires a ticket id and artifact hash before shared recall can use operator actions.\",\n provenance: {\n sourceClass: \"manual\",\n observedAt: addMinutes(baseRecordedAt, 11),\n sessionKey: \"demo:enterprise-buyer-v1\",\n sourceId: \"review:trust-zone-policy\",\n evidenceHash: \"sha256:trust-zone-policy\",\n },\n promotedFromZone: \"working\",\n entityRefs: [\"policy:trust-zone-promotion\"],\n tags: [demoTag, \"enterprise-demo\", \"operator-policy\"],\n metadata: {\n ...commonMetadata,\n story: \"trusted-policy\",\n },\n },\n ];\n}\n\nfunction buildAgenticCommerceTrustZoneDemoRecords(baseRecordedAt: string, scenario: TrustZoneDemoScenario): TrustZoneRecord[] {\n const demoTag = \"trust-zone-demo\";\n const commerceTag = \"commerce-demo\";\n const commonMetadata = {\n demoScenario: scenario,\n demoSeed: \"true\",\n category: \"user-aware-commerce\",\n };\n const seedRunId = buildTrustZoneDemoSeedRunId(baseRecordedAt);\n return [\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-agentic-commerce-v1-quarantine-catalog-rainshell\", seedRunId),\n zone: \"quarantine\",\n recordedAt: addMinutes(baseRecordedAt, 0),\n kind: \"external\",\n summary: \"Merchant catalog candidate: ArcTrail rain shell, price $148, recycled nylon, medium regular fit, two-day shipping eligible.\",\n provenance: {\n sourceClass: \"web_content\",\n observedAt: addMinutes(baseRecordedAt, -3),\n sessionKey: \"demo:agentic-commerce-v1\",\n sourceId: \"acp-catalog:merchant.example/products/arctrail-rain-shell\",\n evidenceHash: \"sha256:acp-catalog-arctrail-rain-shell\",\n },\n entityRefs: [\"product:arctrail-rain-shell\", \"merchant:trailhead-outfitters\"],\n tags: [demoTag, commerceTag, \"catalog-product\", \"rain-shell\"],\n metadata: {\n ...commonMetadata,\n story: \"catalog-candidate-before-personalization\",\n commerceFacet: \"product_discovery\",\n scope: \"commerce/catalog\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-agentic-commerce-v1-trusted-brand-preferences\", seedRunId),\n zone: \"trusted\",\n recordedAt: addMinutes(baseRecordedAt, 2),\n kind: \"memory\",\n summary: \"Buyer prefers repairable outdoor brands such as Patagonia, REI, and Arc'teryx, and avoids fast-fashion marketplaces.\",\n provenance: {\n sourceClass: \"user_input\",\n observedAt: addMinutes(baseRecordedAt, 1),\n sessionKey: \"demo:agentic-commerce-v1\",\n sourceId: \"conversation:buyer-preferences\",\n evidenceHash: \"sha256:buyer-brand-preferences\",\n },\n entityRefs: [\"buyer:self\", \"preference:brand\"],\n tags: [demoTag, commerceTag, \"brand-preference\"],\n metadata: {\n ...commonMetadata,\n story: \"trusted-brand-preferences\",\n commerceFacet: \"brand_preferences\",\n scope: \"personal/commerce\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-agentic-commerce-v1-trusted-size-fit\", seedRunId),\n zone: \"trusted\",\n recordedAt: addMinutes(baseRecordedAt, 4),\n kind: \"memory\",\n summary: \"Buyer wears medium tops, 32x32 pants, and prefers relaxed fit with an easy return window.\",\n provenance: {\n sourceClass: \"user_input\",\n observedAt: addMinutes(baseRecordedAt, 3),\n sessionKey: \"demo:agentic-commerce-v1\",\n sourceId: \"conversation:size-fit\",\n evidenceHash: \"sha256:buyer-size-fit\",\n },\n entityRefs: [\"buyer:self\", \"preference:size-fit\"],\n tags: [demoTag, commerceTag, \"size-fit\"],\n metadata: {\n ...commonMetadata,\n story: \"trusted-size-fit\",\n commerceFacet: \"size_fit\",\n scope: \"personal/commerce\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-agentic-commerce-v1-trusted-budget\", seedRunId),\n zone: \"trusted\",\n recordedAt: addMinutes(baseRecordedAt, 6),\n kind: \"memory\",\n summary: \"Routine apparel recommendations should stay under $180, and any checkout above $75 requires an explicit ask before purchase.\",\n provenance: {\n sourceClass: \"manual\",\n observedAt: addMinutes(baseRecordedAt, 5),\n sessionKey: \"demo:agentic-commerce-v1\",\n sourceId: \"review:buyer-commerce-rules\",\n evidenceHash: \"sha256:buyer-budget-thresholds\",\n },\n entityRefs: [\"buyer:self\", \"rule:ask-before-checkout\", \"constraint:budget\"],\n tags: [demoTag, commerceTag, \"budget-threshold\", \"ask-before-checkout\"],\n metadata: {\n ...commonMetadata,\n story: \"trusted-budget-and-ask-before-checkout\",\n commerceFacet: \"budget_thresholds\",\n askBefore: \"checkout-over-75\",\n scope: \"personal/commerce\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-agentic-commerce-v1-trusted-exclusions\", seedRunId),\n zone: \"trusted\",\n recordedAt: addMinutes(baseRecordedAt, 8),\n kind: \"memory\",\n summary: \"Never suggest leather goods, fragrances, or final-sale shoes for this buyer.\",\n provenance: {\n sourceClass: \"user_input\",\n observedAt: addMinutes(baseRecordedAt, 7),\n sessionKey: \"demo:agentic-commerce-v1\",\n sourceId: \"conversation:excluded-products\",\n evidenceHash: \"sha256:buyer-exclusions\",\n },\n entityRefs: [\"buyer:self\", \"rule:never-suggest\", \"constraint:excluded-products\"],\n tags: [demoTag, commerceTag, \"excluded-products\", \"never-suggest\"],\n metadata: {\n ...commonMetadata,\n story: \"trusted-excluded-products\",\n commerceFacet: \"excluded_products\",\n neverSuggest: \"leather,fragrance,final-sale-shoes\",\n scope: \"personal/commerce\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-agentic-commerce-v1-working-shipping-estimate\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 10),\n kind: \"state\",\n summary: \"Shipping estimator says the weekend-trip gift can arrive before Friday with two-day delivery.\",\n provenance: {\n sourceClass: \"tool_output\",\n observedAt: addMinutes(baseRecordedAt, 9),\n sessionKey: \"demo:agentic-commerce-v1\",\n sourceId: \"tool:shipping-estimate-run-17\",\n evidenceHash: \"sha256:shipping-estimate-weekend-trip\",\n },\n entityRefs: [\"purchase:weekend-trip-gift\", \"constraint:shipping-urgency\"],\n tags: [demoTag, commerceTag, \"shipping-urgency\", \"gift-purchase\"],\n metadata: {\n ...commonMetadata,\n story: \"working-shipping-urgency\",\n commerceFacet: \"shipping_urgency\",\n scope: \"commerce/session\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-agentic-commerce-v1-working-shipping-corroboration\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 12),\n kind: \"external\",\n summary: \"Merchant shipping policy independently confirms two-day delivery cutoff for the same weekend-trip gift window.\",\n provenance: {\n sourceClass: \"web_content\",\n observedAt: addMinutes(baseRecordedAt, 11),\n sessionKey: \"demo:agentic-commerce-v1\",\n sourceId: \"https://merchant.example/shipping/two-day-cutoff\",\n evidenceHash: \"sha256:merchant-two-day-cutoff\",\n },\n entityRefs: [\"purchase:weekend-trip-gift\", \"constraint:shipping-urgency\"],\n tags: [demoTag, commerceTag, \"shipping-urgency\", \"gift-purchase\"],\n metadata: {\n ...commonMetadata,\n story: \"working-shipping-corroboration\",\n commerceFacet: \"shipping_urgency\",\n scope: \"commerce/session\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-agentic-commerce-v1-working-blocked-upsell\", seedRunId),\n zone: \"working\",\n recordedAt: addMinutes(baseRecordedAt, 14),\n kind: \"external\",\n summary: \"Unverified influencer note claims the buyer wants luxury watch gifts over $500.\",\n provenance: {\n sourceClass: \"subagent_trace\",\n observedAt: addMinutes(baseRecordedAt, 13),\n sessionKey: \"demo:agentic-commerce-v1\",\n },\n entityRefs: [\"buyer:self\", \"risk:upsell\"],\n tags: [demoTag, commerceTag, \"blocked-upsell\", \"needs-evidence\"],\n metadata: {\n ...commonMetadata,\n story: \"commerce-blocked-unverified-upsell\",\n commerceFacet: \"risk_tolerance\",\n scope: \"commerce/session\",\n },\n },\n {\n schemaVersion: 1,\n recordId: buildTrustZoneDemoRecordId(\"tz-demo-agentic-commerce-v1-trusted-checkout-boundary\", seedRunId),\n zone: \"trusted\",\n recordedAt: addMinutes(baseRecordedAt, 16),\n kind: \"memory\",\n summary: \"The agent may recommend products and draft a cart, but must ask before checkout, subscription enrollment, or irreversible purchase actions.\",\n provenance: {\n sourceClass: \"manual\",\n observedAt: addMinutes(baseRecordedAt, 15),\n sessionKey: \"demo:agentic-commerce-v1\",\n sourceId: \"review:commerce-action-boundaries\",\n evidenceHash: \"sha256:commerce-action-boundaries\",\n },\n entityRefs: [\"buyer:self\", \"rule:ask-before-checkout\", \"policy:action-confidence\"],\n tags: [demoTag, commerceTag, \"ask-before-checkout\", \"action-confidence\"],\n metadata: {\n ...commonMetadata,\n story: \"trusted-checkout-boundary\",\n commerceFacet: \"ask_before_checkout\",\n riskTolerance: \"low-for-irreversible-purchase-actions\",\n scope: \"personal/commerce\",\n },\n },\n ];\n}\n\nfunction buildTrustZoneDemoRecords(baseRecordedAt: string, scenario: TrustZoneDemoScenario): TrustZoneRecord[] {\n switch (scenario) {\n case \"enterprise-buyer-v1\":\n return buildEnterpriseBuyerTrustZoneDemoRecords(baseRecordedAt, scenario);\n case \"agentic-commerce-v1\":\n return buildAgenticCommerceTrustZoneDemoRecords(baseRecordedAt, scenario);\n }\n}\n\nexport async function seedTrustZoneDemoDataset(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n enabled: boolean;\n scenario?: string;\n recordedAt?: string;\n dryRun?: boolean;\n}): Promise<TrustZoneDemoSeedResult> {\n if (options.enabled !== true) {\n throw new Error(\"trust zone demo seed requires trustZonesEnabled=true\");\n }\n\n const scenario = parseTrustZoneDemoScenario(options.scenario);\n\n const baseRecordedAt = assertIsoRecordedAt(options.recordedAt ?? new Date().toISOString(), \"recordedAt\");\n if (!Number.isFinite(Date.parse(baseRecordedAt))) {\n throw new Error(\"recordedAt must be a valid ISO timestamp\");\n }\n const records = buildTrustZoneDemoRecords(baseRecordedAt, scenario);\n if (options.dryRun === true) {\n return {\n scenario,\n dryRun: true,\n recordsWritten: 0,\n records,\n filePaths: [],\n };\n }\n\n const filePaths: string[] = [];\n for (const record of records) {\n filePaths.push(await recordTrustZoneRecord({\n memoryDir: options.memoryDir,\n trustZoneStoreDir: options.trustZoneStoreDir,\n record,\n }));\n }\n\n return {\n scenario,\n dryRun: false,\n recordsWritten: filePaths.length,\n records,\n filePaths,\n };\n}\n\nexport async function getTrustZoneStoreStatus(options: {\n memoryDir: string;\n trustZoneStoreDir?: string;\n enabled: boolean;\n promotionEnabled: boolean;\n poisoningDefenseEnabled: boolean;\n}): Promise<TrustZoneStoreStatus> {\n const rootDir = resolveTrustZoneStoreDir(options.memoryDir, options.trustZoneStoreDir);\n const zonesDir = path.join(rootDir, \"zones\");\n const { files, entries, invalidRecords } = await readTrustZoneRecordEntries(options);\n const records = entries.map((entry) => entry.record);\n records.sort((a, b) => b.recordedAt.localeCompare(a.recordedAt));\n\n const byZone: Partial<Record<TrustZoneName, number>> = {};\n const byKind: Partial<Record<TrustZoneRecordKind, number>> = {};\n const byTrustBand: Partial<Record<TrustZoneScoreBand, number>> = {};\n let trustScoreTotal = 0;\n for (const record of records) {\n byZone[record.zone] = (byZone[record.zone] ?? 0) + 1;\n byKind[record.kind] = (byKind[record.kind] ?? 0) + 1;\n if (options.poisoningDefenseEnabled === true) {\n const score = scoreTrustZoneProvenance(record);\n byTrustBand[score.band] = (byTrustBand[score.band] ?? 0) + 1;\n trustScoreTotal += score.total;\n }\n }\n\n const averageTrustScore =\n options.poisoningDefenseEnabled === true && records.length > 0\n ? roundTrustScore(trustScoreTotal / records.length)\n : undefined;\n const latestRecordTrustScore =\n options.poisoningDefenseEnabled === true && records[0] ? scoreTrustZoneProvenance(records[0]) : undefined;\n\n return {\n enabled: options.enabled,\n promotionEnabled: options.promotionEnabled,\n poisoningDefenseEnabled: options.poisoningDefenseEnabled,\n rootDir,\n zonesDir,\n records: {\n total: files.length,\n valid: records.length,\n invalid: invalidRecords.length,\n byZone,\n byKind,\n latestRecordId: records[0]?.recordId,\n latestRecordedAt: records[0]?.recordedAt,\n latestZone: records[0]?.zone,\n averageTrustScore,\n byTrustBand: options.poisoningDefenseEnabled === true ? byTrustBand : undefined,\n },\n latestRecord: records[0],\n latestRecordTrustScore,\n invalidRecords,\n };\n}\n"],"mappings":"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","names":[]}
@@ -38,7 +38,8 @@ function normalizeCodexCliFallbackConfig(config) {
38
38
  }
39
39
  function normalizeCodexCliFallbackOptions(options) {
40
40
  return {
41
- ...options.timeoutMs !== void 0 ? { timeoutMs: normalizeCodexCliTimeoutMs(options.timeoutMs) } : {}
41
+ ...options.timeoutMs !== void 0 ? { timeoutMs: normalizeCodexCliTimeoutMs(options.timeoutMs) } : {},
42
+ ...options.signal ? { signal: options.signal } : {}
42
43
  };
43
44
  }
44
45
  function normalizeOptionalString(value, label) {
@@ -80,4 +81,4 @@ export {
80
81
  callCodexCliFallback,
81
82
  __codexCliFallbackTestHooks
82
83
  };
83
- //# sourceMappingURL=chunk-KWBPHZUU.js.map
84
+ //# sourceMappingURL=chunk-RK6F44Y6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/codex-cli-fallback.ts"],"sourcesContent":["import type { CodexCliReasoningEffort } from \"./types.js\";\n\nexport interface CodexCliFallbackMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface CodexCliFallbackConfig {\n apiKey?: string | Record<string, unknown>;\n executable?: unknown;\n codexCliExecutable?: unknown;\n reasoningEffort?: unknown;\n codexCliReasoningEffort?: unknown;\n retryOptions?: {\n timeoutMs?: unknown;\n };\n}\n\nexport interface CodexCliFallbackOptions {\n timeoutMs?: number;\n signal?: AbortSignal;\n}\n\nexport interface CodexCliFallbackResult {\n content: string;\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n };\n}\n\nexport interface CodexCliFallbackRequest {\n config: CodexCliFallbackConfig;\n modelId: string;\n messages: CodexCliFallbackMessage[];\n options: CodexCliFallbackOptions;\n}\n\nexport type CodexCliFallbackRunner = (\n request: CodexCliFallbackRequest,\n) => Promise<CodexCliFallbackResult>;\n\nconst VALID_CODEX_CLI_REASONING_EFFORTS = new Set<CodexCliReasoningEffort>([\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n]);\n\nlet processRunner: CodexCliFallbackRunner | undefined;\n\n/**\n * Registers the process-local Codex CLI transport. Core deliberately does not\n * import child_process so host adapters such as OpenClaw do not ship shell\n * execution in their plugin bundle; benchmark/standalone runtimes opt in.\n */\nexport function setCodexCliFallbackRunnerForProcess(\n runner: CodexCliFallbackRunner | undefined,\n): () => void {\n const previous = processRunner;\n processRunner = runner;\n return () => {\n processRunner = previous;\n };\n}\n\nexport async function callCodexCliFallback(\n config: CodexCliFallbackConfig,\n modelId: string,\n messages: CodexCliFallbackMessage[],\n options: CodexCliFallbackOptions = {},\n): Promise<CodexCliFallbackResult> {\n if (!processRunner) {\n throw new Error(\n 'codex-cli fallback transport is not registered; install a runner with setCodexCliFallbackRunnerForProcess() before using api: \"codex-cli\"',\n );\n }\n\n return await processRunner({\n config: normalizeCodexCliFallbackConfig(config),\n modelId: normalizeCodexCliModel(modelId),\n messages,\n options: normalizeCodexCliFallbackOptions(options),\n });\n}\n\nfunction normalizeCodexCliFallbackConfig(\n config: CodexCliFallbackConfig,\n): CodexCliFallbackConfig {\n return {\n ...config,\n ...(config.executable !== undefined\n ? { executable: normalizeOptionalString(config.executable, \"codex-cli executable\") }\n : {}),\n ...(config.codexCliExecutable !== undefined\n ? { codexCliExecutable: normalizeOptionalString(config.codexCliExecutable, \"codex-cli executable\") }\n : {}),\n ...(config.reasoningEffort !== undefined\n ? { reasoningEffort: normalizeCodexCliReasoningEffort(config.reasoningEffort) }\n : {}),\n ...(config.codexCliReasoningEffort !== undefined\n ? { codexCliReasoningEffort: normalizeCodexCliReasoningEffort(config.codexCliReasoningEffort) }\n : {}),\n ...(config.retryOptions?.timeoutMs !== undefined\n ? { retryOptions: { timeoutMs: normalizeCodexCliTimeoutMs(config.retryOptions.timeoutMs) } }\n : {}),\n };\n}\n\nfunction normalizeCodexCliFallbackOptions(\n options: CodexCliFallbackOptions,\n): CodexCliFallbackOptions {\n return {\n ...(options.timeoutMs !== undefined\n ? { timeoutMs: normalizeCodexCliTimeoutMs(options.timeoutMs) }\n : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n };\n}\n\nfunction normalizeOptionalString(value: unknown, label: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${label} must be a non-empty string`);\n }\n return value.trim();\n}\n\nfunction normalizeCodexCliModel(value: string): string {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n throw new Error(\"codex-cli model must be a non-empty string\");\n }\n return trimmed;\n}\n\nfunction normalizeCodexCliReasoningEffort(value: unknown): CodexCliReasoningEffort {\n if (typeof value !== \"string\") {\n throw new Error(\"codex-cli reasoningEffort must be one of low, medium, high, xhigh\");\n }\n const normalized = value.trim().toLowerCase();\n if (VALID_CODEX_CLI_REASONING_EFFORTS.has(normalized as CodexCliReasoningEffort)) {\n return normalized as CodexCliReasoningEffort;\n }\n throw new Error(\"codex-cli reasoningEffort must be one of low, medium, high, xhigh\");\n}\n\nfunction normalizeCodexCliTimeoutMs(value: unknown): number {\n const parsed = typeof value === \"number\"\n ? value\n : typeof value === \"string\" && value.trim().length > 0\n ? Number(value)\n : NaN;\n if (!Number.isFinite(parsed) || !Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\"codex-cli timeoutMs must be a positive integer\");\n }\n return parsed;\n}\n\nexport const __codexCliFallbackTestHooks = {\n setRunCodexCliForTest: setCodexCliFallbackRunnerForProcess,\n};\n"],"mappings":";AA2CA,IAAM,oCAAoC,oBAAI,IAA6B;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAI;AAOG,SAAS,oCACd,QACY;AACZ,QAAM,WAAW;AACjB,kBAAgB;AAChB,SAAO,MAAM;AACX,oBAAgB;AAAA,EAClB;AACF;AAEA,eAAsB,qBACpB,QACA,SACA,UACA,UAAmC,CAAC,GACH;AACjC,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,cAAc;AAAA,IACzB,QAAQ,gCAAgC,MAAM;AAAA,IAC9C,SAAS,uBAAuB,OAAO;AAAA,IACvC;AAAA,IACA,SAAS,iCAAiC,OAAO;AAAA,EACnD,CAAC;AACH;AAEA,SAAS,gCACP,QACwB;AACxB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,OAAO,eAAe,SACtB,EAAE,YAAY,wBAAwB,OAAO,YAAY,sBAAsB,EAAE,IACjF,CAAC;AAAA,IACL,GAAI,OAAO,uBAAuB,SAC9B,EAAE,oBAAoB,wBAAwB,OAAO,oBAAoB,sBAAsB,EAAE,IACjG,CAAC;AAAA,IACL,GAAI,OAAO,oBAAoB,SAC3B,EAAE,iBAAiB,iCAAiC,OAAO,eAAe,EAAE,IAC5E,CAAC;AAAA,IACL,GAAI,OAAO,4BAA4B,SACnC,EAAE,yBAAyB,iCAAiC,OAAO,uBAAuB,EAAE,IAC5F,CAAC;AAAA,IACL,GAAI,OAAO,cAAc,cAAc,SACnC,EAAE,cAAc,EAAE,WAAW,2BAA2B,OAAO,aAAa,SAAS,EAAE,EAAE,IACzF,CAAC;AAAA,EACP;AACF;AAEA,SAAS,iCACP,SACyB;AACzB,SAAO;AAAA,IACL,GAAI,QAAQ,cAAc,SACtB,EAAE,WAAW,2BAA2B,QAAQ,SAAS,EAAE,IAC3D,CAAC;AAAA,IACL,GAAI,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,EACrD;AACF;AAEA,SAAS,wBAAwB,OAAgB,OAAuB;AACtE,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,UAAM,IAAI,MAAM,GAAG,KAAK,6BAA6B;AAAA,EACvD;AACA,SAAO,MAAM,KAAK;AACpB;AAEA,SAAS,uBAAuB,OAAuB;AACrD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,SAAO;AACT;AAEA,SAAS,iCAAiC,OAAyC;AACjF,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAI,kCAAkC,IAAI,UAAqC,GAAG;AAChF,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,mEAAmE;AACrF;AAEA,SAAS,2BAA2B,OAAwB;AAC1D,QAAM,SAAS,OAAO,UAAU,WAC5B,QACA,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IACjD,OAAO,KAAK,IACZ;AACN,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,CAAC,OAAO,UAAU,MAAM,KAAK,UAAU,GAAG;AACxE,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,SAAO;AACT;AAEO,IAAM,8BAA8B;AAAA,EACzC,uBAAuB;AACzB;","names":[]}
@@ -1,27 +1,27 @@
1
1
  import {
2
2
  EngramMcpServer
3
- } from "./chunk-Y5KDIOKF.js";
3
+ } from "./chunk-XAMBKFQS.js";
4
4
  import {
5
5
  EngramAccessInputError
6
- } from "./chunk-WGK4VHGP.js";
6
+ } from "./chunk-MNU6ZBWT.js";
7
7
  import {
8
8
  isTrustZoneName
9
- } from "./chunk-EQINRHYR.js";
9
+ } from "./chunk-QDZ2RLEC.js";
10
10
  import {
11
11
  subscribeGraphEvents
12
12
  } from "./chunk-WIICJPET.js";
13
+ import {
14
+ isRecallDisclosure
15
+ } from "./chunk-23ZZK64Y.js";
13
16
  import {
14
17
  expandTildePath
15
18
  } from "./chunk-IXEJRKCZ.js";
16
- import {
17
- isRecallDisclosure
18
- } from "./chunk-VQXK37XA.js";
19
19
  import {
20
20
  log
21
21
  } from "./chunk-2ODBA7MQ.js";
22
22
  import {
23
23
  validateRequest
24
- } from "./chunk-A4ACKWIW.js";
24
+ } from "./chunk-U5JMRGKX.js";
25
25
 
26
26
  // src/access-http.ts
27
27
  import { createServer } from "http";
@@ -521,6 +521,7 @@ var EngramAccessHttpServer = class {
521
521
  const response = await this.service.recall({
522
522
  query: body.query ?? "",
523
523
  sessionKey: body.sessionKey,
524
+ authenticatedPrincipal: this.resolveRequestPrincipal(req),
524
525
  namespace: this.resolveNamespace(req, body.namespace),
525
526
  topK: body.topK,
526
527
  mode: body.mode,
@@ -589,6 +590,11 @@ var EngramAccessHttpServer = class {
589
590
  this.respondJson(res, 200, response);
590
591
  return;
591
592
  }
593
+ if (req.method === "POST" && (pathname === "/engram/v1/action-confidence" || pathname === "/remnic/v1/action-confidence")) {
594
+ const body = await this.readValidatedBody(req, "actionConfidence");
595
+ this.respondJson(res, 200, await this.service.actionConfidence(body));
596
+ return;
597
+ }
592
598
  if (req.method === "GET" && pathname === "/engram/v1/recall/tier-explain") {
593
599
  const sessionParam = parsed.searchParams.get("session");
594
600
  const sessionKey = sessionParam && sessionParam.length > 0 ? sessionParam : void 0;
@@ -709,6 +715,32 @@ var EngramAccessHttpServer = class {
709
715
  this.respondJson(res, 200, response);
710
716
  return;
711
717
  }
718
+ if (req.method === "POST" && (pathname === "/engram/v1/lcm/compaction/flush" || pathname === "/remnic/v1/lcm/compaction/flush")) {
719
+ const body = await this.readValidatedBody(req, "lcmCompactionFlush");
720
+ this.ensureWriteRateLimitAvailable();
721
+ const response = await this.service.lcmCompactionFlush({
722
+ sessionKey: body.sessionKey,
723
+ namespace: this.resolveNamespace(req, body.namespace),
724
+ authenticatedPrincipal: this.resolveRequestPrincipal(req)
725
+ });
726
+ this.recordWriteRateLimitHit();
727
+ this.respondJson(res, 200, response);
728
+ return;
729
+ }
730
+ if (req.method === "POST" && (pathname === "/engram/v1/lcm/compaction/record" || pathname === "/remnic/v1/lcm/compaction/record")) {
731
+ const body = await this.readValidatedBody(req, "lcmCompactionRecord");
732
+ this.ensureWriteRateLimitAvailable();
733
+ const response = await this.service.lcmCompactionRecord({
734
+ sessionKey: body.sessionKey,
735
+ namespace: this.resolveNamespace(req, body.namespace),
736
+ tokensBefore: body.tokensBefore,
737
+ tokensAfter: body.tokensAfter,
738
+ authenticatedPrincipal: this.resolveRequestPrincipal(req)
739
+ });
740
+ this.recordWriteRateLimitHit();
741
+ this.respondJson(res, 200, response);
742
+ return;
743
+ }
712
744
  if (req.method === "GET" && pathname === "/engram/v1/lcm/status") {
713
745
  this.respondJson(res, 200, await this.service.lcmStatus());
714
746
  return;
@@ -1119,7 +1151,7 @@ var EngramAccessHttpServer = class {
1119
1151
  }
1120
1152
  if (req.method === "POST" && pathname === "/engram/v1/contradiction-scan") {
1121
1153
  const body = await this.readJsonBody(req);
1122
- const { runContradictionScan } = await import("./contradiction-scan-3Z6YW7YA.js");
1154
+ const { runContradictionScan } = await import("./contradiction-scan-QTXAMBUA.js");
1123
1155
  const result = await runContradictionScan({
1124
1156
  storage: this.service.storageRef,
1125
1157
  config: this.service.configRef,
@@ -1370,7 +1402,7 @@ var EngramAccessHttpServer = class {
1370
1402
  const toolArgs = request.params?.arguments;
1371
1403
  const dreamsRunDryRun = (toolName === "engram.dreams_run" || toolName === "remnic.dreams_run") && toolArgs !== null && typeof toolArgs === "object" && !Array.isArray(toolArgs) && toolArgs.dryRun === true;
1372
1404
  const memoryActionApplyDryRun = (toolName === "engram.memory_action_apply" || toolName === "remnic.memory_action_apply") && toolArgs !== null && typeof toolArgs === "object" && !Array.isArray(toolArgs) && toolArgs.dryRun === true;
1373
- const isMcpWrite = request.method === "tools/call" && (toolName === "engram.memory_store" || toolName === "remnic.memory_store" || toolName === "engram.suggestion_submit" || toolName === "remnic.suggestion_submit" || toolName === "engram.observe" || toolName === "remnic.observe" || toolName === "engram.capsule_export" || toolName === "remnic.capsule_export" || toolName === "engram.capsule_import" || toolName === "remnic.capsule_import" || !dreamsRunDryRun && (toolName === "engram.dreams_run" || toolName === "remnic.dreams_run") || !memoryActionApplyDryRun && (toolName === "engram.memory_action_apply" || toolName === "remnic.memory_action_apply"));
1405
+ const isMcpWrite = request.method === "tools/call" && (toolName === "engram.memory_store" || toolName === "remnic.memory_store" || toolName === "engram.suggestion_submit" || toolName === "remnic.suggestion_submit" || toolName === "engram.observe" || toolName === "remnic.observe" || toolName === "engram.lcm_compaction_flush" || toolName === "remnic.lcm_compaction_flush" || toolName === "engram.lcm_compaction_record" || toolName === "remnic.lcm_compaction_record" || toolName === "engram.capsule_export" || toolName === "remnic.capsule_export" || toolName === "engram.capsule_import" || toolName === "remnic.capsule_import" || !dreamsRunDryRun && (toolName === "engram.dreams_run" || toolName === "remnic.dreams_run") || !memoryActionApplyDryRun && (toolName === "engram.memory_action_apply" || toolName === "remnic.memory_action_apply"));
1374
1406
  if (isMcpWrite) {
1375
1407
  this.ensureWriteRateLimitAvailable();
1376
1408
  }
@@ -1551,4 +1583,4 @@ var EngramAccessHttpServer = class {
1551
1583
  export {
1552
1584
  EngramAccessHttpServer
1553
1585
  };
1554
- //# sourceMappingURL=chunk-36CTNQY7.js.map
1586
+ //# sourceMappingURL=chunk-RVPLBATS.js.map