@remnic/core 1.1.10 → 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 (299) 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-BTTNyo1i.d.ts → access-service-DDjzFALq.d.ts} +54 -5
  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-5GCNE7CN.js → chunk-BZSQEPRW.js} +454 -140
  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-BrEwQTnW.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 +19 -1
  144. package/dist/explicit-cue-recall.js +10 -4
  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 +289 -115
  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-6IvQ-Phj.d.ts → orchestrator-DDMPqU6R.d.ts} +10 -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/sdk-compat.d.ts +3 -2
  213. package/dist/sdk-compat.js.map +1 -1
  214. package/dist/semantic-consolidation.d.ts +1 -1
  215. package/dist/semantic-consolidation.js +6 -6
  216. package/dist/semantic-rule-promotion.js +5 -5
  217. package/dist/semantic-rule-verifier.d.ts +1 -1
  218. package/dist/semantic-rule-verifier.js +6 -6
  219. package/dist/session-observer-bands.d.ts +1 -1
  220. package/dist/session-observer-state.d.ts +1 -1
  221. package/dist/signal.d.ts +1 -1
  222. package/dist/storage.d.ts +3 -1
  223. package/dist/storage.js +4 -4
  224. package/dist/summarizer.d.ts +1 -1
  225. package/dist/summarizer.js +6 -6
  226. package/dist/summary-snapshot.d.ts +1 -1
  227. package/dist/targeted-fact-recall.d.ts +17 -0
  228. package/dist/targeted-fact-recall.js +11 -0
  229. package/dist/targeted-fact-recall.js.map +1 -0
  230. package/dist/telemetry-transcript.d.ts +7 -0
  231. package/dist/telemetry-transcript.js +16 -0
  232. package/dist/telemetry-transcript.js.map +1 -0
  233. package/dist/temporal-supersession.d.ts +1 -1
  234. package/dist/temporal-supersession.js +2 -1
  235. package/dist/temporal-validity.d.ts +1 -1
  236. package/dist/threading.d.ts +1 -1
  237. package/dist/tier-migration.d.ts +1 -1
  238. package/dist/tier-routing.d.ts +1 -1
  239. package/dist/tokens.js +1 -1
  240. package/dist/topics.d.ts +1 -1
  241. package/dist/transcript.d.ts +1 -1
  242. package/dist/trust-zones.d.ts +3 -2
  243. package/dist/trust-zones.js +1 -1
  244. package/dist/types.d.ts +60 -2
  245. package/dist/types.js +1 -1
  246. package/dist/user-model.d.ts +37 -0
  247. package/dist/user-model.js +28 -0
  248. package/dist/user-model.js.map +1 -0
  249. package/dist/utility-runtime.d.ts +1 -1
  250. package/dist/verified-recall.js +6 -6
  251. package/package.json +1 -1
  252. package/dist/chunk-2YMTO4ZJ.js.map +0 -1
  253. package/dist/chunk-363MWCD3.js.map +0 -1
  254. package/dist/chunk-36CTNQY7.js.map +0 -1
  255. package/dist/chunk-5GCNE7CN.js.map +0 -1
  256. package/dist/chunk-6AUUAZEX.js.map +0 -1
  257. package/dist/chunk-6Z6UH6TK.js.map +0 -1
  258. package/dist/chunk-74WWN7ZW.js +0 -82
  259. package/dist/chunk-74WWN7ZW.js.map +0 -1
  260. package/dist/chunk-A4ACKWIW.js.map +0 -1
  261. package/dist/chunk-EQINRHYR.js.map +0 -1
  262. package/dist/chunk-ERUDW6DU.js +0 -965
  263. package/dist/chunk-ERUDW6DU.js.map +0 -1
  264. package/dist/chunk-GGD5W7TB.js.map +0 -1
  265. package/dist/chunk-IBX3VFOM.js.map +0 -1
  266. package/dist/chunk-KWBPHZUU.js.map +0 -1
  267. package/dist/chunk-MCC6KDQF.js.map +0 -1
  268. package/dist/chunk-NN3LPQ5D.js.map +0 -1
  269. package/dist/chunk-O4XJUPSF.js.map +0 -1
  270. package/dist/chunk-S3IP6R6K.js.map +0 -1
  271. package/dist/chunk-SRBJUAMP.js.map +0 -1
  272. package/dist/chunk-VQXK37XA.js.map +0 -1
  273. package/dist/chunk-VTU2B4VF.js.map +0 -1
  274. package/dist/chunk-VX2IUQFE.js.map +0 -1
  275. package/dist/chunk-WGK4VHGP.js.map +0 -1
  276. package/dist/chunk-Y5KDIOKF.js.map +0 -1
  277. package/dist/chunk-Z5S5HNGY.js.map +0 -1
  278. package/dist/chunk-ZTSE2ZJ6.js.map +0 -1
  279. package/dist/contradiction-scan-3Z6YW7YA.js.map +0 -1
  280. /package/dist/{capsule-export-LLEVB2RG.js.map → action-confidence.js.map} +0 -0
  281. /package/dist/{capsule-import-UW45R2MZ.js.map → capsule-export-7QNCBZOQ.js.map} +0 -0
  282. /package/dist/{engine-FOC3IJLA.js.map → capsule-import-EPBHD2EN.js.map} +0 -0
  283. /package/dist/{chunk-HJYHRE4S.js.map → chunk-242S3I2A.js.map} +0 -0
  284. /package/dist/{chunk-EYNQTST2.js.map → chunk-4YM32CRU.js.map} +0 -0
  285. /package/dist/{chunk-PHNGXFQ6.js.map → chunk-7V22HTMD.js.map} +0 -0
  286. /package/dist/{chunk-P73JTV34.js.map → chunk-BBE34QBJ.js.map} +0 -0
  287. /package/dist/{chunk-C5HUWVH2.js.map → chunk-CPKTBRS2.js.map} +0 -0
  288. /package/dist/{chunk-I6BQZSML.js.map → chunk-DZZPC36E.js.map} +0 -0
  289. /package/dist/{chunk-4DXC6HQQ.js.map → chunk-FQDPCE3I.js.map} +0 -0
  290. /package/dist/{chunk-57QNCUEZ.js.map → chunk-HL5LRPNA.js.map} +0 -0
  291. /package/dist/{chunk-QIGOEM65.js.map → chunk-IB3BFHGN.js.map} +0 -0
  292. /package/dist/{chunk-RXTFCYQF.js.map → chunk-JESOB2HO.js.map} +0 -0
  293. /package/dist/{chunk-LIO5X3CM.js.map → chunk-UVMUAWVT.js.map} +0 -0
  294. /package/dist/{chunk-PB5KW5PL.js.map → chunk-WEJG4TB5.js.map} +0 -0
  295. /package/dist/{chunk-KBYWQWSB.js.map → chunk-X7HPGUVG.js.map} +0 -0
  296. /package/dist/{chunk-ZL4S7ARC.js.map → chunk-Y3VMVTYX.js.map} +0 -0
  297. /package/dist/{chunk-6XA7UN4Z.js.map → chunk-ZNQN6ZTA.js.map} +0 -0
  298. /package/dist/{chunk-WTFWLUSX.js.map → chunk-ZVTKDVVM.js.map} +0 -0
  299. /package/dist/{memory-governance-F3QOJGEY.js.map → engine-35M5BKQ7.js.map} +0 -0
@@ -1,82 +0,0 @@
1
- // src/evidence-pack.ts
2
- var DEFAULT_MAX_ITEM_CHARS = 1200;
3
- function buildEvidencePack(items, options) {
4
- const budget = normalizePositiveInteger(options.maxChars);
5
- if (budget <= 0 || items.length === 0) {
6
- return "";
7
- }
8
- const maxItemChars = normalizePositiveInteger(
9
- options.maxItemChars ?? DEFAULT_MAX_ITEM_CHARS
10
- );
11
- if (maxItemChars <= 0) {
12
- return "";
13
- }
14
- const title = options.title ?? "Evidence";
15
- const lines = [`## ${title}`];
16
- const seenIds = /* @__PURE__ */ new Set();
17
- const seenContent = /* @__PURE__ */ new Set();
18
- let used = lines[0].length;
19
- for (const item of items) {
20
- const content = item.content.trim();
21
- if (!content) continue;
22
- const id = item.id ?? evidenceItemFallbackId(item);
23
- if (id && seenIds.has(id)) continue;
24
- const contentKey = normalizeEvidenceContent(content);
25
- if (seenContent.has(contentKey)) continue;
26
- const label = formatEvidenceLabel(item);
27
- const clipped = clipText(content, maxItemChars);
28
- const block = `${label}: ${clipped}`;
29
- const separatorLength = lines.length > 0 ? 2 : 0;
30
- const remaining = budget - used - separatorLength;
31
- if (remaining <= 0) break;
32
- const finalBlock = block.length > remaining ? clipText(block, remaining) : block;
33
- if (!finalBlock.trim()) break;
34
- lines.push(finalBlock);
35
- used += separatorLength + finalBlock.length;
36
- if (id) seenIds.add(id);
37
- seenContent.add(contentKey);
38
- }
39
- return lines.length === 1 ? "" : lines.join("\n\n");
40
- }
41
- function normalizePositiveInteger(value) {
42
- if (!Number.isFinite(value) || value <= 0) {
43
- return 0;
44
- }
45
- return Math.floor(value);
46
- }
47
- function evidenceItemFallbackId(item) {
48
- if (item.sessionId && typeof item.turnIndex === "number") {
49
- return `${item.sessionId}:${item.turnIndex}`;
50
- }
51
- return void 0;
52
- }
53
- function normalizeEvidenceContent(content) {
54
- return content.toLowerCase().replace(/\s+/g, " ").trim();
55
- }
56
- function formatEvidenceLabel(item) {
57
- const parts = [];
58
- if (item.sessionId) parts.push(item.sessionId);
59
- if (typeof item.turnIndex === "number") parts.push(`turn ${item.turnIndex}`);
60
- if (item.role) parts.push(item.role);
61
- if (typeof item.score === "number" && Number.isFinite(item.score)) {
62
- parts.push(`score ${item.score.toFixed(3)}`);
63
- }
64
- return parts.length > 0 ? `[${parts.join(", ")}]` : "[evidence]";
65
- }
66
- function clipText(text, maxChars) {
67
- if (text.length <= maxChars) {
68
- return text;
69
- }
70
- if (maxChars <= 1) {
71
- return text.slice(0, maxChars);
72
- }
73
- if (maxChars <= 3) {
74
- return text.slice(0, maxChars);
75
- }
76
- return `${text.slice(0, maxChars - 3).trimEnd()}...`;
77
- }
78
-
79
- export {
80
- buildEvidencePack
81
- };
82
- //# sourceMappingURL=chunk-74WWN7ZW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/evidence-pack.ts"],"sourcesContent":["export interface EvidencePackItem {\n id?: string;\n sessionId?: string;\n turnIndex?: number;\n role?: string;\n content: string;\n score?: number;\n}\n\nexport interface EvidencePackOptions {\n title?: string;\n maxChars: number;\n maxItemChars?: number;\n}\n\nconst DEFAULT_MAX_ITEM_CHARS = 1_200;\n\nexport function buildEvidencePack(\n items: readonly EvidencePackItem[],\n options: EvidencePackOptions,\n): string {\n const budget = normalizePositiveInteger(options.maxChars);\n if (budget <= 0 || items.length === 0) {\n return \"\";\n }\n\n const maxItemChars = normalizePositiveInteger(\n options.maxItemChars ?? DEFAULT_MAX_ITEM_CHARS,\n );\n if (maxItemChars <= 0) {\n return \"\";\n }\n\n const title = options.title ?? \"Evidence\";\n const lines: string[] = [`## ${title}`];\n const seenIds = new Set<string>();\n const seenContent = new Set<string>();\n let used = lines[0]!.length;\n\n for (const item of items) {\n const content = item.content.trim();\n if (!content) continue;\n\n const id = item.id ?? evidenceItemFallbackId(item);\n if (id && seenIds.has(id)) continue;\n\n const contentKey = normalizeEvidenceContent(content);\n if (seenContent.has(contentKey)) continue;\n\n const label = formatEvidenceLabel(item);\n const clipped = clipText(content, maxItemChars);\n const block = `${label}: ${clipped}`;\n const separatorLength = lines.length > 0 ? 2 : 0;\n const remaining = budget - used - separatorLength;\n if (remaining <= 0) break;\n\n const finalBlock =\n block.length > remaining ? clipText(block, remaining) : block;\n if (!finalBlock.trim()) break;\n\n lines.push(finalBlock);\n used += separatorLength + finalBlock.length;\n if (id) seenIds.add(id);\n seenContent.add(contentKey);\n }\n\n return lines.length === 1 ? \"\" : lines.join(\"\\n\\n\");\n}\n\nfunction normalizePositiveInteger(value: number): number {\n if (!Number.isFinite(value) || value <= 0) {\n return 0;\n }\n return Math.floor(value);\n}\n\nfunction evidenceItemFallbackId(item: EvidencePackItem): string | undefined {\n if (item.sessionId && typeof item.turnIndex === \"number\") {\n return `${item.sessionId}:${item.turnIndex}`;\n }\n return undefined;\n}\n\nfunction normalizeEvidenceContent(content: string): string {\n return content.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nfunction formatEvidenceLabel(item: EvidencePackItem): string {\n const parts: string[] = [];\n if (item.sessionId) parts.push(item.sessionId);\n if (typeof item.turnIndex === \"number\") parts.push(`turn ${item.turnIndex}`);\n if (item.role) parts.push(item.role);\n if (typeof item.score === \"number\" && Number.isFinite(item.score)) {\n parts.push(`score ${item.score.toFixed(3)}`);\n }\n return parts.length > 0 ? `[${parts.join(\", \")}]` : \"[evidence]\";\n}\n\nfunction clipText(text: string, maxChars: number): string {\n if (text.length <= maxChars) {\n return text;\n }\n if (maxChars <= 1) {\n return text.slice(0, maxChars);\n }\n if (maxChars <= 3) {\n return text.slice(0, maxChars);\n }\n return `${text.slice(0, maxChars - 3).trimEnd()}...`;\n}\n"],"mappings":";AAeA,IAAM,yBAAyB;AAExB,SAAS,kBACd,OACA,SACQ;AACR,QAAM,SAAS,yBAAyB,QAAQ,QAAQ;AACxD,MAAI,UAAU,KAAK,MAAM,WAAW,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe;AAAA,IACnB,QAAQ,gBAAgB;AAAA,EAC1B;AACA,MAAI,gBAAgB,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,QAAkB,CAAC,MAAM,KAAK,EAAE;AACtC,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,cAAc,oBAAI,IAAY;AACpC,MAAI,OAAO,MAAM,CAAC,EAAG;AAErB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,QAAQ,KAAK;AAClC,QAAI,CAAC,QAAS;AAEd,UAAM,KAAK,KAAK,MAAM,uBAAuB,IAAI;AACjD,QAAI,MAAM,QAAQ,IAAI,EAAE,EAAG;AAE3B,UAAM,aAAa,yBAAyB,OAAO;AACnD,QAAI,YAAY,IAAI,UAAU,EAAG;AAEjC,UAAM,QAAQ,oBAAoB,IAAI;AACtC,UAAM,UAAU,SAAS,SAAS,YAAY;AAC9C,UAAM,QAAQ,GAAG,KAAK,KAAK,OAAO;AAClC,UAAM,kBAAkB,MAAM,SAAS,IAAI,IAAI;AAC/C,UAAM,YAAY,SAAS,OAAO;AAClC,QAAI,aAAa,EAAG;AAEpB,UAAM,aACJ,MAAM,SAAS,YAAY,SAAS,OAAO,SAAS,IAAI;AAC1D,QAAI,CAAC,WAAW,KAAK,EAAG;AAExB,UAAM,KAAK,UAAU;AACrB,YAAQ,kBAAkB,WAAW;AACrC,QAAI,GAAI,SAAQ,IAAI,EAAE;AACtB,gBAAY,IAAI,UAAU;AAAA,EAC5B;AAEA,SAAO,MAAM,WAAW,IAAI,KAAK,MAAM,KAAK,MAAM;AACpD;AAEA,SAAS,yBAAyB,OAAuB;AACvD,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,WAAO;AAAA,EACT;AACA,SAAO,KAAK,MAAM,KAAK;AACzB;AAEA,SAAS,uBAAuB,MAA4C;AAC1E,MAAI,KAAK,aAAa,OAAO,KAAK,cAAc,UAAU;AACxD,WAAO,GAAG,KAAK,SAAS,IAAI,KAAK,SAAS;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAyB;AACzD,SAAO,QAAQ,YAAY,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzD;AAEA,SAAS,oBAAoB,MAAgC;AAC3D,QAAM,QAAkB,CAAC;AACzB,MAAI,KAAK,UAAW,OAAM,KAAK,KAAK,SAAS;AAC7C,MAAI,OAAO,KAAK,cAAc,SAAU,OAAM,KAAK,QAAQ,KAAK,SAAS,EAAE;AAC3E,MAAI,KAAK,KAAM,OAAM,KAAK,KAAK,IAAI;AACnC,MAAI,OAAO,KAAK,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,GAAG;AACjE,UAAM,KAAK,SAAS,KAAK,MAAM,QAAQ,CAAC,CAAC,EAAE;AAAA,EAC7C;AACA,SAAO,MAAM,SAAS,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,MAAM;AACtD;AAEA,SAAS,SAAS,MAAc,UAA0B;AACxD,MAAI,KAAK,UAAU,UAAU;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,YAAY,GAAG;AACjB,WAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,EAC/B;AACA,MAAI,YAAY,GAAG;AACjB,WAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,EAC/B;AACA,SAAO,GAAG,KAAK,MAAM,GAAG,WAAW,CAAC,EAAE,QAAQ,CAAC;AACjD;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/access-schema.ts"],"sourcesContent":["// Request/response schema validation for the Remnic HTTP API.\n// Uses zod for runtime validation — returns structured 400 errors with\n// field-level detail so consumers get clear feedback on malformed requests.\n\nimport { z } from \"zod\";\nimport { isValidCapsuleSince } from \"./transfer/capsule-export.js\";\nimport { CAPSULE_ID_PATTERN } from \"./transfer/types.js\";\n\n// ---------------------------------------------------------------------------\n// Error formatting\n// ---------------------------------------------------------------------------\n\nexport interface SchemaValidationError {\n error: string;\n code: \"validation_error\";\n details: Array<{ field: string; message: string }>;\n}\n\nexport function formatZodError(error: z.ZodError): SchemaValidationError {\n return {\n error: \"request validation failed\",\n code: \"validation_error\",\n details: error.issues.map((issue) => ({\n field: issue.path.join(\".\") || \"(root)\",\n message: issue.message,\n })),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Shared fields\n// ---------------------------------------------------------------------------\n\nconst namespaceSchema = z.string().trim().max(256).optional();\nconst sessionKeySchema = z.string().trim().min(1).max(512).optional();\nconst idempotencyKeySchema = z.string().trim().min(1).max(256).optional();\nconst dryRunSchema = z.boolean().optional();\nconst schemaVersionSchema = z.number().int().optional();\n\n// ---------------------------------------------------------------------------\n// Recall\n// ---------------------------------------------------------------------------\n\n/**\n * Coding-agent context (issue #569). Optional payload that connectors may\n * ship with a recall request so the project/branch namespace overlay\n * applies to that recall. All fields are validated per CLAUDE.md #51 —\n * empty-string projectId / rootPath is rejected, not silently accepted.\n */\nexport const codingContextSchema = z\n .object({\n projectId: z.string().trim().min(1, \"codingContext.projectId is required\").max(128),\n branch: z.string().trim().max(256).nullable(),\n rootPath: z.string().trim().min(1, \"codingContext.rootPath is required\").max(1024),\n defaultBranch: z.string().trim().max(256).nullable(),\n })\n .nullable();\n\n/**\n * Recall disclosure depth (issue #677). Mirrors the `RecallDisclosure`\n * type in `types.ts` — keep these in sync. Default-application happens\n * inside `EngramAccessService.recall()`; the schema only accepts/rejects.\n * Invalid values throw a structured 400 instead of silently defaulting,\n * per CLAUDE.md rule 51.\n */\nexport const recallDisclosureSchema = z.enum([\"chunk\", \"section\", \"raw\"]);\n\n/**\n * Tag-match semantics (issue #689). `any` (default when `tags` is provided\n * and `tagMatch` is omitted) admits a result when it carries at least one\n * of the filter tags. `all` requires every filter tag to be present.\n * Schema rejects unknown values up front — never silently defaults\n * (CLAUDE.md rule 51).\n */\nexport const tagMatchSchema = z.enum([\"any\", \"all\"]);\n\nexport const recallRequestSchema = z.object({\n query: z.string().min(1, \"query is required\"),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n topK: z.number().int().min(0).max(200).optional(),\n mode: z.enum([\"auto\", \"no_recall\", \"minimal\", \"full\", \"graph_mode\"]).optional(),\n includeDebug: z.boolean().optional(),\n disclosure: recallDisclosureSchema.optional(),\n codingContext: codingContextSchema.optional(),\n /** Working directory for auto git-context resolution (issue #569). */\n cwd: z.string().trim().min(1, \"cwd must be non-empty when provided\").max(2048).optional(),\n /**\n * Arbitrary project tag for non-git-based project scoping (issue #569).\n * Creates a coding context with `projectId: \"tag:<projectTag>\"`.\n */\n projectTag: z.string().trim().min(1, \"projectTag must be non-empty when provided\").max(256).optional(),\n /**\n * Historical recall pin (issue #680). ISO 8601 timestamp. The\n * schema only enforces the basic shape; the access service runs\n * `Date.parse` and emits a structured 400 on malformed input\n * (CLAUDE.md rule 51).\n */\n asOf: z.string().trim().min(1, \"asOf must be a non-empty ISO 8601 timestamp\").max(64).optional(),\n /**\n * Free-form recall tag filter (issue #689). When provided, recall results\n * whose frontmatter `tags` do not match the filter are removed before the\n * response is returned. Comparison is case-sensitive exact match.\n */\n tags: z.array(z.string().trim().min(1).max(256)).max(50).optional(),\n /**\n * Match mode for `tags` (issue #689). Defaults to `\"any\"` when `tags` is\n * provided and `tagMatch` is omitted. Ignored when `tags` is absent.\n */\n tagMatch: tagMatchSchema.optional(),\n /**\n * Include graph edges below `graphTraversalConfidenceFloor` for diagnostic\n * recall traversal (issue #681). Defaults to false.\n */\n includeLowConfidence: z.boolean().optional(),\n});\n\nexport const recallExplainRequestSchema = z.object({\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n});\n\n/**\n * Standalone \"set coding context\" request. Used by the HTTP endpoint\n * `POST /engram/v1/coding-context` and the MCP `remnic.set_coding_context`\n * tool (PR 7). `codingContext: null` clears the attached context.\n */\nexport const setCodingContextRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n codingContext: codingContextSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Observe\n// ---------------------------------------------------------------------------\n\nconst messageSchema = z.object({\n role: z.enum([\"user\", \"assistant\"]),\n content: z.string().min(1, \"message content must be non-empty\"),\n sourceFormat: z\n .enum([\"openai\", \"anthropic\", \"openclaw\", \"lossless-claw\", \"remnic\"])\n .nullable()\n .optional(),\n rawContent: z.unknown().nullable().optional(),\n parts: z\n .array(\n z.object({\n ordinal: z.number().int().min(0).nullable().optional(),\n kind: z.enum([\n \"text\",\n \"tool_call\",\n \"tool_result\",\n \"patch\",\n \"file_read\",\n \"file_write\",\n \"step_start\",\n \"step_finish\",\n \"snapshot\",\n \"retry\",\n ]),\n payload: z.record(z.string(), z.unknown()),\n toolName: z.string().nullable().optional(),\n tool_name: z.string().nullable().optional(),\n filePath: z.string().nullable().optional(),\n file_path: z.string().nullable().optional(),\n createdAt: z.string().nullable().optional(),\n created_at: z.string().nullable().optional(),\n }),\n )\n .nullable()\n .optional(),\n});\n\nexport const observeRequestSchema = z.object({\n sessionKey: z.string().trim().min(1, \"sessionKey is required\").max(512),\n messages: z.array(messageSchema).min(1, \"messages must be a non-empty array\"),\n namespace: namespaceSchema,\n skipExtraction: z.boolean().optional(),\n /** Working directory for auto git-context resolution (issue #569). */\n cwd: z.string().trim().min(1, \"cwd must be non-empty when provided\").max(2048).optional(),\n /**\n * Arbitrary project tag for non-git-based project scoping (issue #569).\n * Creates a coding context with `projectId: \"tag:<projectTag>\"`.\n */\n projectTag: z.string().trim().min(1, \"projectTag must be non-empty when provided\").max(256).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Memory store / suggestion submit\n// ---------------------------------------------------------------------------\n\nconst writeContentSchema = z.string().min(1, \"content is required\").max(50000);\nconst categorySchema = z\n .enum([\n \"fact\", \"preference\", \"correction\", \"entity\", \"decision\",\n \"relationship\", \"principle\", \"commitment\", \"moment\", \"skill\", \"rule\", \"procedure\",\n \"reasoning_trace\",\n ])\n .optional();\nconst confidenceSchema = z.number().min(0).max(1).optional();\nconst tagsSchema = z.array(z.string().max(256)).max(50).optional();\nconst entityRefSchema = z.string().trim().max(512).optional();\nconst ttlSchema = z.string().trim().max(128).optional();\nconst sourceReasonSchema = z.string().trim().max(2000).optional();\n\nexport const memoryStoreRequestSchema = z.object({\n schemaVersion: schemaVersionSchema,\n idempotencyKey: idempotencyKeySchema,\n dryRun: dryRunSchema,\n sessionKey: sessionKeySchema,\n content: writeContentSchema,\n category: categorySchema,\n confidence: confidenceSchema,\n namespace: namespaceSchema,\n tags: tagsSchema,\n entityRef: entityRefSchema,\n ttl: ttlSchema,\n sourceReason: sourceReasonSchema,\n});\n\nexport const suggestionSubmitRequestSchema = memoryStoreRequestSchema;\n\n// ---------------------------------------------------------------------------\n// Review disposition\n// ---------------------------------------------------------------------------\n\nexport const reviewDispositionRequestSchema = z.object({\n memoryId: z.string().trim().min(1, \"memoryId is required\"),\n status: z.enum([\n \"active\", \"pending_review\", \"quarantined\", \"rejected\", \"superseded\", \"archived\",\n ]),\n reasonCode: z.string().trim().min(1, \"reasonCode is required\"),\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Trust-zone promote\n// ---------------------------------------------------------------------------\n\nexport const trustZonePromoteRequestSchema = z.object({\n recordId: z.string().trim().min(1, \"recordId is required\"),\n targetZone: z.enum([\"working\", \"trusted\"], {\n errorMap: () => ({ message: \"targetZone must be 'working' or 'trusted'\" }),\n }),\n promotionReason: z.string().trim().min(1, \"promotionReason is required\"),\n recordedAt: z.string().trim().optional(),\n summary: z.string().trim().max(5000).optional(),\n dryRun: dryRunSchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Trust-zone demo-seed\n// ---------------------------------------------------------------------------\n\nexport const trustZoneDemoSeedRequestSchema = z.object({\n scenario: z.string().trim().max(256).optional(),\n recordedAt: z.string().trim().optional(),\n dryRun: dryRunSchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// LCM search\n// ---------------------------------------------------------------------------\n\nexport const lcmSearchRequestSchema = z.object({\n query: z.string().min(1, \"query is required\"),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n limit: z.number().int().min(1).max(100).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// Day summary\n// ---------------------------------------------------------------------------\n\nexport const daySummaryRequestSchema = z.object({\n memories: z.string().max(100000).optional(),\n sessionKey: sessionKeySchema,\n namespace: namespaceSchema,\n});\n\n// ---------------------------------------------------------------------------\n// Capsule export\n// ---------------------------------------------------------------------------\n\nconst capsuleTopLevelSegmentSchema = z\n .string()\n .trim()\n .min(1)\n .max(128)\n .refine(\n (value) => !value.includes(\"/\") && !value.includes(\"\\\\\"),\n \"must be a top-level directory name without path separators\",\n );\n\nconst capsulePeerIdSchema = z\n .string()\n .trim()\n .min(1)\n .max(256)\n .refine(\n (value) => value !== \".\" && value !== \"..\" && !value.includes(\"/\") && !value.includes(\"\\\\\"),\n \"must be a plain peer id without path separators\",\n );\n\nconst capsuleIsoSinceSchema = z\n .string()\n .trim()\n .min(1, \"since must be a non-empty ISO 8601 timestamp\")\n .max(128)\n .refine(\n isValidCapsuleSince,\n \"since must be a valid ISO 8601 timestamp with no calendar overflow\",\n );\n\nexport const capsuleExportRequestSchema = z\n .object({\n name: z\n .string()\n .trim()\n .min(1, \"name is required\")\n .max(64, \"name must be 64 characters or fewer\")\n .regex(\n CAPSULE_ID_PATTERN,\n \"name must be alphanumeric with single dashes (no spaces, no leading/trailing dashes)\",\n ),\n namespace: namespaceSchema,\n since: capsuleIsoSinceSchema.optional(),\n includeKinds: z.array(capsuleTopLevelSegmentSchema).max(50).optional(),\n peerIds: z.array(capsulePeerIdSchema).max(100).optional(),\n includeTranscripts: z.boolean().optional(),\n encrypt: z.boolean().optional(),\n });\n\nexport const capsuleImportRequestSchema = z\n .object({\n archivePath: z.string().trim().min(1, \"archivePath is required\").max(4096),\n namespace: namespaceSchema,\n mode: z.enum([\"skip\", \"overwrite\", \"fork\"]).optional(),\n });\n\nexport const capsuleListRequestSchema = z\n .object({\n namespace: namespaceSchema,\n });\n\n// ---------------------------------------------------------------------------\n// Inferred types\n// ---------------------------------------------------------------------------\n\nexport type RecallRequest = z.infer<typeof recallRequestSchema>;\nexport type RecallExplainRequest = z.infer<typeof recallExplainRequestSchema>;\nexport type SetCodingContextRequest = z.infer<typeof setCodingContextRequestSchema>;\nexport type ObserveRequest = z.infer<typeof observeRequestSchema>;\nexport type MemoryStoreRequest = z.infer<typeof memoryStoreRequestSchema>;\nexport type SuggestionSubmitRequest = z.infer<typeof suggestionSubmitRequestSchema>;\nexport type ReviewDispositionRequest = z.infer<typeof reviewDispositionRequestSchema>;\nexport type TrustZonePromoteRequest = z.infer<typeof trustZonePromoteRequestSchema>;\nexport type TrustZoneDemoSeedRequest = z.infer<typeof trustZoneDemoSeedRequestSchema>;\nexport type LcmSearchRequest = z.infer<typeof lcmSearchRequestSchema>;\nexport type DaySummaryRequest = z.infer<typeof daySummaryRequestSchema>;\nexport type CapsuleExportRequest = z.infer<typeof capsuleExportRequestSchema>;\nexport type CapsuleImportRequest = z.infer<typeof capsuleImportRequestSchema>;\nexport type CapsuleListRequest = z.infer<typeof capsuleListRequestSchema>;\n\n// ---------------------------------------------------------------------------\n// Validation helper\n// ---------------------------------------------------------------------------\n\nexport type SchemaName =\n | \"recall\"\n | \"recallExplain\"\n | \"setCodingContext\"\n | \"observe\"\n | \"memoryStore\"\n | \"suggestionSubmit\"\n | \"reviewDisposition\"\n | \"trustZonePromote\"\n | \"trustZoneDemoSeed\"\n | \"lcmSearch\"\n | \"daySummary\"\n | \"capsuleExport\"\n | \"capsuleImport\"\n | \"capsuleList\";\n\nexport type SchemaTypeFor<N extends SchemaName> =\n N extends \"recall\" ? RecallRequest\n : N extends \"recallExplain\" ? RecallExplainRequest\n : N extends \"setCodingContext\" ? SetCodingContextRequest\n : N extends \"observe\" ? ObserveRequest\n : N extends \"memoryStore\" ? MemoryStoreRequest\n : N extends \"suggestionSubmit\" ? SuggestionSubmitRequest\n : N extends \"reviewDisposition\" ? ReviewDispositionRequest\n : N extends \"trustZonePromote\" ? TrustZonePromoteRequest\n : N extends \"trustZoneDemoSeed\" ? TrustZoneDemoSeedRequest\n : N extends \"lcmSearch\" ? LcmSearchRequest\n : N extends \"daySummary\" ? DaySummaryRequest\n : N extends \"capsuleExport\" ? CapsuleExportRequest\n : N extends \"capsuleImport\" ? CapsuleImportRequest\n : N extends \"capsuleList\" ? CapsuleListRequest\n : never;\n\nconst schemas: Record<SchemaName, z.ZodTypeAny> = {\n recall: recallRequestSchema,\n recallExplain: recallExplainRequestSchema,\n setCodingContext: setCodingContextRequestSchema,\n observe: observeRequestSchema,\n memoryStore: memoryStoreRequestSchema,\n suggestionSubmit: suggestionSubmitRequestSchema,\n reviewDisposition: reviewDispositionRequestSchema,\n trustZonePromote: trustZonePromoteRequestSchema,\n trustZoneDemoSeed: trustZoneDemoSeedRequestSchema,\n lcmSearch: lcmSearchRequestSchema,\n daySummary: daySummaryRequestSchema,\n capsuleExport: capsuleExportRequestSchema,\n capsuleImport: capsuleImportRequestSchema,\n capsuleList: capsuleListRequestSchema,\n};\n\n/**\n * Validate a request body against the named schema.\n * Returns `{ success: true, data }` on pass or\n * `{ success: false, error }` on failure with field-level detail.\n */\nexport function validateRequest<T = unknown>(\n schemaName: SchemaName,\n body: unknown,\n): { success: true; data: T } | { success: false; error: SchemaValidationError } {\n const schema = schemas[schemaName];\n if (!schema) {\n return {\n success: false,\n error: {\n error: `unknown schema: ${schemaName}`,\n code: \"validation_error\",\n details: [],\n },\n };\n }\n const result = schema.safeParse(body);\n if (result.success) {\n return { success: true, data: result.data as T };\n }\n return { success: false, error: formatZodError(result.error) };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
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: string;\n dryRun: boolean;\n recordsWritten: number;\n records: TrustZoneRecord[];\n filePaths: string[];\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\");\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 buildTrustZoneDemoRecords(baseRecordedAt: string, scenario: string): 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\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 = (options.scenario ?? \"enterprise-buyer-v1\").trim();\n if (scenario !== \"enterprise-buyer-v1\") {\n throw new Error(`unsupported trust-zone demo scenario: ${scenario}`);\n }\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":[]}