p-dev-harness 0.3.1 → 0.4.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 +12 -4
- package/dist/agents/cursor-provider.d.ts.map +1 -1
- package/dist/agents/cursor-provider.js +9 -8
- package/dist/agents/cursor-provider.js.map +1 -1
- package/dist/agents/index.d.ts +3 -4
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -5
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/types.d.ts +36 -2
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/artifacts/redact.d.ts +2 -0
- package/dist/artifacts/redact.d.ts.map +1 -1
- package/dist/artifacts/redact.js +15 -1
- package/dist/artifacts/redact.js.map +1 -1
- package/dist/artifacts/write-json-out-manifest.d.ts +17 -0
- package/dist/artifacts/write-json-out-manifest.d.ts.map +1 -0
- package/dist/artifacts/write-json-out-manifest.js +68 -0
- package/dist/artifacts/write-json-out-manifest.js.map +1 -0
- package/dist/cli/commands/canary-runner-config.d.ts +2 -0
- package/dist/cli/commands/canary-runner-config.d.ts.map +1 -0
- package/dist/cli/commands/canary-runner-config.js +6 -0
- package/dist/cli/commands/canary-runner-config.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +129 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/resolve-route.d.ts.map +1 -1
- package/dist/cli/commands/resolve-route.js +5 -0
- package/dist/cli/commands/resolve-route.js.map +1 -1
- package/dist/cli/commands/run.d.ts +1 -0
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +54 -12
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/sync-managed-runner.d.ts +7 -0
- package/dist/cli/commands/sync-managed-runner.d.ts.map +1 -0
- package/dist/cli/commands/sync-managed-runner.js +89 -0
- package/dist/cli/commands/sync-managed-runner.js.map +1 -0
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +27 -0
- package/dist/cli/program.js.map +1 -1
- package/dist/config/assert-cloud-config-fingerprint.d.ts +10 -0
- package/dist/config/assert-cloud-config-fingerprint.d.ts.map +1 -0
- package/dist/config/assert-cloud-config-fingerprint.js +26 -0
- package/dist/config/assert-cloud-config-fingerprint.js.map +1 -0
- package/dist/config/cloud-config-fingerprint.d.ts +26 -0
- package/dist/config/cloud-config-fingerprint.d.ts.map +1 -0
- package/dist/config/cloud-config-fingerprint.js +64 -0
- package/dist/config/cloud-config-fingerprint.js.map +1 -0
- package/dist/config/legacy-linear-top-level.d.ts +16 -0
- package/dist/config/legacy-linear-top-level.d.ts.map +1 -0
- package/dist/config/legacy-linear-top-level.js +42 -0
- package/dist/config/legacy-linear-top-level.js.map +1 -0
- package/dist/config/linear-association-gate.d.ts +26 -0
- package/dist/config/linear-association-gate.d.ts.map +1 -0
- package/dist/config/linear-association-gate.js +46 -0
- package/dist/config/linear-association-gate.js.map +1 -0
- package/dist/config/resolve-linear-team.d.ts +10 -0
- package/dist/config/resolve-linear-team.d.ts.map +1 -0
- package/dist/config/resolve-linear-team.js +24 -0
- package/dist/config/resolve-linear-team.js.map +1 -0
- package/dist/config/resolve-linear-workspace.d.ts +83 -0
- package/dist/config/resolve-linear-workspace.d.ts.map +1 -0
- package/dist/config/resolve-linear-workspace.js +244 -0
- package/dist/config/resolve-linear-workspace.js.map +1 -0
- package/dist/config/role-models.d.ts +160 -0
- package/dist/config/role-models.d.ts.map +1 -0
- package/dist/config/role-models.js +31 -0
- package/dist/config/role-models.js.map +1 -0
- package/dist/config/runner-upgrade-sync-gate.d.ts +10 -0
- package/dist/config/runner-upgrade-sync-gate.d.ts.map +1 -0
- package/dist/config/runner-upgrade-sync-gate.js +24 -0
- package/dist/config/runner-upgrade-sync-gate.js.map +1 -0
- package/dist/config/schema.d.ts +266 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +14 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config/types.d.ts +1 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/workspace-root.d.ts +7 -0
- package/dist/config/workspace-root.d.ts.map +1 -0
- package/dist/config/workspace-root.js +21 -0
- package/dist/config/workspace-root.js.map +1 -0
- package/dist/cursor/agent-factory.d.ts +8 -0
- package/dist/cursor/agent-factory.d.ts.map +1 -1
- package/dist/cursor/agent-factory.js +34 -5
- package/dist/cursor/agent-factory.js.map +1 -1
- package/dist/cursor/builder-resume-errors.d.ts +3 -0
- package/dist/cursor/builder-resume-errors.d.ts.map +1 -0
- package/dist/cursor/builder-resume-errors.js +32 -0
- package/dist/cursor/builder-resume-errors.js.map +1 -0
- package/dist/cursor/model.d.ts +18 -22
- package/dist/cursor/model.d.ts.map +1 -1
- package/dist/cursor/model.js +73 -25
- package/dist/cursor/model.js.map +1 -1
- package/dist/cursor/run-observer.d.ts +8 -1
- package/dist/cursor/run-observer.d.ts.map +1 -1
- package/dist/cursor/run-observer.js +9 -1
- package/dist/cursor/run-observer.js.map +1 -1
- package/dist/github/auth-verification-retry.d.ts +12 -0
- package/dist/github/auth-verification-retry.d.ts.map +1 -0
- package/dist/github/auth-verification-retry.js +47 -0
- package/dist/github/auth-verification-retry.js.map +1 -0
- package/dist/github/client.d.ts +53 -4
- package/dist/github/client.d.ts.map +1 -1
- package/dist/github/client.js +108 -7
- package/dist/github/client.js.map +1 -1
- package/dist/gui/configure-health.js +2 -2
- package/dist/gui/configure-health.js.map +1 -1
- package/dist/gui/repo-root.d.ts +3 -0
- package/dist/gui/repo-root.d.ts.map +1 -1
- package/dist/gui/repo-root.js +16 -1
- package/dist/gui/repo-root.js.map +1 -1
- package/dist/gui/start-configure-stable.js +6 -2
- package/dist/gui/start-configure-stable.js.map +1 -1
- package/dist/gui/start-gui.js +7 -3
- package/dist/gui/start-gui.js.map +1 -1
- package/dist/linear/client.d.ts +4 -0
- package/dist/linear/client.d.ts.map +1 -1
- package/dist/linear/client.js +7 -0
- package/dist/linear/client.js.map +1 -1
- package/dist/linear/comments.d.ts +9 -0
- package/dist/linear/comments.d.ts.map +1 -1
- package/dist/linear/comments.js +34 -0
- package/dist/linear/comments.js.map +1 -1
- package/dist/linear/issue-query.d.ts +1 -0
- package/dist/linear/issue-query.d.ts.map +1 -1
- package/dist/linear/issue-query.js +3 -0
- package/dist/linear/issue-query.js.map +1 -1
- package/dist/linear/markers.d.ts +7 -0
- package/dist/linear/markers.d.ts.map +1 -1
- package/dist/linear/markers.js +21 -0
- package/dist/linear/markers.js.map +1 -1
- package/dist/linear/parser.d.ts +2 -1
- package/dist/linear/parser.d.ts.map +1 -1
- package/dist/linear/parser.js +46 -0
- package/dist/linear/parser.js.map +1 -1
- package/dist/linear/project-harness-metadata.d.ts +10 -0
- package/dist/linear/project-harness-metadata.d.ts.map +1 -0
- package/dist/linear/project-harness-metadata.js +109 -0
- package/dist/linear/project-harness-metadata.js.map +1 -0
- package/dist/linear/project-metadata-sync.d.ts +29 -0
- package/dist/linear/project-metadata-sync.d.ts.map +1 -0
- package/dist/linear/project-metadata-sync.js +64 -0
- package/dist/linear/project-metadata-sync.js.map +1 -0
- package/dist/linear/run-status-comment.d.ts +49 -0
- package/dist/linear/run-status-comment.d.ts.map +1 -0
- package/dist/linear/run-status-comment.js +118 -0
- package/dist/linear/run-status-comment.js.map +1 -0
- package/dist/linear/writer.d.ts +8 -0
- package/dist/linear/writer.d.ts.map +1 -1
- package/dist/linear/writer.js +13 -0
- package/dist/linear/writer.js.map +1 -1
- package/dist/observability/adapters/fake.d.ts +17 -0
- package/dist/observability/adapters/fake.d.ts.map +1 -0
- package/dist/observability/adapters/fake.js +205 -0
- package/dist/observability/adapters/fake.js.map +1 -0
- package/dist/observability/adapters/noop.d.ts +5 -0
- package/dist/observability/adapters/noop.d.ts.map +1 -0
- package/dist/observability/adapters/noop.js +51 -0
- package/dist/observability/adapters/noop.js.map +1 -0
- package/dist/observability/adapters/posthog.d.ts +12 -0
- package/dist/observability/adapters/posthog.d.ts.map +1 -0
- package/dist/observability/adapters/posthog.js +142 -0
- package/dist/observability/adapters/posthog.js.map +1 -0
- package/dist/observability/adapters/sentry.d.ts +12 -0
- package/dist/observability/adapters/sentry.d.ts.map +1 -0
- package/dist/observability/adapters/sentry.js +217 -0
- package/dist/observability/adapters/sentry.js.map +1 -0
- package/dist/observability/analytics-schemas.d.ts +59 -0
- package/dist/observability/analytics-schemas.d.ts.map +1 -0
- package/dist/observability/analytics-schemas.js +119 -0
- package/dist/observability/analytics-schemas.js.map +1 -0
- package/dist/observability/consent.d.ts +14 -0
- package/dist/observability/consent.d.ts.map +1 -0
- package/dist/observability/consent.js +35 -0
- package/dist/observability/consent.js.map +1 -0
- package/dist/observability/constants.d.ts +18 -0
- package/dist/observability/constants.d.ts.map +1 -0
- package/dist/observability/constants.js +18 -0
- package/dist/observability/constants.js.map +1 -0
- package/dist/observability/context.d.ts +21 -0
- package/dist/observability/context.d.ts.map +1 -0
- package/dist/observability/context.js +105 -0
- package/dist/observability/context.js.map +1 -0
- package/dist/observability/facade-runtime-state.d.ts +17 -0
- package/dist/observability/facade-runtime-state.d.ts.map +1 -0
- package/dist/observability/facade-runtime-state.js +23 -0
- package/dist/observability/facade-runtime-state.js.map +1 -0
- package/dist/observability/facade.d.ts +44 -0
- package/dist/observability/facade.d.ts.map +1 -0
- package/dist/observability/facade.js +432 -0
- package/dist/observability/facade.js.map +1 -0
- package/dist/observability/fatal-handlers.d.ts +4 -0
- package/dist/observability/fatal-handlers.d.ts.map +1 -0
- package/dist/observability/fatal-handlers.js +54 -0
- package/dist/observability/fatal-handlers.js.map +1 -0
- package/dist/observability/identity.d.ts +4 -0
- package/dist/observability/identity.d.ts.map +1 -0
- package/dist/observability/identity.js +11 -0
- package/dist/observability/identity.js.map +1 -0
- package/dist/observability/index.d.ts +9 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +6 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/local-state.d.ts +14 -0
- package/dist/observability/local-state.d.ts.map +1 -0
- package/dist/observability/local-state.js +107 -0
- package/dist/observability/local-state.js.map +1 -0
- package/dist/observability/package-config.d.ts +11 -0
- package/dist/observability/package-config.d.ts.map +1 -0
- package/dist/observability/package-config.js +117 -0
- package/dist/observability/package-config.js.map +1 -0
- package/dist/observability/posthog-dashboard-contract.d.ts +46 -0
- package/dist/observability/posthog-dashboard-contract.d.ts.map +1 -0
- package/dist/observability/posthog-dashboard-contract.js +200 -0
- package/dist/observability/posthog-dashboard-contract.js.map +1 -0
- package/dist/observability/privacy-schema.d.ts +13 -0
- package/dist/observability/privacy-schema.d.ts.map +1 -0
- package/dist/observability/privacy-schema.js +204 -0
- package/dist/observability/privacy-schema.js.map +1 -0
- package/dist/observability/product-error-messages.d.ts +2 -0
- package/dist/observability/product-error-messages.d.ts.map +1 -0
- package/dist/observability/product-error-messages.js +15 -0
- package/dist/observability/product-error-messages.js.map +1 -0
- package/dist/observability/product-errors.d.ts +12 -0
- package/dist/observability/product-errors.d.ts.map +1 -0
- package/dist/observability/product-errors.js +109 -0
- package/dist/observability/product-errors.js.map +1 -0
- package/dist/observability/provisioning-analytics.d.ts +12 -0
- package/dist/observability/provisioning-analytics.d.ts.map +1 -0
- package/dist/observability/provisioning-analytics.js +11 -0
- package/dist/observability/provisioning-analytics.js.map +1 -0
- package/dist/observability/redaction.d.ts +10 -0
- package/dist/observability/redaction.d.ts.map +1 -0
- package/dist/observability/redaction.js +72 -0
- package/dist/observability/redaction.js.map +1 -0
- package/dist/observability/runtime-eligibility.d.ts +6 -0
- package/dist/observability/runtime-eligibility.d.ts.map +1 -0
- package/dist/observability/runtime-eligibility.js +33 -0
- package/dist/observability/runtime-eligibility.js.map +1 -0
- package/dist/observability/sentry-outbound-privacy.d.ts +12 -0
- package/dist/observability/sentry-outbound-privacy.d.ts.map +1 -0
- package/dist/observability/sentry-outbound-privacy.js +168 -0
- package/dist/observability/sentry-outbound-privacy.js.map +1 -0
- package/dist/observability/session-dedupe.d.ts +8 -0
- package/dist/observability/session-dedupe.d.ts.map +1 -0
- package/dist/observability/session-dedupe.js +42 -0
- package/dist/observability/session-dedupe.js.map +1 -0
- package/dist/observability/session-handoff.d.ts +10 -0
- package/dist/observability/session-handoff.d.ts.map +1 -0
- package/dist/observability/session-handoff.js +25 -0
- package/dist/observability/session-handoff.js.map +1 -0
- package/dist/observability/transport-lifecycle.d.ts +20 -0
- package/dist/observability/transport-lifecycle.d.ts.map +1 -0
- package/dist/observability/transport-lifecycle.js +69 -0
- package/dist/observability/transport-lifecycle.js.map +1 -0
- package/dist/observability/types.d.ts +189 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +2 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/p-dev/cli.d.ts +1 -1
- package/dist/p-dev/cli.d.ts.map +1 -1
- package/dist/p-dev/cli.js +1 -1
- package/dist/p-dev/cli.js.map +1 -1
- package/dist/p-dev/git-object-plumbing.d.ts +20 -0
- package/dist/p-dev/git-object-plumbing.d.ts.map +1 -1
- package/dist/p-dev/git-object-plumbing.js +106 -13
- package/dist/p-dev/git-object-plumbing.js.map +1 -1
- package/dist/p-dev/launch.d.ts.map +1 -1
- package/dist/p-dev/launch.js +77 -15
- package/dist/p-dev/launch.js.map +1 -1
- package/dist/p-dev/main.js +9 -1
- package/dist/p-dev/main.js.map +1 -1
- package/dist/p-dev/package-paths.d.ts +12 -0
- package/dist/p-dev/package-paths.d.ts.map +1 -1
- package/dist/p-dev/package-paths.js +48 -2
- package/dist/p-dev/package-paths.js.map +1 -1
- package/dist/p-dev/workspace-snapshot-generator.d.ts.map +1 -1
- package/dist/p-dev/workspace-snapshot-generator.js +18 -0
- package/dist/p-dev/workspace-snapshot-generator.js.map +1 -1
- package/dist/p-dev/workspace-snapshot-manifest.d.ts.map +1 -1
- package/dist/p-dev/workspace-snapshot-manifest.js +48 -0
- package/dist/p-dev/workspace-snapshot-manifest.js.map +1 -1
- package/dist/p-dev/workspace-snapshot-types.d.ts +8 -0
- package/dist/p-dev/workspace-snapshot-types.d.ts.map +1 -1
- package/dist/preview/preview-capability.d.ts +9 -0
- package/dist/preview/preview-capability.d.ts.map +1 -0
- package/dist/preview/preview-capability.js +15 -0
- package/dist/preview/preview-capability.js.map +1 -0
- package/dist/product/initialization-state.d.ts +15 -0
- package/dist/product/initialization-state.d.ts.map +1 -0
- package/dist/product/initialization-state.js +37 -0
- package/dist/product/initialization-state.js.map +1 -0
- package/dist/product/product-marker.d.ts +77 -0
- package/dist/product/product-marker.d.ts.map +1 -0
- package/dist/product/product-marker.js +62 -0
- package/dist/product/product-marker.js.map +1 -0
- package/dist/product/read-product-marker.d.ts +15 -0
- package/dist/product/read-product-marker.d.ts.map +1 -0
- package/dist/product/read-product-marker.js +28 -0
- package/dist/product/read-product-marker.js.map +1 -0
- package/dist/prompts/builder.d.ts +10 -1
- package/dist/prompts/builder.d.ts.map +1 -1
- package/dist/prompts/builder.js +16 -2
- package/dist/prompts/builder.js.map +1 -1
- package/dist/resolver/errors.d.ts +1 -1
- package/dist/resolver/errors.d.ts.map +1 -1
- package/dist/resolver/errors.js.map +1 -1
- package/dist/resolver/target-repo.d.ts +4 -1
- package/dist/resolver/target-repo.d.ts.map +1 -1
- package/dist/resolver/target-repo.js +40 -0
- package/dist/resolver/target-repo.js.map +1 -1
- package/dist/runner/builder-thread-acquire.d.ts +41 -0
- package/dist/runner/builder-thread-acquire.d.ts.map +1 -0
- package/dist/runner/builder-thread-acquire.js +224 -0
- package/dist/runner/builder-thread-acquire.js.map +1 -0
- package/dist/runner/builder-thread-evidence.d.ts +13 -0
- package/dist/runner/builder-thread-evidence.d.ts.map +1 -0
- package/dist/runner/builder-thread-evidence.js +23 -0
- package/dist/runner/builder-thread-evidence.js.map +1 -0
- package/dist/runner/builder-thread-idempotency.d.ts +17 -0
- package/dist/runner/builder-thread-idempotency.d.ts.map +1 -0
- package/dist/runner/builder-thread-idempotency.js +12 -0
- package/dist/runner/builder-thread-idempotency.js.map +1 -0
- package/dist/runner/builder-thread-lineage-errors.d.ts +7 -0
- package/dist/runner/builder-thread-lineage-errors.d.ts.map +1 -0
- package/dist/runner/builder-thread-lineage-errors.js +11 -0
- package/dist/runner/builder-thread-lineage-errors.js.map +1 -0
- package/dist/runner/builder-thread-lineage.d.ts +18 -0
- package/dist/runner/builder-thread-lineage.d.ts.map +1 -0
- package/dist/runner/builder-thread-lineage.js +342 -0
- package/dist/runner/builder-thread-lineage.js.map +1 -0
- package/dist/runner/builder-thread-types.d.ts +30 -0
- package/dist/runner/builder-thread-types.d.ts.map +1 -0
- package/dist/runner/builder-thread-types.js +2 -0
- package/dist/runner/builder-thread-types.js.map +1 -0
- package/dist/runner/delivery-dedup.d.ts +26 -0
- package/dist/runner/delivery-dedup.d.ts.map +1 -0
- package/dist/runner/delivery-dedup.js +44 -0
- package/dist/runner/delivery-dedup.js.map +1 -0
- package/dist/runner/failure-finalization.d.ts +34 -0
- package/dist/runner/failure-finalization.d.ts.map +1 -0
- package/dist/runner/failure-finalization.js +154 -0
- package/dist/runner/failure-finalization.js.map +1 -0
- package/dist/runner/fixture.d.ts +1 -1
- package/dist/runner/fixture.d.ts.map +1 -1
- package/dist/runner/fixture.js +3 -0
- package/dist/runner/fixture.js.map +1 -1
- package/dist/runner/phases/handoff.d.ts.map +1 -1
- package/dist/runner/phases/handoff.js +59 -32
- package/dist/runner/phases/handoff.js.map +1 -1
- package/dist/runner/phases/implementation.d.ts.map +1 -1
- package/dist/runner/phases/implementation.js +147 -24
- package/dist/runner/phases/implementation.js.map +1 -1
- package/dist/runner/phases/integration-repair.d.ts +18 -0
- package/dist/runner/phases/integration-repair.d.ts.map +1 -1
- package/dist/runner/phases/integration-repair.js +93 -7
- package/dist/runner/phases/integration-repair.js.map +1 -1
- package/dist/runner/phases/merge.d.ts.map +1 -1
- package/dist/runner/phases/merge.js +129 -51
- package/dist/runner/phases/merge.js.map +1 -1
- package/dist/runner/phases/planning.d.ts.map +1 -1
- package/dist/runner/phases/planning.js +46 -8
- package/dist/runner/phases/planning.js.map +1 -1
- package/dist/runner/phases/production-sync.d.ts.map +1 -1
- package/dist/runner/phases/production-sync.js +28 -4
- package/dist/runner/phases/production-sync.js.map +1 -1
- package/dist/runner/phases/revision.d.ts.map +1 -1
- package/dist/runner/phases/revision.js +112 -32
- package/dist/runner/phases/revision.js.map +1 -1
- package/dist/runner/preflight.d.ts +2 -0
- package/dist/runner/preflight.d.ts.map +1 -1
- package/dist/runner/preflight.js +112 -3
- package/dist/runner/preflight.js.map +1 -1
- package/dist/runner/resolve-route.d.ts +1 -0
- package/dist/runner/resolve-route.d.ts.map +1 -1
- package/dist/runner/resolve-route.js +26 -0
- package/dist/runner/resolve-route.js.map +1 -1
- package/dist/runner/run-generation.d.ts +2 -0
- package/dist/runner/run-generation.d.ts.map +1 -0
- package/dist/runner/run-generation.js +19 -0
- package/dist/runner/run-generation.js.map +1 -0
- package/dist/runner/uninitialized-product-routing.d.ts +24 -0
- package/dist/runner/uninitialized-product-routing.d.ts.map +1 -0
- package/dist/runner/uninitialized-product-routing.js +70 -0
- package/dist/runner/uninitialized-product-routing.js.map +1 -0
- package/dist/setup/config-builder.d.ts.map +1 -1
- package/dist/setup/config-builder.js +12 -0
- package/dist/setup/config-builder.js.map +1 -1
- package/dist/setup/control-plane-readiness.d.ts +8 -1
- package/dist/setup/control-plane-readiness.d.ts.map +1 -1
- package/dist/setup/control-plane-readiness.js +63 -19
- package/dist/setup/control-plane-readiness.js.map +1 -1
- package/dist/setup/control-plane-setup-state.d.ts +13 -3
- package/dist/setup/control-plane-setup-state.d.ts.map +1 -1
- package/dist/setup/control-plane-setup-state.js +30 -3
- package/dist/setup/control-plane-setup-state.js.map +1 -1
- package/dist/setup/control-plane-state-lock.d.ts +12 -0
- package/dist/setup/control-plane-state-lock.d.ts.map +1 -0
- package/dist/setup/control-plane-state-lock.js +79 -0
- package/dist/setup/control-plane-state-lock.js.map +1 -0
- package/dist/setup/control-plane-types.d.ts +72 -1
- package/dist/setup/control-plane-types.d.ts.map +1 -1
- package/dist/setup/first-run-readiness.d.ts +4 -0
- package/dist/setup/first-run-readiness.d.ts.map +1 -1
- package/dist/setup/first-run-readiness.js +2 -2
- package/dist/setup/first-run-readiness.js.map +1 -1
- package/dist/setup/git-askpass-credentials.d.ts +19 -0
- package/dist/setup/git-askpass-credentials.d.ts.map +1 -0
- package/dist/setup/git-askpass-credentials.js +60 -0
- package/dist/setup/git-askpass-credentials.js.map +1 -0
- package/dist/setup/github-dispatch-token.d.ts +4 -0
- package/dist/setup/github-dispatch-token.d.ts.map +1 -1
- package/dist/setup/github-dispatch-token.js +23 -3
- package/dist/setup/github-dispatch-token.js.map +1 -1
- package/dist/setup/github-remote-provider.d.ts +44 -0
- package/dist/setup/github-remote-provider.d.ts.map +1 -1
- package/dist/setup/github-remote-provider.js +22 -2
- package/dist/setup/github-remote-provider.js.map +1 -1
- package/dist/setup/github-remote-setup-live.d.ts +30 -1
- package/dist/setup/github-remote-setup-live.d.ts.map +1 -1
- package/dist/setup/github-remote-setup-live.js +68 -11
- package/dist/setup/github-remote-setup-live.js.map +1 -1
- package/dist/setup/github-repository-name.d.ts +15 -0
- package/dist/setup/github-repository-name.d.ts.map +1 -0
- package/dist/setup/github-repository-name.js +54 -0
- package/dist/setup/github-repository-name.js.map +1 -0
- package/dist/setup/github-target-repository-provider-live.d.ts +35 -0
- package/dist/setup/github-target-repository-provider-live.d.ts.map +1 -0
- package/dist/setup/github-target-repository-provider-live.js +236 -0
- package/dist/setup/github-target-repository-provider-live.js.map +1 -0
- package/dist/setup/github-target-repository-provider-mock.d.ts +47 -0
- package/dist/setup/github-target-repository-provider-mock.d.ts.map +1 -0
- package/dist/setup/github-target-repository-provider-mock.js +189 -0
- package/dist/setup/github-target-repository-provider-mock.js.map +1 -0
- package/dist/setup/github-target-repository-provider.d.ts +44 -0
- package/dist/setup/github-target-repository-provider.d.ts.map +1 -0
- package/dist/setup/github-target-repository-provider.js +7 -0
- package/dist/setup/github-target-repository-provider.js.map +1 -0
- package/dist/setup/github-workflow-permissions.d.ts +1 -1
- package/dist/setup/github-workflow-permissions.d.ts.map +1 -1
- package/dist/setup/github-workflow-permissions.js +1 -1
- package/dist/setup/github-workflow-permissions.js.map +1 -1
- package/dist/setup/gui-view-model.d.ts +5 -0
- package/dist/setup/gui-view-model.d.ts.map +1 -1
- package/dist/setup/gui-view-model.js +5 -0
- package/dist/setup/gui-view-model.js.map +1 -1
- package/dist/setup/harness-dispatch-repo.d.ts +16 -2
- package/dist/setup/harness-dispatch-repo.d.ts.map +1 -1
- package/dist/setup/harness-dispatch-repo.js +113 -22
- package/dist/setup/harness-dispatch-repo.js.map +1 -1
- package/dist/setup/harness-managed-repo-marker.d.ts +1 -0
- package/dist/setup/harness-managed-repo-marker.d.ts.map +1 -1
- package/dist/setup/harness-managed-repo-marker.js +18 -0
- package/dist/setup/harness-managed-repo-marker.js.map +1 -1
- package/dist/setup/harness-provisioning-last-run.d.ts +27 -0
- package/dist/setup/harness-provisioning-last-run.d.ts.map +1 -0
- package/dist/setup/harness-provisioning-last-run.js +94 -0
- package/dist/setup/harness-provisioning-last-run.js.map +1 -0
- package/dist/setup/harness-provisioning-pending-state.d.ts +1 -1
- package/dist/setup/harness-provisioning-pending-state.d.ts.map +1 -1
- package/dist/setup/harness-provisioning-pending-state.js.map +1 -1
- package/dist/setup/harness-provisioning-progress.d.ts +58 -0
- package/dist/setup/harness-provisioning-progress.d.ts.map +1 -0
- package/dist/setup/harness-provisioning-progress.js +134 -0
- package/dist/setup/harness-provisioning-progress.js.map +1 -0
- package/dist/setup/harness-repo-provisioning.d.ts +11 -0
- package/dist/setup/harness-repo-provisioning.d.ts.map +1 -1
- package/dist/setup/harness-repo-provisioning.js +98 -6
- package/dist/setup/harness-repo-provisioning.js.map +1 -1
- package/dist/setup/harness-snapshot-git-transport.d.ts +92 -0
- package/dist/setup/harness-snapshot-git-transport.d.ts.map +1 -0
- package/dist/setup/harness-snapshot-git-transport.js +544 -0
- package/dist/setup/harness-snapshot-git-transport.js.map +1 -0
- package/dist/setup/harness-snapshot-provisioning-helpers.d.ts +1 -1
- package/dist/setup/harness-snapshot-provisioning-helpers.d.ts.map +1 -1
- package/dist/setup/harness-snapshot-provisioning-helpers.js.map +1 -1
- package/dist/setup/harness-snapshot-provisioning.d.ts +12 -1
- package/dist/setup/harness-snapshot-provisioning.d.ts.map +1 -1
- package/dist/setup/harness-snapshot-provisioning.js +298 -73
- package/dist/setup/harness-snapshot-provisioning.js.map +1 -1
- package/dist/setup/harness-step-readiness-server.d.ts +11 -0
- package/dist/setup/harness-step-readiness-server.d.ts.map +1 -0
- package/dist/setup/harness-step-readiness-server.js +24 -0
- package/dist/setup/harness-step-readiness-server.js.map +1 -0
- package/dist/setup/harness-step-readiness.d.ts +21 -0
- package/dist/setup/harness-step-readiness.d.ts.map +1 -0
- package/dist/setup/harness-step-readiness.js +40 -0
- package/dist/setup/harness-step-readiness.js.map +1 -0
- package/dist/setup/harness-workspace-snapshot-loader.d.ts +6 -1
- package/dist/setup/harness-workspace-snapshot-loader.d.ts.map +1 -1
- package/dist/setup/harness-workspace-snapshot-loader.js +45 -12
- package/dist/setup/harness-workspace-snapshot-loader.js.map +1 -1
- package/dist/setup/initial-setup-lifecycle.d.ts +51 -0
- package/dist/setup/initial-setup-lifecycle.d.ts.map +1 -0
- package/dist/setup/initial-setup-lifecycle.js +93 -0
- package/dist/setup/initial-setup-lifecycle.js.map +1 -0
- package/dist/setup/linear-category-labels.d.ts +2 -0
- package/dist/setup/linear-category-labels.d.ts.map +1 -0
- package/dist/setup/linear-category-labels.js +19 -0
- package/dist/setup/linear-category-labels.js.map +1 -0
- package/dist/setup/linear-setup-apply.d.ts +1 -0
- package/dist/setup/linear-setup-apply.d.ts.map +1 -1
- package/dist/setup/linear-setup-apply.js +67 -16
- package/dist/setup/linear-setup-apply.js.map +1 -1
- package/dist/setup/linear-setup-client.d.ts +24 -0
- package/dist/setup/linear-setup-client.d.ts.map +1 -1
- package/dist/setup/linear-setup-client.js +61 -0
- package/dist/setup/linear-setup-client.js.map +1 -1
- package/dist/setup/linear-setup-plan.d.ts +22 -1
- package/dist/setup/linear-setup-plan.d.ts.map +1 -1
- package/dist/setup/linear-setup-plan.js +69 -6
- package/dist/setup/linear-setup-plan.js.map +1 -1
- package/dist/setup/linear-setup-progress.d.ts +30 -0
- package/dist/setup/linear-setup-progress.d.ts.map +1 -0
- package/dist/setup/linear-setup-progress.js +71 -0
- package/dist/setup/linear-setup-progress.js.map +1 -0
- package/dist/setup/linear-status-contract.d.ts +2 -1
- package/dist/setup/linear-status-contract.d.ts.map +1 -1
- package/dist/setup/linear-status-contract.js +26 -67
- package/dist/setup/linear-status-contract.js.map +1 -1
- package/dist/setup/linear-workflow-status-repair.d.ts +36 -0
- package/dist/setup/linear-workflow-status-repair.d.ts.map +1 -0
- package/dist/setup/linear-workflow-status-repair.js +187 -0
- package/dist/setup/linear-workflow-status-repair.js.map +1 -0
- package/dist/setup/linear-workspace-apply.d.ts +25 -0
- package/dist/setup/linear-workspace-apply.d.ts.map +1 -0
- package/dist/setup/linear-workspace-apply.js +212 -0
- package/dist/setup/linear-workspace-apply.js.map +1 -0
- package/dist/setup/linear-workspace-drift.d.ts +2 -0
- package/dist/setup/linear-workspace-drift.d.ts.map +1 -0
- package/dist/setup/linear-workspace-drift.js +2 -0
- package/dist/setup/linear-workspace-drift.js.map +1 -0
- package/dist/setup/linear-workspace-migration.d.ts +43 -0
- package/dist/setup/linear-workspace-migration.d.ts.map +1 -0
- package/dist/setup/linear-workspace-migration.js +212 -0
- package/dist/setup/linear-workspace-migration.js.map +1 -0
- package/dist/setup/linear-workspace-plan.d.ts +92 -0
- package/dist/setup/linear-workspace-plan.d.ts.map +1 -0
- package/dist/setup/linear-workspace-plan.js +283 -0
- package/dist/setup/linear-workspace-plan.js.map +1 -0
- package/dist/setup/local-readiness-checks.d.ts +17 -0
- package/dist/setup/local-readiness-checks.d.ts.map +1 -1
- package/dist/setup/local-readiness-checks.js +86 -23
- package/dist/setup/local-readiness-checks.js.map +1 -1
- package/dist/setup/mock-target-workflow-finalization.d.ts.map +1 -1
- package/dist/setup/mock-target-workflow-finalization.js +27 -4
- package/dist/setup/mock-target-workflow-finalization.js.map +1 -1
- package/dist/setup/packaged-default-route.d.ts +15 -0
- package/dist/setup/packaged-default-route.d.ts.map +1 -0
- package/dist/setup/packaged-default-route.js +17 -0
- package/dist/setup/packaged-default-route.js.map +1 -0
- package/dist/setup/release-sync-managed-runner.d.ts +61 -0
- package/dist/setup/release-sync-managed-runner.d.ts.map +1 -0
- package/dist/setup/release-sync-managed-runner.js +364 -0
- package/dist/setup/release-sync-managed-runner.js.map +1 -0
- package/dist/setup/remote-apply-actions.d.ts.map +1 -1
- package/dist/setup/remote-apply-actions.js +23 -0
- package/dist/setup/remote-apply-actions.js.map +1 -1
- package/dist/setup/runner-upgrade-canary-dispatch.d.ts +19 -0
- package/dist/setup/runner-upgrade-canary-dispatch.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-canary-dispatch.js +38 -0
- package/dist/setup/runner-upgrade-canary-dispatch.js.map +1 -0
- package/dist/setup/runner-upgrade-canary.d.ts +23 -0
- package/dist/setup/runner-upgrade-canary.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-canary.js +146 -0
- package/dist/setup/runner-upgrade-canary.js.map +1 -0
- package/dist/setup/runner-upgrade-evidence.d.ts +14 -0
- package/dist/setup/runner-upgrade-evidence.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-evidence.js +9 -0
- package/dist/setup/runner-upgrade-evidence.js.map +1 -0
- package/dist/setup/runner-upgrade-pending-state.d.ts +30 -0
- package/dist/setup/runner-upgrade-pending-state.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-pending-state.js +75 -0
- package/dist/setup/runner-upgrade-pending-state.js.map +1 -0
- package/dist/setup/runner-upgrade-progress.d.ts +38 -0
- package/dist/setup/runner-upgrade-progress.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-progress.js +95 -0
- package/dist/setup/runner-upgrade-progress.js.map +1 -0
- package/dist/setup/runner-upgrade-provider-live.d.ts +5 -0
- package/dist/setup/runner-upgrade-provider-live.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-provider-live.js +338 -0
- package/dist/setup/runner-upgrade-provider-live.js.map +1 -0
- package/dist/setup/runner-upgrade-provider.d.ts +231 -0
- package/dist/setup/runner-upgrade-provider.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-provider.js +466 -0
- package/dist/setup/runner-upgrade-provider.js.map +1 -0
- package/dist/setup/runner-upgrade-status-cache.d.ts +13 -0
- package/dist/setup/runner-upgrade-status-cache.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-status-cache.js +39 -0
- package/dist/setup/runner-upgrade-status-cache.js.map +1 -0
- package/dist/setup/runner-upgrade-three-way.d.ts +28 -0
- package/dist/setup/runner-upgrade-three-way.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-three-way.js +102 -0
- package/dist/setup/runner-upgrade-three-way.js.map +1 -0
- package/dist/setup/runner-upgrade-timeouts.d.ts +72 -0
- package/dist/setup/runner-upgrade-timeouts.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-timeouts.js +261 -0
- package/dist/setup/runner-upgrade-timeouts.js.map +1 -0
- package/dist/setup/runner-upgrade-types.d.ts +84 -0
- package/dist/setup/runner-upgrade-types.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-types.js +64 -0
- package/dist/setup/runner-upgrade-types.js.map +1 -0
- package/dist/setup/runner-upgrade-worker.d.ts +17 -0
- package/dist/setup/runner-upgrade-worker.d.ts.map +1 -0
- package/dist/setup/runner-upgrade-worker.js +115 -0
- package/dist/setup/runner-upgrade-worker.js.map +1 -0
- package/dist/setup/runner-upgrade.d.ts +57 -0
- package/dist/setup/runner-upgrade.d.ts.map +1 -0
- package/dist/setup/runner-upgrade.js +1311 -0
- package/dist/setup/runner-upgrade.js.map +1 -0
- package/dist/setup/service-verification.d.ts +18 -1
- package/dist/setup/service-verification.d.ts.map +1 -1
- package/dist/setup/service-verification.js +110 -19
- package/dist/setup/service-verification.js.map +1 -1
- package/dist/setup/settings-config-patch.d.ts +69 -0
- package/dist/setup/settings-config-patch.d.ts.map +1 -0
- package/dist/setup/settings-config-patch.js +312 -0
- package/dist/setup/settings-config-patch.js.map +1 -0
- package/dist/setup/setup-state.d.ts +1 -0
- package/dist/setup/setup-state.d.ts.map +1 -1
- package/dist/setup/setup-state.js +11 -1
- package/dist/setup/setup-state.js.map +1 -1
- package/dist/setup/step6-automatic-control-state.d.ts +21 -0
- package/dist/setup/step6-automatic-control-state.d.ts.map +1 -0
- package/dist/setup/step6-automatic-control-state.js +28 -0
- package/dist/setup/step6-automatic-control-state.js.map +1 -0
- package/dist/setup/sync-harness-config-cloud.d.ts +23 -0
- package/dist/setup/sync-harness-config-cloud.d.ts.map +1 -0
- package/dist/setup/sync-harness-config-cloud.js +91 -0
- package/dist/setup/sync-harness-config-cloud.js.map +1 -0
- package/dist/setup/target-repo-provisioning-pending-state.d.ts +42 -0
- package/dist/setup/target-repo-provisioning-pending-state.d.ts.map +1 -0
- package/dist/setup/target-repo-provisioning-pending-state.js +95 -0
- package/dist/setup/target-repo-provisioning-pending-state.js.map +1 -0
- package/dist/setup/target-repo-provisioning.d.ts +67 -0
- package/dist/setup/target-repo-provisioning.d.ts.map +1 -0
- package/dist/setup/target-repo-provisioning.js +473 -0
- package/dist/setup/target-repo-provisioning.js.map +1 -0
- package/dist/setup/target-workflow-finalization-progress.d.ts +43 -0
- package/dist/setup/target-workflow-finalization-progress.d.ts.map +1 -0
- package/dist/setup/target-workflow-finalization-progress.js +83 -0
- package/dist/setup/target-workflow-finalization-progress.js.map +1 -0
- package/dist/setup/target-workflow-finalization-types.d.ts +21 -1
- package/dist/setup/target-workflow-finalization-types.d.ts.map +1 -1
- package/dist/setup/target-workflow-finalization-types.js +75 -0
- package/dist/setup/target-workflow-finalization-types.js.map +1 -1
- package/dist/setup/target-workflow-finalization.d.ts.map +1 -1
- package/dist/setup/target-workflow-finalization.js +618 -15
- package/dist/setup/target-workflow-finalization.js.map +1 -1
- package/dist/setup/target-workflow-setup.d.ts.map +1 -1
- package/dist/setup/target-workflow-setup.js +2 -0
- package/dist/setup/target-workflow-setup.js.map +1 -1
- package/dist/setup/test-only-runner-upgrade-provider.d.ts +11 -0
- package/dist/setup/test-only-runner-upgrade-provider.d.ts.map +1 -0
- package/dist/setup/test-only-runner-upgrade-provider.js +37 -0
- package/dist/setup/test-only-runner-upgrade-provider.js.map +1 -0
- package/dist/setup/test-only-target-repo-provisioning-provider.d.ts +7 -0
- package/dist/setup/test-only-target-repo-provisioning-provider.d.ts.map +1 -0
- package/dist/setup/test-only-target-repo-provisioning-provider.js +33 -0
- package/dist/setup/test-only-target-repo-provisioning-provider.js.map +1 -0
- package/dist/setup/vercel-bridge-artifact.d.ts +7 -0
- package/dist/setup/vercel-bridge-artifact.d.ts.map +1 -0
- package/dist/setup/vercel-bridge-artifact.js +164 -0
- package/dist/setup/vercel-bridge-artifact.js.map +1 -0
- package/dist/setup/vercel-bridge-deploy.d.ts +42 -0
- package/dist/setup/vercel-bridge-deploy.d.ts.map +1 -0
- package/dist/setup/vercel-bridge-deploy.js +138 -0
- package/dist/setup/vercel-bridge-deploy.js.map +1 -0
- package/dist/setup/vercel-bridge-diagnostics.js +1 -1
- package/dist/setup/vercel-bridge-diagnostics.js.map +1 -1
- package/dist/setup/vercel-bridge-options.d.ts +2 -0
- package/dist/setup/vercel-bridge-options.d.ts.map +1 -1
- package/dist/setup/vercel-bridge-options.js +2 -0
- package/dist/setup/vercel-bridge-options.js.map +1 -1
- package/dist/setup/vercel-bridge-orchestration-summary.d.ts +13 -0
- package/dist/setup/vercel-bridge-orchestration-summary.d.ts.map +1 -0
- package/dist/setup/vercel-bridge-orchestration-summary.js +22 -0
- package/dist/setup/vercel-bridge-orchestration-summary.js.map +1 -0
- package/dist/setup/vercel-bridge-project-marker.d.ts +5 -0
- package/dist/setup/vercel-bridge-project-marker.d.ts.map +1 -0
- package/dist/setup/vercel-bridge-project-marker.js +6 -0
- package/dist/setup/vercel-bridge-project-marker.js.map +1 -0
- package/dist/setup/vercel-bridge-readiness.d.ts +1 -0
- package/dist/setup/vercel-bridge-readiness.d.ts.map +1 -1
- package/dist/setup/vercel-bridge-readiness.js +1 -1
- package/dist/setup/vercel-bridge-readiness.js.map +1 -1
- package/dist/setup/vercel-bridge-redeploy-normalize.d.ts +18 -0
- package/dist/setup/vercel-bridge-redeploy-normalize.d.ts.map +1 -0
- package/dist/setup/vercel-bridge-redeploy-normalize.js +175 -0
- package/dist/setup/vercel-bridge-redeploy-normalize.js.map +1 -0
- package/dist/setup/vercel-bridge-redeploy-poll.d.ts +7 -1
- package/dist/setup/vercel-bridge-redeploy-poll.d.ts.map +1 -1
- package/dist/setup/vercel-bridge-redeploy-poll.js +329 -166
- package/dist/setup/vercel-bridge-redeploy-poll.js.map +1 -1
- package/dist/setup/vercel-bridge-redeploy-state.d.ts.map +1 -1
- package/dist/setup/vercel-bridge-redeploy-state.js +3 -0
- package/dist/setup/vercel-bridge-redeploy-state.js.map +1 -1
- package/dist/setup/vercel-bridge-structured-log.d.ts +5 -0
- package/dist/setup/vercel-bridge-structured-log.d.ts.map +1 -1
- package/dist/setup/vercel-bridge-structured-log.js.map +1 -1
- package/dist/setup/vercel-project-name.d.ts +7 -0
- package/dist/setup/vercel-project-name.d.ts.map +1 -0
- package/dist/setup/vercel-project-name.js +26 -0
- package/dist/setup/vercel-project-name.js.map +1 -0
- package/dist/setup/vercel-setup-apply.d.ts +7 -2
- package/dist/setup/vercel-setup-apply.d.ts.map +1 -1
- package/dist/setup/vercel-setup-apply.js +315 -38
- package/dist/setup/vercel-setup-apply.js.map +1 -1
- package/dist/setup/vercel-setup-client.d.ts +26 -1
- package/dist/setup/vercel-setup-client.d.ts.map +1 -1
- package/dist/setup/vercel-setup-client.js +50 -1
- package/dist/setup/vercel-setup-client.js.map +1 -1
- package/dist/setup/vercel-setup-plan.d.ts +5 -0
- package/dist/setup/vercel-setup-plan.d.ts.map +1 -1
- package/dist/setup/vercel-setup-plan.js +65 -13
- package/dist/setup/vercel-setup-plan.js.map +1 -1
- package/dist/setup/vercel-setup-summary.d.ts +3 -0
- package/dist/setup/vercel-setup-summary.d.ts.map +1 -1
- package/dist/setup/vercel-setup-summary.js +4 -0
- package/dist/setup/vercel-setup-summary.js.map +1 -1
- package/dist/setup/workflow-config-snapshot.d.ts +8 -0
- package/dist/setup/workflow-config-snapshot.d.ts.map +1 -0
- package/dist/setup/workflow-config-snapshot.js +13 -0
- package/dist/setup/workflow-config-snapshot.js.map +1 -0
- package/dist/setup/workflow-install-branch-recovery.d.ts +116 -0
- package/dist/setup/workflow-install-branch-recovery.d.ts.map +1 -0
- package/dist/setup/workflow-install-branch-recovery.js +385 -0
- package/dist/setup/workflow-install-branch-recovery.js.map +1 -0
- package/dist/setup/workflow-install-merge-errors.d.ts +5 -2
- package/dist/setup/workflow-install-merge-errors.d.ts.map +1 -1
- package/dist/setup/workflow-install-merge-errors.js +51 -17
- package/dist/setup/workflow-install-merge-errors.js.map +1 -1
- package/dist/setup/workflow-install-merge-gate.d.ts +10 -0
- package/dist/setup/workflow-install-merge-gate.d.ts.map +1 -0
- package/dist/setup/workflow-install-merge-gate.js +21 -0
- package/dist/setup/workflow-install-merge-gate.js.map +1 -0
- package/dist/setup/workflow-model-save-queue.d.ts +16 -0
- package/dist/setup/workflow-model-save-queue.d.ts.map +1 -0
- package/dist/setup/workflow-model-save-queue.js +174 -0
- package/dist/setup/workflow-model-save-queue.js.map +1 -0
- package/dist/setup/workflow-model-sync-lock.d.ts +12 -0
- package/dist/setup/workflow-model-sync-lock.d.ts.map +1 -0
- package/dist/setup/workflow-model-sync-lock.js +79 -0
- package/dist/setup/workflow-model-sync-lock.js.map +1 -0
- package/dist/setup/workflow-model-sync.d.ts +34 -0
- package/dist/setup/workflow-model-sync.d.ts.map +1 -0
- package/dist/setup/workflow-model-sync.js +163 -0
- package/dist/setup/workflow-model-sync.js.map +1 -0
- package/dist/setup/workflow-models-sync-evidence.d.ts +12 -0
- package/dist/setup/workflow-models-sync-evidence.d.ts.map +1 -0
- package/dist/setup/workflow-models-sync-evidence.js +15 -0
- package/dist/setup/workflow-models-sync-evidence.js.map +1 -0
- package/dist/types/parsed-issue.d.ts +8 -0
- package/dist/types/parsed-issue.d.ts.map +1 -1
- package/dist/types/run.d.ts +18 -3
- package/dist/types/run.d.ts.map +1 -1
- package/dist/validate/issue.d.ts +5 -0
- package/dist/validate/issue.d.ts.map +1 -1
- package/dist/validate/issue.js +23 -3
- package/dist/validate/issue.js.map +1 -1
- package/dist/validate/types.d.ts +3 -0
- package/dist/validate/types.d.ts.map +1 -1
- package/dist/webhook/dispatch-statuses.d.ts +1 -1
- package/dist/webhook/dispatch-statuses.d.ts.map +1 -1
- package/dist/webhook/dispatch-statuses.js +4 -13
- package/dist/webhook/dispatch-statuses.js.map +1 -1
- package/dist/webhook/filter.d.ts +5 -2
- package/dist/webhook/filter.d.ts.map +1 -1
- package/dist/webhook/filter.js +15 -1
- package/dist/webhook/filter.js.map +1 -1
- package/dist/webhook/handle-linear-webhook.d.ts.map +1 -1
- package/dist/webhook/handle-linear-webhook.js +15 -1
- package/dist/webhook/handle-linear-webhook.js.map +1 -1
- package/dist/webhook/parse-linear-issue-event.d.ts +6 -0
- package/dist/webhook/parse-linear-issue-event.d.ts.map +1 -1
- package/dist/webhook/parse-linear-issue-event.js +2 -0
- package/dist/webhook/parse-linear-issue-event.js.map +1 -1
- package/dist/webhook/types.d.ts +3 -1
- package/dist/webhook/types.d.ts.map +1 -1
- package/dist/workflow/canonical-product-development-workflow.d.ts +106 -0
- package/dist/workflow/canonical-product-development-workflow.d.ts.map +1 -0
- package/dist/workflow/canonical-product-development-workflow.js +425 -0
- package/dist/workflow/canonical-product-development-workflow.js.map +1 -0
- package/dist/workflow/canonical-workflow-gate.d.ts +33 -0
- package/dist/workflow/canonical-workflow-gate.d.ts.map +1 -0
- package/dist/workflow/canonical-workflow-gate.js +164 -0
- package/dist/workflow/canonical-workflow-gate.js.map +1 -0
- package/dist/workflow/canonical-workflow-validation.d.ts +44 -0
- package/dist/workflow/canonical-workflow-validation.d.ts.map +1 -0
- package/dist/workflow/canonical-workflow-validation.js +193 -0
- package/dist/workflow/canonical-workflow-validation.js.map +1 -0
- package/dist/workflow/finalize-harness-run.d.ts +2 -0
- package/dist/workflow/finalize-harness-run.d.ts.map +1 -0
- package/dist/workflow/finalize-harness-run.js +62 -0
- package/dist/workflow/finalize-harness-run.js.map +1 -0
- package/dist/workflow/preflight-canonical.d.ts +11 -0
- package/dist/workflow/preflight-canonical.d.ts.map +1 -0
- package/dist/workflow/preflight-canonical.js +20 -0
- package/dist/workflow/preflight-canonical.js.map +1 -0
- package/dist/workflow/write-fallback-manifest.d.ts +2 -0
- package/dist/workflow/write-fallback-manifest.d.ts.map +1 -0
- package/dist/workflow/write-fallback-manifest.js +30 -0
- package/dist/workflow/write-fallback-manifest.js.map +1 -0
- package/dist/workflow-page/bootstrap.d.ts +21 -0
- package/dist/workflow-page/bootstrap.d.ts.map +1 -0
- package/dist/workflow-page/bootstrap.js +185 -0
- package/dist/workflow-page/bootstrap.js.map +1 -0
- package/dist/workflow-page/catalog-validation.d.ts +33 -0
- package/dist/workflow-page/catalog-validation.d.ts.map +1 -0
- package/dist/workflow-page/catalog-validation.js +105 -0
- package/dist/workflow-page/catalog-validation.js.map +1 -0
- package/dist/workflow-page/constants.d.ts +7 -0
- package/dist/workflow-page/constants.d.ts.map +1 -0
- package/dist/workflow-page/constants.js +18 -0
- package/dist/workflow-page/constants.js.map +1 -0
- package/dist/workflow-page/current-workflow.d.ts +18 -0
- package/dist/workflow-page/current-workflow.d.ts.map +1 -0
- package/dist/workflow-page/current-workflow.js +142 -0
- package/dist/workflow-page/current-workflow.js.map +1 -0
- package/dist/workflow-page/fingerprint.d.ts +3 -0
- package/dist/workflow-page/fingerprint.d.ts.map +1 -0
- package/dist/workflow-page/fingerprint.js +8 -0
- package/dist/workflow-page/fingerprint.js.map +1 -0
- package/dist/workflow-page/fixture-definition.d.ts +13 -0
- package/dist/workflow-page/fixture-definition.d.ts.map +1 -0
- package/dist/workflow-page/fixture-definition.js +2 -0
- package/dist/workflow-page/fixture-definition.js.map +1 -0
- package/dist/workflow-page/fixture-role-models.d.ts +19 -0
- package/dist/workflow-page/fixture-role-models.d.ts.map +1 -0
- package/dist/workflow-page/fixture-role-models.js +32 -0
- package/dist/workflow-page/fixture-role-models.js.map +1 -0
- package/dist/workflow-page/fixtures/basic-current-workflow.d.ts +5 -0
- package/dist/workflow-page/fixtures/basic-current-workflow.d.ts.map +1 -0
- package/dist/workflow-page/fixtures/basic-current-workflow.js +36 -0
- package/dist/workflow-page/fixtures/basic-current-workflow.js.map +1 -0
- package/dist/workflow-page/fixtures/branching-pr-review.d.ts +3 -0
- package/dist/workflow-page/fixtures/branching-pr-review.d.ts.map +1 -0
- package/dist/workflow-page/fixtures/branching-pr-review.js +10 -0
- package/dist/workflow-page/fixtures/branching-pr-review.js.map +1 -0
- package/dist/workflow-page/fixtures/canonical-violations.d.ts +6 -0
- package/dist/workflow-page/fixtures/canonical-violations.d.ts.map +1 -0
- package/dist/workflow-page/fixtures/canonical-violations.js +19 -0
- package/dist/workflow-page/fixtures/canonical-violations.js.map +1 -0
- package/dist/workflow-page/fixtures/credential-errors.d.ts +3 -0
- package/dist/workflow-page/fixtures/credential-errors.d.ts.map +1 -0
- package/dist/workflow-page/fixtures/credential-errors.js +12 -0
- package/dist/workflow-page/fixtures/credential-errors.js.map +1 -0
- package/dist/workflow-page/fixtures/empty-linear-statuses.d.ts +3 -0
- package/dist/workflow-page/fixtures/empty-linear-statuses.d.ts.map +1 -0
- package/dist/workflow-page/fixtures/empty-linear-statuses.js +9 -0
- package/dist/workflow-page/fixtures/empty-linear-statuses.js.map +1 -0
- package/dist/workflow-page/fixtures/hundred-node-performance.d.ts +3 -0
- package/dist/workflow-page/fixtures/hundred-node-performance.d.ts.map +1 -0
- package/dist/workflow-page/fixtures/hundred-node-performance.js +21 -0
- package/dist/workflow-page/fixtures/hundred-node-performance.js.map +1 -0
- package/dist/workflow-page/fixtures/index.d.ts +6 -0
- package/dist/workflow-page/fixtures/index.d.ts.map +1 -0
- package/dist/workflow-page/fixtures/index.js +24 -0
- package/dist/workflow-page/fixtures/index.js.map +1 -0
- package/dist/workflow-page/fixtures/model-catalog-snapshot.d.ts +10 -0
- package/dist/workflow-page/fixtures/model-catalog-snapshot.d.ts.map +1 -0
- package/dist/workflow-page/fixtures/model-catalog-snapshot.js +29 -0
- package/dist/workflow-page/fixtures/model-catalog-snapshot.js.map +1 -0
- package/dist/workflow-page/fixtures/workflow-scopes.d.ts +4 -0
- package/dist/workflow-page/fixtures/workflow-scopes.d.ts.map +1 -0
- package/dist/workflow-page/fixtures/workflow-scopes.js +16 -0
- package/dist/workflow-page/fixtures/workflow-scopes.js.map +1 -0
- package/dist/workflow-page/linear-status-source.d.ts +15 -0
- package/dist/workflow-page/linear-status-source.d.ts.map +1 -0
- package/dist/workflow-page/linear-status-source.js +44 -0
- package/dist/workflow-page/linear-status-source.js.map +1 -0
- package/dist/workflow-page/model-catalog-lookup.d.ts +3 -0
- package/dist/workflow-page/model-catalog-lookup.d.ts.map +1 -0
- package/dist/workflow-page/model-catalog-lookup.js +4 -0
- package/dist/workflow-page/model-catalog-lookup.js.map +1 -0
- package/dist/workflow-page/model-catalog-utils.d.ts +19 -0
- package/dist/workflow-page/model-catalog-utils.d.ts.map +1 -0
- package/dist/workflow-page/model-catalog-utils.js +46 -0
- package/dist/workflow-page/model-catalog-utils.js.map +1 -0
- package/dist/workflow-page/model-catalog.d.ts +12 -0
- package/dist/workflow-page/model-catalog.d.ts.map +1 -0
- package/dist/workflow-page/model-catalog.js +40 -0
- package/dist/workflow-page/model-catalog.js.map +1 -0
- package/dist/workflow-page/scope-branches.d.ts +11 -0
- package/dist/workflow-page/scope-branches.d.ts.map +1 -0
- package/dist/workflow-page/scope-branches.js +18 -0
- package/dist/workflow-page/scope-branches.js.map +1 -0
- package/dist/workflow-page/source-context.d.ts +13 -0
- package/dist/workflow-page/source-context.d.ts.map +1 -0
- package/dist/workflow-page/source-context.js +61 -0
- package/dist/workflow-page/source-context.js.map +1 -0
- package/dist/workflow-page/types.d.ts +108 -0
- package/dist/workflow-page/types.d.ts.map +1 -0
- package/dist/workflow-page/types.js +2 -0
- package/dist/workflow-page/types.js.map +1 -0
- package/dist/workflow-page/workflow-scopes.d.ts +16 -0
- package/dist/workflow-page/workflow-scopes.d.ts.map +1 -0
- package/dist/workflow-page/workflow-scopes.js +55 -0
- package/dist/workflow-page/workflow-scopes.js.map +1 -0
- package/gui/.next/BUILD_ID +1 -1
- package/gui/.next/app-build-manifest.json +376 -115
- package/gui/.next/app-path-routes-manifest.json +44 -15
- package/gui/.next/build-manifest.json +12 -12
- package/gui/.next/next-minimal-server.js.nft.json +1 -1
- package/gui/.next/next-server.js.nft.json +1 -1
- package/gui/.next/prerender-manifest.json +0 -24
- package/gui/.next/required-server-files.json +4 -3
- package/gui/.next/routes-manifest.json +54 -0
- package/gui/.next/server/app/_not-found/page.js +2 -2
- package/gui/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/gui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/_not-found.html +1 -1
- package/gui/.next/server/app/_not-found.rsc +3 -3
- package/gui/.next/server/app/api/observability/event/route.js +1 -0
- package/gui/.next/server/app/api/observability/event/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/observability/event/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/observability/preferences/route.js +1 -0
- package/gui/.next/server/app/api/observability/preferences/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/observability/preferences/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/operations/bootstrap/route.js +1 -0
- package/gui/.next/server/app/api/operations/bootstrap/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/operations/bootstrap/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/operations/draft/route.js +1 -0
- package/gui/.next/server/app/api/operations/draft/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/operations/draft/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/settings/apply-config-patch/route.js +8 -0
- package/gui/.next/server/app/api/settings/apply-config-patch/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/settings/apply-config-patch/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/settings/preview-config-patch/route.js +8 -0
- package/gui/.next/server/app/api/settings/preview-config-patch/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/settings/preview-config-patch/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/apply-connect-services/route.js +1 -1
- package/gui/.next/server/app/api/setup/apply-connect-services/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/apply-connect-services/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/apply-harness-repo-provisioning/route.js +1 -1
- package/gui/.next/server/app/api/setup/apply-harness-repo-provisioning/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/apply-harness-repo-provisioning/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/apply-harness-secrets/route.js +1 -1
- package/gui/.next/server/app/api/setup/apply-harness-secrets/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/apply-harness-secrets/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/apply-linear-setup/route.js +1 -1
- package/gui/.next/server/app/api/setup/apply-linear-setup/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/apply-linear-setup/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/apply-linear-workspace/route.js +1 -0
- package/gui/.next/server/app/api/setup/apply-linear-workspace/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/apply-linear-workspace/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/apply-local-files/route.js +1 -1
- package/gui/.next/server/app/api/setup/apply-local-files/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/apply-local-files/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/apply-runner-upgrade/route.js +1 -0
- package/gui/.next/server/app/api/setup/apply-runner-upgrade/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/apply-runner-upgrade/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/apply-target-repo-provisioning/route.js +1 -0
- package/gui/.next/server/app/api/setup/apply-target-repo-provisioning/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/apply-target-repo-provisioning/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/apply-target-workflow/route.js +1 -1
- package/gui/.next/server/app/api/setup/apply-target-workflow/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/apply-target-workflow/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/apply-vercel-bridge/route.js +1 -1
- package/gui/.next/server/app/api/setup/apply-vercel-bridge/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/apply-vercel-bridge/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/complete-initial-setup/route.js +1 -0
- package/gui/.next/server/app/api/setup/complete-initial-setup/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/complete-initial-setup/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/finalize-target-workflow/route.js +1 -1
- package/gui/.next/server/app/api/setup/finalize-target-workflow/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/finalize-target-workflow/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/harness-provisioning-progress/route.js +1 -0
- package/gui/.next/server/app/api/setup/harness-provisioning-progress/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/harness-provisioning-progress/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/harness-provisioning-summary/route.js +1 -1
- package/gui/.next/server/app/api/setup/harness-provisioning-summary/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/harness-provisioning-summary/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/linear-options/route.js +1 -1
- package/gui/.next/server/app/api/setup/linear-options/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/linear-options/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/linear-setup-progress/route.js +1 -0
- package/gui/.next/server/app/api/setup/linear-setup-progress/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/linear-setup-progress/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/linear-summary/route.js +1 -1
- package/gui/.next/server/app/api/setup/linear-summary/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/linear-summary/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/linear-workspace-editor-state/route.js +1 -0
- package/gui/.next/server/app/api/setup/linear-workspace-editor-state/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/linear-workspace-editor-state/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/local-readiness/route.js +3 -1
- package/gui/.next/server/app/api/setup/local-readiness/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/local-readiness/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/manual-harness-secret-values/route.js +1 -1
- package/gui/.next/server/app/api/setup/manual-harness-secret-values/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/manual-harness-secret-values/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/preview-connect-services/route.js +1 -1
- package/gui/.next/server/app/api/setup/preview-connect-services/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/preview-connect-services/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/preview-harness-repo-provisioning/route.js +1 -1
- package/gui/.next/server/app/api/setup/preview-harness-repo-provisioning/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/preview-harness-repo-provisioning/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/preview-harness-secrets/route.js +1 -1
- package/gui/.next/server/app/api/setup/preview-harness-secrets/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/preview-harness-secrets/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/preview-linear-setup/route.js +1 -1
- package/gui/.next/server/app/api/setup/preview-linear-setup/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/preview-linear-setup/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/preview-linear-workspace/route.js +1 -0
- package/gui/.next/server/app/api/setup/preview-linear-workspace/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/preview-linear-workspace/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/preview-local-files/route.js +1 -1
- package/gui/.next/server/app/api/setup/preview-local-files/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/preview-local-files/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/preview-runner-upgrade/route.js +1 -0
- package/gui/.next/server/app/api/setup/preview-runner-upgrade/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/preview-runner-upgrade/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/preview-target-repo-provisioning/route.js +1 -0
- package/gui/.next/server/app/api/setup/preview-target-repo-provisioning/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/preview-target-repo-provisioning/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/preview-target-workflow/route.js +1 -1
- package/gui/.next/server/app/api/setup/preview-target-workflow/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/preview-target-workflow/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/preview-vercel-bridge/route.js +1 -1
- package/gui/.next/server/app/api/setup/preview-vercel-bridge/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/preview-vercel-bridge/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/remote-summary/route.js +1 -1
- package/gui/.next/server/app/api/setup/remote-summary/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/remote-summary/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/runner-upgrade-progress/route.js +1 -0
- package/gui/.next/server/app/api/setup/runner-upgrade-progress/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/runner-upgrade-progress/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/runner-upgrade-status/route.js +1 -0
- package/gui/.next/server/app/api/setup/runner-upgrade-status/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/setup/runner-upgrade-status/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/setup/summary/route.js +1 -1
- package/gui/.next/server/app/api/setup/summary/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/summary/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/vercel-bridge-options/route.js +1 -1
- package/gui/.next/server/app/api/setup/vercel-bridge-options/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/vercel-bridge-options/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/vercel-bridge-redeploy-status/route.js +1 -1
- package/gui/.next/server/app/api/setup/vercel-bridge-redeploy-status/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/vercel-bridge-redeploy-status/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/vercel-summary/route.js +1 -1
- package/gui/.next/server/app/api/setup/vercel-summary/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/vercel-summary/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/verify-harness-repo/route.js +1 -1
- package/gui/.next/server/app/api/setup/verify-harness-repo/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/verify-harness-repo/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/verify-service/route.js +1 -1
- package/gui/.next/server/app/api/setup/verify-service/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/verify-service/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/setup/verify-target-repo/route.js +1 -1
- package/gui/.next/server/app/api/setup/verify-target-repo/route.js.nft.json +1 -1
- package/gui/.next/server/app/api/setup/verify-target-repo/route_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/api/workflow/bootstrap/route.js +1 -0
- package/gui/.next/server/app/api/workflow/bootstrap/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/workflow/bootstrap/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/api/workflow/models/route.js +1 -0
- package/gui/.next/server/app/api/workflow/models/route.js.nft.json +1 -0
- package/gui/.next/server/app/api/workflow/models/route_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/operations/page.js +2 -0
- package/gui/.next/server/app/operations/page.js.nft.json +1 -0
- package/gui/.next/server/app/operations/page_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/page.js +3 -2
- package/gui/.next/server/app/page.js.nft.json +1 -1
- package/gui/.next/server/app/page_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/settings/(console)/connections/page.js +2 -0
- package/gui/.next/server/app/settings/(console)/connections/page.js.nft.json +1 -0
- package/gui/.next/server/app/settings/(console)/connections/page_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/settings/(console)/data-sharing/page.js +2 -0
- package/gui/.next/server/app/settings/(console)/data-sharing/page.js.nft.json +1 -0
- package/gui/.next/server/app/settings/(console)/data-sharing/page_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/settings/(console)/deployments/page.js +2 -0
- package/gui/.next/server/app/settings/(console)/deployments/page.js.nft.json +1 -0
- package/gui/.next/server/app/settings/(console)/deployments/page_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/settings/(console)/linear/page.js +10 -0
- package/gui/.next/server/app/settings/(console)/linear/page.js.nft.json +1 -0
- package/gui/.next/server/app/settings/(console)/linear/page_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/settings/(console)/models/page.js +2 -0
- package/gui/.next/server/app/settings/(console)/models/page.js.nft.json +1 -0
- package/gui/.next/server/app/settings/(console)/models/page_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/settings/(console)/page.js +2 -0
- package/gui/.next/server/app/settings/(console)/page.js.nft.json +1 -0
- package/gui/.next/server/app/settings/(console)/page_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/settings/(console)/repositories/page.js +6 -0
- package/gui/.next/server/app/settings/(console)/repositories/page.js.nft.json +1 -0
- package/gui/.next/server/app/settings/(console)/repositories/page_client-reference-manifest.js +1 -0
- package/gui/.next/server/app/settings/configure/page.js +4 -4
- package/gui/.next/server/app/settings/configure/page.js.nft.json +1 -1
- package/gui/.next/server/app/settings/configure/page_client-reference-manifest.js +1 -1
- package/gui/.next/server/app/workflow/page.js +2 -0
- package/gui/.next/server/app/workflow/page.js.nft.json +1 -0
- package/gui/.next/server/app/workflow/page_client-reference-manifest.js +1 -0
- package/gui/.next/server/app-paths-manifest.json +44 -15
- package/gui/.next/server/chunks/105.js +2 -0
- package/gui/.next/server/chunks/1304.js +200 -0
- package/gui/.next/server/chunks/1536.js +1 -0
- package/gui/.next/server/chunks/1948.js +59 -0
- package/gui/.next/server/chunks/2470.js +3 -0
- package/gui/.next/server/chunks/2581.js +2 -0
- package/gui/.next/server/chunks/383.js +1 -1
- package/gui/.next/server/chunks/521.js +1 -0
- package/gui/.next/server/chunks/553.js +1 -0
- package/gui/.next/server/chunks/5827.js +1 -0
- package/gui/.next/server/chunks/6408.js +1 -0
- package/gui/.next/server/chunks/641.js +1 -0
- package/gui/.next/server/chunks/6482.js +1 -0
- package/gui/.next/server/chunks/6801.js +1 -0
- package/gui/.next/server/chunks/6890.js +1 -0
- package/gui/.next/server/chunks/7201.js +1 -0
- package/gui/.next/server/chunks/7221.js +1 -0
- package/gui/.next/server/chunks/{332.js → 7332.js} +1 -1
- package/gui/.next/server/chunks/7527.js +1 -0
- package/gui/.next/server/chunks/8312.js +1 -0
- package/gui/.next/server/chunks/8476.js +8 -0
- package/gui/.next/server/chunks/8764.js +16 -0
- package/gui/.next/server/chunks/8819.js +22 -0
- package/gui/.next/server/chunks/8825.js +1 -0
- package/gui/.next/server/chunks/9148.js +1 -0
- package/gui/.next/server/chunks/9454.js +1 -0
- package/gui/.next/server/instrumentation.js +1 -0
- package/gui/.next/server/instrumentation.js.nft.json +1 -0
- package/gui/.next/server/middleware-build-manifest.js +1 -1
- package/gui/.next/server/pages/404.html +1 -1
- package/gui/.next/server/pages/500.html +1 -1
- package/gui/.next/server/pages/_document.js +1 -1
- package/gui/.next/server/pages/_document.js.nft.json +1 -1
- package/gui/.next/server/pages/_error.js +2 -2
- package/gui/.next/server/pages/_error.js.nft.json +1 -1
- package/gui/.next/server/pages-manifest.json +1 -1
- package/gui/.next/server/webpack-runtime.js +1 -1
- package/gui/.next/static/chunks/3800-379a4b854a7eb1dc.js +1 -0
- package/gui/.next/static/chunks/464-7503c96bb839c213.js +1 -0
- package/gui/.next/static/chunks/5567-672d065d2668f1ea.js +1 -0
- package/gui/.next/static/chunks/6240-d3f8028539091853.js +1 -0
- package/gui/.next/static/chunks/7420-cb03f2f94db611c4.js +1 -0
- package/gui/.next/static/chunks/8002-528c2e589bc54111.js +1 -0
- package/gui/.next/static/chunks/9188-540635591aa2baf5.js +1 -0
- package/gui/.next/static/chunks/9289-00509b3e0c520cce.js +1 -0
- package/gui/.next/static/chunks/9576-6d94e3d152f876e7.js +1 -0
- package/gui/.next/static/chunks/app/_not-found/page-89865576110e31f0.js +1 -0
- package/gui/.next/static/chunks/app/api/observability/event/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/observability/preferences/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/operations/bootstrap/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/operations/draft/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/settings/apply-config-patch/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/settings/preview-config-patch/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/apply-connect-services/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/apply-harness-repo-provisioning/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/apply-harness-secrets/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/apply-linear-setup/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/apply-linear-workspace/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/apply-local-files/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/apply-runner-upgrade/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/apply-target-repo-provisioning/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/apply-target-workflow/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/apply-vercel-bridge/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/complete-initial-setup/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/finalize-target-workflow/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/harness-provisioning-progress/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/harness-provisioning-summary/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/linear-options/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/linear-setup-progress/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/linear-summary/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/linear-workspace-editor-state/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/local-readiness/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/manual-harness-secret-values/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/preview-connect-services/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/preview-harness-repo-provisioning/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/preview-harness-secrets/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/preview-linear-setup/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/preview-linear-workspace/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/preview-local-files/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/preview-runner-upgrade/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/preview-target-repo-provisioning/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/preview-target-workflow/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/preview-vercel-bridge/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/remote-summary/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/runner-upgrade-progress/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/runner-upgrade-status/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/summary/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/vercel-bridge-options/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/vercel-bridge-redeploy-status/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/vercel-summary/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/verify-harness-repo/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/verify-service/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/setup/verify-target-repo/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/workflow/bootstrap/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/api/workflow/models/route-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/layout-ec756afb9686f579.js +1 -0
- package/gui/.next/static/chunks/app/operations/page-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/page-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/settings/(console)/connections/page-95847d89fc70089a.js +1 -0
- package/gui/.next/static/chunks/app/settings/(console)/data-sharing/page-3e0d8fe941c7334e.js +1 -0
- package/gui/.next/static/chunks/app/settings/(console)/deployments/page-e3aaff205f09b567.js +1 -0
- package/gui/.next/static/chunks/app/settings/(console)/layout-74ce539ae02dc765.js +1 -0
- package/gui/.next/static/chunks/app/settings/(console)/linear/page-0a1e73b5ec66af90.js +1 -0
- package/gui/.next/static/chunks/app/settings/(console)/models/page-336406c2905983c9.js +1 -0
- package/gui/.next/static/chunks/app/settings/(console)/page-08ffe80f6f4603f6.js +1 -0
- package/gui/.next/static/chunks/app/settings/(console)/repositories/page-b1f7159c7771b16a.js +1 -0
- package/gui/.next/static/chunks/app/settings/configure/loading-5f1e73b910fbd9da.js +1 -0
- package/gui/.next/static/chunks/app/settings/configure/page-54b7572655b9f60f.js +1 -0
- package/gui/.next/static/chunks/app/workflow/page-8087b342a6ece93c.js +1 -0
- package/gui/.next/static/chunks/framework-dc88dc15d5e043e1.js +1 -0
- package/gui/.next/static/chunks/main-5b390d9aaa7199a5.js +1 -0
- package/gui/.next/static/chunks/main-app-7fbf1b54aaed0242.js +1 -0
- package/gui/.next/static/chunks/pages/{_app-2e239ff05bfdf6d6.js → _app-50fa07b56b2d29ac.js} +1 -1
- package/gui/.next/static/chunks/pages/_error-fed8688bdd23f211.js +1 -0
- package/gui/.next/static/chunks/{webpack-1e50074b7e886e1b.js → webpack-b27d2f88ec3d35a4.js} +1 -1
- package/gui/.next/static/css/b7b323a34ac09e0b.css +3 -0
- package/gui/.next/static/wM7YWpWgyTcGc7H5h1u7U/_buildManifest.js +1 -0
- package/gui/.next/trace +6 -4
- package/gui/.next/types/app/api/observability/event/route.ts +347 -0
- package/gui/.next/types/app/api/observability/preferences/route.ts +347 -0
- package/gui/.next/types/app/api/operations/bootstrap/route.ts +347 -0
- package/gui/.next/types/app/api/operations/draft/route.ts +347 -0
- package/gui/.next/types/app/api/settings/apply-config-patch/route.ts +347 -0
- package/gui/.next/types/app/api/settings/preview-config-patch/route.ts +347 -0
- package/gui/.next/types/app/api/setup/apply-linear-workspace/route.ts +347 -0
- package/gui/.next/types/app/api/setup/apply-runner-upgrade/route.ts +347 -0
- package/gui/.next/types/app/api/setup/apply-target-repo-provisioning/route.ts +347 -0
- package/gui/.next/types/app/api/setup/complete-initial-setup/route.ts +347 -0
- package/gui/.next/types/app/api/setup/harness-provisioning-progress/route.ts +347 -0
- package/gui/.next/types/app/api/setup/linear-setup-progress/route.ts +347 -0
- package/gui/.next/types/app/api/setup/linear-workspace-editor-state/route.ts +347 -0
- package/gui/.next/types/app/api/setup/preview-linear-workspace/route.ts +347 -0
- package/gui/.next/types/app/api/setup/preview-runner-upgrade/route.ts +347 -0
- package/gui/.next/types/app/api/setup/preview-target-repo-provisioning/route.ts +347 -0
- package/gui/.next/types/app/api/setup/runner-upgrade-progress/route.ts +347 -0
- package/gui/.next/types/app/api/setup/runner-upgrade-status/route.ts +347 -0
- package/gui/.next/types/app/api/workflow/bootstrap/route.ts +347 -0
- package/gui/.next/types/app/api/workflow/models/route.ts +347 -0
- package/gui/.next/types/app/operations/page.ts +84 -0
- package/gui/.next/types/app/settings/(console)/connections/page.ts +84 -0
- package/gui/.next/types/app/settings/(console)/data-sharing/page.ts +84 -0
- package/gui/.next/types/app/settings/(console)/deployments/page.ts +84 -0
- package/gui/.next/types/app/settings/(console)/layout.ts +84 -0
- package/gui/.next/types/app/settings/(console)/linear/page.ts +84 -0
- package/gui/.next/types/app/settings/(console)/models/page.ts +84 -0
- package/gui/.next/types/app/settings/(console)/page.ts +84 -0
- package/gui/.next/types/app/settings/(console)/repositories/page.ts +84 -0
- package/gui/.next/types/app/workflow/page.ts +84 -0
- package/gui/.next/types/routes.d.ts +33 -3
- package/gui/.next/types/validator.ts +270 -0
- package/observability.public.json +6 -0
- package/package.json +5 -1
- package/templates/.harness/config.example.json +1 -0
- package/workspace-snapshot/files/.agents/skills/implementation/SKILL.md +4 -0
- package/workspace-snapshot/files/.agents/skills/issue-intake/SKILL.md +13 -1
- package/workspace-snapshot/files/.agents/skills/planner/SKILL.md +10 -0
- package/workspace-snapshot/files/.github/workflows/harness-auto-runner.yml +38 -11
- package/workspace-snapshot/files/.github/workflows/p-dev-runner-config-canary.yml +24 -0
- package/workspace-snapshot/files/.harness/config.example.json +1 -0
- package/workspace-snapshot/files/AGENTS.md +13 -2
- package/workspace-snapshot/files/ARCHITECTURE.md +23 -6
- package/workspace-snapshot/files/CHANGELOG.md +50 -5
- package/workspace-snapshot/files/README.md +10 -4
- package/workspace-snapshot/files/ROADMAP.md +10 -1
- package/workspace-snapshot/files/apps/gui/app/api/observability/event/route.ts +36 -0
- package/workspace-snapshot/files/apps/gui/app/api/observability/preferences/route.ts +88 -0
- package/workspace-snapshot/files/apps/gui/app/api/operations/bootstrap/route.ts +8 -0
- package/workspace-snapshot/files/apps/gui/app/api/operations/draft/route.ts +15 -0
- package/workspace-snapshot/files/apps/gui/app/api/settings/apply-config-patch/route.ts +52 -0
- package/workspace-snapshot/files/apps/gui/app/api/settings/preview-config-patch/route.ts +40 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/apply-harness-repo-provisioning/route.ts +6 -5
- package/workspace-snapshot/files/apps/gui/app/api/setup/apply-linear-workspace/route.ts +23 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/apply-runner-upgrade/route.ts +33 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/apply-target-repo-provisioning/route.ts +38 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/apply-vercel-bridge/route.ts +7 -1
- package/workspace-snapshot/files/apps/gui/app/api/setup/complete-initial-setup/route.ts +49 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/harness-provisioning-progress/route.ts +21 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/linear-setup-progress/route.ts +17 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/linear-workspace-editor-state/route.ts +17 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/local-readiness/route.ts +52 -13
- package/workspace-snapshot/files/apps/gui/app/api/setup/preview-linear-workspace/route.ts +22 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/preview-runner-upgrade/route.ts +17 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/preview-target-repo-provisioning/route.ts +34 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/runner-upgrade-progress/route.ts +17 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/runner-upgrade-status/route.ts +72 -0
- package/workspace-snapshot/files/apps/gui/app/api/setup/verify-service/route.ts +2 -2
- package/workspace-snapshot/files/apps/gui/app/api/setup/verify-target-repo/route.ts +9 -2
- package/workspace-snapshot/files/apps/gui/app/api/workflow/bootstrap/route.ts +24 -0
- package/workspace-snapshot/files/apps/gui/app/api/workflow/models/route.ts +86 -0
- package/workspace-snapshot/files/apps/gui/app/operations/page.tsx +23 -0
- package/workspace-snapshot/files/apps/gui/app/page.tsx +8 -2
- package/workspace-snapshot/files/apps/gui/app/settings/(console)/connections/page.tsx +27 -0
- package/workspace-snapshot/files/apps/gui/app/settings/(console)/data-sharing/page.tsx +25 -0
- package/workspace-snapshot/files/apps/gui/app/settings/(console)/deployments/page.tsx +28 -0
- package/workspace-snapshot/files/apps/gui/app/settings/(console)/layout.tsx +45 -0
- package/workspace-snapshot/files/apps/gui/app/settings/(console)/linear/page.tsx +20 -0
- package/workspace-snapshot/files/apps/gui/app/settings/(console)/models/page.tsx +14 -0
- package/workspace-snapshot/files/apps/gui/app/settings/(console)/page.tsx +7 -0
- package/workspace-snapshot/files/apps/gui/app/settings/(console)/repositories/page.tsx +29 -0
- package/workspace-snapshot/files/apps/gui/app/settings/configure/loading.tsx +25 -0
- package/workspace-snapshot/files/apps/gui/app/settings/configure/page.tsx +76 -7
- package/workspace-snapshot/files/apps/gui/app/workflow/page.tsx +24 -0
- package/workspace-snapshot/files/apps/gui/components/custom/app-shell.tsx +26 -32
- package/workspace-snapshot/files/apps/gui/components/custom/application-header.tsx +64 -0
- package/workspace-snapshot/files/apps/gui/components/custom/configure-experience.tsx +347 -85
- package/workspace-snapshot/files/apps/gui/components/custom/configure-page-content.tsx +15 -0
- package/workspace-snapshot/files/apps/gui/components/custom/configure-workflow.tsx +675 -112
- package/workspace-snapshot/files/apps/gui/components/custom/data-sharing-preferences.tsx +159 -0
- package/workspace-snapshot/files/apps/gui/components/custom/environment-config-form.tsx +31 -13
- package/workspace-snapshot/files/apps/gui/components/custom/guided-cloud-secrets-card.tsx +99 -46
- package/workspace-snapshot/files/apps/gui/components/custom/guided-linear-workspace-card.tsx +974 -148
- package/workspace-snapshot/files/apps/gui/components/custom/guided-local-readiness-card.tsx +153 -35
- package/workspace-snapshot/files/apps/gui/components/custom/guided-operation-panel.tsx +102 -0
- package/workspace-snapshot/files/apps/gui/components/custom/guided-progress-check.tsx +37 -0
- package/workspace-snapshot/files/apps/gui/components/custom/guided-setup-progress.tsx +114 -0
- package/workspace-snapshot/files/apps/gui/components/custom/guided-step-success-panel.tsx +50 -0
- package/workspace-snapshot/files/apps/gui/components/custom/guided-step-transition.tsx +81 -27
- package/workspace-snapshot/files/apps/gui/components/custom/guided-target-workflow-card.tsx +267 -60
- package/workspace-snapshot/files/apps/gui/components/custom/guided-vercel-bridge-card.tsx +341 -179
- package/workspace-snapshot/files/apps/gui/components/custom/observability-settings-card.tsx +23 -0
- package/workspace-snapshot/files/apps/gui/components/custom/remote-action-confirmation.tsx +13 -11
- package/workspace-snapshot/files/apps/gui/components/custom/review-workflow-changes-disclosure.tsx +59 -0
- package/workspace-snapshot/files/apps/gui/components/custom/settings-menu.tsx +109 -0
- package/workspace-snapshot/files/apps/gui/components/custom/setup-checklist.tsx +47 -29
- package/workspace-snapshot/files/apps/gui/components/custom/target-repo-config-form.tsx +22 -2
- package/workspace-snapshot/files/apps/gui/components/custom/target-repo-create-connect.tsx +419 -0
- package/workspace-snapshot/files/apps/gui/components/custom/target-workflow-pr-card.tsx +105 -43
- package/workspace-snapshot/files/apps/gui/components/custom/theme-toggle.tsx +3 -11
- package/workspace-snapshot/files/apps/gui/components/custom/vercel-bridge-orchestration-status.tsx +65 -0
- package/workspace-snapshot/files/apps/gui/components/custom/workflow-install-pending-panel.tsx +125 -53
- package/workspace-snapshot/files/apps/gui/components/settings/editors/connections-settings-editor.tsx +261 -0
- package/workspace-snapshot/files/apps/gui/components/settings/editors/deployments-settings-editor.tsx +397 -0
- package/workspace-snapshot/files/apps/gui/components/settings/editors/linear-settings-editor.tsx +512 -0
- package/workspace-snapshot/files/apps/gui/components/settings/editors/repositories-settings-editor.tsx +749 -0
- package/workspace-snapshot/files/apps/gui/components/settings/editors/runner-upgrade-settings-card.tsx +533 -0
- package/workspace-snapshot/files/apps/gui/components/settings/settings-models-client.tsx +102 -0
- package/workspace-snapshot/files/apps/gui/components/settings/settings-mutation-panel.tsx +125 -0
- package/workspace-snapshot/files/apps/gui/components/settings/settings-shell.tsx +46 -0
- package/workspace-snapshot/files/apps/gui/components/ui/dropdown-menu.tsx +257 -0
- package/workspace-snapshot/files/apps/gui/components/ui/guided-select.tsx +22 -0
- package/workspace-snapshot/files/apps/gui/components/workflow/workflow-cards-section.tsx +206 -0
- package/workspace-snapshot/files/apps/gui/components/workflow/workflow-health-panel.tsx +43 -0
- package/workspace-snapshot/files/apps/gui/components/workflow/workflow-model-control.tsx +111 -0
- package/workspace-snapshot/files/apps/gui/components/workflow/workflow-page-client.tsx +161 -0
- package/workspace-snapshot/files/apps/gui/components/workflow/workflow-scope-selector.tsx +41 -0
- package/workspace-snapshot/files/apps/gui/instrumentation.ts +136 -0
- package/workspace-snapshot/files/apps/gui/lib/configure-navigation-timing.ts +53 -0
- package/workspace-snapshot/files/apps/gui/lib/constants/form.ts +5 -0
- package/workspace-snapshot/files/apps/gui/lib/constants/layout.ts +10 -3
- package/workspace-snapshot/files/apps/gui/lib/guided-setup.ts +222 -0
- package/workspace-snapshot/files/apps/gui/lib/linear-association-draft.ts +93 -0
- package/workspace-snapshot/files/apps/gui/lib/local-readiness-visual-queue.ts +61 -0
- package/workspace-snapshot/files/apps/gui/lib/observability-client.ts +21 -0
- package/workspace-snapshot/files/apps/gui/lib/observability-preferences.ts +19 -0
- package/workspace-snapshot/files/apps/gui/lib/observability-request-guard.ts +136 -0
- package/workspace-snapshot/files/apps/gui/lib/observability-route.ts +75 -0
- package/workspace-snapshot/files/apps/gui/lib/settings/load-harness-config-summary.ts +20 -0
- package/workspace-snapshot/files/apps/gui/lib/settings/load-repositories-overview.ts +37 -0
- package/workspace-snapshot/files/apps/gui/lib/settings/load-settings-editor-data.ts +51 -0
- package/workspace-snapshot/files/apps/gui/lib/settings/load-target-repo-overview-fields.ts +124 -0
- package/workspace-snapshot/files/apps/gui/lib/settings/runner-upgrade-feature-flag.ts +9 -0
- package/workspace-snapshot/files/apps/gui/lib/settings/runner-upgrade-ssr.ts +13 -0
- package/workspace-snapshot/files/apps/gui/lib/settings/runner-upgrade-ui-gates.ts +87 -0
- package/workspace-snapshot/files/apps/gui/lib/settings/settings-mutation.ts +49 -0
- package/workspace-snapshot/files/apps/gui/lib/settings/settings-navigation.ts +10 -0
- package/workspace-snapshot/files/apps/gui/lib/settings/settings-setup-client.ts +312 -0
- package/workspace-snapshot/files/apps/gui/lib/setup-server.ts +608 -17
- package/workspace-snapshot/files/apps/gui/lib/use-theme-toggle.ts +26 -0
- package/workspace-snapshot/files/apps/gui/lib/vercel-bridge-polling-ui.ts +88 -1
- package/workspace-snapshot/files/apps/gui/lib/verification-state.ts +97 -1
- package/workspace-snapshot/files/apps/gui/lib/workflow/api-client.ts +84 -0
- package/workspace-snapshot/files/apps/gui/lib/workflow/use-model-autosave.ts +90 -0
- package/workspace-snapshot/files/apps/gui/lib/workflow/use-workflow-model-save.ts +265 -0
- package/workspace-snapshot/files/apps/gui/lib/workflow/workflow-health.ts +53 -0
- package/workspace-snapshot/files/apps/gui/lib/workflow/workflow-ownership.ts +47 -0
- package/workspace-snapshot/files/apps/gui/lib/workflow/workflow-status-content.ts +149 -0
- package/workspace-snapshot/files/apps/gui/lib/workflow/workflow-violation-messages.ts +49 -0
- package/workspace-snapshot/files/apps/gui/lib/workflow-server.ts +307 -0
- package/workspace-snapshot/files/apps/gui/next.config.ts +8 -3
- package/workspace-snapshot/files/docs/architecture/canonical-product-development-workflow.md +70 -0
- package/workspace-snapshot/files/docs/architecture/linear-automation-state-machine.md +26 -10
- package/workspace-snapshot/files/docs/design/product-development-harness-gui.md +0 -1
- package/workspace-snapshot/files/docs/getting-started.md +2 -2
- package/workspace-snapshot/files/docs/gui-local.md +3 -3
- package/workspace-snapshot/files/docs/gui-remote-setup.md +2 -2
- package/workspace-snapshot/files/docs/issue-intake.md +12 -0
- package/workspace-snapshot/files/docs/observability-and-privacy.md +247 -0
- package/workspace-snapshot/files/docs/operator-config.md +16 -1
- package/workspace-snapshot/files/docs/p-dev.md +43 -9
- package/workspace-snapshot/files/docs/releases/release-process.md +135 -7
- package/workspace-snapshot/files/docs/releases/v0.3.1.md +42 -6
- package/workspace-snapshot/files/docs/releases/v0.4.0.md +93 -0
- package/workspace-snapshot/files/docs/security.md +8 -0
- package/workspace-snapshot/files/docs/settings-console.md +44 -0
- package/workspace-snapshot/files/harness.config.schema.json +114 -0
- package/workspace-snapshot/files/package-lock.json +1881 -95
- package/workspace-snapshot/files/package.json +10 -2
- package/workspace-snapshot/files/packages/p-dev/README.md +12 -4
- package/workspace-snapshot/files/packages/p-dev/observability.public.json +6 -0
- package/workspace-snapshot/files/packages/p-dev/package.json +5 -1
- package/workspace-snapshot/files/prompts/issue-intake-chatgpt.md +4 -0
- package/workspace-snapshot/files/scripts/configure-browser-matrix.config.ts +40 -0
- package/workspace-snapshot/files/scripts/configure-browser-matrix.spec.ts +294 -0
- package/workspace-snapshot/files/scripts/configure-step4-harness-readiness.config.ts +118 -0
- package/workspace-snapshot/files/scripts/configure-step4-harness-readiness.spec.ts +80 -0
- package/workspace-snapshot/files/scripts/prepare-configure-browser-workspace.ts +138 -0
- package/workspace-snapshot/files/scripts/prepare-p-dev-package.ts +9 -0
- package/workspace-snapshot/files/scripts/workflow-browser-matrix.config.ts +27 -0
- package/workspace-snapshot/files/scripts/workflow-browser-matrix.spec.ts +151 -0
- package/workspace-snapshot/files/src/agents/cursor-provider.ts +12 -14
- package/workspace-snapshot/files/src/agents/index.ts +8 -12
- package/workspace-snapshot/files/src/agents/types.ts +40 -4
- package/workspace-snapshot/files/src/artifacts/redact.ts +18 -2
- package/workspace-snapshot/files/src/artifacts/write-json-out-manifest.ts +90 -0
- package/workspace-snapshot/files/src/cli/commands/canary-runner-config.ts +6 -0
- package/workspace-snapshot/files/src/cli/commands/doctor.ts +148 -0
- package/workspace-snapshot/files/src/cli/commands/resolve-route.ts +5 -0
- package/workspace-snapshot/files/src/cli/commands/run.ts +65 -17
- package/workspace-snapshot/files/src/cli/commands/sync-managed-runner.ts +126 -0
- package/workspace-snapshot/files/src/cli/program.ts +47 -0
- package/workspace-snapshot/files/src/config/assert-cloud-config-fingerprint.ts +36 -0
- package/workspace-snapshot/files/src/config/cloud-config-fingerprint.ts +90 -0
- package/workspace-snapshot/files/src/config/legacy-linear-top-level.ts +69 -0
- package/workspace-snapshot/files/src/config/linear-association-gate.ts +80 -0
- package/workspace-snapshot/files/src/config/resolve-linear-team.ts +41 -0
- package/workspace-snapshot/files/src/config/resolve-linear-workspace.ts +391 -0
- package/workspace-snapshot/files/src/config/role-models.ts +39 -0
- package/workspace-snapshot/files/src/config/runner-upgrade-sync-gate.ts +26 -0
- package/workspace-snapshot/files/src/config/schema.ts +17 -0
- package/workspace-snapshot/files/src/config/types.ts +5 -1
- package/workspace-snapshot/files/src/config/workspace-root.ts +28 -0
- package/workspace-snapshot/files/src/cursor/agent-factory.ts +51 -5
- package/workspace-snapshot/files/src/cursor/builder-resume-errors.ts +41 -0
- package/workspace-snapshot/files/src/cursor/model.ts +106 -25
- package/workspace-snapshot/files/src/cursor/run-observer.ts +15 -2
- package/workspace-snapshot/files/src/github/auth-verification-retry.ts +63 -0
- package/workspace-snapshot/files/src/github/client.ts +204 -5
- package/workspace-snapshot/files/src/gui/configure-health.ts +2 -2
- package/workspace-snapshot/files/src/gui/repo-root.ts +20 -1
- package/workspace-snapshot/files/src/gui/start-configure-stable.ts +6 -2
- package/workspace-snapshot/files/src/gui/start-gui.ts +8 -3
- package/workspace-snapshot/files/src/linear/client.ts +10 -0
- package/workspace-snapshot/files/src/linear/comments.ts +52 -0
- package/workspace-snapshot/files/src/linear/issue-query.ts +4 -0
- package/workspace-snapshot/files/src/linear/markers.ts +28 -0
- package/workspace-snapshot/files/src/linear/parser.ts +61 -1
- package/workspace-snapshot/files/src/linear/project-harness-metadata.ts +147 -0
- package/workspace-snapshot/files/src/linear/project-metadata-sync.ts +115 -0
- package/workspace-snapshot/files/src/linear/run-status-comment.ts +197 -0
- package/workspace-snapshot/files/src/linear/writer.ts +25 -0
- package/workspace-snapshot/files/src/observability/adapters/fake.ts +267 -0
- package/workspace-snapshot/files/src/observability/adapters/noop.ts +62 -0
- package/workspace-snapshot/files/src/observability/adapters/posthog.ts +165 -0
- package/workspace-snapshot/files/src/observability/adapters/sentry.ts +276 -0
- package/workspace-snapshot/files/src/observability/analytics-schemas.ts +150 -0
- package/workspace-snapshot/files/src/observability/consent.ts +70 -0
- package/workspace-snapshot/files/src/observability/constants.ts +25 -0
- package/workspace-snapshot/files/src/observability/context.ts +152 -0
- package/workspace-snapshot/files/src/observability/facade-runtime-state.ts +47 -0
- package/workspace-snapshot/files/src/observability/facade.ts +628 -0
- package/workspace-snapshot/files/src/observability/fatal-handlers.ts +60 -0
- package/workspace-snapshot/files/src/observability/identity.ts +13 -0
- package/workspace-snapshot/files/src/observability/index.ts +47 -0
- package/workspace-snapshot/files/src/observability/local-state.ts +142 -0
- package/workspace-snapshot/files/src/observability/package-config.ts +180 -0
- package/workspace-snapshot/files/src/observability/posthog-dashboard-contract.ts +277 -0
- package/workspace-snapshot/files/src/observability/privacy-schema.ts +229 -0
- package/workspace-snapshot/files/src/observability/product-error-messages.ts +19 -0
- package/workspace-snapshot/files/src/observability/product-errors.ts +139 -0
- package/workspace-snapshot/files/src/observability/provisioning-analytics.ts +28 -0
- package/workspace-snapshot/files/src/observability/redaction.ts +85 -0
- package/workspace-snapshot/files/src/observability/runtime-eligibility.ts +50 -0
- package/workspace-snapshot/files/src/observability/sentry-outbound-privacy.ts +216 -0
- package/workspace-snapshot/files/src/observability/session-dedupe.ts +73 -0
- package/workspace-snapshot/files/src/observability/session-handoff.ts +47 -0
- package/workspace-snapshot/files/src/observability/transport-lifecycle.ts +93 -0
- package/workspace-snapshot/files/src/observability/types.ts +265 -0
- package/workspace-snapshot/files/src/p-dev/cli.ts +1 -1
- package/workspace-snapshot/files/src/p-dev/git-object-plumbing.ts +139 -14
- package/workspace-snapshot/files/src/p-dev/launch.ts +93 -14
- package/workspace-snapshot/files/src/p-dev/main.ts +12 -1
- package/workspace-snapshot/files/src/p-dev/package-paths.ts +72 -2
- package/workspace-snapshot/files/src/p-dev/workspace-snapshot-generator.ts +21 -0
- package/workspace-snapshot/files/src/p-dev/workspace-snapshot-manifest.ts +53 -0
- package/workspace-snapshot/files/src/p-dev/workspace-snapshot-types.ts +8 -0
- package/workspace-snapshot/files/src/preview/preview-capability.ts +21 -0
- package/workspace-snapshot/files/src/product/initialization-state.ts +65 -0
- package/workspace-snapshot/files/src/product/product-marker.ts +76 -0
- package/workspace-snapshot/files/src/product/read-product-marker.ts +63 -0
- package/workspace-snapshot/files/src/prompts/builder.ts +31 -1
- package/workspace-snapshot/files/src/prompts/implementation.md +6 -0
- package/workspace-snapshot/files/src/prompts/integration-repair.md +6 -0
- package/workspace-snapshot/files/src/prompts/planning.md +8 -0
- package/workspace-snapshot/files/src/prompts/revision.md +7 -0
- package/workspace-snapshot/files/src/resolver/errors.ts +3 -1
- package/workspace-snapshot/files/src/resolver/target-repo.ts +60 -1
- package/workspace-snapshot/files/src/runner/builder-thread-acquire.ts +321 -0
- package/workspace-snapshot/files/src/runner/builder-thread-evidence.ts +40 -0
- package/workspace-snapshot/files/src/runner/builder-thread-idempotency.ts +27 -0
- package/workspace-snapshot/files/src/runner/builder-thread-lineage-errors.ts +23 -0
- package/workspace-snapshot/files/src/runner/builder-thread-lineage.ts +555 -0
- package/workspace-snapshot/files/src/runner/builder-thread-types.ts +41 -0
- package/workspace-snapshot/files/src/runner/delivery-dedup.ts +78 -0
- package/workspace-snapshot/files/src/runner/failure-finalization.ts +234 -0
- package/workspace-snapshot/files/src/runner/fixture.ts +6 -1
- package/workspace-snapshot/files/src/runner/phases/handoff.ts +74 -46
- package/workspace-snapshot/files/src/runner/phases/implementation.ts +174 -28
- package/workspace-snapshot/files/src/runner/phases/integration-repair.ts +123 -7
- package/workspace-snapshot/files/src/runner/phases/merge.ts +145 -67
- package/workspace-snapshot/files/src/runner/phases/planning.ts +50 -7
- package/workspace-snapshot/files/src/runner/phases/production-sync.ts +37 -4
- package/workspace-snapshot/files/src/runner/phases/revision.ts +130 -44
- package/workspace-snapshot/files/src/runner/preflight.ts +134 -7
- package/workspace-snapshot/files/src/runner/resolve-route.ts +29 -0
- package/workspace-snapshot/files/src/runner/run-generation.ts +21 -0
- package/workspace-snapshot/files/src/runner/uninitialized-product-routing.ts +121 -0
- package/workspace-snapshot/files/src/setup/config-builder.ts +14 -0
- package/workspace-snapshot/files/src/setup/control-plane-readiness.ts +92 -18
- package/workspace-snapshot/files/src/setup/control-plane-setup-state.ts +61 -5
- package/workspace-snapshot/files/src/setup/control-plane-state-lock.ts +103 -0
- package/workspace-snapshot/files/src/setup/control-plane-types.ts +100 -1
- package/workspace-snapshot/files/src/setup/first-run-readiness.ts +9 -2
- package/workspace-snapshot/files/src/setup/git-askpass-credentials.ts +80 -0
- package/workspace-snapshot/files/src/setup/github-dispatch-token.ts +34 -3
- package/workspace-snapshot/files/src/setup/github-remote-provider.ts +78 -2
- package/workspace-snapshot/files/src/setup/github-remote-setup-live.ts +113 -11
- package/workspace-snapshot/files/src/setup/github-repository-name.ts +63 -0
- package/workspace-snapshot/files/src/setup/github-target-repository-provider-live.ts +323 -0
- package/workspace-snapshot/files/src/setup/github-target-repository-provider-mock.ts +284 -0
- package/workspace-snapshot/files/src/setup/github-target-repository-provider.ts +86 -0
- package/workspace-snapshot/files/src/setup/github-workflow-permissions.ts +2 -1
- package/workspace-snapshot/files/src/setup/gui-view-model.ts +10 -0
- package/workspace-snapshot/files/src/setup/harness-dispatch-repo.ts +157 -25
- package/workspace-snapshot/files/src/setup/harness-managed-repo-marker.ts +24 -0
- package/workspace-snapshot/files/src/setup/harness-provisioning-last-run.ts +152 -0
- package/workspace-snapshot/files/src/setup/harness-provisioning-pending-state.ts +3 -0
- package/workspace-snapshot/files/src/setup/harness-provisioning-progress.ts +213 -0
- package/workspace-snapshot/files/src/setup/harness-repo-provisioning.ts +135 -6
- package/workspace-snapshot/files/src/setup/harness-snapshot-git-transport.ts +846 -0
- package/workspace-snapshot/files/src/setup/harness-snapshot-provisioning-helpers.ts +4 -1
- package/workspace-snapshot/files/src/setup/harness-snapshot-provisioning.ts +352 -81
- package/workspace-snapshot/files/src/setup/harness-step-readiness-server.ts +39 -0
- package/workspace-snapshot/files/src/setup/harness-step-readiness.ts +72 -0
- package/workspace-snapshot/files/src/setup/harness-workspace-snapshot-loader.ts +59 -12
- package/workspace-snapshot/files/src/setup/initial-setup-lifecycle.ts +181 -0
- package/workspace-snapshot/files/src/setup/linear-category-labels.ts +18 -0
- package/workspace-snapshot/files/src/setup/linear-setup-apply.ts +97 -17
- package/workspace-snapshot/files/src/setup/linear-setup-client.ts +96 -0
- package/workspace-snapshot/files/src/setup/linear-setup-plan.ts +105 -11
- package/workspace-snapshot/files/src/setup/linear-setup-progress.ts +113 -0
- package/workspace-snapshot/files/src/setup/linear-status-contract.ts +36 -77
- package/workspace-snapshot/files/src/setup/linear-workflow-status-repair.ts +278 -0
- package/workspace-snapshot/files/src/setup/linear-workspace-apply.ts +309 -0
- package/workspace-snapshot/files/src/setup/linear-workspace-drift.ts +4 -0
- package/workspace-snapshot/files/src/setup/linear-workspace-migration.ts +314 -0
- package/workspace-snapshot/files/src/setup/linear-workspace-plan.ts +407 -0
- package/workspace-snapshot/files/src/setup/local-readiness-checks.ts +163 -31
- package/workspace-snapshot/files/src/setup/mock-target-workflow-finalization.ts +30 -4
- package/workspace-snapshot/files/src/setup/packaged-default-route.ts +29 -0
- package/workspace-snapshot/files/src/setup/release-sync-managed-runner.ts +604 -0
- package/workspace-snapshot/files/src/setup/remote-apply-actions.ts +33 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-canary-dispatch.ts +69 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-canary.ts +213 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-evidence.ts +30 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-pending-state.ts +116 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-progress.ts +150 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-provider-live.ts +520 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-provider.ts +852 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-status-cache.ts +61 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-three-way.ts +162 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-timeouts.ts +386 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-types.ts +176 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade-worker.ts +149 -0
- package/workspace-snapshot/files/src/setup/runner-upgrade.ts +1926 -0
- package/workspace-snapshot/files/src/setup/service-verification.ts +160 -20
- package/workspace-snapshot/files/src/setup/settings-config-patch.ts +461 -0
- package/workspace-snapshot/files/src/setup/setup-state.ts +12 -1
- package/workspace-snapshot/files/src/setup/step6-automatic-control-state.ts +59 -0
- package/workspace-snapshot/files/src/setup/sync-harness-config-cloud.ts +128 -0
- package/workspace-snapshot/files/src/setup/target-repo-provisioning-pending-state.ts +160 -0
- package/workspace-snapshot/files/src/setup/target-repo-provisioning.ts +704 -0
- package/workspace-snapshot/files/src/setup/target-workflow-finalization-progress.ts +166 -0
- package/workspace-snapshot/files/src/setup/target-workflow-finalization-types.ts +128 -1
- package/workspace-snapshot/files/src/setup/target-workflow-finalization.ts +806 -15
- package/workspace-snapshot/files/src/setup/target-workflow-setup.ts +2 -0
- package/workspace-snapshot/files/src/setup/test-only-runner-upgrade-provider.ts +51 -0
- package/workspace-snapshot/files/src/setup/test-only-target-repo-provisioning-provider.ts +47 -0
- package/workspace-snapshot/files/src/setup/vercel-bridge-artifact.ts +174 -0
- package/workspace-snapshot/files/src/setup/vercel-bridge-deploy.ts +217 -0
- package/workspace-snapshot/files/src/setup/vercel-bridge-diagnostics.ts +1 -1
- package/workspace-snapshot/files/src/setup/vercel-bridge-options.ts +4 -0
- package/workspace-snapshot/files/src/setup/vercel-bridge-orchestration-summary.ts +46 -0
- package/workspace-snapshot/files/src/setup/vercel-bridge-project-marker.ts +8 -0
- package/workspace-snapshot/files/src/setup/vercel-bridge-readiness.ts +2 -1
- package/workspace-snapshot/files/src/setup/vercel-bridge-redeploy-normalize.ts +244 -0
- package/workspace-snapshot/files/src/setup/vercel-bridge-redeploy-poll.ts +406 -190
- package/workspace-snapshot/files/src/setup/vercel-bridge-redeploy-state.ts +3 -0
- package/workspace-snapshot/files/src/setup/vercel-bridge-structured-log.ts +5 -0
- package/workspace-snapshot/files/src/setup/vercel-project-name.ts +38 -0
- package/workspace-snapshot/files/src/setup/vercel-setup-apply.ts +386 -40
- package/workspace-snapshot/files/src/setup/vercel-setup-client.ts +97 -3
- package/workspace-snapshot/files/src/setup/vercel-setup-plan.ts +84 -14
- package/workspace-snapshot/files/src/setup/vercel-setup-summary.ts +10 -0
- package/workspace-snapshot/files/src/setup/workflow-config-snapshot.ts +22 -0
- package/workspace-snapshot/files/src/setup/workflow-install-branch-recovery.ts +660 -0
- package/workspace-snapshot/files/src/setup/workflow-install-merge-errors.ts +70 -20
- package/workspace-snapshot/files/src/setup/workflow-install-merge-gate.ts +25 -0
- package/workspace-snapshot/files/src/setup/workflow-model-save-queue.ts +251 -0
- package/workspace-snapshot/files/src/setup/workflow-model-sync-lock.ts +103 -0
- package/workspace-snapshot/files/src/setup/workflow-model-sync.ts +259 -0
- package/workspace-snapshot/files/src/setup/workflow-models-sync-evidence.ts +34 -0
- package/workspace-snapshot/files/src/types/parsed-issue.ts +9 -0
- package/workspace-snapshot/files/src/types/run.ts +44 -1
- package/workspace-snapshot/files/src/validate/issue.ts +52 -6
- package/workspace-snapshot/files/src/validate/types.ts +3 -0
- package/workspace-snapshot/files/src/webhook/dispatch-statuses.ts +8 -16
- package/workspace-snapshot/files/src/webhook/filter.ts +24 -1
- package/workspace-snapshot/files/src/webhook/handle-linear-webhook.ts +15 -1
- package/workspace-snapshot/files/src/webhook/parse-linear-issue-event.ts +4 -0
- package/workspace-snapshot/files/src/webhook/types.ts +4 -1
- package/workspace-snapshot/files/src/workflow/canonical-product-development-workflow.ts +584 -0
- package/workspace-snapshot/files/src/workflow/canonical-workflow-gate.ts +255 -0
- package/workspace-snapshot/files/src/workflow/canonical-workflow-validation.ts +297 -0
- package/workspace-snapshot/files/src/workflow/finalize-harness-run.ts +83 -0
- package/workspace-snapshot/files/src/workflow/preflight-canonical.ts +40 -0
- package/workspace-snapshot/files/src/workflow/write-fallback-manifest.ts +39 -0
- package/workspace-snapshot/files/src/workflow-page/bootstrap.ts +277 -0
- package/workspace-snapshot/files/src/workflow-page/catalog-validation.ts +158 -0
- package/workspace-snapshot/files/src/workflow-page/constants.ts +22 -0
- package/workspace-snapshot/files/src/workflow-page/current-workflow.ts +225 -0
- package/workspace-snapshot/files/src/workflow-page/fingerprint.ts +9 -0
- package/workspace-snapshot/files/src/workflow-page/fixture-definition.ts +16 -0
- package/workspace-snapshot/files/src/workflow-page/fixture-role-models.ts +50 -0
- package/workspace-snapshot/files/src/workflow-page/fixtures/basic-current-workflow.ts +39 -0
- package/workspace-snapshot/files/src/workflow-page/fixtures/branching-pr-review.ts +11 -0
- package/workspace-snapshot/files/src/workflow-page/fixtures/canonical-violations.ts +50 -0
- package/workspace-snapshot/files/src/workflow-page/fixtures/credential-errors.ts +13 -0
- package/workspace-snapshot/files/src/workflow-page/fixtures/empty-linear-statuses.ts +10 -0
- package/workspace-snapshot/files/src/workflow-page/fixtures/hundred-node-performance.ts +23 -0
- package/workspace-snapshot/files/src/workflow-page/fixtures/index.ts +37 -0
- package/workspace-snapshot/files/src/workflow-page/fixtures/model-catalog-snapshot.ts +34 -0
- package/workspace-snapshot/files/src/workflow-page/fixtures/workflow-scopes.ts +18 -0
- package/workspace-snapshot/files/src/workflow-page/linear-status-source.ts +65 -0
- package/workspace-snapshot/files/src/workflow-page/model-catalog-lookup.ts +8 -0
- package/workspace-snapshot/files/src/workflow-page/model-catalog-utils.ts +83 -0
- package/workspace-snapshot/files/src/workflow-page/model-catalog.ts +60 -0
- package/workspace-snapshot/files/src/workflow-page/scope-branches.ts +27 -0
- package/workspace-snapshot/files/src/workflow-page/source-context.ts +91 -0
- package/workspace-snapshot/files/src/workflow-page/types.ts +134 -0
- package/workspace-snapshot/files/src/workflow-page/workflow-scopes.ts +73 -0
- package/workspace-snapshot/files/tests/agents/cursor-provider.test.ts +41 -29
- package/workspace-snapshot/files/tests/artifacts/redact.test.ts +11 -0
- package/workspace-snapshot/files/tests/cli/json-out-manifest.test.ts +96 -0
- package/workspace-snapshot/files/tests/config/cloud-config-fingerprint.test.ts +62 -0
- package/workspace-snapshot/files/tests/config/legacy-linear-top-level.test.ts +86 -0
- package/workspace-snapshot/files/tests/config/onboarding-cloud-runner-contract.test.ts +139 -0
- package/workspace-snapshot/files/tests/config/resolve-linear-workspace.test.ts +314 -0
- package/workspace-snapshot/files/tests/config/role-models.test.ts +35 -0
- package/workspace-snapshot/files/tests/cursor/agent-factory.test.ts +124 -0
- package/workspace-snapshot/files/tests/cursor/role-models.test.ts +52 -0
- package/workspace-snapshot/files/tests/cursor/run-observer.test.ts +36 -0
- package/workspace-snapshot/files/tests/fixtures/workflows/harness-auto-runner-with-production-sync.yml +36 -11
- package/workspace-snapshot/files/tests/github/auth-verification-retry.test.ts +141 -0
- package/workspace-snapshot/files/tests/gui/app-shell-settings-menu.test.ts +115 -0
- package/workspace-snapshot/files/tests/gui/configure-fix-loop.test.ts +50 -37
- package/workspace-snapshot/files/tests/gui/configure-navigation-contract.test.ts +107 -0
- package/workspace-snapshot/files/tests/gui/configure-target-repo-create.test.ts +103 -0
- package/workspace-snapshot/files/tests/gui/configure-workflow-readiness.test.ts +117 -0
- package/workspace-snapshot/files/tests/gui/data-sharing-preferences.test.ts +43 -0
- package/workspace-snapshot/files/tests/gui/design-system.test.ts +65 -5
- package/workspace-snapshot/files/tests/gui/guided-linear-workspace-card.test.ts +168 -0
- package/workspace-snapshot/files/tests/gui/guided-operation-ux.test.ts +100 -0
- package/workspace-snapshot/files/tests/gui/guided-setup-progress.test.ts +267 -0
- package/workspace-snapshot/files/tests/gui/guided-setup.test.ts +60 -0
- package/workspace-snapshot/files/tests/gui/guided-target-workflow-polling.test.ts +38 -0
- package/workspace-snapshot/files/tests/gui/linear-association-draft.test.ts +93 -0
- package/workspace-snapshot/files/tests/gui/local-readiness-stream.test.ts +154 -0
- package/workspace-snapshot/files/tests/gui/local-readiness-visual-queue.test.ts +69 -0
- package/workspace-snapshot/files/tests/gui/local-readiness-workspace.test.ts +299 -0
- package/workspace-snapshot/files/tests/gui/m6-configure-boundaries.test.ts +177 -35
- package/workspace-snapshot/files/tests/gui/observability-preferences-route.test.ts +343 -0
- package/workspace-snapshot/files/tests/gui/observability-request-guard.test.ts +177 -0
- package/workspace-snapshot/files/tests/gui/packaged-harness-cloud-secrets-routes.test.ts +16 -0
- package/workspace-snapshot/files/tests/gui/packaged-runner-upgrade-routes.test.ts +532 -0
- package/workspace-snapshot/files/tests/gui/packaged-target-repo-provisioning-routes.test.ts +108 -0
- package/workspace-snapshot/files/tests/gui/repo-root.test.ts +55 -0
- package/workspace-snapshot/files/tests/gui/runner-upgrade-settings-card.test.ts +97 -0
- package/workspace-snapshot/files/tests/gui/settings-cursor.test.ts +39 -0
- package/workspace-snapshot/files/tests/gui/settings-deployments-autoload.test.ts +57 -0
- package/workspace-snapshot/files/tests/gui/settings-mutation-editors.test.ts +154 -0
- package/workspace-snapshot/files/tests/gui/settings-navigation.test.ts +95 -0
- package/workspace-snapshot/files/tests/gui/settings-repositories-page.test.ts +54 -0
- package/workspace-snapshot/files/tests/gui/step7-settings-polish.test.ts +180 -0
- package/workspace-snapshot/files/tests/gui/target-workflow-pr-card.test.ts +68 -0
- package/workspace-snapshot/files/tests/gui/vercel-bridge-polling-ui.test.ts +50 -1
- package/workspace-snapshot/files/tests/gui/verification-state.test.ts +45 -0
- package/workspace-snapshot/files/tests/gui/workflow-bootstrap-route.test.ts +78 -0
- package/workspace-snapshot/files/tests/gui/workflow-model-autosave.test.ts +36 -0
- package/workspace-snapshot/files/tests/gui/workflow-source-ui.test.ts +22 -0
- package/workspace-snapshot/files/tests/gui/workflow-violation-messages.test.ts +39 -0
- package/workspace-snapshot/files/tests/gui/workflow-workspace.test.ts +188 -0
- package/workspace-snapshot/files/tests/linear/markers.test.ts +29 -0
- package/workspace-snapshot/files/tests/linear/run-status-comment.test.ts +143 -0
- package/workspace-snapshot/files/tests/observability/analytics-schemas.test.ts +74 -0
- package/workspace-snapshot/files/tests/observability/context.test.ts +132 -0
- package/workspace-snapshot/files/tests/observability/fatal-process.test.ts +106 -0
- package/workspace-snapshot/files/tests/observability/foundation.test.ts +229 -0
- package/workspace-snapshot/files/tests/observability/instrumentation-dev-startup.test.ts +79 -0
- package/workspace-snapshot/files/tests/observability/lifecycle.test.ts +348 -0
- package/workspace-snapshot/files/tests/observability/package-config.test.ts +66 -0
- package/workspace-snapshot/files/tests/observability/packaged-config.test.ts +47 -0
- package/workspace-snapshot/files/tests/observability/posthog-dashboard-contract.test.ts +133 -0
- package/workspace-snapshot/files/tests/observability/posthog-envelope.test.ts +167 -0
- package/workspace-snapshot/files/tests/observability/posthog-shutdown.test.ts +68 -0
- package/workspace-snapshot/files/tests/observability/privacy-schema.test.ts +83 -0
- package/workspace-snapshot/files/tests/observability/provisioning-analytics.test.ts +54 -0
- package/workspace-snapshot/files/tests/observability/public-config-enablement.test.ts +48 -0
- package/workspace-snapshot/files/tests/observability/sentry-envelope.test.ts +289 -0
- package/workspace-snapshot/files/tests/observability/sentry-outbound-privacy.test.ts +141 -0
- package/workspace-snapshot/files/tests/observability/sentry-privacy-assertions.ts +52 -0
- package/workspace-snapshot/files/tests/observability/sentry-server-only.test.ts +68 -0
- package/workspace-snapshot/files/tests/observability/sentry-transport.test.ts +88 -0
- package/workspace-snapshot/files/tests/observability/session-dedupe.test.ts +117 -0
- package/workspace-snapshot/files/tests/observability/snapshot-exclusion.test.ts +9 -0
- package/workspace-snapshot/files/tests/p-dev/cli.test.ts +2 -2
- package/workspace-snapshot/files/tests/p-dev/git-object-plumbing.test.ts +49 -0
- package/workspace-snapshot/files/tests/p-dev/installed-tarball-gui.test.ts +475 -0
- package/workspace-snapshot/files/tests/p-dev/installed-tarball-loopback.test.ts +986 -0
- package/workspace-snapshot/files/tests/p-dev/installed-tarball-snapshot-provisioning.test.ts +361 -0
- package/workspace-snapshot/files/tests/p-dev/launch.test.ts +55 -3
- package/workspace-snapshot/files/tests/p-dev/package-manifest.test.ts +3 -1
- package/workspace-snapshot/files/tests/p-dev/package-packed-artifact.test.ts +115 -10
- package/workspace-snapshot/files/tests/p-dev/package-paths.test.ts +51 -0
- package/workspace-snapshot/files/tests/p-dev/package-version.test.ts +1 -1
- package/workspace-snapshot/files/tests/p-dev/packaged-workspace-setup.test.ts +1 -1
- package/workspace-snapshot/files/tests/p-dev/workspace-snapshot-policy.test.ts +6 -0
- package/workspace-snapshot/files/tests/product/initialization-state.test.ts +78 -0
- package/workspace-snapshot/files/tests/product/read-product-marker.test.ts +46 -0
- package/workspace-snapshot/files/tests/prompts/builder.test.ts +1 -0
- package/workspace-snapshot/files/tests/prompts/implementation-builder.test.ts +1 -0
- package/workspace-snapshot/files/tests/prompts/issue-intake-chatgpt.test.ts +1 -0
- package/workspace-snapshot/files/tests/resolver/target-repo.test.ts +66 -0
- package/workspace-snapshot/files/tests/runner/builder-thread-acquire.test.ts +288 -0
- package/workspace-snapshot/files/tests/runner/builder-thread-idempotency.test.ts +42 -0
- package/workspace-snapshot/files/tests/runner/builder-thread-lineage.test.ts +206 -0
- package/workspace-snapshot/files/tests/runner/delivery-dedup.test.ts +53 -0
- package/workspace-snapshot/files/tests/runner/failure-finalization-runner-upgrade.test.ts +112 -0
- package/workspace-snapshot/files/tests/runner/failure-finalization.test.ts +203 -0
- package/workspace-snapshot/files/tests/runner/handoff.test.ts +66 -0
- package/workspace-snapshot/files/tests/runner/idempotency-handoff.test.ts +1 -0
- package/workspace-snapshot/files/tests/runner/idempotency-implementation.test.ts +1 -0
- package/workspace-snapshot/files/tests/runner/idempotency-revision.test.ts +1 -0
- package/workspace-snapshot/files/tests/runner/idempotency.test.ts +1 -0
- package/workspace-snapshot/files/tests/runner/implementation.test.ts +24 -5
- package/workspace-snapshot/files/tests/runner/integration-repair.test.ts +21 -6
- package/workspace-snapshot/files/tests/runner/merge-linear-metadata.test.ts +90 -0
- package/workspace-snapshot/files/tests/runner/merge.test.ts +79 -0
- package/workspace-snapshot/files/tests/runner/planning.test.ts +9 -0
- package/workspace-snapshot/files/tests/runner/preflight-canonical.test.ts +73 -0
- package/workspace-snapshot/files/tests/runner/preflight-fail-closed.integration.test.ts +418 -0
- package/workspace-snapshot/files/tests/runner/preview-capability.test.ts +46 -0
- package/workspace-snapshot/files/tests/runner/resolve-route.test.ts +6 -0
- package/workspace-snapshot/files/tests/runner/revision.test.ts +117 -9
- package/workspace-snapshot/files/tests/runner/uninitialized-product-routing.test.ts +120 -0
- package/workspace-snapshot/files/tests/setup/control-plane-readiness.test.ts +86 -0
- package/workspace-snapshot/files/tests/setup/control-plane-state-lock.test.ts +67 -0
- package/workspace-snapshot/files/tests/setup/first-run-readiness.test.ts +134 -2
- package/workspace-snapshot/files/tests/setup/github-dispatch-token.test.ts +49 -1
- package/workspace-snapshot/files/tests/setup/github-repository-name.test.ts +28 -0
- package/workspace-snapshot/files/tests/setup/gui-remote-storage.test.ts +0 -2
- package/workspace-snapshot/files/tests/setup/harness-dispatch-repo.test.ts +292 -3
- package/workspace-snapshot/files/tests/setup/harness-snapshot-bulk-fixture.ts +72 -0
- package/workspace-snapshot/files/tests/setup/harness-snapshot-bulk-installed.test.ts +93 -0
- package/workspace-snapshot/files/tests/setup/harness-snapshot-git-transport.test.ts +518 -0
- package/workspace-snapshot/files/tests/setup/harness-step-readiness.test.ts +145 -0
- package/workspace-snapshot/files/tests/setup/harness-workspace-snapshot-loader.test.ts +142 -0
- package/workspace-snapshot/files/tests/setup/initial-setup-lifecycle.test.ts +220 -0
- package/workspace-snapshot/files/tests/setup/linear-setup-apply.test.ts +7 -4
- package/workspace-snapshot/files/tests/setup/linear-setup-plan.test.ts +46 -3
- package/workspace-snapshot/files/tests/setup/linear-workflow-status-repair.test.ts +314 -0
- package/workspace-snapshot/files/tests/setup/linear-workspace-migration.test.ts +173 -0
- package/workspace-snapshot/files/tests/setup/linear-workspace-plan.test.ts +247 -0
- package/workspace-snapshot/files/tests/setup/local-apply-actions.test.ts +13 -0
- package/workspace-snapshot/files/tests/setup/local-readiness-checks.test.ts +25 -1
- package/workspace-snapshot/files/tests/setup/mock-canonical-preflight.ts +14 -0
- package/workspace-snapshot/files/tests/setup/packaged-default-route.test.ts +85 -0
- package/workspace-snapshot/files/tests/setup/release-sync-managed-runner.test.ts +385 -0
- package/workspace-snapshot/files/tests/setup/runner-upgrade-canary.test.ts +201 -0
- package/workspace-snapshot/files/tests/setup/runner-upgrade-three-way.test.ts +226 -0
- package/workspace-snapshot/files/tests/setup/runner-upgrade.test.ts +702 -0
- package/workspace-snapshot/files/tests/setup/service-verification.test.ts +197 -18
- package/workspace-snapshot/files/tests/setup/settings-config-patch.test.ts +280 -0
- package/workspace-snapshot/files/tests/setup/setup-state.test.ts +47 -0
- package/workspace-snapshot/files/tests/setup/step6-automatic-apply-outcome.test.ts +1 -0
- package/workspace-snapshot/files/tests/setup/step6-automatic-control-state.test.ts +73 -0
- package/workspace-snapshot/files/tests/setup/target-repo-provisioning.test.ts +307 -0
- package/workspace-snapshot/files/tests/setup/target-workflow-finalization-progress.test.ts +71 -0
- package/workspace-snapshot/files/tests/setup/target-workflow-finalization-step-github.test.ts +240 -0
- package/workspace-snapshot/files/tests/setup/vercel-bridge-redeploy-normalize.test.ts +106 -0
- package/workspace-snapshot/files/tests/setup/vercel-bridge-redeploy-poll.test.ts +78 -4
- package/workspace-snapshot/files/tests/setup/vercel-setup-apply.test.ts +278 -3
- package/workspace-snapshot/files/tests/setup/vercel-setup-client.test.ts +76 -0
- package/workspace-snapshot/files/tests/setup/vercel-setup-plan.test.ts +58 -0
- package/workspace-snapshot/files/tests/setup/workflow-install-branch-recovery-commit.test.ts +144 -0
- package/workspace-snapshot/files/tests/setup/workflow-install-branch-recovery.test.ts +133 -0
- package/workspace-snapshot/files/tests/setup/workflow-install-merge-errors.test.ts +66 -1
- package/workspace-snapshot/files/tests/setup/workflow-install-merge-gate.test.ts +58 -0
- package/workspace-snapshot/files/tests/setup/workflow-model-save-queue.test.ts +139 -0
- package/workspace-snapshot/files/tests/setup/workflow-model-sync.test.ts +141 -0
- package/workspace-snapshot/files/tests/validate-issue/uninitialized-product.test.ts +108 -0
- package/workspace-snapshot/files/tests/webhook/filter.test.ts +55 -0
- package/workspace-snapshot/files/tests/webhook/harness-auto-runner-workflow.test.ts +7 -0
- package/workspace-snapshot/files/tests/workflow/canonical-product-development-workflow.test.ts +193 -0
- package/workspace-snapshot/files/tests/workflow/canonical-workflow-validation.test.ts +202 -0
- package/workspace-snapshot/files/tests/workflow/workflow-shell-safety.test.ts +5 -2
- package/workspace-snapshot/files/vitest.config.ts +5 -0
- package/workspace-snapshot/manifest.json +3604 -836
- package/workspace-snapshot/object-pack/snapshot-2735d42c938e514f27a9b2aaf5fa2fcc68019075.idx +0 -0
- package/workspace-snapshot/object-pack/snapshot-2735d42c938e514f27a9b2aaf5fa2fcc68019075.pack +0 -0
- package/gui/.next/server/app/index.html +0 -1
- package/gui/.next/server/app/index.meta +0 -9
- package/gui/.next/server/app/index.rsc +0 -18
- package/gui/.next/server/chunks/200.js +0 -1
- package/gui/.next/server/chunks/477.js +0 -16
- package/gui/.next/server/chunks/585.js +0 -1
- package/gui/.next/server/chunks/647.js +0 -82
- package/gui/.next/server/chunks/711.js +0 -1
- package/gui/.next/server/chunks/900.js +0 -1
- package/gui/.next/server/chunks/901.js +0 -22
- package/gui/.next/static/ZGJuemeaiW4yT7CTlmjdG/_buildManifest.js +0 -1
- package/gui/.next/static/chunks/661-5fc9351358e2f084.js +0 -1
- package/gui/.next/static/chunks/app/_not-found/page-f15332c94524c284.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/apply-connect-services/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/apply-harness-repo-provisioning/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/apply-harness-secrets/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/apply-linear-setup/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/apply-local-files/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/apply-target-workflow/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/apply-vercel-bridge/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/finalize-target-workflow/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/harness-provisioning-summary/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/linear-options/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/linear-summary/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/local-readiness/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/manual-harness-secret-values/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/preview-connect-services/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/preview-harness-repo-provisioning/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/preview-harness-secrets/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/preview-linear-setup/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/preview-local-files/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/preview-target-workflow/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/preview-vercel-bridge/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/remote-summary/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/summary/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/vercel-bridge-options/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/vercel-bridge-redeploy-status/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/vercel-summary/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/verify-harness-repo/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/verify-service/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/api/setup/verify-target-repo/route-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/layout-10445a363bff6a38.js +0 -1
- package/gui/.next/static/chunks/app/page-979ec1702bd9938a.js +0 -1
- package/gui/.next/static/chunks/app/settings/configure/page-25b2288ace2949a1.js +0 -1
- package/gui/.next/static/chunks/framework-7318ce553e854ad6.js +0 -1
- package/gui/.next/static/chunks/main-app-732547e2b1a794b6.js +0 -1
- package/gui/.next/static/chunks/main-f7a784f5852cbbd1.js +0 -1
- package/gui/.next/static/chunks/pages/_error-bda15e7831eec981.js +0 -1
- package/gui/.next/static/css/781f3c93b6d7425a.css +0 -3
- package/workspace-snapshot/files/apps/gui/components/custom/setup-dashboard.tsx +0 -124
- package/workspace-snapshot/files/apps/gui/components/custom/setup-readonly-sections.tsx +0 -210
- /package/gui/.next/static/{ZGJuemeaiW4yT7CTlmjdG → wM7YWpWgyTcGc7H5h1u7U}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";exports.id=1304,exports.ids=[1304],exports.modules={1304:(a,b,c)=>{c.d(b,{pA:()=>f9,ix:()=>f5,kd:()=>fG,$X:()=>fS,xS:()=>fX,R6:()=>fE,T9:()=>fv,ty:()=>gc,n3:()=>fI,R7:()=>f_,BP:()=>fJ,BD:()=>f3,g1:()=>f2,oV:()=>fT,VP:()=>fO,F2:()=>fV,xQ:()=>fP,Ig:()=>f7,W8:()=>fz,SE:()=>fw,Bw:()=>ft,CP:()=>fA,al:()=>fy,XV:()=>fY,F$:()=>fZ,bT:()=>fQ,oO:()=>f0,b1:()=>f8,K7:()=>f4,A5:()=>fF,LV:()=>fR,Rm:()=>fW,HV:()=>fD,P9:()=>fu,$$:()=>gb,j3:()=>fH,hp:()=>f$,u4:()=>f6});var d=c(77598),e=c(83954),f=c(51455),g=c(12884),h=c(87285),i=c(19965),j=c(57362),k=c(84998);async function l(a){try{return await (0,f.access)(a),!0}catch{return!1}}function m(a,b=[]){return(0,j.qs)(a,b)}async function n(a){if(!await l(a.envExample))throw Error(`Missing source file: ${a.envExample}`);return(0,f.readFile)(a.envExample,"utf8")}async function o(a){let{paths:b,force:c=!1,mode:d="apply"}=a,e=k.gr,h=await l(b.envLocal);if(h&&!c)return m({actionId:"scaffold-env-local",outcome:"skipped",targetPath:b.envLocal,permission:g.P.localFileWrite,reason:"already exists",logMessage:`skipped ${e} (already exists)`});let i=await n(b);return"dry-run"===d?m({actionId:"scaffold-env-local",outcome:h?"wouldChange":"preview",targetPath:b.envLocal,content:i,permission:g.P.localFileWrite,reason:h?"would overwrite with --force":"would create",logMessage:h?`would overwrite ${e}`:`would create ${e}`}):(await (0,f.copyFile)(b.envExample,b.envLocal),m({actionId:"scaffold-env-local",outcome:"changed",targetPath:b.envLocal,content:i,permission:g.P.localFileWrite,reason:h?"overwrote existing file":"created new file",logMessage:`${h?"overwrote":"created"} ${e}`}))}async function p(a){let{paths:b,force:c=!1,mode:d="apply"}=a,e=k.gr,h=await l(b.envLocal),i=(0,j.B8)(a.input);if(h&&!c)return m({actionId:"write-env-local",outcome:"skipped",targetPath:b.envLocal,permission:g.P.localFileWrite,reason:"already exists",logMessage:`skipped ${e} (already exists)`});let n=a.content??function(a){let b=a?.harnessConfigPath??k.it,c=a?.linearApiKey??"",d=a?.cursorApiKey??"",e=a?.githubToken??"";return`# Operator local setup — generated by harness setup core
|
|
2
|
+
# Do not commit .env.local (gitignored).
|
|
3
|
+
|
|
4
|
+
# --- Local private harness config (local only) ---
|
|
5
|
+
# Points at your structured target-repo config file.
|
|
6
|
+
# Edit .harness/config.local.json after init; keep this path unchanged.
|
|
7
|
+
HARNESS_CONFIG_PATH=${b}
|
|
8
|
+
|
|
9
|
+
# --- GitHub Actions only (cloud runs) — do NOT put in .env.local ---
|
|
10
|
+
# HARNESS_CONFIG_JSON_B64 replaces the whole harness config for that run.
|
|
11
|
+
# It is NOT an overlay with committed harness.config.json.
|
|
12
|
+
# Base64-encode your full .harness/config.local.json and set it as a
|
|
13
|
+
# GitHub Actions secret on the harness repo. Include every repo you want
|
|
14
|
+
# the harness to manage in repos[] and allowedTargetRepos[].
|
|
15
|
+
|
|
16
|
+
# --- Live automation API keys (local CLI) ---
|
|
17
|
+
# Fill these in .env.local for local doctor and harness runs.
|
|
18
|
+
LINEAR_API_KEY=${c}
|
|
19
|
+
CURSOR_API_KEY=${d}
|
|
20
|
+
|
|
21
|
+
# Local CLI name for GitHub API access (doctor merge profile, handoff, merge).
|
|
22
|
+
# In GitHub Actions the secret is named HARNESS_GITHUB_TOKEN (workflow maps it
|
|
23
|
+
# to runtime GITHUB_TOKEN). Do not use HARNESS_GITHUB_TOKEN in .env.local.
|
|
24
|
+
GITHUB_TOKEN=${e}
|
|
25
|
+
`}(a.input);return"dry-run"===d?m({actionId:"write-env-local",outcome:h?"wouldChange":"preview",targetPath:b.envLocal,content:n,permission:g.P.localFileWrite,reason:h?"would overwrite with --force":"would create",logMessage:h?`would overwrite ${e}`:`would create ${e}`},i):(await (0,f.writeFile)(b.envLocal,n,"utf8"),m({actionId:"write-env-local",outcome:"changed",targetPath:b.envLocal,content:n,permission:g.P.localFileWrite,reason:h?"overwrote existing file":"created new file",logMessage:`${h?"overwrote":"created"} ${e}`},i))}var q=c(45081);let r=g.P.localFileWrite.scope;function s(a){if(!a)return"";let b=0;for(let c=0;c<a.length;c+=1)b=(b+a.charCodeAt(c))%0x3b9aca07;return`${a.length}:${b}`}function t(a){return{harnessConfigPath:a.harnessConfigPath,githubDispatchRepository:a.githubDispatchRepository,linearApiKey:a.linearApiKey,cursorApiKey:a.cursorApiKey,githubToken:a.githubToken,vercelToken:a.vercelToken}}async function u(a){let[b,c]=await Promise.all([(0,h.X_)(a.envLocal),(0,h.X_)(a.configLocal)]);return{envLocalPath:a.envLocal,configLocalPath:a.configLocal,envLocalHash:b,configLocalHash:c}}function v(a){return{harnessConfigPath:a.harnessConfigPath?.trim()??"",githubDispatchRepository:a.githubDispatchRepository?.trim()??"",linearApiKeyToken:s(a.linearApiKey?.trim()??""),cursorApiKeyToken:s(a.cursorApiKey?.trim()??""),githubTokenToken:s(a.githubToken?.trim()??""),vercelTokenToken:s(a.vercelToken?.trim()??""),preserveLinear:!a.linearApiKey?.trim(),preserveCursor:!a.cursorApiKey?.trim(),preserveGithub:!a.githubToken?.trim(),preserveVercel:!a.vercelToken?.trim()}}function w(a,b,c){return JSON.stringify({cwd:c??process.cwd(),paths:{envLocal:b.envLocalPath,configLocal:b.configLocalPath},baselines:{envLocalHash:b.envLocalHash,configLocalHash:b.configLocalHash},env:v(a.env),config:(0,q.W)(a.config)})}async function x(a){let b=await (0,h.Hn)(a),{access:d}=await Promise.resolve().then(c.t.bind(c,51455,23)),e=!1;try{await d(a.configLocal),e=!0}catch{e=!1}return{envExists:!!b,configExists:e,envAction:b?"update":"create",configAction:e?"update":"create"}}async function y(a,b){let c=await (0,h.Hn)(a),d=await (0,h.ed)(a),e=(0,h._b)(c,b),f=(0,h.HF)(d,e),g=[...(0,h.Ol)(e),...(0,j.B8)(b)];return{mergedEnv:e,envContent:f,knownSecrets:g}}async function z(a){var b;let c=(0,k.ym)(a.cwd),d=t(a.env),{mergedEnv:e,envContent:f,knownSecrets:i}=await y(c,d),l=(0,j.qs)({actionId:"write-env-local",outcome:"preview",targetPath:c.envLocal,content:f,permission:g.P.localFileWrite,reason:f?"would update merged env":"would create env"},i),m=await u(c);return{fingerprint:(b=a.env,JSON.stringify({cwd:a.cwd??process.cwd(),paths:{envLocal:m.envLocalPath,configLocal:m.configLocalPath},baselines:{envLocalHash:m.envLocalHash,configLocalHash:m.configLocalHash},env:v(b)})),envPreview:(0,h.W)(f),envKeyPresence:(0,h.lL)(e),envResult:l}}async function A(a){if(!a.confirmed)throw Error("Local file writes require explicit confirmation");let b=await z({cwd:a.cwd,env:a.env});if(a.fingerprint!==b.fingerprint)throw Error("Preview fingerprint is stale. Regenerate preview before applying.");let c=(0,k.ym)(a.cwd),d=t(a.env),{envContent:e,knownSecrets:f}=await y(c,d);if((0,h.W)(e)!==b.envPreview)throw Error("Preview fingerprint is stale. Regenerate preview before applying.");return{envResult:(0,j.qs)(await p({paths:c,mode:"apply",content:e,force:!0}),f)}}async function B(a){var b,c;let d,e,f=(0,k.ym)(a.cwd),l=t(a.payload.env),{mergedEnv:m,envContent:n,knownSecrets:o}=await y(f,l),p="";try{p=(0,q.nb)(a.payload.config).json,e=await (0,i.writeConfigLocal)({paths:f,mode:"dry-run",content:p,force:!0})}catch(a){d=a instanceof Error?a.message:String(a),p="",e={actionId:"write-config-local",outcome:"preview",targetPath:f.configLocal,permission:g.P.localFileWrite,reason:(b=d,(0,j.h4)(b,o))}}let r=(0,j.qs)({actionId:"write-env-local",outcome:"preview",targetPath:f.envLocal,content:n,permission:g.P.localFileWrite,reason:n?"would update merged env":"would create env"},o),s=await x(f),v=await u(f);return{fingerprint:w(a.payload,v,a.cwd),plan:s,envPreview:(0,h.W)(n),configPreview:p,envKeyPresence:(0,h.lL)(m),envResult:r,configResult:(0,j.qs)(e,o),validationError:d?(c=d,(0,j.h4)(c,o)):void 0}}async function C(a){if(!a.confirmed)throw Error("Local file writes require explicit confirmation");let b=(0,k.ym)(a.cwd),c=await u(b),d=w(a.payload,c,a.cwd);if(a.fingerprint!==d)throw Error("Preview fingerprint is stale. Regenerate preview before applying.");let e=await B({cwd:a.cwd,payload:a.payload});if(e.validationError)throw Error(e.validationError);if(e.envResult.permission.scope!==r||e.configResult.permission.scope!==r)throw Error("Only local-file-write actions are allowed in Milestone 4");let g=t(a.payload.env),{envContent:l,knownSecrets:m}=await y(b,g);if((0,h.W)(l)!==e.envPreview)throw Error("Preview fingerprint is stale. Regenerate preview before applying.");await (0,f.mkdir)(b.harnessDir,{recursive:!0});let n=(0,j.qs)(await p({paths:b,mode:"apply",content:l,force:!0}),m);return{envResult:n,configResult:(0,j.qs)(await (0,i.writeConfigLocal)({paths:b,mode:"apply",content:e.configPreview,force:!0}),m),plan:await x(b)}}async function D(a){let b=(0,k.ym)(a.cwd),c=await (0,h.Hn)(b),d=void 0!==a.githubDispatchRepositoryId?String(a.githubDispatchRepositoryId):void 0,e=(0,h._b)(c,{githubDispatchRepository:a.githubDispatchRepository.trim(),githubDispatchRepositoryId:d}),f=c?.values.GITHUB_DISPATCH_REPOSITORY?.trim()===a.githubDispatchRepository.trim(),i=void 0===d||c?.values.GITHUB_DISPATCH_REPOSITORY_ID?.trim()===d;if(f&&i)return{actionId:"write-env-local",outcome:"skipped",targetPath:b.envLocal,permission:g.P.localFileWrite,reason:"GITHUB_DISPATCH_REPOSITORY already persisted."};let j=await (0,h.ed)(b);return p({paths:b,mode:"apply",content:(0,h.HF)(j,e),force:!0})}var E=c(84107),F=c(4631),G=c(95332),H=c(75365),I=c(29281),J=c(84783),K=c(50615);let L=[{group:"configuration",match:a=>a.includes("harness config")||a.includes("allowedTargetRepos")||a.includes("harness.config.json")},{group:"filesystem",match:a=>a.includes("runs/ directory writable")},{group:"linear",match:a=>a.startsWith("LINEAR_API_KEY")},{group:"cursor",match:a=>a.startsWith("CURSOR_API_KEY")||a.startsWith("Cursor models.list")||a.startsWith("Cursor repositories.list")},{group:"github",match:a=>a.startsWith("GITHUB_TOKEN")||a.includes("base branch exists")||a.includes("PR head-branch write")}];var M=c(5890);let N={scaffoldEnvLocal:{id:"scaffold-env-local",label:"Scaffold .env.local",description:"Create or update local environment file from committed example",permission:g.P.localFileWrite},scaffoldConfigLocal:{id:"scaffold-config-local",label:"Scaffold .harness/config.local.json",description:"Create or update private harness config from committed example",permission:g.P.localFileWrite},generateHarnessConfigB64Instructions:{id:"generate-harness-config-b64-instructions",label:"Generate HARNESS_CONFIG_JSON_B64 instructions",description:"Produce manual copy-paste steps for GitHub Actions config secret",permission:g.P.readOnly},generateGitHubSecretInstructions:{id:"generate-github-secret-instructions",label:"Generate GitHub Actions secret instructions",description:"Produce manual copy-paste steps for harness repo secrets",permission:g.P.readOnly},applyHarnessSecrets:{id:F.PN.applyHarnessSecrets.id,label:F.PN.applyHarnessSecrets.label,description:F.PN.applyHarnessSecrets.description,permission:F.PN.applyHarnessSecrets.permission},futureSetGitHubSecrets:{id:F.PN.applyHarnessSecrets.id,label:F.PN.applyHarnessSecrets.label,description:F.PN.applyHarnessSecrets.description,permission:F.PN.applyHarnessSecrets.permission},previewHarnessSecrets:{id:F.PN.previewHarnessSecrets.id,label:F.PN.previewHarnessSecrets.label,description:F.PN.previewHarnessSecrets.description,permission:F.PN.previewHarnessSecrets.permission},previewTargetWorkflowPr:{id:F.PN.previewTargetWorkflowPr.id,label:F.PN.previewTargetWorkflowPr.label,description:F.PN.previewTargetWorkflowPr.description,permission:F.PN.previewTargetWorkflowPr.permission},applyTargetWorkflowPr:{id:F.PN.applyTargetWorkflowPr.id,label:F.PN.applyTargetWorkflowPr.label,description:F.PN.applyTargetWorkflowPr.description,permission:F.PN.applyTargetWorkflowPr.permission}};async function O(a){let b=(0,k.ym)(a?.cwd),c=a?.force??!1,d=a?.mode??"apply",e=[],g=[];"apply"===d&&await (0,f.mkdir)(b.harnessDir,{recursive:!0});let h=await o({paths:b,force:c,mode:d});e.push(h),h.logMessage&&g.push(h.logMessage);let j=await (0,i.vb)({paths:b,force:c,mode:d});return e.push(j),j.logMessage&&g.push(j.logMessage),{results:e,logMessages:g}}var P=c(8846);async function Q(a){try{return await (0,f.access)(a),!0}catch{return!1}}async function R(a){let b={LINEAR_API_KEY:!1,CURSOR_API_KEY:!1,GITHUB_TOKEN:!1,VERCEL_TOKEN:!1,HARNESS_CONFIG_PATH:!1};try{for(let c of(await (0,f.readFile)(a,"utf8")).split("\n")){let a=c.trim();if(!a||a.startsWith("#"))continue;let d=a.indexOf("=");if(-1===d)continue;let e=a.slice(0,d).trim(),f=a.slice(d+1).trim();e in b&&f.length>0&&(b[e]=!0)}}catch{}return b}function S(a){return{repoCount:a.repos.length,repos:a.repos.map(a=>({id:a.id,targetRepo:a.targetRepo,baseBranch:a.baseBranch,productionBranch:a.productionBranch,previewProvider:a.previewProvider,linearProjects:a.linearProjects,linearAssociations:(a.linearAssociations??[]).map(a=>({workspaceId:a.workspaceId,teamId:a.teamId,projectId:a.projectId}))})),linearTeamKey:a.linear?.teamKey,allowedTargetRepos:a.allowedTargetRepos,closureValid:function(a){try{return(0,I.g1)(a),!0}catch{return!1}}(a),model:(0,P.M)(a)}}async function T(a){let b=(0,k.ym)(a?.cwd),c=a?.envLocalExists??await Q(b.envLocal),d=a?.configLocalExists??await Q(b.configLocal),e=[];if(a?.configParseError?e.push({label:"harness config valid",ok:!1,detail:a.configParseError}):a?.config?(e.push({label:"harness config valid",ok:!0,detail:"resolved for local GUI summary"}),e.push({label:"allowedTargetRepos covers all repo mappings",ok:!0})):e.push({label:"harness config valid",ok:!1,detail:"config could not be resolved"}),e.push({label:".env.local present",ok:c,detail:c?b.envLocal:"run npm run harness:operator:init"}),e.push({label:".harness/config.local.json present",ok:d,detail:d?b.configLocal:"run npm run harness:operator:init"}),a?.config){let b=(0,P.M)(a.config);e.push({label:"Cursor model policy resolved",ok:!0,detail:`${b.resolvedModelId} (${b.source})`})}return e.push({label:"LINEAR_API_KEY set",ok:!1,skipped:!0,detail:"remote provider checks are CLI-only in Milestone 3"}),e.push({label:"CURSOR_API_KEY set",ok:!1,skipped:!0,detail:"remote provider checks are CLI-only in Milestone 3"}),e.push({label:"GITHUB_TOKEN set",ok:!1,skipped:!0,detail:"remote provider checks are CLI-only in Milestone 3"}),e}let U=new Set(["HARNESS_CONFIG_JSON_B64","HARNESS_CONFIG_JSON"]);function V(a,b,c){return{kind:a.kind,label:U.has(a.kind)?a.kind:a.label,resolved:b,parseError:c}}async function W(a){let b,c=a?.cwd??process.cwd();(0,e.Re)(c);let d=(0,k.ym)(c),f=await Q(d.envLocal),g=await Q(d.configLocal),h=await R(d.envLocal),l=null,m=(0,J.m)({baseDir:c}),n=V(m,!1);try{let a=await (0,I.rL)({baseDir:c});l=a.config,n=V(a.source,!0)}catch(a){n=V(m,!1,b=a instanceof Error?a.message:String(a))}let o=await O({cwd:c,mode:"dry-run"}),q=await p({paths:d,mode:"dry-run",input:{}}),r=await (0,i.writeConfigLocal)({paths:d,mode:"dry-run",input:{repos:[{id:"target-app",linearProjects:["Example Target App"],targetRepo:"https://github.com/owner/example-target-app"}]}}),s=(0,K.RB)(),t=await (0,E.z8)({cwd:c}),u=(0,E.OW)(t),v=await T({cwd:c,config:l,configParseError:b,envLocalExists:f,configLocalExists:g}),w=function(a){let b=new Map;for(let c of a){let a=L.find(a=>a.match(c.label))?.group??"configuration",d=b.get(a)??[];d.push(c),b.set(a,d)}return["configuration","filesystem","linear","cursor","github"].filter(a=>b.has(a)).map(a=>({group:a,checks:b.get(a)??[]}))}(v),x=!!l&&!b,y=x&&g&&("HARNESS_CONFIG_PATH"===n.kind||"cli-config"===n.kind),z=f&&g;return function(a,b=[]){let c=a=>(0,j.h4)((0,j.QJ)(a),b);return{...a,scaffoldPreviews:a.scaffoldPreviews.map(a=>(0,j.qs)(a,b)),instructionPreviews:a.instructionPreviews.map(a=>(0,j.qs)(a,b)),generatedPreviews:{envLocal:a.generatedPreviews.envLocal?c(a.generatedPreviews.envLocal):void 0,configLocal:a.generatedPreviews.configLocal},missingSteps:a.missingSteps.map(a=>({...a,detail:c(a.detail)})),doctor:{...a.doctor,checks:a.doctor.checks.map(a=>({...a,detail:a.detail?c(a.detail):void 0})),groups:a.doctor.groups.map(a=>({...a,checks:a.checks.map(a=>({...a,detail:a.detail?c(a.detail):void 0}))}))}}}({overview:{readyForLocalDoctor:x&&z,configResolved:x,operatorConfigResolved:y,localFilesPresent:z},localFiles:[{label:".env.local",path:d.envLocal,exists:f},{label:".harness/config.local.json",path:d.configLocal,exists:g},{label:".env.example",path:d.envExample,exists:await Q(d.envExample)},{label:".harness/config.example.json",path:d.configExample,exists:await Q(d.configExample)}],configSource:{...n,parseError:b,resolved:x},configSummary:l?S(l):S(s),envKeyPresence:h,scaffoldPreviews:o.results,instructionPreviews:[function(a){let b=(0,M.te)(a);return{actionId:N.generateHarnessConfigB64Instructions.id,outcome:"preview",permission:N.generateHarnessConfigB64Instructions.permission,manualInstructions:b.steps,content:b.command,reason:b.summary}}({configPath:".harness/config.local.json"}),function(a){let b=(0,M.sJ)(a);return{actionId:N.generateGitHubSecretInstructions.id,outcome:"preview",permission:N.generateGitHubSecretInstructions.permission,manualInstructions:b.steps,reason:b.summary}}({harnessRepo:u})],generatedPreviews:{envLocal:q.content,configLocal:r.content??JSON.stringify(s,null,2)},missingSteps:function(a){let b=[];return a.envExists||b.push({id:"missing-env-local",label:"Create .env.local",detail:"Run npm run harness:operator:init to scaffold local env files."}),a.configExists||b.push({id:"missing-config-local",label:"Create .harness/config.local.json",detail:"Run npm run harness:operator:init, then edit your target repo mapping."}),a.configParseError?b.push({id:"config-parse-error",label:"Fix harness config parse errors",detail:a.configParseError}):a.configResolved||b.push({id:"config-unresolved",label:"Point harness config resolution at your private config",detail:"Set HARNESS_CONFIG_PATH in .env.local to .harness/config.local.json."}),a.envKeyPresence.HARNESS_CONFIG_PATH||b.push({id:"missing-harness-config-path",label:"Set HARNESS_CONFIG_PATH",detail:"Keep HARNESS_CONFIG_PATH=.harness/config.local.json in .env.local."}),a.envKeyPresence.LINEAR_API_KEY||b.push({id:"missing-linear-key",label:"Add LINEAR_API_KEY for live doctor and harness runs",detail:"Fill LINEAR_API_KEY in .env.local when ready for live validation."}),a.envKeyPresence.CURSOR_API_KEY||b.push({id:"missing-cursor-key",label:"Add CURSOR_API_KEY for live cloud agent phases",detail:"Fill CURSOR_API_KEY in .env.local when ready for live validation."}),a.envKeyPresence.GITHUB_TOKEN||b.push({id:"missing-github-token",label:"Add GITHUB_TOKEN for handoff and merge checks",detail:"Fill GITHUB_TOKEN in .env.local when ready for live validation."}),a.envKeyPresence.VERCEL_TOKEN||b.push({id:"missing-vercel-token",label:"Add VERCEL_TOKEN for Vercel bridge setup",detail:"Fill VERCEL_TOKEN in .env.local for Configure-time Vercel inspection."}),b}({envExists:f,configExists:g,configResolved:x,configParseError:b,envKeyPresence:h}),doctor:{checks:v,groups:w,failed:v.some(a=>!a.ok&&!a.skipped),remoteChecksNote:"Live Linear, GitHub, and Cursor doctor checks remain CLI-only in Milestone 3. Run npm run harness:doctor for full validation."},deferredActions:[]},function(){let a=[],b=process.env.HARNESS_CONFIG_JSON?.trim();b&&a.push(b);let c=process.env.HARNESS_CONFIG_JSON_B64?.trim();if(c){a.push(c);try{a.push(Buffer.from(c,"base64").toString("utf8"))}catch{}}return a}())}var X=c(4907),Y=c(79148);let Z=".p-dev/product.json",$="README.md",_="main",aa=Y.Ik({platformRuntime:Y.Yj().min(1),languageFramework:Y.Yj().min(1),repositoryStructure:Y.Yj().optional(),testingStrategy:Y.Yj().optional(),ciStrategy:Y.Yj().optional()});Y.Ik({schemaVersion:Y.eu(1),createdBy:Y.eu("p-dev"),initializationStatus:Y.k5(["uninitialized","initialized"]),createdAt:Y.Yj().datetime(),operationId:Y.Yj().min(1),creationActionId:Y.Yj().min(1),approvedArchitecture:aa.optional()});let ab=/^[a-zA-Z0-9._-]+$/,ac=new Set(["settings","admin","root","api","www","mail","support","help","status","security"]);function ad(a){let b=a.trim();return b?b.length>100?{ok:!1,reason:"Repository name must be 100 characters or fewer."}:ab.test(b)?b.startsWith(".")||b.endsWith(".")?{ok:!1,reason:"Repository name cannot start or end with a dot."}:b.includes("..")?{ok:!1,reason:"Repository name cannot contain consecutive dots."}:ac.has(b.toLowerCase())?{ok:!1,reason:"Repository name is reserved."}:{ok:!0,normalized:b}:{ok:!1,reason:"Repository name may only contain letters, numbers, dots, underscores, and hyphens."}:{ok:!1,reason:"Repository name is required."}}function ae(a,b){return a.trim().toLowerCase()!==b.trim().toLowerCase()?{ok:!1,reason:"Repository owner must match the authenticated GitHub user."}:{ok:!0}}var af=c(76760),ag=c.n(af);let ah=new Map;async function ai(a,b){let c,d=ah.get(a)??Promise.resolve(),e=new Promise(a=>{c=a}),f=d.then(()=>e);ah.set(a,f),await d;try{return await b()}finally{c(),ah.get(a)===f&&ah.delete(a)}}function aj(a){let b=(0,k.ym)(a);return ag().join(b.harnessDir,"target-repo-provisioning")}function ak(a,b){return ag().join(aj(b),`${a}.json`)}async function al(a,b){try{let c=await (0,f.readFile)(ak(a,b),"utf8"),d=JSON.parse(c);if("string"!=typeof d.operationId||"string"!=typeof d.creationActionId||"string"!=typeof d.createdAt||"string"!=typeof d.previewFingerprint)return null;return d}catch{return null}}async function am(a,b){let c=aj(b);await (0,f.mkdir)(c,{recursive:!0});let d=ak(a.operationId,b),e=`${d}.${process.pid}.${Date.now()}.tmp`;await (0,f.writeFile)(e,`${JSON.stringify(a,null,2)}
|
|
26
|
+
`,"utf8"),await (0,f.rename)(e,d)}function an(a){return{owner:a.owner.trim(),name:a.name.trim(),description:a.description?.trim()??"",visibility:a.visibility??"private"}}function ao(a){var b;return b={action:"target-repo-provisioning",owner:a.owner,name:a.name,description:a.description,visibility:a.visibility,operationId:a.operationId,creationActionId:a.creationActionId,createdAt:a.createdAt,mainBranch:_,devBranch:"dev",initialFilePaths:[$,Z]},(0,d.createHash)("sha256").update(JSON.stringify(b)).digest("hex").slice(0,16)}async function ap(a,b,c){let d=await a.verifyBranchExists(b,c,_);if(!d){let e=await a.getRepositoryMetadata(b,c),f=e?.defaultBranch;if(f&&f!==_){let e=await a.getRepositoryDefaultBranchHead(b,c,f);await a.createGitRef(b,c,_,e),d=!0}}if(!d)throw Error(`Repository ${b}/${c} is missing required branch ${_}.`);let e=await a.ensureDefaultBranch(b,c,_);return{mainSha:await a.getRepositoryDefaultBranchHead(b,c,_),defaultBranchCorrected:e.corrected}}async function aq(a,b,c,d){for(let e of[$,Z])if(!await a.readRepositoryFileContent(b,c,e,d))throw Error(`Missing ${e} on branch ${d}.`)}async function ar(a){let b=an(a.request),c=ad(b.name);if(!c.ok)return{state:"invalid-input",fingerprint:"",operationId:a.request.operationId??"",creationActionId:a.request.creationActionId??"",createdAt:a.request.createdAt??"",owner:b.owner,repositoryName:b.name,repositoryFullName:`${b.owner}/${b.name}`,visibility:b.visibility,description:b.description,initialBranches:[_,"dev"],initialFilePaths:[$,Z],resultingTargetRepoConfigId:`target-${b.name}`,actionsWillPerform:[],actionsWillNotPerform:[],message:c.reason,resumedFromPending:!1};let e=await a.provider.resolveAuthenticatedUser(),f=ae(b.owner,e.login);if(!f.ok)return{state:"invalid-input",fingerprint:"",operationId:a.request.operationId??"",creationActionId:a.request.creationActionId??"",createdAt:a.request.createdAt??"",owner:b.owner,repositoryName:c.normalized,repositoryFullName:`${b.owner}/${c.normalized}`,visibility:b.visibility,description:b.description,initialBranches:[_,"dev"],initialFilePaths:[$,Z],resultingTargetRepoConfigId:`target-${c.normalized}`,actionsWillPerform:[],actionsWillNotPerform:[],message:f.reason,resumedFromPending:!1};let g=`${b.owner}/${c.normalized}`;if("repository_already_exists"===await a.provider.checkRepositoryAvailability(b.owner,c.normalized))return{state:"repository_already_exists",fingerprint:"",operationId:a.request.operationId??"",creationActionId:a.request.creationActionId??"",createdAt:a.request.createdAt??"",owner:b.owner,repositoryName:c.normalized,repositoryFullName:g,visibility:b.visibility,description:b.description,initialBranches:[_,"dev"],initialFilePaths:[$,Z],resultingTargetRepoConfigId:`target-${c.normalized}`,actionsWillPerform:[],actionsWillNotPerform:["Overwrite or repurpose an existing repository","Select an application stack or framework","Configure application deployment"],message:"A repository with this name already exists.",connectExistingHint:`https://github.com/${g}`,resumedFromPending:!1};let h=a.request.operationId,i=a.request.creationActionId,j=a.request.createdAt,k=!1;if(h){let b=await al(h,a.cwd);b&&(i=b.creationActionId,j=b.createdAt,k=!0)}h=h??(0,d.randomUUID)(),i=i??(0,d.randomUUID)(),j=j??new Date().toISOString();let l=ao({owner:b.owner,name:c.normalized,description:b.description,visibility:b.visibility,operationId:h,creationActionId:i,createdAt:j}),m=[`Create private repository ${g}`.replace("private",b.visibility),`Ensure ${_} exists and is the GitHub default branch`,`Add ${$} and ${Z} in one commit on ${_}`,`Create dev from the final ${_} head`];return{state:"preview-ready",fingerprint:l,operationId:h,creationActionId:i,createdAt:j,owner:b.owner,repositoryName:c.normalized,repositoryFullName:g,visibility:b.visibility,description:b.description,initialBranches:[_,"dev"],initialFilePaths:[$,Z],resultingTargetRepoConfigId:`target-${c.normalized}`,actionsWillPerform:m,actionsWillNotPerform:["Select an application stack or framework","Add package manifests, source directories, or stack-specific CI","Configure application deployment or Vercel application hosting","Install the generic PDev target workflow (handled in setup Step 7)"],message:k?"Resume target repository provisioning from saved operation state.":"Ready to create a technology-neutral product repository.",resumedFromPending:k}}async function as(a){if(!a.apply.confirmed)return{state:"invalid-input",operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,repositoryUrl:null,repositoryFullName:null,repositoryId:null,mainSha:null,devSha:null,defaultBranchCorrected:!1,initialFilePaths:[$,Z],message:"Explicit confirmation is required before applying repository creation."};let b=an(a.apply),c=ad(b.name);if(!c.ok)return{state:"invalid-input",operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,repositoryUrl:null,repositoryFullName:null,repositoryId:null,mainSha:null,devSha:null,defaultBranchCorrected:!1,initialFilePaths:[$,Z],message:c.reason};let e=`${b.owner}/${c.normalized}`;if(ao({owner:b.owner,name:c.normalized,description:b.description,visibility:b.visibility,operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,createdAt:a.apply.createdAt})!==a.apply.fingerprint)return{state:"preview-stale",operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,repositoryUrl:null,repositoryFullName:e,repositoryId:null,mainSha:null,devSha:null,defaultBranchCorrected:!1,initialFilePaths:[$,Z],message:"Target repository provisioning preview is stale."};let f=await a.provider.resolveAuthenticatedUser(),g=ae(b.owner,f.login);return g.ok?ai(a.cwd??process.cwd(),async()=>{var g;let h=await al(a.apply.operationId,a.cwd);if(h){let c=(g={operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,owner:b.owner,repositoryFullName:e,previewFingerprint:a.apply.fingerprint},h.operationId!==g.operationId?{ok:!1,reason:"Provisioning operation ID does not match."}:h.creationActionId!==g.creationActionId?{ok:!1,reason:"Provisioning creation action ID does not match."}:h.repositoryFullName!==g.repositoryFullName?{ok:!1,reason:"Provisioning repository name does not match."}:`${h.targetOwner}/${h.targetRepo}`!==g.repositoryFullName?{ok:!1,reason:"Provisioning owner/repo does not match."}:h.previewFingerprint!==g.previewFingerprint?{ok:!1,reason:"Provisioning preview fingerprint does not match."}:{ok:!0});if(!c.ok)return{state:"preview-stale",operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,repositoryUrl:null,repositoryFullName:e,repositoryId:null,mainSha:null,devSha:null,defaultBranchCorrected:!1,initialFilePaths:[$,Z],message:c.reason}}else if("repository_already_exists"===await a.provider.checkRepositoryAvailability(b.owner,c.normalized))return{state:"repository_already_exists",operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,repositoryUrl:`https://github.com/${e}`,repositoryFullName:e,repositoryId:null,mainSha:null,devSha:null,defaultBranchCorrected:!1,initialFilePaths:[$,Z],message:"A repository with this name already exists.",connectExistingHint:`https://github.com/${e}`};let i=function(a){var b,c;let d={schemaVersion:1,createdBy:"p-dev",initializationStatus:"uninitialized",createdAt:(b={createdAt:a.createdAt,operationId:a.operationId,creationActionId:a.creationActionId}).createdAt,operationId:b.operationId,creationActionId:b.creationActionId};return[{path:$,content:(c=a.productName,`# ${c}
|
|
27
|
+
|
|
28
|
+
This product repository was created by PDev.
|
|
29
|
+
|
|
30
|
+
The product architecture has not been selected yet. Describe the product you want to build in Linear and begin with planning.
|
|
31
|
+
`)},{path:Z,content:`${JSON.stringify(d,null,2)}
|
|
32
|
+
`}]}({productName:c.normalized,createdAt:a.apply.createdAt,operationId:a.apply.operationId,creationActionId:a.apply.creationActionId}),j=i.find(a=>a.path===Z)?.content,k=j?(0,d.createHash)("sha256").update(j).digest("hex").slice(0,16):void 0,l=h??{operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,createdAt:a.apply.createdAt,authenticatedUserId:f.id,authenticatedLogin:f.login,targetOwner:b.owner,targetRepo:c.normalized,repositoryFullName:e,visibility:b.visibility,description:b.description,previewFingerprint:a.apply.fingerprint,startedAt:a.apply.createdAt,phase:"pending-preview",completionState:"incomplete",markerPath:Z,markerContentHash:k};h||await am(l,a.cwd);try{let d=l.repositoryId,f=l.mainSha,g=l.devSha,h=l.defaultBranchCorrected??!1;if(d||(d=(await a.provider.createPersonalRepository({owner:b.owner,name:c.normalized,description:b.description,visibility:b.visibility})).repositoryId,l={...l,repositoryId:d,phase:"repository-created"},await am(l,a.cwd)),!f||"repository-created"===l.phase){let d=await ap(a.provider,b.owner,c.normalized);f=d.mainSha,h=d.defaultBranchCorrected,l={...l,mainSha:f,defaultBranchCorrected:h,phase:h?"default-branch-corrected":"main-verified"},await am(l,a.cwd)}let j=await a.provider.getRepositoryMetadata(b.owner,c.normalized),m=await a.provider.getRepositoryDefaultBranchHead(b.owner,c.normalized,_);await a.provider.readRepositoryFileContent(b.owner,c.normalized,Z,_)?f=m:(f=(await a.provider.writeBootstrapCommit({owner:b.owner,repo:c.normalized,branch:_,parentSha:m,files:i,message:"Initialize PDev product repository"})).commitSha,l={...l,mainSha:f,markerContentHash:k,phase:"bootstrap-committed"},await am(l,a.cwd));let n=await a.provider.getRepositoryDefaultBranchHead(b.owner,c.normalized,_);return f=n,await a.provider.verifyBranchExists(b.owner,c.normalized,"dev")||await a.provider.createGitRef(b.owner,c.normalized,"dev",n),g=await a.provider.getRepositoryDefaultBranchHead(b.owner,c.normalized,"dev"),await aq(a.provider,b.owner,c.normalized,_),await aq(a.provider,b.owner,c.normalized,"dev"),l={...l,mainSha:f,devSha:g,repositoryId:d??j?.repositoryId,phase:"verified-complete",completionState:"complete"},await am(l,a.cwd),{state:"verified-complete",operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,repositoryUrl:`https://github.com/${e}`,repositoryFullName:e,repositoryId:l.repositoryId??null,mainSha:f,devSha:g,defaultBranchCorrected:h,initialFilePaths:[$,Z],message:h?"Repository created; GitHub default branch was corrected to main.":"Repository created and verified."}}catch(c){l={...l,completionState:"setup-incomplete"},await am(l,a.cwd);let b=c instanceof Error?c.message:"Repository setup incomplete.";return{state:"setup-incomplete",operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,repositoryUrl:`https://github.com/${e}`,repositoryFullName:e,repositoryId:l.repositoryId??null,mainSha:l.mainSha??null,devSha:l.devSha??null,defaultBranchCorrected:l.defaultBranchCorrected??!1,initialFilePaths:[$,Z],message:`Repository created; setup incomplete. ${b}`}}}):{state:"owner-mismatch",operationId:a.apply.operationId,creationActionId:a.apply.creationActionId,repositoryUrl:null,repositoryFullName:e,repositoryId:null,mainSha:null,devSha:null,defaultBranchCorrected:!1,initialFilePaths:[$,Z],message:g.reason}}var at=c(55827),au=c(643),av=c(50053),aw=c(26618),ax=c(67470),ay=c(34185);async function az(a){let b=a.explicitRepo?.trim();if(b){let a=(0,ay.e)(b);if(a)return{repo:a,source:"env-local"}}let c=await (0,E.vE)(a.cwd),d=c?(0,ay.e)(c):null;return d?{repo:d,source:"git-remote-origin"}:null}var aA=c(7285);let aB="preview";function aC(a){return a.trim().toLowerCase()}function aD(a){let b=a.trim(),c=b.indexOf("/");if(-1===c)return b.toLowerCase();let d=b.slice(0,c),e=b.slice(c+1);return`${d.trim().toLowerCase()}/${e.trim().toLowerCase()}`}function aE(a){return{operationId:a.operationId,authenticatedUserId:a.user.id,authenticatedLogin:aC(a.user.login),destination:aD(a.destination),packageName:a.manifest.packageName,packageVersion:a.manifest.packageVersion,sourceRepository:a.manifest.sourceRepository,sourceCommit:a.manifest.sourceCommit,manifestSchemaVersion:a.manifest.schemaVersion,snapshotFingerprint:a.snapshotFingerprint,snapshotContentId:a.manifest.snapshotContentId.trim(),snapshotSha256:a.manifest.snapshotSha256,snapshotGitTreeSha1:a.manifest.gitRootTreeSha1,classification:a.classification,envBaseline:aD(a.envBaseline||""),pDevVersion:a.pDevVersion.trim(),resumedFromPending:a.resumedFromPending,creationPreviewFingerprint:a.creationPreviewFingerprint}}var aF=c(22043),aG=c(8334);let aH=new Map;async function aI(a,b){let c,d=aH.get(a)??Promise.resolve(),e=new Promise(a=>{c=a}),f=d.then(()=>e);aH.set(a,f),await d;try{return await b()}finally{c(),aH.get(a)===f&&aH.delete(a)}}function aJ(a){let b=(0,k.ym)(a);return ag().join(b.harnessDir,"p-dev-harness-provisioning.pending.json")}async function aK(a){try{let b=await (0,f.readFile)(aJ(a),"utf8"),c=JSON.parse(b);if("string"!=typeof c.operationId||"number"!=typeof c.authenticatedUserId||"string"!=typeof c.previewFingerprint||"string"!=typeof c.snapshotContentId)return null;return c}catch{return null}}async function aL(a,b){let c=aJ(b);await (0,f.mkdir)(ag().dirname(c),{recursive:!0});let d=`${c}.${process.pid}.${Date.now()}.tmp`;await (0,f.writeFile)(d,`${JSON.stringify(a,null,2)}
|
|
33
|
+
`,"utf8"),await (0,f.rename)(d,c)}async function aM(a){try{await (0,f.rm)(aJ(a),{force:!0})}catch{}}function aN(a,b){return void 0!==b.operationId&&a.operationId!==b.operationId?{ok:!1,reason:"Pending provisioning operation ID does not match."}:a.authenticatedUserId!==b.authenticatedUserId?{ok:!1,reason:"Pending provisioning authenticated user ID does not match."}:a.authenticatedLogin!==b.authenticatedLogin?{ok:!1,reason:"Pending provisioning authenticated login does not match."}:a.packageName!==b.packageName?{ok:!1,reason:"Pending provisioning package name does not match."}:a.packageVersion!==b.packageVersion?{ok:!1,reason:"Pending provisioning package version does not match."}:a.sourceRepository!==b.sourceRepository?{ok:!1,reason:"Pending provisioning source repository does not match."}:a.sourceCommit!==b.sourceCommit?{ok:!1,reason:"Pending provisioning source commit does not match."}:a.manifestSchemaVersion!==b.manifestSchemaVersion?{ok:!1,reason:"Pending provisioning manifest schema version does not match."}:a.snapshotContentId!==b.snapshotContentId?{ok:!1,reason:"Pending provisioning snapshot content ID does not match."}:a.snapshotSha256!==b.snapshotSha256?{ok:!1,reason:"Pending provisioning snapshot digest does not match."}:a.snapshotGitTreeSha1!==b.snapshotGitTreeSha1?{ok:!1,reason:"Pending provisioning snapshot tree SHA does not match."}:a.targetOwner!==b.targetOwner?{ok:!1,reason:"Pending provisioning target owner does not match."}:a.targetRepo!==b.targetRepo?{ok:!1,reason:"Pending provisioning target repository does not match."}:void 0!==b.previewFingerprint&&a.previewFingerprint!==b.previewFingerprint?{ok:!1,reason:"Pending provisioning creation fingerprint does not match."}:void 0!==b.defaultBranch&&void 0!==a.defaultBranch&&a.defaultBranch!==b.defaultBranch?{ok:!1,reason:"Pending provisioning default branch does not match."}:void 0!==a.repositoryId&&void 0===a.defaultBranch&&void 0!==b.defaultBranch?{ok:!1,reason:"Pending provisioning state is missing default branch."}:{ok:!0}}function aO(a){switch(a){case"repository-created":case"creating-private-workspace":default:return"creating-private-workspace";case"preparing-snapshot":case"preparing-workspace-snapshot":case"snapshot-objects-uploading":return"preparing-workspace-snapshot";case"workspace-uploading":case"uploading-workspace":return"uploading-workspace";case"snapshot-commit-created":case"marker-pending":case"verifying":case"verifying-workspace":return"verifying-workspace";case"description-pending":case"persistence-pending":case"saving-configuration":return"saving-configuration"}}function aP(a){switch(a){case"creating-private-workspace":return"Creating private workspace";case"preparing-workspace-snapshot":return"Preparing workspace snapshot";case"uploading-workspace":return"Uploading workspace";case"verifying-workspace":return"Verifying workspace";case"saving-configuration":return"Saving configuration"}}function aQ(a,b){return`Retry Step 1 Continue to resume operation ${b} from checkpoint ${a??"unknown"}.`}function aR(a){let b=(0,k.ym)(a);return ag().join(b.harnessDir,"p-dev-harness-provisioning.progress.json")}async function aS(a,b){let c=a.uiPhase??aO(a.phase),d=Date.parse(a.startedAt),e=a.elapsedMs??(Number.isFinite(d)?Math.max(0,Date.now()-d):0),g={operationId:a.operationId,phase:a.phase,uiPhase:c,phaseStartedAt:a.phaseStartedAt,startedAt:a.startedAt,elapsedMs:e,completed:a.completed,total:a.total,rateLimitPauseSeconds:a.rateLimitPauseSeconds,lastSafeCheckpoint:a.lastSafeCheckpoint,recoveryInstruction:a.recoveryInstruction??aQ(a.lastSafeCheckpoint??a.phase,a.operationId),updatedAt:new Date().toISOString()},h=aR(b);await (0,f.mkdir)(ag().dirname(h),{recursive:!0});let i=`${h}.${process.pid}.${Date.now()}.tmp`;return await (0,f.writeFile)(i,`${JSON.stringify(g,null,2)}
|
|
34
|
+
`,"utf8"),await (0,f.rename)(i,h),g}async function aT(a){try{let b=await (0,f.readFile)(aR(a),"utf8"),c=JSON.parse(b);if("string"!=typeof c.operationId||"string"!=typeof c.phase)return null;return{...c,uiPhase:c.uiPhase??aO(c.phase),recoveryInstruction:c.recoveryInstruction??aQ(c.lastSafeCheckpoint??c.phase,c.operationId)}}catch{return null}}async function aU(a){try{await (0,f.rm)(aR(a),{force:!0})}catch{}}async function aV(a){let b=await aT(a.cwd),c=a.pending,d=b?.operationId??c?.operationId??null,e=b?.phase??c?.phase??null,f=e?aO(e):null;return{operationId:d,phase:e,uiPhase:f,uiPhaseLabel:f?aP(f):null,phaseStartedAt:b?.phaseStartedAt??null,startedAt:b?.startedAt??c?.startedAt??null,elapsedMs:b?.elapsedMs??null,completed:b?.completed??null,total:b?.total??null,rateLimitPauseSeconds:b?.rateLimitPauseSeconds??null,lastSafeCheckpoint:b?.lastSafeCheckpoint??c?.phase??null,recoveryInstruction:b?.recoveryInstruction??(d?aQ(e??void 0,d):null),pendingPhase:c?.phase??null,pendingRepositoryId:c?.repositoryId??null,pendingTargetRepo:c?.targetOwner&&c?.targetRepo?`${c.targetOwner}/${c.targetRepo}`:c?.targetRepo??null,hasPendingState:!!c?.operationId}}async function aW(a,b){let c=function(a){let b=(0,k.ym)(a);return ag().join(b.harnessDir,"p-dev-harness-provisioning.last-run.json")}(b);await (0,f.mkdir)(ag().dirname(c),{recursive:!0});let d=`${c}.${process.pid}.${Date.now()}.tmp`;return await (0,f.writeFile)(d,`${JSON.stringify(a,null,2)}
|
|
35
|
+
`,"utf8"),await (0,f.rename)(d,c),a}async function aX(a){let b=function(a){let b=[];void 0!==a.authenticationMs&&b.push({phase:"authentication",durationMs:a.authenticationMs});let c=a.snapshotProvisioning;c?.repositoryCreateReconcileMs!==void 0&&b.push({phase:"repository-reconciliation",durationMs:c.repositoryCreateReconcileMs});let d=c?.gitTransport,e=(d?.objectTreePreparationMs??0)+(d?.packCreationMs??0)+(c?.workspaceUploadMs??0);e>0&&b.push({phase:"object-import",durationMs:e});let f=(d?.temporaryGitPreparationMs??0)+(d?.initialRemoteFetchMs??0);f>0&&b.push({phase:"commit-creation",durationMs:f}),d?.gitPushMs!==void 0&&b.push({phase:"push",durationMs:d.gitPushMs});let g=a.remoteVerificationMs??d?.remoteVerificationMs;return void 0!==g&&b.push({phase:"remote-verification",durationMs:g}),void 0!==a.localPersistenceMs&&b.push({phase:"local-persistence",durationMs:a.localPersistenceMs}),b}(a.timings),c=b.reduce((a,b)=>a+b.durationMs,0);return aW({operationId:a.operationId,outcome:a.outcome,completedAt:new Date().toISOString(),phases:b,totalMs:c},a.cwd)}var aY=c(1913),aZ=c(23465),a$=c(80988),a_=c(45599),a0=c(16051);class a1{constructor(a={}){this.pauseUntilMs=0,this.secondaryStrikeCount=0,this.now=a.now??(()=>Date.now()),this.sleep=a.sleep??(a=>new Promise(b=>setTimeout(b,a)))}get pauseDeadlineMs(){return this.pauseUntilMs}async waitBeforeMutation(){let a=this.pauseUntilMs-this.now();a>0&&await this.sleep(a)}recordRateLimitFailure(a){(403===a.status||429===a.status)&&(!(void 0!==a.retryAfterSeconds&&a.retryAfterSeconds>0||0===a.rateLimitRemaining&&void 0!==a.rateLimitResetEpochSeconds)||(0,a_.pe)(a.message))&&(this.secondaryStrikeCount+=1);let b=(0,a_.J6)({error:a,secondaryStrikeCount:this.secondaryStrikeCount,nowMs:this.now()});return this.pauseUntilMs=Math.max(this.pauseUntilMs,this.now()+b),b}}var a2=c(71992);async function a3(a,b,c){let d;try{return await Promise.race([c(),new Promise((c,e)=>{d=setTimeout(()=>{e(new a$.gk("remote-phase-timeout",`Provisioning phase "${a}" timed out after ${b}ms. Retry Step 1 Continue to resume or reconcile.`,!0))},b)})])}finally{d&&clearTimeout(d)}}let a4=function(a=process.env.HARNESS_SNAPSHOT_UPLOAD_CONCURRENCY){if(void 0===a||""===a.trim())return 2;let b=a.trim();if(!/^\d+$/.test(b))throw Error("Invalid HARNESS_SNAPSHOT_UPLOAD_CONCURRENCY: must be an integer between 1 and 4.");let c=Number(b);if(c<1||c>4)throw Error("Invalid HARNESS_SNAPSHOT_UPLOAD_CONCURRENCY: must be between 1 and 4.");return c}(),a5=Number(process.env.HARNESS_SNAPSHOT_UPLOAD_RETRIES??3);function a6(a){return Math.round(au.performance.now()-a)}function a7(a){return new Promise(b=>setTimeout(b,a))}function a8(a){return a instanceof ax.OS&&(!!(0,a_.df)(a)||408===a.status||a.status>=500)}async function a9(a,b,c){let d=0;for(;;){await b.gate.waitBeforeMutation();try{return await a()}catch(a){if(d+=1,!(a instanceof ax.OS))throw a;if((0,a_.df)(a)){let e=b.gate.recordRateLimitFailure(a);if(b.onRateLimitPause?.(Math.ceil(e/1e3),c),d>a5)throw a;continue}if(a8(a)&&d<=a5){let a=Math.min(8e3,250*2**(d-1));await a7(a+Math.floor(100*Math.random()));continue}throw a}}}async function ba(a,b,c){let d=Array(a.length),e=0,f=Array.from({length:Math.max(1,b)},async()=>{for(;;){let b=e;if(e+=1,b>=a.length)return;d[b]=await c(a[b],b)}});return await Promise.all(f),d}async function bb(a){let b=new Map,c=a.manifest.files;a.onProgress?.({phase:"snapshot-objects-uploading",uploadedBlobs:0,totalBlobs:c.length});let d=0;return await ba(c,a4,async e=>{let f=await (0,a0.bY)({snapshotRoot:a.snapshotRoot,path:e.path,expectedSha256:e.sha256}),g=await a9(()=>a.provider.createGitBlob({owner:a.owner,repo:a.repo,content:f}),a.retryContext,"snapshot-objects-uploading");if(g.sha!==e.gitBlobSha1)throw Error(`Uploaded blob SHA mismatch for ${e.path} (expected ${e.gitBlobSha1}, got ${g.sha}).`);b.set(e.path,g.sha),d+=1,a.onProgress?.({phase:"snapshot-objects-uploading",uploadedBlobs:d,totalBlobs:c.length})}),b}async function bc(a){let b=(0,a$.ig)({operationId:a.operationId,sourceCommit:a.manifest.sourceCommit}),c=await a9(()=>a.provider.createGitTree({owner:a.owner,repo:a.repo,tree:a.manifest.files.map(b=>({path:b.path,mode:b.mode,type:"blob",sha:a.blobShaByPath.get(b.path)??b.gitBlobSha1}))}),a.retryContext,"snapshot-commit-created");if(c.sha!==a.manifest.gitRootTreeSha1)throw new a$.gk("snapshot-tree-mismatch",`Snapshot tree SHA mismatch (expected ${a.manifest.gitRootTreeSha1}, got ${c.sha}).`,!1);return(await a9(()=>a.provider.createGitCommit({owner:a.owner,repo:a.repo,message:`Initialize p-dev harness workspace snapshot (${a.manifest.packageVersion})`,tree:c.sha,parents:[a.parentCommitSha],author:b,committer:b}),a.retryContext,"snapshot-commit-created")).sha}async function bd(a){let b=(0,a$.ig)({operationId:a.operationId,sourceCommit:a.sourceCommit}),c=await a9(()=>a.provider.createGitBlob({owner:a.owner,repo:a.repo,content:Buffer.from(a.markerContent,"utf8")}),a.retryContext,"marker-pending"),d=await a9(()=>a.provider.createGitTree({owner:a.owner,repo:a.repo,baseTree:a.snapshotTreeSha,tree:[{path:aF.wJ,mode:"100644",type:"blob",sha:c.sha}]}),a.retryContext,"marker-pending");if(d.sha===a.snapshotTreeSha)throw new a$.gk("marker-commit-failed","Marker tree must overlay the snapshot tree rather than replace it.",!1);let e=await a9(()=>a.provider.createGitCommit({owner:a.owner,repo:a.repo,message:"Initialize p-dev managed harness workspace marker",tree:d.sha,parents:[a.parentCommitSha],author:b,committer:b}),a.retryContext,"marker-pending").catch(a=>{throw new a$.gk("marker-commit-failed",a instanceof Error?a.message:"Marker commit creation failed.",!0)});return(await a.provider.getGitRef(a.owner,a.repo,a.defaultBranch)).object.sha===e.sha||await a9(()=>a.provider.updateGitRef({owner:a.owner,repo:a.repo,ref:a.defaultBranch,sha:e.sha,force:!1,expectedSha:a.parentCommitSha}),a.retryContext,"marker-pending"),e.sha}async function be(a){let b=await a.provider.getRepositoryMetadata(a.owner,a.repoName);if(!b||!b.private||!b.permissions.admin||b.owner!==a.owner||b.repo!==a.repoName||!(0,a$.DR)(b.description,a.operationId))return null;let c=await a.provider.getRepositoryDefaultBranchHead(a.owner,a.repoName,b.defaultBranch);return{repositoryId:b.repositoryId,defaultBranch:b.defaultBranch,initializedCommitSha:c}}async function bf(a){let{attempts:b,initialDelayMs:c}={attempts:Number(process.env.HARNESS_SNAPSHOT_RECONCILE_ATTEMPTS??5),initialDelayMs:Number(process.env.HARNESS_SNAPSHOT_RECONCILE_DELAY_MS??500)};for(let d=0;d<b;d+=1){let e=await be(a);if(e)return e;if(d<b-1){let a=c*2**d+Math.floor(100*Math.random());await a7(a)}}return null}async function bg(a){let b=await a.provider.getRepositoryMetadata(a.owner,a.repo);if(!b)throw new a$.gk("description-finalization-failed","Destination repository is not accessible for description finalization.",!0);if(await a.provider.getRepositoryDefaultBranchHead(a.owner,a.repo,a.defaultBranch)!==a.markerCommitSha)throw new a$.gk("description-finalization-failed","Marker commit is not at branch HEAD; refusing to finalize repository description.",!0);let c=b.description??"";if(c!==a.normalDescription){if(!(0,a$.DR)(c,a.operationId))throw new a$.gk("description-finalization-failed","Repository description does not match the expected operation ownership marker.",!1);try{await a.provider.updateUserRepositoryDescription({owner:a.owner,repo:a.repo,description:a.normalDescription})}catch(a){throw new a$.gk("description-finalization-failed",a instanceof Error?a.message:"Description finalization failed.",!0)}}}async function bh(a){if(!a.pending.repositoryId)return{ok:!1,message:"Pending state is missing repository ID."};let b=await a.provider.getRepositoryMetadata(a.pending.targetOwner,a.pending.targetRepo);if(!b)return{ok:!1,message:"Pending destination repository no longer exists."};if(b.repositoryId!==a.pending.repositoryId)return{ok:!1,message:"Pending destination repository ID does not match remote repository."};if(b.owner!==a.pending.targetOwner||b.repo!==a.pending.targetRepo)return{ok:!1,message:"Pending destination repository slug does not match remote repository."};if(!b.private||!b.permissions.admin)return{ok:!1,message:"Pending destination repository is not private/admin-accessible."};if(a.pending.defaultBranch&&b.defaultBranch!==a.pending.defaultBranch)return{ok:!1,message:"Pending destination repository default branch does not match remote repository."};let c=a.pending.defaultBranch??b.defaultBranch,d=await a.provider.getRepositoryDefaultBranchHead(b.owner,b.repo,c);if(a.pending.markerCommitSha&&d!==a.pending.markerCommitSha&&a.pending.snapshotCommitSha&&d!==a.pending.snapshotCommitSha&&a.pending.initializedCommitSha&&d!==a.pending.initializedCommitSha)return{ok:!1,message:"Pending destination repository HEAD does not match recorded phase."};if(a.pending.snapshotCommitSha){let c=await a.provider.getGitCommit(b.owner,b.repo,a.pending.snapshotCommitSha);if(c.tree.sha!==a.manifest.gitRootTreeSha1)return{ok:!1,message:"Recorded snapshot commit tree does not match embedded manifest."};if(a.pending.initializedCommitSha&&c.parents[0]?.sha!==a.pending.initializedCommitSha)return{ok:!1,message:"Recorded snapshot commit parent does not match initialized commit."}}if(a.pending.markerCommitSha&&a.pending.snapshotCommitSha){let c=await a.provider.getGitCommit(b.owner,b.repo,a.pending.markerCommitSha);if(c.parents[0]?.sha!==a.pending.snapshotCommitSha)return{ok:!1,message:"Recorded marker commit parent does not match snapshot commit."}}return{ok:!0}}async function bi(a){var b;let c=a.user.login,{repo:d}=(0,X.Jj)(`${c}/${a.repoName}`),e=(b={onRateLimitPause:(b,c)=>{a.onProgress?.({phase:c,uploadedBlobs:a.pending?.snapshotCommitSha?a.manifest.fileCount:0,totalBlobs:a.manifest.fileCount,rateLimitPauseSeconds:b})}},{gate:new a1,onRateLimitPause:b?.onRateLimitPause}),f={},g=au.performance.now();if(a.pending?.repositoryId){let b=await bh({provider:a.provider,pending:a.pending,manifest:a.manifest});if(!b.ok)return{ok:!1,message:b.message,recoverable:!1,code:"repository-identity-mismatch"}}let h=a.pending?.repositoryId,i=a.pending?.defaultBranch,j=a.pending?.initializedCommitSha;if(h&&j&&!i){let b=await a.provider.getRepositoryMetadata(c,d);b&&(i=b.defaultBranch)}if(!h||!j){let b,e=(0,a$.qm)(a.description,a.operationId);try{let f=await a.provider.createUserRepository({name:a.repoName,description:e,private:!0,autoInit:!0}),g=await a.provider.getGitRef(c,d,f.defaultBranch);b={repositoryId:f.repositoryId,defaultBranch:f.defaultBranch,initializedCommitSha:g.object.sha}}catch(d){if(a8(d)){let e=await bf({provider:a.provider,owner:c,repoName:a.repoName,operationId:a.operationId});if(e)b=e;else throw d}else if(d instanceof ax.OS&&422===d.status){let d=await bf({provider:a.provider,owner:c,repoName:a.repoName,operationId:a.operationId});if(!d)return{ok:!1,message:"Repository creation returned an ambiguous result and no matching operation-owned repository was found.",recoverable:!0,code:"repository-create-ambiguous"};b=d}else throw d}h=b.repositoryId,i=b.defaultBranch,j=b.initializedCommitSha,await a.onCheckpoint?.({phase:"repository-created",repositoryId:h,defaultBranch:i,initializedCommitSha:j}),a.onProgress?.({phase:"repository-created",uploadedBlobs:0,totalBlobs:a.manifest.fileCount})}if(f.repositoryCreateReconcileMs=a6(g),!i)return{ok:!1,message:"Provisioning state is missing the repository default branch.",recoverable:!1,code:"repository-identity-mismatch"};let k=i,l=a.pending?.snapshotCommitSha,m=a.pending?.markerCommitSha,n=(await a.provider.getGitRef(c,d,k)).object.sha;if(m&&n===m);else if(l&&n===l&&!m);else if(l&&m&&n!==m&&n!==l)return{ok:!1,message:`Remote branch changed unexpectedly (expected marker ${m} or snapshot ${l}, found ${n}). Force push is not allowed.`,recoverable:!0,code:"ref-update-unexpected-head"};else if(!l&&n!==j&&n!==a.pending?.snapshotCommitSha)try{let b=await a.provider.getGitCommit(c,d,n);if(b.parents[0]?.sha===j)l=n,await a.onCheckpoint?.({phase:"snapshot-commit-created",repositoryId:h,defaultBranch:k,initializedCommitSha:j,snapshotCommitSha:l,snapshotGitTreeSha1:a.manifest.gitRootTreeSha1});else if(b.parents[0]?.sha){let e=await a.provider.getGitCommit(c,d,b.parents[0].sha);if(e.parents[0]?.sha===j)l=b.parents[0].sha,m=n,await a.onCheckpoint?.({phase:"marker-pending",repositoryId:h,defaultBranch:k,initializedCommitSha:j,snapshotCommitSha:l,markerCommitSha:m,snapshotGitTreeSha1:a.manifest.gitRootTreeSha1});else if(n!==j)return{ok:!1,message:`Remote branch changed unexpectedly (expected initialized commit ${j}, found ${n}). Force push is not allowed.`,recoverable:!0,code:"ref-update-unexpected-head"}}else if(n!==j)return{ok:!1,message:`Remote branch changed unexpectedly (expected initialized commit ${j}, found ${n}). Force push is not allowed.`,recoverable:!0,code:"ref-update-unexpected-head"}}catch{if(n!==j)return{ok:!1,message:`Remote branch changed unexpectedly (expected initialized commit ${j}, found ${n}). Force push is not allowed.`,recoverable:!0,code:"ref-update-unexpected-head"}}let o="function"==typeof a.provider.pushHarnessSnapshotCommits;if(!o||l&&m){if(!o){if(!l){let b=await bb({provider:a.provider,owner:c,repo:d,snapshotRoot:a.snapshotRoot,manifest:a.manifest,retryContext:e,onProgress:a.onProgress});l=await bc({provider:a.provider,owner:c,repo:d,manifest:a.manifest,parentCommitSha:j,operationId:a.operationId,blobShaByPath:b,retryContext:e}),(await a.provider.getGitRef(c,d,k)).object.sha!==l&&await a9(()=>a.provider.updateGitRef({owner:c,repo:d,ref:k,sha:l,force:!1,expectedSha:j}),e,"snapshot-commit-created"),await a.onCheckpoint?.({phase:"snapshot-commit-created",repositoryId:h,defaultBranch:k,initializedCommitSha:j,snapshotCommitSha:l,snapshotGitTreeSha1:a.manifest.gitRootTreeSha1}),a.onProgress?.({phase:"snapshot-commit-created",uploadedBlobs:a.manifest.fileCount,totalBlobs:a.manifest.fileCount})}if(!m){let b=(0,aF.a)({repository:`${c}/${a.repoName}`,repositoryId:h,manifest:a.manifest,snapshotCommitSha:l,operationId:a.operationId,createdByGithubUserId:a.user.id,createdByLogin:a.user.login,pDevVersion:a.packageVersion,defaultBranch:k});try{m=await bd({provider:a.provider,owner:c,repo:d,defaultBranch:k,parentCommitSha:l,snapshotTreeSha:a.manifest.gitRootTreeSha1,markerContent:`${JSON.stringify(b,null,2)}
|
|
36
|
+
`,operationId:a.operationId,sourceCommit:a.manifest.sourceCommit,retryContext:e})}catch(a){if(a instanceof a$.gk&&"marker-commit-failed"===a.code)return{ok:!1,message:a.message,recoverable:!0,code:a.code};throw a}await a.onCheckpoint?.({phase:"marker-pending",repositoryId:h,defaultBranch:k,initializedCommitSha:j,snapshotCommitSha:l,markerCommitSha:m,snapshotGitTreeSha1:a.manifest.gitRootTreeSha1}),a.onProgress?.({phase:"marker-pending",uploadedBlobs:a.manifest.fileCount,totalBlobs:a.manifest.fileCount})}}}else{let b=l??j,e=l?"snapshot-commit-created":"repository-created";a.onProgress?.({phase:"preparing-snapshot",uploadedBlobs:0,totalBlobs:a.manifest.fileCount,completed:0,total:a.manifest.fileCount,lastSafeCheckpoint:e}),await a.onCheckpoint?.({phase:"preparing-snapshot",repositoryId:h,defaultBranch:k,initializedCommitSha:j,snapshotCommitSha:l,markerCommitSha:m,snapshotGitTreeSha1:a.manifest.gitRootTreeSha1});try{let g=(0,a2.CM)(),i=au.performance.now(),n=await a3("workspace-uploading",g,()=>a.provider.pushHarnessSnapshotCommits({owner:c,repo:d,defaultBranch:k,expectedHeadSha:b,initializedCommitSha:j,snapshotRoot:a.snapshotRoot,manifest:a.manifest,operationId:a.operationId,packageVersion:a.packageVersion,existingSnapshotCommitSha:l,timeoutMs:g,buildMarkerContent:b=>{let d=(0,aF.a)({repository:`${c}/${a.repoName}`,repositoryId:h,manifest:a.manifest,snapshotCommitSha:b,operationId:a.operationId,createdByGithubUserId:a.user.id,createdByLogin:a.user.login,pDevVersion:a.packageVersion,defaultBranch:k});return`${JSON.stringify(d,null,2)}
|
|
37
|
+
`},onProgress:b=>{a.onProgress?.({phase:b.phase,uploadedBlobs:b.completed??0,totalBlobs:b.total??a.manifest.fileCount,completed:b.completed,total:b.total??a.manifest.fileCount,lastSafeCheckpoint:e})}}));f.workspaceUploadMs=a6(i),f.gitTransport=n.timings,l=n.snapshotCommitSha,m=n.markerCommitSha,await a.onCheckpoint?.({phase:"snapshot-commit-created",repositoryId:h,defaultBranch:k,initializedCommitSha:j,snapshotCommitSha:l,snapshotGitTreeSha1:a.manifest.gitRootTreeSha1}),await a.onCheckpoint?.({phase:"marker-pending",repositoryId:h,defaultBranch:k,initializedCommitSha:j,snapshotCommitSha:l,markerCommitSha:m,snapshotGitTreeSha1:a.manifest.gitRootTreeSha1}),a.onProgress?.({phase:"verifying",uploadedBlobs:a.manifest.fileCount,totalBlobs:a.manifest.fileCount,completed:a.manifest.fileCount,total:a.manifest.fileCount,lastSafeCheckpoint:"marker-pending"})}catch(a){if(a instanceof a$.gk&&("marker-commit-failed"===a.code||"workspace-upload-failed"===a.code||"workspace-upload-timeout"===a.code||"remote-phase-timeout"===a.code||"ref-update-unexpected-head"===a.code||"snapshot-tree-mismatch"===a.code))return{ok:!1,message:a.message,recoverable:a.recoverable,code:a.code};throw a}}try{let b=au.performance.now();await bg({provider:a.provider,owner:c,repo:d,operationId:a.operationId,normalDescription:a.description,markerCommitSha:m,defaultBranch:k}),f.descriptionFinalizationMs=a6(b)}catch(b){if(b instanceof a$.gk&&"description-finalization-failed"===b.code)return await a.onCheckpoint?.({phase:"description-pending",repositoryId:h,defaultBranch:k,initializedCommitSha:j,snapshotCommitSha:l,markerCommitSha:m,snapshotGitTreeSha1:a.manifest.gitRootTreeSha1}),{ok:!1,message:b.message,recoverable:b.recoverable,code:b.code};throw b}return{ok:!0,fullName:`${c}/${a.repoName}`,repositoryId:h,defaultBranch:k,initializedCommitSha:j,snapshotCommitSha:l,markerCommitSha:m,timings:f}}async function bj(a){let{owner:b,repo:c}=(0,X.Jj)(a.repoSlug),d=await a.provider.getRepositoryMetadata(b,c);if(!d)return{ok:!1,message:`Harness workspace ${a.repoSlug} is not accessible.`};if(d.repositoryId!==a.repositoryId)return{ok:!1,message:`Harness workspace repository ID mismatch for ${a.repoSlug}.`};if(!d.private||!d.permissions.admin)return{ok:!1,message:`Harness workspace ${a.repoSlug} must be private and admin-accessible.`};let e=await a.provider.getRepositoryDefaultBranchHead(b,c,d.defaultBranch),f=await a.provider.readRepositoryFileContent(b,c,aF.wJ,e);if(!f)return{ok:!1,message:"Provisioned workspace is missing the managed marker at HEAD."};let g=(0,aF.Dr)(f);if(!g.ok)return{ok:!1,message:g.reason};if(!g.marker.createdFromPackageSnapshot)return{ok:!1,message:"Provisioned workspace marker is not snapshot-backed."};let h=g.marker.createdFromPackageSnapshot;if(h.snapshotContentId!==a.manifest.snapshotContentId||h.snapshotSha256!==a.manifest.snapshotSha256||h.snapshotGitTreeSha1!==a.manifest.gitRootTreeSha1||h.sourceCommit!==a.manifest.sourceCommit)return{ok:!1,message:"Provisioned workspace marker provenance does not match embedded manifest."};let i=await a.provider.getGitCommit(b,c,e),j=i.parents[0]?.sha;return j?(await a.provider.getGitCommit(b,c,j)).tree.sha!==a.manifest.gitRootTreeSha1?{ok:!1,message:"Snapshot commit tree does not match embedded manifest."}:await a.provider.readRepositoryFileContent(b,c,"README.md",e)?{ok:!0}:{ok:!1,message:"Provisioned workspace HEAD is missing README.md from the packaged snapshot."}:{ok:!1,message:"Marker commit is missing a parent snapshot commit."}}var bk=c(88414),bl=c(97631),bm=c(87509),bn=c(45191);let bo=new Set(["100644","100755","120000"]);async function bp(a){let b=new Set;for(let c of a.manifest.files){let d,e=function(a){let b;try{b=(0,bm.b6)(a.path)}catch{return{ok:!1,reason:`Snapshot file path is not canonical: ${a.path}`}}return b!==a.path?{ok:!1,reason:`Snapshot file path is not canonical: ${a.path}`}:(0,bm.lw)(a.path)?{ok:!1,reason:`Forbidden snapshot path: ${a.path}`}:bo.has(a.mode)?"file"===a.type&&"100644"!==a.mode&&"100755"!==a.mode?{ok:!1,reason:`Snapshot file ${a.path} has invalid file mode ${a.mode}.`}:"symlink"===a.type&&"120000"!==a.mode?{ok:!1,reason:`Snapshot symlink ${a.path} must use mode 120000.`}:{ok:!0}:{ok:!1,reason:`Unsupported snapshot mode ${a.mode} for ${a.path}.`}}(c);if(!e.ok)return e;if(b.has(c.path))return{ok:!1,reason:`Duplicate snapshot path: ${c.path}`};b.add(c.path);try{d=await (0,a0.bY)({snapshotRoot:a.snapshotRoot,path:c.path,expectedSha256:c.sha256})}catch(a){return{ok:!1,reason:a instanceof Error?a.message:`Snapshot file ${c.path} failed integrity validation.`}}if(d.byteLength!==c.size)return{ok:!1,reason:`Snapshot file ${c.path} size mismatch (expected ${c.size}, got ${d.byteLength}).`};if((0,bn.bo)(d)!==c.sha256)return{ok:!1,reason:`Snapshot file ${c.path} SHA-256 mismatch.`};if((0,bl.us)(d)!==c.gitBlobSha1)return{ok:!1,reason:`Snapshot file ${c.path} git blob SHA mismatch.`}}return(0,bl.dV)(a.manifest.files)!==a.manifest.gitRootTreeSha1?{ok:!1,reason:"Embedded snapshot root tree SHA does not match manifest files."}:(0,bn.dq)(a.manifest.files)!==a.manifest.snapshotSha256?{ok:!1,reason:"Embedded snapshot digest does not match manifest files."}:(0,bn.Aw)({packageVersion:a.manifest.packageVersion,sourceCommit:a.manifest.sourceCommit,snapshotSha256:a.manifest.snapshotSha256})!==a.manifest.snapshotContentId?{ok:!1,reason:"Embedded snapshot content ID does not match manifest inputs."}:{ok:!0}}async function bq(a,b,c){let d,e,g;if(c?.aborted)return{ok:!1,state:"snapshot-unavailable",message:"Embedded workspace snapshot load was aborted."};try{d=(0,aw.Ot)(b)?(0,aA.QX)(b):(0,aA.HF)(a)}catch(a){return{ok:!1,state:"snapshot-unavailable",message:a instanceof Error?a.message:"Could not resolve packaged workspace snapshot root."}}let h=(0,aA.ro)(d),i=ag().join(h,"manifest.json");try{if(c?.aborted)return{ok:!1,state:"snapshot-unavailable",message:"Embedded workspace snapshot load was aborted."};e=await (0,f.readFile)(i,"utf8")}catch{return{ok:!1,state:"snapshot-manifest-missing",message:"Embedded workspace snapshot manifest is missing from the package."}}let j=(0,bk.parseWorkspaceSnapshotManifestJson)(e);if(!j.ok)return{ok:!1,state:"snapshot-manifest-invalid",message:j.reason};try{g=(0,av.I2)(d)}catch(a){return{ok:!1,state:"snapshot-incompatible",message:a instanceof Error?a.message:"Packaged version metadata is invalid."}}return j.manifest.packageVersion!==g?{ok:!1,state:"snapshot-incompatible",message:`Embedded snapshot package version ${j.manifest.packageVersion} does not match installed package ${g}.`}:{ok:!0,packageRoot:d,snapshotRoot:h,packageVersion:g,manifest:j.manifest,fingerprint:(0,bk.Nk)(j.manifest)}}async function br(a="file:///Users/weston/Code/agentic-product-development-harness/src/setup/harness-workspace-snapshot-loader.ts",b=process.env,c){return bq(a,b,c)}async function bs(a="file:///Users/weston/Code/agentic-product-development-harness/src/setup/harness-workspace-snapshot-loader.ts",b=process.env){let c=await bq(a,b);if(!c.ok)return c;let d=await bp({snapshotRoot:c.snapshotRoot,manifest:c.manifest});return d.ok?c:{ok:!1,state:"snapshot-tampered",message:d.reason}}function bt(a){return Math.round(au.performance.now()-a)}function bu(a){return JSON.stringify(a)}function bv(a){return`${a}/${aZ.Zl}`}function bw(){return{packageName:"p-dev-harness",packageVersion:"",sourceRepository:"",sourceCommit:"",snapshotContentId:null,snapshotFingerprint:null,templateContentId:null}}function bx(a,b){if(!a)return bw();let c=a.manifest.snapshotContentId;return{packageName:a.manifest.packageName,packageVersion:a.manifest.packageVersion,sourceRepository:a.manifest.sourceRepository,sourceCommit:a.manifest.sourceCommit,snapshotContentId:c,snapshotFingerprint:a.fingerprint,templateContentId:b??c}}function by(a){let b=a?.values.GITHUB_DISPATCH_REPOSITORY_ID?.trim();if(!b)return null;let c=Number(b);return!Number.isInteger(c)||c<=0?null:c}function bz(a,b){var c;return{operationId:(c={operationId:b.operationId,authenticatedUserId:b.authenticatedUserId,authenticatedLogin:b.authenticatedLogin,targetOwner:b.targetOwner,targetRepo:b.targetRepo,packageName:a.manifest.packageName,packageVersion:a.manifest.packageVersion,sourceRepository:a.manifest.sourceRepository,sourceCommit:a.manifest.sourceCommit,manifestSchemaVersion:a.manifest.schemaVersion,snapshotContentId:a.manifest.snapshotContentId,snapshotSha256:a.manifest.snapshotSha256,snapshotGitTreeSha1:a.manifest.gitRootTreeSha1,previewFingerprint:b.previewFingerprint}).operationId,authenticatedUserId:c.authenticatedUserId,authenticatedLogin:c.authenticatedLogin,targetOwner:c.targetOwner,targetRepo:c.targetRepo,packageName:c.packageName??aA.Au,packageVersion:c.packageVersion,sourceRepository:c.sourceRepository??aG.Ig,sourceCommit:c.sourceCommit,manifestSchemaVersion:c.manifestSchemaVersion,snapshotContentId:c.snapshotContentId,snapshotSha256:c.snapshotSha256,snapshotGitTreeSha1:c.snapshotGitTreeSha1,previewFingerprint:c.previewFingerprint,defaultBranch:c.defaultBranch}}async function bA(a){let b=bz(a.snapshotPreview,{authenticatedUserId:a.user.id,authenticatedLogin:a.user.login,targetOwner:a.user.login,targetRepo:aZ.Zl});if(a.requestedOperationId){let b=await aK(a.cwd);return b&&b.operationId!==a.requestedOperationId?{ok:!1,state:"concurrent-request-recovered",message:"Another provisioning operation is already in progress for this workspace."}:{ok:!0,operationId:a.requestedOperationId,resumedFromPending:!!b,creationPreviewFingerprint:b?.previewFingerprint??null,pending:b}}let c=await aK(a.cwd);if(!c)return{ok:!0,operationId:(0,d.randomUUID)(),resumedFromPending:!1,creationPreviewFingerprint:null,pending:null};let e=aN(c,b);return e.ok?{ok:!0,operationId:c.operationId,resumedFromPending:!0,creationPreviewFingerprint:c.previewFingerprint,pending:c}:{ok:!1,state:"same-name-unmanaged-collision",message:e.reason}}async function bB(a,b,c){if(b===aZ.mg)return{ok:!1,state:"explicit-packaged-repo-legacy-source",message:"Saved harness repo points at the public source repo. Use advanced recovery to adopt a private managed workspace."};let d=aD(b),e=null;if(c){if(!(e=await a.getRepositoryMetadataById(c)))return{ok:!1,state:"explicit-packaged-repo-invalid",message:`Saved harness repository ID ${c} is missing or inaccessible.`};if(d=aD(`${e.owner}/${e.repo}`),aD(b)!==d&&c!==e.repositoryId)return{ok:!1,state:"explicit-packaged-repo-invalid",message:`Saved harness repo ${b} does not match repository ID ${c}.`}}else{let{owner:b,repo:c}=(0,X.Jj)(d);e=await a.getRepositoryMetadata(b,c)}if(!e)return{ok:!1,state:"explicit-packaged-repo-invalid",message:`Saved harness repo ${b} is missing or inaccessible.`};if(c&&e.repositoryId!==c)return{ok:!1,state:"explicit-packaged-repo-invalid",message:`Saved harness repository ID does not match GitHub metadata for ${d}.`};if(!e.private||"private"!==e.visibility)return{ok:!1,state:"explicit-packaged-repo-invalid",message:`Saved harness repo ${d} must be private in packaged mode.`};if(!e.permissions.admin)return{ok:!1,state:"explicit-packaged-repo-invalid",message:`Saved harness repo ${d} requires admin access.`};let f=await a.readRepositoryFileContent(e.owner,e.repo,aF.wJ,e.defaultBranch);if(!f)return{ok:!1,state:"explicit-packaged-repo-invalid",message:`Saved harness repo ${d} is missing a compatible managed marker.`};let g=(0,aF.Dr)(f);if(!g.ok)return{ok:!1,state:"explicit-packaged-repo-invalid",message:g.reason};let h=(0,aF.qD)(g.marker,d,{repositoryId:e.repositoryId});return h.ok?{ok:!0,repoSlug:d,repositoryId:e.repositoryId,marker:g}:{ok:!1,state:"explicit-packaged-repo-invalid",message:h.reason}}async function bC(a,b,c,d){let e=bv(b.login),{owner:f,repo:g}=(0,X.Jj)(e),h=await a.getRepositoryMetadata(f,g);if(!h)return{kind:"absent"};if(!h.private||"private"!==h.visibility)return{kind:"public-collision"};if(!h.permissions.admin)return{kind:"unmanaged-collision"};let i=await a.readRepositoryFileContent(f,g,aF.wJ,h.defaultBranch);if(i){let a=(0,aF.Dr)(i);if(!a.ok)return{kind:"malformed-marker",reason:a.reason};let b=(0,aF.qD)(a.marker,e,{repositoryId:h.repositoryId});return b.ok?{kind:"valid-managed",repoSlug:e,repositoryId:h.repositoryId}:{kind:"malformed-marker",reason:b.reason}}let j=await aK(c);if(j&&d){let a=aN(j,bz(d,{authenticatedUserId:b.id,authenticatedLogin:b.login,targetOwner:b.login,targetRepo:aZ.Zl}));if(a.ok)return{kind:"snapshot-only-with-pending"};if(!a.ok)return{kind:"unmanaged-collision"}}let k=await a.readRepositoryFileContent(f,g,aZ.Oq,h.defaultBranch);if(k){let a=(0,aZ.eJ)(k);return a.ok?{kind:"snapshot-only-without-pending"}:{kind:"malformed-marker",reason:`Generated repository template identity is invalid: ${a.reason}`}}return{kind:"unmanaged-collision"}}function bD(a){let b=a.snapshotPreview.manifest;return{operationId:a.operationId,authenticatedUserId:a.user.id,authenticatedLogin:a.user.login,packageName:b.packageName,packageVersion:b.packageVersion,sourceRepository:b.sourceRepository,sourceCommit:b.sourceCommit,manifestSchemaVersion:b.schemaVersion,snapshotContentId:b.snapshotContentId,snapshotSha256:b.snapshotSha256,snapshotGitTreeSha1:b.gitRootTreeSha1,targetOwner:a.user.login,targetRepo:aZ.Zl,previewFingerprint:a.previewFingerprint,startedAt:a.pending?.startedAt??new Date().toISOString(),phase:a.phase??a.pending?.phase,repositoryId:a.repositoryId??a.pending?.repositoryId,defaultBranch:a.defaultBranch??a.pending?.defaultBranch,initializedCommitSha:a.initializedCommitSha??a.pending?.initializedCommitSha,snapshotCommitSha:a.snapshotCommitSha??a.pending?.snapshotCommitSha,markerCommitSha:a.markerCommitSha??a.pending?.markerCommitSha}}async function bE(a,b){let{owner:c,repo:d}=(0,X.Jj)(b.repoSlug),e=await a.getRepositoryMetadata(c,d);if(!e)return{ok:!1,message:`Generated harness workspace ${b.repoSlug} is not accessible for marker finalization.`};if(e.repositoryId!==b.repositoryId)return{ok:!1,message:`Generated harness workspace repository ID mismatch for ${b.repoSlug}.`};let f=(0,aF.G0)({repository:b.repoSlug,repositoryId:b.repositoryId,templateIdentity:b.templateIdentity.identity,defaultBranch:b.defaultBranch,sourceHeadSha:b.templateHeadSha,operationId:b.operationId,createdByGithubUserId:b.user.id,createdByLogin:b.user.login,pDevVersion:b.pDevVersion}),g=await a.readRepositoryFileContent(c,d,aF.wJ,b.defaultBranch);if(g){let a=(0,aF.Dr)(g);return a.ok?(0,aF.ok)(a.marker,f)||(0,aF.E5)(a.marker,b.repoSlug,{repositoryId:b.repositoryId})?{ok:!0}:{ok:!1,message:"Existing managed marker belongs to a different operation or repository."}:{ok:!1,message:a.reason}}try{await a.writeRepositoryFile({owner:c,repo:d,path:aF.wJ,branch:b.defaultBranch,message:"Initialize p-dev managed harness workspace marker",content:`${JSON.stringify(f,null,2)}
|
|
38
|
+
`})}catch(a){return{ok:!1,message:a instanceof Error?a.message:"Failed to write managed harness workspace marker."}}return{ok:!0}}async function bF(a,b){let{owner:c,repo:d}=(0,X.Jj)(b),e=await a.getRepositoryMetadata(c,d);if(!e)return{ok:!1,message:`Harness workspace ${b} is not accessible.`};let f=await a.readRepositoryFileContent(c,d,aZ.Oq,e.defaultBranch);if(!f)return{ok:!1,message:"Legacy generated repository template identity is missing."};let g=(0,aZ.eJ)(f);return g.ok?{ok:!0,defaultBranch:e.defaultBranch,repositoryId:e.repositoryId,identity:g}:{ok:!1,message:g.reason}}async function bG(a){let b=(0,aw.Ot)()?"packaged":process.env.P_DEV_RUNTIME_MODE?.trim()?"source":"unknown",c=(0,k.ym)(a.cwd),d=await (0,h.Hn)(c),e=d?.values.GITHUB_DISPATCH_REPOSITORY?.trim(),f=await aK(a.cwd),g={runtimeMode:b,harnessDispatchRepo:e??null,authenticatedLogin:null,verifiedSavedRepo:!1,connectedAutomatically:!1};if(!(0,aw.Ot)()){let c=await az({cwd:a.cwd,explicitRepo:e});if(c)return{...g,harnessDispatchRepo:c.repo,verifiedSavedRepo:!0,eligible:!1,state:"skipped-source-mode",message:"env-local"===c.source?`Using harness workspace ${c.repo} from Step 1 setup.`:`Using harness workspace ${c.repo} detected from git remote.`,recoverable:!1};return{...g,eligible:!1,state:"source"===b?"skipped-source-mode":"skipped-not-packaged",message:"source"===b?"Source mode does not auto-provision a harness workspace.":"Packaged runtime mode is not active.",recoverable:!1}}if(f)return{...g,eligible:!0,state:"repo-created-pending-verification",message:"Harness workspace provisioning is incomplete. Retry Step 1 Continue to resume.",recoverable:!0};if(!e)return{...g,eligible:!0,state:"repo-absent",message:"Packaged workspace provisioning has not completed yet.",recoverable:!0};if(!a.provider)return{...g,eligible:!0,state:"explicit-repo-present",message:`Saved harness workspace ${e} requires server validation.`,recoverable:!0};let i=await a.provider.inspectTokenCapabilities(),j=await bB(a.provider,e,by(d));if(!j.ok)return{...g,eligible:!0,state:j.state,authenticatedLogin:i.login,message:j.message,recoverable:!0};let l=e===bv(i.login)||e===bv(j.marker.marker.createdByLogin??"");return{...g,eligible:!0,state:"verified-and-persisted",harnessDispatchRepo:e,authenticatedLogin:i.login,message:`Connected to validated harness workspace ${e}.`,recoverable:!1,verifiedSavedRepo:!0,connectedAutomatically:l&&!!j.marker.marker.operationId}}async function bH(a){var b,c;let e={creationPreviewFingerprint:null,resumedFromPending:!1,harnessDispatchRepo:null,authenticatedLogin:null,recoverable:!1,willCreateRepository:!1,tokenCapabilities:{tokenType:"unknown",hasRepoScope:!1,hasWorkflowScope:!1,scopeAmbiguous:!0}};if(!(0,aw.Ot)())return{state:"skipped-not-packaged",fingerprint:bu({action:"preview",skipped:!0}),operationId:a.operationId??(0,d.randomUUID)(),message:"Packaged runtime mode is not active.",...e,...bw()};let f=(0,k.ym)(a.cwd),g=await (0,h.Hn)(f),i=g?.values.GITHUB_DISPATCH_REPOSITORY?.trim(),j=(0,av.zL)(),l=await a.provider.inspectTokenCapabilities(),m={login:l.login,tokenType:l.tokenType,oauthScopes:[],hasRepoScope:l.hasRepoScope,hasWorkflowScope:l.hasWorkflowScope},n=(0,aY.Z6)({...m,oauthScopes:l.scopeAmbiguous||"classic"!==l.tokenType?[]:[...l.hasRepoScope?["repo"]:[],...l.hasWorkflowScope?["workflow"]:[]]});if(l.scopeAmbiguous){let b=a.operationId??(0,d.randomUUID)();return{state:"token-scope-ambiguous",fingerprint:bu({action:"preview",operationId:b}),operationId:b,message:n.ok?"Token scope metadata is ambiguous.":n.message,...e,recoverable:!0,harnessDispatchRepo:i??null,authenticatedLogin:l.login,...bw(),tokenCapabilities:{tokenType:l.tokenType,hasRepoScope:l.hasRepoScope,hasWorkflowScope:l.hasWorkflowScope,scopeAmbiguous:l.scopeAmbiguous}}}if(!n.ok){let b="fine-grained"===l.tokenType?"token-unsupported":"unknown"===l.tokenType?"token-scope-ambiguous":"token-insufficient",c=a.operationId??(0,d.randomUUID)();return{state:b,fingerprint:bu({action:"preview",operationId:c}),operationId:c,message:n.message,...e,recoverable:!0,harnessDispatchRepo:i??null,authenticatedLogin:l.login,...bw(),tokenCapabilities:{tokenType:l.tokenType,hasRepoScope:l.hasRepoScope,hasWorkflowScope:l.hasWorkflowScope,scopeAmbiguous:l.scopeAmbiguous}}}let o=await a.provider.resolveAuthenticatedUser();if(i){let b=a.operationId??(0,d.randomUUID)(),c=await bB(a.provider,i,by(g)),f=bu({action:"preview",operationId:b,authenticatedLogin:o.login,explicitRepo:i,pDevVersion:j});if(!c.ok)return{state:c.state,fingerprint:f,operationId:b,message:c.message,...e,recoverable:!0,harnessDispatchRepo:i,authenticatedLogin:o.login,...bw(),tokenCapabilities:{tokenType:l.tokenType,hasRepoScope:l.hasRepoScope,hasWorkflowScope:l.hasWorkflowScope,scopeAmbiguous:l.scopeAmbiguous}};let h=c.marker.marker.createdFromTemplate?.templateContentId??null;return{state:"explicit-repo-present",fingerprint:f,operationId:b,message:`Reconnecting to saved harness workspace ${i}.`,...e,harnessDispatchRepo:i,authenticatedLogin:o.login,...bx(null,h),tokenCapabilities:{tokenType:l.tokenType,hasRepoScope:l.hasRepoScope,hasWorkflowScope:l.hasWorkflowScope,scopeAmbiguous:l.scopeAmbiguous}}}let p=await bs(a.moduleUrl??"file:///Users/weston/Code/agentic-product-development-harness/src/setup/harness-repo-provisioning.ts");if(!p.ok){let b=a.operationId??(0,d.randomUUID)();return{state:p.state,fingerprint:bu({action:"preview",operationId:b}),operationId:b,message:p.message,...e,authenticatedLogin:o.login,...bw(),tokenCapabilities:{tokenType:l.tokenType,hasRepoScope:l.hasRepoScope,hasWorkflowScope:l.hasWorkflowScope,scopeAmbiguous:l.scopeAmbiguous}}}let q=await bA({cwd:a.cwd,requestedOperationId:a.operationId,user:o,snapshotPreview:p});if(!q.ok)return{state:q.state,fingerprint:bu({action:"preview",conflict:q.message}),operationId:a.operationId??(0,d.randomUUID)(),message:q.message,...e,recoverable:!0,authenticatedLogin:o.login,...bx(p),tokenCapabilities:{tokenType:l.tokenType,hasRepoScope:l.hasRepoScope,hasWorkflowScope:l.hasWorkflowScope,scopeAmbiguous:l.scopeAmbiguous}};let{operationId:r,resumedFromPending:s,creationPreviewFingerprint:t}=q,u=bv(o.login),v=await bC(a.provider,o,a.cwd,p),w="snapshot-preview-ready",x=`p-dev will create or reconnect ${u} as your private harness workspace.`,y=!1;switch(v.kind){case"absent":w="repo-absent",y=!0,x=`p-dev will create private harness workspace ${u} from the packaged workspace snapshot.`;break;case"valid-managed":w="valid-existing-managed-repo",x=`Reconnecting to existing managed harness workspace ${u}.`;break;case"public-collision":w="same-name-public-collision",x=`${u} exists but is not private. p-dev will not change it automatically.`;break;case"unmanaged-collision":w="same-name-unmanaged-collision",x=`${u} exists without a compatible managed marker.`;break;case"malformed-marker":w="same-name-malformed-marker",x=v.reason;break;case"snapshot-only-without-pending":w="same-name-snapshot-only-without-pending",x=`${u} looks like an unmanaged generated repo.`;break;case"snapshot-only-with-pending":w="same-name-snapshot-only-with-pending",x=`Resuming snapshot provisioning for ${u}.`}let z=(b={operationId:r,user:o,destination:u,snapshotPreview:p,classification:v.kind,envBaseline:g?.values.GITHUB_DISPATCH_REPOSITORY??"",pDevVersion:j,resumedFromPending:s,creationPreviewFingerprint:t},JSON.stringify({action:aB,operationId:(c=aE({operationId:b.operationId,user:b.user,destination:b.destination,manifest:b.snapshotPreview.manifest,snapshotFingerprint:b.snapshotPreview.fingerprint,classification:b.classification,envBaseline:b.envBaseline,pDevVersion:b.pDevVersion,resumedFromPending:b.resumedFromPending,creationPreviewFingerprint:b.creationPreviewFingerprint})).operationId,authenticatedUserId:c.authenticatedUserId,authenticatedLogin:c.authenticatedLogin,destination:c.destination,packageName:c.packageName,packageVersion:c.packageVersion,sourceRepository:c.sourceRepository,sourceCommit:c.sourceCommit,manifestSchemaVersion:c.manifestSchemaVersion,snapshotFingerprint:c.snapshotFingerprint,snapshotContentId:c.snapshotContentId,snapshotSha256:c.snapshotSha256,snapshotGitTreeSha1:c.snapshotGitTreeSha1,classification:c.classification,envBaseline:c.envBaseline,pDevVersion:c.pDevVersion,resumedFromPending:c.resumedFromPending,creationPreviewFingerprint:c.creationPreviewFingerprint}));return{state:w,fingerprint:z,operationId:r,creationPreviewFingerprint:t,resumedFromPending:s,harnessDispatchRepo:"valid-managed"===v.kind?u:null,authenticatedLogin:o.login,message:x,recoverable:"repo-absent"===w||"valid-existing-managed-repo"===w||"same-name-snapshot-only-with-pending"===w,willCreateRepository:y,...bx(p),tokenCapabilities:{tokenType:l.tokenType,hasRepoScope:l.hasRepoScope,hasWorkflowScope:l.hasWorkflowScope,scopeAmbiguous:l.scopeAmbiguous}}}async function bI(a){return aI((0,k.ym)(a.cwd).cwd,async()=>bJ(a))}async function bJ(a){let b=await bH({cwd:a.cwd,provider:a.provider,operationId:a.operationId,moduleUrl:a.moduleUrl});if(!a.confirmed)return{state:b.state,harnessDispatchRepo:b.harnessDispatchRepo,message:"Confirmation is required before provisioning.",recoverable:!0,persisted:!1};if(b.fingerprint!==a.fingerprint)return{state:"snapshot-preview-stale",harnessDispatchRepo:b.harnessDispatchRepo,message:"Provisioning preview is stale. Retry Step 1 Continue.",recoverable:!0,persisted:!1};if("skipped-not-packaged"===b.state||"token-unsupported"===b.state||"token-insufficient"===b.state||"token-scope-ambiguous"===b.state||"snapshot-unavailable"===b.state||"snapshot-manifest-missing"===b.state||"snapshot-manifest-invalid"===b.state||"snapshot-incompatible"===b.state||"snapshot-tampered"===b.state||"same-name-public-collision"===b.state||"same-name-unmanaged-collision"===b.state||"same-name-malformed-marker"===b.state||"same-name-snapshot-only-without-pending"===b.state||"explicit-packaged-repo-invalid"===b.state||"explicit-packaged-repo-legacy-source"===b.state)return{state:b.state,harnessDispatchRepo:b.harnessDispatchRepo,message:b.message,recoverable:b.recoverable,persisted:!1};let c=au.performance.now(),d=await a.provider.resolveAuthenticatedUser(),e={authenticationMs:bt(c)},f=(0,av.zL)(),g=(0,k.ym)(a.cwd),i=await (0,h.Hn)(g),j=i?.values.GITHUB_DISPATCH_REPOSITORY?.trim();if(j){let b=await bB(a.provider,j,by(i));if(!b.ok)return{state:b.state,harnessDispatchRepo:j,message:b.message,recoverable:!0,persisted:!1};let c=await D({cwd:a.cwd,githubDispatchRepository:b.repoSlug,githubDispatchRepositoryId:b.repositoryId});return"changed"!==c.outcome&&"skipped"!==c.outcome?{state:"created-but-persistence-failed",harnessDispatchRepo:b.repoSlug,message:c.reason??"Failed to persist GITHUB_DISPATCH_REPOSITORY.",recoverable:!0,persisted:!1}:(await aM(a.cwd),{state:"verified-and-persisted",harnessDispatchRepo:b.repoSlug,message:`Connected to saved harness workspace ${b.repoSlug}.`,recoverable:!1,persisted:!0})}let l=await bs(a.moduleUrl??"file:///Users/weston/Code/agentic-product-development-harness/src/setup/harness-repo-provisioning.ts");if(!l.ok)return{state:l.state,harnessDispatchRepo:null,message:l.message,recoverable:!1,persisted:!1};let m=await bC(a.provider,d,a.cwd,l),n=aE({operationId:a.operationId,user:d,destination:bv(d.login),manifest:l.manifest,snapshotFingerprint:l.fingerprint,classification:m.kind,envBaseline:i?.values.GITHUB_DISPATCH_REPOSITORY??"",pDevVersion:f,resumedFromPending:b.resumedFromPending,creationPreviewFingerprint:b.creationPreviewFingerprint}),o=function(a){let b=function(a){let b;try{b=JSON.parse(a)}catch{return null}if(!b||"object"!=typeof b)return null;let c=b;return c.action===aB&&"string"==typeof c.operationId&&c.operationId.trim()&&"number"==typeof c.authenticatedUserId&&Number.isFinite(c.authenticatedUserId)&&"string"==typeof c.authenticatedLogin&&c.authenticatedLogin.trim()&&"string"==typeof c.destination&&c.packageName===aA.Au&&"string"==typeof c.packageVersion&&"string"==typeof c.sourceRepository&&"string"==typeof c.sourceCommit&&"number"==typeof c.manifestSchemaVersion&&"string"==typeof c.snapshotFingerprint&&"string"==typeof c.snapshotContentId&&"string"==typeof c.snapshotSha256&&"string"==typeof c.snapshotGitTreeSha1&&"string"==typeof c.classification&&"string"==typeof c.envBaseline&&"string"==typeof c.pDevVersion&&"boolean"==typeof c.resumedFromPending&&(null===c.creationPreviewFingerprint||"string"==typeof c.creationPreviewFingerprint)?{operationId:c.operationId.trim(),authenticatedUserId:c.authenticatedUserId,authenticatedLogin:aC(c.authenticatedLogin),destination:aD(c.destination),packageName:aA.Au,packageVersion:String(c.packageVersion).trim(),sourceRepository:String(c.sourceRepository),sourceCommit:String(c.sourceCommit),manifestSchemaVersion:c.manifestSchemaVersion,snapshotFingerprint:String(c.snapshotFingerprint),snapshotContentId:String(c.snapshotContentId).trim(),snapshotSha256:String(c.snapshotSha256),snapshotGitTreeSha1:String(c.snapshotGitTreeSha1),classification:c.classification,envBaseline:aD(String(c.envBaseline)),pDevVersion:String(c.pDevVersion).trim(),resumedFromPending:c.resumedFromPending,creationPreviewFingerprint:null===c.creationPreviewFingerprint?null:String(c.creationPreviewFingerprint)}:null}(a.submittedFingerprint);if(!b)return{ok:!1,mismatchedField:"operationId",message:"Provisioning preview fingerprint is invalid. Retry Step 1 Continue."};var c=a.currentContext;for(let[a,d,e]of[["operationId",b.operationId,c.operationId],["authenticatedUserId",b.authenticatedUserId,c.authenticatedUserId],["authenticatedLogin",b.authenticatedLogin,c.authenticatedLogin],["destination",b.destination,c.destination],["packageName",b.packageName,c.packageName],["packageVersion",b.packageVersion,c.packageVersion],["sourceRepository",b.sourceRepository,c.sourceRepository],["sourceCommit",b.sourceCommit,c.sourceCommit],["manifestSchemaVersion",b.manifestSchemaVersion,c.manifestSchemaVersion],["snapshotFingerprint",b.snapshotFingerprint,c.snapshotFingerprint],["snapshotContentId",b.snapshotContentId,c.snapshotContentId],["snapshotSha256",b.snapshotSha256,c.snapshotSha256],["snapshotGitTreeSha1",b.snapshotGitTreeSha1,c.snapshotGitTreeSha1],["classification",b.classification,c.classification],["envBaseline",b.envBaseline,c.envBaseline],["pDevVersion",b.pDevVersion,c.pDevVersion],["resumedFromPending",b.resumedFromPending,c.resumedFromPending],["creationPreviewFingerprint",b.creationPreviewFingerprint,c.creationPreviewFingerprint]]){let b=d!==e?{ok:!1,mismatchedField:a,message:`Provisioning preview is stale (${a} changed). Retry Step 1 Continue.`}:null;if(b)return b}return{ok:!0}}({submittedFingerprint:a.fingerprint,currentContext:n});if(!o.ok)return{state:"snapshot-preview-stale",harnessDispatchRepo:null,message:o.message,recoverable:!0,persisted:!1};let p=bv(d.login),q="valid-managed"===m.kind?m.repositoryId:void 0,r=await aK(a.cwd);if(b.resumedFromPending){if(!r||!b.creationPreviewFingerprint)return{state:"same-name-snapshot-only-without-pending",harnessDispatchRepo:bv(d.login),message:"Matching local pending provisioning evidence is required to resume.",recoverable:!0,persisted:!1};let c=aN(r,bz(l,{operationId:a.operationId,authenticatedUserId:d.id,authenticatedLogin:d.login,targetOwner:d.login,targetRepo:aZ.Zl,previewFingerprint:b.creationPreviewFingerprint}));if(!c.ok)return{state:"same-name-unmanaged-collision",harnessDispatchRepo:bv(d.login),message:c.reason,recoverable:!0,persisted:!1}}else if(r&&"valid-existing-managed-repo"!==b.state&&"valid-managed"!==m.kind)return{state:"concurrent-request-recovered",harnessDispatchRepo:null,message:"Another provisioning operation is already in progress for this workspace.",recoverable:!0,persisted:!1};let s=b.creationPreviewFingerprint??a.fingerprint,t=r,u=!1;if("valid-managed"===m.kind)p=m.repoSlug;else{if("absent"!==m.kind&&"snapshot-only-with-pending"!==m.kind)return{state:b.state,harnessDispatchRepo:b.harnessDispatchRepo,message:b.message,recoverable:b.recoverable,persisted:!1};let c="snapshot-only-with-pending"===m.kind?await bF(a.provider,p):null;if("snapshot-only-with-pending"===m.kind&&c?.ok){let{owner:b,repo:e}=(0,X.Jj)(p),g=await a.provider.getRepositoryDefaultBranchHead(b,e,c.defaultBranch),h=await bE(a.provider,{repoSlug:p,repositoryId:c.repositoryId,defaultBranch:c.defaultBranch,templateIdentity:c.identity,templateHeadSha:g,operationId:a.operationId,user:d,pDevVersion:f});if(!h.ok)return{state:"marker-write-pending",harnessDispatchRepo:p,message:h.message,recoverable:!0,persisted:!1};q=c.repositoryId}else{let c;"absent"!==m.kind||b.resumedFromPending||(await aL(bD({operationId:a.operationId,user:d,snapshotPreview:l,previewFingerprint:s}),a.cwd),t=await aK(a.cwd));try{let b,f=t?.startedAt??new Date().toISOString(),g=new Date().toISOString();(c=await bi({provider:a.provider,user:d,repoName:aZ.Zl,description:aZ.JJ,snapshotRoot:l.snapshotRoot,manifest:l.manifest,packageVersion:l.packageVersion,operationId:a.operationId,pending:t,onProgress:c=>{c.phase!==b&&(g=new Date().toISOString(),b=c.phase),aS({operationId:a.operationId,phase:c.phase,phaseStartedAt:g,startedAt:f,completed:c.completed??c.uploadedBlobs,total:c.total??c.totalBlobs,rateLimitPauseSeconds:c.rateLimitPauseSeconds,lastSafeCheckpoint:c.lastSafeCheckpoint??t?.phase},a.cwd).catch(()=>{})},onCheckpoint:async c=>{await aL(bD({operationId:a.operationId,user:d,snapshotPreview:l,previewFingerprint:s,pending:t,phase:c.phase,repositoryId:c.repositoryId,defaultBranch:c.defaultBranch,initializedCommitSha:c.initializedCommitSha,snapshotCommitSha:c.snapshotCommitSha,markerCommitSha:c.markerCommitSha}),a.cwd),t=await aK(a.cwd),g=new Date().toISOString(),b=c.phase,await aS({operationId:a.operationId,phase:c.phase,phaseStartedAt:g,startedAt:f,lastSafeCheckpoint:c.phase},a.cwd)}})).ok&&(e.snapshotProvisioning=c.timings)}catch(e){let b=e instanceof Error?e.message:"Repository provisioning failed unexpectedly.";if(e instanceof a$.gk&&"marker-commit-failed"===e.code){let{owner:c,repo:e}=(0,X.Jj)(bv(d.login)),f=await a.provider.getRepositoryMetadata(c,e);if(f){let b=await a.provider.getRepositoryDefaultBranchHead(c,e,f.defaultBranch),g=t?.initializedCommitSha;try{let d=await a.provider.getGitCommit(c,e,b);g=d.parents[0]?.sha??g}catch{}await aL(bD({operationId:a.operationId,user:d,snapshotPreview:l,previewFingerprint:s,pending:t,phase:"marker-pending",repositoryId:f.repositoryId,initializedCommitSha:g,snapshotCommitSha:b}),a.cwd)}return{state:"marker-write-pending",harnessDispatchRepo:bv(d.login),message:b,recoverable:!0,persisted:!1}}let c=await bC(a.provider,d,a.cwd,l);if("valid-managed"===c.kind||"snapshot-only-with-pending"===c.kind)return{state:"repo-created-pending-verification",harnessDispatchRepo:bv(d.login),message:b,recoverable:!0,persisted:!1};if(!(e instanceof ax.OS)||422!==e.status)return{state:"api-timeout-unknown",harnessDispatchRepo:bv(d.login),message:b,recoverable:!0,persisted:!1};if("absent"===(await bC(a.provider,d,a.cwd,l)).kind)return{state:"api-timeout-unknown",harnessDispatchRepo:bv(d.login),message:"Repository creation returned an ambiguous result. Retry Step 1 Continue.",recoverable:!0,persisted:!1};return{state:"repo-created-pending-verification",harnessDispatchRepo:bv(d.login),message:b,recoverable:!0,persisted:!1}}if(c){if(!c.ok){let b="marker-commit-failed"===c.code||"description-finalization-failed"===c.code||t?.phase==="marker-pending"||t?.phase==="description-pending"||!!t?.snapshotCommitSha,e="remote-phase-timeout"===c.code||"workspace-upload-timeout"===c.code,f=t?.phase??"repository-created",g=aO(f);return{state:e?"repo-created-pending-verification":b?"marker-write-pending":c.recoverable?"repo-created-pending-verification":"api-timeout-unknown",harnessDispatchRepo:bv(d.login),message:e?`${c.message} Operation ID: ${a.operationId}. Retry will resume or reconcile from the last safe checkpoint.`:c.message,recoverable:c.recoverable,persisted:!1,operationId:a.operationId,phase:f,uiPhaseLabel:aP(g)}}p=c.fullName,q=c.repositoryId,u=!0,e.snapshotProvisioning=c.timings,await aL(bD({operationId:a.operationId,user:d,snapshotPreview:l,previewFingerprint:s,pending:t,phase:"persistence-pending",repositoryId:c.repositoryId,defaultBranch:c.defaultBranch,initializedCommitSha:c.initializedCommitSha,snapshotCommitSha:c.snapshotCommitSha,markerCommitSha:c.markerCommitSha}),a.cwd)}}}if(void 0===q){let{owner:b,repo:c}=(0,X.Jj)(p),d=await a.provider.getRepositoryMetadata(b,c);if(!d)return{state:"repo-created-pending-verification",harnessDispatchRepo:p,message:`Harness workspace ${p} is not accessible for verification.`,recoverable:!0,persisted:!1};q=d.repositoryId}if(u){let b=au.performance.now(),c=await bj({provider:a.provider,repoSlug:p,repositoryId:q,manifest:l.manifest});if(e.remoteVerificationMs=bt(b),!c.ok)return{state:"repo-created-pending-verification",harnessDispatchRepo:p,message:c.message,recoverable:!0,persisted:!1,timings:e}}let v=au.performance.now(),w=await D({cwd:a.cwd,githubDispatchRepository:p,githubDispatchRepositoryId:q});return"changed"!==w.outcome&&"skipped"!==w.outcome?(e.localPersistenceMs=bt(v),{state:"created-but-persistence-failed",harnessDispatchRepo:p,message:w.reason??"Failed to persist GITHUB_DISPATCH_REPOSITORY.",recoverable:!0,persisted:!1,timings:e}):(await aM(a.cwd),await aU(a.cwd),e.localPersistenceMs=bt(v),await aX({cwd:a.cwd,operationId:a.operationId,outcome:"success",timings:e}).catch(()=>{}),{state:"verified-and-persisted",harnessDispatchRepo:p,message:`Private harness workspace ${p} is connected.`,recoverable:!1,persisted:!0,operationId:a.operationId,phase:"persistence-pending",uiPhaseLabel:aP("saving-configuration"),timings:e})}var bK=c(2581),bL=c(40763);let bM=new Set(["token-unavailable","token-invalid","token-unsupported","token-scope-ambiguous","token-insufficient"]),bN=new Set(["same-name-public-collision","same-name-unmanaged-collision","same-name-malformed-marker"]),bO=new Set(["snapshot-unavailable","snapshot-manifest-missing","snapshot-manifest-invalid","snapshot-incompatible","snapshot-tampered","snapshot-preview-stale"]),bP=new Set(["created-but-persistence-failed"]);function bQ(a){let b=bM.has(a)?"auth":bN.has(a)?"permission":bO.has(a)?"snapshot_validation":bP.has(a)?"local_persistence":a.includes("rate-limit")?"rate_limit":a.includes("network")?"network":a.includes("conflict")?"conflict":"unknown";return"validation"===b||"unexpected"===b?"unknown":b}function bR(a){return"explicit-repo-present"!==a&&"explicit-packaged-repo-invalid"!==a&&"explicit-packaged-repo-legacy-source"!==a&&"snapshot-preview-ready"!==a&&"repo-absent"!==a&&"valid-existing-managed-repo"!==a&&"skipped-not-packaged"!==a&&"skipped-source-mode"!==a}function bS(a){return`harness_provisioning_${a.replace(/-/g,"_")}`}var bT=c(15115),bU=c(76263),bV=c(79123),bW=c(86143);function bX(a,b){return(0,j.h4)(a,b)}async function bY(a){let b=[],c=[],d=(0,j.Gn)(a.operatorInput);for(let e of a.secretWritePlan){if("skip"===e.action){c.push(e.name);continue}if("HARNESS_CONFIG_JSON_B64"===e.name){let{bytes:c}=await (0,bU.bD)(a.cwd),f=(0,bU.Uw)(c);d.push(f),b.push({name:e.name,value:f});continue}let f="LINEAR_API_KEY"===e.name?a.operatorInput?.linearApiKey:"CURSOR_API_KEY"===e.name?a.operatorInput?.cursorApiKey:a.operatorInput?.githubToken;if(!f?.trim()){c.push(e.name);continue}b.push({name:e.name,value:f.trim()})}return{requests:b,skippedSecretNames:c,knownSecrets:d}}async function bZ(a){let b,c=await (0,E.z8)({cwd:a.cwd,manualRepo:a.manualHarnessDispatchRepo}),d=(0,E.OW)(c),e="unknown";a.provider&&c.resolved&&(e=await a.provider.checkHarnessRepoAccess(d),b=await a.provider.listHarnessSecretStatuses(d));let f=await (0,bU.AW)({cwd:a.cwd,operatorInput:a.operatorInput,manualHarnessDispatchRepo:a.manualHarnessDispatchRepo,secretStatuses:b,repoAccess:e}),g=(0,j.Gn)(a.operatorInput),h=f.manualInstructions.map(a=>bX(a,g));return{actionId:F.PN.previewHarnessSecrets.id,harnessDispatchRepo:d,harnessDispatchRepoResolved:c.resolved,harnessDispatchRepoSource:c.source,repoAccess:e,secretStatuses:b??f.secretWritePlan.map(a=>({name:a.name,status:"unknown"})),secretWritePlan:f.secretWritePlan,secretKeyNames:f.secretWritePlan.filter(a=>"skip"!==a.action).map(a=>a.name),fingerprint:f.fingerprint,permission:F.PN.previewHarnessSecrets.permission,manualInstructions:h,validationError:f.validationError?bX(f.validationError,g):void 0}}async function b$(a){(0,F.L6)(a.confirmed),(0,F.xp)(F.PN.applyHarnessSecrets.permission.scope,g.P.remoteSecretWrite.scope);let b=await bZ(a);if((0,F.Me)(a.fingerprint,b.fingerprint),b.validationError)throw Error(b.validationError);if(!a.provider)throw Error("GitHub token is required for remote harness secret writes");if(!b.harnessDispatchRepoResolved)throw Error("Harness dispatch repo must be resolved before applying secrets");let{requests:d,skippedSecretNames:e,knownSecrets:f}=await bY({cwd:a.cwd,operatorInput:a.operatorInput,secretWritePlan:b.secretWritePlan});if(0===d.length)throw Error("No harness repo Actions secrets are ready to write");try{let g=await a.provider.writeHarnessSecrets(b.harnessDispatchRepo,d),h={actionId:F.PN.applyHarnessSecrets.id,harnessDispatchRepo:b.harnessDispatchRepo,writtenSecrets:g,skippedSecretNames:e,fingerprint:b.fingerprint,permission:F.PN.applyHarnessSecrets.permission},i=JSON.stringify(h);for(let a of f)if(i.includes(a))throw Error("Remote apply result leaked secret material");if(g.some(a=>"HARNESS_CONFIG_JSON_B64"===a.name&&("created"===a.status||"updated"===a.status))){let{hash:d}=await (0,bU.bD)(a.cwd),{HARNESS_CONFIG_FINGERPRINT_VARIABLE:e}=await Promise.resolve().then(c.bind(c,67289));if(!a.provider.writeHarnessVariables)throw Error("GitHub provider must support repository variable writes for HARNESS_CONFIG_FINGERPRINT");await a.provider.writeHarnessVariables(b.harnessDispatchRepo,[{name:e,value:d}]);try{await (0,bV.V)({configFingerprint:d,harnessRepository:b.harnessDispatchRepo,syncedAt:new Date().toISOString()},a.cwd)}catch{}}return h}catch(a){throw Error((0,X.s7)(a))}}async function b_(a){let b,c=await (0,E.z8)({cwd:a.cwd,manualRepo:a.manualHarnessDispatchRepo}),d=(0,bW.g1)({repoConfigId:a.repoConfigId,targetRepo:a.targetRepo,productionBranch:a.productionBranch,harnessDispatchRepo:c}),e=d.plan.workflowStatus,f="unknown";if(a.provider&&"<invalid-target-repo>"!==d.plan.targetRepoSlug){let c=await a.provider.checkTargetWorkflowStatus({targetRepoSlug:d.plan.targetRepoSlug,workflowPath:d.plan.workflowPath,intendedWorkflowContent:d.workflowContent,productionBranch:a.productionBranch});e=c.workflowStatus,f=c.repoAccess,b=c.productionBranchSha}let g=(0,bW.g1)({repoConfigId:a.repoConfigId,targetRepo:a.targetRepo,productionBranch:a.productionBranch,harnessDispatchRepo:c,workflowStatus:e,productionBranchSha:b});return{actionId:F.PN.previewTargetWorkflowPr.id,plan:g.plan,repoAccess:f,workflowPreviewSummary:g.workflowPreviewSummary,fingerprint:g.fingerprint,permission:F.PN.previewTargetWorkflowPr.permission,manualInstructions:g.manualInstructions,validationError:g.validationError}}async function b0(a){(0,F.L6)(a.confirmed),(0,F.xp)(F.PN.applyTargetWorkflowPr.permission.scope,g.P.remoteRepoWrite.scope);let b=await b_(a);if((0,F.Me)(a.fingerprint,b.fingerprint),b.validationError)throw Error(b.validationError);if(!1!==b.plan.directProductionBranchWrite)throw Error("Direct production branch writes are not allowed");if(!a.provider)throw Error("GitHub token is required for target workflow PR install");try{let c=await a.provider.applyTargetWorkflowPr({targetRepoSlug:b.plan.targetRepoSlug,productionBranch:b.plan.productionBranch,branchName:b.plan.branchName,workflowPath:b.plan.workflowPath,workflowContent:(await (0,bW.g1)({repoConfigId:a.repoConfigId,targetRepo:a.targetRepo,productionBranch:a.productionBranch,harnessDispatchRepo:await (0,E.z8)({cwd:a.cwd,manualRepo:a.manualHarnessDispatchRepo}),workflowStatus:b.plan.workflowStatus})).workflowContent,prTitle:b.plan.prTitle,prBody:b.plan.prBody});return{actionId:F.PN.applyTargetWorkflowPr.id,harnessDispatchRepo:b.plan.harnessDispatchRepo,repoConfigId:b.plan.repoConfigId,outcome:c.outcome,branchName:c.branchName,prUrl:c.prUrl,directProductionBranchWrite:!1,fingerprint:b.fingerprint,permission:F.PN.applyTargetWorkflowPr.permission}}catch(a){throw Error((0,X.tE)(a))}}var b1=c(3811);let b2=/pdh-smoke-harness-/i,b3=/pdh-smoke-target-/i;function b4(a){return b3.test(a.trim())}async function b5(a){let b,c,d=a?.cwd,e=await (0,b1.P)({cwd:d}),f=await (0,E.z8)({cwd:d,manualRepo:a?.manualHarnessDispatchRepo}),g=(0,E.OW)(f),h="unknown",i=[];a?.provider&&f.resolved?(h=await a.provider.checkHarnessRepoAccess(g),i=await a.provider.listHarnessSecretStatuses(g)):i=(await (0,bU.AW)({cwd:d,manualHarnessDispatchRepo:a?.manualHarnessDispatchRepo})).secretWritePlan.map(a=>({name:a.name,status:"unknown"}));let j=[];try{let e=await (0,I.rL)({baseDir:d});for(let d of(b=e.config.repos.map(a=>({id:a.id,targetRepo:a.targetRepo})),c=e.config.allowedTargetRepos,e.config.repos)){let b=(0,bW.g1)({repoConfigId:d.id,targetRepo:d.targetRepo,productionBranch:d.productionBranch??"main",harnessDispatchRepo:f}),c="unknown",e=b.plan.workflowStatus;if(a?.provider&&"<invalid-target-repo>"!==b.plan.targetRepoSlug){let d=await a.provider.checkTargetWorkflowStatus({targetRepoSlug:b.plan.targetRepoSlug,workflowPath:b.plan.workflowPath,intendedWorkflowContent:b.workflowContent,productionBranch:b.plan.productionBranch});c=d.repoAccess,e=d.workflowStatus}j.push({repoConfigId:d.id,targetRepo:d.targetRepo,productionBranch:d.productionBranch??"main",repoAccess:c,workflowStatus:e,harnessDispatchRepo:g})}}catch{}let k=function(a){let b=function(a){var b;let c=[];a.harnessDispatchRepo&&(b=a.harnessDispatchRepo,b2.test(b.trim()))&&c.push({kind:"harness-dispatch",value:a.harnessDispatchRepo,source:"GITHUB_DISPATCH_REPOSITORY"});let d=a.configSummary?.repos??a.targetRepos?.map(a=>({id:a.id,targetRepo:a.targetRepo,baseBranch:"main",productionBranch:"main"}))??[],e=a.configSummary?.allowedTargetRepos??a.allowedTargetRepos??[];for(let a of d)b4(a.targetRepo)&&c.push({kind:"target-repo",value:a.targetRepo,source:`repos[].targetRepo (${a.id})`});for(let a of e)b4(a)&&c.push({kind:"allowed-target-repo",value:a,source:"allowedTargetRepos[]"});return c}(a),c=a.gitRemoteOriginUrl?(0,ay.e)(a.gitRemoteOriginUrl)??void 0:void 0,d=b.find(a=>"harness-dispatch"===a.kind)?.value,e=[...new Set(b.filter(a=>"target-repo"===a.kind||"allowed-target-repo"===a.kind).map(a=>a.value))];return{hasStaleConfig:b.length>0,findings:b,staleHarnessDispatchRepo:d,staleTargetRepos:e,suggestedHarnessDispatchRepo:c}}({harnessDispatchRepo:g,gitRemoteOriginUrl:await (0,E.vE)(d),targetRepos:b,allowedTargetRepos:c});return{githubTokenConfigured:!!e,harnessDispatchRepo:g,harnessDispatchRepoResolved:f.resolved,harnessDispatchRepoSource:f.source,harnessRepoAccess:h,harnessSecretStatuses:i,targetRepos:j,staleSmokeDiagnostics:k}}var b6=c(71512),b7=c(16589);let b8=new Set(["failure","cancelled","timed_out","action_required"]),b9=new Set(["neutral","skipped","success"]);var ca=c(95203),cb=c(73928);function cc(a){let b=a.state.toLowerCase(),c=null,d="completed";return"success"===b?c="success":"pending"===b?(c=null,d="queued"):c="failure"===b||"error"===b?"failure":b,{name:a.context,status:d,conclusion:c,detailsUrl:a.target_url}}async function cd(a,b,c){let d=await ce(a,b,c);if(d.merged)return d;if("open"!==d.state)throw Error(`pr_closed: PR ${d.url} is closed but not merged`);return d}async function ce(a,b,c){let d;if(!(0,cb.rc)(b.repoUrl,c))throw Error(`wrong_target_repo: PR repo ${b.repoUrl} does not match expected ${c}`);try{d=await a.getPullRequest(b.owner,b.repo,b.pullNumber)}catch(a){throw a instanceof ax.OS&&a.status,a}let e=[];d.merged||(e=await a.getPullRequestFiles(b.owner,b.repo,b.pullNumber));let f=d.head.sha,g=null,h=[];try{h=(g=(await a.getCheckRunsForRef(b.owner,b.repo,f)).check_runs??[]).map(a=>({name:a.name,status:a.status,conclusion:a.conclusion,detailsUrl:a.details_url}))}catch{g=null,h=[]}if(0===h.length)try{let c=await a.getCombinedStatusForRef(b.owner,b.repo,f);h=function(a){if(a.statuses.length>0)return a.statuses.map(cc);let b=a.state.toLowerCase();return"pending"===b?[{name:"combined-status",status:"queued",conclusion:null,detailsUrl:null}]:[{name:"combined-status",status:"completed",conclusion:"success"===b?"success":"failure",detailsUrl:null}]}(c)}catch{}let i=(await a.getIssueComments(b.owner,b.repo,b.pullNumber)).map(a=>({author:a.user?.login??"unknown",body:a.body,createdAt:a.created_at})),j=e.map(a=>({path:a.filename,status:a.status}));return{title:d.title,url:d.html_url,branch:d.head.ref,headSha:d.head.sha,baseBranch:d.base.ref,state:d.state,merged:d.merged,isDraft:!0===d.draft,mergeable:d.mergeable??null,mergeableState:d.mergeable_state??null,rebaseable:d.rebaseable??null,mergeCommitSha:d.merge_commit_sha,mergedAt:d.merged_at,repoUrl:b.repoUrl,changedFiles:j,checks:h,checkSummary:function(a){if(0===a.length)return"No GitHub check runs reported for the PR head commit.";let b=a.filter(a=>"success"===a.conclusion).length,c=a.filter(a=>"failure"===a.conclusion||"cancelled"===a.conclusion).length,d=a.filter(a=>"completed"!==a.status||null===a.conclusion).length,e=[`- Passed: ${b}`,`- Failed: ${c}`,`- Pending/unknown: ${d}`];for(let b of a.filter(a=>"failure"===a.conclusion).slice(0,5))e.push(`- Failed check: ${b.name}${b.detailsUrl?` (${b.detailsUrl})`:""}`);return e.join("\n")}(h),comments:i,rawChecks:g}}function cf(a){let b=a.trim().match(/^https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/pull\/(\d+)\/?$/);if(!b)return null;let c=b[1],d=b[2];return{owner:c,repo:d,pullNumber:Number.parseInt(b[3],10),repoUrl:`https://github.com/${c}/${d}`}}var cg=c(92116),ch=c(55565),ci=c(44297);function cj(a){return`<!-- p-dev-workflow-install:${a} -->`}async function ck(a){let b,[c,d]=a.targetRepoSlug.split("/");try{b=await a.client.getBranchRef(c,d,a.branchName)}catch(a){if(a instanceof ax.OS&&404===a.status)return!1;throw a}let e=await a.client.getBranchRef(c,d,a.productionBranch);if(b.object.sha===e.object.sha)return!1;let f=await a.client.compareCommits(c,d,a.productionBranch,a.branchName);if("ahead"!==f.status||1!==f.ahead_by)return!1;let g=f.files??[];if(1!==g.length||g[0]?.filename!==a.workflowPath)return!1;let h=await a.client.getRepositoryContent(c,d,a.workflowPath,a.branchName);if(!h)return!1;let i=a.client.decodeRepositoryContent(h);return"present"===(0,bW.DR)(i,a.intendedWorkflowContent)}async function cl(a,b,c,d){try{return(await a.getBranchRef(b,c,d)).object.sha}catch(a){if(a instanceof ax.OS&&404===a.status)return null;throw a}}async function cm(a){let b=await a.client.getGitCommit(a.owner,a.repo,a.productionSha),c=await a.client.createGitBlob({owner:a.owner,repo:a.repo,content:Buffer.from(a.workflowContent,"utf8")}),d=await a.client.createGitTree({owner:a.owner,repo:a.repo,baseTree:b.tree.sha,tree:[{path:a.workflowPath,mode:"100644",type:"blob",sha:c.sha}]}),e=await a.client.createGitCommit({owner:a.owner,repo:a.repo,message:a.commitMessage,tree:d.sha,parents:[a.productionSha]});if(e.parents[0]?.sha!==a.productionSha)throw Error("Install branch recovery commit parent does not match production head.");if(e.tree.sha!==d.sha)throw Error("Install branch recovery commit tree does not match constructed tree.");let f=(await a.client.compareCommits(a.owner,a.repo,a.productionSha,e.sha)).files??[];if(1!==f.length||f[0]?.filename!==a.workflowPath)throw Error("Install branch recovery commit must change exactly the workflow path.");return{commitSha:e.sha,treeSha:d.sha}}async function cn(a){let b=await a.client.getBranchRef(a.owner,a.repo,a.branchName);if(b.object.sha!==a.expectedHeadSha)throw Error(`Install branch head mismatch after update (expected ${a.expectedHeadSha}, got ${b.object.sha}).`);if(b.object.sha===a.productionSha)throw Error("Install branch head must differ from production after recovery.");let c=await a.client.getGitCommit(a.owner,a.repo,b.object.sha);if(c.parents[0]?.sha!==a.productionSha)throw Error("Install branch commit parent must be current production head.");let d=(await a.client.compareCommits(a.owner,a.repo,a.productionBranch,a.branchName)).files??[];if(1!==d.length||d[0]?.filename!==a.workflowPath)throw Error("Install branch must differ from production by exactly the workflow path.");let e=await a.client.getRepositoryContent(a.owner,a.repo,a.workflowPath,a.branchName);if(!e)throw Error("Install branch is missing the intended workflow file.");let f=a.client.decodeRepositoryContent(e);if("present"!==(0,bW.DR)(f,a.workflowContent))throw Error("Install branch workflow content does not match the intended workflow.")}async function co(a){let b,[c,d]=a.targetRepoSlug.split("/");if(!a.branchName.startsWith("harness/setup-production-sync-"))return{recovered:!1,reason:"Force update refused: branch is not a reserved install branch."};let e=(await a.client.getBranchRef(c,d,a.productionBranch)).object.sha,f=void 0!==a.expectedReservedBranchHeadSha?a.expectedReservedBranchHeadSha:await cl(a.client,c,d,a.branchName),g=a.commitMessage??(0,bW.Hh)();try{b=(await cm({client:a.client,owner:c,repo:d,productionSha:e,workflowPath:a.workflowPath,workflowContent:a.workflowContent,commitMessage:g})).commitSha}catch(a){return{recovered:!1,reason:a instanceof Error?a.message:"Failed to build verified workflow install commit."}}let h=await cl(a.client,c,d,a.branchName);if(h!==f)return{recovered:!1,needsReconciliation:!0,reason:"Reserved install branch head changed during recovery; reconciling instead of overwriting.",observedHeadSha:h??void 0};null===h?await a.client.createGitRef(c,d,a.branchName,b):await a.client.updateGitRef({owner:c,repo:d,ref:a.branchName,sha:b,force:!0});try{await cn({client:a.client,owner:c,repo:d,productionBranch:a.productionBranch,productionSha:e,branchName:a.branchName,expectedHeadSha:b,workflowPath:a.workflowPath,workflowContent:a.workflowContent})}catch(a){return{recovered:!1,reason:a instanceof Error?a.message:"Install branch postcondition verification failed."}}return{recovered:!0,headSha:b,productionSha:e,commitSha:b}}async function cp(a,b){let[c,d]=b.targetRepoSlug.split("/");return(await a.listPullRequests(c,d,{state:"open",base:b.productionBranch,head:`${c}:${b.branchName}`})).length}async function cq(a){let[b,c]=a.targetRepoSlug.split("/"),d=await a.client.listPullRequests(b,c,{state:a.state??"open",base:a.productionBranch,head:`${b}:${a.branchName}`,sort:"updated",direction:"desc"}),e=cj(a.repoConfigId);for(let b of d)if((b.body??"").includes(e)&&b.head.ref===a.branchName&&b.base.ref===a.productionBranch)return{number:b.number,html_url:b.html_url,headSha:b.head.sha,state:b.state,body:b.body};return null}async function cr(a){let[b,c]=a.targetRepoSlug.split("/"),d=await a.client.listPullRequests(b,c,{state:"open",base:a.productionBranch,head:`${b}:${a.branchName}`}),e=d.find(b=>{var c,d;return b.head.ref===a.branchName&&b.base.ref===a.productionBranch&&b.head.sha===a.verifiedHeadSha&&(c=b.body,d=a.repoConfigId,!!c&&c.includes(cj(d)))});if(e)return{prNumber:e.number,prUrl:e.html_url,created:!1};let f=d.find(b=>b.head.ref===a.branchName&&b.base.ref===a.productionBranch&&b.head.sha===a.verifiedHeadSha);if(f)return{prNumber:f.number,prUrl:f.html_url,created:!1};let g=await cq({client:a.client,targetRepoSlug:a.targetRepoSlug,productionBranch:a.productionBranch,branchName:a.branchName,repoConfigId:a.repoConfigId,state:"closed"}),h=a.prBody.includes(cj(a.repoConfigId))?a.prBody:`${a.prBody}
|
|
39
|
+
|
|
40
|
+
${cj(a.repoConfigId)}
|
|
41
|
+
`,i=await a.client.createPullRequest({owner:b,repo:c,title:a.prTitle,head:a.branchName,base:a.productionBranch,body:h});return{prNumber:i.number,prUrl:i.html_url,created:!0,supersededPrNumber:g?.number}}let cs=new Set,ct=new Map;async function cu(a,b){if(cs.has(a)){var c;let b=ct.get(a);if(b)return{result:b,lockContended:!0};await (c=a,cs.has(c)?new Promise(a=>{let b=cv.get(c)??[];b.push(a),cv.set(c,b)}):Promise.resolve());let d=ct.get(a);if(d)return{result:d,lockContended:!0}}cs.add(a);try{let c=await b();return"object"==typeof c&&null!==c&&"lifecycle"in c&&(ct.set(a,c),"complete"===c.lifecycle&&ct.delete(a)),{result:c,lockContended:!1}}finally{cs.delete(a),function(a){let b=cv.get(a)??[];for(let c of(cv.delete(a),b))c()}(a)}}let cv=new Map;function cw(a,b){let c=a.replace(/[^a-zA-Z0-9._-]/g,"_");return ag().join(function(a){let b=(0,k.ym)(a);return ag().join(b.harnessDir,"target-workflow-finalization")}(b),`${c}.json`)}async function cx(a,b){var c,d;let e=Date.parse(a.startedAt),g=a.elapsedMs??(Number.isFinite(e)?Math.max(0,Date.now()-e):0),h={schemaVersion:a.schemaVersion??1,operationId:a.operationId,repoConfigId:a.repoConfigId,inputFingerprint:a.inputFingerprint,intendedWorkflowSha256:a.intendedWorkflowSha256,harnessDispatchRepo:a.harnessDispatchRepo,targetRepo:a.targetRepo,targetRepoSlug:a.targetRepoSlug,productionBranch:a.productionBranch,installBranch:a.installBranch,observedProductionHeadSha:a.observedProductionHeadSha,observedInstallHeadSha:a.observedInstallHeadSha,prNumber:a.prNumber,prUrl:a.prUrl,supersededPrNumber:a.supersededPrNumber,phase:a.phase,phaseStartedAt:a.phaseStartedAt,startedAt:a.startedAt,elapsedMs:g,checksDeadlineAt:a.checksDeadlineAt,verificationDeadlineAt:a.verificationDeadlineAt,lastVerifiedRemoteHead:a.lastVerifiedRemoteHead,lastSafeCheckpoint:a.lastSafeCheckpoint,retryCount:a.retryCount,lastRedactedError:a.lastRedactedError,recoveryInstruction:a.recoveryInstruction??(c=a.lastSafeCheckpoint||a.phase,d=a.operationId,`Retry Step 7 to resume workflow install operation ${d} from checkpoint ${c}.`),updatedAt:new Date().toISOString()},i=cw(a.repoConfigId,b);await (0,f.mkdir)(ag().dirname(i),{recursive:!0});let j=`${i}.${process.pid}.${Date.now()}.tmp`;return await (0,f.writeFile)(j,`${JSON.stringify(h,null,2)}
|
|
42
|
+
`,"utf8"),await (0,f.rename)(j,i),h}async function cy(a,b){try{let c=await (0,f.readFile)(cw(a,b),"utf8"),d=JSON.parse(c);if(1!==d.schemaVersion||"string"!=typeof d.operationId||d.repoConfigId!==a)return null;return d}catch{return null}}async function cz(a,b){try{await (0,f.rm)(cw(a,b),{force:!0})}catch{}}function cA(a){switch(a){case"preparing":case"pr-created":case"pr-updated":default:return"preparing-workflow-installation";case"updating-branch":return"creating-or-refreshing-install-branch";case"waiting-for-checks":return"waiting-for-github-checks";case"merging":return"merging-workflow-installation";case"verifying":case"complete":return"verifying-production-workflow";case"blocked":return"verifying-install-pull-request"}}let cB=new Map;function cC(a,b){return`${a}:${b}`}function cD(a){if(a)return Math.min(3e4,2e3+Math.floor(2e3*Math.random()))}function cE(a){var b;let c=a.lockContended||"checks-pending"===(b=a.category)||"mergeability-pending"===b||"branch-behind"===b||"verification-failed"===b||"transient-github-unavailable"===b,d=a.lockContended?"lock_contended":function(a){switch(a){case"checks-pending":return"checks_pending";case"mergeability-pending":return"mergeability_pending";case"branch-behind":return"branch_behind";case"unexpected-pr-content":case"checks-failing":case"review-required":return"unexpected_pr_content";case"merge-conflict":return"merge_conflict";case"permission-denied":return"permission_denied";case"verification-failed":return"verification_failed";case"merge-api-failure":case"merge-queue-required":return"merge_api_failure";case"transient-github-unavailable":return"transient_github_5xx";default:return"unknown"}}(a.category),e="blocked";return{repoConfigId:a.repoConfigId,targetRepo:a.targetRepo,targetRepoSlug:a.targetRepoSlug,productionBranch:a.productionBranch,branchName:a.branchName,lifecycle:e,phase:cA(e),operationId:a.operationId,blockedCategory:a.category,message:a.customMessage??(0,ch.e)(a.category),prUrl:a.prUrl,prNumber:a.prNumber,supersededPrNumber:a.supersededPrNumber,validatedHeadSha:a.validatedHeadSha,workflowStatus:a.workflowStatus,canRetry:c||"verification-failed"===a.category,retryable:c,retryAfterMs:cD(c),lastSafeCheckpoint:a.lastSafeCheckpoint,errorCode:d,requiresGitHubIntervention:!["checks-pending","mergeability-pending","branch-behind","verification-failed","transient-github-unavailable"].includes(a.category),advancedThisRequest:a.advancedThisRequest,lockContended:a.lockContended,updatedAt:new Date().toISOString()}}function cF(a){let b=a.retryable??(a.lockContended||"waiting-for-checks"===a.lifecycle||"updating-branch"===a.lifecycle||"verifying"===a.lifecycle||"merging"===a.lifecycle||"preparing"===a.lifecycle);return{repoConfigId:a.repoConfigId,targetRepo:a.targetRepo,targetRepoSlug:a.targetRepoSlug,productionBranch:a.productionBranch,branchName:a.branchName,lifecycle:a.lifecycle,phase:a.phase??cA(a.lifecycle),operationId:a.operationId,blockedCategory:a.blockedCategory,message:a.message,prUrl:a.prUrl,prNumber:a.prNumber,supersededPrNumber:a.supersededPrNumber,validatedHeadSha:a.validatedHeadSha,workflowStatus:a.workflowStatus,canRetry:a.canRetry??b,retryable:b,retryAfterMs:cD(b),lastSafeCheckpoint:a.lastSafeCheckpoint??a.lifecycle,errorCode:a.errorCode??(a.lockContended?"lock_contended":"none"),requiresGitHubIntervention:a.requiresGitHubIntervention??!1,advancedThisRequest:a.advancedThisRequest,lockContended:a.lockContended,updatedAt:new Date().toISOString()}}function cG(a){return cB.delete(cC(a.targetRepoSlug,a.repoConfigId)),cF({...a,lifecycle:"complete",phase:"verifying-production-workflow",workflowStatus:"present",message:"Workflow installed on the production branch.",advancedThisRequest:a.advancedThisRequest,lockContended:a.lockContended,retryable:!1,canRetry:!1,errorCode:"none",lastSafeCheckpoint:"complete"})}async function cH(a,b,c,d){let[e,f]=b.split("/"),g=await a.getRepositoryContent(e,f,c,d);return g?a.decodeRepositoryContent(g):null}async function cI(a,b){let[c,d]=b.targetRepoSlug.split("/"),e=(await a.listPullRequests(c,d,{state:"open",base:b.productionBranch,head:`${c}:${b.branchName}`}))[0];return e?{number:e.number,html_url:e.html_url,headSha:e.head.sha}:null}function cJ(a,b){return 1===a.length&&a[0]?.path===b}let cK="Refreshing the workflow install branch…";async function cL(a){let{client:b,input:c,targetRepoSlug:d,branchName:e,productionStatus:f,intendedWorkflowContent:g,inspection:h,parsedPr:i,prUrl:j,prNumber:k,validatedHeadSha:l,session:m,lockContended:n,filesValidationPassed:o,harnessDispatchRepoSlug:p,cwd:q,inputFingerprint:r}=a;if(m.recoveryAttemptedForHeadSha===l)return null;let s=await cH(b,d,F.CH,h.headSha),t=null!==s&&"present"===(0,bW.DR)(s,g),[u,v]=d.split("/"),w=null;try{w=(await b.compareCommits(u,v,c.productionBranch,e)).status}catch{w=null}if(!function(a){if(!a.headWorkflowMatchesIntended)return!0;if(a.filesValidationPassed)return!1;let b=a.mergeableState?.toLowerCase()??"",c=a.compareStatus?.toLowerCase()??"";return"behind"===b||"behind"===c||"diverged"===c||1===a.changedFiles.length&&a.changedFiles[0]?.path!==a.workflowPath||!!(a.changedFiles.length>1)}({changedFiles:h.changedFiles,workflowPath:F.CH,mergeableState:h.mergeableState,compareStatus:w,headWorkflowMatchesIntended:t,filesValidationPassed:o}))return null;let x=await cp(b,{targetRepoSlug:d,productionBranch:c.productionBranch,branchName:e}),y=0===x||0===h.changedFiles.length||"identical"===w,z=function(a){let b=(0,bW.Yh)(a.configuredRepoConfigId);if(a.configuredTargetRepoSlug!==a.observedTargetRepoSlug)return{ok:!1,reason:"Install branch recovery target repository mismatch."};if(a.reservedBranchName!==b)return{ok:!1,reason:"Install branch recovery reserved branch name mismatch."};if(a.observedBranchName!==b)return{ok:!1,reason:"Install branch recovery PR head branch mismatch."};if(a.observedProductionBranch!==a.configuredProductionBranch)return{ok:!1,reason:"Install branch recovery PR base branch mismatch."};if(`${a.pullRequestOwner}/${a.pullRequestRepo}`!==a.configuredTargetRepoSlug)return{ok:!1,reason:"Install branch recovery PR repository mismatch."};let c=+!a.allowZeroOpenPullRequests;return a.openPullRequestsOnBranch<c||a.openPullRequestsOnBranch>1?{ok:!1,reason:"Install branch recovery requires at most one open PR on the reserved branch."}:{ok:!0}}({configuredTargetRepoSlug:d,observedTargetRepoSlug:d,configuredRepoConfigId:c.repoConfigId,reservedBranchName:e,observedBranchName:h.branch,configuredProductionBranch:c.productionBranch,observedProductionBranch:h.baseBranch,configuredWorkflowPath:F.CH,pullRequestOwner:i.owner,pullRequestRepo:i.repo,openPullRequestsOnBranch:x,allowZeroOpenPullRequests:y});if(!z.ok)return m.recoveryAttemptedForHeadSha=l,cB.set(cC(d,c.repoConfigId),m),cE({repoConfigId:c.repoConfigId,targetRepo:c.targetRepo,targetRepoSlug:d,productionBranch:c.productionBranch,branchName:e,category:"unexpected-pr-content",workflowStatus:f.workflowStatus,operationId:m.operationId,prUrl:j,prNumber:k,validatedHeadSha:l,advancedThisRequest:!0,lockContended:n,customMessage:z.reason,lastSafeCheckpoint:"recovery-proof-failed"});if(await ck({client:b,targetRepoSlug:d,productionBranch:c.productionBranch,branchName:e,workflowPath:F.CH,intendedWorkflowContent:g}))return m.recoveryAttemptedForHeadSha=l,cB.set(cC(d,c.repoConfigId),m),null;await cM({cwd:q,session:m,input:c,targetRepoSlug:d,branchName:e,intendedWorkflowContent:g,harnessDispatchRepoSlug:p,inputFingerprint:r,phase:"creating-or-refreshing-install-branch",prUrl:j,prNumber:k,observedInstallHeadSha:l,lastSafeCheckpoint:"before-branch-recovery"});let A=await co({client:b,targetRepoSlug:d,productionBranch:c.productionBranch,branchName:e,workflowPath:F.CH,workflowContent:g,expectedReservedBranchHeadSha:l});if(!A.recovered)return A.needsReconciliation?cF({repoConfigId:c.repoConfigId,targetRepo:c.targetRepo,targetRepoSlug:d,productionBranch:c.productionBranch,branchName:e,lifecycle:"updating-branch",phase:"creating-or-refreshing-install-branch",operationId:m.operationId,workflowStatus:f.workflowStatus,message:cK,prUrl:j,prNumber:k,validatedHeadSha:A.observedHeadSha,advancedThisRequest:!0,lockContended:n,blockedCategory:"branch-behind",retryable:!0,lastSafeCheckpoint:"branch-head-changed-reconcile",errorCode:"branch_behind"}):(m.recoveryAttemptedForHeadSha=l,cB.set(cC(d,c.repoConfigId),m),cE({repoConfigId:c.repoConfigId,targetRepo:c.targetRepo,targetRepoSlug:d,productionBranch:c.productionBranch,branchName:e,category:"unexpected-pr-content",workflowStatus:f.workflowStatus,operationId:m.operationId,prUrl:j,prNumber:k,validatedHeadSha:l,advancedThisRequest:!0,lockContended:n,customMessage:A.reason,lastSafeCheckpoint:"recovery-failed"}));let B=await cr({client:b,targetRepoSlug:d,productionBranch:c.productionBranch,branchName:e,repoConfigId:c.repoConfigId,prTitle:(0,bW.Hh)(),prBody:(0,bW.rv)({repoConfigId:c.repoConfigId,productionBranch:c.productionBranch,harnessDispatchRepo:p}),verifiedHeadSha:A.headSha,harnessDispatchRepo:p});return B.supersededPrNumber&&(m.supersededPrNumber=B.supersededPrNumber),m.recoveryAttemptedForHeadSha=l,m.lastValidatedHeadSha=A.headSha,cB.set(cC(d,c.repoConfigId),m),await cM({cwd:q,session:m,input:c,targetRepoSlug:d,branchName:e,intendedWorkflowContent:g,harnessDispatchRepoSlug:p,inputFingerprint:r,phase:"creating-or-refreshing-install-branch",prUrl:B.prUrl,prNumber:B.prNumber,supersededPrNumber:m.supersededPrNumber,observedInstallHeadSha:A.headSha,observedProductionHeadSha:A.productionSha,lastSafeCheckpoint:"branch-recovered"}),cF({repoConfigId:c.repoConfigId,targetRepo:c.targetRepo,targetRepoSlug:d,productionBranch:c.productionBranch,branchName:e,lifecycle:"updating-branch",phase:"creating-or-refreshing-install-branch",operationId:m.operationId,workflowStatus:f.workflowStatus,message:cK,prUrl:B.prUrl,prNumber:B.prNumber,supersededPrNumber:m.supersededPrNumber,validatedHeadSha:A.headSha,advancedThisRequest:!0,lockContended:n,blockedCategory:"branch-behind",retryable:!0,lastSafeCheckpoint:"branch-recovered",errorCode:"branch_behind"})}async function cM(a){var b;let c=new Date().toISOString();await cx({operationId:a.session.operationId,repoConfigId:a.input.repoConfigId,inputFingerprint:a.inputFingerprint,intendedWorkflowSha256:(b=a.intendedWorkflowContent,(0,d.createHash)("sha256").update(b,"utf8").digest("hex")),harnessDispatchRepo:a.harnessDispatchRepoSlug,targetRepo:a.input.targetRepo,targetRepoSlug:a.targetRepoSlug,productionBranch:a.input.productionBranch,installBranch:a.branchName,observedProductionHeadSha:a.observedProductionHeadSha,observedInstallHeadSha:a.observedInstallHeadSha,prNumber:a.prNumber,prUrl:a.prUrl,supersededPrNumber:a.supersededPrNumber,phase:a.phase,phaseStartedAt:c,startedAt:a.session.startedAt,checksDeadlineAt:a.session.checksPendingSince?new Date(a.session.checksPendingSince+12e4).toISOString():void 0,verificationDeadlineAt:a.session.verificationStartedAt?new Date(a.session.verificationStartedAt+6e4).toISOString():void 0,lastVerifiedRemoteHead:a.observedInstallHeadSha,lastSafeCheckpoint:a.lastSafeCheckpoint,retryCount:a.retryCount??0,lastRedactedError:a.lastRedactedError?(0,cg.MR)(a.lastRedactedError):void 0},a.cwd)}async function cN(a){if("missing"!==a.productionStatus.workflowStatus&&"differs"!==a.productionStatus.workflowStatus)return null;await cM({cwd:a.cwd,session:a.session,input:a.finalizeInput,targetRepoSlug:a.targetRepoSlug,branchName:a.branchName,intendedWorkflowContent:a.intendedWorkflowContent,harnessDispatchRepoSlug:a.harnessDispatchRepoSlug,inputFingerprint:a.inputFingerprint,phase:"creating-or-refreshing-install-branch",supersededPrNumber:a.supersededPrNumber,lastSafeCheckpoint:"before-empty-pr-recovery"});let[b,c]=a.targetRepoSlug.split("/"),d=null;try{d=(await a.client.getBranchRef(b,c,a.branchName)).object.sha}catch(a){if(!(a instanceof ax.OS&&404===a.status))throw a}let e=await co({client:a.client,targetRepoSlug:a.targetRepoSlug,productionBranch:a.finalizeInput.productionBranch,branchName:a.branchName,workflowPath:F.CH,workflowContent:a.intendedWorkflowContent,expectedReservedBranchHeadSha:d});if(!e.recovered)return e.needsReconciliation?cF({repoConfigId:a.finalizeInput.repoConfigId,targetRepo:a.finalizeInput.targetRepo,targetRepoSlug:a.targetRepoSlug,productionBranch:a.finalizeInput.productionBranch,branchName:a.branchName,lifecycle:"updating-branch",phase:"creating-or-refreshing-install-branch",operationId:a.session.operationId,workflowStatus:a.productionStatus.workflowStatus,message:cK,validatedHeadSha:e.observedHeadSha,advancedThisRequest:!0,lockContended:a.lockContended,retryable:!0,lastSafeCheckpoint:"empty-pr-reconcile",errorCode:"branch_behind"}):cE({repoConfigId:a.finalizeInput.repoConfigId,targetRepo:a.finalizeInput.targetRepo,targetRepoSlug:a.targetRepoSlug,productionBranch:a.finalizeInput.productionBranch,branchName:a.branchName,category:"unexpected-pr-content",workflowStatus:a.productionStatus.workflowStatus,operationId:a.session.operationId,advancedThisRequest:!0,lockContended:a.lockContended,customMessage:e.reason,lastSafeCheckpoint:"empty-pr-recovery-failed"});let f=await cr({client:a.client,targetRepoSlug:a.targetRepoSlug,productionBranch:a.finalizeInput.productionBranch,branchName:a.branchName,repoConfigId:a.finalizeInput.repoConfigId,prTitle:(0,bW.Hh)(),prBody:(0,bW.rv)({repoConfigId:a.finalizeInput.repoConfigId,productionBranch:a.finalizeInput.productionBranch,harnessDispatchRepo:a.harnessDispatchRepoSlug}),verifiedHeadSha:e.headSha,harnessDispatchRepo:a.harnessDispatchRepoSlug});return f.supersededPrNumber?a.session.supersededPrNumber=f.supersededPrNumber:a.supersededPrNumber&&(a.session.supersededPrNumber=a.supersededPrNumber),a.session.lastValidatedHeadSha=e.headSha,cB.set(cC(a.targetRepoSlug,a.finalizeInput.repoConfigId),a.session),await cM({cwd:a.cwd,session:a.session,input:a.finalizeInput,targetRepoSlug:a.targetRepoSlug,branchName:a.branchName,intendedWorkflowContent:a.intendedWorkflowContent,harnessDispatchRepoSlug:a.harnessDispatchRepoSlug,inputFingerprint:a.inputFingerprint,phase:"creating-or-refreshing-install-branch",prUrl:f.prUrl,prNumber:f.prNumber,supersededPrNumber:a.session.supersededPrNumber,observedInstallHeadSha:e.headSha,observedProductionHeadSha:e.productionSha,lastSafeCheckpoint:"empty-pr-recovered"}),cF({repoConfigId:a.finalizeInput.repoConfigId,targetRepo:a.finalizeInput.targetRepo,targetRepoSlug:a.targetRepoSlug,productionBranch:a.finalizeInput.productionBranch,branchName:a.branchName,lifecycle:"updating-branch",phase:"creating-or-refreshing-install-branch",operationId:a.session.operationId,workflowStatus:a.productionStatus.workflowStatus,message:cK,prUrl:f.prUrl,prNumber:f.prNumber,supersededPrNumber:a.session.supersededPrNumber,validatedHeadSha:e.headSha,advancedThisRequest:!0,lockContended:a.lockContended,blockedCategory:"branch-behind",retryable:!0,lastSafeCheckpoint:"empty-pr-recovered",errorCode:"branch_behind"})}async function cO(a){let{input:b,provider:c,client:e,lockContended:f=!1}=a,g=(0,bU.KO)(b.targetRepo),h=await cy(b.repoConfigId,a.cwd),i=b.operationId??h?.operationId??(0,d.randomUUID)();if(!g)return cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:"<invalid>",productionBranch:b.productionBranch,branchName:(0,bW.Yh)(b.repoConfigId),category:"unexpected-pr-content",workflowStatus:"unknown",operationId:i,advancedThisRequest:!0,lockContended:f,customMessage:`Invalid target repo URL: ${b.targetRepo}`});let j=b.branchName??(0,bW.Yh)(b.repoConfigId),k=await (0,E.z8)({cwd:a.cwd,manualRepo:b.manualHarnessDispatchRepo}),l=(0,bW.g1)({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,productionBranch:b.productionBranch,harnessDispatchRepo:k}),m=l.workflowContent,n=(0,E.OW)(k),o=l.fingerprint,p=await c.checkTargetWorkflowStatus({targetRepoSlug:g,workflowPath:F.CH,intendedWorkflowContent:m,productionBranch:b.productionBranch});if("present"===p.workflowStatus)return await cz(b.repoConfigId,a.cwd),cG({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:i,advancedThisRequest:!0,lockContended:f});let q=cB.get(cC(g,b.repoConfigId))??{operationId:i,startedAt:h?.startedAt??new Date().toISOString(),supersededPrNumber:h?.supersededPrNumber,checksPendingSince:h?.checksDeadlineAt?Date.parse(h.checksDeadlineAt)-12e4:void 0,verificationStartedAt:h?.verificationDeadlineAt?Date.parse(h.verificationDeadlineAt)-6e4:void 0};q.operationId=i,h?.supersededPrNumber&&(q.supersededPrNumber=h.supersededPrNumber),cB.set(cC(g,b.repoConfigId),q);let r=b.prUrl??h?.prUrl,s=h?.prNumber,t=h?.observedInstallHeadSha;if(r){let a=cf(r);a&&(s=a.pullNumber)}if(!r){let a=await cI(e,{targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j});a&&(r=a.html_url,s=a.number,t=a.headSha)}if(!r||!s){let c=await cN({client:e,cwd:a.cwd,finalizeInput:b,targetRepoSlug:g,branchName:j,productionStatus:p,intendedWorkflowContent:m,harnessDispatchRepoSlug:n,inputFingerprint:o,session:q,lockContended:f,supersededPrNumber:h?.prNumber??q.supersededPrNumber});return c||cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,category:"unexpected-pr-content",workflowStatus:p.workflowStatus,operationId:q.operationId,advancedThisRequest:!0,lockContended:f,customMessage:"No open workflow install PR was found for the deterministic install branch.",lastSafeCheckpoint:h?.lastSafeCheckpoint})}let u=cf(r);if(!u)return cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"unexpected-pr-content",workflowStatus:p.workflowStatus,prUrl:r,advancedThisRequest:!0,lockContended:f});let v=await cd(e,u,b.targetRepo);if(v.merged){let a=await c.checkTargetWorkflowStatus({targetRepoSlug:g,workflowPath:F.CH,intendedWorkflowContent:m,productionBranch:b.productionBranch});return"present"===a.workflowStatus?cG({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,prUrl:r,prNumber:s,advancedThisRequest:!0,lockContended:f}):(q.verificationStartedAt??=Date.now(),Date.now()-q.verificationStartedAt>6e4)?(cB.set(cC(g,b.repoConfigId),q),cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"verification-failed",workflowStatus:a.workflowStatus,prUrl:r,prNumber:s,advancedThisRequest:!0,lockContended:f})):(cB.set(cC(g,b.repoConfigId),q),cF({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,lifecycle:"verifying",workflowStatus:a.workflowStatus,message:"Verifying workflow on the production branch.",prUrl:r,prNumber:s,advancedThisRequest:!0,lockContended:f}))}if(v.branch!==j)return cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"unexpected-pr-content",workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,advancedThisRequest:!0,lockContended:f});try{(0,b7.$H)({prUrl:r,actualBaseBranch:v.baseBranch,expectedBaseBranch:b.productionBranch})}catch{return cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"unexpected-pr-content",workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,advancedThisRequest:!0,lockContended:f})}v.isDraft&&(await e.markPullRequestReadyForReview(u.owner,u.repo,u.pullNumber),v=await cd(e,u,b.targetRepo)),q.lastValidatedHeadSha=t=v.headSha;let w=cJ(v.changedFiles,F.CH);if(!w){let c=await cL({client:e,input:b,targetRepoSlug:g,branchName:j,productionStatus:p,intendedWorkflowContent:m,inspection:v,parsedPr:u,prUrl:r,prNumber:s,validatedHeadSha:t,session:q,lockContended:f,filesValidationPassed:w,harnessDispatchRepoSlug:n,cwd:a.cwd,inputFingerprint:o});return c||cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"unexpected-pr-content",workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f})}let x=await cH(e,g,F.CH,v.headSha);if("present"!==(0,bW.DR)(x,m)){let c=await cL({client:e,input:b,targetRepoSlug:g,branchName:j,productionStatus:p,intendedWorkflowContent:m,inspection:v,parsedPr:u,prUrl:r,prNumber:s,validatedHeadSha:t,session:q,lockContended:f,filesValidationPassed:!0,harnessDispatchRepoSlug:n,cwd:a.cwd,inputFingerprint:o});return c||cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"unexpected-pr-content",workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f,customMessage:"Workflow install PR content does not match the harness-generated workflow."})}if(!m.includes(n)||!m.includes(`--arg repo ${b.repoConfigId}`))return cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"unexpected-pr-content",workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f});let y=await (0,I.rL)({baseDir:a.cwd}),z=y.config.merge?.mergeMethod??b6.nm,A=function(a,b){let c=b.merge?.allowPendingChecks??b6.dM,d=b.merge?.allowUnknownChecks??b6.Sf,e=b.merge?.allowNeutralChecks??b6.R;if(0===a.length)return d?{decision:"allow",classification:null,reason:"No check runs reported; proceeding per allowUnknownChecks",warnings:["No GitHub check runs reported for the PR head commit"]}:{decision:"block",classification:"checks_unknown",reason:"No GitHub check runs reported for the PR head commit",warnings:[]};let f=a.filter(a=>null!==a.conclusion&&b8.has(a.conclusion));if(f.length>0)return{decision:"block",classification:"checks_failing",reason:`Failing checks: ${f.map(a=>a.name).join(", ")}`,warnings:[]};let g=a.filter(a=>"completed"!==a.status||null===a.conclusion);if(g.length>0)return c?{decision:"allow",classification:null,reason:"Pending checks present; proceeding per allowPendingChecks",warnings:g.map(a=>`Pending check: ${a.name}`)}:{decision:"block",classification:"checks_pending",reason:`Pending checks: ${g.map(a=>a.name).join(", ")}`,warnings:[]};let h=a.filter(a=>null!==a.conclusion&&!b9.has(a.conclusion));return h.length>0&&!e?{decision:"block",classification:"checks_unknown",reason:`Unrecognized check conclusions: ${h.map(a=>`${a.name}=${a.conclusion}`).join(", ")}`,warnings:[]}:{decision:"allow",classification:null,reason:"Checks policy passed",warnings:[]}}(v.checks,y.config);if("block"===A.decision)return"checks_failing"===A.classification?cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"checks-failing",workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f,customMessage:(0,cg.MR)(A.reason)}):(q.checksPendingSince??=Date.now(),Date.now()-q.checksPendingSince>12e4)?(cB.set(cC(g,b.repoConfigId),q),cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"checks-pending",workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f,customMessage:"Timed out waiting for GitHub checks on the workflow install PR."})):(cB.set(cC(g,b.repoConfigId),q),cF({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,lifecycle:"waiting-for-checks",workflowStatus:p.workflowStatus,message:"Waiting for GitHub checks on the workflow install PR.",prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f,blockedCategory:"checks-pending"}));let B=v.mergeableState?.toLowerCase()??null;if("unknown"===B||null===v.mergeable)return cB.set(cC(g,b.repoConfigId),q),cF({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,lifecycle:"waiting-for-checks",workflowStatus:p.workflowStatus,message:"Waiting for GitHub mergeability on the workflow install PR.",prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f,blockedCategory:"mergeability-pending"});if("behind"===B){if(q.branchUpdateAttemptedForHeadSha!==t)try{return await e.updatePullRequestBranch(u.owner,u.repo,u.pullNumber,{expectedHeadSha:t}),q.branchUpdateAttemptedForHeadSha=t,cB.set(cC(g,b.repoConfigId),q),cF({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,lifecycle:"updating-branch",workflowStatus:p.workflowStatus,message:"Updating the workflow install branch.",prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f})}catch(h){let c=(0,ch.y)({error:h}),d=await cL({client:e,input:b,targetRepoSlug:g,branchName:j,productionStatus:p,intendedWorkflowContent:m,inspection:v,parsedPr:u,prUrl:r,prNumber:s,validatedHeadSha:t,session:q,lockContended:f,filesValidationPassed:cJ(v.changedFiles,F.CH),harnessDispatchRepoSlug:n,cwd:a.cwd,inputFingerprint:o});if(d)return d;return cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:c.category,workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f,customMessage:c.message})}let c=await cL({client:e,input:b,targetRepoSlug:g,branchName:j,productionStatus:p,intendedWorkflowContent:m,inspection:v,parsedPr:u,prUrl:r,prNumber:s,validatedHeadSha:t,session:q,lockContended:f,filesValidationPassed:cJ(v.changedFiles,F.CH),harnessDispatchRepoSlug:n,cwd:a.cwd,inputFingerprint:o});return c||cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"branch-behind",workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f})}if("dirty"===B||!(0,ci.f)({mergeableState:v.mergeableState,mergeable:v.mergeable}))return cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"merge-conflict",workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f});if(q.mergeAttemptedForHeadSha===t)return cB.set(cC(g,b.repoConfigId),q),cF({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,lifecycle:"merging",workflowStatus:p.workflowStatus,message:"Waiting for workflow install PR merge to complete.",prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!1,lockContended:f});try{await e.mergePullRequest(u.owner,u.repo,u.pullNumber,{mergeMethod:z,commitTitle:(0,bW.Hh)(),expectedHeadSha:t}),q.mergeAttemptedForHeadSha=t,q.verificationStartedAt=Date.now(),cB.set(cC(g,b.repoConfigId),q)}catch(a){if((0,ca.B)(a))q.verificationStartedAt??=Date.now(),cB.set(cC(g,b.repoConfigId),q);else{let c=(0,ch.y)({error:a,mergeableState:v.mergeableState,message:a instanceof Error?a.message:String(a),checkPolicy:A});if(c.waiting)return cB.set(cC(g,b.repoConfigId),q),cF({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,lifecycle:"checks-pending"===c.category?"waiting-for-checks":"merging",workflowStatus:p.workflowStatus,message:c.message,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f,blockedCategory:c.category});if(a instanceof ax.OS&&"github_auth_failure"===(0,ca.N)(a))return cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"permission-denied",workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f});return cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:c.category,workflowStatus:p.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f,customMessage:c.message})}}let C=await c.checkTargetWorkflowStatus({targetRepoSlug:g,workflowPath:F.CH,intendedWorkflowContent:m,productionBranch:b.productionBranch});return"present"===C.workflowStatus?cG({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f}):(q.verificationStartedAt??=Date.now(),Date.now()-q.verificationStartedAt>6e4)?(cB.set(cC(g,b.repoConfigId),q),cE({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,category:"verification-failed",workflowStatus:C.workflowStatus,prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f,customMessage:"Workflow install PR merged, but production verification timed out."})):(cB.set(cC(g,b.repoConfigId),q),cF({repoConfigId:b.repoConfigId,targetRepo:b.targetRepo,targetRepoSlug:g,productionBranch:b.productionBranch,branchName:j,operationId:q.operationId,lifecycle:"verifying",workflowStatus:C.workflowStatus,message:"Verifying workflow on the production branch.",prUrl:r,prNumber:s,validatedHeadSha:t,advancedThisRequest:!0,lockContended:f,canRetry:!0}))}async function cP(a){var b,c;let d=(b=(0,bU.KO)(a.input.targetRepo)??a.input.targetRepo,c=a.input.repoConfigId,`${b}:${c}`),{result:e,lockContended:f}=await cu(d,async()=>cO({cwd:a.cwd,input:a.input,provider:a.provider,client:a.client,lockContended:!1})),g={...e,lockContended:f||e.lockContended,retryable:!!f||e.retryable,errorCode:f?"lock_contended":e.errorCode,retryAfterMs:f?cD(!0):e.retryAfterMs};return"complete"===g.lifecycle&&await cz(a.input.repoConfigId,a.cwd),g}function cQ(a){let b="queued"===a.status||"in_progress"===a.status||"completed"===a.status?a.status:"waiting"===a.status||"requested"===a.status||"pending"===a.status?"queued":"in_progress",c="success"===a.conclusion||"failure"===a.conclusion||"cancelled"===a.conclusion?a.conclusion:null===a.conclusion?null:"failure";return{id:a.id,status:b,conclusion:c,htmlUrl:a.html_url,createdAt:a.created_at,name:a.name,displayTitle:a.display_title}}class cR{constructor(a){this.client=new ax.jh(a),this.remoteSetup=(0,X.iB)(a.token)}async getRepositoryMetadata(a,b,c){try{let d=await this.client.getRepository(a,b,{signal:c?.signal});if("number"!=typeof d.id||!Number.isInteger(d.id)||d.id<=0)throw Error(`GitHub repository metadata for ${a}/${b} is missing a valid numeric repository ID.`);return{id:d.id,fullName:d.full_name??`${a}/${b}`,defaultBranch:d.default_branch??"main"}}catch(a){if(a instanceof ax.OS&&404===a.status)return null;throw(0,X.jq)(a)}}async getRepositoryMetadataById(a){try{let b=(await this.client.getRepositoryById(a)).full_name;if(!b||!b.includes("/"))throw Error(`GitHub repository ID ${a} returned invalid full_name metadata.`);let[c,d]=b.split("/");if(!c||!d)throw Error(`GitHub repository ID ${a} returned invalid full_name metadata.`);return this.getRepositoryMetadata(c,d)}catch(a){if(a instanceof ax.OS&&404===a.status)return null;throw(0,X.jq)(a)}}async getRepositoryDefaultBranchHead(a,b,c,d){try{return(await this.client.getBranchRef(a,b,c,{signal:d?.signal})).object.sha}catch(a){throw(0,X.jq)(a)}}async readRepositoryFileContent(a,b,c,d,e){try{let f=await this.client.getRepositoryContent(a,b,c,d,{signal:e?.signal});return f?this.client.decodeRepositoryContent(f):null}catch(a){throw(0,X.jq)(a)}}async listRepositoryTreePaths(a,b,c){try{let d=await this.client.getGitCommit(a,b,c);return((await this.client.getGitTree({owner:a,repo:b,treeSha:d.tree.sha,recursive:!0})).tree??[]).filter(a=>a.path&&"blob"===a.type).map(a=>({path:a.path,sha:a.sha,type:a.type}))}catch(a){throw(0,X.jq)(a)}}async getBlobContentSha256(a,b,c){try{var e;let f=await this.client.getGitBlob(a,b,c);return e="base64"===f.encoding?Buffer.from(f.content,"base64"):Buffer.from(f.content,"utf8"),(0,d.createHash)("sha256").update(e).digest("hex")}catch(a){throw(0,X.jq)(a)}}async createGitBlob(a){try{return await this.client.createGitBlob(a)}catch(a){throw(0,X.jq)(a)}}async createGitTree(a){try{return{sha:(await this.client.createGitTree(a)).sha}}catch(a){throw(0,X.jq)(a)}}async createGitCommit(a){try{let b=await this.client.createGitCommit(a);return{sha:b.sha,tree:b.tree,parents:b.parents}}catch(a){throw(0,X.jq)(a)}}async getGitCommit(a,b,c){try{let d=await this.client.getGitCommit(a,b,c);return{sha:d.sha,tree:d.tree,parents:d.parents}}catch(a){throw(0,X.jq)(a)}}async getGitRef(a,b,c){try{let d=await this.client.getGitRef(a,b,c);return{ref:d.ref,object:{sha:d.object.sha}}}catch(a){throw(0,X.jq)(a)}}async updateGitRef(a){try{if(a.expectedSha){let b=await this.getGitRef(a.owner,a.repo,a.ref);if(b.object.sha!==a.expectedSha)throw Error(`Ref update rejected: expected ${a.expectedSha}, found ${b.object.sha}.`)}let b=await this.client.updateGitRef({owner:a.owner,repo:a.repo,ref:a.ref,sha:a.sha,force:a.force});return{ref:b.ref,object:{sha:b.object.sha}}}catch(a){throw(0,X.jq)(a)}}async createGitRef(a){try{var b;let c=(b=a.ref).startsWith("refs/heads/")?b.slice(11):b.startsWith("refs/")?b.slice(5):b,d=await this.client.createGitRef(a.owner,a.repo,c,a.sha);return{ref:d.ref,object:{sha:d.object.sha}}}catch(a){throw(0,X.jq)(a)}}async listPullRequests(a,b,c){try{return(await this.client.listPullRequests(a,b,{state:c.state,base:c.base,head:c.head})).map(a=>({number:a.number,htmlUrl:a.html_url,headRef:a.head.ref,baseRef:a.base.ref,body:a.body??"",state:"closed"===a.state?"closed":"open",headSha:a.head.sha}))}catch(a){throw(0,X.jq)(a)}}async createPullRequest(a){try{let b=await this.client.createPullRequest(a);return{number:b.number,htmlUrl:b.html_url}}catch(a){throw(0,X.jq)(a)}}async updatePullRequest(a,b,c,d){try{await this.client.updatePullRequest(a,b,c,d)}catch(a){throw(0,X.jq)(a)}}async mergePullRequest(a,b,c,d){try{await this.client.mergePullRequest(a,b,c,{mergeMethod:d.mergeMethod??"squash",commitTitle:d.commitTitle,expectedHeadSha:d.expectedHeadSha})}catch(a){throw(0,X.jq)(a)}}async dispatchWorkflow(a,b,c,d,e){try{return await this.client.createWorkflowDispatch(a,b,c,d,e),{}}catch(a){throw(0,X.jq)(a)}}async getWorkflowRun(a,b,c){try{let d=await this.client.getWorkflowRun(a,b,c);return cQ(d)}catch(a){throw(0,X.jq)(a)}}async listWorkflowRuns(a,b,c,d){try{return(await this.client.listWorkflowRuns(a,b,c,{branch:d?.branch,event:d?.event})).map(cQ)}catch(a){throw(0,X.jq)(a)}}async writeHarnessSecrets(a,b){if(!this.remoteSetup.writeHarnessSecrets)throw Error("Live remote setup provider does not support writeHarnessSecrets.");return this.remoteSetup.writeHarnessSecrets(a,b)}async writeHarnessVariables(a,b){if(!this.remoteSetup.writeHarnessVariables)throw Error("Live remote setup provider does not support writeHarnessVariables.");return this.remoteSetup.writeHarnessVariables(a,b)}}function cS(a,b){return new cR({token:a,timeoutMs:b?.timeoutMs})}async function cT(a=process.env){return!function(a=process.env){return"true"===a.VITEST||"test"===a.NODE_ENV}()||a.HARNESS_VITEST_RUNNER_UPGRADE_MOCK,null}var cU=c(33776),cV=c(73833);async function cW(a,b){await (0,cV.xj)({runnerUpgrade:a},b)}let cX=new Map;async function cY(a,b){let c,d=cX.get(a)??Promise.resolve(),e=new Promise(a=>{c=a}),f=d.then(()=>e);cX.set(a,f),await d;try{return await b()}finally{c(),cX.get(a)===f&&cX.delete(a)}}function cZ(a){let b=(0,k.ym)(a);return ag().join(b.harnessDir,"p-dev-runner-upgrade.pending.json")}async function c$(a){try{let b=await (0,f.readFile)(cZ(a),"utf8"),c=JSON.parse(b);if("string"!=typeof c.operationId||"number"!=typeof c.repositoryId||"string"!=typeof c.repoSlug||"string"!=typeof c.targetSnapshotContentId||"string"!=typeof c.previewFingerprint)return null;return c}catch{return null}}async function c_(a,b){let c=cZ(b);await (0,f.mkdir)(ag().dirname(c),{recursive:!0});let d=`${c}.${process.pid}.${Date.now()}.tmp`;await (0,f.writeFile)(d,`${JSON.stringify(a,null,2)}
|
|
43
|
+
`,"utf8"),await (0,f.rename)(d,c)}async function c0(a){try{await (0,f.rm)(cZ(a),{force:!0})}catch{}}var c1=c(52884);function c2(a){switch(a){case"verifying-managed-repository":case"comparing-runner-snapshots":case"preparing-upgrade-commit":case"updating-managed-runner":case"verifying-runner-on-production-branch":case"synchronizing-cloud-configuration":case"running-configuration-canary":return a;default:return"verifying-managed-repository"}}function c3(a,b){return`Retry Update PDev runner to resume operation ${b} from checkpoint ${a??"unknown"}.`}function c4(a){let b=(0,k.ym)(a);return ag().join(b.harnessDir,"p-dev-runner-upgrade.progress.json")}async function c5(a,b){let c=a.uiPhase??c2(a.phase),d=Date.parse(a.startedAt),e=a.elapsedMs??(Number.isFinite(d)?Math.max(0,Date.now()-d):0),g=new Date().toISOString(),h={operationId:a.operationId,phase:a.phase,uiPhase:c,uiPhaseLabel:a.uiPhaseLabel??(0,c1.s_)(c),phaseStartedAt:a.phaseStartedAt,startedAt:a.startedAt,elapsedMs:e,canaryRunId:a.canaryRunId,canaryRunUrl:a.canaryRunUrl,prUrl:a.prUrl,recoveryInstruction:a.recoveryInstruction??c3(a.phase,a.operationId),updatedAt:a.updatedAt??g,lastSuccessfulProviderCallAt:a.lastSuccessfulProviderCallAt,workerHeartbeatAt:a.workerHeartbeatAt??g,lastCheckpoint:a.lastCheckpoint??a.phase,filesInspected:a.filesInspected,filesTotal:a.filesTotal,lastCompletedBatch:a.lastCompletedBatch,retryCount:a.retryCount,retryable:a.retryable,errorCode:a.errorCode},i=c4(b);await (0,f.mkdir)(ag().dirname(i),{recursive:!0});let j=`${i}.${process.pid}.${Date.now()}.tmp`;return await (0,f.writeFile)(j,`${JSON.stringify(h,null,2)}
|
|
44
|
+
`,"utf8"),await (0,f.rename)(j,i),h}async function c6(a){try{let b=await (0,f.readFile)(c4(a),"utf8"),c=JSON.parse(b);if("string"!=typeof c.operationId||"string"!=typeof c.phase)return null;let d=c.uiPhase??c2(c.phase);return{...c,uiPhase:d,uiPhaseLabel:c.uiPhaseLabel??(0,c1.s_)(d),recoveryInstruction:c.recoveryInstruction??c3(c.phase,c.operationId)}}catch{return null}}function c7(a){let b={};for(let c of a.files)b[c.path]=c.sha256;return b}function c8(a){let b=a.createdFromPackageSnapshot?.fileHashes;if(!b||"object"!=typeof b)return null;let c=Object.entries(b).filter(([a,b])=>"string"==typeof a&&a.length>0&&"string"==typeof b&&b.length>0);return 0===c.length?null:Object.fromEntries(c)}function c9(a){return Object.keys(a).sort()}async function da(a,b){let c=b.workflowPath??c1.nE,d=Date.now();for(;Date.now()-d<b.pollTimeoutMs;){let d=(await a.listWorkflowRuns(b.owner,b.repo,c,{branch:b.ref,event:"workflow_dispatch"})).find(a=>(function(a,b){let c=b.trim();if(!c)return!1;let d=`PDev runner config canary ${c}`;return a.name===d||a.displayTitle===d||!!(a.name?.includes(c)||a.displayTitle?.includes(c))})(a,b.operationId));if(d)return d;await new Promise(a=>setTimeout(a,b.pollIntervalMs))}return null}function db(a){let b=(0,k.ym)(a);return ag().join(b.harnessDir,"p-dev-runner-upgrade.last-verified.json")}async function dc(a){try{let b=await (0,f.readFile)(db(a),"utf8"),c=JSON.parse(b);if("string"!=typeof c.snapshotContentId||"string"!=typeof c.packageVersion||"string"!=typeof c.sourceCommit||"string"!=typeof c.verifiedAt)return null;return c}catch{return null}}async function dd(a,b){let c=db(b);await (0,f.mkdir)(ag().dirname(c),{recursive:!0});let d=`${c}.${process.pid}.${Date.now()}.tmp`;await (0,f.writeFile)(d,`${JSON.stringify(a,null,2)}
|
|
45
|
+
`,"utf8"),await (0,f.rename)(d,c)}c(80641);class de extends Error{constructor(a,b,c,d){super(a),this.callName=b,this.timeoutMs=c,this.unresolvedStage=d,this.code="runner_upgrade_timeout",this.retryable=!0,this.name="RunnerUpgradeTimeoutError"}}class df{begin(a){this.current&&this.end(!1),this.current={stage:a,started:Date.now()},this.unresolvedStage=a}end(a=!1){this.current&&(this.timings.push({stage:this.current.stage,durationMs:Date.now()-this.current.started,timedOut:a||void 0}),a||(this.unresolvedStage=void 0),this.current=null)}markTimedOut(){this.current&&this.end(!0)}snapshot(){return[...this.timings]}commit(){this.snapshot(),this.unresolvedStage}constructor(){this.timings=[],this.current=null}}function dg(a){if(a?.aborted)throw new de("Runner upgrade status request was aborted.","aborted",0)}async function dh(a,b,c,d){dg(d);let e=new AbortController,f=function(...a){let b=a.filter(a=>!!a);if(0===b.length)return;if(1===b.length)return b[0];if("function"==typeof AbortSignal.any)return AbortSignal.any(b);let c=new AbortController;for(let a of b){if(a.aborted){c.abort(a.reason);break}a.addEventListener("abort",()=>{c.abort(a.reason)},{once:!0})}return c.signal}(e.signal,d),g=setTimeout(()=>{e.abort()},b),h=new Promise((c,g)=>{let h=()=>{g(new de(d?.aborted&&!e.signal.aborted?`${a} aborted.`:`${a} timed out after ${b}ms.`,a,b))};if(f.aborted)return void h();f.addEventListener("abort",h,{once:!0})}),i=c(f).catch(c=>{if(f.aborted)throw c instanceof de?c:new de(`${a} aborted.`,a,b);throw c});try{return await Promise.race([i,h])}finally{void 0!==g&&(clearTimeout(g),g=void 0),e.signal.aborted||e.abort(),i.catch(()=>{})}}async function di(a,b,c,d,e){let f=Date.now();try{let g=await dh(a,b,c,e);return d?.({call:a,durationMs:Date.now()-f,timedOut:!1}),g}catch(c){let b=c instanceof de;throw d?.({call:a,durationMs:Date.now()-f,timedOut:b}),c}}let dj=new Map;async function dk(a,b,c,d,e,f){let g,h=!1,i=new Promise(b=>{g=setTimeout(()=>{f?.markTimedOut();let a=f?.unresolvedStage;c(),Promise.resolve(e(a)).then(a=>{h||(h=!0,b(a))})},a)}),j=d(b).then(a=>(h=!0,a),a=>{if(b.aborted)return e(f?.unresolvedStage);throw a});try{return await Promise.race([j,i])}finally{void 0!==g&&clearTimeout(g),j.catch(()=>{})}}let dl=new Set,dm=[],dn=new Set,dp=null,dq=null,dr=!1,ds=!1;function dt(a,b){dl.has(a)||dn.has(a)||(dn.add(a),dm.push({operationId:a,cwd:b}),dv())}async function du(a){let b=await c$(a);b&&(!b.lastError||b.codeUpdateComplete)&&(dl.has(b.operationId)||dt(b.operationId,a))}async function dv(){if(!dr){dr=!0;try{for(;dm.length>0;){let a=dm.shift();if(!a)break;if(dn.delete(a.operationId),!dl.has(a.operationId)){dl.add(a.operationId);try{if(!dp||!dq)continue;let b=await dp(a.cwd);if(!b)continue;let c=await c$(a.cwd);if(!c||c.operationId!==a.operationId)continue;await dq(a.cwd,b)}catch{}finally{dl.delete(a.operationId)}}}}finally{dr=!1,dm.length>0&&dv()}}}let dw=["verifying-managed-repository","comparing-runner-snapshots","preparing-upgrade-commit","updating-managed-runner","verifying-runner-on-production-branch","synchronizing-cloud-configuration","running-configuration-canary"],dx=new Set([".harness/config.local.json",".env.local"]);function dy(a){return(0,d.createHash)("sha256").update(a).digest("hex")}function dz(a){return{snapshotContentId:a.snapshotContentId,packageVersion:a.packageVersion,sourceCommit:a.sourceCommit}}async function dA(a){let b=await (0,E.z8)({cwd:a});if(!b.resolved||!b.repo)throw Error("Harness dispatch repository is not configured.");let c=(0,E.OW)(b),[d,e]=c.split("/");if(!d||!e)throw Error(`Invalid harness repository slug ${c}.`);return{repoSlug:c,owner:d,repo:e}}async function dB(){let a=await bs("file:///Users/weston/Code/agentic-product-development-harness/src/setup/runner-upgrade.ts");return a.ok?{packageRoot:a.packageRoot,snapshotRoot:a.snapshotRoot,packageVersion:a.packageVersion,manifest:a.manifest,fingerprint:a.fingerprint}:null}async function dC(a){let b=await br("file:///Users/weston/Code/agentic-product-development-harness/src/setup/runner-upgrade.ts",process.env,a);return b.ok?{packageRoot:b.packageRoot,snapshotRoot:b.snapshotRoot,packageVersion:b.packageVersion,manifest:b.manifest,fingerprint:b.fingerprint}:null}async function dD(a){let b=await dV(a);return!!b&&(0,aF.Dr)(b).ok}async function dE(a,b){let c=await a.readRepositoryFileContent(b.owner,b.repo,aF.wJ,b.defaultBranchHead,{signal:b.signal});if(!c)return{ok:!1,status:"blocked_non_managed",reason:"Managed repository marker is missing on the default branch."};let d=(0,aF.Dr)(c);return d.ok?d.marker.createdFromPackageSnapshot?{ok:!0,marker:d.marker}:{ok:!1,status:"blocked_non_managed",reason:"Managed repository was not created from a packaged workspace snapshot."}:{ok:!1,status:"blocked_non_managed",reason:d.reason}}async function dF(a,b){let c={},d=b.paths.length,e=0;for(let f of b.paths){let g=await a.readRepositoryFileContent(b.owner,b.repo,f,b.defaultBranchHead);e+=1,null!==g&&(c[f]=dy(g)),b.onHeartbeat&&(e%5==0||e===d)&&await b.onHeartbeat({filesInspected:e,filesTotal:d,lastCompletedBatch:f})}return c}async function dG(a,b){b?.testHangAfterStage===a&&await new Promise((c,d)=>{let e=()=>{d(new de(`test hang aborted at ${a}`,"testHangAfterStage",0,a))};if(b.signal?.aborted)return void e();b.signal?.addEventListener("abort",e,{once:!0})})}async function dH(a,b,c="worker",d={}){let e="status"===c?5e3:6e4,f=[],g=a=>{f.push(a)},h=d.tracker,i=d.signal;h?.begin("embedded_snapshot_identity"),dg(i),await dG("embedded_snapshot_identity",d);let j="status"===c?await dC(i):await dB();if(h?.end(),!j)return"status"===c&&[...f],{ok:!1,result:{status:"failed",statusLabel:(0,c1.fA)("failed"),blockedReason:"Embedded workspace snapshot is unavailable."}};try{h?.begin("context_normalization"),dg(i),await dG("context_normalization",d);let{repoSlug:k,owner:l,repo:m}=await dA(a);h?.end(),h?.begin("provider_wrapper"),dg(i),await dG("provider_wrapper",d);let n=await di("getRepositoryMetadata",e,a=>b.getRepositoryMetadata(l,m,{signal:a}),g,i);if(!n)return h?.end(),"status"===c&&[...f],{ok:!1,result:{status:"failed",statusLabel:(0,c1.fA)("failed"),blockedReason:`Harness repository ${k} is not accessible.`}};let o=await di("getRepositoryDefaultBranchHead",e,a=>b.getRepositoryDefaultBranchHead(l,m,n.defaultBranch,{signal:a}),g,i);h?.end(),h?.begin("marker_parsing"),dg(i),await dG("marker_parsing",d);let p=await di("readRemoteManagedMarker",e,a=>dE(b,{owner:l,repo:m,defaultBranch:n.defaultBranch,defaultBranchHead:o,signal:a}),g,i);if(h?.end(),"status"===c&&[...f],!p.ok)return{ok:!1,result:{status:p.status,statusLabel:(0,c1.fA)(p.status),blockedReason:p.reason,availableSnapshot:dz(j.manifest)}};h?.begin("status_conversion"),dg(i),await dG("status_conversion",d);let q=(0,aF.qD)(p.marker,k,{repositoryId:n.id});if(!q.ok)return h?.end(),{ok:!1,result:{status:"blocked_non_managed",statusLabel:(0,c1.fA)("blocked_non_managed"),blockedReason:q.reason,currentSnapshot:p.marker.createdFromPackageSnapshot?{snapshotContentId:p.marker.createdFromPackageSnapshot.snapshotContentId,packageVersion:p.marker.createdFromPackageSnapshot.packageVersion,sourceCommit:p.marker.createdFromPackageSnapshot.sourceCommit}:void 0,availableSnapshot:dz(j.manifest)}};return h?.end(),{ok:!0,context:{repoSlug:k,owner:l,repo:m,repositoryId:n.id,defaultBranch:n.defaultBranch,defaultBranchHead:o,marker:p.marker,packagedSnapshot:j}}}catch(a){if("status"===c&&([...f],h?.markTimedOut()),a instanceof de||"status"===c)return{ok:!1,result:{status:"checking",statusLabel:(0,c1.fA)("checking"),degraded:!0,blockedReason:a instanceof Error?a.message:"Runner upgrade status check timed out.",retryGuidance:"Retry status shortly. GitHub did not respond within the page-status deadline.",retryAvailable:!0,unresolvedStage:h?.unresolvedStage,availableSnapshot:dz(j.manifest)}};throw a}}async function dI(a,b,c,d){let e=new Date().toISOString();await c5({operationId:b.operationId,phase:c,phaseStartedAt:e,startedAt:b.startedAt,canaryRunId:b.canaryRunId,canaryRunUrl:b.canaryRunUrl,prUrl:b.prUrl,workerHeartbeatAt:d?.workerHeartbeatAt??e,lastSuccessfulProviderCallAt:d?.lastSuccessfulProviderCallAt,filesInspected:d?.filesInspected,filesTotal:d?.filesTotal,lastCompletedBatch:d?.lastCompletedBatch,retryCount:d?.retryCount,retryable:d?.retryable,errorCode:d?.errorCode,lastCheckpoint:d?.lastCheckpoint??c,recoveryInstruction:d?.recoveryInstruction},a)}async function dJ(a,b,c){var d;let e=c8(b.marker),f=c7(b.packagedSnapshot.manifest),g=[...new Set([...Object.keys(e??{}),...Object.keys(f)])].sort(),h=await dF(a,{owner:b.owner,repo:b.repo,defaultBranchHead:b.defaultBranchHead,paths:g,onHeartbeat:c?.onHeartbeat});if(a.listRepositoryTreePaths){let c=function(a){let b=new Set(Object.keys(a.nextHashes)),c=[];for(let d of a.remoteTreePaths){if(!(d===aF.wJ||!(0,bm.o8)(d)||b.has(d)))!(dx.has(d)||(0,bm.lw)(d))&&(a.previousHashes?.[d]||c.push(d))}return[...new Set(c)].sort()}({remoteTreePaths:(await a.listRepositoryTreePaths(b.owner,b.repo,b.defaultBranchHead)).map(a=>a.path),nextHashes:f,previousHashes:e});if(c.length>0)return{ok:!1,status:"blocked_unexpected_remote",message:`Unexpected remote paths outside packaged policy: ${c.join(", ")}`}}let i=function(a){let b=function(a){if(a.previousHashes)return{hashes:a.previousHashes};let b=!!a.remoteTreeSha&&!!a.previousTreeSha&&a.remoteTreeSha===a.previousTreeSha;return a.previousSnapshotContentId&&a.remoteSnapshotContentId&&a.remoteSnapshotContentId===a.previousSnapshotContentId&&b?{hashes:a.remoteHashes}:{ok:!1,code:"legacy_unsafe",conflictPaths:[],message:"legacy_marker_without_hashes"}}(a);if("ok"in b)return b;let c=b.hashes,{replacePaths:d,deletePaths:e}=function(a){let b=[],c=[];for(let d of[...new Set([...c9(a.previousHashes),...c9(a.nextHashes)])].sort()){let e=a.previousHashes[d],f=a.nextHashes[d];if(e!==f){if(void 0===f){c.push(d);continue}b.push(d)}}return{replacePaths:b,deletePaths:c}}({previousHashes:c,nextHashes:a.nextHashes}),f=[];for(let b of[...d,...e]){let d=c[b],e=a.remoteHashes[b];if(void 0===d){void 0!==e&&f.push(b);continue}e!==d&&f.push(b)}return f.length>0?{ok:!1,code:"operator_conflicts",conflictPaths:[...new Set(f)].sort(),message:"Operator edits conflict with the packaged runner upgrade."}:{ok:!0,replacePaths:d,deletePaths:e}}({previousHashes:e,remoteHashes:h,nextHashes:f,previousSnapshotContentId:b.marker.createdFromPackageSnapshot?.snapshotContentId,remoteSnapshotContentId:b.marker.createdFromPackageSnapshot?.snapshotContentId,remoteTreeSha:b.marker.createdFromPackageSnapshot?.snapshotGitTreeSha1,previousTreeSha:b.marker.createdFromPackageSnapshot?.snapshotGitTreeSha1});if(!i.ok)return{ok:!1,status:"operator_conflicts"===i.code?"blocked_operator_conflicts":"blocked_non_managed",conflictPaths:i.conflictPaths,message:i.message};let j=dy(JSON.stringify({targetSnapshotContentId:(d={targetSnapshotContentId:b.packagedSnapshot.manifest.snapshotContentId,replacePaths:i.replacePaths,deletePaths:i.deletePaths,repositoryId:b.repositoryId}).targetSnapshotContentId,replacePaths:[...d.replacePaths].sort(),deletePaths:[...d.deletePaths].sort(),repositoryId:d.repositoryId}));return{ok:!0,previousHashes:e,remoteHashes:h,nextHashes:f,replacePaths:i.replacePaths,deletePaths:i.deletePaths,previewFingerprint:j}}async function dK(a,b){let c=await a.listPullRequests(b.owner,b.repo,{state:"open",base:b.defaultBranch});for(let a of c){let c=(0,c1.yH)(a.body);if(c&&c.repositoryId===b.repositoryId&&c.snapshotContentId===b.snapshotContentId)return{number:a.number,htmlUrl:a.htmlUrl,headSha:a.headSha}}let d=c.find(a=>a.headRef===b.branchName);return d?{number:d.number,htmlUrl:d.htmlUrl,headSha:d.headSha}:null}async function dL(a,b,c){let d=b.defaultBranchHead,e=(await a.getGitCommit(b.owner,b.repo,d)).tree.sha,f=b.packagedSnapshot.manifest,g=new Map;for(let d of c.replacePaths){let c=f.files.find(a=>a.path===d);if(!c)throw Error(`Packaged snapshot is missing ${d}.`);let e=await (0,a0.bY)({snapshotRoot:b.packagedSnapshot.snapshotRoot,path:d,expectedSha256:c.sha256}),h=await a.createGitBlob({owner:b.owner,repo:b.repo,content:e});g.set(d,h.sha)}let h=JSON.stringify((0,aF.a)({repository:b.repoSlug,repositoryId:b.repositoryId,manifest:f,snapshotCommitSha:"pending",defaultBranch:b.defaultBranch,operationId:c.operationId,pDevVersion:b.packagedSnapshot.packageVersion}),null,2),i=await a.createGitBlob({owner:b.owner,repo:b.repo,content:Buffer.from(`${h}
|
|
46
|
+
`,"utf8")});g.set(aF.wJ,i.sha);let j=[...c.replacePaths.map(a=>{let b=f.files.find(b=>b.path===a);return{path:a,mode:b?.mode??"100644",type:"blob",sha:g.get(a)}}),...c.deletePaths.map(a=>({path:a,mode:"100644",type:"blob",sha:null})),{path:aF.wJ,mode:"100644",type:"blob",sha:i.sha}],k=await a.createGitTree({owner:b.owner,repo:b.repo,baseTree:e,tree:j}),l=(0,a$.ig)({operationId:c.operationId,sourceCommit:f.sourceCommit}),m=await a.createGitCommit({owner:b.owner,repo:b.repo,message:`Update p-dev runner to ${f.packageVersion}`,tree:k.sha,parents:[d],author:l,committer:l}),n=null;try{n=(await a.getGitRef(b.owner,b.repo,c.branchName)).object.sha}catch{n=null}return n?await a.updateGitRef({owner:b.owner,repo:b.repo,ref:c.branchName,sha:m.sha,expectedSha:n}):a.createGitRef?await a.createGitRef({owner:b.owner,repo:b.repo,ref:c.branchName,sha:m.sha}):await a.updateGitRef({owner:b.owner,repo:b.repo,ref:c.branchName,sha:m.sha}),{commitSha:m.sha,headSha:m.sha}}async function dM(a,b,c){let d=await a.getRepositoryDefaultBranchHead(b.owner,b.repo,b.defaultBranch),e=await a.readRepositoryFileContent(b.owner,b.repo,aF.wJ,d);if(!e)return{ok:!1,message:"Production marker is missing after merge."};let f=(0,aF.Dr)(e);if(!f.ok)return{ok:!1,message:f.reason};let g=f.marker.createdFromPackageSnapshot?.snapshotContentId;if(g!==c)return{ok:!1,message:`Production marker snapshotContentId mismatch (expected ${c}, found ${g??"none"}).`};let h=c8(f.marker);if(h){for(let[a,c]of Object.entries(c7(b.packagedSnapshot.manifest)))if(h[a]!==c)return{ok:!1,message:`Production marker file hash mismatch for ${a}.`}}return{ok:!0}}async function dN(a,b){let c=Date.now();for(;Date.now()-c<b.pollTimeoutMs;){let c=await a.getWorkflowRun(b.owner,b.repo,b.runId);if(await b.onHeartbeat?.(),"completed"===c.status){if("success"===c.conclusion)return{ok:!0,run:{htmlUrl:c.htmlUrl}};return{ok:!1,message:`Configuration canary failed with conclusion ${c.conclusion??"unknown"}.`}}await new Promise(a=>setTimeout(a,b.pollIntervalMs))}return{ok:!1,message:"Configuration canary timed out."}}async function dO(a,b,c,d,e){let f=await dD(a),g=await dc(a);e?.commit();let h={...b,localManagedRepoEvidence:f,availableSnapshot:b.availableSnapshot??c,unresolvedStage:b.unresolvedStage??e?.unresolvedStage,retryAvailable:b.retryAvailable??("checking"===b.status||!0===b.degraded),debugTimings:d?e?.snapshot():b.debugTimings};return h.currentSnapshot||!g?h:{...h,currentSnapshot:{snapshotContentId:g.snapshotContentId,packageVersion:g.packageVersion,sourceCommit:g.sourceCommit},currentSnapshotCached:!0,currentSnapshotVerifiedAt:g.verifiedAt}}async function dP(a,b,c={}){let d=c.workspaceKey??a??process.cwd(),{signal:e,controller:f}=c.signal?{signal:c.signal,controller:null}:function(a){let b=dj.get(a);b&&!b.signal.aborted&&b.abort(),dj.delete(a);let c=new AbortController;return dj.set(a,c),{signal:c.signal,controller:c}}(d),g=new df,h=c.overallDeadlineMs??8e3,i=async d=>{g.begin("local_state_reads"),dg(d);let e=await c$(a),i=await dD(a);if(g.end(),e){var j;g.begin("reconciliation_enqueue"),e.lastError||(j=e.operationId,dl.has(j))||du(a),g.end(),g.begin("status_conversion");let b=function(a){if(a.lastError){let b=a.lastStatus??(a.codeUpdateComplete?"partially_updated":"failed");return{status:b,statusLabel:(0,c1.fA)(b),pendingOperationId:a.operationId,pendingPhase:a.phase,blockedReason:a.lastError,conflictPaths:a.conflictPaths,prUrl:a.prUrl,canaryRunUrl:a.canaryRunUrl,retryGuidance:a.codeUpdateComplete?"Resume the runner upgrade to finish cloud sync or canary.":"Retry or Resume the runner upgrade after reviewing the error.",retryAvailable:!0}}return{status:a.codeUpdateComplete?"partially_updated":"updating",statusLabel:(0,c1.fA)(a.codeUpdateComplete?"partially_updated":"updating"),pendingOperationId:a.operationId,pendingPhase:a.phase,prUrl:a.prUrl,canaryRunUrl:a.canaryRunUrl}}(e);return g.end(),dO(a,{...b,localManagedRepoEvidence:i},void 0,c.debugTimings,g)}g.begin("embedded_snapshot_identity"),dg(d);let k=await dC(d);g.end();let l=k?dz(k.manifest):void 0;return dk(h,d,()=>{d.aborted||f?.abort()},async d=>{let e=await dH(a,b,"status",{signal:d,tracker:g,testHangAfterStage:c.testHangAfterStage,debugTimings:c.debugTimings});if(!e.ok)return dO(a,{...e.result,localManagedRepoEvidence:i,retryAvailable:"checking"===e.result.status||!0===e.result.degraded},l,c.debugTimings,g);let{context:f}=e;g.begin("status_conversion"),dg(d);let h=dz(f.marker.createdFromPackageSnapshot?{...f.packagedSnapshot.manifest,snapshotContentId:f.marker.createdFromPackageSnapshot.snapshotContentId,packageVersion:f.marker.createdFromPackageSnapshot.packageVersion,sourceCommit:f.marker.createdFromPackageSnapshot.sourceCommit}:f.packagedSnapshot.manifest),j=new Date().toISOString();return(await dd({...h,verifiedAt:j,repoSlug:f.repoSlug},a),g.end(),h.snapshotContentId===l?.snapshotContentId)?dO(a,{status:"up_to_date",statusLabel:(0,c1.fA)("up_to_date"),currentSnapshot:h,availableSnapshot:l,localManagedRepoEvidence:i,currentSnapshotVerifiedAt:j},l,c.debugTimings,g):dO(a,{status:"update_available",statusLabel:(0,c1.fA)("update_available"),currentSnapshot:h,availableSnapshot:l,localManagedRepoEvidence:i,currentSnapshotVerifiedAt:j},l,c.debugTimings,g)},b=>dO(a,{status:"checking",statusLabel:(0,c1.fA)("checking"),degraded:!0,localManagedRepoEvidence:i,availableSnapshot:l,blockedReason:(void 0)??`runner-upgrade-status overall deadline exceeded after ${h}ms.`,retryGuidance:"Retry status shortly. GitHub did not respond within the page-status deadline.",retryAvailable:!0,unresolvedStage:b},l,c.debugTimings,g),g)};try{return await i(e)}finally{f&&dj.get(d)===f&&dj.delete(d)}}async function dQ(a,b){var c;let d=await dH(a,b);if(!d.ok)return{previewFingerprint:"",targetSnapshotContentId:"",phases:dw,blocked:!0,blockedStatus:d.result.status,message:d.result.blockedReason,impact:{replacePathCount:0,deletePathCount:0,sampleReplacePaths:[],sampleDeletePaths:[]}};let e=await dJ(b,d.context);return e.ok?{previewFingerprint:e.previewFingerprint,targetSnapshotContentId:d.context.packagedSnapshot.manifest.snapshotContentId,currentSnapshotContentId:d.context.marker.createdFromPackageSnapshot?.snapshotContentId,impact:{replacePathCount:(c={replacePaths:e.replacePaths,deletePaths:e.deletePaths}).replacePaths.length,deletePathCount:c.deletePaths.length,sampleReplacePaths:c.replacePaths.slice(0,8),sampleDeletePaths:c.deletePaths.slice(0,8)},phases:dw}:{previewFingerprint:"",targetSnapshotContentId:d.context.packagedSnapshot.manifest.snapshotContentId,currentSnapshotContentId:d.context.marker.createdFromPackageSnapshot?.snapshotContentId,phases:dw,blocked:!0,blockedStatus:e.status,conflictPaths:e.conflictPaths,message:e.message,impact:{replacePathCount:0,deletePathCount:0,sampleReplacePaths:[],sampleDeletePaths:[]}}}async function dR(a,b={}){let c=await c$(a);if(c){let a={...c,previewFingerprint:b.previewFingerprint??c.previewFingerprint};return(b.resume||c.lastError)&&(delete a.lastError,delete a.lastStatus),a}let e=await dB();if(!e)throw Error("Embedded workspace snapshot is unavailable.");let{repoSlug:f}=await dA(a),g=0,h="main";try{let b=await dV(a);if(b){let a=(0,aF.Dr)(b);a.ok&&(g=a.marker.repositoryId??g,h=a.marker.createdFromTemplate?.defaultBranch??h)}}catch{}return{operationId:(0,d.randomUUID)(),repositoryId:g,repoSlug:f,defaultBranch:h,targetSnapshotContentId:e.manifest.snapshotContentId,phase:"verifying-managed-repository",startedAt:new Date().toISOString(),previewFingerprint:b.previewFingerprint??"",syncInProgress:!1,codeUpdateComplete:!1,branchName:(0,c1.Wy)(e.manifest.snapshotContentId)}}async function dS(a,b={}){return cY(a??process.cwd(),async()=>{let c=await dR(a,b);await c_(c,a);let d=await c5({operationId:c.operationId,phase:c.phase,phaseStartedAt:new Date().toISOString(),startedAt:c.startedAt,canaryRunId:c.canaryRunId,canaryRunUrl:c.canaryRunUrl,prUrl:c.prUrl,workerHeartbeatAt:new Date().toISOString(),lastCheckpoint:c.phase},a);return dt(c.operationId,a),{apply:{operationId:c.operationId,status:"updating",phase:c.phase,previewFingerprint:c.previewFingerprint,message:"Runner upgrade accepted and queued."},progress:d}})}async function dT(a,b,c={}){return dU(a,b,c)}async function dU(a,b,c={}){let e=await c$(a),f=e?.startedAt??new Date().toISOString(),g=e?.operationId??(0,d.randomUUID)();e?await dI(a,e,e.phase,{workerHeartbeatAt:new Date().toISOString()}):(e=await dR(a,{previewFingerprint:c.previewFingerprint}),await c_(e,a),await dI(a,e,e.phase,{workerHeartbeatAt:new Date().toISOString(),lastSuccessfulProviderCallAt:void 0}));let h=await dH(a,b,"worker");if(!h.ok)return e.lastError=h.result.blockedReason,e.lastStatus=h.result.status,e.phase="verifying-managed-repository",await c_(e,a),await dI(a,e,e.phase,{retryable:!0,errorCode:"verify_managed_repository_failed"}),{operationId:g,status:h.result.status,phase:"verifying-managed-repository",previewFingerprint:e.previewFingerprint,message:h.result.blockedReason};let i=h.context;if(i.marker.createdFromPackageSnapshot&&await dd({snapshotContentId:i.marker.createdFromPackageSnapshot.snapshotContentId,packageVersion:i.marker.createdFromPackageSnapshot.packageVersion,sourceCommit:i.marker.createdFromPackageSnapshot.sourceCommit,verifiedAt:new Date().toISOString(),repoSlug:i.repoSlug},a),e.repositoryId=i.repositoryId,e.repoSlug=i.repoSlug,e.defaultBranch=i.defaultBranch,e.targetSnapshotContentId=i.packagedSnapshot.manifest.snapshotContentId,await c_(e,a),await dI(a,e,e.phase,{lastSuccessfulProviderCallAt:new Date().toISOString(),workerHeartbeatAt:new Date().toISOString()}),i.marker.createdFromPackageSnapshot?.snapshotContentId===i.packagedSnapshot.manifest.snapshotContentId&&!e.codeUpdateComplete)return await c0(a),{operationId:g,status:"up_to_date",phase:"verifying-managed-repository",previewFingerprint:e.previewFingerprint,message:"Runner is already up to date."};let j=null;if(!e.codeUpdateComplete){if(e.phase="comparing-runner-snapshots",await c_(e,a),await dI(a,e,e.phase,{workerHeartbeatAt:new Date().toISOString()}),!(j=await dJ(b,i,{onHeartbeat:async b=>{await dI(a,e,e.phase,{workerHeartbeatAt:new Date().toISOString(),lastSuccessfulProviderCallAt:new Date().toISOString(),filesInspected:b.filesInspected,filesTotal:b.filesTotal,lastCompletedBatch:b.lastCompletedBatch,lastCheckpoint:"comparing-runner-snapshots"})}})).ok)return e.phase="comparing-runner-snapshots",e.conflictPaths=j.conflictPaths,e.lastError=j.message,e.syncInProgress=!1,await c_(e,a),await dI(a,e,e.phase,{retryable:!0,errorCode:j.status}),{operationId:g,status:j.status,phase:"comparing-runner-snapshots",previewFingerprint:e.previewFingerprint,message:j.message};if(c.previewFingerprint&&c.previewFingerprint!==j.previewFingerprint)return e.lastError="Preview fingerprint mismatch; re-run preview before applying.",await c_(e,a),await dI(a,e,e.phase,{retryable:!0,errorCode:"preview_fingerprint_mismatch"}),{operationId:g,status:"failed",phase:"comparing-runner-snapshots",previewFingerprint:j.previewFingerprint,message:e.lastError}}let k=e.previewFingerprint||j?.previewFingerprint||"";e.previewFingerprint=k;let l=e.branchName??(0,c1.Wy)(i.packagedSnapshot.manifest.snapshotContentId);e.branchName=l;let m=i.packagedSnapshot.manifest.snapshotContentId;if(await c_(e,a),await dI(a,e,e.phase,{lastSuccessfulProviderCallAt:new Date().toISOString(),workerHeartbeatAt:new Date().toISOString()}),!e.codeUpdateComplete){e.phase="preparing-upgrade-commit",await c_(e,a),await dI(a,e,e.phase,{workerHeartbeatAt:new Date().toISOString()});let c=await dL(b,i,{operationId:g,branchName:l,replacePaths:j.replacePaths,deletePaths:j.deletePaths});await dI(a,e,e.phase,{lastSuccessfulProviderCallAt:new Date().toISOString(),workerHeartbeatAt:new Date().toISOString()}),e.phase="updating-managed-runner",await c_(e,a),await dI(a,e,e.phase);let d=await dK(b,{owner:i.owner,repo:i.repo,repositoryId:i.repositoryId,snapshotContentId:m,defaultBranch:i.defaultBranch,branchName:l});if(!d){let a=await b.createPullRequest({owner:i.owner,repo:i.repo,title:`Update p-dev runner to ${i.packagedSnapshot.packageVersion}`,head:l,base:i.defaultBranch,body:[(0,c1.dH)(i.repositoryId,m),"",`Updates the managed p-dev runner workspace to package ${i.packagedSnapshot.packageVersion}.`].join("\n")});d={number:a.number,htmlUrl:a.htmlUrl,headSha:c.headSha}}e.prUrl=d.htmlUrl,e.prNumber=d.number,await c_(e,a),await dI(a,e,e.phase);let f=(await b.getGitRef(i.owner,i.repo,l)).object.sha;await b.mergePullRequest(i.owner,i.repo,d.number,{mergeMethod:"squash",commitTitle:`Update p-dev runner to ${i.packagedSnapshot.packageVersion}`,expectedHeadSha:f}),e.phase="verifying-runner-on-production-branch",await c_(e,a),await dI(a,e,e.phase);let h=await dM(b,i,m);if(!h.ok)return e.lastError=h.message,e.phase="verifying-runner-on-production-branch",await c_(e,a),await dI(a,e,e.phase),{operationId:g,status:"failed",phase:e.phase,previewFingerprint:k,prUrl:e.prUrl,prNumber:e.prNumber,branchName:l,message:h.message};e.codeUpdateComplete=!0,e.phase="synchronizing-cloud-configuration",await c_(e,a),await dI(a,e,e.phase)}e.syncInProgress=!0,e.phase="synchronizing-cloud-configuration",await c_(e,a),await dI(a,e,e.phase);try{let c=await (0,cU.J)({cwd:a,provider:{checkHarnessRepoAccess:async()=>"available",listHarnessSecretStatuses:async()=>[],checkTargetWorkflowStatus:async()=>({repoAccess:"available",workflowStatus:"unknown"}),writeHarnessSecrets:async(a,c)=>{if(!b.writeHarnessSecrets)throw Error("Provider does not support writeHarnessSecrets.");return b.writeHarnessSecrets(a,c)},writeHarnessVariables:async(a,c)=>{if(!b.writeHarnessVariables)throw Error("Provider does not support writeHarnessVariables.");return b.writeHarnessVariables(a,c)},applyTargetWorkflowPr:async()=>{throw Error("Target workflow apply is not supported in runner upgrade.")}},harnessRepository:i.repoSlug});e.expectedFingerprint=c.fingerprint}catch(b){return e.lastError=b instanceof Error?b.message:"Cloud configuration sync failed.",e.syncInProgress=!1,e.phase="synchronizing-cloud-configuration",await c_(e,a),await dI(a,e,e.phase),{operationId:g,status:"partially_updated",phase:e.phase,previewFingerprint:k,prUrl:e.prUrl,prNumber:e.prNumber,branchName:l,message:e.lastError}}e.phase="running-configuration-canary",await c_(e,a),await dI(a,e,e.phase);let n=(0,d.randomUUID)();await b.dispatchWorkflow(i.owner,i.repo,c1.nE,i.defaultBranch,{canary_operation_id:n});let o=await da(b,{owner:i.owner,repo:i.repo,operationId:n,ref:i.defaultBranch,pollIntervalMs:c.canaryPollIntervalMs??2e3,pollTimeoutMs:Math.min(c.canaryPollTimeoutMs??12e4,6e4)});if(!o)return e.lastError=`Could not locate canary workflow run for operation id ${n} after workflow_dispatch (204).`,e.syncInProgress=!1,await c_(e,a),await dI(a,e,e.phase),{operationId:g,status:"partially_updated",phase:e.phase,previewFingerprint:k,prUrl:e.prUrl,prNumber:e.prNumber,branchName:l,message:e.lastError};e.canaryRunId=String(o.id);let p=await dN(b,{owner:i.owner,repo:i.repo,runId:o.id,pollIntervalMs:c.canaryPollIntervalMs??2e3,pollTimeoutMs:c.canaryPollTimeoutMs??12e4,onHeartbeat:async()=>{await dI(a,e,e.phase,{lastSuccessfulProviderCallAt:new Date().toISOString(),workerHeartbeatAt:new Date().toISOString(),lastCheckpoint:"running-configuration-canary"})}});return p.ok?(e.canaryRunUrl=p.run.htmlUrl,await cW({appliedSnapshotContentId:m,appliedAt:new Date().toISOString(),targetSnapshotContentId:m,repositoryId:i.repositoryId,lastOperationId:g,syncInProgress:!1,status:"up_to_date",canaryRunUrl:e.canaryRunUrl},a),await c0(a),await c5({operationId:g,phase:"running-configuration-canary",phaseStartedAt:new Date().toISOString(),startedAt:f,canaryRunUrl:e.canaryRunUrl,prUrl:e.prUrl,recoveryInstruction:"Runner upgrade completed successfully."},a),{operationId:g,status:"up_to_date",phase:"running-configuration-canary",previewFingerprint:k,prUrl:e.prUrl,prNumber:e.prNumber,branchName:l,canaryRunId:e.canaryRunId,canaryRunUrl:e.canaryRunUrl,message:"Runner upgrade completed successfully."}):(e.canaryRunUrl=o.htmlUrl??`https://github.com/${i.owner}/${i.repo}/actions/runs/${o.id}`,e.lastError=p.message,e.syncInProgress=!1,await c_(e,a),await dI(a,e,e.phase),{operationId:g,status:"partially_updated",phase:e.phase,previewFingerprint:k,prUrl:e.prUrl,prNumber:e.prNumber,branchName:l,canaryRunId:e.canaryRunId,canaryRunUrl:e.canaryRunUrl,message:e.lastError})}async function dV(a){let b=process.env.CANARY_MARKER_PATH??ag().join(a??process.cwd(),aF.wJ);try{return await (0,f.readFile)(b,"utf8")}catch{return null}}async function dW(a,b){return{state:await (0,cV.oQ)(a),linearTeamKeyFromConfig:b?.configSummary?.linearTeamKey}}var dX=c(96105),dY=c(71740),dZ=c(47183);function d$(a){let b=(0,k.ym)(a);return ag().join(b.harnessDir,"p-dev-linear-setup.progress.json")}async function d_(a,b){let c=Date.parse(a.startedAt),d={actionId:a.actionId,phase:a.phase,phaseStartedAt:new Date().toISOString(),startedAt:a.startedAt,elapsedMs:Number.isFinite(c)?Math.max(0,Date.now()-c):0,completed:a.completed??!1,updatedAt:new Date().toISOString()},e=d$(b);await (0,f.mkdir)(ag().dirname(e),{recursive:!0});let g=`${e}.${process.pid}.${Date.now()}.tmp`;return await (0,f.writeFile)(g,`${JSON.stringify(d,null,2)}
|
|
47
|
+
`,"utf8"),await (0,f.rename)(g,e),d}async function d0(a){try{let b=await (0,f.readFile)(d$(a),"utf8"),c=JSON.parse(b);if("string"!=typeof c.actionId||"string"!=typeof c.phase)return null;return c}catch{return null}}async function d1(a){let b=await d0(a);return{actionId:b?.actionId??null,phase:b?.phase??null,uiPhaseLabel:b?.phase?function(a){switch(a){case"validate":return"Validating Linear plan";case"team":return"Creating or selecting team";case"project":return"Creating or selecting project";case"statuses":return"Configuring workflow statuses";case"verify":return"Verifying Linear workspace"}}(b.phase):null,phaseStartedAt:b?.phaseStartedAt??null,startedAt:b?.startedAt??null,elapsedMs:b?.elapsedMs??null,completed:b?.completed??!1}}var d2=c(68615);async function d3(a){let b=(0,k.ym)(a.cwd);try{await (0,f.access)(b.configLocal)}catch{return!1}let d=await (0,f.readFile)(b.configLocal,"utf8"),e=dX.k.parse(JSON.parse(d)),g=a.targetRepo??e.repos[0]?.targetRepo,h=a.repoConfigId??e.repos.find(a=>a.targetRepo===g)?.id??e.repos[0]?.id;if(!g||!h)return!1;let i=a.workspaceId?.trim()||e.linear?.workspaceId?.trim()||"unknown-workspace",{buildRequestedHarnessConfig:j}=await Promise.resolve().then(c.bind(c,11288)),l=j({current:e,workspaceId:i,requestedAssociations:[{workspaceId:i,teamId:a.teamId,teamKey:a.teamKey,teamName:a.teamName,projectId:a.projectId,projectName:a.projectName,targetRepo:g,repoConfigId:h}]}),{writeConfigLocal:m}=await Promise.resolve().then(c.bind(c,19965));return await m({paths:b,content:`${JSON.stringify(l,null,2)}
|
|
48
|
+
`,force:!0}),!0}async function d4(a){let{client:b,teamId:c,created:d,skipped:e}=a,f=async()=>{let a=await (0,dY.vy)(b,c);for(let f of(0,dZ.lS)(a)){if("create"!==f.action){f.present&&e.push(`status:${f.name}`);continue}let a=(0,G.YP)(f.name);if(a)try{await (0,dY.Iy)(b,{teamId:c,name:f.name,type:a.category}),d.push(`status:${f.name}`)}catch(a){if(!(0,dY.YC)(a)||!(await (0,dY.vy)(b,c)).find(a=>(0,dZ.kG)(a.name)===(0,dZ.kG)(f.name)))throw a;e.push(`status:${f.name}`)}}};await f();let g=await (0,dY.vy)(b,c);return(0,dZ.v8)((0,dZ.lS)(g))}async function d5(a){let b,c,d=new Date().toISOString(),e=(b,c=!1)=>d_({actionId:dZ.IW.apply.id,phase:b,startedAt:d,completed:c},a.cwd);(0,F.L6)(a.confirmed),(0,F.xp)(dZ.IW.apply.permission.scope,g.P.linearWrite.scope),await e("validate");let f=await (0,dZ.PA)(a.plan);if((0,F.Me)(a.fingerprint,f.fingerprint),f.validationError)throw Error(f.validationError);let h=(0,dY.os)(a.plan.linearApiKey),i=[],j=[],k=[];if(await e("team"),"create"===a.plan.team.mode){if(!a.plan.team.teamName||!a.plan.team.teamKey)throw Error("New Linear team requires name and key.");let c=await (0,dY.uB)(h),d=(0,dZ.nm)(c,{teamKey:a.plan.team.teamKey,teamName:a.plan.team.teamName});d?(b=d,j.push(`team:${b.key}`)):(b=await (0,dY.Db)(h,{name:a.plan.team.teamName,key:a.plan.team.teamKey}),i.push(`team:${b.key}`))}else{let a=f.selectedTeam;if(!a)throw Error("Selected Linear team is required for apply.");b=a,j.push(`team:${b.key}`)}if(await e("project"),"create"===a.plan.project.mode){if(!a.plan.project.projectName)throw Error("New Linear project requires a name.");let d=await (0,dY.gg)(h),e=(0,dZ.jn)(d,{projectName:a.plan.project.projectName,teamId:b.id});if(e)c=e,j.push(`project:${c.name}`);else{let d=a.plan.project.targetRepo?(0,dZ.TO)({baseDescription:a.plan.project.description,targetRepo:a.plan.project.targetRepo}):a.plan.project.description;c=await (0,dY.D3)(h,{name:a.plan.project.projectName,teamIds:[b.id],description:d}),i.push(`project:${c.name}`)}}else{let a=f.selectedProject;if(!a)throw Error("Selected Linear project is required for apply.");c=a,j.push(`project:${c.name}`)}await e("statuses");let l=await d4({client:h,teamId:b.id,created:i,skipped:j}),m=f.workflowStates.filter(a=>"repair"===a.action);if(m.length>0){let a=await (0,d2.TO)({client:h,teamId:b.id,entries:m});k.push(...a);let c=await (0,dY.vy)(h,b.id);l=(0,dZ.v8)((0,dZ.lS)(c))}await e("verify");let n={teamMode:a.plan.team.mode,teamId:b.id,teamKey:b.key,teamName:b.name,projectMode:a.plan.project.mode,projectId:c.id,projectName:c.name,statusCoverageComplete:l,appliedFingerprint:f.fingerprint,appliedAt:new Date().toISOString()};await (0,cV.xj)({linear:n},a.cwd);let o=await d3({cwd:a.cwd,teamId:b.id,teamKey:b.key,teamName:b.name,projectId:c.id,projectName:c.name});return await e("verify",!0),{actionId:dZ.IW.apply.id,team:b,project:c,created:i,skipped:j,repaired:k,statusCoverageComplete:l,verified:!!(b.id&&c.id&&l),fingerprint:f.fingerprint,permission:dZ.IW.apply.permission,configUpdated:o}}async function d6(a){let b=(0,k.ym)(a),c=await (0,h.Hn)(b),d=await (0,cV.oQ)(a);return{capabilities:(0,dY.P1)(),controlPlane:d,workspace:function(a){let b=a.state?.linearWorkspace,c=a.state?.linear,d=b?.teams.length??+!!c?.teamKey,e=b?.teams.reduce((a,b)=>a+b.projects.length,0)??+!!c?.projectName;return{configured:!!(d>0&&e>0),teamKey:b?.teams[0]?.teamKey??c?.teamKey,projectName:b?.teams[0]?.projects[0]?.projectName??c?.projectName,teamCount:d,projectCount:e,statusCoverageComplete:!!(b?.teams.every(a=>"healthy"===a.health)||c?.statusCoverageComplete||c?.manualComplete),requiredStatusCount:(0,G.GN)().length}}({state:d}),dispatchTriggerStatuses:(0,G.Ht)(),linearApiKeyConfigured:!!c?.presence.LINEAR_API_KEY}}var d7=c(39676),d8=c(44341),d9=c(99895),ea=c(11288);async function eb(a){let b=(0,k.ym)(a);try{await (0,f.access)(b.configLocal);let a=await (0,f.readFile)(b.configLocal,"utf8");return dX.k.parse(JSON.parse(a))}catch{return null}}async function ec(a){let b=(0,k.ym)(a.cwd),{writeConfigLocal:d}=await Promise.resolve().then(c.bind(c,19965));await d({paths:b,content:`${JSON.stringify(a.config,null,2)}
|
|
49
|
+
`,force:!0})}async function ed(a){let b=await (0,dY.x$)(a.client,a.projectId);if(!b)throw Error(`Linear project ${a.projectId} was not found during metadata repair.`);let c=(0,d8.Wt)(b.description,{targetRepo:a.targetRepo.replace(/^https:\/\/github\.com\//,""),productInitialization:"uninitialized"});await (0,dY.ym)(a.client,a.projectId,c)}async function ee(a){let b=await (0,dY.x$)(a.client,a.projectId);if(!b)return;let c=(0,d8.YZ)(b.description);await (0,dY.ym)(a.client,a.projectId,c)}async function ef(a){let{client:b,operation:c,created:d,skipped:e,repaired:f}=a;switch(c.type){case"add_team":e.push(`team:${c.teamKey}`);return;case"repair_team_statuses":{let a=await d4({client:b,teamId:c.teamId,created:d,skipped:e}),g=await (0,dY.vy)(b,c.teamId),h=(0,dZ.lS)(g).filter(a=>"repair"===a.action);if(h.length>0&&f.push(...await (0,d2.TO)({client:b,teamId:c.teamId,entries:h})),!a&&0===h.length)throw Error(`Required workflow statuses are incomplete for team ${c.teamKey}.`);return}case"add_project_association":e.push(`association:${c.teamId}/${c.projectId}`);return;case"repair_project_metadata":await ed({client:b,projectId:c.projectId,targetRepo:c.targetRepo}),f.push(`metadata:${c.projectId}`);return;case"detach_project_association":e.push(`detach:${c.teamId}/${c.projectId}`);return;case"detach_team":e.push(`detach-team:${c.teamKey}`);return;case"remove_project_metadata_block":await ee({client:b,projectId:c.projectId}),f.push(`metadata-removed:${c.projectId}`);return;default:return}}async function eg(a){(0,F.L6)(a.confirmed),(0,F.xp)(ea.C.apply.permission.scope,g.P.linearWrite.scope);let b=await (0,ea.b)(a.plan);if(b.validationError)throw Error(b.validationError);a.fingerprint&&(0,F.Me)(a.fingerprint,b.fingerprint);let c=await eb(a.cwd);if(!c)throw Error("Harness config is required before applying Linear workspace changes.");let d=(0,d7.Uv)(c),e=(0,d9.z3)(c),f=[],h=[],i=[],j=(0,dY.os)(a.plan.linearApiKey),k=[];try{for(let a of b.operations)await ef({client:j,operation:a,created:f,skipped:h,repaired:i}),k.push(a)}catch(c){return{actionId:ea.C.apply.id,verified:!1,fingerprint:b.fingerprint,committedFingerprint:e,operationsCompleted:k,failedOperation:b.operations[k.length]?{operation:b.operations[k.length],reason:c instanceof Error?c.message:String(c)}:void 0,evidence:(await (0,cV.oQ)(a.cwd))?.linearWorkspace??(0,d7.ay)({workspaceId:a.plan.workspaceId,workspaceName:a.plan.workspaceName,associations:d}),configUpdated:!1,permission:ea.C.apply.permission}}let l=(0,ea.buildRequestedHarnessConfig)({current:c,requestedAssociations:a.plan.requestedAssociations,workspaceId:a.plan.workspaceId});await ec({cwd:a.cwd,config:l});let m=(0,d7.Uv)(l),n=(0,d7.ay)({workspaceId:a.plan.workspaceId,workspaceName:a.plan.workspaceName,associations:m,appliedFingerprint:b.fingerprint,appliedAt:new Date().toISOString()});n.teams=n.teams.map(a=>{let b=m.filter(b=>b.teamId===a.teamId).length>0;return{...a,health:b?"healthy":"needs_repair",lastVerifiedAt:new Date().toISOString(),projects:a.projects.map(a=>({...a,health:"healthy",lastVerifiedAt:new Date().toISOString()}))}});let o=await (0,cV.oQ)(a.cwd)??{version:1};return await (0,cV.PY)({...o,version:1,linearWorkspace:n},a.cwd),{actionId:ea.C.apply.id,verified:!0,fingerprint:b.fingerprint,committedFingerprint:e,operationsCompleted:k,evidence:n,configUpdated:!0,permission:ea.C.apply.permission}}function eh(){return(0,d.randomBytes)(32).toString("hex")}function ei(a){return a.trim().replace(/\/$/,"")}function ej(a){let b=ei(a.webhookUrl);return a.webhooks.find(c=>{let d=ei(c.url);return(!a.linearTeamId||c.teamId===a.linearTeamId)&&d===b&&c.enabled&&c.resourceTypes.includes("Issue")})}async function ek(a){let b=a.operatorSecret?.trim();if(b)return{secret:b,source:"operator",manualSteps:[]};if(!a.linearApiKey?.trim())return{source:"generated",manualSteps:["Add LINEAR_API_KEY in Step 1 before automated Linear webhook setup can run.","A webhook signing secret will be generated during apply and shown once if manual copy is required."]};let c=(0,dY.os)(a.linearApiKey),d=ej({webhooks:await (0,dY.af)(c),webhookUrl:a.webhookUrl,linearTeamId:a.linearTeamId});if(d){let a=d.secret?.trim();return a?{secret:a,source:"reused-readable",matchingWebhook:{...d,secret:void 0},manualSteps:["A matching Linear Issue webhook exists. Apply will reuse its known signing secret for verification."]}:{source:"unreadable",matchingWebhook:{...d,secret:void 0},manualSteps:["A matching Linear Issue webhook exists, but its signing secret cannot be read from the Linear API.","Update the Linear webhook signing secret manually to match Vercel LINEAR_WEBHOOK_SECRET, then retry verification.","Apply will not rotate the webhook repeatedly while the secret remains unreadable."]}}return{secret:eh(),source:"generated",manualSteps:["Apply will create a Linear Issue webhook and write the signing secret to Vercel."]}}async function el(a){if(!a.linearApiKey?.trim())return{mode:"manual-copy",manualSteps:["Add LINEAR_API_KEY in Step 1 before automated Linear webhook setup can run.","A webhook signing secret will be generated during apply and shown once if manual copy is required."]};let b=await (0,dZ.Ce)({linearApiKey:a.linearApiKey,webhookUrl:a.webhookUrl,teamId:a.linearTeamId});return b.matchingWebhook?b.matchingWebhook.secret?.trim()?{mode:"automated",matchingWebhook:b.matchingWebhook,willGenerateOnApply:!1,manualSteps:["A matching Linear Issue webhook already exists. Apply will reuse its known signing secret for verification."]}:{mode:"existing-unverified",matchingWebhook:b.matchingWebhook,willGenerateOnApply:!0,manualSteps:["A matching Linear Issue webhook already exists, but its signing secret cannot be recovered.","Apply will attempt to rotate the existing webhook secret automatically once. If that fails, copy the generated secret into Linear manually."]}:{mode:"automated",willGenerateOnApply:!0,manualSteps:["Apply will create a Linear Issue webhook and write the signing secret to Vercel."]}}async function em(a){let b=ei(a.previousWebhookUrl),c=ei(a.canonicalWebhookUrl);if(!b||!c||b===c)return{attempted:!1,reconciled:!1,canonicalWebhookExists:!1,matchingPreviousWebhookFound:!1,manualSteps:[]};let d=(0,dY.os)(a.linearApiKey),e=await (0,dY.af)(d),f=ej({webhooks:e,webhookUrl:b,linearTeamId:a.linearTeamId}),g=ej({webhooks:e,webhookUrl:c,linearTeamId:a.linearTeamId});if(!f)return{attempted:!0,reconciled:!1,previousWebhookUrl:b,canonicalWebhookExists:!!g,matchingPreviousWebhookFound:!1,manualSteps:["No matching Linear Issue webhook was found at the previously stored webhook URL.","Create or update the Linear webhook manually to point at the canonical production URL, then retry verification."]};if(g)return g.id===f.id?{attempted:!0,reconciled:!0,previousWebhookId:f.id,previousWebhookUrl:b,canonicalWebhookExists:!0,matchingPreviousWebhookFound:!0,manualSteps:[]}:{attempted:!0,reconciled:!1,previousWebhookId:f.id,previousWebhookUrl:b,canonicalWebhookExists:!0,matchingPreviousWebhookFound:!0,manualSteps:["A separate Linear Issue webhook already exists at the canonical production URL.","Consolidate webhook configuration manually before retrying verification."]};try{return await (0,dY.lK)(d,{webhookId:f.id,url:c,secret:a.secret.trim()}),{attempted:!0,reconciled:!0,previousWebhookId:f.id,previousWebhookUrl:b,canonicalWebhookExists:!1,matchingPreviousWebhookFound:!0,manualSteps:[]}}catch{return{attempted:!0,reconciled:!1,previousWebhookId:f.id,previousWebhookUrl:b,canonicalWebhookExists:!1,matchingPreviousWebhookFound:!0,manualSteps:["Could not update the existing Linear Issue webhook to the canonical production URL automatically.","Update the Linear webhook URL manually to match the canonical production URL, then retry verification."]}}}async function en(a){let b=a.mutatePolicy??"setup",c=(0,dY.os)(a.linearApiKey),d=ej({webhooks:await (0,dY.af)(c),webhookUrl:a.webhookUrl,linearTeamId:a.linearTeamId});if(d){let e=d.secret?.trim();if(e===a.secret.trim())return{webhook:{...d,secret:void 0},secret:a.secret,mode:"automated",manualSteps:[]};if("verify-only"===b)return e?{webhook:{...d,secret:void 0},secret:e,mode:"automated",manualSteps:[]}:{webhook:{...d,secret:void 0},secret:a.secret,mode:"existing-unverified",manualSteps:["Matching Linear webhook exists, but its signing secret cannot be read from the Linear API.","Update the Linear webhook signing secret manually to match Vercel LINEAR_WEBHOOK_SECRET, then retry verification."]};try{return{webhook:{...await (0,dY.lK)(c,{webhookId:d.id,url:a.webhookUrl,secret:a.secret}),secret:void 0},secret:a.secret,mode:"automated",manualSteps:[]}}catch{return{webhook:{...d,secret:void 0},secret:a.secret,mode:"existing-unverified",manualSteps:["Matching Linear webhook exists, but its signing secret could not be rotated automatically.","Copy the generated webhook secret into the Linear webhook signing secret field, then retry verification."]}}}if("verify-only"===b||"verify-reconcile-url"===b)return{secret:a.secret,mode:"manual-copy",manualSteps:[`Create a Linear Issue webhook pointing at ${a.webhookUrl}.`,"Retry verification after the webhook exists and its signing secret matches Vercel."]};try{let b=await (0,dY.e0)(c,{url:a.webhookUrl,teamId:a.linearTeamId,label:"Harness webhook bridge",secret:a.secret});if(b.secret)return{webhook:{...b,secret:void 0},secret:b.secret,mode:"automated",manualSteps:[]};return{webhook:{...b,secret:void 0},secret:a.secret,mode:"manual-copy",manualSteps:["Linear webhook was created, but the signing secret was not returned by the API.","Copy the generated secret into the Linear webhook signing secret field."]}}catch{return{secret:a.secret,mode:"manual-copy",manualSteps:[`Create a Linear Issue webhook pointing at ${a.webhookUrl}.`,"Copy the generated webhook secret into Linear and confirm when complete."]}}}var eo=c(74590),ep=c(35244);async function eq(a){var b;let c=a.nowMs??Date.now(),e=function(a){try{let b=new URL(a);return{webhookHost:b.host,webhookPath:b.pathname}}catch{return{}}}(a.webhookUrl),f=JSON.stringify({action:"create",type:"Comment",webhookTimestamp:c,data:{id:"harness-setup-probe"}}),g=(b=a.secret,(0,d.createHmac)("sha256",b).update(f).digest("hex")),h=a.fetchImpl??fetch;try{let b=await h(a.webhookUrl,{method:"POST",headers:{"Content-Type":"application/json","linear-signature":g,"linear-timestamp":String(c),"linear-event":"Comment","linear-delivery":`harness-setup-probe-${c}`},body:f,redirect:"manual"});if(function(a){if(302!==a.status&&307!==a.status&&308!==a.status)return!1;let b=a.headers.get("location")??"";return/vercel\.com\/sso-api/i.test(b)}(b))return{passed:!1,statusCode:b.status,result:"protection_redirect",reason:"Vercel Deployment Protection redirected the webhook endpoint. Disable protection for /api/linear-webhook or allow public access before verifying the bridge.",probedAt:new Date(c).toISOString(),...e};let d=null;try{d=await b.json()}catch{return{passed:!1,statusCode:b.status,result:"error",reason:"Webhook endpoint did not return JSON.",probedAt:new Date(c).toISOString(),...e}}if(401===b.status)return{passed:!1,statusCode:b.status,result:"auth_failed",reason:d.error??"invalid_signature",probedAt:new Date(c).toISOString(),...e};if(404===b.status)return{passed:!1,statusCode:b.status,result:"unreachable",reason:"Webhook route was not found on the production deployment.",probedAt:new Date(c).toISOString(),...e};if(200===b.status&&!1===d.accepted&&"string"==typeof d.reason)return{passed:!0,statusCode:b.status,result:"accepted_ignored",reason:d.reason,probedAt:new Date(c).toISOString(),...e};return{passed:!1,statusCode:b.status,result:"error",reason:"Signed probe was not authentication-accepted and business-ignored.",probedAt:new Date(c).toISOString(),...e}}catch{return{passed:!1,result:"unreachable",reason:"Webhook endpoint could not be reached for signed probe verification.",probedAt:new Date(c).toISOString(),...e}}}function er(a){return!a.passed&&"auth_failed"===a.result&&"invalid_signature"===a.reason}async function es(a){let b=a.listDeployments??eo.bM,c=(await b(a.vercelToken,a.projectId,a.teamId,{state:"READY",limit:5})).find(a=>(0,eo.oN)(a));return c?.id}async function et(a){let b=a.listDeployments??eo.bM,c=a.triggerRedeploy??eo.b1,d=a.sourceDeploymentId?.trim()??await es({vercelToken:a.vercelToken,projectId:a.projectId,teamId:a.teamId,listDeployments:b});if(!d)return{status:"no_source_deployment",message:"No READY production deployment was found to redeploy. Deploy the project in Vercel before applying settings."};try{let b=await c(a.vercelToken,{projectName:a.projectName,sourceDeploymentId:d,teamId:a.teamId});return{status:"triggered",sourceDeploymentId:d,newDeploymentId:b.id,state:b.state,readyState:b.readyState,message:"Production redeploy triggered. Waiting for Vercel deployment READY."}}catch(a){return{status:"failed",sourceDeploymentId:d,message:a instanceof Error?a.message:"Vercel production redeploy request failed."}}}async function eu(a){let b=a.getDeployment??eo.V9,c=await b(a.vercelToken,a.newDeploymentId,a.teamId);return(0,eo.oN)(c)?{status:"ready",sourceDeploymentId:a.sourceDeploymentId,newDeploymentId:a.newDeploymentId,state:c.state,readyState:c.readyState,message:"Production redeploy completed and deployment is READY."}:!function(a){let b=a.readyState??a.state;return"ERROR"===b||"CANCELED"===b}(c)?Date.now()>Date.parse(a.deadlineAt)?{status:"timeout",sourceDeploymentId:a.sourceDeploymentId,newDeploymentId:a.newDeploymentId,state:c.state,readyState:c.readyState,message:"Production redeploy did not reach READY before the timeout. Retry verification after Vercel finishes building."}:{status:"building",sourceDeploymentId:a.sourceDeploymentId,newDeploymentId:a.newDeploymentId,state:c.state,readyState:c.readyState,message:"Waiting for Vercel deployment READY…"}:{status:"failed",sourceDeploymentId:a.sourceDeploymentId,newDeploymentId:a.newDeploymentId,state:c.state,readyState:c.readyState,message:`Production redeploy failed with state ${c.readyState??c.state}.`}}let ev="LINEAR_WEBHOOK_SECRET";async function ew(a){let b=a.secret.trim();if(!b)return!1;let c=(0,k.ym)(a.cwd),d=await (0,h.ed)(c);if((d?(0,h.Um)(d).values[ev]?.trim():void 0)&&!0!==a.overwriteExisting)return!1;let e=function(a,b){if(null===a)return`# Operator local setup — harness Step 3 generated secret
|
|
50
|
+
# Do not commit .env.local (gitignored).
|
|
51
|
+
|
|
52
|
+
${ev}=${b}
|
|
53
|
+
`;let c=a.split("\n"),d=[],e=!1;for(let a of c){let c=a.trim();if(!c||c.startsWith("#")){d.push(a);continue}let f=c.indexOf("=");if(-1===f){d.push(a);continue}if(c.slice(0,f).trim()===ev){e=!0,d.push(`${ev}=${b}`);continue}d.push(a)}e||(d.length>0&&""!==d[d.length-1]&&d.push(""),d.push("# --- Harness Step 3 generated secret ---"),d.push(`${ev}=${b}`));let f=d.join("\n");return a.endsWith("\n")&&!f.endsWith("\n")&&(f+="\n"),f}(d,b);return await (0,f.writeFile)(c.envLocal,e,"utf8"),!0}var ex=c(70521);async function ey(a){let b=a.githubToken?.trim();if(!b)return{eligible:!1,source:"manual-required",message:"Add GITHUB_TOKEN in Step 1 with Contents write access to the harness dispatch repository."};let c=a.harnessProvisioningSummary?.runtimeMode==="packaged"||(0,aw.Ot)(),d=a.verifiedDispatchRepo?.trim()||(a.harnessProvisioningSummary?.verifiedSavedRepo?a.harnessProvisioningSummary.harnessDispatchRepo?.trim():void 0);if(c&&!0===a.requireVerifiedPackagedDispatchRepo&&!d)return{eligible:!1,source:"manual-required",message:"Complete Step 1 to connect a verified harness workspace before configuring the PDev automation bridge."};let e=await (0,E.z8)({cwd:a.cwd,verifiedProvisioningRepo:d});if(!e.resolved||!e.repo)return{eligible:!1,source:"manual-required",message:e.detail??"Could not resolve the harness dispatch repository. Set GITHUB_DISPATCH_REPOSITORY in Step 1."};let[f,g]=e.repo.split("/");if(!f||!g)return{eligible:!1,source:"manual-required",repository:e.repo,message:"Harness dispatch repository slug is invalid."};try{await (0,ex._u)(b);let a=new ax.jh({token:b}),c=await a.getRepository(f,g);if(c.permissions?.push!==!0&&c.permissions?.admin!==!0&&c.permissions?.maintain!==!0)return{eligible:!1,source:"manual-required",repository:e.repo,message:`Saved GITHUB_TOKEN cannot write repository contents for ${e.repo}. repository_dispatch requires Contents write access.`};return{eligible:!0,source:"saved-github-token",repository:e.repo,message:`Saved GITHUB_TOKEN can dispatch to ${e.repo}.`}}catch(b){let a=b instanceof ax.OS?`GitHub rejected dispatch token eligibility check (${b.status}).`:b instanceof Error?b.message:"GitHub dispatch token eligibility check failed.";return{eligible:!1,source:"manual-required",repository:e.repo,message:a}}}function ez(a){let b=a?.trim()??"";return b.length<1||b.length>100?{valid:!1,normalized:b,error:"Vercel project name must be 1-100 characters."}:b!==b.toLowerCase()?{valid:!1,normalized:b,error:"Vercel project name must be lowercase."}:/^[a-z0-9._-]+$/.test(b)?{valid:!0,normalized:b}:{valid:!1,normalized:b,error:"Vercel project name may only contain lowercase letters, numbers, dots, underscores, and hyphens."}}let eA={preview:{id:"preview-vercel-bridge",permission:g.P.remoteRead},apply:{id:"apply-vercel-bridge",permission:g.P.remoteSecretWrite}};function eB(a){return(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex").slice(0,16)}function eC(a){return{actionId:eA.preview.id,teamId:a.teamId,teamMode:a.teamMode,teamSlug:a.teamSlug,projectId:a.projectId,projectMode:a.projectMode,projectName:a.projectName,envWritePlan:a.envWritePlan.map(a=>({key:a.key,action:a.action,source:a.source,existingType:a.existingType,desiredType:a.desiredType})),linearWebhookSecretToken:a.willGenerateLinearWebhookSecret?"generate-on-apply":(0,ep.g)(a.linearWebhookSecretFromEnv),githubDispatchTokenToken:(0,ep.g)(a.githubDispatchTokenFromEnv??a.derivedGithubDispatchToken),harnessTeamKey:a.harnessTeamKey??a.derivedHarnessTeamKey??"",vercelTokenToken:(0,ep.g)(a.vercelToken),allowExistingProjectBridgeInstall:a.allowExistingProjectBridgeInstall}}function eD(a){return a.projectJustCreated?{message:`Project "${a.projectName}" was created in Vercel, but it has no production deployment yet.`,nextSteps:["Deploy or connect the project in Vercel so it has a production URL.","Return here, select the project under Use existing project, and apply again."]}:{message:`Project "${a.projectName}" exists in Vercel but has no production deployment yet.`,nextSteps:["Deploy the project in Vercel before applying settings.","After deployment completes, preview and apply again."]}}function eE(a){let b=a.team?.mode??"existing",c=a.project?.mode??"existing";return{...a,teamId:"existing"===b?a.team?.teamId??a.teamId:a.teamId,projectId:"existing"===c?a.project?.projectId??a.projectId:a.projectId,projectName:"create"===c?a.project?.projectName??a.projectName:a.projectName,team:a.team??{mode:"existing",teamId:a.teamId},project:a.project??{mode:"existing",projectId:a.projectId,projectName:a.projectName}}}function eF(a){let b=[],c=new Set(a.existingEnvByKey.keys()),d=b=>{let d=a.envInput?.[b]?.trim();return d?{value:d,source:"operator-input"}:"HARNESS_TEAM_KEY"===b&&a.derivedHarnessTeamKey?.trim()?{value:a.derivedHarnessTeamKey.trim(),source:"derived"}:"GITHUB_DISPATCH_TOKEN"===b&&a.derivedGithubDispatchToken?.trim()?{value:a.derivedGithubDispatchToken.trim(),source:"derived"}:"LINEAR_WEBHOOK_SECRET"===b&&a.willGenerateLinearWebhookSecret?{value:"<generated-on-apply>",source:"generated"}:c.has(b)?{value:void 0,source:"preserve-existing"}:{value:void 0,source:"missing-input"}};for(let e of H.P$){let f=d(e),g=a.existingEnvByKey.get(e),h=(0,eo.iQ)(e);if("preserve-existing"===f.source){b.push({key:e,action:"skip",source:"preserve-existing",existingType:g?.type,desiredType:h});continue}if("missing-input"===f.source||!f.value){b.push({key:e,action:"skip",source:"missing-input",desiredType:h});continue}b.push({key:e,action:c.has(e)?"update":"create",source:f.source,existingType:g?.type,desiredType:g?.type??h})}for(let d of H.ck){let e=a.envInput?.[d]?.trim(),f="GITHUB_DISPATCH_REPOSITORY"===d?a.derivedGithubDispatchRepository?.trim():void 0,g=e??f??H.vC[d],h=a.existingEnvByKey.get(d),i=(0,eo.iQ)(d);if(!g){b.push({key:d,action:"skip",source:"missing-input",desiredType:i});continue}if(c.has(d)){b.push({key:d,action:"skip",source:"preserve-existing",existingType:h?.type,desiredType:i});continue}b.push({key:d,action:"create",source:e?"operator-input":f?"derived":"default",desiredType:i})}return b}function eG(a){let b=a.envInput?.[a.key]?.trim();return b||("HARNESS_TEAM_KEY"===a.key&&a.derivedHarnessTeamKey?.trim()?a.derivedHarnessTeamKey.trim():"GITHUB_DISPATCH_TOKEN"===a.key&&a.derivedGithubDispatchToken?.trim()?a.derivedGithubDispatchToken.trim():"GITHUB_DISPATCH_REPOSITORY"===a.key&&a.derivedGithubDispatchRepository?.trim()?a.derivedGithubDispatchRepository.trim():"LINEAR_WEBHOOK_SECRET"===a.key&&a.generatedLinearWebhookSecret?.trim()?a.generatedLinearWebhookSecret.trim():a.key in H.vC?H.vC[a.key]:void 0)}async function eH(a){let b,c,d=eE(a);if(!d.vercelToken.trim())return{actionId:eA.preview.id,teams:[],projects:[],deploymentStatus:"missing",endpointReachable:!1,envWritePlan:[],requiredEnvPresence:{LINEAR_WEBHOOK_SECRET:"missing",GITHUB_DISPATCH_TOKEN:"missing",HARNESS_TEAM_KEY:"missing"},linearWebhookVerified:!1,readiness:(0,H.s5)({}),manualSteps:["Add VERCEL_TOKEN in Step 1 before configuring Vercel settings."],fingerprint:eB({invalid:"missing-vercel-token"}),permission:eA.preview.permission,validationError:"VERCEL_TOKEN is required for Vercel settings preview."};let e=function(a){let b=eE(a);if(b.team?.mode==="create"){if(!b.team.teamSlug?.trim())return"New Vercel team requires a team slug."}else b.teamId||b.team?.teamId;if(b.project?.mode==="create"){let a=ez(b.project.projectName??b.projectName);if(!a.valid)return a.error}else if(!b.projectId?.trim())return"Vercel project is required."}(d);if(e)return{actionId:eA.preview.id,teams:[],projects:[],deploymentStatus:"missing",endpointReachable:!1,envWritePlan:[],requiredEnvPresence:{LINEAR_WEBHOOK_SECRET:"missing",GITHUB_DISPATCH_TOKEN:"missing",HARNESS_TEAM_KEY:"missing"},linearWebhookVerified:!1,readiness:(0,H.s5)({}),manualSteps:[e],fingerprint:eB({invalid:"invalid-selection"}),permission:eA.preview.permission,validationError:e};let f=await (0,eo.dk)(d.vercelToken),g=d.team?.mode==="create"?(0,eo.wH)(f,d.team.teamSlug??"")?.id:d.teamId?.trim()?d.teamId:void 0,h=await (0,eo.Eb)(d.vercelToken,g),i=d.project?.mode==="existing"?h.find(a=>a.id===d.projectId)??h.find(a=>a.id===d.project?.projectId):(0,eo.MA)(h,d.project?.projectName??"");if(i||d.project?.mode!=="create"||(i=void 0),!i){let a=d.project?.mode==="create"?[`Project "${d.project?.projectName}" will be created during apply if it does not already exist.`]:["Select or enter the Vercel project for automation and preview checks."],b=d.willGenerateLinearWebhookSecret??!d.envInput?.LINEAR_WEBHOOK_SECRET?.trim(),c=d.project?.mode==="create"?eF({existingEnvByKey:new Map,envInput:d.envInput,derivedHarnessTeamKey:d.derivedHarnessTeamKey,derivedGithubDispatchToken:d.derivedGithubDispatchToken,derivedGithubDispatchRepository:d.derivedGithubDispatchRepository,willGenerateLinearWebhookSecret:b}):[],e=d.envInput?.GITHUB_DISPATCH_TOKEN?.trim()?"operator-input":d.derivedGithubDispatchToken?.trim()?"saved-github-token":"missing",i=eC({teamId:g,teamMode:d.team?.mode,teamSlug:d.team?.teamSlug,projectId:d.project?.projectName??"",projectMode:d.project?.mode,projectName:d.project?.projectName,envWritePlan:c,willGenerateLinearWebhookSecret:b,linearWebhookSecretFromEnv:d.envInput?.LINEAR_WEBHOOK_SECRET,githubDispatchTokenFromEnv:d.envInput?.GITHUB_DISPATCH_TOKEN,derivedGithubDispatchToken:d.derivedGithubDispatchToken,harnessTeamKey:d.envInput?.HARNESS_TEAM_KEY,derivedHarnessTeamKey:d.derivedHarnessTeamKey,vercelToken:d.vercelToken,allowExistingProjectBridgeInstall:d.allowExistingProjectBridgeInstall});return{actionId:eA.preview.id,teams:f,projects:h,deploymentStatus:d.project?.mode==="create"?"project-will-be-created":"missing",endpointReachable:!1,envWritePlan:c,requiredEnvPresence:{LINEAR_WEBHOOK_SECRET:"missing",GITHUB_DISPATCH_TOKEN:"missing",HARNESS_TEAM_KEY:"missing"},linearWebhookVerified:!1,readiness:(0,H.s5)({}),manualSteps:a,signedProbeVerified:!1,linearWebhookSecretMode:d.project?.mode==="create"?"manual-copy":void 0,githubDispatchSource:e,fingerprint:d.project?.mode==="create"?eB(i):eB({invalid:"missing-project",teamId:g,teamMode:d.team?.mode,teamSlug:d.team?.teamSlug,projectMode:d.project?.mode,projectName:d.project?.projectName}),permission:eA.preview.permission,validationError:d.project?.mode==="create"?void 0:"Vercel project is required."}}let j=await (0,eo.dQ)({vercelToken:d.vercelToken,projectId:i.id,teamId:g,preferredDeploymentId:d.preferredProductionDeploymentId}),k=j?.productionUrl,l=j?.webhookUrl,m=l?"ready":"missing",n=l?void 0:eD({projectName:i.name,projectJustCreated:d.project?.mode==="create"}),o=l?await (0,eo._i)(l):{reachable:!1},p=await (0,eo.A3)(d.vercelToken,i.id,g),q=new Map(p.map(a=>[a.key,a])),r=(0,eo.FR)(p),s=!1,t=[];if(d.team?.mode!=="create"||g||t.push(`Team "${d.team.teamSlug}" will be created during apply if it does not already exist.`),d.linearApiKey&&l){let a=await (0,dZ.Ce)({linearApiKey:d.linearApiKey,webhookUrl:l,teamId:d.linearTeamId});b=(c=await el({linearApiKey:d.linearApiKey,webhookUrl:l,linearTeamId:d.linearTeamId})).mode,s=!1,"existing-unverified"===c.mode&&(s=!1),t.push(...a.manualSteps,...c.manualSteps)}else l?t.push("After Vercel env vars are configured, create or verify the Linear Issue webhook."):t.push(n?.message??"No production deployment was found for the selected Vercel project yet. Deploy the project before automation checks can pass.",...n?.nextSteps??[]),b="manual-copy";let u=d.willGenerateLinearWebhookSecret??c?.willGenerateOnApply??!d.envInput?.LINEAR_WEBHOOK_SECRET?.trim(),v=eF({existingEnvByKey:q,envInput:d.envInput,derivedHarnessTeamKey:d.derivedHarnessTeamKey,derivedGithubDispatchToken:d.derivedGithubDispatchToken,derivedGithubDispatchRepository:d.derivedGithubDispatchRepository,willGenerateLinearWebhookSecret:u}),w=d.envInput?.GITHUB_DISPATCH_TOKEN?.trim()?"operator-input":d.derivedGithubDispatchToken?.trim()?"saved-github-token":"missing",x=(0,H.s5)({projectId:i.id,productionUrl:k,webhookUrl:l,endpointReachable:o.reachable,requiredEnvPresence:r,linearWebhookVerified:s,signedProbeVerified:!1,deploymentRedeployRequired:!1}),y=eB(eC({teamId:g,teamMode:d.team?.mode,teamSlug:d.team?.teamSlug,projectId:i.id,projectMode:d.project?.mode,projectName:d.project?.projectName,envWritePlan:v,willGenerateLinearWebhookSecret:u,linearWebhookSecretFromEnv:d.envInput?.LINEAR_WEBHOOK_SECRET,githubDispatchTokenFromEnv:d.envInput?.GITHUB_DISPATCH_TOKEN,derivedGithubDispatchToken:d.derivedGithubDispatchToken,harnessTeamKey:d.envInput?.HARNESS_TEAM_KEY,derivedHarnessTeamKey:d.derivedHarnessTeamKey,vercelToken:d.vercelToken,allowExistingProjectBridgeInstall:d.allowExistingProjectBridgeInstall}));return{actionId:eA.preview.id,teams:f,projects:h,selectedProject:i,productionUrl:k,webhookUrl:l,productionUrlSource:j?.source,canonicalDeploymentId:j?.deploymentId,deploymentStatus:m,deploymentRequired:n,endpointReachable:o.reachable,endpointStatusCode:o.statusCode,envWritePlan:v,requiredEnvPresence:r,linearWebhookVerified:s,signedProbeVerified:!1,deploymentRedeployRequired:!1,linearWebhookSecretMode:b,githubDispatchSource:w,readiness:x,manualSteps:t,fingerprint:y,permission:eA.preview.permission}}let eI=/LINEAR_WEBHOOK_SECRET|GITHUB_TOKEN|LINEAR_API_KEY|VERCEL_TOKEN|GITHUB_DISPATCH_TOKEN|linear-signature|signature/i;function eJ(a){return eI.test(a)?"[redacted]":a}function eK(a){console.log(`[setup:vercel-bridge] ${JSON.stringify(function(a){let b={event:"vercel_bridge_setup",...a};return a.setupBlockedMessage&&(b.setupBlockedMessage=eJ(a.setupBlockedMessage)),a.setupBlockedNextSteps&&(b.setupBlockedNextSteps=a.setupBlockedNextSteps.map(a=>eJ(a))),a.message&&(b.message=eJ(a.message)),b}(a))}`)}let eL="PDEV_BRIDGE_PROJECT_MARKER",eM=String.raw`
|
|
54
|
+
const { createHmac, timingSafeEqual } = require("node:crypto");
|
|
55
|
+
|
|
56
|
+
function json(res, status, body) {
|
|
57
|
+
res.statusCode = status;
|
|
58
|
+
res.setHeader("Content-Type", "application/json");
|
|
59
|
+
res.end(JSON.stringify(body));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function readRawBody(req) {
|
|
63
|
+
const chunks = [];
|
|
64
|
+
for await (const chunk of req) {
|
|
65
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
66
|
+
}
|
|
67
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function getHeader(req, name) {
|
|
71
|
+
const value = req.headers[name.toLowerCase()] || req.headers[name];
|
|
72
|
+
return Array.isArray(value) ? value[0] || null : value || null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function computeSignature(secret, rawBody) {
|
|
76
|
+
return createHmac("sha256", secret).update(rawBody).digest("hex");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function signatureMatches(secret, rawBody, signatureHeader) {
|
|
80
|
+
if (!signatureHeader || !/^[0-9a-f]+$/i.test(signatureHeader)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
const computed = Buffer.from(computeSignature(secret, rawBody), "hex");
|
|
84
|
+
const provided = Buffer.from(signatureHeader, "hex");
|
|
85
|
+
return computed.length === provided.length && timingSafeEqual(computed, provided);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function parseTimestampMs(value) {
|
|
89
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
93
|
+
const parsed = Number(value);
|
|
94
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function timestampOk(payloadTimestamp, headerTimestamp) {
|
|
100
|
+
const toleranceMs = Number(process.env.LINEAR_WEBHOOK_TIMESTAMP_TOLERANCE_MS || 60000);
|
|
101
|
+
const now = Date.now();
|
|
102
|
+
return [payloadTimestamp, headerTimestamp]
|
|
103
|
+
.filter((value) => value !== null)
|
|
104
|
+
.some((value) => Math.abs(now - value) <= toleranceMs);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function dispatchToGitHub(payload) {
|
|
108
|
+
const repository = process.env.GITHUB_DISPATCH_REPOSITORY;
|
|
109
|
+
const token = process.env.GITHUB_DISPATCH_TOKEN;
|
|
110
|
+
if (!repository || !token) {
|
|
111
|
+
throw new Error("missing_dispatch_configuration");
|
|
112
|
+
}
|
|
113
|
+
const eventType = process.env.GITHUB_DISPATCH_EVENT_TYPE || "linear_issue_event";
|
|
114
|
+
const response = await fetch("https://api.github.com/repos/" + repository + "/dispatches", {
|
|
115
|
+
method: "POST",
|
|
116
|
+
headers: {
|
|
117
|
+
Accept: "application/vnd.github+json",
|
|
118
|
+
Authorization: "Bearer " + token,
|
|
119
|
+
"Content-Type": "application/json",
|
|
120
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
121
|
+
},
|
|
122
|
+
body: JSON.stringify({
|
|
123
|
+
event_type: eventType,
|
|
124
|
+
client_payload: payload,
|
|
125
|
+
}),
|
|
126
|
+
});
|
|
127
|
+
if (!response.ok) {
|
|
128
|
+
throw new Error("github_dispatch_" + response.status);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
module.exports = async function handler(req, res) {
|
|
133
|
+
if ((req.method || "GET") !== "POST") {
|
|
134
|
+
return json(res, 405, { error: "method_not_allowed" });
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const secret = process.env.LINEAR_WEBHOOK_SECRET;
|
|
138
|
+
if (!secret) {
|
|
139
|
+
return json(res, 500, { error: "dispatch_failed" });
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const rawBody = await readRawBody(req);
|
|
143
|
+
if (!signatureMatches(secret, rawBody, getHeader(req, "linear-signature"))) {
|
|
144
|
+
return json(res, 401, { error: "invalid_signature" });
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
let payload;
|
|
148
|
+
try {
|
|
149
|
+
payload = JSON.parse(rawBody);
|
|
150
|
+
} catch {
|
|
151
|
+
return json(res, 401, { error: "invalid_signature" });
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (
|
|
155
|
+
!timestampOk(
|
|
156
|
+
parseTimestampMs(payload && payload.webhookTimestamp),
|
|
157
|
+
parseTimestampMs(getHeader(req, "linear-timestamp")),
|
|
158
|
+
)
|
|
159
|
+
) {
|
|
160
|
+
return json(res, 401, { error: "timestamp_out_of_tolerance" });
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (payload.type !== "Issue" || !payload.data || !payload.data.identifier) {
|
|
164
|
+
return json(res, 200, { accepted: false, reason: "ignored_event" });
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const issueKey = payload.data.identifier;
|
|
168
|
+
const teamKey = process.env.HARNESS_TEAM_KEY;
|
|
169
|
+
if (teamKey && !issueKey.startsWith(teamKey + "-")) {
|
|
170
|
+
return json(res, 200, { accepted: false, reason: "team_key_mismatch" });
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
await dispatchToGitHub({
|
|
175
|
+
issueKey,
|
|
176
|
+
issueId: payload.data.id,
|
|
177
|
+
issueUrl: payload.data.url,
|
|
178
|
+
action: payload.action,
|
|
179
|
+
statusName: payload.data.state && payload.data.state.name,
|
|
180
|
+
linearDeliveryId: getHeader(req, "linear-delivery"),
|
|
181
|
+
linearWebhookId: getHeader(req, "linear-webhook-id"),
|
|
182
|
+
receivedAt: new Date().toISOString(),
|
|
183
|
+
});
|
|
184
|
+
} catch {
|
|
185
|
+
return json(res, 500, { error: "dispatch_failed" });
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return json(res, 200, { accepted: true, dispatched: true, issueKey });
|
|
189
|
+
};
|
|
190
|
+
`.trimStart();async function eN(a){if((0,eo.oN)(a.deployment))return"ready";let b=a.sleep??(a=>new Promise(b=>setTimeout(b,a))),c=a.pollIntervalMs??5e3,d=a.timeoutMs??3e5,e=Date.now()+d;for(;Date.now()<e;){let d=await (0,eo.V9)(a.vercelToken,a.deployment.id,a.teamId);if((0,eo.oN)(d))return"ready";let e=d.readyState??d.state;if("ERROR"===e||"CANCELED"===e)return"failed";await b(c)}return"timeout"}async function eO(a){let b;try{b=await (0,eo.dK)(a.vercelToken,{projectName:a.projectName,teamId:a.teamId,target:"production",files:[{file:"api/linear-webhook.js",data:eM,encoding:"utf-8"},{file:"package.json",data:JSON.stringify({type:"commonjs"},null,2),encoding:"utf-8"},{file:"vercel.json",data:JSON.stringify({functions:{"api/linear-webhook.js":{maxDuration:10}}},null,2),encoding:"utf-8"}],projectSettings:{framework:null,buildCommand:null,installCommand:null}})}catch(a){return{status:"failed",source:"artifact",message:a instanceof Error?a.message:"Vercel bridge artifact deployment failed."}}let c=await eN({vercelToken:a.vercelToken,deployment:b,teamId:a.teamId,pollIntervalMs:a.pollIntervalMs,timeoutMs:a.timeoutMs,sleep:a.sleep});return{status:c,source:"artifact",deploymentId:b.id,deploymentUrl:b.url,state:b.state,readyState:b.readyState,message:"ready"===c?"Vercel bridge artifact deployment reached READY.":"Vercel bridge artifact deployment did not reach READY."}}async function eP(a){let b;try{b=await (0,eo.dK)(a.vercelToken,{projectName:a.projectName,teamId:a.teamId,target:"production"})}catch(a){return{status:"failed",source:"git",message:a instanceof Error?a.message:"Vercel git deployment failed."}}let c=await eN({vercelToken:a.vercelToken,deployment:b,teamId:a.teamId,pollIntervalMs:a.pollIntervalMs,timeoutMs:a.timeoutMs,sleep:a.sleep});return{status:c,source:"git",deploymentId:b.id,deploymentUrl:b.url,state:b.state,readyState:b.readyState,message:"ready"===c?"Vercel git deployment reached READY.":"Vercel git deployment did not reach READY."}}async function eQ(a){if("git"===a.preferredSource){let b=await eP(a);if("ready"===b.status)return b}return eO(a)}async function eR(a){let b=a.repository?.trim();if(!b)return{source:"artifact",reason:"missing_harness_repository"};let c=await (0,eo.u_)(a.vercelToken,{repository:b,teamId:a.teamId});return c.accessible?{source:"git",gitRepository:{type:"github",repo:b}}:{source:"artifact",reason:c.reason}}async function eS(a){let b=eE(a.plan);if(b.team?.mode!=="create"){let c=b.teamId?.trim()?b.teamId:void 0,d=await (0,eo.dk)(b.vercelToken),e=c?d.find(a=>a.id===c):void 0;return e?(a.reused.push(`team:${e.slug}`),{teamId:e.id,teamName:e.name,team:{id:e.id,name:e.name,outcome:"reused"}}):{teamId:c}}let c=b.team.teamSlug?.trim();if(!c)throw Error("New Vercel team requires a team slug.");let d=await (0,eo.dk)(b.vercelToken),e=(0,eo.wH)(d,c);if(e)return a.reused.push(`team:${e.slug}`),{teamId:e.id,teamName:e.name,team:{id:e.id,name:e.name,outcome:"reused"}};let f=await (0,eo.ln)(b.vercelToken,{slug:c,name:b.team.teamName});return a.created.push(`team:${f.slug}`),{teamId:f.id,teamName:f.name,team:{id:f.id,name:f.name,outcome:"created"}}}async function eT(a){let b=eE(a.plan),c=await (0,eo.Eb)(b.vercelToken,a.teamId);if(b.project?.mode==="existing"){let d=b.projectId??b.project.projectId,e=c.find(a=>a.id===d);if(!e)throw Error("Selected Vercel project is required for apply.");return a.reused.push(`project:${e.name}`),{project:e,projectResult:{id:e.id,name:e.name,outcome:"reused"},preferredDeploymentSource:"artifact"}}let d=ez(b.project?.projectName??b.projectName);if(!d.valid)throw Error(d.error);let e=d.normalized,f=(0,eo.MA)(c,e);if(f)return a.reused.push(`project:${f.name}`),{project:f,projectResult:{id:f.id,name:f.name,outcome:"reused"},preferredDeploymentSource:"artifact"};let g=await eR({vercelToken:b.vercelToken,teamId:a.teamId,repository:b.derivedGithubDispatchRepository}),h=await (0,eo.P4)(b.vercelToken,{name:e,teamId:a.teamId,gitRepository:g.gitRepository});return a.created.push(`project:${h.name}`),{project:h,projectResult:{id:h.id,name:h.name,outcome:"created"},preferredDeploymentSource:g.source}}function eU(){return{message:"No READY production deployment was found to redeploy after env var changes.",nextSteps:["Deploy the project in Vercel so it has a production deployment.","Return here and apply Vercel settings again."]}}async function eV(a){let b=await (0,eo.A3)(a.vercelToken,a.projectId,a.teamId);return a.allowExistingProjectBridgeInstall||b.some(a=>a.key===eL)?{allowed:!0,envVars:b}:{allowed:!1,envVars:b,setupBlocked:{message:"PDev will not install the automation bridge into an existing Vercel project unless it is already marked as PDev-managed or you explicitly confirm bridge installation for that project.",nextSteps:["Create a dedicated Vercel bridge project with Create new project.","Or rerun apply with allowExistingProjectBridgeInstall after confirming this project may host the PDev bridge."]}}}async function eW(a){a.existingEnv.find(a=>a.key===eL)||(await (0,eo.wI)(a.vercelToken,{projectId:a.projectId,teamId:a.teamId,key:eL,value:"p-dev-managed"}),a.writtenEnvKeys.push(eL))}async function eX(a){var b,c,e;let f=[{phase:"writing_env_vars",status:a.baseResult.writtenEnvKeys.length>0?"completed":"failed",message:"Writing Vercel env vars…"},{phase:"verifying_webhook",status:"failed",message:"Initial signed probe failed due to stale deployment."}],g=a.baseResult.writtenEnvKeys.length>0,h=a.signedProbe;if(!g||!er(h))return{...a.baseResult,envVarsWritten:g,signedProbeInitialResult:h,signedProbe:h,productionRedeployTriggered:!1,productionRedeployStatus:"not_triggered",orchestrationSteps:f.slice(0,1)};let i=await (0,cV.oQ)(a.applyInput.cwd),j=i?.vercel?.redeployVerification??a.priorSelection.redeployVerification;if(j?.newDeploymentId&&j.fingerprint===a.fingerprint&&!["verified","verify_failed","failed","timeout","no_source_deployment"].includes(j.status))return f.push({phase:"redeploying_production",status:"completed",message:"Redeploying production so new env vars take effect…"}),{...a.baseResult,envVarsWritten:g,signedProbeInitialResult:h,signedProbe:h,productionRedeployTriggered:!0,productionRedeployStatus:"building"===j.status?"building":"triggered",setupPending:!0,pollActionId:j.actionId,orchestrationSteps:f};let k=await es({vercelToken:a.vercelToken,projectId:a.projectId,teamId:a.teamId});if(!((b={writtenEnvKeys:a.baseResult.writtenEnvKeys,signedProbe:h,sourceDeploymentId:k}).writtenEnvKeys.length>0&&er(b.signedProbe)&&b.sourceDeploymentId?.trim()))return k?{...a.baseResult,envVarsWritten:g,signedProbeInitialResult:h,signedProbe:h,productionRedeployTriggered:!1,productionRedeployStatus:"not_triggered",orchestrationSteps:f.slice(0,1)}:{...a.baseResult,envVarsWritten:g,signedProbeInitialResult:h,signedProbe:h,productionRedeployTriggered:!1,productionRedeployStatus:"no_source_deployment",setupBlocked:eU(),orchestrationSteps:f};let l=await et({vercelToken:a.vercelToken,projectId:a.projectId,projectName:a.projectName,teamId:a.teamId,sourceDeploymentId:k});if("triggered"!==l.status||!l.newDeploymentId){f.push({phase:"redeploying_production",status:"failed",message:l.message??"Redeploying production so new env vars take effect…"});let b="no_source_deployment"===l.status?eU():{message:(c=l.status,e=l.message,"timeout"===c?e??"Automatic production redeploy timed out before READY. Redeploy production in Vercel, then use Apply Vercel Settings again.":"failed"===c?e??"Automatic production redeploy failed. Redeploy production in Vercel, then use Apply Vercel Settings again.":"Redeploy production in Vercel, then use Apply Vercel Settings again."),nextSteps:["Redeploy production in Vercel manually if needed.","Use Apply Vercel Settings again to restart verification."]};return eK({phase:"blocked",actionId:eA.apply.id,pollStatus:l.status,projectId:a.projectId,fingerprint:a.fingerprint,setupBlockedMessage:b.message,setupBlockedNextSteps:b.nextSteps}),{...a.baseResult,envVarsWritten:g,signedProbeInitialResult:h,signedProbe:h,productionRedeployTriggered:!1,productionRedeployStatus:l.status,setupBlocked:b,orchestrationSteps:f}}let m=function(a){let b=new Date().toISOString();return{actionId:`vercel-redeploy-${(0,d.randomUUID)()}`,projectId:a.projectId,projectName:a.projectName,teamId:a.teamId,webhookUrl:a.webhookUrl,fingerprint:a.fingerprint,fingerprintInputs:a.fingerprintInputs,candidateSecretSource:a.candidateSecretSource,sourceDeploymentId:a.sourceDeploymentId,newDeploymentId:a.newDeploymentId,status:"triggered",startedAt:b,updatedAt:b,deadlineAt:new Date(Date.now()+3e5).toISOString(),verifyAttempted:!1,phase:"triggered",verificationAttemptCount:0,maxVerificationAttempts:5,message:a.message??"Production redeploy triggered. Waiting for Vercel deployment READY.",writtenEnvKeys:a.writtenEnvKeys,skippedEnvKeys:a.skippedEnvKeys}}({projectId:a.projectId,projectName:a.projectName,teamId:a.teamId,webhookUrl:a.webhookUrl,fingerprint:a.fingerprint,fingerprintInputs:a.fingerprintInputs,candidateSecretSource:a.baseResult.candidateSecretSource,sourceDeploymentId:l.sourceDeploymentId,newDeploymentId:l.newDeploymentId,message:l.message,writtenEnvKeys:a.baseResult.writtenEnvKeys,skippedEnvKeys:a.baseResult.skippedEnvKeys});return await (0,cV.xj)({vercel:{...a.priorSelection,redeployVerification:m}},a.applyInput.cwd),eK({phase:"redeploy_trigger",actionId:m.actionId,pollStatus:"triggered",projectId:a.projectId,projectName:a.projectName,teamId:a.teamId,fingerprint:a.fingerprint,candidateSecretSource:a.baseResult.candidateSecretSource}),f.push({phase:"redeploying_production",status:"completed",message:"Redeploying production so new env vars take effect…"}),{...a.baseResult,envVarsWritten:g,signedProbeInitialResult:h,signedProbe:h,productionRedeployTriggered:!0,productionRedeployStatus:"triggered",setupPending:!0,pollActionId:m.actionId,orchestrationSteps:f}}async function eY(a){var b,c;let e,f;(0,F.L6)(a.confirmed),(0,F.xp)(eA.apply.permission.scope,g.P.remoteSecretWrite.scope);let h=eE(a.plan);eK({phase:"apply_start",actionId:eA.apply.id,verifyOnly:!0===a.verifyOnly,fingerprint:a.fingerprint,projectId:h.projectId,projectName:h.projectName,teamId:h.teamId});let i=await eH(h);if((0,F.Me)(a.fingerprint,i.fingerprint),i.validationError)throw Error(i.validationError);if(!0!==a.verifyOnly){let b=await (0,ex.tl)({cwd:a.cwd,key:"GITHUB_TOKEN"}),c=await ey({githubToken:b,cwd:a.cwd,verifiedDispatchRepo:h.derivedGithubDispatchRepository,requireVerifiedPackagedDispatchRepo:!0});if(!c.eligible)return eK({phase:"blocked",actionId:eA.apply.id,setupBlockedMessage:c.message,fingerprint:a.fingerprint}),{actionId:eA.apply.id,status:"applied",projectId:h.projectId??"",projectName:h.projectName??"",writtenEnvKeys:[],skippedEnvKeys:[],linearWebhookSetup:{mode:"manual-copy",manualSteps:[]},signedProbeVerified:!1,deploymentRedeployRequired:!1,verified:!1,fingerprint:i.fingerprint,permission:eA.apply.permission,setupBlocked:{message:c.message,nextSteps:["Update GITHUB_TOKEN in Step 1 with Contents write access to the harness dispatch repository."]}}}let k=[],l=[],m=await eS({plan:h,created:k,reused:l}),n=await eT({plan:{...h,teamId:m.teamId,projectId:h.project?.mode==="existing"?h.projectId??h.project?.projectId:void 0},teamId:m.teamId,created:k,reused:l}),o={...h,teamId:m.teamId,projectId:n.project.id,projectName:n.project.name,team:{mode:"existing",teamId:m.teamId??""},project:{mode:"existing",projectId:n.project.id,projectName:n.project.name}},p=await eH(o);if(p.validationError)throw Error(p.validationError);if(!p.selectedProject)throw Error("Vercel project must be selected before apply.");let q="created"===n.projectResult.outcome,r=[];if(!p.webhookUrl){let b=q?{allowed:!0,envVars:await (0,eo.A3)(h.vercelToken,p.selectedProject.id,m.teamId),setupBlocked:void 0}:await eV({vercelToken:h.vercelToken,projectId:p.selectedProject.id,teamId:m.teamId,allowExistingProjectBridgeInstall:h.allowExistingProjectBridgeInstall});if(!b.allowed)return eK({phase:"blocked",actionId:eA.apply.id,projectId:p.selectedProject.id,projectName:p.selectedProject.name,fingerprint:p.fingerprint,setupBlockedMessage:b.setupBlocked?.message,setupBlockedNextSteps:b.setupBlocked?.nextSteps}),{actionId:eA.apply.id,status:"applied",projectId:p.selectedProject.id,projectName:p.selectedProject.name,team:m.team,project:n.projectResult,writtenEnvKeys:[],skippedEnvKeys:[],linearWebhookSetup:{mode:"manual-copy",manualSteps:b.setupBlocked?.nextSteps??[]},verified:!1,signedProbeVerified:!1,deploymentRedeployRequired:!1,fingerprint:p.fingerprint,permission:eA.apply.permission,setupBlocked:b.setupBlocked};e=h.envInput?.LINEAR_WEBHOOK_SECRET?.trim()??eh(),h.envInput?.LINEAR_WEBHOOK_SECRET?.trim()||await ew({cwd:a.cwd,secret:e});let c=new Map(b.envVars.map(a=>[a.key,a])),d=[];for(let a of p.envWritePlan){if("skip"===a.action){d.push(a.key);continue}let b=eG({key:a.key,envInput:h.envInput,derivedHarnessTeamKey:h.derivedHarnessTeamKey,derivedGithubDispatchToken:h.derivedGithubDispatchToken,derivedGithubDispatchRepository:h.derivedGithubDispatchRepository,generatedLinearWebhookSecret:e});if(!b?.trim()){d.push(a.key);continue}await (0,eo.wI)(h.vercelToken,{projectId:p.selectedProject.id,teamId:m.teamId,key:a.key,value:b.trim(),existingEnv:c.get(a.key)}),r.push(a.key)}await eW({vercelToken:h.vercelToken,projectId:p.selectedProject.id,teamId:m.teamId,existingEnv:b.envVars,writtenEnvKeys:r});let f=await eQ({vercelToken:h.vercelToken,projectName:p.selectedProject.name,teamId:m.teamId,preferredSource:n.preferredDeploymentSource});if("ready"!==f.status||!f.deploymentId)return{actionId:eA.apply.id,status:"applied",projectId:p.selectedProject.id,projectName:p.selectedProject.name,team:m.team,project:n.projectResult,writtenEnvKeys:r,skippedEnvKeys:d,linearWebhookSetup:{mode:"manual-copy",manualSteps:[f.message??"Vercel bridge deployment did not reach READY before verification."]},verified:!1,signedProbeVerified:!1,deploymentRedeployRequired:!1,productionRedeployStatus:"timeout"===f.status?"timeout":"failed",fingerprint:p.fingerprint,permission:eA.apply.permission,setupBlocked:{message:f.message??"Vercel bridge deployment did not reach READY before verification.",nextSteps:["Check the Vercel deployment logs for the bridge project.","Apply Vercel settings again after the deployment reaches READY."]},orchestrationSteps:[{phase:"writing_env_vars",status:"completed",message:"Writing Vercel env vars before deployment."},{phase:"deploying_bridge",status:"failed",message:f.message??"Creating the production bridge deployment failed."}]};let g=await (0,eo.dQ)({vercelToken:h.vercelToken,projectId:p.selectedProject.id,teamId:m.teamId,preferredDeploymentId:f.deploymentId});if(!g?.webhookUrl)throw Error("Vercel bridge deployment reached READY but no production URL was resolved.");let i=await (0,eo._i)(g.webhookUrl);p={...p,productionUrl:g.productionUrl,webhookUrl:g.webhookUrl,productionUrlSource:g.source,canonicalDeploymentId:g.deploymentId,deploymentStatus:"ready",endpointReachable:i.reachable,endpointStatusCode:i.statusCode,deploymentRequired:void 0}}if(!p.webhookUrl){let a=p.selectedProject;if(!a)throw Error("Vercel project must be selected before apply.");let b=eD({projectName:a.name,projectJustCreated:q});return{actionId:eA.apply.id,status:"deployment-required",projectId:a.id,projectName:a.name,team:m.team,project:n.projectResult,writtenEnvKeys:[],skippedEnvKeys:[],linearWebhookSetup:{mode:"manual-copy",manualSteps:b.nextSteps},deploymentRequired:{...b,projectJustCreated:q},verified:!1,signedProbeVerified:!1,deploymentRedeployRequired:!1,fingerprint:p.fingerprint,permission:eA.apply.permission}}let s=p.selectedProject;if(!s)throw Error("Vercel project must be selected before apply.");let t=await (0,cV.oQ)(a.cwd),u=!!(t?.vercel?.redeployVerification?.newDeploymentId&&"verified"!==t.vercel.redeployVerification.status&&"verify_failed"!==t.vercel.redeployVerification.status&&"failed"!==t.vercel.redeployVerification.status&&"timeout"!==t.vercel.redeployVerification.status&&"no_source_deployment"!==t.vercel.redeployVerification.status),v=!0===a.verifyOnly||!!(!u&&t?.vercel?.deploymentRedeployRequired&&t.vercel.projectId===s.id&&t.vercel.appliedFingerprint===p.fingerprint),w=t?.vercel?.webhookUrl?.trim(),x=p.webhookUrl?.trim(),y=!!(v&&w&&x&&w!==x),z=await ek({linearApiKey:h.linearApiKey,webhookUrl:p.webhookUrl,linearTeamId:h.linearTeamId,operatorSecret:h.envInput?.LINEAR_WEBHOOK_SECRET}),A=h.verificationLinearWebhookSecret?.trim(),B=!!(A&&(v||h.preserveGeneratedWebhookSecretFingerprint)),C=e??z.secret;B?C=A:e||C?.trim()||"generated"!==z.source||(C=eh()),e||"unreadable"!==z.source||v||C?.trim()||(C=eh()),!v&&!e&&C?.trim()&&!B&&("generated"===z.source||"unreadable"===z.source)&&await ew({cwd:a.cwd,secret:C});let D={mode:"manual-copy",manualSteps:z.manualSteps,manualCopySecret:void 0};if(y&&C?.trim()&&B&&h.linearApiKey?.trim()&&(f=await em({linearApiKey:h.linearApiKey,linearTeamId:h.linearTeamId,previousWebhookUrl:w,canonicalWebhookUrl:x,secret:C}),eK({phase:"linear_webhook_url_reconcile",actionId:eA.apply.id,verifyOnly:!0===a.verifyOnly,projectId:s.id,fingerprint:p.fingerprint,webhookUrlDrift:!0,reconciliationAttempted:f.attempted,reconciliationSucceeded:f.reconciled,matchingPreviousWebhookFound:f.matchingPreviousWebhookFound,canonicalWebhookExists:f.canonicalWebhookExists})),"unreadable"===z.source&&v)D={mode:"existing-unverified",manualSteps:z.manualSteps,manualCopySecret:void 0};else if(f?.attempted&&!f.reconciled)D={mode:"existing-unverified",manualSteps:f.manualSteps,manualCopySecret:void 0};else if(C?.trim())if(h.linearApiKey?.trim()){let a=await en({linearApiKey:h.linearApiKey,webhookUrl:p.webhookUrl,linearTeamId:h.linearTeamId,secret:C,mutatePolicy:v?"verify-only":"setup"});D={mode:a.mode,manualSteps:a.manualSteps,manualCopySecret:"automated"===a.mode?void 0:a.secret},B||(C=a.secret)}else D={mode:"manual-copy",manualSteps:["Add LINEAR_API_KEY in Step 1 before automated Linear webhook setup can run.","Copy the generated webhook secret into Linear when prompted."],manualCopySecret:C};else D={mode:"manual-copy",manualSteps:z.manualSteps,manualCopySecret:void 0};let E=(0,j.Gn)({linearApiKey:h.linearApiKey,githubToken:h.envInput?.GITHUB_DISPATCH_TOKEN??h.derivedGithubDispatchToken});C?.trim()&&E.push(C),h.envInput?.GITHUB_DISPATCH_TOKEN&&E.push(h.envInput.GITHUB_DISPATCH_TOKEN),h.derivedGithubDispatchToken&&E.push(h.derivedGithubDispatchToken);let G=new Map((await (0,eo.A3)(h.vercelToken,s.id,m.teamId)).map(a=>[a.key,a])),I=!v&&!!C?.trim(),J=[...r],K=[];for(let a of p.envWritePlan){if(r.includes(a.key)||"skip"===a.action||"LINEAR_WEBHOOK_SECRET"===a.key&&!I){K.push(a.key);continue}let b=eG({key:a.key,envInput:h.envInput,derivedHarnessTeamKey:h.derivedHarnessTeamKey,derivedGithubDispatchToken:h.derivedGithubDispatchToken,derivedGithubDispatchRepository:h.derivedGithubDispatchRepository,generatedLinearWebhookSecret:C});if(!b?.trim()){K.push(a.key);continue}let c=G.get(a.key);try{await (0,eo.wI)(h.vercelToken,{projectId:s.id,teamId:m.teamId,key:a.key,value:b.trim(),existingEnv:c})}catch(a){throw a instanceof eo.c9,a}J.push(a.key)}if(I&&!J.includes("LINEAR_WEBHOOK_SECRET")&&C?.trim()){let a=G.get("LINEAR_WEBHOOK_SECRET");await (0,eo.wI)(h.vercelToken,{projectId:s.id,teamId:m.teamId,key:"LINEAR_WEBHOOK_SECRET",value:C,existingEnv:a}),J.push("LINEAR_WEBHOOK_SECRET")}let L=await (0,eo.A3)(h.vercelToken,s.id,m.teamId),M=(0,eo.FR)(L),N=!1;if(h.linearApiKey?.trim()){let a=await (0,dZ.Ce)({linearApiKey:h.linearApiKey,webhookUrl:p.webhookUrl,teamId:h.linearTeamId});N="automated"===D.mode&&!!a.matchingWebhook}let O=(c={projectId:s.id,linearTeamId:h.linearTeamId,productionUrl:p.productionUrl,webhookUrl:p.webhookUrl,envWritePlan:p.envWritePlan,candidateSecretToken:(b=C,(0,ep.g)(b))},(0,d.createHash)("sha256").update(JSON.stringify({projectId:c.projectId??"",linearTeamId:c.linearTeamId??"",productionUrl:c.productionUrl??"",webhookUrl:c.webhookUrl??"",envWritePlan:(c.envWritePlan??[]).map(a=>({key:a.key,action:a.action,source:a.source})),candidateSecretToken:c.candidateSecretToken??""})).digest("hex").slice(0,16)),P=C?.trim()?await eq({webhookUrl:p.webhookUrl,secret:C}):{passed:!1,result:"error",reason:"missing_candidate_secret",probedAt:new Date().toISOString()},Q=P.passed,R=J.length>0&&!Q;eK({phase:"signed_probe",actionId:eA.apply.id,verifyOnly:!0===a.verifyOnly,projectId:s.id,projectName:s.name,teamId:m.teamId,fingerprint:p.fingerprint,candidateSecretSource:z.source,hasLocalWebhookSecret:!!(h.verificationLinearWebhookSecret?.trim()||h.envInput?.LINEAR_WEBHOOK_SECRET?.trim()),envWritePlan:p.envWritePlan.map(a=>({key:a.key,action:a.action,source:a.source})),signedProbeResult:P.result,signedProbeReason:P.reason,signedProbeStatusCode:P.statusCode});let S=H.P$.every(a=>"present"===M[a])&&p.endpointReachable&&N&&Q&&!R,T={teamId:m.teamId,teamName:m.teamName,projectId:s.id,projectName:s.name,productionUrl:p.productionUrl??"",webhookUrl:p.webhookUrl??"",endpointReachable:p.endpointReachable,envVarPresence:M,linearWebhookVerified:N,signedProbeVerified:Q,signedProbe:P,verificationFingerprint:O,deploymentRedeployRequired:R,appliedFingerprint:p.fingerprint,appliedAt:new Date().toISOString(),manualComplete:a.manualComplete};await (0,cV.xj)({vercel:T},a.cwd);let U=JSON.stringify({actionId:eA.apply.id,writtenEnvKeys:J,skippedEnvKeys:K,linearWebhookSetup:{mode:D.mode,manualSteps:D.manualSteps},signedProbeVerified:Q,verified:S});for(let a of E)if(U.includes(a))throw Error("Vercel bridge apply result leaked secret material");let V={actionId:eA.apply.id,status:"applied",projectId:s.id,projectName:s.name,team:m.team,project:n.projectResult,writtenEnvKeys:J,skippedEnvKeys:K,linearWebhookSetup:D,signedProbeVerified:Q,signedProbeReason:P.reason,signedProbe:P,deploymentRedeployRequired:R,verificationRetry:v,candidateSecretSource:z.source,verified:S,fingerprint:p.fingerprint,permission:eA.apply.permission,envVarsWritten:J.length>0,productionRedeployTriggered:!1,productionRedeployStatus:"not_triggered"};return a.verifyOnly||v||!R||V.verified?(eK({phase:"apply_complete",actionId:eA.apply.id,verifyOnly:!0===a.verifyOnly,projectId:s.id,projectName:s.name,teamId:m.teamId,fingerprint:p.fingerprint,signedProbeResult:P.result,signedProbeReason:P.reason,pollStatus:V.verified?"verified":void 0}),V):(eK({phase:"redeploy_trigger",actionId:eA.apply.id,projectId:s.id,projectName:s.name,teamId:m.teamId,fingerprint:p.fingerprint,candidateSecretSource:z.source,signedProbeResult:P.result,signedProbeReason:P.reason}),eX({applyInput:a,baseResult:V,signedProbe:P,vercelToken:h.vercelToken,projectId:s.id,projectName:s.name,teamId:m.teamId,webhookUrl:p.webhookUrl??"",fingerprint:p.fingerprint,fingerprintInputs:eC({teamId:m.teamId,teamMode:o.team?.mode,teamSlug:o.team?.teamSlug,projectId:s.id,projectMode:o.project?.mode,projectName:o.project?.projectName,envWritePlan:p.envWritePlan,willGenerateLinearWebhookSecret:o.willGenerateLinearWebhookSecret??!o.envInput?.LINEAR_WEBHOOK_SECRET?.trim(),linearWebhookSecretFromEnv:o.envInput?.LINEAR_WEBHOOK_SECRET,githubDispatchTokenFromEnv:o.envInput?.GITHUB_DISPATCH_TOKEN,derivedGithubDispatchToken:o.derivedGithubDispatchToken,harnessTeamKey:o.envInput?.HARNESS_TEAM_KEY,derivedHarnessTeamKey:o.derivedHarnessTeamKey,vercelToken:h.vercelToken,allowExistingProjectBridgeInstall:o.allowExistingProjectBridgeInstall}),priorSelection:T}))}async function eZ(a){try{let b=await (0,f.readFile)(a,"utf8");return JSON.parse(b)}catch{return null}}async function e$(a){let b=await eZ(a);if(!b?.claimedAt)return!0;let c=Date.now()-Date.parse(b.claimedAt);return Number.isNaN(c)||c>3e4}async function e_(a){let b=(0,k.ym)(a);await (0,f.mkdir)(b.harnessDir,{recursive:!0});let c=function(a){let b=(0,k.ym)(a);return ag().join(b.harnessDir,"control-plane-setup.lock")}(a),e=(0,d.randomUUID)(),g=Date.now()+5e3;for(;Date.now()<g;)try{let a=await (0,f.open)(c,"wx"),b={ownerId:e,claimedAt:new Date().toISOString()};return await a.writeFile(JSON.stringify(b),"utf8"),await a.close(),{ownerId:e,lockPath:c,release:async()=>{let a=await eZ(c);a?.ownerId===e&&await (0,f.unlink)(c).catch(()=>void 0)}}}catch(a){if("EEXIST"===a.code){if(await e$(c)){await (0,f.unlink)(c).catch(()=>void 0);continue}await new Promise(a=>setTimeout(a,50));continue}throw a}throw Error("Timed out waiting for control-plane setup state lock.")}async function e0(a,b){let c=await e_(a);try{return await b()}finally{await c.release()}}let e1=new Set(["failed","timeout","no_source_deployment","verify_failed","verified"]);function e2(a){if(!a?.result)return"terminal";switch(a.result){case"unreachable":case"error":case"auth_failed":return"retryable";default:return"terminal"}}function e3(a){let b=a.pending.maxVerificationAttempts??5,c=a.pending.verificationAttemptCount;if(void 0===c)if(a.pending.verifyAttempted){let d=e2(a.signedProbe??void 0);c="verify_failed"===a.pending.status&&"retryable"===d&&Date.parse(a.pending.deadlineAt)>Date.now()?1:b}else c=0;let d={...a.pending,maxVerificationAttempts:b,verificationAttemptCount:c,phase:function(a){if(a.phase)return a.phase;switch(a.status){case"triggered":return"triggered";case"building":return"building";case"ready":return a.verificationClaim?"verifying":a.nextVerificationAttemptAt?"retry_wait":"waiting_for_ready";case"verified":return"verified";case"verify_failed":case"failed":case"timeout":case"no_source_deployment":return"terminal";default:return"waiting_for_ready"}}(a.pending)};return d.verifyAttempted&&c>=b&&"verify_failed"===d.status&&(d.phase="terminal"),d}function e4(a){var b;return!!a&&(b=a.status,!e1.has(b))}function e5(a,b=Date.now()){return"due"===e6(a,b)}function e6(a,b=Date.now()){let c=e3({pending:a}),d=c.verificationAttemptCount??0,e=c.maxVerificationAttempts??5;return"ready"!==c.status?"not_ready":d>=e?"budget_exhausted":Date.parse(c.deadlineAt)<=b?"deadline_expired":c.verificationClaim&&!function(a,b=Date.now()){let c=a.verificationClaim;if(!c?.claimedAt)return!0;let d=b-Date.parse(c.claimedAt);return Number.isNaN(d)||d>3e4}(c,b)?"claim_in_flight":c.nextVerificationAttemptAt?Date.parse(c.nextVerificationAttemptAt)<=b?"due":"waiting_for_schedule":"due"}function e7(a){let b=e3({pending:a}),c=b.verificationAttemptCount??0,d=b.maxVerificationAttempts??5;switch(b.phase){case"triggered":return"Redeploying production so new env vars take effect…";case"building":case"waiting_for_ready":return"Waiting for the production deployment…";case"verifying":return"Verifying the signed webhook…";case"retry_wait":return`Retrying signed webhook verification (attempt ${Math.min(c+1,d)} of ${d})…`;case"verified":return"Vercel settings verified.";case"terminal":return b.blockedMessage??b.message??"Vercel bridge verification requires operator action.";default:return b.message??"Applying Vercel settings…"}}function e8(a){switch(a){case"triggered":return"triggered";case"building":return"building";case"ready":return"waiting_for_ready";default:return"terminal"}}function e9(a){return{message:`Cannot resume redeploy verification because ${a} is missing from saved setup.`,nextSteps:["Return to Step 1 and save the required token in .env.local.","Then use Apply Vercel Settings again to restart verification."]}}async function fa(a){let b=a.state.vercel;if(!b)return{ok:!1,setupBlocked:e9("saved Vercel selection")};let c=await (0,ex.tl)({cwd:a.cwd,key:"VERCEL_TOKEN"})??"";if(!c.trim())return{ok:!1,setupBlocked:e9("VERCEL_TOKEN")};let d=await (0,ex.tl)({cwd:a.cwd,key:"LINEAR_API_KEY"}),e=await (0,ex.tl)({cwd:a.cwd,key:"GITHUB_TOKEN"}),f=await ey({githubToken:e,cwd:a.cwd}),g=a.pending.teamId??b.teamId,h=a.pending.projectId,i=a.pending.projectName,j=await (0,ex.tl)({cwd:a.cwd,key:"LINEAR_WEBHOOK_SECRET"}),k="generated"===a.pending.candidateSecretSource||"unreadable"===a.pending.candidateSecretSource||!!j?.trim();return{ok:!0,plan:eE({vercelToken:c,linearApiKey:d,teamId:g,projectId:h,projectName:i,preferredProductionDeploymentId:a.pending.newDeploymentId,team:{mode:"existing",teamId:g??""},project:{mode:"existing",projectId:h,projectName:i},linearTeamId:a.state.linear?.teamId,derivedHarnessTeamKey:a.state.linear?.teamKey,derivedGithubDispatchToken:f.eligible&&e?e:void 0,willGenerateLinearWebhookSecret:!!k||!j?.trim(),verificationLinearWebhookSecret:j,preserveGeneratedWebhookSecretFingerprint:k}),vercelToken:c}}async function fb(a){let b=await fa(a);if(!b.ok)return b;let c=await eH(b.plan);return c.fingerprint!==a.pending.fingerprint?(eK({phase:"poll_reconstruct",actionId:a.pending.actionId,expectedFingerprint:a.pending.fingerprint,reconstructedFingerprint:c.fingerprint,fingerprintMatch:!1,projectId:a.pending.projectId,projectName:a.pending.projectName,teamId:a.pending.teamId}),{ok:!1,setupBlocked:{message:"Persisted Step 3 setup context no longer matches the in-progress redeploy verification.",nextSteps:["Use Apply Vercel Settings again to regenerate preview and restart verification.","If the problem persists, confirm team and project selections match the original apply."]}}):{ok:!0,plan:b.plan,vercelToken:b.vercelToken}}function fc(a){let b=a?.retryReason?.trim()?` (${a.retryReason})`:"";return{message:a?.exhausted?`Signed webhook verification failed after 5 attempts${b}.`:`Production redeploy completed, but signed webhook delivery verification still failed${b}.`,nextSteps:["Use Apply Vercel Settings again after confirming the Linear webhook signing secret matches Vercel production.","If verification still fails, confirm the production deployment and webhook URL are correct."]}}function fd(a,b){return"timeout"===a?b??"Automatic production redeploy timed out before READY. Redeploy production in Vercel, then use Apply Vercel Settings again.":"failed"===a?b??"Automatic production redeploy failed. Redeploy production in Vercel, then use Apply Vercel Settings again.":"Redeploy production in Vercel, then use Apply Vercel Settings again."}function fe(a){let b=a.pending??a.vercel.redeployVerification,c=b?e3({pending:b,signedProbe:a.vercel.signedProbe}):void 0,d=a.retryApply,e=!!c,f=c?function(a){switch(a){case"triggered":return"triggered";case"building":return"building";case"ready":case"verified":case"verify_failed":return"ready";case"failed":return"failed";case"timeout":return"timeout";case"no_source_deployment":return"no_source_deployment";default:return"not_triggered"}}(c.status):"not_triggered",h=a.setupBlocked??(c?.blockedMessage?{message:c.blockedMessage,nextSteps:c.blockedNextSteps??[]}:void 0),i=a.vercel.signedProbe,j=d?.signedProbe,k=d?.signedProbeVerified??a.vercel.signedProbeVerified??!1,l=c?.phase,m=c?e7(c):void 0;return{actionId:c?.actionId??"vercel-bridge-apply",status:"applied",projectId:a.vercel.projectId,projectName:a.vercel.projectName,writtenEnvKeys:a.pending?.writtenEnvKeys??[],skippedEnvKeys:a.pending?.skippedEnvKeys??[],linearWebhookSetup:d?.linearWebhookSetup??{mode:"automated",manualSteps:[]},signedProbeVerified:k,signedProbeReason:d?.signedProbeReason??i?.reason,signedProbe:j??i,deploymentRedeployRequired:a.vercel.deploymentRedeployRequired??!1,verificationRetry:d?.verificationRetry,verified:d?.verified??k,fingerprint:c?.fingerprint??a.vercel.appliedFingerprint??"",permission:d?.permission??g.P.remoteSecretWrite,envVarsWritten:!0,signedProbeInitialResult:i,signedProbeRetryResult:j,productionRedeployTriggered:e,productionRedeployStatus:f,setupBlocked:h,setupPending:!!c&&e4(c),pollActionId:c?.actionId,orchestrationSteps:function(a){let b=[{phase:"writing_env_vars",status:"completed",message:"Writing Vercel env vars…"}];if(!a.pending)return b;let c=e3({pending:a.pending});return"no_source_deployment"===c.status?b.push({phase:"redeploying_production",status:"failed",message:c.message??"No READY production deployment was found to redeploy after env var changes."}):(b.push({phase:"redeploying_production",status:"failed"===c.status||"timeout"===c.status?"failed":"completed",message:e7({...c,phase:"building"===c.phase||"triggered"===c.phase?c.phase:"waiting_for_ready"})}),("verifying"===c.phase||"retry_wait"===c.phase||"verify_failed"===c.status||"verified"===c.status||a.apply?.verificationRetry)&&b.push({phase:"verifying_webhook",status:"verified"===c.status||a.apply?.signedProbeVerified?"completed":"verify_failed"===c.status?"failed":"active",message:e7({...c,phase:"retry_wait"===c.phase||"verifying"===c.phase?c.phase:"verifying"})})),b}({pending:c,apply:d}),orchestrationPhase:l,orchestrationStatusMessage:m,verificationAttemptCount:c?.verificationAttemptCount,maxVerificationAttempts:c?.maxVerificationAttempts}}async function ff(a){return e0(a.cwd,async()=>{let b=await (0,cV.oQ)(a.cwd),c=b?.vercel?.redeployVerification;if(!c||c.actionId!==a.pending.actionId)return null;let e=e3({pending:c,signedProbe:b?.vercel?.signedProbe});if(!e5(e))return null;let f=(e.verificationAttemptCount??0)+1,g={attemptNumber:f,claimId:(0,d.randomUUID)(),claimedAt:new Date().toISOString()},h={...e,status:"ready",phase:"verifying",verificationClaim:g,verifyAttempted:!0,updatedAt:new Date().toISOString()};return eK({phase:"verify_claim",actionId:e.actionId,pollStatus:"ready",verifyAttempted:!0,verifyOnly:!0,verificationAttemptCount:f,maxVerificationAttempts:e.maxVerificationAttempts??5,verificationClaimId:g?.claimId,projectId:e.projectId,fingerprint:e.fingerprint,candidateSecretSource:e.candidateSecretSource}),await (0,cV.xj)({vercel:{redeployVerification:h}},a.cwd),h})}async function fg(a){await e0(a.cwd,async()=>{let b=await (0,cV.oQ)(a.cwd);if(!b?.vercel)return;let c=new Date().toISOString(),d={...a.pending,status:a.status,phase:a.phase??a.pending.phase,updatedAt:c,completedAt:a.clearPending?c:a.pending.completedAt??c,message:a.message??a.pending.message,blockedMessage:a.setupBlocked?.message,blockedNextSteps:a.setupBlocked?.nextSteps,verificationAttemptCount:a.verificationAttemptCount??a.pending.verificationAttemptCount,verificationClaim:void 0,nextVerificationAttemptAt:a.nextVerificationAttemptAt,lastVerificationAttemptAt:c,lastVerificationFailureReason:a.lastVerificationFailureReason,lastVerificationFailureClass:a.lastVerificationFailureClass};await (0,cV.xj)({vercel:{...a.vercelPatch,redeployVerification:a.clearPending?void 0:d}},a.cwd)})}async function fh(a){return e0(a.cwd,async()=>{let b=await (0,cV.oQ)(a.cwd),c=b?.vercel?.redeployVerification;if(!c||c.actionId!==a.pending.actionId)return a.pending;let d={...c,status:a.status,phase:e8(a.status),updatedAt:new Date().toISOString(),message:a.message??c.message};return await (0,cV.xj)({vercel:{redeployVerification:d}},a.cwd),d})}async function fi(a){let b=a.retryResult.signedProbe,c=e2(b),d=a.claimed.verificationClaim?.attemptNumber??(a.claimed.verificationAttemptCount??0)+1,e=a.claimed.maxVerificationAttempts??5,f=d>=e;if("retryable"===c&&!f){eK({phase:"verify_retry",actionId:a.claimed.actionId,pollStatus:"ready",verifyAttempted:!0,verifyOnly:!0,verificationAttemptCount:d,maxVerificationAttempts:e,verificationFailureClass:c,signedProbeResult:b?.result,signedProbeReason:a.retryResult.signedProbeReason,signedProbeStatusCode:b?.statusCode,fingerprint:a.claimed.fingerprint}),await fg({cwd:a.cwd,pending:a.claimed,status:"ready",phase:"retry_wait",message:e7({...a.claimed,phase:"retry_wait",verificationAttemptCount:d}),verificationAttemptCount:d,nextVerificationAttemptAt:new Date(Date.now()+5e3).toISOString(),lastVerificationFailureReason:a.retryResult.signedProbeReason,lastVerificationFailureClass:c,vercelPatch:a.vercelPatch});let f=await (0,cV.oQ)(a.cwd);return fe({vercel:f.vercel,pending:f.vercel.redeployVerification,retryApply:{...a.retryResult,verificationRetry:!0}})}let g=fc({retryReason:a.retryResult.signedProbeReason,exhausted:f});eK({phase:"blocked",actionId:a.claimed.actionId,pollStatus:"verify_failed",verificationAttemptCount:d,maxVerificationAttempts:e,verificationFailureClass:c,signedProbeResult:b?.result,signedProbeReason:a.retryResult.signedProbeReason,signedProbeStatusCode:b?.statusCode,setupBlockedMessage:g.message,setupBlockedNextSteps:g.nextSteps,fingerprint:a.claimed.fingerprint}),await fg({cwd:a.cwd,pending:a.claimed,status:"verify_failed",phase:"terminal",message:g.message,setupBlocked:g,verificationAttemptCount:d,lastVerificationFailureReason:a.retryResult.signedProbeReason,lastVerificationFailureClass:c,vercelPatch:a.vercelPatch});let h=await (0,cV.oQ)(a.cwd);return fe({vercel:h.vercel,pending:h.vercel.redeployVerification,retryApply:{...a.retryResult,verificationRetry:!0},setupBlocked:g})}async function fj(a){var b;let c=await (0,cV.oQ)(a.cwd),d=c?.vercel,e=d?.redeployVerification;if(!d||!e)throw Error("No pending Vercel redeploy verification is in progress.");let f=e3({pending:e,signedProbe:d.signedProbe});if(a.actionId&&f.actionId!==a.actionId)throw Error("Pending Vercel redeploy verification action was not found.");if(b=f.status,e1.has(b))return eK({phase:"poll",actionId:f.actionId,pollStatus:f.status,orchestrationPhase:f.phase,verificationAttemptCount:f.verificationAttemptCount,maxVerificationAttempts:f.maxVerificationAttempts,projectId:f.projectId,projectName:f.projectName,teamId:f.teamId,fingerprint:f.fingerprint,setupBlockedMessage:f.blockedMessage}),fe({vercel:d,pending:f,setupBlocked:f.blockedMessage?{message:f.blockedMessage,nextSteps:f.blockedNextSteps??[]}:void 0});if(!f.newDeploymentId)throw Error("Pending Vercel redeploy verification is missing deployment id.");let g=await fb({cwd:a.cwd,state:c,pending:f});if(!g.ok){eK({phase:"blocked",actionId:f.actionId,pollStatus:"verify_failed",orchestrationPhase:"terminal",setupBlockedMessage:g.setupBlocked.message,setupBlockedNextSteps:g.setupBlocked.nextSteps,projectId:f.projectId,fingerprint:f.fingerprint}),await fg({cwd:a.cwd,pending:f,status:"verify_failed",phase:"terminal",message:g.setupBlocked.message,setupBlocked:g.setupBlocked});let b=await (0,cV.oQ)(a.cwd),c=b.vercel.redeployVerification;return fe({vercel:b.vercel,pending:c,setupBlocked:g.setupBlocked})}let h=await eu({vercelToken:g.vercelToken,newDeploymentId:f.newDeploymentId,teamId:f.teamId,sourceDeploymentId:f.sourceDeploymentId,deadlineAt:f.deadlineAt});if("failed"===h.status||"timeout"===h.status){let b={message:fd(h.status,h.message),nextSteps:["Redeploy production in Vercel manually if needed.","Use Apply Vercel Settings again to restart verification."]};eK({phase:"blocked",actionId:f.actionId,pollStatus:h.status,orchestrationPhase:"terminal",setupBlockedMessage:b.message,setupBlockedNextSteps:b.nextSteps,projectId:f.projectId,fingerprint:f.fingerprint}),await fg({cwd:a.cwd,pending:f,status:h.status,phase:"terminal",message:h.message,setupBlocked:b});let c=await (0,cV.oQ)(a.cwd),d=c.vercel.redeployVerification;return fe({vercel:c.vercel,pending:d,setupBlocked:b})}if("building"===h.status||"triggered"===h.status){eK({phase:"poll",actionId:f.actionId,pollStatus:h.status,orchestrationPhase:e8(h.status),verificationAttemptCount:f.verificationAttemptCount,projectId:f.projectId,fingerprint:f.fingerprint});let b=await fh({cwd:a.cwd,vercel:d,pending:f,status:h.status,message:h.message});return fe({vercel:{...d,redeployVerification:b},pending:b})}if("ready"!==h.status)return fe({vercel:d,pending:f});let i=await fh({cwd:a.cwd,vercel:d,pending:f,status:"ready",message:h.message});if(!e5(i)){let b=e6(i);if("deadline_expired"===b||"budget_exhausted"===b){let c="budget_exhausted"===b?fc({exhausted:!0}):{message:fd("timeout"),nextSteps:["Redeploy production in Vercel manually if needed.","Use Apply Vercel Settings again to restart verification."]};await fg({cwd:a.cwd,pending:i,status:"deadline_expired"===b?"timeout":"verify_failed",phase:"terminal",message:c.message,setupBlocked:c});let d=await (0,cV.oQ)(a.cwd),e=d.vercel.redeployVerification;return fe({vercel:d.vercel,pending:e,setupBlocked:c})}return fe({vercel:{...d,redeployVerification:i},pending:i})}let j=await ff({cwd:a.cwd,pending:i});if(!j){let b=await (0,cV.oQ)(a.cwd);return fe({vercel:b.vercel,pending:b.vercel.redeployVerification})}eK({phase:"verify_retry",actionId:j.actionId,pollStatus:"ready",verifyAttempted:!0,verifyOnly:!0,verificationAttemptCount:j.verificationClaim?.attemptNumber,maxVerificationAttempts:j.maxVerificationAttempts??5,verificationClaimId:j.verificationClaim?.claimId,projectId:j.projectId,fingerprint:j.fingerprint,candidateSecretSource:j.candidateSecretSource});let k=await eY({plan:g.plan,confirmed:!0,fingerprint:f.fingerprint,verifyOnly:!0,cwd:a.cwd}),l=await (0,cV.oQ)(a.cwd),m={productionUrl:l?.vercel?.productionUrl,webhookUrl:l?.vercel?.webhookUrl,signedProbe:k.signedProbe};return k.signedProbeVerified&&k.verified?(eK({phase:"signed_probe",actionId:j.actionId,pollStatus:"verified",orchestrationPhase:"verified",verificationAttemptCount:j.verificationClaim?.attemptNumber,signedProbeResult:k.signedProbe?.result,signedProbeReason:k.signedProbeReason,signedProbeStatusCode:k.signedProbe?.statusCode,fingerprint:j.fingerprint}),await fg({cwd:a.cwd,pending:j,status:"verified",phase:"verified",message:"Signed webhook verification passed after production redeploy.",clearPending:!0,verificationAttemptCount:j.verificationClaim?.attemptNumber,vercelPatch:{...m,signedProbeVerified:!0,deploymentRedeployRequired:!1}}),fe({vercel:(await (0,cV.oQ)(a.cwd)).vercel,pending:{...j,status:"verified",phase:"verified",completedAt:new Date().toISOString()},retryApply:k})):fi({cwd:a.cwd,claimed:j,retryResult:k,vercelPatch:{...m,signedProbeVerified:!1,deploymentRedeployRequired:!0}})}async function fk(a){let b=(0,k.ym)(a),c=await (0,h.Hn)(b),d=await (0,cV.oQ)(a),e=d?.vercel,f=function(a){var b;let c=a?.vercel?.redeployVerification;if(!c)return;let d=e3({pending:c,signedProbe:a?.vercel?.signedProbe});return{active:e4(d),terminal:(b=d.status,e1.has(b)),verified:"verified"===d.status,phase:d.phase,statusMessage:e7(d),pollActionId:d.actionId,verificationAttemptCount:d.verificationAttemptCount,maxVerificationAttempts:d.maxVerificationAttempts}}(d),g=(0,H.s5)({projectId:e?.projectId,productionUrl:e?.productionUrl,webhookUrl:e?.webhookUrl,endpointReachable:e?.endpointReachable,requiredEnvPresence:e?.envVarPresence,linearWebhookVerified:e?.linearWebhookVerified,signedProbeVerified:e?.signedProbeVerified,deploymentRedeployRequired:e?.deploymentRedeployRequired,manualComplete:e?.manualComplete,orchestrationActive:f?.active});return{controlPlane:d,vercelTokenConfigured:!!c?.presence.VERCEL_TOKEN,linearApiKeyConfigured:!!c?.presence.LINEAR_API_KEY,readiness:g,linearTeamKey:d?.linear?.teamKey,orchestration:f}}function fl(a){return a.map(a=>({id:a.id,name:a.name,accountId:a.accountId}))}function fm(a,b){return b&&a.some(a=>a.id===b)?b:1===a.length?a[0]?.id:void 0}async function fn(a){let b=await (0,cV.oQ)(a.cwd),c=b?.linear?.teamKey,d=await ey({githubToken:a.githubToken,cwd:a.cwd,harnessProvisioningSummary:a.harnessProvisioningSummary,requireVerifiedPackagedDispatchRepo:!0}),e={teamCreate:!0,projectCreate:!0};if(!a.vercelToken.trim())return{scopes:[],projects:[],harnessTeamKey:c,githubDispatch:d,capabilities:e,loadError:"VERCEL_TOKEN is required to load Vercel bridge options."};try{var f;let g=(f=await (0,eo.dk)(a.vercelToken),[{id:"",label:"Personal account (no team)",kind:"personal"},...f.map(a=>({id:a.id,label:`${a.name} (${a.slug})`,kind:"team"}))]),h=b?.vercel?.teamId??"",i=void 0!==a.teamId?a.teamId??"":h,j=g.some(a=>a.id===i)?i:fm(g,h),k=j&&j.length>0?j:void 0,l=fl(await (0,eo.Eb)(a.vercelToken,k)),m=fm(l,b?.vercel?.projectId);return{scopes:g,projects:l,selectedScopeId:j,selectedProjectId:m,harnessTeamKey:c,githubDispatch:d,capabilities:e}}catch(a){return{scopes:[],projects:[],harnessTeamKey:c,githubDispatch:d,capabilities:e,loadError:a instanceof Error?a.message:"Failed to load Vercel bridge options."}}}async function fo(a){return fl(await (0,eo.Eb)(a.vercelToken,a.teamId?.trim()?a.teamId:void 0))}function fp(){return(0,e.Vi)()}async function fq(){let a=function(a=process.env){return!function(a=process.env){return"true"===a.VITEST||"test"===a.NODE_ENV}()||a.HARNESS_VITEST_REMOTE_SETUP_MOCK,null}();if(a)return a;let b=await (0,b1.P)({cwd:fp()});if((0,b1.H)(b))return(0,X.iB)(b)}async function fr(){let a=await cT();if(a)return a;let b=await (0,b1.P)({cwd:fp()});if((0,b1.H)(b))return cS(b,{timeoutMs:6e4})}async function fs(){let a=await cT();if(a)return a;let b=await (0,b1.P)({cwd:fp()});if((0,b1.H)(b))return cS(b,{timeoutMs:5e3})}async function ft(a){let b=fp(),c=await fs();return c?dP(b,c,{debugTimings:a?.debugTimings===!0,testHangAfterStage:a?.testHangAfterStage,overallDeadlineMs:a?.overallDeadlineMs,workspaceKey:b}):{status:"failed",statusLabel:(0,c1.fA)("failed"),blockedReason:"GITHUB_TOKEN is required to check or update the managed p-dev runner.",retryAvailable:!0}}async function fu(){let a=await fr();return a?dQ(fp(),a):{previewFingerprint:"",targetSnapshotContentId:"",phases:[],blocked:!0,blockedStatus:"failed",message:"GITHUB_TOKEN is required to preview a managed p-dev runner upgrade.",impact:{replacePathCount:0,deletePathCount:0,sampleReplacePaths:[],sampleDeletePaths:[]}}}async function fv(a){var b;if(!a.confirmed)throw Error("Confirmed apply is required.");if(dp=(b={resolveProvider:async()=>fr(),execute:async(a,b)=>dT(a,b,{})}).resolveProvider,dq=b.execute,ds||(ds=!0,du()),!await fr())throw Error("GITHUB_TOKEN is required to apply a managed p-dev runner upgrade.");let c=await dS(fp(),{previewFingerprint:a.previewFingerprint,resume:!0===a.resume});return{apply:c.apply,progress:c.progress,status:{status:"updating",statusLabel:(0,c1.fA)("updating"),pendingOperationId:c.apply.operationId,pendingPhase:c.apply.phase}}}async function fw(){return c6(fp())}async function fx(a){let b=fp(),c=function(a){let b=[];return a.linearApiKey?.trim()&&b.push("LINEAR_API_KEY"),a.cursorApiKey?.trim()&&b.push("CURSOR_API_KEY"),a.harnessGithubToken?.trim()&&b.push("HARNESS_GITHUB_TOKEN"),{linearApiKey:a.linearApiKey,cursorApiKey:a.cursorApiKey,githubToken:a.harnessGithubToken,explicitCredentialReplacements:b.length>0?b:void 0}}(a),d=await (0,bU.PY)({cwd:b,payload:a});return{linearApiKey:c.linearApiKey?.trim()||d.linearApiKey,cursorApiKey:c.cursorApiKey?.trim()||d.cursorApiKey,githubToken:c.githubToken?.trim()||d.githubToken,explicitCredentialReplacements:c.explicitCredentialReplacements,credentialInputSources:d.credentialInputSources}}async function fy(){return W({cwd:fp()})}async function fz(){return b5({cwd:fp(),provider:await fq()})}async function fA(){let a=fp(),b=(0,k.ym)(a),c=await (0,h.Hn)(b),d=await (0,q.dT)({cwd:a}),e=(0,aw.Ot)()?null:await (0,E.vE)(a),f=e?(0,E.e8)(e)??void 0:void 0,g={LINEAR_API_KEY:c?.presence.LINEAR_API_KEY??!1,CURSOR_API_KEY:c?.presence.CURSOR_API_KEY??!1,GITHUB_TOKEN:c?.presence.GITHUB_TOKEN??!1,VERCEL_TOKEN:c?.presence.VERCEL_TOKEN??!1};return{env:{harnessConfigPath:c?.values.HARNESS_CONFIG_PATH??".harness/config.local.json",githubDispatchRepository:c?.values.GITHUB_DISPATCH_REPOSITORY??"",suggestedHarnessDispatchRepo:f,secretPresence:g,serviceConnectionSummaries:await fC(a,g)},config:d}}let fB={LINEAR_API_KEY:"linear",CURSOR_API_KEY:"cursor",GITHUB_TOKEN:"github",VERCEL_TOKEN:"vercel"};async function fC(a,b){return Object.fromEntries(await Promise.all(Object.keys(fB).map(async c=>{if(!b[c])return[c,{status:"missing"}];try{let b=await (0,ex.yu)({cwd:a,service:fB[c]});return[c,{status:b.status,message:b.message,label:b.label,limitation:b.limitation,checkedAt:new Date().toISOString()}]}catch(a){return[c,{status:"unknown",message:a instanceof Error?a.message:"Saved credential could not be verified.",checkedAt:new Date().toISOString()}]}})))}async function fD(a){return B({cwd:fp(),payload:a})}async function fE(a){let b=fp();return{apply:await C({cwd:b,payload:a.payload,confirmed:a.confirmed,fingerprint:a.fingerprint}),summary:await W({cwd:b})}}async function fF(a){let b=await fx(a),c=(0,j.Gn)(b);return function(a,b=[]){return{...a,manualInstructions:a.manualInstructions.map(a=>bX(a,b)),validationError:a.validationError?bX(a.validationError,b):void 0}}(await bZ({cwd:fp(),operatorInput:b,manualHarnessDispatchRepo:a.manualHarnessDispatchRepo,provider:await fq()}),c)}async function fG(a){let b=fp(),c=await fx(a.payload),d=await b$({cwd:b,operatorInput:c,manualHarnessDispatchRepo:a.payload.manualHarnessDispatchRepo,confirmed:a.confirmed,fingerprint:a.fingerprint,provider:await fq()}),[e,f]=await Promise.all([fz(),fy()]),g=await dW(b,f),h=function(a){var b;let c=a.remoteSummary,d=c?(0,F.fm)(c.harnessSecretStatuses):void 0;return{path:"automatic",applyFingerprint:a.applyResult.fingerprint,configStateFingerprint:JSON.stringify(function(a){let b=a.setupSummary.configSummary,c=(b?.repos??[]).flatMap(a=>(a.linearAssociations??[]).map(b=>`${a.id}:${b.workspaceId}:${b.teamId}:${b.projectId}`)).sort((a,b)=>a.localeCompare(b));return{configResolved:a.setupSummary.overview.configResolved,operatorConfigResolved:a.setupSummary.overview.operatorConfigResolved,linearTeamKeyFromConfig:a.controlPlaneContext?.linearTeamKeyFromConfig??null,linearTeamKeyFromControlPlane:a.controlPlaneContext?.state?.linear?.teamKey??null,associationKeys:c,repoIds:(b?.repos??[]).map(a=>a.id).sort((a,b)=>a.localeCompare(b)),repoTargets:(b?.repos??[]).map(a=>({id:a.id,targetRepo:a.targetRepo})).sort((a,b)=>a.id.localeCompare(b.id)),allowedTargetRepos:[...b?.allowedTargetRepos??[]].sort((a,b)=>a.localeCompare(b))}}({setupSummary:a.setupSummary,controlPlaneContext:a.controlPlaneContext})),harnessConfigJsonB64Written:!!(b=a.applyResult)&&b.writtenSecrets.some(a=>"HARNESS_CONFIG_JSON_B64"===a.name&&("created"===a.status||"updated"===a.status)),harnessDispatchRepo:c?.harnessDispatchRepo??a.applyResult.harnessDispatchRepo,harnessDispatchRepoResolved:c?.harnessDispatchRepoResolved,harnessDispatchRepoSource:c?.harnessDispatchRepoSource,harnessRepoAccess:c?.harnessRepoAccess,postApplyVerificationReady:c?function(a){let b=(0,F.fm)(a.harnessSecretStatuses);return a.harnessDispatchRepoResolved&&"denied"!==a.harnessRepoAccess&&b.allPresent}(c):void 0,secretPresence:d?{allPresent:d.allPresent,missing:d.missing,unknown:d.unknown}:void 0}}({applyResult:d,setupSummary:f,controlPlaneContext:g,remoteSummary:e});return{apply:d,summary:e,evidence:h}}async function fH(a){return b_({cwd:fp(),repoConfigId:a.repoConfigId,targetRepo:a.targetRepo,productionBranch:a.productionBranch,manualHarnessDispatchRepo:a.manualHarnessDispatchRepo,provider:await fq()})}async function fI(a){let b,c=await fq(),d=await b0({cwd:fp(),repoConfigId:a.payload.repoConfigId,targetRepo:a.payload.targetRepo,productionBranch:a.payload.productionBranch,manualHarnessDispatchRepo:a.payload.manualHarnessDispatchRepo,confirmed:a.confirmed,fingerprint:a.fingerprint,provider:c});return c&&"already-installed"!==d.outcome&&("pr-created"===d.outcome||"pr-updated"===d.outcome||"branch-updated"===d.outcome)&&(b=await fK({provider:c,input:{repoConfigId:a.payload.repoConfigId,targetRepo:a.payload.targetRepo,productionBranch:a.payload.productionBranch,manualHarnessDispatchRepo:a.payload.manualHarnessDispatchRepo,prUrl:d.prUrl,branchName:d.branchName}})),{apply:d,summary:await fz(),finalization:b}}async function fJ(a){let b=await fq();if(!b)throw Error("GitHub token is required for target workflow finalization");return{finalization:await fK({provider:b,input:{repoConfigId:a.repoConfigId,targetRepo:a.targetRepo,productionBranch:a.productionBranch,manualHarnessDispatchRepo:a.manualHarnessDispatchRepo,prUrl:a.prUrl,branchName:a.branchName,operationId:a.operationId}}),summary:await fz()}}async function fK(a){if(a.provider instanceof bT.Ig)return a.provider.advanceTargetWorkflowFinalization(a.input);let b=fp(),c=await (0,b1.P)({cwd:b});if(!(0,b1.H)(c))throw Error("GitHub token is required for target workflow finalization");let d=new ax.jh({token:c});return cP({cwd:b,input:a.input,provider:a.provider,client:d})}async function fL(a){return(0,ex.tl)({cwd:a,key:"LINEAR_API_KEY"})}async function fM(a){return(0,ex.tl)({cwd:a,key:"VERCEL_TOKEN"})}async function fN(a,b){let c=b.vercelToken??await fM(a)??"",d=b.linearApiKey??await fL(a),e=await (0,ex.tl)({cwd:a,key:"GITHUB_TOKEN"}),f=await (0,cV.oQ)(a),g=await f2(),h=await ey({githubToken:e,cwd:a,harnessProvisioningSummary:g,requireVerifiedPackagedDispatchRepo:!0}),i=await (0,ex.tl)({cwd:a,key:"LINEAR_WEBHOOK_SECRET"}),j=!!b.envInput?.LINEAR_WEBHOOK_SECRET?.trim(),k=!!i?.trim(),l=!j&&k;return{...b,vercelToken:c,linearApiKey:d,linearTeamId:b.linearTeamId??f?.linear?.teamId,derivedHarnessTeamKey:b.derivedHarnessTeamKey??f?.linear?.teamKey,derivedGithubDispatchToken:b.envInput?.GITHUB_DISPATCH_TOKEN?.trim()||!h.eligible?void 0:e,derivedGithubDispatchRepository:h.eligible?h.repository:void 0,willGenerateLinearWebhookSecret:!!l||(b.willGenerateLinearWebhookSecret??!j),verificationLinearWebhookSecret:b.verificationLinearWebhookSecret??i,preserveGeneratedWebhookSecretFingerprint:b.preserveGeneratedWebhookSecretFingerprint??l}}async function fO(){return d6(fp())}async function fP(){let a=fp(),b=await fL(a);if(!b?.trim())throw Error("LINEAR_API_KEY is required to load Linear workspace options.");let c=(0,dY.os)(b),[d,e,f]=await Promise.all([(0,dY.P0)(c),(0,dY.uB)(c),(0,dY.gg)(c)]);return{workspaceId:d.id,workspaceName:d.name,teams:e,projects:f}}async function fQ(){return fk(fp())}async function fR(a){let b=fp(),c=a.linearApiKey??await fL(b)??"";return(0,dZ.PA)({...a,linearApiKey:c})}async function fS(a){let b=fp(),c=a.plan.linearApiKey??await fL(b)??"";return{apply:await d5({plan:{...a.plan,linearApiKey:c},confirmed:a.confirmed,fingerprint:a.fingerprint,cwd:b}),summary:await d6(b)}}async function fT(){return d1(fp())}async function fU(a=fp()){let b=await (0,d9.$l)({cwd:a});if("nothing_to_migrate"!==b.status)return b;let c=await fL(a)??"";if(!c)return b;let d=await (0,cV.oQ)(a);if(!d?.linear?.teamId)return b;let e=(0,dY.os)(c),f=await (0,dY.P0)(e),g=await (0,d9.$l)({cwd:a,workspaceId:f.id,workspaceName:f.name});return"candidate"!==g.status?g:(0,d9.XN)({cwd:a,workspaceId:f.id,workspaceName:f.name,candidate:g.candidate})}async function fV(a=fp()){await fU(a);let b=await d6(a),c=await (0,I.rL)({baseDir:a}),d=await (0,cV.oQ)(a),e=(0,d7.Uv)(c.config),f=(0,d9.z3)(c.config),g=b.controlPlane?.linearWorkspace,h=(0,d7.sf)({config:c.config,controlPlane:d});return{summary:b,associations:e,repos:c.config.repos.map(a=>({id:a.id,targetRepo:a.targetRepo})),expectedCommittedFingerprint:f,workspaceId:c.config.linear?.workspaceId??g?.workspaceId??"",workspaceName:g?.workspaceName??"Linear workspace",driftWarnings:h}}async function fW(a){let b=fp(),c=a.linearApiKey??await fL(b)??"";return(0,ea.b)({...a,linearApiKey:c,cwd:b})}async function fX(a){let b=fp(),c=a.plan.linearApiKey??await fL(b)??"",d=await eg({plan:{...a.plan,linearApiKey:c,cwd:b},confirmed:a.confirmed,fingerprint:a.fingerprint,cwd:b}),e=await d6(b),f=await (0,I.rL)({baseDir:b});return{apply:d,summary:e,expectedCommittedFingerprint:(0,d9.z3)(f.config)}}async function fY(a){let b=fp(),c=await fM(b)??"",d=await (0,ex.tl)({cwd:b,key:"GITHUB_TOKEN"}),e=await f2();return fn({vercelToken:c,githubToken:d,cwd:b,teamId:a?.teamId,harnessProvisioningSummary:e})}async function fZ(a){let b=fp();return fo({vercelToken:await fM(b)??"",teamId:a})}async function f$(a){let b=fp();return eH(await fN(b,a))}async function f_(a){let b=fp(),c=await fN(b,a.plan);return{apply:await eY({plan:c,confirmed:a.confirmed,fingerprint:a.fingerprint,manualComplete:a.manualComplete,verifyOnly:a.verifyOnly,cwd:b}),summary:await fk(b)}}async function f0(a){let b=fp();return{apply:await fj({actionId:a.actionId,cwd:b}),summary:await fk(b)}}async function f1(){let a=function(a=process.env){return!function(a=process.env){return"true"===a.VITEST||"test"===a.NODE_ENV}()||a.HARNESS_VITEST_PROVISIONING_MOCK,null}();if(a)return a;let b=await (0,b1.P)({cwd:fp()});if((0,b1.H)(b))return(0,X.W8)(b)}async function f2(){let a=await f1();return bG({cwd:fp(),provider:a})}async function f3(){let a=fp(),b=await aK(a);return aV({cwd:a,pending:b})}async function f4(a){let b=await f1();return b?bH({cwd:fp(),provider:b,operationId:a?.operationId}):{state:"token-unavailable",fingerprint:JSON.stringify({action:"preview",tokenUnavailable:!0}),operationId:a?.operationId??(0,d.randomUUID)(),creationPreviewFingerprint:null,resumedFromPending:!1,harnessDispatchRepo:null,authenticatedLogin:null,packageName:"p-dev-harness",packageVersion:"",sourceRepository:"",sourceCommit:"",snapshotContentId:null,snapshotFingerprint:null,templateContentId:null,message:"GITHUB_TOKEN is required before provisioning a harness workspace.",recoverable:!0,willCreateRepository:!1,tokenCapabilities:{tokenType:"unknown",hasRepoScope:!1,hasWorkflowScope:!1,scopeAmbiguous:!0}}}async function f5(a){let b=await f1();if(!b)throw Error("GITHUB_TOKEN is required before provisioning a harness workspace.");let c=await bH({cwd:fp(),provider:b,operationId:a.operationId});(0,bK.fq)(a.operationId);let d="unknown";if((0,bK.aK)()){let a=await bs("file:///Users/weston/Code/agentic-product-development-harness/apps/gui/lib/setup-server.ts");d=a.ok?(0,bL.ae)(a.manifest.fileCount):"unknown",(0,bK.Lp)({type:"p_dev_workspace_provision_started",snapshotFileCountBucket:d,resumedFromDurablePendingState:c.resumedFromPending})}let e=Date.now(),f=await bI({cwd:fp(),provider:b,confirmed:a.confirmed,fingerprint:a.fingerprint,operationId:a.operationId});if((0,bK.aK)()){let a=(0,bL.Eo)(Date.now()-e);if(f.persisted){var g,h;(0,bK.Lp)({type:"p_dev_workspace_provision_completed",snapshotFileCountBucket:d,durationBucket:a,retryCountBucket:"unknown",rateLimitPauseCountBucket:"unknown",outcome:"success",resumedFromDurablePendingState:c.resumedFromPending,connectedToExistingLegacyWorkspace:(g={persisted:f.persisted,previewState:c.state}).persisted&&"valid-existing-managed-repo"===g.previewState,createdSnapshotBackedWorkspace:!!(h={persisted:f.persisted,applyState:f.state,preview:c}).persisted&&"verified-and-persisted"===h.applyState&&(h.preview.willCreateRepository||"same-name-snapshot-only-with-pending"===h.preview.state)})}else{let b=bQ(f.state);(0,bK.Lp)({type:"p_dev_workspace_provision_failed",snapshotFileCountBucket:d,durationBucket:a,retryCountBucket:"unknown",rateLimitPauseCountBucket:"unknown",failureCategory:b,resumedFromDurablePendingState:c.resumedFromPending,recoveryStateRemainedAfterFailure:f.recoverable}),bR(f.state)&&(0,bK.kS)({lifecyclePhase:"provisioning",productErrorCode:bS(f.state),errorCategory:b})}}else if(bR(f.state)){let a=bQ(f.state);(0,bK.kS)({lifecyclePhase:"provisioning",productErrorCode:bS(f.state),errorCategory:a})}return{apply:f,summary:await W({cwd:fp()}),provisioning:c}}async function f6(a){let b=fp(),c=(0,E.e8)(a.harnessDispatchRepo.trim());if(!c)return{status:"failed",repoSlug:a.harnessDispatchRepo.trim(),message:"Enter a valid GitHub repo slug or URL (owner/repo)."};let d=a.githubToken?.trim()||await (0,b1.P)({cwd:b});if(!d)return{status:"failed",repoSlug:c,message:"GITHUB_TOKEN is required to verify harness repo access. Add it in Step 1 first."};let e=(0,X.iB)(d),f=await e.checkHarnessRepoAccess(c);return"available"===f?{status:"connected",repoSlug:c,message:`Connected to ${c}.`,limitation:"This check confirms GitHub access only. Saving still happens when you create or update local setup files."}:"denied"===f?{status:"failed",repoSlug:c,message:`GitHub denied access to ${c}.`,limitation:"Confirm this is the harness repo you intend to use and that your GitHub token has admin or maintain access."}:{status:"unknown",repoSlug:c,message:`Harness repo access for ${c} could not be verified yet.`,limitation:"Retry after saving GITHUB_TOKEN in Step 1."}}async function f7(){return(0,bU.Sc)({cwd:fp()})}async function f8(a){return z({cwd:fp(),env:a})}async function f9(a){let b=fp();return await A({cwd:b,env:a.env,confirmed:a.confirmed,fingerprint:a.fingerprint}),{summary:await W({cwd:b})}}async function ga(){let a=function(a=process.env){return!function(a=process.env){return"true"===a.VITEST||"test"===a.NODE_ENV}()||a.HARNESS_VITEST_TARGET_REPO_PROVISIONING_MOCK,null}();if(a)return a;let b=await (0,b1.P)({cwd:fp()});if((0,b1.H)(b))return(0,at.createLiveGitHubTargetRepositoryProvider)(b)}async function gb(a){let b=await ga();return b?ar({request:a,provider:b,cwd:fp()}):{state:"invalid-input",fingerprint:"",operationId:a.operationId??"",creationActionId:a.creationActionId??"",createdAt:a.createdAt??"",owner:a.owner,repositoryName:a.name,repositoryFullName:`${a.owner}/${a.name}`,visibility:a.visibility??"private",description:a.description??"",initialBranches:["main","dev"],initialFilePaths:["README.md",".p-dev/product.json"],resultingTargetRepoConfigId:`target-${a.name}`,actionsWillPerform:[],actionsWillNotPerform:[],message:"GITHUB_TOKEN is required before creating a product repository.",resumedFromPending:!1}}async function gc(a){let b=await ga();if(!b)throw Error("GITHUB_TOKEN is required before creating a product repository.");return as({apply:a,provider:b,cwd:fp()})}},8846:(a,b,c)=>{c.d(b,{M:()=>e});var d=c(78505);function e(a){let b,c=a??{version:1,orchestratorMarker:"harness-orchestrator-v1",logDirectory:"runs",repos:[{id:"target-app",targetRepo:"https://github.com/owner/example-target-app",baseBranch:"main",productionBranch:"main"}],allowedTargetRepos:["https://github.com/owner/example-target-app"]},e=(0,d.bH)(c),f=(0,d.AX)(c),g="code-default";return c.agentProvider?.model?.id?(g="agentProvider.model.id",b=c.agentProvider.model.id):c.defaultModel?.id&&(g="defaultModel.id",b=c.defaultModel.id),{providerId:"cursor",resolvedModelId:e,configuredModelId:b,source:g,pinnedParams:f.params??[...d.ls],paramsControlledInCode:!0,policyNote:"Model ids are Cursor cloud agent selections. fast:false is pinned in code for cost control and is not user-editable in config."}}},11288:(a,b,c)=>{c.d(b,{C:()=>o,buildRequestedHarnessConfig:()=>u,b:()=>t});var d=c(77598),e=c(51455),f=c(96105),g=c(39676),h=c(99895),i=c(71740),j=c(47183),k=c(12884),l=c(35244),m=c(84998),n=c(73833);let o={preview:{id:"preview-linear-workspace",permission:k.P.remoteRead},apply:{id:"apply-linear-workspace",permission:k.P.linearWrite}};function p(a){return new Set(a.map(a=>(0,g.iF)(a)))}function q(a){let b=new Map;for(let c of a){let a=b.get(c.teamId)??[];a.push(c),b.set(c.teamId,a)}return b}async function r(a){let b=(0,m.ym)(a);try{await (0,e.access)(b.configLocal);let a=await (0,e.readFile)(b.configLocal,"utf8");return f.k.parse(JSON.parse(a))}catch{return null}}function s(a){return(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex").slice(0,16)}async function t(a){let b=await r(a.cwd),c=b?(0,g.Uv)(b):[],d=b?(0,h.z3)(b):"",e=await (0,n.oQ)(a.cwd),f=b?(0,g.sf)({config:b,controlPlane:e}):[],k={actionId:o.preview.id,committedFingerprint:d,requestedFingerprint:s(a.requestedAssociations),operations:[],impactSummary:{teamsToAdd:[],projectsToAdd:[],teamsToRepair:[],projectsToRepair:[],projectsToDetach:[],teamsToDetach:[],metadataBlocksToRemove:[],explicitNonActions:["Will not delete Linear teams, projects, issues, or statuses.","Will not modify Linear project-team membership in v0.4."]},driftWarnings:f,permission:o.preview.permission};if(a.expectedCommittedFingerprint!==d)return{...k,fingerprint:s({stale:"committed-fingerprint"}),validationError:"concurrent_local_edit"};let m=(0,g.Sr)(a.requestedAssociations);if(!m.ok)return{...k,fingerprint:s({invalid:m.code}),validationError:`${m.code}: project ${m.projectId} has conflicting target repos`};for(let[b,c]of q(a.requestedAssociations))if(0===c.length)return{...k,fingerprint:s({invalid:"team-without-projects"}),validationError:`Team ${b} must include at least one project before apply.`};if(!a.linearApiKey.trim())return{...k,fingerprint:s({invalid:"missing-linear-key"}),validationError:"LINEAR_API_KEY is required for Linear workspace preview."};let t=(0,i.os)(a.linearApiKey),u=await (0,i.uB)(t),v=await (0,i.gg)(t),w=p(c),x=p(a.requestedAssociations),y=[],z=new Set,A=new Set;for(let[b,d]of q(a.requestedAssociations)){let a=d[0],e=u.some(a=>a.id===b),f=c.filter(a=>a.teamId===b);e||0!==f.length||(y.push({type:"add_team",teamId:b,teamKey:a.teamKey,teamName:a.teamName?.trim()||a.teamKey}),k.impactSummary.teamsToAdd.push(a.teamKey));let h=e?await (0,i.vy)(t,b):[];for(let c of(e&&(0===f.length||(0,j.lS)(h).some(a=>"create"===a.action||"repair"===a.action||a.present&&!a.categoryMatches))&&(y.push({type:"repair_team_statuses",teamId:b,teamKey:a.teamKey}),k.impactSummary.teamsToRepair.push(a.teamKey)),d)){let a=(0,g.iF)(c);if(w.has(a))continue;let d=v.find(a=>a.id===c.projectId);if(!d)return{...k,fingerprint:s({invalid:"project-not-found"}),validationError:`Linear project ${c.projectName} was not found.`};if(!d.teamIds.includes(b))return{...k,fingerprint:s({invalid:"project-not-on-team"}),validationError:`Project ${c.projectName} is not associated with team ${c.teamKey} in Linear.`};y.push({type:"add_project_association",teamId:b,projectId:c.projectId,targetRepo:c.targetRepo}),k.impactSummary.projectsToAdd.push(`${c.teamKey}/${c.projectName}`),z.has(c.projectId)||(z.add(c.projectId),y.push({type:"repair_project_metadata",teamId:b,projectId:c.projectId,targetRepo:c.targetRepo}),k.impactSummary.projectsToRepair.push(c.projectName))}}for(let a of c){let b=(0,g.iF)(a);x.has(b)||(y.push({type:"detach_project_association",teamId:a.teamId,projectId:a.projectId}),k.impactSummary.projectsToDetach.push(`${a.teamKey}/${a.projectName}`))}let B=new Set(a.requestedAssociations.map(a=>a.teamId));for(let a of new Set(c.map(a=>a.teamId)))if(!B.has(a)){let b=c.find(b=>b.teamId===a);y.push({type:"detach_team",teamId:a,teamKey:b.teamKey}),k.impactSummary.teamsToDetach.push(b.teamKey)}let C=new Set(a.requestedAssociations.map(a=>a.projectId));for(let a of c){let b=(0,g.iF)(a);if(!x.has(b)&&!C.has(a.projectId)){if(A.has(a.projectId))continue;A.add(a.projectId),y.push({type:"remove_project_metadata_block",projectId:a.projectId,projectName:a.projectName}),k.impactSummary.metadataBlocksToRemove.push(a.projectName)}}let D=s({actionId:o.preview.id,committedFingerprint:d,requestedAssociations:a.requestedAssociations,operations:y,linearApiKeyToken:(0,l.g)(a.linearApiKey)});return{...k,operations:y,fingerprint:D}}function u(a){let b=new Map;for(let c of a.requestedAssociations){let a=b.get(c.repoConfigId)??[],d=c.teamName?.trim()||void 0;a.push({workspaceId:c.workspaceId,teamId:c.teamId,teamKey:c.teamKey,...d?{teamName:d}:{},projectId:c.projectId,projectName:c.projectName}),b.set(c.repoConfigId,a)}let c=[...b.values()].flat(),d=function(a){let b=[...new Set([a.workspaceId?.trim(),...a.associations.map(a=>a.workspaceId.trim())].filter(a=>!!a))],c=(0,g.pd)(a.associations),d={};if(1===b.length&&(d.workspaceId=b[0]),1===c.length){let b=c[0],e=a.associations.find(a=>a.teamId===b);d.teamId=b,e?.teamKey?.trim()&&(d.teamKey=e.teamKey.trim())}return d}({workspaceId:a.workspaceId,associations:c});return f.k.parse({...a.current,linear:{...a.current.linear,workspaceId:d.workspaceId,teamKey:d.teamKey,teamId:d.teamId},repos:a.current.repos.map(a=>({...a,linearAssociations:b.get(a.id)??[]}))})}},19965:(a,b,c)=>{c.d(b,{vb:()=>o,writeConfigLocal:()=>p});var d=c(51455),e=c(48161),f=c(76760),g=c.n(f),h=c(29281),i=c(12884),j=c(50615),k=c(84998);async function l(a){try{return await (0,d.access)(a),!0}catch{return!1}}async function m(a){let b=await (0,d.mkdtemp)(g().join((0,e.tmpdir)(),"harness-setup-config-")),c=g().join(b,"config.local.json");try{await (0,d.writeFile)(c,a,"utf8"),await (0,h.Z9)(c)}finally{await (0,d.rm)(b,{recursive:!0,force:!0})}}async function n(a){if(!await l(a.configExample))throw Error(`Missing source file: ${a.configExample}`);let b=await (0,d.readFile)(a.configExample,"utf8");return b.endsWith("\n")?b:`${b}
|
|
191
|
+
`}async function o(a){let{paths:b,force:c=!1,mode:e="apply"}=a,f=k.bm,g=await l(b.configLocal);if(g&&!c)return{actionId:"scaffold-config-local",outcome:"skipped",targetPath:b.configLocal,permission:i.P.localFileWrite,reason:"already exists",logMessage:`skipped ${f} (already exists)`};let h=await n(b);return"dry-run"===e?{actionId:"scaffold-config-local",outcome:g?"wouldChange":"preview",targetPath:b.configLocal,content:h,permission:i.P.localFileWrite,reason:g?"would overwrite with --force":"would create",logMessage:g?`would overwrite ${f}`:`would create ${f}`}:(await (0,d.writeFile)(b.configLocal,h,"utf8"),{actionId:"scaffold-config-local",outcome:"changed",targetPath:b.configLocal,content:h,permission:i.P.localFileWrite,reason:g?"overwrote existing file":"created new file",logMessage:`${g?"overwrote":"created"} ${f}`})}async function p(a){let{paths:b,force:c=!1,mode:e="apply"}=a,f=k.bm,g=await l(b.configLocal);if(g&&!c)return{actionId:"write-config-local",outcome:"skipped",targetPath:b.configLocal,permission:i.P.localFileWrite,reason:"already exists",logMessage:`skipped ${f} (already exists)`};let h=function(a){if(a.content)return a.content.endsWith("\n")?a.content:`${a.content}
|
|
192
|
+
`;if(a.input)return(0,j.rb)(a.input);throw Error("writeConfigLocal requires content or structured input")}(a);return(await m(h),"dry-run"===e)?{actionId:"write-config-local",outcome:g?"wouldChange":"preview",targetPath:b.configLocal,content:h,permission:i.P.localFileWrite,reason:g?"would overwrite with --force":"would create",logMessage:g?`would overwrite ${f}`:`would create ${f}`}:(await (0,d.writeFile)(b.configLocal,h,"utf8"),{actionId:"write-config-local",outcome:"changed",targetPath:b.configLocal,content:h,permission:i.P.localFileWrite,reason:g?"overwrote existing file":"created new file",logMessage:`${g?"overwrote":"created"} ${f}`})}},35244:(a,b,c)=>{c.d(b,{g:()=>d});function d(a){var b=a?.trim()??"";if(!b)return"";let c=0;for(let a=0;a<b.length;a+=1)c=(c+b.charCodeAt(a))%0x3b9aca07;return`${b.length}:${c}`}},39676:(a,b,c)=>{function d(a){return`${a.workspaceId}:${a.teamId}:${a.projectId}`}function e(a){let b=[];for(let c of a.repos)for(let a of c.linearAssociations??[])b.push({...a,targetRepo:c.targetRepo,repoConfigId:c.id});return b}function f(a){let b=new Map;for(let c of a){let a=b.get(c.projectId)??new Set;a.add(c.targetRepo),b.set(c.projectId,a)}for(let[a,c]of b.entries())if(c.size>1)return{ok:!1,code:"linear_project_target_repo_conflict",projectId:a,targetRepos:[...c]};return{ok:!0}}function g(a){return[...new Set(a.map(a=>a.teamId))]}function h(a){return a.repos.some(a=>(a.linearAssociations?.length??0)>0)}function i(a){let b=new Map;for(let c of a.associations){let a=c.teamName?.trim()||"(unnamed team)",d=b.get(c.teamId)??{teamId:c.teamId,teamKey:c.teamKey,teamName:a,projects:[]};c.teamName?.trim()&&(d.teamName=c.teamName.trim()),d.projects.some(a=>a.projectId===c.projectId)||d.projects.push({projectId:c.projectId,projectName:c.projectName,targetRepo:c.targetRepo,health:"verification_pending"}),b.set(c.teamId,d)}return{workspaceId:a.workspaceId,workspaceName:a.workspaceName,teams:[...b.values()].map(a=>({...a,health:"verification_pending"})),appliedFingerprint:a.appliedFingerprint,appliedAt:a.appliedAt,migratedFromVersion:a.migratedFromVersion,migratedAt:a.migratedAt}}function j(a){let b=[],c=a.controlPlane?.linearWorkspace;if(!c)return b;let d=e(a.config),f=c.teams.flatMap(a=>a.projects.map(b=>({workspaceId:c.workspaceId,teamId:a.teamId,projectId:b.projectId,targetRepo:b.targetRepo})));d.length!==f.length&&b.push({code:"association_count_mismatch",message:`Harness config has ${d.length} association(s) but control-plane evidence has ${f.length}.`});let g=function(a){let b=a.linear?.workspaceId?.trim();if(b)return b;let c=[...new Set(e(a).map(a=>a.workspaceId))];return 1===c.length?c[0]:void 0}(a.config);for(let a of(g&&g!==c.workspaceId&&b.push({code:"workspace_id_mismatch",message:`Harness config workspaceId (${g}) does not match control-plane (${c.workspaceId}).`}),d)){let c=f.find(b=>b.teamId===a.teamId&&b.projectId===a.projectId);if(!c){b.push({code:"project_id_mismatch",message:`Association ${a.teamId}/${a.projectId} exists in harness config but not in control-plane evidence.`,teamId:a.teamId,projectId:a.projectId});continue}c.targetRepo&&c.targetRepo!==a.targetRepo&&b.push({code:"target_repo_mismatch",message:`Target repo for ${a.projectId} differs between harness config and control-plane evidence.`,teamId:a.teamId,projectId:a.projectId})}return b}c.d(b,{Sr:()=>f,Uv:()=>e,ay:()=>i,b0:()=>h,iF:()=>d,pd:()=>g,sf:()=>j})},44341:(a,b,c)=>{c.d(b,{Wt:()=>f,YZ:()=>g,gl:()=>e});let d="Harness metadata:";function e(a){let b=[d];return a.targetRepo&&b.push(`Target repo: ${a.targetRepo}`),a.productInitialization&&b.push(`Product initialization: ${a.productInitialization}`),b.join("\n")}function f(a,b){let c=e({...function(a){if(!a?.trim())return{};let b=a.split("\n"),c=b.findIndex(a=>a.trim().toLowerCase()===d.toLowerCase());if(-1===c)return{};let e={};for(let a=c+1;a<b.length;a+=1){let c=b[a].trim();if(!c||c.startsWith("#")||c.startsWith("##"))break;let d=function(a){let b=a.match(/^([A-Za-z][A-Za-z ]*):\s*(.+)$/);return b?{key:b[1].trim().toLowerCase(),value:b[2].trim()}:null}(c);d&&("target repo"===d.key?e.targetRepo=d.value.replace(/^`|`$/g,""):"product initialization"===d.key&&("uninitialized"===d.value||"initialized"===d.value)&&(e.productInitialization=d.value))}return e}(a),...b});if(!a?.trim())return`${c}
|
|
193
|
+
`;let f=a.split("\n"),g=f.findIndex(a=>a.trim().toLowerCase()===d.toLowerCase());if(-1===g){let b=a.endsWith("\n")?"":"\n";return`${a}${b}
|
|
194
|
+
${c}
|
|
195
|
+
`}let h=g+1;for(;h<f.length;){let a=f[h].trim();if(!a||a.startsWith("#"))break;h+=1}let i=[...f.slice(0,g),c,...f.slice(h)].join("\n").replace(/\n{3,}/g,"\n\n");return i.endsWith("\n")?i:`${i}
|
|
196
|
+
`}function g(a){if(!a?.trim())return"";let b=a.split("\n"),c=b.findIndex(a=>a.trim().toLowerCase()===d.toLowerCase());if(-1===c)return a.endsWith("\n")?a:`${a}
|
|
197
|
+
`;let e=c+1;for(;e<b.length;){let a=b[e].trim();if(!a||a.startsWith("#"))break;e+=1}let f=[...b.slice(0,c),...b.slice(e)].join("\n").replace(/\n{3,}/g,"\n\n").trim();return f?`${f}
|
|
198
|
+
`:""}},47183:(a,b,c)=>{c.d(b,{IW:()=>l,TO:()=>o,jn:()=>r,nm:()=>q,v8:()=>s,lS:()=>p,kG:()=>n,PA:()=>t,Ce:()=>u});var d=c(77598),e=c(95332),f=c(71740),g=c(68615);function h(a){switch(a){case"unstarted":return"Unstarted";case"started":return"Started";case"backlog":return"Backlog";case"completed":return"Completed";case"canceled":return"Canceled";case"duplicate":return"Duplicate";default:return a}}var i=c(12884),j=c(35244),k=c(44341);let l={preview:{id:"preview-linear-setup",permission:i.P.remoteRead},apply:{id:"apply-linear-setup",permission:i.P.linearWrite}};function m(a){return(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex").slice(0,16)}function n(a){return a.trim().toLowerCase()}function o(a){let b=(0,k.gl)({targetRepo:a.targetRepo.replace(/^https:\/\/github\.com\//,""),productInitialization:"uninitialized"});return a.baseDescription?.trim()?(0,k.Wt)(a.baseDescription,{targetRepo:a.targetRepo.replace(/^https:\/\/github\.com\//,""),productInitialization:"uninitialized"}):`${b}
|
|
199
|
+
`}function p(a){let b=new Map(a.map(a=>[n(a.name),a]));return(0,e.pB)().map(a=>{let c=b.get(n(a.name)),d=!!c,e=d&&c.type===a.category,f="skip";return f=d?e?"skip":(0,g.T_)(a.name)?"repair":"manual":a.creatable?"create":"manual",{name:a.name,category:a.category,role:a.role,present:d,existingType:c?.type,existingStatusId:c?.id,categoryMatches:e,action:f,creatable:a.creatable,repairStrategy:"repair"===f?"replacement":void 0}})}function q(a,b){let c=b.teamKey.trim().toLowerCase(),d=n(b.teamName);return a.find(a=>a.key.trim().toLowerCase()===c)??a.find(a=>n(a.name)===d)}function r(a,b){let c=n(b.projectName);return a.find(a=>n(a.name)===c&&(!b.teamId||0===a.teamIds.length||a.teamIds.includes(b.teamId)))}function s(a){return a.every(a=>a.present&&a.categoryMatches)}async function t(a){let b,c,d=(0,f.P1)(),i=[],k=[];if(!a.linearApiKey.trim())return{actionId:l.preview.id,capabilities:d,teams:[],projects:[],workflowStates:[],dispatchTriggerStatuses:(0,e.Ht)(),missingStatuses:(0,e.pB)().filter(a=>a.creatable).map(a=>a.name),createActions:[],repairActions:[],manualSteps:["Add LINEAR_API_KEY in Step 1 before previewing Linear setup."],fingerprint:m({invalid:"missing-linear-key"}),permission:l.preview.permission,validationError:"LINEAR_API_KEY is required for Linear setup preview."};let n=(0,f.os)(a.linearApiKey),o=await (0,f.uB)(n),s=await (0,f.gg)(n);if("existing"===a.team.mode){if(!(b=o.find(b=>b.id===a.team.teamId))&&a.team.teamId)return{actionId:l.preview.id,capabilities:d,teams:o,projects:s,workflowStates:[],dispatchTriggerStatuses:(0,e.Ht)(),missingStatuses:[],createActions:[],repairActions:[],manualSteps:[],fingerprint:m({invalid:"team-not-found"}),permission:l.preview.permission,validationError:"Selected Linear team was not found."}}else if(a.team.teamName&&a.team.teamKey){let c=q(o,{teamKey:a.team.teamKey,teamName:a.team.teamName});c?b=c:(k.push({kind:"team",name:`${a.team.teamName} (${a.team.teamKey})`}),b={id:"pending-team",key:a.team.teamKey,name:a.team.teamName})}if("existing"===a.project.mode)c=s.find(b=>b.id===a.project.projectId);else if(a.project.projectName&&b){let d=r(s,{projectName:a.project.projectName,teamId:"pending-team"===b.id?void 0:b.id});d?c=d:(k.push({kind:"project",name:a.project.projectName}),c={id:"pending-project",name:a.project.projectName,teamIds:"pending-team"===b.id?[]:[b.id]})}let t=[],u=[];if(b&&"pending-team"!==b.id)for(let a of(t=p(await (0,f.vy)(n,b.id)),t=await Promise.all(t.map(a=>(0,g.UM)({client:n,teamId:b.id,entry:a})))))"create"===a.action&&k.push({kind:"workflow-state",name:a.name}),"manual"===a.action&&(a.present?a.categoryMatches||i.push(`${a.name} exists but uses category ${h(a.existingType??"unknown")}; harness expects ${h(a.category)}. Rename manually if needed.`):i.push(`${a.name} is Linear-managed and must be verified manually in the workspace.`)),"repair"===a.action&&a.existingStatusId&&a.existingType&&a.affectedIssueSetHash&&u.push({statusName:a.name,existingStatusId:a.existingStatusId,expectedCategory:a.category,actualCategory:a.existingType,affectedIssueCount:a.affectedIssueCount??0,affectedIssueSetHash:a.affectedIssueSetHash,repairStrategy:"replacement",explanation:"Needs Revision"===a.name?(0,g.lb)():`${a.name} must use the ${h(a.category)} category.`});else if(b)for(let a of t=(0,e.pB)().map(a=>({name:a.name,category:a.category,role:a.role,present:!1,categoryMatches:!1,action:a.creatable?"create":"manual",creatable:a.creatable})))"create"===a.action&&k.push({kind:"workflow-state",name:a.name});let v=t.filter(a=>!a.present&&a.creatable).map(a=>a.name),w=m({actionId:l.preview.id,team:a.team,project:a.project,teamId:b?.id,workflowStates:t.map(a=>({name:a.name,action:a.action,existingStatusId:a.existingStatusId,existingType:a.existingType,category:a.category,categoryMatches:a.categoryMatches,repairStrategy:a.repairStrategy,affectedIssueSetHash:a.affectedIssueSetHash})),linearApiKeyToken:(0,j.g)(a.linearApiKey)});return{actionId:l.preview.id,capabilities:d,teams:o,projects:s,selectedTeam:b,selectedProject:c,workflowStates:t,dispatchTriggerStatuses:(0,e.Ht)(),missingStatuses:v,createActions:k,repairActions:u,manualSteps:i,fingerprint:w,permission:l.preview.permission}}async function u(a){let b=(0,f.os)(a.linearApiKey),c=await (0,f.af)(b),d=a.webhookUrl.trim().replace(/\/$/,""),e=c.find(b=>{let c=b.url.trim().replace(/\/$/,"");return(!a.teamId||b.teamId===a.teamId)&&c===d&&b.enabled&&b.resourceTypes.includes("Issue")}),g=[];return e||(g.push(`Create a Linear Issue webhook pointing at ${a.webhookUrl}.`),g.push("Copy the webhook signing secret into Vercel production env var LINEAR_WEBHOOK_SECRET.")),{webhooks:c,matchingWebhook:e,manualSteps:g}}},52884:(a,b,c)=>{c.d(b,{Wy:()=>h,dH:()=>f,fA:()=>j,nE:()=>d,s_:()=>i,yH:()=>g});let d=".github/workflows/p-dev-runner-config-canary.yml",e=/<!--\s*p-dev-runner-upgrade:(\d+):([^\s>]+)\s*-->/;function f(a,b){return`<!-- p-dev-runner-upgrade:${a}:${b} -->`}function g(a){let b=a.match(e);if(!b)return null;let c=Number(b[1]);if(!Number.isInteger(c)||c<=0)return null;let d=b[2]?.trim();return d?{repositoryId:c,snapshotContentId:d}:null}function h(a){return`harness/update-runner-${a.slice(0,12)}`}function i(a){switch(a){case"verifying-managed-repository":return"Verifying managed repository";case"comparing-runner-snapshots":return"Comparing runner snapshots";case"preparing-upgrade-commit":return"Preparing upgrade commit";case"updating-managed-runner":return"Updating managed runner";case"verifying-runner-on-production-branch":return"Verifying runner on production branch";case"synchronizing-cloud-configuration":return"Synchronizing cloud configuration";case"running-configuration-canary":return"Running configuration canary"}}function j(a){switch(a){case"up_to_date":return"Up to date";case"update_available":return"Update available";case"checking":return"Checking runner version";case"updating":return"Updating";case"partially_updated":return"Partially updated";case"failed":return"Failed";case"blocked_non_managed":return"Blocked — repository is not managed";case"blocked_unexpected_remote":return"Blocked — unexpected remote changes";case"blocked_operator_conflicts":return"Blocked — operator conflicts"}}},68615:(a,b,c)=>{c.d(b,{TO:()=>n,T_:()=>j,UM:()=>l,lb:()=>k});var d=c(77598);c(86359);var e=c(71740);let f="Needs Revision",g="unstarted";class h extends Error{constructor(a,b){super(a),this.code=b,this.name="LinearWorkflowStatusRepairError"}}function i(a){return(0,d.createHash)("sha256").update(JSON.stringify([...a].sort())).digest("hex").slice(0,16)}function j(a){return a===f}function k(){return"Needs Revision means revision work is waiting to begin. Revising represents active revision work."}async function l(a){if("repair"!==a.entry.action||!a.entry.existingStatusId)return a.entry;let b=await (0,e.$l)({client:a.client,teamId:a.teamId,stateId:a.entry.existingStatusId});return{...a.entry,affectedIssueCount:b.length,affectedIssueSetHash:i(b),repairStrategy:"replacement"}}async function m(a){var b;let{client:c,teamId:d,entry:j}=a;if("repair"!==j.action||j.name!==f||!j.existingStatusId||!j.affectedIssueSetHash)throw Error("Needs Revision replacement repair requires a repair plan entry.");let k=await (0,e.$l)({client:c,teamId:d,stateId:j.existingStatusId}),l=i(k);if(l!==j.affectedIssueSetHash)throw new h("Affected issue set changed since preview. Regenerate preview before applying.","stale-issue-set");let m=await (0,e.vy)(c,d),n=m.find(a=>a.id===j.existingStatusId);if(!n)throw new h("Needs Revision status changed or is no longer present. Regenerate preview before applying.","status-changed");let o=m.find(a=>a.name===f&&a.type===g);if(n.name===f&&n.type===g)return{repaired:[`status:${f}`],replacementStatusId:n.id};if(n.name!==f||n.type===g)throw new h("Needs Revision status no longer matches the repair plan. Regenerate preview before applying.","status-changed");let p=(b=n.id,`Needs Revision leg ${b.slice(0,8)}`),q=n.id,r=o?.id;if(n.name===f){let a=n.name;try{await (0,e.np)(c,{id:n.id,name:p}),n=(m=await (0,e.vy)(c,d)).find(a=>a.id===q)}catch(a){throw a}if(!r)try{r=(await (0,e.Iy)(c,{teamId:d,name:f,type:g})).id}catch(b){throw await (0,e.np)(c,{id:q,name:a}),new h(b instanceof Error?b.message:"Failed to create replacement Needs Revision status.","create-failed")}}else if(!r)throw new h("Replacement Needs Revision status is missing after legacy rename. Regenerate preview before applying.","verification-failed");if(!r)throw new h("Replacement Needs Revision status could not be resolved.","verification-failed");let s=[];for(let a of k)try{await (0,e.BE)(c,{issueId:a,stateId:r}),s.push(a)}catch(a){throw new h(a instanceof Error?a.message:"Issue migration failed for Needs Revision repair.","migration-incomplete")}let t=await (0,e.$l)({client:c,teamId:d,stateId:q});if(t.length>0)throw new h(`Issue migration incomplete: ${t.length} issue(s) remain on the legacy Needs Revision status.`,"migration-incomplete");let u=(m=await (0,e.vy)(c,d)).filter(a=>a.name===f&&a.type===g);if(1!==u.length)throw new h("Needs Revision replacement verification failed.","verification-failed");if(l===i(k)&&0===t.length)try{await (0,e.Wx)(c,q)}catch{}return{repaired:[`status:${f}`],replacementStatusId:u[0].id}}async function n(a){let b=[];for(let c of a.entries)if("repair"===c.action){if(c.name===f){let d=await m({client:a.client,teamId:a.teamId,entry:c});b.push(...d.repaired);continue}throw Error(`Unsupported workflow status repair for ${c.name}.`)}return b}},99895:(a,b,c)=>{c.d(b,{$l:()=>n,XN:()=>p,z3:()=>j});var d=c(77598),e=c(51455),f=c(96105),g=c(39676),h=c(73833),i=c(84998);function j(a){let b=(0,g.Uv)(a).map(a=>({workspaceId:a.workspaceId,teamId:a.teamId,teamKey:a.teamKey,projectId:a.projectId,projectName:a.projectName,targetRepo:a.targetRepo,repoConfigId:a.repoConfigId}));return(0,d.createHash)("sha256").update(JSON.stringify(b)).digest("hex").slice(0,16)}function k(a){for(let b=0;b<a.repos.length;b+=1){let c=a.repos[b],d=c.linearProjects?.[0]?.trim(),e=c.linearTeams?.[0]?.trim()??a.linear?.teamKey?.trim();if(d||e)return{repoIndex:b,projectName:d,teamKey:e}}return{repoIndex:0}}async function l(a){let b=(0,i.ym)(a);try{await (0,e.access)(b.configLocal);let a=await (0,e.readFile)(b.configLocal,"utf8");return f.k.parse(JSON.parse(a))}catch{return null}}async function m(a){let b=(0,i.ym)(a.cwd),{writeConfigLocal:d}=await Promise.resolve().then(c.bind(c,19965));await d({paths:b,content:`${JSON.stringify(a.config,null,2)}
|
|
200
|
+
`,force:!0})}async function n(a={}){let b=await l(a.cwd);if(!b)return{status:"nothing_to_migrate"};if((0,g.b0)(b))return{status:"already_migrated",fingerprint:j(b)};let c=await (0,h.oQ)(a.cwd),d=a.workspaceId?.trim(),e=a.workspaceName?.trim();if(!d||!e)return{status:"nothing_to_migrate"};let i=function(a){if((0,g.b0)(a.config))return null;let b=a.controlPlane?.linear,c=b?.teamId?.trim()??a.config.linear?.teamId?.trim(),d=b?.teamKey?.trim()??a.config.linear?.teamKey?.trim(),e=b?.projectId?.trim(),h=b?.projectName?.trim()??k(a.config).projectName;if(!c||!d||!e||!h)return null;let{repoIndex:i}=k(a.config),j=a.config.repos[i];if(!j)return null;let l={workspaceId:a.workspaceId,teamId:c,teamKey:d,projectId:e,projectName:h,targetRepo:j.targetRepo,repoConfigId:j.id},m=[l],n=(0,g.ay)({workspaceId:a.workspaceId,workspaceName:a.workspaceName,associations:m,appliedFingerprint:b?.appliedFingerprint,appliedAt:b?.appliedAt,migratedFromVersion:"singular-linear-selection",migratedAt:new Date().toISOString()});b?.statusCoverageComplete&&(n.teams=n.teams.map(a=>a.teamId===c?{...a,health:"healthy",lastVerifiedAt:b.appliedAt,projects:a.projects.map(a=>a.projectId===e?{...a,health:"healthy",lastVerifiedAt:b.appliedAt}:a)}:a));let o=a.config.repos.map((a,b)=>b===i?{...a,linearAssociations:[l]}:a),p=f.k.parse({...a.config,linear:{...a.config.linear,workspaceId:a.workspaceId,teamKey:d,teamId:c},repos:o});return{workspaceId:a.workspaceId,workspaceName:a.workspaceName,associations:m,evidence:n,configPatch:p}}({config:b,controlPlane:c,workspaceId:d,workspaceName:e});return i?{status:"candidate",candidate:i}:{status:"nothing_to_migrate"}}let o=Promise.resolve();async function p(a){let b,c=async()=>{let b=await l(a.cwd);if(!b)return{status:"nothing_to_migrate"};if((0,g.b0)(b))return{status:"already_migrated",fingerprint:j(b)};await m({cwd:a.cwd,config:a.candidate.configPatch});let c={...await (0,h.oQ)(a.cwd)??{version:1},version:1,linearWorkspace:a.candidate.evidence};return await (0,h.PY)(c,a.cwd),{status:"applied",fingerprint:j(a.candidate.configPatch),evidence:a.candidate.evidence}},d=o;o=new Promise(a=>{b=a}),await d;try{return await c()}finally{b()}}}};
|