pipework 0.252.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 (690) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/package.json +4 -3
  3. package/src/async/jobs/abortable-delay.ts +18 -0
  4. package/src/async/jobs/claims.ts +52 -0
  5. package/src/async/jobs/cron.ts +179 -0
  6. package/src/async/jobs/errors.ts +56 -0
  7. package/src/async/jobs/exclusion.ts +117 -0
  8. package/src/async/jobs/execute.ts +219 -0
  9. package/src/async/jobs/index.ts +10 -0
  10. package/src/async/jobs/listener.ts +135 -0
  11. package/src/async/jobs/namespace.ts +20 -0
  12. package/src/async/jobs/queue-door.ts +44 -0
  13. package/src/async/jobs/queue.ts +1012 -0
  14. package/src/async/jobs/run-script.ts +67 -0
  15. package/src/async/jobs/scheduler.ts +218 -0
  16. package/src/async/jobs/schedules-table.ts +37 -0
  17. package/src/async/jobs/serialize-error.ts +48 -0
  18. package/src/async/jobs/table.ts +191 -0
  19. package/src/async/pipeline/define.ts +53 -0
  20. package/src/async/pipeline/errors.ts +35 -0
  21. package/src/async/pipeline/execute.ts +53 -0
  22. package/src/async/pipeline/index.ts +13 -0
  23. package/src/async/pipeline/namespace.ts +12 -0
  24. package/src/async/pipeline/resume.ts +67 -0
  25. package/src/async/pipeline/run-steps.ts +98 -0
  26. package/src/async/pipeline/types.ts +57 -0
  27. package/src/async/state-machine/define.ts +64 -0
  28. package/src/async/state-machine/errors.ts +29 -0
  29. package/src/async/state-machine/index.ts +3 -0
  30. package/src/async/state-machine/namespace.ts +12 -0
  31. package/src/async/state-machine/transition.ts +90 -0
  32. package/src/async/state-machine/types.ts +37 -0
  33. package/src/async/steps/errors.ts +31 -0
  34. package/src/async/steps/graph.ts +1214 -0
  35. package/src/async/steps/hash.ts +40 -0
  36. package/src/async/steps/index.ts +7 -0
  37. package/src/async/steps/namespace.ts +7 -0
  38. package/src/async/steps/table.ts +97 -0
  39. package/src/async/steps/types.ts +318 -0
  40. package/src/audit/chain/index.ts +9 -0
  41. package/src/audit/chain/install.ts +113 -0
  42. package/src/audit/chain/retire.ts +52 -0
  43. package/src/audit/chain/verify.ts +257 -0
  44. package/src/audit/query/cursor.ts +37 -0
  45. package/src/audit/query/index.ts +9 -0
  46. package/src/audit/query/query.ts +223 -0
  47. package/src/audit/schema/audit-record-fields.ts +68 -0
  48. package/src/audit/schema/audit-record.ts +23 -0
  49. package/src/auth/auth/audit.ts +31 -0
  50. package/src/auth/auth/chain.ts +84 -0
  51. package/src/auth/auth/cookie.ts +136 -0
  52. package/src/auth/auth/email-links.ts +311 -0
  53. package/src/auth/auth/guard.ts +128 -0
  54. package/src/auth/auth/index.ts +18 -0
  55. package/src/auth/auth/multi-org.ts +337 -0
  56. package/src/auth/auth/namespace.ts +34 -0
  57. package/src/auth/auth/parse-expiry.ts +13 -0
  58. package/src/auth/auth/passwords.ts +110 -0
  59. package/src/auth/auth/schema.ts +110 -0
  60. package/src/auth/auth/sessions.ts +565 -0
  61. package/src/auth/auth/sign-in.ts +156 -0
  62. package/src/auth/auth/signing-keys.ts +69 -0
  63. package/src/auth/auth/types.ts +26 -0
  64. package/src/auth/auth/uuid.ts +10 -0
  65. package/src/auth/rbac/cache.ts +55 -0
  66. package/src/auth/rbac/check.ts +30 -0
  67. package/src/auth/rbac/create.ts +35 -0
  68. package/src/auth/rbac/index.ts +5 -0
  69. package/src/auth/rbac/middleware.ts +20 -0
  70. package/src/auth/rbac/namespace.ts +15 -0
  71. package/src/auth/rbac/resolve.ts +31 -0
  72. package/src/auth/rbac/schema.sql +31 -0
  73. package/src/auth/rbac/seed.ts +67 -0
  74. package/src/auth/rbac/tables.ts +32 -0
  75. package/src/auth/rbac/types.ts +65 -0
  76. package/src/auth/tenant/extract.ts +33 -0
  77. package/src/auth/tenant/in-tenant.ts +49 -0
  78. package/src/auth/tenant/index.ts +7 -0
  79. package/src/auth/tenant/namespace.ts +23 -0
  80. package/src/auth/tenant/propagate.ts +20 -0
  81. package/src/auth/tenant/rls.ts +120 -0
  82. package/src/auth/tenant/scope.ts +33 -0
  83. package/src/auth/tenant/scoped-db.ts +581 -0
  84. package/src/auth/tenant/types.ts +14 -0
  85. package/src/auth/tenant/validate.ts +27 -0
  86. package/src/cli/commands/add.ts +158 -0
  87. package/src/cli/commands/alerts.ts +98 -0
  88. package/src/cli/commands/check.ts +1418 -0
  89. package/src/cli/commands/codemod.ts +78 -0
  90. package/src/cli/commands/db.ts +356 -0
  91. package/src/cli/commands/dev.ts +101 -0
  92. package/src/cli/commands/generate.ts +75 -0
  93. package/src/cli/commands/init.ts +36 -0
  94. package/src/cli/commands/install.ts +28 -0
  95. package/src/cli/commands/lint.ts +62 -0
  96. package/src/cli/commands/migrate.ts +132 -0
  97. package/src/cli/commands/openapi.ts +63 -0
  98. package/src/cli/commands/remove.ts +72 -0
  99. package/src/cli/commands/run.ts +50 -0
  100. package/src/cli/commands/scope.ts +54 -0
  101. package/src/cli/commands/serve.ts +68 -0
  102. package/src/cli/commands/shard.ts +31 -0
  103. package/src/cli/commands/shared/config-pipework-version.ts +28 -0
  104. package/src/cli/commands/shared/find-config.ts +22 -0
  105. package/src/cli/commands/shared/load-config.ts +35 -0
  106. package/src/cli/commands/shared/pnpm-install.ts +95 -0
  107. package/src/cli/commands/shared/report-removed.ts +8 -0
  108. package/src/cli/commands/sync.ts +32 -0
  109. package/src/cli/commands/test.ts +307 -0
  110. package/src/cli/commands/upgrade.ts +48 -0
  111. package/src/cli/dev-bootstrap.ts +24 -0
  112. package/src/cli/errors.ts +10 -0
  113. package/src/cli/index.ts +303 -0
  114. package/src/cli/output.ts +17 -0
  115. package/src/cli/port.ts +15 -0
  116. package/src/cli/surface-kinds.ts +20 -0
  117. package/src/client/index.ts +4 -0
  118. package/src/client/poll.ts +130 -0
  119. package/src/client/report-fault.ts +119 -0
  120. package/src/core/config/app-pool.ts +19 -0
  121. package/src/core/config/aws-env.ts +29 -0
  122. package/src/core/config/base-dir.ts +24 -0
  123. package/src/core/config/discover.ts +64 -0
  124. package/src/core/config/env-resolve.ts +87 -0
  125. package/src/core/config/env-types.ts +116 -0
  126. package/src/core/config/env.ts +55 -0
  127. package/src/core/config/errors.ts +9 -0
  128. package/src/core/config/import-config.ts +40 -0
  129. package/src/core/config/index.ts +8 -0
  130. package/src/core/config/load.ts +417 -0
  131. package/src/core/config/namespace.ts +14 -0
  132. package/src/core/config/resolve.ts +195 -0
  133. package/src/core/config/schema.ts +488 -0
  134. package/src/core/config/statement-observer.ts +48 -0
  135. package/src/core/config/ts-inline-hooks.ts +75 -0
  136. package/src/core/config/ts-register.ts +4 -0
  137. package/src/core/config/ts-resolve-hooks.ts +101 -0
  138. package/src/core/errors/base.ts +49 -0
  139. package/src/core/errors/http.ts +146 -0
  140. package/src/core/errors/index.ts +2 -0
  141. package/src/core/errors/namespace.ts +31 -0
  142. package/src/core/lifecycle/drain.ts +33 -0
  143. package/src/core/lifecycle/health.ts +72 -0
  144. package/src/core/lifecycle/index.ts +4 -0
  145. package/src/core/lifecycle/namespace.ts +7 -0
  146. package/src/core/lifecycle/startup.ts +102 -0
  147. package/src/core/lifecycle/types.ts +36 -0
  148. package/src/core/logging/context.ts +60 -0
  149. package/src/core/logging/error-chain.ts +68 -0
  150. package/src/core/logging/index.ts +5 -0
  151. package/src/core/logging/logger.ts +65 -0
  152. package/src/core/logging/namespace.ts +16 -0
  153. package/src/core/logging/proxy.ts +22 -0
  154. package/src/core/logging/redact-match.ts +24 -0
  155. package/src/core/logging/types.ts +47 -0
  156. package/src/core/pipework.ts +566 -0
  157. package/src/core/runtime/broker.ts +69 -0
  158. package/src/core/surface/http.ts +133 -0
  159. package/src/core/surface/index.ts +11 -0
  160. package/src/core/surface/job-timeout.ts +40 -0
  161. package/src/core/surface/namespace.ts +13 -0
  162. package/src/core/surface/script.ts +33 -0
  163. package/src/core/surface/start.ts +142 -0
  164. package/src/core/surface/types.ts +225 -0
  165. package/src/core/surface/validate.ts +88 -0
  166. package/src/core/surface/worker.ts +528 -0
  167. package/src/core/validation/connectivity.ts +49 -0
  168. package/src/core/validation/domain.ts +99 -0
  169. package/src/core/validation/index.ts +5 -0
  170. package/src/core/validation/queue-tables.ts +312 -0
  171. package/src/core/validation/rls-role.ts +138 -0
  172. package/src/core/validation/startup.ts +51 -0
  173. package/src/core/validation/surfaces.ts +65 -0
  174. package/src/core/validation/types.ts +25 -0
  175. package/src/data/db/advisory-lock.ts +55 -0
  176. package/src/data/db/aggregates.ts +172 -0
  177. package/src/data/db/array-elements.ts +111 -0
  178. package/src/data/db/bulk-set.ts +53 -0
  179. package/src/data/db/col/index.ts +14 -0
  180. package/src/data/db/composed.ts +53 -0
  181. package/src/data/db/db.ts +276 -0
  182. package/src/data/db/excluded.ts +16 -0
  183. package/src/data/db/expressions.ts +473 -0
  184. package/src/data/db/filter.ts +90 -0
  185. package/src/data/db/function-source.ts +114 -0
  186. package/src/data/db/identifiers.ts +16 -0
  187. package/src/data/db/idx/index.ts +9 -0
  188. package/src/data/db/in-list.ts +49 -0
  189. package/src/data/db/index.ts +9 -0
  190. package/src/data/db/insert-split.ts +137 -0
  191. package/src/data/db/instrumentation.ts +82 -0
  192. package/src/data/db/maintenance.ts +28 -0
  193. package/src/data/db/namespace.ts +107 -0
  194. package/src/data/db/owner-labels.ts +9 -0
  195. package/src/data/db/pool.ts +187 -0
  196. package/src/data/db/query-label.ts +13 -0
  197. package/src/data/db/query-watch.ts +116 -0
  198. package/src/data/db/raw-client-warning.ts +37 -0
  199. package/src/data/db/readonly.ts +23 -0
  200. package/src/data/db/reservation.ts +151 -0
  201. package/src/data/db/schema-features.ts +14 -0
  202. package/src/data/db/serializable.ts +83 -0
  203. package/src/data/db/sql.ts +1 -0
  204. package/src/data/db/timeouts.ts +76 -0
  205. package/src/data/db/types.ts +18 -0
  206. package/src/data/db/unbound.ts +33 -0
  207. package/src/data/db/values.ts +29 -0
  208. package/src/data/domain/brand.ts +15 -0
  209. package/src/data/domain/build-factory.ts +193 -0
  210. package/src/data/domain/build-schema.ts +161 -0
  211. package/src/data/domain/build-table.ts +355 -0
  212. package/src/data/domain/define.ts +239 -0
  213. package/src/data/domain/external-registry.ts +34 -0
  214. package/src/data/domain/external.ts +77 -0
  215. package/src/data/domain/field.ts +279 -0
  216. package/src/data/domain/index.ts +13 -0
  217. package/src/data/domain/naming.ts +6 -0
  218. package/src/data/domain/projections.ts +57 -0
  219. package/src/data/domain/trace-safe-projection.ts +31 -0
  220. package/src/data/domain/traits.ts +108 -0
  221. package/src/data/domain/types.ts +289 -0
  222. package/src/data/jsonb/composed.ts +18 -0
  223. package/src/data/jsonb/index.ts +1 -0
  224. package/src/data/jsonb/namespace.ts +30 -0
  225. package/src/data/jsonb/query.ts +86 -0
  226. package/src/data/migrate/append-only-generate.ts +47 -0
  227. package/src/data/migrate/applied.ts +47 -0
  228. package/src/data/migrate/apply.ts +309 -0
  229. package/src/data/migrate/check.ts +119 -0
  230. package/src/data/migrate/diff.ts +357 -0
  231. package/src/data/migrate/door-generate.ts +130 -0
  232. package/src/data/migrate/framework-rls.ts +58 -0
  233. package/src/data/migrate/generate.ts +201 -0
  234. package/src/data/migrate/history.ts +215 -0
  235. package/src/data/migrate/index.ts +9 -0
  236. package/src/data/migrate/internal-definitions.ts +175 -0
  237. package/src/data/migrate/post-process.ts +73 -0
  238. package/src/data/migrate/pragma.ts +73 -0
  239. package/src/data/migrate/provision-framework.ts +147 -0
  240. package/src/data/migrate/rls-generate.ts +61 -0
  241. package/src/data/migrate/run.ts +124 -0
  242. package/src/data/migrate/safety.ts +167 -0
  243. package/src/data/migrate/snapshot.ts +368 -0
  244. package/src/data/migrate/sql-emit.ts +392 -0
  245. package/src/data/migrate/statements.ts +312 -0
  246. package/src/data/query/alias.ts +126 -0
  247. package/src/data/query/batch.ts +8 -0
  248. package/src/data/query/cache/core/cache.ts +78 -0
  249. package/src/data/query/cache/core/index.ts +1 -0
  250. package/src/data/query/cache/core/types.ts +29 -0
  251. package/src/data/query/cache/readme.md +230 -0
  252. package/src/data/query/casing.ts +76 -0
  253. package/src/data/query/collation.ts +11 -0
  254. package/src/data/query/column-builder.ts +370 -0
  255. package/src/data/query/column.ts +150 -0
  256. package/src/data/query/entity.ts +42 -0
  257. package/src/data/query/errors.ts +33 -0
  258. package/src/data/query/index.ts +14 -0
  259. package/src/data/query/logger.ts +47 -0
  260. package/src/data/query/operations.ts +45 -0
  261. package/src/data/query/pg-core/alias.ts +12 -0
  262. package/src/data/query/pg-core/checks.ts +32 -0
  263. package/src/data/query/pg-core/columns/all.ts +71 -0
  264. package/src/data/query/pg-core/columns/bigint.ts +110 -0
  265. package/src/data/query/pg-core/columns/bigserial.ts +128 -0
  266. package/src/data/query/pg-core/columns/boolean.ts +43 -0
  267. package/src/data/query/pg-core/columns/char.ts +85 -0
  268. package/src/data/query/pg-core/columns/cidr.ts +43 -0
  269. package/src/data/query/pg-core/columns/common.ts +366 -0
  270. package/src/data/query/pg-core/columns/custom.ts +232 -0
  271. package/src/data/query/pg-core/columns/date.common.ts +15 -0
  272. package/src/data/query/pg-core/columns/date.ts +112 -0
  273. package/src/data/query/pg-core/columns/double-precision.ts +55 -0
  274. package/src/data/query/pg-core/columns/enum.ts +201 -0
  275. package/src/data/query/pg-core/columns/index.ts +35 -0
  276. package/src/data/query/pg-core/columns/inet.ts +43 -0
  277. package/src/data/query/pg-core/columns/int.common.ts +57 -0
  278. package/src/data/query/pg-core/columns/integer.ts +53 -0
  279. package/src/data/query/pg-core/columns/interval.ts +83 -0
  280. package/src/data/query/pg-core/columns/json.ts +58 -0
  281. package/src/data/query/pg-core/columns/jsonb.ts +56 -0
  282. package/src/data/query/pg-core/columns/line.ts +117 -0
  283. package/src/data/query/pg-core/columns/macaddr.ts +43 -0
  284. package/src/data/query/pg-core/columns/macaddr8.ts +43 -0
  285. package/src/data/query/pg-core/columns/numeric.ts +227 -0
  286. package/src/data/query/pg-core/columns/point.ts +127 -0
  287. package/src/data/query/pg-core/columns/postgis_extension/geometry.ts +119 -0
  288. package/src/data/query/pg-core/columns/postgis_extension/utils.ts +47 -0
  289. package/src/data/query/pg-core/columns/real.ts +58 -0
  290. package/src/data/query/pg-core/columns/serial.ts +55 -0
  291. package/src/data/query/pg-core/columns/smallint.ts +53 -0
  292. package/src/data/query/pg-core/columns/smallserial.ts +60 -0
  293. package/src/data/query/pg-core/columns/text.ts +67 -0
  294. package/src/data/query/pg-core/columns/time.ts +72 -0
  295. package/src/data/query/pg-core/columns/timestamp.ts +163 -0
  296. package/src/data/query/pg-core/columns/uuid.ts +51 -0
  297. package/src/data/query/pg-core/columns/varchar.ts +89 -0
  298. package/src/data/query/pg-core/columns/vector_extension/bit.ts +68 -0
  299. package/src/data/query/pg-core/columns/vector_extension/halfvec.ts +80 -0
  300. package/src/data/query/pg-core/columns/vector_extension/sparsevec.ts +67 -0
  301. package/src/data/query/pg-core/columns/vector_extension/vector.ts +80 -0
  302. package/src/data/query/pg-core/db.ts +674 -0
  303. package/src/data/query/pg-core/dialect.ts +1404 -0
  304. package/src/data/query/pg-core/expressions.ts +25 -0
  305. package/src/data/query/pg-core/foreign-keys.ts +130 -0
  306. package/src/data/query/pg-core/index.ts +21 -0
  307. package/src/data/query/pg-core/indexes.ts +276 -0
  308. package/src/data/query/pg-core/policies.ts +56 -0
  309. package/src/data/query/pg-core/primary-keys.ts +62 -0
  310. package/src/data/query/pg-core/query-builders/count.ts +86 -0
  311. package/src/data/query/pg-core/query-builders/delete.ts +293 -0
  312. package/src/data/query/pg-core/query-builders/index.ts +7 -0
  313. package/src/data/query/pg-core/query-builders/insert.ts +452 -0
  314. package/src/data/query/pg-core/query-builders/query-builder.ts +123 -0
  315. package/src/data/query/pg-core/query-builders/query.ts +157 -0
  316. package/src/data/query/pg-core/query-builders/raw.ts +49 -0
  317. package/src/data/query/pg-core/query-builders/refresh-materialized-view.ts +108 -0
  318. package/src/data/query/pg-core/query-builders/select.ts +1346 -0
  319. package/src/data/query/pg-core/query-builders/select.types.ts +437 -0
  320. package/src/data/query/pg-core/query-builders/update.ts +626 -0
  321. package/src/data/query/pg-core/roles.ts +41 -0
  322. package/src/data/query/pg-core/schema.ts +72 -0
  323. package/src/data/query/pg-core/sequence.ts +41 -0
  324. package/src/data/query/pg-core/session.ts +292 -0
  325. package/src/data/query/pg-core/subquery.ts +46 -0
  326. package/src/data/query/pg-core/table.ts +252 -0
  327. package/src/data/query/pg-core/unique-constraint.ts +73 -0
  328. package/src/data/query/pg-core/utils/array.ts +95 -0
  329. package/src/data/query/pg-core/utils/index.ts +1 -0
  330. package/src/data/query/pg-core/utils.ts +104 -0
  331. package/src/data/query/pg-core/view-base.ts +14 -0
  332. package/src/data/query/pg-core/view-common.ts +1 -0
  333. package/src/data/query/pg-core/view.ts +435 -0
  334. package/src/data/query/pg-core/with-builder.ts +41 -0
  335. package/src/data/query/postgres-js/README.md +46 -0
  336. package/src/data/query/postgres-js/array-parser.ts +45 -0
  337. package/src/data/query/postgres-js/driver-error-boundary.ts +149 -0
  338. package/src/data/query/postgres-js/driver.ts +163 -0
  339. package/src/data/query/postgres-js/index.ts +2 -0
  340. package/src/data/query/postgres-js/session.ts +234 -0
  341. package/src/data/query/primary-key.ts +11 -0
  342. package/src/data/query/query-builders/query-builder.ts +19 -0
  343. package/src/data/query/query-builders/select.types.ts +175 -0
  344. package/src/data/query/query-promise.ts +35 -0
  345. package/src/data/query/relations.ts +725 -0
  346. package/src/data/query/runnable-query.ts +12 -0
  347. package/src/data/query/selection-proxy.ts +121 -0
  348. package/src/data/query/session.ts +8 -0
  349. package/src/data/query/sql/expressions/conditions.ts +741 -0
  350. package/src/data/query/sql/expressions/index.ts +2 -0
  351. package/src/data/query/sql/expressions/select.ts +45 -0
  352. package/src/data/query/sql/functions/aggregate.ts +129 -0
  353. package/src/data/query/sql/functions/index.ts +2 -0
  354. package/src/data/query/sql/functions/vector.ts +178 -0
  355. package/src/data/query/sql/index.ts +3 -0
  356. package/src/data/query/sql/sql.ts +794 -0
  357. package/src/data/query/subquery.ts +53 -0
  358. package/src/data/query/table.ts +208 -0
  359. package/src/data/query/table.utils.ts +2 -0
  360. package/src/data/query/tracing-utils.ts +3 -0
  361. package/src/data/query/tracing.ts +11 -0
  362. package/src/data/query/utils.ts +357 -0
  363. package/src/data/query/version.ts +4 -0
  364. package/src/data/query/view-common.ts +1 -0
  365. package/src/data/schema/branded.ts +13 -0
  366. package/src/data/schema/generated/coerce.ts +5 -0
  367. package/src/data/schema/generated/combinator.ts +6 -0
  368. package/src/data/schema/generated/encoding.ts +5 -0
  369. package/src/data/schema/generated/error.ts +6 -0
  370. package/src/data/schema/generated/format.ts +5 -0
  371. package/src/data/schema/generated/type-constructor.ts +10 -0
  372. package/src/data/schema/generated/type.ts +6 -0
  373. package/src/data/schema/index.ts +6 -0
  374. package/src/data/schema/json-schema.ts +33 -0
  375. package/src/data/schema/namespace.ts +55 -0
  376. package/src/data/schema/parse.ts +39 -0
  377. package/src/data/schema/types.ts +39 -0
  378. package/src/data/temporal/append-only.ts +134 -0
  379. package/src/data/temporal/close.ts +27 -0
  380. package/src/data/temporal/columns.ts +10 -0
  381. package/src/data/temporal/definition-queries.ts +70 -0
  382. package/src/data/temporal/errors.ts +10 -0
  383. package/src/data/temporal/get-current.ts +22 -0
  384. package/src/data/temporal/index.ts +9 -0
  385. package/src/data/temporal/namespace.ts +36 -0
  386. package/src/data/temporal/query.ts +25 -0
  387. package/src/data/temporal/resolve.ts +17 -0
  388. package/src/data/temporal/revise.ts +67 -0
  389. package/src/data/temporal/types.ts +22 -0
  390. package/src/data/valve/artifact.ts +33 -0
  391. package/src/data/valve/contract-diff.ts +21 -0
  392. package/src/data/valve/cross.ts +57 -0
  393. package/src/data/valve/crossing-ledger.ts +50 -0
  394. package/src/data/valve/decision.ts +44 -0
  395. package/src/data/valve/durable-crossing.ts +52 -0
  396. package/src/data/valve/execute-crossing.ts +77 -0
  397. package/src/data/valve/faucet.ts +56 -0
  398. package/src/data/valve/gate.ts +114 -0
  399. package/src/data/valve/graph.ts +77 -0
  400. package/src/data/valve/index.ts +53 -0
  401. package/src/data/valve/namespace.ts +57 -0
  402. package/src/data/valve/registry.ts +50 -0
  403. package/src/data/valve/schema/valve-crossing-fields.ts +23 -0
  404. package/src/data/valve/schema/valve-crossing.ts +9 -0
  405. package/src/data/valve/supply.ts +154 -0
  406. package/src/data/valve/types.ts +143 -0
  407. package/src/data/vector/columns.ts +27 -0
  408. package/src/data/vector/index.ts +4 -0
  409. package/src/data/vector/namespace.ts +33 -0
  410. package/src/data/vector/query.ts +85 -0
  411. package/src/data/vector/validate.ts +16 -0
  412. package/src/data/write/audit/actor.ts +15 -0
  413. package/src/data/write/audit/audit-columns.ts +18 -0
  414. package/src/data/write/audit/audit-select.ts +111 -0
  415. package/src/data/write/audit/bound-transaction.ts +14 -0
  416. package/src/data/write/audit/cte-compile.ts +32 -0
  417. package/src/data/write/audit/decode-returning.ts +47 -0
  418. package/src/data/write/audit/final-select.ts +43 -0
  419. package/src/data/write/audit/infra-audit.ts +36 -0
  420. package/src/data/write/audit/primary-key.ts +65 -0
  421. package/src/data/write/audit/projection.ts +41 -0
  422. package/src/data/write/audit/read-touches.ts +86 -0
  423. package/src/data/write/audit/touch-match.ts +78 -0
  424. package/src/data/write/audit/verb-delete.ts +62 -0
  425. package/src/data/write/audit/verb-insert.ts +36 -0
  426. package/src/data/write/audit/verb-select.ts +47 -0
  427. package/src/data/write/audit/verb-update.ts +60 -0
  428. package/src/data/write/audit/verb-upsert.ts +104 -0
  429. package/src/data/write/conflict.ts +43 -0
  430. package/src/data/write/delete.ts +38 -0
  431. package/src/data/write/execute.ts +243 -0
  432. package/src/data/write/index.ts +11 -0
  433. package/src/data/write/insert.ts +63 -0
  434. package/src/data/write/state.ts +43 -0
  435. package/src/data/write/update.ts +54 -0
  436. package/src/data/write/upsert.ts +58 -0
  437. package/src/data/write/values.ts +19 -0
  438. package/src/index.ts +230 -0
  439. package/src/infra/access-links/code.ts +70 -0
  440. package/src/infra/access-links/handle.ts +892 -0
  441. package/src/infra/access-links/index.ts +9 -0
  442. package/src/infra/access-links/namespace.ts +30 -0
  443. package/src/infra/access-links/person-check.ts +177 -0
  444. package/src/infra/access-links/schema.ts +71 -0
  445. package/src/infra/alerts/async-sources.ts +231 -0
  446. package/src/infra/alerts/audit.ts +36 -0
  447. package/src/infra/alerts/beat.ts +123 -0
  448. package/src/infra/alerts/client-faults.ts +111 -0
  449. package/src/infra/alerts/faults.ts +156 -0
  450. package/src/infra/alerts/handle.ts +778 -0
  451. package/src/infra/alerts/http.ts +192 -0
  452. package/src/infra/alerts/index.ts +12 -0
  453. package/src/infra/alerts/infra-sources.ts +180 -0
  454. package/src/infra/alerts/namespace.ts +81 -0
  455. package/src/infra/alerts/redact.ts +21 -0
  456. package/src/infra/alerts/request-faults.ts +41 -0
  457. package/src/infra/alerts/schema.ts +124 -0
  458. package/src/infra/alerts/sinks.ts +125 -0
  459. package/src/infra/alerts/source-options.ts +26 -0
  460. package/src/infra/alerts/sources.ts +503 -0
  461. package/src/infra/alerts/subsystem-sources.ts +137 -0
  462. package/src/infra/audit/emit.ts +87 -0
  463. package/src/infra/audit/index.ts +2 -0
  464. package/src/infra/audit/namespace.ts +22 -0
  465. package/src/infra/audit/schema.sql +35 -0
  466. package/src/infra/audit/types.ts +18 -0
  467. package/src/infra/aws/credentials.ts +147 -0
  468. package/src/infra/aws/sigv4.ts +140 -0
  469. package/src/infra/cache/create.ts +58 -0
  470. package/src/infra/cache/entry.ts +81 -0
  471. package/src/infra/cache/index.ts +4 -0
  472. package/src/infra/cache/namespace.ts +10 -0
  473. package/src/infra/cache/tenant.ts +93 -0
  474. package/src/infra/cache/types.ts +24 -0
  475. package/src/infra/crawl/audit.ts +35 -0
  476. package/src/infra/crawl/errors.ts +25 -0
  477. package/src/infra/crawl/handle.ts +693 -0
  478. package/src/infra/crawl/index.ts +9 -0
  479. package/src/infra/crawl/links.ts +160 -0
  480. package/src/infra/crawl/namespace.ts +36 -0
  481. package/src/infra/crawl/robots.ts +100 -0
  482. package/src/infra/crawl/schema.ts +89 -0
  483. package/src/infra/credit-line/handle.ts +883 -0
  484. package/src/infra/credit-line/index.ts +6 -0
  485. package/src/infra/credit-line/namespace.ts +7 -0
  486. package/src/infra/credit-line/schema.ts +96 -0
  487. package/src/infra/credits/handle.ts +706 -0
  488. package/src/infra/credits/index.ts +5 -0
  489. package/src/infra/credits/namespace.ts +7 -0
  490. package/src/infra/credits/schema.ts +83 -0
  491. package/src/infra/email/audit.ts +36 -0
  492. package/src/infra/email/inbound.ts +622 -0
  493. package/src/infra/email/index.ts +11 -0
  494. package/src/infra/email/mail.ts +517 -0
  495. package/src/infra/email/mime.ts +447 -0
  496. package/src/infra/email/namespace.ts +22 -0
  497. package/src/infra/email/providers.ts +111 -0
  498. package/src/infra/email/schema.ts +96 -0
  499. package/src/infra/email/sns.ts +200 -0
  500. package/src/infra/email/unsubscribe.ts +44 -0
  501. package/src/infra/fetch/address.ts +88 -0
  502. package/src/infra/fetch/connect-retry.ts +87 -0
  503. package/src/infra/fetch/handle.ts +329 -0
  504. package/src/infra/fetch/index.ts +7 -0
  505. package/src/infra/fetch/namespace.ts +70 -0
  506. package/src/infra/idempotency/index.ts +3 -0
  507. package/src/infra/idempotency/middleware.ts +87 -0
  508. package/src/infra/idempotency/store.ts +92 -0
  509. package/src/infra/idempotency/types.ts +30 -0
  510. package/src/infra/join-requests/handle.ts +312 -0
  511. package/src/infra/join-requests/index.ts +2 -0
  512. package/src/infra/join-requests/namespace.ts +7 -0
  513. package/src/infra/join-requests/schema.ts +33 -0
  514. package/src/infra/outbox/core.ts +165 -0
  515. package/src/infra/quota/errors.ts +32 -0
  516. package/src/infra/quota/handle.ts +215 -0
  517. package/src/infra/quota/index.ts +5 -0
  518. package/src/infra/quota/namespace.ts +7 -0
  519. package/src/infra/quota/schema.ts +15 -0
  520. package/src/infra/storage/backend.ts +34 -0
  521. package/src/infra/storage/handle.ts +513 -0
  522. package/src/infra/storage/index.ts +9 -0
  523. package/src/infra/storage/local.ts +104 -0
  524. package/src/infra/storage/namespace.ts +13 -0
  525. package/src/infra/storage/s3.ts +257 -0
  526. package/src/infra/storage/schema.ts +24 -0
  527. package/src/infra/support/handle.ts +854 -0
  528. package/src/infra/support/http.ts +229 -0
  529. package/src/infra/support/index.ts +7 -0
  530. package/src/infra/support/namespace.ts +12 -0
  531. package/src/infra/support/schema.ts +96 -0
  532. package/src/infra/webhook/inbound.ts +45 -0
  533. package/src/infra/webhook/index.ts +5 -0
  534. package/src/infra/webhook/namespace.ts +24 -0
  535. package/src/infra/webhook/outbound.ts +315 -0
  536. package/src/infra/webhook/sign.ts +32 -0
  537. package/src/infra/webhook/verify.ts +82 -0
  538. package/src/invariants/assert.ts +26 -0
  539. package/src/invariants/index.ts +1 -0
  540. package/src/lint/config.ts +56 -0
  541. package/src/lint/doctrine.ts +163 -0
  542. package/src/lint/include.ts +97 -0
  543. package/src/lint/index.ts +3 -0
  544. package/src/lint/preset.ts +10 -0
  545. package/src/lint/resolver.ts +218 -0
  546. package/src/lint/rules/no-reexports.ts +46 -0
  547. package/src/request/behavior/audited.ts +85 -0
  548. package/src/request/behavior/cached.ts +62 -0
  549. package/src/request/behavior/compose.ts +28 -0
  550. package/src/request/behavior/index.ts +5 -0
  551. package/src/request/behavior/namespace.ts +16 -0
  552. package/src/request/behavior/types.ts +26 -0
  553. package/src/request/behavior/versioned.ts +54 -0
  554. package/src/request/context/create.ts +103 -0
  555. package/src/request/context/guard.ts +49 -0
  556. package/src/request/context/index.ts +4 -0
  557. package/src/request/context/run-in-transaction.ts +200 -0
  558. package/src/request/context/store.ts +28 -0
  559. package/src/request/context/types.ts +50 -0
  560. package/src/request/di/builder.ts +535 -0
  561. package/src/request/di/index.ts +8 -0
  562. package/src/request/di/resolve.ts +271 -0
  563. package/src/request/di/types.ts +262 -0
  564. package/src/request/fitting/namespace.ts +7 -0
  565. package/src/request/fixture/batch.ts +71 -0
  566. package/src/request/fixture/builder.ts +26 -0
  567. package/src/request/fixture/errors.ts +10 -0
  568. package/src/request/fixture/index.ts +8 -0
  569. package/src/request/fixture/namespace.ts +23 -0
  570. package/src/request/fixture/paginate.ts +44 -0
  571. package/src/request/fixture/to-handlers.ts +260 -0
  572. package/src/request/fixture/types.ts +79 -0
  573. package/src/request/flow/act-as.ts +78 -0
  574. package/src/request/flow/namespace.ts +17 -0
  575. package/src/request/http/error-step.ts +42 -0
  576. package/src/request/http/file.ts +141 -0
  577. package/src/request/http/index.ts +4 -0
  578. package/src/request/http/middleware.ts +141 -0
  579. package/src/request/http/namespace.ts +5 -0
  580. package/src/request/http/rate-limit-classes.ts +170 -0
  581. package/src/request/http/response.ts +82 -0
  582. package/src/request/http/server.ts +916 -0
  583. package/src/request/http/sniff.ts +261 -0
  584. package/src/request/http/types.ts +250 -0
  585. package/src/request/http/upload.ts +284 -0
  586. package/src/request/internal/text.ts +6 -0
  587. package/src/request/openapi/generate.ts +205 -0
  588. package/src/request/openapi/index.ts +2 -0
  589. package/src/request/openapi/namespace.ts +7 -0
  590. package/src/test/auth.ts +13 -0
  591. package/src/test/auto-setup.ts +45 -0
  592. package/src/test/context.ts +91 -0
  593. package/src/test/crawl-fixture.ts +157 -0
  594. package/src/test/discover-fork.ts +17 -0
  595. package/src/test/fingerprint.ts +135 -0
  596. package/src/test/globals.d.ts +7 -0
  597. package/src/test/index.ts +19 -0
  598. package/src/test/namespace.ts +87 -0
  599. package/src/test/plugin.ts +189 -0
  600. package/src/test/progress.ts +185 -0
  601. package/src/test/reap-after-run.ts +28 -0
  602. package/src/test/reap.ts +286 -0
  603. package/src/test/reset.ts +253 -0
  604. package/src/test/savepoints.ts +172 -0
  605. package/src/test/setup.ts +1422 -0
  606. package/src/test/system-channel.ts +50 -0
  607. package/src/test/vitest-plugin.ts +142 -0
  608. package/src/test/vitest-workspace.ts +507 -0
  609. package/src/test/vitest.ts +333 -0
  610. package/src/test/watch.ts +105 -0
  611. package/src/trace/capture/bounded-serializer.ts +146 -0
  612. package/src/trace/cardinality/analyze.ts +173 -0
  613. package/src/trace/cardinality/branch-context.ts +214 -0
  614. package/src/trace/cardinality/check.ts +33 -0
  615. package/src/trace/cardinality/classify-edge.ts +64 -0
  616. package/src/trace/cardinality/structural-max.ts +107 -0
  617. package/src/trace/check/coverage-check.ts +188 -0
  618. package/src/trace/check/flow-check.ts +103 -0
  619. package/src/trace/check/flow-step-site.ts +234 -0
  620. package/src/trace/check/io-pattern.ts +116 -0
  621. package/src/trace/codemod/add-cardinality.ts +152 -0
  622. package/src/trace/codemod/run.ts +80 -0
  623. package/src/trace/entry/child-trace.ts +21 -0
  624. package/src/trace/entry/close-trace.ts +87 -0
  625. package/src/trace/entry/finalize-trace.ts +28 -0
  626. package/src/trace/entry/open-trace.ts +138 -0
  627. package/src/trace/entry/parent-trace.ts +20 -0
  628. package/src/trace/entry/parse-traceparent.ts +39 -0
  629. package/src/trace/entry/process-start.ts +38 -0
  630. package/src/trace/entry/trace-context.ts +26 -0
  631. package/src/trace/entry/tracing-enabled.ts +10 -0
  632. package/src/trace/external/record.ts +195 -0
  633. package/src/trace/external/report.ts +66 -0
  634. package/src/trace/namespace.ts +19 -0
  635. package/src/trace/partition/day.ts +47 -0
  636. package/src/trace/partition/index.ts +14 -0
  637. package/src/trace/partition/partition-name.ts +23 -0
  638. package/src/trace/partition/plan.ts +82 -0
  639. package/src/trace/partition/schedule.ts +26 -0
  640. package/src/trace/partition/startup-hook.ts +39 -0
  641. package/src/trace/partition/sync.ts +154 -0
  642. package/src/trace/partition/tables.ts +53 -0
  643. package/src/trace/read/tree.ts +83 -0
  644. package/src/trace/retain/copy-on-error.ts +76 -0
  645. package/src/trace/runtime/expire-stale-traces.ts +54 -0
  646. package/src/trace/runtime/flow-step.ts +147 -0
  647. package/src/trace/runtime/flush-steps.ts +31 -0
  648. package/src/trace/runtime/pending-writes.ts +54 -0
  649. package/src/trace/runtime/step-buffer.ts +298 -0
  650. package/src/trace/runtime/step-error.ts +21 -0
  651. package/src/trace/runtime/step-meta.ts +55 -0
  652. package/src/trace/runtime/thenable.ts +12 -0
  653. package/src/trace/runtime/truncate-trace.ts +62 -0
  654. package/src/trace/schema/trace-fields.ts +52 -0
  655. package/src/trace/schema/trace-retained.ts +22 -0
  656. package/src/trace/schema/trace-step-fields.ts +44 -0
  657. package/src/trace/schema/trace-step-retained.ts +25 -0
  658. package/src/trace/schema/trace-step.ts +18 -0
  659. package/src/trace/schema/trace.ts +12 -0
  660. package/src/trace/transformer/apply.ts +79 -0
  661. package/src/trace/transformer/build-meta-literal.ts +30 -0
  662. package/src/trace/transformer/find-flow-step-sites.ts +85 -0
  663. package/src/trace/transformer/inject-flow-step-import.ts +39 -0
  664. package/src/trace/transformer/transform-error.ts +14 -0
  665. package/src/trace/transformer/transform-flow-steps.ts +123 -0
  666. package/src/trace/transformer/wrap-function-declaration.ts +62 -0
  667. package/src/trace/transformer/wrap-variable-declaration.ts +67 -0
  668. package/src/workspace/affected.ts +110 -0
  669. package/src/workspace/changed-files.ts +163 -0
  670. package/src/workspace/check-deps.ts +213 -0
  671. package/src/workspace/checksum.ts +20 -0
  672. package/src/workspace/dependency-graph.ts +67 -0
  673. package/src/workspace/detect-pipework-copies.ts +93 -0
  674. package/src/workspace/discover.ts +206 -0
  675. package/src/workspace/generate.ts +401 -0
  676. package/src/workspace/index.ts +7 -0
  677. package/src/workspace/module-imports-pipework.ts +39 -0
  678. package/src/workspace/module-package-name.ts +12 -0
  679. package/src/workspace/scrub-git-env.ts +23 -0
  680. package/src/workspace/source-paths.ts +36 -0
  681. package/src/workspace/sync.ts +182 -0
  682. package/dist/REFERENCE.md +0 -1477
  683. package/dist/infra/access-links/rate-limit.d.ts +0 -10
  684. package/dist/infra/access-links/rate-limit.d.ts.map +0 -1
  685. package/dist/infra/access-links/rate-limit.js +0 -28
  686. package/dist/infra/access-links/rate-limit.js.map +0 -1
  687. package/dist/infra/email/sigv4.d.ts +0 -24
  688. package/dist/infra/email/sigv4.d.ts.map +0 -1
  689. package/dist/infra/email/sigv4.js +0 -55
  690. package/dist/infra/email/sigv4.js.map +0 -1
@@ -0,0 +1,57 @@
1
+ import { supply } from './supply.js'
2
+ import { gate } from './gate.js'
3
+ import { faucet } from './faucet.js'
4
+ import { cross, held, failed } from './decision.js'
5
+ import { crossSupply, crossGate } from './cross.js'
6
+ import { executeSupplyCrossing, executeGateCrossing } from './execute-crossing.js'
7
+ import { enqueueCrossing, runCrossingJob, VALVE_CROSSING_JOB_TYPE } from './durable-crossing.js'
8
+ import { buildValveGraph, downstreamFaucets, contextDependents } from './graph.js'
9
+ import { diffContract } from './contract-diff.js'
10
+ import { emitArtifact } from './artifact.js'
11
+ import { valves, getValve, faucetsOf } from './registry.js'
12
+
13
+ /** Valve namespace — typed, directional, gated boundaries between code silos. */
14
+ export const valve = {
15
+ /** Declare a handoff valve — the producer side of a payload crossing. */
16
+ supply,
17
+ /** Declare a transition-gate valve — the producer side of a gated state change. */
18
+ gate,
19
+ /** Declare a faucet — the consumer side of a `supply -> faucet` edge. */
20
+ faucet,
21
+ /** Decision outcome: cross the valve, delivering the payload. */
22
+ cross,
23
+ /** Decision outcome: hold the crossing in a provisional, reviewable state. */
24
+ held,
25
+ /** Decision outcome: evaluation failed — retryable, never a thrown exception. */
26
+ failed,
27
+ /** Execute a handoff crossing in the caller's transaction (unrecorded mechanics). */
28
+ crossSupply,
29
+ /** Execute a transition-gate crossing (unrecorded mechanics). */
30
+ crossGate,
31
+ /** Execute a handoff crossing with idempotency and provenance recording. */
32
+ executeSupplyCrossing,
33
+ /** Execute a transition-gate crossing with provenance recording. */
34
+ executeGateCrossing,
35
+ /** Enqueue a handoff crossing to run durably as a retried, dead-letterable job. */
36
+ enqueueCrossing,
37
+ /** The durable-crossing job-handler body — wire into a worker. */
38
+ runCrossingJob,
39
+ /** Job type for a durable valve crossing. */
40
+ VALVE_CROSSING_JOB_TYPE,
41
+ /** Assemble the directional valve graph from every registered valve and faucet. */
42
+ graph: buildValveGraph,
43
+ /** The faucet nodes a valve feeds. */
44
+ downstreamFaucets,
45
+ /** The gates whose enrichment context depends on a valve. */
46
+ contextDependents,
47
+ /** Diff a valve contract between two versions. */
48
+ diffContract,
49
+ /** Project a handoff supply to its lightweight contract artifact. */
50
+ emitArtifact,
51
+ /** All registered producer valves, keyed by name. */
52
+ valves,
53
+ /** Look up a registered valve by name. */
54
+ getValve,
55
+ /** The faucets consuming a named valve. */
56
+ faucetsOf,
57
+ }
@@ -0,0 +1,50 @@
1
+ import type { FaucetDefinition, ValveDefinition } from './types.js'
2
+
3
+ // Two global registries, populated at import time when valve declarations run.
4
+ // `registry` holds producers (supply / gate); `faucetRegistry` holds the
5
+ // consumer side, keyed by the valve name each faucet binds to. The valve graph
6
+ // reconciles the two into `supply -> faucet` edges.
7
+ const registry = new Map<string, ValveDefinition>()
8
+ const faucetRegistry = new Map<string, FaucetDefinition<unknown>[]>()
9
+
10
+ /** Register a producer valve under its name. Names must be unique across the process. */
11
+ export function registerValve(definition: ValveDefinition): void {
12
+ const existing = registry.get(definition.name)
13
+ if (existing !== undefined) {
14
+ throw new Error(
15
+ `[pipework] Duplicate valve: "${definition.name}" is already registered.\n\n` +
16
+ ' Each valve must have a unique name.\n' +
17
+ ` Existing: ${existing.kind} (${existing.topology.producer} -> ${existing.topology.consumer})\n` +
18
+ ` Duplicate: ${definition.kind} (${definition.topology.producer} -> ${definition.topology.consumer})\n`,
19
+ )
20
+ }
21
+ registry.set(definition.name, definition)
22
+ }
23
+
24
+ /** All registered producer valves, keyed by name. */
25
+ export function valves(): ReadonlyMap<string, ValveDefinition> {
26
+ return registry
27
+ }
28
+
29
+ /** Look up one producer valve by name, or `undefined` if it is not registered. */
30
+ export function getValve(name: string): ValveDefinition | undefined {
31
+ return registry.get(name)
32
+ }
33
+
34
+ /** Register a faucet against the valve name it consumes. A valve may have many faucets. */
35
+ export function registerFaucet(faucet: FaucetDefinition<unknown>): void {
36
+ const existing = faucetRegistry.get(faucet.valve) ?? []
37
+ existing.push(faucet)
38
+ faucetRegistry.set(faucet.valve, existing)
39
+ }
40
+
41
+ /** Every faucet that consumes the named valve, in declaration order. */
42
+ export function faucetsOf(valveName: string): readonly FaucetDefinition<unknown>[] {
43
+ return faucetRegistry.get(valveName) ?? []
44
+ }
45
+
46
+ /** Empty both registries. Test support — production code never calls this. */
47
+ export function clearValveRegistry(): void {
48
+ registry.clear()
49
+ faucetRegistry.clear()
50
+ }
@@ -0,0 +1,23 @@
1
+ // Column shape of `valve_crossing` — the crossing ledger. One row per crossing
2
+ // attempt: the immutable provenance record (#307 field 6) and, for a keyed
3
+ // crossing, the idempotency entry (#307 field 9).
4
+
5
+ import { field } from '../../domain/index.js'
6
+ import { schema } from '../../schema/namespace.js'
7
+
8
+ export const valveCrossingFields = {
9
+ id: field.uuid().brand('ValveCrossingId').defaultRandom().primaryKey(),
10
+ // The valve crossed.
11
+ valve: field.text(),
12
+ // The idempotency key, or null for an un-keyed crossing.
13
+ idempotencyKey: field.text().nullable(),
14
+ // How the crossing resolved.
15
+ outcome: field.enum(['crossed', 'blocked', 'held', 'failed']),
16
+ // Snapshot of the delivered payload — set for a `crossed` outcome.
17
+ payload: field.jsonb(schema.check.json()).nullable(),
18
+ // The held reason or the failure error — set for `held` / `failed`.
19
+ detail: field.jsonb(schema.check.json()).nullable(),
20
+ // The trace / correlation id propagated across the crossing.
21
+ lineageId: field.text().nullable(),
22
+ crossedAt: field.timestamp(),
23
+ }
@@ -0,0 +1,9 @@
1
+ // The `valve_crossing` ledger — one row per crossing attempt. It is both the
2
+ // immutable provenance record every crossing and non-crossing leaves (#307
3
+ // field 6) and the idempotency store a keyed crossing is replayed against
4
+ // (#307 field 9). Written transactionally with the crossing; non-partitioned.
5
+
6
+ import { define } from '../../domain/index.js'
7
+ import { valveCrossingFields } from './valve-crossing-fields.js'
8
+
9
+ export const valveCrossing = define('valve_crossing', valveCrossingFields)
@@ -0,0 +1,154 @@
1
+ import { registerValve } from './registry.js'
2
+ import type {
3
+ ContractPayload,
4
+ ContractShape,
5
+ HandoffTrigger,
6
+ SupplyDefinition,
7
+ } from './types.js'
8
+
9
+ /**
10
+ * The producer-side builder for a handoff valve. Type parameters narrow as the
11
+ * chain progresses: `.from()` fixes the source row type, `.contract()` fixes
12
+ * the payload type, and `.guard()` / `.project()` / `.idempotentBy()` are then
13
+ * checked against them. `.to()` is terminal — it registers the valve.
14
+ */
15
+ export interface SupplyBuilder<TSource, TPayload> {
16
+ /** The source entity and the state transition (or push) that fires the crossing. */
17
+ from<TFromSource = TSource>(source: string, trigger: HandoffTrigger): SupplyBuilder<TFromSource, TPayload>
18
+ /** The payload schema — `.project()` must produce exactly this shape. */
19
+ contract<TShape extends ContractShape>(shape: TShape): SupplyBuilder<TSource, ContractPayload<TShape>>
20
+ /** A guard predicate; the payload may not cross unless it holds. */
21
+ guard(predicate: (row: TSource) => boolean): SupplyBuilder<TSource, TPayload>
22
+ /** Projects the source row to the contract payload — a snapshot taken at crossing time. */
23
+ project(projection: (row: TSource) => TPayload): SupplyBuilder<TSource, TPayload>
24
+ /** Names a post-condition that holds across the crossing (checked via the valve graph). */
25
+ invariant(name: string): SupplyBuilder<TSource, TPayload>
26
+ /** The source field carrying the trace/correlation id propagated across the crossing. */
27
+ lineage(field: string): SupplyBuilder<TSource, TPayload>
28
+ /** Derives the idempotency key for a crossing from the source row. */
29
+ idempotentBy(key: (row: TSource) => string): SupplyBuilder<TSource, TPayload>
30
+ /** Run the crossing as a durable retried job rather than in the caller's transaction. */
31
+ durable(retry?: 'backoff' | 'fixed'): SupplyBuilder<TSource, TPayload>
32
+ /** The consumer silo. Terminal — registers the valve and returns its definition. */
33
+ to(consumer: string): SupplyDefinition<TSource, TPayload>
34
+ }
35
+
36
+ interface SupplyState {
37
+ readonly name: string
38
+ readonly producer: string
39
+ source: string | undefined
40
+ trigger: HandoffTrigger | undefined
41
+ contract: ContractShape | undefined
42
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- the builder erases per-stage source/payload generics; SupplyBuilder is the precise public surface
43
+ guard: ((row: any) => boolean) | undefined
44
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- see above
45
+ project: ((row: any) => unknown) | undefined
46
+ invariants: string[]
47
+ lineageField: string | undefined
48
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- see above
49
+ idempotentBy: ((row: any) => string) | undefined
50
+ crossing: SupplyDefinition<unknown, unknown>['crossing']
51
+ }
52
+
53
+ function finalize(state: SupplyState, consumer: string): SupplyDefinition<unknown, unknown> {
54
+ if (state.source === undefined || state.trigger === undefined) {
55
+ throw new Error(
56
+ `[pipework] Valve "${state.name}" is missing .from(...).\n\n` +
57
+ ' A supply must declare its source entity and trigger before .to(...).\n' +
58
+ ' Example: supply("frozen-outcome", "compensation")\n' +
59
+ ' .from("outcomes", { on: "status", from: "open", to: "frozen" })\n',
60
+ )
61
+ }
62
+ if (state.contract === undefined) {
63
+ throw new Error(
64
+ `[pipework] Valve "${state.name}" is missing .contract(...).\n\n` +
65
+ ' A supply must declare its payload contract before .to(...).\n',
66
+ )
67
+ }
68
+ if (state.project === undefined) {
69
+ throw new Error(
70
+ `[pipework] Valve "${state.name}" is missing .project(...).\n\n` +
71
+ ' A supply must declare how the source row projects to the contract payload before .to(...).\n',
72
+ )
73
+ }
74
+ const definition: SupplyDefinition<unknown, unknown> = {
75
+ name: state.name,
76
+ kind: 'handoff',
77
+ topology: { producer: state.producer, consumer },
78
+ source: state.source,
79
+ trigger: state.trigger,
80
+ contract: state.contract,
81
+ guard: state.guard,
82
+ project: state.project,
83
+ invariants: [...state.invariants],
84
+ lineageField: state.lineageField,
85
+ idempotentBy: state.idempotentBy,
86
+ crossing: state.crossing,
87
+ }
88
+ registerValve(definition)
89
+ return definition
90
+ }
91
+
92
+ /**
93
+ * Declare a handoff valve. `name` identifies the valve; `producer` is the silo
94
+ * the data crosses *from*. Chain the anatomy and finish with `.to(consumer)`.
95
+ */
96
+ export function supply(name: string, producer: string): SupplyBuilder<unknown, unknown> {
97
+ const state: SupplyState = {
98
+ name,
99
+ producer,
100
+ source: undefined,
101
+ trigger: undefined,
102
+ contract: undefined,
103
+ guard: undefined,
104
+ project: undefined,
105
+ invariants: [],
106
+ lineageField: undefined,
107
+ idempotentBy: undefined,
108
+ crossing: { durable: false },
109
+ }
110
+
111
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- builder type params narrow per stage; the public SupplyBuilder type is precise
112
+ const builder: any = {
113
+ from(source: string, trigger: HandoffTrigger) {
114
+ state.source = source
115
+ state.trigger = trigger
116
+ return builder
117
+ },
118
+ contract(shape: ContractShape) {
119
+ state.contract = shape
120
+ return builder
121
+ },
122
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- predicate generic erased into state; see SupplyState
123
+ guard(predicate: (row: any) => boolean) {
124
+ state.guard = predicate
125
+ return builder
126
+ },
127
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- projection generic erased into state; see SupplyState
128
+ project(projection: (row: any) => unknown) {
129
+ state.project = projection
130
+ return builder
131
+ },
132
+ invariant(invariantName: string) {
133
+ state.invariants.push(invariantName)
134
+ return builder
135
+ },
136
+ lineage(field: string) {
137
+ state.lineageField = field
138
+ return builder
139
+ },
140
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- key generic erased into state; see SupplyState
141
+ idempotentBy(key: (row: any) => string) {
142
+ state.idempotentBy = key
143
+ return builder
144
+ },
145
+ durable(retry?: 'backoff' | 'fixed') {
146
+ state.crossing = { durable: true, retry: retry ?? 'backoff' }
147
+ return builder
148
+ },
149
+ to(consumer: string) {
150
+ return finalize(state, consumer)
151
+ },
152
+ }
153
+ return builder as SupplyBuilder<unknown, unknown>
154
+ }
@@ -0,0 +1,143 @@
1
+ import type { Schema, Infer } from '../schema/types.js'
2
+ import type { DB } from '../db/namespace.js'
3
+ import type { DecisionOutcome } from './decision.js'
4
+
5
+ /**
6
+ * The two valve forms. A `handoff` moves a payload across a silo / ownership
7
+ * boundary; a `transition-gate` modulates a state change within one silo.
8
+ */
9
+ export type ValveKind = 'handoff' | 'transition-gate'
10
+
11
+ /**
12
+ * Directional producer -> consumer topology. For a transition gate the
13
+ * producer and consumer silo coincide — the crossing is an intra-silo edge.
14
+ */
15
+ export interface ValveTopology {
16
+ readonly producer: string
17
+ readonly consumer: string
18
+ }
19
+
20
+ /**
21
+ * A registered valve. The builders (`supply`, `gate`, `faucet`) produce
22
+ * concrete definitions assignable to this base; the registry stores them
23
+ * keyed by `name`, and the valve graph is assembled from their topology.
24
+ */
25
+ export interface ValveDefinition {
26
+ readonly name: string
27
+ readonly kind: ValveKind
28
+ readonly topology: ValveTopology
29
+ }
30
+
31
+ /**
32
+ * A handoff trigger — either a source state transition (`status: open -> frozen`)
33
+ * or an explicit push.
34
+ */
35
+ export type HandoffTrigger =
36
+ | { readonly on: string, readonly from: string, readonly to: string }
37
+ | { readonly push: true }
38
+
39
+ /**
40
+ * How a crossing executes — synchronously in the caller's transaction, or as a
41
+ * durable retried job that dead-letters on retry exhaustion.
42
+ */
43
+ export type CrossingMode =
44
+ | { readonly durable: false }
45
+ | { readonly durable: true, readonly retry: 'backoff' | 'fixed' }
46
+
47
+ /** A contract shape — payload field name -> validation schema. */
48
+ export type ContractShape = Record<string, Schema>
49
+
50
+ /** The payload type a contract shape validates to. */
51
+ export type ContractPayload<TShape extends ContractShape> = {
52
+ readonly [K in keyof TShape]: Infer<TShape[K]>
53
+ }
54
+
55
+ /**
56
+ * A handoff valve, produced by `supply(...).to(...)`. Carries the full anatomy
57
+ * the crossing executor and the valve graph read back.
58
+ */
59
+ export interface SupplyDefinition<TSource, TPayload> extends ValveDefinition {
60
+ readonly kind: 'handoff'
61
+ readonly source: string
62
+ readonly trigger: HandoffTrigger
63
+ readonly contract: ContractShape
64
+ readonly guard: ((row: TSource) => boolean) | undefined
65
+ readonly project: (row: TSource) => TPayload
66
+ readonly invariants: readonly string[]
67
+ readonly lineageField: string | undefined
68
+ readonly idempotentBy: ((row: TSource) => string) | undefined
69
+ readonly crossing: CrossingMode
70
+ }
71
+
72
+ /**
73
+ * A transition-gate trigger. A gate fires on admission of a source row, on the
74
+ * birth of a new instance version, or by an explicit operator action — the
75
+ * manual trigger carrying a permission and batch semantics.
76
+ */
77
+ export type GateTrigger =
78
+ | { readonly trigger: 'admission' }
79
+ | { readonly trigger: 'new-version' }
80
+ | { readonly trigger: 'manual', readonly permission: string, readonly batch: boolean }
81
+
82
+ /** Retraction config — which trigger supersedes and invalidates the prior crossing. */
83
+ export interface GateRetraction {
84
+ readonly on: 'new-version'
85
+ }
86
+
87
+ /**
88
+ * The decision hook — the load-bearing seam (#307 field 13). Async, and returns
89
+ * a partitioned outcome (`cross` / `held` / `failed`) — never a bare verdict.
90
+ */
91
+ export type GateDecision<TEvent> = (
92
+ event: TEvent,
93
+ context: Readonly<Record<string, unknown>>,
94
+ ) => Promise<DecisionOutcome<unknown, unknown>>
95
+
96
+ /**
97
+ * A transition-gate valve, produced by `gate(...).decision(...)`. Its producer
98
+ * and consumer silo coincide — it modulates an intra-silo state change.
99
+ */
100
+ export interface GateDefinition<TEvent> extends ValveDefinition {
101
+ readonly kind: 'transition-gate'
102
+ readonly source: string
103
+ readonly triggers: readonly GateTrigger[]
104
+ readonly context: Readonly<Record<string, string>>
105
+ readonly signals: readonly string[]
106
+ readonly fanOut: ((event: TEvent) => readonly unknown[]) | undefined
107
+ readonly decision: GateDecision<TEvent>
108
+ readonly retraction: GateRetraction | undefined
109
+ }
110
+
111
+ /**
112
+ * A faucet's intake handler — receives the re-validated payload and the
113
+ * transaction the crossing runs in, and lands the payload in the consumer.
114
+ */
115
+ export type FaucetHandler<TPayload> = (payload: TPayload, tx: DB) => Promise<void>
116
+
117
+ /**
118
+ * A faucet — the consumer side of a `supply -> faucet` edge. It binds to a
119
+ * valve by name (never to the producer silo) and re-validates every payload.
120
+ */
121
+ export interface FaucetDefinition<TPayload> {
122
+ readonly valve: string
123
+ readonly target: string
124
+ readonly handler: FaucetHandler<TPayload>
125
+ }
126
+
127
+ /** The crossing proceeded — `payload` was delivered. */
128
+ export interface CrossedResult { readonly kind: 'crossed', readonly payload: unknown }
129
+ /** A handoff guard rejected the row — nothing crossed. */
130
+ export interface BlockedResult { readonly kind: 'blocked' }
131
+ /** A gate held the crossing in a provisional, reviewable state. */
132
+ export interface HeldResult { readonly kind: 'held', readonly reason: unknown }
133
+ /** A gate's decision evaluation failed. */
134
+ export interface FailedResult { readonly kind: 'failed', readonly error: Error }
135
+ /** A keyed crossing was replayed — its prior `crossed` outcome already landed. */
136
+ export interface SkippedResult { readonly kind: 'skipped' }
137
+
138
+ /** A handoff crossing resolves as crossed or blocked. */
139
+ export type SupplyCrossingResult = CrossedResult | BlockedResult
140
+ /** A transition-gate crossing resolves as crossed, held, or failed. */
141
+ export type GateCrossingResult = CrossedResult | HeldResult | FailedResult
142
+ /** Any crossing outcome — the recorded layer additionally yields `skipped`. */
143
+ export type CrossingResult = CrossedResult | BlockedResult | HeldResult | FailedResult | SkippedResult
@@ -0,0 +1,27 @@
1
+ import { customType } from '../db/col/index.js'
2
+
3
+ export function vector(name: string, config: { dimensions: number }) {
4
+ return customType<{ data: number[]; driverParam: string }>({
5
+ dataType() {
6
+ return `vector(${config.dimensions})`
7
+ },
8
+ toDriver(value: number[]): string {
9
+ return `[${value.join(',')}]`
10
+ },
11
+ fromDriver(value: unknown): number[] {
12
+ if (typeof value === 'string') {
13
+ const trimmed = value.startsWith('[') ? value.slice(1, -1) : value
14
+ return trimmed.split(',').map(Number)
15
+ }
16
+ return value as number[]
17
+ },
18
+ })(name)
19
+ }
20
+
21
+ export function tsvector(name: string) {
22
+ return customType<{ data: unknown; driverParam: unknown }>({
23
+ dataType() {
24
+ return 'tsvector'
25
+ },
26
+ })(name)
27
+ }
@@ -0,0 +1,4 @@
1
+ export { vector, tsvector } from './columns.js'
2
+ export { cosineDistance, cosineSimilarity, l2Distance, innerProduct, toTsvector, toTsquery, plainToTsquery, matches, headline, tsRank } from './query.js'
3
+ export type { HeadlineOptions } from './query.js'
4
+ export { validateVectorExtension } from './validate.js'
@@ -0,0 +1,33 @@
1
+ import { vector as vectorColumn, tsvector } from './columns.js'
2
+ import { cosineDistance, cosineSimilarity, l2Distance, innerProduct, toTsvector, toTsquery, plainToTsquery, matches, headline, tsRank } from './query.js'
3
+ import { validateVectorExtension } from './validate.js'
4
+
5
+ /** Vector and full-text search namespace — pgvector column types, similarity queries, and FTS operators. */
6
+ export const vector = {
7
+ /** Defines a vector(N) column for embeddings. */
8
+ column: vectorColumn,
9
+ /** Defines a tsvector column for full-text search. */
10
+ tsvector,
11
+ /** Cosine distance between a column and a query vector (lower = more similar). */
12
+ cosine: cosineDistance,
13
+ /** Cosine similarity (higher = more similar) — 1 - cosineDistance. */
14
+ cosineSimilarity,
15
+ /** L2 (Euclidean) distance between a column and a query vector. */
16
+ l2: l2Distance,
17
+ /** Inner product between a column and a query vector. */
18
+ innerProduct,
19
+ /** Converts text to a tsvector for full-text indexing. */
20
+ toTsvector,
21
+ /** Converts a search query string to a tsquery using to_tsquery (supports operators like &, |, !). */
22
+ toTsquery,
23
+ /** Converts natural language text to a tsquery using plainto_tsquery (no operator syntax required). */
24
+ plainToTsquery,
25
+ /** The @@ match operator — tests whether a tsvector column matches a tsquery. */
26
+ matches,
27
+ /** Generates a ts_headline search snippet with highlighted matches. */
28
+ headline,
29
+ /** Computes ts_rank for full-text search result ordering. Accepts a pre-built tsquery SQL or a raw query string. */
30
+ rank: tsRank,
31
+ /** Verifies the pgvector extension is installed and accessible. */
32
+ validate: validateVectorExtension,
33
+ }
@@ -0,0 +1,85 @@
1
+ import { sql } from '../db/sql.js'
2
+ import type { SQL, Column } from '../db/types.js'
3
+
4
+ export function cosineDistance(column: Column, query: readonly number[]): SQL<number> {
5
+ const vectorStr = `[${query.join(',')}]`
6
+ return sql<number>`${column} <=> ${vectorStr}::vector`
7
+ }
8
+
9
+ export function cosineSimilarity(column: Column, query: readonly number[]): SQL<number> {
10
+ const vectorStr = `[${query.join(',')}]`
11
+ return sql<number>`1 - (${column} <=> ${vectorStr}::vector)`
12
+ }
13
+
14
+ export function l2Distance(column: Column, query: readonly number[]): SQL<number> {
15
+ const vectorStr = `[${query.join(',')}]`
16
+ return sql<number>`${column} <-> ${vectorStr}::vector`
17
+ }
18
+
19
+ export function innerProduct(column: Column, query: readonly number[]): SQL<number> {
20
+ const vectorStr = `[${query.join(',')}]`
21
+ return sql<number>`${column} <#> ${vectorStr}::vector`
22
+ }
23
+
24
+ export function toTsvector(text: Column | string | SQL, config?: string): SQL {
25
+ const tsConfig = config ?? 'english'
26
+ if (typeof text === 'string') {
27
+ return sql`to_tsvector(${tsConfig}, ${text})`
28
+ }
29
+ return sql`to_tsvector(${tsConfig}, ${text})`
30
+ }
31
+
32
+ export function toTsquery(query: string, config?: string): SQL {
33
+ const tsConfig = config ?? 'english'
34
+ return sql`to_tsquery(${tsConfig}, ${query})`
35
+ }
36
+
37
+ export function plainToTsquery(query: string, config?: string): SQL {
38
+ const tsConfig = config ?? 'english'
39
+ return sql`plainto_tsquery(${tsConfig}, ${query})`
40
+ }
41
+
42
+ export function matches(column: Column | SQL, query: SQL): SQL<boolean> {
43
+ return sql<boolean>`${column} @@ ${query}`
44
+ }
45
+
46
+ export interface HeadlineOptions {
47
+ maxWords?: number
48
+ minWords?: number
49
+ shortWord?: number
50
+ highlightAll?: boolean
51
+ maxFragments?: number
52
+ fragmentDelimiter?: string
53
+ startSel?: string
54
+ stopSel?: string
55
+ }
56
+
57
+ export function headline(column: Column | SQL, query: SQL, config?: string, options?: HeadlineOptions): SQL<string> {
58
+ const tsConfig = config ?? 'english'
59
+ if (options === undefined) {
60
+ return sql<string>`ts_headline(${tsConfig}, ${column}, ${query})`
61
+ }
62
+ const optStr = formatHeadlineOptions(options)
63
+ return sql<string>`ts_headline(${tsConfig}, ${column}, ${query}, ${optStr})`
64
+ }
65
+
66
+ function formatHeadlineOptions(options: HeadlineOptions): string {
67
+ const parts: string[] = []
68
+ if (options.maxWords !== undefined) parts.push(`MaxWords=${String(options.maxWords)}`)
69
+ if (options.minWords !== undefined) parts.push(`MinWords=${String(options.minWords)}`)
70
+ if (options.shortWord !== undefined) parts.push(`ShortWord=${String(options.shortWord)}`)
71
+ if (options.highlightAll !== undefined) parts.push(`HighlightAll=${options.highlightAll ? 'TRUE' : 'FALSE'}`)
72
+ if (options.maxFragments !== undefined) parts.push(`MaxFragments=${String(options.maxFragments)}`)
73
+ if (options.fragmentDelimiter !== undefined) parts.push(`FragmentDelimiter=${options.fragmentDelimiter}`)
74
+ if (options.startSel !== undefined) parts.push(`StartSel=${options.startSel}`)
75
+ if (options.stopSel !== undefined) parts.push(`StopSel=${options.stopSel}`)
76
+ return parts.join(', ')
77
+ }
78
+
79
+ export function tsRank(column: Column | SQL, query: string | SQL, config?: string): SQL<number> {
80
+ const tsConfig = config ?? 'english'
81
+ if (typeof query === 'string') {
82
+ return sql<number>`ts_rank(${column}, to_tsquery(${tsConfig}, ${query}))`
83
+ }
84
+ return sql<number>`ts_rank(${column}, ${query})`
85
+ }
@@ -0,0 +1,16 @@
1
+ import { sql } from '../db/sql.js'
2
+ import type { DB } from '../db/index.js'
3
+
4
+ export async function validateVectorExtension(db: DB): Promise<void> {
5
+ const result = await db.execute(
6
+ sql`SELECT extname FROM pg_extension WHERE extname = 'vector'`,
7
+ )
8
+
9
+ if (result.length === 0) {
10
+ throw new Error(
11
+ '[pipework] pgvector extension not installed on this database.\n' +
12
+ "Run: CREATE EXTENSION IF NOT EXISTS vector;\n" +
13
+ "Or add 'vector' to your database's extensions list in pipework.config.ts.",
14
+ )
15
+ }
16
+ }
@@ -0,0 +1,15 @@
1
+ // Resolves the audit row's `actor_id` from the current `Flow.auth`. Audit
2
+ // lives downstream of auth, but it doesn't impose a brand — the audit row
3
+ // stores whatever the auth surface gave us as a free text. Mirrors the
4
+ // extraction the logging layer uses: `auth.userId` when present and string,
5
+ // null otherwise. Anything else (cron, worker without principal) → null.
6
+
7
+ import type { Flow } from '../../../request/context/types.js'
8
+
9
+ export function resolveActorId(flow: Flow): string | null {
10
+ const auth = flow.auth
11
+ if (auth === null || typeof auth !== 'object') return null
12
+ if (!('userId' in auth)) return null
13
+ const userId = (auth as { userId: unknown }).userId
14
+ return typeof userId === 'string' ? userId : null
15
+ }
@@ -0,0 +1,18 @@
1
+ // The shared column list for `audit_record` INSERT statements. Compiled once
2
+ // at module load from `auditRecordFields` (the same registry the table is
3
+ // built from) so the column order baked into every CTE-form INSERT matches
4
+ // the table's declared order. Re-ordering or adding fields on
5
+ // `auditRecordFields` is enough — the audit CTE generator picks it up.
6
+
7
+ import { quoteIdentifier } from '../../db/identifiers.js'
8
+ import { camelToSnake } from '../../domain/naming.js'
9
+ import { auditRecordFields, AUDIT_CHAIN_FIELD_KEYS } from '../../../audit/schema/audit-record-fields.js'
10
+
11
+ /** Field keys on `audit_record` an INSERT supplies (the chain columns are trigger-owned), in declaration order — the SELECT projection's positional order. */
12
+ export const AUDIT_FIELD_KEYS = (Object.keys(auditRecordFields) as ReadonlyArray<keyof typeof auditRecordFields>)
13
+ .filter(k => !AUDIT_CHAIN_FIELD_KEYS.has(k))
14
+
15
+ /** Quoted column list, comma-separated — the `INSERT INTO audit_record (...)` parenthetical. */
16
+ export const AUDIT_COLUMNS_SQL = AUDIT_FIELD_KEYS
17
+ .map(k => quoteIdentifier(camelToSnake(k), 'audit_record column'))
18
+ .join(', ')