pipework 0.251.0 → 0.252.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (730) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/core/config/load.d.ts +2 -0
  3. package/dist/core/config/load.d.ts.map +1 -1
  4. package/dist/core/config/load.js +1 -0
  5. package/dist/core/config/load.js.map +1 -1
  6. package/dist/core/config/namespace.d.ts +1 -0
  7. package/dist/core/config/namespace.d.ts.map +1 -1
  8. package/dist/core/config/schema.d.ts +2 -0
  9. package/dist/core/config/schema.d.ts.map +1 -1
  10. package/dist/core/config/schema.js +1 -0
  11. package/dist/core/config/schema.js.map +1 -1
  12. package/dist/core/surface/types.d.ts +1 -0
  13. package/dist/core/surface/types.d.ts.map +1 -1
  14. package/dist/data/db/namespace.d.ts +3 -0
  15. package/dist/data/db/namespace.d.ts.map +1 -1
  16. package/dist/data/db/namespace.js +3 -0
  17. package/dist/data/db/namespace.js.map +1 -1
  18. package/dist/data/db/pool.d.ts.map +1 -1
  19. package/dist/data/db/pool.js +6 -1
  20. package/dist/data/db/pool.js.map +1 -1
  21. package/dist/data/db/query-label.d.ts +5 -0
  22. package/dist/data/db/query-label.d.ts.map +1 -0
  23. package/dist/data/db/query-label.js +11 -0
  24. package/dist/data/db/query-label.js.map +1 -0
  25. package/dist/data/db/query-watch.d.ts +21 -0
  26. package/dist/data/db/query-watch.d.ts.map +1 -0
  27. package/dist/data/db/query-watch.js +90 -0
  28. package/dist/data/db/query-watch.js.map +1 -0
  29. package/dist/data/query/postgres-js/driver.js +1 -1
  30. package/dist/data/query/postgres-js/driver.js.map +1 -1
  31. package/dist/data/query/postgres-js/session.d.ts +5 -1
  32. package/dist/data/query/postgres-js/session.d.ts.map +1 -1
  33. package/dist/data/query/postgres-js/session.js +16 -11
  34. package/dist/data/query/postgres-js/session.js.map +1 -1
  35. package/dist/data/query/utils.d.ts +2 -0
  36. package/dist/data/query/utils.d.ts.map +1 -1
  37. package/dist/data/query/utils.js.map +1 -1
  38. package/dist/infra/credits/schema.d.ts +1 -1
  39. package/dist/test/plugin.d.ts.map +1 -1
  40. package/dist/test/plugin.js +10 -4
  41. package/dist/test/plugin.js.map +1 -1
  42. package/package.json +4 -3
  43. package/src/async/jobs/abortable-delay.ts +18 -0
  44. package/src/async/jobs/claims.ts +52 -0
  45. package/src/async/jobs/cron.ts +179 -0
  46. package/src/async/jobs/errors.ts +56 -0
  47. package/src/async/jobs/exclusion.ts +117 -0
  48. package/src/async/jobs/execute.ts +219 -0
  49. package/src/async/jobs/index.ts +10 -0
  50. package/src/async/jobs/listener.ts +135 -0
  51. package/src/async/jobs/namespace.ts +20 -0
  52. package/src/async/jobs/queue-door.ts +44 -0
  53. package/src/async/jobs/queue.ts +1012 -0
  54. package/src/async/jobs/run-script.ts +67 -0
  55. package/src/async/jobs/scheduler.ts +218 -0
  56. package/src/async/jobs/schedules-table.ts +37 -0
  57. package/src/async/jobs/serialize-error.ts +48 -0
  58. package/src/async/jobs/table.ts +191 -0
  59. package/src/async/pipeline/define.ts +53 -0
  60. package/src/async/pipeline/errors.ts +35 -0
  61. package/src/async/pipeline/execute.ts +53 -0
  62. package/src/async/pipeline/index.ts +13 -0
  63. package/src/async/pipeline/namespace.ts +12 -0
  64. package/src/async/pipeline/resume.ts +67 -0
  65. package/src/async/pipeline/run-steps.ts +98 -0
  66. package/src/async/pipeline/types.ts +57 -0
  67. package/src/async/state-machine/define.ts +64 -0
  68. package/src/async/state-machine/errors.ts +29 -0
  69. package/src/async/state-machine/index.ts +3 -0
  70. package/src/async/state-machine/namespace.ts +12 -0
  71. package/src/async/state-machine/transition.ts +90 -0
  72. package/src/async/state-machine/types.ts +37 -0
  73. package/src/async/steps/errors.ts +31 -0
  74. package/src/async/steps/graph.ts +1214 -0
  75. package/src/async/steps/hash.ts +40 -0
  76. package/src/async/steps/index.ts +7 -0
  77. package/src/async/steps/namespace.ts +7 -0
  78. package/src/async/steps/table.ts +97 -0
  79. package/src/async/steps/types.ts +318 -0
  80. package/src/audit/chain/index.ts +9 -0
  81. package/src/audit/chain/install.ts +113 -0
  82. package/src/audit/chain/retire.ts +52 -0
  83. package/src/audit/chain/verify.ts +257 -0
  84. package/src/audit/query/cursor.ts +37 -0
  85. package/src/audit/query/index.ts +9 -0
  86. package/src/audit/query/query.ts +223 -0
  87. package/src/audit/schema/audit-record-fields.ts +68 -0
  88. package/src/audit/schema/audit-record.ts +23 -0
  89. package/src/auth/auth/audit.ts +31 -0
  90. package/src/auth/auth/chain.ts +84 -0
  91. package/src/auth/auth/cookie.ts +136 -0
  92. package/src/auth/auth/email-links.ts +311 -0
  93. package/src/auth/auth/guard.ts +128 -0
  94. package/src/auth/auth/index.ts +18 -0
  95. package/src/auth/auth/multi-org.ts +337 -0
  96. package/src/auth/auth/namespace.ts +34 -0
  97. package/src/auth/auth/parse-expiry.ts +13 -0
  98. package/src/auth/auth/passwords.ts +110 -0
  99. package/src/auth/auth/schema.ts +110 -0
  100. package/src/auth/auth/sessions.ts +565 -0
  101. package/src/auth/auth/sign-in.ts +156 -0
  102. package/src/auth/auth/signing-keys.ts +69 -0
  103. package/src/auth/auth/types.ts +26 -0
  104. package/src/auth/auth/uuid.ts +10 -0
  105. package/src/auth/rbac/cache.ts +55 -0
  106. package/src/auth/rbac/check.ts +30 -0
  107. package/src/auth/rbac/create.ts +35 -0
  108. package/src/auth/rbac/index.ts +5 -0
  109. package/src/auth/rbac/middleware.ts +20 -0
  110. package/src/auth/rbac/namespace.ts +15 -0
  111. package/src/auth/rbac/resolve.ts +31 -0
  112. package/src/auth/rbac/schema.sql +31 -0
  113. package/src/auth/rbac/seed.ts +67 -0
  114. package/src/auth/rbac/tables.ts +32 -0
  115. package/src/auth/rbac/types.ts +65 -0
  116. package/src/auth/tenant/extract.ts +33 -0
  117. package/src/auth/tenant/in-tenant.ts +49 -0
  118. package/src/auth/tenant/index.ts +7 -0
  119. package/src/auth/tenant/namespace.ts +23 -0
  120. package/src/auth/tenant/propagate.ts +20 -0
  121. package/src/auth/tenant/rls.ts +120 -0
  122. package/src/auth/tenant/scope.ts +33 -0
  123. package/src/auth/tenant/scoped-db.ts +581 -0
  124. package/src/auth/tenant/types.ts +14 -0
  125. package/src/auth/tenant/validate.ts +27 -0
  126. package/src/cli/commands/add.ts +158 -0
  127. package/src/cli/commands/alerts.ts +98 -0
  128. package/src/cli/commands/check.ts +1418 -0
  129. package/src/cli/commands/codemod.ts +78 -0
  130. package/src/cli/commands/db.ts +356 -0
  131. package/src/cli/commands/dev.ts +101 -0
  132. package/src/cli/commands/generate.ts +75 -0
  133. package/src/cli/commands/init.ts +36 -0
  134. package/src/cli/commands/install.ts +28 -0
  135. package/src/cli/commands/lint.ts +62 -0
  136. package/src/cli/commands/migrate.ts +132 -0
  137. package/src/cli/commands/openapi.ts +63 -0
  138. package/src/cli/commands/remove.ts +72 -0
  139. package/src/cli/commands/run.ts +50 -0
  140. package/src/cli/commands/scope.ts +54 -0
  141. package/src/cli/commands/serve.ts +68 -0
  142. package/src/cli/commands/shard.ts +31 -0
  143. package/src/cli/commands/shared/config-pipework-version.ts +28 -0
  144. package/src/cli/commands/shared/find-config.ts +22 -0
  145. package/src/cli/commands/shared/load-config.ts +35 -0
  146. package/src/cli/commands/shared/pnpm-install.ts +95 -0
  147. package/src/cli/commands/shared/report-removed.ts +8 -0
  148. package/src/cli/commands/sync.ts +32 -0
  149. package/src/cli/commands/test.ts +307 -0
  150. package/src/cli/commands/upgrade.ts +48 -0
  151. package/src/cli/dev-bootstrap.ts +24 -0
  152. package/src/cli/errors.ts +10 -0
  153. package/src/cli/index.ts +303 -0
  154. package/src/cli/output.ts +17 -0
  155. package/src/cli/port.ts +15 -0
  156. package/src/cli/surface-kinds.ts +20 -0
  157. package/src/client/index.ts +4 -0
  158. package/src/client/poll.ts +130 -0
  159. package/src/client/report-fault.ts +119 -0
  160. package/src/core/config/app-pool.ts +19 -0
  161. package/src/core/config/aws-env.ts +29 -0
  162. package/src/core/config/base-dir.ts +24 -0
  163. package/src/core/config/discover.ts +64 -0
  164. package/src/core/config/env-resolve.ts +87 -0
  165. package/src/core/config/env-types.ts +116 -0
  166. package/src/core/config/env.ts +55 -0
  167. package/src/core/config/errors.ts +9 -0
  168. package/src/core/config/import-config.ts +40 -0
  169. package/src/core/config/index.ts +8 -0
  170. package/src/core/config/load.ts +417 -0
  171. package/src/core/config/namespace.ts +14 -0
  172. package/src/core/config/resolve.ts +195 -0
  173. package/src/core/config/schema.ts +488 -0
  174. package/src/core/config/statement-observer.ts +48 -0
  175. package/src/core/config/ts-inline-hooks.ts +75 -0
  176. package/src/core/config/ts-register.ts +4 -0
  177. package/src/core/config/ts-resolve-hooks.ts +101 -0
  178. package/src/core/errors/base.ts +49 -0
  179. package/src/core/errors/http.ts +146 -0
  180. package/src/core/errors/index.ts +2 -0
  181. package/src/core/errors/namespace.ts +31 -0
  182. package/src/core/lifecycle/drain.ts +33 -0
  183. package/src/core/lifecycle/health.ts +72 -0
  184. package/src/core/lifecycle/index.ts +4 -0
  185. package/src/core/lifecycle/namespace.ts +7 -0
  186. package/src/core/lifecycle/startup.ts +102 -0
  187. package/src/core/lifecycle/types.ts +36 -0
  188. package/src/core/logging/context.ts +60 -0
  189. package/src/core/logging/error-chain.ts +68 -0
  190. package/src/core/logging/index.ts +5 -0
  191. package/src/core/logging/logger.ts +65 -0
  192. package/src/core/logging/namespace.ts +16 -0
  193. package/src/core/logging/proxy.ts +22 -0
  194. package/src/core/logging/redact-match.ts +24 -0
  195. package/src/core/logging/types.ts +47 -0
  196. package/src/core/pipework.ts +566 -0
  197. package/src/core/runtime/broker.ts +69 -0
  198. package/src/core/surface/http.ts +133 -0
  199. package/src/core/surface/index.ts +11 -0
  200. package/src/core/surface/job-timeout.ts +40 -0
  201. package/src/core/surface/namespace.ts +13 -0
  202. package/src/core/surface/script.ts +33 -0
  203. package/src/core/surface/start.ts +142 -0
  204. package/src/core/surface/types.ts +225 -0
  205. package/src/core/surface/validate.ts +88 -0
  206. package/src/core/surface/worker.ts +528 -0
  207. package/src/core/validation/connectivity.ts +49 -0
  208. package/src/core/validation/domain.ts +99 -0
  209. package/src/core/validation/index.ts +5 -0
  210. package/src/core/validation/queue-tables.ts +312 -0
  211. package/src/core/validation/rls-role.ts +138 -0
  212. package/src/core/validation/startup.ts +51 -0
  213. package/src/core/validation/surfaces.ts +65 -0
  214. package/src/core/validation/types.ts +25 -0
  215. package/src/data/db/advisory-lock.ts +55 -0
  216. package/src/data/db/aggregates.ts +172 -0
  217. package/src/data/db/array-elements.ts +111 -0
  218. package/src/data/db/bulk-set.ts +53 -0
  219. package/src/data/db/col/index.ts +14 -0
  220. package/src/data/db/composed.ts +53 -0
  221. package/src/data/db/db.ts +276 -0
  222. package/src/data/db/excluded.ts +16 -0
  223. package/src/data/db/expressions.ts +473 -0
  224. package/src/data/db/filter.ts +90 -0
  225. package/src/data/db/function-source.ts +114 -0
  226. package/src/data/db/identifiers.ts +16 -0
  227. package/src/data/db/idx/index.ts +9 -0
  228. package/src/data/db/in-list.ts +49 -0
  229. package/src/data/db/index.ts +9 -0
  230. package/src/data/db/insert-split.ts +137 -0
  231. package/src/data/db/instrumentation.ts +82 -0
  232. package/src/data/db/maintenance.ts +28 -0
  233. package/src/data/db/namespace.ts +107 -0
  234. package/src/data/db/owner-labels.ts +9 -0
  235. package/src/data/db/pool.ts +187 -0
  236. package/src/data/db/query-label.ts +13 -0
  237. package/src/data/db/query-watch.ts +116 -0
  238. package/src/data/db/raw-client-warning.ts +37 -0
  239. package/src/data/db/readonly.ts +23 -0
  240. package/src/data/db/reservation.ts +151 -0
  241. package/src/data/db/schema-features.ts +14 -0
  242. package/src/data/db/serializable.ts +83 -0
  243. package/src/data/db/sql.ts +1 -0
  244. package/src/data/db/timeouts.ts +76 -0
  245. package/src/data/db/types.ts +18 -0
  246. package/src/data/db/unbound.ts +33 -0
  247. package/src/data/db/values.ts +29 -0
  248. package/src/data/domain/brand.ts +15 -0
  249. package/src/data/domain/build-factory.ts +193 -0
  250. package/src/data/domain/build-schema.ts +161 -0
  251. package/src/data/domain/build-table.ts +355 -0
  252. package/src/data/domain/define.ts +239 -0
  253. package/src/data/domain/external-registry.ts +34 -0
  254. package/src/data/domain/external.ts +77 -0
  255. package/src/data/domain/field.ts +279 -0
  256. package/src/data/domain/index.ts +13 -0
  257. package/src/data/domain/naming.ts +6 -0
  258. package/src/data/domain/projections.ts +57 -0
  259. package/src/data/domain/trace-safe-projection.ts +31 -0
  260. package/src/data/domain/traits.ts +108 -0
  261. package/src/data/domain/types.ts +289 -0
  262. package/src/data/jsonb/composed.ts +18 -0
  263. package/src/data/jsonb/index.ts +1 -0
  264. package/src/data/jsonb/namespace.ts +30 -0
  265. package/src/data/jsonb/query.ts +86 -0
  266. package/src/data/migrate/append-only-generate.ts +47 -0
  267. package/src/data/migrate/applied.ts +47 -0
  268. package/src/data/migrate/apply.ts +309 -0
  269. package/src/data/migrate/check.ts +119 -0
  270. package/src/data/migrate/diff.ts +357 -0
  271. package/src/data/migrate/door-generate.ts +130 -0
  272. package/src/data/migrate/framework-rls.ts +58 -0
  273. package/src/data/migrate/generate.ts +201 -0
  274. package/src/data/migrate/history.ts +215 -0
  275. package/src/data/migrate/index.ts +9 -0
  276. package/src/data/migrate/internal-definitions.ts +175 -0
  277. package/src/data/migrate/post-process.ts +73 -0
  278. package/src/data/migrate/pragma.ts +73 -0
  279. package/src/data/migrate/provision-framework.ts +147 -0
  280. package/src/data/migrate/rls-generate.ts +61 -0
  281. package/src/data/migrate/run.ts +124 -0
  282. package/src/data/migrate/safety.ts +167 -0
  283. package/src/data/migrate/snapshot.ts +368 -0
  284. package/src/data/migrate/sql-emit.ts +392 -0
  285. package/src/data/migrate/statements.ts +312 -0
  286. package/src/data/query/alias.ts +126 -0
  287. package/src/data/query/batch.ts +8 -0
  288. package/src/data/query/cache/core/cache.ts +78 -0
  289. package/src/data/query/cache/core/index.ts +1 -0
  290. package/src/data/query/cache/core/types.ts +29 -0
  291. package/src/data/query/cache/readme.md +230 -0
  292. package/src/data/query/casing.ts +76 -0
  293. package/src/data/query/collation.ts +11 -0
  294. package/src/data/query/column-builder.ts +370 -0
  295. package/src/data/query/column.ts +150 -0
  296. package/src/data/query/entity.ts +42 -0
  297. package/src/data/query/errors.ts +33 -0
  298. package/src/data/query/index.ts +14 -0
  299. package/src/data/query/logger.ts +47 -0
  300. package/src/data/query/operations.ts +45 -0
  301. package/src/data/query/pg-core/alias.ts +12 -0
  302. package/src/data/query/pg-core/checks.ts +32 -0
  303. package/src/data/query/pg-core/columns/all.ts +71 -0
  304. package/src/data/query/pg-core/columns/bigint.ts +110 -0
  305. package/src/data/query/pg-core/columns/bigserial.ts +128 -0
  306. package/src/data/query/pg-core/columns/boolean.ts +43 -0
  307. package/src/data/query/pg-core/columns/char.ts +85 -0
  308. package/src/data/query/pg-core/columns/cidr.ts +43 -0
  309. package/src/data/query/pg-core/columns/common.ts +366 -0
  310. package/src/data/query/pg-core/columns/custom.ts +232 -0
  311. package/src/data/query/pg-core/columns/date.common.ts +15 -0
  312. package/src/data/query/pg-core/columns/date.ts +112 -0
  313. package/src/data/query/pg-core/columns/double-precision.ts +55 -0
  314. package/src/data/query/pg-core/columns/enum.ts +201 -0
  315. package/src/data/query/pg-core/columns/index.ts +35 -0
  316. package/src/data/query/pg-core/columns/inet.ts +43 -0
  317. package/src/data/query/pg-core/columns/int.common.ts +57 -0
  318. package/src/data/query/pg-core/columns/integer.ts +53 -0
  319. package/src/data/query/pg-core/columns/interval.ts +83 -0
  320. package/src/data/query/pg-core/columns/json.ts +58 -0
  321. package/src/data/query/pg-core/columns/jsonb.ts +56 -0
  322. package/src/data/query/pg-core/columns/line.ts +117 -0
  323. package/src/data/query/pg-core/columns/macaddr.ts +43 -0
  324. package/src/data/query/pg-core/columns/macaddr8.ts +43 -0
  325. package/src/data/query/pg-core/columns/numeric.ts +227 -0
  326. package/src/data/query/pg-core/columns/point.ts +127 -0
  327. package/src/data/query/pg-core/columns/postgis_extension/geometry.ts +119 -0
  328. package/src/data/query/pg-core/columns/postgis_extension/utils.ts +47 -0
  329. package/src/data/query/pg-core/columns/real.ts +58 -0
  330. package/src/data/query/pg-core/columns/serial.ts +55 -0
  331. package/src/data/query/pg-core/columns/smallint.ts +53 -0
  332. package/src/data/query/pg-core/columns/smallserial.ts +60 -0
  333. package/src/data/query/pg-core/columns/text.ts +67 -0
  334. package/src/data/query/pg-core/columns/time.ts +72 -0
  335. package/src/data/query/pg-core/columns/timestamp.ts +163 -0
  336. package/src/data/query/pg-core/columns/uuid.ts +51 -0
  337. package/src/data/query/pg-core/columns/varchar.ts +89 -0
  338. package/src/data/query/pg-core/columns/vector_extension/bit.ts +68 -0
  339. package/src/data/query/pg-core/columns/vector_extension/halfvec.ts +80 -0
  340. package/src/data/query/pg-core/columns/vector_extension/sparsevec.ts +67 -0
  341. package/src/data/query/pg-core/columns/vector_extension/vector.ts +80 -0
  342. package/src/data/query/pg-core/db.ts +674 -0
  343. package/src/data/query/pg-core/dialect.ts +1404 -0
  344. package/src/data/query/pg-core/expressions.ts +25 -0
  345. package/src/data/query/pg-core/foreign-keys.ts +130 -0
  346. package/src/data/query/pg-core/index.ts +21 -0
  347. package/src/data/query/pg-core/indexes.ts +276 -0
  348. package/src/data/query/pg-core/policies.ts +56 -0
  349. package/src/data/query/pg-core/primary-keys.ts +62 -0
  350. package/src/data/query/pg-core/query-builders/count.ts +86 -0
  351. package/src/data/query/pg-core/query-builders/delete.ts +293 -0
  352. package/src/data/query/pg-core/query-builders/index.ts +7 -0
  353. package/src/data/query/pg-core/query-builders/insert.ts +452 -0
  354. package/src/data/query/pg-core/query-builders/query-builder.ts +123 -0
  355. package/src/data/query/pg-core/query-builders/query.ts +157 -0
  356. package/src/data/query/pg-core/query-builders/raw.ts +49 -0
  357. package/src/data/query/pg-core/query-builders/refresh-materialized-view.ts +108 -0
  358. package/src/data/query/pg-core/query-builders/select.ts +1346 -0
  359. package/src/data/query/pg-core/query-builders/select.types.ts +437 -0
  360. package/src/data/query/pg-core/query-builders/update.ts +626 -0
  361. package/src/data/query/pg-core/roles.ts +41 -0
  362. package/src/data/query/pg-core/schema.ts +72 -0
  363. package/src/data/query/pg-core/sequence.ts +41 -0
  364. package/src/data/query/pg-core/session.ts +292 -0
  365. package/src/data/query/pg-core/subquery.ts +46 -0
  366. package/src/data/query/pg-core/table.ts +252 -0
  367. package/src/data/query/pg-core/unique-constraint.ts +73 -0
  368. package/src/data/query/pg-core/utils/array.ts +95 -0
  369. package/src/data/query/pg-core/utils/index.ts +1 -0
  370. package/src/data/query/pg-core/utils.ts +104 -0
  371. package/src/data/query/pg-core/view-base.ts +14 -0
  372. package/src/data/query/pg-core/view-common.ts +1 -0
  373. package/src/data/query/pg-core/view.ts +435 -0
  374. package/src/data/query/pg-core/with-builder.ts +41 -0
  375. package/src/data/query/postgres-js/README.md +46 -0
  376. package/src/data/query/postgres-js/array-parser.ts +45 -0
  377. package/src/data/query/postgres-js/driver-error-boundary.ts +149 -0
  378. package/src/data/query/postgres-js/driver.ts +163 -0
  379. package/src/data/query/postgres-js/index.ts +2 -0
  380. package/src/data/query/postgres-js/session.ts +234 -0
  381. package/src/data/query/primary-key.ts +11 -0
  382. package/src/data/query/query-builders/query-builder.ts +19 -0
  383. package/src/data/query/query-builders/select.types.ts +175 -0
  384. package/src/data/query/query-promise.ts +35 -0
  385. package/src/data/query/relations.ts +725 -0
  386. package/src/data/query/runnable-query.ts +12 -0
  387. package/src/data/query/selection-proxy.ts +121 -0
  388. package/src/data/query/session.ts +8 -0
  389. package/src/data/query/sql/expressions/conditions.ts +741 -0
  390. package/src/data/query/sql/expressions/index.ts +2 -0
  391. package/src/data/query/sql/expressions/select.ts +45 -0
  392. package/src/data/query/sql/functions/aggregate.ts +129 -0
  393. package/src/data/query/sql/functions/index.ts +2 -0
  394. package/src/data/query/sql/functions/vector.ts +178 -0
  395. package/src/data/query/sql/index.ts +3 -0
  396. package/src/data/query/sql/sql.ts +794 -0
  397. package/src/data/query/subquery.ts +53 -0
  398. package/src/data/query/table.ts +208 -0
  399. package/src/data/query/table.utils.ts +2 -0
  400. package/src/data/query/tracing-utils.ts +3 -0
  401. package/src/data/query/tracing.ts +11 -0
  402. package/src/data/query/utils.ts +357 -0
  403. package/src/data/query/version.ts +4 -0
  404. package/src/data/query/view-common.ts +1 -0
  405. package/src/data/schema/branded.ts +13 -0
  406. package/src/data/schema/generated/coerce.ts +5 -0
  407. package/src/data/schema/generated/combinator.ts +6 -0
  408. package/src/data/schema/generated/encoding.ts +5 -0
  409. package/src/data/schema/generated/error.ts +6 -0
  410. package/src/data/schema/generated/format.ts +5 -0
  411. package/src/data/schema/generated/type-constructor.ts +10 -0
  412. package/src/data/schema/generated/type.ts +6 -0
  413. package/src/data/schema/index.ts +6 -0
  414. package/src/data/schema/json-schema.ts +33 -0
  415. package/src/data/schema/namespace.ts +55 -0
  416. package/src/data/schema/parse.ts +39 -0
  417. package/src/data/schema/types.ts +39 -0
  418. package/src/data/temporal/append-only.ts +134 -0
  419. package/src/data/temporal/close.ts +27 -0
  420. package/src/data/temporal/columns.ts +10 -0
  421. package/src/data/temporal/definition-queries.ts +70 -0
  422. package/src/data/temporal/errors.ts +10 -0
  423. package/src/data/temporal/get-current.ts +22 -0
  424. package/src/data/temporal/index.ts +9 -0
  425. package/src/data/temporal/namespace.ts +36 -0
  426. package/src/data/temporal/query.ts +25 -0
  427. package/src/data/temporal/resolve.ts +17 -0
  428. package/src/data/temporal/revise.ts +67 -0
  429. package/src/data/temporal/types.ts +22 -0
  430. package/src/data/valve/artifact.ts +33 -0
  431. package/src/data/valve/contract-diff.ts +21 -0
  432. package/src/data/valve/cross.ts +57 -0
  433. package/src/data/valve/crossing-ledger.ts +50 -0
  434. package/src/data/valve/decision.ts +44 -0
  435. package/src/data/valve/durable-crossing.ts +52 -0
  436. package/src/data/valve/execute-crossing.ts +77 -0
  437. package/src/data/valve/faucet.ts +56 -0
  438. package/src/data/valve/gate.ts +114 -0
  439. package/src/data/valve/graph.ts +77 -0
  440. package/src/data/valve/index.ts +53 -0
  441. package/src/data/valve/namespace.ts +57 -0
  442. package/src/data/valve/registry.ts +50 -0
  443. package/src/data/valve/schema/valve-crossing-fields.ts +23 -0
  444. package/src/data/valve/schema/valve-crossing.ts +9 -0
  445. package/src/data/valve/supply.ts +154 -0
  446. package/src/data/valve/types.ts +143 -0
  447. package/src/data/vector/columns.ts +27 -0
  448. package/src/data/vector/index.ts +4 -0
  449. package/src/data/vector/namespace.ts +33 -0
  450. package/src/data/vector/query.ts +85 -0
  451. package/src/data/vector/validate.ts +16 -0
  452. package/src/data/write/audit/actor.ts +15 -0
  453. package/src/data/write/audit/audit-columns.ts +18 -0
  454. package/src/data/write/audit/audit-select.ts +111 -0
  455. package/src/data/write/audit/bound-transaction.ts +14 -0
  456. package/src/data/write/audit/cte-compile.ts +32 -0
  457. package/src/data/write/audit/decode-returning.ts +47 -0
  458. package/src/data/write/audit/final-select.ts +43 -0
  459. package/src/data/write/audit/infra-audit.ts +36 -0
  460. package/src/data/write/audit/primary-key.ts +65 -0
  461. package/src/data/write/audit/projection.ts +41 -0
  462. package/src/data/write/audit/read-touches.ts +86 -0
  463. package/src/data/write/audit/touch-match.ts +78 -0
  464. package/src/data/write/audit/verb-delete.ts +62 -0
  465. package/src/data/write/audit/verb-insert.ts +36 -0
  466. package/src/data/write/audit/verb-select.ts +47 -0
  467. package/src/data/write/audit/verb-update.ts +60 -0
  468. package/src/data/write/audit/verb-upsert.ts +104 -0
  469. package/src/data/write/conflict.ts +43 -0
  470. package/src/data/write/delete.ts +38 -0
  471. package/src/data/write/execute.ts +243 -0
  472. package/src/data/write/index.ts +11 -0
  473. package/src/data/write/insert.ts +63 -0
  474. package/src/data/write/state.ts +43 -0
  475. package/src/data/write/update.ts +54 -0
  476. package/src/data/write/upsert.ts +58 -0
  477. package/src/data/write/values.ts +19 -0
  478. package/src/index.ts +230 -0
  479. package/src/infra/access-links/code.ts +70 -0
  480. package/src/infra/access-links/handle.ts +892 -0
  481. package/src/infra/access-links/index.ts +9 -0
  482. package/src/infra/access-links/namespace.ts +30 -0
  483. package/src/infra/access-links/person-check.ts +177 -0
  484. package/src/infra/access-links/schema.ts +71 -0
  485. package/src/infra/alerts/async-sources.ts +231 -0
  486. package/src/infra/alerts/audit.ts +36 -0
  487. package/src/infra/alerts/beat.ts +123 -0
  488. package/src/infra/alerts/client-faults.ts +111 -0
  489. package/src/infra/alerts/faults.ts +156 -0
  490. package/src/infra/alerts/handle.ts +778 -0
  491. package/src/infra/alerts/http.ts +192 -0
  492. package/src/infra/alerts/index.ts +12 -0
  493. package/src/infra/alerts/infra-sources.ts +180 -0
  494. package/src/infra/alerts/namespace.ts +81 -0
  495. package/src/infra/alerts/redact.ts +21 -0
  496. package/src/infra/alerts/request-faults.ts +41 -0
  497. package/src/infra/alerts/schema.ts +124 -0
  498. package/src/infra/alerts/sinks.ts +125 -0
  499. package/src/infra/alerts/source-options.ts +26 -0
  500. package/src/infra/alerts/sources.ts +503 -0
  501. package/src/infra/alerts/subsystem-sources.ts +137 -0
  502. package/src/infra/audit/emit.ts +87 -0
  503. package/src/infra/audit/index.ts +2 -0
  504. package/src/infra/audit/namespace.ts +22 -0
  505. package/src/infra/audit/schema.sql +35 -0
  506. package/src/infra/audit/types.ts +18 -0
  507. package/src/infra/aws/credentials.ts +147 -0
  508. package/src/infra/aws/sigv4.ts +140 -0
  509. package/src/infra/cache/create.ts +58 -0
  510. package/src/infra/cache/entry.ts +81 -0
  511. package/src/infra/cache/index.ts +4 -0
  512. package/src/infra/cache/namespace.ts +10 -0
  513. package/src/infra/cache/tenant.ts +93 -0
  514. package/src/infra/cache/types.ts +24 -0
  515. package/src/infra/crawl/audit.ts +35 -0
  516. package/src/infra/crawl/errors.ts +25 -0
  517. package/src/infra/crawl/handle.ts +693 -0
  518. package/src/infra/crawl/index.ts +9 -0
  519. package/src/infra/crawl/links.ts +160 -0
  520. package/src/infra/crawl/namespace.ts +36 -0
  521. package/src/infra/crawl/robots.ts +100 -0
  522. package/src/infra/crawl/schema.ts +89 -0
  523. package/src/infra/credit-line/handle.ts +883 -0
  524. package/src/infra/credit-line/index.ts +6 -0
  525. package/src/infra/credit-line/namespace.ts +7 -0
  526. package/src/infra/credit-line/schema.ts +96 -0
  527. package/src/infra/credits/handle.ts +706 -0
  528. package/src/infra/credits/index.ts +5 -0
  529. package/src/infra/credits/namespace.ts +7 -0
  530. package/src/infra/credits/schema.ts +83 -0
  531. package/src/infra/email/audit.ts +36 -0
  532. package/src/infra/email/inbound.ts +622 -0
  533. package/src/infra/email/index.ts +11 -0
  534. package/src/infra/email/mail.ts +517 -0
  535. package/src/infra/email/mime.ts +447 -0
  536. package/src/infra/email/namespace.ts +22 -0
  537. package/src/infra/email/providers.ts +111 -0
  538. package/src/infra/email/schema.ts +96 -0
  539. package/src/infra/email/sns.ts +200 -0
  540. package/src/infra/email/unsubscribe.ts +44 -0
  541. package/src/infra/fetch/address.ts +88 -0
  542. package/src/infra/fetch/connect-retry.ts +87 -0
  543. package/src/infra/fetch/handle.ts +329 -0
  544. package/src/infra/fetch/index.ts +7 -0
  545. package/src/infra/fetch/namespace.ts +70 -0
  546. package/src/infra/idempotency/index.ts +3 -0
  547. package/src/infra/idempotency/middleware.ts +87 -0
  548. package/src/infra/idempotency/store.ts +92 -0
  549. package/src/infra/idempotency/types.ts +30 -0
  550. package/src/infra/join-requests/handle.ts +312 -0
  551. package/src/infra/join-requests/index.ts +2 -0
  552. package/src/infra/join-requests/namespace.ts +7 -0
  553. package/src/infra/join-requests/schema.ts +33 -0
  554. package/src/infra/outbox/core.ts +165 -0
  555. package/src/infra/quota/errors.ts +32 -0
  556. package/src/infra/quota/handle.ts +215 -0
  557. package/src/infra/quota/index.ts +5 -0
  558. package/src/infra/quota/namespace.ts +7 -0
  559. package/src/infra/quota/schema.ts +15 -0
  560. package/src/infra/storage/backend.ts +34 -0
  561. package/src/infra/storage/handle.ts +513 -0
  562. package/src/infra/storage/index.ts +9 -0
  563. package/src/infra/storage/local.ts +104 -0
  564. package/src/infra/storage/namespace.ts +13 -0
  565. package/src/infra/storage/s3.ts +257 -0
  566. package/src/infra/storage/schema.ts +24 -0
  567. package/src/infra/support/handle.ts +854 -0
  568. package/src/infra/support/http.ts +229 -0
  569. package/src/infra/support/index.ts +7 -0
  570. package/src/infra/support/namespace.ts +12 -0
  571. package/src/infra/support/schema.ts +96 -0
  572. package/src/infra/webhook/inbound.ts +45 -0
  573. package/src/infra/webhook/index.ts +5 -0
  574. package/src/infra/webhook/namespace.ts +24 -0
  575. package/src/infra/webhook/outbound.ts +315 -0
  576. package/src/infra/webhook/sign.ts +32 -0
  577. package/src/infra/webhook/verify.ts +82 -0
  578. package/src/invariants/assert.ts +26 -0
  579. package/src/invariants/index.ts +1 -0
  580. package/src/lint/config.ts +56 -0
  581. package/src/lint/doctrine.ts +163 -0
  582. package/src/lint/include.ts +97 -0
  583. package/src/lint/index.ts +3 -0
  584. package/src/lint/preset.ts +10 -0
  585. package/src/lint/resolver.ts +218 -0
  586. package/src/lint/rules/no-reexports.ts +46 -0
  587. package/src/request/behavior/audited.ts +85 -0
  588. package/src/request/behavior/cached.ts +62 -0
  589. package/src/request/behavior/compose.ts +28 -0
  590. package/src/request/behavior/index.ts +5 -0
  591. package/src/request/behavior/namespace.ts +16 -0
  592. package/src/request/behavior/types.ts +26 -0
  593. package/src/request/behavior/versioned.ts +54 -0
  594. package/src/request/context/create.ts +103 -0
  595. package/src/request/context/guard.ts +49 -0
  596. package/src/request/context/index.ts +4 -0
  597. package/src/request/context/run-in-transaction.ts +200 -0
  598. package/src/request/context/store.ts +28 -0
  599. package/src/request/context/types.ts +50 -0
  600. package/src/request/di/builder.ts +535 -0
  601. package/src/request/di/index.ts +8 -0
  602. package/src/request/di/resolve.ts +271 -0
  603. package/src/request/di/types.ts +262 -0
  604. package/src/request/fitting/namespace.ts +7 -0
  605. package/src/request/fixture/batch.ts +71 -0
  606. package/src/request/fixture/builder.ts +26 -0
  607. package/src/request/fixture/errors.ts +10 -0
  608. package/src/request/fixture/index.ts +8 -0
  609. package/src/request/fixture/namespace.ts +23 -0
  610. package/src/request/fixture/paginate.ts +44 -0
  611. package/src/request/fixture/to-handlers.ts +260 -0
  612. package/src/request/fixture/types.ts +79 -0
  613. package/src/request/flow/act-as.ts +78 -0
  614. package/src/request/flow/namespace.ts +17 -0
  615. package/src/request/http/error-step.ts +42 -0
  616. package/src/request/http/file.ts +141 -0
  617. package/src/request/http/index.ts +4 -0
  618. package/src/request/http/middleware.ts +141 -0
  619. package/src/request/http/namespace.ts +5 -0
  620. package/src/request/http/rate-limit-classes.ts +170 -0
  621. package/src/request/http/response.ts +82 -0
  622. package/src/request/http/server.ts +916 -0
  623. package/src/request/http/sniff.ts +261 -0
  624. package/src/request/http/types.ts +250 -0
  625. package/src/request/http/upload.ts +284 -0
  626. package/src/request/internal/text.ts +6 -0
  627. package/src/request/openapi/generate.ts +205 -0
  628. package/src/request/openapi/index.ts +2 -0
  629. package/src/request/openapi/namespace.ts +7 -0
  630. package/src/test/auth.ts +13 -0
  631. package/src/test/auto-setup.ts +45 -0
  632. package/src/test/context.ts +91 -0
  633. package/src/test/crawl-fixture.ts +157 -0
  634. package/src/test/discover-fork.ts +17 -0
  635. package/src/test/fingerprint.ts +135 -0
  636. package/src/test/globals.d.ts +7 -0
  637. package/src/test/index.ts +19 -0
  638. package/src/test/namespace.ts +87 -0
  639. package/src/test/plugin.ts +189 -0
  640. package/src/test/progress.ts +185 -0
  641. package/src/test/reap-after-run.ts +28 -0
  642. package/src/test/reap.ts +286 -0
  643. package/src/test/reset.ts +253 -0
  644. package/src/test/savepoints.ts +172 -0
  645. package/src/test/setup.ts +1422 -0
  646. package/src/test/system-channel.ts +50 -0
  647. package/src/test/vitest-plugin.ts +142 -0
  648. package/src/test/vitest-workspace.ts +507 -0
  649. package/src/test/vitest.ts +333 -0
  650. package/src/test/watch.ts +105 -0
  651. package/src/trace/capture/bounded-serializer.ts +146 -0
  652. package/src/trace/cardinality/analyze.ts +173 -0
  653. package/src/trace/cardinality/branch-context.ts +214 -0
  654. package/src/trace/cardinality/check.ts +33 -0
  655. package/src/trace/cardinality/classify-edge.ts +64 -0
  656. package/src/trace/cardinality/structural-max.ts +107 -0
  657. package/src/trace/check/coverage-check.ts +188 -0
  658. package/src/trace/check/flow-check.ts +103 -0
  659. package/src/trace/check/flow-step-site.ts +234 -0
  660. package/src/trace/check/io-pattern.ts +116 -0
  661. package/src/trace/codemod/add-cardinality.ts +152 -0
  662. package/src/trace/codemod/run.ts +80 -0
  663. package/src/trace/entry/child-trace.ts +21 -0
  664. package/src/trace/entry/close-trace.ts +87 -0
  665. package/src/trace/entry/finalize-trace.ts +28 -0
  666. package/src/trace/entry/open-trace.ts +138 -0
  667. package/src/trace/entry/parent-trace.ts +20 -0
  668. package/src/trace/entry/parse-traceparent.ts +39 -0
  669. package/src/trace/entry/process-start.ts +38 -0
  670. package/src/trace/entry/trace-context.ts +26 -0
  671. package/src/trace/entry/tracing-enabled.ts +10 -0
  672. package/src/trace/external/record.ts +195 -0
  673. package/src/trace/external/report.ts +66 -0
  674. package/src/trace/namespace.ts +19 -0
  675. package/src/trace/partition/day.ts +47 -0
  676. package/src/trace/partition/index.ts +14 -0
  677. package/src/trace/partition/partition-name.ts +23 -0
  678. package/src/trace/partition/plan.ts +82 -0
  679. package/src/trace/partition/schedule.ts +26 -0
  680. package/src/trace/partition/startup-hook.ts +39 -0
  681. package/src/trace/partition/sync.ts +154 -0
  682. package/src/trace/partition/tables.ts +53 -0
  683. package/src/trace/read/tree.ts +83 -0
  684. package/src/trace/retain/copy-on-error.ts +76 -0
  685. package/src/trace/runtime/expire-stale-traces.ts +54 -0
  686. package/src/trace/runtime/flow-step.ts +147 -0
  687. package/src/trace/runtime/flush-steps.ts +31 -0
  688. package/src/trace/runtime/pending-writes.ts +54 -0
  689. package/src/trace/runtime/step-buffer.ts +298 -0
  690. package/src/trace/runtime/step-error.ts +21 -0
  691. package/src/trace/runtime/step-meta.ts +55 -0
  692. package/src/trace/runtime/thenable.ts +12 -0
  693. package/src/trace/runtime/truncate-trace.ts +62 -0
  694. package/src/trace/schema/trace-fields.ts +52 -0
  695. package/src/trace/schema/trace-retained.ts +22 -0
  696. package/src/trace/schema/trace-step-fields.ts +44 -0
  697. package/src/trace/schema/trace-step-retained.ts +25 -0
  698. package/src/trace/schema/trace-step.ts +18 -0
  699. package/src/trace/schema/trace.ts +12 -0
  700. package/src/trace/transformer/apply.ts +79 -0
  701. package/src/trace/transformer/build-meta-literal.ts +30 -0
  702. package/src/trace/transformer/find-flow-step-sites.ts +85 -0
  703. package/src/trace/transformer/inject-flow-step-import.ts +39 -0
  704. package/src/trace/transformer/transform-error.ts +14 -0
  705. package/src/trace/transformer/transform-flow-steps.ts +123 -0
  706. package/src/trace/transformer/wrap-function-declaration.ts +62 -0
  707. package/src/trace/transformer/wrap-variable-declaration.ts +67 -0
  708. package/src/workspace/affected.ts +110 -0
  709. package/src/workspace/changed-files.ts +163 -0
  710. package/src/workspace/check-deps.ts +213 -0
  711. package/src/workspace/checksum.ts +20 -0
  712. package/src/workspace/dependency-graph.ts +67 -0
  713. package/src/workspace/detect-pipework-copies.ts +93 -0
  714. package/src/workspace/discover.ts +206 -0
  715. package/src/workspace/generate.ts +401 -0
  716. package/src/workspace/index.ts +7 -0
  717. package/src/workspace/module-imports-pipework.ts +39 -0
  718. package/src/workspace/module-package-name.ts +12 -0
  719. package/src/workspace/scrub-git-env.ts +23 -0
  720. package/src/workspace/source-paths.ts +36 -0
  721. package/src/workspace/sync.ts +182 -0
  722. package/dist/REFERENCE.md +0 -1477
  723. package/dist/infra/access-links/rate-limit.d.ts +0 -10
  724. package/dist/infra/access-links/rate-limit.d.ts.map +0 -1
  725. package/dist/infra/access-links/rate-limit.js +0 -28
  726. package/dist/infra/access-links/rate-limit.js.map +0 -1
  727. package/dist/infra/email/sigv4.d.ts +0 -24
  728. package/dist/infra/email/sigv4.d.ts.map +0 -1
  729. package/dist/infra/email/sigv4.js +0 -55
  730. package/dist/infra/email/sigv4.js.map +0 -1
@@ -0,0 +1,53 @@
1
+ import { sql } from '../../data/db/sql.js'
2
+ import type { DB } from '../../data/db/index.js'
3
+ import type { PipelineConfig, PipelineRun, PipelineExecuteContext } from './types.js'
4
+ import { executeStepsFrom } from './run-steps.js'
5
+
6
+ export async function executePipeline(
7
+ db: DB,
8
+ config: PipelineConfig,
9
+ input: unknown,
10
+ context: PipelineExecuteContext,
11
+ ): Promise<PipelineRun> {
12
+ const [runRow] = await db.execute(sql`
13
+ INSERT INTO pipework_pipeline_runs (pipeline_name, tenant_id, status, current_step, input, metadata)
14
+ VALUES (${config.name}, ${context.tenant}, 'running', 0, ${JSON.stringify(input)}::jsonb, ${JSON.stringify(context.metadata ?? {})}::jsonb)
15
+ RETURNING id, started_at
16
+ `)
17
+
18
+ const runId = String(runRow!['id'])
19
+ const startedAt = new Date(String(runRow!['started_at']))
20
+
21
+ for (let i = 0; i < config.steps.length; i++) {
22
+ const step = config.steps[i]!
23
+
24
+ await db.execute(sql`
25
+ INSERT INTO pipework_pipeline_steps (run_id, step_index, step_name, status)
26
+ VALUES (${runId}::uuid, ${i}, ${step.name}, 'pending')
27
+ `)
28
+ }
29
+
30
+ const result = await executeStepsFrom(
31
+ { db, config, runId, input, startedAt, tenant: context.tenant, metadata: context.metadata ?? {} },
32
+ 0,
33
+ input,
34
+ )
35
+
36
+ if (!result.done) return result.waitingRun
37
+
38
+ await db.execute(sql`
39
+ UPDATE pipework_pipeline_runs SET status = 'completed', completed_at = now()
40
+ WHERE id = ${runId}::uuid
41
+ `)
42
+
43
+ return {
44
+ id: runId,
45
+ pipelineName: config.name,
46
+ status: 'completed',
47
+ currentStep: config.steps.length,
48
+ input,
49
+ startedAt,
50
+ completedAt: new Date(),
51
+ error: null,
52
+ }
53
+ }
@@ -0,0 +1,13 @@
1
+ export { definePipeline } from './define.js'
2
+ export { PipelineStepError, PipelineResumeError } from './errors.js'
3
+ export type {
4
+ PipelineConfig,
5
+ Pipeline,
6
+ PipelineRun,
7
+ PipelineExecuteContext,
8
+ StepDefinition,
9
+ StepContext,
10
+ StepRunResult,
11
+ PipelineStatus,
12
+ StepStatus,
13
+ } from './types.js'
@@ -0,0 +1,12 @@
1
+ import { definePipeline } from './define.js'
2
+ import { PipelineStepError, PipelineResumeError } from './errors.js'
3
+
4
+ /** Multi-step pipeline namespace — define, execute, pause, and resume ordered step sequences. */
5
+ export const pipeline = {
6
+ /** Defines a pipeline from a config of named steps with handlers. Returns a Pipeline with execute/resume/getStatus. */
7
+ define: definePipeline,
8
+ /** Thrown when an individual pipeline step fails. */
9
+ PipelineStepError,
10
+ /** Thrown when resuming a pipeline from an invalid state. */
11
+ PipelineResumeError,
12
+ }
@@ -0,0 +1,67 @@
1
+ import { sql } from '../../data/db/sql.js'
2
+ import type { DB } from '../../data/db/index.js'
3
+ import type { PipelineConfig, PipelineRun } from './types.js'
4
+ import { PipelineResumeError } from './errors.js'
5
+ import { executeStepsFrom } from './run-steps.js'
6
+
7
+ export async function resumePipeline(
8
+ db: DB,
9
+ config: PipelineConfig,
10
+ runId: string,
11
+ stepOutput: unknown,
12
+ ): Promise<PipelineRun> {
13
+ const [runRow] = await db.execute(sql`
14
+ UPDATE pipework_pipeline_runs
15
+ SET status = 'running'
16
+ WHERE id = ${runId}::uuid AND status = 'waiting'
17
+ RETURNING id, current_step, input, tenant_id, metadata, started_at
18
+ `)
19
+
20
+ if (runRow === undefined) {
21
+ const [existingRow] = await db.execute(sql`
22
+ SELECT status FROM pipework_pipeline_runs WHERE id = ${runId}::uuid
23
+ `)
24
+ if (existingRow === undefined) {
25
+ throw new PipelineResumeError(runId, 'Pipeline run not found.')
26
+ }
27
+ throw new PipelineResumeError(
28
+ runId,
29
+ `Expected status "waiting" but found "${String(existingRow['status'])}".`,
30
+ )
31
+ }
32
+
33
+ const currentStep = Number(runRow['current_step'])
34
+ const input = runRow['input']
35
+ const tenant = String(runRow['tenant_id'])
36
+ const metadata = (runRow['metadata'] as Record<string, unknown> | null) ?? {}
37
+ const startedAt = new Date(String(runRow['started_at']))
38
+
39
+ await db.execute(sql`
40
+ UPDATE pipework_pipeline_steps SET status = 'completed', output = ${JSON.stringify(stepOutput ?? null)}::jsonb, completed_at = now()
41
+ WHERE run_id = ${runId}::uuid AND step_index = ${currentStep}
42
+ `)
43
+
44
+ const result = await executeStepsFrom(
45
+ { db, config, runId, input, startedAt, tenant, metadata },
46
+ currentStep + 1,
47
+ stepOutput,
48
+ )
49
+
50
+ if (!result.done) return result.waitingRun
51
+
52
+ await db.execute(sql`
53
+ UPDATE pipework_pipeline_runs SET status = 'completed', current_step = ${config.steps.length}, completed_at = now()
54
+ WHERE id = ${runId}::uuid
55
+ `)
56
+
57
+ return {
58
+ id: runId,
59
+ pipelineName: config.name,
60
+ status: 'completed',
61
+ currentStep: config.steps.length,
62
+ input,
63
+ startedAt,
64
+ completedAt: new Date(),
65
+ error: null,
66
+ }
67
+ }
@@ -0,0 +1,98 @@
1
+ import { sql } from '../../data/db/sql.js'
2
+ import type { DB } from '../../data/db/index.js'
3
+ import type { PipelineConfig, PipelineRun, StepContext } from './types.js'
4
+ import { PipelineStepError } from './errors.js'
5
+
6
+ export interface StepLoopContext {
7
+ readonly db: DB
8
+ readonly config: PipelineConfig
9
+ readonly runId: string
10
+ readonly input: unknown
11
+ readonly startedAt: Date
12
+ readonly tenant: string
13
+ readonly metadata: Record<string, unknown>
14
+ }
15
+
16
+ export type StepLoopResult =
17
+ | { done: true; lastOutput: unknown }
18
+ | { done: false; waitingRun: PipelineRun }
19
+
20
+ export async function executeStepsFrom(
21
+ ctx: StepLoopContext,
22
+ startIndex: number,
23
+ initialOutput: unknown,
24
+ ): Promise<StepLoopResult> {
25
+ const { db, config, runId, input, startedAt, tenant, metadata } = ctx
26
+ let lastOutput: unknown = initialOutput
27
+
28
+ for (let i = startIndex; i < config.steps.length; i++) {
29
+ const step = config.steps[i]!
30
+
31
+ if (step.async === true) {
32
+ await db.execute(sql`
33
+ UPDATE pipework_pipeline_runs SET status = 'waiting', current_step = ${i}
34
+ WHERE id = ${runId}::uuid
35
+ `)
36
+
37
+ return {
38
+ done: false,
39
+ waitingRun: {
40
+ id: runId,
41
+ pipelineName: config.name,
42
+ status: 'waiting',
43
+ currentStep: i,
44
+ input,
45
+ startedAt,
46
+ completedAt: null,
47
+ error: null,
48
+ },
49
+ }
50
+ }
51
+
52
+ await db.execute(sql`
53
+ UPDATE pipework_pipeline_steps SET status = 'running', started_at = now()
54
+ WHERE run_id = ${runId}::uuid AND step_index = ${i}
55
+ `)
56
+
57
+ try {
58
+ const stepCtx: StepContext = {
59
+ db,
60
+ input: lastOutput,
61
+ runId,
62
+ stepIndex: i,
63
+ tenant,
64
+ metadata,
65
+ }
66
+
67
+ lastOutput = await step.handler(stepCtx)
68
+
69
+ await db.execute(sql`
70
+ UPDATE pipework_pipeline_steps SET status = 'completed', output = ${JSON.stringify(lastOutput ?? null)}::jsonb, completed_at = now()
71
+ WHERE run_id = ${runId}::uuid AND step_index = ${i}
72
+ `)
73
+
74
+ await db.execute(sql`
75
+ UPDATE pipework_pipeline_runs SET current_step = ${i + 1}
76
+ WHERE id = ${runId}::uuid
77
+ `)
78
+ } catch (error) {
79
+ const errorJson = error instanceof Error
80
+ ? { message: error.message, stack: error.stack }
81
+ : { message: String(error) }
82
+
83
+ await db.execute(sql`
84
+ UPDATE pipework_pipeline_steps SET status = 'failed', error = ${JSON.stringify(errorJson)}::jsonb, completed_at = now()
85
+ WHERE run_id = ${runId}::uuid AND step_index = ${i}
86
+ `)
87
+
88
+ await db.execute(sql`
89
+ UPDATE pipework_pipeline_runs SET status = 'failed', error = ${JSON.stringify(errorJson)}::jsonb, completed_at = now()
90
+ WHERE id = ${runId}::uuid
91
+ `)
92
+
93
+ throw new PipelineStepError(config.name, step.name, i, error)
94
+ }
95
+ }
96
+
97
+ return { done: true, lastOutput }
98
+ }
@@ -0,0 +1,57 @@
1
+ import type { DB } from '../../data/db/index.js'
2
+
3
+ export interface StepDefinition<TInput = unknown, TOutput = unknown> {
4
+ readonly name: string
5
+ readonly async?: boolean
6
+ readonly handler: (ctx: StepContext<TInput>) => Promise<TOutput>
7
+ }
8
+
9
+ export interface StepContext<TInput = unknown> {
10
+ readonly db: DB
11
+ readonly input: TInput
12
+ readonly runId: string
13
+ readonly stepIndex: number
14
+ readonly tenant: string
15
+ readonly metadata: Record<string, unknown>
16
+ }
17
+
18
+ export interface PipelineConfig {
19
+ readonly name: string
20
+ readonly database: string
21
+ readonly steps: readonly StepDefinition[]
22
+ }
23
+
24
+ export type PipelineStatus = 'running' | 'waiting' | 'completed' | 'failed'
25
+ export type StepStatus = 'pending' | 'running' | 'completed' | 'failed'
26
+
27
+ export interface PipelineRun {
28
+ readonly id: string
29
+ readonly pipelineName: string
30
+ readonly status: PipelineStatus
31
+ readonly currentStep: number
32
+ readonly input: unknown
33
+ readonly startedAt: Date
34
+ readonly completedAt: Date | null
35
+ readonly error: unknown | null
36
+ }
37
+
38
+ export interface StepRunResult {
39
+ readonly stepName: string
40
+ readonly status: StepStatus
41
+ readonly output: unknown | null
42
+ readonly startedAt: Date | null
43
+ readonly completedAt: Date | null
44
+ readonly error: unknown | null
45
+ }
46
+
47
+ export interface PipelineExecuteContext {
48
+ readonly tenant: string
49
+ readonly metadata?: Record<string, unknown>
50
+ }
51
+
52
+ export interface Pipeline {
53
+ execute(db: DB, input: unknown, context: PipelineExecuteContext): Promise<PipelineRun>
54
+ resume(db: DB, runId: string, stepOutput: unknown): Promise<PipelineRun>
55
+ getStatus(db: DB, runId: string): Promise<PipelineRun | null>
56
+ readonly definition: PipelineConfig
57
+ }
@@ -0,0 +1,64 @@
1
+ import type { StateMachineConfig, StateMachine, TransitionContext, TransitionResult } from './types.js'
2
+ import { InvalidStateMachineError } from './errors.js'
3
+ import { buildTransitionMap, getValidTargets, attemptTransition, evaluateGuard } from './transition.js'
4
+
5
+ export function defineStateMachine(config: StateMachineConfig): StateMachine {
6
+ validate(config)
7
+
8
+ const transitionMap = buildTransitionMap(config.transitions)
9
+
10
+ return {
11
+ validTargets(from: string): readonly string[] {
12
+ return getValidTargets(transitionMap, from)
13
+ },
14
+
15
+ hasTransition(from: string, to: string): boolean {
16
+ return getValidTargets(transitionMap, from).includes(to)
17
+ },
18
+
19
+ async canTransition(context: TransitionContext): Promise<boolean> {
20
+ return evaluateGuard(transitionMap, context)
21
+ },
22
+
23
+ async transition(context: TransitionContext): Promise<TransitionResult> {
24
+ return attemptTransition(context, transitionMap)
25
+ },
26
+
27
+ definition: config,
28
+ }
29
+ }
30
+
31
+ function validate(config: StateMachineConfig): void {
32
+ if (config.states.length === 0) {
33
+ throw new InvalidStateMachineError('Must define at least one state.')
34
+ }
35
+
36
+ const stateSet = new Set(config.states)
37
+
38
+ if (stateSet.size !== config.states.length) {
39
+ const dupes = config.states.filter((s, i) => config.states.indexOf(s) !== i)
40
+ throw new InvalidStateMachineError(`Duplicate states: ${dupes.join(', ')}.`)
41
+ }
42
+
43
+ if (config.initial !== undefined && !stateSet.has(config.initial)) {
44
+ throw new InvalidStateMachineError(
45
+ `Initial state "${config.initial}" is not in the states list.`,
46
+ )
47
+ }
48
+
49
+ for (const t of config.transitions) {
50
+ if (!stateSet.has(t.from)) {
51
+ throw new InvalidStateMachineError(
52
+ `Transition references unknown source state "${t.from}".`,
53
+ )
54
+ }
55
+ const targets = typeof t.to === 'string' ? [t.to] : t.to
56
+ for (const target of targets) {
57
+ if (!stateSet.has(target)) {
58
+ throw new InvalidStateMachineError(
59
+ `Transition from "${t.from}" references unknown target state "${target}".`,
60
+ )
61
+ }
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,29 @@
1
+ import { PipeworkError } from '../../core/errors/base.js'
2
+
3
+ export class InvalidTransitionError extends PipeworkError {
4
+ readonly code = 'INVALID_TRANSITION' as const
5
+ readonly httpStatus = 409 as const
6
+
7
+ constructor(
8
+ entityType: string,
9
+ from: string,
10
+ to: string,
11
+ validTargets: readonly string[],
12
+ ) {
13
+ const targets = validTargets.length > 0
14
+ ? `Valid targets from "${from}": ${validTargets.join(', ')}.`
15
+ : `No transitions defined from "${from}".`
16
+ super(
17
+ `Cannot transition ${entityType} from "${from}" to "${to}". ${targets}`,
18
+ )
19
+ }
20
+ }
21
+
22
+ export class InvalidStateMachineError extends PipeworkError {
23
+ readonly code = 'INVALID_STATE_MACHINE' as const
24
+ readonly httpStatus = 500 as const
25
+
26
+ constructor(message: string) {
27
+ super(`[pipework] Invalid state machine definition: ${message}`)
28
+ }
29
+ }
@@ -0,0 +1,3 @@
1
+ export { defineStateMachine } from './define.js'
2
+ export { InvalidTransitionError, InvalidStateMachineError } from './errors.js'
3
+ export type { StateMachineConfig, TransitionDef, TransitionContext, TransitionResult, StateMachine } from './types.js'
@@ -0,0 +1,12 @@
1
+ import { defineStateMachine } from './define.js'
2
+ import { InvalidTransitionError, InvalidStateMachineError } from './errors.js'
3
+
4
+ /** State machine namespace — define valid transitions with guards and side effects. */
5
+ export const state = {
6
+ /** Defines a state machine from states, transitions, guards, and effects. Returns a StateMachine with transition/canTransition. */
7
+ define: defineStateMachine,
8
+ /** Thrown when a transition is not allowed from the current state. */
9
+ InvalidTransitionError,
10
+ /** Thrown when the state machine definition is internally inconsistent. */
11
+ InvalidStateMachineError,
12
+ }
@@ -0,0 +1,90 @@
1
+ import type { TransitionDef, TransitionContext, TransitionResult } from './types.js'
2
+ import { InvalidTransitionError } from './errors.js'
3
+
4
+ export function buildTransitionMap(transitions: readonly TransitionDef[]): Map<string, TransitionDef[]> {
5
+ const map = new Map<string, TransitionDef[]>()
6
+ for (const t of transitions) {
7
+ const existing = map.get(t.from) ?? []
8
+ existing.push(t)
9
+ map.set(t.from, existing)
10
+ }
11
+ return map
12
+ }
13
+
14
+ export function getValidTargets(transitionMap: Map<string, TransitionDef[]>, from: string): string[] {
15
+ const defs = transitionMap.get(from) ?? []
16
+ const targets: string[] = []
17
+ for (const def of defs) {
18
+ if (typeof def.to === 'string') {
19
+ targets.push(def.to)
20
+ } else {
21
+ targets.push(...def.to)
22
+ }
23
+ }
24
+ return targets
25
+ }
26
+
27
+ export function findMatchingDef(
28
+ transitionMap: Map<string, TransitionDef[]>,
29
+ from: string,
30
+ to: string,
31
+ ): TransitionDef | undefined {
32
+ const defs = transitionMap.get(from) ?? []
33
+ return defs.find(d =>
34
+ typeof d.to === 'string' ? d.to === to : d.to.includes(to),
35
+ )
36
+ }
37
+
38
+ export async function evaluateGuard(
39
+ transitionMap: Map<string, TransitionDef[]>,
40
+ context: TransitionContext,
41
+ ): Promise<boolean> {
42
+ const validTargets = getValidTargets(transitionMap, context.from)
43
+ if (!validTargets.includes(context.to)) {
44
+ return false
45
+ }
46
+
47
+ const matchingDef = findMatchingDef(transitionMap, context.from, context.to)
48
+
49
+ if (matchingDef?.guard !== undefined) {
50
+ return matchingDef.guard(context)
51
+ }
52
+
53
+ return true
54
+ }
55
+
56
+ export async function attemptTransition(
57
+ context: TransitionContext,
58
+ transitionMap: Map<string, TransitionDef[]>,
59
+ ): Promise<TransitionResult> {
60
+ const validTargets = getValidTargets(transitionMap, context.from)
61
+
62
+ if (!validTargets.includes(context.to)) {
63
+ throw new InvalidTransitionError(
64
+ context.entityType,
65
+ context.from,
66
+ context.to,
67
+ validTargets,
68
+ )
69
+ }
70
+
71
+ const matchingDef = findMatchingDef(transitionMap, context.from, context.to)
72
+
73
+ if (matchingDef?.guard !== undefined) {
74
+ const allowed = await matchingDef.guard(context)
75
+ if (!allowed) {
76
+ throw new InvalidTransitionError(
77
+ context.entityType,
78
+ context.from,
79
+ context.to,
80
+ validTargets,
81
+ )
82
+ }
83
+ }
84
+
85
+ return {
86
+ from: context.from,
87
+ to: context.to,
88
+ entityId: context.entityId,
89
+ }
90
+ }
@@ -0,0 +1,37 @@
1
+ import type { Audit } from '../../infra/audit/types.js'
2
+
3
+ export interface TransitionDef {
4
+ readonly from: string
5
+ readonly to: string | readonly string[]
6
+ readonly guard?: (context: TransitionContext) => boolean | Promise<boolean>
7
+ }
8
+
9
+ export interface StateMachineConfig {
10
+ readonly states: readonly string[]
11
+ readonly transitions: readonly TransitionDef[]
12
+ readonly initial?: string
13
+ readonly audit?: Audit
14
+ }
15
+
16
+ export interface TransitionContext {
17
+ readonly entityId: string
18
+ readonly entityType: string
19
+ readonly from: string
20
+ readonly to: string
21
+ readonly userId?: string
22
+ readonly metadata?: Record<string, unknown>
23
+ }
24
+
25
+ export interface TransitionResult {
26
+ readonly from: string
27
+ readonly to: string
28
+ readonly entityId: string
29
+ }
30
+
31
+ export interface StateMachine {
32
+ validTargets(from: string): readonly string[]
33
+ hasTransition(from: string, to: string): boolean
34
+ canTransition(context: TransitionContext): Promise<boolean>
35
+ transition(context: TransitionContext): Promise<TransitionResult>
36
+ readonly definition: StateMachineConfig
37
+ }
@@ -0,0 +1,31 @@
1
+ import { PipeworkError } from '../../core/errors/base.js'
2
+
3
+ /** The reason a step's `signal` aborts with, and what the try fails with, when one try exceeds the step's `timeoutMs`. */
4
+ export class StepTimeoutError extends PipeworkError {
5
+ readonly code = 'STEP_TIMEOUT' as const
6
+ readonly httpStatus = 504 as const
7
+
8
+ constructor(graph: string, step: string, timeoutMs: number) {
9
+ super(
10
+ `[pipework] ${graph}: step "${step}" timed out after ${timeoutMs}ms.\n\n` +
11
+ ' One try of the step did not finish within its timeoutMs. Raise timeoutMs on the step if the work legitimately takes longer.\n',
12
+ { graph, step, timeoutMs },
13
+ )
14
+ this.name = 'StepTimeoutError'
15
+ }
16
+ }
17
+
18
+ /** Thrown by `removeItem` when a run for the item is still in progress and `running: 'cancel'` was not passed. */
19
+ export class StepItemRunningError extends PipeworkError {
20
+ readonly code = 'STEP_ITEM_RUNNING' as const
21
+ readonly httpStatus = 409 as const
22
+
23
+ constructor(graph: string, item: string, runIds: readonly string[]) {
24
+ super(
25
+ `[pipework] ${graph}.removeItem: item "${item}" has ${runIds.length} run(s) in progress (${runIds.join(', ')}).\n\n` +
26
+ " Nothing was deleted. Pass { running: 'cancel' } to cancel them and delete, or wait for them to finish.\n",
27
+ { graph, item, runIds },
28
+ )
29
+ this.name = 'StepItemRunningError'
30
+ }
31
+ }