@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,47 @@
1
+ /** One logical journal record as the fold sees it: an ordinary frame or one
2
+ * record inside a compacted snapshot. `byteLength` is the record's serialized
3
+ * logical size in bytes as stored in its source (informational: it feeds the
4
+ * retired-bytes receipt, never a decision). */
5
+ export interface FoldRecord {
6
+ seq: number;
7
+ type: string;
8
+ time: string;
9
+ payload: unknown;
10
+ byteLength: number;
11
+ }
12
+ /** Default (undefined / empty object) = keep. Deterministic. Called once per
13
+ * logical record in seq order, for ordinary frames and for records inside
14
+ * compacted snapshots alike. */
15
+ export interface FoldVerdict {
16
+ /** Do not retain this record (retire/slot/group still apply). */
17
+ drop?: boolean;
18
+ /** Single-holder key: a later record with the same slot drops the earlier holder. */
19
+ slot?: string;
20
+ /** Multi-holder key: registered, never auto-superseded. */
21
+ group?: string;
22
+ /** Drop every retained record currently registered under these slot/group
23
+ * names (applied BEFORE registering this record). */
24
+ retire?: readonly string[];
25
+ }
26
+ /** The policy is supplied by the caller (the daemon); the journal stays generic
27
+ * and never decides WHAT is dead. */
28
+ export interface JournalFold {
29
+ verdict(record: FoldRecord): FoldVerdict;
30
+ }
31
+ /** Identity fold: every record is retained. */
32
+ export declare const keepEverything: JournalFold;
33
+ export interface FoldResult<T> {
34
+ retained: T[];
35
+ retiredCount: number;
36
+ retiredBytes: number;
37
+ }
38
+ /** Streaming fold engine. Records are pushed in seq order; a record dropped by
39
+ * a later verdict leaves no reference behind (tombstones are Map deletions), so
40
+ * memory is proportional to the retained set plus live slot/group names, never
41
+ * to the number of records seen. */
42
+ export interface FoldStream<T> {
43
+ push(record: T, view: FoldRecord): void;
44
+ finish(): FoldResult<T>;
45
+ }
46
+ export declare function foldStream<T>(fold?: JournalFold): FoldStream<T>;
47
+ //# sourceMappingURL=journal-fold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-fold.d.ts","sourceRoot":"","sources":["../../../src/store/legacy-journal/journal-fold.ts"],"names":[],"mappings":"AAAA;;;+CAG+C;AAC/C,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;gCAEgC;AAChC,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;yDACqD;IACrD,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B;AAED;qCACqC;AACrC,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAAC;CAC1C;AAED,+CAA+C;AAC/C,eAAO,MAAM,cAAc,EAAE,WAAoD,CAAC;AAElF,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,EAAE,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;oCAGoC;AACpC,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;CACzB;AASD,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,GAAE,WAA4B,GAAG,UAAU,CAAC,CAAC,CAAC,CAoE/E"}
@@ -0,0 +1,81 @@
1
+ /** Identity fold: every record is retained. */
2
+ export const keepEverything = Object.freeze({ verdict: () => ({}) });
3
+ export function foldStream(fold = keepEverything) {
4
+ // Insertion order is seq order; deletions never reorder the survivors.
5
+ const held = new Map();
6
+ const slots = new Map();
7
+ const groups = new Map();
8
+ let nextId = 0;
9
+ let retiredCount = 0;
10
+ let retiredBytes = 0;
11
+ let finished = false;
12
+ const drop = (id) => {
13
+ const entry = held.get(id);
14
+ if (!entry)
15
+ return;
16
+ held.delete(id);
17
+ retiredCount += 1;
18
+ retiredBytes += entry.bytes;
19
+ if (entry.slot !== undefined && slots.get(entry.slot) === id)
20
+ slots.delete(entry.slot);
21
+ if (entry.group !== undefined) {
22
+ const members = groups.get(entry.group);
23
+ members?.delete(id);
24
+ if (members && members.size === 0)
25
+ groups.delete(entry.group);
26
+ }
27
+ };
28
+ const retire = (name) => {
29
+ const holder = slots.get(name);
30
+ if (holder !== undefined)
31
+ drop(holder);
32
+ const members = groups.get(name);
33
+ if (members)
34
+ for (const id of [...members])
35
+ drop(id);
36
+ };
37
+ return {
38
+ push(record, view) {
39
+ if (finished)
40
+ throw new Error("journal fold stream is finished");
41
+ const verdict = fold.verdict(view) ?? {};
42
+ if (verdict.retire)
43
+ for (const name of verdict.retire)
44
+ retire(name);
45
+ if (verdict.slot !== undefined) {
46
+ const holder = slots.get(verdict.slot);
47
+ if (holder !== undefined)
48
+ drop(holder);
49
+ }
50
+ if (verdict.drop) {
51
+ retiredCount += 1;
52
+ retiredBytes += view.byteLength;
53
+ return;
54
+ }
55
+ const id = nextId;
56
+ nextId += 1;
57
+ held.set(id, { record, bytes: view.byteLength, slot: verdict.slot, group: verdict.group });
58
+ if (verdict.slot !== undefined)
59
+ slots.set(verdict.slot, id);
60
+ if (verdict.group !== undefined) {
61
+ let members = groups.get(verdict.group);
62
+ if (!members) {
63
+ members = new Set();
64
+ groups.set(verdict.group, members);
65
+ }
66
+ members.add(id);
67
+ }
68
+ },
69
+ finish() {
70
+ finished = true;
71
+ const retained = [];
72
+ for (const entry of held.values())
73
+ retained.push(entry.record);
74
+ held.clear();
75
+ slots.clear();
76
+ groups.clear();
77
+ return { retained, retiredCount, retiredBytes };
78
+ },
79
+ };
80
+ }
81
+ //# sourceMappingURL=journal-fold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-fold.js","sourceRoot":"","sources":["../../../src/store/legacy-journal/journal-fold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function journalPartitionDirectory(rootDir: string, partition: string): string;
2
+ //# sourceMappingURL=journal-partition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-partition.d.ts","sourceRoot":"","sources":["../../../src/store/legacy-journal/journal-partition.ts"],"names":[],"mappings":"AAGA,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKpF"}
@@ -0,0 +1,10 @@
1
+ import { createHash } from "node:crypto";
2
+ import { join } from "node:path";
3
+ export function journalPartitionDirectory(rootDir, partition) {
4
+ if (!partition.trim())
5
+ throw new Error("journal partition must not be empty");
6
+ const slug = partition.replace(/[^A-Za-z0-9._-]+/g, "-").slice(0, 48) || "partition";
7
+ const digest = createHash("sha256").update(Buffer.from(partition)).digest("hex");
8
+ return join(rootDir, `${slug}-${digest.slice(0, 12)}`);
9
+ }
10
+ //# sourceMappingURL=journal-partition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"journal-partition.js","sourceRoot":"","sources":["../../../src/store/legacy-journal/journal-partition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,yBAAyB,CAAC,OAAe,EAAE,SAAiB;IAC1E,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC;IACrF,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { type JournalRecord } from "./frame-codec.js";
2
+ import type { JournalFold } from "./journal-fold.js";
3
+ export interface JournalPreparationReceipt {
4
+ fingerprint: string;
5
+ preparationIdentity: string;
6
+ virtual: boolean;
7
+ deferredRepair: null | {
8
+ kind: "discard_unacknowledged_append";
9
+ discardedBytes: number;
10
+ };
11
+ }
12
+ export type PreparedJournalRecovery = {
13
+ status: "ready";
14
+ discardedTailBytes: number;
15
+ } | {
16
+ status: "recovery_required";
17
+ location: {
18
+ kind: "byte";
19
+ byteOffset: number;
20
+ };
21
+ reason: string;
22
+ discardedTailBytes: number;
23
+ };
24
+ /** Chain state (`epoch`/`nextSeq`/`previousFrameHash`) is the disk state after
25
+ * the last frame; `records` is the retained set after the optional fold, and
26
+ * `retiredCount`/`retiredBytes` say what that fold dropped while replaying. */
27
+ export interface PreparedJournalInspection {
28
+ receipt: JournalPreparationReceipt;
29
+ recovery: PreparedJournalRecovery;
30
+ records: JournalRecord[];
31
+ epoch: string;
32
+ nextSeq: number;
33
+ previousFrameHash: string;
34
+ knownFileBytes: number;
35
+ retiredCount: number;
36
+ retiredBytes: number;
37
+ }
38
+ export declare function inspectPreparedJournal(input: {
39
+ rootDir: string;
40
+ partitionDir: string;
41
+ journalPath: string;
42
+ intentPath: string;
43
+ partition: string;
44
+ initialEpoch: string;
45
+ fold?: JournalFold;
46
+ }): PreparedJournalInspection;
47
+ export declare function fingerprintPreparedJournal(rootDir: string, partitionDir: string): Pick<JournalPreparationReceipt, "fingerprint" | "preparationIdentity">;
48
+ //# sourceMappingURL=read-only-preparation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-only-preparation.d.ts","sourceRoot":"","sources":["../../../src/store/legacy-journal/read-only-preparation.ts"],"names":[],"mappings":"AAcA,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,IAAI,GAAG;QACrB,IAAI,EAAE,+BAA+B,CAAC;QACtC,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,MAAM,uBAAuB,GAC/B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,GAC/C;IACE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEN;;+EAE+E;AAC/E,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,yBAAyB,CAAC;IACnC,QAAQ,EAAE,uBAAuB,CAAC;IAClC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AA6BD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB,GAAG,yBAAyB,CAuF5B;AAyBD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,IAAI,CAAC,yBAAyB,EAAE,aAAa,GAAG,qBAAqB,CAAC,CAMxE"}
@@ -0,0 +1,430 @@
1
+ import { createHash } from "node:crypto";
2
+ import { closeSync, constants, fstatSync, lstatSync, openSync, readSync, readdirSync, readlinkSync, realpathSync, } from "node:fs";
3
+ import { dirname, join, resolve, sep } from "node:path";
4
+ import { ZERO_HASH } from "./frame-codec.js";
5
+ import { readFrames } from "./frame-reader.js";
6
+ /** Bytes are retained only for files small enough to be an append intent; the
7
+ * journal itself is hashed in chunks and later decoded positionally. */
8
+ const RETAINED_FILE_BYTES = 1024;
9
+ const HASH_CHUNK_BYTES = 1024 * 1024;
10
+ export function inspectPreparedJournal(input) {
11
+ const tree = snapshotTree(input.rootDir, input.partitionDir);
12
+ const journal = tree.files.get(input.journalPath);
13
+ const intent = tree.files.get(input.intentPath);
14
+ const unexpected = [...tree.entries].filter((path) => path !== input.journalPath && path !== input.intentPath);
15
+ let problem = tree.problems[0] ?? null;
16
+ let byteOffset = 0;
17
+ let deferredRepair = null;
18
+ if (!problem && journal === undefined && (intent !== undefined || tree.partitionExists)) {
19
+ if (intent !== undefined || unexpected.length > 0) {
20
+ problem = "journal file is missing while partition state exists";
21
+ }
22
+ }
23
+ const size = journal?.size ?? 0;
24
+ let prefix = null;
25
+ if (!problem && intent !== undefined) {
26
+ try {
27
+ prefix = parseIntent(intent);
28
+ if (prefix.offset > size || size > prefix.offset + prefix.length) {
29
+ problem = "append intent does not match the journal prefix";
30
+ byteOffset = prefix.offset;
31
+ }
32
+ }
33
+ catch (error) {
34
+ problem = `append intent is malformed: ${safeMessage(error)}`;
35
+ }
36
+ }
37
+ let decoded = null;
38
+ if (!problem && journal !== undefined) {
39
+ try {
40
+ decoded = readObservedJournal(input.journalPath, journal, input.partition, {
41
+ limit: prefix?.offset,
42
+ fold: input.fold,
43
+ });
44
+ }
45
+ catch (error) {
46
+ problem = `journal cannot be read safely: ${safeMessage(error)}`;
47
+ }
48
+ }
49
+ if (!problem && prefix && decoded) {
50
+ if (decoded.error || decoded.incompleteOffset !== null) {
51
+ problem = "append intent does not match the journal prefix";
52
+ byteOffset = prefix.offset;
53
+ }
54
+ else {
55
+ deferredRepair = {
56
+ kind: "discard_unacknowledged_append",
57
+ discardedBytes: size - prefix.offset,
58
+ };
59
+ }
60
+ }
61
+ if (!problem && decoded?.incompleteOffset != null) {
62
+ problem = "unexplained suffix without append intent";
63
+ byteOffset = decoded.incompleteOffset;
64
+ }
65
+ if (!problem && decoded?.error) {
66
+ problem = decoded.error.reason;
67
+ byteOffset = decoded.error.offset;
68
+ }
69
+ const ready = !problem && decoded ? decoded : null;
70
+ const virtual = !tree.rootExists || !tree.partitionExists || journal === undefined;
71
+ return {
72
+ receipt: {
73
+ fingerprint: tree.fingerprint,
74
+ preparationIdentity: tree.preparationIdentity,
75
+ virtual,
76
+ deferredRepair,
77
+ },
78
+ recovery: problem
79
+ ? {
80
+ status: "recovery_required",
81
+ location: { kind: "byte", byteOffset },
82
+ reason: problem,
83
+ discardedTailBytes: 0,
84
+ }
85
+ : { status: "ready", discardedTailBytes: 0 },
86
+ records: ready?.retained ?? [],
87
+ epoch: ready?.epoch ?? input.initialEpoch,
88
+ nextSeq: ready?.nextSeq ?? 1,
89
+ previousFrameHash: ready?.previousFrameHash ?? ZERO_HASH,
90
+ knownFileBytes: deferredRepair ? prefix.offset : size,
91
+ retiredCount: ready?.retiredCount ?? 0,
92
+ retiredBytes: ready?.retiredBytes ?? 0,
93
+ };
94
+ }
95
+ /** Decode the journal that the tree walk already observed: the descriptor must
96
+ * still be the same file before and after the positional read. */
97
+ function readObservedJournal(path, observed, partition, options) {
98
+ const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW);
99
+ try {
100
+ if (observationMetadata(fstatSync(fd, { bigint: true })) !== observed.observation) {
101
+ throw new Error("journal changed since it was inspected");
102
+ }
103
+ const decoded = readFrames(fd, partition, options);
104
+ if (observationMetadata(fstatSync(fd, { bigint: true })) !== observed.observation) {
105
+ throw new Error("journal changed while being decoded");
106
+ }
107
+ return decoded;
108
+ }
109
+ finally {
110
+ closeSync(fd);
111
+ }
112
+ }
113
+ export function fingerprintPreparedJournal(rootDir, partitionDir) {
114
+ const observed = snapshotTree(rootDir, partitionDir);
115
+ return {
116
+ fingerprint: observed.fingerprint,
117
+ preparationIdentity: observed.preparationIdentity,
118
+ };
119
+ }
120
+ function snapshotTree(rootDir, partitionDir) {
121
+ const contentHash = createHash("sha256");
122
+ const identityHash = createHash("sha256");
123
+ const files = new Map();
124
+ const entries = new Set();
125
+ const problems = [];
126
+ if (!inspectTrustedParent(dirname(resolve(rootDir)), identityHash, problems)) {
127
+ contentHash.update("root\0unreachable\0");
128
+ return finishSnapshot({
129
+ contentHash,
130
+ identityHash,
131
+ rootExists: false,
132
+ partitionExists: false,
133
+ entries,
134
+ files,
135
+ problems,
136
+ });
137
+ }
138
+ const root = inspectEntry(rootDir, "root", contentHash, identityHash, files, problems, false);
139
+ if (root.kind !== "directory") {
140
+ contentHash.update("partition\0unreachable\0");
141
+ identityHash.update("partition\0unreachable\0");
142
+ return finishSnapshot({
143
+ contentHash,
144
+ identityHash,
145
+ rootExists: root.kind !== "missing",
146
+ partitionExists: false,
147
+ entries,
148
+ files,
149
+ problems,
150
+ });
151
+ }
152
+ const partition = inspectEntry(partitionDir, "partition", contentHash, identityHash, files, problems, false);
153
+ if (partition.kind === "directory") {
154
+ walkPartition(partitionDir, partitionDir, partition.stat, contentHash, identityHash, files, entries, problems);
155
+ }
156
+ assertDirectoryUnchanged(rootDir, root.stat, problems, "root");
157
+ return finishSnapshot({
158
+ contentHash,
159
+ identityHash,
160
+ rootExists: true,
161
+ partitionExists: partition.kind !== "missing",
162
+ entries,
163
+ files,
164
+ problems,
165
+ });
166
+ }
167
+ function walkPartition(path, partitionDir, before, contentHash, identityHash, files, entries, problems) {
168
+ let names;
169
+ try {
170
+ names = readdirSync(path).sort();
171
+ }
172
+ catch (error) {
173
+ problems.push(`journal partition cannot be listed: ${safeMessage(error)}`);
174
+ contentHash.update(`list-error\0${safeMessage(error)}\0`);
175
+ identityHash.update(`list-error\0${safeMessage(error)}\0`);
176
+ return;
177
+ }
178
+ for (const name of names) {
179
+ const child = join(path, name);
180
+ // `join` so the map keys match what callers look up (a `/`-built key never
181
+ // matched on Windows). The hashed LABEL is separator-normalized with
182
+ // `sep`, not a blanket backslash strip: on POSIX a backslash is an
183
+ // ordinary filename character and must stay distinct.
184
+ const relative = child
185
+ .slice(partitionDir.length + 1)
186
+ .split(sep)
187
+ .join("/");
188
+ entries.add(child);
189
+ const inspected = inspectEntry(child, relative, contentHash, identityHash, files, problems, true);
190
+ if (inspected.kind === "directory") {
191
+ walkPartition(child, partitionDir, inspected.stat, contentHash, identityHash, files, entries, problems);
192
+ }
193
+ }
194
+ try {
195
+ if (readdirSync(path).sort().join("\0") !== names.join("\0")) {
196
+ problems.push(`journal directory entries changed while being read: ${path}`);
197
+ }
198
+ }
199
+ catch (error) {
200
+ problems.push(`journal partition cannot be relisted: ${safeMessage(error)}`);
201
+ }
202
+ assertDirectoryUnchanged(path, before, problems, path);
203
+ }
204
+ function inspectEntry(path, label, contentHash, identityHash, files, problems, allowFile) {
205
+ let stat;
206
+ try {
207
+ stat = lstatSync(path, { bigint: true });
208
+ }
209
+ catch (error) {
210
+ if (errorCode(error) === "ENOENT") {
211
+ contentHash.update(`${label}\0missing\0`);
212
+ identityHash.update(`${label}\0missing\0`);
213
+ assertStillMissing(path, problems, label);
214
+ return { kind: "missing" };
215
+ }
216
+ problems.push(`${label} cannot be inspected: ${safeMessage(error)}`);
217
+ contentHash.update(`${label}\0error\0${safeMessage(error)}\0`);
218
+ identityHash.update(`${label}\0error\0${safeMessage(error)}\0`);
219
+ return { kind: "other" };
220
+ }
221
+ contentHash.update(`${label}\0${semanticMetadata(stat)}\0`);
222
+ identityHash.update(`${label}\0${identityMetadata(stat)}\0`);
223
+ if (stat.isSymbolicLink()) {
224
+ try {
225
+ const target = readlinkSync(path);
226
+ contentHash.update(`symlink\0${target}\0`);
227
+ identityHash.update(`symlink\0${target}\0`);
228
+ }
229
+ catch (error) {
230
+ problems.push(`${label} symbolic-link target cannot be read: ${safeMessage(error)}`);
231
+ }
232
+ problems.push(`${label} is a symbolic link`);
233
+ return { kind: "other" };
234
+ }
235
+ if (typeof process.getuid === "function" && stat.uid !== BigInt(process.getuid())) {
236
+ problems.push(`${label} is not owned by the current user`);
237
+ }
238
+ if (stat.isDirectory()) {
239
+ let safe = true;
240
+ try {
241
+ if (realpathSync.native(path) !== resolve(path)) {
242
+ problems.push(`${label} is not canonical`);
243
+ safe = false;
244
+ }
245
+ }
246
+ catch (error) {
247
+ problems.push(`${label} cannot be resolved canonically: ${safeMessage(error)}`);
248
+ safe = false;
249
+ }
250
+ if (process.platform !== "win32" && Number(stat.mode & 511n) !== 0o700) {
251
+ problems.push(`${label} is not private`);
252
+ safe = false;
253
+ }
254
+ if (typeof process.getuid === "function" && stat.uid !== BigInt(process.getuid()))
255
+ safe = false;
256
+ return safe ? { kind: "directory", stat } : { kind: "other" };
257
+ }
258
+ if (!allowFile || !stat.isFile() || stat.nlink !== 1n) {
259
+ problems.push(`${label} is not a private regular file`);
260
+ return { kind: "other" };
261
+ }
262
+ if (process.platform !== "win32" && Number(stat.mode & 511n) !== 0o600) {
263
+ problems.push(`${label} is not private`);
264
+ }
265
+ try {
266
+ const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW);
267
+ try {
268
+ const opened = fstatSync(fd, { bigint: true });
269
+ if (opened.dev !== stat.dev ||
270
+ opened.ino !== stat.ino ||
271
+ !opened.isFile() ||
272
+ observationMetadata(opened) !== observationMetadata(stat)) {
273
+ throw new Error("pathname identity changed while being read");
274
+ }
275
+ const retain = opened.size <= BigInt(RETAINED_FILE_BYTES);
276
+ const bytes = hashDescriptor(fd, contentHash, retain);
277
+ const after = fstatSync(fd, { bigint: true });
278
+ if (BigInt(bytes.length) !== opened.size ||
279
+ observationMetadata(opened) !== observationMetadata(after)) {
280
+ throw new Error("file changed while being read");
281
+ }
282
+ const namedAfter = lstatSync(path, { bigint: true });
283
+ if (observationMetadata(stat) !== observationMetadata(namedAfter)) {
284
+ throw new Error("pathname identity changed after being read");
285
+ }
286
+ files.set(path, {
287
+ size: Number(opened.size),
288
+ observation: observationMetadata(opened),
289
+ ...(retain ? { bytes: bytes.retained } : {}),
290
+ });
291
+ }
292
+ finally {
293
+ closeSync(fd);
294
+ }
295
+ }
296
+ catch (error) {
297
+ problems.push(`${label} cannot be read safely: ${safeMessage(error)}`);
298
+ contentHash.update(`read-error\0${safeMessage(error)}\0`);
299
+ identityHash.update(`read-error\0${safeMessage(error)}\0`);
300
+ }
301
+ return { kind: "file", stat };
302
+ }
303
+ /** Stream the descriptor through the content hash in bounded chunks. The
304
+ * fingerprint is the digest of the same byte sequence a whole-file read would
305
+ * hash, without retaining the file. */
306
+ function hashDescriptor(fd, contentHash, retain) {
307
+ const chunk = Buffer.allocUnsafe(HASH_CHUNK_BYTES);
308
+ const kept = [];
309
+ let length = 0;
310
+ for (;;) {
311
+ const read = readSync(fd, chunk, 0, chunk.length, length);
312
+ if (read === 0)
313
+ break;
314
+ contentHash.update(chunk.subarray(0, read));
315
+ if (retain)
316
+ kept.push(Buffer.from(chunk.subarray(0, read)));
317
+ length += read;
318
+ }
319
+ return { length, retained: retain ? Buffer.concat(kept) : Buffer.alloc(0) };
320
+ }
321
+ function finishSnapshot(input) {
322
+ const fingerprint = input.contentHash.digest("hex");
323
+ input.identityHash.update(`content\0${fingerprint}\0`);
324
+ return {
325
+ fingerprint,
326
+ preparationIdentity: input.identityHash.digest("hex"),
327
+ rootExists: input.rootExists,
328
+ partitionExists: input.partitionExists,
329
+ entries: input.entries,
330
+ files: input.files,
331
+ problems: input.problems,
332
+ };
333
+ }
334
+ function inspectTrustedParent(path, identityHash, problems) {
335
+ try {
336
+ const before = lstatSync(path, { bigint: true });
337
+ identityHash.update(`trusted-parent\0${identityMetadata(before)}\0`);
338
+ if (before.isSymbolicLink() ||
339
+ !before.isDirectory() ||
340
+ realpathSync.native(path) !== path ||
341
+ (typeof process.getuid === "function" && before.uid !== BigInt(process.getuid())) ||
342
+ (process.platform !== "win32" && Number(before.mode & 511n) !== 0o700)) {
343
+ problems.push("journal root parent is not canonical and private");
344
+ return false;
345
+ }
346
+ const after = lstatSync(path, { bigint: true });
347
+ if (observationMetadata(before) !== observationMetadata(after)) {
348
+ problems.push("journal root parent changed while being inspected");
349
+ return false;
350
+ }
351
+ return true;
352
+ }
353
+ catch (error) {
354
+ problems.push(`journal root parent cannot be inspected: ${safeMessage(error)}`);
355
+ identityHash.update(`trusted-parent-error\0${safeMessage(error)}\0`);
356
+ return false;
357
+ }
358
+ }
359
+ function assertDirectoryUnchanged(path, before, problems, label) {
360
+ try {
361
+ const after = lstatSync(path, { bigint: true });
362
+ if (observationMetadata(before) !== observationMetadata(after)) {
363
+ problems.push(`${label} changed while being inspected`);
364
+ }
365
+ }
366
+ catch (error) {
367
+ problems.push(`${label} became unavailable while being inspected: ${safeMessage(error)}`);
368
+ }
369
+ }
370
+ function assertStillMissing(path, problems, label) {
371
+ try {
372
+ lstatSync(path);
373
+ problems.push(`${label} appeared while being inspected`);
374
+ }
375
+ catch (error) {
376
+ if (errorCode(error) !== "ENOENT") {
377
+ problems.push(`${label} missing state is ambiguous: ${safeMessage(error)}`);
378
+ }
379
+ }
380
+ }
381
+ function semanticMetadata(stat) {
382
+ const base = [entryType(stat), stat.mode & 511n, stat.uid, stat.gid];
383
+ if (!stat.isDirectory())
384
+ base.push(stat.nlink, stat.size);
385
+ return base.join(":");
386
+ }
387
+ function identityMetadata(stat) {
388
+ const base = [stat.dev, stat.ino, entryType(stat), stat.mode & 511n, stat.uid, stat.gid];
389
+ if (!stat.isDirectory())
390
+ base.push(stat.nlink);
391
+ return base.join(":");
392
+ }
393
+ function observationMetadata(stat) {
394
+ return [identityMetadata(stat), stat.size, stat.mtimeNs, stat.ctimeNs].join(":");
395
+ }
396
+ function entryType(stat) {
397
+ if (stat.isDirectory())
398
+ return "directory";
399
+ if (stat.isFile())
400
+ return "file";
401
+ if (stat.isSymbolicLink())
402
+ return "symlink";
403
+ return "other";
404
+ }
405
+ function parseIntent(intent) {
406
+ if (!intent.bytes || intent.size > RETAINED_FILE_BYTES)
407
+ throw new Error("unsafe file");
408
+ const value = JSON.parse(intent.bytes.toString("utf8"));
409
+ if (!isRecord(value) ||
410
+ value.v !== 1 ||
411
+ !Number.isSafeInteger(value.offset) ||
412
+ Number(value.offset) < 0 ||
413
+ !Number.isSafeInteger(value.length) ||
414
+ Number(value.length) <= 0) {
415
+ throw new Error("invalid shape");
416
+ }
417
+ return value;
418
+ }
419
+ function errorCode(error) {
420
+ return error && typeof error === "object" && "code" in error
421
+ ? String(error.code)
422
+ : undefined;
423
+ }
424
+ function safeMessage(error) {
425
+ return error instanceof Error ? error.message : String(error);
426
+ }
427
+ function isRecord(value) {
428
+ return typeof value === "object" && value !== null && !Array.isArray(value);
429
+ }
430
+ //# sourceMappingURL=read-only-preparation.js.map