@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,43 @@
1
+ import { type IdempotencyBinding } from "./idempotency.js";
2
+ import { type SqlWriteContext } from "./mutation.js";
3
+ import { type PartitionGeneration } from "./partitions.js";
4
+ import type { EngineStore } from "./store.js";
5
+ import type { BlobFiles } from "./blob-files.js";
6
+ type Reader = Pick<SqlWriteContext, "prepare">;
7
+ /** Current registry authority, including recovery-required global state. */
8
+ export declare function globalGeneration(sql: Reader): PartitionGeneration | null;
9
+ /** The registry, not just a partition's ready bit, determines visibility. */
10
+ export declare const SERVED_PIDS_SQL = "\n SELECT g.id FROM meta m JOIN partition g ON g.id = CAST(m.value AS INTEGER)\n WHERE m.key = 'global_pid' AND g.status = 'ready'\n UNION ALL\n SELECT p.current_pid FROM meta m JOIN partition g ON g.id = CAST(m.value AS INTEGER)\n JOIN project p ON p.pid = g.id AND p.status = 'active'\n JOIN partition q ON q.id = p.current_pid AND q.status = 'ready'\n WHERE m.key = 'global_pid' AND g.status = 'ready'";
11
+ /** Addressed membership: no materialization of every project on hot lookups. */
12
+ export declare function isServedPid(sql: Reader, pid: number): boolean;
13
+ export declare function requireServedGeneration(sql: Reader, pid: number): PartitionGeneration;
14
+ export declare function servedGenerations(sql: Reader): PartitionGeneration[];
15
+ /** Used by first construction/import. No engine is opened or committed here. */
16
+ export declare function setGlobalGenerationInTx(sql: SqlWriteContext, pid: number): void;
17
+ /** Import's final pass, after project current_pid bindings are complete. */
18
+ export declare function reconcileLiveInTx(sql: SqlWriteContext): void;
19
+ export declare function setGenerationStatusInTx(sql: SqlWriteContext, pid: number, status: string): void;
20
+ export declare function archiveGenerationInTx(sql: SqlWriteContext, pid: number): string;
21
+ export declare function restoreGenerationInTx(sql: SqlWriteContext, pid: number): void;
22
+ /** Preserves old rows as evidence. Restoring an unregistered generation cannot
23
+ * re-adopt it: only the current global registry can make its commands live. */
24
+ export declare function quarantineGenerationInTx(sql: SqlWriteContext, oldPid: number, input: {
25
+ epoch: string;
26
+ createdAt: string;
27
+ }): PartitionGeneration;
28
+ /** Recovery owns request/fingerprint validation and any filesystem leftovers.
29
+ * A retry addresses oldPid, even after current authority has moved. */
30
+ export declare function quarantineGeneration(store: EngineStore, blobs: BlobFiles, input: {
31
+ oldPid: number;
32
+ keyDigest: string;
33
+ requestDigest: string;
34
+ operationId: string;
35
+ payload: unknown;
36
+ epoch?: string;
37
+ }): {
38
+ generation: PartitionGeneration | null;
39
+ binding: IdempotencyBinding;
40
+ replay: boolean;
41
+ };
42
+ export {};
43
+ //# sourceMappingURL=generations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generations.d.ts","sourceRoot":"","sources":["../../src/store/generations.ts"],"names":[],"mappings":"AACA,OAAO,EAA0C,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEnG,OAAO,EAAmC,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAIL,KAAK,mBAAmB,EACzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,KAAK,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;AAE/C,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAIxE;AAED,6EAA6E;AAC7E,eAAO,MAAM,eAAe,waAO0B,CAAC;AAEvD,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAW7D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,mBAAmB,CASrF;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAYpE;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAa/E;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAQ5D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAU/F;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/E;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAI7E;AAED;+EAC+E;AAC/E,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,eAAe,EACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,GACA,mBAAmB,CAcrB;AAED;uEACuE;AACvE,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA;IAAE,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CA4B1F"}
@@ -0,0 +1,143 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { bindIdempotencyInTx, lookupIdempotency } from "./idempotency.js";
3
+ import { appendPreparedEventInTx, prepareEvent } from "./event-store.js";
4
+ import { requireTransaction, runMutation } from "./mutation.js";
5
+ import { generationOf, insertPartitionInTx, partitionById, } from "./partitions.js";
6
+ /** Current registry authority, including recovery-required global state. */
7
+ export function globalGeneration(sql) {
8
+ const row = sql.prepare("SELECT value FROM meta WHERE key = 'global_pid'").get();
9
+ return row ? partitionById(sql, Number(row.value)) : null;
10
+ }
11
+ /** The registry, not just a partition's ready bit, determines visibility. */
12
+ export const SERVED_PIDS_SQL = `
13
+ SELECT g.id FROM meta m JOIN partition g ON g.id = CAST(m.value AS INTEGER)
14
+ WHERE m.key = 'global_pid' AND g.status = 'ready'
15
+ UNION ALL
16
+ SELECT p.current_pid FROM meta m JOIN partition g ON g.id = CAST(m.value AS INTEGER)
17
+ JOIN project p ON p.pid = g.id AND p.status = 'active'
18
+ JOIN partition q ON q.id = p.current_pid AND q.status = 'ready'
19
+ WHERE m.key = 'global_pid' AND g.status = 'ready'`;
20
+ /** Addressed membership: no materialization of every project on hot lookups. */
21
+ export function isServedPid(sql, pid) {
22
+ return Boolean(sql
23
+ .prepare(`SELECT 1 FROM partition q JOIN meta m ON m.key = 'global_pid'
24
+ JOIN partition g ON g.id = CAST(m.value AS INTEGER) AND g.status = 'ready'
25
+ WHERE q.id = ? AND q.status = 'ready' AND (q.id = g.id OR EXISTS(
26
+ SELECT 1 FROM project p WHERE p.current_pid = q.id AND p.pid = g.id AND p.status = 'active'))`)
27
+ .get(pid));
28
+ }
29
+ export function requireServedGeneration(sql, pid) {
30
+ const generation = partitionById(sql, pid);
31
+ if (!generation || !isServedPid(sql, pid)) {
32
+ throw Object.assign(new Error(`partition ${generation?.name ?? pid} requires journal recovery`), { code: "journal_recovery_required", status: 409 });
33
+ }
34
+ return generation;
35
+ }
36
+ export function servedGenerations(sql) {
37
+ return sql
38
+ .prepare(`SELECT q.id,q.name,q.epoch,q.status,q.next_seq FROM partition q
39
+ LEFT JOIN project p ON p.current_pid=q.id AND p.status='active'
40
+ AND p.pid=CAST((SELECT value FROM meta WHERE key='global_pid') AS INTEGER)
41
+ WHERE q.id IN (${SERVED_PIDS_SQL})
42
+ ORDER BY CASE WHEN q.name='global' THEN 0 ELSE 1 END,p.created_at,p.rowid`)
43
+ .all().map(generationOf);
44
+ }
45
+ /** Used by first construction/import. No engine is opened or committed here. */
46
+ export function setGlobalGenerationInTx(sql, pid) {
47
+ requireTransaction(sql);
48
+ const generation = partitionById(sql, pid);
49
+ if (generation?.name !== "global")
50
+ throw new Error("global authority must name a global partition");
51
+ sql
52
+ .prepare("INSERT INTO meta(key, value) VALUES('global_pid', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value")
53
+ .run(String(pid));
54
+ // Global registry replacement also hides all previously registered projects.
55
+ sql.prepare("UPDATE command SET live = 0 WHERE live = 1 AND pid <> ?").run(pid);
56
+ reconcileLiveInTx(sql);
57
+ }
58
+ /** Import's final pass, after project current_pid bindings are complete. */
59
+ export function reconcileLiveInTx(sql) {
60
+ requireTransaction(sql);
61
+ sql
62
+ .prepare(`UPDATE command SET live = CASE WHEN pid IN (${SERVED_PIDS_SQL}) THEN 1 ELSE 0 END
63
+ WHERE live <> CASE WHEN pid IN (${SERVED_PIDS_SQL}) THEN 1 ELSE 0 END`)
64
+ .run();
65
+ }
66
+ export function setGenerationStatusInTx(sql, pid, status) {
67
+ requireTransaction(sql);
68
+ sql.prepare("UPDATE partition SET status = ? WHERE id = ?").run(status, pid);
69
+ if (globalGeneration(sql)?.pid === pid) {
70
+ reconcileLiveInTx(sql);
71
+ }
72
+ else {
73
+ sql
74
+ .prepare("UPDATE command SET live = ? WHERE pid = ?")
75
+ .run(isServedPid(sql, pid) ? 1 : 0, pid);
76
+ }
77
+ }
78
+ export function archiveGenerationInTx(sql, pid) {
79
+ const generation = partitionById(sql, pid);
80
+ if (!generation)
81
+ throw new Error(`no partition ${pid}`);
82
+ setGenerationStatusInTx(sql, pid, "archived");
83
+ return `partition:${generation.name}@${generation.epoch}`;
84
+ }
85
+ export function restoreGenerationInTx(sql, pid) {
86
+ const generation = partitionById(sql, pid);
87
+ if (generation?.status !== "archived")
88
+ throw new Error(`partition ${pid} is not archived`);
89
+ setGenerationStatusInTx(sql, pid, "ready");
90
+ }
91
+ /** Preserves old rows as evidence. Restoring an unregistered generation cannot
92
+ * re-adopt it: only the current global registry can make its commands live. */
93
+ export function quarantineGenerationInTx(sql, oldPid, input) {
94
+ requireTransaction(sql);
95
+ const old = partitionById(sql, oldPid);
96
+ if (!old)
97
+ throw new Error(`no partition ${oldPid}`);
98
+ const global = globalGeneration(sql);
99
+ const project = sql
100
+ .prepare("SELECT id FROM project WHERE pid = ? AND current_pid = ? AND status = 'active'")
101
+ .get(global?.pid ?? -1, oldPid);
102
+ if (global?.pid !== oldPid && !project)
103
+ throw new Error(`partition ${oldPid} is not current`);
104
+ setGenerationStatusInTx(sql, oldPid, "quarantined");
105
+ const next = insertPartitionInTx(sql, { name: old.name, ...input, projectId: project?.id });
106
+ if (global?.pid === oldPid)
107
+ setGlobalGenerationInTx(sql, next.pid);
108
+ else
109
+ sql.prepare("UPDATE project SET current_pid = ? WHERE id = ?").run(next.pid, project.id);
110
+ return next;
111
+ }
112
+ /** Recovery owns request/fingerprint validation and any filesystem leftovers.
113
+ * A retry addresses oldPid, even after current authority has moved. */
114
+ export function quarantineGeneration(store, blobs, input) {
115
+ const key = { owner: "quarantine", pid: input.oldPid, keyDigest: input.keyDigest };
116
+ const prior = lookupIdempotency(store, key, input.requestDigest);
117
+ if (prior) {
118
+ // Recovery owns the original operation receipt. Never infer its generation
119
+ // from today's current pointer: it may have been quarantined again.
120
+ return { generation: null, binding: prior, replay: true };
121
+ }
122
+ const epoch = input.epoch ?? randomUUID().replace(/-/g, "");
123
+ const time = store.now().toISOString();
124
+ const event = prepareEvent(blobs, {
125
+ type: "journal.partition_quarantined",
126
+ time,
127
+ payload: input.payload,
128
+ });
129
+ const binding = {
130
+ ...key,
131
+ operation: "journal.partition.quarantine",
132
+ requestDigest: input.requestDigest,
133
+ targetId: input.operationId,
134
+ createdAt: time,
135
+ };
136
+ return runMutation(store, (tx) => {
137
+ const generation = quarantineGenerationInTx(tx, input.oldPid, { epoch, createdAt: time });
138
+ bindIdempotencyInTx(tx, binding);
139
+ appendPreparedEventInTx(tx, blobs, generation.pid, event);
140
+ return { generation, binding, replay: false };
141
+ });
142
+ }
143
+ //# sourceMappingURL=generations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generations.js","sourceRoot":"","sources":["../../src/store/generations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type SqlWriteContext } from "./mutation.js";
2
+ export type IdempotencyOwner = "command" | "thread" | "turn" | "decision" | "project" | "setup" | "upload" | "quarantine";
3
+ export interface IdempotencyKey {
4
+ owner: IdempotencyOwner;
5
+ pid: number;
6
+ /** The caller's original digest formula, including any prefix, is preserved. */
7
+ keyDigest: string;
8
+ }
9
+ export interface IdempotencyBinding extends IdempotencyKey {
10
+ operation: string;
11
+ requestDigest: string;
12
+ targetId: string;
13
+ createdAt: string;
14
+ /** Only uploads store an original reply. Other owners resolve their target. */
15
+ result?: unknown;
16
+ }
17
+ /** Addressed replay; request/body hashes are never recomputed or interchanged. */
18
+ export declare function lookupIdempotency(sql: Pick<SqlWriteContext, "prepare">, key: IdempotencyKey, requestDigest: string): IdempotencyBinding | undefined;
19
+ /** Bind once, in the same transaction as the target. Same-request replay keeps
20
+ * the first target/result/time; a different request never overwrites a row. */
21
+ export declare function bindIdempotencyInTx(sql: SqlWriteContext, binding: IdempotencyBinding): IdempotencyBinding;
22
+ /** Delete only the removed target's bindings. A retained turn must not lose its
23
+ * key merely because its command was pruned, even when the ids happen to match. */
24
+ export declare function deleteTargetIdempotencyInTx(sql: SqlWriteContext, owner: IdempotencyOwner, pid: number, targetId: string): number;
25
+ //# sourceMappingURL=idempotency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/store/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEzE,MAAM,MAAM,gBAAgB,GAC1B,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE7F,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,gBAAgB,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,gFAAgF;IAChF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAiBD,kFAAkF;AAClF,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,EACrC,GAAG,EAAE,cAAc,EACnB,aAAa,EAAE,MAAM,GACpB,kBAAkB,GAAG,SAAS,CAoBhC;AAED;+EAC+E;AAC/E,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,kBAAkB,GAC1B,kBAAkB,CAsBpB;AAED;mFACmF;AACnF,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR"}
@@ -0,0 +1,53 @@
1
+ import { requireTransaction } from "./mutation.js";
2
+ function conflict() {
3
+ throw Object.assign(new Error("idempotency key was already used with a different request"), {
4
+ code: "idempotency_conflict",
5
+ status: 409,
6
+ });
7
+ }
8
+ /** Addressed replay; request/body hashes are never recomputed or interchanged. */
9
+ export function lookupIdempotency(sql, key, requestDigest) {
10
+ const row = sql
11
+ .prepare("SELECT operation, request_digest, target_id, result, created_at FROM idempotency WHERE owner = ? AND pid = ? AND key_digest = ?")
12
+ .get(key.owner, key.pid, key.keyDigest);
13
+ if (!row)
14
+ return undefined;
15
+ if (row.request_digest !== requestDigest)
16
+ conflict();
17
+ return {
18
+ owner: key.owner,
19
+ pid: key.pid,
20
+ keyDigest: key.keyDigest,
21
+ operation: row.operation,
22
+ requestDigest: row.request_digest,
23
+ targetId: row.target_id,
24
+ createdAt: row.created_at,
25
+ ...(row.result === null
26
+ ? {}
27
+ : { result: JSON.parse(Buffer.from(row.result).toString("utf8")) }),
28
+ };
29
+ }
30
+ /** Bind once, in the same transaction as the target. Same-request replay keeps
31
+ * the first target/result/time; a different request never overwrites a row. */
32
+ export function bindIdempotencyInTx(sql, binding) {
33
+ requireTransaction(sql);
34
+ const existing = lookupIdempotency(sql, binding, binding.requestDigest);
35
+ if (existing)
36
+ return existing;
37
+ if (binding.owner !== "upload" && binding.result !== undefined) {
38
+ throw new Error("only upload idempotency bindings carry a result");
39
+ }
40
+ sql
41
+ .prepare("INSERT INTO idempotency(owner, pid, key_digest, operation, request_digest, target_id, result, created_at) VALUES(?, ?, ?, ?, ?, ?, ?, ?)")
42
+ .run(binding.owner, binding.pid, binding.keyDigest, binding.operation, binding.requestDigest, binding.targetId, binding.result === undefined ? null : Buffer.from(JSON.stringify(binding.result)), binding.createdAt);
43
+ return binding;
44
+ }
45
+ /** Delete only the removed target's bindings. A retained turn must not lose its
46
+ * key merely because its command was pruned, even when the ids happen to match. */
47
+ export function deleteTargetIdempotencyInTx(sql, owner, pid, targetId) {
48
+ requireTransaction(sql);
49
+ return Number(sql
50
+ .prepare("DELETE FROM idempotency WHERE target_id = ? AND owner = ? AND pid = ?")
51
+ .run(targetId, owner, pid).changes);
52
+ }
53
+ //# sourceMappingURL=idempotency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/store/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAwB,MAAM,eAAe,CAAC;AA6BzE,SAAS,QAAQ;IACf,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2DAA2D,CAAC,EAAE;QAC1F,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAC/B,GAAqC,EACrC,GAAmB,EACnB,aAAqB;IAErB,MAAM,GAAG,GAAG,GAAG;SACZ,OAAO,CACN,iIAAiI,CAClI;SACA,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAA2B,CAAC;IACpE,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,GAAG,CAAC,cAAc,KAAK,aAAa;QAAE,QAAQ,EAAE,CAAC;IACrD,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,EAAE,GAAG,CAAC,GAAG;QACZ,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,aAAa,EAAE,GAAG,CAAC,cAAc;QACjC,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,IAAI;YACrB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAY,EAAE,CAAC;KACjF,CAAC;AACJ,CAAC;AAED;+EAC+E;AAC/E,MAAM,UAAU,mBAAmB,CACjC,GAAoB,EACpB,OAA2B;IAE3B,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACxE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,GAAG;SACA,OAAO,CACN,0IAA0I,CAC3I;SACA,GAAG,CACF,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EACjF,OAAO,CAAC,SAAS,CAClB,CAAC;IACJ,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;mFACmF;AACnF,MAAM,UAAU,2BAA2B,CACzC,GAAoB,EACpB,KAAuB,EACvB,GAAW,EACX,QAAgB;IAEhB,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,MAAM,CACX,GAAG;SACA,OAAO,CAAC,uEAAuE,CAAC;SAChF,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CACrC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { DatabaseSync, StatementSync } from "node:sqlite";
2
+ import { type BodyRef } from "./blob-files.js";
3
+ import { StoreError } from "./errors.js";
4
+ import type { SqlWriteContext } from "./mutation.js";
5
+ /** The importer has exactly one connection, no EngineStore or background worker. */
6
+ export declare class ImportContext implements SqlWriteContext {
7
+ readonly db: DatabaseSync;
8
+ readonly blobsDir: string;
9
+ private readonly statements;
10
+ private active;
11
+ readonly externalDirectories: Set<string>;
12
+ constructor(db: DatabaseSync, blobsDir: string);
13
+ get inTransaction(): boolean;
14
+ prepare(sql: string): StatementSync;
15
+ transaction<T>(body: () => T): T;
16
+ /** Existing O_DSYNC writer, with a directory receipt instead of live generations.
17
+ * Parent fsyncs these directories before publishing the closed temp database. */
18
+ body(bytes: Uint8Array): BodyRef;
19
+ read(sha: string): Buffer;
20
+ }
21
+ export declare function importError(code: string, detail: string, cause?: unknown): StoreError;
22
+ //# sourceMappingURL=import-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-context.d.ts","sourceRoot":"","sources":["../../src/store/import-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAoC,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,oFAAoF;AACpF,qBAAa,aAAc,YAAW,eAAe;IAMjD,QAAQ,CAAC,EAAE,EAAE,YAAY;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAN3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,MAAM,CAAS;IACvB,QAAQ,CAAC,mBAAmB,cAAqB;IAEjD,YACW,EAAE,EAAE,YAAY,EAChB,QAAQ,EAAE,MAAM,EACvB;IAEJ,IAAI,aAAa,IAAI,OAAO,CAE3B;IACD,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAOlC;IAED,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAgB/B;IAED;qFACiF;IACjF,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CA0B/B;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASxB;CACF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAErF"}
@@ -0,0 +1,87 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { INLINE_BODY_MAX_BYTES, sha256Hex } from "./blob-files.js";
4
+ import { writeExternalFile } from "./external-files.js";
5
+ import { StoreError } from "./errors.js";
6
+ /** The importer has exactly one connection, no EngineStore or background worker. */
7
+ export class ImportContext {
8
+ db;
9
+ blobsDir;
10
+ statements = new Map();
11
+ active = false;
12
+ externalDirectories = new Set();
13
+ constructor(db, blobsDir) {
14
+ this.db = db;
15
+ this.blobsDir = blobsDir;
16
+ }
17
+ get inTransaction() {
18
+ return this.active;
19
+ }
20
+ prepare(sql) {
21
+ let statement = this.statements.get(sql);
22
+ if (!statement) {
23
+ statement = this.db.prepare(sql);
24
+ this.statements.set(sql, statement);
25
+ }
26
+ return statement;
27
+ }
28
+ transaction(body) {
29
+ if (this.active)
30
+ throw new Error("nested import transaction");
31
+ this.db.exec("BEGIN IMMEDIATE");
32
+ this.active = true;
33
+ try {
34
+ const value = body();
35
+ if (value && typeof value.then === "function")
36
+ throw new Error("async import transaction");
37
+ this.db.exec("COMMIT");
38
+ return value;
39
+ }
40
+ catch (error) {
41
+ this.db.exec("ROLLBACK");
42
+ throw error;
43
+ }
44
+ finally {
45
+ this.active = false;
46
+ }
47
+ }
48
+ /** Existing O_DSYNC writer, with a directory receipt instead of live generations.
49
+ * Parent fsyncs these directories before publishing the closed temp database. */
50
+ body(bytes) {
51
+ const sha256 = sha256Hex(bytes);
52
+ if (bytes.byteLength <= INLINE_BODY_MAX_BYTES)
53
+ return {
54
+ sha256,
55
+ size: bytes.byteLength,
56
+ inline: Buffer.from(bytes),
57
+ file: null,
58
+ generation: null,
59
+ };
60
+ const receipt = writeExternalFile({
61
+ registerExternal: (dir) => {
62
+ this.externalDirectories.add(dir);
63
+ return 0;
64
+ },
65
+ }, { dir: this.blobsDir, name: sha256, bytes, keepExisting: true });
66
+ // Existing immutable bytes are never rewritten, including a resource collision.
67
+ if (!receipt.written) {
68
+ const prior = readFileSync(receipt.path);
69
+ if (prior.length !== bytes.byteLength || sha256Hex(prior) !== sha256)
70
+ throw importError("store_import_blob_mismatch", `existing body ${sha256} differs`);
71
+ }
72
+ return { sha256, size: bytes.byteLength, inline: null, file: receipt.path, generation: null };
73
+ }
74
+ read(sha) {
75
+ const row = this.prepare("SELECT size,inline FROM blob WHERE sha256=?").get(sha);
76
+ if (!row)
77
+ throw importError("store_import_blob_missing", `missing body ${sha}`);
78
+ const bytes = row.inline === null ? readFileSync(join(this.blobsDir, sha)) : Buffer.from(row.inline);
79
+ if (bytes.length !== row.size || sha256Hex(bytes) !== sha)
80
+ throw importError("store_import_blob_mismatch", `body ${sha} differs`);
81
+ return bytes;
82
+ }
83
+ }
84
+ export function importError(code, detail, cause) {
85
+ return new StoreError(code, 503, false, detail, cause === undefined ? undefined : { cause });
86
+ }
87
+ //# sourceMappingURL=import-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-context.js","sourceRoot":"","sources":["../../src/store/import-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ImportPartitionSource } from "./import-source.js";
2
+ /** Decode legacy names only; no recursive scan, journal writer or new layout.
3
+ * Existing global/project slugs also recover empty or damaged partitions.
4
+ * Other nonempty names come from the first frame through the original codec. */
5
+ export declare function discoverLegacyPartitions(journalRoot: string): ImportPartitionSource[];
6
+ //# sourceMappingURL=import-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-discovery.d.ts","sourceRoot":"","sources":["../../src/store/import-discovery.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;gFAEgF;AAChF,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,qBAAqB,EAAE,CA6BrF"}
@@ -0,0 +1,66 @@
1
+ import { closeSync, existsSync, openSync, readSync, readdirSync, statSync } from "node:fs";
2
+ import { basename, join } from "node:path";
3
+ import { PREFIX_BYTES, decodeFrameBody, readFramePrefix } from "./legacy-journal/frame-codec.js";
4
+ import { journalPartitionDirectory } from "./legacy-journal/journal-partition.js";
5
+ import { importError } from "./import-context.js";
6
+ /** Decode legacy names only; no recursive scan, journal writer or new layout.
7
+ * Existing global/project slugs also recover empty or damaged partitions.
8
+ * Other nonempty names come from the first frame through the original codec. */
9
+ export function discoverLegacyPartitions(journalRoot) {
10
+ const result = [];
11
+ for (const entry of readdirSync(journalRoot, { withFileTypes: true })) {
12
+ if (!entry.isDirectory())
13
+ continue;
14
+ const directory = join(journalRoot, entry.name), file = join(directory, "journal.bin");
15
+ const match = /^project-(.*)-[0-9a-f]{12}$/.exec(entry.name);
16
+ const candidate = entry.name === basename(journalPartitionDirectory(journalRoot, "global"))
17
+ ? "global"
18
+ : match
19
+ ? `project:${match[1]}`
20
+ : null;
21
+ if (candidate && journalPartitionDirectory(journalRoot, candidate) === directory) {
22
+ result.push({ name: candidate, directory });
23
+ continue;
24
+ }
25
+ if (!existsSync(file))
26
+ continue;
27
+ const name = firstPartitionName(file);
28
+ if (journalPartitionDirectory(journalRoot, name) !== directory)
29
+ throw importError("store_import_partition_identity", "legacy partition directory disagrees with its frame identity");
30
+ result.push({ name, directory });
31
+ }
32
+ if (!result.some((row) => row.name === "global"))
33
+ result.push({ name: "global", directory: journalPartitionDirectory(journalRoot, "global") });
34
+ return result;
35
+ }
36
+ function firstPartitionName(path) {
37
+ const fd = openSync(path, "r");
38
+ try {
39
+ const size = statSync(path).size, prefix = Buffer.alloc(Math.min(PREFIX_BYTES, size));
40
+ readExactly(fd, prefix, 0);
41
+ const decoded = readFramePrefix(prefix, size);
42
+ if (decoded.status !== "frame")
43
+ throw importError("store_import_partition_identity", "legacy partition has no readable name; source bytes retained");
44
+ const frame = Buffer.alloc(decoded.frameLength);
45
+ readExactly(fd, frame, 0);
46
+ const body = decodeFrameBody(frame, decoded.headerLength, decoded.payloadLength);
47
+ if (body.status !== "frame" ||
48
+ typeof body.header.partition !== "string" ||
49
+ !body.header.partition.trim())
50
+ throw importError("store_import_partition_identity", "legacy first frame has no verified partition identity");
51
+ return body.header.partition;
52
+ }
53
+ finally {
54
+ closeSync(fd);
55
+ }
56
+ }
57
+ function readExactly(fd, bytes, position) {
58
+ let offset = 0;
59
+ while (offset < bytes.length) {
60
+ const count = readSync(fd, bytes, offset, bytes.length - offset, position + offset);
61
+ if (!count)
62
+ throw importError("store_import_source_changed", "legacy frame changed while reading its identity");
63
+ offset += count;
64
+ }
65
+ }
66
+ //# sourceMappingURL=import-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-discovery.js","sourceRoot":"","sources":["../../src/store/import-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { JournalRecord } from "./legacy-journal/frame-codec.js";
2
+ import { ImportContext } from "./import-context.js";
3
+ /** Bodies are prepared before BEGIN; the returned batch uses only pure row
4
+ * reducers. Runtime append/owner notifications never run during import. */
5
+ export declare function prepareImportRecords(sql: ImportContext, records: readonly JournalRecord[]): (pid: number) => void;
6
+ //# sourceMappingURL=import-records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-records.d.ts","sourceRoot":"","sources":["../../src/store/import-records.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAoBrE,OAAO,EAAE,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAkBjE;2EAC2E;AAC3E,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CA4KvB"}