@adonis-agora/durable 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 (316) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/dist/assets/dashboard.html +446 -0
  4. package/dist/commands/main.d.ts +15 -0
  5. package/dist/commands/main.d.ts.map +1 -0
  6. package/dist/commands/main.js +15 -0
  7. package/dist/commands/main.js.map +1 -0
  8. package/dist/commands/retry.d.ts +16 -0
  9. package/dist/commands/retry.d.ts.map +1 -0
  10. package/dist/commands/retry.js +34 -0
  11. package/dist/commands/retry.js.map +1 -0
  12. package/dist/commands/runs.d.ts +17 -0
  13. package/dist/commands/runs.d.ts.map +1 -0
  14. package/dist/commands/runs.js +40 -0
  15. package/dist/commands/runs.js.map +1 -0
  16. package/dist/commands/work.d.ts +18 -0
  17. package/dist/commands/work.d.ts.map +1 -0
  18. package/dist/commands/work.js +58 -0
  19. package/dist/commands/work.js.map +1 -0
  20. package/dist/configure.d.ts +15 -0
  21. package/dist/configure.d.ts.map +1 -0
  22. package/dist/configure.js +26 -0
  23. package/dist/configure.js.map +1 -0
  24. package/dist/providers/dashboard_provider.d.ts +27 -0
  25. package/dist/providers/dashboard_provider.d.ts.map +1 -0
  26. package/dist/providers/dashboard_provider.js +94 -0
  27. package/dist/providers/dashboard_provider.js.map +1 -0
  28. package/dist/providers/durable_provider.d.ts +36 -0
  29. package/dist/providers/durable_provider.d.ts.map +1 -0
  30. package/dist/providers/durable_provider.js +113 -0
  31. package/dist/providers/durable_provider.js.map +1 -0
  32. package/dist/src/admission-redis/index.d.ts +2 -0
  33. package/dist/src/admission-redis/index.d.ts.map +1 -0
  34. package/dist/src/admission-redis/index.js +2 -0
  35. package/dist/src/admission-redis/index.js.map +1 -0
  36. package/dist/src/admission-redis/redis-admission-backend.d.ts +83 -0
  37. package/dist/src/admission-redis/redis-admission-backend.d.ts.map +1 -0
  38. package/dist/src/admission-redis/redis-admission-backend.js +200 -0
  39. package/dist/src/admission-redis/redis-admission-backend.js.map +1 -0
  40. package/dist/src/admission.d.ts +49 -0
  41. package/dist/src/admission.d.ts.map +1 -0
  42. package/dist/src/admission.js +30 -0
  43. package/dist/src/admission.js.map +1 -0
  44. package/dist/src/backoff.d.ts +5 -0
  45. package/dist/src/backoff.d.ts.map +1 -0
  46. package/dist/src/backoff.js +11 -0
  47. package/dist/src/backoff.js.map +1 -0
  48. package/dist/src/checkpoints.d.ts +42 -0
  49. package/dist/src/checkpoints.d.ts.map +1 -0
  50. package/dist/src/checkpoints.js +57 -0
  51. package/dist/src/checkpoints.js.map +1 -0
  52. package/dist/src/codec-state-store.d.ts +60 -0
  53. package/dist/src/codec-state-store.d.ts.map +1 -0
  54. package/dist/src/codec-state-store.js +129 -0
  55. package/dist/src/codec-state-store.js.map +1 -0
  56. package/dist/src/commands/index.d.ts +3 -0
  57. package/dist/src/commands/index.d.ts.map +1 -0
  58. package/dist/src/commands/index.js +3 -0
  59. package/dist/src/commands/index.js.map +1 -0
  60. package/dist/src/commands/runs.d.ts +24 -0
  61. package/dist/src/commands/runs.d.ts.map +1 -0
  62. package/dist/src/commands/runs.js +39 -0
  63. package/dist/src/commands/runs.js.map +1 -0
  64. package/dist/src/commands/worker.d.ts +61 -0
  65. package/dist/src/commands/worker.d.ts.map +1 -0
  66. package/dist/src/commands/worker.js +74 -0
  67. package/dist/src/commands/worker.js.map +1 -0
  68. package/dist/src/completion.d.ts +15 -0
  69. package/dist/src/completion.d.ts.map +1 -0
  70. package/dist/src/completion.js +10 -0
  71. package/dist/src/completion.js.map +1 -0
  72. package/dist/src/dashboard/define_config.d.ts +48 -0
  73. package/dist/src/dashboard/define_config.d.ts.map +1 -0
  74. package/dist/src/dashboard/define_config.js +57 -0
  75. package/dist/src/dashboard/define_config.js.map +1 -0
  76. package/dist/src/dashboard/handlers.d.ts +47 -0
  77. package/dist/src/dashboard/handlers.d.ts.map +1 -0
  78. package/dist/src/dashboard/handlers.js +163 -0
  79. package/dist/src/dashboard/handlers.js.map +1 -0
  80. package/dist/src/dashboard/html.d.ts +7 -0
  81. package/dist/src/dashboard/html.d.ts.map +1 -0
  82. package/dist/src/dashboard/html.js +24 -0
  83. package/dist/src/dashboard/html.js.map +1 -0
  84. package/dist/src/dashboard/index.d.ts +8 -0
  85. package/dist/src/dashboard/index.d.ts.map +1 -0
  86. package/dist/src/dashboard/index.js +6 -0
  87. package/dist/src/dashboard/index.js.map +1 -0
  88. package/dist/src/define_config.d.ts +72 -0
  89. package/dist/src/define_config.d.ts.map +1 -0
  90. package/dist/src/define_config.js +8 -0
  91. package/dist/src/define_config.js.map +1 -0
  92. package/dist/src/diagnostics-bridge.d.ts +22 -0
  93. package/dist/src/diagnostics-bridge.d.ts.map +1 -0
  94. package/dist/src/diagnostics-bridge.js +25 -0
  95. package/dist/src/diagnostics-bridge.js.map +1 -0
  96. package/dist/src/duration.d.ts +6 -0
  97. package/dist/src/duration.d.ts.map +1 -0
  98. package/dist/src/duration.js +39 -0
  99. package/dist/src/duration.js.map +1 -0
  100. package/dist/src/engine.d.ts +583 -0
  101. package/dist/src/engine.d.ts.map +1 -0
  102. package/dist/src/engine.js +1894 -0
  103. package/dist/src/engine.js.map +1 -0
  104. package/dist/src/entities.d.ts +44 -0
  105. package/dist/src/entities.d.ts.map +1 -0
  106. package/dist/src/entities.js +64 -0
  107. package/dist/src/entities.js.map +1 -0
  108. package/dist/src/errors.d.ts +68 -0
  109. package/dist/src/errors.d.ts.map +1 -0
  110. package/dist/src/errors.js +102 -0
  111. package/dist/src/errors.js.map +1 -0
  112. package/dist/src/event-accumulators.d.ts +39 -0
  113. package/dist/src/event-accumulators.d.ts.map +1 -0
  114. package/dist/src/event-accumulators.js +70 -0
  115. package/dist/src/event-accumulators.js.map +1 -0
  116. package/dist/src/events.d.ts +9 -0
  117. package/dist/src/events.d.ts.map +1 -0
  118. package/dist/src/events.js +35 -0
  119. package/dist/src/events.js.map +1 -0
  120. package/dist/src/index.d.ts +36 -0
  121. package/dist/src/index.d.ts.map +1 -0
  122. package/dist/src/index.js +37 -0
  123. package/dist/src/index.js.map +1 -0
  124. package/dist/src/interfaces.d.ts +909 -0
  125. package/dist/src/interfaces.d.ts.map +1 -0
  126. package/dist/src/interfaces.js +2 -0
  127. package/dist/src/interfaces.js.map +1 -0
  128. package/dist/src/metrics.d.ts +44 -0
  129. package/dist/src/metrics.d.ts.map +1 -0
  130. package/dist/src/metrics.js +78 -0
  131. package/dist/src/metrics.js.map +1 -0
  132. package/dist/src/otel/durable-metrics.d.ts +42 -0
  133. package/dist/src/otel/durable-metrics.d.ts.map +1 -0
  134. package/dist/src/otel/durable-metrics.js +75 -0
  135. package/dist/src/otel/durable-metrics.js.map +1 -0
  136. package/dist/src/otel/durable-otel.d.ts +20 -0
  137. package/dist/src/otel/durable-otel.d.ts.map +1 -0
  138. package/dist/src/otel/durable-otel.js +74 -0
  139. package/dist/src/otel/durable-otel.js.map +1 -0
  140. package/dist/src/otel/index.d.ts +4 -0
  141. package/dist/src/otel/index.d.ts.map +1 -0
  142. package/dist/src/otel/index.js +4 -0
  143. package/dist/src/otel/index.js.map +1 -0
  144. package/dist/src/otel/traceparent.d.ts +17 -0
  145. package/dist/src/otel/traceparent.d.ts.map +1 -0
  146. package/dist/src/otel/traceparent.js +21 -0
  147. package/dist/src/otel/traceparent.js.map +1 -0
  148. package/dist/src/pollers.d.ts +33 -0
  149. package/dist/src/pollers.d.ts.map +1 -0
  150. package/dist/src/pollers.js +76 -0
  151. package/dist/src/pollers.js.map +1 -0
  152. package/dist/src/protocol.d.ts +17 -0
  153. package/dist/src/protocol.d.ts.map +1 -0
  154. package/dist/src/protocol.js +47 -0
  155. package/dist/src/protocol.js.map +1 -0
  156. package/dist/src/queue.d.ts +113 -0
  157. package/dist/src/queue.d.ts.map +1 -0
  158. package/dist/src/queue.js +128 -0
  159. package/dist/src/queue.js.map +1 -0
  160. package/dist/src/remote-step-factory.d.ts +15 -0
  161. package/dist/src/remote-step-factory.d.ts.map +1 -0
  162. package/dist/src/remote-step-factory.js +12 -0
  163. package/dist/src/remote-step-factory.js.map +1 -0
  164. package/dist/src/remote-workflow-executor.d.ts +24 -0
  165. package/dist/src/remote-workflow-executor.d.ts.map +1 -0
  166. package/dist/src/remote-workflow-executor.js +70 -0
  167. package/dist/src/remote-workflow-executor.js.map +1 -0
  168. package/dist/src/scheduler.d.ts +67 -0
  169. package/dist/src/scheduler.d.ts.map +1 -0
  170. package/dist/src/scheduler.js +111 -0
  171. package/dist/src/scheduler.js.map +1 -0
  172. package/dist/src/search-attributes.d.ts +48 -0
  173. package/dist/src/search-attributes.d.ts.map +1 -0
  174. package/dist/src/search-attributes.js +98 -0
  175. package/dist/src/search-attributes.js.map +1 -0
  176. package/dist/src/singleton-gate.d.ts +44 -0
  177. package/dist/src/singleton-gate.d.ts.map +1 -0
  178. package/dist/src/singleton-gate.js +90 -0
  179. package/dist/src/singleton-gate.js.map +1 -0
  180. package/dist/src/step-logger.d.ts +9 -0
  181. package/dist/src/step-logger.d.ts.map +1 -0
  182. package/dist/src/step-logger.js +89 -0
  183. package/dist/src/step-logger.js.map +1 -0
  184. package/dist/src/stores/factory.d.ts +42 -0
  185. package/dist/src/stores/factory.d.ts.map +1 -0
  186. package/dist/src/stores/factory.js +29 -0
  187. package/dist/src/stores/factory.js.map +1 -0
  188. package/dist/src/stores/lucid-helpers.d.ts +11 -0
  189. package/dist/src/stores/lucid-helpers.d.ts.map +1 -0
  190. package/dist/src/stores/lucid-helpers.js +38 -0
  191. package/dist/src/stores/lucid-helpers.js.map +1 -0
  192. package/dist/src/stores/lucid-mappers.d.ts +58 -0
  193. package/dist/src/stores/lucid-mappers.d.ts.map +1 -0
  194. package/dist/src/stores/lucid-mappers.js +174 -0
  195. package/dist/src/stores/lucid-mappers.js.map +1 -0
  196. package/dist/src/stores/lucid-schema.d.ts +28 -0
  197. package/dist/src/stores/lucid-schema.d.ts.map +1 -0
  198. package/dist/src/stores/lucid-schema.js +115 -0
  199. package/dist/src/stores/lucid-schema.js.map +1 -0
  200. package/dist/src/stores/lucid.d.ts +69 -0
  201. package/dist/src/stores/lucid.d.ts.map +1 -0
  202. package/dist/src/stores/lucid.js +342 -0
  203. package/dist/src/stores/lucid.js.map +1 -0
  204. package/dist/src/telescope/dashboard.d.ts +15 -0
  205. package/dist/src/telescope/dashboard.d.ts.map +1 -0
  206. package/dist/src/telescope/dashboard.js +113 -0
  207. package/dist/src/telescope/dashboard.js.map +1 -0
  208. package/dist/src/telescope/data-providers.d.ts +20 -0
  209. package/dist/src/telescope/data-providers.d.ts.map +1 -0
  210. package/dist/src/telescope/data-providers.js +322 -0
  211. package/dist/src/telescope/data-providers.js.map +1 -0
  212. package/dist/src/telescope/extension.d.ts +22 -0
  213. package/dist/src/telescope/extension.d.ts.map +1 -0
  214. package/dist/src/telescope/extension.js +38 -0
  215. package/dist/src/telescope/extension.js.map +1 -0
  216. package/dist/src/telescope/index.d.ts +5 -0
  217. package/dist/src/telescope/index.d.ts.map +1 -0
  218. package/dist/src/telescope/index.js +4 -0
  219. package/dist/src/telescope/index.js.map +1 -0
  220. package/dist/src/telescope/telescope-sdk.d.ts +123 -0
  221. package/dist/src/telescope/telescope-sdk.d.ts.map +1 -0
  222. package/dist/src/telescope/telescope-sdk.js +12 -0
  223. package/dist/src/telescope/telescope-sdk.js.map +1 -0
  224. package/dist/src/test-helpers.d.ts +11 -0
  225. package/dist/src/test-helpers.d.ts.map +1 -0
  226. package/dist/src/test-helpers.js +12 -0
  227. package/dist/src/test-helpers.js.map +1 -0
  228. package/dist/src/testing/in-memory-state-store.d.ts +64 -0
  229. package/dist/src/testing/in-memory-state-store.d.ts.map +1 -0
  230. package/dist/src/testing/in-memory-state-store.js +259 -0
  231. package/dist/src/testing/in-memory-state-store.js.map +1 -0
  232. package/dist/src/testing/in-memory-transport.d.ts +25 -0
  233. package/dist/src/testing/in-memory-transport.d.ts.map +1 -0
  234. package/dist/src/testing/in-memory-transport.js +49 -0
  235. package/dist/src/testing/in-memory-transport.js.map +1 -0
  236. package/dist/src/testing-kit/admission-backend-conformance.d.ts +18 -0
  237. package/dist/src/testing-kit/admission-backend-conformance.d.ts.map +1 -0
  238. package/dist/src/testing-kit/admission-backend-conformance.js +81 -0
  239. package/dist/src/testing-kit/admission-backend-conformance.js.map +1 -0
  240. package/dist/src/testing-kit/assertions.d.ts +10 -0
  241. package/dist/src/testing-kit/assertions.d.ts.map +1 -0
  242. package/dist/src/testing-kit/assertions.js +41 -0
  243. package/dist/src/testing-kit/assertions.js.map +1 -0
  244. package/dist/src/testing-kit/harness.d.ts +28 -0
  245. package/dist/src/testing-kit/harness.d.ts.map +1 -0
  246. package/dist/src/testing-kit/harness.js +42 -0
  247. package/dist/src/testing-kit/harness.js.map +1 -0
  248. package/dist/src/testing-kit/index.d.ts +8 -0
  249. package/dist/src/testing-kit/index.d.ts.map +1 -0
  250. package/dist/src/testing-kit/index.js +8 -0
  251. package/dist/src/testing-kit/index.js.map +1 -0
  252. package/dist/src/testing-kit/replay.d.ts +22 -0
  253. package/dist/src/testing-kit/replay.d.ts.map +1 -0
  254. package/dist/src/testing-kit/replay.js +38 -0
  255. package/dist/src/testing-kit/replay.js.map +1 -0
  256. package/dist/src/testing-kit/state-store-conformance.d.ts +51 -0
  257. package/dist/src/testing-kit/state-store-conformance.d.ts.map +1 -0
  258. package/dist/src/testing-kit/state-store-conformance.js +430 -0
  259. package/dist/src/testing-kit/state-store-conformance.js.map +1 -0
  260. package/dist/src/testing-kit/steps.d.ts +5 -0
  261. package/dist/src/testing-kit/steps.d.ts.map +1 -0
  262. package/dist/src/testing-kit/steps.js +15 -0
  263. package/dist/src/testing-kit/steps.js.map +1 -0
  264. package/dist/src/testing-kit/transport-conformance.d.ts +16 -0
  265. package/dist/src/testing-kit/transport-conformance.d.ts.map +1 -0
  266. package/dist/src/testing-kit/transport-conformance.js +64 -0
  267. package/dist/src/testing-kit/transport-conformance.js.map +1 -0
  268. package/dist/src/tokens.d.ts +18 -0
  269. package/dist/src/tokens.d.ts.map +1 -0
  270. package/dist/src/tokens.js +18 -0
  271. package/dist/src/tokens.js.map +1 -0
  272. package/dist/src/transport-pool.d.ts +30 -0
  273. package/dist/src/transport-pool.d.ts.map +1 -0
  274. package/dist/src/transport-pool.js +82 -0
  275. package/dist/src/transport-pool.js.map +1 -0
  276. package/dist/src/transports/db-helpers.d.ts +10 -0
  277. package/dist/src/transports/db-helpers.d.ts.map +1 -0
  278. package/dist/src/transports/db-helpers.js +33 -0
  279. package/dist/src/transports/db-helpers.js.map +1 -0
  280. package/dist/src/transports/db-schema.d.ts +28 -0
  281. package/dist/src/transports/db-schema.d.ts.map +1 -0
  282. package/dist/src/transports/db-schema.js +98 -0
  283. package/dist/src/transports/db-schema.js.map +1 -0
  284. package/dist/src/transports/db.d.ts +81 -0
  285. package/dist/src/transports/db.d.ts.map +1 -0
  286. package/dist/src/transports/db.js +340 -0
  287. package/dist/src/transports/db.js.map +1 -0
  288. package/dist/src/transports/factory.d.ts +79 -0
  289. package/dist/src/transports/factory.d.ts.map +1 -0
  290. package/dist/src/transports/factory.js +57 -0
  291. package/dist/src/transports/factory.js.map +1 -0
  292. package/dist/src/transports/queue-mock-adapter.d.ts +39 -0
  293. package/dist/src/transports/queue-mock-adapter.d.ts.map +1 -0
  294. package/dist/src/transports/queue-mock-adapter.js +86 -0
  295. package/dist/src/transports/queue-mock-adapter.js.map +1 -0
  296. package/dist/src/transports/queue.d.ts +84 -0
  297. package/dist/src/transports/queue.d.ts.map +1 -0
  298. package/dist/src/transports/queue.js +210 -0
  299. package/dist/src/transports/queue.js.map +1 -0
  300. package/dist/src/workflow-ctx.d.ts +64 -0
  301. package/dist/src/workflow-ctx.d.ts.map +1 -0
  302. package/dist/src/workflow-ctx.js +457 -0
  303. package/dist/src/workflow-ctx.js.map +1 -0
  304. package/dist/src/workflow-ref.d.ts +34 -0
  305. package/dist/src/workflow-ref.d.ts.map +1 -0
  306. package/dist/src/workflow-ref.js +28 -0
  307. package/dist/src/workflow-ref.js.map +1 -0
  308. package/dist/stubs/config/durable.stub +49 -0
  309. package/dist/stubs/config/durable_dashboard.stub +17 -0
  310. package/dist/stubs/database/migrations/create_durable_tables.stub +87 -0
  311. package/dist/stubs/database/migrations/create_durable_transport_tables.stub +75 -0
  312. package/dist/stubs/main.d.ts +3 -0
  313. package/dist/stubs/main.d.ts.map +1 -0
  314. package/dist/stubs/main.js +4 -0
  315. package/dist/stubs/main.js.map +1 -0
  316. package/package.json +154 -0
@@ -0,0 +1,174 @@
1
+ /** Serialize an arbitrary payload to a TEXT column, preserving the "absent" distinction as NULL. */
2
+ function toJson(value) {
3
+ if (value === undefined)
4
+ return null;
5
+ return JSON.stringify(value);
6
+ }
7
+ /** Parse a TEXT JSON column back to its value, treating NULL/empty as "absent". */
8
+ function fromJson(value) {
9
+ if (value == null)
10
+ return undefined;
11
+ return JSON.parse(value);
12
+ }
13
+ /** Coerce a possibly-stringified numeric column (some drivers return bigints as strings) to a number. */
14
+ function toNum(value) {
15
+ if (value == null)
16
+ return undefined;
17
+ const n = typeof value === 'string' ? Number(value) : value;
18
+ return Number.isNaN(n) ? undefined : n;
19
+ }
20
+ /** Like {@link toNum} but for required columns — falls back to 0 if the driver hands back garbage. */
21
+ function toNumOr0(value) {
22
+ return toNum(value) ?? 0;
23
+ }
24
+ // --- runs -----------------------------------------------------------------
25
+ export function runToRow(run) {
26
+ return {
27
+ id: run.id,
28
+ workflow: run.workflow,
29
+ workflow_version: run.workflowVersion,
30
+ status: run.status,
31
+ input: toJson(run.input),
32
+ output: toJson(run.output),
33
+ error: toJson(run.error),
34
+ wake_at: run.wakeAt ?? null,
35
+ locked_by: run.lockedBy ?? null,
36
+ locked_until: run.lockedUntil ?? null,
37
+ recovery_attempts: run.recoveryAttempts ?? null,
38
+ tags: toJson(run.tags),
39
+ search_attributes: toJson(run.searchAttributes),
40
+ priority: run.priority ?? null,
41
+ created_at: run.createdAt.getTime(),
42
+ updated_at: run.updatedAt.getTime(),
43
+ };
44
+ }
45
+ /**
46
+ * Map a run patch to a column patch using presence (`'x' in patch`) semantics for nullable fields, so
47
+ * a patch can CLEAR a column (e.g. `{ error: undefined }` on completion → NULL), matching the
48
+ * in-memory store's `{ ...existing, ...patch }` semantics. The two required Date fields use a
49
+ * defined-guard since they're never cleared.
50
+ */
51
+ export function runPatchToRow(patch) {
52
+ const row = {};
53
+ if ('workflow' in patch)
54
+ row.workflow = patch.workflow;
55
+ if ('workflowVersion' in patch)
56
+ row.workflow_version = patch.workflowVersion;
57
+ if ('status' in patch)
58
+ row.status = patch.status;
59
+ if ('input' in patch)
60
+ row.input = toJson(patch.input);
61
+ if ('output' in patch)
62
+ row.output = toJson(patch.output);
63
+ if ('error' in patch)
64
+ row.error = toJson(patch.error);
65
+ if ('wakeAt' in patch)
66
+ row.wake_at = patch.wakeAt ?? null;
67
+ if ('lockedBy' in patch)
68
+ row.locked_by = patch.lockedBy ?? null;
69
+ if ('lockedUntil' in patch)
70
+ row.locked_until = patch.lockedUntil ?? null;
71
+ if ('recoveryAttempts' in patch)
72
+ row.recovery_attempts = patch.recoveryAttempts ?? null;
73
+ if ('tags' in patch)
74
+ row.tags = toJson(patch.tags);
75
+ if ('searchAttributes' in patch)
76
+ row.search_attributes = toJson(patch.searchAttributes);
77
+ if ('priority' in patch)
78
+ row.priority = patch.priority ?? null;
79
+ if (patch.createdAt != null)
80
+ row.created_at = patch.createdAt.getTime();
81
+ if (patch.updatedAt != null)
82
+ row.updated_at = patch.updatedAt.getTime();
83
+ return row;
84
+ }
85
+ export function rowToRun(row) {
86
+ const run = {
87
+ id: row.id,
88
+ workflow: row.workflow,
89
+ workflowVersion: row.workflow_version,
90
+ status: row.status,
91
+ input: fromJson(row.input),
92
+ createdAt: new Date(toNumOr0(row.created_at)),
93
+ updatedAt: new Date(toNumOr0(row.updated_at)),
94
+ };
95
+ const output = fromJson(row.output);
96
+ if (output !== undefined)
97
+ run.output = output;
98
+ const error = fromJson(row.error);
99
+ if (error !== undefined)
100
+ run.error = error;
101
+ const wakeAt = toNum(row.wake_at);
102
+ if (wakeAt !== undefined)
103
+ run.wakeAt = wakeAt;
104
+ if (row.locked_by != null)
105
+ run.lockedBy = row.locked_by;
106
+ const lockedUntil = toNum(row.locked_until);
107
+ if (lockedUntil !== undefined)
108
+ run.lockedUntil = lockedUntil;
109
+ const recoveryAttempts = toNum(row.recovery_attempts);
110
+ if (recoveryAttempts !== undefined)
111
+ run.recoveryAttempts = recoveryAttempts;
112
+ const tags = fromJson(row.tags);
113
+ if (tags !== undefined)
114
+ run.tags = tags;
115
+ const searchAttributes = fromJson(row.search_attributes);
116
+ if (searchAttributes !== undefined)
117
+ run.searchAttributes = searchAttributes;
118
+ const priority = toNum(row.priority);
119
+ if (priority !== undefined)
120
+ run.priority = priority;
121
+ return run;
122
+ }
123
+ // --- checkpoints ----------------------------------------------------------
124
+ export function checkpointToRow(cp) {
125
+ return {
126
+ run_id: cp.runId,
127
+ seq: cp.seq,
128
+ name: cp.name,
129
+ kind: cp.kind,
130
+ step_id: cp.stepId,
131
+ status: cp.status,
132
+ input: toJson(cp.input),
133
+ output: toJson(cp.output),
134
+ error: toJson(cp.error),
135
+ events: toJson(cp.events),
136
+ attempts: cp.attempts,
137
+ worker_group: cp.workerGroup ?? null,
138
+ wake_at: cp.wakeAt ?? null,
139
+ enqueued_at: (cp.enqueuedAt ?? cp.startedAt).getTime(),
140
+ started_at: cp.startedAt.getTime(),
141
+ finished_at: cp.finishedAt.getTime(),
142
+ };
143
+ }
144
+ export function rowToCheckpoint(row) {
145
+ const cp = {
146
+ runId: row.run_id,
147
+ seq: toNumOr0(row.seq),
148
+ name: row.name,
149
+ kind: row.kind,
150
+ stepId: row.step_id,
151
+ status: row.status,
152
+ input: fromJson(row.input),
153
+ attempts: toNumOr0(row.attempts),
154
+ enqueuedAt: new Date(toNum(row.enqueued_at) ?? toNumOr0(row.started_at)),
155
+ startedAt: new Date(toNumOr0(row.started_at)),
156
+ finishedAt: new Date(toNumOr0(row.finished_at)),
157
+ };
158
+ const output = fromJson(row.output);
159
+ if (output !== undefined)
160
+ cp.output = output;
161
+ const error = fromJson(row.error);
162
+ if (error !== undefined)
163
+ cp.error = error;
164
+ const events = fromJson(row.events);
165
+ if (events !== undefined)
166
+ cp.events = events;
167
+ if (row.worker_group != null)
168
+ cp.workerGroup = row.worker_group;
169
+ const wakeAt = toNum(row.wake_at);
170
+ if (wakeAt !== undefined)
171
+ cp.wakeAt = wakeAt;
172
+ return cp;
173
+ }
174
+ //# sourceMappingURL=lucid-mappers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucid-mappers.js","sourceRoot":"","sources":["../../../src/stores/lucid-mappers.ts"],"names":[],"mappings":"AAiDA,oGAAoG;AACpG,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,mFAAmF;AACnF,SAAS,QAAQ,CAAI,KAAoB;IACvC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAM,CAAC;AAChC,CAAC;AAED,yGAAyG;AACzG,SAAS,KAAK,CAAC,KAAyC;IACtD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,sGAAsG;AACtG,SAAS,QAAQ,CAAC,KAAyC;IACzD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,6EAA6E;AAE7E,MAAM,UAAU,QAAQ,CAAC,GAAgB;IACvC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,gBAAgB,EAAE,GAAG,CAAC,eAAe;QACrC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,IAAI;QAC3B,SAAS,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;QAC/B,YAAY,EAAE,GAAG,CAAC,WAAW,IAAI,IAAI;QACrC,iBAAiB,EAAE,GAAG,CAAC,gBAAgB,IAAI,IAAI;QAC/C,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAC/C,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;QAC9B,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE;QACnC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE;KACpC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAA2B;IACvD,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,IAAI,UAAU,IAAI,KAAK;QAAE,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IACvD,IAAI,iBAAiB,IAAI,KAAK;QAAE,GAAG,CAAC,gBAAgB,GAAG,KAAK,CAAC,eAAe,CAAC;IAC7E,IAAI,QAAQ,IAAI,KAAK;QAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACjD,IAAI,OAAO,IAAI,KAAK;QAAE,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,QAAQ,IAAI,KAAK;QAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzD,IAAI,OAAO,IAAI,KAAK;QAAE,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,QAAQ,IAAI,KAAK;QAAE,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;IAC1D,IAAI,UAAU,IAAI,KAAK;QAAE,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC;IAChE,IAAI,aAAa,IAAI,KAAK;QAAE,GAAG,CAAC,YAAY,GAAG,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC;IACzE,IAAI,kBAAkB,IAAI,KAAK;QAAE,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACxF,IAAI,MAAM,IAAI,KAAK;QAAE,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,kBAAkB,IAAI,KAAK;QAAE,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACxF,IAAI,UAAU,IAAI,KAAK;QAAE,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC;IAC/D,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI;QAAE,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACxE,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI;QAAE,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IACxE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,GAAG,GAAgB;QACvB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,eAAe,EAAE,GAAG,CAAC,gBAAgB;QACrC,MAAM,EAAE,GAAG,CAAC,MAA+B;QAC3C,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7C,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;KAC9C,CAAC;IACF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS;QAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAY,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,KAAK,KAAK,SAAS;QAAE,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS;QAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IAC9C,IAAI,GAAG,CAAC,SAAS,IAAI,IAAI;QAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC;IACxD,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,WAAW,KAAK,SAAS;QAAE,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC;IAC7D,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,gBAAgB,KAAK,SAAS;QAAE,GAAG,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC5E,MAAM,IAAI,GAAG,QAAQ,CAAW,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACxC,MAAM,gBAAgB,GAAG,QAAQ,CAAkC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC1F,IAAI,gBAAgB,KAAK,SAAS;QAAE,GAAG,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC5E,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,QAAQ,KAAK,SAAS;QAAE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACpD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6EAA6E;AAE7E,MAAM,UAAU,eAAe,CAAC,EAAkB;IAChD,OAAO;QACL,MAAM,EAAE,EAAE,CAAC,KAAK;QAChB,GAAG,EAAE,EAAE,CAAC,GAAG;QACX,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,OAAO,EAAE,EAAE,CAAC,MAAM;QAClB,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;QACzB,QAAQ,EAAE,EAAE,CAAC,QAAQ;QACrB,YAAY,EAAE,EAAE,CAAC,WAAW,IAAI,IAAI;QACpC,OAAO,EAAE,EAAE,CAAC,MAAM,IAAI,IAAI;QAC1B,WAAW,EAAE,CAAC,EAAE,CAAC,UAAU,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;QACtD,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE;QAClC,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE;KACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAkB;IAChD,MAAM,EAAE,GAAmB;QACzB,KAAK,EAAE,GAAG,CAAC,MAAM;QACjB,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAA8B;QACxC,MAAM,EAAE,GAAG,CAAC,OAAO;QACnB,MAAM,EAAE,GAAG,CAAC,MAAkC;QAC9C,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChC,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxE,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC7C,UAAU,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;KAChD,CAAC;IACF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,SAAS;QAAE,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAY,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7C,IAAI,KAAK,KAAK,SAAS;QAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC;IAC1C,MAAM,MAAM,GAAG,QAAQ,CAAc,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,MAAM,KAAK,SAAS;QAAE,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7C,IAAI,GAAG,CAAC,YAAY,IAAI,IAAI;QAAE,EAAE,CAAC,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC;IAChE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS;QAAE,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Database } from '@adonisjs/lucid/database';
2
+ /**
3
+ * The canonical durable table names. They match the cross-adapter snake_case contract the other
4
+ * Agora/aviary stores use (Drizzle is the reference), so a dashboard or migration can be pointed at
5
+ * any adapter and see the same physical schema.
6
+ */
7
+ export declare const DURABLE_TABLES: {
8
+ readonly runs: "durable_workflow_runs";
9
+ readonly checkpoints: "durable_step_checkpoints";
10
+ readonly attributes: "durable_run_attributes";
11
+ readonly signalWaiters: "durable_signal_waiters";
12
+ readonly bufferedSignals: "durable_buffered_signals";
13
+ };
14
+ /**
15
+ * Idempotent DDL for the durable tables, expressed via Lucid's schema builder (Knex). Works across
16
+ * SQLite / Postgres / MySQL. Timestamps and `wake_at` are stored as epoch-ms `bigInteger` columns so
17
+ * the store never depends on a native date type and replay is exact across engines. JSON payloads
18
+ * (`input`/`output`/`error`/`events`/`tags`/`search_attributes`) are stored as `text` and (de)serialized
19
+ * by the store, so the schema is portable (SQLite has no JSON column type; Postgres/MySQL accept text).
20
+ *
21
+ * Call this on boot (e.g. from a `StateStore.ensureSchema`) or once at deploy time. For an AdonisJS app
22
+ * prefer the published migration (`node ace configure @adonis-agora/durable`); this helper is for standalone
23
+ * use, tests, and `ensureSchema`.
24
+ */
25
+ export declare function createDurableTables(db: Database): Promise<void>;
26
+ /** Drop every durable table (reverse FK order). Used by tests and migration `down`. */
27
+ export declare function dropDurableTables(db: Database): Promise<void>;
28
+ //# sourceMappingURL=lucid-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucid-schema.d.ts","sourceRoot":"","sources":["../../../src/stores/lucid-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD;;;;GAIG;AACH,eAAO,MAAM,cAAc;;;;;;CAMjB,CAAC;AAEX;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFrE;AAED,uFAAuF;AACvF,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnE"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * The canonical durable table names. They match the cross-adapter snake_case contract the other
3
+ * Agora/aviary stores use (Drizzle is the reference), so a dashboard or migration can be pointed at
4
+ * any adapter and see the same physical schema.
5
+ */
6
+ export const DURABLE_TABLES = {
7
+ runs: 'durable_workflow_runs',
8
+ checkpoints: 'durable_step_checkpoints',
9
+ attributes: 'durable_run_attributes',
10
+ signalWaiters: 'durable_signal_waiters',
11
+ bufferedSignals: 'durable_buffered_signals',
12
+ };
13
+ /**
14
+ * Idempotent DDL for the durable tables, expressed via Lucid's schema builder (Knex). Works across
15
+ * SQLite / Postgres / MySQL. Timestamps and `wake_at` are stored as epoch-ms `bigInteger` columns so
16
+ * the store never depends on a native date type and replay is exact across engines. JSON payloads
17
+ * (`input`/`output`/`error`/`events`/`tags`/`search_attributes`) are stored as `text` and (de)serialized
18
+ * by the store, so the schema is portable (SQLite has no JSON column type; Postgres/MySQL accept text).
19
+ *
20
+ * Call this on boot (e.g. from a `StateStore.ensureSchema`) or once at deploy time. For an AdonisJS app
21
+ * prefer the published migration (`node ace configure @adonis-agora/durable`); this helper is for standalone
22
+ * use, tests, and `ensureSchema`.
23
+ */
24
+ export async function createDurableTables(db) {
25
+ // Knex's schema builder is stateful — operations chained on one instance run together. Take a FRESH
26
+ // `db.connection().schema` for every hasTable/createTable so each DDL statement executes exactly once.
27
+ const conn = () => db.connection().schema;
28
+ if (!(await conn().hasTable(DURABLE_TABLES.runs))) {
29
+ await conn().createTable(DURABLE_TABLES.runs, (table) => {
30
+ table.string('id').primary();
31
+ table.string('workflow').notNullable();
32
+ table.string('workflow_version').notNullable();
33
+ table.string('status').notNullable();
34
+ table.text('input');
35
+ table.text('output');
36
+ table.text('error');
37
+ table.bigInteger('wake_at');
38
+ table.string('locked_by');
39
+ table.bigInteger('locked_until');
40
+ table.integer('recovery_attempts');
41
+ table.text('tags');
42
+ table.text('search_attributes');
43
+ table.integer('priority');
44
+ table.bigInteger('created_at').notNullable();
45
+ table.bigInteger('updated_at').notNullable();
46
+ table.index(['status'], 'durable_runs_status_idx');
47
+ table.index(['status', 'wake_at'], 'durable_runs_due_idx');
48
+ });
49
+ }
50
+ else if (!(await db.connection().schema.hasColumn(DURABLE_TABLES.runs, 'priority'))) {
51
+ // Auto-migrate an older runs table: add the nullable `priority` column in place. Nullable (no
52
+ // default) so existing rows read back as "unprioritised" and the FIFO path is unchanged.
53
+ await conn().alterTable(DURABLE_TABLES.runs, (table) => {
54
+ table.integer('priority');
55
+ });
56
+ }
57
+ if (!(await conn().hasTable(DURABLE_TABLES.checkpoints))) {
58
+ await conn().createTable(DURABLE_TABLES.checkpoints, (table) => {
59
+ table.string('run_id').notNullable();
60
+ table.integer('seq').notNullable();
61
+ table.string('name').notNullable();
62
+ table.string('kind').notNullable();
63
+ table.string('step_id').notNullable();
64
+ table.string('status').notNullable();
65
+ table.text('input');
66
+ table.text('output');
67
+ table.text('error');
68
+ table.text('events');
69
+ table.integer('attempts').notNullable();
70
+ table.string('worker_group');
71
+ table.bigInteger('wake_at');
72
+ table.bigInteger('enqueued_at');
73
+ table.bigInteger('started_at').notNullable();
74
+ table.bigInteger('finished_at').notNullable();
75
+ table.primary(['run_id', 'seq']);
76
+ table.index(['run_id', 'name'], 'durable_checkpoints_name_idx');
77
+ });
78
+ }
79
+ if (!(await conn().hasTable(DURABLE_TABLES.attributes))) {
80
+ await conn().createTable(DURABLE_TABLES.attributes, (table) => {
81
+ table.string('run_id').notNullable();
82
+ table.string('key').notNullable();
83
+ table.string('str_value');
84
+ table.double('num_value');
85
+ table.primary(['run_id', 'key']);
86
+ table.index(['key', 'num_value'], 'durable_run_attributes_num_idx');
87
+ table.index(['key', 'str_value'], 'durable_run_attributes_str_idx');
88
+ });
89
+ }
90
+ if (!(await conn().hasTable(DURABLE_TABLES.signalWaiters))) {
91
+ await conn().createTable(DURABLE_TABLES.signalWaiters, (table) => {
92
+ table.string('token').primary();
93
+ table.string('run_id').notNullable();
94
+ table.integer('seq').notNullable();
95
+ });
96
+ }
97
+ if (!(await conn().hasTable(DURABLE_TABLES.bufferedSignals))) {
98
+ await conn().createTable(DURABLE_TABLES.bufferedSignals, (table) => {
99
+ table.increments('id').primary();
100
+ table.string('token').notNullable();
101
+ table.text('payload');
102
+ table.index(['token'], 'durable_buffered_signals_token_idx');
103
+ });
104
+ }
105
+ }
106
+ /** Drop every durable table (reverse FK order). Used by tests and migration `down`. */
107
+ export async function dropDurableTables(db) {
108
+ const conn = () => db.connection().schema;
109
+ await conn().dropTableIfExists(DURABLE_TABLES.bufferedSignals);
110
+ await conn().dropTableIfExists(DURABLE_TABLES.signalWaiters);
111
+ await conn().dropTableIfExists(DURABLE_TABLES.attributes);
112
+ await conn().dropTableIfExists(DURABLE_TABLES.checkpoints);
113
+ await conn().dropTableIfExists(DURABLE_TABLES.runs);
114
+ }
115
+ //# sourceMappingURL=lucid-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucid-schema.js","sourceRoot":"","sources":["../../../src/stores/lucid-schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { Database } from '@adonisjs/lucid/database';
2
+ import type { RunQuery, SignalWaiter, StateStore, StepCheckpoint, WorkflowRun } from '../interfaces.js';
3
+ export interface LucidStateStoreOptions {
4
+ /**
5
+ * The Lucid connection name to use. Defaults to the connection's primary (the `Database` default).
6
+ * Pass this if the durable tables live on a dedicated connection.
7
+ */
8
+ connectionName?: string;
9
+ }
10
+ /**
11
+ * A production-grade, persistent `StateStore` backed by AdonisJS **Lucid** (Knex). Runs, checkpoints,
12
+ * timers, signal waiters, run attributes and recovery leases live in SQL, so durable state survives
13
+ * restarts and works across processes — the behavioral twin of core's `InMemoryStateStore`.
14
+ *
15
+ * Portable across SQLite / Postgres / MySQL: JSON payloads are stored as TEXT (serialized here) and
16
+ * all timestamps are epoch-ms integers, so there's no dependency on a dialect's native JSON/date type.
17
+ *
18
+ * Usually you don't construct this directly: `config/durable.ts` selects it via
19
+ * `stores.lucid({ ... })` and the provider builds it for you.
20
+ */
21
+ export declare class LucidStateStore implements StateStore {
22
+ private readonly db;
23
+ private readonly connectionName;
24
+ constructor(db: Database, options?: LucidStateStoreOptions);
25
+ /** The base query client (or a named connection's), used unless an explicit tx client is passed. */
26
+ private client;
27
+ /** Idempotently provision the durable tables (called on boot when `autoSchema` is on). */
28
+ ensureSchema(): Promise<void>;
29
+ createRun(run: WorkflowRun): Promise<void>;
30
+ updateRun(runId: string, patch: Partial<WorkflowRun>): Promise<void>;
31
+ getRun(runId: string): Promise<WorkflowRun | null>;
32
+ deleteRun(runId: string): Promise<void>;
33
+ getCheckpoint(runId: string, seq: number): Promise<StepCheckpoint | null>;
34
+ saveCheckpoint(checkpoint: StepCheckpoint): Promise<void>;
35
+ /** Upsert a checkpoint keyed by `(run_id, seq)`, portable across dialects (read-then-write in a tx). */
36
+ private upsertCheckpoint;
37
+ listIncompleteRuns(): Promise<WorkflowRun[]>;
38
+ listPendingRuns(limit: number): Promise<WorkflowRun[]>;
39
+ listDueTimers(nowMs: number): Promise<WorkflowRun[]>;
40
+ tryLockRun(runId: string, owner: string, leaseUntilMs: number, nowMs: number): Promise<boolean>;
41
+ releaseRunLock(runId: string): Promise<void>;
42
+ renewRunLock(runId: string, owner: string, leaseUntilMs: number): Promise<boolean>;
43
+ putSignalWaiter(waiter: SignalWaiter): Promise<void>;
44
+ takeSignalWaiter(token: string): Promise<SignalWaiter | null>;
45
+ listSignalWaiters(prefix: string): Promise<SignalWaiter[]>;
46
+ bufferSignal(token: string, payload: unknown): Promise<void>;
47
+ takeBufferedSignal(token: string): Promise<{
48
+ payload: unknown;
49
+ } | null>;
50
+ transaction<T>(work: (tx: {
51
+ raw: unknown;
52
+ saveCheckpoint: (cp: StepCheckpoint) => Promise<void>;
53
+ }) => Promise<T>): Promise<T>;
54
+ listRuns(query: RunQuery): Promise<WorkflowRun[]>;
55
+ /**
56
+ * Add one attribute predicate as a correlated EXISTS subquery on the side-table. `<>` (ne) also
57
+ * excludes runs where the attribute is absent (the missing-key-never-matches contract): EXISTS
58
+ * already requires the key row present, so EXISTS(... <> ...) is exactly ne-with-present. Numeric
59
+ * operands compare `num_value`, everything else `str_value`.
60
+ */
61
+ private applyAttributeExists;
62
+ listCheckpoints(runId: string): Promise<StepCheckpoint[]>;
63
+ getLatestCheckpointByName(runId: string, name: string): Promise<StepCheckpoint | undefined>;
64
+ listCheckpointsByNamePrefix(runId: string, prefixes: string[]): Promise<StepCheckpoint[]>;
65
+ /** Rewrite a run's normalized attribute rows: delete the old set, insert the current one. Mirrors
66
+ * the in-memory store's reindex so the side-table always reflects the run's live searchAttributes. */
67
+ private reindexAttributes;
68
+ }
69
+ //# sourceMappingURL=lucid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucid.d.ts","sourceRoot":"","sources":["../../../src/stores/lucid.ts"],"names":[],"mappings":"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"}