@jungjaehoon/mama-core 2.4.1 → 4.0.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 (371) hide show
  1. package/README.md +76 -239
  2. package/db/migrations/030-case-first-memory-substrate.sql +13 -98
  3. package/db/migrations/034-add-connector-event-scope-columns.sql +9 -13
  4. package/db/migrations/039-add-connector-event-operator-ingest-seq.sql +9 -95
  5. package/db/migrations/062-refresh-connector-event-sequences.sql +9 -113
  6. package/db/migrations/063-refresh-legacy-connector-event-updates.sql +9 -32
  7. package/db/migrations/067-add-connector-event-source-entity-id.sql +9 -13
  8. package/db/migrations/069-create-registry-nodes.sql +52 -0
  9. package/db/migrations/070-record-identity.sql +35 -0
  10. package/db/migrations/071-service-operation-origins.sql +187 -0
  11. package/db/migrations/072-observation-versions.sql +29 -0
  12. package/db/migrations/073-registry-corrections.sql +45 -0
  13. package/db/migrations/074-work-graph-ref-kinds.sql +39 -0
  14. package/db/migrations/075-agent-judgments.sql +58 -0
  15. package/db/migrations/076-scoped-checkpoint-bindings.sql +15 -0
  16. package/db/migrations/077-legacy-record-kind.sql +6 -0
  17. package/db/migrations/078-source-ingest-commands.sql +18 -0
  18. package/db/migrations/079-twin-edge-relations.sql +43 -0
  19. package/db/migrations/080-restore-duration-days.sql +7 -0
  20. package/db/migrations/081-mailbox.sql +61 -0
  21. package/db/migrations/082-commitments-row-id.sql +12 -0
  22. package/db/migrations/083-observation-is-the-evidence.sql +49 -0
  23. package/db/migrations/084-scope-kind-is-not-the-cores-to-list.sql +34 -0
  24. package/db/migrations/085-a-migration-has-a-source.sql +37 -0
  25. package/db/migrations/086-the-mailbox-is-generic.sql +110 -0
  26. package/db/migrations/087-mailbox-payload.sql +5 -0
  27. package/db/migrations/088-native-input-journal.sql +14 -0
  28. package/db/migrations/089-native-turn-receipt-lookup.sql +3 -0
  29. package/db/migrations/090-model-run-native-inputs.sql +29 -0
  30. package/db/migrations/091-native-turn-results.sql +11 -0
  31. package/db/migrations/092-restore-decision-fts.sql +34 -0
  32. package/db/migrations/093-native-turn-primary-kind.sql +14 -0
  33. package/db/migrations/094-commitment-run-provenance.sql +9 -0
  34. package/db/migrations/095-model-run-native-input-identity.sql +39 -0
  35. package/db/migrations/096-drop-connector-event-index-fts.sql +9 -0
  36. package/db/migrations/097-native-input-json-validity.sql +37 -0
  37. package/db/migrations/098-workflow-memory-kind.sql +105 -0
  38. package/dist/action-contracts.d.ts +212 -0
  39. package/dist/action-contracts.js +10 -0
  40. package/dist/api/catalog.d.ts +118 -0
  41. package/dist/api/catalog.js +1756 -0
  42. package/dist/api/dispatch.d.ts +76 -0
  43. package/dist/api/dispatch.js +372 -0
  44. package/dist/canonicalize.d.ts +2 -2
  45. package/dist/canonicalize.js +3 -3
  46. package/dist/client/client.d.ts +33 -0
  47. package/dist/client/client.js +123 -0
  48. package/dist/client/ipc.d.ts +81 -0
  49. package/dist/client/ipc.js +314 -0
  50. package/dist/db-adapter/base-adapter.d.ts +6 -66
  51. package/dist/db-adapter/base-adapter.js +6 -6
  52. package/dist/db-adapter/index.d.ts +5 -5
  53. package/dist/db-adapter/index.js +2 -5
  54. package/dist/db-adapter/node-sqlite-adapter.d.ts +85 -15
  55. package/dist/db-adapter/node-sqlite-adapter.js +1968 -570
  56. package/dist/db-manager.d.ts +53 -97
  57. package/dist/db-manager.js +121 -603
  58. package/dist/embedding/embedder.d.ts +132 -0
  59. package/dist/embedding/embedder.js +299 -0
  60. package/dist/identity/principal-repository.d.ts +2 -2
  61. package/dist/index.d.ts +43 -58
  62. package/dist/index.js +97 -145
  63. package/dist/{context-compile/channel-grant.d.ts → knowledge/access.d.ts} +12 -17
  64. package/dist/knowledge/access.js +663 -0
  65. package/dist/knowledge/case-errors.d.ts +31 -0
  66. package/dist/knowledge/case-errors.js +40 -0
  67. package/dist/{cases/search-rollup.d.ts → knowledge/case-search-rollup.d.ts} +5 -4
  68. package/dist/{cases/search-rollup.js → knowledge/case-search-rollup.js} +6 -8
  69. package/dist/{cases/store.d.ts → knowledge/case-store.d.ts} +3 -6
  70. package/dist/{cases/store.js → knowledge/case-store.js} +7 -42
  71. package/dist/{cases/timeline-range.d.ts → knowledge/case-timeline-range.d.ts} +3 -3
  72. package/dist/{cases/timeline-range.js → knowledge/case-timeline-range.js} +47 -25
  73. package/dist/{cases/types.d.ts → knowledge/case-types.d.ts} +8 -2
  74. package/dist/{cases/types.js → knowledge/case-types.js} +1 -1
  75. package/dist/knowledge/commitments.d.ts +188 -0
  76. package/dist/knowledge/commitments.js +370 -0
  77. package/dist/knowledge/decision-edges.d.ts +70 -0
  78. package/dist/knowledge/decision-edges.js +123 -0
  79. package/dist/{agent-graph/types.d.ts → knowledge/graph-query.d.ts} +80 -70
  80. package/dist/knowledge/graph-query.js +1585 -0
  81. package/dist/knowledge/identity.d.ts +16 -0
  82. package/dist/knowledge/identity.js +22 -0
  83. package/dist/knowledge/index.d.ts +47 -0
  84. package/dist/knowledge/index.js +90 -0
  85. package/dist/knowledge/judgments.d.ts +118 -0
  86. package/dist/knowledge/judgments.js +808 -0
  87. package/dist/knowledge/observations.d.ts +160 -0
  88. package/dist/knowledge/observations.js +449 -0
  89. package/dist/knowledge/question-type.d.ts +34 -0
  90. package/dist/knowledge/question-type.js +70 -0
  91. package/dist/{search → knowledge}/ranker-features.js +1 -1
  92. package/dist/{search → knowledge}/search-quality.d.ts +0 -1
  93. package/dist/knowledge/search.d.ts +38 -0
  94. package/dist/knowledge/search.js +91 -0
  95. package/dist/knowledge/source-ingest.d.ts +65 -0
  96. package/dist/knowledge/source-ingest.js +174 -0
  97. package/dist/{edges/types.d.ts → knowledge/twin-edge-types.d.ts} +31 -4
  98. package/dist/{edges/types.js → knowledge/twin-edge-types.js} +13 -2
  99. package/dist/knowledge/work-dates.d.ts +49 -0
  100. package/dist/knowledge/work-dates.js +120 -0
  101. package/dist/mama-api.d.ts +114 -778
  102. package/dist/mama-api.js +313 -2461
  103. package/dist/memory/api.d.ts +264 -24
  104. package/dist/memory/api.js +1633 -843
  105. package/dist/memory/bootstrap-builder.d.ts +2 -1
  106. package/dist/memory/bootstrap-builder.js +5 -5
  107. package/dist/memory/channel-summary-state-store.d.ts +3 -2
  108. package/dist/memory/channel-summary-state-store.js +53 -51
  109. package/dist/memory/channel-summary-store.d.ts +5 -3
  110. package/dist/memory/channel-summary-store.js +3 -8
  111. package/dist/memory/dashboard-read.d.ts +46 -0
  112. package/dist/memory/dashboard-read.js +94 -0
  113. package/dist/memory/event-store.d.ts +3 -3
  114. package/dist/memory/event-store.js +3 -10
  115. package/dist/memory/finding-store.d.ts +3 -2
  116. package/dist/memory/finding-store.js +2 -7
  117. package/dist/memory/graph-read.d.ts +52 -0
  118. package/dist/memory/graph-read.js +130 -0
  119. package/dist/memory/judgment-types.d.ts +394 -0
  120. package/dist/memory/judgment-types.js +16 -0
  121. package/dist/memory/provenance-audit.d.ts +5 -2
  122. package/dist/memory/provenance-audit.js +8 -14
  123. package/dist/memory/provenance-live.d.ts +141 -0
  124. package/dist/memory/provenance-live.js +409 -0
  125. package/dist/memory/provenance-query.d.ts +5 -4
  126. package/dist/memory/provenance-query.js +21 -29
  127. package/dist/memory/provenance-resolver.d.ts +191 -0
  128. package/dist/memory/provenance-resolver.js +155 -0
  129. package/dist/memory/provenance.d.ts +1 -11
  130. package/dist/memory/provenance.js +2 -33
  131. package/dist/memory/recall-sanitize.d.ts +55 -0
  132. package/dist/memory/recall-sanitize.js +144 -0
  133. package/dist/memory/secret-filter.d.ts +32 -0
  134. package/dist/memory/secret-filter.js +126 -0
  135. package/dist/memory/truth-store.d.ts +2 -1
  136. package/dist/memory/truth-store.js +1 -4
  137. package/dist/memory/types.d.ts +74 -24
  138. package/dist/memory/types.js +75 -5
  139. package/dist/memory/write-adapters.d.ts +98 -0
  140. package/dist/memory/write-adapters.js +242 -0
  141. package/dist/operations/owner-action-effects.d.ts +53 -0
  142. package/dist/operations/owner-action-effects.js +96 -0
  143. package/dist/provenance/source-ref.d.ts +1 -1
  144. package/dist/provenance/source-ref.js +0 -2
  145. package/dist/registry/corrections.d.ts +31 -0
  146. package/dist/registry/corrections.js +332 -0
  147. package/dist/registry/record-identity.d.ts +49 -0
  148. package/dist/registry/record-identity.js +133 -0
  149. package/dist/registry/store.d.ts +101 -0
  150. package/dist/registry/store.js +395 -0
  151. package/dist/registry/types.d.ts +28 -0
  152. package/dist/registry/types.js +5 -0
  153. package/dist/relevance-scorer.js +2 -2
  154. package/dist/runtime/agent-event-bus.d.ts +50 -0
  155. package/dist/runtime/agent-event-bus.js +101 -0
  156. package/dist/runtime/drivers/claude-cli-wrapper.d.ts +155 -0
  157. package/dist/runtime/drivers/claude-cli-wrapper.js +392 -0
  158. package/dist/runtime/drivers/cli-arg-redaction.d.ts +2 -0
  159. package/dist/runtime/drivers/cli-arg-redaction.js +18 -0
  160. package/dist/runtime/drivers/cli-secret-redaction.d.ts +17 -0
  161. package/dist/runtime/drivers/cli-secret-redaction.js +126 -0
  162. package/dist/runtime/drivers/codex-app-server-process.d.ts +277 -0
  163. package/dist/runtime/drivers/codex-app-server-process.js +2342 -0
  164. package/dist/runtime/drivers/codex-auxiliary-tools.d.ts +17 -0
  165. package/dist/runtime/drivers/codex-auxiliary-tools.js +267 -0
  166. package/dist/runtime/drivers/codex-home.d.ts +20 -0
  167. package/dist/runtime/drivers/codex-home.js +674 -0
  168. package/dist/runtime/drivers/codex-thread-registry.d.ts +63 -0
  169. package/dist/runtime/drivers/codex-thread-registry.js +433 -0
  170. package/dist/runtime/drivers/persistent-cli-adapter.d.ts +160 -0
  171. package/dist/runtime/drivers/persistent-cli-adapter.js +396 -0
  172. package/dist/runtime/drivers/persistent-cli-process.d.ts +424 -0
  173. package/dist/runtime/drivers/persistent-cli-process.js +1543 -0
  174. package/dist/runtime/drivers/types.d.ts +456 -0
  175. package/dist/runtime/drivers/types.js +110 -0
  176. package/dist/runtime/mailbox.d.ts +223 -0
  177. package/dist/runtime/mailbox.js +582 -0
  178. package/dist/runtime/model-run-store.d.ts +28 -0
  179. package/dist/{model-runs/store.js → runtime/model-run-store.js} +81 -41
  180. package/dist/{model-runs/types.d.ts → runtime/model-run-types.d.ts} +33 -4
  181. package/dist/{model-runs/types.js → runtime/model-run-types.js} +1 -1
  182. package/dist/runtime/native-effect-observer.d.ts +22 -0
  183. package/dist/runtime/native-effect-observer.js +103 -0
  184. package/dist/runtime/native-input-journal.d.ts +46 -0
  185. package/dist/runtime/native-input-journal.js +308 -0
  186. package/dist/runtime/native-prompt.d.ts +118 -0
  187. package/dist/runtime/native-prompt.js +496 -0
  188. package/dist/runtime/native-session.d.ts +10 -0
  189. package/dist/{agent-graph/index.js → runtime/native-session.js} +9 -6
  190. package/dist/runtime/native-tool-trace-observer.d.ts +5 -0
  191. package/dist/runtime/native-tool-trace-observer.js +65 -0
  192. package/dist/runtime/native-turn.d.ts +272 -0
  193. package/dist/runtime/native-turn.js +1041 -0
  194. package/dist/runtime/operations.d.ts +236 -0
  195. package/dist/runtime/operations.js +565 -0
  196. package/dist/runtime/post-tool-handler.d.ts +74 -0
  197. package/dist/runtime/post-tool-handler.js +137 -0
  198. package/dist/runtime/prompt-layers.d.ts +126 -0
  199. package/dist/runtime/prompt-layers.js +239 -0
  200. package/dist/runtime/runtime-process.d.ts +102 -0
  201. package/dist/runtime/runtime-process.js +206 -0
  202. package/dist/runtime/runtime.d.ts +278 -0
  203. package/dist/runtime/runtime.js +563 -0
  204. package/dist/runtime/session-pool.d.ts +176 -0
  205. package/dist/runtime/session-pool.js +369 -0
  206. package/dist/runtime/stimulus-payload.d.ts +5 -0
  207. package/dist/runtime/stimulus-payload.js +50 -0
  208. package/dist/runtime/subagent-bridge.d.ts +24 -0
  209. package/dist/{agent-graph/types.js → runtime/subagent-bridge.js} +1 -1
  210. package/dist/runtime/text-completion.d.ts +22 -0
  211. package/dist/{agent-situation/types.js → runtime/text-completion.js} +1 -1
  212. package/dist/runtime/token-estimator.d.ts +25 -0
  213. package/dist/runtime/token-estimator.js +75 -0
  214. package/dist/runtime/tool-trace-store.d.ts +22 -0
  215. package/dist/{model-runs → runtime}/tool-trace-store.js +46 -27
  216. package/dist/runtime/trace-summary.d.ts +5 -0
  217. package/dist/runtime/trace-summary.js +74 -0
  218. package/dist/runtime/turn-text.d.ts +23 -0
  219. package/dist/runtime/turn-text.js +41 -0
  220. package/dist/storage/database.d.ts +67 -0
  221. package/dist/storage/database.js +158 -0
  222. package/package.json +20 -34
  223. package/dist/agent-graph/alias-write.d.ts +0 -3
  224. package/dist/agent-graph/alias-write.js +0 -234
  225. package/dist/agent-graph/entity-resolve.d.ts +0 -3
  226. package/dist/agent-graph/entity-resolve.js +0 -271
  227. package/dist/agent-graph/errors.d.ts +0 -4
  228. package/dist/agent-graph/errors.js +0 -11
  229. package/dist/agent-graph/graph-query.d.ts +0 -5
  230. package/dist/agent-graph/graph-query.js +0 -360
  231. package/dist/agent-graph/index.d.ts +0 -6
  232. package/dist/agent-situation/builder.d.ts +0 -8
  233. package/dist/agent-situation/builder.js +0 -239
  234. package/dist/agent-situation/cache-key.d.ts +0 -4
  235. package/dist/agent-situation/cache-key.js +0 -64
  236. package/dist/agent-situation/index.d.ts +0 -7
  237. package/dist/agent-situation/index.js +0 -28
  238. package/dist/agent-situation/packet-store.d.ts +0 -27
  239. package/dist/agent-situation/packet-store.js +0 -228
  240. package/dist/agent-situation/ranking-policy.d.ts +0 -18
  241. package/dist/agent-situation/ranking-policy.js +0 -75
  242. package/dist/agent-situation/source-readers.d.ts +0 -52
  243. package/dist/agent-situation/source-readers.js +0 -300
  244. package/dist/agent-situation/types.d.ts +0 -195
  245. package/dist/cases/wiki-page-index.d.ts +0 -37
  246. package/dist/cases/wiki-page-index.js +0 -201
  247. package/dist/config-loader.d.ts +0 -68
  248. package/dist/config-loader.js +0 -239
  249. package/dist/connectors/event-index.d.ts +0 -24
  250. package/dist/connectors/event-index.js +0 -245
  251. package/dist/connectors/raw-query.d.ts +0 -40
  252. package/dist/connectors/raw-query.js +0 -412
  253. package/dist/connectors/types.d.ts +0 -117
  254. package/dist/connectors/types.js +0 -3
  255. package/dist/context-compile/boundary-defaults.d.ts +0 -12
  256. package/dist/context-compile/boundary-defaults.js +0 -105
  257. package/dist/context-compile/channel-grant.js +0 -66
  258. package/dist/context-compile/compiler-policy.d.ts +0 -39
  259. package/dist/context-compile/compiler-policy.js +0 -147
  260. package/dist/context-compile/compiler.d.ts +0 -18
  261. package/dist/context-compile/compiler.js +0 -404
  262. package/dist/context-compile/index.d.ts +0 -10
  263. package/dist/context-compile/index.js +0 -26
  264. package/dist/context-compile/packet-store.d.ts +0 -8
  265. package/dist/context-compile/packet-store.js +0 -239
  266. package/dist/context-compile/ref.d.ts +0 -7
  267. package/dist/context-compile/ref.js +0 -102
  268. package/dist/context-compile/source-readers.d.ts +0 -70
  269. package/dist/context-compile/source-readers.js +0 -840
  270. package/dist/context-compile/types.d.ts +0 -155
  271. package/dist/context-compile/types.js +0 -11
  272. package/dist/context-compile/visibility.d.ts +0 -21
  273. package/dist/context-compile/visibility.js +0 -224
  274. package/dist/decision-tracker.d.ts +0 -206
  275. package/dist/decision-tracker.js +0 -481
  276. package/dist/edges/ref-validation.d.ts +0 -7
  277. package/dist/edges/ref-validation.js +0 -321
  278. package/dist/edges/store.d.ts +0 -8
  279. package/dist/edges/store.js +0 -129
  280. package/dist/embedding-client.d.ts +0 -28
  281. package/dist/embedding-client.js +0 -53
  282. package/dist/embedding-server/index.d.ts +0 -67
  283. package/dist/embedding-server/index.js +0 -405
  284. package/dist/embedding-server/mobile/auth.d.ts +0 -44
  285. package/dist/embedding-server/mobile/auth.js +0 -150
  286. package/dist/embedding-server/mobile/daemon.d.ts +0 -129
  287. package/dist/embedding-server/mobile/daemon.js +0 -313
  288. package/dist/embedding-server/mobile/output-parser.d.ts +0 -115
  289. package/dist/embedding-server/mobile/output-parser.js +0 -241
  290. package/dist/embedding-server/mobile/session-api.d.ts +0 -57
  291. package/dist/embedding-server/mobile/session-api.js +0 -261
  292. package/dist/embedding-server/mobile/session-manager.d.ts +0 -138
  293. package/dist/embedding-server/mobile/session-manager.js +0 -378
  294. package/dist/embedding-server/mobile/websocket-handler.d.ts +0 -137
  295. package/dist/embedding-server/mobile/websocket-handler.js +0 -486
  296. package/dist/embeddings.d.ts +0 -68
  297. package/dist/embeddings.js +0 -244
  298. package/dist/entities/audit-metrics.d.ts +0 -68
  299. package/dist/entities/audit-metrics.js +0 -124
  300. package/dist/entities/candidate-generator.d.ts +0 -8
  301. package/dist/entities/candidate-generator.js +0 -24
  302. package/dist/entities/entity-linked-decision-counts.d.ts +0 -2
  303. package/dist/entities/entity-linked-decision-counts.js +0 -29
  304. package/dist/entities/entity-list.d.ts +0 -22
  305. package/dist/entities/entity-list.js +0 -3
  306. package/dist/entities/entity-orphan-list.d.ts +0 -17
  307. package/dist/entities/entity-orphan-list.js +0 -3
  308. package/dist/entities/entity-search.d.ts +0 -20
  309. package/dist/entities/entity-search.js +0 -3
  310. package/dist/entities/errors.d.ts +0 -55
  311. package/dist/entities/errors.js +0 -100
  312. package/dist/entities/lineage-store.d.ts +0 -28
  313. package/dist/entities/lineage-store.js +0 -204
  314. package/dist/entities/normalization.d.ts +0 -14
  315. package/dist/entities/normalization.js +0 -63
  316. package/dist/entities/policy-store.d.ts +0 -8
  317. package/dist/entities/policy-store.js +0 -75
  318. package/dist/entities/policy-types.d.ts +0 -72
  319. package/dist/entities/policy-types.js +0 -59
  320. package/dist/entities/projection.d.ts +0 -8
  321. package/dist/entities/projection.js +0 -82
  322. package/dist/entities/provenance-query.d.ts +0 -32
  323. package/dist/entities/provenance-query.js +0 -3
  324. package/dist/entities/read-identity.d.ts +0 -31
  325. package/dist/entities/read-identity.js +0 -264
  326. package/dist/entities/recall-bridge.d.ts +0 -5
  327. package/dist/entities/recall-bridge.js +0 -171
  328. package/dist/entities/resolution-engine.d.ts +0 -8
  329. package/dist/entities/resolution-engine.js +0 -3
  330. package/dist/entities/rollback-preview.d.ts +0 -35
  331. package/dist/entities/rollback-preview.js +0 -3
  332. package/dist/entities/source-locator.d.ts +0 -3
  333. package/dist/entities/source-locator.js +0 -32
  334. package/dist/entities/store.d.ts +0 -69
  335. package/dist/entities/store.js +0 -544
  336. package/dist/entities/types.d.ts +0 -166
  337. package/dist/entities/types.js +0 -30
  338. package/dist/memory/extraction-prompt.d.ts +0 -4
  339. package/dist/memory/extraction-prompt.js +0 -89
  340. package/dist/memory/scope-backfill.d.ts +0 -14
  341. package/dist/memory/scope-backfill.js +0 -3
  342. package/dist/memory/scope-store.d.ts +0 -4
  343. package/dist/memory/scope-store.js +0 -9
  344. package/dist/memory-store.d.ts +0 -87
  345. package/dist/memory-store.js +0 -78
  346. package/dist/model-runs/store.d.ts +0 -13
  347. package/dist/model-runs/tool-trace-store.d.ts +0 -8
  348. package/dist/notification-manager.d.ts +0 -7
  349. package/dist/notification-manager.js +0 -12
  350. package/dist/outcome-tracker.d.ts +0 -151
  351. package/dist/outcome-tracker.js +0 -271
  352. package/dist/query-intent.d.ts +0 -23
  353. package/dist/query-intent.js +0 -114
  354. package/dist/runtime/trusted-provenance.d.ts +0 -3
  355. package/dist/runtime/trusted-provenance.js +0 -6
  356. package/dist/search/question-type.d.ts +0 -5
  357. package/dist/search/question-type.js +0 -41
  358. package/dist/test-utils.d.ts +0 -80
  359. package/dist/test-utils.js +0 -218
  360. package/dist/tier-validator.d.ts +0 -43
  361. package/dist/tier-validator.js +0 -159
  362. package/dist/time-formatter.d.ts +0 -25
  363. package/dist/time-formatter.js +0 -93
  364. /package/dist/{search → knowledge}/feedback-store.d.ts +0 -0
  365. /package/dist/{search → knowledge}/feedback-store.js +0 -0
  366. /package/dist/{search → knowledge}/ranker-features.d.ts +0 -0
  367. /package/dist/{search → knowledge}/ranker-rescore.d.ts +0 -0
  368. /package/dist/{search → knowledge}/ranker-rescore.js +0 -0
  369. /package/dist/{search → knowledge}/ranker-trainer.d.ts +0 -0
  370. /package/dist/{search → knowledge}/ranker-trainer.js +0 -0
  371. /package/dist/{search → knowledge}/search-quality.js +0 -0
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ /**
3
+ * Secret-pattern filter for recallable writes.
4
+ *
5
+ * The one real leak path a chat-reachable caller has is memory: a secret saved
6
+ * as a "decision" resurfaces later through search or recall. This filter
7
+ * refuses the write at the choke point, which is the action contract — every
8
+ * write that recall can return passes through here. Minimal gitleaks-style
9
+ * set: shapes, not entropy heuristics, so false positives stay near zero.
10
+ *
11
+ * It lives in core because the contract does. The patterns name provider key
12
+ * shapes and prompt-injection phrasing; nothing here knows a product.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SecretMaterialRefusedError = void 0;
16
+ exports.scanForSecrets = scanForSecrets;
17
+ exports.scanMemoryWriteInput = scanMemoryWriteInput;
18
+ exports.redactSecretPatterns = redactSecretPatterns;
19
+ const SECRET_PATTERNS = [
20
+ {
21
+ name: 'invisible-unicode',
22
+ pattern: /[\u200b-\u200d\ufeff\u2060\u202a-\u202e\u2066-\u2069]/,
23
+ },
24
+ // Built via concatenation so the literals never form secret shapes at rest
25
+ // (the repo's own PII/secret scanners would flag them - correctly).
26
+ { name: 'anthropic-key', pattern: new RegExp('\\bsk-' + 'ant-[a-zA-Z0-9_-]{8,}') },
27
+ {
28
+ name: 'openai-key',
29
+ pattern: new RegExp('\\bsk-' + '(?:proj-[A-Za-z0-9_-]{20,}|[A-Za-z0-9]{20,}\\b)'),
30
+ },
31
+ {
32
+ name: 'github-token',
33
+ pattern: new RegExp('\\b(?:gh' + '[pousr]_[A-Za-z0-9]{20,}\\b|github_pat_[A-Za-z0-9_]{20,})'),
34
+ },
35
+ { name: 'slack-token', pattern: new RegExp('\\bxox' + '[baprs]-[A-Za-z0-9-]{10,}\\b') },
36
+ {
37
+ name: 'telegram-bot-token',
38
+ pattern: new RegExp('\\b\\d{8,12}:' + 'AA[A-Za-z0-9_-]{30,}\\b'),
39
+ },
40
+ { name: 'aws-access-key', pattern: new RegExp('\\bAKIA' + '[0-9A-Z]{16}\\b') },
41
+ {
42
+ name: 'private-key-block',
43
+ pattern: new RegExp('-----BEGIN [A-Z ]*' + 'PRIVATE KEY' + '-----'),
44
+ },
45
+ { name: 'generic-bearer', pattern: new RegExp('\\bBearer\\s+' + '[A-Za-z0-9_-]{25,}\\b') },
46
+ ];
47
+ const PROMPT_INJECTION_PATTERNS = [
48
+ /\bignore\s+(?:(?:all|any)\s+)?(?:previous|prior)\s+instructions\b/i,
49
+ /\bdisregard\s+.{0,20}(?:rules|instructions)\b/i,
50
+ /\byou\s+are\s+now\b/i,
51
+ /\bsystem\s+prompt\b/i,
52
+ ];
53
+ class SecretMaterialRefusedError extends Error {
54
+ constructor(matches) {
55
+ super(`refusing to persist content matching ${matches.join(', ')} — a secret written here comes back through recall`);
56
+ this.name = 'secret_material_refused';
57
+ }
58
+ }
59
+ exports.SecretMaterialRefusedError = SecretMaterialRefusedError;
60
+ /** Scan text for secret-shaped material. */
61
+ function scanForSecrets(text) {
62
+ const matches = SECRET_PATTERNS.filter(({ pattern }) => pattern.test(text)).map(({ name }) => name);
63
+ const warnings = PROMPT_INJECTION_PATTERNS.some((pattern) => pattern.test(text))
64
+ ? ['prompt-injection-suspect']
65
+ : [];
66
+ return { clean: matches.length === 0, matches, warnings };
67
+ }
68
+ /**
69
+ * Scan every string reachable in a memory-write input (nested objects and
70
+ * arrays included, container-depth-capped): open_files arrays, scope ids, and source
71
+ * objects are persisted too and must not smuggle secrets past a top-level
72
+ * scan (review m1).
73
+ */
74
+ function scanMemoryWriteInput(input) {
75
+ const texts = [];
76
+ let truncated = false;
77
+ const visit = (value, depth) => {
78
+ if (value === null || value === undefined) {
79
+ return;
80
+ }
81
+ // Scan leaves of the deepest supported container too. Recallable page
82
+ // batches carry evidence at pages[].sourceRefs[].id (a depth-five leaf).
83
+ if (typeof value === 'string') {
84
+ texts.push(value);
85
+ return;
86
+ }
87
+ if (typeof value !== 'object') {
88
+ return;
89
+ }
90
+ if (depth > 4) {
91
+ // Fail CLOSED: an abnormally deep memory-write payload is refused, never
92
+ // silently under-scanned (a secret below the cap must not pass as clean).
93
+ truncated = true;
94
+ return;
95
+ }
96
+ if (Array.isArray(value)) {
97
+ for (const item of value) {
98
+ visit(item, depth + 1);
99
+ }
100
+ return;
101
+ }
102
+ if (typeof value === 'object') {
103
+ for (const item of Object.values(value)) {
104
+ visit(item, depth + 1);
105
+ }
106
+ }
107
+ };
108
+ visit(input, 0);
109
+ if (truncated) {
110
+ return { clean: false, matches: ['scan-depth-limit-exceeded'], warnings: [] };
111
+ }
112
+ return scanForSecrets(texts.join('\n'));
113
+ }
114
+ /** Mask the same credential shapes in observations without treating hashes as tokens. */
115
+ function redactSecretPatterns(text) {
116
+ let redacted = text.replace(new RegExp('-----BEGIN [A-Z ]*' +
117
+ 'PRIVATE KEY-----[\\s\\S]*?(?:-----END [A-Z ]*' +
118
+ 'PRIVATE KEY-----|$)', 'g'), '[REDACTED]');
119
+ for (const { name, pattern } of SECRET_PATTERNS) {
120
+ if (name !== 'invisible-unicode') {
121
+ redacted = redacted.replace(new RegExp(pattern.source, 'g'), '[REDACTED]');
122
+ }
123
+ }
124
+ return redacted;
125
+ }
126
+ //# sourceMappingURL=secret-filter.js.map
@@ -1,5 +1,6 @@
1
+ import type { DatabaseAdapter } from '../db-manager.js';
1
2
  import type { MemoryScopeRef, MemoryTruthRow } from './types.js';
2
- export declare function queryRelevantTruth(params: {
3
+ export declare function queryRelevantTruth(adapter: DatabaseAdapter, params: {
3
4
  query: string;
4
5
  scopes: MemoryScopeRef[];
5
6
  includeHistory?: boolean;
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.queryRelevantTruth = queryRelevantTruth;
4
- const db_manager_js_1 = require("../db-manager.js");
5
4
  function decisionToTruthRow(row) {
6
5
  return {
7
6
  memory_id: row.id,
@@ -30,9 +29,7 @@ function matchesQuery(row, query) {
30
29
  ? haystack.includes(query.toLowerCase())
31
30
  : tokens.some((token) => haystack.includes(token));
32
31
  }
33
- async function queryRelevantTruth(params) {
34
- await (0, db_manager_js_1.initDB)();
35
- const adapter = (0, db_manager_js_1.getAdapter)();
32
+ async function queryRelevantTruth(adapter, params) {
36
33
  const scopeMatch = params.scopes
37
34
  .map(() => '(scope_filter.kind = ? AND scope_filter.external_id = ?)')
38
35
  .join(' OR ');
@@ -1,10 +1,31 @@
1
- import type { ConnectorEventSearchHit } from '../connectors/types.js';
2
- import type { ReadIdentity } from '../entities/read-identity.js';
3
- import type { SearchHitDiagnostics, SearchQualityOptions, SearchStrictness } from '../search/search-quality.js';
1
+ import type { RecordActor } from '../registry/types.js';
2
+ import type { RecordLink } from './judgment-types.js';
3
+ import type { SearchHitDiagnostics, SearchQualityOptions, SearchStrictness } from '../knowledge/search-quality.js';
4
+ /**
5
+ * The scope kinds this repository's own products happen to use.
6
+ *
7
+ * NOT the set of kinds that exist. A scope is a (kind, id) pair; the pair is the
8
+ * core's, the vocabulary is the consumer's. These are exported so a product can
9
+ * reuse a familiar word, and so nothing that already writes them has to change --
10
+ * they are not a gate. A consumer with a kind of its own passes it and the core
11
+ * carries it, because the core does not read the kind, it matches it.
12
+ */
13
+ export declare const COMMON_MEMORY_SCOPE_KINDS: readonly ["global", "user", "channel", "project"];
14
+ /** Kept as the old name for callers that import it; same list, still not a gate. */
4
15
  export declare const MEMORY_SCOPE_KINDS: readonly ["global", "user", "channel", "project"];
5
- export type MemoryScopeKind = (typeof MEMORY_SCOPE_KINDS)[number];
6
- export declare const MEMORY_KINDS: readonly ["decision", "preference", "constraint", "lesson", "fact", "task", "schedule", "compiled"];
16
+ export type MemoryScopeKind = string;
17
+ /**
18
+ * What a memory can be.
19
+ *
20
+ * `task`, `schedule` and `compiled` were here and are not any more. Nothing writes
21
+ * them -- no call site in either package, no row in the live database -- and they name
22
+ * one product's board, cron and context-packet vocabulary rather than anything a
23
+ * memory is. The stored kind check still accepts the retired task and schedule values;
24
+ * adding a new kind needs a migration because that check constrains the column.
25
+ */
26
+ export declare const MEMORY_KINDS: readonly ["decision", "preference", "constraint", "lesson", "fact", "workflow"];
7
27
  export type MemoryKind = (typeof MEMORY_KINDS)[number];
28
+ export type MemoryKindFilter = MemoryKind | [MemoryKind, ...MemoryKind[]];
8
29
  export declare const MEMORY_STATUSES: readonly ["active", "superseded", "contradicted", "stale"];
9
30
  export type MemoryStatus = (typeof MEMORY_STATUSES)[number];
10
31
  export declare const MEMORY_TRUTH_STATUSES: readonly ["active", "superseded", "contradicted", "stale", "quarantined"];
@@ -22,7 +43,12 @@ export interface MemoryScopeRef {
22
43
  id: string;
23
44
  }
24
45
  export interface MemorySourceRef {
25
- package: 'mama-core' | 'mcp-server' | 'standalone' | 'claude-code-plugin';
46
+ /**
47
+ * Which package wrote this. A free string, not a union of the four packages that
48
+ * happened to exist when it was written: a second product installing this core would
49
+ * have had to be added to the core's own type before it could save anything.
50
+ */
51
+ package: string;
26
52
  source_type: string;
27
53
  user_id?: string;
28
54
  channel_id?: string;
@@ -34,6 +60,12 @@ export interface MemoryRecord {
34
60
  kind: MemoryKind;
35
61
  summary: string;
36
62
  details: string;
63
+ /** One-line context that tells an agent when this guidance applies. */
64
+ applies_when?: string;
65
+ /** Ordered procedure steps for workflow records. */
66
+ steps?: string[];
67
+ /** Evidence checks a workflow must complete, in order. */
68
+ evidence_checks?: string[];
37
69
  confidence: number;
38
70
  status: MemoryStatus;
39
71
  scopes: MemoryScopeRef[];
@@ -44,10 +76,12 @@ export interface MemoryRecord {
44
76
  event_date?: string | null;
45
77
  /** Source event timestamp in milliseconds when known. Null if not set. */
46
78
  event_datetime?: number | null;
47
- read_identity?: ReadIdentity;
79
+ /** Maintained outcome projection (SUCCESS | FAILED | PARTIAL | pending). Null when unset. */
80
+ outcome?: string | null;
48
81
  retrieval_diagnostics?: SearchHitDiagnostics;
49
82
  }
50
83
  export type RecallMemoryOptions = SearchQualityOptions & {
84
+ kind?: MemoryKindFilter;
51
85
  scopes?: MemoryScopeRef[];
52
86
  includeProfile?: boolean;
53
87
  includeHistory?: boolean;
@@ -58,7 +92,6 @@ export interface RecallSearchDiagnostics {
58
92
  candidate_counts: {
59
93
  vector: number;
60
94
  lexical: number;
61
- entity: number;
62
95
  graph_expanded: number;
63
96
  vector_only: number;
64
97
  rejected_by_strictness: number;
@@ -84,8 +117,15 @@ export interface ProfileSnapshot {
84
117
  export interface RecallBundle {
85
118
  profile: ProfileSnapshot;
86
119
  memories: MemoryRecord[];
87
- /** Phase 3: cross-connector event hits, populated when searchWithConnectorEvents=true */
88
- connector_event_hits?: ConnectorEventSearchHit[];
120
+ /**
121
+ * Hits from a source outside the judgment log, when the caller asked for them.
122
+ *
123
+ * This was typed as the connector event index's row, which made the core's
124
+ * recall bundle depend on a package three of four consumers do not install. The
125
+ * shape is whatever the source produced; what the core states is that a hit is
126
+ * ranked and scored.
127
+ */
128
+ connector_event_hits?: SourceSearchHit[];
89
129
  graph_context: {
90
130
  primary: MemoryRecord[];
91
131
  expanded: MemoryRecord[];
@@ -98,8 +138,13 @@ export interface RecallBundle {
98
138
  diagnostics?: RecallSearchDiagnostics;
99
139
  };
100
140
  }
101
- /** Phase 3: unified search result type — memory-authored or connector-enriched. */
102
- export type MemorySearchResultHit = MemoryRecord | ConnectorEventSearchHit;
141
+ /** A ranked hit from a source the core did not author. Its fields are the source's. */
142
+ export interface SourceSearchHit extends Record<string, unknown> {
143
+ rank: number;
144
+ score: number;
145
+ }
146
+ /** A search result: authored by the judgment log, or found in a source. */
147
+ export type MemorySearchResultHit = MemoryRecord | SourceSearchHit;
103
148
  export interface MemoryEventRecord {
104
149
  event_id: string;
105
150
  event_type: 'observed_conversation' | 'save' | 'supersede' | 'contradict' | 'mark_stale' | 'quarantine' | 'no_op' | 'audit_failed' | 'notice_sent' | 'provenance.empty_batch' | 'provenance.link_write_failed' | 'connector_event_index.retention_swept' | 'case.link_created' | 'case.link_revoked' | 'case.membership_pinned' | 'case.membership_unpinned' | 'case.source_promoted' | 'case.freshness_drifted' | 'automation.job.started' | 'automation.job.succeeded' | 'automation.job.failed' | 'automation.job.skipped_concurrent' | 'review.bulk.approved' | 'review.bulk.rejected' | 'review.bulk.deferred' | 'canary.drift.false_merge_rate' | 'canary.drift.projection_fragmentation_rate' | 'canary.drift.replay_stale' | 'auth.role_denied' | 'ontology.proposal' | 'ontology.approval' | 'repair.approval' | 'case.fast_write_applied' | 'case.fast_write_lock_skipped' | 'case.correction_applied' | 'case.correction_reverted' | 'case.correction_superseded' | 'case.membership_tombstoned' | 'case.merged' | 'case.split' | 'case.membership_matched' | 'case.membership_candidate';
@@ -139,6 +184,9 @@ export interface PublicSaveMemoryInput {
139
184
  kind: MemoryKind;
140
185
  summary: string;
141
186
  details: string;
187
+ appliesWhen?: string;
188
+ steps?: string[];
189
+ evidenceChecks?: string[];
142
190
  confidence?: number;
143
191
  status?: MemoryStatus;
144
192
  scopes: MemoryScopeRef[];
@@ -147,18 +195,15 @@ export interface PublicSaveMemoryInput {
147
195
  eventDate?: string;
148
196
  eventDateTime?: number;
149
197
  entityObservationIds?: string[];
150
- timelineEvent?: {
151
- id?: string;
152
- entity_id?: string;
153
- event_type: string;
154
- role?: string | null;
155
- valid_from?: number | null;
156
- valid_to?: number | null;
157
- observed_at?: number | null;
158
- source_ref?: string | null;
159
- summary: string;
160
- details?: string | null;
161
- };
198
+ itemId?: string | null;
199
+ actors?: RecordActor[];
200
+ /** Explicit, scope-checked relationships from this new judgment. */
201
+ links?: RecordLink[];
202
+ /** Earlier records this judgment explicitly replaces; matching topic is not enough. */
203
+ replaces?: Array<{
204
+ id: string;
205
+ reason: string;
206
+ }>;
162
207
  }
163
208
  export interface PublicIngestMemoryInput {
164
209
  content: string;
@@ -345,4 +390,9 @@ export interface IngestConversationResult {
345
390
  topic: string;
346
391
  }>;
347
392
  }
393
+ export declare function canonicalizeContextScopes(scopes: readonly MemoryScopeRef[] | undefined): {
394
+ scopes: MemoryScopeRef[];
395
+ scopeJson: string;
396
+ scopeHash: string;
397
+ };
348
398
  //# sourceMappingURL=types.d.ts.map
@@ -1,18 +1,38 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MEMORY_AUDIT_ACK_STATUSES = exports.MEMORY_CONSULT_INTENTS = exports.MEMORY_AGENT_ACTIONS = exports.MEMORY_EDGE_TYPES = exports.MEMORY_TRUTH_STATUSES = exports.MEMORY_STATUSES = exports.MEMORY_KINDS = exports.MEMORY_SCOPE_KINDS = void 0;
3
+ exports.MEMORY_AUDIT_ACK_STATUSES = exports.MEMORY_CONSULT_INTENTS = exports.MEMORY_AGENT_ACTIONS = exports.MEMORY_EDGE_TYPES = exports.MEMORY_TRUTH_STATUSES = exports.MEMORY_STATUSES = exports.MEMORY_KINDS = exports.MEMORY_SCOPE_KINDS = exports.COMMON_MEMORY_SCOPE_KINDS = void 0;
4
4
  exports.createEmptyRecallBundle = createEmptyRecallBundle;
5
5
  exports.createMemoryAuditAck = createMemoryAuditAck;
6
- exports.MEMORY_SCOPE_KINDS = ['global', 'user', 'channel', 'project'];
6
+ exports.canonicalizeContextScopes = canonicalizeContextScopes;
7
+ const node_crypto_1 = require("node:crypto");
8
+ /**
9
+ * The scope kinds this repository's own products happen to use.
10
+ *
11
+ * NOT the set of kinds that exist. A scope is a (kind, id) pair; the pair is the
12
+ * core's, the vocabulary is the consumer's. These are exported so a product can
13
+ * reuse a familiar word, and so nothing that already writes them has to change --
14
+ * they are not a gate. A consumer with a kind of its own passes it and the core
15
+ * carries it, because the core does not read the kind, it matches it.
16
+ */
17
+ exports.COMMON_MEMORY_SCOPE_KINDS = ['global', 'user', 'channel', 'project'];
18
+ /** Kept as the old name for callers that import it; same list, still not a gate. */
19
+ exports.MEMORY_SCOPE_KINDS = exports.COMMON_MEMORY_SCOPE_KINDS;
20
+ /**
21
+ * What a memory can be.
22
+ *
23
+ * `task`, `schedule` and `compiled` were here and are not any more. Nothing writes
24
+ * them -- no call site in either package, no row in the live database -- and they name
25
+ * one product's board, cron and context-packet vocabulary rather than anything a
26
+ * memory is. The stored kind check still accepts the retired task and schedule values;
27
+ * adding a new kind needs a migration because that check constrains the column.
28
+ */
7
29
  exports.MEMORY_KINDS = [
8
30
  'decision',
9
31
  'preference',
10
32
  'constraint',
11
33
  'lesson',
12
34
  'fact',
13
- 'task',
14
- 'schedule',
15
- 'compiled',
35
+ 'workflow',
16
36
  ];
17
37
  exports.MEMORY_STATUSES = ['active', 'superseded', 'contradicted', 'stale'];
18
38
  exports.MEMORY_TRUTH_STATUSES = [
@@ -67,4 +87,54 @@ function createMemoryAuditAck(input) {
67
87
  reason: input.reason,
68
88
  };
69
89
  }
90
+ // --- Scope identity -------------------------------------------------------------
91
+ //
92
+ // Two scope lists naming the same scopes are the same list. The order and the hash below
93
+ // are what makes that true, so they live with the type rather than with any one reader.
94
+ const SCOPE_ORDER = new Map([
95
+ ['project', 0],
96
+ ['channel', 1],
97
+ ['user', 2],
98
+ ['global', 3],
99
+ ]);
100
+ function assertScope(scope) {
101
+ // A kind is nonblank text. Which kinds exist is the consumer's statement, not a
102
+ // list kept here -- this used to compare against COMMON_MEMORY_SCOPE_KINDS, so a
103
+ // consumer whose world had a kind of its own could not store one.
104
+ if (typeof scope.kind !== 'string' || scope.kind.trim().length === 0) {
105
+ throw new Error(`Memory scope kind must be nonblank text, got: ${String(scope.kind)}`);
106
+ }
107
+ const id = scope.id.trim();
108
+ if (id.length === 0) {
109
+ throw new Error('Memory scope id must not be empty');
110
+ }
111
+ return { kind: scope.kind, id };
112
+ }
113
+ function scopeKey(scope) {
114
+ return `${scope.kind}\0${scope.id}`;
115
+ }
116
+ function sortScopes(scopes) {
117
+ return [...scopes].sort((left, right) => {
118
+ const orderDiff = (SCOPE_ORDER.get(left.kind) ?? 4) - (SCOPE_ORDER.get(right.kind) ?? 4);
119
+ if (orderDiff !== 0) {
120
+ return orderDiff;
121
+ }
122
+ return left.kind.localeCompare(right.kind) || left.id.localeCompare(right.id);
123
+ });
124
+ }
125
+ function canonicalizeContextScopes(scopes) {
126
+ const unique = new Map();
127
+ for (const scope of scopes ?? []) {
128
+ const normalized = assertScope(scope);
129
+ unique.set(scopeKey(normalized), normalized);
130
+ }
131
+ const canonicalScopes = sortScopes([...unique.values()]);
132
+ const scopeJson = JSON.stringify(canonicalScopes);
133
+ const scopeHash = (0, node_crypto_1.createHash)('sha256').update(scopeJson).digest('hex');
134
+ return {
135
+ scopes: canonicalScopes,
136
+ scopeJson,
137
+ scopeHash,
138
+ };
139
+ }
70
140
  //# sourceMappingURL=types.js.map
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Mechanical adapters between the public memory write surfaces and the
3
+ * knowledge command boundary.
4
+ *
5
+ * Every write funnels through `appendJudgment` (or `ingestSource` for raw
6
+ * evidence): the adapter builds exactly one command, derives honest access —
7
+ * never fabricating authority the caller did not present — and maps the receipt
8
+ * back to the legacy result shape.
9
+ */
10
+ import type { DatabaseAdapter, DatabaseInstance, DecisionInput } from '../db-manager.js';
11
+ import type { JudgmentAccess } from '../knowledge/judgments.js';
12
+ import type { JudgmentProjections, JsonValue, RecordLink } from './judgment-types.js';
13
+ import type { MemoryScopeRef } from './types.js';
14
+ import type { NormalizedMemoryProvenance } from './provenance.js';
15
+ /** Access for a caller with no signed identity: it is admitted to exactly the
16
+ * scopes it declared, nothing more. */
17
+ export declare function unsignedWriteAccess(scopes: readonly MemoryScopeRef[]): JudgmentAccess;
18
+ /**
19
+ * Access derived from normalized write provenance — the legacy direct-write
20
+ * path, where the caller is the process itself and declares its own scopes.
21
+ * Unified-action writes do NOT come through here: dispatch passes the real
22
+ * `JudgmentAccess` (the call authority) straight to `appendJudgment`.
23
+ */
24
+ export declare function writeAccessForProvenance(provenance: NormalizedMemoryProvenance, requestedScopes: readonly MemoryScopeRef[]): JudgmentAccess;
25
+ /** Scope refs currently bound to a memory row — the partition a write into
26
+ * that row must be admitted to. */
27
+ export declare function boundScopesOf(adapter: Pick<DatabaseAdapter, 'prepare'>, memoryId: string): MemoryScopeRef[];
28
+ /**
29
+ * Fail-first visibility check for explicitly authored relationship targets,
30
+ * preserving the legacy error contract.
31
+ *
32
+ * Trusted envelopes check visibility strictly inside admitted scopes (unbound
33
+ * legacy rows are not reachable — same as the pre-boundary envelope check).
34
+ * Unsigned callers keep the legacy existence check for the original error
35
+ * text; scope admission is then enforced by the command boundary itself.
36
+ */
37
+ export declare function assertRelationshipTargetsVisible(adapter: Pick<DatabaseAdapter, 'prepare'>, targetIds: readonly string[], admittedScopes: readonly MemoryScopeRef[], trustedEnvelope: boolean): void;
38
+ export interface ExplicitRelationship {
39
+ type: string;
40
+ targetId: string;
41
+ }
42
+ /**
43
+ * Map deduplicated legacy relationships onto command fields.
44
+ *
45
+ * Trusted envelopes get the authored form: `supersedes` targets become
46
+ * scope-checked `replaces`, and link-able relations also enter the twin edge
47
+ * graph as explicit `links` — both fail closed inside the boundary.
48
+ *
49
+ * Unsigned callers keep the legacy contract: the adapter already checked that
50
+ * each target exists, so relationships are written only as `decision_edges`
51
+ * projection rows and `supersedes` targets are moved out of current truth
52
+ * through the `supersedeTargets` projection — never as scope-checked authored
53
+ * links the caller was not admitted to.
54
+ */
55
+ export declare function relationshipsToCommandFields(relationships: readonly ExplicitRelationship[], options?: {
56
+ trusted?: boolean;
57
+ }): {
58
+ links: RecordLink[];
59
+ replaces: Array<{
60
+ id: string;
61
+ reason: string;
62
+ }>;
63
+ decisionEdges: NonNullable<JudgmentProjections['decisionEdges']>;
64
+ supersedeTargets: string[];
65
+ };
66
+ /**
67
+ * Embedder for the command boundary that preserves the legacy enhanced
68
+ * embedding input.
69
+ */
70
+ export declare function commandEmbedder(decision: DecisionInput): {
71
+ embed(text: string, role: 'query' | 'passage'): Promise<Float32Array | null>;
72
+ };
73
+ export interface OutcomeAmendmentInput {
74
+ outcome?: string | null;
75
+ failureReason?: string | null;
76
+ limitation?: string | null;
77
+ confidence?: number | null;
78
+ durationDays?: number | null;
79
+ /** Extra fields written on the amendment record's payload for audit. */
80
+ payload?: Record<string, JsonValue>;
81
+ /** Callers that can name their own command id get replay for free. */
82
+ commandId?: string;
83
+ recordedAt?: number;
84
+ eventReason?: string;
85
+ }
86
+ /**
87
+ * Append one judgment record carrying an authored outcome change and apply the
88
+ * maintained `decisions` projection columns on the target in the same
89
+ * transaction. Identical payloads on the same target replay the stored receipt
90
+ * instead of appending a second record.
91
+ */
92
+ export declare function appendOutcomeAmendment(decisionId: string, input: OutcomeAmendmentInput, options: {
93
+ adapter: DatabaseInstance;
94
+ }): Promise<{
95
+ recordId: string;
96
+ commandId: string;
97
+ }>;
98
+ //# sourceMappingURL=write-adapters.d.ts.map