@jungjaehoon/mama-core 2.4.1 → 4.1.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 (378) 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/db/migrations/099-commitment-revision-graph.sql +2 -0
  39. package/dist/action-contracts.d.ts +212 -0
  40. package/dist/action-contracts.js +10 -0
  41. package/dist/api/catalog.d.ts +118 -0
  42. package/dist/api/catalog.js +1756 -0
  43. package/dist/api/dispatch.d.ts +76 -0
  44. package/dist/api/dispatch.js +372 -0
  45. package/dist/canonicalize.d.ts +2 -2
  46. package/dist/canonicalize.js +3 -3
  47. package/dist/client/client.d.ts +33 -0
  48. package/dist/client/client.js +123 -0
  49. package/dist/client/ipc.d.ts +81 -0
  50. package/dist/client/ipc.js +314 -0
  51. package/dist/db-adapter/base-adapter.d.ts +6 -66
  52. package/dist/db-adapter/base-adapter.js +6 -6
  53. package/dist/db-adapter/index.d.ts +5 -5
  54. package/dist/db-adapter/index.js +2 -5
  55. package/dist/db-adapter/node-sqlite-adapter.d.ts +85 -15
  56. package/dist/db-adapter/node-sqlite-adapter.js +1985 -570
  57. package/dist/db-manager.d.ts +53 -97
  58. package/dist/db-manager.js +121 -603
  59. package/dist/embedding/embedder.d.ts +132 -0
  60. package/dist/embedding/embedder.js +299 -0
  61. package/dist/identity/principal-repository.d.ts +2 -2
  62. package/dist/index.d.ts +43 -58
  63. package/dist/index.js +97 -145
  64. package/dist/{context-compile/channel-grant.d.ts → knowledge/access.d.ts} +12 -17
  65. package/dist/knowledge/access.js +663 -0
  66. package/dist/knowledge/case-errors.d.ts +31 -0
  67. package/dist/knowledge/case-errors.js +40 -0
  68. package/dist/{cases/search-rollup.d.ts → knowledge/case-search-rollup.d.ts} +5 -4
  69. package/dist/{cases/search-rollup.js → knowledge/case-search-rollup.js} +6 -8
  70. package/dist/{cases/store.d.ts → knowledge/case-store.d.ts} +3 -6
  71. package/dist/{cases/store.js → knowledge/case-store.js} +7 -42
  72. package/dist/{cases/timeline-range.d.ts → knowledge/case-timeline-range.d.ts} +3 -3
  73. package/dist/{cases/timeline-range.js → knowledge/case-timeline-range.js} +47 -25
  74. package/dist/{cases/types.d.ts → knowledge/case-types.d.ts} +8 -2
  75. package/dist/{cases/types.js → knowledge/case-types.js} +1 -1
  76. package/dist/knowledge/commitment-revision-migration.d.ts +4 -0
  77. package/dist/knowledge/commitment-revision-migration.js +50 -0
  78. package/dist/knowledge/commitments.d.ts +192 -0
  79. package/dist/knowledge/commitments.js +386 -0
  80. package/dist/knowledge/decision-edges.d.ts +70 -0
  81. package/dist/knowledge/decision-edges.js +123 -0
  82. package/dist/{agent-graph/types.d.ts → knowledge/graph-query.d.ts} +80 -70
  83. package/dist/knowledge/graph-query.js +1585 -0
  84. package/dist/knowledge/identity.d.ts +16 -0
  85. package/dist/knowledge/identity.js +22 -0
  86. package/dist/knowledge/index.d.ts +47 -0
  87. package/dist/knowledge/index.js +90 -0
  88. package/dist/knowledge/judgment-edge.d.ts +6 -0
  89. package/dist/knowledge/judgment-edge.js +22 -0
  90. package/dist/knowledge/judgments.d.ts +118 -0
  91. package/dist/knowledge/judgments.js +802 -0
  92. package/dist/knowledge/observations.d.ts +160 -0
  93. package/dist/knowledge/observations.js +449 -0
  94. package/dist/knowledge/question-type.d.ts +34 -0
  95. package/dist/knowledge/question-type.js +70 -0
  96. package/dist/{search → knowledge}/ranker-features.js +1 -1
  97. package/dist/{search → knowledge}/search-quality.d.ts +0 -1
  98. package/dist/knowledge/search.d.ts +38 -0
  99. package/dist/knowledge/search.js +91 -0
  100. package/dist/knowledge/source-ingest.d.ts +65 -0
  101. package/dist/knowledge/source-ingest.js +174 -0
  102. package/dist/{edges/types.d.ts → knowledge/twin-edge-types.d.ts} +31 -4
  103. package/dist/{edges/types.js → knowledge/twin-edge-types.js} +13 -2
  104. package/dist/knowledge/work-dates.d.ts +49 -0
  105. package/dist/knowledge/work-dates.js +120 -0
  106. package/dist/mama-api.d.ts +114 -778
  107. package/dist/mama-api.js +313 -2461
  108. package/dist/memory/api.d.ts +264 -24
  109. package/dist/memory/api.js +1633 -843
  110. package/dist/memory/bootstrap-builder.d.ts +2 -1
  111. package/dist/memory/bootstrap-builder.js +5 -5
  112. package/dist/memory/channel-summary-state-store.d.ts +3 -2
  113. package/dist/memory/channel-summary-state-store.js +53 -51
  114. package/dist/memory/channel-summary-store.d.ts +5 -3
  115. package/dist/memory/channel-summary-store.js +3 -8
  116. package/dist/memory/dashboard-read.d.ts +46 -0
  117. package/dist/memory/dashboard-read.js +94 -0
  118. package/dist/memory/event-store.d.ts +3 -3
  119. package/dist/memory/event-store.js +3 -10
  120. package/dist/memory/finding-store.d.ts +3 -2
  121. package/dist/memory/finding-store.js +2 -7
  122. package/dist/memory/graph-read.d.ts +52 -0
  123. package/dist/memory/graph-read.js +130 -0
  124. package/dist/memory/judgment-types.d.ts +394 -0
  125. package/dist/memory/judgment-types.js +16 -0
  126. package/dist/memory/provenance-audit.d.ts +5 -2
  127. package/dist/memory/provenance-audit.js +8 -14
  128. package/dist/memory/provenance-live.d.ts +141 -0
  129. package/dist/memory/provenance-live.js +409 -0
  130. package/dist/memory/provenance-query.d.ts +5 -4
  131. package/dist/memory/provenance-query.js +21 -29
  132. package/dist/memory/provenance-resolver.d.ts +191 -0
  133. package/dist/memory/provenance-resolver.js +155 -0
  134. package/dist/memory/provenance.d.ts +1 -11
  135. package/dist/memory/provenance.js +2 -33
  136. package/dist/memory/recall-sanitize.d.ts +55 -0
  137. package/dist/memory/recall-sanitize.js +144 -0
  138. package/dist/memory/secret-filter.d.ts +32 -0
  139. package/dist/memory/secret-filter.js +126 -0
  140. package/dist/memory/truth-store.d.ts +2 -1
  141. package/dist/memory/truth-store.js +1 -4
  142. package/dist/memory/types.d.ts +74 -24
  143. package/dist/memory/types.js +75 -5
  144. package/dist/memory/write-adapters.d.ts +98 -0
  145. package/dist/memory/write-adapters.js +242 -0
  146. package/dist/operations/owner-action-effects.d.ts +53 -0
  147. package/dist/operations/owner-action-effects.js +96 -0
  148. package/dist/provenance/source-ref.d.ts +1 -1
  149. package/dist/provenance/source-ref.js +0 -2
  150. package/dist/registry/corrections.d.ts +31 -0
  151. package/dist/registry/corrections.js +332 -0
  152. package/dist/registry/record-identity.d.ts +49 -0
  153. package/dist/registry/record-identity.js +133 -0
  154. package/dist/registry/store.d.ts +101 -0
  155. package/dist/registry/store.js +395 -0
  156. package/dist/registry/types.d.ts +28 -0
  157. package/dist/registry/types.js +5 -0
  158. package/dist/relevance-scorer.js +2 -2
  159. package/dist/runtime/agent-event-bus.d.ts +50 -0
  160. package/dist/runtime/agent-event-bus.js +101 -0
  161. package/dist/runtime/drivers/claude-cli-wrapper.d.ts +152 -0
  162. package/dist/runtime/drivers/claude-cli-wrapper.js +375 -0
  163. package/dist/runtime/drivers/claude-effort.d.ts +4 -0
  164. package/dist/runtime/drivers/claude-effort.js +16 -0
  165. package/dist/runtime/drivers/cli-arg-redaction.d.ts +2 -0
  166. package/dist/runtime/drivers/cli-arg-redaction.js +18 -0
  167. package/dist/runtime/drivers/cli-secret-redaction.d.ts +17 -0
  168. package/dist/runtime/drivers/cli-secret-redaction.js +126 -0
  169. package/dist/runtime/drivers/codex-app-server-process.d.ts +277 -0
  170. package/dist/runtime/drivers/codex-app-server-process.js +2342 -0
  171. package/dist/runtime/drivers/codex-auxiliary-tools.d.ts +17 -0
  172. package/dist/runtime/drivers/codex-auxiliary-tools.js +267 -0
  173. package/dist/runtime/drivers/codex-home.d.ts +20 -0
  174. package/dist/runtime/drivers/codex-home.js +674 -0
  175. package/dist/runtime/drivers/codex-thread-registry.d.ts +63 -0
  176. package/dist/runtime/drivers/codex-thread-registry.js +433 -0
  177. package/dist/runtime/drivers/persistent-cli-adapter.d.ts +160 -0
  178. package/dist/runtime/drivers/persistent-cli-adapter.js +396 -0
  179. package/dist/runtime/drivers/persistent-cli-process.d.ts +425 -0
  180. package/dist/runtime/drivers/persistent-cli-process.js +1529 -0
  181. package/dist/runtime/drivers/types.d.ts +456 -0
  182. package/dist/runtime/drivers/types.js +110 -0
  183. package/dist/runtime/mailbox.d.ts +223 -0
  184. package/dist/runtime/mailbox.js +582 -0
  185. package/dist/runtime/model-run-store.d.ts +28 -0
  186. package/dist/{model-runs/store.js → runtime/model-run-store.js} +81 -41
  187. package/dist/{model-runs/types.d.ts → runtime/model-run-types.d.ts} +33 -4
  188. package/dist/{model-runs/types.js → runtime/model-run-types.js} +1 -1
  189. package/dist/runtime/native-effect-observer.d.ts +22 -0
  190. package/dist/runtime/native-effect-observer.js +103 -0
  191. package/dist/runtime/native-input-journal.d.ts +46 -0
  192. package/dist/runtime/native-input-journal.js +308 -0
  193. package/dist/runtime/native-prompt.d.ts +118 -0
  194. package/dist/runtime/native-prompt.js +496 -0
  195. package/dist/runtime/native-session.d.ts +10 -0
  196. package/dist/{agent-graph/index.js → runtime/native-session.js} +9 -6
  197. package/dist/runtime/native-tool-trace-observer.d.ts +5 -0
  198. package/dist/runtime/native-tool-trace-observer.js +65 -0
  199. package/dist/runtime/native-turn.d.ts +272 -0
  200. package/dist/runtime/native-turn.js +1041 -0
  201. package/dist/runtime/operations.d.ts +236 -0
  202. package/dist/runtime/operations.js +565 -0
  203. package/dist/runtime/post-tool-handler.d.ts +74 -0
  204. package/dist/runtime/post-tool-handler.js +137 -0
  205. package/dist/runtime/prompt-layers.d.ts +126 -0
  206. package/dist/runtime/prompt-layers.js +239 -0
  207. package/dist/runtime/runtime-process.d.ts +102 -0
  208. package/dist/runtime/runtime-process.js +206 -0
  209. package/dist/runtime/runtime.d.ts +278 -0
  210. package/dist/runtime/runtime.js +563 -0
  211. package/dist/runtime/session-pool.d.ts +176 -0
  212. package/dist/runtime/session-pool.js +369 -0
  213. package/dist/runtime/stimulus-payload.d.ts +5 -0
  214. package/dist/runtime/stimulus-payload.js +50 -0
  215. package/dist/runtime/subagent-bridge.d.ts +24 -0
  216. package/dist/{agent-graph/types.js → runtime/subagent-bridge.js} +1 -1
  217. package/dist/runtime/text-completion.d.ts +22 -0
  218. package/dist/{agent-situation/types.js → runtime/text-completion.js} +1 -1
  219. package/dist/runtime/token-estimator.d.ts +25 -0
  220. package/dist/runtime/token-estimator.js +75 -0
  221. package/dist/runtime/tool-trace-store.d.ts +22 -0
  222. package/dist/{model-runs → runtime}/tool-trace-store.js +46 -27
  223. package/dist/runtime/trace-summary.d.ts +5 -0
  224. package/dist/runtime/trace-summary.js +74 -0
  225. package/dist/runtime/turn-text.d.ts +23 -0
  226. package/dist/runtime/turn-text.js +41 -0
  227. package/dist/storage/database.d.ts +67 -0
  228. package/dist/storage/database.js +158 -0
  229. package/package.json +20 -34
  230. package/dist/agent-graph/alias-write.d.ts +0 -3
  231. package/dist/agent-graph/alias-write.js +0 -234
  232. package/dist/agent-graph/entity-resolve.d.ts +0 -3
  233. package/dist/agent-graph/entity-resolve.js +0 -271
  234. package/dist/agent-graph/errors.d.ts +0 -4
  235. package/dist/agent-graph/errors.js +0 -11
  236. package/dist/agent-graph/graph-query.d.ts +0 -5
  237. package/dist/agent-graph/graph-query.js +0 -360
  238. package/dist/agent-graph/index.d.ts +0 -6
  239. package/dist/agent-situation/builder.d.ts +0 -8
  240. package/dist/agent-situation/builder.js +0 -239
  241. package/dist/agent-situation/cache-key.d.ts +0 -4
  242. package/dist/agent-situation/cache-key.js +0 -64
  243. package/dist/agent-situation/index.d.ts +0 -7
  244. package/dist/agent-situation/index.js +0 -28
  245. package/dist/agent-situation/packet-store.d.ts +0 -27
  246. package/dist/agent-situation/packet-store.js +0 -228
  247. package/dist/agent-situation/ranking-policy.d.ts +0 -18
  248. package/dist/agent-situation/ranking-policy.js +0 -75
  249. package/dist/agent-situation/source-readers.d.ts +0 -52
  250. package/dist/agent-situation/source-readers.js +0 -300
  251. package/dist/agent-situation/types.d.ts +0 -195
  252. package/dist/cases/wiki-page-index.d.ts +0 -37
  253. package/dist/cases/wiki-page-index.js +0 -201
  254. package/dist/config-loader.d.ts +0 -68
  255. package/dist/config-loader.js +0 -239
  256. package/dist/connectors/event-index.d.ts +0 -24
  257. package/dist/connectors/event-index.js +0 -245
  258. package/dist/connectors/raw-query.d.ts +0 -40
  259. package/dist/connectors/raw-query.js +0 -412
  260. package/dist/connectors/types.d.ts +0 -117
  261. package/dist/connectors/types.js +0 -3
  262. package/dist/context-compile/boundary-defaults.d.ts +0 -12
  263. package/dist/context-compile/boundary-defaults.js +0 -105
  264. package/dist/context-compile/channel-grant.js +0 -66
  265. package/dist/context-compile/compiler-policy.d.ts +0 -39
  266. package/dist/context-compile/compiler-policy.js +0 -147
  267. package/dist/context-compile/compiler.d.ts +0 -18
  268. package/dist/context-compile/compiler.js +0 -404
  269. package/dist/context-compile/index.d.ts +0 -10
  270. package/dist/context-compile/index.js +0 -26
  271. package/dist/context-compile/packet-store.d.ts +0 -8
  272. package/dist/context-compile/packet-store.js +0 -239
  273. package/dist/context-compile/ref.d.ts +0 -7
  274. package/dist/context-compile/ref.js +0 -102
  275. package/dist/context-compile/source-readers.d.ts +0 -70
  276. package/dist/context-compile/source-readers.js +0 -840
  277. package/dist/context-compile/types.d.ts +0 -155
  278. package/dist/context-compile/types.js +0 -11
  279. package/dist/context-compile/visibility.d.ts +0 -21
  280. package/dist/context-compile/visibility.js +0 -224
  281. package/dist/decision-tracker.d.ts +0 -206
  282. package/dist/decision-tracker.js +0 -481
  283. package/dist/edges/ref-validation.d.ts +0 -7
  284. package/dist/edges/ref-validation.js +0 -321
  285. package/dist/edges/store.d.ts +0 -8
  286. package/dist/edges/store.js +0 -129
  287. package/dist/embedding-client.d.ts +0 -28
  288. package/dist/embedding-client.js +0 -53
  289. package/dist/embedding-server/index.d.ts +0 -67
  290. package/dist/embedding-server/index.js +0 -405
  291. package/dist/embedding-server/mobile/auth.d.ts +0 -44
  292. package/dist/embedding-server/mobile/auth.js +0 -150
  293. package/dist/embedding-server/mobile/daemon.d.ts +0 -129
  294. package/dist/embedding-server/mobile/daemon.js +0 -313
  295. package/dist/embedding-server/mobile/output-parser.d.ts +0 -115
  296. package/dist/embedding-server/mobile/output-parser.js +0 -241
  297. package/dist/embedding-server/mobile/session-api.d.ts +0 -57
  298. package/dist/embedding-server/mobile/session-api.js +0 -261
  299. package/dist/embedding-server/mobile/session-manager.d.ts +0 -138
  300. package/dist/embedding-server/mobile/session-manager.js +0 -378
  301. package/dist/embedding-server/mobile/websocket-handler.d.ts +0 -137
  302. package/dist/embedding-server/mobile/websocket-handler.js +0 -486
  303. package/dist/embeddings.d.ts +0 -68
  304. package/dist/embeddings.js +0 -244
  305. package/dist/entities/audit-metrics.d.ts +0 -68
  306. package/dist/entities/audit-metrics.js +0 -124
  307. package/dist/entities/candidate-generator.d.ts +0 -8
  308. package/dist/entities/candidate-generator.js +0 -24
  309. package/dist/entities/entity-linked-decision-counts.d.ts +0 -2
  310. package/dist/entities/entity-linked-decision-counts.js +0 -29
  311. package/dist/entities/entity-list.d.ts +0 -22
  312. package/dist/entities/entity-list.js +0 -3
  313. package/dist/entities/entity-orphan-list.d.ts +0 -17
  314. package/dist/entities/entity-orphan-list.js +0 -3
  315. package/dist/entities/entity-search.d.ts +0 -20
  316. package/dist/entities/entity-search.js +0 -3
  317. package/dist/entities/errors.d.ts +0 -55
  318. package/dist/entities/errors.js +0 -100
  319. package/dist/entities/lineage-store.d.ts +0 -28
  320. package/dist/entities/lineage-store.js +0 -204
  321. package/dist/entities/normalization.d.ts +0 -14
  322. package/dist/entities/normalization.js +0 -63
  323. package/dist/entities/policy-store.d.ts +0 -8
  324. package/dist/entities/policy-store.js +0 -75
  325. package/dist/entities/policy-types.d.ts +0 -72
  326. package/dist/entities/policy-types.js +0 -59
  327. package/dist/entities/projection.d.ts +0 -8
  328. package/dist/entities/projection.js +0 -82
  329. package/dist/entities/provenance-query.d.ts +0 -32
  330. package/dist/entities/provenance-query.js +0 -3
  331. package/dist/entities/read-identity.d.ts +0 -31
  332. package/dist/entities/read-identity.js +0 -264
  333. package/dist/entities/recall-bridge.d.ts +0 -5
  334. package/dist/entities/recall-bridge.js +0 -171
  335. package/dist/entities/resolution-engine.d.ts +0 -8
  336. package/dist/entities/resolution-engine.js +0 -3
  337. package/dist/entities/rollback-preview.d.ts +0 -35
  338. package/dist/entities/rollback-preview.js +0 -3
  339. package/dist/entities/source-locator.d.ts +0 -3
  340. package/dist/entities/source-locator.js +0 -32
  341. package/dist/entities/store.d.ts +0 -69
  342. package/dist/entities/store.js +0 -544
  343. package/dist/entities/types.d.ts +0 -166
  344. package/dist/entities/types.js +0 -30
  345. package/dist/memory/extraction-prompt.d.ts +0 -4
  346. package/dist/memory/extraction-prompt.js +0 -89
  347. package/dist/memory/scope-backfill.d.ts +0 -14
  348. package/dist/memory/scope-backfill.js +0 -3
  349. package/dist/memory/scope-store.d.ts +0 -4
  350. package/dist/memory/scope-store.js +0 -9
  351. package/dist/memory-store.d.ts +0 -87
  352. package/dist/memory-store.js +0 -78
  353. package/dist/model-runs/store.d.ts +0 -13
  354. package/dist/model-runs/tool-trace-store.d.ts +0 -8
  355. package/dist/notification-manager.d.ts +0 -7
  356. package/dist/notification-manager.js +0 -12
  357. package/dist/outcome-tracker.d.ts +0 -151
  358. package/dist/outcome-tracker.js +0 -271
  359. package/dist/query-intent.d.ts +0 -23
  360. package/dist/query-intent.js +0 -114
  361. package/dist/runtime/trusted-provenance.d.ts +0 -3
  362. package/dist/runtime/trusted-provenance.js +0 -6
  363. package/dist/search/question-type.d.ts +0 -5
  364. package/dist/search/question-type.js +0 -41
  365. package/dist/test-utils.d.ts +0 -80
  366. package/dist/test-utils.js +0 -218
  367. package/dist/tier-validator.d.ts +0 -43
  368. package/dist/tier-validator.js +0 -159
  369. package/dist/time-formatter.d.ts +0 -25
  370. package/dist/time-formatter.js +0 -93
  371. /package/dist/{search → knowledge}/feedback-store.d.ts +0 -0
  372. /package/dist/{search → knowledge}/feedback-store.js +0 -0
  373. /package/dist/{search → knowledge}/ranker-features.d.ts +0 -0
  374. /package/dist/{search → knowledge}/ranker-rescore.d.ts +0 -0
  375. /package/dist/{search → knowledge}/ranker-rescore.js +0 -0
  376. /package/dist/{search → knowledge}/ranker-trainer.d.ts +0 -0
  377. /package/dist/{search → knowledge}/ranker-trainer.js +0 -0
  378. /package/dist/{search → knowledge}/search-quality.js +0 -0
@@ -0,0 +1,409 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OBSERVATION_COLUMNS = void 0;
4
+ exports.parseSourceRef = parseSourceRef;
5
+ exports.isEventVisibleNow = isEventVisibleNow;
6
+ exports.toIndexedEvent = toIndexedEvent;
7
+ exports.isMessageRefVisible = isMessageRefVisible;
8
+ exports.resolveMemoryProvenanceLive = resolveMemoryProvenanceLive;
9
+ const access_js_1 = require("../knowledge/access.js");
10
+ const provenance_query_js_1 = require("./provenance-query.js");
11
+ const provenance_resolver_js_1 = require("./provenance-resolver.js");
12
+ /** The columns the predicate needs. Shared so a test reads exactly what production does. */
13
+ /**
14
+ * The evidence columns, read from observations under the names the resolver uses.
15
+ *
16
+ * This selected them from the connector event index, which is how "what does this
17
+ * memory rest on" came to require the connector package. An observation is what a
18
+ * judgment rests on, and it is the core's own table.
19
+ */
20
+ exports.OBSERVATION_COLUMNS = `observation_id AS event_index_id, source AS source_connector,
21
+ source_id, channel, body AS content, observed_at, source_at,
22
+ memory_scope_kind, memory_scope_id, project_id, tenant_id`;
23
+ /**
24
+ * Statuses every memory read path excludes (source-readers.ts:293, and recall's own
25
+ * history exclusion). Mirrored so a citation cannot present a retired record as current.
26
+ */
27
+ const RETIRED_MEMORY_STATUSES = new Set(['superseded', 'quarantined', 'contradicted', 'stale']);
28
+ /**
29
+ * Parse a stored source ref into what it actually is.
30
+ *
31
+ * The shapes here were measured, not guessed. Of the source refs on this machine 13,403
32
+ * are `memory:`, 1,748 are `envelope:`, 9 are `message:` and none are `raw:`. An earlier
33
+ * version of this parser understood only `raw:` and reported every real memory as
34
+ * `unsupported_ref` - a tool that was wired, callable, and answered nothing.
35
+ */
36
+ function parseSourceRef(ref) {
37
+ const separator = ref.indexOf(':');
38
+ if (separator <= 0 || separator === ref.length - 1) {
39
+ return { kind: 'unsupported' };
40
+ }
41
+ const prefix = ref.slice(0, separator);
42
+ const rest = ref.slice(separator + 1);
43
+ if (prefix === 'memory' || prefix === 'envelope' || prefix === 'message') {
44
+ return { kind: prefix, id: rest };
45
+ }
46
+ if (prefix !== 'raw') {
47
+ return { kind: 'unsupported' };
48
+ }
49
+ // `raw:<connector>:<event_index_id>`. Split on the FIRST colon of the remainder so a
50
+ // colon inside the id cannot shift the boundary.
51
+ const inner = rest.indexOf(':');
52
+ if (inner <= 0 || inner === rest.length - 1) {
53
+ return { kind: 'unsupported' };
54
+ }
55
+ return { kind: 'raw', connector: rest.slice(0, inner), eventIndexId: rest.slice(inner + 1) };
56
+ }
57
+ /**
58
+ * The time bound, shared by both branches.
59
+ *
60
+ * An event with no timestamp at all cannot satisfy a bound the reader applies to a
61
+ * COALESCE of two columns, so it is excluded whenever one is set.
62
+ */
63
+ function isWithinObservedWindow(event, options) {
64
+ const min = options.minObservedMs ?? null;
65
+ const max = options.maxObservedMs ?? null;
66
+ if (min === null && max === null)
67
+ return true;
68
+ const observedMs = event.observedAt === null ? null : Date.parse(event.observedAt);
69
+ if (observedMs === null || Number.isNaN(observedMs))
70
+ return false;
71
+ return (min === null || observedMs >= min) && (max === null || observedMs <= max);
72
+ }
73
+ function isWithinSourceWindow(event, maxSourceMs) {
74
+ if (maxSourceMs === undefined || maxSourceMs === null)
75
+ return true;
76
+ if (!Number.isSafeInteger(maxSourceMs) || maxSourceMs < 0) {
77
+ throw new Error('Provenance source ceiling must be a nonnegative epoch-millisecond integer');
78
+ }
79
+ if (event.sourceAt === null || event.sourceAt === undefined)
80
+ return false;
81
+ const sourceMs = Date.parse(event.sourceAt);
82
+ return Number.isFinite(sourceMs) && sourceMs <= maxSourceMs;
83
+ }
84
+ /**
85
+ * Whether an event may be shown under the authority active now.
86
+ *
87
+ * When a channel grant is supplied this DELEGATES to the shared rule rather than copying
88
+ * it. The previous version copied the reader clause for clause and said so in a comment,
89
+ * which held until the reader changed - then the copy silently became a different rule
90
+ * that refused excerpts for the very events the reader was citing. The differential test
91
+ * meant to catch that kept passing, because its fixtures never set a grant.
92
+ *
93
+ * "A shared predicate would be better than a faithful copy" is what the old comment here
94
+ * said. It was right.
95
+ *
96
+ * Without a grant the pre-grant rule still applies, so callers that have not been given
97
+ * one behave exactly as before.
98
+ */
99
+ function isEventVisibleNow(event, options) {
100
+ const { scopes, connectors } = options;
101
+ if (options.wideConnectors?.includes(event.connector) && connectors.includes(event.connector)) {
102
+ return (isWithinSourceWindow(event, options.maxSourceMs) && isWithinObservedWindow(event, options));
103
+ }
104
+ if (options.channels) {
105
+ return ((0, access_js_1.isChannelGranted)(event.connector, event.channel, options.channels) &&
106
+ isWithinSourceWindow(event, options.maxSourceMs) &&
107
+ isWithinObservedWindow(event, options));
108
+ }
109
+ const projectIds = options.projectIds ?? [];
110
+ const tenantId = options.tenantId ?? null;
111
+ // The reader's own guard: no connectors or no scopes means no raw events at all.
112
+ if (connectors.length === 0 || scopes.length === 0) {
113
+ return false;
114
+ }
115
+ if (!connectors.includes(event.connector)) {
116
+ return false;
117
+ }
118
+ const hasGlobalSystemScope = scopes.some((scope) => scope.kind === 'global' && scope.id === 'system');
119
+ const hasScopedVisibility = scopes.some((scope) => !(scope.kind === 'global' && scope.id === 'system')) ||
120
+ projectIds.length > 0 ||
121
+ Boolean(tenantId);
122
+ const includesLegacyGlobalSystem = hasGlobalSystemScope && !hasScopedVisibility;
123
+ if (projectIds.length > 0) {
124
+ const projectMatches = (event.projectId !== null &&
125
+ event.projectId !== undefined &&
126
+ projectIds.includes(event.projectId)) ||
127
+ (includesLegacyGlobalSystem && (event.projectId ?? null) === null);
128
+ if (!projectMatches) {
129
+ return false;
130
+ }
131
+ }
132
+ if (tenantId) {
133
+ const tenantMatches = event.tenantId === tenantId ||
134
+ (includesLegacyGlobalSystem && (event.tenantId ?? null) === null);
135
+ if (!tenantMatches) {
136
+ return false;
137
+ }
138
+ }
139
+ if (!isWithinSourceWindow(event, options.maxSourceMs) ||
140
+ !isWithinObservedWindow(event, options)) {
141
+ return false;
142
+ }
143
+ const scope = event.memoryScope ?? null;
144
+ if (!scope) {
145
+ return includesLegacyGlobalSystem;
146
+ }
147
+ return scopes.some((active) => active.kind === scope.kind &&
148
+ (active.id === scope.id ||
149
+ // Rows written before the global/system alignment carry id 'global'.
150
+ (active.kind === 'global' && active.id === 'system' && scope.id === 'global')));
151
+ }
152
+ /**
153
+ * One column to epoch ms, with SQL's notion of "absent" and no other.
154
+ *
155
+ * `COALESCE` falls through on NULL and nothing else, so 0 and negative values are
156
+ * PRESENT to the reader. Treating them as missing - which this did, by requiring
157
+ * `value > 0` - made the mapper judge a different instant than the query: a row with
158
+ * `event_datetime = 0` compared as 0 in SQL and as its source timestamp here. The
159
+ * differential caught it the moment it was routed through the production mapper.
160
+ *
161
+ * The non-numeric string branch is DEFENSIVE, not faithful: SQLite orders a TEXT value
162
+ * above every INTEGER regardless of what it spells, so SQL would exclude such a row from
163
+ * any upper bound while `Date.parse` gives it a real instant. Unreachable - both columns
164
+ * are INTEGER-affinity, the write path passes a number, and all 30,671 live rows store
165
+ * integers - but it is a divergence if it ever runs, and better named than implied.
166
+ */
167
+ function toEpochMs(value) {
168
+ if (typeof value === 'number') {
169
+ return Number.isFinite(value) ? value : null;
170
+ }
171
+ // better-sqlite3 returns bigint when safeIntegers is on. Nothing enables it today, but
172
+ // without this arm flipping that flag would null every timestamp and silently disable
173
+ // the time clamp entirely.
174
+ if (typeof value === 'bigint') {
175
+ return Number(value);
176
+ }
177
+ if (typeof value === 'string' && value.trim().length > 0) {
178
+ const numeric = Number(value);
179
+ if (Number.isFinite(numeric)) {
180
+ return numeric;
181
+ }
182
+ const parsed = Date.parse(value);
183
+ return Number.isNaN(parsed) ? null : parsed;
184
+ }
185
+ return null;
186
+ }
187
+ function coalesceObservedAt(eventDatetime, sourceTimestampMs) {
188
+ const ms = toEpochMs(eventDatetime) ?? toEpochMs(sourceTimestampMs);
189
+ return ms === null ? null : new Date(ms).toISOString();
190
+ }
191
+ /**
192
+ * Row to the struct the predicate judges.
193
+ *
194
+ * Exported because it is the layer BELOW the predicate, and a differential that
195
+ * hand-builds its own struct proves the predicate mirrors the reader while leaving this
196
+ * mapping unjudged - which is where a scope-column coercion bug already lived once.
197
+ */
198
+ function toIndexedEvent(row) {
199
+ const scopeKind = typeof row.memory_scope_kind === 'string' ? row.memory_scope_kind : null;
200
+ const scopeId = typeof row.memory_scope_id === 'string' ? row.memory_scope_id : null;
201
+ // Only a row with BOTH columns null is unscoped, because that is the only row the
202
+ // reader's `IS NULL AND IS NULL` clause matches. Collapsing a half-populated or
203
+ // empty-string row to "unscoped" would hand it the legacy allowance the reader denies.
204
+ const unscoped = scopeKind === null && scopeId === null;
205
+ return {
206
+ connector: String(row.source_connector ?? ''),
207
+ eventIndexId: String(row.event_index_id ?? ''),
208
+ sourceId: String(row.source_id ?? ''),
209
+ channel: typeof row.channel === 'string' ? row.channel : null,
210
+ // The capture instant first, the event's own time second -- the same order the
211
+ // raw reader's COALESCE uses, and pinned against it by a differential test.
212
+ observedAt: coalesceObservedAt(row.observed_at, row.source_at),
213
+ sourceAt: (() => {
214
+ const sourceMs = toEpochMs(row.source_at);
215
+ return sourceMs === null ? null : new Date(sourceMs).toISOString();
216
+ })(),
217
+ content: typeof row.content === 'string' ? row.content : '',
218
+ memoryScope: unscoped ? null : { kind: scopeKind ?? '', id: scopeId ?? '' },
219
+ projectId: typeof row.project_id === 'string' ? row.project_id : null,
220
+ tenantId: typeof row.tenant_id === 'string' ? row.tenant_id : null,
221
+ };
222
+ }
223
+ function stringOrNull(value) {
224
+ return typeof value === 'string' && value.trim().length > 0 ? value : null;
225
+ }
226
+ /**
227
+ * Fetch a memory's provenance under the scopes active now.
228
+ *
229
+ * Two lookups on purpose. The first is scope-strict. Only if that finds nothing do we ask
230
+ * again admitting records with no scope bindings, and a record that appears only on the
231
+ * second pass is reported as legacy rather than as support. A memory that appears on
232
+ * neither is reported as unknown - never as "exists but withheld", which would confirm
233
+ * the existence of something outside the caller's scope.
234
+ */
235
+ async function lookupWithLegacyFallback(adapter, memoryId, scopes) {
236
+ const scoped = await (0, provenance_query_js_1.getMemoryProvenance)(adapter, memoryId, { scopes });
237
+ if (scoped) {
238
+ return { record: scoped, legacy: false };
239
+ }
240
+ const unbound = await (0, provenance_query_js_1.getMemoryProvenance)(adapter, memoryId, {
241
+ scopes,
242
+ includeLegacyUnscoped: true,
243
+ });
244
+ return unbound ? { record: unbound, legacy: true } : null;
245
+ }
246
+ /**
247
+ * The stored record's status. `getMemoryProvenance` selects it nowhere, so this is a
248
+ * separate read rather than a field that was there all along - which is precisely why the
249
+ * status filter had no counterpart on this path for four review rounds.
250
+ */
251
+ async function loadRetirement(adapter, memoryId) {
252
+ const row = adapter
253
+ .prepare(`SELECT status, superseded_by FROM decisions WHERE id = ? LIMIT 1`)
254
+ .get(memoryId);
255
+ const status = typeof row?.status === 'string' ? row.status : null;
256
+ const supersededBy = typeof row?.superseded_by === 'string' ? row.superseded_by : null;
257
+ return {
258
+ status,
259
+ // Either signal retires it: the reader filters on status, and recall additionally
260
+ // requires `superseded_by IS NULL`.
261
+ retired: (status !== null && RETIRED_MEMORY_STATUSES.has(status)) || supersededBy !== null,
262
+ };
263
+ }
264
+ async function loadRecord(adapter, memoryId, scopes) {
265
+ const found = await lookupWithLegacyFallback(adapter, memoryId, scopes);
266
+ if (!found) {
267
+ return null;
268
+ }
269
+ const record = found.record;
270
+ const retirement = await loadRetirement(adapter, record.memory_id);
271
+ const provenance = record.provenance;
272
+ const sourceRefs = record.source_refs.map(parseSourceRef);
273
+ // The judgment writer stores agent-chosen derived_from evidence in the
274
+ // canonical graph. Compact run provenance alone may name only the input that
275
+ // woke the agent; it must not hide those exact observed supports.
276
+ const seenObservations = new Set(sourceRefs.flatMap((ref) => (ref.kind === 'raw' ? [ref.eventIndexId] : [])));
277
+ const links = adapter
278
+ .prepare(`SELECT object_id FROM twin_edges
279
+ WHERE subject_kind='memory' AND subject_id=?
280
+ AND edge_type='derived_from' AND object_kind='observation'
281
+ ORDER BY created_at, edge_id`)
282
+ .all(memoryId);
283
+ for (const link of links) {
284
+ if (seenObservations.has(link.object_id))
285
+ continue;
286
+ seenObservations.add(link.object_id);
287
+ sourceRefs.push({ kind: 'observation', observationId: link.object_id });
288
+ }
289
+ return {
290
+ status: retirement.status,
291
+ retired: retirement.retired,
292
+ modelRunId: record.model_run_id,
293
+ contextPacketId: stringOrNull(provenance?.context_packet_id),
294
+ sourceRefs,
295
+ legacyUnscoped: found.legacy,
296
+ };
297
+ }
298
+ /**
299
+ * Which supporting memories the caller may see, resolved up front.
300
+ *
301
+ * The pure resolver checks visibility synchronously, so this pre-answers it for the
302
+ * memory refs a record carries - typically a handful, up to fifty in the live corpus,
303
+ * and up to two lookups each, so ~100 serial round trips at the tail. Bounded and off
304
+ * the hot path (agent-invoked, not per-turn); the second lookup fires only for an
305
+ * ancestor with no scope bindings, of which the live corpus has two. Worth replacing
306
+ * with one bindings query if a memory ever carries hundreds of ancestors.
307
+ * Uses the SAME two-pass gate as the record itself, legacy pass included: an ancestor
308
+ * with no scope bindings is admitted exactly where an unbound record is, rather than
309
+ * reported out of scope because the second pass was skipped. An earlier docstring
310
+ * claimed that parity without the code doing it.
311
+ */
312
+ async function resolveVisibleMemoryRefs(adapter, record, scopes) {
313
+ const visible = new Set();
314
+ if (!record) {
315
+ return visible;
316
+ }
317
+ const ids = new Set(record.sourceRefs.flatMap((ref) => (ref.kind === 'memory' ? [ref.id] : [])));
318
+ for (const id of ids) {
319
+ if (await lookupWithLegacyFallback(adapter, id, scopes)) {
320
+ visible.add(id);
321
+ }
322
+ }
323
+ return visible;
324
+ }
325
+ /**
326
+ * Whether a message ref may be named.
327
+ *
328
+ * `sourceMessageRef` is built as `source:channelId:turnId` (message-router.ts), and a
329
+ * channel scope id as `source:channelId` (scope-context.ts) - so a ref belongs to a
330
+ * caller's channel exactly when an active channel scope is its prefix. Compared as a
331
+ * prefix rather than parsed, because a turn id can itself contain a colon
332
+ * (`generated:<uuid>`) and splitting on the last one would silently mis-attribute it.
333
+ *
334
+ * This matters beyond tidiness: every memory carrying such a ref is also bound to
335
+ * global:system, which every caller holds, so an unchecked ref handed a private channel
336
+ * identifier to any agent that could read the memory at all.
337
+ */
338
+ function isMessageRefVisible(ref, scopes) {
339
+ return scopes.some((scope) => scope.kind === 'channel' && ref.startsWith(`${scope.id}:`));
340
+ }
341
+ // Known limit, stated rather than discovered: the channel id space is not prefix-free.
342
+ // Real channel ids already contain colons, so a channel `S:X` produces refs that a caller
343
+ // scoped to `S` matches. Nothing in the ref format distinguishes "channel S, turn X:99"
344
+ // from "channel S:X, turn 99", so this cannot be resolved by parsing harder - it would
345
+ // take a delimiter the writer does not use. There are no such colliding pairs in the live
346
+ // scope table, so the guarantee holds on today's data rather than structurally.
347
+ /** Resolve one memory's support against the live index and the scopes active now. */
348
+ async function resolveMemoryProvenanceLive(adapter, memoryId, options) {
349
+ const record = await loadRecord(adapter, memoryId, options.scopes);
350
+ const visibleMemoryRefs = await resolveVisibleMemoryRefs(adapter, record, options.scopes);
351
+ const statement = adapter.prepare(`SELECT ${exports.OBSERVATION_COLUMNS}
352
+ FROM observation_versions
353
+ WHERE observation_id = ?
354
+ LIMIT 1`);
355
+ const ownInput = options.principalId
356
+ ? adapter.prepare(`SELECT 1 FROM mailbox_inputs
357
+ WHERE stimulus_id=? AND principal_id=? AND kind IN ('scheduled','source_delta','native_event')
358
+ LIMIT 1`)
359
+ : null;
360
+ return (0, provenance_resolver_js_1.resolveMemoryProvenance)(memoryId, {
361
+ lookupMemoryProvenance: () => record,
362
+ lookupEvent: (connector, eventIndexId) => {
363
+ const row = statement.get(eventIndexId);
364
+ if (!row) {
365
+ return null;
366
+ }
367
+ const event = toIndexedEvent(row);
368
+ // The id is a hash of connector plus source id, so a connector mismatch means the
369
+ // ref was rewritten rather than that the event moved. Treat it as gone, not as data.
370
+ return event.connector === connector ? event : null;
371
+ },
372
+ lookupObservation: (observationId) => {
373
+ const row = statement.get(observationId);
374
+ return row ? toIndexedEvent(row) : null;
375
+ },
376
+ ...(options.redact === undefined ? {} : { redact: options.redact }),
377
+ isSupportVisible: (support) => {
378
+ if (support.kind === 'memory') {
379
+ return visibleMemoryRefs.has(support.id);
380
+ }
381
+ if (support.kind === 'message') {
382
+ return (isMessageRefVisible(support.id, options.scopes) ||
383
+ Boolean(ownInput?.get(support.id, options.principalId)));
384
+ }
385
+ // Envelope hashes are emitted. The reason is NOT that the hash is inert - it is a
386
+ // lookup key into GET /api/memory/provenance, which serves unscoped results by
387
+ // hash and explicitly refuses scope filters (memory-provenance-handler.ts:26-33).
388
+ // What makes it safe is that the route sits behind requireAdminAuth
389
+ // (api/index.ts:215) and no role holding mama_provenance has an admin token or a
390
+ // shell. That is an access control in another file, so if this tool is ever
391
+ // granted to a role with either, revisit this line - the hash stops being safe
392
+ // before anything here changes.
393
+ return true;
394
+ },
395
+ isVisible: (event) => isEventVisibleNow(event, {
396
+ scopes: options.scopes,
397
+ connectors: options.connectors,
398
+ ...(options.wideConnectors ? { wideConnectors: options.wideConnectors } : {}),
399
+ ...(options.channels ? { channels: options.channels } : {}),
400
+ ...(options.projectIds === undefined ? {} : { projectIds: options.projectIds }),
401
+ tenantId: options.tenantId ?? null,
402
+ minObservedMs: options.minObservedMs ?? null,
403
+ maxObservedMs: options.maxObservedMs ?? null,
404
+ maxSourceMs: options.maxSourceMs ?? null,
405
+ }),
406
+ ...(options.excerptChars === undefined ? {} : { excerptChars: options.excerptChars }),
407
+ });
408
+ }
409
+ //# sourceMappingURL=provenance-live.js.map
@@ -1,11 +1,12 @@
1
+ import type { DatabaseAdapter } from '../db-manager.js';
1
2
  import type { MemoryProvenanceRecord, MemoryScopeRef } from './types.js';
2
3
  export interface MemoryProvenanceQueryOptions {
3
4
  scopes?: MemoryScopeRef[];
4
5
  includeLegacyUnscoped?: boolean;
5
6
  limit?: number;
6
7
  }
7
- export declare function getMemoryProvenance(memoryId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord | null>;
8
- export declare function listMemoriesByEnvelopeHash(envelopeHash: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
9
- export declare function listMemoriesByGatewayCallId(gatewayCallId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
10
- export declare function listMemoriesByModelRunId(modelRunId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
8
+ export declare function getMemoryProvenance(adapter: DatabaseAdapter, memoryId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord | null>;
9
+ export declare function listMemoriesByEnvelopeHash(adapter: DatabaseAdapter, envelopeHash: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
10
+ export declare function listMemoriesByGatewayCallId(adapter: DatabaseAdapter, gatewayCallId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
11
+ export declare function listMemoriesByModelRunId(adapter: DatabaseAdapter, modelRunId: string, options?: MemoryProvenanceQueryOptions): Promise<MemoryProvenanceRecord[]>;
11
12
  //# sourceMappingURL=provenance-query.d.ts.map
@@ -4,11 +4,8 @@ exports.getMemoryProvenance = getMemoryProvenance;
4
4
  exports.listMemoriesByEnvelopeHash = listMemoriesByEnvelopeHash;
5
5
  exports.listMemoriesByGatewayCallId = listMemoriesByGatewayCallId;
6
6
  exports.listMemoriesByModelRunId = listMemoriesByModelRunId;
7
- const db_manager_js_1 = require("../db-manager.js");
8
7
  const event_store_js_1 = require("./event-store.js");
9
- async function getMemoryProvenance(memoryId, options = {}) {
10
- await (0, db_manager_js_1.initDB)();
11
- const adapter = (0, db_manager_js_1.getAdapter)();
8
+ async function getMemoryProvenance(adapter, memoryId, options = {}) {
12
9
  const row = adapter
13
10
  .prepare(`
14
11
  SELECT id, agent_id, model_run_id, envelope_hash, gateway_call_id,
@@ -17,25 +14,23 @@ async function getMemoryProvenance(memoryId, options = {}) {
17
14
  WHERE id = ?
18
15
  `)
19
16
  .get(memoryId);
20
- if (!row || !(await isVisibleMemory(row.id, options))) {
17
+ if (!row || !(await isVisibleMemory(adapter, row.id, options))) {
21
18
  return null;
22
19
  }
23
- return toProvenanceRecord(row);
20
+ return toProvenanceRecord(adapter, row);
24
21
  }
25
- async function listMemoriesByEnvelopeHash(envelopeHash, options = {}) {
26
- return listMemoriesByColumn('envelope_hash', envelopeHash, options);
22
+ async function listMemoriesByEnvelopeHash(adapter, envelopeHash, options = {}) {
23
+ return listMemoriesByColumn(adapter, 'envelope_hash', envelopeHash, options);
27
24
  }
28
- async function listMemoriesByGatewayCallId(gatewayCallId, options = {}) {
29
- return listMemoriesByColumn('gateway_call_id', gatewayCallId, options);
25
+ async function listMemoriesByGatewayCallId(adapter, gatewayCallId, options = {}) {
26
+ return listMemoriesByColumn(adapter, 'gateway_call_id', gatewayCallId, options);
30
27
  }
31
- async function listMemoriesByModelRunId(modelRunId, options = {}) {
32
- return listMemoriesByColumn('model_run_id', modelRunId, options);
28
+ async function listMemoriesByModelRunId(adapter, modelRunId, options = {}) {
29
+ return listMemoriesByColumn(adapter, 'model_run_id', modelRunId, options);
33
30
  }
34
- async function listMemoriesByColumn(column, value, options) {
35
- await (0, db_manager_js_1.initDB)();
36
- const adapter = (0, db_manager_js_1.getAdapter)();
31
+ async function listMemoriesByColumn(adapter, column, value, options) {
37
32
  const limit = normalizeLimit(options.limit);
38
- const visibility = buildVisibilityPredicate(options);
33
+ const visibility = buildVisibilityPredicate(adapter, options);
39
34
  const rows = adapter
40
35
  .prepare(`
41
36
  SELECT d.id, d.agent_id, d.model_run_id, d.envelope_hash, d.gateway_call_id,
@@ -48,15 +43,15 @@ async function listMemoriesByColumn(column, value, options) {
48
43
  .all(value, ...visibility.params, limit);
49
44
  const records = [];
50
45
  for (const row of rows) {
51
- records.push(await toProvenanceRecord(row));
46
+ records.push(await toProvenanceRecord(adapter, row));
52
47
  }
53
48
  return records;
54
49
  }
55
- function buildVisibilityPredicate(options) {
50
+ function buildVisibilityPredicate(adapter, options) {
56
51
  if (!hasScopeFilter(options)) {
57
52
  return { sql: '', params: [] };
58
53
  }
59
- const scopeIds = resolveMemoryScopeIds(options.scopes);
54
+ const scopeIds = resolveMemoryScopeIds(adapter, options.scopes);
60
55
  const legacyUnscopedPredicate = `
61
56
  NOT EXISTS (
62
57
  SELECT 1
@@ -89,18 +84,18 @@ function buildVisibilityPredicate(options) {
89
84
  function hasScopeFilter(options) {
90
85
  return Array.isArray(options.scopes) && options.scopes.length > 0;
91
86
  }
92
- function resolveMemoryScopeIds(scopes) {
87
+ function resolveMemoryScopeIds(adapter, scopes) {
93
88
  const scopeIds = [];
94
89
  for (const scope of scopes) {
95
- const scopeId = resolveMemoryScopeId(scope.kind, scope.id);
90
+ const scopeId = resolveMemoryScopeId(adapter, scope.kind, scope.id);
96
91
  if (scopeId) {
97
92
  scopeIds.push(scopeId);
98
93
  }
99
94
  }
100
95
  return scopeIds;
101
96
  }
102
- async function toProvenanceRecord(row) {
103
- const events = await (0, event_store_js_1.listMemoryEventsForMemory)(row.id);
97
+ async function toProvenanceRecord(adapter, row) {
98
+ const events = await (0, event_store_js_1.listMemoryEventsForMemory)(adapter, row.id);
104
99
  return {
105
100
  memory_id: row.id,
106
101
  agent_id: row.agent_id,
@@ -112,13 +107,11 @@ async function toProvenanceRecord(row) {
112
107
  latest_event: events[0],
113
108
  };
114
109
  }
115
- async function isVisibleMemory(memoryId, options) {
110
+ async function isVisibleMemory(adapter, memoryId, options) {
116
111
  if (!hasScopeFilter(options)) {
117
112
  return true;
118
113
  }
119
- await (0, db_manager_js_1.initDB)();
120
- const adapter = (0, db_manager_js_1.getAdapter)();
121
- const scopeIds = resolveMemoryScopeIds(options.scopes);
114
+ const scopeIds = resolveMemoryScopeIds(adapter, options.scopes);
122
115
  const bindingCount = adapter
123
116
  .prepare(`
124
117
  SELECT COUNT(*) as count
@@ -144,8 +137,7 @@ async function isVisibleMemory(memoryId, options) {
144
137
  .get(memoryId, ...scopeIds);
145
138
  return row?.visible === 1;
146
139
  }
147
- function resolveMemoryScopeId(kind, externalId) {
148
- const adapter = (0, db_manager_js_1.getAdapter)();
140
+ function resolveMemoryScopeId(adapter, kind, externalId) {
149
141
  const row = adapter
150
142
  .prepare(`
151
143
  SELECT id