@jungjaehoon/mama-core 2.4.1 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/README.md +76 -239
  2. package/db/migrations/030-case-first-memory-substrate.sql +13 -98
  3. package/db/migrations/034-add-connector-event-scope-columns.sql +9 -13
  4. package/db/migrations/039-add-connector-event-operator-ingest-seq.sql +9 -95
  5. package/db/migrations/062-refresh-connector-event-sequences.sql +9 -113
  6. package/db/migrations/063-refresh-legacy-connector-event-updates.sql +9 -32
  7. package/db/migrations/067-add-connector-event-source-entity-id.sql +9 -13
  8. package/db/migrations/069-create-registry-nodes.sql +52 -0
  9. package/db/migrations/070-record-identity.sql +35 -0
  10. package/db/migrations/071-service-operation-origins.sql +187 -0
  11. package/db/migrations/072-observation-versions.sql +29 -0
  12. package/db/migrations/073-registry-corrections.sql +45 -0
  13. package/db/migrations/074-work-graph-ref-kinds.sql +39 -0
  14. package/db/migrations/075-agent-judgments.sql +58 -0
  15. package/db/migrations/076-scoped-checkpoint-bindings.sql +15 -0
  16. package/db/migrations/077-legacy-record-kind.sql +6 -0
  17. package/db/migrations/078-source-ingest-commands.sql +18 -0
  18. package/db/migrations/079-twin-edge-relations.sql +43 -0
  19. package/db/migrations/080-restore-duration-days.sql +7 -0
  20. package/db/migrations/081-mailbox.sql +61 -0
  21. package/db/migrations/082-commitments-row-id.sql +12 -0
  22. package/db/migrations/083-observation-is-the-evidence.sql +49 -0
  23. package/db/migrations/084-scope-kind-is-not-the-cores-to-list.sql +34 -0
  24. package/db/migrations/085-a-migration-has-a-source.sql +37 -0
  25. package/db/migrations/086-the-mailbox-is-generic.sql +110 -0
  26. package/db/migrations/087-mailbox-payload.sql +5 -0
  27. package/db/migrations/088-native-input-journal.sql +14 -0
  28. package/db/migrations/089-native-turn-receipt-lookup.sql +3 -0
  29. package/db/migrations/090-model-run-native-inputs.sql +29 -0
  30. package/db/migrations/091-native-turn-results.sql +11 -0
  31. package/db/migrations/092-restore-decision-fts.sql +34 -0
  32. package/db/migrations/093-native-turn-primary-kind.sql +14 -0
  33. package/db/migrations/094-commitment-run-provenance.sql +9 -0
  34. package/db/migrations/095-model-run-native-input-identity.sql +39 -0
  35. package/db/migrations/096-drop-connector-event-index-fts.sql +9 -0
  36. package/db/migrations/097-native-input-json-validity.sql +37 -0
  37. package/db/migrations/098-workflow-memory-kind.sql +105 -0
  38. package/dist/action-contracts.d.ts +212 -0
  39. package/dist/action-contracts.js +10 -0
  40. package/dist/api/catalog.d.ts +118 -0
  41. package/dist/api/catalog.js +1756 -0
  42. package/dist/api/dispatch.d.ts +76 -0
  43. package/dist/api/dispatch.js +372 -0
  44. package/dist/canonicalize.d.ts +2 -2
  45. package/dist/canonicalize.js +3 -3
  46. package/dist/client/client.d.ts +33 -0
  47. package/dist/client/client.js +123 -0
  48. package/dist/client/ipc.d.ts +81 -0
  49. package/dist/client/ipc.js +314 -0
  50. package/dist/db-adapter/base-adapter.d.ts +6 -66
  51. package/dist/db-adapter/base-adapter.js +6 -6
  52. package/dist/db-adapter/index.d.ts +5 -5
  53. package/dist/db-adapter/index.js +2 -5
  54. package/dist/db-adapter/node-sqlite-adapter.d.ts +85 -15
  55. package/dist/db-adapter/node-sqlite-adapter.js +1968 -570
  56. package/dist/db-manager.d.ts +53 -97
  57. package/dist/db-manager.js +121 -603
  58. package/dist/embedding/embedder.d.ts +132 -0
  59. package/dist/embedding/embedder.js +299 -0
  60. package/dist/identity/principal-repository.d.ts +2 -2
  61. package/dist/index.d.ts +43 -58
  62. package/dist/index.js +97 -145
  63. package/dist/{context-compile/channel-grant.d.ts → knowledge/access.d.ts} +12 -17
  64. package/dist/knowledge/access.js +663 -0
  65. package/dist/knowledge/case-errors.d.ts +31 -0
  66. package/dist/knowledge/case-errors.js +40 -0
  67. package/dist/{cases/search-rollup.d.ts → knowledge/case-search-rollup.d.ts} +5 -4
  68. package/dist/{cases/search-rollup.js → knowledge/case-search-rollup.js} +6 -8
  69. package/dist/{cases/store.d.ts → knowledge/case-store.d.ts} +3 -6
  70. package/dist/{cases/store.js → knowledge/case-store.js} +7 -42
  71. package/dist/{cases/timeline-range.d.ts → knowledge/case-timeline-range.d.ts} +3 -3
  72. package/dist/{cases/timeline-range.js → knowledge/case-timeline-range.js} +47 -25
  73. package/dist/{cases/types.d.ts → knowledge/case-types.d.ts} +8 -2
  74. package/dist/{cases/types.js → knowledge/case-types.js} +1 -1
  75. package/dist/knowledge/commitments.d.ts +188 -0
  76. package/dist/knowledge/commitments.js +370 -0
  77. package/dist/knowledge/decision-edges.d.ts +70 -0
  78. package/dist/knowledge/decision-edges.js +123 -0
  79. package/dist/{agent-graph/types.d.ts → knowledge/graph-query.d.ts} +80 -70
  80. package/dist/knowledge/graph-query.js +1585 -0
  81. package/dist/knowledge/identity.d.ts +16 -0
  82. package/dist/knowledge/identity.js +22 -0
  83. package/dist/knowledge/index.d.ts +47 -0
  84. package/dist/knowledge/index.js +90 -0
  85. package/dist/knowledge/judgments.d.ts +118 -0
  86. package/dist/knowledge/judgments.js +808 -0
  87. package/dist/knowledge/observations.d.ts +160 -0
  88. package/dist/knowledge/observations.js +449 -0
  89. package/dist/knowledge/question-type.d.ts +34 -0
  90. package/dist/knowledge/question-type.js +70 -0
  91. package/dist/{search → knowledge}/ranker-features.js +1 -1
  92. package/dist/{search → knowledge}/search-quality.d.ts +0 -1
  93. package/dist/knowledge/search.d.ts +38 -0
  94. package/dist/knowledge/search.js +91 -0
  95. package/dist/knowledge/source-ingest.d.ts +65 -0
  96. package/dist/knowledge/source-ingest.js +174 -0
  97. package/dist/{edges/types.d.ts → knowledge/twin-edge-types.d.ts} +31 -4
  98. package/dist/{edges/types.js → knowledge/twin-edge-types.js} +13 -2
  99. package/dist/knowledge/work-dates.d.ts +49 -0
  100. package/dist/knowledge/work-dates.js +120 -0
  101. package/dist/mama-api.d.ts +114 -778
  102. package/dist/mama-api.js +313 -2461
  103. package/dist/memory/api.d.ts +264 -24
  104. package/dist/memory/api.js +1633 -843
  105. package/dist/memory/bootstrap-builder.d.ts +2 -1
  106. package/dist/memory/bootstrap-builder.js +5 -5
  107. package/dist/memory/channel-summary-state-store.d.ts +3 -2
  108. package/dist/memory/channel-summary-state-store.js +53 -51
  109. package/dist/memory/channel-summary-store.d.ts +5 -3
  110. package/dist/memory/channel-summary-store.js +3 -8
  111. package/dist/memory/dashboard-read.d.ts +46 -0
  112. package/dist/memory/dashboard-read.js +94 -0
  113. package/dist/memory/event-store.d.ts +3 -3
  114. package/dist/memory/event-store.js +3 -10
  115. package/dist/memory/finding-store.d.ts +3 -2
  116. package/dist/memory/finding-store.js +2 -7
  117. package/dist/memory/graph-read.d.ts +52 -0
  118. package/dist/memory/graph-read.js +130 -0
  119. package/dist/memory/judgment-types.d.ts +394 -0
  120. package/dist/memory/judgment-types.js +16 -0
  121. package/dist/memory/provenance-audit.d.ts +5 -2
  122. package/dist/memory/provenance-audit.js +8 -14
  123. package/dist/memory/provenance-live.d.ts +141 -0
  124. package/dist/memory/provenance-live.js +409 -0
  125. package/dist/memory/provenance-query.d.ts +5 -4
  126. package/dist/memory/provenance-query.js +21 -29
  127. package/dist/memory/provenance-resolver.d.ts +191 -0
  128. package/dist/memory/provenance-resolver.js +155 -0
  129. package/dist/memory/provenance.d.ts +1 -11
  130. package/dist/memory/provenance.js +2 -33
  131. package/dist/memory/recall-sanitize.d.ts +55 -0
  132. package/dist/memory/recall-sanitize.js +144 -0
  133. package/dist/memory/secret-filter.d.ts +32 -0
  134. package/dist/memory/secret-filter.js +126 -0
  135. package/dist/memory/truth-store.d.ts +2 -1
  136. package/dist/memory/truth-store.js +1 -4
  137. package/dist/memory/types.d.ts +74 -24
  138. package/dist/memory/types.js +75 -5
  139. package/dist/memory/write-adapters.d.ts +98 -0
  140. package/dist/memory/write-adapters.js +242 -0
  141. package/dist/operations/owner-action-effects.d.ts +53 -0
  142. package/dist/operations/owner-action-effects.js +96 -0
  143. package/dist/provenance/source-ref.d.ts +1 -1
  144. package/dist/provenance/source-ref.js +0 -2
  145. package/dist/registry/corrections.d.ts +31 -0
  146. package/dist/registry/corrections.js +332 -0
  147. package/dist/registry/record-identity.d.ts +49 -0
  148. package/dist/registry/record-identity.js +133 -0
  149. package/dist/registry/store.d.ts +101 -0
  150. package/dist/registry/store.js +395 -0
  151. package/dist/registry/types.d.ts +28 -0
  152. package/dist/registry/types.js +5 -0
  153. package/dist/relevance-scorer.js +2 -2
  154. package/dist/runtime/agent-event-bus.d.ts +50 -0
  155. package/dist/runtime/agent-event-bus.js +101 -0
  156. package/dist/runtime/drivers/claude-cli-wrapper.d.ts +155 -0
  157. package/dist/runtime/drivers/claude-cli-wrapper.js +392 -0
  158. package/dist/runtime/drivers/cli-arg-redaction.d.ts +2 -0
  159. package/dist/runtime/drivers/cli-arg-redaction.js +18 -0
  160. package/dist/runtime/drivers/cli-secret-redaction.d.ts +17 -0
  161. package/dist/runtime/drivers/cli-secret-redaction.js +126 -0
  162. package/dist/runtime/drivers/codex-app-server-process.d.ts +277 -0
  163. package/dist/runtime/drivers/codex-app-server-process.js +2342 -0
  164. package/dist/runtime/drivers/codex-auxiliary-tools.d.ts +17 -0
  165. package/dist/runtime/drivers/codex-auxiliary-tools.js +267 -0
  166. package/dist/runtime/drivers/codex-home.d.ts +20 -0
  167. package/dist/runtime/drivers/codex-home.js +674 -0
  168. package/dist/runtime/drivers/codex-thread-registry.d.ts +63 -0
  169. package/dist/runtime/drivers/codex-thread-registry.js +433 -0
  170. package/dist/runtime/drivers/persistent-cli-adapter.d.ts +160 -0
  171. package/dist/runtime/drivers/persistent-cli-adapter.js +396 -0
  172. package/dist/runtime/drivers/persistent-cli-process.d.ts +424 -0
  173. package/dist/runtime/drivers/persistent-cli-process.js +1543 -0
  174. package/dist/runtime/drivers/types.d.ts +456 -0
  175. package/dist/runtime/drivers/types.js +110 -0
  176. package/dist/runtime/mailbox.d.ts +223 -0
  177. package/dist/runtime/mailbox.js +582 -0
  178. package/dist/runtime/model-run-store.d.ts +28 -0
  179. package/dist/{model-runs/store.js → runtime/model-run-store.js} +81 -41
  180. package/dist/{model-runs/types.d.ts → runtime/model-run-types.d.ts} +33 -4
  181. package/dist/{model-runs/types.js → runtime/model-run-types.js} +1 -1
  182. package/dist/runtime/native-effect-observer.d.ts +22 -0
  183. package/dist/runtime/native-effect-observer.js +103 -0
  184. package/dist/runtime/native-input-journal.d.ts +46 -0
  185. package/dist/runtime/native-input-journal.js +308 -0
  186. package/dist/runtime/native-prompt.d.ts +118 -0
  187. package/dist/runtime/native-prompt.js +496 -0
  188. package/dist/runtime/native-session.d.ts +10 -0
  189. package/dist/{agent-graph/index.js → runtime/native-session.js} +9 -6
  190. package/dist/runtime/native-tool-trace-observer.d.ts +5 -0
  191. package/dist/runtime/native-tool-trace-observer.js +65 -0
  192. package/dist/runtime/native-turn.d.ts +272 -0
  193. package/dist/runtime/native-turn.js +1041 -0
  194. package/dist/runtime/operations.d.ts +236 -0
  195. package/dist/runtime/operations.js +565 -0
  196. package/dist/runtime/post-tool-handler.d.ts +74 -0
  197. package/dist/runtime/post-tool-handler.js +137 -0
  198. package/dist/runtime/prompt-layers.d.ts +126 -0
  199. package/dist/runtime/prompt-layers.js +239 -0
  200. package/dist/runtime/runtime-process.d.ts +102 -0
  201. package/dist/runtime/runtime-process.js +206 -0
  202. package/dist/runtime/runtime.d.ts +278 -0
  203. package/dist/runtime/runtime.js +563 -0
  204. package/dist/runtime/session-pool.d.ts +176 -0
  205. package/dist/runtime/session-pool.js +369 -0
  206. package/dist/runtime/stimulus-payload.d.ts +5 -0
  207. package/dist/runtime/stimulus-payload.js +50 -0
  208. package/dist/runtime/subagent-bridge.d.ts +24 -0
  209. package/dist/{agent-graph/types.js → runtime/subagent-bridge.js} +1 -1
  210. package/dist/runtime/text-completion.d.ts +22 -0
  211. package/dist/{agent-situation/types.js → runtime/text-completion.js} +1 -1
  212. package/dist/runtime/token-estimator.d.ts +25 -0
  213. package/dist/runtime/token-estimator.js +75 -0
  214. package/dist/runtime/tool-trace-store.d.ts +22 -0
  215. package/dist/{model-runs → runtime}/tool-trace-store.js +46 -27
  216. package/dist/runtime/trace-summary.d.ts +5 -0
  217. package/dist/runtime/trace-summary.js +74 -0
  218. package/dist/runtime/turn-text.d.ts +23 -0
  219. package/dist/runtime/turn-text.js +41 -0
  220. package/dist/storage/database.d.ts +67 -0
  221. package/dist/storage/database.js +158 -0
  222. package/package.json +20 -34
  223. package/dist/agent-graph/alias-write.d.ts +0 -3
  224. package/dist/agent-graph/alias-write.js +0 -234
  225. package/dist/agent-graph/entity-resolve.d.ts +0 -3
  226. package/dist/agent-graph/entity-resolve.js +0 -271
  227. package/dist/agent-graph/errors.d.ts +0 -4
  228. package/dist/agent-graph/errors.js +0 -11
  229. package/dist/agent-graph/graph-query.d.ts +0 -5
  230. package/dist/agent-graph/graph-query.js +0 -360
  231. package/dist/agent-graph/index.d.ts +0 -6
  232. package/dist/agent-situation/builder.d.ts +0 -8
  233. package/dist/agent-situation/builder.js +0 -239
  234. package/dist/agent-situation/cache-key.d.ts +0 -4
  235. package/dist/agent-situation/cache-key.js +0 -64
  236. package/dist/agent-situation/index.d.ts +0 -7
  237. package/dist/agent-situation/index.js +0 -28
  238. package/dist/agent-situation/packet-store.d.ts +0 -27
  239. package/dist/agent-situation/packet-store.js +0 -228
  240. package/dist/agent-situation/ranking-policy.d.ts +0 -18
  241. package/dist/agent-situation/ranking-policy.js +0 -75
  242. package/dist/agent-situation/source-readers.d.ts +0 -52
  243. package/dist/agent-situation/source-readers.js +0 -300
  244. package/dist/agent-situation/types.d.ts +0 -195
  245. package/dist/cases/wiki-page-index.d.ts +0 -37
  246. package/dist/cases/wiki-page-index.js +0 -201
  247. package/dist/config-loader.d.ts +0 -68
  248. package/dist/config-loader.js +0 -239
  249. package/dist/connectors/event-index.d.ts +0 -24
  250. package/dist/connectors/event-index.js +0 -245
  251. package/dist/connectors/raw-query.d.ts +0 -40
  252. package/dist/connectors/raw-query.js +0 -412
  253. package/dist/connectors/types.d.ts +0 -117
  254. package/dist/connectors/types.js +0 -3
  255. package/dist/context-compile/boundary-defaults.d.ts +0 -12
  256. package/dist/context-compile/boundary-defaults.js +0 -105
  257. package/dist/context-compile/channel-grant.js +0 -66
  258. package/dist/context-compile/compiler-policy.d.ts +0 -39
  259. package/dist/context-compile/compiler-policy.js +0 -147
  260. package/dist/context-compile/compiler.d.ts +0 -18
  261. package/dist/context-compile/compiler.js +0 -404
  262. package/dist/context-compile/index.d.ts +0 -10
  263. package/dist/context-compile/index.js +0 -26
  264. package/dist/context-compile/packet-store.d.ts +0 -8
  265. package/dist/context-compile/packet-store.js +0 -239
  266. package/dist/context-compile/ref.d.ts +0 -7
  267. package/dist/context-compile/ref.js +0 -102
  268. package/dist/context-compile/source-readers.d.ts +0 -70
  269. package/dist/context-compile/source-readers.js +0 -840
  270. package/dist/context-compile/types.d.ts +0 -155
  271. package/dist/context-compile/types.js +0 -11
  272. package/dist/context-compile/visibility.d.ts +0 -21
  273. package/dist/context-compile/visibility.js +0 -224
  274. package/dist/decision-tracker.d.ts +0 -206
  275. package/dist/decision-tracker.js +0 -481
  276. package/dist/edges/ref-validation.d.ts +0 -7
  277. package/dist/edges/ref-validation.js +0 -321
  278. package/dist/edges/store.d.ts +0 -8
  279. package/dist/edges/store.js +0 -129
  280. package/dist/embedding-client.d.ts +0 -28
  281. package/dist/embedding-client.js +0 -53
  282. package/dist/embedding-server/index.d.ts +0 -67
  283. package/dist/embedding-server/index.js +0 -405
  284. package/dist/embedding-server/mobile/auth.d.ts +0 -44
  285. package/dist/embedding-server/mobile/auth.js +0 -150
  286. package/dist/embedding-server/mobile/daemon.d.ts +0 -129
  287. package/dist/embedding-server/mobile/daemon.js +0 -313
  288. package/dist/embedding-server/mobile/output-parser.d.ts +0 -115
  289. package/dist/embedding-server/mobile/output-parser.js +0 -241
  290. package/dist/embedding-server/mobile/session-api.d.ts +0 -57
  291. package/dist/embedding-server/mobile/session-api.js +0 -261
  292. package/dist/embedding-server/mobile/session-manager.d.ts +0 -138
  293. package/dist/embedding-server/mobile/session-manager.js +0 -378
  294. package/dist/embedding-server/mobile/websocket-handler.d.ts +0 -137
  295. package/dist/embedding-server/mobile/websocket-handler.js +0 -486
  296. package/dist/embeddings.d.ts +0 -68
  297. package/dist/embeddings.js +0 -244
  298. package/dist/entities/audit-metrics.d.ts +0 -68
  299. package/dist/entities/audit-metrics.js +0 -124
  300. package/dist/entities/candidate-generator.d.ts +0 -8
  301. package/dist/entities/candidate-generator.js +0 -24
  302. package/dist/entities/entity-linked-decision-counts.d.ts +0 -2
  303. package/dist/entities/entity-linked-decision-counts.js +0 -29
  304. package/dist/entities/entity-list.d.ts +0 -22
  305. package/dist/entities/entity-list.js +0 -3
  306. package/dist/entities/entity-orphan-list.d.ts +0 -17
  307. package/dist/entities/entity-orphan-list.js +0 -3
  308. package/dist/entities/entity-search.d.ts +0 -20
  309. package/dist/entities/entity-search.js +0 -3
  310. package/dist/entities/errors.d.ts +0 -55
  311. package/dist/entities/errors.js +0 -100
  312. package/dist/entities/lineage-store.d.ts +0 -28
  313. package/dist/entities/lineage-store.js +0 -204
  314. package/dist/entities/normalization.d.ts +0 -14
  315. package/dist/entities/normalization.js +0 -63
  316. package/dist/entities/policy-store.d.ts +0 -8
  317. package/dist/entities/policy-store.js +0 -75
  318. package/dist/entities/policy-types.d.ts +0 -72
  319. package/dist/entities/policy-types.js +0 -59
  320. package/dist/entities/projection.d.ts +0 -8
  321. package/dist/entities/projection.js +0 -82
  322. package/dist/entities/provenance-query.d.ts +0 -32
  323. package/dist/entities/provenance-query.js +0 -3
  324. package/dist/entities/read-identity.d.ts +0 -31
  325. package/dist/entities/read-identity.js +0 -264
  326. package/dist/entities/recall-bridge.d.ts +0 -5
  327. package/dist/entities/recall-bridge.js +0 -171
  328. package/dist/entities/resolution-engine.d.ts +0 -8
  329. package/dist/entities/resolution-engine.js +0 -3
  330. package/dist/entities/rollback-preview.d.ts +0 -35
  331. package/dist/entities/rollback-preview.js +0 -3
  332. package/dist/entities/source-locator.d.ts +0 -3
  333. package/dist/entities/source-locator.js +0 -32
  334. package/dist/entities/store.d.ts +0 -69
  335. package/dist/entities/store.js +0 -544
  336. package/dist/entities/types.d.ts +0 -166
  337. package/dist/entities/types.js +0 -30
  338. package/dist/memory/extraction-prompt.d.ts +0 -4
  339. package/dist/memory/extraction-prompt.js +0 -89
  340. package/dist/memory/scope-backfill.d.ts +0 -14
  341. package/dist/memory/scope-backfill.js +0 -3
  342. package/dist/memory/scope-store.d.ts +0 -4
  343. package/dist/memory/scope-store.js +0 -9
  344. package/dist/memory-store.d.ts +0 -87
  345. package/dist/memory-store.js +0 -78
  346. package/dist/model-runs/store.d.ts +0 -13
  347. package/dist/model-runs/tool-trace-store.d.ts +0 -8
  348. package/dist/notification-manager.d.ts +0 -7
  349. package/dist/notification-manager.js +0 -12
  350. package/dist/outcome-tracker.d.ts +0 -151
  351. package/dist/outcome-tracker.js +0 -271
  352. package/dist/query-intent.d.ts +0 -23
  353. package/dist/query-intent.js +0 -114
  354. package/dist/runtime/trusted-provenance.d.ts +0 -3
  355. package/dist/runtime/trusted-provenance.js +0 -6
  356. package/dist/search/question-type.d.ts +0 -5
  357. package/dist/search/question-type.js +0 -41
  358. package/dist/test-utils.d.ts +0 -80
  359. package/dist/test-utils.js +0 -218
  360. package/dist/tier-validator.d.ts +0 -43
  361. package/dist/tier-validator.js +0 -159
  362. package/dist/time-formatter.d.ts +0 -25
  363. package/dist/time-formatter.js +0 -93
  364. /package/dist/{search → knowledge}/feedback-store.d.ts +0 -0
  365. /package/dist/{search → knowledge}/feedback-store.js +0 -0
  366. /package/dist/{search → knowledge}/ranker-features.d.ts +0 -0
  367. /package/dist/{search → knowledge}/ranker-rescore.d.ts +0 -0
  368. /package/dist/{search → knowledge}/ranker-rescore.js +0 -0
  369. /package/dist/{search → knowledge}/ranker-trainer.d.ts +0 -0
  370. /package/dist/{search → knowledge}/ranker-trainer.js +0 -0
  371. /package/dist/{search → knowledge}/search-quality.js +0 -0
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * Case errors.
4
+ *
5
+ * `CaseMergeChainCycleError` used to live in `entities/errors.ts` and extend
6
+ * that module's `EntityError`. Nothing about a cycle in `case_truth` belongs to
7
+ * the entity substrate; it sat there because the two subsystems were written
8
+ * together. It carries its own shape now.
9
+ *
10
+ * @module cases/errors
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CaseMergeChainCycleError = void 0;
14
+ class CaseMergeChainCycleError extends Error {
15
+ code = 'case.merge_chain_cycle';
16
+ doc_section = '#case-merge-chain-cycle';
17
+ context;
18
+ hint;
19
+ constructor(context) {
20
+ super(`Case merge chain cycle detected at depth ${context.detected_at_depth} starting from case_id=${context.case_id}. Chain=${context.chain.join(' -> ')}.`);
21
+ this.name = new.target.name;
22
+ this.context = context;
23
+ this.hint = 'Inspect case_truth.canonical_case_id links and remove the cycle before retrying.';
24
+ if (Error.captureStackTrace) {
25
+ Error.captureStackTrace(this, new.target);
26
+ }
27
+ }
28
+ toErrorEnvelope() {
29
+ return {
30
+ error: {
31
+ code: this.code,
32
+ message: this.message,
33
+ hint: this.hint,
34
+ doc_url: `docs/guides/troubleshooting.md${this.doc_section}`,
35
+ },
36
+ };
37
+ }
38
+ }
39
+ exports.CaseMergeChainCycleError = CaseMergeChainCycleError;
40
+ //# sourceMappingURL=case-errors.js.map
@@ -1,5 +1,6 @@
1
- import type { AdapterLike } from './wiki-page-index.js';
2
- import type { SearchHitDiagnostics } from '../search/search-quality.js';
1
+ import type { DatabaseAdapter } from '../db-manager.js';
2
+ type AdapterLike = Pick<DatabaseAdapter, 'prepare' | 'transaction'>;
3
+ import type { SearchHitDiagnostics } from '../knowledge/search-quality.js';
3
4
  export type { AdapterLike };
4
5
  export interface SearchRollupLeafHit {
5
6
  source_type: 'decision' | 'checkpoint' | 'wiki_page' | 'connector_event';
@@ -11,7 +12,7 @@ export interface SearchRollupLeafHit {
11
12
  retrieval_diagnostics?: SearchHitDiagnostics;
12
13
  }
13
14
  export interface SearchRollupResult {
14
- source_type: 'decision' | 'checkpoint' | 'wiki_page' | 'case' | 'standalone_connector_hit';
15
+ source_type: 'decision' | 'checkpoint' | 'wiki_page' | 'case' | 'ungrouped_connector_hit';
15
16
  source_id: string;
16
17
  case_id: string | null;
17
18
  score: number;
@@ -24,4 +25,4 @@ export declare function rollUpSearchHits(input: {
24
25
  fusedHits: SearchRollupLeafHit[];
25
26
  adapter: AdapterLike;
26
27
  }): SearchRollupResult[];
27
- //# sourceMappingURL=search-rollup.d.ts.map
28
+ //# sourceMappingURL=case-search-rollup.d.ts.map
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.rollUpSearchHits = rollUpSearchHits;
4
- const store_js_1 = require("./store.js");
4
+ const case_store_js_1 = require("./case-store.js");
5
5
  function sourceKey(sourceType, sourceId) {
6
6
  return `${sourceType}:${sourceId}`;
7
7
  }
@@ -26,7 +26,6 @@ function searchHitDiagnostics(value) {
26
26
  !(object.vector_similarity === null || typeof object.vector_similarity === 'number') ||
27
27
  typeof object.is_vector_only !== 'boolean' ||
28
28
  typeof object.lexical_support !== 'boolean' ||
29
- typeof object.entity_support !== 'boolean' ||
30
29
  typeof object.scope_support !== 'boolean' ||
31
30
  (object.graph_source !== 'primary' &&
32
31
  object.graph_source !== 'expanded' &&
@@ -50,9 +49,6 @@ function diagnosticsRank(diagnostics) {
50
49
  if (diagnostics.lexical_support) {
51
50
  rank += 20;
52
51
  }
53
- if (diagnostics.entity_support) {
54
- rank += 20;
55
- }
56
52
  if (diagnostics.graph_source === 'primary') {
57
53
  rank += 10;
58
54
  }
@@ -101,7 +97,7 @@ function loadCaseRecord(adapter, caseId) {
101
97
  return row ?? { case_id: caseId };
102
98
  }
103
99
  function canonicalCaseId(adapter, caseId) {
104
- return (0, store_js_1.resolveCanonicalCaseChain)(adapter, caseId).terminal_case_id;
100
+ return (0, case_store_js_1.resolveCanonicalCaseChain)(adapter, caseId).terminal_case_id;
105
101
  }
106
102
  function listActiveMembershipCaseIds(adapter, sourceType, sourceId) {
107
103
  const rows = adapter
@@ -173,7 +169,9 @@ function upsertOrphan(orphans, leaf) {
173
169
  const diagnostics = leafDiagnostics(leaf);
174
170
  const contributingLeafDiagnostics = diagnostics ? { [leaf.source_id]: diagnostics } : undefined;
175
171
  orphans.set(key, {
176
- source_type: leaf.source_type === 'connector_event' ? 'standalone_connector_hit' : leaf.source_type,
172
+ // A connector hit that belongs to no case. Its old name began with the word a
173
+ // product in this repo is called, so it read as one and was counted as one.
174
+ source_type: leaf.source_type === 'connector_event' ? 'ungrouped_connector_hit' : leaf.source_type,
177
175
  source_id: leaf.source_id,
178
176
  case_id: null,
179
177
  score: leaf.fused_rank_score,
@@ -306,4 +304,4 @@ function rollUpSearchHits(input) {
306
304
  ...Array.from(orphans.values()),
307
305
  ].sort(compareResults);
308
306
  }
309
- //# sourceMappingURL=search-rollup.js.map
307
+ //# sourceMappingURL=case-search-rollup.js.map
@@ -1,5 +1,5 @@
1
- import { type DatabaseAdapter } from '../db-manager.js';
2
- import type { CanonicalCaseResolution, CaseAssembly, CaseAssemblyMembership, CaseBlocker, CaseConfidence, CaseCorrectionRecord, CaseMembershipRecord, CaseMembershipSourceType, CasePrimaryActor, CaseProposalKind, CaseProposalQueueRecord, CaseTruthRecord } from './types.js';
1
+ import type { DatabaseAdapter } from '../db-manager.js';
2
+ import type { CanonicalCaseResolution, CaseAssembly, CaseAssemblyMembership, CaseBlocker, CaseConfidence, CaseCorrectionRecord, CaseMembershipRecord, CaseMembershipSourceType, CasePrimaryActor, CaseProposalKind, CaseProposalQueueRecord, CaseTruthRecord } from './case-types.js';
3
3
  type CaseStoreAdapter = Pick<DatabaseAdapter, 'prepare' | 'transaction'>;
4
4
  export interface UpsertCaseTruthSlowFieldsInput {
5
5
  case_id: string;
@@ -43,9 +43,7 @@ export interface AssembleCaseOptions {
43
43
  }
44
44
  export declare function resolveCanonicalCaseChain(adapter: CaseStoreAdapter, caseId: string, maxDepth?: number): CanonicalCaseResolution;
45
45
  export declare function expandCaseChainForAssembly(adapter: Pick<DatabaseAdapter, 'prepare'>, terminalCaseId: string, resolvedChain: string[]): string[];
46
- export declare function upsertCaseTruthSlowFields(input: UpsertCaseTruthSlowFieldsInput): CaseTruthRecord;
47
46
  export declare function upsertCaseTruthSlowFields(adapter: CaseStoreAdapter, input: UpsertCaseTruthSlowFieldsInput): CaseTruthRecord;
48
- export declare function upsertExplicitCaseMemberships(input: UpsertExplicitCaseMembershipsInput): CaseMembershipRecord[];
49
47
  export declare function upsertExplicitCaseMemberships(adapter: CaseStoreAdapter, input: UpsertExplicitCaseMembershipsInput): CaseMembershipRecord[];
50
48
  export declare function listActiveMembershipsForCaseChain(adapter: CaseStoreAdapter, caseIds: string[], limit?: number): CaseAssemblyMembership[];
51
49
  export interface ListActiveCorrectionsForCaseResult {
@@ -64,7 +62,6 @@ export interface ListActiveCorrectionsForCaseResult {
64
62
  export declare function listActiveCorrectionsForCase(adapter: CaseStoreAdapter, caseId: string): ListActiveCorrectionsForCaseResult;
65
63
  export declare function listActiveCorrectionsForCaseChain(adapter: CaseStoreAdapter, caseIds: string[]): CaseCorrectionRecord[];
66
64
  export declare function listUnresolvedCaseProposals(adapter: CaseStoreAdapter, project: string): CaseProposalQueueRecord[];
67
- export declare function assembleCase(caseId: string, options?: AssembleCaseOptions): CaseAssembly;
68
65
  export declare function assembleCase(adapter: CaseStoreAdapter, caseId: string, options?: AssembleCaseOptions): CaseAssembly;
69
66
  export {};
70
- //# sourceMappingURL=store.d.ts.map
67
+ //# sourceMappingURL=case-store.d.ts.map
@@ -9,39 +9,7 @@ exports.listActiveCorrectionsForCase = listActiveCorrectionsForCase;
9
9
  exports.listActiveCorrectionsForCaseChain = listActiveCorrectionsForCaseChain;
10
10
  exports.listUnresolvedCaseProposals = listUnresolvedCaseProposals;
11
11
  exports.assembleCase = assembleCase;
12
- const db_manager_js_1 = require("../db-manager.js");
13
- const errors_js_1 = require("../entities/errors.js");
14
- function isAdapter(value) {
15
- return (typeof value === 'object' &&
16
- value !== null &&
17
- typeof value.prepare === 'function' &&
18
- typeof value.transaction === 'function');
19
- }
20
- function resolveWriteArgs(adapterOrInput, input) {
21
- if (input !== undefined) {
22
- if (!isAdapter(adapterOrInput)) {
23
- throw new Error('First argument must be a database adapter when input is provided.');
24
- }
25
- return { adapter: adapterOrInput, input };
26
- }
27
- if (isAdapter(adapterOrInput)) {
28
- throw new Error('Input is required when first argument is a database adapter.');
29
- }
30
- return { adapter: (0, db_manager_js_1.getAdapter)(), input: adapterOrInput };
31
- }
32
- function resolveAssembleArgs(adapterOrCaseId, caseIdOrOptions, options) {
33
- if (isAdapter(adapterOrCaseId)) {
34
- if (typeof caseIdOrOptions !== 'string') {
35
- throw new Error('caseId is required when first argument is a database adapter.');
36
- }
37
- return { adapter: adapterOrCaseId, caseId: caseIdOrOptions, options };
38
- }
39
- return {
40
- adapter: (0, db_manager_js_1.getAdapter)(),
41
- caseId: adapterOrCaseId,
42
- options: typeof caseIdOrOptions === 'object' ? caseIdOrOptions : undefined,
43
- };
44
- }
12
+ const case_errors_js_1 = require("./case-errors.js");
45
13
  function nowIso() {
46
14
  return new Date().toISOString();
47
15
  }
@@ -277,14 +245,14 @@ function resolveCanonicalCaseChain(adapter, caseId, maxDepth = 64) {
277
245
  const detectedAtDepth = chain.length + 1;
278
246
  const cycleChain = [...chain, current];
279
247
  if (visited.has(current)) {
280
- throw new errors_js_1.CaseMergeChainCycleError({
248
+ throw new case_errors_js_1.CaseMergeChainCycleError({
281
249
  case_id: caseId,
282
250
  chain: cycleChain,
283
251
  detected_at_depth: detectedAtDepth,
284
252
  });
285
253
  }
286
254
  if (detectedAtDepth > maxDepth) {
287
- throw new errors_js_1.CaseMergeChainCycleError({
255
+ throw new case_errors_js_1.CaseMergeChainCycleError({
288
256
  case_id: caseId,
289
257
  chain: cycleChain,
290
258
  detected_at_depth: detectedAtDepth,
@@ -336,8 +304,7 @@ function expandCaseChainForAssembly(adapter, terminalCaseId, resolvedChain) {
336
304
  }
337
305
  return chain;
338
306
  }
339
- function upsertCaseTruthSlowFields(adapterOrInput, maybeInput) {
340
- const { adapter, input } = resolveWriteArgs(adapterOrInput, maybeInput);
307
+ function upsertCaseTruthSlowFields(adapter, input) {
341
308
  const createdAt = nowIso();
342
309
  const updatedAt = createdAt;
343
310
  return adapter.transaction(() => {
@@ -368,8 +335,7 @@ function upsertCaseTruthSlowFields(adapterOrInput, maybeInput) {
368
335
  return saved;
369
336
  });
370
337
  }
371
- function upsertExplicitCaseMemberships(adapterOrInput, maybeInput) {
372
- const { adapter, input } = resolveWriteArgs(adapterOrInput, maybeInput);
338
+ function upsertExplicitCaseMemberships(adapter, input) {
373
339
  const updatedAt = nowIso();
374
340
  return adapter.transaction(() => {
375
341
  // wiki-compiler memberships are hard-coded to status='active' and
@@ -577,8 +543,7 @@ function buildLinkedCases(adapter, chain, terminalCaseId) {
577
543
  }
578
544
  return linked;
579
545
  }
580
- function assembleCase(adapterOrCaseId, caseIdOrOptions, maybeOptions) {
581
- const { adapter, caseId, options } = resolveAssembleArgs(adapterOrCaseId, caseIdOrOptions, maybeOptions);
546
+ function assembleCase(adapter, caseId, options) {
582
547
  const resolution = resolveCanonicalCaseChain(adapter, caseId);
583
548
  const assemblyChain = expandCaseChainForAssembly(adapter, resolution.terminal_case_id, resolution.chain);
584
549
  const caseTruth = loadCaseTruth(adapter, resolution.terminal_case_id);
@@ -747,4 +712,4 @@ function assembleCase(adapterOrCaseId, caseIdOrOptions, maybeOptions) {
747
712
  }
748
713
  return assembly;
749
714
  }
750
- //# sourceMappingURL=store.js.map
715
+ //# sourceMappingURL=case-store.js.map
@@ -1,6 +1,6 @@
1
1
  import type { DatabaseAdapter } from '../db-manager.js';
2
- import type { CaseTimelineRangeInput, CaseTimelineRangeResult } from './types.js';
2
+ import type { CaseTimelineRangeInput, CaseTimelineRangeResult } from './case-types.js';
3
3
  type CaseTimelineRangeAdapter = Pick<DatabaseAdapter, 'prepare' | 'transaction'>;
4
4
  export declare function caseTimelineRange(adapter: CaseTimelineRangeAdapter, input: CaseTimelineRangeInput): CaseTimelineRangeResult;
5
- export type { CaseTimelineRangeInput, CaseTimelineRangeItem, CaseTimelineRangeResult, } from './types.js';
6
- //# sourceMappingURL=timeline-range.d.ts.map
5
+ export type { CaseTimelineRangeInput, CaseTimelineRangeItem, CaseTimelineRangeResult, } from './case-types.js';
6
+ //# sourceMappingURL=case-timeline-range.d.ts.map
@@ -1,8 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.caseTimelineRange = caseTimelineRange;
4
- const event_index_js_1 = require("../connectors/event-index.js");
5
- const store_js_1 = require("./store.js");
4
+ const case_store_js_1 = require("./case-store.js");
6
5
  function codedError(code, message, context) {
7
6
  const error = new Error(`${code}: ${message}`);
8
7
  error.code = code;
@@ -124,15 +123,16 @@ function connectorEventSnapshot(row) {
124
123
  return null;
125
124
  }
126
125
  return {
127
- event_index_id: row.event_index_id,
128
- source_connector: row.source_connector,
126
+ event_index_id: row.observation_id,
127
+ source_connector: row.source,
129
128
  source_id: row.source_id,
130
129
  source_locator: row.source_locator,
131
130
  artifact_locator: row.artifact_locator,
132
131
  title: row.title,
133
- content: row.content,
134
- event_datetime: row.event_datetime,
132
+ content: row.body,
133
+ event_datetime: row.source_at,
135
134
  event_date: row.event_date,
135
+ observation_ref: row.observation_id,
136
136
  };
137
137
  }
138
138
  function membershipById(memberships, sourceType) {
@@ -229,10 +229,13 @@ function loadObservationItems(adapter, memberships, bounds, includeConnectorEnri
229
229
  const sourceId = String(row.id);
230
230
  const membership = membershipMap.get(sourceId);
231
231
  const eventDatetime = timestampMs(row.timestamp_observed) ?? timestampMs(row.created_at);
232
+ // Same move as the artifact branch: the source detail is the observation's,
233
+ // and reaching for the connector index made a core read depend on a package
234
+ // three of four consumers do not install.
232
235
  const connectorEvent = includeConnectorEnrichments &&
233
236
  typeof row.source_connector === 'string' &&
234
237
  typeof row.source_raw_record_id === 'string'
235
- ? (0, event_index_js_1.getConnectorEventIndexRecord)(adapter, String(row.source_connector), String(row.source_raw_record_id))
238
+ ? loadObservationBySource(adapter, String(row.source_connector), String(row.source_raw_record_id))
236
239
  : null;
237
240
  return {
238
241
  item_type: 'observation',
@@ -253,30 +256,49 @@ function loadObservationItems(adapter, memberships, bounds, includeConnectorEnri
253
256
  })
254
257
  .filter((item) => withinBounds(item.event_datetime, bounds));
255
258
  }
256
- function loadArtifactConnectorEvent(adapter, sourceId) {
259
+ /**
260
+ * The observation an artifact membership points at.
261
+ *
262
+ * This read the connector event index, which is how a core read came to require
263
+ * the connector package to be installed -- a consumer without it got no timeline
264
+ * and, worse, a migration chain that stopped at 072. Every field the caller uses
265
+ * is on the observation, which is the core's own table and the thing a judgment
266
+ * actually rests on.
267
+ */
268
+ /** One observation by the (source, id-within-it) pair that produced it. */
269
+ function loadObservationBySource(adapter, source, sourceId) {
257
270
  const row = adapter
258
271
  .prepare(`
259
- SELECT *
260
- FROM connector_event_index
261
- WHERE event_index_id = ?
272
+ SELECT observation_id, source, source_id, source_type, source_locator, title,
273
+ artifact_locator, artifact_title, body, source_at, observed_at, event_date
274
+ FROM observation_versions
275
+ WHERE source = ? AND source_id = ?
276
+ ORDER BY observed_at DESC, observation_id DESC
277
+ LIMIT 1
278
+ `)
279
+ .get(source, sourceId);
280
+ return row ? row : null;
281
+ }
282
+ function loadArtifactObservation(adapter, sourceId) {
283
+ const row = adapter
284
+ .prepare(`
285
+ SELECT observation_id, source, source_id, source_type, source_locator, title,
286
+ artifact_locator, artifact_title, body, source_at, observed_at, event_date
287
+ FROM observation_versions
288
+ WHERE observation_id = ?
262
289
  OR artifact_locator = ?
263
- ORDER BY event_datetime ASC, event_index_id ASC
290
+ ORDER BY observed_at ASC, observation_id ASC
264
291
  LIMIT 1
265
292
  `)
266
293
  .get(sourceId, sourceId);
267
- if (!row) {
268
- return null;
269
- }
270
- const sourceConnector = String(row.source_connector);
271
- const connectorSourceId = String(row.source_id);
272
- return (0, event_index_js_1.getConnectorEventIndexRecord)(adapter, sourceConnector, connectorSourceId);
294
+ return row ? row : null;
273
295
  }
274
296
  function loadArtifactItems(adapter, memberships, bounds, includeConnectorEnrichments) {
275
297
  const artifactMemberships = memberships.filter((membership) => membership.source_type === 'artifact');
276
298
  return artifactMemberships
277
299
  .map((membership) => {
278
- const connectorEvent = loadArtifactConnectorEvent(adapter, membership.source_id);
279
- const eventDatetime = connectorEvent?.event_datetime ?? null;
300
+ const connectorEvent = loadArtifactObservation(adapter, membership.source_id);
301
+ const eventDatetime = connectorEvent?.source_at ?? null;
280
302
  return {
281
303
  item_type: 'artifact',
282
304
  source_type: 'artifact',
@@ -287,7 +309,7 @@ function loadArtifactItems(adapter, memberships, bounds, includeConnectorEnrichm
287
309
  event_datetime: eventDatetime,
288
310
  event_date: connectorEvent?.event_date ?? eventDateFromMs(eventDatetime),
289
311
  title: connectorEvent?.artifact_title ?? connectorEvent?.title ?? membership.source_id,
290
- summary: connectorEvent?.content ?? null,
312
+ summary: connectorEvent?.body ?? null,
291
313
  role: membership.role,
292
314
  confidence: membership.confidence,
293
315
  membership_reason: membership.reason,
@@ -301,10 +323,10 @@ function loadArtifactItems(adapter, memberships, bounds, includeConnectorEnrichm
301
323
  function caseTimelineRange(adapter, input) {
302
324
  const bounds = parseBounds(input);
303
325
  const limit = normalizeLimit(input.limit);
304
- const resolution = (0, store_js_1.resolveCanonicalCaseChain)(adapter, input.case_id);
305
- const chainResult = (0, store_js_1.listActiveCorrectionsForCase)(adapter, input.case_id);
326
+ const resolution = (0, case_store_js_1.resolveCanonicalCaseChain)(adapter, input.case_id);
327
+ const chainResult = (0, case_store_js_1.listActiveCorrectionsForCase)(adapter, input.case_id);
306
328
  const chain = chainResult.chain;
307
- const memberships = (0, store_js_1.listActiveMembershipsForCaseChain)(adapter, chain);
329
+ const memberships = (0, case_store_js_1.listActiveMembershipsForCaseChain)(adapter, chain);
308
330
  const items = [
309
331
  ...loadDecisionItems(adapter, memberships, bounds),
310
332
  ...loadEventItems(adapter, memberships, bounds),
@@ -319,4 +341,4 @@ function caseTimelineRange(adapter, input) {
319
341
  items: orderedItems.slice(0, limit),
320
342
  };
321
343
  }
322
- //# sourceMappingURL=timeline-range.js.map
344
+ //# sourceMappingURL=case-timeline-range.js.map
@@ -223,6 +223,11 @@ export interface CaseTimelineRangeItem {
223
223
  role: string | null;
224
224
  confidence: number | null;
225
225
  membership_reason: string | null;
226
+ /**
227
+ * The observation this item rests on, when the caller asked for source detail.
228
+ * The field names are the wire shape callers already read; what fills them is
229
+ * the observation, which is the core's own table.
230
+ */
226
231
  connector_event?: {
227
232
  event_index_id: string;
228
233
  source_connector: string;
@@ -230,9 +235,10 @@ export interface CaseTimelineRangeItem {
230
235
  source_locator: string | null;
231
236
  artifact_locator: string | null;
232
237
  title: string | null;
233
- content: string;
238
+ content: string | null;
234
239
  event_datetime: number | null;
235
240
  event_date: string | null;
241
+ observation_ref: string | null;
236
242
  } | null;
237
243
  }
238
244
  export interface CaseTimelineRangeResult {
@@ -241,4 +247,4 @@ export interface CaseTimelineRangeResult {
241
247
  chain: string[];
242
248
  items: CaseTimelineRangeItem[];
243
249
  }
244
- //# sourceMappingURL=types.d.ts.map
250
+ //# sourceMappingURL=case-types.d.ts.map
@@ -44,4 +44,4 @@ exports.CASE_PROPOSAL_KINDS = [
44
44
  ];
45
45
  exports.CASE_PROPOSAL_RESOLUTIONS = ['accepted', 'rejected', 'modified', 'merged'];
46
46
  exports.CASE_CONFIDENCE_LEVELS = ['high', 'medium', 'low'];
47
- //# sourceMappingURL=types.js.map
47
+ //# sourceMappingURL=case-types.js.map
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Reading owner work back out of the commitment log.
3
+ *
4
+ * `appendJudgment` has written `commitments` and `commitment_assignments` since
5
+ * migration 075: a commitment row carries identity, the current revision and the
6
+ * head record, and one assignment row per revision carries the patch that
7
+ * revision applied. Nothing read them back. The only SELECT against either table
8
+ * was the writer's own CAS check, so the substrate could be written and never
9
+ * answered from - the shape this refactor exists to close.
10
+ *
11
+ * Current values are a fold, not a column. Each assignment states `set` and
12
+ * `clear` for that revision only, and the view is those applied in revision
13
+ * order. That is what keeps a correction from erasing what it corrected: the
14
+ * revision that changed a title is still readable next to the one that set it,
15
+ * and `history: 'all'` returns them.
16
+ *
17
+ * @module knowledge/commitments
18
+ */
19
+ import type { DatabaseAdapter } from '../db-manager.js';
20
+ import type { JudgmentAccess, JudgmentKnowledgeOptions } from './judgments.js';
21
+ import type { JudgmentEventMeta, JudgmentReceipt, OwnerWorkPatch, RecordLink, WorkReference } from '../memory/judgment-types.js';
22
+ import type { MemoryScopeRef } from '../memory/types.js';
23
+ /** One revision of a commitment, as the assignment row recorded it. */
24
+ export interface CommitmentRevision {
25
+ revision: number;
26
+ operation: 'create' | 'revise' | 'withdraw';
27
+ recordRef: WorkReference;
28
+ set: OwnerWorkPatch;
29
+ clear: Array<keyof OwnerWorkPatch>;
30
+ /** Source event time; null means this legacy revision had no event time. */
31
+ eventDatetime: number | null;
32
+ createdAt: number;
33
+ }
34
+ /** The compact lifecycle entry returned for a progress-oriented chain read. */
35
+ export interface CommitmentChainEntry {
36
+ revision: number;
37
+ operation: CommitmentRevision['operation'];
38
+ eventDatetime: number | null;
39
+ status: string | null;
40
+ stage: string | null;
41
+ summary: string | null;
42
+ }
43
+ export interface CommitmentView {
44
+ commitmentId: string;
45
+ rowId: number;
46
+ revision: number;
47
+ latestJudgmentRef: WorkReference;
48
+ /** The fold of every assignment up to `revision`. */
49
+ values: OwnerWorkPatch;
50
+ withdrawn: boolean;
51
+ /** The judgment record each surviving revision was written by, oldest first. */
52
+ basis: WorkReference[];
53
+ createdAt: number;
54
+ updatedAt: number;
55
+ /** Present only when the caller asked for `history: 'all'`. */
56
+ history?: CommitmentRevision[];
57
+ /** Present only when the caller asked for the internal `history: 'chain'`. */
58
+ chain?: CommitmentChainEntry[];
59
+ }
60
+ export interface CommitmentPage {
61
+ items: CommitmentView[];
62
+ nextCursor: string | null;
63
+ coverage: {
64
+ returned: number;
65
+ total: number | null;
66
+ complete: boolean;
67
+ /**
68
+ * Why the page is not the whole answer. Empty when it is. A caller that
69
+ * cannot tell a complete page from a truncated one will read the first page
70
+ * as the board, which is the failure this field exists to prevent.
71
+ */
72
+ reasons: string[];
73
+ };
74
+ }
75
+ export interface WorkRead {
76
+ commitmentId?: string;
77
+ rowId?: number;
78
+ /** Only revisions effective at or before this epoch millisecond are folded. */
79
+ asOf?: number;
80
+ history?: 'current' | 'chain' | 'all';
81
+ limit?: number;
82
+ cursor?: string;
83
+ }
84
+ /**
85
+ * Read owner work: one commitment, or a bounded page of them.
86
+ *
87
+ * `asOf` folds revisions by their source event time when recorded, or by the
88
+ * commit clock for judgments without an event time. A backfill committed today
89
+ * can therefore answer what was current at a historical instant. A commitment
90
+ * whose first revision is later than `asOf` is absent, not empty.
91
+ */
92
+ export declare function readWork(adapter: DatabaseAdapter, query: WorkRead, access: JudgmentAccess): CommitmentPage;
93
+ /**
94
+ * What the caller states when it commits owner work.
95
+ *
96
+ * `commandId` is the caller's idempotency key and `summary` is what the record
97
+ * says; both are required because a commitment is a judgment first. Everything
98
+ * else about the work lives in the patch, which is the only vocabulary this
99
+ * module knows - no product's task shape reaches here.
100
+ */
101
+ export interface WorkCommand {
102
+ commandId: string;
103
+ /** Native run that authored this work, when it was written during a model turn. */
104
+ modelRunId?: string | null;
105
+ /** What this commitment is about; becomes the record topic. */
106
+ topic: string;
107
+ /** What the caller is committing to, in its own words. */
108
+ summary: string;
109
+ reasoning?: string;
110
+ scopes?: MemoryScopeRef[];
111
+ /** Carried onto the record so a commitment names what caused it. */
112
+ sourceRefs?: string[];
113
+ /**
114
+ * Relations this command records as edges in the same transaction as the
115
+ * work. A commitment is a judgment first: a revision that only states how
116
+ * this work relates to other records is still a revision.
117
+ */
118
+ links?: RecordLink[];
119
+ eventDatetime?: number | null;
120
+ /**
121
+ * When this command happened, if the caller keeps its own clock. It stamps
122
+ * the record and the commitment row alike, so a board that filters on
123
+ * `updatedAt` reads the time the caller states rather than the wall clock.
124
+ */
125
+ recordedAt?: number;
126
+ /**
127
+ * Provenance carried onto the record's memory_events row. An importer names
128
+ * itself here so an imported row's history says who wrote it - not the agent
129
+ * that merely ran the migration.
130
+ */
131
+ event?: JudgmentEventMeta;
132
+ }
133
+ export interface CreateWorkCommand extends WorkCommand {
134
+ set: OwnerWorkPatch;
135
+ /**
136
+ * Import vocabulary: the identity this work already had in a predecessor
137
+ * store. A migration that brings existing owner rows into the commitment log
138
+ * names their task id and revision so the log keeps the row's number and CAS
139
+ * history instead of minting a new identity. Absent for work first stated
140
+ * through this command log.
141
+ */
142
+ imported?: {
143
+ rowId: number;
144
+ revision?: number;
145
+ createdAt?: number;
146
+ };
147
+ }
148
+ export interface ReviseWorkCommand extends WorkCommand {
149
+ commitmentId: string;
150
+ expectedRevision?: number;
151
+ set?: OwnerWorkPatch;
152
+ clear?: Array<keyof OwnerWorkPatch>;
153
+ }
154
+ export interface WithdrawWorkCommand extends WorkCommand {
155
+ commitmentId: string;
156
+ expectedRevision: number;
157
+ }
158
+ export interface WorkWriteResult {
159
+ commitmentId: string;
160
+ revision: number;
161
+ recordRef: WorkReference;
162
+ receipt: JudgmentReceipt;
163
+ }
164
+ /**
165
+ * Commit new owner work.
166
+ *
167
+ * The work and the record that states it commit together: `appendJudgment` owns
168
+ * the transaction, and this is the vocabulary in front of it. A caller that
169
+ * wrote a task row here and a record there is the split this replaces.
170
+ */
171
+ export declare function createWork(command: CreateWorkCommand, access: JudgmentAccess, options: JudgmentKnowledgeOptions): Promise<WorkWriteResult>;
172
+ /**
173
+ * Revise owner work at an expected revision.
174
+ *
175
+ * The revision is the caller's claim about what it read. A concurrent write
176
+ * moves it and this fails loudly rather than overwriting what the caller never
177
+ * saw - the same compare-and-set the ledger it replaces performed.
178
+ */
179
+ export declare function reviseWork(command: ReviseWorkCommand, access: JudgmentAccess, options: JudgmentKnowledgeOptions): Promise<WorkWriteResult>;
180
+ /**
181
+ * Withdraw owner work.
182
+ *
183
+ * Withdrawal is a revision like any other: the values stay readable and the
184
+ * commitment is marked. Nothing is deleted, so a withdrawn commitment can still
185
+ * answer what it held and who withdrew it.
186
+ */
187
+ export declare function withdrawWork(command: WithdrawWorkCommand, access: JudgmentAccess, options: JudgmentKnowledgeOptions): Promise<WorkWriteResult>;
188
+ //# sourceMappingURL=commitments.d.ts.map