vouchington-tooling 0.34.0 → 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -221
- package/dist/agent-blackboard/feedback-audit-source.mjs +2 -2
- package/dist/agent-blackboard/feedback-canonical.mjs +1 -1
- package/dist/agent-blackboard/feedback-codec.mjs +3 -3
- package/dist/agent-blackboard/feedback-compose.mjs +5 -5
- package/dist/agent-blackboard/feedback-deadline.mjs +1 -1
- package/dist/agent-blackboard/feedback-delivery.mjs +6 -6
- package/dist/agent-blackboard/feedback-fields.mjs +1 -1
- package/dist/agent-blackboard/feedback-identity.mjs +3 -3
- package/dist/agent-blackboard/feedback-journal-audit.mjs +4 -4
- package/dist/agent-blackboard/feedback-journal-sandbox.mjs +1 -1
- package/dist/agent-blackboard/feedback-online-error.mjs +1 -1
- package/dist/agent-blackboard/feedback-online.mjs +7 -7
- package/dist/agent-blackboard/feedback-outbox-counts.mjs +2 -2
- package/dist/agent-blackboard/feedback-outbox.mjs +7 -7
- package/dist/agent-blackboard/index.mjs +13 -13
- package/dist/agent-blackboard/journal.mjs +3 -3
- package/dist/agent-blackboard/session-tools.mjs +4 -4
- package/dist/agent-blackboard/snapshot-cleanup-directory.mjs +3 -3
- package/dist/agent-blackboard/snapshot-cleanup-receipt.mjs +1 -1
- package/dist/agent-blackboard/snapshot-cleanup-resume.mjs +2 -2
- package/dist/agent-blackboard/snapshot-partition-cleanup.mjs +3 -3
- package/dist/agent-blackboard/snapshot-partition-format.mjs +3 -3
- package/dist/agent-blackboard/snapshot-partition-predicates.mjs +2 -2
- package/dist/agent-blackboard/snapshot-partition-read.mjs +2 -2
- package/dist/agent-blackboard/snapshot-partition-validate.mjs +2 -2
- package/dist/agent-blackboard/snapshot-partition-write.mjs +2 -2
- package/dist/agent-blackboard/snapshot-partitions.mjs +4 -4
- package/dist/agent-blackboard/snapshot.mjs +2 -2
- package/dist/agent-harness-identity/index.d.mts +1 -1
- package/dist/api-fixtures/fixture-contract-validation.mjs +1 -1
- package/dist/api-fixtures/index.mjs +3 -3
- package/dist/ast-grep-examples/companion-parity.mjs +1 -1
- package/dist/ast-grep-examples/index.mjs +1 -1
- package/dist/basic-auth-doc-sync/index.mjs +2 -2
- package/dist/basic-auth-doc-sync/runbook.mjs +4 -4
- package/dist/basic-auth-doc-sync/source.mjs +2 -2
- package/dist/browser-session-runner/attempt.mjs +5 -5
- package/dist/browser-session-runner/index.mjs +4 -4
- package/dist/browser-session-runner/output.mjs +1 -1
- package/dist/ci-local/index.mjs +2 -2
- package/dist/cli/commands/agent-blackboard-flags.mjs +1 -1
- package/dist/cli/commands/agent-blackboard.mjs +3 -3
- package/dist/cli/commands/ast-grep-examples.mjs +1 -1
- package/dist/cli/commands/ast-grep-pack.mjs +1 -1
- package/dist/cli/commands/gha-artifacts-cleanup.mjs +1 -1
- package/dist/cli/commands/gha-runtime-audit.mjs +1 -1
- package/dist/cli/commands/gha-workspace-policy.mjs +2 -2
- package/dist/cli/commands/http-origin.mjs +1 -1
- package/dist/cli/commands/link-skill.mjs +1 -1
- package/dist/cli/commands/mcp.mjs +2 -2
- package/dist/cli/commands/nuget-central-version.mjs +1 -1
- package/dist/cli/commands/pnpm-install.mjs +1 -1
- package/dist/cli/commands/prepare-vitest-reports.mjs +1 -1
- package/dist/cli/commands/require-up-to-date.mjs +1 -1
- package/dist/cli/commands/retrospective-facts.mjs +1 -1
- package/dist/cli/commands/retrospective-transcript.mjs +1 -1
- package/dist/cli/commands/runner-port-policy.mjs +1 -1
- package/dist/cli/commands/vitest-blob-manifest.mjs +1 -1
- package/dist/cli/commands/vitest-report-attempt.mjs +1 -1
- package/dist/cli/index.mjs +27 -27
- package/dist/cli/installed-version.mjs +1 -1
- package/dist/cli/parse-gha-runtime-audit.mjs +1 -1
- package/dist/cli/parse-options.mjs +2 -2
- package/dist/cli/parse.mjs +5 -5
- package/dist/compiler-build/index.mjs +3 -3
- package/dist/compiler-build/program.mjs +3 -3
- package/dist/config-inventory/collect.mjs +5 -5
- package/dist/config-inventory/dynamic-configs.mjs +1 -1
- package/dist/config-inventory/env-expression-readers.mjs +1 -1
- package/dist/config-inventory/env-prefix-readers.mjs +2 -2
- package/dist/config-inventory/env-var-accumulator.mjs +1 -1
- package/dist/config-inventory/env-vars.mjs +5 -5
- package/dist/config-inventory/index.mjs +2 -2
- package/dist/contract-schema/contract-schema-bounded-array.mjs +2 -2
- package/dist/contract-schema/contract-schema-extractor.mjs +3 -3
- package/dist/contract-schema/contract-schema-object-tuple.mjs +2 -2
- package/dist/contract-schema/contract-schema-type-extractor.mjs +5 -5
- package/dist/contract-schema/contract-schema-type-utils.mjs +2 -2
- package/dist/contract-schema/contract-schema-validator.mjs +1 -1
- package/dist/contract-schema/index.mjs +7 -7
- package/dist/contract-schema/type-query-call.mjs +3 -3
- package/dist/contract-schema/type-query.mjs +2 -2
- package/dist/contract-schema/virtual-program.mjs +1 -1
- package/dist/coverage-transport/control-v2-parse-object.mjs +2 -2
- package/dist/coverage-transport/control-v2.mjs +4 -4
- package/dist/coverage-transport/control.mjs +2 -2
- package/dist/coverage-transport/discovery.mjs +4 -4
- package/dist/coverage-transport/http.mjs +1 -1
- package/dist/coverage-transport/index.mjs +10 -10
- package/dist/coverage-transport/keys.mjs +1 -1
- package/dist/coverage-transport/lib.mjs +6 -6
- package/dist/coverage-transport/prefix-transfer.mjs +4 -4
- package/dist/coverage-transport/prefix.mjs +3 -3
- package/dist/coverage-transport/presign.mjs +1 -1
- package/dist/coverage-transport/vitest-blob-transport.mjs +2 -2
- package/dist/dependency-license-policy/collect.mjs +5 -5
- package/dist/dependency-license-policy/index.mjs +3 -3
- package/dist/dependency-license-policy/policy.mjs +1 -1
- package/dist/dependency-license-policy/workspace.mjs +1 -1
- package/dist/dockerfile-parse/index.mjs +2 -2
- package/dist/dockerfile-parse/prewarm-ports.mjs +1 -1
- package/dist/dockerfile-parse/runtime-cmd.mjs +2 -2
- package/dist/finite-enum-ripple/check.mjs +3 -3
- package/dist/finite-enum-ripple/compare.mjs +3 -5
- package/dist/finite-enum-ripple/component-paths.mjs +2 -2
- package/dist/finite-enum-ripple/configured-object-mutations.mjs +1 -1
- package/dist/finite-enum-ripple/create-page-jsx.mjs +1 -1
- package/dist/finite-enum-ripple/create-page-literals.mjs +4 -4
- package/dist/finite-enum-ripple/create-page-object-visitor.mjs +2 -2
- package/dist/finite-enum-ripple/create-page-properties.mjs +1 -1
- package/dist/finite-enum-ripple/index.mjs +1 -1
- package/dist/finite-enum-ripple/model.d.mts +4 -0
- package/dist/finite-enum-ripple/parser-support.mjs +16 -3
- package/dist/finite-enum-ripple/parsers.mjs +5 -3
- package/dist/finite-enum-ripple/structured-route-check.mjs +5 -5
- package/dist/finite-enum-ripple/types.mjs +3 -3
- package/dist/finite-enum-ripple/union-factory-check.mjs +2 -2
- package/dist/finite-enum-ripple/union-types.mjs +5 -5
- package/dist/gh-api-shell-quoting/index.mjs +2 -2
- package/dist/gh-api-shell-quoting/logical-line.mjs +1 -1
- package/dist/gh-api-shell-quoting/scan.mjs +1 -1
- package/dist/gh-api-shell-quoting/yaml.mjs +1 -1
- package/dist/gh-cli/index.mjs +4 -4
- package/dist/gha-artifacts-cleanup/commands.mjs +2 -2
- package/dist/gha-artifacts-cleanup/index.mjs +4 -4
- package/dist/gha-check-run/cli.mjs +2 -2
- package/dist/gha-check-run/index.mjs +2 -2
- package/dist/gha-claude-post-review/index.mjs +2 -2
- package/dist/gha-post-review/claude-token.d.mts +2 -2
- package/dist/gha-post-review/claude-token.mjs +1 -1
- package/dist/gha-post-review/cli.mjs +1 -1
- package/dist/gha-post-review/github.mjs +7 -7
- package/dist/gha-post-review/index.mjs +6 -6
- package/dist/gha-post-review/post.mjs +2 -2
- package/dist/gha-post-review/pull-io.mjs +1 -1
- package/dist/gha-post-review/token.mjs +1 -1
- package/dist/gha-pr-checkpoint/index.mjs +3 -3
- package/dist/gha-pr-checkpoint/resume.mjs +1 -1
- package/dist/gha-pr-checkpoint/update.mjs +1 -1
- package/dist/gha-review-payload/cli.mjs +2 -2
- package/dist/gha-review-payload/file.mjs +1 -1
- package/dist/gha-review-payload/index.mjs +4 -4
- package/dist/gha-review-payload/remap.mjs +1 -1
- package/dist/gha-runtime-audit/audit.mjs +4 -4
- package/dist/gha-runtime-audit/index.mjs +3 -3
- package/dist/gha-workspace-policy/docker-options.mjs +1 -1
- package/dist/gha-workspace-policy/docker-workspace-user.mjs +2 -2
- package/dist/gha-workspace-policy/index.mjs +3 -3
- package/dist/gha-workspace-policy/shell-tokens.mjs +1 -1
- package/dist/gha-workspace-policy/sparse-checkout.mjs +1 -1
- package/dist/github-projects/index.mjs +2 -2
- package/dist/github-projects/project-audit.mjs +1 -1
- package/dist/index.mjs +55 -55
- package/dist/markdown/content-facts.mjs +1 -1
- package/dist/markdown/document-sections.mjs +2 -2
- package/dist/markdown/html-blocks.mjs +1 -1
- package/dist/markdown/index.mjs +10 -10
- package/dist/markdown/sections.mjs +2 -2
- package/dist/markdown/tables.mjs +2 -2
- package/dist/markdown/tasks.mjs +1 -1
- package/dist/mcp-server/context.mjs +2 -2
- package/dist/mcp-server/dispatch.mjs +8 -8
- package/dist/mcp-server/git-fixture.test-helpers.mjs +1 -1
- package/dist/mcp-server/handlers-journal.mjs +4 -4
- package/dist/mcp-server/handlers-outbox.mjs +2 -2
- package/dist/mcp-server/handlers-session.mjs +3 -3
- package/dist/mcp-server/harness.test-helpers.mjs +4 -4
- package/dist/mcp-server/main.mjs +1 -1
- package/dist/mcp-server/run.mjs +3 -3
- package/dist/mcp-server/sdk.mjs +1 -1
- package/dist/mcp-server/server.mjs +2 -2
- package/dist/mcp-server/worktree.mjs +2 -2
- package/dist/nuget-central-version/cli.mjs +1 -1
- package/dist/openapi-document/build-openapi-catalog-sse.mjs +1 -1
- package/dist/openapi-document/build-openapi-document.mjs +8 -8
- package/dist/openapi-document/build-openapi-request.mjs +1 -1
- package/dist/openapi-document/build-openapi-response.mjs +3 -3
- package/dist/openapi-document/build-openapi-sse-events.mjs +1 -1
- package/dist/openapi-document/component-registry.mjs +1 -1
- package/dist/openapi-document/contract-schema-intersection-merge.mjs +1 -1
- package/dist/openapi-document/contract-schema-to-openapi.mjs +1 -1
- package/dist/openapi-document/index.mjs +12 -12
- package/dist/openapi-document/openapi-route-helpers.mjs +1 -1
- package/dist/pg-schema-snapshot/build-snapshot.mjs +3 -3
- package/dist/pg-schema-snapshot/catalog-objects.mjs +1 -1
- package/dist/pg-schema-snapshot/catalog-queries.mjs +4 -4
- package/dist/pg-schema-snapshot/catalog-table-constraints.mjs +1 -1
- package/dist/pg-schema-snapshot/catalog-table-indexes.mjs +1 -1
- package/dist/pg-schema-snapshot/catalog-tables.mjs +1 -1
- package/dist/pg-schema-snapshot/generate.mjs +5 -5
- package/dist/pg-schema-snapshot/index.mjs +6 -6
- package/dist/pg-schema-snapshot/markdown-files.mjs +1 -1
- package/dist/pg-schema-snapshot/render-markdown.mjs +1 -1
- package/dist/pg-schema-snapshot/table-snapshot-constraints.mjs +1 -1
- package/dist/pg-schema-snapshot/table-snapshot.mjs +3 -3
- package/dist/pnpm-deploy/index.mjs +3 -3
- package/dist/pnpm-deploy/restore.mjs +1 -1
- package/dist/pnpm-install/exec.mjs +1 -1
- package/dist/pnpm-install/index.mjs +8 -8
- package/dist/pnpm-install/install-operations.mjs +6 -6
- package/dist/pnpm-install/metadata-legacy.mjs +1 -1
- package/dist/pnpm-install/metadata.d.mts +1 -1
- package/dist/pnpm-install/metadata.mjs +2 -2
- package/dist/pnpm-install/native-health.mjs +2 -2
- package/dist/pnpm-install/pnpm-install-fixture.test-helpers.mjs +2 -2
- package/dist/pnpm-install/runner.mjs +7 -7
- package/dist/post-publication-inventory/index.d.mts +6 -0
- package/dist/post-publication-inventory/index.mjs +6 -2
- package/dist/post-publication-inventory/readers/compose-appends.d.mts +7 -0
- package/dist/post-publication-inventory/readers/compose-appends.mjs +38 -0
- package/dist/post-publication-inventory/readers/composes.d.mts +2 -0
- package/dist/post-publication-inventory/readers/composes.mjs +79 -0
- package/dist/post-publication-inventory/readers/composition.d.mts +2 -0
- package/dist/post-publication-inventory/readers/composition.mjs +62 -0
- package/dist/post-publication-inventory/readers/public-boundary-ast.d.mts +5 -0
- package/dist/post-publication-inventory/readers/public-boundary-ast.mjs +33 -0
- package/dist/post-publication-inventory/readers/public-boundary-consumed.d.mts +3 -0
- package/dist/post-publication-inventory/readers/public-boundary-consumed.mjs +39 -0
- package/dist/post-publication-inventory/readers/public-boundary-dataflow.d.mts +3 -0
- package/dist/post-publication-inventory/readers/public-boundary-dataflow.mjs +61 -0
- package/dist/post-publication-inventory/readers/public-boundary-then.d.mts +9 -0
- package/dist/post-publication-inventory/readers/public-boundary-then.mjs +31 -0
- package/dist/post-publication-inventory/readers/public-boundary.d.mts +3 -0
- package/dist/post-publication-inventory/readers/public-boundary.mjs +71 -0
- package/dist/post-publication-inventory/readers/public-view-ast.d.mts +6 -0
- package/dist/post-publication-inventory/readers/public-view-ast.mjs +67 -0
- package/dist/post-publication-inventory/readers/public-view-options.d.mts +8 -0
- package/dist/post-publication-inventory/readers/public-view-protection.d.mts +2 -0
- package/dist/post-publication-inventory/readers/public-view-protection.mjs +83 -0
- package/dist/post-publication-inventory/readers/public-view.d.mts +2 -0
- package/dist/post-publication-inventory/readers/public-view.mjs +117 -0
- package/dist/post-publication-inventory/readers/source-ast.d.mts +30 -0
- package/dist/post-publication-inventory/readers/source-ast.mjs +52 -0
- package/dist/post-publication-inventory/readers/source-executors.d.mts +4 -0
- package/dist/post-publication-inventory/readers/source-executors.mjs +38 -0
- package/dist/post-publication-inventory/readers/source-helpers.d.mts +16 -0
- package/dist/post-publication-inventory/readers/source-helpers.mjs +72 -0
- package/dist/post-publication-inventory/readers/source-options.d.mts +8 -0
- package/dist/post-publication-inventory/readers/source-sql.d.mts +3 -0
- package/dist/post-publication-inventory/readers/source-sql.mjs +17 -0
- package/dist/post-publication-inventory/readers/sql-executors.mjs +2 -2
- package/dist/post-publication-inventory/readers/sql-source.mjs +3 -3
- package/dist/post-publication-inventory/readers/sql-template.mjs +1 -1
- package/dist/post-publication-inventory/writers/source.mjs +1 -1
- package/dist/retrospective-facts/coverage.mjs +1 -1
- package/dist/retrospective-facts/foreign.mjs +3 -3
- package/dist/retrospective-facts/index.mjs +4 -4
- package/dist/retrospective-facts/local.mjs +4 -4
- package/dist/retrospective-transcript/claude-blocks.mjs +1 -1
- package/dist/retrospective-transcript/claude.mjs +2 -2
- package/dist/retrospective-transcript/codex-messages.mjs +1 -1
- package/dist/retrospective-transcript/codex-payload.mjs +2 -2
- package/dist/retrospective-transcript/codex-records.mjs +3 -3
- package/dist/retrospective-transcript/codex-segment.mjs +1 -1
- package/dist/retrospective-transcript/codex.mjs +2 -2
- package/dist/retrospective-transcript/index.mjs +9 -9
- package/dist/retrospective-transcript/resolve-transcript-file.mjs +2 -2
- package/dist/scc-complexity/baseline.mjs +2 -2
- package/dist/scc-complexity/index.mjs +8 -8
- package/dist/scc-complexity/parser.mjs +1 -1
- package/dist/scc-complexity/scope-config.mjs +1 -1
- package/dist/session-friction/audit-block.mjs +1 -1
- package/dist/session-friction/ci-failures.mjs +2 -2
- package/dist/session-friction/classify.mjs +2 -2
- package/dist/session-friction/coverage-ledger.mjs +1 -1
- package/dist/session-friction/index.mjs +5 -5
- package/dist/session-friction/log-file.mjs +2 -2
- package/dist/session-friction/log.mjs +7 -7
- package/dist/session-friction/normalize.mjs +1 -1
- package/dist/session-friction/report.mjs +5 -5
- package/dist/session-friction/sandbox.mjs +1 -1
- package/dist/session-friction/session-id.mjs +1 -1
- package/dist/shared-context/index.mjs +1 -1
- package/dist/skill-discovery/index.mjs +3 -3
- package/dist/sql-ast/add-column.mjs +1 -1
- package/dist/sql-ast/constraint-do-block.mjs +2 -2
- package/dist/sql-ast/constraint-shared.mjs +1 -1
- package/dist/sql-ast/constraint.mjs +4 -4
- package/dist/sql-ast/create-table.mjs +2 -2
- package/dist/sql-ast/drop-index.mjs +2 -2
- package/dist/sql-ast/implicit-indexes.mjs +1 -1
- package/dist/sql-ast/index-metadata.mjs +3 -3
- package/dist/sql-ast/index.mjs +8 -8
- package/dist/sql-scanner/comments.mjs +1 -1
- package/dist/sql-scanner/index.mjs +3 -3
- package/dist/sql-scanner/literals.mjs +1 -1
- package/dist/swift-semantic-equal/cli.mjs +1 -1
- package/dist/swift-semantic-equal/index.mjs +1 -1
- package/dist/transient-retry/index.mjs +2 -2
- package/dist/vitest-blob-manifest/cli.mjs +2 -2
- package/dist/vitest-blob-manifest/index.mjs +4 -4
- package/dist/vitest-blob-manifest/report-attempt-cli.mjs +2 -2
- package/dist/vitest-blob-manifest/report-attempt.mjs +1 -1
- package/dist/vitest-blob-manifest/reports-cli.mjs +3 -3
- package/dist/vitest-blob-manifest/reports-source.mjs +2 -2
- package/dist/vitest-blob-manifest/reports.mjs +2 -2
- package/dist/vitest-diagnostics/index.mjs +8 -8
- package/dist/vitest-diagnostics/vitest-fork-exit-records.mjs +1 -1
- package/dist/vitest-diagnostics/vitest-fork-exit-sentinel.mjs +2 -2
- package/dist/vitest-diagnostics/vitest-fork-leak-detection.mjs +2 -2
- package/dist/vitest-diagnostics/vitest-worker-exit-diagnostics-reporter.mjs +2 -2
- package/dist/workflow-policy/condition-entailment.mjs +1 -1
- package/dist/workflow-policy/index.d.mts +1 -3
- package/dist/workflow-policy/index.mjs +4 -6
- package/dist/workflow-policy/permission-inheritance.mjs +1 -1
- package/dist/workflow-policy/permission-mismatches.mjs +2 -2
- package/dist/workflow-policy/secret-readiness.mjs +2 -2
- package/dist/workflow-policy/types.d.mts +2 -28
- package/dist/workspace-gates/first-party-graph.mjs +2 -2
- package/dist/workspace-gates/index.mjs +1 -1
- package/dist/workspace-gates/manifest-version-assertions.mjs +2 -2
- package/dist/workspace-gates/manifest-version-parser.mjs +1 -1
- package/dist/workspace-gates/options.mjs +1 -1
- package/dist/workspace-gates/policy.mjs +7 -7
- package/dist/workspace-gates/test-helpers.d.mts +2 -2
- package/docs/workflow-and-compiler.md +7 -16
- package/package.json +3 -6
- package/dist/api-contract-discovery/header-contract-parser.d.mts +0 -3
- package/dist/api-contract-discovery/header-contract-parser.mjs +0 -93
- package/dist/api-contract-discovery/header-contract-registry.d.mts +0 -3
- package/dist/api-contract-discovery/header-contract-registry.mjs +0 -40
- package/dist/api-contract-discovery/header-contract-types.d.mts +0 -19
- package/dist/api-contract-discovery/index.d.mts +0 -34
- package/dist/api-contract-discovery/index.mjs +0 -27
- package/dist/api-contract-discovery/protocol-analysis-cache.d.mts +0 -21
- package/dist/api-contract-discovery/protocol-analysis-cache.mjs +0 -7
- package/dist/api-contract-discovery/protocol-body-status.d.mts +0 -2
- package/dist/api-contract-discovery/protocol-body-status.mjs +0 -4
- package/dist/api-contract-discovery/protocol-callback-argument-bindings.d.mts +0 -7
- package/dist/api-contract-discovery/protocol-callback-argument-bindings.mjs +0 -33
- package/dist/api-contract-discovery/protocol-callback-invocation.d.mts +0 -6
- package/dist/api-contract-discovery/protocol-callback-invocation.mjs +0 -111
- package/dist/api-contract-discovery/protocol-callback-mutations.d.mts +0 -5
- package/dist/api-contract-discovery/protocol-callback-mutations.mjs +0 -42
- package/dist/api-contract-discovery/protocol-callback-registration.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-callback-registration.mjs +0 -27
- package/dist/api-contract-discovery/protocol-callback-values.d.mts +0 -18
- package/dist/api-contract-discovery/protocol-callback-values.mjs +0 -114
- package/dist/api-contract-discovery/protocol-context-alias.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-context-alias.mjs +0 -20
- package/dist/api-contract-discovery/protocol-contract-extraction.d.mts +0 -9
- package/dist/api-contract-discovery/protocol-contract-extraction.mjs +0 -87
- package/dist/api-contract-discovery/protocol-contract-keys.d.mts +0 -1
- package/dist/api-contract-discovery/protocol-contract-keys.mjs +0 -8
- package/dist/api-contract-discovery/protocol-contract-registry.d.mts +0 -5
- package/dist/api-contract-discovery/protocol-contract-registry.mjs +0 -133
- package/dist/api-contract-discovery/protocol-executable-path.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-executable-path.mjs +0 -64
- package/dist/api-contract-discovery/protocol-execution-path.d.mts +0 -4
- package/dist/api-contract-discovery/protocol-execution-path.mjs +0 -16
- package/dist/api-contract-discovery/protocol-http-association.d.mts +0 -7
- package/dist/api-contract-discovery/protocol-http-association.mjs +0 -108
- package/dist/api-contract-discovery/protocol-http-body-kinds.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-http-body-kinds.mjs +0 -19
- package/dist/api-contract-discovery/protocol-http-context-callers.d.mts +0 -7
- package/dist/api-contract-discovery/protocol-http-context-callers.mjs +0 -40
- package/dist/api-contract-discovery/protocol-http-context-escapes.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-http-context-escapes.mjs +0 -95
- package/dist/api-contract-discovery/protocol-http-context.d.mts +0 -8
- package/dist/api-contract-discovery/protocol-http-context.mjs +0 -85
- package/dist/api-contract-discovery/protocol-http-emission.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-http-emission.mjs +0 -76
- package/dist/api-contract-discovery/protocol-http-implicit-taint.d.mts +0 -7
- package/dist/api-contract-discovery/protocol-http-implicit-taint.mjs +0 -26
- package/dist/api-contract-discovery/protocol-http-method-access.d.mts +0 -9
- package/dist/api-contract-discovery/protocol-http-method-access.mjs +0 -34
- package/dist/api-contract-discovery/protocol-http-method-mutations.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-http-method-mutations.mjs +0 -31
- package/dist/api-contract-discovery/protocol-http-reflect.d.mts +0 -5
- package/dist/api-contract-discovery/protocol-http-reflect.mjs +0 -45
- package/dist/api-contract-discovery/protocol-http-registration.d.mts +0 -12
- package/dist/api-contract-discovery/protocol-http-registration.mjs +0 -53
- package/dist/api-contract-discovery/protocol-http-response-mutations.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-http-response-mutations.mjs +0 -31
- package/dist/api-contract-discovery/protocol-marker-analysis.d.mts +0 -7
- package/dist/api-contract-discovery/protocol-marker-analysis.mjs +0 -50
- package/dist/api-contract-discovery/protocol-opaque-callback.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-opaque-callback.mjs +0 -107
- package/dist/api-contract-discovery/protocol-platform-callbacks.d.mts +0 -7
- package/dist/api-contract-discovery/protocol-platform-callbacks.mjs +0 -76
- package/dist/api-contract-discovery/protocol-platform-mutation-targets.d.mts +0 -5
- package/dist/api-contract-discovery/protocol-platform-mutation-targets.mjs +0 -89
- package/dist/api-contract-discovery/protocol-platform-writes.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-platform-writes.mjs +0 -92
- package/dist/api-contract-discovery/protocol-requested-keys.d.mts +0 -5
- package/dist/api-contract-discovery/protocol-requested-keys.mjs +0 -45
- package/dist/api-contract-discovery/protocol-sse-callers.d.mts +0 -7
- package/dist/api-contract-discovery/protocol-sse-callers.mjs +0 -67
- package/dist/api-contract-discovery/protocol-sse-emission.d.mts +0 -11
- package/dist/api-contract-discovery/protocol-sse-emission.mjs +0 -61
- package/dist/api-contract-discovery/protocol-sse-feasible-status.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-sse-feasible-status.mjs +0 -24
- package/dist/api-contract-discovery/protocol-sse-raw-writes.d.mts +0 -9
- package/dist/api-contract-discovery/protocol-sse-raw-writes.mjs +0 -99
- package/dist/api-contract-discovery/protocol-sse-status.d.mts +0 -3
- package/dist/api-contract-discovery/protocol-sse-status.mjs +0 -84
- package/dist/api-contract-discovery/protocol-sse-write-access.d.mts +0 -9
- package/dist/api-contract-discovery/protocol-sse-write-access.mjs +0 -42
- package/dist/api-contract-discovery/protocol-sse-write-helpers.d.mts +0 -7
- package/dist/api-contract-discovery/protocol-sse-write-helpers.mjs +0 -82
- package/dist/api-contract-discovery/protocol-sse-write-mutations.d.mts +0 -9
- package/dist/api-contract-discovery/protocol-sse-write-mutations.mjs +0 -42
- package/dist/api-contract-discovery/protocol-sse-write-resolution.d.mts +0 -14
- package/dist/api-contract-discovery/protocol-sse-write-resolution.mjs +0 -79
- package/dist/api-contract-discovery/protocol-status-dominance.d.mts +0 -5
- package/dist/api-contract-discovery/protocol-status-dominance.mjs +0 -35
- package/dist/api-contract-discovery/protocol-write-receiver.d.mts +0 -9
- package/dist/api-contract-discovery/protocol-write-receiver.mjs +0 -79
- package/dist/api-contract-discovery/query-contract-extraction.d.mts +0 -3
- package/dist/api-contract-discovery/query-contract-extraction.mjs +0 -82
- package/dist/api-contract-discovery/query-contract-literals.d.mts +0 -13
- package/dist/api-contract-discovery/query-contract-literals.mjs +0 -83
- package/dist/api-contract-discovery/query-contract-registry.d.mts +0 -3
- package/dist/api-contract-discovery/query-contract-registry.mjs +0 -70
- package/dist/api-contract-discovery/query-contract-types.d.mts +0 -8
- package/dist/api-contract-discovery/registered-route-binding-writes.d.mts +0 -4
- package/dist/api-contract-discovery/registered-route-binding-writes.mjs +0 -47
- package/dist/api-contract-discovery/registered-route-catalog.d.mts +0 -10
- package/dist/api-contract-discovery/registered-route-catalog.mjs +0 -85
- package/dist/api-contract-discovery/registered-route-factory-returns.d.mts +0 -3
- package/dist/api-contract-discovery/registered-route-factory-returns.mjs +0 -29
- package/dist/api-contract-discovery/registered-route-handler-analysis.d.mts +0 -12
- package/dist/api-contract-discovery/registered-route-handler-analysis.mjs +0 -119
- package/dist/api-contract-discovery/registered-route-handler-helpers.d.mts +0 -3
- package/dist/api-contract-discovery/registered-route-handler-helpers.mjs +0 -16
- package/dist/api-contract-discovery/registered-route-runtime-parameters.d.mts +0 -3
- package/dist/api-contract-discovery/registered-route-runtime-parameters.mjs +0 -5
- package/dist/api-contract-discovery/registered-route-terminal-error.d.mts +0 -3
- package/dist/api-contract-discovery/registered-route-terminal-error.mjs +0 -98
- package/dist/api-contract-discovery/request-contract-implicit.d.mts +0 -17
- package/dist/api-contract-discovery/request-contract-implicit.mjs +0 -73
- package/dist/api-contract-discovery/request-contract-lenient.d.mts +0 -28
- package/dist/api-contract-discovery/request-contract-lenient.mjs +0 -59
- package/dist/api-contract-discovery/request-contract-registry.d.mts +0 -14
- package/dist/api-contract-discovery/request-contract-registry.mjs +0 -63
- package/dist/api-contract-discovery/request-contract-route-analysis.d.mts +0 -25
- package/dist/api-contract-discovery/request-contract-route-analysis.mjs +0 -68
- package/dist/api-contract-discovery/request-contract-types.d.mts +0 -12
- package/dist/api-contract-discovery/request-contract-types.mjs +0 -1
- package/dist/api-contract-discovery/request-validation-callbacks.d.mts +0 -9
- package/dist/api-contract-discovery/request-validation-callbacks.mjs +0 -27
- package/dist/api-contract-discovery/request-validation-checker.d.mts +0 -7
- package/dist/api-contract-discovery/request-validation-checker.mjs +0 -25
- package/dist/api-contract-discovery/request-validation-conditional.d.mts +0 -6
- package/dist/api-contract-discovery/request-validation-conditional.mjs +0 -31
- package/dist/api-contract-discovery/request-validation-factory-calls.d.mts +0 -11
- package/dist/api-contract-discovery/request-validation-factory-calls.mjs +0 -23
- package/dist/api-contract-discovery/request-validation-facts.d.mts +0 -16
- package/dist/api-contract-discovery/request-validation-facts.mjs +0 -64
- package/dist/api-contract-discovery/request-validation-follow.d.mts +0 -24
- package/dist/api-contract-discovery/request-validation-follow.mjs +0 -38
- package/dist/api-contract-discovery/request-validation-handler-state.d.mts +0 -8
- package/dist/api-contract-discovery/request-validation-handler-state.mjs +0 -35
- package/dist/api-contract-discovery/request-validation-input.d.mts +0 -12
- package/dist/api-contract-discovery/request-validation-input.mjs +0 -43
- package/dist/api-contract-discovery/request-validation-keys.d.mts +0 -25
- package/dist/api-contract-discovery/request-validation-keys.mjs +0 -119
- package/dist/api-contract-discovery/request-validation-match.d.mts +0 -11
- package/dist/api-contract-discovery/request-validation-match.mjs +0 -47
- package/dist/api-contract-discovery/request-validation-mutation.d.mts +0 -7
- package/dist/api-contract-discovery/request-validation-mutation.mjs +0 -80
- package/dist/api-contract-discovery/request-validation-origin.d.mts +0 -20
- package/dist/api-contract-discovery/request-validation-origin.mjs +0 -71
- package/dist/api-contract-discovery/request-validation-reads.d.mts +0 -13
- package/dist/api-contract-discovery/request-validation-reads.mjs +0 -88
- package/dist/api-contract-discovery/request-validation-registration.d.mts +0 -9
- package/dist/api-contract-discovery/request-validation-registration.mjs +0 -32
- package/dist/api-contract-discovery/request-validation-report.d.mts +0 -3
- package/dist/api-contract-discovery/request-validation-report.mjs +0 -21
- package/dist/api-contract-discovery/request-validation-request-origin.d.mts +0 -5
- package/dist/api-contract-discovery/request-validation-request-origin.mjs +0 -13
- package/dist/api-contract-discovery/request-validation-select.d.mts +0 -9
- package/dist/api-contract-discovery/request-validation-select.mjs +0 -36
- package/dist/api-contract-discovery/request-validation-sites.d.mts +0 -9
- package/dist/api-contract-discovery/request-validation-sites.mjs +0 -77
- package/dist/api-contract-discovery/request-validation-state-key.d.mts +0 -13
- package/dist/api-contract-discovery/request-validation-state-key.mjs +0 -30
- package/dist/api-contract-discovery/request-validation-trace-helpers.d.mts +0 -14
- package/dist/api-contract-discovery/request-validation-trace-helpers.mjs +0 -80
- package/dist/api-contract-discovery/request-validation-trace-select.d.mts +0 -23
- package/dist/api-contract-discovery/request-validation-trace-select.mjs +0 -45
- package/dist/api-contract-discovery/request-validation-trace.d.mts +0 -8
- package/dist/api-contract-discovery/request-validation-trace.mjs +0 -130
- package/dist/api-contract-discovery/request-validation-types.d.mts +0 -84
- package/dist/api-contract-discovery/request-validation-types.mjs +0 -1
- package/dist/api-contract-discovery/request-validation-walker.d.mts +0 -26
- package/dist/api-contract-discovery/request-validation-walker.mjs +0 -143
- package/dist/api-contract-discovery/request-validation.test-helpers.d.mts +0 -39
- package/dist/api-contract-discovery/request-validation.test-helpers.mjs +0 -108
- package/dist/api-contract-discovery/response-contract-attribution-facts.d.mts +0 -2
- package/dist/api-contract-discovery/response-contract-attribution-facts.mjs +0 -18
- package/dist/api-contract-discovery/response-contract-attribution.d.mts +0 -3
- package/dist/api-contract-discovery/response-contract-attribution.mjs +0 -23
- package/dist/api-contract-discovery/response-contract-call-classification.d.mts +0 -3
- package/dist/api-contract-discovery/response-contract-call-classification.mjs +0 -37
- package/dist/api-contract-discovery/response-contract-ctx-analysis.d.mts +0 -7
- package/dist/api-contract-discovery/response-contract-ctx-analysis.mjs +0 -28
- package/dist/api-contract-discovery/response-contract-error-branch.d.mts +0 -15
- package/dist/api-contract-discovery/response-contract-error-branch.mjs +0 -150
- package/dist/api-contract-discovery/response-contract-handler-bindings.d.mts +0 -3
- package/dist/api-contract-discovery/response-contract-handler-bindings.mjs +0 -126
- package/dist/api-contract-discovery/response-contract-handler-calls.d.mts +0 -3
- package/dist/api-contract-discovery/response-contract-handler-calls.mjs +0 -81
- package/dist/api-contract-discovery/response-contract-implicit-sources.test-helpers.d.mts +0 -145
- package/dist/api-contract-discovery/response-contract-implicit-sources.test-helpers.mjs +0 -145
- package/dist/api-contract-discovery/response-contract-implicit-variants.d.mts +0 -2
- package/dist/api-contract-discovery/response-contract-implicit-variants.mjs +0 -6
- package/dist/api-contract-discovery/response-contract-implicit.d.mts +0 -6
- package/dist/api-contract-discovery/response-contract-implicit.mjs +0 -120
- package/dist/api-contract-discovery/response-contract-lenient.d.mts +0 -41
- package/dist/api-contract-discovery/response-contract-lenient.mjs +0 -52
- package/dist/api-contract-discovery/response-contract-media.d.mts +0 -3
- package/dist/api-contract-discovery/response-contract-media.mjs +0 -46
- package/dist/api-contract-discovery/response-contract-object-symbols.d.mts +0 -3
- package/dist/api-contract-discovery/response-contract-object-symbols.mjs +0 -80
- package/dist/api-contract-discovery/response-contract-property-mutations.d.mts +0 -5
- package/dist/api-contract-discovery/response-contract-property-mutations.mjs +0 -84
- package/dist/api-contract-discovery/response-contract-registration.d.mts +0 -11
- package/dist/api-contract-discovery/response-contract-registration.mjs +0 -65
- package/dist/api-contract-discovery/response-contract-registry.d.mts +0 -7
- package/dist/api-contract-discovery/response-contract-registry.mjs +0 -124
- package/dist/api-contract-discovery/response-contract-route-analysis.d.mts +0 -12
- package/dist/api-contract-discovery/response-contract-route-analysis.mjs +0 -65
- package/dist/api-contract-discovery/response-contract-route-syntax.d.mts +0 -7
- package/dist/api-contract-discovery/response-contract-route-syntax.mjs +0 -41
- package/dist/api-contract-discovery/response-contract-status.d.mts +0 -27
- package/dist/api-contract-discovery/response-contract-status.mjs +0 -82
- package/dist/api-contract-discovery/response-contract-symbols.d.mts +0 -5
- package/dist/api-contract-discovery/response-contract-symbols.mjs +0 -82
- package/dist/api-contract-discovery/response-contract-types.d.mts +0 -23
- package/dist/api-contract-discovery/response-contract-types.mjs +0 -1
- package/dist/api-contract-discovery/test-setup.test-helpers.d.mts +0 -3
- package/dist/api-contract-discovery/test-setup.test-helpers.mjs +0 -2
- package/dist/workflow-policy/concurrency-scope.d.mts +0 -4
- package/dist/workflow-policy/concurrency-scope.mjs +0 -66
- package/dist/workflow-policy/concurrency.d.mts +0 -10
- package/dist/workflow-policy/concurrency.mjs +0 -77
- package/dist/workflow-policy/graph.d.mts +0 -2
- package/dist/workflow-policy/graph.mjs +0 -138
- /package/dist/{api-contract-discovery/header-contract-types.mjs → post-publication-inventory/readers/public-view-options.mjs} +0 -0
- /package/dist/{api-contract-discovery/query-contract-types.mjs → post-publication-inventory/readers/source-options.mjs} +0 -0
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import ts from '../contract-schema/typescript-api.mjs';
|
|
2
|
-
export const HTTP_METHODS = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
|
|
3
|
-
export function isInlineRouteHandler(node) {
|
|
4
|
-
if ((!ts.isArrowFunction(node) && !ts.isFunctionExpression(node)) ||
|
|
5
|
-
!ts.isCallExpression(node.parent))
|
|
6
|
-
return false;
|
|
7
|
-
const method = propertyName(node.parent.expression)?.toUpperCase();
|
|
8
|
-
return (!!method && HTTP_METHODS.has(method) && !!routeTemplateFromExpression(node.parent.expression));
|
|
9
|
-
}
|
|
10
|
-
export function routeTemplateFromExpression(expression) {
|
|
11
|
-
if (!ts.isPropertyAccessExpression(expression))
|
|
12
|
-
return undefined;
|
|
13
|
-
return findRouteCall(expression.expression);
|
|
14
|
-
}
|
|
15
|
-
function findRouteCall(expression) {
|
|
16
|
-
if (!ts.isCallExpression(expression))
|
|
17
|
-
return undefined;
|
|
18
|
-
if (!ts.isPropertyAccessExpression(expression.expression))
|
|
19
|
-
return undefined;
|
|
20
|
-
if (expression.expression.name.text === 'route') {
|
|
21
|
-
const route = expression.arguments[0];
|
|
22
|
-
return route && ts.isStringLiteral(route) ? route.text : undefined;
|
|
23
|
-
}
|
|
24
|
-
return findRouteCall(expression.expression.expression);
|
|
25
|
-
}
|
|
26
|
-
export function propertyName(expression) {
|
|
27
|
-
return ts.isPropertyAccessExpression(expression) ? expression.name.text : undefined;
|
|
28
|
-
}
|
|
29
|
-
export function unwrapTransparentExpression(expression) {
|
|
30
|
-
while (ts.isParenthesizedExpression(expression) ||
|
|
31
|
-
ts.isAsExpression(expression) ||
|
|
32
|
-
ts.isTypeAssertionExpression(expression) ||
|
|
33
|
-
ts.isSatisfiesExpression(expression) ||
|
|
34
|
-
ts.isNonNullExpression(expression))
|
|
35
|
-
expression = expression.expression;
|
|
36
|
-
return expression;
|
|
37
|
-
}
|
|
38
|
-
export function visit(node, callback) {
|
|
39
|
-
callback(node);
|
|
40
|
-
node.forEachChild((child) => visit(child, callback));
|
|
41
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import ts from '../contract-schema/typescript-api.mts';
|
|
2
|
-
import type { BackendResponseContract } from './response-contract-types.mts';
|
|
3
|
-
export declare function responseStatusCodesForContract(contract: BackendResponseContract): number[];
|
|
4
|
-
/**
|
|
5
|
-
* Maps `METHOD:/route` to the non-error static `ctx.setStatus(NNN)` literal(s) found for that
|
|
6
|
-
* route binding: a plain literal contributes one status; `ctx.setStatus(cond ? A : B)` with both
|
|
7
|
-
* branches numeric contributes both (the doc can't know which branch fires at request time, so
|
|
8
|
-
* both are valid statuses for the operation). Statuses >= 400 are dropped per-branch: they mark
|
|
9
|
-
* hand-rolled error branches (the shared `default` -> `components/responses/Error` already
|
|
10
|
-
* documents error responses), and capturing them here would misattribute an error status to the
|
|
11
|
-
* whole operation. A route absent from the map never sets a non-error status explicitly (callers
|
|
12
|
-
* fall back to 200, or 204 when the response schema's root is `null`).
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* Resolves the status documented for one specific `apiResponse`/`apiNoContent` marker call: the
|
|
16
|
-
* nearest preceding sibling `ctx.setStatus(NNN)` literal, walking outward through enclosing
|
|
17
|
-
* blocks (mirroring `response-contract-implicit.mts`'s `precededByErrorStatus` walk). Unlike
|
|
18
|
-
* `collectRouteStatusCodes`, this has no `>=400` filter: an explicit `#variant` marker is a
|
|
19
|
-
* deliberate author opt-in to document that exact status (e.g. 422 for a `#validation` variant),
|
|
20
|
-
* and the route-wide map (keyed only on `method:routeTemplate`) can't tell two markers in the
|
|
21
|
-
* same route apart when they're preceded by different statuses.
|
|
22
|
-
*/
|
|
23
|
-
export declare function resolveEmissionStatus(call: ts.CallExpression | ts.NewExpression, matchesContext?: (expression: ts.Expression) => boolean): {
|
|
24
|
-
statusCodes?: readonly [number, ...number[]];
|
|
25
|
-
statusKnowledge: 'default' | 'explicit' | 'unknown';
|
|
26
|
-
unavailableReason?: string;
|
|
27
|
-
};
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import ts from '../contract-schema/typescript-api.mjs';
|
|
2
|
-
import { isContextMethod } from './response-contract-route-analysis.mjs';
|
|
3
|
-
export function responseStatusCodesForContract(contract) {
|
|
4
|
-
if (contract.statusKnowledge === 'unknown')
|
|
5
|
-
return [];
|
|
6
|
-
if (contract.statusCodes)
|
|
7
|
-
return [...new Set(contract.statusCodes)].toSorted((a, b) => a - b);
|
|
8
|
-
const bodyKind = contract.bodyKind ?? (contract.schema.root.type === 'null' ? 'none' : 'content');
|
|
9
|
-
return [bodyKind === 'none' ? 204 : 200];
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Maps `METHOD:/route` to the non-error static `ctx.setStatus(NNN)` literal(s) found for that
|
|
13
|
-
* route binding: a plain literal contributes one status; `ctx.setStatus(cond ? A : B)` with both
|
|
14
|
-
* branches numeric contributes both (the doc can't know which branch fires at request time, so
|
|
15
|
-
* both are valid statuses for the operation). Statuses >= 400 are dropped per-branch: they mark
|
|
16
|
-
* hand-rolled error branches (the shared `default` -> `components/responses/Error` already
|
|
17
|
-
* documents error responses), and capturing them here would misattribute an error status to the
|
|
18
|
-
* whole operation. A route absent from the map never sets a non-error status explicitly (callers
|
|
19
|
-
* fall back to 200, or 204 when the response schema's root is `null`).
|
|
20
|
-
*/
|
|
21
|
-
/**
|
|
22
|
-
* Resolves the status documented for one specific `apiResponse`/`apiNoContent` marker call: the
|
|
23
|
-
* nearest preceding sibling `ctx.setStatus(NNN)` literal, walking outward through enclosing
|
|
24
|
-
* blocks (mirroring `response-contract-implicit.mts`'s `precededByErrorStatus` walk). Unlike
|
|
25
|
-
* `collectRouteStatusCodes`, this has no `>=400` filter: an explicit `#variant` marker is a
|
|
26
|
-
* deliberate author opt-in to document that exact status (e.g. 422 for a `#validation` variant),
|
|
27
|
-
* and the route-wide map (keyed only on `method:routeTemplate`) can't tell two markers in the
|
|
28
|
-
* same route apart when they're preceded by different statuses.
|
|
29
|
-
*/
|
|
30
|
-
export function resolveEmissionStatus(call, matchesContext = (expression) => isContextMethod(expression, 'setStatus')) {
|
|
31
|
-
if (ts.isCallExpression(call) && matchesContext(call.expression))
|
|
32
|
-
return statusArgument(call.arguments[0]);
|
|
33
|
-
let statement = call;
|
|
34
|
-
while (!ts.isStatement(statement))
|
|
35
|
-
statement = statement.parent;
|
|
36
|
-
return precedingStatus(statement, matchesContext);
|
|
37
|
-
}
|
|
38
|
-
function precedingStatus(statement, matchesContext) {
|
|
39
|
-
const block = statement.parent;
|
|
40
|
-
if (!ts.isBlock(block))
|
|
41
|
-
return { statusKnowledge: 'default' };
|
|
42
|
-
const index = block.statements.indexOf(statement);
|
|
43
|
-
for (let i = index - 1; i >= 0; i--) {
|
|
44
|
-
const status = statusStatement(block.statements[i], matchesContext);
|
|
45
|
-
if (status)
|
|
46
|
-
return status;
|
|
47
|
-
}
|
|
48
|
-
const enclosing = block.parent;
|
|
49
|
-
return ts.isStatement(enclosing)
|
|
50
|
-
? precedingStatus(enclosing, matchesContext)
|
|
51
|
-
: { statusKnowledge: 'default' };
|
|
52
|
-
}
|
|
53
|
-
function statusStatement(statement, matchesContext) {
|
|
54
|
-
if (!ts.isExpressionStatement(statement))
|
|
55
|
-
return undefined;
|
|
56
|
-
const expression = statement.expression;
|
|
57
|
-
if (!ts.isCallExpression(expression) || !matchesContext(expression.expression))
|
|
58
|
-
return undefined;
|
|
59
|
-
return statusArgument(expression.arguments[0]);
|
|
60
|
-
}
|
|
61
|
-
/** A `ctx.setStatus` argument's possible numeric literal value(s): one for a bare literal, up to two (sorted ascending) for `cond ? A : B` when both branches are numeric literals. */
|
|
62
|
-
function statusArgument(argument) {
|
|
63
|
-
if (!argument)
|
|
64
|
-
return {
|
|
65
|
-
statusKnowledge: 'unknown',
|
|
66
|
-
unavailableReason: 'ctx.setStatus has no statically known status',
|
|
67
|
-
};
|
|
68
|
-
if (ts.isNumericLiteral(argument))
|
|
69
|
-
return { statusCodes: [Number(argument.text)], statusKnowledge: 'explicit' };
|
|
70
|
-
if (ts.isConditionalExpression(argument) &&
|
|
71
|
-
ts.isNumericLiteral(argument.whenTrue) &&
|
|
72
|
-
ts.isNumericLiteral(argument.whenFalse)) {
|
|
73
|
-
const values = [
|
|
74
|
-
...new Set([Number(argument.whenTrue.text), Number(argument.whenFalse.text)]),
|
|
75
|
-
].toSorted((a, b) => a - b);
|
|
76
|
-
return { statusCodes: values, statusKnowledge: 'explicit' };
|
|
77
|
-
}
|
|
78
|
-
return {
|
|
79
|
-
statusKnowledge: 'unknown',
|
|
80
|
-
unavailableReason: 'nearest ctx.setStatus value is dynamic',
|
|
81
|
-
};
|
|
82
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import ts from '../contract-schema/typescript-api.mts';
|
|
2
|
-
export declare function functionSymbol(node: ts.Node, checker: ts.TypeChecker): ts.Symbol | undefined;
|
|
3
|
-
export declare function attributionFunctionSymbol(node: ts.Node, checker: ts.TypeChecker): ts.Symbol | undefined;
|
|
4
|
-
export declare function resolveSymbol(symbol: ts.Symbol, checker: ts.TypeChecker): ts.Symbol;
|
|
5
|
-
export declare function attributionSymbol(symbol: ts.Symbol, checker: ts.TypeChecker): ts.Symbol;
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import ts from '../contract-schema/typescript-api.mjs';
|
|
2
|
-
export function functionSymbol(node, checker) {
|
|
3
|
-
if (ts.isFunctionDeclaration(node) && node.name)
|
|
4
|
-
return checker.getSymbolAtLocation(node.name);
|
|
5
|
-
if ((ts.isArrowFunction(node) || ts.isFunctionExpression(node)) &&
|
|
6
|
-
ts.isVariableDeclaration(node.parent) &&
|
|
7
|
-
ts.isIdentifier(node.parent.name)) {
|
|
8
|
-
return checker.getSymbolAtLocation(node.parent.name);
|
|
9
|
-
}
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
export function attributionFunctionSymbol(node, checker) {
|
|
13
|
-
const existing = functionSymbol(node, checker);
|
|
14
|
-
if (existing)
|
|
15
|
-
return existing;
|
|
16
|
-
if (ts.isMethodDeclaration(node) && node.name)
|
|
17
|
-
return checker.getSymbolAtLocation(node.name);
|
|
18
|
-
if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {
|
|
19
|
-
const owner = wrappedFunctionOwner(node);
|
|
20
|
-
if (owner &&
|
|
21
|
-
(ts.isVariableDeclaration(owner) ||
|
|
22
|
-
ts.isPropertyAssignment(owner) ||
|
|
23
|
-
ts.isPropertyDeclaration(owner))) {
|
|
24
|
-
return checker.getSymbolAtLocation(owner.name);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
if (ts.isFunctionDeclaration(node) &&
|
|
28
|
-
!node.name &&
|
|
29
|
-
ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Default)
|
|
30
|
-
return defaultExportSymbol(node.getSourceFile(), checker);
|
|
31
|
-
if ((ts.isArrowFunction(node) || ts.isFunctionExpression(node)) &&
|
|
32
|
-
isDefaultExportExpression(node))
|
|
33
|
-
return defaultExportSymbol(node.getSourceFile(), checker);
|
|
34
|
-
return undefined;
|
|
35
|
-
}
|
|
36
|
-
function wrappedFunctionOwner(node) {
|
|
37
|
-
let current = node;
|
|
38
|
-
let parent = current.parent;
|
|
39
|
-
while (ts.isParenthesizedExpression(parent) ||
|
|
40
|
-
ts.isAsExpression(parent) ||
|
|
41
|
-
ts.isTypeAssertionExpression(parent) ||
|
|
42
|
-
ts.isSatisfiesExpression(parent) ||
|
|
43
|
-
ts.isNonNullExpression(parent)) {
|
|
44
|
-
current = parent;
|
|
45
|
-
parent = current.parent;
|
|
46
|
-
}
|
|
47
|
-
if ((ts.isVariableDeclaration(parent) ||
|
|
48
|
-
ts.isPropertyAssignment(parent) ||
|
|
49
|
-
ts.isPropertyDeclaration(parent)) &&
|
|
50
|
-
parent.initializer === current)
|
|
51
|
-
return parent;
|
|
52
|
-
return undefined;
|
|
53
|
-
}
|
|
54
|
-
function isDefaultExportExpression(node) {
|
|
55
|
-
let current = node;
|
|
56
|
-
let parent = current.parent;
|
|
57
|
-
while ((ts.isParenthesizedExpression(parent) ||
|
|
58
|
-
ts.isAsExpression(parent) ||
|
|
59
|
-
ts.isTypeAssertionExpression(parent) ||
|
|
60
|
-
ts.isSatisfiesExpression(parent) ||
|
|
61
|
-
ts.isNonNullExpression(parent)) &&
|
|
62
|
-
parent.expression === current) {
|
|
63
|
-
current = parent;
|
|
64
|
-
parent = current.parent;
|
|
65
|
-
}
|
|
66
|
-
return ts.isExportAssignment(parent) && !parent.isExportEquals && parent.expression === current;
|
|
67
|
-
}
|
|
68
|
-
function defaultExportSymbol(sourceFile, checker) {
|
|
69
|
-
const moduleSymbol = checker.getSymbolAtLocation(sourceFile);
|
|
70
|
-
return (moduleSymbol &&
|
|
71
|
-
checker.getExportsOfModule(moduleSymbol).find((symbol) => symbol.getName() === 'default'));
|
|
72
|
-
}
|
|
73
|
-
export function resolveSymbol(symbol, checker) {
|
|
74
|
-
return symbol.flags & ts.SymbolFlags.Alias ? checker.getAliasedSymbol(symbol) : symbol;
|
|
75
|
-
}
|
|
76
|
-
export function attributionSymbol(symbol, checker) {
|
|
77
|
-
const resolved = resolveSymbol(symbol, checker);
|
|
78
|
-
const name = resolved.valueDeclaration?.name;
|
|
79
|
-
if (!name || !ts.isIdentifier(name))
|
|
80
|
-
return resolved;
|
|
81
|
-
return checker.getSymbolAtLocation(name) ?? resolved;
|
|
82
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { ExtractedResponseContract } from '../contract-schema/index.mts';
|
|
2
|
-
export type BackendResponseContract = ExtractedResponseContract & {
|
|
3
|
-
method: string;
|
|
4
|
-
routeTemplate: string;
|
|
5
|
-
/** Statuses owned by this response emission. Defaults to 200, or 204 for an unannotated empty emission. */
|
|
6
|
-
statusCodes?: readonly [number, ...number[]];
|
|
7
|
-
/** Distinguishes a known framework default from an explicitly set or genuinely unknown status. */
|
|
8
|
-
statusKnowledge?: 'default' | 'explicit' | 'unknown';
|
|
9
|
-
bodyKind?: 'content' | 'none';
|
|
10
|
-
/** Required for content emissions and absent for bodyless emissions. */
|
|
11
|
-
mediaType?: string;
|
|
12
|
-
/** Raw buffers and arbitrary streams have an unknown media type; bodyless emissions have none. */
|
|
13
|
-
mediaTypeKnowledge?: 'known' | 'none' | 'unknown';
|
|
14
|
-
/** Named SSE frames carried by the string stream body. */
|
|
15
|
-
sseEvents?: readonly {
|
|
16
|
-
eventName: string;
|
|
17
|
-
contract: ExtractedResponseContract;
|
|
18
|
-
}[];
|
|
19
|
-
/** A concrete error status can also be produced by the framework before dispatch. */
|
|
20
|
-
includeDefaultError?: boolean;
|
|
21
|
-
/** Set when the route's response schema could not be extracted (lenient discovery mode). */
|
|
22
|
-
unavailableReason?: string;
|
|
23
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export type ConcurrencyScope = 'fixed-resource' | 'pull-request' | 'ref' | 'sha' | 'run' | 'event' | 'input-resource';
|
|
2
|
-
export type NormalizedConcurrencyScope = Exclude<ConcurrencyScope, 'fixed-resource'> | `unsupported:${string}`;
|
|
3
|
-
export declare function extractConcurrencyScopes(group: string): NormalizedConcurrencyScope[];
|
|
4
|
-
export declare function normalizePolicyScopes(scopes: readonly ConcurrencyScope[]): NormalizedConcurrencyScope[];
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
const scopeOrder = [
|
|
2
|
-
'pull-request',
|
|
3
|
-
'ref',
|
|
4
|
-
'sha',
|
|
5
|
-
'run',
|
|
6
|
-
'event',
|
|
7
|
-
'input-resource',
|
|
8
|
-
];
|
|
9
|
-
const ignoredOwnerContexts = new Set(['github.workflow', 'github.run_attempt']);
|
|
10
|
-
const eventPayloadContexts = new Set([
|
|
11
|
-
'github.event_name',
|
|
12
|
-
'github.event.action',
|
|
13
|
-
'github.event.label.name',
|
|
14
|
-
'github.event.issue.number',
|
|
15
|
-
'github.event.schedule',
|
|
16
|
-
'github.event.workflow_run.event',
|
|
17
|
-
'github.event.workflow_run.id',
|
|
18
|
-
'github.event.workflow_run.workflow_id',
|
|
19
|
-
]);
|
|
20
|
-
function classifyContext(reference) {
|
|
21
|
-
if (ignoredOwnerContexts.has(reference))
|
|
22
|
-
return undefined;
|
|
23
|
-
if (reference === 'github.event.pull_request.number' ||
|
|
24
|
-
reference === 'github.event.workflow_run.pull_requests')
|
|
25
|
-
return 'pull-request';
|
|
26
|
-
if (reference === 'github.event.pull_request.head.sha' ||
|
|
27
|
-
reference === 'github.event.workflow_run.head_sha' ||
|
|
28
|
-
reference === 'github.sha')
|
|
29
|
-
return 'sha';
|
|
30
|
-
if (reference === 'github.ref' ||
|
|
31
|
-
reference === 'github.ref_name' ||
|
|
32
|
-
reference === 'github.event.workflow_run.head_branch')
|
|
33
|
-
return 'ref';
|
|
34
|
-
if (reference === 'github.run_id')
|
|
35
|
-
return 'run';
|
|
36
|
-
if (reference.startsWith('inputs.') ||
|
|
37
|
-
reference === 'github.event.inputs' ||
|
|
38
|
-
reference.startsWith('github.event.inputs.')) {
|
|
39
|
-
return 'input-resource';
|
|
40
|
-
}
|
|
41
|
-
if (eventPayloadContexts.has(reference))
|
|
42
|
-
return 'event';
|
|
43
|
-
return `unsupported:${reference}`;
|
|
44
|
-
}
|
|
45
|
-
function sortScopes(scopes) {
|
|
46
|
-
return [...new Set(scopes)].toSorted((left, right) => {
|
|
47
|
-
const leftIndex = scopeOrder.indexOf(left);
|
|
48
|
-
const rightIndex = scopeOrder.indexOf(right);
|
|
49
|
-
if (leftIndex === -1 || rightIndex === -1) {
|
|
50
|
-
if (leftIndex === rightIndex)
|
|
51
|
-
return left.localeCompare(right);
|
|
52
|
-
return leftIndex === -1 ? 1 : -1;
|
|
53
|
-
}
|
|
54
|
-
return leftIndex - rightIndex;
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
export function extractConcurrencyScopes(group) {
|
|
58
|
-
const references = group.match(/\b(?:github|inputs)(?:\.[A-Za-z_][\w-]*)+/gu) ?? [];
|
|
59
|
-
return sortScopes(references.flatMap((reference) => classifyContext(reference) ?? []));
|
|
60
|
-
}
|
|
61
|
-
export function normalizePolicyScopes(scopes) {
|
|
62
|
-
if (scopes.includes('fixed-resource')) {
|
|
63
|
-
return scopes.length === 1 ? [] : ['unsupported:fixed-resource-combination'];
|
|
64
|
-
}
|
|
65
|
-
return sortScopes(scopes.filter((scope) => scope !== 'fixed-resource'));
|
|
66
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { WorkflowTopology } from './types.mts';
|
|
2
|
-
import { type ConcurrencyScope } from './concurrency-scope.mts';
|
|
3
|
-
type ConcurrencyCancellationBehavior = 'cancel-running' | 'retain-running' | 'conditional';
|
|
4
|
-
export type ConcurrencyPolicy = {
|
|
5
|
-
pending: 'coalesce-latest' | 'fifo';
|
|
6
|
-
cancellation: ConcurrencyCancellationBehavior;
|
|
7
|
-
scope: readonly ConcurrencyScope[];
|
|
8
|
-
};
|
|
9
|
-
export declare function evaluateLockPolicy(topology: WorkflowTopology, unlockedWorkflowReasons: Readonly<Record<string, string>>, semanticPolicy: Readonly<Record<string, ConcurrencyPolicy>>): string[];
|
|
10
|
-
export {};
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { extractConcurrencyScopes, normalizePolicyScopes, } from './concurrency-scope.mjs';
|
|
2
|
-
function cancellation(value) {
|
|
3
|
-
return typeof value === 'string' ? 'conditional' : value ? 'cancel-running' : 'retain-running';
|
|
4
|
-
}
|
|
5
|
-
export function evaluateLockPolicy(topology, unlockedWorkflowReasons, semanticPolicy) {
|
|
6
|
-
const diagnostics = [];
|
|
7
|
-
const owners = [...topology.workflows, ...topology.jobs].filter((owner) => owner.concurrency);
|
|
8
|
-
const actualOwnerIds = new Set(owners.map((owner) => owner.id));
|
|
9
|
-
const declaredOwnerIds = new Set(Object.keys(semanticPolicy));
|
|
10
|
-
for (const id of [...actualOwnerIds].toSorted()) {
|
|
11
|
-
if (!declaredOwnerIds.has(id))
|
|
12
|
-
diagnostics.push(`lock intent missing: ${id}`);
|
|
13
|
-
}
|
|
14
|
-
for (const id of [...declaredOwnerIds].toSorted()) {
|
|
15
|
-
if (!actualOwnerIds.has(id))
|
|
16
|
-
diagnostics.push(`lock intent stale: ${id}`);
|
|
17
|
-
}
|
|
18
|
-
const jobsById = new Map(topology.jobs.map((job) => [job.id, job]));
|
|
19
|
-
for (const workflow of topology.workflows) {
|
|
20
|
-
const unlockedReason = unlockedWorkflowReasons[workflow.path];
|
|
21
|
-
const hasUnlockedJob = !workflow.concurrency &&
|
|
22
|
-
workflow.jobIds.some((jobId) => jobsById.get(jobId)?.concurrency === undefined);
|
|
23
|
-
if (hasUnlockedJob && !unlockedReason)
|
|
24
|
-
diagnostics.push(`lock intent missing: ${workflow.path}`);
|
|
25
|
-
if (!hasUnlockedJob && unlockedReason)
|
|
26
|
-
diagnostics.push(`unlocked reason stale: ${workflow.path}`);
|
|
27
|
-
if (unlockedReason !== undefined && unlockedReason.trim() === '')
|
|
28
|
-
diagnostics.push(`unlocked reason empty: ${workflow.path}`);
|
|
29
|
-
}
|
|
30
|
-
for (const path of Object.keys(unlockedWorkflowReasons).toSorted()) {
|
|
31
|
-
if (!topology.workflows.some((workflow) => workflow.path === path))
|
|
32
|
-
diagnostics.push(`unlocked reason stale: ${path}`);
|
|
33
|
-
}
|
|
34
|
-
for (const owner of owners) {
|
|
35
|
-
const declared = semanticPolicy[owner.id];
|
|
36
|
-
if (!declared || !owner.concurrency)
|
|
37
|
-
continue;
|
|
38
|
-
const cancelInProgress = owner.concurrency.effective.cancelInProgress;
|
|
39
|
-
if (typeof cancelInProgress === 'string' &&
|
|
40
|
-
!/^\$\{\{\s*\S[\s\S]*\}\}$/.test(cancelInProgress.trim()))
|
|
41
|
-
diagnostics.push(`conditional cancel-in-progress expression invalid: ${owner.id}: ${cancelInProgress}`);
|
|
42
|
-
const actualPending = owner.concurrency.effective.queue === 'max' ? 'fifo' : 'coalesce-latest';
|
|
43
|
-
if (actualPending !== declared.pending)
|
|
44
|
-
diagnostics.push(`concurrency pending mismatch: ${owner.id}: expected ${declared.pending}, got ${actualPending}`);
|
|
45
|
-
const actualCancellation = cancellation(owner.concurrency.effective.cancelInProgress);
|
|
46
|
-
if (actualCancellation !== declared.cancellation)
|
|
47
|
-
diagnostics.push(`concurrency cancellation mismatch: ${owner.id}: expected ${declared.cancellation}, got ${actualCancellation}`);
|
|
48
|
-
const actualScopes = extractConcurrencyScopes(owner.concurrency.effective.group);
|
|
49
|
-
const expectedScopes = normalizePolicyScopes(declared.scope);
|
|
50
|
-
if (JSON.stringify(actualScopes) !== JSON.stringify(expectedScopes))
|
|
51
|
-
diagnostics.push(`concurrency scope mismatch: ${owner.id}: expected ${expectedScopes.join(',')}, got ${actualScopes.join(',')}`);
|
|
52
|
-
}
|
|
53
|
-
diagnostics.push(...collisionDiagnostics(owners, topology));
|
|
54
|
-
return [...new Set(diagnostics)].toSorted();
|
|
55
|
-
}
|
|
56
|
-
function collisionDiagnostics(owners, topology) {
|
|
57
|
-
const workflowPathsById = new Map(topology.workflows.map((workflow) => [workflow.id, workflow.path]));
|
|
58
|
-
const ownerWorkflowPaths = new Map([
|
|
59
|
-
...topology.workflows.map((workflow) => [workflow.id, workflow.path]),
|
|
60
|
-
...topology.jobs.map((job) => [job.id, workflowPathsById.get(job.workflowId) ?? job.workflowId]),
|
|
61
|
-
]);
|
|
62
|
-
const groups = new Map();
|
|
63
|
-
for (const owner of owners) {
|
|
64
|
-
const group = owner.concurrency?.effective.group;
|
|
65
|
-
if (!group)
|
|
66
|
-
continue;
|
|
67
|
-
const normalizedGroup = group.toLocaleLowerCase('en-US');
|
|
68
|
-
const workflowPartition = /\$\{\{\s*github\.workflow\s*\}\}/.test(group)
|
|
69
|
-
? ownerWorkflowPaths.get(owner.id)
|
|
70
|
-
: '';
|
|
71
|
-
const key = `${normalizedGroup}\0${workflowPartition}`;
|
|
72
|
-
const entry = groups.get(key) ?? { group: normalizedGroup, ids: [] };
|
|
73
|
-
entry.ids.push(owner.id);
|
|
74
|
-
groups.set(key, entry);
|
|
75
|
-
}
|
|
76
|
-
return [...groups.values()].flatMap(({ group, ids }) => ids.length > 1 ? [`concurrency group collision: ${group}: ${ids.toSorted().join(', ')}`] : []);
|
|
77
|
-
}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
export function evaluateGraphPolicy(topology, index, policy) {
|
|
2
|
-
const diagnostics = [
|
|
3
|
-
...inventoryDiagnostics(topology, policy),
|
|
4
|
-
...jobPresenceDiagnostics(index, policy),
|
|
5
|
-
...edgeDiagnostics(index, policy.requiredDirectEdges, true, true),
|
|
6
|
-
...edgeDiagnostics(index, policy.forbiddenDirectEdges, true, false),
|
|
7
|
-
...edgeDiagnostics(index, policy.requiredTransitiveEdges, false, true),
|
|
8
|
-
...edgeDiagnostics(index, policy.forbiddenTransitiveEdges, false, false),
|
|
9
|
-
...artifactEdgeDiagnostics(index, policy),
|
|
10
|
-
...fanInDiagnostics(index, policy),
|
|
11
|
-
...callerDiagnostics(index, policy),
|
|
12
|
-
...stepOrderDiagnostics(index, policy),
|
|
13
|
-
];
|
|
14
|
-
return diagnostics.toSorted();
|
|
15
|
-
}
|
|
16
|
-
function artifactEdgeDiagnostics(index, policy) {
|
|
17
|
-
return policy.requiredArtifactEdges.flatMap((rule) => {
|
|
18
|
-
const label = `${rule.from} -> ${rule.to}: ${rule.name}${rule.match ? ` [${rule.match}]` : ''}`;
|
|
19
|
-
if (!index.jobsById.has(rule.from) || !index.jobsById.has(rule.to))
|
|
20
|
-
return [`required artifact edge missing: ${label}`];
|
|
21
|
-
const present = index
|
|
22
|
-
.artifactConsumersForProducerJob(rule.from)
|
|
23
|
-
.some((edge) => edge.to === rule.to &&
|
|
24
|
-
edge.name === rule.name &&
|
|
25
|
-
(rule.match === undefined || edge.match === rule.match));
|
|
26
|
-
return present ? [] : [`required artifact edge missing: ${label}`];
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
function inventoryDiagnostics(topology, policy) {
|
|
30
|
-
const jobsById = new Map(topology.jobs.map((job) => [job.id, job]));
|
|
31
|
-
const actual = new Map(topology.workflows.map((workflow) => [
|
|
32
|
-
workflow.path,
|
|
33
|
-
workflow.jobIds
|
|
34
|
-
.map((id) => jobsById.get(id)?.key ?? id)
|
|
35
|
-
.toSorted((a, b) => a.localeCompare(b)),
|
|
36
|
-
]));
|
|
37
|
-
const diagnostics = [];
|
|
38
|
-
for (const [path, keys] of actual) {
|
|
39
|
-
const expected = policy.jobInventory[path];
|
|
40
|
-
if (!expected)
|
|
41
|
-
diagnostics.push(`workflow inventory missing: ${path}`);
|
|
42
|
-
else if (JSON.stringify(keys) !== JSON.stringify([...expected].toSorted()))
|
|
43
|
-
diagnostics.push(`job inventory mismatch: ${path}: expected ${[...expected].toSorted().join(', ')}, got ${keys.join(', ')}`);
|
|
44
|
-
}
|
|
45
|
-
for (const path of Object.keys(policy.jobInventory).toSorted()) {
|
|
46
|
-
if (!actual.has(path))
|
|
47
|
-
diagnostics.push(`workflow inventory stale: ${path}`);
|
|
48
|
-
}
|
|
49
|
-
return diagnostics;
|
|
50
|
-
}
|
|
51
|
-
function jobPresenceDiagnostics(index, policy) {
|
|
52
|
-
const diagnostics = [];
|
|
53
|
-
for (const id of policy.requiredJobs)
|
|
54
|
-
if (!index.jobsById.has(id))
|
|
55
|
-
diagnostics.push(`required job missing: ${id}`);
|
|
56
|
-
for (const id of policy.forbiddenJobs)
|
|
57
|
-
if (index.jobsById.has(id))
|
|
58
|
-
diagnostics.push(`forbidden job present: ${id}`);
|
|
59
|
-
return diagnostics;
|
|
60
|
-
}
|
|
61
|
-
function edgeDiagnostics(index, rules, direct, required) {
|
|
62
|
-
return rules.flatMap(([from, to]) => {
|
|
63
|
-
if (!index.jobsById.has(from) || !index.jobsById.has(to))
|
|
64
|
-
return required
|
|
65
|
-
? [`required ${direct ? 'direct' : 'transitive'} edge missing: ${from} -> ${to}`]
|
|
66
|
-
: [];
|
|
67
|
-
const downstream = direct
|
|
68
|
-
? index.directDownstreamJobIds(from)
|
|
69
|
-
: index.transitiveDownstreamJobIds(from);
|
|
70
|
-
const present = downstream.includes(to);
|
|
71
|
-
return present === required
|
|
72
|
-
? []
|
|
73
|
-
: [
|
|
74
|
-
`${required ? 'required' : 'forbidden'} ${direct ? 'direct' : 'transitive'} edge ${required ? 'missing' : 'present'}: ${from} -> ${to}`,
|
|
75
|
-
];
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
function fanInDiagnostics(index, policy) {
|
|
79
|
-
return Object.entries(policy.exactFanIns).flatMap(([jobId, expected]) => {
|
|
80
|
-
if (!index.jobsById.has(jobId))
|
|
81
|
-
return [`exact fan-in target missing: ${jobId}`];
|
|
82
|
-
const actual = [...index.directUpstreamJobIds(jobId)].toSorted();
|
|
83
|
-
return JSON.stringify(actual) === JSON.stringify([...expected].toSorted())
|
|
84
|
-
? []
|
|
85
|
-
: [
|
|
86
|
-
`exact fan-in mismatch: ${jobId}: expected ${[...expected].toSorted().join(', ')}, got ${actual.join(', ')}`,
|
|
87
|
-
];
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
function callerDiagnostics(index, policy) {
|
|
91
|
-
const callablePaths = [];
|
|
92
|
-
for (const workflow of index.workflowsByPath.values())
|
|
93
|
-
if (workflow.callable)
|
|
94
|
-
callablePaths.push(workflow.path);
|
|
95
|
-
callablePaths.sort((left, right) => left.localeCompare(right));
|
|
96
|
-
const declaredPaths = Object.keys(policy.exactCallerJobs).toSorted();
|
|
97
|
-
const diagnostics = [];
|
|
98
|
-
for (const path of callablePaths)
|
|
99
|
-
if (!policy.exactCallerJobs[path])
|
|
100
|
-
diagnostics.push(`caller allowlist missing: ${path}`);
|
|
101
|
-
for (const path of declaredPaths)
|
|
102
|
-
if (!callablePaths.includes(path))
|
|
103
|
-
diagnostics.push(`caller allowlist stale: ${path}`);
|
|
104
|
-
diagnostics.push(...Object.entries(policy.exactCallerJobs).flatMap(([path, expected]) => {
|
|
105
|
-
if (!index.workflowsByPath.get(path)?.callable)
|
|
106
|
-
return [];
|
|
107
|
-
const actual = [...index.directCallerJobIds(path)].toSorted();
|
|
108
|
-
return JSON.stringify(actual) === JSON.stringify([...expected].toSorted())
|
|
109
|
-
? []
|
|
110
|
-
: [
|
|
111
|
-
`caller allowlist mismatch: ${path}: expected ${[...expected].toSorted().join(', ')}, got ${actual.join(', ')}`,
|
|
112
|
-
];
|
|
113
|
-
}));
|
|
114
|
-
return diagnostics;
|
|
115
|
-
}
|
|
116
|
-
function matches(selector, step) {
|
|
117
|
-
return ((selector.id === undefined || selector.id === step.id) &&
|
|
118
|
-
(selector.uses === undefined || selector.uses === step.uses) &&
|
|
119
|
-
(selector.name === undefined || selector.name === step.name));
|
|
120
|
-
}
|
|
121
|
-
function stepOrderDiagnostics(index, policy) {
|
|
122
|
-
return policy.stepOrders.flatMap((rule) => {
|
|
123
|
-
const job = index.jobsById.get(rule.jobId);
|
|
124
|
-
if (!job)
|
|
125
|
-
return [`step-order job missing: ${rule.jobId}`];
|
|
126
|
-
let prior = -1;
|
|
127
|
-
for (const selector of rule.steps) {
|
|
128
|
-
const step = job.steps.find((candidate) => matches(selector, candidate));
|
|
129
|
-
const label = selector.id ?? selector.uses ?? selector.name ?? '<step>';
|
|
130
|
-
if (!step)
|
|
131
|
-
return [`required ordered step missing: ${rule.jobId}: ${label}`];
|
|
132
|
-
if (step.index <= prior)
|
|
133
|
-
return [`required step order invalid: ${rule.jobId}: ${label}`];
|
|
134
|
-
prior = step.index;
|
|
135
|
-
}
|
|
136
|
-
return [];
|
|
137
|
-
});
|
|
138
|
-
}
|
|
File without changes
|