flingit 0.0.63 → 0.0.66

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 (545) hide show
  1. package/dist/cli/commands/db.d.ts +10 -0
  2. package/dist/cli/commands/db.d.ts.map +1 -1
  3. package/dist/cli/commands/db.js +17 -0
  4. package/dist/cli/commands/db.js.map +1 -1
  5. package/dist/cli/commands/dev.d.ts.map +1 -1
  6. package/dist/cli/commands/dev.js +22 -7
  7. package/dist/cli/commands/dev.js.map +1 -1
  8. package/dist/cli/commands/init.js +1 -1
  9. package/dist/cli/commands/init.js.map +1 -1
  10. package/dist/cli/commands/push.d.ts +1 -0
  11. package/dist/cli/commands/push.d.ts.map +1 -1
  12. package/dist/cli/commands/push.js +3 -3
  13. package/dist/cli/commands/push.js.map +1 -1
  14. package/dist/cli/commands/storage.d.ts +0 -3
  15. package/dist/cli/commands/storage.d.ts.map +1 -1
  16. package/dist/cli/commands/storage.js +1 -4
  17. package/dist/cli/commands/storage.js.map +1 -1
  18. package/dist/cli/commands/workflow.d.ts +51 -0
  19. package/dist/cli/commands/workflow.d.ts.map +1 -0
  20. package/dist/cli/commands/workflow.js +479 -0
  21. package/dist/cli/commands/workflow.js.map +1 -0
  22. package/dist/cli/deploy/bundler.d.ts.map +1 -1
  23. package/dist/cli/deploy/bundler.js +17 -1
  24. package/dist/cli/deploy/bundler.js.map +1 -1
  25. package/dist/cli/index.d.ts.map +1 -1
  26. package/dist/cli/index.js +2 -0
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/cli/utils/cli-io-impl.d.ts +24 -2
  29. package/dist/cli/utils/cli-io-impl.d.ts.map +1 -1
  30. package/dist/cli/utils/cli-io-impl.js +87 -3
  31. package/dist/cli/utils/cli-io-impl.js.map +1 -1
  32. package/dist/cli/utils/cli-io.d.ts +25 -1
  33. package/dist/cli/utils/cli-io.d.ts.map +1 -1
  34. package/dist/cli/utils/project-name.d.ts +9 -0
  35. package/dist/cli/utils/project-name.d.ts.map +1 -1
  36. package/dist/cli/utils/project-name.js +28 -0
  37. package/dist/cli/utils/project-name.js.map +1 -1
  38. package/dist/cli/utils/project.d.ts +14 -1
  39. package/dist/cli/utils/project.d.ts.map +1 -1
  40. package/dist/cli/utils/project.js +16 -0
  41. package/dist/cli/utils/project.js.map +1 -1
  42. package/dist/index.d.ts +4 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +3 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/runtime/entry.d.ts +7 -0
  47. package/dist/runtime/entry.d.ts.map +1 -1
  48. package/dist/runtime/entry.js +71 -2
  49. package/dist/runtime/entry.js.map +1 -1
  50. package/dist/types/workflow.d.ts +82 -0
  51. package/dist/types/workflow.d.ts.map +1 -0
  52. package/dist/types/workflow.js +8 -0
  53. package/dist/types/workflow.js.map +1 -0
  54. package/dist/worker-runtime/d1-event-store.d.ts +23 -0
  55. package/dist/worker-runtime/d1-event-store.d.ts.map +1 -0
  56. package/dist/worker-runtime/d1-event-store.js +253 -0
  57. package/dist/worker-runtime/d1-event-store.js.map +1 -0
  58. package/dist/worker-runtime/entry-extract.d.ts.map +1 -1
  59. package/dist/worker-runtime/entry-extract.js +6 -3
  60. package/dist/worker-runtime/entry-extract.js.map +1 -1
  61. package/dist/worker-runtime/entry.d.ts.map +1 -1
  62. package/dist/worker-runtime/entry.js +116 -13
  63. package/dist/worker-runtime/entry.js.map +1 -1
  64. package/dist/worker-runtime/index.d.ts +2 -0
  65. package/dist/worker-runtime/index.d.ts.map +1 -1
  66. package/dist/worker-runtime/index.js +5 -0
  67. package/dist/worker-runtime/index.js.map +1 -1
  68. package/dist/workflow/runtime.d.ts +59 -0
  69. package/dist/workflow/runtime.d.ts.map +1 -0
  70. package/dist/workflow/runtime.js +483 -0
  71. package/dist/workflow/runtime.js.map +1 -0
  72. package/node_modules/@glideapps/ts-necessities/LICENSE +21 -0
  73. package/node_modules/@glideapps/ts-necessities/README.md +16 -0
  74. package/node_modules/@glideapps/ts-necessities/dist/branded-strings.d.ts +39 -0
  75. package/node_modules/@glideapps/ts-necessities/dist/default-map.d.ts +53 -0
  76. package/node_modules/@glideapps/ts-necessities/dist/index.d.mts +113 -0
  77. package/node_modules/@glideapps/ts-necessities/dist/index.d.ts +113 -0
  78. package/node_modules/@glideapps/ts-necessities/dist/index.js +237 -0
  79. package/node_modules/@glideapps/ts-necessities/dist/index.mjs +189 -0
  80. package/node_modules/@glideapps/ts-necessities/package.json +52 -0
  81. package/node_modules/@rollup/rollup-linux-x64-gnu/README.md +3 -0
  82. package/node_modules/@rollup/rollup-linux-x64-gnu/package.json +25 -0
  83. package/node_modules/@rollup/rollup-linux-x64-gnu/rollup.linux-x64-gnu.node +0 -0
  84. package/node_modules/base64-js/LICENSE +21 -0
  85. package/node_modules/base64-js/README.md +34 -0
  86. package/node_modules/base64-js/base64js.min.js +1 -0
  87. package/node_modules/base64-js/index.d.ts +3 -0
  88. package/node_modules/base64-js/index.js +150 -0
  89. package/node_modules/base64-js/package.json +47 -0
  90. package/node_modules/better-sqlite3/LICENSE +21 -0
  91. package/node_modules/better-sqlite3/README.md +99 -0
  92. package/node_modules/better-sqlite3/binding.gyp +38 -0
  93. package/node_modules/better-sqlite3/deps/common.gypi +68 -0
  94. package/node_modules/better-sqlite3/deps/copy.js +31 -0
  95. package/node_modules/better-sqlite3/deps/defines.gypi +41 -0
  96. package/node_modules/better-sqlite3/deps/download.sh +122 -0
  97. package/node_modules/better-sqlite3/deps/patches/1208.patch +15 -0
  98. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +265994 -0
  99. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +13968 -0
  100. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +730 -0
  101. package/node_modules/better-sqlite3/deps/sqlite3.gyp +80 -0
  102. package/node_modules/better-sqlite3/deps/test_extension.c +21 -0
  103. package/node_modules/better-sqlite3/lib/database.js +90 -0
  104. package/node_modules/better-sqlite3/lib/index.js +3 -0
  105. package/node_modules/better-sqlite3/lib/methods/aggregate.js +43 -0
  106. package/node_modules/better-sqlite3/lib/methods/backup.js +67 -0
  107. package/node_modules/better-sqlite3/lib/methods/function.js +31 -0
  108. package/node_modules/better-sqlite3/lib/methods/inspect.js +7 -0
  109. package/node_modules/better-sqlite3/lib/methods/pragma.js +12 -0
  110. package/node_modules/better-sqlite3/lib/methods/serialize.js +16 -0
  111. package/node_modules/better-sqlite3/lib/methods/table.js +189 -0
  112. package/node_modules/better-sqlite3/lib/methods/transaction.js +78 -0
  113. package/node_modules/better-sqlite3/lib/methods/wrappers.js +54 -0
  114. package/node_modules/better-sqlite3/lib/sqlite-error.js +20 -0
  115. package/node_modules/better-sqlite3/lib/util.js +12 -0
  116. package/node_modules/better-sqlite3/package.json +59 -0
  117. package/node_modules/better-sqlite3/src/addon.cpp +47 -0
  118. package/node_modules/better-sqlite3/src/better_sqlite3.cpp +74 -0
  119. package/node_modules/better-sqlite3/src/objects/backup.cpp +120 -0
  120. package/node_modules/better-sqlite3/src/objects/backup.hpp +36 -0
  121. package/node_modules/better-sqlite3/src/objects/database.cpp +417 -0
  122. package/node_modules/better-sqlite3/src/objects/database.hpp +103 -0
  123. package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +113 -0
  124. package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +50 -0
  125. package/node_modules/better-sqlite3/src/objects/statement.cpp +383 -0
  126. package/node_modules/better-sqlite3/src/objects/statement.hpp +58 -0
  127. package/node_modules/better-sqlite3/src/util/bind-map.cpp +73 -0
  128. package/node_modules/better-sqlite3/src/util/binder.cpp +193 -0
  129. package/node_modules/better-sqlite3/src/util/constants.cpp +172 -0
  130. package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +121 -0
  131. package/node_modules/better-sqlite3/src/util/custom-function.cpp +59 -0
  132. package/node_modules/better-sqlite3/src/util/custom-table.cpp +409 -0
  133. package/node_modules/better-sqlite3/src/util/data-converter.cpp +17 -0
  134. package/node_modules/better-sqlite3/src/util/data.cpp +194 -0
  135. package/node_modules/better-sqlite3/src/util/helpers.cpp +109 -0
  136. package/node_modules/better-sqlite3/src/util/macros.cpp +83 -0
  137. package/node_modules/better-sqlite3/src/util/query-macros.cpp +71 -0
  138. package/node_modules/better-sqlite3/src/util/row-builder.cpp +49 -0
  139. package/node_modules/bindings/LICENSE.md +22 -0
  140. package/node_modules/bindings/README.md +98 -0
  141. package/node_modules/bindings/bindings.js +221 -0
  142. package/node_modules/bindings/package.json +28 -0
  143. package/node_modules/bl/.travis.yml +17 -0
  144. package/node_modules/bl/BufferList.js +396 -0
  145. package/node_modules/bl/LICENSE.md +13 -0
  146. package/node_modules/bl/README.md +247 -0
  147. package/node_modules/bl/bl.js +84 -0
  148. package/node_modules/bl/package.json +37 -0
  149. package/node_modules/bl/test/convert.js +21 -0
  150. package/node_modules/bl/test/indexOf.js +492 -0
  151. package/node_modules/bl/test/isBufferList.js +32 -0
  152. package/node_modules/bl/test/test.js +869 -0
  153. package/node_modules/buffer/AUTHORS.md +70 -0
  154. package/node_modules/buffer/LICENSE +21 -0
  155. package/node_modules/buffer/README.md +410 -0
  156. package/node_modules/buffer/index.d.ts +186 -0
  157. package/node_modules/buffer/index.js +1817 -0
  158. package/node_modules/buffer/package.json +96 -0
  159. package/node_modules/chownr/LICENSE +15 -0
  160. package/node_modules/chownr/README.md +3 -0
  161. package/node_modules/chownr/chownr.js +167 -0
  162. package/node_modules/chownr/package.json +29 -0
  163. package/node_modules/decompress-response/index.d.ts +22 -0
  164. package/node_modules/decompress-response/index.js +58 -0
  165. package/node_modules/decompress-response/license +9 -0
  166. package/node_modules/decompress-response/package.json +56 -0
  167. package/node_modules/decompress-response/readme.md +48 -0
  168. package/node_modules/deep-extend/LICENSE +20 -0
  169. package/node_modules/deep-extend/README.md +91 -0
  170. package/node_modules/deep-extend/index.js +1 -0
  171. package/node_modules/deep-extend/lib/deep-extend.js +150 -0
  172. package/node_modules/deep-extend/package.json +62 -0
  173. package/node_modules/detect-libc/LICENSE +201 -0
  174. package/node_modules/detect-libc/README.md +163 -0
  175. package/node_modules/detect-libc/index.d.ts +14 -0
  176. package/node_modules/detect-libc/lib/detect-libc.js +313 -0
  177. package/node_modules/detect-libc/lib/elf.js +39 -0
  178. package/node_modules/detect-libc/lib/filesystem.js +51 -0
  179. package/node_modules/detect-libc/lib/process.js +24 -0
  180. package/node_modules/detect-libc/package.json +44 -0
  181. package/node_modules/determined/LICENSE +18 -0
  182. package/node_modules/determined/README.md +317 -0
  183. package/node_modules/determined/dist/index.cjs +370 -0
  184. package/node_modules/determined/dist/index.d.cts +110 -0
  185. package/node_modules/determined/dist/index.d.ts +110 -0
  186. package/node_modules/determined/dist/index.js +332 -0
  187. package/node_modules/determined/package.json +45 -0
  188. package/node_modules/end-of-stream/LICENSE +21 -0
  189. package/node_modules/end-of-stream/README.md +54 -0
  190. package/node_modules/end-of-stream/index.js +96 -0
  191. package/node_modules/end-of-stream/package.json +37 -0
  192. package/node_modules/expand-template/.travis.yml +6 -0
  193. package/node_modules/expand-template/LICENSE +21 -0
  194. package/node_modules/expand-template/README.md +43 -0
  195. package/node_modules/expand-template/index.js +26 -0
  196. package/node_modules/expand-template/package.json +29 -0
  197. package/node_modules/expand-template/test.js +67 -0
  198. package/node_modules/file-uri-to-path/.npmignore +1 -0
  199. package/node_modules/file-uri-to-path/.travis.yml +30 -0
  200. package/node_modules/file-uri-to-path/History.md +21 -0
  201. package/node_modules/file-uri-to-path/LICENSE +20 -0
  202. package/node_modules/file-uri-to-path/README.md +74 -0
  203. package/node_modules/file-uri-to-path/index.d.ts +2 -0
  204. package/node_modules/file-uri-to-path/index.js +66 -0
  205. package/node_modules/file-uri-to-path/package.json +32 -0
  206. package/node_modules/file-uri-to-path/test/test.js +24 -0
  207. package/node_modules/file-uri-to-path/test/tests.json +13 -0
  208. package/node_modules/flingflow/.nvmrc +1 -0
  209. package/node_modules/flingflow/AGENTS.md +5 -0
  210. package/node_modules/flingflow/README.md +689 -0
  211. package/node_modules/flingflow/SPEC.md +550 -0
  212. package/node_modules/flingflow/TESTING.md +508 -0
  213. package/node_modules/flingflow/dist/backoff.d.ts +9 -0
  214. package/node_modules/flingflow/dist/backoff.js +14 -0
  215. package/node_modules/flingflow/dist/backoff.js.map +1 -0
  216. package/node_modules/flingflow/dist/clock.d.ts +13 -0
  217. package/node_modules/flingflow/dist/clock.js +21 -0
  218. package/node_modules/flingflow/dist/clock.js.map +1 -0
  219. package/node_modules/flingflow/dist/context.d.ts +8 -0
  220. package/node_modules/flingflow/dist/context.js +45 -0
  221. package/node_modules/flingflow/dist/context.js.map +1 -0
  222. package/node_modules/flingflow/dist/engine.d.ts +29 -0
  223. package/node_modules/flingflow/dist/engine.js +306 -0
  224. package/node_modules/flingflow/dist/engine.js.map +1 -0
  225. package/node_modules/flingflow/dist/index.d.ts +18 -0
  226. package/node_modules/flingflow/dist/index.js +14 -0
  227. package/node_modules/flingflow/dist/index.js.map +1 -0
  228. package/node_modules/flingflow/dist/recovery.d.ts +16 -0
  229. package/node_modules/flingflow/dist/recovery.js +118 -0
  230. package/node_modules/flingflow/dist/recovery.js.map +1 -0
  231. package/node_modules/flingflow/dist/registry.d.ts +24 -0
  232. package/node_modules/flingflow/dist/registry.js +29 -0
  233. package/node_modules/flingflow/dist/registry.js.map +1 -0
  234. package/node_modules/flingflow/dist/store-memory.d.ts +30 -0
  235. package/node_modules/flingflow/dist/store-memory.js +385 -0
  236. package/node_modules/flingflow/dist/store-memory.js.map +1 -0
  237. package/node_modules/flingflow/dist/store-sqlite.d.ts +31 -0
  238. package/node_modules/flingflow/dist/store-sqlite.js +445 -0
  239. package/node_modules/flingflow/dist/store-sqlite.js.map +1 -0
  240. package/node_modules/flingflow/dist/store.d.ts +44 -0
  241. package/node_modules/flingflow/dist/store.js +21 -0
  242. package/node_modules/flingflow/dist/store.js.map +1 -0
  243. package/node_modules/flingflow/dist/stress.d.ts +1 -0
  244. package/node_modules/flingflow/dist/stress.js +377 -0
  245. package/node_modules/flingflow/dist/stress.js.map +1 -0
  246. package/node_modules/flingflow/dist/transitions.d.ts +14 -0
  247. package/node_modules/flingflow/dist/transitions.js +28 -0
  248. package/node_modules/flingflow/dist/transitions.js.map +1 -0
  249. package/node_modules/flingflow/dist/types.d.ts +114 -0
  250. package/node_modules/flingflow/dist/types.js +10 -0
  251. package/node_modules/flingflow/dist/types.js.map +1 -0
  252. package/node_modules/flingflow/eslint.config.js +94 -0
  253. package/node_modules/flingflow/package.json +66 -0
  254. package/node_modules/flingflow/src/backoff.ts +14 -0
  255. package/node_modules/flingflow/src/clock.ts +29 -0
  256. package/node_modules/flingflow/src/context.ts +60 -0
  257. package/node_modules/flingflow/src/engine.ts +367 -0
  258. package/node_modules/flingflow/src/index.ts +52 -0
  259. package/node_modules/flingflow/src/recovery.ts +144 -0
  260. package/node_modules/flingflow/src/registry.ts +52 -0
  261. package/node_modules/flingflow/src/store-memory.ts +418 -0
  262. package/node_modules/flingflow/src/store-sqlite.ts +498 -0
  263. package/node_modules/flingflow/src/store.ts +61 -0
  264. package/node_modules/flingflow/src/stress.ts +423 -0
  265. package/node_modules/flingflow/src/transitions.ts +38 -0
  266. package/node_modules/flingflow/src/types.ts +84 -0
  267. package/node_modules/flingflow/test/backoff.test.ts +54 -0
  268. package/node_modules/flingflow/test/context.test.ts +94 -0
  269. package/node_modules/flingflow/test/engine.test.ts +362 -0
  270. package/node_modules/flingflow/test/fixtures.ts +58 -0
  271. package/node_modules/flingflow/test/recovery.test.ts +176 -0
  272. package/node_modules/flingflow/test/simulation.test.ts +395 -0
  273. package/node_modules/flingflow/test/store-conformance.ts +386 -0
  274. package/node_modules/flingflow/test/store-memory.test.ts +8 -0
  275. package/node_modules/flingflow/test/store-sqlite.test.ts +8 -0
  276. package/node_modules/flingflow/tsconfig.json +18 -0
  277. package/node_modules/flingflow/tsconfig.lint.json +5 -0
  278. package/node_modules/flingflow/tsconfig.typecheck.json +20 -0
  279. package/node_modules/flingflow/vitest.config.ts +10 -0
  280. package/node_modules/fs-constants/LICENSE +21 -0
  281. package/node_modules/fs-constants/README.md +26 -0
  282. package/node_modules/fs-constants/browser.js +1 -0
  283. package/node_modules/fs-constants/index.js +1 -0
  284. package/node_modules/fs-constants/package.json +19 -0
  285. package/node_modules/github-from-package/.travis.yml +4 -0
  286. package/node_modules/github-from-package/LICENSE +18 -0
  287. package/node_modules/github-from-package/example/package.json +8 -0
  288. package/node_modules/github-from-package/example/url.js +3 -0
  289. package/node_modules/github-from-package/index.js +17 -0
  290. package/node_modules/github-from-package/package.json +30 -0
  291. package/node_modules/github-from-package/readme.markdown +53 -0
  292. package/node_modules/github-from-package/test/a.json +8 -0
  293. package/node_modules/github-from-package/test/b.json +5 -0
  294. package/node_modules/github-from-package/test/c.json +5 -0
  295. package/node_modules/github-from-package/test/d.json +7 -0
  296. package/node_modules/github-from-package/test/e.json +5 -0
  297. package/node_modules/github-from-package/test/url.js +19 -0
  298. package/node_modules/ieee754/LICENSE +11 -0
  299. package/node_modules/ieee754/README.md +51 -0
  300. package/node_modules/ieee754/index.d.ts +10 -0
  301. package/node_modules/ieee754/index.js +85 -0
  302. package/node_modules/ieee754/package.json +52 -0
  303. package/node_modules/inherits/LICENSE +16 -0
  304. package/node_modules/inherits/README.md +42 -0
  305. package/node_modules/inherits/inherits.js +9 -0
  306. package/node_modules/inherits/inherits_browser.js +27 -0
  307. package/node_modules/inherits/package.json +29 -0
  308. package/node_modules/ini/LICENSE +15 -0
  309. package/node_modules/ini/README.md +102 -0
  310. package/node_modules/ini/ini.js +206 -0
  311. package/node_modules/ini/package.json +33 -0
  312. package/node_modules/mimic-response/index.d.ts +17 -0
  313. package/node_modules/mimic-response/index.js +77 -0
  314. package/node_modules/mimic-response/license +9 -0
  315. package/node_modules/mimic-response/package.json +42 -0
  316. package/node_modules/mimic-response/readme.md +78 -0
  317. package/node_modules/minimist/.eslintrc +29 -0
  318. package/node_modules/minimist/.github/FUNDING.yml +12 -0
  319. package/node_modules/minimist/.nycrc +14 -0
  320. package/node_modules/minimist/CHANGELOG.md +298 -0
  321. package/node_modules/minimist/LICENSE +18 -0
  322. package/node_modules/minimist/README.md +121 -0
  323. package/node_modules/minimist/example/parse.js +4 -0
  324. package/node_modules/minimist/index.js +263 -0
  325. package/node_modules/minimist/package.json +75 -0
  326. package/node_modules/minimist/test/all_bool.js +34 -0
  327. package/node_modules/minimist/test/bool.js +177 -0
  328. package/node_modules/minimist/test/dash.js +43 -0
  329. package/node_modules/minimist/test/default_bool.js +37 -0
  330. package/node_modules/minimist/test/dotted.js +24 -0
  331. package/node_modules/minimist/test/kv_short.js +32 -0
  332. package/node_modules/minimist/test/long.js +33 -0
  333. package/node_modules/minimist/test/num.js +38 -0
  334. package/node_modules/minimist/test/parse.js +209 -0
  335. package/node_modules/minimist/test/parse_modified.js +11 -0
  336. package/node_modules/minimist/test/proto.js +64 -0
  337. package/node_modules/minimist/test/short.js +69 -0
  338. package/node_modules/minimist/test/stop_early.js +17 -0
  339. package/node_modules/minimist/test/unknown.js +104 -0
  340. package/node_modules/minimist/test/whitespace.js +10 -0
  341. package/node_modules/mkdirp-classic/LICENSE +21 -0
  342. package/node_modules/mkdirp-classic/README.md +18 -0
  343. package/node_modules/mkdirp-classic/index.js +98 -0
  344. package/node_modules/mkdirp-classic/package.json +18 -0
  345. package/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +31 -0
  346. package/node_modules/napi-build-utils/LICENSE +21 -0
  347. package/node_modules/napi-build-utils/README.md +52 -0
  348. package/node_modules/napi-build-utils/index.js +214 -0
  349. package/node_modules/napi-build-utils/index.md +0 -0
  350. package/node_modules/napi-build-utils/package.json +42 -0
  351. package/node_modules/neverthrow/LICENSE +22 -0
  352. package/node_modules/neverthrow/README.md +1683 -0
  353. package/node_modules/neverthrow/dist/index.cjs.js +510 -0
  354. package/node_modules/neverthrow/dist/index.d.ts +408 -0
  355. package/node_modules/neverthrow/dist/index.es.js +497 -0
  356. package/node_modules/neverthrow/package.json +64 -0
  357. package/node_modules/node-abi/LICENSE +21 -0
  358. package/node_modules/node-abi/README.md +54 -0
  359. package/node_modules/node-abi/abi_registry.json +425 -0
  360. package/node_modules/node-abi/index.js +179 -0
  361. package/node_modules/node-abi/package.json +45 -0
  362. package/node_modules/once/LICENSE +15 -0
  363. package/node_modules/once/README.md +79 -0
  364. package/node_modules/once/once.js +42 -0
  365. package/node_modules/once/package.json +33 -0
  366. package/node_modules/prebuild-install/CHANGELOG.md +131 -0
  367. package/node_modules/prebuild-install/CONTRIBUTING.md +6 -0
  368. package/node_modules/prebuild-install/LICENSE +21 -0
  369. package/node_modules/prebuild-install/README.md +163 -0
  370. package/node_modules/prebuild-install/asset.js +44 -0
  371. package/node_modules/prebuild-install/bin.js +78 -0
  372. package/node_modules/prebuild-install/download.js +142 -0
  373. package/node_modules/prebuild-install/error.js +14 -0
  374. package/node_modules/prebuild-install/help.txt +16 -0
  375. package/node_modules/prebuild-install/index.js +1 -0
  376. package/node_modules/prebuild-install/log.js +33 -0
  377. package/node_modules/prebuild-install/package.json +67 -0
  378. package/node_modules/prebuild-install/proxy.js +35 -0
  379. package/node_modules/prebuild-install/rc.js +64 -0
  380. package/node_modules/prebuild-install/util.js +143 -0
  381. package/node_modules/pump/.github/FUNDING.yml +2 -0
  382. package/node_modules/pump/.travis.yml +5 -0
  383. package/node_modules/pump/LICENSE +21 -0
  384. package/node_modules/pump/README.md +74 -0
  385. package/node_modules/pump/SECURITY.md +5 -0
  386. package/node_modules/pump/index.js +86 -0
  387. package/node_modules/pump/package.json +24 -0
  388. package/node_modules/pump/test-browser.js +66 -0
  389. package/node_modules/pump/test-node.js +53 -0
  390. package/node_modules/rc/LICENSE.APACHE2 +15 -0
  391. package/node_modules/rc/LICENSE.BSD +26 -0
  392. package/node_modules/rc/LICENSE.MIT +24 -0
  393. package/node_modules/rc/README.md +227 -0
  394. package/node_modules/rc/browser.js +7 -0
  395. package/node_modules/rc/cli.js +4 -0
  396. package/node_modules/rc/index.js +53 -0
  397. package/node_modules/rc/lib/utils.js +104 -0
  398. package/node_modules/rc/package.json +29 -0
  399. package/node_modules/rc/test/ini.js +16 -0
  400. package/node_modules/rc/test/nested-env-vars.js +50 -0
  401. package/node_modules/rc/test/test.js +59 -0
  402. package/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  403. package/node_modules/readable-stream/GOVERNANCE.md +136 -0
  404. package/node_modules/readable-stream/LICENSE +47 -0
  405. package/node_modules/readable-stream/README.md +106 -0
  406. package/node_modules/readable-stream/errors-browser.js +127 -0
  407. package/node_modules/readable-stream/errors.js +116 -0
  408. package/node_modules/readable-stream/experimentalWarning.js +17 -0
  409. package/node_modules/readable-stream/lib/_stream_duplex.js +126 -0
  410. package/node_modules/readable-stream/lib/_stream_passthrough.js +37 -0
  411. package/node_modules/readable-stream/lib/_stream_readable.js +1027 -0
  412. package/node_modules/readable-stream/lib/_stream_transform.js +190 -0
  413. package/node_modules/readable-stream/lib/_stream_writable.js +641 -0
  414. package/node_modules/readable-stream/lib/internal/streams/async_iterator.js +180 -0
  415. package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +183 -0
  416. package/node_modules/readable-stream/lib/internal/streams/destroy.js +96 -0
  417. package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +86 -0
  418. package/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -0
  419. package/node_modules/readable-stream/lib/internal/streams/from.js +52 -0
  420. package/node_modules/readable-stream/lib/internal/streams/pipeline.js +86 -0
  421. package/node_modules/readable-stream/lib/internal/streams/state.js +22 -0
  422. package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  423. package/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  424. package/node_modules/readable-stream/package.json +68 -0
  425. package/node_modules/readable-stream/readable-browser.js +9 -0
  426. package/node_modules/readable-stream/readable.js +16 -0
  427. package/node_modules/safe-buffer/LICENSE +21 -0
  428. package/node_modules/safe-buffer/README.md +584 -0
  429. package/node_modules/safe-buffer/index.d.ts +187 -0
  430. package/node_modules/safe-buffer/index.js +65 -0
  431. package/node_modules/safe-buffer/package.json +51 -0
  432. package/node_modules/semver/LICENSE +15 -0
  433. package/node_modules/semver/README.md +664 -0
  434. package/node_modules/semver/bin/semver.js +191 -0
  435. package/node_modules/semver/classes/comparator.js +143 -0
  436. package/node_modules/semver/classes/index.js +7 -0
  437. package/node_modules/semver/classes/range.js +557 -0
  438. package/node_modules/semver/classes/semver.js +333 -0
  439. package/node_modules/semver/functions/clean.js +8 -0
  440. package/node_modules/semver/functions/cmp.js +54 -0
  441. package/node_modules/semver/functions/coerce.js +62 -0
  442. package/node_modules/semver/functions/compare-build.js +9 -0
  443. package/node_modules/semver/functions/compare-loose.js +5 -0
  444. package/node_modules/semver/functions/compare.js +7 -0
  445. package/node_modules/semver/functions/diff.js +60 -0
  446. package/node_modules/semver/functions/eq.js +5 -0
  447. package/node_modules/semver/functions/gt.js +5 -0
  448. package/node_modules/semver/functions/gte.js +5 -0
  449. package/node_modules/semver/functions/inc.js +21 -0
  450. package/node_modules/semver/functions/lt.js +5 -0
  451. package/node_modules/semver/functions/lte.js +5 -0
  452. package/node_modules/semver/functions/major.js +5 -0
  453. package/node_modules/semver/functions/minor.js +5 -0
  454. package/node_modules/semver/functions/neq.js +5 -0
  455. package/node_modules/semver/functions/parse.js +18 -0
  456. package/node_modules/semver/functions/patch.js +5 -0
  457. package/node_modules/semver/functions/prerelease.js +8 -0
  458. package/node_modules/semver/functions/rcompare.js +5 -0
  459. package/node_modules/semver/functions/rsort.js +5 -0
  460. package/node_modules/semver/functions/satisfies.js +12 -0
  461. package/node_modules/semver/functions/sort.js +5 -0
  462. package/node_modules/semver/functions/valid.js +8 -0
  463. package/node_modules/semver/index.js +91 -0
  464. package/node_modules/semver/internal/constants.js +37 -0
  465. package/node_modules/semver/internal/debug.js +11 -0
  466. package/node_modules/semver/internal/identifiers.js +29 -0
  467. package/node_modules/semver/internal/lrucache.js +42 -0
  468. package/node_modules/semver/internal/parse-options.js +17 -0
  469. package/node_modules/semver/internal/re.js +223 -0
  470. package/node_modules/semver/package.json +78 -0
  471. package/node_modules/semver/preload.js +4 -0
  472. package/node_modules/semver/range.bnf +16 -0
  473. package/node_modules/semver/ranges/gtr.js +6 -0
  474. package/node_modules/semver/ranges/intersects.js +9 -0
  475. package/node_modules/semver/ranges/ltr.js +6 -0
  476. package/node_modules/semver/ranges/max-satisfying.js +27 -0
  477. package/node_modules/semver/ranges/min-satisfying.js +26 -0
  478. package/node_modules/semver/ranges/min-version.js +63 -0
  479. package/node_modules/semver/ranges/outside.js +82 -0
  480. package/node_modules/semver/ranges/simplify.js +49 -0
  481. package/node_modules/semver/ranges/subset.js +249 -0
  482. package/node_modules/semver/ranges/to-comparators.js +10 -0
  483. package/node_modules/semver/ranges/valid.js +13 -0
  484. package/node_modules/simple-concat/.travis.yml +3 -0
  485. package/node_modules/simple-concat/LICENSE +20 -0
  486. package/node_modules/simple-concat/README.md +44 -0
  487. package/node_modules/simple-concat/index.js +15 -0
  488. package/node_modules/simple-concat/package.json +47 -0
  489. package/node_modules/simple-concat/test/basic.js +41 -0
  490. package/node_modules/simple-get/.github/dependabot.yml +15 -0
  491. package/node_modules/simple-get/.github/workflows/ci.yml +23 -0
  492. package/node_modules/simple-get/LICENSE +20 -0
  493. package/node_modules/simple-get/README.md +333 -0
  494. package/node_modules/simple-get/index.js +108 -0
  495. package/node_modules/simple-get/package.json +67 -0
  496. package/node_modules/string_decoder/LICENSE +48 -0
  497. package/node_modules/string_decoder/README.md +47 -0
  498. package/node_modules/string_decoder/lib/string_decoder.js +296 -0
  499. package/node_modules/string_decoder/package.json +34 -0
  500. package/node_modules/strip-json-comments/index.js +70 -0
  501. package/node_modules/strip-json-comments/license +21 -0
  502. package/node_modules/strip-json-comments/package.json +42 -0
  503. package/node_modules/strip-json-comments/readme.md +64 -0
  504. package/node_modules/tar-fs/.travis.yml +6 -0
  505. package/node_modules/tar-fs/LICENSE +21 -0
  506. package/node_modules/tar-fs/README.md +165 -0
  507. package/node_modules/tar-fs/index.js +363 -0
  508. package/node_modules/tar-fs/package.json +41 -0
  509. package/node_modules/tar-fs/test/fixtures/a/hello.txt +1 -0
  510. package/node_modules/tar-fs/test/fixtures/b/a/test.txt +1 -0
  511. package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
  512. package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
  513. package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
  514. package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
  515. package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
  516. package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
  517. package/node_modules/tar-fs/test/fixtures/e/file +0 -0
  518. package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
  519. package/node_modules/tar-fs/test/index.js +346 -0
  520. package/node_modules/tar-stream/LICENSE +21 -0
  521. package/node_modules/tar-stream/README.md +168 -0
  522. package/node_modules/tar-stream/extract.js +257 -0
  523. package/node_modules/tar-stream/headers.js +295 -0
  524. package/node_modules/tar-stream/index.js +2 -0
  525. package/node_modules/tar-stream/pack.js +255 -0
  526. package/node_modules/tar-stream/package.json +58 -0
  527. package/node_modules/tar-stream/sandbox.js +11 -0
  528. package/node_modules/tunnel-agent/LICENSE +55 -0
  529. package/node_modules/tunnel-agent/README.md +4 -0
  530. package/node_modules/tunnel-agent/index.js +244 -0
  531. package/node_modules/tunnel-agent/package.json +22 -0
  532. package/node_modules/util-deprecate/History.md +16 -0
  533. package/node_modules/util-deprecate/LICENSE +24 -0
  534. package/node_modules/util-deprecate/README.md +53 -0
  535. package/node_modules/util-deprecate/browser.js +67 -0
  536. package/node_modules/util-deprecate/node.js +6 -0
  537. package/node_modules/util-deprecate/package.json +27 -0
  538. package/node_modules/wrappy/LICENSE +15 -0
  539. package/node_modules/wrappy/README.md +36 -0
  540. package/node_modules/wrappy/package.json +29 -0
  541. package/node_modules/wrappy/wrappy.js +33 -0
  542. package/package.json +12 -2
  543. package/templates/default/dot-claude/skills/fling/.hash +1 -1
  544. package/templates/default/dot-claude/skills/fling/SKILL.md +58 -29
  545. package/templates/default/dot-claude/skills/fling/references/WORKFLOWS.md +368 -0
@@ -0,0 +1,550 @@
1
+ # Durable Execution Engine on Cloudflare
2
+
3
+ A design for a minimal viable durable execution engine built on Cloudflare Workers, D1, and Workers for Platforms. The goal is to support a subset of Temporal-like functionality, targeting only TypeScript, running entirely within customer projects.
4
+
5
+ ## Goals
6
+
7
+ - **Durable execution**: Workflows survive worker restarts, timeouts, and failures
8
+ - **Per-project isolation**: All state lives in the project's own D1 database
9
+ - **No platform dependency**: The orchestration runs within the project itself, not in shared infrastructure
10
+ - **Simplicity**: Minimal concepts, minimal schema, easy to reason about
11
+
12
+ ## Alternatives Considered
13
+
14
+ ### Temporal-Style Replay
15
+
16
+ Temporal maintains an ordered event log and replays the entire workflow history to reconstruct state. The workflow function runs from the beginning, and the SDK intercepts each activity call, matching it against the event history by position.
17
+
18
+ ```typescript
19
+ async function onboard(ctx, input) {
20
+ const user = await ctx.activity("fetch-user", () => getUser(input.userId));
21
+ const plan = await ctx.activity("create-plan", () => createPlan(user.id));
22
+ return { planId: plan.id };
23
+ }
24
+ ```
25
+
26
+ On replay, if `fetch-user` already completed, the SDK returns the stored result without executing. The workflow function stays alive in memory, blocked on the next await.
27
+
28
+ **Why we rejected it:**
29
+
30
+ - Workers have CPU time limits (30s on paid plans). Long histories become expensive to replay.
31
+ - Workers can't hold execution state between activity completions. There's no long-lived process—each invocation is ephemeral.
32
+ - Requires strict determinism. Any non-deterministic code (`Math.random`, `Date.now`, etc.) causes replay to diverge.
33
+
34
+ ### Re-Execute with Memoization
35
+
36
+ This is what Inngest and Cloudflare Workflows do. The workflow function runs from the top on every invocation. Each `step.run()` call checks a key-value store: if the step already completed, return the result; otherwise, execute it, persist the result, and stop.
37
+
38
+ ```typescript
39
+ async function onboard(step, input) {
40
+ const user = await step.run("fetch-user", () => getUser(input.userId));
41
+ const plan = await step.run("create-plan", () => createPlan(user.id));
42
+ return { planId: plan.id };
43
+ }
44
+ ```
45
+
46
+ **Pros:**
47
+ - No long-lived process needed
48
+ - Works with arbitrary control flow
49
+ - Simpler than full replay
50
+
51
+ **Cons:**
52
+ - Still re-executes all code between steps on every invocation
53
+ - Code between steps must still be deterministic (affects control flow)
54
+ - Step ID collisions if you're not careful with naming
55
+
56
+ ### Compile Workflows to State Machines
57
+
58
+ Transform the workflow code at build time into an explicit state machine. Each `await step.run()` becomes a case in a switch statement. Local variables that cross step boundaries are lifted into serializable state.
59
+
60
+ ```typescript
61
+ // Compiled output
62
+ function onboard_machine(state, input) {
63
+ switch (state.phase) {
64
+ case 0:
65
+ return { invoke: "fetch-user", fn: () => getUser(input.userId), next: 1 };
66
+ case 1:
67
+ const user = state.results["fetch-user"];
68
+ return { invoke: "create-plan", fn: () => createPlan(user.id), next: 2 };
69
+ // ...
70
+ }
71
+ }
72
+ ```
73
+
74
+ **Pros:**
75
+ - O(1) per step—jump directly to the current phase, no replay
76
+ - No determinism constraints
77
+
78
+ **Cons:**
79
+ - Requires a source-to-source compiler (substantial engineering)
80
+ - Loops and try/catch become complex
81
+ - Non-serializable locals (closures, class instances) fail at runtime
82
+
83
+ We decided this could be a future optimization but is too complex for v1.
84
+
85
+ ## Chosen Design: Explicit Continuations + Scratchpad
86
+
87
+ Instead of hiding the state machine inside a framework, make the user write it explicitly. The workflow is a function that takes the current step and returns a continuation describing what to do next.
88
+
89
+ ### The Model
90
+
91
+ ```typescript
92
+ type Continuation =
93
+ | { step: string } // next step to run
94
+ | { done: true; result: any } // workflow complete
95
+
96
+ type Ctx = {
97
+ step: string; // current step name
98
+ get: (key: string) => Promise<any>; // read from scratchpad
99
+ set: (key: string, value: any) => void; // write to scratchpad (buffered)
100
+ };
101
+
102
+ type WorkflowFn = (ctx: Ctx) => Promise<Continuation>;
103
+ ```
104
+
105
+ ### Example Workflow
106
+
107
+ ```typescript
108
+ async function onboardingWorkflow(ctx: Ctx): Promise<Continuation> {
109
+ switch (ctx.step) {
110
+ case "start": {
111
+ const input = await ctx.get("input");
112
+ const user = await getUser(input.userId);
113
+ ctx.set("user", user);
114
+ return { step: "create-plan" };
115
+ }
116
+ case "create-plan": {
117
+ const user = await ctx.get("user");
118
+ const plan = await createPlan(user.id);
119
+ ctx.set("plan", plan);
120
+ return { step: "send-email" };
121
+ }
122
+ case "send-email": {
123
+ const user = await ctx.get("user");
124
+ const plan = await ctx.get("plan");
125
+ await sendWelcomeEmail(user.email, plan);
126
+ return { done: true, result: { planId: plan.id } };
127
+ }
128
+ }
129
+ }
130
+ ```
131
+
132
+ ### Why This Design
133
+
134
+ **Engine simplicity**: The engine just calls the function, persists what it returns, and calls it again for the next step. No parsing, no memoization, no replay.
135
+
136
+ **No determinism constraints**: Each step is a fresh invocation. You can call `Math.random()`, `Date.now()`, fetch live data—whatever you want.
137
+
138
+ **State is explicit**: The scratchpad is a key-value store. Each step declares what it reads (`ctx.get`) and writes (`ctx.set`). No magic.
139
+
140
+ **Debuggable**: Query the database and see exactly where every workflow is and what it knows.
141
+
142
+ ### The Scratchpad
143
+
144
+ The scratchpad is a per-workflow key-value store.
145
+
146
+ - `ctx.set(key, value)` buffers a write in memory. It's persisted when the step completes successfully.
147
+ - `ctx.get(key)` is async because it may need to fetch from the database.
148
+
149
+ If a step fails or times out, buffered writes are discarded. The step is retried with the scratchpad state from before it started.
150
+
151
+ ## Event Sourcing
152
+
153
+ Rather than storing mutable "current state," we store an append-only event log. The current state is derived from the last event.
154
+
155
+ ### Event Types
156
+
157
+ | Event Type | Payload |
158
+ |------------|---------|
159
+ | `workflow_created` | `{ writes }` |
160
+ | `step_started` | `{ step, attempt }` |
161
+ | `step_completed` | `{ writes, next_step? }` |
162
+ | `step_failed` | `{ reason, retryable }` |
163
+ | `workflow_completed` | `{ result }` |
164
+ | `workflow_failed` | `{ reason, cause }` |
165
+
166
+ - `writes` is a plain JSON object: `{ user: {...}, plan: {...} }`
167
+ - `next_step` is omitted when the workflow is done (next event will be `workflow_completed`)
168
+ - `retryable` indicates whether the failure can be retried
169
+
170
+ ### State Machine
171
+
172
+ The last event determines the workflow's state and what can happen next.
173
+
174
+ ```mermaid
175
+ stateDiagram-v2
176
+ [*] --> workflow_created
177
+ workflow_created --> step_started
178
+ step_started --> step_completed
179
+ step_started --> step_failed
180
+ step_completed --> step_started : has next_step
181
+ step_completed --> workflow_completed : no next_step
182
+ step_failed --> step_started : retryable, can retry
183
+ step_failed --> workflow_failed : not retryable or max attempts
184
+ workflow_completed --> [*]
185
+ workflow_failed --> [*]
186
+ ```
187
+
188
+ ### Valid Transitions
189
+
190
+ | Last Event | Can Be Followed By |
191
+ |------------|---------------------|
192
+ | `workflow_created` | `step_started` |
193
+ | `step_started` | `step_completed`, `step_failed` |
194
+ | `step_completed` (has `next_step`) | `step_started` |
195
+ | `step_completed` (no `next_step`) | `workflow_completed` |
196
+ | `step_failed` (retryable, under max) | `step_started` |
197
+ | `step_failed` (not retryable or max) | `workflow_failed` |
198
+ | `workflow_completed` | *(terminal)* |
199
+ | `workflow_failed` | *(terminal)* |
200
+
201
+ ## Schema
202
+
203
+ ```sql
204
+ CREATE TABLE workflow_events (
205
+ workflow_id TEXT NOT NULL,
206
+ seq INTEGER NOT NULL,
207
+ event_type TEXT NOT NULL,
208
+ payload JSON NOT NULL,
209
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
210
+ PRIMARY KEY (workflow_id, seq)
211
+ );
212
+
213
+ CREATE INDEX idx_workflow_events_last
214
+ ON workflow_events(workflow_id, seq DESC);
215
+ ```
216
+
217
+ The composite primary key `(workflow_id, seq)` enforces uniqueness. Two concurrent writers trying to insert `seq = 5` for the same workflow: one wins, one gets a constraint violation.
218
+
219
+ ## Coordination Without Locks
220
+
221
+ D1 doesn't support interactive transactions—you can't SELECT then UPDATE atomically. We use optimistic concurrency via the unique constraint on `(workflow_id, seq)`.
222
+
223
+ ### Claiming a Step
224
+
225
+ To start a step:
226
+
227
+ 1. Query the last event for the workflow
228
+ 2. Validate that `step_started` is a legal transition from that event
229
+ 3. Insert `step_started` with `seq = last_seq + 1`
230
+
231
+ If the insert fails (unique constraint violation), someone else claimed it. No harm done—the loser just bails.
232
+
233
+ ```typescript
234
+ async function claimStep(db: D1Database, workflowId: string): Promise<ClaimResult | null> {
235
+ // 1. Get last event
236
+ const last = await db.prepare(`
237
+ SELECT * FROM workflow_events
238
+ WHERE workflow_id = ?
239
+ ORDER BY seq DESC
240
+ LIMIT 1
241
+ `).bind(workflowId).first();
242
+
243
+ if (!last) return null;
244
+
245
+ // 2. Validate transition
246
+ const canStart =
247
+ last.event_type === "workflow_created" ||
248
+ (last.event_type === "step_completed" && last.payload.next_step) ||
249
+ (last.event_type === "step_failed" && last.payload.retryable);
250
+
251
+ if (!canStart) return null;
252
+
253
+ // 3. Determine step name and attempt
254
+ const stepName = last.event_type === "workflow_created"
255
+ ? "start"
256
+ : last.event_type === "step_completed"
257
+ ? last.payload.next_step
258
+ : last.payload.step; // retry same step
259
+
260
+ const attempt = last.event_type === "step_failed"
261
+ ? last.payload.attempt + 1
262
+ : 1;
263
+
264
+ // 4. Try to insert (may fail if someone else got there)
265
+ try {
266
+ await db.prepare(`
267
+ INSERT INTO workflow_events (workflow_id, seq, event_type, payload)
268
+ VALUES (?, ?, 'step_started', ?)
269
+ `).bind(
270
+ workflowId,
271
+ last.seq + 1,
272
+ JSON.stringify({ step: stepName, attempt })
273
+ ).run();
274
+
275
+ return { workflowId, step: stepName, attempt, seq: last.seq + 1 };
276
+ } catch (err) {
277
+ // Unique constraint violation = someone else claimed it
278
+ return null;
279
+ }
280
+ }
281
+ ```
282
+
283
+ ## System Components
284
+
285
+ ### Trigger Endpoint
286
+
287
+ Creates a new workflow:
288
+
289
+ ```typescript
290
+ // POST /workflows
291
+ async function createWorkflow(db: D1Database, name: string, writes: Record<string, unknown>): Promise<string> {
292
+ const workflowId = generateId();
293
+
294
+ await db.prepare(`
295
+ INSERT INTO workflow_events (workflow_id, seq, event_type, payload)
296
+ VALUES (?, 0, 'workflow_created', ?)
297
+ `).bind(workflowId, JSON.stringify({ writes })).run();
298
+
299
+ // Kick off first step
300
+ await fetch(`${INTERNAL_URL}/internal/workflow/step`, {
301
+ method: "POST",
302
+ body: JSON.stringify({ workflowId }),
303
+ });
304
+
305
+ return workflowId;
306
+ }
307
+ ```
308
+
309
+ ### Step Endpoint
310
+
311
+ Executes a single step:
312
+
313
+ ```typescript
314
+ // POST /internal/workflow/step
315
+ async function handleStep(request: Request, env: Env) {
316
+ const { workflowId } = await request.json();
317
+
318
+ // 1. Try to claim
319
+ const claim = await claimStep(env.DB, workflowId);
320
+ if (!claim) {
321
+ return new Response("not claimable", { status: 409 });
322
+ }
323
+
324
+ // 2. Build context
325
+ const ctx = await buildContext(env.DB, workflowId, claim);
326
+
327
+ // 3. Execute workflow function
328
+ const workflowFn = getWorkflowFunction(claim.workflowName);
329
+
330
+ try {
331
+ const continuation = await workflowFn(ctx);
332
+
333
+ // 4. Commit
334
+ await commitStep(env.DB, workflowId, claim.seq, ctx.pendingWrites, continuation);
335
+
336
+ // 5. Continue if there's a next step
337
+ if (!continuation.done) {
338
+ env.ctx.waitUntil(
339
+ fetch(request.url, {
340
+ method: "POST",
341
+ body: JSON.stringify({ workflowId }),
342
+ })
343
+ );
344
+ }
345
+
346
+ return new Response("ok");
347
+
348
+ } catch (err) {
349
+ // Step failed
350
+ await insertEvent(env.DB, workflowId, claim.seq + 1, "step_failed", {
351
+ step: claim.step,
352
+ attempt: claim.attempt,
353
+ reason: err.message,
354
+ retryable: true,
355
+ });
356
+
357
+ return new Response("step failed", { status: 500 });
358
+ }
359
+ }
360
+ ```
361
+
362
+ ### Committing a Step
363
+
364
+ ```typescript
365
+ async function commitStep(
366
+ db: D1Database,
367
+ workflowId: string,
368
+ currentSeq: number,
369
+ writes: Record<string, any>,
370
+ continuation: Continuation
371
+ ) {
372
+ if (continuation.done) {
373
+ // Insert step_completed then workflow_completed
374
+ await db.batch([
375
+ db.prepare(`
376
+ INSERT INTO workflow_events (workflow_id, seq, event_type, payload)
377
+ VALUES (?, ?, 'step_completed', ?)
378
+ `).bind(workflowId, currentSeq + 1, JSON.stringify({ writes })),
379
+
380
+ db.prepare(`
381
+ INSERT INTO workflow_events (workflow_id, seq, event_type, payload)
382
+ VALUES (?, ?, 'workflow_completed', ?)
383
+ `).bind(workflowId, currentSeq + 2, JSON.stringify({ result: continuation.result })),
384
+ ]);
385
+ } else {
386
+ // Insert step_completed with next_step
387
+ await db.prepare(`
388
+ INSERT INTO workflow_events (workflow_id, seq, event_type, payload)
389
+ VALUES (?, ?, 'step_completed', ?)
390
+ `).bind(
391
+ workflowId,
392
+ currentSeq + 1,
393
+ JSON.stringify({ writes, next_step: continuation.step })
394
+ ).run();
395
+ }
396
+ }
397
+ ```
398
+
399
+ ### Cron Job
400
+
401
+ Runs every 5–10 seconds. Handles:
402
+
403
+ 1. **Timeouts**: Steps that started but never completed
404
+ 2. **Stuck workflows**: Workflows that should be running but aren't
405
+
406
+ ```typescript
407
+ async function handleCron(env: Env) {
408
+ // Get last event for all non-terminal workflows
409
+ const workflows = await env.DB.prepare(`
410
+ SELECT
411
+ e.workflow_id,
412
+ e.seq,
413
+ e.event_type,
414
+ e.payload,
415
+ e.created_at
416
+ FROM workflow_events e
417
+ INNER JOIN (
418
+ SELECT workflow_id, MAX(seq) as max_seq
419
+ FROM workflow_events
420
+ GROUP BY workflow_id
421
+ ) latest ON e.workflow_id = latest.workflow_id AND e.seq = latest.max_seq
422
+ WHERE e.event_type NOT IN ('workflow_completed', 'workflow_failed')
423
+ `).all();
424
+
425
+ for (const wf of workflows.results) {
426
+ const payload = JSON.parse(wf.payload);
427
+
428
+ if (wf.event_type === "step_started") {
429
+ // Check for timeout
430
+ const startedAt = new Date(wf.created_at);
431
+ const timedOut = Date.now() - startedAt.getTime() > STEP_TIMEOUT_MS;
432
+
433
+ if (timedOut) {
434
+ // Insert step_failed
435
+ await env.DB.prepare(`
436
+ INSERT INTO workflow_events (workflow_id, seq, event_type, payload)
437
+ VALUES (?, ?, 'step_failed', ?)
438
+ `).bind(
439
+ wf.workflow_id,
440
+ wf.seq + 1,
441
+ JSON.stringify({
442
+ step: payload.step,
443
+ attempt: payload.attempt,
444
+ reason: "timeout",
445
+ retryable: true,
446
+ })
447
+ ).run();
448
+
449
+ // Kick the workflow
450
+ env.ctx.waitUntil(triggerStep(wf.workflow_id));
451
+ }
452
+ } else {
453
+ // workflow_created, step_completed, step_failed (retryable)
454
+ // These should all have a step running, but don't
455
+ // Kick the workflow to make progress
456
+ env.ctx.waitUntil(triggerStep(wf.workflow_id));
457
+ }
458
+ }
459
+ }
460
+
461
+ async function triggerStep(workflowId: string) {
462
+ await fetch(`${INTERNAL_URL}/internal/workflow/step`, {
463
+ method: "POST",
464
+ body: JSON.stringify({ workflowId }),
465
+ });
466
+ }
467
+ ```
468
+
469
+ ## Reconstructing the Scratchpad
470
+
471
+ To get a key's current value, scan `step_completed` events from newest to oldest:
472
+
473
+ ```typescript
474
+ async function getScratchpadValue(db: D1Database, workflowId: string, key: string): Promise<any> {
475
+ const events = await db.prepare(`
476
+ SELECT payload FROM workflow_events
477
+ WHERE workflow_id = ?
478
+ AND event_type = 'step_completed'
479
+ ORDER BY seq DESC
480
+ `).bind(workflowId).all();
481
+
482
+ for (const event of events.results) {
483
+ const payload = JSON.parse(event.payload);
484
+ if (payload.writes && key in payload.writes) {
485
+ return payload.writes[key];
486
+ }
487
+ }
488
+
489
+ return undefined;
490
+ }
491
+ ```
492
+
493
+ For efficiency, the step endpoint can cache reads during execution so multiple `ctx.get()` calls for the same key don't hit the database repeatedly.
494
+
495
+ ## Event Log Example
496
+
497
+ A successful workflow:
498
+
499
+ | seq | event_type | payload |
500
+ |-----|------------|---------|
501
+ | 0 | `workflow_created` | `{ writes: { userId: 123 } }` |
502
+ | 1 | `step_started` | `{ step: "start", attempt: 1 }` |
503
+ | 2 | `step_completed` | `{ writes: { user: {...} }, next_step: "create-plan" }` |
504
+ | 3 | `step_started` | `{ step: "create-plan", attempt: 1 }` |
505
+ | 4 | `step_completed` | `{ writes: { plan: {...} }, next_step: "send-email" }` |
506
+ | 5 | `step_started` | `{ step: "send-email", attempt: 1 }` |
507
+ | 6 | `step_completed` | `{ writes: {} }` |
508
+ | 7 | `workflow_completed` | `{ result: { planId: "abc" } }` |
509
+
510
+ A workflow with a retry:
511
+
512
+ | seq | event_type | payload |
513
+ |-----|------------|---------|
514
+ | 0 | `workflow_created` | `{ writes: { userId: 123 } }` |
515
+ | 1 | `step_started` | `{ step: "start", attempt: 1 }` |
516
+ | 2 | `step_failed` | `{ step: "start", attempt: 1, reason: "connection timeout", retryable: true }` |
517
+ | 3 | `step_started` | `{ step: "start", attempt: 2 }` |
518
+ | 4 | `step_completed` | `{ writes: { user: {...} }, next_step: "create-plan" }` |
519
+ | ... | | |
520
+
521
+ ## Future Extensions
522
+
523
+ ### Sleep / Delayed Execution
524
+
525
+ Add `run_at` to `step_completed`:
526
+
527
+ ```typescript
528
+ return { step: "remind-user", runAt: new Date("2025-03-10") };
529
+ ```
530
+
531
+ The cron job would check for `step_completed` events where `run_at <= now` and kick those workflows.
532
+
533
+ ### Signals / External Triggers
534
+
535
+ Add a `wait_for` field to `step_completed` and a new event type `signal_received`. The workflow pauses until an external HTTP call delivers the signal.
536
+
537
+ ### Child Workflows
538
+
539
+ A step can spawn a child workflow and wait for its completion. The parent's `step_completed` would reference the child workflow ID, and the step wouldn't complete until the child reaches `workflow_completed`.
540
+
541
+ ## Summary
542
+
543
+ This design achieves durable execution with:
544
+
545
+ - **One table**: `workflow_events`
546
+ - **Append-only writes**: Events are immutable
547
+ - **Optimistic concurrency**: The unique constraint on `(workflow_id, seq)` is the lock
548
+ - **No external dependencies**: Everything runs in the project's Workers and D1
549
+ - **Self-healing**: The cron job catches timeouts and stuck workflows
550
+ - **Full audit trail**: The event log is the history