diff --git a/.github/workflows/agent-cli-provisioning.yml b/.github/workflows/agent-cli-provisioning.yml new file mode 100644 index 000000000..3f2b0662f --- /dev/null +++ b/.github/workflows/agent-cli-provisioning.yml @@ -0,0 +1,81 @@ +name: Agent CLI Provisioning Check + +on: + workflow_dispatch: + workflow_call: + +jobs: + verify-agent-clis: + name: Verify provisioned agent CLIs + runs-on: [self-hosted, codex, Linux] + timeout-minutes: 10 + permissions: + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@v5 + with: + persist-credentials: false + + - name: Verify selected CLI binary and headless contract + shell: bash + env: + AGENT_PROVIDER: ${{ vars.AGENT_PROVIDER || 'codex' }} + FINDINGS_PROVIDER: ${{ vars.FINDINGS_PROVIDER }} + FIXER_PROVIDER: ${{ vars.FIXER_PROVIDER }} + PLANNER_PROVIDER: ${{ vars.PLANNER_PROVIDER }} + REVIEWER_PROVIDER: ${{ vars.REVIEWER_PROVIDER }} + TESTER_PROVIDER: ${{ vars.TESTER_PROVIDER }} + AGENT_EXECUTABLE: ${{ vars.AGENT_EXECUTABLE }} + FINDINGS_EXECUTABLE: ${{ vars.FINDINGS_EXECUTABLE }} + FIXER_EXECUTABLE: ${{ vars.FIXER_EXECUTABLE }} + PLANNER_EXECUTABLE: ${{ vars.PLANNER_EXECUTABLE }} + REVIEWER_EXECUTABLE: ${{ vars.REVIEWER_EXECUTABLE }} + TESTER_EXECUTABLE: ${{ vars.TESTER_EXECUTABLE }} + run: | + set -euo pipefail + + providers=("$AGENT_PROVIDER" "$FINDINGS_PROVIDER" "$FIXER_PROVIDER" "$PLANNER_PROVIDER" "$REVIEWER_PROVIDER" "$TESTER_PROVIDER") + executables=("$AGENT_EXECUTABLE" "$FINDINGS_EXECUTABLE" "$FIXER_EXECUTABLE" "$PLANNER_EXECUTABLE" "$REVIEWER_EXECUTABLE" "$TESTER_EXECUTABLE") + checked="" + for index in "${!providers[@]}"; do + provider="${providers[$index]}" + [[ -z "${provider// }" ]] && continue + case "$provider" in + opencode) expected_executable=opencode ;; + codex) expected_executable=codex ;; + cursor) expected_executable=agent ;; + *) echo "Unsupported agent provider: $provider" >&2; exit 1 ;; + esac + executable="${executables[$index]:-$expected_executable}" + [[ "${executable##*/}" == "$expected_executable" ]] || { echo "Invalid $provider executable basename." >&2; exit 1; } + if ! command -v "$executable" >/dev/null 2>&1; then + [[ "$executable" == "$expected_executable" ]] || { echo "Configured executable is missing: $executable" >&2; exit 1; } + install_home="$RUNNER_TEMP/copilot-agent-$provider-$GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT" + mkdir -p "$install_home" + case "$provider" in + codex) + curl -fsSL https://chatgpt.com/codex/install.sh | env HOME="$install_home" CODEX_HOME="$install_home/.codex" CODEX_INSTALL_DIR="$install_home/bin" CODEX_NON_INTERACTIVE=1 sh + export PATH="$install_home/bin:$PATH" + ;; + opencode) + curl -fsSL https://opencode.ai/install | env HOME="$install_home" bash -s -- --no-modify-path + export PATH="$install_home/.opencode/bin:$PATH" + ;; + cursor) + curl -fsSL https://cursor.com/install | env HOME="$install_home" bash + export PATH="$install_home/.local/bin:$PATH" + ;; + esac + fi + actual_version="$("$executable" --version | head -n 1)" + [[ -n "${actual_version// }" ]] || { echo "$provider returned empty version output" >&2; exit 1; } + case "$provider" in + codex) "$executable" exec --help >/dev/null ;; + opencode) "$executable" run --help >/dev/null ;; + cursor) "$executable" --help >/dev/null ;; + esac + [[ " $checked " == *" $provider "* ]] || checked="$checked $provider" + done + + echo "Agent CLI contract passed for: $checked." diff --git a/.github/workflows/copilot_credential_health.yml b/.github/workflows/copilot_credential_health.yml new file mode 100644 index 000000000..e87c82a3b --- /dev/null +++ b/.github/workflows/copilot_credential_health.yml @@ -0,0 +1,170 @@ +name: Copilot - Credential Health + +on: + workflow_dispatch: + inputs: + check_pat: + description: Check the workflow PAT against GitHub + required: false + default: false + type: boolean + check_openai: + description: Check OPENAI_API_KEY + required: false + default: false + type: boolean + check_anthropic: + description: Check ANTHROPIC_API_KEY + required: false + default: false + type: boolean + check_google: + description: Check GOOGLE_API_KEY + required: false + default: false + type: boolean + check_openrouter: + description: Check OPENROUTER_API_KEY + required: false + default: false + type: boolean + check_cursor: + description: Check CURSOR_API_KEY + required: false + default: false + type: boolean + check_opencode: + description: Check OPENCODE_API_KEY + required: false + default: false + type: boolean + check_codex_api_key: + description: Check CODEX_API_KEY + required: false + default: false + type: boolean + +permissions: + contents: read + +jobs: + verify-pat: + if: ${{ inputs.check_pat }} + name: Verify PAT + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Validate PAT without exposing its value + shell: bash + env: + PAT: ${{ secrets.PAT }} + run: | + set -euo pipefail + [[ -n "${PAT:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; } + curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $PAT" -H 'Accept: application/vnd.github+json' https://api.github.com/user >/dev/null + curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $PAT" -H 'Accept: application/vnd.github+json' "https://api.github.com/repos/${GITHUB_REPOSITORY}" >/dev/null + + verify-openai: + if: ${{ inputs.check_openai }} + name: Verify OPENAI_API_KEY + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Validate OpenAI key without exposing its value + shell: bash + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + run: | + set -euo pipefail + [[ -n "${OPENAI_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; } + curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $OPENAI_API_KEY" https://api.openai.com/v1/models >/dev/null + + verify-anthropic: + if: ${{ inputs.check_anthropic }} + name: Verify ANTHROPIC_API_KEY + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Validate Anthropic key without exposing its value + shell: bash + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + run: | + set -euo pipefail + [[ -n "${ANTHROPIC_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; } + curl --fail --silent --show-error --location --max-time 20 -H "x-api-key: $ANTHROPIC_API_KEY" -H 'anthropic-version: 2023-06-01' https://api.anthropic.com/v1/models >/dev/null + + verify-google: + if: ${{ inputs.check_google }} + name: Verify GOOGLE_API_KEY + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Validate Google key without exposing its value + shell: bash + env: + GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} + run: | + set -euo pipefail + [[ -n "${GOOGLE_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; } + curl --fail --silent --show-error --location --max-time 20 "https://generativelanguage.googleapis.com/v1beta/models?key=$GOOGLE_API_KEY" >/dev/null + + verify-openrouter: + if: ${{ inputs.check_openrouter }} + name: Verify OPENROUTER_API_KEY + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Validate OpenRouter key without exposing its value + shell: bash + env: + OPENROUTER_API_KEY: ${{ secrets.OPENROUTER_API_KEY }} + run: | + set -euo pipefail + [[ -n "${OPENROUTER_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; } + curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $OPENROUTER_API_KEY" https://openrouter.ai/api/v1/models >/dev/null + + verify-cursor: + if: ${{ inputs.check_cursor }} + name: Verify CURSOR_API_KEY + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Validate Cursor key without exposing its value + shell: bash + env: + CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }} + run: | + set -euo pipefail + [[ -n "${CURSOR_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; } + curl --fail --silent --show-error --location --max-time 20 -u "$CURSOR_API_KEY:" 'https://api.cursor.com/analytics/ai-code/changes?startDate=30d&page=1&pageSize=1' >/dev/null + + verify-opencode: + if: ${{ inputs.check_opencode }} + name: Verify OPENCODE_API_KEY + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Validate OpenCode key without exposing its value + shell: bash + env: + OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }} + run: | + set -euo pipefail + [[ -n "${OPENCODE_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; } + curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $OPENCODE_API_KEY" https://opencode.ai/zen/v1/models >/dev/null + + verify-codex-api-key: + if: ${{ inputs.check_codex_api_key }} + name: Verify CODEX_API_KEY + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Validate Codex API key without exposing its value + shell: bash + env: + CODEX_API_KEY: ${{ secrets.CODEX_API_KEY }} + run: | + set -euo pipefail + [[ -n "${CODEX_API_KEY:-}" ]] || { echo 'Required credential is missing.' >&2; exit 1; } + curl --fail --silent --show-error --location --max-time 20 -H "Authorization: Bearer $CODEX_API_KEY" https://api.openai.com/v1/models >/dev/null diff --git a/build/cli/index.js b/build/cli/index.js index 509375720..a17ac74ad 100755 --- a/build/cli/index.js +++ b/build/cli/index.js @@ -44188,6 +44188,7 @@ function mergeSetupOverrides(fileOverrides, flagOverrides) { return { ...fileOverrides, ...flagOverrides, + runners: { ...fileOverrides.runners, ...flagOverrides.runners }, features: { ...fileOverrides.features, ...flagOverrides.features }, agents, repository: { ...fileOverrides.repository, ...flagOverrides.repository }, @@ -47479,7 +47480,7 @@ function validSetupBatchAssetPath(path) { return false; return path === 'AGENTS.md' || path === '.agents/skills/copilot-repository-workflow/SKILL.md' || /^\.github\/(?:workflows|ISSUE_TEMPLATE)\/[A-Za-z0-9_.-]+\.(?:yml|yaml)$/u.test(path) - || path === '.github/pull_request_template.md' || /^\.copilot\/(?:repository-profile|setup-manifest)\.json$/u.test(path) + || path === '.github/pull_request_template.md' || /^\.copilot\/(?:repository-profile|setup-manifest|runner-profile)\.json$/u.test(path) || path === '.copilot/AGENT_GUIDE.md' || path.startsWith('.copilot/setup-backups/'); } function validBranch(value) { @@ -47577,6 +47578,7 @@ function buildSetupBatchView(plan, operation, phase, retryRemaining) { if (!receipt || receipt.repositoryId !== target.target.id) throw new Error('Setup receipt identity mismatch.'); return { repositoryId: target.target.id, repository: `${target.target.owner}/${target.target.name}`, status: receipt.status, + ...(target.installationReview ? { installationReview: target.installationReview } : {}), installationBranch: (0, setup_batch_policy_1.setupBatchBranch)(plan.operationId), baseBranch: target.target.defaultBranch, baseSha: target.target.baseSha, blockers: [...target.blocked], files: target.files.map(file => ({ path: file.path, content: file.content })), repositoryVariables: target.repositoryVariables.map(variable => variable.name), @@ -47610,6 +47612,8 @@ function cloneSetupConfiguration(configuration) { ])); return { ...configuration, + ...(configuration.runners ? { runners: { ...configuration.runners, labels: [...configuration.runners.labels], + ...(configuration.runners.source ? { source: { ...configuration.runners.source } } : {}) } } : {}), features: { ...configuration.features }, agents, repository: { @@ -47667,6 +47671,7 @@ const deployment_configuration_1 = __nccwpck_require__(22495); const locale_1 = __nccwpck_require__(15386); const issue_workflow_profile_1 = __nccwpck_require__(26744); const pull_request_approval_policy_1 = __nccwpck_require__(98820); +const setup_runner_1 = __nccwpck_require__(94301); exports.SETUP_AGENT_TASKS = [ 'planner', 'findings', @@ -47724,6 +47729,7 @@ function createDefaultSetupConfiguration() { const agents = Object.fromEntries(exports.SETUP_AGENT_TASKS.map(task => [task, defaultRole()])); const features = Object.fromEntries(Object.keys(exports.SETUP_FEATURE_DESCRIPTIONS).map(feature => [feature, feature !== 'inactiveIssueClosure'])); return { + runners: { ...setup_runner_1.DEFAULT_SETUP_RUNNERS, labels: [] }, features, agents, repository: { @@ -47813,6 +47819,8 @@ function mergeSetupConfiguration(base, overrides = {}) { } return { ...base, + runners: { ...setup_runner_1.DEFAULT_SETUP_RUNNERS, ...base.runners, ...overrides.runners, + labels: [...(overrides.runners?.labels ?? base.runners?.labels ?? [])] }, features, agents, repository: { ...base.repository, ...(overrides.repository ?? {}) }, @@ -47902,6 +47910,7 @@ function buildSetupPlan(configuration, mergeQueueReadiness = [], approvalReadine .filter(file => configuration.features.release !== false || file !== 'release.yml') .filter(file => configuration.features.hotfix !== false || file !== 'hotfix.yml'); const selectedFiles = [ + ...(configuration.runners && configuration.runners.mode !== 'retain' ? ['.copilot/runner-profile.json'] : []), ...workflowFiles.map(file => `workflows/${file}`), ...issueTemplateFiles.map(file => `ISSUE_TEMPLATE/${file}`), ...(configuration.features.pullRequestTemplate === false ? [] : ['pull_request_template.md']), @@ -47961,6 +47970,7 @@ function setupPlanGuardPaths(plan) { repository_agent_guidance_policy_1.REPOSITORY_AGENT_GUIDE_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_SKILL_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_POINTER_PATH, + '.copilot/runner-profile.json', ]; return [...new Set([...selected, ...retiredCandidates, ...guidanceCandidates])].sort(); } @@ -48474,8 +48484,10 @@ const issue_workflow_profile_1 = __nccwpck_require__(26744); const setup_issue_workflow_policy_1 = __nccwpck_require__(81182); const pull_request_approval_policy_1 = __nccwpck_require__(98820); const setup_project_selection_policy_1 = __nccwpck_require__(73750); +const setup_runner_policy_1 = __nccwpck_require__(91027); function validateSetupConfiguration(configuration, options = {}) { const errors = []; + errors.push(...(0, setup_runner_policy_1.validateSetupRunners)(configuration.runners)); const projectSelection = (0, setup_project_selection_policy_1.parseSetupProjectSelection)(configuration.projects.ids); if ('error' in projectSelection || projectSelection.value !== configuration.projects.ids) { errors.push('Project IDs must be a comma-separated list of 1–10 distinct positive Project URL numbers; PVT_ node IDs are not accepted.'); @@ -49928,6 +49940,7 @@ const QUERY_PERMISSIONS = { Projects: 'organization_projects', // GitHub's PAT form documents this organization permission as "members". Members: 'members', + 'Self-hosted runners': 'organization_self_hosted_runners', }, }; class UnsupportedSetupPatLinkError extends Error { @@ -49996,6 +50009,8 @@ const setup_token_permission_policy_1 = __nccwpck_require__(99590); /** Local inputs with explicit precedence are decisions, not questions. */ function fixedSetupPatIntentQuestionIds(overrides, skipVariables, skipSecrets) { const fixed = []; + if (overrides.runners?.discover !== undefined) + fixed.push('runners.discover'); for (const feature of ['issues', 'pullRequests', 'release', 'hotfix']) { if (overrides.features?.[feature] !== undefined) fixed.push(`features.${feature}`); @@ -50163,6 +50178,8 @@ const docs = { /** Links are selected from source-controlled constants, never derived from answers or remote text. */ function setupQuestionDocumentation(question) { const id = question.id; + if (id.startsWith('runners.')) + return { title: 'Runner profiles', url: 'https://docs.page/vypdev/copilot/configuration#runner-profiles' }; if (id === 'issueWorkflows.enabled') return docs.issueWorkflows; if (id === 'features.issues') @@ -50309,6 +50326,7 @@ function frenchQuestionExplanation(question, documentation) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setupQuestionPresentation = setupQuestionPresentation; +const setup_runner_guidance_policy_1 = __nccwpck_require__(10741); const setup_question_translations_1 = __nccwpck_require__(3927); const setup_question_documentation_policy_1 = __nccwpck_require__(75280); const setup_question_purpose_policy_1 = __nccwpck_require__(77947); @@ -50383,6 +50401,8 @@ const section = { storage: { en: { summary: 'Choose where GitHub Actions Variables and Secrets live.', when: 'Applies when provisioning is enabled.', example: 'Repository scope is the simplest default.', effect: 'Affects visibility, permission grants, and precedence.', verify: 'Check the selected scope and shadow warnings in the plan.' }, es: { summary: 'Elige dónde se guardan Variables y Secrets de GitHub Actions.', when: 'Se aplica si activaste su configuración.', example: 'El ámbito de repositorio es el predeterminado más sencillo.', effect: 'Afecta a visibilidad, permisos y precedencia.', verify: 'Revisa el ámbito y los avisos de superposición en el plan.' } }, }; function setupQuestionPresentation(question) { + if (setup_runner_guidance_policy_1.SETUP_RUNNER_QUESTION_IDS.includes(question.id)) + return (0, setup_runner_guidance_policy_1.setupRunnerGuidance)(question); const copy = special[question.id] ?? section[question.stateId]; const purpose = (0, setup_question_purpose_policy_1.setupQuestionPurpose)(question); const documentation = (0, setup_question_documentation_policy_1.setupQuestionDocumentation)(question); @@ -50949,13 +50969,14 @@ function setupQuestionPurposeFrPt(question, locale) { /***/ }), /***/ 77947: -/***/ ((__unused_webpack_module, exports) => { +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.setupQuestionPurposes = void 0; exports.setupQuestionPurpose = setupQuestionPurpose; +const setup_runner_guidance_policy_1 = __nccwpck_require__(10741); /** Field-specific meaning for choices whose label alone is easy to misinterpret. */ exports.setupQuestionPurposes = { 'issueWorkflows.enabled': { en: 'Choose the issue workflows Copilot may run; each type has different branch, label and automation effects.', es: 'Elige los flujos de issues que podrá ejecutar Copilot; cada tipo tiene efectos distintos sobre ramas, etiquetas y automatización.' }, @@ -51007,6 +51028,10 @@ exports.setupQuestionPurposes = { manageRepositorySecrets: { en: 'Allow setup to validate and install required GitHub Actions Secrets, including the bot PAT when needed.', es: 'Permite a setup validar e instalar Secrets de GitHub Actions, incluido el PAT del bot cuando haga falta.' }, }; function setupQuestionPurpose(question) { + if (setup_runner_guidance_policy_1.SETUP_RUNNER_QUESTION_IDS.includes(question.id)) { + const presentation = (0, setup_runner_guidance_policy_1.setupRunnerGuidance)(question); + return { en: presentation.en.summary, es: presentation.es.summary }; + } const exact = exports.setupQuestionPurposes[question.id]; if (exact) return exact; @@ -51204,9 +51229,11 @@ const setup_configuration_clone_policy_1 = __nccwpck_require__(85881); const setup_configuration_defaults_1 = __nccwpck_require__(23381); const issue_workflow_profile_1 = __nccwpck_require__(26744); const setup_project_selection_policy_1 = __nccwpck_require__(73750); +const setup_runner_question_policy_1 = __nccwpck_require__(91198); const AGENT_PROVIDERS = ['codex', 'opencode', 'cursor']; const MODEL_PROVIDERS = ['openai', 'anthropic', 'google', 'openrouter', 'opencode', 'local']; const PERMISSION_INTENT_QUESTION_IDS = new Set([ + 'runners.discover', 'features.issues', 'features.pullRequests', 'issueWorkflows.enabled', 'pullRequestApproval.mode', 'projects.enabled', 'manageRepositoryVariables', 'manageRepositorySecrets', @@ -51360,7 +51387,11 @@ function transitionSetupQuestionnaire(state, event, context = {}) { const configureIndependently = state.question.id === 'agents.configureIndependently' ? Boolean(parsed.value) : state.configureIndependently; - const draft = applyAnswer(state.draft, state.question, parsed.value, state.configureIndependently); + const runnerAnswer = state.question.id.startsWith('runners.') + ? (0, setup_runner_question_policy_1.applySetupRunnerAnswer)(state.draft, state.question, String(parsed.value), context) : undefined; + if (runnerAnswer?.error) + return { ...state, validation: runnerAnswer.error }; + const draft = runnerAnswer?.configuration ?? applyAnswer(state.draft, state.question, parsed.value, state.configureIndependently); draft.createInitialTag = (0, setup_issue_workflow_policy_1.setupNeedsInitialVersion)(draft); const projectsWanted = state.question.id === 'projects.enabled' ? Boolean(parsed.value) : state.projectsWanted; const answeredQuestionIds = [...(state.answeredQuestionIds ?? []), state.question.id]; @@ -51454,6 +51485,7 @@ function definitions() { choices: ['prompt', 'create-if-missing', 'disabled'], applies: draft => draft.repositoryAgentGuidance.enabled, }, + ...(0, setup_runner_question_policy_1.setupRunnerQuestions)(), ...setup_configuration_defaults_1.SETUP_AGENT_TASKS.map((task) => ({ stateId: 'agent-runtime', id: `agents.${task}.provider`, label: `${formatTask(task)} runtime`, kind: 'choice', choices: AGENT_PROVIDERS, })), @@ -51652,7 +51684,7 @@ function toQuestion(definition, draft, context) { const projectCandidates = context.projectDiscovery?.candidates ?? []; const projectStatus = statusQuestion ? (0, setup_project_selection_policy_1.sharedProjectStatusOptions)(draft.projects.ids, projectCandidates) : undefined; - return { + return (0, setup_runner_question_policy_1.setupRunnerQuestion)({ stateId: definition.stateId, id: definition.id, label: definition.label, @@ -51687,7 +51719,7 @@ function toQuestion(definition, draft, context) { ? { suggestionSource: context.branchSources.development } : {}), ...((definition.id === 'issueWorkflows.enabled' || definition.id === 'features.issues') && context.fixedWorkflowFeatures ? { fixedWorkflowFeatures: context.fixedWorkflowFeatures } : {}), - }; + }, context); } function readPath(configuration, path, allowedNames) { const value = path.split('.').reduce((current, key) => current[key], configuration); @@ -52018,6 +52050,363 @@ function setupSecretRevisionSnapshot(remote) { } +/***/ }), + +/***/ 10741: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SETUP_RUNNER_QUESTION_IDS = void 0; +exports.setupRunnerGuidance = setupRunnerGuidance; +const copy = { + en: { labels: ['Where should Copilot jobs run?', 'Reusable runner profile', 'Existing runner group (empty uses labels)', 'Exact runner labels, comma-separated', 'Ordinary validation runner'], + summary: 'Keep installed routing, choose GitHub-hosted jobs, or explicitly select an existing self-hosted profile.', + where: 'Changes generated workflow runs-on values; runner access, Secrets and authentication are separate.', + how: 'Retain keeps existing jobs. Hosted explicitly replaces managed agent/validation routes. A reusable profile comes from COPILOT_RUNNER_PROFILES; manual entry needs exact existing group and labels.', + why: 'Different job roles have different trust and runtime requirements.', effect: 'Credential verification stays hosted; observer and publication routes stay independent. Native source workflows remain visible exceptions. Nothing grants access or falls back silently.', + verify: 'Review effective YAML, repository access and runner authentication. Busy/offline means pending capacity; unknown access needs verification.', example: 'Group vypdev; labels self-hosted,codex,Linux; ordinary validation hosted.' }, + es: { labels: ['¿Dónde deben ejecutarse los jobs de Copilot?', 'Perfil de runners reutilizable', 'Grupo de runners existente (vacío usa etiquetas)', 'Etiquetas exactas del runner, separadas por comas', 'Runner para validaciones ordinarias'], + summary: 'Conserva las rutas instaladas, elige runners de GitHub o selecciona expresamente un perfil self-hosted existente.', + where: 'Cambia runs-on en los workflows generados; acceso, Secrets y autenticación se verifican por separado.', + how: 'Conservar mantiene los jobs existentes. GitHub sustituye expresamente las rutas gestionadas de agente y validación. Un perfil reutilizable procede de COPILOT_RUNNER_PROFILES; la entrada manual necesita el grupo y las etiquetas exactos.', + why: 'Cada tipo de job tiene requisitos de confianza y ejecución distintos.', effect: 'La verificación de credenciales permanece en GitHub; observador y publicación conservan rutas independientes. Los workflows nativos se muestran como excepciones. No se concede acceso ni se cambia de entorno automáticamente.', + verify: 'Revisa YAML, acceso del repositorio y autenticación del runner. Ocupado o desconectado indica capacidad pendiente; acceso desconocido requiere verificación.', example: 'Grupo vypdev; etiquetas self-hosted,codex,Linux; validación ordinaria en GitHub.' }, + fr: { labels: ['Où exécuter les jobs Copilot ?', 'Profil de runners réutilisable', 'Groupe existant (vide utilise les étiquettes)', 'Étiquettes exactes séparées par des virgules', 'Runner de validation ordinaire'], + summary: 'Conservez les routes installées, choisissez GitHub ou sélectionnez explicitement un profil auto-hébergé existant.', + where: 'Modifie runs-on dans les workflows générés ; accès, Secrets et authentification restent distincts.', + how: 'Conserver maintient les jobs existants. GitHub remplace explicitement les routes gérées. Le profil partagé provient de COPILOT_RUNNER_PROFILES ; la saisie manuelle exige le groupe et les étiquettes exacts.', + why: 'Chaque rôle a des exigences de confiance et d’exécution distinctes.', effect: 'La vérification des identifiants reste sur GitHub ; observation et publication gardent leurs routes. Les workflows natifs restent des exceptions visibles. Aucun accès accordé ni repli automatique.', + verify: 'Vérifiez le YAML, l’accès du dépôt et l’authentification. Occupé/hors ligne indique une capacité en attente ; l’accès inconnu doit être vérifié.', example: 'Groupe vypdev ; étiquettes self-hosted,codex,Linux ; validation sur GitHub.' }, + pt: { labels: ['Onde executar os jobs do Copilot?', 'Perfil reutilizável de runners', 'Grupo existente (vazio usa etiquetas)', 'Etiquetas exatas separadas por vírgulas', 'Runner de validação normal'], + summary: 'Mantenha as rotas instaladas, escolha GitHub ou selecione explicitamente um perfil self-hosted existente.', + where: 'Altera runs-on nos workflows gerados; acesso, Secrets e autenticação são independentes.', + how: 'Manter conserva os jobs existentes. GitHub substitui explicitamente as rotas geridas. O perfil partilhado vem de COPILOT_RUNNER_PROFILES; a entrada manual exige grupo e etiquetas exatos.', + why: 'Cada função tem requisitos de confiança e execução diferentes.', effect: 'A verificação de credenciais permanece no GitHub; observador e publicação mantêm rotas independentes. Workflows nativos são exceções visíveis. Não concede acesso nem muda automaticamente de ambiente.', + verify: 'Reveja YAML, acesso do repositório e autenticação. Ocupado/offline indica capacidade pendente; acesso desconhecido exige verificação.', example: 'Grupo vypdev; etiquetas self-hosted,codex,Linux; validação normal no GitHub.' }, +}; +const fields = ['mode', 'profileId', 'group', 'labels', 'validation']; +exports.SETUP_RUNNER_QUESTION_IDS = [...fields, 'discover'].map(field => `runners.${field}`); +const discoveryCopy = { + en: ['Discover existing runners and groups?', 'Optional: prefill repository Administration read and organization Self-hosted runners read in the setup PAT link. Disabled by default; exact manual routing needs neither discovery grant.', 'Temporary setup PAT only. Discovery reads inventory after PAT verification, never changes runner access, and keeps exact manual routing available when skipped or denied.'], + es: ['¿Consultar los runners y grupos existentes?', 'Opcional: incluye Administration de repositorio y Self-hosted runners de organización en lectura en el enlace del PAT. Desactivado por defecto; puedes indicar una ruta manual exacta sin estos permisos de consulta.', 'Solo afecta al PAT temporal de setup. Consulta el inventario tras verificarlo, nunca cambia el acceso a runners y permite indicar la ruta manual si se omite o deniega la consulta.'], + fr: ['Consulter les runners et groupes existants ?', 'Facultatif : préremplit Administration du dépôt et Self-hosted runners de l’organisation en lecture dans le lien PAT. Désactivé par défaut ; une route manuelle exacte reste possible sans ces droits de consultation.', 'Concerne uniquement le PAT temporaire. Consulte l’inventaire après vérification, ne modifie jamais les accès et permet une route manuelle si la consultation est ignorée ou refusée.'], + pt: ['Consultar runners e grupos existentes?', 'Opcional: inclui Administration do repositório e Self-hosted runners da organização em leitura no link do PAT. Desativado por padrão; uma rota manual exata continua disponível sem estas permissões de consulta.', 'Afeta apenas o PAT temporário. Consulta o inventário após a verificação, nunca altera o acesso e permite uma rota manual se a consulta for ignorada ou negada.'], +}; +function setupRunnerGuidance(question) { + const index = fields.indexOf(question.id.slice('runners.'.length)); + return Object.fromEntries(Object.entries(copy).map(([locale, value]) => [locale, { + label: question.id === 'runners.discover' ? discoveryCopy[locale][0] : value.labels[index], + summary: question.id === 'runners.discover' ? discoveryCopy[locale][1] : value.summary, when: value.where, where: question.id === 'runners.discover' ? discoveryCopy[locale][2] : value.where, + how: question.id === 'runners.discover' ? discoveryCopy[locale][1] : value.how, why: value.why, + effect: question.id === 'runners.discover' ? discoveryCopy[locale][2] : value.effect, verify: value.verify, example: value.example, + documentation: { title: value.labels[0], url: 'https://docs.page/vypdev/copilot/configuration#runner-profiles' }, + }])); +} + + +/***/ }), + +/***/ 14706: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.setupRunnerInstallationSummary = setupRunnerInstallationSummary; +const setup_runner_policy_1 = __nccwpck_require__(91027); +function routeBlock(route) { + const json = JSON.stringify(route, null, 2); + const longest = (json.match(/`+/g) ?? []).reduce((length, run) => Math.max(length, run.length), 2); + const fence = '`'.repeat(longest + 1); + return [`${fence}json`, json, fence]; +} +/** Public installation PR content. Registry values and credentials never enter it. */ +function setupRunnerInstallationSummary(plan) { + const review = plan.installationReview; + const runners = plan.configuration.runners; + if (!review && (!runners || runners.mode === 'retain')) + return ''; + const jobs = review?.jobs ?? []; + const assets = review?.assets ?? []; + const route = (0, setup_runner_policy_1.selectedSetupRunsOn)(runners, 'agent'); + return ['\n\n## Runner routing and installation parity', + `**Profile choice:** ${runners?.mode ?? 'retain'}. Existing native source workflows remain per-job exceptions.`, + `**Reviewed plan:** \`${plan.digest}\`.`, + ...(route ? ['Selected managed agent route:', ...routeBlock(route)] : ['Installed per-job routing is retained.']), + `**Observations:** ${jobs.filter(job => job.status === 'pending-capacity').length} pending capacity; ${jobs.filter(job => job.status === 'access-unknown').length} access unverified; ${jobs.filter(job => job.status === 'unavailable').length} unavailable.`, + `**Parity:** ${assets.filter(asset => asset.status === 'source-only').length} source extensions; ${assets.filter(asset => asset.status === 'missing').length} missing assets (including disabled optional capabilities); ${assets.filter(asset => asset.status === 'customized').length} customized; ${assets.filter(asset => asset.status === 'incompatible').length} incompatible metadata retained or blocked before regeneration.`, + 'Inspect the complete Files changed view and `.copilot/runner-profile.json`. Any replacements retain setup backups under `.copilot/setup-backups/`.', + 'Runner access, capacity and agent authentication are separate. Selection grants no group access and never falls back to another runner. Human merge and actual trusted workflow verification remain pending.', + ].join('\n'); +} + + +/***/ }), + +/***/ 91027: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.validSetupRunnerProfile = validSetupRunnerProfile; +exports.parseSetupRunnerProfiles = parseSetupRunnerProfiles; +exports.setupRunnerRegistry = setupRunnerRegistry; +exports.validateSetupRunners = validateSetupRunners; +exports.selectSetupRunnerMode = selectSetupRunnerMode; +exports.setupRunnerProfileIsFresh = setupRunnerProfileIsFresh; +exports.reusableSetupRunnerDefaults = reusableSetupRunnerDefaults; +exports.setupRunnerRole = setupRunnerRole; +exports.selectedSetupRunsOn = selectedSetupRunsOn; +exports.setupRunnerReadiness = setupRunnerReadiness; +const setup_runner_1 = __nccwpck_require__(94301); +const sensitive_text_1 = __nccwpck_require__(47122); +const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value); +const exact = (value, keys) => Object.keys(value).every(key => keys.includes(key)); +const literal = (value, empty = false) => typeof value === 'string' && value.length <= 100 + && (empty || value.trim().length > 0) && value === value.trim() && !/[\p{Cc}\p{Cf}${}<>]/u.test(value) + && (0, sensitive_text_1.redactSensitiveText)(value) === value; +const id = (value) => typeof value === 'string' && /^[A-Za-z0-9][A-Za-z0-9_.-]{0,49}$/u.test(value) + && (0, sensitive_text_1.redactSensitiveText)(value) === value; +function validSetupRunnerProfile(value) { + if (!object(value) || !exact(value, ['id', 'group', 'labels', 'validation']) || !id(value.id) + || !literal(value.group, true) || !['hosted', 'agent'].includes(String(value.validation)) + || !Array.isArray(value.labels) || value.labels.length < 1 || value.labels.length > 10 + || !value.labels.every(label => literal(label))) + return false; + const labels = value.labels.map(label => label.toLowerCase()); + return new Set(labels).size === labels.length && labels.includes('self-hosted') + && !labels.includes('windows') && (labels.includes('linux') || labels.includes('macos')); +} +function parseSetupRunnerProfiles(value) { + if (value.length > 16000) + return undefined; + try { + const parsed = JSON.parse(value); + if (!object(parsed) || !exact(parsed, ['schemaVersion', 'profiles']) || parsed.schemaVersion !== 1 + || !Array.isArray(parsed.profiles) || parsed.profiles.length < 1 || parsed.profiles.length > 10 + || !parsed.profiles.every(validSetupRunnerProfile)) + return undefined; + const profiles = parsed.profiles; + if (new Set(profiles.map(profile => profile.id.toLowerCase())).size !== profiles.length) + return undefined; + return profiles.map(profile => ({ ...profile, labels: [...profile.labels] })); + } + catch { + return undefined; + } +} +/** A repository override shadows the organization registry even when it is invalid. */ +function setupRunnerRegistry(remote) { + // Unknown repository inventory cannot prove that a higher-priority override is absent. + // A readable organization registry alone must not authorize selecting or reusing its route. + if (!remote || remote.repositoryVariablesAccess !== 'available') + return { profiles: [], status: 'unavailable' }; + const repository = remote.repositoryVariables.filter(variable => variable.name.toUpperCase() === setup_runner_1.SETUP_RUNNER_REGISTRY); + const organization = remote.organizationVariables.filter(variable => variable.name.toUpperCase() === setup_runner_1.SETUP_RUNNER_REGISTRY); + const entries = repository.length ? repository : organization; + if (!repository.length && remote.organizationVariablesAccess !== 'available') + return { profiles: [], status: 'unavailable' }; + if (!entries.length) + return { profiles: [], status: 'missing' }; + const profiles = entries.length === 1 ? parseSetupRunnerProfiles(entries[0].value) : undefined; + const scope = repository.length ? 'repository' : 'organization'; + return profiles ? { profiles, status: 'available', scope, source: { scope, value: entries[0].value } } + : { profiles: [], status: 'invalid', scope }; +} +function validateSetupRunners(value) { + if (value === undefined) + return []; + const invalid = ['Runner configuration is invalid. Choose retain/hosted, or an exact Linux/macOS self-hosted profile; review group, unique labels and registry version.']; + if (!object(value) || !exact(value, ['mode', 'profileId', 'group', 'labels', 'validation', 'source', 'discover']) + || value.discover !== undefined && typeof value.discover !== 'boolean' + || !['retain', 'hosted', 'organization-profile', 'manual-self-hosted'].includes(String(value.mode)) + || !literal(value.group, true) || typeof value.profileId !== 'string' + || !Array.isArray(value.labels) || !['hosted', 'agent'].includes(String(value.validation))) + return invalid; + if (value.mode === 'retain' || value.mode === 'hosted') + return value.group === '' && value.profileId === '' + && value.labels.length === 0 && value.validation === 'hosted' && value.source === undefined ? [] : invalid; + if (!validSetupRunnerProfile({ id: value.profileId || 'manual', group: value.group, labels: value.labels, validation: value.validation })) + return invalid; + if (value.mode === 'manual-self-hosted') + return value.profileId === '' && value.source === undefined ? [] : invalid; + if (!id(value.profileId) || !object(value.source) || !exact(value.source, ['scope', 'value']) + || !['repository', 'organization'].includes(String(value.source.scope)) || typeof value.source.value !== 'string') + return invalid; + const selected = parseSetupRunnerProfiles(value.source.value)?.find(profile => profile.id === value.profileId); + return selected && selected.group === value.group && selected.validation === value.validation + && JSON.stringify(selected.labels) === JSON.stringify(value.labels) ? [] : invalid; +} +function selectSetupRunnerMode(mode) { + return mode === 'manual-self-hosted' + ? { mode, profileId: '', group: '', labels: ['self-hosted', 'Linux'], validation: 'hosted' } + : { ...setup_runner_1.DEFAULT_SETUP_RUNNERS, mode, labels: [] }; +} +function setupRunnerProfileIsFresh(configuration, remote) { + if (configuration?.mode !== 'organization-profile') + return true; + const registry = setupRunnerRegistry(remote); + return registry.status === 'available' && registry.source?.scope === configuration.source?.scope + && registry.source?.value === configuration.source?.value; +} +/** A prior target supplies visible defaults only; registry overrides resolve again for this target. */ +function reusableSetupRunnerDefaults(previous, remote) { + if (!previous || previous.mode === 'retain') + return undefined; + if (previous.mode === 'organization-profile') { + const registry = setupRunnerRegistry(remote); + const profile = registry.profiles.find(profile => profile.id === previous.profileId); + if (!profile) + return undefined; + return { mode: previous.mode, profileId: profile.id, group: profile.group, labels: [...profile.labels], validation: profile.validation, source: registry.source, + ...(previous.discover !== undefined ? { discover: previous.discover } : {}) }; + } + return { ...previous, labels: [...previous.labels] }; +} +/** Security roles are fixed by the template catalog, never guessed from user job names. */ +function setupRunnerRole(file, job) { + const agentJobs = { + 'copilot_issue.yml': 'copilot-issues', 'copilot_issue_comment.yml': 'copilot-issues', + 'copilot_pull_request.yml': 'copilot-pull-requests', 'copilot_pull_request_comment.yml': 'copilot-pull-requests', + 'copilot_commit.yml': 'copilot-commits', 'agent-cli-provisioning.yml': 'verify-agent-clis', + }; + if (agentJobs[file] === job) + return 'agent'; + if (file === 'copilot_pull_request_approval.yml' && job === 'observe-approval') + return 'observer'; + if (file === 'copilot_pull_request_merge_queue.yml' && job === 'copilot-pull-request-required-check') + return 'isolated'; + if (['release_workflow.yml', 'hotfix_workflow.yml'].includes(file)) { + if (['publish', 'publish-npm'].includes(job)) + return 'publication'; + if (['validate', 'prepare-version-files', 'promote', 'resume-reconciliation', 'report-failure'].includes(job)) + return 'validation'; + } + const helperJobs = { + 'copilot_branch_sync.yml': ['branch-sync'], 'copilot_close_inactive_issues.yml': ['copilot-inactive-issues'], + 'copilot_pull_request_review_state.yml': ['copilot-pull-request-review-state'], + 'copilot_deployment_orchestration.yml': ['resolve-operation', 'mutate'], + 'copilot_credential_health.yml': ['verify-pat', 'verify-openai', 'verify-anthropic', 'verify-google', 'verify-openrouter', 'verify-cursor', 'verify-opencode', 'verify-codex-api-key'], + }; + return helperJobs[file]?.includes(job) ? file === 'copilot_credential_health.yml' ? 'credential-health' : 'validation' : undefined; +} +function selectedSetupRunsOn(configuration, role) { + if (!configuration || configuration.mode === 'retain' || role === undefined + || ['observer', 'publication', 'isolated'].includes(role)) + return undefined; + if (role === 'credential-health') + return 'ubuntu-latest'; + if (configuration.mode === 'hosted' || role === 'validation' && configuration.validation === 'hosted') + return 'ubuntu-latest'; + return configuration.group ? { group: configuration.group, labels: [...configuration.labels] } : [...configuration.labels]; +} +function setupRunnerReadiness(route, inventory) { + if (JSON.stringify(route).includes('${{')) + return 'access-unknown'; + const group = typeof route === 'object' && !Array.isArray(route) ? route.group : undefined; + const raw = typeof route === 'string' || Array.isArray(route) ? route : route.labels; + const labels = (typeof raw === 'string' ? [raw] : raw ?? []).map(label => label.toLowerCase()); + if (!group && labels.length === 1 && /^(ubuntu|macos|windows)-(latest|[0-9][a-z0-9.-]*)$/u.test(labels[0])) + return 'hosted'; + if (!inventory || inventory.status !== 'available') + return 'access-unknown'; + const matches = inventory.candidates.filter(candidate => (!group || candidate.group === group) + && labels.every(label => candidate.labels.some(actual => actual.toLowerCase() === label))); + if (!matches.length) + return group && inventory.groups.some(candidate => candidate.name === group && candidate.access === 'confirmed') + ? 'unavailable' : 'access-unknown'; + const authorized = matches.filter(candidate => candidate.access === 'confirmed'); + if (!authorized.length) + return 'access-unknown'; + return authorized.some(candidate => candidate.status === 'online' && !candidate.busy) ? 'ready' : 'pending-capacity'; +} + + +/***/ }), + +/***/ 91198: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.setupRunnerQuestions = setupRunnerQuestions; +exports.setupRunnerQuestion = setupRunnerQuestion; +exports.applySetupRunnerAnswer = applySetupRunnerAnswer; +const setup_runner_1 = __nccwpck_require__(94301); +const setup_runner_policy_1 = __nccwpck_require__(91027); +function setupRunnerQuestions() { + const manual = (draft) => draft.runners?.mode === 'manual-self-hosted'; + return [ + { stateId: 'agent-runtime', id: 'runners.discover', label: 'Discover existing runners and groups (optional read-only PAT permissions)?', kind: 'boolean', + read: (draft) => draft.runners?.discover ?? false }, + { stateId: 'agent-runtime', id: 'runners.mode', label: 'Where should Copilot jobs run?', kind: 'choice', + choices: ['retain', 'hosted', 'organization-profile', 'manual-self-hosted'], read: (draft) => draft.runners?.mode ?? 'retain' }, + { stateId: 'agent-runtime', id: 'runners.profileId', label: 'Reusable runner profile', kind: 'choice', + applies: (draft) => draft.runners?.mode === 'organization-profile' }, + { stateId: 'agent-runtime', id: 'runners.group', label: 'Existing runner group (empty selects by labels)', kind: 'text', applies: manual }, + { stateId: 'agent-runtime', id: 'runners.labels', label: 'Exact runner labels, comma-separated (include self-hosted and Linux or macOS)', kind: 'text', + read: (draft) => draft.runners.labels.join(','), applies: manual }, + { stateId: 'agent-runtime', id: 'runners.validation', label: 'Ordinary validation jobs: hosted, or the selected agent runner?', kind: 'choice', + choices: ['hosted', 'agent'], applies: manual }, + ]; +} +function setupRunnerQuestion(question, context) { + if (!question.id.startsWith('runners.') || question.id === 'runners.discover') + return question; + const registry = (0, setup_runner_policy_1.setupRunnerRegistry)(context.remote); + return { ...question, runnerProfiles: registry.profiles, runnerRegistryStatus: registry.status, runnerRegistryScope: registry.scope, runnerInventory: context.runnerInventory, + ...(question.id === 'runners.mode' ? { choices: ['retain', 'hosted', ...(registry.status === 'available' ? ['organization-profile'] : []), 'manual-self-hosted'] } : {}), + ...(question.id === 'runners.profileId' ? { choices: registry.profiles.map(profile => profile.id) } : {}) }; +} +function applySetupRunnerAnswer(configuration, question, input, context) { + const current = configuration.runners ?? setup_runner_1.DEFAULT_SETUP_RUNNERS; + let runners; + if (question.id === 'runners.discover') { + return { configuration: { ...configuration, runners: { ...current, discover: input === 'true' } } }; + } + else if (question.id === 'runners.mode') { + const mode = input; + if (mode === 'organization-profile') { + const registry = (0, setup_runner_policy_1.setupRunnerRegistry)(context.remote); + const profile = registry.profiles.find(profile => profile.id === current.profileId) ?? registry.profiles[0]; + if (!profile) + return { error: 'No valid effective runner registry is available. Enter an exact manual profile or repair COPILOT_RUNNER_PROFILES.' }; + runners = { mode, profileId: profile.id, group: profile.group, labels: [...profile.labels], validation: profile.validation, source: registry.source }; + } + else + runners = (0, setup_runner_policy_1.selectSetupRunnerMode)(mode); + } + else if (question.id === 'runners.profileId') { + const registry = (0, setup_runner_policy_1.setupRunnerRegistry)(context.remote); + const profile = registry.profiles.find(profile => profile.id === input); + if (!profile) + return { error: 'The selected runner profile is unavailable. Review the registry or enter a manual profile.' }; + runners = { mode: 'organization-profile', profileId: profile.id, group: profile.group, labels: [...profile.labels], validation: profile.validation, source: registry.source }; + } + else if (question.id === 'runners.labels') { + const labels = input.split(',').map(label => label.trim()); + if (!(0, setup_runner_policy_1.validSetupRunnerProfile)({ id: 'manual', group: current.group, labels, validation: current.validation })) { + return { error: 'Use 1–10 unique literal labels including self-hosted and Linux or macOS. Expressions and Windows service routes are unsupported.' }; + } + runners = { ...current, labels }; + } + else if (question.id === 'runners.group') { + if (!(0, setup_runner_policy_1.validSetupRunnerProfile)({ id: 'manual', group: input, labels: current.labels, validation: current.validation })) { + return { error: 'Enter an existing literal runner group of at most 100 characters, or leave it empty. Expressions and control characters are unsupported.' }; + } + runners = { ...current, group: input }; + } + else + runners = { ...current, validation: input }; + return { configuration: { ...configuration, runners: { ...runners, + ...(current.discover !== undefined ? { discover: current.discover } : {}) } } }; +} + + /***/ }), /***/ 64662: @@ -52161,6 +52550,7 @@ exports.buildSetupPatPermissionRequirements = buildSetupPatPermissionRequirement exports.buildConfiguredSetupPatPermissionRequirements = buildConfiguredSetupPatPermissionRequirements; exports.buildSetupOrganizationReusePermissionRequirements = buildSetupOrganizationReusePermissionRequirements; exports.buildSetupBatchPatPermissionRequirements = buildSetupBatchPatPermissionRequirements; +exports.withSetupRunnerDiscoveryPermissions = withSetupRunnerDiscoveryPermissions; exports.buildSetupPatIntentPermissionRequirements = buildSetupPatIntentPermissionRequirements; exports.buildSetupPatIntentUncertainty = buildSetupPatIntentUncertainty; exports.requiredSetupPatPermissionDelta = requiredSetupPatPermissionDelta; @@ -52254,9 +52644,25 @@ function buildSetupBatchPatPermissionRequirements(configuration, remote, grants })), ]); } +/** Optional inventory grants are disclosed and prefilled, never mandatory for manual routing. */ +function withSetupRunnerDiscoveryPermissions(requirements, configuration, ownerKind) { + const required = [...requirements]; + if (configuration.runners?.discover) { + const discovery = [ + requirement({ role: 'setup', scope: 'repository', permission: 'Administration', level: 'read', + applicability: 'conditional', condition: 'Optional runner discovery selected', + reason: 'List existing repository self-hosted runners without changing access.', probe: 'administration' }), + ...(ownerKind === 'Organization' ? [requirement({ role: 'setup', scope: 'organization', permission: 'Self-hosted runners', level: 'read', + applicability: 'conditional', condition: 'Optional organization runner discovery selected', + reason: 'List existing eligible runner groups and their runners; manual routing remains available without this grant.', probe: 'runner-groups' })] : []), + ]; + required.push(...discovery.filter(candidate => !required.some(item => item.scope === candidate.scope && item.permission === candidate.permission))); + } + return required; +} /** Local requirements plus disclosed health prerequisites for selected Secret management. */ function buildSetupPatIntentPermissionRequirements(configuration, ownerKind, projectsWanted = configuration.projects.ids.trim().length > 0) { - const required = buildSetupPatRequirements(configuration, ownerKind === 'Organization', undefined, projectsWanted); + const required = withSetupRunnerDiscoveryPermissions(buildSetupPatRequirements(configuration, ownerKind === 'Organization', undefined, projectsWanted), configuration, ownerKind); if (!configuration.manageRepositorySecrets) return required; // Prefill these possible health-check grants without treating unknown remote @@ -56134,6 +56540,7 @@ exports.ensureRepositorySecrets = ensureRepositorySecrets; exports.resolveRemoteConfiguration = resolveRemoteConfiguration; exports.groupSetupResources = groupSetupResources; const setup_remote_facts_policy_1 = __nccwpck_require__(92567); +const setup_runner_policy_1 = __nccwpck_require__(91027); const setup_configuration_policy_1 = __nccwpck_require__(56637); const logging_ports_1 = __nccwpck_require__(6152); const application_error_1 = __nccwpck_require__(75999); @@ -56228,13 +56635,24 @@ async function ensureRepositorySecrets(context, dependencies, setupConfiguration } } async function resolveRemoteConfiguration(context, dependencies, setupConfiguration, errors) { + let runnerRemote; + if (setupConfiguration?.runners?.mode === 'organization-profile') { + try { + runnerRemote = await dependencies.setupRemoteConfigurationReadPort?.inspect(); + } + catch { /* Unknown cannot establish profile freshness. */ } + if (!runnerRemote || !(0, setup_runner_policy_1.setupRunnerProfileIsFresh)(setupConfiguration.runners, runnerRemote)) { + errors.push('The reviewed runner registry changed or is unavailable. No changes were made; inspect and approve a fresh profile snapshot.'); + return undefined; + } + } if (context.setupConfigurationSource === 'organization') { if (!context.setupRemoteConfiguration || !dependencies.setupRemoteConfigurationReadPort) { errors.push('Organization reuse requires a fresh inventory before Apply. No changes were made.'); return undefined; } try { - const fresh = await dependencies.setupRemoteConfigurationReadPort.inspect(); + const fresh = runnerRemote ?? await dependencies.setupRemoteConfigurationReadPort.inspect(); if (!(0, setup_remote_facts_policy_1.hasCompleteSetupSecretRevisions)(fresh) || !(0, setup_remote_facts_policy_1.hasCompleteSetupSecretRevisions)(context.setupRemoteConfiguration)) { errors.push('Retained Secret revision metadata could not be verified. Restore metadata access and prepare a fresh plan. No changes were made.'); return undefined; @@ -56250,6 +56668,8 @@ async function resolveRemoteConfiguration(context, dependencies, setupConfigurat return undefined; } } + if (runnerRemote) + return runnerRemote; if (context.setupRemoteConfiguration) return context.setupRemoteConfiguration; if (!dependencies.setupRemoteConfigurationReadPort || !setupConfiguration) @@ -61674,6 +62094,7 @@ const setup_organization_variable_reuse_policy_2 = __nccwpck_require__(63882); const setup_batch_access_policy_1 = __nccwpck_require__(15486); const setup_configuration_validation_1 = __nccwpck_require__(13339); const setup_interaction_cancelled_error_1 = __nccwpck_require__(38313); +const setup_runner_policy_1 = __nccwpck_require__(91027); /** Sequential read-only planning; shared namespace metadata is inspected once per operation. */ class PrepareSetupBatchUseCase { constructor(ports) { @@ -61740,16 +62161,25 @@ class PrepareSetupBatchUseCase { } blocked.push(...access.missing.map(name => `${name}: provision or authorize this existing binding separately, then inspect again.`)); let files = []; + let installationReview; if (!blocked.length) { try { const existing = await this.ports.inventory.files(target, request.token); - files = await this.ports.renderer.render(configuration, existing); + const review = await this.ports.renderer.review?.(configuration, existing); + if (review) { + const inventory = configuration.runners?.discover ? await this.ports.runnerDiscovery?.discover(target.owner, target.name, request.token, 'Organization') + .catch(() => ({ status: 'unavailable', candidates: [], groups: [] })) : undefined; + installationReview = { ...review, jobs: review.jobs.map(job => ({ ...job, status: (0, setup_runner_policy_1.setupRunnerReadiness)(job.runsOn, inventory) })) }; + blocked.push(...review.blockers); + } + if (!blocked.length) + files = await this.ports.renderer.render(configuration, existing); } catch { blocked.push('Setup files could not be inspected or rendered within the fixed asset budget. Inspect this target before retrying; other ready targets can continue.'); } } - const basis = { target, configuration, remote, files, repositoryVariables: access.variables.repositoryWrites, grants, sharedSnapshot: access.sharedSnapshot, blocked }; + const basis = { target, configuration, remote, files, ...(installationReview ? { installationReview } : {}), repositoryVariables: access.variables.repositoryWrites, grants, sharedSnapshot: access.sharedSnapshot, blocked }; // The desired contract stays stable after our own grants and Variable writes. // Observed facts are freshly reviewed and revalidated, never persisted as values. const digest = this.ports.renderer.digest(JSON.stringify({ target, configuration, files, @@ -62857,6 +63287,7 @@ exports.SetupTokenPermissionsUseCase = SetupTokenPermissionsUseCase; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.SetupWizardUseCase = void 0; exports.buildInitialSetupConfiguration = buildInitialSetupConfiguration; +const setup_runner_policy_1 = __nccwpck_require__(91027); const setup_remote_facts_policy_1 = __nccwpck_require__(92567); const application_error_1 = __nccwpck_require__(75999); const setup_configuration_policy_1 = __nccwpck_require__(56637); @@ -62934,7 +63365,10 @@ class SetupWizardUseCase { && (request.permissionIntent?.projectsWanted !== false || request.revision?.group === 'projects') && request.remoteTarget && this.dependencies.projectDiscovery ? await this.dependencies.projectDiscovery.discover(request.remoteTarget.owner, projectOwnerType, request.remoteTarget.token).catch(() => ({ status: 'unavailable', candidates: [] })) : undefined; + let runnerInventory = initial.runners?.discover && request.remoteTarget && this.dependencies.runnerDiscovery + ? await this.dependencies.runnerDiscovery.discover(request.remoteTarget.owner, request.remoteTarget.repository, request.remoteTarget.token, projectOwnerType).catch(() => ({ status: 'unavailable', candidates: [], groups: [] })) : undefined; let context = { + ...(runnerInventory ? { runnerInventory } : {}), ...(remoteConfiguration ? { remote: remoteConfiguration } : {}), branchSources: { main: explicitMainBranch ? 'configuration' : remoteConfiguration?.defaultBranch ? 'github' : 'default', development: request.overrides?.repository?.developmentBranch !== undefined ? 'configuration' @@ -62948,6 +63382,7 @@ class SetupWizardUseCase { projectsWanted: request.revision.group === 'projects' || Boolean(initial.projects.ids.trim()) } : {}), ...(!request.revision ? { skipQuestionIds: [...new Set([ ...(request.permissionIntent?.answeredQuestionIds ?? []), + ...(request.overrides?.runners?.discover !== undefined ? ['runners.discover'] : []), ...(organizationImport?.answeredQuestionIds ?? []), ...(request.permissionIntent?.projectsWanted === false ? ['projects.ids'] : []), ...basicSkippedQuestionIds, @@ -63014,6 +63449,11 @@ class SetupWizardUseCase { throw new application_error_1.ApplicationError('configuration.invalid', `Invalid setup configuration:\n${validationErrors.map((error) => `- ${error}`).join('\n')}`); } let configuration = (0, setup_configuration_policy_1.normalizeSetupConfigurationLocales)(collectedConfiguration); + if (!configuration.runners?.discover) + runnerInventory = undefined; + else if (!initial.runners?.discover && request.remoteTarget && this.dependencies.runnerDiscovery) { + runnerInventory = await this.dependencies.runnerDiscovery.discover(request.remoteTarget.owner, request.remoteTarget.repository, request.remoteTarget.token, projectOwnerType).catch(() => ({ status: 'unavailable', candidates: [], groups: [] })); + } if ((request.configurationSource === 'organization' || request.deliveryMode === 'pull-request') && remoteConfiguration) { configuration = (0, setup_organization_variable_reuse_policy_1.configureSetupOrganizationReuseStorage)(configuration, (0, setup_organization_variable_reuse_policy_1.buildSetupOrganizationReuseVariables)(configuration, remoteConfiguration), remoteConfiguration); } @@ -63104,6 +63544,11 @@ class SetupWizardUseCase { } } const plan = (0, setup_configuration_policy_1.buildSetupPlan)(configuration, readiness, approvalReadiness); + if (this.dependencies.installationReview && request.deliveryMode !== 'pull-request') { + const review = await this.dependencies.installationReview.inspect(configuration); + plan.installationReview = { ...review, jobs: review.jobs.map(job => ({ ...job, + status: (0, setup_runner_policy_1.setupRunnerReadiness)(job.runsOn, runnerInventory) })) }; + } plan.deliveryMode = request.deliveryMode ?? 'local'; if ((request.configurationSource === 'organization' || request.deliveryMode === 'pull-request') && remoteConfiguration) { plan.variables = (0, setup_organization_variable_reuse_policy_1.buildSetupOrganizationReuseVariables)(configuration, remoteConfiguration); @@ -63146,6 +63591,7 @@ class SetupWizardUseCase { const answeredQuestionIds = [...new Set([ ...(request.revision?.answeredQuestionIds ?? []), ...(request.permissionIntent?.answeredQuestionIds ?? []), + ...(request.overrides?.runners?.discover !== undefined ? ['runners.discover'] : []), ...(organizationImport?.answeredQuestionIds ?? []), ...(questionnaire.answeredQuestionIds ?? []), ])]; @@ -63172,11 +63618,24 @@ class SetupWizardUseCase { configuration: (0, setup_configuration_clone_policy_1.cloneSetupConfiguration)(configuration), errors: ['The local setup session expired before permission checks began.'], ...(remoteConfiguration ? { remoteConfiguration } : {}) }; } + if (plan.installationReview?.blockers.length) + throw new application_error_1.ApplicationError('configuration.invalid', plan.installationReview.blockers.join(' ')); if (request.previewOnly) { return { status: 'completed', exitCode: 0, configuration: (0, setup_configuration_clone_policy_1.cloneSetupConfiguration)(configuration), plan, ...(organizationImport ? { organizationImport } : {}), ...(remoteConfiguration ? { remoteConfiguration } : {}) }; } + if (configuration.runners?.mode === 'organization-profile') { + const target = request.remoteTarget; + let fresh; + try { + fresh = target && await this.dependencies.remoteConfiguration?.inspect(target.owner, target.repository, target.token); + } + catch { /* A failed read cannot establish profile freshness. */ } + if (!fresh || !(0, setup_runner_policy_1.setupRunnerProfileIsFresh)(configuration.runners, fresh)) { + throw new application_error_1.ApplicationError('configuration.invalid', 'The runner registry changed or is unavailable. No permission probes or installation writes started; review a fresh profile snapshot.'); + } + } const audit = this.dependencies.onPermissionCleanupPending ? await this.dependencies.finalPermissionAudit.audit(configuration, remoteConfiguration, this.dependencies.onPermissionCleanupPending) : await this.dependencies.finalPermissionAudit.audit(configuration, remoteConfiguration); @@ -63338,6 +63797,7 @@ exports.VerifyWebSetupApplyUseCase = void 0; const application_error_1 = __nccwpck_require__(75999); const setup_interaction_cancelled_error_1 = __nccwpck_require__(38313); const setup_remote_facts_policy_1 = __nccwpck_require__(92567); +const setup_runner_policy_1 = __nccwpck_require__(91027); /** Authorizes one web Apply against the facts the operator actually reviewed. */ class VerifyWebSetupApplyUseCase { constructor(ports) { @@ -63363,7 +63823,7 @@ class VerifyWebSetupApplyUseCase { if (!(0, setup_remote_facts_policy_1.hasCompleteSetupSecretRevisions)(remote) || !(0, setup_remote_facts_policy_1.hasCompleteSetupSecretRevisions)(request.approvedRemote)) { throw new application_error_1.ApplicationError('configuration.invalid', 'Retained Secret revision metadata could not be verified. No mutation started; restore metadata access and review a fresh plan.'); } - if (!(0, setup_remote_facts_policy_1.sameSetupRemoteFacts)(remote, request.approvedRemote)) { + if (!(0, setup_remote_facts_policy_1.sameSetupRemoteFacts)(remote, request.approvedRemote) || !(0, setup_runner_policy_1.setupRunnerProfileIsFresh)(request.configuration.runners, remote)) { throw new application_error_1.ApplicationError('configuration.invalid', 'GitHub repository facts changed since plan review. No mutation started; restart and review a new plan.'); } const audit = this.ports.onPermissionCleanupPending @@ -73056,6 +73516,7 @@ function registerSetupCommand(program) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.executeSetupCommand = executeSetupCommand; +const setup_runner_composition_root_1 = __nccwpck_require__(80035); const local_action_1 = __nccwpck_require__(76102); const setup_files_1 = __nccwpck_require__(59126); const logger_1 = __nccwpck_require__(91151); @@ -73275,6 +73736,8 @@ async function executeSetupCommand(options) { deliveryMode: batchRequested ? 'pull-request' : 'local', }); setupPatPermissions = [...intent.requirements]; + if (intent.runnerDiscovery !== undefined) + overrides = { ...overrides, runners: { ...overrides.runners, discover: intent.runnerDiscovery } }; assertedOwnerKind = intent.assertedOwnerKind; permissionIntent = intent.permissionIntent; } @@ -73353,6 +73816,7 @@ async function executeSetupCommand(options) { approvalReadiness: new setup_approval_readiness_adapter_1.GithubSetupApprovalReadinessAdapter(), approvalCheckDiscovery: new github_setup_approval_check_discovery_adapter_1.GithubSetupApprovalCheckDiscoveryAdapter(), projectDiscovery: new github_setup_project_discovery_adapter_1.GithubSetupProjectDiscoveryAdapter(), + runnerDiscovery: (0, setup_runner_composition_root_1.createSetupRunnerDiscovery)(), installationReview: (0, setup_runner_composition_root_1.createSetupInstallationReview)(), ...(webBridge ? { sessionLiveness: () => webBridge.snapshot().outcome === 'cancelled' ? 'cancelled' : webBridge.snapshot().outcome ? 'expired' : 'active' } : {}), }); @@ -73764,6 +74228,7 @@ function setupApplySnapshotMatches(repositoryRoot, selectedFiles, expected) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.executeSetupBatch = executeSetupBatch; +const setup_runner_composition_root_1 = __nccwpck_require__(80035); const select_setup_batch_targets_use_case_1 = __nccwpck_require__(60527); const prepare_setup_batch_use_case_1 = __nccwpck_require__(14769); const configure_setup_batch_target_use_case_1 = __nccwpck_require__(5278); @@ -73789,6 +74254,8 @@ const setup_plan_presenter_1 = __nccwpck_require__(33441); const setup_confirmation_adapter_1 = __nccwpck_require__(5502); const web_setup_adapters_1 = __nccwpck_require__(60574); const logger_1 = __nccwpck_require__(91151); +const setup_installation_review_presenter_1 = __nccwpck_require__(22953); +const setup_runner_policy_1 = __nccwpck_require__(91027); /** Presentation and composition only; shared application use cases own selection, configuration and Apply. */ async function executeSetupBatch(input) { const composition = (0, setup_batch_composition_root_1.createSetupBatchCompositionRoot)(); @@ -73799,6 +74266,7 @@ async function executeSetupBatch(input) { let currentOperation; let retryRemaining = 1; let failedPermissionReport; + let sharedRunnerDefaults; const alive = () => !input.bridge?.snapshot().outcome; const approved = () => alive() && !input.bridge?.snapshot().batch?.stopRequested && (approvedGeneration === undefined || approvedGeneration === input.bridge?.controllerGeneration()); @@ -73837,9 +74305,11 @@ async function executeSetupBatch(input) { return JSON.stringify({ action: 'select', selectedIds: ids }); }, requestToken: async (repositories) => { - const requirements = (0, setup_token_permission_policy_1.buildSetupBatchPatPermissionRequirements)((0, setup_configuration_defaults_1.createDefaultSetupConfiguration)()); + const configuration = (0, setup_configuration_defaults_1.createDefaultSetupConfiguration)(); + configuration.runners = { ...configuration.runners, discover: input.overrides.runners?.discover ?? sharedRunnerDefaults?.discover }; + const requirements = (0, setup_token_permission_policy_1.withSetupRunnerDiscoveryPermissions)((0, setup_token_permission_policy_1.buildSetupBatchPatPermissionRequirements)(configuration), configuration, 'Organization'); input.permissionPresenter.showDetailedRequirements('setup', requirements); - const link = (0, setup_pat_creation_url_policy_1.buildSetupPatCreationUrl)({ owner: input.owner, repository: input.repository, role: 'setup', expiresIn: 1, requirements }); + const link = (0, setup_pat_creation_url_policy_1.buildSetupPatCreationUrl)({ owner: input.owner, repository: input.repository, role: 'setup', expiresIn: 1, requirements, includeConditionalSetupGrants: true }); if (input.bridge) return input.bridge.ask({ kind: 'secret', title: 'Temporary PAT for selected repositories', optional: true, link, copyId: 'batch.token', copyValues: { repositories: repositories.join(', ') || input.repository } }); @@ -73864,13 +74334,21 @@ async function executeSetupBatch(input) { inspectCredentialHealthWorkflow: (...args) => remoteReader.inspectCredentialHealthWorkflow(...args) }, mergeQueueReadiness: (0, setup_doctor_composition_root_1.createSetupMergeQueueReadinessUseCase)(), approvalReadiness: new setup_approval_readiness_adapter_1.GithubSetupApprovalReadinessAdapter(), approvalCheckDiscovery: new github_setup_approval_check_discovery_adapter_1.GithubSetupApprovalCheckDiscoveryAdapter(), projectDiscovery: new github_setup_project_discovery_adapter_1.GithubSetupProjectDiscoveryAdapter(), + runnerDiscovery: (0, setup_runner_composition_root_1.createSetupRunnerDiscovery)(), sessionLiveness: () => alive() ? 'active' : 'cancelled', }); - return new configure_setup_batch_target_use_case_1.ConfigureSetupBatchTargetUseCase({ wizard, credentials: (0, setup_credentials_composition_root_1.createSetupCredentialsUseCase)(input.credentialPrompt, input.permissionPresenter, { configurationSource: 'organization', allowPreApplyHealthWorkflow: false }) }).execute({ + const runnerDefaults = input.overrides.runners?.mode !== undefined ? input.overrides.runners + : { ...(0, setup_runner_policy_1.reusableSetupRunnerDefaults)(sharedRunnerDefaults, projected), ...input.overrides.runners }; + if (Object.keys(runnerDefaults).length) + (0, logger_1.logInfo)('The runner choice is prefilled for this target. Review its group/labels and change it for a repository exception; installation still waits for the combined review.'); + const chosen = await new configure_setup_batch_target_use_case_1.ConfigureSetupBatchTargetUseCase({ wizard, credentials: (0, setup_credentials_composition_root_1.createSetupCredentialsUseCase)(input.credentialPrompt, input.permissionPresenter, { configurationSource: 'organization', allowPreApplyHealthWorkflow: false }) }).execute({ target, remote: projected, actualRemote: context.remote, shared: context.shared, token: privateToken, - configurationSource: input.configurationSource, overrides: input.overrides, presentationMode: input.presentationMode, + configurationSource: input.configurationSource, overrides: { ...input.overrides, runners: runnerDefaults }, presentationMode: input.presentationMode, skipVariables: input.skipVariables, skipSecrets: input.skipSecrets }); + if (chosen?.configuration.runners) + sharedRunnerDefaults = chosen.configuration.runners; + return chosen; }, }); const presentation = { active: approved, @@ -73949,6 +74427,8 @@ function printBatch(plan, operation) { (0, logger_1.logInfo)(` setup/copilot/${plan.operationId} → ${target.target.defaultBranch} at ${target.target.baseSha}`); if (target.blocked.length) (0, logger_1.logInfo)(` Needs attention: ${target.blocked.join(' ')}`); + if (target.installationReview) + (0, logger_1.logInfo)((0, setup_installation_review_presenter_1.renderSetupInstallationReview)(target.installationReview)); if (receipt.cleanupPending) (0, logger_1.logInfo)(' Permission-check cleanup could not be confirmed. Pending work is stopped. Inspect GitHub history and the local recovery journal; resolve cleanup before starting a fresh setup. This operation cannot resume writes.'); if (!target.blocked.length) @@ -74134,6 +74614,7 @@ const setup_configuration_policy_1 = __nccwpck_require__(56637); const merge_queue_readiness_1 = __nccwpck_require__(12515); const issue_workflow_profile_1 = __nccwpck_require__(26744); const SETUP_OVERRIDE_KEYS = new Set([ + 'runners', 'features', 'agents', 'repository', @@ -74233,6 +74714,23 @@ function loadSetupConfigurationOverrides(filePath) { validateStorage(raw.storage); validateIssueWorkflows(raw.issueWorkflows); validateGuidance(raw.repositoryAgentGuidance); + if (raw.runners !== undefined) { + validateObject(raw.runners, 'runners'); + const runners = raw.runners; + validateObjectKeys(runners, new Set(['mode', 'profileId', 'group', 'labels', 'validation', 'source', 'discover']), 'runners'); + validateBooleanProperty(runners, 'discover'); + for (const key of ['mode', 'profileId', 'group', 'validation']) { + if (runners[key] !== undefined && typeof runners[key] !== 'string') + throw new Error(`runners.${key} must be a string.`); + } + if (runners.labels !== undefined && (!Array.isArray(runners.labels) || !runners.labels.every(label => typeof label === 'string'))) + throw new Error('runners.labels must be a list of literal strings.'); + if (runners.source !== undefined) { + validateObject(runners.source, 'runners.source'); + validateObjectKeys(runners.source, new Set(['scope', 'value']), 'runners.source'); + validateStringValues(runners.source, 'runners.source'); + } + } return raw; } function validateApprovalOverride(value) { @@ -74882,6 +75380,29 @@ function doctorCheckLabel(id, catalog = (0, setup_doctor_message_catalog_1.resol } +/***/ }), + +/***/ 22953: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.renderSetupInstallationReview = renderSetupInstallationReview; +const setup_terminal_choice_policy_1 = __nccwpck_require__(64662); +function renderSetupInstallationReview(review) { + return ['Runner routing and installation parity', + 'Access and capacity are observations, not runner authentication or runtime verification. Unknown access needs administrator verification; busy/offline keeps the route and waits for capacity.', + ...review.jobs.map(job => ` ${(0, setup_terminal_choice_policy_1.safeTerminalChoiceText)(job.file)} / ${(0, setup_terminal_choice_policy_1.safeTerminalChoiceText)(job.job)}: ${job.role} · ${job.status}${job.retained ? ' · retained' : ''}\n runs-on: ${(0, setup_terminal_choice_policy_1.safeTerminalChoiceText)(JSON.stringify(job.runsOn))}`), + 'Asset inventory (disabled optional capabilities remain visible):', + ...review.assets.map(asset => ` ${(0, setup_terminal_choice_policy_1.safeTerminalChoiceText)(asset.path)}: ${asset.status}${asset.enabled ? '' : ' · disabled'}`), + ...review.blockers.map(blocker => ` Blocked: ${(0, setup_terminal_choice_policy_1.safeTerminalChoiceText)(blocker)}`), + 'Workflow file changes (literal contents omitted from terminal logs; use --web for the full local diff):', + ...review.changes.map(change => ` ${change.before === null ? 'Create' : change.after === null ? 'Remove' : 'Update'} ${(0, setup_terminal_choice_policy_1.safeTerminalChoiceText)(change.path)}`), + ].join('\n'); +} + + /***/ }), /***/ 20462: @@ -75081,6 +75602,9 @@ async function finishWebSetupSession(bridge, server, exitCode) { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.collectSetupPatIntent = collectSetupPatIntent; const prepare_setup_pat_intent_use_case_1 = __nccwpck_require__(69277); +const setup_configuration_defaults_1 = __nccwpck_require__(23381); +const setup_questionnaire_policy_1 = __nccwpck_require__(6009); +const setup_token_permission_policy_1 = __nccwpck_require__(99590); const setup_questionnaire_controller_1 = __nccwpck_require__(41644); const logger_1 = __nccwpck_require__(91151); const setup_question_renderer_1 = __nccwpck_require__(89481); @@ -75099,7 +75623,20 @@ async function collectSetupPatIntent(input) { const owner = await credentialPrompt.chooseSetupOwnerKind(); if (owner !== 'Organization') throw new application_error_1.ApplicationError('configuration.invalid', 'Organization reuse requires an organization owner. Check the owner or restart with Customize configuration.'); - permissionPresenter.showDetailedRequirements('setup', input.initialRequirements); + let runnerDiscovery = input.overrides.runners?.discover; + const draft = (0, setup_configuration_defaults_1.mergeSetupConfiguration)((0, setup_configuration_defaults_1.createDefaultSetupConfiguration)(), input.overrides); + if (runnerDiscovery === undefined) { + const context = { skipQuestionIds: (0, setup_questionnaire_policy_1.setupQuestionContentInventory)().filter(question => question.id !== 'runners.discover').map(question => question.id) }; + const collector = bridge ? new web_setup_adapters_1.WebSetupQuestionnaireCollector(bridge) + : new setup_questionnaire_controller_1.SetupQuestionnaireController(input.terminal, new setup_question_renderer_1.ConsoleSetupQuestionRenderer('permission-intent')); + const state = await collector.collect((0, setup_questionnaire_policy_1.createSetupPermissionIntentQuestionnaire)(draft, context), context); + if (state.terminal === 'cancelled') + throw new setup_credential_prompt_adapter_1.SetupTerminalCancelledError(); + runnerDiscovery = state.draft.runners?.discover === true; + } + draft.runners = { ...draft.runners, discover: runnerDiscovery }; + const requirements = (0, setup_token_permission_policy_1.withSetupRunnerDiscoveryPermissions)(input.initialRequirements, draft, 'Organization'); + permissionPresenter.showDetailedRequirements('setup', requirements); const choices = ['Continue to GitHub', 'Enter a PAT manually']; const description = 'These provisional grants inspect existing organization configuration and allow repository setup. Shared Secret values are never requested or replaced. The final plan rechecks exact permissions; authentication evidence can remain pending. Select only the intended repositories in GitHub and delete the temporary PAT afterwards.'; const answer = bridge @@ -75109,18 +75646,18 @@ async function collectSetupPatIntent(input) { throw new setup_credential_prompt_adapter_1.SetupTerminalCancelledError(); if (answer !== choices[0]) { credentialPrompt.useManualSetupPat(); - return { requirements: input.initialRequirements }; + return { requirements, runnerDiscovery }; } try { credentialPrompt.configureSetupPatGuide((0, setup_pat_creation_url_policy_1.buildSetupPatCreationUrl)({ role: 'setup', owner: input.owner, - repository: input.repository, expiresIn: 1, requirements: input.initialRequirements })); + repository: input.repository, expiresIn: 1, requirements, includeConditionalSetupGrants: true })); } catch (error) { if (!(error instanceof setup_pat_creation_url_policy_1.UnsupportedSetupPatLinkError)) throw error; credentialPrompt.useManualSetupPat(); } - return { requirements: input.initialRequirements, assertedOwnerKind: 'Organization' }; + return { requirements, runnerDiscovery, assertedOwnerKind: 'Organization' }; } const prepared = await new prepare_setup_pat_intent_use_case_1.PrepareSetupPatIntentUseCase({ collect: (initial, context, pass) => (bridge @@ -75185,6 +75722,7 @@ const setup_configuration_policy_1 = __nccwpck_require__(56637); const setup_prompt_rendering_1 = __nccwpck_require__(76673); const pull_request_approval_policy_1 = __nccwpck_require__(98820); const setup_workflow_pat_storage_copy_1 = __nccwpck_require__(97798); +const setup_installation_review_presenter_1 = __nccwpck_require__(22953); class ConsoleSetupPlanPresenter { present(plan) { console.log(renderSetupPlan(plan)); @@ -75203,6 +75741,7 @@ function renderSetupPlan(plan) { const content = [ (0, setup_prompt_rendering_1.color)('Capabilities', 36), enabledFeatures || ' (none)', '', (0, setup_prompt_rendering_1.color)('Agent routing', 36), agents, '', + ...(plan.installationReview ? [(0, setup_installation_review_presenter_1.renderSetupInstallationReview)(plan.installationReview), ''] : []), (0, setup_prompt_rendering_1.color)('Pull-request approval', 36), ` Mode: ${approval.mode} (new setup; absent runtime policy stays off)`, ` Scope: ${approval.targetRoles.join(', ')} / ${approval.branchKinds.join(', ')}; linked issue ${approval.requireLinkedIssue ? 'required' : 'optional'}`, @@ -75435,6 +75974,7 @@ class ConsoleSetupQuestionRenderer { ].join('\n') : [ 'First, choose the setup options that affect your temporary PAT permissions.', + 'For full workflow contents, start with copilot setup --web. Terminal logs show routes and file actions.', 'These answers carry into the later full wizard and are not asked there again', 'unless you choose to review them here. No GitHub changes happen in this step.', ].join('\n'), this.choiceReviewPass > 1 ? 'Review saved setup choices' : 'Setup PAT permission intent')); @@ -75458,7 +75998,13 @@ class ConsoleSetupQuestionRenderer { const fixed = question.fixedWorkflowFeatures?.[kind]; return fixed === undefined ? [] : [` Configuration fixes features.${kind}=${fixed}; ${fixed ? 'keep' : 'leave'} ${kind} ${fixed ? 'selected' : 'unselected'} unless you edit --config/flags.`]; }).join('\n'); - const heading = `${step}${question.label}\n ${help.summary}\n Suggested: ${formatDefault(question.defaultValue)}${source}. ${help.documentation.title}: ${help.documentation.url}\n Type ? for detailed help; type :back to return to the previous question without clearing saved answers.${fixedWorkflowNote ? `\n${fixedWorkflowNote}` : ''}${discoveryNote(question)}`; + const runnerNote = question.id.startsWith('runners.') && question.id !== 'runners.discover' ? [ + `Registry: ${question.runnerRegistryStatus}${question.runnerRegistryScope ? ` (${question.runnerRegistryScope})` : ''}. Inventory: ${question.runnerInventory?.status ?? 'unavailable'}. No access is granted by selection.`, + ...(question.runnerProfiles ?? []).map(profile => `${profile.id}: group ${profile.group || '(labels only)'}; ${profile.labels.join(', ')}; validation ${profile.validation}`), + ...(question.runnerInventory?.groups ?? []).map(group => `Observed group ${group.name}: ${group.access}`), + ...(question.runnerInventory?.candidates ?? []).slice(0, 10).map(candidate => `Observed labels: ${candidate.labels.join(', ')} · ${candidate.status}${candidate.busy ? ' · busy' : ''}`), + ].join('\n ') : ''; + const heading = `${step}${help.label}\n ${help.summary}\n Suggested: ${formatDefault(question.defaultValue)}${source}. ${help.documentation.title}: ${help.documentation.url}\n Type ? for detailed help; type :back to return to the previous question without clearing saved answers.${fixedWorkflowNote ? `\n${fixedWorkflowNote}` : ''}${discoveryNote(question)}${runnerNote ? `\n ${runnerNote}` : ''}`; const reviewedStatuses = question.projectStatusValues?.map(item => ` ${item.transition}: ${item.value}`).join('\n'); const fallback = formatDefault(question.defaultValue); if (question.kind === 'choice') { @@ -76759,6 +77305,7 @@ function sameCapability(provided, expected) { } function toWebSetupPlan(plan) { return { + ...(plan.installationReview ? { installationReview: plan.installationReview } : {}), deliveryMode: plan.deliveryMode, ...(plan.organizationReuse ? { organizationReuse: { imported: plan.organizationReuse.imported, needsReview: plan.organizationReuse.needsReview, organizationVariables: [...plan.organizationReuse.organizationVariables], @@ -91848,6 +92395,21 @@ exports.SETUP_CREDENTIAL_HEALTH_BINDINGS = { }; +/***/ }), + +/***/ 94301: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DEFAULT_SETUP_RUNNERS = exports.SETUP_RUNNER_REGISTRY = void 0; +exports.SETUP_RUNNER_REGISTRY = 'COPILOT_RUNNER_PROFILES'; +exports.DEFAULT_SETUP_RUNNERS = Object.freeze({ + mode: 'retain', profileId: '', group: '', labels: Object.freeze([]), validation: 'hosted', +}); + + /***/ }), /***/ 24596: @@ -95078,6 +95640,7 @@ const issue_resource_input_policy_1 = __nccwpck_require__(28615); const yml_utils_1 = __nccwpck_require__(61788); const setup_configuration_policy_1 = __nccwpck_require__(56637); const setup_issue_resource_policy_1 = __nccwpck_require__(67323); +const setup_runner_composition_root_1 = __nccwpck_require__(80035); function createSetupBatchCompositionRoot() { const transport = new setup_batch_github_read_adapter_1.SetupBatchGithubTransport({ getClient: token => (0, octokit_client_resolver_1.getOctokitClient)(token) }); const read = new setup_batch_github_read_adapter_1.SetupBatchGithubReadAdapter(transport, (0, setup_credentials_composition_root_1.createSetupRemoteConfigurationReadPort)()); @@ -95105,7 +95668,7 @@ function createSetupBatchCompositionRoot() { throw new setup_batch_github_read_adapter_1.SetupBatchProviderError('unknown'); }, }); - return { discovery: read, inventory: read, writer, renderer: new setup_batch_workspace_adapter_1.SetupBatchWorkspaceAdapter(), journal: new setup_batch_journal_adapter_1.SetupBatchJournalAdapter() }; + return { discovery: read, inventory: read, writer, renderer: new setup_batch_workspace_adapter_1.SetupBatchWorkspaceAdapter(), journal: new setup_batch_journal_adapter_1.SetupBatchJournalAdapter(), runnerDiscovery: (0, setup_runner_composition_root_1.createSetupRunnerDiscovery)() }; } @@ -95184,6 +95747,28 @@ function createSetupDoctorUseCase() { } +/***/ }), + +/***/ 80035: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.createSetupRunnerDiscovery = createSetupRunnerDiscovery; +exports.createSetupInstallationReview = createSetupInstallationReview; +const setup_runner_discovery_adapter_1 = __nccwpck_require__(17495); +const setup_batch_github_read_adapter_1 = __nccwpck_require__(9703); +const octokit_client_resolver_1 = __nccwpck_require__(54047); +const setup_installation_review_1 = __nccwpck_require__(23799); +function createSetupRunnerDiscovery() { + return new setup_runner_discovery_adapter_1.SetupRunnerDiscoveryAdapter(new setup_batch_github_read_adapter_1.SetupBatchGithubTransport({ getClient: token => (0, octokit_client_resolver_1.getOctokitClient)(token) })); +} +function createSetupInstallationReview(root = process.cwd()) { + return { inspect: async (configuration) => (0, setup_installation_review_1.inspectSetupInstallation)(root, configuration) }; +} + + /***/ }), /***/ 64132: @@ -97145,6 +97730,9 @@ exports.SetupBatchGithubApplyAdapter = void 0; const setup_batch_policy_1 = __nccwpck_require__(52214); const setup_batch_github_read_adapter_1 = __nccwpck_require__(9703); const node_crypto_1 = __nccwpck_require__(6005); +const setup_runner_1 = __nccwpck_require__(94301); +const setup_runner_policy_1 = __nccwpck_require__(91027); +const setup_runner_installation_summary_policy_1 = __nccwpck_require__(14706); /** Reused shared resources have an additive access command only. No shared value or Secret writer is injected. */ class SetupBatchGithubApplyAdapter { constructor(read, variableWriter, resources) { @@ -97173,6 +97761,14 @@ class SetupBatchGithubApplyAdapter { if (effective.repositoryVariablesAccess !== 'available' || effective.repositorySecretsAccess !== 'available' || effective.organizationVariablesAccess !== 'available' || effective.organizationSecretsAccess !== 'available') return false; + if (plan.configuration.runners?.mode === 'organization-profile') { + if (!(0, setup_runner_policy_1.setupRunnerProfileIsFresh)(plan.configuration.runners, effective)) + return false; + const registry = shared.filter(resource => resource.kind === 'variable' && resource.name === setup_runner_1.SETUP_RUNNER_REGISTRY); + const profileFacts = { ...effective, organizationVariables: registry.map(resource => ({ name: resource.name, value: resource.value ?? '' })) }; + if (!(0, setup_runner_policy_1.setupRunnerProfileIsFresh)(plan.configuration.runners, profileFacts)) + return false; + } for (const resource of plan.sharedSnapshot) { const pendingGrant = !completed.includes('access') && plan.grants.some(grant => grant.kind === resource.kind && grant.name === resource.name); if (!pendingGrant && (resource.kind === 'secret' ? !effective.organizationSecrets.includes(resource.name) @@ -97326,7 +97922,7 @@ class SetupBatchGithubApplyAdapter { try { await this.read.transport.call(token, 'POST /repos/{owner}/{repo}/pulls', { owner: plan.target.owner, repo: plan.target.name, head: branch, base: plan.target.defaultBranch, title: 'chore: configure Copilot', - body: `${(0, setup_batch_policy_1.setupBatchMarker)(operationId, plan.target.id)}\n\nConfigure Copilot using the reviewed setup plan. Shared Secret values are retained.\n\n**Status:** PR created; installation awaits human review and merge. Runtime credential and capability verification remain pending.\n\nReview the generated workflows, repository guidance and configuration before merging. Setup never merges, releases or deploys this PR.` }); + body: `${(0, setup_batch_policy_1.setupBatchMarker)(operationId, plan.target.id)}\n\nConfigure Copilot using the reviewed setup plan. Shared Secret values are retained.\n\n**Status:** PR created; installation awaits human review and merge. Runtime credential and capability verification remain pending.\n\nReview the generated workflows, repository guidance and configuration before merging. Setup never merges, releases or deploys this PR.${(0, setup_runner_installation_summary_policy_1.setupRunnerInstallationSummary)(plan)}` }); } catch { /* Inspect the durable marker after any uncertain create response. */ } const number = await inspect(); @@ -97388,8 +97984,9 @@ const setup_batch_policy_1 = __nccwpck_require__(52214); const setup_organization_variable_bindings_1 = __nccwpck_require__(19698); const setup_credential_health_1 = __nccwpck_require__(68136); const setup_batch_retry_policy_1 = __nccwpck_require__(70775); +const setup_runner_1 = __nccwpck_require__(94301); const managedVariables = new Set([...setup_organization_variable_bindings_1.SETUP_ORGANIZATION_VARIABLE_BINDINGS.flatMap(binding => [binding.variable, binding.fallbackVariable]), - 'PR_APPROVAL_POLICY', 'COPILOT_ISSUE_WORKFLOW_PROFILE', 'AGENT_ALLOWED_PROVIDERS', 'AGENT_ALLOWED_MODEL_PROVIDERS']); + 'PR_APPROVAL_POLICY', 'COPILOT_ISSUE_WORKFLOW_PROFILE', 'AGENT_ALLOWED_PROVIDERS', 'AGENT_ALLOWED_MODEL_PROVIDERS', setup_runner_1.SETUP_RUNNER_REGISTRY]); class SetupBatchProviderError extends Error { constructor(code) { super(`GitHub setup request is ${code}. Inspect access or retry the pending target.`); @@ -97712,24 +98309,26 @@ const setup_batch_policy_1 = __nccwpck_require__(52214); const setup_files_1 = __nccwpck_require__(59126); const setup_issue_workflow_policy_1 = __nccwpck_require__(81182); const setup_workflow_upgrade_1 = __nccwpck_require__(85493); +const setup_installation_review_1 = __nccwpck_require__(23799); const repository_agent_guidance_policy_1 = __nccwpck_require__(67402); /** Existing setup renderers run inside a disposable directory, never in another checkout. */ class SetupBatchWorkspaceAdapter { + async review(configuration, existing) { + const root = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'copilot-setup-review-')); + try { + seedWorkspace(root, existing); + return (0, setup_installation_review_1.inspectSetupInstallation)(root, configuration); + } + finally { + (0, node_fs_1.rmSync)(root, { recursive: true, force: true }); + } + } digest(value) { return (0, node_crypto_1.createHash)('sha256').update(value).digest('hex'); } operationId() { return (0, node_crypto_1.randomUUID)(); } async render(configuration, existing) { const root = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'copilot-setup-render-')); try { - if (existing.length > 300 || new Set(existing.map(file => file.path)).size !== existing.length - || existing.some(file => !(0, setup_batch_policy_1.validSetupBatchAssetPath)(file.path) || file.content === null - || Buffer.byteLength(file.content) > 100000) - || existing.reduce((sum, file) => sum + Buffer.byteLength(file.content), 0) > 2000000) - throw new Error('Setup asset inventory is invalid or exceeds the fixed render budget.'); - for (const file of existing) { - const destination = (0, node_path_1.join)(root, file.path); - (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(destination), { recursive: true }); - (0, node_fs_1.writeFileSync)(destination, file.content, { mode: 0o600 }); - } + seedWorkspace(root, existing); (0, setup_files_1.ensureGitHubDirs)(root); const sourceAction = existing.some(file => file.path.startsWith('.github/workflows/') && (0, setup_workflow_upgrade_1.hasRootLocalSetupAction)(file.content)); const sourceGuidance = [repository_agent_guidance_policy_1.REPOSITORY_AGENT_GUIDE_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_PROFILE_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_MANIFEST_PATH, @@ -97783,6 +98382,17 @@ class SetupBatchWorkspaceAdapter { } } exports.SetupBatchWorkspaceAdapter = SetupBatchWorkspaceAdapter; +function seedWorkspace(root, existing) { + if (existing.length > 300 || new Set(existing.map(file => file.path)).size !== existing.length + || existing.some(file => !(0, setup_batch_policy_1.validSetupBatchAssetPath)(file.path) || file.content === null || Buffer.byteLength(file.content) > 100000) + || existing.reduce((sum, file) => sum + Buffer.byteLength(file.content), 0) > 2000000) + throw new Error('Setup asset inventory is invalid or exceeds the fixed render budget.'); + for (const file of existing) { + const destination = (0, node_path_1.join)(root, file.path); + (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(destination), { recursive: true }); + (0, node_fs_1.writeFileSync)(destination, file.content, { mode: 0o600 }); + } +} /***/ }), @@ -99653,6 +100263,8 @@ function probeUrl(owner, repository, requirement) { return `${organizationRoot}/issue-types?per_page=1`; if (requirement.probe === 'projects') return `${organizationRoot}/projectsV2?per_page=100`; + if (requirement.probe === 'runner-groups') + return `${organizationRoot}/actions/runner-groups?per_page=1`; return undefined; } if (requirement.probe === 'metadata') @@ -99701,7 +100313,7 @@ function hasSetupPermissionReadShape(probe, payload) { if (['contents', 'issues', 'pull-requests', 'workflows', 'issue-types'].includes(probe)) { return collection(payload); } - const field = { actions: 'workflows', checks: 'check_runs', variables: 'variables', secrets: 'secrets' }[probe]; + const field = { actions: 'workflows', checks: 'check_runs', variables: 'variables', secrets: 'secrets', 'runner-groups': 'runner_groups' }[probe]; return field !== undefined && record(payload) && collection(payload[field]); } @@ -100351,6 +100963,111 @@ function readHealthWorkflow() { } +/***/ }), + +/***/ 17495: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SetupRunnerDiscoveryAdapter = void 0; +const record = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) + ? value : undefined; +const text = (value) => typeof value === 'string' && value.length > 0 && value.length <= 100 && !/[\p{Cc}\p{Cf}${}<>]/u.test(value); +const positive = (value) => Number.isSafeInteger(value) && Number(value) > 0; +/** Fixed GET routes only. Discovery never registers runners, grants access or schedules jobs. */ +class SetupRunnerDiscoveryAdapter { + constructor(transport) { + this.transport = transport; + } + async discover(owner, repository, token, ownerType) { + const candidates = []; + const groups = []; + let incomplete = false; + try { + const local = await this.collection(token, 'GET /repos/{owner}/{repo}/actions/runners', { owner, repo: repository }, 'runners'); + candidates.push(...local.map(value => this.runner(value, 'confirmed'))); + } + catch { + incomplete = true; + } + if (ownerType === 'Organization') { + try { + const eligible = await this.collection(token, 'GET /orgs/{org}/actions/runner-groups', { org: owner, visible_to_repository: repository }, 'runner_groups'); + // A single operation never fans out over an unbounded group inventory. + if (eligible.length > 10) + throw new Error('Runner group discovery exceeds its bounded fan-out.'); + for (const value of eligible) { + const group = record(value); + if (!positive(group?.id) || !text(group?.name) || typeof group?.restricted_to_workflows !== 'boolean' + || groups.some(existing => existing.name === group.name)) + throw new Error('Invalid runner group inventory.'); + const access = group.restricted_to_workflows ? 'unknown' : 'confirmed'; + groups.push({ name: group.name, access }); + if (candidates.length === 1000) { + incomplete = true; + break; + } + try { + const runners = await this.collection(token, 'GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners', { org: owner, runner_group_id: group.id }, 'runners', 1000 - candidates.length); + candidates.push(...runners.map(value => ({ ...this.runner(value, access), group: group.name }))); + } + catch { + incomplete = true; + } + } + } + catch { + incomplete = true; + } + } + else if (ownerType === 'Unknown') + incomplete = true; + return { status: incomplete ? candidates.length || groups.length ? 'incomplete' : 'unavailable' : 'available', + candidates, groups }; + } + runner(value, access) { + const runner = record(value); + if (!positive(runner?.id) || !['online', 'offline'].includes(String(runner?.status)) || typeof runner?.busy !== 'boolean' + || !Array.isArray(runner?.labels) || runner.labels.length < 1 || runner.labels.length > 100) + throw new Error('Invalid runner inventory.'); + const labels = runner.labels.map(label => record(label)?.name); + if (!labels.every(text) || new Set(labels.map(label => label.toLowerCase())).size !== labels.length) + throw new Error('Invalid runner labels.'); + return { id: runner.id, labels, status: runner.status, busy: runner.busy, access }; + } + async collection(token, route, parameters, field, limit = 1000) { + const result = []; + const ids = new Set(); + let total; + // Stable total <= 1,000 and full 100-entry intermediate pages bound this + // loop to ten requests; every partial/oversized page fails closed below. + for (let page = 1;; page++) { + const response = record(await this.transport.call(token, route, { ...parameters, per_page: 100, page })); + const count = response?.total_count; + const entries = response?.[field]; + if (!Number.isSafeInteger(count) || Number(count) < 0 || Number(count) > limit || !Array.isArray(entries) + || entries.length > 100 || total !== undefined && count !== total) + throw new Error('Incomplete runner discovery.'); + total = Number(count); + for (const entry of entries) { + const itemId = record(entry)?.id; + if (!positive(itemId) || ids.has(itemId)) + throw new Error('Invalid runner discovery identity.'); + ids.add(itemId); + result.push(entry); + } + if (result.length === total) + return result; + if (entries.length !== 100 || result.length > total) + throw new Error('Incomplete runner discovery.'); + } + } +} +exports.SetupRunnerDiscoveryAdapter = SetupRunnerDiscoveryAdapter; + + /***/ }), /***/ 67758: @@ -103230,7 +103947,7 @@ function copySetupFile(source, destination, displaySource, displayDestination, o (0, logger_1.logInfo)(` ⏭️ ${displayDestination} already exists; skipping.`); return { copied: 0, skipped: 1 }; } - const rendered = options.renderContent?.(fs.readFileSync(source, 'utf8'), fs.existsSync(destination) ? fs.readFileSync(destination, 'utf8') : undefined); + const rendered = options.renderContent?.(fs.readFileSync(source, 'utf8'), fs.existsSync(destination) ? fs.readFileSync(destination, 'utf8') : undefined, path.basename(source)); if (fs.existsSync(destination) && options.backupDirectory) { fs.mkdirSync(options.backupDirectory, { recursive: true }); fs.copyFileSync(destination, path.join(options.backupDirectory, path.basename(destination))); @@ -103312,6 +104029,8 @@ const setup_issue_workflow_policy_1 = __nccwpck_require__(81182); const repository_agent_guidance_1 = __nccwpck_require__(38445); const setup_approval_workflow_1 = __nccwpck_require__(9512); const setup_workflow_upgrade_1 = __nccwpck_require__(85493); +const setup_installation_review_1 = __nccwpck_require__(23799); +const repository_agent_guidance_policy_1 = __nccwpck_require__(67402); /** * Ensure .github, .github/workflows and .github/ISSUE_TEMPLATE exist; create them if missing. * @param cwd - Directory (repo root) @@ -103346,6 +104065,13 @@ function copySetupFiles(cwd, setupDirOverride, features, options = {}) { const setupDir = setupDirOverride ?? path.join(__dirname, '..', '..', 'setup'); if (!fs.existsSync(setupDir)) return { copied: 0, skipped: 0 }; + const installationReview = options.setupConfiguration && (0, setup_installation_review_1.inspectSetupInstallation)(cwd, options.setupConfiguration, setupDir); + if (installationReview?.blockers.length) + throw new Error(installationReview.blockers.join(' ')); + const preserveSourceGuidance = installationReview?.assets.some(asset => asset.path === repository_agent_guidance_policy_1.REPOSITORY_AGENT_GUIDE_PATH && asset.status === 'source-only'); + const sourceInstallation = installationReview?.assets.some(asset => asset.path.startsWith('.github/workflows/') && asset.status === 'source-only'); + const snapshotContent = options.setupConfiguration && (0, setup_installation_review_1.renderSetupRunnerSnapshot)(options.setupConfiguration); + const snapshotPath = path.join(cwd, setup_installation_review_1.SETUP_RUNNER_SNAPSHOT); const approvedWorkflowFiles = new Set(options.approvedWorkflowFiles ?? []); const effectiveFeatures = options.setupConfiguration ? (0, setup_issue_workflow_policy_1.effectiveIssueWorkflowFeatures)(options.setupConfiguration) @@ -103359,17 +104085,20 @@ function copySetupFiles(cwd, setupDirOverride, features, options = {}) { : { copied: 0, skipped: 0 }; const workflows = (0, setup_file_copy_1.copySetupDirectory)(path.join(setupDir, 'workflows'), path.join(cwd, '.github', 'workflows'), (fileName) => (fileName.endsWith('.yml') || fileName.endsWith('.yaml')) && fileName !== 'copilot_pull_request_approval.yml' + && (!sourceInstallation || fileName === 'copilot_commit.yml' || !fs.existsSync(path.join(cwd, '.github', 'workflows', fileName))) && (0, setup_workflow_catalog_1.isSetupWorkflowEnabled)(fileName, effectiveFeatures) && (!options.updateExistingWorkflows || approvedWorkflowFiles.has(fileName) || !fs.existsSync(path.join(cwd, '.github', 'workflows', fileName))), 'setup/workflows', { overwrite: options.updateExistingWorkflows, backupDirectory, - renderContent: setup_workflow_upgrade_1.renderSetupWorkflowUpgrade, + renderContent: (template, existing, file) => (0, setup_workflow_upgrade_1.renderSetupWorkflowUpgrade)(template, existing, options.setupConfiguration && file ? { file, runners: options.setupConfiguration.runners } : undefined), }); - const approvalWorkflow = options.setupConfiguration?.pullRequestApproval.mode !== 'off' && options.setupConfiguration - ? copyApprovalObserverWorkflow(cwd, setupDir, options.setupConfiguration, options.updateExistingWorkflows === true, approvedWorkflowFiles, backupDirectory) - : { copied: 0, skipped: 0 }; + const approvalWorkflow = sourceInstallation && fs.existsSync(path.join(cwd, '.github/workflows/copilot_pull_request_approval.yml')) + ? { copied: 0, skipped: 1 } + : options.setupConfiguration?.pullRequestApproval.mode !== 'off' && options.setupConfiguration + ? copyApprovalObserverWorkflow(cwd, setupDir, options.setupConfiguration, options.updateExistingWorkflows === true, approvedWorkflowFiles, backupDirectory) + : { copied: 0, skipped: 0 }; const issueTemplates = options.setupConfiguration ? copySelectedIssueForms(cwd, setupDir, options.setupConfiguration) : (0, setup_file_copy_1.copySetupDirectory)(path.join(setupDir, 'ISSUE_TEMPLATE'), path.join(cwd, '.github', 'ISSUE_TEMPLATE'), (fileName) => features?.issueTemplates !== false @@ -103380,10 +104109,20 @@ function copySetupFiles(cwd, setupDirOverride, features, options = {}) { const pullRequestTemplate = features?.pullRequestTemplate === false ? { copied: 0, skipped: 0 } : (0, setup_file_copy_1.copySetupFile)(path.join(setupDir, 'pull_request_template.md'), path.join(cwd, '.github', 'pull_request_template.md'), 'setup/pull_request_template.md', '.github/pull_request_template.md'); - const guidance = options.setupConfiguration && !options.preserveExistingAgentGuidance + const guidance = options.setupConfiguration && !options.preserveExistingAgentGuidance && !preserveSourceGuidance ? (0, repository_agent_guidance_1.reconcileRepositoryAgentGuidance)(cwd, options.setupConfiguration) : { copied: 0, skipped: 0 }; - return [retired, workflows, approvalWorkflow, issueTemplates, pullRequestTemplate, guidance].reduce((total, current) => ({ + const snapshot = { copied: 0, skipped: 0 }; + if (snapshotContent) { + if (fs.existsSync(snapshotPath) && fs.readFileSync(snapshotPath, 'utf8') === snapshotContent) + snapshot.skipped++; + else { + backupSetupAsset(cwd, setup_installation_review_1.SETUP_RUNNER_SNAPSHOT, 'runner-profile'); + atomicWriteSetupAsset(snapshotPath, snapshotContent); + snapshot.copied++; + } + } + return [retired, workflows, approvalWorkflow, issueTemplates, pullRequestTemplate, guidance, snapshot].reduce((total, current) => ({ copied: total.copied + current.copied, skipped: total.skipped + current.skipped, }), { copied: 0, skipped: 0 }); @@ -103512,6 +104251,8 @@ function compareSetupWorkflows(cwd, features, setupDirOverride, configuration) { const sourceDirectory = path.join(setupDir, 'workflows'); if (!fs.existsSync(sourceDirectory)) return []; + const sourceInstallation = configuration && (0, setup_installation_review_1.inspectSetupInstallation)(cwd, configuration, setupDir).assets + .some(asset => asset.path.startsWith('.github/workflows/') && asset.status === 'source-only'); return fs.readdirSync(sourceDirectory) .filter(file => (file.endsWith('.yml') || file.endsWith('.yaml')) && (0, setup_workflow_catalog_1.isSetupWorkflowEnabled)(file, features) && (file !== 'copilot_pull_request_approval.yml' || (configuration && configuration.pullRequestApproval.mode !== 'off'))) @@ -103521,9 +104262,11 @@ function compareSetupWorkflows(cwd, features, setupDirOverride, configuration) { const destination = path.join(cwd, '.github', 'workflows', file); if (!fs.existsSync(destination)) return { file, destination: `.github/workflows/${file}`, status: 'missing' }; + if (sourceInstallation && file !== 'copilot_commit.yml') + return { file, destination: `.github/workflows/${file}`, status: 'unchanged' }; const expected = file === 'copilot_pull_request_approval.yml' && configuration ? (0, setup_approval_workflow_1.renderApprovalObserverWorkflow)(fs.readFileSync(source, 'utf8'), configuration.pullRequestApproval) - : (0, setup_workflow_upgrade_1.renderSetupWorkflowUpgrade)(fs.readFileSync(source, 'utf8'), fs.readFileSync(destination, 'utf8')); + : (0, setup_workflow_upgrade_1.renderSetupWorkflowUpgrade)(fs.readFileSync(source, 'utf8'), fs.readFileSync(destination, 'utf8'), configuration ? { file, runners: configuration.runners } : undefined); const equal = isLocalSourceApprovalObserver(cwd, destination) || expected === fs.readFileSync(destination, 'utf8'); return { file, destination: `.github/workflows/${file}`, status: equal ? 'unchanged' : 'changed' }; @@ -103570,6 +104313,170 @@ function hasValidSetupToken(cwd, override) { } +/***/ }), + +/***/ 23799: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SETUP_RUNNER_SNAPSHOT = void 0; +exports.renderSetupRunnerSnapshot = renderSetupRunnerSnapshot; +exports.compatibleSetupRunnerSnapshot = compatibleSetupRunnerSnapshot; +exports.inspectSetupInstallation = inspectSetupInstallation; +const node_fs_1 = __nccwpck_require__(87561); +const node_path_1 = __nccwpck_require__(49411); +const js_yaml_1 = __nccwpck_require__(783); +const node_crypto_1 = __nccwpck_require__(6005); +const setup_workflow_catalog_1 = __nccwpck_require__(24596); +const setup_issue_workflow_policy_1 = __nccwpck_require__(81182); +const setup_runner_policy_1 = __nccwpck_require__(91027); +const setup_workflow_upgrade_1 = __nccwpck_require__(85493); +const setup_approval_workflow_1 = __nccwpck_require__(9512); +const sensitive_text_1 = __nccwpck_require__(47122); +const repository_agent_guidance_policy_1 = __nccwpck_require__(67402); +exports.SETUP_RUNNER_SNAPSHOT = '.copilot/runner-profile.json'; +const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) + ? value : undefined; +const read = (path) => (0, node_fs_1.existsSync)(path) ? (0, node_fs_1.readFileSync)(path, 'utf8') : undefined; +function renderSetupRunnerSnapshot(configuration) { + if (!configuration.runners || configuration.runners.mode === 'retain') + return undefined; + const errors = (0, setup_runner_policy_1.validateSetupRunners)(configuration.runners); + if (errors.length) + throw new Error(errors.join(' ')); + const { source, discover: _discover, ...runners } = configuration.runners; + return `${JSON.stringify({ schemaVersion: 1, runners, ...(source ? { source: { scope: source.scope, + registryDigest: (0, node_crypto_1.createHash)('sha256').update(source.value).digest('hex') } } : {}) }, null, 2)}\n`; +} +function compatibleSetupRunnerSnapshot(content) { + try { + const value = object(JSON.parse(content)); + if (!value || Object.keys(value).some(key => !['schemaVersion', 'runners', 'source'].includes(key)) || value.schemaVersion !== 1) + return false; + const runners = object(value.runners); + if (!runners || ['source', 'discover'].some(key => Object.prototype.hasOwnProperty.call(runners, key))) + return false; + if (runners.mode !== 'organization-profile') + return value.source === undefined && (0, setup_runner_policy_1.validateSetupRunners)(runners).length === 0; + const source = object(value.source); + if (!source || Object.keys(source).length !== 2 || !['repository', 'organization'].includes(String(source.scope)) + || typeof source.registryDigest !== 'string' || !/^[a-f0-9]{64}$/u.test(source.registryDigest)) + return false; + return (0, setup_runner_policy_1.validateSetupRunners)({ ...runners, source: { scope: source.scope, value: JSON.stringify({ schemaVersion: 1, + profiles: [{ id: runners.profileId, group: runners.group, labels: runners.labels, validation: runners.validation }] }) } }).length === 0; + } + catch { + return false; + } +} +/** Read-only parity and before/after review uses the exact same renderer as Apply. */ +function inspectSetupInstallation(root, configuration, setup = (0, node_path_1.join)(__dirname, '..', '..', 'setup')) { + const assets = []; + const jobs = []; + const changes = []; + const blockers = []; + const addJobs = (file, content, retained) => { + const documents = (0, js_yaml_1.loadAll)(content); + if (documents.length !== 1) + throw new Error('Workflow review needs exactly one YAML document.'); + const parsedJobs = object(object(documents[0])?.jobs); + if (!parsedJobs) + throw new Error('Workflow jobs are unavailable for review.'); + for (const [job, raw] of Object.entries(parsedJobs)) { + const runsOn = object(raw)?.['runs-on']; + if (runsOn === undefined) + continue; // reusable workflow calls have no runner + jobs.push({ file, job, role: (0, setup_runner_policy_1.setupRunnerRole)(file, job) ?? 'validation', + runsOn: runsOn, status: 'access-unknown', retained }); + if (jobs.length > 200) + throw new Error('Workflow review exceeds its fixed 200-job budget.'); + } + }; + const directory = (0, node_path_1.join)(root, '.github', 'workflows'); + const sourceFiles = (0, node_fs_1.existsSync)((0, node_path_1.join)(setup, 'workflows')) ? (0, node_fs_1.readdirSync)((0, node_path_1.join)(setup, 'workflows')).filter(file => file.endsWith('.yml') || file.endsWith('.yaml')) : []; + const installedFiles = (0, node_fs_1.existsSync)(directory) ? (0, node_fs_1.readdirSync)(directory).filter(file => file.endsWith('.yml') || file.endsWith('.yaml')) : []; + if (installedFiles.length > 100) + throw new Error('Workflow review exceeds its fixed 100-file budget.'); + const existing = new Map(installedFiles.map(file => { + const content = (0, node_fs_1.readFileSync)((0, node_path_1.join)(directory, file), 'utf8'); + if (Buffer.byteLength(content) > 100000) + throw new Error('Workflow review exceeds its per-file budget.'); + return [file, content]; + })); + if ([...existing.values()].reduce((sum, value) => sum + Buffer.byteLength(value), 0) > 2000000) + throw new Error('Workflow review exceeds its byte budget.'); + const source = [...existing.values()].some(setup_workflow_upgrade_1.hasRootLocalSetupAction); + const features = (0, setup_issue_workflow_policy_1.effectiveIssueWorkflowFeatures)(configuration); + for (const file of sourceFiles) { + const path = `.github/workflows/${file}`; + const before = existing.get(file); + const enabled = (0, setup_workflow_catalog_1.isSetupWorkflowEnabled)(file, features) && (file !== 'copilot_pull_request_approval.yml' || configuration.pullRequestApproval.mode !== 'off'); + const template = (0, node_fs_1.readFileSync)((0, node_path_1.join)(setup, 'workflows', file), 'utf8'); + const preserved = source && before !== undefined; + const after = !enabled ? before : preserved && file !== 'copilot_commit.yml' ? before + : file === 'copilot_pull_request_approval.yml' ? (0, setup_approval_workflow_1.renderApprovalObserverWorkflow)(template, configuration.pullRequestApproval) + : (0, setup_workflow_upgrade_1.renderSetupWorkflowUpgrade)(template, before, { file, runners: configuration.runners }); + assets.push({ path, enabled, status: before === undefined ? 'missing' : preserved ? 'source-only' + : before === after && (before === template || (configuration.runners?.mode ?? 'retain') !== 'retain') ? 'shared' : 'customized' }); + if (enabled && after !== undefined) { + addJobs(file, after, preserved || configuration.runners?.mode === 'retain' || !configuration.runners); + // Enabled workflows render or retain a complete string; disabled assets never produce removals. + if (before !== after) + changes.push({ path, before: before === undefined ? null : (0, sensitive_text_1.redactSensitiveText)(before), after: (0, sensitive_text_1.redactSensitiveText)(after) }); + } + } + for (const file of installedFiles.filter(file => !sourceFiles.includes(file))) { + assets.push({ path: `.github/workflows/${file}`, enabled: true, status: source ? 'source-only' : 'customized' }); + addJobs(file, existing.get(file), true); + } + for (const file of (0, node_fs_1.existsSync)((0, node_path_1.join)(setup, 'ISSUE_TEMPLATE')) ? (0, node_fs_1.readdirSync)((0, node_path_1.join)(setup, 'ISSUE_TEMPLATE')) : []) { + const path = `.github/ISSUE_TEMPLATE/${file}`; + const before = read((0, node_path_1.join)(root, path)); + assets.push({ path, enabled: features.issueTemplates !== false && features.issues !== false, + status: before === undefined ? 'missing' : before === read((0, node_path_1.join)(setup, 'ISSUE_TEMPLATE', file)) ? 'shared' : 'customized' }); + } + const guidance = [repository_agent_guidance_policy_1.REPOSITORY_AGENT_GUIDE_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_PROFILE_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_MANIFEST_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_SKILL_PATH]; + for (const path of guidance) { + // Markdown guidance is collaborator input, never runtime instructions. + // Parity needs its presence only; decode controlled JSON metadata separately. + const present = (0, node_fs_1.existsSync)((0, node_path_1.join)(root, path)); + let compatible = true; + if (present && path.endsWith('.json')) { + try { + const data = object(JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(root, path), 'utf8'))); + const generator = object(data?.generator); + // Profile and ownership-manifest generator contracts are distinct. + const contract = path === repository_agent_guidance_policy_1.REPOSITORY_AGENT_PROFILE_PATH ? 2 : 1; + compatible = data?.schemaVersion === 2 && generator?.name === '@vypdev/copilot' + && Object.keys(generator).length === 2 && generator.contractVersion === contract; + } + catch { + compatible = false; + } + } + assets.push({ path, enabled: configuration.repositoryAgentGuidance.enabled, + status: !present ? 'missing' : !compatible ? 'incompatible' : source ? 'source-only' : 'shared' }); + if (!compatible && configuration.repositoryAgentGuidance.enabled && !source) + blockers.push(`${path}: unsupported generator metadata. Retain the asset or restore a compatible generator before regeneration.`); + } + const presentGuidance = guidance.filter(path => (0, node_fs_1.existsSync)((0, node_path_1.join)(root, path))).length; + if (source && presentGuidance > 0 && presentGuidance !== guidance.length) + blockers.push('Source guidance is incomplete. Restore it with the checked-in source generator before setup.'); + const before = read((0, node_path_1.join)(root, exports.SETUP_RUNNER_SNAPSHOT)); + const after = renderSetupRunnerSnapshot(configuration); + assets.push({ path: exports.SETUP_RUNNER_SNAPSHOT, enabled: after !== undefined || before !== undefined, + status: before === undefined ? 'missing' : !compatibleSetupRunnerSnapshot(before) ? 'incompatible' : before === after || after === undefined ? 'shared' : 'customized' }); + if (after !== undefined && before !== after) + changes.push({ path: exports.SETUP_RUNNER_SNAPSHOT, + before: before === undefined ? null : (0, sensitive_text_1.redactSensitiveText)(before), after: (0, sensitive_text_1.redactSensitiveText)(after) }); + if (after !== undefined && before !== undefined && !compatibleSetupRunnerSnapshot(before)) + blockers.push('Runner snapshot is incompatible. Retain it or restore a supported version before replacing routing.'); + return { assets, jobs, changes, blockers }; +} + + /***/ }), /***/ 85493: @@ -103582,6 +104489,8 @@ exports.hasRootLocalSetupAction = hasRootLocalSetupAction; exports.renderSetupWorkflowUpgrade = renderSetupWorkflowUpgrade; const js_yaml_1 = __nccwpck_require__(783); const node_util_1 = __nccwpck_require__(47261); +const setup_runner_policy_1 = __nccwpck_require__(91027); +const action_types_1 = __nccwpck_require__(19625); const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined; const document = (value) => { try { @@ -103601,22 +104510,37 @@ const runner = (value) => labels(value) || !!object(value) && Object.keys(value).length > 0 && (object(value).group === undefined || typeof object(value).group === 'string' && labels(object(value).group)) && (object(value).labels === undefined || labels(object(value).labels)); +const copilotCommands = new Set(Object.values(action_types_1.ACTIONS)); const callsRootAction = (jobs) => !!jobs && Object.values(jobs).some(job => { const steps = object(job)?.steps; - return Array.isArray(steps) && steps.some(step => object(step)?.uses === './'); + return Array.isArray(steps) && steps.some(step => { + const invocation = object(step); + const inputs = object(invocation?.with); + if (invocation?.uses !== './' || !inputs) + return false; + return typeof inputs['issue-workflow-profile'] === 'string' && typeof inputs['agent-provider'] === 'string' + || typeof inputs['single-action'] === 'string' && copilotCommands.has(inputs['single-action']) + || (inputs['pr-approval-observer'] === 'true' || inputs['pr-approval-observer'] === true) + && typeof inputs['pr-approval-policy'] === 'string'; + }); }); function hasRootLocalSetupAction(content) { return callsRootAction(object(document(content)?.jobs)); } /** Keep a target's reviewed execution location while upgrading controlled workflow templates. */ -function renderSetupWorkflowUpgrade(template, existing) { - if (!existing) +function renderSetupWorkflowUpgrade(template, existing, selection) { + const errors = (0, setup_runner_policy_1.validateSetupRunners)(selection?.runners); + if (errors.length) + throw new Error(errors.join(' ')); + if (!selection && !existing) return template; - const previous = document(existing); - if (previous?.jobs === undefined) + const previous = existing ? document(existing) : undefined; + if (!selection && previous?.jobs === undefined) return template; - const previousJobs = object(previous.jobs); - // A root-local Action is source-repository infrastructure, including its + const previousJobs = previous?.jobs === undefined ? {} : object(previous.jobs); + if (!previousJobs) + throw new Error('Workflow jobs cannot be inspected; review the workflow separately.'); + // A root-local Copilot invocation is source-repository infrastructure, including its // release jobs and native validation. Consumer templates cannot replace it. if (callsRootAction(previousJobs)) { const events = previous.on; @@ -103656,7 +104580,9 @@ function renderSetupWorkflowUpgrade(template, existing) { job = header[1]; if (!/^ {4}runs-on:/u.test(lines[index])) continue; - const retained = object(previousJobs[job])?.['runs-on']; + const role = selection && (0, setup_runner_policy_1.setupRunnerRole)(selection.file, job); + const retained = (0, setup_runner_policy_1.selectedSetupRunsOn)(selection?.runners, role) + ?? object(previousJobs[job])?.['runs-on']; if (retained === undefined) continue; if (!runner(retained)) @@ -103677,7 +104603,8 @@ function renderSetupWorkflowUpgrade(template, existing) { const rendered = lines.join('\n'); const actualJobs = object(document(rendered)?.jobs); for (const [name, value] of Object.entries(templateJobs)) { - const retained = object(previousJobs[name])?.['runs-on']; + const retained = (0, setup_runner_policy_1.selectedSetupRunsOn)(selection?.runners, selection && (0, setup_runner_policy_1.setupRunnerRole)(selection.file, name)) + ?? object(previousJobs[name])?.['runs-on']; if (retained !== undefined && object(value)?.['runs-on'] !== undefined && !(0, node_util_1.isDeepStrictEqual)(object(actualJobs?.[name])?.['runs-on'], retained)) { throw new Error('Runner preservation could not be verified; review the workflow separately.'); diff --git a/build/github_action/index.js b/build/github_action/index.js index ee8d1845b..290ddb7bf 100644 --- a/build/github_action/index.js +++ b/build/github_action/index.js @@ -48815,7 +48815,7 @@ function validSetupBatchAssetPath(path) { return false; return path === 'AGENTS.md' || path === '.agents/skills/copilot-repository-workflow/SKILL.md' || /^\.github\/(?:workflows|ISSUE_TEMPLATE)\/[A-Za-z0-9_.-]+\.(?:yml|yaml)$/u.test(path) - || path === '.github/pull_request_template.md' || /^\.copilot\/(?:repository-profile|setup-manifest)\.json$/u.test(path) + || path === '.github/pull_request_template.md' || /^\.copilot\/(?:repository-profile|setup-manifest|runner-profile)\.json$/u.test(path) || path === '.copilot/AGENT_GUIDE.md' || path.startsWith('.copilot/setup-backups/'); } function validBranch(value) { @@ -48848,6 +48848,7 @@ const deployment_configuration_1 = __nccwpck_require__(22495); const locale_1 = __nccwpck_require__(15386); const issue_workflow_profile_1 = __nccwpck_require__(26744); const pull_request_approval_policy_1 = __nccwpck_require__(98820); +const setup_runner_1 = __nccwpck_require__(94301); exports.SETUP_AGENT_TASKS = [ 'planner', 'findings', @@ -48905,6 +48906,7 @@ function createDefaultSetupConfiguration() { const agents = Object.fromEntries(exports.SETUP_AGENT_TASKS.map(task => [task, defaultRole()])); const features = Object.fromEntries(Object.keys(exports.SETUP_FEATURE_DESCRIPTIONS).map(feature => [feature, feature !== 'inactiveIssueClosure'])); return { + runners: { ...setup_runner_1.DEFAULT_SETUP_RUNNERS, labels: [] }, features, agents, repository: { @@ -48994,6 +48996,8 @@ function mergeSetupConfiguration(base, overrides = {}) { } return { ...base, + runners: { ...setup_runner_1.DEFAULT_SETUP_RUNNERS, ...base.runners, ...overrides.runners, + labels: [...(overrides.runners?.labels ?? base.runners?.labels ?? [])] }, features, agents, repository: { ...base.repository, ...(overrides.repository ?? {}) }, @@ -49083,6 +49087,7 @@ function buildSetupPlan(configuration, mergeQueueReadiness = [], approvalReadine .filter(file => configuration.features.release !== false || file !== 'release.yml') .filter(file => configuration.features.hotfix !== false || file !== 'hotfix.yml'); const selectedFiles = [ + ...(configuration.runners && configuration.runners.mode !== 'retain' ? ['.copilot/runner-profile.json'] : []), ...workflowFiles.map(file => `workflows/${file}`), ...issueTemplateFiles.map(file => `ISSUE_TEMPLATE/${file}`), ...(configuration.features.pullRequestTemplate === false ? [] : ['pull_request_template.md']), @@ -49142,6 +49147,7 @@ function setupPlanGuardPaths(plan) { repository_agent_guidance_policy_1.REPOSITORY_AGENT_GUIDE_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_SKILL_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_POINTER_PATH, + '.copilot/runner-profile.json', ]; return [...new Set([...selected, ...retiredCandidates, ...guidanceCandidates])].sort(); } @@ -49655,8 +49661,10 @@ const issue_workflow_profile_1 = __nccwpck_require__(26744); const setup_issue_workflow_policy_1 = __nccwpck_require__(81182); const pull_request_approval_policy_1 = __nccwpck_require__(98820); const setup_project_selection_policy_1 = __nccwpck_require__(73750); +const setup_runner_policy_1 = __nccwpck_require__(91027); function validateSetupConfiguration(configuration, options = {}) { const errors = []; + errors.push(...(0, setup_runner_policy_1.validateSetupRunners)(configuration.runners)); const projectSelection = (0, setup_project_selection_policy_1.parseSetupProjectSelection)(configuration.projects.ids); if ('error' in projectSelection || projectSelection.value !== configuration.projects.ids) { errors.push('Project IDs must be a comma-separated list of 1–10 distinct positive Project URL numbers; PVT_ node IDs are not accepted.'); @@ -50405,6 +50413,188 @@ function setupSecretRevisionSnapshot(remote) { } +/***/ }), + +/***/ 91027: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.validSetupRunnerProfile = validSetupRunnerProfile; +exports.parseSetupRunnerProfiles = parseSetupRunnerProfiles; +exports.setupRunnerRegistry = setupRunnerRegistry; +exports.validateSetupRunners = validateSetupRunners; +exports.selectSetupRunnerMode = selectSetupRunnerMode; +exports.setupRunnerProfileIsFresh = setupRunnerProfileIsFresh; +exports.reusableSetupRunnerDefaults = reusableSetupRunnerDefaults; +exports.setupRunnerRole = setupRunnerRole; +exports.selectedSetupRunsOn = selectedSetupRunsOn; +exports.setupRunnerReadiness = setupRunnerReadiness; +const setup_runner_1 = __nccwpck_require__(94301); +const sensitive_text_1 = __nccwpck_require__(47122); +const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value); +const exact = (value, keys) => Object.keys(value).every(key => keys.includes(key)); +const literal = (value, empty = false) => typeof value === 'string' && value.length <= 100 + && (empty || value.trim().length > 0) && value === value.trim() && !/[\p{Cc}\p{Cf}${}<>]/u.test(value) + && (0, sensitive_text_1.redactSensitiveText)(value) === value; +const id = (value) => typeof value === 'string' && /^[A-Za-z0-9][A-Za-z0-9_.-]{0,49}$/u.test(value) + && (0, sensitive_text_1.redactSensitiveText)(value) === value; +function validSetupRunnerProfile(value) { + if (!object(value) || !exact(value, ['id', 'group', 'labels', 'validation']) || !id(value.id) + || !literal(value.group, true) || !['hosted', 'agent'].includes(String(value.validation)) + || !Array.isArray(value.labels) || value.labels.length < 1 || value.labels.length > 10 + || !value.labels.every(label => literal(label))) + return false; + const labels = value.labels.map(label => label.toLowerCase()); + return new Set(labels).size === labels.length && labels.includes('self-hosted') + && !labels.includes('windows') && (labels.includes('linux') || labels.includes('macos')); +} +function parseSetupRunnerProfiles(value) { + if (value.length > 16000) + return undefined; + try { + const parsed = JSON.parse(value); + if (!object(parsed) || !exact(parsed, ['schemaVersion', 'profiles']) || parsed.schemaVersion !== 1 + || !Array.isArray(parsed.profiles) || parsed.profiles.length < 1 || parsed.profiles.length > 10 + || !parsed.profiles.every(validSetupRunnerProfile)) + return undefined; + const profiles = parsed.profiles; + if (new Set(profiles.map(profile => profile.id.toLowerCase())).size !== profiles.length) + return undefined; + return profiles.map(profile => ({ ...profile, labels: [...profile.labels] })); + } + catch { + return undefined; + } +} +/** A repository override shadows the organization registry even when it is invalid. */ +function setupRunnerRegistry(remote) { + // Unknown repository inventory cannot prove that a higher-priority override is absent. + // A readable organization registry alone must not authorize selecting or reusing its route. + if (!remote || remote.repositoryVariablesAccess !== 'available') + return { profiles: [], status: 'unavailable' }; + const repository = remote.repositoryVariables.filter(variable => variable.name.toUpperCase() === setup_runner_1.SETUP_RUNNER_REGISTRY); + const organization = remote.organizationVariables.filter(variable => variable.name.toUpperCase() === setup_runner_1.SETUP_RUNNER_REGISTRY); + const entries = repository.length ? repository : organization; + if (!repository.length && remote.organizationVariablesAccess !== 'available') + return { profiles: [], status: 'unavailable' }; + if (!entries.length) + return { profiles: [], status: 'missing' }; + const profiles = entries.length === 1 ? parseSetupRunnerProfiles(entries[0].value) : undefined; + const scope = repository.length ? 'repository' : 'organization'; + return profiles ? { profiles, status: 'available', scope, source: { scope, value: entries[0].value } } + : { profiles: [], status: 'invalid', scope }; +} +function validateSetupRunners(value) { + if (value === undefined) + return []; + const invalid = ['Runner configuration is invalid. Choose retain/hosted, or an exact Linux/macOS self-hosted profile; review group, unique labels and registry version.']; + if (!object(value) || !exact(value, ['mode', 'profileId', 'group', 'labels', 'validation', 'source', 'discover']) + || value.discover !== undefined && typeof value.discover !== 'boolean' + || !['retain', 'hosted', 'organization-profile', 'manual-self-hosted'].includes(String(value.mode)) + || !literal(value.group, true) || typeof value.profileId !== 'string' + || !Array.isArray(value.labels) || !['hosted', 'agent'].includes(String(value.validation))) + return invalid; + if (value.mode === 'retain' || value.mode === 'hosted') + return value.group === '' && value.profileId === '' + && value.labels.length === 0 && value.validation === 'hosted' && value.source === undefined ? [] : invalid; + if (!validSetupRunnerProfile({ id: value.profileId || 'manual', group: value.group, labels: value.labels, validation: value.validation })) + return invalid; + if (value.mode === 'manual-self-hosted') + return value.profileId === '' && value.source === undefined ? [] : invalid; + if (!id(value.profileId) || !object(value.source) || !exact(value.source, ['scope', 'value']) + || !['repository', 'organization'].includes(String(value.source.scope)) || typeof value.source.value !== 'string') + return invalid; + const selected = parseSetupRunnerProfiles(value.source.value)?.find(profile => profile.id === value.profileId); + return selected && selected.group === value.group && selected.validation === value.validation + && JSON.stringify(selected.labels) === JSON.stringify(value.labels) ? [] : invalid; +} +function selectSetupRunnerMode(mode) { + return mode === 'manual-self-hosted' + ? { mode, profileId: '', group: '', labels: ['self-hosted', 'Linux'], validation: 'hosted' } + : { ...setup_runner_1.DEFAULT_SETUP_RUNNERS, mode, labels: [] }; +} +function setupRunnerProfileIsFresh(configuration, remote) { + if (configuration?.mode !== 'organization-profile') + return true; + const registry = setupRunnerRegistry(remote); + return registry.status === 'available' && registry.source?.scope === configuration.source?.scope + && registry.source?.value === configuration.source?.value; +} +/** A prior target supplies visible defaults only; registry overrides resolve again for this target. */ +function reusableSetupRunnerDefaults(previous, remote) { + if (!previous || previous.mode === 'retain') + return undefined; + if (previous.mode === 'organization-profile') { + const registry = setupRunnerRegistry(remote); + const profile = registry.profiles.find(profile => profile.id === previous.profileId); + if (!profile) + return undefined; + return { mode: previous.mode, profileId: profile.id, group: profile.group, labels: [...profile.labels], validation: profile.validation, source: registry.source, + ...(previous.discover !== undefined ? { discover: previous.discover } : {}) }; + } + return { ...previous, labels: [...previous.labels] }; +} +/** Security roles are fixed by the template catalog, never guessed from user job names. */ +function setupRunnerRole(file, job) { + const agentJobs = { + 'copilot_issue.yml': 'copilot-issues', 'copilot_issue_comment.yml': 'copilot-issues', + 'copilot_pull_request.yml': 'copilot-pull-requests', 'copilot_pull_request_comment.yml': 'copilot-pull-requests', + 'copilot_commit.yml': 'copilot-commits', 'agent-cli-provisioning.yml': 'verify-agent-clis', + }; + if (agentJobs[file] === job) + return 'agent'; + if (file === 'copilot_pull_request_approval.yml' && job === 'observe-approval') + return 'observer'; + if (file === 'copilot_pull_request_merge_queue.yml' && job === 'copilot-pull-request-required-check') + return 'isolated'; + if (['release_workflow.yml', 'hotfix_workflow.yml'].includes(file)) { + if (['publish', 'publish-npm'].includes(job)) + return 'publication'; + if (['validate', 'prepare-version-files', 'promote', 'resume-reconciliation', 'report-failure'].includes(job)) + return 'validation'; + } + const helperJobs = { + 'copilot_branch_sync.yml': ['branch-sync'], 'copilot_close_inactive_issues.yml': ['copilot-inactive-issues'], + 'copilot_pull_request_review_state.yml': ['copilot-pull-request-review-state'], + 'copilot_deployment_orchestration.yml': ['resolve-operation', 'mutate'], + 'copilot_credential_health.yml': ['verify-pat', 'verify-openai', 'verify-anthropic', 'verify-google', 'verify-openrouter', 'verify-cursor', 'verify-opencode', 'verify-codex-api-key'], + }; + return helperJobs[file]?.includes(job) ? file === 'copilot_credential_health.yml' ? 'credential-health' : 'validation' : undefined; +} +function selectedSetupRunsOn(configuration, role) { + if (!configuration || configuration.mode === 'retain' || role === undefined + || ['observer', 'publication', 'isolated'].includes(role)) + return undefined; + if (role === 'credential-health') + return 'ubuntu-latest'; + if (configuration.mode === 'hosted' || role === 'validation' && configuration.validation === 'hosted') + return 'ubuntu-latest'; + return configuration.group ? { group: configuration.group, labels: [...configuration.labels] } : [...configuration.labels]; +} +function setupRunnerReadiness(route, inventory) { + if (JSON.stringify(route).includes('${{')) + return 'access-unknown'; + const group = typeof route === 'object' && !Array.isArray(route) ? route.group : undefined; + const raw = typeof route === 'string' || Array.isArray(route) ? route : route.labels; + const labels = (typeof raw === 'string' ? [raw] : raw ?? []).map(label => label.toLowerCase()); + if (!group && labels.length === 1 && /^(ubuntu|macos|windows)-(latest|[0-9][a-z0-9.-]*)$/u.test(labels[0])) + return 'hosted'; + if (!inventory || inventory.status !== 'available') + return 'access-unknown'; + const matches = inventory.candidates.filter(candidate => (!group || candidate.group === group) + && labels.every(label => candidate.labels.some(actual => actual.toLowerCase() === label))); + if (!matches.length) + return group && inventory.groups.some(candidate => candidate.name === group && candidate.access === 'confirmed') + ? 'unavailable' : 'access-unknown'; + const authorized = matches.filter(candidate => candidate.access === 'confirmed'); + if (!authorized.length) + return 'access-unknown'; + return authorized.some(candidate => candidate.status === 'online' && !candidate.busy) ? 'ready' : 'pending-capacity'; +} + + /***/ }), /***/ 3449: @@ -54055,6 +54245,7 @@ exports.ensureRepositorySecrets = ensureRepositorySecrets; exports.resolveRemoteConfiguration = resolveRemoteConfiguration; exports.groupSetupResources = groupSetupResources; const setup_remote_facts_policy_1 = __nccwpck_require__(92567); +const setup_runner_policy_1 = __nccwpck_require__(91027); const setup_configuration_policy_1 = __nccwpck_require__(56637); const logging_ports_1 = __nccwpck_require__(6152); const application_error_1 = __nccwpck_require__(75999); @@ -54149,13 +54340,24 @@ async function ensureRepositorySecrets(context, dependencies, setupConfiguration } } async function resolveRemoteConfiguration(context, dependencies, setupConfiguration, errors) { + let runnerRemote; + if (setupConfiguration?.runners?.mode === 'organization-profile') { + try { + runnerRemote = await dependencies.setupRemoteConfigurationReadPort?.inspect(); + } + catch { /* Unknown cannot establish profile freshness. */ } + if (!runnerRemote || !(0, setup_runner_policy_1.setupRunnerProfileIsFresh)(setupConfiguration.runners, runnerRemote)) { + errors.push('The reviewed runner registry changed or is unavailable. No changes were made; inspect and approve a fresh profile snapshot.'); + return undefined; + } + } if (context.setupConfigurationSource === 'organization') { if (!context.setupRemoteConfiguration || !dependencies.setupRemoteConfigurationReadPort) { errors.push('Organization reuse requires a fresh inventory before Apply. No changes were made.'); return undefined; } try { - const fresh = await dependencies.setupRemoteConfigurationReadPort.inspect(); + const fresh = runnerRemote ?? await dependencies.setupRemoteConfigurationReadPort.inspect(); if (!(0, setup_remote_facts_policy_1.hasCompleteSetupSecretRevisions)(fresh) || !(0, setup_remote_facts_policy_1.hasCompleteSetupSecretRevisions)(context.setupRemoteConfiguration)) { errors.push('Retained Secret revision metadata could not be verified. Restore metadata access and prepare a fresh plan. No changes were made.'); return undefined; @@ -54171,6 +54373,8 @@ async function resolveRemoteConfiguration(context, dependencies, setupConfigurat return undefined; } } + if (runnerRemote) + return runnerRemote; if (context.setupRemoteConfiguration) return context.setupRemoteConfiguration; if (!dependencies.setupRemoteConfigurationReadPort || !setupConfiguration) @@ -82626,6 +82830,21 @@ exports.SETUP_BATCH_MAX_TARGETS = void 0; exports.SETUP_BATCH_MAX_TARGETS = 25; +/***/ }), + +/***/ 94301: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DEFAULT_SETUP_RUNNERS = exports.SETUP_RUNNER_REGISTRY = void 0; +exports.SETUP_RUNNER_REGISTRY = 'COPILOT_RUNNER_PROFILES'; +exports.DEFAULT_SETUP_RUNNERS = Object.freeze({ + mode: 'retain', profileId: '', group: '', labels: Object.freeze([]), validation: 'hosted', +}); + + /***/ }), /***/ 24596: @@ -89569,7 +89788,7 @@ function copySetupFile(source, destination, displaySource, displayDestination, o (0, logger_1.logInfo)(` ⏭️ ${displayDestination} already exists; skipping.`); return { copied: 0, skipped: 1 }; } - const rendered = options.renderContent?.(fs.readFileSync(source, 'utf8'), fs.existsSync(destination) ? fs.readFileSync(destination, 'utf8') : undefined); + const rendered = options.renderContent?.(fs.readFileSync(source, 'utf8'), fs.existsSync(destination) ? fs.readFileSync(destination, 'utf8') : undefined, path.basename(source)); if (fs.existsSync(destination) && options.backupDirectory) { fs.mkdirSync(options.backupDirectory, { recursive: true }); fs.copyFileSync(destination, path.join(options.backupDirectory, path.basename(destination))); @@ -89651,6 +89870,8 @@ const setup_issue_workflow_policy_1 = __nccwpck_require__(81182); const repository_agent_guidance_1 = __nccwpck_require__(38445); const setup_approval_workflow_1 = __nccwpck_require__(9512); const setup_workflow_upgrade_1 = __nccwpck_require__(85493); +const setup_installation_review_1 = __nccwpck_require__(23799); +const repository_agent_guidance_policy_1 = __nccwpck_require__(67402); /** * Ensure .github, .github/workflows and .github/ISSUE_TEMPLATE exist; create them if missing. * @param cwd - Directory (repo root) @@ -89685,6 +89906,13 @@ function copySetupFiles(cwd, setupDirOverride, features, options = {}) { const setupDir = setupDirOverride ?? path.join(__dirname, '..', '..', 'setup'); if (!fs.existsSync(setupDir)) return { copied: 0, skipped: 0 }; + const installationReview = options.setupConfiguration && (0, setup_installation_review_1.inspectSetupInstallation)(cwd, options.setupConfiguration, setupDir); + if (installationReview?.blockers.length) + throw new Error(installationReview.blockers.join(' ')); + const preserveSourceGuidance = installationReview?.assets.some(asset => asset.path === repository_agent_guidance_policy_1.REPOSITORY_AGENT_GUIDE_PATH && asset.status === 'source-only'); + const sourceInstallation = installationReview?.assets.some(asset => asset.path.startsWith('.github/workflows/') && asset.status === 'source-only'); + const snapshotContent = options.setupConfiguration && (0, setup_installation_review_1.renderSetupRunnerSnapshot)(options.setupConfiguration); + const snapshotPath = path.join(cwd, setup_installation_review_1.SETUP_RUNNER_SNAPSHOT); const approvedWorkflowFiles = new Set(options.approvedWorkflowFiles ?? []); const effectiveFeatures = options.setupConfiguration ? (0, setup_issue_workflow_policy_1.effectiveIssueWorkflowFeatures)(options.setupConfiguration) @@ -89698,17 +89926,20 @@ function copySetupFiles(cwd, setupDirOverride, features, options = {}) { : { copied: 0, skipped: 0 }; const workflows = (0, setup_file_copy_1.copySetupDirectory)(path.join(setupDir, 'workflows'), path.join(cwd, '.github', 'workflows'), (fileName) => (fileName.endsWith('.yml') || fileName.endsWith('.yaml')) && fileName !== 'copilot_pull_request_approval.yml' + && (!sourceInstallation || fileName === 'copilot_commit.yml' || !fs.existsSync(path.join(cwd, '.github', 'workflows', fileName))) && (0, setup_workflow_catalog_1.isSetupWorkflowEnabled)(fileName, effectiveFeatures) && (!options.updateExistingWorkflows || approvedWorkflowFiles.has(fileName) || !fs.existsSync(path.join(cwd, '.github', 'workflows', fileName))), 'setup/workflows', { overwrite: options.updateExistingWorkflows, backupDirectory, - renderContent: setup_workflow_upgrade_1.renderSetupWorkflowUpgrade, + renderContent: (template, existing, file) => (0, setup_workflow_upgrade_1.renderSetupWorkflowUpgrade)(template, existing, options.setupConfiguration && file ? { file, runners: options.setupConfiguration.runners } : undefined), }); - const approvalWorkflow = options.setupConfiguration?.pullRequestApproval.mode !== 'off' && options.setupConfiguration - ? copyApprovalObserverWorkflow(cwd, setupDir, options.setupConfiguration, options.updateExistingWorkflows === true, approvedWorkflowFiles, backupDirectory) - : { copied: 0, skipped: 0 }; + const approvalWorkflow = sourceInstallation && fs.existsSync(path.join(cwd, '.github/workflows/copilot_pull_request_approval.yml')) + ? { copied: 0, skipped: 1 } + : options.setupConfiguration?.pullRequestApproval.mode !== 'off' && options.setupConfiguration + ? copyApprovalObserverWorkflow(cwd, setupDir, options.setupConfiguration, options.updateExistingWorkflows === true, approvedWorkflowFiles, backupDirectory) + : { copied: 0, skipped: 0 }; const issueTemplates = options.setupConfiguration ? copySelectedIssueForms(cwd, setupDir, options.setupConfiguration) : (0, setup_file_copy_1.copySetupDirectory)(path.join(setupDir, 'ISSUE_TEMPLATE'), path.join(cwd, '.github', 'ISSUE_TEMPLATE'), (fileName) => features?.issueTemplates !== false @@ -89719,10 +89950,20 @@ function copySetupFiles(cwd, setupDirOverride, features, options = {}) { const pullRequestTemplate = features?.pullRequestTemplate === false ? { copied: 0, skipped: 0 } : (0, setup_file_copy_1.copySetupFile)(path.join(setupDir, 'pull_request_template.md'), path.join(cwd, '.github', 'pull_request_template.md'), 'setup/pull_request_template.md', '.github/pull_request_template.md'); - const guidance = options.setupConfiguration && !options.preserveExistingAgentGuidance + const guidance = options.setupConfiguration && !options.preserveExistingAgentGuidance && !preserveSourceGuidance ? (0, repository_agent_guidance_1.reconcileRepositoryAgentGuidance)(cwd, options.setupConfiguration) : { copied: 0, skipped: 0 }; - return [retired, workflows, approvalWorkflow, issueTemplates, pullRequestTemplate, guidance].reduce((total, current) => ({ + const snapshot = { copied: 0, skipped: 0 }; + if (snapshotContent) { + if (fs.existsSync(snapshotPath) && fs.readFileSync(snapshotPath, 'utf8') === snapshotContent) + snapshot.skipped++; + else { + backupSetupAsset(cwd, setup_installation_review_1.SETUP_RUNNER_SNAPSHOT, 'runner-profile'); + atomicWriteSetupAsset(snapshotPath, snapshotContent); + snapshot.copied++; + } + } + return [retired, workflows, approvalWorkflow, issueTemplates, pullRequestTemplate, guidance, snapshot].reduce((total, current) => ({ copied: total.copied + current.copied, skipped: total.skipped + current.skipped, }), { copied: 0, skipped: 0 }); @@ -89851,6 +90092,8 @@ function compareSetupWorkflows(cwd, features, setupDirOverride, configuration) { const sourceDirectory = path.join(setupDir, 'workflows'); if (!fs.existsSync(sourceDirectory)) return []; + const sourceInstallation = configuration && (0, setup_installation_review_1.inspectSetupInstallation)(cwd, configuration, setupDir).assets + .some(asset => asset.path.startsWith('.github/workflows/') && asset.status === 'source-only'); return fs.readdirSync(sourceDirectory) .filter(file => (file.endsWith('.yml') || file.endsWith('.yaml')) && (0, setup_workflow_catalog_1.isSetupWorkflowEnabled)(file, features) && (file !== 'copilot_pull_request_approval.yml' || (configuration && configuration.pullRequestApproval.mode !== 'off'))) @@ -89860,9 +90103,11 @@ function compareSetupWorkflows(cwd, features, setupDirOverride, configuration) { const destination = path.join(cwd, '.github', 'workflows', file); if (!fs.existsSync(destination)) return { file, destination: `.github/workflows/${file}`, status: 'missing' }; + if (sourceInstallation && file !== 'copilot_commit.yml') + return { file, destination: `.github/workflows/${file}`, status: 'unchanged' }; const expected = file === 'copilot_pull_request_approval.yml' && configuration ? (0, setup_approval_workflow_1.renderApprovalObserverWorkflow)(fs.readFileSync(source, 'utf8'), configuration.pullRequestApproval) - : (0, setup_workflow_upgrade_1.renderSetupWorkflowUpgrade)(fs.readFileSync(source, 'utf8'), fs.readFileSync(destination, 'utf8')); + : (0, setup_workflow_upgrade_1.renderSetupWorkflowUpgrade)(fs.readFileSync(source, 'utf8'), fs.readFileSync(destination, 'utf8'), configuration ? { file, runners: configuration.runners } : undefined); const equal = isLocalSourceApprovalObserver(cwd, destination) || expected === fs.readFileSync(destination, 'utf8'); return { file, destination: `.github/workflows/${file}`, status: equal ? 'unchanged' : 'changed' }; @@ -89909,6 +90154,170 @@ function hasValidSetupToken(cwd, override) { } +/***/ }), + +/***/ 23799: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SETUP_RUNNER_SNAPSHOT = void 0; +exports.renderSetupRunnerSnapshot = renderSetupRunnerSnapshot; +exports.compatibleSetupRunnerSnapshot = compatibleSetupRunnerSnapshot; +exports.inspectSetupInstallation = inspectSetupInstallation; +const node_fs_1 = __nccwpck_require__(87561); +const node_path_1 = __nccwpck_require__(49411); +const js_yaml_1 = __nccwpck_require__(783); +const node_crypto_1 = __nccwpck_require__(6005); +const setup_workflow_catalog_1 = __nccwpck_require__(24596); +const setup_issue_workflow_policy_1 = __nccwpck_require__(81182); +const setup_runner_policy_1 = __nccwpck_require__(91027); +const setup_workflow_upgrade_1 = __nccwpck_require__(85493); +const setup_approval_workflow_1 = __nccwpck_require__(9512); +const sensitive_text_1 = __nccwpck_require__(47122); +const repository_agent_guidance_policy_1 = __nccwpck_require__(67402); +exports.SETUP_RUNNER_SNAPSHOT = '.copilot/runner-profile.json'; +const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) + ? value : undefined; +const read = (path) => (0, node_fs_1.existsSync)(path) ? (0, node_fs_1.readFileSync)(path, 'utf8') : undefined; +function renderSetupRunnerSnapshot(configuration) { + if (!configuration.runners || configuration.runners.mode === 'retain') + return undefined; + const errors = (0, setup_runner_policy_1.validateSetupRunners)(configuration.runners); + if (errors.length) + throw new Error(errors.join(' ')); + const { source, discover: _discover, ...runners } = configuration.runners; + return `${JSON.stringify({ schemaVersion: 1, runners, ...(source ? { source: { scope: source.scope, + registryDigest: (0, node_crypto_1.createHash)('sha256').update(source.value).digest('hex') } } : {}) }, null, 2)}\n`; +} +function compatibleSetupRunnerSnapshot(content) { + try { + const value = object(JSON.parse(content)); + if (!value || Object.keys(value).some(key => !['schemaVersion', 'runners', 'source'].includes(key)) || value.schemaVersion !== 1) + return false; + const runners = object(value.runners); + if (!runners || ['source', 'discover'].some(key => Object.prototype.hasOwnProperty.call(runners, key))) + return false; + if (runners.mode !== 'organization-profile') + return value.source === undefined && (0, setup_runner_policy_1.validateSetupRunners)(runners).length === 0; + const source = object(value.source); + if (!source || Object.keys(source).length !== 2 || !['repository', 'organization'].includes(String(source.scope)) + || typeof source.registryDigest !== 'string' || !/^[a-f0-9]{64}$/u.test(source.registryDigest)) + return false; + return (0, setup_runner_policy_1.validateSetupRunners)({ ...runners, source: { scope: source.scope, value: JSON.stringify({ schemaVersion: 1, + profiles: [{ id: runners.profileId, group: runners.group, labels: runners.labels, validation: runners.validation }] }) } }).length === 0; + } + catch { + return false; + } +} +/** Read-only parity and before/after review uses the exact same renderer as Apply. */ +function inspectSetupInstallation(root, configuration, setup = (0, node_path_1.join)(__dirname, '..', '..', 'setup')) { + const assets = []; + const jobs = []; + const changes = []; + const blockers = []; + const addJobs = (file, content, retained) => { + const documents = (0, js_yaml_1.loadAll)(content); + if (documents.length !== 1) + throw new Error('Workflow review needs exactly one YAML document.'); + const parsedJobs = object(object(documents[0])?.jobs); + if (!parsedJobs) + throw new Error('Workflow jobs are unavailable for review.'); + for (const [job, raw] of Object.entries(parsedJobs)) { + const runsOn = object(raw)?.['runs-on']; + if (runsOn === undefined) + continue; // reusable workflow calls have no runner + jobs.push({ file, job, role: (0, setup_runner_policy_1.setupRunnerRole)(file, job) ?? 'validation', + runsOn: runsOn, status: 'access-unknown', retained }); + if (jobs.length > 200) + throw new Error('Workflow review exceeds its fixed 200-job budget.'); + } + }; + const directory = (0, node_path_1.join)(root, '.github', 'workflows'); + const sourceFiles = (0, node_fs_1.existsSync)((0, node_path_1.join)(setup, 'workflows')) ? (0, node_fs_1.readdirSync)((0, node_path_1.join)(setup, 'workflows')).filter(file => file.endsWith('.yml') || file.endsWith('.yaml')) : []; + const installedFiles = (0, node_fs_1.existsSync)(directory) ? (0, node_fs_1.readdirSync)(directory).filter(file => file.endsWith('.yml') || file.endsWith('.yaml')) : []; + if (installedFiles.length > 100) + throw new Error('Workflow review exceeds its fixed 100-file budget.'); + const existing = new Map(installedFiles.map(file => { + const content = (0, node_fs_1.readFileSync)((0, node_path_1.join)(directory, file), 'utf8'); + if (Buffer.byteLength(content) > 100000) + throw new Error('Workflow review exceeds its per-file budget.'); + return [file, content]; + })); + if ([...existing.values()].reduce((sum, value) => sum + Buffer.byteLength(value), 0) > 2000000) + throw new Error('Workflow review exceeds its byte budget.'); + const source = [...existing.values()].some(setup_workflow_upgrade_1.hasRootLocalSetupAction); + const features = (0, setup_issue_workflow_policy_1.effectiveIssueWorkflowFeatures)(configuration); + for (const file of sourceFiles) { + const path = `.github/workflows/${file}`; + const before = existing.get(file); + const enabled = (0, setup_workflow_catalog_1.isSetupWorkflowEnabled)(file, features) && (file !== 'copilot_pull_request_approval.yml' || configuration.pullRequestApproval.mode !== 'off'); + const template = (0, node_fs_1.readFileSync)((0, node_path_1.join)(setup, 'workflows', file), 'utf8'); + const preserved = source && before !== undefined; + const after = !enabled ? before : preserved && file !== 'copilot_commit.yml' ? before + : file === 'copilot_pull_request_approval.yml' ? (0, setup_approval_workflow_1.renderApprovalObserverWorkflow)(template, configuration.pullRequestApproval) + : (0, setup_workflow_upgrade_1.renderSetupWorkflowUpgrade)(template, before, { file, runners: configuration.runners }); + assets.push({ path, enabled, status: before === undefined ? 'missing' : preserved ? 'source-only' + : before === after && (before === template || (configuration.runners?.mode ?? 'retain') !== 'retain') ? 'shared' : 'customized' }); + if (enabled && after !== undefined) { + addJobs(file, after, preserved || configuration.runners?.mode === 'retain' || !configuration.runners); + // Enabled workflows render or retain a complete string; disabled assets never produce removals. + if (before !== after) + changes.push({ path, before: before === undefined ? null : (0, sensitive_text_1.redactSensitiveText)(before), after: (0, sensitive_text_1.redactSensitiveText)(after) }); + } + } + for (const file of installedFiles.filter(file => !sourceFiles.includes(file))) { + assets.push({ path: `.github/workflows/${file}`, enabled: true, status: source ? 'source-only' : 'customized' }); + addJobs(file, existing.get(file), true); + } + for (const file of (0, node_fs_1.existsSync)((0, node_path_1.join)(setup, 'ISSUE_TEMPLATE')) ? (0, node_fs_1.readdirSync)((0, node_path_1.join)(setup, 'ISSUE_TEMPLATE')) : []) { + const path = `.github/ISSUE_TEMPLATE/${file}`; + const before = read((0, node_path_1.join)(root, path)); + assets.push({ path, enabled: features.issueTemplates !== false && features.issues !== false, + status: before === undefined ? 'missing' : before === read((0, node_path_1.join)(setup, 'ISSUE_TEMPLATE', file)) ? 'shared' : 'customized' }); + } + const guidance = [repository_agent_guidance_policy_1.REPOSITORY_AGENT_GUIDE_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_PROFILE_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_MANIFEST_PATH, repository_agent_guidance_policy_1.REPOSITORY_AGENT_SKILL_PATH]; + for (const path of guidance) { + // Markdown guidance is collaborator input, never runtime instructions. + // Parity needs its presence only; decode controlled JSON metadata separately. + const present = (0, node_fs_1.existsSync)((0, node_path_1.join)(root, path)); + let compatible = true; + if (present && path.endsWith('.json')) { + try { + const data = object(JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(root, path), 'utf8'))); + const generator = object(data?.generator); + // Profile and ownership-manifest generator contracts are distinct. + const contract = path === repository_agent_guidance_policy_1.REPOSITORY_AGENT_PROFILE_PATH ? 2 : 1; + compatible = data?.schemaVersion === 2 && generator?.name === '@vypdev/copilot' + && Object.keys(generator).length === 2 && generator.contractVersion === contract; + } + catch { + compatible = false; + } + } + assets.push({ path, enabled: configuration.repositoryAgentGuidance.enabled, + status: !present ? 'missing' : !compatible ? 'incompatible' : source ? 'source-only' : 'shared' }); + if (!compatible && configuration.repositoryAgentGuidance.enabled && !source) + blockers.push(`${path}: unsupported generator metadata. Retain the asset or restore a compatible generator before regeneration.`); + } + const presentGuidance = guidance.filter(path => (0, node_fs_1.existsSync)((0, node_path_1.join)(root, path))).length; + if (source && presentGuidance > 0 && presentGuidance !== guidance.length) + blockers.push('Source guidance is incomplete. Restore it with the checked-in source generator before setup.'); + const before = read((0, node_path_1.join)(root, exports.SETUP_RUNNER_SNAPSHOT)); + const after = renderSetupRunnerSnapshot(configuration); + assets.push({ path: exports.SETUP_RUNNER_SNAPSHOT, enabled: after !== undefined || before !== undefined, + status: before === undefined ? 'missing' : !compatibleSetupRunnerSnapshot(before) ? 'incompatible' : before === after || after === undefined ? 'shared' : 'customized' }); + if (after !== undefined && before !== after) + changes.push({ path: exports.SETUP_RUNNER_SNAPSHOT, + before: before === undefined ? null : (0, sensitive_text_1.redactSensitiveText)(before), after: (0, sensitive_text_1.redactSensitiveText)(after) }); + if (after !== undefined && before !== undefined && !compatibleSetupRunnerSnapshot(before)) + blockers.push('Runner snapshot is incompatible. Retain it or restore a supported version before replacing routing.'); + return { assets, jobs, changes, blockers }; +} + + /***/ }), /***/ 85493: @@ -89921,6 +90330,8 @@ exports.hasRootLocalSetupAction = hasRootLocalSetupAction; exports.renderSetupWorkflowUpgrade = renderSetupWorkflowUpgrade; const js_yaml_1 = __nccwpck_require__(783); const node_util_1 = __nccwpck_require__(47261); +const setup_runner_policy_1 = __nccwpck_require__(91027); +const action_types_1 = __nccwpck_require__(19625); const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value) ? value : undefined; const document = (value) => { try { @@ -89940,22 +90351,37 @@ const runner = (value) => labels(value) || !!object(value) && Object.keys(value).length > 0 && (object(value).group === undefined || typeof object(value).group === 'string' && labels(object(value).group)) && (object(value).labels === undefined || labels(object(value).labels)); +const copilotCommands = new Set(Object.values(action_types_1.ACTIONS)); const callsRootAction = (jobs) => !!jobs && Object.values(jobs).some(job => { const steps = object(job)?.steps; - return Array.isArray(steps) && steps.some(step => object(step)?.uses === './'); + return Array.isArray(steps) && steps.some(step => { + const invocation = object(step); + const inputs = object(invocation?.with); + if (invocation?.uses !== './' || !inputs) + return false; + return typeof inputs['issue-workflow-profile'] === 'string' && typeof inputs['agent-provider'] === 'string' + || typeof inputs['single-action'] === 'string' && copilotCommands.has(inputs['single-action']) + || (inputs['pr-approval-observer'] === 'true' || inputs['pr-approval-observer'] === true) + && typeof inputs['pr-approval-policy'] === 'string'; + }); }); function hasRootLocalSetupAction(content) { return callsRootAction(object(document(content)?.jobs)); } /** Keep a target's reviewed execution location while upgrading controlled workflow templates. */ -function renderSetupWorkflowUpgrade(template, existing) { - if (!existing) +function renderSetupWorkflowUpgrade(template, existing, selection) { + const errors = (0, setup_runner_policy_1.validateSetupRunners)(selection?.runners); + if (errors.length) + throw new Error(errors.join(' ')); + if (!selection && !existing) return template; - const previous = document(existing); - if (previous?.jobs === undefined) + const previous = existing ? document(existing) : undefined; + if (!selection && previous?.jobs === undefined) return template; - const previousJobs = object(previous.jobs); - // A root-local Action is source-repository infrastructure, including its + const previousJobs = previous?.jobs === undefined ? {} : object(previous.jobs); + if (!previousJobs) + throw new Error('Workflow jobs cannot be inspected; review the workflow separately.'); + // A root-local Copilot invocation is source-repository infrastructure, including its // release jobs and native validation. Consumer templates cannot replace it. if (callsRootAction(previousJobs)) { const events = previous.on; @@ -89995,7 +90421,9 @@ function renderSetupWorkflowUpgrade(template, existing) { job = header[1]; if (!/^ {4}runs-on:/u.test(lines[index])) continue; - const retained = object(previousJobs[job])?.['runs-on']; + const role = selection && (0, setup_runner_policy_1.setupRunnerRole)(selection.file, job); + const retained = (0, setup_runner_policy_1.selectedSetupRunsOn)(selection?.runners, role) + ?? object(previousJobs[job])?.['runs-on']; if (retained === undefined) continue; if (!runner(retained)) @@ -90016,7 +90444,8 @@ function renderSetupWorkflowUpgrade(template, existing) { const rendered = lines.join('\n'); const actualJobs = object(document(rendered)?.jobs); for (const [name, value] of Object.entries(templateJobs)) { - const retained = object(previousJobs[name])?.['runs-on']; + const retained = (0, setup_runner_policy_1.selectedSetupRunsOn)(selection?.runners, selection && (0, setup_runner_policy_1.setupRunnerRole)(selection.file, name)) + ?? object(previousJobs[name])?.['runs-on']; if (retained !== undefined && object(value)?.['runs-on'] !== undefined && !(0, node_util_1.isDeepStrictEqual)(object(actualJobs?.[name])?.['runs-on'], retained)) { throw new Error('Runner preservation could not be verified; review the workflow separately.'); diff --git a/build/web/assets/index-B-nJzeMw.css b/build/web/assets/index-B-nJzeMw.css deleted file mode 100644 index 7de68ff6f..000000000 --- a/build/web/assets/index-B-nJzeMw.css +++ /dev/null @@ -1 +0,0 @@ -.batch-targets.svelte-17t72gm{gap:1rem;margin-block:1rem;display:grid}.batch-target.svelte-17t72gm{border:1px solid var(--line);border-radius:.8rem;min-width:0;padding:1rem}h3.svelte-17t72gm{overflow-wrap:anywhere;margin-top:0}.target-status.svelte-17t72gm{font-weight:600}pre.svelte-17t72gm{max-height:24rem;padding:.75rem;font-size:.78rem;overflow:auto}code.svelte-17t72gm{overflow-wrap:anywhere}details.svelte-17t72gm{margin-block:.75rem}.batch-buttons.svelte-17t72gm{flex-wrap:wrap;gap:.75rem;display:flex}.batch-technical.svelte-17t72gm{margin-top:1.25rem}fieldset.svelte-1qngno{border:0;min-width:0;margin:1rem 0;padding:0}legend.svelte-1qngno{margin-bottom:.5rem;font-weight:600}.repository-list.svelte-1qngno{gap:.5rem;display:grid}.repository-row.svelte-1qngno{border:1px solid var(--line);border-radius:.75rem;align-items:start;gap:.75rem;padding:.75rem;display:flex}.repository-row.svelte-1qngno input:where(.svelte-1qngno){flex:none;width:auto;margin-top:.25rem}.repository-row.svelte-1qngno span:where(.svelte-1qngno){overflow-wrap:anywhere;min-width:0}.repository-row.svelte-1qngno small:where(.svelte-1qngno){margin-top:.25rem;display:block}.batch-actions.svelte-1qngno{flex-wrap:wrap;align-items:center;gap:.5rem;margin:.75rem 0;display:flex}details.svelte-1qngno{margin:1rem 0}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--page:#f6f8f7;--side:#102423;--side-line:#31504b;--side-text:#e8f5f0;--surface:#fff;--surface-soft:#f3f7f5;--line:#d7e3df;--control-line:#748b82;--text:#18312c;--muted:#58736b;--accent:#176e5e;--accent-strong:#075743;--accent-tint:#dff4e9;--focus:#966000;--warn:#76510d;--warn-bg:#fff6df;--error:#a73434;--error-bg:#fff0ec;--shadow:0 18px 50px #1e403414;font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}:root:not([data-theme=light]){--page:#0d1716;--side:#10201d;--side-line:#294a41;--side-text:#eaf7f1;--surface:#182722;--surface-soft:#20342d;--line:#355247;--control-line:#688f7f;--text:#eaf5ee;--muted:#adccbc;--accent:#7ed6ac;--accent-strong:#a4edc2;--accent-tint:#234b38;--focus:#ffca6a;--warn:#ffdd8a;--warn-bg:#463b21;--error:#ffc0b7;--error-bg:#4a2b2a;--shadow:0 18px 50px #00000024}}:root[data-theme=dark]{--page:#0d1716;--side:#10201d;--side-line:#294a41;--side-text:#eaf7f1;--surface:#182722;--surface-soft:#20342d;--line:#355247;--control-line:#688f7f;--text:#eaf5ee;--muted:#adccbc;--accent:#7ed6ac;--accent-strong:#a4edc2;--accent-tint:#234b38;--focus:#ffca6a;--warn:#ffdd8a;--warn-bg:#463b21;--error:#ffc0b7;--error-bg:#4a2b2a;--shadow:0 18px 50px #00000024}:root[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}body{background:var(--page);color:var(--text);margin:0}button,input,select{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.5}:focus-visible{outline:3px solid var(--focus);outline-offset:3px}.visually-hidden{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}a{color:var(--accent-strong);text-underline-offset:3px}.card,.context-card{background:var(--surface);border:1px solid var(--line);box-shadow:var(--shadow);border-radius:15px}.primary{border:1px solid var(--accent-strong);background:var(--accent-strong);color:var(--side);border-radius:8px;min-height:43px;padding:12px 18px;font-size:12px;font-weight:800}:root[data-theme=light] .primary,:root:not([data-theme=dark]) .primary{color:#fff}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .primary{color:#0d2419}}.primary span{margin-left:18px}.primary:hover:not(:disabled){filter:brightness(1.1)}.secondary{border:1px solid var(--control-line);color:var(--text);background:var(--surface-soft);border-radius:8px;padding:11px 16px;font-size:12px;font-weight:700}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}.shell{grid-template-columns:minmax(250px,288px) minmax(0,1fr);min-height:100vh;display:grid}.sidebar{background:var(--side);color:var(--side-text);flex-direction:column;min-height:100vh;padding:34px 28px;display:flex;position:sticky;top:0}.brand{letter-spacing:-.035em;align-items:center;gap:13px;display:flex}.brand-mark{color:#0c3021;background:#75d9a0;border-radius:11px;place-items:center;width:37px;height:37px;font-size:26px;line-height:1;display:grid}.brand strong{font-size:23px;line-height:1;display:block}.brand small{letter-spacing:.23em;color:#aac8bd;margin-top:5px;font-size:9px;font-weight:800;display:block}.rail-caption{color:#9dbab0;letter-spacing:.18em;margin-block:78px 22px;margin-inline-start:7px;font-size:10px;font-weight:800}.sidebar .description{color:#afcabe}.steps{margin:0;padding:0;list-style:none;position:relative}.steps:before{content:"";top:22px;bottom:22px;background:var(--side-line);width:1px;position:absolute;inset-inline-start:19px}.steps li{color:#a6c2b7;border-radius:10px;align-items:center;gap:16px;min-height:55px;padding-block:8px;padding-inline:1px 12px;font-size:13px;font-weight:600;display:flex;position:relative}.steps li.current{color:#fff;background:#25443b}.steps li.completed{color:#dbf2e4}.step-index{border:1px solid var(--side-line);background:var(--side);letter-spacing:.04em;border-radius:50%;flex:0 0 37px;place-items:center;height:37px;font-size:11px;font-weight:800;display:grid}.steps .current .step-index{color:#102b1d;background:#80dba8;border-color:#80dba8}.steps .completed .step-index{color:#b9f8c9;background:#204c37;border-color:#45966b;font-size:15px}.sidebar-note{border:1px solid var(--side-line);background:#ffffff09;border-radius:13px;gap:13px;margin-top:auto;padding:19px 16px;display:flex}.sidebar-note>span{color:#8fe1ae;font-size:20px}.sidebar-note strong{font-size:12px}.sidebar-note p{color:#afcabe;margin:6px 0 0;font-size:11px;line-height:1.6}.main{min-width:0}.topbar{border-bottom:1px solid var(--line);background:var(--surface);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;min-height:80px;padding:20px clamp(24px,4vw,70px);display:flex}.breadcrumb{flex:240px;align-items:center;gap:12px;min-width:0;font-size:12px;display:flex}.breadcrumb span:first-child{color:var(--muted);letter-spacing:.14em;font-size:10px;font-weight:800}.breadcrumb span:nth-child(2){color:var(--muted)}.breadcrumb strong{white-space:normal;overflow-wrap:anywhere;min-width:0;line-height:1.5}.top-actions{flex-shrink:0;align-items:center;gap:18px;display:flex}.local-pill{color:var(--accent-strong);background:var(--accent-tint);letter-spacing:.08em;white-space:nowrap;border-radius:6px;padding:8px 11px;font-size:10px;font-weight:800}.pulse-dot{background:currentColor;border-radius:50%;width:6px;height:6px;margin-right:5px;display:inline-block}.theme-switch{border:1px solid var(--line);background:var(--surface-soft);border-radius:8px;padding:3px;display:flex}.theme-switch button{color:var(--muted);background:0 0;border:0;border-radius:5px;min-width:31px;height:27px;font-size:11px}.theme-switch button.active{background:var(--surface);color:var(--text);font-weight:800;box-shadow:0 1px 4px #0000001f}.content{max-width:1320px;margin:0 auto;padding:52px clamp(24px,4vw,70px) 35px}.eyebrow{color:var(--accent-strong);letter-spacing:.18em;align-items:center;gap:10px;font-size:10px;font-weight:900;display:flex}.eyebrow-line{background:var(--accent);width:21px;height:2px}.eyebrow-count{color:var(--muted);letter-spacing:.09em;margin-inline-start:8px}h1{letter-spacing:-.045em;max-width:860px;margin:15px 0 13px;font-size:clamp(30px,3vw,45px);line-height:1.15}.lede{color:var(--muted);max-width:700px;margin:0 0 30px;font-size:14px;line-height:1.65}.workspace-grid{grid-template-columns:minmax(0,1.65fr) minmax(230px,.8fr);align-items:start;gap:19px;display:grid}.workspace-grid:has(.plan-review){grid-template-columns:1fr}.workspace-grid:has(.plan-review) .context-column{grid-template-columns:repeat(2,minmax(0,1fr))}.context-column{gap:17px;display:grid}.context-card{box-shadow:none;padding:25px}.context-icon{background:var(--accent-tint);width:32px;height:32px;color:var(--accent-strong);border-radius:8px;place-items:center;font-size:19px;display:grid}.context-card h2{letter-spacing:-.015em;margin:17px 0 7px;font-size:14px}.context-card p,.context-card>small{color:var(--muted);margin:0 0 12px;font-size:12px;line-height:1.65;display:block}.context-card code{background:var(--surface-soft);overflow-wrap:anywhere;border-radius:6px;padding:10px;font-size:11px;display:block}.permissions ul{margin:8px 0 13px;padding:0;list-style:none}.permissions li{border-bottom:1px solid var(--line);justify-content:space-between;gap:10px;padding:9px 0;font-size:11px;display:flex}.permissions li small{color:var(--muted);margin-top:3px;display:block}.permissions li strong{color:var(--accent-strong);text-transform:uppercase;font-size:9px}.permission-progress{padding:clamp(20px,4vw,38px)}.permission-progress h2{margin:0 0 8px}.permission-progress p{color:var(--muted);line-height:1.5}.permission-progress ol{margin:20px 0 0;padding:0;list-style:none}.permission-progress li{border-top:1px solid var(--line);align-items:center;gap:14px;padding:12px 0;display:flex}.permission-progress li>span:nth-child(2){flex:1;min-width:0}.permission-progress li small{color:var(--muted);overflow-wrap:anywhere;display:block}.permission-progress-symbol{background:var(--surface-soft);border-radius:50%;flex:none;place-items:center;width:30px;height:30px;display:grid}.permission-progress-done .permission-progress-symbol{color:var(--accent-strong)}.permission-progress-failed .permission-progress-symbol{color:var(--danger,#a33)}.permission-progress-state{text-align:right;max-width:35%;font-size:.8rem;font-weight:600}@media (width<=600px){.permission-progress li{flex-wrap:wrap;align-items:flex-start}.permission-progress-state{text-align:left;max-width:none;margin-left:44px}}footer{color:var(--muted);opacity:.85;letter-spacing:.11em;margin-top:40px;font-size:9px;font-weight:700}footer span{margin:0 8px}[dir=rtl] .context-card code,[dir=rtl] .result-links code,[dir=rtl] .producer-option strong,[dir=rtl] .producer-option small,[dir=rtl] input[type=password]{direction:ltr;unicode-bidi:isolate}.decision-card{min-height:360px;padding:clamp(25px,3vw,40px)}.card-header{justify-content:space-between;align-items:center;gap:12px;margin-bottom:29px;display:flex}.card-kicker{color:var(--accent-strong);letter-spacing:.17em;font-size:10px;font-weight:900}.revision{color:var(--muted);letter-spacing:.08em;font-size:10px}.description{white-space:pre-line;color:var(--muted);margin-top:0;font-size:13px;line-height:1.65}.question-heading{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin-bottom:15px;display:flex}.question-heading h2,.decision-card>label{margin:0 0 10px;font-size:15px;font-weight:700;line-height:1.4;display:block}.phase-tag{color:var(--accent-strong);background:var(--accent-tint);letter-spacing:.07em;border-radius:5px;padding:6px 8px;font-size:9px;font-weight:900}input[type=text],input[type=password],input[type=number],select{border:1px solid var(--control-line);background:var(--surface-soft);width:100%;min-height:46px;color:var(--text);border-radius:8px;padding:10px 13px}textarea{resize:vertical;border:1px solid var(--control-line);background:var(--surface-soft);width:100%;min-height:120px;color:var(--text);font:inherit;border-radius:8px;padding:12px 13px;line-height:1.5}.language-switch{color:var(--muted);white-space:nowrap;align-items:center;gap:7px;font-size:11px;font-weight:700;display:flex}.language-switch select{width:auto;max-width:140px;min-height:32px;padding:5px 8px;font-size:11px}.question-details{border:1px solid var(--line);background:var(--surface-soft);border-radius:8px;margin-bottom:20px;padding:13px 15px;font-size:12px}.question-details summary{cursor:pointer;color:var(--accent-strong);font-weight:800}.question-details dl{grid-template-columns:minmax(90px,130px) minmax(0,1fr);gap:10px 14px;margin:14px 0 0;line-height:1.55;display:grid}.question-details dt{color:var(--text);font-weight:750}.question-details dd{color:var(--muted);margin:0}.question-help-link{margin:-12px 0 18px;font-size:12px;font-weight:700}.discovery-actions{flex-wrap:wrap;align-items:center;gap:8px 14px;margin:4px 0 16px;display:flex}.discovery-actions .field-help{margin:0}.secondary-button{border:1px solid var(--control-line);background:var(--surface-soft);color:var(--accent-strong);font:inherit;border-radius:8px;padding:9px 13px;font-size:12px;font-weight:750}.secondary-button:hover:not(:disabled),.secondary-button:focus-visible{border-color:var(--accent);background:var(--accent-tint)}.secondary-button:disabled{opacity:.55;cursor:not-allowed}.status-review-list{color:var(--muted);margin:6px 0 18px;padding-inline-start:20px;font-size:12px;line-height:1.7}.status-review-list strong{color:var(--text)}.producer-grid{margin-bottom:20px;padding:6px}.check-option.producer-option{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:16px;padding:14px 16px;display:grid}.producer-option>label{cursor:pointer;align-items:flex-start;gap:12px;min-width:0;display:flex}.producer-option>label>input{flex:0 0 17px;margin:3px 0 0}.producer-option>label>span{overflow-wrap:anywhere;gap:5px;min-width:0;display:grid}.producer-option small{color:var(--muted);font-size:10px;line-height:1.5}.producer-option a{font-size:11px;line-height:1.5}.producer-option>a{max-width:140px}.producer-links{gap:8px;max-width:140px;display:grid}.producer-manual-fields{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;display:grid}.producer-manual-fields>label,.project-manual-field{gap:8px;font-size:12px;font-weight:700;line-height:1.5;display:grid}.producer-manual-fields>label:last-child{grid-column:1/-1}.producer-add{margin-top:16px}.project-manual-field{margin-top:20px}input[type=checkbox]{accent-color:var(--accent);width:17px;height:17px}.field-help{color:var(--muted);margin:14px 0 24px;font-size:12px;line-height:1.6}.segmented{gap:9px;display:flex}.segmented button{border:1px solid var(--control-line);color:var(--text);background:var(--surface-soft);border-radius:8px;flex:1;padding:13px;font-weight:700}.segmented button.selected{border-color:var(--accent);background:var(--accent-tint);color:var(--accent-strong)}.check-grid{gap:10px;display:grid}.check-option{background:var(--surface-soft);border:1px solid var(--control-line);border-radius:7px;align-items:center;gap:10px;padding:10px 13px;font-size:12px;display:flex}.choice-list{gap:9px;display:grid}.choice-card{text-align:left;background:var(--surface-soft);width:100%;min-height:52px;color:var(--text);border:1px solid var(--control-line);border-radius:8px;justify-content:space-between;align-items:center;padding:13px 15px;font-size:13px;font-weight:650;display:flex}.choice-card:hover:not(:disabled){border-color:var(--accent);background:var(--accent-tint)}.github-link{background:var(--accent-tint);border:1px solid var(--accent);border-radius:8px;margin:0 0 12px;padding:14px;font-size:13px;font-weight:800;text-decoration:none;display:block}.github-link span{float:right}.plan-review{gap:24px;font-size:12px;line-height:1.65;display:grid}.plan-review>.description,.plan-review .field-help{margin:0}.plan-sections{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:16px;display:grid}.plan-decisions,.plan-inventory,.plan-warnings{background:var(--surface-soft);border:1px solid var(--line);border-radius:8px;min-width:0;padding:20px}.plan-decisions h3,.plan-warnings h3{margin:0 0 14px;font-size:13px;line-height:1.5}.plan-decisions p{margin:0 0 16px}.plan-decisions>:last-child{margin-bottom:0}.plan-decisions dl{gap:0;margin:0;display:grid}.plan-decisions dl>div{border-bottom:1px solid var(--line);grid-template-columns:minmax(130px,35%) minmax(0,1fr);gap:20px;padding:12px 0;display:grid}.plan-decisions dl>div:first-child{padding-top:0}.plan-decisions dl>div:last-child{border-bottom:0;padding-bottom:0}.plan-decisions dt{color:var(--muted)}.plan-decisions dd{overflow-wrap:anywhere;min-width:0;margin:0}.plan-decisions .field-help{margin-top:20px}.plan-decisions ul,.plan-inventory ul,.plan-warnings ul{overflow-wrap:anywhere;margin:0;padding-inline-start:20px;font-size:12px;line-height:1.7}.plan-decisions li+li,.plan-inventory li+li,.plan-warnings li+li{margin-top:6px}.plan-inventory summary{cursor:pointer;font-size:13px;font-weight:750}.plan-inventory summary span:last-child{float:right;color:var(--accent-strong);margin-inline-start:12px}.plan-inventory[open] summary{margin-bottom:16px}.plan-warnings{color:var(--warn);background:var(--warn-bg)}.plan-edit{border-top:1px solid var(--line);padding-top:24px}.plan-edit h3{margin:0 0 4px;font-size:14px}.plan-edit-actions{flex-wrap:wrap;gap:10px;margin-top:16px;display:flex}.button-row{flex-wrap:wrap;align-items:center;gap:12px;margin-top:24px;display:flex}.button-row>.primary{margin-left:auto}.plan-review>.button-row{border-top:1px solid var(--line);margin-top:0;padding-top:24px}.review-pass,.banner{white-space:pre-line;border-radius:8px;margin:0 0 20px;padding:14px 18px;font-size:12px;line-height:1.5}.review-pass{color:var(--accent-strong);background:var(--accent-tint);border:1px solid var(--accent)}.review-pass span{margin-inline-end:8px;font-weight:800}.banner{background:var(--surface-soft);border:1px solid var(--line)}.banner p{margin:5px 0 0}.banner.warning{color:var(--warn);background:var(--warn-bg);border-color:var(--warn)}.banner.error{color:var(--error);background:var(--error-bg);border-color:var(--error)}.banner.success{color:var(--accent-strong);background:var(--accent-tint);border-color:var(--accent)}.banner button{margin-top:12px}.cancel-link{color:var(--muted);background:0 0;border:0;margin-top:18px;padding:5px 0;font-size:12px;text-decoration:underline}.result-card,.waiting-card{max-width:750px;padding:36px}.result-icon{background:var(--accent-tint);width:43px;height:43px;color:var(--accent-strong);border-radius:50%;place-items:center;font-size:22px;display:grid}.result-card h2,.waiting-card h2{margin:18px 0 10px;font-size:21px}.result-card p,.waiting-card p{color:var(--muted);font-size:13px;line-height:1.6}.result-facts{border:1px solid var(--line);background:var(--surface-soft);border-radius:8px;margin:24px 0;padding:20px}.result-facts p{margin:8px 0}.result-facts strong{color:var(--text)}.result-effects{border:1px solid var(--line);background:var(--surface-soft);border-radius:8px;margin:20px 0;padding:14px 17px}.result-effects h3{color:var(--text);margin:0 0 10px;font-size:13px}.result-effects ul{margin:0;padding-left:20px}.result-effects li{overflow-wrap:anywhere;padding:3px 0;font-size:12px}.result-links{flex-wrap:wrap;align-items:center;gap:20px;margin:22px 0;font-size:12px;display:flex}.result-links code{background:var(--surface-soft);border-radius:5px;padding:8px}.spinner{border:3px solid var(--line);border-top-color:var(--accent);border-radius:50%;width:25px;height:25px;animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.result-facts h3{margin:0 0 16px;font-size:15px;line-height:1.5}.result-permissions{margin:20px 0 0;padding-inline-start:20px;font-size:13px;line-height:1.65}.result-permissions li+li{margin-top:16px}.result-permissions p{margin:6px 0 0}@media (width<=1100px){.workspace-grid{grid-template-columns:1fr}.context-column{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=780px){.shell{display:block}.sidebar{min-height:0;padding:16px 20px;position:static}.rail-caption,.sidebar-note{display:none}.steps{flex-wrap:wrap;gap:4px;margin-top:18px;display:flex}.steps:before{display:none}.steps li{flex:none;gap:6px;min-height:37px;padding:4px 7px;font-size:11px}.step-index{flex-basis:26px;width:26px;height:26px}.topbar{flex-wrap:wrap;height:auto;min-height:65px;padding:12px 20px}.content{padding:28px 20px}}@media (width<=540px){.context-column,.plan-sections{grid-template-columns:1fr}.workspace-grid:has(.plan-review) .context-column{grid-template-columns:1fr}.top-actions{flex-wrap:wrap;justify-content:space-between;gap:12px;width:100%;min-width:0}.decision-card{padding:22px}.breadcrumb{max-width:100%}h1{font-size:29px}.plan-decisions dl>div{grid-template-columns:1fr;gap:2px}.question-details dl{grid-template-columns:1fr;gap:3px}.question-details dd{margin-bottom:9px}.language-switch{margin-inline-start:auto}}@media (width<=640px){.check-option.producer-option{grid-template-columns:minmax(0,1fr);gap:12px}.producer-option>a,.producer-links{max-width:none;margin-inline-start:29px}.producer-manual-fields{grid-template-columns:minmax(0,1fr)}}.management-status{color:var(--accent-strong);font-weight:750}.management-actions{flex-wrap:wrap;gap:12px;margin-block:24px 32px;display:flex}.management-section{border-top:1px solid var(--line);padding-block:26px}.management-section h2{margin-top:0}.management-section summary{cursor:pointer;color:var(--accent-strong);font-weight:700}.management-settings{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;display:grid}.management-setting{border:1px solid var(--line);background:var(--surface-soft);border-radius:10px;justify-content:space-between;align-items:center;gap:16px;padding:18px;display:flex}.management-setting h3{margin:0 0 8px;font-size:14px}.management-setting p{color:var(--muted);overflow-wrap:anywhere;margin:0}.management-setting .button{flex-shrink:0}.management-values{gap:8px;display:grid}.management-values dt{overflow-wrap:anywhere;margin-top:12px;font-weight:650}.management-values dd{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--muted);margin:0;line-height:1.6}.management-workflow{padding-block:16px}:is(.workspace-grid:has(.management-settings),.workspace-grid:has(.management-status)){grid-template-columns:1fr}.workspace-grid:has(.management-status) .context-column{display:none}@media (width<=800px){.management-settings{grid-template-columns:1fr}}@media (width<=420px){.management-setting{flex-direction:column;align-items:stretch}.management-setting .button{align-self:flex-end}} diff --git a/build/web/assets/index-BSxurGMf.js b/build/web/assets/index-BSxurGMf.js deleted file mode 100644 index bf35c12de..000000000 --- a/build/web/assets/index-BSxurGMf.js +++ /dev/null @@ -1,3 +0,0 @@ -(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})(),typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);var e=!1;function t(){e=!0}t();var n={},r=Symbol(`uninitialized`),i=`http://www.w3.org/1999/xhtml`,a=Array.isArray,o=Array.prototype.indexOf,s=Array.prototype.includes,c=Array.from,l=Object.defineProperty,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyDescriptors,f=Object.prototype,p=Array.prototype,m=Object.getPrototypeOf,h=Object.isExtensible,g=()=>{};function _(e){return e()}function v(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function b(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}var x=1024,S=2048,C=4096,w=8192,ee=16384,te=32768,ne=1<<25,re=65536,ie=1<<19,ae=1<<20,oe=1<<25,se=1<<21,ce=1<<22,le=1<<23,ue=Symbol(`$state`),de=Symbol(`component`),fe=Symbol(`legacy props`),pe=Symbol(``),me=Symbol(`attributes`),he=Symbol(`class`),ge=Symbol(`style`),_e=Symbol(`text`),ve=Symbol(`form reset`),ye=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},be=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`);function xe(){console.warn(`https://svelte.dev/e/derived_inert`)}function Se(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function Ce(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function we(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var T=!1;function Te(e){T=e}var E;function Ee(e){if(e===null)throw Se(),n;return E=e}function De(){return Ee(ln(E))}function D(e){if(T){if(ln(E)!==null)throw Se(),n;E=e}}function Oe(e=1){if(T){for(var t=e,n=E;t--;)n=ln(n);E=n}}function ke(e=!0){for(var t=0,n=E;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else(r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=ln(n);e&&n.remove(),n=i}}function Ae(e){if(!e||e.nodeType!==8)throw Se(),n;return e.data}function je(e){return e===this.v}function Me(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function Ne(e){return!Me(e,this.v)}function Pe(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function Fe(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ie(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function Le(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Re(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function ze(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Be(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Ve(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function He(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Ue(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function We(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Ge(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var Ke=null;function qe(e){Ke=e}function O(t,n=!1,r){Ke={p:Ke,i:!1,c:null,e:null,s:t,x:null,r:B,l:e&&!n?{s:null,u:null,$:[]}:null}}function Je(e){var t=Ke,n=t.e;if(n!==null){t.e=null;for(var r of n)Sn(r)}return e!==void 0&&(t.x=e),t.i=!0,Ke=t.p,Ye(e)}function Ye(e={}){return l(e,de,{value:!0}),e}function Xe(){return!e||Ke!==null&&Ke.l===null}var Ze=[];function Qe(){var e=Ze;Ze=[],v(e)}function $e(e){if(Ze.length===0&&!Dt){var t=Ze;queueMicrotask(()=>{t===Ze&&Qe()})}Ze.push(e)}function et(){for(;Ze.length>0;)Qe()}var tt=~(S|C|x);function nt(e,t){e.f=e.f&tt|t}function rt(e){e.f&512||e.deps===null?nt(e,x):nt(e,C)}function it(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),nt(e,x)}function at(e){T&&cn(e)!==null&&un(e)}var ot=!1;function st(){ot||(ot=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[ve]?.()})},{capture:!0}))}function ct(e){var t=z,n=B;qn(null),Jn(null);try{return e()}finally{qn(t),Jn(n)}}function lt(e,t,n,r=n){e.addEventListener(t,()=>ct(n));let i=e[ve];e[ve]=i?()=>{i(),r(!0)}:()=>r(!0),st()}function ut(e,t,n,r){let i=Xe()?mt:k;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=B,c=dt(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){hn(e,s)}ft()}}var d=pt();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>gt(e))).then(u).catch(e=>hn(e,s)).finally(d)}l?l.then(()=>{c(),f(),ft()}):f()}function dt(){var e=B,t=z,n=Ke,r=A;return function(i=!0){Jn(e),qn(t),qe(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function ft(e=!0){Jn(null),qn(null),qe(null),e&&A?.deactivate()}function pt(){var e=B,t=e.b,n=A,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function mt(e){var t=2|S;return B!==null&&(B.f|=ie),{ctx:Ke,deps:null,effects:null,equals:je,f:t,fn:e,reactions:null,rv:0,v:r,wv:0,parent:B,ac:null}}var ht=Symbol(`obsolete`);function gt(e,t,n){let i=B;i===null&&Fe();var a=void 0,o=Wt(r),s=!z,c=new Set;return Dn(()=>{var t=B,n=y();a=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==ye&&n.reject(e)}).finally(ft)}catch(e){n.reject(e),ft()}var r=A;if(s){if(t.f&32768)var l=pt();if(i.b?.is_rendered())r.async_deriveds.get(t)?.reject(ht);else for(let e of c.values())e.reject(ht);c.add(n),r.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),c.delete(n),t!==ht&&(r.activate(),t?(o.f|=le,Jt(o,t)):(o.f&8388608&&(o.f^=le),Jt(o,e)),r.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),bn(()=>{for(let e of c)e.reject(ht)}),new Promise(e=>{function t(n){function r(){n===a?e(o):t(a)}n.then(r,r)}t(a)})}function _t(e){let t=mt(e);return Xn(t),t}function k(e){let t=mt(e);return t.equals=Ne,t}function vt(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n{t.ac.abort(ye),t.ac=null}),t.fn!==null&&(t.teardown=g),dr(t,0),Mn(t))}function St(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&t.fn!==null&&fr(t)}var Ct=null,A=null,wt=null,Tt=null,Et=null,Dt=!1,Ot=!1,kt=null,At=null,jt=0,Mt=1,Nt=class e{id=Mt++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;#r=new Set;#i=new Set;#a=0;#o=new Map;#s=null;#c=[];#l=[];#u=new Set;#d=new Set;#f=new Map;#p=new Set;is_fork=!1;#m=!1;constructor(){Ct===null?Ct=this:(Ct.#n=this,this.#t=Ct),Ct=this}#h(){if(this.is_fork)return!0;for(let n of this.#o.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#f.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#f.has(e)||this.#f.set(e,{d:[],m:[]}),this.#p.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)nt(r,S),t(r);for(r of n.m)nt(r,C),t(r)}this.#p.add(e)}#g(){var e=[];for(let i of this.#c)if(!(i.f&16384||!(i.f&6144))){for(var t=i,n=!1;t.parent!==null;){t=t.parent;var r=t.f;if(r&96){if(!(r&1024)){n=!0;break}t.f^=x}}n||e.push(t)}return this.#c=[],e}#_(){this.#e=!0;for(let e of this.#u)this.#d.delete(e),nt(e,S),this.schedule(e);for(let e of this.#d)nt(e,C),this.schedule(e);this.apply();for(var t=kt=[],n=[],r=At=[];this.#c.length>0;){jt++>1e3&&(this.#S(),Ft());for(let e of this.#g())try{this.#v(e,t,n)}catch(t){throw Bt(e),this.#h()||this.discard(),t}}if(A=null,r.length>0){var i=e.ensure();for(let e of r)i.schedule(e)}if(kt=null,At=null,this.#h()){this.#x(n),this.#x(t);for(let[e,t]of this.#f)zt(e,t);r.length>0&&A.#_();return}let a=this.#y();if(a){this.#x(n),this.#x(t),a.#b(this);return}this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),wt=this,Lt(n),Lt(t),wt=null,this.#s?.resolve();var o=A;if(this.#a===0&&(this.#c.length===0||o!==null)&&this.#S(),this.#c.length>0){if(o!==null){for(let e of this.#c)o.#c.push(e);this.#c=[]}else o=this}o!==null&&(Ht.clear(),o.#_())}#v(e,t,n){e.f^=x;for(var r=e.first;r!==null;){var i=r.f,a=!!(i&96);if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=x:i&4?t.push(r):or(r)&&(i&16&&this.#d.add(r),fr(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#y(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#b(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null&&!(e.f&2&&!(e.f&6144)))for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),nt(i,S),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#S(),A=this,this.#_()}#x(e){for(var t=0;t{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=y()).promise}static ensure(){if(A===null){let t=A=new e;!Ot&&!Dt&&$e(()=>{t.#e||t.flush()})}return A}apply(){Tt=null}schedule(e){if(Et=e,e.b?.is_pending&&e.f&16777228&&!(e.f&32768)){e.b.defer_effect(e);return}this.#c.push(e)}#S(){if(this.linked){var e=this.#t,t=this.#n;e===null||(e.#n=t),t===null?Ct=e:t.#t=e,this.linked=!1}}};function Pt(e){var t=Dt;Dt=!0;try{var n;for(e&&(A!==null&&!A.is_fork&&A.flush(),n=e());;){if(et(),A===null)return n;A.flush()}}finally{Dt=t}}function Ft(){try{Be()}catch(e){hn(e,Et)}}var It=null;function Lt(e){var t=e.length;if(t!==0){for(var n=0;n0)){Ht.clear();for(let e of It){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)It.has(n)&&(It.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||fr(n)}}It.clear()}}It=null}}function Rt(e){A.schedule(e)}function zt(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),nt(e,x);for(var n=e.first;n!==null;)zt(n,t),n=n.next}}function Bt(e){nt(e,x);for(var t=e.first;t!==null;)Bt(t),t=t.next}var Vt=new Set,Ht=new Map,Ut=!1;function Wt(e,t){return{f:0,v:e,reactions:null,equals:je,rv:0,wv:0}}function Gt(e,t){let n=Wt(e,t);return Xn(n),n}function j(t,n=!1,r=!0){let i=Wt(t);return n||(i.equals=Ne),e&&r&&Ke!==null&&Ke.l!==null&&(Ke.l.s??=[]).push(i),i}function M(e,t,n=!1){return z!==null&&(!Kn||z.f&131072)&&Xe()&&z.f&4325394&&(Yn===null||!Yn.has(e))&&We(),Jt(e,n?Qt(t):t,At)}var Kt=null,qt=0;function Jt(e,t,n=null){if(!e.equals(t)){Wn?Ht.set(e,t):Ht.has(e)||Ht.set(e,e.v);var r=Nt.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&yt(t),Tt===null&&rt(t)}e.wv=ar(),Kt=null,qt=0,Zt(e,S,n),Kt=null,Xe()&&B!==null&&B.f&1024&&!(B.f&96)&&($n===null?er([e]):$n.push(e)),!r.is_fork&&Vt.size>0&&!Ut&&Yt()}return t}function Yt(){Ut=!1;for(let e of Vt){e.f&1024&&nt(e,C);let t;try{t=or(e)}catch{t=!0}t&&fr(e)}Vt.clear()}function Xt(e){M(e,e.v+1)}function Zt(e,t,n){var r=e.reactions;if(r!==null){var i=Xe(),a=r.length;if(qt+=a,qt>1e5&&Kt===null&&(Kt=new Set),Kt!==null){if(Kt.has(e))return;Kt.add(e)}for(var o=0;o{if(rr===c)return e();var t=z,n=rr;qn(null),ir(c);var r=e();return qn(t),ir(n),r};return i&&n.set(`length`,Gt(e.length,s)),new Proxy(e,{defineProperty(e,t,r){(!(`value`in r)||r.configurable===!1||r.enumerable===!1||r.writable===!1)&&He();var i=n.get(t);return i===void 0?l(()=>{var e=Gt(r.value,s);return n.set(t,e),e}):M(i,r.value,!0),!0},deleteProperty(e,t){var i=n.get(t);if(i===void 0){if(t in e){let e=l(()=>Gt(r,s));n.set(t,e),Xt(o)}}else M(i,r),Xt(o);return!0},get(t,i,a){if(i===ue)return e;var o=n.get(i),c=i in t;if(o===void 0&&(!c||u(t,i)?.writable)&&(o=l(()=>Gt(Qt(c?t[i]:r),s)),n.set(i,o)),o!==void 0){var d=V(o);return d===r?void 0:d}return Reflect.get(t,i,a)},getOwnPropertyDescriptor(e,t){this.has?.(e,t);var i=Reflect.getOwnPropertyDescriptor(e,t),a=n.get(t);if(a!==void 0){var o=V(a);if(o===r)return;if(i&&`value`in i)i.value=o;else return{enumerable:!0,configurable:!0,value:o,writable:!0}}return i},has(e,t){if(t===ue)return!0;var i=n.get(t),a=i!==void 0&&i.v!==r||Reflect.has(e,t);return(i!==void 0||B!==null&&(!a||u(e,t)?.writable))&&(i===void 0&&(i=l(()=>Gt(a?Qt(e[t]):r,s)),n.set(t,i)),V(i)===r)?!1:a},set(e,t,a,c){var d=n.get(t),f=t in e;if(i&&t===`length`)for(var p=a;pGt(r,s)),n.set(p+``,m)):M(m,r)}if(d===void 0)(!f||u(e,t)?.writable)&&(d=l(()=>Gt(void 0,s)),M(d,Qt(a)),n.set(t,d));else{f=d.v!==r;var h=l(()=>Qt(a));M(d,h)}var g=Reflect.getOwnPropertyDescriptor(e,t);if(g?.set&&g.set.call(c,a),!f){if(i&&typeof t==`string`){var _=n.get(`length`),v=Number(t);Number.isInteger(v)&&v>=_.v&&M(_,v+1)}Xt(o)}return!0},ownKeys(e){V(o);var t=Reflect.ownKeys(e).filter(e=>{var t=n.get(e);return t===void 0||t.v!==r});for(var[i,a]of n)a.v!==r&&!(i in e)&&t.push(i);return t},setPrototypeOf(){Ue()}})}function $t(e){try{if(typeof e==`object`&&e&&ue in e)return e[ue]}catch{}return e}function en(e,t){return Object.is($t(e),$t(t))}var tn,nn,rn,an;function on(){if(tn===void 0){tn=window,nn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;rn=u(t,`firstChild`).get,an=u(t,`nextSibling`).get,h(e)&&(e[he]=void 0,e[me]=null,e[ge]=void 0,e.__e=void 0),h(n)&&(n[_e]=void 0)}}function sn(e=``){return document.createTextNode(e)}function cn(e){return rn.call(e)}function ln(e){return an.call(e)}function N(e,t){if(!T)return cn(e);var n=cn(E);if(n===null)n=E.appendChild(sn());else if(t&&n.nodeType!==3){var r=sn();return n?.before(r),Ee(r),r}return t&&pn(n),Ee(n),n}function P(e,t=!1){if(!T){var n=cn(e);return n instanceof Comment&&n.data===``?ln(n):n}if(t){if(E?.nodeType!==3){var r=sn();return E?.before(r),Ee(r),r}pn(E)}return E}function F(e,t=!1){if(!T)return cn(e);var n=N(e,t);return D(e),n}function I(e,t=1,n=!1){let r=T?E:e;for(var i;t--;)i=r,r=ln(r);if(!T)return r;if(n){if(r?.nodeType!==3){var a=sn();return r===null?i?.after(a):r.before(a),Ee(a),a}pn(r)}return Ee(r),r}function un(e){e.textContent=``}function dn(){return!1}function fn(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function pn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function mn(e){var t=B;if(t===null)return z.f|=le,e;if(!(t.f&32768)&&!(t.f&4))throw e;hn(e,t)}function hn(e,t){if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128&&!(t.f&33570816)){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}function gn(e){B===null&&(z===null&&ze(e),Re()),Wn&&Le(e)}function _n(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function vn(e,t){var n=B;n!==null&&n.f&8192&&(e|=w);var r={ctx:Ke,deps:null,nodes:null,f:e|S|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};A?.register_created_effect(r);var i=r;if(e&4)kt===null?Nt.ensure().schedule(r):kt.push(r);else if(t!==null){try{fr(r)}catch(e){throw Pn(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=re))}if(i!==null&&(i.parent=n,n!==null&&_n(i,n),z!==null&&z.f&2&&!(e&64))){var a=z;(a.effects??=[]).push(i)}return r}function yn(){return z!==null&&!Kn}function bn(e){let t=vn(8,null);return nt(t,x),t.teardown=e,t}function xn(e){gn(`$effect`);var t=B.f;if(!z&&t&32&&Ke!==null&&!Ke.i){var n=Ke;(n.e??=[]).push(e)}else return Sn(e)}function Sn(e){return vn(4|ae,e)}function Cn(e){return gn(`$effect.pre`),vn(8|ae,e)}function wn(e){Nt.ensure();let t=vn(64|ie,e);return(e={})=>new Promise(n=>{e.outro?Ln(t,()=>{Pn(t),n(void 0)}):(Pn(t),n(void 0))})}function Tn(e){return vn(4,e)}function L(e,t){var n=Ke,r={effect:null,ran:!1,deps:e};n.l.$.push(r),r.effect=On(()=>{if(e(),!r.ran){r.ran=!0;var n=B;try{Jn(n.parent),H(t)}finally{Jn(n)}}})}function En(){var e=Ke;On(()=>{for(var t of e.l.$){t.deps();var n=t.effect;n.f&1024&&n.deps!==null&&nt(n,C),or(n)&&fr(n),t.ran=!1}})}function Dn(e){return vn(ce|ie,e)}function On(e,t=0){return vn(8|t,e)}function R(e,t=[],n=[],r=[]){ut(r,t,n,t=>{vn(8,()=>{e(...t.map(V))})})}function kn(e,t=0){return vn(16|t,e)}function An(e){return vn(32|ie,e)}function jn(e){var t=e.teardown;if(t!==null){let n=Wn,r=z;Gn(!0),qn(null);try{t.call(null)}catch(t){hn(t,e.parent)}finally{Gn(n),qn(r)}}}function Mn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&ct(()=>{e.abort(ye)});var r=n.next;n.f&64?n.parent=null:Pn(n,t),n=r}}function Nn(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||Pn(t),t=n}}function Pn(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(Fn(e.nodes.start,e.nodes.end),n=!0),e.f|=ne,Mn(e,t&&!n),dr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();jn(e),e.f^=ne,e.f|=ee;var i=e.parent;i!==null&&i.first!==null&&In(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Fn(e,t){for(;e!==null;){var n=e===t?null:ln(e);e.remove(),e=n}}function In(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Ln(e,t,n=!0){var r=[];e.f|=256,Rn(e,r,!0);var i=()=>{n&&Pn(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Rn(e,t,n){if(!(e.f&8192)){e.f^=w;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=!!(i.f&65536)||!!(i.f&32)&&!!(e.f&16);Rn(i,t,o?n:!1)}i=a}}}function zn(e){e.f&=-257,Bn(e,!0)}function Bn(e,t){if(!(e.f&256)&&e.f&8192){e.f^=w,e.f&1024||(nt(e,S),Nt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=!!(n.f&65536)||!!(n.f&32);Bn(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Vn(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:ln(n);t.append(n),n=i}}var Hn=null,Un=!1,Wn=!1;function Gn(e){Wn=e}var z=null,Kn=!1;function qn(e){z=e}var B=null;function Jn(e){B=e}var Yn=null;function Xn(e){z!==null&&(z.f&2097152||z.f&2)&&(Yn??=new Set).add(e)}var Zn=null,Qn=0,$n=null;function er(e){$n=e}var tr=1,nr=0,rr=nr;function ir(e){rr=e}function ar(){return++tr}function or(e){var t=e.f;if(t&2048)return!0;if(t&4096){for(var n=e.deps,r=n.length,i=0;ie.wv)return!0}t&512&&Tt===null&&nt(e,x)}return!1}function sr(e,t,n=!0){var r=e.reactions;if(r!==null&&!(Yn!==null&&Yn.has(e)))for(var i=0;i{e.ac.abort(ye)}),e.ac=null);try{e.f|=se;var u=e.fn,d=u();e.f|=te;var f=lr(e);if(Xe()&&$n!==null&&!Kn&&f!==null&&!(e.f&6146))for(var p=0;p<$n.length;p++)sr($n[p],e);if(i!==null&&i!==e){if(nr++,i.deps!==null)for(let e=0;e0)for(t.length=Qn+Zn.length,r=0;r{c.ac.abort(ye),c.ac=null,nt(c,S)}),xt(c),dr(c,0)}}function dr(e,t){var n=e.deps;if(n!==null)for(var r=t;rn?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?(i.__removed=!1,$e(()=>{i.__removed||t.addEventListener(e,i,r)})):t.addEventListener(e,i,r),i}function xr(e,t,n,r,i){var a={capture:r,passive:i},o=br(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&bn(()=>{o.__removed=!0,t.removeEventListener(e,o,a)})}function W(e,t,n){(t[_r]??={})[e]=n}function Sr(e){for(var t=0;t{wr=!1,Cr=null}));var o=0,s=Cr===e&&e[_r];if(s){var c=i.indexOf(s);if(c!==-1&&(t===document||t===window)){e[_r]=t;return}var u=i.indexOf(t);if(u===-1)return;c<=u&&(o=c)}if(a=i[o]||e.target,a!==t){l(e,`currentTarget`,{configurable:!0,get(){return a||n}});var d=z,f=B;qn(null),Jn(null);try{for(var p,m=[];a!==null&&a!==t;){try{var h=a[_r]?.[r];h!=null&&(!a.disabled||e.target===a)&&h.call(a,e)}catch(e){p?m.push(e):p=e}if(e.cancelBubble)break;o++,a=o{throw e});throw p}}finally{e[_r]=t,delete e.currentTarget,qn(d),Jn(f)}}}var Er=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function Dr(e){return Er?.createHTML(e)??e}function Or(e){var t=fn(`template`);return t.innerHTML=Dr(e.replaceAll(``,``)),t.content}function kr(e,t){var n=B;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function G(e,t){var n=!!(t&1),r=!!(t&2),i,a=!e.startsWith(``);return()=>{if(T)return kr(E,null),E;i===void 0&&(i=Or(a?e:``+e),n||(i=cn(i)));var t=r||nn?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=cn(t),s=t.lastChild;kr(o,s)}else kr(t,t);return t}}function Ar(e=``){if(!T){var t=sn(e+``);return kr(t,t),t}var n=E;return n.nodeType===3?pn(n):(n.before(n=sn()),Ee(n)),kr(n,n),n}function jr(){if(T)return kr(E,null),E;var e=document.createDocumentFragment(),t=document.createComment(``),n=sn();return e.append(t,n),kr(t,n),e}function K(e,t){if(T){var n=B;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=E),De();return}e!==null&&e.before(t)}[...`allowfullscreen.async.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.webkitdirectory.defer.disablepictureinpicture.disableremoteplayback`.split(`.`)];var Mr=[`touchstart`,`touchmove`];function Nr(e){return Mr.includes(e)}function Pr(e){let t=0,n=Wt(0),r;return()=>{yn()&&(V(n),On(()=>(t===0&&(r=H(()=>e(()=>Xt(n)))),t+=1,()=>{$e(()=>{--t,t===0&&(r?.(),r=void 0,Xt(n))})})))}}var Fr=re|ie;function Ir(e,t,n,r){new Lr(e,t,n,r)}var Lr=class{parent;is_pending=!1;transform_error;#e;#t=T?E:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=Pr(()=>(this.#m=Wt(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=B;t.b=this,t.f|=128,n(e)},this.parent=B.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=kn(()=>{if(T){let e=this.#t;De();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#y():this.#g()}else this.#b()},Fr),T&&(this.#e=E)}#g(){try{this.#a=An(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed,{reset:n,invoke_onerror:r}=this.#v(e);$e(r),t&&(this.#s=An(()=>{t(this.#e,()=>e,()=>n)}))}#v(e){var t=!1,n=!1;let r=()=>{if(t){we();return}t=!0,n&&Ge(),this.#s!==null&&Ln(this.#s,()=>{this.#s=null}),this.#S(()=>{this.#b()})};return{reset:r,invoke_onerror:()=>{try{n=!0,this.#n.onerror?.(e,r),n=!1}catch(e){hn(e,this.#i&&this.#i.parent)}}}}#y(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=An(()=>e(this.#e)),$e(()=>{var e=this.#c=document.createDocumentFragment(),t=sn(),n=!1;if(e.append(t),this.#a=this.#S(()=>{try{return An(()=>this.#r(t))}catch(e){try{this.error(e),n=!0}catch(e){hn(e,this.#i.parent)}return null}}),this.#a===null){this.#c=null,n&&this.#x(A);return}this.#u===0&&(this.#e.before(e),this.#c=null,Ln(this.#o,()=>{this.#o=null}),this.#x(A))}))}#b(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=An(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Vn(this.#a,e);let t=this.#n.pending;this.#o=An(()=>t(this.#e))}else this.#x(A)}catch(e){this.error(e)}}#x(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){it(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#S(e){var t=B,n=z,r=Ke;Jn(this.#i),qn(this.#i),qe(this.#i.ctx);try{return Nt.ensure(),e()}finally{Jn(t),qn(n),qe(r)}}#C(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#C(e,t);return}this.#u+=e,this.#u===0&&(this.#x(t),this.#o&&Ln(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#C(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,$e(()=>{this.#d=!1,this.#m&&Jt(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),V(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;A?.is_fork?(this.#a&&A.skip_effect(this.#a),this.#o&&A.skip_effect(this.#o),this.#s&&A.skip_effect(this.#s),A.oncommit(()=>{this.#w(e)})):this.#w(e)}#w(e){this.#a&&=(Pn(this.#a),null),this.#o&&=(Pn(this.#o),null),this.#s&&=(Pn(this.#s),null),T&&(Ee(this.#t),Oe(),Ee(ke()));let t=this.#n.failed,n=e=>{let{reset:n,invoke_onerror:r}=this.#v(e);r(),t&&(this.#s=this.#S(()=>{try{return An(()=>{var r=B;r.b=this,r.f|=128,t(this.#e,()=>e,()=>n)})}catch(e){return hn(e,this.#i.parent),null}}))};$e(()=>{var t;try{t=this.transform_error(e)}catch(e){hn(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(n,e=>hn(e,this.#i&&this.#i.parent)):n(t)})}};function q(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[_e]??=e.nodeValue)&&(e[_e]=n,e.nodeValue=`${n}`)}function Rr(e,t){return Br(e,t)}var zr=new Map;function Br(e,{target:t,anchor:r,props:i={},events:a,context:o,intro:s=!0,transformError:l}){on();var u=void 0,d=wn(()=>{var s=r??t.appendChild(sn());Ir(s,{pending:()=>{}},t=>{O({});var r=Ke;if(o&&(r.c=o),a&&(i.$$events=a),T&&kr(t,null),u=e(t,i)||Ye(),T&&(B.nodes.end=E,E===null||E.nodeType!==8||E.data!==`]`))throw Se(),n;Je()},l);var d=new Set,f=e=>{for(var n=0;n{for(var e of d)for(let r of[t,document]){var n=zr.get(r),i=n.get(e);--i==0?(r.removeEventListener(e,Tr),n.delete(e),n.size===0&&zr.delete(r)):n.set(e,i)}yr.delete(f),s!==r&&s.parentNode?.removeChild(s)}});return Vr.set(u,d),u}var Vr=new WeakMap,Hr=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)zn(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(zn(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(Pn(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Vn(r,t),t.append(sn()),this.#n.set(e,{effect:r,fragment:t})}else Pn(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),Ln(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(Pn(n.effect),this.#n.delete(e))};ensure(e,t){var n=A,r=dn();if(t&&!this.#t.has(e)&&!this.#n.has(e)){if(r){var i=document.createDocumentFragment(),a=sn();i.append(a),this.#n.set(e,{effect:An(()=>t(a)),fragment:i})}else this.#t.set(e,An(()=>t(this.anchor)))}if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else T&&(this.anchor=E),this.#a(n)}};function Ur(t){Ke===null&&Pe(`onMount`),e&&Ke.l!==null?Wr(Ke).m.push(t):xn(()=>{let e=H(t);if(typeof e==`function`)return e})}function Wr(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}function J(e,t,n=!1){var r;T&&(r=E,De());var i=new Hr(e),a=n?re:0;function o(e,t){if(T){var n=Ae(r);if(e!==parseInt(n.substring(1))){var a=ke();Ee(a),i.anchor=a,Te(!1),i.ensure(e,t),Te(!0);return}}i.ensure(e,t)}kn(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}var Gr=Symbol(`NaN`);function Kr(e,t,n){T&&De();var r=new Hr(e),i=!Xe();kn(()=>{var e=t();e!==e&&(e=Gr),i&&typeof e==`object`&&e&&(e={}),r.ensure(e,n)})}function qr(e,t){return t}function Jr(e,t,n){for(var r=[],i=t.length,a,o=t.length,s=0;s{if(a){if(a.pending.delete(n),a.done.add(n),a.pending.size===0){var t=e.outrogroups;Yr(e,c(a.done)),t.delete(a),t.size===0&&(e.outrogroups=null)}}else--o},!1)}if(o===0){var l=r.length===0&&n!==null&&e.pending.size===0;if(l){var u=n,d=u.parentNode;un(d),d.append(u),e.items.clear()}Yr(e,t,!l)}else a={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(a)}function Yr(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i{var e=n();return a(e)?e:e==null?[]:c(e)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,Qr(v,p,s,t,r),d!==null&&(p.length===0?d.f&33554432?(d.f^=oe,ei(d,null,s)):zn(d):Ln(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:kn(()=>{p=V(f);var e=p.length;let a=!1;T&&Ae(s)===`[!`!=(e===0)&&(s=ke(),Ee(s),Te(!1),a=!0);for(var c=new Set,u=A,v=dn(),y=0;yo(s)):(d=An(()=>o(Xr??=sn())),d.f|=oe)),e>c.size&&Ie(``,``,``),T&&e>0&&Ee(ke()),!h){if(m.set(u,c),v){for(let[e,t]of l)c.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u)}a&&Te(!0),V(f)}),flags:t,items:l,pending:m,outrogroups:null,fallback:d};h=!1,T&&(s=E)}function Zr(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function Qr(e,t,n,r,i){var a=!!(r&8),o=t.length,s=e.items,l=Zr(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(a)for(v=0;v0){var te=r&4&&o===0?n:null;if(a){for(v=0;v{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function $r(e,t,n,r,i,a,o,s){var c=o&1?o&16?Wt(n):j(n,!1,!1):null,l=o&2?Wt(i):null;return{v:c,i:l,e:An(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function ei(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=ln(r);if(a.before(r),r===i)return;r=o}}function ti(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function ni(e,t,n){Tn(()=>{var r=H(()=>t(e,n?.())||{});if(n&&r?.update){var i=!1,a={};On(()=>{var e=n();U(e),i&&Me(a,e)&&(a=e,r.update(e))}),i=!0}if(r?.destroy)return()=>r.destroy()})}function ri(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`){if(Array.isArray(e)){var i=e.length;for(t=0;t=0;){var s=o+a;(o===0||oi.includes(r[o-1]))&&(s===r.length||oi.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function ci(e,t,n,r,i,a){var o=e[he];if(T||o!==n||o===void 0){var s=si(n,r,a);(!T||s!==e.getAttribute(`class`))&&(s==null?e.removeAttribute(`class`):t?e.className=s:e.setAttribute(`class`,s)),e[he]=n}else if(a&&i!==a)for(var c in a){var l=!!a[c];(i==null||l!==!!i[c])&&e.classList.toggle(c,l)}return a}function li(e,t){t?e.hasAttribute(`selected`)||e.setAttribute(`selected`,``):e.removeAttribute(`selected`)}function ui(e,t){var n=e.__defaultValue,r=e.multiple,i=r?n??[]:null;if(!r||a(i)){var o=e.selectedIndex,s=t&&r?new Set(e.selectedOptions):null;for(var c of e.options){var l=mi(c);li(c,r?i.includes(l):en(l,n))}if(t){if(s!==null)for(c of e.options){var u=s.has(c);c.selected!==u&&(c.selected=u)}else e.selectedIndex!==o&&(e.selectedIndex=o)}}}function di(e,t,n=!1){if(e.multiple){if(t==null)return;if(!a(t))return Ce();for(var r of e.options)r.selected=t.includes(mi(r));return}for(r of e.options)if(en(mi(r),t)){r.selected=!0;return}(!n||t!==void 0)&&(e.selectedIndex=-1)}function fi(e){var t=new MutationObserver(t=>{t.every(hi)||(`__defaultValue`in e&&ui(e,!1),`__value`in e&&di(e,e.__value))});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),bn(()=>{t.disconnect()})}function pi(e,t,n=t){var r=new WeakSet,i=!0;lt(e,`change`,t=>{var i=t?`[selected]`:`:checked`,a;if(e.multiple)a=[].map.call(e.querySelectorAll(i),mi);else{var o=e.querySelector(i)??e.querySelector(`option:not([disabled])`);a=o&&mi(o)}n(a),e.__value=a,A!==null&&r.add(A)}),Tn(()=>{var a=t();if(e===document.activeElement){var o=A;if(r.has(o))return}if(di(e,a,i),i&&a===void 0){var s=e.querySelector(`:checked`);s!==null&&(a=mi(s),n(a))}e.__value=a,i=!1})}function mi(e){return`__value`in e?e.__value:e.value}function hi(e){if(e.target.closest(`selectedcontent`)!==null)return!0;if(e.type===`childList`){var t=[...e.addedNodes,...e.removedNodes];return t.length>0&&t.every(e=>e.nodeName===`SELECTEDCONTENT`)}return!1}var gi=Symbol(`is custom element`),_i=Symbol(`is html`),vi=be?`link`:`LINK`;function yi(e){if(T){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;X(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;X(e,`checked`,null),e.checked=r}}};e[ve]=n,$e(n),st()}}function bi(e,t){var n=xi(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function X(e,t,n,r){var i=xi(e);T&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===vi)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[pe]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&Ci(e).has(t)?e[t]=n:e.setAttribute(t,n))}function xi(e){return e[me]??={[gi]:e.nodeName.includes(`-`),[_i]:e.namespaceURI===i}}var Si=new Map;function Ci(e){var t=e.getAttribute(`is`)||e.nodeName,n=Si.get(t);if(n)return n;Si.set(t,n=new Set);for(var r,i=e,a=Element.prototype;a!==i;){for(var o in r=d(i),r)r[o].set&&o!==`innerHTML`&&o!==`textContent`&&o!==`innerText`&&n.add(o);i=m(i)}return n}function wi(e,t,n=t){var r=new WeakSet;lt(e,`input`,async i=>{var a=i?e.defaultValue:e.value;if(a=Ti(e)?Ei(a):a,n(a),A!==null&&r.add(A),await pr(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(T&&e.defaultValue!==e.value||H(t)==null&&e.value)&&(n(Ti(e)?Ei(e.value):e.value),A!==null&&r.add(A)),On(()=>{var n=t();if(e===document.activeElement){var i=A;if(r.has(i))return}Ti(e)&&n===Ei(e.value)||(e.type!==`date`||n||e.value)&&n!==e.value&&(e.value=n??``)})}function Ti(e){var t=e.type;return t===`number`||t===`range`}function Ei(e){return e===``?null:+e}function Di(e,t){return e===t||e?.[ue]===t}function Oi(e=Ye(),t,n,r){var i=Ke.r,a=B;return Tn(()=>{var o,s;return On(()=>{o=s,s=r?.()||[],H(()=>{Di(n(...s),e)||(t(e,...s),o&&Di(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&Di(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function ki(e=!1){let t=Ke,n=t.l.u;if(!n)return;let r=()=>U(t.s);if(e){let e=0,n={},i=mt(()=>{let r=!1,i=t.s;for(let e in i)i[e]!==n[e]&&(n[e]=i[e],r=!0);return r&&e++,e});r=()=>V(i)}n.b.length&&Cn(()=>{Ai(t,r),v(n.b)}),xn(()=>{let e=H(()=>n.m.map(_));return()=>{for(let t of e)typeof t==`function`&&t()}}),n.a.length&&xn(()=>{Ai(t,r),v(n.a)})}function Ai(e,t){if(e.l.s)for(let t of e.l.s)V(t);t()}function ji(e,t,n){if(e==null)return t(void 0),n&&n(void 0),g;let r=H(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}var Mi=[];function Ni(e,t=g){let n=null,r=new Set;function i(t){if(Me(e,t)&&(e=t,n)){let t=!Mi.length;for(let t of r)t[1](),Mi.push(t,e);if(t){for(let e=0;e{r.delete(c),r.size===0&&n&&(n(),n=null)}}return{set:i,update:a,subscribe:o}}function Pi(e){let t;return ji(e,e=>t=e)(),t}var Fi=!1,Ii=Symbol(`unmounted`);function Li(e,t,n){let r=n[t]??={store:null,source:j(void 0),unsubscribe:g};if(r.store!==e&&!(Ii in n)){if(r.unsubscribe(),r.store=e??null,e==null)r.source.v=void 0,r.unsubscribe=g;else{var i=!0;r.unsubscribe=ji(e,e=>{i?r.source.v=e:M(r.source,e)}),i=!1}}return e&&Ii in n?Pi(e):V(r.source)}function Ri(){let e={};function t(){bn(()=>{for(var t in e)e[t].unsubscribe();l(e,Ii,{enumerable:!1,value:!0})})}return[e,t]}function zi(e){var t=Fi;try{return Fi=!1,[e(),Fi]}finally{Fi=t}}function Z(t,n,r,i){var a=!e||!!(r&2),o=!!(r&8),s=!!(r&16),c=i,l=!0,d=void 0,f=()=>s&&a?(d??=mt(i),V(d)):(l&&(l=!1,c=s?H(i):i),c);let p;if(o){var m=ue in t||fe in t;p=u(t,n)?.set??(m&&n in t?e=>t[n]=e:void 0)}var h,g=!1;o?[h,g]=zi(()=>t[n]):h=t[n],h===void 0&&i!==void 0&&(h=f(),p&&(a&&Ve(n),p(h)));var _=a?()=>{var e=t[n];return e===void 0?f():(l=!0,e)}:()=>{var e=t[n];return e!==void 0&&(c=void 0),e===void 0?c:e};if(a&&!(r&4))return _;if(p){var v=t.$$legacy;return(function(e,t){return arguments.length>0?((!a||!t||v||g)&&p(t?_():e),e):_()})}var y=!1,b=(r&1?mt:k)(()=>(y=!1,_()));o&&V(b);var x=B;return(function(e,t){if(arguments.length>0){let n=t?V(b):a&&o?Qt(e):e;return M(b,n),y=!0,c!==void 0&&(c=n),e}return Wn&&y||x.f&16384?b.v:V(b)})}async function Bi(e,t,n){let r=await fetch(e,{method:`POST`,cache:`no-store`,headers:{"Content-Type":`application/json`,"X-Setup-Session-Key":n.sessionKey,...n.capability?{"X-Setup-Capability":n.capability}:{}},body:JSON.stringify(t)}),i=await r.json();if(!r.ok)throw Error(String(i.error??`The request was rejected.`));return i}function Vi(e){let t=Ni({paired:!!e,controller:!1,busy:!1,error:``}),n=e,r,i={paired:!!e,controller:!1,busy:!1,error:``},a=!1;function o(e){i={...i,...e},t.set(i)}async function s(e=!1){if(!(a||!n||i.closed)){a=!0;try{let t=await fetch(`/api/state`,{cache:`no-store`,headers:{"X-Setup-Session-Key":n}});if(!t.ok)throw Error(`The local setup session is unavailable.`);let r=await t.json();i.closed||o({view:r,...e?{}:{error:``}})}catch{i.closed||o({view:void 0,error:`Connection lost. The CLI may have stopped. Check the terminal before trying again.`})}finally{a=!1}}}let c=()=>s(!0);async function l(){if(n&&!i.closed)try{let e=await fetch(`/api/bootstrap`,{cache:`no-store`,headers:{"X-Setup-Session-Key":n}});if(!e.ok)throw Error(`Could not join this local session.`);let t=await e.json();r=t.capability,o({controller:t.controller,error:``}),await s()}catch{n=void 0,r=void 0,o({view:void 0,paired:!1,controller:!1,error:`Could not connect to the local setup session. Check the terminal and pair again.`})}}async function u(e){if(!(i.busy||i.paired)){o({busy:!0,error:``});try{let t=await fetch(`/api/pair`,{method:`POST`,cache:`no-store`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:e.trim().toLowerCase()})}),r=await t.json();if(!t.ok)throw Error(String(r.error??`Pairing was rejected.`));if(typeof r.sessionKey!=`string`||!/^[a-f0-9]{64}$/.test(r.sessionKey))throw Error(`Invalid local pairing response.`);n=r.sessionKey,o({paired:!0,error:``}),await l()}catch(e){o({error:e instanceof Error?e.message:`Could not pair this browser.`})}finally{o({busy:!1})}}}let d=(e,t,i=!0)=>Bi(e,t,{sessionKey:n,capability:i?r:void 0});async function f(e,t){let n=e instanceof Error?e.message:t;o({error:n}),/read-only|Control moved/.test(n)?await l():await s(!0)}async function p(e,t){if(!i.busy&&i.controller&&i.view?.promptRevision===e){o({busy:!0,error:``});try{await d(`/api/answer`,{revision:e,value:t}),await s()}catch(e){await f(e,`Could not submit this answer.`)}finally{o({busy:!1})}}}async function m(e){if(!i.busy&&i.controller&&i.view?.promptRevision===e){o({busy:!0,error:``});try{await d(`/api/retry-discovery`,{revision:e}),await s()}catch(e){await f(e,`Could not retry discovery.`)}finally{o({busy:!1})}}}async function h(e){if(!i.busy&&i.controller&&i.view?.promptRevision===e){o({busy:!0,error:``});try{await d(`/api/back`,{revision:e}),await s()}catch(e){await f(e,`Could not return to the previous question.`)}finally{o({busy:!1})}}}async function g(){if(i.controller&&!i.busy){o({busy:!0,error:``});try{await d(`/api/cancel`,{}),await s()}catch(e){let t=e instanceof Error?e.message:`Cancellation failed.`;o({error:t}),/read-only|Control moved/.test(t)&&await l()}finally{o({busy:!1})}}}async function _(e){if(!(i.busy||i.closed||!i.paired||i.controller)){o({busy:!0,error:``});try{let t=await d(`/api/takeover`,{code:e.trim().toLowerCase()},!1);r=String(t.capability),o({controller:!0,error:``}),await s()}catch(e){o({error:e instanceof Error?e.message:`Takeover failed.`}),await s(!0)}finally{o({busy:!1})}}}async function v(){if(!i.busy&&!i.closed&&i.controller&&i.view?.outcome){o({busy:!0,error:``});try{if((await d(`/api/close`,{})).closed!==!0)throw Error(`Could not close the local session. Check the terminal before trying again.`);n=void 0,r=void 0,o({closed:!0,controller:!1,error:``})}catch{o({error:`Could not close the local session. Check the terminal before trying again.`})}finally{o({busy:!1})}}}async function y(){if(!(i.busy||i.closed||!i.controller||i.view?.outcome!==`complete`)){o({busy:!0,error:``,view:{...i.view,doctor:{status:`running`}}});try{await d(`/api/doctor`,{})}catch(e){o({error:e instanceof Error?e.message:`Read-only verification failed.`})}finally{await s(!0),o({busy:!1})}}}return{subscribe:t.subscribe,pair:u,connect:l,refresh:s,poll:c,submit:p,retryDiscovery:m,back:h,cancel:g,takeOver:_,close:v,runDoctor:y}}var Hi={batchNextActions:`Next steps`,batchStatusReady:`Ready for review`,batchStatusBlocked:`Needs action`,batchStatusApplying:`Applying reviewed plan`,batchStatusPartial:`Partially applied; inspect before retry`,batchStatusWaiting:`PR created · waiting for human merge`,batchStatusPending:`Configuration applied · verification pending`,batchStatusUnchanged:`Already matches · unchanged`,batchStatusCancelled:`Pending work stopped; completed effects retained`,batchConfigurationPreview:`Configuration preview. This adds the configuration to your batch review. No permission probe or installation runs before you approve the complete batch.`,batchUseConfiguration:`Use this configuration`,planReuseBody:`Approve the listed temporary permission checks, then apply the reviewed setup. Existing Secret values are retained and will not be requested or replaced. Runtime capability verification can remain pending.`,organizationReuseTitle:`Reusing existing configuration`,organizationReuseBody:`{imported} compatible settings imported. Retain {shared} organization Variables and {overrides} repository overrides; write {writes} repository Variables. Shared values and existing Secret values stay unchanged.`,batchBranchReview:`Installation branch and reviewed base`,batchFocusTitle:`Selected repositories`,batchFocusBody:`{count} explicitly selected repositories in this organization. Review each target independently.`,batchReviewTitle:`Review setup plans`,batchProgressTitle:`Applying repository plans`,batchResultTitle:`Repository setup results`,batchProgressBody:`Applying the approved plans sequentially. Stop pauses pending work after the current request; completed changes and PRs remain.`,batchReviewBody:`Approve only the ready plans below. Setup proceeds sequentially, adds reviewed access without replacing shared values, and creates a PR for each changed repository. It does not merge, tag, release or deploy.`,batchResultBody:`A setup PR still needs human review and merge. Credential and runtime capability verification can remain pending. Completed PRs and access changes are kept if another target stops.`,batchStopping:`Stopping pending work after the current request. Completed changes will be retained.`,batchReasonDrift:`The reviewed base or ownership changed. Inspect the repository and review a fresh plan.`,batchReasonProvider:`GitHub did not confirm the last step. Retry inspects existing effects before continuing.`,batchCleanupPending:`Permission-check cleanup could not be confirmed. Pending work is stopped. Inspect GitHub history and the local recovery journal; resolve cleanup before starting a fresh setup. This operation cannot resume writes.`,batchReasonCancelled:`Pending work stopped. Completed changes were retained.`,batchReasonPreflight:`Review repository access, required bindings and target-specific settings before continuing.`,batchOpenPull:`Open setup PR`,batchFilesCount:`{count} changed files`,batchVariablesCount:`{count} repository Variable changes`,batchGrantsCount:`{count} additive repository access grants`,batchRetainedSecrets:`Existing Secret bindings retained`,batchResourcesExplanation:`Labels and enabled Issue Types are ensured separately for this target. Existing shared Secret values and other repositories’ access stay unchanged.`,batchReviewFiles:`Inspect proposed files`,batchDeleteFile:`This setup-managed file will be removed from the installation tree; inspect its retained backup.`,batchRepositoryOverrides:`Review repository Variable names`,batchReviewedAccess:`Review additive access`,batchApplyPlans:`Apply ready plans`,batchLeavePreview:`Leave without applying`,batchStopPending:`Stop pending work`,batchStopConfirm:`Stop pending setup work after the current request? Completed PRs, access and other changes will be kept.`,batchRetryPending:`Inspect and retry unfinished work`,batchFinish:`Finish this operation`,batchCleanup:`Delete temporary setup PATs in GitHub after this operation. Keep the bot PAT while repositories still consume its Secret.`,batchTechnical:`Operation details`,batchLookupUnavailable:`GitHub could not confirm that repository. Check its exact name and PAT access.`,batchSelectionInvalid:`Review the selection: choose 1–25 available repositories from this organization.`,batchAccessUnavailable:`Access is unconfirmed. Review the temporary PAT or remove this repository from the selection.`,batchSelectionBody:`Choose 1–25 repositories in {organization}. Only the repositories you select will be configured.`,batchDiscoveryUnavailable:`GitHub could not list repositories. The current repository remains available; find another by its exact name or review PAT access.`,batchDiscoveryTruncated:`This view reached its 1,000-repository limit. Search an exact repository name to add a missing target.`,batchFilter:`Filter visible repositories`,batchSelectedCount:`{count} selected · maximum 25`,batchRepositories:`Repositories`,batchPrivate:`Private`,batchPublic:`Public`,batchCurrent:`Current repository`,batchArchived:`Archived`,batchDisabled:`Disabled`,batchReadOnly:`Write access unavailable`,batchNoMatches:`No visible repositories match this filter.`,batchPrevious:`Previous`,batchNext:`Next`,batchMissingRepository:`Cannot find a repository?`,batchAccessExplanation:`Discovery shows only repositories this PAT can see. An exact-name lookup does not grant access or select the repository automatically. If you replace the temporary PAT, limit it to the repositories you intend to configure.`,batchExactName:`Exact repository name in this organization`,batchFindRepository:`Find repository`,batchChangeAccess:`Change temporary PAT access`,batchReviewSelection:`Review selected repositories`,patStorageRetain:`Keep the existing PAT Secret binding in {destination}. Its value is not requested, copied or replaced. A missing binding requires separate provisioning. Runtime identity and capability verification remain pending.`,patStorageTitle:`Bot PAT storage`,patRepositoryReplace:`Secret PAT already exists in repository {destination}. It will be replaced even when other existing Secrets are preserved.`,patOrganizationReplace:`Secret PAT already exists in organization {destination}. It will be replaced even when other existing Secrets are preserved.`,patRepositoryCreate:`The bot PAT will be stored as Secret PAT in repository {destination}.`,patOrganizationCreate:`The bot PAT will be stored as Secret PAT in organization {destination}.`,patReplacementChecks:`The supplied bot PAT must pass identity, repository access and required permission checks before this Secret is written.`,patOrganizationImpact:`Replacing this organization Secret can affect other repositories that use it. Checks for this repository do not verify their requirements.`,repositorySecretSettings:`Open repository Actions Secrets`,botAccountWarning:`You must open this link with the selected bot account: @{account}.`,botAccountHelp:`Check the GitHub account before generating the PAT. Use a private window or switch accounts if your browser is signed in as the setup operator.`,botGithubForm:`Create bot PAT as @{account}`,language:`Language`,english:`English`,spanish:`Español`,setup:`SETUP`,connecting:`Connecting…`,localSession:`LOCAL SESSION`,progress:`Setup progress`,studio:`SETUP STUDIO`,journey:`YOUR SETUP JOURNEY`,repository:`Repository`,choices:`Setup choices`,setupPat:`Setup PAT`,plan:`Plan`,botPat:`Bot PAT & credentials`,apply:`Apply`,localDesign:`Local by design`,localDesignBody:`This page runs on your computer. GitHub creates both PATs in its own browser tabs.`,preparing:`Preparing your setup…`,completeTitle:`Setup complete.`,previewTitle:`Preview complete.`,cancelledTitle:`Setup cancelled.`,blockedTitle:`Setup needs attention.`,gettingReady:`GETTING READY`,activeLede:`One decision at a time. Your choices shape the permissions, plan and credentials needed for this repository.`,resultLede:`Review the result and next action below. The terminal has additional technical detail.`,readOnly:`Read-only tab`,readOnlyBody:`Another tab controls this session. You can review progress here or explicitly take over.`,takeOver:`Take control in this tab`,attention:`Needs attention`,checked:`Checked`,pleaseNote:`Please note`,progressUpdate:`Progress update`,reviewPass:`Reviewing saved choices — pass {pass}. This is the same setup run, not a restart.`,cancelSetup:`Cancel setup`,cancelConfirm:`Cancel this local setup session? PATs already created in GitHub will still exist.`,footerLocal:`LOCALHOST ONLY`,footerCloud:`NO CLOUD SETUP ACCOUNT`,footerGithub:`GITHUB OWNS PAT ISSUANCE`,currentDecision:`CURRENT DECISION`,session:`SESSION`,continue:`Continue`,previousQuestion:`Previous question`,questionProgress:`Question {current} of {total} in this group · {overall} of {all} overall`,yes:`Yes`,no:`No`,permissionPreview:`PERMISSION PREVIEW`,changeAnswersTitle:`Change your answers`,changeAnswersHelp:`Return to a section without losing other answers. The plan and required PAT grants will be checked again.`,changeSection:`Change {section}`,editCapabilities:`Capabilities`,editRuntimes:`Agent runtimes`,editModels:`Agent models`,editRoleModels:`Per-role models`,editRepository:`Repository behavior`,editDeployment:`Release and hotfix`,editBugbot:`Bugbot`,editApproval:`PR approval`,editProjects:`Projects`,editProvisioning:`Provisioning`,editStorage:`Secrets and Variables`,suggested:`Suggested answer: {answer}. You can review choices again before creating your setup PAT.`,none:`none`,sourceGithub:`Observed from authenticated GitHub repository metadata.`,sourceConfig:`Provided by your configuration; GitHub has not replaced it.`,sourceDefault:`Product default; not verified against this repository.`,sourceLocal:`Observed in this local checkout; confirm this branch exists on GitHub before applying.`,whyMatters:`Why this matters`,whenApplies:`When it applies`,whereConfigured:`Where it is configured`,howToChoose:`How to choose`,whyRecommendation:`Why this matters`,example:`Example`,effect:`What changes`,verify:`How to check`,learnMore:`Read documentation about this setting`,resultApplied:`Your configuration was applied`,resultNoChanges:`No changes were made`,resultStopped:`No setup changes started`,resultPartial:`Check partial changes before retrying`,resultCompleteBody:`The temporary setup PAT is not revoked automatically. Delete it in GitHub after confirming your setup. Keep the bot PAT until you rotate the installed Secret.`,resultPartialBody:`A bot Secret write or another change may have succeeded. Inspect GitHub and run copilot doctor --read-only before replacing or deleting its PAT.`,resultNoChangesBody:`Copilot did not begin applying setup changes. Temporary permission checks may have run; GitHub can retain Actions, Issue or PR history after cleanup. PATs you created still exist until you delete them in GitHub.`,whatHappened:`What happened`,alreadyChanged:`Already changed`,noChanges:`No repository or GitHub setup changes were started in this session.`,nextAction:`Next action`,reasonPermissions:`The setup PAT lacked or could not confirm required permissions.`,nextPermissions:`Check the displayed grants, correct the PAT in GitHub, then start a fresh setup run.`,reasonWorkflowPermissions:`The bot PAT did not complete every required permission check. Check the failed grant and any preparation or cleanup prerequisite below.`,permissionReportTitle:`PAT permission evidence`,permissionReportLead:`Any required grants that could not be confirmed are listed below. Unverifiable does not mean missing.`,updatedSetupPatTitle:`Correct the setup PAT`,updatedSetupPatBody:`This GitHub link includes the required permissions for this setup run. Select this repository before creating the PAT. Close this local session, then start a fresh setup run with the corrected PAT.`,updatedSetupPatGrants:`Additional permissions discovered after inspection`,updatedSetupPatLink:`Create corrected setup PAT`,permissionProbeCleanupPending:`A temporary permission-test resource may still exist. Setup has stopped; do not assume cleanup succeeded.`,permissionProbeCleanupAction:`Retry with a PAT that can remove this resource. The local recovery journal is checked before any new permission tests.`,permissionSecretCollision:`GitHub reported that a Secret at the random test name was updated. A concurrent Secret value may have changed. Setup stopped without deleting it.`,permissionSecretCollisionAction:`Inspect the GitHub Secret audit trail and restore any affected value before retrying. This collision cannot be repaired from the local recovery journal.`,permissionIdentity:`GitHub identity and repository access`,permissionIdentityValid:`Verified`,permissionIdentityInvalid:`Rejected`,permissionIdentityUnknown:`Could not be confirmed`,permissionGrantNotChecked:`Not checked`,permissionReportNoFailedGrant:`No required grant failed this check. Review the intended PAT account and the terminal error before retrying.`,reasonStorage:`The selected GitHub Actions storage could not be used safely.`,nextStorage:`Inspect the Variables/Secrets scope and existing resources, then retry.`,reasonConfiguration:`The chosen configuration could not be validated.`,nextConfiguration:`Review the terminal validation details, correct the choices, and retry.`,reasonExpired:`The local setup session expired.`,nextExpired:`Start a new setup session; the old approval cannot be replayed.`,reasonCancelled:`This setup was cancelled.`,nextCancelled:`Start a new run if you still want to configure this repository.`,reasonUnknown:`Setup stopped. The browser could not determine the exact cause. Review the resource receipt when available and inspect the terminal.`,nextUnknown:`Check the final terminal error before retrying; do not assume a PAT was revoked.`,reasonProvider:`GitHub or another provider did not complete the requested operation.`,nextProvider:`Use the diagnostic reference to inspect the terminal result, check provider availability and access, then retry only after reviewing possible partial changes.`,reasonRateLimit:`GitHub temporarily limited the requests needed for setup.`,nextRateLimit:`Wait for the limit to reset. Inspect any completed changes before starting another setup run.`,diagnosticReference:`Diagnostic reference`,resourceReceipt:`Setup operation receipt`,effectCompleted:`Reported completed`,effectSkipped:`Reported skipped`,effectInspect:`Outcome needs inspection`,effectNotStarted:`Not started`,effectInProgress:`In progress; outcome not yet confirmed`,scopeLocal:`Local checkout`,scopeMixed:`Repository and organization`,receiptFiles:`Setup files`,receiptSecrets:`GitHub Actions Secrets`,receiptLabels:`Issue labels`,receiptIssueTypes:`Issue types`,receiptVariables:`GitHub Actions Variables`,receiptInitialTag:`Initial version tag`,inspectPartial:`Some setup changes may already be active. Inspect GitHub and the terminal result before retrying.`,patSettings:`Open GitHub PAT settings ↗`,closeSession:`Close local session`,sessionClosed:`Local session closed`,sessionClosedBody:`The local server accepted the close request. This page has stopped contacting it and retains the result. Closing the session does not revoke any PAT created in GitHub.`,doctorHelp:`After success, you can verify installed resources here without dispatching Actions. Or run copilot doctor --read-only from the repository root with the temporary setup PAT and the same non-secret --config file, if used.`,doctorRun:`Verify installed setup (read-only)`,doctorRunning:`Checking installed resources without dispatching Actions…`,doctorPassed:`Read-only verification found no failing checks.`,doctorWarnings:`Read-only verification needs attention.`,doctorFailed:`Read-only verification did not finish. Check the terminal or run the command below.`,doctorCounts:`{pass} passed · {warn} warnings · {fail} failed · {skipped} skipped.`,doctorSecretLimit:`Secret values cannot be verified in this mode.`,botRenewal:`The bot PAT stays in the selected GitHub Actions Secret for future runs. Its actual expiry is not verified here; record it in GitHub and rotate the Secret before expiry.`,working:`Working on the next step`,workingBody:`The local process is checking your answers and preparing the next decision. Keep this page open.`,repoFocus:`Repository in focus`,repoFocusBody:`This setup configures the repository below. Organization Secrets and Variables may be shared with other repositories.`,access:`access`,readOnlyCheck:`Capability check`,provisionalGrants:`Provisional least-privilege grants`,conditionalGrants:`Conditional grants depend on the choices and GitHub facts. A final audit runs before setup changes.`,permissionEvidenceVerified:`A GitHub read confirmed this access.`,permissionEvidenceVerifiedWrite:`A temporary resource was created, read, and removed.`,permissionEvidencePrivateProject:`A non-public organization Project confirmed Projects read access.`,permissionEvidenceMissing:`GitHub rejected the required access. Check the PAT settings.`,permissionEvidenceWrite:`The temporary write check did not finish successfully. Review the failed phase and retry.`,permissionEvidencePublic:`The read succeeded, but this public resource does not independently prove the PAT grant.`,permissionEvidencePublicProjects:`The Projects read succeeded, including an empty result. Private Project access is checked when a Project is selected.`,permissionEvidenceUnknownRead:`The read check was inconclusive. Review the terminal detail and retry if needed.`,permissionUnknown:`This permission needs review. Check its exact grant and technical explanation in the terminal before continuing.`,permissionsFollow:`Permissions follow your choices`,permissionsFollowBody:`We’ll show the exact grants before you create each PAT. Nothing is created just by opening this page.`,files:`Files`,workflows:`Workflows`,variables:`Variables`,secretNames:`Secret names`,planBody:`Review exactly what this run may change. Approval first runs temporary PAT write checks, then collects the bot PAT and other credentials. GitHub may retain workflow runs, Issue or PR history, or notifications from those checks.`,planPermissionProbeTitle:`Temporary permission checks after approval`,planPermissionProbeBody:`Each listed permission creates, reads and removes its own temporary resource. The Issues check creates a visible Issue; if GitHub denies deletion, setup closes it, reports its number and stops. Actions, Issues and Pull requests may leave history or notifications.`,planActionsProbePrerequisites:`The Actions check needs Contents Write to create its isolated branch. If the exact packaged health workflow is unavailable on the default branch, it also needs Workflows Write to prepare a disabled-job override. For the bot check, the setup PAT prepares and cleans the fixture; the bot PAT dispatches and reads its run. A blocked prerequisite does not prove Actions is missing.`,planSecretProbeLimit:`GitHub only offers an upsert for Secrets. The check uses a private random name and confirms it is absent first, but GitHub cannot guarantee atomic create-only behavior. If it reports an update, setup stops and asks you to inspect the Secret audit trail.`,planChoices:`Your key decisions`,planEnabledCapabilities:`Enabled capabilities`,planBranchRoles:`Production / development branch`,planApprovalMode:`Pull-request approval`,planVariableScope:`Variables scope`,planSecretScope:`Secrets scope`,planInitialTag:`Create initial tag`,planAgentRouting:`Agent and model for each task`,planIssueWorkflows:`Issue workflows`,planTrustedChecks:`Trusted CI producers`,planCoverage:`Coverage evidence`,planProjectStatuses:`Project Status transitions`,planIssueResources:`Issue labels and issue types`,planIssueResourcesValue:`Checked or provisioned during Apply`,planProducerAttested:`CI identity and enforcing step verified by you`,planCoverageThreshold:`Minimum changed-line coverage`,planCoverageReporter:`Artifact-publishing workflow`,planReporterAttested:`Coverage reporter verified by you`,planAdvancedDefaults:`The plan also includes defaults for settings you did not change. Use Change below to inspect any section before approving.`,planUnknownWarning:`An additional plan warning could not be displayed here. Read the terminal warning before approving.`,planBasicDefaultsIntro:`Basic setup retained these advanced defaults. Open a section below to review or change them:`,scopeRepository:`Repository`,scopeOrganization:`Organization`,scopeDisabled:`Not provisioned`,approvalOff:`Off`,approvalRecommend:`Recommendation only`,approvalGuarded:`Guarded approval`,beforeContinue:`Before you continue`,stopHere:`Stop here`,approvePlan:`Approve this plan`,githubLink:`Open GitHub link ↗`,githubForm:`Open the official GitHub PAT form`,githubFormHelp:`Check the signed-in account, select Only select repositories, then select this repository. GitHub handles 2FA and creates the PAT.`,pasteHere:`Paste the value here`,yourAnswer:`Your answer`,hiddenAfter:`Hidden after submission`,typeAnswer:`Type your answer`,secretHelp:`Sent only to this local process. It will not be shown again or saved in browser storage.`,pairTitle:`Pair this browser`,pairLabel:`Pairing code from terminal`,pairPlaceholder:`16 hexadecimal characters`,pairBody:`Find the 16-character pairing code in the terminal that started copilot setup --web. Enter it here to view or control this setup. The code is never placed in the browser URL or stored after this page closes.`,pairHelp:`Keep the code private. After refreshing this page, enter it again to reconnect.`,pairButton:`Connect to local setup`,privateSession:`PRIVATE LOCAL SESSION`,theme:`Color theme`,themeAuto:`Auto`,themeSystem:`Follow system theme`,themeLight:`Light theme`,themeDark:`Dark theme`,selectOne:`Select one`,ciRun:`Open CI run on GitHub ↗`,manualCheck:`Check not listed? Enter exact name|App ID|workflow, separated by semicolons.`,checksObserved:`Recent CI jobs were found. Open each run and verify the exact job, App and enforcing coverage step before trusting it.`,checksNoRecent:`No recent pull-request workflow runs were found. Run your normal CI on a real pull request, or enter an exact producer manually.`,checksNoVerifiable:`Recent runs exist, but no job could be linked to an exact Check Run and App identity. Inspect GitHub or enter an exact producer manually.`,checksDenied:`GitHub did not allow CI discovery. Give the setup PAT Actions: read and Checks: read, or enter an exact producer manually.`,checksUnavailable:`GitHub CI discovery could not complete. This is not evidence that the repository has no checks. Retry setup or enter an exact producer manually.`,projectsObserved:`These existing Projects belong to the repository owner. Select only Projects this automation should update.`,projectsEmpty:`This bounded GitHub query returned no open, accessible organization Projects; it does not prove none exist. Check access or enter a verified Project number.`,projectsDenied:`GitHub did not allow Project discovery. Check organization Projects: read on the setup PAT, or enter Project numbers manually.`,projectsUnavailable:`GitHub Project discovery could not complete. This is not evidence that no Projects exist. Enter a verified Project number manually or retry.`,projectsUnsupported:`GitHub does not support listing personal Projects with a fine-grained PAT through this endpoint. Enter an existing Project number from its URL.`,discoveryTruncated:`Only a bounded sample of accessible Projects or recent checks was inspected. Use manual entry for an item not shown.`,checksDiscoveryScope:`Search scope: select up to 20 PR runs from the latest 1,000 workflow runs (up to 10 pages) within 90 days; at most 15 runs and 100 checks per commit are inspected.`,projectsDiscoveryScope:`Search scope: at most 30 open, accessible organization Projects from two pages; up to 100 fields are inspected per Project. Closed Projects are excluded.`,retryDiscovery:`Retry GitHub discovery`,retryRemaining:`{count} read-only retries left. Your answers stay here.`,retryExhausted:`No discovery retries remain. Inspect GitHub and use the manual option if the item is missing.`,observationTimeUnknown:`observation time unavailable`,branchRequirementUnknown:`Required by branch rule: not checked`,branchRequirementObserved:`Required on {branch} by an active ruleset for this exact check and App.`,ciRule:`Open required-check ruleset ↗`,projectSharedStatus:`All selected Projects must share each chosen Status value. This setup cannot assign a different Status vocabulary per Project.`,fixedWorkflowEnabled:`Your configuration fixes features.{kind}=true. Keep {kind} selected; edit --config or flags to change this.`,fixedWorkflowDisabled:`Your configuration fixes features.{kind}=false. Leave {kind} unselected; edit --config or flags to change this.`,fixedIssuesRequired:`Your configuration explicitly enables release or hotfix automation. Keep Issues enabled, or change --config or flags first.`,projectSelectionNotObserved:`Previously selected Project numbers are retained, but no longer appear in this GitHub result. Verify each in GitHub or remove it.`,removeSelection:`Remove selection`,projectTransitionIssueCreated:`New issue`,projectTransitionPullRequestCreated:`New pull request`,projectTransitionIssueInProgress:`Issue in progress`,projectTransitionPullRequestInProgress:`Pull request in progress`,projectUrl:`Open Project on GitHub ↗`,projectManual:`Project not listed? Enter its positive number or exact GitHub URL. PVT_ IDs are not accepted.`,projectStatusUnavailable:`Status options could not be verified for every selected Project. Enter the exact existing Status value after checking each Project in GitHub.`,projectStatusIncompatible:`Selected Projects have no shared Status values. Choose compatible Projects before continuing.`,producerName:`Check/job name`,producerAppId:`Source GitHub App ID`,producerWorkflow:`Workflow name`,producerAdd:`Add exact check`,producerRemove:`Remove check`,producerManualHelp:`Use the exact identity shown on GitHub. Adding it does not attest that it enforces coverage.`,producerManualInvalid:`Enter a check name, positive numeric App ID and workflow name. Do not use | or ; in names. Commas are allowed.`,translationPreviewTitle:`Translation review in progress`,translationPreviewBody:`First-party setup questions are translated. Some dynamic GitHub or provider diagnostics may still appear in English while localization review finishes. Changing language does not change your answers.`,unknownLocalError:`An unexpected local setup error occurred. Check the terminal for details, then refresh or restart setup.`},Ui={batchNextActions:`Siguientes pasos`,batchStatusReady:`Listo para revisar`,batchStatusBlocked:`Requiere una acción`,batchStatusApplying:`Aplicando el plan revisado`,batchStatusPartial:`Aplicado parcialmente; revisa antes de reintentar`,batchStatusWaiting:`PR creada · pendiente de merge por un mantenedor`,batchStatusPending:`Configuración aplicada · verificación pendiente`,batchStatusUnchanged:`Ya coincide · sin cambios`,batchStatusCancelled:`Trabajo pendiente detenido; se conservan los cambios completados`,batchConfigurationPreview:`Vista previa de la configuración. Se añadirá a la revisión del lote. Las pruebas de permisos y la instalación esperan a que apruebes el lote completo.`,batchUseConfiguration:`Usar esta configuración`,planReuseBody:`Aprueba las pruebas temporales de permisos indicadas y después se aplicará el setup revisado. Los valores de los Secrets existentes se conservan y no se solicitan ni se sustituyen. La verificación de permisos en ejecución puede quedar pendiente.`,organizationReuseTitle:`Reutilización de la configuración existente`,organizationReuseBody:`{imported} ajustes compatibles importados. Se conservan {shared} Variables de organización y {overrides} del repositorio; se escriben {writes} Variables en el repositorio. Los valores compartidos y los Secrets existentes se conservan.`,batchBranchReview:`Rama de instalación y base revisada`,batchFocusTitle:`Repositorios seleccionados`,batchFocusBody:`{count} repositorios seleccionados explícitamente en esta organización. Revisa cada destino por separado.`,batchReviewTitle:`Revisa los planes de setup`,batchProgressTitle:`Aplicando los planes por repositorio`,batchResultTitle:`Resultados del setup por repositorio`,batchProgressBody:`Se aplican los planes aprobados por orden. Detener pausa el trabajo pendiente después de la petición actual; los cambios y las PRs completadas se conservan.`,batchReviewBody:`Aprueba solo los planes listos que aparecen abajo. El setup avanza por orden, añade el acceso revisado sin sustituir valores compartidos y crea una PR por cada repositorio con cambios. No hace merge, crea tags, publica versiones ni despliega.`,batchResultBody:`Una PR de setup todavía necesita revisión y merge por un mantenedor. La verificación de credenciales y permisos en ejecución puede quedar pendiente. Las PRs y los accesos completados se conservan si otro destino se detiene.`,batchStopping:`Deteniendo el trabajo pendiente tras la petición actual. Los cambios completados se conservarán.`,batchReasonDrift:`La base revisada o su titularidad han cambiado. Inspecciona el repositorio y revisa un plan nuevo.`,batchReasonProvider:`GitHub no ha confirmado el último paso. El reintento inspecciona lo existente antes de continuar.`,batchCleanupPending:`No se pudo confirmar la limpieza de la comprobación de permisos. El trabajo pendiente está detenido. Revisa el historial de GitHub y el registro local de recuperación; resuelve la limpieza antes de iniciar un setup nuevo. Esta operación no puede reanudar escrituras.`,batchReasonCancelled:`El trabajo pendiente se detuvo. Se conservaron los cambios completados.`,batchReasonPreflight:`Revisa el acceso, los secretos requeridos y los ajustes específicos del repositorio antes de continuar.`,batchOpenPull:`Abrir PR de setup`,batchFilesCount:`{count} archivos con cambios`,batchVariablesCount:`{count} cambios en Variables del repositorio`,batchGrantsCount:`{count} accesos que se añadirán para este repositorio`,batchRetainedSecrets:`Secrets existentes que se conservan`,batchResourcesExplanation:`Los labels y los Issue Types habilitados se preparan por separado para este destino. Se conservan los valores de los Secrets compartidos y el acceso de los demás repositorios.`,batchReviewFiles:`Inspeccionar archivos propuestos`,batchDeleteFile:`Este archivo gestionado por el setup se retirará del árbol de instalación; inspecciona la copia conservada.`,batchRepositoryOverrides:`Revisar nombres de Variables del repositorio`,batchReviewedAccess:`Revisar accesos que se añadirán`,batchApplyPlans:`Aplicar planes listos`,batchLeavePreview:`Salir sin aplicar`,batchStopPending:`Detener trabajo pendiente`,batchStopConfirm:`¿Detener el trabajo pendiente tras la petición actual? Se conservarán las PRs, los accesos y los cambios completados.`,batchRetryPending:`Inspeccionar y reintentar lo pendiente`,batchFinish:`Finalizar esta operación`,batchCleanup:`Elimina los PATs temporales de setup en GitHub al terminar. Conserva el PAT del bot mientras los repositorios consuman su Secret.`,batchTechnical:`Detalles de la operación`,batchLookupUnavailable:`GitHub no ha podido confirmar ese repositorio. Revisa el nombre exacto y el acceso del PAT.`,batchSelectionInvalid:`Revisa la selección: elige entre 1 y 25 repositorios disponibles de esta organización.`,batchAccessUnavailable:`El acceso no está confirmado. Revisa el PAT temporal o quita este repositorio de la selección.`,batchSelectionBody:`Elige entre 1 y 25 repositorios de {organization}. Solo se configurarán los que selecciones.`,batchDiscoveryUnavailable:`GitHub no ha podido listar los repositorios. Puedes seleccionar el actual, buscar otro por su nombre exacto o revisar el acceso del PAT.`,batchDiscoveryTruncated:`Esta vista ha alcanzado el límite de 1.000 repositorios. Busca por nombre exacto para añadir uno que falte.`,batchFilter:`Filtrar repositorios visibles`,batchSelectedCount:`{count} seleccionados · máximo 25`,batchRepositories:`Repositorios`,batchPrivate:`Privado`,batchPublic:`Público`,batchCurrent:`Repositorio actual`,batchArchived:`Archivado`,batchDisabled:`Deshabilitado`,batchReadOnly:`Sin acceso de escritura`,batchNoMatches:`Ningún repositorio visible coincide con el filtro.`,batchPrevious:`Anterior`,batchNext:`Siguiente`,batchMissingRepository:`¿No encuentras un repositorio?`,batchAccessExplanation:`La lista solo muestra los repositorios visibles para este PAT. Buscar por nombre exacto no concede acceso ni selecciona el repositorio automáticamente. Si sustituyes el PAT temporal, limítalo a los repositorios que quieras configurar.`,batchExactName:`Nombre exacto del repositorio en esta organización`,batchFindRepository:`Buscar repositorio`,batchChangeAccess:`Cambiar acceso del PAT temporal`,batchReviewSelection:`Revisar repositorios seleccionados`,patStorageRetain:`Se conserva el Secret PAT existente en {destination}. No se pide, copia ni sustituye su valor. Si falta, debe crearse por separado. La verificación de la identidad y los permisos en ejecución queda pendiente.`,patStorageTitle:`Almacenamiento del PAT del bot`,patRepositoryReplace:`El Secret PAT ya existe en el repositorio {destination}. Se sustituirá aunque hayas elegido preservar los demás Secrets existentes.`,patOrganizationReplace:`El Secret PAT ya existe en la organización {destination}. Se sustituirá aunque hayas elegido preservar los demás Secrets existentes.`,patRepositoryCreate:`El PAT del bot se guardará como Secret PAT en el repositorio {destination}.`,patOrganizationCreate:`El PAT del bot se guardará como Secret PAT en la organización {destination}.`,patReplacementChecks:`El PAT del bot que introduzcas debe superar las comprobaciones de identidad, acceso al repositorio y permisos necesarios antes de escribir este Secret.`,patOrganizationImpact:`Sustituir este Secret de organización puede afectar a otros repositorios que lo utilizan. Las comprobaciones para este repositorio no verifican los requisitos de los demás.`,repositorySecretSettings:`Abrir los Secrets de Actions del repositorio`,botAccountWarning:`Debes abrir este enlace con la cuenta de bot seleccionada: @{account}.`,botAccountHelp:`Comprueba la cuenta de GitHub antes de generar el PAT. Usa una ventana privada o cambia de cuenta si el navegador tiene la sesión del operador del setup.`,botGithubForm:`Crear PAT del bot como @{account}`,language:`Idioma`,english:`English`,spanish:`Español`,setup:`CONFIGURACIÓN`,connecting:`Conectando…`,localSession:`SESIÓN LOCAL`,progress:`Progreso de la configuración`,studio:`ASISTENTE DE CONFIGURACIÓN`,journey:`TU RECORRIDO`,repository:`Repositorio`,choices:`Opciones de configuración`,setupPat:`PAT de configuración`,plan:`Plan`,botPat:`PAT del bot y credenciales`,apply:`Aplicar`,localDesign:`Local por diseño`,localDesignBody:`Esta página se ejecuta en tu ordenador. GitHub crea ambos PAT en sus propias pestañas.`,preparing:`Preparando la configuración…`,completeTitle:`Configuración completada.`,previewTitle:`Vista previa completada.`,cancelledTitle:`Configuración cancelada.`,blockedTitle:`La configuración necesita atención.`,gettingReady:`PREPARANDO`,activeLede:`Una decisión cada vez. Tus elecciones determinan los permisos, el plan y las credenciales que necesita este repositorio.`,resultLede:`Revisa abajo el resultado y el siguiente paso. La terminal contiene más detalles técnicos.`,readOnly:`Pestaña de solo lectura`,readOnlyBody:`Otra pestaña controla esta sesión. Puedes ver el progreso aquí o tomar el control explícitamente.`,takeOver:`Tomar el control en esta pestaña`,attention:`Necesita atención`,checked:`Comprobado`,pleaseNote:`Ten en cuenta`,progressUpdate:`Actualización de progreso`,reviewPass:`Revisando las opciones guardadas — pasada {pass}. Es la misma ejecución, no un reinicio.`,cancelSetup:`Cancelar configuración`,cancelConfirm:`¿Cancelar esta sesión local? Los PAT ya creados en GitHub seguirán existiendo.`,footerLocal:`SOLO LOCALHOST`,footerCloud:`SIN CUENTA DE CONFIGURACIÓN EN LA NUBE`,footerGithub:`GITHUB EMITE LOS PAT`,currentDecision:`DECISIÓN ACTUAL`,session:`SESIÓN`,continue:`Continuar`,previousQuestion:`Pregunta anterior`,questionProgress:`Pregunta {current} de {total} en este grupo · {overall} de {all} en total`,yes:`Sí`,no:`No`,permissionPreview:`VISTA PREVIA DE PERMISOS`,changeAnswersTitle:`Cambiar respuestas`,changeAnswersHelp:`Vuelve a una sección sin perder las demás respuestas. Se comprobarán de nuevo el plan y los permisos necesarios del PAT.`,changeSection:`Cambiar {section}`,editCapabilities:`Funciones`,editRuntimes:`Agentes`,editModels:`Modelos de agentes`,editRoleModels:`Modelos por tarea`,editRepository:`Comportamiento del repositorio`,editDeployment:`Releases y hotfixes`,editBugbot:`Bugbot`,editApproval:`Aprobación de PR`,editProjects:`Projects`,editProvisioning:`Aprovisionamiento`,editStorage:`Secrets y Variables`,suggested:`Respuesta sugerida: {answer}. Podrás revisar las opciones antes de crear el PAT de configuración.`,none:`ninguna`,sourceGithub:`Consultado en los metadatos autenticados de este repositorio en GitHub.`,sourceConfig:`Valor de tu configuración; GitHub no lo ha sustituido.`,sourceDefault:`Valor predeterminado del producto; no verificado en este repositorio.`,sourceLocal:`Observado en este checkout local; confirma que la rama existe en GitHub antes de aplicar cambios.`,whyMatters:`Por qué importa`,whenApplies:`Cuándo se aplica`,whereConfigured:`Dónde se configura`,howToChoose:`Cómo elegir`,whyRecommendation:`Por qué importa`,example:`Ejemplo`,effect:`Qué cambia`,verify:`Cómo comprobarlo`,learnMore:`Leer documentación de esta opción`,resultApplied:`Tu configuración se ha aplicado`,resultNoChanges:`No se hicieron cambios`,resultStopped:`No se empezó a aplicar la configuración`,resultPartial:`Revisa los cambios parciales antes de reintentar`,resultCompleteBody:`El PAT temporal de configuración no se revoca automáticamente. Elimínalo en GitHub tras comprobar el resultado. Conserva el PAT del bot hasta que rotes el Secret instalado.`,resultPartialBody:`Puede haberse escrito el Secret del bot u otro recurso. Revisa GitHub y ejecuta copilot doctor --read-only antes de reemplazar o eliminar ese PAT.`,resultNoChangesBody:`Copilot no empezó a aplicar cambios de configuración. Puede haber ejecutado pruebas temporales de permisos; GitHub puede conservar historial de Actions, Issues o PR después de limpiarlas. Los PAT creados siguen allí hasta que los elimines.`,whatHappened:`Qué ha pasado`,alreadyChanged:`Qué ha cambiado`,noChanges:`No se iniciaron cambios de configuración en el repositorio ni en GitHub durante esta sesión.`,nextAction:`Siguiente paso`,reasonPermissions:`Faltan permisos del PAT de configuración o no pudieron confirmarse.`,nextPermissions:`Comprueba los permisos mostrados, corrige el PAT en GitHub e inicia una nueva sesión.`,reasonWorkflowPermissions:`El PAT del bot no completó todas las comprobaciones de permisos. Revisa el permiso fallido y los requisitos de preparación o limpieza indicados abajo.`,permissionReportTitle:`Comprobación de permisos del PAT`,permissionReportLead:`Se muestran los permisos obligatorios que no pudieron confirmarse. «No verificable» no significa «ausente».`,updatedSetupPatTitle:`Corrige el PAT de configuración`,updatedSetupPatBody:`Este enlace de GitHub incluye los permisos necesarios para esta configuración. Selecciona este repositorio antes de crear el PAT. Cierra esta sesión local e inicia una nueva configuración con el PAT corregido.`,updatedSetupPatGrants:`Permisos adicionales detectados tras la inspección`,updatedSetupPatLink:`Crear PAT de configuración corregido`,permissionProbeCleanupPending:`Puede quedar un recurso temporal de comprobación de permisos. El setup se ha detenido; no supongas que se eliminó.`,permissionProbeCleanupAction:`Reintenta con un PAT capaz de eliminarlo. Se revisa el registro local de recuperación antes de nuevas pruebas.`,permissionSecretCollision:`GitHub indicó que se actualizó un Secret con el nombre aleatorio de prueba. Es posible que haya cambiado un valor creado a la vez. El setup se detuvo sin eliminarlo.`,permissionSecretCollisionAction:`Revisa el historial de Secrets de GitHub y restaura cualquier valor afectado antes de reintentar. El registro local de recuperación no puede reparar esta colisión.`,permissionIdentity:`Identidad de GitHub y acceso al repositorio`,permissionIdentityValid:`Verificados`,permissionIdentityInvalid:`Rechazados`,permissionIdentityUnknown:`No se pudieron confirmar`,permissionGrantNotChecked:`Sin comprobar`,permissionReportNoFailedGrant:`La comprobación no detectó un permiso obligatorio fallido. Revisa la cuenta prevista para el PAT y el error de la terminal antes de reintentarlo.`,reasonStorage:`No se pudo usar de forma segura el almacenamiento elegido de GitHub Actions.`,nextStorage:`Revisa el ámbito de Variables/Secrets y los recursos existentes; después, reinténtalo.`,reasonConfiguration:`No se pudo validar la configuración elegida.`,nextConfiguration:`Revisa el detalle de validación en la terminal, corrige las opciones y reinténtalo.`,reasonExpired:`La sesión local caducó.`,nextExpired:`Inicia una sesión nueva; la aprobación anterior no puede reutilizarse.`,reasonCancelled:`La sesión se canceló.`,nextCancelled:`Inicia una nueva ejecución si todavía quieres configurar este repositorio.`,reasonUnknown:`La configuración se detuvo. El navegador no pudo determinar la causa exacta. Revisa el recibo de recursos, si está disponible, y consulta la terminal.`,nextUnknown:`Consulta el último error de la terminal antes de reintentar; no supongas que se revocó ningún PAT.`,reasonProvider:`GitHub u otro proveedor no completó la operación solicitada.`,nextProvider:`Usa la referencia de diagnóstico para consultar la terminal, comprueba la disponibilidad y el acceso al proveedor y revisa posibles cambios parciales antes de reintentar.`,reasonRateLimit:`GitHub ha limitado temporalmente las solicitudes necesarias para la configuración.`,nextRateLimit:`Espera a que se restablezca el límite. Inspecciona los cambios completados antes de iniciar otra configuración.`,diagnosticReference:`Referencia de diagnóstico`,resourceReceipt:`Registro de operaciones de configuración`,effectCompleted:`Marcada como completada`,effectSkipped:`Marcada como omitida`,effectInspect:`Resultado pendiente de inspección`,effectNotStarted:`No iniciada`,effectInProgress:`En curso; resultado aún sin confirmar`,scopeLocal:`Checkout local`,scopeMixed:`Repositorio y organización`,receiptFiles:`Archivos de configuración`,receiptSecrets:`Secrets de GitHub Actions`,receiptLabels:`Etiquetas de issues`,receiptIssueTypes:`Tipos de issue`,receiptVariables:`Variables de GitHub Actions`,receiptInitialTag:`Etiqueta de versión inicial`,inspectPartial:`Algunos cambios podrían estar activos. Revisa GitHub y el resultado de la terminal antes de reintentar.`,patSettings:`Abrir ajustes de PAT en GitHub ↗`,closeSession:`Cerrar sesión local`,sessionClosed:`Sesión local cerrada`,sessionClosedBody:`El servidor local aceptó la solicitud de cierre. Esta página deja de consultarlo y conserva el resultado. Cerrar la sesión no revoca ningún PAT creado en GitHub.`,doctorHelp:`Tras completar el setup, puedes comprobar aquí los recursos instalados sin lanzar Actions. También puedes ejecutar copilot doctor --read-only desde la raíz del repositorio con el PAT temporal y el mismo archivo --config no secreto, si lo usaste.`,doctorRun:`Comprobar instalación (solo lectura)`,doctorRunning:`Comprobando los recursos instalados sin lanzar Actions…`,doctorPassed:`La comprobación de solo lectura no encontró fallos.`,doctorWarnings:`La comprobación de solo lectura requiere atención.`,doctorFailed:`La comprobación de solo lectura no terminó. Revisa la terminal o ejecuta el comando indicado abajo.`,doctorCounts:`{pass} correctas · {warn} avisos · {fail} fallos · {skipped} omitidas.`,doctorSecretLimit:`Este modo no puede verificar los valores de Secrets.`,botRenewal:`El PAT del bot permanece en el Secret de GitHub Actions seleccionado para futuras ejecuciones. Su fecha real de caducidad no se verifica aquí; anótala en GitHub y rota el Secret antes de que venza.`,working:`Preparando el siguiente paso`,workingBody:`El proceso local comprueba tus respuestas y prepara la siguiente decisión. Mantén esta página abierta.`,repoFocus:`Repositorio seleccionado`,repoFocusBody:`Este setup configura el repositorio indicado. Los Secrets y Variables de organización pueden compartirse con otros repositorios.`,access:`acceso`,readOnlyCheck:`Comprobación de capacidades`,provisionalGrants:`Permisos provisionales de mínimo privilegio`,conditionalGrants:`Los permisos condicionales dependen de tus elecciones y de GitHub. Se hará una auditoría final antes de cualquier cambio.`,permissionEvidenceVerified:`Una lectura de GitHub confirmó este acceso.`,permissionEvidenceVerifiedWrite:`Se creó, leyó y eliminó un recurso temporal.`,permissionEvidencePrivateProject:`Un Project no público de la organización confirmó el acceso de lectura a Projects.`,permissionEvidenceMissing:`GitHub rechazó el acceso necesario. Comprueba los ajustes del PAT.`,permissionEvidenceWrite:`La comprobación temporal de escritura no terminó correctamente. Revisa la fase fallida y vuelve a intentarlo.`,permissionEvidencePublic:`La lectura funcionó, pero este recurso público no demuestra por sí solo el permiso del PAT.`,permissionEvidencePublicProjects:`La lectura de Projects funcionó, incluso si devolvió una lista vacía. El acceso a Projects privados se comprueba al seleccionarlos.`,permissionEvidenceUnknownRead:`La consulta de lectura no fue concluyente. Revisa el detalle en la terminal y reintenta si hace falta.`,permissionUnknown:`Este permiso requiere revisión. Comprueba en la terminal el permiso exacto y su explicación técnica antes de continuar.`,permissionsFollow:`Los permisos dependen de tus elecciones`,permissionsFollowBody:`Mostraremos los permisos exactos antes de crear cada PAT. Abrir esta página no crea nada.`,files:`Archivos`,workflows:`Workflows`,variables:`Variables`,secretNames:`Nombres de Secrets`,planBody:`Revisa exactamente lo que podría cambiar. Al aprobar, se prueban los permisos de escritura del PAT con recursos temporales; después se pedirán el PAT del bot y otras credenciales. GitHub puede conservar ejecuciones, historial de Issues o PR y notificaciones de esas pruebas.`,planPermissionProbeTitle:`Pruebas temporales de permisos tras aprobar`,planPermissionProbeBody:`Cada permiso indicado crea, lee y elimina su propio recurso temporal. La prueba de Issues crea un Issue visible; si GitHub impide borrarlo, el setup lo cierra, informa de su número y se detiene. Actions, Issues y Pull requests pueden dejar historial o notificaciones.`,planActionsProbePrerequisites:`La prueba de Actions necesita Contents Write para crear su rama aislada. Si el workflow de salud empaquetado exacto no está disponible en la rama predeterminada, también necesita Workflows Write para preparar una versión con los jobs desactivados. Al comprobar el bot, el PAT de setup prepara y limpia el recurso; el PAT del bot lanza y lee su ejecución. Un requisito bloqueado no demuestra que falte Actions.`,planSecretProbeLimit:`GitHub solo permite crear o actualizar Secrets con la misma operación. La prueba usa un nombre aleatorio privado y comprueba antes que no exista, pero GitHub no garantiza una creación atómica. Si informa de una actualización, el setup se detiene y te pide revisar el historial del Secret.`,planChoices:`Tus decisiones principales`,planEnabledCapabilities:`Funciones activadas`,planBranchRoles:`Rama de producción / desarrollo`,planApprovalMode:`Aprobación de pull requests`,planVariableScope:`Ámbito de Variables`,planSecretScope:`Ámbito de Secrets`,planInitialTag:`Crear etiqueta inicial`,planAgentRouting:`Agente y modelo por tarea`,planIssueWorkflows:`Flujos de issues`,planTrustedChecks:`Productores de CI fiables`,planCoverage:`Prueba de cobertura`,planProjectStatuses:`Transiciones de Status en Projects`,planIssueResources:`Etiquetas y tipos de issue`,planIssueResourcesValue:`Se comprobarán o crearán al aplicar`,planProducerAttested:`Identidad de CI y paso obligatorio comprobados por ti`,planCoverageThreshold:`Cobertura mínima de líneas modificadas`,planCoverageReporter:`Workflow que publica el artefacto`,planReporterAttested:`Generador de cobertura comprobado por ti`,planAdvancedDefaults:`El plan también incluye valores predeterminados de ajustes que no cambiaste. Usa Cambiar más abajo para revisar cualquier sección antes de aprobar.`,planUnknownWarning:`Hay un aviso adicional del plan que no se puede mostrar aquí. Léelo en la terminal antes de aprobar.`,planBasicDefaultsIntro:`El modo básico conservó estos ajustes avanzados. Abre una sección más abajo para revisarlos o cambiarlos:`,scopeRepository:`Repositorio`,scopeOrganization:`Organización`,scopeDisabled:`Sin aprovisionar`,approvalOff:`Desactivada`,approvalRecommend:`Solo recomendaciones`,approvalGuarded:`Aprobación protegida`,beforeContinue:`Antes de continuar`,stopHere:`Detener aquí`,approvePlan:`Aprobar este plan`,githubLink:`Abrir enlace de GitHub ↗`,githubForm:`Abrir el formulario oficial de PAT de GitHub`,githubFormHelp:`Comprueba la cuenta activa, elige Only select repositories y selecciona este repositorio. GitHub gestiona el 2FA y crea el PAT.`,pasteHere:`Pega aquí el valor`,yourAnswer:`Tu respuesta`,hiddenAfter:`Oculto tras enviarlo`,typeAnswer:`Escribe tu respuesta`,secretHelp:`Se envía solo a este proceso local. No volverá a mostrarse ni se guardará en el almacenamiento del navegador.`,pairTitle:`Vincula este navegador`,pairLabel:`Código de vinculación de la terminal`,pairPlaceholder:`16 caracteres hexadecimales`,pairBody:`Busca el código de 16 caracteres en la terminal donde ejecutaste copilot setup --web. Introdúcelo para ver o controlar la sesión. No aparece en la URL ni se almacena al cerrar la página.`,pairHelp:`Mantén el código en privado. Tras actualizar la página, introdúcelo de nuevo para reconectar.`,pairButton:`Conectar a la configuración local`,privateSession:`SESIÓN LOCAL PRIVADA`,theme:`Tema de color`,themeAuto:`Sistema`,themeSystem:`Seguir tema del sistema`,themeLight:`Tema claro`,themeDark:`Tema oscuro`,selectOne:`Selecciona una opción`,ciRun:`Abrir ejecución de CI en GitHub ↗`,manualCheck:`¿No aparece el check? Introduce nombre|ID de App|workflow exactos, separados por punto y coma.`,checksObserved:`Se encontraron jobs recientes de CI. Abre cada ejecución y comprueba el job, la App y el paso obligatorio de cobertura antes de confiar en él.`,checksNoRecent:`No hay ejecuciones recientes de workflows de pull request. Ejecuta tu CI habitual en un PR real o introduce manualmente un productor exacto.`,checksNoVerifiable:`Hay ejecuciones recientes, pero ningún job pudo vincularse a un Check Run y una App concretos. Revisa GitHub o introduce el productor manualmente.`,checksDenied:`GitHub no permitió consultar los checks. Concede Actions: read y Checks: read al PAT de configuración, o introduce el productor manualmente.`,checksUnavailable:`No se pudo completar la consulta de CI. Esto no significa que el repositorio no tenga checks. Reintenta o introduce el productor manualmente.`,projectsObserved:`Estos Projects existentes pertenecen al dueño del repositorio. Selecciona solo los que deba actualizar la automatización.`,projectsEmpty:`Esta consulta limitada no devolvió Projects abiertos y accesibles; eso no demuestra que no existan. Comprueba el acceso o introduce un número verificado.`,projectsDenied:`GitHub no permitió consultar Projects. Comprueba Projects: read de la organización en el PAT o introduce los números manualmente.`,projectsUnavailable:`No se pudo consultar Projects. Eso no demuestra que no existan. Introduce un número verificado o reintenta.`,projectsUnsupported:`GitHub no permite listar Projects personales con un PAT de permisos precisos mediante esta API. Introduce el número de la URL de un Project existente.`,discoveryTruncated:`Solo se inspeccionó una muestra limitada de Projects accesibles o checks recientes. Usa la entrada manual si falta uno.`,checksDiscoveryScope:`Alcance: hasta 20 ejecuciones de PR entre las últimas 1.000 ejecuciones de workflows (hasta 10 páginas) de los últimos 90 días; se inspeccionan como máximo 15 ejecuciones y 100 checks por commit.`,projectsDiscoveryScope:`Alcance: hasta 30 Projects abiertos y accesibles de la organización en dos páginas; se inspeccionan hasta 100 campos por Project. Se excluyen los Projects cerrados.`,retryDiscovery:`Reintentar búsqueda en GitHub`,retryRemaining:`Quedan {count} reintentos de solo lectura. Tus respuestas se conservan.`,retryExhausted:`No quedan reintentos. Consulta GitHub e introduce manualmente lo que falte.`,observationTimeUnknown:`fecha de observación no disponible`,branchRequirementUnknown:`Obligatorio según la regla de rama: no comprobado`,branchRequirementObserved:`Obligatorio en {branch} por un ruleset activo para este check y esta App exactos.`,ciRule:`Abrir ruleset del check obligatorio ↗`,projectSharedStatus:`Todos los Projects elegidos deben compartir cada valor Status. Este setup no asigna valores diferentes por Project.`,fixedWorkflowEnabled:`Tu configuración fija features.{kind}=true. Mantén {kind} seleccionado; cambia --config o los flags si quieres modificarlo.`,fixedWorkflowDisabled:`Tu configuración fija features.{kind}=false. Deja {kind} sin seleccionar; cambia --config o los flags si quieres modificarlo.`,fixedIssuesRequired:`Tu configuración activa expresamente release o hotfix. Mantén Issues activado o cambia antes --config o los flags.`,projectSelectionNotObserved:`Se conservan los números de Project elegidos antes, aunque ya no figuren en esta consulta. Compruébalos en GitHub o quítalos.`,removeSelection:`Quitar selección`,projectTransitionIssueCreated:`Issue nuevo`,projectTransitionPullRequestCreated:`Pull request nuevo`,projectTransitionIssueInProgress:`Issue en curso`,projectTransitionPullRequestInProgress:`Pull request en curso`,projectUrl:`Abrir Project en GitHub ↗`,projectManual:`¿Falta un Project? Introduce su número positivo o URL exacta de GitHub. No se aceptan IDs PVT_.`,projectStatusUnavailable:`No se pudieron verificar las opciones Status de todos los Projects elegidos. Comprueba cada Project en GitHub e introduce el valor exacto.`,projectStatusIncompatible:`Los Projects elegidos no comparten valores Status. Elige Projects compatibles antes de continuar.`,producerName:`Nombre del check/job`,producerAppId:`ID de la App de GitHub`,producerWorkflow:`Nombre del workflow`,producerAdd:`Añadir check exacto`,producerRemove:`Quitar check`,producerManualHelp:`Usa la identidad exacta de GitHub. Añadirla no acredita que exija la cobertura.`,producerManualInvalid:`Indica nombre, ID numérico positivo de App y workflow. No uses | ni ; en los nombres. Se permiten comas.`,translationPreviewTitle:`Revisión de la traducción en curso`,translationPreviewBody:`Las preguntas propias de la configuración ya están traducidas. Algunos diagnósticos dinámicos de GitHub o del proveedor aún pueden aparecer en inglés mientras termina la revisión. Cambiar de idioma no modifica tus respuestas.`,unknownLocalError:`Se ha producido un error inesperado en la configuración local. Consulta la terminal y actualiza la página o reinicia la configuración.`},Wi={batchNextActions:`Prochaines étapes`,batchStatusReady:`Prêt à examiner`,batchStatusBlocked:`Action requise`,batchStatusApplying:`Application du plan validé`,batchStatusPartial:`Partiellement appliqué ; vérifier avant de réessayer`,batchStatusWaiting:`PR créée · en attente de fusion par un mainteneur`,batchStatusPending:`Configuration appliquée · vérification en attente`,batchStatusUnchanged:`Déjà conforme · inchangé`,batchStatusCancelled:`Travail en attente arrêté ; effets réalisés conservés`,batchConfigurationPreview:`Aperçu de la configuration, ajouté à la revue du lot. Les tests de permissions et l’installation attendent votre approbation du lot complet.`,batchUseConfiguration:`Utiliser cette configuration`,planReuseBody:`Approuvez les tests temporaires de permissions indiqués, puis la configuration revue sera appliquée. Les valeurs des Secrets existants sont conservées, sans être demandées ni remplacées. La vérification des capacités d’exécution peut rester en attente.`,organizationReuseTitle:`Réutilisation de la configuration existante`,organizationReuseBody:`{imported} paramètres compatibles importés. Conservation de {shared} Variables d’organisation et de {overrides} surcharges du dépôt ; écriture de {writes} Variables du dépôt. Les valeurs partagées et les Secrets existants restent inchangés.`,batchBranchReview:`Branche d’installation et base revue`,batchFocusTitle:`Dépôts sélectionnés`,batchFocusBody:`{count} dépôts sélectionnés explicitement dans cette organisation. Vérifiez chaque cible séparément.`,batchReviewTitle:`Examinez les plans de configuration`,batchProgressTitle:`Application des plans par dépôt`,batchResultTitle:`Résultats de configuration par dépôt`,batchProgressBody:`Application séquentielle des plans approuvés. Arrêter suspend le travail restant après la requête en cours ; les modifications et PR terminées sont conservées.`,batchReviewBody:`Approuvez uniquement les plans prêts ci-dessous. La configuration avance dans l’ordre, ajoute les accès validés sans remplacer les valeurs partagées et crée une PR par dépôt modifié. Elle ne fusionne pas, ne crée pas de tag, ne publie pas et ne déploie pas.`,batchResultBody:`Une PR de configuration nécessite encore une revue et une fusion par un mainteneur. La vérification des identifiants et capacités à l’exécution peut rester en attente. Les PR et accès réalisés sont conservés si un autre dépôt s’arrête.`,batchStopping:`Arrêt du travail en attente après la requête actuelle. Les changements réalisés seront conservés.`,batchReasonDrift:`La base validée ou sa propriété a changé. Inspectez le dépôt et examinez un nouveau plan.`,batchReasonProvider:`GitHub n’a pas confirmé la dernière étape. Une nouvelle tentative inspecte les effets existants avant de continuer.`,batchCleanupPending:`Le nettoyage du contrôle des permissions n’a pas pu être confirmé. Le travail restant est arrêté. Vérifiez l’historique GitHub et le journal local de récupération ; résolvez le nettoyage avant de démarrer une nouvelle configuration. Cette opération ne peut pas reprendre les écritures.`,batchReasonCancelled:`Le travail en attente s’est arrêté. Les changements réalisés ont été conservés.`,batchReasonPreflight:`Vérifiez l’accès, les identifiants requis et les réglages propres au dépôt avant de continuer.`,batchOpenPull:`Ouvrir la PR de configuration`,batchFilesCount:`{count} fichiers modifiés`,batchVariablesCount:`{count} changements de Variables du dépôt`,batchGrantsCount:`{count} ajouts d’accès pour ce dépôt`,batchRetainedSecrets:`Secrets existants conservés`,batchResourcesExplanation:`Les labels et Issue Types activés sont préparés séparément pour ce dépôt. Les valeurs des Secrets partagés et les accès des autres dépôts sont conservés.`,batchReviewFiles:`Inspecter les fichiers proposés`,batchDeleteFile:`Ce fichier géré par la configuration sera retiré de l’arbre d’installation ; inspectez sa sauvegarde conservée.`,batchRepositoryOverrides:`Examiner les noms des Variables du dépôt`,batchReviewedAccess:`Examiner les ajouts d’accès`,batchApplyPlans:`Appliquer les plans prêts`,batchLeavePreview:`Quitter sans appliquer`,batchStopPending:`Arrêter le travail en attente`,batchStopConfirm:`Arrêter le travail en attente après la requête actuelle ? Les PR, accès et changements réalisés seront conservés.`,batchRetryPending:`Inspecter et réessayer le travail inachevé`,batchFinish:`Terminer cette opération`,batchCleanup:`Supprimez les PAT temporaires de configuration dans GitHub après cette opération. Conservez le PAT du bot tant que les dépôts utilisent son Secret.`,batchTechnical:`Détails de l’opération`,batchLookupUnavailable:`GitHub n’a pas pu confirmer ce dépôt. Vérifiez son nom exact et l’accès du PAT.`,batchSelectionInvalid:`Vérifiez la sélection : choisissez 1 à 25 dépôts disponibles de cette organisation.`,batchAccessUnavailable:`L’accès n’est pas confirmé. Vérifiez le PAT temporaire ou retirez ce dépôt de la sélection.`,batchSelectionBody:`Choisissez 1 à 25 dépôts de {organization}. Seuls les dépôts sélectionnés seront configurés.`,batchDiscoveryUnavailable:`GitHub n’a pas pu lister les dépôts. Le dépôt actuel reste disponible ; cherchez un autre par son nom exact ou vérifiez l’accès du PAT.`,batchDiscoveryTruncated:`Cette vue a atteint la limite de 1 000 dépôts. Recherchez un nom exact pour ajouter un dépôt absent.`,batchFilter:`Filtrer les dépôts visibles`,batchSelectedCount:`{count} sélectionnés · maximum 25`,batchRepositories:`Dépôts`,batchPrivate:`Privé`,batchPublic:`Public`,batchCurrent:`Dépôt actuel`,batchArchived:`Archivé`,batchDisabled:`Désactivé`,batchReadOnly:`Accès en écriture indisponible`,batchNoMatches:`Aucun dépôt visible ne correspond au filtre.`,batchPrevious:`Précédent`,batchNext:`Suivant`,batchMissingRepository:`Un dépôt manque ?`,batchAccessExplanation:`La liste montre uniquement les dépôts visibles avec ce PAT. Une recherche par nom exact n’accorde aucun accès et ne sélectionne pas automatiquement le dépôt. Si vous remplacez le PAT temporaire, limitez-le aux dépôts à configurer.`,batchExactName:`Nom exact du dépôt dans cette organisation`,batchFindRepository:`Trouver le dépôt`,batchChangeAccess:`Changer l’accès du PAT temporaire`,batchReviewSelection:`Examiner les dépôts sélectionnés`,patStorageRetain:`Conservez le Secret PAT existant dans {destination}. Sa valeur n’est ni demandée, ni copiée, ni remplacée. S’il manque, créez-le séparément. La vérification de l’identité et des autorisations à l’exécution reste en attente.`,patStorageTitle:`Stockage du PAT du bot`,patRepositoryReplace:`Le Secret PAT existe déjà dans le dépôt {destination}. Il sera remplacé même si vous avez choisi de conserver les autres Secrets existants.`,patOrganizationReplace:`Le Secret PAT existe déjà dans l’organisation {destination}. Il sera remplacé même si vous avez choisi de conserver les autres Secrets existants.`,patRepositoryCreate:`Le PAT du bot sera enregistré comme Secret PAT dans le dépôt {destination}.`,patOrganizationCreate:`Le PAT du bot sera enregistré comme Secret PAT dans l’organisation {destination}.`,patReplacementChecks:`Le PAT du bot fourni doit réussir les vérifications d’identité, d’accès au dépôt et des autorisations requises avant l’écriture de ce Secret.`,patOrganizationImpact:`Remplacer ce Secret d’organisation peut affecter les autres dépôts qui l’utilisent. Les vérifications pour ce dépôt ne valident pas leurs exigences.`,repositorySecretSettings:`Ouvrir les Secrets Actions du dépôt`,botAccountWarning:`Vous devez ouvrir ce lien avec le compte bot sélectionné : @{account}.`,botAccountHelp:`Vérifiez le compte GitHub avant de générer le PAT. Utilisez une fenêtre privée ou changez de compte si le navigateur utilise le compte de l’opérateur de configuration.`,botGithubForm:`Créer le PAT du bot en tant que @{account}`,language:`Langue`,english:`Anglais`,spanish:`Espagnol`,setup:`CONFIGURATION`,connecting:`Connexion…`,localSession:`SESSION LOCALE`,progress:`Progression`,studio:`ASSISTANT DE CONFIGURATION`,journey:`VOTRE PARCOURS`,repository:`Dépôt`,choices:`Choix`,setupPat:`PAT de configuration`,plan:`Plan`,botPat:`PAT du bot et identifiants`,apply:`Appliquer`,localDesign:`Local par conception`,localDesignBody:`Cette page fonctionne sur votre ordinateur. GitHub crée les deux PAT dans ses propres onglets.`,preparing:`Préparation…`,completeTitle:`Configuration terminée.`,previewTitle:`Aperçu terminé.`,cancelledTitle:`Configuration annulée.`,blockedTitle:`Une intervention est nécessaire.`,gettingReady:`PRÉPARATION`,activeLede:`Une décision à la fois. Vos choix déterminent les droits, le plan et les identifiants nécessaires.`,resultLede:`Consultez le résultat et la prochaine étape ci-dessous. Le terminal fournit les détails techniques.`,readOnly:`Onglet en lecture seule`,readOnlyBody:`Un autre onglet contrôle cette session. Vous pouvez suivre la progression ou prendre le contrôle.`,takeOver:`Prendre le contrôle`,attention:`Action nécessaire`,checked:`Vérifié`,pleaseNote:`À noter`,progressUpdate:`Mise à jour`,reviewPass:`Révision des choix enregistrés — passage {pass}. C’est la même session, pas un redémarrage.`,cancelSetup:`Annuler`,cancelConfirm:`Annuler cette session locale ? Les PAT créés sur GitHub continueront d’exister.`,footerLocal:`LOCALHOST UNIQUEMENT`,footerCloud:`AUCUN COMPTE CLOUD`,footerGithub:`GITHUB ÉMET LES PAT`,currentDecision:`DÉCISION ACTUELLE`,session:`SESSION`,continue:`Continuer`,previousQuestion:`Question précédente`,questionProgress:`Question {current} sur {total} dans ce groupe · {overall} sur {all} au total`,yes:`Oui`,no:`Non`,permissionPreview:`APERÇU DES DROITS`,changeAnswersTitle:`Modifier vos réponses`,changeAnswersHelp:`Revenez à une section sans perdre les autres réponses. Le plan et les droits PAT requis seront vérifiés à nouveau.`,changeSection:`Modifier {section}`,editCapabilities:`Fonctionnalités`,editRuntimes:`Agents`,editModels:`Modèles des agents`,editRoleModels:`Modèles par tâche`,editRepository:`Comportement du dépôt`,editDeployment:`Releases et correctifs`,editBugbot:`Bugbot`,editApproval:`Approbation des PR`,editProjects:`Projects`,editProvisioning:`Provisionnement`,editStorage:`Secrets et Variables`,suggested:`Réponse suggérée : {answer}. Vous pourrez revoir vos choix avant de créer le PAT.`,none:`aucune`,sourceGithub:`Observé dans les métadonnées authentifiées de ce dépôt GitHub.`,sourceConfig:`Fourni par votre configuration ; GitHub ne l’a pas remplacé.`,sourceDefault:`Valeur par défaut du produit ; non vérifiée dans ce dépôt.`,sourceLocal:`Observé dans ce dossier local ; vérifiez que cette branche existe sur GitHub avant d’appliquer les changements.`,whyMatters:`Pourquoi c’est important`,whenApplies:`Quand cela s’applique`,whereConfigured:`Où se fait le réglage`,howToChoose:`Comment choisir`,whyRecommendation:`Pourquoi c’est important`,example:`Exemple`,effect:`Ce qui change`,verify:`Comment vérifier`,learnMore:`Lire la documentation de ce réglage`,resultApplied:`Configuration appliquée`,resultNoChanges:`Aucun changement effectué`,resultStopped:`Aucun changement commencé`,resultPartial:`Vérifiez les changements partiels`,resultCompleteBody:`Le PAT temporaire n’est pas révoqué automatiquement. Supprimez-le sur GitHub après vérification. Gardez le PAT du bot jusqu’à rotation du Secret.`,resultPartialBody:`Un Secret ou une autre ressource a peut-être été modifié. Vérifiez GitHub et exécutez copilot doctor --read-only avant de remplacer ou supprimer un PAT.`,resultNoChangesBody:`Copilot n’a pas commencé à appliquer la configuration. Des tests temporaires de permissions ont pu s’exécuter ; GitHub peut conserver l’historique Actions, Issues ou PR après leur nettoyage. Les PAT créés restent actifs jusqu’à leur suppression.`,whatHappened:`Ce qui s’est passé`,alreadyChanged:`Déjà modifié`,noChanges:`Aucun changement du dépôt ou de GitHub n’a commencé pendant cette session.`,nextAction:`Prochaine étape`,reasonPermissions:`Les droits nécessaires du PAT de configuration manquent ou n’ont pas pu être confirmés.`,nextPermissions:`Vérifiez les droits affichés, corrigez le PAT sur GitHub, puis recommencez.`,reasonWorkflowPermissions:`Le PAT du bot n’a pas terminé toutes les vérifications de droits. Consultez le droit concerné et les prérequis de préparation ou de nettoyage ci-dessous.`,permissionReportTitle:`Vérification des droits du PAT`,permissionReportLead:`Les droits requis qui n’ont pas pu être confirmés sont indiqués ci-dessous. « Non vérifiable » ne signifie pas « absent ».`,updatedSetupPatTitle:`Corrigez le PAT de configuration`,updatedSetupPatBody:`Ce lien GitHub inclut les droits requis pour cette configuration. Sélectionnez ce dépôt avant de créer le PAT. Fermez cette session locale, puis recommencez la configuration avec le PAT corrigé.`,updatedSetupPatGrants:`Droits supplémentaires détectés après inspection`,updatedSetupPatLink:`Créer un PAT de configuration corrigé`,permissionProbeCleanupPending:`Une ressource temporaire de vérification peut encore exister. La configuration est arrêtée ; ne supposez pas que le nettoyage a réussi.`,permissionProbeCleanupAction:`Réessayez avec un PAT capable de la supprimer. Le journal local de récupération est consulté avant tout nouveau test.`,permissionSecretCollision:`GitHub a indiqué qu’un Secret portant le nom de test aléatoire a été mis à jour. Une valeur créée simultanément peut avoir changé. La configuration s’est arrêtée sans le supprimer.`,permissionSecretCollisionAction:`Consultez l’historique des Secrets GitHub et restaurez toute valeur concernée avant de réessayer. Le journal local ne peut pas corriger cette collision.`,permissionIdentity:`Identité GitHub et accès au dépôt`,permissionIdentityValid:`Vérifiés`,permissionIdentityInvalid:`Refusés`,permissionIdentityUnknown:`Non confirmés`,permissionGrantNotChecked:`Non vérifié`,permissionReportNoFailedGrant:`Cette vérification n’a trouvé aucun droit requis en échec. Vérifiez le compte prévu pour le PAT et l’erreur du terminal avant de réessayer.`,reasonStorage:`Le stockage GitHub Actions choisi ne peut pas être utilisé en sécurité.`,nextStorage:`Vérifiez la portée des Variables/Secrets et les ressources existantes, puis réessayez.`,reasonConfiguration:`La configuration choisie n’a pas pu être validée.`,nextConfiguration:`Lisez les détails du terminal, corrigez les choix et réessayez.`,reasonExpired:`La session locale a expiré.`,nextExpired:`Démarrez une nouvelle session ; l’ancienne approbation ne peut pas être réutilisée.`,reasonCancelled:`La configuration a été annulée.`,nextCancelled:`Démarrez une nouvelle session si vous souhaitez encore configurer ce dépôt.`,reasonUnknown:`La configuration s’est arrêtée. Le navigateur n’a pas pu déterminer la cause exacte. Consultez le reçu des ressources, s’il est disponible, et le terminal.`,nextUnknown:`Consultez la dernière erreur du terminal avant de réessayer. Ne supposez pas qu’un PAT a été révoqué.`,reasonProvider:`GitHub ou un autre fournisseur n’a pas terminé l’opération demandée.`,nextProvider:`Utilisez la référence de diagnostic pour consulter le terminal, vérifiez la disponibilité et les accès, puis examinez tout changement partiel avant de réessayer.`,reasonRateLimit:`GitHub a temporairement limité les requêtes nécessaires à la configuration.`,nextRateLimit:`Attendez la réinitialisation de la limite. Examinez les changements effectués avant de recommencer.`,diagnosticReference:`Référence de diagnostic`,resourceReceipt:`Reçu des opérations de configuration`,effectCompleted:`Signalée comme terminée`,effectSkipped:`Signalée comme ignorée`,effectInspect:`Résultat à vérifier`,effectNotStarted:`Non commencée`,effectInProgress:`En cours ; résultat non encore confirmé`,scopeLocal:`Dossier local`,scopeMixed:`Dépôt et organisation`,receiptFiles:`Fichiers de configuration`,receiptSecrets:`Secrets GitHub Actions`,receiptLabels:`Étiquettes des tickets`,receiptIssueTypes:`Types de ticket`,receiptVariables:`Variables GitHub Actions`,receiptInitialTag:`Première étiquette de version`,inspectPartial:`Des changements peuvent déjà être actifs. Vérifiez GitHub et le terminal avant de réessayer.`,patSettings:`Ouvrir les paramètres PAT GitHub ↗`,closeSession:`Fermer la session locale`,sessionClosed:`Session locale fermée`,sessionClosedBody:`Le serveur local a accepté la demande de fermeture. Cette page ne le contacte plus et conserve le résultat. Fermer la session ne révoque aucun PAT créé dans GitHub.`,doctorHelp:`Après la configuration, vérifiez ici les ressources installées sans déclencher d’Actions. Vous pouvez aussi exécuter copilot doctor --read-only à la racine du dépôt avec le PAT temporaire et le même fichier --config non secret, le cas échéant.`,doctorRun:`Vérifier l’installation (lecture seule)`,doctorRunning:`Vérification des ressources installées sans déclencher d’Actions…`,doctorPassed:`La vérification en lecture seule n’a trouvé aucun échec.`,doctorWarnings:`La vérification en lecture seule demande une attention particulière.`,doctorFailed:`La vérification en lecture seule ne s’est pas terminée. Consultez le terminal ou exécutez la commande ci-dessous.`,doctorCounts:`{pass} réussis · {warn} avertissements · {fail} échecs · {skipped} ignorés.`,doctorSecretLimit:`Ce mode ne peut pas vérifier les valeurs des Secrets.`,botRenewal:`Le PAT du bot reste dans le secret GitHub Actions choisi pour les futures exécutions. Sa date d’expiration réelle n’est pas vérifiée ici ; notez-la sur GitHub et remplacez le secret avant cette date.`,working:`Préparation de l’étape suivante`,workingBody:`Le processus local vérifie vos réponses. Gardez cette page ouverte.`,repoFocus:`Dépôt concerné`,repoFocusBody:`Cette configuration concerne le dépôt indiqué. Les Secrets et Variables d’organisation peuvent être partagés avec d’autres dépôts.`,access:`accès`,readOnlyCheck:`Vérification des capacités`,provisionalGrants:`Droits provisoires minimaux`,conditionalGrants:`Les droits conditionnels dépendent de vos choix et de GitHub. Un contrôle final précède toute modification.`,permissionEvidenceVerified:`Une lecture GitHub a confirmé cet accès.`,permissionEvidenceVerifiedWrite:`Une ressource temporaire a été créée, lue et supprimée.`,permissionEvidencePrivateProject:`Un Project non public de l’organisation a confirmé l’accès Projects en lecture.`,permissionEvidenceMissing:`GitHub a refusé l’accès requis. Vérifiez les paramètres du PAT.`,permissionEvidenceWrite:`La vérification temporaire en écriture n’a pas abouti. Examinez l’étape échouée puis réessayez.`,permissionEvidencePublic:`La lecture a réussi, mais cette ressource publique ne prouve pas à elle seule le droit du PAT.`,permissionEvidencePublicProjects:`La lecture des Projects a réussi, même avec une liste vide. L’accès aux Projects privés est vérifié lors de leur sélection.`,permissionEvidenceUnknownRead:`Le contrôle en lecture n’est pas concluant. Consultez le détail dans le terminal et réessayez si nécessaire.`,permissionUnknown:`Ce droit exige une vérification. Consultez le droit exact et son explication technique dans le terminal avant de continuer.`,permissionsFollow:`Les droits suivent vos choix`,permissionsFollowBody:`Les droits exacts sont affichés avant chaque PAT. Ouvrir cette page ne crée rien.`,files:`Fichiers`,workflows:`Workflows`,variables:`Variables`,secretNames:`Noms des Secrets`,planBody:`Vérifiez précisément ce qui pourrait changer. Après approbation, des ressources temporaires testent les droits d’écriture du PAT, puis le PAT du bot et les autres identifiants sont demandés. GitHub peut conserver des exécutions, l’historique des Issues ou PR et des notifications.`,planPermissionProbeTitle:`Tests temporaires des permissions après approbation`,planPermissionProbeBody:`Chaque permission indiquée crée, lit puis supprime sa propre ressource temporaire. Le test Issues crée une Issue visible ; si GitHub refuse sa suppression, la configuration la ferme, indique son numéro et s’arrête. Actions, Issues et Pull requests peuvent laisser un historique ou des notifications.`,planActionsProbePrerequisites:`Le test Actions nécessite Contents Write pour créer sa branche isolée. Si le workflow de santé empaqueté exact est indisponible sur la branche par défaut, il nécessite aussi Workflows Write pour préparer une version dont les jobs sont désactivés. Pour le bot, le PAT de configuration prépare et nettoie la ressource ; le PAT du bot déclenche et lit son exécution. Un prérequis bloqué ne prouve pas qu’Actions manque.`,planSecretProbeLimit:`GitHub ne propose qu’une opération de création ou mise à jour pour les Secrets. Le contrôle utilise un nom aléatoire privé et vérifie d’abord son absence, mais GitHub ne garantit pas une création atomique. S’il signale une mise à jour, la configuration s’arrête et vous demande de consulter l’historique du Secret.`,planChoices:`Vos décisions principales`,planEnabledCapabilities:`Fonctionnalités activées`,planBranchRoles:`Branche de production / développement`,planApprovalMode:`Approbation des pull requests`,planVariableScope:`Portée des variables`,planSecretScope:`Portée des secrets`,planInitialTag:`Créer la première étiquette`,planAgentRouting:`Agent et modèle par tâche`,planIssueWorkflows:`Workflows de tickets`,planTrustedChecks:`Producteurs CI de confiance`,planCoverage:`Preuve de couverture`,planProjectStatuses:`Transitions Status des Projects`,planIssueResources:`Étiquettes et types de ticket`,planIssueResourcesValue:`Vérifiés ou créés lors de l’application`,planProducerAttested:`Identité CI et étape obligatoire vérifiées par vous`,planCoverageThreshold:`Couverture minimale des lignes modifiées`,planCoverageReporter:`Workflow publiant l’artefact`,planReporterAttested:`Producteur du rapport de couverture vérifié par vous`,planAdvancedDefaults:`Le plan comprend aussi les valeurs par défaut des réglages non modifiés. Utilisez Modifier ci-dessous pour examiner une section avant de valider.`,planUnknownWarning:`Un avertissement supplémentaire du plan ne peut pas être affiché ici. Lisez-le dans le terminal avant de valider.`,planBasicDefaultsIntro:`Le parcours de base a conservé ces réglages avancés. Ouvrez une section ci-dessous pour les vérifier ou les modifier :`,scopeRepository:`Dépôt`,scopeOrganization:`Organisation`,scopeDisabled:`Non provisionné`,approvalOff:`Désactivée`,approvalRecommend:`Recommandation uniquement`,approvalGuarded:`Approbation protégée`,beforeContinue:`Avant de continuer`,stopHere:`Arrêter ici`,approvePlan:`Approuver ce plan`,githubLink:`Ouvrir le lien GitHub ↗`,githubForm:`Ouvrir le formulaire PAT officiel de GitHub`,githubFormHelp:`Vérifiez le compte connecté, choisissez Only select repositories et ce dépôt. GitHub gère la 2FA et crée le PAT.`,pasteHere:`Collez la valeur ici`,yourAnswer:`Votre réponse`,hiddenAfter:`Masquée après envoi`,typeAnswer:`Saisissez votre réponse`,secretHelp:`Envoyé uniquement au processus local. Ni réaffiché ni enregistré dans le navigateur.`,pairTitle:`Associer ce navigateur`,pairLabel:`Code du terminal`,pairPlaceholder:`16 caractères hexadécimaux`,pairBody:`Trouvez le code à 16 caractères dans le terminal qui a lancé copilot setup --web. Il ne figure pas dans l’URL et n’est pas conservé après fermeture.`,pairHelp:`Gardez ce code secret. Après actualisation, saisissez-le de nouveau.`,pairButton:`Se connecter à la configuration locale`,privateSession:`SESSION LOCALE PRIVÉE`,theme:`Thème`,themeAuto:`Auto`,themeSystem:`Suivre le système`,themeLight:`Thème clair`,themeDark:`Thème sombre`,selectOne:`Choisissez une option`,ciRun:`Voir l’exécution CI sur GitHub ↗`,manualCheck:`Check absent ? Saisissez nom|ID App|workflow exacts, séparés par des points-virgules.`,checksObserved:`Des jobs CI récents ont été trouvés. Ouvrez chaque exécution et vérifiez le job, l’App et l’étape obligatoire de couverture avant de lui faire confiance.`,checksNoRecent:`Aucune exécution récente de workflow de pull request. Lancez le CI habituel sur une vraie PR ou saisissez un producteur exact.`,checksNoVerifiable:`Des exécutions récentes existent, mais aucun job ne correspond à une identité exacte de Check Run et d’App. Vérifiez GitHub ou saisissez-la.`,checksDenied:`GitHub a refusé la découverte CI. Accordez Actions: read et Checks: read au PAT de configuration, ou saisissez un producteur exact.`,checksUnavailable:`La découverte CI a échoué. Cela ne prouve pas l’absence de checks. Réessayez ou saisissez un producteur exact.`,projectsObserved:`Ces Projects existants appartiennent au propriétaire du dépôt. Ne choisissez que ceux que l’automatisation doit modifier.`,projectsEmpty:`Cette requête GitHub limitée n’a renvoyé aucun Project ouvert et accessible ; elle ne prouve pas leur absence. Vérifiez l’accès ou saisissez un numéro vérifié.`,projectsDenied:`GitHub a refusé la découverte des Projects. Vérifiez Projects: read au niveau organisation sur le PAT, ou saisissez les numéros.`,projectsUnavailable:`La découverte des Projects a échoué. Cela ne prouve pas leur absence. Saisissez un numéro vérifié ou réessayez.`,projectsUnsupported:`Cette API GitHub ne liste pas les Projects personnels avec un PAT à permissions fines. Saisissez le numéro figurant dans l’URL.`,discoveryTruncated:`Seul un échantillon limité de Projects accessibles ou checks récents a été inspecté. Saisissez manuellement un élément absent.`,checksDiscoveryScope:`Périmètre : jusqu’à 20 exécutions de PR parmi les 1 000 dernières exécutions de workflows (jusqu’à 10 pages) des 90 derniers jours ; au plus 15 exécutions et 100 checks par commit sont inspectés.`,projectsDiscoveryScope:`Périmètre : au plus 30 Projects ouverts et accessibles de l’organisation sur deux pages ; jusqu’à 100 champs sont inspectés par Project. Les Projects fermés sont exclus.`,retryDiscovery:`Relancer la recherche GitHub`,retryRemaining:`Il reste {count} essais en lecture seule. Vos réponses sont conservées.`,retryExhausted:`Plus aucun essai disponible. Vérifiez GitHub et saisissez manuellement tout élément manquant.`,observationTimeUnknown:`date d’observation indisponible`,branchRequirementUnknown:`Exigé par la règle de branche : non vérifié`,branchRequirementObserved:`Exigé sur {branch} par un ruleset actif pour ce contrôle et cette application précis.`,ciRule:`Ouvrir le ruleset du contrôle obligatoire ↗`,projectSharedStatus:`Tous les Projects choisis doivent partager chaque valeur Status. Cette configuration ne définit pas de valeurs différentes par Project.`,fixedWorkflowEnabled:`Votre configuration fixe features.{kind}=true. Gardez {kind} sélectionné ; modifiez --config ou les options pour changer ce choix.`,fixedWorkflowDisabled:`Votre configuration fixe features.{kind}=false. Ne sélectionnez pas {kind} ; modifiez --config ou les options pour changer ce choix.`,fixedIssuesRequired:`Votre configuration active explicitement release ou hotfix. Gardez Issues activé ou modifiez d’abord --config ou les options.`,projectSelectionNotObserved:`Les numéros de Projects choisis auparavant sont conservés, mais n’apparaissent plus dans ce résultat GitHub. Vérifiez-les sur GitHub ou retirez-les.`,removeSelection:`Retirer la sélection`,projectTransitionIssueCreated:`Nouveau ticket`,projectTransitionPullRequestCreated:`Nouvelle pull request`,projectTransitionIssueInProgress:`Ticket en cours`,projectTransitionPullRequestInProgress:`Pull request en cours`,projectUrl:`Ouvrir le Project sur GitHub ↗`,projectManual:`Project absent ? Saisissez son numéro positif ou son URL GitHub exacte. Les ID PVT_ sont refusés.`,projectStatusUnavailable:`Les options Status n’ont pas pu être vérifiées pour tous les Projects. Vérifiez-les sur GitHub et saisissez la valeur exacte.`,projectStatusIncompatible:`Les Projects choisis ne partagent aucun Status. Choisissez des Projects compatibles avant de continuer.`,producerName:`Nom du check/job`,producerAppId:`ID de l’App GitHub source`,producerWorkflow:`Nom du workflow`,producerAdd:`Ajouter le check exact`,producerRemove:`Retirer le check`,producerManualHelp:`Utilisez l’identité exacte affichée sur GitHub. L’ajouter ne prouve pas que la couverture est imposée.`,producerManualInvalid:`Indiquez le nom, un ID numérique positif d’App et le workflow. N’utilisez ni | ni ; dans les noms. Les virgules sont autorisées.`,translationPreviewTitle:`Révision de la traduction en cours`,translationPreviewBody:`Les questions propres à la configuration sont traduites. Certains diagnostics dynamiques de GitHub ou du fournisseur peuvent encore apparaître en anglais pendant la révision. Changer de langue ne modifie pas vos réponses.`,unknownLocalError:`Une erreur inattendue est survenue pendant la configuration locale. Consultez le terminal, puis actualisez la page ou relancez la configuration.`},Gi={batchNextActions:`Próximos passos`,batchStatusReady:`Pronto para revisão`,batchStatusBlocked:`Requer uma ação`,batchStatusApplying:`A aplicar o plano revisto`,batchStatusPartial:`Aplicado parcialmente; reveja antes de tentar novamente`,batchStatusWaiting:`PR criada · aguarda integração por um responsável`,batchStatusPending:`Configuração aplicada · verificação pendente`,batchStatusUnchanged:`Já corresponde · sem alterações`,batchStatusCancelled:`Trabalho pendente interrompido; alterações concluídas mantidas`,batchConfigurationPreview:`Prévia da configuração, adicionada à revisão do lote. Os testes de permissões e a instalação aguardam a aprovação do lote completo.`,batchUseConfiguration:`Usar esta configuração`,planReuseBody:`Aprove os testes temporários de permissões indicados; em seguida, aplica-se o setup revisto. Os valores dos Secrets existentes são preservados, sem serem pedidos ou substituídos. A verificação de permissões em execução pode ficar pendente.`,organizationReuseTitle:`Reutilizar a configuração existente`,organizationReuseBody:`{imported} definições compatíveis importadas. Preservam-se {shared} Variables da organização e {overrides} substituições do repositório; escrevem-se {writes} Variables no repositório. Os valores partilhados e os Secrets existentes são preservados.`,batchBranchReview:`Ramo de instalação e base revista`,batchFocusTitle:`Repositórios selecionados`,batchFocusBody:`{count} repositórios selecionados explicitamente nesta organização. Reveja cada destino separadamente.`,batchReviewTitle:`Reveja os planos de configuração`,batchProgressTitle:`A aplicar os planos por repositório`,batchResultTitle:`Resultados da configuração por repositório`,batchProgressBody:`Aplicam-se os planos aprovados por ordem. Parar suspende o trabalho pendente após o pedido atual; as alterações e PRs concluídas são preservadas.`,batchReviewBody:`Aprove apenas os planos prontos abaixo. A configuração avança por ordem, adiciona o acesso revisto sem substituir valores partilhados e cria uma PR por repositório alterado. Não integra, cria tags, publica versões nem implementa.`,batchResultBody:`Uma PR de configuração ainda precisa de revisão e integração por um responsável. A verificação de credenciais e permissões em execução pode ficar pendente. As PRs e os acessos concluídos mantêm-se se outro destino parar.`,batchStopping:`A interromper o trabalho pendente após o pedido atual. As alterações concluídas serão mantidas.`,batchReasonDrift:`A base revista ou a sua titularidade mudou. Inspecione o repositório e reveja um novo plano.`,batchReasonProvider:`O GitHub não confirmou o último passo. Uma nova tentativa inspeciona os efeitos existentes antes de continuar.`,batchCleanupPending:`Não foi possível confirmar a limpeza da verificação de permissões. O trabalho pendente foi interrompido. Verifique o histórico do GitHub e o registro local de recuperação; resolva a limpeza antes de iniciar uma nova configuração. Esta operação não pode retomar gravações.`,batchReasonCancelled:`O trabalho pendente parou. As alterações concluídas foram mantidas.`,batchReasonPreflight:`Reveja o acesso, as credenciais necessárias e os ajustes específicos do repositório antes de continuar.`,batchOpenPull:`Abrir PR de configuração`,batchFilesCount:`{count} ficheiros alterados`,batchVariablesCount:`{count} alterações de Variables do repositório`,batchGrantsCount:`{count} acessos a adicionar para este repositório`,batchRetainedSecrets:`Secrets existentes mantidos`,batchResourcesExplanation:`Os labels e Issue Types ativados são preparados separadamente para este destino. Os valores dos Secrets partilhados e os acessos dos outros repositórios são mantidos.`,batchReviewFiles:`Inspecionar ficheiros propostos`,batchDeleteFile:`Este ficheiro gerido pela configuração será removido da árvore de instalação; inspecione a cópia mantida.`,batchRepositoryOverrides:`Rever os nomes das Variables do repositório`,batchReviewedAccess:`Rever os acessos a adicionar`,batchApplyPlans:`Aplicar planos prontos`,batchLeavePreview:`Sair sem aplicar`,batchStopPending:`Interromper trabalho pendente`,batchStopConfirm:`Interromper o trabalho pendente após o pedido atual? As PRs, os acessos e as alterações concluídas serão mantidos.`,batchRetryPending:`Inspecionar e repetir o trabalho pendente`,batchFinish:`Concluir esta operação`,batchCleanup:`Elimine os PATs temporários de configuração no GitHub após esta operação. Mantenha o PAT do bot enquanto os repositórios consumirem o seu Secret.`,batchTechnical:`Detalhes da operação`,batchLookupUnavailable:`O GitHub não conseguiu confirmar esse repositório. Verifique o nome exato e o acesso do PAT.`,batchSelectionInvalid:`Reveja a seleção: escolha entre 1 e 25 repositórios disponíveis desta organização.`,batchAccessUnavailable:`O acesso não está confirmado. Reveja o PAT temporário ou remova este repositório da seleção.`,batchSelectionBody:`Escolha entre 1 e 25 repositórios de {organization}. Apenas os selecionados serão configurados.`,batchDiscoveryUnavailable:`O GitHub não conseguiu listar os repositórios. O atual continua disponível; procure outro pelo nome exato ou reveja o acesso do PAT.`,batchDiscoveryTruncated:`Esta vista atingiu o limite de 1.000 repositórios. Procure pelo nome exato para adicionar um destino em falta.`,batchFilter:`Filtrar repositórios visíveis`,batchSelectedCount:`{count} selecionados · máximo 25`,batchRepositories:`Repositórios`,batchPrivate:`Privado`,batchPublic:`Público`,batchCurrent:`Repositório atual`,batchArchived:`Arquivado`,batchDisabled:`Desativado`,batchReadOnly:`Sem acesso de escrita`,batchNoMatches:`Nenhum repositório visível corresponde ao filtro.`,batchPrevious:`Anterior`,batchNext:`Seguinte`,batchMissingRepository:`Não encontra um repositório?`,batchAccessExplanation:`A lista mostra apenas os repositórios visíveis para este PAT. A pesquisa por nome exato não concede acesso nem seleciona o repositório automaticamente. Se substituir o PAT temporário, limite-o aos repositórios que pretende configurar.`,batchExactName:`Nome exato do repositório nesta organização`,batchFindRepository:`Procurar repositório`,batchChangeAccess:`Alterar o acesso do PAT temporário`,batchReviewSelection:`Rever repositórios selecionados`,patStorageRetain:`Mantém-se o Secret PAT existente em {destination}. O seu valor não é pedido, copiado nem substituído. Se faltar, deve ser criado em separado. A verificação da identidade e das permissões em execução fica pendente.`,patStorageTitle:`Armazenamento do PAT do bot`,patRepositoryReplace:`O Secret PAT já existe no repositório {destination}. Será substituído mesmo que tenha escolhido preservar os outros Secrets existentes.`,patOrganizationReplace:`O Secret PAT já existe na organização {destination}. Será substituído mesmo que tenha escolhido preservar os outros Secrets existentes.`,patRepositoryCreate:`O PAT do bot será guardado como Secret PAT no repositório {destination}.`,patOrganizationCreate:`O PAT do bot será guardado como Secret PAT na organização {destination}.`,patReplacementChecks:`O PAT do bot fornecido tem de passar as verificações de identidade, acesso ao repositório e permissões necessárias antes de escrever este Secret.`,patOrganizationImpact:`Substituir este Secret da organização pode afetar outros repositórios que o utilizam. As verificações deste repositório não validam os requisitos dos restantes.`,repositorySecretSettings:`Abrir os Secrets Actions do repositório`,botAccountWarning:`Deve abrir este link com a conta de bot selecionada: @{account}.`,botAccountHelp:`Confirme a conta do GitHub antes de gerar o PAT. Use uma janela privada ou mude de conta se o navegador tiver a sessão do operador da configuração.`,botGithubForm:`Criar PAT do bot como @{account}`,language:`Idioma`,english:`Inglês`,spanish:`Espanhol`,setup:`CONFIGURAÇÃO`,connecting:`A ligar…`,localSession:`SESSÃO LOCAL`,progress:`Progresso`,studio:`ASSISTENTE DE CONFIGURAÇÃO`,journey:`O SEU PERCURSO`,repository:`Repositório`,choices:`Opções`,setupPat:`PAT de configuração`,plan:`Plano`,botPat:`PAT do bot e credenciais`,apply:`Aplicar`,localDesign:`Local por conceção`,localDesignBody:`Esta página funciona no seu computador. O GitHub cria ambos os PAT nos seus próprios separadores.`,preparing:`A preparar a configuração…`,completeTitle:`Configuração concluída.`,previewTitle:`Pré-visualização concluída.`,cancelledTitle:`Configuração cancelada.`,blockedTitle:`A configuração requer atenção.`,gettingReady:`A PREPARAR`,activeLede:`Uma decisão de cada vez. As suas escolhas determinam permissões, plano e credenciais.`,resultLede:`Consulte abaixo o resultado e o próximo passo. O terminal contém mais detalhes técnicos.`,readOnly:`Separador só de leitura`,readOnlyBody:`Outro separador controla esta sessão. Pode acompanhar o progresso ou assumir o controlo.`,takeOver:`Assumir o controlo`,attention:`Requer atenção`,checked:`Verificado`,pleaseNote:`Atenção`,progressUpdate:`Atualização de progresso`,reviewPass:`A rever as escolhas guardadas — passagem {pass}. É a mesma execução, não um reinício.`,cancelSetup:`Cancelar configuração`,cancelConfirm:`Cancelar esta sessão local? Os PAT já criados no GitHub continuarão a existir.`,footerLocal:`APENAS LOCALHOST`,footerCloud:`SEM CONTA DE CONFIGURAÇÃO NA NUVEM`,footerGithub:`O GITHUB EMITE OS PAT`,currentDecision:`DECISÃO ATUAL`,session:`SESSÃO`,continue:`Continuar`,previousQuestion:`Pergunta anterior`,questionProgress:`Pergunta {current} de {total} neste grupo · {overall} de {all} no total`,yes:`Sim`,no:`Não`,permissionPreview:`PRÉ-VISUALIZAÇÃO DAS PERMISSÕES`,changeAnswersTitle:`Alterar respostas`,changeAnswersHelp:`Volte a uma secção sem perder as outras respostas. O plano e as permissões PAT necessárias serão verificados de novo.`,changeSection:`Alterar {section}`,editCapabilities:`Funcionalidades`,editRuntimes:`Agentes`,editModels:`Modelos dos agentes`,editRoleModels:`Modelos por tarefa`,editRepository:`Comportamento do repositório`,editDeployment:`Releases e correções`,editBugbot:`Bugbot`,editApproval:`Aprovação de PR`,editProjects:`Projects`,editProvisioning:`Provisionamento`,editStorage:`Secrets e Variables`,suggested:`Resposta sugerida: {answer}. Pode rever as opções antes de criar o PAT.`,none:`nenhuma`,sourceGithub:`Observado nos metadados autenticados deste repositório no GitHub.`,sourceConfig:`Fornecido pela sua configuração; o GitHub não o substituiu.`,sourceDefault:`Valor predefinido do produto; não verificado neste repositório.`,sourceLocal:`Observado neste checkout local; confirme que o ramo existe no GitHub antes de aplicar alterações.`,whyMatters:`Porque importa`,whenApplies:`Quando se aplica`,whereConfigured:`Onde se configura`,howToChoose:`Como escolher`,whyRecommendation:`Porque importa`,example:`Exemplo`,effect:`O que muda`,verify:`Como verificar`,learnMore:`Ler a documentação desta opção`,resultApplied:`A configuração foi aplicada`,resultNoChanges:`Nenhuma alteração efetuada`,resultStopped:`Nenhuma alteração iniciada`,resultPartial:`Verifique as alterações parciais`,resultCompleteBody:`O PAT temporário não é revogado automaticamente. Elimine-o no GitHub após verificar. Guarde o PAT do bot até rodar o Secret.`,resultPartialBody:`Um Secret ou outro recurso pode ter sido alterado. Verifique o GitHub e execute copilot doctor --read-only antes de substituir ou eliminar o PAT.`,resultNoChangesBody:`O Copilot não começou a aplicar alterações. Podem ter ocorrido testes temporários de permissões; o GitHub pode conservar o histórico de Actions, Issues ou PR após a limpeza. Os PAT criados permanecem até serem eliminados.`,whatHappened:`O que aconteceu`,alreadyChanged:`O que mudou`,noChanges:`Não foram iniciadas alterações no repositório nem no GitHub nesta sessão.`,nextAction:`Próximo passo`,reasonPermissions:`Faltam permissões do PAT de configuração ou não foi possível confirmá-las.`,nextPermissions:`Verifique as permissões, corrija o PAT no GitHub e inicie uma nova sessão.`,reasonWorkflowPermissions:`O PAT do bot não concluiu todas as verificações de permissões. Verifique a permissão que falhou e os requisitos de preparação ou limpeza abaixo.`,permissionReportTitle:`Verificação das permissões do PAT`,permissionReportLead:`As permissões obrigatórias que não puderam ser confirmadas aparecem abaixo. «Não verificável» não significa «ausente».`,updatedSetupPatTitle:`Corrija o PAT de configuração`,updatedSetupPatBody:`Esta ligação do GitHub inclui as permissões necessárias para esta configuração. Selecione este repositório antes de criar o PAT. Feche esta sessão local e inicie uma nova configuração com o PAT corrigido.`,updatedSetupPatGrants:`Permissões adicionais detetadas após a inspeção`,updatedSetupPatLink:`Criar PAT de configuração corrigido`,permissionProbeCleanupPending:`Pode ainda existir um recurso temporário de verificação de permissões. O setup parou; não presuma que foi removido.`,permissionProbeCleanupAction:`Tente novamente com um PAT que o possa remover. O registo local de recuperação é verificado antes de novos testes.`,permissionSecretCollision:`O GitHub indicou que um Secret com o nome aleatório de teste foi atualizado. Um valor criado em simultâneo pode ter mudado. A configuração parou sem o eliminar.`,permissionSecretCollisionAction:`Consulte o histórico de Secrets do GitHub e reponha qualquer valor afetado antes de tentar novamente. O registo local não pode corrigir esta colisão.`,permissionIdentity:`Identidade GitHub e acesso ao repositório`,permissionIdentityValid:`Verificados`,permissionIdentityInvalid:`Recusados`,permissionIdentityUnknown:`Não confirmados`,permissionGrantNotChecked:`Não verificada`,permissionReportNoFailedGrant:`Esta verificação não encontrou uma permissão obrigatória em falta. Confirme a conta prevista para o PAT e o erro no terminal antes de tentar novamente.`,reasonStorage:`O armazenamento GitHub Actions escolhido não pôde ser usado com segurança.`,nextStorage:`Verifique o âmbito das Variables/Secrets e os recursos existentes; depois tente novamente.`,reasonConfiguration:`Não foi possível validar a configuração escolhida.`,nextConfiguration:`Leia os detalhes no terminal, corrija as opções e tente novamente.`,reasonExpired:`A sessão local expirou.`,nextExpired:`Inicie uma nova sessão; a aprovação anterior não pode ser reutilizada.`,reasonCancelled:`A configuração foi cancelada.`,nextCancelled:`Inicie outra execução se ainda quiser configurar o repositório.`,reasonUnknown:`A configuração parou. O navegador não conseguiu determinar a causa exata. Consulte o recibo de recursos, se estiver disponível, e o terminal.`,nextUnknown:`Leia o último erro no terminal antes de tentar novamente. Não presuma que um PAT foi revogado.`,reasonProvider:`O GitHub ou outro fornecedor não concluiu a operação solicitada.`,nextProvider:`Use a referência de diagnóstico para consultar o terminal, verifique a disponibilidade e o acesso e reveja possíveis alterações parciais antes de tentar novamente.`,reasonRateLimit:`O GitHub limitou temporariamente os pedidos necessários para a configuração.`,nextRateLimit:`Aguarde a reposição do limite. Inspecione as alterações concluídas antes de iniciar outra configuração.`,diagnosticReference:`Referência de diagnóstico`,resourceReceipt:`Registo das operações de configuração`,effectCompleted:`Indicada como concluída`,effectSkipped:`Indicada como ignorada`,effectInspect:`Resultado por inspecionar`,effectNotStarted:`Não iniciada`,effectInProgress:`Em curso; resultado ainda por confirmar`,scopeLocal:`Checkout local`,scopeMixed:`Repositório e organização`,receiptFiles:`Ficheiros de configuração`,receiptSecrets:`Secrets do GitHub Actions`,receiptLabels:`Etiquetas das questões`,receiptIssueTypes:`Tipos de questão`,receiptVariables:`Variables do GitHub Actions`,receiptInitialTag:`Etiqueta de versão inicial`,inspectPartial:`Algumas alterações podem estar ativas. Verifique o GitHub e o terminal antes de tentar novamente.`,patSettings:`Abrir definições de PAT no GitHub ↗`,closeSession:`Fechar sessão local`,sessionClosed:`Sessão local encerrada`,sessionClosedBody:`O servidor local aceitou o pedido de encerramento. Esta página deixa de o contactar e preserva o resultado. Encerrar a sessão não revoga nenhum PAT criado no GitHub.`,doctorHelp:`Depois de concluir a configuração, pode verificar aqui os recursos instalados sem iniciar Actions. Também pode executar copilot doctor --read-only na raiz do repositório com o PAT temporário e o mesmo ficheiro --config não secreto, caso o tenha usado.`,doctorRun:`Verificar instalação (só de leitura)`,doctorRunning:`A verificar os recursos instalados sem iniciar Actions…`,doctorPassed:`A verificação só de leitura não encontrou falhas.`,doctorWarnings:`A verificação só de leitura requer atenção.`,doctorFailed:`A verificação só de leitura não terminou. Consulte o terminal ou execute o comando abaixo.`,doctorCounts:`{pass} aprovados · {warn} avisos · {fail} falhas · {skipped} ignorados.`,doctorSecretLimit:`Este modo não consegue verificar os valores dos Secrets.`,botRenewal:`O PAT do bot permanece no Secret do GitHub Actions escolhido para execuções futuras. A data de validade real não é verificada aqui; registe-a no GitHub e substitua o Secret antes de expirar.`,working:`A preparar o próximo passo`,workingBody:`O processo local está a verificar as respostas. Mantenha esta página aberta.`,repoFocus:`Repositório em foco`,repoFocusBody:`Esta configuração destina-se ao repositório indicado. Secrets e Variables da organização podem ser partilhados com outros repositórios.`,access:`acesso`,readOnlyCheck:`Verificação de capacidades`,provisionalGrants:`Permissões provisórias mínimas`,conditionalGrants:`As permissões condicionais dependem das escolhas e do GitHub. Haverá uma auditoria final antes das alterações.`,permissionEvidenceVerified:`Uma leitura no GitHub confirmou este acesso.`,permissionEvidenceVerifiedWrite:`Foi criado, lido e removido um recurso temporário.`,permissionEvidencePrivateProject:`Um Project não público da organização confirmou o acesso de leitura a Projects.`,permissionEvidenceMissing:`O GitHub recusou o acesso necessário. Verifique as definições do PAT.`,permissionEvidenceWrite:`A verificação temporária de escrita não terminou com sucesso. Reveja a etapa que falhou e tente novamente.`,permissionEvidencePublic:`A leitura foi bem-sucedida, mas este recurso público não comprova por si só a permissão do PAT.`,permissionEvidencePublicProjects:`A leitura dos Projects foi bem-sucedida, mesmo com uma lista vazia. O acesso a Projects privados é verificado quando são selecionados.`,permissionEvidenceUnknownRead:`A consulta de leitura foi inconclusiva. Consulte o detalhe no terminal e tente de novo se necessário.`,permissionUnknown:`Esta permissão exige revisão. Consulte a permissão exata e a explicação técnica no terminal antes de continuar.`,permissionsFollow:`As permissões seguem as suas escolhas`,permissionsFollowBody:`Mostramos as permissões exatas antes de criar cada PAT. Abrir esta página não cria nada.`,files:`Ficheiros`,workflows:`Workflows`,variables:`Variables`,secretNames:`Nomes dos Secrets`,planBody:`Reveja exatamente o que pode mudar. Após a aprovação, recursos temporários testam as permissões de escrita do PAT; depois são pedidos o PAT do bot e outras credenciais. O GitHub pode conservar execuções, histórico de Issues ou PR e notificações.`,planPermissionProbeTitle:`Testes temporários de permissões após aprovação`,planPermissionProbeBody:`Cada permissão indicada cria, lê e remove o seu recurso temporário. O teste de Issues cria uma Issue visível; se o GitHub impedir a eliminação, a configuração fecha-a, indica o número e para. Actions, Issues e Pull requests podem deixar histórico ou notificações.`,planActionsProbePrerequisites:`O teste de Actions precisa de Contents Write para criar a branch isolada. Se o workflow de saúde empacotado exato não estiver disponível na branch predefinida, também precisa de Workflows Write para preparar uma versão com os jobs desativados. Para verificar o bot, o PAT de configuração prepara e limpa o recurso; o PAT do bot inicia e lê a execução. Um pré-requisito bloqueado não prova que falte Actions.`,planSecretProbeLimit:`O GitHub só oferece uma operação de criação ou atualização para Secrets. A verificação usa um nome aleatório privado e confirma primeiro que não existe, mas o GitHub não garante uma criação atómica. Se indicar uma atualização, a configuração para e pede a revisão do histórico do Secret.`,planChoices:`As suas decisões principais`,planEnabledCapabilities:`Funcionalidades ativadas`,planBranchRoles:`Ramo de produção / desenvolvimento`,planApprovalMode:`Aprovação de pull requests`,planVariableScope:`Âmbito das Variables`,planSecretScope:`Âmbito dos Secrets`,planInitialTag:`Criar etiqueta inicial`,planAgentRouting:`Agente e modelo por tarefa`,planIssueWorkflows:`Fluxos de questões`,planTrustedChecks:`Produtores CI de confiança`,planCoverage:`Evidência de cobertura`,planProjectStatuses:`Transições Status dos Projects`,planIssueResources:`Etiquetas e tipos de questão`,planIssueResourcesValue:`Verificados ou criados ao aplicar`,planProducerAttested:`Identidade CI e passo obrigatório verificados por si`,planCoverageThreshold:`Cobertura mínima das linhas alteradas`,planCoverageReporter:`Workflow que publica o artefacto`,planReporterAttested:`Produtor do relatório de cobertura verificado por si`,planAdvancedDefaults:`O plano também inclui valores predefinidos para definições que não alterou. Use Alterar abaixo para rever qualquer secção antes de aprovar.`,planUnknownWarning:`Um aviso adicional do plano não pode ser apresentado aqui. Leia-o no terminal antes de aprovar.`,planBasicDefaultsIntro:`O percurso básico manteve estas definições avançadas. Abra uma secção abaixo para as rever ou alterar:`,scopeRepository:`Repositório`,scopeOrganization:`Organização`,scopeDisabled:`Sem aprovisionamento`,approvalOff:`Desativada`,approvalRecommend:`Apenas recomendações`,approvalGuarded:`Aprovação protegida`,beforeContinue:`Antes de continuar`,stopHere:`Parar aqui`,approvePlan:`Aprovar este plano`,githubLink:`Abrir ligação do GitHub ↗`,githubForm:`Abrir formulário oficial de PAT no GitHub`,githubFormHelp:`Confirme a conta ligada, escolha Only select repositories e este repositório. O GitHub gere 2FA e cria o PAT.`,pasteHere:`Cole o valor aqui`,yourAnswer:`A sua resposta`,hiddenAfter:`Oculto após envio`,typeAnswer:`Escreva a sua resposta`,secretHelp:`Enviado apenas ao processo local. Não será mostrado de novo nem guardado no navegador.`,pairTitle:`Emparelhar este navegador`,pairLabel:`Código do terminal`,pairPlaceholder:`16 caracteres hexadecimais`,pairBody:`Encontre o código de 16 caracteres no terminal onde iniciou copilot setup --web. Não aparece no URL nem fica guardado após fechar a página.`,pairHelp:`Mantenha o código privado. Após atualizar a página, introduza-o novamente.`,pairButton:`Ligar à configuração local`,privateSession:`SESSÃO LOCAL PRIVADA`,theme:`Tema`,themeAuto:`Automático`,themeSystem:`Seguir sistema`,themeLight:`Tema claro`,themeDark:`Tema escuro`,selectOne:`Selecione uma opção`,ciRun:`Abrir execução de CI no GitHub ↗`,manualCheck:`Check não listado? Indique nome|ID da App|workflow exatos, separados por ponto e vírgula.`,checksObserved:`Foram encontrados jobs recentes de CI. Abra cada execução e confirme o job, a App e o passo obrigatório de cobertura antes de confiar nele.`,checksNoRecent:`Não há execuções recentes de workflows de pull request. Execute o CI habitual numa PR real ou introduza um produtor exato.`,checksNoVerifiable:`Há execuções recentes, mas nenhum job foi ligado a um Check Run e App exatos. Consulte o GitHub ou introduza o produtor manualmente.`,checksDenied:`O GitHub recusou a consulta do CI. Conceda Actions: read e Checks: read ao PAT de configuração ou introduza um produtor exato.`,checksUnavailable:`A consulta do CI falhou. Isto não prova que o repositório não tenha checks. Tente novamente ou introduza um produtor exato.`,projectsObserved:`Estes Projects existentes pertencem ao proprietário do repositório. Selecione só os que a automatização deve atualizar.`,projectsEmpty:`Esta consulta limitada ao GitHub não devolveu Projects abertos e acessíveis; isso não prova que não existam. Verifique o acesso ou introduza um número confirmado.`,projectsDenied:`O GitHub recusou a consulta de Projects. Verifique Projects: read da organização no PAT ou introduza os números.`,projectsUnavailable:`Não foi possível consultar Projects. Isto não prova que não existam. Introduza um número verificado ou tente novamente.`,projectsUnsupported:`Esta API do GitHub não lista Projects pessoais com um PAT de permissões precisas. Introduza o número do URL de um Project existente.`,discoveryTruncated:`Só foi inspecionada uma amostra limitada de Projects acessíveis ou checks recentes. Introduza manualmente um elemento em falta.`,checksDiscoveryScope:`Âmbito: até 20 execuções de PR entre as últimas 1.000 execuções de workflows (até 10 páginas) dos últimos 90 dias; são inspecionadas no máximo 15 execuções e 100 checks por commit.`,projectsDiscoveryScope:`Âmbito: no máximo 30 Projects abertos e acessíveis da organização em duas páginas; são inspecionados até 100 campos por Project. Os Projects fechados são excluídos.`,retryDiscovery:`Repetir pesquisa no GitHub`,retryRemaining:`Restam {count} tentativas só de leitura. As suas respostas são mantidas.`,retryExhausted:`Não restam tentativas. Verifique o GitHub e introduza manualmente os itens em falta.`,observationTimeUnknown:`data de observação indisponível`,branchRequirementUnknown:`Exigido pela regra do ramo: não verificado`,branchRequirementObserved:`Exigido em {branch} por um ruleset ativo para esta verificação e esta App específicas.`,ciRule:`Abrir ruleset da verificação obrigatória ↗`,projectSharedStatus:`Todos os Projects escolhidos devem partilhar cada valor Status. Esta configuração não atribui valores diferentes por Project.`,fixedWorkflowEnabled:`A sua configuração fixa features.{kind}=true. Mantenha {kind} selecionado; altere --config ou as opções para mudar esta escolha.`,fixedWorkflowDisabled:`A sua configuração fixa features.{kind}=false. Não selecione {kind}; altere --config ou as opções para mudar esta escolha.`,fixedIssuesRequired:`A sua configuração ativa explicitamente release ou hotfix. Mantenha Issues ativo ou altere primeiro --config ou as opções.`,projectSelectionNotObserved:`Os números de Projects escolhidos anteriormente são mantidos, mas já não aparecem neste resultado do GitHub. Confirme-os no GitHub ou remova-os.`,removeSelection:`Remover seleção`,projectTransitionIssueCreated:`Nova questão`,projectTransitionPullRequestCreated:`Novo pull request`,projectTransitionIssueInProgress:`Questão em curso`,projectTransitionPullRequestInProgress:`Pull request em curso`,projectUrl:`Abrir Project no GitHub ↗`,projectManual:`Project em falta? Introduza o número positivo ou o URL exato do GitHub. IDs PVT_ não são aceites.`,projectStatusUnavailable:`Não foi possível verificar as opções Status de todos os Projects. Consulte cada um no GitHub e introduza o valor exato.`,projectStatusIncompatible:`Os Projects escolhidos não partilham valores Status. Selecione Projects compatíveis antes de continuar.`,producerName:`Nome do check/job`,producerAppId:`ID da App GitHub de origem`,producerWorkflow:`Nome do workflow`,producerAdd:`Adicionar check exato`,producerRemove:`Remover check`,producerManualHelp:`Use a identidade exata apresentada no GitHub. Adicioná-la não prova que exige cobertura.`,producerManualInvalid:`Indique nome, ID numérico positivo da App e workflow. Não use | ou ; nos nomes. São permitidas vírgulas.`,translationPreviewTitle:`Revisão da tradução em curso`,translationPreviewBody:`As perguntas próprias da configuração já estão traduzidas. Alguns diagnósticos dinâmicos do GitHub ou do fornecedor ainda podem aparecer em inglês durante a revisão. Mudar de idioma não altera as suas respostas.`,unknownLocalError:`Ocorreu um erro inesperado na configuração local. Consulte o terminal e atualize a página ou reinicie a configuração.`},Ki=[`en`,`es`,`fr`,`pt`],qi={en:`English`,es:`Español`,fr:`Français`,pt:`Português`},Ji={en:Hi,es:Ui,fr:Wi,pt:Gi};function Q(e,t,n={}){return(Ji[t]??Ji.en)[e].replace(/\{(\w+)\}/gu,(e,t)=>n[t]??``)}var Yi={Repository:`repository`,"Setup choices":`choices`,"Setup PAT":`setupPat`,Plan:`plan`,"Bot PAT & credentials":`botPat`,Apply:`apply`,Preparation:`gettingReady`};function Xi(e,t){return Q(Zi(e),t)}function Zi(e){return Yi[e??``]??`gettingReady`}var $=Ni(`en`),Qi={en:{checking:`Checking permission for this adjustment. The temporary Variable will be removed before the reviewed setting is written.`,finish:`Finish`,finished:`Configuration updated`,inspectionFinished:`Configuration inspection finished`,inspectionStopped:`Configuration inspection stopped`,inspectAdjustment:`Check this adjustment before retrying`,finishedBody:`Your adjustments were verified by reading GitHub again. Delete the temporary setup PAT when you finish.`,inspectionBody:`No adjustment was applied. Your configuration is preserved. Any PAT created on GitHub remains until you delete it.`,title:`Your Copilot configuration`,unconfigured:`Copilot is not configured in this checkout`,detected:`Configuration detected in this checkout`,incomplete:`Some configuration could not be inspected`,intro:`Review what this checkout configures, make a small adjustment, or run the complete assistant again.`,startHelp:`Start the guided assistant to choose workflows, agents and GitHub settings for this repository. You will review the plan before any setup changes are applied.`,local:`Local files are shown below. Connect to GitHub to read the current repository and organization settings. No changes happen when you open this panel.`,limits:`This panel describes the current checkout. It does not certify the default branch, runner authentication, branch rules, or environment-specific overrides.`,connect:`Read configuration from GitHub`,refresh:`Refresh configuration`,wizard:`Run the complete assistant`,start:`Start setup`,close:`Close local session`,unknown:`Not verified`,repository:`Repository`,organization:`Organization`,workflow:`Workflow value`,source:`Where this value comes from`,quick:`Quick adjustments`,quickHelp:`Only independent settings can be changed here. Use the complete assistant for workflows, agents, Projects, permissions or credentials.`,edit:`Change`,details:`All workflow settings`,credentials:`Credentials`,secretHelp:`Secret names only. GitHub cannot return their values, owners or permissions; presence is not proof of validity.`,variables:`GitHub settings used by these workflows`,shadowed:`Overridden by the repository value`,empty:`No entries detected`,githubIncomplete:`Some GitHub inventories are unavailable. Unknown values stay unknown; quick changes are disabled until both Variable scopes can be read.`,current:`Current value`,next:`New value`,review:`Review this adjustment`,back:`Back to configuration`,preview:`Review change`,apply:`Apply this adjustment`,effect:`Only this setting is written. Workflows and Secrets are preserved. Before writing, Copilot tests Variables Write using one temporary Variable and removes it.`,orgImpact:`This changes a shared organization setting and can affect every repository with access to it. Its visibility and repository access are preserved.`,repoImpact:`This changes the setting for this repository only.`,connected:`GitHub configuration read. Review the current values below.`,invalid:`Choose a supported value. Nothing was changed.`,unchanged:`That value is already in effect. Nothing was changed.`,stale:`The configuration changed while you reviewed it. Review the refreshed value and try again; nothing was written.`,blocked:`Access could not be confirmed. You can reconnect with a corrected setup PAT; your configuration is preserved.`,updated:`Adjustment applied and read back from GitHub. You can make another adjustment or close the session.`,partial:`The write could not be confirmed. Inspect GitHub before retrying; the previous value was not restored automatically.`},es:{checking:`Comprobando el permiso para este ajuste. La Variable temporal se eliminará antes de escribir el parámetro aprobado.`,finish:`Terminar`,finished:`Configuración actualizada`,inspectionFinished:`Inspección de configuración finalizada`,inspectionStopped:`Inspección de configuración interrumpida`,inspectAdjustment:`Revisa este ajuste antes de reintentar`,finishedBody:`Los ajustes se confirmaron mediante una nueva lectura de GitHub. Elimina el PAT temporal de setup cuando termines.`,inspectionBody:`No se ha aplicado ningún ajuste. Tu configuración se conserva. Los PAT creados en GitHub existen hasta que los elimines.`,title:`Tu configuración de Copilot`,unconfigured:`Copilot no está configurado en este checkout`,detected:`Configuración detectada en este checkout`,incomplete:`No se pudo inspeccionar parte de la configuración`,intro:`Revisa la configuración de este checkout, haz un ajuste puntual o vuelve a ejecutar el asistente completo.`,startHelp:`Inicia el asistente guiado para elegir workflows, agentes y parámetros de GitHub para este repositorio. Revisarás el plan antes de aplicar cambios de configuración.`,local:`Estos son los archivos locales. Conecta con GitHub para leer los valores actuales del repositorio y la organización. Abrir el panel no realiza cambios.`,limits:`El panel describe este checkout. No certifica la rama por defecto, la autenticación del runner, las reglas de ramas ni las excepciones de entornos.`,connect:`Leer configuración de GitHub`,refresh:`Actualizar información`,wizard:`Ejecutar el asistente completo`,start:`Iniciar configuración`,close:`Cerrar sesión local`,unknown:`Sin verificar`,repository:`Repositorio`,organization:`Organización`,workflow:`Valor del workflow`,source:`Procedencia del valor`,quick:`Ajustes rápidos`,quickHelp:`Aquí puedes cambiar parámetros independientes. Para workflows, agentes, Projects, permisos o credenciales, usa el asistente completo.`,edit:`Cambiar`,details:`Todos los parámetros de los workflows`,credentials:`Credenciales`,secretHelp:`Solo se muestran nombres. GitHub no devuelve valores, propietarios ni permisos de los Secrets; su presencia no demuestra su validez.`,variables:`Parámetros de GitHub usados por estos workflows`,shadowed:`El valor del repositorio tiene prioridad`,empty:`No se han detectado entradas`,githubIncomplete:`Parte de la información de GitHub no está disponible. Los valores desconocidos siguen sin verificar; los ajustes requieren leer ambos scopes de Variables.`,current:`Valor actual`,next:`Nuevo valor`,review:`Revisar este ajuste`,back:`Volver a la configuración`,preview:`Revisar cambio`,apply:`Aplicar este ajuste`,effect:`Solo se escribe este parámetro. Se conservan workflows y Secrets. Antes de escribir, Copilot prueba Variables Write con una Variable temporal y la elimina.`,orgImpact:`Cambiarás un parámetro compartido de la organización: puede afectar a todos los repositorios con acceso. Se conservarán su visibilidad y sus accesos.`,repoImpact:`El cambio afecta únicamente a este repositorio.`,connected:`Configuración de GitHub leída. Revisa los valores actuales.`,invalid:`Elige un valor permitido. No se ha cambiado nada.`,unchanged:`Ese valor ya está en uso. No se ha cambiado nada.`,stale:`La configuración cambió durante la revisión. Revisa el valor actualizado y vuelve a intentarlo; no se ha escrito nada.`,blocked:`No se pudo confirmar el acceso. Puedes conectar con un PAT de setup corregido; tu configuración se conserva.`,updated:`Ajuste aplicado y confirmado mediante una nueva lectura de GitHub. Puedes hacer otro ajuste o cerrar la sesión.`,partial:`No se pudo confirmar la escritura. Revisa GitHub antes de reintentar; el valor anterior no se restauró automáticamente.`},fr:{checking:`Vérification de la permission pour cet ajustement. La Variable temporaire sera supprimée avant l’écriture du paramètre approuvé.`,finish:`Terminer`,finished:`Configuration mise à jour`,inspectionFinished:`Inspection de la configuration terminée`,inspectionStopped:`Inspection de la configuration interrompue`,inspectAdjustment:`Vérifiez cet ajustement avant de réessayer`,finishedBody:`Les ajustements ont été confirmés par une nouvelle lecture de GitHub. Supprimez le PAT temporaire à la fin.`,inspectionBody:`Aucun ajustement appliqué. La configuration est conservée. Tout PAT créé sur GitHub existe jusqu’à sa suppression.`,title:`Votre configuration Copilot`,unconfigured:`Copilot n’est pas configuré dans ce checkout`,detected:`Configuration détectée dans ce checkout`,incomplete:`Une partie de la configuration n’a pas pu être inspectée`,intro:`Consultez la configuration, ajustez un paramètre ou relancez l’assistant complet.`,local:`Voici les fichiers locaux. Connectez GitHub pour lire les valeurs actuelles du dépôt et de l’organisation. Ouvrir ce panneau ne modifie rien.`,startHelp:`Lancez l’assistant guidé pour choisir les workflows, agents et paramètres GitHub de ce dépôt. Vous examinerez le plan avant toute modification de configuration.`,limits:`Ce panneau décrit le checkout actuel. Il ne certifie pas la branche par défaut, l’authentification du runner, les règles de branches ni les exceptions des environnements.`,connect:`Lire la configuration GitHub`,refresh:`Actualiser`,wizard:`Relancer l’assistant complet`,start:`Configurer Copilot`,close:`Fermer la session locale`,unknown:`Non vérifié`,repository:`Dépôt`,organization:`Organisation`,workflow:`Valeur du workflow`,source:`Origine de cette valeur`,quick:`Ajustements rapides`,quickHelp:`Seuls les paramètres indépendants sont modifiables ici. Utilisez l’assistant complet pour les workflows, agents, Projects, permissions ou identifiants.`,edit:`Modifier`,details:`Tous les paramètres des workflows`,credentials:`Identifiants`,secretHelp:`Noms des Secrets uniquement. GitHub ne retourne ni valeurs, ni propriétaires, ni permissions ; leur présence ne prouve pas leur validité.`,variables:`Paramètres GitHub utilisés par ces workflows`,shadowed:`Remplacé par la valeur du dépôt`,empty:`Aucune entrée détectée`,githubIncomplete:`Certaines données GitHub sont indisponibles. Les valeurs inconnues restent non vérifiées ; les deux scopes de Variables doivent être lisibles.`,current:`Valeur actuelle`,next:`Nouvelle valeur`,review:`Vérifier cet ajustement`,back:`Retour à la configuration`,preview:`Vérifier le changement`,apply:`Appliquer cet ajustement`,effect:`Seul ce paramètre est écrit. Workflows et Secrets sont conservés. Copilot teste Variables Write avec une Variable temporaire, puis la supprime.`,orgImpact:`Ce paramètre partagé peut affecter tous les dépôts autorisés. Sa visibilité et ses accès restent identiques.`,repoImpact:`Ce changement affecte seulement ce dépôt.`,connected:`Configuration GitHub lue. Consultez les valeurs actuelles.`,invalid:`Choisissez une valeur autorisée. Aucun changement.`,unchanged:`Cette valeur est déjà appliquée. Aucun changement.`,stale:`La configuration a changé pendant votre examen. Vérifiez la nouvelle valeur et réessayez ; aucune écriture.`,blocked:`L’accès n’a pas été confirmé. Reconnectez un PAT de configuration corrigé ; la configuration est conservée.`,updated:`Ajustement appliqué et relu depuis GitHub. Vous pouvez continuer ou fermer la session.`,partial:`L’écriture n’a pas été confirmée. Vérifiez GitHub avant de réessayer ; la valeur précédente n’a pas été restaurée automatiquement.`},pt:{checking:`A verificar a permissão para este ajuste. A Variable temporária será eliminada antes de escrever o parâmetro aprovado.`,finish:`Terminar`,finished:`Configuração atualizada`,inspectionFinished:`Inspeção da configuração concluída`,inspectionStopped:`Inspeção da configuração interrompida`,inspectAdjustment:`Verifique este ajuste antes de tentar novamente`,finishedBody:`Os ajustes foram confirmados por uma nova leitura do GitHub. Elimine o PAT temporário de setup ao terminar.`,inspectionBody:`Nenhum ajuste aplicado. A configuração é preservada. Os PAT criados no GitHub existem até os eliminar.`,title:`A sua configuração Copilot`,unconfigured:`Copilot não está configurado neste checkout`,detected:`Configuração detetada neste checkout`,incomplete:`Parte da configuração não pôde ser inspecionada`,intro:`Veja a configuração, ajuste um parâmetro ou execute o assistente completo novamente.`,local:`Estes são os ficheiros locais. Ligue ao GitHub para ler os valores atuais do repositório e da organização. Abrir este painel não altera nada.`,startHelp:`Inicie o assistente guiado para escolher workflows, agentes e parâmetros GitHub para este repositório. Irá rever o plano antes de aplicar alterações de configuração.`,limits:`Este painel descreve o checkout atual. Não certifica o branch predefinido, a autenticação do runner, as regras de branches nem exceções dos ambientes.`,connect:`Ler configuração do GitHub`,refresh:`Atualizar informação`,wizard:`Executar o assistente completo`,start:`Configurar Copilot`,close:`Fechar sessão local`,unknown:`Não verificado`,repository:`Repositório`,organization:`Organização`,workflow:`Valor do workflow`,source:`Origem do valor`,quick:`Ajustes rápidos`,quickHelp:`Aqui pode alterar parâmetros independentes. Use o assistente completo para workflows, agentes, Projects, permissões ou credenciais.`,edit:`Alterar`,details:`Todos os parâmetros dos workflows`,credentials:`Credenciais`,secretHelp:`Apenas nomes dos Secrets. GitHub não devolve valores, contas ou permissões; a presença não comprova a validade.`,variables:`Parâmetros GitHub usados por estes workflows`,shadowed:`Substituído pelo valor do repositório`,empty:`Nenhuma entrada detetada`,githubIncomplete:`Alguns dados GitHub estão indisponíveis. Os valores desconhecidos continuam não verificados; os dois scopes de Variables devem poder ser lidos.`,current:`Valor atual`,next:`Novo valor`,review:`Rever este ajuste`,back:`Voltar à configuração`,preview:`Rever alteração`,apply:`Aplicar este ajuste`,effect:`Só este parâmetro é escrito. Workflows e Secrets são preservados. Copilot testa Variables Write com uma Variable temporária e depois elimina-a.`,orgImpact:`Este parâmetro partilhado pode afetar todos os repositórios autorizados. A visibilidade e os acessos são preservados.`,repoImpact:`Esta alteração afeta apenas este repositório.`,connected:`Configuração GitHub lida. Reveja os valores atuais.`,invalid:`Escolha um valor permitido. Nada foi alterado.`,unchanged:`Este valor já está aplicado. Nada foi alterado.`,stale:`A configuração mudou durante a revisão. Reveja o valor atualizado e tente novamente; nada foi escrito.`,blocked:`O acesso não foi confirmado. Ligue um PAT de setup corrigido; a configuração é preservada.`,updated:`Ajuste aplicado e confirmado por uma nova leitura do GitHub. Pode continuar ou fechar a sessão.`,partial:`A escrita não foi confirmada. Verifique GitHub antes de tentar novamente; o valor anterior não foi restaurado automaticamente.`}},$i={assignees:[`Issue assignees`,`Responsables de issues`,`Responsables des issues`,`Responsáveis pelas issues`],reviewers:[`PR reviewers`,`Revisores de PRs`,`Relecteurs des PRs`,`Revisores de PRs`],inactivity:[`Close waiting issues after (hours)`,`Cerrar issues en espera tras (horas)`,`Fermer les issues en attente après (heures)`,`Fechar issues em espera após (horas)`],reopen:[`Reopen issues after a push`,`Reabrir issues tras un push`,`Rouvrir les issues après un push`,`Reabrir issues após um push`],description:[`PR description updates`,`Actualizaciones de la descripción de PRs`,`Mise à jour des descriptions de PRs`,`Atualizações da descrição de PRs`],members:[`Limit AI interactions to members`,`Limitar interacciones de IA a miembros`,`Limiter l’IA aux membres`,`Limitar interações de IA a membros`],reasoning:[`Include AI reasoning`,`Incluir razonamiento de IA`,`Inclure le raisonnement de l’IA`,`Incluir raciocínio da IA`],severity:[`Minimum finding severity`,`Severidad mínima de findings`,`Gravité minimale des findings`,`Gravidade mínima dos findings`],commentLimit:[`Maximum review comments`,`Máximo de comentarios por revisión`,`Maximum de commentaires par analyse`,`Máximo de comentários por revisão`],dryRun:[`Preview findings without publishing`,`Analizar findings sin publicarlos`,`Analyser sans publier les findings`,`Analisar findings sem publicar`],effort:[`Review depth`,`Profundidad de revisión`,`Profondeur de l’analyse`,`Profundidade da revisão`],drafts:[`Review draft PRs`,`Revisar PRs en borrador`,`Analyser les PRs en brouillon`,`Rever PRs em rascunho`],suggestions:[`Publish suggested code changes`,`Publicar cambios de código sugeridos`,`Publier des suggestions de code`,`Publicar sugestões de código`],telemetry:[`Include review metrics`,`Incluir métricas de revisión`,`Inclure les métriques d’analyse`,`Incluir métricas de revisão`]},ea=e=>Qi[e],ta=(e,t)=>$i[e]?.[[`en`,`es`,`fr`,`pt`].indexOf(t)]??e,na={true:[`On`,`Activado`,`Activé`,`Ativado`],false:[`Off`,`Desactivado`,`Désactivé`,`Desativado`],replace:[`Replace the description`,`Sustituir la descripción`,`Remplacer la description`,`Substituir a descrição`],append:[`Add to the description`,`Añadir a la descripción`,`Compléter la description`,`Acrescentar à descrição`],preserve:[`Keep the description`,`Conservar la descripción`,`Conserver la description`,`Preservar a descrição`],disabled:[`Disabled`,`Desactivado`,`Désactivé`,`Desativado`],info:[`Informational`,`Informativo`,`Information`,`Informativo`],low:[`Low`,`Bajo`,`Faible`,`Baixo`],medium:[`Medium`,`Medio`,`Moyen`,`Médio`],high:[`High`,`Alto`,`Élevé`,`Alto`],smart:[`Automatic`,`Automático`,`Automatique`,`Automático`],default:[`Standard`,`Estándar`,`Standard`,`Padrão`]},ra=(e,t)=>na[e]?.[[`en`,`es`,`fr`,`pt`].indexOf(t)]??e,ia=G(`

`,1),aa=G(`
  • `),oa=G(`
      `,1),sa=G(``);function ca(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`management`,8,!1),s=Z(t,`journey`,8),c=[`repository`,`choices`,`setupPat`,`plan`,`botPat`,`apply`];L(()=>(U(s()),Zi),()=>{M(a,s()?.complete?.map(Zi)??[])}),En(),ki();var l=sa(),u=N(l),d=I(N(u)),f=F(I(N(d)),!0);D(d),D(u);var p=I(u,2),m=e=>{var t=ia(),r=P(t),i=F(r,!0),a=F(I(r,2),!0);R((e,t)=>{q(i,e),q(a,t)},[()=>(U(ea),n(),H(()=>ea(n()).title)),()=>(U(ea),n(),H(()=>ea(n()).quickHelp))]),K(e,t)},h=e=>{var t=oa(),r=P(t),i=F(r,!0),o=I(r,2);Y(o,5,()=>c,qr,(e,t,r)=>{var i=aa();let o;var c=N(i),l=F(c,!0),u=F(I(c,2),!0);D(i),R((e,t,n,r,a)=>{X(i,`aria-current`,e),o=ci(i,1,``,null,o,{current:t,completed:n}),q(l,r),q(u,a)},[()=>(U(s()),V(a),V(t),H(()=>s()?.position===r+1&&!V(a).includes(V(t))?`step`:void 0)),()=>s()?.position===r+1&&!V(a).includes(V(t)),()=>V(a).includes(V(t)),()=>(V(a),V(t),H(()=>V(a).includes(V(t))?`✓`:String(r+1).padStart(2,`0`))),()=>(U(Q),V(t),n(),H(()=>Q(V(t),n())))]),K(e,i)}),D(o),R(e=>q(i,e),[()=>(U(Q),n(),H(()=>Q(`journey`,n())))]),K(e,t)};J(p,e=>{o()?e(m):e(h,-1)});var g=I(p,2),_=I(N(g)),v=N(_),y=F(v,!0),b=F(I(v),!0);D(_),D(g),D(l),R((e,t,n,r)=>{X(l,`aria-label`,e),q(f,t),q(y,n),q(b,r)},[()=>(U(Q),n(),H(()=>Q(`progress`,n()))),()=>(U(Q),n(),H(()=>Q(`studio`,n()))),()=>(U(Q),n(),H(()=>Q(`localDesign`,n()))),()=>(U(Q),n(),H(()=>Q(`localDesignBody`,n())))]),K(e,l),Je(),i()}var la=G(`
      `);function ua(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(`system`);L(()=>V(a),()=>{document.documentElement.dataset.theme=V(a)}),En(),ki();var o=la(),s=N(o);let c;var l=F(s,!0),u=I(s,2);let d;var f=I(u,2);let p;D(o),R((e,t,n,r,i,m,h,g)=>{X(o,`aria-label`,e),X(s,`aria-pressed`,V(a)===`system`),X(s,`aria-label`,t),X(s,`title`,n),c=ci(s,1,``,null,c,{active:V(a)===`system`}),q(l,r),X(u,`aria-pressed`,V(a)===`light`),X(u,`aria-label`,i),X(u,`title`,m),d=ci(u,1,``,null,d,{active:V(a)===`light`}),X(f,`aria-pressed`,V(a)===`dark`),X(f,`aria-label`,h),X(f,`title`,g),p=ci(f,1,``,null,p,{active:V(a)===`dark`})},[()=>(U(Q),n(),H(()=>Q(`theme`,n()))),()=>(U(Q),n(),H(()=>Q(`themeSystem`,n()))),()=>(U(Q),n(),H(()=>Q(`themeSystem`,n()))),()=>(U(Q),n(),H(()=>Q(`themeAuto`,n()))),()=>(U(Q),n(),H(()=>Q(`themeLight`,n()))),()=>(U(Q),n(),H(()=>Q(`themeLight`,n()))),()=>(U(Q),n(),H(()=>Q(`themeDark`,n()))),()=>(U(Q),n(),H(()=>Q(`themeDark`,n())))]),W(`click`,s,()=>M(a,`system`)),W(`click`,u,()=>M(a,`light`)),W(`click`,f,()=>M(a,`dark`)),K(e,o),Je(),i()}Sr([`click`]);var da=G(``),fa=G(` `,1);function pa(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri();function a(e){let t=e.currentTarget.value;Ki.includes(t)&&$.set(t)}ki();var o=fa(),s=P(o),c=N(s),l=I(c);Y(l,5,()=>Ki,qr,(e,t)=>{var n=da(),r=F(n,!0),i={};R(()=>{q(r,qi[V(t)]),i!==(i=V(t))&&(n.value=(n.__value=i)??``)}),K(e,n)}),D(l);var u;fi(l),D(s);var d=F(I(s,2),!0);R((e,t)=>{q(c,`${e??``} `),X(l,`aria-label`,t),u!==(u=n())&&(l.value=(l.__value=u)??``,di(l,u)),q(d,qi[n()])},[()=>Q(`language`,n()),()=>Q(`language`,n())]),W(`change`,l,a),K(e,o),Je(),i()}Sr([`change`]);var ma=G(``),ha=G(`
      `);function ga(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`repository`,8),o=Z(t,`closed`,8,!1);ki();var s=ha(),c=N(s),l=N(c),u=F(l,!0),d=I(l,2),f=F(N(d),!0);D(d),D(c);var p=I(c,2),m=N(p),h=N(m),g=e=>{K(e,ma())};J(h,e=>{o()||e(g)});var _=I(h);D(m);var v=I(m);pa(v,{}),ua(I(v),{}),D(p),D(s),R((e,t,n)=>{q(u,e),q(f,t),q(_,` ${n??``}`)},[()=>(U(Q),n(),H(()=>Q(`setup`,n()))),()=>(U(a()),U(Q),n(),H(()=>a()??Q(`connecting`,n()))),()=>(U(Q),U(o()),n(),H(()=>Q(o()?`sessionClosed`:`localSession`,n())))]),K(e,s),Je(),i()}var _a={"setup.scope":{title:`Choose setup scope`,description:`This repository keeps the local preview and Apply flow. Several repositories lets you explicitly select 1–25 targets in the same organization and create reviewed setup PRs. Batch setup does not merge, create tags, release or deploy.`,choices:[`This repository`,`Several repositories in this organization`]},"setup.batchSource":{title:`Where should configuration come from?`,description:`Reuse compatible organization settings to skip completed questions, or customize repository settings. Batch setup keeps existing Secret bindings in both paths. Provision missing credentials separately, then inspect again; shared values are never replaced.`,choices:[`Reuse organization configuration`,`Customize settings; keep existing Secrets`]},"batch.token":{title:`Temporary PAT for selected repositories`,description:`Create a temporary setup PAT limited to these repositories: {repositories}. The GitHub link proposes grants; select only the intended repositories yourself. Leave blank to keep the current PAT. The final plan rechecks exact permissions. Delete temporary setup PATs afterwards.`},"setup.source":{title:`Where should configuration come from?`,description:`Reuse compatible organization Variables and existing Secret bindings, keeping repository overrides. Only missing, invalid or repository-specific settings are asked again. Shared values are preserved; reviewed differences become repository overrides. Choose Customize to provision or replace credentials.`,choices:[`Reuse organization configuration`,`Customize configuration`]},"setup.reusePatReview":{title:`Review organization reuse access`,description:`These provisional grants inspect existing organization configuration and allow repository setup. Shared Secret values are never requested or replaced. The final plan rechecks exact permissions; authentication evidence can remain pending. Select only the intended repositories in GitHub and delete the temporary PAT afterwards.`,choices:[`Continue to GitHub`,`Enter a PAT manually`]},"botPat.scopeConflict":{title:`Resolve the bot PAT scope conflict`,description:`Repository Secret PAT in {repository} overrides the selected organization PAT. Delete the repository Secret in GitHub, then ask Copilot to check again, or change the PAT scope to this repository. Your setup answers are retained. Copilot will not delete any Secret.`,choices:[`I have deleted the repository PAT — check again`,`Store PAT in the repository instead`,`Stop setup`]},"botPat.scopeConflictUnavailable":{title:`Resolve the bot PAT scope conflict`,description:`GitHub could not confirm whether the repository PAT was removed. The conflict remains unresolved. Your setup answers are retained. Check access and try again, change the PAT scope to this repository, or stop setup.`,choices:[`I have deleted the repository PAT — check again`,`Store PAT in the repository instead`,`Stop setup`]},"repository.confirm":{title:`Confirm this repository`,description:`This checkout points to {repository} on branch {branch}. Confirm the target before configuring PAT access or files.`,choices:[`Yes, this is my repository`,`Stop and choose another checkout`]},"setup.depth":{title:`Choose how much detail to review`,description:`Basic still asks about permissions, security, branch roles, Projects, approval and storage. Selected advanced agent, branch-prefix and Bugbot settings keep their defaults; inspect and edit them in the final plan. Custom asks every applicable question. Neither path applies changes now.`,choices:[`Basic guided setup (recommended)`,`Customize every setting`]},"setup.environmentPat":{title:`An environment setup PAT is available`,description:`The value stays in the CLI process. Continuing starts identity checks and isolated temporary create/read/delete tests before planning. Installation requires final approval. Exiting Copilot cannot unset your parent shell variable.`,choices:[`Use the environment PAT`,`Create or enter a different PAT`]},"plan.review":{title:`Review your setup plan`,description:`Inspect the affected files, workflows, Variables and Secret names before approving. No setup changes start by opening this plan.`},"workflow.update":{title:`Update existing workflows?`,description:`These existing workflow files differ from the setup plan: {files}. Keeping them may leave some new settings inactive.`,choices:[`Keep existing`,`Update setup-managed workflows`]},"setupPat.method":{title:`How will you provide your setup PAT?`,description:`This temporary PAT authorizes this one setup run. GitHub creates it under your operator account; Copilot cannot revoke it for you.`,choices:[`Guided GitHub link`,`Manual PAT`]},"setupPat.ownerKind":{title:`Who owns this repository on GitHub?`,description:`The owner determines which organization permissions may be needed. Check the repository header on GitHub if unsure.`,choices:[`Organization`,`Personal account`,`Not sure`]},"setupPat.review":{title:`Review provisional setup PAT permissions`,description:`These grants follow your choices. When managing Secrets, the link prefills Actions, Contents and Workflows write for possible health checks. Those checks run only if the approved plan requires them. GitHub inspection may reveal other requirements.`,choices:[`Continue to GitHub`,`Review setup choices again`,`View full permission table`,`Enter a PAT manually`]},"setupPat.entry":{title:`Temporary setup PAT`,description:`Open GitHub as your operator account, complete 2FA, choose “Only select repositories”, select this repository and copy the generated PAT here. This PAT is for this run only; delete it on GitHub afterwards.`},"setupPat.confirmAccount":{title:`GitHub authenticated the setup PAT as @{account}`,description:`Is this the operator account that should configure this repository? A wrong account must stop before any setup change.`,choices:[`Yes, continue`,`No, stop`]},"setupPat.confirmUnverifiedAccess":{title:`Check the PAT grants marked Unverifiable`,description:`Verified rows already passed. Compare each required Unverifiable row with the scope and access level in your GitHub PAT settings. Read-only checks cannot prove Write; Unverifiable does not mean missing. Check Projects: read only if that row is Unverifiable. Continue only after checking every such grant.`,choices:[`No, stop`,`Yes, I checked them`]},"botPat.method":{title:`How will you provide the bot PAT?`,description:`The bot PAT is separate from the setup PAT. It belongs to the account that will run future GitHub Actions and is stored as a Secret after approval.`,choices:[`Guided GitHub link`,`Manual PAT`]},"botPat.login":{title:`Expected GitHub bot login`,description:`Enter the bot account login without @. Copilot resolves its numeric GitHub ID and compares it with the PAT owner.`},"botPat.entry.guided":{title:`{name} — bot account PAT`,description:`Open GitHub as @{account} (account ID {accountId}), not as the setup operator. Select only this repository, review all grants and paste the PAT here. Suggested expiry: 90 days. An existing Secret value cannot be read back.`},"botPat.entry.manual":{title:`{name} — bot account PAT`,description:`Use the bot account, select only the intended repository and review all grants before pasting its PAT. Suggested expiry: 90 days. An existing Secret value cannot be read back.`},"botPat.identityMismatch":{title:`This PAT belongs to a different GitHub account`,description:`The PAT belongs to @{actual}; the selected bot is @{expected}. No bot Secret was written. Your answers and approved plan are retained. Delete the unused PAT in GitHub, switch to @{expected}, then choose whether to enter another PAT or stop setup.`,choices:[`Enter another bot PAT`,`Stop setup`]},"credential.apiKey":{title:`{name} — {provider} API key`,description:`Paste the API key for {provider}. It is sent only to this local setup process and, if approved, installed as a GitHub Actions Secret. Existing Secret values cannot be read back.`},"credential.existing":{title:`Existing {name}: {status}`,description:`GitHub cannot reveal the current Secret value. Keep it only if you deliberately accept that its health cannot be verified here; replace or skip it otherwise.`,choices:[`Keep existing`,`Replace it`,`Skip this credential`]},"apply.confirm":{title:`Apply this setup now?`,description:`This is the final approval. Local files and selected GitHub resources may change. A partial result may require inspection before retrying.`,choices:[`Apply setup`,`Stop without applying`]},"management.token":{title:`Temporary setup PAT`,description:`Read configuration from GitHub with a setup PAT. Read access is enough for inspection; changes require Variables Write and a separate approval. Secrets are shown by name only. Leave blank to return to the panel.`},"management.tokenWrite":{title:`Setup PAT for this adjustment`,description:`Use Variables Write in the reviewed scope. After approval, verification creates and removes one temporary Variable. Leave blank to return to the panel.`}},va={"setup.scope":{title:`Elige el alcance del setup`,description:`Este repositorio conserva la vista previa y la aplicación local. Varios repositorios permite seleccionar entre 1 y 25 destinos de la misma organización y crear PRs de setup para revisarlas. El lote no hace merge, crea tags, publica versiones ni despliega.`,choices:[`Este repositorio`,`Varios repositorios de esta organización`]},"setup.batchSource":{title:`¿De dónde debe venir la configuración?`,description:`Reutiliza los ajustes compatibles de la organización para saltar preguntas ya resueltas, o personaliza los ajustes del repositorio. En ambos casos, el lote conserva los Secrets existentes. Crea por separado las credenciales que falten y vuelve a inspeccionar; los valores compartidos no se sustituyen.`,choices:[`Reutilizar configuración de la organización`,`Personalizar ajustes; conservar Secrets`]},"batch.token":{title:`PAT temporal para los repositorios seleccionados`,description:`Crea un PAT temporal de setup limitado a estos repositorios: {repositories}. El enlace propone permisos; selecciona tú solo los repositorios previstos en GitHub. Déjalo vacío para conservar el PAT actual. El plan final vuelve a comprobar los permisos exactos. Elimina después los PATs temporales de setup.`},"setup.source":{title:`¿De dónde debe venir la configuración?`,description:`Reutiliza las Variables compatibles y los Secrets existentes de la organización, conservando los ajustes del repositorio. Solo se preguntan los ajustes que falten, sean inválidos o dependan del repositorio. Los valores compartidos se conservan; las diferencias revisadas se guardan en el repositorio. Elige Personalizar para crear o sustituir credenciales.`,choices:[`Reutilizar configuración de la organización`,`Personalizar configuración`]},"setup.reusePatReview":{title:`Revisa el acceso para reutilizar configuración`,description:`Estos permisos provisionales permiten inspeccionar la configuración existente y configurar el repositorio. No se piden ni sustituyen los valores de los Secrets compartidos. El plan final comprueba los permisos exactos; la verificación de las credenciales puede quedar pendiente. Selecciona solo los repositorios previstos en GitHub y elimina después el PAT temporal.`,choices:[`Continuar a GitHub`,`Introducir un PAT manualmente`]},"botPat.scopeConflict":{title:`Resuelve el conflicto de scope del PAT del bot`,description:`El Secret PAT del repositorio {repository} tiene prioridad sobre el PAT de organización seleccionado. Elimina el Secret del repositorio en GitHub y pide a Copilot que lo compruebe de nuevo, o cambia el scope del PAT a este repositorio. Tus respuestas se conservan. Copilot no eliminará ningún Secret.`,choices:[`Ya he eliminado el PAT del repositorio — comprobar de nuevo`,`Guardar PAT en el repositorio`,`Detener setup`]},"botPat.scopeConflictUnavailable":{title:`Resuelve el conflicto de scope del PAT del bot`,description:`GitHub no ha permitido confirmar si se eliminó el PAT del repositorio. El conflicto sigue sin resolverse. Tus respuestas se conservan. Comprueba el acceso y vuelve a intentarlo, cambia el scope del PAT a este repositorio o detén el setup.`,choices:[`Ya he eliminado el PAT del repositorio — comprobar de nuevo`,`Guardar PAT en el repositorio`,`Detener setup`]},"botPat.identityMismatch":{title:`Este PAT pertenece a otra cuenta de GitHub`,description:`El PAT pertenece a @{actual}; el bot seleccionado es @{expected}. No se ha escrito el Secret del bot. Conservamos tus respuestas y el plan aprobado. Elimina el PAT sin usar en GitHub, cambia a @{expected} y elige si quieres introducir otro PAT o detener el setup.`,choices:[`Introducir otro PAT del bot`,`Detener setup`]},"repository.confirm":{title:`Confirma el repositorio`,description:`Este checkout apunta a {repository} en la rama {branch}. Comprueba el destino antes de configurar permisos del PAT o archivos.`,choices:[`Sí, es mi repositorio`,`Detener y elegir otro checkout`]},"setup.depth":{title:`Elige cuánto detalle quieres revisar`,description:`El modo básico sigue preguntando por permisos, seguridad, ramas, Projects, aprobación y almacenamiento. Algunos ajustes avanzados de agentes, prefijos de rama y Bugbot conservan sus valores predeterminados; podrás revisarlos y editarlos en el plan final. El modo personalizado pregunta por todos los ajustes aplicables. Ninguno aplica cambios todavía.`,choices:[`Configuración básica guiada (recomendada)`,`Personalizar todos los ajustes`]},"setup.environmentPat":{title:`Hay un PAT de configuración en el entorno`,description:`El valor permanece en el proceso CLI. Al continuar se comprueba la identidad y se crean, leen y eliminan recursos temporales antes de preparar el plan. La instalación requiere aprobación final. Cerrar Copilot no elimina la variable de la terminal original.`,choices:[`Usar el PAT del entorno`,`Crear o introducir otro PAT`]},"plan.review":{title:`Revisa el plan de configuración`,description:`Comprueba los archivos, workflows, Variables y nombres de Secrets antes de aprobar. Abrir el plan no inicia ningún cambio.`},"workflow.update":{title:`¿Actualizar los workflows existentes?`,description:`Estos archivos difieren del plan: {files}. Si los conservas, algunos ajustes nuevos podrían no activarse.`,choices:[`Conservar los existentes`,`Actualizar los workflows gestionados`]},"setupPat.method":{title:`¿Cómo proporcionarás el PAT de configuración?`,description:`Este PAT temporal autoriza una sola ejecución. GitHub lo crea con tu cuenta de operador; Copilot no puede revocarlo por ti.`,choices:[`Enlace guiado de GitHub`,`Introducir PAT manualmente`]},"setupPat.ownerKind":{title:`¿Quién es propietario de este repositorio en GitHub?`,description:`El propietario determina qué permisos de organización pueden hacer falta. Consulta la cabecera del repositorio en GitHub si dudas.`,choices:[`Organización`,`Cuenta personal`,`No lo sé`]},"setupPat.review":{title:`Revisa los permisos provisionales del PAT de configuración`,description:`Estos permisos dependen de tus elecciones. Si gestionas Secrets, el enlace preselecciona Actions, Contents y Workflows en escritura para posibles comprobaciones de credenciales. Esas comprobaciones solo se ejecutan si el plan aprobado las necesita. La inspección de GitHub puede revelar otros requisitos.`,choices:[`Continuar en GitHub`,`Revisar de nuevo las opciones`,`Ver la tabla completa de permisos`,`Introducir un PAT manualmente`]},"setupPat.entry":{title:`PAT temporal de configuración`,description:`Abre GitHub con tu cuenta de operador, completa el 2FA, elige «Only select repositories», selecciona este repositorio y pega aquí el PAT generado. Es solo para esta ejecución; elimínalo en GitHub después.`},"setupPat.confirmAccount":{title:`GitHub autenticó el PAT de configuración como @{account}`,description:`¿Es la cuenta de operador que debe configurar este repositorio? Una cuenta incorrecta debe detener el proceso antes de cualquier cambio.`,choices:[`Sí, continuar`,`No, detener`]},"setupPat.confirmUnverifiedAccess":{title:`Comprueba los permisos del PAT marcados como No verificable`,description:`Los permisos Verificados ya pasaron la comprobación. Compara cada permiso obligatorio No verificable con su ámbito y nivel de acceso en los ajustes del PAT en GitHub. Una consulta de solo lectura no demuestra Escritura; No verificable no significa ausente. Comprueba Projects: lectura solo si esa fila aparece como No verificable. Continúa únicamente tras comprobar todos esos permisos.`,choices:[`No, detener`,`Sí, los he comprobado`]},"botPat.method":{title:`¿Cómo proporcionarás el PAT del bot?`,description:`Es distinto del PAT de configuración. Pertenece a la cuenta que ejecutará las futuras GitHub Actions y se instalará como Secret tras la aprobación.`,choices:[`Enlace guiado de GitHub`,`Introducir PAT manualmente`]},"botPat.login":{title:`Usuario previsto del bot en GitHub`,description:`Introduce el nombre de usuario del bot sin @. Copilot consultará su ID numérico de GitHub y lo comparará con el propietario del PAT.`},"botPat.entry.guided":{title:`{name} — PAT de la cuenta bot`,description:`Abre GitHub como @{account} (ID {accountId}), no como operador de setup. Selecciona solo este repositorio, revisa todos los permisos y pega aquí el PAT. Caducidad sugerida: 90 días. El valor de un Secret existente no puede leerse.`},"botPat.entry.manual":{title:`{name} — PAT de la cuenta bot`,description:`Usa la cuenta bot, selecciona solo el repositorio previsto y revisa todos los permisos antes de pegar el PAT. Caducidad sugerida: 90 días. El valor de un Secret existente no puede leerse.`},"credential.apiKey":{title:`{name} — clave API de {provider}`,description:`Pega la clave API de {provider}. Solo se envía a este proceso local y, si apruebas el plan, se instala como Secret de GitHub Actions. Los valores existentes no pueden leerse.`},"credential.existing":{title:`{name} existente: {status}`,description:`GitHub no muestra el valor actual del Secret. Consérvalo solo si aceptas expresamente que aquí no se puede comprobar su estado; de lo contrario, sustitúyelo u omítelo.`,choices:[`Conservar`,`Sustituir`,`Omitir esta credencial`]},"apply.confirm":{title:`¿Aplicar la configuración ahora?`,description:`Esta es la aprobación final. Pueden cambiar archivos locales y recursos de GitHub seleccionados. Si el resultado es parcial, revísalo antes de reintentar.`,choices:[`Aplicar configuración`,`Detener sin aplicar`]},"management.token":{title:`PAT temporal de setup`,description:`Lee la configuración de GitHub con un PAT de setup. Leer basta para inspeccionar; los cambios requieren Variables Write y aprobación independiente. Solo se muestran nombres de Secrets. Deja el campo vacío para volver al panel.`},"management.tokenWrite":{title:`PAT de setup para este ajuste`,description:`Usa Variables Write en el ámbito revisado. Tras aprobar, la verificación crea y elimina una Variable temporal. Deja el campo vacío para volver al panel.`}},ya={"setup.scope":{title:`Choisissez la portée de la configuration`,description:`Ce dépôt conserve l’aperçu et l’application locale. Plusieurs dépôts permet de sélectionner explicitement 1 à 25 destinations de la même organisation et de créer des PR à examiner. Le lot ne fusionne pas, ne crée pas de tag, ne publie pas et ne déploie pas.`,choices:[`Ce dépôt`,`Plusieurs dépôts de cette organisation`]},"setup.batchSource":{title:`D’où doit venir la configuration ?`,description:`Réutilisez les réglages compatibles de l’organisation pour passer les questions déjà résolues, ou personnalisez les réglages du dépôt. Dans les deux cas, le lot conserve les Secrets existants. Créez séparément les identifiants manquants puis inspectez à nouveau ; les valeurs partagées ne sont jamais remplacées.`,choices:[`Réutiliser la configuration de l’organisation`,`Personnaliser les réglages ; conserver les Secrets`]},"batch.token":{title:`PAT temporaire pour les dépôts sélectionnés`,description:`Créez un PAT temporaire limité à ces dépôts : {repositories}. Le lien propose des autorisations ; sélectionnez vous-même uniquement les dépôts prévus dans GitHub. Laissez vide pour conserver le PAT actuel. Le plan final vérifie à nouveau les autorisations exactes. Supprimez ensuite les PAT temporaires de configuration.`},"setup.source":{title:`D’où doit venir la configuration ?`,description:`Réutilisez les Variables compatibles et les Secrets existants de l’organisation en conservant les réglages du dépôt. Seuls les réglages manquants, invalides ou propres au dépôt seront demandés. Les valeurs partagées sont conservées ; les différences validées sont enregistrées dans le dépôt. Choisissez Personnaliser pour créer ou remplacer des identifiants.`,choices:[`Réutiliser la configuration de l’organisation`,`Personnaliser la configuration`]},"setup.reusePatReview":{title:`Vérifiez l’accès pour réutiliser la configuration`,description:`Ces autorisations provisoires permettent de lire la configuration existante et de configurer le dépôt. Les valeurs des Secrets partagés ne sont jamais demandées ni remplacées. Le plan final vérifie les autorisations exactes ; la vérification des identifiants peut rester en attente. Sélectionnez uniquement les dépôts prévus dans GitHub puis supprimez le PAT temporaire.`,choices:[`Continuer vers GitHub`,`Saisir un PAT manuellement`]},"botPat.scopeConflict":{title:`Résoudre le conflit de périmètre du PAT du bot`,description:`Le Secret PAT du dépôt {repository} est prioritaire sur le PAT d’organisation sélectionné. Supprimez le Secret du dépôt dans GitHub, puis demandez à Copilot de vérifier à nouveau, ou choisissez le périmètre du dépôt pour le PAT. Vos réponses sont conservées. Copilot ne supprimera aucun Secret.`,choices:[`J’ai supprimé le PAT du dépôt — vérifier à nouveau`,`Enregistrer le PAT dans le dépôt`,`Arrêter la configuration`]},"botPat.scopeConflictUnavailable":{title:`Résoudre le conflit de périmètre du PAT du bot`,description:`GitHub n’a pas permis de confirmer la suppression du PAT du dépôt. Le conflit reste non résolu. Vos réponses sont conservées. Vérifiez l’accès et réessayez, choisissez le périmètre du dépôt pour le PAT ou arrêtez la configuration.`,choices:[`J’ai supprimé le PAT du dépôt — vérifier à nouveau`,`Enregistrer le PAT dans le dépôt`,`Arrêter la configuration`]},"botPat.identityMismatch":{title:`Ce PAT appartient à un autre compte GitHub`,description:`Le PAT appartient à @{actual} ; le bot sélectionné est @{expected}. Aucun Secret du bot n’a été écrit. Vos réponses et le plan approuvé sont conservés. Supprimez le PAT inutilisé dans GitHub, passez à @{expected}, puis choisissez de saisir un autre PAT ou d’arrêter la configuration.`,choices:[`Saisir un autre PAT du bot`,`Arrêter la configuration`]},"repository.confirm":{title:`Confirmez ce dépôt`,description:`Ce dossier pointe vers {repository}, branche {branch}. Vérifiez la cible avant de configurer les accès PAT ou les fichiers.`,choices:[`Oui, c’est mon dépôt`,`Arrêter et choisir un autre dossier`]},"setup.depth":{title:`Choisissez le niveau de détail`,description:`Le parcours de base demande toujours les autorisations, la sécurité, les branches, Projects, l’approbation et le stockage. Certains réglages avancés des agents, préfixes de branche et Bugbot conservent leurs valeurs par défaut ; vous pourrez les examiner et les modifier dans le plan final. Le parcours personnalisé pose toutes les questions applicables. Aucun changement n’est appliqué à ce stade.`,choices:[`Configuration de base guidée (recommandée)`,`Personnaliser tous les réglages`]},"setup.environmentPat":{title:`Un PAT de configuration est disponible dans l’environnement`,description:`La valeur reste dans le processus CLI. Continuer lance la vérification de l’identité puis des tests temporaires isolés de création, lecture et suppression avant le plan. L’installation exige une approbation finale. Quitter Copilot ne supprime pas la variable du shell parent.`,choices:[`Utiliser le PAT de l’environnement`,`Créer ou saisir un autre PAT`]},"plan.review":{title:`Examinez le plan de configuration`,description:`Vérifiez les fichiers, workflows, Variables et noms de Secrets avant d’approuver. Ouvrir le plan ne lance aucun changement.`},"workflow.update":{title:`Mettre à jour les workflows existants ?`,description:`Ces fichiers diffèrent du plan : {files}. Les conserver peut laisser certains nouveaux réglages inactifs.`,choices:[`Conserver les fichiers existants`,`Mettre à jour les workflows gérés`]},"setupPat.method":{title:`Comment fournirez-vous le PAT de configuration ?`,description:`Ce PAT temporaire autorise une seule exécution. GitHub le crée avec votre compte opérateur ; Copilot ne peut pas le révoquer à votre place.`,choices:[`Lien GitHub guidé`,`Saisir un PAT manuellement`]},"setupPat.ownerKind":{title:`À qui appartient ce dépôt sur GitHub ?`,description:`Le propriétaire détermine les éventuelles autorisations d’organisation. Consultez l’en-tête du dépôt sur GitHub en cas de doute.`,choices:[`Organisation`,`Compte personnel`,`Je ne sais pas`]},"setupPat.review":{title:`Examinez les autorisations provisoires du PAT de configuration`,description:`Ces droits suivent vos choix. Si vous gérez des Secrets, le lien présélectionne Actions, Contents et Workflows en écriture pour les éventuelles vérifications des identifiants. Ces vérifications ne démarrent que si le plan approuvé les exige. L’inspection de GitHub peut révéler d’autres besoins.`,choices:[`Continuer sur GitHub`,`Revoir les choix de configuration`,`Voir toutes les autorisations`,`Saisir un PAT manuellement`]},"setupPat.entry":{title:`PAT temporaire de configuration`,description:`Ouvrez GitHub avec votre compte opérateur, effectuez la 2FA, choisissez « Only select repositories », sélectionnez ce dépôt puis collez ici le PAT généré. Il ne sert qu’à cette exécution ; supprimez-le sur GitHub ensuite.`},"setupPat.confirmAccount":{title:`GitHub a authentifié le PAT de configuration comme @{account}`,description:`Est-ce bien le compte opérateur autorisé à configurer ce dépôt ? Un autre compte doit arrêter le processus avant tout changement.`,choices:[`Oui, continuer`,`Non, arrêter`]},"setupPat.confirmUnverifiedAccess":{title:`Vérifiez les droits du PAT marqués Non vérifiable`,description:`Les lignes Vérifiées ont déjà passé le contrôle. Comparez chaque droit requis Non vérifiable avec sa portée et son niveau d’accès dans les paramètres du PAT GitHub. Une lecture seule ne prouve pas le niveau Écriture ; Non vérifiable ne signifie pas absent. Vérifiez Projects : lecture seulement si cette ligne est Non vérifiable. Continuez uniquement après avoir vérifié tous ces droits.`,choices:[`Non, arrêter`,`Oui, je les ai vérifiés`]},"botPat.method":{title:`Comment fournirez-vous le PAT du bot ?`,description:`Il est distinct du PAT de configuration. Il appartient au compte qui exécutera les futures GitHub Actions et sera installé comme Secret après approbation.`,choices:[`Lien GitHub guidé`,`Saisir un PAT manuellement`]},"botPat.login":{title:`Identifiant GitHub attendu pour le bot`,description:`Saisissez l’identifiant du bot sans @. Copilot récupère son ID numérique GitHub et le compare au propriétaire du PAT.`},"botPat.entry.guided":{title:`{name} — PAT du compte bot`,description:`Ouvrez GitHub en tant que @{account} (ID {accountId}), pas en tant qu’opérateur. Sélectionnez uniquement ce dépôt, vérifiez tous les droits et collez le PAT ici. Expiration suggérée : 90 jours. La valeur d’un Secret existant ne peut pas être relue.`},"botPat.entry.manual":{title:`{name} — PAT du compte bot`,description:`Utilisez le compte bot, sélectionnez uniquement le dépôt voulu et vérifiez tous les droits avant de coller le PAT. Expiration suggérée : 90 jours. La valeur d’un Secret existant ne peut pas être relue.`},"credential.apiKey":{title:`{name} — clé API de {provider}`,description:`Collez la clé API de {provider}. Elle est envoyée uniquement au processus local puis, si vous approuvez le plan, installée comme Secret GitHub Actions. Les valeurs existantes ne peuvent pas être relues.`},"credential.existing":{title:`{name} existant : {status}`,description:`GitHub ne révèle pas la valeur actuelle du Secret. Ne la conservez que si vous acceptez explicitement de ne pas pouvoir vérifier son état ici ; sinon, remplacez-la ou ignorez-la.`,choices:[`Conserver`,`Remplacer`,`Ignorer cet identifiant`]},"apply.confirm":{title:`Appliquer la configuration maintenant ?`,description:`C’est l’approbation finale. Des fichiers locaux et ressources GitHub choisis peuvent changer. Un résultat partiel doit être inspecté avant une nouvelle tentative.`,choices:[`Appliquer la configuration`,`Arrêter sans appliquer`]},"management.token":{title:`PAT temporaire de configuration`,description:`Lisez la configuration GitHub avec un PAT. La lecture suffit pour inspecter ; les changements nécessitent Variables Write et une approbation distincte. Noms des Secrets uniquement. Laissez vide pour revenir au panneau.`},"management.tokenWrite":{title:`PAT de configuration pour cet ajustement`,description:`Utilisez Variables Write dans le scope examiné. Après approbation, la vérification crée et supprime une Variable temporaire. Laissez vide pour revenir au panneau.`}},ba={"setup.scope":{title:`Escolha o âmbito da configuração`,description:`Este repositório mantém a pré-visualização e a aplicação local. Vários repositórios permite selecionar explicitamente entre 1 e 25 destinos da mesma organização e criar PRs para revisão. O lote não integra, cria tags, publica versões nem implementa.`,choices:[`Este repositório`,`Vários repositórios desta organização`]},"setup.batchSource":{title:`De onde deve vir a configuração?`,description:`Reutilize os ajustes compatíveis da organização para saltar perguntas já resolvidas, ou personalize os ajustes do repositório. Em ambos os casos, o lote mantém os Secrets existentes. Crie separadamente as credenciais em falta e volte a inspecionar; os valores partilhados nunca são substituídos.`,choices:[`Reutilizar a configuração da organização`,`Personalizar ajustes; manter os Secrets`]},"batch.token":{title:`PAT temporário para os repositórios selecionados`,description:`Crie um PAT temporário limitado a estes repositórios: {repositories}. O link propõe permissões; selecione pessoalmente apenas os repositórios previstos no GitHub. Deixe vazio para manter o PAT atual. O plano final volta a verificar as permissões exatas. Elimine depois os PATs temporários de configuração.`},"setup.source":{title:`De onde deve vir a configuração?`,description:`Reutilize as Variables compatíveis e os Secrets existentes da organização, mantendo os ajustes do repositório. Só serão pedidos os ajustes em falta, inválidos ou específicos do repositório. Os valores partilhados são mantidos; as diferenças revistas ficam no repositório. Escolha Personalizar para criar ou substituir credenciais.`,choices:[`Reutilizar a configuração da organização`,`Personalizar a configuração`]},"setup.reusePatReview":{title:`Reveja o acesso para reutilizar a configuração`,description:`Estas permissões provisórias permitem consultar a configuração existente e configurar o repositório. Os valores dos Secrets partilhados nunca são pedidos nem substituídos. O plano final verifica as permissões exatas; a verificação das credenciais pode ficar pendente. Selecione apenas os repositórios previstos no GitHub e elimine depois o PAT temporário.`,choices:[`Continuar para o GitHub`,`Introduzir um PAT manualmente`]},"botPat.scopeConflict":{title:`Resolver o conflito de âmbito do PAT do bot`,description:`O Secret PAT do repositório {repository} tem prioridade sobre o PAT da organização selecionado. Elimine o Secret do repositório no GitHub e peça ao Copilot para verificar novamente, ou altere o âmbito do PAT para este repositório. As suas respostas são preservadas. O Copilot não eliminará nenhum Secret.`,choices:[`Já eliminei o PAT do repositório — verificar novamente`,`Guardar o PAT no repositório`,`Parar a configuração`]},"botPat.scopeConflictUnavailable":{title:`Resolver o conflito de âmbito do PAT do bot`,description:`O GitHub não permitiu confirmar se o PAT do repositório foi eliminado. O conflito continua por resolver. As suas respostas são preservadas. Verifique o acesso e tente novamente, altere o âmbito do PAT para este repositório ou pare a configuração.`,choices:[`Já eliminei o PAT do repositório — verificar novamente`,`Guardar o PAT no repositório`,`Parar a configuração`]},"botPat.identityMismatch":{title:`Este PAT pertence a outra conta do GitHub`,description:`O PAT pertence a @{actual}; o bot selecionado é @{expected}. Nenhum Secret do bot foi gravado. As suas respostas e o plano aprovado são mantidos. Elimine o PAT não utilizado no GitHub, mude para @{expected} e escolha entre introduzir outro PAT ou parar a configuração.`,choices:[`Introduzir outro PAT do bot`,`Parar a configuração`]},"repository.confirm":{title:`Confirme este repositório`,description:`Esta pasta aponta para {repository}, no ramo {branch}. Confirme o destino antes de configurar acessos PAT ou ficheiros.`,choices:[`Sim, é o meu repositório`,`Parar e escolher outra pasta`]},"setup.depth":{title:`Escolha o nível de detalhe`,description:`O percurso básico continua a perguntar sobre permissões, segurança, ramos, Projects, aprovação e armazenamento. Algumas definições avançadas de agentes, prefixos de ramos e Bugbot mantêm os valores predefinidos; poderá revê-las e editá-las no plano final. O percurso personalizado pergunta por todas as definições aplicáveis. Nenhum dos percursos aplica alterações nesta fase.`,choices:[`Configuração básica guiada (recomendada)`,`Personalizar todas as definições`]},"setup.environmentPat":{title:`Existe um PAT de configuração no ambiente`,description:`O valor permanece no processo CLI. Continuar inicia a verificação de identidade e testes temporários isolados de criação, leitura e eliminação antes do plano. A instalação exige aprovação final. Sair do Copilot não remove a variável da shell original.`,choices:[`Usar o PAT do ambiente`,`Criar ou introduzir outro PAT`]},"plan.review":{title:`Reveja o plano de configuração`,description:`Confirme ficheiros, fluxos, Variables e nomes de Secrets antes de aprovar. Abrir o plano não inicia alterações.`,choices:void 0},"workflow.update":{title:`Atualizar os fluxos existentes?`,description:`Estes ficheiros diferem do plano: {files}. Conservá-los pode deixar algumas definições novas inativas.`,choices:[`Conservar os existentes`,`Atualizar os fluxos geridos`]},"setupPat.method":{title:`Como irá fornecer o PAT de configuração?`,description:`Este PAT temporário autoriza uma única execução. O GitHub cria-o na sua conta de operador; o Copilot não pode revogá-lo por si.`,choices:[`Ligação guiada do GitHub`,`Introduzir PAT manualmente`]},"setupPat.ownerKind":{title:`Quem é o proprietário deste repositório no GitHub?`,description:`O proprietário determina as permissões de organização necessárias. Consulte o cabeçalho do repositório no GitHub se tiver dúvidas.`,choices:[`Organização`,`Conta pessoal`,`Não tenho a certeza`]},"setupPat.review":{title:`Reveja as permissões provisórias do PAT de configuração`,description:`Estas permissões seguem as suas escolhas. Ao gerir Secrets, a ligação pré-seleciona Actions, Contents e Workflows em escrita para possíveis verificações de credenciais. Estas verificações só decorrem se o plano aprovado as exigir. A inspeção do GitHub pode revelar outros requisitos.`,choices:[`Continuar no GitHub`,`Rever as escolhas`,`Ver a tabela completa de permissões`,`Introduzir um PAT manualmente`]},"setupPat.entry":{title:`PAT temporário de configuração`,description:`Abra o GitHub com a sua conta de operador, conclua a 2FA, escolha «Only select repositories», selecione este repositório e cole aqui o PAT gerado. É apenas para esta execução; elimine-o no GitHub depois.`},"setupPat.confirmAccount":{title:`O GitHub autenticou o PAT de configuração como @{account}`,description:`É esta a conta de operador que deve configurar o repositório? Uma conta errada tem de parar o processo antes de qualquer alteração.`,choices:[`Sim, continuar`,`Não, parar`]},"setupPat.confirmUnverifiedAccess":{title:`Verifique as permissões do PAT marcadas Não verificável`,description:`As linhas Verificadas já passaram na verificação. Compare cada permissão necessária Não verificável com o âmbito e o nível de acesso nas definições do PAT no GitHub. Uma consulta só de leitura não prova Escrita; Não verificável não significa ausente. Verifique Projects: leitura apenas se essa linha estiver Não verificável. Continue só depois de verificar todas essas permissões.`,choices:[`Não, parar`,`Sim, já as verifiquei`]},"botPat.method":{title:`Como irá fornecer o PAT do bot?`,description:`É diferente do PAT de configuração. Pertence à conta que executará as futuras GitHub Actions e será instalado como Secret após aprovação.`,choices:[`Ligação guiada do GitHub`,`Introduzir PAT manualmente`]},"botPat.login":{title:`Utilizador GitHub esperado para o bot`,description:`Introduza o nome de utilizador do bot sem @. O Copilot consulta o ID numérico do GitHub e compara-o com o proprietário do PAT.`},"botPat.entry.guided":{title:`{name} — PAT da conta bot`,description:`Abra o GitHub como @{account} (ID {accountId}), não como operador. Selecione apenas este repositório, reveja todas as permissões e cole aqui o PAT. Validade sugerida: 90 dias. Não é possível voltar a ler o valor de um Secret existente.`},"botPat.entry.manual":{title:`{name} — PAT da conta bot`,description:`Use a conta bot, selecione apenas o repositório pretendido e reveja todas as permissões antes de colar o PAT. Validade sugerida: 90 dias. Não é possível voltar a ler o valor de um Secret existente.`},"credential.apiKey":{title:`{name} — chave API de {provider}`,description:`Cole a chave API de {provider}. Só é enviada para este processo local e, se aprovar o plano, instalada como Secret do GitHub Actions. Os valores existentes não podem voltar a ser lidos.`},"credential.existing":{title:`{name} existente: {status}`,description:`O GitHub não revela o valor atual do Secret. Conserve-o apenas se aceitar expressamente que aqui não se pode verificar o seu estado; caso contrário, substitua-o ou ignore-o.`,choices:[`Conservar`,`Substituir`,`Ignorar esta credencial`]},"apply.confirm":{title:`Aplicar a configuração agora?`,description:`Esta é a aprovação final. Ficheiros locais e recursos GitHub selecionados podem mudar. Um resultado parcial exige inspeção antes de tentar novamente.`,choices:[`Aplicar configuração`,`Parar sem aplicar`]},"management.token":{title:`PAT temporário de setup`,description:`Leia a configuração GitHub com um PAT. A leitura basta para inspecionar; alterações exigem Variables Write e aprovação separada. Apenas nomes dos Secrets. Deixe vazio para voltar ao painel.`},"management.tokenWrite":{title:`PAT de setup para este ajuste`,description:`Use Variables Write no scope revisto. Após aprovação, a verificação cria e elimina uma Variable temporária. Deixe vazio para voltar ao painel.`}},xa={"session.controlMoved":`Control moved to this tab. The previous tab is now read-only.`,"session.cancelled":`Cancellation requested. Temporary permission checks already started will finish cleanup before the process exits. PATs created on GitHub remain until you delete them there.`,"plan.ready":`Plan ready: {files} files, {variables} Variables and {secrets} Secret names. Review it before continuing.`,"permission.preview":`Permission preview: issue workflows {issues}; PR approval {approval}; Secrets {secrets}; Variables {variables}; Projects {projects}. Review the exact grants before creating the setup PAT.`,"setupPat.corrected.bootstrap":`The setup PAT could not access the repository. Installation has not started. Resolve failed permission tests and any pending cleanup before retrying. Required grants: {grants}. Create a corrected PAT using the updated GitHub link.`,"setupPat.corrected.final":`Required setup PAT permissions changed after inspection. Installation has not started. Resolve failed permission tests and any pending cleanup before retrying. New grants: {grants}. Create a corrected PAT using the updated GitHub link.`,"setupPat.cleanup":`Delete the temporary setup PAT in GitHub Settings after this run. Closing Copilot does not revoke it.`,"botPat.separation":`The bot PAT is separate from your setup PAT. These credentials become GitHub Actions Secrets: {names}. Existing Secret values cannot be read back. Re-enter an existing bot PAT so its grants can be checked. No credential-health workflow runs before Apply.`,"credential.checks":`Credential checks finished for {count} items. Each result is shown below. The terminal has technical details; an existing Secret value cannot be read back.`,"credential.status.valid":`Valid`,"credential.status.invalid":`Invalid`,"credential.status.missing":`Missing`,"credential.status.unverifiable":`Cannot be verified without a new value`,"credential.status.not_required":`Not required`,"validation.producers":`Select 1–8 observed checks or enter exact name|App ID|workflow tuples.`,"validation.duplicateNames":`Two trusted producers use the same check name. Coverage stores only the name: choose one producer or rename the CI jobs.`,"validation.projectStatusVerified":`Open every selected Project in GitHub and confirm that all four exact Status values exist. Answer Yes after checking, or No to choose Projects again.`,"validation.projectStatusRedo":`Status values were not confirmed. Choose compatible Projects, then review their Status options again.`,"validation.number":`Enter a non-negative whole number.`,"validation.boolean":`Enter yes or no.`,"validation.choice":`Select one of the listed options.`,"validation.unknownResource":`Unknown inherited resource names: {names}. Choose only names shown in the inherited list.`,"validation.unknownWorkflow":`Unknown issue workflows: {names}. Choose only the listed workflow types.`,"validation.firstQuestion":`This is the first question in this pass. Review it or cancel setup.`,"validation.duplicateProducer":`This trusted check was selected twice. Remove the duplicate selection.`,"validation.savedStatus":`The saved Status value is not available in every selected Project. Choose a listed option.`,"validation.projectIncompatible":`The selected Projects have no common Status option. Choose compatible Projects or configure them separately.`,"validation.projectLimit":`Choose at most 10 Projects; separate their numbers or URLs with commas.`,"validation.projectOwnerNeeded":`A Project URL needs a known repository owner; enter its positive number instead.`,"validation.projectOwnerMismatch":`Use a GitHub Project URL belonging to {owner}, without query parameters.`,"validation.projectUrl":`Enter a valid GitHub Project URL or positive Project number.`,"validation.projectNumber":`Enter the positive Project number from its GitHub URL, not a PVT_ GraphQL ID.`,"validation.projectNumberRange":`Project numbers must be positive integers at most 2147483647.`,"validation.projectDuplicate":`Project {number} was selected more than once.`,"validation.fixedIssues":`Your configuration explicitly enables release or hotfix automation. Keep Issues enabled or edit that configuration first.`,"validation.fixedWorkflowEnabled":`Your configuration enables {kind}. Keep that workflow selected or edit the configuration first.`,"validation.fixedWorkflowDisabled":`Your configuration disables {kind}. Deselect that workflow or edit the configuration first.`,"validation.unknown":`This answer could not be accepted. Review the question and its help; the terminal has the technical detail.`},Sa={"session.controlMoved":`El control ha pasado a esta pestaña. La anterior ahora es de solo lectura.`,"session.cancelled":`Cancelación solicitada. Las pruebas temporales ya iniciadas terminarán su limpieza antes de que salga el proceso. Los PAT creados en GitHub seguirán allí hasta que los elimines.`,"plan.ready":`Plan listo: {files} archivos, {variables} Variables y {secrets} nombres de Secrets. Revísalo antes de continuar.`,"permission.preview":`Vista previa de permisos: flujos de incidencias {issues}; aprobación de PR {approval}; Secrets {secrets}; Variables {variables}; Projects {projects}. Revisa los permisos exactos antes de crear el PAT de configuración.`,"setupPat.corrected.bootstrap":`El PAT de configuración no pudo acceder al repositorio. La instalación no ha empezado. Resuelve las pruebas fallidas y cualquier limpieza pendiente antes de reintentar. Permisos necesarios: {grants}. Crea un PAT corregido desde el enlace actualizado de GitHub.`,"setupPat.corrected.final":`Los permisos necesarios del PAT cambiaron tras la inspección. La instalación no ha empezado. Resuelve las pruebas fallidas y cualquier limpieza pendiente antes de reintentar. Permisos nuevos: {grants}. Crea un PAT corregido desde el enlace actualizado.`,"setupPat.cleanup":`Elimina el PAT temporal de configuración en los ajustes de GitHub después de esta ejecución. Cerrar Copilot no lo revoca.`,"botPat.separation":`El PAT del bot es distinto del de configuración. Estas credenciales se instalarán como Secrets de GitHub Actions: {names}. Los valores existentes no pueden leerse. Vuelve a introducir un PAT del bot para comprobar sus permisos. Antes de Aplicar no se ejecuta ningún workflow de comprobación.`,"credential.checks":`Se han comprobado {count} credenciales. Abajo aparece el resultado de cada una. La terminal contiene los detalles técnicos; el valor de un Secret existente no puede leerse.`,"credential.status.valid":`Válida`,"credential.status.invalid":`No válida`,"credential.status.missing":`Falta`,"credential.status.unverifiable":`No verificable sin un valor nuevo`,"credential.status.not_required":`No necesaria`,"validation.producers":`Selecciona entre 1 y 8 checks observados o introduce las tuplas exactas nombre|ID de App|workflow.`,"validation.duplicateNames":`Dos productores fiables tienen el mismo nombre de check. La cobertura solo guarda el nombre: elige uno o cambia el nombre de los jobs de CI.`,"validation.projectStatusVerified":`Abre cada Project elegido en GitHub y confirma los cuatro valores Status exactos. Responde Sí tras comprobarlo, o No para elegir Projects de nuevo.`,"validation.projectStatusRedo":`No se confirmaron los valores Status. Elige Projects compatibles y vuelve a revisar sus opciones Status.`,"validation.number":`Introduce un número entero no negativo.`,"validation.boolean":`Elige Sí o No.`,"validation.choice":`Elige una de las opciones mostradas.`,"validation.unknownResource":`Nombres de recursos heredados desconocidos: {names}. Elige solo nombres de la lista heredada.`,"validation.unknownWorkflow":`Flujos de issues desconocidos: {names}. Elige solo los tipos indicados.`,"validation.firstQuestion":`Esta es la primera pregunta de esta pasada. Revísala o cancela la configuración.`,"validation.duplicateProducer":`Has seleccionado dos veces el mismo check fiable. Quita la selección duplicada.`,"validation.savedStatus":`El valor Status guardado no existe en todos los Projects seleccionados. Elige una opción de la lista.`,"validation.projectIncompatible":`Los Projects elegidos no comparten ningún valor Status. Elige Projects compatibles o configúralos por separado.`,"validation.projectLimit":`Elige como máximo 10 Projects; separa sus números o URL con comas.`,"validation.projectOwnerNeeded":`Para usar la URL de un Project hay que conocer el propietario del repositorio; introduce su número positivo.`,"validation.projectOwnerMismatch":`Usa la URL de un Project de GitHub que pertenezca a {owner}, sin parámetros.`,"validation.projectUrl":`Introduce una URL válida de un Project de GitHub o su número positivo.`,"validation.projectNumber":`Introduce el número positivo del Project que aparece en su URL, no un ID GraphQL PVT_.`,"validation.projectNumberRange":`El número del Project debe ser un entero positivo no mayor de 2147483647.`,"validation.projectDuplicate":`Has seleccionado el Project {number} más de una vez.`,"validation.fixedIssues":`Tu configuración activa expresamente release o hotfix. Mantén Issues activado o cambia antes la configuración.`,"validation.fixedWorkflowEnabled":`Tu configuración activa {kind}. Mantén ese flujo seleccionado o cambia antes la configuración.`,"validation.fixedWorkflowDisabled":`Tu configuración desactiva {kind}. Desmarca ese flujo o cambia antes la configuración.`,"validation.unknown":`No se pudo aceptar esta respuesta. Revisa la pregunta y su ayuda; la terminal contiene el detalle técnico.`},Ca={"session.controlMoved":`Le contrôle est passé à cet onglet. L’onglet précédent est maintenant en lecture seule.`,"session.cancelled":`Annulation demandée. Les tests temporaires déjà lancés termineront leur nettoyage avant la fin du processus. Les PAT créés sur GitHub restent actifs jusqu’à leur suppression.`,"plan.ready":`Plan prêt : {files} fichiers, {variables} Variables et {secrets} noms de Secrets. Examinez-le avant de continuer.`,"permission.preview":`Aperçu des droits : flux de tickets {issues} ; approbation des PR {approval} ; Secrets {secrets} ; Variables {variables} ; Projects {projects}. Vérifiez les droits exacts avant de créer le PAT de configuration.`,"setupPat.corrected.bootstrap":`Le PAT de configuration n’a pas pu accéder au dépôt. L’installation n’a pas commencé. Résolvez les tests échoués et tout nettoyage incomplet avant de réessayer. Droits requis : {grants}. Créez un PAT corrigé avec le lien GitHub mis à jour.`,"setupPat.corrected.final":`Les droits requis du PAT ont changé après inspection. L’installation n’a pas commencé. Résolvez les tests échoués et tout nettoyage incomplet avant de réessayer. Nouveaux droits : {grants}. Créez un PAT corrigé avec le lien mis à jour.`,"setupPat.cleanup":`Supprimez le PAT temporaire de configuration dans les paramètres GitHub après cette exécution. Fermer Copilot ne le révoque pas.`,"botPat.separation":`Le PAT du bot est distinct du PAT de configuration. Ces identifiants deviendront des Secrets GitHub Actions : {names}. Les valeurs existantes ne peuvent pas être relues. Saisissez à nouveau un PAT du bot pour vérifier ses droits. Aucun workflow de vérification ne démarre avant Appliquer.`,"credential.checks":`Vérification terminée pour {count} identifiants. Le résultat de chacun figure ci-dessous. Le terminal contient les détails techniques ; la valeur d’un Secret existant ne peut pas être relue.`,"credential.status.valid":`Valide`,"credential.status.invalid":`Invalide`,"credential.status.missing":`Manquant`,"credential.status.unverifiable":`Invérifiable sans nouvelle valeur`,"credential.status.not_required":`Non requis`,"validation.producers":`Choisissez 1 à 8 vérifications observées ou saisissez les triplets exacts nom|ID d’App|workflow.`,"validation.duplicateNames":`Deux producteurs fiables portent le même nom de vérification. La couverture ne stocke que ce nom : choisissez-en un ou renommez les jobs CI.`,"validation.projectStatusVerified":`Ouvrez chaque Project choisi sur GitHub et confirmez les quatre valeurs Status exactes. Répondez Oui après vérification, ou Non pour choisir à nouveau les Projects.`,"validation.projectStatusRedo":`Les valeurs Status n’ont pas été confirmées. Choisissez des Projects compatibles, puis revérifiez leurs options Status.`,"validation.number":`Saisissez un entier positif ou nul.`,"validation.boolean":`Choisissez Oui ou Non.`,"validation.choice":`Choisissez une des options affichées.`,"validation.unknownResource":`Noms de ressources héritées inconnus : {names}. Choisissez seulement les noms de la liste héritée.`,"validation.unknownWorkflow":`Workflows de ticket inconnus : {names}. Choisissez seulement les types proposés.`,"validation.firstQuestion":`C’est la première question de cette passe. Vérifiez-la ou annulez la configuration.`,"validation.duplicateProducer":`Cette vérification fiable a été choisie deux fois. Retirez le doublon.`,"validation.savedStatus":`La valeur Status enregistrée n’existe pas dans tous les Projects choisis. Sélectionnez une option proposée.`,"validation.projectIncompatible":`Les Projects choisis ne partagent aucune valeur Status. Choisissez des Projects compatibles ou configurez-les séparément.`,"validation.projectLimit":`Choisissez au plus 10 Projects ; séparez leurs numéros ou URL par des virgules.`,"validation.projectOwnerNeeded":`Une URL de Project exige de connaître le propriétaire du dépôt ; saisissez plutôt son numéro positif.`,"validation.projectOwnerMismatch":`Utilisez une URL de Project GitHub appartenant à {owner}, sans paramètres.`,"validation.projectUrl":`Saisissez une URL valide de Project GitHub ou son numéro positif.`,"validation.projectNumber":`Saisissez le numéro positif figurant dans l’URL du Project, pas un ID GraphQL PVT_.`,"validation.projectNumberRange":`Le numéro du Project doit être un entier positif inférieur ou égal à 2147483647.`,"validation.projectDuplicate":`Le Project {number} a été choisi plusieurs fois.`,"validation.fixedIssues":`Votre configuration active explicitement release ou hotfix. Gardez Issues activé ou modifiez d’abord la configuration.`,"validation.fixedWorkflowEnabled":`Votre configuration active {kind}. Gardez ce flux sélectionné ou modifiez d’abord la configuration.`,"validation.fixedWorkflowDisabled":`Votre configuration désactive {kind}. Désélectionnez ce flux ou modifiez d’abord la configuration.`,"validation.unknown":`Cette réponse n’a pas été acceptée. Vérifiez la question et son aide ; le terminal contient le détail technique.`},wa={"session.controlMoved":`O controlo passou para este separador. O separador anterior é agora apenas de leitura.`,"session.cancelled":`Cancelamento solicitado. Os testes temporários já iniciados concluirão a limpeza antes de o processo terminar. Os PAT criados no GitHub permanecem até serem eliminados.`,"plan.ready":`Plano pronto: {files} ficheiros, {variables} Variables e {secrets} nomes de Secrets. Reveja-o antes de continuar.`,"permission.preview":`Pré-visualização das permissões: fluxos de issues {issues}; aprovação de PR {approval}; Secrets {secrets}; Variables {variables}; Projects {projects}. Reveja as permissões exatas antes de criar o PAT de configuração.`,"setupPat.corrected.bootstrap":`O PAT de configuração não conseguiu aceder ao repositório. A instalação não começou. Resolva os testes falhados e qualquer limpeza pendente antes de repetir. Permissões necessárias: {grants}. Crie um PAT corrigido com a ligação GitHub atualizada.`,"setupPat.corrected.final":`As permissões necessárias do PAT mudaram após inspeção. A instalação não começou. Resolva os testes falhados e qualquer limpeza pendente antes de repetir. Novas permissões: {grants}. Crie um PAT corrigido com a ligação atualizada.`,"setupPat.cleanup":`Elimine o PAT temporário de configuração nas definições do GitHub após esta execução. Fechar o Copilot não o revoga.`,"botPat.separation":`O PAT do bot é distinto do PAT de configuração. Estas credenciais serão Secrets do GitHub Actions: {names}. Os valores existentes não podem voltar a ser lidos. Reintroduza um PAT do bot para verificar as permissões. Nenhum fluxo de verificação é executado antes de Aplicar.`,"credential.checks":`Verificação concluída para {count} credenciais. O resultado de cada uma aparece abaixo. O terminal contém os detalhes técnicos; o valor de um Secret existente não pode voltar a ser lido.`,"credential.status.valid":`Válida`,"credential.status.invalid":`Inválida`,"credential.status.missing":`Em falta`,"credential.status.unverifiable":`Não verificável sem um novo valor`,"credential.status.not_required":`Não necessária`,"validation.producers":`Selecione 1 a 8 verificações observadas ou introduza os triplos exatos nome|ID da App|workflow.`,"validation.duplicateNames":`Dois produtores fiáveis têm o mesmo nome de check. A cobertura guarda apenas o nome: escolha um ou altere o nome dos jobs de CI.`,"validation.projectStatusVerified":`Abra cada Project escolhido no GitHub e confirme os quatro valores Status exatos. Responda Sim após verificar, ou Não para voltar a escolher Projects.`,"validation.projectStatusRedo":`Os valores Status não foram confirmados. Escolha Projects compatíveis e volte a verificar as opções Status.`,"validation.number":`Introduza um número inteiro não negativo.`,"validation.boolean":`Escolha Sim ou Não.`,"validation.choice":`Escolha uma das opções apresentadas.`,"validation.unknownResource":`Nomes de recursos herdados desconhecidos: {names}. Escolha apenas nomes da lista herdada.`,"validation.unknownWorkflow":`Fluxos de questões desconhecidos: {names}. Escolha apenas os tipos indicados.`,"validation.firstQuestion":`Esta é a primeira pergunta desta ronda. Reveja-a ou cancele a configuração.`,"validation.duplicateProducer":`Esta verificação de confiança foi selecionada duas vezes. Remova a seleção duplicada.`,"validation.savedStatus":`O valor Status guardado não existe em todos os Projects escolhidos. Selecione uma opção da lista.`,"validation.projectIncompatible":`Os Projects escolhidos não partilham qualquer valor Status. Escolha Projects compatíveis ou configure-os separadamente.`,"validation.projectLimit":`Escolha no máximo 10 Projects; separe os números ou URL por vírgulas.`,"validation.projectOwnerNeeded":`Uma URL de Project exige que se conheça o proprietário do repositório; introduza antes o número positivo.`,"validation.projectOwnerMismatch":`Use uma URL de Project do GitHub pertencente a {owner}, sem parâmetros.`,"validation.projectUrl":`Introduza uma URL válida de Project do GitHub ou o respetivo número positivo.`,"validation.projectNumber":`Introduza o número positivo apresentado na URL do Project, não um ID GraphQL PVT_.`,"validation.projectNumberRange":`O número do Project tem de ser um inteiro positivo até 2147483647.`,"validation.projectDuplicate":`O Project {number} foi selecionado mais do que uma vez.`,"validation.fixedIssues":`A sua configuração ativa explicitamente release ou hotfix. Mantenha Issues ativo ou altere primeiro a configuração.`,"validation.fixedWorkflowEnabled":`A sua configuração ativa {kind}. Mantenha esse fluxo selecionado ou altere primeiro a configuração.`,"validation.fixedWorkflowDisabled":`A sua configuração desativa {kind}. Desmarque esse fluxo ou altere primeiro a configuração.`,"validation.unknown":`Esta resposta não foi aceite. Reveja a pergunta e a ajuda; o terminal contém o detalhe técnico.`},Ta={es:{All:`Todos`,prompt:`Preguntar antes de crear el enlace`,"create-if-missing":`Crear el enlace si falta`,disabled:`Desactivado`,replace:`Sustituir`,append:`Añadir`,preserve:`Conservar`,info:`Informativa`,low:`Baja`,medium:`Media`,high:`Alta`,smart:`Adaptativa`,default:`Predeterminado`,auto:`Automático`,always:`Reinstalar siempre`,recommend:`Recomendar aprobación`,guarded:`Aprobar solo con garantías`,off:`Desactivado`,check:`Check de CI que exige la cobertura`,numeric:`Informe numérico verificable`,repository:`Repositorio`,organization:`Organización`,selected:`Repositorios seleccionados`,private:`Repositorios privados`,all:`Todos los repositorios`,"production-lineage":`Conservar el linaje de producción`,"canonical-gitflow":`Git-Flow canónico`,manual:`Manual`,"auto-merge":`Fusionar automáticamente`,"merge-queue":`Cola de integración`,"create-only":`Solo crear PR`,direct:`Integración directa`,"sync-branch":`Mediante rama de sincronización`,"prefer-release":`Priorizar la release`,development:`Desarrollo`,both:`Ambos destinos`,"source-only":`Solo rama de origen`,"sync-only":`Solo rama de sincronización`,none:`Ninguna`,close:`Cerrar el issue`,"keep-open":`Mantener abierto`,guided:`Guiado`,compact:`Compacto`,quiet:`Mínimo`,update:`Actualizar el comentario`,milestones:`Publicar en hitos`,feature:`Funcionalidad`,bugfix:`Corrección`,documentation:`Documentación`,chore:`Mantenimiento`,help:`Ayuda o pregunta`,hotfix:`Arreglo urgente`,release:`Release`},fr:{All:`Tous`,prompt:`Demander avant de créer le renvoi`,"create-if-missing":`Créer le renvoi s’il manque`,disabled:`Désactivé`,replace:`Remplacer`,append:`Ajouter`,preserve:`Conserver`,info:`Information`,low:`Faible`,medium:`Moyenne`,high:`Élevée`,smart:`Adaptatif`,default:`Par défaut`,auto:`Automatique`,always:`Toujours réinstaller`,recommend:`Recommander une approbation`,guarded:`Approuver sous garde`,off:`Désactivé`,check:`Vérification CI imposant la couverture`,numeric:`Rapport numérique vérifiable`,repository:`Dépôt`,organization:`Organisation`,selected:`Dépôts sélectionnés`,private:`Dépôts privés`,all:`Tous les dépôts`,"production-lineage":`Préserver la filiation de production`,"canonical-gitflow":`Git-Flow canonique`,manual:`Manuel`,"auto-merge":`Fusionner automatiquement`,"merge-queue":`File de fusion`,"create-only":`Créer la PR uniquement`,direct:`Fusion directe`,"sync-branch":`Par branche de synchronisation`,"prefer-release":`Privilégier la version`,development:`Développement`,both:`Les deux destinations`,"source-only":`Branche source seulement`,"sync-only":`Branche de synchronisation seulement`,none:`Aucune`,close:`Fermer le ticket`,"keep-open":`Garder ouvert`,guided:`Guidé`,compact:`Compact`,quiet:`Minimal`,update:`Mettre le commentaire à jour`,milestones:`Publier aux étapes clés`,feature:`Fonctionnalité`,bugfix:`Correction`,documentation:`Documentation`,chore:`Maintenance`,help:`Aide ou question`,hotfix:`Correctif urgent`,release:`Version`},pt:{All:`Todos`,prompt:`Perguntar antes de criar o apontador`,"create-if-missing":`Criar o apontador se faltar`,disabled:`Desativado`,replace:`Substituir`,append:`Acrescentar`,preserve:`Conservar`,info:`Informação`,low:`Baixa`,medium:`Média`,high:`Alta`,smart:`Adaptativo`,default:`Predefinido`,auto:`Automático`,always:`Reinstalar sempre`,recommend:`Recomendar aprovação`,guarded:`Aprovar sob condições`,off:`Desativado`,check:`Verificação CI que exige cobertura`,numeric:`Relatório numérico verificável`,repository:`Repositório`,organization:`Organização`,selected:`Repositórios selecionados`,private:`Repositórios privados`,all:`Todos os repositórios`,"production-lineage":`Preservar a linhagem de produção`,"canonical-gitflow":`Git-Flow canónico`,manual:`Manual`,"auto-merge":`Integrar automaticamente`,"merge-queue":`Fila de integração`,"create-only":`Criar apenas a PR`,direct:`Integração direta`,"sync-branch":`Através de ramo de sincronização`,"prefer-release":`Priorizar a release`,development:`Desenvolvimento`,both:`Ambos os destinos`,"source-only":`Apenas ramo de origem`,"sync-only":`Apenas ramo de sincronização`,none:`Nenhum`,close:`Fechar a questão`,"keep-open":`Manter aberta`,guided:`Guiado`,compact:`Compacto`,quiet:`Mínimo`,update:`Atualizar o comentário`,milestones:`Publicar nos marcos`,feature:`Funcionalidade`,bugfix:`Correção`,documentation:`Documentação`,chore:`Manutenção`,help:`Ajuda ou pergunta`,hotfix:`Hotfix`,release:`Release`}},Ea=new Set([`codex`,`opencode`,`cursor`,`openai`,`anthropic`,`google`,`openrouter`,`local`]);function Da(e,t,n){if(n===`en`||Ea.has(t))return t;let r=Ta[n];if(e===`issueWorkflows.enabled`&&t.includes(` — `)){let e=t.split(` — `,1)[0];if(r[e])return`${e} — ${r[e]}`}return e===`repository.reconciliationCleanup`&&t===`all`?{es:`Todas las ramas temporales`,fr:`Toutes les branches temporaires`,pt:`Todos os ramos temporários`}[n]:r[t]??t}var Oa={en:xa,es:Sa,fr:Ca,pt:wa};function ka(e,t){if(e.managementState)return ea(t)[e.managementState];if(!e.copyId)return t===`en`?e.text:Q(`unknownLocalError`,t);let n=Oa[t][e.copyId],r=e.copyValues??{},i=e.copyId===`permission.preview`?{...r,issues:(r.issues??``).split(`|`).map(e=>Da(`issueWorkflows.enabled`,e,t)).join(`, `),approval:Da(`pullRequestApproval.mode`,r.approval??``,t),secrets:Da(`storage.secrets.defaultScope`,r.secrets??``,t),variables:Da(`storage.variables.defaultScope`,r.variables??``,t),projects:Da(`projects.ids`,r.projects??``,t)}:r,a=n.replace(/\{([a-zA-Z]\w*)\}/gu,(e,t)=>i[t]??``);return e.copyId!==`credential.checks`||!e.credentialChecks?.length?a:`${a}\n${e.credentialChecks.map(e=>{let n=`credential.status.${e.status}`;return`${e.name}: ${Oa[t][n]}`}).join(` -`)}`}var Aa={en:_a,es:va,fr:ya,pt:ba};function ja(e,t){return e.replace(/\{([a-zA-Z]\w*)\}/gu,(e,n)=>t[n]??``)}function Ma(e,t){if(!e.copyId)return;let n=Aa[t][e.copyId],r={...e.copyValues??{}};if(e.copyId===`credential.existing`&&r.status&&[`valid`,`invalid`,`missing`,`unverifiable`,`not_required`].includes(r.status)){let e=`credential.status.${r.status}`;r.status=Oa[t][e]}return{title:ja(n.title,r),description:ja(n.description,r),...n.choices?{choices:n.choices}:{}}}function Na(e,t,n){return Ma(e,t)?.choices?.[n]??e.choices[n]}var Pa=G(`

      `,1);function Fa(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`view`,8);L(()=>(U(o()),n(),Ma),()=>{M(a,o()?.batch?Q(o().batch.phase===`review`?`batchReviewTitle`:o().batch.phase===`applying`?`batchProgressTitle`:`batchResultTitle`,n()):o()?.outcome===`complete`?Q(`completeTitle`,n()):o()?.outcome===`dry-run`?Q(`previewTitle`,n()):o()?.outcome===`cancelled`?Q(`cancelledTitle`,n()):o()?.outcome?Q(`blockedTitle`,n()):o()?.prompt?.kind===`repositories`?Q(`batchReviewSelection`,n()):o()?.prompt?.kind===`question`?Q(`choices`,n()):o()?.prompt?.kind===`plan`?Q(`plan`,n()):o()?.prompt?Ma(o().prompt,n())?.title??o().prompt.title:Q(`preparing`,n()))}),En(),ki();var s=Pa(),c=P(s),l=I(N(c)),u=F(I(l));D(c);var d=I(c,2),f=F(d,!0),p=F(I(d,2),!0);R((e,t,n)=>{q(l,` ${e??``} `),q(u,`${t??``} / 06`),q(f,V(a)),q(p,n)},[()=>(U(Xi),U(o()),n(),H(()=>Xi(o()?.journey?.current,n()).toUpperCase())),()=>(U(o()),H(()=>String(o()?.journey?.position??1).padStart(2,`0`))),()=>(U(o()),U(Q),n(),H(()=>o()?.outcome?Q(`resultLede`,n()):Q(`activeLede`,n())))]),K(e,s),Je(),i()}function Ia(e){try{let t=new URL(e??``);return t.protocol===`https:`&&t.hostname===`github.com`&&(t.pathname===`/settings/personal-access-tokens`||t.pathname.startsWith(`/settings/personal-access-tokens/`))?t.toString():void 0}catch{return}}function La(e){return e&&/^[A-Za-z0-9-]{1,39}\/(?!\.{1,2}$)[A-Za-z0-9._-]{1,100}$/u.test(e)?`https://github.com/${e}/settings/secrets/actions`:void 0}function Ra(e){try{let t=new URL(e??``);return t.protocol===`https:`&&t.hostname===`github.com`&&!t.username&&!t.password&&!t.search&&!t.hash&&/^\/[A-Za-z0-9-]{1,39}\/[A-Za-z0-9._-]{1,100}\/actions\/runs\/[1-9][0-9]*$/u.test(t.pathname)?t.toString():void 0}catch{return}}function za(e){try{let t=new URL(e??``);return t.protocol===`https:`&&t.hostname===`github.com`&&!t.username&&!t.password&&!t.search&&!t.hash&&/^\/[A-Za-z0-9-]{1,39}\/[A-Za-z0-9._-]{1,100}\/rules\/[1-9][0-9]*$/u.test(t.pathname)?t.toString():void 0}catch{return}}function Ba(e){try{let t=new URL(e??``);return t.protocol===`https:`&&t.hostname===`github.com`&&!t.username&&!t.password&&!t.search&&!t.hash&&/^\/(?:orgs|users)\/[A-Za-z0-9-]{1,39}\/projects\/[1-9][0-9]*$/u.test(t.pathname)?t.toString():void 0}catch{return}}var Va=G(``),Ha=G(``);function Ua(e,t){let n=Z(t,`label`,8),r=Z(t,`variant`,8,`primary`),i=Z(t,`disabled`,8,!1),a=Z(t,`arrow`,8,!1),o=Z(t,`onClick`,8);var s=Ha(),c=N(s,!0),l=I(c),u=e=>{K(e,Va())};J(l,e=>{a()&&e(u)}),D(s),R(()=>{ci(s,1,ai(r())),s.disabled=i(),q(c,n())}),W(`click`,s,function(...e){o()?.apply(this,e)}),K(e,s)}Sr([`click`]);var Wa=G(` `),Ga=G(`

      `);function Ka(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`tone`,8,`info`),s=Z(t,`title`,8),c=Z(t,`message`,8),l=Z(t,`link`,8,void 0),u=Z(t,`actionLabel`,8,void 0),d=Z(t,`onAction`,8,void 0);L(()=>U(l()),()=>{M(a,Ia(l()))}),En(),ki();var f=Ga(),p=N(f),m=F(p,!0),h=I(p),g=F(h,!0),_=I(h,2),v=e=>{var t=Wa(),r=F(t,!0);R(e=>{X(t,`href`,V(a)),q(r,e)},[()=>(U(Q),n(),H(()=>Q(`githubLink`,n())))]),K(e,t)};J(_,e=>{V(a)&&e(v)});var y=I(_,2),b=e=>{Ua(e,{get label(){return u()},variant:`secondary`,get onClick(){return d()}})};J(y,e=>{u()&&d()&&e(b)}),D(f),R(()=>{ci(f,1,`banner ${o()??``}`),X(f,`role`,o()===`error`?`alert`:`status`),q(m,s()),q(g,c())}),K(e,f),Je(),i()}function qa(e){let t=String(e.question.defaultValue),n=t.split(`,`).map(e=>e.trim()).filter(Boolean),r=e.question.kind===`multi-select`?n.includes(`All`)&&e.question.choices?.includes(`All`)?[`All`]:(e.question.choices??[]).filter(e=>e!==`All`&&n.includes(e.split(` — `)[0])):e.question.kind===`scope-overrides`?n:e.question.kind===`producer-select`?t.split(`;`).map(e=>e.trim()).filter(Boolean):e.question.kind===`project-select`?n.filter(t=>e.question.projectCandidates?.some(e=>String(e.number)===t)):[],i=e.question.kind===`project-select`?n.filter(e=>!r.includes(e)).join(`,`):t;return{value:e.question.kind===`producer-select`?``:i,selected:r}}function Ja(e,t){return t===`All`?e.includes(`All`)?[]:[`All`]:e.includes(t)?e.filter(e=>e!==t):[...e.filter(e=>e!==`All`),t]}function Ya(e,t,n){return e.question.kind===`scope-overrides`||e.question.kind===`multi-select`?n.length?n.join(`,`):`none`:e.question.kind===`producer-select`?[...n,...t.split(`;`).map(e=>e.trim()).filter(Boolean)].join(`;`):e.question.kind===`project-select`?[...n,...t.split(`,`).map(e=>e.trim()).filter(Boolean)].join(`,`)||`none`:t}var Xa={issueCreated:`projectTransitionIssueCreated`,pullRequestCreated:`projectTransitionPullRequestCreated`,issueInProgress:`projectTransitionIssueInProgress`,pullRequestInProgress:`projectTransitionPullRequestInProgress`};function Za(e){if(e)try{let t=new URL(e);if(t.protocol!==`https:`||t.username||t.password||t.search)return;if(t.hostname===`docs.page`&&t.port===``&&t.pathname.startsWith(`/vypdev/copilot/`)||t.hostname===`docs.github.com`&&t.port===``&&t.pathname.startsWith(`/en/`))return t.href}catch{return}}var Qa=G(`

      `),$a=G(`

      `),eo=G(` `,1);function to(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`kind`,8),s=Z(t,`status`,8),c=Z(t,`truncated`,8,!1),l={observed:`checksObserved`,"no-recent-runs":`checksNoRecent`,"no-verifiable-checks":`checksNoVerifiable`,"permission-denied":`checksDenied`,unavailable:`checksUnavailable`},u={observed:`projectsObserved`,empty:`projectsEmpty`,"permission-denied":`projectsDenied`,unavailable:`projectsUnavailable`,unsupported:`projectsUnsupported`};L(()=>(U(s()),U(o())),()=>{M(a,s()?o()===`checks`?l[s()]:u[s()]:void 0)}),En(),ki();var d=eo(),f=P(d),p=e=>{var t=Qa(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),V(a),n(),H(()=>Q(V(a),n())))]),K(e,t)};J(f,e=>{V(a)&&e(p)});var m=I(f,2),h=e=>{var t=$a(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),U(o()),n(),H(()=>Q(o()===`checks`?`checksDiscoveryScope`:`projectsDiscoveryScope`,n())))]),K(e,t)};J(m,e=>{(s()===`observed`||s()===`empty`||s()===`no-recent-runs`||s()===`no-verifiable-checks`)&&e(h)});var g=I(m,2),_=e=>{var t=$a(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`discoveryTruncated`,n())))]),K(e,t)};J(g,e=>{c()&&e(_)}),K(e,d),Je(),i()}var no={en:{success:`Passed`,failure:`Failed`,cancelled:`Cancelled`,neutral:`Neutral`,skipped:`Skipped`,timed_out:`Timed out`,action_required:`Action required`,stale:`Stale`,startup_failure:`Failed to start`,unknown:`Unknown outcome`},es:{success:`Correcto`,failure:`Falló`,cancelled:`Cancelado`,neutral:`Neutral`,skipped:`Omitido`,timed_out:`Agotó el tiempo`,action_required:`Requiere intervención`,stale:`Obsoleto`,startup_failure:`Falló al iniciar`,unknown:`Resultado desconocido`},fr:{success:`Réussi`,failure:`Échoué`,cancelled:`Annulé`,neutral:`Neutre`,skipped:`Ignoré`,timed_out:`Délai dépassé`,action_required:`Action nécessaire`,stale:`Obsolète`,startup_failure:`Échec au démarrage`,unknown:`Résultat inconnu`},pt:{success:`Concluído`,failure:`Falhou`,cancelled:`Cancelado`,neutral:`Neutro`,skipped:`Ignorado`,timed_out:`Tempo esgotado`,action_required:`Ação necessária`,stale:`Obsoleto`,startup_failure:`Falha ao iniciar`,unknown:`Resultado desconhecido`}};function ro(e,t){return no[t][e]??no[t].unknown}function io(e,t,n){let r=e.trim(),i=n.trim(),a=String(t??``).trim(),o=Number(a);if(!(!r||!i||r.length>100||i.length>100||/[|;\r\n]/u.test(r+i)||!/^[1-9]\d*$/u.test(a)||!Number.isSafeInteger(o)))return`${r}|${o}|${i}`}var ao=G(` `),oo=G(`
      `),so=G(`
    1. `),co=G(`
        `),lo=G(``),uo=G(`

        `,1);function fo(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=j(),s=Z(t,`candidates`,8),c=Z(t,`selected`,12),l=Z(t,`controller`,8),u=j(``),d=j(``),f=j(``),p=j(!1);function m(){let e=io(V(u),V(d),V(f));if(!e||c().length>=8){M(p,!0);return}M(p,!1),c().includes(e)||c([...c(),e]),M(u,``),M(d,``),M(f,``)}L(()=>U(s()),()=>{M(a,new Set(s().map(e=>`${e.name}|${e.sourceAppId}|${e.workflowName}`)))}),L(()=>(U(c()),V(a)),()=>{M(o,c().filter(e=>!V(a).has(e)))}),En(),ki();var h=uo(),g=P(h);Y(g,5,s,qr,(e,t)=>{let r=k(()=>(V(t),H(()=>`${V(t).name}|${V(t).sourceAppId}|${V(t).workflowName}`)));var i=oo(),a=N(i),o=N(a);yi(o);var s=I(o,2),u=N(s),d=F(N(u),!0);D(u);var f=I(u),p=F(N(f));D(f);var m=F(I(f),!0);D(s),D(a);var h=I(a,2),g=N(h),_=e=>{var r=ao(),i=F(r,!0);R((e,t)=>{X(r,`href`,e),q(i,t)},[()=>(U(Ra),V(t),H(()=>Ra(V(t).runUrl))),()=>(U(Q),n(),H(()=>Q(`ciRun`,n())))]),K(e,r)},v=_t(()=>(U(Ra),V(t),H(()=>Ra(V(t).runUrl))));J(g,e=>{V(v)&&e(_)});var y=I(g,2),b=e=>{var r=ao(),i=F(r,!0);R((e,t)=>{X(r,`href`,e),q(i,t)},[()=>(U(za),V(t),H(()=>za(V(t).requiredByRuleset?.sourceUrl))),()=>(U(Q),n(),H(()=>Q(`ciRule`,n())))]),K(e,r)},x=_t(()=>(U(za),V(t),H(()=>za(V(t).requiredByRuleset?.sourceUrl))));J(y,e=>{V(x)&&e(b)}),D(h),D(i),R((e,n,r,i,a,s)=>{bi(o,e),o.disabled=n,q(d,(V(t),H(()=>V(t).name))),q(p,`${V(t),H(()=>V(t).workflowName)??``} · ${V(t),H(()=>V(t).sourceAppName??`GitHub App`)??``} ${V(t),H(()=>V(t).sourceAppId)??``} · ${r??``} · ${i??``} · ${a??``}`),q(m,s)},[()=>(U(c()),U(V(r)),H(()=>c().includes(V(r)))),()=>(U(l()),U(c()),U(V(r)),H(()=>!l()||c().length>=8&&!c().includes(V(r)))),()=>(U(ro),V(t),n(),H(()=>ro(V(t).conclusion,n()))),()=>(V(t),H(()=>V(t).headSha.slice(0,7))),()=>(V(t),U(Q),n(),H(()=>V(t).observedAt??Q(`observationTimeUnknown`,n()))),()=>(V(t),U(Q),n(),H(()=>V(t).requiredByRuleset?Q(`branchRequirementObserved`,n(),{branch:V(t).requiredByRuleset.branch}):Q(`branchRequirementUnknown`,n())))]),W(`change`,o,()=>c(Ja(c(),V(r)))),K(e,i)}),D(g);var _=I(g,2),v=e=>{var t=co();Y(t,5,()=>V(o),qr,(e,t)=>{var r=so(),i=N(r),a=F(i,!0),o=I(i,2),s=F(o,!0);D(r),R(e=>{q(a,V(t)),o.disabled=!l(),q(s,e)},[()=>(U(Q),n(),H(()=>Q(`producerRemove`,n())))]),W(`click`,o,()=>c(Ja(c(),V(t)))),K(e,r)}),D(t),K(e,t)};J(_,e=>{V(o),H(()=>V(o).length)&&e(v)});var y=I(_,2),b=F(y,!0),x=I(y,2),S=N(x),C=N(S,!0),w=I(C);yi(w),D(S);var ee=I(S,2),te=N(ee,!0),ne=I(te);yi(ne),D(ee);var re=I(ee,2),ie=N(re,!0),ae=I(ie);yi(ae),D(re),D(x);var oe=I(x,2),se=F(oe,!0),ce=I(oe,2),le=e=>{var t=lo(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`producerManualInvalid`,n())))]),K(e,t)};J(ce,e=>{V(p)&&e(le)}),R((e,t,n,r,i,a)=>{X(g,`aria-label`,e),q(b,t),q(C,n),w.disabled=!l(),q(te,r),ne.disabled=!l(),q(ie,i),ae.disabled=!l(),oe.disabled=!l(),q(se,a)},[()=>(U(Q),n(),H(()=>Q(`checksObserved`,n()))),()=>(U(Q),n(),H(()=>Q(`producerManualHelp`,n()))),()=>(U(Q),n(),H(()=>Q(`producerName`,n()))),()=>(U(Q),n(),H(()=>Q(`producerAppId`,n()))),()=>(U(Q),n(),H(()=>Q(`producerWorkflow`,n()))),()=>(U(Q),n(),H(()=>Q(`producerAdd`,n())))]),wi(w,()=>V(u),e=>M(u,e)),wi(ne,()=>V(d),e=>M(d,e)),wi(ae,()=>V(f),e=>M(f,e)),W(`click`,oe,m),K(e,h),Je(),i()}Sr([`change`,`click`]);var po=G(` `),mo=G(`
        `),ho=G(`
      • `),go=G(`

          `,1),_o=G(`
          `,1);function vo(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=j(),s=Z(t,`candidates`,8),c=Z(t,`selected`,12),l=Z(t,`value`,12),u=Z(t,`controller`,8);L(()=>U(s()),()=>{M(a,new Set(s().map(e=>String(e.number))))}),L(()=>(U(c()),V(a)),()=>{M(o,c().filter(e=>!V(a).has(e)))}),En(),ki();var d=_o(),f=P(d);Y(f,5,s,qr,(e,t)=>{var r=mo(),i=N(r),a=N(i);yi(a);var o=I(a,2),s=N(o),l=F(N(s),!0);D(s);var d=I(s),f=F(N(d));D(d),D(o),D(i);var p=I(i,2),m=e=>{var r=po(),i=F(r,!0);R((e,t)=>{X(r,`href`,e),q(i,t)},[()=>(U(Ba),V(t),H(()=>Ba(V(t).url))),()=>(U(Q),n(),H(()=>Q(`projectUrl`,n())))]),K(e,r)},h=_t(()=>(U(Ba),V(t),H(()=>Ba(V(t).url))));J(p,e=>{V(h)&&e(m)}),D(r),R((e,n)=>{bi(a,e),a.disabled=n,q(l,(V(t),H(()=>V(t).title))),q(f,`${V(t),H(()=>V(t).owner)??``} · #${V(t),H(()=>V(t).number)??``}`)},[()=>(U(c()),V(t),H(()=>c().includes(String(V(t).number)))),()=>(U(u()),U(c()),V(t),H(()=>!u()||c().length>=10&&!c().includes(String(V(t).number))))]),W(`change`,a,()=>c(Ja(c(),String(V(t).number)))),K(e,r)}),D(f);var p=I(f,2),m=e=>{var t=go(),r=P(t),i=F(r,!0),a=I(r,2);Y(a,5,()=>V(o),qr,(e,t)=>{var r=ho(),i=N(r),a=F(i),o=I(i,2),s=F(o,!0);D(r),R(e=>{q(a,`#${V(t)??``}`),o.disabled=!u(),q(s,e)},[()=>(U(Q),n(),H(()=>Q(`removeSelection`,n())))]),W(`click`,o,()=>c(Ja(c(),V(t)))),K(e,r)}),D(a),R(e=>q(i,e),[()=>(U(Q),n(),H(()=>Q(`projectSelectionNotObserved`,n())))]),K(e,t)};J(p,e=>{V(o),H(()=>V(o).length)&&e(m)});var h=I(p,2),g=N(h),_=F(g,!0),v=I(g,2);yi(v),D(h),R((e,t)=>{X(f,`aria-label`,e),q(_,t),v.disabled=!u()},[()=>(U(Q),n(),H(()=>Q(`projectsObserved`,n()))),()=>(U(Q),n(),H(()=>Q(`projectManual`,n())))]),wi(v,l),K(e,d),Je(),i()}Sr([`change`,`click`]);var yo=G(``),bo=G(`
          `),xo=G(` `,1);function So(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`explanation`,8),o=Z(t,`helpUrl`,8);ki();var s=xo(),c=P(s),l=e=>{var t=yo(),r=N(t),i=F(r);D(t),R(e=>{X(r,`href`,o()),q(i,`${e??``} ↗`)},[()=>(U(Q),n(),H(()=>Q(`learnMore`,n())))]),K(e,t)};J(c,e=>{o()&&e(l)});var u=I(c,2),d=e=>{var t=bo(),r=N(t),i=F(r,!0),o=I(r),s=N(o),c=F(s,!0),l=I(s),u=F(l,!0),d=I(l,2),f=F(d,!0),p=I(d),m=F(p,!0),h=I(p,2),g=F(h,!0),_=I(h),v=F(_,!0),y=I(_,2),b=F(y,!0),x=I(y),S=F(x,!0),C=I(x,2),w=F(C,!0),ee=I(C),te=F(ee,!0),ne=I(ee,2),re=F(ne,!0),ie=I(ne),ae=F(ie,!0),oe=I(ie,2),se=F(oe,!0),ce=F(I(oe),!0);D(o),D(t),R((e,t,n,r,o,s,l,d)=>{q(i,e),q(c,t),q(u,(U(a()),H(()=>a().when))),q(f,n),q(m,(U(a()),H(()=>a().where))),q(g,r),q(v,(U(a()),H(()=>a().how))),q(b,o),q(S,(U(a()),H(()=>a().why))),q(w,s),q(te,(U(a()),H(()=>a().example))),q(re,l),q(ae,(U(a()),H(()=>a().effect))),q(se,d),q(ce,(U(a()),H(()=>a().verify)))},[()=>(U(Q),n(),H(()=>Q(`whyMatters`,n()))),()=>(U(Q),n(),H(()=>Q(`whenApplies`,n()))),()=>(U(Q),n(),H(()=>Q(`whereConfigured`,n()))),()=>(U(Q),n(),H(()=>Q(`howToChoose`,n()))),()=>(U(Q),n(),H(()=>Q(`whyRecommendation`,n()))),()=>(U(Q),n(),H(()=>Q(`example`,n()))),()=>(U(Q),n(),H(()=>Q(`effect`,n()))),()=>(U(Q),n(),H(()=>Q(`verify`,n())))]),K(e,t)};J(u,e=>{a()&&e(d)}),K(e,s),Je(),i()}var Co=G(`· `,1),wo=G(`

          `,1);function To(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`candidate`,8);ki();var o=wo(),s=P(o),c=N(s),l=F(c),u=I(c,2),d=e=>{var t=Co(),r=I(P(t)),i=F(r,!0);R((e,t)=>{X(r,`href`,e),q(i,t)},[()=>(U(Ra),U(a()),H(()=>Ra(a().runUrl))),()=>(U(Q),n(),H(()=>Q(`ciRun`,n())))]),K(e,t)},f=_t(()=>(U(Ra),U(a()),H(()=>Ra(a().runUrl))));J(u,e=>{V(f)&&e(d)}),D(s);var p=I(s,2),m=N(p),h=F(m),g=I(m),_=I(g),v=e=>{var t=Co(),r=I(P(t)),i=F(r,!0);R((e,t)=>{X(r,`href`,e),q(i,t)},[()=>(U(za),U(a()),H(()=>za(a().requiredByRuleset?.sourceUrl))),()=>(U(Q),n(),H(()=>Q(`ciRule`,n())))]),K(e,t)},y=_t(()=>(U(za),U(a()),H(()=>za(a().requiredByRuleset?.sourceUrl))));J(_,e=>{V(y)&&e(v)}),D(p),R((e,t,n,r)=>{q(l,`${U(a()),H(()=>a().workflowName)??``} · GitHub App ${U(a()),H(()=>a().sourceAppId)??``}`),q(h,`${e??``} · ${t??``} · ${n??``}`),q(g,` · ${r??``} `)},[()=>(U(ro),U(a()),n(),H(()=>ro(a().conclusion,n()))),()=>(U(a()),H(()=>a().headSha.slice(0,7))),()=>(U(a()),U(Q),n(),H(()=>a().observedAt??Q(`observationTimeUnknown`,n()))),()=>(U(a()),U(Q),n(),H(()=>a().requiredByRuleset?Q(`branchRequirementObserved`,n(),{branch:a().requiredByRuleset.branch}):Q(`branchRequirementUnknown`,n())))]),K(e,o),Je(),i()}var Eo=G(`

          `);function Do(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`question`,8);ki();var o=jr(),s=P(o),c=e=>{var t=Eo(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`fixedIssuesRequired`,n())))]),K(e,t)},l=e=>{var t=jr();Y(P(t),1,()=>(U(a()),H(()=>Object.entries(a().fixedWorkflowFeatures).filter(([,e])=>e!==void 0))),qr,(e,t)=>{var r=_t(()=>b(V(t),2));let i=()=>V(r)[0],a=()=>V(r)[1];var o=Eo(),s=F(o,!0);R(e=>q(s,e),[()=>(U(Q),a(),n(),i(),H(()=>Q(a()?`fixedWorkflowEnabled`:`fixedWorkflowDisabled`,n(),{kind:i()})))]),K(e,o)}),K(e,t)};J(s,e=>{U(a()),H(()=>a().id===`features.issues`&&(a().fixedWorkflowFeatures?.release||a().fixedWorkflowFeatures?.hotfix))?e(c):(U(a()),H(()=>a().fixedWorkflowFeatures)&&e(l,1))}),K(e,o),Je(),i()}var Oo=G(` `),ko=G(`

          `),Ao=G(`

          `),jo=G(` `,1),Mo=G(`

          `),No=G(`
          `),Po=G(`

          `),Fo=G(``),Io=G(`
        • `),Lo=G(`
            `),Ro=G(`
            `),zo=G(``),Bo=G(``),Vo=G(` `,1),Ho=G(``),Uo=G(`
            `),Wo=G(``),Go=G(``),Ko=G(`

            `,1);function qo(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=j(),s=j(),c=Z(t,`prompt`,8),l=Z(t,`controller`,8),u=Z(t,`busy`,8),d=Z(t,`onSubmit`,8),f=Z(t,`onRetryDiscovery`,8),p=Z(t,`onBack`,8),m=qa(c()),h=j(m.value),g=j(m.selected);L(()=>(U(c()),n()),()=>{M(a,c().presentation?.[n()])}),L(()=>V(a),()=>{M(o,Za(V(a)?.documentation?.url))}),L(()=>(U(c()),n(),Da),()=>{M(s,typeof c().question.defaultValue==`boolean`?Q(c().question.defaultValue?`yes`:`no`,n()):c().question.defaultValue===``?Q(`none`,n()):c().question.kind===`choice`||c().question.kind===`multi-select`?Da(c().question.id,String(c().question.defaultValue),n()):String(c().question.defaultValue))}),En(),ki();var _=Ko(),v=P(_),y=N(v),b=F(y,!0),x=I(y),S=e=>{var t=Oo(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`permissionPreview`,n())))]),K(e,t)};J(x,e=>{U(c()),H(()=>c().phase===`permission-intent`)&&e(S)}),D(v);var C=I(v,2),w=e=>{var t=ko(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),U(c()),H(()=>Q(`questionProgress`,n(),{current:String(c().progress.groupPosition),total:String(c().progress.groupTotal),overall:String(c().progress.position),all:String(c().progress.total)})))]),K(e,t)};J(C,e=>{U(c()),H(()=>c().progress)&&e(w)});var ee=I(C,2),te=e=>{var t=Ao(),n=F(t,!0);R(()=>q(n,(V(a),H(()=>V(a).summary)))),K(e,t)};J(ee,e=>{V(a)&&e(te)});var ne=I(ee,2),re=e=>{to(e,{kind:`checks`,get status(){return U(c()),H(()=>c().question.discoveryStatus)},get truncated(){return U(c()),H(()=>c().question.discoveryTruncated)}})};J(ne,e=>{U(c()),H(()=>c().question.id===`pullRequestApproval.testChecks`)&&e(re)});var ie=I(ne,2),ae=e=>{to(e,{kind:`projects`,get status(){return U(c()),H(()=>c().question.discoveryStatus)},get truncated(){return U(c()),H(()=>c().question.discoveryTruncated)}})};J(ie,e=>{U(c()),H(()=>c().question.id===`projects.ids`)&&e(ae)});var oe=I(ie,2),se=e=>{var t=No(),r=N(t),i=e=>{var t=jo(),r=P(t),i=F(r,!0),a=F(I(r,2),!0);R((e,t)=>{r.disabled=!l()||u(),q(i,e),q(a,t)},[()=>(U(Q),n(),H(()=>Q(`retryDiscovery`,n()))),()=>(U(Q),n(),U(c()),H(()=>Q(`retryRemaining`,n(),{count:String(c().question.discoveryRetryRemaining)})))]),W(`click`,r,function(...e){f()?.apply(this,e)}),K(e,t)},a=e=>{var t=Mo(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`retryExhausted`,n())))]),K(e,t)};J(r,e=>{U(c()),H(()=>c().question.discoveryRetryRemaining>0)?e(i):e(a,-1)}),D(t),K(e,t)};J(oe,e=>{U(c()),H(()=>c().question.discoveryRetryRemaining!==void 0)&&e(se)});var ce=I(oe,2),le=e=>{var t=Po(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`projectStatusUnavailable`,n())))]),K(e,t)};J(ce,e=>{U(c()),H(()=>c().question.statusOptionState===`unavailable`)&&e(le)});var ue=I(ce,2),de=e=>{var t=Fo(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`projectStatusIncompatible`,n())))]),K(e,t)};J(ue,e=>{U(c()),H(()=>c().question.statusOptionState===`incompatible`)&&e(de)});var fe=I(ue,2),pe=e=>{var t=Mo(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`projectSharedStatus`,n())))]),K(e,t)};J(fe,e=>{U(c()),H(()=>c().question.id===`projects.ids`)&&e(pe)});var me=I(fe,2);Do(me,{get question(){return U(c()),H(()=>c().question)}});var he=I(me,2),ge=e=>{var t=Lo();Y(t,5,()=>(U(c()),H(()=>c().question.projectStatusValues)),qr,(e,t)=>{var r=Io(),i=N(r),a=I(i),o=F(N(a),!0);D(a),D(r),R(e=>{q(i,`${e??``}: `),q(o,(V(t),H(()=>V(t).value)))},[()=>(U(Q),U(Xa),V(t),n(),H(()=>Q(Xa[V(t).transition],n())))]),K(e,r)}),D(t),K(e,t)};J(he,e=>{U(c()),H(()=>c().question.projectStatusValues)&&e(ge)});var _e=I(he,2),ve=e=>{var t=Ro(),r=N(t);let i;var o=F(r,!0),s=I(r);let u;var d=F(s,!0);D(t),R((e,n)=>{X(t,`aria-label`,(V(a),U(c()),H(()=>V(a)?.label??c().question.label))),X(r,`aria-pressed`,V(h)===`yes`||V(h)===`true`),r.disabled=!l(),i=ci(r,1,``,null,i,{selected:V(h)===`yes`||V(h)===`true`}),q(o,e),X(s,`aria-pressed`,V(h)===`no`||V(h)===`false`),s.disabled=!l(),u=ci(s,1,``,null,u,{selected:V(h)===`no`||V(h)===`false`}),q(d,n)},[()=>(U(Q),n(),H(()=>Q(`yes`,n()))),()=>(U(Q),n(),H(()=>Q(`no`,n())))]),W(`click`,r,()=>M(h,`yes`)),W(`click`,s,()=>M(h,`no`)),K(e,t)},ye=e=>{var t=Vo(),r=P(t),i=N(r),o=e=>{var t=zo(),r=F(t,!0);t.value=t.__value=``,R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`selectOne`,n())))]),K(e,t)};J(i,e=>{U(c()),H(()=>!c().question.defaultValue)&&e(o)}),Y(I(i),1,()=>(U(c()),H(()=>c().question.choices??[])),qr,(e,t)=>{let r=k(()=>(U(c()),V(t),H(()=>c().question.id===`pullRequestApproval.coverage.checkName`?c().question.trustedProducers?.find(e=>e.name===V(t)):void 0)));var i=Bo(),a=F(i,!0),o={};R(e=>{q(a,e),o!==(o=V(t))&&(i.value=(i.__value=o)??``)},[()=>(U(V(r)),V(t),U(Da),U(c()),n(),H(()=>V(r)?`${V(t)} — ${V(r).workflowName} · App ${V(r).sourceAppId}`:Da(c().question.id,V(t),n())))]),K(e,i)}),D(r),fi(r);var s=I(r,2),u=e=>{var t=jr();Y(P(t),1,()=>(U(c()),V(h),H(()=>(c().question.producerCandidates??[]).filter(e=>e.name===V(h)))),qr,(e,t)=>{To(e,{get candidate(){return V(t)}})}),K(e,t)};J(s,e=>{U(c()),H(()=>c().question.id===`pullRequestApproval.coverage.checkName`)&&e(u)}),R(()=>{X(r,`aria-label`,(V(a),U(c()),H(()=>V(a)?.label??c().question.label))),r.disabled=!l()}),pi(r,()=>V(h),e=>M(h,e)),K(e,t)},be=e=>{{let t=k(()=>(U(c()),H(()=>c().question.producerCandidates??[])));fo(e,{get candidates(){return V(t)},get controller(){return l()},get selected(){return V(g)},set selected(e){M(g,e)},$$legacy:!0})}},xe=e=>{{let t=k(()=>(U(c()),H(()=>c().question.projectCandidates??[])));vo(e,{get candidates(){return V(t)},get controller(){return l()},get selected(){return V(g)},set selected(e){M(g,e)},get value(){return V(h)},set value(e){M(h,e)},$$legacy:!0})}},Se=e=>{var t=Uo();Y(t,5,()=>(U(c()),H(()=>c().question.kind===`multi-select`?c().question.choices??[]:c().question.allowedNames??[])),qr,(e,t)=>{var r=Ho(),i=N(r);yi(i);var a=F(I(i),!0);D(r),R((e,t)=>{bi(i,e),i.disabled=!l(),q(a,t)},[()=>(V(g),V(t),H(()=>V(g).includes(V(t)))),()=>(U(c()),U(Da),V(t),n(),H(()=>c().question.kind===`multi-select`?Da(c().question.id,V(t),n()):V(t)))]),W(`change`,i,()=>M(g,Ja(V(g),V(t)))),K(e,r)}),D(t),R(()=>X(t,`aria-label`,(V(a),U(c()),H(()=>V(a)?.label??c().question.label)))),K(e,t)},Ce=e=>{var t=jr(),n=P(t),r=e=>{var t=Wo();at(t),R(()=>{X(t,`aria-label`,(V(a),U(c()),H(()=>V(a)?.label??c().question.label))),t.disabled=!l()}),wi(t,()=>V(h),e=>M(h,e)),K(e,t)},i=e=>{var t=Go();yi(t),R(()=>{X(t,`aria-label`,(V(a),U(c()),H(()=>V(a)?.label??c().question.label))),X(t,`type`,(U(c()),H(()=>c().question.kind===`number`?`number`:`text`))),X(t,`min`,(U(c()),H(()=>c().question.kind===`number`?0:void 0))),t.disabled=!l()}),wi(t,()=>V(h),e=>M(h,e)),K(e,t)};J(n,e=>{U(c()),H(()=>c().question.id===`ai.bugbotOrganizationRules`)?e(r):e(i,-1)}),K(e,t)};J(_e,e=>{U(c()),H(()=>c().question.kind===`boolean`)?e(ve):(U(c()),H(()=>c().question.kind===`choice`)?e(ye,1):(U(c()),H(()=>c().question.kind===`producer-select`)?e(be,2):(U(c()),H(()=>c().question.kind===`project-select`)?e(xe,3):(U(c()),H(()=>c().question.kind===`multi-select`||c().question.kind===`scope-overrides`)?e(Se,4):e(Ce,-1)))))});var we=I(_e,2),T=F(we,!0),Te=I(we,2),E=e=>{var t=ko(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),U(c()),n(),H(()=>Q(c().question.suggestionSource===`github`?`sourceGithub`:c().question.suggestionSource===`local`?`sourceLocal`:c().question.suggestionSource===`configuration`?`sourceConfig`:`sourceDefault`,n())))]),K(e,t)};J(Te,e=>{U(c()),H(()=>c().question.suggestionSource)&&e(E)});var Ee=I(Te,2);So(Ee,{get explanation(){return V(a)},get helpUrl(){return V(o)}});var De=I(Ee,2),Oe=N(De),ke=e=>{{let t=k(()=>(U(Q),n(),H(()=>Q(`previousQuestion`,n())))),r=k(()=>!l()||u());Ua(e,{get label(){return V(t)},variant:`secondary`,get onClick(){return p()},get disabled(){return V(r)}})}};J(Oe,e=>{U(c()),H(()=>c().canGoBack)&&e(ke)});var Ae=I(Oe,2);{let e=k(()=>(U(Q),n(),H(()=>Q(`continue`,n())))),t=k(()=>!l()||u());Ua(Ae,{get label(){return V(e)},arrow:!0,onClick:()=>d()(Ya(c(),V(h),V(g))),get disabled(){return V(t)}})}D(De),R((e,t)=>{q(b,e),q(T,t)},[()=>(V(a),U(c()),H(()=>V(a)?.label??c().question.label.replace(` (Space toggles, Enter confirms)`,``))),()=>(U(Q),n(),V(s),H(()=>Q(`suggested`,n(),{answer:V(s)})))]),K(e,_),Je(),i()}Sr([`click`,`change`]);var Jo=G(` `),Yo=G(``),Xo=G(`
            `,1);function Zo(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`prompt`,8),s=Z(t,`controller`,8),c=Z(t,`busy`,8),l=Z(t,`onSubmit`,8);L(()=>(U(o()),La),()=>{M(a,o().copyId===`botPat.scopeConflict`||o().copyId===`botPat.scopeConflictUnavailable`?La(o().copyValues?.repository):void 0)}),En(),ki();var u=Xo(),d=P(u),f=e=>{var t=Jo(),r=N(t);Oe(),D(t),R(e=>{X(t,`href`,V(a)),q(r,`${e??``} `)},[()=>(U(Q),n(),H(()=>Q(`repositorySecretSettings`,n())))]),K(e,t)};J(d,e=>{V(a)&&e(f)});var p=I(d,2);Y(p,5,()=>(U(o()),H(()=>o().choices)),qr,(e,t,r)=>{var i=Yo(),a=F(N(i),!0);Oe(),D(i),R(e=>{i.disabled=!s()||c(),q(a,e)},[()=>(U(Na),U(o()),n(),H(()=>Na(o(),n(),r)))]),W(`click`,i,()=>l()(V(t))),K(e,i)}),D(p),K(e,u),Je(),i()}Sr([`click`]);var Qo=G(`

            `),$o=G(`

            `,1),es=G(``);function ts(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`storage`,8);ki();var o=es(),s=N(o),c=F(s,!0),l=I(s,2),u=F(l,!0),d=I(l,2),f=e=>{var t=$o(),r=P(t),i=F(r,!0),o=I(r,2),s=e=>{var t=Qo(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`patOrganizationImpact`,n())))]),K(e,t)};J(o,e=>{U(a()),H(()=>a().scope===`organization`&&a().replacesExisting)&&e(s)}),R(e=>q(i,e),[()=>(U(Q),n(),H(()=>Q(`patReplacementChecks`,n())))]),K(e,t)};J(d,e=>{U(a()),H(()=>a().operation!==`retain`)&&e(f)}),D(o),R((e,t)=>{q(c,e),q(u,t)},[()=>(U(Q),n(),H(()=>Q(`patStorageTitle`,n()))),()=>(U(Q),U(a()),n(),H(()=>Q(a().operation===`retain`?`patStorageRetain`:a().replacesExisting?a().scope===`repository`?`patRepositoryReplace`:`patOrganizationReplace`:a().scope===`repository`?`patRepositoryCreate`:`patOrganizationCreate`,n(),{destination:a().destination})))]),K(e,o),Je(),i()}var ns=G(``),rs=G(`

            `,1),is=G(`

            `),as=G(`
            `,1);function os(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=j(),s=j(),c=j(),l=Z(t,`prompt`,8),u=Z(t,`controller`,8),d=Z(t,`busy`,8),f=Z(t,`onSubmit`,8),p=j(``);function m(){let e=V(p);l().kind===`secret`&&M(p,``),f()(e)}L(()=>U(l()),()=>{M(a,Ia(l().link))}),L(()=>U(l()),()=>{M(o,l().copyId===`botPat.entry.guided`?l().copyValues?.account:void 0)}),L(()=>U(l()),()=>{M(s,l().copyId===`botPat.entry.guided`||l().copyId===`botPat.entry.manual`)}),L(()=>(V(s),U(l())),()=>{M(c,V(s)?l().copyValues?.storageScope:void 0)}),En(),ki();var h=as(),g=P(h),_=e=>{var t=rs(),r=P(t),i=e=>{var t=ns(),r=N(t),i=F(r,!0),a=F(I(r,2),!0);D(t),R((e,t)=>{q(i,e),q(a,t)},[()=>(U(Q),n(),V(o),H(()=>Q(`botAccountWarning`,n(),{account:V(o)}))),()=>(U(Q),n(),H(()=>Q(`botAccountHelp`,n())))]),K(e,t)};J(r,e=>{V(o)&&e(i)});var s=I(r,2),c=N(s);Oe(),D(s);var l=F(I(s,2),!0);R((e,t)=>{X(s,`href`,V(a)),X(s,`aria-describedby`,V(o)?`bot-account-warning`:void 0),q(c,`${e??``} `),q(l,t)},[()=>(V(o),U(Q),n(),H(()=>V(o)?Q(`botGithubForm`,n(),{account:V(o)}):Q(`githubForm`,n()))),()=>(U(Q),n(),H(()=>Q(`githubFormHelp`,n())))]),K(e,t)};J(g,e=>{V(a)&&e(_)});var v=I(g,2),y=e=>{{let t=k(()=>(V(c),U(l()),H(()=>({scope:V(c),destination:l().copyValues.storageDestination,replacesExisting:l().copyValues.storageReplacesExisting===`true`}))));ts(e,{get storage(){return V(t)}})}};J(v,e=>{V(c),U(l()),H(()=>(V(c)===`repository`||V(c)===`organization`)&&l().copyValues?.storageDestination)&&e(y)});var b=I(v,2),x=F(b,!0),S=I(b,2);yi(S);var C=I(S,2),w=e=>{var t=is(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`secretHelp`,n())))]),K(e,t)};J(C,e=>{U(l()),H(()=>l().kind===`secret`)&&e(w)});var ee=I(C,2),te=N(ee);{let e=k(()=>(U(Q),n(),H(()=>Q(`continue`,n())))),t=k(()=>(U(u()),U(d()),U(l()),V(p),H(()=>!u()||d()||!l().optional&&!V(p).trim())));Ua(te,{get label(){return V(e)},arrow:!0,onClick:m,get disabled(){return V(t)}})}D(ee),R((e,t)=>{q(x,e),X(S,`type`,(U(l()),H(()=>l().kind===`secret`?`password`:`text`))),S.disabled=!u(),X(S,`placeholder`,t)},[()=>(U(Q),U(l()),n(),H(()=>Q(l().kind===`secret`?`pasteHere`:`yourAnswer`,n()))),()=>(U(Q),U(l()),n(),H(()=>Q(l().kind===`secret`?`hiddenAfter`:`typeAnswer`,n())))]),wi(S,()=>V(p),e=>M(p,e)),K(e,h),Je(),i()}var ss={"No issue workflow kind is enabled; issue events will remain unmanaged until a supported Issue Form and profile entry are enabled.":`No issue workflow kind is enabled; issue events will remain unmanaged until a supported Issue Form and profile entry are enabled.`,"Help / question issues remain branchless even when issue-managed-branches is enabled.":`Help / question issues remain branchless even when issue-managed-branches is enabled.`,"Release automation is installed, but release issue events are disabled by the selected issue workflow profile.":`Release automation is installed, but release issue events are disabled by the selected issue workflow profile.`,"Hotfix automation is installed, but hotfix issue events are disabled by the selected issue workflow profile.":`Hotfix automation is installed, but hotfix issue events are disabled by the selected issue workflow profile.`,"Repository agent guidance generation is disabled; collaborators will not receive the generated profile or workflow skill.":`Repository agent guidance generation is disabled; collaborators will not receive the generated profile or workflow skill.`,"Release and hotfix workflows require the workflow PAT Secret and a writable token.":`Release and hotfix workflows require the workflow PAT Secret and a writable token.`,"Merge queue mode fails closed unless every required producer is verified automatically or covered by an exact reviewed attestation.":`Merge queue mode fails closed unless every required producer is verified automatically or covered by an exact reviewed attestation.`,"Inactive issue closure is enabled; waiting issues are closed after the configured inactivity threshold and can be reopened with a new comment.":`Inactive issue closure is enabled; waiting issues are closed after the configured inactivity threshold and can be reopened with a new comment.`,"Selected Project numbers must be accessible to the bot PAT, and all four configured Status values must exist in every selected Project.":`Selected Project numbers must be accessible to the bot PAT, and all four configured Status values must exist in every selected Project.`,"Cursor is an experimental runtime in Copilot and requires a compatible CLI plus CURSOR_API_KEY; the Action installs the official CLI when the default executable is absent.":`Cursor is an experimental runtime in Copilot and requires a compatible CLI plus CURSOR_API_KEY; the Action installs the official CLI when the default executable is absent.`,"Organization-level Secrets and Variables require organization permissions; selected access is the safest default and repository values take precedence.":`Organization-level Secrets and Variables require organization permissions; selected access is the safest default and repository values take precedence.`},cs={en:ss,es:{"No issue workflow kind is enabled; issue events will remain unmanaged until a supported Issue Form and profile entry are enabled.":`No has activado ningún tipo de flujo de incidencias. Sus eventos no se gestionarán hasta que actives un formulario de incidencia y su entrada en el perfil.`,"Help / question issues remain branchless even when issue-managed-branches is enabled.":`Las incidencias de ayuda y consulta no crean ramas, aunque actives las ramas gestionadas por incidencias.`,"Release automation is installed, but release issue events are disabled by the selected issue workflow profile.":`La automatización de versiones ya está instalada, pero el perfil elegido desactiva los eventos de incidencias de versiones.`,"Hotfix automation is installed, but hotfix issue events are disabled by the selected issue workflow profile.":`La automatización de correcciones urgentes ya está instalada, pero el perfil elegido desactiva los eventos de sus incidencias.`,"Repository agent guidance generation is disabled; collaborators will not receive the generated profile or workflow skill.":`Has desactivado la generación de instrucciones para agentes del repositorio. Los colaboradores no recibirán el perfil ni la guía del flujo de trabajo generados.`,"Release and hotfix workflows require the workflow PAT Secret and a writable token.":`Los flujos de versiones y correcciones urgentes requieren el Secret con el PAT de la Action y un token con permisos de escritura.`,"Merge queue mode fails closed unless every required producer is verified automatically or covered by an exact reviewed attestation.":`La cola de merge bloqueará la operación si cada productor obligatorio no se verifica automáticamente o no dispone de una certificación exacta revisada.`,"Inactive issue closure is enabled; waiting issues are closed after the configured inactivity threshold and can be reopened with a new comment.":`Está activado el cierre de incidencias inactivas. Las que estén en espera se cerrarán tras el plazo configurado y podrán reabrirse con un comentario.`,"Selected Project numbers must be accessible to the bot PAT, and all four configured Status values must exist in every selected Project.":`El PAT del bot debe tener acceso a los Projects seleccionados, y los cuatro valores de Status configurados deben existir en cada uno de ellos.`,"Cursor is an experimental runtime in Copilot and requires a compatible CLI plus CURSOR_API_KEY; the Action installs the official CLI when the default executable is absent.":`Cursor es un entorno experimental en Copilot y requiere un CLI compatible y CURSOR_API_KEY; la Action instala el CLI oficial si falta el ejecutable predeterminado.`,"Organization-level Secrets and Variables require organization permissions; selected access is the safest default and repository values take precedence.":`Los Secrets y Variables de organización requieren permisos en ella. Limitar el acceso a los repositorios elegidos es la opción más segura; los valores del repositorio tienen prioridad.`},fr:{"No issue workflow kind is enabled; issue events will remain unmanaged until a supported Issue Form and profile entry are enabled.":`Aucun type de flux de travail pour les tickets n’est activé. Leurs événements ne seront pas gérés tant qu’un formulaire de ticket pris en charge et son entrée de profil ne seront pas activés.`,"Help / question issues remain branchless even when issue-managed-branches is enabled.":`Les tickets d’aide ou de question ne créent pas de branche, même lorsque les branches gérées par les tickets sont activées.`,"Release automation is installed, but release issue events are disabled by the selected issue workflow profile.":`L’automatisation des versions est déjà installée, mais le profil choisi désactive les événements des tickets de version.`,"Hotfix automation is installed, but hotfix issue events are disabled by the selected issue workflow profile.":`L’automatisation des correctifs urgents est déjà installée, mais le profil choisi désactive les événements des tickets correspondants.`,"Repository agent guidance generation is disabled; collaborators will not receive the generated profile or workflow skill.":`La génération des consignes pour les agents du dépôt est désactivée. Les collaborateurs ne recevront ni le profil ni le guide de flux de travail générés.`,"Release and hotfix workflows require the workflow PAT Secret and a writable token.":`Les flux de version et de correctif urgent nécessitent le Secret contenant le PAT de l’Action et un jeton autorisé à écrire.`,"Merge queue mode fails closed unless every required producer is verified automatically or covered by an exact reviewed attestation.":`La file de fusion bloque l’opération si chaque producteur requis n’est pas vérifié automatiquement ou couvert par une attestation exacte et examinée.`,"Inactive issue closure is enabled; waiting issues are closed after the configured inactivity threshold and can be reopened with a new comment.":`La fermeture des tickets inactifs est activée. Les tickets en attente seront fermés après le délai configuré et pourront être rouverts par un nouveau commentaire.`,"Selected Project numbers must be accessible to the bot PAT, and all four configured Status values must exist in every selected Project.":`Le PAT du bot doit avoir accès aux Projects sélectionnés, et les quatre valeurs Status configurées doivent exister dans chacun de ces Projects.`,"Cursor is an experimental runtime in Copilot and requires a compatible CLI plus CURSOR_API_KEY; the Action installs the official CLI when the default executable is absent.":`Cursor est un environnement expérimental dans Copilot et nécessite un CLI compatible ainsi que CURSOR_API_KEY ; l’Action installe le CLI officiel si l’exécutable par défaut est absent.`,"Organization-level Secrets and Variables require organization permissions; selected access is the safest default and repository values take precedence.":`Les Secrets et Variables d’organisation nécessitent des droits sur celle-ci. Limiter l’accès aux dépôts sélectionnés est le choix le plus sûr ; les valeurs du dépôt prévalent.`},pt:{"No issue workflow kind is enabled; issue events will remain unmanaged until a supported Issue Form and profile entry are enabled.":`Não está ativo nenhum tipo de fluxo de trabalho para issues. Os respetivos eventos não serão geridos até ativar um formulário de issue suportado e a entrada correspondente no perfil.`,"Help / question issues remain branchless even when issue-managed-branches is enabled.":`As issues de ajuda ou perguntas não criam ramos, mesmo com os ramos geridos por issues ativados.`,"Release automation is installed, but release issue events are disabled by the selected issue workflow profile.":`A automação de versões já está instalada, mas o perfil escolhido desativa os eventos das issues de versão.`,"Hotfix automation is installed, but hotfix issue events are disabled by the selected issue workflow profile.":`A automação de correções urgentes já está instalada, mas o perfil escolhido desativa os eventos das respetivas issues.`,"Repository agent guidance generation is disabled; collaborators will not receive the generated profile or workflow skill.":`A criação de orientações para agentes do repositório está desativada. Os colaboradores não receberão o perfil nem o guia do fluxo de trabalho gerados.`,"Release and hotfix workflows require the workflow PAT Secret and a writable token.":`Os fluxos de versão e correção urgente exigem o Secret com o PAT da Action e um token com permissão de escrita.`,"Merge queue mode fails closed unless every required producer is verified automatically or covered by an exact reviewed attestation.":`A fila de integração bloqueia a operação se cada produtor obrigatório não for verificado automaticamente ou coberto por uma declaração exata e revista.`,"Inactive issue closure is enabled; waiting issues are closed after the configured inactivity threshold and can be reopened with a new comment.":`O fecho de issues inativas está ativado. As que aguardam resposta serão fechadas após o prazo configurado e poderão ser reabertas com um novo comentário.`,"Selected Project numbers must be accessible to the bot PAT, and all four configured Status values must exist in every selected Project.":`O PAT do bot tem de ter acesso aos Projects selecionados, e os quatro valores de Status configurados têm de existir em cada Project.`,"Cursor is an experimental runtime in Copilot and requires a compatible CLI plus CURSOR_API_KEY; the Action installs the official CLI when the default executable is absent.":`O Cursor é um ambiente experimental no Copilot e requer um CLI compatível e CURSOR_API_KEY; a Action instala o CLI oficial se o executável padrão não estiver disponível.`,"Organization-level Secrets and Variables require organization permissions; selected access is the safest default and repository values take precedence.":`Os Secrets e Variables da organização exigem permissões nessa organização. Restringir o acesso aos repositórios selecionados é a opção mais segura; os valores do repositório prevalecem.`}};function ls(e,t){let n=cs[t]??ss;return Object.prototype.hasOwnProperty.call(n,e)?n[e]:t===`en`?e:Q(`planUnknownWarning`,t)}var us={en:{issues:`Issues`,pullRequests:`Pull requests`,commits:`Commits`,issueComments:`Issue comments`,pullRequestComments:`Pull-request comments`,release:`Releases`,hotfix:`Hotfixes`,agentProvisioning:`Agent provisioning`,credentialHealth:`Credential health`,inactiveIssueClosure:`Inactive issue closure`,issueTemplates:`Issue templates`,pullRequestTemplate:`Pull-request template`},es:{issues:`Issues`,pullRequests:`Pull requests`,commits:`Commits`,issueComments:`Comentarios en issues`,pullRequestComments:`Comentarios en pull requests`,release:`Releases`,hotfix:`Correcciones urgentes`,agentProvisioning:`Instalación de agentes`,credentialHealth:`Estado de credenciales`,inactiveIssueClosure:`Cierre de issues inactivos`,issueTemplates:`Plantillas de issues`,pullRequestTemplate:`Plantilla de pull requests`},fr:{issues:`Tickets`,pullRequests:`Pull requests`,commits:`Commits`,issueComments:`Commentaires des tickets`,pullRequestComments:`Commentaires des pull requests`,release:`Versions`,hotfix:`Correctifs urgents`,agentProvisioning:`Installation des agents`,credentialHealth:`État des identifiants`,inactiveIssueClosure:`Fermeture des tickets inactifs`,issueTemplates:`Modèles de tickets`,pullRequestTemplate:`Modèle de pull request`},pt:{issues:`Questões`,pullRequests:`Pull requests`,commits:`Commits`,issueComments:`Comentários nas questões`,pullRequestComments:`Comentários nas pull requests`,release:`Versões`,hotfix:`Correções urgentes`,agentProvisioning:`Instalação de agentes`,credentialHealth:`Estado das credenciais`,inactiveIssueClosure:`Fecho de questões inativas`,issueTemplates:`Modelos de questões`,pullRequestTemplate:`Modelo de pull request`}};function ds(e,t){return us[t][e]??e}var fs={en:{planner:`Planner`,findings:`Findings analyst`,reviewer:`Reviewer`,fixer:`Fixer`,tester:`Tester`},es:{planner:`Planificador`,findings:`Analista de hallazgos`,reviewer:`Revisor`,fixer:`Corrector`,tester:`Probador`},fr:{planner:`Planificateur`,findings:`Analyste des problèmes`,reviewer:`Réviseur`,fixer:`Correcteur`,tester:`Testeur`},pt:{planner:`Planeador`,findings:`Analista de problemas`,reviewer:`Revisor`,fixer:`Corretor`,tester:`Testador`}};function ps(e,t){return fs[t][e]??e}var ms=G(`
          • `),hs=G(`
          • `),gs=G(`
              `),_s=G(`· `,1),vs=G(`
              `,1),ys=G(`
              `,1),bs=G(`
                `),xs=G(`

                  /

                  `);function Ss(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`decisions`,8);function o(e){return Q(e===`repository`?`scopeRepository`:e===`organization`?`scopeOrganization`:`scopeDisabled`,n())}function s(e){return Q(e===`guarded`?`approvalGuarded`:e===`recommend`?`approvalRecommend`:`approvalOff`,n())}ki();var c=xs(),l=N(c),u=F(l,!0),d=I(l,2),f=N(d),p=N(f),m=F(p,!0),h=F(I(p),!0);D(f);var g=I(f,2),_=N(g),v=F(_,!0),y=F(I(_),!0);D(g);var b=I(g,2),x=N(b),S=F(x,!0),C=I(x),w=N(C);Y(w,5,()=>(U(a()),H(()=>a().agentRouting)),qr,(e,t)=>{var r=ms(),i=N(r),a=F(I(i));D(r),R(e=>{q(i,`${e??``}: `),q(a,`${V(t),H(()=>V(t).provider)??``} · ${V(t),H(()=>V(t).modelProvider)??``}/${V(t),H(()=>V(t).model)??``}`)},[()=>(U(ps),V(t),n(),H(()=>ps(V(t).role,n())))]),K(e,r)}),D(w),D(C),D(b);var ee=I(b,2),te=N(ee),ne=F(te,!0),re=I(te),ie=N(re),ae=F(ie,!0),oe=F(I(ie,2),!0);D(re),D(ee);var se=I(ee,2),ce=N(se),le=F(ce,!0),ue=F(I(ce),!0);D(se);var de=I(se,2),fe=e=>{var t=ys(),r=P(t),i=N(r),o=F(i,!0),s=I(i),c=N(s),l=e=>{var t=gs();Y(t,5,()=>(U(a()),H(()=>a().trustedChecks)),qr,(e,t)=>{var r=hs(),i=N(r),a=F(i,!0),o=I(i),s=F(I(o),!0);D(r),R(e=>{q(a,(V(t),H(()=>V(t).name))),q(o,` · ${e??``} ${V(t),H(()=>V(t).sourceAppId)??``} · `),q(s,(V(t),H(()=>V(t).workflowName)))},[()=>(U(Q),n(),H(()=>Q(`producerAppId`,n())))]),K(e,r)}),D(t),K(e,t)},u=e=>{var t=Ar();R(e=>q(t,e),[()=>(U(Q),n(),H(()=>Q(`none`,n())))]),K(e,t)};J(c,e=>{U(a()),H(()=>a().trustedChecks.length)?e(l):e(u,-1)}),D(s),D(r);var d=I(r,2),f=N(d),p=F(f,!0),m=F(I(f),!0);D(d);var h=I(d,2),g=N(h),_=F(g,!0),v=I(g),y=N(v,!0),b=I(y),x=e=>{var t=_s(),n=F(I(P(t)),!0);R(()=>q(n,(U(a()),H(()=>a().coverageCheck)))),K(e,t)};J(b,e=>{U(a()),H(()=>a().coverageCheck)&&e(x)}),D(v),D(h);var S=I(h,2),C=e=>{var t=vs(),r=P(t),i=N(r),o=F(i,!0),s=F(I(i),!0);D(r);var c=I(r,2),l=N(c),u=F(l,!0),d=I(l),f=F(N(d),!0);D(d),D(c);var p=I(c,2),m=N(p),h=F(m,!0),g=F(I(m),!0);D(p),R((e,t,n,r,i,a)=>{q(o,e),q(s,t),q(u,n),q(f,r),q(h,i),q(g,a)},[()=>(U(Q),n(),H(()=>Q(`planCoverageThreshold`,n()))),()=>(U(a()),U(Q),n(),H(()=>a().coverageMinimum===void 0?Q(`none`,n()):`${a().coverageMinimum}%`)),()=>(U(Q),n(),H(()=>Q(`planCoverageReporter`,n()))),()=>(U(a()),U(Q),n(),H(()=>a().coverageArtifactWorkflow||Q(`none`,n()))),()=>(U(Q),n(),H(()=>Q(`planReporterAttested`,n()))),()=>(U(Q),U(a()),n(),H(()=>Q(a().coverageReporterAttested?`yes`:`no`,n())))]),K(e,t)};J(S,e=>{U(a()),H(()=>a().coverageMode===`numeric`)&&e(C)}),R((e,t,n,r,i)=>{q(o,e),q(p,t),q(m,n),q(_,r),q(y,i)},[()=>(U(Q),n(),H(()=>Q(`planTrustedChecks`,n()))),()=>(U(Q),n(),H(()=>Q(`planProducerAttested`,n()))),()=>(U(Q),U(a()),n(),H(()=>Q(a().producerAttested?`yes`:`no`,n()))),()=>(U(Q),n(),H(()=>Q(`planCoverage`,n()))),()=>(U(Da),U(a()),n(),H(()=>Da(`pullRequestApproval.coverage.mode`,a().coverageMode,n())))]),K(e,t)};J(de,e=>{U(a()),H(()=>a().approvalMode!==`off`)&&e(fe)});var pe=I(de,2),me=N(pe),he=F(me,!0),ge=F(I(me),!0);D(pe);var _e=I(pe,2),ve=e=>{var t=bs(),r=N(t),i=F(r,!0),o=I(r),s=N(o);Y(s,5,()=>(U(a()),H(()=>a().projectStatuses)),qr,(e,t)=>{var r=ms(),i=N(r),a=F(I(i),!0);D(r),R(e=>{q(i,`${e??``}: `),q(a,(V(t),H(()=>V(t).value)))},[()=>(U(Q),U(Xa),V(t),n(),H(()=>Q(Xa[V(t).transition],n())))]),K(e,r)}),D(s),D(o),D(t),R(e=>q(i,e),[()=>(U(Q),n(),H(()=>Q(`planProjectStatuses`,n())))]),K(e,t)};J(_e,e=>{U(a()),H(()=>a().projectNumbers.length)&&e(ve)});var ye=I(_e,2),be=N(ye),xe=F(be,!0),Se=F(I(be),!0);D(ye);var Ce=I(ye,2),we=N(Ce),T=F(we,!0),Te=F(I(we),!0);D(Ce);var E=I(Ce,2),Ee=N(E),De=F(Ee,!0),Oe=F(I(Ee),!0);D(E);var ke=I(E,2),Ae=N(ke),je=F(Ae,!0),Me=F(I(Ae),!0);D(ke),D(d);var Ne=F(I(d,2),!0);D(c),R((e,t,n,r,i,o,s,c,l,d,f,p,g,_,b,x,C,w,ee,te)=>{q(u,e),q(m,t),q(h,n),q(v,r),q(y,i),q(S,o),q(ne,s),q(ae,(U(a()),H(()=>a().productionBranch))),q(oe,(U(a()),H(()=>a().developmentBranch))),q(le,c),q(ue,l),q(he,d),q(ge,f),q(xe,p),q(Se,g),q(T,_),q(Te,b),q(De,x),q(Oe,C),q(je,w),q(Me,ee),q(Ne,te)},[()=>(U(Q),n(),H(()=>Q(`planChoices`,n()))),()=>(U(Q),n(),H(()=>Q(`planEnabledCapabilities`,n()))),()=>(U(a()),U(ds),n(),U(Q),H(()=>a().enabledCapabilities.length?a().enabledCapabilities.map(e=>ds(e,n())).join(`, `):Q(`none`,n()))),()=>(U(Q),n(),H(()=>Q(`planIssueWorkflows`,n()))),()=>(U(a()),U(Da),n(),U(Q),H(()=>a().issueWorkflows.length?a().issueWorkflows.map(e=>Da(`issueWorkflows.enabled`,e,n())).join(`, `):Q(`none`,n()))),()=>(U(Q),n(),H(()=>Q(`planAgentRouting`,n()))),()=>(U(Q),n(),H(()=>Q(`planBranchRoles`,n()))),()=>(U(Q),n(),H(()=>Q(`planApprovalMode`,n()))),()=>(U(a()),H(()=>s(a().approvalMode))),()=>(U(Q),n(),H(()=>Q(`editProjects`,n()))),()=>(U(a()),U(Q),n(),H(()=>a().projectNumbers.length?a().projectNumbers.map(e=>`#${e}`).join(`, `):Q(`none`,n()))),()=>(U(Q),n(),H(()=>Q(`planVariableScope`,n()))),()=>(U(a()),H(()=>o(a().variableScope))),()=>(U(Q),n(),H(()=>Q(`planSecretScope`,n()))),()=>(U(a()),H(()=>o(a().secretScope))),()=>(U(Q),n(),H(()=>Q(`planIssueResources`,n()))),()=>(U(Q),n(),H(()=>Q(`planIssueResourcesValue`,n()))),()=>(U(Q),n(),H(()=>Q(`planInitialTag`,n()))),()=>(U(Q),U(a()),n(),H(()=>Q(a().initialTag?`yes`:`no`,n()))),()=>(U(Q),n(),H(()=>Q(`planAdvancedDefaults`,n())))]),K(e,c),Je(),i()}var Cs={Metadata:`Metadata`,Contents:`Contents`,Secrets:`Secrets`,Variables:`Variables`,Issues:`Issues`,Actions:`Actions`,Checks:`Checks`,Administration:`Administration`,Workflows:`Workflows`,"Issue Types":`Issue Types`,Projects:`Projects`,"Pull requests":`Pull requests`,Members:`Members`},ws={repository:`repository`,organization:`organization`,read:`Read`,write:`Write`,required:`Required`,conditional:`Conditional`,verified:`Verified`,available:`Read available`,missing:`Missing`,unverifiable:`Unverifiable`},Ts={Metadata:`Metadatos`,Contents:`Contenido`,Secrets:`Secretos`,Variables:`Variables`,Issues:`Incidencias`,Actions:`Acciones`,Checks:`Comprobaciones`,Administration:`Administración`,Workflows:`Flujos de trabajo`,"Issue Types":`Tipos de incidencia`,Projects:`Proyectos`,"Pull requests":`Solicitudes de cambio`,Members:`Miembros`},Es={repository:`repositorio`,organization:`organización`,read:`Lectura`,write:`Escritura`,required:`Obligatorio`,conditional:`Condicional`,verified:`Verificado`,available:`Lectura disponible`,missing:`Faltante`,unverifiable:`No verificable`},Ds={Metadata:`Métadonnées`,Contents:`Contenu`,Secrets:`Secrets`,Variables:`Variables`,Issues:`Tickets`,Actions:`Actions`,Checks:`Vérifications`,Administration:`Administration`,Workflows:`Flux de travail`,"Issue Types":`Types de ticket`,Projects:`Projets`,"Pull requests":`Demandes de tirage`,Members:`Membres`},Os={repository:`dépôt`,organization:`organisation`,read:`Lecture`,write:`Écriture`,required:`Obligatoire`,conditional:`Conditionnel`,verified:`Vérifié`,available:`Lecture disponible`,missing:`Manquant`,unverifiable:`Non vérifiable`},ks={Metadata:`Metadados`,Contents:`Conteúdo`,Secrets:`Segredos`,Variables:`Variáveis`,Issues:`Questões`,Actions:`Ações`,Checks:`Verificações`,Administration:`Administração`,Workflows:`Fluxos de trabalho`,"Issue Types":`Tipos de questão`,Projects:`Projetos`,"Pull requests":`Pedidos de alteração`,Members:`Membros`},As={repository:`repositório`,organization:`organização`,read:`Leitura`,write:`Escrita`,required:`Obrigatório`,conditional:`Condicional`,verified:`Verificado`,available:`Leitura disponível`,missing:`Em falta`,unverifiable:`Não verificável`},js={en:Cs,es:Ts,fr:Ds,pt:ks},Ms={en:ws,es:Es,fr:Os,pt:As};function Ns(e,t){return Ms[e][t]}function Ps(e,t){return Object.prototype.hasOwnProperty.call(js[e],t)?js[e][t]:t}function Fs(e,t){if(t===`verified`||t===`available`||t===`missing`||t===`unverifiable`)return Ms[e][t]}var Is=G(`

                  `),Ls=G(`
                • `),Rs=G(`

                  `),zs=G(`

                    `),Bs=G(`
                  • `),Vs=G(`
                      `),Hs=G(`

                        `),Us=G(``),Ws=G(`

                        `),Gs=G(`

                          `);function Ks(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`prompt`,8),s=Z(t,`controller`,8),c=Z(t,`busy`,8),l=Z(t,`onSubmit`,8),u={capabilities:`editCapabilities`,"agent-runtime":`editRuntimes`,"agent-model-defaults":`editModels`,"agent-role-overrides":`editRoleModels`,repository:`editRepository`,deployment:`editDeployment`,bugbot:`editBugbot`,"pull-request-approval":`editApproval`,projects:`editProjects`,provisioning:`editProvisioning`,storage:`editStorage`};L(()=>(n(),U(o())),()=>{M(a,[{title:Q(`files`,n()),items:o().plan.files},{title:Q(`workflows`,n()),items:o().plan.workflows},{title:Q(`variables`,n()),items:o().plan.variables},{title:Q(`secretNames`,n()),items:o().plan.secrets}])}),En(),ki();var d=Gs(),f=N(d),p=F(f,!0),m=I(f,2),h=N(m),g=F(h,!0),_=I(h,2),v=F(_,!0),y=I(_,2),b=e=>{var t=Is(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`planActionsProbePrerequisites`,n())))]),K(e,t)},x=_t(()=>(U(o()),H(()=>o().plan.permissionProbes?.some(e=>e.permission===`Actions`))));J(y,e=>{V(x)&&e(b)});var S=I(y,2),C=e=>{var t=Is(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`planSecretProbeLimit`,n())))]),K(e,t)},w=_t(()=>(U(o()),H(()=>o().plan.permissionProbes?.some(e=>e.permission===`Secrets`))));J(S,e=>{V(w)&&e(C)});var ee=I(S,2);Y(ee,5,()=>(U(o()),H(()=>o().plan.permissionProbes)),qr,(e,t)=>{var r=Ls(),i=F(r);R((e,t)=>q(i,`${e??``}: ${t??``}`),[()=>(U(Ns),n(),V(t),H(()=>Ns(n(),V(t).scope))),()=>(U(Ps),n(),V(t),H(()=>Ps(n(),V(t).permission)))]),K(e,r)},e=>{var t=Ls(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`none`,n())))]),K(e,t)}),D(ee),D(m);var te=I(m,2),ne=e=>{var t=Rs(),r=N(t),i=F(r,!0),a=I(r,2),s=F(a,!0),c=I(a,2),l=N(c),u=F(l,!0),d=F(I(l),!0);D(c),D(t),R((e,t,n,r)=>{q(i,e),q(s,t),q(u,n),q(d,r)},[()=>(U(Q),n(),H(()=>Q(`organizationReuseTitle`,n()))),()=>(U(Q),n(),U(o()),H(()=>Q(`organizationReuseBody`,n(),{imported:String(o().plan.organizationReuse.imported),shared:String(o().plan.organizationReuse.organizationVariables.length),overrides:String(o().plan.organizationReuse.repositoryVariables.length),writes:String(o().plan.organizationReuse.repositoryWrites.length)}))),()=>(U(Q),n(),H(()=>Q(`batchRepositoryOverrides`,n()))),()=>(U(o()),U(Q),n(),H(()=>o().plan.organizationReuse.repositoryWrites.join(`, `)||Q(`none`,n())))]),K(e,t)};J(te,e=>{U(o()),H(()=>o().plan.organizationReuse)&&e(ne)});var re=I(te,2);Ss(re,{get decisions(){return U(o()),H(()=>o().plan.decisions)}});var ie=I(re,2),ae=e=>{ts(e,{get storage(){return U(o()),H(()=>o().plan.workflowPatStorage)}})};J(ie,e=>{U(o()),H(()=>o().plan.workflowPatStorage)&&e(ae)});var oe=I(ie,2),se=e=>{var t=zs(),r=N(t),i=F(r,!0),a=I(r,2);Y(a,5,()=>(U(o()),H(()=>o().plan.presentationDefaults)),qr,(e,t)=>{var r=Ls(),i=F(r);R(e=>q(i,`${e??``}: ${V(t),H(()=>V(t).count)??``}`),[()=>(V(t),U(Q),n(),H(()=>u[V(t).group]?Q(u[V(t).group],n()):V(t).group))]),K(e,r)}),D(a),D(t),R(e=>q(i,e),[()=>(U(Q),n(),H(()=>Q(`planBasicDefaultsIntro`,n())))]),K(e,t)};J(oe,e=>{U(o()),H(()=>o().plan.presentationDefaults.length)&&e(se)});var ce=I(oe,2);Y(ce,5,()=>V(a),qr,(e,t)=>{var r=Vs(),i=N(r),a=N(i),o=F(a,!0),s=F(I(a),!0);D(i);var c=I(i);Y(c,5,()=>(V(t),H(()=>V(t).items)),qr,(e,t)=>{var n=Bs(),r=F(N(n),!0);D(n),R(()=>q(r,V(t))),K(e,n)},e=>{var t=Ls(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`none`,n())))]),K(e,t)}),D(c),D(r),R(()=>{q(o,(V(t),H(()=>V(t).title))),q(s,(V(t),H(()=>V(t).items.length)))}),K(e,r)}),D(ce);var le=I(ce,2),ue=e=>{var t=Hs(),r=N(t),i=F(r,!0),a=I(r);Y(a,5,()=>(U(o()),H(()=>o().plan.warnings)),qr,(e,t)=>{var r=Ls(),i=F(r,!0);R(e=>q(i,e),[()=>(U(ls),V(t),n(),H(()=>ls(V(t),n())))]),K(e,r)}),D(a),D(t),R(e=>q(i,e),[()=>(U(Q),n(),H(()=>Q(`beforeContinue`,n())))]),K(e,t)};J(le,e=>{U(o()),H(()=>o().plan.warnings.length)&&e(ue)});var de=I(le,2),fe=e=>{var t=Ws(),r=N(t),i=F(r,!0),a=I(r),d=F(a,!0),f=I(a,2);Y(f,5,()=>(U(o()),H(()=>o().editGroups)),qr,(e,t)=>{var r=Us(),i=F(r,!0);R(e=>{r.disabled=!s()||c(),q(i,e)},[()=>(U(Q),n(),V(t),H(()=>Q(`changeSection`,n(),{section:Q(u[V(t)],n())})))]),W(`click`,r,()=>l()(`revise:${V(t)}`)),K(e,r)}),D(f),D(t),R((e,t)=>{q(i,e),q(d,t)},[()=>(U(Q),n(),H(()=>Q(`changeAnswersTitle`,n()))),()=>(U(Q),n(),H(()=>Q(`changeAnswersHelp`,n())))]),K(e,t)};J(de,e=>{U(o()),H(()=>o().editGroups?.length)&&e(fe)});var pe=I(de,2),me=N(pe);{let e=k(()=>(U(Q),n(),H(()=>Q(`stopHere`,n())))),t=k(()=>!s()||c());Ua(me,{get label(){return V(e)},variant:`secondary`,onClick:()=>l()(`decline`),get disabled(){return V(t)}})}var he=I(me);{let e=k(()=>(U(Q),U(o()),n(),H(()=>Q(o().plan.deliveryMode===`pull-request`?`batchUseConfiguration`:`approvePlan`,n())))),t=k(()=>!s()||c());Ua(he,{get label(){return V(e)},arrow:!0,onClick:()=>l()(`approve`),get disabled(){return V(t)}})}D(pe),D(d),R((e,t,n,r)=>{q(p,e),X(m,`aria-label`,t),q(g,n),q(v,r)},[()=>(U(Q),U(o()),n(),H(()=>Q(o().plan.deliveryMode===`pull-request`?`batchConfigurationPreview`:o().plan.organizationReuse?`planReuseBody`:`planBody`,n()))),()=>(U(Q),n(),H(()=>Q(`planPermissionProbeTitle`,n()))),()=>(U(Q),n(),H(()=>Q(`planPermissionProbeTitle`,n()))),()=>(U(Q),n(),H(()=>Q(`planPermissionProbeBody`,n())))]),K(e,d),Je(),i()}Sr([`click`]);var qs=G(`

                          `),Js=G(`
                        • `),Ys=G(`
                          `,1),Xs=G(`
                          `,1),Zs=G(`

                          `),Qs=G(`

                            `,1);function $s(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`view`,8);L(()=>n(),()=>{M(a,ea(n()))}),En(),ki();var s=Qs(),c=P(s),l=N(c),u=F(l,!0),d=I(l),f=F(d,!0),p=I(d,2),m=e=>{var t=qs(),n=F(t,!0);R(()=>q(n,(V(a),H(()=>V(a).unknown)))),K(e,t)};J(p,e=>{U(o()),H(()=>o().secretInventory!==`available`)&&e(m)});var h=I(p,2);Y(h,5,()=>(U(o()),H(()=>o().secrets)),qr,(e,t)=>{var n=Js(),r=N(n),i=F(r,!0),o=I(r),s=I(o),c=e=>{var t=Ar();R(()=>q(t,`· ${V(a),H(()=>V(a).shadowed)??``}`)),K(e,t)};J(s,e=>{V(t),H(()=>V(t).shadowed)&&e(c)}),D(n),R(()=>{q(i,(V(t),H(()=>V(t).name))),q(o,` · ${V(a),V(t),H(()=>V(a)[V(t).scope])??``} `)}),K(e,n)}),D(h),D(c);var g=I(c,2),_=N(g),v=F(_),y=I(_,2),b=e=>{var t=qs(),n=F(t,!0);R(()=>q(n,(V(a),H(()=>V(a).empty)))),K(e,t)};J(y,e=>{U(o()),H(()=>!o().variables.length)&&e(b)});var x=I(y,2);Y(x,5,()=>(U(o()),H(()=>o().variables)),qr,(e,t)=>{var n=Ys(),r=P(n),i=N(r),o=I(i),s=e=>{var t=Ar();R(()=>q(t,`· ${V(a),H(()=>V(a).shadowed)??``}`)),K(e,t)};J(o,e=>{V(t),H(()=>V(t).shadowed)&&e(s)}),D(r);var c=F(I(r),!0);R(()=>{q(i,`${V(t),H(()=>V(t).name)??``} · ${V(a),V(t),H(()=>V(a)[V(t).scope])??``} `),q(c,(V(t),H(()=>V(t).value)))}),K(e,n)}),D(x),D(g);var S=I(g,2),C=N(S),w=F(C);Y(I(C,2),1,()=>(U(o()),H(()=>o().workflows)),qr,(e,t)=>{var n=Zs(),r=N(n),i=F(r,!0),o=I(r,2),s=F(o,!0),c=I(o,2);Y(c,5,()=>(V(t),H(()=>V(t).inputs)),qr,(e,t)=>{var n=Xs(),r=P(n),i=F(r,!0),o=I(r),s=N(o,!0),c=I(s),l=e=>{var n=Ar();R(()=>q(n,`· ${V(a),H(()=>V(a).workflow)??``}: ${V(t),H(()=>V(t).fallback)??``}`)),K(e,n)};J(c,e=>{V(t),H(()=>V(t).fallback!==void 0)&&e(l)}),D(o),R(()=>{q(i,(V(t),H(()=>V(t).name))),q(s,(V(t),V(a),H(()=>V(t).unsupported?V(a).unknown:V(t).variable?`vars.${V(t).variable}`:V(t).literal)))}),K(e,n)}),D(c),D(n),R(()=>{q(i,(V(t),H(()=>V(t).file))),q(s,(V(t),H(()=>V(t).action)))}),K(e,n)}),D(S),R(()=>{q(u,(V(a),H(()=>V(a).credentials))),q(f,(V(a),H(()=>V(a).secretHelp))),q(v,`${V(a),H(()=>V(a).variables)??``} (${U(o()),H(()=>o().variables.length)??``})`),q(w,`${V(a),H(()=>V(a).details)??``} (${U(o()),H(()=>o().workflows.length)??``})`)}),K(e,s),Je(),i()}var ec=G(`

                            `),tc=G(``),nc=G(``),rc=G(`

                            `),ic=G(`

                            `,1),ac=G(`

                            `,1);function oc(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`view`,8),s=Z(t,`controller`,8),c=Z(t,`busy`,8),l=Z(t,`onSubmit`,8);L(()=>n(),()=>{M(a,ea(n()))}),En(),ki();var u=ac(),d=P(u),f=F(d,!0),p=I(d,2),m=F(p,!0),h=I(p,2),g=F(h,!0),_=I(h,2),v=e=>{var t=ec(),n=F(t,!0);R(()=>q(n,(V(a),H(()=>V(a).local)))),K(e,t)};J(_,e=>{U(o()),H(()=>o().github===`not-connected`&&o().status!==`unconfigured`)&&e(v)});var y=I(_,2),b=e=>{var t=tc(),n=F(t,!0);R(()=>q(n,(V(a),H(()=>V(a).githubIncomplete)))),K(e,t)};J(y,e=>{U(o()),H(()=>o().github===`incomplete`)&&e(b)});var x=I(y,2),S=N(x),C=e=>{var t=nc(),n=F(t,!0);R(()=>{t.disabled=!s()||c(),q(n,(U(o()),V(a),H(()=>o().github===`not-connected`?V(a).connect:V(a).refresh)))}),W(`click`,t,()=>l()(o().github===`not-connected`?`connect`:`refresh`)),K(e,t)};J(S,e=>{U(o()),H(()=>o().status!==`unconfigured`)&&e(C)});var w=I(S,2);let ee;var te=F(w,!0);D(x);var ne=I(x,2),re=e=>{var t=ic(),r=P(t),i=N(r),u=F(i,!0),d=I(i),f=F(d,!0),p=I(d,2);Y(p,5,()=>(U(o()),H(()=>o().settings)),qr,(e,t)=>{var r=rc(),i=N(r),o=N(i),u=F(o,!0),d=I(o),f=N(d,!0),p=I(f),m=e=>{var n=Ar();R(()=>q(n,` · ${V(a),V(t),H(()=>V(a)[V(t).source])??``}`)),K(e,n)};J(p,e=>{V(t),H(()=>V(t).source!==`unknown`)&&e(m)}),D(d),D(i);var h=I(i,2),g=F(h,!0);D(r),R((e,n,r)=>{q(u,e),q(f,n),X(h,`aria-label`,r),h.disabled=(U(s()),U(c()),V(t),H(()=>!s()||c()||!V(t).editable)),q(g,(V(a),H(()=>V(a).edit)))},[()=>(U(ta),V(t),n(),H(()=>ta(V(t).id,n()))),()=>(V(t),V(a),U(ra),n(),H(()=>V(t).value===void 0?V(a).unknown:ra(V(t).value,n()))),()=>(V(a),U(ta),V(t),n(),H(()=>`${V(a).edit}: ${ta(V(t).id,n())}`))]),W(`click`,h,()=>l()(`edit:${V(t).id}`)),K(e,r)}),D(p),D(r),$s(I(r,2),{get view(){return o()}}),R(()=>{q(u,(V(a),H(()=>V(a).quick))),q(f,(V(a),H(()=>V(a).quickHelp)))}),K(e,t)};J(ne,e=>{U(o()),H(()=>o().status!==`unconfigured`)&&e(re)});var ie=I(ne,2),ae=F(ie,!0),oe=I(ie,2),se=N(oe),ce=F(se,!0);D(oe),R(()=>{q(f,(V(a),H(()=>V(a).title))),q(m,(V(a),U(o()),H(()=>V(a)[o().status]))),q(g,(U(o()),V(a),H(()=>o().status===`unconfigured`?V(a).startHelp:V(a).intro))),ee=ci(w,1,`button`,null,ee,{primary:o().status===`unconfigured`,secondary:o().status!==`unconfigured`}),w.disabled=!s()||c(),q(te,(U(o()),V(a),H(()=>o().status===`unconfigured`?V(a).start:V(a).wizard))),q(ae,(V(a),H(()=>V(a).limits))),se.disabled=!s()||c(),q(ce,(V(a),H(()=>V(a).finish)))}),W(`click`,w,()=>l()(`wizard`)),W(`click`,se,()=>l()(`close`)),K(e,u),Je(),i()}Sr([`click`]);var sc=G(``),cc=G(``),lc=G(`
                          • `),uc=G(`
                              `),dc=G(`

                              `),fc=G(` `),pc=G(`

                                `),mc=G(`
                                 
                                `),hc=G(`
                                `),gc=G(`
                                `),_c=G(`

                                `),vc=G(`
                              • `),yc=G(`
                                  `),bc=G(`

                                  `,1),xc=G(`

                                  →

                                  `),Sc=G(`
                                  `),Cc=G(``),wc=G(``),Tc=G(`
                                  `),Ec=G(`

                                  `);function Dc(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`batch`,8),s=Z(t,`controller`,8),c=Z(t,`busy`,8),l=Z(t,`mode`,8,`progress`),u=Z(t,`onSubmit`,8,async()=>void 0),d=Z(t,`onStop`,8,async()=>void 0),f={ready:`batchStatusReady`,blocked:`batchStatusBlocked`,applying:`batchStatusApplying`,partial:`batchStatusPartial`,"waiting-for-merge":`batchStatusWaiting`,"verification-pending":`batchStatusPending`,unchanged:`batchStatusUnchanged`,cancelled:`batchStatusCancelled`};function p(e){return e&&/^https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/pull\/[1-9][0-9]*$/.test(e)?e:void 0}L(()=>U(o()),()=>{M(a,o().targets.some(e=>e.cleanupPending)?[]:o().targets.filter(e=>[`ready`,`partial`,`cancelled`,`applying`].includes(e.status)))}),En(),ki();var m=Ec(),h=N(m),g=F(h,!0),_=I(h,2),v=F(_,!0),y=I(_,2),b=e=>{var t=sc(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`batchStopping`,n())))]),K(e,t)};J(y,e=>{U(o()),H(()=>o().stopRequested)&&e(b)});var x=I(y,2);Y(x,5,()=>(U(o()),H(()=>o().targets)),e=>e.repositoryId,(e,t)=>{var r=xc(),i=N(r),a=F(i,!0),o=I(i,2),s=F(o,!0),c=I(o,2),l=e=>{var t=cc(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`batchCleanupPending`,n())))]),K(e,t)};J(c,e=>{V(t),H(()=>V(t).cleanupPending)&&e(l)});var u=I(c,2),d=e=>{var n=uc();Y(n,5,()=>(V(t),H(()=>V(t).blockers)),qr,(e,t)=>{var n=lc(),r=F(n,!0);R(()=>q(r,V(t))),K(e,n)}),D(n),K(e,n)};J(u,e=>{V(t),H(()=>V(t).blockers?.length)&&e(d)});var m=I(u,2),h=e=>{var r=dc(),i=F(r,!0);R(e=>q(i,e),[()=>(U(Q),V(t),n(),H(()=>Q(V(t).reason===`drift`||V(t).reason===`ownership`?`batchReasonDrift`:V(t).reason===`provider`?`batchReasonProvider`:V(t).reason===`cancelled`?`batchReasonCancelled`:`batchReasonPreflight`,n())))]),K(e,r)};J(m,e=>{V(t),H(()=>V(t).reason&&!V(t).cleanupPending)&&e(h)});var g=I(m,2),_=N(g),v=F(_,!0),y=I(_),b=N(y),x=F(b,!0),S=F(I(b,2),!0);D(y);var C=F(I(y),!0);D(g);var w=I(g,2),ee=e=>{var r=fc(),i=F(r);R((e,t)=>{X(r,`href`,e),q(i,`${t??``} ↗`)},[()=>(V(t),H(()=>p(V(t).pullRequestUrl))),()=>(U(Q),n(),H(()=>Q(`batchOpenPull`,n())))]),K(e,r)},te=_t(()=>(V(t),H(()=>p(V(t).pullRequestUrl))));J(w,e=>{V(te)&&e(ee)});var ne=I(w,2),re=e=>{var r=bc(),i=P(r),a=N(i),o=F(a,!0),s=I(a,2),c=F(s,!0),l=F(I(s,2),!0);D(i);var u=I(i,2),d=e=>{var r=dc(),i=F(r);R((e,t)=>q(i,`${e??``}: ${t??``}.`),[()=>(U(Q),n(),H(()=>Q(`batchRetainedSecrets`,n()))),()=>(V(t),H(()=>V(t).retainedSecrets.join(`, `)))]),K(e,r)};J(u,e=>{V(t),H(()=>V(t).retainedSecrets.length)&&e(d)});var f=I(u,2),p=F(f,!0),m=I(f,2),h=e=>{var r=pc(),i=N(r),a=F(i,!0),o=I(i,2),s=F(o,!0),c=I(o,2);Y(c,5,()=>(V(t),H(()=>V(t).permissionProbes)),qr,(e,t)=>{var r=lc(),i=F(r);R((e,t)=>q(i,`${e??``}: ${t??``}`),[()=>(U(Ns),n(),V(t),H(()=>Ns(n(),V(t).scope))),()=>(U(Ps),n(),V(t),H(()=>Ps(n(),V(t).permission)))]),K(e,r)}),D(c);var l=I(c,2),u=e=>{var t=dc(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`planSecretProbeLimit`,n())))]),K(e,t)},d=_t(()=>(V(t),H(()=>V(t).permissionProbes.some(e=>e.permission===`Secrets`))));J(l,e=>{V(d)&&e(u)}),D(r),R((e,t)=>{q(a,e),q(s,t)},[()=>(U(Q),n(),H(()=>Q(`planPermissionProbeTitle`,n()))),()=>(U(Q),n(),H(()=>Q(`planPermissionProbeBody`,n())))]),K(e,r)};J(m,e=>{V(t),H(()=>V(t).permissionProbes?.length)&&e(h)});var g=I(m,2),_=e=>{var r=gc(),i=N(r),a=F(i,!0);Y(I(i,2),1,()=>(V(t),H(()=>V(t).files)),qr,(e,t)=>{var r=hc(),i=N(r),a=F(N(i),!0);D(i);var o=I(i,2),s=e=>{var t=dc(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`batchDeleteFile`,n())))]),K(e,t)},c=e=>{var n=mc(),r=F(n,!0);R(()=>q(r,(V(t),H(()=>V(t).content)))),K(e,n)};J(o,e=>{V(t),H(()=>V(t).content===null)?e(s):e(c,-1)}),D(r),R(()=>q(a,(V(t),H(()=>V(t).path)))),K(e,r)}),D(r),R(e=>q(a,e),[()=>(U(Q),n(),H(()=>Q(`batchReviewFiles`,n())))]),K(e,r)};J(g,e=>{V(t),H(()=>V(t).files.length)&&e(_)});var v=I(g,2),y=e=>{var r=_c(),i=N(r),a=F(i,!0),o=F(I(i),!0);D(r),R((e,t)=>{q(a,e),q(o,t)},[()=>(U(Q),n(),H(()=>Q(`batchRepositoryOverrides`,n()))),()=>(V(t),H(()=>V(t).repositoryVariables.join(`, `)))]),K(e,r)};J(v,e=>{V(t),H(()=>V(t).repositoryVariables.length)&&e(y)});var b=I(v,2),x=e=>{var r=yc(),i=N(r),a=F(i,!0),o=I(i);Y(o,5,()=>(V(t),H(()=>V(t).grants)),qr,(e,t)=>{var n=vc(),r=N(n),i=F(I(r),!0);D(n),R(()=>{q(r,`${V(t),H(()=>V(t).kind===`secret`?`Secret`:`Variable`)??``} `),q(i,(V(t),H(()=>V(t).name)))}),K(e,n)}),D(o),D(r),R(e=>q(a,e),[()=>(U(Q),n(),H(()=>Q(`batchReviewedAccess`,n())))]),K(e,r)};J(b,e=>{V(t),H(()=>V(t).grants.length)&&e(x)}),R((e,t,n,r)=>{q(o,e),q(c,t),q(l,n),q(p,r)},[()=>(U(Q),n(),V(t),H(()=>Q(`batchFilesCount`,n(),{count:String(V(t).files.length)}))),()=>(U(Q),n(),V(t),H(()=>Q(`batchVariablesCount`,n(),{count:String(V(t).repositoryVariables.length)}))),()=>(U(Q),n(),V(t),H(()=>Q(`batchGrantsCount`,n(),{count:String(V(t).grants.length)}))),()=>(U(Q),n(),H(()=>Q(`batchResourcesExplanation`,n())))]),K(e,r)},ie=_t(()=>(V(t),H(()=>![`waiting-for-merge`,`verification-pending`,`unchanged`].includes(V(t).status))));J(ne,e=>{V(ie)&&e(re)}),D(r),R((e,n)=>{q(a,(V(t),H(()=>V(t).repository))),q(s,e),q(v,n),q(x,(V(t),H(()=>V(t).installationBranch))),q(S,(V(t),H(()=>V(t).baseBranch))),q(C,(V(t),H(()=>V(t).baseSha)))},[()=>(U(Q),V(t),n(),H(()=>Q(f[V(t).status],n()))),()=>(U(Q),n(),H(()=>Q(`batchBranchReview`,n())))]),K(e,r)}),D(x);var S=I(x,2),C=e=>{var t=Sc(),r=N(t),i=F(r,!0),o=I(r,2),l=F(o,!0);D(t),R((e,t)=>{r.disabled=(U(s()),U(c()),V(a),H(()=>!s()||c()||!V(a).length)),q(i,e),o.disabled=!s()||c(),q(l,t)},[()=>(U(Q),n(),H(()=>Q(`batchApplyPlans`,n()))),()=>(U(Q),n(),H(()=>Q(`batchLeavePreview`,n())))]),W(`click`,r,()=>u()(`approve`)),W(`click`,o,()=>u()(`decline`)),K(e,t)},w=e=>{var t=Cc(),r=F(t,!0);R(e=>{t.disabled=(U(s()),U(c()),U(o()),H(()=>!s()||c()||o().stopRequested)),q(r,e)},[()=>(U(Q),n(),H(()=>Q(`batchStopPending`,n())))]),W(`click`,t,function(...e){d()?.apply(this,e)}),K(e,t)},ee=e=>{var t=Tc(),r=N(t),i=e=>{var t=wc(),r=F(t,!0);R(e=>{t.disabled=!s()||c(),q(r,e)},[()=>(U(Q),n(),H(()=>Q(`batchRetryPending`,n())))]),W(`click`,t,()=>u()(`retry`)),K(e,t)};J(r,e=>{V(a),U(o()),H(()=>V(a).length&&o().retryRemaining>0)&&e(i)});var l=I(r,2),d=F(l,!0);D(t),R(e=>{l.disabled=!s()||c(),q(d,e)},[()=>(U(Q),n(),H(()=>Q(`batchFinish`,n())))]),W(`click`,l,()=>u()(`finish`)),K(e,t)};J(S,e=>{l()===`review`?e(C):l()===`progress`?e(w,1):l()===`result`&&e(ee,2)});var te=I(S,2),ne=N(te),re=F(ne,!0),ie=F(I(ne),!0);D(te),D(m),R((e,t,n)=>{q(g,e),q(v,t),q(re,n),q(ie,(U(o()),H(()=>o().operationId)))},[()=>(U(Q),U(l()),n(),H(()=>Q(l()===`review`?`batchReviewTitle`:l()===`progress`?`batchProgressTitle`:`batchResultTitle`,n()))),()=>(U(Q),U(l()),n(),H(()=>Q(l()===`review`?`batchReviewBody`:l()===`progress`?`batchProgressBody`:`batchResultBody`,n()))),()=>(U(Q),n(),H(()=>Q(`batchTechnical`,n())))]),K(e,m),Je(),i()}Sr([`click`]);var Oc=G(``),kc=G(``),Ac=G(`

                                  `),jc=G(`
                                  `),Mc=G(`

                                  `,1);function Nc(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=j(),s=j(),c=Z(t,`selection`,8),l=Z(t,`controller`,8),u=Z(t,`busy`,8),d=Z(t,`onSubmit`,8),f=j([...c().selectedIds]),p=j(``),m=j(``),h=j(0);function g(e){M(f,V(f).includes(e)?V(f).filter(t=>t!==e):[...V(f),e])}function _(e){d()(JSON.stringify({action:e,selectedIds:V(f),...e===`resolve`?{name:V(m).trim()}:{}}))}L(()=>(U(c()),V(p)),()=>{M(a,c().candidates.filter(e=>e.name.toLowerCase().includes(V(p).toLowerCase())))}),L(()=>(V(h),V(a)),()=>{V(h)>0&&V(h)*25>=V(a).length&&M(h,0)}),L(()=>(V(a),V(h)),()=>{M(o,V(a).slice(V(h)*25,(V(h)+1)*25))}),L(()=>(V(f),U(c())),()=>{M(s,V(f).some(e=>!c().candidates.some(t=>t.id===e&&!t.unavailable)))}),En(),ki();var v=Mc(),y=P(v),b=F(y,!0),x=I(y,2),S=e=>{var t=Oc(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`batchDiscoveryUnavailable`,n())))]),K(e,t)};J(x,e=>{U(c()),H(()=>c().discoveryStatus===`unavailable`)&&e(S)});var C=I(x,2),w=e=>{var t=Oc(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),U(c()),n(),H(()=>Q(c().message===`lookup-unavailable`?`batchLookupUnavailable`:c().message===`selection-invalid`?`batchSelectionInvalid`:`batchAccessUnavailable`,n())))]),K(e,t)};J(C,e=>{U(c()),H(()=>c().message)&&e(w)});var ee=I(C,2),te=e=>{var t=Oc(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`batchDiscoveryTruncated`,n())))]),K(e,t)};J(ee,e=>{U(c()),H(()=>c().truncated)&&e(te)});var ne=I(ee,2),re=F(ne,!0),ie=I(ne,2);yi(ie);var ae=I(ie,2),oe=F(ae,!0),se=I(ae,2),ce=N(se),le=F(ce,!0),ue=I(ce,2);Y(ue,5,()=>V(o),e=>e.id,(e,t)=>{var r=kc(),i=N(r);yi(i);var a=I(i,2),o=N(a),s=F(o,!0),l=I(o),u=N(l),d=I(u),p=e=>{var t=Ar();R(e=>q(t,`· ${e??``}`),[()=>(U(Q),n(),H(()=>Q(`batchCurrent`,n())))]),K(e,t)};J(d,e=>{V(t),U(c()),H(()=>V(t).id===c().currentRepositoryId)&&e(p)});var m=I(d,2),h=e=>{var r=Ar();R(e=>q(r,`· ${e??``}`),[()=>(U(Q),V(t),n(),H(()=>Q(V(t).unavailable===`archived`?`batchArchived`:V(t).unavailable===`disabled`?`batchDisabled`:V(t).unavailable===`access-unavailable`?`batchAccessUnavailable`:`batchReadOnly`,n())))]),K(e,r)};J(m,e=>{V(t),H(()=>V(t).unavailable)&&e(h)}),D(l),D(a),D(r),R((e,n,r)=>{bi(i,e),i.disabled=n,q(s,(V(t),H(()=>V(t).name))),q(u,`${r??``} `)},[()=>(V(f),V(t),H(()=>V(f).includes(V(t).id))),()=>(V(f),V(t),H(()=>!V(f).includes(V(t).id)&&(!!V(t).unavailable||V(f).length>=25))),()=>(U(Q),V(t),n(),H(()=>Q(V(t).private?`batchPrivate`:`batchPublic`,n())))]),W(`change`,i,()=>g(V(t).id)),K(e,r)}),D(ue),D(se);var de=I(se,2),fe=e=>{var t=Ac(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`batchNoMatches`,n())))]),K(e,t)};J(de,e=>{V(a),H(()=>!V(a).length)&&e(fe)});var pe=I(de,2),me=e=>{var t=jc(),r=N(t),i=F(r,!0),o=I(r,2),s=F(o),c=I(o,2),d=F(c,!0);D(t),R((e,t,n)=>{r.disabled=V(h)===0||!l()||u(),q(i,e),q(s,`${V(h)+1} / ${t??``}`),c.disabled=(V(h),V(a),U(l()),U(u()),H(()=>(V(h)+1)*25>=V(a).length||!l()||u())),q(d,n)},[()=>(U(Q),n(),H(()=>Q(`batchPrevious`,n()))),()=>(V(a),H(()=>Math.ceil(V(a).length/25))),()=>(U(Q),n(),H(()=>Q(`batchNext`,n())))]),W(`click`,r,()=>M(h,V(h)-1)),W(`click`,c,()=>M(h,V(h)+1)),K(e,t)};J(pe,e=>{V(a),H(()=>V(a).length>25)&&e(me)});var he=I(pe,2),ge=N(he),_e=F(ge,!0),ve=I(ge,2),ye=F(ve,!0),be=I(ve,2),xe=F(be,!0),Se=I(be,2);yi(Se);var Ce=I(Se,2),we=N(Ce),T=F(we,!0),Te=I(we,2),E=F(Te,!0);D(Ce),D(he);var Ee=I(he,2),De=F(Ee,!0);R((e,t,n,r,i,a,o,c,d,p,m)=>{q(b,e),q(re,t),ie.disabled=!l()||u(),q(oe,n),se.disabled=!l()||u(),q(le,r),q(_e,i),q(ye,a),q(xe,o),Se.disabled=!l()||u(),we.disabled=c,q(T,d),Te.disabled=!l()||u(),q(E,p),Ee.disabled=(U(l()),U(u()),V(s),V(f),H(()=>!l()||u()||V(s)||V(f).length<1||V(f).length>25)),q(De,m)},[()=>(U(Q),n(),U(c()),H(()=>Q(`batchSelectionBody`,n(),{organization:c().organization}))),()=>(U(Q),n(),H(()=>Q(`batchFilter`,n()))),()=>(U(Q),n(),V(f),H(()=>Q(`batchSelectedCount`,n(),{count:String(V(f).length)}))),()=>(U(Q),n(),H(()=>Q(`batchRepositories`,n()))),()=>(U(Q),n(),H(()=>Q(`batchMissingRepository`,n()))),()=>(U(Q),n(),H(()=>Q(`batchAccessExplanation`,n()))),()=>(U(Q),n(),H(()=>Q(`batchExactName`,n()))),()=>(U(l()),U(u()),V(m),H(()=>!l()||u()||!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$/.test(V(m).trim()))),()=>(U(Q),n(),H(()=>Q(`batchFindRepository`,n()))),()=>(U(Q),n(),H(()=>Q(`batchChangeAccess`,n()))),()=>(U(Q),n(),H(()=>Q(`batchReviewSelection`,n())))]),W(`input`,ie,()=>M(h,0)),wi(ie,()=>V(p),e=>M(p,e)),wi(Se,()=>V(m),e=>M(m,e)),W(`click`,we,()=>_(`resolve`)),W(`click`,Te,()=>_(`access`)),W(`click`,Ee,()=>_(`select`)),K(e,v),Je(),i()}Sr([`input`,`change`,`click`]);var Pc=G(`

                                  `,1),Fc=G(``),Ic=G(``),Lc=G(``),Rc=G(`

                                  `,1),zc=G(`

                                  `,1);function Bc(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`prompt`,8),s=Z(t,`controller`,8),c=Z(t,`busy`,8),l=Z(t,`onSubmit`,8),u=j(o().kind===`quick-edit`?o().current:``);L(()=>n(),()=>{M(a,ea(n()))}),En(),ki();var d=jr(),f=P(d),p=e=>{var t=Rc(),r=P(t),i=F(r,!0),d=I(r,2),f=e=>{var t=Pc(),r=P(t),i=F(r,!0),a=I(r,2);{let e=k(()=>(U(Za),U(o()),n(),H(()=>Za(o().presentation[n()].documentation.url))));So(a,{get explanation(){return U(o()),n(),H(()=>o().presentation[n()])},get helpUrl(){return V(e)}})}R(()=>q(i,(U(o()),n(),H(()=>o().presentation[n()].summary)))),K(e,t)};J(d,e=>{U(o()),H(()=>o().presentation)&&e(f)});var p=I(d,2),m=F(p),h=I(p,2),g=N(h),_=F(g,!0),v=I(g,2),y=e=>{var t=Ic();Y(t,5,()=>(U(o()),H(()=>o().choices)),qr,(e,t)=>{var r=Fc(),i=F(r,!0),a={};R(e=>{q(i,e),a!==(a=V(t))&&(r.value=(r.__value=a)??``)},[()=>(U(ra),V(t),n(),H(()=>ra(V(t),n())))]),K(e,r)}),D(t),fi(t),R(()=>t.disabled=!s()||c()),pi(t,()=>V(u),e=>M(u,e)),K(e,t)},b=e=>{var t=Lc();yi(t),R(()=>{X(t,`min`,(U(o()),H(()=>o().min))),X(t,`max`,(U(o()),H(()=>o().max))),t.disabled=!s()||c()}),wi(t,()=>V(u),e=>M(u,e)),K(e,t)};J(v,e=>{U(o()),H(()=>o().choices)?e(y):e(b,-1)});var x=I(v,2),S=N(x),C=F(S,!0),w=I(S),ee=F(w,!0);D(x),D(h),R((e,t)=>{q(i,e),q(m,`${V(a),H(()=>V(a).current)??``}: ${t??``}`),q(_,(V(a),H(()=>V(a).next))),S.disabled=!s()||c(),q(C,(V(a),H(()=>V(a).back))),w.disabled=!s()||c(),q(ee,(V(a),H(()=>V(a).preview)))},[()=>(U(ta),U(o()),n(),H(()=>ta(o().id,n()))),()=>(U(ra),U(o()),n(),H(()=>ra(o().current,n())))]),xr(`submit`,h,e=>{e.preventDefault(),l()(String(V(u)??``))}),W(`click`,S,()=>l()(`cancel`)),K(e,t)},m=e=>{var t=zc(),r=P(t),i=F(r,!0),u=I(r),d=F(u,!0),f=I(u,2),p=N(f),m=F(p,!0),h=I(p),g=F(h,!0),_=I(h),v=F(_,!0),y=I(_),b=F(y,!0),x=I(y),S=F(x,!0),C=F(I(x),!0);D(f);var w=I(f,2);let ee;var te=F(w,!0),ne=I(w,2),re=F(ne,!0),ie=I(ne,2),ae=N(ie),oe=F(ae,!0),se=I(ae),ce=F(se,!0);D(ie),R((e,t,n)=>{q(i,(V(a),H(()=>V(a).review))),q(d,e),q(m,(V(a),H(()=>V(a).current))),q(g,t),q(v,(V(a),H(()=>V(a).next))),q(b,n),q(S,(V(a),H(()=>V(a).source))),q(C,(V(a),U(o()),H(()=>V(a)[o().change.scope]))),ee=ci(w,1,`banner`,null,ee,{warning:o().change.scope===`organization`}),q(te,(U(o()),V(a),H(()=>o().change.scope===`organization`?V(a).orgImpact:V(a).repoImpact))),q(re,(V(a),H(()=>V(a).effect))),ae.disabled=!s()||c(),q(oe,(V(a),H(()=>V(a).back))),se.disabled=!s()||c(),q(ce,(V(a),H(()=>V(a).apply)))},[()=>(U(ta),U(o()),n(),H(()=>ta(o().change.id,n()))),()=>(U(ra),U(o()),n(),H(()=>ra(o().change.before,n()))),()=>(U(ra),U(o()),n(),H(()=>ra(o().change.after,n())))]),W(`click`,ae,()=>l()(`cancel`)),W(`click`,se,()=>l()(`approve`)),K(e,t)};J(f,e=>{U(o()),H(()=>o().kind===`quick-edit`)?e(p):e(m,-1)}),K(e,d),Je(),i()}Sr([`click`]);function Vc(e,t){let n=t,r=!0,i=()=>queueMicrotask(()=>{if(!r||!e.isConnected)return;let t=e.querySelector?.(`h2`);t?.isConnected?(t.setAttribute(`tabindex`,`-1`),t.focus({preventScroll:!1})):e.focus({preventScroll:!1})});return i(),{update(e){e!==n&&(n=e,i())},destroy(){r=!1}}}var Hc=G(`

                                  `),Uc=G(`

                                  `),Wc=G(`
                                  `);function Gc(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`prompt`,8),s=Z(t,`revision`,8),c=Z(t,`promptRevision`,8),l=Z(t,`controller`,8),u=Z(t,`busy`,8),d=Z(t,`onSubmit`,8),f=Z(t,`onRetryDiscovery`,8),p=Z(t,`onBack`,8);L(()=>(U(o()),n()),()=>{M(a,Ma(o(),n()))}),En(),ki();var m=Wc(),h=N(m),g=N(h),_=F(g,!0),v=F(I(g));D(h);var y=I(h,2),b=e=>{var t=Hc(),r=F(t,!0);R(e=>q(r,e),[()=>(U(o()),U(Q),n(),V(a),H(()=>o().kind===`repositories`?Q(`batchReviewSelection`,n()):V(a)?.title??o().title))]),K(e,t)},x=_t(()=>(U(o()),H(()=>![`question`,`management`,`quick-edit`,`quick-review`,`batch-plan`,`batch-result`].includes(o().kind))));J(y,e=>{V(x)&&e(b)});var S=I(y,2),C=e=>{var t=Uc(),n=F(t,!0);R(()=>q(n,(V(a),U(o()),H(()=>V(a)?.description??(`description`in o()?o().description:``))))),K(e,t)};J(S,e=>{V(a),U(o()),H(()=>V(a)?.description||`description`in o()&&o().description)&&e(C)}),Kr(I(S,2),c,e=>{var t=jr(),n=P(t),r=e=>{{let t=k(()=>(U(o()),H(()=>o().kind===`batch-plan`?`review`:`result`)));Dc(e,{get batch(){return U(o()),H(()=>o().batch)},get mode(){return V(t)},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})}},i=e=>{Nc(e,{get selection(){return U(o()),H(()=>o().selection)},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})},a=e=>{qo(e,{get prompt(){return o()},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()},get onRetryDiscovery(){return f()},get onBack(){return p()}})},s=e=>{Zo(e,{get prompt(){return o()},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})},c=e=>{os(e,{get prompt(){return o()},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})},m=e=>{Ks(e,{get prompt(){return o()},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})},h=e=>{oc(e,{get view(){return U(o()),H(()=>o().management)},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})},g=e=>{Bc(e,{get prompt(){return o()},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})};J(n,e=>{U(o()),H(()=>o().kind===`batch-plan`||o().kind===`batch-result`)?e(r):(U(o()),H(()=>o().kind===`repositories`)?e(i,1):(U(o()),H(()=>o().kind===`question`)?e(a,2):(U(o()),H(()=>o().kind===`choice`||o().kind===`confirm`)?e(s,3):(U(o()),H(()=>o().kind===`text`||o().kind===`secret`)?e(c,4):(U(o()),H(()=>o().kind===`plan`)?e(m,5):(U(o()),H(()=>o().kind===`management`)?e(h,6):(U(o()),H(()=>o().kind===`quick-edit`||o().kind===`quick-review`)&&e(g,7))))))))}),K(e,t)}),D(m),ni(m,(e,t)=>Vc?.(e,t),c),R((e,t,n)=>{X(m,`aria-label`,e),q(_,t),q(v,`${n??``} ${s()??``}`)},[()=>(U(Q),n(),H(()=>Q(`currentDecision`,n()))),()=>(U(Q),n(),H(()=>Q(`currentDecision`,n()))),()=>(U(Q),n(),H(()=>Q(`session`,n())))]),K(e,m),Je(),i()}var Kc=`Create the reviewed installation commit and installer-owned branch.(Include reviewed workflow files in the installation PR.(Create the reviewed installation PR without merging it.(Add only the reviewed repository access to an existing selected resource.(Inspect reusable organization configuration without changing its values.(Inspect effective repository overrides.(Inspect existing Secret names without reading their values.(Inspect inherited Secret access without replacing existing bindings.(Inspect existing trusted credential-health evidence.(Resolve repository identity and visibility.(Inspect installed workflows and repository files.(Inspect and provision selected GitHub Actions Secrets.(Inspect and provision selected GitHub Actions Variables.(Provision labels and issue resources.(Inspect and dispatch credential-health workflows.(Inspect CI workflow runs and jobs for exact producer identities.(Discover exact CI check and producer identities for guarded approval.(Inspect branch protection and rulesets.(Bootstrap a missing credential-health workflow.(Inspect and provision organization Actions Secrets.(Inspect and provision organization Actions Variables.(Provision and assign configured issue types.(Inspect selected Projects and their Status options; setup does not edit Project items.(Create the initial repository tag when no version tag exists.(Create an isolated branch for the Actions permission check.(Create the initial tag and an isolated branch for the Actions permission check.(Create the initial tag or an isolated branch for the Actions permission check.(Inspect and provision selected repository Actions Secrets.(Inspect and provision selected repository Actions Variables.(Provision labels for the selected issue workflows.(Dispatch credential-health checks for existing Secrets.(Prepare and clean isolated Actions checks for the bot PAT and any existing credentials.(Prepare a verified no-job workflow for the bot Actions check.(Inspect CI workflow runs and jobs for approval evidence.(Temporarily install credential health when its workflow is not confirmed installed.(Inspect branch protection and effective rulesets.(Inspect and provision selected organization Actions Secrets.(Inspect and provision selected organization Actions Variables.(Provision native issue types for the selected workflows.(Resolve repository and collaborator metadata.(Read repository branches, commits, and files for enabled runtime routes.(Dispatch selected release or hotfix workflows and check previous runs.(Check previous workflow runs before executing an enabled route.(Create managed branches, edit files, or merge selected release/hotfix changes.(Manage selected issue lifecycles, comments, and progress.(Manage selected pull request workflows, reviews, or autofix.(Verify current-head required checks and producer identities.(Load the PR approval assessment policy.(Select or authorize organization members for enabled workflows.(Assign configured organization issue types.(Update selected organization Projects.(Load the organization-scoped approval policy.(Secret provisioning enabled(Variable provisioning enabled(Issue workflows enabled(Credential health enabled(Initial tag or credential-health check enabled(Pull-request approval enabled(Guarded pull-request approval enabled(Release, hotfix, or guarded approval enabled(Temporary health workflow required(Organization Secret storage selected(Organization Variable storage selected(Issue type automation enabled(Organization Projects selected`.split(`(`),qc={"Create the reviewed installation commit and installer-owned branch.":`Crear el commit de instalación revisado y la rama del instalador.`,"Include reviewed workflow files in the installation PR.":`Incluir los workflows revisados en la PR de instalación.`,"Create the reviewed installation PR without merging it.":`Crear la PR de instalación revisada sin fusionarla.`,"Add only the reviewed repository access to an existing selected resource.":`Añadir solo el acceso del repositorio revisado a un recurso existente de visibilidad seleccionada.`,"Inspect reusable organization configuration without changing its values.":`Inspeccionar la configuración reutilizable de la organización sin cambiar sus valores.`,"Inspect effective repository overrides.":`Inspeccionar los ajustes efectivos del repositorio.`,"Inspect existing Secret names without reading their values.":`Inspeccionar los nombres de los Secrets existentes sin leer sus valores.`,"Inspect inherited Secret access without replacing existing bindings.":`Inspeccionar el acceso a los Secrets heredados sin sustituir los existentes.`,"Inspect existing trusted credential-health evidence.":`Inspeccionar la evidencia fiable existente sobre las credenciales.`,"Resolve repository identity and visibility.":`Comprobar la identidad y visibilidad del repositorio.`,"Inspect installed workflows and repository files.":`Examinar los workflows instalados y los archivos del repositorio.`,"Inspect and provision selected GitHub Actions Secrets.":`Examinar y configurar los Secrets de GitHub Actions seleccionados.`,"Inspect and provision selected GitHub Actions Variables.":`Examinar y configurar las Variables de GitHub Actions seleccionadas.`,"Provision labels and issue resources.":`Crear etiquetas y recursos de issues.`,"Inspect and dispatch credential-health workflows.":`Examinar y ejecutar los workflows de comprobación de credenciales.`,"Inspect CI workflow runs and jobs for exact producer identities.":`Examinar ejecuciones y jobs de CI para identificar sus productores exactos.`,"Discover exact CI check and producer identities for guarded approval.":`Identificar los checks de CI y sus productores exactos para la aprobación protegida.`,"Inspect branch protection and rulesets.":`Examinar la protección de ramas y sus reglas.`,"Bootstrap a missing credential-health workflow.":`Instalar provisionalmente el workflow de comprobación de credenciales que falta.`,"Inspect and provision organization Actions Secrets.":`Examinar y configurar Secrets de Actions en la organización.`,"Inspect and provision organization Actions Variables.":`Examinar y configurar Variables de Actions en la organización.`,"Provision and assign configured issue types.":`Crear y asignar los tipos de issue configurados.`,"Inspect selected Projects and their Status options; setup does not edit Project items.":`Consultar los Projects seleccionados y sus opciones de Status; el setup no modifica los elementos de los Projects.`,"Create the initial repository tag when no version tag exists.":`Crear el tag inicial si el repositorio aún no tiene ninguno de versión.`,"Create an isolated branch for the Actions permission check.":`Crear una rama aislada para comprobar el permiso de Actions.`,"Create the initial tag and an isolated branch for the Actions permission check.":`Crear el tag inicial y una rama aislada para comprobar el permiso de Actions.`,"Create the initial tag or an isolated branch for the Actions permission check.":`Crear el tag inicial o una rama aislada para comprobar el permiso de Actions.`,"Inspect and provision selected repository Actions Secrets.":`Examinar y configurar los Secrets de Actions seleccionados en el repositorio.`,"Inspect and provision selected repository Actions Variables.":`Examinar y configurar las Variables de Actions seleccionadas en el repositorio.`,"Provision labels for the selected issue workflows.":`Crear las etiquetas de los flujos de issues seleccionados.`,"Dispatch credential-health checks for existing Secrets.":`Ejecutar comprobaciones de credenciales para los Secrets existentes.`,"Prepare and clean isolated Actions checks for the bot PAT and any existing credentials.":`Preparar y limpiar las pruebas aisladas de Actions para el PAT del bot y las credenciales existentes.`,"Prepare a verified no-job workflow for the bot Actions check.":`Preparar un workflow verificado con los jobs desactivados para comprobar Actions con el PAT del bot.`,"Inspect CI workflow runs and jobs for approval evidence.":`Examinar ejecuciones y jobs de CI como prueba para la aprobación.`,"Temporarily install credential health when its workflow is not confirmed installed.":`Instalar temporalmente la comprobación de credenciales si su workflow no está confirmado.`,"Inspect branch protection and effective rulesets.":`Examinar la protección de ramas y las reglas efectivas.`,"Inspect and provision selected organization Actions Secrets.":`Examinar y configurar los Secrets de Actions seleccionados en la organización.`,"Inspect and provision selected organization Actions Variables.":`Examinar y configurar las Variables de Actions seleccionadas en la organización.`,"Provision native issue types for the selected workflows.":`Crear tipos de issue nativos para los flujos seleccionados.`,"Resolve repository and collaborator metadata.":`Consultar los metadatos del repositorio y sus colaboradores.`,"Read repository branches, commits, and files for enabled runtime routes.":`Leer ramas, commits y archivos del repositorio para las rutas de ejecución habilitadas.`,"Dispatch selected release or hotfix workflows and check previous runs.":`Ejecutar los flujos de release o hotfix seleccionados y comprobar ejecuciones anteriores.`,"Check previous workflow runs before executing an enabled route.":`Comprobar ejecuciones anteriores antes de iniciar un flujo habilitado.`,"Create managed branches, edit files, or merge selected release/hotfix changes.":`Crear ramas gestionadas, editar archivos o integrar cambios de release y hotfix.`,"Manage selected issue lifecycles, comments, and progress.":`Gestionar el ciclo de vida, los comentarios y el progreso de los issues seleccionados.`,"Manage selected pull request workflows, reviews, or autofix.":`Gestionar flujos de pull requests, revisiones o correcciones automáticas.`,"Verify current-head required checks and producer identities.":`Verificar los checks obligatorios y productores del commit actual.`,"Load the PR approval assessment policy.":`Leer la política de evaluación de aprobación de PRs.`,"Select or authorize organization members for enabled workflows.":`Seleccionar o autorizar miembros de la organización para los flujos activos.`,"Assign configured organization issue types.":`Asignar los tipos de issue configurados en la organización.`,"Update selected organization Projects.":`Actualizar los Projects seleccionados de la organización.`,"Load the organization-scoped approval policy.":`Leer la política de aprobación guardada en la organización.`,"Secret provisioning enabled":`Configuración de Secrets activada`,"Variable provisioning enabled":`Configuración de Variables activada`,"Issue workflows enabled":`Flujos de issues activados`,"Credential health enabled":`Comprobación de credenciales activada`,"Initial tag or credential-health check enabled":`Tag inicial o comprobación de credenciales activados`,"Pull-request approval enabled":`Aprobación de pull requests activada`,"Guarded pull-request approval enabled":`Aprobación protegida de pull requests activada`,"Release, hotfix, or guarded approval enabled":`Release, hotfix o aprobación protegida activados`,"Temporary health workflow required":`Hace falta un workflow temporal de comprobación`,"Organization Secret storage selected":`Se eligió guardar Secrets en la organización`,"Organization Variable storage selected":`Se eligió guardar Variables en la organización`,"Issue type automation enabled":`Automatización de tipos de issue activada`,"Organization Projects selected":`Se seleccionaron Projects de la organización`},Jc={"Create the reviewed installation commit and installer-owned branch.":`Créer le commit d’installation validé et la branche de l’installateur.`,"Include reviewed workflow files in the installation PR.":`Inclure les workflows validés dans la PR d’installation.`,"Create the reviewed installation PR without merging it.":`Créer la PR d’installation validée sans la fusionner.`,"Add only the reviewed repository access to an existing selected resource.":`Ajouter uniquement l’accès validé du dépôt à une ressource existante de visibilité sélectionnée.`,"Inspect reusable organization configuration without changing its values.":`Lire la configuration réutilisable de l’organisation sans modifier ses valeurs.`,"Inspect effective repository overrides.":`Lire les réglages effectifs du dépôt.`,"Inspect existing Secret names without reading their values.":`Lire les noms des Secrets existants sans accéder à leurs valeurs.`,"Inspect inherited Secret access without replacing existing bindings.":`Vérifier l’accès aux Secrets hérités sans remplacer les liaisons existantes.`,"Inspect existing trusted credential-health evidence.":`Lire les preuves fiables existantes de vérification des identifiants.`,"Resolve repository identity and visibility.":`Vérifier l’identité et la visibilité du dépôt.`,"Inspect installed workflows and repository files.":`Examiner les workflows installés et les fichiers du dépôt.`,"Inspect and provision selected GitHub Actions Secrets.":`Examiner et configurer les Secrets GitHub Actions choisis.`,"Inspect and provision selected GitHub Actions Variables.":`Examiner et configurer les Variables GitHub Actions choisies.`,"Provision labels and issue resources.":`Créer des étiquettes et des ressources pour les tickets.`,"Inspect and dispatch credential-health workflows.":`Examiner et lancer les workflows de vérification des identifiants.`,"Inspect CI workflow runs and jobs for exact producer identities.":`Examiner les exécutions et jobs CI pour identifier exactement leurs producteurs.`,"Discover exact CI check and producer identities for guarded approval.":`Identifier précisément les vérifications CI et leurs producteurs pour l’approbation encadrée.`,"Inspect branch protection and rulesets.":`Examiner la protection des branches et les ensembles de règles.`,"Bootstrap a missing credential-health workflow.":`Installer provisoirement le workflow de vérification des identifiants manquant.`,"Inspect and provision organization Actions Secrets.":`Examiner et configurer les Secrets Actions de l’organisation.`,"Inspect and provision organization Actions Variables.":`Examiner et configurer les Variables Actions de l’organisation.`,"Provision and assign configured issue types.":`Créer et attribuer les types de ticket configurés.`,"Inspect selected Projects and their Status options; setup does not edit Project items.":`Consulter les Projects sélectionnés et leurs options Status ; la configuration ne modifie aucun élément de Project.`,"Create the initial repository tag when no version tag exists.":`Créer le tag initial si le dépôt ne possède encore aucun tag de version.`,"Create an isolated branch for the Actions permission check.":`Créer une branche isolée pour vérifier l’autorisation Actions.`,"Create the initial tag and an isolated branch for the Actions permission check.":`Créer le tag initial et une branche isolée pour vérifier l’autorisation Actions.`,"Create the initial tag or an isolated branch for the Actions permission check.":`Créer le tag initial ou une branche isolée pour vérifier l’autorisation Actions.`,"Inspect and provision selected repository Actions Secrets.":`Examiner et configurer les Secrets Actions choisis dans le dépôt.`,"Inspect and provision selected repository Actions Variables.":`Examiner et configurer les Variables Actions choisies dans le dépôt.`,"Provision labels for the selected issue workflows.":`Créer les étiquettes des workflows de ticket choisis.`,"Dispatch credential-health checks for existing Secrets.":`Lancer des vérifications d’identifiants pour les Secrets existants.`,"Prepare and clean isolated Actions checks for the bot PAT and any existing credentials.":`Préparer et nettoyer les tests Actions isolés du PAT du bot et des identifiants existants.`,"Prepare a verified no-job workflow for the bot Actions check.":`Préparer un workflow vérifié aux jobs désactivés pour tester Actions avec le PAT du bot.`,"Inspect CI workflow runs and jobs for approval evidence.":`Examiner les exécutions et jobs CI comme preuve pour l’approbation.`,"Temporarily install credential health when its workflow is not confirmed installed.":`Installer provisoirement la vérification des identifiants si son workflow n’est pas confirmé.`,"Inspect branch protection and effective rulesets.":`Examiner la protection des branches et les règles applicables.`,"Inspect and provision selected organization Actions Secrets.":`Examiner et configurer les Secrets Actions choisis dans l’organisation.`,"Inspect and provision selected organization Actions Variables.":`Examiner et configurer les Variables Actions choisies dans l’organisation.`,"Provision native issue types for the selected workflows.":`Créer des types de ticket natifs pour les workflows choisis.`,"Resolve repository and collaborator metadata.":`Consulter les métadonnées du dépôt et de ses collaborateurs.`,"Read repository branches, commits, and files for enabled runtime routes.":`Lire les branches, commits et fichiers du dépôt pour les parcours d’exécution activés.`,"Dispatch selected release or hotfix workflows and check previous runs.":`Lancer les workflows de version ou correctif urgent choisis et vérifier les exécutions précédentes.`,"Check previous workflow runs before executing an enabled route.":`Vérifier les exécutions précédentes avant de lancer un parcours activé.`,"Create managed branches, edit files, or merge selected release/hotfix changes.":`Créer des branches gérées, modifier des fichiers ou fusionner les changements de version et correctif.`,"Manage selected issue lifecycles, comments, and progress.":`Gérer le cycle de vie, les commentaires et la progression des tickets choisis.`,"Manage selected pull request workflows, reviews, or autofix.":`Gérer les workflows de pull request, les revues ou les corrections automatiques.`,"Verify current-head required checks and producer identities.":`Vérifier les contrôles requis et leurs producteurs pour le commit courant.`,"Load the PR approval assessment policy.":`Lire la politique d’évaluation de l’approbation des PR.`,"Select or authorize organization members for enabled workflows.":`Sélectionner ou autoriser des membres de l’organisation pour les workflows activés.`,"Assign configured organization issue types.":`Attribuer les types de ticket configurés dans l’organisation.`,"Update selected organization Projects.":`Mettre à jour les projets de l’organisation choisis.`,"Load the organization-scoped approval policy.":`Lire la politique d’approbation stockée dans l’organisation.`,"Secret provisioning enabled":`Configuration des Secrets activée`,"Variable provisioning enabled":`Configuration des Variables activée`,"Issue workflows enabled":`Workflows de ticket activés`,"Credential health enabled":`Vérification des identifiants activée`,"Initial tag or credential-health check enabled":`Tag initial ou vérification des identifiants activés`,"Pull-request approval enabled":`Approbation des pull requests activée`,"Guarded pull-request approval enabled":`Approbation encadrée des pull requests activée`,"Release, hotfix, or guarded approval enabled":`Version, correctif urgent ou approbation encadrée activés`,"Temporary health workflow required":`Workflow temporaire de vérification requis`,"Organization Secret storage selected":`Stockage des Secrets dans l’organisation choisi`,"Organization Variable storage selected":`Stockage des Variables dans l’organisation choisi`,"Issue type automation enabled":`Automatisation des types de ticket activée`,"Organization Projects selected":`Projets de l’organisation choisis`},Yc={"Create the reviewed installation commit and installer-owned branch.":`Criar o commit de instalação revisto e o ramo do instalador.`,"Include reviewed workflow files in the installation PR.":`Incluir os workflows revistos na PR de instalação.`,"Create the reviewed installation PR without merging it.":`Criar a PR de instalação revista sem a integrar.`,"Add only the reviewed repository access to an existing selected resource.":`Adicionar apenas o acesso revisto do repositório a um recurso existente de visibilidade selecionada.`,"Inspect reusable organization configuration without changing its values.":`Consultar a configuração reutilizável da organização sem alterar os seus valores.`,"Inspect effective repository overrides.":`Consultar os ajustes efetivos do repositório.`,"Inspect existing Secret names without reading their values.":`Consultar os nomes dos Secrets existentes sem ler os seus valores.`,"Inspect inherited Secret access without replacing existing bindings.":`Consultar o acesso aos Secrets herdados sem substituir as ligações existentes.`,"Inspect existing trusted credential-health evidence.":`Consultar as provas fiáveis existentes da verificação das credenciais.`,"Resolve repository identity and visibility.":`Verificar a identidade e visibilidade do repositório.`,"Inspect installed workflows and repository files.":`Inspecionar os fluxos instalados e os ficheiros do repositório.`,"Inspect and provision selected GitHub Actions Secrets.":`Inspecionar e configurar os Secrets do GitHub Actions selecionados.`,"Inspect and provision selected GitHub Actions Variables.":`Inspecionar e configurar as Variables do GitHub Actions selecionadas.`,"Provision labels and issue resources.":`Criar etiquetas e recursos para questões.`,"Inspect and dispatch credential-health workflows.":`Inspecionar e executar os fluxos de verificação de credenciais.`,"Inspect CI workflow runs and jobs for exact producer identities.":`Inspecionar execuções e jobs CI para identificar exatamente os seus produtores.`,"Discover exact CI check and producer identities for guarded approval.":`Identificar as verificações CI e os seus produtores exatos para a aprovação protegida.`,"Inspect branch protection and rulesets.":`Inspecionar a proteção de ramos e os conjuntos de regras.`,"Bootstrap a missing credential-health workflow.":`Instalar temporariamente o fluxo de verificação de credenciais em falta.`,"Inspect and provision organization Actions Secrets.":`Inspecionar e configurar os Secrets de Actions da organização.`,"Inspect and provision organization Actions Variables.":`Inspecionar e configurar as Variables de Actions da organização.`,"Provision and assign configured issue types.":`Criar e atribuir os tipos de questão configurados.`,"Inspect selected Projects and their Status options; setup does not edit Project items.":`Consultar os Projects selecionados e as suas opções de Status; a configuração não altera os itens dos Projects.`,"Create the initial repository tag when no version tag exists.":`Criar a etiqueta inicial se o repositório ainda não tiver etiquetas de versão.`,"Create an isolated branch for the Actions permission check.":`Criar um ramo isolado para verificar a permissão de Actions.`,"Create the initial tag and an isolated branch for the Actions permission check.":`Criar a etiqueta inicial e um ramo isolado para verificar a permissão de Actions.`,"Create the initial tag or an isolated branch for the Actions permission check.":`Criar a etiqueta inicial ou um ramo isolado para verificar a permissão de Actions.`,"Inspect and provision selected repository Actions Secrets.":`Inspecionar e configurar os Secrets de Actions selecionados no repositório.`,"Inspect and provision selected repository Actions Variables.":`Inspecionar e configurar as Variables de Actions selecionadas no repositório.`,"Provision labels for the selected issue workflows.":`Criar etiquetas para os fluxos de questões selecionados.`,"Dispatch credential-health checks for existing Secrets.":`Executar verificações de credenciais para os Secrets existentes.`,"Prepare and clean isolated Actions checks for the bot PAT and any existing credentials.":`Preparar e limpar os testes isolados de Actions para o PAT do bot e as credenciais existentes.`,"Prepare a verified no-job workflow for the bot Actions check.":`Preparar um workflow verificado com os jobs desativados para testar Actions com o PAT do bot.`,"Inspect CI workflow runs and jobs for approval evidence.":`Inspecionar execuções e jobs CI como prova para aprovação.`,"Temporarily install credential health when its workflow is not confirmed installed.":`Instalar temporariamente a verificação de credenciais se o fluxo não estiver confirmado.`,"Inspect branch protection and effective rulesets.":`Inspecionar a proteção de ramos e as regras aplicáveis.`,"Inspect and provision selected organization Actions Secrets.":`Inspecionar e configurar os Secrets de Actions selecionados na organização.`,"Inspect and provision selected organization Actions Variables.":`Inspecionar e configurar as Variables de Actions selecionadas na organização.`,"Provision native issue types for the selected workflows.":`Criar tipos de questão nativos para os fluxos selecionados.`,"Resolve repository and collaborator metadata.":`Consultar os metadados do repositório e dos colaboradores.`,"Read repository branches, commits, and files for enabled runtime routes.":`Ler branches, commits e arquivos do repositório para os fluxos de execução habilitados.`,"Dispatch selected release or hotfix workflows and check previous runs.":`Executar os fluxos de release ou hotfix selecionados e verificar execuções anteriores.`,"Check previous workflow runs before executing an enabled route.":`Verificar execuções anteriores antes de iniciar um percurso ativo.`,"Create managed branches, edit files, or merge selected release/hotfix changes.":`Criar ramos geridos, editar ficheiros ou integrar alterações de release e hotfix.`,"Manage selected issue lifecycles, comments, and progress.":`Gerir o ciclo de vida, os comentários e o progresso das questões selecionadas.`,"Manage selected pull request workflows, reviews, or autofix.":`Gerir fluxos de pull requests, revisões ou correções automáticas.`,"Verify current-head required checks and producer identities.":`Verificar as verificações obrigatórias e os produtores do commit atual.`,"Load the PR approval assessment policy.":`Ler a política de avaliação de aprovação de PRs.`,"Select or authorize organization members for enabled workflows.":`Selecionar ou autorizar membros da organização para os fluxos ativos.`,"Assign configured organization issue types.":`Atribuir os tipos de questão configurados na organização.`,"Update selected organization Projects.":`Atualizar os Projetos selecionados da organização.`,"Load the organization-scoped approval policy.":`Ler a política de aprovação guardada na organização.`,"Secret provisioning enabled":`Configuração de Secrets ativa`,"Variable provisioning enabled":`Configuração de Variables ativa`,"Issue workflows enabled":`Fluxos de questões ativos`,"Credential health enabled":`Verificação de credenciais ativa`,"Initial tag or credential-health check enabled":`Etiqueta inicial ou verificação de credenciais ativas`,"Pull-request approval enabled":`Aprovação de pull requests ativa`,"Guarded pull-request approval enabled":`Aprovação protegida de pull requests ativa`,"Release, hotfix, or guarded approval enabled":`Release, hotfix ou aprovação protegida ativos`,"Temporary health workflow required":`É necessário um fluxo temporário de verificação`,"Organization Secret storage selected":`Armazenamento dos Secrets na organização selecionado`,"Organization Variable storage selected":`Armazenamento das Variables na organização selecionado`,"Issue type automation enabled":`Automatização de tipos de questão ativa`,"Organization Projects selected":`Projetos da organização selecionados`},Xc=new Set(Kc),Zc={es:qc,fr:Jc,pt:Yc};function Qc(e,t){return e===`en`?t:Xc.has(t)?Zc[e][t]:Q(`permissionUnknown`,e)}var $c={en:{"contents-write":`Actions was not tested because its temporary branch could not be created. Check repository Contents Write, repository selection and organization authorization.`,"contents-workflows-write":`Actions was not tested because its temporary workflow could not be written. Check repository Contents and Workflows Write, repository selection and organization authorization. Unverifiable does not mean Actions is missing.`,"dispatch-workflow":`Actions was not tested because no active workflow_dispatch workflow was found on the default branch. Install an eligible workflow before retrying.`},es:{"contents-write":`No se comprobó Actions porque no se pudo crear su rama temporal. Revisa Contents Write del repositorio, la selección del repositorio y la autorización de la organización.`,"contents-workflows-write":`No se comprobó Actions porque no se pudo escribir su workflow temporal. Revisa Contents y Workflows Write del repositorio, la selección del repositorio y la autorización de la organización. No verificable no significa que falte Actions.`,"dispatch-workflow":`No se comprobó Actions porque no se encontró un workflow activo con workflow_dispatch en la rama predeterminada. Instala uno antes de reintentar.`},fr:{"contents-write":`Actions n’a pas été testé car sa branche temporaire n’a pas pu être créée. Vérifiez Contents Write du dépôt, la sélection du dépôt et l’autorisation de l’organisation.`,"contents-workflows-write":`Actions n’a pas été testé car son workflow temporaire n’a pas pu être écrit. Vérifiez Contents et Workflows Write du dépôt, la sélection du dépôt et l’autorisation de l’organisation. Non vérifiable ne signifie pas qu’Actions manque.`,"dispatch-workflow":`Actions n’a pas été testé car aucun workflow actif avec workflow_dispatch n’a été trouvé sur la branche par défaut. Installez-en un avant de réessayer.`},pt:{"contents-write":`Actions não foi testado porque não foi possível criar a sua branch temporária. Verifique Contents Write do repositório, a seleção do repositório e a autorização da organização.`,"contents-workflows-write":`Actions não foi testado porque não foi possível escrever o seu workflow temporário. Verifique Contents e Workflows Write do repositório, a seleção do repositório e a autorização da organização. Não verificável não significa que falte Actions.`,"dispatch-workflow":`Actions não foi testado porque não foi encontrado um workflow ativo com workflow_dispatch na branch predefinida. Instale um antes de tentar novamente.`}};function el(e,t){if(e===`contents-write`||e===`contents-workflows-write`||e===`dispatch-workflow`)return $c[t][e]}function tl(e,t){if(e.status===`unverifiable`&&e.permission===`Actions`&&e.level===`write`){let n=el(e.prerequisite,t);if(n)return n}return e.status===`verified`?Q(e.level===`write`?`permissionEvidenceVerifiedWrite`:e.scope===`organization`&&e.permission===`Projects`&&e.level===`read`?`permissionEvidencePrivateProject`:`permissionEvidenceVerified`,t):e.status===`missing`?Q(`permissionEvidenceMissing`,t):e.status===`available`?Q(e.publicReadEvidence===`public-organization-projects`?`permissionEvidencePublicProjects`:`permissionEvidencePublic`,t):e.level===`write`?Q(`permissionEvidenceWrite`,t):e.publicReadEvidence===`public-organization-projects`?Q(`permissionEvidencePublicProjects`,t):e.publicReadEvidence===`public-repository`?Q(`permissionEvidencePublic`,t):Q(`permissionEvidenceUnknownRead`,t)}var nl=G(` `),rl=G(` `),il=G(`
                                • `),al=G(`

                                    `),ol=G(`

                                    `),sl=G(``);function cl(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`view`,8);ki();var o=sl(),s=N(o),c=I(N(s)),l=F(c,!0),u=I(c),d=F(u,!0),f=I(u),p=F(N(f),!0);D(f),D(s);var m=I(s,2),h=e=>{var t=al(),r=I(N(t)),i=F(r),o=I(r),s=F(o,!0),c=I(o,2);Y(c,5,()=>(U(a()),H(()=>a().permissions.report?.checks??a().permissions.requirements??[])),qr,(e,t)=>{var r=il(),i=N(r),a=N(i,!0),o=I(a),s=e=>{var n=nl(),r=F(N(n));D(n),R(()=>q(r,`GitHub · ${V(t),H(()=>V(t).permission)??``}`)),K(e,n)},c=_t(()=>(n(),U(Ps),V(t),H(()=>n()!==`en`&&Ps(n(),V(t).permission)!==V(t).permission)));J(o,e=>{V(c)&&e(s)});var l=I(o),u=F(l),d=I(l),f=F(d,!0),p=I(d),m=e=>{var r=rl(),i=F(r,!0);R(e=>q(i,e),[()=>(U(Qc),n(),V(t),H(()=>Qc(n(),V(t).condition)))]),K(e,r)};J(p,e=>{V(t),H(()=>V(t).condition)&&e(m)});var h=I(p),g=e=>{var r=rl(),i=F(r,!0);R(e=>q(i,e),[()=>(U(tl),V(t),n(),H(()=>tl(V(t),n())))]),K(e,r)};J(h,e=>{`status`in V(t)&&e(g)}),D(i);var _=I(i),v=N(_,!0),y=I(v),b=e=>{var r=rl(),i=F(r,!0);R(e=>q(i,e),[()=>(U(Fs),n(),V(t),H(()=>Fs(n(),V(t).status)))]),K(e,r)},x=_t(()=>(V(t),U(Fs),n(),H(()=>`status`in V(t)&&Fs(n(),V(t).status))));J(y,e=>{V(x)&&e(b)}),D(_),D(r),R((e,t,n,r,i)=>{q(a,e),q(u,`${t??``} · ${n??``}`),q(f,r),q(v,i)},[()=>(U(Ps),n(),V(t),H(()=>Ps(n(),V(t).permission))),()=>(U(Ns),n(),V(t),H(()=>Ns(n(),V(t).scope))),()=>(U(Ns),n(),V(t),H(()=>Ns(n(),V(t).applicability))),()=>(U(Qc),n(),V(t),H(()=>Qc(n(),V(t).reason))),()=>(U(Ns),n(),V(t),H(()=>Ns(n(),V(t).level)))]),K(e,r)}),D(c);var l=F(I(c,2),!0);D(t),R((e,t,n,r)=>{q(i,`${e??``} ${t??``}`),q(s,n),q(l,r)},[()=>(U(a()),U(Q),n(),H(()=>a().permissions.role===`setup`?Q(`setupPat`,n()):Q(`botPat`,n()))),()=>(U(Q),n(),H(()=>Q(`access`,n()))),()=>(U(a()),U(Q),n(),H(()=>a().permissions.report?Q(`readOnlyCheck`,n()):Q(`provisionalGrants`,n()))),()=>(U(Q),n(),H(()=>Q(`conditionalGrants`,n())))]),K(e,t)},g=e=>{var t=ol(),r=I(N(t)),i=F(r,!0),a=F(I(r),!0);D(t),R((e,t)=>{q(i,e),q(a,t)},[()=>(U(Q),n(),H(()=>Q(`permissionsFollow`,n()))),()=>(U(Q),n(),H(()=>Q(`permissionsFollowBody`,n())))]),K(e,t)};J(m,e=>{U(a()),H(()=>a().permissions)?e(h):e(g,-1)}),D(o),R((e,t,n)=>{X(o,`aria-label`,e),q(l,t),q(d,n),q(p,(U(a()),H(()=>a().batch?.organization??a().repository)))},[()=>(U(Q),n(),H(()=>Q(`setup`,n()))),()=>(U(Q),U(a()),n(),H(()=>Q(a().batch?`batchFocusTitle`:`repoFocus`,n()))),()=>(U(a()),U(Q),n(),H(()=>a().batch?Q(`batchFocusBody`,n(),{count:String(a().batch.targets.length)}):Q(`repoFocusBody`,n())))]),K(e,o),Je(),i()}function ll(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`report`,8,void 0);ki();var o=jr(),s=P(o),c=e=>{{let t=k(()=>(U(Q),n(),H(()=>Q(`permissionSecretCollision`,n())))),r=k(()=>(U(Q),n(),H(()=>Q(`permissionSecretCollisionAction`,n()))));Ka(e,{tone:`warning`,get title(){return V(t)},get message(){return V(r)}})}},l=_t(()=>(U(a()),H(()=>a()?.checks.some(e=>e.incident===`secret-collision`)))),u=e=>{{let t=k(()=>(U(Q),n(),H(()=>Q(`permissionProbeCleanupPending`,n())))),r=k(()=>(U(Q),n(),H(()=>Q(`permissionProbeCleanupAction`,n()))));Ka(e,{tone:`warning`,get title(){return V(t)},get message(){return V(r)}})}},d=_t(()=>(U(a()),H(()=>a()?.checks.some(e=>e.cleanupPending))));J(s,e=>{V(l)?e(c):V(d)&&e(u,1)}),K(e,o),Je(),i()}var ul=G(`
                                  • `),dl=G(`

                                      `);function fl(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`effects`,8),o={files:`receiptFiles`,secrets:`receiptSecrets`,labels:`receiptLabels`,"issue-types":`receiptIssueTypes`,variables:`receiptVariables`,"initial-tag":`receiptInitialTag`},s={completed:`effectCompleted`,skipped:`effectSkipped`,"needs-inspection":`effectInspect`,"not-started":`effectNotStarted`,"in-progress":`effectInProgress`},c={local:`scopeLocal`,repository:`scopeRepository`,organization:`scopeOrganization`,mixed:`scopeMixed`};ki();var l=dl(),u=N(l),d=F(u,!0),f=I(u,2);Y(f,5,a,e=>e.id,(e,t)=>{var r=ul(),i=N(r),a=F(i,!0),l=I(i),u=I(l),d=e=>{var r=Ar();R(e=>q(r,`· ${e??``}`),[()=>(U(Q),V(t),n(),H(()=>Q(c[V(t).scope],n())))]),K(e,r)};J(u,e=>{V(t),H(()=>V(t).scope)&&e(d)}),D(r),R((e,t)=>{q(a,e),q(l,` — ${t??``}`)},[()=>(V(t),U(Q),n(),H(()=>o[V(t).id]?Q(o[V(t).id],n()):V(t).id)),()=>(U(Q),V(t),n(),H(()=>Q(s[V(t).state],n())))]),K(e,r)}),D(f),D(l),R(e=>q(d,e),[()=>(U(Q),n(),H(()=>Q(`resourceReceipt`,n())))]),K(e,l),Je(),i()}var pl=G(`
                                    • `),ml=G(`

                                        `,1),hl=G(`

                                        `);function gl(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`correction`,8);ki();var o=hl(),s=N(o),c=F(s,!0),l=I(s,2),u=F(l,!0),d=I(l,2),f=e=>{var t=ml(),r=P(t),i=F(N(r));D(r);var o=I(r,2);Y(o,5,()=>(U(a()),H(()=>a().addedGrants)),qr,(e,t)=>{var n=pl(),r=F(N(n),!0);D(n),R(()=>q(r,V(t))),K(e,n)}),D(o),R(e=>q(i,`${e??``}:`),[()=>(U(Q),n(),H(()=>Q(`updatedSetupPatGrants`,n())))]),K(e,t)};J(d,e=>{U(a()),H(()=>a().stage===`final`&&a().addedGrants.length)&&e(f)});var p=I(d,2),m=F(p);D(o),R((e,t,n,r)=>{X(o,`aria-label`,e),q(c,t),q(u,n),X(p,`href`,(U(a()),H(()=>a().url))),q(m,`${r??``} ↗`)},[()=>(U(Q),n(),H(()=>Q(`updatedSetupPatTitle`,n()))),()=>(U(Q),n(),H(()=>Q(`updatedSetupPatTitle`,n()))),()=>(U(Q),n(),H(()=>Q(`updatedSetupPatBody`,n()))),()=>(U(Q),n(),H(()=>Q(`updatedSetupPatLink`,n())))]),K(e,o),Je(),i()}var _l=G(`

                                        `),vl=G(`

                                        `),yl=G(`

                                        `),bl=G(` `),xl=G(`

                                        `),Sl=G(`
                                      • `),Cl=G(`
                                          `),wl=G(`

                                          `),Tl=G(`
                                          `),El=G(`copilot doctor --read-only`),Dl=G(`

                                          `);function Ol(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=j(),s=j(),c=j(),l=j(),u=j(),d=j(),f=j(),p=j(),m=Z(t,`management`,8,!1),h=Z(t,`batch`,8,!1),g=Z(t,`outcome`,8),_=Z(t,`controller`,8),v=Z(t,`onClose`,8),y=Z(t,`onDoctor`,8,async()=>void 0),b=Z(t,`doctor`,8,void 0),x=Z(t,`detail`,8,void 0),S=Z(t,`permissionReport`,8,void 0),C=Z(t,`setupPatCorrection`,8,void 0),w={permissions:[`reasonPermissions`,`nextPermissions`],storage:[`reasonStorage`,`nextStorage`],configuration:[`reasonConfiguration`,`nextConfiguration`],"session-expired":[`reasonExpired`,`nextExpired`],cancelled:[`reasonCancelled`,`nextCancelled`],provider:[`reasonProvider`,`nextProvider`],"rate-limit":[`reasonRateLimit`,`nextRateLimit`],unknown:[`reasonUnknown`,`nextUnknown`]};L(()=>U(x()),()=>{M(a,x()?.effects?.some(e=>e.state===`completed`)===!0)}),L(()=>(U(h()),n(),U(m()),U(g()),V(a)),()=>{M(o,h()?Q(`batchNextActions`,n()):m()?ea(n())[g()===`complete`&&V(a)?`finished`:g()===`partial`?`inspectAdjustment`:g()===`complete`?`inspectionFinished`:`inspectionStopped`]:g()===`complete`?Q(`resultApplied`,n()):g()===`dry-run`?Q(`resultNoChanges`,n()):g()===`cancelled`||g()===`blocked`?Q(`resultStopped`,n()):Q(`resultPartial`,n()))}),L(()=>(U(h()),n(),U(m()),U(g()),V(a)),()=>{M(s,h()?Q(`batchResultBody`,n()):m()?ea(n())[g()===`complete`&&V(a)?`finishedBody`:g()===`partial`?`partial`:`inspectionBody`]:g()===`complete`?Q(`resultCompleteBody`,n()):g()===`partial`?Q(`resultPartialBody`,n()):Q(`resultNoChangesBody`,n()))}),L(()=>(U(g()),U(x()),U(S())),()=>{M(c,(g()===`blocked`||g()===`partial`)&&x()?.reasonCode===`permissions`?S():void 0)}),L(()=>V(c),()=>{M(l,V(c)?.checks.some(e=>e.cleanupPending===!0)===!0)}),L(()=>V(c),()=>{M(u,V(c)?.checks.some(e=>e.incident===`secret-collision`)===!0)}),L(()=>(V(c),U(x())),()=>{M(d,V(c)?.role===`workflow`?`reasonWorkflowPermissions`:w[x()?.reasonCode??`unknown`][0])}),L(()=>(U(g()),U(h()),U(x()),V(l),V(u),U(C())),()=>{M(f,(g()===`blocked`||h()&&g()===`partial`)&&x()?.reasonCode===`permissions`&&(h()||x().mutationStarted===!1)&&!V(l)&&!V(u)&&C())}),L(()=>V(c),()=>{M(p,V(c)?V(c).checks.filter(e=>e.applicability===`required`&&e.status!==`verified`&&e.status!==`available`):[])}),En(),ki();var ee=Dl(),te=N(ee),ne=F(te,!0),re=I(te),ie=F(re,!0),ae=I(re,2),oe=e=>{var t=yl(),r=N(t),i=N(r),a=F(i),o=I(i);D(r);var s=I(r,2),c=e=>{var t=_l(),r=N(t),i=F(r),a=I(r);D(t),R((e,t)=>{q(i,`${e??``}:`),q(a,` ${t??``}`)},[()=>(U(Q),n(),H(()=>Q(`progress`,n()))),()=>(U(Xi),U(x()),n(),H(()=>Xi(x().stoppedStage,n())))]),K(e,t)};J(s,e=>{U(x()),H(()=>x()?.stoppedStage)&&e(c)});var f=I(s,2),p=N(f),m=F(p),h=I(p);D(f);var _=I(f,2),v=N(_),y=F(v),b=I(v);D(_);var S=I(_,2),C=e=>{var t=vl(),r=N(t),i=F(r),a=F(I(r,2),!0);D(t),R(e=>{q(i,`${e??``}:`),q(a,(U(x()),H(()=>x().diagnosticRef)))},[()=>(U(Q),n(),H(()=>Q(`diagnosticReference`,n())))]),K(e,t)};J(S,e=>{U(x()),H(()=>x()?.diagnosticRef)&&e(C)}),D(t),R((e,t,n,r,i,s)=>{q(a,`${e??``}:`),q(o,` ${t??``}`),q(m,`${n??``}:`),q(h,` ${r??``}`),q(y,`${i??``}:`),q(b,` ${s??``}`)},[()=>(U(Q),n(),H(()=>Q(`whatHappened`,n()))),()=>(U(Q),V(d),n(),H(()=>Q(V(d),n()))),()=>(U(Q),n(),H(()=>Q(`alreadyChanged`,n()))),()=>(V(u),U(Q),n(),V(l),U(x()),U(g()),H(()=>V(u)?Q(`permissionSecretCollision`,n()):V(l)?Q(`permissionProbeCleanupPending`,n()):x()?.mutationStarted||g()===`partial`?Q(`inspectPartial`,n()):Q(`noChanges`,n()))),()=>(U(Q),n(),H(()=>Q(`nextAction`,n()))),()=>(V(u),U(Q),n(),V(l),U(g()),U(x()),H(()=>V(u)?Q(`permissionSecretCollisionAction`,n()):V(l)?Q(`permissionProbeCleanupAction`,n()):g()===`partial`?`${Q(`inspectPartial`,n())} ${Q(w[x()?.reasonCode??`unknown`][1],n())}`:Q(w[x()?.reasonCode??`unknown`][1],n())))]),K(e,t)};J(ae,e=>{(g()===`blocked`||g()===`cancelled`||g()===`partial`)&&e(oe)});var se=I(ae,2),ce=e=>{var t=wl(),r=N(t),i=F(r,!0),a=I(r,2),o=F(a,!0),s=I(a,2),l=N(s),u=F(l),d=I(l);D(s);var f=I(s,2),m=e=>{var t=Cl();Y(t,5,()=>V(p),qr,(e,t)=>{var r=Sl(),i=N(r),a=F(i,!0),o=I(i),s=e=>{var n=bl(),r=F(N(n));D(n),R(()=>q(r,`GitHub · ${V(t),H(()=>V(t).permission)??``}`)),K(e,n)},l=_t(()=>(n(),U(Ps),V(t),H(()=>n()!==`en`&&Ps(n(),V(t).permission)!==V(t).permission)));J(o,e=>{V(l)&&e(s)});var u=I(o),d=I(u),f=F(d,!0),p=I(d),m=e=>{var r=xl(),i=F(r,!0);R(e=>q(i,e),[()=>(U(tl),V(t),n(),H(()=>tl(V(t),n())))]),K(e,r)};J(p,e=>{V(c),H(()=>V(c).identityStatus===`valid`)&&e(m)}),D(r),R((e,t,n,r)=>{q(a,e),q(u,` — ${t??``} · ${n??``} · `),q(f,r)},[()=>(U(Ps),n(),V(t),H(()=>Ps(n(),V(t).permission))),()=>(U(Ns),n(),V(t),H(()=>Ns(n(),V(t).scope))),()=>(U(Ns),n(),V(t),H(()=>Ns(n(),V(t).level))),()=>(V(c),U(Ns),n(),V(t),U(Q),H(()=>V(c).identityStatus===`valid`?Ns(n(),V(t).status):Q(`permissionGrantNotChecked`,n())))]),K(e,r)}),D(t),K(e,t)},h=e=>{var t=xl(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`permissionReportNoFailedGrant`,n())))]),K(e,t)};J(f,e=>{V(p),H(()=>V(p).length)?e(m):(V(c),H(()=>V(c).identityStatus===`valid`)&&e(h,1))}),D(t),R((e,n,r,a,s)=>{X(t,`aria-label`,e),q(i,n),q(o,r),q(u,`${a??``}:`),q(d,` ${s??``}`)},[()=>(U(Q),n(),H(()=>Q(`permissionReportTitle`,n()))),()=>(U(Q),n(),H(()=>Q(`permissionReportTitle`,n()))),()=>(U(Q),n(),H(()=>Q(`permissionReportLead`,n()))),()=>(U(Q),n(),H(()=>Q(`permissionIdentity`,n()))),()=>(U(Q),V(c),n(),H(()=>Q(V(c).identityStatus===`valid`?`permissionIdentityValid`:V(c).identityStatus===`invalid`?`permissionIdentityInvalid`:`permissionIdentityUnknown`,n())))]),K(e,t)};J(se,e=>{V(c)&&e(ce)});var le=I(se,2),ue=e=>{fl(e,{get effects(){return U(x()),H(()=>x().effects)}})};J(le,e=>{U(x()),H(()=>x()?.effects?.length)&&e(ue)});var de=I(le,2),fe=e=>{gl(e,{get correction(){return C()}})};J(de,e=>{V(f)&&C()&&e(fe)});var pe=I(de,2),me=F(pe,!0),he=I(pe,2),ge=e=>{var t=xl(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`batchCleanup`,n())))]),K(e,t)};J(he,e=>{h()&&e(ge)});var _e=I(he,2),ve=e=>{var t=xl(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`botRenewal`,n())))]),K(e,t)};J(_e,e=>{g()===`complete`&&!m()&&!h()&&e(ve)});var ye=I(_e,2),be=e=>{var t=xl(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`doctorHelp`,n())))]),K(e,t)};J(ye,e=>{!m()&&!h()&&e(be)});var xe=I(ye,2),Se=e=>{var t=Tl(),r=N(t),i=e=>{var t=xl(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`doctorRunning`,n())))]),K(e,t)},a=e=>{var t=xl(),r=F(t);R((e,t,n)=>q(r,`${e??``} ${t??``} ${n??``}`),[()=>(U(Q),U(b()),n(),H(()=>Q(b().healthy?`doctorPassed`:`doctorWarnings`,n()))),()=>(U(Q),n(),U(b()),H(()=>Q(`doctorCounts`,n(),{pass:String(b().pass??0),warn:String(b().warn??0),fail:String(b().fail??0),skipped:String(b().skipped??0)}))),()=>(U(Q),n(),H(()=>Q(`doctorSecretLimit`,n())))]),K(e,t)},o=e=>{var t=xl(),r=F(t,!0);R(e=>q(r,e),[()=>(U(Q),n(),H(()=>Q(`doctorFailed`,n())))]),K(e,t)};J(r,e=>{U(b()),H(()=>b()?.status===`running`)?e(i):(U(b()),H(()=>b()?.status===`complete`)?e(a,1):(U(b()),H(()=>b()?.status===`failed`)&&e(o,2)))});var s=I(r,2),c=e=>{{let t=k(()=>(U(Q),n(),H(()=>Q(`doctorRun`,n()))));Ua(e,{get label(){return V(t)},variant:`secondary`,get onClick(){return y()}})}};J(s,e=>{U(_()),U(b()),H(()=>_()&&b()?.status!==`running`&&b()?.status!==`complete`)&&e(c)}),D(t),K(e,t)};J(xe,e=>{g()===`complete`&&!m()&&!h()&&e(Se)});var Ce=I(xe,2),we=N(Ce),T=F(we,!0),Te=I(we),E=e=>{K(e,El())};J(Te,e=>{h()||e(E)}),D(Ce);var Ee=I(Ce),De=e=>{{let t=k(()=>(U(Q),n(),H(()=>Q(`closeSession`,n()))));Ua(e,{get label(){return V(t)},get onClick(){return v()}})}};J(Ee,e=>{_()&&e(De)}),D(ee),ni(ee,(e,t)=>Vc?.(e,t),()=>1),R((e,t)=>{q(ne,g()===`complete`?`✓`:`!`),q(ie,V(o)),q(me,e),q(T,t)},[()=>(V(u),U(Q),n(),V(l),V(s),H(()=>V(u)?Q(`permissionSecretCollision`,n()):V(l)?Q(`permissionProbeCleanupPending`,n()):V(s))),()=>(U(Q),n(),H(()=>Q(`patSettings`,n())))]),K(e,ee),Je(),i()}var kl=G(`

                                          `);function Al(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`effects`,8,void 0);ki();var o=kl(),s=I(N(o)),c=F(s,!0),l=I(s),u=F(l,!0),d=I(l),f=e=>{fl(e,{get effects(){return a()}})};J(d,e=>{U(a()),H(()=>a()?.length)&&e(f)}),D(o),R((e,t)=>{q(c,e),q(u,t)},[()=>(U(Q),n(),H(()=>Q(`working`,n()))),()=>(U(Q),n(),H(()=>Q(`workingBody`,n())))]),K(e,o),Je(),i()}var jl={en:{title:`Checking PAT access`,lead:`Each permission is checked separately. Temporary test resources are removed after verification.`,pending:`Waiting`,checking:`Checking read access`,creating:`Creating temporary resource`,reading:`Reading temporary resource`,deleting:`Removing temporary resource`,verified:`Verified`,failed:`Needs attention`,skipped:`Checked after plan approval if required`},es:{title:`Comprobando el acceso del PAT`,lead:`Cada permiso se comprueba por separado. Los recursos temporales se eliminan tras verificarlos.`,pending:`Pendiente`,checking:`Comprobando lectura`,creating:`Creando recurso temporal`,reading:`Leyendo recurso temporal`,deleting:`Eliminando recurso temporal`,verified:`Verificado`,failed:`Requiere atención`,skipped:`Se comprobará tras aprobar el plan si es necesario`},fr:{title:`Vérification des accès du PAT`,lead:`Chaque permission est vérifiée séparément. Les ressources temporaires sont supprimées après vérification.`,pending:`En attente`,checking:`Vérification de la lecture`,creating:`Création d’une ressource temporaire`,reading:`Lecture de la ressource temporaire`,deleting:`Suppression de la ressource temporaire`,verified:`Vérifié`,failed:`Intervention nécessaire`,skipped:`Vérifiée après approbation du plan si nécessaire`},pt:{title:`A verificar o acesso do PAT`,lead:`Cada permissão é verificada separadamente. Os recursos temporários são removidos após a verificação.`,pending:`Pendente`,checking:`A verificar a leitura`,creating:`A criar recurso temporário`,reading:`A ler recurso temporário`,deleting:`A remover recurso temporário`,verified:`Verificado`,failed:`Requer atenção`,skipped:`Verificada após a aprovação do plano se necessário`}};function Ml(e,t){return jl[e][t]}var Nl={en:{unavailable:`The check did not complete. Review the terminal result.`,"cleanup-pending":`Cleanup is unresolved; recovery is required before retrying.`,"secret-collision":`GitHub reported an existing Secret at the random test name. Setup stopped; inspect the GitHub Secret audit trail.`,unsupported:`No isolated probe exists for this permission yet.`},es:{unavailable:`La comprobación no terminó. Revisa el resultado en el terminal.`,"cleanup-pending":`La limpieza está pendiente; hay que recuperarla antes de reintentar.`,"secret-collision":`GitHub encontró un Secret existente con el nombre aleatorio de prueba. El setup se detuvo; revisa el historial del Secret.`,unsupported:`Aún no hay una prueba aislada para este permiso.`},fr:{unavailable:`La vérification n’a pas abouti. Consultez le résultat dans le terminal.`,"cleanup-pending":`Le nettoyage reste à terminer avant de réessayer.`,"secret-collision":`GitHub a trouvé un Secret existant sous le nom de test aléatoire. La configuration s’est arrêtée ; consultez l’historique du Secret.`,unsupported:`Aucun test isolé n’existe encore pour cette permission.`},pt:{unavailable:`A verificação não terminou. Consulte o resultado no terminal.`,"cleanup-pending":`A limpeza está pendente; é necessária recuperação antes de tentar novamente.`,"secret-collision":`O GitHub encontrou um Secret existente com o nome aleatório de teste. A configuração parou; consulte o histórico do Secret.`,unsupported:`Ainda não existe um teste isolado para esta permissão.`}},Pl={en:{closed:e=>`Temporary Issue #${e} was closed but could not be deleted. Remove it in GitHub before retrying.`,unresolved:e=>`Temporary Issue #${e} could not be deleted or confirmed closed. Inspect it in GitHub before retrying.`},es:{closed:e=>`El Issue temporal #${e} se cerró, pero no se pudo borrar. Elimínalo en GitHub antes de reintentar.`,unresolved:e=>`No se pudo borrar ni confirmar el cierre del Issue temporal #${e}. Revísalo en GitHub antes de reintentar.`},fr:{closed:e=>`L’Issue temporaire n° ${e} a été fermée mais n’a pas pu être supprimée. Supprimez-la dans GitHub avant de réessayer.`,unresolved:e=>`La suppression et la fermeture de l’Issue temporaire n° ${e} n’ont pas pu être confirmées. Vérifiez-la dans GitHub avant de réessayer.`},pt:{closed:e=>`A Issue temporária n.º ${e} foi fechada, mas não pôde ser eliminada. Elimine-a no GitHub antes de tentar novamente.`,unresolved:e=>`Não foi possível eliminar nem confirmar o fecho da Issue temporária n.º ${e}. Verifique-a no GitHub antes de tentar novamente.`}},Fl={en:e=>`GitHub HTTP ${e}`,es:e=>`Error HTTP ${e} de GitHub`,fr:e=>`Erreur HTTP ${e} de GitHub`,pt:e=>`Erro HTTP ${e} do GitHub`};function Il(e,t){let n=el(t,e);if(n)return n;let r=/^issue-(closed|unresolved)-([1-9][0-9]*)$/u.exec(t);return r?Pl[e][r[1]](r[2]):/^http-[1-5][0-9]{2}$/u.test(t)?Fl[e](t.slice(5)):t===`unavailable`||t===`cleanup-pending`||t===`secret-collision`||t===`unsupported`?Nl[e][t]:Nl[e].unavailable}var Ll=G(` `),Rl=G(`
                                        • `),zl=G(`

                                            `);function Bl(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=j(),o=Z(t,`permissions`,8);function s(e){return o().progress?.filter(t=>t.requirementId===e).at(-1)}L(()=>U(o()),()=>{M(a,o().progress?.at(-1))}),En(),ki();var c=zl(),l=N(c),u=F(l,!0),d=I(l,2),f=F(d,!0),p=I(d,2),m=N(p),h=e=>{var t=Ar();R((e,n)=>q(t,`${e??``}: ${n??``}`),[()=>(U(Ps),n(),U(o()),V(a),H(()=>Ps(n(),o().requirements?.find(e=>e.id===V(a).requirementId)?.permission??V(a).requirementId))),()=>(U(Ml),n(),V(a),H(()=>Ml(n(),V(a).phase)))]),K(e,t)};J(m,e=>{V(a)&&e(h)}),D(p);var g=I(p,2);Y(g,5,()=>(U(o()),H(()=>o().requirements??[])),e=>e.id,(e,t)=>{let r=k(()=>(V(t),H(()=>s(V(t).id))));var i=Rl();let a;var o=N(i),c=F(o,!0),l=I(o,2),u=N(l),d=F(u,!0),f=I(u),p=F(f),m=I(f),h=e=>{var t=Ll(),i=F(t,!0);R(e=>q(i,e),[()=>(U(Il),n(),U(V(r)),H(()=>Il(n(),V(r).detail)))]),K(e,t)};J(m,e=>{U(V(r)),H(()=>V(r)?.phase===`failed`&&V(r).detail)&&e(h)}),D(l);var g=F(I(l,2),!0);D(i),R((e,t,n,o)=>{a=ci(i,1,``,null,a,{"permission-progress-done":V(r)?.phase===`verified`,"permission-progress-failed":V(r)?.phase===`failed`}),q(c,(U(V(r)),H(()=>V(r)?.phase===`verified`?`✓`:V(r)?.phase===`failed`?`!`:V(r)?`◌`:`·`))),q(d,e),q(p,`${t??``} · ${n??``}`),q(g,o)},[()=>(U(Ps),n(),V(t),H(()=>Ps(n(),V(t).permission))),()=>(U(Ns),n(),V(t),H(()=>Ns(n(),V(t).scope))),()=>(U(Ns),n(),V(t),H(()=>Ns(n(),V(t).level))),()=>(U(Ml),n(),U(V(r)),H(()=>Ml(n(),V(r)?.phase??`pending`)))]),K(e,i)}),D(g),D(c),R((e,t)=>{q(u,e),q(f,t)},[()=>(U(Ml),n(),H(()=>Ml(n(),`title`))),()=>(U(Ml),n(),H(()=>Ml(n(),`lead`)))]),K(e,c),Je(),i()}function Vl(e,t){return!t&&/^[A-Fa-f0-9]{16}$/u.test(e.trim())}var Hl=G(`

                                            `);function Ul(e,t){O(t,!1);let n=()=>Li($,`$setupLocale`,r),[r,i]=Ri(),a=Z(t,`busy`,8),o=Z(t,`onPair`,8),s=Z(t,`mode`,8,`pair`),c=j(``),l=j();async function u(){if(!Vl(V(c),a()))return;let e=V(c).trim();M(c,``),await o()(e),await pr(),V(l)?.isConnected&&!V(l).disabled&&V(l).focus()}ki();var d=Hl(),f=N(d),p=F(N(f),!0);D(f);var m=I(f,2),h=F(N(m),!0);D(m);var g=I(m,2),_=F(g,!0),v=I(g,2),y=N(v),b=F(y,!0),x=I(y,2);yi(x),Oi(x,e=>M(l,e),()=>V(l));var S=I(x,2),C=F(S,!0),w=I(S,2),ee=N(w);{let e=k(()=>(U(Q),U(s()),n(),H(()=>Q(s()===`pair`?`pairButton`:`takeOver`,n())))),t=k(()=>(U(Vl),V(c),U(a()),H(()=>!Vl(V(c),a()))));Ua(ee,{get label(){return V(e)},arrow:!0,onClick:u,get disabled(){return V(t)}})}D(w),D(v),D(d),R((e,t,n,r,i,o,s)=>{X(d,`aria-label`,e),q(p,t),q(h,n),q(_,r),q(b,i),x.disabled=a(),X(x,`placeholder`,o),q(C,s)},[()=>(U(Q),U(s()),n(),H(()=>Q(s()===`pair`?`pairTitle`:`takeOver`,n()))),()=>(U(Q),n(),H(()=>Q(`privateSession`,n()))),()=>(U(Q),U(s()),n(),H(()=>Q(s()===`pair`?`pairTitle`:`takeOver`,n()))),()=>(U(Q),U(s()),n(),H(()=>Q(s()===`pair`?`pairBody`:`readOnlyBody`,n()))),()=>(U(Q),n(),H(()=>Q(`pairLabel`,n()))),()=>(U(Q),n(),H(()=>Q(`pairPlaceholder`,n()))),()=>(U(Q),n(),H(()=>Q(`pairHelp`,n())))]),xr(`submit`,v,e=>{e.preventDefault(),u()}),wi(x,()=>V(c),e=>M(c,e)),K(e,d),Je(),i()}var Wl={"Could not close the local session. Check the terminal before trying again.":`The local session could not be confirmed closed. The result is retained. Check the terminal before trying again.`,"The local setup session is unavailable.":`The local setup session is unavailable. Check the terminal; you may need to restart setup.`,"Connection lost. The CLI may have stopped. Check the terminal before trying again.":`Connection lost. The CLI may have stopped. Check the terminal before trying again.`,"Could not join this local session.":`Could not join this local session. Check the terminal and pair again.`,"Could not connect to the local setup session. Check the terminal and pair again.":`Could not connect to the local setup session. Check the terminal and pair again.`,"Pairing was rejected.":`Pairing was rejected. Check the code in the launching terminal.`,"Invalid local pairing response.":`The local pairing response was invalid. Restart setup from the terminal.`,"Could not pair this browser.":`Could not pair this browser. Check the terminal and try again.`,"The request was rejected.":`The local request was rejected. Refresh the page and check the terminal.`,"Could not submit this answer.":`Could not submit this answer. Refresh the page and try again.`,"Cancellation failed.":`Cancellation failed. Check whether setup has already started applying before closing.`,"Takeover failed.":`Could not take control. Re-enter the pairing code from the launching terminal.`,"Invalid local host or request context.":`The local request context was rejected. Open the exact URL printed in the terminal.`,"Invalid request origin.":`The request came from another origin. Open the exact local URL printed in the terminal.`,"JSON required.":`The local request format was invalid. Refresh the page and try again.`,"Too many pairing attempts. Restart setup.":`Too many incorrect pairing attempts. Restart setup from the terminal.`,"Too many pairing attempts. Wait 30 seconds and retry.":`Too many incorrect pairing attempts. Wait 30 seconds and try the code again; terminal setup remains available.`,"Incorrect pairing code. Check the terminal.":`Incorrect pairing code. Check the launching terminal.`,"Incorrect pairing code. Check the launching output.":`Incorrect pairing code. Check the launching output.`,"Pair this browser using the code printed by the CLI.":`Pair this browser using the code printed by the CLI.`,"This tab is read-only.":`This tab is read-only. Enter the pairing code again to take control.`,"Invalid answer.":`The answer was invalid. Review the current question and try again.`,"Control moved to another tab.":`Control moved to another tab. This tab is now read-only.`,"This question changed. Refresh the current state.":`This question changed. Refresh the page before answering again.`,"This setup has already started applying or ended.":`Setup has already started applying or ended. Inspect the current result before retrying.`,"Only the controller can close a finished session.":`Only the controlling tab can close this finished session.`,"Method not allowed.":`This local request is not allowed. Refresh the page.`,"Not found.":`The requested local page was not found. Open the URL printed in the terminal.`,"Invalid local request.":`The local request was invalid. Refresh the page and try again.`,"Body too large.":`The submitted answer is too large. Shorten it and try again.`,"JSON object required.":`The local request format was invalid. Refresh the page and try again.`,"Could not retry discovery.":`Could not refresh the GitHub suggestions. Retry or use verified manual entry.`,"Could not return to the previous question.":`Could not return to the previous question. Refresh the page and try again.`,"Invalid question revision.":`The question changed. Refresh the page before going back.`,"No earlier question is available here.":`There is no earlier question in this stage. Continue or return to the plan review.`,"Read-only verification failed.":`Read-only verification failed. Check the terminal and retry once.`,"Read-only verification failed. Check the terminal.":`Read-only verification failed. Check the terminal and retry once.`,"Read-only verification is unavailable or already running.":`Read-only verification is unavailable or already running. Check the current result before retrying.`},Gl={en:Wl,es:{"Could not close the local session. Check the terminal before trying again.":`No se ha podido confirmar el cierre de la sesión local. El resultado se conserva. Consulta la terminal antes de volver a intentarlo.`,"The local setup session is unavailable.":`La sesión local no está disponible. Revisa la terminal; quizá debas reiniciar la configuración.`,"Connection lost. The CLI may have stopped. Check the terminal before trying again.":`Se perdió la conexión. Es posible que el CLI se haya detenido. Revisa la terminal antes de reintentar.`,"Could not join this local session.":`No se pudo acceder a esta sesión local. Revisa la terminal y vuelve a vincular el navegador.`,"Could not connect to the local setup session. Check the terminal and pair again.":`No se pudo conectar con la sesión local. Revisa la terminal y vuelve a vincular el navegador.`,"Pairing was rejected.":`Se rechazó la vinculación. Comprueba el código en la terminal que inició el proceso.`,"Invalid local pairing response.":`La respuesta de vinculación local no es válida. Reinicia la configuración desde la terminal.`,"Could not pair this browser.":`No se pudo vincular este navegador. Revisa la terminal y vuelve a intentarlo.`,"The request was rejected.":`Se rechazó la petición local. Actualiza la página y revisa la terminal.`,"Could not submit this answer.":`No se pudo enviar la respuesta. Actualiza la página y vuelve a intentarlo.`,"Cancellation failed.":`No se pudo cancelar. Comprueba si ya se han empezado a aplicar cambios antes de cerrar.`,"Takeover failed.":`No se pudo tomar el control. Vuelve a introducir el código de la terminal inicial.`,"Invalid local host or request context.":`Se rechazó el contexto de la petición local. Abre la URL exacta que aparece en la terminal.`,"Invalid request origin.":`La petición llegó desde otro origen. Abre la URL local exacta de la terminal.`,"JSON required.":`El formato de la petición local no es válido. Actualiza la página y reinténtalo.`,"Too many pairing attempts. Restart setup.":`Demasiados intentos de vinculación fallidos. Reinicia la configuración desde la terminal.`,"Too many pairing attempts. Wait 30 seconds and retry.":`Demasiados intentos de vinculación fallidos. Espera 30 segundos y vuelve a probar el código; puedes seguir con el setup en la terminal.`,"Incorrect pairing code. Check the terminal.":`Código de vinculación incorrecto. Comprueba la terminal inicial.`,"Incorrect pairing code. Check the launching output.":`Código de vinculación incorrecto. Comprueba la salida de inicio.`,"Pair this browser using the code printed by the CLI.":`Vincula este navegador con el código mostrado por el CLI.`,"This tab is read-only.":`Esta pestaña es de solo lectura. Introduce otra vez el código para tomar el control.`,"Invalid answer.":`La respuesta no es válida. Revisa la pregunta actual e inténtalo de nuevo.`,"Control moved to another tab.":`El control pasó a otra pestaña. Esta ahora es de solo lectura.`,"This question changed. Refresh the current state.":`La pregunta cambió. Actualiza la página antes de volver a responder.`,"This setup has already started applying or ended.":`La configuración ya empezó a aplicarse o terminó. Revisa el resultado antes de reintentar.`,"Only the controller can close a finished session.":`Solo la pestaña que tiene el control puede cerrar esta sesión finalizada.`,"Method not allowed.":`Esta petición local no está permitida. Actualiza la página.`,"Not found.":`No se encontró la página local solicitada. Abre la URL de la terminal.`,"Invalid local request.":`La petición local no es válida. Actualiza la página y reinténtalo.`,"Body too large.":`La respuesta enviada es demasiado larga. Acórtala y reinténtalo.`,"JSON object required.":`El formato de la petición local no es válido. Actualiza la página y reinténtalo.`,"Could not retry discovery.":`No se pudieron actualizar las sugerencias de GitHub. Reinténtalo o introduce datos verificados manualmente.`,"Could not return to the previous question.":`No se pudo volver a la pregunta anterior. Actualiza la página y reinténtalo.`,"Invalid question revision.":`La pregunta cambió. Actualiza la página antes de volver atrás.`,"No earlier question is available here.":`No hay una pregunta anterior en esta etapa. Continúa o vuelve a revisar el plan.`,"Read-only verification failed.":`Falló la comprobación de solo lectura. Revisa la terminal y vuelve a intentarlo una vez.`,"Read-only verification failed. Check the terminal.":`Falló la comprobación de solo lectura. Revisa la terminal y vuelve a intentarlo una vez.`,"Read-only verification is unavailable or already running.":`La comprobación de solo lectura no está disponible o ya se está ejecutando. Revisa el resultado antes de reintentar.`},fr:{"Could not close the local session. Check the terminal before trying again.":`La fermeture de la session locale n’a pas pu être confirmée. Le résultat est conservé. Consultez le terminal avant de réessayer.`,"The local setup session is unavailable.":`La session locale est indisponible. Vérifiez le terminal ; vous devrez peut-être relancer la configuration.`,"Connection lost. The CLI may have stopped. Check the terminal before trying again.":`Connexion perdue. Le CLI s’est peut-être arrêté. Vérifiez le terminal avant de réessayer.`,"Could not join this local session.":`Impossible de rejoindre cette session locale. Vérifiez le terminal et associez de nouveau le navigateur.`,"Could not connect to the local setup session. Check the terminal and pair again.":`Impossible de se connecter à la session locale. Vérifiez le terminal et associez de nouveau le navigateur.`,"Pairing was rejected.":`L’association a été refusée. Vérifiez le code dans le terminal de lancement.`,"Invalid local pairing response.":`La réponse d’association locale est invalide. Relancez la configuration depuis le terminal.`,"Could not pair this browser.":`Impossible d’associer ce navigateur. Vérifiez le terminal et réessayez.`,"The request was rejected.":`La demande locale a été refusée. Actualisez la page et vérifiez le terminal.`,"Could not submit this answer.":`Impossible d’envoyer cette réponse. Actualisez la page et réessayez.`,"Cancellation failed.":`Annulation impossible. Vérifiez si des changements ont déjà commencé avant de fermer.`,"Takeover failed.":`Impossible de prendre le contrôle. Ressaisissez le code du terminal de lancement.`,"Invalid local host or request context.":`Le contexte de la demande locale a été refusé. Ouvrez l’URL exacte affichée dans le terminal.`,"Invalid request origin.":`La demande vient d’une autre origine. Ouvrez l’URL locale exacte du terminal.`,"JSON required.":`Le format de la demande locale est invalide. Actualisez la page et réessayez.`,"Too many pairing attempts. Restart setup.":`Trop de tentatives d’association incorrectes. Relancez la configuration depuis le terminal.`,"Too many pairing attempts. Wait 30 seconds and retry.":`Trop de tentatives d’association incorrectes. Attendez 30 secondes puis ressaisissez le code ; la configuration par terminal reste disponible.`,"Incorrect pairing code. Check the terminal.":`Code d’association incorrect. Vérifiez le terminal de lancement.`,"Incorrect pairing code. Check the launching output.":`Code d’association incorrect. Vérifiez la sortie de lancement.`,"Pair this browser using the code printed by the CLI.":`Associez ce navigateur avec le code affiché par le CLI.`,"This tab is read-only.":`Cet onglet est en lecture seule. Ressaisissez le code pour prendre le contrôle.`,"Invalid answer.":`La réponse est invalide. Revoyez la question actuelle et réessayez.`,"Control moved to another tab.":`Le contrôle est passé à un autre onglet. Celui-ci est maintenant en lecture seule.`,"This question changed. Refresh the current state.":`La question a changé. Actualisez la page avant de répondre de nouveau.`,"This setup has already started applying or ended.":`La configuration est déjà en cours d’application ou terminée. Inspectez le résultat avant de réessayer.`,"Only the controller can close a finished session.":`Seul l’onglet qui détient le contrôle peut fermer cette session terminée.`,"Method not allowed.":`Cette demande locale n’est pas autorisée. Actualisez la page.`,"Not found.":`La page locale demandée est introuvable. Ouvrez l’URL affichée dans le terminal.`,"Invalid local request.":`La demande locale est invalide. Actualisez la page et réessayez.`,"Body too large.":`La réponse envoyée est trop longue. Raccourcissez-la et réessayez.`,"JSON object required.":`Le format de la demande locale est invalide. Actualisez la page et réessayez.`,"Could not retry discovery.":`Impossible d’actualiser les suggestions GitHub. Réessayez ou saisissez des données vérifiées manuellement.`,"Could not return to the previous question.":`Impossible de revenir à la question précédente. Actualisez la page et réessayez.`,"Invalid question revision.":`La question a changé. Actualisez la page avant de revenir en arrière.`,"No earlier question is available here.":`Il n’y a pas de question précédente à cette étape. Continuez ou revenez à la révision du plan.`,"Read-only verification failed.":`La vérification en lecture seule a échoué. Consultez le terminal et réessayez une fois.`,"Read-only verification failed. Check the terminal.":`La vérification en lecture seule a échoué. Consultez le terminal et réessayez une fois.`,"Read-only verification is unavailable or already running.":`La vérification en lecture seule est indisponible ou déjà en cours. Consultez le résultat avant de réessayer.`},pt:{"Could not close the local session. Check the terminal before trying again.":`Não foi possível confirmar o encerramento da sessão local. O resultado foi preservado. Consulte o terminal antes de tentar novamente.`,"The local setup session is unavailable.":`A sessão local não está disponível. Verifique o terminal; poderá ter de reiniciar a configuração.`,"Connection lost. The CLI may have stopped. Check the terminal before trying again.":`Ligação perdida. O CLI pode ter parado. Verifique o terminal antes de tentar novamente.`,"Could not join this local session.":`Não foi possível entrar nesta sessão local. Verifique o terminal e volte a emparelhar o navegador.`,"Could not connect to the local setup session. Check the terminal and pair again.":`Não foi possível ligar à sessão local. Verifique o terminal e volte a emparelhar o navegador.`,"Pairing was rejected.":`O emparelhamento foi recusado. Confirme o código no terminal de lançamento.`,"Invalid local pairing response.":`A resposta de emparelhamento local é inválida. Reinicie a configuração a partir do terminal.`,"Could not pair this browser.":`Não foi possível emparelhar este navegador. Verifique o terminal e tente novamente.`,"The request was rejected.":`O pedido local foi recusado. Atualize a página e verifique o terminal.`,"Could not submit this answer.":`Não foi possível enviar a resposta. Atualize a página e tente novamente.`,"Cancellation failed.":`Não foi possível cancelar. Confirme se a aplicação das alterações já começou antes de fechar.`,"Takeover failed.":`Não foi possível assumir o controlo. Volte a introduzir o código do terminal de lançamento.`,"Invalid local host or request context.":`O contexto do pedido local foi recusado. Abra o URL exato apresentado no terminal.`,"Invalid request origin.":`O pedido veio de outra origem. Abra o URL local exato do terminal.`,"JSON required.":`O formato do pedido local é inválido. Atualize a página e tente novamente.`,"Too many pairing attempts. Restart setup.":`Demasiadas tentativas incorretas de emparelhamento. Reinicie a configuração no terminal.`,"Too many pairing attempts. Wait 30 seconds and retry.":`Demasiadas tentativas incorretas de emparelhamento. Aguarde 30 segundos e volte a introduzir o código; a configuração no terminal continua disponível.`,"Incorrect pairing code. Check the terminal.":`Código de emparelhamento incorreto. Verifique o terminal de lançamento.`,"Incorrect pairing code. Check the launching output.":`Código de emparelhamento incorreto. Verifique a saída de lançamento.`,"Pair this browser using the code printed by the CLI.":`Emparelhe este navegador com o código apresentado pelo CLI.`,"This tab is read-only.":`Este separador é apenas de leitura. Reintroduza o código para assumir o controlo.`,"Invalid answer.":`A resposta é inválida. Reveja a pergunta atual e tente novamente.`,"Control moved to another tab.":`O controlo passou para outro separador. Este é agora apenas de leitura.`,"This question changed. Refresh the current state.":`A pergunta mudou. Atualize a página antes de voltar a responder.`,"This setup has already started applying or ended.":`A configuração já começou a ser aplicada ou terminou. Inspecione o resultado antes de tentar novamente.`,"Only the controller can close a finished session.":`Só o separador que detém o controlo pode fechar esta sessão terminada.`,"Method not allowed.":`Este pedido local não é permitido. Atualize a página.`,"Not found.":`A página local pedida não foi encontrada. Abra o URL apresentado no terminal.`,"Invalid local request.":`O pedido local é inválido. Atualize a página e tente novamente.`,"Body too large.":`A resposta enviada é demasiado longa. Encurte-a e tente novamente.`,"JSON object required.":`O formato do pedido local é inválido. Atualize a página e tente novamente.`,"Could not retry discovery.":`Não foi possível atualizar as sugestões do GitHub. Tente novamente ou introduza dados verificados manualmente.`,"Could not return to the previous question.":`Não foi possível voltar à pergunta anterior. Atualize a página e tente novamente.`,"Invalid question revision.":`A pergunta mudou. Atualize a página antes de voltar atrás.`,"No earlier question is available here.":`Não há uma pergunta anterior nesta etapa. Continue ou volte à revisão do plano.`,"Read-only verification failed.":`A verificação só de leitura falhou. Consulte o terminal e tente mais uma vez.`,"Read-only verification failed. Check the terminal.":`A verificação só de leitura falhou. Consulte o terminal e tente mais uma vez.`,"Read-only verification is unavailable or already running.":`A verificação só de leitura não está disponível ou já está em curso. Consulte o resultado antes de tentar novamente.`}};function Kl(e,t){let n=Gl[t]??Wl;return Object.prototype.hasOwnProperty.call(n,e)?n[e]:Q(`unknownLocalError`,t)}var ql=G(`
                                            `),Jl=G(`
                                            `),Yl=G(` `,1),Xl=G(``),Zl=G(`
                                            `,1),Ql=G(`
                                            `);function $l(e,t){O(t,!1);let n=()=>Li(o,`$session`,i),r=()=>Li($,`$setupLocale`,i),[i,a]=Ri(),o=Vi();Ur(()=>{let e=$.subscribe(e=>{document.documentElement.lang=e,document.documentElement.dir=`ltr`,document.title=`Copilot · ${Q(`studio`,e)}`}),t=window.setInterval(()=>{n().paired&&!n().closed&&!n().view?.outcome&&o.poll()},900);return()=>{window.clearInterval(t),e()}});async function s(){window.confirm(Q(n().view?.batch?.phase===`applying`?`batchStopConfirm`:`cancelConfirm`,r()))&&await o.cancel()}async function c(e){let t=n().view?.promptRevision;t!==void 0&&await o.submit(t,e)}async function l(){let e=n().view?.promptRevision;e!==void 0&&await o.retryDiscovery(e)}async function u(){let e=n().view?.promptRevision;e!==void 0&&await o.back(e)}ki();var d=Ql(),f=N(d);{let e=k(()=>n().view?.journey),t=k(()=>n().view?.surface===`management`);ca(f,{get journey(){return V(e)},get management(){return V(t)}})}var p=I(f,2),m=N(p);{let e=k(()=>n().view?.repository),t=k(()=>n().closed===!0);ga(m,{get repository(){return V(e)},get closed(){return V(t)}})}var h=I(m,2),g=N(h),_=e=>{{let t=k(()=>Q(`translationPreviewTitle`,r())),n=k(()=>Q(`translationPreviewBody`,r()));Ka(e,{tone:`warning`,get title(){return V(t)},get message(){return V(n)}})}};J(g,e=>{r()!==`en`&&e(_)});var v=I(g,2),y=e=>{Fa(e,{get view(){return n().view}})};J(v,e=>{n().paired&&n().view?.surface!==`management`&&e(y)});var b=I(v,2),x=e=>{var t=ql(),i=I(N(t));D(t),R(e=>q(i,` ${e??``}`),[()=>Q(`reviewPass`,r(),{pass:String(n().view.journey.choiceReviewPass)})]),K(e,t)};J(b,e=>{n().view?.journey?.choiceReviewPass&&n().view.journey.choiceReviewPass>1&&!n().view.outcome&&e(x)});var S=I(b,2),C=e=>{var t=Jl(),n=N(t);{let e=k(()=>Q(`sessionClosed`,r())),t=k(()=>Q(`sessionClosedBody`,r()));Ka(n,{tone:`success`,get title(){return V(e)},get message(){return V(t)}})}D(t),ni(t,(e,t)=>Vc?.(e,t),()=>1),R(e=>X(t,`aria-label`,e),[()=>Q(`sessionClosed`,r())]),K(e,t)};J(S,e=>{n().closed&&e(C)});var w=I(S,2),ee=e=>{var t=Yl(),i=P(t);{let e=k(()=>Q(`readOnly`,r())),t=k(()=>Q(`readOnlyBody`,r()));Ka(i,{tone:`warning`,get title(){return V(e)},get message(){return V(t)}})}Ul(I(i,2),{mode:`takeover`,get busy(){return n().busy},get onPair(){return o.takeOver}}),K(e,t)};J(w,e=>{!n().closed&&!n().controller&&n().view&&e(ee)});var te=I(w,2),ne=e=>{{let t=k(()=>Q(`attention`,r())),i=k(()=>Kl(n().error,r()));Ka(e,{tone:`error`,get title(){return V(t)},get message(){return V(i)}})}};J(te,e=>{n().error&&e(ne)});var re=I(te,2),ie=e=>{{let t=k(()=>Q(n().view.message.tone===`success`?`checked`:n().view.message.tone===`warning`?`pleaseNote`:n().view.message.tone===`error`?`attention`:`progressUpdate`,r())),i=k(()=>ka(n().view.message,r()));Ka(e,{get tone(){return n().view.message.tone},get title(){return V(t)},get message(){return V(i)},get link(){return n().view.message.link}})}};J(re,e=>{n().view?.message&&!n().view.outcome&&e(ie)});var ae=I(re,2),oe=e=>{{let t=k(()=>n().view.permissions?.report);ll(e,{get report(){return V(t)}})}};J(ae,e=>{n().view?.batch&&e(oe)});var se=I(ae,2),ce=e=>{Ul(e,{get busy(){return n().busy},get onPair(){return o.pair}})},le=e=>{var t=Yl(),r=P(t),i=e=>{Dc(e,{get batch(){return n().view.batch},mode:`closed`,get controller(){return n().controller},get busy(){return n().busy}})};J(r,e=>{n().view.batch&&e(i)});var a=I(r,2);{let e=k(()=>!!n().view.batch),t=k(()=>n().view.surface===`management`),r=k(()=>n().view.permissions?.report);Ol(a,{get batch(){return V(e)},get management(){return V(t)},get outcome(){return n().view.outcome},get detail(){return n().view.resultDetail},get permissionReport(){return V(r)},get setupPatCorrection(){return n().view.setupPatCorrection},get doctor(){return n().view.doctor},get controller(){return n().controller},get onDoctor(){return o.runDoctor},get onClose(){return o.close}})}K(e,t)},ue=e=>{var t=Zl(),i=P(t),a=N(i);Gc(a,{get prompt(){return n().view.prompt},get revision(){return n().view.revision},get promptRevision(){return n().view.promptRevision},get controller(){return n().controller},get busy(){return n().busy},onSubmit:c,onRetryDiscovery:l,onBack:u}),cl(I(a,2),{get view(){return n().view}}),D(i);var o=I(i,2),d=e=>{var t=Xl(),i=F(t,!0);R(e=>{t.disabled=n().busy,q(i,e)},[()=>Q(`cancelSetup`,r())]),W(`click`,t,s),K(e,t)};J(o,e=>{n().controller&&n().view.journey?.current!==`Apply`&&e(d)}),K(e,t)},de=e=>{var t=Yl(),r=P(t);Dc(r,{get batch(){return n().view.batch},mode:`progress`,get controller(){return n().controller},get busy(){return n().busy},onStop:s});var i=I(r,2),a=e=>{Bl(e,{get permissions(){return n().view.permissions}})};J(i,e=>{n().view.permissions?.progress?.length&&!n().view.permissions.report&&e(a)}),K(e,t)},fe=e=>{Bl(e,{get permissions(){return n().view.permissions}})},pe=e=>{{let t=k(()=>n().view?.resultDetail?.effects);Al(e,{get effects(){return V(t)}})}};J(se,e=>{n().paired?n().view?.outcome?e(le,1):n().view?.prompt?e(ue,2):n().view?.batch?e(de,3):n().view?.permissions?.progress?.length&&!n().view.permissions.report?e(fe,4):e(pe,-1):e(ce)});var me=I(se,2),he=N(me),ge=I(he,2),_e=I(ge,2);D(me),D(h),D(p),D(d),R((e,t,n)=>{q(he,`${e??``} `),q(ge,` ${t??``} `),q(_e,` ${n??``}`)},[()=>Q(`footerLocal`,r()),()=>Q(`footerCloud`,r()),()=>Q(`footerGithub`,r())]),K(e,d),Je(),a()}Sr([`click`]),Rr($l,{target:document.getElementById(`app`)}); \ No newline at end of file diff --git a/build/web/assets/index-BTzJj-al.js b/build/web/assets/index-BTzJj-al.js new file mode 100644 index 000000000..0dea944d6 --- /dev/null +++ b/build/web/assets/index-BTzJj-al.js @@ -0,0 +1,3 @@ +(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})(),typeof window<`u`&&((window.__svelte??={}).v??=new Set).add(`5`);var e=!1;function t(){e=!0}t();var n={},r=Symbol(`uninitialized`),i=`http://www.w3.org/1999/xhtml`,a=Array.isArray,o=Array.prototype.indexOf,s=Array.prototype.includes,c=Array.from,l=Object.defineProperty,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyDescriptors,f=Object.prototype,p=Array.prototype,m=Object.getPrototypeOf,h=Object.isExtensible,g=()=>{};function _(e){return e()}function v(e){for(var t=0;t{e=n,t=r}),resolve:e,reject:t}}function b(e,t){if(Array.isArray(e))return e;if(t===void 0||!(Symbol.iterator in e))return Array.from(e);let n=[];for(let r of e)if(n.push(r),n.length===t)break;return n}var x=1024,S=2048,C=4096,w=8192,ee=16384,te=32768,ne=1<<25,re=65536,ie=1<<19,ae=1<<20,oe=1<<25,se=1<<21,ce=1<<22,le=1<<23,ue=Symbol(`$state`),de=Symbol(`component`),fe=Symbol(`legacy props`),pe=Symbol(``),me=Symbol(`attributes`),he=Symbol(`class`),ge=Symbol(`style`),_e=Symbol(`text`),ve=Symbol(`form reset`),ye=new class extends Error{name=`StaleReactionError`;message="The reaction that called `getAbortSignal()` was re-run or destroyed"},be=!!globalThis.document?.contentType&&globalThis.document.contentType.includes(`xml`);function xe(){console.warn(`https://svelte.dev/e/derived_inert`)}function Se(e){console.warn(`https://svelte.dev/e/hydration_mismatch`)}function Ce(){console.warn(`https://svelte.dev/e/select_multiple_invalid_value`)}function we(){console.warn(`https://svelte.dev/e/svelte_boundary_reset_noop`)}var T=!1;function Te(e){T=e}var E;function Ee(e){if(e===null)throw Se(),n;return E=e}function De(){return Ee(ln(E))}function D(e){if(T){if(ln(E)!==null)throw Se(),n;E=e}}function Oe(e=1){if(T){for(var t=e,n=E;t--;)n=ln(n);E=n}}function ke(e=!0){for(var t=0,n=E;;){if(n.nodeType===8){var r=n.data;if(r===`]`){if(t===0)return n;--t}else(r===`[`||r===`[!`||r[0]===`[`&&!isNaN(Number(r.slice(1))))&&(t+=1)}var i=ln(n);e&&n.remove(),n=i}}function Ae(e){if(!e||e.nodeType!==8)throw Se(),n;return e.data}function je(e){return e===this.v}function Me(e,t){return e==e?e!==t||typeof e==`object`&&!!e||typeof e==`function`:t==t}function Ne(e){return!Me(e,this.v)}function Pe(e){throw Error(`https://svelte.dev/e/lifecycle_outside_component`)}function Fe(){throw Error(`https://svelte.dev/e/async_derived_orphan`)}function Ie(e,t,n){throw Error(`https://svelte.dev/e/each_key_duplicate`)}function Le(e){throw Error(`https://svelte.dev/e/effect_in_teardown`)}function Re(){throw Error(`https://svelte.dev/e/effect_in_unowned_derived`)}function ze(e){throw Error(`https://svelte.dev/e/effect_orphan`)}function Be(){throw Error(`https://svelte.dev/e/effect_update_depth_exceeded`)}function Ve(e){throw Error(`https://svelte.dev/e/props_invalid_value`)}function He(){throw Error(`https://svelte.dev/e/state_descriptors_fixed`)}function Ue(){throw Error(`https://svelte.dev/e/state_prototype_fixed`)}function We(){throw Error(`https://svelte.dev/e/state_unsafe_mutation`)}function Ge(){throw Error(`https://svelte.dev/e/svelte_boundary_reset_onerror`)}var Ke=null;function qe(e){Ke=e}function O(t,n=!1,r){Ke={p:Ke,i:!1,c:null,e:null,s:t,x:null,r:z,l:e&&!n?{s:null,u:null,$:[]}:null}}function Je(e){var t=Ke,n=t.e;if(n!==null){t.e=null;for(var r of n)Sn(r)}return e!==void 0&&(t.x=e),t.i=!0,Ke=t.p,Ye(e)}function Ye(e={}){return l(e,de,{value:!0}),e}function Xe(){return!e||Ke!==null&&Ke.l===null}var Ze=[];function Qe(){var e=Ze;Ze=[],v(e)}function $e(e){if(Ze.length===0&&!Dt){var t=Ze;queueMicrotask(()=>{t===Ze&&Qe()})}Ze.push(e)}function et(){for(;Ze.length>0;)Qe()}var tt=~(S|C|x);function nt(e,t){e.f=e.f&tt|t}function rt(e){e.f&512||e.deps===null?nt(e,x):nt(e,C)}function it(e,t,n){e.f&2048?t.add(e):e.f&4096&&n.add(e),nt(e,x)}function at(e){T&&cn(e)!==null&&un(e)}var ot=!1;function st(){ot||(ot=!0,document.addEventListener(`reset`,e=>{Promise.resolve().then(()=>{if(!e.defaultPrevented)for(let t of e.target.elements)t[ve]?.()})},{capture:!0}))}function ct(e){var t=Kn,n=z;Jn(null),Yn(null);try{return e()}finally{Jn(t),Yn(n)}}function lt(e,t,n,r=n){e.addEventListener(t,()=>ct(n));let i=e[ve];e[ve]=i?()=>{i(),r(!0)}:()=>r(!0),st()}function ut(e,t,n,r){let i=Xe()?mt:k;var a=e.filter(e=>!e.settled),o=t.map(i);if(n.length===0&&a.length===0){r(o);return}var s=z,c=dt(),l=a.length===1?a[0].promise:a.length>1?Promise.all(a.map(e=>e.promise)):null;function u(e){if(!(s.f&16384)){c();try{r([...o,...e])}catch(e){hn(e,s)}ft()}}var d=pt();if(n.length===0){l.then(()=>u([])).finally(d);return}function f(){Promise.all(n.map(e=>gt(e))).then(u).catch(e=>hn(e,s)).finally(d)}l?l.then(()=>{c(),f(),ft()}):f()}function dt(){var e=z,t=Kn,n=Ke,r=A;return function(i=!0){Yn(e),Jn(t),qe(n),i&&!(e.f&16384)&&(r?.activate(),r?.apply())}}function ft(e=!0){Yn(null),Jn(null),qe(null),e&&A?.deactivate()}function pt(){var e=z,t=e.b,n=A,r=!!t?.is_rendered();return t?.update_pending_count(1,n),n.increment(r,e),()=>{t?.update_pending_count(-1,n),n.decrement(r,e)}}function mt(e){var t=2|S;return z!==null&&(z.f|=ie),{ctx:Ke,deps:null,effects:null,equals:je,f:t,fn:e,reactions:null,rv:0,v:r,wv:0,parent:z,ac:null}}var ht=Symbol(`obsolete`);function gt(e,t,n){let i=z;i===null&&Fe();var a=void 0,o=Wt(r),s=!Kn,c=new Set;return Dn(()=>{var t=z,n=y();a=n.promise;try{Promise.resolve(e()).then(n.resolve,e=>{e!==ye&&n.reject(e)}).finally(ft)}catch(e){n.reject(e),ft()}var r=A;if(s){if(t.f&32768)var l=pt();if(i.b?.is_rendered())r.async_deriveds.get(t)?.reject(ht);else for(let e of c.values())e.reject(ht);c.add(n),r.async_deriveds.set(t,n)}let u=(e,t=void 0)=>{l?.(),c.delete(n),t!==ht&&(r.activate(),t?(o.f|=le,Jt(o,t)):(o.f&8388608&&(o.f^=le),Jt(o,e)),r.deactivate())};n.promise.then(u,e=>u(null,e||`unknown`))}),bn(()=>{for(let e of c)e.reject(ht)}),new Promise(e=>{function t(n){function r(){n===a?e(o):t(a)}n.then(r,r)}t(a)})}function _t(e){let t=mt(e);return Zn(t),t}function k(e){let t=mt(e);return t.equals=Ne,t}function vt(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n{t.ac.abort(ye),t.ac=null}),t.fn!==null&&(t.teardown=g),fr(t,0),Mn(t))}function St(e){if(e.effects!==null)for(let t of e.effects)t.teardown&&t.fn!==null&&pr(t)}var Ct=null,A=null,wt=null,Tt=null,Et=null,Dt=!1,Ot=!1,kt=null,At=null,jt=0,Mt=1,Nt=class e{id=Mt++;#e=!1;linked=!0;#t=null;#n=null;async_deriveds=new Map;current=new Map;previous=new Map;#r=new Set;#i=new Set;#a=0;#o=new Map;#s=null;#c=[];#l=[];#u=new Set;#d=new Set;#f=new Map;#p=new Set;is_fork=!1;#m=!1;constructor(){Ct===null?Ct=this:(Ct.#n=this,this.#t=Ct),Ct=this}#h(){if(this.is_fork)return!0;for(let n of this.#o.keys()){for(var e=n,t=!1;e.parent!==null;){if(this.#f.has(e)){t=!0;break}e=e.parent}if(!t)return!0}return!1}skip_effect(e){this.#f.has(e)||this.#f.set(e,{d:[],m:[]}),this.#p.delete(e)}unskip_effect(e,t=e=>this.schedule(e)){var n=this.#f.get(e);if(n){this.#f.delete(e);for(var r of n.d)nt(r,S),t(r);for(r of n.m)nt(r,C),t(r)}this.#p.add(e)}#g(){var e=[];for(let i of this.#c)if(!(i.f&16384||!(i.f&6144))){for(var t=i,n=!1;t.parent!==null;){t=t.parent;var r=t.f;if(r&96){if(!(r&1024)){n=!0;break}t.f^=x}}n||e.push(t)}return this.#c=[],e}#_(){this.#e=!0;for(let e of this.#u)this.#d.delete(e),nt(e,S),this.schedule(e);for(let e of this.#d)nt(e,C),this.schedule(e);this.apply();for(var t=kt=[],n=[],r=At=[];this.#c.length>0;){jt++>1e3&&(this.#S(),Ft());for(let e of this.#g())try{this.#v(e,t,n)}catch(t){throw Bt(e),this.#h()||this.discard(),t}}if(A=null,r.length>0){var i=e.ensure();for(let e of r)i.schedule(e)}if(kt=null,At=null,this.#h()){this.#x(n),this.#x(t);for(let[e,t]of this.#f)zt(e,t);r.length>0&&A.#_();return}let a=this.#y();if(a){this.#x(n),this.#x(t),a.#b(this);return}this.#u.clear(),this.#d.clear();for(let e of this.#r)e(this);this.#r.clear(),wt=this,Lt(n),Lt(t),wt=null,this.#s?.resolve();var o=A;if(this.#a===0&&(this.#c.length===0||o!==null)&&this.#S(),this.#c.length>0){if(o!==null){for(let e of this.#c)o.#c.push(e);this.#c=[]}else o=this}o!==null&&(Ht.clear(),o.#_())}#v(e,t,n){e.f^=x;for(var r=e.first;r!==null;){var i=r.f,a=!!(i&96);if(!(a&&i&1024||i&8192||this.#f.has(r))&&r.fn!==null){a?r.f^=x:i&4?t.push(r):sr(r)&&(i&16&&this.#d.add(r),pr(r));var o=r.first;if(o!==null){r=o;continue}}for(;r!==null;){var s=r.next;if(s!==null){r=s;break}r=r.parent}}}#y(){for(var e=this.#t;e!==null;){if(!e.is_fork){for(let[t,[,n]]of this.current)if(e.current.has(t)&&!n)return e}e=e.#t}return null}#b(e){for(let[t,n]of e.current)!this.previous.has(t)&&e.previous.has(t)&&this.previous.set(t,e.previous.get(t)),this.current.set(t,n);for(let[t,n]of e.async_deriveds){let e=this.async_deriveds.get(t);e&&n.promise.then(e.resolve).catch(e.reject)}e.async_deriveds.clear(),this.transfer_effects(e.#u,e.#d);let t=e=>{var n=e.reactions;if(n!==null&&!(e.f&2&&!(e.f&6144)))for(let e of n){var r=e.f;if(r&2)t(e);else{var i=e;r&4194320&&!this.async_deriveds.has(i)&&(this.#d.delete(i),nt(i,S),this.schedule(i))}}};for(let e of this.current.keys())t(e);this.oncommit(()=>e.discard()),e.#S(),A=this,this.#_()}#x(e){for(var t=0;t{this.#m=!1,this.linked&&this.flush()}))}transfer_effects(e,t){for(let t of e)this.#u.add(t);for(let e of t)this.#d.add(e);e.clear(),t.clear()}oncommit(e){this.#r.add(e)}ondiscard(e){this.#i.add(e)}settled(){return(this.#s??=y()).promise}static ensure(){if(A===null){let t=A=new e;!Ot&&!Dt&&$e(()=>{t.#e||t.flush()})}return A}apply(){Tt=null}schedule(e){if(Et=e,e.b?.is_pending&&e.f&16777228&&!(e.f&32768)){e.b.defer_effect(e);return}this.#c.push(e)}#S(){if(this.linked){var e=this.#t,t=this.#n;e===null||(e.#n=t),t===null?Ct=e:t.#t=e,this.linked=!1}}};function Pt(e){var t=Dt;Dt=!0;try{var n;for(e&&(A!==null&&!A.is_fork&&A.flush(),n=e());;){if(et(),A===null)return n;A.flush()}}finally{Dt=t}}function Ft(){try{Be()}catch(e){hn(e,Et)}}var It=null;function Lt(e){var t=e.length;if(t!==0){for(var n=0;n0)){Ht.clear();for(let e of It){if(e.f&24576)continue;let t=[e],n=e.parent;for(;n!==null;)It.has(n)&&(It.delete(n),t.push(n)),n=n.parent;for(let e=t.length-1;e>=0;e--){let n=t[e];n.f&24576||pr(n)}}It.clear()}}It=null}}function Rt(e){A.schedule(e)}function zt(e,t){if(!(e.f&32&&e.f&1024)){e.f&2048?t.d.push(e):e.f&4096&&t.m.push(e),nt(e,x);for(var n=e.first;n!==null;)zt(n,t),n=n.next}}function Bt(e){nt(e,x);for(var t=e.first;t!==null;)Bt(t),t=t.next}var Vt=new Set,Ht=new Map,Ut=!1;function Wt(e,t){return{f:0,v:e,reactions:null,equals:je,rv:0,wv:0}}function Gt(e,t){let n=Wt(e,t);return Zn(n),n}function j(t,n=!1,r=!0){let i=Wt(t);return n||(i.equals=Ne),e&&r&&Ke!==null&&Ke.l!==null&&(Ke.l.s??=[]).push(i),i}function M(e,t,n=!1){return Kn!==null&&(!qn||Kn.f&131072)&&Xe()&&Kn.f&4325394&&(Xn===null||!Xn.has(e))&&We(),Jt(e,n?Qt(t):t,At)}var Kt=null,qt=0;function Jt(e,t,n=null){if(!e.equals(t)){Wn?Ht.set(e,t):Ht.has(e)||Ht.set(e,e.v);var r=Nt.ensure();if(r.capture(e,t),e.f&2){let t=e;e.f&2048&&yt(t),Tt===null&&rt(t)}e.wv=or(),Kt=null,qt=0,Zt(e,S,n),Kt=null,Xe()&&z!==null&&z.f&1024&&!(z.f&96)&&(er===null?tr([e]):er.push(e)),!r.is_fork&&Vt.size>0&&!Ut&&Yt()}return t}function Yt(){Ut=!1;for(let e of Vt){e.f&1024&&nt(e,C);let t;try{t=sr(e)}catch{t=!0}t&&pr(e)}Vt.clear()}function Xt(e){M(e,e.v+1)}function Zt(e,t,n){var r=e.reactions;if(r!==null){var i=Xe(),a=r.length;if(qt+=a,qt>1e5&&Kt===null&&(Kt=new Set),Kt!==null){if(Kt.has(e))return;Kt.add(e)}for(var o=0;o{if(ir===c)return e();var t=Kn,n=ir;Jn(null),ar(c);var r=e();return Jn(t),ar(n),r};return i&&n.set(`length`,Gt(e.length,s)),new Proxy(e,{defineProperty(e,t,r){(!(`value`in r)||r.configurable===!1||r.enumerable===!1||r.writable===!1)&&He();var i=n.get(t);return i===void 0?l(()=>{var e=Gt(r.value,s);return n.set(t,e),e}):M(i,r.value,!0),!0},deleteProperty(e,t){var i=n.get(t);if(i===void 0){if(t in e){let e=l(()=>Gt(r,s));n.set(t,e),Xt(o)}}else M(i,r),Xt(o);return!0},get(t,i,a){if(i===ue)return e;var o=n.get(i),c=i in t;if(o===void 0&&(!c||u(t,i)?.writable)&&(o=l(()=>Gt(Qt(c?t[i]:r),s)),n.set(i,o)),o!==void 0){var d=B(o);return d===r?void 0:d}return Reflect.get(t,i,a)},getOwnPropertyDescriptor(e,t){this.has?.(e,t);var i=Reflect.getOwnPropertyDescriptor(e,t),a=n.get(t);if(a!==void 0){var o=B(a);if(o===r)return;if(i&&`value`in i)i.value=o;else return{enumerable:!0,configurable:!0,value:o,writable:!0}}return i},has(e,t){if(t===ue)return!0;var i=n.get(t),a=i!==void 0&&i.v!==r||Reflect.has(e,t);return(i!==void 0||z!==null&&(!a||u(e,t)?.writable))&&(i===void 0&&(i=l(()=>Gt(a?Qt(e[t]):r,s)),n.set(t,i)),B(i)===r)?!1:a},set(e,t,a,c){var d=n.get(t),f=t in e;if(i&&t===`length`)for(var p=a;pGt(r,s)),n.set(p+``,m)):M(m,r)}if(d===void 0)(!f||u(e,t)?.writable)&&(d=l(()=>Gt(void 0,s)),M(d,Qt(a)),n.set(t,d));else{f=d.v!==r;var h=l(()=>Qt(a));M(d,h)}var g=Reflect.getOwnPropertyDescriptor(e,t);if(g?.set&&g.set.call(c,a),!f){if(i&&typeof t==`string`){var _=n.get(`length`),v=Number(t);Number.isInteger(v)&&v>=_.v&&M(_,v+1)}Xt(o)}return!0},ownKeys(e){B(o);var t=Reflect.ownKeys(e).filter(e=>{var t=n.get(e);return t===void 0||t.v!==r});for(var[i,a]of n)a.v!==r&&!(i in e)&&t.push(i);return t},setPrototypeOf(){Ue()}})}function $t(e){try{if(typeof e==`object`&&e&&ue in e)return e[ue]}catch{}return e}function en(e,t){return Object.is($t(e),$t(t))}var tn,nn,rn,an;function on(){if(tn===void 0){tn=window,nn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;rn=u(t,`firstChild`).get,an=u(t,`nextSibling`).get,h(e)&&(e[he]=void 0,e[me]=null,e[ge]=void 0,e.__e=void 0),h(n)&&(n[_e]=void 0)}}function sn(e=``){return document.createTextNode(e)}function cn(e){return rn.call(e)}function ln(e){return an.call(e)}function N(e,t){if(!T)return cn(e);var n=cn(E);if(n===null)n=E.appendChild(sn());else if(t&&n.nodeType!==3){var r=sn();return n?.before(r),Ee(r),r}return t&&pn(n),Ee(n),n}function P(e,t=!1){if(!T){var n=cn(e);return n instanceof Comment&&n.data===``?ln(n):n}if(t){if(E?.nodeType!==3){var r=sn();return E?.before(r),Ee(r),r}pn(E)}return E}function F(e,t=!1){if(!T)return cn(e);var n=N(e,t);return D(e),n}function I(e,t=1,n=!1){let r=T?E:e;for(var i;t--;)i=r,r=ln(r);if(!T)return r;if(n){if(r?.nodeType!==3){var a=sn();return r===null?i?.after(a):r.before(a),Ee(a),a}pn(r)}return Ee(r),r}function un(e){e.textContent=``}function dn(){return!1}function fn(e,t,n){return t==null||t===`http://www.w3.org/1999/xhtml`?n?document.createElement(e,{is:n}):document.createElement(e):n?document.createElementNS(t,e,{is:n}):document.createElementNS(t,e)}function pn(e){if(e.nodeValue.length<65536)return;let t=e.nextSibling;for(;t!==null&&t.nodeType===3;)t.remove(),e.nodeValue+=t.nodeValue,t=e.nextSibling}function mn(e){var t=z;if(t===null)return Kn.f|=le,e;if(!(t.f&32768)&&!(t.f&4))throw e;hn(e,t)}function hn(e,t){if(!(t!==null&&t.f&16384)){for(;t!==null;){if(t.f&128&&!(t.f&33570816)){if(!(t.f&32768))throw e;try{t.b.error(e);return}catch(t){e=t}}t=t.parent}throw e}}function gn(e){z===null&&(Kn===null&&ze(e),Re()),Wn&&Le(e)}function _n(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function vn(e,t){var n=z;n!==null&&n.f&8192&&(e|=w);var r={ctx:Ke,deps:null,nodes:null,f:e|S|512,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};A?.register_created_effect(r);var i=r;if(e&4)kt===null?Nt.ensure().schedule(r):kt.push(r);else if(t!==null){try{pr(r)}catch(e){throw Pn(r),e}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&!(i.f&524288)&&(i=i.first,e&16&&e&65536&&i!==null&&(i.f|=re))}if(i!==null&&(i.parent=n,n!==null&&_n(i,n),Kn!==null&&Kn.f&2&&!(e&64))){var a=Kn;(a.effects??=[]).push(i)}return r}function yn(){return Kn!==null&&!qn}function bn(e){let t=vn(8,null);return nt(t,x),t.teardown=e,t}function xn(e){gn(`$effect`);var t=z.f;if(!Kn&&t&32&&Ke!==null&&!Ke.i){var n=Ke;(n.e??=[]).push(e)}else return Sn(e)}function Sn(e){return vn(4|ae,e)}function Cn(e){return gn(`$effect.pre`),vn(8|ae,e)}function wn(e){Nt.ensure();let t=vn(64|ie,e);return(e={})=>new Promise(n=>{e.outro?Ln(t,()=>{Pn(t),n(void 0)}):(Pn(t),n(void 0))})}function Tn(e){return vn(4,e)}function L(e,t){var n=Ke,r={effect:null,ran:!1,deps:e};n.l.$.push(r),r.effect=On(()=>{if(e(),!r.ran){r.ran=!0;var n=z;try{Yn(n.parent),V(t)}finally{Yn(n)}}})}function En(){var e=Ke;On(()=>{for(var t of e.l.$){t.deps();var n=t.effect;n.f&1024&&n.deps!==null&&nt(n,C),sr(n)&&pr(n),t.ran=!1}})}function Dn(e){return vn(ce|ie,e)}function On(e,t=0){return vn(8|t,e)}function R(e,t=[],n=[],r=[]){ut(r,t,n,t=>{vn(8,()=>{e(...t.map(B))})})}function kn(e,t=0){return vn(16|t,e)}function An(e){return vn(32|ie,e)}function jn(e){var t=e.teardown;if(t!==null){let n=Wn,r=Kn;Gn(!0),Jn(null);try{t.call(null)}catch(t){hn(t,e.parent)}finally{Gn(n),Jn(r)}}}function Mn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){let e=n.ac;e!==null&&ct(()=>{e.abort(ye)});var r=n.next;n.f&64?n.parent=null:Pn(n,t),n=r}}function Nn(e){for(var t=e.first;t!==null;){var n=t.next;t.f&32||Pn(t),t=n}}function Pn(e,t=!0){var n=!1;(t||e.f&262144)&&e.nodes!==null&&e.nodes.end!==null&&(Fn(e.nodes.start,e.nodes.end),n=!0),e.f|=ne,Mn(e,t&&!n),fr(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)e.stop();jn(e),e.f^=ne,e.f|=ee;var i=e.parent;i!==null&&i.first!==null&&In(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Fn(e,t){for(;e!==null;){var n=e===t?null:ln(e);e.remove(),e=n}}function In(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function Ln(e,t,n=!0){var r=[];e.f|=256,Rn(e,r,!0);var i=()=>{n&&Pn(e),t&&t()},a=r.length;if(a>0){var o=()=>--a||i();for(var s of r)s.out(o)}else i()}function Rn(e,t,n){if(!(e.f&8192)){e.f^=w;var r=e.nodes&&e.nodes.t;if(r!==null)for(let e of r)(e.is_global||n)&&t.push(e);for(var i=e.first;i!==null;){var a=i.next;if(!(i.f&64)){var o=!!(i.f&65536)||!!(i.f&32)&&!!(e.f&16);Rn(i,t,o?n:!1)}i=a}}}function zn(e){e.f&=-257,Bn(e,!0)}function Bn(e,t){if(!(e.f&256)&&e.f&8192){e.f^=w,e.f&1024||(nt(e,S),Nt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=!!(n.f&65536)||!!(n.f&32);Bn(n,i?t:!1),n=r}var a=e.nodes&&e.nodes.t;if(a!==null)for(let e of a)(e.is_global||t)&&e.in()}}function Vn(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:ln(n);t.append(n),n=i}}var Hn=null,Un=!1,Wn=!1;function Gn(e){Wn=e}var Kn=null,qn=!1;function Jn(e){Kn=e}var z=null;function Yn(e){z=e}var Xn=null;function Zn(e){Kn!==null&&(Kn.f&2097152||Kn.f&2)&&(Xn??=new Set).add(e)}var Qn=null,$n=0,er=null;function tr(e){er=e}var nr=1,rr=0,ir=rr;function ar(e){ir=e}function or(){return++nr}function sr(e){var t=e.f;if(t&2048)return!0;if(t&4096){for(var n=e.deps,r=n.length,i=0;ie.wv)return!0}t&512&&Tt===null&&nt(e,x)}return!1}function cr(e,t,n=!0){var r=e.reactions;if(r!==null&&!(Xn!==null&&Xn.has(e)))for(var i=0;i{e.ac.abort(ye)}),e.ac=null);try{e.f|=se;var u=e.fn,d=u();e.f|=te;var f=ur(e);if(Xe()&&er!==null&&!qn&&f!==null&&!(e.f&6146))for(var p=0;p0)for(t.length=$n+Qn.length,r=0;r{c.ac.abort(ye),c.ac=null,nt(c,S)}),xt(c),fr(c,0)}}function fr(e,t){var n=e.deps;if(n!==null)for(var r=t;rn?.call(this,e))}return e.startsWith(`pointer`)||e.startsWith(`touch`)||e===`wheel`?(i.__removed=!1,$e(()=>{i.__removed||t.addEventListener(e,i,r)})):t.addEventListener(e,i,r),i}function Sr(e,t,n,r,i){var a={capture:r,passive:i},o=xr(e,t,n,a);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&bn(()=>{o.__removed=!0,t.removeEventListener(e,o,a)})}function Cr(e,t,n){(t[vr]??={})[e]=n}function wr(e){for(var t=0;t{Er=!1,Tr=null}));var o=0,s=Tr===e&&e[vr];if(s){var c=i.indexOf(s);if(c!==-1&&(t===document||t===window)){e[vr]=t;return}var u=i.indexOf(t);if(u===-1)return;c<=u&&(o=c)}if(a=i[o]||e.target,a!==t){l(e,`currentTarget`,{configurable:!0,get(){return a||n}});var d=Kn,f=z;Jn(null),Yn(null);try{for(var p,m=[];a!==null&&a!==t;){try{var h=a[vr]?.[r];h!=null&&(!a.disabled||e.target===a)&&h.call(a,e)}catch(e){p?m.push(e):p=e}if(e.cancelBubble)break;o++,a=o{throw e});throw p}}finally{e[vr]=t,delete e.currentTarget,Jn(d),Yn(f)}}}var Or=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy(`svelte-trusted-html`,{createHTML:e=>e});function kr(e){return Or?.createHTML(e)??e}function Ar(e){var t=fn(`template`);return t.innerHTML=kr(e.replaceAll(``,``)),t.content}function jr(e,t){var n=z;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function U(e,t){var n=!!(t&1),r=!!(t&2),i,a=!e.startsWith(``);return()=>{if(T)return jr(E,null),E;i===void 0&&(i=Ar(a?e:``+e),n||(i=cn(i)));var t=r||nn?document.importNode(i,!0):i.cloneNode(!0);if(n){var o=cn(t),s=t.lastChild;jr(o,s)}else jr(t,t);return t}}function Mr(e=``){if(!T){var t=sn(e+``);return jr(t,t),t}var n=E;return n.nodeType===3?pn(n):(n.before(n=sn()),Ee(n)),jr(n,n),n}function Nr(){if(T)return jr(E,null),E;var e=document.createDocumentFragment(),t=document.createComment(``),n=sn();return e.append(t,n),jr(t,n),e}function W(e,t){if(T){var n=z;(!(n.f&32768)||n.nodes.end===null)&&(n.nodes.end=E),De();return}e!==null&&e.before(t)}[...`allowfullscreen.async.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.webkitdirectory.defer.disablepictureinpicture.disableremoteplayback`.split(`.`)];var Pr=[`touchstart`,`touchmove`];function Fr(e){return Pr.includes(e)}function Ir(e){let t=0,n=Wt(0),r;return()=>{yn()&&(B(n),On(()=>(t===0&&(r=V(()=>e(()=>Xt(n)))),t+=1,()=>{$e(()=>{--t,t===0&&(r?.(),r=void 0,Xt(n))})})))}}var Lr=re|ie;function Rr(e,t,n,r){new zr(e,t,n,r)}var zr=class{parent;is_pending=!1;transform_error;#e;#t=T?E:null;#n;#r;#i;#a=null;#o=null;#s=null;#c=null;#l=0;#u=0;#d=!1;#f=new Set;#p=new Set;#m=null;#h=Ir(()=>(this.#m=Wt(this.#l),()=>{this.#m=null}));constructor(e,t,n,r){this.#e=e,this.#n=t,this.#r=e=>{var t=z;t.b=this,t.f|=128,n(e)},this.parent=z.b,this.transform_error=r??this.parent?.transform_error??(e=>e),this.#i=kn(()=>{if(T){let e=this.#t;De();let t=e.data===`[!`;if(e.data.startsWith(`[?`)){let t=JSON.parse(e.data.slice(2));this.#_(t)}else t?this.#y():this.#g()}else this.#b()},Lr),T&&(this.#e=E)}#g(){try{this.#a=An(()=>this.#r(this.#e))}catch(e){this.error(e)}}#_(e){let t=this.#n.failed,{reset:n,invoke_onerror:r}=this.#v(e);$e(r),t&&(this.#s=An(()=>{t(this.#e,()=>e,()=>n)}))}#v(e){var t=!1,n=!1;let r=()=>{if(t){we();return}t=!0,n&&Ge(),this.#s!==null&&Ln(this.#s,()=>{this.#s=null}),this.#S(()=>{this.#b()})};return{reset:r,invoke_onerror:()=>{try{n=!0,this.#n.onerror?.(e,r),n=!1}catch(e){hn(e,this.#i&&this.#i.parent)}}}}#y(){let e=this.#n.pending;e&&(this.is_pending=!0,this.#o=An(()=>e(this.#e)),$e(()=>{var e=this.#c=document.createDocumentFragment(),t=sn(),n=!1;if(e.append(t),this.#a=this.#S(()=>{try{return An(()=>this.#r(t))}catch(e){try{this.error(e),n=!0}catch(e){hn(e,this.#i.parent)}return null}}),this.#a===null){this.#c=null,n&&this.#x(A);return}this.#u===0&&(this.#e.before(e),this.#c=null,Ln(this.#o,()=>{this.#o=null}),this.#x(A))}))}#b(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#l=0,this.#a=An(()=>{this.#r(this.#e)}),this.#u>0){var e=this.#c=document.createDocumentFragment();Vn(this.#a,e);let t=this.#n.pending;this.#o=An(()=>t(this.#e))}else this.#x(A)}catch(e){this.error(e)}}#x(e){this.is_pending=!1,e.transfer_effects(this.#f,this.#p)}defer_effect(e){it(e,this.#f,this.#p)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#n.pending}#S(e){var t=z,n=Kn,r=Ke;Yn(this.#i),Jn(this.#i),qe(this.#i.ctx);try{return Nt.ensure(),e()}finally{Yn(t),Jn(n),qe(r)}}#C(e,t){if(!this.has_pending_snippet()){this.parent&&this.parent.#C(e,t);return}this.#u+=e,this.#u===0&&(this.#x(t),this.#o&&Ln(this.#o,()=>{this.#o=null}),this.#c&&=(this.#e.before(this.#c),null))}update_pending_count(e,t){this.#C(e,t),this.#l+=e,!(!this.#m||this.#d)&&(this.#d=!0,$e(()=>{this.#d=!1,this.#m&&Jt(this.#m,this.#l)}))}get_effect_pending(){return this.#h(),B(this.#m)}error(e){if(!this.#n.onerror&&!this.#n.failed)throw e;A?.is_fork?(this.#a&&A.skip_effect(this.#a),this.#o&&A.skip_effect(this.#o),this.#s&&A.skip_effect(this.#s),A.oncommit(()=>{this.#w(e)})):this.#w(e)}#w(e){this.#a&&=(Pn(this.#a),null),this.#o&&=(Pn(this.#o),null),this.#s&&=(Pn(this.#s),null),T&&(Ee(this.#t),Oe(),Ee(ke()));let t=this.#n.failed,n=e=>{let{reset:n,invoke_onerror:r}=this.#v(e);r(),t&&(this.#s=this.#S(()=>{try{return An(()=>{var r=z;r.b=this,r.f|=128,t(this.#e,()=>e,()=>n)})}catch(e){return hn(e,this.#i.parent),null}}))};$e(()=>{var t;try{t=this.transform_error(e)}catch(e){hn(e,this.#i&&this.#i.parent);return}typeof t==`object`&&t&&typeof t.then==`function`?t.then(n,e=>hn(e,this.#i&&this.#i.parent)):n(t)})}};function G(e,t){var n=t==null?``:typeof t==`object`?`${t}`:t;n!==(e[_e]??=e.nodeValue)&&(e[_e]=n,e.nodeValue=`${n}`)}function Br(e,t){return Hr(e,t)}var Vr=new Map;function Hr(e,{target:t,anchor:r,props:i={},events:a,context:o,intro:s=!0,transformError:l}){on();var u=void 0,d=wn(()=>{var s=r??t.appendChild(sn());Rr(s,{pending:()=>{}},t=>{O({});var r=Ke;if(o&&(r.c=o),a&&(i.$$events=a),T&&jr(t,null),u=e(t,i)||Ye(),T&&(z.nodes.end=E,E===null||E.nodeType!==8||E.data!==`]`))throw Se(),n;Je()},l);var d=new Set,f=e=>{for(var n=0;n{for(var e of d)for(let r of[t,document]){var n=Vr.get(r),i=n.get(e);--i==0?(r.removeEventListener(e,Dr),n.delete(e),n.size===0&&Vr.delete(r)):n.set(e,i)}br.delete(f),s!==r&&s.parentNode?.removeChild(s)}});return Ur.set(u,d),u}var Ur=new WeakMap,Wr=class{anchor;#e=new Map;#t=new Map;#n=new Map;#r=new Set;#i=!0;constructor(e,t=!0){this.anchor=e,this.#i=t}#a=e=>{if(this.#e.has(e)){var t=this.#e.get(e),n=this.#t.get(t);if(n)zn(n),this.#r.delete(t);else{var r=this.#n.get(t);r&&(zn(r.effect),this.#t.set(t,r.effect),this.#n.delete(t),r.fragment.lastChild.remove(),this.anchor.before(r.fragment),n=r.effect)}for(let[t,n]of this.#e){if(this.#e.delete(t),t===e)break;let r=this.#n.get(n);r&&(Pn(r.effect),this.#n.delete(n))}for(let[e,r]of this.#t){if(e===t||this.#r.has(e))continue;let i=()=>{if(Array.from(this.#e.values()).includes(e)){var t=document.createDocumentFragment();Vn(r,t),t.append(sn()),this.#n.set(e,{effect:r,fragment:t})}else Pn(r);this.#r.delete(e),this.#t.delete(e)};this.#i||!n?(this.#r.add(e),Ln(r,i,!1)):i()}}};#o=e=>{this.#e.delete(e);let t=Array.from(this.#e.values());for(let[e,n]of this.#n)t.includes(e)||(Pn(n.effect),this.#n.delete(e))};ensure(e,t){var n=A,r=dn();if(t&&!this.#t.has(e)&&!this.#n.has(e)){if(r){var i=document.createDocumentFragment(),a=sn();i.append(a),this.#n.set(e,{effect:An(()=>t(a)),fragment:i})}else this.#t.set(e,An(()=>t(this.anchor)))}if(this.#e.set(n,e),r){for(let[t,r]of this.#t)t===e?n.unskip_effect(r):n.skip_effect(r);for(let[t,r]of this.#n)t===e?n.unskip_effect(r.effect):n.skip_effect(r.effect);n.oncommit(this.#a),n.ondiscard(this.#o)}else T&&(this.anchor=E),this.#a(n)}};function Gr(t){Ke===null&&Pe(`onMount`),e&&Ke.l!==null?Kr(Ke).m.push(t):xn(()=>{let e=V(t);if(typeof e==`function`)return e})}function Kr(e){var t=e.l;return t.u??={a:[],b:[],m:[]}}function K(e,t,n=!1){var r;T&&(r=E,De());var i=new Wr(e),a=n?re:0;function o(e,t){if(T){var n=Ae(r);if(e!==parseInt(n.substring(1))){var a=ke();Ee(a),i.anchor=a,Te(!1),i.ensure(e,t),Te(!0);return}}i.ensure(e,t)}kn(()=>{var e=!1;t((t,n=0)=>{e=!0,o(n,t)}),e||o(-1,null)},a)}var qr=Symbol(`NaN`);function Jr(e,t,n){T&&De();var r=new Wr(e),i=!Xe();kn(()=>{var e=t();e!==e&&(e=qr),i&&typeof e==`object`&&e&&(e={}),r.ensure(e,n)})}function q(e,t){return t}function Yr(e,t,n){for(var r=[],i=t.length,a,o=t.length,s=0;s{if(a){if(a.pending.delete(n),a.done.add(n),a.pending.size===0){var t=e.outrogroups;Xr(e,c(a.done)),t.delete(a),t.size===0&&(e.outrogroups=null)}}else--o},!1)}if(o===0){var l=r.length===0&&n!==null&&e.pending.size===0;if(l){var u=n,d=u.parentNode;un(d),d.append(u),e.items.clear()}Xr(e,t,!l)}else a={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(a)}function Xr(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(let t of e.pending.values())for(let n of t)r.add(e.items.get(n).e)}for(var i=0;i{var e=n();return a(e)?e:e==null?[]:c(e)}),p,m=new Map,h=!0;function g(e){v.effect.f&16384||(v.pending.delete(e),v.fallback=d,$r(v,p,s,t,r),d!==null&&(p.length===0?d.f&33554432?(d.f^=oe,ti(d,null,s)):zn(d):Ln(d,()=>{d=null})))}function _(e){v.pending.delete(e)}var v={effect:kn(()=>{p=B(f);var e=p.length;let a=!1;T&&Ae(s)===`[!`!=(e===0)&&(s=ke(),Ee(s),Te(!1),a=!0);for(var c=new Set,u=A,v=dn(),y=0;yo(s)):(d=An(()=>o(Zr??=sn())),d.f|=oe)),e>c.size&&Ie(``,``,``),T&&e>0&&Ee(ke()),!h){if(m.set(u,c),v){for(let[e,t]of l)c.has(e)||u.skip_effect(t.e);u.oncommit(g),u.ondiscard(_)}else g(u)}a&&Te(!0),B(f)}),flags:t,items:l,pending:m,outrogroups:null,fallback:d};h=!1,T&&(s=E)}function Qr(e){for(;e!==null&&!(e.f&32);)e=e.next;return e}function $r(e,t,n,r,i){var a=!!(r&8),o=t.length,s=e.items,l=Qr(e.effect.first),u,d=null,f,p=[],m=[],h,g,_,v;if(a)for(v=0;v0){var te=r&4&&o===0?n:null;if(a){for(v=0;v{if(f!==void 0)for(_ of f)_.nodes?.a?.apply()})}function ei(e,t,n,r,i,a,o,s){var c=o&1?o&16?Wt(n):j(n,!1,!1):null,l=o&2?Wt(i):null;return{v:c,i:l,e:An(()=>(a(t,c??n,l??i,s),()=>{e.delete(r)}))}}function ti(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,a=t&&!(t.f&33554432)?t.nodes.start:n;r!==null;){var o=ln(r);if(a.before(r),r===i)return;r=o}}function ni(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function ri(e,t,n){Tn(()=>{var r=V(()=>t(e,n?.())||{});if(n&&r?.update){var i=!1,a={};On(()=>{var e=n();H(e),i&&Me(a,e)&&(a=e,r.update(e))}),i=!0}if(r?.destroy)return()=>r.destroy()})}function ii(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`){if(Array.isArray(e)){var i=e.length;for(t=0;t=0;){var s=o+a;(o===0||si.includes(r[o-1]))&&(s===r.length||si.includes(r[s]))?r=(o===0?``:r.substring(0,o))+r.substring(s+1):o=s}}return r===``?null:r}function li(e,t,n,r,i,a){var o=e[he];if(T||o!==n||o===void 0){var s=ci(n,r,a);(!T||s!==e.getAttribute(`class`))&&(s==null?e.removeAttribute(`class`):t?e.className=s:e.setAttribute(`class`,s)),e[he]=n}else if(a&&i!==a)for(var c in a){var l=!!a[c];(i==null||l!==!!i[c])&&e.classList.toggle(c,l)}return a}function ui(e,t){t?e.hasAttribute(`selected`)||e.setAttribute(`selected`,``):e.removeAttribute(`selected`)}function di(e,t){var n=e.__defaultValue,r=e.multiple,i=r?n??[]:null;if(!r||a(i)){var o=e.selectedIndex,s=t&&r?new Set(e.selectedOptions):null;for(var c of e.options){var l=hi(c);ui(c,r?i.includes(l):en(l,n))}if(t){if(s!==null)for(c of e.options){var u=s.has(c);c.selected!==u&&(c.selected=u)}else e.selectedIndex!==o&&(e.selectedIndex=o)}}}function fi(e,t,n=!1){if(e.multiple){if(t==null)return;if(!a(t))return Ce();for(var r of e.options)r.selected=t.includes(hi(r));return}for(r of e.options)if(en(hi(r),t)){r.selected=!0;return}(!n||t!==void 0)&&(e.selectedIndex=-1)}function pi(e){var t=new MutationObserver(t=>{t.every(gi)||(`__defaultValue`in e&&di(e,!1),`__value`in e&&fi(e,e.__value))});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`value`]}),bn(()=>{t.disconnect()})}function mi(e,t,n=t){var r=new WeakSet,i=!0;lt(e,`change`,t=>{var i=t?`[selected]`:`:checked`,a;if(e.multiple)a=[].map.call(e.querySelectorAll(i),hi);else{var o=e.querySelector(i)??e.querySelector(`option:not([disabled])`);a=o&&hi(o)}n(a),e.__value=a,A!==null&&r.add(A)}),Tn(()=>{var a=t();if(e===document.activeElement){var o=A;if(r.has(o))return}if(fi(e,a,i),i&&a===void 0){var s=e.querySelector(`:checked`);s!==null&&(a=hi(s),n(a))}e.__value=a,i=!1})}function hi(e){return`__value`in e?e.__value:e.value}function gi(e){if(e.target.closest(`selectedcontent`)!==null)return!0;if(e.type===`childList`){var t=[...e.addedNodes,...e.removedNodes];return t.length>0&&t.every(e=>e.nodeName===`SELECTEDCONTENT`)}return!1}var _i=Symbol(`is custom element`),vi=Symbol(`is html`),yi=be?`link`:`LINK`;function bi(e){if(T){var t=!1,n=()=>{if(!t){if(t=!0,e.hasAttribute(`value`)){var n=e.value;Y(e,`value`,null),e.value=n}if(e.hasAttribute(`checked`)){var r=e.checked;Y(e,`checked`,null),e.checked=r}}};e[ve]=n,$e(n),st()}}function xi(e,t){var n=Si(e);n.checked!==(n.checked=t??void 0)&&(e.checked=t)}function Y(e,t,n,r){var i=Si(e);T&&(i[t]=e.getAttribute(t),t===`src`||t===`srcset`||t===`href`&&e.nodeName===yi)||i[t]!==(i[t]=n)&&(t===`loading`&&(e[pe]=n),n==null?e.removeAttribute(t):typeof n!=`string`&&wi(e).has(t)?e[t]=n:e.setAttribute(t,n))}function Si(e){return e[me]??={[_i]:e.nodeName.includes(`-`),[vi]:e.namespaceURI===i}}var Ci=new Map;function wi(e){var t=e.getAttribute(`is`)||e.nodeName,n=Ci.get(t);if(n)return n;Ci.set(t,n=new Set);for(var r,i=e,a=Element.prototype;a!==i;){for(var o in r=d(i),r)r[o].set&&o!==`innerHTML`&&o!==`textContent`&&o!==`innerText`&&n.add(o);i=m(i)}return n}function Ti(e,t,n=t){var r=new WeakSet;lt(e,`input`,async i=>{var a=i?e.defaultValue:e.value;if(a=Ei(e)?Di(a):a,n(a),A!==null&&r.add(A),await mr(),a!==(a=t())){var o=e.selectionStart,s=e.selectionEnd,c=e.value.length;if(e.value=a??``,s!==null){var l=e.value.length;o===s&&s===c&&l>c?(e.selectionStart=l,e.selectionEnd=l):(e.selectionStart=o,e.selectionEnd=Math.min(s,l))}}}),(T&&e.defaultValue!==e.value||V(t)==null&&e.value)&&(n(Ei(e)?Di(e.value):e.value),A!==null&&r.add(A)),On(()=>{var n=t();if(e===document.activeElement){var i=A;if(r.has(i))return}Ei(e)&&n===Di(e.value)||(e.type!==`date`||n||e.value)&&n!==e.value&&(e.value=n??``)})}function Ei(e){var t=e.type;return t===`number`||t===`range`}function Di(e){return e===``?null:+e}function Oi(e,t){return e===t||e?.[ue]===t}function ki(e=Ye(),t,n,r){var i=Ke.r,a=z;return Tn(()=>{var o,s;return On(()=>{o=s,s=r?.()||[],V(()=>{Oi(n(...s),e)||(t(e,...s),o&&Oi(n(...o),e)&&t(null,...o))})}),()=>{let r=a;for(;r!==i&&r.parent!==null&&r.parent.f&33554432;)r=r.parent;let o=()=>{s&&Oi(n(...s),e)&&t(null,...s)},c=r.teardown;r.teardown=()=>{o(),c?.()}}}),e}function Ai(e=!1){let t=Ke,n=t.l.u;if(!n)return;let r=()=>H(t.s);if(e){let e=0,n={},i=mt(()=>{let r=!1,i=t.s;for(let e in i)i[e]!==n[e]&&(n[e]=i[e],r=!0);return r&&e++,e});r=()=>B(i)}n.b.length&&Cn(()=>{ji(t,r),v(n.b)}),xn(()=>{let e=V(()=>n.m.map(_));return()=>{for(let t of e)typeof t==`function`&&t()}}),n.a.length&&xn(()=>{ji(t,r),v(n.a)})}function ji(e,t){if(e.l.s)for(let t of e.l.s)B(t);t()}function Mi(e,t,n){if(e==null)return t(void 0),n&&n(void 0),g;let r=V(()=>e.subscribe(t,n));return r.unsubscribe?()=>r.unsubscribe():r}var Ni=[];function Pi(e,t=g){let n=null,r=new Set;function i(t){if(Me(e,t)&&(e=t,n)){let t=!Ni.length;for(let t of r)t[1](),Ni.push(t,e);if(t){for(let e=0;e{r.delete(c),r.size===0&&n&&(n(),n=null)}}return{set:i,update:a,subscribe:o}}function Fi(e){let t;return Mi(e,e=>t=e)(),t}var Ii=!1,Li=Symbol(`unmounted`);function Ri(e,t,n){let r=n[t]??={store:null,source:j(void 0),unsubscribe:g};if(r.store!==e&&!(Li in n)){if(r.unsubscribe(),r.store=e??null,e==null)r.source.v=void 0,r.unsubscribe=g;else{var i=!0;r.unsubscribe=Mi(e,e=>{i?r.source.v=e:M(r.source,e)}),i=!1}}return e&&Li in n?Fi(e):B(r.source)}function zi(){let e={};function t(){bn(()=>{for(var t in e)e[t].unsubscribe();l(e,Li,{enumerable:!1,value:!0})})}return[e,t]}function Bi(e){var t=Ii;try{return Ii=!1,[e(),Ii]}finally{Ii=t}}function X(t,n,r,i){var a=!e||!!(r&2),o=!!(r&8),s=!!(r&16),c=i,l=!0,d=void 0,f=()=>s&&a?(d??=mt(i),B(d)):(l&&(l=!1,c=s?V(i):i),c);let p;if(o){var m=ue in t||fe in t;p=u(t,n)?.set??(m&&n in t?e=>t[n]=e:void 0)}var h,g=!1;o?[h,g]=Bi(()=>t[n]):h=t[n],h===void 0&&i!==void 0&&(h=f(),p&&(a&&Ve(n),p(h)));var _=a?()=>{var e=t[n];return e===void 0?f():(l=!0,e)}:()=>{var e=t[n];return e!==void 0&&(c=void 0),e===void 0?c:e};if(a&&!(r&4))return _;if(p){var v=t.$$legacy;return(function(e,t){return arguments.length>0?((!a||!t||v||g)&&p(t?_():e),e):_()})}var y=!1,b=(r&1?mt:k)(()=>(y=!1,_()));o&&B(b);var x=z;return(function(e,t){if(arguments.length>0){let n=t?B(b):a&&o?Qt(e):e;return M(b,n),y=!0,c!==void 0&&(c=n),e}return Wn&&y||x.f&16384?b.v:B(b)})}async function Vi(e,t,n){let r=await fetch(e,{method:`POST`,cache:`no-store`,headers:{"Content-Type":`application/json`,"X-Setup-Session-Key":n.sessionKey,...n.capability?{"X-Setup-Capability":n.capability}:{}},body:JSON.stringify(t)}),i=await r.json();if(!r.ok)throw Error(String(i.error??`The request was rejected.`));return i}function Hi(e){let t=Pi({paired:!!e,controller:!1,busy:!1,error:``}),n=e,r,i={paired:!!e,controller:!1,busy:!1,error:``},a=!1;function o(e){i={...i,...e},t.set(i)}async function s(e=!1){if(!(a||!n||i.closed)){a=!0;try{let t=await fetch(`/api/state`,{cache:`no-store`,headers:{"X-Setup-Session-Key":n}});if(!t.ok)throw Error(`The local setup session is unavailable.`);let r=await t.json();i.closed||o({view:r,...e?{}:{error:``}})}catch{i.closed||o({view:void 0,error:`Connection lost. The CLI may have stopped. Check the terminal before trying again.`})}finally{a=!1}}}let c=()=>s(!0);async function l(){if(n&&!i.closed)try{let e=await fetch(`/api/bootstrap`,{cache:`no-store`,headers:{"X-Setup-Session-Key":n}});if(!e.ok)throw Error(`Could not join this local session.`);let t=await e.json();r=t.capability,o({controller:t.controller,error:``}),await s()}catch{n=void 0,r=void 0,o({view:void 0,paired:!1,controller:!1,error:`Could not connect to the local setup session. Check the terminal and pair again.`})}}async function u(e){if(!(i.busy||i.paired)){o({busy:!0,error:``});try{let t=await fetch(`/api/pair`,{method:`POST`,cache:`no-store`,headers:{"Content-Type":`application/json`},body:JSON.stringify({code:e.trim().toLowerCase()})}),r=await t.json();if(!t.ok)throw Error(String(r.error??`Pairing was rejected.`));if(typeof r.sessionKey!=`string`||!/^[a-f0-9]{64}$/.test(r.sessionKey))throw Error(`Invalid local pairing response.`);n=r.sessionKey,o({paired:!0,error:``}),await l()}catch(e){o({error:e instanceof Error?e.message:`Could not pair this browser.`})}finally{o({busy:!1})}}}let d=(e,t,i=!0)=>Vi(e,t,{sessionKey:n,capability:i?r:void 0});async function f(e,t){let n=e instanceof Error?e.message:t;o({error:n}),/read-only|Control moved/.test(n)?await l():await s(!0)}async function p(e,t){if(!i.busy&&i.controller&&i.view?.promptRevision===e){o({busy:!0,error:``});try{await d(`/api/answer`,{revision:e,value:t}),await s()}catch(e){await f(e,`Could not submit this answer.`)}finally{o({busy:!1})}}}async function m(e){if(!i.busy&&i.controller&&i.view?.promptRevision===e){o({busy:!0,error:``});try{await d(`/api/retry-discovery`,{revision:e}),await s()}catch(e){await f(e,`Could not retry discovery.`)}finally{o({busy:!1})}}}async function h(e){if(!i.busy&&i.controller&&i.view?.promptRevision===e){o({busy:!0,error:``});try{await d(`/api/back`,{revision:e}),await s()}catch(e){await f(e,`Could not return to the previous question.`)}finally{o({busy:!1})}}}async function g(){if(i.controller&&!i.busy){o({busy:!0,error:``});try{await d(`/api/cancel`,{}),await s()}catch(e){let t=e instanceof Error?e.message:`Cancellation failed.`;o({error:t}),/read-only|Control moved/.test(t)&&await l()}finally{o({busy:!1})}}}async function _(e){if(!(i.busy||i.closed||!i.paired||i.controller)){o({busy:!0,error:``});try{let t=await d(`/api/takeover`,{code:e.trim().toLowerCase()},!1);r=String(t.capability),o({controller:!0,error:``}),await s()}catch(e){o({error:e instanceof Error?e.message:`Takeover failed.`}),await s(!0)}finally{o({busy:!1})}}}async function v(){if(!i.busy&&!i.closed&&i.controller&&i.view?.outcome){o({busy:!0,error:``});try{if((await d(`/api/close`,{})).closed!==!0)throw Error(`Could not close the local session. Check the terminal before trying again.`);n=void 0,r=void 0,o({closed:!0,controller:!1,error:``})}catch{o({error:`Could not close the local session. Check the terminal before trying again.`})}finally{o({busy:!1})}}}async function y(){if(!(i.busy||i.closed||!i.controller||i.view?.outcome!==`complete`)){o({busy:!0,error:``,view:{...i.view,doctor:{status:`running`}}});try{await d(`/api/doctor`,{})}catch(e){o({error:e instanceof Error?e.message:`Read-only verification failed.`})}finally{await s(!0),o({busy:!1})}}}return{subscribe:t.subscribe,pair:u,connect:l,refresh:s,poll:c,submit:p,retryDiscovery:m,back:h,cancel:g,takeOver:_,close:v,runDoctor:y}}var Ui={batchNextActions:`Next steps`,batchStatusReady:`Ready for review`,batchStatusBlocked:`Needs action`,batchStatusApplying:`Applying reviewed plan`,batchStatusPartial:`Partially applied; inspect before retry`,batchStatusWaiting:`PR created · waiting for human merge`,batchStatusPending:`Configuration applied · verification pending`,batchStatusUnchanged:`Already matches · unchanged`,batchStatusCancelled:`Pending work stopped; completed effects retained`,batchConfigurationPreview:`Configuration preview. This adds the configuration to your batch review. No permission probe or installation runs before you approve the complete batch.`,batchUseConfiguration:`Use this configuration`,planReuseBody:`Approve the listed temporary permission checks, then apply the reviewed setup. Existing Secret values are retained and will not be requested or replaced. Runtime capability verification can remain pending.`,organizationReuseTitle:`Reusing existing configuration`,organizationReuseBody:`{imported} compatible settings imported. Retain {shared} organization Variables and {overrides} repository overrides; write {writes} repository Variables. Shared values and existing Secret values stay unchanged.`,batchBranchReview:`Installation branch and reviewed base`,batchFocusTitle:`Selected repositories`,batchFocusBody:`{count} explicitly selected repositories in this organization. Review each target independently.`,batchReviewTitle:`Review setup plans`,batchProgressTitle:`Applying repository plans`,batchResultTitle:`Repository setup results`,batchProgressBody:`Applying the approved plans sequentially. Stop pauses pending work after the current request; completed changes and PRs remain.`,batchReviewBody:`Approve only the ready plans below. Setup proceeds sequentially, adds reviewed access without replacing shared values, and creates a PR for each changed repository. It does not merge, tag, release or deploy.`,batchResultBody:`A setup PR still needs human review and merge. Credential and runtime capability verification can remain pending. Completed PRs and access changes are kept if another target stops.`,batchStopping:`Stopping pending work after the current request. Completed changes will be retained.`,batchReasonDrift:`The reviewed base or ownership changed. Inspect the repository and review a fresh plan.`,batchReasonProvider:`GitHub did not confirm the last step. Retry inspects existing effects before continuing.`,batchCleanupPending:`Permission-check cleanup could not be confirmed. Pending work is stopped. Inspect GitHub history and the local recovery journal; resolve cleanup before starting a fresh setup. This operation cannot resume writes.`,batchReasonCancelled:`Pending work stopped. Completed changes were retained.`,batchReasonPreflight:`Review repository access, required bindings and target-specific settings before continuing.`,batchOpenPull:`Open setup PR`,batchFilesCount:`{count} changed files`,batchVariablesCount:`{count} repository Variable changes`,batchGrantsCount:`{count} additive repository access grants`,batchRetainedSecrets:`Existing Secret bindings retained`,batchResourcesExplanation:`Labels and enabled Issue Types are ensured separately for this target. Existing shared Secret values and other repositories’ access stay unchanged.`,batchReviewFiles:`Inspect proposed files`,batchDeleteFile:`This setup-managed file will be removed from the installation tree; inspect its retained backup.`,batchRepositoryOverrides:`Review repository Variable names`,batchReviewedAccess:`Review additive access`,batchApplyPlans:`Apply ready plans`,batchLeavePreview:`Leave without applying`,batchStopPending:`Stop pending work`,batchStopConfirm:`Stop pending setup work after the current request? Completed PRs, access and other changes will be kept.`,batchRetryPending:`Inspect and retry unfinished work`,batchFinish:`Finish this operation`,batchCleanup:`Delete temporary setup PATs in GitHub after this operation. Keep the bot PAT while repositories still consume its Secret.`,batchTechnical:`Operation details`,batchLookupUnavailable:`GitHub could not confirm that repository. Check its exact name and PAT access.`,batchSelectionInvalid:`Review the selection: choose 1–25 available repositories from this organization.`,batchAccessUnavailable:`Access is unconfirmed. Review the temporary PAT or remove this repository from the selection.`,batchSelectionBody:`Choose 1–25 repositories in {organization}. Only the repositories you select will be configured.`,batchDiscoveryUnavailable:`GitHub could not list repositories. The current repository remains available; find another by its exact name or review PAT access.`,batchDiscoveryTruncated:`This view reached its 1,000-repository limit. Search an exact repository name to add a missing target.`,batchFilter:`Filter visible repositories`,batchSelectedCount:`{count} selected · maximum 25`,batchRepositories:`Repositories`,batchPrivate:`Private`,batchPublic:`Public`,batchCurrent:`Current repository`,batchArchived:`Archived`,batchDisabled:`Disabled`,batchReadOnly:`Write access unavailable`,batchNoMatches:`No visible repositories match this filter.`,batchPrevious:`Previous`,batchNext:`Next`,batchMissingRepository:`Cannot find a repository?`,batchAccessExplanation:`Discovery shows only repositories this PAT can see. An exact-name lookup does not grant access or select the repository automatically. If you replace the temporary PAT, limit it to the repositories you intend to configure.`,batchExactName:`Exact repository name in this organization`,batchFindRepository:`Find repository`,batchChangeAccess:`Change temporary PAT access`,batchReviewSelection:`Review selected repositories`,patStorageRetain:`Keep the existing PAT Secret binding in {destination}. Its value is not requested, copied or replaced. A missing binding requires separate provisioning. Runtime identity and capability verification remain pending.`,patStorageTitle:`Bot PAT storage`,patRepositoryReplace:`Secret PAT already exists in repository {destination}. It will be replaced even when other existing Secrets are preserved.`,patOrganizationReplace:`Secret PAT already exists in organization {destination}. It will be replaced even when other existing Secrets are preserved.`,patRepositoryCreate:`The bot PAT will be stored as Secret PAT in repository {destination}.`,patOrganizationCreate:`The bot PAT will be stored as Secret PAT in organization {destination}.`,patReplacementChecks:`The supplied bot PAT must pass identity, repository access and required permission checks before this Secret is written.`,patOrganizationImpact:`Replacing this organization Secret can affect other repositories that use it. Checks for this repository do not verify their requirements.`,repositorySecretSettings:`Open repository Actions Secrets`,botAccountWarning:`You must open this link with the selected bot account: @{account}.`,botAccountHelp:`Check the GitHub account before generating the PAT. Use a private window or switch accounts if your browser is signed in as the setup operator.`,botGithubForm:`Create bot PAT as @{account}`,language:`Language`,english:`English`,spanish:`Español`,setup:`SETUP`,connecting:`Connecting…`,localSession:`LOCAL SESSION`,progress:`Setup progress`,studio:`SETUP STUDIO`,journey:`YOUR SETUP JOURNEY`,repository:`Repository`,choices:`Setup choices`,setupPat:`Setup PAT`,plan:`Plan`,botPat:`Bot PAT & credentials`,apply:`Apply`,localDesign:`Local by design`,localDesignBody:`This page runs on your computer. GitHub creates both PATs in its own browser tabs.`,preparing:`Preparing your setup…`,completeTitle:`Setup complete.`,previewTitle:`Preview complete.`,cancelledTitle:`Setup cancelled.`,blockedTitle:`Setup needs attention.`,gettingReady:`GETTING READY`,activeLede:`One decision at a time. Your choices shape the permissions, plan and credentials needed for this repository.`,resultLede:`Review the result and next action below. The terminal has additional technical detail.`,readOnly:`Read-only tab`,readOnlyBody:`Another tab controls this session. You can review progress here or explicitly take over.`,takeOver:`Take control in this tab`,attention:`Needs attention`,checked:`Checked`,pleaseNote:`Please note`,progressUpdate:`Progress update`,reviewPass:`Reviewing saved choices — pass {pass}. This is the same setup run, not a restart.`,cancelSetup:`Cancel setup`,cancelConfirm:`Cancel this local setup session? PATs already created in GitHub will still exist.`,footerLocal:`LOCALHOST ONLY`,footerCloud:`NO CLOUD SETUP ACCOUNT`,footerGithub:`GITHUB OWNS PAT ISSUANCE`,currentDecision:`CURRENT DECISION`,session:`SESSION`,continue:`Continue`,previousQuestion:`Previous question`,questionProgress:`Question {current} of {total} in this group · {overall} of {all} overall`,yes:`Yes`,no:`No`,permissionPreview:`PERMISSION PREVIEW`,changeAnswersTitle:`Change your answers`,changeAnswersHelp:`Return to a section without losing other answers. The plan and required PAT grants will be checked again.`,changeSection:`Change {section}`,editCapabilities:`Capabilities`,editRuntimes:`Agent runtimes`,editModels:`Agent models`,editRoleModels:`Per-role models`,editRepository:`Repository behavior`,editDeployment:`Release and hotfix`,editBugbot:`Bugbot`,editApproval:`PR approval`,editProjects:`Projects`,editProvisioning:`Provisioning`,editStorage:`Secrets and Variables`,suggested:`Suggested answer: {answer}. You can review choices again before creating your setup PAT.`,none:`none`,sourceGithub:`Observed from authenticated GitHub repository metadata.`,sourceConfig:`Provided by your configuration; GitHub has not replaced it.`,sourceDefault:`Product default; not verified against this repository.`,sourceLocal:`Observed in this local checkout; confirm this branch exists on GitHub before applying.`,whyMatters:`Why this matters`,whenApplies:`When it applies`,whereConfigured:`Where it is configured`,howToChoose:`How to choose`,whyRecommendation:`Why this matters`,example:`Example`,effect:`What changes`,verify:`How to check`,learnMore:`Read documentation about this setting`,resultApplied:`Your configuration was applied`,resultNoChanges:`No changes were made`,resultStopped:`No setup changes started`,resultPartial:`Check partial changes before retrying`,resultCompleteBody:`The temporary setup PAT is not revoked automatically. Delete it in GitHub after confirming your setup. Keep the bot PAT until you rotate the installed Secret.`,resultPartialBody:`A bot Secret write or another change may have succeeded. Inspect GitHub and run copilot doctor --read-only before replacing or deleting its PAT.`,resultNoChangesBody:`Copilot did not begin applying setup changes. Temporary permission checks may have run; GitHub can retain Actions, Issue or PR history after cleanup. PATs you created still exist until you delete them in GitHub.`,whatHappened:`What happened`,alreadyChanged:`Already changed`,noChanges:`No repository or GitHub setup changes were started in this session.`,nextAction:`Next action`,reasonPermissions:`The setup PAT lacked or could not confirm required permissions.`,nextPermissions:`Check the displayed grants, correct the PAT in GitHub, then start a fresh setup run.`,reasonWorkflowPermissions:`The bot PAT did not complete every required permission check. Check the failed grant and any preparation or cleanup prerequisite below.`,permissionReportTitle:`PAT permission evidence`,permissionReportLead:`Any required grants that could not be confirmed are listed below. Unverifiable does not mean missing.`,updatedSetupPatTitle:`Correct the setup PAT`,updatedSetupPatBody:`This GitHub link includes the required permissions for this setup run. Select this repository before creating the PAT. Close this local session, then start a fresh setup run with the corrected PAT.`,updatedSetupPatGrants:`Additional permissions discovered after inspection`,updatedSetupPatLink:`Create corrected setup PAT`,permissionProbeCleanupPending:`A temporary permission-test resource may still exist. Setup has stopped; do not assume cleanup succeeded.`,permissionProbeCleanupAction:`Retry with a PAT that can remove this resource. The local recovery journal is checked before any new permission tests.`,permissionSecretCollision:`GitHub reported that a Secret at the random test name was updated. A concurrent Secret value may have changed. Setup stopped without deleting it.`,permissionSecretCollisionAction:`Inspect the GitHub Secret audit trail and restore any affected value before retrying. This collision cannot be repaired from the local recovery journal.`,permissionIdentity:`GitHub identity and repository access`,permissionIdentityValid:`Verified`,permissionIdentityInvalid:`Rejected`,permissionIdentityUnknown:`Could not be confirmed`,permissionGrantNotChecked:`Not checked`,permissionReportNoFailedGrant:`No required grant failed this check. Review the intended PAT account and the terminal error before retrying.`,reasonStorage:`The selected GitHub Actions storage could not be used safely.`,nextStorage:`Inspect the Variables/Secrets scope and existing resources, then retry.`,reasonConfiguration:`The chosen configuration could not be validated.`,nextConfiguration:`Review the terminal validation details, correct the choices, and retry.`,reasonExpired:`The local setup session expired.`,nextExpired:`Start a new setup session; the old approval cannot be replayed.`,reasonCancelled:`This setup was cancelled.`,nextCancelled:`Start a new run if you still want to configure this repository.`,reasonUnknown:`Setup stopped. The browser could not determine the exact cause. Review the resource receipt when available and inspect the terminal.`,nextUnknown:`Check the final terminal error before retrying; do not assume a PAT was revoked.`,reasonProvider:`GitHub or another provider did not complete the requested operation.`,nextProvider:`Use the diagnostic reference to inspect the terminal result, check provider availability and access, then retry only after reviewing possible partial changes.`,reasonRateLimit:`GitHub temporarily limited the requests needed for setup.`,nextRateLimit:`Wait for the limit to reset. Inspect any completed changes before starting another setup run.`,diagnosticReference:`Diagnostic reference`,resourceReceipt:`Setup operation receipt`,effectCompleted:`Reported completed`,effectSkipped:`Reported skipped`,effectInspect:`Outcome needs inspection`,effectNotStarted:`Not started`,effectInProgress:`In progress; outcome not yet confirmed`,scopeLocal:`Local checkout`,scopeMixed:`Repository and organization`,receiptFiles:`Setup files`,receiptSecrets:`GitHub Actions Secrets`,receiptLabels:`Issue labels`,receiptIssueTypes:`Issue types`,receiptVariables:`GitHub Actions Variables`,receiptInitialTag:`Initial version tag`,inspectPartial:`Some setup changes may already be active. Inspect GitHub and the terminal result before retrying.`,patSettings:`Open GitHub PAT settings ↗`,closeSession:`Close local session`,sessionClosed:`Local session closed`,sessionClosedBody:`The local server accepted the close request. This page has stopped contacting it and retains the result. Closing the session does not revoke any PAT created in GitHub.`,doctorHelp:`After success, you can verify installed resources here without dispatching Actions. Or run copilot doctor --read-only from the repository root with the temporary setup PAT and the same non-secret --config file, if used.`,doctorRun:`Verify installed setup (read-only)`,doctorRunning:`Checking installed resources without dispatching Actions…`,doctorPassed:`Read-only verification found no failing checks.`,doctorWarnings:`Read-only verification needs attention.`,doctorFailed:`Read-only verification did not finish. Check the terminal or run the command below.`,doctorCounts:`{pass} passed · {warn} warnings · {fail} failed · {skipped} skipped.`,doctorSecretLimit:`Secret values cannot be verified in this mode.`,botRenewal:`The bot PAT stays in the selected GitHub Actions Secret for future runs. Its actual expiry is not verified here; record it in GitHub and rotate the Secret before expiry.`,working:`Working on the next step`,workingBody:`The local process is checking your answers and preparing the next decision. Keep this page open.`,repoFocus:`Repository in focus`,repoFocusBody:`This setup configures the repository below. Organization Secrets and Variables may be shared with other repositories.`,access:`access`,readOnlyCheck:`Capability check`,provisionalGrants:`Provisional least-privilege grants`,conditionalGrants:`Conditional grants depend on the choices and GitHub facts. A final audit runs before setup changes.`,permissionEvidenceVerified:`A GitHub read confirmed this access.`,permissionEvidenceVerifiedWrite:`A temporary resource was created, read, and removed.`,permissionEvidencePrivateProject:`A non-public organization Project confirmed Projects read access.`,permissionEvidenceMissing:`GitHub rejected the required access. Check the PAT settings.`,permissionEvidenceWrite:`The temporary write check did not finish successfully. Review the failed phase and retry.`,permissionEvidencePublic:`The read succeeded, but this public resource does not independently prove the PAT grant.`,permissionEvidencePublicProjects:`The Projects read succeeded, including an empty result. Private Project access is checked when a Project is selected.`,permissionEvidenceUnknownRead:`The read check was inconclusive. Review the terminal detail and retry if needed.`,permissionUnknown:`This permission needs review. Check its exact grant and technical explanation in the terminal before continuing.`,permissionsFollow:`Permissions follow your choices`,permissionsFollowBody:`We’ll show the exact grants before you create each PAT. Nothing is created just by opening this page.`,files:`Files`,workflows:`Workflows`,variables:`Variables`,secretNames:`Secret names`,planBody:`Review exactly what this run may change. Approval first runs temporary PAT write checks, then collects the bot PAT and other credentials. GitHub may retain workflow runs, Issue or PR history, or notifications from those checks.`,planPermissionProbeTitle:`Temporary permission checks after approval`,planPermissionProbeBody:`Each listed permission creates, reads and removes its own temporary resource. The Issues check creates a visible Issue; if GitHub denies deletion, setup closes it, reports its number and stops. Actions, Issues and Pull requests may leave history or notifications.`,planActionsProbePrerequisites:`The Actions check needs Contents Write to create its isolated branch. If the exact packaged health workflow is unavailable on the default branch, it also needs Workflows Write to prepare a disabled-job override. For the bot check, the setup PAT prepares and cleans the fixture; the bot PAT dispatches and reads its run. A blocked prerequisite does not prove Actions is missing.`,planSecretProbeLimit:`GitHub only offers an upsert for Secrets. The check uses a private random name and confirms it is absent first, but GitHub cannot guarantee atomic create-only behavior. If it reports an update, setup stops and asks you to inspect the Secret audit trail.`,planChoices:`Your key decisions`,planEnabledCapabilities:`Enabled capabilities`,planBranchRoles:`Production / development branch`,planApprovalMode:`Pull-request approval`,planVariableScope:`Variables scope`,planSecretScope:`Secrets scope`,planInitialTag:`Create initial tag`,planAgentRouting:`Agent and model for each task`,planIssueWorkflows:`Issue workflows`,planTrustedChecks:`Trusted CI producers`,planCoverage:`Coverage evidence`,planProjectStatuses:`Project Status transitions`,planIssueResources:`Issue labels and issue types`,planIssueResourcesValue:`Checked or provisioned during Apply`,planProducerAttested:`CI identity and enforcing step verified by you`,planCoverageThreshold:`Minimum changed-line coverage`,planCoverageReporter:`Artifact-publishing workflow`,planReporterAttested:`Coverage reporter verified by you`,planAdvancedDefaults:`The plan also includes defaults for settings you did not change. Use Change below to inspect any section before approving.`,planUnknownWarning:`An additional plan warning could not be displayed here. Read the terminal warning before approving.`,planBasicDefaultsIntro:`Basic setup retained these advanced defaults. Open a section below to review or change them:`,scopeRepository:`Repository`,scopeOrganization:`Organization`,scopeDisabled:`Not provisioned`,approvalOff:`Off`,approvalRecommend:`Recommendation only`,approvalGuarded:`Guarded approval`,beforeContinue:`Before you continue`,stopHere:`Stop here`,approvePlan:`Approve this plan`,githubLink:`Open GitHub link ↗`,githubForm:`Open the official GitHub PAT form`,githubFormHelp:`Check the signed-in account, select Only select repositories, then select this repository. GitHub handles 2FA and creates the PAT.`,pasteHere:`Paste the value here`,yourAnswer:`Your answer`,hiddenAfter:`Hidden after submission`,typeAnswer:`Type your answer`,secretHelp:`Sent only to this local process. It will not be shown again or saved in browser storage.`,pairTitle:`Pair this browser`,pairLabel:`Pairing code from terminal`,pairPlaceholder:`16 hexadecimal characters`,pairBody:`Find the 16-character pairing code in the terminal that started copilot setup --web. Enter it here to view or control this setup. The code is never placed in the browser URL or stored after this page closes.`,pairHelp:`Keep the code private. After refreshing this page, enter it again to reconnect.`,pairButton:`Connect to local setup`,privateSession:`PRIVATE LOCAL SESSION`,theme:`Color theme`,themeAuto:`Auto`,themeSystem:`Follow system theme`,themeLight:`Light theme`,themeDark:`Dark theme`,selectOne:`Select one`,ciRun:`Open CI run on GitHub ↗`,manualCheck:`Check not listed? Enter exact name|App ID|workflow, separated by semicolons.`,checksObserved:`Recent CI jobs were found. Open each run and verify the exact job, App and enforcing coverage step before trusting it.`,checksNoRecent:`No recent pull-request workflow runs were found. Run your normal CI on a real pull request, or enter an exact producer manually.`,checksNoVerifiable:`Recent runs exist, but no job could be linked to an exact Check Run and App identity. Inspect GitHub or enter an exact producer manually.`,checksDenied:`GitHub did not allow CI discovery. Give the setup PAT Actions: read and Checks: read, or enter an exact producer manually.`,checksUnavailable:`GitHub CI discovery could not complete. This is not evidence that the repository has no checks. Retry setup or enter an exact producer manually.`,projectsObserved:`These existing Projects belong to the repository owner. Select only Projects this automation should update.`,projectsEmpty:`This bounded GitHub query returned no open, accessible organization Projects; it does not prove none exist. Check access or enter a verified Project number.`,projectsDenied:`GitHub did not allow Project discovery. Check organization Projects: read on the setup PAT, or enter Project numbers manually.`,projectsUnavailable:`GitHub Project discovery could not complete. This is not evidence that no Projects exist. Enter a verified Project number manually or retry.`,projectsUnsupported:`GitHub does not support listing personal Projects with a fine-grained PAT through this endpoint. Enter an existing Project number from its URL.`,discoveryTruncated:`Only a bounded sample of accessible Projects or recent checks was inspected. Use manual entry for an item not shown.`,checksDiscoveryScope:`Search scope: select up to 20 PR runs from the latest 1,000 workflow runs (up to 10 pages) within 90 days; at most 15 runs and 100 checks per commit are inspected.`,projectsDiscoveryScope:`Search scope: at most 30 open, accessible organization Projects from two pages; up to 100 fields are inspected per Project. Closed Projects are excluded.`,retryDiscovery:`Retry GitHub discovery`,retryRemaining:`{count} read-only retries left. Your answers stay here.`,retryExhausted:`No discovery retries remain. Inspect GitHub and use the manual option if the item is missing.`,observationTimeUnknown:`observation time unavailable`,branchRequirementUnknown:`Required by branch rule: not checked`,branchRequirementObserved:`Required on {branch} by an active ruleset for this exact check and App.`,ciRule:`Open required-check ruleset ↗`,projectSharedStatus:`All selected Projects must share each chosen Status value. This setup cannot assign a different Status vocabulary per Project.`,fixedWorkflowEnabled:`Your configuration fixes features.{kind}=true. Keep {kind} selected; edit --config or flags to change this.`,fixedWorkflowDisabled:`Your configuration fixes features.{kind}=false. Leave {kind} unselected; edit --config or flags to change this.`,fixedIssuesRequired:`Your configuration explicitly enables release or hotfix automation. Keep Issues enabled, or change --config or flags first.`,projectSelectionNotObserved:`Previously selected Project numbers are retained, but no longer appear in this GitHub result. Verify each in GitHub or remove it.`,removeSelection:`Remove selection`,projectTransitionIssueCreated:`New issue`,projectTransitionPullRequestCreated:`New pull request`,projectTransitionIssueInProgress:`Issue in progress`,projectTransitionPullRequestInProgress:`Pull request in progress`,projectUrl:`Open Project on GitHub ↗`,projectManual:`Project not listed? Enter its positive number or exact GitHub URL. PVT_ IDs are not accepted.`,projectStatusUnavailable:`Status options could not be verified for every selected Project. Enter the exact existing Status value after checking each Project in GitHub.`,projectStatusIncompatible:`Selected Projects have no shared Status values. Choose compatible Projects before continuing.`,producerName:`Check/job name`,producerAppId:`Source GitHub App ID`,producerWorkflow:`Workflow name`,producerAdd:`Add exact check`,producerRemove:`Remove check`,producerManualHelp:`Use the exact identity shown on GitHub. Adding it does not attest that it enforces coverage.`,producerManualInvalid:`Enter a check name, positive numeric App ID and workflow name. Do not use | or ; in names. Commas are allowed.`,translationPreviewTitle:`Translation review in progress`,translationPreviewBody:`First-party setup questions are translated. Some dynamic GitHub or provider diagnostics may still appear in English while localization review finishes. Changing language does not change your answers.`,unknownLocalError:`An unexpected local setup error occurred. Check the terminal for details, then refresh or restart setup.`},Wi={batchNextActions:`Siguientes pasos`,batchStatusReady:`Listo para revisar`,batchStatusBlocked:`Requiere una acción`,batchStatusApplying:`Aplicando el plan revisado`,batchStatusPartial:`Aplicado parcialmente; revisa antes de reintentar`,batchStatusWaiting:`PR creada · pendiente de merge por un mantenedor`,batchStatusPending:`Configuración aplicada · verificación pendiente`,batchStatusUnchanged:`Ya coincide · sin cambios`,batchStatusCancelled:`Trabajo pendiente detenido; se conservan los cambios completados`,batchConfigurationPreview:`Vista previa de la configuración. Se añadirá a la revisión del lote. Las pruebas de permisos y la instalación esperan a que apruebes el lote completo.`,batchUseConfiguration:`Usar esta configuración`,planReuseBody:`Aprueba las pruebas temporales de permisos indicadas y después se aplicará el setup revisado. Los valores de los Secrets existentes se conservan y no se solicitan ni se sustituyen. La verificación de permisos en ejecución puede quedar pendiente.`,organizationReuseTitle:`Reutilización de la configuración existente`,organizationReuseBody:`{imported} ajustes compatibles importados. Se conservan {shared} Variables de organización y {overrides} del repositorio; se escriben {writes} Variables en el repositorio. Los valores compartidos y los Secrets existentes se conservan.`,batchBranchReview:`Rama de instalación y base revisada`,batchFocusTitle:`Repositorios seleccionados`,batchFocusBody:`{count} repositorios seleccionados explícitamente en esta organización. Revisa cada destino por separado.`,batchReviewTitle:`Revisa los planes de setup`,batchProgressTitle:`Aplicando los planes por repositorio`,batchResultTitle:`Resultados del setup por repositorio`,batchProgressBody:`Se aplican los planes aprobados por orden. Detener pausa el trabajo pendiente después de la petición actual; los cambios y las PRs completadas se conservan.`,batchReviewBody:`Aprueba solo los planes listos que aparecen abajo. El setup avanza por orden, añade el acceso revisado sin sustituir valores compartidos y crea una PR por cada repositorio con cambios. No hace merge, crea tags, publica versiones ni despliega.`,batchResultBody:`Una PR de setup todavía necesita revisión y merge por un mantenedor. La verificación de credenciales y permisos en ejecución puede quedar pendiente. Las PRs y los accesos completados se conservan si otro destino se detiene.`,batchStopping:`Deteniendo el trabajo pendiente tras la petición actual. Los cambios completados se conservarán.`,batchReasonDrift:`La base revisada o su titularidad han cambiado. Inspecciona el repositorio y revisa un plan nuevo.`,batchReasonProvider:`GitHub no ha confirmado el último paso. El reintento inspecciona lo existente antes de continuar.`,batchCleanupPending:`No se pudo confirmar la limpieza de la comprobación de permisos. El trabajo pendiente está detenido. Revisa el historial de GitHub y el registro local de recuperación; resuelve la limpieza antes de iniciar un setup nuevo. Esta operación no puede reanudar escrituras.`,batchReasonCancelled:`El trabajo pendiente se detuvo. Se conservaron los cambios completados.`,batchReasonPreflight:`Revisa el acceso, los secretos requeridos y los ajustes específicos del repositorio antes de continuar.`,batchOpenPull:`Abrir PR de setup`,batchFilesCount:`{count} archivos con cambios`,batchVariablesCount:`{count} cambios en Variables del repositorio`,batchGrantsCount:`{count} accesos que se añadirán para este repositorio`,batchRetainedSecrets:`Secrets existentes que se conservan`,batchResourcesExplanation:`Los labels y los Issue Types habilitados se preparan por separado para este destino. Se conservan los valores de los Secrets compartidos y el acceso de los demás repositorios.`,batchReviewFiles:`Inspeccionar archivos propuestos`,batchDeleteFile:`Este archivo gestionado por el setup se retirará del árbol de instalación; inspecciona la copia conservada.`,batchRepositoryOverrides:`Revisar nombres de Variables del repositorio`,batchReviewedAccess:`Revisar accesos que se añadirán`,batchApplyPlans:`Aplicar planes listos`,batchLeavePreview:`Salir sin aplicar`,batchStopPending:`Detener trabajo pendiente`,batchStopConfirm:`¿Detener el trabajo pendiente tras la petición actual? Se conservarán las PRs, los accesos y los cambios completados.`,batchRetryPending:`Inspeccionar y reintentar lo pendiente`,batchFinish:`Finalizar esta operación`,batchCleanup:`Elimina los PATs temporales de setup en GitHub al terminar. Conserva el PAT del bot mientras los repositorios consuman su Secret.`,batchTechnical:`Detalles de la operación`,batchLookupUnavailable:`GitHub no ha podido confirmar ese repositorio. Revisa el nombre exacto y el acceso del PAT.`,batchSelectionInvalid:`Revisa la selección: elige entre 1 y 25 repositorios disponibles de esta organización.`,batchAccessUnavailable:`El acceso no está confirmado. Revisa el PAT temporal o quita este repositorio de la selección.`,batchSelectionBody:`Elige entre 1 y 25 repositorios de {organization}. Solo se configurarán los que selecciones.`,batchDiscoveryUnavailable:`GitHub no ha podido listar los repositorios. Puedes seleccionar el actual, buscar otro por su nombre exacto o revisar el acceso del PAT.`,batchDiscoveryTruncated:`Esta vista ha alcanzado el límite de 1.000 repositorios. Busca por nombre exacto para añadir uno que falte.`,batchFilter:`Filtrar repositorios visibles`,batchSelectedCount:`{count} seleccionados · máximo 25`,batchRepositories:`Repositorios`,batchPrivate:`Privado`,batchPublic:`Público`,batchCurrent:`Repositorio actual`,batchArchived:`Archivado`,batchDisabled:`Deshabilitado`,batchReadOnly:`Sin acceso de escritura`,batchNoMatches:`Ningún repositorio visible coincide con el filtro.`,batchPrevious:`Anterior`,batchNext:`Siguiente`,batchMissingRepository:`¿No encuentras un repositorio?`,batchAccessExplanation:`La lista solo muestra los repositorios visibles para este PAT. Buscar por nombre exacto no concede acceso ni selecciona el repositorio automáticamente. Si sustituyes el PAT temporal, limítalo a los repositorios que quieras configurar.`,batchExactName:`Nombre exacto del repositorio en esta organización`,batchFindRepository:`Buscar repositorio`,batchChangeAccess:`Cambiar acceso del PAT temporal`,batchReviewSelection:`Revisar repositorios seleccionados`,patStorageRetain:`Se conserva el Secret PAT existente en {destination}. No se pide, copia ni sustituye su valor. Si falta, debe crearse por separado. La verificación de la identidad y los permisos en ejecución queda pendiente.`,patStorageTitle:`Almacenamiento del PAT del bot`,patRepositoryReplace:`El Secret PAT ya existe en el repositorio {destination}. Se sustituirá aunque hayas elegido preservar los demás Secrets existentes.`,patOrganizationReplace:`El Secret PAT ya existe en la organización {destination}. Se sustituirá aunque hayas elegido preservar los demás Secrets existentes.`,patRepositoryCreate:`El PAT del bot se guardará como Secret PAT en el repositorio {destination}.`,patOrganizationCreate:`El PAT del bot se guardará como Secret PAT en la organización {destination}.`,patReplacementChecks:`El PAT del bot que introduzcas debe superar las comprobaciones de identidad, acceso al repositorio y permisos necesarios antes de escribir este Secret.`,patOrganizationImpact:`Sustituir este Secret de organización puede afectar a otros repositorios que lo utilizan. Las comprobaciones para este repositorio no verifican los requisitos de los demás.`,repositorySecretSettings:`Abrir los Secrets de Actions del repositorio`,botAccountWarning:`Debes abrir este enlace con la cuenta de bot seleccionada: @{account}.`,botAccountHelp:`Comprueba la cuenta de GitHub antes de generar el PAT. Usa una ventana privada o cambia de cuenta si el navegador tiene la sesión del operador del setup.`,botGithubForm:`Crear PAT del bot como @{account}`,language:`Idioma`,english:`English`,spanish:`Español`,setup:`CONFIGURACIÓN`,connecting:`Conectando…`,localSession:`SESIÓN LOCAL`,progress:`Progreso de la configuración`,studio:`ASISTENTE DE CONFIGURACIÓN`,journey:`TU RECORRIDO`,repository:`Repositorio`,choices:`Opciones de configuración`,setupPat:`PAT de configuración`,plan:`Plan`,botPat:`PAT del bot y credenciales`,apply:`Aplicar`,localDesign:`Local por diseño`,localDesignBody:`Esta página se ejecuta en tu ordenador. GitHub crea ambos PAT en sus propias pestañas.`,preparing:`Preparando la configuración…`,completeTitle:`Configuración completada.`,previewTitle:`Vista previa completada.`,cancelledTitle:`Configuración cancelada.`,blockedTitle:`La configuración necesita atención.`,gettingReady:`PREPARANDO`,activeLede:`Una decisión cada vez. Tus elecciones determinan los permisos, el plan y las credenciales que necesita este repositorio.`,resultLede:`Revisa abajo el resultado y el siguiente paso. La terminal contiene más detalles técnicos.`,readOnly:`Pestaña de solo lectura`,readOnlyBody:`Otra pestaña controla esta sesión. Puedes ver el progreso aquí o tomar el control explícitamente.`,takeOver:`Tomar el control en esta pestaña`,attention:`Necesita atención`,checked:`Comprobado`,pleaseNote:`Ten en cuenta`,progressUpdate:`Actualización de progreso`,reviewPass:`Revisando las opciones guardadas — pasada {pass}. Es la misma ejecución, no un reinicio.`,cancelSetup:`Cancelar configuración`,cancelConfirm:`¿Cancelar esta sesión local? Los PAT ya creados en GitHub seguirán existiendo.`,footerLocal:`SOLO LOCALHOST`,footerCloud:`SIN CUENTA DE CONFIGURACIÓN EN LA NUBE`,footerGithub:`GITHUB EMITE LOS PAT`,currentDecision:`DECISIÓN ACTUAL`,session:`SESIÓN`,continue:`Continuar`,previousQuestion:`Pregunta anterior`,questionProgress:`Pregunta {current} de {total} en este grupo · {overall} de {all} en total`,yes:`Sí`,no:`No`,permissionPreview:`VISTA PREVIA DE PERMISOS`,changeAnswersTitle:`Cambiar respuestas`,changeAnswersHelp:`Vuelve a una sección sin perder las demás respuestas. Se comprobarán de nuevo el plan y los permisos necesarios del PAT.`,changeSection:`Cambiar {section}`,editCapabilities:`Funciones`,editRuntimes:`Agentes`,editModels:`Modelos de agentes`,editRoleModels:`Modelos por tarea`,editRepository:`Comportamiento del repositorio`,editDeployment:`Releases y hotfixes`,editBugbot:`Bugbot`,editApproval:`Aprobación de PR`,editProjects:`Projects`,editProvisioning:`Aprovisionamiento`,editStorage:`Secrets y Variables`,suggested:`Respuesta sugerida: {answer}. Podrás revisar las opciones antes de crear el PAT de configuración.`,none:`ninguna`,sourceGithub:`Consultado en los metadatos autenticados de este repositorio en GitHub.`,sourceConfig:`Valor de tu configuración; GitHub no lo ha sustituido.`,sourceDefault:`Valor predeterminado del producto; no verificado en este repositorio.`,sourceLocal:`Observado en este checkout local; confirma que la rama existe en GitHub antes de aplicar cambios.`,whyMatters:`Por qué importa`,whenApplies:`Cuándo se aplica`,whereConfigured:`Dónde se configura`,howToChoose:`Cómo elegir`,whyRecommendation:`Por qué importa`,example:`Ejemplo`,effect:`Qué cambia`,verify:`Cómo comprobarlo`,learnMore:`Leer documentación de esta opción`,resultApplied:`Tu configuración se ha aplicado`,resultNoChanges:`No se hicieron cambios`,resultStopped:`No se empezó a aplicar la configuración`,resultPartial:`Revisa los cambios parciales antes de reintentar`,resultCompleteBody:`El PAT temporal de configuración no se revoca automáticamente. Elimínalo en GitHub tras comprobar el resultado. Conserva el PAT del bot hasta que rotes el Secret instalado.`,resultPartialBody:`Puede haberse escrito el Secret del bot u otro recurso. Revisa GitHub y ejecuta copilot doctor --read-only antes de reemplazar o eliminar ese PAT.`,resultNoChangesBody:`Copilot no empezó a aplicar cambios de configuración. Puede haber ejecutado pruebas temporales de permisos; GitHub puede conservar historial de Actions, Issues o PR después de limpiarlas. Los PAT creados siguen allí hasta que los elimines.`,whatHappened:`Qué ha pasado`,alreadyChanged:`Qué ha cambiado`,noChanges:`No se iniciaron cambios de configuración en el repositorio ni en GitHub durante esta sesión.`,nextAction:`Siguiente paso`,reasonPermissions:`Faltan permisos del PAT de configuración o no pudieron confirmarse.`,nextPermissions:`Comprueba los permisos mostrados, corrige el PAT en GitHub e inicia una nueva sesión.`,reasonWorkflowPermissions:`El PAT del bot no completó todas las comprobaciones de permisos. Revisa el permiso fallido y los requisitos de preparación o limpieza indicados abajo.`,permissionReportTitle:`Comprobación de permisos del PAT`,permissionReportLead:`Se muestran los permisos obligatorios que no pudieron confirmarse. «No verificable» no significa «ausente».`,updatedSetupPatTitle:`Corrige el PAT de configuración`,updatedSetupPatBody:`Este enlace de GitHub incluye los permisos necesarios para esta configuración. Selecciona este repositorio antes de crear el PAT. Cierra esta sesión local e inicia una nueva configuración con el PAT corregido.`,updatedSetupPatGrants:`Permisos adicionales detectados tras la inspección`,updatedSetupPatLink:`Crear PAT de configuración corregido`,permissionProbeCleanupPending:`Puede quedar un recurso temporal de comprobación de permisos. El setup se ha detenido; no supongas que se eliminó.`,permissionProbeCleanupAction:`Reintenta con un PAT capaz de eliminarlo. Se revisa el registro local de recuperación antes de nuevas pruebas.`,permissionSecretCollision:`GitHub indicó que se actualizó un Secret con el nombre aleatorio de prueba. Es posible que haya cambiado un valor creado a la vez. El setup se detuvo sin eliminarlo.`,permissionSecretCollisionAction:`Revisa el historial de Secrets de GitHub y restaura cualquier valor afectado antes de reintentar. El registro local de recuperación no puede reparar esta colisión.`,permissionIdentity:`Identidad de GitHub y acceso al repositorio`,permissionIdentityValid:`Verificados`,permissionIdentityInvalid:`Rechazados`,permissionIdentityUnknown:`No se pudieron confirmar`,permissionGrantNotChecked:`Sin comprobar`,permissionReportNoFailedGrant:`La comprobación no detectó un permiso obligatorio fallido. Revisa la cuenta prevista para el PAT y el error de la terminal antes de reintentarlo.`,reasonStorage:`No se pudo usar de forma segura el almacenamiento elegido de GitHub Actions.`,nextStorage:`Revisa el ámbito de Variables/Secrets y los recursos existentes; después, reinténtalo.`,reasonConfiguration:`No se pudo validar la configuración elegida.`,nextConfiguration:`Revisa el detalle de validación en la terminal, corrige las opciones y reinténtalo.`,reasonExpired:`La sesión local caducó.`,nextExpired:`Inicia una sesión nueva; la aprobación anterior no puede reutilizarse.`,reasonCancelled:`La sesión se canceló.`,nextCancelled:`Inicia una nueva ejecución si todavía quieres configurar este repositorio.`,reasonUnknown:`La configuración se detuvo. El navegador no pudo determinar la causa exacta. Revisa el recibo de recursos, si está disponible, y consulta la terminal.`,nextUnknown:`Consulta el último error de la terminal antes de reintentar; no supongas que se revocó ningún PAT.`,reasonProvider:`GitHub u otro proveedor no completó la operación solicitada.`,nextProvider:`Usa la referencia de diagnóstico para consultar la terminal, comprueba la disponibilidad y el acceso al proveedor y revisa posibles cambios parciales antes de reintentar.`,reasonRateLimit:`GitHub ha limitado temporalmente las solicitudes necesarias para la configuración.`,nextRateLimit:`Espera a que se restablezca el límite. Inspecciona los cambios completados antes de iniciar otra configuración.`,diagnosticReference:`Referencia de diagnóstico`,resourceReceipt:`Registro de operaciones de configuración`,effectCompleted:`Marcada como completada`,effectSkipped:`Marcada como omitida`,effectInspect:`Resultado pendiente de inspección`,effectNotStarted:`No iniciada`,effectInProgress:`En curso; resultado aún sin confirmar`,scopeLocal:`Checkout local`,scopeMixed:`Repositorio y organización`,receiptFiles:`Archivos de configuración`,receiptSecrets:`Secrets de GitHub Actions`,receiptLabels:`Etiquetas de issues`,receiptIssueTypes:`Tipos de issue`,receiptVariables:`Variables de GitHub Actions`,receiptInitialTag:`Etiqueta de versión inicial`,inspectPartial:`Algunos cambios podrían estar activos. Revisa GitHub y el resultado de la terminal antes de reintentar.`,patSettings:`Abrir ajustes de PAT en GitHub ↗`,closeSession:`Cerrar sesión local`,sessionClosed:`Sesión local cerrada`,sessionClosedBody:`El servidor local aceptó la solicitud de cierre. Esta página deja de consultarlo y conserva el resultado. Cerrar la sesión no revoca ningún PAT creado en GitHub.`,doctorHelp:`Tras completar el setup, puedes comprobar aquí los recursos instalados sin lanzar Actions. También puedes ejecutar copilot doctor --read-only desde la raíz del repositorio con el PAT temporal y el mismo archivo --config no secreto, si lo usaste.`,doctorRun:`Comprobar instalación (solo lectura)`,doctorRunning:`Comprobando los recursos instalados sin lanzar Actions…`,doctorPassed:`La comprobación de solo lectura no encontró fallos.`,doctorWarnings:`La comprobación de solo lectura requiere atención.`,doctorFailed:`La comprobación de solo lectura no terminó. Revisa la terminal o ejecuta el comando indicado abajo.`,doctorCounts:`{pass} correctas · {warn} avisos · {fail} fallos · {skipped} omitidas.`,doctorSecretLimit:`Este modo no puede verificar los valores de Secrets.`,botRenewal:`El PAT del bot permanece en el Secret de GitHub Actions seleccionado para futuras ejecuciones. Su fecha real de caducidad no se verifica aquí; anótala en GitHub y rota el Secret antes de que venza.`,working:`Preparando el siguiente paso`,workingBody:`El proceso local comprueba tus respuestas y prepara la siguiente decisión. Mantén esta página abierta.`,repoFocus:`Repositorio seleccionado`,repoFocusBody:`Este setup configura el repositorio indicado. Los Secrets y Variables de organización pueden compartirse con otros repositorios.`,access:`acceso`,readOnlyCheck:`Comprobación de capacidades`,provisionalGrants:`Permisos provisionales de mínimo privilegio`,conditionalGrants:`Los permisos condicionales dependen de tus elecciones y de GitHub. Se hará una auditoría final antes de cualquier cambio.`,permissionEvidenceVerified:`Una lectura de GitHub confirmó este acceso.`,permissionEvidenceVerifiedWrite:`Se creó, leyó y eliminó un recurso temporal.`,permissionEvidencePrivateProject:`Un Project no público de la organización confirmó el acceso de lectura a Projects.`,permissionEvidenceMissing:`GitHub rechazó el acceso necesario. Comprueba los ajustes del PAT.`,permissionEvidenceWrite:`La comprobación temporal de escritura no terminó correctamente. Revisa la fase fallida y vuelve a intentarlo.`,permissionEvidencePublic:`La lectura funcionó, pero este recurso público no demuestra por sí solo el permiso del PAT.`,permissionEvidencePublicProjects:`La lectura de Projects funcionó, incluso si devolvió una lista vacía. El acceso a Projects privados se comprueba al seleccionarlos.`,permissionEvidenceUnknownRead:`La consulta de lectura no fue concluyente. Revisa el detalle en la terminal y reintenta si hace falta.`,permissionUnknown:`Este permiso requiere revisión. Comprueba en la terminal el permiso exacto y su explicación técnica antes de continuar.`,permissionsFollow:`Los permisos dependen de tus elecciones`,permissionsFollowBody:`Mostraremos los permisos exactos antes de crear cada PAT. Abrir esta página no crea nada.`,files:`Archivos`,workflows:`Workflows`,variables:`Variables`,secretNames:`Nombres de Secrets`,planBody:`Revisa exactamente lo que podría cambiar. Al aprobar, se prueban los permisos de escritura del PAT con recursos temporales; después se pedirán el PAT del bot y otras credenciales. GitHub puede conservar ejecuciones, historial de Issues o PR y notificaciones de esas pruebas.`,planPermissionProbeTitle:`Pruebas temporales de permisos tras aprobar`,planPermissionProbeBody:`Cada permiso indicado crea, lee y elimina su propio recurso temporal. La prueba de Issues crea un Issue visible; si GitHub impide borrarlo, el setup lo cierra, informa de su número y se detiene. Actions, Issues y Pull requests pueden dejar historial o notificaciones.`,planActionsProbePrerequisites:`La prueba de Actions necesita Contents Write para crear su rama aislada. Si el workflow de salud empaquetado exacto no está disponible en la rama predeterminada, también necesita Workflows Write para preparar una versión con los jobs desactivados. Al comprobar el bot, el PAT de setup prepara y limpia el recurso; el PAT del bot lanza y lee su ejecución. Un requisito bloqueado no demuestra que falte Actions.`,planSecretProbeLimit:`GitHub solo permite crear o actualizar Secrets con la misma operación. La prueba usa un nombre aleatorio privado y comprueba antes que no exista, pero GitHub no garantiza una creación atómica. Si informa de una actualización, el setup se detiene y te pide revisar el historial del Secret.`,planChoices:`Tus decisiones principales`,planEnabledCapabilities:`Funciones activadas`,planBranchRoles:`Rama de producción / desarrollo`,planApprovalMode:`Aprobación de pull requests`,planVariableScope:`Ámbito de Variables`,planSecretScope:`Ámbito de Secrets`,planInitialTag:`Crear etiqueta inicial`,planAgentRouting:`Agente y modelo por tarea`,planIssueWorkflows:`Flujos de issues`,planTrustedChecks:`Productores de CI fiables`,planCoverage:`Prueba de cobertura`,planProjectStatuses:`Transiciones de Status en Projects`,planIssueResources:`Etiquetas y tipos de issue`,planIssueResourcesValue:`Se comprobarán o crearán al aplicar`,planProducerAttested:`Identidad de CI y paso obligatorio comprobados por ti`,planCoverageThreshold:`Cobertura mínima de líneas modificadas`,planCoverageReporter:`Workflow que publica el artefacto`,planReporterAttested:`Generador de cobertura comprobado por ti`,planAdvancedDefaults:`El plan también incluye valores predeterminados de ajustes que no cambiaste. Usa Cambiar más abajo para revisar cualquier sección antes de aprobar.`,planUnknownWarning:`Hay un aviso adicional del plan que no se puede mostrar aquí. Léelo en la terminal antes de aprobar.`,planBasicDefaultsIntro:`El modo básico conservó estos ajustes avanzados. Abre una sección más abajo para revisarlos o cambiarlos:`,scopeRepository:`Repositorio`,scopeOrganization:`Organización`,scopeDisabled:`Sin aprovisionar`,approvalOff:`Desactivada`,approvalRecommend:`Solo recomendaciones`,approvalGuarded:`Aprobación protegida`,beforeContinue:`Antes de continuar`,stopHere:`Detener aquí`,approvePlan:`Aprobar este plan`,githubLink:`Abrir enlace de GitHub ↗`,githubForm:`Abrir el formulario oficial de PAT de GitHub`,githubFormHelp:`Comprueba la cuenta activa, elige Only select repositories y selecciona este repositorio. GitHub gestiona el 2FA y crea el PAT.`,pasteHere:`Pega aquí el valor`,yourAnswer:`Tu respuesta`,hiddenAfter:`Oculto tras enviarlo`,typeAnswer:`Escribe tu respuesta`,secretHelp:`Se envía solo a este proceso local. No volverá a mostrarse ni se guardará en el almacenamiento del navegador.`,pairTitle:`Vincula este navegador`,pairLabel:`Código de vinculación de la terminal`,pairPlaceholder:`16 caracteres hexadecimales`,pairBody:`Busca el código de 16 caracteres en la terminal donde ejecutaste copilot setup --web. Introdúcelo para ver o controlar la sesión. No aparece en la URL ni se almacena al cerrar la página.`,pairHelp:`Mantén el código en privado. Tras actualizar la página, introdúcelo de nuevo para reconectar.`,pairButton:`Conectar a la configuración local`,privateSession:`SESIÓN LOCAL PRIVADA`,theme:`Tema de color`,themeAuto:`Sistema`,themeSystem:`Seguir tema del sistema`,themeLight:`Tema claro`,themeDark:`Tema oscuro`,selectOne:`Selecciona una opción`,ciRun:`Abrir ejecución de CI en GitHub ↗`,manualCheck:`¿No aparece el check? Introduce nombre|ID de App|workflow exactos, separados por punto y coma.`,checksObserved:`Se encontraron jobs recientes de CI. Abre cada ejecución y comprueba el job, la App y el paso obligatorio de cobertura antes de confiar en él.`,checksNoRecent:`No hay ejecuciones recientes de workflows de pull request. Ejecuta tu CI habitual en un PR real o introduce manualmente un productor exacto.`,checksNoVerifiable:`Hay ejecuciones recientes, pero ningún job pudo vincularse a un Check Run y una App concretos. Revisa GitHub o introduce el productor manualmente.`,checksDenied:`GitHub no permitió consultar los checks. Concede Actions: read y Checks: read al PAT de configuración, o introduce el productor manualmente.`,checksUnavailable:`No se pudo completar la consulta de CI. Esto no significa que el repositorio no tenga checks. Reintenta o introduce el productor manualmente.`,projectsObserved:`Estos Projects existentes pertenecen al dueño del repositorio. Selecciona solo los que deba actualizar la automatización.`,projectsEmpty:`Esta consulta limitada no devolvió Projects abiertos y accesibles; eso no demuestra que no existan. Comprueba el acceso o introduce un número verificado.`,projectsDenied:`GitHub no permitió consultar Projects. Comprueba Projects: read de la organización en el PAT o introduce los números manualmente.`,projectsUnavailable:`No se pudo consultar Projects. Eso no demuestra que no existan. Introduce un número verificado o reintenta.`,projectsUnsupported:`GitHub no permite listar Projects personales con un PAT de permisos precisos mediante esta API. Introduce el número de la URL de un Project existente.`,discoveryTruncated:`Solo se inspeccionó una muestra limitada de Projects accesibles o checks recientes. Usa la entrada manual si falta uno.`,checksDiscoveryScope:`Alcance: hasta 20 ejecuciones de PR entre las últimas 1.000 ejecuciones de workflows (hasta 10 páginas) de los últimos 90 días; se inspeccionan como máximo 15 ejecuciones y 100 checks por commit.`,projectsDiscoveryScope:`Alcance: hasta 30 Projects abiertos y accesibles de la organización en dos páginas; se inspeccionan hasta 100 campos por Project. Se excluyen los Projects cerrados.`,retryDiscovery:`Reintentar búsqueda en GitHub`,retryRemaining:`Quedan {count} reintentos de solo lectura. Tus respuestas se conservan.`,retryExhausted:`No quedan reintentos. Consulta GitHub e introduce manualmente lo que falte.`,observationTimeUnknown:`fecha de observación no disponible`,branchRequirementUnknown:`Obligatorio según la regla de rama: no comprobado`,branchRequirementObserved:`Obligatorio en {branch} por un ruleset activo para este check y esta App exactos.`,ciRule:`Abrir ruleset del check obligatorio ↗`,projectSharedStatus:`Todos los Projects elegidos deben compartir cada valor Status. Este setup no asigna valores diferentes por Project.`,fixedWorkflowEnabled:`Tu configuración fija features.{kind}=true. Mantén {kind} seleccionado; cambia --config o los flags si quieres modificarlo.`,fixedWorkflowDisabled:`Tu configuración fija features.{kind}=false. Deja {kind} sin seleccionar; cambia --config o los flags si quieres modificarlo.`,fixedIssuesRequired:`Tu configuración activa expresamente release o hotfix. Mantén Issues activado o cambia antes --config o los flags.`,projectSelectionNotObserved:`Se conservan los números de Project elegidos antes, aunque ya no figuren en esta consulta. Compruébalos en GitHub o quítalos.`,removeSelection:`Quitar selección`,projectTransitionIssueCreated:`Issue nuevo`,projectTransitionPullRequestCreated:`Pull request nuevo`,projectTransitionIssueInProgress:`Issue en curso`,projectTransitionPullRequestInProgress:`Pull request en curso`,projectUrl:`Abrir Project en GitHub ↗`,projectManual:`¿Falta un Project? Introduce su número positivo o URL exacta de GitHub. No se aceptan IDs PVT_.`,projectStatusUnavailable:`No se pudieron verificar las opciones Status de todos los Projects elegidos. Comprueba cada Project en GitHub e introduce el valor exacto.`,projectStatusIncompatible:`Los Projects elegidos no comparten valores Status. Elige Projects compatibles antes de continuar.`,producerName:`Nombre del check/job`,producerAppId:`ID de la App de GitHub`,producerWorkflow:`Nombre del workflow`,producerAdd:`Añadir check exacto`,producerRemove:`Quitar check`,producerManualHelp:`Usa la identidad exacta de GitHub. Añadirla no acredita que exija la cobertura.`,producerManualInvalid:`Indica nombre, ID numérico positivo de App y workflow. No uses | ni ; en los nombres. Se permiten comas.`,translationPreviewTitle:`Revisión de la traducción en curso`,translationPreviewBody:`Las preguntas propias de la configuración ya están traducidas. Algunos diagnósticos dinámicos de GitHub o del proveedor aún pueden aparecer en inglés mientras termina la revisión. Cambiar de idioma no modifica tus respuestas.`,unknownLocalError:`Se ha producido un error inesperado en la configuración local. Consulta la terminal y actualiza la página o reinicia la configuración.`},Gi={batchNextActions:`Prochaines étapes`,batchStatusReady:`Prêt à examiner`,batchStatusBlocked:`Action requise`,batchStatusApplying:`Application du plan validé`,batchStatusPartial:`Partiellement appliqué ; vérifier avant de réessayer`,batchStatusWaiting:`PR créée · en attente de fusion par un mainteneur`,batchStatusPending:`Configuration appliquée · vérification en attente`,batchStatusUnchanged:`Déjà conforme · inchangé`,batchStatusCancelled:`Travail en attente arrêté ; effets réalisés conservés`,batchConfigurationPreview:`Aperçu de la configuration, ajouté à la revue du lot. Les tests de permissions et l’installation attendent votre approbation du lot complet.`,batchUseConfiguration:`Utiliser cette configuration`,planReuseBody:`Approuvez les tests temporaires de permissions indiqués, puis la configuration revue sera appliquée. Les valeurs des Secrets existants sont conservées, sans être demandées ni remplacées. La vérification des capacités d’exécution peut rester en attente.`,organizationReuseTitle:`Réutilisation de la configuration existante`,organizationReuseBody:`{imported} paramètres compatibles importés. Conservation de {shared} Variables d’organisation et de {overrides} surcharges du dépôt ; écriture de {writes} Variables du dépôt. Les valeurs partagées et les Secrets existants restent inchangés.`,batchBranchReview:`Branche d’installation et base revue`,batchFocusTitle:`Dépôts sélectionnés`,batchFocusBody:`{count} dépôts sélectionnés explicitement dans cette organisation. Vérifiez chaque cible séparément.`,batchReviewTitle:`Examinez les plans de configuration`,batchProgressTitle:`Application des plans par dépôt`,batchResultTitle:`Résultats de configuration par dépôt`,batchProgressBody:`Application séquentielle des plans approuvés. Arrêter suspend le travail restant après la requête en cours ; les modifications et PR terminées sont conservées.`,batchReviewBody:`Approuvez uniquement les plans prêts ci-dessous. La configuration avance dans l’ordre, ajoute les accès validés sans remplacer les valeurs partagées et crée une PR par dépôt modifié. Elle ne fusionne pas, ne crée pas de tag, ne publie pas et ne déploie pas.`,batchResultBody:`Une PR de configuration nécessite encore une revue et une fusion par un mainteneur. La vérification des identifiants et capacités à l’exécution peut rester en attente. Les PR et accès réalisés sont conservés si un autre dépôt s’arrête.`,batchStopping:`Arrêt du travail en attente après la requête actuelle. Les changements réalisés seront conservés.`,batchReasonDrift:`La base validée ou sa propriété a changé. Inspectez le dépôt et examinez un nouveau plan.`,batchReasonProvider:`GitHub n’a pas confirmé la dernière étape. Une nouvelle tentative inspecte les effets existants avant de continuer.`,batchCleanupPending:`Le nettoyage du contrôle des permissions n’a pas pu être confirmé. Le travail restant est arrêté. Vérifiez l’historique GitHub et le journal local de récupération ; résolvez le nettoyage avant de démarrer une nouvelle configuration. Cette opération ne peut pas reprendre les écritures.`,batchReasonCancelled:`Le travail en attente s’est arrêté. Les changements réalisés ont été conservés.`,batchReasonPreflight:`Vérifiez l’accès, les identifiants requis et les réglages propres au dépôt avant de continuer.`,batchOpenPull:`Ouvrir la PR de configuration`,batchFilesCount:`{count} fichiers modifiés`,batchVariablesCount:`{count} changements de Variables du dépôt`,batchGrantsCount:`{count} ajouts d’accès pour ce dépôt`,batchRetainedSecrets:`Secrets existants conservés`,batchResourcesExplanation:`Les labels et Issue Types activés sont préparés séparément pour ce dépôt. Les valeurs des Secrets partagés et les accès des autres dépôts sont conservés.`,batchReviewFiles:`Inspecter les fichiers proposés`,batchDeleteFile:`Ce fichier géré par la configuration sera retiré de l’arbre d’installation ; inspectez sa sauvegarde conservée.`,batchRepositoryOverrides:`Examiner les noms des Variables du dépôt`,batchReviewedAccess:`Examiner les ajouts d’accès`,batchApplyPlans:`Appliquer les plans prêts`,batchLeavePreview:`Quitter sans appliquer`,batchStopPending:`Arrêter le travail en attente`,batchStopConfirm:`Arrêter le travail en attente après la requête actuelle ? Les PR, accès et changements réalisés seront conservés.`,batchRetryPending:`Inspecter et réessayer le travail inachevé`,batchFinish:`Terminer cette opération`,batchCleanup:`Supprimez les PAT temporaires de configuration dans GitHub après cette opération. Conservez le PAT du bot tant que les dépôts utilisent son Secret.`,batchTechnical:`Détails de l’opération`,batchLookupUnavailable:`GitHub n’a pas pu confirmer ce dépôt. Vérifiez son nom exact et l’accès du PAT.`,batchSelectionInvalid:`Vérifiez la sélection : choisissez 1 à 25 dépôts disponibles de cette organisation.`,batchAccessUnavailable:`L’accès n’est pas confirmé. Vérifiez le PAT temporaire ou retirez ce dépôt de la sélection.`,batchSelectionBody:`Choisissez 1 à 25 dépôts de {organization}. Seuls les dépôts sélectionnés seront configurés.`,batchDiscoveryUnavailable:`GitHub n’a pas pu lister les dépôts. Le dépôt actuel reste disponible ; cherchez un autre par son nom exact ou vérifiez l’accès du PAT.`,batchDiscoveryTruncated:`Cette vue a atteint la limite de 1 000 dépôts. Recherchez un nom exact pour ajouter un dépôt absent.`,batchFilter:`Filtrer les dépôts visibles`,batchSelectedCount:`{count} sélectionnés · maximum 25`,batchRepositories:`Dépôts`,batchPrivate:`Privé`,batchPublic:`Public`,batchCurrent:`Dépôt actuel`,batchArchived:`Archivé`,batchDisabled:`Désactivé`,batchReadOnly:`Accès en écriture indisponible`,batchNoMatches:`Aucun dépôt visible ne correspond au filtre.`,batchPrevious:`Précédent`,batchNext:`Suivant`,batchMissingRepository:`Un dépôt manque ?`,batchAccessExplanation:`La liste montre uniquement les dépôts visibles avec ce PAT. Une recherche par nom exact n’accorde aucun accès et ne sélectionne pas automatiquement le dépôt. Si vous remplacez le PAT temporaire, limitez-le aux dépôts à configurer.`,batchExactName:`Nom exact du dépôt dans cette organisation`,batchFindRepository:`Trouver le dépôt`,batchChangeAccess:`Changer l’accès du PAT temporaire`,batchReviewSelection:`Examiner les dépôts sélectionnés`,patStorageRetain:`Conservez le Secret PAT existant dans {destination}. Sa valeur n’est ni demandée, ni copiée, ni remplacée. S’il manque, créez-le séparément. La vérification de l’identité et des autorisations à l’exécution reste en attente.`,patStorageTitle:`Stockage du PAT du bot`,patRepositoryReplace:`Le Secret PAT existe déjà dans le dépôt {destination}. Il sera remplacé même si vous avez choisi de conserver les autres Secrets existants.`,patOrganizationReplace:`Le Secret PAT existe déjà dans l’organisation {destination}. Il sera remplacé même si vous avez choisi de conserver les autres Secrets existants.`,patRepositoryCreate:`Le PAT du bot sera enregistré comme Secret PAT dans le dépôt {destination}.`,patOrganizationCreate:`Le PAT du bot sera enregistré comme Secret PAT dans l’organisation {destination}.`,patReplacementChecks:`Le PAT du bot fourni doit réussir les vérifications d’identité, d’accès au dépôt et des autorisations requises avant l’écriture de ce Secret.`,patOrganizationImpact:`Remplacer ce Secret d’organisation peut affecter les autres dépôts qui l’utilisent. Les vérifications pour ce dépôt ne valident pas leurs exigences.`,repositorySecretSettings:`Ouvrir les Secrets Actions du dépôt`,botAccountWarning:`Vous devez ouvrir ce lien avec le compte bot sélectionné : @{account}.`,botAccountHelp:`Vérifiez le compte GitHub avant de générer le PAT. Utilisez une fenêtre privée ou changez de compte si le navigateur utilise le compte de l’opérateur de configuration.`,botGithubForm:`Créer le PAT du bot en tant que @{account}`,language:`Langue`,english:`Anglais`,spanish:`Espagnol`,setup:`CONFIGURATION`,connecting:`Connexion…`,localSession:`SESSION LOCALE`,progress:`Progression`,studio:`ASSISTANT DE CONFIGURATION`,journey:`VOTRE PARCOURS`,repository:`Dépôt`,choices:`Choix`,setupPat:`PAT de configuration`,plan:`Plan`,botPat:`PAT du bot et identifiants`,apply:`Appliquer`,localDesign:`Local par conception`,localDesignBody:`Cette page fonctionne sur votre ordinateur. GitHub crée les deux PAT dans ses propres onglets.`,preparing:`Préparation…`,completeTitle:`Configuration terminée.`,previewTitle:`Aperçu terminé.`,cancelledTitle:`Configuration annulée.`,blockedTitle:`Une intervention est nécessaire.`,gettingReady:`PRÉPARATION`,activeLede:`Une décision à la fois. Vos choix déterminent les droits, le plan et les identifiants nécessaires.`,resultLede:`Consultez le résultat et la prochaine étape ci-dessous. Le terminal fournit les détails techniques.`,readOnly:`Onglet en lecture seule`,readOnlyBody:`Un autre onglet contrôle cette session. Vous pouvez suivre la progression ou prendre le contrôle.`,takeOver:`Prendre le contrôle`,attention:`Action nécessaire`,checked:`Vérifié`,pleaseNote:`À noter`,progressUpdate:`Mise à jour`,reviewPass:`Révision des choix enregistrés — passage {pass}. C’est la même session, pas un redémarrage.`,cancelSetup:`Annuler`,cancelConfirm:`Annuler cette session locale ? Les PAT créés sur GitHub continueront d’exister.`,footerLocal:`LOCALHOST UNIQUEMENT`,footerCloud:`AUCUN COMPTE CLOUD`,footerGithub:`GITHUB ÉMET LES PAT`,currentDecision:`DÉCISION ACTUELLE`,session:`SESSION`,continue:`Continuer`,previousQuestion:`Question précédente`,questionProgress:`Question {current} sur {total} dans ce groupe · {overall} sur {all} au total`,yes:`Oui`,no:`Non`,permissionPreview:`APERÇU DES DROITS`,changeAnswersTitle:`Modifier vos réponses`,changeAnswersHelp:`Revenez à une section sans perdre les autres réponses. Le plan et les droits PAT requis seront vérifiés à nouveau.`,changeSection:`Modifier {section}`,editCapabilities:`Fonctionnalités`,editRuntimes:`Agents`,editModels:`Modèles des agents`,editRoleModels:`Modèles par tâche`,editRepository:`Comportement du dépôt`,editDeployment:`Releases et correctifs`,editBugbot:`Bugbot`,editApproval:`Approbation des PR`,editProjects:`Projects`,editProvisioning:`Provisionnement`,editStorage:`Secrets et Variables`,suggested:`Réponse suggérée : {answer}. Vous pourrez revoir vos choix avant de créer le PAT.`,none:`aucune`,sourceGithub:`Observé dans les métadonnées authentifiées de ce dépôt GitHub.`,sourceConfig:`Fourni par votre configuration ; GitHub ne l’a pas remplacé.`,sourceDefault:`Valeur par défaut du produit ; non vérifiée dans ce dépôt.`,sourceLocal:`Observé dans ce dossier local ; vérifiez que cette branche existe sur GitHub avant d’appliquer les changements.`,whyMatters:`Pourquoi c’est important`,whenApplies:`Quand cela s’applique`,whereConfigured:`Où se fait le réglage`,howToChoose:`Comment choisir`,whyRecommendation:`Pourquoi c’est important`,example:`Exemple`,effect:`Ce qui change`,verify:`Comment vérifier`,learnMore:`Lire la documentation de ce réglage`,resultApplied:`Configuration appliquée`,resultNoChanges:`Aucun changement effectué`,resultStopped:`Aucun changement commencé`,resultPartial:`Vérifiez les changements partiels`,resultCompleteBody:`Le PAT temporaire n’est pas révoqué automatiquement. Supprimez-le sur GitHub après vérification. Gardez le PAT du bot jusqu’à rotation du Secret.`,resultPartialBody:`Un Secret ou une autre ressource a peut-être été modifié. Vérifiez GitHub et exécutez copilot doctor --read-only avant de remplacer ou supprimer un PAT.`,resultNoChangesBody:`Copilot n’a pas commencé à appliquer la configuration. Des tests temporaires de permissions ont pu s’exécuter ; GitHub peut conserver l’historique Actions, Issues ou PR après leur nettoyage. Les PAT créés restent actifs jusqu’à leur suppression.`,whatHappened:`Ce qui s’est passé`,alreadyChanged:`Déjà modifié`,noChanges:`Aucun changement du dépôt ou de GitHub n’a commencé pendant cette session.`,nextAction:`Prochaine étape`,reasonPermissions:`Les droits nécessaires du PAT de configuration manquent ou n’ont pas pu être confirmés.`,nextPermissions:`Vérifiez les droits affichés, corrigez le PAT sur GitHub, puis recommencez.`,reasonWorkflowPermissions:`Le PAT du bot n’a pas terminé toutes les vérifications de droits. Consultez le droit concerné et les prérequis de préparation ou de nettoyage ci-dessous.`,permissionReportTitle:`Vérification des droits du PAT`,permissionReportLead:`Les droits requis qui n’ont pas pu être confirmés sont indiqués ci-dessous. « Non vérifiable » ne signifie pas « absent ».`,updatedSetupPatTitle:`Corrigez le PAT de configuration`,updatedSetupPatBody:`Ce lien GitHub inclut les droits requis pour cette configuration. Sélectionnez ce dépôt avant de créer le PAT. Fermez cette session locale, puis recommencez la configuration avec le PAT corrigé.`,updatedSetupPatGrants:`Droits supplémentaires détectés après inspection`,updatedSetupPatLink:`Créer un PAT de configuration corrigé`,permissionProbeCleanupPending:`Une ressource temporaire de vérification peut encore exister. La configuration est arrêtée ; ne supposez pas que le nettoyage a réussi.`,permissionProbeCleanupAction:`Réessayez avec un PAT capable de la supprimer. Le journal local de récupération est consulté avant tout nouveau test.`,permissionSecretCollision:`GitHub a indiqué qu’un Secret portant le nom de test aléatoire a été mis à jour. Une valeur créée simultanément peut avoir changé. La configuration s’est arrêtée sans le supprimer.`,permissionSecretCollisionAction:`Consultez l’historique des Secrets GitHub et restaurez toute valeur concernée avant de réessayer. Le journal local ne peut pas corriger cette collision.`,permissionIdentity:`Identité GitHub et accès au dépôt`,permissionIdentityValid:`Vérifiés`,permissionIdentityInvalid:`Refusés`,permissionIdentityUnknown:`Non confirmés`,permissionGrantNotChecked:`Non vérifié`,permissionReportNoFailedGrant:`Cette vérification n’a trouvé aucun droit requis en échec. Vérifiez le compte prévu pour le PAT et l’erreur du terminal avant de réessayer.`,reasonStorage:`Le stockage GitHub Actions choisi ne peut pas être utilisé en sécurité.`,nextStorage:`Vérifiez la portée des Variables/Secrets et les ressources existantes, puis réessayez.`,reasonConfiguration:`La configuration choisie n’a pas pu être validée.`,nextConfiguration:`Lisez les détails du terminal, corrigez les choix et réessayez.`,reasonExpired:`La session locale a expiré.`,nextExpired:`Démarrez une nouvelle session ; l’ancienne approbation ne peut pas être réutilisée.`,reasonCancelled:`La configuration a été annulée.`,nextCancelled:`Démarrez une nouvelle session si vous souhaitez encore configurer ce dépôt.`,reasonUnknown:`La configuration s’est arrêtée. Le navigateur n’a pas pu déterminer la cause exacte. Consultez le reçu des ressources, s’il est disponible, et le terminal.`,nextUnknown:`Consultez la dernière erreur du terminal avant de réessayer. Ne supposez pas qu’un PAT a été révoqué.`,reasonProvider:`GitHub ou un autre fournisseur n’a pas terminé l’opération demandée.`,nextProvider:`Utilisez la référence de diagnostic pour consulter le terminal, vérifiez la disponibilité et les accès, puis examinez tout changement partiel avant de réessayer.`,reasonRateLimit:`GitHub a temporairement limité les requêtes nécessaires à la configuration.`,nextRateLimit:`Attendez la réinitialisation de la limite. Examinez les changements effectués avant de recommencer.`,diagnosticReference:`Référence de diagnostic`,resourceReceipt:`Reçu des opérations de configuration`,effectCompleted:`Signalée comme terminée`,effectSkipped:`Signalée comme ignorée`,effectInspect:`Résultat à vérifier`,effectNotStarted:`Non commencée`,effectInProgress:`En cours ; résultat non encore confirmé`,scopeLocal:`Dossier local`,scopeMixed:`Dépôt et organisation`,receiptFiles:`Fichiers de configuration`,receiptSecrets:`Secrets GitHub Actions`,receiptLabels:`Étiquettes des tickets`,receiptIssueTypes:`Types de ticket`,receiptVariables:`Variables GitHub Actions`,receiptInitialTag:`Première étiquette de version`,inspectPartial:`Des changements peuvent déjà être actifs. Vérifiez GitHub et le terminal avant de réessayer.`,patSettings:`Ouvrir les paramètres PAT GitHub ↗`,closeSession:`Fermer la session locale`,sessionClosed:`Session locale fermée`,sessionClosedBody:`Le serveur local a accepté la demande de fermeture. Cette page ne le contacte plus et conserve le résultat. Fermer la session ne révoque aucun PAT créé dans GitHub.`,doctorHelp:`Après la configuration, vérifiez ici les ressources installées sans déclencher d’Actions. Vous pouvez aussi exécuter copilot doctor --read-only à la racine du dépôt avec le PAT temporaire et le même fichier --config non secret, le cas échéant.`,doctorRun:`Vérifier l’installation (lecture seule)`,doctorRunning:`Vérification des ressources installées sans déclencher d’Actions…`,doctorPassed:`La vérification en lecture seule n’a trouvé aucun échec.`,doctorWarnings:`La vérification en lecture seule demande une attention particulière.`,doctorFailed:`La vérification en lecture seule ne s’est pas terminée. Consultez le terminal ou exécutez la commande ci-dessous.`,doctorCounts:`{pass} réussis · {warn} avertissements · {fail} échecs · {skipped} ignorés.`,doctorSecretLimit:`Ce mode ne peut pas vérifier les valeurs des Secrets.`,botRenewal:`Le PAT du bot reste dans le secret GitHub Actions choisi pour les futures exécutions. Sa date d’expiration réelle n’est pas vérifiée ici ; notez-la sur GitHub et remplacez le secret avant cette date.`,working:`Préparation de l’étape suivante`,workingBody:`Le processus local vérifie vos réponses. Gardez cette page ouverte.`,repoFocus:`Dépôt concerné`,repoFocusBody:`Cette configuration concerne le dépôt indiqué. Les Secrets et Variables d’organisation peuvent être partagés avec d’autres dépôts.`,access:`accès`,readOnlyCheck:`Vérification des capacités`,provisionalGrants:`Droits provisoires minimaux`,conditionalGrants:`Les droits conditionnels dépendent de vos choix et de GitHub. Un contrôle final précède toute modification.`,permissionEvidenceVerified:`Une lecture GitHub a confirmé cet accès.`,permissionEvidenceVerifiedWrite:`Une ressource temporaire a été créée, lue et supprimée.`,permissionEvidencePrivateProject:`Un Project non public de l’organisation a confirmé l’accès Projects en lecture.`,permissionEvidenceMissing:`GitHub a refusé l’accès requis. Vérifiez les paramètres du PAT.`,permissionEvidenceWrite:`La vérification temporaire en écriture n’a pas abouti. Examinez l’étape échouée puis réessayez.`,permissionEvidencePublic:`La lecture a réussi, mais cette ressource publique ne prouve pas à elle seule le droit du PAT.`,permissionEvidencePublicProjects:`La lecture des Projects a réussi, même avec une liste vide. L’accès aux Projects privés est vérifié lors de leur sélection.`,permissionEvidenceUnknownRead:`Le contrôle en lecture n’est pas concluant. Consultez le détail dans le terminal et réessayez si nécessaire.`,permissionUnknown:`Ce droit exige une vérification. Consultez le droit exact et son explication technique dans le terminal avant de continuer.`,permissionsFollow:`Les droits suivent vos choix`,permissionsFollowBody:`Les droits exacts sont affichés avant chaque PAT. Ouvrir cette page ne crée rien.`,files:`Fichiers`,workflows:`Workflows`,variables:`Variables`,secretNames:`Noms des Secrets`,planBody:`Vérifiez précisément ce qui pourrait changer. Après approbation, des ressources temporaires testent les droits d’écriture du PAT, puis le PAT du bot et les autres identifiants sont demandés. GitHub peut conserver des exécutions, l’historique des Issues ou PR et des notifications.`,planPermissionProbeTitle:`Tests temporaires des permissions après approbation`,planPermissionProbeBody:`Chaque permission indiquée crée, lit puis supprime sa propre ressource temporaire. Le test Issues crée une Issue visible ; si GitHub refuse sa suppression, la configuration la ferme, indique son numéro et s’arrête. Actions, Issues et Pull requests peuvent laisser un historique ou des notifications.`,planActionsProbePrerequisites:`Le test Actions nécessite Contents Write pour créer sa branche isolée. Si le workflow de santé empaqueté exact est indisponible sur la branche par défaut, il nécessite aussi Workflows Write pour préparer une version dont les jobs sont désactivés. Pour le bot, le PAT de configuration prépare et nettoie la ressource ; le PAT du bot déclenche et lit son exécution. Un prérequis bloqué ne prouve pas qu’Actions manque.`,planSecretProbeLimit:`GitHub ne propose qu’une opération de création ou mise à jour pour les Secrets. Le contrôle utilise un nom aléatoire privé et vérifie d’abord son absence, mais GitHub ne garantit pas une création atomique. S’il signale une mise à jour, la configuration s’arrête et vous demande de consulter l’historique du Secret.`,planChoices:`Vos décisions principales`,planEnabledCapabilities:`Fonctionnalités activées`,planBranchRoles:`Branche de production / développement`,planApprovalMode:`Approbation des pull requests`,planVariableScope:`Portée des variables`,planSecretScope:`Portée des secrets`,planInitialTag:`Créer la première étiquette`,planAgentRouting:`Agent et modèle par tâche`,planIssueWorkflows:`Workflows de tickets`,planTrustedChecks:`Producteurs CI de confiance`,planCoverage:`Preuve de couverture`,planProjectStatuses:`Transitions Status des Projects`,planIssueResources:`Étiquettes et types de ticket`,planIssueResourcesValue:`Vérifiés ou créés lors de l’application`,planProducerAttested:`Identité CI et étape obligatoire vérifiées par vous`,planCoverageThreshold:`Couverture minimale des lignes modifiées`,planCoverageReporter:`Workflow publiant l’artefact`,planReporterAttested:`Producteur du rapport de couverture vérifié par vous`,planAdvancedDefaults:`Le plan comprend aussi les valeurs par défaut des réglages non modifiés. Utilisez Modifier ci-dessous pour examiner une section avant de valider.`,planUnknownWarning:`Un avertissement supplémentaire du plan ne peut pas être affiché ici. Lisez-le dans le terminal avant de valider.`,planBasicDefaultsIntro:`Le parcours de base a conservé ces réglages avancés. Ouvrez une section ci-dessous pour les vérifier ou les modifier :`,scopeRepository:`Dépôt`,scopeOrganization:`Organisation`,scopeDisabled:`Non provisionné`,approvalOff:`Désactivée`,approvalRecommend:`Recommandation uniquement`,approvalGuarded:`Approbation protégée`,beforeContinue:`Avant de continuer`,stopHere:`Arrêter ici`,approvePlan:`Approuver ce plan`,githubLink:`Ouvrir le lien GitHub ↗`,githubForm:`Ouvrir le formulaire PAT officiel de GitHub`,githubFormHelp:`Vérifiez le compte connecté, choisissez Only select repositories et ce dépôt. GitHub gère la 2FA et crée le PAT.`,pasteHere:`Collez la valeur ici`,yourAnswer:`Votre réponse`,hiddenAfter:`Masquée après envoi`,typeAnswer:`Saisissez votre réponse`,secretHelp:`Envoyé uniquement au processus local. Ni réaffiché ni enregistré dans le navigateur.`,pairTitle:`Associer ce navigateur`,pairLabel:`Code du terminal`,pairPlaceholder:`16 caractères hexadécimaux`,pairBody:`Trouvez le code à 16 caractères dans le terminal qui a lancé copilot setup --web. Il ne figure pas dans l’URL et n’est pas conservé après fermeture.`,pairHelp:`Gardez ce code secret. Après actualisation, saisissez-le de nouveau.`,pairButton:`Se connecter à la configuration locale`,privateSession:`SESSION LOCALE PRIVÉE`,theme:`Thème`,themeAuto:`Auto`,themeSystem:`Suivre le système`,themeLight:`Thème clair`,themeDark:`Thème sombre`,selectOne:`Choisissez une option`,ciRun:`Voir l’exécution CI sur GitHub ↗`,manualCheck:`Check absent ? Saisissez nom|ID App|workflow exacts, séparés par des points-virgules.`,checksObserved:`Des jobs CI récents ont été trouvés. Ouvrez chaque exécution et vérifiez le job, l’App et l’étape obligatoire de couverture avant de lui faire confiance.`,checksNoRecent:`Aucune exécution récente de workflow de pull request. Lancez le CI habituel sur une vraie PR ou saisissez un producteur exact.`,checksNoVerifiable:`Des exécutions récentes existent, mais aucun job ne correspond à une identité exacte de Check Run et d’App. Vérifiez GitHub ou saisissez-la.`,checksDenied:`GitHub a refusé la découverte CI. Accordez Actions: read et Checks: read au PAT de configuration, ou saisissez un producteur exact.`,checksUnavailable:`La découverte CI a échoué. Cela ne prouve pas l’absence de checks. Réessayez ou saisissez un producteur exact.`,projectsObserved:`Ces Projects existants appartiennent au propriétaire du dépôt. Ne choisissez que ceux que l’automatisation doit modifier.`,projectsEmpty:`Cette requête GitHub limitée n’a renvoyé aucun Project ouvert et accessible ; elle ne prouve pas leur absence. Vérifiez l’accès ou saisissez un numéro vérifié.`,projectsDenied:`GitHub a refusé la découverte des Projects. Vérifiez Projects: read au niveau organisation sur le PAT, ou saisissez les numéros.`,projectsUnavailable:`La découverte des Projects a échoué. Cela ne prouve pas leur absence. Saisissez un numéro vérifié ou réessayez.`,projectsUnsupported:`Cette API GitHub ne liste pas les Projects personnels avec un PAT à permissions fines. Saisissez le numéro figurant dans l’URL.`,discoveryTruncated:`Seul un échantillon limité de Projects accessibles ou checks récents a été inspecté. Saisissez manuellement un élément absent.`,checksDiscoveryScope:`Périmètre : jusqu’à 20 exécutions de PR parmi les 1 000 dernières exécutions de workflows (jusqu’à 10 pages) des 90 derniers jours ; au plus 15 exécutions et 100 checks par commit sont inspectés.`,projectsDiscoveryScope:`Périmètre : au plus 30 Projects ouverts et accessibles de l’organisation sur deux pages ; jusqu’à 100 champs sont inspectés par Project. Les Projects fermés sont exclus.`,retryDiscovery:`Relancer la recherche GitHub`,retryRemaining:`Il reste {count} essais en lecture seule. Vos réponses sont conservées.`,retryExhausted:`Plus aucun essai disponible. Vérifiez GitHub et saisissez manuellement tout élément manquant.`,observationTimeUnknown:`date d’observation indisponible`,branchRequirementUnknown:`Exigé par la règle de branche : non vérifié`,branchRequirementObserved:`Exigé sur {branch} par un ruleset actif pour ce contrôle et cette application précis.`,ciRule:`Ouvrir le ruleset du contrôle obligatoire ↗`,projectSharedStatus:`Tous les Projects choisis doivent partager chaque valeur Status. Cette configuration ne définit pas de valeurs différentes par Project.`,fixedWorkflowEnabled:`Votre configuration fixe features.{kind}=true. Gardez {kind} sélectionné ; modifiez --config ou les options pour changer ce choix.`,fixedWorkflowDisabled:`Votre configuration fixe features.{kind}=false. Ne sélectionnez pas {kind} ; modifiez --config ou les options pour changer ce choix.`,fixedIssuesRequired:`Votre configuration active explicitement release ou hotfix. Gardez Issues activé ou modifiez d’abord --config ou les options.`,projectSelectionNotObserved:`Les numéros de Projects choisis auparavant sont conservés, mais n’apparaissent plus dans ce résultat GitHub. Vérifiez-les sur GitHub ou retirez-les.`,removeSelection:`Retirer la sélection`,projectTransitionIssueCreated:`Nouveau ticket`,projectTransitionPullRequestCreated:`Nouvelle pull request`,projectTransitionIssueInProgress:`Ticket en cours`,projectTransitionPullRequestInProgress:`Pull request en cours`,projectUrl:`Ouvrir le Project sur GitHub ↗`,projectManual:`Project absent ? Saisissez son numéro positif ou son URL GitHub exacte. Les ID PVT_ sont refusés.`,projectStatusUnavailable:`Les options Status n’ont pas pu être vérifiées pour tous les Projects. Vérifiez-les sur GitHub et saisissez la valeur exacte.`,projectStatusIncompatible:`Les Projects choisis ne partagent aucun Status. Choisissez des Projects compatibles avant de continuer.`,producerName:`Nom du check/job`,producerAppId:`ID de l’App GitHub source`,producerWorkflow:`Nom du workflow`,producerAdd:`Ajouter le check exact`,producerRemove:`Retirer le check`,producerManualHelp:`Utilisez l’identité exacte affichée sur GitHub. L’ajouter ne prouve pas que la couverture est imposée.`,producerManualInvalid:`Indiquez le nom, un ID numérique positif d’App et le workflow. N’utilisez ni | ni ; dans les noms. Les virgules sont autorisées.`,translationPreviewTitle:`Révision de la traduction en cours`,translationPreviewBody:`Les questions propres à la configuration sont traduites. Certains diagnostics dynamiques de GitHub ou du fournisseur peuvent encore apparaître en anglais pendant la révision. Changer de langue ne modifie pas vos réponses.`,unknownLocalError:`Une erreur inattendue est survenue pendant la configuration locale. Consultez le terminal, puis actualisez la page ou relancez la configuration.`},Ki={batchNextActions:`Próximos passos`,batchStatusReady:`Pronto para revisão`,batchStatusBlocked:`Requer uma ação`,batchStatusApplying:`A aplicar o plano revisto`,batchStatusPartial:`Aplicado parcialmente; reveja antes de tentar novamente`,batchStatusWaiting:`PR criada · aguarda integração por um responsável`,batchStatusPending:`Configuração aplicada · verificação pendente`,batchStatusUnchanged:`Já corresponde · sem alterações`,batchStatusCancelled:`Trabalho pendente interrompido; alterações concluídas mantidas`,batchConfigurationPreview:`Prévia da configuração, adicionada à revisão do lote. Os testes de permissões e a instalação aguardam a aprovação do lote completo.`,batchUseConfiguration:`Usar esta configuração`,planReuseBody:`Aprove os testes temporários de permissões indicados; em seguida, aplica-se o setup revisto. Os valores dos Secrets existentes são preservados, sem serem pedidos ou substituídos. A verificação de permissões em execução pode ficar pendente.`,organizationReuseTitle:`Reutilizar a configuração existente`,organizationReuseBody:`{imported} definições compatíveis importadas. Preservam-se {shared} Variables da organização e {overrides} substituições do repositório; escrevem-se {writes} Variables no repositório. Os valores partilhados e os Secrets existentes são preservados.`,batchBranchReview:`Ramo de instalação e base revista`,batchFocusTitle:`Repositórios selecionados`,batchFocusBody:`{count} repositórios selecionados explicitamente nesta organização. Reveja cada destino separadamente.`,batchReviewTitle:`Reveja os planos de configuração`,batchProgressTitle:`A aplicar os planos por repositório`,batchResultTitle:`Resultados da configuração por repositório`,batchProgressBody:`Aplicam-se os planos aprovados por ordem. Parar suspende o trabalho pendente após o pedido atual; as alterações e PRs concluídas são preservadas.`,batchReviewBody:`Aprove apenas os planos prontos abaixo. A configuração avança por ordem, adiciona o acesso revisto sem substituir valores partilhados e cria uma PR por repositório alterado. Não integra, cria tags, publica versões nem implementa.`,batchResultBody:`Uma PR de configuração ainda precisa de revisão e integração por um responsável. A verificação de credenciais e permissões em execução pode ficar pendente. As PRs e os acessos concluídos mantêm-se se outro destino parar.`,batchStopping:`A interromper o trabalho pendente após o pedido atual. As alterações concluídas serão mantidas.`,batchReasonDrift:`A base revista ou a sua titularidade mudou. Inspecione o repositório e reveja um novo plano.`,batchReasonProvider:`O GitHub não confirmou o último passo. Uma nova tentativa inspeciona os efeitos existentes antes de continuar.`,batchCleanupPending:`Não foi possível confirmar a limpeza da verificação de permissões. O trabalho pendente foi interrompido. Verifique o histórico do GitHub e o registro local de recuperação; resolva a limpeza antes de iniciar uma nova configuração. Esta operação não pode retomar gravações.`,batchReasonCancelled:`O trabalho pendente parou. As alterações concluídas foram mantidas.`,batchReasonPreflight:`Reveja o acesso, as credenciais necessárias e os ajustes específicos do repositório antes de continuar.`,batchOpenPull:`Abrir PR de configuração`,batchFilesCount:`{count} ficheiros alterados`,batchVariablesCount:`{count} alterações de Variables do repositório`,batchGrantsCount:`{count} acessos a adicionar para este repositório`,batchRetainedSecrets:`Secrets existentes mantidos`,batchResourcesExplanation:`Os labels e Issue Types ativados são preparados separadamente para este destino. Os valores dos Secrets partilhados e os acessos dos outros repositórios são mantidos.`,batchReviewFiles:`Inspecionar ficheiros propostos`,batchDeleteFile:`Este ficheiro gerido pela configuração será removido da árvore de instalação; inspecione a cópia mantida.`,batchRepositoryOverrides:`Rever os nomes das Variables do repositório`,batchReviewedAccess:`Rever os acessos a adicionar`,batchApplyPlans:`Aplicar planos prontos`,batchLeavePreview:`Sair sem aplicar`,batchStopPending:`Interromper trabalho pendente`,batchStopConfirm:`Interromper o trabalho pendente após o pedido atual? As PRs, os acessos e as alterações concluídas serão mantidos.`,batchRetryPending:`Inspecionar e repetir o trabalho pendente`,batchFinish:`Concluir esta operação`,batchCleanup:`Elimine os PATs temporários de configuração no GitHub após esta operação. Mantenha o PAT do bot enquanto os repositórios consumirem o seu Secret.`,batchTechnical:`Detalhes da operação`,batchLookupUnavailable:`O GitHub não conseguiu confirmar esse repositório. Verifique o nome exato e o acesso do PAT.`,batchSelectionInvalid:`Reveja a seleção: escolha entre 1 e 25 repositórios disponíveis desta organização.`,batchAccessUnavailable:`O acesso não está confirmado. Reveja o PAT temporário ou remova este repositório da seleção.`,batchSelectionBody:`Escolha entre 1 e 25 repositórios de {organization}. Apenas os selecionados serão configurados.`,batchDiscoveryUnavailable:`O GitHub não conseguiu listar os repositórios. O atual continua disponível; procure outro pelo nome exato ou reveja o acesso do PAT.`,batchDiscoveryTruncated:`Esta vista atingiu o limite de 1.000 repositórios. Procure pelo nome exato para adicionar um destino em falta.`,batchFilter:`Filtrar repositórios visíveis`,batchSelectedCount:`{count} selecionados · máximo 25`,batchRepositories:`Repositórios`,batchPrivate:`Privado`,batchPublic:`Público`,batchCurrent:`Repositório atual`,batchArchived:`Arquivado`,batchDisabled:`Desativado`,batchReadOnly:`Sem acesso de escrita`,batchNoMatches:`Nenhum repositório visível corresponde ao filtro.`,batchPrevious:`Anterior`,batchNext:`Seguinte`,batchMissingRepository:`Não encontra um repositório?`,batchAccessExplanation:`A lista mostra apenas os repositórios visíveis para este PAT. A pesquisa por nome exato não concede acesso nem seleciona o repositório automaticamente. Se substituir o PAT temporário, limite-o aos repositórios que pretende configurar.`,batchExactName:`Nome exato do repositório nesta organização`,batchFindRepository:`Procurar repositório`,batchChangeAccess:`Alterar o acesso do PAT temporário`,batchReviewSelection:`Rever repositórios selecionados`,patStorageRetain:`Mantém-se o Secret PAT existente em {destination}. O seu valor não é pedido, copiado nem substituído. Se faltar, deve ser criado em separado. A verificação da identidade e das permissões em execução fica pendente.`,patStorageTitle:`Armazenamento do PAT do bot`,patRepositoryReplace:`O Secret PAT já existe no repositório {destination}. Será substituído mesmo que tenha escolhido preservar os outros Secrets existentes.`,patOrganizationReplace:`O Secret PAT já existe na organização {destination}. Será substituído mesmo que tenha escolhido preservar os outros Secrets existentes.`,patRepositoryCreate:`O PAT do bot será guardado como Secret PAT no repositório {destination}.`,patOrganizationCreate:`O PAT do bot será guardado como Secret PAT na organização {destination}.`,patReplacementChecks:`O PAT do bot fornecido tem de passar as verificações de identidade, acesso ao repositório e permissões necessárias antes de escrever este Secret.`,patOrganizationImpact:`Substituir este Secret da organização pode afetar outros repositórios que o utilizam. As verificações deste repositório não validam os requisitos dos restantes.`,repositorySecretSettings:`Abrir os Secrets Actions do repositório`,botAccountWarning:`Deve abrir este link com a conta de bot selecionada: @{account}.`,botAccountHelp:`Confirme a conta do GitHub antes de gerar o PAT. Use uma janela privada ou mude de conta se o navegador tiver a sessão do operador da configuração.`,botGithubForm:`Criar PAT do bot como @{account}`,language:`Idioma`,english:`Inglês`,spanish:`Espanhol`,setup:`CONFIGURAÇÃO`,connecting:`A ligar…`,localSession:`SESSÃO LOCAL`,progress:`Progresso`,studio:`ASSISTENTE DE CONFIGURAÇÃO`,journey:`O SEU PERCURSO`,repository:`Repositório`,choices:`Opções`,setupPat:`PAT de configuração`,plan:`Plano`,botPat:`PAT do bot e credenciais`,apply:`Aplicar`,localDesign:`Local por conceção`,localDesignBody:`Esta página funciona no seu computador. O GitHub cria ambos os PAT nos seus próprios separadores.`,preparing:`A preparar a configuração…`,completeTitle:`Configuração concluída.`,previewTitle:`Pré-visualização concluída.`,cancelledTitle:`Configuração cancelada.`,blockedTitle:`A configuração requer atenção.`,gettingReady:`A PREPARAR`,activeLede:`Uma decisão de cada vez. As suas escolhas determinam permissões, plano e credenciais.`,resultLede:`Consulte abaixo o resultado e o próximo passo. O terminal contém mais detalhes técnicos.`,readOnly:`Separador só de leitura`,readOnlyBody:`Outro separador controla esta sessão. Pode acompanhar o progresso ou assumir o controlo.`,takeOver:`Assumir o controlo`,attention:`Requer atenção`,checked:`Verificado`,pleaseNote:`Atenção`,progressUpdate:`Atualização de progresso`,reviewPass:`A rever as escolhas guardadas — passagem {pass}. É a mesma execução, não um reinício.`,cancelSetup:`Cancelar configuração`,cancelConfirm:`Cancelar esta sessão local? Os PAT já criados no GitHub continuarão a existir.`,footerLocal:`APENAS LOCALHOST`,footerCloud:`SEM CONTA DE CONFIGURAÇÃO NA NUVEM`,footerGithub:`O GITHUB EMITE OS PAT`,currentDecision:`DECISÃO ATUAL`,session:`SESSÃO`,continue:`Continuar`,previousQuestion:`Pergunta anterior`,questionProgress:`Pergunta {current} de {total} neste grupo · {overall} de {all} no total`,yes:`Sim`,no:`Não`,permissionPreview:`PRÉ-VISUALIZAÇÃO DAS PERMISSÕES`,changeAnswersTitle:`Alterar respostas`,changeAnswersHelp:`Volte a uma secção sem perder as outras respostas. O plano e as permissões PAT necessárias serão verificados de novo.`,changeSection:`Alterar {section}`,editCapabilities:`Funcionalidades`,editRuntimes:`Agentes`,editModels:`Modelos dos agentes`,editRoleModels:`Modelos por tarefa`,editRepository:`Comportamento do repositório`,editDeployment:`Releases e correções`,editBugbot:`Bugbot`,editApproval:`Aprovação de PR`,editProjects:`Projects`,editProvisioning:`Provisionamento`,editStorage:`Secrets e Variables`,suggested:`Resposta sugerida: {answer}. Pode rever as opções antes de criar o PAT.`,none:`nenhuma`,sourceGithub:`Observado nos metadados autenticados deste repositório no GitHub.`,sourceConfig:`Fornecido pela sua configuração; o GitHub não o substituiu.`,sourceDefault:`Valor predefinido do produto; não verificado neste repositório.`,sourceLocal:`Observado neste checkout local; confirme que o ramo existe no GitHub antes de aplicar alterações.`,whyMatters:`Porque importa`,whenApplies:`Quando se aplica`,whereConfigured:`Onde se configura`,howToChoose:`Como escolher`,whyRecommendation:`Porque importa`,example:`Exemplo`,effect:`O que muda`,verify:`Como verificar`,learnMore:`Ler a documentação desta opção`,resultApplied:`A configuração foi aplicada`,resultNoChanges:`Nenhuma alteração efetuada`,resultStopped:`Nenhuma alteração iniciada`,resultPartial:`Verifique as alterações parciais`,resultCompleteBody:`O PAT temporário não é revogado automaticamente. Elimine-o no GitHub após verificar. Guarde o PAT do bot até rodar o Secret.`,resultPartialBody:`Um Secret ou outro recurso pode ter sido alterado. Verifique o GitHub e execute copilot doctor --read-only antes de substituir ou eliminar o PAT.`,resultNoChangesBody:`O Copilot não começou a aplicar alterações. Podem ter ocorrido testes temporários de permissões; o GitHub pode conservar o histórico de Actions, Issues ou PR após a limpeza. Os PAT criados permanecem até serem eliminados.`,whatHappened:`O que aconteceu`,alreadyChanged:`O que mudou`,noChanges:`Não foram iniciadas alterações no repositório nem no GitHub nesta sessão.`,nextAction:`Próximo passo`,reasonPermissions:`Faltam permissões do PAT de configuração ou não foi possível confirmá-las.`,nextPermissions:`Verifique as permissões, corrija o PAT no GitHub e inicie uma nova sessão.`,reasonWorkflowPermissions:`O PAT do bot não concluiu todas as verificações de permissões. Verifique a permissão que falhou e os requisitos de preparação ou limpeza abaixo.`,permissionReportTitle:`Verificação das permissões do PAT`,permissionReportLead:`As permissões obrigatórias que não puderam ser confirmadas aparecem abaixo. «Não verificável» não significa «ausente».`,updatedSetupPatTitle:`Corrija o PAT de configuração`,updatedSetupPatBody:`Esta ligação do GitHub inclui as permissões necessárias para esta configuração. Selecione este repositório antes de criar o PAT. Feche esta sessão local e inicie uma nova configuração com o PAT corrigido.`,updatedSetupPatGrants:`Permissões adicionais detetadas após a inspeção`,updatedSetupPatLink:`Criar PAT de configuração corrigido`,permissionProbeCleanupPending:`Pode ainda existir um recurso temporário de verificação de permissões. O setup parou; não presuma que foi removido.`,permissionProbeCleanupAction:`Tente novamente com um PAT que o possa remover. O registo local de recuperação é verificado antes de novos testes.`,permissionSecretCollision:`O GitHub indicou que um Secret com o nome aleatório de teste foi atualizado. Um valor criado em simultâneo pode ter mudado. A configuração parou sem o eliminar.`,permissionSecretCollisionAction:`Consulte o histórico de Secrets do GitHub e reponha qualquer valor afetado antes de tentar novamente. O registo local não pode corrigir esta colisão.`,permissionIdentity:`Identidade GitHub e acesso ao repositório`,permissionIdentityValid:`Verificados`,permissionIdentityInvalid:`Recusados`,permissionIdentityUnknown:`Não confirmados`,permissionGrantNotChecked:`Não verificada`,permissionReportNoFailedGrant:`Esta verificação não encontrou uma permissão obrigatória em falta. Confirme a conta prevista para o PAT e o erro no terminal antes de tentar novamente.`,reasonStorage:`O armazenamento GitHub Actions escolhido não pôde ser usado com segurança.`,nextStorage:`Verifique o âmbito das Variables/Secrets e os recursos existentes; depois tente novamente.`,reasonConfiguration:`Não foi possível validar a configuração escolhida.`,nextConfiguration:`Leia os detalhes no terminal, corrija as opções e tente novamente.`,reasonExpired:`A sessão local expirou.`,nextExpired:`Inicie uma nova sessão; a aprovação anterior não pode ser reutilizada.`,reasonCancelled:`A configuração foi cancelada.`,nextCancelled:`Inicie outra execução se ainda quiser configurar o repositório.`,reasonUnknown:`A configuração parou. O navegador não conseguiu determinar a causa exata. Consulte o recibo de recursos, se estiver disponível, e o terminal.`,nextUnknown:`Leia o último erro no terminal antes de tentar novamente. Não presuma que um PAT foi revogado.`,reasonProvider:`O GitHub ou outro fornecedor não concluiu a operação solicitada.`,nextProvider:`Use a referência de diagnóstico para consultar o terminal, verifique a disponibilidade e o acesso e reveja possíveis alterações parciais antes de tentar novamente.`,reasonRateLimit:`O GitHub limitou temporariamente os pedidos necessários para a configuração.`,nextRateLimit:`Aguarde a reposição do limite. Inspecione as alterações concluídas antes de iniciar outra configuração.`,diagnosticReference:`Referência de diagnóstico`,resourceReceipt:`Registo das operações de configuração`,effectCompleted:`Indicada como concluída`,effectSkipped:`Indicada como ignorada`,effectInspect:`Resultado por inspecionar`,effectNotStarted:`Não iniciada`,effectInProgress:`Em curso; resultado ainda por confirmar`,scopeLocal:`Checkout local`,scopeMixed:`Repositório e organização`,receiptFiles:`Ficheiros de configuração`,receiptSecrets:`Secrets do GitHub Actions`,receiptLabels:`Etiquetas das questões`,receiptIssueTypes:`Tipos de questão`,receiptVariables:`Variables do GitHub Actions`,receiptInitialTag:`Etiqueta de versão inicial`,inspectPartial:`Algumas alterações podem estar ativas. Verifique o GitHub e o terminal antes de tentar novamente.`,patSettings:`Abrir definições de PAT no GitHub ↗`,closeSession:`Fechar sessão local`,sessionClosed:`Sessão local encerrada`,sessionClosedBody:`O servidor local aceitou o pedido de encerramento. Esta página deixa de o contactar e preserva o resultado. Encerrar a sessão não revoga nenhum PAT criado no GitHub.`,doctorHelp:`Depois de concluir a configuração, pode verificar aqui os recursos instalados sem iniciar Actions. Também pode executar copilot doctor --read-only na raiz do repositório com o PAT temporário e o mesmo ficheiro --config não secreto, caso o tenha usado.`,doctorRun:`Verificar instalação (só de leitura)`,doctorRunning:`A verificar os recursos instalados sem iniciar Actions…`,doctorPassed:`A verificação só de leitura não encontrou falhas.`,doctorWarnings:`A verificação só de leitura requer atenção.`,doctorFailed:`A verificação só de leitura não terminou. Consulte o terminal ou execute o comando abaixo.`,doctorCounts:`{pass} aprovados · {warn} avisos · {fail} falhas · {skipped} ignorados.`,doctorSecretLimit:`Este modo não consegue verificar os valores dos Secrets.`,botRenewal:`O PAT do bot permanece no Secret do GitHub Actions escolhido para execuções futuras. A data de validade real não é verificada aqui; registe-a no GitHub e substitua o Secret antes de expirar.`,working:`A preparar o próximo passo`,workingBody:`O processo local está a verificar as respostas. Mantenha esta página aberta.`,repoFocus:`Repositório em foco`,repoFocusBody:`Esta configuração destina-se ao repositório indicado. Secrets e Variables da organização podem ser partilhados com outros repositórios.`,access:`acesso`,readOnlyCheck:`Verificação de capacidades`,provisionalGrants:`Permissões provisórias mínimas`,conditionalGrants:`As permissões condicionais dependem das escolhas e do GitHub. Haverá uma auditoria final antes das alterações.`,permissionEvidenceVerified:`Uma leitura no GitHub confirmou este acesso.`,permissionEvidenceVerifiedWrite:`Foi criado, lido e removido um recurso temporário.`,permissionEvidencePrivateProject:`Um Project não público da organização confirmou o acesso de leitura a Projects.`,permissionEvidenceMissing:`O GitHub recusou o acesso necessário. Verifique as definições do PAT.`,permissionEvidenceWrite:`A verificação temporária de escrita não terminou com sucesso. Reveja a etapa que falhou e tente novamente.`,permissionEvidencePublic:`A leitura foi bem-sucedida, mas este recurso público não comprova por si só a permissão do PAT.`,permissionEvidencePublicProjects:`A leitura dos Projects foi bem-sucedida, mesmo com uma lista vazia. O acesso a Projects privados é verificado quando são selecionados.`,permissionEvidenceUnknownRead:`A consulta de leitura foi inconclusiva. Consulte o detalhe no terminal e tente de novo se necessário.`,permissionUnknown:`Esta permissão exige revisão. Consulte a permissão exata e a explicação técnica no terminal antes de continuar.`,permissionsFollow:`As permissões seguem as suas escolhas`,permissionsFollowBody:`Mostramos as permissões exatas antes de criar cada PAT. Abrir esta página não cria nada.`,files:`Ficheiros`,workflows:`Workflows`,variables:`Variables`,secretNames:`Nomes dos Secrets`,planBody:`Reveja exatamente o que pode mudar. Após a aprovação, recursos temporários testam as permissões de escrita do PAT; depois são pedidos o PAT do bot e outras credenciais. O GitHub pode conservar execuções, histórico de Issues ou PR e notificações.`,planPermissionProbeTitle:`Testes temporários de permissões após aprovação`,planPermissionProbeBody:`Cada permissão indicada cria, lê e remove o seu recurso temporário. O teste de Issues cria uma Issue visível; se o GitHub impedir a eliminação, a configuração fecha-a, indica o número e para. Actions, Issues e Pull requests podem deixar histórico ou notificações.`,planActionsProbePrerequisites:`O teste de Actions precisa de Contents Write para criar a branch isolada. Se o workflow de saúde empacotado exato não estiver disponível na branch predefinida, também precisa de Workflows Write para preparar uma versão com os jobs desativados. Para verificar o bot, o PAT de configuração prepara e limpa o recurso; o PAT do bot inicia e lê a execução. Um pré-requisito bloqueado não prova que falte Actions.`,planSecretProbeLimit:`O GitHub só oferece uma operação de criação ou atualização para Secrets. A verificação usa um nome aleatório privado e confirma primeiro que não existe, mas o GitHub não garante uma criação atómica. Se indicar uma atualização, a configuração para e pede a revisão do histórico do Secret.`,planChoices:`As suas decisões principais`,planEnabledCapabilities:`Funcionalidades ativadas`,planBranchRoles:`Ramo de produção / desenvolvimento`,planApprovalMode:`Aprovação de pull requests`,planVariableScope:`Âmbito das Variables`,planSecretScope:`Âmbito dos Secrets`,planInitialTag:`Criar etiqueta inicial`,planAgentRouting:`Agente e modelo por tarefa`,planIssueWorkflows:`Fluxos de questões`,planTrustedChecks:`Produtores CI de confiança`,planCoverage:`Evidência de cobertura`,planProjectStatuses:`Transições Status dos Projects`,planIssueResources:`Etiquetas e tipos de questão`,planIssueResourcesValue:`Verificados ou criados ao aplicar`,planProducerAttested:`Identidade CI e passo obrigatório verificados por si`,planCoverageThreshold:`Cobertura mínima das linhas alteradas`,planCoverageReporter:`Workflow que publica o artefacto`,planReporterAttested:`Produtor do relatório de cobertura verificado por si`,planAdvancedDefaults:`O plano também inclui valores predefinidos para definições que não alterou. Use Alterar abaixo para rever qualquer secção antes de aprovar.`,planUnknownWarning:`Um aviso adicional do plano não pode ser apresentado aqui. Leia-o no terminal antes de aprovar.`,planBasicDefaultsIntro:`O percurso básico manteve estas definições avançadas. Abra uma secção abaixo para as rever ou alterar:`,scopeRepository:`Repositório`,scopeOrganization:`Organização`,scopeDisabled:`Sem aprovisionamento`,approvalOff:`Desativada`,approvalRecommend:`Apenas recomendações`,approvalGuarded:`Aprovação protegida`,beforeContinue:`Antes de continuar`,stopHere:`Parar aqui`,approvePlan:`Aprovar este plano`,githubLink:`Abrir ligação do GitHub ↗`,githubForm:`Abrir formulário oficial de PAT no GitHub`,githubFormHelp:`Confirme a conta ligada, escolha Only select repositories e este repositório. O GitHub gere 2FA e cria o PAT.`,pasteHere:`Cole o valor aqui`,yourAnswer:`A sua resposta`,hiddenAfter:`Oculto após envio`,typeAnswer:`Escreva a sua resposta`,secretHelp:`Enviado apenas ao processo local. Não será mostrado de novo nem guardado no navegador.`,pairTitle:`Emparelhar este navegador`,pairLabel:`Código do terminal`,pairPlaceholder:`16 caracteres hexadecimais`,pairBody:`Encontre o código de 16 caracteres no terminal onde iniciou copilot setup --web. Não aparece no URL nem fica guardado após fechar a página.`,pairHelp:`Mantenha o código privado. Após atualizar a página, introduza-o novamente.`,pairButton:`Ligar à configuração local`,privateSession:`SESSÃO LOCAL PRIVADA`,theme:`Tema`,themeAuto:`Automático`,themeSystem:`Seguir sistema`,themeLight:`Tema claro`,themeDark:`Tema escuro`,selectOne:`Selecione uma opção`,ciRun:`Abrir execução de CI no GitHub ↗`,manualCheck:`Check não listado? Indique nome|ID da App|workflow exatos, separados por ponto e vírgula.`,checksObserved:`Foram encontrados jobs recentes de CI. Abra cada execução e confirme o job, a App e o passo obrigatório de cobertura antes de confiar nele.`,checksNoRecent:`Não há execuções recentes de workflows de pull request. Execute o CI habitual numa PR real ou introduza um produtor exato.`,checksNoVerifiable:`Há execuções recentes, mas nenhum job foi ligado a um Check Run e App exatos. Consulte o GitHub ou introduza o produtor manualmente.`,checksDenied:`O GitHub recusou a consulta do CI. Conceda Actions: read e Checks: read ao PAT de configuração ou introduza um produtor exato.`,checksUnavailable:`A consulta do CI falhou. Isto não prova que o repositório não tenha checks. Tente novamente ou introduza um produtor exato.`,projectsObserved:`Estes Projects existentes pertencem ao proprietário do repositório. Selecione só os que a automatização deve atualizar.`,projectsEmpty:`Esta consulta limitada ao GitHub não devolveu Projects abertos e acessíveis; isso não prova que não existam. Verifique o acesso ou introduza um número confirmado.`,projectsDenied:`O GitHub recusou a consulta de Projects. Verifique Projects: read da organização no PAT ou introduza os números.`,projectsUnavailable:`Não foi possível consultar Projects. Isto não prova que não existam. Introduza um número verificado ou tente novamente.`,projectsUnsupported:`Esta API do GitHub não lista Projects pessoais com um PAT de permissões precisas. Introduza o número do URL de um Project existente.`,discoveryTruncated:`Só foi inspecionada uma amostra limitada de Projects acessíveis ou checks recentes. Introduza manualmente um elemento em falta.`,checksDiscoveryScope:`Âmbito: até 20 execuções de PR entre as últimas 1.000 execuções de workflows (até 10 páginas) dos últimos 90 dias; são inspecionadas no máximo 15 execuções e 100 checks por commit.`,projectsDiscoveryScope:`Âmbito: no máximo 30 Projects abertos e acessíveis da organização em duas páginas; são inspecionados até 100 campos por Project. Os Projects fechados são excluídos.`,retryDiscovery:`Repetir pesquisa no GitHub`,retryRemaining:`Restam {count} tentativas só de leitura. As suas respostas são mantidas.`,retryExhausted:`Não restam tentativas. Verifique o GitHub e introduza manualmente os itens em falta.`,observationTimeUnknown:`data de observação indisponível`,branchRequirementUnknown:`Exigido pela regra do ramo: não verificado`,branchRequirementObserved:`Exigido em {branch} por um ruleset ativo para esta verificação e esta App específicas.`,ciRule:`Abrir ruleset da verificação obrigatória ↗`,projectSharedStatus:`Todos os Projects escolhidos devem partilhar cada valor Status. Esta configuração não atribui valores diferentes por Project.`,fixedWorkflowEnabled:`A sua configuração fixa features.{kind}=true. Mantenha {kind} selecionado; altere --config ou as opções para mudar esta escolha.`,fixedWorkflowDisabled:`A sua configuração fixa features.{kind}=false. Não selecione {kind}; altere --config ou as opções para mudar esta escolha.`,fixedIssuesRequired:`A sua configuração ativa explicitamente release ou hotfix. Mantenha Issues ativo ou altere primeiro --config ou as opções.`,projectSelectionNotObserved:`Os números de Projects escolhidos anteriormente são mantidos, mas já não aparecem neste resultado do GitHub. Confirme-os no GitHub ou remova-os.`,removeSelection:`Remover seleção`,projectTransitionIssueCreated:`Nova questão`,projectTransitionPullRequestCreated:`Novo pull request`,projectTransitionIssueInProgress:`Questão em curso`,projectTransitionPullRequestInProgress:`Pull request em curso`,projectUrl:`Abrir Project no GitHub ↗`,projectManual:`Project em falta? Introduza o número positivo ou o URL exato do GitHub. IDs PVT_ não são aceites.`,projectStatusUnavailable:`Não foi possível verificar as opções Status de todos os Projects. Consulte cada um no GitHub e introduza o valor exato.`,projectStatusIncompatible:`Os Projects escolhidos não partilham valores Status. Selecione Projects compatíveis antes de continuar.`,producerName:`Nome do check/job`,producerAppId:`ID da App GitHub de origem`,producerWorkflow:`Nome do workflow`,producerAdd:`Adicionar check exato`,producerRemove:`Remover check`,producerManualHelp:`Use a identidade exata apresentada no GitHub. Adicioná-la não prova que exige cobertura.`,producerManualInvalid:`Indique nome, ID numérico positivo da App e workflow. Não use | ou ; nos nomes. São permitidas vírgulas.`,translationPreviewTitle:`Revisão da tradução em curso`,translationPreviewBody:`As perguntas próprias da configuração já estão traduzidas. Alguns diagnósticos dinâmicos do GitHub ou do fornecedor ainda podem aparecer em inglês durante a revisão. Mudar de idioma não altera as suas respostas.`,unknownLocalError:`Ocorreu um erro inesperado na configuração local. Consulte o terminal e atualize a página ou reinicie a configuração.`},qi=[`en`,`es`,`fr`,`pt`],Ji={en:`English`,es:`Español`,fr:`Français`,pt:`Português`},Yi={en:Ui,es:Wi,fr:Gi,pt:Ki};function Z(e,t,n={}){return(Yi[t]??Yi.en)[e].replace(/\{(\w+)\}/gu,(e,t)=>n[t]??``)}var Xi={Repository:`repository`,"Setup choices":`choices`,"Setup PAT":`setupPat`,Plan:`plan`,"Bot PAT & credentials":`botPat`,Apply:`apply`,Preparation:`gettingReady`};function Zi(e,t){return Z(Qi(e),t)}function Qi(e){return Xi[e??``]??`gettingReady`}var Q=Pi(`en`),$i={en:{checking:`Checking permission for this adjustment. The temporary Variable will be removed before the reviewed setting is written.`,finish:`Finish`,finished:`Configuration updated`,inspectionFinished:`Configuration inspection finished`,inspectionStopped:`Configuration inspection stopped`,inspectAdjustment:`Check this adjustment before retrying`,finishedBody:`Your adjustments were verified by reading GitHub again. Delete the temporary setup PAT when you finish.`,inspectionBody:`No adjustment was applied. Your configuration is preserved. Any PAT created on GitHub remains until you delete it.`,title:`Your Copilot configuration`,unconfigured:`Copilot is not configured in this checkout`,detected:`Configuration detected in this checkout`,incomplete:`Some configuration could not be inspected`,intro:`Review what this checkout configures, make a small adjustment, or run the complete assistant again.`,startHelp:`Start the guided assistant to choose workflows, agents and GitHub settings for this repository. You will review the plan before any setup changes are applied.`,local:`Local files are shown below. Connect to GitHub to read the current repository and organization settings. No changes happen when you open this panel.`,limits:`This panel describes the current checkout. It does not certify the default branch, runner authentication, branch rules, or environment-specific overrides.`,connect:`Read configuration from GitHub`,refresh:`Refresh configuration`,wizard:`Run the complete assistant`,start:`Start setup`,close:`Close local session`,unknown:`Not verified`,repository:`Repository`,organization:`Organization`,workflow:`Workflow value`,source:`Where this value comes from`,quick:`Quick adjustments`,quickHelp:`Only independent settings can be changed here. Use the complete assistant for workflows, agents, Projects, permissions or credentials.`,edit:`Change`,details:`All workflow settings`,credentials:`Credentials`,secretHelp:`Secret names only. GitHub cannot return their values, owners or permissions; presence is not proof of validity.`,variables:`GitHub settings used by these workflows`,shadowed:`Overridden by the repository value`,empty:`No entries detected`,githubIncomplete:`Some GitHub inventories are unavailable. Unknown values stay unknown; quick changes are disabled until both Variable scopes can be read.`,current:`Current value`,next:`New value`,review:`Review this adjustment`,back:`Back to configuration`,preview:`Review change`,apply:`Apply this adjustment`,effect:`Only this setting is written. Workflows and Secrets are preserved. Before writing, Copilot tests Variables Write using one temporary Variable and removes it.`,orgImpact:`This changes a shared organization setting and can affect every repository with access to it. Its visibility and repository access are preserved.`,repoImpact:`This changes the setting for this repository only.`,connected:`GitHub configuration read. Review the current values below.`,invalid:`Choose a supported value. Nothing was changed.`,unchanged:`That value is already in effect. Nothing was changed.`,stale:`The configuration changed while you reviewed it. Review the refreshed value and try again; nothing was written.`,blocked:`Access could not be confirmed. You can reconnect with a corrected setup PAT; your configuration is preserved.`,updated:`Adjustment applied and read back from GitHub. You can make another adjustment or close the session.`,partial:`The write could not be confirmed. Inspect GitHub before retrying; the previous value was not restored automatically.`},es:{checking:`Comprobando el permiso para este ajuste. La Variable temporal se eliminará antes de escribir el parámetro aprobado.`,finish:`Terminar`,finished:`Configuración actualizada`,inspectionFinished:`Inspección de configuración finalizada`,inspectionStopped:`Inspección de configuración interrumpida`,inspectAdjustment:`Revisa este ajuste antes de reintentar`,finishedBody:`Los ajustes se confirmaron mediante una nueva lectura de GitHub. Elimina el PAT temporal de setup cuando termines.`,inspectionBody:`No se ha aplicado ningún ajuste. Tu configuración se conserva. Los PAT creados en GitHub existen hasta que los elimines.`,title:`Tu configuración de Copilot`,unconfigured:`Copilot no está configurado en este checkout`,detected:`Configuración detectada en este checkout`,incomplete:`No se pudo inspeccionar parte de la configuración`,intro:`Revisa la configuración de este checkout, haz un ajuste puntual o vuelve a ejecutar el asistente completo.`,startHelp:`Inicia el asistente guiado para elegir workflows, agentes y parámetros de GitHub para este repositorio. Revisarás el plan antes de aplicar cambios de configuración.`,local:`Estos son los archivos locales. Conecta con GitHub para leer los valores actuales del repositorio y la organización. Abrir el panel no realiza cambios.`,limits:`El panel describe este checkout. No certifica la rama por defecto, la autenticación del runner, las reglas de ramas ni las excepciones de entornos.`,connect:`Leer configuración de GitHub`,refresh:`Actualizar información`,wizard:`Ejecutar el asistente completo`,start:`Iniciar configuración`,close:`Cerrar sesión local`,unknown:`Sin verificar`,repository:`Repositorio`,organization:`Organización`,workflow:`Valor del workflow`,source:`Procedencia del valor`,quick:`Ajustes rápidos`,quickHelp:`Aquí puedes cambiar parámetros independientes. Para workflows, agentes, Projects, permisos o credenciales, usa el asistente completo.`,edit:`Cambiar`,details:`Todos los parámetros de los workflows`,credentials:`Credenciales`,secretHelp:`Solo se muestran nombres. GitHub no devuelve valores, propietarios ni permisos de los Secrets; su presencia no demuestra su validez.`,variables:`Parámetros de GitHub usados por estos workflows`,shadowed:`El valor del repositorio tiene prioridad`,empty:`No se han detectado entradas`,githubIncomplete:`Parte de la información de GitHub no está disponible. Los valores desconocidos siguen sin verificar; los ajustes requieren leer ambos scopes de Variables.`,current:`Valor actual`,next:`Nuevo valor`,review:`Revisar este ajuste`,back:`Volver a la configuración`,preview:`Revisar cambio`,apply:`Aplicar este ajuste`,effect:`Solo se escribe este parámetro. Se conservan workflows y Secrets. Antes de escribir, Copilot prueba Variables Write con una Variable temporal y la elimina.`,orgImpact:`Cambiarás un parámetro compartido de la organización: puede afectar a todos los repositorios con acceso. Se conservarán su visibilidad y sus accesos.`,repoImpact:`El cambio afecta únicamente a este repositorio.`,connected:`Configuración de GitHub leída. Revisa los valores actuales.`,invalid:`Elige un valor permitido. No se ha cambiado nada.`,unchanged:`Ese valor ya está en uso. No se ha cambiado nada.`,stale:`La configuración cambió durante la revisión. Revisa el valor actualizado y vuelve a intentarlo; no se ha escrito nada.`,blocked:`No se pudo confirmar el acceso. Puedes conectar con un PAT de setup corregido; tu configuración se conserva.`,updated:`Ajuste aplicado y confirmado mediante una nueva lectura de GitHub. Puedes hacer otro ajuste o cerrar la sesión.`,partial:`No se pudo confirmar la escritura. Revisa GitHub antes de reintentar; el valor anterior no se restauró automáticamente.`},fr:{checking:`Vérification de la permission pour cet ajustement. La Variable temporaire sera supprimée avant l’écriture du paramètre approuvé.`,finish:`Terminer`,finished:`Configuration mise à jour`,inspectionFinished:`Inspection de la configuration terminée`,inspectionStopped:`Inspection de la configuration interrompue`,inspectAdjustment:`Vérifiez cet ajustement avant de réessayer`,finishedBody:`Les ajustements ont été confirmés par une nouvelle lecture de GitHub. Supprimez le PAT temporaire à la fin.`,inspectionBody:`Aucun ajustement appliqué. La configuration est conservée. Tout PAT créé sur GitHub existe jusqu’à sa suppression.`,title:`Votre configuration Copilot`,unconfigured:`Copilot n’est pas configuré dans ce checkout`,detected:`Configuration détectée dans ce checkout`,incomplete:`Une partie de la configuration n’a pas pu être inspectée`,intro:`Consultez la configuration, ajustez un paramètre ou relancez l’assistant complet.`,local:`Voici les fichiers locaux. Connectez GitHub pour lire les valeurs actuelles du dépôt et de l’organisation. Ouvrir ce panneau ne modifie rien.`,startHelp:`Lancez l’assistant guidé pour choisir les workflows, agents et paramètres GitHub de ce dépôt. Vous examinerez le plan avant toute modification de configuration.`,limits:`Ce panneau décrit le checkout actuel. Il ne certifie pas la branche par défaut, l’authentification du runner, les règles de branches ni les exceptions des environnements.`,connect:`Lire la configuration GitHub`,refresh:`Actualiser`,wizard:`Relancer l’assistant complet`,start:`Configurer Copilot`,close:`Fermer la session locale`,unknown:`Non vérifié`,repository:`Dépôt`,organization:`Organisation`,workflow:`Valeur du workflow`,source:`Origine de cette valeur`,quick:`Ajustements rapides`,quickHelp:`Seuls les paramètres indépendants sont modifiables ici. Utilisez l’assistant complet pour les workflows, agents, Projects, permissions ou identifiants.`,edit:`Modifier`,details:`Tous les paramètres des workflows`,credentials:`Identifiants`,secretHelp:`Noms des Secrets uniquement. GitHub ne retourne ni valeurs, ni propriétaires, ni permissions ; leur présence ne prouve pas leur validité.`,variables:`Paramètres GitHub utilisés par ces workflows`,shadowed:`Remplacé par la valeur du dépôt`,empty:`Aucune entrée détectée`,githubIncomplete:`Certaines données GitHub sont indisponibles. Les valeurs inconnues restent non vérifiées ; les deux scopes de Variables doivent être lisibles.`,current:`Valeur actuelle`,next:`Nouvelle valeur`,review:`Vérifier cet ajustement`,back:`Retour à la configuration`,preview:`Vérifier le changement`,apply:`Appliquer cet ajustement`,effect:`Seul ce paramètre est écrit. Workflows et Secrets sont conservés. Copilot teste Variables Write avec une Variable temporaire, puis la supprime.`,orgImpact:`Ce paramètre partagé peut affecter tous les dépôts autorisés. Sa visibilité et ses accès restent identiques.`,repoImpact:`Ce changement affecte seulement ce dépôt.`,connected:`Configuration GitHub lue. Consultez les valeurs actuelles.`,invalid:`Choisissez une valeur autorisée. Aucun changement.`,unchanged:`Cette valeur est déjà appliquée. Aucun changement.`,stale:`La configuration a changé pendant votre examen. Vérifiez la nouvelle valeur et réessayez ; aucune écriture.`,blocked:`L’accès n’a pas été confirmé. Reconnectez un PAT de configuration corrigé ; la configuration est conservée.`,updated:`Ajustement appliqué et relu depuis GitHub. Vous pouvez continuer ou fermer la session.`,partial:`L’écriture n’a pas été confirmée. Vérifiez GitHub avant de réessayer ; la valeur précédente n’a pas été restaurée automatiquement.`},pt:{checking:`A verificar a permissão para este ajuste. A Variable temporária será eliminada antes de escrever o parâmetro aprovado.`,finish:`Terminar`,finished:`Configuração atualizada`,inspectionFinished:`Inspeção da configuração concluída`,inspectionStopped:`Inspeção da configuração interrompida`,inspectAdjustment:`Verifique este ajuste antes de tentar novamente`,finishedBody:`Os ajustes foram confirmados por uma nova leitura do GitHub. Elimine o PAT temporário de setup ao terminar.`,inspectionBody:`Nenhum ajuste aplicado. A configuração é preservada. Os PAT criados no GitHub existem até os eliminar.`,title:`A sua configuração Copilot`,unconfigured:`Copilot não está configurado neste checkout`,detected:`Configuração detetada neste checkout`,incomplete:`Parte da configuração não pôde ser inspecionada`,intro:`Veja a configuração, ajuste um parâmetro ou execute o assistente completo novamente.`,local:`Estes são os ficheiros locais. Ligue ao GitHub para ler os valores atuais do repositório e da organização. Abrir este painel não altera nada.`,startHelp:`Inicie o assistente guiado para escolher workflows, agentes e parâmetros GitHub para este repositório. Irá rever o plano antes de aplicar alterações de configuração.`,limits:`Este painel descreve o checkout atual. Não certifica o branch predefinido, a autenticação do runner, as regras de branches nem exceções dos ambientes.`,connect:`Ler configuração do GitHub`,refresh:`Atualizar informação`,wizard:`Executar o assistente completo`,start:`Configurar Copilot`,close:`Fechar sessão local`,unknown:`Não verificado`,repository:`Repositório`,organization:`Organização`,workflow:`Valor do workflow`,source:`Origem do valor`,quick:`Ajustes rápidos`,quickHelp:`Aqui pode alterar parâmetros independentes. Use o assistente completo para workflows, agentes, Projects, permissões ou credenciais.`,edit:`Alterar`,details:`Todos os parâmetros dos workflows`,credentials:`Credenciais`,secretHelp:`Apenas nomes dos Secrets. GitHub não devolve valores, contas ou permissões; a presença não comprova a validade.`,variables:`Parâmetros GitHub usados por estes workflows`,shadowed:`Substituído pelo valor do repositório`,empty:`Nenhuma entrada detetada`,githubIncomplete:`Alguns dados GitHub estão indisponíveis. Os valores desconhecidos continuam não verificados; os dois scopes de Variables devem poder ser lidos.`,current:`Valor atual`,next:`Novo valor`,review:`Rever este ajuste`,back:`Voltar à configuração`,preview:`Rever alteração`,apply:`Aplicar este ajuste`,effect:`Só este parâmetro é escrito. Workflows e Secrets são preservados. Copilot testa Variables Write com uma Variable temporária e depois elimina-a.`,orgImpact:`Este parâmetro partilhado pode afetar todos os repositórios autorizados. A visibilidade e os acessos são preservados.`,repoImpact:`Esta alteração afeta apenas este repositório.`,connected:`Configuração GitHub lida. Reveja os valores atuais.`,invalid:`Escolha um valor permitido. Nada foi alterado.`,unchanged:`Este valor já está aplicado. Nada foi alterado.`,stale:`A configuração mudou durante a revisão. Reveja o valor atualizado e tente novamente; nada foi escrito.`,blocked:`O acesso não foi confirmado. Ligue um PAT de setup corrigido; a configuração é preservada.`,updated:`Ajuste aplicado e confirmado por uma nova leitura do GitHub. Pode continuar ou fechar a sessão.`,partial:`A escrita não foi confirmada. Verifique GitHub antes de tentar novamente; o valor anterior não foi restaurado automaticamente.`}},ea={assignees:[`Issue assignees`,`Responsables de issues`,`Responsables des issues`,`Responsáveis pelas issues`],reviewers:[`PR reviewers`,`Revisores de PRs`,`Relecteurs des PRs`,`Revisores de PRs`],inactivity:[`Close waiting issues after (hours)`,`Cerrar issues en espera tras (horas)`,`Fermer les issues en attente après (heures)`,`Fechar issues em espera após (horas)`],reopen:[`Reopen issues after a push`,`Reabrir issues tras un push`,`Rouvrir les issues après un push`,`Reabrir issues após um push`],description:[`PR description updates`,`Actualizaciones de la descripción de PRs`,`Mise à jour des descriptions de PRs`,`Atualizações da descrição de PRs`],members:[`Limit AI interactions to members`,`Limitar interacciones de IA a miembros`,`Limiter l’IA aux membres`,`Limitar interações de IA a membros`],reasoning:[`Include AI reasoning`,`Incluir razonamiento de IA`,`Inclure le raisonnement de l’IA`,`Incluir raciocínio da IA`],severity:[`Minimum finding severity`,`Severidad mínima de findings`,`Gravité minimale des findings`,`Gravidade mínima dos findings`],commentLimit:[`Maximum review comments`,`Máximo de comentarios por revisión`,`Maximum de commentaires par analyse`,`Máximo de comentários por revisão`],dryRun:[`Preview findings without publishing`,`Analizar findings sin publicarlos`,`Analyser sans publier les findings`,`Analisar findings sem publicar`],effort:[`Review depth`,`Profundidad de revisión`,`Profondeur de l’analyse`,`Profundidade da revisão`],drafts:[`Review draft PRs`,`Revisar PRs en borrador`,`Analyser les PRs en brouillon`,`Rever PRs em rascunho`],suggestions:[`Publish suggested code changes`,`Publicar cambios de código sugeridos`,`Publier des suggestions de code`,`Publicar sugestões de código`],telemetry:[`Include review metrics`,`Incluir métricas de revisión`,`Inclure les métriques d’analyse`,`Incluir métricas de revisão`]},ta=e=>$i[e],na=(e,t)=>ea[e]?.[[`en`,`es`,`fr`,`pt`].indexOf(t)]??e,ra={true:[`On`,`Activado`,`Activé`,`Ativado`],false:[`Off`,`Desactivado`,`Désactivé`,`Desativado`],replace:[`Replace the description`,`Sustituir la descripción`,`Remplacer la description`,`Substituir a descrição`],append:[`Add to the description`,`Añadir a la descripción`,`Compléter la description`,`Acrescentar à descrição`],preserve:[`Keep the description`,`Conservar la descripción`,`Conserver la description`,`Preservar a descrição`],disabled:[`Disabled`,`Desactivado`,`Désactivé`,`Desativado`],info:[`Informational`,`Informativo`,`Information`,`Informativo`],low:[`Low`,`Bajo`,`Faible`,`Baixo`],medium:[`Medium`,`Medio`,`Moyen`,`Médio`],high:[`High`,`Alto`,`Élevé`,`Alto`],smart:[`Automatic`,`Automático`,`Automatique`,`Automático`],default:[`Standard`,`Estándar`,`Standard`,`Padrão`]},ia=(e,t)=>ra[e]?.[[`en`,`es`,`fr`,`pt`].indexOf(t)]??e,aa=U(`

                                            `,1),oa=U(`
                                          1. `),sa=U(`
                                              `,1),ca=U(``);function la(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`management`,8,!1),s=X(t,`journey`,8),c=[`repository`,`choices`,`setupPat`,`plan`,`botPat`,`apply`];L(()=>(H(s()),Qi),()=>{M(a,s()?.complete?.map(Qi)??[])}),En(),Ai();var l=ca(),u=N(l),d=I(N(u)),f=F(I(N(d)),!0);D(d),D(u);var p=I(u,2),m=e=>{var t=aa(),r=P(t),i=F(r,!0),a=F(I(r,2),!0);R((e,t)=>{G(i,e),G(a,t)},[()=>(H(ta),n(),V(()=>ta(n()).title)),()=>(H(ta),n(),V(()=>ta(n()).quickHelp))]),W(e,t)},h=e=>{var t=sa(),r=P(t),i=F(r,!0),o=I(r,2);J(o,5,()=>c,q,(e,t,r)=>{var i=oa();let o;var c=N(i),l=F(c,!0),u=F(I(c,2),!0);D(i),R((e,t,n,r,a)=>{Y(i,`aria-current`,e),o=li(i,1,``,null,o,{current:t,completed:n}),G(l,r),G(u,a)},[()=>(H(s()),B(a),B(t),V(()=>s()?.position===r+1&&!B(a).includes(B(t))?`step`:void 0)),()=>s()?.position===r+1&&!B(a).includes(B(t)),()=>B(a).includes(B(t)),()=>(B(a),B(t),V(()=>B(a).includes(B(t))?`✓`:String(r+1).padStart(2,`0`))),()=>(H(Z),B(t),n(),V(()=>Z(B(t),n())))]),W(e,i)}),D(o),R(e=>G(i,e),[()=>(H(Z),n(),V(()=>Z(`journey`,n())))]),W(e,t)};K(p,e=>{o()?e(m):e(h,-1)});var g=I(p,2),_=I(N(g)),v=N(_),y=F(v,!0),b=F(I(v),!0);D(_),D(g),D(l),R((e,t,n,r)=>{Y(l,`aria-label`,e),G(f,t),G(y,n),G(b,r)},[()=>(H(Z),n(),V(()=>Z(`progress`,n()))),()=>(H(Z),n(),V(()=>Z(`studio`,n()))),()=>(H(Z),n(),V(()=>Z(`localDesign`,n()))),()=>(H(Z),n(),V(()=>Z(`localDesignBody`,n())))]),W(e,l),Je(),i()}var ua=U(`
                                              `);function da(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(`system`);L(()=>B(a),()=>{document.documentElement.dataset.theme=B(a)}),En(),Ai();var o=ua(),s=N(o);let c;var l=F(s,!0),u=I(s,2);let d;var f=I(u,2);let p;D(o),R((e,t,n,r,i,m,h,g)=>{Y(o,`aria-label`,e),Y(s,`aria-pressed`,B(a)===`system`),Y(s,`aria-label`,t),Y(s,`title`,n),c=li(s,1,``,null,c,{active:B(a)===`system`}),G(l,r),Y(u,`aria-pressed`,B(a)===`light`),Y(u,`aria-label`,i),Y(u,`title`,m),d=li(u,1,``,null,d,{active:B(a)===`light`}),Y(f,`aria-pressed`,B(a)===`dark`),Y(f,`aria-label`,h),Y(f,`title`,g),p=li(f,1,``,null,p,{active:B(a)===`dark`})},[()=>(H(Z),n(),V(()=>Z(`theme`,n()))),()=>(H(Z),n(),V(()=>Z(`themeSystem`,n()))),()=>(H(Z),n(),V(()=>Z(`themeSystem`,n()))),()=>(H(Z),n(),V(()=>Z(`themeAuto`,n()))),()=>(H(Z),n(),V(()=>Z(`themeLight`,n()))),()=>(H(Z),n(),V(()=>Z(`themeLight`,n()))),()=>(H(Z),n(),V(()=>Z(`themeDark`,n()))),()=>(H(Z),n(),V(()=>Z(`themeDark`,n())))]),Cr(`click`,s,()=>M(a,`system`)),Cr(`click`,u,()=>M(a,`light`)),Cr(`click`,f,()=>M(a,`dark`)),W(e,o),Je(),i()}wr([`click`]);var fa=U(``),pa=U(` `,1);function ma(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi();function a(e){let t=e.currentTarget.value;qi.includes(t)&&Q.set(t)}Ai();var o=pa(),s=P(o),c=N(s),l=I(c);J(l,5,()=>qi,q,(e,t)=>{var n=fa(),r=F(n,!0),i={};R(()=>{G(r,Ji[B(t)]),i!==(i=B(t))&&(n.value=(n.__value=i)??``)}),W(e,n)}),D(l);var u;pi(l),D(s);var d=F(I(s,2),!0);R((e,t)=>{G(c,`${e??``} `),Y(l,`aria-label`,t),u!==(u=n())&&(l.value=(l.__value=u)??``,fi(l,u)),G(d,Ji[n()])},[()=>Z(`language`,n()),()=>Z(`language`,n())]),Cr(`change`,l,a),W(e,o),Je(),i()}wr([`change`]);var ha=U(``),ga=U(`
                                              `);function _a(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`repository`,8),o=X(t,`closed`,8,!1);Ai();var s=ga(),c=N(s),l=N(c),u=F(l,!0),d=I(l,2),f=F(N(d),!0);D(d),D(c);var p=I(c,2),m=N(p),h=N(m),g=e=>{W(e,ha())};K(h,e=>{o()||e(g)});var _=I(h);D(m);var v=I(m);ma(v,{}),da(I(v),{}),D(p),D(s),R((e,t,n)=>{G(u,e),G(f,t),G(_,` ${n??``}`)},[()=>(H(Z),n(),V(()=>Z(`setup`,n()))),()=>(H(a()),H(Z),n(),V(()=>a()??Z(`connecting`,n()))),()=>(H(Z),H(o()),n(),V(()=>Z(o()?`sessionClosed`:`localSession`,n())))]),W(e,s),Je(),i()}var va={"setup.scope":{title:`Choose setup scope`,description:`This repository keeps the local preview and Apply flow. Several repositories lets you explicitly select 1–25 targets in the same organization and create reviewed setup PRs. Batch setup does not merge, create tags, release or deploy.`,choices:[`This repository`,`Several repositories in this organization`]},"setup.batchSource":{title:`Where should configuration come from?`,description:`Reuse compatible organization settings to skip completed questions, or customize repository settings. Batch setup keeps existing Secret bindings in both paths. Provision missing credentials separately, then inspect again; shared values are never replaced.`,choices:[`Reuse organization configuration`,`Customize settings; keep existing Secrets`]},"batch.token":{title:`Temporary PAT for selected repositories`,description:`Create a temporary setup PAT limited to these repositories: {repositories}. The GitHub link proposes grants; select only the intended repositories yourself. Leave blank to keep the current PAT. The final plan rechecks exact permissions. Delete temporary setup PATs afterwards.`},"setup.source":{title:`Where should configuration come from?`,description:`Reuse compatible organization Variables and existing Secret bindings, keeping repository overrides. Only missing, invalid or repository-specific settings are asked again. Shared values are preserved; reviewed differences become repository overrides. Choose Customize to provision or replace credentials.`,choices:[`Reuse organization configuration`,`Customize configuration`]},"setup.reusePatReview":{title:`Review organization reuse access`,description:`These provisional grants inspect existing organization configuration and allow repository setup. Shared Secret values are never requested or replaced. The final plan rechecks exact permissions; authentication evidence can remain pending. Select only the intended repositories in GitHub and delete the temporary PAT afterwards.`,choices:[`Continue to GitHub`,`Enter a PAT manually`]},"botPat.scopeConflict":{title:`Resolve the bot PAT scope conflict`,description:`Repository Secret PAT in {repository} overrides the selected organization PAT. Delete the repository Secret in GitHub, then ask Copilot to check again, or change the PAT scope to this repository. Your setup answers are retained. Copilot will not delete any Secret.`,choices:[`I have deleted the repository PAT — check again`,`Store PAT in the repository instead`,`Stop setup`]},"botPat.scopeConflictUnavailable":{title:`Resolve the bot PAT scope conflict`,description:`GitHub could not confirm whether the repository PAT was removed. The conflict remains unresolved. Your setup answers are retained. Check access and try again, change the PAT scope to this repository, or stop setup.`,choices:[`I have deleted the repository PAT — check again`,`Store PAT in the repository instead`,`Stop setup`]},"repository.confirm":{title:`Confirm this repository`,description:`This checkout points to {repository} on branch {branch}. Confirm the target before configuring PAT access or files.`,choices:[`Yes, this is my repository`,`Stop and choose another checkout`]},"setup.depth":{title:`Choose how much detail to review`,description:`Basic still asks about permissions, security, branch roles, Projects, approval and storage. Selected advanced agent, branch-prefix and Bugbot settings keep their defaults; inspect and edit them in the final plan. Custom asks every applicable question. Neither path applies changes now.`,choices:[`Basic guided setup (recommended)`,`Customize every setting`]},"setup.environmentPat":{title:`An environment setup PAT is available`,description:`The value stays in the CLI process. Continuing starts identity checks and isolated temporary create/read/delete tests before planning. Installation requires final approval. Exiting Copilot cannot unset your parent shell variable.`,choices:[`Use the environment PAT`,`Create or enter a different PAT`]},"plan.review":{title:`Review your setup plan`,description:`Inspect the affected files, workflows, Variables and Secret names before approving. No setup changes start by opening this plan.`},"workflow.update":{title:`Update existing workflows?`,description:`These existing workflow files differ from the setup plan: {files}. Keeping them may leave some new settings inactive.`,choices:[`Keep existing`,`Update setup-managed workflows`]},"setupPat.method":{title:`How will you provide your setup PAT?`,description:`This temporary PAT authorizes this one setup run. GitHub creates it under your operator account; Copilot cannot revoke it for you.`,choices:[`Guided GitHub link`,`Manual PAT`]},"setupPat.ownerKind":{title:`Who owns this repository on GitHub?`,description:`The owner determines which organization permissions may be needed. Check the repository header on GitHub if unsure.`,choices:[`Organization`,`Personal account`,`Not sure`]},"setupPat.review":{title:`Review provisional setup PAT permissions`,description:`These grants follow your choices. When managing Secrets, the link prefills Actions, Contents and Workflows write for possible health checks. Those checks run only if the approved plan requires them. GitHub inspection may reveal other requirements.`,choices:[`Continue to GitHub`,`Review setup choices again`,`View full permission table`,`Enter a PAT manually`]},"setupPat.entry":{title:`Temporary setup PAT`,description:`Open GitHub as your operator account, complete 2FA, choose “Only select repositories”, select this repository and copy the generated PAT here. This PAT is for this run only; delete it on GitHub afterwards.`},"setupPat.confirmAccount":{title:`GitHub authenticated the setup PAT as @{account}`,description:`Is this the operator account that should configure this repository? A wrong account must stop before any setup change.`,choices:[`Yes, continue`,`No, stop`]},"setupPat.confirmUnverifiedAccess":{title:`Check the PAT grants marked Unverifiable`,description:`Verified rows already passed. Compare each required Unverifiable row with the scope and access level in your GitHub PAT settings. Read-only checks cannot prove Write; Unverifiable does not mean missing. Check Projects: read only if that row is Unverifiable. Continue only after checking every such grant.`,choices:[`No, stop`,`Yes, I checked them`]},"botPat.method":{title:`How will you provide the bot PAT?`,description:`The bot PAT is separate from the setup PAT. It belongs to the account that will run future GitHub Actions and is stored as a Secret after approval.`,choices:[`Guided GitHub link`,`Manual PAT`]},"botPat.login":{title:`Expected GitHub bot login`,description:`Enter the bot account login without @. Copilot resolves its numeric GitHub ID and compares it with the PAT owner.`},"botPat.entry.guided":{title:`{name} — bot account PAT`,description:`Open GitHub as @{account} (account ID {accountId}), not as the setup operator. Select only this repository, review all grants and paste the PAT here. Suggested expiry: 90 days. An existing Secret value cannot be read back.`},"botPat.entry.manual":{title:`{name} — bot account PAT`,description:`Use the bot account, select only the intended repository and review all grants before pasting its PAT. Suggested expiry: 90 days. An existing Secret value cannot be read back.`},"botPat.identityMismatch":{title:`This PAT belongs to a different GitHub account`,description:`The PAT belongs to @{actual}; the selected bot is @{expected}. No bot Secret was written. Your answers and approved plan are retained. Delete the unused PAT in GitHub, switch to @{expected}, then choose whether to enter another PAT or stop setup.`,choices:[`Enter another bot PAT`,`Stop setup`]},"credential.apiKey":{title:`{name} — {provider} API key`,description:`Paste the API key for {provider}. It is sent only to this local setup process and, if approved, installed as a GitHub Actions Secret. Existing Secret values cannot be read back.`},"credential.existing":{title:`Existing {name}: {status}`,description:`GitHub cannot reveal the current Secret value. Keep it only if you deliberately accept that its health cannot be verified here; replace or skip it otherwise.`,choices:[`Keep existing`,`Replace it`,`Skip this credential`]},"apply.confirm":{title:`Apply this setup now?`,description:`This is the final approval. Local files and selected GitHub resources may change. A partial result may require inspection before retrying.`,choices:[`Apply setup`,`Stop without applying`]},"management.token":{title:`Temporary setup PAT`,description:`Read configuration from GitHub with a setup PAT. Read access is enough for inspection; changes require Variables Write and a separate approval. Secrets are shown by name only. Leave blank to return to the panel.`},"management.tokenWrite":{title:`Setup PAT for this adjustment`,description:`Use Variables Write in the reviewed scope. After approval, verification creates and removes one temporary Variable. Leave blank to return to the panel.`}},ya={"setup.scope":{title:`Elige el alcance del setup`,description:`Este repositorio conserva la vista previa y la aplicación local. Varios repositorios permite seleccionar entre 1 y 25 destinos de la misma organización y crear PRs de setup para revisarlas. El lote no hace merge, crea tags, publica versiones ni despliega.`,choices:[`Este repositorio`,`Varios repositorios de esta organización`]},"setup.batchSource":{title:`¿De dónde debe venir la configuración?`,description:`Reutiliza los ajustes compatibles de la organización para saltar preguntas ya resueltas, o personaliza los ajustes del repositorio. En ambos casos, el lote conserva los Secrets existentes. Crea por separado las credenciales que falten y vuelve a inspeccionar; los valores compartidos no se sustituyen.`,choices:[`Reutilizar configuración de la organización`,`Personalizar ajustes; conservar Secrets`]},"batch.token":{title:`PAT temporal para los repositorios seleccionados`,description:`Crea un PAT temporal de setup limitado a estos repositorios: {repositories}. El enlace propone permisos; selecciona tú solo los repositorios previstos en GitHub. Déjalo vacío para conservar el PAT actual. El plan final vuelve a comprobar los permisos exactos. Elimina después los PATs temporales de setup.`},"setup.source":{title:`¿De dónde debe venir la configuración?`,description:`Reutiliza las Variables compatibles y los Secrets existentes de la organización, conservando los ajustes del repositorio. Solo se preguntan los ajustes que falten, sean inválidos o dependan del repositorio. Los valores compartidos se conservan; las diferencias revisadas se guardan en el repositorio. Elige Personalizar para crear o sustituir credenciales.`,choices:[`Reutilizar configuración de la organización`,`Personalizar configuración`]},"setup.reusePatReview":{title:`Revisa el acceso para reutilizar configuración`,description:`Estos permisos provisionales permiten inspeccionar la configuración existente y configurar el repositorio. No se piden ni sustituyen los valores de los Secrets compartidos. El plan final comprueba los permisos exactos; la verificación de las credenciales puede quedar pendiente. Selecciona solo los repositorios previstos en GitHub y elimina después el PAT temporal.`,choices:[`Continuar a GitHub`,`Introducir un PAT manualmente`]},"botPat.scopeConflict":{title:`Resuelve el conflicto de scope del PAT del bot`,description:`El Secret PAT del repositorio {repository} tiene prioridad sobre el PAT de organización seleccionado. Elimina el Secret del repositorio en GitHub y pide a Copilot que lo compruebe de nuevo, o cambia el scope del PAT a este repositorio. Tus respuestas se conservan. Copilot no eliminará ningún Secret.`,choices:[`Ya he eliminado el PAT del repositorio — comprobar de nuevo`,`Guardar PAT en el repositorio`,`Detener setup`]},"botPat.scopeConflictUnavailable":{title:`Resuelve el conflicto de scope del PAT del bot`,description:`GitHub no ha permitido confirmar si se eliminó el PAT del repositorio. El conflicto sigue sin resolverse. Tus respuestas se conservan. Comprueba el acceso y vuelve a intentarlo, cambia el scope del PAT a este repositorio o detén el setup.`,choices:[`Ya he eliminado el PAT del repositorio — comprobar de nuevo`,`Guardar PAT en el repositorio`,`Detener setup`]},"botPat.identityMismatch":{title:`Este PAT pertenece a otra cuenta de GitHub`,description:`El PAT pertenece a @{actual}; el bot seleccionado es @{expected}. No se ha escrito el Secret del bot. Conservamos tus respuestas y el plan aprobado. Elimina el PAT sin usar en GitHub, cambia a @{expected} y elige si quieres introducir otro PAT o detener el setup.`,choices:[`Introducir otro PAT del bot`,`Detener setup`]},"repository.confirm":{title:`Confirma el repositorio`,description:`Este checkout apunta a {repository} en la rama {branch}. Comprueba el destino antes de configurar permisos del PAT o archivos.`,choices:[`Sí, es mi repositorio`,`Detener y elegir otro checkout`]},"setup.depth":{title:`Elige cuánto detalle quieres revisar`,description:`El modo básico sigue preguntando por permisos, seguridad, ramas, Projects, aprobación y almacenamiento. Algunos ajustes avanzados de agentes, prefijos de rama y Bugbot conservan sus valores predeterminados; podrás revisarlos y editarlos en el plan final. El modo personalizado pregunta por todos los ajustes aplicables. Ninguno aplica cambios todavía.`,choices:[`Configuración básica guiada (recomendada)`,`Personalizar todos los ajustes`]},"setup.environmentPat":{title:`Hay un PAT de configuración en el entorno`,description:`El valor permanece en el proceso CLI. Al continuar se comprueba la identidad y se crean, leen y eliminan recursos temporales antes de preparar el plan. La instalación requiere aprobación final. Cerrar Copilot no elimina la variable de la terminal original.`,choices:[`Usar el PAT del entorno`,`Crear o introducir otro PAT`]},"plan.review":{title:`Revisa el plan de configuración`,description:`Comprueba los archivos, workflows, Variables y nombres de Secrets antes de aprobar. Abrir el plan no inicia ningún cambio.`},"workflow.update":{title:`¿Actualizar los workflows existentes?`,description:`Estos archivos difieren del plan: {files}. Si los conservas, algunos ajustes nuevos podrían no activarse.`,choices:[`Conservar los existentes`,`Actualizar los workflows gestionados`]},"setupPat.method":{title:`¿Cómo proporcionarás el PAT de configuración?`,description:`Este PAT temporal autoriza una sola ejecución. GitHub lo crea con tu cuenta de operador; Copilot no puede revocarlo por ti.`,choices:[`Enlace guiado de GitHub`,`Introducir PAT manualmente`]},"setupPat.ownerKind":{title:`¿Quién es propietario de este repositorio en GitHub?`,description:`El propietario determina qué permisos de organización pueden hacer falta. Consulta la cabecera del repositorio en GitHub si dudas.`,choices:[`Organización`,`Cuenta personal`,`No lo sé`]},"setupPat.review":{title:`Revisa los permisos provisionales del PAT de configuración`,description:`Estos permisos dependen de tus elecciones. Si gestionas Secrets, el enlace preselecciona Actions, Contents y Workflows en escritura para posibles comprobaciones de credenciales. Esas comprobaciones solo se ejecutan si el plan aprobado las necesita. La inspección de GitHub puede revelar otros requisitos.`,choices:[`Continuar en GitHub`,`Revisar de nuevo las opciones`,`Ver la tabla completa de permisos`,`Introducir un PAT manualmente`]},"setupPat.entry":{title:`PAT temporal de configuración`,description:`Abre GitHub con tu cuenta de operador, completa el 2FA, elige «Only select repositories», selecciona este repositorio y pega aquí el PAT generado. Es solo para esta ejecución; elimínalo en GitHub después.`},"setupPat.confirmAccount":{title:`GitHub autenticó el PAT de configuración como @{account}`,description:`¿Es la cuenta de operador que debe configurar este repositorio? Una cuenta incorrecta debe detener el proceso antes de cualquier cambio.`,choices:[`Sí, continuar`,`No, detener`]},"setupPat.confirmUnverifiedAccess":{title:`Comprueba los permisos del PAT marcados como No verificable`,description:`Los permisos Verificados ya pasaron la comprobación. Compara cada permiso obligatorio No verificable con su ámbito y nivel de acceso en los ajustes del PAT en GitHub. Una consulta de solo lectura no demuestra Escritura; No verificable no significa ausente. Comprueba Projects: lectura solo si esa fila aparece como No verificable. Continúa únicamente tras comprobar todos esos permisos.`,choices:[`No, detener`,`Sí, los he comprobado`]},"botPat.method":{title:`¿Cómo proporcionarás el PAT del bot?`,description:`Es distinto del PAT de configuración. Pertenece a la cuenta que ejecutará las futuras GitHub Actions y se instalará como Secret tras la aprobación.`,choices:[`Enlace guiado de GitHub`,`Introducir PAT manualmente`]},"botPat.login":{title:`Usuario previsto del bot en GitHub`,description:`Introduce el nombre de usuario del bot sin @. Copilot consultará su ID numérico de GitHub y lo comparará con el propietario del PAT.`},"botPat.entry.guided":{title:`{name} — PAT de la cuenta bot`,description:`Abre GitHub como @{account} (ID {accountId}), no como operador de setup. Selecciona solo este repositorio, revisa todos los permisos y pega aquí el PAT. Caducidad sugerida: 90 días. El valor de un Secret existente no puede leerse.`},"botPat.entry.manual":{title:`{name} — PAT de la cuenta bot`,description:`Usa la cuenta bot, selecciona solo el repositorio previsto y revisa todos los permisos antes de pegar el PAT. Caducidad sugerida: 90 días. El valor de un Secret existente no puede leerse.`},"credential.apiKey":{title:`{name} — clave API de {provider}`,description:`Pega la clave API de {provider}. Solo se envía a este proceso local y, si apruebas el plan, se instala como Secret de GitHub Actions. Los valores existentes no pueden leerse.`},"credential.existing":{title:`{name} existente: {status}`,description:`GitHub no muestra el valor actual del Secret. Consérvalo solo si aceptas expresamente que aquí no se puede comprobar su estado; de lo contrario, sustitúyelo u omítelo.`,choices:[`Conservar`,`Sustituir`,`Omitir esta credencial`]},"apply.confirm":{title:`¿Aplicar la configuración ahora?`,description:`Esta es la aprobación final. Pueden cambiar archivos locales y recursos de GitHub seleccionados. Si el resultado es parcial, revísalo antes de reintentar.`,choices:[`Aplicar configuración`,`Detener sin aplicar`]},"management.token":{title:`PAT temporal de setup`,description:`Lee la configuración de GitHub con un PAT de setup. Leer basta para inspeccionar; los cambios requieren Variables Write y aprobación independiente. Solo se muestran nombres de Secrets. Deja el campo vacío para volver al panel.`},"management.tokenWrite":{title:`PAT de setup para este ajuste`,description:`Usa Variables Write en el ámbito revisado. Tras aprobar, la verificación crea y elimina una Variable temporal. Deja el campo vacío para volver al panel.`}},ba={"setup.scope":{title:`Choisissez la portée de la configuration`,description:`Ce dépôt conserve l’aperçu et l’application locale. Plusieurs dépôts permet de sélectionner explicitement 1 à 25 destinations de la même organisation et de créer des PR à examiner. Le lot ne fusionne pas, ne crée pas de tag, ne publie pas et ne déploie pas.`,choices:[`Ce dépôt`,`Plusieurs dépôts de cette organisation`]},"setup.batchSource":{title:`D’où doit venir la configuration ?`,description:`Réutilisez les réglages compatibles de l’organisation pour passer les questions déjà résolues, ou personnalisez les réglages du dépôt. Dans les deux cas, le lot conserve les Secrets existants. Créez séparément les identifiants manquants puis inspectez à nouveau ; les valeurs partagées ne sont jamais remplacées.`,choices:[`Réutiliser la configuration de l’organisation`,`Personnaliser les réglages ; conserver les Secrets`]},"batch.token":{title:`PAT temporaire pour les dépôts sélectionnés`,description:`Créez un PAT temporaire limité à ces dépôts : {repositories}. Le lien propose des autorisations ; sélectionnez vous-même uniquement les dépôts prévus dans GitHub. Laissez vide pour conserver le PAT actuel. Le plan final vérifie à nouveau les autorisations exactes. Supprimez ensuite les PAT temporaires de configuration.`},"setup.source":{title:`D’où doit venir la configuration ?`,description:`Réutilisez les Variables compatibles et les Secrets existants de l’organisation en conservant les réglages du dépôt. Seuls les réglages manquants, invalides ou propres au dépôt seront demandés. Les valeurs partagées sont conservées ; les différences validées sont enregistrées dans le dépôt. Choisissez Personnaliser pour créer ou remplacer des identifiants.`,choices:[`Réutiliser la configuration de l’organisation`,`Personnaliser la configuration`]},"setup.reusePatReview":{title:`Vérifiez l’accès pour réutiliser la configuration`,description:`Ces autorisations provisoires permettent de lire la configuration existante et de configurer le dépôt. Les valeurs des Secrets partagés ne sont jamais demandées ni remplacées. Le plan final vérifie les autorisations exactes ; la vérification des identifiants peut rester en attente. Sélectionnez uniquement les dépôts prévus dans GitHub puis supprimez le PAT temporaire.`,choices:[`Continuer vers GitHub`,`Saisir un PAT manuellement`]},"botPat.scopeConflict":{title:`Résoudre le conflit de périmètre du PAT du bot`,description:`Le Secret PAT du dépôt {repository} est prioritaire sur le PAT d’organisation sélectionné. Supprimez le Secret du dépôt dans GitHub, puis demandez à Copilot de vérifier à nouveau, ou choisissez le périmètre du dépôt pour le PAT. Vos réponses sont conservées. Copilot ne supprimera aucun Secret.`,choices:[`J’ai supprimé le PAT du dépôt — vérifier à nouveau`,`Enregistrer le PAT dans le dépôt`,`Arrêter la configuration`]},"botPat.scopeConflictUnavailable":{title:`Résoudre le conflit de périmètre du PAT du bot`,description:`GitHub n’a pas permis de confirmer la suppression du PAT du dépôt. Le conflit reste non résolu. Vos réponses sont conservées. Vérifiez l’accès et réessayez, choisissez le périmètre du dépôt pour le PAT ou arrêtez la configuration.`,choices:[`J’ai supprimé le PAT du dépôt — vérifier à nouveau`,`Enregistrer le PAT dans le dépôt`,`Arrêter la configuration`]},"botPat.identityMismatch":{title:`Ce PAT appartient à un autre compte GitHub`,description:`Le PAT appartient à @{actual} ; le bot sélectionné est @{expected}. Aucun Secret du bot n’a été écrit. Vos réponses et le plan approuvé sont conservés. Supprimez le PAT inutilisé dans GitHub, passez à @{expected}, puis choisissez de saisir un autre PAT ou d’arrêter la configuration.`,choices:[`Saisir un autre PAT du bot`,`Arrêter la configuration`]},"repository.confirm":{title:`Confirmez ce dépôt`,description:`Ce dossier pointe vers {repository}, branche {branch}. Vérifiez la cible avant de configurer les accès PAT ou les fichiers.`,choices:[`Oui, c’est mon dépôt`,`Arrêter et choisir un autre dossier`]},"setup.depth":{title:`Choisissez le niveau de détail`,description:`Le parcours de base demande toujours les autorisations, la sécurité, les branches, Projects, l’approbation et le stockage. Certains réglages avancés des agents, préfixes de branche et Bugbot conservent leurs valeurs par défaut ; vous pourrez les examiner et les modifier dans le plan final. Le parcours personnalisé pose toutes les questions applicables. Aucun changement n’est appliqué à ce stade.`,choices:[`Configuration de base guidée (recommandée)`,`Personnaliser tous les réglages`]},"setup.environmentPat":{title:`Un PAT de configuration est disponible dans l’environnement`,description:`La valeur reste dans le processus CLI. Continuer lance la vérification de l’identité puis des tests temporaires isolés de création, lecture et suppression avant le plan. L’installation exige une approbation finale. Quitter Copilot ne supprime pas la variable du shell parent.`,choices:[`Utiliser le PAT de l’environnement`,`Créer ou saisir un autre PAT`]},"plan.review":{title:`Examinez le plan de configuration`,description:`Vérifiez les fichiers, workflows, Variables et noms de Secrets avant d’approuver. Ouvrir le plan ne lance aucun changement.`},"workflow.update":{title:`Mettre à jour les workflows existants ?`,description:`Ces fichiers diffèrent du plan : {files}. Les conserver peut laisser certains nouveaux réglages inactifs.`,choices:[`Conserver les fichiers existants`,`Mettre à jour les workflows gérés`]},"setupPat.method":{title:`Comment fournirez-vous le PAT de configuration ?`,description:`Ce PAT temporaire autorise une seule exécution. GitHub le crée avec votre compte opérateur ; Copilot ne peut pas le révoquer à votre place.`,choices:[`Lien GitHub guidé`,`Saisir un PAT manuellement`]},"setupPat.ownerKind":{title:`À qui appartient ce dépôt sur GitHub ?`,description:`Le propriétaire détermine les éventuelles autorisations d’organisation. Consultez l’en-tête du dépôt sur GitHub en cas de doute.`,choices:[`Organisation`,`Compte personnel`,`Je ne sais pas`]},"setupPat.review":{title:`Examinez les autorisations provisoires du PAT de configuration`,description:`Ces droits suivent vos choix. Si vous gérez des Secrets, le lien présélectionne Actions, Contents et Workflows en écriture pour les éventuelles vérifications des identifiants. Ces vérifications ne démarrent que si le plan approuvé les exige. L’inspection de GitHub peut révéler d’autres besoins.`,choices:[`Continuer sur GitHub`,`Revoir les choix de configuration`,`Voir toutes les autorisations`,`Saisir un PAT manuellement`]},"setupPat.entry":{title:`PAT temporaire de configuration`,description:`Ouvrez GitHub avec votre compte opérateur, effectuez la 2FA, choisissez « Only select repositories », sélectionnez ce dépôt puis collez ici le PAT généré. Il ne sert qu’à cette exécution ; supprimez-le sur GitHub ensuite.`},"setupPat.confirmAccount":{title:`GitHub a authentifié le PAT de configuration comme @{account}`,description:`Est-ce bien le compte opérateur autorisé à configurer ce dépôt ? Un autre compte doit arrêter le processus avant tout changement.`,choices:[`Oui, continuer`,`Non, arrêter`]},"setupPat.confirmUnverifiedAccess":{title:`Vérifiez les droits du PAT marqués Non vérifiable`,description:`Les lignes Vérifiées ont déjà passé le contrôle. Comparez chaque droit requis Non vérifiable avec sa portée et son niveau d’accès dans les paramètres du PAT GitHub. Une lecture seule ne prouve pas le niveau Écriture ; Non vérifiable ne signifie pas absent. Vérifiez Projects : lecture seulement si cette ligne est Non vérifiable. Continuez uniquement après avoir vérifié tous ces droits.`,choices:[`Non, arrêter`,`Oui, je les ai vérifiés`]},"botPat.method":{title:`Comment fournirez-vous le PAT du bot ?`,description:`Il est distinct du PAT de configuration. Il appartient au compte qui exécutera les futures GitHub Actions et sera installé comme Secret après approbation.`,choices:[`Lien GitHub guidé`,`Saisir un PAT manuellement`]},"botPat.login":{title:`Identifiant GitHub attendu pour le bot`,description:`Saisissez l’identifiant du bot sans @. Copilot récupère son ID numérique GitHub et le compare au propriétaire du PAT.`},"botPat.entry.guided":{title:`{name} — PAT du compte bot`,description:`Ouvrez GitHub en tant que @{account} (ID {accountId}), pas en tant qu’opérateur. Sélectionnez uniquement ce dépôt, vérifiez tous les droits et collez le PAT ici. Expiration suggérée : 90 jours. La valeur d’un Secret existant ne peut pas être relue.`},"botPat.entry.manual":{title:`{name} — PAT du compte bot`,description:`Utilisez le compte bot, sélectionnez uniquement le dépôt voulu et vérifiez tous les droits avant de coller le PAT. Expiration suggérée : 90 jours. La valeur d’un Secret existant ne peut pas être relue.`},"credential.apiKey":{title:`{name} — clé API de {provider}`,description:`Collez la clé API de {provider}. Elle est envoyée uniquement au processus local puis, si vous approuvez le plan, installée comme Secret GitHub Actions. Les valeurs existantes ne peuvent pas être relues.`},"credential.existing":{title:`{name} existant : {status}`,description:`GitHub ne révèle pas la valeur actuelle du Secret. Ne la conservez que si vous acceptez explicitement de ne pas pouvoir vérifier son état ici ; sinon, remplacez-la ou ignorez-la.`,choices:[`Conserver`,`Remplacer`,`Ignorer cet identifiant`]},"apply.confirm":{title:`Appliquer la configuration maintenant ?`,description:`C’est l’approbation finale. Des fichiers locaux et ressources GitHub choisis peuvent changer. Un résultat partiel doit être inspecté avant une nouvelle tentative.`,choices:[`Appliquer la configuration`,`Arrêter sans appliquer`]},"management.token":{title:`PAT temporaire de configuration`,description:`Lisez la configuration GitHub avec un PAT. La lecture suffit pour inspecter ; les changements nécessitent Variables Write et une approbation distincte. Noms des Secrets uniquement. Laissez vide pour revenir au panneau.`},"management.tokenWrite":{title:`PAT de configuration pour cet ajustement`,description:`Utilisez Variables Write dans le scope examiné. Après approbation, la vérification crée et supprime une Variable temporaire. Laissez vide pour revenir au panneau.`}},xa={"setup.scope":{title:`Escolha o âmbito da configuração`,description:`Este repositório mantém a pré-visualização e a aplicação local. Vários repositórios permite selecionar explicitamente entre 1 e 25 destinos da mesma organização e criar PRs para revisão. O lote não integra, cria tags, publica versões nem implementa.`,choices:[`Este repositório`,`Vários repositórios desta organização`]},"setup.batchSource":{title:`De onde deve vir a configuração?`,description:`Reutilize os ajustes compatíveis da organização para saltar perguntas já resolvidas, ou personalize os ajustes do repositório. Em ambos os casos, o lote mantém os Secrets existentes. Crie separadamente as credenciais em falta e volte a inspecionar; os valores partilhados nunca são substituídos.`,choices:[`Reutilizar a configuração da organização`,`Personalizar ajustes; manter os Secrets`]},"batch.token":{title:`PAT temporário para os repositórios selecionados`,description:`Crie um PAT temporário limitado a estes repositórios: {repositories}. O link propõe permissões; selecione pessoalmente apenas os repositórios previstos no GitHub. Deixe vazio para manter o PAT atual. O plano final volta a verificar as permissões exatas. Elimine depois os PATs temporários de configuração.`},"setup.source":{title:`De onde deve vir a configuração?`,description:`Reutilize as Variables compatíveis e os Secrets existentes da organização, mantendo os ajustes do repositório. Só serão pedidos os ajustes em falta, inválidos ou específicos do repositório. Os valores partilhados são mantidos; as diferenças revistas ficam no repositório. Escolha Personalizar para criar ou substituir credenciais.`,choices:[`Reutilizar a configuração da organização`,`Personalizar a configuração`]},"setup.reusePatReview":{title:`Reveja o acesso para reutilizar a configuração`,description:`Estas permissões provisórias permitem consultar a configuração existente e configurar o repositório. Os valores dos Secrets partilhados nunca são pedidos nem substituídos. O plano final verifica as permissões exatas; a verificação das credenciais pode ficar pendente. Selecione apenas os repositórios previstos no GitHub e elimine depois o PAT temporário.`,choices:[`Continuar para o GitHub`,`Introduzir um PAT manualmente`]},"botPat.scopeConflict":{title:`Resolver o conflito de âmbito do PAT do bot`,description:`O Secret PAT do repositório {repository} tem prioridade sobre o PAT da organização selecionado. Elimine o Secret do repositório no GitHub e peça ao Copilot para verificar novamente, ou altere o âmbito do PAT para este repositório. As suas respostas são preservadas. O Copilot não eliminará nenhum Secret.`,choices:[`Já eliminei o PAT do repositório — verificar novamente`,`Guardar o PAT no repositório`,`Parar a configuração`]},"botPat.scopeConflictUnavailable":{title:`Resolver o conflito de âmbito do PAT do bot`,description:`O GitHub não permitiu confirmar se o PAT do repositório foi eliminado. O conflito continua por resolver. As suas respostas são preservadas. Verifique o acesso e tente novamente, altere o âmbito do PAT para este repositório ou pare a configuração.`,choices:[`Já eliminei o PAT do repositório — verificar novamente`,`Guardar o PAT no repositório`,`Parar a configuração`]},"botPat.identityMismatch":{title:`Este PAT pertence a outra conta do GitHub`,description:`O PAT pertence a @{actual}; o bot selecionado é @{expected}. Nenhum Secret do bot foi gravado. As suas respostas e o plano aprovado são mantidos. Elimine o PAT não utilizado no GitHub, mude para @{expected} e escolha entre introduzir outro PAT ou parar a configuração.`,choices:[`Introduzir outro PAT do bot`,`Parar a configuração`]},"repository.confirm":{title:`Confirme este repositório`,description:`Esta pasta aponta para {repository}, no ramo {branch}. Confirme o destino antes de configurar acessos PAT ou ficheiros.`,choices:[`Sim, é o meu repositório`,`Parar e escolher outra pasta`]},"setup.depth":{title:`Escolha o nível de detalhe`,description:`O percurso básico continua a perguntar sobre permissões, segurança, ramos, Projects, aprovação e armazenamento. Algumas definições avançadas de agentes, prefixos de ramos e Bugbot mantêm os valores predefinidos; poderá revê-las e editá-las no plano final. O percurso personalizado pergunta por todas as definições aplicáveis. Nenhum dos percursos aplica alterações nesta fase.`,choices:[`Configuração básica guiada (recomendada)`,`Personalizar todas as definições`]},"setup.environmentPat":{title:`Existe um PAT de configuração no ambiente`,description:`O valor permanece no processo CLI. Continuar inicia a verificação de identidade e testes temporários isolados de criação, leitura e eliminação antes do plano. A instalação exige aprovação final. Sair do Copilot não remove a variável da shell original.`,choices:[`Usar o PAT do ambiente`,`Criar ou introduzir outro PAT`]},"plan.review":{title:`Reveja o plano de configuração`,description:`Confirme ficheiros, fluxos, Variables e nomes de Secrets antes de aprovar. Abrir o plano não inicia alterações.`,choices:void 0},"workflow.update":{title:`Atualizar os fluxos existentes?`,description:`Estes ficheiros diferem do plano: {files}. Conservá-los pode deixar algumas definições novas inativas.`,choices:[`Conservar os existentes`,`Atualizar os fluxos geridos`]},"setupPat.method":{title:`Como irá fornecer o PAT de configuração?`,description:`Este PAT temporário autoriza uma única execução. O GitHub cria-o na sua conta de operador; o Copilot não pode revogá-lo por si.`,choices:[`Ligação guiada do GitHub`,`Introduzir PAT manualmente`]},"setupPat.ownerKind":{title:`Quem é o proprietário deste repositório no GitHub?`,description:`O proprietário determina as permissões de organização necessárias. Consulte o cabeçalho do repositório no GitHub se tiver dúvidas.`,choices:[`Organização`,`Conta pessoal`,`Não tenho a certeza`]},"setupPat.review":{title:`Reveja as permissões provisórias do PAT de configuração`,description:`Estas permissões seguem as suas escolhas. Ao gerir Secrets, a ligação pré-seleciona Actions, Contents e Workflows em escrita para possíveis verificações de credenciais. Estas verificações só decorrem se o plano aprovado as exigir. A inspeção do GitHub pode revelar outros requisitos.`,choices:[`Continuar no GitHub`,`Rever as escolhas`,`Ver a tabela completa de permissões`,`Introduzir um PAT manualmente`]},"setupPat.entry":{title:`PAT temporário de configuração`,description:`Abra o GitHub com a sua conta de operador, conclua a 2FA, escolha «Only select repositories», selecione este repositório e cole aqui o PAT gerado. É apenas para esta execução; elimine-o no GitHub depois.`},"setupPat.confirmAccount":{title:`O GitHub autenticou o PAT de configuração como @{account}`,description:`É esta a conta de operador que deve configurar o repositório? Uma conta errada tem de parar o processo antes de qualquer alteração.`,choices:[`Sim, continuar`,`Não, parar`]},"setupPat.confirmUnverifiedAccess":{title:`Verifique as permissões do PAT marcadas Não verificável`,description:`As linhas Verificadas já passaram na verificação. Compare cada permissão necessária Não verificável com o âmbito e o nível de acesso nas definições do PAT no GitHub. Uma consulta só de leitura não prova Escrita; Não verificável não significa ausente. Verifique Projects: leitura apenas se essa linha estiver Não verificável. Continue só depois de verificar todas essas permissões.`,choices:[`Não, parar`,`Sim, já as verifiquei`]},"botPat.method":{title:`Como irá fornecer o PAT do bot?`,description:`É diferente do PAT de configuração. Pertence à conta que executará as futuras GitHub Actions e será instalado como Secret após aprovação.`,choices:[`Ligação guiada do GitHub`,`Introduzir PAT manualmente`]},"botPat.login":{title:`Utilizador GitHub esperado para o bot`,description:`Introduza o nome de utilizador do bot sem @. O Copilot consulta o ID numérico do GitHub e compara-o com o proprietário do PAT.`},"botPat.entry.guided":{title:`{name} — PAT da conta bot`,description:`Abra o GitHub como @{account} (ID {accountId}), não como operador. Selecione apenas este repositório, reveja todas as permissões e cole aqui o PAT. Validade sugerida: 90 dias. Não é possível voltar a ler o valor de um Secret existente.`},"botPat.entry.manual":{title:`{name} — PAT da conta bot`,description:`Use a conta bot, selecione apenas o repositório pretendido e reveja todas as permissões antes de colar o PAT. Validade sugerida: 90 dias. Não é possível voltar a ler o valor de um Secret existente.`},"credential.apiKey":{title:`{name} — chave API de {provider}`,description:`Cole a chave API de {provider}. Só é enviada para este processo local e, se aprovar o plano, instalada como Secret do GitHub Actions. Os valores existentes não podem voltar a ser lidos.`},"credential.existing":{title:`{name} existente: {status}`,description:`O GitHub não revela o valor atual do Secret. Conserve-o apenas se aceitar expressamente que aqui não se pode verificar o seu estado; caso contrário, substitua-o ou ignore-o.`,choices:[`Conservar`,`Substituir`,`Ignorar esta credencial`]},"apply.confirm":{title:`Aplicar a configuração agora?`,description:`Esta é a aprovação final. Ficheiros locais e recursos GitHub selecionados podem mudar. Um resultado parcial exige inspeção antes de tentar novamente.`,choices:[`Aplicar configuração`,`Parar sem aplicar`]},"management.token":{title:`PAT temporário de setup`,description:`Leia a configuração GitHub com um PAT. A leitura basta para inspecionar; alterações exigem Variables Write e aprovação separada. Apenas nomes dos Secrets. Deixe vazio para voltar ao painel.`},"management.tokenWrite":{title:`PAT de setup para este ajuste`,description:`Use Variables Write no scope revisto. Após aprovação, a verificação cria e elimina uma Variable temporária. Deixe vazio para voltar ao painel.`}},Sa={"session.controlMoved":`Control moved to this tab. The previous tab is now read-only.`,"session.cancelled":`Cancellation requested. Temporary permission checks already started will finish cleanup before the process exits. PATs created on GitHub remain until you delete them there.`,"plan.ready":`Plan ready: {files} files, {variables} Variables and {secrets} Secret names. Review it before continuing.`,"permission.preview":`Permission preview: issue workflows {issues}; PR approval {approval}; Secrets {secrets}; Variables {variables}; Projects {projects}. Review the exact grants before creating the setup PAT.`,"setupPat.corrected.bootstrap":`The setup PAT could not access the repository. Installation has not started. Resolve failed permission tests and any pending cleanup before retrying. Required grants: {grants}. Create a corrected PAT using the updated GitHub link.`,"setupPat.corrected.final":`Required setup PAT permissions changed after inspection. Installation has not started. Resolve failed permission tests and any pending cleanup before retrying. New grants: {grants}. Create a corrected PAT using the updated GitHub link.`,"setupPat.cleanup":`Delete the temporary setup PAT in GitHub Settings after this run. Closing Copilot does not revoke it.`,"botPat.separation":`The bot PAT is separate from your setup PAT. These credentials become GitHub Actions Secrets: {names}. Existing Secret values cannot be read back. Re-enter an existing bot PAT so its grants can be checked. No credential-health workflow runs before Apply.`,"credential.checks":`Credential checks finished for {count} items. Each result is shown below. The terminal has technical details; an existing Secret value cannot be read back.`,"credential.status.valid":`Valid`,"credential.status.invalid":`Invalid`,"credential.status.missing":`Missing`,"credential.status.unverifiable":`Cannot be verified without a new value`,"credential.status.not_required":`Not required`,"validation.producers":`Select 1–8 observed checks or enter exact name|App ID|workflow tuples.`,"validation.duplicateNames":`Two trusted producers use the same check name. Coverage stores only the name: choose one producer or rename the CI jobs.`,"validation.projectStatusVerified":`Open every selected Project in GitHub and confirm that all four exact Status values exist. Answer Yes after checking, or No to choose Projects again.`,"validation.projectStatusRedo":`Status values were not confirmed. Choose compatible Projects, then review their Status options again.`,"validation.number":`Enter a non-negative whole number.`,"validation.boolean":`Enter yes or no.`,"validation.choice":`Select one of the listed options.`,"validation.unknownResource":`Unknown inherited resource names: {names}. Choose only names shown in the inherited list.`,"validation.unknownWorkflow":`Unknown issue workflows: {names}. Choose only the listed workflow types.`,"validation.firstQuestion":`This is the first question in this pass. Review it or cancel setup.`,"validation.duplicateProducer":`This trusted check was selected twice. Remove the duplicate selection.`,"validation.savedStatus":`The saved Status value is not available in every selected Project. Choose a listed option.`,"validation.projectIncompatible":`The selected Projects have no common Status option. Choose compatible Projects or configure them separately.`,"validation.projectLimit":`Choose at most 10 Projects; separate their numbers or URLs with commas.`,"validation.projectOwnerNeeded":`A Project URL needs a known repository owner; enter its positive number instead.`,"validation.projectOwnerMismatch":`Use a GitHub Project URL belonging to {owner}, without query parameters.`,"validation.projectUrl":`Enter a valid GitHub Project URL or positive Project number.`,"validation.projectNumber":`Enter the positive Project number from its GitHub URL, not a PVT_ GraphQL ID.`,"validation.projectNumberRange":`Project numbers must be positive integers at most 2147483647.`,"validation.projectDuplicate":`Project {number} was selected more than once.`,"validation.fixedIssues":`Your configuration explicitly enables release or hotfix automation. Keep Issues enabled or edit that configuration first.`,"validation.fixedWorkflowEnabled":`Your configuration enables {kind}. Keep that workflow selected or edit the configuration first.`,"validation.fixedWorkflowDisabled":`Your configuration disables {kind}. Deselect that workflow or edit the configuration first.`,"validation.unknown":`This answer could not be accepted. Review the question and its help; the terminal has the technical detail.`},Ca={"session.controlMoved":`El control ha pasado a esta pestaña. La anterior ahora es de solo lectura.`,"session.cancelled":`Cancelación solicitada. Las pruebas temporales ya iniciadas terminarán su limpieza antes de que salga el proceso. Los PAT creados en GitHub seguirán allí hasta que los elimines.`,"plan.ready":`Plan listo: {files} archivos, {variables} Variables y {secrets} nombres de Secrets. Revísalo antes de continuar.`,"permission.preview":`Vista previa de permisos: flujos de incidencias {issues}; aprobación de PR {approval}; Secrets {secrets}; Variables {variables}; Projects {projects}. Revisa los permisos exactos antes de crear el PAT de configuración.`,"setupPat.corrected.bootstrap":`El PAT de configuración no pudo acceder al repositorio. La instalación no ha empezado. Resuelve las pruebas fallidas y cualquier limpieza pendiente antes de reintentar. Permisos necesarios: {grants}. Crea un PAT corregido desde el enlace actualizado de GitHub.`,"setupPat.corrected.final":`Los permisos necesarios del PAT cambiaron tras la inspección. La instalación no ha empezado. Resuelve las pruebas fallidas y cualquier limpieza pendiente antes de reintentar. Permisos nuevos: {grants}. Crea un PAT corregido desde el enlace actualizado.`,"setupPat.cleanup":`Elimina el PAT temporal de configuración en los ajustes de GitHub después de esta ejecución. Cerrar Copilot no lo revoca.`,"botPat.separation":`El PAT del bot es distinto del de configuración. Estas credenciales se instalarán como Secrets de GitHub Actions: {names}. Los valores existentes no pueden leerse. Vuelve a introducir un PAT del bot para comprobar sus permisos. Antes de Aplicar no se ejecuta ningún workflow de comprobación.`,"credential.checks":`Se han comprobado {count} credenciales. Abajo aparece el resultado de cada una. La terminal contiene los detalles técnicos; el valor de un Secret existente no puede leerse.`,"credential.status.valid":`Válida`,"credential.status.invalid":`No válida`,"credential.status.missing":`Falta`,"credential.status.unverifiable":`No verificable sin un valor nuevo`,"credential.status.not_required":`No necesaria`,"validation.producers":`Selecciona entre 1 y 8 checks observados o introduce las tuplas exactas nombre|ID de App|workflow.`,"validation.duplicateNames":`Dos productores fiables tienen el mismo nombre de check. La cobertura solo guarda el nombre: elige uno o cambia el nombre de los jobs de CI.`,"validation.projectStatusVerified":`Abre cada Project elegido en GitHub y confirma los cuatro valores Status exactos. Responde Sí tras comprobarlo, o No para elegir Projects de nuevo.`,"validation.projectStatusRedo":`No se confirmaron los valores Status. Elige Projects compatibles y vuelve a revisar sus opciones Status.`,"validation.number":`Introduce un número entero no negativo.`,"validation.boolean":`Elige Sí o No.`,"validation.choice":`Elige una de las opciones mostradas.`,"validation.unknownResource":`Nombres de recursos heredados desconocidos: {names}. Elige solo nombres de la lista heredada.`,"validation.unknownWorkflow":`Flujos de issues desconocidos: {names}. Elige solo los tipos indicados.`,"validation.firstQuestion":`Esta es la primera pregunta de esta pasada. Revísala o cancela la configuración.`,"validation.duplicateProducer":`Has seleccionado dos veces el mismo check fiable. Quita la selección duplicada.`,"validation.savedStatus":`El valor Status guardado no existe en todos los Projects seleccionados. Elige una opción de la lista.`,"validation.projectIncompatible":`Los Projects elegidos no comparten ningún valor Status. Elige Projects compatibles o configúralos por separado.`,"validation.projectLimit":`Elige como máximo 10 Projects; separa sus números o URL con comas.`,"validation.projectOwnerNeeded":`Para usar la URL de un Project hay que conocer el propietario del repositorio; introduce su número positivo.`,"validation.projectOwnerMismatch":`Usa la URL de un Project de GitHub que pertenezca a {owner}, sin parámetros.`,"validation.projectUrl":`Introduce una URL válida de un Project de GitHub o su número positivo.`,"validation.projectNumber":`Introduce el número positivo del Project que aparece en su URL, no un ID GraphQL PVT_.`,"validation.projectNumberRange":`El número del Project debe ser un entero positivo no mayor de 2147483647.`,"validation.projectDuplicate":`Has seleccionado el Project {number} más de una vez.`,"validation.fixedIssues":`Tu configuración activa expresamente release o hotfix. Mantén Issues activado o cambia antes la configuración.`,"validation.fixedWorkflowEnabled":`Tu configuración activa {kind}. Mantén ese flujo seleccionado o cambia antes la configuración.`,"validation.fixedWorkflowDisabled":`Tu configuración desactiva {kind}. Desmarca ese flujo o cambia antes la configuración.`,"validation.unknown":`No se pudo aceptar esta respuesta. Revisa la pregunta y su ayuda; la terminal contiene el detalle técnico.`},wa={"session.controlMoved":`Le contrôle est passé à cet onglet. L’onglet précédent est maintenant en lecture seule.`,"session.cancelled":`Annulation demandée. Les tests temporaires déjà lancés termineront leur nettoyage avant la fin du processus. Les PAT créés sur GitHub restent actifs jusqu’à leur suppression.`,"plan.ready":`Plan prêt : {files} fichiers, {variables} Variables et {secrets} noms de Secrets. Examinez-le avant de continuer.`,"permission.preview":`Aperçu des droits : flux de tickets {issues} ; approbation des PR {approval} ; Secrets {secrets} ; Variables {variables} ; Projects {projects}. Vérifiez les droits exacts avant de créer le PAT de configuration.`,"setupPat.corrected.bootstrap":`Le PAT de configuration n’a pas pu accéder au dépôt. L’installation n’a pas commencé. Résolvez les tests échoués et tout nettoyage incomplet avant de réessayer. Droits requis : {grants}. Créez un PAT corrigé avec le lien GitHub mis à jour.`,"setupPat.corrected.final":`Les droits requis du PAT ont changé après inspection. L’installation n’a pas commencé. Résolvez les tests échoués et tout nettoyage incomplet avant de réessayer. Nouveaux droits : {grants}. Créez un PAT corrigé avec le lien mis à jour.`,"setupPat.cleanup":`Supprimez le PAT temporaire de configuration dans les paramètres GitHub après cette exécution. Fermer Copilot ne le révoque pas.`,"botPat.separation":`Le PAT du bot est distinct du PAT de configuration. Ces identifiants deviendront des Secrets GitHub Actions : {names}. Les valeurs existantes ne peuvent pas être relues. Saisissez à nouveau un PAT du bot pour vérifier ses droits. Aucun workflow de vérification ne démarre avant Appliquer.`,"credential.checks":`Vérification terminée pour {count} identifiants. Le résultat de chacun figure ci-dessous. Le terminal contient les détails techniques ; la valeur d’un Secret existant ne peut pas être relue.`,"credential.status.valid":`Valide`,"credential.status.invalid":`Invalide`,"credential.status.missing":`Manquant`,"credential.status.unverifiable":`Invérifiable sans nouvelle valeur`,"credential.status.not_required":`Non requis`,"validation.producers":`Choisissez 1 à 8 vérifications observées ou saisissez les triplets exacts nom|ID d’App|workflow.`,"validation.duplicateNames":`Deux producteurs fiables portent le même nom de vérification. La couverture ne stocke que ce nom : choisissez-en un ou renommez les jobs CI.`,"validation.projectStatusVerified":`Ouvrez chaque Project choisi sur GitHub et confirmez les quatre valeurs Status exactes. Répondez Oui après vérification, ou Non pour choisir à nouveau les Projects.`,"validation.projectStatusRedo":`Les valeurs Status n’ont pas été confirmées. Choisissez des Projects compatibles, puis revérifiez leurs options Status.`,"validation.number":`Saisissez un entier positif ou nul.`,"validation.boolean":`Choisissez Oui ou Non.`,"validation.choice":`Choisissez une des options affichées.`,"validation.unknownResource":`Noms de ressources héritées inconnus : {names}. Choisissez seulement les noms de la liste héritée.`,"validation.unknownWorkflow":`Workflows de ticket inconnus : {names}. Choisissez seulement les types proposés.`,"validation.firstQuestion":`C’est la première question de cette passe. Vérifiez-la ou annulez la configuration.`,"validation.duplicateProducer":`Cette vérification fiable a été choisie deux fois. Retirez le doublon.`,"validation.savedStatus":`La valeur Status enregistrée n’existe pas dans tous les Projects choisis. Sélectionnez une option proposée.`,"validation.projectIncompatible":`Les Projects choisis ne partagent aucune valeur Status. Choisissez des Projects compatibles ou configurez-les séparément.`,"validation.projectLimit":`Choisissez au plus 10 Projects ; séparez leurs numéros ou URL par des virgules.`,"validation.projectOwnerNeeded":`Une URL de Project exige de connaître le propriétaire du dépôt ; saisissez plutôt son numéro positif.`,"validation.projectOwnerMismatch":`Utilisez une URL de Project GitHub appartenant à {owner}, sans paramètres.`,"validation.projectUrl":`Saisissez une URL valide de Project GitHub ou son numéro positif.`,"validation.projectNumber":`Saisissez le numéro positif figurant dans l’URL du Project, pas un ID GraphQL PVT_.`,"validation.projectNumberRange":`Le numéro du Project doit être un entier positif inférieur ou égal à 2147483647.`,"validation.projectDuplicate":`Le Project {number} a été choisi plusieurs fois.`,"validation.fixedIssues":`Votre configuration active explicitement release ou hotfix. Gardez Issues activé ou modifiez d’abord la configuration.`,"validation.fixedWorkflowEnabled":`Votre configuration active {kind}. Gardez ce flux sélectionné ou modifiez d’abord la configuration.`,"validation.fixedWorkflowDisabled":`Votre configuration désactive {kind}. Désélectionnez ce flux ou modifiez d’abord la configuration.`,"validation.unknown":`Cette réponse n’a pas été acceptée. Vérifiez la question et son aide ; le terminal contient le détail technique.`},Ta={"session.controlMoved":`O controlo passou para este separador. O separador anterior é agora apenas de leitura.`,"session.cancelled":`Cancelamento solicitado. Os testes temporários já iniciados concluirão a limpeza antes de o processo terminar. Os PAT criados no GitHub permanecem até serem eliminados.`,"plan.ready":`Plano pronto: {files} ficheiros, {variables} Variables e {secrets} nomes de Secrets. Reveja-o antes de continuar.`,"permission.preview":`Pré-visualização das permissões: fluxos de issues {issues}; aprovação de PR {approval}; Secrets {secrets}; Variables {variables}; Projects {projects}. Reveja as permissões exatas antes de criar o PAT de configuração.`,"setupPat.corrected.bootstrap":`O PAT de configuração não conseguiu aceder ao repositório. A instalação não começou. Resolva os testes falhados e qualquer limpeza pendente antes de repetir. Permissões necessárias: {grants}. Crie um PAT corrigido com a ligação GitHub atualizada.`,"setupPat.corrected.final":`As permissões necessárias do PAT mudaram após inspeção. A instalação não começou. Resolva os testes falhados e qualquer limpeza pendente antes de repetir. Novas permissões: {grants}. Crie um PAT corrigido com a ligação atualizada.`,"setupPat.cleanup":`Elimine o PAT temporário de configuração nas definições do GitHub após esta execução. Fechar o Copilot não o revoga.`,"botPat.separation":`O PAT do bot é distinto do PAT de configuração. Estas credenciais serão Secrets do GitHub Actions: {names}. Os valores existentes não podem voltar a ser lidos. Reintroduza um PAT do bot para verificar as permissões. Nenhum fluxo de verificação é executado antes de Aplicar.`,"credential.checks":`Verificação concluída para {count} credenciais. O resultado de cada uma aparece abaixo. O terminal contém os detalhes técnicos; o valor de um Secret existente não pode voltar a ser lido.`,"credential.status.valid":`Válida`,"credential.status.invalid":`Inválida`,"credential.status.missing":`Em falta`,"credential.status.unverifiable":`Não verificável sem um novo valor`,"credential.status.not_required":`Não necessária`,"validation.producers":`Selecione 1 a 8 verificações observadas ou introduza os triplos exatos nome|ID da App|workflow.`,"validation.duplicateNames":`Dois produtores fiáveis têm o mesmo nome de check. A cobertura guarda apenas o nome: escolha um ou altere o nome dos jobs de CI.`,"validation.projectStatusVerified":`Abra cada Project escolhido no GitHub e confirme os quatro valores Status exatos. Responda Sim após verificar, ou Não para voltar a escolher Projects.`,"validation.projectStatusRedo":`Os valores Status não foram confirmados. Escolha Projects compatíveis e volte a verificar as opções Status.`,"validation.number":`Introduza um número inteiro não negativo.`,"validation.boolean":`Escolha Sim ou Não.`,"validation.choice":`Escolha uma das opções apresentadas.`,"validation.unknownResource":`Nomes de recursos herdados desconhecidos: {names}. Escolha apenas nomes da lista herdada.`,"validation.unknownWorkflow":`Fluxos de questões desconhecidos: {names}. Escolha apenas os tipos indicados.`,"validation.firstQuestion":`Esta é a primeira pergunta desta ronda. Reveja-a ou cancele a configuração.`,"validation.duplicateProducer":`Esta verificação de confiança foi selecionada duas vezes. Remova a seleção duplicada.`,"validation.savedStatus":`O valor Status guardado não existe em todos os Projects escolhidos. Selecione uma opção da lista.`,"validation.projectIncompatible":`Os Projects escolhidos não partilham qualquer valor Status. Escolha Projects compatíveis ou configure-os separadamente.`,"validation.projectLimit":`Escolha no máximo 10 Projects; separe os números ou URL por vírgulas.`,"validation.projectOwnerNeeded":`Uma URL de Project exige que se conheça o proprietário do repositório; introduza antes o número positivo.`,"validation.projectOwnerMismatch":`Use uma URL de Project do GitHub pertencente a {owner}, sem parâmetros.`,"validation.projectUrl":`Introduza uma URL válida de Project do GitHub ou o respetivo número positivo.`,"validation.projectNumber":`Introduza o número positivo apresentado na URL do Project, não um ID GraphQL PVT_.`,"validation.projectNumberRange":`O número do Project tem de ser um inteiro positivo até 2147483647.`,"validation.projectDuplicate":`O Project {number} foi selecionado mais do que uma vez.`,"validation.fixedIssues":`A sua configuração ativa explicitamente release ou hotfix. Mantenha Issues ativo ou altere primeiro a configuração.`,"validation.fixedWorkflowEnabled":`A sua configuração ativa {kind}. Mantenha esse fluxo selecionado ou altere primeiro a configuração.`,"validation.fixedWorkflowDisabled":`A sua configuração desativa {kind}. Desmarque esse fluxo ou altere primeiro a configuração.`,"validation.unknown":`Esta resposta não foi aceite. Reveja a pergunta e a ajuda; o terminal contém o detalhe técnico.`},Ea={en:{title:`Runners and installation parity`,help:`Access and capacity are observations. Verify runner authentication separately. Busy/offline waits for capacity; unknown access needs administrator verification. The chosen route never changes automatically.`,assets:`Asset inventory`,changes:`Complete changes (recognized credential formats masked)`,redactionNotice:`Masking covers recognized credential formats. Other hardcoded values can remain visible in these local workflow files; inspect them before sharing the review.`,before:`Before`,after:`After`,absent:`Absent`,disabled:`Disabled`,retained:`Retained`,blockers:`Needs attention`,registry:`Profile registry`,inventory:`Runner discovery`,profiles:`Reusable profiles`,observed:`Observed groups and labels`,limited:`Showing the first 10 runners. Manual entry remains available.`,available:`Available`,incomplete:`Incomplete`,missing:`Missing`,invalid:`Invalid: repair the registry or enter a manual profile`,unavailable:`Unavailable`,confirmed:`Repository access confirmed`,unknown:`Access unverified`,ready:`Available capacity observed`,hosted:`GitHub-hosted`,"pending-capacity":`Capacity pending: busy or offline`,"access-unknown":`Access unverified`,shared:`Shared/generated`,"source-only":`Source extension: retained`,customized:`Customized: review`,incompatible:`Incompatible generator: inspect before replacing`,agent:`Agent jobs`,"credential-health":`Credential verification`,validation:`Ordinary validation`,observer:`Trusted approval observer`,publication:`Publication`,isolated:`Isolated merge-group check`,retain:`Keep installed routing (recommended)`,"organization-profile":`Reuse an existing shared profile`,"manual-self-hosted":`Choose an existing self-hosted runner`,"validation-agent":`Use the selected agent runner`,"validation-hosted":`Use GitHub-hosted runners (recommended)`},es:{title:`Runners y paridad de la instalación`,help:`Acceso y capacidad son observaciones. Verifica la autenticación del runner por separado. Ocupado/desconectado espera capacidad; acceso desconocido requiere verificación del administrador. La ruta elegida nunca cambia automáticamente.`,assets:`Inventario de archivos`,changes:`Cambios completos (formatos de credenciales reconocidos ocultos)`,redactionNotice:`Se ocultan los formatos de credenciales reconocidos. Otros valores escritos en los workflows pueden seguir visibles en esta vista local; revísalos antes de compartirla.`,before:`Antes`,after:`Después`,absent:`Ausente`,disabled:`Desactivado`,retained:`Conservado`,blockers:`Requiere atención`,registry:`Registro de perfiles`,inventory:`Descubrimiento de runners`,profiles:`Perfiles reutilizables`,observed:`Grupos y etiquetas observados`,limited:`Se muestran los primeros 10 runners. Sigue disponible la entrada manual.`,available:`Disponible`,incomplete:`Incompleto`,missing:`Ausente`,invalid:`Inválido: corrige el registro o introduce un perfil manual`,unavailable:`No disponible`,confirmed:`Acceso del repositorio confirmado`,unknown:`Acceso sin verificar`,ready:`Capacidad disponible observada`,hosted:`Runners de GitHub`,"pending-capacity":`Capacidad pendiente: ocupado o desconectado`,"access-unknown":`Acceso sin verificar`,shared:`Compartido/generado`,"source-only":`Extensión propia: conservada`,customized:`Personalizado: revisar`,incompatible:`Generador incompatible: revisar antes de sustituir`,agent:`Jobs del agente`,"credential-health":`Verificación de credenciales`,validation:`Validación ordinaria`,observer:`Observador de aprobación fiable`,publication:`Publicación`,isolated:`Check aislado de la cola de fusión`,retain:`Conservar rutas instaladas (recomendado)`,"organization-profile":`Reutilizar un perfil compartido existente`,"manual-self-hosted":`Elegir un runner self-hosted existente`,"validation-agent":`Usar el runner del agente elegido`,"validation-hosted":`Usar runners de GitHub (recomendado)`},fr:{title:`Runners et parité de l’installation`,help:`Accès et capacité sont des observations. Vérifiez séparément l’authentification. Occupé/hors ligne attend la capacité ; l’accès inconnu exige une vérification administrateur. La route ne change jamais automatiquement.`,assets:`Inventaire des fichiers`,redactionNotice:`Le masquage couvre les formats de secrets reconnus. D’autres valeurs littérales peuvent rester visibles dans cette vue locale ; vérifiez-les avant de la partager.`,changes:`Modifications complètes (formats d’identifiants reconnus masqués)`,before:`Avant`,after:`Après`,absent:`Absent`,disabled:`Désactivé`,retained:`Conservé`,blockers:`Attention requise`,registry:`Registre des profils`,inventory:`Découverte des runners`,profiles:`Profils réutilisables`,observed:`Groupes et étiquettes observés`,limited:`Les 10 premiers runners sont affichés. La saisie manuelle reste disponible.`,available:`Disponible`,incomplete:`Incomplet`,missing:`Absent`,invalid:`Invalide : corrigez le registre ou saisissez un profil manuel`,unavailable:`Indisponible`,confirmed:`Accès du dépôt confirmé`,unknown:`Accès non vérifié`,ready:`Capacité disponible observée`,hosted:`Runners GitHub`,"pending-capacity":`Capacité en attente : occupé ou hors ligne`,"access-unknown":`Accès non vérifié`,shared:`Partagé/généré`,"source-only":`Extension source conservée`,customized:`Personnalisé : à vérifier`,incompatible:`Générateur incompatible : vérifiez avant remplacement`,agent:`Jobs de l’agent`,"credential-health":`Vérification des identifiants`,validation:`Validation ordinaire`,observer:`Observateur d’approbation fiable`,publication:`Publication`,isolated:`Vérification isolée de la file de fusion`,retain:`Conserver les routes installées (recommandé)`,"organization-profile":`Réutiliser un profil partagé existant`,"manual-self-hosted":`Choisir un runner auto-hébergé existant`,"validation-agent":`Utiliser le runner de l’agent sélectionné`,"validation-hosted":`Utiliser GitHub (recommandé)`},pt:{title:`Runners e paridade da instalação`,help:`Acesso e capacidade são observações. Verifique a autenticação separadamente. Ocupado/offline aguarda capacidade; acesso desconhecido exige verificação do administrador. A rota nunca muda automaticamente.`,assets:`Inventário de ficheiros`,redactionNotice:`São ocultados os formatos de credenciais reconhecidos. Outros valores escritos nos workflows podem continuar visíveis nesta vista local; reveja-os antes de a partilhar.`,changes:`Alterações completas (formatos de credenciais reconhecidos ocultos)`,before:`Antes`,after:`Depois`,absent:`Ausente`,disabled:`Desativado`,retained:`Mantido`,blockers:`Requer atenção`,registry:`Registo de perfis`,inventory:`Descoberta de runners`,profiles:`Perfis reutilizáveis`,observed:`Grupos e etiquetas observados`,limited:`São apresentados os primeiros 10 runners. A entrada manual continua disponível.`,available:`Disponível`,incomplete:`Incompleto`,missing:`Ausente`,invalid:`Inválido: corrija o registo ou introduza um perfil manual`,unavailable:`Indisponível`,confirmed:`Acesso do repositório confirmado`,unknown:`Acesso não verificado`,ready:`Capacidade disponível observada`,hosted:`Runners GitHub`,"pending-capacity":`Capacidade pendente: ocupado ou offline`,"access-unknown":`Acesso não verificado`,shared:`Partilhado/gerado`,"source-only":`Extensão própria mantida`,customized:`Personalizado: rever`,incompatible:`Gerador incompatível: reveja antes de substituir`,agent:`Jobs do agente`,"credential-health":`Verificação de credenciais`,validation:`Validação normal`,observer:`Observador de aprovação fiável`,publication:`Publicação`,isolated:`Verificação isolada da fila de fusão`,retain:`Manter rotas instaladas (recomendado)`,"organization-profile":`Reutilizar um perfil partilhado existente`,"manual-self-hosted":`Escolher um runner self-hosted existente`,"validation-agent":`Usar o runner do agente selecionado`,"validation-hosted":`Usar GitHub (recomendado)`}},Da={en:`This plan cannot be applied. Retain the existing asset or restore it with a compatible generator, then review again. No installation change has been applied. Open the details to identify the affected file.`,es:`Este plan no se puede aplicar. Conserva el archivo existente o restáuralo con un generador compatible y vuelve a revisar. No se ha aplicado ningún cambio de instalación. Abre los detalles para identificar el archivo afectado.`,fr:`Ce plan ne peut pas être appliqué. Conservez le fichier existant ou restaurez-le avec un générateur compatible, puis révisez le plan. Aucune modification d’installation n’a été appliquée. Ouvrez les détails pour identifier le fichier concerné.`,pt:`Este plano não pode ser aplicado. Mantenha o ficheiro existente ou restaure-o com um gerador compatível e reveja o plano. Nenhuma alteração de instalação foi aplicada. Abra os detalhes para identificar o ficheiro afetado.`};function $(e,t){return e===`blockedAction`?Da[t]:Ea[t][e]??Ea.en[e]??e}var Oa={es:{All:`Todos`,prompt:`Preguntar antes de crear el enlace`,"create-if-missing":`Crear el enlace si falta`,disabled:`Desactivado`,replace:`Sustituir`,append:`Añadir`,preserve:`Conservar`,info:`Informativa`,low:`Baja`,medium:`Media`,high:`Alta`,smart:`Adaptativa`,default:`Predeterminado`,auto:`Automático`,always:`Reinstalar siempre`,recommend:`Recomendar aprobación`,guarded:`Aprobar solo con garantías`,off:`Desactivado`,check:`Check de CI que exige la cobertura`,numeric:`Informe numérico verificable`,repository:`Repositorio`,organization:`Organización`,selected:`Repositorios seleccionados`,private:`Repositorios privados`,all:`Todos los repositorios`,"production-lineage":`Conservar el linaje de producción`,"canonical-gitflow":`Git-Flow canónico`,manual:`Manual`,"auto-merge":`Fusionar automáticamente`,"merge-queue":`Cola de integración`,"create-only":`Solo crear PR`,direct:`Integración directa`,"sync-branch":`Mediante rama de sincronización`,"prefer-release":`Priorizar la release`,development:`Desarrollo`,both:`Ambos destinos`,"source-only":`Solo rama de origen`,"sync-only":`Solo rama de sincronización`,none:`Ninguna`,close:`Cerrar el issue`,"keep-open":`Mantener abierto`,guided:`Guiado`,compact:`Compacto`,quiet:`Mínimo`,update:`Actualizar el comentario`,milestones:`Publicar en hitos`,feature:`Funcionalidad`,bugfix:`Corrección`,documentation:`Documentación`,chore:`Mantenimiento`,help:`Ayuda o pregunta`,hotfix:`Arreglo urgente`,release:`Release`},fr:{All:`Tous`,prompt:`Demander avant de créer le renvoi`,"create-if-missing":`Créer le renvoi s’il manque`,disabled:`Désactivé`,replace:`Remplacer`,append:`Ajouter`,preserve:`Conserver`,info:`Information`,low:`Faible`,medium:`Moyenne`,high:`Élevée`,smart:`Adaptatif`,default:`Par défaut`,auto:`Automatique`,always:`Toujours réinstaller`,recommend:`Recommander une approbation`,guarded:`Approuver sous garde`,off:`Désactivé`,check:`Vérification CI imposant la couverture`,numeric:`Rapport numérique vérifiable`,repository:`Dépôt`,organization:`Organisation`,selected:`Dépôts sélectionnés`,private:`Dépôts privés`,all:`Tous les dépôts`,"production-lineage":`Préserver la filiation de production`,"canonical-gitflow":`Git-Flow canonique`,manual:`Manuel`,"auto-merge":`Fusionner automatiquement`,"merge-queue":`File de fusion`,"create-only":`Créer la PR uniquement`,direct:`Fusion directe`,"sync-branch":`Par branche de synchronisation`,"prefer-release":`Privilégier la version`,development:`Développement`,both:`Les deux destinations`,"source-only":`Branche source seulement`,"sync-only":`Branche de synchronisation seulement`,none:`Aucune`,close:`Fermer le ticket`,"keep-open":`Garder ouvert`,guided:`Guidé`,compact:`Compact`,quiet:`Minimal`,update:`Mettre le commentaire à jour`,milestones:`Publier aux étapes clés`,feature:`Fonctionnalité`,bugfix:`Correction`,documentation:`Documentation`,chore:`Maintenance`,help:`Aide ou question`,hotfix:`Correctif urgent`,release:`Version`},pt:{All:`Todos`,prompt:`Perguntar antes de criar o apontador`,"create-if-missing":`Criar o apontador se faltar`,disabled:`Desativado`,replace:`Substituir`,append:`Acrescentar`,preserve:`Conservar`,info:`Informação`,low:`Baixa`,medium:`Média`,high:`Alta`,smart:`Adaptativo`,default:`Predefinido`,auto:`Automático`,always:`Reinstalar sempre`,recommend:`Recomendar aprovação`,guarded:`Aprovar sob condições`,off:`Desativado`,check:`Verificação CI que exige cobertura`,numeric:`Relatório numérico verificável`,repository:`Repositório`,organization:`Organização`,selected:`Repositórios selecionados`,private:`Repositórios privados`,all:`Todos os repositórios`,"production-lineage":`Preservar a linhagem de produção`,"canonical-gitflow":`Git-Flow canónico`,manual:`Manual`,"auto-merge":`Integrar automaticamente`,"merge-queue":`Fila de integração`,"create-only":`Criar apenas a PR`,direct:`Integração direta`,"sync-branch":`Através de ramo de sincronização`,"prefer-release":`Priorizar a release`,development:`Desenvolvimento`,both:`Ambos os destinos`,"source-only":`Apenas ramo de origem`,"sync-only":`Apenas ramo de sincronização`,none:`Nenhum`,close:`Fechar a questão`,"keep-open":`Manter aberta`,guided:`Guiado`,compact:`Compacto`,quiet:`Mínimo`,update:`Atualizar o comentário`,milestones:`Publicar nos marcos`,feature:`Funcionalidade`,bugfix:`Correção`,documentation:`Documentação`,chore:`Manutenção`,help:`Ajuda ou pergunta`,hotfix:`Hotfix`,release:`Release`}},ka=new Set([`codex`,`opencode`,`cursor`,`openai`,`anthropic`,`google`,`openrouter`,`local`]);function Aa(e,t,n){if(e===`runners.mode`)return $(t,n);if(e===`runners.validation`)return $(`validation-${t}`,n);if(n===`en`||ka.has(t))return t;let r=Oa[n];if(e===`issueWorkflows.enabled`&&t.includes(` — `)){let e=t.split(` — `,1)[0];if(r[e])return`${e} — ${r[e]}`}return e===`repository.reconciliationCleanup`&&t===`all`?{es:`Todas las ramas temporales`,fr:`Toutes les branches temporaires`,pt:`Todos os ramos temporários`}[n]:r[t]??t}function ja(e,t){return typeof e.defaultValue==`boolean`?Z(e.defaultValue?`yes`:`no`,t):e.defaultValue===void 0||e.defaultValue===``?Z(`none`,t):e.kind===`choice`||e.kind===`multi-select`?Aa(e.id,String(e.defaultValue),t):String(e.defaultValue)}var Ma={en:Sa,es:Ca,fr:wa,pt:Ta};function Na(e,t){if(e.managementState)return ta(t)[e.managementState];if(!e.copyId)return t===`en`?e.text:Z(`unknownLocalError`,t);let n=Ma[t][e.copyId],r=e.copyValues??{},i=e.copyId===`permission.preview`?{...r,issues:(r.issues??``).split(`|`).map(e=>Aa(`issueWorkflows.enabled`,e,t)).join(`, `),approval:Aa(`pullRequestApproval.mode`,r.approval??``,t),secrets:Aa(`storage.secrets.defaultScope`,r.secrets??``,t),variables:Aa(`storage.variables.defaultScope`,r.variables??``,t),projects:Aa(`projects.ids`,r.projects??``,t)}:r,a=n.replace(/\{([a-zA-Z]\w*)\}/gu,(e,t)=>i[t]??``);return e.copyId!==`credential.checks`||!e.credentialChecks?.length?a:`${a}\n${e.credentialChecks.map(e=>{let n=`credential.status.${e.status}`;return`${e.name}: ${Ma[t][n]}`}).join(` +`)}`}var Pa={en:va,es:ya,fr:ba,pt:xa};function Fa(e,t){return e.replace(/\{([a-zA-Z]\w*)\}/gu,(e,n)=>t[n]??``)}function Ia(e,t){if(!e.copyId)return;let n=Pa[t][e.copyId],r={...e.copyValues??{}};if(e.copyId===`credential.existing`&&r.status&&[`valid`,`invalid`,`missing`,`unverifiable`,`not_required`].includes(r.status)){let e=`credential.status.${r.status}`;r.status=Ma[t][e]}return{title:Fa(n.title,r),description:Fa(n.description,r),...n.choices?{choices:n.choices}:{}}}function La(e,t,n){return Ia(e,t)?.choices?.[n]??e.choices[n]}var Ra=U(`

                                              `,1);function za(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`view`,8);L(()=>(H(o()),n(),Ia),()=>{M(a,o()?.batch?Z(o().batch.phase===`review`?`batchReviewTitle`:o().batch.phase===`applying`?`batchProgressTitle`:`batchResultTitle`,n()):o()?.outcome===`complete`?Z(`completeTitle`,n()):o()?.outcome===`dry-run`?Z(`previewTitle`,n()):o()?.outcome===`cancelled`?Z(`cancelledTitle`,n()):o()?.outcome?Z(`blockedTitle`,n()):o()?.prompt?.kind===`repositories`?Z(`batchReviewSelection`,n()):o()?.prompt?.kind===`question`?Z(`choices`,n()):o()?.prompt?.kind===`plan`?Z(`plan`,n()):o()?.prompt?Ia(o().prompt,n())?.title??o().prompt.title:Z(`preparing`,n()))}),En(),Ai();var s=Ra(),c=P(s),l=I(N(c)),u=F(I(l));D(c);var d=I(c,2),f=F(d,!0),p=F(I(d,2),!0);R((e,t,n)=>{G(l,` ${e??``} `),G(u,`${t??``} / 06`),G(f,B(a)),G(p,n)},[()=>(H(Zi),H(o()),n(),V(()=>Zi(o()?.journey?.current,n()).toUpperCase())),()=>(H(o()),V(()=>String(o()?.journey?.position??1).padStart(2,`0`))),()=>(H(o()),H(Z),n(),V(()=>o()?.outcome?Z(`resultLede`,n()):Z(`activeLede`,n())))]),W(e,s),Je(),i()}function Ba(e){try{let t=new URL(e??``);return t.protocol===`https:`&&t.hostname===`github.com`&&(t.pathname===`/settings/personal-access-tokens`||t.pathname.startsWith(`/settings/personal-access-tokens/`))?t.toString():void 0}catch{return}}function Va(e){return e&&/^[A-Za-z0-9-]{1,39}\/(?!\.{1,2}$)[A-Za-z0-9._-]{1,100}$/u.test(e)?`https://github.com/${e}/settings/secrets/actions`:void 0}function Ha(e){try{let t=new URL(e??``);return t.protocol===`https:`&&t.hostname===`github.com`&&!t.username&&!t.password&&!t.search&&!t.hash&&/^\/[A-Za-z0-9-]{1,39}\/[A-Za-z0-9._-]{1,100}\/actions\/runs\/[1-9][0-9]*$/u.test(t.pathname)?t.toString():void 0}catch{return}}function Ua(e){try{let t=new URL(e??``);return t.protocol===`https:`&&t.hostname===`github.com`&&!t.username&&!t.password&&!t.search&&!t.hash&&/^\/[A-Za-z0-9-]{1,39}\/[A-Za-z0-9._-]{1,100}\/rules\/[1-9][0-9]*$/u.test(t.pathname)?t.toString():void 0}catch{return}}function Wa(e){try{let t=new URL(e??``);return t.protocol===`https:`&&t.hostname===`github.com`&&!t.username&&!t.password&&!t.search&&!t.hash&&/^\/(?:orgs|users)\/[A-Za-z0-9-]{1,39}\/projects\/[1-9][0-9]*$/u.test(t.pathname)?t.toString():void 0}catch{return}}var Ga=U(``),Ka=U(``);function qa(e,t){let n=X(t,`label`,8),r=X(t,`variant`,8,`primary`),i=X(t,`disabled`,8,!1),a=X(t,`arrow`,8,!1),o=X(t,`onClick`,8);var s=Ka(),c=N(s,!0),l=I(c),u=e=>{W(e,Ga())};K(l,e=>{a()&&e(u)}),D(s),R(()=>{li(s,1,oi(r())),s.disabled=i(),G(c,n())}),Cr(`click`,s,function(...e){o()?.apply(this,e)}),W(e,s)}wr([`click`]);var Ja=U(` `),Ya=U(`

                                              `);function Xa(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`tone`,8,`info`),s=X(t,`title`,8),c=X(t,`message`,8),l=X(t,`link`,8,void 0),u=X(t,`actionLabel`,8,void 0),d=X(t,`onAction`,8,void 0);L(()=>H(l()),()=>{M(a,Ba(l()))}),En(),Ai();var f=Ya(),p=N(f),m=F(p,!0),h=I(p),g=F(h,!0),_=I(h,2),v=e=>{var t=Ja(),r=F(t,!0);R(e=>{Y(t,`href`,B(a)),G(r,e)},[()=>(H(Z),n(),V(()=>Z(`githubLink`,n())))]),W(e,t)};K(_,e=>{B(a)&&e(v)});var y=I(_,2),b=e=>{qa(e,{get label(){return u()},variant:`secondary`,get onClick(){return d()}})};K(y,e=>{u()&&d()&&e(b)}),D(f),R(()=>{li(f,1,`banner ${o()??``}`),Y(f,`role`,o()===`error`?`alert`:`status`),G(m,s()),G(g,c())}),W(e,f),Je(),i()}var Za=U(`
                                            1. :
                                            2. `),Qa=U(`
                                                `),$a=U(`
                                              • `),eo=U(`
                                              • `),to=U(`

                                                `),no=U(`
                                                    `),ro=U(`

                                                    `);function io(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`question`,8);Ai();var o=Nr(),s=P(o),c=e=>{var t=ro(),r=N(t),i=F(r,!0),o=I(r,2),s=N(o),c=I(s),l=e=>{var t=Mr();R(e=>G(t,`(${e??``})`),[()=>(H(Z),H(a()),n(),V(()=>Z(a().runnerRegistryScope===`repository`?`scopeRepository`:`scopeOrganization`,n())))]),W(e,t)};K(c,e=>{H(a()),V(()=>a().runnerRegistryScope)&&e(l)});var u=I(c);D(o);var d=I(o,2),f=e=>{var t=Qa(),r=N(t),i=F(r,!0),o=I(r,2);J(o,5,()=>(H(a()),V(()=>a().runnerProfiles)),q,(e,t)=>{var n=Za(),r=N(n),i=F(r,!0),a=F(I(r,2));D(n),R(e=>{G(i,(B(t),V(()=>B(t).id))),G(a,`${B(t),V(()=>B(t).group||`—`)??``} · ${e??``}`)},[()=>(B(t),V(()=>B(t).labels.join(`, `)))]),W(e,n)}),D(o),D(t),R(e=>G(i,e),[()=>(H($),n(),V(()=>$(`profiles`,n())))]),W(e,t)};K(d,e=>{H(a()),V(()=>a().runnerProfiles?.length)&&e(f)});var p=I(d,2),m=e=>{var t=no(),r=N(t),i=F(r,!0),o=I(r,2);J(o,5,()=>(H(a()),V(()=>a().runnerInventory.groups)),q,(e,t)=>{var r=$a(),i=N(r),a=F(i,!0),o=I(i);D(r),R(e=>{G(a,(B(t),V(()=>B(t).name))),G(o,`: ${e??``}`)},[()=>(H($),B(t),n(),V(()=>$(B(t).access,n())))]),W(e,r)}),D(o);var s=I(o,2);J(s,5,()=>(H(a()),V(()=>a().runnerInventory.candidates.slice(0,10))),q,(e,t)=>{var n=eo(),r=F(N(n),!0);D(n),R(e=>G(r,e),[()=>(B(t),V(()=>B(t).labels.join(`, `)))]),W(e,n)}),D(s);var c=I(s,2),l=e=>{var t=to(),r=F(t,!0);R(e=>G(r,e),[()=>(H($),n(),V(()=>$(`limited`,n())))]),W(e,t)};K(c,e=>{H(a()),V(()=>a().runnerInventory.candidates.length>10)&&e(l)}),D(t),R(e=>G(i,e),[()=>(H($),n(),V(()=>$(`observed`,n())))]),W(e,t)};K(p,e=>{H(a()),V(()=>a().runnerInventory)&&e(m)}),D(t),R((e,t,n,r,a)=>{G(i,e),G(s,`${t??``}: ${n??``}`),G(u,` · ${r??``}: ${a??``}`)},[()=>(H($),n(),V(()=>$(`help`,n()))),()=>(H($),n(),V(()=>$(`registry`,n()))),()=>(H($),H(a()),n(),V(()=>$(a().runnerRegistryStatus??`unavailable`,n()))),()=>(H($),n(),V(()=>$(`inventory`,n()))),()=>(H($),H(a()),n(),V(()=>$(a().runnerInventory?.status??`unavailable`,n())))]),W(e,t)},l=_t(()=>(H(a()),V(()=>a().id.startsWith(`runners.`)&&a().id!==`runners.discover`)));K(s,e=>{B(l)&&e(c)}),W(e,o),Je(),i()}function ao(e){let t=String(e.question.defaultValue),n=t.split(`,`).map(e=>e.trim()).filter(Boolean),r=e.question.kind===`multi-select`?n.includes(`All`)&&e.question.choices?.includes(`All`)?[`All`]:(e.question.choices??[]).filter(e=>e!==`All`&&n.includes(e.split(` — `)[0])):e.question.kind===`scope-overrides`?n:e.question.kind===`producer-select`?t.split(`;`).map(e=>e.trim()).filter(Boolean):e.question.kind===`project-select`?n.filter(t=>e.question.projectCandidates?.some(e=>String(e.number)===t)):[],i=e.question.kind===`project-select`?n.filter(e=>!r.includes(e)).join(`,`):t;return{value:e.question.kind===`producer-select`?``:i,selected:r}}function oo(e,t){return t===`All`?e.includes(`All`)?[]:[`All`]:e.includes(t)?e.filter(e=>e!==t):[...e.filter(e=>e!==`All`),t]}function so(e,t,n){return e.question.kind===`scope-overrides`||e.question.kind===`multi-select`?n.length?n.join(`,`):`none`:e.question.kind===`producer-select`?[...n,...t.split(`;`).map(e=>e.trim()).filter(Boolean)].join(`;`):e.question.kind===`project-select`?[...n,...t.split(`,`).map(e=>e.trim()).filter(Boolean)].join(`,`)||`none`:t}var co={issueCreated:`projectTransitionIssueCreated`,pullRequestCreated:`projectTransitionPullRequestCreated`,issueInProgress:`projectTransitionIssueInProgress`,pullRequestInProgress:`projectTransitionPullRequestInProgress`};function lo(e){if(e)try{let t=new URL(e);if(t.protocol!==`https:`||t.username||t.password||t.search)return;if(t.hostname===`docs.page`&&t.port===``&&t.pathname.startsWith(`/vypdev/copilot/`)||t.hostname===`docs.github.com`&&t.port===``&&t.pathname.startsWith(`/en/`))return t.href}catch{return}}var uo=U(`

                                                    `),fo=U(`

                                                    `),po=U(` `,1);function mo(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`kind`,8),s=X(t,`status`,8),c=X(t,`truncated`,8,!1),l={observed:`checksObserved`,"no-recent-runs":`checksNoRecent`,"no-verifiable-checks":`checksNoVerifiable`,"permission-denied":`checksDenied`,unavailable:`checksUnavailable`},u={observed:`projectsObserved`,empty:`projectsEmpty`,"permission-denied":`projectsDenied`,unavailable:`projectsUnavailable`,unsupported:`projectsUnsupported`};L(()=>(H(s()),H(o())),()=>{M(a,s()?o()===`checks`?l[s()]:u[s()]:void 0)}),En(),Ai();var d=po(),f=P(d),p=e=>{var t=uo(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),B(a),n(),V(()=>Z(B(a),n())))]),W(e,t)};K(f,e=>{B(a)&&e(p)});var m=I(f,2),h=e=>{var t=fo(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),H(o()),n(),V(()=>Z(o()===`checks`?`checksDiscoveryScope`:`projectsDiscoveryScope`,n())))]),W(e,t)};K(m,e=>{(s()===`observed`||s()===`empty`||s()===`no-recent-runs`||s()===`no-verifiable-checks`)&&e(h)});var g=I(m,2),_=e=>{var t=fo(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`discoveryTruncated`,n())))]),W(e,t)};K(g,e=>{c()&&e(_)}),W(e,d),Je(),i()}var ho={en:{success:`Passed`,failure:`Failed`,cancelled:`Cancelled`,neutral:`Neutral`,skipped:`Skipped`,timed_out:`Timed out`,action_required:`Action required`,stale:`Stale`,startup_failure:`Failed to start`,unknown:`Unknown outcome`},es:{success:`Correcto`,failure:`Falló`,cancelled:`Cancelado`,neutral:`Neutral`,skipped:`Omitido`,timed_out:`Agotó el tiempo`,action_required:`Requiere intervención`,stale:`Obsoleto`,startup_failure:`Falló al iniciar`,unknown:`Resultado desconocido`},fr:{success:`Réussi`,failure:`Échoué`,cancelled:`Annulé`,neutral:`Neutre`,skipped:`Ignoré`,timed_out:`Délai dépassé`,action_required:`Action nécessaire`,stale:`Obsolète`,startup_failure:`Échec au démarrage`,unknown:`Résultat inconnu`},pt:{success:`Concluído`,failure:`Falhou`,cancelled:`Cancelado`,neutral:`Neutro`,skipped:`Ignorado`,timed_out:`Tempo esgotado`,action_required:`Ação necessária`,stale:`Obsoleto`,startup_failure:`Falha ao iniciar`,unknown:`Resultado desconhecido`}};function go(e,t){return ho[t][e]??ho[t].unknown}function _o(e,t,n){let r=e.trim(),i=n.trim(),a=String(t??``).trim(),o=Number(a);if(!(!r||!i||r.length>100||i.length>100||/[|;\r\n]/u.test(r+i)||!/^[1-9]\d*$/u.test(a)||!Number.isSafeInteger(o)))return`${r}|${o}|${i}`}var vo=U(` `),yo=U(`
                                                    `),bo=U(`
                                                  • `),xo=U(`
                                                      `),So=U(``),Co=U(`

                                                      `,1);function wo(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=j(),s=X(t,`candidates`,8),c=X(t,`selected`,12),l=X(t,`controller`,8),u=j(``),d=j(``),f=j(``),p=j(!1);function m(){let e=_o(B(u),B(d),B(f));if(!e||c().length>=8){M(p,!0);return}M(p,!1),c().includes(e)||c([...c(),e]),M(u,``),M(d,``),M(f,``)}L(()=>H(s()),()=>{M(a,new Set(s().map(e=>`${e.name}|${e.sourceAppId}|${e.workflowName}`)))}),L(()=>(H(c()),B(a)),()=>{M(o,c().filter(e=>!B(a).has(e)))}),En(),Ai();var h=Co(),g=P(h);J(g,5,s,q,(e,t)=>{let r=k(()=>(B(t),V(()=>`${B(t).name}|${B(t).sourceAppId}|${B(t).workflowName}`)));var i=yo(),a=N(i),o=N(a);bi(o);var s=I(o,2),u=N(s),d=F(N(u),!0);D(u);var f=I(u),p=F(N(f));D(f);var m=F(I(f),!0);D(s),D(a);var h=I(a,2),g=N(h),_=e=>{var r=vo(),i=F(r,!0);R((e,t)=>{Y(r,`href`,e),G(i,t)},[()=>(H(Ha),B(t),V(()=>Ha(B(t).runUrl))),()=>(H(Z),n(),V(()=>Z(`ciRun`,n())))]),W(e,r)},v=_t(()=>(H(Ha),B(t),V(()=>Ha(B(t).runUrl))));K(g,e=>{B(v)&&e(_)});var y=I(g,2),b=e=>{var r=vo(),i=F(r,!0);R((e,t)=>{Y(r,`href`,e),G(i,t)},[()=>(H(Ua),B(t),V(()=>Ua(B(t).requiredByRuleset?.sourceUrl))),()=>(H(Z),n(),V(()=>Z(`ciRule`,n())))]),W(e,r)},x=_t(()=>(H(Ua),B(t),V(()=>Ua(B(t).requiredByRuleset?.sourceUrl))));K(y,e=>{B(x)&&e(b)}),D(h),D(i),R((e,n,r,i,a,s)=>{xi(o,e),o.disabled=n,G(d,(B(t),V(()=>B(t).name))),G(p,`${B(t),V(()=>B(t).workflowName)??``} · ${B(t),V(()=>B(t).sourceAppName??`GitHub App`)??``} ${B(t),V(()=>B(t).sourceAppId)??``} · ${r??``} · ${i??``} · ${a??``}`),G(m,s)},[()=>(H(c()),H(B(r)),V(()=>c().includes(B(r)))),()=>(H(l()),H(c()),H(B(r)),V(()=>!l()||c().length>=8&&!c().includes(B(r)))),()=>(H(go),B(t),n(),V(()=>go(B(t).conclusion,n()))),()=>(B(t),V(()=>B(t).headSha.slice(0,7))),()=>(B(t),H(Z),n(),V(()=>B(t).observedAt??Z(`observationTimeUnknown`,n()))),()=>(B(t),H(Z),n(),V(()=>B(t).requiredByRuleset?Z(`branchRequirementObserved`,n(),{branch:B(t).requiredByRuleset.branch}):Z(`branchRequirementUnknown`,n())))]),Cr(`change`,o,()=>c(oo(c(),B(r)))),W(e,i)}),D(g);var _=I(g,2),v=e=>{var t=xo();J(t,5,()=>B(o),q,(e,t)=>{var r=bo(),i=N(r),a=F(i,!0),o=I(i,2),s=F(o,!0);D(r),R(e=>{G(a,B(t)),o.disabled=!l(),G(s,e)},[()=>(H(Z),n(),V(()=>Z(`producerRemove`,n())))]),Cr(`click`,o,()=>c(oo(c(),B(t)))),W(e,r)}),D(t),W(e,t)};K(_,e=>{B(o),V(()=>B(o).length)&&e(v)});var y=I(_,2),b=F(y,!0),x=I(y,2),S=N(x),C=N(S,!0),w=I(C);bi(w),D(S);var ee=I(S,2),te=N(ee,!0),ne=I(te);bi(ne),D(ee);var re=I(ee,2),ie=N(re,!0),ae=I(ie);bi(ae),D(re),D(x);var oe=I(x,2),se=F(oe,!0),ce=I(oe,2),le=e=>{var t=So(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`producerManualInvalid`,n())))]),W(e,t)};K(ce,e=>{B(p)&&e(le)}),R((e,t,n,r,i,a)=>{Y(g,`aria-label`,e),G(b,t),G(C,n),w.disabled=!l(),G(te,r),ne.disabled=!l(),G(ie,i),ae.disabled=!l(),oe.disabled=!l(),G(se,a)},[()=>(H(Z),n(),V(()=>Z(`checksObserved`,n()))),()=>(H(Z),n(),V(()=>Z(`producerManualHelp`,n()))),()=>(H(Z),n(),V(()=>Z(`producerName`,n()))),()=>(H(Z),n(),V(()=>Z(`producerAppId`,n()))),()=>(H(Z),n(),V(()=>Z(`producerWorkflow`,n()))),()=>(H(Z),n(),V(()=>Z(`producerAdd`,n())))]),Ti(w,()=>B(u),e=>M(u,e)),Ti(ne,()=>B(d),e=>M(d,e)),Ti(ae,()=>B(f),e=>M(f,e)),Cr(`click`,oe,m),W(e,h),Je(),i()}wr([`change`,`click`]);var To=U(` `),Eo=U(`
                                                      `),Do=U(`
                                                    • `),Oo=U(`

                                                        `,1),ko=U(`
                                                        `,1);function Ao(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=j(),s=X(t,`candidates`,8),c=X(t,`selected`,12),l=X(t,`value`,12),u=X(t,`controller`,8);L(()=>H(s()),()=>{M(a,new Set(s().map(e=>String(e.number))))}),L(()=>(H(c()),B(a)),()=>{M(o,c().filter(e=>!B(a).has(e)))}),En(),Ai();var d=ko(),f=P(d);J(f,5,s,q,(e,t)=>{var r=Eo(),i=N(r),a=N(i);bi(a);var o=I(a,2),s=N(o),l=F(N(s),!0);D(s);var d=I(s),f=F(N(d));D(d),D(o),D(i);var p=I(i,2),m=e=>{var r=To(),i=F(r,!0);R((e,t)=>{Y(r,`href`,e),G(i,t)},[()=>(H(Wa),B(t),V(()=>Wa(B(t).url))),()=>(H(Z),n(),V(()=>Z(`projectUrl`,n())))]),W(e,r)},h=_t(()=>(H(Wa),B(t),V(()=>Wa(B(t).url))));K(p,e=>{B(h)&&e(m)}),D(r),R((e,n)=>{xi(a,e),a.disabled=n,G(l,(B(t),V(()=>B(t).title))),G(f,`${B(t),V(()=>B(t).owner)??``} · #${B(t),V(()=>B(t).number)??``}`)},[()=>(H(c()),B(t),V(()=>c().includes(String(B(t).number)))),()=>(H(u()),H(c()),B(t),V(()=>!u()||c().length>=10&&!c().includes(String(B(t).number))))]),Cr(`change`,a,()=>c(oo(c(),String(B(t).number)))),W(e,r)}),D(f);var p=I(f,2),m=e=>{var t=Oo(),r=P(t),i=F(r,!0),a=I(r,2);J(a,5,()=>B(o),q,(e,t)=>{var r=Do(),i=N(r),a=F(i),o=I(i,2),s=F(o,!0);D(r),R(e=>{G(a,`#${B(t)??``}`),o.disabled=!u(),G(s,e)},[()=>(H(Z),n(),V(()=>Z(`removeSelection`,n())))]),Cr(`click`,o,()=>c(oo(c(),B(t)))),W(e,r)}),D(a),R(e=>G(i,e),[()=>(H(Z),n(),V(()=>Z(`projectSelectionNotObserved`,n())))]),W(e,t)};K(p,e=>{B(o),V(()=>B(o).length)&&e(m)});var h=I(p,2),g=N(h),_=F(g,!0),v=I(g,2);bi(v),D(h),R((e,t)=>{Y(f,`aria-label`,e),G(_,t),v.disabled=!u()},[()=>(H(Z),n(),V(()=>Z(`projectsObserved`,n()))),()=>(H(Z),n(),V(()=>Z(`projectManual`,n())))]),Ti(v,l),W(e,d),Je(),i()}wr([`change`,`click`]);var jo=U(``),Mo=U(`
                                                        `),No=U(` `,1);function Po(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`explanation`,8),o=X(t,`helpUrl`,8);Ai();var s=No(),c=P(s),l=e=>{var t=jo(),r=N(t),i=F(r);D(t),R(e=>{Y(r,`href`,o()),G(i,`${e??``} ↗`)},[()=>(H(Z),n(),V(()=>Z(`learnMore`,n())))]),W(e,t)};K(c,e=>{o()&&e(l)});var u=I(c,2),d=e=>{var t=Mo(),r=N(t),i=F(r,!0),o=I(r),s=N(o),c=F(s,!0),l=I(s),u=F(l,!0),d=I(l,2),f=F(d,!0),p=I(d),m=F(p,!0),h=I(p,2),g=F(h,!0),_=I(h),v=F(_,!0),y=I(_,2),b=F(y,!0),x=I(y),S=F(x,!0),C=I(x,2),w=F(C,!0),ee=I(C),te=F(ee,!0),ne=I(ee,2),re=F(ne,!0),ie=I(ne),ae=F(ie,!0),oe=I(ie,2),se=F(oe,!0),ce=F(I(oe),!0);D(o),D(t),R((e,t,n,r,o,s,l,d)=>{G(i,e),G(c,t),G(u,(H(a()),V(()=>a().when))),G(f,n),G(m,(H(a()),V(()=>a().where))),G(g,r),G(v,(H(a()),V(()=>a().how))),G(b,o),G(S,(H(a()),V(()=>a().why))),G(w,s),G(te,(H(a()),V(()=>a().example))),G(re,l),G(ae,(H(a()),V(()=>a().effect))),G(se,d),G(ce,(H(a()),V(()=>a().verify)))},[()=>(H(Z),n(),V(()=>Z(`whyMatters`,n()))),()=>(H(Z),n(),V(()=>Z(`whenApplies`,n()))),()=>(H(Z),n(),V(()=>Z(`whereConfigured`,n()))),()=>(H(Z),n(),V(()=>Z(`howToChoose`,n()))),()=>(H(Z),n(),V(()=>Z(`whyRecommendation`,n()))),()=>(H(Z),n(),V(()=>Z(`example`,n()))),()=>(H(Z),n(),V(()=>Z(`effect`,n()))),()=>(H(Z),n(),V(()=>Z(`verify`,n())))]),W(e,t)};K(u,e=>{a()&&e(d)}),W(e,s),Je(),i()}var Fo=U(`· `,1),Io=U(`

                                                        `,1);function Lo(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`candidate`,8);Ai();var o=Io(),s=P(o),c=N(s),l=F(c),u=I(c,2),d=e=>{var t=Fo(),r=I(P(t)),i=F(r,!0);R((e,t)=>{Y(r,`href`,e),G(i,t)},[()=>(H(Ha),H(a()),V(()=>Ha(a().runUrl))),()=>(H(Z),n(),V(()=>Z(`ciRun`,n())))]),W(e,t)},f=_t(()=>(H(Ha),H(a()),V(()=>Ha(a().runUrl))));K(u,e=>{B(f)&&e(d)}),D(s);var p=I(s,2),m=N(p),h=F(m),g=I(m),_=I(g),v=e=>{var t=Fo(),r=I(P(t)),i=F(r,!0);R((e,t)=>{Y(r,`href`,e),G(i,t)},[()=>(H(Ua),H(a()),V(()=>Ua(a().requiredByRuleset?.sourceUrl))),()=>(H(Z),n(),V(()=>Z(`ciRule`,n())))]),W(e,t)},y=_t(()=>(H(Ua),H(a()),V(()=>Ua(a().requiredByRuleset?.sourceUrl))));K(_,e=>{B(y)&&e(v)}),D(p),R((e,t,n,r)=>{G(l,`${H(a()),V(()=>a().workflowName)??``} · GitHub App ${H(a()),V(()=>a().sourceAppId)??``}`),G(h,`${e??``} · ${t??``} · ${n??``}`),G(g,` · ${r??``} `)},[()=>(H(go),H(a()),n(),V(()=>go(a().conclusion,n()))),()=>(H(a()),V(()=>a().headSha.slice(0,7))),()=>(H(a()),H(Z),n(),V(()=>a().observedAt??Z(`observationTimeUnknown`,n()))),()=>(H(a()),H(Z),n(),V(()=>a().requiredByRuleset?Z(`branchRequirementObserved`,n(),{branch:a().requiredByRuleset.branch}):Z(`branchRequirementUnknown`,n())))]),W(e,o),Je(),i()}var Ro=U(`

                                                        `);function zo(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`question`,8);Ai();var o=Nr(),s=P(o),c=e=>{var t=Ro(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`fixedIssuesRequired`,n())))]),W(e,t)},l=e=>{var t=Nr();J(P(t),1,()=>(H(a()),V(()=>Object.entries(a().fixedWorkflowFeatures).filter(([,e])=>e!==void 0))),q,(e,t)=>{var r=_t(()=>b(B(t),2));let i=()=>B(r)[0],a=()=>B(r)[1];var o=Ro(),s=F(o,!0);R(e=>G(s,e),[()=>(H(Z),a(),n(),i(),V(()=>Z(a()?`fixedWorkflowEnabled`:`fixedWorkflowDisabled`,n(),{kind:i()})))]),W(e,o)}),W(e,t)};K(s,e=>{H(a()),V(()=>a().id===`features.issues`&&(a().fixedWorkflowFeatures?.release||a().fixedWorkflowFeatures?.hotfix))?e(c):(H(a()),V(()=>a().fixedWorkflowFeatures)&&e(l,1))}),W(e,o),Je(),i()}var Bo=U(` `),Vo=U(`

                                                        `),Ho=U(`

                                                        `),Uo=U(` `,1),Wo=U(`

                                                        `),Go=U(`
                                                        `),Ko=U(`

                                                        `),qo=U(``),Jo=U(`
                                                      • `),Yo=U(`
                                                          `),Xo=U(`
                                                          `),Zo=U(``),Qo=U(``),$o=U(` `,1),es=U(``),ts=U(`
                                                          `),ns=U(``),rs=U(``),is=U(`

                                                          `,1);function as(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=j(),s=j(),c=X(t,`prompt`,8),l=X(t,`controller`,8),u=X(t,`busy`,8),d=X(t,`onSubmit`,8),f=X(t,`onRetryDiscovery`,8),p=X(t,`onBack`,8),m=ao(c()),h=j(m.value),g=j(m.selected);L(()=>(H(c()),n()),()=>{M(a,c().presentation?.[n()])}),L(()=>B(a),()=>{M(o,lo(B(a)?.documentation?.url))}),L(()=>(H(c()),n()),()=>{M(s,ja(c().question,n()))}),En(),Ai();var _=is(),v=P(_),y=N(v),b=F(y,!0),x=I(y),S=e=>{var t=Bo(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`permissionPreview`,n())))]),W(e,t)};K(x,e=>{H(c()),V(()=>c().phase===`permission-intent`)&&e(S)}),D(v);var C=I(v,2),w=e=>{var t=Vo(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),H(c()),V(()=>Z(`questionProgress`,n(),{current:String(c().progress.groupPosition),total:String(c().progress.groupTotal),overall:String(c().progress.position),all:String(c().progress.total)})))]),W(e,t)};K(C,e=>{H(c()),V(()=>c().progress)&&e(w)});var ee=I(C,2),te=e=>{var t=Ho(),n=F(t,!0);R(()=>G(n,(B(a),V(()=>B(a).summary)))),W(e,t)};K(ee,e=>{B(a)&&e(te)});var ne=I(ee,2),re=e=>{mo(e,{kind:`checks`,get status(){return H(c()),V(()=>c().question.discoveryStatus)},get truncated(){return H(c()),V(()=>c().question.discoveryTruncated)}})};K(ne,e=>{H(c()),V(()=>c().question.id===`pullRequestApproval.testChecks`)&&e(re)});var ie=I(ne,2),ae=e=>{mo(e,{kind:`projects`,get status(){return H(c()),V(()=>c().question.discoveryStatus)},get truncated(){return H(c()),V(()=>c().question.discoveryTruncated)}})};K(ie,e=>{H(c()),V(()=>c().question.id===`projects.ids`)&&e(ae)});var oe=I(ie,2),se=e=>{var t=Go(),r=N(t),i=e=>{var t=Uo(),r=P(t),i=F(r,!0),a=F(I(r,2),!0);R((e,t)=>{r.disabled=!l()||u(),G(i,e),G(a,t)},[()=>(H(Z),n(),V(()=>Z(`retryDiscovery`,n()))),()=>(H(Z),n(),H(c()),V(()=>Z(`retryRemaining`,n(),{count:String(c().question.discoveryRetryRemaining)})))]),Cr(`click`,r,function(...e){f()?.apply(this,e)}),W(e,t)},a=e=>{var t=Wo(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`retryExhausted`,n())))]),W(e,t)};K(r,e=>{H(c()),V(()=>c().question.discoveryRetryRemaining>0)?e(i):e(a,-1)}),D(t),W(e,t)};K(oe,e=>{H(c()),V(()=>c().question.discoveryRetryRemaining!==void 0)&&e(se)});var ce=I(oe,2),le=e=>{var t=Ko(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`projectStatusUnavailable`,n())))]),W(e,t)};K(ce,e=>{H(c()),V(()=>c().question.statusOptionState===`unavailable`)&&e(le)});var ue=I(ce,2),de=e=>{var t=qo(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`projectStatusIncompatible`,n())))]),W(e,t)};K(ue,e=>{H(c()),V(()=>c().question.statusOptionState===`incompatible`)&&e(de)});var fe=I(ue,2),pe=e=>{var t=Wo(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`projectSharedStatus`,n())))]),W(e,t)};K(fe,e=>{H(c()),V(()=>c().question.id===`projects.ids`)&&e(pe)});var me=I(fe,2);zo(me,{get question(){return H(c()),V(()=>c().question)}});var he=I(me,2),ge=e=>{var t=Yo();J(t,5,()=>(H(c()),V(()=>c().question.projectStatusValues)),q,(e,t)=>{var r=Jo(),i=N(r),a=I(i),o=F(N(a),!0);D(a),D(r),R(e=>{G(i,`${e??``}: `),G(o,(B(t),V(()=>B(t).value)))},[()=>(H(Z),H(co),B(t),n(),V(()=>Z(co[B(t).transition],n())))]),W(e,r)}),D(t),W(e,t)};K(he,e=>{H(c()),V(()=>c().question.projectStatusValues)&&e(ge)});var _e=I(he,2),ve=e=>{var t=Xo(),r=N(t);let i;var o=F(r,!0),s=I(r);let u;var d=F(s,!0);D(t),R((e,n)=>{Y(t,`aria-label`,(B(a),H(c()),V(()=>B(a)?.label??c().question.label))),Y(r,`aria-pressed`,B(h)===`yes`||B(h)===`true`),r.disabled=!l(),i=li(r,1,``,null,i,{selected:B(h)===`yes`||B(h)===`true`}),G(o,e),Y(s,`aria-pressed`,B(h)===`no`||B(h)===`false`),s.disabled=!l(),u=li(s,1,``,null,u,{selected:B(h)===`no`||B(h)===`false`}),G(d,n)},[()=>(H(Z),n(),V(()=>Z(`yes`,n()))),()=>(H(Z),n(),V(()=>Z(`no`,n())))]),Cr(`click`,r,()=>M(h,`yes`)),Cr(`click`,s,()=>M(h,`no`)),W(e,t)},ye=e=>{var t=$o(),r=P(t),i=N(r),o=e=>{var t=Zo(),r=F(t,!0);t.value=t.__value=``,R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`selectOne`,n())))]),W(e,t)};K(i,e=>{H(c()),V(()=>!c().question.defaultValue)&&e(o)}),J(I(i),1,()=>(H(c()),V(()=>c().question.choices??[])),q,(e,t)=>{let r=k(()=>(H(c()),B(t),V(()=>c().question.id===`pullRequestApproval.coverage.checkName`?c().question.trustedProducers?.find(e=>e.name===B(t)):void 0)));var i=Qo(),a=F(i,!0),o={};R(e=>{G(a,e),o!==(o=B(t))&&(i.value=(i.__value=o)??``)},[()=>(H(B(r)),B(t),H(Aa),H(c()),n(),V(()=>B(r)?`${B(t)} — ${B(r).workflowName} · App ${B(r).sourceAppId}`:Aa(c().question.id,B(t),n())))]),W(e,i)}),D(r),pi(r);var s=I(r,2),u=e=>{var t=Nr();J(P(t),1,()=>(H(c()),B(h),V(()=>(c().question.producerCandidates??[]).filter(e=>e.name===B(h)))),q,(e,t)=>{Lo(e,{get candidate(){return B(t)}})}),W(e,t)};K(s,e=>{H(c()),V(()=>c().question.id===`pullRequestApproval.coverage.checkName`)&&e(u)}),R(()=>{Y(r,`aria-label`,(B(a),H(c()),V(()=>B(a)?.label??c().question.label))),r.disabled=!l()}),mi(r,()=>B(h),e=>M(h,e)),W(e,t)},be=e=>{{let t=k(()=>(H(c()),V(()=>c().question.producerCandidates??[])));wo(e,{get candidates(){return B(t)},get controller(){return l()},get selected(){return B(g)},set selected(e){M(g,e)},$$legacy:!0})}},xe=e=>{{let t=k(()=>(H(c()),V(()=>c().question.projectCandidates??[])));Ao(e,{get candidates(){return B(t)},get controller(){return l()},get selected(){return B(g)},set selected(e){M(g,e)},get value(){return B(h)},set value(e){M(h,e)},$$legacy:!0})}},Se=e=>{var t=ts();J(t,5,()=>(H(c()),V(()=>c().question.kind===`multi-select`?c().question.choices??[]:c().question.allowedNames??[])),q,(e,t)=>{var r=es(),i=N(r);bi(i);var a=F(I(i),!0);D(r),R((e,t)=>{xi(i,e),i.disabled=!l(),G(a,t)},[()=>(B(g),B(t),V(()=>B(g).includes(B(t)))),()=>(H(c()),H(Aa),B(t),n(),V(()=>c().question.kind===`multi-select`?Aa(c().question.id,B(t),n()):B(t)))]),Cr(`change`,i,()=>M(g,oo(B(g),B(t)))),W(e,r)}),D(t),R(()=>Y(t,`aria-label`,(B(a),H(c()),V(()=>B(a)?.label??c().question.label)))),W(e,t)},Ce=e=>{var t=Nr(),n=P(t),r=e=>{var t=ns();at(t),R(()=>{Y(t,`aria-label`,(B(a),H(c()),V(()=>B(a)?.label??c().question.label))),t.disabled=!l()}),Ti(t,()=>B(h),e=>M(h,e)),W(e,t)},i=e=>{var t=rs();bi(t),R(()=>{Y(t,`aria-label`,(B(a),H(c()),V(()=>B(a)?.label??c().question.label))),Y(t,`type`,(H(c()),V(()=>c().question.kind===`number`?`number`:`text`))),Y(t,`min`,(H(c()),V(()=>c().question.kind===`number`?0:void 0))),t.disabled=!l()}),Ti(t,()=>B(h),e=>M(h,e)),W(e,t)};K(n,e=>{H(c()),V(()=>c().question.id===`ai.bugbotOrganizationRules`)?e(r):e(i,-1)}),W(e,t)};K(_e,e=>{H(c()),V(()=>c().question.kind===`boolean`)?e(ve):(H(c()),V(()=>c().question.kind===`choice`)?e(ye,1):(H(c()),V(()=>c().question.kind===`producer-select`)?e(be,2):(H(c()),V(()=>c().question.kind===`project-select`)?e(xe,3):(H(c()),V(()=>c().question.kind===`multi-select`||c().question.kind===`scope-overrides`)?e(Se,4):e(Ce,-1)))))});var we=I(_e,2),T=F(we,!0),Te=I(we,2),E=e=>{var t=Vo(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),H(c()),n(),V(()=>Z(c().question.suggestionSource===`github`?`sourceGithub`:c().question.suggestionSource===`local`?`sourceLocal`:c().question.suggestionSource===`configuration`?`sourceConfig`:`sourceDefault`,n())))]),W(e,t)};K(Te,e=>{H(c()),V(()=>c().question.suggestionSource)&&e(E)});var Ee=I(Te,2);io(Ee,{get question(){return H(c()),V(()=>c().question)}});var De=I(Ee,2);Po(De,{get explanation(){return B(a)},get helpUrl(){return B(o)}});var Oe=I(De,2),ke=N(Oe),Ae=e=>{{let t=k(()=>(H(Z),n(),V(()=>Z(`previousQuestion`,n())))),r=k(()=>!l()||u());qa(e,{get label(){return B(t)},variant:`secondary`,get onClick(){return p()},get disabled(){return B(r)}})}};K(ke,e=>{H(c()),V(()=>c().canGoBack)&&e(Ae)});var je=I(ke,2);{let e=k(()=>(H(Z),n(),V(()=>Z(`continue`,n())))),t=k(()=>!l()||u());qa(je,{get label(){return B(e)},arrow:!0,onClick:()=>d()(so(c(),B(h),B(g))),get disabled(){return B(t)}})}D(Oe),R((e,t)=>{G(b,e),G(T,t)},[()=>(B(a),H(c()),V(()=>B(a)?.label??c().question.label.replace(` (Space toggles, Enter confirms)`,``))),()=>(H(Z),n(),B(s),V(()=>Z(`suggested`,n(),{answer:B(s)})))]),W(e,_),Je(),i()}wr([`click`,`change`]);var os=U(` `),ss=U(``),cs=U(`
                                                          `,1);function ls(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`prompt`,8),s=X(t,`controller`,8),c=X(t,`busy`,8),l=X(t,`onSubmit`,8);L(()=>(H(o()),Va),()=>{M(a,o().copyId===`botPat.scopeConflict`||o().copyId===`botPat.scopeConflictUnavailable`?Va(o().copyValues?.repository):void 0)}),En(),Ai();var u=cs(),d=P(u),f=e=>{var t=os(),r=N(t);Oe(),D(t),R(e=>{Y(t,`href`,B(a)),G(r,`${e??``} `)},[()=>(H(Z),n(),V(()=>Z(`repositorySecretSettings`,n())))]),W(e,t)};K(d,e=>{B(a)&&e(f)});var p=I(d,2);J(p,5,()=>(H(o()),V(()=>o().choices)),q,(e,t,r)=>{var i=ss(),a=F(N(i),!0);Oe(),D(i),R(e=>{i.disabled=!s()||c(),G(a,e)},[()=>(H(La),H(o()),n(),V(()=>La(o(),n(),r)))]),Cr(`click`,i,()=>l()(B(t))),W(e,i)}),D(p),W(e,u),Je(),i()}wr([`click`]);var us=U(`

                                                          `),ds=U(`

                                                          `,1),fs=U(``);function ps(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`storage`,8);Ai();var o=fs(),s=N(o),c=F(s,!0),l=I(s,2),u=F(l,!0),d=I(l,2),f=e=>{var t=ds(),r=P(t),i=F(r,!0),o=I(r,2),s=e=>{var t=us(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`patOrganizationImpact`,n())))]),W(e,t)};K(o,e=>{H(a()),V(()=>a().scope===`organization`&&a().replacesExisting)&&e(s)}),R(e=>G(i,e),[()=>(H(Z),n(),V(()=>Z(`patReplacementChecks`,n())))]),W(e,t)};K(d,e=>{H(a()),V(()=>a().operation!==`retain`)&&e(f)}),D(o),R((e,t)=>{G(c,e),G(u,t)},[()=>(H(Z),n(),V(()=>Z(`patStorageTitle`,n()))),()=>(H(Z),H(a()),n(),V(()=>Z(a().operation===`retain`?`patStorageRetain`:a().replacesExisting?a().scope===`repository`?`patRepositoryReplace`:`patOrganizationReplace`:a().scope===`repository`?`patRepositoryCreate`:`patOrganizationCreate`,n(),{destination:a().destination})))]),W(e,o),Je(),i()}var ms=U(``),hs=U(`

                                                          `,1),gs=U(`

                                                          `),_s=U(`
                                                          `,1);function vs(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=j(),s=j(),c=j(),l=X(t,`prompt`,8),u=X(t,`controller`,8),d=X(t,`busy`,8),f=X(t,`onSubmit`,8),p=j(``);function m(){let e=B(p);l().kind===`secret`&&M(p,``),f()(e)}L(()=>H(l()),()=>{M(a,Ba(l().link))}),L(()=>H(l()),()=>{M(o,l().copyId===`botPat.entry.guided`?l().copyValues?.account:void 0)}),L(()=>H(l()),()=>{M(s,l().copyId===`botPat.entry.guided`||l().copyId===`botPat.entry.manual`)}),L(()=>(B(s),H(l())),()=>{M(c,B(s)?l().copyValues?.storageScope:void 0)}),En(),Ai();var h=_s(),g=P(h),_=e=>{var t=hs(),r=P(t),i=e=>{var t=ms(),r=N(t),i=F(r,!0),a=F(I(r,2),!0);D(t),R((e,t)=>{G(i,e),G(a,t)},[()=>(H(Z),n(),B(o),V(()=>Z(`botAccountWarning`,n(),{account:B(o)}))),()=>(H(Z),n(),V(()=>Z(`botAccountHelp`,n())))]),W(e,t)};K(r,e=>{B(o)&&e(i)});var s=I(r,2),c=N(s);Oe(),D(s);var l=F(I(s,2),!0);R((e,t)=>{Y(s,`href`,B(a)),Y(s,`aria-describedby`,B(o)?`bot-account-warning`:void 0),G(c,`${e??``} `),G(l,t)},[()=>(B(o),H(Z),n(),V(()=>B(o)?Z(`botGithubForm`,n(),{account:B(o)}):Z(`githubForm`,n()))),()=>(H(Z),n(),V(()=>Z(`githubFormHelp`,n())))]),W(e,t)};K(g,e=>{B(a)&&e(_)});var v=I(g,2),y=e=>{{let t=k(()=>(B(c),H(l()),V(()=>({scope:B(c),destination:l().copyValues.storageDestination,replacesExisting:l().copyValues.storageReplacesExisting===`true`}))));ps(e,{get storage(){return B(t)}})}};K(v,e=>{B(c),H(l()),V(()=>(B(c)===`repository`||B(c)===`organization`)&&l().copyValues?.storageDestination)&&e(y)});var b=I(v,2),x=F(b,!0),S=I(b,2);bi(S);var C=I(S,2),w=e=>{var t=gs(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`secretHelp`,n())))]),W(e,t)};K(C,e=>{H(l()),V(()=>l().kind===`secret`)&&e(w)});var ee=I(C,2),te=N(ee);{let e=k(()=>(H(Z),n(),V(()=>Z(`continue`,n())))),t=k(()=>(H(u()),H(d()),H(l()),B(p),V(()=>!u()||d()||!l().optional&&!B(p).trim())));qa(te,{get label(){return B(e)},arrow:!0,onClick:m,get disabled(){return B(t)}})}D(ee),R((e,t)=>{G(x,e),Y(S,`type`,(H(l()),V(()=>l().kind===`secret`?`password`:`text`))),S.disabled=!u(),Y(S,`placeholder`,t)},[()=>(H(Z),H(l()),n(),V(()=>Z(l().kind===`secret`?`pasteHere`:`yourAnswer`,n()))),()=>(H(Z),H(l()),n(),V(()=>Z(l().kind===`secret`?`hiddenAfter`:`typeAnswer`,n())))]),Ti(S,()=>B(p),e=>M(p,e)),W(e,h),Je(),i()}var ys={"No issue workflow kind is enabled; issue events will remain unmanaged until a supported Issue Form and profile entry are enabled.":`No issue workflow kind is enabled; issue events will remain unmanaged until a supported Issue Form and profile entry are enabled.`,"Help / question issues remain branchless even when issue-managed-branches is enabled.":`Help / question issues remain branchless even when issue-managed-branches is enabled.`,"Release automation is installed, but release issue events are disabled by the selected issue workflow profile.":`Release automation is installed, but release issue events are disabled by the selected issue workflow profile.`,"Hotfix automation is installed, but hotfix issue events are disabled by the selected issue workflow profile.":`Hotfix automation is installed, but hotfix issue events are disabled by the selected issue workflow profile.`,"Repository agent guidance generation is disabled; collaborators will not receive the generated profile or workflow skill.":`Repository agent guidance generation is disabled; collaborators will not receive the generated profile or workflow skill.`,"Release and hotfix workflows require the workflow PAT Secret and a writable token.":`Release and hotfix workflows require the workflow PAT Secret and a writable token.`,"Merge queue mode fails closed unless every required producer is verified automatically or covered by an exact reviewed attestation.":`Merge queue mode fails closed unless every required producer is verified automatically or covered by an exact reviewed attestation.`,"Inactive issue closure is enabled; waiting issues are closed after the configured inactivity threshold and can be reopened with a new comment.":`Inactive issue closure is enabled; waiting issues are closed after the configured inactivity threshold and can be reopened with a new comment.`,"Selected Project numbers must be accessible to the bot PAT, and all four configured Status values must exist in every selected Project.":`Selected Project numbers must be accessible to the bot PAT, and all four configured Status values must exist in every selected Project.`,"Cursor is an experimental runtime in Copilot and requires a compatible CLI plus CURSOR_API_KEY; the Action installs the official CLI when the default executable is absent.":`Cursor is an experimental runtime in Copilot and requires a compatible CLI plus CURSOR_API_KEY; the Action installs the official CLI when the default executable is absent.`,"Organization-level Secrets and Variables require organization permissions; selected access is the safest default and repository values take precedence.":`Organization-level Secrets and Variables require organization permissions; selected access is the safest default and repository values take precedence.`},bs={en:ys,es:{"No issue workflow kind is enabled; issue events will remain unmanaged until a supported Issue Form and profile entry are enabled.":`No has activado ningún tipo de flujo de incidencias. Sus eventos no se gestionarán hasta que actives un formulario de incidencia y su entrada en el perfil.`,"Help / question issues remain branchless even when issue-managed-branches is enabled.":`Las incidencias de ayuda y consulta no crean ramas, aunque actives las ramas gestionadas por incidencias.`,"Release automation is installed, but release issue events are disabled by the selected issue workflow profile.":`La automatización de versiones ya está instalada, pero el perfil elegido desactiva los eventos de incidencias de versiones.`,"Hotfix automation is installed, but hotfix issue events are disabled by the selected issue workflow profile.":`La automatización de correcciones urgentes ya está instalada, pero el perfil elegido desactiva los eventos de sus incidencias.`,"Repository agent guidance generation is disabled; collaborators will not receive the generated profile or workflow skill.":`Has desactivado la generación de instrucciones para agentes del repositorio. Los colaboradores no recibirán el perfil ni la guía del flujo de trabajo generados.`,"Release and hotfix workflows require the workflow PAT Secret and a writable token.":`Los flujos de versiones y correcciones urgentes requieren el Secret con el PAT de la Action y un token con permisos de escritura.`,"Merge queue mode fails closed unless every required producer is verified automatically or covered by an exact reviewed attestation.":`La cola de merge bloqueará la operación si cada productor obligatorio no se verifica automáticamente o no dispone de una certificación exacta revisada.`,"Inactive issue closure is enabled; waiting issues are closed after the configured inactivity threshold and can be reopened with a new comment.":`Está activado el cierre de incidencias inactivas. Las que estén en espera se cerrarán tras el plazo configurado y podrán reabrirse con un comentario.`,"Selected Project numbers must be accessible to the bot PAT, and all four configured Status values must exist in every selected Project.":`El PAT del bot debe tener acceso a los Projects seleccionados, y los cuatro valores de Status configurados deben existir en cada uno de ellos.`,"Cursor is an experimental runtime in Copilot and requires a compatible CLI plus CURSOR_API_KEY; the Action installs the official CLI when the default executable is absent.":`Cursor es un entorno experimental en Copilot y requiere un CLI compatible y CURSOR_API_KEY; la Action instala el CLI oficial si falta el ejecutable predeterminado.`,"Organization-level Secrets and Variables require organization permissions; selected access is the safest default and repository values take precedence.":`Los Secrets y Variables de organización requieren permisos en ella. Limitar el acceso a los repositorios elegidos es la opción más segura; los valores del repositorio tienen prioridad.`},fr:{"No issue workflow kind is enabled; issue events will remain unmanaged until a supported Issue Form and profile entry are enabled.":`Aucun type de flux de travail pour les tickets n’est activé. Leurs événements ne seront pas gérés tant qu’un formulaire de ticket pris en charge et son entrée de profil ne seront pas activés.`,"Help / question issues remain branchless even when issue-managed-branches is enabled.":`Les tickets d’aide ou de question ne créent pas de branche, même lorsque les branches gérées par les tickets sont activées.`,"Release automation is installed, but release issue events are disabled by the selected issue workflow profile.":`L’automatisation des versions est déjà installée, mais le profil choisi désactive les événements des tickets de version.`,"Hotfix automation is installed, but hotfix issue events are disabled by the selected issue workflow profile.":`L’automatisation des correctifs urgents est déjà installée, mais le profil choisi désactive les événements des tickets correspondants.`,"Repository agent guidance generation is disabled; collaborators will not receive the generated profile or workflow skill.":`La génération des consignes pour les agents du dépôt est désactivée. Les collaborateurs ne recevront ni le profil ni le guide de flux de travail générés.`,"Release and hotfix workflows require the workflow PAT Secret and a writable token.":`Les flux de version et de correctif urgent nécessitent le Secret contenant le PAT de l’Action et un jeton autorisé à écrire.`,"Merge queue mode fails closed unless every required producer is verified automatically or covered by an exact reviewed attestation.":`La file de fusion bloque l’opération si chaque producteur requis n’est pas vérifié automatiquement ou couvert par une attestation exacte et examinée.`,"Inactive issue closure is enabled; waiting issues are closed after the configured inactivity threshold and can be reopened with a new comment.":`La fermeture des tickets inactifs est activée. Les tickets en attente seront fermés après le délai configuré et pourront être rouverts par un nouveau commentaire.`,"Selected Project numbers must be accessible to the bot PAT, and all four configured Status values must exist in every selected Project.":`Le PAT du bot doit avoir accès aux Projects sélectionnés, et les quatre valeurs Status configurées doivent exister dans chacun de ces Projects.`,"Cursor is an experimental runtime in Copilot and requires a compatible CLI plus CURSOR_API_KEY; the Action installs the official CLI when the default executable is absent.":`Cursor est un environnement expérimental dans Copilot et nécessite un CLI compatible ainsi que CURSOR_API_KEY ; l’Action installe le CLI officiel si l’exécutable par défaut est absent.`,"Organization-level Secrets and Variables require organization permissions; selected access is the safest default and repository values take precedence.":`Les Secrets et Variables d’organisation nécessitent des droits sur celle-ci. Limiter l’accès aux dépôts sélectionnés est le choix le plus sûr ; les valeurs du dépôt prévalent.`},pt:{"No issue workflow kind is enabled; issue events will remain unmanaged until a supported Issue Form and profile entry are enabled.":`Não está ativo nenhum tipo de fluxo de trabalho para issues. Os respetivos eventos não serão geridos até ativar um formulário de issue suportado e a entrada correspondente no perfil.`,"Help / question issues remain branchless even when issue-managed-branches is enabled.":`As issues de ajuda ou perguntas não criam ramos, mesmo com os ramos geridos por issues ativados.`,"Release automation is installed, but release issue events are disabled by the selected issue workflow profile.":`A automação de versões já está instalada, mas o perfil escolhido desativa os eventos das issues de versão.`,"Hotfix automation is installed, but hotfix issue events are disabled by the selected issue workflow profile.":`A automação de correções urgentes já está instalada, mas o perfil escolhido desativa os eventos das respetivas issues.`,"Repository agent guidance generation is disabled; collaborators will not receive the generated profile or workflow skill.":`A criação de orientações para agentes do repositório está desativada. Os colaboradores não receberão o perfil nem o guia do fluxo de trabalho gerados.`,"Release and hotfix workflows require the workflow PAT Secret and a writable token.":`Os fluxos de versão e correção urgente exigem o Secret com o PAT da Action e um token com permissão de escrita.`,"Merge queue mode fails closed unless every required producer is verified automatically or covered by an exact reviewed attestation.":`A fila de integração bloqueia a operação se cada produtor obrigatório não for verificado automaticamente ou coberto por uma declaração exata e revista.`,"Inactive issue closure is enabled; waiting issues are closed after the configured inactivity threshold and can be reopened with a new comment.":`O fecho de issues inativas está ativado. As que aguardam resposta serão fechadas após o prazo configurado e poderão ser reabertas com um novo comentário.`,"Selected Project numbers must be accessible to the bot PAT, and all four configured Status values must exist in every selected Project.":`O PAT do bot tem de ter acesso aos Projects selecionados, e os quatro valores de Status configurados têm de existir em cada Project.`,"Cursor is an experimental runtime in Copilot and requires a compatible CLI plus CURSOR_API_KEY; the Action installs the official CLI when the default executable is absent.":`O Cursor é um ambiente experimental no Copilot e requer um CLI compatível e CURSOR_API_KEY; a Action instala o CLI oficial se o executável padrão não estiver disponível.`,"Organization-level Secrets and Variables require organization permissions; selected access is the safest default and repository values take precedence.":`Os Secrets e Variables da organização exigem permissões nessa organização. Restringir o acesso aos repositórios selecionados é a opção mais segura; os valores do repositório prevalecem.`}};function xs(e,t){let n=bs[t]??ys;return Object.prototype.hasOwnProperty.call(n,e)?n[e]:t===`en`?e:Z(`planUnknownWarning`,t)}var Ss={en:{issues:`Issues`,pullRequests:`Pull requests`,commits:`Commits`,issueComments:`Issue comments`,pullRequestComments:`Pull-request comments`,release:`Releases`,hotfix:`Hotfixes`,agentProvisioning:`Agent provisioning`,credentialHealth:`Credential health`,inactiveIssueClosure:`Inactive issue closure`,issueTemplates:`Issue templates`,pullRequestTemplate:`Pull-request template`},es:{issues:`Issues`,pullRequests:`Pull requests`,commits:`Commits`,issueComments:`Comentarios en issues`,pullRequestComments:`Comentarios en pull requests`,release:`Releases`,hotfix:`Correcciones urgentes`,agentProvisioning:`Instalación de agentes`,credentialHealth:`Estado de credenciales`,inactiveIssueClosure:`Cierre de issues inactivos`,issueTemplates:`Plantillas de issues`,pullRequestTemplate:`Plantilla de pull requests`},fr:{issues:`Tickets`,pullRequests:`Pull requests`,commits:`Commits`,issueComments:`Commentaires des tickets`,pullRequestComments:`Commentaires des pull requests`,release:`Versions`,hotfix:`Correctifs urgents`,agentProvisioning:`Installation des agents`,credentialHealth:`État des identifiants`,inactiveIssueClosure:`Fermeture des tickets inactifs`,issueTemplates:`Modèles de tickets`,pullRequestTemplate:`Modèle de pull request`},pt:{issues:`Questões`,pullRequests:`Pull requests`,commits:`Commits`,issueComments:`Comentários nas questões`,pullRequestComments:`Comentários nas pull requests`,release:`Versões`,hotfix:`Correções urgentes`,agentProvisioning:`Instalação de agentes`,credentialHealth:`Estado das credenciais`,inactiveIssueClosure:`Fecho de questões inativas`,issueTemplates:`Modelos de questões`,pullRequestTemplate:`Modelo de pull request`}};function Cs(e,t){return Ss[t][e]??e}var ws={en:{planner:`Planner`,findings:`Findings analyst`,reviewer:`Reviewer`,fixer:`Fixer`,tester:`Tester`},es:{planner:`Planificador`,findings:`Analista de hallazgos`,reviewer:`Revisor`,fixer:`Corrector`,tester:`Probador`},fr:{planner:`Planificateur`,findings:`Analyste des problèmes`,reviewer:`Réviseur`,fixer:`Correcteur`,tester:`Testeur`},pt:{planner:`Planeador`,findings:`Analista de problemas`,reviewer:`Revisor`,fixer:`Corretor`,tester:`Testador`}};function Ts(e,t){return ws[t][e]??e}var Es=U(`
                                                        • `),Ds=U(`
                                                        • `),Os=U(`
                                                            `),ks=U(`· `,1),As=U(`
                                                            `,1),js=U(`
                                                            `,1),Ms=U(`
                                                              `),Ns=U(`

                                                                /

                                                                `);function Ps(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`decisions`,8);function o(e){return Z(e===`repository`?`scopeRepository`:e===`organization`?`scopeOrganization`:`scopeDisabled`,n())}function s(e){return Z(e===`guarded`?`approvalGuarded`:e===`recommend`?`approvalRecommend`:`approvalOff`,n())}Ai();var c=Ns(),l=N(c),u=F(l,!0),d=I(l,2),f=N(d),p=N(f),m=F(p,!0),h=F(I(p),!0);D(f);var g=I(f,2),_=N(g),v=F(_,!0),y=F(I(_),!0);D(g);var b=I(g,2),x=N(b),S=F(x,!0),C=I(x),w=N(C);J(w,5,()=>(H(a()),V(()=>a().agentRouting)),q,(e,t)=>{var r=Es(),i=N(r),a=F(I(i));D(r),R(e=>{G(i,`${e??``}: `),G(a,`${B(t),V(()=>B(t).provider)??``} · ${B(t),V(()=>B(t).modelProvider)??``}/${B(t),V(()=>B(t).model)??``}`)},[()=>(H(Ts),B(t),n(),V(()=>Ts(B(t).role,n())))]),W(e,r)}),D(w),D(C),D(b);var ee=I(b,2),te=N(ee),ne=F(te,!0),re=I(te),ie=N(re),ae=F(ie,!0),oe=F(I(ie,2),!0);D(re),D(ee);var se=I(ee,2),ce=N(se),le=F(ce,!0),ue=F(I(ce),!0);D(se);var de=I(se,2),fe=e=>{var t=js(),r=P(t),i=N(r),o=F(i,!0),s=I(i),c=N(s),l=e=>{var t=Os();J(t,5,()=>(H(a()),V(()=>a().trustedChecks)),q,(e,t)=>{var r=Ds(),i=N(r),a=F(i,!0),o=I(i),s=F(I(o),!0);D(r),R(e=>{G(a,(B(t),V(()=>B(t).name))),G(o,` · ${e??``} ${B(t),V(()=>B(t).sourceAppId)??``} · `),G(s,(B(t),V(()=>B(t).workflowName)))},[()=>(H(Z),n(),V(()=>Z(`producerAppId`,n())))]),W(e,r)}),D(t),W(e,t)},u=e=>{var t=Mr();R(e=>G(t,e),[()=>(H(Z),n(),V(()=>Z(`none`,n())))]),W(e,t)};K(c,e=>{H(a()),V(()=>a().trustedChecks.length)?e(l):e(u,-1)}),D(s),D(r);var d=I(r,2),f=N(d),p=F(f,!0),m=F(I(f),!0);D(d);var h=I(d,2),g=N(h),_=F(g,!0),v=I(g),y=N(v,!0),b=I(y),x=e=>{var t=ks(),n=F(I(P(t)),!0);R(()=>G(n,(H(a()),V(()=>a().coverageCheck)))),W(e,t)};K(b,e=>{H(a()),V(()=>a().coverageCheck)&&e(x)}),D(v),D(h);var S=I(h,2),C=e=>{var t=As(),r=P(t),i=N(r),o=F(i,!0),s=F(I(i),!0);D(r);var c=I(r,2),l=N(c),u=F(l,!0),d=I(l),f=F(N(d),!0);D(d),D(c);var p=I(c,2),m=N(p),h=F(m,!0),g=F(I(m),!0);D(p),R((e,t,n,r,i,a)=>{G(o,e),G(s,t),G(u,n),G(f,r),G(h,i),G(g,a)},[()=>(H(Z),n(),V(()=>Z(`planCoverageThreshold`,n()))),()=>(H(a()),H(Z),n(),V(()=>a().coverageMinimum===void 0?Z(`none`,n()):`${a().coverageMinimum}%`)),()=>(H(Z),n(),V(()=>Z(`planCoverageReporter`,n()))),()=>(H(a()),H(Z),n(),V(()=>a().coverageArtifactWorkflow||Z(`none`,n()))),()=>(H(Z),n(),V(()=>Z(`planReporterAttested`,n()))),()=>(H(Z),H(a()),n(),V(()=>Z(a().coverageReporterAttested?`yes`:`no`,n())))]),W(e,t)};K(S,e=>{H(a()),V(()=>a().coverageMode===`numeric`)&&e(C)}),R((e,t,n,r,i)=>{G(o,e),G(p,t),G(m,n),G(_,r),G(y,i)},[()=>(H(Z),n(),V(()=>Z(`planTrustedChecks`,n()))),()=>(H(Z),n(),V(()=>Z(`planProducerAttested`,n()))),()=>(H(Z),H(a()),n(),V(()=>Z(a().producerAttested?`yes`:`no`,n()))),()=>(H(Z),n(),V(()=>Z(`planCoverage`,n()))),()=>(H(Aa),H(a()),n(),V(()=>Aa(`pullRequestApproval.coverage.mode`,a().coverageMode,n())))]),W(e,t)};K(de,e=>{H(a()),V(()=>a().approvalMode!==`off`)&&e(fe)});var pe=I(de,2),me=N(pe),he=F(me,!0),ge=F(I(me),!0);D(pe);var _e=I(pe,2),ve=e=>{var t=Ms(),r=N(t),i=F(r,!0),o=I(r),s=N(o);J(s,5,()=>(H(a()),V(()=>a().projectStatuses)),q,(e,t)=>{var r=Es(),i=N(r),a=F(I(i),!0);D(r),R(e=>{G(i,`${e??``}: `),G(a,(B(t),V(()=>B(t).value)))},[()=>(H(Z),H(co),B(t),n(),V(()=>Z(co[B(t).transition],n())))]),W(e,r)}),D(s),D(o),D(t),R(e=>G(i,e),[()=>(H(Z),n(),V(()=>Z(`planProjectStatuses`,n())))]),W(e,t)};K(_e,e=>{H(a()),V(()=>a().projectNumbers.length)&&e(ve)});var ye=I(_e,2),be=N(ye),xe=F(be,!0),Se=F(I(be),!0);D(ye);var Ce=I(ye,2),we=N(Ce),T=F(we,!0),Te=F(I(we),!0);D(Ce);var E=I(Ce,2),Ee=N(E),De=F(Ee,!0),Oe=F(I(Ee),!0);D(E);var ke=I(E,2),Ae=N(ke),je=F(Ae,!0),Me=F(I(Ae),!0);D(ke),D(d);var Ne=F(I(d,2),!0);D(c),R((e,t,n,r,i,o,s,c,l,d,f,p,g,_,b,x,C,w,ee,te)=>{G(u,e),G(m,t),G(h,n),G(v,r),G(y,i),G(S,o),G(ne,s),G(ae,(H(a()),V(()=>a().productionBranch))),G(oe,(H(a()),V(()=>a().developmentBranch))),G(le,c),G(ue,l),G(he,d),G(ge,f),G(xe,p),G(Se,g),G(T,_),G(Te,b),G(De,x),G(Oe,C),G(je,w),G(Me,ee),G(Ne,te)},[()=>(H(Z),n(),V(()=>Z(`planChoices`,n()))),()=>(H(Z),n(),V(()=>Z(`planEnabledCapabilities`,n()))),()=>(H(a()),H(Cs),n(),H(Z),V(()=>a().enabledCapabilities.length?a().enabledCapabilities.map(e=>Cs(e,n())).join(`, `):Z(`none`,n()))),()=>(H(Z),n(),V(()=>Z(`planIssueWorkflows`,n()))),()=>(H(a()),H(Aa),n(),H(Z),V(()=>a().issueWorkflows.length?a().issueWorkflows.map(e=>Aa(`issueWorkflows.enabled`,e,n())).join(`, `):Z(`none`,n()))),()=>(H(Z),n(),V(()=>Z(`planAgentRouting`,n()))),()=>(H(Z),n(),V(()=>Z(`planBranchRoles`,n()))),()=>(H(Z),n(),V(()=>Z(`planApprovalMode`,n()))),()=>(H(a()),V(()=>s(a().approvalMode))),()=>(H(Z),n(),V(()=>Z(`editProjects`,n()))),()=>(H(a()),H(Z),n(),V(()=>a().projectNumbers.length?a().projectNumbers.map(e=>`#${e}`).join(`, `):Z(`none`,n()))),()=>(H(Z),n(),V(()=>Z(`planVariableScope`,n()))),()=>(H(a()),V(()=>o(a().variableScope))),()=>(H(Z),n(),V(()=>Z(`planSecretScope`,n()))),()=>(H(a()),V(()=>o(a().secretScope))),()=>(H(Z),n(),V(()=>Z(`planIssueResources`,n()))),()=>(H(Z),n(),V(()=>Z(`planIssueResourcesValue`,n()))),()=>(H(Z),n(),V(()=>Z(`planInitialTag`,n()))),()=>(H(Z),H(a()),n(),V(()=>Z(a().initialTag?`yes`:`no`,n()))),()=>(H(Z),n(),V(()=>Z(`planAdvancedDefaults`,n())))]),W(e,c),Je(),i()}var Fs=U(`
                                                              • `),Is=U(`

                                                                  `,1),Ls=U(`
                                                                • ·

                                                                • `),Rs=U(`
                                                                • `),zs=U(`

                                                                   

                                                                   
                                                                  `),Bs=U(`

                                                                      `);function Vs(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`review`,8);Ai();var o=Bs(),s=N(o),c=F(s,!0),l=I(s,2),u=F(l,!0),d=I(l,2),f=e=>{var t=Is(),r=P(t),i=F(r,!0),o=I(r),s=N(o),c=F(s,!0),l=I(s);J(l,5,()=>(H(a()),V(()=>a().blockers)),q,(e,t)=>{var n=Fs(),r=F(n,!0);R(()=>G(r,B(t))),W(e,n)}),D(l),D(o),R((e,t)=>{G(i,e),G(c,t)},[()=>(H($),n(),V(()=>$(`blockedAction`,n()))),()=>(H($),n(),V(()=>$(`blockers`,n())))]),W(e,t)};K(d,e=>{H(a()),V(()=>a().blockers.length)&&e(f)});var p=I(d,2);J(p,5,()=>(H(a()),V(()=>a().jobs)),q,(e,t)=>{var r=Ls(),i=N(r),a=F(i,!0),o=I(i,2),s=F(o,!0),c=I(o,2),l=e=>{var t=Mr();R(e=>G(t,`· ${e??``}`),[()=>(H($),n(),V(()=>$(`retained`,n())))]),W(e,t)};K(c,e=>{B(t),V(()=>B(t).retained)&&e(l)});var u=I(c,2),d=F(N(u));D(u);var f=F(I(u));D(r),R((e,n,r)=>{G(a,e),G(s,n),G(d,`${B(t),V(()=>B(t).file)??``} / ${B(t),V(()=>B(t).job)??``}`),G(f,`runs-on: ${r??``}`)},[()=>(H($),B(t),n(),V(()=>$(B(t).role,n()))),()=>(H($),B(t),n(),V(()=>$(B(t).status,n()))),()=>(B(t),V(()=>JSON.stringify(B(t).runsOn)))]),W(e,r)}),D(p);var m=I(p,2),h=N(m),g=F(h),_=I(h,2);J(_,5,()=>(H(a()),V(()=>a().assets)),q,(e,t)=>{var r=Rs(),i=N(r),a=F(i,!0),o=I(i),s=I(o),c=e=>{var t=Mr();R(e=>G(t,`· ${e??``}`),[()=>(H($),n(),V(()=>$(`disabled`,n())))]),W(e,t)};K(s,e=>{B(t),V(()=>!B(t).enabled)&&e(c)}),D(r),R(e=>{G(a,(B(t),V(()=>B(t).path))),G(o,`: ${e??``}`)},[()=>(H($),B(t),n(),V(()=>$(B(t).status,n())))]),W(e,r)}),D(_),D(m);var v=I(m,2),y=N(v),b=F(y),x=I(y,2),S=F(x,!0);J(I(x,2),1,()=>(H(a()),V(()=>a().changes)),q,(e,t)=>{var r=zs(),i=N(r),a=F(N(i),!0);D(i);var o=I(i,2),s=F(o,!0),c=I(o),l=F(c,!0),u=I(c,2),d=F(u,!0),f=F(I(u),!0);D(r),R((e,n,r,i)=>{G(a,(B(t),V(()=>B(t).path))),G(s,e),G(l,n),G(d,r),G(f,i)},[()=>(H($),n(),V(()=>$(`before`,n()))),()=>(B(t),H($),n(),V(()=>B(t).before??$(`absent`,n()))),()=>(H($),n(),V(()=>$(`after`,n()))),()=>(B(t),H($),n(),V(()=>B(t).after??$(`absent`,n())))]),W(e,r)}),D(v),D(o),R((e,t,n,r,i)=>{G(c,e),G(u,t),G(g,`${n??``} (${H(a()),V(()=>a().assets.length)??``})`),G(b,`${r??``} (${H(a()),V(()=>a().changes.length)??``})`),G(S,i)},[()=>(H($),n(),V(()=>$(`title`,n()))),()=>(H($),n(),V(()=>$(`help`,n()))),()=>(H($),n(),V(()=>$(`assets`,n()))),()=>(H($),n(),V(()=>$(`changes`,n()))),()=>(H($),n(),V(()=>$(`redactionNotice`,n())))]),W(e,o),Je(),i()}var Hs={"Self-hosted runners":`Self-hosted runners`,Metadata:`Metadata`,Contents:`Contents`,Secrets:`Secrets`,Variables:`Variables`,Issues:`Issues`,Actions:`Actions`,Checks:`Checks`,Administration:`Administration`,Workflows:`Workflows`,"Issue Types":`Issue Types`,Projects:`Projects`,"Pull requests":`Pull requests`,Members:`Members`},Us={repository:`repository`,organization:`organization`,read:`Read`,write:`Write`,required:`Required`,conditional:`Conditional`,verified:`Verified`,available:`Read available`,missing:`Missing`,unverifiable:`Unverifiable`},Ws={"Self-hosted runners":`Runners autohospedados`,Metadata:`Metadatos`,Contents:`Contenido`,Secrets:`Secretos`,Variables:`Variables`,Issues:`Incidencias`,Actions:`Acciones`,Checks:`Comprobaciones`,Administration:`Administración`,Workflows:`Flujos de trabajo`,"Issue Types":`Tipos de incidencia`,Projects:`Proyectos`,"Pull requests":`Solicitudes de cambio`,Members:`Miembros`},Gs={repository:`repositorio`,organization:`organización`,read:`Lectura`,write:`Escritura`,required:`Obligatorio`,conditional:`Condicional`,verified:`Verificado`,available:`Lectura disponible`,missing:`Faltante`,unverifiable:`No verificable`},Ks={"Self-hosted runners":`Runners auto-hébergés`,Metadata:`Métadonnées`,Contents:`Contenu`,Secrets:`Secrets`,Variables:`Variables`,Issues:`Tickets`,Actions:`Actions`,Checks:`Vérifications`,Administration:`Administration`,Workflows:`Flux de travail`,"Issue Types":`Types de ticket`,Projects:`Projets`,"Pull requests":`Demandes de tirage`,Members:`Membres`},qs={repository:`dépôt`,organization:`organisation`,read:`Lecture`,write:`Écriture`,required:`Obligatoire`,conditional:`Conditionnel`,verified:`Vérifié`,available:`Lecture disponible`,missing:`Manquant`,unverifiable:`Non vérifiable`},Js={"Self-hosted runners":`Runners autoalojados`,Metadata:`Metadados`,Contents:`Conteúdo`,Secrets:`Segredos`,Variables:`Variáveis`,Issues:`Questões`,Actions:`Ações`,Checks:`Verificações`,Administration:`Administração`,Workflows:`Fluxos de trabalho`,"Issue Types":`Tipos de questão`,Projects:`Projetos`,"Pull requests":`Pedidos de alteração`,Members:`Membros`},Ys={repository:`repositório`,organization:`organização`,read:`Leitura`,write:`Escrita`,required:`Obrigatório`,conditional:`Condicional`,verified:`Verificado`,available:`Leitura disponível`,missing:`Em falta`,unverifiable:`Não verificável`},Xs={en:Hs,es:Ws,fr:Ks,pt:Js},Zs={en:Us,es:Gs,fr:qs,pt:Ys};function Qs(e,t){return Zs[e][t]}function $s(e,t){return Object.prototype.hasOwnProperty.call(Xs[e],t)?Xs[e][t]:t}function ec(e,t){if(t===`verified`||t===`available`||t===`missing`||t===`unverifiable`)return Zs[e][t]}var tc=U(`

                                                                      `),nc=U(`
                                                                    • `),rc=U(`

                                                                      `),ic=U(`

                                                                        `),ac=U(`
                                                                      • `),oc=U(`
                                                                          `),sc=U(`

                                                                            `),cc=U(``),lc=U(`

                                                                            `),uc=U(`

                                                                              `);function dc(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`prompt`,8),s=X(t,`controller`,8),c=X(t,`busy`,8),l=X(t,`onSubmit`,8),u={capabilities:`editCapabilities`,"agent-runtime":`editRuntimes`,"agent-model-defaults":`editModels`,"agent-role-overrides":`editRoleModels`,repository:`editRepository`,deployment:`editDeployment`,bugbot:`editBugbot`,"pull-request-approval":`editApproval`,projects:`editProjects`,provisioning:`editProvisioning`,storage:`editStorage`};L(()=>(n(),H(o())),()=>{M(a,[{title:Z(`files`,n()),items:o().plan.files},{title:Z(`workflows`,n()),items:o().plan.workflows},{title:Z(`variables`,n()),items:o().plan.variables},{title:Z(`secretNames`,n()),items:o().plan.secrets}])}),En(),Ai();var d=uc(),f=N(d),p=F(f,!0),m=I(f,2),h=N(m),g=F(h,!0),_=I(h,2),v=F(_,!0),y=I(_,2),b=e=>{var t=tc(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`planActionsProbePrerequisites`,n())))]),W(e,t)},x=_t(()=>(H(o()),V(()=>o().plan.permissionProbes?.some(e=>e.permission===`Actions`))));K(y,e=>{B(x)&&e(b)});var S=I(y,2),C=e=>{var t=tc(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`planSecretProbeLimit`,n())))]),W(e,t)},w=_t(()=>(H(o()),V(()=>o().plan.permissionProbes?.some(e=>e.permission===`Secrets`))));K(S,e=>{B(w)&&e(C)});var ee=I(S,2);J(ee,5,()=>(H(o()),V(()=>o().plan.permissionProbes)),q,(e,t)=>{var r=nc(),i=F(r);R((e,t)=>G(i,`${e??``}: ${t??``}`),[()=>(H(Qs),n(),B(t),V(()=>Qs(n(),B(t).scope))),()=>(H($s),n(),B(t),V(()=>$s(n(),B(t).permission)))]),W(e,r)},e=>{var t=nc(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`none`,n())))]),W(e,t)}),D(ee),D(m);var te=I(m,2),ne=e=>{var t=rc(),r=N(t),i=F(r,!0),a=I(r,2),s=F(a,!0),c=I(a,2),l=N(c),u=F(l,!0),d=F(I(l),!0);D(c),D(t),R((e,t,n,r)=>{G(i,e),G(s,t),G(u,n),G(d,r)},[()=>(H(Z),n(),V(()=>Z(`organizationReuseTitle`,n()))),()=>(H(Z),n(),H(o()),V(()=>Z(`organizationReuseBody`,n(),{imported:String(o().plan.organizationReuse.imported),shared:String(o().plan.organizationReuse.organizationVariables.length),overrides:String(o().plan.organizationReuse.repositoryVariables.length),writes:String(o().plan.organizationReuse.repositoryWrites.length)}))),()=>(H(Z),n(),V(()=>Z(`batchRepositoryOverrides`,n()))),()=>(H(o()),H(Z),n(),V(()=>o().plan.organizationReuse.repositoryWrites.join(`, `)||Z(`none`,n())))]),W(e,t)};K(te,e=>{H(o()),V(()=>o().plan.organizationReuse)&&e(ne)});var re=I(te,2);Ps(re,{get decisions(){return H(o()),V(()=>o().plan.decisions)}});var ie=I(re,2),ae=e=>{Vs(e,{get review(){return H(o()),V(()=>o().plan.installationReview)}})};K(ie,e=>{H(o()),V(()=>o().plan.installationReview)&&e(ae)});var oe=I(ie,2),se=e=>{ps(e,{get storage(){return H(o()),V(()=>o().plan.workflowPatStorage)}})};K(oe,e=>{H(o()),V(()=>o().plan.workflowPatStorage)&&e(se)});var ce=I(oe,2),le=e=>{var t=ic(),r=N(t),i=F(r,!0),a=I(r,2);J(a,5,()=>(H(o()),V(()=>o().plan.presentationDefaults)),q,(e,t)=>{var r=nc(),i=F(r);R(e=>G(i,`${e??``}: ${B(t),V(()=>B(t).count)??``}`),[()=>(B(t),H(Z),n(),V(()=>u[B(t).group]?Z(u[B(t).group],n()):B(t).group))]),W(e,r)}),D(a),D(t),R(e=>G(i,e),[()=>(H(Z),n(),V(()=>Z(`planBasicDefaultsIntro`,n())))]),W(e,t)};K(ce,e=>{H(o()),V(()=>o().plan.presentationDefaults.length)&&e(le)});var ue=I(ce,2);J(ue,5,()=>B(a),q,(e,t)=>{var r=oc(),i=N(r),a=N(i),o=F(a,!0),s=F(I(a),!0);D(i);var c=I(i);J(c,5,()=>(B(t),V(()=>B(t).items)),q,(e,t)=>{var n=ac(),r=F(N(n),!0);D(n),R(()=>G(r,B(t))),W(e,n)},e=>{var t=nc(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`none`,n())))]),W(e,t)}),D(c),D(r),R(()=>{G(o,(B(t),V(()=>B(t).title))),G(s,(B(t),V(()=>B(t).items.length)))}),W(e,r)}),D(ue);var de=I(ue,2),fe=e=>{var t=sc(),r=N(t),i=F(r,!0),a=I(r);J(a,5,()=>(H(o()),V(()=>o().plan.warnings)),q,(e,t)=>{var r=nc(),i=F(r,!0);R(e=>G(i,e),[()=>(H(xs),B(t),n(),V(()=>xs(B(t),n())))]),W(e,r)}),D(a),D(t),R(e=>G(i,e),[()=>(H(Z),n(),V(()=>Z(`beforeContinue`,n())))]),W(e,t)};K(de,e=>{H(o()),V(()=>o().plan.warnings.length)&&e(fe)});var pe=I(de,2),me=e=>{var t=lc(),r=N(t),i=F(r,!0),a=I(r),d=F(a,!0),f=I(a,2);J(f,5,()=>(H(o()),V(()=>o().editGroups)),q,(e,t)=>{var r=cc(),i=F(r,!0);R(e=>{r.disabled=!s()||c(),G(i,e)},[()=>(H(Z),n(),B(t),V(()=>Z(`changeSection`,n(),{section:Z(u[B(t)],n())})))]),Cr(`click`,r,()=>l()(`revise:${B(t)}`)),W(e,r)}),D(f),D(t),R((e,t)=>{G(i,e),G(d,t)},[()=>(H(Z),n(),V(()=>Z(`changeAnswersTitle`,n()))),()=>(H(Z),n(),V(()=>Z(`changeAnswersHelp`,n())))]),W(e,t)};K(pe,e=>{H(o()),V(()=>o().editGroups?.length)&&e(me)});var he=I(pe,2),ge=N(he);{let e=k(()=>(H(Z),n(),V(()=>Z(`stopHere`,n())))),t=k(()=>!s()||c());qa(ge,{get label(){return B(e)},variant:`secondary`,onClick:()=>l()(`decline`),get disabled(){return B(t)}})}var _e=I(ge);{let e=k(()=>(H(Z),H(o()),n(),V(()=>Z(o().plan.deliveryMode===`pull-request`?`batchUseConfiguration`:`approvePlan`,n())))),t=k(()=>(H(s()),H(c()),H(o()),V(()=>!s()||c()||!!o().plan.installationReview?.blockers.length)));qa(_e,{get label(){return B(e)},arrow:!0,onClick:()=>l()(`approve`),get disabled(){return B(t)}})}D(he),D(d),R((e,t,n,r)=>{G(p,e),Y(m,`aria-label`,t),G(g,n),G(v,r)},[()=>(H(Z),H(o()),n(),V(()=>Z(o().plan.deliveryMode===`pull-request`?`batchConfigurationPreview`:o().plan.organizationReuse?`planReuseBody`:`planBody`,n()))),()=>(H(Z),n(),V(()=>Z(`planPermissionProbeTitle`,n()))),()=>(H(Z),n(),V(()=>Z(`planPermissionProbeTitle`,n()))),()=>(H(Z),n(),V(()=>Z(`planPermissionProbeBody`,n())))]),W(e,d),Je(),i()}wr([`click`]);var fc=U(`

                                                                              `),pc=U(`
                                                                            • `),mc=U(`
                                                                              `,1),hc=U(`
                                                                              `,1),gc=U(`

                                                                              `),_c=U(`

                                                                                `,1);function vc(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`view`,8);L(()=>n(),()=>{M(a,ta(n()))}),En(),Ai();var s=_c(),c=P(s),l=N(c),u=F(l,!0),d=I(l),f=F(d,!0),p=I(d,2),m=e=>{var t=fc(),n=F(t,!0);R(()=>G(n,(B(a),V(()=>B(a).unknown)))),W(e,t)};K(p,e=>{H(o()),V(()=>o().secretInventory!==`available`)&&e(m)});var h=I(p,2);J(h,5,()=>(H(o()),V(()=>o().secrets)),q,(e,t)=>{var n=pc(),r=N(n),i=F(r,!0),o=I(r),s=I(o),c=e=>{var t=Mr();R(()=>G(t,`· ${B(a),V(()=>B(a).shadowed)??``}`)),W(e,t)};K(s,e=>{B(t),V(()=>B(t).shadowed)&&e(c)}),D(n),R(()=>{G(i,(B(t),V(()=>B(t).name))),G(o,` · ${B(a),B(t),V(()=>B(a)[B(t).scope])??``} `)}),W(e,n)}),D(h),D(c);var g=I(c,2),_=N(g),v=F(_),y=I(_,2),b=e=>{var t=fc(),n=F(t,!0);R(()=>G(n,(B(a),V(()=>B(a).empty)))),W(e,t)};K(y,e=>{H(o()),V(()=>!o().variables.length)&&e(b)});var x=I(y,2);J(x,5,()=>(H(o()),V(()=>o().variables)),q,(e,t)=>{var n=mc(),r=P(n),i=N(r),o=I(i),s=e=>{var t=Mr();R(()=>G(t,`· ${B(a),V(()=>B(a).shadowed)??``}`)),W(e,t)};K(o,e=>{B(t),V(()=>B(t).shadowed)&&e(s)}),D(r);var c=F(I(r),!0);R(()=>{G(i,`${B(t),V(()=>B(t).name)??``} · ${B(a),B(t),V(()=>B(a)[B(t).scope])??``} `),G(c,(B(t),V(()=>B(t).value)))}),W(e,n)}),D(x),D(g);var S=I(g,2),C=N(S),w=F(C);J(I(C,2),1,()=>(H(o()),V(()=>o().workflows)),q,(e,t)=>{var n=gc(),r=N(n),i=F(r,!0),o=I(r,2),s=F(o,!0),c=I(o,2);J(c,5,()=>(B(t),V(()=>B(t).inputs)),q,(e,t)=>{var n=hc(),r=P(n),i=F(r,!0),o=I(r),s=N(o,!0),c=I(s),l=e=>{var n=Mr();R(()=>G(n,`· ${B(a),V(()=>B(a).workflow)??``}: ${B(t),V(()=>B(t).fallback)??``}`)),W(e,n)};K(c,e=>{B(t),V(()=>B(t).fallback!==void 0)&&e(l)}),D(o),R(()=>{G(i,(B(t),V(()=>B(t).name))),G(s,(B(t),B(a),V(()=>B(t).unsupported?B(a).unknown:B(t).variable?`vars.${B(t).variable}`:B(t).literal)))}),W(e,n)}),D(c),D(n),R(()=>{G(i,(B(t),V(()=>B(t).file))),G(s,(B(t),V(()=>B(t).action)))}),W(e,n)}),D(S),R(()=>{G(u,(B(a),V(()=>B(a).credentials))),G(f,(B(a),V(()=>B(a).secretHelp))),G(v,`${B(a),V(()=>B(a).variables)??``} (${H(o()),V(()=>o().variables.length)??``})`),G(w,`${B(a),V(()=>B(a).details)??``} (${H(o()),V(()=>o().workflows.length)??``})`)}),W(e,s),Je(),i()}var yc=U(`

                                                                                `),bc=U(``),xc=U(``),Sc=U(`

                                                                                `),Cc=U(`

                                                                                `,1),wc=U(`

                                                                                `,1);function Tc(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`view`,8),s=X(t,`controller`,8),c=X(t,`busy`,8),l=X(t,`onSubmit`,8);L(()=>n(),()=>{M(a,ta(n()))}),En(),Ai();var u=wc(),d=P(u),f=F(d,!0),p=I(d,2),m=F(p,!0),h=I(p,2),g=F(h,!0),_=I(h,2),v=e=>{var t=yc(),n=F(t,!0);R(()=>G(n,(B(a),V(()=>B(a).local)))),W(e,t)};K(_,e=>{H(o()),V(()=>o().github===`not-connected`&&o().status!==`unconfigured`)&&e(v)});var y=I(_,2),b=e=>{var t=bc(),n=F(t,!0);R(()=>G(n,(B(a),V(()=>B(a).githubIncomplete)))),W(e,t)};K(y,e=>{H(o()),V(()=>o().github===`incomplete`)&&e(b)});var x=I(y,2),S=N(x),C=e=>{var t=xc(),n=F(t,!0);R(()=>{t.disabled=!s()||c(),G(n,(H(o()),B(a),V(()=>o().github===`not-connected`?B(a).connect:B(a).refresh)))}),Cr(`click`,t,()=>l()(o().github===`not-connected`?`connect`:`refresh`)),W(e,t)};K(S,e=>{H(o()),V(()=>o().status!==`unconfigured`)&&e(C)});var w=I(S,2);let ee;var te=F(w,!0);D(x);var ne=I(x,2),re=e=>{var t=Cc(),r=P(t),i=N(r),u=F(i,!0),d=I(i),f=F(d,!0),p=I(d,2);J(p,5,()=>(H(o()),V(()=>o().settings)),q,(e,t)=>{var r=Sc(),i=N(r),o=N(i),u=F(o,!0),d=I(o),f=N(d,!0),p=I(f),m=e=>{var n=Mr();R(()=>G(n,` · ${B(a),B(t),V(()=>B(a)[B(t).source])??``}`)),W(e,n)};K(p,e=>{B(t),V(()=>B(t).source!==`unknown`)&&e(m)}),D(d),D(i);var h=I(i,2),g=F(h,!0);D(r),R((e,n,r)=>{G(u,e),G(f,n),Y(h,`aria-label`,r),h.disabled=(H(s()),H(c()),B(t),V(()=>!s()||c()||!B(t).editable)),G(g,(B(a),V(()=>B(a).edit)))},[()=>(H(na),B(t),n(),V(()=>na(B(t).id,n()))),()=>(B(t),B(a),H(ia),n(),V(()=>B(t).value===void 0?B(a).unknown:ia(B(t).value,n()))),()=>(B(a),H(na),B(t),n(),V(()=>`${B(a).edit}: ${na(B(t).id,n())}`))]),Cr(`click`,h,()=>l()(`edit:${B(t).id}`)),W(e,r)}),D(p),D(r),vc(I(r,2),{get view(){return o()}}),R(()=>{G(u,(B(a),V(()=>B(a).quick))),G(f,(B(a),V(()=>B(a).quickHelp)))}),W(e,t)};K(ne,e=>{H(o()),V(()=>o().status!==`unconfigured`)&&e(re)});var ie=I(ne,2),ae=F(ie,!0),oe=I(ie,2),se=N(oe),ce=F(se,!0);D(oe),R(()=>{G(f,(B(a),V(()=>B(a).title))),G(m,(B(a),H(o()),V(()=>B(a)[o().status]))),G(g,(H(o()),B(a),V(()=>o().status===`unconfigured`?B(a).startHelp:B(a).intro))),ee=li(w,1,`button`,null,ee,{primary:o().status===`unconfigured`,secondary:o().status!==`unconfigured`}),w.disabled=!s()||c(),G(te,(H(o()),B(a),V(()=>o().status===`unconfigured`?B(a).start:B(a).wizard))),G(ae,(B(a),V(()=>B(a).limits))),se.disabled=!s()||c(),G(ce,(B(a),V(()=>B(a).finish)))}),Cr(`click`,w,()=>l()(`wizard`)),Cr(`click`,se,()=>l()(`close`)),W(e,u),Je(),i()}wr([`click`]);var Ec=U(``),Dc=U(``),Oc=U(`
                                                                              • `),kc=U(`
                                                                                  `),Ac=U(`

                                                                                  `),jc=U(` `),Mc=U(`

                                                                                    `),Nc=U(`
                                                                                     
                                                                                    `),Pc=U(`
                                                                                    `),Fc=U(`
                                                                                    `),Ic=U(`

                                                                                    `),Lc=U(`
                                                                                  • `),Rc=U(`
                                                                                      `),zc=U(`

                                                                                      `,1),Bc=U(`

                                                                                      →

                                                                                      `),Vc=U(`
                                                                                      `),Hc=U(``),Uc=U(``),Wc=U(`
                                                                                      `),Gc=U(`

                                                                                      `);function Kc(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`batch`,8),s=X(t,`controller`,8),c=X(t,`busy`,8),l=X(t,`mode`,8,`progress`),u=X(t,`onSubmit`,8,async()=>void 0),d=X(t,`onStop`,8,async()=>void 0),f={ready:`batchStatusReady`,blocked:`batchStatusBlocked`,applying:`batchStatusApplying`,partial:`batchStatusPartial`,"waiting-for-merge":`batchStatusWaiting`,"verification-pending":`batchStatusPending`,unchanged:`batchStatusUnchanged`,cancelled:`batchStatusCancelled`};function p(e){return e&&/^https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/pull\/[1-9][0-9]*$/.test(e)?e:void 0}L(()=>H(o()),()=>{M(a,o().targets.some(e=>e.cleanupPending)?[]:o().targets.filter(e=>[`ready`,`partial`,`cancelled`,`applying`].includes(e.status)))}),En(),Ai();var m=Gc(),h=N(m),g=F(h,!0),_=I(h,2),v=F(_,!0),y=I(_,2),b=e=>{var t=Ec(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`batchStopping`,n())))]),W(e,t)};K(y,e=>{H(o()),V(()=>o().stopRequested)&&e(b)});var x=I(y,2);J(x,5,()=>(H(o()),V(()=>o().targets)),e=>e.repositoryId,(e,t)=>{var r=Bc(),i=N(r),a=F(i,!0),o=I(i,2),s=e=>{Vs(e,{get review(){return B(t),V(()=>B(t).installationReview)}})};K(o,e=>{B(t),V(()=>B(t).installationReview)&&e(s)});var c=I(o,2),l=F(c,!0),u=I(c,2),d=e=>{var t=Dc(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`batchCleanupPending`,n())))]),W(e,t)};K(u,e=>{B(t),V(()=>B(t).cleanupPending)&&e(d)});var m=I(u,2),h=e=>{var n=kc();J(n,5,()=>(B(t),V(()=>B(t).blockers)),q,(e,t)=>{var n=Oc(),r=F(n,!0);R(()=>G(r,B(t))),W(e,n)}),D(n),W(e,n)};K(m,e=>{B(t),V(()=>B(t).blockers?.length)&&e(h)});var g=I(m,2),_=e=>{var r=Ac(),i=F(r,!0);R(e=>G(i,e),[()=>(H(Z),B(t),n(),V(()=>Z(B(t).reason===`drift`||B(t).reason===`ownership`?`batchReasonDrift`:B(t).reason===`provider`?`batchReasonProvider`:B(t).reason===`cancelled`?`batchReasonCancelled`:`batchReasonPreflight`,n())))]),W(e,r)};K(g,e=>{B(t),V(()=>B(t).reason&&!B(t).cleanupPending)&&e(_)});var v=I(g,2),y=N(v),b=F(y,!0),x=I(y),S=N(x),C=F(S,!0),w=F(I(S,2),!0);D(x);var ee=F(I(x),!0);D(v);var te=I(v,2),ne=e=>{var r=jc(),i=F(r);R((e,t)=>{Y(r,`href`,e),G(i,`${t??``} ↗`)},[()=>(B(t),V(()=>p(B(t).pullRequestUrl))),()=>(H(Z),n(),V(()=>Z(`batchOpenPull`,n())))]),W(e,r)},re=_t(()=>(B(t),V(()=>p(B(t).pullRequestUrl))));K(te,e=>{B(re)&&e(ne)});var ie=I(te,2),ae=e=>{var r=zc(),i=P(r),a=N(i),o=F(a,!0),s=I(a,2),c=F(s,!0),l=F(I(s,2),!0);D(i);var u=I(i,2),d=e=>{var r=Ac(),i=F(r);R((e,t)=>G(i,`${e??``}: ${t??``}.`),[()=>(H(Z),n(),V(()=>Z(`batchRetainedSecrets`,n()))),()=>(B(t),V(()=>B(t).retainedSecrets.join(`, `)))]),W(e,r)};K(u,e=>{B(t),V(()=>B(t).retainedSecrets.length)&&e(d)});var f=I(u,2),p=F(f,!0),m=I(f,2),h=e=>{var r=Mc(),i=N(r),a=F(i,!0),o=I(i,2),s=F(o,!0),c=I(o,2);J(c,5,()=>(B(t),V(()=>B(t).permissionProbes)),q,(e,t)=>{var r=Oc(),i=F(r);R((e,t)=>G(i,`${e??``}: ${t??``}`),[()=>(H(Qs),n(),B(t),V(()=>Qs(n(),B(t).scope))),()=>(H($s),n(),B(t),V(()=>$s(n(),B(t).permission)))]),W(e,r)}),D(c);var l=I(c,2),u=e=>{var t=Ac(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`planSecretProbeLimit`,n())))]),W(e,t)},d=_t(()=>(B(t),V(()=>B(t).permissionProbes.some(e=>e.permission===`Secrets`))));K(l,e=>{B(d)&&e(u)}),D(r),R((e,t)=>{G(a,e),G(s,t)},[()=>(H(Z),n(),V(()=>Z(`planPermissionProbeTitle`,n()))),()=>(H(Z),n(),V(()=>Z(`planPermissionProbeBody`,n())))]),W(e,r)};K(m,e=>{B(t),V(()=>B(t).permissionProbes?.length)&&e(h)});var g=I(m,2),_=e=>{var r=Fc(),i=N(r),a=F(i,!0);J(I(i,2),1,()=>(B(t),V(()=>B(t).files)),q,(e,t)=>{var r=Pc(),i=N(r),a=F(N(i),!0);D(i);var o=I(i,2),s=e=>{var t=Ac(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`batchDeleteFile`,n())))]),W(e,t)},c=e=>{var n=Nc(),r=F(n,!0);R(()=>G(r,(B(t),V(()=>B(t).content)))),W(e,n)};K(o,e=>{B(t),V(()=>B(t).content===null)?e(s):e(c,-1)}),D(r),R(()=>G(a,(B(t),V(()=>B(t).path)))),W(e,r)}),D(r),R(e=>G(a,e),[()=>(H(Z),n(),V(()=>Z(`batchReviewFiles`,n())))]),W(e,r)};K(g,e=>{B(t),V(()=>B(t).files.length)&&e(_)});var v=I(g,2),y=e=>{var r=Ic(),i=N(r),a=F(i,!0),o=F(I(i),!0);D(r),R((e,t)=>{G(a,e),G(o,t)},[()=>(H(Z),n(),V(()=>Z(`batchRepositoryOverrides`,n()))),()=>(B(t),V(()=>B(t).repositoryVariables.join(`, `)))]),W(e,r)};K(v,e=>{B(t),V(()=>B(t).repositoryVariables.length)&&e(y)});var b=I(v,2),x=e=>{var r=Rc(),i=N(r),a=F(i,!0),o=I(i);J(o,5,()=>(B(t),V(()=>B(t).grants)),q,(e,t)=>{var n=Lc(),r=N(n),i=F(I(r),!0);D(n),R(()=>{G(r,`${B(t),V(()=>B(t).kind===`secret`?`Secret`:`Variable`)??``} `),G(i,(B(t),V(()=>B(t).name)))}),W(e,n)}),D(o),D(r),R(e=>G(a,e),[()=>(H(Z),n(),V(()=>Z(`batchReviewedAccess`,n())))]),W(e,r)};K(b,e=>{B(t),V(()=>B(t).grants.length)&&e(x)}),R((e,t,n,r)=>{G(o,e),G(c,t),G(l,n),G(p,r)},[()=>(H(Z),n(),B(t),V(()=>Z(`batchFilesCount`,n(),{count:String(B(t).files.length)}))),()=>(H(Z),n(),B(t),V(()=>Z(`batchVariablesCount`,n(),{count:String(B(t).repositoryVariables.length)}))),()=>(H(Z),n(),B(t),V(()=>Z(`batchGrantsCount`,n(),{count:String(B(t).grants.length)}))),()=>(H(Z),n(),V(()=>Z(`batchResourcesExplanation`,n())))]),W(e,r)},oe=_t(()=>(B(t),V(()=>![`waiting-for-merge`,`verification-pending`,`unchanged`].includes(B(t).status))));K(ie,e=>{B(oe)&&e(ae)}),D(r),R((e,n)=>{G(a,(B(t),V(()=>B(t).repository))),G(l,e),G(b,n),G(C,(B(t),V(()=>B(t).installationBranch))),G(w,(B(t),V(()=>B(t).baseBranch))),G(ee,(B(t),V(()=>B(t).baseSha)))},[()=>(H(Z),B(t),n(),V(()=>Z(f[B(t).status],n()))),()=>(H(Z),n(),V(()=>Z(`batchBranchReview`,n())))]),W(e,r)}),D(x);var S=I(x,2),C=e=>{var t=Vc(),r=N(t),i=F(r,!0),o=I(r,2),l=F(o,!0);D(t),R((e,t)=>{r.disabled=(H(s()),H(c()),B(a),V(()=>!s()||c()||!B(a).length)),G(i,e),o.disabled=!s()||c(),G(l,t)},[()=>(H(Z),n(),V(()=>Z(`batchApplyPlans`,n()))),()=>(H(Z),n(),V(()=>Z(`batchLeavePreview`,n())))]),Cr(`click`,r,()=>u()(`approve`)),Cr(`click`,o,()=>u()(`decline`)),W(e,t)},w=e=>{var t=Hc(),r=F(t,!0);R(e=>{t.disabled=(H(s()),H(c()),H(o()),V(()=>!s()||c()||o().stopRequested)),G(r,e)},[()=>(H(Z),n(),V(()=>Z(`batchStopPending`,n())))]),Cr(`click`,t,function(...e){d()?.apply(this,e)}),W(e,t)},ee=e=>{var t=Wc(),r=N(t),i=e=>{var t=Uc(),r=F(t,!0);R(e=>{t.disabled=!s()||c(),G(r,e)},[()=>(H(Z),n(),V(()=>Z(`batchRetryPending`,n())))]),Cr(`click`,t,()=>u()(`retry`)),W(e,t)};K(r,e=>{B(a),H(o()),V(()=>B(a).length&&o().retryRemaining>0)&&e(i)});var l=I(r,2),d=F(l,!0);D(t),R(e=>{l.disabled=!s()||c(),G(d,e)},[()=>(H(Z),n(),V(()=>Z(`batchFinish`,n())))]),Cr(`click`,l,()=>u()(`finish`)),W(e,t)};K(S,e=>{l()===`review`?e(C):l()===`progress`?e(w,1):l()===`result`&&e(ee,2)});var te=I(S,2),ne=N(te),re=F(ne,!0),ie=F(I(ne),!0);D(te),D(m),R((e,t,n)=>{G(g,e),G(v,t),G(re,n),G(ie,(H(o()),V(()=>o().operationId)))},[()=>(H(Z),H(l()),n(),V(()=>Z(l()===`review`?`batchReviewTitle`:l()===`progress`?`batchProgressTitle`:`batchResultTitle`,n()))),()=>(H(Z),H(l()),n(),V(()=>Z(l()===`review`?`batchReviewBody`:l()===`progress`?`batchProgressBody`:`batchResultBody`,n()))),()=>(H(Z),n(),V(()=>Z(`batchTechnical`,n())))]),W(e,m),Je(),i()}wr([`click`]);var qc=U(``),Jc=U(``),Yc=U(`

                                                                                      `),Xc=U(`
                                                                                      `),Zc=U(`

                                                                                      `,1);function Qc(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=j(),s=j(),c=X(t,`selection`,8),l=X(t,`controller`,8),u=X(t,`busy`,8),d=X(t,`onSubmit`,8),f=j([...c().selectedIds]),p=j(``),m=j(``),h=j(0);function g(e){M(f,B(f).includes(e)?B(f).filter(t=>t!==e):[...B(f),e])}function _(e){d()(JSON.stringify({action:e,selectedIds:B(f),...e===`resolve`?{name:B(m).trim()}:{}}))}L(()=>(H(c()),B(p)),()=>{M(a,c().candidates.filter(e=>e.name.toLowerCase().includes(B(p).toLowerCase())))}),L(()=>(B(h),B(a)),()=>{B(h)>0&&B(h)*25>=B(a).length&&M(h,0)}),L(()=>(B(a),B(h)),()=>{M(o,B(a).slice(B(h)*25,(B(h)+1)*25))}),L(()=>(B(f),H(c())),()=>{M(s,B(f).some(e=>!c().candidates.some(t=>t.id===e&&!t.unavailable)))}),En(),Ai();var v=Zc(),y=P(v),b=F(y,!0),x=I(y,2),S=e=>{var t=qc(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`batchDiscoveryUnavailable`,n())))]),W(e,t)};K(x,e=>{H(c()),V(()=>c().discoveryStatus===`unavailable`)&&e(S)});var C=I(x,2),w=e=>{var t=qc(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),H(c()),n(),V(()=>Z(c().message===`lookup-unavailable`?`batchLookupUnavailable`:c().message===`selection-invalid`?`batchSelectionInvalid`:`batchAccessUnavailable`,n())))]),W(e,t)};K(C,e=>{H(c()),V(()=>c().message)&&e(w)});var ee=I(C,2),te=e=>{var t=qc(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`batchDiscoveryTruncated`,n())))]),W(e,t)};K(ee,e=>{H(c()),V(()=>c().truncated)&&e(te)});var ne=I(ee,2),re=F(ne,!0),ie=I(ne,2);bi(ie);var ae=I(ie,2),oe=F(ae,!0),se=I(ae,2),ce=N(se),le=F(ce,!0),ue=I(ce,2);J(ue,5,()=>B(o),e=>e.id,(e,t)=>{var r=Jc(),i=N(r);bi(i);var a=I(i,2),o=N(a),s=F(o,!0),l=I(o),u=N(l),d=I(u),p=e=>{var t=Mr();R(e=>G(t,`· ${e??``}`),[()=>(H(Z),n(),V(()=>Z(`batchCurrent`,n())))]),W(e,t)};K(d,e=>{B(t),H(c()),V(()=>B(t).id===c().currentRepositoryId)&&e(p)});var m=I(d,2),h=e=>{var r=Mr();R(e=>G(r,`· ${e??``}`),[()=>(H(Z),B(t),n(),V(()=>Z(B(t).unavailable===`archived`?`batchArchived`:B(t).unavailable===`disabled`?`batchDisabled`:B(t).unavailable===`access-unavailable`?`batchAccessUnavailable`:`batchReadOnly`,n())))]),W(e,r)};K(m,e=>{B(t),V(()=>B(t).unavailable)&&e(h)}),D(l),D(a),D(r),R((e,n,r)=>{xi(i,e),i.disabled=n,G(s,(B(t),V(()=>B(t).name))),G(u,`${r??``} `)},[()=>(B(f),B(t),V(()=>B(f).includes(B(t).id))),()=>(B(f),B(t),V(()=>!B(f).includes(B(t).id)&&(!!B(t).unavailable||B(f).length>=25))),()=>(H(Z),B(t),n(),V(()=>Z(B(t).private?`batchPrivate`:`batchPublic`,n())))]),Cr(`change`,i,()=>g(B(t).id)),W(e,r)}),D(ue),D(se);var de=I(se,2),fe=e=>{var t=Yc(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`batchNoMatches`,n())))]),W(e,t)};K(de,e=>{B(a),V(()=>!B(a).length)&&e(fe)});var pe=I(de,2),me=e=>{var t=Xc(),r=N(t),i=F(r,!0),o=I(r,2),s=F(o),c=I(o,2),d=F(c,!0);D(t),R((e,t,n)=>{r.disabled=B(h)===0||!l()||u(),G(i,e),G(s,`${B(h)+1} / ${t??``}`),c.disabled=(B(h),B(a),H(l()),H(u()),V(()=>(B(h)+1)*25>=B(a).length||!l()||u())),G(d,n)},[()=>(H(Z),n(),V(()=>Z(`batchPrevious`,n()))),()=>(B(a),V(()=>Math.ceil(B(a).length/25))),()=>(H(Z),n(),V(()=>Z(`batchNext`,n())))]),Cr(`click`,r,()=>M(h,B(h)-1)),Cr(`click`,c,()=>M(h,B(h)+1)),W(e,t)};K(pe,e=>{B(a),V(()=>B(a).length>25)&&e(me)});var he=I(pe,2),ge=N(he),_e=F(ge,!0),ve=I(ge,2),ye=F(ve,!0),be=I(ve,2),xe=F(be,!0),Se=I(be,2);bi(Se);var Ce=I(Se,2),we=N(Ce),T=F(we,!0),Te=I(we,2),E=F(Te,!0);D(Ce),D(he);var Ee=I(he,2),De=F(Ee,!0);R((e,t,n,r,i,a,o,c,d,p,m)=>{G(b,e),G(re,t),ie.disabled=!l()||u(),G(oe,n),se.disabled=!l()||u(),G(le,r),G(_e,i),G(ye,a),G(xe,o),Se.disabled=!l()||u(),we.disabled=c,G(T,d),Te.disabled=!l()||u(),G(E,p),Ee.disabled=(H(l()),H(u()),B(s),B(f),V(()=>!l()||u()||B(s)||B(f).length<1||B(f).length>25)),G(De,m)},[()=>(H(Z),n(),H(c()),V(()=>Z(`batchSelectionBody`,n(),{organization:c().organization}))),()=>(H(Z),n(),V(()=>Z(`batchFilter`,n()))),()=>(H(Z),n(),B(f),V(()=>Z(`batchSelectedCount`,n(),{count:String(B(f).length)}))),()=>(H(Z),n(),V(()=>Z(`batchRepositories`,n()))),()=>(H(Z),n(),V(()=>Z(`batchMissingRepository`,n()))),()=>(H(Z),n(),V(()=>Z(`batchAccessExplanation`,n()))),()=>(H(Z),n(),V(()=>Z(`batchExactName`,n()))),()=>(H(l()),H(u()),B(m),V(()=>!l()||u()||!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$/.test(B(m).trim()))),()=>(H(Z),n(),V(()=>Z(`batchFindRepository`,n()))),()=>(H(Z),n(),V(()=>Z(`batchChangeAccess`,n()))),()=>(H(Z),n(),V(()=>Z(`batchReviewSelection`,n())))]),Cr(`input`,ie,()=>M(h,0)),Ti(ie,()=>B(p),e=>M(p,e)),Ti(Se,()=>B(m),e=>M(m,e)),Cr(`click`,we,()=>_(`resolve`)),Cr(`click`,Te,()=>_(`access`)),Cr(`click`,Ee,()=>_(`select`)),W(e,v),Je(),i()}wr([`input`,`change`,`click`]);var $c=U(`

                                                                                      `,1),el=U(``),tl=U(``),nl=U(``),rl=U(`

                                                                                      `,1),il=U(`

                                                                                      `,1);function al(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`prompt`,8),s=X(t,`controller`,8),c=X(t,`busy`,8),l=X(t,`onSubmit`,8),u=j(o().kind===`quick-edit`?o().current:``);L(()=>n(),()=>{M(a,ta(n()))}),En(),Ai();var d=Nr(),f=P(d),p=e=>{var t=rl(),r=P(t),i=F(r,!0),d=I(r,2),f=e=>{var t=$c(),r=P(t),i=F(r,!0),a=I(r,2);{let e=k(()=>(H(lo),H(o()),n(),V(()=>lo(o().presentation[n()].documentation.url))));Po(a,{get explanation(){return H(o()),n(),V(()=>o().presentation[n()])},get helpUrl(){return B(e)}})}R(()=>G(i,(H(o()),n(),V(()=>o().presentation[n()].summary)))),W(e,t)};K(d,e=>{H(o()),V(()=>o().presentation)&&e(f)});var p=I(d,2),m=F(p),h=I(p,2),g=N(h),_=F(g,!0),v=I(g,2),y=e=>{var t=tl();J(t,5,()=>(H(o()),V(()=>o().choices)),q,(e,t)=>{var r=el(),i=F(r,!0),a={};R(e=>{G(i,e),a!==(a=B(t))&&(r.value=(r.__value=a)??``)},[()=>(H(ia),B(t),n(),V(()=>ia(B(t),n())))]),W(e,r)}),D(t),pi(t),R(()=>t.disabled=!s()||c()),mi(t,()=>B(u),e=>M(u,e)),W(e,t)},b=e=>{var t=nl();bi(t),R(()=>{Y(t,`min`,(H(o()),V(()=>o().min))),Y(t,`max`,(H(o()),V(()=>o().max))),t.disabled=!s()||c()}),Ti(t,()=>B(u),e=>M(u,e)),W(e,t)};K(v,e=>{H(o()),V(()=>o().choices)?e(y):e(b,-1)});var x=I(v,2),S=N(x),C=F(S,!0),w=I(S),ee=F(w,!0);D(x),D(h),R((e,t)=>{G(i,e),G(m,`${B(a),V(()=>B(a).current)??``}: ${t??``}`),G(_,(B(a),V(()=>B(a).next))),S.disabled=!s()||c(),G(C,(B(a),V(()=>B(a).back))),w.disabled=!s()||c(),G(ee,(B(a),V(()=>B(a).preview)))},[()=>(H(na),H(o()),n(),V(()=>na(o().id,n()))),()=>(H(ia),H(o()),n(),V(()=>ia(o().current,n())))]),Sr(`submit`,h,e=>{e.preventDefault(),l()(String(B(u)??``))}),Cr(`click`,S,()=>l()(`cancel`)),W(e,t)},m=e=>{var t=il(),r=P(t),i=F(r,!0),u=I(r),d=F(u,!0),f=I(u,2),p=N(f),m=F(p,!0),h=I(p),g=F(h,!0),_=I(h),v=F(_,!0),y=I(_),b=F(y,!0),x=I(y),S=F(x,!0),C=F(I(x),!0);D(f);var w=I(f,2);let ee;var te=F(w,!0),ne=I(w,2),re=F(ne,!0),ie=I(ne,2),ae=N(ie),oe=F(ae,!0),se=I(ae),ce=F(se,!0);D(ie),R((e,t,n)=>{G(i,(B(a),V(()=>B(a).review))),G(d,e),G(m,(B(a),V(()=>B(a).current))),G(g,t),G(v,(B(a),V(()=>B(a).next))),G(b,n),G(S,(B(a),V(()=>B(a).source))),G(C,(B(a),H(o()),V(()=>B(a)[o().change.scope]))),ee=li(w,1,`banner`,null,ee,{warning:o().change.scope===`organization`}),G(te,(H(o()),B(a),V(()=>o().change.scope===`organization`?B(a).orgImpact:B(a).repoImpact))),G(re,(B(a),V(()=>B(a).effect))),ae.disabled=!s()||c(),G(oe,(B(a),V(()=>B(a).back))),se.disabled=!s()||c(),G(ce,(B(a),V(()=>B(a).apply)))},[()=>(H(na),H(o()),n(),V(()=>na(o().change.id,n()))),()=>(H(ia),H(o()),n(),V(()=>ia(o().change.before,n()))),()=>(H(ia),H(o()),n(),V(()=>ia(o().change.after,n())))]),Cr(`click`,ae,()=>l()(`cancel`)),Cr(`click`,se,()=>l()(`approve`)),W(e,t)};K(f,e=>{H(o()),V(()=>o().kind===`quick-edit`)?e(p):e(m,-1)}),W(e,d),Je(),i()}wr([`click`]);function ol(e,t){let n=t,r=!0,i=()=>queueMicrotask(()=>{if(!r||!e.isConnected)return;let t=e.querySelector?.(`h2`);t?.isConnected?(t.setAttribute(`tabindex`,`-1`),t.focus({preventScroll:!1})):e.focus({preventScroll:!1})});return i(),{update(e){e!==n&&(n=e,i())},destroy(){r=!1}}}var sl=U(`

                                                                                      `),cl=U(`

                                                                                      `),ll=U(`
                                                                                      `);function ul(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`prompt`,8),s=X(t,`revision`,8),c=X(t,`promptRevision`,8),l=X(t,`controller`,8),u=X(t,`busy`,8),d=X(t,`onSubmit`,8),f=X(t,`onRetryDiscovery`,8),p=X(t,`onBack`,8);L(()=>(H(o()),n()),()=>{M(a,Ia(o(),n()))}),En(),Ai();var m=ll(),h=N(m),g=N(h),_=F(g,!0),v=F(I(g));D(h);var y=I(h,2),b=e=>{var t=sl(),r=F(t,!0);R(e=>G(r,e),[()=>(H(o()),H(Z),n(),B(a),V(()=>o().kind===`repositories`?Z(`batchReviewSelection`,n()):B(a)?.title??o().title))]),W(e,t)},x=_t(()=>(H(o()),V(()=>![`question`,`management`,`quick-edit`,`quick-review`,`batch-plan`,`batch-result`].includes(o().kind))));K(y,e=>{B(x)&&e(b)});var S=I(y,2),C=e=>{var t=cl(),n=F(t,!0);R(()=>G(n,(B(a),H(o()),V(()=>B(a)?.description??(`description`in o()?o().description:``))))),W(e,t)};K(S,e=>{B(a),H(o()),V(()=>B(a)?.description||`description`in o()&&o().description)&&e(C)}),Jr(I(S,2),c,e=>{var t=Nr(),n=P(t),r=e=>{{let t=k(()=>(H(o()),V(()=>o().kind===`batch-plan`?`review`:`result`)));Kc(e,{get batch(){return H(o()),V(()=>o().batch)},get mode(){return B(t)},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})}},i=e=>{Qc(e,{get selection(){return H(o()),V(()=>o().selection)},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})},a=e=>{as(e,{get prompt(){return o()},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()},get onRetryDiscovery(){return f()},get onBack(){return p()}})},s=e=>{ls(e,{get prompt(){return o()},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})},c=e=>{vs(e,{get prompt(){return o()},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})},m=e=>{dc(e,{get prompt(){return o()},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})},h=e=>{Tc(e,{get view(){return H(o()),V(()=>o().management)},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})},g=e=>{al(e,{get prompt(){return o()},get controller(){return l()},get busy(){return u()},get onSubmit(){return d()}})};K(n,e=>{H(o()),V(()=>o().kind===`batch-plan`||o().kind===`batch-result`)?e(r):(H(o()),V(()=>o().kind===`repositories`)?e(i,1):(H(o()),V(()=>o().kind===`question`)?e(a,2):(H(o()),V(()=>o().kind===`choice`||o().kind===`confirm`)?e(s,3):(H(o()),V(()=>o().kind===`text`||o().kind===`secret`)?e(c,4):(H(o()),V(()=>o().kind===`plan`)?e(m,5):(H(o()),V(()=>o().kind===`management`)?e(h,6):(H(o()),V(()=>o().kind===`quick-edit`||o().kind===`quick-review`)&&e(g,7))))))))}),W(e,t)}),D(m),ri(m,(e,t)=>ol?.(e,t),c),R((e,t,n)=>{Y(m,`aria-label`,e),G(_,t),G(v,`${n??``} ${s()??``}`)},[()=>(H(Z),n(),V(()=>Z(`currentDecision`,n()))),()=>(H(Z),n(),V(()=>Z(`currentDecision`,n()))),()=>(H(Z),n(),V(()=>Z(`session`,n())))]),W(e,m),Je(),i()}var dl=`Optional runner discovery selected(Optional organization runner discovery selected(List existing repository self-hosted runners without changing access.(List existing eligible runner groups and their runners; manual routing remains available without this grant.(Create the reviewed installation commit and installer-owned branch.(Include reviewed workflow files in the installation PR.(Create the reviewed installation PR without merging it.(Add only the reviewed repository access to an existing selected resource.(Inspect reusable organization configuration without changing its values.(Inspect effective repository overrides.(Inspect existing Secret names without reading their values.(Inspect inherited Secret access without replacing existing bindings.(Inspect existing trusted credential-health evidence.(Resolve repository identity and visibility.(Inspect installed workflows and repository files.(Inspect and provision selected GitHub Actions Secrets.(Inspect and provision selected GitHub Actions Variables.(Provision labels and issue resources.(Inspect and dispatch credential-health workflows.(Inspect CI workflow runs and jobs for exact producer identities.(Discover exact CI check and producer identities for guarded approval.(Inspect branch protection and rulesets.(Bootstrap a missing credential-health workflow.(Inspect and provision organization Actions Secrets.(Inspect and provision organization Actions Variables.(Provision and assign configured issue types.(Inspect selected Projects and their Status options; setup does not edit Project items.(Create the initial repository tag when no version tag exists.(Create an isolated branch for the Actions permission check.(Create the initial tag and an isolated branch for the Actions permission check.(Create the initial tag or an isolated branch for the Actions permission check.(Inspect and provision selected repository Actions Secrets.(Inspect and provision selected repository Actions Variables.(Provision labels for the selected issue workflows.(Dispatch credential-health checks for existing Secrets.(Prepare and clean isolated Actions checks for the bot PAT and any existing credentials.(Prepare a verified no-job workflow for the bot Actions check.(Inspect CI workflow runs and jobs for approval evidence.(Temporarily install credential health when its workflow is not confirmed installed.(Inspect branch protection and effective rulesets.(Inspect and provision selected organization Actions Secrets.(Inspect and provision selected organization Actions Variables.(Provision native issue types for the selected workflows.(Resolve repository and collaborator metadata.(Read repository branches, commits, and files for enabled runtime routes.(Dispatch selected release or hotfix workflows and check previous runs.(Check previous workflow runs before executing an enabled route.(Create managed branches, edit files, or merge selected release/hotfix changes.(Manage selected issue lifecycles, comments, and progress.(Manage selected pull request workflows, reviews, or autofix.(Verify current-head required checks and producer identities.(Load the PR approval assessment policy.(Select or authorize organization members for enabled workflows.(Assign configured organization issue types.(Update selected organization Projects.(Load the organization-scoped approval policy.(Secret provisioning enabled(Variable provisioning enabled(Issue workflows enabled(Credential health enabled(Initial tag or credential-health check enabled(Pull-request approval enabled(Guarded pull-request approval enabled(Release, hotfix, or guarded approval enabled(Temporary health workflow required(Organization Secret storage selected(Organization Variable storage selected(Issue type automation enabled(Organization Projects selected`.split(`(`),fl={"Optional runner discovery selected":`Consulta opcional de runners seleccionada`,"Optional organization runner discovery selected":`Consulta opcional de runners de organización seleccionada`,"List existing repository self-hosted runners without changing access.":`Consultar los runners self-hosted existentes del repositorio sin cambiar su acceso.`,"List existing eligible runner groups and their runners; manual routing remains available without this grant.":`Consultar los grupos de runners accesibles y sus runners; la configuración manual sigue disponible sin este permiso.`,"Create the reviewed installation commit and installer-owned branch.":`Crear el commit de instalación revisado y la rama del instalador.`,"Include reviewed workflow files in the installation PR.":`Incluir los workflows revisados en la PR de instalación.`,"Create the reviewed installation PR without merging it.":`Crear la PR de instalación revisada sin fusionarla.`,"Add only the reviewed repository access to an existing selected resource.":`Añadir solo el acceso del repositorio revisado a un recurso existente de visibilidad seleccionada.`,"Inspect reusable organization configuration without changing its values.":`Inspeccionar la configuración reutilizable de la organización sin cambiar sus valores.`,"Inspect effective repository overrides.":`Inspeccionar los ajustes efectivos del repositorio.`,"Inspect existing Secret names without reading their values.":`Inspeccionar los nombres de los Secrets existentes sin leer sus valores.`,"Inspect inherited Secret access without replacing existing bindings.":`Inspeccionar el acceso a los Secrets heredados sin sustituir los existentes.`,"Inspect existing trusted credential-health evidence.":`Inspeccionar la evidencia fiable existente sobre las credenciales.`,"Resolve repository identity and visibility.":`Comprobar la identidad y visibilidad del repositorio.`,"Inspect installed workflows and repository files.":`Examinar los workflows instalados y los archivos del repositorio.`,"Inspect and provision selected GitHub Actions Secrets.":`Examinar y configurar los Secrets de GitHub Actions seleccionados.`,"Inspect and provision selected GitHub Actions Variables.":`Examinar y configurar las Variables de GitHub Actions seleccionadas.`,"Provision labels and issue resources.":`Crear etiquetas y recursos de issues.`,"Inspect and dispatch credential-health workflows.":`Examinar y ejecutar los workflows de comprobación de credenciales.`,"Inspect CI workflow runs and jobs for exact producer identities.":`Examinar ejecuciones y jobs de CI para identificar sus productores exactos.`,"Discover exact CI check and producer identities for guarded approval.":`Identificar los checks de CI y sus productores exactos para la aprobación protegida.`,"Inspect branch protection and rulesets.":`Examinar la protección de ramas y sus reglas.`,"Bootstrap a missing credential-health workflow.":`Instalar provisionalmente el workflow de comprobación de credenciales que falta.`,"Inspect and provision organization Actions Secrets.":`Examinar y configurar Secrets de Actions en la organización.`,"Inspect and provision organization Actions Variables.":`Examinar y configurar Variables de Actions en la organización.`,"Provision and assign configured issue types.":`Crear y asignar los tipos de issue configurados.`,"Inspect selected Projects and their Status options; setup does not edit Project items.":`Consultar los Projects seleccionados y sus opciones de Status; el setup no modifica los elementos de los Projects.`,"Create the initial repository tag when no version tag exists.":`Crear el tag inicial si el repositorio aún no tiene ninguno de versión.`,"Create an isolated branch for the Actions permission check.":`Crear una rama aislada para comprobar el permiso de Actions.`,"Create the initial tag and an isolated branch for the Actions permission check.":`Crear el tag inicial y una rama aislada para comprobar el permiso de Actions.`,"Create the initial tag or an isolated branch for the Actions permission check.":`Crear el tag inicial o una rama aislada para comprobar el permiso de Actions.`,"Inspect and provision selected repository Actions Secrets.":`Examinar y configurar los Secrets de Actions seleccionados en el repositorio.`,"Inspect and provision selected repository Actions Variables.":`Examinar y configurar las Variables de Actions seleccionadas en el repositorio.`,"Provision labels for the selected issue workflows.":`Crear las etiquetas de los flujos de issues seleccionados.`,"Dispatch credential-health checks for existing Secrets.":`Ejecutar comprobaciones de credenciales para los Secrets existentes.`,"Prepare and clean isolated Actions checks for the bot PAT and any existing credentials.":`Preparar y limpiar las pruebas aisladas de Actions para el PAT del bot y las credenciales existentes.`,"Prepare a verified no-job workflow for the bot Actions check.":`Preparar un workflow verificado con los jobs desactivados para comprobar Actions con el PAT del bot.`,"Inspect CI workflow runs and jobs for approval evidence.":`Examinar ejecuciones y jobs de CI como prueba para la aprobación.`,"Temporarily install credential health when its workflow is not confirmed installed.":`Instalar temporalmente la comprobación de credenciales si su workflow no está confirmado.`,"Inspect branch protection and effective rulesets.":`Examinar la protección de ramas y las reglas efectivas.`,"Inspect and provision selected organization Actions Secrets.":`Examinar y configurar los Secrets de Actions seleccionados en la organización.`,"Inspect and provision selected organization Actions Variables.":`Examinar y configurar las Variables de Actions seleccionadas en la organización.`,"Provision native issue types for the selected workflows.":`Crear tipos de issue nativos para los flujos seleccionados.`,"Resolve repository and collaborator metadata.":`Consultar los metadatos del repositorio y sus colaboradores.`,"Read repository branches, commits, and files for enabled runtime routes.":`Leer ramas, commits y archivos del repositorio para las rutas de ejecución habilitadas.`,"Dispatch selected release or hotfix workflows and check previous runs.":`Ejecutar los flujos de release o hotfix seleccionados y comprobar ejecuciones anteriores.`,"Check previous workflow runs before executing an enabled route.":`Comprobar ejecuciones anteriores antes de iniciar un flujo habilitado.`,"Create managed branches, edit files, or merge selected release/hotfix changes.":`Crear ramas gestionadas, editar archivos o integrar cambios de release y hotfix.`,"Manage selected issue lifecycles, comments, and progress.":`Gestionar el ciclo de vida, los comentarios y el progreso de los issues seleccionados.`,"Manage selected pull request workflows, reviews, or autofix.":`Gestionar flujos de pull requests, revisiones o correcciones automáticas.`,"Verify current-head required checks and producer identities.":`Verificar los checks obligatorios y productores del commit actual.`,"Load the PR approval assessment policy.":`Leer la política de evaluación de aprobación de PRs.`,"Select or authorize organization members for enabled workflows.":`Seleccionar o autorizar miembros de la organización para los flujos activos.`,"Assign configured organization issue types.":`Asignar los tipos de issue configurados en la organización.`,"Update selected organization Projects.":`Actualizar los Projects seleccionados de la organización.`,"Load the organization-scoped approval policy.":`Leer la política de aprobación guardada en la organización.`,"Secret provisioning enabled":`Configuración de Secrets activada`,"Variable provisioning enabled":`Configuración de Variables activada`,"Issue workflows enabled":`Flujos de issues activados`,"Credential health enabled":`Comprobación de credenciales activada`,"Initial tag or credential-health check enabled":`Tag inicial o comprobación de credenciales activados`,"Pull-request approval enabled":`Aprobación de pull requests activada`,"Guarded pull-request approval enabled":`Aprobación protegida de pull requests activada`,"Release, hotfix, or guarded approval enabled":`Release, hotfix o aprobación protegida activados`,"Temporary health workflow required":`Hace falta un workflow temporal de comprobación`,"Organization Secret storage selected":`Se eligió guardar Secrets en la organización`,"Organization Variable storage selected":`Se eligió guardar Variables en la organización`,"Issue type automation enabled":`Automatización de tipos de issue activada`,"Organization Projects selected":`Se seleccionaron Projects de la organización`},pl={"Optional runner discovery selected":`Consultation facultative des runners sélectionnée`,"Optional organization runner discovery selected":`Consultation facultative des runners de l’organisation sélectionnée`,"List existing repository self-hosted runners without changing access.":`Consulter les runners auto-hébergés existants du dépôt sans modifier leurs accès.`,"List existing eligible runner groups and their runners; manual routing remains available without this grant.":`Consulter les groupes accessibles et leurs runners ; la configuration manuelle reste possible sans ce droit.`,"Create the reviewed installation commit and installer-owned branch.":`Créer le commit d’installation validé et la branche de l’installateur.`,"Include reviewed workflow files in the installation PR.":`Inclure les workflows validés dans la PR d’installation.`,"Create the reviewed installation PR without merging it.":`Créer la PR d’installation validée sans la fusionner.`,"Add only the reviewed repository access to an existing selected resource.":`Ajouter uniquement l’accès validé du dépôt à une ressource existante de visibilité sélectionnée.`,"Inspect reusable organization configuration without changing its values.":`Lire la configuration réutilisable de l’organisation sans modifier ses valeurs.`,"Inspect effective repository overrides.":`Lire les réglages effectifs du dépôt.`,"Inspect existing Secret names without reading their values.":`Lire les noms des Secrets existants sans accéder à leurs valeurs.`,"Inspect inherited Secret access without replacing existing bindings.":`Vérifier l’accès aux Secrets hérités sans remplacer les liaisons existantes.`,"Inspect existing trusted credential-health evidence.":`Lire les preuves fiables existantes de vérification des identifiants.`,"Resolve repository identity and visibility.":`Vérifier l’identité et la visibilité du dépôt.`,"Inspect installed workflows and repository files.":`Examiner les workflows installés et les fichiers du dépôt.`,"Inspect and provision selected GitHub Actions Secrets.":`Examiner et configurer les Secrets GitHub Actions choisis.`,"Inspect and provision selected GitHub Actions Variables.":`Examiner et configurer les Variables GitHub Actions choisies.`,"Provision labels and issue resources.":`Créer des étiquettes et des ressources pour les tickets.`,"Inspect and dispatch credential-health workflows.":`Examiner et lancer les workflows de vérification des identifiants.`,"Inspect CI workflow runs and jobs for exact producer identities.":`Examiner les exécutions et jobs CI pour identifier exactement leurs producteurs.`,"Discover exact CI check and producer identities for guarded approval.":`Identifier précisément les vérifications CI et leurs producteurs pour l’approbation encadrée.`,"Inspect branch protection and rulesets.":`Examiner la protection des branches et les ensembles de règles.`,"Bootstrap a missing credential-health workflow.":`Installer provisoirement le workflow de vérification des identifiants manquant.`,"Inspect and provision organization Actions Secrets.":`Examiner et configurer les Secrets Actions de l’organisation.`,"Inspect and provision organization Actions Variables.":`Examiner et configurer les Variables Actions de l’organisation.`,"Provision and assign configured issue types.":`Créer et attribuer les types de ticket configurés.`,"Inspect selected Projects and their Status options; setup does not edit Project items.":`Consulter les Projects sélectionnés et leurs options Status ; la configuration ne modifie aucun élément de Project.`,"Create the initial repository tag when no version tag exists.":`Créer le tag initial si le dépôt ne possède encore aucun tag de version.`,"Create an isolated branch for the Actions permission check.":`Créer une branche isolée pour vérifier l’autorisation Actions.`,"Create the initial tag and an isolated branch for the Actions permission check.":`Créer le tag initial et une branche isolée pour vérifier l’autorisation Actions.`,"Create the initial tag or an isolated branch for the Actions permission check.":`Créer le tag initial ou une branche isolée pour vérifier l’autorisation Actions.`,"Inspect and provision selected repository Actions Secrets.":`Examiner et configurer les Secrets Actions choisis dans le dépôt.`,"Inspect and provision selected repository Actions Variables.":`Examiner et configurer les Variables Actions choisies dans le dépôt.`,"Provision labels for the selected issue workflows.":`Créer les étiquettes des workflows de ticket choisis.`,"Dispatch credential-health checks for existing Secrets.":`Lancer des vérifications d’identifiants pour les Secrets existants.`,"Prepare and clean isolated Actions checks for the bot PAT and any existing credentials.":`Préparer et nettoyer les tests Actions isolés du PAT du bot et des identifiants existants.`,"Prepare a verified no-job workflow for the bot Actions check.":`Préparer un workflow vérifié aux jobs désactivés pour tester Actions avec le PAT du bot.`,"Inspect CI workflow runs and jobs for approval evidence.":`Examiner les exécutions et jobs CI comme preuve pour l’approbation.`,"Temporarily install credential health when its workflow is not confirmed installed.":`Installer provisoirement la vérification des identifiants si son workflow n’est pas confirmé.`,"Inspect branch protection and effective rulesets.":`Examiner la protection des branches et les règles applicables.`,"Inspect and provision selected organization Actions Secrets.":`Examiner et configurer les Secrets Actions choisis dans l’organisation.`,"Inspect and provision selected organization Actions Variables.":`Examiner et configurer les Variables Actions choisies dans l’organisation.`,"Provision native issue types for the selected workflows.":`Créer des types de ticket natifs pour les workflows choisis.`,"Resolve repository and collaborator metadata.":`Consulter les métadonnées du dépôt et de ses collaborateurs.`,"Read repository branches, commits, and files for enabled runtime routes.":`Lire les branches, commits et fichiers du dépôt pour les parcours d’exécution activés.`,"Dispatch selected release or hotfix workflows and check previous runs.":`Lancer les workflows de version ou correctif urgent choisis et vérifier les exécutions précédentes.`,"Check previous workflow runs before executing an enabled route.":`Vérifier les exécutions précédentes avant de lancer un parcours activé.`,"Create managed branches, edit files, or merge selected release/hotfix changes.":`Créer des branches gérées, modifier des fichiers ou fusionner les changements de version et correctif.`,"Manage selected issue lifecycles, comments, and progress.":`Gérer le cycle de vie, les commentaires et la progression des tickets choisis.`,"Manage selected pull request workflows, reviews, or autofix.":`Gérer les workflows de pull request, les revues ou les corrections automatiques.`,"Verify current-head required checks and producer identities.":`Vérifier les contrôles requis et leurs producteurs pour le commit courant.`,"Load the PR approval assessment policy.":`Lire la politique d’évaluation de l’approbation des PR.`,"Select or authorize organization members for enabled workflows.":`Sélectionner ou autoriser des membres de l’organisation pour les workflows activés.`,"Assign configured organization issue types.":`Attribuer les types de ticket configurés dans l’organisation.`,"Update selected organization Projects.":`Mettre à jour les projets de l’organisation choisis.`,"Load the organization-scoped approval policy.":`Lire la politique d’approbation stockée dans l’organisation.`,"Secret provisioning enabled":`Configuration des Secrets activée`,"Variable provisioning enabled":`Configuration des Variables activée`,"Issue workflows enabled":`Workflows de ticket activés`,"Credential health enabled":`Vérification des identifiants activée`,"Initial tag or credential-health check enabled":`Tag initial ou vérification des identifiants activés`,"Pull-request approval enabled":`Approbation des pull requests activée`,"Guarded pull-request approval enabled":`Approbation encadrée des pull requests activée`,"Release, hotfix, or guarded approval enabled":`Version, correctif urgent ou approbation encadrée activés`,"Temporary health workflow required":`Workflow temporaire de vérification requis`,"Organization Secret storage selected":`Stockage des Secrets dans l’organisation choisi`,"Organization Variable storage selected":`Stockage des Variables dans l’organisation choisi`,"Issue type automation enabled":`Automatisation des types de ticket activée`,"Organization Projects selected":`Projets de l’organisation choisis`},ml={"Optional runner discovery selected":`Consulta opcional de runners selecionada`,"Optional organization runner discovery selected":`Consulta opcional de runners da organização selecionada`,"List existing repository self-hosted runners without changing access.":`Consultar os runners self-hosted existentes do repositório sem alterar o acesso.`,"List existing eligible runner groups and their runners; manual routing remains available without this grant.":`Consultar os grupos acessíveis e os seus runners; a configuração manual continua disponível sem esta permissão.`,"Create the reviewed installation commit and installer-owned branch.":`Criar o commit de instalação revisto e o ramo do instalador.`,"Include reviewed workflow files in the installation PR.":`Incluir os workflows revistos na PR de instalação.`,"Create the reviewed installation PR without merging it.":`Criar a PR de instalação revista sem a integrar.`,"Add only the reviewed repository access to an existing selected resource.":`Adicionar apenas o acesso revisto do repositório a um recurso existente de visibilidade selecionada.`,"Inspect reusable organization configuration without changing its values.":`Consultar a configuração reutilizável da organização sem alterar os seus valores.`,"Inspect effective repository overrides.":`Consultar os ajustes efetivos do repositório.`,"Inspect existing Secret names without reading their values.":`Consultar os nomes dos Secrets existentes sem ler os seus valores.`,"Inspect inherited Secret access without replacing existing bindings.":`Consultar o acesso aos Secrets herdados sem substituir as ligações existentes.`,"Inspect existing trusted credential-health evidence.":`Consultar as provas fiáveis existentes da verificação das credenciais.`,"Resolve repository identity and visibility.":`Verificar a identidade e visibilidade do repositório.`,"Inspect installed workflows and repository files.":`Inspecionar os fluxos instalados e os ficheiros do repositório.`,"Inspect and provision selected GitHub Actions Secrets.":`Inspecionar e configurar os Secrets do GitHub Actions selecionados.`,"Inspect and provision selected GitHub Actions Variables.":`Inspecionar e configurar as Variables do GitHub Actions selecionadas.`,"Provision labels and issue resources.":`Criar etiquetas e recursos para questões.`,"Inspect and dispatch credential-health workflows.":`Inspecionar e executar os fluxos de verificação de credenciais.`,"Inspect CI workflow runs and jobs for exact producer identities.":`Inspecionar execuções e jobs CI para identificar exatamente os seus produtores.`,"Discover exact CI check and producer identities for guarded approval.":`Identificar as verificações CI e os seus produtores exatos para a aprovação protegida.`,"Inspect branch protection and rulesets.":`Inspecionar a proteção de ramos e os conjuntos de regras.`,"Bootstrap a missing credential-health workflow.":`Instalar temporariamente o fluxo de verificação de credenciais em falta.`,"Inspect and provision organization Actions Secrets.":`Inspecionar e configurar os Secrets de Actions da organização.`,"Inspect and provision organization Actions Variables.":`Inspecionar e configurar as Variables de Actions da organização.`,"Provision and assign configured issue types.":`Criar e atribuir os tipos de questão configurados.`,"Inspect selected Projects and their Status options; setup does not edit Project items.":`Consultar os Projects selecionados e as suas opções de Status; a configuração não altera os itens dos Projects.`,"Create the initial repository tag when no version tag exists.":`Criar a etiqueta inicial se o repositório ainda não tiver etiquetas de versão.`,"Create an isolated branch for the Actions permission check.":`Criar um ramo isolado para verificar a permissão de Actions.`,"Create the initial tag and an isolated branch for the Actions permission check.":`Criar a etiqueta inicial e um ramo isolado para verificar a permissão de Actions.`,"Create the initial tag or an isolated branch for the Actions permission check.":`Criar a etiqueta inicial ou um ramo isolado para verificar a permissão de Actions.`,"Inspect and provision selected repository Actions Secrets.":`Inspecionar e configurar os Secrets de Actions selecionados no repositório.`,"Inspect and provision selected repository Actions Variables.":`Inspecionar e configurar as Variables de Actions selecionadas no repositório.`,"Provision labels for the selected issue workflows.":`Criar etiquetas para os fluxos de questões selecionados.`,"Dispatch credential-health checks for existing Secrets.":`Executar verificações de credenciais para os Secrets existentes.`,"Prepare and clean isolated Actions checks for the bot PAT and any existing credentials.":`Preparar e limpar os testes isolados de Actions para o PAT do bot e as credenciais existentes.`,"Prepare a verified no-job workflow for the bot Actions check.":`Preparar um workflow verificado com os jobs desativados para testar Actions com o PAT do bot.`,"Inspect CI workflow runs and jobs for approval evidence.":`Inspecionar execuções e jobs CI como prova para aprovação.`,"Temporarily install credential health when its workflow is not confirmed installed.":`Instalar temporariamente a verificação de credenciais se o fluxo não estiver confirmado.`,"Inspect branch protection and effective rulesets.":`Inspecionar a proteção de ramos e as regras aplicáveis.`,"Inspect and provision selected organization Actions Secrets.":`Inspecionar e configurar os Secrets de Actions selecionados na organização.`,"Inspect and provision selected organization Actions Variables.":`Inspecionar e configurar as Variables de Actions selecionadas na organização.`,"Provision native issue types for the selected workflows.":`Criar tipos de questão nativos para os fluxos selecionados.`,"Resolve repository and collaborator metadata.":`Consultar os metadados do repositório e dos colaboradores.`,"Read repository branches, commits, and files for enabled runtime routes.":`Ler branches, commits e arquivos do repositório para os fluxos de execução habilitados.`,"Dispatch selected release or hotfix workflows and check previous runs.":`Executar os fluxos de release ou hotfix selecionados e verificar execuções anteriores.`,"Check previous workflow runs before executing an enabled route.":`Verificar execuções anteriores antes de iniciar um percurso ativo.`,"Create managed branches, edit files, or merge selected release/hotfix changes.":`Criar ramos geridos, editar ficheiros ou integrar alterações de release e hotfix.`,"Manage selected issue lifecycles, comments, and progress.":`Gerir o ciclo de vida, os comentários e o progresso das questões selecionadas.`,"Manage selected pull request workflows, reviews, or autofix.":`Gerir fluxos de pull requests, revisões ou correções automáticas.`,"Verify current-head required checks and producer identities.":`Verificar as verificações obrigatórias e os produtores do commit atual.`,"Load the PR approval assessment policy.":`Ler a política de avaliação de aprovação de PRs.`,"Select or authorize organization members for enabled workflows.":`Selecionar ou autorizar membros da organização para os fluxos ativos.`,"Assign configured organization issue types.":`Atribuir os tipos de questão configurados na organização.`,"Update selected organization Projects.":`Atualizar os Projetos selecionados da organização.`,"Load the organization-scoped approval policy.":`Ler a política de aprovação guardada na organização.`,"Secret provisioning enabled":`Configuração de Secrets ativa`,"Variable provisioning enabled":`Configuração de Variables ativa`,"Issue workflows enabled":`Fluxos de questões ativos`,"Credential health enabled":`Verificação de credenciais ativa`,"Initial tag or credential-health check enabled":`Etiqueta inicial ou verificação de credenciais ativas`,"Pull-request approval enabled":`Aprovação de pull requests ativa`,"Guarded pull-request approval enabled":`Aprovação protegida de pull requests ativa`,"Release, hotfix, or guarded approval enabled":`Release, hotfix ou aprovação protegida ativos`,"Temporary health workflow required":`É necessário um fluxo temporário de verificação`,"Organization Secret storage selected":`Armazenamento dos Secrets na organização selecionado`,"Organization Variable storage selected":`Armazenamento das Variables na organização selecionado`,"Issue type automation enabled":`Automatização de tipos de questão ativa`,"Organization Projects selected":`Projetos da organização selecionados`},hl=new Set(dl),gl={es:fl,fr:pl,pt:ml};function _l(e,t){return e===`en`?t:hl.has(t)?gl[e][t]:Z(`permissionUnknown`,e)}var vl={en:{"contents-write":`Actions was not tested because its temporary branch could not be created. Check repository Contents Write, repository selection and organization authorization.`,"contents-workflows-write":`Actions was not tested because its temporary workflow could not be written. Check repository Contents and Workflows Write, repository selection and organization authorization. Unverifiable does not mean Actions is missing.`,"dispatch-workflow":`Actions was not tested because no active workflow_dispatch workflow was found on the default branch. Install an eligible workflow before retrying.`},es:{"contents-write":`No se comprobó Actions porque no se pudo crear su rama temporal. Revisa Contents Write del repositorio, la selección del repositorio y la autorización de la organización.`,"contents-workflows-write":`No se comprobó Actions porque no se pudo escribir su workflow temporal. Revisa Contents y Workflows Write del repositorio, la selección del repositorio y la autorización de la organización. No verificable no significa que falte Actions.`,"dispatch-workflow":`No se comprobó Actions porque no se encontró un workflow activo con workflow_dispatch en la rama predeterminada. Instala uno antes de reintentar.`},fr:{"contents-write":`Actions n’a pas été testé car sa branche temporaire n’a pas pu être créée. Vérifiez Contents Write du dépôt, la sélection du dépôt et l’autorisation de l’organisation.`,"contents-workflows-write":`Actions n’a pas été testé car son workflow temporaire n’a pas pu être écrit. Vérifiez Contents et Workflows Write du dépôt, la sélection du dépôt et l’autorisation de l’organisation. Non vérifiable ne signifie pas qu’Actions manque.`,"dispatch-workflow":`Actions n’a pas été testé car aucun workflow actif avec workflow_dispatch n’a été trouvé sur la branche par défaut. Installez-en un avant de réessayer.`},pt:{"contents-write":`Actions não foi testado porque não foi possível criar a sua branch temporária. Verifique Contents Write do repositório, a seleção do repositório e a autorização da organização.`,"contents-workflows-write":`Actions não foi testado porque não foi possível escrever o seu workflow temporário. Verifique Contents e Workflows Write do repositório, a seleção do repositório e a autorização da organização. Não verificável não significa que falte Actions.`,"dispatch-workflow":`Actions não foi testado porque não foi encontrado um workflow ativo com workflow_dispatch na branch predefinida. Instale um antes de tentar novamente.`}};function yl(e,t){if(e===`contents-write`||e===`contents-workflows-write`||e===`dispatch-workflow`)return vl[t][e]}function bl(e,t){if(e.status===`unverifiable`&&e.permission===`Actions`&&e.level===`write`){let n=yl(e.prerequisite,t);if(n)return n}return e.status===`verified`?Z(e.level===`write`?`permissionEvidenceVerifiedWrite`:e.scope===`organization`&&e.permission===`Projects`&&e.level===`read`?`permissionEvidencePrivateProject`:`permissionEvidenceVerified`,t):e.status===`missing`?Z(`permissionEvidenceMissing`,t):e.status===`available`?Z(e.publicReadEvidence===`public-organization-projects`?`permissionEvidencePublicProjects`:`permissionEvidencePublic`,t):e.level===`write`?Z(`permissionEvidenceWrite`,t):e.publicReadEvidence===`public-organization-projects`?Z(`permissionEvidencePublicProjects`,t):e.publicReadEvidence===`public-repository`?Z(`permissionEvidencePublic`,t):Z(`permissionEvidenceUnknownRead`,t)}var xl=U(` `),Sl=U(` `),Cl=U(`
                                                                                    • `),wl=U(`

                                                                                        `),Tl=U(`

                                                                                        `),El=U(``);function Dl(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`view`,8);Ai();var o=El(),s=N(o),c=I(N(s)),l=F(c,!0),u=I(c),d=F(u,!0),f=I(u),p=F(N(f),!0);D(f),D(s);var m=I(s,2),h=e=>{var t=wl(),r=I(N(t)),i=F(r),o=I(r),s=F(o,!0),c=I(o,2);J(c,5,()=>(H(a()),V(()=>a().permissions.report?.checks??a().permissions.requirements??[])),q,(e,t)=>{var r=Cl(),i=N(r),a=N(i,!0),o=I(a),s=e=>{var n=xl(),r=F(N(n));D(n),R(()=>G(r,`GitHub · ${B(t),V(()=>B(t).permission)??``}`)),W(e,n)},c=_t(()=>(n(),H($s),B(t),V(()=>n()!==`en`&&$s(n(),B(t).permission)!==B(t).permission)));K(o,e=>{B(c)&&e(s)});var l=I(o),u=F(l),d=I(l),f=F(d,!0),p=I(d),m=e=>{var r=Sl(),i=F(r,!0);R(e=>G(i,e),[()=>(H(_l),n(),B(t),V(()=>_l(n(),B(t).condition)))]),W(e,r)};K(p,e=>{B(t),V(()=>B(t).condition)&&e(m)});var h=I(p),g=e=>{var r=Sl(),i=F(r,!0);R(e=>G(i,e),[()=>(H(bl),B(t),n(),V(()=>bl(B(t),n())))]),W(e,r)};K(h,e=>{`status`in B(t)&&e(g)}),D(i);var _=I(i),v=N(_,!0),y=I(v),b=e=>{var r=Sl(),i=F(r,!0);R(e=>G(i,e),[()=>(H(ec),n(),B(t),V(()=>ec(n(),B(t).status)))]),W(e,r)},x=_t(()=>(B(t),H(ec),n(),V(()=>`status`in B(t)&&ec(n(),B(t).status))));K(y,e=>{B(x)&&e(b)}),D(_),D(r),R((e,t,n,r,i)=>{G(a,e),G(u,`${t??``} · ${n??``}`),G(f,r),G(v,i)},[()=>(H($s),n(),B(t),V(()=>$s(n(),B(t).permission))),()=>(H(Qs),n(),B(t),V(()=>Qs(n(),B(t).scope))),()=>(H(Qs),n(),B(t),V(()=>Qs(n(),B(t).applicability))),()=>(H(_l),n(),B(t),V(()=>_l(n(),B(t).reason))),()=>(H(Qs),n(),B(t),V(()=>Qs(n(),B(t).level)))]),W(e,r)}),D(c);var l=F(I(c,2),!0);D(t),R((e,t,n,r)=>{G(i,`${e??``} ${t??``}`),G(s,n),G(l,r)},[()=>(H(a()),H(Z),n(),V(()=>a().permissions.role===`setup`?Z(`setupPat`,n()):Z(`botPat`,n()))),()=>(H(Z),n(),V(()=>Z(`access`,n()))),()=>(H(a()),H(Z),n(),V(()=>a().permissions.report?Z(`readOnlyCheck`,n()):Z(`provisionalGrants`,n()))),()=>(H(Z),n(),V(()=>Z(`conditionalGrants`,n())))]),W(e,t)},g=e=>{var t=Tl(),r=I(N(t)),i=F(r,!0),a=F(I(r),!0);D(t),R((e,t)=>{G(i,e),G(a,t)},[()=>(H(Z),n(),V(()=>Z(`permissionsFollow`,n()))),()=>(H(Z),n(),V(()=>Z(`permissionsFollowBody`,n())))]),W(e,t)};K(m,e=>{H(a()),V(()=>a().permissions)?e(h):e(g,-1)}),D(o),R((e,t,n)=>{Y(o,`aria-label`,e),G(l,t),G(d,n),G(p,(H(a()),V(()=>a().batch?.organization??a().repository)))},[()=>(H(Z),n(),V(()=>Z(`setup`,n()))),()=>(H(Z),H(a()),n(),V(()=>Z(a().batch?`batchFocusTitle`:`repoFocus`,n()))),()=>(H(a()),H(Z),n(),V(()=>a().batch?Z(`batchFocusBody`,n(),{count:String(a().batch.targets.length)}):Z(`repoFocusBody`,n())))]),W(e,o),Je(),i()}function Ol(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`report`,8,void 0);Ai();var o=Nr(),s=P(o),c=e=>{{let t=k(()=>(H(Z),n(),V(()=>Z(`permissionSecretCollision`,n())))),r=k(()=>(H(Z),n(),V(()=>Z(`permissionSecretCollisionAction`,n()))));Xa(e,{tone:`warning`,get title(){return B(t)},get message(){return B(r)}})}},l=_t(()=>(H(a()),V(()=>a()?.checks.some(e=>e.incident===`secret-collision`)))),u=e=>{{let t=k(()=>(H(Z),n(),V(()=>Z(`permissionProbeCleanupPending`,n())))),r=k(()=>(H(Z),n(),V(()=>Z(`permissionProbeCleanupAction`,n()))));Xa(e,{tone:`warning`,get title(){return B(t)},get message(){return B(r)}})}},d=_t(()=>(H(a()),V(()=>a()?.checks.some(e=>e.cleanupPending))));K(s,e=>{B(l)?e(c):B(d)&&e(u,1)}),W(e,o),Je(),i()}var kl=U(`
                                                                                      • `),Al=U(`

                                                                                          `);function jl(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`effects`,8),o={files:`receiptFiles`,secrets:`receiptSecrets`,labels:`receiptLabels`,"issue-types":`receiptIssueTypes`,variables:`receiptVariables`,"initial-tag":`receiptInitialTag`},s={completed:`effectCompleted`,skipped:`effectSkipped`,"needs-inspection":`effectInspect`,"not-started":`effectNotStarted`,"in-progress":`effectInProgress`},c={local:`scopeLocal`,repository:`scopeRepository`,organization:`scopeOrganization`,mixed:`scopeMixed`};Ai();var l=Al(),u=N(l),d=F(u,!0),f=I(u,2);J(f,5,a,e=>e.id,(e,t)=>{var r=kl(),i=N(r),a=F(i,!0),l=I(i),u=I(l),d=e=>{var r=Mr();R(e=>G(r,`· ${e??``}`),[()=>(H(Z),B(t),n(),V(()=>Z(c[B(t).scope],n())))]),W(e,r)};K(u,e=>{B(t),V(()=>B(t).scope)&&e(d)}),D(r),R((e,t)=>{G(a,e),G(l,` — ${t??``}`)},[()=>(B(t),H(Z),n(),V(()=>o[B(t).id]?Z(o[B(t).id],n()):B(t).id)),()=>(H(Z),B(t),n(),V(()=>Z(s[B(t).state],n())))]),W(e,r)}),D(f),D(l),R(e=>G(d,e),[()=>(H(Z),n(),V(()=>Z(`resourceReceipt`,n())))]),W(e,l),Je(),i()}var Ml=U(`
                                                                                        • `),Nl=U(`

                                                                                            `,1),Pl=U(`

                                                                                            `);function Fl(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`correction`,8);Ai();var o=Pl(),s=N(o),c=F(s,!0),l=I(s,2),u=F(l,!0),d=I(l,2),f=e=>{var t=Nl(),r=P(t),i=F(N(r));D(r);var o=I(r,2);J(o,5,()=>(H(a()),V(()=>a().addedGrants)),q,(e,t)=>{var n=Ml(),r=F(N(n),!0);D(n),R(()=>G(r,B(t))),W(e,n)}),D(o),R(e=>G(i,`${e??``}:`),[()=>(H(Z),n(),V(()=>Z(`updatedSetupPatGrants`,n())))]),W(e,t)};K(d,e=>{H(a()),V(()=>a().stage===`final`&&a().addedGrants.length)&&e(f)});var p=I(d,2),m=F(p);D(o),R((e,t,n,r)=>{Y(o,`aria-label`,e),G(c,t),G(u,n),Y(p,`href`,(H(a()),V(()=>a().url))),G(m,`${r??``} ↗`)},[()=>(H(Z),n(),V(()=>Z(`updatedSetupPatTitle`,n()))),()=>(H(Z),n(),V(()=>Z(`updatedSetupPatTitle`,n()))),()=>(H(Z),n(),V(()=>Z(`updatedSetupPatBody`,n()))),()=>(H(Z),n(),V(()=>Z(`updatedSetupPatLink`,n())))]),W(e,o),Je(),i()}var Il=U(`

                                                                                            `),Ll=U(`

                                                                                            `),Rl=U(`

                                                                                            `),zl=U(` `),Bl=U(`

                                                                                            `),Vl=U(`
                                                                                          • `),Hl=U(`
                                                                                              `),Ul=U(`

                                                                                              `),Wl=U(`
                                                                                              `),Gl=U(`copilot doctor --read-only`),Kl=U(`

                                                                                              `);function ql(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=j(),s=j(),c=j(),l=j(),u=j(),d=j(),f=j(),p=j(),m=X(t,`management`,8,!1),h=X(t,`batch`,8,!1),g=X(t,`outcome`,8),_=X(t,`controller`,8),v=X(t,`onClose`,8),y=X(t,`onDoctor`,8,async()=>void 0),b=X(t,`doctor`,8,void 0),x=X(t,`detail`,8,void 0),S=X(t,`permissionReport`,8,void 0),C=X(t,`setupPatCorrection`,8,void 0),w={permissions:[`reasonPermissions`,`nextPermissions`],storage:[`reasonStorage`,`nextStorage`],configuration:[`reasonConfiguration`,`nextConfiguration`],"session-expired":[`reasonExpired`,`nextExpired`],cancelled:[`reasonCancelled`,`nextCancelled`],provider:[`reasonProvider`,`nextProvider`],"rate-limit":[`reasonRateLimit`,`nextRateLimit`],unknown:[`reasonUnknown`,`nextUnknown`]};L(()=>H(x()),()=>{M(a,x()?.effects?.some(e=>e.state===`completed`)===!0)}),L(()=>(H(h()),n(),H(m()),H(g()),B(a)),()=>{M(o,h()?Z(`batchNextActions`,n()):m()?ta(n())[g()===`complete`&&B(a)?`finished`:g()===`partial`?`inspectAdjustment`:g()===`complete`?`inspectionFinished`:`inspectionStopped`]:g()===`complete`?Z(`resultApplied`,n()):g()===`dry-run`?Z(`resultNoChanges`,n()):g()===`cancelled`||g()===`blocked`?Z(`resultStopped`,n()):Z(`resultPartial`,n()))}),L(()=>(H(h()),n(),H(m()),H(g()),B(a)),()=>{M(s,h()?Z(`batchResultBody`,n()):m()?ta(n())[g()===`complete`&&B(a)?`finishedBody`:g()===`partial`?`partial`:`inspectionBody`]:g()===`complete`?Z(`resultCompleteBody`,n()):g()===`partial`?Z(`resultPartialBody`,n()):Z(`resultNoChangesBody`,n()))}),L(()=>(H(g()),H(x()),H(S())),()=>{M(c,(g()===`blocked`||g()===`partial`)&&x()?.reasonCode===`permissions`?S():void 0)}),L(()=>B(c),()=>{M(l,B(c)?.checks.some(e=>e.cleanupPending===!0)===!0)}),L(()=>B(c),()=>{M(u,B(c)?.checks.some(e=>e.incident===`secret-collision`)===!0)}),L(()=>(B(c),H(x())),()=>{M(d,B(c)?.role===`workflow`?`reasonWorkflowPermissions`:w[x()?.reasonCode??`unknown`][0])}),L(()=>(H(g()),H(h()),H(x()),B(l),B(u),H(C())),()=>{M(f,(g()===`blocked`||h()&&g()===`partial`)&&x()?.reasonCode===`permissions`&&(h()||x().mutationStarted===!1)&&!B(l)&&!B(u)&&C())}),L(()=>B(c),()=>{M(p,B(c)?B(c).checks.filter(e=>e.applicability===`required`&&e.status!==`verified`&&e.status!==`available`):[])}),En(),Ai();var ee=Kl(),te=N(ee),ne=F(te,!0),re=I(te),ie=F(re,!0),ae=I(re,2),oe=e=>{var t=Rl(),r=N(t),i=N(r),a=F(i),o=I(i);D(r);var s=I(r,2),c=e=>{var t=Il(),r=N(t),i=F(r),a=I(r);D(t),R((e,t)=>{G(i,`${e??``}:`),G(a,` ${t??``}`)},[()=>(H(Z),n(),V(()=>Z(`progress`,n()))),()=>(H(Zi),H(x()),n(),V(()=>Zi(x().stoppedStage,n())))]),W(e,t)};K(s,e=>{H(x()),V(()=>x()?.stoppedStage)&&e(c)});var f=I(s,2),p=N(f),m=F(p),h=I(p);D(f);var _=I(f,2),v=N(_),y=F(v),b=I(v);D(_);var S=I(_,2),C=e=>{var t=Ll(),r=N(t),i=F(r),a=F(I(r,2),!0);D(t),R(e=>{G(i,`${e??``}:`),G(a,(H(x()),V(()=>x().diagnosticRef)))},[()=>(H(Z),n(),V(()=>Z(`diagnosticReference`,n())))]),W(e,t)};K(S,e=>{H(x()),V(()=>x()?.diagnosticRef)&&e(C)}),D(t),R((e,t,n,r,i,s)=>{G(a,`${e??``}:`),G(o,` ${t??``}`),G(m,`${n??``}:`),G(h,` ${r??``}`),G(y,`${i??``}:`),G(b,` ${s??``}`)},[()=>(H(Z),n(),V(()=>Z(`whatHappened`,n()))),()=>(H(Z),B(d),n(),V(()=>Z(B(d),n()))),()=>(H(Z),n(),V(()=>Z(`alreadyChanged`,n()))),()=>(B(u),H(Z),n(),B(l),H(x()),H(g()),V(()=>B(u)?Z(`permissionSecretCollision`,n()):B(l)?Z(`permissionProbeCleanupPending`,n()):x()?.mutationStarted||g()===`partial`?Z(`inspectPartial`,n()):Z(`noChanges`,n()))),()=>(H(Z),n(),V(()=>Z(`nextAction`,n()))),()=>(B(u),H(Z),n(),B(l),H(g()),H(x()),V(()=>B(u)?Z(`permissionSecretCollisionAction`,n()):B(l)?Z(`permissionProbeCleanupAction`,n()):g()===`partial`?`${Z(`inspectPartial`,n())} ${Z(w[x()?.reasonCode??`unknown`][1],n())}`:Z(w[x()?.reasonCode??`unknown`][1],n())))]),W(e,t)};K(ae,e=>{(g()===`blocked`||g()===`cancelled`||g()===`partial`)&&e(oe)});var se=I(ae,2),ce=e=>{var t=Ul(),r=N(t),i=F(r,!0),a=I(r,2),o=F(a,!0),s=I(a,2),l=N(s),u=F(l),d=I(l);D(s);var f=I(s,2),m=e=>{var t=Hl();J(t,5,()=>B(p),q,(e,t)=>{var r=Vl(),i=N(r),a=F(i,!0),o=I(i),s=e=>{var n=zl(),r=F(N(n));D(n),R(()=>G(r,`GitHub · ${B(t),V(()=>B(t).permission)??``}`)),W(e,n)},l=_t(()=>(n(),H($s),B(t),V(()=>n()!==`en`&&$s(n(),B(t).permission)!==B(t).permission)));K(o,e=>{B(l)&&e(s)});var u=I(o),d=I(u),f=F(d,!0),p=I(d),m=e=>{var r=Bl(),i=F(r,!0);R(e=>G(i,e),[()=>(H(bl),B(t),n(),V(()=>bl(B(t),n())))]),W(e,r)};K(p,e=>{B(c),V(()=>B(c).identityStatus===`valid`)&&e(m)}),D(r),R((e,t,n,r)=>{G(a,e),G(u,` — ${t??``} · ${n??``} · `),G(f,r)},[()=>(H($s),n(),B(t),V(()=>$s(n(),B(t).permission))),()=>(H(Qs),n(),B(t),V(()=>Qs(n(),B(t).scope))),()=>(H(Qs),n(),B(t),V(()=>Qs(n(),B(t).level))),()=>(B(c),H(Qs),n(),B(t),H(Z),V(()=>B(c).identityStatus===`valid`?Qs(n(),B(t).status):Z(`permissionGrantNotChecked`,n())))]),W(e,r)}),D(t),W(e,t)},h=e=>{var t=Bl(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`permissionReportNoFailedGrant`,n())))]),W(e,t)};K(f,e=>{B(p),V(()=>B(p).length)?e(m):(B(c),V(()=>B(c).identityStatus===`valid`)&&e(h,1))}),D(t),R((e,n,r,a,s)=>{Y(t,`aria-label`,e),G(i,n),G(o,r),G(u,`${a??``}:`),G(d,` ${s??``}`)},[()=>(H(Z),n(),V(()=>Z(`permissionReportTitle`,n()))),()=>(H(Z),n(),V(()=>Z(`permissionReportTitle`,n()))),()=>(H(Z),n(),V(()=>Z(`permissionReportLead`,n()))),()=>(H(Z),n(),V(()=>Z(`permissionIdentity`,n()))),()=>(H(Z),B(c),n(),V(()=>Z(B(c).identityStatus===`valid`?`permissionIdentityValid`:B(c).identityStatus===`invalid`?`permissionIdentityInvalid`:`permissionIdentityUnknown`,n())))]),W(e,t)};K(se,e=>{B(c)&&e(ce)});var le=I(se,2),ue=e=>{jl(e,{get effects(){return H(x()),V(()=>x().effects)}})};K(le,e=>{H(x()),V(()=>x()?.effects?.length)&&e(ue)});var de=I(le,2),fe=e=>{Fl(e,{get correction(){return C()}})};K(de,e=>{B(f)&&C()&&e(fe)});var pe=I(de,2),me=F(pe,!0),he=I(pe,2),ge=e=>{var t=Bl(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`batchCleanup`,n())))]),W(e,t)};K(he,e=>{h()&&e(ge)});var _e=I(he,2),ve=e=>{var t=Bl(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`botRenewal`,n())))]),W(e,t)};K(_e,e=>{g()===`complete`&&!m()&&!h()&&e(ve)});var ye=I(_e,2),be=e=>{var t=Bl(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`doctorHelp`,n())))]),W(e,t)};K(ye,e=>{!m()&&!h()&&e(be)});var xe=I(ye,2),Se=e=>{var t=Wl(),r=N(t),i=e=>{var t=Bl(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`doctorRunning`,n())))]),W(e,t)},a=e=>{var t=Bl(),r=F(t);R((e,t,n)=>G(r,`${e??``} ${t??``} ${n??``}`),[()=>(H(Z),H(b()),n(),V(()=>Z(b().healthy?`doctorPassed`:`doctorWarnings`,n()))),()=>(H(Z),n(),H(b()),V(()=>Z(`doctorCounts`,n(),{pass:String(b().pass??0),warn:String(b().warn??0),fail:String(b().fail??0),skipped:String(b().skipped??0)}))),()=>(H(Z),n(),V(()=>Z(`doctorSecretLimit`,n())))]),W(e,t)},o=e=>{var t=Bl(),r=F(t,!0);R(e=>G(r,e),[()=>(H(Z),n(),V(()=>Z(`doctorFailed`,n())))]),W(e,t)};K(r,e=>{H(b()),V(()=>b()?.status===`running`)?e(i):(H(b()),V(()=>b()?.status===`complete`)?e(a,1):(H(b()),V(()=>b()?.status===`failed`)&&e(o,2)))});var s=I(r,2),c=e=>{{let t=k(()=>(H(Z),n(),V(()=>Z(`doctorRun`,n()))));qa(e,{get label(){return B(t)},variant:`secondary`,get onClick(){return y()}})}};K(s,e=>{H(_()),H(b()),V(()=>_()&&b()?.status!==`running`&&b()?.status!==`complete`)&&e(c)}),D(t),W(e,t)};K(xe,e=>{g()===`complete`&&!m()&&!h()&&e(Se)});var Ce=I(xe,2),we=N(Ce),T=F(we,!0),Te=I(we),E=e=>{W(e,Gl())};K(Te,e=>{h()||e(E)}),D(Ce);var Ee=I(Ce),De=e=>{{let t=k(()=>(H(Z),n(),V(()=>Z(`closeSession`,n()))));qa(e,{get label(){return B(t)},get onClick(){return v()}})}};K(Ee,e=>{_()&&e(De)}),D(ee),ri(ee,(e,t)=>ol?.(e,t),()=>1),R((e,t)=>{G(ne,g()===`complete`?`✓`:`!`),G(ie,B(o)),G(me,e),G(T,t)},[()=>(B(u),H(Z),n(),B(l),B(s),V(()=>B(u)?Z(`permissionSecretCollision`,n()):B(l)?Z(`permissionProbeCleanupPending`,n()):B(s))),()=>(H(Z),n(),V(()=>Z(`patSettings`,n())))]),W(e,ee),Je(),i()}var Jl=U(`

                                                                                              `);function Yl(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`effects`,8,void 0);Ai();var o=Jl(),s=I(N(o)),c=F(s,!0),l=I(s),u=F(l,!0),d=I(l),f=e=>{jl(e,{get effects(){return a()}})};K(d,e=>{H(a()),V(()=>a()?.length)&&e(f)}),D(o),R((e,t)=>{G(c,e),G(u,t)},[()=>(H(Z),n(),V(()=>Z(`working`,n()))),()=>(H(Z),n(),V(()=>Z(`workingBody`,n())))]),W(e,o),Je(),i()}var Xl={en:{title:`Checking PAT access`,lead:`Each permission is checked separately. Temporary test resources are removed after verification.`,pending:`Waiting`,checking:`Checking read access`,creating:`Creating temporary resource`,reading:`Reading temporary resource`,deleting:`Removing temporary resource`,verified:`Verified`,failed:`Needs attention`,skipped:`Checked after plan approval if required`},es:{title:`Comprobando el acceso del PAT`,lead:`Cada permiso se comprueba por separado. Los recursos temporales se eliminan tras verificarlos.`,pending:`Pendiente`,checking:`Comprobando lectura`,creating:`Creando recurso temporal`,reading:`Leyendo recurso temporal`,deleting:`Eliminando recurso temporal`,verified:`Verificado`,failed:`Requiere atención`,skipped:`Se comprobará tras aprobar el plan si es necesario`},fr:{title:`Vérification des accès du PAT`,lead:`Chaque permission est vérifiée séparément. Les ressources temporaires sont supprimées après vérification.`,pending:`En attente`,checking:`Vérification de la lecture`,creating:`Création d’une ressource temporaire`,reading:`Lecture de la ressource temporaire`,deleting:`Suppression de la ressource temporaire`,verified:`Vérifié`,failed:`Intervention nécessaire`,skipped:`Vérifiée après approbation du plan si nécessaire`},pt:{title:`A verificar o acesso do PAT`,lead:`Cada permissão é verificada separadamente. Os recursos temporários são removidos após a verificação.`,pending:`Pendente`,checking:`A verificar a leitura`,creating:`A criar recurso temporário`,reading:`A ler recurso temporário`,deleting:`A remover recurso temporário`,verified:`Verificado`,failed:`Requer atenção`,skipped:`Verificada após a aprovação do plano se necessário`}};function Zl(e,t){return Xl[e][t]}var Ql={en:{unavailable:`The check did not complete. Review the terminal result.`,"cleanup-pending":`Cleanup is unresolved; recovery is required before retrying.`,"secret-collision":`GitHub reported an existing Secret at the random test name. Setup stopped; inspect the GitHub Secret audit trail.`,unsupported:`No isolated probe exists for this permission yet.`},es:{unavailable:`La comprobación no terminó. Revisa el resultado en el terminal.`,"cleanup-pending":`La limpieza está pendiente; hay que recuperarla antes de reintentar.`,"secret-collision":`GitHub encontró un Secret existente con el nombre aleatorio de prueba. El setup se detuvo; revisa el historial del Secret.`,unsupported:`Aún no hay una prueba aislada para este permiso.`},fr:{unavailable:`La vérification n’a pas abouti. Consultez le résultat dans le terminal.`,"cleanup-pending":`Le nettoyage reste à terminer avant de réessayer.`,"secret-collision":`GitHub a trouvé un Secret existant sous le nom de test aléatoire. La configuration s’est arrêtée ; consultez l’historique du Secret.`,unsupported:`Aucun test isolé n’existe encore pour cette permission.`},pt:{unavailable:`A verificação não terminou. Consulte o resultado no terminal.`,"cleanup-pending":`A limpeza está pendente; é necessária recuperação antes de tentar novamente.`,"secret-collision":`O GitHub encontrou um Secret existente com o nome aleatório de teste. A configuração parou; consulte o histórico do Secret.`,unsupported:`Ainda não existe um teste isolado para esta permissão.`}},$l={en:{closed:e=>`Temporary Issue #${e} was closed but could not be deleted. Remove it in GitHub before retrying.`,unresolved:e=>`Temporary Issue #${e} could not be deleted or confirmed closed. Inspect it in GitHub before retrying.`},es:{closed:e=>`El Issue temporal #${e} se cerró, pero no se pudo borrar. Elimínalo en GitHub antes de reintentar.`,unresolved:e=>`No se pudo borrar ni confirmar el cierre del Issue temporal #${e}. Revísalo en GitHub antes de reintentar.`},fr:{closed:e=>`L’Issue temporaire n° ${e} a été fermée mais n’a pas pu être supprimée. Supprimez-la dans GitHub avant de réessayer.`,unresolved:e=>`La suppression et la fermeture de l’Issue temporaire n° ${e} n’ont pas pu être confirmées. Vérifiez-la dans GitHub avant de réessayer.`},pt:{closed:e=>`A Issue temporária n.º ${e} foi fechada, mas não pôde ser eliminada. Elimine-a no GitHub antes de tentar novamente.`,unresolved:e=>`Não foi possível eliminar nem confirmar o fecho da Issue temporária n.º ${e}. Verifique-a no GitHub antes de tentar novamente.`}},eu={en:e=>`GitHub HTTP ${e}`,es:e=>`Error HTTP ${e} de GitHub`,fr:e=>`Erreur HTTP ${e} de GitHub`,pt:e=>`Erro HTTP ${e} do GitHub`};function tu(e,t){let n=yl(t,e);if(n)return n;let r=/^issue-(closed|unresolved)-([1-9][0-9]*)$/u.exec(t);return r?$l[e][r[1]](r[2]):/^http-[1-5][0-9]{2}$/u.test(t)?eu[e](t.slice(5)):t===`unavailable`||t===`cleanup-pending`||t===`secret-collision`||t===`unsupported`?Ql[e][t]:Ql[e].unavailable}var nu=U(` `),ru=U(`
                                                                                            • `),iu=U(`

                                                                                                `);function au(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=j(),o=X(t,`permissions`,8);function s(e){return o().progress?.filter(t=>t.requirementId===e).at(-1)}L(()=>H(o()),()=>{M(a,o().progress?.at(-1))}),En(),Ai();var c=iu(),l=N(c),u=F(l,!0),d=I(l,2),f=F(d,!0),p=I(d,2),m=N(p),h=e=>{var t=Mr();R((e,n)=>G(t,`${e??``}: ${n??``}`),[()=>(H($s),n(),H(o()),B(a),V(()=>$s(n(),o().requirements?.find(e=>e.id===B(a).requirementId)?.permission??B(a).requirementId))),()=>(H(Zl),n(),B(a),V(()=>Zl(n(),B(a).phase)))]),W(e,t)};K(m,e=>{B(a)&&e(h)}),D(p);var g=I(p,2);J(g,5,()=>(H(o()),V(()=>o().requirements??[])),e=>e.id,(e,t)=>{let r=k(()=>(B(t),V(()=>s(B(t).id))));var i=ru();let a;var o=N(i),c=F(o,!0),l=I(o,2),u=N(l),d=F(u,!0),f=I(u),p=F(f),m=I(f),h=e=>{var t=nu(),i=F(t,!0);R(e=>G(i,e),[()=>(H(tu),n(),H(B(r)),V(()=>tu(n(),B(r).detail)))]),W(e,t)};K(m,e=>{H(B(r)),V(()=>B(r)?.phase===`failed`&&B(r).detail)&&e(h)}),D(l);var g=F(I(l,2),!0);D(i),R((e,t,n,o)=>{a=li(i,1,``,null,a,{"permission-progress-done":B(r)?.phase===`verified`,"permission-progress-failed":B(r)?.phase===`failed`}),G(c,(H(B(r)),V(()=>B(r)?.phase===`verified`?`✓`:B(r)?.phase===`failed`?`!`:B(r)?`◌`:`·`))),G(d,e),G(p,`${t??``} · ${n??``}`),G(g,o)},[()=>(H($s),n(),B(t),V(()=>$s(n(),B(t).permission))),()=>(H(Qs),n(),B(t),V(()=>Qs(n(),B(t).scope))),()=>(H(Qs),n(),B(t),V(()=>Qs(n(),B(t).level))),()=>(H(Zl),n(),H(B(r)),V(()=>Zl(n(),B(r)?.phase??`pending`)))]),W(e,i)}),D(g),D(c),R((e,t)=>{G(u,e),G(f,t)},[()=>(H(Zl),n(),V(()=>Zl(n(),`title`))),()=>(H(Zl),n(),V(()=>Zl(n(),`lead`)))]),W(e,c),Je(),i()}function ou(e,t){return!t&&/^[A-Fa-f0-9]{16}$/u.test(e.trim())}var su=U(`

                                                                                                `);function cu(e,t){O(t,!1);let n=()=>Ri(Q,`$setupLocale`,r),[r,i]=zi(),a=X(t,`busy`,8),o=X(t,`onPair`,8),s=X(t,`mode`,8,`pair`),c=j(``),l=j();async function u(){if(!ou(B(c),a()))return;let e=B(c).trim();M(c,``),await o()(e),await mr(),B(l)?.isConnected&&!B(l).disabled&&B(l).focus()}Ai();var d=su(),f=N(d),p=F(N(f),!0);D(f);var m=I(f,2),h=F(N(m),!0);D(m);var g=I(m,2),_=F(g,!0),v=I(g,2),y=N(v),b=F(y,!0),x=I(y,2);bi(x),ki(x,e=>M(l,e),()=>B(l));var S=I(x,2),C=F(S,!0),w=I(S,2),ee=N(w);{let e=k(()=>(H(Z),H(s()),n(),V(()=>Z(s()===`pair`?`pairButton`:`takeOver`,n())))),t=k(()=>(H(ou),B(c),H(a()),V(()=>!ou(B(c),a()))));qa(ee,{get label(){return B(e)},arrow:!0,onClick:u,get disabled(){return B(t)}})}D(w),D(v),D(d),R((e,t,n,r,i,o,s)=>{Y(d,`aria-label`,e),G(p,t),G(h,n),G(_,r),G(b,i),x.disabled=a(),Y(x,`placeholder`,o),G(C,s)},[()=>(H(Z),H(s()),n(),V(()=>Z(s()===`pair`?`pairTitle`:`takeOver`,n()))),()=>(H(Z),n(),V(()=>Z(`privateSession`,n()))),()=>(H(Z),H(s()),n(),V(()=>Z(s()===`pair`?`pairTitle`:`takeOver`,n()))),()=>(H(Z),H(s()),n(),V(()=>Z(s()===`pair`?`pairBody`:`readOnlyBody`,n()))),()=>(H(Z),n(),V(()=>Z(`pairLabel`,n()))),()=>(H(Z),n(),V(()=>Z(`pairPlaceholder`,n()))),()=>(H(Z),n(),V(()=>Z(`pairHelp`,n())))]),Sr(`submit`,v,e=>{e.preventDefault(),u()}),Ti(x,()=>B(c),e=>M(c,e)),W(e,d),Je(),i()}var lu={"Could not close the local session. Check the terminal before trying again.":`The local session could not be confirmed closed. The result is retained. Check the terminal before trying again.`,"The local setup session is unavailable.":`The local setup session is unavailable. Check the terminal; you may need to restart setup.`,"Connection lost. The CLI may have stopped. Check the terminal before trying again.":`Connection lost. The CLI may have stopped. Check the terminal before trying again.`,"Could not join this local session.":`Could not join this local session. Check the terminal and pair again.`,"Could not connect to the local setup session. Check the terminal and pair again.":`Could not connect to the local setup session. Check the terminal and pair again.`,"Pairing was rejected.":`Pairing was rejected. Check the code in the launching terminal.`,"Invalid local pairing response.":`The local pairing response was invalid. Restart setup from the terminal.`,"Could not pair this browser.":`Could not pair this browser. Check the terminal and try again.`,"The request was rejected.":`The local request was rejected. Refresh the page and check the terminal.`,"Could not submit this answer.":`Could not submit this answer. Refresh the page and try again.`,"Cancellation failed.":`Cancellation failed. Check whether setup has already started applying before closing.`,"Takeover failed.":`Could not take control. Re-enter the pairing code from the launching terminal.`,"Invalid local host or request context.":`The local request context was rejected. Open the exact URL printed in the terminal.`,"Invalid request origin.":`The request came from another origin. Open the exact local URL printed in the terminal.`,"JSON required.":`The local request format was invalid. Refresh the page and try again.`,"Too many pairing attempts. Restart setup.":`Too many incorrect pairing attempts. Restart setup from the terminal.`,"Too many pairing attempts. Wait 30 seconds and retry.":`Too many incorrect pairing attempts. Wait 30 seconds and try the code again; terminal setup remains available.`,"Incorrect pairing code. Check the terminal.":`Incorrect pairing code. Check the launching terminal.`,"Incorrect pairing code. Check the launching output.":`Incorrect pairing code. Check the launching output.`,"Pair this browser using the code printed by the CLI.":`Pair this browser using the code printed by the CLI.`,"This tab is read-only.":`This tab is read-only. Enter the pairing code again to take control.`,"Invalid answer.":`The answer was invalid. Review the current question and try again.`,"Control moved to another tab.":`Control moved to another tab. This tab is now read-only.`,"This question changed. Refresh the current state.":`This question changed. Refresh the page before answering again.`,"This setup has already started applying or ended.":`Setup has already started applying or ended. Inspect the current result before retrying.`,"Only the controller can close a finished session.":`Only the controlling tab can close this finished session.`,"Method not allowed.":`This local request is not allowed. Refresh the page.`,"Not found.":`The requested local page was not found. Open the URL printed in the terminal.`,"Invalid local request.":`The local request was invalid. Refresh the page and try again.`,"Body too large.":`The submitted answer is too large. Shorten it and try again.`,"JSON object required.":`The local request format was invalid. Refresh the page and try again.`,"Could not retry discovery.":`Could not refresh the GitHub suggestions. Retry or use verified manual entry.`,"Could not return to the previous question.":`Could not return to the previous question. Refresh the page and try again.`,"Invalid question revision.":`The question changed. Refresh the page before going back.`,"No earlier question is available here.":`There is no earlier question in this stage. Continue or return to the plan review.`,"Read-only verification failed.":`Read-only verification failed. Check the terminal and retry once.`,"Read-only verification failed. Check the terminal.":`Read-only verification failed. Check the terminal and retry once.`,"Read-only verification is unavailable or already running.":`Read-only verification is unavailable or already running. Check the current result before retrying.`},uu={en:lu,es:{"Could not close the local session. Check the terminal before trying again.":`No se ha podido confirmar el cierre de la sesión local. El resultado se conserva. Consulta la terminal antes de volver a intentarlo.`,"The local setup session is unavailable.":`La sesión local no está disponible. Revisa la terminal; quizá debas reiniciar la configuración.`,"Connection lost. The CLI may have stopped. Check the terminal before trying again.":`Se perdió la conexión. Es posible que el CLI se haya detenido. Revisa la terminal antes de reintentar.`,"Could not join this local session.":`No se pudo acceder a esta sesión local. Revisa la terminal y vuelve a vincular el navegador.`,"Could not connect to the local setup session. Check the terminal and pair again.":`No se pudo conectar con la sesión local. Revisa la terminal y vuelve a vincular el navegador.`,"Pairing was rejected.":`Se rechazó la vinculación. Comprueba el código en la terminal que inició el proceso.`,"Invalid local pairing response.":`La respuesta de vinculación local no es válida. Reinicia la configuración desde la terminal.`,"Could not pair this browser.":`No se pudo vincular este navegador. Revisa la terminal y vuelve a intentarlo.`,"The request was rejected.":`Se rechazó la petición local. Actualiza la página y revisa la terminal.`,"Could not submit this answer.":`No se pudo enviar la respuesta. Actualiza la página y vuelve a intentarlo.`,"Cancellation failed.":`No se pudo cancelar. Comprueba si ya se han empezado a aplicar cambios antes de cerrar.`,"Takeover failed.":`No se pudo tomar el control. Vuelve a introducir el código de la terminal inicial.`,"Invalid local host or request context.":`Se rechazó el contexto de la petición local. Abre la URL exacta que aparece en la terminal.`,"Invalid request origin.":`La petición llegó desde otro origen. Abre la URL local exacta de la terminal.`,"JSON required.":`El formato de la petición local no es válido. Actualiza la página y reinténtalo.`,"Too many pairing attempts. Restart setup.":`Demasiados intentos de vinculación fallidos. Reinicia la configuración desde la terminal.`,"Too many pairing attempts. Wait 30 seconds and retry.":`Demasiados intentos de vinculación fallidos. Espera 30 segundos y vuelve a probar el código; puedes seguir con el setup en la terminal.`,"Incorrect pairing code. Check the terminal.":`Código de vinculación incorrecto. Comprueba la terminal inicial.`,"Incorrect pairing code. Check the launching output.":`Código de vinculación incorrecto. Comprueba la salida de inicio.`,"Pair this browser using the code printed by the CLI.":`Vincula este navegador con el código mostrado por el CLI.`,"This tab is read-only.":`Esta pestaña es de solo lectura. Introduce otra vez el código para tomar el control.`,"Invalid answer.":`La respuesta no es válida. Revisa la pregunta actual e inténtalo de nuevo.`,"Control moved to another tab.":`El control pasó a otra pestaña. Esta ahora es de solo lectura.`,"This question changed. Refresh the current state.":`La pregunta cambió. Actualiza la página antes de volver a responder.`,"This setup has already started applying or ended.":`La configuración ya empezó a aplicarse o terminó. Revisa el resultado antes de reintentar.`,"Only the controller can close a finished session.":`Solo la pestaña que tiene el control puede cerrar esta sesión finalizada.`,"Method not allowed.":`Esta petición local no está permitida. Actualiza la página.`,"Not found.":`No se encontró la página local solicitada. Abre la URL de la terminal.`,"Invalid local request.":`La petición local no es válida. Actualiza la página y reinténtalo.`,"Body too large.":`La respuesta enviada es demasiado larga. Acórtala y reinténtalo.`,"JSON object required.":`El formato de la petición local no es válido. Actualiza la página y reinténtalo.`,"Could not retry discovery.":`No se pudieron actualizar las sugerencias de GitHub. Reinténtalo o introduce datos verificados manualmente.`,"Could not return to the previous question.":`No se pudo volver a la pregunta anterior. Actualiza la página y reinténtalo.`,"Invalid question revision.":`La pregunta cambió. Actualiza la página antes de volver atrás.`,"No earlier question is available here.":`No hay una pregunta anterior en esta etapa. Continúa o vuelve a revisar el plan.`,"Read-only verification failed.":`Falló la comprobación de solo lectura. Revisa la terminal y vuelve a intentarlo una vez.`,"Read-only verification failed. Check the terminal.":`Falló la comprobación de solo lectura. Revisa la terminal y vuelve a intentarlo una vez.`,"Read-only verification is unavailable or already running.":`La comprobación de solo lectura no está disponible o ya se está ejecutando. Revisa el resultado antes de reintentar.`},fr:{"Could not close the local session. Check the terminal before trying again.":`La fermeture de la session locale n’a pas pu être confirmée. Le résultat est conservé. Consultez le terminal avant de réessayer.`,"The local setup session is unavailable.":`La session locale est indisponible. Vérifiez le terminal ; vous devrez peut-être relancer la configuration.`,"Connection lost. The CLI may have stopped. Check the terminal before trying again.":`Connexion perdue. Le CLI s’est peut-être arrêté. Vérifiez le terminal avant de réessayer.`,"Could not join this local session.":`Impossible de rejoindre cette session locale. Vérifiez le terminal et associez de nouveau le navigateur.`,"Could not connect to the local setup session. Check the terminal and pair again.":`Impossible de se connecter à la session locale. Vérifiez le terminal et associez de nouveau le navigateur.`,"Pairing was rejected.":`L’association a été refusée. Vérifiez le code dans le terminal de lancement.`,"Invalid local pairing response.":`La réponse d’association locale est invalide. Relancez la configuration depuis le terminal.`,"Could not pair this browser.":`Impossible d’associer ce navigateur. Vérifiez le terminal et réessayez.`,"The request was rejected.":`La demande locale a été refusée. Actualisez la page et vérifiez le terminal.`,"Could not submit this answer.":`Impossible d’envoyer cette réponse. Actualisez la page et réessayez.`,"Cancellation failed.":`Annulation impossible. Vérifiez si des changements ont déjà commencé avant de fermer.`,"Takeover failed.":`Impossible de prendre le contrôle. Ressaisissez le code du terminal de lancement.`,"Invalid local host or request context.":`Le contexte de la demande locale a été refusé. Ouvrez l’URL exacte affichée dans le terminal.`,"Invalid request origin.":`La demande vient d’une autre origine. Ouvrez l’URL locale exacte du terminal.`,"JSON required.":`Le format de la demande locale est invalide. Actualisez la page et réessayez.`,"Too many pairing attempts. Restart setup.":`Trop de tentatives d’association incorrectes. Relancez la configuration depuis le terminal.`,"Too many pairing attempts. Wait 30 seconds and retry.":`Trop de tentatives d’association incorrectes. Attendez 30 secondes puis ressaisissez le code ; la configuration par terminal reste disponible.`,"Incorrect pairing code. Check the terminal.":`Code d’association incorrect. Vérifiez le terminal de lancement.`,"Incorrect pairing code. Check the launching output.":`Code d’association incorrect. Vérifiez la sortie de lancement.`,"Pair this browser using the code printed by the CLI.":`Associez ce navigateur avec le code affiché par le CLI.`,"This tab is read-only.":`Cet onglet est en lecture seule. Ressaisissez le code pour prendre le contrôle.`,"Invalid answer.":`La réponse est invalide. Revoyez la question actuelle et réessayez.`,"Control moved to another tab.":`Le contrôle est passé à un autre onglet. Celui-ci est maintenant en lecture seule.`,"This question changed. Refresh the current state.":`La question a changé. Actualisez la page avant de répondre de nouveau.`,"This setup has already started applying or ended.":`La configuration est déjà en cours d’application ou terminée. Inspectez le résultat avant de réessayer.`,"Only the controller can close a finished session.":`Seul l’onglet qui détient le contrôle peut fermer cette session terminée.`,"Method not allowed.":`Cette demande locale n’est pas autorisée. Actualisez la page.`,"Not found.":`La page locale demandée est introuvable. Ouvrez l’URL affichée dans le terminal.`,"Invalid local request.":`La demande locale est invalide. Actualisez la page et réessayez.`,"Body too large.":`La réponse envoyée est trop longue. Raccourcissez-la et réessayez.`,"JSON object required.":`Le format de la demande locale est invalide. Actualisez la page et réessayez.`,"Could not retry discovery.":`Impossible d’actualiser les suggestions GitHub. Réessayez ou saisissez des données vérifiées manuellement.`,"Could not return to the previous question.":`Impossible de revenir à la question précédente. Actualisez la page et réessayez.`,"Invalid question revision.":`La question a changé. Actualisez la page avant de revenir en arrière.`,"No earlier question is available here.":`Il n’y a pas de question précédente à cette étape. Continuez ou revenez à la révision du plan.`,"Read-only verification failed.":`La vérification en lecture seule a échoué. Consultez le terminal et réessayez une fois.`,"Read-only verification failed. Check the terminal.":`La vérification en lecture seule a échoué. Consultez le terminal et réessayez une fois.`,"Read-only verification is unavailable or already running.":`La vérification en lecture seule est indisponible ou déjà en cours. Consultez le résultat avant de réessayer.`},pt:{"Could not close the local session. Check the terminal before trying again.":`Não foi possível confirmar o encerramento da sessão local. O resultado foi preservado. Consulte o terminal antes de tentar novamente.`,"The local setup session is unavailable.":`A sessão local não está disponível. Verifique o terminal; poderá ter de reiniciar a configuração.`,"Connection lost. The CLI may have stopped. Check the terminal before trying again.":`Ligação perdida. O CLI pode ter parado. Verifique o terminal antes de tentar novamente.`,"Could not join this local session.":`Não foi possível entrar nesta sessão local. Verifique o terminal e volte a emparelhar o navegador.`,"Could not connect to the local setup session. Check the terminal and pair again.":`Não foi possível ligar à sessão local. Verifique o terminal e volte a emparelhar o navegador.`,"Pairing was rejected.":`O emparelhamento foi recusado. Confirme o código no terminal de lançamento.`,"Invalid local pairing response.":`A resposta de emparelhamento local é inválida. Reinicie a configuração a partir do terminal.`,"Could not pair this browser.":`Não foi possível emparelhar este navegador. Verifique o terminal e tente novamente.`,"The request was rejected.":`O pedido local foi recusado. Atualize a página e verifique o terminal.`,"Could not submit this answer.":`Não foi possível enviar a resposta. Atualize a página e tente novamente.`,"Cancellation failed.":`Não foi possível cancelar. Confirme se a aplicação das alterações já começou antes de fechar.`,"Takeover failed.":`Não foi possível assumir o controlo. Volte a introduzir o código do terminal de lançamento.`,"Invalid local host or request context.":`O contexto do pedido local foi recusado. Abra o URL exato apresentado no terminal.`,"Invalid request origin.":`O pedido veio de outra origem. Abra o URL local exato do terminal.`,"JSON required.":`O formato do pedido local é inválido. Atualize a página e tente novamente.`,"Too many pairing attempts. Restart setup.":`Demasiadas tentativas incorretas de emparelhamento. Reinicie a configuração no terminal.`,"Too many pairing attempts. Wait 30 seconds and retry.":`Demasiadas tentativas incorretas de emparelhamento. Aguarde 30 segundos e volte a introduzir o código; a configuração no terminal continua disponível.`,"Incorrect pairing code. Check the terminal.":`Código de emparelhamento incorreto. Verifique o terminal de lançamento.`,"Incorrect pairing code. Check the launching output.":`Código de emparelhamento incorreto. Verifique a saída de lançamento.`,"Pair this browser using the code printed by the CLI.":`Emparelhe este navegador com o código apresentado pelo CLI.`,"This tab is read-only.":`Este separador é apenas de leitura. Reintroduza o código para assumir o controlo.`,"Invalid answer.":`A resposta é inválida. Reveja a pergunta atual e tente novamente.`,"Control moved to another tab.":`O controlo passou para outro separador. Este é agora apenas de leitura.`,"This question changed. Refresh the current state.":`A pergunta mudou. Atualize a página antes de voltar a responder.`,"This setup has already started applying or ended.":`A configuração já começou a ser aplicada ou terminou. Inspecione o resultado antes de tentar novamente.`,"Only the controller can close a finished session.":`Só o separador que detém o controlo pode fechar esta sessão terminada.`,"Method not allowed.":`Este pedido local não é permitido. Atualize a página.`,"Not found.":`A página local pedida não foi encontrada. Abra o URL apresentado no terminal.`,"Invalid local request.":`O pedido local é inválido. Atualize a página e tente novamente.`,"Body too large.":`A resposta enviada é demasiado longa. Encurte-a e tente novamente.`,"JSON object required.":`O formato do pedido local é inválido. Atualize a página e tente novamente.`,"Could not retry discovery.":`Não foi possível atualizar as sugestões do GitHub. Tente novamente ou introduza dados verificados manualmente.`,"Could not return to the previous question.":`Não foi possível voltar à pergunta anterior. Atualize a página e tente novamente.`,"Invalid question revision.":`A pergunta mudou. Atualize a página antes de voltar atrás.`,"No earlier question is available here.":`Não há uma pergunta anterior nesta etapa. Continue ou volte à revisão do plano.`,"Read-only verification failed.":`A verificação só de leitura falhou. Consulte o terminal e tente mais uma vez.`,"Read-only verification failed. Check the terminal.":`A verificação só de leitura falhou. Consulte o terminal e tente mais uma vez.`,"Read-only verification is unavailable or already running.":`A verificação só de leitura não está disponível ou já está em curso. Consulte o resultado antes de tentar novamente.`}};function du(e,t){let n=uu[t]??lu;return Object.prototype.hasOwnProperty.call(n,e)?n[e]:Z(`unknownLocalError`,t)}var fu=U(`
                                                                                                `),pu=U(`
                                                                                                `),mu=U(` `,1),hu=U(``),gu=U(`
                                                                                                `,1),_u=U(`
                                                                                                `);function vu(e,t){O(t,!1);let n=()=>Ri(o,`$session`,i),r=()=>Ri(Q,`$setupLocale`,i),[i,a]=zi(),o=Hi();Gr(()=>{let e=Q.subscribe(e=>{document.documentElement.lang=e,document.documentElement.dir=`ltr`,document.title=`Copilot · ${Z(`studio`,e)}`}),t=window.setInterval(()=>{n().paired&&!n().closed&&!n().view?.outcome&&o.poll()},900);return()=>{window.clearInterval(t),e()}});async function s(){window.confirm(Z(n().view?.batch?.phase===`applying`?`batchStopConfirm`:`cancelConfirm`,r()))&&await o.cancel()}async function c(e){let t=n().view?.promptRevision;t!==void 0&&await o.submit(t,e)}async function l(){let e=n().view?.promptRevision;e!==void 0&&await o.retryDiscovery(e)}async function u(){let e=n().view?.promptRevision;e!==void 0&&await o.back(e)}Ai();var d=_u(),f=N(d);{let e=k(()=>n().view?.journey),t=k(()=>n().view?.surface===`management`);la(f,{get journey(){return B(e)},get management(){return B(t)}})}var p=I(f,2),m=N(p);{let e=k(()=>n().view?.repository),t=k(()=>n().closed===!0);_a(m,{get repository(){return B(e)},get closed(){return B(t)}})}var h=I(m,2),g=N(h),_=e=>{{let t=k(()=>Z(`translationPreviewTitle`,r())),n=k(()=>Z(`translationPreviewBody`,r()));Xa(e,{tone:`warning`,get title(){return B(t)},get message(){return B(n)}})}};K(g,e=>{r()!==`en`&&e(_)});var v=I(g,2),y=e=>{za(e,{get view(){return n().view}})};K(v,e=>{n().paired&&n().view?.surface!==`management`&&e(y)});var b=I(v,2),x=e=>{var t=fu(),i=I(N(t));D(t),R(e=>G(i,` ${e??``}`),[()=>Z(`reviewPass`,r(),{pass:String(n().view.journey.choiceReviewPass)})]),W(e,t)};K(b,e=>{n().view?.journey?.choiceReviewPass&&n().view.journey.choiceReviewPass>1&&!n().view.outcome&&e(x)});var S=I(b,2),C=e=>{var t=pu(),n=N(t);{let e=k(()=>Z(`sessionClosed`,r())),t=k(()=>Z(`sessionClosedBody`,r()));Xa(n,{tone:`success`,get title(){return B(e)},get message(){return B(t)}})}D(t),ri(t,(e,t)=>ol?.(e,t),()=>1),R(e=>Y(t,`aria-label`,e),[()=>Z(`sessionClosed`,r())]),W(e,t)};K(S,e=>{n().closed&&e(C)});var w=I(S,2),ee=e=>{var t=mu(),i=P(t);{let e=k(()=>Z(`readOnly`,r())),t=k(()=>Z(`readOnlyBody`,r()));Xa(i,{tone:`warning`,get title(){return B(e)},get message(){return B(t)}})}cu(I(i,2),{mode:`takeover`,get busy(){return n().busy},get onPair(){return o.takeOver}}),W(e,t)};K(w,e=>{!n().closed&&!n().controller&&n().view&&e(ee)});var te=I(w,2),ne=e=>{{let t=k(()=>Z(`attention`,r())),i=k(()=>du(n().error,r()));Xa(e,{tone:`error`,get title(){return B(t)},get message(){return B(i)}})}};K(te,e=>{n().error&&e(ne)});var re=I(te,2),ie=e=>{{let t=k(()=>Z(n().view.message.tone===`success`?`checked`:n().view.message.tone===`warning`?`pleaseNote`:n().view.message.tone===`error`?`attention`:`progressUpdate`,r())),i=k(()=>Na(n().view.message,r()));Xa(e,{get tone(){return n().view.message.tone},get title(){return B(t)},get message(){return B(i)},get link(){return n().view.message.link}})}};K(re,e=>{n().view?.message&&!n().view.outcome&&e(ie)});var ae=I(re,2),oe=e=>{{let t=k(()=>n().view.permissions?.report);Ol(e,{get report(){return B(t)}})}};K(ae,e=>{n().view?.batch&&e(oe)});var se=I(ae,2),ce=e=>{cu(e,{get busy(){return n().busy},get onPair(){return o.pair}})},le=e=>{var t=mu(),r=P(t),i=e=>{Kc(e,{get batch(){return n().view.batch},mode:`closed`,get controller(){return n().controller},get busy(){return n().busy}})};K(r,e=>{n().view.batch&&e(i)});var a=I(r,2);{let e=k(()=>!!n().view.batch),t=k(()=>n().view.surface===`management`),r=k(()=>n().view.permissions?.report);ql(a,{get batch(){return B(e)},get management(){return B(t)},get outcome(){return n().view.outcome},get detail(){return n().view.resultDetail},get permissionReport(){return B(r)},get setupPatCorrection(){return n().view.setupPatCorrection},get doctor(){return n().view.doctor},get controller(){return n().controller},get onDoctor(){return o.runDoctor},get onClose(){return o.close}})}W(e,t)},ue=e=>{var t=gu(),i=P(t),a=N(i);ul(a,{get prompt(){return n().view.prompt},get revision(){return n().view.revision},get promptRevision(){return n().view.promptRevision},get controller(){return n().controller},get busy(){return n().busy},onSubmit:c,onRetryDiscovery:l,onBack:u}),Dl(I(a,2),{get view(){return n().view}}),D(i);var o=I(i,2),d=e=>{var t=hu(),i=F(t,!0);R(e=>{t.disabled=n().busy,G(i,e)},[()=>Z(`cancelSetup`,r())]),Cr(`click`,t,s),W(e,t)};K(o,e=>{n().controller&&n().view.journey?.current!==`Apply`&&e(d)}),W(e,t)},de=e=>{var t=mu(),r=P(t);Kc(r,{get batch(){return n().view.batch},mode:`progress`,get controller(){return n().controller},get busy(){return n().busy},onStop:s});var i=I(r,2),a=e=>{au(e,{get permissions(){return n().view.permissions}})};K(i,e=>{n().view.permissions?.progress?.length&&!n().view.permissions.report&&e(a)}),W(e,t)},fe=e=>{au(e,{get permissions(){return n().view.permissions}})},pe=e=>{{let t=k(()=>n().view?.resultDetail?.effects);Yl(e,{get effects(){return B(t)}})}};K(se,e=>{n().paired?n().view?.outcome?e(le,1):n().view?.prompt?e(ue,2):n().view?.batch?e(de,3):n().view?.permissions?.progress?.length&&!n().view.permissions.report?e(fe,4):e(pe,-1):e(ce)});var me=I(se,2),he=N(me),ge=I(he,2),_e=I(ge,2);D(me),D(h),D(p),D(d),R((e,t,n)=>{G(he,`${e??``} `),G(ge,` ${t??``} `),G(_e,` ${n??``}`)},[()=>Z(`footerLocal`,r()),()=>Z(`footerCloud`,r()),()=>Z(`footerGithub`,r())]),W(e,d),Je(),a()}wr([`click`]),Br(vu,{target:document.getElementById(`app`)}); \ No newline at end of file diff --git a/build/web/assets/index-ERZ4A62w.css b/build/web/assets/index-ERZ4A62w.css new file mode 100644 index 000000000..e093f445e --- /dev/null +++ b/build/web/assets/index-ERZ4A62w.css @@ -0,0 +1 @@ +code.svelte-1spw6vv,bdi.svelte-1spw6vv{overflow-wrap:anywhere}.runner-details.svelte-1spw6vv{margin-block:1rem}.installation-review.svelte-44ckab{min-width:0;margin-block:1.25rem}.routes.svelte-44ckab{padding-inline-start:1.25rem}.routes.svelte-44ckab li:where(.svelte-44ckab){padding-block:.5rem}code.svelte-44ckab,pre.svelte-44ckab,bdi.svelte-44ckab{white-space:pre-wrap;overflow-wrap:anywhere}pre.svelte-44ckab{max-height:28rem;padding:.75rem;font-size:.8rem;overflow:auto}details.svelte-44ckab{margin-block:.75rem}.batch-targets.svelte-17t72gm{gap:1rem;margin-block:1rem;display:grid}.batch-target.svelte-17t72gm{border:1px solid var(--line);border-radius:.8rem;min-width:0;padding:1rem}h3.svelte-17t72gm{overflow-wrap:anywhere;margin-top:0}.target-status.svelte-17t72gm{font-weight:600}pre.svelte-17t72gm{max-height:24rem;padding:.75rem;font-size:.78rem;overflow:auto}code.svelte-17t72gm{overflow-wrap:anywhere}details.svelte-17t72gm{margin-block:.75rem}.batch-buttons.svelte-17t72gm{flex-wrap:wrap;gap:.75rem;display:flex}.batch-technical.svelte-17t72gm{margin-top:1.25rem}fieldset.svelte-1qngno{border:0;min-width:0;margin:1rem 0;padding:0}legend.svelte-1qngno{margin-bottom:.5rem;font-weight:600}.repository-list.svelte-1qngno{gap:.5rem;display:grid}.repository-row.svelte-1qngno{border:1px solid var(--line);border-radius:.75rem;align-items:start;gap:.75rem;padding:.75rem;display:flex}.repository-row.svelte-1qngno input:where(.svelte-1qngno){flex:none;width:auto;margin-top:.25rem}.repository-row.svelte-1qngno span:where(.svelte-1qngno){overflow-wrap:anywhere;min-width:0}.repository-row.svelte-1qngno small:where(.svelte-1qngno){margin-top:.25rem;display:block}.batch-actions.svelte-1qngno{flex-wrap:wrap;align-items:center;gap:.5rem;margin:.75rem 0;display:flex}details.svelte-1qngno{margin:1rem 0}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--page:#f6f8f7;--side:#102423;--side-line:#31504b;--side-text:#e8f5f0;--surface:#fff;--surface-soft:#f3f7f5;--line:#d7e3df;--control-line:#748b82;--text:#18312c;--muted:#58736b;--accent:#176e5e;--accent-strong:#075743;--accent-tint:#dff4e9;--focus:#966000;--warn:#76510d;--warn-bg:#fff6df;--error:#a73434;--error-bg:#fff0ec;--shadow:0 18px 50px #1e403414;font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}:root:not([data-theme=light]){--page:#0d1716;--side:#10201d;--side-line:#294a41;--side-text:#eaf7f1;--surface:#182722;--surface-soft:#20342d;--line:#355247;--control-line:#688f7f;--text:#eaf5ee;--muted:#adccbc;--accent:#7ed6ac;--accent-strong:#a4edc2;--accent-tint:#234b38;--focus:#ffca6a;--warn:#ffdd8a;--warn-bg:#463b21;--error:#ffc0b7;--error-bg:#4a2b2a;--shadow:0 18px 50px #00000024}}:root[data-theme=dark]{--page:#0d1716;--side:#10201d;--side-line:#294a41;--side-text:#eaf7f1;--surface:#182722;--surface-soft:#20342d;--line:#355247;--control-line:#688f7f;--text:#eaf5ee;--muted:#adccbc;--accent:#7ed6ac;--accent-strong:#a4edc2;--accent-tint:#234b38;--focus:#ffca6a;--warn:#ffdd8a;--warn-bg:#463b21;--error:#ffc0b7;--error-bg:#4a2b2a;--shadow:0 18px 50px #00000024}:root[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}body{background:var(--page);color:var(--text);margin:0}button,input,select{font:inherit}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.5}:focus-visible{outline:3px solid var(--focus);outline-offset:3px}.visually-hidden{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}a{color:var(--accent-strong);text-underline-offset:3px}.card,.context-card{background:var(--surface);border:1px solid var(--line);box-shadow:var(--shadow);border-radius:15px}.primary{border:1px solid var(--accent-strong);background:var(--accent-strong);color:var(--side);border-radius:8px;min-height:43px;padding:12px 18px;font-size:12px;font-weight:800}:root[data-theme=light] .primary,:root:not([data-theme=dark]) .primary{color:#fff}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .primary{color:#0d2419}}.primary span{margin-left:18px}.primary:hover:not(:disabled){filter:brightness(1.1)}.secondary{border:1px solid var(--control-line);color:var(--text);background:var(--surface-soft);border-radius:8px;padding:11px 16px;font-size:12px;font-weight:700}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}}.shell{grid-template-columns:minmax(250px,288px) minmax(0,1fr);min-height:100vh;display:grid}.sidebar{background:var(--side);color:var(--side-text);flex-direction:column;min-height:100vh;padding:34px 28px;display:flex;position:sticky;top:0}.brand{letter-spacing:-.035em;align-items:center;gap:13px;display:flex}.brand-mark{color:#0c3021;background:#75d9a0;border-radius:11px;place-items:center;width:37px;height:37px;font-size:26px;line-height:1;display:grid}.brand strong{font-size:23px;line-height:1;display:block}.brand small{letter-spacing:.23em;color:#aac8bd;margin-top:5px;font-size:9px;font-weight:800;display:block}.rail-caption{color:#9dbab0;letter-spacing:.18em;margin-block:78px 22px;margin-inline-start:7px;font-size:10px;font-weight:800}.sidebar .description{color:#afcabe}.steps{margin:0;padding:0;list-style:none;position:relative}.steps:before{content:"";top:22px;bottom:22px;background:var(--side-line);width:1px;position:absolute;inset-inline-start:19px}.steps li{color:#a6c2b7;border-radius:10px;align-items:center;gap:16px;min-height:55px;padding-block:8px;padding-inline:1px 12px;font-size:13px;font-weight:600;display:flex;position:relative}.steps li.current{color:#fff;background:#25443b}.steps li.completed{color:#dbf2e4}.step-index{border:1px solid var(--side-line);background:var(--side);letter-spacing:.04em;border-radius:50%;flex:0 0 37px;place-items:center;height:37px;font-size:11px;font-weight:800;display:grid}.steps .current .step-index{color:#102b1d;background:#80dba8;border-color:#80dba8}.steps .completed .step-index{color:#b9f8c9;background:#204c37;border-color:#45966b;font-size:15px}.sidebar-note{border:1px solid var(--side-line);background:#ffffff09;border-radius:13px;gap:13px;margin-top:auto;padding:19px 16px;display:flex}.sidebar-note>span{color:#8fe1ae;font-size:20px}.sidebar-note strong{font-size:12px}.sidebar-note p{color:#afcabe;margin:6px 0 0;font-size:11px;line-height:1.6}.main{min-width:0}.topbar{border-bottom:1px solid var(--line);background:var(--surface);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;min-height:80px;padding:20px clamp(24px,4vw,70px);display:flex}.breadcrumb{flex:240px;align-items:center;gap:12px;min-width:0;font-size:12px;display:flex}.breadcrumb span:first-child{color:var(--muted);letter-spacing:.14em;font-size:10px;font-weight:800}.breadcrumb span:nth-child(2){color:var(--muted)}.breadcrumb strong{white-space:normal;overflow-wrap:anywhere;min-width:0;line-height:1.5}.top-actions{flex-shrink:0;align-items:center;gap:18px;display:flex}.local-pill{color:var(--accent-strong);background:var(--accent-tint);letter-spacing:.08em;white-space:nowrap;border-radius:6px;padding:8px 11px;font-size:10px;font-weight:800}.pulse-dot{background:currentColor;border-radius:50%;width:6px;height:6px;margin-right:5px;display:inline-block}.theme-switch{border:1px solid var(--line);background:var(--surface-soft);border-radius:8px;padding:3px;display:flex}.theme-switch button{color:var(--muted);background:0 0;border:0;border-radius:5px;min-width:31px;height:27px;font-size:11px}.theme-switch button.active{background:var(--surface);color:var(--text);font-weight:800;box-shadow:0 1px 4px #0000001f}.content{max-width:1320px;margin:0 auto;padding:52px clamp(24px,4vw,70px) 35px}.eyebrow{color:var(--accent-strong);letter-spacing:.18em;align-items:center;gap:10px;font-size:10px;font-weight:900;display:flex}.eyebrow-line{background:var(--accent);width:21px;height:2px}.eyebrow-count{color:var(--muted);letter-spacing:.09em;margin-inline-start:8px}h1{letter-spacing:-.045em;max-width:860px;margin:15px 0 13px;font-size:clamp(30px,3vw,45px);line-height:1.15}.lede{color:var(--muted);max-width:700px;margin:0 0 30px;font-size:14px;line-height:1.65}.workspace-grid{grid-template-columns:minmax(0,1.65fr) minmax(230px,.8fr);align-items:start;gap:19px;display:grid}.workspace-grid:has(.plan-review){grid-template-columns:1fr}.workspace-grid:has(.plan-review) .context-column{grid-template-columns:repeat(2,minmax(0,1fr))}.context-column{gap:17px;display:grid}.context-card{box-shadow:none;padding:25px}.context-icon{background:var(--accent-tint);width:32px;height:32px;color:var(--accent-strong);border-radius:8px;place-items:center;font-size:19px;display:grid}.context-card h2{letter-spacing:-.015em;margin:17px 0 7px;font-size:14px}.context-card p,.context-card>small{color:var(--muted);margin:0 0 12px;font-size:12px;line-height:1.65;display:block}.context-card code{background:var(--surface-soft);overflow-wrap:anywhere;border-radius:6px;padding:10px;font-size:11px;display:block}.permissions ul{margin:8px 0 13px;padding:0;list-style:none}.permissions li{border-bottom:1px solid var(--line);justify-content:space-between;gap:10px;padding:9px 0;font-size:11px;display:flex}.permissions li small{color:var(--muted);margin-top:3px;display:block}.permissions li strong{color:var(--accent-strong);text-transform:uppercase;font-size:9px}.permission-progress{padding:clamp(20px,4vw,38px)}.permission-progress h2{margin:0 0 8px}.permission-progress p{color:var(--muted);line-height:1.5}.permission-progress ol{margin:20px 0 0;padding:0;list-style:none}.permission-progress li{border-top:1px solid var(--line);align-items:center;gap:14px;padding:12px 0;display:flex}.permission-progress li>span:nth-child(2){flex:1;min-width:0}.permission-progress li small{color:var(--muted);overflow-wrap:anywhere;display:block}.permission-progress-symbol{background:var(--surface-soft);border-radius:50%;flex:none;place-items:center;width:30px;height:30px;display:grid}.permission-progress-done .permission-progress-symbol{color:var(--accent-strong)}.permission-progress-failed .permission-progress-symbol{color:var(--danger,#a33)}.permission-progress-state{text-align:right;max-width:35%;font-size:.8rem;font-weight:600}@media (width<=600px){.permission-progress li{flex-wrap:wrap;align-items:flex-start}.permission-progress-state{text-align:left;max-width:none;margin-left:44px}}footer{color:var(--muted);opacity:.85;letter-spacing:.11em;margin-top:40px;font-size:9px;font-weight:700}footer span{margin:0 8px}[dir=rtl] .context-card code,[dir=rtl] .result-links code,[dir=rtl] .producer-option strong,[dir=rtl] .producer-option small,[dir=rtl] input[type=password]{direction:ltr;unicode-bidi:isolate}.decision-card{min-height:360px;padding:clamp(25px,3vw,40px)}.card-header{justify-content:space-between;align-items:center;gap:12px;margin-bottom:29px;display:flex}.card-kicker{color:var(--accent-strong);letter-spacing:.17em;font-size:10px;font-weight:900}.revision{color:var(--muted);letter-spacing:.08em;font-size:10px}.description{white-space:pre-line;color:var(--muted);margin-top:0;font-size:13px;line-height:1.65}.question-heading{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;margin-bottom:15px;display:flex}.question-heading h2,.decision-card>label{margin:0 0 10px;font-size:15px;font-weight:700;line-height:1.4;display:block}.phase-tag{color:var(--accent-strong);background:var(--accent-tint);letter-spacing:.07em;border-radius:5px;padding:6px 8px;font-size:9px;font-weight:900}input[type=text],input[type=password],input[type=number],select{border:1px solid var(--control-line);background:var(--surface-soft);width:100%;min-height:46px;color:var(--text);border-radius:8px;padding:10px 13px}textarea{resize:vertical;border:1px solid var(--control-line);background:var(--surface-soft);width:100%;min-height:120px;color:var(--text);font:inherit;border-radius:8px;padding:12px 13px;line-height:1.5}.language-switch{color:var(--muted);white-space:nowrap;align-items:center;gap:7px;font-size:11px;font-weight:700;display:flex}.language-switch select{width:auto;max-width:140px;min-height:32px;padding:5px 8px;font-size:11px}.question-details{border:1px solid var(--line);background:var(--surface-soft);border-radius:8px;margin-bottom:20px;padding:13px 15px;font-size:12px}.question-details summary{cursor:pointer;color:var(--accent-strong);font-weight:800}.question-details dl{grid-template-columns:minmax(90px,130px) minmax(0,1fr);gap:10px 14px;margin:14px 0 0;line-height:1.55;display:grid}.question-details dt{color:var(--text);font-weight:750}.question-details dd{color:var(--muted);margin:0}.question-help-link{margin:-12px 0 18px;font-size:12px;font-weight:700}.discovery-actions{flex-wrap:wrap;align-items:center;gap:8px 14px;margin:4px 0 16px;display:flex}.discovery-actions .field-help{margin:0}.secondary-button{border:1px solid var(--control-line);background:var(--surface-soft);color:var(--accent-strong);font:inherit;border-radius:8px;padding:9px 13px;font-size:12px;font-weight:750}.secondary-button:hover:not(:disabled),.secondary-button:focus-visible{border-color:var(--accent);background:var(--accent-tint)}.secondary-button:disabled{opacity:.55;cursor:not-allowed}.status-review-list{color:var(--muted);margin:6px 0 18px;padding-inline-start:20px;font-size:12px;line-height:1.7}.status-review-list strong{color:var(--text)}.producer-grid{margin-bottom:20px;padding:6px}.check-option.producer-option{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:16px;padding:14px 16px;display:grid}.producer-option>label{cursor:pointer;align-items:flex-start;gap:12px;min-width:0;display:flex}.producer-option>label>input{flex:0 0 17px;margin:3px 0 0}.producer-option>label>span{overflow-wrap:anywhere;gap:5px;min-width:0;display:grid}.producer-option small{color:var(--muted);font-size:10px;line-height:1.5}.producer-option a{font-size:11px;line-height:1.5}.producer-option>a{max-width:140px}.producer-links{gap:8px;max-width:140px;display:grid}.producer-manual-fields{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;display:grid}.producer-manual-fields>label,.project-manual-field{gap:8px;font-size:12px;font-weight:700;line-height:1.5;display:grid}.producer-manual-fields>label:last-child{grid-column:1/-1}.producer-add{margin-top:16px}.project-manual-field{margin-top:20px}input[type=checkbox]{accent-color:var(--accent);width:17px;height:17px}.field-help{color:var(--muted);margin:14px 0 24px;font-size:12px;line-height:1.6}.segmented{gap:9px;display:flex}.segmented button{border:1px solid var(--control-line);color:var(--text);background:var(--surface-soft);border-radius:8px;flex:1;padding:13px;font-weight:700}.segmented button.selected{border-color:var(--accent);background:var(--accent-tint);color:var(--accent-strong)}.check-grid{gap:10px;display:grid}.check-option{background:var(--surface-soft);border:1px solid var(--control-line);border-radius:7px;align-items:center;gap:10px;padding:10px 13px;font-size:12px;display:flex}.choice-list{gap:9px;display:grid}.choice-card{text-align:left;background:var(--surface-soft);width:100%;min-height:52px;color:var(--text);border:1px solid var(--control-line);border-radius:8px;justify-content:space-between;align-items:center;padding:13px 15px;font-size:13px;font-weight:650;display:flex}.choice-card:hover:not(:disabled){border-color:var(--accent);background:var(--accent-tint)}.github-link{background:var(--accent-tint);border:1px solid var(--accent);border-radius:8px;margin:0 0 12px;padding:14px;font-size:13px;font-weight:800;text-decoration:none;display:block}.github-link span{float:right}.plan-review{gap:24px;font-size:12px;line-height:1.65;display:grid}.plan-review>.description,.plan-review .field-help{margin:0}.plan-sections{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:16px;display:grid}.plan-decisions,.plan-inventory,.plan-warnings{background:var(--surface-soft);border:1px solid var(--line);border-radius:8px;min-width:0;padding:20px}.plan-decisions h3,.plan-warnings h3{margin:0 0 14px;font-size:13px;line-height:1.5}.plan-decisions p{margin:0 0 16px}.plan-decisions>:last-child{margin-bottom:0}.plan-decisions dl{gap:0;margin:0;display:grid}.plan-decisions dl>div{border-bottom:1px solid var(--line);grid-template-columns:minmax(130px,35%) minmax(0,1fr);gap:20px;padding:12px 0;display:grid}.plan-decisions dl>div:first-child{padding-top:0}.plan-decisions dl>div:last-child{border-bottom:0;padding-bottom:0}.plan-decisions dt{color:var(--muted)}.plan-decisions dd{overflow-wrap:anywhere;min-width:0;margin:0}.plan-decisions .field-help{margin-top:20px}.plan-decisions ul,.plan-inventory ul,.plan-warnings ul{overflow-wrap:anywhere;margin:0;padding-inline-start:20px;font-size:12px;line-height:1.7}.plan-decisions li+li,.plan-inventory li+li,.plan-warnings li+li{margin-top:6px}.plan-inventory summary{cursor:pointer;font-size:13px;font-weight:750}.plan-inventory summary span:last-child{float:right;color:var(--accent-strong);margin-inline-start:12px}.plan-inventory[open] summary{margin-bottom:16px}.plan-warnings{color:var(--warn);background:var(--warn-bg)}.plan-edit{border-top:1px solid var(--line);padding-top:24px}.plan-edit h3{margin:0 0 4px;font-size:14px}.plan-edit-actions{flex-wrap:wrap;gap:10px;margin-top:16px;display:flex}.button-row{flex-wrap:wrap;align-items:center;gap:12px;margin-top:24px;display:flex}.button-row>.primary{margin-left:auto}.plan-review>.button-row{border-top:1px solid var(--line);margin-top:0;padding-top:24px}.review-pass,.banner{white-space:pre-line;border-radius:8px;margin:0 0 20px;padding:14px 18px;font-size:12px;line-height:1.5}.review-pass{color:var(--accent-strong);background:var(--accent-tint);border:1px solid var(--accent)}.review-pass span{margin-inline-end:8px;font-weight:800}.banner{background:var(--surface-soft);border:1px solid var(--line)}.banner p{margin:5px 0 0}.banner.warning{color:var(--warn);background:var(--warn-bg);border-color:var(--warn)}.banner.error{color:var(--error);background:var(--error-bg);border-color:var(--error)}.banner.success{color:var(--accent-strong);background:var(--accent-tint);border-color:var(--accent)}.banner button{margin-top:12px}.cancel-link{color:var(--muted);background:0 0;border:0;margin-top:18px;padding:5px 0;font-size:12px;text-decoration:underline}.result-card,.waiting-card{max-width:750px;padding:36px}.result-icon{background:var(--accent-tint);width:43px;height:43px;color:var(--accent-strong);border-radius:50%;place-items:center;font-size:22px;display:grid}.result-card h2,.waiting-card h2{margin:18px 0 10px;font-size:21px}.result-card p,.waiting-card p{color:var(--muted);font-size:13px;line-height:1.6}.result-facts{border:1px solid var(--line);background:var(--surface-soft);border-radius:8px;margin:24px 0;padding:20px}.result-facts p{margin:8px 0}.result-facts strong{color:var(--text)}.result-effects{border:1px solid var(--line);background:var(--surface-soft);border-radius:8px;margin:20px 0;padding:14px 17px}.result-effects h3{color:var(--text);margin:0 0 10px;font-size:13px}.result-effects ul{margin:0;padding-left:20px}.result-effects li{overflow-wrap:anywhere;padding:3px 0;font-size:12px}.result-links{flex-wrap:wrap;align-items:center;gap:20px;margin:22px 0;font-size:12px;display:flex}.result-links code{background:var(--surface-soft);border-radius:5px;padding:8px}.spinner{border:3px solid var(--line);border-top-color:var(--accent);border-radius:50%;width:25px;height:25px;animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.result-facts h3{margin:0 0 16px;font-size:15px;line-height:1.5}.result-permissions{margin:20px 0 0;padding-inline-start:20px;font-size:13px;line-height:1.65}.result-permissions li+li{margin-top:16px}.result-permissions p{margin:6px 0 0}@media (width<=1100px){.workspace-grid{grid-template-columns:1fr}.context-column{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=780px){.shell{display:block}.sidebar{min-height:0;padding:16px 20px;position:static}.rail-caption,.sidebar-note{display:none}.steps{flex-wrap:wrap;gap:4px;margin-top:18px;display:flex}.steps:before{display:none}.steps li{flex:none;gap:6px;min-height:37px;padding:4px 7px;font-size:11px}.step-index{flex-basis:26px;width:26px;height:26px}.topbar{flex-wrap:wrap;height:auto;min-height:65px;padding:12px 20px}.content{padding:28px 20px}}@media (width<=540px){.context-column,.plan-sections{grid-template-columns:1fr}.workspace-grid:has(.plan-review) .context-column{grid-template-columns:1fr}.top-actions{flex-wrap:wrap;justify-content:space-between;gap:12px;width:100%;min-width:0}.decision-card{padding:22px}.breadcrumb{max-width:100%}h1{font-size:29px}.plan-decisions dl>div{grid-template-columns:1fr;gap:2px}.question-details dl{grid-template-columns:1fr;gap:3px}.question-details dd{margin-bottom:9px}.language-switch{margin-inline-start:auto}}@media (width<=640px){.check-option.producer-option{grid-template-columns:minmax(0,1fr);gap:12px}.producer-option>a,.producer-links{max-width:none;margin-inline-start:29px}.producer-manual-fields{grid-template-columns:minmax(0,1fr)}}.management-status{color:var(--accent-strong);font-weight:750}.management-actions{flex-wrap:wrap;gap:12px;margin-block:24px 32px;display:flex}.management-section{border-top:1px solid var(--line);padding-block:26px}.management-section h2{margin-top:0}.management-section summary{cursor:pointer;color:var(--accent-strong);font-weight:700}.management-settings{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;display:grid}.management-setting{border:1px solid var(--line);background:var(--surface-soft);border-radius:10px;justify-content:space-between;align-items:center;gap:16px;padding:18px;display:flex}.management-setting h3{margin:0 0 8px;font-size:14px}.management-setting p{color:var(--muted);overflow-wrap:anywhere;margin:0}.management-setting .button{flex-shrink:0}.management-values{gap:8px;display:grid}.management-values dt{overflow-wrap:anywhere;margin-top:12px;font-weight:650}.management-values dd{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--muted);margin:0;line-height:1.6}.management-workflow{padding-block:16px}:is(.workspace-grid:has(.management-settings),.workspace-grid:has(.management-status)){grid-template-columns:1fr}.workspace-grid:has(.management-status) .context-column{display:none}@media (width<=800px){.management-settings{grid-template-columns:1fr}}@media (width<=420px){.management-setting{flex-direction:column;align-items:stretch}.management-setting .button{align-self:flex-end}} diff --git a/build/web/index.html b/build/web/index.html index 9a5f5d447..9f2585f5b 100644 --- a/build/web/index.html +++ b/build/web/index.html @@ -5,8 +5,8 @@ Copilot · Setup studio - - + +
                                                                                                diff --git a/docs/agents/cli-configuration.mdx b/docs/agents/cli-configuration.mdx index 69532cca0..5f5abb9f6 100644 --- a/docs/agents/cli-configuration.mdx +++ b/docs/agents/cli-configuration.mdx @@ -121,6 +121,10 @@ Never place tokens in `with`, command arguments, prompts, repository files, or l ## Provisioning +The provisioning workflow checks each configured role with its own executable +override, or that role provider's default command. `AGENT_EXECUTABLE` applies +to the generic agent role; it does not replace a different role's CLI. + The Action uses an available selected CLI without requiring an exact version. If the default command is absent, it installs that provider's official standalone CLI in a private job directory and verifies a non-empty version. An explicit executable is never installed or replaced. There is no provisioning-mode setting in the generated agent workflows. The Action does not copy local OAuth files into CI or install an unselected provider. See [Agent CLI provisioning](/security-operations/operations/cli-provisioning). ## Failure policy diff --git a/docs/configuration-checklist.mdx b/docs/configuration-checklist.mdx index 90594b9cb..9ab223a97 100644 --- a/docs/configuration-checklist.mdx +++ b/docs/configuration-checklist.mdx @@ -45,6 +45,10 @@ If guarded PR approval is selected, confirm the exact test/coverage producer tup ## Setup and diagnosis +- [ ] The runner review shows the intended group/labels for every target; access, capacity and agent authentication have been checked separately. +- [ ] Agent, ordinary validation, trusted observers, merge-group checks and publication retain their intended routes; native source extensions are visible exceptions. +- [ ] `COPILOT_RUNNER_PROFILES`, when used, contains only supported non-secret profiles. Repository overrides, registry freshness, optional inventory failures and exact manual fallback have been reviewed. +- [ ] The parity inventory and complete changes have been inspected; unknown generator metadata is retained or repaired with its compatible generator. Backups and installation receipts remain available. - [ ] The selected issue workflows start with `in-progress`; `branched` is treated as an Action-verified result. - [ ] `issue-managed-branches` is enabled for release/hotfix and whenever `pre-branch-sdd` is enabled. - [ ] Before enabling `pre-branch-sdd`, the repository has a validated SDD catalog, standard, template, and a configured agent that can return structured responses. diff --git a/docs/configuration.mdx b/docs/configuration.mdx index 7eba59539..d69362070 100644 --- a/docs/configuration.mdx +++ b/docs/configuration.mdx @@ -355,3 +355,104 @@ and leave the preview to make no changes. Existing non-interactive config files retain their single-repository behavior. Target count (1–25), one organization, sequential Apply, immutable shared values and no automatic merge are fixed rules, not configurable templates. + +## Runner profiles + +The terminal review lists routes and changed files without logging workflow +contents. Use `setup --web` for an explicit full local file review before approval. +That local preview masks recognized credential formats; arbitrary hardcoded +values can remain visible. Inspect it before sharing. Setup never reads GitHub +Secret values to construct the preview. + +Before requesting a setup PAT, guided setup offers **Discover existing runners +and groups?** (`runners.discover`, boolean, default `false`). Opting in prefills +repository **Administration: read** and, for an organization owner, +**Self-hosted runners: read** in the generated GitHub link. These are optional +inventory grants: denied access remains unknown and exact manual routing still +works. Personal owners request only the repository grant. The bot PAT receives +neither discovery grant. GitHub still requires selecting the target repositories +in its token form. The discovery choice is local setup intent and is not copied +into `.copilot/runner-profile.json`. + +Setup asks where Copilot jobs should run in both the terminal and web wizard. +**Keep installed routing** is the default. New jobs show their GitHub-hosted +template route. Choose **GitHub-hosted** to replace managed agent/validation +routes explicitly, or choose an existing self-hosted profile. Selection does +not register a runner, grant repository access or authenticate an agent. + +```text +Choose or retain a profile → review each job and repository → inspect changes → approve +``` + +Agent jobs and the CLI provisioning check use the agent route. Ordinary +validation and lifecycle helpers use GitHub-hosted runners unless you explicitly +choose the agent route for ordinary validation. Credential verification has a +separate fixed role and remains hosted when managed routes are replaced. Approval observers, +merge-group checks and publication keep independent routes. Copilot's native +source workflows retain their own reviewed routes and appear as exceptions. +Source detection requires Copilot-specific inputs on a root-local invocation; +an unrelated `uses: ./` does not suppress consumer upgrades. The provisioning +check verifies `codex exec --help`, `opencode run --help` or Cursor's supported +help surface, including rejection when a configured headless command is broken. + +An organization administrator can define the non-secret Actions Variable +`COPILOT_RUNNER_PROFILES` through GitHub settings: + +```json +{"schemaVersion":1,"profiles":[{"id":"vypdev-agent","group":"vypdev","labels":["self-hosted","codex","Linux"],"validation":"hosted"}]} +``` + +Repository Variable inventory must be readable to establish whether an override +exists. If it is unavailable, setup keeps the registry unverified even when the +organization value is readable; restore access or choose manual routing. + +Setup only reads this registry. It neither updates its value nor shares it with +additional repositories. A repository Variable of the same name takes precedence, +including when that override is invalid. Each profile needs a unique ID of +1–50 letters, digits, dots, underscores or hyphens; an empty group or literal +group name of at most 100 characters; 1–10 unique literal labels of at most 100 +characters; and `validation: hosted` or `agent`. Include `self-hosted` and +`Linux` or `macOS`. The Bash templates do not support selecting Windows service +Codex runners. Expressions, control characters, unknown fields, unknown schema +versions, more than ten profiles and registries over 16,000 characters are +rejected. Keep every registry value non-secret. + +An exact manual profile works without organization inventory permission. The +equivalent setup config file is: + +```yaml +runners: + mode: manual-self-hosted + profileId: '' + group: vypdev + labels: [self-hosted, codex, Linux] + validation: hosted +``` + +Available modes are `retain`, `hosted`, `organization-profile` and +`manual-self-hosted`. Interactive organization-profile selection resolves its +ID and exact values from the effective registry. A manually supplied organization +snapshot must match that registry; prefer the wizard for this mode. Choose a +profile per target in a batch of 1–25 repositories and inspect repository +exceptions in the final combined review. Explicit profile replacement wins over +retained managed agent/ordinary-validation routing. Credential verification is +hosted during replacement; observers, publication and native source extensions +keep their independent routes. Otherwise installed routing wins over hosted defaults. + +Discovery uses existing read access to repository runners and organization +groups filtered for the target repository. It reads at most ten eligible groups, +1,000 runners in total and ten pages per collection. Unavailable, incomplete or +malformed inventory never means that no runner exists. A workflow-restricted +group remains unverified even if its repository is eligible. Busy/offline means +pending capacity. These observations never trigger another execution environment +or certify agent authentication. See [GitHub's runner group API](https://docs.github.com/en/rest/actions/self-hosted-runner-groups). + +Review shows effective `runs-on`, access/capacity observations, source exceptions, +the asset inventory and every changed file. The terminal omits file bodies from +logs; the local web view offers complete before/after contents with its explicit +recognized-format masking notice. `.copilot/runner-profile.json` records the +selected non-secret route and, for a shared profile, source scope and a registry +digest; it does not copy unselected profiles or Secret values. A changed registry +requires a new review before permission probes or installation writes. The +existing private journal, backups and immutable installer PR receipts govern +retry and recovery. A created PR still needs human merge and runtime verification. diff --git a/docs/development/architecture.mdx b/docs/development/architecture.mdx index f7019d6e7..bc828dca3 100644 --- a/docs/development/architecture.mdx +++ b/docs/development/architecture.mdx @@ -4,6 +4,28 @@ description: Clean Architecture boundaries for agent execution and workflow auto --- # Architecture +### Setup runner profiles and installation parity + +`setup_runner_policy` owns pure registry validation, precedence, fixed job roles, +route selection and access/capacity classification. The shared questionnaire owns +answers for CLI and web. `SetupRunnerDiscoveryPort` exposes read-only inventory; +the GitHub adapter uses fixed bounded GET routes and treats permission/shape +failures as unavailable evidence. Presentation never registers runners, changes +group membership or chooses a fallback environment. + +The installation review adapter uses the same workflow upgrade renderer as copy +and batch preparation. Reviews carry typed role routes, asset classifications, +blockers and before/after content for the paired local web view. Terminal +presenters emit only route/file summaries, never workflow bodies. Credential +verification remains independent from the ordinary validation route. Existing whole source workflows and +generator-owned guidance are preserved. Shared profile source values stay in +the private operation; the repository snapshot contains only the selected route +and a source digest. Final profile freshness checks run before permission probes +and again before writes. Existing plan hashes, private journals, backups and +immutable installer commits remain the state/recovery boundary. The catalogued +[runner/parity specification](https://github.com/vypdev/copilot/blob/master/specs/setup-runner-profiles-and-installation-parity.md) +defines the contract and test distribution. + Guarded PR approval uses a separate trusted observer entrypoint, a pure domain decision (`pull_request_approval`), a read-before-write application use case, and a GitHub adapter. The adapter owns exact producer/rule/review queries and the `commit_id`-pinned native review. Its PR assessment card and supplemental Check are derived UI; GitHub's native review is authoritative. The observer has no PR-head checkout or agent invocation. See the [runtime SDD](../../specs/guarded-pull-request-approval.md) and [setup/doctor SDD](../../specs/guarded-pull-request-approval-setup-and-doctor.md). Web configuration management has its own `ManageSetupUseCase` over semantic diff --git a/docs/how-to-use.mdx b/docs/how-to-use.mdx index 4868acf5a..7c768336a 100644 --- a/docs/how-to-use.mdx +++ b/docs/how-to-use.mdx @@ -488,9 +488,9 @@ The complete command reference, including every supported option, is in [Workflo - **Deploy label**: The label that triggers the deploy flow is configured by the `deploy-label` input (default: `deploy`). The issue templates and your usage must use this same label when you want to run the release or hotfix workflow. - **Branch names in workflows**: The Commit workflow (push) often excludes the main and development branches from running (e.g. `!master`, `!develop`). If you change the default branch names (e.g. `main-branch: 'main'`, `development-branch: 'develop'`), update the `push.branches` filter in `.github/workflows/copilot_commit.yml` so it excludes those same names; otherwise the action may run on every push to main/develop or never run on feature branches. - **Runner selection:** New workflows use `runs-on: ubuntu-latest` as the neutral default. When upgrading an installed workflow, setup preserves the runner labels or group of each matching job. Inspect new workflows, including `agent-cli-provisioning.yml`, and select the runner labels used by your infrastructure before merge. A changed workflow with a dynamic runner expression requires separate review because its matrix or inputs may differ from the new template. The approval observer keeps its isolated template runner. This repository's agent workflows use self-hosted Codex runners; these labels are an internal infrastructure choice, not a consumer requirement. Windows service registrations omit `codex`: **Codex no soportado en runners Windows ejecutados como servicio**. + **Runner selection:** Keep installed routing, explicitly choose GitHub-hosted jobs, reuse an existing organization profile, or enter a known self-hosted group and labels. Review effective routes and access/capacity observations per repository. Agent jobs and CLI provisioning share the agent route; ordinary validation has a separate choice. Approval observers, merge-group checks and publication stay independent. A changed dynamic route that you retain requires separate review of its matrix/inputs. No environment fallback or runner access grant is implicit. See [runner profiles](/configuration#runner-profiles). Windows service registrations omit `codex`: **Codex no soportado en runners Windows ejecutados como servicio**. - **Copilot source repository:** A target containing a root-local `uses: ./` Action retains its existing native workflows and complete source guidance. Its Commit workflow gains only the installer exclusion; Branch Sync still observes every branch. Source generator migrations and selecting reusable runner profiles are tracked in [#556](https://github.com/vypdev/copilot/issues/556). + **Copilot source repository:** A target containing a root-local `uses: ./` Action retains its existing native workflows and complete source guidance. Its Commit workflow gains only the installer exclusion; Branch Sync still observes every branch. The parity inventory distinguishes shared assets, missing optional assets, customizations, native extensions and incompatible generator metadata. Native CI, RepoWise, runner diagnostics, the platform smoke matrix and npm publication are intentional source extensions. Source now includes compatible manual CLI-provisioning and credential-health workflows; provisioning uses the Codex pool, while credential health keeps its independent hosted route. Future generator metadata is retained or blocks regeneration; setup does not silently migrate it. **Optional but keep coherence:** - **Labels**: If you change any label input (e.g. `feature-label`, `bugfix-label`, `deploy-label`), use the **same** label names in your issue templates (`labels:` in each `.yml`) and when labeling issues manually. Otherwise the action will not recognize the type or flow. diff --git a/docs/security-operations/operations/troubleshooting.mdx b/docs/security-operations/operations/troubleshooting.mdx index 6788c3997..9fcc1af41 100644 --- a/docs/security-operations/operations/troubleshooting.mdx +++ b/docs/security-operations/operations/troubleshooting.mdx @@ -5,6 +5,21 @@ description: Common issues and solutions when using Copilot # Troubleshooting +For setup runner selection, use the named state to choose the next action: + +| State | Meaning and next action | +|---|---| +| Access unverified | Inventory is unavailable/incomplete, a group is workflow-restricted, or the exact route is unobserved. Ask an organization administrator to verify repository and workflow access, or enter a known manual profile. Selection never grants access. | +| Capacity pending | Matching authorized runners were observed busy/offline. Keep the route, check the runner service and refresh setup/readiness when capacity returns. No hosted fallback occurs. | +| Unavailable | A confirmed eligible group has no runner matching all labels. Correct the exact group/labels or restore the intended runner, then review again. | +| Incompatible generator | Retain the asset or restore a compatible generator/snapshot. Do not replace source guidance or native release/CI jobs with consumer templates. | +| Registry changed | Setup stopped before probes/writes. Restart profile review against the current effective registry; preserve existing installer PRs and receipts. | + +Runner availability does not prove Codex authentication or runtime tools. Merge +the reviewed installation PR through the normal process, then run the appropriate +provisioning/credential checks and actual trusted workflow. See +[runner profiles](/configuration#runner-profiles) for schema, limits and snapshots. + If guarded PR approval is missing, run `copilot doctor` and inspect the ordered `approval.*` checks. A missing `PR_APPROVAL_POLICY` is safely off; a copied observer that has not reached the default branch cannot receive `workflow_run` wakeups. Correct the named CI producer, Bugbot completeness, runtime PAT, or stale-dismissal rule, then manually dispatch **Copilot - Pull Request Approval** with the PR number. An ambiguous review POST is read-first on retry; never blindly submit a second approval. See [guarded approval](/pull-requests/guarded-approval). This guide helps you resolve common issues you might encounter while using Copilot. Expand the section that matches your problem. diff --git a/scripts/coverage-budgets.json b/scripts/coverage-budgets.json index a8db30fbb..f095d9d6f 100644 --- a/scripts/coverage-budgets.json +++ b/scripts/coverage-budgets.json @@ -842,6 +842,32 @@ } ], "successMessage": "complete multipart progress coverage: PASS (pure policies 100%; bounded orchestration 95% lines/statements, 90% branches/functions)" + }, + { + "name": "Setup runner profiles and installation parity", + "missingEntryLabel": "setup runner profile/parity module", + "rules": [ + { + "files": [ + "src/application/policies/setup_runner_policy.ts", + "src/application/policies/setup_runner_question_policy.ts", + "src/application/policies/setup_runner_installation_summary_policy.ts" + ], + "mode": "each", + "thresholdProfile": "exhaustive" + }, + { + "files": [ + "src/infrastructure/setup_runner_discovery_adapter.ts", + "src/infrastructure/composition/setup_runner_composition_root.ts", + "src/utils/setup_installation_review.ts", + "src/cli/setup_installation_review_presenter.ts" + ], + "mode": "each", + "thresholdProfile": "default" + } + ], + "successMessage": "setup runner profiles/parity coverage: PASS (pure decisions 100%; each adapter/presenter 95% lines/statements, 90% branches/functions)" } ] } diff --git a/scripts/serve-web-setup-review.cjs b/scripts/serve-web-setup-review.cjs index 3e9ea4c8f..a4bbc7fa2 100644 --- a/scripts/serve-web-setup-review.cjs +++ b/scripts/serve-web-setup-review.cjs @@ -6,6 +6,7 @@ const { join, sep } = require('node:path'); const { reviewView } = require('./web-setup-review-views.cjs'); const states = new Set(['pending', 'action-required', 'blocked', 'partial', 'completed', 'cancelled', 'expired', + 'runner-plan', 'runner-question', 'runner-blocked', 'runner-discovery', 'plan', 'checks', 'question', 'credential', 'blocked-permissions', 'bot-credential', 'bot-account-mismatch', 'bot-scope-conflict', 'bot-scope-conflict-unavailable']); const selected = process.argv[2]; if (!states.has(selected)) { diff --git a/scripts/validate-workflow-contract.cjs b/scripts/validate-workflow-contract.cjs index 5131f9b06..9dcfe1e3f 100644 --- a/scripts/validate-workflow-contract.cjs +++ b/scripts/validate-workflow-contract.cjs @@ -430,6 +430,7 @@ function assertRunner(file, workflow) { } let expected = ['self-hosted', 'codex']; if (relativeFile.startsWith('setup/workflows/') + || relativeFile === '.github/workflows/copilot_credential_health.yml' || (/^\.github\/workflows\/(?:release|hotfix)_workflow\.yml$/.test(relativeFile) && jobId === 'publish-npm')) { expected = ['ubuntu-latest']; } else if (relativeFile === '.github/workflows/copilot_pull_request_approval.yml') { diff --git a/scripts/web-setup-review-views.cjs b/scripts/web-setup-review-views.cjs index 16a89755c..4023aa563 100644 --- a/scripts/web-setup-review-views.cjs +++ b/scripts/web-setup-review-views.cjs @@ -1,4 +1,5 @@ /** Credential-free fixtures for long content, navigation and prerequisite diagnostics. */ +const { runnerReviewView } = require('./web-setup-runner-review-fixtures.cjs'); const base = { revision: 1, promptRevision: 1, repository: 'fixture-owner/fixture-repo' }; const decisions = { enabledCapabilities: ['issues', 'pullRequests', 'releases'], issueWorkflows: ['feature', 'bugfix', 'release'], @@ -13,6 +14,7 @@ const decisions = { }; function reviewView(state) { + if (state.startsWith('runner-')) return runnerReviewView(state, reviewView('plan')); if (state === 'bot-scope-conflict' || state === 'bot-scope-conflict-unavailable') return { ...base, journey: { repository: base.repository, position: 4, total: 6, current: 'Plan', complete: ['Repository', 'Setup choices', 'Setup PAT'], pending: ['Bot PAT & credentials', 'Apply'], mutationStarted: false, choiceReviewPass: 1 }, diff --git a/scripts/web-setup-runner-review-fixtures.cjs b/scripts/web-setup-runner-review-fixtures.cjs new file mode 100644 index 000000000..2c118c247 --- /dev/null +++ b/scripts/web-setup-runner-review-fixtures.cjs @@ -0,0 +1,99 @@ +const runnerDiscoveryPresentation = { + "en": { + "label": "Discover existing runners and groups?", + "summary": "Optional: prefill repository Administration read and organization Self-hosted runners read in the setup PAT link. Disabled by default; exact manual routing needs neither discovery grant.", + "when": "Changes generated workflow runs-on values; runner access, Secrets and authentication are separate.", + "where": "Changes generated workflow runs-on values; runner access, Secrets and authentication are separate.", + "how": "Retain keeps existing jobs. Hosted explicitly replaces managed agent/validation routes. A reusable profile comes from COPILOT_RUNNER_PROFILES; manual entry needs exact existing group and labels.", + "why": "Different job roles have different trust and runtime requirements.", + "effect": "Observer and publication routes stay independent. Native source workflows remain visible exceptions. Nothing grants access or falls back silently.", + "verify": "Review effective YAML, repository access and runner authentication. Busy/offline means pending capacity; unknown access needs verification.", + "example": "Group vypdev; labels self-hosted,codex,Linux; ordinary validation hosted.", + "documentation": { + "title": "Where should Copilot jobs run?", + "url": "https://docs.page/vypdev/copilot/configuration#runner-profiles" + } + }, + "es": { + "label": "¿Consultar los runners y grupos existentes?", + "summary": "Opcional: incluye Administration de repositorio y Self-hosted runners de organización en lectura en el enlace del PAT. Desactivado por defecto; puedes indicar una ruta manual exacta sin estos permisos de consulta.", + "when": "Cambia runs-on en los workflows generados; acceso, Secrets y autenticación se verifican por separado.", + "where": "Cambia runs-on en los workflows generados; acceso, Secrets y autenticación se verifican por separado.", + "how": "Conservar mantiene los jobs existentes. GitHub sustituye expresamente las rutas gestionadas de agente y validación. Un perfil reutilizable procede de COPILOT_RUNNER_PROFILES; la entrada manual necesita el grupo y las etiquetas exactos.", + "why": "Cada tipo de job tiene requisitos de confianza y ejecución distintos.", + "effect": "Observador y publicación conservan rutas independientes. Los workflows nativos se muestran como excepciones. No se concede acceso ni se cambia de entorno automáticamente.", + "verify": "Revisa YAML, acceso del repositorio y autenticación del runner. Ocupado o desconectado indica capacidad pendiente; acceso desconocido requiere verificación.", + "example": "Grupo vypdev; etiquetas self-hosted,codex,Linux; validación ordinaria en GitHub.", + "documentation": { + "title": "¿Dónde deben ejecutarse los jobs de Copilot?", + "url": "https://docs.page/vypdev/copilot/configuration#runner-profiles" + } + }, + "fr": { + "label": "Consulter les runners et groupes existants ?", + "summary": "Facultatif : préremplit Administration du dépôt et Self-hosted runners de l’organisation en lecture dans le lien PAT. Désactivé par défaut ; une route manuelle exacte reste possible sans ces droits de consultation.", + "when": "Modifie runs-on dans les workflows générés ; accès, Secrets et authentification restent distincts.", + "where": "Modifie runs-on dans les workflows générés ; accès, Secrets et authentification restent distincts.", + "how": "Conserver maintient les jobs existants. GitHub remplace explicitement les routes gérées. Le profil partagé provient de COPILOT_RUNNER_PROFILES ; la saisie manuelle exige le groupe et les étiquettes exacts.", + "why": "Chaque rôle a des exigences de confiance et d’exécution distinctes.", + "effect": "Observation et publication gardent leurs routes. Les workflows natifs restent des exceptions visibles. Aucun accès accordé ni repli automatique.", + "verify": "Vérifiez le YAML, l’accès du dépôt et l’authentification. Occupé/hors ligne indique une capacité en attente ; l’accès inconnu doit être vérifié.", + "example": "Groupe vypdev ; étiquettes self-hosted,codex,Linux ; validation sur GitHub.", + "documentation": { + "title": "Où exécuter les jobs Copilot ?", + "url": "https://docs.page/vypdev/copilot/configuration#runner-profiles" + } + }, + "pt": { + "label": "Consultar runners e grupos existentes?", + "summary": "Opcional: inclui Administration do repositório e Self-hosted runners da organização em leitura no link do PAT. Desativado por padrão; uma rota manual exata continua disponível sem estas permissões de consulta.", + "when": "Altera runs-on nos workflows gerados; acesso, Secrets e autenticação são independentes.", + "where": "Altera runs-on nos workflows gerados; acesso, Secrets e autenticação são independentes.", + "how": "Manter conserva os jobs existentes. GitHub substitui explicitamente as rotas geridas. O perfil partilhado vem de COPILOT_RUNNER_PROFILES; a entrada manual exige grupo e etiquetas exatos.", + "why": "Cada função tem requisitos de confiança e execução diferentes.", + "effect": "Observador e publicação mantêm rotas independentes. Workflows nativos são exceções visíveis. Não concede acesso nem muda automaticamente de ambiente.", + "verify": "Reveja YAML, acesso do repositório e autenticação. Ocupado/offline indica capacidade pendente; acesso desconhecido exige verificação.", + "example": "Grupo vypdev; etiquetas self-hosted,codex,Linux; validação normal no GitHub.", + "documentation": { + "title": "Onde executar os jobs do Copilot?", + "url": "https://docs.page/vypdev/copilot/configuration#runner-profiles" + } + } +}; +/** Credential-free presentation evidence; no provider or mutation adapters. */ +const installationReview = { + blockers: [], + jobs: [ + { file: 'copilot_issue.yml', job: 'copilot-issues', role: 'agent', runsOn: { group: 'vypdev', labels: ['self-hosted', 'codex', 'Linux'] }, status: 'pending-capacity', retained: false }, + { file: 'agent-cli-provisioning.yml', job: 'verify-agent-clis', role: 'agent', runsOn: { group: 'vypdev', labels: ['self-hosted', 'codex', 'Linux'] }, status: 'access-unknown', retained: false }, + { file: 'copilot_credential_health.yml', job: 'verify-pat', role: 'credential-health', runsOn: 'ubuntu-latest', status: 'hosted', retained: false }, + { file: 'copilot_pull_request_approval.yml', job: 'observe-approval', role: 'observer', runsOn: 'ubuntu-latest', status: 'hosted', retained: true }, + { file: 'release_workflow.yml', job: 'publish-npm', role: 'publication', runsOn: 'ubuntu-latest', status: 'hosted', retained: true }, + ], + assets: [ + { path: '.github/workflows/copilot_issue.yml', status: 'customized', enabled: true }, + { path: '.github/workflows/agent-cli-provisioning.yml', status: 'missing', enabled: true }, + { path: '.github/workflows/copilot_credential_health.yml', status: 'missing', enabled: false }, + { path: '.github/workflows/ci_check.yml', status: 'source-only', enabled: true }, + { path: '.copilot/AGENT_GUIDE.md', status: 'shared', enabled: true }, + ], + changes: [{ path: '.github/workflows/copilot_issue.yml', before: 'jobs:\n copilot-issues:\n runs-on: ubuntu-latest\n', + after: 'jobs:\n copilot-issues:\n runs-on:\n group: vypdev\n labels: [self-hosted, codex, Linux]\n' }], +}; +function runnerReviewView(state, normalPlan) { + if (state === 'runner-discovery') return { revision: 1, promptRevision: 1, repository: 'fixture-owner/fixture-repo', + prompt: { kind: 'question', title: 'Runner discovery', presentation: runnerDiscoveryPresentation, phase: 'permission-intent', pass: 1, canGoBack: true, + question: { stateId: 'agent-runtime', id: 'runners.discover', label: 'Discover existing runners and groups?', kind: 'boolean', defaultValue: false } } }; + + if (state === 'runner-plan' || state === 'runner-blocked') return { ...normalPlan, + prompt: { ...normalPlan.prompt, editGroups: ['agent-runtime'], plan: { ...normalPlan.prompt.plan, + installationReview: state === 'runner-blocked' + ? { ...installationReview, blockers: ['Restore the compatible generator before replacing this asset.'] } : installationReview } } }; + if (state === 'runner-question') return { revision: 1, promptRevision: 1, repository: 'fixture-owner/fixture-repo', + prompt: { kind: 'question', title: 'Runner profile', phase: 'full', pass: 1, canGoBack: true, + question: { stateId: 'agent-runtime', id: 'runners.mode', label: 'Where should Copilot jobs run?', kind: 'choice', defaultValue: 'manual-self-hosted', + choices: ['retain', 'hosted', 'organization-profile', 'manual-self-hosted'], runnerRegistryStatus: 'available', + runnerProfiles: [{ id: 'vypdev-agent', group: 'vypdev', labels: ['self-hosted', 'codex', 'Linux'], validation: 'hosted' }], + runnerInventory: { status: 'incomplete', groups: [{ name: 'vypdev', access: 'unknown' }], candidates: [] } } } }; +} +module.exports = { runnerReviewView }; diff --git a/setup/workflows/agent-cli-provisioning.yml b/setup/workflows/agent-cli-provisioning.yml index a522273af..99ac19a6e 100644 --- a/setup/workflows/agent-cli-provisioning.yml +++ b/setup/workflows/agent-cli-provisioning.yml @@ -47,7 +47,7 @@ jobs: cursor) expected_executable=agent ;; *) echo "Unsupported agent provider: $provider" >&2; exit 1 ;; esac - executable="${executables[$index]:-${AGENT_EXECUTABLE:-$expected_executable}}" + executable="${executables[$index]:-$expected_executable}" [[ "${executable##*/}" == "$expected_executable" ]] || { echo "Invalid $provider executable basename." >&2; exit 1; } if ! command -v "$executable" >/dev/null 2>&1; then [[ "$executable" == "$expected_executable" ]] || { echo "Configured executable is missing: $executable" >&2; exit 1; } @@ -68,9 +68,13 @@ jobs: ;; esac fi - actual_version="$($executable --version | head -n 1)" + actual_version="$("$executable" --version | head -n 1)" [[ -n "${actual_version// }" ]] || { echo "$provider returned empty version output" >&2; exit 1; } - "$executable" --help >/dev/null + case "$provider" in + codex) "$executable" exec --help >/dev/null ;; + opencode) "$executable" run --help >/dev/null ;; + cursor) "$executable" --help >/dev/null ;; + esac [[ " $checked " == *" $provider "* ]] || checked="$checked $provider" done diff --git a/specs/CATALOG.md b/specs/CATALOG.md index eb155cee6..97190c016 100644 --- a/specs/CATALOG.md +++ b/specs/CATALOG.md @@ -16,10 +16,10 @@ debt or convert unknown historic intent into a design decision. | `bugbot-review-state-reconciliation` | Implemented | Reconcile review snapshots, findings, threads, comments, and check conclusions | [Bugbot review-state reconciliation](./bugbot-review-state-reconciliation.md) | 59 paths · 2026-10-11 | | `execution-lifecycle` | Implemented | Shared GitHub Action lifecycle from event admission through durable user-facing results | [Execution admission, queueing, routing, and result publication](./execution-admission-queue-and-publication.md) + 3 companion | 97 paths · 2026-10-14 | | `architecture-quality-hardening` | Implemented | Close verified concurrency, error-contract, context-coupling, fan-out, setup/doctor, and provider-policy risks in dependency order | [Architecture quality and scalability hardening](./architecture-quality-and-scalability-hardening.md) + 1 companion | 72 paths · 2026-10-13 | -| `setup-and-doctor` | Implemented | Plan, validate, provision, and audit a repository installation without exposing credentials | [Setup, configuration, credentials, and doctor](./setup-configuration-credentials-and-doctor.md) + 4 companion | 263 paths · 2026-10-18 | -| `local-web-setup-assistant` | Proposed | Offer a packaged, loopback-only Svelte setup interface over the existing engine with four-language guidance, English CLI help, basic/custom first-run paths, editable question and plan review, source-labelled GitHub facts, assisted CI and Project evidence, role-separated PATs, and truthful itemized outcomes; inspect existing configuration and apply independent, scope-aware runtime adjustments with permission, drift and read-back verification | [Local web setup assistant](./local-web-setup-assistant.md) + 1 companion | 220 paths · 2026-10-14 | +| `setup-and-doctor` | Implemented | Plan, validate, provision, and audit a repository installation without exposing credentials | [Setup, configuration, credentials, and doctor](./setup-configuration-credentials-and-doctor.md) + 5 companion | 285 paths · 2026-10-18 | +| `local-web-setup-assistant` | Proposed | Offer a packaged, loopback-only Svelte setup interface over the existing engine with four-language guidance, English CLI help, basic/custom first-run paths, editable question and plan review, source-labelled GitHub facts, assisted CI and Project evidence, role-separated PATs, and truthful itemized outcomes; inspect existing configuration and apply independent, scope-aware runtime adjustments with permission, drift and read-back verification | [Local web setup assistant](./local-web-setup-assistant.md) + 1 companion | 225 paths · 2026-10-14 | | `guided-bot-pat-onboarding` | Proposed | Guide creation of the persistent workflow PAT, verify bot identity and grants, recover explicitly from wrong-account input within the session, and install the approved Actions Secret | [Guided bot PAT onboarding](./guided-bot-pat-onboarding.md) | 39 paths · 2026-10-07 | -| `temporary-setup-operator-authorization` | Proposed | Guide creation of the one-run operator PAT through GitHub's official form, verify final setup access, and report user-owned deletion accurately | [Assisted setup PAT creation](./temporary-setup-operator-authorization.md) | 34 paths · 2026-10-07 | +| `temporary-setup-operator-authorization` | Proposed | Guide creation of the one-run operator PAT through GitHub's official form, verify final setup access, and report user-owned deletion accurately | [Assisted setup PAT creation](./temporary-setup-operator-authorization.md) | 36 paths · 2026-10-18 | | `issue-start-and-sdd-readiness` | Implemented | Start every admitted issue with one explicit signal and publish a validated SDD before eligible Action-managed branch work; inspect verified SDD status and bounded structural publication comparisons | [Uniform issue start and pre-branch SDD readiness](./issue-start-and-branch-readiness.md) + 3 companion | 104 paths · 2026-10-17 | | `managed-issue-lifecycle` | As-built baseline | Convert typed issues into traceable work branches, project state, and lifecycle state | [Managed issue and branch lifecycle](./managed-issue-and-branch-lifecycle.md) | 64 paths · 2026-10-13 | | `comment-automation` | Implemented | Admit only explicit commands or exact mentions, then route them while protecting repository mutations | [Comment automation and authorization](./comment-automation-and-authorization.md) | 79 paths · 2026-10-11 | @@ -104,11 +104,11 @@ debt or convert unknown historic intent into a design decision. - Owner: Copilot maintainers - Last verified: 2026-10-18 -- Specifications: [`specs/setup-configuration-credentials-and-doctor.md`](./setup-configuration-credentials-and-doctor.md) · [`specs/setup-doctor-architecture-hardening.md`](./setup-doctor-architecture-hardening.md) · [`specs/setup-pat-permission-guidance-and-verification.md`](./setup-pat-permission-guidance-and-verification.md) · [`specs/github-runtime-doctor-command.md`](./github-runtime-doctor-command.md) · [`specs/organization-configuration-reuse-and-batch-setup.md`](./organization-configuration-reuse-and-batch-setup.md) -- Workflows: [`setup/workflows/agent-cli-provisioning.yml`](../setup/workflows/agent-cli-provisioning.yml) · [`setup/workflows/copilot_credential_health.yml`](../setup/workflows/copilot_credential_health.yml) · [`.github/workflows/copilot_issue_comment.yml`](../.github/workflows/copilot_issue_comment.yml) · [`.github/workflows/copilot_pull_request_comment.yml`](../.github/workflows/copilot_pull_request_comment.yml) +- Specifications: [`specs/setup-configuration-credentials-and-doctor.md`](./setup-configuration-credentials-and-doctor.md) · [`specs/setup-doctor-architecture-hardening.md`](./setup-doctor-architecture-hardening.md) · [`specs/setup-pat-permission-guidance-and-verification.md`](./setup-pat-permission-guidance-and-verification.md) · [`specs/github-runtime-doctor-command.md`](./github-runtime-doctor-command.md) · [`specs/organization-configuration-reuse-and-batch-setup.md`](./organization-configuration-reuse-and-batch-setup.md) · [`specs/setup-runner-profiles-and-installation-parity.md`](./setup-runner-profiles-and-installation-parity.md) +- Workflows: [`setup/workflows/agent-cli-provisioning.yml`](../setup/workflows/agent-cli-provisioning.yml) · [`setup/workflows/copilot_credential_health.yml`](../setup/workflows/copilot_credential_health.yml) · [`.github/workflows/copilot_issue_comment.yml`](../.github/workflows/copilot_issue_comment.yml) · [`.github/workflows/copilot_pull_request_comment.yml`](../.github/workflows/copilot_pull_request_comment.yml) · [`.github/workflows/agent-cli-provisioning.yml`](../.github/workflows/agent-cli-provisioning.yml) · [`.github/workflows/copilot_credential_health.yml`](../.github/workflows/copilot_credential_health.yml) - Entrypoints: [`src/cli/commands/setup.ts`](../src/cli/commands/setup.ts) · [`src/cli/commands/doctor.ts`](../src/cli/commands/doctor.ts) · [`src/application/usecases/issue_comment_use_case.ts`](../src/application/usecases/issue_comment_use_case.ts) · [`src/application/usecases/pull_request_review_comment_use_case.ts`](../src/application/usecases/pull_request_review_comment_use_case.ts) -- Core code: [`src/domain/setup.ts`](../src/domain/setup.ts) · [`src/domain/setup_questionnaire.ts`](../src/domain/setup_questionnaire.ts) · [`src/domain/setup_token_permissions.ts`](../src/domain/setup_token_permissions.ts) · [`src/application/ports/setup_terminal_ports.ts`](../src/application/ports/setup_terminal_ports.ts) · [`src/application/ports/setup_wizard_ports.ts`](../src/application/ports/setup_wizard_ports.ts) · [`src/application/ports/branch_tag_ports.ts`](../src/application/ports/branch_tag_ports.ts) · [`src/application/policies/setup_issue_workflow_policy.ts`](../src/application/policies/setup_issue_workflow_policy.ts) · [`src/data/repository/release/repository_version_tags_query_repository.ts`](../src/data/repository/release/repository_version_tags_query_repository.ts) · [`src/application/ports/setup_token_permission_ports.ts`](../src/application/ports/setup_token_permission_ports.ts) · [`src/application/policies/setup_token_permission_evidence_policy.ts`](../src/application/policies/setup_token_permission_evidence_policy.ts) · [`src/application/policies/setup_token_permission_policy.ts`](../src/application/policies/setup_token_permission_policy.ts) · [`src/application/policies/setup_questionnaire_policy.ts`](../src/application/policies/setup_questionnaire_policy.ts) · [`src/application/policies/setup_configuration_plan.ts`](../src/application/policies/setup_configuration_plan.ts) · [`src/application/policies/merge_setup_overrides_policy.ts`](../src/application/policies/merge_setup_overrides_policy.ts) · [`src/application/policies/setup_configuration_storage_policy.ts`](../src/application/policies/setup_configuration_storage_policy.ts) · [`src/application/policies/setup_doctor_message_catalog.ts`](../src/application/policies/setup_doctor_message_catalog.ts) · [`src/application/policies/setup_doctor_report_policy.ts`](../src/application/policies/setup_doctor_report_policy.ts) · [`src/application/policies/setup_journey_policy.ts`](../src/application/policies/setup_journey_policy.ts) · [`src/application/policies/setup_permission_summary_policy.ts`](../src/application/policies/setup_permission_summary_policy.ts) · [`src/application/usecases/setup/setup_wizard_use_case.ts`](../src/application/usecases/setup/setup_wizard_use_case.ts) · [`src/application/usecases/setup/setup_journey_use_case.ts`](../src/application/usecases/setup/setup_journey_use_case.ts) · [`src/application/usecases/setup/setup_session_coordinator.ts`](../src/application/usecases/setup/setup_session_coordinator.ts) · [`src/application/usecases/setup/setup_questionnaire_controller.ts`](../src/application/usecases/setup/setup_questionnaire_controller.ts) · [`src/application/usecases/setup/setup_credentials_use_case.ts`](../src/application/usecases/setup/setup_credentials_use_case.ts) · [`src/application/usecases/setup/setup_token_permissions_use_case.ts`](../src/application/usecases/setup/setup_token_permissions_use_case.ts) · [`src/application/usecases/setup/doctor_use_case.ts`](../src/application/usecases/setup/doctor_use_case.ts) · [`src/application/usecases/setup/merge_queue_readiness_use_case.ts`](../src/application/usecases/setup/merge_queue_readiness_use_case.ts) · [`src/application/usecases/actions/initial_setup_workflow.ts`](../src/application/usecases/actions/initial_setup_workflow.ts) · [`src/application/usecases/actions/setup_resource_provisioning.ts`](../src/application/usecases/actions/setup_resource_provisioning.ts) · [`src/application/ports/message_catalog_ports.ts`](../src/application/ports/message_catalog_ports.ts) · [`src/application/usecases/localization/resolve_message_catalog_use_case.ts`](../src/application/usecases/localization/resolve_message_catalog_use_case.ts) · [`src/application/policies/setup_configuration_validation.ts`](../src/application/policies/setup_configuration_validation.ts) · [`src/infrastructure/setup_workspace_adapter.ts`](../src/infrastructure/setup_workspace_adapter.ts) · [`src/data/repository/repository_variables_repository.ts`](../src/data/repository/repository_variables_repository.ts) · [`src/infrastructure/github/ports/github_repository_variables_protocol.ts`](../src/infrastructure/github/ports/github_repository_variables_protocol.ts) · [`src/infrastructure/setup_remote_credential_health_adapter.ts`](../src/infrastructure/setup_remote_credential_health_adapter.ts) · [`src/infrastructure/setup_credential_validation_adapter.ts`](../src/infrastructure/setup_credential_validation_adapter.ts) · [`src/infrastructure/setup_token_permission_query_adapter.ts`](../src/infrastructure/setup_token_permission_query_adapter.ts) · [`src/infrastructure/setup_permission_actions_probe.ts`](../src/infrastructure/setup_permission_actions_probe.ts) · [`src/infrastructure/setup_permission_issue_probe.ts`](../src/infrastructure/setup_permission_issue_probe.ts) · [`src/infrastructure/setup_permission_issue_cleanup.ts`](../src/infrastructure/setup_permission_issue_cleanup.ts) · [`src/infrastructure/setup_permission_probe_journal.ts`](../src/infrastructure/setup_permission_probe_journal.ts) · [`src/infrastructure/setup_permission_probe_transaction.ts`](../src/infrastructure/setup_permission_probe_transaction.ts) · [`src/infrastructure/setup_permission_resource_probes.ts`](../src/infrastructure/setup_permission_resource_probes.ts) · [`src/infrastructure/setup_projects_probe_page_policy.ts`](../src/infrastructure/setup_projects_probe_page_policy.ts) · [`src/cli/setup_terminal_driver.ts`](../src/cli/setup_terminal_driver.ts) · [`src/cli/setup_question_renderer.ts`](../src/cli/setup_question_renderer.ts) · [`src/cli/setup_journey_presenter.ts`](../src/cli/setup_journey_presenter.ts) · [`src/cli/setup_plan_presenter.ts`](../src/cli/setup_plan_presenter.ts) · [`src/cli/setup_doctor_presenter.ts`](../src/cli/setup_doctor_presenter.ts) · [`src/cli/setup_prompt_rendering.ts`](../src/cli/setup_prompt_rendering.ts) · [`src/cli/setup_credential_prompt_adapter.ts`](../src/cli/setup_credential_prompt_adapter.ts) · [`src/cli/setup_credential_collection.ts`](../src/cli/setup_credential_collection.ts) · [`src/cli/commands/setup_execution.ts`](../src/cli/commands/setup_execution.ts) · [`src/cli/setup_token_permission_presenter.ts`](../src/cli/setup_token_permission_presenter.ts) · [`src/infrastructure/composition/setup_credentials_composition_root.ts`](../src/infrastructure/composition/setup_credentials_composition_root.ts) · [`src/infrastructure/composition/setup_token_permissions_composition_root.ts`](../src/infrastructure/composition/setup_token_permissions_composition_root.ts) · [`src/infrastructure/composition/setup_doctor_composition_root.ts`](../src/infrastructure/composition/setup_doctor_composition_root.ts) · [`scripts/coverage-budgets.json`](../scripts/coverage-budgets.json) · [`scripts/documentation_pat_exception_policy.cjs`](../scripts/documentation_pat_exception_policy.cjs) · [`scripts/validate-documentation-contract.cjs`](../scripts/validate-documentation-contract.cjs) · [`src/infrastructure/http_deadline.ts`](../src/infrastructure/http_deadline.ts) · [`src/infrastructure/setup_permission_denial.ts`](../src/infrastructure/setup_permission_denial.ts) · [`src/infrastructure/setup_permission_read_probe.ts`](../src/infrastructure/setup_permission_read_probe.ts) · [`src/infrastructure/setup_permission_read_evidence.ts`](../src/infrastructure/setup_permission_read_evidence.ts) · [`src/infrastructure/setup_permission_read_shape.ts`](../src/infrastructure/setup_permission_read_shape.ts) · [`src/infrastructure/setup_permission_projects_read.ts`](../src/infrastructure/setup_permission_projects_read.ts) · [`src/infrastructure/setup_permission_projects_access.ts`](../src/infrastructure/setup_permission_projects_access.ts) · [`src/infrastructure/setup_permission_workflow_cleanup.ts`](../src/infrastructure/setup_permission_workflow_cleanup.ts) · [`src/infrastructure/setup_permission_project_cleanup.ts`](../src/infrastructure/setup_permission_project_cleanup.ts) · [`src/infrastructure/setup_permission_probe_http.ts`](../src/infrastructure/setup_permission_probe_http.ts) · [`src/infrastructure/setup_permission_pull_request_probe.ts`](../src/infrastructure/setup_permission_pull_request_probe.ts) · [`src/infrastructure/git_authentication_environment.ts`](../src/infrastructure/git_authentication_environment.ts) · [`src/actions/github_action_input.ts`](../src/actions/github_action_input.ts) · [`src/infrastructure/setup_github_identity_query_adapter.ts`](../src/infrastructure/setup_github_identity_query_adapter.ts) · [`src/infrastructure/github_secret_encryption.ts`](../src/infrastructure/github_secret_encryption.ts) · [`src/infrastructure/setup_permission_organization_owner.ts`](../src/infrastructure/setup_permission_organization_owner.ts) · [`src/data/repository/github/github_actions_resource_inspector.ts`](../src/data/repository/github/github_actions_resource_inspector.ts) · [`src/data/repository/github/github_actions_resource_commands.ts`](../src/data/repository/github/github_actions_resource_commands.ts) · [`src/data/repository/github/github_actions_resource_collection.ts`](../src/data/repository/github/github_actions_resource_collection.ts) · [`src/application/usecases/setup/resolve_setup_workflow_pat_conflict_use_case.ts`](../src/application/usecases/setup/resolve_setup_workflow_pat_conflict_use_case.ts) · [`src/cli/setup_workflow_pat_storage_copy.ts`](../src/cli/setup_workflow_pat_storage_copy.ts) · [`src/cli/commands/setup_policy.ts`](../src/cli/commands/setup_policy.ts) · [`src/application/usecases/execution/execution_issue_number_policy.ts`](../src/application/usecases/execution/execution_issue_number_policy.ts) · [`src/application/usecases/execution/setup_execution_workflow.ts`](../src/application/usecases/execution/setup_execution_workflow.ts) · [`src/domain/github_runtime_doctor.ts`](../src/domain/github_runtime_doctor.ts) · [`src/domain/copilot_command.ts`](../src/domain/copilot_command.ts) · [`src/application/usecases/comment_automation_command_workflow.ts`](../src/application/usecases/comment_automation_command_workflow.ts) · [`src/application/policies/copilot_interaction_policy.ts`](../src/application/policies/copilot_interaction_policy.ts) · [`src/application/policies/publication_message_catalog.ts`](../src/application/policies/publication_message_catalog.ts) · [`src/application/ports/github_runtime_doctor_ports.ts`](../src/application/ports/github_runtime_doctor_ports.ts) · [`src/application/policies/github_runtime_doctor_policy.ts`](../src/application/policies/github_runtime_doctor_policy.ts) · [`src/application/policies/doctor_workflow_condition_policy.ts`](../src/application/policies/doctor_workflow_condition_policy.ts) · [`src/application/policies/github_runtime_doctor_presentation_policy.ts`](../src/application/policies/github_runtime_doctor_presentation_policy.ts) · [`src/application/usecases/read_copilot_doctor_workflow.ts`](../src/application/usecases/read_copilot_doctor_workflow.ts) · [`src/data/repository/github/runtime_doctor_repository.ts`](../src/data/repository/github/runtime_doctor_repository.ts) · [`src/infrastructure/composition/github_runtime_doctor_composition_root.ts`](../src/infrastructure/composition/github_runtime_doctor_composition_root.ts) · [`src/application/policies/agent_activity_policy.ts`](../src/application/policies/agent_activity_policy.ts) · [`src/application/policies/doctor_workflow_matrix_policy.ts`](../src/application/policies/doctor_workflow_matrix_policy.ts) · [`src/application/contracts/setup_batch_view.ts`](../src/application/contracts/setup_batch_view.ts) · [`src/application/policies/issue_resource_input_policy.ts`](../src/application/policies/issue_resource_input_policy.ts) · [`src/application/policies/setup_batch_access_policy.ts`](../src/application/policies/setup_batch_access_policy.ts) · [`src/application/policies/setup_batch_policy.ts`](../src/application/policies/setup_batch_policy.ts) · [`src/application/policies/setup_batch_retry_policy.ts`](../src/application/policies/setup_batch_retry_policy.ts) · [`src/application/policies/setup_batch_selection_policy.ts`](../src/application/policies/setup_batch_selection_policy.ts) · [`src/application/policies/setup_batch_view_policy.ts`](../src/application/policies/setup_batch_view_policy.ts) · [`src/application/policies/setup_credential_binding_policy.ts`](../src/application/policies/setup_credential_binding_policy.ts) · [`src/application/policies/setup_organization_import_policy.ts`](../src/application/policies/setup_organization_import_policy.ts) · [`src/application/policies/setup_organization_variable_bindings.ts`](../src/application/policies/setup_organization_variable_bindings.ts) · [`src/application/policies/setup_organization_variable_reuse_policy.ts`](../src/application/policies/setup_organization_variable_reuse_policy.ts) · [`src/application/ports/setup_batch_ports.ts`](../src/application/ports/setup_batch_ports.ts) · [`src/application/usecases/setup/apply_setup_batch_use_case.ts`](../src/application/usecases/setup/apply_setup_batch_use_case.ts) · [`src/application/usecases/setup/configure_setup_batch_target_use_case.ts`](../src/application/usecases/setup/configure_setup_batch_target_use_case.ts) · [`src/application/usecases/setup/prepare_setup_batch_use_case.ts`](../src/application/usecases/setup/prepare_setup_batch_use_case.ts) · [`src/application/usecases/setup/select_setup_batch_targets_use_case.ts`](../src/application/usecases/setup/select_setup_batch_targets_use_case.ts) · [`src/application/usecases/setup/setup_batch_session_use_case.ts`](../src/application/usecases/setup/setup_batch_session_use_case.ts) · [`src/cli/setup_batch_adapter.ts`](../src/cli/setup_batch_adapter.ts) · [`src/cli/setup_source_adapter.ts`](../src/cli/setup_source_adapter.ts) · [`src/domain/setup_batch.ts`](../src/domain/setup_batch.ts) · [`src/domain/setup_credential_health.ts`](../src/domain/setup_credential_health.ts) · [`src/domain/setup_organization_reuse.ts`](../src/domain/setup_organization_reuse.ts) · [`src/infrastructure/composition/setup_batch_composition_root.ts`](../src/infrastructure/composition/setup_batch_composition_root.ts) · [`src/infrastructure/github/ports/github_setup_batch_protocol.ts`](../src/infrastructure/github/ports/github_setup_batch_protocol.ts) · [`src/infrastructure/github/ports/github_trusted_credential_health_protocol.ts`](../src/infrastructure/github/ports/github_trusted_credential_health_protocol.ts) · [`src/infrastructure/setup_batch_github_apply_adapter.ts`](../src/infrastructure/setup_batch_github_apply_adapter.ts) · [`src/infrastructure/setup_batch_github_read_adapter.ts`](../src/infrastructure/setup_batch_github_read_adapter.ts) · [`src/infrastructure/setup_batch_journal_adapter.ts`](../src/infrastructure/setup_batch_journal_adapter.ts) · [`src/infrastructure/setup_batch_workspace_adapter.ts`](../src/infrastructure/setup_batch_workspace_adapter.ts) · [`src/infrastructure/setup_trusted_credential_health_adapter.ts`](../src/infrastructure/setup_trusted_credential_health_adapter.ts) · [`src/application/policies/setup_remote_facts_policy.ts`](../src/application/policies/setup_remote_facts_policy.ts) · [`src/cli/setup_confirmation_adapter.ts`](../src/cli/setup_confirmation_adapter.ts) · [`src/cli/web_setup_adapters.ts`](../src/cli/web_setup_adapters.ts) · [`scripts/validate-agent-documentation.cjs`](../scripts/validate-agent-documentation.cjs) · [`src/utils/setup_workflow_upgrade.ts`](../src/utils/setup_workflow_upgrade.ts) -- Tests: [`src/data/repository/__tests__/repository_version_tags_query_repository.test.ts`](../src/data/repository/__tests__/repository_version_tags_query_repository.test.ts) · [`src/cli/__tests__/setup_command_options.test.ts`](../src/cli/__tests__/setup_command_options.test.ts) · [`src/data/repository/__tests__/setup_variable_write_failures.test.ts`](../src/data/repository/__tests__/setup_variable_write_failures.test.ts) · [`src/infrastructure/composition/__tests__/initial_setup_composition_root.test.ts`](../src/infrastructure/composition/__tests__/initial_setup_composition_root.test.ts) · [`src/application/policies/__tests__/setup_questionnaire_policy.test.ts`](../src/application/policies/__tests__/setup_questionnaire_policy.test.ts) · [`src/application/policies/__tests__/setup_configuration_policy.test.ts`](../src/application/policies/__tests__/setup_configuration_policy.test.ts) · [`src/application/policies/__tests__/setup_token_permission_policy.test.ts`](../src/application/policies/__tests__/setup_token_permission_policy.test.ts) · [`src/application/policies/__tests__/setup_remote_facts_policy.test.ts`](../src/application/policies/__tests__/setup_remote_facts_policy.test.ts) · [`src/application/policies/__tests__/setup_doctor_message_catalog.test.ts`](../src/application/policies/__tests__/setup_doctor_message_catalog.test.ts) · [`src/application/policies/__tests__/setup_doctor_report_policy.test.ts`](../src/application/policies/__tests__/setup_doctor_report_policy.test.ts) · [`src/application/usecases/setup/__tests__/setup_questionnaire_controller.test.ts`](../src/application/usecases/setup/__tests__/setup_questionnaire_controller.test.ts) · [`src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_journey_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_journey_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_session_coordinator.test.ts`](../src/application/usecases/setup/__tests__/setup_session_coordinator.test.ts) · [`src/application/usecases/setup/__tests__/setup_credentials_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_credentials_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_token_permissions_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_token_permissions_use_case.test.ts) · [`src/application/usecases/setup/__tests__/doctor_use_case.test.ts`](../src/application/usecases/setup/__tests__/doctor_use_case.test.ts) · [`src/application/usecases/setup/__tests__/merge_queue_readiness_use_case.test.ts`](../src/application/usecases/setup/__tests__/merge_queue_readiness_use_case.test.ts) · [`src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts`](../src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts) · [`src/application/usecases/actions/__tests__/setup_resource_provisioning.test.ts`](../src/application/usecases/actions/__tests__/setup_resource_provisioning.test.ts) · [`src/infrastructure/__tests__/setup_workspace_adapter.test.ts`](../src/infrastructure/__tests__/setup_workspace_adapter.test.ts) · [`src/infrastructure/__tests__/setup_remote_credential_health_adapter.test.ts`](../src/infrastructure/__tests__/setup_remote_credential_health_adapter.test.ts) · [`src/infrastructure/__tests__/setup_token_permission_query_adapter.test.ts`](../src/infrastructure/__tests__/setup_token_permission_query_adapter.test.ts) · [`src/infrastructure/__tests__/setup_permission_resource_probes.test.ts`](../src/infrastructure/__tests__/setup_permission_resource_probes.test.ts) · [`src/infrastructure/__tests__/setup_projects_probe_page_policy.test.ts`](../src/infrastructure/__tests__/setup_projects_probe_page_policy.test.ts) · [`src/infrastructure/composition/__tests__/setup_token_permissions_composition_root.test.ts`](../src/infrastructure/composition/__tests__/setup_token_permissions_composition_root.test.ts) · [`src/data/repository/__tests__/repository_variables_repository.test.ts`](../src/data/repository/__tests__/repository_variables_repository.test.ts) · [`src/cli/__tests__/setup_presenters.test.ts`](../src/cli/__tests__/setup_presenters.test.ts) · [`src/cli/__tests__/setup_journey_presenter.test.ts`](../src/cli/__tests__/setup_journey_presenter.test.ts) · [`src/cli/__tests__/setup_prompt_rendering.test.ts`](../src/cli/__tests__/setup_prompt_rendering.test.ts) · [`src/cli/__tests__/setup_token_permission_presenter.test.ts`](../src/cli/__tests__/setup_token_permission_presenter.test.ts) · [`src/__tests__/cli.test.ts`](../src/__tests__/cli.test.ts) · [`src/cli/__tests__/setup_terminal_driver.test.ts`](../src/cli/__tests__/setup_terminal_driver.test.ts) · [`src/architecture/__tests__/setup_doctor_boundaries.test.ts`](../src/architecture/__tests__/setup_doctor_boundaries.test.ts) · [`src/tooling/__tests__/documentation_pat_exception_policy.test.ts`](../src/tooling/__tests__/documentation_pat_exception_policy.test.ts) · [`src/infrastructure/__tests__/setup_pat_audit.test.ts`](../src/infrastructure/__tests__/setup_pat_audit.test.ts) · [`src/infrastructure/__tests__/setup_permission_projects_access.test.ts`](../src/infrastructure/__tests__/setup_permission_projects_access.test.ts) · [`src/infrastructure/__tests__/setup_credential_validation_adapter.test.ts`](../src/infrastructure/__tests__/setup_credential_validation_adapter.test.ts) · [`src/infrastructure/__tests__/setup_github_identity_query_adapter.test.ts`](../src/infrastructure/__tests__/setup_github_identity_query_adapter.test.ts) · [`src/infrastructure/__tests__/git_commit_adapter.test.ts`](../src/infrastructure/__tests__/git_commit_adapter.test.ts) · [`src/actions/__tests__/github_action_input.test.ts`](../src/actions/__tests__/github_action_input.test.ts) · [`src/infrastructure/__tests__/setup_permission_cleanup_contract.test.ts`](../src/infrastructure/__tests__/setup_permission_cleanup_contract.test.ts) · [`src/infrastructure/__tests__/setup_permission_actions_cleanup_timing.test.ts`](../src/infrastructure/__tests__/setup_permission_actions_cleanup_timing.test.ts) · [`src/infrastructure/__tests__/setup_permission_operator_actions.test.ts`](../src/infrastructure/__tests__/setup_permission_operator_actions.test.ts) · [`src/infrastructure/__tests__/setup_permission_journal_contract.test.ts`](../src/infrastructure/__tests__/setup_permission_journal_contract.test.ts) · [`src/infrastructure/__tests__/setup_permission_audit_transactions.test.ts`](../src/infrastructure/__tests__/setup_permission_audit_transactions.test.ts) · [`src/infrastructure/__tests__/setup_permission_write_failures.test.ts`](../src/infrastructure/__tests__/setup_permission_write_failures.test.ts) · [`src/infrastructure/__tests__/setup_permission_resource_failures.test.ts`](../src/infrastructure/__tests__/setup_permission_resource_failures.test.ts) · [`src/infrastructure/__tests__/setup_permission_boundary_failures.test.ts`](../src/infrastructure/__tests__/setup_permission_boundary_failures.test.ts) · [`src/infrastructure/__tests__/github_secret_encryption.test.ts`](../src/infrastructure/__tests__/github_secret_encryption.test.ts) · [`src/infrastructure/__tests__/setup_permission_organization_owner.test.ts`](../src/infrastructure/__tests__/setup_permission_organization_owner.test.ts) · [`src/infrastructure/__tests__/setup_pat_bootstrap_transactions.test.ts`](../src/infrastructure/__tests__/setup_pat_bootstrap_transactions.test.ts) · [`src/data/repository/__tests__/repository_actions_sdk_contract.integration.test.ts`](../src/data/repository/__tests__/repository_actions_sdk_contract.integration.test.ts) · [`src/data/repository/__tests__/repository_actions_resource_edge_cases.test.ts`](../src/data/repository/__tests__/repository_actions_resource_edge_cases.test.ts) · [`src/data/repository/__tests__/repository_selected_resource_grants.test.ts`](../src/data/repository/__tests__/repository_selected_resource_grants.test.ts) · [`src/infrastructure/__tests__/setup_permission_read_contract.test.ts`](../src/infrastructure/__tests__/setup_permission_read_contract.test.ts) · [`src/application/usecases/setup/__tests__/setup_workflow_pat_conflict.test.ts`](../src/application/usecases/setup/__tests__/setup_workflow_pat_conflict.test.ts) · [`src/application/usecases/setup/__tests__/setup_workflow_pat_credential_rotation.test.ts`](../src/application/usecases/setup/__tests__/setup_workflow_pat_credential_rotation.test.ts) · [`src/data/repository/__tests__/setup_organization_pat_inventory.test.ts`](../src/data/repository/__tests__/setup_organization_pat_inventory.test.ts) · [`src/cli/__tests__/web_setup_bot_pat_scope_conflict.test.ts`](../src/cli/__tests__/web_setup_bot_pat_scope_conflict.test.ts) · [`src/actions/__tests__/local_setup_apply_contract.test.ts`](../src/actions/__tests__/local_setup_apply_contract.test.ts) · [`src/cli/commands/__tests__/setup_policy.test.ts`](../src/cli/commands/__tests__/setup_policy.test.ts) · [`src/application/usecases/execution/__tests__/execution_issue_number_policy.test.ts`](../src/application/usecases/execution/__tests__/execution_issue_number_policy.test.ts) · [`src/application/usecases/execution/__tests__/setup_execution_workflow.test.ts`](../src/application/usecases/execution/__tests__/setup_execution_workflow.test.ts) · [`src/domain/__tests__/github_runtime_doctor.test.ts`](../src/domain/__tests__/github_runtime_doctor.test.ts) · [`src/domain/__tests__/copilot_command.test.ts`](../src/domain/__tests__/copilot_command.test.ts) · [`src/application/usecases/__tests__/comment_automation_use_case.test.ts`](../src/application/usecases/__tests__/comment_automation_use_case.test.ts) · [`src/application/policies/__tests__/github_runtime_doctor_policy.test.ts`](../src/application/policies/__tests__/github_runtime_doctor_policy.test.ts) · [`src/application/policies/__tests__/doctor_workflow_condition_policy.test.ts`](../src/application/policies/__tests__/doctor_workflow_condition_policy.test.ts) · [`src/application/policies/__tests__/github_runtime_doctor_presentation_policy.test.ts`](../src/application/policies/__tests__/github_runtime_doctor_presentation_policy.test.ts) · [`src/application/usecases/__tests__/read_copilot_doctor_workflow.test.ts`](../src/application/usecases/__tests__/read_copilot_doctor_workflow.test.ts) · [`src/application/usecases/__tests__/runtime_doctor_security_integration.test.ts`](../src/application/usecases/__tests__/runtime_doctor_security_integration.test.ts) · [`src/data/repository/github/__tests__/runtime_doctor_repository.test.ts`](../src/data/repository/github/__tests__/runtime_doctor_repository.test.ts) · [`src/infrastructure/composition/__tests__/github_runtime_doctor_composition_root.test.ts`](../src/infrastructure/composition/__tests__/github_runtime_doctor_composition_root.test.ts) · [`src/application/policies/__tests__/runtime_doctor_agent_activity.test.ts`](../src/application/policies/__tests__/runtime_doctor_agent_activity.test.ts) · [`src/application/policies/__tests__/doctor_workflow_matrix_policy.test.ts`](../src/application/policies/__tests__/doctor_workflow_matrix_policy.test.ts) · [`src/application/policies/__tests__/setup_approval_operator_permissions.test.ts`](../src/application/policies/__tests__/setup_approval_operator_permissions.test.ts) · [`src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts`](../src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts) · [`src/application/policies/__tests__/setup_batch_permission_policy.test.ts`](../src/application/policies/__tests__/setup_batch_permission_policy.test.ts) · [`src/application/policies/__tests__/setup_batch_policy.test.ts`](../src/application/policies/__tests__/setup_batch_policy.test.ts) · [`src/application/policies/__tests__/setup_batch_retry_policy.test.ts`](../src/application/policies/__tests__/setup_batch_retry_policy.test.ts) · [`src/application/policies/__tests__/setup_batch_selection_policy.test.ts`](../src/application/policies/__tests__/setup_batch_selection_policy.test.ts) · [`src/application/policies/__tests__/setup_organization_approval_draft.test.ts`](../src/application/policies/__tests__/setup_organization_approval_draft.test.ts) · [`src/application/policies/__tests__/setup_organization_import_policy.test.ts`](../src/application/policies/__tests__/setup_organization_import_policy.test.ts) · [`src/application/policies/__tests__/setup_organization_import_safety.test.ts`](../src/application/policies/__tests__/setup_organization_import_safety.test.ts) · [`src/application/policies/__tests__/setup_organization_variable_reuse_policy.test.ts`](../src/application/policies/__tests__/setup_organization_variable_reuse_policy.test.ts) · [`src/application/usecases/actions/__tests__/setup_organization_reuse_provisioning.test.ts`](../src/application/usecases/actions/__tests__/setup_organization_reuse_provisioning.test.ts) · [`src/application/usecases/setup/__tests__/apply_setup_batch_use_case.test.ts`](../src/application/usecases/setup/__tests__/apply_setup_batch_use_case.test.ts) · [`src/application/usecases/setup/__tests__/select_setup_batch_targets_use_case.test.ts`](../src/application/usecases/setup/__tests__/select_setup_batch_targets_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_batch_flow.test.ts`](../src/application/usecases/setup/__tests__/setup_batch_flow.test.ts) · [`src/application/usecases/setup/__tests__/setup_organization_import_wizard.test.ts`](../src/application/usecases/setup/__tests__/setup_organization_import_wizard.test.ts) · [`src/application/usecases/setup/__tests__/setup_organization_secret_reuse.test.ts`](../src/application/usecases/setup/__tests__/setup_organization_secret_reuse.test.ts) · [`src/cli/__tests__/setup_source_adapter.test.ts`](../src/cli/__tests__/setup_source_adapter.test.ts) · [`src/cli/__tests__/web_setup_batch_components.test.ts`](../src/cli/__tests__/web_setup_batch_components.test.ts) · [`src/cli/__tests__/web_setup_batch_selection.test.ts`](../src/cli/__tests__/web_setup_batch_selection.test.ts) · [`src/infrastructure/__tests__/setup_batch_github_apply_adapter.test.ts`](../src/infrastructure/__tests__/setup_batch_github_apply_adapter.test.ts) · [`src/infrastructure/__tests__/setup_batch_github_read_adapter.test.ts`](../src/infrastructure/__tests__/setup_batch_github_read_adapter.test.ts) · [`src/infrastructure/__tests__/setup_batch_local_adapters.test.ts`](../src/infrastructure/__tests__/setup_batch_local_adapters.test.ts) · [`src/infrastructure/__tests__/setup_reuse_empty_collections.integration.test.ts`](../src/infrastructure/__tests__/setup_reuse_empty_collections.integration.test.ts) · [`src/infrastructure/__tests__/setup_trusted_credential_health_adapter.test.ts`](../src/infrastructure/__tests__/setup_trusted_credential_health_adapter.test.ts) · [`src/infrastructure/__tests__/setup_trusted_health_sdk_contract.integration.test.ts`](../src/infrastructure/__tests__/setup_trusted_health_sdk_contract.integration.test.ts) · [`src/application/policies/__tests__/setup_batch_access_and_view.test.ts`](../src/application/policies/__tests__/setup_batch_access_and_view.test.ts) · [`src/cli/__tests__/setup_batch_adapter.test.ts`](../src/cli/__tests__/setup_batch_adapter.test.ts) · [`src/infrastructure/__tests__/setup_batch_composition.test.ts`](../src/infrastructure/__tests__/setup_batch_composition.test.ts) · [`src/infrastructure/__tests__/setup_batch_guidance_compatibility.test.ts`](../src/infrastructure/__tests__/setup_batch_guidance_compatibility.test.ts) · [`src/utils/__tests__/setup_workflow_upgrade.test.ts`](../src/utils/__tests__/setup_workflow_upgrade.test.ts) · [`src/cli/__tests__/setup_pat_intent_adapter.test.ts`](../src/cli/__tests__/setup_pat_intent_adapter.test.ts) · [`src/application/usecases/__tests__/push_single_action_contexts.test.ts`](../src/application/usecases/__tests__/push_single_action_contexts.test.ts) +- Core code: [`src/domain/setup.ts`](../src/domain/setup.ts) · [`src/domain/setup_questionnaire.ts`](../src/domain/setup_questionnaire.ts) · [`src/domain/setup_token_permissions.ts`](../src/domain/setup_token_permissions.ts) · [`src/application/ports/setup_terminal_ports.ts`](../src/application/ports/setup_terminal_ports.ts) · [`src/application/ports/setup_wizard_ports.ts`](../src/application/ports/setup_wizard_ports.ts) · [`src/application/ports/branch_tag_ports.ts`](../src/application/ports/branch_tag_ports.ts) · [`src/application/policies/setup_issue_workflow_policy.ts`](../src/application/policies/setup_issue_workflow_policy.ts) · [`src/data/repository/release/repository_version_tags_query_repository.ts`](../src/data/repository/release/repository_version_tags_query_repository.ts) · [`src/application/ports/setup_token_permission_ports.ts`](../src/application/ports/setup_token_permission_ports.ts) · [`src/application/policies/setup_token_permission_evidence_policy.ts`](../src/application/policies/setup_token_permission_evidence_policy.ts) · [`src/application/policies/setup_token_permission_policy.ts`](../src/application/policies/setup_token_permission_policy.ts) · [`src/application/policies/setup_questionnaire_policy.ts`](../src/application/policies/setup_questionnaire_policy.ts) · [`src/application/policies/setup_configuration_plan.ts`](../src/application/policies/setup_configuration_plan.ts) · [`src/application/policies/merge_setup_overrides_policy.ts`](../src/application/policies/merge_setup_overrides_policy.ts) · [`src/application/policies/setup_configuration_storage_policy.ts`](../src/application/policies/setup_configuration_storage_policy.ts) · [`src/application/policies/setup_doctor_message_catalog.ts`](../src/application/policies/setup_doctor_message_catalog.ts) · [`src/application/policies/setup_doctor_report_policy.ts`](../src/application/policies/setup_doctor_report_policy.ts) · [`src/application/policies/setup_journey_policy.ts`](../src/application/policies/setup_journey_policy.ts) · [`src/application/policies/setup_permission_summary_policy.ts`](../src/application/policies/setup_permission_summary_policy.ts) · [`src/application/usecases/setup/setup_wizard_use_case.ts`](../src/application/usecases/setup/setup_wizard_use_case.ts) · [`src/application/usecases/setup/setup_journey_use_case.ts`](../src/application/usecases/setup/setup_journey_use_case.ts) · [`src/application/usecases/setup/setup_session_coordinator.ts`](../src/application/usecases/setup/setup_session_coordinator.ts) · [`src/application/usecases/setup/setup_questionnaire_controller.ts`](../src/application/usecases/setup/setup_questionnaire_controller.ts) · [`src/application/usecases/setup/setup_credentials_use_case.ts`](../src/application/usecases/setup/setup_credentials_use_case.ts) · [`src/application/usecases/setup/setup_token_permissions_use_case.ts`](../src/application/usecases/setup/setup_token_permissions_use_case.ts) · [`src/application/usecases/setup/doctor_use_case.ts`](../src/application/usecases/setup/doctor_use_case.ts) · [`src/application/usecases/setup/merge_queue_readiness_use_case.ts`](../src/application/usecases/setup/merge_queue_readiness_use_case.ts) · [`src/application/usecases/actions/initial_setup_workflow.ts`](../src/application/usecases/actions/initial_setup_workflow.ts) · [`src/application/usecases/actions/setup_resource_provisioning.ts`](../src/application/usecases/actions/setup_resource_provisioning.ts) · [`src/application/ports/message_catalog_ports.ts`](../src/application/ports/message_catalog_ports.ts) · [`src/application/usecases/localization/resolve_message_catalog_use_case.ts`](../src/application/usecases/localization/resolve_message_catalog_use_case.ts) · [`src/application/policies/setup_configuration_validation.ts`](../src/application/policies/setup_configuration_validation.ts) · [`src/infrastructure/setup_workspace_adapter.ts`](../src/infrastructure/setup_workspace_adapter.ts) · [`src/data/repository/repository_variables_repository.ts`](../src/data/repository/repository_variables_repository.ts) · [`src/infrastructure/github/ports/github_repository_variables_protocol.ts`](../src/infrastructure/github/ports/github_repository_variables_protocol.ts) · [`src/infrastructure/setup_remote_credential_health_adapter.ts`](../src/infrastructure/setup_remote_credential_health_adapter.ts) · [`src/infrastructure/setup_credential_validation_adapter.ts`](../src/infrastructure/setup_credential_validation_adapter.ts) · [`src/infrastructure/setup_token_permission_query_adapter.ts`](../src/infrastructure/setup_token_permission_query_adapter.ts) · [`src/infrastructure/setup_permission_actions_probe.ts`](../src/infrastructure/setup_permission_actions_probe.ts) · [`src/infrastructure/setup_permission_issue_probe.ts`](../src/infrastructure/setup_permission_issue_probe.ts) · [`src/infrastructure/setup_permission_issue_cleanup.ts`](../src/infrastructure/setup_permission_issue_cleanup.ts) · [`src/infrastructure/setup_permission_probe_journal.ts`](../src/infrastructure/setup_permission_probe_journal.ts) · [`src/infrastructure/setup_permission_probe_transaction.ts`](../src/infrastructure/setup_permission_probe_transaction.ts) · [`src/infrastructure/setup_permission_resource_probes.ts`](../src/infrastructure/setup_permission_resource_probes.ts) · [`src/infrastructure/setup_projects_probe_page_policy.ts`](../src/infrastructure/setup_projects_probe_page_policy.ts) · [`src/cli/setup_terminal_driver.ts`](../src/cli/setup_terminal_driver.ts) · [`src/cli/setup_question_renderer.ts`](../src/cli/setup_question_renderer.ts) · [`src/cli/setup_journey_presenter.ts`](../src/cli/setup_journey_presenter.ts) · [`src/cli/setup_plan_presenter.ts`](../src/cli/setup_plan_presenter.ts) · [`src/cli/setup_doctor_presenter.ts`](../src/cli/setup_doctor_presenter.ts) · [`src/cli/setup_prompt_rendering.ts`](../src/cli/setup_prompt_rendering.ts) · [`src/cli/setup_credential_prompt_adapter.ts`](../src/cli/setup_credential_prompt_adapter.ts) · [`src/cli/setup_credential_collection.ts`](../src/cli/setup_credential_collection.ts) · [`src/cli/commands/setup_execution.ts`](../src/cli/commands/setup_execution.ts) · [`src/cli/setup_token_permission_presenter.ts`](../src/cli/setup_token_permission_presenter.ts) · [`src/infrastructure/composition/setup_credentials_composition_root.ts`](../src/infrastructure/composition/setup_credentials_composition_root.ts) · [`src/infrastructure/composition/setup_token_permissions_composition_root.ts`](../src/infrastructure/composition/setup_token_permissions_composition_root.ts) · [`src/infrastructure/composition/setup_doctor_composition_root.ts`](../src/infrastructure/composition/setup_doctor_composition_root.ts) · [`scripts/coverage-budgets.json`](../scripts/coverage-budgets.json) · [`scripts/documentation_pat_exception_policy.cjs`](../scripts/documentation_pat_exception_policy.cjs) · [`scripts/validate-documentation-contract.cjs`](../scripts/validate-documentation-contract.cjs) · [`src/infrastructure/http_deadline.ts`](../src/infrastructure/http_deadline.ts) · [`src/infrastructure/setup_permission_denial.ts`](../src/infrastructure/setup_permission_denial.ts) · [`src/infrastructure/setup_permission_read_probe.ts`](../src/infrastructure/setup_permission_read_probe.ts) · [`src/infrastructure/setup_permission_read_evidence.ts`](../src/infrastructure/setup_permission_read_evidence.ts) · [`src/infrastructure/setup_permission_read_shape.ts`](../src/infrastructure/setup_permission_read_shape.ts) · [`src/infrastructure/setup_permission_projects_read.ts`](../src/infrastructure/setup_permission_projects_read.ts) · [`src/infrastructure/setup_permission_projects_access.ts`](../src/infrastructure/setup_permission_projects_access.ts) · [`src/infrastructure/setup_permission_workflow_cleanup.ts`](../src/infrastructure/setup_permission_workflow_cleanup.ts) · [`src/infrastructure/setup_permission_project_cleanup.ts`](../src/infrastructure/setup_permission_project_cleanup.ts) · [`src/infrastructure/setup_permission_probe_http.ts`](../src/infrastructure/setup_permission_probe_http.ts) · [`src/infrastructure/setup_permission_pull_request_probe.ts`](../src/infrastructure/setup_permission_pull_request_probe.ts) · [`src/infrastructure/git_authentication_environment.ts`](../src/infrastructure/git_authentication_environment.ts) · [`src/actions/github_action_input.ts`](../src/actions/github_action_input.ts) · [`src/infrastructure/setup_github_identity_query_adapter.ts`](../src/infrastructure/setup_github_identity_query_adapter.ts) · [`src/infrastructure/github_secret_encryption.ts`](../src/infrastructure/github_secret_encryption.ts) · [`src/infrastructure/setup_permission_organization_owner.ts`](../src/infrastructure/setup_permission_organization_owner.ts) · [`src/data/repository/github/github_actions_resource_inspector.ts`](../src/data/repository/github/github_actions_resource_inspector.ts) · [`src/data/repository/github/github_actions_resource_commands.ts`](../src/data/repository/github/github_actions_resource_commands.ts) · [`src/data/repository/github/github_actions_resource_collection.ts`](../src/data/repository/github/github_actions_resource_collection.ts) · [`src/application/usecases/setup/resolve_setup_workflow_pat_conflict_use_case.ts`](../src/application/usecases/setup/resolve_setup_workflow_pat_conflict_use_case.ts) · [`src/cli/setup_workflow_pat_storage_copy.ts`](../src/cli/setup_workflow_pat_storage_copy.ts) · [`src/cli/commands/setup_policy.ts`](../src/cli/commands/setup_policy.ts) · [`src/application/usecases/execution/execution_issue_number_policy.ts`](../src/application/usecases/execution/execution_issue_number_policy.ts) · [`src/application/usecases/execution/setup_execution_workflow.ts`](../src/application/usecases/execution/setup_execution_workflow.ts) · [`src/domain/github_runtime_doctor.ts`](../src/domain/github_runtime_doctor.ts) · [`src/domain/copilot_command.ts`](../src/domain/copilot_command.ts) · [`src/application/usecases/comment_automation_command_workflow.ts`](../src/application/usecases/comment_automation_command_workflow.ts) · [`src/application/policies/copilot_interaction_policy.ts`](../src/application/policies/copilot_interaction_policy.ts) · [`src/application/policies/publication_message_catalog.ts`](../src/application/policies/publication_message_catalog.ts) · [`src/application/ports/github_runtime_doctor_ports.ts`](../src/application/ports/github_runtime_doctor_ports.ts) · [`src/application/policies/github_runtime_doctor_policy.ts`](../src/application/policies/github_runtime_doctor_policy.ts) · [`src/application/policies/doctor_workflow_condition_policy.ts`](../src/application/policies/doctor_workflow_condition_policy.ts) · [`src/application/policies/github_runtime_doctor_presentation_policy.ts`](../src/application/policies/github_runtime_doctor_presentation_policy.ts) · [`src/application/usecases/read_copilot_doctor_workflow.ts`](../src/application/usecases/read_copilot_doctor_workflow.ts) · [`src/data/repository/github/runtime_doctor_repository.ts`](../src/data/repository/github/runtime_doctor_repository.ts) · [`src/infrastructure/composition/github_runtime_doctor_composition_root.ts`](../src/infrastructure/composition/github_runtime_doctor_composition_root.ts) · [`src/application/policies/agent_activity_policy.ts`](../src/application/policies/agent_activity_policy.ts) · [`src/application/policies/doctor_workflow_matrix_policy.ts`](../src/application/policies/doctor_workflow_matrix_policy.ts) · [`src/application/contracts/setup_batch_view.ts`](../src/application/contracts/setup_batch_view.ts) · [`src/application/policies/issue_resource_input_policy.ts`](../src/application/policies/issue_resource_input_policy.ts) · [`src/application/policies/setup_batch_access_policy.ts`](../src/application/policies/setup_batch_access_policy.ts) · [`src/application/policies/setup_batch_policy.ts`](../src/application/policies/setup_batch_policy.ts) · [`src/application/policies/setup_batch_retry_policy.ts`](../src/application/policies/setup_batch_retry_policy.ts) · [`src/application/policies/setup_batch_selection_policy.ts`](../src/application/policies/setup_batch_selection_policy.ts) · [`src/application/policies/setup_batch_view_policy.ts`](../src/application/policies/setup_batch_view_policy.ts) · [`src/application/policies/setup_credential_binding_policy.ts`](../src/application/policies/setup_credential_binding_policy.ts) · [`src/application/policies/setup_organization_import_policy.ts`](../src/application/policies/setup_organization_import_policy.ts) · [`src/application/policies/setup_organization_variable_bindings.ts`](../src/application/policies/setup_organization_variable_bindings.ts) · [`src/application/policies/setup_organization_variable_reuse_policy.ts`](../src/application/policies/setup_organization_variable_reuse_policy.ts) · [`src/application/ports/setup_batch_ports.ts`](../src/application/ports/setup_batch_ports.ts) · [`src/application/usecases/setup/apply_setup_batch_use_case.ts`](../src/application/usecases/setup/apply_setup_batch_use_case.ts) · [`src/application/usecases/setup/configure_setup_batch_target_use_case.ts`](../src/application/usecases/setup/configure_setup_batch_target_use_case.ts) · [`src/application/usecases/setup/prepare_setup_batch_use_case.ts`](../src/application/usecases/setup/prepare_setup_batch_use_case.ts) · [`src/application/usecases/setup/select_setup_batch_targets_use_case.ts`](../src/application/usecases/setup/select_setup_batch_targets_use_case.ts) · [`src/application/usecases/setup/setup_batch_session_use_case.ts`](../src/application/usecases/setup/setup_batch_session_use_case.ts) · [`src/cli/setup_batch_adapter.ts`](../src/cli/setup_batch_adapter.ts) · [`src/cli/setup_source_adapter.ts`](../src/cli/setup_source_adapter.ts) · [`src/domain/setup_batch.ts`](../src/domain/setup_batch.ts) · [`src/domain/setup_credential_health.ts`](../src/domain/setup_credential_health.ts) · [`src/domain/setup_organization_reuse.ts`](../src/domain/setup_organization_reuse.ts) · [`src/infrastructure/composition/setup_batch_composition_root.ts`](../src/infrastructure/composition/setup_batch_composition_root.ts) · [`src/infrastructure/github/ports/github_setup_batch_protocol.ts`](../src/infrastructure/github/ports/github_setup_batch_protocol.ts) · [`src/infrastructure/github/ports/github_trusted_credential_health_protocol.ts`](../src/infrastructure/github/ports/github_trusted_credential_health_protocol.ts) · [`src/infrastructure/setup_batch_github_apply_adapter.ts`](../src/infrastructure/setup_batch_github_apply_adapter.ts) · [`src/infrastructure/setup_batch_github_read_adapter.ts`](../src/infrastructure/setup_batch_github_read_adapter.ts) · [`src/infrastructure/setup_batch_journal_adapter.ts`](../src/infrastructure/setup_batch_journal_adapter.ts) · [`src/infrastructure/setup_batch_workspace_adapter.ts`](../src/infrastructure/setup_batch_workspace_adapter.ts) · [`src/infrastructure/setup_trusted_credential_health_adapter.ts`](../src/infrastructure/setup_trusted_credential_health_adapter.ts) · [`src/application/policies/setup_remote_facts_policy.ts`](../src/application/policies/setup_remote_facts_policy.ts) · [`src/cli/setup_confirmation_adapter.ts`](../src/cli/setup_confirmation_adapter.ts) · [`src/cli/web_setup_adapters.ts`](../src/cli/web_setup_adapters.ts) · [`scripts/validate-agent-documentation.cjs`](../scripts/validate-agent-documentation.cjs) · [`src/utils/setup_workflow_upgrade.ts`](../src/utils/setup_workflow_upgrade.ts) · [`src/domain/setup_runner.ts`](../src/domain/setup_runner.ts) · [`src/application/policies/setup_runner_policy.ts`](../src/application/policies/setup_runner_policy.ts) · [`src/application/policies/setup_runner_question_policy.ts`](../src/application/policies/setup_runner_question_policy.ts) · [`src/application/policies/setup_runner_guidance_policy.ts`](../src/application/policies/setup_runner_guidance_policy.ts) · [`src/application/ports/setup_runner_ports.ts`](../src/application/ports/setup_runner_ports.ts) · [`src/infrastructure/setup_runner_discovery_adapter.ts`](../src/infrastructure/setup_runner_discovery_adapter.ts) · [`src/infrastructure/composition/setup_runner_composition_root.ts`](../src/infrastructure/composition/setup_runner_composition_root.ts) · [`src/utils/setup_installation_review.ts`](../src/utils/setup_installation_review.ts) · [`src/cli/setup_installation_review_presenter.ts`](../src/cli/setup_installation_review_presenter.ts) · [`src/application/policies/setup_runner_installation_summary_policy.ts`](../src/application/policies/setup_runner_installation_summary_policy.ts) +- Tests: [`src/data/repository/__tests__/repository_version_tags_query_repository.test.ts`](../src/data/repository/__tests__/repository_version_tags_query_repository.test.ts) · [`src/cli/__tests__/setup_command_options.test.ts`](../src/cli/__tests__/setup_command_options.test.ts) · [`src/data/repository/__tests__/setup_variable_write_failures.test.ts`](../src/data/repository/__tests__/setup_variable_write_failures.test.ts) · [`src/infrastructure/composition/__tests__/initial_setup_composition_root.test.ts`](../src/infrastructure/composition/__tests__/initial_setup_composition_root.test.ts) · [`src/application/policies/__tests__/setup_questionnaire_policy.test.ts`](../src/application/policies/__tests__/setup_questionnaire_policy.test.ts) · [`src/application/policies/__tests__/setup_configuration_policy.test.ts`](../src/application/policies/__tests__/setup_configuration_policy.test.ts) · [`src/application/policies/__tests__/setup_token_permission_policy.test.ts`](../src/application/policies/__tests__/setup_token_permission_policy.test.ts) · [`src/application/policies/__tests__/setup_remote_facts_policy.test.ts`](../src/application/policies/__tests__/setup_remote_facts_policy.test.ts) · [`src/application/policies/__tests__/setup_doctor_message_catalog.test.ts`](../src/application/policies/__tests__/setup_doctor_message_catalog.test.ts) · [`src/application/policies/__tests__/setup_doctor_report_policy.test.ts`](../src/application/policies/__tests__/setup_doctor_report_policy.test.ts) · [`src/application/usecases/setup/__tests__/setup_questionnaire_controller.test.ts`](../src/application/usecases/setup/__tests__/setup_questionnaire_controller.test.ts) · [`src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_journey_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_journey_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_session_coordinator.test.ts`](../src/application/usecases/setup/__tests__/setup_session_coordinator.test.ts) · [`src/application/usecases/setup/__tests__/setup_credentials_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_credentials_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_token_permissions_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_token_permissions_use_case.test.ts) · [`src/application/usecases/setup/__tests__/doctor_use_case.test.ts`](../src/application/usecases/setup/__tests__/doctor_use_case.test.ts) · [`src/application/usecases/setup/__tests__/merge_queue_readiness_use_case.test.ts`](../src/application/usecases/setup/__tests__/merge_queue_readiness_use_case.test.ts) · [`src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts`](../src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts) · [`src/application/usecases/actions/__tests__/setup_resource_provisioning.test.ts`](../src/application/usecases/actions/__tests__/setup_resource_provisioning.test.ts) · [`src/infrastructure/__tests__/setup_workspace_adapter.test.ts`](../src/infrastructure/__tests__/setup_workspace_adapter.test.ts) · [`src/infrastructure/__tests__/setup_remote_credential_health_adapter.test.ts`](../src/infrastructure/__tests__/setup_remote_credential_health_adapter.test.ts) · [`src/infrastructure/__tests__/setup_token_permission_query_adapter.test.ts`](../src/infrastructure/__tests__/setup_token_permission_query_adapter.test.ts) · [`src/infrastructure/__tests__/setup_permission_resource_probes.test.ts`](../src/infrastructure/__tests__/setup_permission_resource_probes.test.ts) · [`src/infrastructure/__tests__/setup_projects_probe_page_policy.test.ts`](../src/infrastructure/__tests__/setup_projects_probe_page_policy.test.ts) · [`src/infrastructure/composition/__tests__/setup_token_permissions_composition_root.test.ts`](../src/infrastructure/composition/__tests__/setup_token_permissions_composition_root.test.ts) · [`src/data/repository/__tests__/repository_variables_repository.test.ts`](../src/data/repository/__tests__/repository_variables_repository.test.ts) · [`src/cli/__tests__/setup_presenters.test.ts`](../src/cli/__tests__/setup_presenters.test.ts) · [`src/cli/__tests__/setup_journey_presenter.test.ts`](../src/cli/__tests__/setup_journey_presenter.test.ts) · [`src/cli/__tests__/setup_prompt_rendering.test.ts`](../src/cli/__tests__/setup_prompt_rendering.test.ts) · [`src/cli/__tests__/setup_token_permission_presenter.test.ts`](../src/cli/__tests__/setup_token_permission_presenter.test.ts) · [`src/__tests__/cli.test.ts`](../src/__tests__/cli.test.ts) · [`src/cli/__tests__/setup_terminal_driver.test.ts`](../src/cli/__tests__/setup_terminal_driver.test.ts) · [`src/architecture/__tests__/setup_doctor_boundaries.test.ts`](../src/architecture/__tests__/setup_doctor_boundaries.test.ts) · [`src/tooling/__tests__/documentation_pat_exception_policy.test.ts`](../src/tooling/__tests__/documentation_pat_exception_policy.test.ts) · [`src/infrastructure/__tests__/setup_pat_audit.test.ts`](../src/infrastructure/__tests__/setup_pat_audit.test.ts) · [`src/infrastructure/__tests__/setup_permission_projects_access.test.ts`](../src/infrastructure/__tests__/setup_permission_projects_access.test.ts) · [`src/infrastructure/__tests__/setup_credential_validation_adapter.test.ts`](../src/infrastructure/__tests__/setup_credential_validation_adapter.test.ts) · [`src/infrastructure/__tests__/setup_github_identity_query_adapter.test.ts`](../src/infrastructure/__tests__/setup_github_identity_query_adapter.test.ts) · [`src/infrastructure/__tests__/git_commit_adapter.test.ts`](../src/infrastructure/__tests__/git_commit_adapter.test.ts) · [`src/actions/__tests__/github_action_input.test.ts`](../src/actions/__tests__/github_action_input.test.ts) · [`src/infrastructure/__tests__/setup_permission_cleanup_contract.test.ts`](../src/infrastructure/__tests__/setup_permission_cleanup_contract.test.ts) · [`src/infrastructure/__tests__/setup_permission_actions_cleanup_timing.test.ts`](../src/infrastructure/__tests__/setup_permission_actions_cleanup_timing.test.ts) · [`src/infrastructure/__tests__/setup_permission_operator_actions.test.ts`](../src/infrastructure/__tests__/setup_permission_operator_actions.test.ts) · [`src/infrastructure/__tests__/setup_permission_journal_contract.test.ts`](../src/infrastructure/__tests__/setup_permission_journal_contract.test.ts) · [`src/infrastructure/__tests__/setup_permission_audit_transactions.test.ts`](../src/infrastructure/__tests__/setup_permission_audit_transactions.test.ts) · [`src/infrastructure/__tests__/setup_permission_write_failures.test.ts`](../src/infrastructure/__tests__/setup_permission_write_failures.test.ts) · [`src/infrastructure/__tests__/setup_permission_resource_failures.test.ts`](../src/infrastructure/__tests__/setup_permission_resource_failures.test.ts) · [`src/infrastructure/__tests__/setup_permission_boundary_failures.test.ts`](../src/infrastructure/__tests__/setup_permission_boundary_failures.test.ts) · [`src/infrastructure/__tests__/github_secret_encryption.test.ts`](../src/infrastructure/__tests__/github_secret_encryption.test.ts) · [`src/infrastructure/__tests__/setup_permission_organization_owner.test.ts`](../src/infrastructure/__tests__/setup_permission_organization_owner.test.ts) · [`src/infrastructure/__tests__/setup_pat_bootstrap_transactions.test.ts`](../src/infrastructure/__tests__/setup_pat_bootstrap_transactions.test.ts) · [`src/data/repository/__tests__/repository_actions_sdk_contract.integration.test.ts`](../src/data/repository/__tests__/repository_actions_sdk_contract.integration.test.ts) · [`src/data/repository/__tests__/repository_actions_resource_edge_cases.test.ts`](../src/data/repository/__tests__/repository_actions_resource_edge_cases.test.ts) · [`src/data/repository/__tests__/repository_selected_resource_grants.test.ts`](../src/data/repository/__tests__/repository_selected_resource_grants.test.ts) · [`src/infrastructure/__tests__/setup_permission_read_contract.test.ts`](../src/infrastructure/__tests__/setup_permission_read_contract.test.ts) · [`src/application/usecases/setup/__tests__/setup_workflow_pat_conflict.test.ts`](../src/application/usecases/setup/__tests__/setup_workflow_pat_conflict.test.ts) · [`src/application/usecases/setup/__tests__/setup_workflow_pat_credential_rotation.test.ts`](../src/application/usecases/setup/__tests__/setup_workflow_pat_credential_rotation.test.ts) · [`src/data/repository/__tests__/setup_organization_pat_inventory.test.ts`](../src/data/repository/__tests__/setup_organization_pat_inventory.test.ts) · [`src/cli/__tests__/web_setup_bot_pat_scope_conflict.test.ts`](../src/cli/__tests__/web_setup_bot_pat_scope_conflict.test.ts) · [`src/actions/__tests__/local_setup_apply_contract.test.ts`](../src/actions/__tests__/local_setup_apply_contract.test.ts) · [`src/cli/commands/__tests__/setup_policy.test.ts`](../src/cli/commands/__tests__/setup_policy.test.ts) · [`src/application/usecases/execution/__tests__/execution_issue_number_policy.test.ts`](../src/application/usecases/execution/__tests__/execution_issue_number_policy.test.ts) · [`src/application/usecases/execution/__tests__/setup_execution_workflow.test.ts`](../src/application/usecases/execution/__tests__/setup_execution_workflow.test.ts) · [`src/domain/__tests__/github_runtime_doctor.test.ts`](../src/domain/__tests__/github_runtime_doctor.test.ts) · [`src/domain/__tests__/copilot_command.test.ts`](../src/domain/__tests__/copilot_command.test.ts) · [`src/application/usecases/__tests__/comment_automation_use_case.test.ts`](../src/application/usecases/__tests__/comment_automation_use_case.test.ts) · [`src/application/policies/__tests__/github_runtime_doctor_policy.test.ts`](../src/application/policies/__tests__/github_runtime_doctor_policy.test.ts) · [`src/application/policies/__tests__/doctor_workflow_condition_policy.test.ts`](../src/application/policies/__tests__/doctor_workflow_condition_policy.test.ts) · [`src/application/policies/__tests__/github_runtime_doctor_presentation_policy.test.ts`](../src/application/policies/__tests__/github_runtime_doctor_presentation_policy.test.ts) · [`src/application/usecases/__tests__/read_copilot_doctor_workflow.test.ts`](../src/application/usecases/__tests__/read_copilot_doctor_workflow.test.ts) · [`src/application/usecases/__tests__/runtime_doctor_security_integration.test.ts`](../src/application/usecases/__tests__/runtime_doctor_security_integration.test.ts) · [`src/data/repository/github/__tests__/runtime_doctor_repository.test.ts`](../src/data/repository/github/__tests__/runtime_doctor_repository.test.ts) · [`src/infrastructure/composition/__tests__/github_runtime_doctor_composition_root.test.ts`](../src/infrastructure/composition/__tests__/github_runtime_doctor_composition_root.test.ts) · [`src/application/policies/__tests__/runtime_doctor_agent_activity.test.ts`](../src/application/policies/__tests__/runtime_doctor_agent_activity.test.ts) · [`src/application/policies/__tests__/doctor_workflow_matrix_policy.test.ts`](../src/application/policies/__tests__/doctor_workflow_matrix_policy.test.ts) · [`src/application/policies/__tests__/setup_approval_operator_permissions.test.ts`](../src/application/policies/__tests__/setup_approval_operator_permissions.test.ts) · [`src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts`](../src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts) · [`src/application/policies/__tests__/setup_batch_permission_policy.test.ts`](../src/application/policies/__tests__/setup_batch_permission_policy.test.ts) · [`src/application/policies/__tests__/setup_batch_policy.test.ts`](../src/application/policies/__tests__/setup_batch_policy.test.ts) · [`src/application/policies/__tests__/setup_batch_retry_policy.test.ts`](../src/application/policies/__tests__/setup_batch_retry_policy.test.ts) · [`src/application/policies/__tests__/setup_batch_selection_policy.test.ts`](../src/application/policies/__tests__/setup_batch_selection_policy.test.ts) · [`src/application/policies/__tests__/setup_organization_approval_draft.test.ts`](../src/application/policies/__tests__/setup_organization_approval_draft.test.ts) · [`src/application/policies/__tests__/setup_organization_import_policy.test.ts`](../src/application/policies/__tests__/setup_organization_import_policy.test.ts) · [`src/application/policies/__tests__/setup_organization_import_safety.test.ts`](../src/application/policies/__tests__/setup_organization_import_safety.test.ts) · [`src/application/policies/__tests__/setup_organization_variable_reuse_policy.test.ts`](../src/application/policies/__tests__/setup_organization_variable_reuse_policy.test.ts) · [`src/application/usecases/actions/__tests__/setup_organization_reuse_provisioning.test.ts`](../src/application/usecases/actions/__tests__/setup_organization_reuse_provisioning.test.ts) · [`src/application/usecases/setup/__tests__/apply_setup_batch_use_case.test.ts`](../src/application/usecases/setup/__tests__/apply_setup_batch_use_case.test.ts) · [`src/application/usecases/setup/__tests__/select_setup_batch_targets_use_case.test.ts`](../src/application/usecases/setup/__tests__/select_setup_batch_targets_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_batch_flow.test.ts`](../src/application/usecases/setup/__tests__/setup_batch_flow.test.ts) · [`src/application/usecases/setup/__tests__/setup_organization_import_wizard.test.ts`](../src/application/usecases/setup/__tests__/setup_organization_import_wizard.test.ts) · [`src/application/usecases/setup/__tests__/setup_organization_secret_reuse.test.ts`](../src/application/usecases/setup/__tests__/setup_organization_secret_reuse.test.ts) · [`src/cli/__tests__/setup_source_adapter.test.ts`](../src/cli/__tests__/setup_source_adapter.test.ts) · [`src/cli/__tests__/web_setup_batch_components.test.ts`](../src/cli/__tests__/web_setup_batch_components.test.ts) · [`src/cli/__tests__/web_setup_batch_selection.test.ts`](../src/cli/__tests__/web_setup_batch_selection.test.ts) · [`src/infrastructure/__tests__/setup_batch_github_apply_adapter.test.ts`](../src/infrastructure/__tests__/setup_batch_github_apply_adapter.test.ts) · [`src/infrastructure/__tests__/setup_batch_github_read_adapter.test.ts`](../src/infrastructure/__tests__/setup_batch_github_read_adapter.test.ts) · [`src/infrastructure/__tests__/setup_batch_local_adapters.test.ts`](../src/infrastructure/__tests__/setup_batch_local_adapters.test.ts) · [`src/infrastructure/__tests__/setup_reuse_empty_collections.integration.test.ts`](../src/infrastructure/__tests__/setup_reuse_empty_collections.integration.test.ts) · [`src/infrastructure/__tests__/setup_trusted_credential_health_adapter.test.ts`](../src/infrastructure/__tests__/setup_trusted_credential_health_adapter.test.ts) · [`src/infrastructure/__tests__/setup_trusted_health_sdk_contract.integration.test.ts`](../src/infrastructure/__tests__/setup_trusted_health_sdk_contract.integration.test.ts) · [`src/application/policies/__tests__/setup_batch_access_and_view.test.ts`](../src/application/policies/__tests__/setup_batch_access_and_view.test.ts) · [`src/cli/__tests__/setup_batch_adapter.test.ts`](../src/cli/__tests__/setup_batch_adapter.test.ts) · [`src/infrastructure/__tests__/setup_batch_composition.test.ts`](../src/infrastructure/__tests__/setup_batch_composition.test.ts) · [`src/infrastructure/__tests__/setup_batch_guidance_compatibility.test.ts`](../src/infrastructure/__tests__/setup_batch_guidance_compatibility.test.ts) · [`src/utils/__tests__/setup_workflow_upgrade.test.ts`](../src/utils/__tests__/setup_workflow_upgrade.test.ts) · [`src/cli/__tests__/setup_pat_intent_adapter.test.ts`](../src/cli/__tests__/setup_pat_intent_adapter.test.ts) · [`src/application/usecases/__tests__/push_single_action_contexts.test.ts`](../src/application/usecases/__tests__/push_single_action_contexts.test.ts) · [`src/application/policies/__tests__/setup_runner_policy.test.ts`](../src/application/policies/__tests__/setup_runner_policy.test.ts) · [`src/application/policies/__tests__/setup_runner_question_policy.test.ts`](../src/application/policies/__tests__/setup_runner_question_policy.test.ts) · [`src/infrastructure/__tests__/setup_runner_discovery_adapter.test.ts`](../src/infrastructure/__tests__/setup_runner_discovery_adapter.test.ts) · [`src/utils/__tests__/setup_runner_installation.test.ts`](../src/utils/__tests__/setup_runner_installation.test.ts) · [`src/cli/__tests__/web_setup_runner_components.test.ts`](../src/cli/__tests__/web_setup_runner_components.test.ts) · [`src/application/policies/__tests__/setup_runner_installation_summary_policy.test.ts`](../src/application/policies/__tests__/setup_runner_installation_summary_policy.test.ts) · [`src/application/usecases/setup/__tests__/setup_runner_planning.test.ts`](../src/application/usecases/setup/__tests__/setup_runner_planning.test.ts) · [`src/cli/__tests__/setup_runner_config_file.test.ts`](../src/cli/__tests__/setup_runner_config_file.test.ts) · [`src/infrastructure/__tests__/setup_runner_composition.test.ts`](../src/infrastructure/__tests__/setup_runner_composition.test.ts) · [`src/tooling/__tests__/setup_provisioning_workflow.test.ts`](../src/tooling/__tests__/setup_provisioning_workflow.test.ts) - User documentation: [`README.md`](../README.md) · [`docs/how-to-use.mdx`](../docs/how-to-use.mdx) · [`docs/configuration.mdx`](../docs/configuration.mdx) · [`docs/configuration-checklist.mdx`](../docs/configuration-checklist.mdx) · [`docs/authentication.mdx`](../docs/authentication.mdx) · [`docs/development/architecture.mdx`](../docs/development/architecture.mdx) · [`docs/security-operations/operations/provisioning.mdx`](../docs/security-operations/operations/provisioning.mdx) · [`docs/security-operations/operations/troubleshooting.mdx`](../docs/security-operations/operations/troubleshooting.mdx) · [`docs/security-operations/security/credentials.mdx`](../docs/security-operations/security/credentials.mdx) · [`docs/single-actions/workflow-and-cli.mdx`](../docs/single-actions/workflow-and-cli.mdx) · [`docs/security-operations/operations/verification.mdx`](../docs/security-operations/operations/verification.mdx) · [`docs/development/setup-pat-provider-audit-2026-10-06.md`](../docs/development/setup-pat-provider-audit-2026-10-06.md) · [`docs/issues/comment-commands.mdx`](../docs/issues/comment-commands.mdx) ### `local-web-setup-assistant` — Local web setup assistant @@ -118,8 +118,8 @@ debt or convert unknown historic intent into a design decision. - Specifications: [`specs/local-web-setup-assistant.md`](./local-web-setup-assistant.md) · [`specs/setup-configuration-management.md`](./setup-configuration-management.md) - Workflows: [`.github/workflows/ci_check.yml`](../.github/workflows/ci_check.yml) · [`.github/workflows/repowise.yml`](../.github/workflows/repowise.yml) · [`.github/workflows/setup_platform_smoke.yml`](../.github/workflows/setup_platform_smoke.yml) · [`.github/workflows/copilot_pull_request_approval.yml`](../.github/workflows/copilot_pull_request_approval.yml) - Entrypoints: [`src/cli/commands/setup.ts`](../src/cli/commands/setup.ts) · [`package.json`](../package.json) · [`web/src/main.ts`](../web/src/main.ts) -- Core code: [`web/src/App.svelte`](../web/src/App.svelte) · [`web/src/session/setupSession.ts`](../web/src/session/setupSession.ts) · [`web/src/components/ActionButton.svelte`](../web/src/components/ActionButton.svelte) · [`web/src/components/PairingPanel.svelte`](../web/src/components/PairingPanel.svelte) · [`web/src/lib/pairingCode.ts`](../web/src/lib/pairingCode.ts) · [`web/src/components/ContextPanel.svelte`](../web/src/components/ContextPanel.svelte) · [`web/src/i18n/permissionEvidence.ts`](../web/src/i18n/permissionEvidence.ts) · [`web/src/i18n/permissionProgress.ts`](../web/src/i18n/permissionProgress.ts) · [`web/src/components/PermissionProgressPanel.svelte`](../web/src/components/PermissionProgressPanel.svelte) · [`web/src/components/PromptCard.svelte`](../web/src/components/PromptCard.svelte) · [`web/src/components/ResultPanel.svelte`](../web/src/components/ResultPanel.svelte) · [`web/src/components/SetupPatCorrectionPanel.svelte`](../web/src/components/SetupPatCorrectionPanel.svelte) · [`web/src/components/ResourceProgress.svelte`](../web/src/components/ResourceProgress.svelte) · [`web/src/components/PlanPrompt.svelte`](../web/src/components/PlanPrompt.svelte) · [`web/src/components/PlanDecisionSummary.svelte`](../web/src/components/PlanDecisionSummary.svelte) · [`web/src/components/QuestionPrompt.svelte`](../web/src/components/QuestionPrompt.svelte) · [`web/src/components/FixedWorkflowNotice.svelte`](../web/src/components/FixedWorkflowNotice.svelte) · [`web/src/components/QuestionGuidance.svelte`](../web/src/components/QuestionGuidance.svelte) · [`web/src/components/DiscoveryNotice.svelte`](../web/src/components/DiscoveryNotice.svelte) · [`web/src/components/ProducerSelector.svelte`](../web/src/components/ProducerSelector.svelte) · [`web/src/lib/manualProducerIdentity.ts`](../web/src/lib/manualProducerIdentity.ts) · [`web/src/components/CoverageCheckEvidence.svelte`](../web/src/components/CoverageCheckEvidence.svelte) · [`web/src/components/ProjectSelector.svelte`](../web/src/components/ProjectSelector.svelte) · [`web/src/i18n/catalog.ts`](../web/src/i18n/catalog.ts) · [`web/src/i18n/projectTransitions.ts`](../web/src/i18n/projectTransitions.ts) · [`web/src/i18n/permissionTerms.ts`](../web/src/i18n/permissionTerms.ts) · [`web/src/components/StatusBanner.svelte`](../web/src/components/StatusBanner.svelte) · [`web/src/lib/questionAnswer.ts`](../web/src/lib/questionAnswer.ts) · [`web/src/lib/githubLink.ts`](../web/src/lib/githubLink.ts) · [`web/src/lib/focusOnRevision.ts`](../web/src/lib/focusOnRevision.ts) · [`web/src/i18n/featureNames.ts`](../web/src/i18n/featureNames.ts) · [`web/src/i18n/agentRoleNames.ts`](../web/src/i18n/agentRoleNames.ts) · [`web/src/i18n/checkEvidence.ts`](../web/src/i18n/checkEvidence.ts) · [`web/src/styles/controls.css`](../web/src/styles/controls.css) · [`web/src/styles/tokens.css`](../web/src/styles/tokens.css) · [`web/src/style.css`](../web/src/style.css) · [`src/application/contracts/web_setup_view.ts`](../src/application/contracts/web_setup_view.ts) · [`src/application/ports/setup_terminal_ports.ts`](../src/application/ports/setup_terminal_ports.ts) · [`src/application/errors/setup_interaction_cancelled_error.ts`](../src/application/errors/setup_interaction_cancelled_error.ts) · [`src/application/policies/merge_setup_overrides_policy.ts`](../src/application/policies/merge_setup_overrides_policy.ts) · [`src/application/policies/setup_remote_facts_policy.ts`](../src/application/policies/setup_remote_facts_policy.ts) · [`src/application/usecases/setup/prepare_setup_pat_intent_use_case.ts`](../src/application/usecases/setup/prepare_setup_pat_intent_use_case.ts) · [`src/application/usecases/setup/audit_configured_setup_pat_use_case.ts`](../src/application/usecases/setup/audit_configured_setup_pat_use_case.ts) · [`src/infrastructure/setup_permission_actions_probe.ts`](../src/infrastructure/setup_permission_actions_probe.ts) · [`src/infrastructure/setup_permission_issue_probe.ts`](../src/infrastructure/setup_permission_issue_probe.ts) · [`src/infrastructure/setup_permission_issue_cleanup.ts`](../src/infrastructure/setup_permission_issue_cleanup.ts) · [`src/infrastructure/setup_permission_probe_journal.ts`](../src/infrastructure/setup_permission_probe_journal.ts) · [`src/infrastructure/setup_permission_probe_transaction.ts`](../src/infrastructure/setup_permission_probe_transaction.ts) · [`src/infrastructure/setup_permission_resource_probes.ts`](../src/infrastructure/setup_permission_resource_probes.ts) · [`src/application/usecases/setup/verify_web_setup_apply_use_case.ts`](../src/application/usecases/setup/verify_web_setup_apply_use_case.ts) · [`src/application/usecases/setup/setup_session_coordinator.ts`](../src/application/usecases/setup/setup_session_coordinator.ts) · [`src/application/usecases/setup/verify_setup_pat_bootstrap_use_case.ts`](../src/application/usecases/setup/verify_setup_pat_bootstrap_use_case.ts) · [`src/cli_context.ts`](../src/cli_context.ts) · [`src/cli/setup_command_options.ts`](../src/cli/setup_command_options.ts) · [`src/cli/commands/setup_execution.ts`](../src/cli/commands/setup_execution.ts) · [`src/cli/setup_credential_collection.ts`](../src/cli/setup_credential_collection.ts) · [`src/cli/setup_pat_intent_adapter.ts`](../src/cli/setup_pat_intent_adapter.ts) · [`src/cli/setup_apply_authorization.ts`](../src/cli/setup_apply_authorization.ts) · [`src/cli/setup_outcome_adapter.ts`](../src/cli/setup_outcome_adapter.ts) · [`src/cli/web_setup_bridge.ts`](../src/cli/web_setup_bridge.ts) · [`src/cli/web_setup_adapters.ts`](../src/cli/web_setup_adapters.ts) · [`src/cli/web_setup_server.ts`](../src/cli/web_setup_server.ts) · [`src/cli/setup_apply_snapshot.ts`](../src/cli/setup_apply_snapshot.ts) · [`src/cli/setup_result_receipt.ts`](../src/cli/setup_result_receipt.ts) · [`src/application/usecases/actions/initial_setup_workflow.ts`](../src/application/usecases/actions/initial_setup_workflow.ts) · [`src/actions/local_action.ts`](../src/actions/local_action.ts) · [`src/cli/setup_session_guard.ts`](../src/cli/setup_session_guard.ts) · [`src/application/usecases/setup/setup_wizard_use_case.ts`](../src/application/usecases/setup/setup_wizard_use_case.ts) · [`src/application/usecases/setup/setup_questionnaire_controller.ts`](../src/application/usecases/setup/setup_questionnaire_controller.ts) · [`src/application/policies/setup_terminal_choice_policy.ts`](../src/application/policies/setup_terminal_choice_policy.ts) · [`src/cli/setup_terminal_driver.ts`](../src/cli/setup_terminal_driver.ts) · [`src/cli/setup_question_renderer.ts`](../src/cli/setup_question_renderer.ts) · [`src/application/usecases/setup/setup_journey_use_case.ts`](../src/application/usecases/setup/setup_journey_use_case.ts) · [`src/application/usecases/setup/setup_credentials_use_case.ts`](../src/application/usecases/setup/setup_credentials_use_case.ts) · [`src/application/policies/setup_questionnaire_policy.ts`](../src/application/policies/setup_questionnaire_policy.ts) · [`src/application/policies/setup_project_selection_policy.ts`](../src/application/policies/setup_project_selection_policy.ts) · [`src/application/ports/setup_project_discovery_port.ts`](../src/application/ports/setup_project_discovery_port.ts) · [`src/application/ports/setup_approval_check_discovery_port.ts`](../src/application/ports/setup_approval_check_discovery_port.ts) · [`src/infrastructure/github_setup_project_discovery_adapter.ts`](../src/infrastructure/github_setup_project_discovery_adapter.ts) · [`src/infrastructure/github_setup_approval_check_discovery_adapter.ts`](../src/infrastructure/github_setup_approval_check_discovery_adapter.ts) · [`src/application/policies/setup_question_documentation_policy.ts`](../src/application/policies/setup_question_documentation_policy.ts) · [`src/application/policies/setup_question_guidance_policy.ts`](../src/application/policies/setup_question_guidance_policy.ts) · [`src/application/policies/setup_question_purpose_policy.ts`](../src/application/policies/setup_question_purpose_policy.ts) · [`src/application/policies/setup_token_permission_policy.ts`](../src/application/policies/setup_token_permission_policy.ts) · [`src/application/policies/setup_configuration_plan.ts`](../src/application/policies/setup_configuration_plan.ts) · [`src/application/policies/setup_pat_creation_url_policy.ts`](../src/application/policies/setup_pat_creation_url_policy.ts) · [`src/infrastructure/composition/setup_credentials_composition_root.ts`](../src/infrastructure/composition/setup_credentials_composition_root.ts) · [`scripts/validate-npm-package.cjs`](../scripts/validate-npm-package.cjs) · [`scripts/smoke-test-npm-package.cjs`](../scripts/smoke-test-npm-package.cjs) · [`scripts/smoke-packaged-web-session.cjs`](../scripts/smoke-packaged-web-session.cjs) · [`scripts/validate-setup-assistant-acceptance.cjs`](../scripts/validate-setup-assistant-acceptance.cjs) · [`scripts/serve-web-setup-review.cjs`](../scripts/serve-web-setup-review.cjs) · [`scripts/validate-workflow-contract.cjs`](../scripts/validate-workflow-contract.cjs) · [`scripts/documentation_checkout_text.cjs`](../scripts/documentation_checkout_text.cjs) · [`scripts/set-cli-executable.cjs`](../scripts/set-cli-executable.cjs) · [`scripts/render-web-setup-component.cjs`](../scripts/render-web-setup-component.cjs) · [`web/src/i18n/permissionPrerequisite.ts`](../web/src/i18n/permissionPrerequisite.ts) · [`scripts/web-setup-review-views.cjs`](../scripts/web-setup-review-views.cjs) · [`src/application/usecases/setup/resolve_setup_workflow_pat_conflict_use_case.ts`](../src/application/usecases/setup/resolve_setup_workflow_pat_conflict_use_case.ts) · [`src/cli/setup_workflow_pat_storage_copy.ts`](../src/cli/setup_workflow_pat_storage_copy.ts) · [`web/src/components/WorkflowPatStorageNotice.svelte`](../web/src/components/WorkflowPatStorageNotice.svelte) · [`src/cli/commands/setup_policy.ts`](../src/cli/commands/setup_policy.ts) · [`src/application/usecases/execution/execution_issue_number_policy.ts`](../src/application/usecases/execution/execution_issue_number_policy.ts) · [`src/application/usecases/execution/setup_execution_workflow.ts`](../src/application/usecases/execution/setup_execution_workflow.ts) · [`src/domain/setup_management.ts`](../src/domain/setup_management.ts) · [`src/application/contracts/setup_management_view.ts`](../src/application/contracts/setup_management_view.ts) · [`src/application/ports/setup_management_ports.ts`](../src/application/ports/setup_management_ports.ts) · [`src/application/policies/setup_quick_settings_policy.ts`](../src/application/policies/setup_quick_settings_policy.ts) · [`src/application/policies/setup_management_policy.ts`](../src/application/policies/setup_management_policy.ts) · [`src/application/policies/setup_management_permissions_policy.ts`](../src/application/policies/setup_management_permissions_policy.ts) · [`src/application/usecases/setup/manage_setup_use_case.ts`](../src/application/usecases/setup/manage_setup_use_case.ts) · [`src/infrastructure/setup_management_workspace_adapter.ts`](../src/infrastructure/setup_management_workspace_adapter.ts) · [`src/cli/setup_management_adapter.ts`](../src/cli/setup_management_adapter.ts) · [`web/src/components/SetupManagementPanel.svelte`](../web/src/components/SetupManagementPanel.svelte) · [`web/src/components/ManagementInventory.svelte`](../web/src/components/ManagementInventory.svelte) · [`web/src/components/QuickSettingPrompt.svelte`](../web/src/components/QuickSettingPrompt.svelte) · [`web/src/i18n/managementCopy.ts`](../web/src/i18n/managementCopy.ts) · [`web/src/styles/management.css`](../web/src/styles/management.css) · [`scripts/coverage-budgets.json`](../scripts/coverage-budgets.json) · [`web/src/session/setupCommandTransport.ts`](../web/src/session/setupCommandTransport.ts) · [`scripts/serve-web-setup-journey.cjs`](../scripts/serve-web-setup-journey.cjs) · [`web/src/components/SetupHeader.svelte`](../web/src/components/SetupHeader.svelte) · [`web/src/components/WaitingPanel.svelte`](../web/src/components/WaitingPanel.svelte) · [`web/src/styles/layout.css`](../web/src/styles/layout.css) · [`web/src/i18n/en.ts`](../web/src/i18n/en.ts) · [`web/src/i18n/es.ts`](../web/src/i18n/es.ts) · [`web/src/i18n/fr.ts`](../web/src/i18n/fr.ts) · [`web/src/i18n/pt.ts`](../web/src/i18n/pt.ts) · [`web/src/i18n/sessionErrors.ts`](../web/src/i18n/sessionErrors.ts) · [`web/src/i18n/errors/en.ts`](../web/src/i18n/errors/en.ts) · [`web/src/i18n/errors/es.ts`](../web/src/i18n/errors/es.ts) · [`web/src/i18n/errors/fr.ts`](../web/src/i18n/errors/fr.ts) · [`web/src/i18n/errors/pt.ts`](../web/src/i18n/errors/pt.ts) · [`web/src/components/SetupSidebar.svelte`](../web/src/components/SetupSidebar.svelte) · [`web/src/components/RepositorySelector.svelte`](../web/src/components/RepositorySelector.svelte) · [`web/src/components/BatchSetupPanel.svelte`](../web/src/components/BatchSetupPanel.svelte) · [`web/src/components/BatchSafetyBanner.svelte`](../web/src/components/BatchSafetyBanner.svelte) -- Tests: [`src/__tests__/cli.test.ts`](../src/__tests__/cli.test.ts) · [`src/__tests__/cli_context_branch.test.ts`](../src/__tests__/cli_context_branch.test.ts) · [`src/__tests__/cli_context_root.test.ts`](../src/__tests__/cli_context_root.test.ts) · [`src/cli/__tests__/web_setup_bridge.test.ts`](../src/cli/__tests__/web_setup_bridge.test.ts) · [`src/cli/__tests__/web_setup_adapters.test.ts`](../src/cli/__tests__/web_setup_adapters.test.ts) · [`src/cli/__tests__/web_setup_palette.test.ts`](../src/cli/__tests__/web_setup_palette.test.ts) · [`src/cli/__tests__/web_setup_ui_helpers.test.ts`](../src/cli/__tests__/web_setup_ui_helpers.test.ts) · [`src/cli/__tests__/web_setup_browser_session.test.ts`](../src/cli/__tests__/web_setup_browser_session.test.ts) · [`src/cli/__tests__/web_setup_server.test.ts`](../src/cli/__tests__/web_setup_server.test.ts) · [`src/cli/__tests__/web_setup_browser_open.test.ts`](../src/cli/__tests__/web_setup_browser_open.test.ts) · [`src/cli/__tests__/setup_apply_snapshot.test.ts`](../src/cli/__tests__/setup_apply_snapshot.test.ts) · [`src/cli/__tests__/setup_result_receipt.test.ts`](../src/cli/__tests__/setup_result_receipt.test.ts) · [`src/cli/__tests__/setup_session_guard.test.ts`](../src/cli/__tests__/setup_session_guard.test.ts) · [`src/cli/__tests__/setup_command_options.test.ts`](../src/cli/__tests__/setup_command_options.test.ts) · [`src/cli/__tests__/web_setup_components.test.ts`](../src/cli/__tests__/web_setup_components.test.ts) · [`src/cli/__tests__/setup_terminal_driver.test.ts`](../src/cli/__tests__/setup_terminal_driver.test.ts) · [`src/cli/__tests__/setup_terminal_driver_stream_integration.test.ts`](../src/cli/__tests__/setup_terminal_driver_stream_integration.test.ts) · [`src/cli/__tests__/setup_presenters.test.ts`](../src/cli/__tests__/setup_presenters.test.ts) · [`src/cli/__tests__/web_setup_catalog.test.ts`](../src/cli/__tests__/web_setup_catalog.test.ts) · [`src/architecture/__tests__/web_setup_boundaries.test.ts`](../src/architecture/__tests__/web_setup_boundaries.test.ts) · [`src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts`](../src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts) · [`src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts`](../src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts) · [`src/infrastructure/__tests__/setup_permission_resource_probes.test.ts`](../src/infrastructure/__tests__/setup_permission_resource_probes.test.ts) · [`src/application/usecases/setup/__tests__/verify_web_setup_apply_use_case.test.ts`](../src/application/usecases/setup/__tests__/verify_web_setup_apply_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_session_coordinator.test.ts`](../src/application/usecases/setup/__tests__/setup_session_coordinator.test.ts) · [`src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts`](../src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts) · [`src/actions/__tests__/local_action.test.ts`](../src/actions/__tests__/local_action.test.ts) · [`src/tooling/__tests__/validate_workflow_contract.test.ts`](../src/tooling/__tests__/validate_workflow_contract.test.ts) · [`src/domain/__tests__/setup_approval_workflow.test.ts`](../src/domain/__tests__/setup_approval_workflow.test.ts) · [`src/tooling/__tests__/documentation_checkout_text.test.ts`](../src/tooling/__tests__/documentation_checkout_text.test.ts) · [`src/application/policies/__tests__/setup_remote_facts_policy.test.ts`](../src/application/policies/__tests__/setup_remote_facts_policy.test.ts) · [`src/application/usecases/setup/__tests__/verify_setup_pat_bootstrap_use_case.test.ts`](../src/application/usecases/setup/__tests__/verify_setup_pat_bootstrap_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_questionnaire_controller.test.ts`](../src/application/usecases/setup/__tests__/setup_questionnaire_controller.test.ts) · [`src/application/usecases/setup/__tests__/setup_journey_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_journey_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_credentials_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_credentials_use_case.test.ts) · [`src/application/policies/__tests__/setup_questionnaire_policy.test.ts`](../src/application/policies/__tests__/setup_questionnaire_policy.test.ts) · [`src/application/policies/__tests__/setup_project_selection_policy.test.ts`](../src/application/policies/__tests__/setup_project_selection_policy.test.ts) · [`src/infrastructure/__tests__/github_setup_project_discovery_adapter.test.ts`](../src/infrastructure/__tests__/github_setup_project_discovery_adapter.test.ts) · [`src/infrastructure/__tests__/github_setup_approval_check_discovery_adapter.test.ts`](../src/infrastructure/__tests__/github_setup_approval_check_discovery_adapter.test.ts) · [`src/infrastructure/__tests__/setup_check_discovery_sdk_contract.integration.test.ts`](../src/infrastructure/__tests__/setup_check_discovery_sdk_contract.integration.test.ts) · [`src/application/policies/__tests__/setup_question_documentation_policy.test.ts`](../src/application/policies/__tests__/setup_question_documentation_policy.test.ts) · [`src/application/policies/__tests__/setup_question_purpose_policy.test.ts`](../src/application/policies/__tests__/setup_question_purpose_policy.test.ts) · [`src/application/policies/__tests__/setup_token_permission_policy.test.ts`](../src/application/policies/__tests__/setup_token_permission_policy.test.ts) · [`src/architecture/__tests__/setup_doctor_boundaries.test.ts`](../src/architecture/__tests__/setup_doctor_boundaries.test.ts) · [`src/infrastructure/__tests__/setup_pat_audit.test.ts`](../src/infrastructure/__tests__/setup_pat_audit.test.ts) · [`src/infrastructure/__tests__/setup_permission_projects_access.test.ts`](../src/infrastructure/__tests__/setup_permission_projects_access.test.ts) · [`src/application/usecases/setup/__tests__/setup_workflow_pat_recovery.test.ts`](../src/application/usecases/setup/__tests__/setup_workflow_pat_recovery.test.ts) · [`src/cli/__tests__/web_setup_bot_pat_recovery.test.ts`](../src/cli/__tests__/web_setup_bot_pat_recovery.test.ts) · [`src/application/usecases/setup/__tests__/setup_workflow_pat_conflict.test.ts`](../src/application/usecases/setup/__tests__/setup_workflow_pat_conflict.test.ts) · [`src/application/usecases/setup/__tests__/setup_workflow_pat_credential_rotation.test.ts`](../src/application/usecases/setup/__tests__/setup_workflow_pat_credential_rotation.test.ts) · [`src/data/repository/__tests__/setup_organization_pat_inventory.test.ts`](../src/data/repository/__tests__/setup_organization_pat_inventory.test.ts) · [`src/cli/__tests__/web_setup_bot_pat_scope_conflict.test.ts`](../src/cli/__tests__/web_setup_bot_pat_scope_conflict.test.ts) · [`src/actions/__tests__/local_setup_apply_contract.test.ts`](../src/actions/__tests__/local_setup_apply_contract.test.ts) · [`src/cli/commands/__tests__/setup_policy.test.ts`](../src/cli/commands/__tests__/setup_policy.test.ts) · [`src/application/usecases/execution/__tests__/execution_issue_number_policy.test.ts`](../src/application/usecases/execution/__tests__/execution_issue_number_policy.test.ts) · [`src/application/usecases/execution/__tests__/setup_execution_workflow.test.ts`](../src/application/usecases/execution/__tests__/setup_execution_workflow.test.ts) · [`src/application/policies/__tests__/setup_management_policy.test.ts`](../src/application/policies/__tests__/setup_management_policy.test.ts) · [`src/application/usecases/setup/__tests__/manage_setup_use_case.test.ts`](../src/application/usecases/setup/__tests__/manage_setup_use_case.test.ts) · [`src/infrastructure/__tests__/setup_management_workspace_adapter.test.ts`](../src/infrastructure/__tests__/setup_management_workspace_adapter.test.ts) · [`src/cli/__tests__/setup_management_adapter.test.ts`](../src/cli/__tests__/setup_management_adapter.test.ts) · [`src/cli/__tests__/web_setup_management_components.test.ts`](../src/cli/__tests__/web_setup_management_components.test.ts) +- Core code: [`web/src/App.svelte`](../web/src/App.svelte) · [`web/src/session/setupSession.ts`](../web/src/session/setupSession.ts) · [`web/src/components/ActionButton.svelte`](../web/src/components/ActionButton.svelte) · [`web/src/components/PairingPanel.svelte`](../web/src/components/PairingPanel.svelte) · [`web/src/lib/pairingCode.ts`](../web/src/lib/pairingCode.ts) · [`web/src/components/ContextPanel.svelte`](../web/src/components/ContextPanel.svelte) · [`web/src/i18n/permissionEvidence.ts`](../web/src/i18n/permissionEvidence.ts) · [`web/src/i18n/permissionProgress.ts`](../web/src/i18n/permissionProgress.ts) · [`web/src/components/PermissionProgressPanel.svelte`](../web/src/components/PermissionProgressPanel.svelte) · [`web/src/components/PromptCard.svelte`](../web/src/components/PromptCard.svelte) · [`web/src/components/ResultPanel.svelte`](../web/src/components/ResultPanel.svelte) · [`web/src/components/SetupPatCorrectionPanel.svelte`](../web/src/components/SetupPatCorrectionPanel.svelte) · [`web/src/components/ResourceProgress.svelte`](../web/src/components/ResourceProgress.svelte) · [`web/src/components/PlanPrompt.svelte`](../web/src/components/PlanPrompt.svelte) · [`web/src/components/PlanDecisionSummary.svelte`](../web/src/components/PlanDecisionSummary.svelte) · [`web/src/components/QuestionPrompt.svelte`](../web/src/components/QuestionPrompt.svelte) · [`web/src/components/FixedWorkflowNotice.svelte`](../web/src/components/FixedWorkflowNotice.svelte) · [`web/src/components/QuestionGuidance.svelte`](../web/src/components/QuestionGuidance.svelte) · [`web/src/components/DiscoveryNotice.svelte`](../web/src/components/DiscoveryNotice.svelte) · [`web/src/components/ProducerSelector.svelte`](../web/src/components/ProducerSelector.svelte) · [`web/src/lib/manualProducerIdentity.ts`](../web/src/lib/manualProducerIdentity.ts) · [`web/src/components/CoverageCheckEvidence.svelte`](../web/src/components/CoverageCheckEvidence.svelte) · [`web/src/components/ProjectSelector.svelte`](../web/src/components/ProjectSelector.svelte) · [`web/src/i18n/catalog.ts`](../web/src/i18n/catalog.ts) · [`web/src/i18n/projectTransitions.ts`](../web/src/i18n/projectTransitions.ts) · [`web/src/i18n/permissionTerms.ts`](../web/src/i18n/permissionTerms.ts) · [`web/src/components/StatusBanner.svelte`](../web/src/components/StatusBanner.svelte) · [`web/src/lib/questionAnswer.ts`](../web/src/lib/questionAnswer.ts) · [`web/src/lib/githubLink.ts`](../web/src/lib/githubLink.ts) · [`web/src/lib/focusOnRevision.ts`](../web/src/lib/focusOnRevision.ts) · [`web/src/i18n/featureNames.ts`](../web/src/i18n/featureNames.ts) · [`web/src/i18n/agentRoleNames.ts`](../web/src/i18n/agentRoleNames.ts) · [`web/src/i18n/checkEvidence.ts`](../web/src/i18n/checkEvidence.ts) · [`web/src/styles/controls.css`](../web/src/styles/controls.css) · [`web/src/styles/tokens.css`](../web/src/styles/tokens.css) · [`web/src/style.css`](../web/src/style.css) · [`src/application/contracts/web_setup_view.ts`](../src/application/contracts/web_setup_view.ts) · [`src/application/ports/setup_terminal_ports.ts`](../src/application/ports/setup_terminal_ports.ts) · [`src/application/errors/setup_interaction_cancelled_error.ts`](../src/application/errors/setup_interaction_cancelled_error.ts) · [`src/application/policies/merge_setup_overrides_policy.ts`](../src/application/policies/merge_setup_overrides_policy.ts) · [`src/application/policies/setup_remote_facts_policy.ts`](../src/application/policies/setup_remote_facts_policy.ts) · [`src/application/usecases/setup/prepare_setup_pat_intent_use_case.ts`](../src/application/usecases/setup/prepare_setup_pat_intent_use_case.ts) · [`src/application/usecases/setup/audit_configured_setup_pat_use_case.ts`](../src/application/usecases/setup/audit_configured_setup_pat_use_case.ts) · [`src/infrastructure/setup_permission_actions_probe.ts`](../src/infrastructure/setup_permission_actions_probe.ts) · [`src/infrastructure/setup_permission_issue_probe.ts`](../src/infrastructure/setup_permission_issue_probe.ts) · [`src/infrastructure/setup_permission_issue_cleanup.ts`](../src/infrastructure/setup_permission_issue_cleanup.ts) · [`src/infrastructure/setup_permission_probe_journal.ts`](../src/infrastructure/setup_permission_probe_journal.ts) · [`src/infrastructure/setup_permission_probe_transaction.ts`](../src/infrastructure/setup_permission_probe_transaction.ts) · [`src/infrastructure/setup_permission_resource_probes.ts`](../src/infrastructure/setup_permission_resource_probes.ts) · [`src/application/usecases/setup/verify_web_setup_apply_use_case.ts`](../src/application/usecases/setup/verify_web_setup_apply_use_case.ts) · [`src/application/usecases/setup/setup_session_coordinator.ts`](../src/application/usecases/setup/setup_session_coordinator.ts) · [`src/application/usecases/setup/verify_setup_pat_bootstrap_use_case.ts`](../src/application/usecases/setup/verify_setup_pat_bootstrap_use_case.ts) · [`src/cli_context.ts`](../src/cli_context.ts) · [`src/cli/setup_command_options.ts`](../src/cli/setup_command_options.ts) · [`src/cli/commands/setup_execution.ts`](../src/cli/commands/setup_execution.ts) · [`src/cli/setup_credential_collection.ts`](../src/cli/setup_credential_collection.ts) · [`src/cli/setup_pat_intent_adapter.ts`](../src/cli/setup_pat_intent_adapter.ts) · [`src/cli/setup_apply_authorization.ts`](../src/cli/setup_apply_authorization.ts) · [`src/cli/setup_outcome_adapter.ts`](../src/cli/setup_outcome_adapter.ts) · [`src/cli/web_setup_bridge.ts`](../src/cli/web_setup_bridge.ts) · [`src/cli/web_setup_adapters.ts`](../src/cli/web_setup_adapters.ts) · [`src/cli/web_setup_server.ts`](../src/cli/web_setup_server.ts) · [`src/cli/setup_apply_snapshot.ts`](../src/cli/setup_apply_snapshot.ts) · [`src/cli/setup_result_receipt.ts`](../src/cli/setup_result_receipt.ts) · [`src/application/usecases/actions/initial_setup_workflow.ts`](../src/application/usecases/actions/initial_setup_workflow.ts) · [`src/actions/local_action.ts`](../src/actions/local_action.ts) · [`src/cli/setup_session_guard.ts`](../src/cli/setup_session_guard.ts) · [`src/application/usecases/setup/setup_wizard_use_case.ts`](../src/application/usecases/setup/setup_wizard_use_case.ts) · [`src/application/usecases/setup/setup_questionnaire_controller.ts`](../src/application/usecases/setup/setup_questionnaire_controller.ts) · [`src/application/policies/setup_terminal_choice_policy.ts`](../src/application/policies/setup_terminal_choice_policy.ts) · [`src/cli/setup_terminal_driver.ts`](../src/cli/setup_terminal_driver.ts) · [`src/cli/setup_question_renderer.ts`](../src/cli/setup_question_renderer.ts) · [`src/application/usecases/setup/setup_journey_use_case.ts`](../src/application/usecases/setup/setup_journey_use_case.ts) · [`src/application/usecases/setup/setup_credentials_use_case.ts`](../src/application/usecases/setup/setup_credentials_use_case.ts) · [`src/application/policies/setup_questionnaire_policy.ts`](../src/application/policies/setup_questionnaire_policy.ts) · [`src/application/policies/setup_project_selection_policy.ts`](../src/application/policies/setup_project_selection_policy.ts) · [`src/application/ports/setup_project_discovery_port.ts`](../src/application/ports/setup_project_discovery_port.ts) · [`src/application/ports/setup_approval_check_discovery_port.ts`](../src/application/ports/setup_approval_check_discovery_port.ts) · [`src/infrastructure/github_setup_project_discovery_adapter.ts`](../src/infrastructure/github_setup_project_discovery_adapter.ts) · [`src/infrastructure/github_setup_approval_check_discovery_adapter.ts`](../src/infrastructure/github_setup_approval_check_discovery_adapter.ts) · [`src/application/policies/setup_question_documentation_policy.ts`](../src/application/policies/setup_question_documentation_policy.ts) · [`src/application/policies/setup_question_guidance_policy.ts`](../src/application/policies/setup_question_guidance_policy.ts) · [`src/application/policies/setup_question_purpose_policy.ts`](../src/application/policies/setup_question_purpose_policy.ts) · [`src/application/policies/setup_token_permission_policy.ts`](../src/application/policies/setup_token_permission_policy.ts) · [`src/application/policies/setup_configuration_plan.ts`](../src/application/policies/setup_configuration_plan.ts) · [`src/application/policies/setup_pat_creation_url_policy.ts`](../src/application/policies/setup_pat_creation_url_policy.ts) · [`src/infrastructure/composition/setup_credentials_composition_root.ts`](../src/infrastructure/composition/setup_credentials_composition_root.ts) · [`scripts/validate-npm-package.cjs`](../scripts/validate-npm-package.cjs) · [`scripts/smoke-test-npm-package.cjs`](../scripts/smoke-test-npm-package.cjs) · [`scripts/smoke-packaged-web-session.cjs`](../scripts/smoke-packaged-web-session.cjs) · [`scripts/validate-setup-assistant-acceptance.cjs`](../scripts/validate-setup-assistant-acceptance.cjs) · [`scripts/serve-web-setup-review.cjs`](../scripts/serve-web-setup-review.cjs) · [`scripts/validate-workflow-contract.cjs`](../scripts/validate-workflow-contract.cjs) · [`scripts/documentation_checkout_text.cjs`](../scripts/documentation_checkout_text.cjs) · [`scripts/set-cli-executable.cjs`](../scripts/set-cli-executable.cjs) · [`scripts/render-web-setup-component.cjs`](../scripts/render-web-setup-component.cjs) · [`web/src/i18n/permissionPrerequisite.ts`](../web/src/i18n/permissionPrerequisite.ts) · [`scripts/web-setup-review-views.cjs`](../scripts/web-setup-review-views.cjs) · [`src/application/usecases/setup/resolve_setup_workflow_pat_conflict_use_case.ts`](../src/application/usecases/setup/resolve_setup_workflow_pat_conflict_use_case.ts) · [`src/cli/setup_workflow_pat_storage_copy.ts`](../src/cli/setup_workflow_pat_storage_copy.ts) · [`web/src/components/WorkflowPatStorageNotice.svelte`](../web/src/components/WorkflowPatStorageNotice.svelte) · [`src/cli/commands/setup_policy.ts`](../src/cli/commands/setup_policy.ts) · [`src/application/usecases/execution/execution_issue_number_policy.ts`](../src/application/usecases/execution/execution_issue_number_policy.ts) · [`src/application/usecases/execution/setup_execution_workflow.ts`](../src/application/usecases/execution/setup_execution_workflow.ts) · [`src/domain/setup_management.ts`](../src/domain/setup_management.ts) · [`src/application/contracts/setup_management_view.ts`](../src/application/contracts/setup_management_view.ts) · [`src/application/ports/setup_management_ports.ts`](../src/application/ports/setup_management_ports.ts) · [`src/application/policies/setup_quick_settings_policy.ts`](../src/application/policies/setup_quick_settings_policy.ts) · [`src/application/policies/setup_management_policy.ts`](../src/application/policies/setup_management_policy.ts) · [`src/application/policies/setup_management_permissions_policy.ts`](../src/application/policies/setup_management_permissions_policy.ts) · [`src/application/usecases/setup/manage_setup_use_case.ts`](../src/application/usecases/setup/manage_setup_use_case.ts) · [`src/infrastructure/setup_management_workspace_adapter.ts`](../src/infrastructure/setup_management_workspace_adapter.ts) · [`src/cli/setup_management_adapter.ts`](../src/cli/setup_management_adapter.ts) · [`web/src/components/SetupManagementPanel.svelte`](../web/src/components/SetupManagementPanel.svelte) · [`web/src/components/ManagementInventory.svelte`](../web/src/components/ManagementInventory.svelte) · [`web/src/components/QuickSettingPrompt.svelte`](../web/src/components/QuickSettingPrompt.svelte) · [`web/src/i18n/managementCopy.ts`](../web/src/i18n/managementCopy.ts) · [`web/src/styles/management.css`](../web/src/styles/management.css) · [`scripts/coverage-budgets.json`](../scripts/coverage-budgets.json) · [`web/src/session/setupCommandTransport.ts`](../web/src/session/setupCommandTransport.ts) · [`scripts/serve-web-setup-journey.cjs`](../scripts/serve-web-setup-journey.cjs) · [`web/src/components/SetupHeader.svelte`](../web/src/components/SetupHeader.svelte) · [`web/src/components/WaitingPanel.svelte`](../web/src/components/WaitingPanel.svelte) · [`web/src/styles/layout.css`](../web/src/styles/layout.css) · [`web/src/i18n/en.ts`](../web/src/i18n/en.ts) · [`web/src/i18n/es.ts`](../web/src/i18n/es.ts) · [`web/src/i18n/fr.ts`](../web/src/i18n/fr.ts) · [`web/src/i18n/pt.ts`](../web/src/i18n/pt.ts) · [`web/src/i18n/sessionErrors.ts`](../web/src/i18n/sessionErrors.ts) · [`web/src/i18n/errors/en.ts`](../web/src/i18n/errors/en.ts) · [`web/src/i18n/errors/es.ts`](../web/src/i18n/errors/es.ts) · [`web/src/i18n/errors/fr.ts`](../web/src/i18n/errors/fr.ts) · [`web/src/i18n/errors/pt.ts`](../web/src/i18n/errors/pt.ts) · [`web/src/components/SetupSidebar.svelte`](../web/src/components/SetupSidebar.svelte) · [`web/src/components/RepositorySelector.svelte`](../web/src/components/RepositorySelector.svelte) · [`web/src/components/BatchSetupPanel.svelte`](../web/src/components/BatchSetupPanel.svelte) · [`web/src/components/BatchSafetyBanner.svelte`](../web/src/components/BatchSafetyBanner.svelte) · [`web/src/components/InstallationReview.svelte`](../web/src/components/InstallationReview.svelte) · [`web/src/components/RunnerQuestionDetails.svelte`](../web/src/components/RunnerQuestionDetails.svelte) · [`web/src/i18n/runnerCopy.ts`](../web/src/i18n/runnerCopy.ts) · [`scripts/web-setup-runner-review-fixtures.cjs`](../scripts/web-setup-runner-review-fixtures.cjs) +- Tests: [`src/__tests__/cli.test.ts`](../src/__tests__/cli.test.ts) · [`src/__tests__/cli_context_branch.test.ts`](../src/__tests__/cli_context_branch.test.ts) · [`src/__tests__/cli_context_root.test.ts`](../src/__tests__/cli_context_root.test.ts) · [`src/cli/__tests__/web_setup_bridge.test.ts`](../src/cli/__tests__/web_setup_bridge.test.ts) · [`src/cli/__tests__/web_setup_adapters.test.ts`](../src/cli/__tests__/web_setup_adapters.test.ts) · [`src/cli/__tests__/web_setup_palette.test.ts`](../src/cli/__tests__/web_setup_palette.test.ts) · [`src/cli/__tests__/web_setup_ui_helpers.test.ts`](../src/cli/__tests__/web_setup_ui_helpers.test.ts) · [`src/cli/__tests__/web_setup_browser_session.test.ts`](../src/cli/__tests__/web_setup_browser_session.test.ts) · [`src/cli/__tests__/web_setup_server.test.ts`](../src/cli/__tests__/web_setup_server.test.ts) · [`src/cli/__tests__/web_setup_browser_open.test.ts`](../src/cli/__tests__/web_setup_browser_open.test.ts) · [`src/cli/__tests__/setup_apply_snapshot.test.ts`](../src/cli/__tests__/setup_apply_snapshot.test.ts) · [`src/cli/__tests__/setup_result_receipt.test.ts`](../src/cli/__tests__/setup_result_receipt.test.ts) · [`src/cli/__tests__/setup_session_guard.test.ts`](../src/cli/__tests__/setup_session_guard.test.ts) · [`src/cli/__tests__/setup_command_options.test.ts`](../src/cli/__tests__/setup_command_options.test.ts) · [`src/cli/__tests__/web_setup_components.test.ts`](../src/cli/__tests__/web_setup_components.test.ts) · [`src/cli/__tests__/setup_terminal_driver.test.ts`](../src/cli/__tests__/setup_terminal_driver.test.ts) · [`src/cli/__tests__/setup_terminal_driver_stream_integration.test.ts`](../src/cli/__tests__/setup_terminal_driver_stream_integration.test.ts) · [`src/cli/__tests__/setup_presenters.test.ts`](../src/cli/__tests__/setup_presenters.test.ts) · [`src/cli/__tests__/web_setup_catalog.test.ts`](../src/cli/__tests__/web_setup_catalog.test.ts) · [`src/architecture/__tests__/web_setup_boundaries.test.ts`](../src/architecture/__tests__/web_setup_boundaries.test.ts) · [`src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts`](../src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts) · [`src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts`](../src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts) · [`src/infrastructure/__tests__/setup_permission_resource_probes.test.ts`](../src/infrastructure/__tests__/setup_permission_resource_probes.test.ts) · [`src/application/usecases/setup/__tests__/verify_web_setup_apply_use_case.test.ts`](../src/application/usecases/setup/__tests__/verify_web_setup_apply_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_session_coordinator.test.ts`](../src/application/usecases/setup/__tests__/setup_session_coordinator.test.ts) · [`src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts`](../src/application/usecases/actions/__tests__/initial_setup_use_case.test.ts) · [`src/actions/__tests__/local_action.test.ts`](../src/actions/__tests__/local_action.test.ts) · [`src/tooling/__tests__/validate_workflow_contract.test.ts`](../src/tooling/__tests__/validate_workflow_contract.test.ts) · [`src/domain/__tests__/setup_approval_workflow.test.ts`](../src/domain/__tests__/setup_approval_workflow.test.ts) · [`src/tooling/__tests__/documentation_checkout_text.test.ts`](../src/tooling/__tests__/documentation_checkout_text.test.ts) · [`src/application/policies/__tests__/setup_remote_facts_policy.test.ts`](../src/application/policies/__tests__/setup_remote_facts_policy.test.ts) · [`src/application/usecases/setup/__tests__/verify_setup_pat_bootstrap_use_case.test.ts`](../src/application/usecases/setup/__tests__/verify_setup_pat_bootstrap_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_questionnaire_controller.test.ts`](../src/application/usecases/setup/__tests__/setup_questionnaire_controller.test.ts) · [`src/application/usecases/setup/__tests__/setup_journey_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_journey_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_credentials_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_credentials_use_case.test.ts) · [`src/application/policies/__tests__/setup_questionnaire_policy.test.ts`](../src/application/policies/__tests__/setup_questionnaire_policy.test.ts) · [`src/application/policies/__tests__/setup_project_selection_policy.test.ts`](../src/application/policies/__tests__/setup_project_selection_policy.test.ts) · [`src/infrastructure/__tests__/github_setup_project_discovery_adapter.test.ts`](../src/infrastructure/__tests__/github_setup_project_discovery_adapter.test.ts) · [`src/infrastructure/__tests__/github_setup_approval_check_discovery_adapter.test.ts`](../src/infrastructure/__tests__/github_setup_approval_check_discovery_adapter.test.ts) · [`src/infrastructure/__tests__/setup_check_discovery_sdk_contract.integration.test.ts`](../src/infrastructure/__tests__/setup_check_discovery_sdk_contract.integration.test.ts) · [`src/application/policies/__tests__/setup_question_documentation_policy.test.ts`](../src/application/policies/__tests__/setup_question_documentation_policy.test.ts) · [`src/application/policies/__tests__/setup_question_purpose_policy.test.ts`](../src/application/policies/__tests__/setup_question_purpose_policy.test.ts) · [`src/application/policies/__tests__/setup_token_permission_policy.test.ts`](../src/application/policies/__tests__/setup_token_permission_policy.test.ts) · [`src/architecture/__tests__/setup_doctor_boundaries.test.ts`](../src/architecture/__tests__/setup_doctor_boundaries.test.ts) · [`src/infrastructure/__tests__/setup_pat_audit.test.ts`](../src/infrastructure/__tests__/setup_pat_audit.test.ts) · [`src/infrastructure/__tests__/setup_permission_projects_access.test.ts`](../src/infrastructure/__tests__/setup_permission_projects_access.test.ts) · [`src/application/usecases/setup/__tests__/setup_workflow_pat_recovery.test.ts`](../src/application/usecases/setup/__tests__/setup_workflow_pat_recovery.test.ts) · [`src/cli/__tests__/web_setup_bot_pat_recovery.test.ts`](../src/cli/__tests__/web_setup_bot_pat_recovery.test.ts) · [`src/application/usecases/setup/__tests__/setup_workflow_pat_conflict.test.ts`](../src/application/usecases/setup/__tests__/setup_workflow_pat_conflict.test.ts) · [`src/application/usecases/setup/__tests__/setup_workflow_pat_credential_rotation.test.ts`](../src/application/usecases/setup/__tests__/setup_workflow_pat_credential_rotation.test.ts) · [`src/data/repository/__tests__/setup_organization_pat_inventory.test.ts`](../src/data/repository/__tests__/setup_organization_pat_inventory.test.ts) · [`src/cli/__tests__/web_setup_bot_pat_scope_conflict.test.ts`](../src/cli/__tests__/web_setup_bot_pat_scope_conflict.test.ts) · [`src/actions/__tests__/local_setup_apply_contract.test.ts`](../src/actions/__tests__/local_setup_apply_contract.test.ts) · [`src/cli/commands/__tests__/setup_policy.test.ts`](../src/cli/commands/__tests__/setup_policy.test.ts) · [`src/application/usecases/execution/__tests__/execution_issue_number_policy.test.ts`](../src/application/usecases/execution/__tests__/execution_issue_number_policy.test.ts) · [`src/application/usecases/execution/__tests__/setup_execution_workflow.test.ts`](../src/application/usecases/execution/__tests__/setup_execution_workflow.test.ts) · [`src/application/policies/__tests__/setup_management_policy.test.ts`](../src/application/policies/__tests__/setup_management_policy.test.ts) · [`src/application/usecases/setup/__tests__/manage_setup_use_case.test.ts`](../src/application/usecases/setup/__tests__/manage_setup_use_case.test.ts) · [`src/infrastructure/__tests__/setup_management_workspace_adapter.test.ts`](../src/infrastructure/__tests__/setup_management_workspace_adapter.test.ts) · [`src/cli/__tests__/setup_management_adapter.test.ts`](../src/cli/__tests__/setup_management_adapter.test.ts) · [`src/cli/__tests__/web_setup_management_components.test.ts`](../src/cli/__tests__/web_setup_management_components.test.ts) · [`src/cli/__tests__/web_setup_runner_components.test.ts`](../src/cli/__tests__/web_setup_runner_components.test.ts) - User documentation: [`README.md`](../README.md) · [`docs/how-to-use.mdx`](../docs/how-to-use.mdx) · [`docs/authentication.mdx`](../docs/authentication.mdx) · [`docs/issues/assignees-and-projects.mdx`](../docs/issues/assignees-and-projects.mdx) · [`docs/pull-requests/guarded-approval.mdx`](../docs/pull-requests/guarded-approval.mdx) · [`docs/configuration.mdx`](../docs/configuration.mdx) · [`docs/configuration-checklist.mdx`](../docs/configuration-checklist.mdx) · [`docs/development/architecture.mdx`](../docs/development/architecture.mdx) · [`docs/development/setup-assistant-review.mdx`](../docs/development/setup-assistant-review.mdx) · [`docs/development/testing.mdx`](../docs/development/testing.mdx) · [`docs/dependency-rules.md`](../docs/dependency-rules.md) · [`docs/security-operations/security/self-hosted-runners.mdx`](../docs/security-operations/security/self-hosted-runners.mdx) · [`docs/security-operations/operations/troubleshooting.mdx`](../docs/security-operations/operations/troubleshooting.mdx) · [`docs/security-operations/operations/provisioning.mdx`](../docs/security-operations/operations/provisioning.mdx) ### `guided-bot-pat-onboarding` — Guided bot PAT onboarding @@ -136,12 +136,12 @@ debt or convert unknown historic intent into a design decision. ### `temporary-setup-operator-authorization` — Assisted setup PAT creation - Owner: Copilot maintainers -- Last verified: 2026-10-07 +- Last verified: 2026-10-18 - Specifications: [`specs/temporary-setup-operator-authorization.md`](./temporary-setup-operator-authorization.md) - Workflows: Not applicable for this capability. - Entrypoints: [`src/cli/commands/setup.ts`](../src/cli/commands/setup.ts) -- Core code: [`src/cli/setup_credential_prompt_adapter.ts`](../src/cli/setup_credential_prompt_adapter.ts) · [`src/cli/setup_journey_presenter.ts`](../src/cli/setup_journey_presenter.ts) · [`src/application/policies/setup_pat_intent_policy.ts`](../src/application/policies/setup_pat_intent_policy.ts) · [`src/application/policies/setup_questionnaire_policy.ts`](../src/application/policies/setup_questionnaire_policy.ts) · [`src/application/policies/setup_token_permission_policy.ts`](../src/application/policies/setup_token_permission_policy.ts) · [`src/application/policies/setup_pat_creation_url_policy.ts`](../src/application/policies/setup_pat_creation_url_policy.ts) · [`src/application/usecases/setup/setup_wizard_use_case.ts`](../src/application/usecases/setup/setup_wizard_use_case.ts) · [`src/application/usecases/setup/prepare_setup_pat_intent_use_case.ts`](../src/application/usecases/setup/prepare_setup_pat_intent_use_case.ts) · [`src/application/usecases/setup/verify_setup_pat_bootstrap_use_case.ts`](../src/application/usecases/setup/verify_setup_pat_bootstrap_use_case.ts) · [`src/application/usecases/setup/audit_configured_setup_pat_use_case.ts`](../src/application/usecases/setup/audit_configured_setup_pat_use_case.ts) · [`src/application/usecases/setup/setup_token_permissions_use_case.ts`](../src/application/usecases/setup/setup_token_permissions_use_case.ts) · [`src/infrastructure/setup_token_permission_query_adapter.ts`](../src/infrastructure/setup_token_permission_query_adapter.ts) · [`src/utils/setup_files.ts`](../src/utils/setup_files.ts) -- Tests: [`src/cli/__tests__/setup_presenters.test.ts`](../src/cli/__tests__/setup_presenters.test.ts) · [`src/cli/__tests__/setup_journey_presenter.test.ts`](../src/cli/__tests__/setup_journey_presenter.test.ts) · [`src/__tests__/cli.test.ts`](../src/__tests__/cli.test.ts) · [`src/application/policies/__tests__/setup_pat_intent_policy.test.ts`](../src/application/policies/__tests__/setup_pat_intent_policy.test.ts) · [`src/application/policies/__tests__/setup_questionnaire_policy.test.ts`](../src/application/policies/__tests__/setup_questionnaire_policy.test.ts) · [`src/application/policies/__tests__/setup_token_permission_policy.test.ts`](../src/application/policies/__tests__/setup_token_permission_policy.test.ts) · [`src/application/policies/__tests__/setup_pat_creation_url_policy.test.ts`](../src/application/policies/__tests__/setup_pat_creation_url_policy.test.ts) · [`src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts) · [`src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts`](../src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts) · [`src/application/usecases/setup/__tests__/verify_setup_pat_bootstrap_use_case.test.ts`](../src/application/usecases/setup/__tests__/verify_setup_pat_bootstrap_use_case.test.ts) · [`src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts`](../src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_token_permissions_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_token_permissions_use_case.test.ts) · [`src/infrastructure/__tests__/setup_token_permission_query_adapter.test.ts`](../src/infrastructure/__tests__/setup_token_permission_query_adapter.test.ts) · [`src/utils/__tests__/setup_files.test.ts`](../src/utils/__tests__/setup_files.test.ts) +- Core code: [`src/cli/setup_credential_prompt_adapter.ts`](../src/cli/setup_credential_prompt_adapter.ts) · [`src/cli/setup_journey_presenter.ts`](../src/cli/setup_journey_presenter.ts) · [`src/application/policies/setup_pat_intent_policy.ts`](../src/application/policies/setup_pat_intent_policy.ts) · [`src/application/policies/setup_questionnaire_policy.ts`](../src/application/policies/setup_questionnaire_policy.ts) · [`src/application/policies/setup_token_permission_policy.ts`](../src/application/policies/setup_token_permission_policy.ts) · [`src/application/policies/setup_pat_creation_url_policy.ts`](../src/application/policies/setup_pat_creation_url_policy.ts) · [`src/application/usecases/setup/setup_wizard_use_case.ts`](../src/application/usecases/setup/setup_wizard_use_case.ts) · [`src/application/usecases/setup/prepare_setup_pat_intent_use_case.ts`](../src/application/usecases/setup/prepare_setup_pat_intent_use_case.ts) · [`src/application/usecases/setup/verify_setup_pat_bootstrap_use_case.ts`](../src/application/usecases/setup/verify_setup_pat_bootstrap_use_case.ts) · [`src/application/usecases/setup/audit_configured_setup_pat_use_case.ts`](../src/application/usecases/setup/audit_configured_setup_pat_use_case.ts) · [`src/application/usecases/setup/setup_token_permissions_use_case.ts`](../src/application/usecases/setup/setup_token_permissions_use_case.ts) · [`src/infrastructure/setup_token_permission_query_adapter.ts`](../src/infrastructure/setup_token_permission_query_adapter.ts) · [`src/utils/setup_files.ts`](../src/utils/setup_files.ts) · [`src/application/policies/setup_runner_question_policy.ts`](../src/application/policies/setup_runner_question_policy.ts) +- Tests: [`src/cli/__tests__/setup_presenters.test.ts`](../src/cli/__tests__/setup_presenters.test.ts) · [`src/cli/__tests__/setup_journey_presenter.test.ts`](../src/cli/__tests__/setup_journey_presenter.test.ts) · [`src/__tests__/cli.test.ts`](../src/__tests__/cli.test.ts) · [`src/application/policies/__tests__/setup_pat_intent_policy.test.ts`](../src/application/policies/__tests__/setup_pat_intent_policy.test.ts) · [`src/application/policies/__tests__/setup_questionnaire_policy.test.ts`](../src/application/policies/__tests__/setup_questionnaire_policy.test.ts) · [`src/application/policies/__tests__/setup_token_permission_policy.test.ts`](../src/application/policies/__tests__/setup_token_permission_policy.test.ts) · [`src/application/policies/__tests__/setup_pat_creation_url_policy.test.ts`](../src/application/policies/__tests__/setup_pat_creation_url_policy.test.ts) · [`src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts) · [`src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts`](../src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts) · [`src/application/usecases/setup/__tests__/verify_setup_pat_bootstrap_use_case.test.ts`](../src/application/usecases/setup/__tests__/verify_setup_pat_bootstrap_use_case.test.ts) · [`src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts`](../src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts) · [`src/application/usecases/setup/__tests__/setup_token_permissions_use_case.test.ts`](../src/application/usecases/setup/__tests__/setup_token_permissions_use_case.test.ts) · [`src/infrastructure/__tests__/setup_token_permission_query_adapter.test.ts`](../src/infrastructure/__tests__/setup_token_permission_query_adapter.test.ts) · [`src/utils/__tests__/setup_files.test.ts`](../src/utils/__tests__/setup_files.test.ts) · [`src/application/policies/__tests__/setup_runner_question_policy.test.ts`](../src/application/policies/__tests__/setup_runner_question_policy.test.ts) - User documentation: [`README.md`](../README.md) · [`docs/how-to-use.mdx`](../docs/how-to-use.mdx) · [`docs/authentication.mdx`](../docs/authentication.mdx) · [`docs/configuration.mdx`](../docs/configuration.mdx) · [`docs/development/architecture.mdx`](../docs/development/architecture.mdx) · [`docs/security-operations/operations/troubleshooting.mdx`](../docs/security-operations/operations/troubleshooting.mdx) ### `issue-start-and-sdd-readiness` — Uniform issue start and pre-branch SDD readiness diff --git a/specs/catalog.json b/specs/catalog.json index 4e94bf0e7..7b73928ea 100644 --- a/specs/catalog.json +++ b/specs/catalog.json @@ -721,13 +721,16 @@ "specs/setup-doctor-architecture-hardening.md", "specs/setup-pat-permission-guidance-and-verification.md", "specs/github-runtime-doctor-command.md", - "specs/organization-configuration-reuse-and-batch-setup.md" + "specs/organization-configuration-reuse-and-batch-setup.md", + "specs/setup-runner-profiles-and-installation-parity.md" ], "workflows": [ "setup/workflows/agent-cli-provisioning.yml", "setup/workflows/copilot_credential_health.yml", ".github/workflows/copilot_issue_comment.yml", - ".github/workflows/copilot_pull_request_comment.yml" + ".github/workflows/copilot_pull_request_comment.yml", + ".github/workflows/agent-cli-provisioning.yml", + ".github/workflows/copilot_credential_health.yml" ], "entrypoints": [ "src/cli/commands/setup.ts", @@ -869,7 +872,17 @@ "src/cli/setup_confirmation_adapter.ts", "src/cli/web_setup_adapters.ts", "scripts/validate-agent-documentation.cjs", - "src/utils/setup_workflow_upgrade.ts" + "src/utils/setup_workflow_upgrade.ts", + "src/domain/setup_runner.ts", + "src/application/policies/setup_runner_policy.ts", + "src/application/policies/setup_runner_question_policy.ts", + "src/application/policies/setup_runner_guidance_policy.ts", + "src/application/ports/setup_runner_ports.ts", + "src/infrastructure/setup_runner_discovery_adapter.ts", + "src/infrastructure/composition/setup_runner_composition_root.ts", + "src/utils/setup_installation_review.ts", + "src/cli/setup_installation_review_presenter.ts", + "src/application/policies/setup_runner_installation_summary_policy.ts" ], "tests": [ "src/data/repository/__tests__/repository_version_tags_query_repository.test.ts", @@ -979,7 +992,17 @@ "src/infrastructure/__tests__/setup_batch_guidance_compatibility.test.ts", "src/utils/__tests__/setup_workflow_upgrade.test.ts", "src/cli/__tests__/setup_pat_intent_adapter.test.ts", - "src/application/usecases/__tests__/push_single_action_contexts.test.ts" + "src/application/usecases/__tests__/push_single_action_contexts.test.ts", + "src/application/policies/__tests__/setup_runner_policy.test.ts", + "src/application/policies/__tests__/setup_runner_question_policy.test.ts", + "src/infrastructure/__tests__/setup_runner_discovery_adapter.test.ts", + "src/utils/__tests__/setup_runner_installation.test.ts", + "src/cli/__tests__/web_setup_runner_components.test.ts", + "src/application/policies/__tests__/setup_runner_installation_summary_policy.test.ts", + "src/application/usecases/setup/__tests__/setup_runner_planning.test.ts", + "src/cli/__tests__/setup_runner_config_file.test.ts", + "src/infrastructure/__tests__/setup_runner_composition.test.ts", + "src/tooling/__tests__/setup_provisioning_workflow.test.ts" ], "documentation": [ "README.md", @@ -1156,7 +1179,11 @@ "web/src/components/SetupSidebar.svelte", "web/src/components/RepositorySelector.svelte", "web/src/components/BatchSetupPanel.svelte", - "web/src/components/BatchSafetyBanner.svelte" + "web/src/components/BatchSafetyBanner.svelte", + "web/src/components/InstallationReview.svelte", + "web/src/components/RunnerQuestionDetails.svelte", + "web/src/i18n/runnerCopy.ts", + "scripts/web-setup-runner-review-fixtures.cjs" ], "tests": [ "src/__tests__/cli.test.ts", @@ -1220,7 +1247,8 @@ "src/application/usecases/setup/__tests__/manage_setup_use_case.test.ts", "src/infrastructure/__tests__/setup_management_workspace_adapter.test.ts", "src/cli/__tests__/setup_management_adapter.test.ts", - "src/cli/__tests__/web_setup_management_components.test.ts" + "src/cli/__tests__/web_setup_management_components.test.ts", + "src/cli/__tests__/web_setup_runner_components.test.ts" ], "documentation": [ "README.md", @@ -1304,7 +1332,7 @@ "status": "proposed", "scope": "Guide creation of the one-run operator PAT through GitHub's official form, verify final setup access, and report user-owned deletion accurately", "owner": "Copilot maintainers", - "lastVerified": "2026-10-07", + "lastVerified": "2026-10-18", "specs": [ "specs/temporary-setup-operator-authorization.md" ], @@ -1325,7 +1353,8 @@ "src/application/usecases/setup/audit_configured_setup_pat_use_case.ts", "src/application/usecases/setup/setup_token_permissions_use_case.ts", "src/infrastructure/setup_token_permission_query_adapter.ts", - "src/utils/setup_files.ts" + "src/utils/setup_files.ts", + "src/application/policies/setup_runner_question_policy.ts" ], "tests": [ "src/cli/__tests__/setup_presenters.test.ts", @@ -1341,7 +1370,8 @@ "src/application/usecases/setup/__tests__/audit_configured_setup_pat_use_case.test.ts", "src/application/usecases/setup/__tests__/setup_token_permissions_use_case.test.ts", "src/infrastructure/__tests__/setup_token_permission_query_adapter.test.ts", - "src/utils/__tests__/setup_files.test.ts" + "src/utils/__tests__/setup_files.test.ts", + "src/application/policies/__tests__/setup_runner_question_policy.test.ts" ], "documentation": [ "README.md", diff --git a/specs/setup-runner-profiles-and-installation-parity.md b/specs/setup-runner-profiles-and-installation-parity.md new file mode 100644 index 000000000..aff29ec4f --- /dev/null +++ b/specs/setup-runner-profiles-and-installation-parity.md @@ -0,0 +1,467 @@ +# Runner Profiles and Installation Parity + +- Status: Ready for implementation +- Date: 2026-10-18 +- Catalog capability ID: `setup-and-doctor` +- Last verified: not applicable (prospective companion) +- Owners: Copilot maintainers +- Scope: Add explicit runner-profile planning and safe source/consumer installation parity review to setup for single and multiple repositories. +- Related issues/PRs: [#556](https://github.com/vypdev/copilot/issues/556), [#538](https://github.com/vypdev/copilot/issues/538), [#546](https://github.com/vypdev/copilot/issues/546), [#555](https://github.com/vypdev/copilot/pull/555), [#559](https://github.com/vypdev/copilot/pull/559), [platform#175](https://github.com/vypdev/platform/pull/175) +- Required review gates: product UX, architecture, testing, documentation, security/operations +- Open decisions blocking readiness: none; implementation details remain subject to the stated invariants and acceptance evidence. + +This is an additive companion to the existing setup capability. Owning specifications are `specs/setup-configuration-credentials-and-doctor.md`, `specs/setup-doctor-architecture-hardening.md`, `specs/organization-configuration-reuse-and-batch-setup.md`, and `specs/setup-pat-permission-guidance-and-verification.md`. The proposed companion does not already own itself. Existing catalog paths describe current evidence, not required future file locations. + +## 1. Executive summary + +Setup will let an operator retain installed runner routing, explicitly select a hosted or known self-hosted profile, and review the effective routing for each job role before creating installation pull requests. In the same plan, setup will compare source and consumer assets, explain source-only extensions and compatibility, and produce a complete reviewable diff with backup and recovery information. + +The default preserves reviewed installed routing. If no routing exists, setup shows the hosted template choice; it never selects self-hosted execution implicitly. Shared organization profiles are non-secret configuration snapshots. The primary safety rule is that agent jobs, ordinary validation, trusted approval observers, and release/publication jobs retain distinct routes and protections. + +```text +Select targets -> inspect installed configuration and optional inventory -> choose or retain a profile -> review per-role routing and parity -> inspect full diffs -> create PRs -> merge and verify +``` + +## 2. Problem, current behavior, and evidence + +### 2.1 Problem + +Setup currently installs `ubuntu-latest` templates and expects operators to adapt runner routing manually. Reusing Variables and Secret bindings does not make a workflow run on the runner where Codex is authenticated. Operators need to understand which jobs run where, whether access is verified, and whether runners have capacity before applying changes. Maintainers also need to distinguish true consumer drift from intentional source-only workflows and configuration. + +### 2.2 Current behavior + +1. Setup can plan repository configuration and reuse organization configuration, including batch targets, but the supplied evidence does not establish a guided job-role runner profile chooser. +2. Existing installation previews and applies can update repository workflows; previous dogfooding showed that replacing existing routing or source workflow content can be unsafe. +3. Copilot source includes custom workflows and validation behavior that clean consumer templates do not share. +4. Optional source workflows `agent-cli-provisioning.yml` and `copilot_credential_health.yml` are absent from the current source checkout/master evidence. They must not be enabled without compatible definitions and validators. + +The first three items describe current behavior from supplied issue and catalog evidence. No assumption is made that every catalogued workflow currently exists in the checkout. + +### 2.3 Evidence + +- Code/spec ownership: catalog capability `setup-and-doctor`; current owning specifications listed above; cataloged batch setup ports, policies, use cases, and CLI/web adapters. +- Concrete evidence: issue #556 records previews #550 and `vypdev/platform#170` that replaced routing/workflows, corrected PRs #555 and `vypdev/platform#175`, and source validator findings from smoke run `39069446089`. SDD admission run `39080887942` stopped on the appendix size limit; the compact companion was published successfully by run `39081097654`. +- Compatibility fixtures required: preserve Branch Sync all-branch coverage, merge-queue explicit Bash shell, fork/merge-group hosted isolation, trusted-default observer checkout, source Action references, release/npm jobs, and installer exclusions. +- Unknowns: exact existing UI components and provider endpoints to reuse are implementation discovery; they do not alter the product contract. + +### 2.4 Retrospective classification (as-built baselines only) + +Not applicable: this is a prospective companion and does not reconstruct an implemented baseline. + +## 3. Actors, surfaces, and terminology + +| Actor | Goal | Entry point | Visible surfaces | +|---|---|---|---| +| Repository maintainer | Install or update one repository safely | Setup CLI or web setup | Plan, profile review, diff, PR, docs | +| Organization operator | Reuse a profile across selected repositories | Batch setup | Per-repository readiness and exceptions | +| Copilot maintainer | Reconcile source and consumer assets | Source setup/parity review | Inventory, compatibility results, PR diff | +| Reviewer/operator | Verify outcome and recover safely | Installation PR/checks | Job summary, checks, troubleshooting docs | + +A **profile** is bounded non-secret routing configuration. A **role** is an execution purpose: agent, ordinary validation, hosted credential verification, trusted observer, or release/publication. **Readiness** means the plan has sufficient evidence to propose the selected route; it does not guarantee capacity or group authorization. **Parity inventory** classifies each relevant asset as shared/generated, intentional source-only extension, missing, customized, or incompatible with the installed generator version. **Snapshot** means the reviewed profile values stored in a proposed installation plan; it is not a Secret copy. + +## 4. Goals + +### 4.1 Goals + +1. Enable one guided CLI or web session to select an explicit profile for one or more repositories and show readiness and exceptions per target. +2. Make job routing, authentication prerequisites, group-access uncertainty, and capacity status understandable before Apply. +3. Reconcile source and consumer assets without erasing source-only behavior, customizations, or incompatible guidance. +4. Make reviewed setup repeatable and idempotent, with recoverable partial completion. + +### 4.2 Non-goals + +1. Registering runners, changing runner-group membership/access, or expanding organization permissions. +2. Reading/copying Secret values, changing credential bindings, or remediating vulnerabilities. +3. Automatically merging PRs, releasing, or replacing the existing Action-owned issue/branch lifecycle. +4. Copying all Copilot workflows into consumers or suppressing manual YAML editing as an advanced option. + +### 4.3 Fixed product/safety invariants + +1. Retain existing reviewed routing unless an operator explicitly chooses a replacement; without existing routing, show hosted defaults explicitly. +2. Never silently fall back to a different execution environment. Busy/offline is pending capacity; unknown access remains unknown. +3. Agent, validation, observer, and publication jobs are routed independently. Trusted observers remain isolated; hosted OIDC publication requirements remain intact. +4. Reuse cannot change shared Variables, Secret bindings, runner-group access, or unrelated repository memberships. +5. Apply requires review of effective YAML and complete diffs. Backups and human customizations are retained through migration. + +## 5. Current versus proposed product journey + +| Stage | Current | Proposed | User/operator effect | +|---|---|---|---| +| Confirm targets | Existing setup selection | Single or explicitly selected batch targets | Target set is visible and fixed for the plan | +| Reuse configuration | Organization configuration reuse is available | Reuse a named profile snapshot, with per-repository exception | Shared values are visible without secret contents | +| Choose execution | Templates default to hosted runner | Retain routing or explicitly choose hosted/existing self-hosted profile | Role-specific effective YAML and prerequisites shown | +| Check readiness | Operators adapt YAML and discover failures later | Optional read-only inventory; access and capacity reported separately | Clear verified, unknown, and pending states | +| Review changes | Workflow/resource plan | Asset classifications, compatibility, full diff, backup | Source extensions and customization are inspectable | +| Apply and verify | Setup PR/apply lifecycle | Create installation PR(s); normal review, merge, verification | No implicit merge or release | + +```mermaid +flowchart LR + A[Confirm targets] --> B[Reuse or define profile] + B --> C[Plan routing by job role] + C --> D[Check access, prerequisites, and capacity] + D --> E[Classify assets and inspect full diffs] + E --> F[Create installation PRs] + F --> G[Merge and verify] +``` + +Text equivalent: confirm targets -> select a profile -> review role routes and readiness -> inspect parity and diffs -> create PRs -> merge and verify. + +## 6. Functional behavior and state model + +### 6.1 Happy path + +1. The CLI/web entrypoint collects explicit targets and reads existing repository configuration and workflows through application ports. +2. Setup offers retained routing, a hosted default when routing is absent, reusable organization profiles, and manual entry of a known self-hosted profile. +3. A pure planner resolves each job role independently and produces effective YAML, prerequisites, access evidence, and per-target exceptions. +4. Optional read-only discovery enriches evidence. If inventory permission is missing, the plan remains usable and marks group/label access unverified. +5. The parity planner classifies relevant assets and generator compatibility, then computes a complete diff and backup manifest. +6. The operator reviews every target and applies; setup creates the authorized installation PR(s), records receipts, and reports partial outcomes accurately. + +### 6.2 Alternative paths + +- An exact manually entered profile is accepted without organization inventory permission, with an explicit unverified-access notice. +- A busy/offline runner keeps the plan pending capacity; it does not trigger hosted fallback. +- An unsupported or unverifiable route blocks only applying that route and names a recovery action, such as choose a supported profile or ask an organization administrator to verify access. +- A customized asset is preserved and surfaced for review. An incompatible generator version prevents silent regeneration; the operator must select a compatible version or retain the current asset. +- Manual YAML remains available as an advanced path and is reported as customized/drifted on later audits. + +### 6.3 State machine + +| State | Entered when | User-visible meaning | Allowed next states | Recovery/owner | +|---|---|---|---|---| +| Draft | Targets selected | No changes proposed yet | Planned, canceled | Operator edits targets | +| Planned | Profile and inventory evaluated | Routes and asset diff are reviewable | Pending capacity, blocked, ready | Setup planner | +| Pending capacity | Runner is busy/offline | Route is valid; capacity is unavailable now | Ready, canceled | Retry readiness check or wait | +| Blocked | Unsupported route or incompatible asset | Apply is unavailable for affected change | Planned, canceled | Correct profile/version or retain asset | +| Ready for review | All required decisions are explicit | Full diff and effective YAML available | Applying, canceled | Operator reviews | +| Partially applied | Some target PRs/resources succeeded | Completed targets retained; others need recovery | Ready for review, complete | Retry failed targets only | +| Complete | Requested PRs created and receipts recorded | Review/merge and verification remain | Complete | Operator/reviewer | +| Canceled | Operator cancels before further effects | No additional changes will be applied | — | Retain receipts/backups if effects occurred | + +Duplicate planning is idempotent for the same target, profile snapshot, generator version, and source facts. Stale facts require re-planning before Apply. Out-of-order or canceled requests cannot apply an older plan. Partial batch retries target only incomplete repositories and preserve successful receipts. + +## 7. User-facing configuration + +| Input | Type | Recommended default | Allowed values/range | Scope/persistence | +|---|---|---|---|---| +| Profile source | Enum | `retain` if installed routing exists; otherwise `hosted` | `retain`, `hosted`, `organization-profile`, `manual-self-hosted` | Operation; snapshot in reviewed plan | +| Agent runner group | Bounded string | Existing value; for vypdev profile `vypdev` | 1–100 characters; GitHub-supported group name | Organization profile or repository exception; snapshot | +| Agent labels | Ordered unique list | Existing values; vypdev profile: `self-hosted`, `codex`, `Linux` | 1–10 labels, each 1–100 characters | Same as group | +| Repository exception | Bounded mapping | None | Explicit target repository to profile override; existing maximum 25 targets per operation | Operation snapshot | +| Generator compatibility (observed) | Contract metadata | Retain the compatible installed generator | Profile schema 2/contract 2, manifest schema 2/contract 1, runner snapshot schema 1; unknown/future metadata is retained or blocks regeneration | Per asset/plan; select a compatible CLI/source generator outside the wizard | + +Validation rejects empty labels, duplicate labels, control characters, unsupported YAML values, unbounded target lists, and profile fields that attempt to set credentials, arbitrary commands, refs, or URLs. Group and labels do not prove authorization. Job-role routes are not user-configurable as a single global override. + +Precedence is: explicit repository exception > explicitly selected organization profile snapshot > retained repository routing > hosted default when no routing exists. The operator must confirm any replacement. Plans snapshot values at review; if target configuration or generator compatibility changes before Apply, setup invalidates the stale plan and re-reads facts. An absent legacy runners configuration means retain. Incomplete registry entries and unknown future registry fields/versions are rejected and surfaced for review; they never infer access. + +Recommended example: retain current routing for existing targets and reuse an organization agent profile with group `vypdev` and labels `self-hosted`, `codex`, `Linux`; keep observer and release routes independent. Meaningful alternative: explicitly choose hosted agent execution where appropriate and review the hosted YAML. Never configurable: secret access, group membership, observer isolation, hosted OIDC publication, or automatic fallback. + +## 8. Clean Architecture design + +### 8.1 Responsibilities and dependency direction + +| Layer/boundary | Owns | Must not own/import | +|---|---|---| +| Domain/pure policy | Profile validation, precedence, role routing, asset classification, compatibility decisions | GitHub SDK, process, UI | +| Application | Plan/review/apply/retry use cases; immutable plan and receipt contracts | Provider DTOs or concrete CLI/web frameworks | +| Adapters/data | Read repository/workflow facts, optional runner inventory, create PRs, retain backups | Product decisions or fallback policy | +| Infrastructure/composition | GitHub/process implementations, wiring, bounded persistence/journaling | Business decisions | +| Entrypoints | CLI/web input validation and invoking use cases | Duplicated planning/orchestration | +| Presentation | Shared view model, CLI and web rendering of states/diffs | Mutations or independent state transitions | + +```mermaid +flowchart LR + E[CLI or web entrypoint] --> U[Setup planning/application use case] + U --> D[Pure profile and parity policies] + U --> P[Semantic setup and inventory ports] + G[GitHub/workspace adapters] --> P + U --> V[Shared presentation model] + V --> C[CLI renderer] + V --> W[Web renderer] +``` + +### 8.2 Contracts, state, and trust boundaries + +- Pure decisions: schema validation, profile precedence, per-role route resolution, readiness classification, asset parity, version compatibility, diff safety, and retry target selection. +- Application contracts: immutable target facts, profile snapshot, `RunnerRolePlan`, `AssetFinding`, `SetupPlan`, `ApplyReceipt`, and typed failure result. Operator credentials and GitHub Secret API values are absent. Local workflow previews retain their documented recognized-format masking boundary. +- Semantic ports: read existing routing/assets; optionally enumerate eligible groups/labels; inspect repository access evidence; create reviewed PR; write/verify backup; read generator compatibility metadata. +- Durable state/schema ownership: the plan owns target/configuration snapshots and rendered files; the private journal owns operation IDs, plan digests, target receipt transitions and exact prepared commits. Generator contracts and backups remain reviewed repository assets, bound by the commit and plan digest. The journal contains neither configuration values nor Secret values. +- Concurrency/idempotency: bind Apply to plan hash and fresh target facts; deduplicate by operation/target; serialize conflicting writes per repository; partial retry excludes completed targets. +- Trust: issue, PR, workflow, repository, and inventory text are untrusted data. Parse profile fields against bounded schemas; render/sanitize Markdown and URLs; never execute discovered strings. +- Provider mapping: permission denial becomes `inventory-unavailable` or `access-unknown`, not empty inventory; busy/offline becomes `pending-capacity`; not-found and malformed provider responses remain distinct actionable errors. + +### 8.3 Executable architecture constraints + +Automated architecture tests MUST enforce domain independence from GitHub/CLI/web modules, application dependency on semantic ports only, and presentation dependence on view models only. Contract tests MUST parse generated YAML and assert every role route, shell, trigger, Action reference, publication condition, and generator version structurally. A parity fixture MUST fail if source-only native CI, root-local Action usage, release/npm jobs, Branch Sync coverage, or explicit Bash disappears, or if incompatible optional workflows are enabled. + +## 9. UI/UX and content contract + +### 9.1 Information hierarchy + +Show current plan/readiness first, then completed discovery facts, next review/apply step, human action, impact and target links, and collapsed sanitized diagnostics. Use the same state and planning decisions in CLI and web. + +### 9.2 Representative primary view + +Pending capacity: + +```markdown +# Runner profile review + +> **Current status:** Profile is valid; no matching runner is available right now. +> +> **Action required:** No change is required to the profile. Check capacity, then refresh readiness. + +## Progress + +- [x] Reused organization profile `vypdev-agent` for `vypdev/platform` and `vypdev/copilot` +- [x] Agent jobs route to group `vypdev` with labels `self-hosted`, `codex`, `Linux` +- [ ] Runner capacity is pending for `vypdev/platform` + +## What happens next + +The setup plan keeps the selected route and will not switch to hosted execution. + +## Links + +[Review platform installation diff](https://github.com/vypdev/platform/pull/175/files) · [Runner access guidance](https://github.com/vypdev/copilot/blob/master/docs/how-to-use.mdx) + +
                                                                                                +Technical details + +Inventory was read-only. Group authorization is unverified; capacity check returned busy. +
                                                                                                +``` + +Required variants use the same hierarchy: + +- **Action required:** “Profile access could not be verified. Ask an organization administrator to confirm repository access, or choose a verified profile. No PR has been created.” +- **Blocked:** “The selected generator cannot safely render this customized workflow. Retain it or select a compatible generator version. No files were changed.” +- **Partial:** “PRs were created for 2 of 3 repositories. Those PRs and backups are retained. Review the two links; retry only the remaining repository.” +- **Complete:** “Installation PRs were created for all 3 repositories. Review and merge them, then run verification. No PR was merged automatically.” + +### 9.3 Issue, PR, and comment behavior + +- PR title retains `chore: configure Copilot`; one PR per target repository, deterministic target-specific body and plan marker. A runner/parity section records the selected managed agent route, source exceptions, observation counts, asset counts, plan digest, backup location and verification handoff. Registry source values never enter the PR body. +- Merge creates the reviewed repository changes; close leaves repository content unchanged; retry only resumes incomplete targets after fresh planning. Merge does not trigger setup automation beyond existing repository workflows. +- The existing installer marker and manifest receipt retain operation ID, repository identity, reviewed base SHA and plan digest. That digest binds the snapshot files; generator contracts remain in guidance metadata and backups remain tree assets. No receipt/journal schema changes or registry values are persisted in the private journal. Updates are idempotent and preserve human edits by invalidating stale diffs. +- No setup comments are required. At most one updated status comment per operation if an existing lifecycle requires it; checks and labels are supplemental. +- Link each target to its PR, full comparison, backup artifact, relevant run, and recovery documentation. + +### 9.4 Accessibility, localization, and responsive behavior + +Use the existing supported locale catalog and fallback behavior; translate user-facing states consistently across CLI/web. Diagrams have the textual equivalent above. Tables must remain readable on narrow screens; provide a stacked role summary when needed. Use logical headings, descriptive links, non-color status words, and accessible focus order. Sanitize untrusted Markdown, mentions, commands, HTML markers, and URLs; diagnostics are escaped and collapsed. + +## 10. Failure, recovery, and cleanup + +| Failure/partial state | User impact | Retained facts | Automatic retry | Required action | Cleanup | +|---|---|---|---|---|---| +| Inventory permission unavailable | Access is unknown | Exact manual profile and target facts | No repeated permission probing | Continue with manual profile or request access verification | No permission changes | +| Runner busy/offline | Work cannot start yet | Selected route and pending status | Bounded readiness refresh only | Wait or check capacity | None | +| Unsupported route | Profile cannot be applied | Plan and diagnostics | No | Select supported route | Discard stale plan | +| Generator/profile incompatible | Potential workflow breakage | Existing asset and version evidence | No | Retain asset or choose compatible generator | Keep backup | +| Stale target facts | Diff may overwrite new edits | Prior plan hash | Replan, not blind retry | Review new complete diff | Retain old backup reference | +| PR creation fails for target | Batch incomplete | Successful receipts and failed target error | Retry failed target only | Correct permission/rate limit and retry | No rollback of successful PRs | +| Backup write fails | Recovery is unavailable | No apply receipt | No apply | Restore backup capability, then re-plan | No mutation allowed | + +Errors follow `impact -> cause -> action -> retained state`. An already created PR is never described as failed because another target failed. + +## 11. Security, permissions, and privacy + +1. Inventory discovery is optional and read-only. Use existing least-privilege setup authorization; never request broad organization administration solely for profile entry. +2. Profiles contain only bounded group/label and role-routing metadata. Never read or copy Secret values; preserve bindings and shared Variables without overwriting. +3. Do not grant runner-group access, register runners, or infer access from labels, refs, or workflow restrictions. Unknown remains explicit. +4. Treat repository and GitHub content as untrusted; validate structured inputs and sanitize output. Do not execute profile or asset text. +5. Preserve trusted observer isolation, hosted publication/OIDC constraints, and fork/merge-group isolation. Log identifiers and sanitized evidence only. + +## 12. Observability and operational UX + +- User-facing state: per-target profile, role routes, readiness, parity classification, and next action. +- PR summary: plan hash, generator version, asset inventory counts, route summary, backup reference, and verification instructions. +- Operational logs: correlate operation and target IDs; record provider outcome categories without operator credentials or Secret API values. Interactive local workflow diffs follow the explicit recognized-format masking boundary, separate from telemetry and durable receipts. +- Pending capacity and unknown access are not workflow failures. Unsupported routes and failed writes are failures with recovery actions. +- Respect provider rate limits; bounded backoff only for idempotent reads/writes, with visible retry state. No notification storm: one status update per meaningful transition. + +## 13. Compatibility, migration, rollout, and rollback + +Existing installations are read before planning. The proposed diff preserves current routing and customizations unless explicitly replaced. Organization profiles snapshot into each reviewed installation and do not mutate the source profile or shared resources. Existing installations without runner metadata retain their routes or explicitly select hosted defaults. Registry schema 1 requires complete role metadata; future/unknown schema versions cannot be applied automatically. A changed CLI/generator can change the plan digest: keep prior journals and PRs, resume with the matching generator or start a fresh reviewed operation; never rewrite an old receipt or force-adopt an existing branch. + +Roll out behind the existing setup admission path after parity fixtures pass. First exercise a clean consumer, organization-profile reuse across selected repositories, and an existing source installation. Keep backup copies and full diffs for every target. Rollback means close an unmerged PR or revert the merged commit using its backup; never auto-revert unrelated human changes. Enabling the two optional source workflows requires compatible source definitions and validators in the same reviewed change. + +## 14. Testing strategy and numeric budget + +The initial floor is 56 distinct cases. The allocations below are disjoint; parameterized rows count only when they exercise distinct behavior. Existing repository budgets and thresholds remain in force. + +| Area | Minimum distinct cases | Behaviors/risks covered | +|---|---:|---| +| Profile validation and precedence | 10 | Bounds, invalid fields, defaults, retained routing, organization reuse, repository exception, unknown schema | +| Job routing and isolation | 10 | Agent/validation/observer/publication routes, auth prerequisite, shell, fork and merge-group isolation, OIDC | +| Guided discovery authorization | 8 | Default off, reviewed read-only prefill, personal owner, manual recovery, fixed config, conditional audit, retained choice and private intent | +| Discovery and access failure | 8 | Optional inventory, permission denial, unknown access, busy/offline capacity, malformed and unsupported evidence | +| Source/consumer parity and version compatibility | 8 | Asset classifications, source extensions, missing optional workflows, generator mismatch, shell/trigger/Action/release regressions | +| CLI/web UX | 6 | Shared states, pending/action/blocked/partial/complete content, accessible and sanitized output | +| Migration/idempotency/partial recovery | 6 | Backup, stale plan, repeated setup, customization preservation, partial batch retry, rollback evidence | +| **Total** | **56** | No double counting | + +New pure decisions require 100% branch coverage. Repository-wide coverage budgets remain unchanged; changed modules must meet or exceed their existing configured thresholds. Add table-driven domain tests, application replay/race tests, adapter contract tests, structural YAML/workflow checks, security tests for untrusted content, and golden UX fixtures with semantic assertions. Use deterministic IDs, clocks, and fakes; no real waits or live services in automated tests. Manual UX evidence must show readable role routing/readiness and complete changed-file summaries in CLI and web, plus the explicitly opened full local web diff at narrow and normal widths. Controlled live acceptance covers a clean consumer, organization-profile reuse across selected repositories, and an existing source installation. + +## 15. Documentation and discoverability + +| Audience | Artifact/page | Required content | Validation/navigation | +|---|---|---|---| +| User | `docs/how-to-use.mdx` | Guided profile journey, defaults, role explanations, examples | Link and rendered-content check | +| Setup owner | `docs/configuration.mdx`, `docs/configuration-checklist.mdx` | Profile schema, precedence, permissions, snapshots, exceptions | Config fixture/contract test | +| Operator | `docs/security-operations/operations/troubleshooting.mdx`, `verification.mdx` | Pending capacity, unknown access, failure and recovery | Decision-tree review | +| Contributor | `docs/development/architecture.mdx` | Boundaries, ports, parity classifications, version rules | Architecture test and documentation validator | + +Document backup, migration, manual YAML ownership, and rollback. Examples must match profile and YAML fixtures. Add navigation from the setup guide and relevant configuration pages. + +## 16. Acceptance scenarios + +1. Given an existing Copilot installation and selected organization repositories, when the operator reuses the `vypdev` agent profile, then the preview shows each target, role-specific effective YAML, readiness, exceptions, and no changes to shared Variables, Secret bindings, or group membership. +2. Given no installed routing, when setup starts, then it presents the hosted default explicitly and does not infer or select self-hosted routing. +3. Given a busy or offline matching runner, when readiness is checked, then the state is pending capacity and the selected route remains unchanged with a refresh/wait action. +4. Given inventory permission is unavailable, when an exact manual profile is entered, then planning remains available and access is clearly unverified; applying does not grant access. +5. Given agent, observer, validation, and publication jobs, when YAML is rendered, then each role retains its own route, observer isolation, and hosted OIDC publication requirements. +6. Given an incompatible generator version or customized source workflow, when parity is reviewed, then the asset is classified and setup blocks silent regeneration while retaining a backup and offering a compatible-version or retain action. +7. Given source parity fixtures, when a shell, Branch Sync coverage, source-local Action reference, release job, or required workflow condition is removed, then the structural parity check fails before Apply. +8. Given a batch where one PR creation fails, when the operator retries, then completed target PRs remain recorded and only the failed target is retried; the result names retained links and next actions. +9. Given the same reviewed plan and unchanged target facts applied twice, when setup reconciles, then it produces no duplicate changes or PR and reports the existing receipt. +10. Given hostile Markdown or URL content in repository metadata, when rendered in CLI/web/PR summaries, then it is escaped or omitted and cannot create an actionable forged link or command. +11. Given narrow/mobile rendering, when a user reviews all states, then role and readiness meaning is available without color or horizontal-only information. +12. Given implementation completion, when documentation and architecture validation run, then examples match fixtures, catalog ownership is updated for the new companion path, and `pnpm run validate:specifications` passes. + +## 17. Requirements traceability + +| Requirement | Policy/use case/adapter/presentation | Test or evidence | Documentation | +|---|---|---|---| +| Retained/default profile and bounded precedence | Profile planner and setup use case | Profile cases 1–10 | Configuration reference | +| Role routing and fixed protections | Role-routing policy and YAML adapter | Routing cases 1–10; structural fixtures | User guide, architecture | +| Optional inventory and unknown access | Inventory port and evidence mapper | Discovery cases 1–8 | Setup permissions, troubleshooting | +| Source/consumer classifications | Parity policy and generator adapter | Parity cases 1–8 | Contributor guide | +| Shared CLI/web plan and accessible states | Presentation model/renderers | UX cases 1–6 plus manual evidence | User guide | +| Backup, idempotency, partial recovery | Apply use case and journal | Recovery cases 1–6 | Operator verification and rollback | +| No secret/access expansion | Profile schema, ports, security constraints | Security assertions across budget | Credentials and permissions docs | + +## 18. Implementation sequence + +1. Define profile, role-plan, parity, and receipt contracts; add architecture and workflow structural constraints. +2. Implement pure validation, precedence, routing, readiness, and compatibility policies with complete branch coverage. +3. Add application planning, stale-plan protection, partial retry, and idempotent apply orchestration. +4. Add read-only inventory and repository/workspace adapters with typed provider error mapping and backup handling. +5. Build shared presentation models and CLI/web renderers for all states; review accessibility and localization. +6. Add source/consumer fixtures, compatible optional workflow definitions only where supported, and migration/recovery behavior. +7. Complete docs, catalog updates, controlled live acceptance, coverage evidence, and final validation. + +## 19. Definition of Done + +- [ ] Every normative requirement has an acceptance scenario and traceability entry. +- [ ] Domain/application/adapter/presentation boundaries and structural workflow constraints pass. +- [ ] At least 56 distinct cases pass in the stated allocation; new pure decisions have full branch coverage; existing budgets remain satisfied. +- [ ] Defaults, bounds, precedence, snapshots, stale-plan behavior, and migration agree across CLI and web. +- [ ] Pending, action-required, blocked, partial, and complete content is reviewed for accessibility, localization, responsive use, and sanitization. +- [ ] No Secret values are read/copied; no shared resources are overwritten; no access is broadened; observer and publication protections remain. +- [ ] Backups, complete diffs, idempotency, partial recovery, rollback, and three controlled live acceptance cases pass. +- [ ] User, setup, operator, and contributor documentation is complete and discoverable, with examples checked against fixtures. +- [ ] Required generated artifacts and repository validation commands pass. +- [ ] Catalog evidence and `specs/CATALOG.md` are current; `pnpm run validate:specifications` passes. +- [ ] No readiness-blocking decision remains unresolved. + +## 20. References and decisions + +- Primary source: [issue #556](https://github.com/vypdev/copilot/issues/556), including supplied controlled setup evidence. +- Owning specifications: setup/configuration/doctor, setup architecture hardening, organization configuration reuse and batch setup, and setup PAT permission guidance and verification. +- Related evidence: [#538](https://github.com/vypdev/copilot/issues/538), [#546](https://github.com/vypdev/copilot/issues/546), [#555](https://github.com/vypdev/copilot/pull/555), [#559](https://github.com/vypdev/copilot/pull/559), [platform#175](https://github.com/vypdev/platform/pull/175). +- Decisions: additive companion under `setup-and-doctor`; retain installed routing by default; use explicit hosted default when absent; reusable profiles are non-secret snapshots; optional read-only discovery; preserve per-role security routes; classify intentional source extensions and require compatible rendering. +- Outside scope: automatic merge/release, group access changes, Secret handling, vulnerability remediation, and replacing the existing Action-owned lifecycle. + +### Concrete configuration and adapter contract (2026-10-18) + +`SetupConfiguration.runners` is additive; absence means `retain`. Its fields are +`mode` (`retain`, `hosted`, `organization-profile`, `manual-self-hosted`), +`profileId` (empty or 1–50 safe identifier characters), `group` (empty or 1–100 +single-line literal characters), `labels` (1–10 unique literal labels of 1–100 +characters for a selected self-hosted route), and `validation` (`hosted` or +`agent`). Group and label inputs reject expressions and control characters. +Self-hosted selections require `self-hosted` and a Linux or macOS label because +the generated workflows require Bash; Windows service Codex execution is outside +this contract. The validation choice is an advanced exception, never a global +replacement. Agent CLI provisioning uses the agent route and checks each role's +own executable override or provider-specific default; a generic executable never +crosses into another role. Ordinary automation uses the validation route. Credential verification is a +separate protected role: explicit managed-route replacement always uses +`ubuntu-latest` for it, regardless of ordinary validation. Retain preserves +existing reviewed routing as a visible exception. Merge-group checks and consumer +approval observers keep their trusted hosted templates. Consumer publication +and source npm/OIDC jobs keep their publication route. + +An existing non-secret Variable `COPILOT_RUNNER_PROFILES` contains +`{"schemaVersion":1,"profiles":[{"id":"vypdev-agent","group":"vypdev","labels":["self-hosted","codex","Linux"],"validation":"hosted"}]}`. +At most ten distinct profiles and 16,000 characters are accepted. Unknown schema +versions and fields are rejected with a recovery action rather than executed. +An existing repository Variable wins over the organization Variable; an invalid +repository override cannot expose a shadowed organization profile as effective. +Unavailable repository Variable inventory cannot prove that an override is +absent, so a readable organization registry alone cannot authorize selection or +freshness; restore repository metadata access or choose explicit manual routing. +Setup reads this registry and snapshots a chosen profile; it never writes the +registry or adds repository access to it. The effective selected snapshot is +recorded in `.copilot/runner-profile.json`, with source scope and a digest for +freshness checks; unselected profiles are never copied into the repository. Manual selection creates no Variable or Secret. Selection is +per target, so the existing batch configuration review provides visible target +exceptions. Profile-source drift invalidates Apply before permission probes. + +Before PAT collection in Customize, organization reuse and multi-repository setup, the shared permission-intent questionnaire asks the optional +boolean `runners.discover` (default false). Opting in discloses and prefills +repository Administration read and organization Self-hosted runners read via +`administration=read` and `organization_self_hosted_runners=read`. Personal +owners get only the repository grant. Conditional discovery grants never block +manual configuration, are never added to the workflow PAT, and remain distinct +from runner access changes. Fixed config skips the repeated intent question; +the final questionnaire retains that explicit choice. Batch target defaults and replacement PAT links preserve it without dropping the previous target’s selected route. Discovery runs only when +enabled, including when enabled later using an existing PAT. The selected-route +snapshot excludes this local intent. The PAT link leaves GitHub repository +selection to the operator. + +Read-only discovery has a separate semantic port. Fixed GitHub routes inspect +repository-local runners and, where allowed, organization groups filtered by +`visible_to_repository`, then matching group runners. Each collection is bounded +to 1,000 entries and ten pages of 100. Group fan-out is limited to ten +eligible groups and the combined runner inventory to 1,000 entries. Group visibility is not enough to establish +workflow/ref eligibility when `restricted_to_workflows` is true: report access +unknown. A failed/truncated/malformed collection cannot establish absence. An +empty repository-local list does not establish absence of organization runners. +Capacity is observational and never participates in plan identity: busy/offline +produces pending capacity without changing YAML or claiming runtime verification. +Manual access remains unverified and can be explicitly reviewed for an +installation PR; unsupported routing blocks. Setup never schedules a probe job +or changes runner permissions during discovery. + +Source detection requires a root-local invocation with Copilot-specific runtime inputs, a canonical single-action command, or the explicit approval-observer contract. An unrelated local root Action never suppresses consumer upgrades. Provisioning exercises the provider-specific non-interactive help command and rejects a missing/broken headless surface. Repository-controlled terminal metadata is control-stripped, and questions without a default show the localized empty label. + +Source workflows with root-local Copilot Action execution and source-owned guidance +remain preserved as complete assets. Explicit profile replacement affects +managed consumer jobs and newly enabled optional source workflows; native source +extensions retain their routes and are shown as exceptions. Source validation +and fixture checks must continue to detect loss of native jobs, shells, trust +conditions and branch filters. The parity inventory includes disabled optional +assets, so missing health/provisioning workflows remain visible even when their +features are off. Unknown generator metadata is classified as incompatible and +retained or blocked before regeneration; setup does not claim it can migrate a +future generator. CLI logs contain only bounded route and changed-file summaries; they never include workflow bodies or scalar credential values from those bodies. The CLI points operators to `--web` for full before/after contents in the paired local view before approval. That view masks recognized credential formats and explicitly discloses that arbitrary hardcoded workflow values can remain visible; Secret API values are never read for the preview. This is not a universal data-loss-prevention guarantee. Existing backups and immutable installer receipts remain the recovery mechanism. + +Primary provider references: +[runner API](https://docs.github.com/en/rest/actions/self-hosted-runners), +[group API](https://docs.github.com/en/rest/actions/self-hosted-runner-groups), and +[workflow routing](https://docs.github.com/en/actions/how-tos/manage-runners/self-hosted-runners/use-in-a-workflow). + + +The profile schema and guidance ownership manifest use distinct generator +contracts: repository-profile schema 2/contract 2 and setup-manifest schema +2/contract 1. Swapping those versions is incompatible, even though both documents +use schema version 2. Batch defaults reuse the preceding explicit runner choice +for the next target, visibly before its questionnaire; registry precedence is +resolved again for that target, and every repository can choose an exception. +A selected registry's repository/organization scope is shown even when its value +is invalid, without exposing that invalid value. Recognizable credential material +is rejected from literal IDs, groups and labels before it can reach presentation +or a snapshot. diff --git a/src/__tests__/cli.test.ts b/src/__tests__/cli.test.ts index 9040a317f..cff8572a3 100644 --- a/src/__tests__/cli.test.ts +++ b/src/__tests__/cli.test.ts @@ -1100,6 +1100,24 @@ describe('CLI', () => { expect(process.exitCode).toBe(1); expect(runLocalAction).not.toHaveBeenCalled(); expect(mockTokenPermissionInspect).not.toHaveBeenCalled(); } finally { terminal.mockRestore(); choice.mockRestore(); intent.mockRestore(); token.mockRestore(); } }); + it('carries reviewed runner discovery intent into the authenticated batch configuration', async () => { + const driver = require('../cli/setup_terminal_driver') as typeof import('../cli/setup_terminal_driver'); + const source = require('../cli/setup_source_adapter') as typeof import('../cli/setup_source_adapter'); + const pat = require('../cli/setup_pat_intent_adapter') as typeof import('../cli/setup_pat_intent_adapter'); + const prompt = require('../cli/setup_credential_prompt_adapter') as typeof import('../cli/setup_credential_prompt_adapter'); + const batch = require('../cli/setup_batch_adapter') as typeof import('../cli/setup_batch_adapter'); + const terminal = jest.spyOn(driver, 'createInteractiveTerminalDriver').mockReturnValue(guidedTerminal()); + const choice = jest.spyOn(source, 'chooseSetupConfigurationSource').mockResolvedValue('organization'); + const intent = jest.spyOn(pat, 'collectSetupPatIntent').mockResolvedValue({ requirements: [], runnerDiscovery: true }); + const token = jest.spyOn(prompt.SetupCredentialPromptAdapter.prototype, 'requestSetupPat').mockResolvedValue('github_pat_fixture_operator_token'); + const execute = jest.spyOn(batch, 'executeSetupBatch').mockResolvedValue({ outcome: 'blocked', operation: { schemaVersion: 1, organization: 'test-owner', operationId: 'a67c8e40-93be-43ed-a7ed-e07378c7e773', targets: [] } }); + mockTokenPermissionInspect.mockResolvedValue(acceptedSetupPatReport()); + try { + await program.parseAsync(['node', 'cli', 'setup', '--batch']); + expect(execute).toHaveBeenCalledWith(expect.objectContaining({ overrides: expect.objectContaining({ runners: { discover: true } }) })); + expect(runLocalAction).not.toHaveBeenCalled(); + } finally { terminal.mockRestore(); choice.mockRestore(); intent.mockRestore(); token.mockRestore(); execute.mockRestore(); } + }); it('refuses batch discovery if a coordinator invokes it before authenticating a setup PAT', async () => { const { executeSetupCommand } = require('../cli/commands/setup_execution') as typeof import('../cli/commands/setup_execution'); const sequence = jest.spyOn(SetupSessionCoordinator.prototype, 'execute').mockImplementation(async function (this: SetupSessionCoordinator) { diff --git a/src/application/contracts/setup_batch_view.ts b/src/application/contracts/setup_batch_view.ts index d9128ff4a..3d4510426 100644 --- a/src/application/contracts/setup_batch_view.ts +++ b/src/application/contracts/setup_batch_view.ts @@ -21,6 +21,7 @@ export interface SetupBatchView { readonly retryRemaining: number; readonly targets: readonly { readonly repositoryId: number; + readonly installationReview?: import('../../domain/setup_runner').SetupInstallationReview; readonly repository: string; readonly installationBranch: string; readonly baseBranch: string; diff --git a/src/application/contracts/web_setup_view.ts b/src/application/contracts/web_setup_view.ts index 7cc7f61d5..d0abce8c8 100644 --- a/src/application/contracts/web_setup_view.ts +++ b/src/application/contracts/web_setup_view.ts @@ -70,6 +70,7 @@ export type WebSetupPrompt = | ({ kind: 'plan'; title: string; plan: WebSetupPlan; editGroups?: readonly SetupQuestion['stateId'][] } & WebSetupPromptCopyRef); export interface WebSetupPlan { + readonly installationReview?: SetupPlan['installationReview']; readonly deliveryMode?: SetupPlan['deliveryMode']; readonly organizationReuse?: SetupPlan['organizationReuse']; readonly workflowPatStorage?: SetupWorkflowPatStorageNotice; diff --git a/src/application/policies/__tests__/setup_configuration_policy.test.ts b/src/application/policies/__tests__/setup_configuration_policy.test.ts index 009ae5a70..2401a075e 100644 --- a/src/application/policies/__tests__/setup_configuration_policy.test.ts +++ b/src/application/policies/__tests__/setup_configuration_policy.test.ts @@ -16,8 +16,18 @@ import { validateSetupConfiguration, } from '../setup_configuration_policy'; import type { SetupConfigurationOverrides } from '../setup_configuration_policy'; +import { cloneSetupConfiguration } from '../setup_configuration_clone_policy'; describe('setup configuration policy', () => { + it('clones legacy configurations without runner settings and restores independent safe defaults when merged', () => { + const legacy = createDefaultSetupConfiguration(); delete legacy.runners; + const cloned = cloneSetupConfiguration(legacy); + expect(cloned.runners).toBeUndefined(); expect(cloned).toEqual(legacy); + const merged = mergeSetupConfiguration(cloned); + expect(merged.runners).toEqual({ mode: 'retain', profileId: '', group: '', labels: [], validation: 'hosted' }); + expect(legacy.runners).toBeUndefined(); + expect(mergeSetupConfiguration(cloned).runners?.labels).not.toBe(merged.runners?.labels); + }); it('builds a complete safe default plan', () => { const configuration = createDefaultSetupConfiguration(); const plan = buildSetupPlan(configuration); diff --git a/src/application/policies/__tests__/setup_pat_intent_policy.test.ts b/src/application/policies/__tests__/setup_pat_intent_policy.test.ts index d149bfbc5..9c6c5b3ed 100644 --- a/src/application/policies/__tests__/setup_pat_intent_policy.test.ts +++ b/src/application/policies/__tests__/setup_pat_intent_policy.test.ts @@ -209,3 +209,45 @@ describe('setup PAT permission intent', () => { ]); }); }); + + +describe('runner-aware guided setup PAT links', () => { + const link = (discover: boolean | undefined, owner: 'Organization' | 'User', managed: boolean) => { + const configuration = createDefaultSetupConfiguration(); + configuration.runners = { ...configuration.runners!, discover }; + configuration.manageRepositorySecrets = managed; + configuration.manageRepositoryVariables = managed; + configuration.features.issues = false; configuration.features.release = false; configuration.features.hotfix = false; + configuration.pullRequestApproval = { ...configuration.pullRequestApproval, mode: 'off' }; + const requirements = buildSetupPatIntentPermissionRequirements(configuration, owner); + return { configuration, requirements, url: new URL(buildSetupPatCreationUrl({ role: 'setup', owner: 'vypdev', repository: 'platform', + expiresIn: 1, requirements, includeConditionalSetupGrants: true })) }; + }; + test.each([false, undefined])('manual routing without discovery=%s requests no organization runners grant', discover => { + const { url, configuration } = link(discover, 'Organization', false); + expect(url.searchParams.has('organization_self_hosted_runners')).toBe(false); + expect(url.searchParams.has('administration')).toBe(false); + expect(setupPatIntentNeedsOwnerKind(configuration)).toBe(false); + }); + test.each([false, true])('reviewed organization discovery prefills optional read grants with resource management=%s', managed => { + const { url, requirements, configuration } = link(true, 'Organization', managed); + expect(url.searchParams.get('organization_self_hosted_runners')).toBe('read'); + expect(url.searchParams.get('administration')).toBe('read'); + expect(requirements.find(item => item.permission === 'Self-hosted runners')).toMatchObject({ + role: 'setup', scope: 'organization', level: 'read', applicability: 'conditional', probe: 'runner-groups' }); + expect(setupPatIntentNeedsOwnerKind(configuration)).toBe(true); + expect(setupPatIntentOwnerConflict(configuration, 'User')).toBe(false); + expect(url.searchParams.has('organization_administration')).toBe(false); + expect(url.searchParams.has('repository')).toBe(false); + }); + test('personal owners get repository discovery only and fixed config skips the preliminary question', () => { + const { url } = link(true, 'User', false); + expect(url.searchParams.has('organization_self_hosted_runners')).toBe(false); + expect(url.searchParams.get('administration')).toBe('read'); + expect(fixedSetupPatIntentQuestionIds({ runners: { discover: true } }, false, false)).toContain('runners.discover'); + }); + test('an existing Administration requirement is not duplicated by optional discovery', () => { + const configuration = createDefaultSetupConfiguration(); configuration.runners = { ...configuration.runners!, discover: true }; + expect(buildSetupPatIntentPermissionRequirements(configuration, 'Organization').filter(item => item.permission === 'Administration')).toHaveLength(1); + }); +}); diff --git a/src/application/policies/__tests__/setup_question_documentation_policy.test.ts b/src/application/policies/__tests__/setup_question_documentation_policy.test.ts index 214fd18b1..4141424cb 100644 --- a/src/application/policies/__tests__/setup_question_documentation_policy.test.ts +++ b/src/application/policies/__tests__/setup_question_documentation_policy.test.ts @@ -4,6 +4,11 @@ import type { SetupQuestion } from '../../../domain/setup_questionnaire'; import { setupQuestionDocumentation } from '../setup_question_documentation_policy'; describe('setup question documentation', () => { + test.each(['runners.discover', 'runners.mode', 'runners.profileId', 'runners.group', 'runners.labels', 'runners.validation'])('%s links to the runner profile guide', id => { + expect(setupQuestionDocumentation({ id, stateId: 'agent-runtime' })).toEqual({ title: 'Runner profiles', + url: 'https://docs.page/vypdev/copilot/configuration#runner-profiles' }); + expect(existsSync(resolve(__dirname, '../../../../docs/configuration.mdx'))).toBe(true); + }); test.each([ ['features.issues', 'capabilities', '/issues/workflow-setup'], ['features.pullRequests', 'capabilities', '/pull-requests/workflow-setup'], diff --git a/src/application/policies/__tests__/setup_questionnaire_policy.test.ts b/src/application/policies/__tests__/setup_questionnaire_policy.test.ts index ada44c000..0f45b3fdb 100644 --- a/src/application/policies/__tests__/setup_questionnaire_policy.test.ts +++ b/src/application/policies/__tests__/setup_questionnaire_policy.test.ts @@ -231,7 +231,7 @@ describe('setup questionnaire policy', () => { it('enters review immediately when the permission-intent phase has no open questions', () => { const ids = [ - 'features.issues', 'features.pullRequests', 'issueWorkflows.enabled', 'pullRequestApproval.mode', + 'runners.discover', 'features.issues', 'features.pullRequests', 'issueWorkflows.enabled', 'pullRequestApproval.mode', 'projects.enabled', 'manageRepositoryVariables', 'manageRepositorySecrets', 'storage.variables.defaultScope', 'storage.variables.preserveExisting', 'storage.secrets.defaultScope', 'storage.secrets.preserveExisting', diff --git a/src/application/policies/__tests__/setup_runner_installation_summary_policy.test.ts b/src/application/policies/__tests__/setup_runner_installation_summary_policy.test.ts new file mode 100644 index 000000000..e09e6474b --- /dev/null +++ b/src/application/policies/__tests__/setup_runner_installation_summary_policy.test.ts @@ -0,0 +1,43 @@ +import { setupRunnerInstallationSummary } from '../setup_runner_installation_summary_policy'; +import { createDefaultSetupConfiguration } from '../setup_configuration_defaults'; +import { selectSetupRunnerMode, validSetupRunnerProfile } from '../setup_runner_policy'; +import type { SetupBatchTargetPlan } from '../../../domain/setup_batch'; + +const plan = () => ({ configuration: createDefaultSetupConfiguration(), digest: 'a'.repeat(64) } as SetupBatchTargetPlan); +describe('non-secret installation PR summary', () => { + test.each([1, 3, 20])('literal backtick runs of length %i stay inside one JSON fence', length => { + const profile = { id: 'fixture', group: `group${'`'.repeat(length)}`, labels: ['self-hosted', 'Linux', `label${'`'.repeat(length + 1)}`], validation: 'hosted' as const }; + expect(validSetupRunnerProfile(profile)).toBe(true); + const target = plan(); target.configuration.runners = { mode: 'manual-self-hosted', profileId: '', group: profile.group, labels: profile.labels, validation: profile.validation }; + const summary = setupRunnerInstallationSummary(target); + const block = summary.match(/\n(`{3,})json\n([\s\S]*?)\n\1\n/); + expect(block).not.toBeNull(); + expect(block![1].length).toBeGreaterThan(length + 1); + expect(JSON.parse(block![2])).toEqual({ group: profile.group, labels: profile.labels }); + expect(summary.slice(summary.indexOf(block![0]) + block![0].length)).toContain('**Observations:**'); + }); + test.each([undefined, selectSetupRunnerMode('retain')])('legacy installation without a review keeps its existing PR body %#', runners => { + const target = plan(); target.configuration.runners = runners; expect(setupRunnerInstallationSummary(target)).toBe(''); + }); + test('explicit hosted selection explains its route even without an optional review', () => { + const target = plan(); target.configuration.runners = selectSetupRunnerMode('hosted'); + expect(setupRunnerInstallationSummary(target)).toContain('"ubuntu-latest"'); + }); + test('shared source values never enter PR content and role exceptions stay explicit', () => { + const target = plan(); const profile = { id: 'shared', group: 'vypdev', labels: ['self-hosted', 'Linux'], validation: 'hosted' as const }; + target.configuration.runners = { mode: 'organization-profile', profileId: 'shared', group: profile.group, labels: profile.labels, + validation: 'hosted', source: { scope: 'organization', value: 'private-registry-evidence' } }; + const jobs = (['pending-capacity', 'access-unknown', 'unavailable', 'ready'] as const).map(status => ({ file: 'copilot_issue.yml', job: 'copilot-issues', + role: 'agent' as const, runsOn: profile.labels, retained: false, status })); + const assets = (['source-only', 'missing', 'customized', 'incompatible', 'shared'] as const).map(status => ({ path: 'fixture.yml', enabled: true, status })); + const summary = setupRunnerInstallationSummary({ ...target, installationReview: { blockers: [], jobs, assets, changes: [] } }); + expect(summary).toContain('1 pending capacity; 1 access unverified; 1 unavailable'); + expect(summary).toContain('1 source extensions'); expect(summary).toContain('1 incompatible metadata'); + expect(summary).toContain('Human merge'); expect(summary).toContain('native source workflows'); + expect(summary).toContain('vypdev'); expect(summary).not.toContain('private-registry-evidence'); + }); + test('retained routing with a review needs no invented profile', () => { + const target = plan(); target.configuration.runners = undefined; + expect(setupRunnerInstallationSummary({ ...target, installationReview: { blockers: [], assets: [], jobs: [], changes: [] } })).toContain('Installed per-job routing is retained'); + }); +}); diff --git a/src/application/policies/__tests__/setup_runner_policy.test.ts b/src/application/policies/__tests__/setup_runner_policy.test.ts new file mode 100644 index 000000000..9e0309297 --- /dev/null +++ b/src/application/policies/__tests__/setup_runner_policy.test.ts @@ -0,0 +1,160 @@ +import { createDefaultSetupConfiguration } from '../setup_configuration_defaults'; +import { unavailableSetupRemoteConfiguration } from '../setup_remote_facts_policy'; +import { DEFAULT_SETUP_RUNNERS, SETUP_RUNNER_REGISTRY, type SetupRunnerConfiguration, type SetupRunnerInventory } from '../../../domain/setup_runner'; +import { parseSetupRunnerProfiles, validSetupRunnerProfile, validateSetupRunners, setupRunnerRegistry, setupRunnerProfileIsFresh, + selectSetupRunnerMode, selectedSetupRunsOn, setupRunnerRole, setupRunnerReadiness, reusableSetupRunnerDefaults } from '../setup_runner_policy'; + +const profile = { id: 'vypdev-agent', group: 'vypdev', labels: ['self-hosted', 'codex', 'Linux'], validation: 'hosted' as const }; +const registry = JSON.stringify({ schemaVersion: 1, profiles: [profile] }); +const variable = { name: SETUP_RUNNER_REGISTRY, value: registry }; +const remote = () => ({ ...unavailableSetupRemoteConfiguration(), repositoryVariablesAccess: 'available' as const, + organizationVariablesAccess: 'available' as const, organizationVariables: [variable] }); +const selected: SetupRunnerConfiguration = { mode: 'organization-profile', profileId: profile.id, group: profile.group, + labels: profile.labels, validation: profile.validation, source: { scope: 'organization', value: registry } }; +const manual: SetupRunnerConfiguration = { ...selectSetupRunnerMode('manual-self-hosted'), group: profile.group, labels: profile.labels }; + +describe('bounded non-secret runner profiles', () => { + test.each([ + null, [], { ...profile, command: 'run' }, { ...profile, id: '' }, { ...profile, id: 'a'.repeat(51) }, + { ...profile, group: 1 }, { ...profile, group: 'x'.repeat(101) }, { ...profile, group: ' x' }, + { ...profile, group: '${{ secrets.PAT }}' }, { ...profile, group: 'x\ny' }, + { ...profile, validation: 'all-jobs' }, { ...profile, labels: null }, { ...profile, labels: [] }, + { ...profile, labels: Array(11).fill('linux') }, { ...profile, labels: ['self-hosted', 3] }, + { ...profile, labels: ['self-hosted', 'Linux', 'linux'] }, { ...profile, labels: ['Linux'] }, + { ...profile, labels: ['self-hosted', 'Windows', 'Linux'] }, { ...profile, labels: ['self-hosted', 'codex'] }, + { ...profile, labels: ['self-hosted', 'Linux', ''] }, { ...profile, labels: ['self-hosted', 'Linux', 'x'.repeat(101)] }, + { ...profile, group: `ghp_${'x'.repeat(36)}` }, { ...profile, id: `ghp_${'x'.repeat(36)}` }, + { ...profile, labels: ['self-hosted', 'Linux', `ghp_${'x'.repeat(36)}`] }, + ])('rejects unsafe or unsupported profile %#', value => expect(validSetupRunnerProfile(value)).toBe(false)); + test.each([profile, { ...profile, group: '', labels: ['SELF-HOSTED', 'macOS'], validation: 'agent' }])('accepts supported routing %#', value => expect(validSetupRunnerProfile(value)).toBe(true)); + test.each([ + '{', 'null', '[]', JSON.stringify({ schemaVersion: 2, profiles: [profile] }), + JSON.stringify({ schemaVersion: 1, profiles: [profile], secret: 'unsupported' }), + JSON.stringify({ schemaVersion: 1, profiles: {} }), JSON.stringify({ schemaVersion: 1, profiles: [] }), + JSON.stringify({ schemaVersion: 1, profiles: Array(11).fill(profile) }), + JSON.stringify({ schemaVersion: 1, profiles: [{ ...profile, labels: [] }] }), + JSON.stringify({ schemaVersion: 1, profiles: [profile, { ...profile, id: 'VYPDEV-AGENT' }] }), ' '.repeat(16_001), + ])('rejects invalid registries %#', value => expect(parseSetupRunnerProfiles(value)).toBeUndefined()); + test('returns isolated profile arrays', () => { + const first = parseSetupRunnerProfiles(registry)!; const second = parseSetupRunnerProfiles(registry)!; + expect(first).toEqual([profile]); expect(first[0].labels).not.toBe(second[0].labels); + }); + test.each([ + null, [], { ...DEFAULT_SETUP_RUNNERS, token: 'no' }, { ...DEFAULT_SETUP_RUNNERS, mode: 'future' }, + { ...DEFAULT_SETUP_RUNNERS, group: 1 }, { ...DEFAULT_SETUP_RUNNERS, profileId: 4 }, + { ...DEFAULT_SETUP_RUNNERS, labels: 'linux' }, { ...DEFAULT_SETUP_RUNNERS, validation: 'future' }, + { ...DEFAULT_SETUP_RUNNERS, group: 'vypdev' }, { ...DEFAULT_SETUP_RUNNERS, profileId: 'id' }, + { ...DEFAULT_SETUP_RUNNERS, labels: ['Linux'] }, { ...DEFAULT_SETUP_RUNNERS, validation: 'agent' }, + { ...DEFAULT_SETUP_RUNNERS, source: {} }, { ...manual, labels: [] }, { ...manual, profileId: 'other' }, + { ...manual, source: selected.source }, { ...selected, profileId: '' }, { ...selected, source: null }, + { ...selected, source: { ...selected.source, token: 'no' } }, { ...selected, source: { scope: 'future', value: registry } }, + { ...selected, source: { scope: 'organization', value: 3 } }, { ...selected, source: { scope: 'organization', value: '{}' } }, + { ...selected, group: 'changed' }, { ...selected, validation: 'agent' }, { ...selected, labels: ['self-hosted', 'Linux'] }, + ])('rejects invalid configuration or mismatched snapshots %#', value => expect(validateSetupRunners(value)).toHaveLength(1)); + test.each([undefined, DEFAULT_SETUP_RUNNERS, selectSetupRunnerMode('hosted'), manual, selected])('accepts legacy and complete reviewed settings %#', value => expect(validateSetupRunners(value)).toEqual([])); + test('defaults retain installed routing', () => expect(createDefaultSetupConfiguration().runners).toEqual(DEFAULT_SETUP_RUNNERS)); +}); + +describe('effective registry and snapshot provenance', () => { + test('absence and unavailable access are different', () => { + expect(setupRunnerRegistry().status).toBe('unavailable'); + expect(setupRunnerRegistry(unavailableSetupRemoteConfiguration()).status).toBe('unavailable'); + expect(setupRunnerRegistry({ ...remote(), organizationVariablesAccess: 'unavailable' }).status).toBe('unavailable'); + expect(setupRunnerRegistry({ ...remote(), organizationVariables: [] }).status).toBe('missing'); + }); + test('reads organization profiles without writes', () => { + const facts = remote(); expect(setupRunnerRegistry(facts)).toEqual({ status: 'available', scope: 'organization', profiles: [profile], source: selected.source }); + expect(facts.organizationVariables).toEqual([variable]); + }); + test.each([{ repositoryVariables: [] }, { repositoryVariables: [variable] }])('unreadable repository overrides cannot authorize a readable organization profile (%#)', ({ repositoryVariables }) => { + const facts = { ...remote(), repositoryVariables, repositoryVariablesAccess: 'unavailable' as const }; + expect(setupRunnerRegistry(facts)).toEqual({ status: 'unavailable', profiles: [] }); + expect(setupRunnerProfileIsFresh(selected, facts)).toBe(false); + expect(setupRunnerRegistry({ ...facts, repositoryVariablesAccess: 'available', repositoryVariables: [] }).source?.scope).toBe('organization'); + }); + test('repository overrides do not require organization inventory', () => { + const facts = { ...remote(), organizationVariablesAccess: 'unavailable' as const, repositoryVariables: [variable] }; + expect(setupRunnerRegistry(facts).source?.scope).toBe('repository'); + }); + test.each(['bad', JSON.stringify({ schemaVersion: 2, profiles: [profile] })])('invalid repository registry shadows valid organization value: %s', value => { + expect(setupRunnerRegistry({ ...remote(), repositoryVariables: [{ ...variable, value }] })).toEqual({ status: 'invalid', scope: 'repository', profiles: [] }); + }); + test('duplicate effective registry is invalid', () => expect(setupRunnerRegistry({ ...remote(), organizationVariables: [variable, variable] }).status).toBe('invalid')); + test('profile freshness detects value, scope and visibility changes', () => { + expect(setupRunnerProfileIsFresh(undefined, remote())).toBe(true); + expect(setupRunnerProfileIsFresh(manual, remote())).toBe(true); + expect(setupRunnerProfileIsFresh(selected, remote())).toBe(true); + expect(setupRunnerProfileIsFresh(selected, { ...remote(), repositoryVariables: [variable] })).toBe(false); + expect(setupRunnerProfileIsFresh(selected, { ...remote(), organizationVariables: [] })).toBe(false); + expect(setupRunnerProfileIsFresh(selected, { ...remote(), organizationVariables: [{ ...variable, value: registry + ' ' }] })).toBe(false); + expect(setupRunnerProfileIsFresh({ ...selected, source: undefined }, remote())).toBe(false); + }); + test('batch defaults reuse only explicit choices and resolve each target registry', () => { + expect(reusableSetupRunnerDefaults(undefined, remote())).toBeUndefined(); + expect(reusableSetupRunnerDefaults(DEFAULT_SETUP_RUNNERS, remote())).toBeUndefined(); + expect(reusableSetupRunnerDefaults(manual, remote())).toEqual(manual); + expect(reusableSetupRunnerDefaults(manual, remote())?.labels).not.toBe(manual.labels); + expect(reusableSetupRunnerDefaults(selected, remote())).toEqual(selected); + expect(reusableSetupRunnerDefaults({ ...selected, discover: true }, remote())?.discover).toBe(true); + expect(reusableSetupRunnerDefaults(selected, { ...remote(), organizationVariables: [] })).toBeUndefined(); + expect(reusableSetupRunnerDefaults(selected, { ...remote(), repositoryVariables: [variable] })?.source?.scope).toBe('repository'); + }); +}); + +describe('job roles and explicit replacement', () => { + test.each([ + ['copilot_issue.yml', 'copilot-issues'], ['copilot_issue_comment.yml', 'copilot-issues'], + ['copilot_pull_request.yml', 'copilot-pull-requests'], ['copilot_pull_request_comment.yml', 'copilot-pull-requests'], + ['copilot_commit.yml', 'copilot-commits'], ['agent-cli-provisioning.yml', 'verify-agent-clis'], + ])('routes an agent job %s/%s', (file, job) => expect(setupRunnerRole(file, job)).toBe('agent')); + test.each([ + ['copilot_pull_request_approval.yml', 'observe-approval', 'observer'], + ['copilot_pull_request_merge_queue.yml', 'copilot-pull-request-required-check', 'isolated'], + ['release_workflow.yml', 'publish', 'publication'], ['hotfix_workflow.yml', 'publish-npm', 'publication'], + ['release_workflow.yml', 'prepare-version-files', 'validation'], ['hotfix_workflow.yml', 'validate', 'validation'], + ['release_workflow.yml', 'custom-job', undefined], ['custom.yml', 'copilot-issues', undefined], + ['copilot_branch_sync.yml', 'branch-sync', 'validation'], ['copilot_credential_health.yml', 'verify-pat', 'credential-health'], + ['copilot_issue.yml', 'custom-job', undefined], + ])('keeps role identity local to a known workflow %s/%s', (file, job, role) => expect(setupRunnerRole(file, job)).toBe(role)); + test.each(['observer', 'publication', 'isolated', undefined] as const)('protects the %s route', role => expect(selectedSetupRunsOn(manual, role)).toBeUndefined()); + test('retention makes no replacement', () => { + expect(selectedSetupRunsOn(undefined, 'agent')).toBeUndefined(); + expect(selectedSetupRunsOn(DEFAULT_SETUP_RUNNERS, 'agent')).toBeUndefined(); + }); + test('hosted choice is explicit and validation remains separate', () => { + expect(selectedSetupRunsOn(selectSetupRunnerMode('hosted'), 'agent')).toBe('ubuntu-latest'); + expect(selectedSetupRunsOn(manual, 'validation')).toBe('ubuntu-latest'); + expect(selectedSetupRunsOn(manual, 'agent')).toEqual({ group: 'vypdev', labels: profile.labels }); + expect(selectedSetupRunsOn({ ...manual, group: '', validation: 'agent' }, 'validation')).toEqual(profile.labels); + }); +}); + +describe('access and capacity never select a fallback', () => { + const candidate = { id: 1, labels: profile.labels, status: 'online' as const, busy: false, group: 'vypdev', access: 'confirmed' as const }; + const inventory: SetupRunnerInventory = { status: 'available', candidates: [candidate], groups: [{ name: 'vypdev', access: 'confirmed' }] }; + const route = { group: 'vypdev', labels: ['SELF-HOSTED', 'Linux'] }; + test.each(['ubuntu-latest', ['macos-latest'], { labels: 'windows-2025' }])('recognizes literal hosted route %#', route => expect(setupRunnerReadiness(route)).toBe('hosted')); + test.each(['${{ matrix.os }}', { group: '${{ vars.GROUP }}' }, ['${{ matrix.labels }}']])('keeps dynamic routing unverified %#', route => expect(setupRunnerReadiness(route, inventory)).toBe('access-unknown')); + test('missing, incomplete and unavailable evidence cannot establish access', () => { + expect(setupRunnerReadiness(route)).toBe('access-unknown'); + expect(setupRunnerReadiness(route, { ...inventory, status: 'incomplete' })).toBe('access-unknown'); + expect(setupRunnerReadiness(route, { ...inventory, status: 'unavailable' })).toBe('access-unknown'); + }); + test('case-insensitive labels match within the exact group', () => expect(setupRunnerReadiness(route, inventory)).toBe('ready')); + test.each([{ busy: true }, { status: 'offline' as const }])('busy/offline capacity stays pending %#', update => { + expect(setupRunnerReadiness(route, { ...inventory, candidates: [{ ...candidate, ...update }] })).toBe('pending-capacity'); + }); + test('workflow-restricted group access stays unknown', () => expect(setupRunnerReadiness(route, { ...inventory, candidates: [{ ...candidate, access: 'unknown' }] })).toBe('access-unknown')); + test('confirmed group without matching labels is unavailable', () => expect(setupRunnerReadiness({ ...route, labels: ['self-hosted', 'macOS'] }, inventory)).toBe('unavailable')); + test('unobserved groups and empty repository lists remain unknown', () => { + expect(setupRunnerReadiness({ group: 'other', labels: 'self-hosted' }, inventory)).toBe('access-unknown'); + expect(setupRunnerReadiness(['self-hosted', 'macOS'], { status: 'available', candidates: [], groups: [] })).toBe('access-unknown'); + expect(setupRunnerReadiness({ group: 'other' }, inventory)).toBe('access-unknown'); + }); +}); + + +test.each([manual, { ...manual, validation: 'agent' as const }, selected, selectSetupRunnerMode('hosted')])('credential verification remains hosted independently of ordinary validation %#', config => { + expect(selectedSetupRunsOn(config, 'credential-health')).toBe('ubuntu-latest'); + expect(selectedSetupRunsOn(DEFAULT_SETUP_RUNNERS, 'credential-health')).toBeUndefined(); +}); diff --git a/src/application/policies/__tests__/setup_runner_question_policy.test.ts b/src/application/policies/__tests__/setup_runner_question_policy.test.ts new file mode 100644 index 000000000..95fbc64ec --- /dev/null +++ b/src/application/policies/__tests__/setup_runner_question_policy.test.ts @@ -0,0 +1,111 @@ +import { createDefaultSetupConfiguration } from '../setup_configuration_defaults'; +import { cloneSetupConfiguration } from '../setup_configuration_clone_policy'; +import { createSetupQuestionnaire, setupQuestionContentInventory, transitionSetupQuestionnaire } from '../setup_questionnaire_policy'; +import { applySetupRunnerAnswer, setupRunnerQuestion, setupRunnerQuestions } from '../setup_runner_question_policy'; +import { setupRunnerGuidance } from '../setup_runner_guidance_policy'; +import { selectSetupRunnerMode, validateSetupRunners } from '../setup_runner_policy'; +import { unavailableSetupRemoteConfiguration } from '../setup_remote_facts_policy'; +import type { SetupQuestion } from '../../../domain/setup_questionnaire'; + +const profile = { id: 'shared', group: 'vypdev', labels: ['self-hosted', 'Linux'], validation: 'hosted' }; +const value = JSON.stringify({ schemaVersion: 1, profiles: [profile, { ...profile, id: 'other', group: 'other' }] }); +const remote = { ...unavailableSetupRemoteConfiguration(), repositoryVariablesAccess: 'available' as const, + organizationVariablesAccess: 'available' as const, organizationVariables: [{ name: 'COPILOT_RUNNER_PROFILES', value }] }; +const question = (field: string): SetupQuestion => ({ id: `runners.${field}`, stateId: 'agent-runtime', kind: 'text', label: field, defaultValue: '' }); +const manual = () => ({ ...createDefaultSetupConfiguration(), runners: selectSetupRunnerMode('manual-self-hosted') }); + +describe('one questionnaire contract for CLI and web runner selection', () => { + test('unrelated questions keep their original object', () => { + const original = { ...question('mode'), id: 'projects.ids' }; expect(setupRunnerQuestion(original, {})).toBe(original); + const intent = question('discover'); expect(setupRunnerQuestion(intent, { remote })).toBe(intent); + }); + test('unavailable registry keeps manual and hosted selection usable', () => { + const result = setupRunnerQuestion(question('mode'), {}); + expect(result.choices).toEqual(['retain', 'hosted', 'manual-self-hosted']); expect(result.runnerRegistryStatus).toBe('unavailable'); + }); + test('valid registry exposes exact IDs and provenance', () => { + expect(setupRunnerQuestion(question('profileId'), { remote }).choices).toEqual(['shared', 'other']); + expect(setupRunnerQuestion(question('mode'), { remote }).choices).toContain('organization-profile'); + expect(setupRunnerQuestion(question('group'), { remote }).runnerProfiles).toHaveLength(2); + }); + test.each(['retain', 'hosted', 'manual-self-hosted'])('mode %s clears stale selection metadata', mode => { + const result = applySetupRunnerAnswer(createDefaultSetupConfiguration(), question('mode'), mode, {}); + expect(result.error).toBeUndefined(); expect(result.configuration?.runners).toEqual(selectSetupRunnerMode(mode as 'retain')); + }); + test('selecting registry mode snapshots a profile without mutating inventory', () => { + const result = applySetupRunnerAnswer(createDefaultSetupConfiguration(), question('mode'), 'organization-profile', { remote }); + expect(result.configuration?.runners).toMatchObject({ mode: 'organization-profile', profileId: 'shared', group: 'vypdev', source: { scope: 'organization', value } }); + expect(validateSetupRunners(result.configuration?.runners)).toEqual([]); expect(remote.organizationVariables[0].value).toBe(value); + const other = applySetupRunnerAnswer(result.configuration!, question('profileId'), 'other', { remote }); + expect(other.configuration?.runners?.group).toBe('other'); + expect(applySetupRunnerAnswer(other.configuration!, question('mode'), 'organization-profile', { remote }).configuration?.runners?.profileId).toBe('other'); + const cloned = cloneSetupConfiguration(other.configuration!); + expect(cloned.runners?.source).not.toBe(other.configuration!.runners?.source); + expect(cloned.runners?.labels).not.toBe(other.configuration!.runners?.labels); + }); + test('a missing registry or stale profile cannot be selected', () => { + expect(applySetupRunnerAnswer(createDefaultSetupConfiguration(), question('mode'), 'organization-profile', {}).error).toContain('No valid'); + expect(applySetupRunnerAnswer(createDefaultSetupConfiguration(), question('profileId'), 'gone', { remote }).error).toContain('unavailable'); + }); + test('manual group and labels preserve typed boundaries', () => { + const initial = manual(); + const grouped = applySetupRunnerAnswer(initial, question('group'), 'vypdev', {}).configuration!; + const labelled = applySetupRunnerAnswer(grouped, question('labels'), 'self-hosted,codex,Linux', {}).configuration!; + const validated = applySetupRunnerAnswer(labelled, question('validation'), 'agent', {}).configuration!; + expect(validated.runners).toMatchObject({ group: 'vypdev', labels: ['self-hosted', 'codex', 'Linux'], validation: 'agent' }); + expect(initial.runners.group).toBe(''); expect(initial.runners.labels).toEqual(['self-hosted', 'Linux']); + }); + test.each(['self-hosted,Windows', 'self-hosted,Linux,linux', '${{ vars.LABEL }}'])('manual labels reject unsupported input %s', input => { + expect(applySetupRunnerAnswer(manual(), question('labels'), input, {}).error).toContain('unique literal'); + }); + test('manual group rejects expressions and control characters', () => { + expect(applySetupRunnerAnswer(manual(), question('group'), '${{ vars.GROUP }}', {}).error).toContain('literal runner group'); + expect(applySetupRunnerAnswer({ ...manual(), runners: undefined }, question('group'), 'x\n', {}).error).toBeDefined(); + }); + test('question definitions expose conditional manual fields', () => { + const definitions = setupRunnerQuestions().filter(question => question.id !== 'runners.discover'); const config = manual(); + expect(definitions[0].read?.(config)).toBe('manual-self-hosted'); + expect(definitions[0].read?.({ ...config, runners: undefined })).toBe('retain'); + expect(definitions[1].applies?.(config)).toBe(false); + expect(definitions[2].applies?.(config)).toBe(true); + expect(definitions[3].read?.(config)).toBe('self-hosted,Linux'); + }); + test('the real shared questionnaire validates without discarding previous answers', () => { + const context = { remote, skipQuestionIds: setupQuestionContentInventory().filter(item => !item.id.startsWith('runners.')).map(item => item.id) }; + let state = createSetupQuestionnaire(createDefaultSetupConfiguration(), context); + expect(state.question?.id).toBe('runners.discover'); + state = transitionSetupQuestionnaire(state, { kind: 'answer', value: 'false' }, context); + expect(state.question?.id).toBe('runners.mode'); + state = transitionSetupQuestionnaire(state, { kind: 'answer', value: 'manual-self-hosted' }, context); + expect(state.question?.id).toBe('runners.group'); + state = transitionSetupQuestionnaire(state, { kind: 'answer', value: 'vypdev' }, context); + const invalid = transitionSetupQuestionnaire(state, { kind: 'answer', value: 'Linux' }, context); + expect(invalid.question?.id).toBe('runners.labels'); expect(invalid.validation).toBeDefined(); expect(invalid.draft.runners?.group).toBe('vypdev'); + state = transitionSetupQuestionnaire(invalid, { kind: 'answer', value: 'self-hosted,codex,Linux' }, context); + state = transitionSetupQuestionnaire(state, { kind: 'answer', value: 'hosted' }, context); + expect(state.terminal).toBe('review'); expect(validateSetupRunners(state.draft.runners)).toEqual([]); + }); + test.each(['mode', 'profileId', 'group', 'labels', 'validation', 'discover'])('all four locales explain %s and link stable documentation', field => { + const presentation = setupRunnerGuidance(question(field)); + for (const locale of ['en', 'es', 'fr', 'pt'] as const) { + expect(presentation[locale].label).toBeTruthy(); expect(presentation[locale].summary).toBeTruthy(); + expect(presentation[locale].documentation.url).toBe('https://docs.page/vypdev/copilot/configuration#runner-profiles'); + expect(presentation[locale].effect).not.toBe(''); + } + }); +}); + + +describe('optional runner discovery intent', () => { + test.each([false, true])('explicit discovery=%s survives later manual and shared selection', discover => { + const definition = setupRunnerQuestions().find(question => question.id === 'runners.discover')!; + expect(definition.read?.({ ...manual(), runners: undefined })).toBe(false); + let config = applySetupRunnerAnswer(manual(), question('discover'), String(discover), {}).configuration!; + expect(definition.read?.(config)).toBe(discover); + config = applySetupRunnerAnswer(config, question('mode'), 'organization-profile', { remote }).configuration!; + expect(config.runners?.discover).toBe(discover); + expect(applySetupRunnerAnswer(config, question('profileId'), 'other', { remote }).configuration?.runners?.discover).toBe(discover); + expect(validateSetupRunners(config.runners)).toEqual([]); + expect(validateSetupRunners({ ...config.runners, discover: 'yes' })).not.toEqual([]); + }); +}); diff --git a/src/application/policies/merge_setup_overrides_policy.ts b/src/application/policies/merge_setup_overrides_policy.ts index 57d222905..abe106453 100644 --- a/src/application/policies/merge_setup_overrides_policy.ts +++ b/src/application/policies/merge_setup_overrides_policy.ts @@ -15,6 +15,7 @@ export function mergeSetupOverrides( return { ...fileOverrides, ...flagOverrides, + runners: { ...fileOverrides.runners, ...flagOverrides.runners }, features: { ...fileOverrides.features, ...flagOverrides.features }, agents, repository: { ...fileOverrides.repository, ...flagOverrides.repository }, diff --git a/src/application/policies/setup_batch_policy.ts b/src/application/policies/setup_batch_policy.ts index 6a12f1b35..4bb25749a 100644 --- a/src/application/policies/setup_batch_policy.ts +++ b/src/application/policies/setup_batch_policy.ts @@ -89,7 +89,7 @@ export function validSetupBatchAssetPath(path: string): boolean { if (path.length > 240 || path.split('/').some(part => !part || part === '.' || part === '..') || /[^A-Za-z0-9_./-]/u.test(path)) return false; return path === 'AGENTS.md' || path === '.agents/skills/copilot-repository-workflow/SKILL.md' || /^\.github\/(?:workflows|ISSUE_TEMPLATE)\/[A-Za-z0-9_.-]+\.(?:yml|yaml)$/u.test(path) - || path === '.github/pull_request_template.md' || /^\.copilot\/(?:repository-profile|setup-manifest)\.json$/u.test(path) + || path === '.github/pull_request_template.md' || /^\.copilot\/(?:repository-profile|setup-manifest|runner-profile)\.json$/u.test(path) || path === '.copilot/AGENT_GUIDE.md' || path.startsWith('.copilot/setup-backups/'); } function validBranch(value: string): boolean { diff --git a/src/application/policies/setup_batch_view_policy.ts b/src/application/policies/setup_batch_view_policy.ts index e3d3585ca..61d414e31 100644 --- a/src/application/policies/setup_batch_view_policy.ts +++ b/src/application/policies/setup_batch_view_policy.ts @@ -12,6 +12,7 @@ export function buildSetupBatchView(plan: SetupBatchPlan, operation: SetupBatchO const receipt = operation.targets[index]; if (!receipt || receipt.repositoryId !== target.target.id) throw new Error('Setup receipt identity mismatch.'); return { repositoryId: target.target.id, repository: `${target.target.owner}/${target.target.name}`, status: receipt.status, + ...(target.installationReview ? { installationReview: target.installationReview } : {}), installationBranch: setupBatchBranch(plan.operationId), baseBranch: target.target.defaultBranch, baseSha: target.target.baseSha, blockers: [...target.blocked], files: target.files.map(file => ({ path: file.path, content: file.content })), repositoryVariables: target.repositoryVariables.map(variable => variable.name), diff --git a/src/application/policies/setup_configuration_clone_policy.ts b/src/application/policies/setup_configuration_clone_policy.ts index 4f4426935..93a13e819 100644 --- a/src/application/policies/setup_configuration_clone_policy.ts +++ b/src/application/policies/setup_configuration_clone_policy.ts @@ -9,6 +9,8 @@ export function cloneSetupConfiguration(configuration: SetupConfiguration): Setu ])) as SetupAgentConfiguration; return { ...configuration, + ...(configuration.runners ? { runners: { ...configuration.runners, labels: [...configuration.runners.labels], + ...(configuration.runners.source ? { source: { ...configuration.runners.source } } : {}) } } : {}), features: { ...configuration.features }, agents, repository: { diff --git a/src/application/policies/setup_configuration_defaults.ts b/src/application/policies/setup_configuration_defaults.ts index 6789d2462..1da4832ba 100644 --- a/src/application/policies/setup_configuration_defaults.ts +++ b/src/application/policies/setup_configuration_defaults.ts @@ -18,6 +18,7 @@ import { DEFAULT_DEPLOYMENT_CONFIGURATION } from '../../domain/deployment_config import { resolveLocaleProfile } from '../../domain/locale'; import { ISSUE_WORKFLOW_KINDS, type IssueWorkflowKind } from '../../domain/issue_workflow_profile'; import { DISABLED_PULL_REQUEST_APPROVAL_POLICY } from '../../domain/pull_request_approval_policy'; +import { DEFAULT_SETUP_RUNNERS } from '../../domain/setup_runner'; export const SETUP_AGENT_TASKS: readonly AgentTask[] = [ 'planner', @@ -88,6 +89,7 @@ export function createDefaultSetupConfiguration(): SetupConfiguration { Object.keys(SETUP_FEATURE_DESCRIPTIONS).map(feature => [feature, feature !== 'inactiveIssueClosure']), ); return { + runners: { ...DEFAULT_SETUP_RUNNERS, labels: [] }, features, agents, repository: { @@ -155,6 +157,7 @@ export function createDefaultSetupConfiguration(): SetupConfiguration { } export type SetupConfigurationOverrides = { + runners?: Partial>; features?: Partial; agents?: Partial>>; repository?: Partial; @@ -199,6 +202,8 @@ export function mergeSetupConfiguration( } return { ...base, + runners: { ...DEFAULT_SETUP_RUNNERS, ...base.runners, ...overrides.runners, + labels: [...(overrides.runners?.labels ?? base.runners?.labels ?? [])] }, features, agents, repository: { ...base.repository, ...(overrides.repository ?? {}) }, diff --git a/src/application/policies/setup_configuration_plan.ts b/src/application/policies/setup_configuration_plan.ts index 77996e16e..fe5c50f48 100644 --- a/src/application/policies/setup_configuration_plan.ts +++ b/src/application/policies/setup_configuration_plan.ts @@ -39,6 +39,7 @@ export function buildSetupPlan( .filter(file => configuration.features.release !== false || file !== 'release.yml') .filter(file => configuration.features.hotfix !== false || file !== 'hotfix.yml'); const selectedFiles = [ + ...(configuration.runners && configuration.runners.mode !== 'retain' ? ['.copilot/runner-profile.json'] : []), ...workflowFiles.map(file => `workflows/${file}`), ...issueTemplateFiles.map(file => `ISSUE_TEMPLATE/${file}`), ...(configuration.features.pullRequestTemplate === false ? [] : ['pull_request_template.md']), @@ -95,6 +96,7 @@ export function setupPlanGuardPaths(plan: Readonly): string[] { REPOSITORY_AGENT_GUIDE_PATH, REPOSITORY_AGENT_SKILL_PATH, REPOSITORY_AGENT_POINTER_PATH, + '.copilot/runner-profile.json', ]; return [...new Set([...selected, ...retiredCandidates, ...guidanceCandidates])].sort(); } diff --git a/src/application/policies/setup_configuration_validation.ts b/src/application/policies/setup_configuration_validation.ts index 4091b56da..6f2162dc2 100644 --- a/src/application/policies/setup_configuration_validation.ts +++ b/src/application/policies/setup_configuration_validation.ts @@ -9,9 +9,11 @@ import { ISSUE_WORKFLOW_KINDS } from '../../domain/issue_workflow_profile'; import { effectiveIssueWorkflowProfile } from './setup_issue_workflow_policy'; import { validatePullRequestApprovalPolicy } from '../../domain/pull_request_approval_policy'; import { parseSetupProjectSelection } from './setup_project_selection_policy'; +import { validateSetupRunners } from './setup_runner_policy'; export function validateSetupConfiguration(configuration: SetupConfiguration, options: { allowIncompleteApproval?: boolean } = {}): string[] { const errors: string[] = []; + errors.push(...validateSetupRunners(configuration.runners)); const projectSelection = parseSetupProjectSelection(configuration.projects.ids); if ('error' in projectSelection || projectSelection.value !== configuration.projects.ids) { errors.push('Project IDs must be a comma-separated list of 1–10 distinct positive Project URL numbers; PVT_ node IDs are not accepted.'); diff --git a/src/application/policies/setup_pat_creation_url_policy.ts b/src/application/policies/setup_pat_creation_url_policy.ts index 15c9b071d..14417d912 100644 --- a/src/application/policies/setup_pat_creation_url_policy.ts +++ b/src/application/policies/setup_pat_creation_url_policy.ts @@ -22,6 +22,7 @@ const QUERY_PERMISSIONS: Readonly): SetupQuestionDocumentation { const id = question.id; + if (id.startsWith('runners.')) return { title: 'Runner profiles', url: 'https://docs.page/vypdev/copilot/configuration#runner-profiles' }; if (id === 'issueWorkflows.enabled') return docs.issueWorkflows; if (id === 'features.issues') return docs.issueWorkflows; if (id === 'features.pullRequests') return docs.pullRequestWorkflows; diff --git a/src/application/policies/setup_question_guidance_policy.ts b/src/application/policies/setup_question_guidance_policy.ts index c1da541e9..cfcb05ac4 100644 --- a/src/application/policies/setup_question_guidance_policy.ts +++ b/src/application/policies/setup_question_guidance_policy.ts @@ -1,4 +1,5 @@ import type { SetupQuestion } from '../../domain/setup_questionnaire'; +import { SETUP_RUNNER_QUESTION_IDS, setupRunnerGuidance } from './setup_runner_guidance_policy'; import type { SetupQuestionExplanation, SetupQuestionPresentation } from '../contracts/web_setup_view'; import { spanishQuestionLabel } from './setup_question_translations'; import { setupQuestionDocumentation } from './setup_question_documentation_policy'; @@ -80,6 +81,7 @@ const section: Readonly }; export function setupQuestionPresentation(question: SetupQuestion): SetupQuestionPresentation { + if (SETUP_RUNNER_QUESTION_IDS.includes(question.id)) return setupRunnerGuidance(question); const copy = special[question.id] ?? section[question.stateId]; const purpose = setupQuestionPurpose(question); const documentation = setupQuestionDocumentation(question); diff --git a/src/application/policies/setup_question_purpose_policy.ts b/src/application/policies/setup_question_purpose_policy.ts index d896feccb..0d0f80852 100644 --- a/src/application/policies/setup_question_purpose_policy.ts +++ b/src/application/policies/setup_question_purpose_policy.ts @@ -1,4 +1,5 @@ import type { SetupQuestion } from '../../domain/setup_questionnaire'; +import { SETUP_RUNNER_QUESTION_IDS, setupRunnerGuidance } from './setup_runner_guidance_policy'; type Purpose = Readonly<{ en: string; es: string }>; @@ -54,6 +55,10 @@ export const setupQuestionPurposes: Readonly> = { }; export function setupQuestionPurpose(question: SetupQuestion): Purpose | undefined { + if (SETUP_RUNNER_QUESTION_IDS.includes(question.id)) { + const presentation = setupRunnerGuidance(question); + return { en: presentation.en.summary, es: presentation.es.summary }; + } const exact = setupQuestionPurposes[question.id]; if (exact) return exact; if (question.id.startsWith('features.')) return { diff --git a/src/application/policies/setup_questionnaire_policy.ts b/src/application/policies/setup_questionnaire_policy.ts index ef5bb5bfd..98803b62a 100644 --- a/src/application/policies/setup_questionnaire_policy.ts +++ b/src/application/policies/setup_questionnaire_policy.ts @@ -13,10 +13,12 @@ import { cloneSetupConfiguration } from './setup_configuration_clone_policy'; import { createDefaultSetupConfiguration, SETUP_AGENT_TASKS, SETUP_FEATURE_DESCRIPTIONS } from './setup_configuration_defaults'; import { ISSUE_WORKFLOW_KINDS, ISSUE_WORKFLOW_CATALOG, createIssueWorkflowProfile, type IssueWorkflowKind } from '../../domain/issue_workflow_profile'; import { parseSetupProjectSelection, sharedProjectStatusOptions } from './setup_project_selection_policy'; +import { setupRunnerQuestions, setupRunnerQuestion, applySetupRunnerAnswer } from './setup_runner_question_policy'; const AGENT_PROVIDERS = ['codex', 'opencode', 'cursor'] as const; const MODEL_PROVIDERS = ['openai', 'anthropic', 'google', 'openrouter', 'opencode', 'local'] as const; const PERMISSION_INTENT_QUESTION_IDS = new Set([ + 'runners.discover', 'features.issues', 'features.pullRequests', 'issueWorkflows.enabled', 'pullRequestApproval.mode', 'projects.enabled', 'manageRepositoryVariables', 'manageRepositorySecrets', @@ -209,7 +211,10 @@ export function transitionSetupQuestionnaire( const configureIndependently = state.question.id === 'agents.configureIndependently' ? Boolean(parsed.value) : state.configureIndependently; - const draft = applyAnswer(state.draft, state.question, parsed.value, state.configureIndependently); + const runnerAnswer = state.question.id.startsWith('runners.') + ? applySetupRunnerAnswer(state.draft, state.question, String(parsed.value), context) : undefined; + if (runnerAnswer?.error) return { ...state, validation: runnerAnswer.error }; + const draft = runnerAnswer?.configuration ?? applyAnswer(state.draft, state.question, parsed.value, state.configureIndependently); draft.createInitialTag = setupNeedsInitialVersion(draft); const projectsWanted = state.question.id === 'projects.enabled' ? Boolean(parsed.value) : state.projectsWanted; const answeredQuestionIds = [...(state.answeredQuestionIds ?? []), state.question.id]; @@ -315,6 +320,7 @@ function definitions(): readonly QuestionDefinition[] { choices: ['prompt', 'create-if-missing', 'disabled'], applies: draft => draft.repositoryAgentGuidance.enabled, }, + ...setupRunnerQuestions(), ...SETUP_AGENT_TASKS.map((task): QuestionDefinition => ({ stateId: 'agent-runtime', id: `agents.${task}.provider`, label: `${formatTask(task)} runtime`, kind: 'choice', choices: AGENT_PROVIDERS, })), @@ -524,7 +530,7 @@ function toQuestion(definition: QuestionDefinition, draft: SetupConfiguration, c const projectCandidates = context.projectDiscovery?.candidates ?? []; const projectStatus = statusQuestion ? sharedProjectStatusOptions(draft.projects.ids, projectCandidates) : undefined; - return { + return setupRunnerQuestion({ stateId: definition.stateId, id: definition.id, label: definition.label, @@ -559,7 +565,7 @@ function toQuestion(definition: QuestionDefinition, draft: SetupConfiguration, c ? { suggestionSource: context.branchSources.development } : {}), ...((definition.id === 'issueWorkflows.enabled' || definition.id === 'features.issues') && context.fixedWorkflowFeatures ? { fixedWorkflowFeatures: context.fixedWorkflowFeatures } : {}), - }; + }, context); } function readPath( diff --git a/src/application/policies/setup_runner_guidance_policy.ts b/src/application/policies/setup_runner_guidance_policy.ts new file mode 100644 index 000000000..c3b5e7a17 --- /dev/null +++ b/src/application/policies/setup_runner_guidance_policy.ts @@ -0,0 +1,47 @@ +import type { SetupQuestion } from '../../domain/setup_questionnaire'; +import type { SetupQuestionPresentation } from '../contracts/web_setup_view'; + +const copy = { + en: { labels: ['Where should Copilot jobs run?', 'Reusable runner profile', 'Existing runner group (empty uses labels)', 'Exact runner labels, comma-separated', 'Ordinary validation runner'], + summary: 'Keep installed routing, choose GitHub-hosted jobs, or explicitly select an existing self-hosted profile.', + where: 'Changes generated workflow runs-on values; runner access, Secrets and authentication are separate.', + how: 'Retain keeps existing jobs. Hosted explicitly replaces managed agent/validation routes. A reusable profile comes from COPILOT_RUNNER_PROFILES; manual entry needs exact existing group and labels.', + why: 'Different job roles have different trust and runtime requirements.', effect: 'Credential verification stays hosted; observer and publication routes stay independent. Native source workflows remain visible exceptions. Nothing grants access or falls back silently.', + verify: 'Review effective YAML, repository access and runner authentication. Busy/offline means pending capacity; unknown access needs verification.', example: 'Group vypdev; labels self-hosted,codex,Linux; ordinary validation hosted.' }, + es: { labels: ['¿Dónde deben ejecutarse los jobs de Copilot?', 'Perfil de runners reutilizable', 'Grupo de runners existente (vacío usa etiquetas)', 'Etiquetas exactas del runner, separadas por comas', 'Runner para validaciones ordinarias'], + summary: 'Conserva las rutas instaladas, elige runners de GitHub o selecciona expresamente un perfil self-hosted existente.', + where: 'Cambia runs-on en los workflows generados; acceso, Secrets y autenticación se verifican por separado.', + how: 'Conservar mantiene los jobs existentes. GitHub sustituye expresamente las rutas gestionadas de agente y validación. Un perfil reutilizable procede de COPILOT_RUNNER_PROFILES; la entrada manual necesita el grupo y las etiquetas exactos.', + why: 'Cada tipo de job tiene requisitos de confianza y ejecución distintos.', effect: 'La verificación de credenciales permanece en GitHub; observador y publicación conservan rutas independientes. Los workflows nativos se muestran como excepciones. No se concede acceso ni se cambia de entorno automáticamente.', + verify: 'Revisa YAML, acceso del repositorio y autenticación del runner. Ocupado o desconectado indica capacidad pendiente; acceso desconocido requiere verificación.', example: 'Grupo vypdev; etiquetas self-hosted,codex,Linux; validación ordinaria en GitHub.' }, + fr: { labels: ['Où exécuter les jobs Copilot ?', 'Profil de runners réutilisable', 'Groupe existant (vide utilise les étiquettes)', 'Étiquettes exactes séparées par des virgules', 'Runner de validation ordinaire'], + summary: 'Conservez les routes installées, choisissez GitHub ou sélectionnez explicitement un profil auto-hébergé existant.', + where: 'Modifie runs-on dans les workflows générés ; accès, Secrets et authentification restent distincts.', + how: 'Conserver maintient les jobs existants. GitHub remplace explicitement les routes gérées. Le profil partagé provient de COPILOT_RUNNER_PROFILES ; la saisie manuelle exige le groupe et les étiquettes exacts.', + why: 'Chaque rôle a des exigences de confiance et d’exécution distinctes.', effect: 'La vérification des identifiants reste sur GitHub ; observation et publication gardent leurs routes. Les workflows natifs restent des exceptions visibles. Aucun accès accordé ni repli automatique.', + verify: 'Vérifiez le YAML, l’accès du dépôt et l’authentification. Occupé/hors ligne indique une capacité en attente ; l’accès inconnu doit être vérifié.', example: 'Groupe vypdev ; étiquettes self-hosted,codex,Linux ; validation sur GitHub.' }, + pt: { labels: ['Onde executar os jobs do Copilot?', 'Perfil reutilizável de runners', 'Grupo existente (vazio usa etiquetas)', 'Etiquetas exatas separadas por vírgulas', 'Runner de validação normal'], + summary: 'Mantenha as rotas instaladas, escolha GitHub ou selecione explicitamente um perfil self-hosted existente.', + where: 'Altera runs-on nos workflows gerados; acesso, Secrets e autenticação são independentes.', + how: 'Manter conserva os jobs existentes. GitHub substitui explicitamente as rotas geridas. O perfil partilhado vem de COPILOT_RUNNER_PROFILES; a entrada manual exige grupo e etiquetas exatos.', + why: 'Cada função tem requisitos de confiança e execução diferentes.', effect: 'A verificação de credenciais permanece no GitHub; observador e publicação mantêm rotas independentes. Workflows nativos são exceções visíveis. Não concede acesso nem muda automaticamente de ambiente.', + verify: 'Reveja YAML, acesso do repositório e autenticação. Ocupado/offline indica capacidade pendente; acesso desconhecido exige verificação.', example: 'Grupo vypdev; etiquetas self-hosted,codex,Linux; validação normal no GitHub.' }, +}; +const fields = ['mode', 'profileId', 'group', 'labels', 'validation']; +export const SETUP_RUNNER_QUESTION_IDS: readonly string[] = [...fields, 'discover'].map(field => `runners.${field}`); +const discoveryCopy = { + en: ['Discover existing runners and groups?', 'Optional: prefill repository Administration read and organization Self-hosted runners read in the setup PAT link. Disabled by default; exact manual routing needs neither discovery grant.', 'Temporary setup PAT only. Discovery reads inventory after PAT verification, never changes runner access, and keeps exact manual routing available when skipped or denied.'], + es: ['¿Consultar los runners y grupos existentes?', 'Opcional: incluye Administration de repositorio y Self-hosted runners de organización en lectura en el enlace del PAT. Desactivado por defecto; puedes indicar una ruta manual exacta sin estos permisos de consulta.', 'Solo afecta al PAT temporal de setup. Consulta el inventario tras verificarlo, nunca cambia el acceso a runners y permite indicar la ruta manual si se omite o deniega la consulta.'], + fr: ['Consulter les runners et groupes existants ?', 'Facultatif : préremplit Administration du dépôt et Self-hosted runners de l’organisation en lecture dans le lien PAT. Désactivé par défaut ; une route manuelle exacte reste possible sans ces droits de consultation.', 'Concerne uniquement le PAT temporaire. Consulte l’inventaire après vérification, ne modifie jamais les accès et permet une route manuelle si la consultation est ignorée ou refusée.'], + pt: ['Consultar runners e grupos existentes?', 'Opcional: inclui Administration do repositório e Self-hosted runners da organização em leitura no link do PAT. Desativado por padrão; uma rota manual exata continua disponível sem estas permissões de consulta.', 'Afeta apenas o PAT temporário. Consulta o inventário após a verificação, nunca altera o acesso e permite uma rota manual se a consulta for ignorada ou negada.'], +}; +export function setupRunnerGuidance(question: SetupQuestion): SetupQuestionPresentation { + const index = fields.indexOf(question.id.slice('runners.'.length)); + return Object.fromEntries(Object.entries(copy).map(([locale, value]) => [locale, { + label: question.id === 'runners.discover' ? discoveryCopy[locale as keyof typeof discoveryCopy][0] : value.labels[index], + summary: question.id === 'runners.discover' ? discoveryCopy[locale as keyof typeof discoveryCopy][1] : value.summary, when: value.where, where: question.id === 'runners.discover' ? discoveryCopy[locale as keyof typeof discoveryCopy][2] : value.where, + how: question.id === 'runners.discover' ? discoveryCopy[locale as keyof typeof discoveryCopy][1] : value.how, why: value.why, + effect: question.id === 'runners.discover' ? discoveryCopy[locale as keyof typeof discoveryCopy][2] : value.effect, verify: value.verify, example: value.example, + documentation: { title: value.labels[0], url: 'https://docs.page/vypdev/copilot/configuration#runner-profiles' }, + }])) as unknown as SetupQuestionPresentation; +} diff --git a/src/application/policies/setup_runner_installation_summary_policy.ts b/src/application/policies/setup_runner_installation_summary_policy.ts new file mode 100644 index 000000000..28774b857 --- /dev/null +++ b/src/application/policies/setup_runner_installation_summary_policy.ts @@ -0,0 +1,29 @@ +import type { SetupBatchTargetPlan } from '../../domain/setup_batch'; +import { selectedSetupRunsOn } from './setup_runner_policy'; +import type { SetupRunsOn } from '../../domain/setup_runner'; + +function routeBlock(route: SetupRunsOn): readonly string[] { + const json = JSON.stringify(route, null, 2); + const longest = (json.match(/`+/g) ?? []).reduce((length, run) => Math.max(length, run.length), 2); + const fence = '`'.repeat(longest + 1); + return [`${fence}json`, json, fence]; +} + +/** Public installation PR content. Registry values and credentials never enter it. */ +export function setupRunnerInstallationSummary(plan: SetupBatchTargetPlan): string { + const review = plan.installationReview; + const runners = plan.configuration.runners; + if (!review && (!runners || runners.mode === 'retain')) return ''; + const jobs = review?.jobs ?? []; + const assets = review?.assets ?? []; + const route = selectedSetupRunsOn(runners, 'agent'); + return ['\n\n## Runner routing and installation parity', + `**Profile choice:** ${runners?.mode ?? 'retain'}. Existing native source workflows remain per-job exceptions.`, + `**Reviewed plan:** \`${plan.digest}\`.`, + ...(route ? ['Selected managed agent route:', ...routeBlock(route)] : ['Installed per-job routing is retained.']), + `**Observations:** ${jobs.filter(job => job.status === 'pending-capacity').length} pending capacity; ${jobs.filter(job => job.status === 'access-unknown').length} access unverified; ${jobs.filter(job => job.status === 'unavailable').length} unavailable.`, + `**Parity:** ${assets.filter(asset => asset.status === 'source-only').length} source extensions; ${assets.filter(asset => asset.status === 'missing').length} missing assets (including disabled optional capabilities); ${assets.filter(asset => asset.status === 'customized').length} customized; ${assets.filter(asset => asset.status === 'incompatible').length} incompatible metadata retained or blocked before regeneration.`, + 'Inspect the complete Files changed view and `.copilot/runner-profile.json`. Any replacements retain setup backups under `.copilot/setup-backups/`.', + 'Runner access, capacity and agent authentication are separate. Selection grants no group access and never falls back to another runner. Human merge and actual trusted workflow verification remain pending.', + ].join('\n'); +} diff --git a/src/application/policies/setup_runner_policy.ts b/src/application/policies/setup_runner_policy.ts new file mode 100644 index 000000000..9c753ebc9 --- /dev/null +++ b/src/application/policies/setup_runner_policy.ts @@ -0,0 +1,146 @@ +import type { SetupRemoteConfiguration } from '../../domain/setup'; +import { DEFAULT_SETUP_RUNNERS, SETUP_RUNNER_REGISTRY, type SetupRunnerConfiguration, type SetupRunnerProfile, + type SetupRunnerInventory, type SetupRunnerJobReview, type SetupRunnerRole, type SetupRunsOn } from '../../domain/setup_runner'; +import { redactSensitiveText } from '../../domain/security/sensitive_text'; + +const object = (value: unknown): value is Record => value !== null && typeof value === 'object' && !Array.isArray(value); +const exact = (value: Record, keys: readonly string[]) => Object.keys(value).every(key => keys.includes(key)); +const literal = (value: unknown, empty = false): value is string => typeof value === 'string' && value.length <= 100 + && (empty || value.trim().length > 0) && value === value.trim() && !/[\p{Cc}\p{Cf}${}<>]/u.test(value) + && redactSensitiveText(value) === value; +const id = (value: unknown): value is string => typeof value === 'string' && /^[A-Za-z0-9][A-Za-z0-9_.-]{0,49}$/u.test(value) + && redactSensitiveText(value) === value; + +export function validSetupRunnerProfile(value: unknown): value is SetupRunnerProfile { + if (!object(value) || !exact(value, ['id', 'group', 'labels', 'validation']) || !id(value.id) + || !literal(value.group, true) || !['hosted', 'agent'].includes(String(value.validation)) + || !Array.isArray(value.labels) || value.labels.length < 1 || value.labels.length > 10 + || !value.labels.every(label => literal(label))) return false; + const labels = value.labels.map(label => label.toLowerCase()); + return new Set(labels).size === labels.length && labels.includes('self-hosted') + && !labels.includes('windows') && (labels.includes('linux') || labels.includes('macos')); +} + +export function parseSetupRunnerProfiles(value: string): readonly SetupRunnerProfile[] | undefined { + if (value.length > 16_000) return undefined; + try { + const parsed: unknown = JSON.parse(value); + if (!object(parsed) || !exact(parsed, ['schemaVersion', 'profiles']) || parsed.schemaVersion !== 1 + || !Array.isArray(parsed.profiles) || parsed.profiles.length < 1 || parsed.profiles.length > 10 + || !parsed.profiles.every(validSetupRunnerProfile)) return undefined; + const profiles = parsed.profiles as SetupRunnerProfile[]; + if (new Set(profiles.map(profile => profile.id.toLowerCase())).size !== profiles.length) return undefined; + return profiles.map(profile => ({ ...profile, labels: [...profile.labels] })); + } catch { return undefined; } +} + +/** A repository override shadows the organization registry even when it is invalid. */ +export function setupRunnerRegistry(remote?: SetupRemoteConfiguration): { + readonly profiles: readonly SetupRunnerProfile[]; readonly status: 'available' | 'missing' | 'invalid' | 'unavailable'; + readonly source?: SetupRunnerConfiguration['source']; + readonly scope?: 'repository' | 'organization'; +} { + // Unknown repository inventory cannot prove that a higher-priority override is absent. + // A readable organization registry alone must not authorize selecting or reusing its route. + if (!remote || remote.repositoryVariablesAccess !== 'available') return { profiles: [], status: 'unavailable' }; + const repository = remote.repositoryVariables.filter(variable => variable.name.toUpperCase() === SETUP_RUNNER_REGISTRY); + const organization = remote.organizationVariables.filter(variable => variable.name.toUpperCase() === SETUP_RUNNER_REGISTRY); + const entries = repository.length ? repository : organization; + if (!repository.length && remote.organizationVariablesAccess !== 'available') return { profiles: [], status: 'unavailable' }; + if (!entries.length) return { profiles: [], status: 'missing' }; + const profiles = entries.length === 1 ? parseSetupRunnerProfiles(entries[0].value) : undefined; + const scope = repository.length ? 'repository' as const : 'organization' as const; + return profiles ? { profiles, status: 'available', scope, source: { scope, value: entries[0].value } } + : { profiles: [], status: 'invalid', scope }; +} + +export function validateSetupRunners(value: unknown): readonly string[] { + if (value === undefined) return []; + const invalid = ['Runner configuration is invalid. Choose retain/hosted, or an exact Linux/macOS self-hosted profile; review group, unique labels and registry version.']; + if (!object(value) || !exact(value, ['mode', 'profileId', 'group', 'labels', 'validation', 'source', 'discover']) + || value.discover !== undefined && typeof value.discover !== 'boolean' + || !['retain', 'hosted', 'organization-profile', 'manual-self-hosted'].includes(String(value.mode)) + || !literal(value.group, true) || typeof value.profileId !== 'string' + || !Array.isArray(value.labels) || !['hosted', 'agent'].includes(String(value.validation))) return invalid; + if (value.mode === 'retain' || value.mode === 'hosted') return value.group === '' && value.profileId === '' + && value.labels.length === 0 && value.validation === 'hosted' && value.source === undefined ? [] : invalid; + if (!validSetupRunnerProfile({ id: value.profileId || 'manual', group: value.group, labels: value.labels, validation: value.validation })) return invalid; + if (value.mode === 'manual-self-hosted') return value.profileId === '' && value.source === undefined ? [] : invalid; + if (!id(value.profileId) || !object(value.source) || !exact(value.source, ['scope', 'value']) + || !['repository', 'organization'].includes(String(value.source.scope)) || typeof value.source.value !== 'string') return invalid; + const selected = parseSetupRunnerProfiles(value.source.value)?.find(profile => profile.id === value.profileId); + return selected && selected.group === value.group && selected.validation === value.validation + && JSON.stringify(selected.labels) === JSON.stringify(value.labels) ? [] : invalid; +} + +export function selectSetupRunnerMode(mode: SetupRunnerConfiguration['mode']): SetupRunnerConfiguration { + return mode === 'manual-self-hosted' + ? { mode, profileId: '', group: '', labels: ['self-hosted', 'Linux'], validation: 'hosted' } + : { ...DEFAULT_SETUP_RUNNERS, mode, labels: [] }; +} + +export function setupRunnerProfileIsFresh(configuration: SetupRunnerConfiguration | undefined, remote: SetupRemoteConfiguration): boolean { + if (configuration?.mode !== 'organization-profile') return true; + const registry = setupRunnerRegistry(remote); + return registry.status === 'available' && registry.source?.scope === configuration.source?.scope + && registry.source?.value === configuration.source?.value; +} + +/** A prior target supplies visible defaults only; registry overrides resolve again for this target. */ +export function reusableSetupRunnerDefaults(previous: SetupRunnerConfiguration | undefined, remote: SetupRemoteConfiguration): SetupRunnerConfiguration | undefined { + if (!previous || previous.mode === 'retain') return undefined; + if (previous.mode === 'organization-profile') { + const registry = setupRunnerRegistry(remote); const profile = registry.profiles.find(profile => profile.id === previous.profileId); + if (!profile) return undefined; + return { mode: previous.mode, profileId: profile.id, group: profile.group, labels: [...profile.labels], validation: profile.validation, source: registry.source, + ...(previous.discover !== undefined ? { discover: previous.discover } : {}) }; + } + return { ...previous, labels: [...previous.labels] }; +} + +/** Security roles are fixed by the template catalog, never guessed from user job names. */ +export function setupRunnerRole(file: string, job: string): SetupRunnerRole | undefined { + const agentJobs: Readonly> = { + 'copilot_issue.yml': 'copilot-issues', 'copilot_issue_comment.yml': 'copilot-issues', + 'copilot_pull_request.yml': 'copilot-pull-requests', 'copilot_pull_request_comment.yml': 'copilot-pull-requests', + 'copilot_commit.yml': 'copilot-commits', 'agent-cli-provisioning.yml': 'verify-agent-clis', + }; + if (agentJobs[file] === job) return 'agent'; + if (file === 'copilot_pull_request_approval.yml' && job === 'observe-approval') return 'observer'; + if (file === 'copilot_pull_request_merge_queue.yml' && job === 'copilot-pull-request-required-check') return 'isolated'; + if (['release_workflow.yml', 'hotfix_workflow.yml'].includes(file)) { + if (['publish', 'publish-npm'].includes(job)) return 'publication'; + if (['validate', 'prepare-version-files', 'promote', 'resume-reconciliation', 'report-failure'].includes(job)) return 'validation'; + } + const helperJobs: Readonly> = { + 'copilot_branch_sync.yml': ['branch-sync'], 'copilot_close_inactive_issues.yml': ['copilot-inactive-issues'], + 'copilot_pull_request_review_state.yml': ['copilot-pull-request-review-state'], + 'copilot_deployment_orchestration.yml': ['resolve-operation', 'mutate'], + 'copilot_credential_health.yml': ['verify-pat', 'verify-openai', 'verify-anthropic', 'verify-google', 'verify-openrouter', 'verify-cursor', 'verify-opencode', 'verify-codex-api-key'], + }; + return helperJobs[file]?.includes(job) ? file === 'copilot_credential_health.yml' ? 'credential-health' : 'validation' : undefined; +} + +export function selectedSetupRunsOn(configuration: SetupRunnerConfiguration | undefined, role: SetupRunnerRole | undefined): SetupRunsOn | undefined { + if (!configuration || configuration.mode === 'retain' || role === undefined + || ['observer', 'publication', 'isolated'].includes(role)) return undefined; + if (role === 'credential-health') return 'ubuntu-latest'; + if (configuration.mode === 'hosted' || role === 'validation' && configuration.validation === 'hosted') return 'ubuntu-latest'; + return configuration.group ? { group: configuration.group, labels: [...configuration.labels] } : [...configuration.labels]; +} + +export function setupRunnerReadiness(route: SetupRunsOn, inventory?: SetupRunnerInventory): SetupRunnerJobReview['status'] { + if (JSON.stringify(route).includes('${{')) return 'access-unknown'; + const group = typeof route === 'object' && !Array.isArray(route) ? (route as { group?: string }).group : undefined; + const raw = typeof route === 'string' || Array.isArray(route) ? route : (route as { labels?: string | readonly string[] }).labels; + const labels = (typeof raw === 'string' ? [raw] : raw ?? []).map(label => label.toLowerCase()); + if (!group && labels.length === 1 && /^(ubuntu|macos|windows)-(latest|[0-9][a-z0-9.-]*)$/u.test(labels[0])) return 'hosted'; + if (!inventory || inventory.status !== 'available') return 'access-unknown'; + const matches = inventory.candidates.filter(candidate => (!group || candidate.group === group) + && labels.every(label => candidate.labels.some(actual => actual.toLowerCase() === label))); + if (!matches.length) return group && inventory.groups.some(candidate => candidate.name === group && candidate.access === 'confirmed') + ? 'unavailable' : 'access-unknown'; + const authorized = matches.filter(candidate => candidate.access === 'confirmed'); + if (!authorized.length) return 'access-unknown'; + return authorized.some(candidate => candidate.status === 'online' && !candidate.busy) ? 'ready' : 'pending-capacity'; +} diff --git a/src/application/policies/setup_runner_question_policy.ts b/src/application/policies/setup_runner_question_policy.ts new file mode 100644 index 000000000..bd57955bb --- /dev/null +++ b/src/application/policies/setup_runner_question_policy.ts @@ -0,0 +1,63 @@ +import type { SetupConfiguration } from '../../domain/setup'; +import type { SetupQuestion, SetupQuestionnaireContext } from '../../domain/setup_questionnaire'; +import { DEFAULT_SETUP_RUNNERS, type SetupRunnerConfiguration } from '../../domain/setup_runner'; +import { selectSetupRunnerMode, setupRunnerRegistry, validSetupRunnerProfile } from './setup_runner_policy'; + +export function setupRunnerQuestions() { + const manual = (draft: SetupConfiguration) => draft.runners?.mode === 'manual-self-hosted'; + return [ + { stateId: 'agent-runtime' as const, id: 'runners.discover', label: 'Discover existing runners and groups (optional read-only PAT permissions)?', kind: 'boolean' as const, + read: (draft: SetupConfiguration) => draft.runners?.discover ?? false }, + { stateId: 'agent-runtime' as const, id: 'runners.mode', label: 'Where should Copilot jobs run?', kind: 'choice' as const, + choices: ['retain', 'hosted', 'organization-profile', 'manual-self-hosted'], read: (draft: SetupConfiguration) => draft.runners?.mode ?? 'retain' }, + { stateId: 'agent-runtime' as const, id: 'runners.profileId', label: 'Reusable runner profile', kind: 'choice' as const, + applies: (draft: SetupConfiguration) => draft.runners?.mode === 'organization-profile' }, + { stateId: 'agent-runtime' as const, id: 'runners.group', label: 'Existing runner group (empty selects by labels)', kind: 'text' as const, applies: manual }, + { stateId: 'agent-runtime' as const, id: 'runners.labels', label: 'Exact runner labels, comma-separated (include self-hosted and Linux or macOS)', kind: 'text' as const, + read: (draft: SetupConfiguration) => draft.runners!.labels.join(','), applies: manual }, + { stateId: 'agent-runtime' as const, id: 'runners.validation', label: 'Ordinary validation jobs: hosted, or the selected agent runner?', kind: 'choice' as const, + choices: ['hosted', 'agent'], applies: manual }, + ]; +} + +export function setupRunnerQuestion(question: SetupQuestion, context: SetupQuestionnaireContext): SetupQuestion { + if (!question.id.startsWith('runners.') || question.id === 'runners.discover') return question; + const registry = setupRunnerRegistry(context.remote); + return { ...question, runnerProfiles: registry.profiles, runnerRegistryStatus: registry.status, runnerRegistryScope: registry.scope, runnerInventory: context.runnerInventory, + ...(question.id === 'runners.mode' ? { choices: ['retain', 'hosted', ...(registry.status === 'available' ? ['organization-profile'] : []), 'manual-self-hosted'] } : {}), + ...(question.id === 'runners.profileId' ? { choices: registry.profiles.map(profile => profile.id) } : {}) }; +} + +export function applySetupRunnerAnswer(configuration: SetupConfiguration, question: SetupQuestion, + input: string, context: SetupQuestionnaireContext): { readonly configuration?: SetupConfiguration; readonly error?: string } { + const current = configuration.runners ?? DEFAULT_SETUP_RUNNERS; + let runners: SetupRunnerConfiguration; + if (question.id === 'runners.discover') { + return { configuration: { ...configuration, runners: { ...current, discover: input === 'true' } } }; + } else if (question.id === 'runners.mode') { + const mode = input as SetupRunnerConfiguration['mode']; + if (mode === 'organization-profile') { + const registry = setupRunnerRegistry(context.remote); + const profile = registry.profiles.find(profile => profile.id === current.profileId) ?? registry.profiles[0]; + if (!profile) return { error: 'No valid effective runner registry is available. Enter an exact manual profile or repair COPILOT_RUNNER_PROFILES.' }; + runners = { mode, profileId: profile.id, group: profile.group, labels: [...profile.labels], validation: profile.validation, source: registry.source }; + } else runners = selectSetupRunnerMode(mode); + } else if (question.id === 'runners.profileId') { + const registry = setupRunnerRegistry(context.remote); const profile = registry.profiles.find(profile => profile.id === input); + if (!profile) return { error: 'The selected runner profile is unavailable. Review the registry or enter a manual profile.' }; + runners = { mode: 'organization-profile', profileId: profile.id, group: profile.group, labels: [...profile.labels], validation: profile.validation, source: registry.source }; + } else if (question.id === 'runners.labels') { + const labels = input.split(',').map(label => label.trim()); + if (!validSetupRunnerProfile({ id: 'manual', group: current.group, labels, validation: current.validation })) { + return { error: 'Use 1–10 unique literal labels including self-hosted and Linux or macOS. Expressions and Windows service routes are unsupported.' }; + } + runners = { ...current, labels }; + } else if (question.id === 'runners.group') { + if (!validSetupRunnerProfile({ id: 'manual', group: input, labels: current.labels, validation: current.validation })) { + return { error: 'Enter an existing literal runner group of at most 100 characters, or leave it empty. Expressions and control characters are unsupported.' }; + } + runners = { ...current, group: input }; + } else runners = { ...current, validation: input as SetupRunnerConfiguration['validation'] }; + return { configuration: { ...configuration, runners: { ...runners, + ...(current.discover !== undefined ? { discover: current.discover } : {}) } } }; +} diff --git a/src/application/policies/setup_token_permission_policy.ts b/src/application/policies/setup_token_permission_policy.ts index 9b3a91fb4..7501249ba 100644 --- a/src/application/policies/setup_token_permission_policy.ts +++ b/src/application/policies/setup_token_permission_policy.ts @@ -123,13 +123,31 @@ export function buildSetupBatchPatPermissionRequirements(configuration: Readonly ]); } +/** Optional inventory grants are disclosed and prefilled, never mandatory for manual routing. */ +export function withSetupRunnerDiscoveryPermissions(requirements: readonly SetupTokenPermissionRequirement[], + configuration: Readonly, ownerKind: 'Organization' | 'User'): SetupTokenPermissionRequirement[] { + const required = [...requirements]; + if (configuration.runners?.discover) { + const discovery = [ + requirement({ role: 'setup', scope: 'repository', permission: 'Administration', level: 'read', + applicability: 'conditional', condition: 'Optional runner discovery selected', + reason: 'List existing repository self-hosted runners without changing access.', probe: 'administration' }), + ...(ownerKind === 'Organization' ? [requirement({ role: 'setup', scope: 'organization', permission: 'Self-hosted runners', level: 'read', + applicability: 'conditional', condition: 'Optional organization runner discovery selected', + reason: 'List existing eligible runner groups and their runners; manual routing remains available without this grant.', probe: 'runner-groups' })] : []), + ]; + required.push(...discovery.filter(candidate => !required.some(item => item.scope === candidate.scope && item.permission === candidate.permission))); + } + return required; +} + /** Local requirements plus disclosed health prerequisites for selected Secret management. */ export function buildSetupPatIntentPermissionRequirements( configuration: Readonly, ownerKind: 'Organization' | 'User', projectsWanted = configuration.projects.ids.trim().length > 0, ): SetupTokenPermissionRequirement[] { - const required = buildSetupPatRequirements(configuration, ownerKind === 'Organization', undefined, projectsWanted); + const required = withSetupRunnerDiscoveryPermissions(buildSetupPatRequirements(configuration, ownerKind === 'Organization', undefined, projectsWanted), configuration, ownerKind); if (!configuration.manageRepositorySecrets) return required; // Prefill these possible health-check grants without treating unknown remote // inventory/workflow state as permission to run their write probes now. diff --git a/src/application/ports/setup_batch_ports.ts b/src/application/ports/setup_batch_ports.ts index 336d027a6..611bf8592 100644 --- a/src/application/ports/setup_batch_ports.ts +++ b/src/application/ports/setup_batch_ports.ts @@ -14,6 +14,7 @@ export interface SetupBatchInventoryPort { files(target: SetupBatchTarget, token: string): Promise; } export interface SetupBatchRenderPort { + review?(configuration: SetupConfiguration, existing: readonly SetupBatchFile[]): Promise; render(configuration: SetupConfiguration, existing: readonly SetupBatchFile[]): Promise; digest(value: string): string; operationId(): string; diff --git a/src/application/ports/setup_runner_ports.ts b/src/application/ports/setup_runner_ports.ts new file mode 100644 index 000000000..35907a646 --- /dev/null +++ b/src/application/ports/setup_runner_ports.ts @@ -0,0 +1,9 @@ +import type { SetupConfiguration, SetupOwnerType } from '../../domain/setup'; +import type { SetupInstallationReview, SetupRunnerInventory } from '../../domain/setup_runner'; + +export interface SetupRunnerDiscoveryPort { + discover(owner: string, repository: string, token: string, ownerType: SetupOwnerType): Promise; +} +export interface SetupInstallationReviewPort { + inspect(configuration: SetupConfiguration): Promise; +} diff --git a/src/application/usecases/actions/setup_resource_provisioning.ts b/src/application/usecases/actions/setup_resource_provisioning.ts index e8c252cf9..861711e61 100644 --- a/src/application/usecases/actions/setup_resource_provisioning.ts +++ b/src/application/usecases/actions/setup_resource_provisioning.ts @@ -1,4 +1,5 @@ import { sameSetupRemoteFacts, hasCompleteSetupSecretRevisions } from '../../policies/setup_remote_facts_policy'; +import { setupRunnerProfileIsFresh } from '../../policies/setup_runner_policy'; import type { SetupConfiguration, SetupCredentialCollection, @@ -154,13 +155,21 @@ export async function resolveRemoteConfiguration( setupConfiguration: SetupConfiguration | undefined, errors: string[], ): Promise { + let runnerRemote: SetupRemoteConfiguration | undefined; + if (setupConfiguration?.runners?.mode === 'organization-profile') { + try { runnerRemote = await dependencies.setupRemoteConfigurationReadPort?.inspect(); } catch { /* Unknown cannot establish profile freshness. */ } + if (!runnerRemote || !setupRunnerProfileIsFresh(setupConfiguration.runners, runnerRemote)) { + errors.push('The reviewed runner registry changed or is unavailable. No changes were made; inspect and approve a fresh profile snapshot.'); + return undefined; + } + } if (context.setupConfigurationSource === 'organization') { if (!context.setupRemoteConfiguration || !dependencies.setupRemoteConfigurationReadPort) { errors.push('Organization reuse requires a fresh inventory before Apply. No changes were made.'); return undefined; } try { - const fresh = await dependencies.setupRemoteConfigurationReadPort.inspect(); + const fresh = runnerRemote ?? await dependencies.setupRemoteConfigurationReadPort.inspect(); if (!hasCompleteSetupSecretRevisions(fresh) || !hasCompleteSetupSecretRevisions(context.setupRemoteConfiguration)) { errors.push('Retained Secret revision metadata could not be verified. Restore metadata access and prepare a fresh plan. No changes were made.'); return undefined; @@ -175,6 +184,7 @@ export async function resolveRemoteConfiguration( return undefined; } } + if (runnerRemote) return runnerRemote; if (context.setupRemoteConfiguration) return context.setupRemoteConfiguration; if (!dependencies.setupRemoteConfigurationReadPort || !setupConfiguration) return undefined; try { diff --git a/src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts b/src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts index 19304ab21..738940695 100644 --- a/src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts +++ b/src/application/usecases/setup/__tests__/prepare_setup_pat_intent_use_case.test.ts @@ -219,3 +219,16 @@ describe('PrepareSetupPatIntentUseCase', () => { expect(ports.chooseOwnerKind).not.toHaveBeenCalled(); }); }); + +test('guided runner discovery is reviewed before PAT entry and kept as an answered intent', async () => { + const { ports, useCase } = harness(); + const result = await useCase.execute({ ...request, overrides: { runners: { discover: true } } }); + expect(result.kind).toBe('guided'); + if (result.kind !== 'guided') throw new Error('Expected scoped guided PAT'); + expect(new URL(result.url).searchParams.get('organization_self_hosted_runners')).toBe('read'); + expect(result.permissionIntent.answeredQuestionIds).toContain('runners.discover'); + expect(result.permissionIntent.draft.runners?.discover).toBe(true); + expect(ports.showPreview).toHaveBeenCalledWith(expect.objectContaining({ requirements: expect.arrayContaining([ + expect.objectContaining({ permission: 'Self-hosted runners', level: 'read', applicability: 'conditional' }), + ]) })); +}); diff --git a/src/application/usecases/setup/__tests__/setup_batch_flow.test.ts b/src/application/usecases/setup/__tests__/setup_batch_flow.test.ts index 96684d1de..638ee8861 100644 --- a/src/application/usecases/setup/__tests__/setup_batch_flow.test.ts +++ b/src/application/usecases/setup/__tests__/setup_batch_flow.test.ts @@ -14,7 +14,8 @@ import type { SetupRemoteConfiguration } from '../../../../domain/setup'; const id = 'a67c8e40-93be-43ed-a7ed-e07378c7e773'; function fixture() { - const configuration = createDefaultSetupConfiguration(); configuration.pullRequestApproval = { ...configuration.pullRequestApproval, mode: 'off' }; configuration.createInitialTag = false; + const configuration = createDefaultSetupConfiguration(); + configuration.runners = { ...configuration.runners!, discover: true }; configuration.pullRequestApproval = { ...configuration.pullRequestApproval, mode: 'off' }; configuration.createInitialTag = false; const targets: SetupBatchTarget[] = [7, 8].map(number => ({ id: number, ownerId: 3, owner: 'acme', name: `repo-${number}`, defaultBranch: 'master', baseSha: 'a'.repeat(40), private: true, archived: false, disabled: false, canPush: true })); const shared: SetupBatchSharedResource[] = [...buildSetupRepositoryVariables(configuration).map(variable => ({ kind: 'variable' as const, @@ -36,6 +37,30 @@ function fixture() { } describe('read-only per-target preparation', () => { + it('keeps batch routing unverified without any discovery request when discovery is disabled', async () => { + const f = fixture(); f.configuration.runners = { ...f.configuration.runners!, discover: false }; + const review = { blockers: [], assets: [], changes: [], jobs: [{ file: 'copilot_issue.yml', job: 'copilot-issues', role: 'agent' as const, + runsOn: ['self-hosted', 'Linux'], retained: false, status: 'ready' as const }] }; + const discover = jest.fn(); + const plan = await new PrepareSetupBatchUseCase({ ...f.ports, renderer: { ...f.ports.renderer, review: async () => review }, runnerDiscovery: { discover } }).execute(f.request); + expect(discover).not.toHaveBeenCalled(); + expect(plan.targets.every(target => target.installationReview?.jobs[0].status === 'access-unknown')).toBe(true); + expect(plan.targets.every(target => target.blocked.length === 0)).toBe(true); + }); + it.each(['available', 'unavailable', 'absent', 'blocked'] as const)('reviews runner routing and retains target isolation with %s discovery', async status => { + const f = fixture(); const review = { blockers: status === 'blocked' ? ['Restore a compatible generator.'] : [], assets: [], changes: [], + jobs: [{ file: 'copilot_issue.yml', job: 'copilot-issues', role: 'agent' as const, runsOn: ['self-hosted', 'Linux'], retained: false, status: 'access-unknown' as const }] }; + const discover = jest.fn(async () => { if (status === 'unavailable') throw new Error('denied'); return { status: 'available' as const, + groups: [], candidates: [{ id: 1, labels: ['self-hosted', 'Linux'], access: 'confirmed' as const, status: 'online' as const, busy: true }] }; }); + const prepare = new PrepareSetupBatchUseCase({ ...f.ports, renderer: { ...f.ports.renderer, review: async () => review }, + ...(status === 'absent' ? {} : { runnerDiscovery: { discover } }) }); + const plan = await prepare.execute(f.request); + expect(plan.targets[0].installationReview?.jobs[0].status).toBe(status === 'available' || status === 'blocked' ? 'pending-capacity' : 'access-unknown'); + if (status === 'blocked') { expect(plan.targets[0].blocked).toContain('Restore a compatible generator.'); expect(f.ports.renderer.render).not.toHaveBeenCalled(); } + else expect(plan.targets[0].files).toHaveLength(1); + // Capacity is not part of the stable configuration/files plan identity. + expect(plan.targets[0].digest).toMatch(/^[a-f0-9]{64}$/u); + }); it('rejects an archived selected target before inspecting shared resources', async () => { const f = fixture(); f.targets[1] = { ...f.targets[1], archived: true }; await expect(f.prepare.execute(f.request)).rejects.toThrow('archived'); expect(f.ports.inventory.shared).not.toHaveBeenCalled(); diff --git a/src/application/usecases/setup/__tests__/setup_runner_planning.test.ts b/src/application/usecases/setup/__tests__/setup_runner_planning.test.ts new file mode 100644 index 000000000..5643a3d10 --- /dev/null +++ b/src/application/usecases/setup/__tests__/setup_runner_planning.test.ts @@ -0,0 +1,100 @@ +import { SetupWizardUseCase } from '../setup_wizard_use_case'; +import { createDefaultSetupConfiguration } from '../../../policies/setup_configuration_defaults'; +import { unavailableSetupRemoteConfiguration } from '../../../policies/setup_remote_facts_policy'; +import { resolveRemoteConfiguration } from '../../actions/setup_resource_provisioning'; +import type { SetupInstallationReview, SetupRunnerConfiguration } from '../../../../domain/setup_runner'; + +const profile = { id: 'shared', group: 'vypdev', labels: ['self-hosted', 'Linux'], validation: 'hosted' as const }; +const value = JSON.stringify({ schemaVersion: 1, profiles: [profile] }); +const runners: SetupRunnerConfiguration = { mode: 'organization-profile', discover: true, profileId: profile.id, group: profile.group, + labels: profile.labels, validation: 'hosted', source: { scope: 'organization', value } }; +const remote = { ...unavailableSetupRemoteConfiguration(), ownerType: 'Organization' as const, repositoryId: 7, + repositoryVariablesAccess: 'available' as const, organizationVariablesAccess: 'available' as const, + repositorySecretsAccess: 'available' as const, organizationSecretsAccess: 'available' as const, organizationAccess: 'available' as const, + organizationVariables: [{ name: 'COPILOT_RUNNER_PROFILES', value }], defaultBranch: 'master' }; +const review: SetupInstallationReview = { blockers: [], assets: [], changes: [], jobs: [{ file: 'copilot_issue.yml', job: 'copilot-issues', + role: 'agent', runsOn: { group: 'vypdev', labels: profile.labels }, retained: false, status: 'access-unknown' }] }; +const request = { mode: 'non-interactive' as const, remoteTarget: { owner: 'vypdev', repository: 'platform', token: 'fixture' }, + skipRepositoryVariables: true, skipRepositorySecrets: true, overrides: { runners, pullRequestApproval: { mode: 'off' as const } } }; +function fixture() { + return { planPresenter: { present: jest.fn() }, confirmation: { confirm: jest.fn(async () => ({ kind: 'approved' as const })) }, + finalPermissionAudit: { audit: jest.fn(async () => ({ status: 'accepted' as const })) }, + remoteConfiguration: { inspect: jest.fn(async () => remote) }, installationReview: { inspect: jest.fn(async () => review) }, + runnerDiscovery: { discover: jest.fn(async () => ({ status: 'available' as const, groups: [{ name: 'vypdev', access: 'confirmed' as const }], + candidates: [{ id: 1, group: 'vypdev', labels: profile.labels, access: 'confirmed' as const, status: 'offline' as const, busy: false }] })) } }; +} +describe('runner planning and stale-profile guards', () => { + test('shared planning reports pending capacity without replacing the route', async () => { + const dependencies = fixture(); const result = await new SetupWizardUseCase(dependencies).execute(request); + expect(result.status).toBe('completed'); + if (result.status === 'completed') { + expect(result.plan.installationReview?.jobs[0]).toMatchObject({ status: 'pending-capacity', runsOn: review.jobs[0].runsOn }); + expect(result.configuration.runners).toEqual(runners); + } + expect(dependencies.runnerDiscovery.discover).toHaveBeenCalledWith('vypdev', 'platform', 'fixture', 'Organization'); + expect(dependencies.finalPermissionAudit.audit).toHaveBeenCalledTimes(1); + }); + test('optional discovery failure keeps manual recovery and access-unknown', async () => { + const dependencies = fixture(); dependencies.runnerDiscovery.discover.mockRejectedValue(new Error('denied')); + const result = await new SetupWizardUseCase(dependencies).execute({ ...request, previewOnly: true }); + expect(result.status).toBe('completed'); + if (result.status === 'completed') expect(result.plan.installationReview?.jobs[0]).toMatchObject({ status: 'access-unknown', runsOn: review.jobs[0].runsOn }); + expect(dependencies.finalPermissionAudit.audit).not.toHaveBeenCalled(); + }); + test.each(['changed', 'unavailable'] as const)('registry %s after review blocks before permission probes', async state => { + const dependencies = fixture(); dependencies.remoteConfiguration.inspect.mockResolvedValueOnce(remote); + if (state === 'changed') dependencies.remoteConfiguration.inspect.mockResolvedValueOnce({ ...remote, organizationVariables: [] }); + else dependencies.remoteConfiguration.inspect.mockRejectedValueOnce(new Error('denied')); + await expect(new SetupWizardUseCase(dependencies).execute(request)).rejects.toThrow('runner registry changed or is unavailable'); + expect(dependencies.finalPermissionAudit.audit).not.toHaveBeenCalled(); expect(dependencies.planPresenter.present).toHaveBeenCalledTimes(1); + }); + test('incompatible installation blocks preview completion before later credential/probe stages', async () => { + const dependencies = fixture(); dependencies.installationReview.inspect.mockResolvedValue({ ...review, blockers: ['Restore a compatible generator.'] }); + await expect(new SetupWizardUseCase(dependencies).execute({ ...request, previewOnly: true })).rejects.toThrow('compatible generator'); + expect(dependencies.planPresenter.present).toHaveBeenCalled(); expect(dependencies.finalPermissionAudit.audit).not.toHaveBeenCalled(); + }); + test('Apply rereads the selected registry even when resource management is disabled', async () => { + const configuration = { ...createDefaultSetupConfiguration(), runners, manageRepositoryVariables: false, manageRepositorySecrets: false }; + const errors: string[] = []; const inspect = jest.fn(async () => remote); + expect(await resolveRemoteConfiguration({ setupRemoteConfiguration: remote }, { setupRemoteConfigurationReadPort: { inspect } }, configuration, errors)).toEqual(remote); + expect(inspect).toHaveBeenCalledTimes(1); expect(errors).toEqual([]); + inspect.mockResolvedValue({ ...remote, organizationVariables: [] }); + expect(await resolveRemoteConfiguration({ setupRemoteConfiguration: remote }, { setupRemoteConfigurationReadPort: { inspect } }, configuration, errors)).toBeUndefined(); + expect(errors.join(' ')).toContain('No changes were made'); + }); + test.each([false, true])('missing/failed registry reader cannot authorize a write: %s', fails => { + const errors: string[] = []; const configuration = { ...createDefaultSetupConfiguration(), runners }; + return resolveRemoteConfiguration({}, fails ? { setupRemoteConfigurationReadPort: { inspect: async () => { throw new Error('denied'); } } } : {}, configuration, errors) + .then(result => { expect(result).toBeUndefined(); expect(errors.join(' ')).toContain('runner registry changed'); }); + }); +}); + + +test('disabled discovery performs no optional provider request and retains an unverified route', async () => { + const dependencies = fixture(); + const result = await new SetupWizardUseCase(dependencies).execute({ ...request, previewOnly: true, + overrides: { ...request.overrides, runners: { ...runners, discover: false } } }); + expect(result.status).toBe('completed'); + if (result.status === 'completed') expect(result.plan.installationReview?.jobs[0].status).toBe('access-unknown'); + expect(dependencies.runnerDiscovery.discover).not.toHaveBeenCalled(); +}); + +test.each([false, true])('an existing PAT can change discovery to %s during the full questionnaire', async discover => { + const dependencies = fixture(); + const result = await new SetupWizardUseCase({ ...dependencies, collector: { collect: async initial => ({ ...initial, + draft: { ...initial.draft, runners: { ...initial.draft.runners!, discover } }, stateId: 'review', terminal: 'review' }) } }).execute({ + ...request, mode: 'interactive', previewOnly: true, overrides: { ...request.overrides, runners: { ...runners, discover: !discover } } }); + expect(result.status).toBe('completed'); + if (result.status === 'completed') expect(result.plan.installationReview?.jobs[0].status).toBe(discover ? 'pending-capacity' : 'access-unknown'); + expect(dependencies.runnerDiscovery.discover).toHaveBeenCalledTimes(1); +}); + +test('discovery enabled after PAT entry can be denied without blocking exact reviewed routing', async () => { + const dependencies = fixture(); dependencies.runnerDiscovery.discover.mockRejectedValue(new Error('denied')); + const result = await new SetupWizardUseCase({ ...dependencies, collector: { collect: async initial => ({ ...initial, + draft: { ...initial.draft, runners: { ...initial.draft.runners!, discover: true } }, stateId: 'review', terminal: 'review' }) } }).execute({ + ...request, mode: 'interactive', previewOnly: true, overrides: { ...request.overrides, runners: { ...runners, discover: false } } }); + expect(result.status).toBe('completed'); + if (result.status === 'completed') expect(result.plan.installationReview?.jobs[0]).toMatchObject({ status: 'access-unknown', runsOn: review.jobs[0].runsOn }); + expect(dependencies.runnerDiscovery.discover).toHaveBeenCalledTimes(1); expect(dependencies.finalPermissionAudit.audit).not.toHaveBeenCalled(); +}); diff --git a/src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts b/src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts index ef7b8cbe9..7f2bcf58d 100644 --- a/src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts +++ b/src/application/usecases/setup/__tests__/setup_wizard_use_case.test.ts @@ -32,6 +32,15 @@ function dependencies(overrides: Record = {}) { } describe('SetupWizardUseCase', () => { + it('does not repeat an explicit discovery answer when revising another plan group', async () => { + const collect = jest.fn(async (state, _context) => createSetupReviewState(state.draft)); + const confirmation = { confirm: jest.fn().mockResolvedValueOnce({ kind: 'revise', group: 'repository' }).mockResolvedValueOnce({ kind: 'approved' }) }; + const result = await new SetupWizardUseCase(dependencies({ collector: { collect }, confirmation })).execute({ mode: 'interactive', + overrides: { runners: { discover: false }, pullRequestApproval: { mode: 'off' } } }); + expect(result.status).toBe('completed'); expect(collect).toHaveBeenCalledTimes(2); + expect(collect.mock.calls[1][1].skipQuestionIds).toContain('runners.discover'); + if (result.status === 'completed') expect(result.configuration.runners?.discover).toBe(false); + }); it('suggests an observed GitHub default branch without overriding an explicit configured branch', async () => { const collect = jest.fn(async (state: SetupQuestionnaireState, _context: SetupQuestionnaireContext) => createSetupReviewState(state.draft)); const deps = dependencies({ collector: { collect }, remoteConfiguration: { inspect: jest.fn().mockResolvedValue({ ...remote, defaultBranch: 'main' }) } }); diff --git a/src/application/usecases/setup/__tests__/verify_web_setup_apply_use_case.test.ts b/src/application/usecases/setup/__tests__/verify_web_setup_apply_use_case.test.ts index 6cf1ca8a6..08c0bfbc7 100644 --- a/src/application/usecases/setup/__tests__/verify_web_setup_apply_use_case.test.ts +++ b/src/application/usecases/setup/__tests__/verify_web_setup_apply_use_case.test.ts @@ -38,6 +38,15 @@ function harness(onPermissionCleanupPending?: () => void) { } describe('VerifyWebSetupApplyUseCase', () => { + test('a missing selected registry blocks even when other reviewed facts match', async () => { + const { ports, useCase } = harness(); + const profile = { id: 'shared', group: 'vypdev', labels: ['self-hosted', 'Linux'], validation: 'hosted' as const }; + const configuration = { ...request.configuration, runners: { mode: 'organization-profile' as const, profileId: profile.id, + group: profile.group, labels: profile.labels, validation: profile.validation, + source: { scope: 'organization' as const, value: JSON.stringify({ schemaVersion: 1, profiles: [profile] }) } } }; + await expect(useCase.execute({ ...request, configuration })).rejects.toThrow('facts changed'); + expect(ports.permissionAudit.audit).not.toHaveBeenCalled(); + }); test.each(['missing', 'partial', 'invalid-date'] as const)('blocks identical %s retained Secret metadata before permission probes', async kind => { const { ports, useCase } = harness(); const revisions = kind === 'missing' ? undefined : kind === 'partial' ? remoteBase.repositorySecretRevisions!.slice(0, 1) diff --git a/src/application/usecases/setup/prepare_setup_batch_use_case.ts b/src/application/usecases/setup/prepare_setup_batch_use_case.ts index e2a5c6cf1..1135b16c7 100644 --- a/src/application/usecases/setup/prepare_setup_batch_use_case.ts +++ b/src/application/usecases/setup/prepare_setup_batch_use_case.ts @@ -10,6 +10,7 @@ import { configureSetupOrganizationReuseStorage } from '../../policies/setup_org import { projectSetupBatchSharedBindings, planSetupBatchSharedAccess } from '../../policies/setup_batch_access_policy'; import { validateSetupConfiguration } from '../../policies/setup_configuration_validation'; import { SetupInteractionCancelledError } from '../../errors/setup_interaction_cancelled_error'; +import { setupRunnerReadiness } from '../../policies/setup_runner_policy'; export interface PrepareSetupBatchRequest { readonly organization: string; @@ -18,6 +19,7 @@ export interface PrepareSetupBatchRequest { readonly operationId?: string; } export interface PrepareSetupBatchPorts { + readonly runnerDiscovery?: import('../../ports/setup_runner_ports').SetupRunnerDiscoveryPort; readonly discovery: SetupBatchDiscoveryPort; readonly inventory: SetupBatchInventoryPort; readonly renderer: SetupBatchRenderPort; @@ -84,15 +86,23 @@ export class PrepareSetupBatchUseCase { } blocked.push(...access.missing.map(name => `${name}: provision or authorize this existing binding separately, then inspect again.`)); let files: SetupBatchTargetPlan['files'] = []; + let installationReview: SetupBatchTargetPlan['installationReview']; if (!blocked.length) { try { const existing = await this.ports.inventory.files(target, request.token); - files = await this.ports.renderer.render(configuration, existing); + const review = await this.ports.renderer.review?.(configuration, existing); + if (review) { + const inventory = configuration.runners?.discover ? await this.ports.runnerDiscovery?.discover(target.owner, target.name, request.token, 'Organization') + .catch(() => ({ status: 'unavailable' as const, candidates: [], groups: [] })) : undefined; + installationReview = { ...review, jobs: review.jobs.map(job => ({ ...job, status: setupRunnerReadiness(job.runsOn, inventory) })) }; + blocked.push(...review.blockers); + } + if (!blocked.length) files = await this.ports.renderer.render(configuration, existing); } catch { blocked.push('Setup files could not be inspected or rendered within the fixed asset budget. Inspect this target before retrying; other ready targets can continue.'); } } - const basis = { target, configuration, remote, files, repositoryVariables: access.variables.repositoryWrites, grants, sharedSnapshot: access.sharedSnapshot, blocked }; + const basis = { target, configuration, remote, files, ...(installationReview ? { installationReview } : {}), repositoryVariables: access.variables.repositoryWrites, grants, sharedSnapshot: access.sharedSnapshot, blocked }; // The desired contract stays stable after our own grants and Variable writes. // Observed facts are freshly reviewed and revalidated, never persisted as values. const digest = this.ports.renderer.digest(JSON.stringify({ target, configuration, files, diff --git a/src/application/usecases/setup/setup_wizard_use_case.ts b/src/application/usecases/setup/setup_wizard_use_case.ts index 613497586..6fa03afce 100644 --- a/src/application/usecases/setup/setup_wizard_use_case.ts +++ b/src/application/usecases/setup/setup_wizard_use_case.ts @@ -1,3 +1,4 @@ +import { setupRunnerReadiness, setupRunnerProfileIsFresh } from '../../policies/setup_runner_policy'; import { unavailableSetupRemoteConfiguration, hasCompleteSetupSecretRevisions } from '../../policies/setup_remote_facts_policy'; import type { SetupConfigurationCollectorPort, @@ -108,6 +109,8 @@ export type SetupWizardResult = }; export interface SetupWizardDependencies { + runnerDiscovery?: import('../../ports/setup_runner_ports').SetupRunnerDiscoveryPort; + installationReview?: import('../../ports/setup_runner_ports').SetupInstallationReviewPort; workflowPatConflict?: Pick; collector?: SetupConfigurationCollectorPort; planPresenter: SetupPlanPresenterPort; @@ -194,7 +197,11 @@ export class SetupWizardUseCase { ? await this.dependencies.projectDiscovery.discover( request.remoteTarget.owner, projectOwnerType, request.remoteTarget.token, ).catch(() => ({ status: 'unavailable' as const, candidates: [] })) : undefined; + let runnerInventory = initial.runners?.discover && request.remoteTarget && this.dependencies.runnerDiscovery + ? await this.dependencies.runnerDiscovery.discover(request.remoteTarget.owner, request.remoteTarget.repository, + request.remoteTarget.token, projectOwnerType).catch(() => ({ status: 'unavailable' as const, candidates: [], groups: [] })) : undefined; let context: SetupQuestionnaireContext = { + ...(runnerInventory ? { runnerInventory } : {}), ...(remoteConfiguration ? { remote: remoteConfiguration } : {}), branchSources: { main: explicitMainBranch ? 'configuration' : remoteConfiguration?.defaultBranch ? 'github' : 'default', development: request.overrides?.repository?.developmentBranch !== undefined ? 'configuration' @@ -208,6 +215,7 @@ export class SetupWizardUseCase { projectsWanted: request.revision.group === 'projects' || Boolean(initial.projects.ids.trim()) } : {}), ...(!request.revision ? { skipQuestionIds: [...new Set([ ...(request.permissionIntent?.answeredQuestionIds ?? []), + ...(request.overrides?.runners?.discover !== undefined ? ['runners.discover'] : []), ...(organizationImport?.answeredQuestionIds ?? []), ...(request.permissionIntent?.projectsWanted === false ? ['projects.ids'] : []), ...basicSkippedQuestionIds, @@ -279,6 +287,11 @@ export class SetupWizardUseCase { ); } let configuration = normalizeSetupConfigurationLocales(collectedConfiguration); + if (!configuration.runners?.discover) runnerInventory = undefined; + else if (!initial.runners?.discover && request.remoteTarget && this.dependencies.runnerDiscovery) { + runnerInventory = await this.dependencies.runnerDiscovery.discover(request.remoteTarget.owner, request.remoteTarget.repository, + request.remoteTarget.token, projectOwnerType).catch(() => ({ status: 'unavailable' as const, candidates: [], groups: [] })); + } if ((request.configurationSource === 'organization' || request.deliveryMode === 'pull-request') && remoteConfiguration) { configuration = configureSetupOrganizationReuseStorage(configuration, buildSetupOrganizationReuseVariables(configuration, remoteConfiguration), remoteConfiguration); } @@ -375,6 +388,11 @@ export class SetupWizardUseCase { } } const plan = buildSetupPlan(configuration, readiness, approvalReadiness); + if (this.dependencies.installationReview && request.deliveryMode !== 'pull-request') { + const review = await this.dependencies.installationReview.inspect(configuration); + plan.installationReview = { ...review, jobs: review.jobs.map(job => ({ ...job, + status: setupRunnerReadiness(job.runsOn, runnerInventory) })) }; + } plan.deliveryMode = request.deliveryMode ?? 'local'; if ((request.configurationSource === 'organization' || request.deliveryMode === 'pull-request') && remoteConfiguration) { plan.variables = buildSetupOrganizationReuseVariables(configuration, remoteConfiguration); @@ -416,6 +434,7 @@ export class SetupWizardUseCase { const answeredQuestionIds = [...new Set([ ...(request.revision?.answeredQuestionIds ?? []), ...(request.permissionIntent?.answeredQuestionIds ?? []), + ...(request.overrides?.runners?.discover !== undefined ? ['runners.discover'] : []), ...(organizationImport?.answeredQuestionIds ?? []), ...(questionnaire.answeredQuestionIds ?? []), ])]; @@ -442,11 +461,21 @@ export class SetupWizardUseCase { configuration: cloneSetupConfiguration(configuration), errors: ['The local setup session expired before permission checks began.'], ...(remoteConfiguration ? { remoteConfiguration } : {}) }; } + if (plan.installationReview?.blockers.length) throw new ApplicationError('configuration.invalid', plan.installationReview.blockers.join(' ')); if (request.previewOnly) { return { status: 'completed', exitCode: 0, configuration: cloneSetupConfiguration(configuration), plan, ...(organizationImport ? { organizationImport } : {}), ...(remoteConfiguration ? { remoteConfiguration } : {}) }; } + if (configuration.runners?.mode === 'organization-profile') { + const target = request.remoteTarget; + let fresh: SetupRemoteConfiguration | undefined; + try { fresh = target && await this.dependencies.remoteConfiguration?.inspect(target.owner, target.repository, target.token); } + catch { /* A failed read cannot establish profile freshness. */ } + if (!fresh || !setupRunnerProfileIsFresh(configuration.runners, fresh)) { + throw new ApplicationError('configuration.invalid', 'The runner registry changed or is unavailable. No permission probes or installation writes started; review a fresh profile snapshot.'); + } + } const audit = this.dependencies.onPermissionCleanupPending ? await this.dependencies.finalPermissionAudit.audit( configuration, remoteConfiguration, this.dependencies.onPermissionCleanupPending) diff --git a/src/application/usecases/setup/verify_web_setup_apply_use_case.ts b/src/application/usecases/setup/verify_web_setup_apply_use_case.ts index 3e82d0f5a..561442a1e 100644 --- a/src/application/usecases/setup/verify_web_setup_apply_use_case.ts +++ b/src/application/usecases/setup/verify_web_setup_apply_use_case.ts @@ -2,6 +2,7 @@ import type { SetupConfiguration, SetupRemoteConfiguration } from '../../../doma import { ApplicationError } from '../../errors/application_error'; import { SetupInteractionCancelledError } from '../../errors/setup_interaction_cancelled_error'; import { sameSetupRemoteFacts, hasCompleteSetupSecretRevisions } from '../../policies/setup_remote_facts_policy'; +import { setupRunnerProfileIsFresh } from '../../policies/setup_runner_policy'; import type { SetupFinalPermissionAuditPort, SetupRemoteConfigurationReadPort } from '../../ports/setup_wizard_ports'; export interface WebSetupRepositoryFacts { @@ -55,7 +56,7 @@ export class VerifyWebSetupApplyUseCase { if (!hasCompleteSetupSecretRevisions(remote) || !hasCompleteSetupSecretRevisions(request.approvedRemote)) { throw new ApplicationError('configuration.invalid', 'Retained Secret revision metadata could not be verified. No mutation started; restore metadata access and review a fresh plan.'); } - if (!sameSetupRemoteFacts(remote, request.approvedRemote)) { + if (!sameSetupRemoteFacts(remote, request.approvedRemote) || !setupRunnerProfileIsFresh(request.configuration.runners, remote)) { throw new ApplicationError('configuration.invalid', 'GitHub repository facts changed since plan review. No mutation started; restart and review a new plan.'); } const audit = this.ports.onPermissionCleanupPending diff --git a/src/cli/__tests__/setup_batch_adapter.test.ts b/src/cli/__tests__/setup_batch_adapter.test.ts index f3a7c3654..4703cfd40 100644 --- a/src/cli/__tests__/setup_batch_adapter.test.ts +++ b/src/cli/__tests__/setup_batch_adapter.test.ts @@ -110,6 +110,16 @@ describe('terminal batch selection, review and recovery', () => { expect(f.terminal.readSecret).not.toHaveBeenCalled(); expect(f.terminal.readText.mock.calls.filter(([prompt]) => prompt.startsWith('Apply the ready plans?'))).toHaveLength(1); }); + it('prints the actual per-target installation review without logging workflow bodies', async () => { + const f = terminalFixture(); + Object.assign(f.composition.renderer, { review: async () => ({ blockers: [], assets: [], jobs: [], + changes: [{ path: '.github/workflows/copilot_issue.yml', before: null, after: 'private-custom-credential-literal' }] }) }); + const result = await executeSetupBatch(f.input); + expect(result.outcome).toBe('complete'); + const output = jest.mocked(console.log).mock.calls.flat().join('\n'); + expect(output).toContain('Create .github/workflows/copilot_issue.yml'); + expect(output).not.toContain('private-custom-credential-literal'); + }); it('cancels at terminal end-of-input before preparing any target', async () => { const f = terminalFixture(); f.terminal.readText.mockResolvedValueOnce({ kind: 'end-of-input' }); await expect(executeSetupBatch(f.input)).rejects.toBeInstanceOf(SetupInteractionCancelledError); @@ -183,6 +193,21 @@ describe('terminal batch selection, review and recovery', () => { }); }); describe('real batch entrypoint composition with deterministic provider ports', () => { + it('keeps an explicit hosted override for each target instead of replacing it with shared defaults', async () => { + const f = fixture(); const execute = jest.spyOn(SetupWizardUseCase.prototype, 'execute'); + const result = await executeSetupBatch({ ...f.input, overrides: { ...f.input.overrides, runners: { mode: 'hosted' } } }); + expect(result.outcome).toBe('complete'); expect(execute).toHaveBeenCalledTimes(2); + for (const [request] of execute.mock.calls) expect(request.overrides?.runners).toEqual({ mode: 'hosted' }); + }); + it('does not propagate runner defaults from a blocked legacy target without runner settings', async () => { + const f = fixture(); const legacy = createDefaultSetupConfiguration(); delete legacy.runners; + const execute = jest.spyOn(SetupWizardUseCase.prototype, 'execute').mockResolvedValueOnce({ status: 'blocked', configuration: legacy, + reason: 'setup-permissions-unavailable', exitCode: 1, errors: ['Fixture requires attention.'] }); + const result = await executeSetupBatch(f.input); + expect(result.operation.targets[0].status).toBe('blocked'); expect(result.operation.targets[1].status).toBe('waiting-for-merge'); + expect(execute.mock.calls[1][0].overrides?.runners).toEqual({}); + expect(f.writer.pullRequest).toHaveBeenCalledTimes(1); + }); it('handles early progress callbacks without inventing an approved plan or installation', async () => { const f = fixture(); jest.spyOn(SetupBatchSessionUseCase.prototype, 'execute').mockImplementation(async function (this: SetupBatchSessionUseCase) { @@ -298,3 +323,14 @@ describe('real batch entrypoint composition with deterministic provider ports', }); }); + +test('replacement batch PAT links retain the reviewed optional organization runner grant', async () => { + const f = fixture(); f.selection('access'); + await executeSetupBatch({ ...f.input, overrides: { ...f.input.overrides, runners: { discover: true } } }); + const prompt = f.prompts.find(prompt => prompt.kind === 'secret' && prompt.copyId === 'batch.token'); + expect(prompt?.kind).toBe('secret'); + if (prompt?.kind !== 'secret') throw new Error('Expected replacement PAT guide'); + expect(new URL(prompt.link!).searchParams.get('organization_self_hosted_runners')).toBe('read'); + expect(new URL(prompt.link!).searchParams.get('administration')).toBe('read'); + expect(JSON.stringify(f.bridge.snapshot())).not.toContain('replacement-private-token'); +}); diff --git a/src/cli/__tests__/setup_pat_intent_adapter.test.ts b/src/cli/__tests__/setup_pat_intent_adapter.test.ts index e58c3b373..2ce416d82 100644 --- a/src/cli/__tests__/setup_pat_intent_adapter.test.ts +++ b/src/cli/__tests__/setup_pat_intent_adapter.test.ts @@ -17,7 +17,7 @@ function fixture() { scope: 'repository', permission: 'Metadata', level: 'read', applicability: 'required', reason: 'Identify selected targets.', probe: 'metadata' }]; const bridge = new WebSetupBridge('acme/repo'); const ask = jest.spyOn(bridge, 'ask').mockResolvedValue('Continue to GitHub'); - const input = { owner: 'acme', repository: 'repo', overrides: {}, skipRepositoryVariables: false, + const input = { owner: 'acme', repository: 'repo', overrides: { runners: { discover: false } }, skipRepositoryVariables: false, skipRepositorySecrets: false, configurationSource: 'organization' as const, credentialPrompt, permissionPresenter, initialRequirements, bridge }; return { input, credentialPrompt, guide, manual, detailed, ask }; @@ -26,7 +26,7 @@ afterEach(() => jest.restoreAllMocks()); describe('guided existing-organization PAT access review', () => { it('links the reviewed least-privilege grants without collecting configuration or credentials', async () => { const f = fixture(); const result = await collectSetupPatIntent(f.input); - expect(result).toEqual({ requirements: f.input.initialRequirements, assertedOwnerKind: 'Organization' }); + expect(result).toEqual({ requirements: f.input.initialRequirements, runnerDiscovery: false, assertedOwnerKind: 'Organization' }); const url = new URL(f.guide.mock.calls[0][0]); expect(Object.fromEntries(url.searchParams)).toMatchObject({ target_name: 'acme', expires_in: '1', metadata: 'read' }); expect(f.ask).toHaveBeenCalledTimes(1); expect(f.ask).toHaveBeenCalledWith(expect.objectContaining({ copyId: 'setup.reusePatReview' })); @@ -45,7 +45,7 @@ describe('guided existing-organization PAT access review', () => { }); it('retains the manual choice without inventing an owner assertion', async () => { const f = fixture(); f.ask.mockResolvedValue('Enter a PAT manually'); - expect(await collectSetupPatIntent(f.input)).toEqual({ requirements: f.input.initialRequirements }); + expect(await collectSetupPatIntent(f.input)).toEqual({ requirements: f.input.initialRequirements, runnerDiscovery: false }); expect(f.manual).toHaveBeenCalledTimes(1); expect(f.guide).not.toHaveBeenCalled(); }); it('keeps browser cancellation distinct from manual entry', async () => { @@ -78,3 +78,32 @@ describe('guided existing-organization PAT access review', () => { expect(f.manual).not.toHaveBeenCalled(); expect(f.guide).not.toHaveBeenCalled(); }); }); + + +test.each(['organization', 'customize'] as const)('guided %s batch access asks runner discovery before generating the PAT link', async configurationSource => { + const f = fixture(); + f.ask.mockImplementation(async prompt => prompt.kind === 'question' ? 'true' : 'Continue to GitHub'); + const result = await collectSetupPatIntent({ ...f.input, overrides: {}, configurationSource, deliveryMode: 'pull-request' }); + expect(result.runnerDiscovery).toBe(true); + expect(new URL(f.guide.mock.calls[0][0]).searchParams.get('organization_self_hosted_runners')).toBe('read'); + expect(new URL(f.guide.mock.calls[0][0]).searchParams.get('administration')).toBe('read'); + expect(f.ask.mock.calls[0][0]).toMatchObject({ kind: 'question', phase: 'permission-intent', question: { id: 'runners.discover' } }); + expect(f.ask.mock.calls[1][0]).toMatchObject({ copyId: 'setup.reusePatReview' }); +}); + +test('canceling runner discovery stops before any PAT link or permission review', async () => { + const f = fixture(); f.ask.mockResolvedValue(undefined); + await expect(collectSetupPatIntent({ ...f.input, overrides: {} })).rejects.toBeInstanceOf(SetupTerminalCancelledError); + expect(f.guide).not.toHaveBeenCalled(); expect(f.detailed).not.toHaveBeenCalled(); +}); + +test('the terminal offers the same optional runner grant before organization PAT entry', async () => { + const f = fixture(); + const terminal = { isInteractive: () => true, readText: jest.fn() + .mockResolvedValueOnce({ kind: 'value', value: 'yes' }).mockResolvedValueOnce({ kind: 'value', value: '1' }), + readSecret: jest.fn(), close: jest.fn() }; + const result = await collectSetupPatIntent({ ...f.input, overrides: {}, bridge: undefined, terminal }); + expect(result.runnerDiscovery).toBe(true); + expect(new URL(f.guide.mock.calls[0][0]).searchParams.get('organization_self_hosted_runners')).toBe('read'); + expect(terminal.readSecret).not.toHaveBeenCalled(); +}); diff --git a/src/cli/__tests__/setup_runner_config_file.test.ts b/src/cli/__tests__/setup_runner_config_file.test.ts new file mode 100644 index 000000000..dc6187c4e --- /dev/null +++ b/src/cli/__tests__/setup_runner_config_file.test.ts @@ -0,0 +1,52 @@ +import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { tmpdir } from 'node:os'; +import { loadSetupConfigurationOverrides } from '../setup_config_file'; +import { createDefaultSetupConfiguration, mergeSetupConfiguration } from '../../application/policies/setup_configuration_defaults'; +import { validateSetupConfiguration } from '../../application/policies/setup_configuration_validation'; +import { ConsoleSetupQuestionRenderer } from '../setup_question_renderer'; + +describe('runner config files and terminal review', () => { + let directory: string; + beforeEach(() => { directory = mkdtempSync(join(tmpdir(), 'copilot-runner-config-')); }); + afterEach(() => rmSync(directory, { recursive: true, force: true })); + const write = (root: string, value: unknown) => { const path = join(root, 'setup.json'); writeFileSync(path, JSON.stringify({ runners: value })); return path; }; + test('loads manual routing without requiring organization-admin permissions or credentials', () => { + const runners = { discover: true, mode: 'manual-self-hosted', profileId: '', group: 'vypdev', labels: ['self-hosted', 'codex', 'Linux'], validation: 'hosted' }; + const configuration = mergeSetupConfiguration(createDefaultSetupConfiguration(), loadSetupConfigurationOverrides(write(directory, runners))); + expect(configuration.runners).toEqual(runners); expect(validateSetupConfiguration(configuration)).toEqual([]); + }); + test.each([ + false, { command: 'run' }, { mode: 1 }, { profileId: null }, { group: [] }, { validation: true }, + { labels: 'self-hosted' }, { labels: [3] }, { source: false }, { source: { other: 'unsupported' } }, + { source: { scope: 3, value: '{}' } }, { group: `ghp_${'x'.repeat(36)}` }, + ])('rejects unsafe configuration input %#', runners => expect(() => loadSetupConfigurationOverrides(write(directory, runners))).toThrow()); + test('a persisted registry snapshot is accepted only when the resolved profile matches', () => { + const profile = { id: 'shared', group: 'vypdev', labels: ['self-hosted', 'Linux'], validation: 'hosted' }; + const runners = { mode: 'organization-profile', profileId: profile.id, group: profile.group, labels: profile.labels, validation: profile.validation, + source: { scope: 'organization', value: JSON.stringify({ schemaVersion: 1, profiles: [profile] }) } }; + const overrides = loadSetupConfigurationOverrides(write(directory, runners)); + expect(validateSetupConfiguration(mergeSetupConfiguration(createDefaultSetupConfiguration(), overrides))).toEqual([]); + expect(validateSetupConfiguration(mergeSetupConfiguration(createDefaultSetupConfiguration(), { ...overrides, runners: { ...overrides.runners, group: 'other' } }))).toContainEqual(expect.stringContaining('Runner configuration')); + }); + test('terminal guidance shows provenance, groups and capacity without claiming authentication', () => { + const renderer = new ConsoleSetupQuestionRenderer(); + const question = { stateId: 'agent-runtime' as const, id: 'runners.mode', label: 'Runner choice', kind: 'choice' as const, + defaultValue: 'retain', choices: ['retain', 'hosted', 'manual-self-hosted'], runnerRegistryStatus: 'available' as const, runnerRegistryScope: 'organization' as const, + runnerProfiles: [{ id: 'shared', group: '', labels: ['self-hosted', 'Linux'], validation: 'hosted' as const }], + runnerInventory: { status: 'available' as const, groups: [{ name: 'vypdev', access: 'unknown' as const }], candidates: [ + { id: 1, labels: ['self-hosted', 'Linux'], status: 'online' as const, busy: true, access: 'unknown' as const }, + { id: 2, labels: ['self-hosted', 'macOS'], status: 'offline' as const, busy: false, access: 'unknown' as const }, + ] } }; + const output = renderer.renderPrompt(question); + expect(output).toContain('No access is granted'); expect(output).toContain('Observed group vypdev: unknown'); + expect(output).toContain('(labels only)'); expect(output).toContain('busy'); expect(output).toContain('offline'); expect(output).toContain('(organization)'); + expect(renderer.renderPrompt({ ...question, runnerProfiles: undefined, runnerInventory: undefined, runnerRegistryScope: undefined })).toContain('Inventory: unavailable'); + }); + test('the prompt preserves fixed workflow constraints alongside its permission and runner guidance', () => { + const output = new ConsoleSetupQuestionRenderer().renderPrompt({ id: 'features.issues', stateId: 'capabilities', + label: 'Issues', kind: 'boolean', defaultValue: true, fixedWorkflowFeatures: { release: true } }); + expect(output).toContain('Configuration explicitly enables release or hotfix'); + expect(output).toContain('keep Issues enabled'); + }); +}); diff --git a/src/cli/__tests__/web_setup_batch_components.test.ts b/src/cli/__tests__/web_setup_batch_components.test.ts index 0d5ccbf92..ffb9cedaa 100644 --- a/src/cli/__tests__/web_setup_batch_components.test.ts +++ b/src/cli/__tests__/web_setup_batch_components.test.ts @@ -57,10 +57,12 @@ describe('batch selection and reviewed plan UI', () => { test('builds a value-free view with metadata and only safe file content', () => { const configuration = createDefaultSetupConfiguration(); const remote = unavailableSetupRemoteConfiguration(); const plan: SetupBatchPlan = { operationId: batch().operationId, organization: 'acme', targets: [{ configuration, remote, + installationReview: { jobs: [], assets: [], changes: [], blockers: [] }, target: { id: 7, ownerId: 3, owner: 'acme', name: 'repo', defaultBranch: 'master', baseSha: 'a'.repeat(40), private: true, archived: false, disabled: false, canPush: true }, digest: 'b'.repeat(64), files: [], repositoryVariables: [{ name: 'MODEL', value: 'private-configuration' }], grants: [], sharedSnapshot: [], blocked: ['Read access is unavailable.'] }] }; const operation = beginSetupBatchOperation(plan); const view = buildSetupBatchView(plan, operation, 'review', 1); expect(view.targets[0].blockers).toEqual(['Read access is unavailable.']); expect(JSON.stringify(view)).not.toContain('private-configuration'); + expect(view.targets[0].installationReview).toEqual({ jobs: [], assets: [], changes: [], blockers: [] }); expect(() => buildSetupBatchView(plan, { ...operation, targets: [] }, 'review', 1)).toThrow('identity mismatch'); }); }); diff --git a/src/cli/__tests__/web_setup_runner_components.test.ts b/src/cli/__tests__/web_setup_runner_components.test.ts new file mode 100644 index 000000000..36b9a7a6e --- /dev/null +++ b/src/cli/__tests__/web_setup_runner_components.test.ts @@ -0,0 +1,122 @@ +import { useWebSetupRenderer } from '../../../test-support/web-setup-renderer'; +import { runnerText } from '../../../web/src/i18n/runnerCopy'; +import { questionOptionLabel, isQuestionOptionLocalized, suggestedQuestionAnswer } from '../../../web/src/i18n/questionOptions'; +import type { SetupInstallationReview } from '../../domain/setup_runner'; +import { renderSetupInstallationReview } from '../setup_installation_review_presenter'; +import { toWebSetupPlan } from '../web_setup_bridge'; +import { buildSetupPlan } from '../../application/policies/setup_configuration_plan'; +import { createDefaultSetupConfiguration } from '../../application/policies/setup_configuration_defaults'; +import { renderSetupPlan } from '../setup_plan_presenter'; +import { tr } from '../../../web/src/i18n/catalog'; + +const markup = useWebSetupRenderer(); +const review: SetupInstallationReview = { blockers: [], assets: [{ path: '.github/workflows/agent-cli-provisioning.yml', status: 'missing', enabled: false }], + jobs: [{ file: 'copilot_issue.yml', job: 'copilot-issues', role: 'agent', runsOn: { group: 'vypdev', labels: ['self-hosted', 'codex', 'Linux'] }, status: 'pending-capacity', retained: false }], + changes: [{ path: '.copilot/runner-profile.json', before: null, after: '\nruns-on: [self-hosted, Linux]' }] }; +describe('runner routing and parity review UI', () => { + test.each(['en', 'es', 'fr', 'pt'] as const)('%s renders readable pending capacity, routing and complete before/after content', async locale => { + const html = await markup('InstallationReview', { review }, locale); + expect(html).toContain(runnerText('title', locale)); expect(html).toContain(runnerText('pending-capacity', locale)); + expect(html).toContain(runnerText('disabled', locale)); expect(html).toContain(runnerText('before', locale)); expect(html).toContain(runnerText('after', locale)); + expect(html).toContain('vypdev'); expect(html).toContain('self-hosted'); expect(html).toContain('<script>'); expect(html).not.toContain(' +
                                                                                                +

                                                                                                {runnerText('title', $setupLocale)}

                                                                                                +

                                                                                                {runnerText('help', $setupLocale)}

                                                                                                + {#if review.blockers.length}

                                                                                                {runnerText('blockedAction', $setupLocale)}

                                                                                                {runnerText('blockers', $setupLocale)}
                                                                                                  {#each review.blockers as blocker}
                                                                                                • {blocker}
                                                                                                • {/each}
                                                                                                {/if} +
                                                                                                  {#each review.jobs as job}
                                                                                                • + {runnerText(job.role, $setupLocale)} · {runnerText(job.status, $setupLocale)} + {#if job.retained} · {runnerText('retained', $setupLocale)}{/if} +

                                                                                                  {job.file} / {job.job}

                                                                                                  runs-on: {JSON.stringify(job.runsOn)} +
                                                                                                • {/each}
                                                                                                +
                                                                                                {runnerText('assets', $setupLocale)} ({review.assets.length}) +
                                                                                                  {#each review.assets as asset}
                                                                                                • {asset.path}: {runnerText(asset.status, $setupLocale)}{#if !asset.enabled} · {runnerText('disabled', $setupLocale)}{/if}
                                                                                                • {/each}
                                                                                                +
                                                                                                +
                                                                                                {runnerText('changes', $setupLocale)} ({review.changes.length}) +

                                                                                                {runnerText('redactionNotice', $setupLocale)}

                                                                                                + {#each review.changes as change}
                                                                                                {change.path} +

                                                                                                {runnerText('before', $setupLocale)}

                                                                                                {change.before ?? runnerText('absent', $setupLocale)}
                                                                                                +

                                                                                                {runnerText('after', $setupLocale)}

                                                                                                {change.after ?? runnerText('absent', $setupLocale)}
                                                                                                +
                                                                                                {/each} +
                                                                                                +
                                                                                                + diff --git a/web/src/components/PlanPrompt.svelte b/web/src/components/PlanPrompt.svelte index 921b90998..fd3cff10c 100644 --- a/web/src/components/PlanPrompt.svelte +++ b/web/src/components/PlanPrompt.svelte @@ -6,6 +6,7 @@ import { localizedPlanWarning } from '../i18n/planWarningCopy'; import type { SetupQuestion } from '../../../src/application/contracts/web_setup_view'; import PlanDecisionSummary from './PlanDecisionSummary.svelte'; + import InstallationReview from './InstallationReview.svelte'; import WorkflowPatStorageNotice from './WorkflowPatStorageNotice.svelte'; import { permissionName, permissionTerm } from '../i18n/permissionTerms'; export let prompt: Extract; @@ -46,6 +47,7 @@ {/if} +{#if prompt.plan.installationReview}{/if} {#if prompt.plan.workflowPatStorage}{/if} {#if prompt.plan.presentationDefaults.length}

                                                                                                {tr('planBasicDefaultsIntro', $setupLocale)}

                                                                                                @@ -59,5 +61,5 @@
                                                                                                {#each prompt.editGroups as group}{/each}
                                                                                                {/if} -
                                                                                                onSubmit('decline')} disabled={!controller || busy} /> onSubmit('approve')} disabled={!controller || busy} />
                                                                                                +
                                                                                                onSubmit('decline')} disabled={!controller || busy} /> onSubmit('approve')} disabled={!controller || busy || Boolean(prompt.plan.installationReview?.blockers.length)} />
                                                                                                diff --git a/web/src/components/QuestionPrompt.svelte b/web/src/components/QuestionPrompt.svelte index a06d01c1d..61a4757f4 100644 --- a/web/src/components/QuestionPrompt.svelte +++ b/web/src/components/QuestionPrompt.svelte @@ -1,4 +1,5 @@

                                                                                                {explanation?.label ?? prompt.question.label.replace(' (Space toggles, Enter confirms)', '')}

                                                                                                {#if prompt.phase === 'permission-intent'}{tr('permissionPreview', $setupLocale)}{/if}
                                                                                                {#if prompt.progress}

                                                                                                {tr('questionProgress', $setupLocale, { current: String(prompt.progress.groupPosition), total: String(prompt.progress.groupTotal), overall: String(prompt.progress.position), all: String(prompt.progress.total) })}

                                                                                                {/if} @@ -81,6 +77,7 @@ {/if}

                                                                                                {tr('suggested', $setupLocale, { answer: suggestedAnswer })}

                                                                                                {#if prompt.question.suggestionSource}

                                                                                                {tr(prompt.question.suggestionSource === 'github' ? 'sourceGithub' : prompt.question.suggestionSource === 'local' ? 'sourceLocal' : prompt.question.suggestionSource === 'configuration' ? 'sourceConfig' : 'sourceDefault', $setupLocale)}

                                                                                                {/if} +
                                                                                                {#if prompt.canGoBack}{/if} diff --git a/web/src/components/RunnerQuestionDetails.svelte b/web/src/components/RunnerQuestionDetails.svelte new file mode 100644 index 000000000..af5e9f461 --- /dev/null +++ b/web/src/components/RunnerQuestionDetails.svelte @@ -0,0 +1,22 @@ + +{#if question.id.startsWith('runners.') && question.id !== 'runners.discover'} +
                                                                                                +

                                                                                                {runnerText('help', $setupLocale)}

                                                                                                +

                                                                                                {runnerText('registry', $setupLocale)}: {runnerText(question.runnerRegistryStatus ?? 'unavailable', $setupLocale)}{#if question.runnerRegistryScope} ({tr(question.runnerRegistryScope === 'repository' ? 'scopeRepository' : 'scopeOrganization', $setupLocale)}){/if} · {runnerText('inventory', $setupLocale)}: {runnerText(question.runnerInventory?.status ?? 'unavailable', $setupLocale)}

                                                                                                + {#if question.runnerProfiles?.length}
                                                                                                {runnerText('profiles', $setupLocale)} +
                                                                                                  {#each question.runnerProfiles as profile}
                                                                                                • {profile.id}: {profile.group || '—'} · {profile.labels.join(', ')}
                                                                                                • {/each}
                                                                                                +
                                                                                                {/if} + {#if question.runnerInventory}
                                                                                                {runnerText('observed', $setupLocale)} +
                                                                                                  {#each question.runnerInventory.groups as group}
                                                                                                • {group.name}: {runnerText(group.access, $setupLocale)}
                                                                                                • {/each}
                                                                                                +
                                                                                                  {#each question.runnerInventory.candidates.slice(0, 10) as candidate}
                                                                                                • {candidate.labels.join(', ')}
                                                                                                • {/each}
                                                                                                + {#if question.runnerInventory.candidates.length > 10}

                                                                                                {runnerText('limited', $setupLocale)}

                                                                                                {/if} +
                                                                                                {/if} +
                                                                                                +{/if} + diff --git a/web/src/i18n/permissionTerms.ts b/web/src/i18n/permissionTerms.ts index 1ec55979e..c4bb2fbb2 100644 --- a/web/src/i18n/permissionTerms.ts +++ b/web/src/i18n/permissionTerms.ts @@ -8,7 +8,7 @@ export type PermissionTerm = 'repository' | 'organization' | 'read' | 'write' | 'required' | 'conditional' | 'verified' | 'available' | 'missing' | 'unverifiable'; export type PermissionName = 'Metadata' | 'Contents' | 'Secrets' | 'Variables' | 'Issues' | 'Actions' | 'Checks' | 'Administration' | 'Workflows' | 'Issue Types' - | 'Projects' | 'Pull requests' | 'Members'; + | 'Projects' | 'Pull requests' | 'Members' | 'Self-hosted runners'; const names = { en: namesEn, es: namesEs, fr: namesFr, pt: namesPt } as const; diff --git a/web/src/i18n/permissionTerms/en.ts b/web/src/i18n/permissionTerms/en.ts index 5ce0481f5..5c177c05e 100644 --- a/web/src/i18n/permissionTerms/en.ts +++ b/web/src/i18n/permissionTerms/en.ts @@ -1,5 +1,6 @@ import type { PermissionName, PermissionTerm } from '../permissionTerms'; export const namesEn: Readonly> = { + 'Self-hosted runners': "Self-hosted runners", Metadata: 'Metadata', Contents: 'Contents', Secrets: 'Secrets', Variables: 'Variables', Issues: 'Issues', Actions: 'Actions', Checks: 'Checks', Administration: 'Administration', Workflows: 'Workflows', 'Issue Types': 'Issue Types', Projects: 'Projects', 'Pull requests': 'Pull requests', Members: 'Members', }; export const termsEn: Readonly> = { diff --git a/web/src/i18n/permissionTerms/es.ts b/web/src/i18n/permissionTerms/es.ts index d2f84c160..97e5eaac9 100644 --- a/web/src/i18n/permissionTerms/es.ts +++ b/web/src/i18n/permissionTerms/es.ts @@ -1,5 +1,6 @@ import type { PermissionName, PermissionTerm } from '../permissionTerms'; export const namesEs: Readonly> = { + 'Self-hosted runners': "Runners autohospedados", Metadata: 'Metadatos', Contents: 'Contenido', Secrets: 'Secretos', Variables: 'Variables', Issues: 'Incidencias', Actions: 'Acciones', Checks: 'Comprobaciones', Administration: 'Administración', Workflows: 'Flujos de trabajo', 'Issue Types': 'Tipos de incidencia', Projects: 'Proyectos', 'Pull requests': 'Solicitudes de cambio', Members: 'Miembros', }; export const termsEs: Readonly> = { diff --git a/web/src/i18n/permissionTerms/fr.ts b/web/src/i18n/permissionTerms/fr.ts index d2d5bca83..ed63c48df 100644 --- a/web/src/i18n/permissionTerms/fr.ts +++ b/web/src/i18n/permissionTerms/fr.ts @@ -1,5 +1,6 @@ import type { PermissionName, PermissionTerm } from '../permissionTerms'; export const namesFr: Readonly> = { + 'Self-hosted runners': "Runners auto-hébergés", Metadata: 'Métadonnées', Contents: 'Contenu', Secrets: 'Secrets', Variables: 'Variables', Issues: 'Tickets', Actions: 'Actions', Checks: 'Vérifications', Administration: 'Administration', Workflows: 'Flux de travail', 'Issue Types': 'Types de ticket', Projects: 'Projets', 'Pull requests': 'Demandes de tirage', Members: 'Membres', }; export const termsFr: Readonly> = { diff --git a/web/src/i18n/permissionTerms/pt.ts b/web/src/i18n/permissionTerms/pt.ts index 9ef62e248..963b2faf8 100644 --- a/web/src/i18n/permissionTerms/pt.ts +++ b/web/src/i18n/permissionTerms/pt.ts @@ -1,5 +1,6 @@ import type { PermissionName, PermissionTerm } from '../permissionTerms'; export const namesPt: Readonly> = { + 'Self-hosted runners': "Runners autoalojados", Metadata: 'Metadados', Contents: 'Conteúdo', Secrets: 'Segredos', Variables: 'Variáveis', Issues: 'Questões', Actions: 'Ações', Checks: 'Verificações', Administration: 'Administração', Workflows: 'Fluxos de trabalho', 'Issue Types': 'Tipos de questão', Projects: 'Projetos', 'Pull requests': 'Pedidos de alteração', Members: 'Membros', }; export const termsPt: Readonly> = { diff --git a/web/src/i18n/permissions/en.ts b/web/src/i18n/permissions/en.ts index 81e5fec98..dd58460cc 100644 --- a/web/src/i18n/permissions/en.ts +++ b/web/src/i18n/permissions/en.ts @@ -1,5 +1,9 @@ /** Static first-party explanations emitted by the permission policy. */ export const permissionTexts = [ + "Optional runner discovery selected", + "Optional organization runner discovery selected", + "List existing repository self-hosted runners without changing access.", + "List existing eligible runner groups and their runners; manual routing remains available without this grant.", "Create the reviewed installation commit and installer-owned branch.", "Include reviewed workflow files in the installation PR.", "Create the reviewed installation PR without merging it.", diff --git a/web/src/i18n/permissions/es.ts b/web/src/i18n/permissions/es.ts index abb6a901b..1baacb9bc 100644 --- a/web/src/i18n/permissions/es.ts +++ b/web/src/i18n/permissions/es.ts @@ -1,6 +1,10 @@ import type { PermissionText } from './en'; export const permissionCopyEs: Readonly> = { + "Optional runner discovery selected": "Consulta opcional de runners seleccionada", + "Optional organization runner discovery selected": "Consulta opcional de runners de organización seleccionada", + "List existing repository self-hosted runners without changing access.": "Consultar los runners self-hosted existentes del repositorio sin cambiar su acceso.", + "List existing eligible runner groups and their runners; manual routing remains available without this grant.": "Consultar los grupos de runners accesibles y sus runners; la configuración manual sigue disponible sin este permiso.", "Create the reviewed installation commit and installer-owned branch.": "Crear el commit de instalación revisado y la rama del instalador.", "Include reviewed workflow files in the installation PR.": "Incluir los workflows revisados en la PR de instalación.", "Create the reviewed installation PR without merging it.": "Crear la PR de instalación revisada sin fusionarla.", diff --git a/web/src/i18n/permissions/fr.ts b/web/src/i18n/permissions/fr.ts index ab03f4e97..6e82e0292 100644 --- a/web/src/i18n/permissions/fr.ts +++ b/web/src/i18n/permissions/fr.ts @@ -1,6 +1,10 @@ import type { PermissionText } from './en'; export const permissionCopyFr: Readonly> = { + "Optional runner discovery selected": "Consultation facultative des runners sélectionnée", + "Optional organization runner discovery selected": "Consultation facultative des runners de l’organisation sélectionnée", + "List existing repository self-hosted runners without changing access.": "Consulter les runners auto-hébergés existants du dépôt sans modifier leurs accès.", + "List existing eligible runner groups and their runners; manual routing remains available without this grant.": "Consulter les groupes accessibles et leurs runners ; la configuration manuelle reste possible sans ce droit.", "Create the reviewed installation commit and installer-owned branch.": "Créer le commit d’installation validé et la branche de l’installateur.", "Include reviewed workflow files in the installation PR.": "Inclure les workflows validés dans la PR d’installation.", "Create the reviewed installation PR without merging it.": "Créer la PR d’installation validée sans la fusionner.", diff --git a/web/src/i18n/permissions/pt.ts b/web/src/i18n/permissions/pt.ts index 719b1bc60..6c96d4390 100644 --- a/web/src/i18n/permissions/pt.ts +++ b/web/src/i18n/permissions/pt.ts @@ -1,6 +1,10 @@ import type { PermissionText } from './en'; export const permissionCopyPt: Readonly> = { + "Optional runner discovery selected": "Consulta opcional de runners selecionada", + "Optional organization runner discovery selected": "Consulta opcional de runners da organização selecionada", + "List existing repository self-hosted runners without changing access.": "Consultar os runners self-hosted existentes do repositório sem alterar o acesso.", + "List existing eligible runner groups and their runners; manual routing remains available without this grant.": "Consultar os grupos acessíveis e os seus runners; a configuração manual continua disponível sem esta permissão.", "Create the reviewed installation commit and installer-owned branch.": "Criar o commit de instalação revisto e o ramo do instalador.", "Include reviewed workflow files in the installation PR.": "Incluir os workflows revistos na PR de instalação.", "Create the reviewed installation PR without merging it.": "Criar a PR de instalação revista sem a integrar.", diff --git a/web/src/i18n/questionOptions.ts b/web/src/i18n/questionOptions.ts index 76fa16477..ede048a05 100644 --- a/web/src/i18n/questionOptions.ts +++ b/web/src/i18n/questionOptions.ts @@ -1,4 +1,6 @@ -import type { SetupLocale } from './catalog'; +import { tr, type SetupLocale } from './catalog'; +import type { SetupQuestion } from '../../../src/application/contracts/web_setup_view'; +import { runnerText } from './runnerCopy'; import { optionLabelsEs } from './options/es'; import { optionLabelsFr } from './options/fr'; import { optionLabelsPt } from './options/pt'; @@ -8,6 +10,8 @@ const technicalValues = new Set(['codex', 'opencode', 'cursor', 'openai', 'anthr /** Only visible labels change; submit the original option value. */ export function questionOptionLabel(questionId: string, option: string, locale: SetupLocale): string { + if (questionId === 'runners.mode') return runnerText(option, locale); + if (questionId === 'runners.validation') return runnerText(`validation-${option}`, locale); if (locale === 'en' || technicalValues.has(option)) return option; const catalog: Record = catalogs[locale]; if (questionId === 'issueWorkflows.enabled' && option.includes(' — ')) { @@ -21,6 +25,7 @@ export function questionOptionLabel(questionId: string, option: string, locale: } export function isQuestionOptionLocalized(questionId: string, option: string, locale: SetupLocale): boolean { + if (questionId.startsWith('runners.')) return true; if (locale === 'en' || technicalValues.has(option)) return true; if (questionId === 'pullRequestApproval.coverage.checkName') return true; // remote check name if (questionId === 'issueWorkflows.enabled' && option.includes(' — ')) { @@ -31,3 +36,10 @@ export function isQuestionOptionLocalized(questionId: string, option: string, lo } export const optionCatalogs = catalogs; + +export function suggestedQuestionAnswer(question: Omit & { readonly defaultValue?: SetupQuestion['defaultValue'] }, locale: SetupLocale): string { + if (typeof question.defaultValue === 'boolean') return tr(question.defaultValue ? 'yes' : 'no', locale); + if (question.defaultValue === undefined || question.defaultValue === '') return tr('none', locale); + return question.kind === 'choice' || question.kind === 'multi-select' + ? questionOptionLabel(question.id, String(question.defaultValue), locale) : String(question.defaultValue); +} diff --git a/web/src/i18n/runnerCopy.ts b/web/src/i18n/runnerCopy.ts new file mode 100644 index 000000000..449023a65 --- /dev/null +++ b/web/src/i18n/runnerCopy.ts @@ -0,0 +1,16 @@ +import type { SetupLocale } from './catalog'; +const copies: Record> = { + en: { title: 'Runners and installation parity', help: 'Access and capacity are observations. Verify runner authentication separately. Busy/offline waits for capacity; unknown access needs administrator verification. The chosen route never changes automatically.', assets: 'Asset inventory', changes: 'Complete changes (recognized credential formats masked)', redactionNotice: 'Masking covers recognized credential formats. Other hardcoded values can remain visible in these local workflow files; inspect them before sharing the review.', before: 'Before', after: 'After', absent: 'Absent', disabled: 'Disabled', retained: 'Retained', blockers: 'Needs attention', registry: 'Profile registry', inventory: 'Runner discovery', profiles: 'Reusable profiles', observed: 'Observed groups and labels', limited: 'Showing the first 10 runners. Manual entry remains available.', available: 'Available', incomplete: 'Incomplete', missing: 'Missing', invalid: 'Invalid: repair the registry or enter a manual profile', unavailable: 'Unavailable', confirmed: 'Repository access confirmed', unknown: 'Access unverified', ready: 'Available capacity observed', hosted: 'GitHub-hosted', 'pending-capacity': 'Capacity pending: busy or offline', 'access-unknown': 'Access unverified', shared: 'Shared/generated', 'source-only': 'Source extension: retained', customized: 'Customized: review', incompatible: 'Incompatible generator: inspect before replacing', agent: 'Agent jobs', 'credential-health': 'Credential verification', validation: 'Ordinary validation', observer: 'Trusted approval observer', publication: 'Publication', isolated: 'Isolated merge-group check', retain: 'Keep installed routing (recommended)', 'organization-profile': 'Reuse an existing shared profile', 'manual-self-hosted': 'Choose an existing self-hosted runner', 'validation-agent': 'Use the selected agent runner', 'validation-hosted': 'Use GitHub-hosted runners (recommended)' }, + es: { title: 'Runners y paridad de la instalación', help: 'Acceso y capacidad son observaciones. Verifica la autenticación del runner por separado. Ocupado/desconectado espera capacidad; acceso desconocido requiere verificación del administrador. La ruta elegida nunca cambia automáticamente.', assets: 'Inventario de archivos', changes: 'Cambios completos (formatos de credenciales reconocidos ocultos)', redactionNotice: 'Se ocultan los formatos de credenciales reconocidos. Otros valores escritos en los workflows pueden seguir visibles en esta vista local; revísalos antes de compartirla.', before: 'Antes', after: 'Después', absent: 'Ausente', disabled: 'Desactivado', retained: 'Conservado', blockers: 'Requiere atención', registry: 'Registro de perfiles', inventory: 'Descubrimiento de runners', profiles: 'Perfiles reutilizables', observed: 'Grupos y etiquetas observados', limited: 'Se muestran los primeros 10 runners. Sigue disponible la entrada manual.', available: 'Disponible', incomplete: 'Incompleto', missing: 'Ausente', invalid: 'Inválido: corrige el registro o introduce un perfil manual', unavailable: 'No disponible', confirmed: 'Acceso del repositorio confirmado', unknown: 'Acceso sin verificar', ready: 'Capacidad disponible observada', hosted: 'Runners de GitHub', 'pending-capacity': 'Capacidad pendiente: ocupado o desconectado', 'access-unknown': 'Acceso sin verificar', shared: 'Compartido/generado', 'source-only': 'Extensión propia: conservada', customized: 'Personalizado: revisar', incompatible: 'Generador incompatible: revisar antes de sustituir', agent: 'Jobs del agente', 'credential-health': 'Verificación de credenciales', validation: 'Validación ordinaria', observer: 'Observador de aprobación fiable', publication: 'Publicación', isolated: 'Check aislado de la cola de fusión', retain: 'Conservar rutas instaladas (recomendado)', 'organization-profile': 'Reutilizar un perfil compartido existente', 'manual-self-hosted': 'Elegir un runner self-hosted existente', 'validation-agent': 'Usar el runner del agente elegido', 'validation-hosted': 'Usar runners de GitHub (recomendado)' }, + fr: { title: 'Runners et parité de l’installation', help: 'Accès et capacité sont des observations. Vérifiez séparément l’authentification. Occupé/hors ligne attend la capacité ; l’accès inconnu exige une vérification administrateur. La route ne change jamais automatiquement.', assets: 'Inventaire des fichiers', redactionNotice: 'Le masquage couvre les formats de secrets reconnus. D’autres valeurs littérales peuvent rester visibles dans cette vue locale ; vérifiez-les avant de la partager.', changes: 'Modifications complètes (formats d’identifiants reconnus masqués)', before: 'Avant', after: 'Après', absent: 'Absent', disabled: 'Désactivé', retained: 'Conservé', blockers: 'Attention requise', registry: 'Registre des profils', inventory: 'Découverte des runners', profiles: 'Profils réutilisables', observed: 'Groupes et étiquettes observés', limited: 'Les 10 premiers runners sont affichés. La saisie manuelle reste disponible.', available: 'Disponible', incomplete: 'Incomplet', missing: 'Absent', invalid: 'Invalide : corrigez le registre ou saisissez un profil manuel', unavailable: 'Indisponible', confirmed: 'Accès du dépôt confirmé', unknown: 'Accès non vérifié', ready: 'Capacité disponible observée', hosted: 'Runners GitHub', 'pending-capacity': 'Capacité en attente : occupé ou hors ligne', 'access-unknown': 'Accès non vérifié', shared: 'Partagé/généré', 'source-only': 'Extension source conservée', customized: 'Personnalisé : à vérifier', incompatible: 'Générateur incompatible : vérifiez avant remplacement', agent: 'Jobs de l’agent', 'credential-health': 'Vérification des identifiants', validation: 'Validation ordinaire', observer: 'Observateur d’approbation fiable', publication: 'Publication', isolated: 'Vérification isolée de la file de fusion', retain: 'Conserver les routes installées (recommandé)', 'organization-profile': 'Réutiliser un profil partagé existant', 'manual-self-hosted': 'Choisir un runner auto-hébergé existant', 'validation-agent': 'Utiliser le runner de l’agent sélectionné', 'validation-hosted': 'Utiliser GitHub (recommandé)' }, + pt: { title: 'Runners e paridade da instalação', help: 'Acesso e capacidade são observações. Verifique a autenticação separadamente. Ocupado/offline aguarda capacidade; acesso desconhecido exige verificação do administrador. A rota nunca muda automaticamente.', assets: 'Inventário de ficheiros', redactionNotice: 'São ocultados os formatos de credenciais reconhecidos. Outros valores escritos nos workflows podem continuar visíveis nesta vista local; reveja-os antes de a partilhar.', changes: 'Alterações completas (formatos de credenciais reconhecidos ocultos)', before: 'Antes', after: 'Depois', absent: 'Ausente', disabled: 'Desativado', retained: 'Mantido', blockers: 'Requer atenção', registry: 'Registo de perfis', inventory: 'Descoberta de runners', profiles: 'Perfis reutilizáveis', observed: 'Grupos e etiquetas observados', limited: 'São apresentados os primeiros 10 runners. A entrada manual continua disponível.', available: 'Disponível', incomplete: 'Incompleto', missing: 'Ausente', invalid: 'Inválido: corrija o registo ou introduza um perfil manual', unavailable: 'Indisponível', confirmed: 'Acesso do repositório confirmado', unknown: 'Acesso não verificado', ready: 'Capacidade disponível observada', hosted: 'Runners GitHub', 'pending-capacity': 'Capacidade pendente: ocupado ou offline', 'access-unknown': 'Acesso não verificado', shared: 'Partilhado/gerado', 'source-only': 'Extensão própria mantida', customized: 'Personalizado: rever', incompatible: 'Gerador incompatível: reveja antes de substituir', agent: 'Jobs do agente', 'credential-health': 'Verificação de credenciais', validation: 'Validação normal', observer: 'Observador de aprovação fiável', publication: 'Publicação', isolated: 'Verificação isolada da fila de fusão', retain: 'Manter rotas instaladas (recomendado)', 'organization-profile': 'Reutilizar um perfil partilhado existente', 'manual-self-hosted': 'Escolher um runner self-hosted existente', 'validation-agent': 'Usar o runner do agente selecionado', 'validation-hosted': 'Usar GitHub (recomendado)' }, +}; +const blockedActions: Record = { + en: 'This plan cannot be applied. Retain the existing asset or restore it with a compatible generator, then review again. No installation change has been applied. Open the details to identify the affected file.', + es: 'Este plan no se puede aplicar. Conserva el archivo existente o restáuralo con un generador compatible y vuelve a revisar. No se ha aplicado ningún cambio de instalación. Abre los detalles para identificar el archivo afectado.', + fr: 'Ce plan ne peut pas être appliqué. Conservez le fichier existant ou restaurez-le avec un générateur compatible, puis révisez le plan. Aucune modification d’installation n’a été appliquée. Ouvrez les détails pour identifier le fichier concerné.', + pt: 'Este plano não pode ser aplicado. Mantenha o ficheiro existente ou restaure-o com um gerador compatível e reveja o plano. Nenhuma alteração de instalação foi aplicada. Abra os detalhes para identificar o ficheiro afetado.', +}; +export function runnerText(key: string, locale: SetupLocale): string { + return key === 'blockedAction' ? blockedActions[locale] : copies[locale][key] ?? copies.en[key] ?? key; +}