@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,75 @@
1
+ "use strict";
2
+ /**
3
+ * TokenEstimator — singleton wrapper around js-tiktoken (cl100k_base).
4
+ *
5
+ * Provides accurate token counting for Korean + English text.
6
+ * Falls back to byte-length heuristic if WASM init fails or during loading.
7
+ *
8
+ * Uses dynamic import to avoid blocking vitest fork initialization.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.initTokenEstimator = initTokenEstimator;
12
+ exports.countTokens = countTokens;
13
+ exports.resetTokenEstimator = resetTokenEstimator;
14
+ exports.forceFallbackMode = forceFallbackMode;
15
+ let _encoder = null;
16
+ let _initFailed = false;
17
+ let _initPromise = null;
18
+ /**
19
+ * Initialize the encoder asynchronously. Safe to call multiple times.
20
+ */
21
+ async function initTokenEstimator() {
22
+ if (_encoder || _initFailed)
23
+ return;
24
+ if (_initPromise)
25
+ return _initPromise;
26
+ _initPromise = (async () => {
27
+ try {
28
+ const { encodingForModel } = await import('js-tiktoken');
29
+ _encoder = encodingForModel('gpt-4o');
30
+ }
31
+ catch {
32
+ _initFailed = true;
33
+ }
34
+ })();
35
+ return _initPromise;
36
+ }
37
+ function getEncoder() {
38
+ if (!_encoder && !_initFailed && !_initPromise) {
39
+ // Fire-and-forget init on first sync access
40
+ initTokenEstimator().catch(() => { });
41
+ }
42
+ return _encoder;
43
+ }
44
+ /**
45
+ * Byte-length fallback: ~0.4 tokens per byte (empirical for mixed CJK+Latin).
46
+ */
47
+ function fallbackCount(text) {
48
+ return Math.ceil(Buffer.byteLength(text, 'utf-8') * 0.4);
49
+ }
50
+ /**
51
+ * Count tokens in text. Uses js-tiktoken if available, else byte fallback.
52
+ */
53
+ function countTokens(text) {
54
+ const enc = getEncoder();
55
+ if (enc) {
56
+ return enc.encode(text).length;
57
+ }
58
+ return fallbackCount(text);
59
+ }
60
+ /**
61
+ * Reset singleton state (for testing).
62
+ */
63
+ function resetTokenEstimator() {
64
+ _encoder = null;
65
+ _initFailed = false;
66
+ _initPromise = null;
67
+ }
68
+ /**
69
+ * Force fallback mode (for testing).
70
+ */
71
+ function forceFallbackMode() {
72
+ _encoder = null;
73
+ _initFailed = true;
74
+ }
75
+ //# sourceMappingURL=token-estimator.js.map
@@ -0,0 +1,22 @@
1
+ import type { DatabaseAdapter } from '../db-manager.js';
2
+ import type { AppendToolTraceInput, AppendOperationToolTraceInput, ToolTraceRecord, ToolTraceScope, ListToolTracesInput, ToolTracePage } from './model-run-types.js';
3
+ type ToolTraceAdapter = Pick<DatabaseAdapter, 'prepare'>;
4
+ /** Model-backed append. `model_run_id` is required and validated as before. */
5
+ export declare function appendToolTrace(adapter: ToolTraceAdapter, input: AppendToolTraceInput): Promise<ToolTraceRecord>;
6
+ /**
7
+ * Service/CLI operation append. Records a truthful operation trace anchored by a
8
+ * nonempty `operation_id` and `actor_principal_id`. No `model_runs` row is
9
+ * created or required.
10
+ *
11
+ * `model_run_id` is optional causal provenance: when a real completed model run
12
+ * caused this operation observation it is stored (the DB `model_runs` FK rejects
13
+ * an invalid reference); absent, it stays NULL. It never authorizes execution.
14
+ */
15
+ export declare function appendOperationToolTrace(adapter: ToolTraceAdapter, input: AppendOperationToolTraceInput): ToolTraceRecord;
16
+ export declare function listToolTracesForRun(adapter: ToolTraceAdapter, modelRunId: string): Promise<ToolTraceRecord[]>;
17
+ /** Access is exact host-derived scope; knowing a trace ID never grants access. */
18
+ export declare function readToolTrace(adapter: ToolTraceAdapter, traceId: string, scope: ToolTraceScope): Promise<ToolTraceRecord | null>;
19
+ /** Bounded metadata discovery; detailed evidence is read explicitly by trace ID. */
20
+ export declare function listToolTraces(adapter: ToolTraceAdapter, input: ListToolTracesInput): Promise<ToolTracePage>;
21
+ export {};
22
+ //# sourceMappingURL=tool-trace-store.d.ts.map
@@ -4,11 +4,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.appendToolTrace = appendToolTrace;
7
+ exports.appendOperationToolTrace = appendOperationToolTrace;
7
8
  exports.listToolTracesForRun = listToolTracesForRun;
8
9
  exports.readToolTrace = readToolTrace;
9
10
  exports.listToolTraces = listToolTraces;
10
11
  const node_crypto_1 = __importDefault(require("node:crypto"));
11
- const db_manager_js_1 = require("../db-manager.js");
12
12
  function traceId() {
13
13
  return `tr_${node_crypto_1.default.randomUUID().replace(/-/g, '')}`;
14
14
  }
@@ -77,7 +77,10 @@ function mapToolTraceRow(row) {
77
77
  project_id: nullableString(row.project_id),
78
78
  channel_id: nullableString(row.channel_id),
79
79
  trace_id: requiredString(row.trace_id, 'trace_id'),
80
- model_run_id: requiredString(row.model_run_id, 'model_run_id'),
80
+ // NULL for operation-origin rows; legacy/model-backed rows keep their id.
81
+ model_run_id: nullableString(row.model_run_id),
82
+ operation_id: nullableString(row.operation_id),
83
+ actor_principal_id: nullableString(row.actor_principal_id),
81
84
  gateway_call_id: nullableString(row.gateway_call_id),
82
85
  tool_name: requiredString(row.tool_name, 'tool_name'),
83
86
  input_summary: nullableString(row.input_summary),
@@ -89,17 +92,15 @@ function mapToolTraceRow(row) {
89
92
  created_at: requiredInteger(row.created_at, 'created_at'),
90
93
  };
91
94
  }
92
- async function initializedAdapter() {
93
- await (0, db_manager_js_1.initDB)();
94
- return (0, db_manager_js_1.getAdapter)();
95
- }
95
+ /** Columns selected for every full trace read; kept in one place so operation-origin rows are never joined away. */
96
+ const TOOL_TRACE_COLUMNS = `trace_id, model_run_id, operation_id, actor_principal_id, gateway_call_id, tool_name, input_summary,
97
+ output_summary, execution_status, duration_ms, envelope_hash, failure_code,
98
+ created_at, diagnostic_json, evidence_json, catalog_revision, owner_scope, project_id, channel_id`;
96
99
  function selectToolTrace(adapter, id) {
97
100
  const row = adapter
98
101
  .prepare(`
99
102
  SELECT
100
- trace_id, model_run_id, gateway_call_id, tool_name, input_summary,
101
- output_summary, execution_status, duration_ms, envelope_hash, failure_code,
102
- created_at, diagnostic_json, evidence_json, catalog_revision, owner_scope, project_id, channel_id
103
+ ${TOOL_TRACE_COLUMNS}
103
104
  FROM tool_traces
104
105
  WHERE trace_id = ?
105
106
  `)
@@ -109,32 +110,52 @@ function selectToolTrace(adapter, id) {
109
110
  }
110
111
  return mapToolTraceRow(row);
111
112
  }
112
- async function appendToolTrace(input) {
113
- const adapter = await initializedAdapter();
114
- const id = nullableString(input.trace_id) ?? traceId();
115
- const modelRunId = requiredString(input.model_run_id, 'model_run_id');
116
- const toolName = requiredString(input.tool_name, 'tool_name');
113
+ function insertToolTraceRow(adapter, id, origin, input) {
117
114
  adapter
118
115
  .prepare(`
119
116
  INSERT INTO tool_traces (
120
- trace_id, model_run_id, gateway_call_id, tool_name, input_summary,
117
+ trace_id, model_run_id, operation_id, actor_principal_id, gateway_call_id, tool_name, input_summary,
121
118
  output_summary, execution_status, duration_ms, envelope_hash, failure_code,
122
119
  created_at, diagnostic_json, evidence_json, catalog_revision, owner_scope, project_id, channel_id
123
120
  )
124
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
121
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
125
122
  `)
126
- .run(id, modelRunId, nullableString(input.gateway_call_id), toolName, nullableString(input.input_summary), nullableString(input.output_summary), nullableString(input.execution_status), normalizeDuration(input.duration_ms), nullableString(input.envelope_hash), nullableString(input.failure_code), normalizeTimestamp(input.created_at), nullableJsonObject(input.diagnostic_json, 'diagnostic_json'), nullableJsonObject(input.evidence_json, 'evidence_json'), nullableString(input.catalog_revision), nullableString(input.owner_scope), nullableString(input.project_id), nullableString(input.channel_id));
123
+ .run(id, origin.model_run_id, origin.operation_id, origin.actor_principal_id, nullableString(input.gateway_call_id), requiredString(input.tool_name, 'tool_name'), nullableString(input.input_summary), nullableString(input.output_summary), nullableString(input.execution_status), normalizeDuration(input.duration_ms), nullableString(input.envelope_hash), nullableString(input.failure_code), normalizeTimestamp(input.created_at), nullableJsonObject(input.diagnostic_json, 'diagnostic_json'), nullableJsonObject(input.evidence_json, 'evidence_json'), nullableString(input.catalog_revision), nullableString(input.owner_scope), nullableString(input.project_id), nullableString(input.channel_id));
124
+ }
125
+ /** Model-backed append. `model_run_id` is required and validated as before. */
126
+ async function appendToolTrace(adapter, input) {
127
+ const id = nullableString(input.trace_id) ?? traceId();
128
+ const modelRunId = requiredString(input.model_run_id, 'model_run_id');
129
+ insertToolTraceRow(adapter, id, { model_run_id: modelRunId, operation_id: null, actor_principal_id: null }, input);
127
130
  return selectToolTrace(adapter, id);
128
131
  }
129
- async function listToolTracesForRun(modelRunId) {
130
- const adapter = await initializedAdapter();
132
+ /**
133
+ * Service/CLI operation append. Records a truthful operation trace anchored by a
134
+ * nonempty `operation_id` and `actor_principal_id`. No `model_runs` row is
135
+ * created or required.
136
+ *
137
+ * `model_run_id` is optional causal provenance: when a real completed model run
138
+ * caused this operation observation it is stored (the DB `model_runs` FK rejects
139
+ * an invalid reference); absent, it stays NULL. It never authorizes execution.
140
+ */
141
+ function appendOperationToolTrace(adapter, input) {
142
+ const id = nullableString(input.trace_id) ?? traceId();
143
+ const operationId = requiredString(input.operation_id, 'operation_id');
144
+ const actorPrincipalId = requiredString(input.actor_principal_id, 'actor_principal_id');
145
+ const causalModelRunId = nullableString(input.model_run_id);
146
+ insertToolTraceRow(adapter, id, {
147
+ model_run_id: causalModelRunId,
148
+ operation_id: operationId,
149
+ actor_principal_id: actorPrincipalId,
150
+ }, input);
151
+ return selectToolTrace(adapter, id);
152
+ }
153
+ async function listToolTracesForRun(adapter, modelRunId) {
131
154
  const id = requiredString(modelRunId, 'model_run_id');
132
155
  const rows = adapter
133
156
  .prepare(`
134
157
  SELECT
135
- trace_id, model_run_id, gateway_call_id, tool_name, input_summary,
136
- output_summary, execution_status, duration_ms, envelope_hash, failure_code,
137
- created_at, diagnostic_json, evidence_json, catalog_revision, owner_scope, project_id, channel_id
158
+ ${TOOL_TRACE_COLUMNS}
138
159
  FROM tool_traces
139
160
  WHERE model_run_id = ?
140
161
  ORDER BY created_at DESC, rowid DESC
@@ -155,18 +176,17 @@ function scopedWhere(scope) {
155
176
  return { clauses, values };
156
177
  }
157
178
  /** Access is exact host-derived scope; knowing a trace ID never grants access. */
158
- async function readToolTrace(traceId, scope) {
179
+ async function readToolTrace(adapter, traceId, scope) {
159
180
  const { clauses, values } = scopedWhere(scope);
160
181
  clauses.push('trace_id = ?');
161
182
  values.push(requiredString(traceId, 'trace_id'));
162
- const adapter = await initializedAdapter();
163
183
  const row = adapter
164
184
  .prepare(`SELECT * FROM tool_traces WHERE ${clauses.join(' AND ')}`)
165
185
  .get(...values);
166
186
  return row ? mapToolTraceRow(row) : null;
167
187
  }
168
188
  /** Bounded metadata discovery; detailed evidence is read explicitly by trace ID. */
169
- async function listToolTraces(input) {
189
+ async function listToolTraces(adapter, input) {
170
190
  const { clauses, values } = scopedWhere(input);
171
191
  if (input.evidence_only !== undefined && typeof input.evidence_only !== 'boolean') {
172
192
  throw new Error('tool_traces.evidence_only must be a boolean');
@@ -205,9 +225,8 @@ async function listToolTraces(input) {
205
225
  clauses.push('(created_at < ? OR (created_at = ? AND trace_id < ?))');
206
226
  values.push(cursorCreatedAt, cursorCreatedAt, cursorTraceId);
207
227
  }
208
- const adapter = await initializedAdapter();
209
228
  const rows = adapter
210
- .prepare(`SELECT trace_id, model_run_id, gateway_call_id, tool_name,
229
+ .prepare(`SELECT trace_id, model_run_id, operation_id, actor_principal_id, gateway_call_id, tool_name,
211
230
  input_summary, output_summary, execution_status, duration_ms, envelope_hash, failure_code,
212
231
  created_at, diagnostic_json, NULL AS evidence_json, catalog_revision, owner_scope, project_id, channel_id
213
232
  FROM tool_traces WHERE ${clauses.join(' AND ')}
@@ -0,0 +1,5 @@
1
+ /** Shared raw diagnostic redaction; callers choose their own output bounds. */
2
+ export declare function redactTraceText(value: string): string;
3
+ /** Bounded diagnostics only: never mutate the executed input or stored evidence. */
4
+ export declare function traceSummary(value: unknown): string | null;
5
+ //# sourceMappingURL=trace-summary.d.ts.map
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.redactTraceText = redactTraceText;
4
+ exports.traceSummary = traceSummary;
5
+ const secret_filter_js_1 = require("../memory/secret-filter.js");
6
+ const SECRET_FIELD = /(?:authorization|credential|password|passwd|secret|token|api[_-]?key|private[_-]?key)/i;
7
+ const SECRET_ASSIGNMENT = /\b([\w-]*(?:token|secret|password|passwd|credential|api[_-]?key|private[_-]?key)[\w-]*(?:\\?["'])?\s*[=:]\s*)(?:\\"[^\r\n]*?\\"|"[^"\n]*"|'[^'\n]*'|[^\s,;&}\]]+)/gi;
8
+ /** Shared raw diagnostic redaction; callers choose their own output bounds. */
9
+ function redactTraceText(value) {
10
+ return (0, secret_filter_js_1.redactSecretPatterns)(value)
11
+ .replace(/\beyJ[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+\b/g, '[REDACTED]')
12
+ .replace(/https?:\/\/[^\s<>"']+/gi, (raw) => {
13
+ try {
14
+ const url = new URL(raw);
15
+ if (url.username || url.password) {
16
+ url.username = '[REDACTED]';
17
+ url.password = '';
18
+ }
19
+ for (const key of [...url.searchParams.keys()]) {
20
+ if (SECRET_FIELD.test(key))
21
+ url.searchParams.set(key, '[REDACTED]');
22
+ }
23
+ // URL fragments are not sent to servers and do not help diagnose tool execution.
24
+ url.hash = '';
25
+ return url.toString();
26
+ }
27
+ catch {
28
+ return '[INVALID-URL]';
29
+ }
30
+ })
31
+ .replace(/(--[\w-]*(?:token|secret|password|passwd|credential|api[_-]?key|private[_-]?key)[\w-]*\s+)(?:"[^"\n]*"|'[^'\n]*'|[^\s,;&}\]]+)/gi, '$1[REDACTED]')
32
+ .replace(SECRET_ASSIGNMENT, '$1[REDACTED]')
33
+ .replace(/\b(Authorization["']?\s*[:=]\s*["']?)(?:(?:Bearer|Basic)\s+)?[^\s,"';]+/gi, '$1[REDACTED]');
34
+ }
35
+ /** Bounded diagnostics only: never mutate the executed input or stored evidence. */
36
+ function traceSummary(value) {
37
+ if (value === undefined)
38
+ return null;
39
+ const seen = new WeakSet();
40
+ let remaining = 4_000;
41
+ const text = (value) => {
42
+ const safe = redactTraceText(value);
43
+ const result = safe.slice(0, Math.max(0, remaining));
44
+ remaining -= result.length;
45
+ return result;
46
+ };
47
+ const visit = (item, depth) => {
48
+ if (remaining <= 0 || depth > 6)
49
+ return '[TRUNCATED]';
50
+ if (typeof item === 'string')
51
+ return text(item);
52
+ if (!item || typeof item !== 'object')
53
+ return item;
54
+ if (seen.has(item))
55
+ return '[CIRCULAR]';
56
+ seen.add(item);
57
+ if (Array.isArray(item))
58
+ return item.slice(0, 40).map((entry) => visit(entry, depth + 1));
59
+ return Object.fromEntries(Object.entries(item)
60
+ .slice(0, 40)
61
+ .map(([key, entry]) => [
62
+ text(key),
63
+ SECRET_FIELD.test(key) ? '[REDACTED]' : visit(entry, depth + 1),
64
+ ]));
65
+ };
66
+ try {
67
+ const serialized = JSON.stringify(visit(value, 0)) ?? '';
68
+ return serialized.length <= 4_000 ? serialized : `${serialized.slice(0, 3_997)}...`;
69
+ }
70
+ catch {
71
+ return '[UNSERIALIZABLE]';
72
+ }
73
+ }
74
+ //# sourceMappingURL=trace-summary.js.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Reading and writing a turn's text, with nothing in it that knows which product
3
+ * the turn belongs to.
4
+ *
5
+ * These five were methods on the product's loop class only because they were written
6
+ * there. None of them reads any state on that class; the one that needed to know the
7
+ * backend takes it as an argument. They come out first so that what remains of the
8
+ * turn body is the part that actually holds state.
9
+ */
10
+ import type { BackendType, ContentBlock, Message, PromptResult } from './drivers/types.js';
11
+ /** The text blocks of one content array, joined. */
12
+ export declare function extractTextFromContent(content: ContentBlock[]): string;
13
+ /** The last assistant message's text, or empty when the history holds none. */
14
+ export declare function extractTextResponse(history: Message[]): string;
15
+ /**
16
+ * Tokens a turn counts against the run budget.
17
+ *
18
+ * One backend reports cache reads and cache creation outside input_tokens; the other
19
+ * reports input tokens inclusive of cached ones. Adding cache reads for the second
20
+ * doubled every count in 0.44.0, where a 2.8M turn read as 5.5M and was stopped.
21
+ */
22
+ export declare function countBudgetTokens(usage: PromptResult['usage'], backend: BackendType): number;
23
+ //# sourceMappingURL=turn-text.d.ts.map
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractTextFromContent = extractTextFromContent;
4
+ exports.extractTextResponse = extractTextResponse;
5
+ exports.countBudgetTokens = countBudgetTokens;
6
+ /** The text blocks of one content array, joined. */
7
+ function extractTextFromContent(content) {
8
+ return content
9
+ .filter((block) => block.type === 'text')
10
+ .map((block) => block.text)
11
+ .join('\n');
12
+ }
13
+ /** The last assistant message's text, or empty when the history holds none. */
14
+ function extractTextResponse(history) {
15
+ for (let i = history.length - 1; i >= 0; i--) {
16
+ const message = history[i];
17
+ if (message.role === 'assistant') {
18
+ const content = message.content;
19
+ if (typeof content === 'string') {
20
+ return content;
21
+ }
22
+ return extractTextFromContent(content);
23
+ }
24
+ }
25
+ return '';
26
+ }
27
+ /**
28
+ * Tokens a turn counts against the run budget.
29
+ *
30
+ * One backend reports cache reads and cache creation outside input_tokens; the other
31
+ * reports input tokens inclusive of cached ones. Adding cache reads for the second
32
+ * doubled every count in 0.44.0, where a 2.8M turn read as 5.5M and was stopped.
33
+ */
34
+ function countBudgetTokens(usage, backend) {
35
+ const base = usage.input_tokens + usage.output_tokens;
36
+ if (backend === 'codex') {
37
+ return base;
38
+ }
39
+ return base + (usage.cache_creation_input_tokens ?? 0) + (usage.cache_read_input_tokens ?? 0);
40
+ }
41
+ //# sourceMappingURL=turn-text.js.map
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Database lifetime.
3
+ *
4
+ * `openDatabase` returns a handle to one database. It does not register itself
5
+ * anywhere, so two calls give two independent databases and a caller always
6
+ * knows which one it holds. `db-manager.ts` keeps a single handle for the
7
+ * callers that still reach for a module-level connection; nothing here depends
8
+ * on that handle existing.
9
+ *
10
+ * @module storage/database
11
+ */
12
+ import type { DatabaseInstance } from '../db-manager.js';
13
+ /** Migrations ship beside the compiled output, two levels up from `dist/storage`. */
14
+ export declare const MIGRATIONS_DIR: string;
15
+ export interface OpenDatabaseOptions {
16
+ /** Where to open. Falls back to the adapter's own resolution when omitted. */
17
+ path?: string;
18
+ /** Directory holding the core's migration files. Defaults to the shipped one. */
19
+ migrationsDir?: string;
20
+ /**
21
+ * Migrations this consumer brings of its own, run after the core's.
22
+ *
23
+ * A package that needs a table has somewhere to put it other than inside the
24
+ * core. Each source namespaces its own version numbers, so the core's next
25
+ * number is not spoken for by somebody else.
26
+ */
27
+ migrations?: ReadonlyArray<{
28
+ name: string;
29
+ dir: string;
30
+ }>;
31
+ }
32
+ export interface DatabaseHandle {
33
+ adapter: DatabaseInstance;
34
+ /** The value `connect()` returned, for callers that still need the raw driver. */
35
+ connection: unknown;
36
+ /** Where this handle actually opened, or a description when the adapter cannot say. */
37
+ dbPath: string;
38
+ close: () => Promise<void>;
39
+ }
40
+ export declare function isTestMode(): boolean;
41
+ /**
42
+ * Declare where this product's live database is, as a resolved absolute path.
43
+ * Call once, before opening anything.
44
+ */
45
+ export declare function declareProductionDatabasePath(value: string): void;
46
+ /** Test seam: forget what was declared. */
47
+ export declare function clearProductionDatabasePaths(): void;
48
+ /**
49
+ * Refuse, in a test process, to open a database nobody named or one a product
50
+ * declared as live.
51
+ *
52
+ * This used to compare against one hard-coded path, `~/.claude/mama-memory.db`, which
53
+ * meant the core held a product's data location in order to protect it. The rule is
54
+ * the same and says no product's name: a test that did not state where it wanted to
55
+ * write is about to write somewhere it did not choose, and that failure surfaces far
56
+ * from its cause.
57
+ */
58
+ export declare function assertTestProcessIsNotUsingRealDb(effectivePath?: string, effectivePathSource?: string): void;
59
+ export declare function resolveAdapterDbPath(adapter: DatabaseInstance): string | undefined;
60
+ /**
61
+ * Open one database: connect, migrate, and verify the embedding scheme.
62
+ *
63
+ * Throws if any step fails. Nothing partially opened is returned, so a caller
64
+ * that receives a handle holds a migrated database it can use.
65
+ */
66
+ export declare function openDatabase(options?: OpenDatabaseOptions): Promise<DatabaseHandle>;
67
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /**
3
+ * Database lifetime.
4
+ *
5
+ * `openDatabase` returns a handle to one database. It does not register itself
6
+ * anywhere, so two calls give two independent databases and a caller always
7
+ * knows which one it holds. `db-manager.ts` keeps a single handle for the
8
+ * callers that still reach for a module-level connection; nothing here depends
9
+ * on that handle existing.
10
+ *
11
+ * @module storage/database
12
+ */
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.MIGRATIONS_DIR = void 0;
18
+ exports.isTestMode = isTestMode;
19
+ exports.declareProductionDatabasePath = declareProductionDatabasePath;
20
+ exports.clearProductionDatabasePaths = clearProductionDatabasePaths;
21
+ exports.assertTestProcessIsNotUsingRealDb = assertTestProcessIsNotUsingRealDb;
22
+ exports.resolveAdapterDbPath = resolveAdapterDbPath;
23
+ exports.openDatabase = openDatabase;
24
+ const node_path_1 = __importDefault(require("node:path"));
25
+ const index_js_1 = require("../db-adapter/index.js");
26
+ const db_manager_js_1 = require("../db-manager.js");
27
+ const debug_logger_js_1 = require("../debug-logger.js");
28
+ const progress_indicator_js_1 = require("../progress-indicator.js");
29
+ /** Migrations ship beside the compiled output, two levels up from `dist/storage`. */
30
+ exports.MIGRATIONS_DIR = node_path_1.default.join(__dirname, '..', '..', 'db', 'migrations');
31
+ function isTestMode() {
32
+ return Boolean(process.env.MAMA_TEST_MODE || process.env.VITEST || process.env.NODE_ENV === 'test');
33
+ }
34
+ /**
35
+ * A path a consumer states must already be resolved.
36
+ *
37
+ * The core used to expand `~` and `${HOME}` itself, which made it the thing that
38
+ * decides what home means. Two consumers with different homes then got the same
39
+ * answer from a library neither of them configured. Expansion belongs to whoever owns
40
+ * the home directory; this only refuses to guess.
41
+ */
42
+ function requireResolvedPath(value, source) {
43
+ if (value === '~' || value.startsWith('~/') || value.includes('${HOME}')) {
44
+ throw new Error(`[db-boundary] ${source} is not a resolved path (${value}). ` +
45
+ 'Expand it where the home directory is known and state the result.');
46
+ }
47
+ return node_path_1.default.resolve(value);
48
+ }
49
+ /**
50
+ * Databases a product has declared as its live one.
51
+ *
52
+ * The core used to hold one such path itself, `~/.claude/mama-memory.db`, which meant
53
+ * a shared library knew where one product kept its data in order to protect it. Each
54
+ * product declares its own now, and the guard below refuses all of them.
55
+ */
56
+ const productionDatabasePaths = new Set();
57
+ /**
58
+ * Declare where this product's live database is, as a resolved absolute path.
59
+ * Call once, before opening anything.
60
+ */
61
+ function declareProductionDatabasePath(value) {
62
+ productionDatabasePaths.add(requireResolvedPath(value, 'the declared production database path'));
63
+ }
64
+ /** Test seam: forget what was declared. */
65
+ function clearProductionDatabasePaths() {
66
+ productionDatabasePaths.clear();
67
+ }
68
+ /**
69
+ * Refuse, in a test process, to open a database nobody named or one a product
70
+ * declared as live.
71
+ *
72
+ * This used to compare against one hard-coded path, `~/.claude/mama-memory.db`, which
73
+ * meant the core held a product's data location in order to protect it. The rule is
74
+ * the same and says no product's name: a test that did not state where it wanted to
75
+ * write is about to write somewhere it did not choose, and that failure surfaces far
76
+ * from its cause.
77
+ */
78
+ function assertTestProcessIsNotUsingRealDb(effectivePath, effectivePathSource = 'adapter') {
79
+ if (!isTestMode()) {
80
+ return;
81
+ }
82
+ const configuredPaths = [
83
+ { name: 'MAMA_DB_PATH', value: process.env.MAMA_DB_PATH },
84
+ { name: 'MAMA_DATABASE_PATH', value: process.env.MAMA_DATABASE_PATH },
85
+ ];
86
+ if (effectivePath) {
87
+ configuredPaths.push({ name: effectivePathSource, value: effectivePath });
88
+ }
89
+ const named = configuredPaths.find((configuredPath) => Boolean(configuredPath.value));
90
+ if (!named) {
91
+ throw new Error('[db-boundary] Refusing to open an unnamed database from a test process. ' +
92
+ 'Set MAMA_DB_PATH to a temporary path first.');
93
+ }
94
+ for (const configuredPath of configuredPaths) {
95
+ if (!configuredPath.value) {
96
+ continue;
97
+ }
98
+ const resolvedPath = requireResolvedPath(configuredPath.value, configuredPath.name);
99
+ if (productionDatabasePaths.has(resolvedPath)) {
100
+ throw new Error(`[db-boundary] Refusing to open the live database ${resolvedPath} ` +
101
+ `from a test process (${configuredPath.name}=${configuredPath.value}). ` +
102
+ 'Set MAMA_DB_PATH to a temporary path first.');
103
+ }
104
+ }
105
+ }
106
+ function resolveAdapterDbPath(adapter) {
107
+ if (typeof adapter.getDbPath === 'function') {
108
+ return adapter.getDbPath();
109
+ }
110
+ return adapter.dbPath;
111
+ }
112
+ /**
113
+ * Open one database: connect, migrate, and verify the embedding scheme.
114
+ *
115
+ * Throws if any step fails. Nothing partially opened is returned, so a caller
116
+ * that receives a handle holds a migrated database it can use.
117
+ */
118
+ async function openDatabase(options = {}) {
119
+ assertTestProcessIsNotUsingRealDb(options.path, 'openDatabase({ path })');
120
+ (0, progress_indicator_js_1.logSearching)('Initializing database...');
121
+ const adapter = (0, index_js_1.createAdapter)(options.path ? { dbPath: options.path } : {});
122
+ assertTestProcessIsNotUsingRealDb(resolveAdapterDbPath(adapter), 'adapter.getDbPath()');
123
+ let connection;
124
+ try {
125
+ connection = await adapter.connect();
126
+ await adapter.runMigrations([
127
+ { name: 'core', dir: options.migrationsDir ?? exports.MIGRATIONS_DIR },
128
+ ...(options.migrations ?? []),
129
+ ]);
130
+ // New tables and rows exist only after migrations run.
131
+ if (typeof adapter.reloadVectorCache === 'function') {
132
+ adapter.reloadVectorCache();
133
+ }
134
+ // Fail loud on legacy vectors meeting current code.
135
+ (0, db_manager_js_1.assertEmbeddingSchemeCurrent)(adapter);
136
+ }
137
+ catch (error) {
138
+ try {
139
+ adapter.disconnect();
140
+ }
141
+ catch {
142
+ // The open already failed; a disconnect error would only mask it.
143
+ }
144
+ const message = error instanceof Error ? error.message : String(error);
145
+ throw new Error(`Failed to initialize database: ${message}`);
146
+ }
147
+ (0, debug_logger_js_1.info)(`[storage/database] Database opened (${adapter.constructor.name})`);
148
+ (0, progress_indicator_js_1.logComplete)('Database ready');
149
+ return {
150
+ adapter,
151
+ connection,
152
+ dbPath: resolveAdapterDbPath(adapter) ?? `${adapter.constructor.name} (path unavailable)`,
153
+ close: async () => {
154
+ await adapter.disconnect();
155
+ },
156
+ };
157
+ }
158
+ //# sourceMappingURL=database.js.map