@claudexor/daemon 3.25.1 → 4.0.1

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 (453) hide show
  1. package/dist/account-resets.d.ts +2 -2
  2. package/dist/account-resets.d.ts.map +1 -1
  3. package/dist/account-resets.js +15 -0
  4. package/dist/account-resets.js.map +1 -1
  5. package/dist/client.d.ts +25 -6
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +55 -51
  8. package/dist/client.js.map +1 -1
  9. package/dist/command-authority.d.ts +11 -8
  10. package/dist/command-authority.d.ts.map +1 -1
  11. package/dist/command-authority.js +5 -6
  12. package/dist/command-authority.js.map +1 -1
  13. package/dist/command-list-projection.d.ts +0 -1
  14. package/dist/command-list-projection.d.ts.map +1 -1
  15. package/dist/command-list-projection.js +0 -6
  16. package/dist/command-list-projection.js.map +1 -1
  17. package/dist/command-list-select.d.ts +0 -4
  18. package/dist/command-list-select.d.ts.map +1 -1
  19. package/dist/command-list-select.js +1 -115
  20. package/dist/command-list-select.js.map +1 -1
  21. package/dist/command-retention.d.ts +7 -19
  22. package/dist/command-retention.d.ts.map +1 -1
  23. package/dist/command-retention.js +1 -120
  24. package/dist/command-retention.js.map +1 -1
  25. package/dist/command-rpc.d.ts +4 -1
  26. package/dist/command-rpc.d.ts.map +1 -1
  27. package/dist/command-rpc.js +12 -1
  28. package/dist/command-rpc.js.map +1 -1
  29. package/dist/command-store.d.ts +15 -52
  30. package/dist/command-store.d.ts.map +1 -1
  31. package/dist/command-store.js +5 -493
  32. package/dist/command-store.js.map +1 -1
  33. package/dist/daemon-health.d.ts +56 -8
  34. package/dist/daemon-health.d.ts.map +1 -1
  35. package/dist/daemon-health.js +44 -9
  36. package/dist/daemon-health.js.map +1 -1
  37. package/dist/daemon-local-client.d.ts +28 -0
  38. package/dist/daemon-local-client.d.ts.map +1 -0
  39. package/dist/daemon-local-client.js +55 -0
  40. package/dist/daemon-local-client.js.map +1 -0
  41. package/dist/delivery-command.d.ts +4 -4
  42. package/dist/delivery-command.d.ts.map +1 -1
  43. package/dist/delivery-command.js.map +1 -1
  44. package/dist/index.d.ts +23 -8
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +25 -8
  47. package/dist/index.js.map +1 -1
  48. package/dist/interactions.d.ts +12 -28
  49. package/dist/interactions.d.ts.map +1 -1
  50. package/dist/interactions.js +22 -123
  51. package/dist/interactions.js.map +1 -1
  52. package/dist/job-admission.d.ts +26 -0
  53. package/dist/job-admission.d.ts.map +1 -0
  54. package/dist/job-admission.js +67 -0
  55. package/dist/job-admission.js.map +1 -0
  56. package/dist/journal-fold-policy.d.ts +1 -1
  57. package/dist/journal-fold-policy.d.ts.map +1 -1
  58. package/dist/journal-recovery-files.d.ts +1 -41
  59. package/dist/journal-recovery-files.d.ts.map +1 -1
  60. package/dist/journal-recovery-files.js +2 -340
  61. package/dist/journal-recovery-files.js.map +1 -1
  62. package/dist/loop-facts.d.ts +28 -0
  63. package/dist/loop-facts.d.ts.map +1 -0
  64. package/dist/loop-facts.js +97 -0
  65. package/dist/loop-facts.js.map +1 -0
  66. package/dist/memory-facts.d.ts +2 -0
  67. package/dist/memory-facts.d.ts.map +1 -1
  68. package/dist/memory-facts.js +5 -0
  69. package/dist/memory-facts.js.map +1 -1
  70. package/dist/model-operations.d.ts +11 -4
  71. package/dist/model-operations.d.ts.map +1 -1
  72. package/dist/model-operations.js +68 -38
  73. package/dist/model-operations.js.map +1 -1
  74. package/dist/operator-decisions.d.ts +15 -25
  75. package/dist/operator-decisions.d.ts.map +1 -1
  76. package/dist/operator-decisions.js +5 -84
  77. package/dist/operator-decisions.js.map +1 -1
  78. package/dist/projects.d.ts +42 -41
  79. package/dist/projects.d.ts.map +1 -1
  80. package/dist/projects.js +46 -184
  81. package/dist/projects.js.map +1 -1
  82. package/dist/quota-registry-replay.d.ts +2 -2
  83. package/dist/quota-registry-replay.d.ts.map +1 -1
  84. package/dist/quota-registry-replay.js.map +1 -1
  85. package/dist/quota-registry-support.d.ts +4 -1
  86. package/dist/quota-registry-support.d.ts.map +1 -1
  87. package/dist/quota-registry-support.js +15 -2
  88. package/dist/quota-registry-support.js.map +1 -1
  89. package/dist/quota-registry.d.ts +64 -2
  90. package/dist/quota-registry.d.ts.map +1 -1
  91. package/dist/quota-registry.js +10 -3
  92. package/dist/quota-registry.js.map +1 -1
  93. package/dist/quota-resources.d.ts +6 -3
  94. package/dist/quota-resources.d.ts.map +1 -1
  95. package/dist/quota-resources.js +25 -8
  96. package/dist/quota-resources.js.map +1 -1
  97. package/dist/runless-turn-recovery.d.ts +2 -9
  98. package/dist/runless-turn-recovery.d.ts.map +1 -1
  99. package/dist/runless-turn-recovery.js +0 -14
  100. package/dist/runless-turn-recovery.js.map +1 -1
  101. package/dist/server.d.ts +23 -22
  102. package/dist/server.d.ts.map +1 -1
  103. package/dist/server.js +74 -84
  104. package/dist/server.js.map +1 -1
  105. package/dist/store/blob-files.d.ts +71 -0
  106. package/dist/store/blob-files.d.ts.map +1 -0
  107. package/dist/store/blob-files.js +160 -0
  108. package/dist/store/blob-files.js.map +1 -0
  109. package/dist/store/command-prune.d.ts +37 -0
  110. package/dist/store/command-prune.d.ts.map +1 -0
  111. package/dist/store/command-prune.js +123 -0
  112. package/dist/store/command-prune.js.map +1 -0
  113. package/dist/store/command-queries.d.ts +41 -0
  114. package/dist/store/command-queries.d.ts.map +1 -0
  115. package/dist/store/command-queries.js +186 -0
  116. package/dist/store/command-queries.js.map +1 -0
  117. package/dist/store/command-rows.d.ts +66 -0
  118. package/dist/store/command-rows.d.ts.map +1 -0
  119. package/dist/store/command-rows.js +141 -0
  120. package/dist/store/command-rows.js.map +1 -0
  121. package/dist/store/commands.d.ts +49 -0
  122. package/dist/store/commands.d.ts.map +1 -0
  123. package/dist/store/commands.js +247 -0
  124. package/dist/store/commands.js.map +1 -0
  125. package/dist/store/cursors.d.ts +33 -0
  126. package/dist/store/cursors.d.ts.map +1 -0
  127. package/dist/store/cursors.js +82 -0
  128. package/dist/store/cursors.js.map +1 -0
  129. package/dist/store/engine-recovery-files.d.ts +14 -0
  130. package/dist/store/engine-recovery-files.d.ts.map +1 -0
  131. package/dist/store/engine-recovery-files.js +53 -0
  132. package/dist/store/engine-recovery-files.js.map +1 -0
  133. package/dist/store/engine-state-recovery.d.ts +71 -0
  134. package/dist/store/engine-state-recovery.d.ts.map +1 -0
  135. package/dist/store/engine-state-recovery.js +318 -0
  136. package/dist/store/engine-state-recovery.js.map +1 -0
  137. package/dist/store/errors.d.ts +80 -0
  138. package/dist/store/errors.d.ts.map +1 -0
  139. package/dist/store/errors.js +130 -0
  140. package/dist/store/errors.js.map +1 -0
  141. package/dist/store/event-store.d.ts +52 -0
  142. package/dist/store/event-store.d.ts.map +1 -0
  143. package/dist/store/event-store.js +117 -0
  144. package/dist/store/event-store.js.map +1 -0
  145. package/dist/store/external-files.d.ts +40 -0
  146. package/dist/store/external-files.d.ts.map +1 -0
  147. package/dist/store/external-files.js +90 -0
  148. package/dist/store/external-files.js.map +1 -0
  149. package/dist/store/flusher-protocol.d.ts +82 -0
  150. package/dist/store/flusher-protocol.d.ts.map +1 -0
  151. package/dist/store/flusher-protocol.js +23 -0
  152. package/dist/store/flusher-protocol.js.map +1 -0
  153. package/dist/store/flusher-worker.d.ts +24 -0
  154. package/dist/store/flusher-worker.d.ts.map +1 -0
  155. package/dist/store/flusher-worker.js +185 -0
  156. package/dist/store/flusher-worker.js.map +1 -0
  157. package/dist/store/flusher.d.ts +87 -0
  158. package/dist/store/flusher.d.ts.map +1 -0
  159. package/dist/store/flusher.js +264 -0
  160. package/dist/store/flusher.js.map +1 -0
  161. package/dist/store/generations.d.ts +43 -0
  162. package/dist/store/generations.d.ts.map +1 -0
  163. package/dist/store/generations.js +143 -0
  164. package/dist/store/generations.js.map +1 -0
  165. package/dist/store/idempotency.d.ts +25 -0
  166. package/dist/store/idempotency.d.ts.map +1 -0
  167. package/dist/store/idempotency.js +53 -0
  168. package/dist/store/idempotency.js.map +1 -0
  169. package/dist/store/import-context.d.ts +22 -0
  170. package/dist/store/import-context.d.ts.map +1 -0
  171. package/dist/store/import-context.js +87 -0
  172. package/dist/store/import-context.js.map +1 -0
  173. package/dist/store/import-discovery.d.ts +6 -0
  174. package/dist/store/import-discovery.d.ts.map +1 -0
  175. package/dist/store/import-discovery.js +66 -0
  176. package/dist/store/import-discovery.js.map +1 -0
  177. package/dist/store/import-records.d.ts +6 -0
  178. package/dist/store/import-records.d.ts.map +1 -0
  179. package/dist/store/import-records.js +191 -0
  180. package/dist/store/import-records.js.map +1 -0
  181. package/dist/store/import-resources.d.ts +14 -0
  182. package/dist/store/import-resources.d.ts.map +1 -0
  183. package/dist/store/import-resources.js +197 -0
  184. package/dist/store/import-resources.js.map +1 -0
  185. package/dist/store/import-source.d.ts +24 -0
  186. package/dist/store/import-source.d.ts.map +1 -0
  187. package/dist/store/import-source.js +65 -0
  188. package/dist/store/import-source.js.map +1 -0
  189. package/dist/store/import-verify.d.ts +6 -0
  190. package/dist/store/import-verify.d.ts.map +1 -0
  191. package/dist/store/import-verify.js +97 -0
  192. package/dist/store/import-verify.js.map +1 -0
  193. package/dist/store/import-worker.d.ts +18 -0
  194. package/dist/store/import-worker.d.ts.map +1 -0
  195. package/dist/store/import-worker.js +69 -0
  196. package/dist/store/import-worker.js.map +1 -0
  197. package/dist/store/importer.d.ts +42 -0
  198. package/dist/store/importer.d.ts.map +1 -0
  199. package/dist/store/importer.js +239 -0
  200. package/dist/store/importer.js.map +1 -0
  201. package/dist/store/interactions.d.ts +22 -0
  202. package/dist/store/interactions.d.ts.map +1 -0
  203. package/dist/store/interactions.js +82 -0
  204. package/dist/store/interactions.js.map +1 -0
  205. package/dist/store/legacy-journal/frame-codec.d.ts +94 -0
  206. package/dist/store/legacy-journal/frame-codec.d.ts.map +1 -0
  207. package/dist/store/legacy-journal/frame-codec.js +352 -0
  208. package/dist/store/legacy-journal/frame-codec.js.map +1 -0
  209. package/dist/store/legacy-journal/frame-reader.d.ts +30 -0
  210. package/dist/store/legacy-journal/frame-reader.d.ts.map +1 -0
  211. package/dist/store/legacy-journal/frame-reader.js +97 -0
  212. package/dist/store/legacy-journal/frame-reader.js.map +1 -0
  213. package/dist/store/legacy-journal/journal-fold.d.ts +47 -0
  214. package/dist/store/legacy-journal/journal-fold.d.ts.map +1 -0
  215. package/dist/store/legacy-journal/journal-fold.js +81 -0
  216. package/dist/store/legacy-journal/journal-fold.js.map +1 -0
  217. package/dist/store/legacy-journal/journal-partition.d.ts +2 -0
  218. package/dist/store/legacy-journal/journal-partition.d.ts.map +1 -0
  219. package/dist/store/legacy-journal/journal-partition.js +10 -0
  220. package/dist/store/legacy-journal/journal-partition.js.map +1 -0
  221. package/dist/store/legacy-journal/read-only-preparation.d.ts +48 -0
  222. package/dist/store/legacy-journal/read-only-preparation.d.ts.map +1 -0
  223. package/dist/store/legacy-journal/read-only-preparation.js +430 -0
  224. package/dist/store/legacy-journal/read-only-preparation.js.map +1 -0
  225. package/dist/store/maintenance-worker.d.ts +5 -0
  226. package/dist/store/maintenance-worker.d.ts.map +1 -0
  227. package/dist/store/maintenance-worker.js +175 -0
  228. package/dist/store/maintenance-worker.js.map +1 -0
  229. package/dist/store/maintenance.d.ts +124 -0
  230. package/dist/store/maintenance.d.ts.map +1 -0
  231. package/dist/store/maintenance.js +197 -0
  232. package/dist/store/maintenance.js.map +1 -0
  233. package/dist/store/mutation.d.ts +34 -0
  234. package/dist/store/mutation.d.ts.map +1 -0
  235. package/dist/store/mutation.js +85 -0
  236. package/dist/store/mutation.js.map +1 -0
  237. package/dist/store/obligations.d.ts +101 -0
  238. package/dist/store/obligations.d.ts.map +1 -0
  239. package/dist/store/obligations.js +226 -0
  240. package/dist/store/obligations.js.map +1 -0
  241. package/dist/store/operator-decisions.d.ts +23 -0
  242. package/dist/store/operator-decisions.d.ts.map +1 -0
  243. package/dist/store/operator-decisions.js +68 -0
  244. package/dist/store/operator-decisions.js.map +1 -0
  245. package/dist/store/owner-generations.d.ts +33 -0
  246. package/dist/store/owner-generations.d.ts.map +1 -0
  247. package/dist/store/owner-generations.js +63 -0
  248. package/dist/store/owner-generations.js.map +1 -0
  249. package/dist/store/partitions.d.ts +37 -0
  250. package/dist/store/partitions.d.ts.map +1 -0
  251. package/dist/store/partitions.js +68 -0
  252. package/dist/store/partitions.js.map +1 -0
  253. package/dist/store/pragmas.d.ts +32 -0
  254. package/dist/store/pragmas.d.ts.map +1 -0
  255. package/dist/store/pragmas.js +65 -0
  256. package/dist/store/pragmas.js.map +1 -0
  257. package/dist/store/project-router.d.ts +325 -0
  258. package/dist/store/project-router.d.ts.map +1 -0
  259. package/dist/store/project-router.js +298 -0
  260. package/dist/store/project-router.js.map +1 -0
  261. package/dist/store/projects.d.ts +36 -0
  262. package/dist/store/projects.d.ts.map +1 -0
  263. package/dist/store/projects.js +238 -0
  264. package/dist/store/projects.js.map +1 -0
  265. package/dist/store/publish-blob.d.ts +20 -0
  266. package/dist/store/publish-blob.d.ts.map +1 -0
  267. package/dist/store/publish-blob.js +158 -0
  268. package/dist/store/publish-blob.js.map +1 -0
  269. package/dist/store/purge-files.d.ts +30 -0
  270. package/dist/store/purge-files.d.ts.map +1 -0
  271. package/dist/store/purge-files.js +79 -0
  272. package/dist/store/purge-files.js.map +1 -0
  273. package/dist/store/resource-rows.d.ts +40 -0
  274. package/dist/store/resource-rows.d.ts.map +1 -0
  275. package/dist/store/resource-rows.js +103 -0
  276. package/dist/store/resource-rows.js.map +1 -0
  277. package/dist/store/resources.d.ts +67 -0
  278. package/dist/store/resources.d.ts.map +1 -0
  279. package/dist/store/resources.js +147 -0
  280. package/dist/store/resources.js.map +1 -0
  281. package/dist/store/retention.d.ts +95 -0
  282. package/dist/store/retention.d.ts.map +1 -0
  283. package/dist/store/retention.js +173 -0
  284. package/dist/store/retention.js.map +1 -0
  285. package/dist/store/run-events.d.ts +14 -0
  286. package/dist/store/run-events.d.ts.map +1 -0
  287. package/dist/store/run-events.js +35 -0
  288. package/dist/store/run-events.js.map +1 -0
  289. package/dist/store/runtime.d.ts +24 -0
  290. package/dist/store/runtime.d.ts.map +1 -0
  291. package/dist/store/runtime.js +67 -0
  292. package/dist/store/runtime.js.map +1 -0
  293. package/dist/store/schema.d.ts +33 -0
  294. package/dist/store/schema.d.ts.map +1 -0
  295. package/dist/store/schema.js +187 -0
  296. package/dist/store/schema.js.map +1 -0
  297. package/dist/store/setup-bindings.d.ts +20 -0
  298. package/dist/store/setup-bindings.d.ts.map +1 -0
  299. package/dist/store/setup-bindings.js +52 -0
  300. package/dist/store/setup-bindings.js.map +1 -0
  301. package/dist/store/sql-command-router.d.ts +79 -0
  302. package/dist/store/sql-command-router.d.ts.map +1 -0
  303. package/dist/store/sql-command-router.js +92 -0
  304. package/dist/store/sql-command-router.js.map +1 -0
  305. package/dist/store/sql-daemon-services.d.ts +61 -0
  306. package/dist/store/sql-daemon-services.d.ts.map +1 -0
  307. package/dist/store/sql-daemon-services.js +124 -0
  308. package/dist/store/sql-daemon-services.js.map +1 -0
  309. package/dist/store/sql-recovery-export.d.ts +8 -0
  310. package/dist/store/sql-recovery-export.d.ts.map +1 -0
  311. package/dist/store/sql-recovery-export.js +110 -0
  312. package/dist/store/sql-recovery-export.js.map +1 -0
  313. package/dist/store/sql-recovery-inspection.d.ts +22 -0
  314. package/dist/store/sql-recovery-inspection.d.ts.map +1 -0
  315. package/dist/store/sql-recovery-inspection.js +88 -0
  316. package/dist/store/sql-recovery-inspection.js.map +1 -0
  317. package/dist/store/sql-recovery.d.ts +69 -0
  318. package/dist/store/sql-recovery.d.ts.map +1 -0
  319. package/dist/store/sql-recovery.js +169 -0
  320. package/dist/store/sql-recovery.js.map +1 -0
  321. package/dist/store/sql-validation.d.ts +9 -0
  322. package/dist/store/sql-validation.d.ts.map +1 -0
  323. package/dist/store/sql-validation.js +103 -0
  324. package/dist/store/sql-validation.js.map +1 -0
  325. package/dist/store/statement-observer.d.ts +7 -0
  326. package/dist/store/statement-observer.d.ts.map +1 -0
  327. package/dist/store/statement-observer.js +44 -0
  328. package/dist/store/statement-observer.js.map +1 -0
  329. package/dist/store/store.d.ts +110 -0
  330. package/dist/store/store.d.ts.map +1 -0
  331. package/dist/store/store.js +296 -0
  332. package/dist/store/store.js.map +1 -0
  333. package/dist/store/terminal-files.d.ts +21 -0
  334. package/dist/store/terminal-files.d.ts.map +1 -0
  335. package/dist/store/terminal-files.js +115 -0
  336. package/dist/store/terminal-files.js.map +1 -0
  337. package/dist/store/thread-replay.d.ts +12 -0
  338. package/dist/store/thread-replay.d.ts.map +1 -0
  339. package/dist/store/thread-replay.js +49 -0
  340. package/dist/store/thread-replay.js.map +1 -0
  341. package/dist/store/thread-rows.d.ts +25 -0
  342. package/dist/store/thread-rows.d.ts.map +1 -0
  343. package/dist/store/thread-rows.js +141 -0
  344. package/dist/store/thread-rows.js.map +1 -0
  345. package/dist/store/threads.d.ts +105 -0
  346. package/dist/store/threads.d.ts.map +1 -0
  347. package/dist/store/threads.js +423 -0
  348. package/dist/store/threads.js.map +1 -0
  349. package/dist/store/upload-binding-retention.d.ts +26 -0
  350. package/dist/store/upload-binding-retention.d.ts.map +1 -0
  351. package/dist/store/upload-binding-retention.js +142 -0
  352. package/dist/store/upload-binding-retention.js.map +1 -0
  353. package/dist/store/uploads.d.ts +30 -0
  354. package/dist/store/uploads.d.ts.map +1 -0
  355. package/dist/store/uploads.js +238 -0
  356. package/dist/store/uploads.js.map +1 -0
  357. package/dist/store-contracts.d.ts +181 -0
  358. package/dist/store-contracts.d.ts.map +1 -0
  359. package/dist/store-contracts.js +2 -0
  360. package/dist/store-contracts.js.map +1 -0
  361. package/dist/terminal-authority.d.ts +9 -0
  362. package/dist/terminal-authority.d.ts.map +1 -1
  363. package/dist/terminal-authority.js +103 -1
  364. package/dist/terminal-authority.js.map +1 -1
  365. package/dist/thread-lane-checkpoints.d.ts +0 -2
  366. package/dist/thread-lane-checkpoints.d.ts.map +1 -1
  367. package/dist/thread-lane-checkpoints.js +0 -4
  368. package/dist/thread-lane-checkpoints.js.map +1 -1
  369. package/dist/thread-store-support.d.ts +1 -27
  370. package/dist/thread-store-support.d.ts.map +1 -1
  371. package/dist/thread-store-support.js +0 -63
  372. package/dist/thread-store-support.js.map +1 -1
  373. package/dist/threads.d.ts +1 -113
  374. package/dist/threads.d.ts.map +1 -1
  375. package/dist/threads.js +1 -379
  376. package/dist/threads.js.map +1 -1
  377. package/package.json +9 -7
  378. package/dist/command-activity.d.ts +0 -14
  379. package/dist/command-activity.d.ts.map +0 -1
  380. package/dist/command-activity.js +0 -16
  381. package/dist/command-activity.js.map +0 -1
  382. package/dist/journal-events.d.ts +0 -4
  383. package/dist/journal-events.d.ts.map +0 -1
  384. package/dist/journal-events.js +0 -23
  385. package/dist/journal-events.js.map +0 -1
  386. package/dist/journal-maintenance.d.ts +0 -50
  387. package/dist/journal-maintenance.d.ts.map +0 -1
  388. package/dist/journal-maintenance.js +0 -162
  389. package/dist/journal-maintenance.js.map +0 -1
  390. package/dist/journal-manager-journal.d.ts +0 -18
  391. package/dist/journal-manager-journal.d.ts.map +0 -1
  392. package/dist/journal-manager-journal.js +0 -25
  393. package/dist/journal-manager-journal.js.map +0 -1
  394. package/dist/journal-manager-lifecycle.d.ts +0 -11
  395. package/dist/journal-manager-lifecycle.d.ts.map +0 -1
  396. package/dist/journal-manager-lifecycle.js +0 -2
  397. package/dist/journal-manager-lifecycle.js.map +0 -1
  398. package/dist/journal-manager.d.ts +0 -99
  399. package/dist/journal-manager.d.ts.map +0 -1
  400. package/dist/journal-manager.js +0 -559
  401. package/dist/journal-manager.js.map +0 -1
  402. package/dist/journal-prepared-operation.d.ts +0 -53
  403. package/dist/journal-prepared-operation.d.ts.map +0 -1
  404. package/dist/journal-prepared-operation.js +0 -158
  405. package/dist/journal-prepared-operation.js.map +0 -1
  406. package/dist/journal-projection-slot.d.ts +0 -28
  407. package/dist/journal-projection-slot.d.ts.map +0 -1
  408. package/dist/journal-projection-slot.js +0 -71
  409. package/dist/journal-projection-slot.js.map +0 -1
  410. package/dist/journal-projection.d.ts +0 -13
  411. package/dist/journal-projection.d.ts.map +0 -1
  412. package/dist/journal-projection.js +0 -2
  413. package/dist/journal-projection.js.map +0 -1
  414. package/dist/partition-accounts.d.ts +0 -27
  415. package/dist/partition-accounts.d.ts.map +0 -1
  416. package/dist/partition-accounts.js +0 -21
  417. package/dist/partition-accounts.js.map +0 -1
  418. package/dist/project-partition-preparation.d.ts +0 -87
  419. package/dist/project-partition-preparation.d.ts.map +0 -1
  420. package/dist/project-partition-preparation.js +0 -273
  421. package/dist/project-partition-preparation.js.map +0 -1
  422. package/dist/project-partitions.d.ts +0 -214
  423. package/dist/project-partitions.d.ts.map +0 -1
  424. package/dist/project-partitions.js +0 -486
  425. package/dist/project-partitions.js.map +0 -1
  426. package/dist/project-remove.d.ts +0 -11
  427. package/dist/project-remove.d.ts.map +0 -1
  428. package/dist/project-remove.js +0 -65
  429. package/dist/project-remove.js.map +0 -1
  430. package/dist/project-thread-listing.d.ts +0 -14
  431. package/dist/project-thread-listing.d.ts.map +0 -1
  432. package/dist/project-thread-listing.js +0 -37
  433. package/dist/project-thread-listing.js.map +0 -1
  434. package/dist/quota-projection.d.ts +0 -11
  435. package/dist/quota-projection.d.ts.map +0 -1
  436. package/dist/quota-projection.js +0 -10
  437. package/dist/quota-projection.js.map +0 -1
  438. package/dist/resource-store.d.ts +0 -39
  439. package/dist/resource-store.d.ts.map +0 -1
  440. package/dist/resource-store.js +0 -464
  441. package/dist/resource-store.js.map +0 -1
  442. package/dist/run-event-terminal-index.d.ts +0 -13
  443. package/dist/run-event-terminal-index.d.ts.map +0 -1
  444. package/dist/run-event-terminal-index.js +0 -38
  445. package/dist/run-event-terminal-index.js.map +0 -1
  446. package/dist/run-events.d.ts +0 -17
  447. package/dist/run-events.d.ts.map +0 -1
  448. package/dist/run-events.js +0 -31
  449. package/dist/run-events.js.map +0 -1
  450. package/dist/thread-head-ping.d.ts +0 -35
  451. package/dist/thread-head-ping.d.ts.map +0 -1
  452. package/dist/thread-head-ping.js +0 -67
  453. package/dist/thread-head-ping.js.map +0 -1
@@ -0,0 +1,160 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { StoreError } from "./errors.js";
5
+ import { linkExternalFile, writeExternalFile } from "./external-files.js";
6
+ import { requireTransaction } from "./mutation.js";
7
+ /** Bodies up to this size are stored inline in `blob.inline`; larger bodies are files. */
8
+ export const INLINE_BODY_MAX_BYTES = 64 * 1024;
9
+ /**
10
+ * Every row that can own a blob (SYNTHESIS_R5 §6.5). The GC recheck and the
11
+ * orphan sweep both ask this exact question so a file can only be removed
12
+ * when no index of any table points at its digest. `?1` is the bare hex digest.
13
+ */
14
+ export const BLOB_OWNER_PREDICATE = `EXISTS(SELECT 1 FROM command WHERE params_sha = ?1)
15
+ OR EXISTS(SELECT 1 FROM command WHERE result_sha = ?1)
16
+ OR EXISTS(SELECT 1 FROM turn WHERE prompt_sha = ?1)
17
+ OR EXISTS(SELECT 1 FROM event WHERE payload_sha = ?1)
18
+ OR EXISTS(SELECT 1 FROM resource WHERE sha256 = ?1 AND state IN ('publishing', 'ready'))
19
+ OR EXISTS(SELECT 1 FROM upload WHERE finalize_sha = ?1)
20
+ OR EXISTS(SELECT 1 FROM effect_obligation WHERE kind = 'publish_blob'
21
+ AND json_extract(CAST(payload AS TEXT), '$.sha') = ?1)`;
22
+ export const BLOB_OWNER_SQL = `SELECT (${BLOB_OWNER_PREDICATE}) AS owned`;
23
+ /** Inline bytes and their final reference disappear in one durable prefix. */
24
+ export function deleteUnownedInlineInTx(sql, sha256) {
25
+ requireTransaction(sql);
26
+ sql
27
+ .prepare(`DELETE FROM blob WHERE sha256 = ?1 AND inline IS NOT NULL AND NOT (${BLOB_OWNER_PREDICATE})`)
28
+ .run(sha256);
29
+ }
30
+ export function sha256Hex(bytes) {
31
+ return createHash("sha256").update(bytes).digest("hex");
32
+ }
33
+ /**
34
+ * Content-addressed bodies: `resource-store/blobs/<sha256>` for anything above
35
+ * 64 KiB, written synchronously on the request thread in the same tick as the
36
+ * owning transaction (temp `O_DSYNC` + rename, never rewriting an existing
37
+ * file), then the `blob` row plus the owner's reference row commit together.
38
+ * The store owns the shared owner generations the GC is bound to.
39
+ */
40
+ export class BlobFiles {
41
+ store;
42
+ dir;
43
+ /** Owner-change generations shared with the sweep (R5_AMENDMENTS A3/C10). */
44
+ owners;
45
+ constructor(store, dir = store.paths.blobs) {
46
+ this.store = store;
47
+ this.dir = dir;
48
+ this.owners = store.owners;
49
+ }
50
+ /** Before the owning transaction (same tick): hash, and write the file if the body is large.
51
+ * "Already present" is decided by the FILE, never by the `blob` row (C3). */
52
+ prepareBody(bytes) {
53
+ const sha256 = sha256Hex(bytes);
54
+ if (bytes.byteLength <= INLINE_BODY_MAX_BYTES) {
55
+ return {
56
+ sha256,
57
+ size: bytes.byteLength,
58
+ inline: Buffer.from(bytes),
59
+ file: null,
60
+ generation: null,
61
+ };
62
+ }
63
+ const receipt = writeExternalFile(this.store, {
64
+ dir: this.dir,
65
+ name: sha256,
66
+ bytes,
67
+ keepExisting: true,
68
+ });
69
+ return {
70
+ sha256,
71
+ size: bytes.byteLength,
72
+ inline: null,
73
+ file: receipt.path,
74
+ generation: receipt.generation,
75
+ };
76
+ }
77
+ /** Inside the owning transaction: the `blob` row (idempotent per digest). */
78
+ insertRow(ref) {
79
+ if (!this.store.inTransaction)
80
+ throw new Error("blob rows are inserted inside the owner's transaction");
81
+ this.store
82
+ .prepare("INSERT OR IGNORE INTO blob(sha256, size, inline) VALUES(?, ?, ?)")
83
+ .run(ref.sha256, ref.size, ref.inline);
84
+ }
85
+ /** The body bytes, verified against the digest; inline wins, else the file. */
86
+ read(sha256) {
87
+ const row = this.store.prepare("SELECT size, inline FROM blob WHERE sha256 = ?").get(sha256);
88
+ if (!row)
89
+ throw new StoreError("blob_not_found", 404, false, `no blob ${sha256}`);
90
+ const bytes = row.inline ? Buffer.from(row.inline) : this.readFile(sha256);
91
+ if (bytes.byteLength !== Number(row.size) || sha256Hex(bytes) !== sha256) {
92
+ throw new StoreError("blob_digest_mismatch", 409, false, `blob ${sha256} does not match its digest`);
93
+ }
94
+ return bytes;
95
+ }
96
+ filePath(sha256) {
97
+ if (!/^[0-9a-f]{64}$/.test(sha256)) {
98
+ throw new StoreError("blob_digest_mismatch", 409, false, "blob digest is not a hex sha256");
99
+ }
100
+ return join(this.dir, sha256);
101
+ }
102
+ /** Finalize publication (SYNTHESIS_R5 §6.4): hard-link the part into the blob store (EEXIST = present). */
103
+ publishLink(sourcePath, sha256) {
104
+ const path = this.filePath(sha256);
105
+ // Restart may find the published blob after its redundant part was removed.
106
+ if (existsSync(path))
107
+ return { path, generation: this.store.registerExternal(this.dir), linked: false };
108
+ const receipt = linkExternalFile(this.store, {
109
+ source: sourcePath,
110
+ dir: this.dir,
111
+ name: path.slice(this.dir.length + 1),
112
+ });
113
+ return { path: receipt.path, generation: receipt.generation, linked: receipt.written };
114
+ }
115
+ /** Is any row still pointing at this digest? (the exact question the sweep asks too) */
116
+ owned(sha256) {
117
+ const row = this.store.prepare(BLOB_OWNER_SQL).get(sha256);
118
+ return Number(row.owned) === 1;
119
+ }
120
+ /**
121
+ * Right after the COMMIT of a transaction that inserted, released or changed
122
+ * a reference to the digest (publication, prune, event delete, releaseModel,
123
+ * upload discard, publish_blob removal): the GC is bound to this generation.
124
+ */
125
+ noteOwnerChange(sha256) {
126
+ return this.owners.noteChange(`blob:${sha256}`);
127
+ }
128
+ /**
129
+ * GC (A3/C3/C10): wait for the barrier of the LATEST known owner change,
130
+ * then in ONE synchronous section re-check newer changes and every reverse
131
+ * index; at zero owners unlink the file (ENOENT = already gone) and delete
132
+ * the file-mode `blob` row. One flight per digest; concurrent callers join.
133
+ */
134
+ gc(sha256) {
135
+ const path = this.filePath(sha256);
136
+ return this.owners.unlinkWhenUnowned(`blob:${sha256}`, {
137
+ path,
138
+ owners: () => this.owned(sha256),
139
+ afterUnlink: () => {
140
+ this.store.transaction(() => {
141
+ this.store.prepare("DELETE FROM blob WHERE sha256 = ? AND inline IS NULL").run(sha256);
142
+ });
143
+ this.store.registerExternal(this.dir);
144
+ },
145
+ });
146
+ }
147
+ readFile(sha256) {
148
+ const path = this.filePath(sha256);
149
+ try {
150
+ return readFileSync(path);
151
+ }
152
+ catch (error) {
153
+ if (error.code === "ENOENT") {
154
+ throw new StoreError("blob_unavailable", 409, false, `blob file ${sha256} is missing`);
155
+ }
156
+ throw error;
157
+ }
158
+ }
159
+ }
160
+ //# sourceMappingURL=blob-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-files.js","sourceRoot":"","sources":["../../src/store/blob-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAwB,MAAM,eAAe,CAAC;AAIzE,0FAA0F;AAC1F,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,CAAC;AAa/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;mEAO+B,CAAC;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,oBAAoB,YAAY,CAAC;AAE1E,8EAA8E;AAC9E,MAAM,UAAU,uBAAuB,CAAC,GAAoB,EAAE,MAAc;IAC1E,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,GAAG;SACA,OAAO,CACN,sEAAsE,oBAAoB,GAAG,CAC9F;SACA,GAAG,CAAC,MAAM,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAiB;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAID;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;IAMD,KAAK;IALf,GAAG,CAAS;IACrB,6EAA6E;IACpE,MAAM,CAAmB;IAElC,YACmB,KAAkB,EACnC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK;qBADN,KAAK;QAGtB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED;iFAC6E;IAC7E,WAAW,CAAC,KAAiB;QAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,KAAK,CAAC,UAAU,IAAI,qBAAqB,EAAE,CAAC;YAC9C,OAAO;gBACL,MAAM;gBACN,IAAI,EAAE,KAAK,CAAC,UAAU;gBACtB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC1B,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE;YAC5C,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,MAAM;YACZ,KAAK;YACL,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,OAAO;YACL,MAAM;YACN,IAAI,EAAE,KAAK,CAAC,UAAU;YACtB,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,SAAS,CAAC,GAAY;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa;YAC3B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK;aACP,OAAO,CAAC,kEAAkE,CAAC;aAC3E,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,+EAA+E;IAC/E,IAAI,CAAC,MAAc;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,CAAC,MAAM,CACzB,CAAC;QACnE,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,MAAM,EAAE,CAAC,CAAC;QAClF,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,MAAM,EAAE,CAAC;YACzE,MAAM,IAAI,UAAU,CAClB,sBAAsB,EACtB,GAAG,EACH,KAAK,EACL,QAAQ,MAAM,4BAA4B,CAC3C,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,UAAU,CAAC,sBAAsB,EAAE,GAAG,EAAE,KAAK,EAAE,iCAAiC,CAAC,CAAC;QAC9F,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,2GAA2G;IAC3G,WAAW,CACT,UAAkB,EAClB,MAAc;QAEd,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,4EAA4E;QAC5E,IAAI,UAAU,CAAC,IAAI,CAAC;YAClB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACpF,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE;YAC3C,MAAM,EAAE,UAAU;YAClB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;SACtC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IACzF,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,MAAc;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,MAAM,CAA+B,CAAC;QACzF,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,MAAc;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACH,EAAE,CAAC,MAAc;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,MAAM,EAAE,EAAE;YACrD,IAAI;YACJ,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAChC,WAAW,EAAE,GAAG,EAAE;gBAChB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;oBAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACzF,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,MAAc;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,MAAM,aAAa,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ import { retainedEnvelopeOfRun } from "@claudexor/workspace";
2
+ import type { BlobFiles } from "./blob-files.js";
3
+ import { type SqlWriteContext } from "./mutation.js";
4
+ import type { EngineStore } from "./store.js";
5
+ type PruneRow = {
6
+ id: string;
7
+ pid: number;
8
+ run_id: string | null;
9
+ scope_root: string | null;
10
+ params_sha: string;
11
+ result_sha: string | null;
12
+ };
13
+ /** Remove decisions and their bindings/events atomically; conversation turns
14
+ * remain retained and therefore keep their independent turn bindings. Return
15
+ * released digests for the caller's final, pre-COMMIT owner cleanup. */
16
+ export declare function applyCommandPruneInTx(sql: SqlWriteContext, rows: readonly PruneRow[]): string[];
17
+ /** At most one batch per admission/terminal, over the global live command set.
18
+ * File GC is asynchronous and uses the existing shared C10 owner generations. */
19
+ export declare class SqlCommandPruner {
20
+ private readonly store;
21
+ private readonly blobs;
22
+ private readonly options;
23
+ private eventCursor;
24
+ constructor(store: EngineStore, blobs: BlobFiles, options?: {
25
+ log?: (message: string) => void;
26
+ retainedEnvelope?: typeof retainedEnvelopeOfRun;
27
+ });
28
+ pruneHistory(cap: number, retentionMs: number, now: number): string[];
29
+ prune(ids: readonly string[], pid?: number): void;
30
+ /** A bounded keyset scan of aged command copies. The cursor is disposable
31
+ * scan progress, not retention authority; every decision rechecks the command
32
+ * kind. This avoids rescanning exempt product history on every pass. */
33
+ private pruneReceiptEvents;
34
+ private collect;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=command-prune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-prune.d.ts","sourceRoot":"","sources":["../../src/store/command-prune.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAmC,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAMtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,KAAK,QAAQ,GAAG;IACd,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF;;wEAEwE;AACxE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,EAAE,CAkC/F;AAED;iFACiF;AACjF,qBAAa,gBAAgB;IAGzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJ1B,OAAO,CAAC,WAAW,CAAgC;IACnD,YACmB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE;QACxB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,gBAAgB,CAAC,EAAE,OAAO,qBAAqB,CAAC;KAC5C,EACJ;IAEJ,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBpE;IAED,KAAK,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAchD;IAED;;4EAEwE;IACxE,OAAO,CAAC,kBAAkB;IAiD1B,OAAO,CAAC,OAAO;CAGhB"}
@@ -0,0 +1,123 @@
1
+ import { retainedEnvelopeOfRun } from "@claudexor/workspace";
2
+ import { deleteTargetIdempotencyInTx } from "./idempotency.js";
3
+ import { requireTransaction, runMutation } from "./mutation.js";
4
+ import { commandRetentionCandidates, deleteEventKeysInTx, COMMAND_RETENTION_BATCH, } from "./retention.js";
5
+ import { collectReleasedBodies } from "./event-store.js";
6
+ /** Remove decisions and their bindings/events atomically; conversation turns
7
+ * remain retained and therefore keep their independent turn bindings. Return
8
+ * released digests for the caller's final, pre-COMMIT owner cleanup. */
9
+ export function applyCommandPruneInTx(sql, rows) {
10
+ requireTransaction(sql);
11
+ const released = [];
12
+ for (const row of rows) {
13
+ const keys = [`c:${row.id}:a`, `c:${row.id}:u`];
14
+ if (row.run_id) {
15
+ keys.push(`r:${row.run_id}:c`, `r:${row.run_id}:live`, `r:${row.run_id}:t`, `d:${row.run_id}`);
16
+ const interactions = sql
17
+ .prepare("DELETE FROM interaction WHERE run_id=? AND pid=? RETURNING id")
18
+ .all(row.run_id, row.pid);
19
+ for (const interaction of interactions)
20
+ keys.push(`i:${row.run_id}:${interaction.id.slice(row.run_id.length + 1)}`);
21
+ sql
22
+ .prepare("DELETE FROM operator_decision WHERE run_id=? AND pid=?")
23
+ .run(row.run_id, row.pid);
24
+ sql.prepare("DELETE FROM run_terminal WHERE run_id=? AND pid=?").run(row.run_id, row.pid);
25
+ sql
26
+ .prepare("DELETE FROM effect_obligation WHERE kind='terminal_files' AND key=? AND pid=?")
27
+ .run(row.run_id, row.pid);
28
+ deleteTargetIdempotencyInTx(sql, "decision", row.pid, row.run_id);
29
+ }
30
+ released.push(...deleteEventKeysInTx(sql, row.pid, keys), row.params_sha);
31
+ if (row.result_sha)
32
+ released.push(row.result_sha);
33
+ deleteTargetIdempotencyInTx(sql, "command", row.pid, row.id);
34
+ sql.prepare("DELETE FROM command WHERE id=? AND pid=?").run(row.id, row.pid);
35
+ if (row.scope_root)
36
+ sql.prepare("INSERT OR IGNORE INTO pruned_root(root) VALUES(?)").run(row.scope_root);
37
+ }
38
+ return released;
39
+ }
40
+ /** At most one batch per admission/terminal, over the global live command set.
41
+ * File GC is asynchronous and uses the existing shared C10 owner generations. */
42
+ export class SqlCommandPruner {
43
+ store;
44
+ blobs;
45
+ options;
46
+ eventCursor = { time: "", pid: 0, seq: 0 };
47
+ constructor(store, blobs, options = {}) {
48
+ this.store = store;
49
+ this.blobs = blobs;
50
+ this.options = options;
51
+ }
52
+ pruneHistory(cap, retentionMs, now) {
53
+ const selection = commandRetentionCandidates(this.store, {
54
+ now: new Date(now),
55
+ retentionMs,
56
+ cap,
57
+ exempt: (candidate) => !!(candidate.runDir &&
58
+ candidate.runId &&
59
+ (this.options.retainedEnvelope ?? retainedEnvelopeOfRun)(candidate.runDir, candidate.runId)),
60
+ });
61
+ this.prune(selection.victims.map((row) => row.id));
62
+ this.pruneReceiptEvents(now);
63
+ return selection.victims.map((row) => row.id);
64
+ }
65
+ prune(ids, pid) {
66
+ if (ids.length === 0)
67
+ return;
68
+ const rows = this.store
69
+ .prepare(`SELECT id,pid,run_id,scope_root,params_sha,result_sha FROM command
70
+ WHERE id IN (SELECT value FROM json_each(?))${pid === undefined ? "" : " AND pid=?"}`)
71
+ .all(JSON.stringify(ids), ...(pid === undefined ? [] : [pid]));
72
+ const released = runMutation(this.store, (tx) => {
73
+ const digests = applyCommandPruneInTx(tx, rows);
74
+ tx.changes.blobChanged(...digests);
75
+ return digests;
76
+ });
77
+ this.collect(released);
78
+ }
79
+ /** A bounded keyset scan of aged command copies. The cursor is disposable
80
+ * scan progress, not retention authority; every decision rechecks the command
81
+ * kind. This avoids rescanning exempt product history on every pass. */
82
+ pruneReceiptEvents(now) {
83
+ const cursor = this.eventCursor;
84
+ const rows = this.store
85
+ .prepare(`SELECT pid,seq,time,slot_key,group_key FROM event INDEXED BY event_command_age
86
+ WHERE type IN ('command.accepted','command.updated') AND time <= ?
87
+ AND (time,pid,seq) > (?,?,?) ORDER BY time,pid,seq LIMIT ?`)
88
+ .all(new Date(now - 30 * 24 * 60 * 60 * 1000).toISOString(), cursor.time, cursor.pid, cursor.seq, COMMAND_RETENTION_BATCH);
89
+ if (rows.length === 0) {
90
+ this.eventCursor = { time: "", pid: 0, seq: 0 };
91
+ return;
92
+ }
93
+ const released = runMutation(this.store, (tx) => {
94
+ const digests = [];
95
+ for (const row of rows) {
96
+ const key = row.slot_key ?? row.group_key;
97
+ if (!key)
98
+ continue;
99
+ const owner = tx
100
+ .prepare("SELECT kind FROM command WHERE id=? AND pid=? AND live=1")
101
+ .get(key.slice(2, -2), row.pid);
102
+ if (owner?.kind !== "model" && owner?.kind !== "account_reset")
103
+ continue;
104
+ const deleted = tx
105
+ .prepare("DELETE FROM event WHERE pid=? AND seq=? RETURNING payload_sha")
106
+ .get(row.pid, row.seq);
107
+ if (deleted?.payload_sha)
108
+ digests.push(deleted.payload_sha);
109
+ }
110
+ tx.changes.blobChanged(...digests);
111
+ const last = rows[rows.length - 1];
112
+ tx.changes.afterCommit(() => {
113
+ this.eventCursor = { time: last.time, pid: last.pid, seq: last.seq };
114
+ });
115
+ return digests;
116
+ });
117
+ this.collect(released);
118
+ }
119
+ collect(digests) {
120
+ collectReleasedBodies(this.store, this.blobs, digests, this.options.log);
121
+ }
122
+ }
123
+ //# sourceMappingURL=command-prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-prune.js","sourceRoot":"","sources":["../../src/store/command-prune.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type CommandListQuery } from "@claudexor/schema";
2
+ import { type JobRecord } from "../job-record.js";
3
+ import type { CommandQueries } from "../store-contracts.js";
4
+ import type { BlobFiles } from "./blob-files.js";
5
+ import { type MaintenanceCommandSummary } from "./command-rows.js";
6
+ import type { EngineStore } from "./store.js";
7
+ /** Exact resource custody, distinct from the existence of a historical receipt. */
8
+ export interface ModelResourceQueries {
9
+ expiredResponses(now: string): string[];
10
+ nextResponseExpiry(): string | null;
11
+ retainsResourceBytes(resourceId: string, now: string): boolean;
12
+ hasTerminalResourceReceipt(resourceId: string): boolean;
13
+ responsesForResource(resourceId: string): JobRecord[];
14
+ }
15
+ export declare const MODEL_RETAINS_RESOURCE_SQL = "SELECT (\n EXISTS(SELECT 1 FROM command INDEXED BY command_request_resource WHERE request_resource_id = ?1\n AND kind = 'model' AND live = 1 AND state IN ('queued','running'))\n OR EXISTS(SELECT 1 FROM command INDEXED BY command_response_resource WHERE response_resource_id = ?1\n AND kind = 'model' AND live = 1 AND response_state = 'ready' AND response_expires_at > ?2)) AS owned";
16
+ export declare const MODEL_TERMINAL_RESOURCE_SQL = "SELECT (\n EXISTS(SELECT 1 FROM command INDEXED BY command_request_resource WHERE request_resource_id = ?1\n AND kind = 'model' AND live = 1 AND state NOT IN ('queued','running'))\n OR EXISTS(SELECT 1 FROM command INDEXED BY command_response_resource WHERE response_resource_id = ?1\n AND kind = 'model' AND live = 1 AND state NOT IN ('queued','running'))) AS bound";
17
+ /** Every collection selects compact rows through an address or keyset page.
18
+ * Only id/turn detail and getByRunId hydrate the selected full record. */
19
+ export declare class SqlCommandQueries implements CommandQueries, ModelResourceQueries {
20
+ private readonly store;
21
+ private readonly blobs;
22
+ constructor(store: EngineStore, blobs: BlobFiles);
23
+ getByRunId(runId: string): JobRecord | undefined;
24
+ select(query: CommandListQuery): JobRecord[];
25
+ publicList(query: CommandListQuery): JobRecord[];
26
+ active(): JobRecord[];
27
+ count(): number;
28
+ /** Newest retained operations for this harness, without params/result bodies. */
29
+ maintenanceForHarness(harness: string): MaintenanceCommandSummary[];
30
+ expiredResponses(now: string): string[];
31
+ nextResponseExpiry(): string | null;
32
+ retainsResourceBytes(resourceId: string, now: string): boolean;
33
+ hasTerminalResourceReceipt(resourceId: string): boolean;
34
+ /** Address only this resource's receipts, including persisted expiry after cleanup failed. */
35
+ responsesForResource(resourceId: string): JobRecord[];
36
+ private detail;
37
+ private selectRows;
38
+ private byIds;
39
+ private rows;
40
+ }
41
+ //# sourceMappingURL=command-queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-queries.d.ts","sourceRoot":"","sources":["../../src/store/command-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE9F,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAIL,KAAK,yBAAyB,EAC/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAW9C,mFAAmF;AACnF,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxC,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAAC;IACpC,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/D,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IACxD,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;CACvD;AAED,eAAO,MAAM,0BAA0B,0YAIkE,CAAC;AAE1G,eAAO,MAAM,2BAA2B,0XAI6C,CAAC;AAEtF;0EAC0E;AAC1E,qBAAa,iBAAkB,YAAW,cAAc,EAAE,oBAAoB;IAE1E,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFxB,YACmB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,SAAS,EAC/B;IAEJ,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAG/C;IAED,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EAAE,CAE3C;IAED,UAAU,CAAC,KAAK,EAAE,gBAAgB,GAAG,SAAS,EAAE,CAE/C;IAED,MAAM,IAAI,SAAS,EAAE,CAEpB;IAED,KAAK,IAAI,MAAM,CAId;IAED,iFAAiF;IACjF,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,yBAAyB,EAAE,CAqBlE;IAED,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAUtC;IAED,kBAAkB,IAAI,MAAM,GAAG,IAAI,CASlC;IAED,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAO7D;IAED,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAOtD;IAED,8FAA8F;IAC9F,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,CAQpD;IAED,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,UAAU;IAuGlB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,IAAI;CAqBb"}
@@ -0,0 +1,186 @@
1
+ import { directDelegatedChildrenFromRecords } from "@claudexor/schema";
2
+ import { parseCommandListQuery } from "../command-list-select.js";
3
+ import { publicJobRecord } from "../job-record.js";
4
+ import { commandRow, commandSummary, hydrateCommand, } from "./command-rows.js";
5
+ const COLUMNS = "c.id,c.pid,c.run_id,c.created_at,c.summary";
6
+ export const MODEL_RETAINS_RESOURCE_SQL = `SELECT (
7
+ EXISTS(SELECT 1 FROM command INDEXED BY command_request_resource WHERE request_resource_id = ?1
8
+ AND kind = 'model' AND live = 1 AND state IN ('queued','running'))
9
+ OR EXISTS(SELECT 1 FROM command INDEXED BY command_response_resource WHERE response_resource_id = ?1
10
+ AND kind = 'model' AND live = 1 AND response_state = 'ready' AND response_expires_at > ?2)) AS owned`;
11
+ export const MODEL_TERMINAL_RESOURCE_SQL = `SELECT (
12
+ EXISTS(SELECT 1 FROM command INDEXED BY command_request_resource WHERE request_resource_id = ?1
13
+ AND kind = 'model' AND live = 1 AND state NOT IN ('queued','running'))
14
+ OR EXISTS(SELECT 1 FROM command INDEXED BY command_response_resource WHERE response_resource_id = ?1
15
+ AND kind = 'model' AND live = 1 AND state NOT IN ('queued','running'))) AS bound`;
16
+ /** Every collection selects compact rows through an address or keyset page.
17
+ * Only id/turn detail and getByRunId hydrate the selected full record. */
18
+ export class SqlCommandQueries {
19
+ store;
20
+ blobs;
21
+ constructor(store, blobs) {
22
+ this.store = store;
23
+ this.blobs = blobs;
24
+ }
25
+ getByRunId(runId) {
26
+ const row = this.rows("c.run_id = ?", [runId])[0];
27
+ return row ? this.detail(row.id) : undefined;
28
+ }
29
+ select(query) {
30
+ return this.selectRows(parseCommandListQuery(query), false);
31
+ }
32
+ publicList(query) {
33
+ return this.selectRows(parseCommandListQuery(query), true).map(publicJobRecord);
34
+ }
35
+ active() {
36
+ return this.rows("c.state IN ('queued','running')", []).map(commandSummary);
37
+ }
38
+ count() {
39
+ return Number(this.store.prepare("SELECT count(*) AS n FROM command").get().n);
40
+ }
41
+ /** Newest retained operations for this harness, without params/result bodies. */
42
+ maintenanceForHarness(harness) {
43
+ return this.store
44
+ .prepare(`SELECT summary FROM command INDEXED BY command_maintenance_harness
45
+ WHERE live=1 AND kind='maintenance' AND json_extract(CAST(summary AS TEXT),'$.params.harness')=?
46
+ ORDER BY created_at DESC,rowid DESC`)
47
+ .all(harness).map((row) => {
48
+ const record = commandSummary(row);
49
+ return {
50
+ id: record.id,
51
+ state: record.state,
52
+ createdAt: record.createdAt,
53
+ startedAt: record.startedAt,
54
+ finishedAt: record.finishedAt,
55
+ harness,
56
+ evidence: record.result,
57
+ };
58
+ });
59
+ }
60
+ expiredResponses(now) {
61
+ return this.store
62
+ .prepare(`SELECT id FROM command INDEXED BY command_expiry
63
+ WHERE kind='model' AND live=1 AND response_state='ready' AND response_expires_at <= ?
64
+ AND state NOT IN ('queued','running') ORDER BY response_expires_at,id`)
65
+ .all(now).map((row) => row.id);
66
+ }
67
+ nextResponseExpiry() {
68
+ const row = this.store
69
+ .prepare(`SELECT response_expires_at FROM command INDEXED BY command_expiry
70
+ WHERE kind='model' AND live=1 AND response_state='ready' AND response_expires_at IS NOT NULL
71
+ ORDER BY response_expires_at LIMIT 1`)
72
+ .get();
73
+ return row?.response_expires_at ?? null;
74
+ }
75
+ retainsResourceBytes(resourceId, now) {
76
+ return (Number(this.store.prepare(MODEL_RETAINS_RESOURCE_SQL).get(resourceId, now)
77
+ .owned) === 1);
78
+ }
79
+ hasTerminalResourceReceipt(resourceId) {
80
+ return (Number(this.store.prepare(MODEL_TERMINAL_RESOURCE_SQL).get(resourceId)
81
+ .bound) === 1);
82
+ }
83
+ /** Address only this resource's receipts, including persisted expiry after cleanup failed. */
84
+ responsesForResource(resourceId) {
85
+ const rows = this.store
86
+ .prepare(`SELECT id FROM command INDEXED BY command_response_resource
87
+ WHERE response_resource_id=? AND kind='model' AND live=1 AND state NOT IN ('queued','running')`)
88
+ .all(resourceId);
89
+ return rows.map((row) => this.detail(row.id));
90
+ }
91
+ detail(id) {
92
+ const row = commandRow(this.store, id);
93
+ if (!row)
94
+ throw new Error(`no such job: ${id}`);
95
+ return hydrateCommand(row, this.blobs);
96
+ }
97
+ selectRows(query, product) {
98
+ if ("id" in query) {
99
+ const row = this.rows("(c.id = ? OR c.run_id = ?)", [query.id, query.id], product)[0];
100
+ return row ? [this.detail(row.id)] : [];
101
+ }
102
+ if ("turnId" in query) {
103
+ const row = this.rows("c.turn_id = ?", [query.turnId], product, "c.created_at DESC,c.rowid DESC LIMIT 1")[0];
104
+ return row ? [this.detail(row.id)] : [];
105
+ }
106
+ if ("page" in query) {
107
+ const { cursor, state, limit } = query.page;
108
+ const where = ["1=1"];
109
+ const args = [];
110
+ if (state !== null) {
111
+ where.push("c.state = ?");
112
+ args.push(state);
113
+ }
114
+ if (cursor) {
115
+ where.push("(c.created_at,c.id) < (?,?)");
116
+ args.push(cursor.createdAt, cursor.id);
117
+ }
118
+ args.push(limit + 1);
119
+ return this.rows(where.join(" AND "), args, product, "c.created_at DESC,c.id DESC LIMIT ?").map(commandSummary);
120
+ }
121
+ if ("ids" in query)
122
+ return this.rows("(c.id IN (SELECT value FROM json_each(?)) OR c.run_id IN (SELECT value FROM json_each(?)))", [JSON.stringify(query.ids), JSON.stringify(query.ids)], product).map(commandSummary);
123
+ if ("delegatedFromRunId" in query)
124
+ return directDelegatedChildrenFromRecords(query.delegatedFromRunId, this.rows("c.delegated_from = ?", [query.delegatedFromRunId], product).map(commandSummary));
125
+ if ("continuationChainOf" in query) {
126
+ const seed = this.rows("(c.id = ? OR c.run_id = ?)", [query.continuationChainOf, query.continuationChainOf], product)[0];
127
+ if (!seed)
128
+ return [];
129
+ const visited = new Map([[seed.id, seed]]);
130
+ const pending = [seed];
131
+ for (let i = 0; i < pending.length; i++) {
132
+ const parent = pending[i];
133
+ for (const child of this.rows("c.continue_from IN (?,?)", [parent.id, parent.run_id ?? parent.id], product)) {
134
+ if (visited.has(child.id))
135
+ continue;
136
+ visited.set(child.id, child);
137
+ pending.push(child);
138
+ }
139
+ }
140
+ return this.byIds([...visited.keys()], product).map(commandSummary);
141
+ }
142
+ if ("delegatedDescendantsOf" in query) {
143
+ const queue = [query.delegatedDescendantsOf];
144
+ const seen = new Set(queue);
145
+ const out = [];
146
+ for (let i = 0; i < queue.length; i++)
147
+ for (const child of this.rows("c.delegated_from = ?", [queue[i]], product)) {
148
+ const id = child.run_id ?? child.id;
149
+ if (seen.has(id))
150
+ continue;
151
+ seen.add(id);
152
+ queue.push(id);
153
+ out.push(commandSummary(child));
154
+ }
155
+ return out;
156
+ }
157
+ if ("threadId" in query || "threadIds" in query) {
158
+ const threadIds = "threadId" in query ? [query.threadId] : query.threadIds;
159
+ const active = "activeOnly" in query && query.activeOnly === true;
160
+ const members = this.rows(`c.thread_id IN (SELECT value FROM json_each(?))${active ? " AND c.state IN ('queued','running')" : ""}`, [JSON.stringify(threadIds)], product);
161
+ if (active || members.length === 0)
162
+ return members.map(commandSummary);
163
+ const children = this.rows("c.delegated_from IN (SELECT value FROM json_each(?))", [JSON.stringify(members.map((row) => row.run_id ?? row.id))], product);
164
+ return this.byIds([...new Set([...members, ...children].map((row) => row.id))], product).map(commandSummary);
165
+ }
166
+ return this.rows("c.state IN ('queued','running')", [], product).map(commandSummary);
167
+ }
168
+ byIds(ids, product) {
169
+ return this.rows("c.id IN (SELECT value FROM json_each(?))", [JSON.stringify(ids)], product);
170
+ }
171
+ rows(where, args, product = false, order) {
172
+ // Legacy enumeration is global then registry-created projects, each in
173
+ // first command insertion order. Joins occur only for the addressed set;
174
+ // public pages use their separate createdAt/id index order without joins.
175
+ const joins = order
176
+ ? ""
177
+ : ` JOIN partition p ON p.id=c.pid
178
+ LEFT JOIN project pr ON pr.current_pid=c.pid AND pr.status='active'`;
179
+ const ordering = order ?? "(p.name='global') DESC,pr.created_at,pr.rowid,c.rowid";
180
+ return this.store
181
+ .prepare(`SELECT ${COLUMNS} FROM command c${joins}
182
+ WHERE c.live=1${product ? " AND c.kind='product'" : ""} AND ${where} ORDER BY ${ordering}`)
183
+ .all(...args);
184
+ }
185
+ }
186
+ //# sourceMappingURL=command-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-queries.js","sourceRoot":"","sources":["../../src/store/command-queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAyB,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAkB,MAAM,kBAAkB,CAAC;AAGnE,OAAO,EACL,UAAU,EACV,cAAc,EACd,cAAc,GAEf,MAAM,mBAAmB,CAAC;AAU3B,MAAM,OAAO,GAAG,4CAA4C,CAAC;AAW7D,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;yGAI+D,CAAC;AAE1G,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;qFAI0C,CAAC;AAEtF;0EAC0E;AAC1E,MAAM,OAAO,iBAAiB;IAET,KAAK;IACL,KAAK;IAFxB,YACmB,KAAkB,EAClB,KAAgB;qBADhB,KAAK;qBACL,KAAK;IACrB,CAAC;IAEJ,UAAU,CAAC,KAAa;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,KAAuB;QAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAED,UAAU,CAAC,KAAuB;QAChC,OAAO,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAClF,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK;QACH,OAAO,MAAM,CACV,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAAoB,CAAC,CAAC,CACnF,CAAC;IACJ,CAAC;IAED,iFAAiF;IACjF,qBAAqB,CAAC,OAAe;QACnC,OACE,IAAI,CAAC,KAAK;aACP,OAAO,CACN;;0CAEgC,CACjC;aACA,GAAG,CAAC,OAAO,CACf,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACZ,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YACnC,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,OAAO;gBACP,QAAQ,EAAE,MAAM,CAAC,MAA+C;aACjE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,GAAW;QAC1B,OACE,IAAI,CAAC,KAAK;aACP,OAAO,CACN;;8EAEoE,CACrE;aACA,GAAG,CAAC,GAAG,CACX,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,kBAAkB;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK;aACnB,OAAO,CACN;;2CAEmC,CACpC;aACA,GAAG,EAAiD,CAAC;QACxD,OAAO,GAAG,EAAE,mBAAmB,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED,oBAAoB,CAAC,UAAkB,EAAE,GAAW;QAClD,OAAO,CACL,MAAM,CACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAuB;aACvF,KAAK,CACT,KAAK,CAAC,CACR,CAAC;IACJ,CAAC;IAED,0BAA0B,CAAC,UAAkB;QAC3C,OAAO,CACL,MAAM,CACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,GAAG,CAAC,UAAU,CAAuB;aACnF,KAAK,CACT,KAAK,CAAC,CACR,CAAC;IACJ,CAAC;IAED,8FAA8F;IAC9F,oBAAoB,CAAC,UAAkB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;aACpB,OAAO,CACN;qGAC6F,CAC9F;aACA,GAAG,CAAC,UAAU,CAA0B,CAAC;QAC5C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAEO,MAAM,CAAC,EAAU;QACvB,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAChD,OAAO,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAEO,UAAU,CAAC,KAAuB,EAAE,OAAgB;QAC1D,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,CAAC;QACD,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CACnB,eAAe,EACf,CAAC,KAAK,CAAC,MAAM,CAAC,EACd,OAAO,EACP,wCAAwC,CACzC,CAAC,CAAC,CAAC,CAAC;YACL,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,CAAC;QACD,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YACpB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;YAC5C,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;YACtB,MAAM,IAAI,GAA2B,EAAE,CAAC;YACxC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBAC1C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC,IAAI,CACd,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EACnB,IAAI,EACJ,OAAO,EACP,qCAAqC,CACtC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,KAAK,IAAI,KAAK;YAChB,OAAO,IAAI,CAAC,IAAI,CACd,4FAA4F,EAC5F,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EACtD,OAAO,CACR,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACxB,IAAI,oBAAoB,IAAI,KAAK;YAC/B,OAAO,kCAAkC,CACvC,KAAK,CAAC,kBAAkB,EACxB,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAC3F,CAAC;QACJ,IAAI,qBAAqB,IAAI,KAAK,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CACpB,4BAA4B,EAC5B,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,CAAC,EACtD,OAAO,CACR,CAAC,CAAC,CAAC,CAAC;YACL,IAAI,CAAC,IAAI;gBAAE,OAAO,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;gBAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAC3B,0BAA0B,EAC1B,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC,EACvC,OAAO,CACR,EAAE,CAAC;oBACF,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;wBAAE,SAAS;oBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,wBAAwB,IAAI,KAAK,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5B,MAAM,GAAG,GAAgB,EAAE,CAAC;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE;gBACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC5E,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;oBACpC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;wBAAE,SAAS;oBAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACb,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;gBAClC,CAAC;YACH,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,UAAU,IAAI,KAAK,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;YAC3E,MAAM,MAAM,GAAG,YAAY,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;YAClE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACvB,kDAAkD,MAAM,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,EAAE,EACxG,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,EAC3B,OAAO,CACR,CAAC;YACF,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CACxB,sDAAsD,EACtD,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAC5D,OAAO,CACR,CAAC;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAC1F,cAAc,CACf,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACvF,CAAC;IAEO,KAAK,CAAC,GAAa,EAAE,OAAgB;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,0CAA0C,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/F,CAAC;IAEO,IAAI,CACV,KAAa,EACb,IAA4B,EAC5B,OAAO,GAAG,KAAK,EACf,KAAc;QAEd,uEAAuE;QACvE,yEAAyE;QACzE,0EAA0E;QAC1E,MAAM,KAAK,GAAG,KAAK;YACjB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;0EACkE,CAAC;QACvE,MAAM,QAAQ,GAAG,KAAK,IAAI,uDAAuD,CAAC;QAClF,OAAO,IAAI,CAAC,KAAK;aACd,OAAO,CACN,UAAU,OAAO,kBAAkB,KAAK;sBAC1B,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,aAAa,QAAQ,EAAE,CACzF;aACA,GAAG,CAAC,GAAG,IAAI,CAAiB,CAAC;IAClC,CAAC;CACF"}