adispatchd 0.0.0-stage → 0.1.0

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 (396) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +195 -2
  3. package/dist/api/errors.d.ts +27 -0
  4. package/dist/api/errors.js +80 -0
  5. package/dist/api/errors.js.map +1 -0
  6. package/dist/api/index.d.ts +10 -0
  7. package/dist/api/index.js +11 -0
  8. package/dist/api/index.js.map +1 -0
  9. package/dist/api/logs.d.ts +30 -0
  10. package/dist/api/logs.js +88 -0
  11. package/dist/api/logs.js.map +1 -0
  12. package/dist/api/serialize.d.ts +65 -0
  13. package/dist/api/serialize.js +135 -0
  14. package/dist/api/serialize.js.map +1 -0
  15. package/dist/api/server.d.ts +89 -0
  16. package/dist/api/server.js +751 -0
  17. package/dist/api/server.js.map +1 -0
  18. package/dist/api/sse.d.ts +90 -0
  19. package/dist/api/sse.js +225 -0
  20. package/dist/api/sse.js.map +1 -0
  21. package/dist/app.d.ts +173 -0
  22. package/dist/app.js +488 -0
  23. package/dist/app.js.map +1 -0
  24. package/dist/cli/config-validate.d.ts +6 -0
  25. package/dist/cli/config-validate.js +39 -0
  26. package/dist/cli/config-validate.js.map +1 -0
  27. package/dist/cli/control.d.ts +31 -0
  28. package/dist/cli/control.js +186 -0
  29. package/dist/cli/control.js.map +1 -0
  30. package/dist/cli/http-client.d.ts +57 -0
  31. package/dist/cli/http-client.js +174 -0
  32. package/dist/cli/http-client.js.map +1 -0
  33. package/dist/cli/index.d.ts +14 -0
  34. package/dist/cli/index.js +14 -0
  35. package/dist/cli/index.js.map +1 -0
  36. package/dist/cli/init-templates.d.ts +20 -0
  37. package/dist/cli/init-templates.js +275 -0
  38. package/dist/cli/init-templates.js.map +1 -0
  39. package/dist/cli/init.d.ts +16 -0
  40. package/dist/cli/init.js +107 -0
  41. package/dist/cli/init.js.map +1 -0
  42. package/dist/cli/main.d.ts +2 -0
  43. package/dist/cli/main.js +25 -0
  44. package/dist/cli/main.js.map +1 -0
  45. package/dist/cli/program.d.ts +102 -0
  46. package/dist/cli/program.js +133 -0
  47. package/dist/cli/program.js.map +1 -0
  48. package/dist/cli/service.d.ts +27 -0
  49. package/dist/cli/service.js +252 -0
  50. package/dist/cli/service.js.map +1 -0
  51. package/dist/cli/start.d.ts +22 -0
  52. package/dist/cli/start.js +133 -0
  53. package/dist/cli/start.js.map +1 -0
  54. package/dist/cli/workflow-dry-run.d.ts +13 -0
  55. package/dist/cli/workflow-dry-run.js +144 -0
  56. package/dist/cli/workflow-dry-run.js.map +1 -0
  57. package/dist/config/field-catalog.d.ts +33 -0
  58. package/dist/config/field-catalog.js +172 -0
  59. package/dist/config/field-catalog.js.map +1 -0
  60. package/dist/config/filter-schema.d.ts +15 -0
  61. package/dist/config/filter-schema.js +110 -0
  62. package/dist/config/filter-schema.js.map +1 -0
  63. package/dist/config/index.d.ts +15 -0
  64. package/dist/config/index.js +16 -0
  65. package/dist/config/index.js.map +1 -0
  66. package/dist/config/issues.d.ts +27 -0
  67. package/dist/config/issues.js +37 -0
  68. package/dist/config/issues.js.map +1 -0
  69. package/dist/config/loader.d.ts +32 -0
  70. package/dist/config/loader.js +250 -0
  71. package/dist/config/loader.js.map +1 -0
  72. package/dist/config/manager.d.ts +153 -0
  73. package/dist/config/manager.js +276 -0
  74. package/dist/config/manager.js.map +1 -0
  75. package/dist/config/model.d.ts +334 -0
  76. package/dist/config/model.js +2 -0
  77. package/dist/config/model.js.map +1 -0
  78. package/dist/config/normalize.d.ts +20 -0
  79. package/dist/config/normalize.js +200 -0
  80. package/dist/config/normalize.js.map +1 -0
  81. package/dist/config/parameters.d.ts +37 -0
  82. package/dist/config/parameters.js +71 -0
  83. package/dist/config/parameters.js.map +1 -0
  84. package/dist/config/public.d.ts +6 -0
  85. package/dist/config/public.js +18 -0
  86. package/dist/config/public.js.map +1 -0
  87. package/dist/config/schemas.d.ts +538 -0
  88. package/dist/config/schemas.js +321 -0
  89. package/dist/config/schemas.js.map +1 -0
  90. package/dist/config/snapshot.d.ts +38 -0
  91. package/dist/config/snapshot.js +57 -0
  92. package/dist/config/snapshot.js.map +1 -0
  93. package/dist/config/validate.d.ts +33 -0
  94. package/dist/config/validate.js +346 -0
  95. package/dist/config/validate.js.map +1 -0
  96. package/dist/core/clock.d.ts +59 -0
  97. package/dist/core/clock.js +133 -0
  98. package/dist/core/clock.js.map +1 -0
  99. package/dist/core/duration.d.ts +19 -0
  100. package/dist/core/duration.js +93 -0
  101. package/dist/core/duration.js.map +1 -0
  102. package/dist/core/errors.d.ts +62 -0
  103. package/dist/core/errors.js +72 -0
  104. package/dist/core/errors.js.map +1 -0
  105. package/dist/core/ids.d.ts +57 -0
  106. package/dist/core/ids.js +88 -0
  107. package/dist/core/ids.js.map +1 -0
  108. package/dist/core/index.d.ts +13 -0
  109. package/dist/core/index.js +14 -0
  110. package/dist/core/index.js.map +1 -0
  111. package/dist/core/logger.d.ts +100 -0
  112. package/dist/core/logger.js +207 -0
  113. package/dist/core/logger.js.map +1 -0
  114. package/dist/core/paths.d.ts +84 -0
  115. package/dist/core/paths.js +138 -0
  116. package/dist/core/paths.js.map +1 -0
  117. package/dist/core/template.d.ts +136 -0
  118. package/dist/core/template.js +261 -0
  119. package/dist/core/template.js.map +1 -0
  120. package/dist/core/types.d.ts +544 -0
  121. package/dist/core/types.js +172 -0
  122. package/dist/core/types.js.map +1 -0
  123. package/dist/core/worker-protocol.d.ts +102 -0
  124. package/dist/core/worker-protocol.js +75 -0
  125. package/dist/core/worker-protocol.js.map +1 -0
  126. package/dist/executors/classify.d.ts +25 -0
  127. package/dist/executors/classify.js +54 -0
  128. package/dist/executors/classify.js.map +1 -0
  129. package/dist/executors/dispatcher.d.ts +35 -0
  130. package/dist/executors/dispatcher.js +68 -0
  131. package/dist/executors/dispatcher.js.map +1 -0
  132. package/dist/executors/env.d.ts +43 -0
  133. package/dist/executors/env.js +66 -0
  134. package/dist/executors/env.js.map +1 -0
  135. package/dist/executors/event-parser.d.ts +41 -0
  136. package/dist/executors/event-parser.js +106 -0
  137. package/dist/executors/event-parser.js.map +1 -0
  138. package/dist/executors/index.d.ts +12 -0
  139. package/dist/executors/index.js +13 -0
  140. package/dist/executors/index.js.map +1 -0
  141. package/dist/executors/log-capture.d.ts +57 -0
  142. package/dist/executors/log-capture.js +155 -0
  143. package/dist/executors/log-capture.js.map +1 -0
  144. package/dist/executors/process-identity.d.ts +124 -0
  145. package/dist/executors/process-identity.js +283 -0
  146. package/dist/executors/process-identity.js.map +1 -0
  147. package/dist/executors/shell-executor.d.ts +35 -0
  148. package/dist/executors/shell-executor.js +478 -0
  149. package/dist/executors/shell-executor.js.map +1 -0
  150. package/dist/executors/stream-redactor.d.ts +40 -0
  151. package/dist/executors/stream-redactor.js +89 -0
  152. package/dist/executors/stream-redactor.js.map +1 -0
  153. package/dist/executors/workspace.d.ts +10 -0
  154. package/dist/executors/workspace.js +47 -0
  155. package/dist/executors/workspace.js.map +1 -0
  156. package/dist/filters/evaluate.d.ts +77 -0
  157. package/dist/filters/evaluate.js +187 -0
  158. package/dist/filters/evaluate.js.map +1 -0
  159. package/dist/filters/fields.d.ts +35 -0
  160. package/dist/filters/fields.js +75 -0
  161. package/dist/filters/fields.js.map +1 -0
  162. package/dist/filters/index.d.ts +11 -0
  163. package/dist/filters/index.js +12 -0
  164. package/dist/filters/index.js.map +1 -0
  165. package/dist/filters/iso-date.d.ts +10 -0
  166. package/dist/filters/iso-date.js +42 -0
  167. package/dist/filters/iso-date.js.map +1 -0
  168. package/dist/filters/predicate.d.ts +24 -0
  169. package/dist/filters/predicate.js +178 -0
  170. package/dist/filters/predicate.js.map +1 -0
  171. package/dist/filters/priority.d.ts +51 -0
  172. package/dist/filters/priority.js +91 -0
  173. package/dist/filters/priority.js.map +1 -0
  174. package/dist/filters/pushdown.d.ts +12 -0
  175. package/dist/filters/pushdown.js +52 -0
  176. package/dist/filters/pushdown.js.map +1 -0
  177. package/dist/filters/shell-check.d.ts +110 -0
  178. package/dist/filters/shell-check.js +304 -0
  179. package/dist/filters/shell-check.js.map +1 -0
  180. package/dist/identities/github-app.d.ts +55 -0
  181. package/dist/identities/github-app.js +160 -0
  182. package/dist/identities/github-app.js.map +1 -0
  183. package/dist/identities/index.d.ts +6 -0
  184. package/dist/identities/index.js +7 -0
  185. package/dist/identities/index.js.map +1 -0
  186. package/dist/identities/jwt.d.ts +24 -0
  187. package/dist/identities/jwt.js +56 -0
  188. package/dist/identities/jwt.js.map +1 -0
  189. package/dist/lifecycle/context.d.ts +106 -0
  190. package/dist/lifecycle/context.js +170 -0
  191. package/dist/lifecycle/context.js.map +1 -0
  192. package/dist/lifecycle/engine.d.ts +185 -0
  193. package/dist/lifecycle/engine.js +551 -0
  194. package/dist/lifecycle/engine.js.map +1 -0
  195. package/dist/lifecycle/errors.d.ts +48 -0
  196. package/dist/lifecycle/errors.js +71 -0
  197. package/dist/lifecycle/errors.js.map +1 -0
  198. package/dist/lifecycle/index.d.ts +9 -0
  199. package/dist/lifecycle/index.js +9 -0
  200. package/dist/lifecycle/index.js.map +1 -0
  201. package/dist/lifecycle/performers.d.ts +66 -0
  202. package/dist/lifecycle/performers.js +179 -0
  203. package/dist/lifecycle/performers.js.map +1 -0
  204. package/dist/notifications/index.d.ts +6 -0
  205. package/dist/notifications/index.js +7 -0
  206. package/dist/notifications/index.js.map +1 -0
  207. package/dist/notifications/service.d.ts +115 -0
  208. package/dist/notifications/service.js +364 -0
  209. package/dist/notifications/service.js.map +1 -0
  210. package/dist/persistence/actions.d.ts +101 -0
  211. package/dist/persistence/actions.js +196 -0
  212. package/dist/persistence/actions.js.map +1 -0
  213. package/dist/persistence/blocks.d.ts +85 -0
  214. package/dist/persistence/blocks.js +140 -0
  215. package/dist/persistence/blocks.js.map +1 -0
  216. package/dist/persistence/cron-firings.d.ts +55 -0
  217. package/dist/persistence/cron-firings.js +70 -0
  218. package/dist/persistence/cron-firings.js.map +1 -0
  219. package/dist/persistence/database.d.ts +60 -0
  220. package/dist/persistence/database.js +124 -0
  221. package/dist/persistence/database.js.map +1 -0
  222. package/dist/persistence/errors.d.ts +39 -0
  223. package/dist/persistence/errors.js +67 -0
  224. package/dist/persistence/errors.js.map +1 -0
  225. package/dist/persistence/events.d.ts +72 -0
  226. package/dist/persistence/events.js +83 -0
  227. package/dist/persistence/events.js.map +1 -0
  228. package/dist/persistence/index.d.ts +18 -0
  229. package/dist/persistence/index.js +19 -0
  230. package/dist/persistence/index.js.map +1 -0
  231. package/dist/persistence/instance-lock.d.ts +26 -0
  232. package/dist/persistence/instance-lock.js +117 -0
  233. package/dist/persistence/instance-lock.js.map +1 -0
  234. package/dist/persistence/lock-keys.d.ts +16 -0
  235. package/dist/persistence/lock-keys.js +41 -0
  236. package/dist/persistence/lock-keys.js.map +1 -0
  237. package/dist/persistence/notifications.d.ts +113 -0
  238. package/dist/persistence/notifications.js +213 -0
  239. package/dist/persistence/notifications.js.map +1 -0
  240. package/dist/persistence/persistence.d.ts +46 -0
  241. package/dist/persistence/persistence.js +42 -0
  242. package/dist/persistence/persistence.js.map +1 -0
  243. package/dist/persistence/retention.d.ts +46 -0
  244. package/dist/persistence/retention.js +68 -0
  245. package/dist/persistence/retention.js.map +1 -0
  246. package/dist/persistence/runs.d.ts +215 -0
  247. package/dist/persistence/runs.js +417 -0
  248. package/dist/persistence/runs.js.map +1 -0
  249. package/dist/persistence/schema.d.ts +16 -0
  250. package/dist/persistence/schema.js +183 -0
  251. package/dist/persistence/schema.js.map +1 -0
  252. package/dist/persistence/sqlite.d.ts +49 -0
  253. package/dist/persistence/sqlite.js +131 -0
  254. package/dist/persistence/sqlite.js.map +1 -0
  255. package/dist/runs/controller.d.ts +307 -0
  256. package/dist/runs/controller.js +1078 -0
  257. package/dist/runs/controller.js.map +1 -0
  258. package/dist/runs/errors.d.ts +20 -0
  259. package/dist/runs/errors.js +26 -0
  260. package/dist/runs/errors.js.map +1 -0
  261. package/dist/runs/event-bus.d.ts +106 -0
  262. package/dist/runs/event-bus.js +105 -0
  263. package/dist/runs/event-bus.js.map +1 -0
  264. package/dist/runs/execution.d.ts +39 -0
  265. package/dist/runs/execution.js +146 -0
  266. package/dist/runs/execution.js.map +1 -0
  267. package/dist/runs/index.d.ts +12 -0
  268. package/dist/runs/index.js +13 -0
  269. package/dist/runs/index.js.map +1 -0
  270. package/dist/runs/retention.d.ts +64 -0
  271. package/dist/runs/retention.js +232 -0
  272. package/dist/runs/retention.js.map +1 -0
  273. package/dist/runs/workspace.d.ts +20 -0
  274. package/dist/runs/workspace.js +51 -0
  275. package/dist/runs/workspace.js.map +1 -0
  276. package/dist/scheduler/checks.d.ts +41 -0
  277. package/dist/scheduler/checks.js +111 -0
  278. package/dist/scheduler/checks.js.map +1 -0
  279. package/dist/scheduler/cron.d.ts +32 -0
  280. package/dist/scheduler/cron.js +83 -0
  281. package/dist/scheduler/cron.js.map +1 -0
  282. package/dist/scheduler/dry-run.d.ts +42 -0
  283. package/dist/scheduler/dry-run.js +167 -0
  284. package/dist/scheduler/dry-run.js.map +1 -0
  285. package/dist/scheduler/errors.d.ts +22 -0
  286. package/dist/scheduler/errors.js +22 -0
  287. package/dist/scheduler/errors.js.map +1 -0
  288. package/dist/scheduler/format.d.ts +3 -0
  289. package/dist/scheduler/format.js +73 -0
  290. package/dist/scheduler/format.js.map +1 -0
  291. package/dist/scheduler/index.d.ts +13 -0
  292. package/dist/scheduler/index.js +14 -0
  293. package/dist/scheduler/index.js.map +1 -0
  294. package/dist/scheduler/planner.d.ts +88 -0
  295. package/dist/scheduler/planner.js +255 -0
  296. package/dist/scheduler/planner.js.map +1 -0
  297. package/dist/scheduler/scheduler.d.ts +160 -0
  298. package/dist/scheduler/scheduler.js +680 -0
  299. package/dist/scheduler/scheduler.js.map +1 -0
  300. package/dist/scheduler/state.d.ts +26 -0
  301. package/dist/scheduler/state.js +25 -0
  302. package/dist/scheduler/state.js.map +1 -0
  303. package/dist/scheduler/types.d.ts +197 -0
  304. package/dist/scheduler/types.js +3 -0
  305. package/dist/scheduler/types.js.map +1 -0
  306. package/dist/service/index.d.ts +6 -0
  307. package/dist/service/index.js +7 -0
  308. package/dist/service/index.js.map +1 -0
  309. package/dist/service/install.d.ts +93 -0
  310. package/dist/service/install.js +250 -0
  311. package/dist/service/install.js.map +1 -0
  312. package/dist/service/unit.d.ts +50 -0
  313. package/dist/service/unit.js +171 -0
  314. package/dist/service/unit.js.map +1 -0
  315. package/dist/sources/github/adapter.d.ts +99 -0
  316. package/dist/sources/github/adapter.js +336 -0
  317. package/dist/sources/github/adapter.js.map +1 -0
  318. package/dist/sources/github/fields.d.ts +8 -0
  319. package/dist/sources/github/fields.js +72 -0
  320. package/dist/sources/github/fields.js.map +1 -0
  321. package/dist/sources/github/http.d.ts +100 -0
  322. package/dist/sources/github/http.js +288 -0
  323. package/dist/sources/github/http.js.map +1 -0
  324. package/dist/sources/github/index.d.ts +6 -0
  325. package/dist/sources/github/index.js +7 -0
  326. package/dist/sources/github/index.js.map +1 -0
  327. package/dist/sources/github/pushdown.d.ts +14 -0
  328. package/dist/sources/github/pushdown.js +47 -0
  329. package/dist/sources/github/pushdown.js.map +1 -0
  330. package/dist/sources/github/refs.d.ts +17 -0
  331. package/dist/sources/github/refs.js +61 -0
  332. package/dist/sources/github/refs.js.map +1 -0
  333. package/dist/sources/index.d.ts +6 -0
  334. package/dist/sources/index.js +7 -0
  335. package/dist/sources/index.js.map +1 -0
  336. package/dist/ui/index.d.ts +12 -0
  337. package/dist/ui/index.js +28 -0
  338. package/dist/ui/index.js.map +1 -0
  339. package/dist/ui/public/app.css +239 -0
  340. package/dist/ui/public/favicon.svg +1 -0
  341. package/dist/ui/public/index.html +27 -0
  342. package/dist/ui/public/js/client/api.js +68 -0
  343. package/dist/ui/public/js/client/app.js +146 -0
  344. package/dist/ui/public/js/client/dom.js +34 -0
  345. package/dist/ui/public/js/client/page.js +9 -0
  346. package/dist/ui/public/js/client/pages/actions.js +35 -0
  347. package/dist/ui/public/js/client/pages/blocked.js +58 -0
  348. package/dist/ui/public/js/client/pages/config.js +126 -0
  349. package/dist/ui/public/js/client/pages/dashboard.js +175 -0
  350. package/dist/ui/public/js/client/pages/run.js +367 -0
  351. package/dist/ui/public/js/client/pages/runs.js +72 -0
  352. package/dist/ui/public/js/client/pages/views.js +80 -0
  353. package/dist/ui/public/js/client/pages/workflows.js +291 -0
  354. package/dist/ui/public/js/client/types.js +1 -0
  355. package/dist/ui/public/js/client/ui.js +152 -0
  356. package/dist/ui/public/js/shared/dom.js +77 -0
  357. package/dist/ui/public/js/shared/events.js +88 -0
  358. package/dist/ui/public/js/shared/format.js +213 -0
  359. package/dist/ui/public/js/shared/logs.js +136 -0
  360. package/dist/ui/public/js/shared/params.js +90 -0
  361. package/dist/ui/public/js/shared/route.js +36 -0
  362. package/dist/ui/public/js/shared/sort.js +70 -0
  363. package/dist/ui/public/js/shared/sse.js +193 -0
  364. package/dist/ui/public/js/shared/throttle.js +65 -0
  365. package/dist/views/index.d.ts +6 -0
  366. package/dist/views/index.js +7 -0
  367. package/dist/views/index.js.map +1 -0
  368. package/dist/views/service.d.ts +131 -0
  369. package/dist/views/service.js +264 -0
  370. package/dist/views/service.js.map +1 -0
  371. package/docs/api.md +239 -0
  372. package/docs/configuration-reference.md +1785 -0
  373. package/docs/cron-semantics.md +96 -0
  374. package/docs/manual-tests/github-fixture/config.yaml +30 -0
  375. package/docs/manual-tests/github-fixture/helpers.sh +93 -0
  376. package/docs/manual-tests/github-fixture/identities.yaml +18 -0
  377. package/docs/manual-tests/github-fixture/scripts/test-worker.sh +100 -0
  378. package/docs/manual-tests/github-fixture/sources.yaml +13 -0
  379. package/docs/manual-tests/github-fixture/views/dependencies.yaml +17 -0
  380. package/docs/manual-tests/github-fixture/views/needs-maintainer.yaml +17 -0
  381. package/docs/manual-tests/github-fixture/workflows/coder-test.yaml +76 -0
  382. package/docs/manual-tests/github-fixture/workflows/commenter-test.yaml +63 -0
  383. package/docs/manual-tests/github-fixture/workflows/reviewer-test.yaml +60 -0
  384. package/docs/manual-tests/github.md +1308 -0
  385. package/docs/manual-tests/process-supervision.md +64 -0
  386. package/docs/manual-tests/systemd.md +68 -0
  387. package/docs/operations.md +271 -0
  388. package/docs/worker-protocol.md +145 -0
  389. package/examples/config/config.yaml +35 -0
  390. package/examples/config/identities.yaml +18 -0
  391. package/examples/config/sources.yaml +13 -0
  392. package/examples/config/views/needs-maintainer.yaml +15 -0
  393. package/examples/config/workflows/coder-project-a.yaml +86 -0
  394. package/examples/config/workflows/deploy.yaml +15 -0
  395. package/examples/config/workflows/nightly-maintenance.yaml +13 -0
  396. package/package.json +75 -4
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Versioned schema migrations (Spec §12). Migrations are append-only: never
3
+ * edit a released migration, add a new version instead.
4
+ */
5
+ import type { DatabaseSync } from 'node:sqlite';
6
+ /** One schema migration. Applied in its own transaction together with its `schema_migrations` row. */
7
+ export interface Migration {
8
+ /** Strictly increasing, starting at 1. */
9
+ version: number;
10
+ /** Short identifier for diagnostics. */
11
+ name: string;
12
+ /** Apply the migration. Runs inside a transaction; must not COMMIT/ROLLBACK itself. */
13
+ up(db: DatabaseSync): void;
14
+ }
15
+ /** All built-in migrations, in order. */
16
+ export declare const MIGRATIONS: readonly Migration[];
@@ -0,0 +1,183 @@
1
+ const ACTIVE_STATUS_SQL = `('reserved','starting','running','cancelling','finalizing','recovery_pending')`;
2
+ const V1_DDL = `
3
+ CREATE TABLE runs (
4
+ id TEXT PRIMARY KEY,
5
+ workflow_id TEXT NOT NULL,
6
+ trigger_type TEXT NOT NULL CHECK (trigger_type IN ('source','schedule','manual')),
7
+ source_id TEXT,
8
+ source_item_key TEXT,
9
+ source_url TEXT,
10
+ lock_key TEXT NOT NULL,
11
+ scheduled_for TEXT,
12
+ config_snapshot TEXT NOT NULL,
13
+ parameters_json TEXT,
14
+ identity TEXT,
15
+ command TEXT,
16
+ status TEXT NOT NULL CHECK (status IN ('reserved','starting','running','cancelling','finalizing',
17
+ 'completed','crashed','start_error','timed_out','cancelled','recovery_pending')),
18
+ final_status TEXT CHECK (final_status IN ('completed','crashed','start_error','timed_out','cancelled')),
19
+ business_result TEXT CHECK (business_result IN ('success','failure')),
20
+ final_reason TEXT,
21
+ exit_code INTEGER,
22
+ pid INTEGER,
23
+ process_start_identity TEXT,
24
+ workspace_path TEXT,
25
+ status_message TEXT,
26
+ result_json TEXT,
27
+ error_json TEXT,
28
+ lifecycle_status TEXT CHECK (lifecycle_status IN ('pending','running','succeeded','failed')),
29
+ block_generation INTEGER,
30
+ counted_technical_failure INTEGER NOT NULL DEFAULT 0 CHECK (counted_technical_failure IN (0,1)),
31
+ created_at TEXT NOT NULL,
32
+ started_at TEXT,
33
+ finalizing_at TEXT,
34
+ finished_at TEXT,
35
+ updated_at TEXT NOT NULL
36
+ );
37
+ CREATE INDEX runs_workflow_created ON runs (workflow_id, created_at DESC);
38
+ CREATE INDEX runs_item_created ON runs (source_item_key, created_at DESC);
39
+ CREATE INDEX runs_status ON runs (status);
40
+ CREATE INDEX runs_finished ON runs (finished_at);
41
+ CREATE INDEX runs_created ON runs (created_at DESC);
42
+ -- Second line of defence besides the locks table: at most one active run per (workflow, lock key).
43
+ CREATE UNIQUE INDEX runs_active_lock ON runs (workflow_id, lock_key) WHERE status IN ${ACTIVE_STATUS_SQL};
44
+
45
+ CREATE TABLE locks (
46
+ workflow_id TEXT NOT NULL,
47
+ lock_key TEXT NOT NULL,
48
+ run_id TEXT NOT NULL UNIQUE REFERENCES runs (id) ON DELETE RESTRICT,
49
+ source_item_key TEXT,
50
+ acquired_at TEXT NOT NULL,
51
+ PRIMARY KEY (workflow_id, lock_key)
52
+ );
53
+
54
+ CREATE TABLE run_events (
55
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
56
+ run_id TEXT NOT NULL REFERENCES runs (id) ON DELETE CASCADE,
57
+ sequence INTEGER NOT NULL,
58
+ timestamp TEXT NOT NULL,
59
+ origin TEXT NOT NULL CHECK (origin IN ('worker','orchestrator')),
60
+ type TEXT NOT NULL,
61
+ payload_json TEXT NOT NULL,
62
+ UNIQUE (run_id, sequence)
63
+ );
64
+
65
+ CREATE TABLE run_actions (
66
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
67
+ run_id TEXT NOT NULL REFERENCES runs (id) ON DELETE CASCADE,
68
+ hook TEXT NOT NULL CHECK (hook IN ('on_start','on_success','on_failure','on_crash','on_start_error','on_cancel','on_timeout')),
69
+ ordinal INTEGER NOT NULL CHECK (ordinal >= 0),
70
+ action_type TEXT NOT NULL,
71
+ action_name TEXT,
72
+ action_config_json TEXT NOT NULL,
73
+ status TEXT NOT NULL CHECK (status IN ('pending','running','succeeded','failed','skipped')),
74
+ external_key TEXT,
75
+ attempts INTEGER NOT NULL DEFAULT 0,
76
+ last_error_json TEXT,
77
+ created_at TEXT NOT NULL,
78
+ updated_at TEXT NOT NULL,
79
+ UNIQUE (run_id, hook, ordinal)
80
+ );
81
+ CREATE INDEX run_actions_status ON run_actions (status);
82
+
83
+ CREATE TABLE action_attempts (
84
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
85
+ run_action_id INTEGER NOT NULL REFERENCES run_actions (id) ON DELETE CASCADE,
86
+ attempt INTEGER NOT NULL CHECK (attempt >= 1),
87
+ started_at TEXT NOT NULL,
88
+ finished_at TEXT,
89
+ outcome TEXT CHECK (outcome IN ('succeeded','failed')),
90
+ error_json TEXT,
91
+ external_key TEXT,
92
+ UNIQUE (run_action_id, attempt)
93
+ );
94
+
95
+ CREATE TABLE failure_counters (
96
+ workflow_id TEXT NOT NULL,
97
+ scope_key TEXT NOT NULL,
98
+ consecutive INTEGER NOT NULL DEFAULT 0 CHECK (consecutive >= 0),
99
+ generation INTEGER NOT NULL DEFAULT 0 CHECK (generation >= 0),
100
+ updated_at TEXT NOT NULL,
101
+ PRIMARY KEY (workflow_id, scope_key)
102
+ );
103
+
104
+ CREATE TABLE blocks (
105
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
106
+ workflow_id TEXT NOT NULL,
107
+ source_item_key TEXT,
108
+ reason TEXT NOT NULL,
109
+ run_id TEXT REFERENCES runs (id) ON DELETE SET NULL,
110
+ failure_count INTEGER NOT NULL DEFAULT 0,
111
+ generation INTEGER NOT NULL,
112
+ created_at TEXT NOT NULL,
113
+ cleared_at TEXT,
114
+ cleared_by TEXT
115
+ );
116
+ CREATE UNIQUE INDEX blocks_one_active ON blocks (workflow_id, COALESCE(source_item_key, '')) WHERE cleared_at IS NULL;
117
+ CREATE INDEX blocks_key ON blocks (workflow_id, source_item_key);
118
+
119
+ CREATE TABLE notifications (
120
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
121
+ event_type TEXT NOT NULL,
122
+ payload_json TEXT NOT NULL,
123
+ delivery_state TEXT NOT NULL CHECK (delivery_state IN ('pending','delivered','failed')),
124
+ attempts INTEGER NOT NULL DEFAULT 0,
125
+ last_error TEXT,
126
+ next_attempt_at TEXT,
127
+ created_at TEXT NOT NULL,
128
+ updated_at TEXT NOT NULL,
129
+ delivered_at TEXT
130
+ );
131
+ CREATE INDEX notifications_pending ON notifications (delivery_state, next_attempt_at);
132
+ CREATE INDEX notifications_created ON notifications (created_at);
133
+
134
+ CREATE TABLE cron_firings (
135
+ workflow_id TEXT NOT NULL,
136
+ scheduled_for TEXT NOT NULL,
137
+ run_id TEXT REFERENCES runs (id) ON DELETE SET NULL,
138
+ decision TEXT NOT NULL,
139
+ reason TEXT,
140
+ recorded_at TEXT NOT NULL,
141
+ PRIMARY KEY (workflow_id, scheduled_for)
142
+ );
143
+ CREATE INDEX cron_firings_recorded ON cron_firings (recorded_at);
144
+ `;
145
+ /**
146
+ * v2 (WI-10): delivery state per notification channel. `notifications.delivery_state`
147
+ * / `attempts` / `last_error` become the aggregate over the channel deliveries.
148
+ */
149
+ const V2_DDL = `
150
+ CREATE TABLE notification_deliveries (
151
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
152
+ notification_id INTEGER NOT NULL REFERENCES notifications (id) ON DELETE CASCADE,
153
+ channel_id TEXT NOT NULL,
154
+ state TEXT NOT NULL CHECK (state IN ('pending','delivered','failed')),
155
+ attempts INTEGER NOT NULL DEFAULT 0,
156
+ last_error TEXT,
157
+ last_status INTEGER,
158
+ next_attempt_at TEXT,
159
+ delivered_at TEXT,
160
+ created_at TEXT NOT NULL,
161
+ updated_at TEXT NOT NULL,
162
+ UNIQUE (notification_id, channel_id)
163
+ );
164
+ CREATE INDEX notification_deliveries_due ON notification_deliveries (state, next_attempt_at);
165
+ `;
166
+ /** All built-in migrations, in order. */
167
+ export const MIGRATIONS = [
168
+ {
169
+ version: 1,
170
+ name: 'initial_schema',
171
+ up(db) {
172
+ db.exec(V1_DDL);
173
+ },
174
+ },
175
+ {
176
+ version: 2,
177
+ name: 'notification_deliveries',
178
+ up(db) {
179
+ db.exec(V2_DDL);
180
+ },
181
+ },
182
+ ];
183
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/persistence/schema.ts"],"names":[],"mappings":"AAgBA,MAAM,iBAAiB,GAAG,gFAAgF,CAAC;AAE3G,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uFAyCwE,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqGvG,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;CAgBd,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,UAAU,GAAyB;IAC9C;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,gBAAgB;QACtB,EAAE,CAAC,EAAE;YACH,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,yBAAyB;QAC/B,EAAE,CAAC,EAAE;YACH,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC;KACF;CACF,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Small helpers around `node:sqlite` (`DatabaseSync`): transactions with
3
+ * nesting via savepoints, typed row access and JSON (de)serialisation.
4
+ */
5
+ import type { DatabaseSync, SQLInputValue } from 'node:sqlite';
6
+ /** A row as returned by `StatementSync#get/all`. */
7
+ export type Row = Record<string, unknown>;
8
+ /** Positional SQL parameters. */
9
+ export type Params = SQLInputValue[];
10
+ /**
11
+ * Run `fn` atomically. The outermost call uses `BEGIN IMMEDIATE` (takes the
12
+ * write lock up front, so check-then-insert sequences are atomic also across
13
+ * connections); nested calls use savepoints. Any thrown error rolls back
14
+ * (the original error is always re-thrown, also if the rollback itself fails).
15
+ *
16
+ * Callbacks registered via {@link afterCommit} run only after the outermost
17
+ * transaction committed; they are discarded on rollback (also of a nested savepoint).
18
+ */
19
+ export declare function transaction<T>(db: DatabaseSync, fn: () => T): T;
20
+ /**
21
+ * Run `callback` after the current outermost transaction commits (immediately
22
+ * if no transaction is open); dropped if the transaction rolls back. Use this
23
+ * for side effects outside SQLite, e.g. publishing on the in-process event bus,
24
+ * so that subscribers never see IDs of rolled-back rows (SQLite may reuse
25
+ * AUTOINCREMENT values of rolled-back inserts). Callbacks must not throw;
26
+ * errors are reported via `process.emitWarning` and do not affect other callbacks.
27
+ */
28
+ export declare function afterCommit(db: DatabaseSync, callback: () => void): void;
29
+ /** Execute a statement; returns number of changed rows and last insert rowid. */
30
+ export declare function run(db: DatabaseSync, sql: string, params?: Params): {
31
+ changes: number;
32
+ lastInsertRowid: number;
33
+ };
34
+ /** First row or `undefined`. */
35
+ export declare function get(db: DatabaseSync, sql: string, params?: Params): Row | undefined;
36
+ /** All rows. */
37
+ export declare function all(db: DatabaseSync, sql: string, params?: Params): Row[];
38
+ /** Serialise a value to JSON for storage (`undefined` → SQL NULL). */
39
+ export declare function toJson(value: unknown): string | null;
40
+ /** Parse a stored JSON column (NULL → `null`). */
41
+ export declare function fromJson<T = unknown>(value: unknown): T | null;
42
+ /** Column as string or null. */
43
+ export declare function str(value: unknown): string | null;
44
+ /** Column as number or null. */
45
+ export declare function num(value: unknown): number | null;
46
+ /** `?, ?, ?` placeholder list for `n` parameters (n ≥ 1). */
47
+ export declare function placeholders(n: number): string;
48
+ /** ISO-8601 string of a Date or ISO string input. */
49
+ export declare function iso(value: Date | string): string;
@@ -0,0 +1,131 @@
1
+ /** Per-connection transaction state: one callback list per nesting level. */
2
+ const state = new WeakMap();
3
+ let savepointCounter = 0;
4
+ /**
5
+ * Run `fn` atomically. The outermost call uses `BEGIN IMMEDIATE` (takes the
6
+ * write lock up front, so check-then-insert sequences are atomic also across
7
+ * connections); nested calls use savepoints. Any thrown error rolls back
8
+ * (the original error is always re-thrown, also if the rollback itself fails).
9
+ *
10
+ * Callbacks registered via {@link afterCommit} run only after the outermost
11
+ * transaction committed; they are discarded on rollback (also of a nested savepoint).
12
+ */
13
+ export function transaction(db, fn) {
14
+ let st = state.get(db);
15
+ if (!st) {
16
+ st = { levels: [] };
17
+ state.set(db, st);
18
+ }
19
+ const levels = st.levels;
20
+ if (levels.length === 0) {
21
+ db.exec('BEGIN IMMEDIATE');
22
+ levels.push([]);
23
+ let callbacks = [];
24
+ try {
25
+ const result = fn();
26
+ db.exec('COMMIT');
27
+ callbacks = levels[0] ?? [];
28
+ return result;
29
+ }
30
+ catch (err) {
31
+ try {
32
+ db.exec('ROLLBACK');
33
+ }
34
+ catch {
35
+ // transaction may already be rolled back by SQLite
36
+ }
37
+ throw err;
38
+ }
39
+ finally {
40
+ levels.length = 0;
41
+ runCallbacks(callbacks);
42
+ }
43
+ }
44
+ const name = `sp_${++savepointCounter}`;
45
+ db.exec(`SAVEPOINT ${name}`);
46
+ levels.push([]);
47
+ try {
48
+ const result = fn();
49
+ db.exec(`RELEASE ${name}`);
50
+ const own = levels.pop() ?? [];
51
+ levels[levels.length - 1]?.push(...own);
52
+ return result;
53
+ }
54
+ catch (err) {
55
+ levels.pop();
56
+ try {
57
+ db.exec(`ROLLBACK TO ${name}`);
58
+ db.exec(`RELEASE ${name}`);
59
+ }
60
+ catch {
61
+ // outer transaction may already be aborted; the outer level rolls back
62
+ }
63
+ throw err;
64
+ }
65
+ }
66
+ /**
67
+ * Run `callback` after the current outermost transaction commits (immediately
68
+ * if no transaction is open); dropped if the transaction rolls back. Use this
69
+ * for side effects outside SQLite, e.g. publishing on the in-process event bus,
70
+ * so that subscribers never see IDs of rolled-back rows (SQLite may reuse
71
+ * AUTOINCREMENT values of rolled-back inserts). Callbacks must not throw;
72
+ * errors are reported via `process.emitWarning` and do not affect other callbacks.
73
+ */
74
+ export function afterCommit(db, callback) {
75
+ const levels = state.get(db)?.levels;
76
+ const current = levels?.[levels.length - 1];
77
+ if (current)
78
+ current.push(callback);
79
+ else
80
+ runCallbacks([callback]);
81
+ }
82
+ function runCallbacks(callbacks) {
83
+ for (const cb of callbacks) {
84
+ try {
85
+ cb();
86
+ }
87
+ catch (err) {
88
+ process.emitWarning(`afterCommit callback failed: ${err instanceof Error ? err.message : String(err)}`);
89
+ }
90
+ }
91
+ }
92
+ /** Execute a statement; returns number of changed rows and last insert rowid. */
93
+ export function run(db, sql, params = []) {
94
+ const res = db.prepare(sql).run(...params);
95
+ return { changes: Number(res.changes), lastInsertRowid: Number(res.lastInsertRowid) };
96
+ }
97
+ /** First row or `undefined`. */
98
+ export function get(db, sql, params = []) {
99
+ return db.prepare(sql).get(...params);
100
+ }
101
+ /** All rows. */
102
+ export function all(db, sql, params = []) {
103
+ return db.prepare(sql).all(...params);
104
+ }
105
+ /** Serialise a value to JSON for storage (`undefined` → SQL NULL). */
106
+ export function toJson(value) {
107
+ return value === undefined ? null : JSON.stringify(value);
108
+ }
109
+ /** Parse a stored JSON column (NULL → `null`). */
110
+ export function fromJson(value) {
111
+ if (value === null || value === undefined)
112
+ return null;
113
+ return JSON.parse(String(value));
114
+ }
115
+ /** Column as string or null. */
116
+ export function str(value) {
117
+ return value === null || value === undefined ? null : String(value);
118
+ }
119
+ /** Column as number or null. */
120
+ export function num(value) {
121
+ return value === null || value === undefined ? null : Number(value);
122
+ }
123
+ /** `?, ?, ?` placeholder list for `n` parameters (n ≥ 1). */
124
+ export function placeholders(n) {
125
+ return new Array(n).fill('?').join(', ');
126
+ }
127
+ /** ISO-8601 string of a Date or ISO string input. */
128
+ export function iso(value) {
129
+ return typeof value === 'string' ? new Date(value).toISOString() : value.toISOString();
130
+ }
131
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/persistence/sqlite.ts"],"names":[],"mappings":"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"}