@akterjs/effect 0.0.0-stage → 0.1.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 (798) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +43 -2
  3. package/dist/contract/actor/actor-already-exists.errors.d.mts +8 -0
  4. package/dist/contract/actor/actor-already-exists.errors.mjs +4 -0
  5. package/dist/contract/actor/actor-definition.pure.d.mts +21 -0
  6. package/dist/contract/actor/actor-definition.pure.mjs +106 -0
  7. package/dist/contract/actor/actor-erased.errors.d.mts +8 -0
  8. package/dist/contract/actor/actor-erased.errors.mjs +4 -0
  9. package/dist/contract/actor/actor-names.pure.d.mts +11 -0
  10. package/dist/contract/actor/actor-names.pure.mjs +51 -0
  11. package/dist/contract/actor/actor-not-created.errors.d.mts +8 -0
  12. package/dist/contract/actor/actor-not-created.errors.mjs +4 -0
  13. package/dist/contract/actor/actor-not-registered.errors.d.mts +8 -0
  14. package/dist/contract/actor/actor-not-registered.errors.mjs +4 -0
  15. package/dist/contract/actor/actor-registry.service.d.mts +16 -0
  16. package/dist/contract/actor/actor-registry.service.mjs +21 -0
  17. package/dist/contract/actor/actor.contract.d.mts +238 -0
  18. package/dist/contract/actor/actor.contract.mjs +1 -0
  19. package/dist/contract/actor/host-interface.pure.d.mts +23 -0
  20. package/dist/contract/actor/host-interface.pure.mjs +39 -0
  21. package/dist/contract/actor/reserved-member.errors.d.mts +9 -0
  22. package/dist/contract/actor/reserved-member.errors.mjs +7 -0
  23. package/dist/contract/akter.service.d.mts +75 -0
  24. package/dist/contract/akter.service.mjs +134 -0
  25. package/dist/contract/caller/authentication.api.d.mts +6 -0
  26. package/dist/contract/caller/authentication.api.mjs +5 -0
  27. package/dist/contract/caller/caller-admission.pure.d.mts +27 -0
  28. package/dist/contract/caller/caller-admission.pure.mjs +59 -0
  29. package/dist/contract/caller/caller-not-allowed.errors.d.mts +16 -0
  30. package/dist/contract/caller/caller-not-allowed.errors.mjs +18 -0
  31. package/dist/contract/caller/caller.schema.d.mts +7 -0
  32. package/dist/contract/caller/caller.schema.mjs +8 -0
  33. package/dist/contract/caller/current-caller.service.d.mts +7 -0
  34. package/dist/contract/caller/current-caller.service.mjs +4 -0
  35. package/dist/contract/caller/principal.schema.d.mts +13 -0
  36. package/dist/contract/caller/principal.schema.mjs +10 -0
  37. package/dist/contract/caller/unauthenticated.errors.d.mts +8 -0
  38. package/dist/contract/caller/unauthenticated.errors.mjs +4 -0
  39. package/dist/contract/client/actor-client.adapter.d.mts +42 -0
  40. package/dist/contract/client/actor-client.adapter.mjs +90 -0
  41. package/dist/contract/client/actor-client.contract.d.mts +30 -0
  42. package/dist/contract/client/actor-client.contract.mjs +1 -0
  43. package/dist/contract/client/actor-rpc.contract.d.mts +33 -0
  44. package/dist/contract/client/actor-rpc.contract.mjs +16 -0
  45. package/dist/contract/client/actor-unavailable.errors.d.mts +9 -0
  46. package/dist/contract/client/actor-unavailable.errors.mjs +7 -0
  47. package/dist/contract/client/client-failure.contract.d.mts +28 -0
  48. package/dist/contract/client/client-failure.contract.mjs +28 -0
  49. package/dist/contract/client/invalid-request.errors.d.mts +9 -0
  50. package/dist/contract/client/invalid-request.errors.mjs +7 -0
  51. package/dist/contract/client/storage-limit.errors.d.mts +16 -0
  52. package/dist/contract/client/storage-limit.errors.mjs +14 -0
  53. package/dist/contract/command/command-id-expired.errors.d.mts +11 -0
  54. package/dist/contract/command/command-id-expired.errors.mjs +9 -0
  55. package/dist/contract/command/command-id.schema.d.mts +3 -0
  56. package/dist/contract/command/command-id.schema.mjs +4 -0
  57. package/dist/contract/command/command.contract.d.mts +117 -0
  58. package/dist/contract/command/command.contract.mjs +111 -0
  59. package/dist/contract/command/outbox-id.pure.d.mts +9 -0
  60. package/dist/contract/command/outbox-id.pure.mjs +14 -0
  61. package/dist/contract/command/outbox.schema.d.mts +9 -0
  62. package/dist/contract/command/outbox.schema.mjs +10 -0
  63. package/dist/contract/command/timer.schema.d.mts +20 -0
  64. package/dist/contract/command/timer.schema.mjs +14 -0
  65. package/dist/contract/computer/checkpoint-expired.errors.d.mts +12 -0
  66. package/dist/contract/computer/checkpoint-expired.errors.mjs +8 -0
  67. package/dist/contract/computer/computer-client-failure.contract.d.mts +16 -0
  68. package/dist/contract/computer/computer-client-failure.contract.mjs +1 -0
  69. package/dist/contract/computer/computer-client.adapter.d.mts +21 -0
  70. package/dist/contract/computer/computer-client.adapter.mjs +70 -0
  71. package/dist/contract/computer/computer-client.contract.d.mts +56 -0
  72. package/dist/contract/computer/computer-client.contract.mjs +1 -0
  73. package/dist/contract/computer/computer-held.errors.d.mts +13 -0
  74. package/dist/contract/computer/computer-held.errors.mjs +11 -0
  75. package/dist/contract/computer/computer-limit.errors.d.mts +15 -0
  76. package/dist/contract/computer/computer-limit.errors.mjs +13 -0
  77. package/dist/contract/computer/computer-lost.errors.d.mts +12 -0
  78. package/dist/contract/computer/computer-lost.errors.mjs +8 -0
  79. package/dist/contract/computer/computer-not-found.errors.d.mts +9 -0
  80. package/dist/contract/computer/computer-not-found.errors.mjs +5 -0
  81. package/dist/contract/computer/computer.schema.d.mts +122 -0
  82. package/dist/contract/computer/computer.schema.mjs +117 -0
  83. package/dist/contract/computer/computers-unavailable.errors.d.mts +9 -0
  84. package/dist/contract/computer/computers-unavailable.errors.mjs +5 -0
  85. package/dist/contract/computer/files/computer-files.schema.d.mts +28 -0
  86. package/dist/contract/computer/files/computer-files.schema.mjs +24 -0
  87. package/dist/contract/computer/rpc/computer-rpc.contract.d.mts +108 -0
  88. package/dist/contract/computer/rpc/computer-rpc.contract.mjs +117 -0
  89. package/dist/contract/computer/step/computer-step.contract.d.mts +21 -0
  90. package/dist/contract/computer/step/computer-step.contract.mjs +89 -0
  91. package/dist/contract/computer/step/computer-step.schema.d.mts +69 -0
  92. package/dist/contract/computer/step/computer-step.schema.mjs +71 -0
  93. package/dist/contract/computer/step/step-failure.schema.d.mts +13 -0
  94. package/dist/contract/computer/step/step-failure.schema.mjs +24 -0
  95. package/dist/contract/computer/step/step-not-found.errors.d.mts +9 -0
  96. package/dist/contract/computer/step/step-not-found.errors.mjs +5 -0
  97. package/dist/contract/description/published-contract.pure.d.mts +51 -0
  98. package/dist/contract/description/published-contract.pure.mjs +75 -0
  99. package/dist/contract/file/access/file-access-denied.errors.d.mts +11 -0
  100. package/dist/contract/file/access/file-access-denied.errors.mjs +9 -0
  101. package/dist/contract/file/access/file-access.contract.d.mts +35 -0
  102. package/dist/contract/file/access/file-access.contract.mjs +32 -0
  103. package/dist/contract/file/actor-files.contract.d.mts +50 -0
  104. package/dist/contract/file/actor-files.contract.mjs +1 -0
  105. package/dist/contract/file/blob-transfer.errors.d.mts +9 -0
  106. package/dist/contract/file/blob-transfer.errors.mjs +7 -0
  107. package/dist/contract/file/file-client-failure.contract.d.mts +24 -0
  108. package/dist/contract/file/file-client-failure.contract.mjs +1 -0
  109. package/dist/contract/file/file-client.adapter.d.mts +17 -0
  110. package/dist/contract/file/file-client.adapter.mjs +21 -0
  111. package/dist/contract/file/file-client.contract.d.mts +14 -0
  112. package/dist/contract/file/file-client.contract.mjs +1 -0
  113. package/dist/contract/file/file-listing.pure.d.mts +6 -0
  114. package/dist/contract/file/file-listing.pure.mjs +18 -0
  115. package/dist/contract/file/file-not-found.errors.d.mts +8 -0
  116. package/dist/contract/file/file-not-found.errors.mjs +4 -0
  117. package/dist/contract/file/file-path.pure.d.mts +4 -0
  118. package/dist/contract/file/file-path.pure.mjs +38 -0
  119. package/dist/contract/file/files-unavailable.errors.d.mts +8 -0
  120. package/dist/contract/file/files-unavailable.errors.mjs +4 -0
  121. package/dist/contract/file/invalid-file-request.errors.d.mts +9 -0
  122. package/dist/contract/file/invalid-file-request.errors.mjs +7 -0
  123. package/dist/contract/file/rpc/file-rpc.contract.d.mts +88 -0
  124. package/dist/contract/file/rpc/file-rpc.contract.mjs +117 -0
  125. package/dist/contract/file/rpc/file-too-large.errors.d.mts +13 -0
  126. package/dist/contract/file/rpc/file-too-large.errors.mjs +11 -0
  127. package/dist/contract/file/rpc/rpc-file-clients.layer.d.mts +10 -0
  128. package/dist/contract/file/rpc/rpc-file-clients.layer.mjs +95 -0
  129. package/dist/contract/fork/fork-rpc.contract.d.mts +40 -0
  130. package/dist/contract/fork/fork-rpc.contract.mjs +26 -0
  131. package/dist/contract/history/actor-journal.service.d.mts +58 -0
  132. package/dist/contract/history/actor-journal.service.mjs +67 -0
  133. package/dist/contract/history/history-entry.pure.d.mts +79 -0
  134. package/dist/contract/history/history-entry.pure.mjs +95 -0
  135. package/dist/contract/hosted/handler-failed.errors.d.mts +16 -0
  136. package/dist/contract/hosted/handler-failed.errors.mjs +14 -0
  137. package/dist/contract/hosted/handler-failure.pure.d.mts +21 -0
  138. package/dist/contract/hosted/handler-failure.pure.mjs +86 -0
  139. package/dist/contract/hosted/hosted-actor.service.d.mts +23 -0
  140. package/dist/contract/hosted/hosted-actor.service.mjs +64 -0
  141. package/dist/contract/hosted/hosted-command.service.d.mts +20 -0
  142. package/dist/contract/hosted/hosted-command.service.mjs +88 -0
  143. package/dist/contract/hosted/hosted-create.service.d.mts +17 -0
  144. package/dist/contract/hosted/hosted-create.service.mjs +67 -0
  145. package/dist/contract/hosted/hosted-error.contract.d.mts +11 -0
  146. package/dist/contract/hosted/hosted-error.contract.mjs +1 -0
  147. package/dist/contract/hosted/hosted-failure.schema.d.mts +18 -0
  148. package/dist/contract/hosted/hosted-failure.schema.mjs +31 -0
  149. package/dist/contract/hosted/hosted-outcome.contract.d.mts +18 -0
  150. package/dist/contract/hosted/hosted-outcome.contract.mjs +1 -0
  151. package/dist/contract/hosted/hosted-query.service.d.mts +16 -0
  152. package/dist/contract/hosted/hosted-query.service.mjs +42 -0
  153. package/dist/contract/hosted/hosted-request.pure.d.mts +61 -0
  154. package/dist/contract/hosted/hosted-request.pure.mjs +91 -0
  155. package/dist/contract/job/job-id.pure.d.mts +11 -0
  156. package/dist/contract/job/job-id.pure.mjs +20 -0
  157. package/dist/contract/job/job-patches.contract.d.mts +32 -0
  158. package/dist/contract/job/job-patches.contract.mjs +45 -0
  159. package/dist/contract/job/job-signal.schema.d.mts +13 -0
  160. package/dist/contract/job/job-signal.schema.mjs +16 -0
  161. package/dist/contract/job/reserved-payload-field.errors.d.mts +10 -0
  162. package/dist/contract/job/reserved-payload-field.errors.mjs +8 -0
  163. package/dist/contract/job/started-job.schema.d.mts +7 -0
  164. package/dist/contract/job/started-job.schema.mjs +8 -0
  165. package/dist/contract/json-codec.pure.d.mts +7 -0
  166. package/dist/contract/json-codec.pure.mjs +14 -0
  167. package/dist/contract/room.contract.d.mts +75 -0
  168. package/dist/contract/room.contract.mjs +36 -0
  169. package/dist/contract/secret/actor-secrets.adapter.d.mts +33 -0
  170. package/dist/contract/secret/actor-secrets.adapter.mjs +38 -0
  171. package/dist/contract/secret/invalid-secret-name.errors.d.mts +10 -0
  172. package/dist/contract/secret/invalid-secret-name.errors.mjs +8 -0
  173. package/dist/contract/secret/secret-unavailable.errors.d.mts +11 -0
  174. package/dist/contract/secret/secret-unavailable.errors.mjs +10 -0
  175. package/dist/contract/secret/secret.schema.d.mts +25 -0
  176. package/dist/contract/secret/secret.schema.mjs +34 -0
  177. package/dist/contract/spend/billing-unavailable.errors.d.mts +12 -0
  178. package/dist/contract/spend/billing-unavailable.errors.mjs +8 -0
  179. package/dist/contract/spend/spend-cap-reached.errors.d.mts +17 -0
  180. package/dist/contract/spend/spend-cap-reached.errors.mjs +15 -0
  181. package/dist/contract/state/actor-state.pure.d.mts +38 -0
  182. package/dist/contract/state/actor-state.pure.mjs +153 -0
  183. package/dist/contract/state/actor-state.service.d.mts +45 -0
  184. package/dist/contract/state/actor-state.service.mjs +18 -0
  185. package/dist/contract/state/state-migration.pure.d.mts +11 -0
  186. package/dist/contract/state/state-migration.pure.mjs +23 -0
  187. package/dist/contract/state/state-read.pure.d.mts +12 -0
  188. package/dist/contract/state/state-read.pure.mjs +22 -0
  189. package/dist/contract/state/state-unreadable.errors.d.mts +9 -0
  190. package/dist/contract/state/state-unreadable.errors.mjs +7 -0
  191. package/dist/host/actor/actor-database.service.d.mts +46 -0
  192. package/dist/host/actor/actor-database.service.mjs +112 -0
  193. package/dist/host/actor/actor-exclusive.pure.d.mts +7 -0
  194. package/dist/host/actor/actor-exclusive.pure.mjs +16 -0
  195. package/dist/host/actor/actor-records.sql.d.mts +29 -0
  196. package/dist/host/actor/actor-records.sql.mjs +26 -0
  197. package/dist/host/actor/reserved-name.errors.d.mts +10 -0
  198. package/dist/host/actor/reserved-name.errors.mjs +8 -0
  199. package/dist/host/actor/reserved-names.pure.d.mts +15 -0
  200. package/dist/host/actor/reserved-names.pure.mjs +20 -0
  201. package/dist/host/actor/room.actor.d.mts +4 -0
  202. package/dist/host/actor/room.actor.mjs +36 -0
  203. package/dist/host/blob/blob-frames.pure.d.mts +7 -0
  204. package/dist/host/blob/blob-frames.pure.mjs +28 -0
  205. package/dist/host/blob/blob-grant.schema.d.mts +14 -0
  206. package/dist/host/blob/blob-grant.schema.mjs +15 -0
  207. package/dist/host/blob/blob-grants.service.d.mts +28 -0
  208. package/dist/host/blob/blob-grants.service.mjs +129 -0
  209. package/dist/host/blob/blob-keyring.service.d.mts +18 -0
  210. package/dist/host/blob/blob-keyring.service.mjs +4 -0
  211. package/dist/host/blob/blob-range.pure.d.mts +13 -0
  212. package/dist/host/blob/blob-range.pure.mjs +23 -0
  213. package/dist/host/blob/blob-sealing.contract.d.mts +37 -0
  214. package/dist/host/blob/blob-sealing.contract.mjs +1 -0
  215. package/dist/host/blob/blob-sealing.service.d.mts +11 -0
  216. package/dist/host/blob/blob-sealing.service.mjs +16 -0
  217. package/dist/host/blob/export/blob-archive.sql.d.mts +21 -0
  218. package/dist/host/blob/export/blob-archive.sql.mjs +75 -0
  219. package/dist/host/blob/export/blob-export-holds.sql.d.mts +49 -0
  220. package/dist/host/blob/export/blob-export-holds.sql.mjs +25 -0
  221. package/dist/host/blob/plain-blob-sealing.pure.d.mts +5 -0
  222. package/dist/host/blob/plain-blob-sealing.pure.mjs +55 -0
  223. package/dist/host/blob/reference/blob-catalog.sql.d.mts +40 -0
  224. package/dist/host/blob/reference/blob-catalog.sql.mjs +145 -0
  225. package/dist/host/blob/reference/blob-coordinator.pure.d.mts +10 -0
  226. package/dist/host/blob/reference/blob-coordinator.pure.mjs +153 -0
  227. package/dist/host/blob/reference/blob-file-page.sql.d.mts +13 -0
  228. package/dist/host/blob/reference/blob-file-page.sql.mjs +21 -0
  229. package/dist/host/blob/reference/blob-forks.sql.d.mts +21 -0
  230. package/dist/host/blob/reference/blob-forks.sql.mjs +40 -0
  231. package/dist/host/blob/reference/blob-lineage.sql.d.mts +14 -0
  232. package/dist/host/blob/reference/blob-lineage.sql.mjs +24 -0
  233. package/dist/host/blob/reference/blob-reads.pure.d.mts +15 -0
  234. package/dist/host/blob/reference/blob-reads.pure.mjs +97 -0
  235. package/dist/host/blob/reference/blob-receipts.sql.d.mts +71 -0
  236. package/dist/host/blob/reference/blob-receipts.sql.mjs +176 -0
  237. package/dist/host/blob/reference/blob-transfer-adopt.pure.d.mts +21 -0
  238. package/dist/host/blob/reference/blob-transfer-adopt.pure.mjs +68 -0
  239. package/dist/host/blob/reference/blob-transfer-fork.pure.d.mts +15 -0
  240. package/dist/host/blob/reference/blob-transfer-fork.pure.mjs +125 -0
  241. package/dist/host/blob/reference/blob-transfer-upkeep.pure.d.mts +18 -0
  242. package/dist/host/blob/reference/blob-transfer-upkeep.pure.mjs +54 -0
  243. package/dist/host/blob/reference/blob-transfer.pure.d.mts +85 -0
  244. package/dist/host/blob/reference/blob-transfer.pure.mjs +1 -0
  245. package/dist/host/blob/sealed-blob-sealing.pure.d.mts +10 -0
  246. package/dist/host/blob/sealed-blob-sealing.pure.mjs +130 -0
  247. package/dist/host/blob/stream/blob-directory.pure.d.mts +18 -0
  248. package/dist/host/blob/stream/blob-directory.pure.mjs +84 -0
  249. package/dist/host/blob/stream/blob-length.pure.d.mts +9 -0
  250. package/dist/host/blob/stream/blob-length.pure.mjs +19 -0
  251. package/dist/host/blob/stream/blob-writing.pure.d.mts +8 -0
  252. package/dist/host/blob/stream/blob-writing.pure.mjs +15 -0
  253. package/dist/host/command/batch/command-batch.sql.d.mts +61 -0
  254. package/dist/host/command/batch/command-batch.sql.mjs +100 -0
  255. package/dist/host/command/command-context.adapter.d.mts +47 -0
  256. package/dist/host/command/command-context.adapter.mjs +90 -0
  257. package/dist/host/command/command-id-age.pure.d.mts +13 -0
  258. package/dist/host/command/command-id-age.pure.mjs +31 -0
  259. package/dist/host/command/command-id-reuse.pure.d.mts +28 -0
  260. package/dist/host/command/command-id-reuse.pure.mjs +38 -0
  261. package/dist/host/command/command-id-reused.errors.d.mts +13 -0
  262. package/dist/host/command/command-id-reused.errors.mjs +11 -0
  263. package/dist/host/command/command-journal.sql.d.mts +84 -0
  264. package/dist/host/command/command-journal.sql.mjs +74 -0
  265. package/dist/host/command/command-rejected.errors.d.mts +8 -0
  266. package/dist/host/command/command-rejected.errors.mjs +4 -0
  267. package/dist/host/command/command-replay.service.d.mts +62 -0
  268. package/dist/host/command/command-replay.service.mjs +140 -0
  269. package/dist/host/command/command-reply.pure.d.mts +8 -0
  270. package/dist/host/command/command-reply.pure.mjs +12 -0
  271. package/dist/host/command/command-runner.service.d.mts +68 -0
  272. package/dist/host/command/command-runner.service.mjs +215 -0
  273. package/dist/host/command/files/command-file-inputs.sql.d.mts +51 -0
  274. package/dist/host/command/files/command-file-inputs.sql.mjs +59 -0
  275. package/dist/host/command/history-pruned.errors.d.mts +10 -0
  276. package/dist/host/command/history-pruned.errors.mjs +8 -0
  277. package/dist/host/command/replay/replay-cursor-stalled.errors.d.mts +9 -0
  278. package/dist/host/command/replay/replay-cursor-stalled.errors.mjs +7 -0
  279. package/dist/host/command/replay/replay-cursor.pure.d.mts +7 -0
  280. package/dist/host/command/replay/replay-cursor.pure.mjs +12 -0
  281. package/dist/host/computer/computer-steps.sql.d.mts +14 -0
  282. package/dist/host/computer/computer-steps.sql.mjs +76 -0
  283. package/dist/host/computer/job-computers.service.d.mts +20 -0
  284. package/dist/host/computer/job-computers.service.mjs +59 -0
  285. package/dist/host/computer/local-computer-files.layer.d.mts +11 -0
  286. package/dist/host/computer/local-computer-files.layer.mjs +69 -0
  287. package/dist/host/computer/local-computer-log.layer.d.mts +23 -0
  288. package/dist/host/computer/local-computer-log.layer.mjs +64 -0
  289. package/dist/host/computer/local-computer-records.layer.d.mts +190 -0
  290. package/dist/host/computer/local-computer-records.layer.mjs +99 -0
  291. package/dist/host/computer/local-computer.schema.d.mts +69 -0
  292. package/dist/host/computer/local-computer.schema.mjs +29 -0
  293. package/dist/host/computer/local-computers.adapter.d.mts +18 -0
  294. package/dist/host/computer/local-computers.adapter.mjs +248 -0
  295. package/dist/host/computer/local-step.layer.d.mts +30 -0
  296. package/dist/host/computer/local-step.layer.mjs +119 -0
  297. package/dist/host/file/actor-file-storage.sql.d.mts +15 -0
  298. package/dist/host/file/actor-file-storage.sql.mjs +82 -0
  299. package/dist/host/file/actor-files.sql.d.mts +9 -0
  300. package/dist/host/file/actor-files.sql.mjs +3 -0
  301. package/dist/host/file/blob-home-lock.pure.d.mts +8 -0
  302. package/dist/host/file/blob-home-lock.pure.mjs +10 -0
  303. package/dist/host/file/blob-home.sql.d.mts +19 -0
  304. package/dist/host/file/blob-home.sql.mjs +30 -0
  305. package/dist/host/file/local-blob-home.service.d.mts +16 -0
  306. package/dist/host/file/local-blob-home.service.mjs +43 -0
  307. package/dist/host/file/local-blob-owner.sql.d.mts +30 -0
  308. package/dist/host/file/local-blob-owner.sql.mjs +68 -0
  309. package/dist/host/file/local-file-upkeep.pure.d.mts +12 -0
  310. package/dist/host/file/local-file-upkeep.pure.mjs +41 -0
  311. package/dist/host/file/replay-file-storage.sql.d.mts +7 -0
  312. package/dist/host/file/replay-file-storage.sql.mjs +26 -0
  313. package/dist/host/fork/actor-fork.sql.d.mts +52 -0
  314. package/dist/host/fork/actor-fork.sql.mjs +42 -0
  315. package/dist/host/fork/fork-computers.adapter.d.mts +43 -0
  316. package/dist/host/fork/fork-computers.adapter.mjs +193 -0
  317. package/dist/host/hash/blob-hashing.service.d.mts +10 -0
  318. package/dist/host/hash/blob-hashing.service.mjs +4 -0
  319. package/dist/host/job/job-durables.sql.d.mts +44 -0
  320. package/dist/host/job/job-durables.sql.mjs +136 -0
  321. package/dist/host/job/job-engine.adapter.d.mts +33 -0
  322. package/dist/host/job/job-engine.adapter.mjs +258 -0
  323. package/dist/host/job/job-journal.sql.d.mts +85 -0
  324. package/dist/host/job/job-journal.sql.mjs +109 -0
  325. package/dist/host/job/job-results.service.d.mts +37 -0
  326. package/dist/host/job/job-results.service.mjs +63 -0
  327. package/dist/host/job/job-runs.pure.d.mts +103 -0
  328. package/dist/host/job/job-runs.pure.mjs +193 -0
  329. package/dist/host/job/undelivered-result.pure.d.mts +49 -0
  330. package/dist/host/job/undelivered-result.pure.mjs +147 -0
  331. package/dist/host/layout/actor-layout.sql.d.mts +8 -0
  332. package/dist/host/layout/actor-layout.sql.mjs +33 -0
  333. package/dist/host/layout/layout-version.errors.d.mts +10 -0
  334. package/dist/host/layout/layout-version.errors.mjs +8 -0
  335. package/dist/host/layout/layout-version.pure.d.mts +10 -0
  336. package/dist/host/layout/layout-version.pure.mjs +14 -0
  337. package/dist/host/migration/actor-migrations.service.d.mts +46 -0
  338. package/dist/host/migration/actor-migrations.service.mjs +143 -0
  339. package/dist/host/migration/migration-edited.errors.d.mts +9 -0
  340. package/dist/host/migration/migration-edited.errors.mjs +7 -0
  341. package/dist/host/migration/migration-failed.errors.d.mts +12 -0
  342. package/dist/host/migration/migration-failed.errors.mjs +10 -0
  343. package/dist/host/migration/migration-failure.pure.d.mts +9 -0
  344. package/dist/host/migration/migration-failure.pure.mjs +19 -0
  345. package/dist/host/migration/migration-hasher.adapter.d.mts +15 -0
  346. package/dist/host/migration/migration-hasher.adapter.mjs +40 -0
  347. package/dist/host/migration/migration-missing.errors.d.mts +9 -0
  348. package/dist/host/migration/migration-missing.errors.mjs +7 -0
  349. package/dist/host/migration/migration-plan.pure.d.mts +20 -0
  350. package/dist/host/migration/migration-plan.pure.mjs +32 -0
  351. package/dist/host/outbox/actor-outbox.sql.d.mts +33 -0
  352. package/dist/host/outbox/actor-outbox.sql.mjs +28 -0
  353. package/dist/host/outbox/outbox-acknowledgements.sql.d.mts +12 -0
  354. package/dist/host/outbox/outbox-acknowledgements.sql.mjs +47 -0
  355. package/dist/host/outbox/outbox-runner.service.d.mts +37 -0
  356. package/dist/host/outbox/outbox-runner.service.mjs +155 -0
  357. package/dist/host/query/query-policy.pure.d.mts +15 -0
  358. package/dist/host/query/query-policy.pure.mjs +12 -0
  359. package/dist/host/query/query-runner.service.d.mts +42 -0
  360. package/dist/host/query/query-runner.service.mjs +72 -0
  361. package/dist/host/sqlite/actor-connections.pure.d.mts +26 -0
  362. package/dist/host/sqlite/actor-connections.pure.mjs +4 -0
  363. package/dist/host/sqlite/sqlite-connection.adapter.d.mts +22 -0
  364. package/dist/host/sqlite/sqlite-connection.adapter.mjs +151 -0
  365. package/dist/host/sqlite/sqlite-driver.service.d.mts +33 -0
  366. package/dist/host/sqlite/sqlite-driver.service.mjs +88 -0
  367. package/dist/host/sqlite/sqlite-parameters.pure.d.mts +5 -0
  368. package/dist/host/sqlite/sqlite-parameters.pure.mjs +21 -0
  369. package/dist/host/sqlite/sqlite-reason.pure.d.mts +8 -0
  370. package/dist/host/sqlite/sqlite-reason.pure.mjs +13 -0
  371. package/dist/host/timer/actor-timers.sql.d.mts +32 -0
  372. package/dist/host/timer/actor-timers.sql.mjs +8 -0
  373. package/dist/host/timer/timer-runner.service.d.mts +26 -0
  374. package/dist/host/timer/timer-runner.service.mjs +68 -0
  375. package/dist/host/upkeep/actor-due.sql.d.mts +26 -0
  376. package/dist/host/upkeep/actor-due.sql.mjs +43 -0
  377. package/dist/host/upkeep/actor-upkeep.service.d.mts +55 -0
  378. package/dist/host/upkeep/actor-upkeep.service.mjs +218 -0
  379. package/dist/host/upkeep/execution-authority.pure.d.mts +19 -0
  380. package/dist/host/upkeep/execution-authority.pure.mjs +10 -0
  381. package/dist/runtime/akter-local.layer.d.mts +28 -0
  382. package/dist/runtime/akter-local.layer.mjs +24 -0
  383. package/dist/runtime/akter.layer.d.mts +91 -0
  384. package/dist/runtime/akter.layer.mjs +99 -0
  385. package/dist/runtime/blob-hashing.layer.d.mts +4 -0
  386. package/dist/runtime/blob-hashing.layer.mjs +15 -0
  387. package/dist/runtime/hosted-environment.layer.d.mts +34 -0
  388. package/dist/runtime/hosted-environment.layer.mjs +40 -0
  389. package/dist/runtime/http-server.layer.d.mts +9 -0
  390. package/dist/runtime/http-server.layer.mjs +15 -0
  391. package/dist/runtime/local-actor-engine.layer.d.mts +10 -0
  392. package/dist/runtime/local-actor-engine.layer.mjs +14 -0
  393. package/dist/runtime/local-engine.layer.d.mts +15 -0
  394. package/dist/runtime/local-engine.layer.mjs +14 -0
  395. package/dist/runtime/local-environments.layer.d.mts +24 -0
  396. package/dist/runtime/local-environments.layer.mjs +159 -0
  397. package/dist/runtime/local-file-clients.layer.d.mts +13 -0
  398. package/dist/runtime/local-file-clients.layer.mjs +78 -0
  399. package/dist/runtime/local-job-runtime.layer.d.mts +19 -0
  400. package/dist/runtime/local-job-runtime.layer.mjs +21 -0
  401. package/dist/serve/archive/archived-actors.layer.d.mts +17 -0
  402. package/dist/serve/archive/archived-actors.layer.mjs +84 -0
  403. package/dist/serve/archive/archived-store.layer.d.mts +12 -0
  404. package/dist/serve/archive/archived-store.layer.mjs +40 -0
  405. package/dist/serve/engine/actor-engine.layer.d.mts +8 -0
  406. package/dist/serve/engine/actor-engine.layer.mjs +30 -0
  407. package/dist/serve/engine/actor-fork.service.d.mts +63 -0
  408. package/dist/serve/engine/actor-fork.service.mjs +277 -0
  409. package/dist/serve/engine/actor-holding.pure.d.mts +7 -0
  410. package/dist/serve/engine/actor-holding.pure.mjs +9 -0
  411. package/dist/serve/engine/actor-host.service.d.mts +66 -0
  412. package/dist/serve/engine/actor-host.service.mjs +209 -0
  413. package/dist/serve/engine/actor-location.service.d.mts +38 -0
  414. package/dist/serve/engine/actor-location.service.mjs +109 -0
  415. package/dist/serve/engine/actor-residents.pure.d.mts +92 -0
  416. package/dist/serve/engine/actor-residents.pure.mjs +201 -0
  417. package/dist/serve/engine/actor-shard.pure.d.mts +4 -0
  418. package/dist/serve/engine/actor-shard.pure.mjs +8 -0
  419. package/dist/serve/engine/actor-state.pure.d.mts +17 -0
  420. package/dist/serve/engine/actor-state.pure.mjs +20 -0
  421. package/dist/serve/engine/actors-not-hosted.errors.d.mts +9 -0
  422. package/dist/serve/engine/actors-not-hosted.errors.mjs +7 -0
  423. package/dist/serve/engine/job-runtime.layer.d.mts +6 -0
  424. package/dist/serve/engine/job-runtime.layer.mjs +5 -0
  425. package/dist/serve/environment/environment-already-exists.errors.d.mts +10 -0
  426. package/dist/serve/environment/environment-already-exists.errors.mjs +9 -0
  427. package/dist/serve/environment/environment-in-use.errors.d.mts +10 -0
  428. package/dist/serve/environment/environment-in-use.errors.mjs +14 -0
  429. package/dist/serve/environment/environment-not-found.errors.d.mts +10 -0
  430. package/dist/serve/environment/environment-not-found.errors.mjs +9 -0
  431. package/dist/serve/environment/environment-records.sql.d.mts +92 -0
  432. package/dist/serve/environment/environment-records.sql.mjs +59 -0
  433. package/dist/serve/environment/environment-store.sql.d.mts +38 -0
  434. package/dist/serve/environment/environment-store.sql.mjs +78 -0
  435. package/dist/serve/environment/local-environment.schema.d.mts +38 -0
  436. package/dist/serve/environment/local-environment.schema.mjs +43 -0
  437. package/dist/serve/environment/local-environments.service.d.mts +44 -0
  438. package/dist/serve/environment/local-environments.service.mjs +196 -0
  439. package/dist/serve/environment/promotion-notice.pure.d.mts +22 -0
  440. package/dist/serve/environment/promotion-notice.pure.mjs +30 -0
  441. package/dist/serve/environment/snapshot-operations.sql.d.mts +32 -0
  442. package/dist/serve/environment/snapshot-operations.sql.mjs +131 -0
  443. package/dist/serve/environment/store-snapshot.sql.d.mts +32 -0
  444. package/dist/serve/environment/store-snapshot.sql.mjs +74 -0
  445. package/dist/serve/erasure/local-actor-erasure.service.d.mts +26 -0
  446. package/dist/serve/erasure/local-actor-erasure.service.mjs +102 -0
  447. package/dist/serve/history/actor-host-runners.service.d.mts +23 -0
  448. package/dist/serve/history/actor-host-runners.service.mjs +35 -0
  449. package/dist/serve/hosted/hosted-app-build.errors.d.mts +13 -0
  450. package/dist/serve/hosted/hosted-app-build.errors.mjs +9 -0
  451. package/dist/serve/hosted/hosted-app-checks.layer.d.mts +15 -0
  452. package/dist/serve/hosted/hosted-app-checks.layer.mjs +32 -0
  453. package/dist/serve/hosted/hosted-file-forward.layer.d.mts +22 -0
  454. package/dist/serve/hosted/hosted-file-forward.layer.mjs +42 -0
  455. package/dist/serve/hosted/hosted-file-rpcs.layer.d.mts +25 -0
  456. package/dist/serve/hosted/hosted-file-rpcs.layer.mjs +82 -0
  457. package/dist/serve/hosted/hosted-file-server.layer.d.mts +18 -0
  458. package/dist/serve/hosted/hosted-file-server.layer.mjs +33 -0
  459. package/dist/serve/hosted/hosted-files.layer.d.mts +32 -0
  460. package/dist/serve/hosted/hosted-files.layer.mjs +55 -0
  461. package/dist/serve/hosted/hosted-runtime.layer.d.mts +42 -0
  462. package/dist/serve/hosted/hosted-runtime.layer.mjs +48 -0
  463. package/dist/serve/hosted/hosted-runtime.service.d.mts +77 -0
  464. package/dist/serve/hosted/hosted-runtime.service.mjs +74 -0
  465. package/dist/serve/hosted/hosted-secrets.layer.d.mts +10 -0
  466. package/dist/serve/hosted/hosted-secrets.layer.mjs +28 -0
  467. package/dist/serve/http/loopback-host.pure.d.mts +11 -0
  468. package/dist/serve/http/loopback-host.pure.mjs +29 -0
  469. package/dist/serve/inspect/actor-inspection.schema.d.mts +119 -0
  470. package/dist/serve/inspect/actor-inspection.schema.mjs +75 -0
  471. package/dist/serve/inspect/actor-inspection.sql.d.mts +12 -0
  472. package/dist/serve/inspect/actor-inspection.sql.mjs +43 -0
  473. package/dist/serve/inspect/inspect.service.d.mts +24 -0
  474. package/dist/serve/inspect/inspect.service.mjs +92 -0
  475. package/dist/serve/inspect/inspector-page.pure.d.mts +2 -0
  476. package/dist/serve/inspect/inspector-page.pure.mjs +155 -0
  477. package/dist/serve/inspect/inspector-wal.pure.d.mts +3 -0
  478. package/dist/serve/inspect/inspector-wal.pure.mjs +19 -0
  479. package/dist/serve/inspect/inspector.handlers.d.mts +5 -0
  480. package/dist/serve/inspect/inspector.handlers.mjs +50 -0
  481. package/dist/serve/inspect/inspector.layer.d.mts +9 -0
  482. package/dist/serve/inspect/inspector.layer.mjs +14 -0
  483. package/dist/serve/live/live-reads.service.d.mts +44 -0
  484. package/dist/serve/live/live-reads.service.mjs +152 -0
  485. package/dist/serve/live/live-tables.sql.d.mts +35 -0
  486. package/dist/serve/live/live-tables.sql.mjs +66 -0
  487. package/dist/serve/live/state-reads.pure.d.mts +11 -0
  488. package/dist/serve/live/state-reads.pure.mjs +7 -0
  489. package/dist/serve/rpc/actor-rpc.handlers.d.mts +24 -0
  490. package/dist/serve/rpc/actor-rpc.handlers.mjs +142 -0
  491. package/dist/serve/rpc/akter-server.layer.d.mts +18 -0
  492. package/dist/serve/rpc/akter-server.layer.mjs +61 -0
  493. package/dist/serve/rpc/computer/computer-copy.layer.d.mts +22 -0
  494. package/dist/serve/rpc/computer/computer-copy.layer.mjs +70 -0
  495. package/dist/serve/rpc/computer/computer-rpc-access.pure.d.mts +29 -0
  496. package/dist/serve/rpc/computer/computer-rpc-access.pure.mjs +46 -0
  497. package/dist/serve/rpc/computer/computer-rpc.layer.d.mts +39 -0
  498. package/dist/serve/rpc/computer/computer-rpc.layer.mjs +84 -0
  499. package/dist/serve/rpc/computer/step-rpc.handlers.d.mts +23 -0
  500. package/dist/serve/rpc/computer/step-rpc.handlers.mjs +43 -0
  501. package/dist/serve/rpc/development-authentication.handlers.d.mts +7 -0
  502. package/dist/serve/rpc/development-authentication.handlers.mjs +19 -0
  503. package/dist/serve/rpc/development-guard.pure.d.mts +10 -0
  504. package/dist/serve/rpc/development-guard.pure.mjs +16 -0
  505. package/dist/serve/rpc/file/file-rpc-access.pure.d.mts +55 -0
  506. package/dist/serve/rpc/file/file-rpc-access.pure.mjs +67 -0
  507. package/dist/serve/rpc/file/file-rpc.layer.d.mts +53 -0
  508. package/dist/serve/rpc/file/file-rpc.layer.mjs +143 -0
  509. package/dist/serve/rpc/file/upload-sessions.pure.d.mts +45 -0
  510. package/dist/serve/rpc/file/upload-sessions.pure.mjs +187 -0
  511. package/dist/serve/rpc/in-process-client.layer.d.mts +13 -0
  512. package/dist/serve/rpc/in-process-client.layer.mjs +34 -0
  513. package/dist/serve/rpc/listener-not-loopback.errors.d.mts +9 -0
  514. package/dist/serve/rpc/listener-not-loopback.errors.mjs +7 -0
  515. package/dist/serve/rpc/ndjson-only.pure.d.mts +5 -0
  516. package/dist/serve/rpc/ndjson-only.pure.mjs +14 -0
  517. package/dist/serve/rpc/served-rpc.layer.d.mts +6 -0
  518. package/dist/serve/rpc/served-rpc.layer.mjs +19 -0
  519. package/dist/serve/store/actor-not-migrated.errors.d.mts +10 -0
  520. package/dist/serve/store/actor-not-migrated.errors.mjs +8 -0
  521. package/dist/serve/store/store-migrations.layer.d.mts +5 -0
  522. package/dist/serve/store/store-migrations.layer.mjs +18 -0
  523. package/dist/serve/store/store-migrations.service.d.mts +26 -0
  524. package/dist/serve/store/store-migrations.service.mjs +47 -0
  525. package/dist/serve/store/store-unreadable.errors.d.mts +9 -0
  526. package/dist/serve/store/store-unreadable.errors.mjs +7 -0
  527. package/dist/serve/verify/verify.layer.d.mts +16 -0
  528. package/dist/serve/verify/verify.layer.mjs +36 -0
  529. package/dist/testing/story-driver.service.d.mts +29 -0
  530. package/dist/testing/story-driver.service.mjs +126 -0
  531. package/dist/testing/story.layer.d.mts +21 -0
  532. package/dist/testing/story.layer.mjs +42 -0
  533. package/package.json +106 -3
  534. package/src/contract/actor/actor-already-exists.errors.ts +8 -0
  535. package/src/contract/actor/actor-definition.pure.ts +157 -0
  536. package/src/contract/actor/actor-erased.errors.ts +8 -0
  537. package/src/contract/actor/actor-names.pure.ts +64 -0
  538. package/src/contract/actor/actor-not-created.errors.ts +8 -0
  539. package/src/contract/actor/actor-not-registered.errors.ts +8 -0
  540. package/src/contract/actor/actor-registry.service.ts +35 -0
  541. package/src/contract/actor/actor.contract.ts +409 -0
  542. package/src/contract/actor/host-interface.pure.ts +60 -0
  543. package/src/contract/actor/reserved-member.errors.ts +9 -0
  544. package/src/contract/akter.service.ts +233 -0
  545. package/src/contract/caller/authentication.api.ts +9 -0
  546. package/src/contract/caller/caller-admission.pure.ts +90 -0
  547. package/src/contract/caller/caller-not-allowed.errors.ts +26 -0
  548. package/src/contract/caller/caller.schema.ts +7 -0
  549. package/src/contract/caller/current-caller.service.ts +7 -0
  550. package/src/contract/caller/principal.schema.ts +13 -0
  551. package/src/contract/caller/unauthenticated.errors.ts +8 -0
  552. package/src/contract/client/actor-client.adapter.ts +217 -0
  553. package/src/contract/client/actor-client.contract.ts +53 -0
  554. package/src/contract/client/actor-rpc.contract.ts +91 -0
  555. package/src/contract/client/actor-unavailable.errors.ts +9 -0
  556. package/src/contract/client/client-failure.contract.ts +53 -0
  557. package/src/contract/client/invalid-request.errors.ts +9 -0
  558. package/src/contract/client/storage-limit.errors.ts +16 -0
  559. package/src/contract/command/command-id-expired.errors.ts +11 -0
  560. package/src/contract/command/command-id.schema.ts +5 -0
  561. package/src/contract/command/command.contract.ts +334 -0
  562. package/src/contract/command/outbox-id.pure.ts +25 -0
  563. package/src/contract/command/outbox.schema.ts +11 -0
  564. package/src/contract/command/timer.schema.ts +21 -0
  565. package/src/contract/computer/checkpoint-expired.errors.ts +12 -0
  566. package/src/contract/computer/computer-client-failure.contract.ts +27 -0
  567. package/src/contract/computer/computer-client.adapter.ts +110 -0
  568. package/src/contract/computer/computer-client.contract.ts +75 -0
  569. package/src/contract/computer/computer-held.errors.ts +10 -0
  570. package/src/contract/computer/computer-limit.errors.ts +11 -0
  571. package/src/contract/computer/computer-lost.errors.ts +10 -0
  572. package/src/contract/computer/computer-not-found.errors.ts +9 -0
  573. package/src/contract/computer/computer.schema.ts +159 -0
  574. package/src/contract/computer/computers-unavailable.errors.ts +9 -0
  575. package/src/contract/computer/files/computer-files.schema.ts +31 -0
  576. package/src/contract/computer/rpc/computer-rpc.contract.ts +140 -0
  577. package/src/contract/computer/step/computer-step.contract.ts +126 -0
  578. package/src/contract/computer/step/computer-step.schema.ts +80 -0
  579. package/src/contract/computer/step/step-failure.schema.ts +26 -0
  580. package/src/contract/computer/step/step-not-found.errors.ts +7 -0
  581. package/src/contract/description/published-contract.pure.ts +187 -0
  582. package/src/contract/file/access/file-access-denied.errors.ts +11 -0
  583. package/src/contract/file/access/file-access.contract.ts +56 -0
  584. package/src/contract/file/actor-files.contract.ts +78 -0
  585. package/src/contract/file/blob-transfer.errors.ts +6 -0
  586. package/src/contract/file/file-client-failure.contract.ts +43 -0
  587. package/src/contract/file/file-client.adapter.ts +45 -0
  588. package/src/contract/file/file-client.contract.ts +24 -0
  589. package/src/contract/file/file-listing.pure.ts +30 -0
  590. package/src/contract/file/file-not-found.errors.ts +6 -0
  591. package/src/contract/file/file-path.pure.ts +37 -0
  592. package/src/contract/file/files-unavailable.errors.ts +8 -0
  593. package/src/contract/file/invalid-file-request.errors.ts +9 -0
  594. package/src/contract/file/rpc/file-rpc.contract.ts +148 -0
  595. package/src/contract/file/rpc/file-too-large.errors.ts +10 -0
  596. package/src/contract/file/rpc/rpc-file-clients.layer.ts +184 -0
  597. package/src/contract/fork/fork-rpc.contract.ts +44 -0
  598. package/src/contract/history/actor-journal.service.ts +195 -0
  599. package/src/contract/history/history-entry.pure.ts +282 -0
  600. package/src/contract/hosted/handler-failed.errors.ts +16 -0
  601. package/src/contract/hosted/handler-failure.pure.ts +161 -0
  602. package/src/contract/hosted/hosted-actor.service.ts +97 -0
  603. package/src/contract/hosted/hosted-command.service.ts +114 -0
  604. package/src/contract/hosted/hosted-create.service.ts +95 -0
  605. package/src/contract/hosted/hosted-error.contract.ts +22 -0
  606. package/src/contract/hosted/hosted-failure.schema.ts +32 -0
  607. package/src/contract/hosted/hosted-outcome.contract.ts +21 -0
  608. package/src/contract/hosted/hosted-query.service.ts +50 -0
  609. package/src/contract/hosted/hosted-request.pure.ts +185 -0
  610. package/src/contract/job/job-id.pure.ts +37 -0
  611. package/src/contract/job/job-patches.contract.ts +86 -0
  612. package/src/contract/job/job-signal.schema.ts +23 -0
  613. package/src/contract/job/reserved-payload-field.errors.ts +10 -0
  614. package/src/contract/job/started-job.schema.ts +9 -0
  615. package/src/contract/json-codec.pure.ts +27 -0
  616. package/src/contract/room.contract.ts +31 -0
  617. package/src/contract/secret/actor-secrets.adapter.ts +87 -0
  618. package/src/contract/secret/invalid-secret-name.errors.ts +10 -0
  619. package/src/contract/secret/secret-unavailable.errors.ts +13 -0
  620. package/src/contract/secret/secret.schema.ts +43 -0
  621. package/src/contract/spend/billing-unavailable.errors.ts +12 -0
  622. package/src/contract/spend/spend-cap-reached.errors.ts +17 -0
  623. package/src/contract/state/actor-state.pure.ts +192 -0
  624. package/src/contract/state/actor-state.service.ts +69 -0
  625. package/src/contract/state/state-migration.pure.ts +57 -0
  626. package/src/contract/state/state-read.pure.ts +40 -0
  627. package/src/contract/state/state-unreadable.errors.ts +9 -0
  628. package/src/host/actor/actor-database.service.ts +145 -0
  629. package/src/host/actor/actor-exclusive.pure.ts +32 -0
  630. package/src/host/actor/actor-records.sql.ts +78 -0
  631. package/src/host/actor/reserved-name.errors.ts +10 -0
  632. package/src/host/actor/reserved-names.pure.ts +40 -0
  633. package/src/host/actor/room.actor.ts +57 -0
  634. package/src/host/blob/blob-frames.pure.ts +52 -0
  635. package/src/host/blob/blob-grant.schema.ts +22 -0
  636. package/src/host/blob/blob-grants.service.ts +197 -0
  637. package/src/host/blob/blob-keyring.service.ts +25 -0
  638. package/src/host/blob/blob-range.pure.ts +33 -0
  639. package/src/host/blob/blob-sealing.contract.ts +46 -0
  640. package/src/host/blob/blob-sealing.service.ts +25 -0
  641. package/src/host/blob/export/blob-archive.sql.ts +153 -0
  642. package/src/host/blob/export/blob-export-holds.sql.ts +91 -0
  643. package/src/host/blob/plain-blob-sealing.pure.ts +70 -0
  644. package/src/host/blob/reference/blob-catalog.sql.ts +339 -0
  645. package/src/host/blob/reference/blob-coordinator.pure.ts +217 -0
  646. package/src/host/blob/reference/blob-file-page.sql.ts +48 -0
  647. package/src/host/blob/reference/blob-forks.sql.ts +125 -0
  648. package/src/host/blob/reference/blob-lineage.sql.ts +63 -0
  649. package/src/host/blob/reference/blob-reads.pure.ts +172 -0
  650. package/src/host/blob/reference/blob-receipts.sql.ts +375 -0
  651. package/src/host/blob/reference/blob-transfer-adopt.pure.ts +127 -0
  652. package/src/host/blob/reference/blob-transfer-fork.pure.ts +174 -0
  653. package/src/host/blob/reference/blob-transfer-upkeep.pure.ts +132 -0
  654. package/src/host/blob/reference/blob-transfer.pure.ts +127 -0
  655. package/src/host/blob/sealed-blob-sealing.pure.ts +163 -0
  656. package/src/host/blob/stream/blob-directory.pure.ts +177 -0
  657. package/src/host/blob/stream/blob-length.pure.ts +40 -0
  658. package/src/host/blob/stream/blob-writing.pure.ts +49 -0
  659. package/src/host/command/batch/command-batch.sql.ts +207 -0
  660. package/src/host/command/command-context.adapter.ts +134 -0
  661. package/src/host/command/command-id-age.pure.ts +54 -0
  662. package/src/host/command/command-id-reuse.pure.ts +90 -0
  663. package/src/host/command/command-id-reused.errors.ts +13 -0
  664. package/src/host/command/command-journal.sql.ts +232 -0
  665. package/src/host/command/command-rejected.errors.ts +8 -0
  666. package/src/host/command/command-replay.service.ts +223 -0
  667. package/src/host/command/command-reply.pure.ts +21 -0
  668. package/src/host/command/command-runner.service.ts +320 -0
  669. package/src/host/command/files/command-file-inputs.sql.ts +114 -0
  670. package/src/host/command/history-pruned.errors.ts +10 -0
  671. package/src/host/command/replay/replay-cursor-stalled.errors.ts +9 -0
  672. package/src/host/command/replay/replay-cursor.pure.ts +19 -0
  673. package/src/host/computer/computer-steps.sql.ts +120 -0
  674. package/src/host/computer/job-computers.service.ts +84 -0
  675. package/src/host/computer/local-computer-files.layer.ts +103 -0
  676. package/src/host/computer/local-computer-log.layer.ts +115 -0
  677. package/src/host/computer/local-computer-records.layer.ts +205 -0
  678. package/src/host/computer/local-computer.schema.ts +36 -0
  679. package/src/host/computer/local-computers.adapter.ts +379 -0
  680. package/src/host/computer/local-step.layer.ts +174 -0
  681. package/src/host/file/actor-file-storage.sql.ts +79 -0
  682. package/src/host/file/actor-files.sql.ts +15 -0
  683. package/src/host/file/blob-home-lock.pure.ts +23 -0
  684. package/src/host/file/blob-home.sql.ts +55 -0
  685. package/src/host/file/local-blob-home.service.ts +71 -0
  686. package/src/host/file/local-blob-owner.sql.ts +89 -0
  687. package/src/host/file/local-file-upkeep.pure.ts +77 -0
  688. package/src/host/file/replay-file-storage.sql.ts +43 -0
  689. package/src/host/fork/actor-fork.sql.ts +110 -0
  690. package/src/host/fork/fork-computers.adapter.ts +366 -0
  691. package/src/host/hash/blob-hashing.service.ts +14 -0
  692. package/src/host/job/job-durables.sql.ts +214 -0
  693. package/src/host/job/job-engine.adapter.ts +420 -0
  694. package/src/host/job/job-journal.sql.ts +257 -0
  695. package/src/host/job/job-results.service.ts +111 -0
  696. package/src/host/job/job-runs.pure.ts +445 -0
  697. package/src/host/job/undelivered-result.pure.ts +265 -0
  698. package/src/host/layout/actor-layout.sql.ts +45 -0
  699. package/src/host/layout/layout-version.errors.ts +10 -0
  700. package/src/host/layout/layout-version.pure.ts +22 -0
  701. package/src/host/migration/actor-migrations.service.ts +159 -0
  702. package/src/host/migration/migration-edited.errors.ts +9 -0
  703. package/src/host/migration/migration-failed.errors.ts +12 -0
  704. package/src/host/migration/migration-failure.pure.ts +28 -0
  705. package/src/host/migration/migration-hasher.adapter.ts +70 -0
  706. package/src/host/migration/migration-missing.errors.ts +9 -0
  707. package/src/host/migration/migration-plan.pure.ts +66 -0
  708. package/src/host/outbox/actor-outbox.sql.ts +98 -0
  709. package/src/host/outbox/outbox-acknowledgements.sql.ts +93 -0
  710. package/src/host/outbox/outbox-runner.service.ts +253 -0
  711. package/src/host/query/query-policy.pure.ts +31 -0
  712. package/src/host/query/query-runner.service.ts +132 -0
  713. package/src/host/sqlite/actor-connections.pure.ts +44 -0
  714. package/src/host/sqlite/sqlite-connection.adapter.ts +260 -0
  715. package/src/host/sqlite/sqlite-driver.service.ts +151 -0
  716. package/src/host/sqlite/sqlite-parameters.pure.ts +28 -0
  717. package/src/host/sqlite/sqlite-reason.pure.ts +19 -0
  718. package/src/host/timer/actor-timers.sql.ts +67 -0
  719. package/src/host/timer/timer-runner.service.ts +117 -0
  720. package/src/host/upkeep/actor-due.sql.ts +71 -0
  721. package/src/host/upkeep/actor-upkeep.service.ts +404 -0
  722. package/src/host/upkeep/execution-authority.pure.ts +37 -0
  723. package/src/runtime/akter-local.layer.ts +49 -0
  724. package/src/runtime/akter.layer.ts +208 -0
  725. package/src/runtime/blob-hashing.layer.ts +21 -0
  726. package/src/runtime/hosted-environment.layer.ts +85 -0
  727. package/src/runtime/http-server.layer.ts +29 -0
  728. package/src/runtime/local-actor-engine.layer.ts +33 -0
  729. package/src/runtime/local-engine.layer.ts +37 -0
  730. package/src/runtime/local-environments.layer.ts +214 -0
  731. package/src/runtime/local-file-clients.layer.ts +112 -0
  732. package/src/runtime/local-job-runtime.layer.ts +38 -0
  733. package/src/serve/archive/archived-actors.layer.ts +97 -0
  734. package/src/serve/archive/archived-store.layer.ts +46 -0
  735. package/src/serve/engine/actor-engine.layer.ts +46 -0
  736. package/src/serve/engine/actor-fork.service.ts +403 -0
  737. package/src/serve/engine/actor-holding.pure.ts +28 -0
  738. package/src/serve/engine/actor-host.service.ts +454 -0
  739. package/src/serve/engine/actor-location.service.ts +219 -0
  740. package/src/serve/engine/actor-residents.pure.ts +500 -0
  741. package/src/serve/engine/actor-shard.pure.ts +13 -0
  742. package/src/serve/engine/actor-state.pure.ts +45 -0
  743. package/src/serve/engine/actors-not-hosted.errors.ts +9 -0
  744. package/src/serve/engine/job-runtime.layer.ts +13 -0
  745. package/src/serve/environment/environment-already-exists.errors.ts +9 -0
  746. package/src/serve/environment/environment-in-use.errors.ts +17 -0
  747. package/src/serve/environment/environment-not-found.errors.ts +9 -0
  748. package/src/serve/environment/environment-records.sql.ts +208 -0
  749. package/src/serve/environment/environment-store.sql.ts +116 -0
  750. package/src/serve/environment/local-environment.schema.ts +79 -0
  751. package/src/serve/environment/local-environments.service.ts +268 -0
  752. package/src/serve/environment/promotion-notice.pure.ts +63 -0
  753. package/src/serve/environment/snapshot-operations.sql.ts +210 -0
  754. package/src/serve/environment/store-snapshot.sql.ts +128 -0
  755. package/src/serve/erasure/local-actor-erasure.service.ts +170 -0
  756. package/src/serve/history/actor-host-runners.service.ts +85 -0
  757. package/src/serve/hosted/hosted-app-build.errors.ts +11 -0
  758. package/src/serve/hosted/hosted-app-checks.layer.ts +74 -0
  759. package/src/serve/hosted/hosted-file-forward.layer.ts +63 -0
  760. package/src/serve/hosted/hosted-file-rpcs.layer.ts +149 -0
  761. package/src/serve/hosted/hosted-file-server.layer.ts +75 -0
  762. package/src/serve/hosted/hosted-files.layer.ts +76 -0
  763. package/src/serve/hosted/hosted-runtime.layer.ts +145 -0
  764. package/src/serve/hosted/hosted-runtime.service.ts +128 -0
  765. package/src/serve/hosted/hosted-secrets.layer.ts +38 -0
  766. package/src/serve/http/loopback-host.pure.ts +67 -0
  767. package/src/serve/inspect/actor-inspection.schema.ts +94 -0
  768. package/src/serve/inspect/actor-inspection.sql.ts +112 -0
  769. package/src/serve/inspect/inspect.service.ts +173 -0
  770. package/src/serve/inspect/inspector-page.pure.ts +159 -0
  771. package/src/serve/inspect/inspector-wal.pure.ts +40 -0
  772. package/src/serve/inspect/inspector.handlers.ts +103 -0
  773. package/src/serve/inspect/inspector.layer.ts +26 -0
  774. package/src/serve/live/live-reads.service.ts +285 -0
  775. package/src/serve/live/live-tables.sql.ts +148 -0
  776. package/src/serve/live/state-reads.pure.ts +22 -0
  777. package/src/serve/rpc/actor-rpc.handlers.ts +242 -0
  778. package/src/serve/rpc/akter-server.layer.ts +119 -0
  779. package/src/serve/rpc/computer/computer-copy.layer.ts +95 -0
  780. package/src/serve/rpc/computer/computer-rpc-access.pure.ts +75 -0
  781. package/src/serve/rpc/computer/computer-rpc.layer.ts +143 -0
  782. package/src/serve/rpc/computer/step-rpc.handlers.ts +84 -0
  783. package/src/serve/rpc/development-authentication.handlers.ts +28 -0
  784. package/src/serve/rpc/development-guard.pure.ts +39 -0
  785. package/src/serve/rpc/file/file-rpc-access.pure.ts +119 -0
  786. package/src/serve/rpc/file/file-rpc.layer.ts +209 -0
  787. package/src/serve/rpc/file/upload-sessions.pure.ts +363 -0
  788. package/src/serve/rpc/in-process-client.layer.ts +62 -0
  789. package/src/serve/rpc/listener-not-loopback.errors.ts +9 -0
  790. package/src/serve/rpc/ndjson-only.pure.ts +33 -0
  791. package/src/serve/rpc/served-rpc.layer.ts +34 -0
  792. package/src/serve/store/actor-not-migrated.errors.ts +10 -0
  793. package/src/serve/store/store-migrations.layer.ts +35 -0
  794. package/src/serve/store/store-migrations.service.ts +76 -0
  795. package/src/serve/store/store-unreadable.errors.ts +9 -0
  796. package/src/serve/verify/verify.layer.ts +77 -0
  797. package/src/testing/story-driver.service.ts +266 -0
  798. package/src/testing/story.layer.ts +99 -0
@@ -0,0 +1,49 @@
1
+ import { Effect, Option } from "effect";
2
+ import { SqlClient, SqlError } from "effect/sql";
3
+ /** The actor's own connection, which every hold is read and written on. */
4
+ interface OnActor {
5
+ readonly sql: SqlClient.SqlClient;
6
+ }
7
+ /** A snapshot's hold on the actor's files, kept until `now + lifetimeMillis`. */
8
+ interface ExportHold extends OnActor {
9
+ readonly lifetimeMillis: number;
10
+ readonly now: number;
11
+ readonly snapshot: string;
12
+ }
13
+ /** A page of a snapshot's held files after the SHA-256 `after` (the start when missing). */
14
+ interface HeldPage extends OnActor {
15
+ readonly after?: string;
16
+ readonly snapshot: string;
17
+ }
18
+ /** One held file as an export lists it: only its content's SHA-256 and size, never a claim or a grant. */
19
+ interface ExportedFile {
20
+ readonly bytes: number;
21
+ readonly sha256: string;
22
+ }
23
+ interface HeldLookup extends OnActor {
24
+ readonly now: number;
25
+ readonly sha256: string;
26
+ readonly snapshot: string;
27
+ }
28
+ /** What an engine needs to open a held file for the actor: its blob, the claim holding it, and its grant. */
29
+ interface HeldBlob {
30
+ readonly actor: string;
31
+ readonly blob: string;
32
+ readonly bytes: number;
33
+ readonly claim: string;
34
+ readonly grant: string;
35
+ }
36
+ /**
37
+ * Holds every file the actor keeps, at the cut an export snapshot takes, for `lifetimeMillis` after `now`: its
38
+ * linked files, the files its ancestry keeps from a fork, and the receipts its command history keeps. While a hold
39
+ * lasts, a removed file's claim is not released, so its blob stays to be downloaded; once it expires, the release
40
+ * goes ahead. A new hold replaces the actor's previous one, whose snapshot is gone. Run it on the actor's own
41
+ * connection, in the same turn as the snapshot, so no file changes between the two. (`WHERE true` keeps SQLite from
42
+ * reading the upsert's `ON CONFLICT` as a join constraint.)
43
+ */
44
+ declare const holdExportFiles: ({ lifetimeMillis, now, snapshot, sql }: ExportHold) => Effect.Effect<void, SqlError.SqlError>;
45
+ /** A page of a snapshot's held files, one entry per distinct SHA-256, in SHA-256 order. */
46
+ declare const heldExportFiles: ({ after, snapshot, sql }: HeldPage) => Effect.Effect<readonly ExportedFile[], SqlError.SqlError>;
47
+ /** The blob that holds a snapshot's file with this SHA-256, or none once the hold has expired at `now`. */
48
+ declare const heldExportFile: ({ now, sha256, snapshot, sql }: HeldLookup) => Effect.Effect<Option.Option<HeldBlob>, SqlError.SqlError>;
49
+ export { type ExportHold, type ExportedFile, type HeldBlob, type HeldLookup, type HeldPage, heldExportFile, heldExportFiles, holdExportFiles };
@@ -0,0 +1,25 @@
1
+ import { prepareReceipts } from "../reference/blob-receipts.sql.mjs";
2
+ import { Array, Effect } from "effect";
3
+ // src/host/blob/export/blob-export-holds.sql.ts
4
+ const exportPageSize = 100;
5
+ /**
6
+ * Holds every file the actor keeps, at the cut an export snapshot takes, for `lifetimeMillis` after `now`: its
7
+ * linked files, the files its ancestry keeps from a fork, and the receipts its command history keeps. While a hold
8
+ * lasts, a removed file's claim is not released, so its blob stays to be downloaded; once it expires, the release
9
+ * goes ahead. A new hold replaces the actor's previous one, whose snapshot is gone. Run it on the actor's own
10
+ * connection, in the same turn as the snapshot, so no file changes between the two. (`WHERE true` keeps SQLite from
11
+ * reading the upsert's `ON CONFLICT` as a join constraint.)
12
+ */
13
+ const holdExportFiles = ({ lifetimeMillis, now, snapshot, sql }) => sql.withTransaction(Effect.gen(function* holdFiles() {
14
+ const expiresAt = now + lifetimeMillis;
15
+ yield* prepareReceipts(sql);
16
+ yield* sql`DELETE FROM akter_blob_export_holds`;
17
+ yield* sql`INSERT INTO akter_blob_export_holds (snapshot, claim, actor, blob, bytes, sha256, grant, expires_at) SELECT ${snapshot}, claim, actor, blob, bytes, sha256, grant, ${expiresAt} FROM akter_blob_links WHERE true ON CONFLICT DO NOTHING`;
18
+ yield* sql`INSERT INTO akter_blob_export_holds (snapshot, claim, actor, blob, bytes, sha256, grant, expires_at) SELECT ${snapshot}, claim, actor, blob, bytes, sha256, grant, ${expiresAt} FROM akter_blob_ancestry WHERE true ON CONFLICT DO NOTHING`;
19
+ yield* sql`INSERT INTO akter_blob_export_holds (snapshot, claim, actor, blob, bytes, sha256, grant, expires_at) SELECT ${snapshot}, claim, actor, blob, bytes, sha256, grant, ${expiresAt} FROM akter_blob_receipts AS receipt WHERE EXISTS (SELECT 1 FROM akter_blob_history WHERE claim = receipt.claim) ON CONFLICT DO NOTHING`;
20
+ }));
21
+ /** A page of a snapshot's held files, one entry per distinct SHA-256, in SHA-256 order. */
22
+ const heldExportFiles = ({ after = "", snapshot, sql }) => sql`SELECT DISTINCT sha256, bytes FROM akter_blob_export_holds WHERE snapshot = ${snapshot} AND sha256 > ${after} ORDER BY sha256 LIMIT ${exportPageSize}`;
23
+ /** The blob that holds a snapshot's file with this SHA-256, or none once the hold has expired at `now`. */
24
+ const heldExportFile = ({ now, sha256, snapshot, sql }) => Effect.map(sql`SELECT actor, blob, bytes, claim, grant FROM akter_blob_export_holds WHERE snapshot = ${snapshot} AND sha256 = ${sha256} AND expires_at > ${now} ORDER BY claim LIMIT 1`, Array.head);
25
+ export { heldExportFile, heldExportFiles, holdExportFiles };
@@ -0,0 +1,5 @@
1
+ import { BlobHashing } from "../hash/blob-hashing.service.mjs";
2
+ import { BlobSealingOperations } from "./blob-sealing.contract.mjs";
3
+ import { Effect, FileSystem } from "effect";
4
+ declare const plainBlobSealing: (hashing: BlobHashing["Service"]) => Effect.Effect<BlobSealingOperations, never, FileSystem.FileSystem>;
5
+ export { plainBlobSealing };
@@ -0,0 +1,55 @@
1
+ import { rangeOf } from "./blob-range.pure.mjs";
2
+ import { BlobTransferError } from "../../contract/file/blob-transfer.errors.mjs";
3
+ import { exactLength } from "./stream/blob-length.pure.mjs";
4
+ import { blobWriter } from "./stream/blob-writing.pure.mjs";
5
+ import { Effect, FileSystem, Stream } from "effect";
6
+ // src/host/blob/plain-blob-sealing.pure.ts
7
+ const zeroBytes = 0;
8
+ const failed = (blob, message) => BlobTransferError.make({
9
+ blob,
10
+ message
11
+ });
12
+ const sealingWith = (write, hashing) => Effect.fnUntraced(function* seal(request) {
13
+ const hash = yield* hashing.sha256;
14
+ let bytes = zeroBytes;
15
+ const source = Stream.tap(request.source, (chunk) => {
16
+ bytes += chunk.byteLength;
17
+ return hash.update(chunk);
18
+ });
19
+ yield* write({
20
+ ...request,
21
+ source
22
+ });
23
+ const sha256 = yield* hash.digest;
24
+ return {
25
+ bytes,
26
+ grant: "",
27
+ sha256
28
+ };
29
+ });
30
+ const openingWith = (fileSystem) => (request) => Stream.unwrap(Effect.gen(function* open() {
31
+ const stored = yield* Effect.mapError(fileSystem.stat(request.filename), () => failed(request.blob, "the file could not be opened"));
32
+ const range = yield* rangeOf({
33
+ ...request,
34
+ bytes: Number(stored.size)
35
+ });
36
+ const source = fileSystem.stream(request.filename, {
37
+ bytesToRead: range.length,
38
+ offset: range.offset
39
+ });
40
+ return exactLength({
41
+ blob: request.blob,
42
+ bytes: range.length,
43
+ source
44
+ }).pipe(Stream.map((bytes) => new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength)), Stream.mapError(() => failed(request.blob, "the file could not be read")));
45
+ }));
46
+ const plainBlobSealing = (hashing) => Effect.gen(function* makePlainSealing() {
47
+ const fileSystem = yield* FileSystem.FileSystem;
48
+ const write = yield* blobWriter;
49
+ return {
50
+ open: openingWith(fileSystem),
51
+ rewrap: () => Effect.succeed(""),
52
+ seal: sealingWith(write, hashing)
53
+ };
54
+ });
55
+ export { plainBlobSealing };
@@ -0,0 +1,40 @@
1
+ import { BlobTransferError } from "../../../contract/file/blob-transfer.errors.mjs";
2
+ import { BlobLineage } from "./blob-lineage.sql.mjs";
3
+ import { Effect } from "effect";
4
+ import { SqlClient, SqlError } from "effect/sql";
5
+ interface BlobClaim {
6
+ readonly actor: string;
7
+ readonly blob: string;
8
+ readonly claim: string;
9
+ }
10
+ interface ClaimQuery {
11
+ readonly actor: string;
12
+ readonly after?: string;
13
+ }
14
+ type CatalogEffect<Value> = Effect.Effect<Value, BlobTransferError | SqlError.SqlError>;
15
+ /** A fork's target, and the actor it was forked from. */
16
+ interface ForkedActor {
17
+ readonly actor: string;
18
+ readonly origin: string;
19
+ }
20
+ /** How an adoption proceeds: `held` when this home already has the blob ready, `copy` when its bytes must be placed. */
21
+ type Adopted = "copy" | "held";
22
+ interface BlobCatalog extends BlobLineage {
23
+ readonly abandon: (fork: ForkedActor) => Effect.Effect<void, SqlError.SqlError>;
24
+ readonly acquire: (claim: BlobClaim) => CatalogEffect<void>;
25
+ readonly adopt: (claim: BlobClaim) => CatalogEffect<Adopted>;
26
+ readonly beginDelete: (blob: string) => Effect.Effect<boolean, SqlError.SqlError>;
27
+ readonly claims: (query: ClaimQuery) => Effect.Effect<readonly BlobClaim[], SqlError.SqlError>;
28
+ readonly complete: (claim: BlobClaim) => CatalogEffect<void>;
29
+ readonly create: (claim: BlobClaim) => CatalogEffect<boolean>;
30
+ readonly deletions: Effect.Effect<readonly string[], SqlError.SqlError>;
31
+ readonly erase: (actor: string) => Effect.Effect<void, SqlError.SqlError>;
32
+ readonly finishDelete: (blob: string) => Effect.Effect<void, SqlError.SqlError>;
33
+ readonly pending: (actor: string, after?: string) => Effect.Effect<readonly BlobClaim[], SqlError.SqlError>;
34
+ readonly pin: (claim: BlobClaim) => CatalogEffect<void>;
35
+ readonly readers: (after: string) => Effect.Effect<readonly BlobClaim[], SqlError.SqlError>;
36
+ readonly release: (claim: BlobClaim) => CatalogEffect<void>;
37
+ }
38
+ declare const prepareCatalog: (sql: SqlClient.SqlClient) => Effect.Effect<void, SqlError.SqlError>;
39
+ declare const blobCatalog: (sql: SqlClient.SqlClient) => BlobCatalog;
40
+ export { type Adopted, type BlobCatalog, type BlobClaim, type CatalogEffect, type ClaimQuery, type ForkedActor, blobCatalog, prepareCatalog };
@@ -0,0 +1,145 @@
1
+ import { BlobTransferError } from "../../../contract/file/blob-transfer.errors.mjs";
2
+ import { blobLineage, prepareLineages } from "./blob-lineage.sql.mjs";
3
+ import { Array, Effect, Option } from "effect";
4
+ // src/host/blob/reference/blob-catalog.sql.ts
5
+ const cleanupPageSize = 100;
6
+ const missing = (blob) => BlobTransferError.make({
7
+ blob,
8
+ message: "the blob claim is unavailable or belongs to another actor"
9
+ });
10
+ const prepareCatalog = (sql) => sql.withTransaction(Effect.gen(function* createTables() {
11
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blob_actors (actor TEXT PRIMARY KEY, state TEXT NOT NULL CHECK (state IN ('active', 'erased')), parent TEXT) STRICT`;
12
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blobs (blob TEXT PRIMARY KEY, creation TEXT NOT NULL UNIQUE, state TEXT NOT NULL CHECK (state IN ('uploading', 'ready', 'deleting', 'deleted'))) STRICT`;
13
+ yield* sql`CREATE TABLE IF NOT EXISTS akter_blob_claims (claim TEXT PRIMARY KEY, blob TEXT NOT NULL, actor TEXT NOT NULL, kind TEXT NOT NULL DEFAULT 'reference' CHECK (kind IN ('reader', 'reference', 'upload')), state TEXT NOT NULL CHECK (state IN ('active', 'released'))) STRICT`;
14
+ yield* sql`CREATE INDEX IF NOT EXISTS akter_blob_claims_live ON akter_blob_claims (blob, state)`;
15
+ yield* sql`CREATE INDEX IF NOT EXISTS akter_blob_claims_owner ON akter_blob_claims (actor, state, claim)`;
16
+ yield* sql`CREATE INDEX IF NOT EXISTS akter_blobs_deleting ON akter_blobs (state, blob)`;
17
+ yield* sql`CREATE INDEX IF NOT EXISTS akter_blob_claims_uploads ON akter_blob_claims (actor, claim) WHERE kind = 'upload' AND state = 'active'`;
18
+ yield* sql`CREATE INDEX IF NOT EXISTS akter_blob_claims_readers ON akter_blob_claims (claim) WHERE kind = 'reader' AND state = 'active'`;
19
+ yield* prepareLineages(sql);
20
+ }));
21
+ const activeActor = (sql, { actor, blob }) => Effect.gen(function* checkActor() {
22
+ yield* sql`INSERT INTO akter_blob_actors (actor, state) VALUES (${actor}, 'active') ON CONFLICT (actor) DO NOTHING`;
23
+ const rows = yield* sql`SELECT actor FROM akter_blob_actors WHERE actor = ${actor} AND state = 'active'`;
24
+ if (Array.isReadonlyArrayNonEmpty(rows)) return yield* Effect.void;
25
+ return yield* missing(blob);
26
+ });
27
+ const claimRow = (sql, claim) => Effect.map(sql`SELECT actor, blob, claim, kind, state FROM akter_blob_claims WHERE claim = ${claim}`, Array.head);
28
+ const validateClaim = (sql, expected, kinds) => Effect.flatMap(claimRow(sql, expected.claim), (row) => {
29
+ if (Option.isSome(row) && row.value.actor === expected.actor && row.value.blob === expected.blob && Array.contains(kinds, row.value.kind) && row.value.state === "active") return Effect.void;
30
+ return Effect.fail(missing(expected.blob));
31
+ });
32
+ const acquireClaim = (sql, claim, kind) => sql.withTransaction(Effect.gen(function* acquireReference() {
33
+ yield* activeActor(sql, claim);
34
+ yield* sql`INSERT INTO akter_blob_claims (claim, blob, actor, kind, state) SELECT ${claim.claim}, blob, ${claim.actor}, ${kind}, 'active' FROM akter_blobs WHERE blob = ${claim.blob} AND state = 'ready' ON CONFLICT (claim) DO NOTHING`;
35
+ yield* validateClaim(sql, claim, [kind]);
36
+ }));
37
+ const retryLater = (blob, state) => {
38
+ if (state === "deleting") return BlobTransferError.make({
39
+ blob,
40
+ message: "the blob is being removed from this home; retry the adoption"
41
+ });
42
+ return BlobTransferError.make({
43
+ blob,
44
+ message: "the blob is still being written to this home; retry the adoption"
45
+ });
46
+ };
47
+ /** The decision for a claim the catalog already has: the same adoption run again. */
48
+ const adoptedBefore = (claim, row) => {
49
+ if (row.actor !== claim.actor || row.blob !== claim.blob || row.kind === "reader") return Effect.fail(missing(claim.blob));
50
+ if (row.state !== "active") return Effect.fail(BlobTransferError.make({
51
+ blob: claim.blob,
52
+ message: "the adopted claim was released; adopt under a new claim"
53
+ }));
54
+ if (row.kind === "upload") return Effect.succeed("copy");
55
+ return Effect.succeed("held");
56
+ };
57
+ /** A new claim: held on a ready blob, or the creation of a blob this home lacks or already deleted. */
58
+ const adoptedNew = (sql, claim) => Effect.gen(function* adoptNewClaim() {
59
+ const rows = yield* sql`SELECT state FROM akter_blobs WHERE blob = ${claim.blob}`;
60
+ const state = Option.getOrElse(Option.map(Array.head(rows), (row) => row.state), () => "deleted");
61
+ if (state === "ready") {
62
+ yield* sql`INSERT INTO akter_blob_claims (claim, blob, actor, kind, state) VALUES (${claim.claim}, ${claim.blob}, ${claim.actor}, 'reference', 'active')`;
63
+ return "held";
64
+ }
65
+ if (state !== "deleted") return yield* retryLater(claim.blob, state);
66
+ yield* sql`INSERT INTO akter_blobs (blob, creation, state) VALUES (${claim.blob}, ${claim.claim}, 'uploading') ON CONFLICT (blob) DO UPDATE SET creation = excluded.creation, state = 'uploading' WHERE akter_blobs.state = 'deleted'`;
67
+ yield* sql`INSERT INTO akter_blob_claims (claim, blob, actor, kind, state) VALUES (${claim.claim}, ${claim.blob}, ${claim.actor}, 'upload', 'active')`;
68
+ return "copy";
69
+ });
70
+ /**
71
+ * Decides, in one transaction, how `claim` takes a blob whose bytes come from another home: a claim seen before
72
+ * decides as it did, a ready blob gains a reference claim (`held`), and a missing or deleted blob is created as
73
+ * uploading under an upload claim (`copy`), which recovery releases if the copy never completes.
74
+ */
75
+ const adoptBlob = (sql, claim) => sql.withTransaction(Effect.gen(function* adoptClaim() {
76
+ yield* activeActor(sql, claim);
77
+ const row = yield* claimRow(sql, claim.claim);
78
+ if (Option.isSome(row)) return yield* adoptedBefore(claim, row.value);
79
+ return yield* adoptedNew(sql, claim);
80
+ }));
81
+ const createBlob = (sql, claim) => sql.withTransaction(Effect.gen(function* allocateBlob() {
82
+ yield* activeActor(sql, claim);
83
+ const created = yield* sql`INSERT INTO akter_blobs (blob, creation, state) VALUES (${claim.blob}, ${claim.claim}, 'uploading') ON CONFLICT (blob) DO NOTHING RETURNING blob`;
84
+ yield* sql`INSERT INTO akter_blob_claims (claim, blob, actor, kind, state) SELECT ${claim.claim}, blob, ${claim.actor}, 'upload', 'active' FROM akter_blobs WHERE blob = ${claim.blob} AND creation = ${claim.claim} AND state = 'uploading' ON CONFLICT (claim) DO NOTHING`;
85
+ yield* validateClaim(sql, claim, ["upload"]);
86
+ return Array.isReadonlyArrayNonEmpty(created);
87
+ }));
88
+ const completeBlob = (sql, claim) => sql.withTransaction(Effect.gen(function* publishBlob() {
89
+ yield* activeActor(sql, claim);
90
+ yield* validateClaim(sql, claim, ["reference", "upload"]);
91
+ yield* sql`UPDATE akter_blobs SET state = 'ready' WHERE blob = ${claim.blob} AND state = 'uploading'`;
92
+ yield* sql`UPDATE akter_blob_claims SET kind = 'reference' WHERE claim = ${claim.claim}`;
93
+ }));
94
+ const beginDelete = (sql, blob) => Effect.map(sql`UPDATE akter_blobs SET state = 'deleting' WHERE blob = ${blob} AND state != 'deleted' AND NOT EXISTS (SELECT 1 FROM akter_blob_claims WHERE blob = ${blob} AND state = 'active') RETURNING blob`, Array.isReadonlyArrayNonEmpty);
95
+ const releaseClaim = (sql, claim) => sql.withTransaction(Effect.gen(function* releaseReference() {
96
+ const row = yield* claimRow(sql, claim.claim);
97
+ if (Option.isNone(row)) {
98
+ const erased = yield* sql`SELECT actor FROM akter_blob_actors WHERE actor = ${claim.actor} AND state = 'erased'`;
99
+ if (Array.isReadonlyArrayNonEmpty(erased)) return yield* Effect.void;
100
+ }
101
+ if (Option.isNone(row) || row.value.actor !== claim.actor || row.value.blob !== claim.blob) return yield* missing(claim.blob);
102
+ yield* sql`UPDATE akter_blob_claims SET state = 'released' WHERE claim = ${claim.claim}`;
103
+ return yield* Effect.asVoid(beginDelete(sql, claim.blob));
104
+ }));
105
+ const finishDelete = (sql, blob) => Effect.asVoid(sql`UPDATE akter_blobs SET state = 'deleted' WHERE blob = ${blob} AND state = 'deleting'`);
106
+ const eraseActor = (sql, actor) => sql.withTransaction(Effect.gen(function* eraseClaims() {
107
+ yield* sql`INSERT INTO akter_blob_actors (actor, state) VALUES (${actor}, 'erased') ON CONFLICT (actor) DO UPDATE SET state = 'erased'`;
108
+ yield* sql`UPDATE akter_blob_claims SET state = 'released' WHERE actor = ${actor} AND kind != 'reader'`;
109
+ yield* sql`UPDATE akter_blobs SET state = 'deleting' WHERE state != 'deleted' AND blob IN (SELECT blob FROM akter_blob_claims WHERE actor = ${actor}) AND NOT EXISTS (SELECT 1 FROM akter_blob_claims WHERE akter_blob_claims.blob = akter_blobs.blob AND akter_blob_claims.state = 'active')`;
110
+ }));
111
+ /**
112
+ * Undoes an unfinished fork into an actor: its claims are released as an erase releases them, but its catalog row is
113
+ * deleted instead of marked erased, so a retry can fork into the same actor again. Only an actor whose row names
114
+ * `origin` as its parent is undone, so an actor that holds its own files, such as one created at the fork's target
115
+ * while the fork ran, keeps every claim.
116
+ */
117
+ const abandonActor = (sql, { actor, origin }) => sql.withTransaction(Effect.gen(function* abandonClaims() {
118
+ const forked = yield* sql`SELECT actor FROM akter_blob_actors WHERE actor = ${actor} AND state = 'active' AND parent = ${origin}`;
119
+ if (!Array.isReadonlyArrayNonEmpty(forked)) return;
120
+ yield* sql`UPDATE akter_blob_claims SET state = 'released' WHERE actor = ${actor} AND kind != 'reader'`;
121
+ yield* sql`UPDATE akter_blobs SET state = 'deleting' WHERE state != 'deleted' AND blob IN (SELECT blob FROM akter_blob_claims WHERE actor = ${actor}) AND NOT EXISTS (SELECT 1 FROM akter_blob_claims WHERE akter_blob_claims.blob = akter_blobs.blob AND akter_blob_claims.state = 'active')`;
122
+ yield* sql`DELETE FROM akter_blob_actors WHERE actor = ${actor} AND state = 'active'`;
123
+ }));
124
+ const pendingDeletions = (sql) => Effect.map(sql`SELECT blob FROM akter_blobs WHERE state = 'deleting' ORDER BY blob LIMIT ${cleanupPageSize}`, Array.map((row) => row.blob));
125
+ const activeClaims = (sql, { actor, after = "" }) => sql`SELECT actor, blob, claim FROM akter_blob_claims WHERE actor = ${actor} AND state = 'active' AND claim > ${after} ORDER BY claim LIMIT ${cleanupPageSize}`;
126
+ const pendingUploads = (sql, actor, after) => sql`SELECT actor, blob, claim FROM akter_blob_claims WHERE actor = ${actor} AND kind = 'upload' AND state = 'active' AND claim > ${after} ORDER BY claim LIMIT ${cleanupPageSize}`;
127
+ const readerClaims = (sql, after) => sql`SELECT actor, blob, claim FROM akter_blob_claims WHERE kind = 'reader' AND state = 'active' AND claim > ${after} ORDER BY claim LIMIT ${cleanupPageSize}`;
128
+ const blobCatalog = (sql) => ({
129
+ ...blobLineage(sql),
130
+ abandon: (fork) => abandonActor(sql, fork),
131
+ acquire: (claim) => acquireClaim(sql, claim, "reference"),
132
+ adopt: (claim) => adoptBlob(sql, claim),
133
+ beginDelete: (blob) => beginDelete(sql, blob),
134
+ claims: (query) => activeClaims(sql, query),
135
+ complete: (claim) => completeBlob(sql, claim),
136
+ create: (claim) => createBlob(sql, claim),
137
+ deletions: pendingDeletions(sql),
138
+ erase: (actor) => eraseActor(sql, actor),
139
+ finishDelete: (blob) => finishDelete(sql, blob),
140
+ pending: (actor, after = "") => pendingUploads(sql, actor, after),
141
+ pin: (claim) => acquireClaim(sql, claim, "reader"),
142
+ readers: (after) => readerClaims(sql, after),
143
+ release: (claim) => releaseClaim(sql, claim)
144
+ });
145
+ export { blobCatalog, prepareCatalog };
@@ -0,0 +1,10 @@
1
+ import { AdoptionHome } from "./blob-transfer-adopt.pure.mjs";
2
+ import { BlobTransfers, TransferHome } from "./blob-transfer.pure.mjs";
3
+ import { Effect } from "effect";
4
+ import { SecureRandom } from "effect/crypto";
5
+ /** What a home's transfers seal and hash with, beside the home itself. */
6
+ interface TransferServices extends Pick<AdoptionHome, "hashing" | "sealing"> {
7
+ readonly home: TransferHome;
8
+ }
9
+ declare const blobTransfers: ({ hashing, home, sealing }: TransferServices) => Effect.Effect<BlobTransfers, never, SecureRandom.SecureRandom>;
10
+ export { blobTransfers };
@@ -0,0 +1,153 @@
1
+ import { BlobTransferError } from "../../../contract/file/blob-transfer.errors.mjs";
2
+ import { adoptWith } from "./blob-transfer-adopt.pure.mjs";
3
+ import { blobReads } from "./blob-reads.pure.mjs";
4
+ import { forkWith } from "./blob-transfer-fork.pure.mjs";
5
+ import { transferUpkeep } from "./blob-transfer-upkeep.pure.mjs";
6
+ import { Clock, Effect, Exit, Function, Ref, Semaphore, TxReentrantLock } from "effect";
7
+ import { SecureRandom } from "effect/crypto";
8
+ // src/host/blob/reference/blob-coordinator.pure.ts
9
+ const oneFileOperation = 1;
10
+ /** How long a sealed upload waits for a command to attach it before it is canceled and its blob collected. */
11
+ const receiptLifetimeMillis = 36e5;
12
+ /** Uploads one actor may hold that no command has attached yet; past it, a new upload is refused. */
13
+ const unattachedReceipts = 16;
14
+ const freshOperations = Effect.suspend(() => Effect.all({
15
+ admissions: TxReentrantLock.make(),
16
+ closed: Ref.make(false),
17
+ operations: Semaphore.make(oneFileOperation),
18
+ uploads: Ref.make(/* @__PURE__ */ new Set())
19
+ }));
20
+ const operationWith = (state, mode) => (effect, protect = Function.identity) => {
21
+ const checked = Effect.gen(function* runFileOperation() {
22
+ if ((yield* Ref.get(state.closed)) && mode !== "closing") return yield* BlobTransferError.make({
23
+ blob: "",
24
+ message: "the file home is closed"
25
+ });
26
+ return yield* effect;
27
+ });
28
+ const guarded = protect(state.operations.withPermits(oneFileOperation)(checked));
29
+ if (mode === "shared") return TxReentrantLock.withReadLock(state.admissions, guarded);
30
+ return TxReentrantLock.withWriteLock(state.admissions, guarded);
31
+ };
32
+ const completedUpload = Effect.fnUntraced(function* completedUpload(home, reservation, { owner, source }) {
33
+ const sealed = yield* home.directory.publish({
34
+ actor: owner.actor,
35
+ blob: reservation.blob,
36
+ source
37
+ });
38
+ return yield* home.run(Effect.gen(function* prepareReceipt() {
39
+ const now = yield* Clock.currentTimeMillis;
40
+ yield* owner.exclusive(owner.transaction(owner.receipts.complete({
41
+ expiresAt: now + receiptLifetimeMillis,
42
+ receipt: reservation.receipt,
43
+ sealed
44
+ })));
45
+ yield* home.catalog.complete(reservation);
46
+ return reservation.receipt;
47
+ }));
48
+ });
49
+ const reserveUpload = Effect.fnUntraced(function* reserveUpload(home, { allocated, owner, reservation }) {
50
+ const prepare = owner.exclusive(Effect.gen(function* prepareUpload() {
51
+ yield* owner.receipts.active;
52
+ if (!(yield* home.catalog.create(reservation))) return yield* BlobTransferError.make({
53
+ blob: reservation.blob,
54
+ message: "the generated upload identity is already in use"
55
+ });
56
+ yield* Ref.set(allocated, true);
57
+ yield* Ref.update(home.uploads, (uploads) => new Set(uploads).add(reservation.claim));
58
+ const now = yield* Clock.currentTimeMillis;
59
+ return yield* owner.transaction(owner.receipts.reserve(reservation, {
60
+ now,
61
+ unattached: unattachedReceipts
62
+ }));
63
+ }));
64
+ return yield* home.run(prepare);
65
+ });
66
+ const uploadWith = (home, random, upkeep) => Effect.fnUntraced(function* upload({ owner, source }) {
67
+ const reservation = {
68
+ ...yield* Effect.all({
69
+ blob: random.uuidV4(),
70
+ claim: random.uuidV4(),
71
+ receipt: random.uuidV4()
72
+ }),
73
+ actor: owner.actor,
74
+ expiresAt: Number.MAX_SAFE_INTEGER
75
+ };
76
+ const allocated = yield* Ref.make(false);
77
+ const prepare = reserveUpload(home, {
78
+ allocated,
79
+ owner,
80
+ reservation
81
+ });
82
+ return yield* Effect.andThen(prepare, completedUpload(home, reservation, {
83
+ owner,
84
+ source
85
+ })).pipe(Effect.onExit((exit) => {
86
+ if (Exit.isSuccess(exit)) return Effect.void;
87
+ return Effect.flatMap(Ref.get(allocated), (created) => {
88
+ if (created) {
89
+ const cleanup = Effect.andThen(upkeep.cancel(owner, reservation), Effect.asVoid(upkeep.collect));
90
+ return home.run(cleanup);
91
+ }
92
+ return Effect.void;
93
+ });
94
+ }), Effect.ensuring(Ref.update(home.uploads, (uploads) => {
95
+ const remaining = new Set(uploads);
96
+ remaining.delete(reservation.claim);
97
+ return remaining;
98
+ })));
99
+ });
100
+ const blobTransfers = ({ hashing, home, sealing }) => Effect.gen(function* makeBlobTransfers() {
101
+ const random = yield* SecureRandom.SecureRandom;
102
+ const state = yield* freshOperations;
103
+ const running = {
104
+ closing: operationWith(state, "closing"),
105
+ exclusive: operationWith(state, "exclusive"),
106
+ shared: operationWith(state, "shared")
107
+ };
108
+ const admit = (effect) => TxReentrantLock.withReadLock(state.admissions, effect);
109
+ const upkeep = transferUpkeep({
110
+ ...home,
111
+ run: running.shared,
112
+ uploads: state.uploads
113
+ });
114
+ const upload = uploadWith({
115
+ ...home,
116
+ run: running.shared,
117
+ uploads: state.uploads
118
+ }, random, upkeep);
119
+ const fork = forkWith({
120
+ home,
121
+ random,
122
+ sealing
123
+ });
124
+ const adopt = adoptWith({
125
+ ...home,
126
+ hashing,
127
+ run: running.shared,
128
+ sealing,
129
+ uploads: state.uploads
130
+ });
131
+ const reads = yield* blobReads({
132
+ home,
133
+ random
134
+ });
135
+ return {
136
+ admit,
137
+ adopt: (request) => admit(adopt(request)),
138
+ close: running.closing(Ref.set(state.closed, true)).pipe(Effect.orDie, Effect.andThen(reads.close)),
139
+ collect: running.shared(upkeep.collect),
140
+ download: reads.download,
141
+ erase: (owner) => running.exclusive(upkeep.erase(owner), owner.snapshot),
142
+ fork: (request) => running.exclusive(fork(request)),
143
+ hold: (effect) => TxReentrantLock.withWriteLock(state.admissions, effect),
144
+ open: reads.open,
145
+ recover: (owner) => {
146
+ const recovered = Effect.andThen(reads.recover, upkeep.recover(owner));
147
+ return running.shared(recovered, owner.snapshot);
148
+ },
149
+ settle: (owner) => running.shared(upkeep.settle(owner), owner.snapshot),
150
+ upload: (request) => admit(upload(request))
151
+ };
152
+ });
153
+ export { blobTransfers };
@@ -0,0 +1,13 @@
1
+ import { FileListing, FilePage, FileUsagePage } from "../../../contract/file/actor-files.contract.mjs";
2
+ import { InvalidFileRequestError } from "../../../contract/file/invalid-file-request.errors.mjs";
3
+ import { Effect } from "effect";
4
+ import { SqlClient, SqlError } from "effect/sql";
5
+ interface PageQuery {
6
+ readonly actor: string;
7
+ readonly listing: FileListing;
8
+ readonly sql: SqlClient.SqlClient;
9
+ }
10
+ type PageEffect<Value> = Effect.Effect<Value, InvalidFileRequestError | SqlError.SqlError>;
11
+ declare const filePage: ({ actor, listing, sql }: PageQuery) => PageEffect<FilePage>;
12
+ declare const fileUsagePage: (query: PageQuery) => PageEffect<FileUsagePage>;
13
+ export { type PageQuery, filePage, fileUsagePage };
@@ -0,0 +1,21 @@
1
+ import { fileListingOf } from "../../../contract/file/file-listing.pure.mjs";
2
+ import { Array, Effect, Option, String } from "effect";
3
+ // src/host/blob/reference/blob-file-page.sql.ts
4
+ const lookAhead = 1;
5
+ const noBytes = 0n;
6
+ const filePage = ({ actor, listing, sql }) => Effect.gen(function* pageFiles() {
7
+ const { cursor, limit, prefix } = yield* fileListingOf(listing);
8
+ return yield* Effect.map(sql`SELECT path, bytes, sha256, written_at AS writtenAt FROM akter_blob_links WHERE actor = ${actor} AND path >= ${prefix} AND path > ${cursor} AND EXISTS (SELECT 1 FROM akter_blob_owners WHERE actor = ${actor} AND state = 'active') ORDER BY path LIMIT ${limit + lookAhead}`, (rows) => {
9
+ const matching = Array.takeWhile(rows, (file) => String.startsWith(prefix)(file.path));
10
+ const entries = Array.take(matching, limit);
11
+ return {
12
+ cursor: Array.last(entries).pipe(Option.filter(() => matching.length > limit), Option.map((file) => file.path)),
13
+ entries
14
+ };
15
+ });
16
+ });
17
+ const fileUsagePage = (query) => Effect.map(filePage(query), (page) => ({
18
+ ...page,
19
+ bytes: Array.reduce(page.entries, noBytes, (total, file) => total + BigInt(file.bytes))
20
+ }));
21
+ export { filePage, fileUsagePage };
@@ -0,0 +1,21 @@
1
+ import { CatalogEffect } from "./blob-catalog.sql.mjs";
2
+ import { BlobLink } from "./blob-receipts.sql.mjs";
3
+ import { Effect } from "effect";
4
+ import { SqlClient, SqlError } from "effect/sql";
5
+ interface ForkIdentity {
6
+ readonly operation: string;
7
+ readonly origin: string;
8
+ }
9
+ interface ForkStorage {
10
+ readonly actor: string;
11
+ readonly sql: SqlClient.SqlClient;
12
+ }
13
+ interface BlobForks {
14
+ readonly activate: (fork: ForkIdentity) => CatalogEffect<void>;
15
+ readonly begin: (fork: ForkIdentity) => CatalogEffect<boolean>;
16
+ readonly entries: (after: string) => Effect.Effect<readonly BlobLink[], SqlError.SqlError>;
17
+ readonly inherit: (file: Omit<BlobLink, "actor">) => CatalogEffect<void>;
18
+ readonly pending: Effect.Effect<boolean, SqlError.SqlError>;
19
+ }
20
+ declare const blobForks: (storage: ForkStorage) => BlobForks;
21
+ export { type BlobForks, type ForkIdentity, blobForks };
@@ -0,0 +1,40 @@
1
+ import { BlobTransferError } from "../../../contract/file/blob-transfer.errors.mjs";
2
+ import { Array, Effect, Option } from "effect";
3
+ // src/host/blob/reference/blob-forks.sql.ts
4
+ const metadataPageSize = 100;
5
+ const refused = () => BlobTransferError.make({
6
+ blob: "",
7
+ message: "the file fork target is not available for this operation"
8
+ });
9
+ const ownerIn = ({ actor, sql }, state) => Effect.map(sql`SELECT actor FROM akter_blob_owners WHERE actor = ${actor} AND state = ${state}`, Array.isReadonlyArrayNonEmpty);
10
+ const recordedFork = (sql) => Effect.map(sql`SELECT origin, operation, state FROM akter_blob_fork WHERE id = 1`, Array.head);
11
+ const forkMatches = (row, expected) => row.origin === expected.origin && row.operation === expected.operation;
12
+ const beginFork = (storage, fork) => storage.sql.withTransaction(Effect.gen(function* prepareFork() {
13
+ const active = yield* ownerIn(storage, "active");
14
+ const recorded = yield* recordedFork(storage.sql);
15
+ if (active && Option.isSome(recorded) && forkMatches(recorded.value, fork) && recorded.value.state === "active") return false;
16
+ const occupied = yield* storage.sql`SELECT path FROM akter_blob_links UNION ALL SELECT receipt FROM akter_blob_receipts UNION ALL SELECT claim FROM akter_blob_ancestry LIMIT 1`;
17
+ if (!active || Option.isSome(recorded) || Array.isReadonlyArrayNonEmpty(occupied)) return yield* refused();
18
+ yield* storage.sql`INSERT INTO akter_blob_fork (id, origin, operation, state) VALUES (1, ${fork.origin}, ${fork.operation}, 'preparing')`;
19
+ yield* storage.sql`UPDATE akter_blob_owners SET state = 'preparing' WHERE actor = ${storage.actor}`;
20
+ return true;
21
+ }));
22
+ const inheritFile = (storage, file) => storage.sql.withTransaction(Effect.gen(function* inheritFileLink() {
23
+ if (!(yield* ownerIn(storage, "preparing"))) return yield* refused();
24
+ return yield* Effect.asVoid(storage.sql`INSERT INTO akter_blob_links (path, actor, blob, claim, bytes, sha256, grant, written_at) VALUES (${file.path}, ${storage.actor}, ${file.blob}, ${file.claim}, ${file.bytes}, ${file.sha256}, ${file.grant}, ${file.writtenAt})`);
25
+ }));
26
+ const activateFork = (storage, fork) => storage.sql.withTransaction(Effect.gen(function* activateFileFork() {
27
+ const recorded = yield* recordedFork(storage.sql);
28
+ if (!(yield* ownerIn(storage, "preparing")) || Option.isNone(recorded) || recorded.value.state !== "preparing" || !forkMatches(recorded.value, fork)) return yield* refused();
29
+ yield* storage.sql`UPDATE akter_blob_fork SET state = 'active' WHERE id = 1`;
30
+ return yield* Effect.asVoid(storage.sql`UPDATE akter_blob_owners SET state = 'active' WHERE actor = ${storage.actor}`);
31
+ }));
32
+ const inheritedEntries = ({ actor, sql }, after) => sql`SELECT path, actor, blob, claim, bytes, sha256, grant, written_at AS writtenAt FROM akter_blob_links WHERE actor = ${actor} AND path > ${after} AND EXISTS (SELECT 1 FROM akter_blob_owners WHERE actor = ${actor} AND state = 'active') ORDER BY path LIMIT ${metadataPageSize}`;
33
+ const blobForks = (storage) => ({
34
+ activate: (fork) => activateFork(storage, fork),
35
+ begin: (fork) => beginFork(storage, fork),
36
+ entries: (after) => inheritedEntries(storage, after),
37
+ inherit: (file) => inheritFile(storage, file),
38
+ pending: ownerIn(storage, "preparing")
39
+ });
40
+ export { blobForks };
@@ -0,0 +1,14 @@
1
+ import { CatalogEffect } from "./blob-catalog.sql.mjs";
2
+ import { Effect } from "effect";
3
+ import { SqlClient, SqlError } from "effect/sql";
4
+ interface LineageFork {
5
+ readonly actor: string;
6
+ readonly origin: string;
7
+ }
8
+ interface BlobLineage {
9
+ readonly checkFork: (fork: LineageFork) => CatalogEffect<void>;
10
+ readonly recordFork: (fork: LineageFork) => CatalogEffect<void>;
11
+ }
12
+ declare const prepareLineages: (sql: SqlClient.SqlClient) => Effect.Effect<void, SqlError.SqlError>;
13
+ declare const blobLineage: (sql: SqlClient.SqlClient) => BlobLineage;
14
+ export { type BlobLineage, blobLineage, prepareLineages };
@@ -0,0 +1,24 @@
1
+ import { BlobTransferError } from "../../../contract/file/blob-transfer.errors.mjs";
2
+ import { Array, Effect } from "effect";
3
+ // src/host/blob/reference/blob-lineage.sql.ts
4
+ const prepareLineages = (sql) => Effect.asVoid(sql`CREATE INDEX IF NOT EXISTS akter_blob_actors_parent ON akter_blob_actors (parent, actor)`);
5
+ const checkFork = (sql, { actor, origin }) => sql.withTransaction(Effect.gen(function* checkLineage() {
6
+ const erased = yield* sql`SELECT actor FROM akter_blob_actors WHERE actor IN (${actor}, ${origin}) AND state = 'erased'`;
7
+ const rebound = yield* sql`SELECT actor FROM akter_blob_actors WHERE actor = ${actor} AND parent IS NOT NULL AND parent != ${origin}`;
8
+ const cyclic = yield* sql`WITH RECURSIVE ancestry(actor) AS (SELECT ${origin} UNION SELECT parent FROM akter_blob_actors JOIN ancestry ON akter_blob_actors.actor = ancestry.actor WHERE parent IS NOT NULL) SELECT actor FROM ancestry WHERE actor = ${actor}`;
9
+ if (Array.isReadonlyArrayNonEmpty(erased) || Array.isReadonlyArrayNonEmpty(rebound) || Array.isReadonlyArrayNonEmpty(cyclic)) return yield* BlobTransferError.make({
10
+ blob: "",
11
+ message: "the fork lineage is erased, cyclic, or already bound"
12
+ });
13
+ return yield* Effect.void;
14
+ }));
15
+ const recordFork = (sql, fork) => sql.withTransaction(Effect.gen(function* recordLineage() {
16
+ yield* checkFork(sql, fork);
17
+ yield* sql`INSERT INTO akter_blob_actors (actor, state) VALUES (${fork.origin}, 'active') ON CONFLICT DO NOTHING`;
18
+ yield* sql`INSERT INTO akter_blob_actors (actor, state, parent) VALUES (${fork.actor}, 'active', ${fork.origin}) ON CONFLICT (actor) DO UPDATE SET parent = excluded.parent`;
19
+ }));
20
+ const blobLineage = (sql) => ({
21
+ checkFork: (fork) => checkFork(sql, fork),
22
+ recordFork: (fork) => recordFork(sql, fork)
23
+ });
24
+ export { blobLineage, prepareLineages };