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.
- package/CHANGELOG.md +11 -0
- package/dist/core/config/load.d.ts +2 -0
- package/dist/core/config/load.d.ts.map +1 -1
- package/dist/core/config/load.js +1 -0
- package/dist/core/config/load.js.map +1 -1
- package/dist/core/config/namespace.d.ts +1 -0
- package/dist/core/config/namespace.d.ts.map +1 -1
- package/dist/core/config/schema.d.ts +2 -0
- package/dist/core/config/schema.d.ts.map +1 -1
- package/dist/core/config/schema.js +1 -0
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/surface/types.d.ts +1 -0
- package/dist/core/surface/types.d.ts.map +1 -1
- package/dist/data/db/namespace.d.ts +3 -0
- package/dist/data/db/namespace.d.ts.map +1 -1
- package/dist/data/db/namespace.js +3 -0
- package/dist/data/db/namespace.js.map +1 -1
- package/dist/data/db/pool.d.ts.map +1 -1
- package/dist/data/db/pool.js +6 -1
- package/dist/data/db/pool.js.map +1 -1
- package/dist/data/db/query-label.d.ts +5 -0
- package/dist/data/db/query-label.d.ts.map +1 -0
- package/dist/data/db/query-label.js +11 -0
- package/dist/data/db/query-label.js.map +1 -0
- package/dist/data/db/query-watch.d.ts +21 -0
- package/dist/data/db/query-watch.d.ts.map +1 -0
- package/dist/data/db/query-watch.js +90 -0
- package/dist/data/db/query-watch.js.map +1 -0
- package/dist/data/query/postgres-js/driver.js +1 -1
- package/dist/data/query/postgres-js/driver.js.map +1 -1
- package/dist/data/query/postgres-js/session.d.ts +5 -1
- package/dist/data/query/postgres-js/session.d.ts.map +1 -1
- package/dist/data/query/postgres-js/session.js +16 -11
- package/dist/data/query/postgres-js/session.js.map +1 -1
- package/dist/data/query/utils.d.ts +2 -0
- package/dist/data/query/utils.d.ts.map +1 -1
- package/dist/data/query/utils.js.map +1 -1
- package/dist/infra/credits/schema.d.ts +1 -1
- package/dist/test/plugin.d.ts.map +1 -1
- package/dist/test/plugin.js +10 -4
- package/dist/test/plugin.js.map +1 -1
- package/package.json +4 -3
- package/src/async/jobs/abortable-delay.ts +18 -0
- package/src/async/jobs/claims.ts +52 -0
- package/src/async/jobs/cron.ts +179 -0
- package/src/async/jobs/errors.ts +56 -0
- package/src/async/jobs/exclusion.ts +117 -0
- package/src/async/jobs/execute.ts +219 -0
- package/src/async/jobs/index.ts +10 -0
- package/src/async/jobs/listener.ts +135 -0
- package/src/async/jobs/namespace.ts +20 -0
- package/src/async/jobs/queue-door.ts +44 -0
- package/src/async/jobs/queue.ts +1012 -0
- package/src/async/jobs/run-script.ts +67 -0
- package/src/async/jobs/scheduler.ts +218 -0
- package/src/async/jobs/schedules-table.ts +37 -0
- package/src/async/jobs/serialize-error.ts +48 -0
- package/src/async/jobs/table.ts +191 -0
- package/src/async/pipeline/define.ts +53 -0
- package/src/async/pipeline/errors.ts +35 -0
- package/src/async/pipeline/execute.ts +53 -0
- package/src/async/pipeline/index.ts +13 -0
- package/src/async/pipeline/namespace.ts +12 -0
- package/src/async/pipeline/resume.ts +67 -0
- package/src/async/pipeline/run-steps.ts +98 -0
- package/src/async/pipeline/types.ts +57 -0
- package/src/async/state-machine/define.ts +64 -0
- package/src/async/state-machine/errors.ts +29 -0
- package/src/async/state-machine/index.ts +3 -0
- package/src/async/state-machine/namespace.ts +12 -0
- package/src/async/state-machine/transition.ts +90 -0
- package/src/async/state-machine/types.ts +37 -0
- package/src/async/steps/errors.ts +31 -0
- package/src/async/steps/graph.ts +1214 -0
- package/src/async/steps/hash.ts +40 -0
- package/src/async/steps/index.ts +7 -0
- package/src/async/steps/namespace.ts +7 -0
- package/src/async/steps/table.ts +97 -0
- package/src/async/steps/types.ts +318 -0
- package/src/audit/chain/index.ts +9 -0
- package/src/audit/chain/install.ts +113 -0
- package/src/audit/chain/retire.ts +52 -0
- package/src/audit/chain/verify.ts +257 -0
- package/src/audit/query/cursor.ts +37 -0
- package/src/audit/query/index.ts +9 -0
- package/src/audit/query/query.ts +223 -0
- package/src/audit/schema/audit-record-fields.ts +68 -0
- package/src/audit/schema/audit-record.ts +23 -0
- package/src/auth/auth/audit.ts +31 -0
- package/src/auth/auth/chain.ts +84 -0
- package/src/auth/auth/cookie.ts +136 -0
- package/src/auth/auth/email-links.ts +311 -0
- package/src/auth/auth/guard.ts +128 -0
- package/src/auth/auth/index.ts +18 -0
- package/src/auth/auth/multi-org.ts +337 -0
- package/src/auth/auth/namespace.ts +34 -0
- package/src/auth/auth/parse-expiry.ts +13 -0
- package/src/auth/auth/passwords.ts +110 -0
- package/src/auth/auth/schema.ts +110 -0
- package/src/auth/auth/sessions.ts +565 -0
- package/src/auth/auth/sign-in.ts +156 -0
- package/src/auth/auth/signing-keys.ts +69 -0
- package/src/auth/auth/types.ts +26 -0
- package/src/auth/auth/uuid.ts +10 -0
- package/src/auth/rbac/cache.ts +55 -0
- package/src/auth/rbac/check.ts +30 -0
- package/src/auth/rbac/create.ts +35 -0
- package/src/auth/rbac/index.ts +5 -0
- package/src/auth/rbac/middleware.ts +20 -0
- package/src/auth/rbac/namespace.ts +15 -0
- package/src/auth/rbac/resolve.ts +31 -0
- package/src/auth/rbac/schema.sql +31 -0
- package/src/auth/rbac/seed.ts +67 -0
- package/src/auth/rbac/tables.ts +32 -0
- package/src/auth/rbac/types.ts +65 -0
- package/src/auth/tenant/extract.ts +33 -0
- package/src/auth/tenant/in-tenant.ts +49 -0
- package/src/auth/tenant/index.ts +7 -0
- package/src/auth/tenant/namespace.ts +23 -0
- package/src/auth/tenant/propagate.ts +20 -0
- package/src/auth/tenant/rls.ts +120 -0
- package/src/auth/tenant/scope.ts +33 -0
- package/src/auth/tenant/scoped-db.ts +581 -0
- package/src/auth/tenant/types.ts +14 -0
- package/src/auth/tenant/validate.ts +27 -0
- package/src/cli/commands/add.ts +158 -0
- package/src/cli/commands/alerts.ts +98 -0
- package/src/cli/commands/check.ts +1418 -0
- package/src/cli/commands/codemod.ts +78 -0
- package/src/cli/commands/db.ts +356 -0
- package/src/cli/commands/dev.ts +101 -0
- package/src/cli/commands/generate.ts +75 -0
- package/src/cli/commands/init.ts +36 -0
- package/src/cli/commands/install.ts +28 -0
- package/src/cli/commands/lint.ts +62 -0
- package/src/cli/commands/migrate.ts +132 -0
- package/src/cli/commands/openapi.ts +63 -0
- package/src/cli/commands/remove.ts +72 -0
- package/src/cli/commands/run.ts +50 -0
- package/src/cli/commands/scope.ts +54 -0
- package/src/cli/commands/serve.ts +68 -0
- package/src/cli/commands/shard.ts +31 -0
- package/src/cli/commands/shared/config-pipework-version.ts +28 -0
- package/src/cli/commands/shared/find-config.ts +22 -0
- package/src/cli/commands/shared/load-config.ts +35 -0
- package/src/cli/commands/shared/pnpm-install.ts +95 -0
- package/src/cli/commands/shared/report-removed.ts +8 -0
- package/src/cli/commands/sync.ts +32 -0
- package/src/cli/commands/test.ts +307 -0
- package/src/cli/commands/upgrade.ts +48 -0
- package/src/cli/dev-bootstrap.ts +24 -0
- package/src/cli/errors.ts +10 -0
- package/src/cli/index.ts +303 -0
- package/src/cli/output.ts +17 -0
- package/src/cli/port.ts +15 -0
- package/src/cli/surface-kinds.ts +20 -0
- package/src/client/index.ts +4 -0
- package/src/client/poll.ts +130 -0
- package/src/client/report-fault.ts +119 -0
- package/src/core/config/app-pool.ts +19 -0
- package/src/core/config/aws-env.ts +29 -0
- package/src/core/config/base-dir.ts +24 -0
- package/src/core/config/discover.ts +64 -0
- package/src/core/config/env-resolve.ts +87 -0
- package/src/core/config/env-types.ts +116 -0
- package/src/core/config/env.ts +55 -0
- package/src/core/config/errors.ts +9 -0
- package/src/core/config/import-config.ts +40 -0
- package/src/core/config/index.ts +8 -0
- package/src/core/config/load.ts +417 -0
- package/src/core/config/namespace.ts +14 -0
- package/src/core/config/resolve.ts +195 -0
- package/src/core/config/schema.ts +488 -0
- package/src/core/config/statement-observer.ts +48 -0
- package/src/core/config/ts-inline-hooks.ts +75 -0
- package/src/core/config/ts-register.ts +4 -0
- package/src/core/config/ts-resolve-hooks.ts +101 -0
- package/src/core/errors/base.ts +49 -0
- package/src/core/errors/http.ts +146 -0
- package/src/core/errors/index.ts +2 -0
- package/src/core/errors/namespace.ts +31 -0
- package/src/core/lifecycle/drain.ts +33 -0
- package/src/core/lifecycle/health.ts +72 -0
- package/src/core/lifecycle/index.ts +4 -0
- package/src/core/lifecycle/namespace.ts +7 -0
- package/src/core/lifecycle/startup.ts +102 -0
- package/src/core/lifecycle/types.ts +36 -0
- package/src/core/logging/context.ts +60 -0
- package/src/core/logging/error-chain.ts +68 -0
- package/src/core/logging/index.ts +5 -0
- package/src/core/logging/logger.ts +65 -0
- package/src/core/logging/namespace.ts +16 -0
- package/src/core/logging/proxy.ts +22 -0
- package/src/core/logging/redact-match.ts +24 -0
- package/src/core/logging/types.ts +47 -0
- package/src/core/pipework.ts +566 -0
- package/src/core/runtime/broker.ts +69 -0
- package/src/core/surface/http.ts +133 -0
- package/src/core/surface/index.ts +11 -0
- package/src/core/surface/job-timeout.ts +40 -0
- package/src/core/surface/namespace.ts +13 -0
- package/src/core/surface/script.ts +33 -0
- package/src/core/surface/start.ts +142 -0
- package/src/core/surface/types.ts +225 -0
- package/src/core/surface/validate.ts +88 -0
- package/src/core/surface/worker.ts +528 -0
- package/src/core/validation/connectivity.ts +49 -0
- package/src/core/validation/domain.ts +99 -0
- package/src/core/validation/index.ts +5 -0
- package/src/core/validation/queue-tables.ts +312 -0
- package/src/core/validation/rls-role.ts +138 -0
- package/src/core/validation/startup.ts +51 -0
- package/src/core/validation/surfaces.ts +65 -0
- package/src/core/validation/types.ts +25 -0
- package/src/data/db/advisory-lock.ts +55 -0
- package/src/data/db/aggregates.ts +172 -0
- package/src/data/db/array-elements.ts +111 -0
- package/src/data/db/bulk-set.ts +53 -0
- package/src/data/db/col/index.ts +14 -0
- package/src/data/db/composed.ts +53 -0
- package/src/data/db/db.ts +276 -0
- package/src/data/db/excluded.ts +16 -0
- package/src/data/db/expressions.ts +473 -0
- package/src/data/db/filter.ts +90 -0
- package/src/data/db/function-source.ts +114 -0
- package/src/data/db/identifiers.ts +16 -0
- package/src/data/db/idx/index.ts +9 -0
- package/src/data/db/in-list.ts +49 -0
- package/src/data/db/index.ts +9 -0
- package/src/data/db/insert-split.ts +137 -0
- package/src/data/db/instrumentation.ts +82 -0
- package/src/data/db/maintenance.ts +28 -0
- package/src/data/db/namespace.ts +107 -0
- package/src/data/db/owner-labels.ts +9 -0
- package/src/data/db/pool.ts +187 -0
- package/src/data/db/query-label.ts +13 -0
- package/src/data/db/query-watch.ts +116 -0
- package/src/data/db/raw-client-warning.ts +37 -0
- package/src/data/db/readonly.ts +23 -0
- package/src/data/db/reservation.ts +151 -0
- package/src/data/db/schema-features.ts +14 -0
- package/src/data/db/serializable.ts +83 -0
- package/src/data/db/sql.ts +1 -0
- package/src/data/db/timeouts.ts +76 -0
- package/src/data/db/types.ts +18 -0
- package/src/data/db/unbound.ts +33 -0
- package/src/data/db/values.ts +29 -0
- package/src/data/domain/brand.ts +15 -0
- package/src/data/domain/build-factory.ts +193 -0
- package/src/data/domain/build-schema.ts +161 -0
- package/src/data/domain/build-table.ts +355 -0
- package/src/data/domain/define.ts +239 -0
- package/src/data/domain/external-registry.ts +34 -0
- package/src/data/domain/external.ts +77 -0
- package/src/data/domain/field.ts +279 -0
- package/src/data/domain/index.ts +13 -0
- package/src/data/domain/naming.ts +6 -0
- package/src/data/domain/projections.ts +57 -0
- package/src/data/domain/trace-safe-projection.ts +31 -0
- package/src/data/domain/traits.ts +108 -0
- package/src/data/domain/types.ts +289 -0
- package/src/data/jsonb/composed.ts +18 -0
- package/src/data/jsonb/index.ts +1 -0
- package/src/data/jsonb/namespace.ts +30 -0
- package/src/data/jsonb/query.ts +86 -0
- package/src/data/migrate/append-only-generate.ts +47 -0
- package/src/data/migrate/applied.ts +47 -0
- package/src/data/migrate/apply.ts +309 -0
- package/src/data/migrate/check.ts +119 -0
- package/src/data/migrate/diff.ts +357 -0
- package/src/data/migrate/door-generate.ts +130 -0
- package/src/data/migrate/framework-rls.ts +58 -0
- package/src/data/migrate/generate.ts +201 -0
- package/src/data/migrate/history.ts +215 -0
- package/src/data/migrate/index.ts +9 -0
- package/src/data/migrate/internal-definitions.ts +175 -0
- package/src/data/migrate/post-process.ts +73 -0
- package/src/data/migrate/pragma.ts +73 -0
- package/src/data/migrate/provision-framework.ts +147 -0
- package/src/data/migrate/rls-generate.ts +61 -0
- package/src/data/migrate/run.ts +124 -0
- package/src/data/migrate/safety.ts +167 -0
- package/src/data/migrate/snapshot.ts +368 -0
- package/src/data/migrate/sql-emit.ts +392 -0
- package/src/data/migrate/statements.ts +312 -0
- package/src/data/query/alias.ts +126 -0
- package/src/data/query/batch.ts +8 -0
- package/src/data/query/cache/core/cache.ts +78 -0
- package/src/data/query/cache/core/index.ts +1 -0
- package/src/data/query/cache/core/types.ts +29 -0
- package/src/data/query/cache/readme.md +230 -0
- package/src/data/query/casing.ts +76 -0
- package/src/data/query/collation.ts +11 -0
- package/src/data/query/column-builder.ts +370 -0
- package/src/data/query/column.ts +150 -0
- package/src/data/query/entity.ts +42 -0
- package/src/data/query/errors.ts +33 -0
- package/src/data/query/index.ts +14 -0
- package/src/data/query/logger.ts +47 -0
- package/src/data/query/operations.ts +45 -0
- package/src/data/query/pg-core/alias.ts +12 -0
- package/src/data/query/pg-core/checks.ts +32 -0
- package/src/data/query/pg-core/columns/all.ts +71 -0
- package/src/data/query/pg-core/columns/bigint.ts +110 -0
- package/src/data/query/pg-core/columns/bigserial.ts +128 -0
- package/src/data/query/pg-core/columns/boolean.ts +43 -0
- package/src/data/query/pg-core/columns/char.ts +85 -0
- package/src/data/query/pg-core/columns/cidr.ts +43 -0
- package/src/data/query/pg-core/columns/common.ts +366 -0
- package/src/data/query/pg-core/columns/custom.ts +232 -0
- package/src/data/query/pg-core/columns/date.common.ts +15 -0
- package/src/data/query/pg-core/columns/date.ts +112 -0
- package/src/data/query/pg-core/columns/double-precision.ts +55 -0
- package/src/data/query/pg-core/columns/enum.ts +201 -0
- package/src/data/query/pg-core/columns/index.ts +35 -0
- package/src/data/query/pg-core/columns/inet.ts +43 -0
- package/src/data/query/pg-core/columns/int.common.ts +57 -0
- package/src/data/query/pg-core/columns/integer.ts +53 -0
- package/src/data/query/pg-core/columns/interval.ts +83 -0
- package/src/data/query/pg-core/columns/json.ts +58 -0
- package/src/data/query/pg-core/columns/jsonb.ts +56 -0
- package/src/data/query/pg-core/columns/line.ts +117 -0
- package/src/data/query/pg-core/columns/macaddr.ts +43 -0
- package/src/data/query/pg-core/columns/macaddr8.ts +43 -0
- package/src/data/query/pg-core/columns/numeric.ts +227 -0
- package/src/data/query/pg-core/columns/point.ts +127 -0
- package/src/data/query/pg-core/columns/postgis_extension/geometry.ts +119 -0
- package/src/data/query/pg-core/columns/postgis_extension/utils.ts +47 -0
- package/src/data/query/pg-core/columns/real.ts +58 -0
- package/src/data/query/pg-core/columns/serial.ts +55 -0
- package/src/data/query/pg-core/columns/smallint.ts +53 -0
- package/src/data/query/pg-core/columns/smallserial.ts +60 -0
- package/src/data/query/pg-core/columns/text.ts +67 -0
- package/src/data/query/pg-core/columns/time.ts +72 -0
- package/src/data/query/pg-core/columns/timestamp.ts +163 -0
- package/src/data/query/pg-core/columns/uuid.ts +51 -0
- package/src/data/query/pg-core/columns/varchar.ts +89 -0
- package/src/data/query/pg-core/columns/vector_extension/bit.ts +68 -0
- package/src/data/query/pg-core/columns/vector_extension/halfvec.ts +80 -0
- package/src/data/query/pg-core/columns/vector_extension/sparsevec.ts +67 -0
- package/src/data/query/pg-core/columns/vector_extension/vector.ts +80 -0
- package/src/data/query/pg-core/db.ts +674 -0
- package/src/data/query/pg-core/dialect.ts +1404 -0
- package/src/data/query/pg-core/expressions.ts +25 -0
- package/src/data/query/pg-core/foreign-keys.ts +130 -0
- package/src/data/query/pg-core/index.ts +21 -0
- package/src/data/query/pg-core/indexes.ts +276 -0
- package/src/data/query/pg-core/policies.ts +56 -0
- package/src/data/query/pg-core/primary-keys.ts +62 -0
- package/src/data/query/pg-core/query-builders/count.ts +86 -0
- package/src/data/query/pg-core/query-builders/delete.ts +293 -0
- package/src/data/query/pg-core/query-builders/index.ts +7 -0
- package/src/data/query/pg-core/query-builders/insert.ts +452 -0
- package/src/data/query/pg-core/query-builders/query-builder.ts +123 -0
- package/src/data/query/pg-core/query-builders/query.ts +157 -0
- package/src/data/query/pg-core/query-builders/raw.ts +49 -0
- package/src/data/query/pg-core/query-builders/refresh-materialized-view.ts +108 -0
- package/src/data/query/pg-core/query-builders/select.ts +1346 -0
- package/src/data/query/pg-core/query-builders/select.types.ts +437 -0
- package/src/data/query/pg-core/query-builders/update.ts +626 -0
- package/src/data/query/pg-core/roles.ts +41 -0
- package/src/data/query/pg-core/schema.ts +72 -0
- package/src/data/query/pg-core/sequence.ts +41 -0
- package/src/data/query/pg-core/session.ts +292 -0
- package/src/data/query/pg-core/subquery.ts +46 -0
- package/src/data/query/pg-core/table.ts +252 -0
- package/src/data/query/pg-core/unique-constraint.ts +73 -0
- package/src/data/query/pg-core/utils/array.ts +95 -0
- package/src/data/query/pg-core/utils/index.ts +1 -0
- package/src/data/query/pg-core/utils.ts +104 -0
- package/src/data/query/pg-core/view-base.ts +14 -0
- package/src/data/query/pg-core/view-common.ts +1 -0
- package/src/data/query/pg-core/view.ts +435 -0
- package/src/data/query/pg-core/with-builder.ts +41 -0
- package/src/data/query/postgres-js/README.md +46 -0
- package/src/data/query/postgres-js/array-parser.ts +45 -0
- package/src/data/query/postgres-js/driver-error-boundary.ts +149 -0
- package/src/data/query/postgres-js/driver.ts +163 -0
- package/src/data/query/postgres-js/index.ts +2 -0
- package/src/data/query/postgres-js/session.ts +234 -0
- package/src/data/query/primary-key.ts +11 -0
- package/src/data/query/query-builders/query-builder.ts +19 -0
- package/src/data/query/query-builders/select.types.ts +175 -0
- package/src/data/query/query-promise.ts +35 -0
- package/src/data/query/relations.ts +725 -0
- package/src/data/query/runnable-query.ts +12 -0
- package/src/data/query/selection-proxy.ts +121 -0
- package/src/data/query/session.ts +8 -0
- package/src/data/query/sql/expressions/conditions.ts +741 -0
- package/src/data/query/sql/expressions/index.ts +2 -0
- package/src/data/query/sql/expressions/select.ts +45 -0
- package/src/data/query/sql/functions/aggregate.ts +129 -0
- package/src/data/query/sql/functions/index.ts +2 -0
- package/src/data/query/sql/functions/vector.ts +178 -0
- package/src/data/query/sql/index.ts +3 -0
- package/src/data/query/sql/sql.ts +794 -0
- package/src/data/query/subquery.ts +53 -0
- package/src/data/query/table.ts +208 -0
- package/src/data/query/table.utils.ts +2 -0
- package/src/data/query/tracing-utils.ts +3 -0
- package/src/data/query/tracing.ts +11 -0
- package/src/data/query/utils.ts +357 -0
- package/src/data/query/version.ts +4 -0
- package/src/data/query/view-common.ts +1 -0
- package/src/data/schema/branded.ts +13 -0
- package/src/data/schema/generated/coerce.ts +5 -0
- package/src/data/schema/generated/combinator.ts +6 -0
- package/src/data/schema/generated/encoding.ts +5 -0
- package/src/data/schema/generated/error.ts +6 -0
- package/src/data/schema/generated/format.ts +5 -0
- package/src/data/schema/generated/type-constructor.ts +10 -0
- package/src/data/schema/generated/type.ts +6 -0
- package/src/data/schema/index.ts +6 -0
- package/src/data/schema/json-schema.ts +33 -0
- package/src/data/schema/namespace.ts +55 -0
- package/src/data/schema/parse.ts +39 -0
- package/src/data/schema/types.ts +39 -0
- package/src/data/temporal/append-only.ts +134 -0
- package/src/data/temporal/close.ts +27 -0
- package/src/data/temporal/columns.ts +10 -0
- package/src/data/temporal/definition-queries.ts +70 -0
- package/src/data/temporal/errors.ts +10 -0
- package/src/data/temporal/get-current.ts +22 -0
- package/src/data/temporal/index.ts +9 -0
- package/src/data/temporal/namespace.ts +36 -0
- package/src/data/temporal/query.ts +25 -0
- package/src/data/temporal/resolve.ts +17 -0
- package/src/data/temporal/revise.ts +67 -0
- package/src/data/temporal/types.ts +22 -0
- package/src/data/valve/artifact.ts +33 -0
- package/src/data/valve/contract-diff.ts +21 -0
- package/src/data/valve/cross.ts +57 -0
- package/src/data/valve/crossing-ledger.ts +50 -0
- package/src/data/valve/decision.ts +44 -0
- package/src/data/valve/durable-crossing.ts +52 -0
- package/src/data/valve/execute-crossing.ts +77 -0
- package/src/data/valve/faucet.ts +56 -0
- package/src/data/valve/gate.ts +114 -0
- package/src/data/valve/graph.ts +77 -0
- package/src/data/valve/index.ts +53 -0
- package/src/data/valve/namespace.ts +57 -0
- package/src/data/valve/registry.ts +50 -0
- package/src/data/valve/schema/valve-crossing-fields.ts +23 -0
- package/src/data/valve/schema/valve-crossing.ts +9 -0
- package/src/data/valve/supply.ts +154 -0
- package/src/data/valve/types.ts +143 -0
- package/src/data/vector/columns.ts +27 -0
- package/src/data/vector/index.ts +4 -0
- package/src/data/vector/namespace.ts +33 -0
- package/src/data/vector/query.ts +85 -0
- package/src/data/vector/validate.ts +16 -0
- package/src/data/write/audit/actor.ts +15 -0
- package/src/data/write/audit/audit-columns.ts +18 -0
- package/src/data/write/audit/audit-select.ts +111 -0
- package/src/data/write/audit/bound-transaction.ts +14 -0
- package/src/data/write/audit/cte-compile.ts +32 -0
- package/src/data/write/audit/decode-returning.ts +47 -0
- package/src/data/write/audit/final-select.ts +43 -0
- package/src/data/write/audit/infra-audit.ts +36 -0
- package/src/data/write/audit/primary-key.ts +65 -0
- package/src/data/write/audit/projection.ts +41 -0
- package/src/data/write/audit/read-touches.ts +86 -0
- package/src/data/write/audit/touch-match.ts +78 -0
- package/src/data/write/audit/verb-delete.ts +62 -0
- package/src/data/write/audit/verb-insert.ts +36 -0
- package/src/data/write/audit/verb-select.ts +47 -0
- package/src/data/write/audit/verb-update.ts +60 -0
- package/src/data/write/audit/verb-upsert.ts +104 -0
- package/src/data/write/conflict.ts +43 -0
- package/src/data/write/delete.ts +38 -0
- package/src/data/write/execute.ts +243 -0
- package/src/data/write/index.ts +11 -0
- package/src/data/write/insert.ts +63 -0
- package/src/data/write/state.ts +43 -0
- package/src/data/write/update.ts +54 -0
- package/src/data/write/upsert.ts +58 -0
- package/src/data/write/values.ts +19 -0
- package/src/index.ts +230 -0
- package/src/infra/access-links/code.ts +70 -0
- package/src/infra/access-links/handle.ts +892 -0
- package/src/infra/access-links/index.ts +9 -0
- package/src/infra/access-links/namespace.ts +30 -0
- package/src/infra/access-links/person-check.ts +177 -0
- package/src/infra/access-links/schema.ts +71 -0
- package/src/infra/alerts/async-sources.ts +231 -0
- package/src/infra/alerts/audit.ts +36 -0
- package/src/infra/alerts/beat.ts +123 -0
- package/src/infra/alerts/client-faults.ts +111 -0
- package/src/infra/alerts/faults.ts +156 -0
- package/src/infra/alerts/handle.ts +778 -0
- package/src/infra/alerts/http.ts +192 -0
- package/src/infra/alerts/index.ts +12 -0
- package/src/infra/alerts/infra-sources.ts +180 -0
- package/src/infra/alerts/namespace.ts +81 -0
- package/src/infra/alerts/redact.ts +21 -0
- package/src/infra/alerts/request-faults.ts +41 -0
- package/src/infra/alerts/schema.ts +124 -0
- package/src/infra/alerts/sinks.ts +125 -0
- package/src/infra/alerts/source-options.ts +26 -0
- package/src/infra/alerts/sources.ts +503 -0
- package/src/infra/alerts/subsystem-sources.ts +137 -0
- package/src/infra/audit/emit.ts +87 -0
- package/src/infra/audit/index.ts +2 -0
- package/src/infra/audit/namespace.ts +22 -0
- package/src/infra/audit/schema.sql +35 -0
- package/src/infra/audit/types.ts +18 -0
- package/src/infra/aws/credentials.ts +147 -0
- package/src/infra/aws/sigv4.ts +140 -0
- package/src/infra/cache/create.ts +58 -0
- package/src/infra/cache/entry.ts +81 -0
- package/src/infra/cache/index.ts +4 -0
- package/src/infra/cache/namespace.ts +10 -0
- package/src/infra/cache/tenant.ts +93 -0
- package/src/infra/cache/types.ts +24 -0
- package/src/infra/crawl/audit.ts +35 -0
- package/src/infra/crawl/errors.ts +25 -0
- package/src/infra/crawl/handle.ts +693 -0
- package/src/infra/crawl/index.ts +9 -0
- package/src/infra/crawl/links.ts +160 -0
- package/src/infra/crawl/namespace.ts +36 -0
- package/src/infra/crawl/robots.ts +100 -0
- package/src/infra/crawl/schema.ts +89 -0
- package/src/infra/credit-line/handle.ts +883 -0
- package/src/infra/credit-line/index.ts +6 -0
- package/src/infra/credit-line/namespace.ts +7 -0
- package/src/infra/credit-line/schema.ts +96 -0
- package/src/infra/credits/handle.ts +706 -0
- package/src/infra/credits/index.ts +5 -0
- package/src/infra/credits/namespace.ts +7 -0
- package/src/infra/credits/schema.ts +83 -0
- package/src/infra/email/audit.ts +36 -0
- package/src/infra/email/inbound.ts +622 -0
- package/src/infra/email/index.ts +11 -0
- package/src/infra/email/mail.ts +517 -0
- package/src/infra/email/mime.ts +447 -0
- package/src/infra/email/namespace.ts +22 -0
- package/src/infra/email/providers.ts +111 -0
- package/src/infra/email/schema.ts +96 -0
- package/src/infra/email/sns.ts +200 -0
- package/src/infra/email/unsubscribe.ts +44 -0
- package/src/infra/fetch/address.ts +88 -0
- package/src/infra/fetch/connect-retry.ts +87 -0
- package/src/infra/fetch/handle.ts +329 -0
- package/src/infra/fetch/index.ts +7 -0
- package/src/infra/fetch/namespace.ts +70 -0
- package/src/infra/idempotency/index.ts +3 -0
- package/src/infra/idempotency/middleware.ts +87 -0
- package/src/infra/idempotency/store.ts +92 -0
- package/src/infra/idempotency/types.ts +30 -0
- package/src/infra/join-requests/handle.ts +312 -0
- package/src/infra/join-requests/index.ts +2 -0
- package/src/infra/join-requests/namespace.ts +7 -0
- package/src/infra/join-requests/schema.ts +33 -0
- package/src/infra/outbox/core.ts +165 -0
- package/src/infra/quota/errors.ts +32 -0
- package/src/infra/quota/handle.ts +215 -0
- package/src/infra/quota/index.ts +5 -0
- package/src/infra/quota/namespace.ts +7 -0
- package/src/infra/quota/schema.ts +15 -0
- package/src/infra/storage/backend.ts +34 -0
- package/src/infra/storage/handle.ts +513 -0
- package/src/infra/storage/index.ts +9 -0
- package/src/infra/storage/local.ts +104 -0
- package/src/infra/storage/namespace.ts +13 -0
- package/src/infra/storage/s3.ts +257 -0
- package/src/infra/storage/schema.ts +24 -0
- package/src/infra/support/handle.ts +854 -0
- package/src/infra/support/http.ts +229 -0
- package/src/infra/support/index.ts +7 -0
- package/src/infra/support/namespace.ts +12 -0
- package/src/infra/support/schema.ts +96 -0
- package/src/infra/webhook/inbound.ts +45 -0
- package/src/infra/webhook/index.ts +5 -0
- package/src/infra/webhook/namespace.ts +24 -0
- package/src/infra/webhook/outbound.ts +315 -0
- package/src/infra/webhook/sign.ts +32 -0
- package/src/infra/webhook/verify.ts +82 -0
- package/src/invariants/assert.ts +26 -0
- package/src/invariants/index.ts +1 -0
- package/src/lint/config.ts +56 -0
- package/src/lint/doctrine.ts +163 -0
- package/src/lint/include.ts +97 -0
- package/src/lint/index.ts +3 -0
- package/src/lint/preset.ts +10 -0
- package/src/lint/resolver.ts +218 -0
- package/src/lint/rules/no-reexports.ts +46 -0
- package/src/request/behavior/audited.ts +85 -0
- package/src/request/behavior/cached.ts +62 -0
- package/src/request/behavior/compose.ts +28 -0
- package/src/request/behavior/index.ts +5 -0
- package/src/request/behavior/namespace.ts +16 -0
- package/src/request/behavior/types.ts +26 -0
- package/src/request/behavior/versioned.ts +54 -0
- package/src/request/context/create.ts +103 -0
- package/src/request/context/guard.ts +49 -0
- package/src/request/context/index.ts +4 -0
- package/src/request/context/run-in-transaction.ts +200 -0
- package/src/request/context/store.ts +28 -0
- package/src/request/context/types.ts +50 -0
- package/src/request/di/builder.ts +535 -0
- package/src/request/di/index.ts +8 -0
- package/src/request/di/resolve.ts +271 -0
- package/src/request/di/types.ts +262 -0
- package/src/request/fitting/namespace.ts +7 -0
- package/src/request/fixture/batch.ts +71 -0
- package/src/request/fixture/builder.ts +26 -0
- package/src/request/fixture/errors.ts +10 -0
- package/src/request/fixture/index.ts +8 -0
- package/src/request/fixture/namespace.ts +23 -0
- package/src/request/fixture/paginate.ts +44 -0
- package/src/request/fixture/to-handlers.ts +260 -0
- package/src/request/fixture/types.ts +79 -0
- package/src/request/flow/act-as.ts +78 -0
- package/src/request/flow/namespace.ts +17 -0
- package/src/request/http/error-step.ts +42 -0
- package/src/request/http/file.ts +141 -0
- package/src/request/http/index.ts +4 -0
- package/src/request/http/middleware.ts +141 -0
- package/src/request/http/namespace.ts +5 -0
- package/src/request/http/rate-limit-classes.ts +170 -0
- package/src/request/http/response.ts +82 -0
- package/src/request/http/server.ts +916 -0
- package/src/request/http/sniff.ts +261 -0
- package/src/request/http/types.ts +250 -0
- package/src/request/http/upload.ts +284 -0
- package/src/request/internal/text.ts +6 -0
- package/src/request/openapi/generate.ts +205 -0
- package/src/request/openapi/index.ts +2 -0
- package/src/request/openapi/namespace.ts +7 -0
- package/src/test/auth.ts +13 -0
- package/src/test/auto-setup.ts +45 -0
- package/src/test/context.ts +91 -0
- package/src/test/crawl-fixture.ts +157 -0
- package/src/test/discover-fork.ts +17 -0
- package/src/test/fingerprint.ts +135 -0
- package/src/test/globals.d.ts +7 -0
- package/src/test/index.ts +19 -0
- package/src/test/namespace.ts +87 -0
- package/src/test/plugin.ts +189 -0
- package/src/test/progress.ts +185 -0
- package/src/test/reap-after-run.ts +28 -0
- package/src/test/reap.ts +286 -0
- package/src/test/reset.ts +253 -0
- package/src/test/savepoints.ts +172 -0
- package/src/test/setup.ts +1422 -0
- package/src/test/system-channel.ts +50 -0
- package/src/test/vitest-plugin.ts +142 -0
- package/src/test/vitest-workspace.ts +507 -0
- package/src/test/vitest.ts +333 -0
- package/src/test/watch.ts +105 -0
- package/src/trace/capture/bounded-serializer.ts +146 -0
- package/src/trace/cardinality/analyze.ts +173 -0
- package/src/trace/cardinality/branch-context.ts +214 -0
- package/src/trace/cardinality/check.ts +33 -0
- package/src/trace/cardinality/classify-edge.ts +64 -0
- package/src/trace/cardinality/structural-max.ts +107 -0
- package/src/trace/check/coverage-check.ts +188 -0
- package/src/trace/check/flow-check.ts +103 -0
- package/src/trace/check/flow-step-site.ts +234 -0
- package/src/trace/check/io-pattern.ts +116 -0
- package/src/trace/codemod/add-cardinality.ts +152 -0
- package/src/trace/codemod/run.ts +80 -0
- package/src/trace/entry/child-trace.ts +21 -0
- package/src/trace/entry/close-trace.ts +87 -0
- package/src/trace/entry/finalize-trace.ts +28 -0
- package/src/trace/entry/open-trace.ts +138 -0
- package/src/trace/entry/parent-trace.ts +20 -0
- package/src/trace/entry/parse-traceparent.ts +39 -0
- package/src/trace/entry/process-start.ts +38 -0
- package/src/trace/entry/trace-context.ts +26 -0
- package/src/trace/entry/tracing-enabled.ts +10 -0
- package/src/trace/external/record.ts +195 -0
- package/src/trace/external/report.ts +66 -0
- package/src/trace/namespace.ts +19 -0
- package/src/trace/partition/day.ts +47 -0
- package/src/trace/partition/index.ts +14 -0
- package/src/trace/partition/partition-name.ts +23 -0
- package/src/trace/partition/plan.ts +82 -0
- package/src/trace/partition/schedule.ts +26 -0
- package/src/trace/partition/startup-hook.ts +39 -0
- package/src/trace/partition/sync.ts +154 -0
- package/src/trace/partition/tables.ts +53 -0
- package/src/trace/read/tree.ts +83 -0
- package/src/trace/retain/copy-on-error.ts +76 -0
- package/src/trace/runtime/expire-stale-traces.ts +54 -0
- package/src/trace/runtime/flow-step.ts +147 -0
- package/src/trace/runtime/flush-steps.ts +31 -0
- package/src/trace/runtime/pending-writes.ts +54 -0
- package/src/trace/runtime/step-buffer.ts +298 -0
- package/src/trace/runtime/step-error.ts +21 -0
- package/src/trace/runtime/step-meta.ts +55 -0
- package/src/trace/runtime/thenable.ts +12 -0
- package/src/trace/runtime/truncate-trace.ts +62 -0
- package/src/trace/schema/trace-fields.ts +52 -0
- package/src/trace/schema/trace-retained.ts +22 -0
- package/src/trace/schema/trace-step-fields.ts +44 -0
- package/src/trace/schema/trace-step-retained.ts +25 -0
- package/src/trace/schema/trace-step.ts +18 -0
- package/src/trace/schema/trace.ts +12 -0
- package/src/trace/transformer/apply.ts +79 -0
- package/src/trace/transformer/build-meta-literal.ts +30 -0
- package/src/trace/transformer/find-flow-step-sites.ts +85 -0
- package/src/trace/transformer/inject-flow-step-import.ts +39 -0
- package/src/trace/transformer/transform-error.ts +14 -0
- package/src/trace/transformer/transform-flow-steps.ts +123 -0
- package/src/trace/transformer/wrap-function-declaration.ts +62 -0
- package/src/trace/transformer/wrap-variable-declaration.ts +67 -0
- package/src/workspace/affected.ts +110 -0
- package/src/workspace/changed-files.ts +163 -0
- package/src/workspace/check-deps.ts +213 -0
- package/src/workspace/checksum.ts +20 -0
- package/src/workspace/dependency-graph.ts +67 -0
- package/src/workspace/detect-pipework-copies.ts +93 -0
- package/src/workspace/discover.ts +206 -0
- package/src/workspace/generate.ts +401 -0
- package/src/workspace/index.ts +7 -0
- package/src/workspace/module-imports-pipework.ts +39 -0
- package/src/workspace/module-package-name.ts +12 -0
- package/src/workspace/scrub-git-env.ts +23 -0
- package/src/workspace/source-paths.ts +36 -0
- package/src/workspace/sync.ts +182 -0
- package/dist/REFERENCE.md +0 -1477
- package/dist/infra/access-links/rate-limit.d.ts +0 -10
- package/dist/infra/access-links/rate-limit.d.ts.map +0 -1
- package/dist/infra/access-links/rate-limit.js +0 -28
- package/dist/infra/access-links/rate-limit.js.map +0 -1
- package/dist/infra/email/sigv4.d.ts +0 -24
- package/dist/infra/email/sigv4.d.ts.map +0 -1
- package/dist/infra/email/sigv4.js +0 -55
- 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,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
|
+
}
|