@remnic/core 9.29.1 → 9.30.0

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 (355) hide show
  1. package/dist/access-admin-ops-surface.d.ts +11 -11
  2. package/dist/access-admin-ops-surface.js +19 -18
  3. package/dist/access-authorization-probe.d.ts +11 -11
  4. package/dist/access-authorization-probe.js +20 -19
  5. package/dist/access-boundary.d.ts +11 -11
  6. package/dist/access-boundary.js +19 -18
  7. package/dist/access-citation-namespace.js +2 -2
  8. package/dist/access-cli.js +45 -44
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-health-types.d.ts +1 -1
  11. package/dist/access-http-lcm-compaction.d.ts +11 -11
  12. package/dist/access-http.d.ts +11 -11
  13. package/dist/access-http.js +25 -24
  14. package/dist/access-identity-continuity-surface.d.ts +8 -8
  15. package/dist/access-identity-continuity-surface.js +19 -18
  16. package/dist/access-lcm-surface.d.ts +10 -10
  17. package/dist/access-lcm-surface.js +19 -18
  18. package/dist/access-mcp.d.ts +11 -11
  19. package/dist/access-mcp.js +23 -22
  20. package/dist/access-memory-search-fanout.d.ts +2 -2
  21. package/dist/{access-namespace-preflight-DCXBkDp0.d.ts → access-namespace-preflight-VfXssvoI.d.ts} +1 -1
  22. package/dist/access-namespace-preflight.d.ts +3 -3
  23. package/dist/access-namespace-preflight.js +19 -18
  24. package/dist/access-observe-write-surface.d.ts +10 -10
  25. package/dist/access-observe-write-surface.js +19 -18
  26. package/dist/access-operations-batch.js +20 -19
  27. package/dist/access-operations.d.ts +11 -11
  28. package/dist/access-operations.js +22 -21
  29. package/dist/access-recall-concurrency.d.ts +11 -11
  30. package/dist/access-recall-concurrency.js +19 -18
  31. package/dist/access-recall-response.d.ts +10 -10
  32. package/dist/access-recall-response.js +19 -18
  33. package/dist/access-recall-surface.d.ts +10 -10
  34. package/dist/access-recall-surface.js +19 -18
  35. package/dist/access-schema.js +3 -3
  36. package/dist/{access-service-DvPW_M5j.d.ts → access-service-B5RwVsTV.d.ts} +7 -7
  37. package/dist/access-service.d.ts +11 -11
  38. package/dist/access-service.js +19 -18
  39. package/dist/access-surface-catalog.d.ts +11 -11
  40. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  41. package/dist/action-confidence.d.ts +1 -1
  42. package/dist/active-memory-bridge.d.ts +1 -1
  43. package/dist/active-recall.d.ts +1 -1
  44. package/dist/active-recall.js +3 -3
  45. package/dist/behavior-learner.d.ts +1 -1
  46. package/dist/behavior-signals.d.ts +1 -1
  47. package/dist/bootstrap.d.ts +8 -8
  48. package/dist/briefing.d.ts +3 -2
  49. package/dist/briefing.js +10 -9
  50. package/dist/buffer-surprise-report.d.ts +1 -1
  51. package/dist/buffer.d.ts +3 -2
  52. package/dist/bulk-import/index.d.ts +3 -3
  53. package/dist/calibration.d.ts +1 -1
  54. package/dist/capabilities.d.ts +1 -1
  55. package/dist/{catalog-BIVgftWu.d.ts → catalog-V7inUQdp.d.ts} +1 -1
  56. package/dist/causal-behavior.d.ts +1 -1
  57. package/dist/causal-consolidation.d.ts +1 -1
  58. package/dist/causal-consolidation.js +11 -10
  59. package/dist/causal-consolidation.js.map +1 -1
  60. package/dist/causal-trajectory-graph.d.ts +1 -1
  61. package/dist/{chunk-FZRQZW4H.js → chunk-2EUVEDF5.js} +2 -2
  62. package/dist/{chunk-PBUZNGMX.js → chunk-4WKA6I65.js} +20 -20
  63. package/dist/{chunk-PBUZNGMX.js.map → chunk-4WKA6I65.js.map} +1 -1
  64. package/dist/{chunk-AIK5W3IW.js → chunk-5TFP4CUL.js} +68 -2
  65. package/dist/chunk-5TFP4CUL.js.map +1 -0
  66. package/dist/{chunk-3JNDOAQ2.js → chunk-5W4ZLBEZ.js} +9 -9
  67. package/dist/{chunk-5ZCUDWD4.js → chunk-62U4J2GN.js} +2 -2
  68. package/dist/{chunk-IGPEJVBY.js → chunk-66772WBP.js} +2 -2
  69. package/dist/{chunk-EP5BVCRI.js → chunk-6BNE62PM.js} +2 -2
  70. package/dist/{chunk-AAP5T6QG.js → chunk-6DNMUYEE.js} +2 -2
  71. package/dist/{chunk-35DL7IOI.js → chunk-6FUPCJUL.js} +7 -7
  72. package/dist/{chunk-JP3YPDAW.js → chunk-6U7F52DE.js} +19 -19
  73. package/dist/{chunk-E4OCKU67.js → chunk-7XC2HX75.js} +2 -2
  74. package/dist/{chunk-OVRQLAYR.js → chunk-AZ5BTEKX.js} +2 -2
  75. package/dist/{chunk-2AXMQWCN.js → chunk-CZRYLSSW.js} +3 -3
  76. package/dist/chunk-FBUE6PD3.js +1769 -0
  77. package/dist/chunk-FBUE6PD3.js.map +1 -0
  78. package/dist/{chunk-PTSNLEXK.js → chunk-FDAMS4PK.js} +2 -2
  79. package/dist/{chunk-WL5EBRDH.js → chunk-FFAZ2XFU.js} +9 -8
  80. package/dist/chunk-FFAZ2XFU.js.map +1 -0
  81. package/dist/{chunk-2GXM5N5A.js → chunk-GIBMDSJ2.js} +2 -2
  82. package/dist/{chunk-E5OBR6CJ.js → chunk-H5CPS5JP.js} +3 -3
  83. package/dist/{chunk-2D7FEUCK.js → chunk-I5NLEENJ.js} +2 -2
  84. package/dist/{chunk-DRBXHRXE.js → chunk-IB26HVAJ.js} +2 -2
  85. package/dist/{chunk-QDKK63Y7.js → chunk-IC6CBHCA.js} +3 -3
  86. package/dist/{chunk-IAEAFLF2.js → chunk-JCBWCYEJ.js} +2 -2
  87. package/dist/{chunk-3PDOVUHC.js → chunk-KXB4VXHY.js} +2 -2
  88. package/dist/{chunk-WU7TTVOD.js → chunk-LBOD4U5B.js} +7 -7
  89. package/dist/{chunk-UBKEQOTD.js → chunk-LGHKJABJ.js} +3 -3
  90. package/dist/{chunk-VSURVXKY.js → chunk-M3C2V3PV.js} +10 -10
  91. package/dist/{chunk-OFHFH655.js → chunk-MJCGLM25.js} +8 -8
  92. package/dist/{chunk-OYJKSZIQ.js → chunk-NHWB6HG2.js} +2 -2
  93. package/dist/{chunk-TC3VNKGX.js → chunk-NM2WP3B7.js} +4 -4
  94. package/dist/{chunk-GAWOEQEQ.js → chunk-P5PXWTW7.js} +2 -2
  95. package/dist/chunk-PH3ZWL3W.js +786 -0
  96. package/dist/chunk-PH3ZWL3W.js.map +1 -0
  97. package/dist/{chunk-FUYEVEX7.js → chunk-PUS63Q3G.js} +24 -22
  98. package/dist/{chunk-FUYEVEX7.js.map → chunk-PUS63Q3G.js.map} +1 -1
  99. package/dist/{chunk-2QMKMVHH.js → chunk-QNWXCJ76.js} +2 -2
  100. package/dist/{chunk-JMQUBRV6.js → chunk-RGIWINDN.js} +340 -771
  101. package/dist/chunk-RGIWINDN.js.map +1 -0
  102. package/dist/{chunk-WRFBW2TT.js → chunk-SPJXKAVF.js} +3 -3
  103. package/dist/{chunk-HKJCMOT6.js → chunk-TH2LSRMG.js} +2 -2
  104. package/dist/{chunk-CW4AGY3G.js → chunk-VI2JQPNQ.js} +2 -2
  105. package/dist/{chunk-OP6F6L3S.js → chunk-W5EG6LE3.js} +2 -2
  106. package/dist/{chunk-DEBHXHJR.js → chunk-WIPEXG6R.js} +2 -2
  107. package/dist/{chunk-SH6YO3LT.js → chunk-WVO4G37W.js} +2 -2
  108. package/dist/{chunk-7L45JFPW.js → chunk-YTQNQ4KB.js} +14 -14
  109. package/dist/{chunk-PKRIQL3V.js → chunk-YTSNAUXN.js} +2 -2
  110. package/dist/{chunk-5QDRGWT2.js → chunk-ZPSVBSOF.js} +4 -4
  111. package/dist/{cli-CxoSOiG0.d.ts → cli-C4GbETPC.d.ts} +5 -5
  112. package/dist/cli.d.ts +13 -13
  113. package/dist/cli.js +36 -35
  114. package/dist/compounding/engine.d.ts +3 -2
  115. package/dist/compounding/engine.js +10 -9
  116. package/dist/compounding/preference-consolidator.d.ts +1 -1
  117. package/dist/compression-optimizer.d.ts +1 -1
  118. package/dist/config.d.ts +1 -1
  119. package/dist/config.js +3 -3
  120. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  121. package/dist/connectors/codex-materialize-runner.js +10 -9
  122. package/dist/connectors/codex-materialize.d.ts +1 -1
  123. package/dist/connectors/index.d.ts +1 -1
  124. package/dist/connectors/index.js +10 -9
  125. package/dist/consolidation-provenance-check.d.ts +3 -2
  126. package/dist/consolidation-undo.d.ts +3 -2
  127. package/dist/contradiction/index.d.ts +3 -2
  128. package/dist/conversation-index/backend.d.ts +1 -1
  129. package/dist/conversation-index/chunker.d.ts +1 -1
  130. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  131. package/dist/conversation-index/indexer.d.ts +1 -1
  132. package/dist/conversation-index/search.d.ts +1 -1
  133. package/dist/corpus-watermark.d.ts +1 -1
  134. package/dist/corpus-watermark.js +12 -11
  135. package/dist/day-summary.d.ts +1 -1
  136. package/dist/delinearize.d.ts +1 -1
  137. package/dist/direct-answer-wiring.d.ts +1 -1
  138. package/dist/direct-answer.d.ts +1 -1
  139. package/dist/embedding-fallback.d.ts +1 -1
  140. package/dist/enrichment/index.d.ts +1 -1
  141. package/dist/entity-retrieval.d.ts +3 -2
  142. package/dist/entity-retrieval.js +10 -9
  143. package/dist/entity-schema.d.ts +1 -1
  144. package/dist/explicit-capture.d.ts +52 -10
  145. package/dist/explicit-capture.js +13 -1
  146. package/dist/extraction-error-classification.d.ts +1 -1
  147. package/dist/extraction-faithfulness.d.ts +1 -1
  148. package/dist/extraction-judge-telemetry.d.ts +1 -1
  149. package/dist/extraction-judge-training.d.ts +1 -1
  150. package/dist/extraction-judge.d.ts +1 -1
  151. package/dist/extraction-liveness.d.ts +1 -1
  152. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  153. package/dist/extraction-source-grounding.d.ts +1 -1
  154. package/dist/extraction.d.ts +1 -1
  155. package/dist/fallback-llm.d.ts +1 -1
  156. package/dist/{forget-HRPLVB3W.js → forget-4UY2EOKH.js} +3 -3
  157. package/dist/graph-dashboard-diff.d.ts +1 -1
  158. package/dist/graph-dashboard-key.d.ts +1 -1
  159. package/dist/graph-dashboard-parser.d.ts +1 -1
  160. package/dist/graph-edge-reinforcement.d.ts +1 -1
  161. package/dist/graph-snapshot.d.ts +1 -1
  162. package/dist/graph.d.ts +1 -1
  163. package/dist/importance.d.ts +1 -1
  164. package/dist/importers/index.d.ts +1 -1
  165. package/dist/in-flight-reads.d.ts +1 -1
  166. package/dist/index.d.ts +19 -19
  167. package/dist/index.js +47 -45
  168. package/dist/intent.d.ts +1 -1
  169. package/dist/lcm/engine.d.ts +1 -1
  170. package/dist/lcm/index.d.ts +1 -1
  171. package/dist/lcm/tools.d.ts +1 -1
  172. package/dist/lifecycle.d.ts +1 -1
  173. package/dist/live-connectors-runner.d.ts +1 -1
  174. package/dist/local-llm.d.ts +1 -1
  175. package/dist/local-model-endpoint.d.ts +1 -1
  176. package/dist/maintenance/memory-governance.d.ts +1 -1
  177. package/dist/maintenance/memory-governance.js +10 -9
  178. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  179. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -9
  180. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  181. package/dist/maintenance/rebuild-memory-projection.js +11 -10
  182. package/dist/{maintenance-Cb-PjxQd.d.ts → maintenance-CL30NWtc.d.ts} +3 -3
  183. package/dist/mcp-memory-inspector-app.d.ts +11 -11
  184. package/dist/memory-action-policy.d.ts +1 -1
  185. package/dist/memory-cache.d.ts +1 -1
  186. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  187. package/dist/memory-projection-store.d.ts +1 -1
  188. package/dist/memory-provenance.d.ts +1 -1
  189. package/dist/memory-worth-outcomes.d.ts +3 -2
  190. package/dist/models-json.d.ts +1 -1
  191. package/dist/namespaces/migrate.d.ts +4 -3
  192. package/dist/namespaces/migrate.js +11 -10
  193. package/dist/namespaces/principal.d.ts +1 -1
  194. package/dist/namespaces/search.d.ts +1 -1
  195. package/dist/namespaces/storage.d.ts +4 -3
  196. package/dist/namespaces/storage.js +10 -9
  197. package/dist/native-knowledge.d.ts +1 -1
  198. package/dist/offline-sync-impression-drain.d.ts +1 -1
  199. package/dist/offline-sync-impression-drain.js +5 -5
  200. package/dist/offline-sync.js +2 -2
  201. package/dist/operator-doctor-corpus.d.ts +1 -1
  202. package/dist/operator-doctor-corpus.js +13 -12
  203. package/dist/operator-doctor-replica.d.ts +1 -1
  204. package/dist/operator-toolkit.d.ts +4 -3
  205. package/dist/operator-toolkit.js +18 -17
  206. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  207. package/dist/orchestration/maintenance.d.ts +5 -4
  208. package/dist/orchestration/maintenance.js +15 -14
  209. package/dist/{orchestrator-5GKqb_HL.d.ts → orchestrator-CKTCRwWV.d.ts} +7 -7
  210. package/dist/orchestrator.d.ts +8 -8
  211. package/dist/orchestrator.js +45 -44
  212. package/dist/patterns-cli.d.ts +1 -1
  213. package/dist/{pipeline-3Qi1TpRo.d.ts → pipeline-B7wj4rRZ.d.ts} +1 -1
  214. package/dist/policy-runtime.d.ts +1 -1
  215. package/dist/proactive-contention.d.ts +1 -1
  216. package/dist/provenance.d.ts +1 -1
  217. package/dist/{purge-YSGX5BOG.js → purge-533FZLS4.js} +16 -9
  218. package/dist/purge-533FZLS4.js.map +1 -0
  219. package/dist/qmd-preflight.d.ts +2 -2
  220. package/dist/{qmd-D9JqzzRX.d.ts → qmd-q9tg4dHp.d.ts} +1 -1
  221. package/dist/qmd-recall-cache.d.ts +1 -1
  222. package/dist/qmd.d.ts +2 -2
  223. package/dist/recall-concurrency-config.d.ts +1 -1
  224. package/dist/recall-disclosure-escalation.d.ts +1 -1
  225. package/dist/recall-explain-renderer.d.ts +1 -1
  226. package/dist/recall-memory-map.d.ts +1 -1
  227. package/dist/recall-planner-llm.d.ts +1 -1
  228. package/dist/recall-state.d.ts +1 -1
  229. package/dist/recall-state.js +2 -2
  230. package/dist/recall-tag-filter.d.ts +1 -1
  231. package/dist/recall-timings.d.ts +1 -1
  232. package/dist/recall-xray-cli.d.ts +1 -1
  233. package/dist/recall-xray-renderer.d.ts +1 -1
  234. package/dist/recall-xray.d.ts +1 -1
  235. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  236. package/dist/replay/normalizers/claude.d.ts +1 -1
  237. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  238. package/dist/replay/normalizers/shared.d.ts +1 -1
  239. package/dist/replay/runner.d.ts +1 -1
  240. package/dist/replay/types.d.ts +1 -1
  241. package/dist/replica-divergence.d.ts +1 -1
  242. package/dist/replica-peers-config.d.ts +1 -1
  243. package/dist/resolve-auth-token.d.ts +1 -1
  244. package/dist/resume-bundles.js +4 -4
  245. package/dist/retrieval-agents.d.ts +2 -2
  246. package/dist/retrieval-tiers.d.ts +1 -1
  247. package/dist/routing/engine.d.ts +1 -1
  248. package/dist/routing/store.d.ts +1 -1
  249. package/dist/salvage-envelope.d.ts +1 -1
  250. package/dist/{scope-profiles-C4g6_UdP.d.ts → scope-profiles-CWDyglPM.d.ts} +1 -1
  251. package/dist/search/embed-helper.d.ts +1 -1
  252. package/dist/search/factory.d.ts +1 -1
  253. package/dist/search/index.d.ts +1 -1
  254. package/dist/search/lancedb-backend.d.ts +1 -1
  255. package/dist/search/meilisearch-backend.d.ts +1 -1
  256. package/dist/search/noop-backend.d.ts +1 -1
  257. package/dist/search/orama-backend.d.ts +1 -1
  258. package/dist/search/port.d.ts +1 -1
  259. package/dist/search/remote-backend.d.ts +1 -1
  260. package/dist/secure-store/index.js +2 -2
  261. package/dist/{semantic-consolidation-BrxqnzTW.d.ts → semantic-consolidation-BUE3deLn.d.ts} +1 -1
  262. package/dist/semantic-consolidation.d.ts +2 -2
  263. package/dist/semantic-consolidation.js +11 -10
  264. package/dist/semantic-rule-promotion.js +10 -9
  265. package/dist/semantic-rule-verifier.d.ts +1 -1
  266. package/dist/semantic-rule-verifier.js +10 -9
  267. package/dist/{service-Bi1JgxdP.d.ts → service-CXgM0bQG.d.ts} +2 -2
  268. package/dist/session-observer-bands.d.ts +1 -1
  269. package/dist/session-observer-state.d.ts +1 -1
  270. package/dist/shared-context/manager.d.ts +1 -1
  271. package/dist/signal.d.ts +1 -1
  272. package/dist/{storage-CcH6yPk2.d.ts → storage-DysJq-XH.d.ts} +163 -27
  273. package/dist/storage.d.ts +3 -2
  274. package/dist/storage.js +12 -10
  275. package/dist/summarizer.d.ts +1 -1
  276. package/dist/summarizer.js +3 -3
  277. package/dist/summary-snapshot.d.ts +1 -1
  278. package/dist/summary-snapshot.js +2 -2
  279. package/dist/temporal-supersession.d.ts +3 -2
  280. package/dist/temporal-timeline-recall.d.ts +1 -1
  281. package/dist/temporal-validity.d.ts +1 -1
  282. package/dist/threading.d.ts +1 -1
  283. package/dist/tier-migration.d.ts +3 -2
  284. package/dist/tier-routing.d.ts +1 -1
  285. package/dist/topics.d.ts +1 -1
  286. package/dist/transcript.d.ts +1 -1
  287. package/dist/trust-score-stage.d.ts +1 -1
  288. package/dist/trust-score.d.ts +1 -1
  289. package/dist/{types-Dg0w9ADr.d.ts → types-aPPzhnjT.d.ts} +1 -1
  290. package/dist/types.d.ts +1 -1
  291. package/dist/utility-runtime.d.ts +1 -1
  292. package/dist/utils/serialize-mutations.d.ts +11 -7
  293. package/dist/utils/serialize-mutations.js +1 -1
  294. package/dist/verified-recall.js +10 -9
  295. package/dist/write-envelope.d.ts +1 -1
  296. package/package.json +2 -2
  297. package/src/access-observe-write-surface.ts +1 -1
  298. package/src/access-service-coding-write.test.ts +40 -0
  299. package/src/explicit-capture.test.ts +1110 -1
  300. package/src/explicit-capture.ts +534 -135
  301. package/src/maintenance/purge.test.ts +157 -1
  302. package/src/maintenance/purge.ts +15 -9
  303. package/src/secure-store/secure-fs.ts +78 -1
  304. package/src/storage/content-hash-index.ts +43 -17
  305. package/src/storage/tombstone-blocked-capture-index.ts +562 -0
  306. package/src/storage/tombstone-blocked-capture-mutation.ts +284 -0
  307. package/src/storage/tombstone-blocked-capture-sync.ts +872 -0
  308. package/src/storage-fact-hash-index-defer.test.ts +2900 -57
  309. package/src/storage.ts +266 -265
  310. package/src/testing/subjects/tombstone-blocked-capture.test.ts +181 -0
  311. package/src/utils/serialize-mutations.test.ts +4 -1
  312. package/src/utils/serialize-mutations.ts +26 -27
  313. package/dist/chunk-55MDBZLC.js +0 -490
  314. package/dist/chunk-55MDBZLC.js.map +0 -1
  315. package/dist/chunk-AIK5W3IW.js.map +0 -1
  316. package/dist/chunk-JMQUBRV6.js.map +0 -1
  317. package/dist/chunk-WL5EBRDH.js.map +0 -1
  318. package/dist/purge-YSGX5BOG.js.map +0 -1
  319. /package/dist/{chunk-FZRQZW4H.js.map → chunk-2EUVEDF5.js.map} +0 -0
  320. /package/dist/{chunk-3JNDOAQ2.js.map → chunk-5W4ZLBEZ.js.map} +0 -0
  321. /package/dist/{chunk-5ZCUDWD4.js.map → chunk-62U4J2GN.js.map} +0 -0
  322. /package/dist/{chunk-IGPEJVBY.js.map → chunk-66772WBP.js.map} +0 -0
  323. /package/dist/{chunk-EP5BVCRI.js.map → chunk-6BNE62PM.js.map} +0 -0
  324. /package/dist/{chunk-AAP5T6QG.js.map → chunk-6DNMUYEE.js.map} +0 -0
  325. /package/dist/{chunk-35DL7IOI.js.map → chunk-6FUPCJUL.js.map} +0 -0
  326. /package/dist/{chunk-JP3YPDAW.js.map → chunk-6U7F52DE.js.map} +0 -0
  327. /package/dist/{chunk-E4OCKU67.js.map → chunk-7XC2HX75.js.map} +0 -0
  328. /package/dist/{chunk-OVRQLAYR.js.map → chunk-AZ5BTEKX.js.map} +0 -0
  329. /package/dist/{chunk-2AXMQWCN.js.map → chunk-CZRYLSSW.js.map} +0 -0
  330. /package/dist/{chunk-PTSNLEXK.js.map → chunk-FDAMS4PK.js.map} +0 -0
  331. /package/dist/{chunk-2GXM5N5A.js.map → chunk-GIBMDSJ2.js.map} +0 -0
  332. /package/dist/{chunk-E5OBR6CJ.js.map → chunk-H5CPS5JP.js.map} +0 -0
  333. /package/dist/{chunk-2D7FEUCK.js.map → chunk-I5NLEENJ.js.map} +0 -0
  334. /package/dist/{chunk-DRBXHRXE.js.map → chunk-IB26HVAJ.js.map} +0 -0
  335. /package/dist/{chunk-QDKK63Y7.js.map → chunk-IC6CBHCA.js.map} +0 -0
  336. /package/dist/{chunk-IAEAFLF2.js.map → chunk-JCBWCYEJ.js.map} +0 -0
  337. /package/dist/{chunk-3PDOVUHC.js.map → chunk-KXB4VXHY.js.map} +0 -0
  338. /package/dist/{chunk-WU7TTVOD.js.map → chunk-LBOD4U5B.js.map} +0 -0
  339. /package/dist/{chunk-UBKEQOTD.js.map → chunk-LGHKJABJ.js.map} +0 -0
  340. /package/dist/{chunk-VSURVXKY.js.map → chunk-M3C2V3PV.js.map} +0 -0
  341. /package/dist/{chunk-OFHFH655.js.map → chunk-MJCGLM25.js.map} +0 -0
  342. /package/dist/{chunk-OYJKSZIQ.js.map → chunk-NHWB6HG2.js.map} +0 -0
  343. /package/dist/{chunk-TC3VNKGX.js.map → chunk-NM2WP3B7.js.map} +0 -0
  344. /package/dist/{chunk-GAWOEQEQ.js.map → chunk-P5PXWTW7.js.map} +0 -0
  345. /package/dist/{chunk-2QMKMVHH.js.map → chunk-QNWXCJ76.js.map} +0 -0
  346. /package/dist/{chunk-WRFBW2TT.js.map → chunk-SPJXKAVF.js.map} +0 -0
  347. /package/dist/{chunk-HKJCMOT6.js.map → chunk-TH2LSRMG.js.map} +0 -0
  348. /package/dist/{chunk-CW4AGY3G.js.map → chunk-VI2JQPNQ.js.map} +0 -0
  349. /package/dist/{chunk-OP6F6L3S.js.map → chunk-W5EG6LE3.js.map} +0 -0
  350. /package/dist/{chunk-DEBHXHJR.js.map → chunk-WIPEXG6R.js.map} +0 -0
  351. /package/dist/{chunk-SH6YO3LT.js.map → chunk-WVO4G37W.js.map} +0 -0
  352. /package/dist/{chunk-7L45JFPW.js.map → chunk-YTQNQ4KB.js.map} +0 -0
  353. /package/dist/{chunk-PKRIQL3V.js.map → chunk-YTSNAUXN.js.map} +0 -0
  354. /package/dist/{chunk-5QDRGWT2.js.map → chunk-ZPSVBSOF.js.map} +0 -0
  355. /package/dist/{forget-HRPLVB3W.js.map → forget-4UY2EOKH.js.map} +0 -0
@@ -0,0 +1,786 @@
1
+ import {
2
+ buildExplicitCaptureDedupKey,
3
+ isTombstoneBlockedCaptureWriteLockBusy,
4
+ normalizeExplicitCaptureContent
5
+ } from "./chunk-FBUE6PD3.js";
6
+ import {
7
+ TAG_LIMITS,
8
+ composeMemoryEnvelope
9
+ } from "./chunk-CGASUJVP.js";
10
+ import {
11
+ sanitizeMemoryContent
12
+ } from "./chunk-5GKPFL3S.js";
13
+ import {
14
+ isSafeRouteNamespace
15
+ } from "./chunk-U3PN77QT.js";
16
+ import {
17
+ resolveNamespaceCapabilities
18
+ } from "./chunk-2XRE6FLM.js";
19
+ import {
20
+ log
21
+ } from "./chunk-3WCASNQZ.js";
22
+
23
+ // src/explicit-capture.ts
24
+ import { createHash, randomUUID } from "crypto";
25
+ var INLINE_NOTE_RE = /<memory_note>([\s\S]{0,100000}?)<\/memory_note>/gi;
26
+ var INLINE_NOTE_MARKUP_RE = /<memory_note>[\s\S]{0,100000}?<\/memory_note>/i;
27
+ var INLINE_ALLOWED_CATEGORIES = /* @__PURE__ */ new Set([
28
+ "fact",
29
+ "preference",
30
+ "correction",
31
+ "entity",
32
+ "decision",
33
+ "relationship",
34
+ "principle",
35
+ "commitment",
36
+ "moment",
37
+ "skill",
38
+ "rule",
39
+ "procedure",
40
+ "reasoning_trace"
41
+ ]);
42
+ var SECRET_PATTERNS = [
43
+ /\bsk-[A-Za-z0-9]{16,}\b/,
44
+ /\bAKIA[0-9A-Z]{16}\b/,
45
+ /\bBearer\s+[A-Za-z0-9._-]{16,}\b/i,
46
+ /\b(?:api[_-]?key|secret|token|password|passwd)\s*[:=]\s*[^\s]{8,}\b/i,
47
+ /\b(?:authorization)\s*:\s*[^\s]{8,}\b/i
48
+ ];
49
+ var SECRET_REDACTION_PATTERNS = [
50
+ { pattern: /\bsk-[A-Za-z0-9]{16,}\b/g, replacement: "[redacted openai key]" },
51
+ { pattern: /\bAKIA[0-9A-Z]{16}\b/g, replacement: "[redacted aws key]" },
52
+ { pattern: /\bBearer\s+[A-Za-z0-9._-]{16,}\b/gi, replacement: "Bearer [redacted token]" },
53
+ {
54
+ pattern: /\b(?:api[_-]?key|secret|token|password|passwd)\s*[:=]\s*[^\s]{8,}\b/gi,
55
+ replacement: "[redacted credential]"
56
+ },
57
+ {
58
+ pattern: /\b(?:authorization)\s*:\s*[^\s]{8,}\b/gi,
59
+ replacement: "authorization: [redacted credential]"
60
+ }
61
+ ];
62
+ var EXPLICIT_CAPTURE_REVIEW_TAGS = ["explicit-capture", "queued-review"];
63
+ function explicitCaptureActor(source) {
64
+ switch (source) {
65
+ case "inline":
66
+ return "inline.memory_note";
67
+ case "memory_store":
68
+ return "tool.memory_store";
69
+ case "suggestion_submit":
70
+ return "tool.suggestion_submit";
71
+ default:
72
+ return "tool.memory_capture";
73
+ }
74
+ }
75
+ function asTrimmed(value) {
76
+ const trimmed = value?.trim();
77
+ return trimmed && trimmed.length > 0 ? trimmed : void 0;
78
+ }
79
+ function redactSecrets(value) {
80
+ let redacted = value;
81
+ for (const { pattern, replacement } of SECRET_REDACTION_PATTERNS) {
82
+ redacted = redacted.replace(pattern, replacement);
83
+ }
84
+ return redacted;
85
+ }
86
+ function containsSecretLikeValue(value) {
87
+ return SECRET_PATTERNS.some((pattern) => pattern.test(value));
88
+ }
89
+ function assertNoSecretLikeMetadata(field, value) {
90
+ const trimmed = asTrimmed(value);
91
+ if (trimmed && containsSecretLikeValue(trimmed)) {
92
+ throw new Error(`${field} appears to contain a secret or credential`);
93
+ }
94
+ }
95
+ function assertNoSecretLikeMetadataList(field, values) {
96
+ for (const value of values ?? []) {
97
+ assertNoSecretLikeMetadata(field, value);
98
+ }
99
+ }
100
+ function sanitizeReviewText(value, fallback) {
101
+ const redacted = redactSecrets(asTrimmed(value) ?? fallback);
102
+ const sanitized = sanitizeMemoryContent(redacted);
103
+ const safe = sanitized.text.trim();
104
+ return safe.length > 0 ? safe : fallback;
105
+ }
106
+ function sanitizeReviewMetadata(value) {
107
+ const trimmed = asTrimmed(value);
108
+ if (!trimmed) return void 0;
109
+ return sanitizeReviewText(trimmed, "[redacted]");
110
+ }
111
+ function sanitizeReviewTags(tags) {
112
+ return Array.from(
113
+ new Set(
114
+ (tags ?? []).map((tag) => sanitizeReviewMetadata(tag)).filter((tag) => typeof tag === "string" && tag.length > 0)
115
+ )
116
+ );
117
+ }
118
+ function normalizeExplicitCaptureError(error) {
119
+ if (error instanceof Error && error.message.trim().length > 0) return error.message.trim();
120
+ const rendered = String(error).trim();
121
+ return rendered.length > 0 ? rendered : "explicit capture failed";
122
+ }
123
+ function isUnsupportedExplicitCaptureNamespaceError(error) {
124
+ return normalizeExplicitCaptureError(error).startsWith("unsupported namespace:");
125
+ }
126
+ function resolveExplicitCaptureReviewNamespace(orchestrator, namespace) {
127
+ const normalized = asTrimmed(namespace);
128
+ if (!normalized) return void 0;
129
+ return resolveExplicitCaptureNamespace(orchestrator, normalized);
130
+ }
131
+ function resolveExplicitCaptureNamespace(orchestrator, namespace) {
132
+ const normalized = asTrimmed(namespace);
133
+ if (!normalized) return void 0;
134
+ if (!resolveNamespaceCapabilities(orchestrator.config).namespaces) {
135
+ if (normalized !== orchestrator.config.defaultNamespace) {
136
+ throw new Error(`unsupported namespace: ${normalized}`);
137
+ }
138
+ return normalized;
139
+ }
140
+ const allowed = new Set(
141
+ [
142
+ orchestrator.config.defaultNamespace,
143
+ orchestrator.config.sharedNamespace,
144
+ ...orchestrator.config.namespacePolicies.map((policy) => policy.name)
145
+ ].map((value) => value.trim()).filter(Boolean)
146
+ );
147
+ if (!allowed.has(normalized)) {
148
+ throw new Error(`unsupported namespace: ${normalized}`);
149
+ }
150
+ return normalized;
151
+ }
152
+ function parseExplicitCaptureTtl(ttl) {
153
+ const raw = asTrimmed(ttl);
154
+ if (!raw) return void 0;
155
+ const absoluteMs = Date.parse(raw);
156
+ if (Number.isFinite(absoluteMs)) {
157
+ return new Date(absoluteMs).toISOString();
158
+ }
159
+ const relative = raw.match(/^(\d+)\s*([mhdw])$/i);
160
+ if (!relative) {
161
+ throw new Error("ttl must be an ISO-8601 timestamp or relative duration like 30m, 12h, 7d, or 2w");
162
+ }
163
+ const amount = Number.parseInt(relative[1] ?? "", 10);
164
+ const unit = (relative[2] ?? "").toLowerCase();
165
+ if (!Number.isFinite(amount) || amount <= 0) {
166
+ throw new Error("ttl duration must be a positive integer");
167
+ }
168
+ const multiplier = unit === "m" ? 6e4 : unit === "h" ? 60 * 6e4 : unit === "d" ? 24 * 60 * 6e4 : 7 * 24 * 60 * 6e4;
169
+ return new Date(Date.now() + amount * multiplier).toISOString();
170
+ }
171
+ function parseInlineConfidence(value) {
172
+ const trimmed = value.trim();
173
+ if (!/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i.test(trimmed)) {
174
+ return Number.NaN;
175
+ }
176
+ const parsed = Number(trimmed);
177
+ return Number.isFinite(parsed) ? parsed : Number.NaN;
178
+ }
179
+ function parseInlineNote(block) {
180
+ const lines = block.replace(/\r/g, "").split("\n");
181
+ const note = {};
182
+ let idx = 0;
183
+ while (idx < lines.length) {
184
+ const rawLine = lines[idx] ?? "";
185
+ const line = rawLine.trim();
186
+ idx += 1;
187
+ if (line.length === 0) continue;
188
+ const colonIdx = line.indexOf(":");
189
+ if (colonIdx < 0) continue;
190
+ const key = line.slice(0, colonIdx).trim();
191
+ const value = line.slice(colonIdx + 1).trim();
192
+ if (key === "content" && value === "|") {
193
+ const contentLines = [];
194
+ while (idx < lines.length) {
195
+ const next = lines[idx] ?? "";
196
+ if (next.startsWith(" ") || next.startsWith(" ")) {
197
+ contentLines.push(next.replace(/^( |\t)/, ""));
198
+ idx += 1;
199
+ continue;
200
+ }
201
+ if (next.trim().length === 0) {
202
+ contentLines.push("");
203
+ idx += 1;
204
+ continue;
205
+ }
206
+ break;
207
+ }
208
+ note.content = contentLines.join("\n").trim();
209
+ continue;
210
+ }
211
+ switch (key) {
212
+ case "content":
213
+ note.content = value;
214
+ break;
215
+ case "category":
216
+ note.category = value;
217
+ break;
218
+ case "confidence":
219
+ note.confidence = parseInlineConfidence(value);
220
+ break;
221
+ case "namespace":
222
+ note.namespace = value;
223
+ break;
224
+ case "tags":
225
+ note.tags = value.split(",").map((entry) => entry.trim()).filter(Boolean);
226
+ break;
227
+ case "entityRef":
228
+ note.entityRef = value;
229
+ break;
230
+ case "ttl":
231
+ note.ttl = value;
232
+ break;
233
+ case "sourceReason":
234
+ note.sourceReason = value;
235
+ break;
236
+ default:
237
+ break;
238
+ }
239
+ }
240
+ return { content: "", ...note };
241
+ }
242
+ function parseInlineExplicitCaptureCandidates(text) {
243
+ const notes = [];
244
+ for (const match of text.matchAll(INLINE_NOTE_RE)) {
245
+ notes.push(parseInlineNote(match[1] ?? ""));
246
+ }
247
+ return notes;
248
+ }
249
+ function parseInlineExplicitCaptureNotes(text) {
250
+ return parseInlineExplicitCaptureCandidates(text).filter((note) => asTrimmed(note.content));
251
+ }
252
+ function hasInlineExplicitCaptureMarkup(text) {
253
+ return INLINE_NOTE_MARKUP_RE.test(text);
254
+ }
255
+ function stripInlineExplicitCaptureNotes(text) {
256
+ return text.replace(INLINE_NOTE_RE, "").trim();
257
+ }
258
+ function validateExplicitCaptureInput(input, mode = "strict_explicit") {
259
+ const content = asTrimmed(input.content);
260
+ if (!content) throw new Error("content is required");
261
+ if (mode === "strict_explicit") {
262
+ if (content.length < 10) throw new Error("content must be at least 10 characters");
263
+ if (content.length > 4e3) throw new Error("content must be 4000 characters or fewer");
264
+ }
265
+ if (/<memory_note>/i.test(content) || /<\/memory_note>/i.test(content)) {
266
+ throw new Error("nested memory_note blocks are not allowed");
267
+ }
268
+ const category = asTrimmed(input.category) ?? "fact";
269
+ if (!INLINE_ALLOWED_CATEGORIES.has(category)) {
270
+ throw new Error(`unsupported category: ${input.category ?? category}`);
271
+ }
272
+ const sanitized = sanitizeMemoryContent(content);
273
+ if (!sanitized.clean) {
274
+ throw new Error("content failed memory sanitization");
275
+ }
276
+ for (const pattern of SECRET_PATTERNS) {
277
+ if (pattern.test(content)) {
278
+ throw new Error("content appears to contain a secret or credential");
279
+ }
280
+ }
281
+ assertNoSecretLikeMetadata("sourceReason", input.sourceReason);
282
+ assertNoSecretLikeMetadata("entityRef", input.entityRef);
283
+ assertNoSecretLikeMetadata("ttl", input.ttl);
284
+ assertNoSecretLikeMetadataList("tags", input.tags);
285
+ if (input.confidence !== void 0 && !Number.isFinite(input.confidence)) {
286
+ throw new Error("confidence must be a finite number");
287
+ }
288
+ const confidence = input.confidence === void 0 ? 0.95 : Number(input.confidence);
289
+ if (confidence < 0 || confidence > 1) {
290
+ throw new Error("confidence must be between 0 and 1");
291
+ }
292
+ const requestedNamespace = asTrimmed(input.namespace);
293
+ if (requestedNamespace && !isSafeRouteNamespace(requestedNamespace)) {
294
+ throw new Error(`unsafe namespace: ${requestedNamespace}`);
295
+ }
296
+ const expiresAt = parseExplicitCaptureTtl(input.ttl);
297
+ const dedupedTags = Array.from(new Set((input.tags ?? []).map((tag) => tag.trim()).filter(Boolean)));
298
+ if (dedupedTags.length > TAG_LIMITS.maxTags) {
299
+ throw new Error(`too many tags: ${dedupedTags.length} exceeds the ${TAG_LIMITS.maxTags}-tag limit`);
300
+ }
301
+ for (const tag of dedupedTags) {
302
+ if (tag.length > TAG_LIMITS.maxTagLength) {
303
+ throw new Error(`tag exceeds ${TAG_LIMITS.maxTagLength} characters: ${JSON.stringify(tag.slice(0, 40))}\u2026`);
304
+ }
305
+ }
306
+ return {
307
+ content,
308
+ category,
309
+ confidence,
310
+ namespace: asTrimmed(input.namespace),
311
+ tags: dedupedTags,
312
+ entityRef: asTrimmed(input.entityRef),
313
+ sourceReason: asTrimmed(input.sourceReason),
314
+ // Trimmed like the other optional metadata (#2017 review round): a
315
+ // whitespace-only connector previously passed validation and then blew
316
+ // up at strict compose time - validated input must always compose.
317
+ sourceConnector: asTrimmed(input.sourceConnector),
318
+ expiresAt
319
+ };
320
+ }
321
+ async function findDuplicateExplicitCapture(orchestrator, resolvedNamespace, candidate, storageOverride) {
322
+ const storage = storageOverride ?? await orchestrator.getStorage(resolvedNamespace);
323
+ let authoritativeFactHashMiss = false;
324
+ if (candidate.category === "fact" && typeof storage.hasFactContentHash === "function") {
325
+ try {
326
+ const hasHash = await storage.hasFactContentHash(candidate.content);
327
+ if (!hasHash) {
328
+ const authoritative = typeof storage.isFactContentHashAuthoritative === "function" ? await storage.isFactContentHashAuthoritative() : false;
329
+ authoritativeFactHashMiss = authoritative;
330
+ }
331
+ } catch (err) {
332
+ void err;
333
+ }
334
+ }
335
+ if (authoritativeFactHashMiss) {
336
+ const checkBlockedIndex = storage.checkTombstoneBlockedExplicitCapture;
337
+ if (typeof checkBlockedIndex === "function") {
338
+ try {
339
+ const result = await checkBlockedIndex.call(
340
+ storage,
341
+ candidate.content,
342
+ candidate.category,
343
+ candidate.sourceConnector
344
+ );
345
+ if (!result.has && result.authoritative) return null;
346
+ } catch (err) {
347
+ void err;
348
+ }
349
+ } else {
350
+ const hasBlockedIndex = storage.hasTombstoneBlockedExplicitCapture;
351
+ if (typeof hasBlockedIndex === "function") {
352
+ try {
353
+ const hasBlocked = await hasBlockedIndex.call(
354
+ storage,
355
+ candidate.content,
356
+ candidate.category,
357
+ candidate.sourceConnector
358
+ );
359
+ if (!hasBlocked) {
360
+ const isIndexAuthoritative = typeof storage.isTombstoneBlockedExplicitCaptureIndexAuthoritative === "function" ? await storage.isTombstoneBlockedExplicitCaptureIndexAuthoritative() : false;
361
+ if (isIndexAuthoritative) return null;
362
+ }
363
+ } catch (err) {
364
+ void err;
365
+ }
366
+ }
367
+ }
368
+ }
369
+ const hotMemories = await storage.readAllMemories();
370
+ const coldMemories = typeof storage.readAllColdMemories === "function" ? await storage.readAllColdMemories() : [];
371
+ const existing = [...hotMemories, ...coldMemories];
372
+ const normalizedCandidate = normalizeExplicitCaptureContent(candidate.content);
373
+ const match = existing.find((memory) => {
374
+ const status = memory.frontmatter.status ?? "active";
375
+ if (status !== "active" && (status !== "pending_review" || !memory.frontmatter.blockedBy)) {
376
+ return false;
377
+ }
378
+ if (memory.frontmatter.category !== candidate.category) return false;
379
+ if (normalizeExplicitCaptureContent(memory.content) !== normalizedCandidate) return false;
380
+ const existingConnector = memory.frontmatter.sourceConnector?.trim() || void 0;
381
+ const newConnector = candidate.sourceConnector?.trim() || void 0;
382
+ if (existingConnector !== newConnector) return false;
383
+ return true;
384
+ });
385
+ return match ? {
386
+ id: match.frontmatter.id,
387
+ tombstoneBlocked: match.frontmatter.status === "pending_review" && Boolean(match.frontmatter.blockedBy)
388
+ } : null;
389
+ }
390
+ async function persistExplicitCaptureUnlocked(orchestrator, candidate, source, resolvedNamespace, storage) {
391
+ const duplicate = await findDuplicateExplicitCapture(orchestrator, resolvedNamespace, candidate, storage);
392
+ if (duplicate) {
393
+ return duplicate.tombstoneBlocked ? { id: duplicate.id, duplicateOf: duplicate.id, tombstoneBlocked: true } : { id: duplicate.id, duplicateOf: duplicate.id };
394
+ }
395
+ const captureEnvelope = composeMemoryEnvelope(
396
+ {
397
+ content: candidate.content,
398
+ category: candidate.category,
399
+ confidence: candidate.confidence,
400
+ tags: candidate.tags,
401
+ ...candidate.entityRef ? { entityRef: candidate.entityRef } : {},
402
+ ...candidate.expiresAt ? { ttl: candidate.expiresAt } : {},
403
+ ...candidate.sourceConnector ? { sourceConnector: candidate.sourceConnector } : {},
404
+ ...candidate.sourceReason ? { sourceReason: candidate.sourceReason } : {}
405
+ },
406
+ { source: source === "inline" ? "explicit-inline" : "explicit" }
407
+ );
408
+ const { id, duplicateOf, tombstoneBlocked } = await storage.writeSealedMemory(captureEnvelope);
409
+ if (duplicateOf) return { id, duplicateOf, tombstoneBlocked };
410
+ const created = (/* @__PURE__ */ new Date()).toISOString();
411
+ const event = {
412
+ eventId: `mle-${randomUUID()}`,
413
+ memoryId: id,
414
+ eventType: tombstoneBlocked ? "explicit_capture_queued" : "explicit_capture_accepted",
415
+ timestamp: created,
416
+ actor: explicitCaptureActor(source),
417
+ reasonCode: candidate.sourceReason,
418
+ ruleVersion: "explicit-capture.v1"
419
+ };
420
+ await storage.appendMemoryLifecycleEvents([event]);
421
+ return { id, duplicateOf, tombstoneBlocked };
422
+ }
423
+ async function persistExplicitCapture(orchestrator, candidate, source) {
424
+ const resolvedNamespace = candidate.namespacePreResolved ? asTrimmed(candidate.namespace) : resolveExplicitCaptureNamespace(orchestrator, candidate.namespace);
425
+ const storage = await orchestrator.getStorage(resolvedNamespace);
426
+ const persist = () => persistExplicitCaptureUnlocked(orchestrator, candidate, source, resolvedNamespace, storage);
427
+ if (typeof storage.withTombstoneBlockedCaptureWriteLock !== "function") return await persist();
428
+ const lockIdentity = buildExplicitCaptureDedupKey(candidate.content, candidate.category, candidate.sourceConnector);
429
+ return await storage.withTombstoneBlockedCaptureWriteLock(persist, lockIdentity);
430
+ }
431
+ function buildExplicitCaptureReviewContent(input, reason) {
432
+ const requestedContent = asTrimmed(input.content);
433
+ const safeContent = sanitizeReviewText(requestedContent, "[empty explicit capture]");
434
+ const safeCategory = sanitizeReviewMetadata(input.category);
435
+ const safeNamespace = sanitizeReviewMetadata(input.namespace);
436
+ const safeEntityRef = sanitizeReviewMetadata(input.entityRef);
437
+ const safeTtl = sanitizeReviewMetadata(input.ttl);
438
+ const safeSourceReason = sanitizeReviewMetadata(input.sourceReason);
439
+ const safeTags = sanitizeReviewTags(input.tags);
440
+ const lines = ["Explicit capture queued for review.", "", `Reason: ${reason}`, "", "Submitted content:", safeContent];
441
+ const metadata = [
442
+ safeCategory ? `Requested category: ${safeCategory}` : void 0,
443
+ safeNamespace ? `Requested namespace: ${safeNamespace}` : void 0,
444
+ safeEntityRef ? `Requested entityRef: ${safeEntityRef}` : void 0,
445
+ safeTtl ? `Requested ttl: ${safeTtl}` : void 0,
446
+ safeSourceReason ? `Requested sourceReason: ${safeSourceReason}` : void 0,
447
+ safeTags.length > 0 ? `Requested tags: ${safeTags.join(", ")}` : void 0
448
+ ].filter((entry) => typeof entry === "string" && entry.length > 0);
449
+ if (metadata.length > 0) {
450
+ lines.push("", ...metadata);
451
+ }
452
+ return lines.join("\n");
453
+ }
454
+ function explicitCaptureReviewNamespaces(orchestrator, queueNamespace) {
455
+ const config = orchestrator.config;
456
+ return [asTrimmed(queueNamespace) ?? asTrimmed(config?.defaultNamespace)];
457
+ }
458
+ async function findQueuedExplicitCaptureDuplicate(orchestrator, namespace, content, sourceConnector) {
459
+ const storages = Array.from(
460
+ new Set(
461
+ await Promise.all(
462
+ explicitCaptureReviewNamespaces(orchestrator, namespace).map(
463
+ (reviewNamespace) => orchestrator.getStorage(reviewNamespace)
464
+ )
465
+ )
466
+ )
467
+ );
468
+ const memorySets = await Promise.all(
469
+ storages.map(async (storage) => {
470
+ const hotMemories = await storage.readAllMemories();
471
+ const coldMemories = typeof storage.readAllColdMemories === "function" ? await storage.readAllColdMemories() : [];
472
+ return [...hotMemories, ...coldMemories];
473
+ })
474
+ );
475
+ const existing = memorySets.flat();
476
+ const normalized = normalizeExplicitCaptureContent(content);
477
+ const match = existing.find((memory) => {
478
+ const status = memory.frontmatter.status ?? "active";
479
+ if (status !== "pending_review") return false;
480
+ if (!(memory.frontmatter.tags ?? []).includes("queued-review")) return false;
481
+ if (normalizeExplicitCaptureContent(memory.content) !== normalized) return false;
482
+ const existingConnector = memory.frontmatter.sourceConnector?.trim() || void 0;
483
+ const newConnector = sourceConnector?.trim() || void 0;
484
+ if (existingConnector !== newConnector) return false;
485
+ return true;
486
+ });
487
+ return match?.frontmatter.id ?? null;
488
+ }
489
+ async function queueExplicitCaptureForReview(orchestrator, input, source, error, options = {}) {
490
+ const reason = sanitizeReviewText(normalizeExplicitCaptureError(error), "explicit capture failed");
491
+ const requestedNamespace = asTrimmed(input.namespace);
492
+ const resolvedNamespace = asTrimmed(options.resolvedNamespace);
493
+ const queueNamespace = resolvedNamespace ?? (input.namespacePreResolved ? requestedNamespace : resolveExplicitCaptureReviewNamespace(orchestrator, requestedNamespace));
494
+ const content = buildExplicitCaptureReviewContent(input, reason);
495
+ const requestedCategory = asTrimmed(input.category);
496
+ const reviewCategory = requestedCategory && INLINE_ALLOWED_CATEGORIES.has(requestedCategory) ? requestedCategory : "fact";
497
+ const requestedTags = sanitizeReviewTags(input.tags);
498
+ const storage = await orchestrator.getStorage(queueNamespace);
499
+ const lockIdentity = buildExplicitCaptureDedupKey(content, reviewCategory, input.sourceConnector);
500
+ const queue = async () => {
501
+ const duplicateOf = await findQueuedExplicitCaptureDuplicate(
502
+ orchestrator,
503
+ queueNamespace,
504
+ content,
505
+ input.sourceConnector
506
+ );
507
+ if (duplicateOf) {
508
+ return { id: duplicateOf, duplicateOf };
509
+ }
510
+ const reviewEnvelope = composeMemoryEnvelope(
511
+ {
512
+ content,
513
+ category: reviewCategory,
514
+ confidence: 0.2,
515
+ tags: Array.from(/* @__PURE__ */ new Set([...EXPLICIT_CAPTURE_REVIEW_TAGS, ...requestedTags])),
516
+ ...sanitizeReviewMetadata(input.entityRef) ? { entityRef: sanitizeReviewMetadata(input.entityRef) } : {},
517
+ ...input.sourceConnector ? { sourceConnector: input.sourceConnector } : {}
518
+ },
519
+ { source: source === "inline" ? "explicit-inline-review" : "explicit-review" },
520
+ // The review queue is the FALLBACK for a capture that already failed
521
+ // primary validation — it must never be un-queueable. The tag list is
522
+ // machine-assembled (requested tags + the two fixed review tags), so 49+
523
+ // requested tags would push past the 50-tag limit and strict compose
524
+ // would throw, losing the capture (#2014 review round). Salvage clamps
525
+ // instead; the fixed review tags sort first in the assembly above, so
526
+ // they always survive the clamp.
527
+ { salvage: true }
528
+ );
529
+ const { id } = await storage.writeSealedMemory(reviewEnvelope);
530
+ try {
531
+ const created = await storage.getMemoryById(id);
532
+ if (created) {
533
+ await storage.writeMemoryFrontmatter(
534
+ created,
535
+ {
536
+ status: "pending_review",
537
+ updated: (/* @__PURE__ */ new Date()).toISOString()
538
+ },
539
+ {
540
+ actor: explicitCaptureActor(source),
541
+ reasonCode: reason,
542
+ ruleVersion: "explicit-capture.v1"
543
+ }
544
+ );
545
+ }
546
+ } finally {
547
+ }
548
+ const event = {
549
+ eventId: `mle-${randomUUID()}`,
550
+ memoryId: id,
551
+ eventType: "explicit_capture_queued",
552
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
553
+ actor: explicitCaptureActor(source),
554
+ reasonCode: reason,
555
+ ruleVersion: "explicit-capture.v1"
556
+ };
557
+ await storage.appendMemoryLifecycleEvents([event]);
558
+ return { id };
559
+ };
560
+ if (typeof storage.withTombstoneBlockedCaptureWriteLock !== "function") return await queue();
561
+ return await storage.withTombstoneBlockedCaptureWriteLock(queue, lockIdentity);
562
+ }
563
+ function shouldSkipImplicitExtraction(cfg) {
564
+ return cfg.captureMode === "explicit";
565
+ }
566
+ function shouldProcessInlineExplicitCapture(cfg) {
567
+ return cfg.captureMode !== "implicit";
568
+ }
569
+ var DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT = 1024;
570
+ var InlineExplicitCaptureProcessor = class {
571
+ constructor(orchestrator, options = {}) {
572
+ this.orchestrator = orchestrator;
573
+ this.options = options;
574
+ const requestedLimit = options.maxDedupeKeys ?? DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT;
575
+ this.maxDedupeKeys = Number.isFinite(requestedLimit) && requestedLimit > 0 ? Math.max(1, Math.floor(requestedLimit)) : DEFAULT_INLINE_CAPTURE_DEDUPE_KEY_LIMIT;
576
+ }
577
+ orchestrator;
578
+ options;
579
+ observedKeys = /* @__PURE__ */ new Set();
580
+ observedKeyOrder = [];
581
+ maxDedupeKeys;
582
+ processingTails = /* @__PURE__ */ new Map();
583
+ enqueue(key, operation) {
584
+ const previous = this.processingTails.get(key) ?? Promise.resolve();
585
+ let release;
586
+ const current = new Promise((resolve) => {
587
+ release = resolve;
588
+ });
589
+ this.processingTails.set(key, current);
590
+ return previous.then(operation).finally(() => {
591
+ if (this.processingTails.get(key) === current) this.processingTails.delete(key);
592
+ release();
593
+ });
594
+ }
595
+ buildDedupeKeys(dedupeKeys, input, namespacePreResolved, fallbackReviewNamespace) {
596
+ let fallbackNamespace;
597
+ let effectiveNamespace = asTrimmed(input.namespace);
598
+ if (!namespacePreResolved) {
599
+ try {
600
+ effectiveNamespace = resolveExplicitCaptureNamespace(this.orchestrator, effectiveNamespace);
601
+ } catch {
602
+ fallbackNamespace = asTrimmed(fallbackReviewNamespace) ?? this.orchestrator.config.defaultNamespace;
603
+ effectiveNamespace = fallbackNamespace;
604
+ }
605
+ }
606
+ const requestedNamespace = asTrimmed(input.namespace);
607
+ const namespaceScope = fallbackNamespace === void 0 ? effectiveNamespace ?? this.orchestrator.config.defaultNamespace : `${fallbackNamespace}\0requested:${requestedNamespace ?? ""}`;
608
+ const sourceConnectorScope = asTrimmed(input.sourceConnector) ?? "";
609
+ const deliveryKeys = Array.from(
610
+ new Set((dedupeKeys ?? []).map((key) => asTrimmed(key)).filter((key) => key !== void 0))
611
+ ).sort();
612
+ const noteHash = createHash("sha256").update(
613
+ JSON.stringify({
614
+ content: normalizeExplicitCaptureContent(input.content),
615
+ category: asTrimmed(input.category) ?? "fact"
616
+ })
617
+ ).digest("hex");
618
+ const validationTags = Array.from(
619
+ new Set((input.tags ?? []).map((tag) => asTrimmed(tag)).filter((tag) => tag !== void 0))
620
+ ).sort();
621
+ const validationHash = createHash("sha256").update(
622
+ JSON.stringify({
623
+ content: asTrimmed(input.content) ?? "",
624
+ category: asTrimmed(input.category) ?? "fact",
625
+ confidence: input.confidence === void 0 ? "default" : Number.isFinite(input.confidence) ? input.confidence : "invalid",
626
+ namespace: asTrimmed(input.namespace),
627
+ tags: validationTags,
628
+ entityRef: asTrimmed(input.entityRef),
629
+ sourceReason: asTrimmed(input.sourceReason),
630
+ ttl: asTrimmed(input.ttl),
631
+ deliveryKeys
632
+ })
633
+ ).digest("hex");
634
+ const identityPrefix = `${namespaceScope}\0${sourceConnectorScope}\0`;
635
+ const fallbackKey = `${identityPrefix}fallback:inline-memory-note:${noteHash}`;
636
+ return {
637
+ replayKeys: deliveryKeys.length > 0 ? deliveryKeys.map((key) => `${identityPrefix}${key}:inline-memory-note:${noteHash}`) : [fallbackKey],
638
+ validationFailureKey: `${identityPrefix}validation:inline-memory-note:${validationHash}`
639
+ };
640
+ }
641
+ isNamespacePolicyAuthorized(namespace) {
642
+ try {
643
+ resolveExplicitCaptureNamespace(this.orchestrator, namespace);
644
+ return true;
645
+ } catch {
646
+ return false;
647
+ }
648
+ }
649
+ resolveReviewFallbackNamespace(request, input) {
650
+ if (request.namespacePreResolved === true || this.isNamespacePolicyAuthorized(input.namespace)) return void 0;
651
+ return request.reviewNamespacePreResolved === true ? asTrimmed(request.reviewNamespace) : this.orchestrator.config.defaultNamespace;
652
+ }
653
+ remember(keys) {
654
+ for (const key of keys) {
655
+ if (this.observedKeys.has(key)) continue;
656
+ this.observedKeys.add(key);
657
+ this.observedKeyOrder.push(key);
658
+ }
659
+ while (this.observedKeyOrder.length > this.maxDedupeKeys) {
660
+ const expired = this.observedKeyOrder.shift();
661
+ if (expired) this.observedKeys.delete(expired);
662
+ }
663
+ }
664
+ async processNote(request, input, replayKeys, validationFailureKey) {
665
+ const serializationKey = replayKeys.at(-1) ?? validationFailureKey;
666
+ return this.enqueue(serializationKey, async () => {
667
+ if (replayKeys.some((key) => this.observedKeys.has(key)) || this.observedKeys.has(validationFailureKey)) {
668
+ return { processed: 0, accepted: 0, queued: 0, duplicates: 1, failed: 0 };
669
+ }
670
+ const classifyPersisted = (persisted) => {
671
+ this.remember(replayKeys);
672
+ if (persisted.duplicateOf) {
673
+ return { processed: 1, accepted: 0, queued: 0, duplicates: 1, failed: 0 };
674
+ }
675
+ if (persisted.tombstoneBlocked) {
676
+ this.orchestrator.requestQmdMaintenanceForTool("inline.memory_note.review");
677
+ return { processed: 1, accepted: 0, queued: 1, duplicates: 0, failed: 0 };
678
+ }
679
+ this.orchestrator.requestQmdMaintenanceForTool("inline.memory_note");
680
+ return { processed: 1, accepted: 1, queued: 0, duplicates: 0, failed: 0 };
681
+ };
682
+ const persistCandidate = async (candidate2) => classifyPersisted(await persistExplicitCapture(this.orchestrator, candidate2, "inline"));
683
+ let validationSucceeded = false;
684
+ let candidate;
685
+ try {
686
+ candidate = validateExplicitCaptureInput(input);
687
+ if (request.namespacePreResolved === true) candidate.namespacePreResolved = true;
688
+ validationSucceeded = true;
689
+ return await persistCandidate(candidate);
690
+ } catch (error) {
691
+ let captureError = error;
692
+ if (validationSucceeded && candidate && isTombstoneBlockedCaptureWriteLockBusy(error)) {
693
+ try {
694
+ return await persistCandidate(candidate);
695
+ } catch (retryError) {
696
+ if (isTombstoneBlockedCaptureWriteLockBusy(retryError)) {
697
+ log.warn(
698
+ `explicit inline capture deferred after tombstone write lock contention: ${normalizeExplicitCaptureError(retryError)}`
699
+ );
700
+ return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };
701
+ }
702
+ captureError = retryError;
703
+ }
704
+ }
705
+ if (validationSucceeded && !isUnsupportedExplicitCaptureNamespaceError(captureError)) {
706
+ log.warn(`explicit inline capture persistence failed: ${normalizeExplicitCaptureError(captureError)}`);
707
+ return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };
708
+ }
709
+ const queueInput = request.namespacePreResolved === true ? { ...input, namespacePreResolved: true } : input;
710
+ const reviewNamespace = this.resolveReviewFallbackNamespace(request, input);
711
+ try {
712
+ const review = await queueExplicitCaptureForReview(
713
+ this.orchestrator,
714
+ queueInput,
715
+ "inline",
716
+ captureError,
717
+ reviewNamespace ? { resolvedNamespace: reviewNamespace } : void 0
718
+ );
719
+ this.remember(validationSucceeded ? replayKeys : [validationFailureKey]);
720
+ if (review.duplicateOf) {
721
+ return { processed: 1, accepted: 0, queued: 0, duplicates: 1, failed: 0 };
722
+ }
723
+ this.orchestrator.requestQmdMaintenanceForTool("inline.memory_note.review");
724
+ return { processed: 1, accepted: 0, queued: 1, duplicates: 0, failed: 0 };
725
+ } catch (queueError) {
726
+ log.warn(
727
+ `explicit inline capture rejected: ${normalizeExplicitCaptureError(captureError)}; review queue fallback failed: ${normalizeExplicitCaptureError(queueError)}`
728
+ );
729
+ return { processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 1 };
730
+ }
731
+ }
732
+ });
733
+ }
734
+ async process(request) {
735
+ if (!shouldProcessInlineExplicitCapture({ captureMode: request.captureMode })) {
736
+ return { content: request.content, processed: 0, accepted: 0, queued: 0, duplicates: 0, failed: 0 };
737
+ }
738
+ if (request.namespacePreResolved === true && !asTrimmed(request.namespace)) {
739
+ throw new Error("namespacePreResolved requires a resolved namespace");
740
+ }
741
+ if (request.reviewNamespacePreResolved === true && !asTrimmed(request.reviewNamespace)) {
742
+ throw new Error("reviewNamespacePreResolved requires a resolved namespace");
743
+ }
744
+ const notes = parseInlineExplicitCaptureCandidates(request.content);
745
+ const content = hasInlineExplicitCaptureMarkup(request.content) ? stripInlineExplicitCaptureNotes(request.content) : request.content;
746
+ const sourceConnector = asTrimmed(request.sourceConnector) ?? asTrimmed(this.options.sourceConnector);
747
+ let processed = 0;
748
+ let accepted = 0;
749
+ let queued = 0;
750
+ let duplicates = 0;
751
+ let failed = 0;
752
+ for (const note of notes) {
753
+ const input = {
754
+ ...note,
755
+ ...request.namespace !== void 0 ? { namespace: request.namespace } : {},
756
+ ...sourceConnector ? { sourceConnector } : {}
757
+ };
758
+ const { replayKeys, validationFailureKey } = this.buildDedupeKeys(
759
+ request.dedupeKeys,
760
+ input,
761
+ request.namespacePreResolved === true,
762
+ this.resolveReviewFallbackNamespace(request, input)
763
+ );
764
+ const result = await this.processNote(request, input, replayKeys, validationFailureKey);
765
+ processed += result.processed;
766
+ accepted += result.accepted;
767
+ queued += result.queued;
768
+ duplicates += result.duplicates;
769
+ failed += result.failed;
770
+ }
771
+ return { content, processed, accepted, queued, duplicates, failed };
772
+ }
773
+ };
774
+
775
+ export {
776
+ parseInlineExplicitCaptureNotes,
777
+ hasInlineExplicitCaptureMarkup,
778
+ stripInlineExplicitCaptureNotes,
779
+ validateExplicitCaptureInput,
780
+ persistExplicitCapture,
781
+ queueExplicitCaptureForReview,
782
+ shouldSkipImplicitExtraction,
783
+ shouldProcessInlineExplicitCapture,
784
+ InlineExplicitCaptureProcessor
785
+ };
786
+ //# sourceMappingURL=chunk-PH3ZWL3W.js.map