From 9153a55e8aaf351f9a8647f861d8968ad0808339 Mon Sep 17 00:00:00 2001 From: Landon Cox Date: Wed, 26 Aug 2026 14:16:02 -0700 Subject: [PATCH] Generate Apple Container provisioning, images, and MCP transport Layer 1 defined the apple-container contract and failed closed on everything statically knowable. This layer generates the steps that prepare a self-hosted bare-metal Apple Silicon runner, and wires the one transport that had no route into the NIC-less guest. Runtime provisioning -------------------- Four steps now run before AWF, in dependency order, so an unusable host costs seconds rather than a multi-gigabyte pull: 1. Host preflight rejects an ineligible runner: self-hosted provenance, macOS 26+, native arm64 (checked via RUNNER_ARCH *and* uname -m, so a runner registered as ARM64 but executing under Rosetta is caught), kern.hv_support=1, a usable launchd user domain, bash 4+, and a working Docker daemon with Compose. 2. CLI setup verifies a preinstalled `container` CLI inside AWF's validated range (>=0.4.0 <1.0.0). Only when runtime-install is not false does it install the pinned apple/container release, verified by SHA-256 AND by its "Developer ID Installer: Apple Inc. - Containerization" signature before `installer` runs, over non-interactive sudo. No `latest` path, no unsigned fallback, and the post-install version is re-checked against the window. 3. Service start runs `container system start --enable-kernel-install`. The flag is not optional: the default prompts on stdin, and a headless runner would block until the step is cancelled. The known headless launchd failure is detected and reported with the actual remediation rather than an opaque bootstrap error. 4. Image pull populates Apple Container's own store, which `docker pull` cannot reach. Only the agent and appleInit images, always --platform linux/arm64, and only when digest-pinned -- the script re-rejects a floating reference rather than trusting its caller. Docker pre-pulls for Squid, the API proxy and the CLI proxy are untouched. The pinned release is deliberately 0.12.3 rather than the newest one. Every current apple/container release is 1.x, which is outside AWF's contract range: a major bump may relocate the real vminitd inside the init image and boot a guest with no capability relay at all. State is run-scoped under ${RUNNER_TEMP} by default, so nothing an earlier job left on the persistent runner can influence this one. CONTAINER_APP_ROOT is exported so the service, the image pull, AWF and teardown all address the same store -- a split root would surface as AWF failing to verify an image that had just been pulled. Teardown runs with if: always(), stopping the guest, then the services, then removing run-scoped state, and never rewrites the agent's outcome. MCP gateway transport --------------------- The gateway had no route into the guest. gh-aw runs awmg-mcpg as its own Docker container, every other runtime reaches it through network.topologyAttach, and AWF rejects topologyAttach for a NIC-less guest. gh-aw now publishes the gateway on macOS loopback port 9100 -- bound to 127.0.0.1 only, never 0.0.0.0 -- and declares it to AWF as appleContainer.mcpGatewayUpstreamPort (gh-aw-firewall#7768). AWF health-probes the port, then publishes mcp-gateway.sock into the guest, whose relay serves 127.0.0.1:8080. The generated MCP client config addresses that guest URL. API-key authentication, allowed mount roots, safe-output path permissions and containerized GitHub MCP startup are unchanged. Because the guest port is compiled into both halves of AWF's transport contract, a non-default sandbox.mcp.port is now rejected. No topologyAttach, host networking, Compose service, enclave flag or guest Docker socket is introduced. Security review fix: the published host port and the gateway's own port had always been equal, so the Stop MCP Gateway step passed MCP_GATEWAY_PORT and POSTed to localhost:8080 with the gateway API key in an Authorization header. Under apple-container nothing gh-aw owns listens on host 8080, so that request would have handed the credential to whatever local process held the port on a long-lived runner -- silently, because the curl failure is tolerated. The published port is now threaded through as a step output, the stop script targets it and refuses to send the key to a non-numeric port, and check_mcp_servers.sh re-anchors every probe on the caller-supplied origin instead of the port the gateway reports. Teardown additionally refuses to rm -rf any application root containing "..", which closes the one path where an un-normalised operator-supplied root could escape the prefix check. Portability ----------- Generated setup scripts that now have to run on macOS were made BSD- and bash-3.2-safe without changing Linux behaviour: download_docker_images.sh resolves a portable pull deadline instead of requiring GNU timeout, compute_artifact_prefix.sh falls back to shasum, resolve_docker_socket_gid.sh also tries BSD `stat -Lf` so socket group discovery works automatically on a Mac, and the MCP gateway scripts resolve a millisecond clock instead of assuming `date +%s%3N`. install_awf_binary.sh selects and verifies the Darwin arm64 AWF build, skips the Linux-only chroot cleanup on macOS rather than invoking sudo for nothing, and no longer uses the bash-4.4 ${var@Q} expansion. Because the wider script corpus still uses bash 4 features, the preflight gates on bash 4+ rather than letting an unrelated script fail with a syntax error mid-run. Across all 294 compiled workflows the Linux delta is two lines, both semantically identical to what they replace: MCP_GATEWAY_HOST_PORT equals MCP_GATEWAY_PORT everywhere except apple-container. Docs and tests -------------- The agent-runtimes reference gains a full Apple Container section: runner labels and prerequisites, why GitHub-hosted macOS can never work, the capability transport table, provisioning, the APPLE_VMINIT_IMAGE publication dependency, unsupported features, diagnostics and cleanup. Agent-runtime instructions are updated so tools do not emit an invalid configuration. Tests cover setup-step generation and ordering, the version/checksum/signature gates, app-root consistency, the separate image stores in both directions, digest pinning, the MCP endpoint and transport config, shell quoting, and the negative compatibility cases. A wasm-golden fixture pins the generated lock file, and end-to-end compiler tests assert the host bind, the AWF config field, the guest URL, readiness ordering and topology absence. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../apple-container-runtime-provisioning.md | 24 + .github/aw/agent-runtime-instructions.md | 9 +- .github/workflows/ab-testing-advisor.lock.yml | 2 + .github/workflows/ace-editor.lock.yml | 2 + .github/workflows/agent-job-health.lock.yml | 2 + .../agent-performance-analyzer.lock.yml | 2 + .../workflows/agent-persona-explorer.lock.yml | 2 + .../workflows/agentic-token-audit.lock.yml | 2 + .../agentic-token-optimizer.lock.yml | 2 + .../agentic-token-trend-audit.lock.yml | 2 + .github/workflows/ai-moderator.lock.yml | 3 + .../workflows/api-consumption-report.lock.yml | 2 + .github/workflows/approach-validator.lock.yml | 2 + .github/workflows/archie.lock.yml | 2 + .../workflows/architecture-guardian.lock.yml | 2 + ...rchivx-agentic-workflows-analyzer.lock.yml | 2 + .github/workflows/artifacts-summary.lock.yml | 3 + .github/workflows/audit-workflows.lock.yml | 2 + .github/workflows/auto-triage-issues.lock.yml | 2 + .github/workflows/avenger.lock.yml | 2 + .../aw-failure-investigator.lock.yml | 2 + .github/workflows/blog-auditor.lock.yml | 2 + .github/workflows/bot-detection.lock.yml | 2 + .../breaking-change-checker.lock.yml | 2 + .github/workflows/changeset.lock.yml | 3 + .../workflows/chaos-pr-bundle-fuzzer.lock.yml | 2 + .github/workflows/ci-coach.lock.yml | 2 + .github/workflows/ci-doctor.lock.yml | 2 + .../claude-code-user-docs-review.lock.yml | 2 + .../cli-consistency-checker.lock.yml | 2 + .../workflows/cli-version-checker.lock.yml | 2 + .github/workflows/cloclo.lock.yml | 2 + .../workflows/code-scanning-fixer.lock.yml | 2 + .github/workflows/code-simplifier.lock.yml | 2 + .../codex-github-remote-mcp-test.lock.yml | 2 + .../commit-changes-analyzer.lock.yml | 2 + .../constraint-solving-potd.lock.yml | 2 + .github/workflows/contribution-check.lock.yml | 2 + .../workflows/copilot-agent-analysis.lock.yml | 2 + .../copilot-centralization-drilldown.lock.yml | 2 + .../copilot-centralization-optimizer.lock.yml | 2 + .../copilot-cli-deep-research.lock.yml | 2 + .github/workflows/copilot-opt.lock.yml | 2 + .../copilot-pr-merged-report.lock.yml | 2 + .../copilot-pr-nlp-analysis.lock.yml | 2 + .../copilot-pr-prompt-analysis.lock.yml | 2 + .../copilot-session-insights.lock.yml | 2 + .github/workflows/craft.lock.yml | 2 + ...daily-action-setup-security-audit.lock.yml | 2 + ...aily-agent-of-the-day-blog-writer.lock.yml | 2 + .../daily-agentrx-trace-optimizer.lock.yml | 2 + .../daily-ambient-context-optimizer.lock.yml | 2 + .../daily-architecture-diagram.lock.yml | 3 + .../workflows/daily-arxiv-researcher.lock.yml | 2 + .../daily-assign-issue-to-user.lock.yml | 2 + ...strostylelite-markdown-spellcheck.lock.yml | 2 + ...daily-aw-cross-repo-compile-check.lock.yml | 2 + ...daily-awf-spec-compiler-surfacing.lock.yml | 2 + .../workflows/daily-byok-ollama-test.lock.yml | 2 + .../daily-cache-strategy-analyzer.lock.yml | 3 + .../daily-caveman-optimizer.lock.yml | 2 + .github/workflows/daily-choice-test.lock.yml | 2 + .../workflows/daily-cli-performance.lock.yml | 3 + .../workflows/daily-cli-tools-tester.lock.yml | 2 + .../workflows/daily-code-debt-aider.lock.yml | 2 + .github/workflows/daily-code-metrics.lock.yml | 2 + .../daily-community-attribution.lock.yml | 2 + .../workflows/daily-compiler-quality.lock.yml | 2 + ...ly-compiler-threat-spec-optimizer.lock.yml | 2 + .../daily-credit-limit-test.lock.yml | 2 + ...ly-dashboard-language-spec-review.lock.yml | 3 + .github/workflows/daily-doc-healer.lock.yml | 2 + .github/workflows/daily-doc-updater.lock.yml | 2 + .../daily-documentation-diagram.lock.yml | 2 + .../daily-elixir-credo-snippet-audit.lock.yml | 2 + .github/workflows/daily-evals-report.lock.yml | 3 + .../daily-experiment-report.lock.yml | 2 + .github/workflows/daily-fact.lock.yml | 3 + .github/workflows/daily-file-diet.lock.yml | 2 + .../workflows/daily-firewall-report.lock.yml | 2 + .../daily-formal-spec-verifier.lock.yml | 2 + .../workflows/daily-function-namer.lock.yml | 2 + .../workflows/daily-geo-optimizer.lock.yml | 2 + .../daily-github-docs-seo-optimizer.lock.yml | 2 + .../daily-go-test-parallelizer.lock.yml | 2 + .../daily-go-test-stubs-aider.lock.yml | 2 + .../daily-graft-intelligence.lock.yml | 2 + ...daily-harness-experiment-proposer.lock.yml | 2 + .github/workflows/daily-hippo-learn.lock.yml | 2 + .../workflows/daily-issues-report.lock.yml | 2 + .../daily-malicious-code-scan.lock.yml | 2 + .../daily-max-ai-credits-test.lock.yml | 2 + .../daily-mcp-concurrency-analysis.lock.yml | 2 + .../workflows/daily-model-inventory.lock.yml | 2 + .../workflows/daily-model-resolution.lock.yml | 2 + .../daily-multi-device-docs-tester.lock.yml | 2 + .github/workflows/daily-news.lock.yml | 2 + .../daily-observability-report.lock.yml | 3 + .../daily-performance-summary.lock.yml | 3 + .../workflows/daily-pr-review-cursor.lock.yml | 2 + .../daily-regression-audit-kiro.lock.yml | 2 + .github/workflows/daily-regulatory.lock.yml | 2 + .../daily-reliability-review.lock.yml | 2 + .../daily-rendering-scripts-verifier.lock.yml | 2 + .../workflows/daily-repo-chronicle.lock.yml | 3 + .../daily-safe-output-integrator.lock.yml | 2 + .../daily-safe-output-optimizer.lock.yml | 2 + .../daily-safe-outputs-conformance.lock.yml | 2 + .../daily-safeoutputs-git-simulator.lock.yml | 2 + .../daily-schema-audit-cursor.lock.yml | 2 + .../workflows/daily-secrets-analysis.lock.yml | 2 + .../daily-security-observability.lock.yml | 2 + .../daily-security-red-team.lock.yml | 2 + .github/workflows/daily-semgrep-scan.lock.yml | 2 + .../daily-spdd-spec-planner.lock.yml | 2 + .../daily-spec-coverage-kiro.lock.yml | 2 + .../daily-spending-forecast.lock.yml | 2 + .../workflows/daily-squid-image-scan.lock.yml | 2 + .github/workflows/daily-storify.lock.yml | 2 + .../daily-syntax-error-quality.lock.yml | 2 + .../daily-team-evolution-insights.lock.yml | 2 + .github/workflows/daily-team-status.lock.yml | 2 + .../daily-testify-uber-super-expert.lock.yml | 2 + .../daily-token-consumption-report.lock.yml | 2 + ...ily-trajectory-grader-implementer.lock.yml | 2 + .../workflows/daily-vulnhunter-scan.lock.yml | 2 + ...dows-terminal-integration-builder.lock.yml | 2 + .../workflows/daily-workflow-updater.lock.yml | 2 + .../workflows/daily-yamllint-fixer.lock.yml | 2 + .../dataflow-pr-discussion-dataset.lock.yml | 2 + .github/workflows/dead-code-remover.lock.yml | 2 + .github/workflows/deep-report.lock.yml | 2 + .../workflows/deepsec-security-scan.lock.yml | 2 + .github/workflows/delight.lock.yml | 2 + .github/workflows/dependabot-burner.lock.yml | 2 + .../workflows/dependabot-go-checker.lock.yml | 2 + .../deployment-incident-monitor.lock.yml | 2 + .../workflows/design-decision-gate.lock.yml | 2 + .../workflows/designer-drift-audit.lock.yml | 2 + .../detection-analysis-report.lock.yml | 2 + .github/workflows/dev-hawk.lock.yml | 2 + .github/workflows/dev.lock.yml | 3 + .../developer-docs-consolidator.lock.yml | 2 + .github/workflows/dictation-prompt.lock.yml | 2 + .github/workflows/docs-noob-tester.lock.yml | 2 + .github/workflows/draft-pr-cleanup.lock.yml | 2 + .../duplicate-code-detector.lock.yml | 3 + .github/workflows/eslint-miner.lock.yml | 2 + .github/workflows/eslint-monster.lock.yml | 2 + .github/workflows/eslint-refiner.lock.yml | 2 + .github/workflows/evoskill-evolver.lock.yml | 2 + .../example-failure-category-filter.lock.yml | 2 + .../example-permissions-warning.lock.yml | 2 + .../example-workflow-analyzer.lock.yml | 2 + .github/workflows/firewall-escape.lock.yml | 2 + .github/workflows/firewall.lock.yml | 2 + .../workflows/front-page-copy-guard.lock.yml | 2 + .../workflows/functional-pragmatist.lock.yml | 2 + .../github-mcp-structural-analysis.lock.yml | 2 + .../github-mcp-tools-report.lock.yml | 2 + .../github-remote-mcp-auth-test.lock.yml | 2 + .../workflows/glossary-maintainer.lock.yml | 2 + .github/workflows/go-fan.lock.yml | 2 + .github/workflows/go-logger.lock.yml | 2 + .../workflows/go-pattern-detector.lock.yml | 2 + .github/workflows/gpclean.lock.yml | 2 + .github/workflows/grumpy-reviewer.lock.yml | 2 + .github/workflows/hippo-embed.lock.yml | 2 + .github/workflows/hourly-ci-cleaner.lock.yml | 2 + .../impeccable-skills-reviewer.lock.yml | 2 + .../workflows/instructions-janitor.lock.yml | 2 + .github/workflows/issue-arborist.lock.yml | 3 + .github/workflows/issue-monster.lock.yml | 3 + .github/workflows/issue-triage-agent.lock.yml | 2 + .github/workflows/jsweep.lock.yml | 2 + .../workflows/layout-spec-maintainer.lock.yml | 2 + .github/workflows/lint-monster.lock.yml | 2 + .github/workflows/linter-miner.lock.yml | 2 + .github/workflows/lockfile-stats.lock.yml | 2 + .../mattpocock-skills-reviewer.lock.yml | 2 + .github/workflows/mcp-inspector.lock.yml | 2 + .github/workflows/mergefest.lock.yml | 2 + .github/workflows/metrics-collector.lock.yml | 2 + .github/workflows/necromancer.lock.yml | 3 + .../workflows/notion-issue-summary.lock.yml | 2 + .../objective-impact-report.lock.yml | 2 + .github/workflows/org-health-report.lock.yml | 2 + .github/workflows/outcome-collector.lock.yml | 2 + .github/workflows/pdf-summary.lock.yml | 2 + .github/workflows/plan.lock.yml | 2 + .github/workflows/poem-bot.lock.yml | 2 + .github/workflows/ponytail-reviewer.lock.yml | 2 + .github/workflows/portfolio-analyst.lock.yml | 2 + .../pr-code-quality-reviewer.lock.yml | 2 + .../workflows/pr-description-caveman.lock.yml | 2 + .../workflows/pr-nitpick-reviewer.lock.yml | 2 + .github/workflows/pr-sous-chef.lock.yml | 2 + .github/workflows/pr-triage-agent.lock.yml | 2 + .../prompt-clustering-analysis.lock.yml | 2 + .github/workflows/purelock.lock.yml | 2 + .github/workflows/python-data-charts.lock.yml | 2 + .github/workflows/q.lock.yml | 2 + .../workflows/refactoring-cadence.lock.yml | 2 + .github/workflows/refiner.lock.yml | 2 + .github/workflows/release.lock.yml | 2 + .../workflows/repo-audit-analyzer.lock.yml | 2 + .github/workflows/repo-tree-map.lock.yml | 2 + .../repository-quality-improver.lock.yml | 2 + .github/workflows/research.lock.yml | 3 + .github/workflows/ruflo-backed-task.lock.yml | 2 + .github/workflows/safe-output-health.lock.yml | 2 + .../schema-consistency-checker.lock.yml | 2 + .../schema-feature-coverage.lock.yml | 2 + .github/workflows/scout.lock.yml | 2 + .../workflows/security-compliance.lock.yml | 2 + .github/workflows/security-review.lock.yml | 2 + .../semantic-function-refactor.lock.yml | 2 + .github/workflows/sergo.lock.yml | 2 + .../sighthound-security-scan.lock.yml | 2 + .github/workflows/skillet.lock.yml | 2 + .../workflows/slide-deck-maintainer.lock.yml | 2 + .../workflows/smoke-agent-all-merged.lock.yml | 2 + .../workflows/smoke-agent-all-none.lock.yml | 2 + .../smoke-agent-public-approved.lock.yml | 2 + .../smoke-agent-public-none.lock.yml | 2 + .../smoke-agent-scoped-approved.lock.yml | 2 + .github/workflows/smoke-aider.lock.yml | 2 + .../workflows/smoke-call-workflow.lock.yml | 3 + .../smoke-checkout-pr-dispatch.lock.yml | 2 + .github/workflows/smoke-ci.lock.yml | 2 + .../smoke-claude-on-copilot.lock.yml | 2 + .github/workflows/smoke-claude.lock.yml | 2 + .github/workflows/smoke-codex.lock.yml | 3 + .../smoke-copilot-aoai-apikey.lock.yml | 2 + .../smoke-copilot-aoai-entra.lock.yml | 2 + .github/workflows/smoke-copilot-arm.lock.yml | 2 + .github/workflows/smoke-copilot-auto.lock.yml | 2 + .github/workflows/smoke-copilot-mai.lock.yml | 2 + .github/workflows/smoke-copilot-sdk.lock.yml | 2 + .../workflows/smoke-copilot-small.lock.yml | 2 + .../smoke-copilot-sub-agents.lock.yml | 2 + .github/workflows/smoke-copilot.lock.yml | 2 + .../smoke-create-cross-repo-pr.lock.yml | 2 + .github/workflows/smoke-crush.lock.yml | 2 + .github/workflows/smoke-cursor.lock.yml | 2 + .../workflows/smoke-deepseek-harness.lock.yml | 2 + .github/workflows/smoke-drive.lock.yml | 3 + .github/workflows/smoke-gemini.lock.yml | 2 + .../workflows/smoke-github-claude.lock.yml | 2 + .github/workflows/smoke-goose.lock.yml | 2 + .github/workflows/smoke-kiro.lock.yml | 2 + .github/workflows/smoke-multi-pr.lock.yml | 2 + .github/workflows/smoke-opencode.lock.yml | 2 + .../workflows/smoke-otel-backends.lock.yml | 3 + .github/workflows/smoke-pi.lock.yml | 2 + .github/workflows/smoke-project.lock.yml | 2 + .github/workflows/smoke-pydantic.lock.yml | 2 + .../workflows/smoke-service-ports.lock.yml | 3 + .github/workflows/smoke-temporary-id.lock.yml | 4 + .github/workflows/smoke-test-tools.lock.yml | 3 + .../smoke-update-cross-repo-pr.lock.yml | 2 + .../smoke-workflow-call-with-inputs.lock.yml | 2 + .../workflows/smoke-workflow-call.lock.yml | 2 + .github/workflows/spec-enforcer.lock.yml | 2 + .github/workflows/spec-extractor.lock.yml | 2 + .github/workflows/spec-librarian.lock.yml | 2 + .github/workflows/squad-game-planner.lock.yml | 2 + .../workflows/squad-implement-worker.lock.yml | 2 + .github/workflows/squad-plan.lock.yml | 2 + .github/workflows/squad.lock.yml | 2 + .github/workflows/stale-pr-cleanup.lock.yml | 2 + .../workflows/stale-repo-identifier.lock.yml | 3 + .../workflows/static-analysis-report.lock.yml | 2 + .../workflows/step-name-alignment.lock.yml | 2 + .github/workflows/sub-issue-closer.lock.yml | 3 + .github/workflows/super-linter.lock.yml | 2 + .../workflows/technical-doc-writer.lock.yml | 2 + .github/workflows/terminal-stylist.lock.yml | 2 + .../workflows/test-quality-sentinel.lock.yml | 2 + .github/workflows/tidy.lock.yml | 2 + .github/workflows/typist.lock.yml | 2 + .../workflows/ubuntu-image-analyzer.lock.yml | 2 + .../uk-ai-operational-resilience.lock.yml | 2 + .github/workflows/unbloat-docs.lock.yml | 2 + .github/workflows/update-astro.lock.yml | 2 + .github/workflows/video-analyzer.lock.yml | 2 + .../visual-regression-checker.lock.yml | 2 + .../weekly-blog-post-writer.lock.yml | 2 + .../weekly-editors-health-check.lock.yml | 2 + .../workflows/weekly-issue-summary.lock.yml | 2 + .../weekly-network-domains-audit.lock.yml | 2 + .../weekly-safe-outputs-spec-review.lock.yml | 2 + .github/workflows/workflow-generator.lock.yml | 2 + .../workflow-health-manager.lock.yml | 2 + .../workflows/workflow-normalizer.lock.yml | 2 + .../workflow-skill-extractor.lock.yml | 2 + Makefile | 1 + .../sh/apple_container_host_preflight.sh | 120 +++ .../setup/sh/apple_container_pull_images.sh | 128 +++ actions/setup/sh/apple_container_setup_cli.sh | 206 +++++ .../sh/apple_container_setup_cli_test.sh | 152 ++++ .../sh/apple_container_start_services.sh | 178 ++++ actions/setup/sh/apple_container_teardown.sh | 113 +++ actions/setup/sh/check_mcp_servers.sh | 41 +- actions/setup/sh/compute_artifact_prefix.sh | 12 +- actions/setup/sh/download_docker_images.sh | 43 +- actions/setup/sh/install_awf_binary.sh | 31 +- actions/setup/sh/resolve_docker_socket_gid.sh | 9 +- actions/setup/sh/start_mcp_gateway.sh | 50 +- actions/setup/sh/stop_mcp_gateway.sh | 25 +- actions/setup/sh/verify_mcp_gateway_health.sh | 24 +- .../content/docs/reference/agent-runtimes.md | 97 ++- pkg/constants/version_constants.go | 69 ++ pkg/workflow/apple_container.go | 70 +- pkg/workflow/apple_container_install.go | 202 +++++ pkg/workflow/apple_container_install_test.go | 337 ++++++++ pkg/workflow/apple_container_mcp_test.go | 332 ++++++++ pkg/workflow/apple_container_test.go | 16 +- pkg/workflow/awf_config.go | 13 + pkg/workflow/awf_config_build.go | 12 +- pkg/workflow/codex_engine.go | 4 + pkg/workflow/compiler_yaml_ai_execution.go | 18 + pkg/workflow/mcp_setup_gateway.go | 30 + pkg/workflow/nodejs.go | 4 + pkg/workflow/sandbox_runtime_profile.go | 11 +- pkg/workflow/sandbox_runtime_profile_test.go | 4 +- pkg/workflow/schemas/awf-config.schema.json | 6 + .../TestWasmGolden_AllEngines/claude.golden | 2 + .../TestWasmGolden_AllEngines/codex.golden | 2 + .../TestWasmGolden_AllEngines/copilot.golden | 2 + .../TestWasmGolden_AllEngines/gemini.golden | 2 + .../TestWasmGolden_AllEngines/pi.golden | 1 + .../apple-container.golden | 793 ++++++++++++++++++ .../basic-copilot.golden | 2 + .../playwright-cli-mode.golden | 2 + .../smoke-copilot.golden | 2 + .../with-imports.golden | 2 + .../wasm_golden/fixtures/apple-container.md | 42 + 338 files changed, 3796 insertions(+), 63 deletions(-) create mode 100644 .changeset/apple-container-runtime-provisioning.md create mode 100644 actions/setup/sh/apple_container_host_preflight.sh create mode 100644 actions/setup/sh/apple_container_pull_images.sh create mode 100644 actions/setup/sh/apple_container_setup_cli.sh create mode 100644 actions/setup/sh/apple_container_setup_cli_test.sh create mode 100644 actions/setup/sh/apple_container_start_services.sh create mode 100644 actions/setup/sh/apple_container_teardown.sh create mode 100644 pkg/workflow/apple_container_install.go create mode 100644 pkg/workflow/apple_container_install_test.go create mode 100644 pkg/workflow/apple_container_mcp_test.go create mode 100644 pkg/workflow/testdata/TestWasmGolden_CompileFixtures/apple-container.golden create mode 100644 pkg/workflow/testdata/wasm_golden/fixtures/apple-container.md diff --git a/.changeset/apple-container-runtime-provisioning.md b/.changeset/apple-container-runtime-provisioning.md new file mode 100644 index 00000000000..23bd3136986 --- /dev/null +++ b/.changeset/apple-container-runtime-provisioning.md @@ -0,0 +1,24 @@ +--- +"gh-aw": minor +--- + +Make the `apple-container` sandbox runtime runnable: generated provisioning, image preparation, MCP gateway transport, and macOS-portable setup scripts (gh-aw-firewall#7764, #7768). + +Layer 1 defined the contract and failed closed on everything statically knowable. This layer generates the steps that actually prepare a self-hosted bare-metal Apple Silicon runner, and wires the one transport that had no route into the NIC-less guest. + +**Runtime provisioning.** Four steps are now generated before AWF runs, in dependency order: + +1. **Host preflight** rejects an ineligible runner before anything is downloaded — self-hosted provenance, macOS 26+, native arm64 (checked via both `RUNNER_ARCH` and `uname -m`, so a runner registered as ARM64 but executing under Rosetta is caught), `kern.hv_support=1`, a usable launchd user domain, bash 4+, and a working Docker daemon with Compose. +2. **CLI setup** verifies a preinstalled `container` CLI inside AWF's validated range (`>=0.4.0 <1.0.0`). Only when `runtime-install` is not `false` does it install the pinned `apple/container` release, verified by SHA-256 **and** by its `Developer ID Installer: Apple Inc. - Containerization` signature before `installer` runs, over non-interactive `sudo`. There is no `latest` path and no unsigned-package path. Note that every current `apple/container` release is 1.x and therefore **outside** AWF's range, so the pin stays on the newest 0.x release: a major bump may relocate the real `vminitd` inside the init image and boot a guest with no capability relay. +3. **Service start** runs `container system start --enable-kernel-install` (the default prompts on stdin and would hang a headless runner), handles the known headless launchd failure with a named, actionable error instead of an opaque bootstrap message, gates on `container system status`, and pins one application root for the job. State is run-scoped under `${RUNNER_TEMP}` by default so nothing an earlier job left on the persistent runner leaks in; `CONTAINER_APP_ROOT` is exported so the service, the image pull, AWF, and teardown all address the same store. +4. **Image pull** populates Apple Container's own image store, which `docker pull` cannot reach. Only the agent and `appleInit` images are pulled, always `--platform linux/arm64`, and only when digest-pinned — the script re-rejects a floating reference rather than trusting its caller. Docker pre-pulls for Squid, the API proxy, and the CLI proxy are unchanged. + +A teardown step runs with `if: always()` after the agent: it stops the guest, stops the system services, and removes run-scoped state, in that order. Diagnostics deliberately exclude `container inspect`, whose output carries `initProcess.environment`. + +**MCP gateway transport.** The gateway had no way into the guest: gh-aw runs `awmg-mcpg` as its own Docker container, every other runtime reaches it via `network.topologyAttach`, and AWF rejects `topologyAttach` for a NIC-less guest. gh-aw now publishes the gateway on macOS loopback port 9100 — bound to `127.0.0.1` only, never `0.0.0.0` — and declares it to AWF as `appleContainer.mcpGatewayUpstreamPort`. AWF health-probes that port and publishes `mcp-gateway.sock` into the guest, whose relay serves it on `127.0.0.1:8080`. The generated MCP client config addresses that guest URL; API-key authentication, allowed mount roots, safe-output path permissions, and the containerized GitHub MCP startup are unchanged. Because the guest port is compiled into both halves of AWF's transport contract, a non-default `sandbox.mcp.port` is now rejected for this runtime. No `topologyAttach`, host networking, Compose service, enclave flag, or guest Docker socket is introduced. + +`sandbox.agent.runtime-install` is now meaningful for `apple-container` and defaults to enabled, matching gVisor and Docker sbx; `runtime-install: false` reduces the CLI step to verification only. + +**Portability.** Generated setup scripts that now have to run on macOS were made BSD/bash-3.2-safe without changing Linux behaviour: `download_docker_images.sh` resolves a portable pull deadline instead of requiring GNU `timeout`, `compute_artifact_prefix.sh` falls back to `shasum`, `resolve_docker_socket_gid.sh` also tries BSD `stat -Lf` so Docker socket group discovery works automatically on a Mac, and the MCP gateway scripts resolve a millisecond clock instead of assuming GNU `date +%s%3N`. `install_awf_binary.sh` selects and verifies the Darwin arm64 AWF build, skips the Linux-only chroot cleanup on macOS rather than invoking `sudo` for nothing, and no longer uses the bash-4.4 `${var@Q}` expansion. The only change to Linux output across all 294 compiled workflows is one new `MCP_GATEWAY_HOST_PORT` export whose value equals the existing `MCP_GATEWAY_PORT`. + +Docs cover the runner labels and prerequisites, the GitHub-hosted macOS impossibility, the capability transport table, the `APPLE_VMINIT_IMAGE` publication dependency, unsupported features, diagnostics, and cleanup. diff --git a/.github/aw/agent-runtime-instructions.md b/.github/aw/agent-runtime-instructions.md index 24dc15a7d22..ca6b5456686 100644 --- a/.github/aw/agent-runtime-instructions.md +++ b/.github/aw/agent-runtime-instructions.md @@ -25,13 +25,16 @@ Use these instructions when creating or updating workflows that mention Docker, - Docker sbx requires KVM and normally does not work on ARC DinD because the sbx daemon must run on the runner host. - Cloud Hypervisor requires `RUNNER_ENVIRONMENT=github-hosted`, Ubuntu Linux x86_64, and `/dev/kvm`; it is not supported on self-hosted or ARC DinD runners. - Apple Container is the inverse: it requires a self-hosted bare-metal Apple Silicon runner and is never valid on a GitHub-hosted `macos-*` label, because those runners are virtual machines without nested virtualization. -- Apple Container rejects host access, `allow-host-ports`, GitHub Actions `services:` port mappings, enclaves, volume mounts, `filesystem.allowWrite`, `ssl_bump`, Vertex AI credential isolation, and `runtime-install`. +- Apple Container rejects host access, `allow-host-ports`, GitHub Actions `services:` port mappings, enclaves, volume mounts, `filesystem.allowWrite`, `ssl_bump`, and Vertex AI credential isolation. +- Apple Container requires the default `sandbox.mcp.port`: AWF's guest relay serves the MCP gateway on a fixed loopback port inside the VM, so any other value is rejected. +- Apple Container requires bash 4+ and Docker on the runner, and an Actions runner installed as a per-user LaunchAgent (`container system start` registers a per-user service). - Apple Container keeps Docker for the AWF infrastructure containers; only the agent workload moves to the Apple Container runtime. ## `runtime-install` -- `sandbox.agent.runtime-install` defaults to `true` for gVisor and Docker sbx provisioning. -- `sandbox.agent.runtime-install` is not valid with `cloud-hypervisor` or `apple-container`. +- `sandbox.agent.runtime-install` defaults to `true` for gVisor, Docker sbx, and Apple Container provisioning. +- `sandbox.agent.runtime-install` is not valid with `cloud-hypervisor`. +- For Apple Container, `runtime-install: false` reduces the CLI step to verifying a preinstalled `container` CLI in AWF's supported range instead of installing the pinned, checksum- and signature-verified release. - Set `runtime-install: false` only when the runner image or pod is pre-provisioned with the runtime and required daemon or policy. - When any imported workflow sets `runtime-install: false`, false wins during import merging. - With `runtime-install: false`, gh-aw skips generated runtime checks and setup, so the runner must already satisfy those prerequisites. diff --git a/.github/workflows/ab-testing-advisor.lock.yml b/.github/workflows/ab-testing-advisor.lock.yml index 3f498ba3519..5883765e573 100644 --- a/.github/workflows/ab-testing-advisor.lock.yml +++ b/.github/workflows/ab-testing-advisor.lock.yml @@ -737,6 +737,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -915,6 +916,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/ace-editor.lock.yml b/.github/workflows/ace-editor.lock.yml index 43a2380de3c..4bd375fe6e4 100644 --- a/.github/workflows/ace-editor.lock.yml +++ b/.github/workflows/ace-editor.lock.yml @@ -681,6 +681,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -899,6 +900,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/agent-job-health.lock.yml b/.github/workflows/agent-job-health.lock.yml index d1a727954d7..c729003e3d3 100644 --- a/.github/workflows/agent-job-health.lock.yml +++ b/.github/workflows/agent-job-health.lock.yml @@ -836,6 +836,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1150,6 +1151,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/agent-performance-analyzer.lock.yml b/.github/workflows/agent-performance-analyzer.lock.yml index 97470fbbedb..299138225bb 100644 --- a/.github/workflows/agent-performance-analyzer.lock.yml +++ b/.github/workflows/agent-performance-analyzer.lock.yml @@ -905,6 +905,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1155,6 +1156,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/agent-persona-explorer.lock.yml b/.github/workflows/agent-persona-explorer.lock.yml index 664c827c1d1..656420c7e4a 100644 --- a/.github/workflows/agent-persona-explorer.lock.yml +++ b/.github/workflows/agent-persona-explorer.lock.yml @@ -819,6 +819,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1016,6 +1017,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/agentic-token-audit.lock.yml b/.github/workflows/agentic-token-audit.lock.yml index cefe55686fd..1533a3ff601 100644 --- a/.github/workflows/agentic-token-audit.lock.yml +++ b/.github/workflows/agentic-token-audit.lock.yml @@ -810,6 +810,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1050,6 +1051,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/agentic-token-optimizer.lock.yml b/.github/workflows/agentic-token-optimizer.lock.yml index 1c50e384267..d63fdd3af3a 100644 --- a/.github/workflows/agentic-token-optimizer.lock.yml +++ b/.github/workflows/agentic-token-optimizer.lock.yml @@ -741,6 +741,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -960,6 +961,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/agentic-token-trend-audit.lock.yml b/.github/workflows/agentic-token-trend-audit.lock.yml index cb63dcd82ae..6a2330891fc 100644 --- a/.github/workflows/agentic-token-trend-audit.lock.yml +++ b/.github/workflows/agentic-token-trend-audit.lock.yml @@ -790,6 +790,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1025,6 +1026,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/ai-moderator.lock.yml b/.github/workflows/ai-moderator.lock.yml index d2d50579a36..aa7d7073aae 100644 --- a/.github/workflows/ai-moderator.lock.yml +++ b/.github/workflows/ai-moderator.lock.yml @@ -812,6 +812,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1054,6 +1055,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1660,6 +1662,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/api-consumption-report.lock.yml b/.github/workflows/api-consumption-report.lock.yml index bc878b86292..65df45bbcd5 100644 --- a/.github/workflows/api-consumption-report.lock.yml +++ b/.github/workflows/api-consumption-report.lock.yml @@ -843,6 +843,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1137,6 +1138,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/approach-validator.lock.yml b/.github/workflows/approach-validator.lock.yml index 2a56f749a5b..b8a71a29632 100644 --- a/.github/workflows/approach-validator.lock.yml +++ b/.github/workflows/approach-validator.lock.yml @@ -856,6 +856,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1141,6 +1142,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/archie.lock.yml b/.github/workflows/archie.lock.yml index 12ebc7b26a3..80896072ea6 100644 --- a/.github/workflows/archie.lock.yml +++ b/.github/workflows/archie.lock.yml @@ -789,6 +789,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1050,6 +1051,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/architecture-guardian.lock.yml b/.github/workflows/architecture-guardian.lock.yml index b8fa1dd87e3..59e51d168be 100644 --- a/.github/workflows/architecture-guardian.lock.yml +++ b/.github/workflows/architecture-guardian.lock.yml @@ -738,6 +738,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -980,6 +981,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/archivx-agentic-workflows-analyzer.lock.yml b/.github/workflows/archivx-agentic-workflows-analyzer.lock.yml index d9779be8f44..9f2a17e9900 100644 --- a/.github/workflows/archivx-agentic-workflows-analyzer.lock.yml +++ b/.github/workflows/archivx-agentic-workflows-analyzer.lock.yml @@ -900,6 +900,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1201,6 +1202,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/artifacts-summary.lock.yml b/.github/workflows/artifacts-summary.lock.yml index 791939877e0..4d751663220 100644 --- a/.github/workflows/artifacts-summary.lock.yml +++ b/.github/workflows/artifacts-summary.lock.yml @@ -699,6 +699,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -946,6 +947,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1827,6 +1829,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/audit-workflows.lock.yml b/.github/workflows/audit-workflows.lock.yml index f463c538cdd..1fe95cd7b1a 100644 --- a/.github/workflows/audit-workflows.lock.yml +++ b/.github/workflows/audit-workflows.lock.yml @@ -916,6 +916,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1210,6 +1211,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/auto-triage-issues.lock.yml b/.github/workflows/auto-triage-issues.lock.yml index 51c4af1bc1b..9b7fed1649b 100644 --- a/.github/workflows/auto-triage-issues.lock.yml +++ b/.github/workflows/auto-triage-issues.lock.yml @@ -782,6 +782,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -960,6 +961,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/avenger.lock.yml b/.github/workflows/avenger.lock.yml index 9863e253c46..271e58c263b 100644 --- a/.github/workflows/avenger.lock.yml +++ b/.github/workflows/avenger.lock.yml @@ -803,6 +803,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1069,6 +1070,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/aw-failure-investigator.lock.yml b/.github/workflows/aw-failure-investigator.lock.yml index 4494aa3481f..d2c30622522 100644 --- a/.github/workflows/aw-failure-investigator.lock.yml +++ b/.github/workflows/aw-failure-investigator.lock.yml @@ -896,6 +896,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1182,6 +1183,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/blog-auditor.lock.yml b/.github/workflows/blog-auditor.lock.yml index 96df2b2c772..5aa90f2730a 100644 --- a/.github/workflows/blog-auditor.lock.yml +++ b/.github/workflows/blog-auditor.lock.yml @@ -786,6 +786,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1091,6 +1092,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/bot-detection.lock.yml b/.github/workflows/bot-detection.lock.yml index 734fe0db914..c609eba21f5 100644 --- a/.github/workflows/bot-detection.lock.yml +++ b/.github/workflows/bot-detection.lock.yml @@ -800,6 +800,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1018,6 +1019,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/breaking-change-checker.lock.yml b/.github/workflows/breaking-change-checker.lock.yml index 10ae4099cb8..07309f37caf 100644 --- a/.github/workflows/breaking-change-checker.lock.yml +++ b/.github/workflows/breaking-change-checker.lock.yml @@ -765,6 +765,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1020,6 +1021,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/changeset.lock.yml b/.github/workflows/changeset.lock.yml index 4a2c4350d99..27987016dac 100644 --- a/.github/workflows/changeset.lock.yml +++ b/.github/workflows/changeset.lock.yml @@ -808,6 +808,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1055,6 +1056,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1940,6 +1942,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/chaos-pr-bundle-fuzzer.lock.yml b/.github/workflows/chaos-pr-bundle-fuzzer.lock.yml index 5078f67aff3..ffd11e5a315 100644 --- a/.github/workflows/chaos-pr-bundle-fuzzer.lock.yml +++ b/.github/workflows/chaos-pr-bundle-fuzzer.lock.yml @@ -750,6 +750,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -928,6 +929,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/ci-coach.lock.yml b/.github/workflows/ci-coach.lock.yml index 46a8d5b5673..8f2dfeaac8c 100644 --- a/.github/workflows/ci-coach.lock.yml +++ b/.github/workflows/ci-coach.lock.yml @@ -857,6 +857,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1087,6 +1088,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/ci-doctor.lock.yml b/.github/workflows/ci-doctor.lock.yml index 963c84621cb..ec60711b04c 100644 --- a/.github/workflows/ci-doctor.lock.yml +++ b/.github/workflows/ci-doctor.lock.yml @@ -942,6 +942,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1214,6 +1215,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/claude-code-user-docs-review.lock.yml b/.github/workflows/claude-code-user-docs-review.lock.yml index c5a51d7be2c..547fa3b83c3 100644 --- a/.github/workflows/claude-code-user-docs-review.lock.yml +++ b/.github/workflows/claude-code-user-docs-review.lock.yml @@ -730,6 +730,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1018,6 +1019,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/cli-consistency-checker.lock.yml b/.github/workflows/cli-consistency-checker.lock.yml index d8d1a555319..2aaf1434ef0 100644 --- a/.github/workflows/cli-consistency-checker.lock.yml +++ b/.github/workflows/cli-consistency-checker.lock.yml @@ -726,6 +726,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -948,6 +949,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/cli-version-checker.lock.yml b/.github/workflows/cli-version-checker.lock.yml index 8ae76615012..2d340fdef0f 100644 --- a/.github/workflows/cli-version-checker.lock.yml +++ b/.github/workflows/cli-version-checker.lock.yml @@ -762,6 +762,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1032,6 +1033,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/cloclo.lock.yml b/.github/workflows/cloclo.lock.yml index 01243798d5c..c1fe5bbaa3c 100644 --- a/.github/workflows/cloclo.lock.yml +++ b/.github/workflows/cloclo.lock.yml @@ -1020,6 +1020,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1362,6 +1363,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/code-scanning-fixer.lock.yml b/.github/workflows/code-scanning-fixer.lock.yml index e50ed828bf4..899197a0819 100644 --- a/.github/workflows/code-scanning-fixer.lock.yml +++ b/.github/workflows/code-scanning-fixer.lock.yml @@ -847,6 +847,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1108,6 +1109,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/code-simplifier.lock.yml b/.github/workflows/code-simplifier.lock.yml index 6a3ba1a8750..3a2c4513821 100644 --- a/.github/workflows/code-simplifier.lock.yml +++ b/.github/workflows/code-simplifier.lock.yml @@ -783,6 +783,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1008,6 +1009,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/codex-github-remote-mcp-test.lock.yml b/.github/workflows/codex-github-remote-mcp-test.lock.yml index 16bee356d0f..a3a6e3ad997 100644 --- a/.github/workflows/codex-github-remote-mcp-test.lock.yml +++ b/.github/workflows/codex-github-remote-mcp-test.lock.yml @@ -650,6 +650,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -895,6 +896,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/commit-changes-analyzer.lock.yml b/.github/workflows/commit-changes-analyzer.lock.yml index e6b40486523..e45bc86077b 100644 --- a/.github/workflows/commit-changes-analyzer.lock.yml +++ b/.github/workflows/commit-changes-analyzer.lock.yml @@ -690,6 +690,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -868,6 +869,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/constraint-solving-potd.lock.yml b/.github/workflows/constraint-solving-potd.lock.yml index a84d04f3f02..77f11222e6b 100644 --- a/.github/workflows/constraint-solving-potd.lock.yml +++ b/.github/workflows/constraint-solving-potd.lock.yml @@ -702,6 +702,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -920,6 +921,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/contribution-check.lock.yml b/.github/workflows/contribution-check.lock.yml index 8a69ffaa6b4..150c6e4295e 100644 --- a/.github/workflows/contribution-check.lock.yml +++ b/.github/workflows/contribution-check.lock.yml @@ -867,6 +867,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1114,6 +1115,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/copilot-agent-analysis.lock.yml b/.github/workflows/copilot-agent-analysis.lock.yml index 48ccedee51a..64596290b66 100644 --- a/.github/workflows/copilot-agent-analysis.lock.yml +++ b/.github/workflows/copilot-agent-analysis.lock.yml @@ -847,6 +847,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1122,6 +1123,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/copilot-centralization-drilldown.lock.yml b/.github/workflows/copilot-centralization-drilldown.lock.yml index 517280d9628..7bdfefe5753 100644 --- a/.github/workflows/copilot-centralization-drilldown.lock.yml +++ b/.github/workflows/copilot-centralization-drilldown.lock.yml @@ -707,6 +707,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -919,6 +920,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/copilot-centralization-optimizer.lock.yml b/.github/workflows/copilot-centralization-optimizer.lock.yml index 5b5c7d0c0e7..9968b5ba23b 100644 --- a/.github/workflows/copilot-centralization-optimizer.lock.yml +++ b/.github/workflows/copilot-centralization-optimizer.lock.yml @@ -751,6 +751,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -963,6 +964,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/copilot-cli-deep-research.lock.yml b/.github/workflows/copilot-cli-deep-research.lock.yml index ddc81338d2c..c51f6a90f84 100644 --- a/.github/workflows/copilot-cli-deep-research.lock.yml +++ b/.github/workflows/copilot-cli-deep-research.lock.yml @@ -734,6 +734,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -965,6 +966,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/copilot-opt.lock.yml b/.github/workflows/copilot-opt.lock.yml index 5d16304b591..622478c2d6f 100644 --- a/.github/workflows/copilot-opt.lock.yml +++ b/.github/workflows/copilot-opt.lock.yml @@ -759,6 +759,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1019,6 +1020,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/copilot-pr-merged-report.lock.yml b/.github/workflows/copilot-pr-merged-report.lock.yml index d7c19ad9f2b..53c6e8e8bbb 100644 --- a/.github/workflows/copilot-pr-merged-report.lock.yml +++ b/.github/workflows/copilot-pr-merged-report.lock.yml @@ -709,6 +709,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -906,6 +907,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/copilot-pr-nlp-analysis.lock.yml b/.github/workflows/copilot-pr-nlp-analysis.lock.yml index 3eb792dd18c..3a47647a854 100644 --- a/.github/workflows/copilot-pr-nlp-analysis.lock.yml +++ b/.github/workflows/copilot-pr-nlp-analysis.lock.yml @@ -827,6 +827,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1053,6 +1054,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/copilot-pr-prompt-analysis.lock.yml b/.github/workflows/copilot-pr-prompt-analysis.lock.yml index 32558b8af3f..c3e23fb164b 100644 --- a/.github/workflows/copilot-pr-prompt-analysis.lock.yml +++ b/.github/workflows/copilot-pr-prompt-analysis.lock.yml @@ -773,6 +773,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -996,6 +997,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/copilot-session-insights.lock.yml b/.github/workflows/copilot-session-insights.lock.yml index cf9e9d844c3..1bb8093ef20 100644 --- a/.github/workflows/copilot-session-insights.lock.yml +++ b/.github/workflows/copilot-session-insights.lock.yml @@ -823,6 +823,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1097,6 +1098,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/craft.lock.yml b/.github/workflows/craft.lock.yml index 87a6474042f..c539c745a5c 100644 --- a/.github/workflows/craft.lock.yml +++ b/.github/workflows/craft.lock.yml @@ -795,6 +795,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1026,6 +1027,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-action-setup-security-audit.lock.yml b/.github/workflows/daily-action-setup-security-audit.lock.yml index 9aa00b78ae6..bf9674ca4a3 100644 --- a/.github/workflows/daily-action-setup-security-audit.lock.yml +++ b/.github/workflows/daily-action-setup-security-audit.lock.yml @@ -754,6 +754,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -988,6 +989,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-agent-of-the-day-blog-writer.lock.yml b/.github/workflows/daily-agent-of-the-day-blog-writer.lock.yml index cd8b3d34923..312be21f3f7 100644 --- a/.github/workflows/daily-agent-of-the-day-blog-writer.lock.yml +++ b/.github/workflows/daily-agent-of-the-day-blog-writer.lock.yml @@ -887,6 +887,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1145,6 +1146,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-agentrx-trace-optimizer.lock.yml b/.github/workflows/daily-agentrx-trace-optimizer.lock.yml index 665a9dc23a1..eae1b45c6f7 100644 --- a/.github/workflows/daily-agentrx-trace-optimizer.lock.yml +++ b/.github/workflows/daily-agentrx-trace-optimizer.lock.yml @@ -896,6 +896,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1185,6 +1186,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-ambient-context-optimizer.lock.yml b/.github/workflows/daily-ambient-context-optimizer.lock.yml index a07c415caf3..e9fdc226487 100644 --- a/.github/workflows/daily-ambient-context-optimizer.lock.yml +++ b/.github/workflows/daily-ambient-context-optimizer.lock.yml @@ -799,6 +799,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1055,6 +1056,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-architecture-diagram.lock.yml b/.github/workflows/daily-architecture-diagram.lock.yml index 9d0bd309127..9d1c4c40a18 100644 --- a/.github/workflows/daily-architecture-diagram.lock.yml +++ b/.github/workflows/daily-architecture-diagram.lock.yml @@ -895,6 +895,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1141,6 +1142,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -2051,6 +2053,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/daily-arxiv-researcher.lock.yml b/.github/workflows/daily-arxiv-researcher.lock.yml index 86a9d1df54b..6f9fa6f4603 100644 --- a/.github/workflows/daily-arxiv-researcher.lock.yml +++ b/.github/workflows/daily-arxiv-researcher.lock.yml @@ -754,6 +754,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1186,6 +1187,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-assign-issue-to-user.lock.yml b/.github/workflows/daily-assign-issue-to-user.lock.yml index 1c446df8670..f46684972ad 100644 --- a/.github/workflows/daily-assign-issue-to-user.lock.yml +++ b/.github/workflows/daily-assign-issue-to-user.lock.yml @@ -766,6 +766,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1002,6 +1003,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-astrostylelite-markdown-spellcheck.lock.yml b/.github/workflows/daily-astrostylelite-markdown-spellcheck.lock.yml index 2b1d5348255..a0c3ffa55bb 100644 --- a/.github/workflows/daily-astrostylelite-markdown-spellcheck.lock.yml +++ b/.github/workflows/daily-astrostylelite-markdown-spellcheck.lock.yml @@ -814,6 +814,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1079,6 +1080,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-aw-cross-repo-compile-check.lock.yml b/.github/workflows/daily-aw-cross-repo-compile-check.lock.yml index a0538d2c236..efa1d21078e 100644 --- a/.github/workflows/daily-aw-cross-repo-compile-check.lock.yml +++ b/.github/workflows/daily-aw-cross-repo-compile-check.lock.yml @@ -767,6 +767,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1042,6 +1043,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml b/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml index 4327765c36e..0666a2df901 100644 --- a/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml +++ b/.github/workflows/daily-awf-spec-compiler-surfacing.lock.yml @@ -757,6 +757,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -940,6 +941,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-byok-ollama-test.lock.yml b/.github/workflows/daily-byok-ollama-test.lock.yml index 1f8f3b3ae02..04417b3eeaf 100644 --- a/.github/workflows/daily-byok-ollama-test.lock.yml +++ b/.github/workflows/daily-byok-ollama-test.lock.yml @@ -723,6 +723,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -936,6 +937,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-cache-strategy-analyzer.lock.yml b/.github/workflows/daily-cache-strategy-analyzer.lock.yml index 9bd58262090..f7c14e8c5cb 100644 --- a/.github/workflows/daily-cache-strategy-analyzer.lock.yml +++ b/.github/workflows/daily-cache-strategy-analyzer.lock.yml @@ -902,6 +902,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1186,6 +1187,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -2082,6 +2084,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/daily-caveman-optimizer.lock.yml b/.github/workflows/daily-caveman-optimizer.lock.yml index f3e32de80ba..38b27be91a2 100644 --- a/.github/workflows/daily-caveman-optimizer.lock.yml +++ b/.github/workflows/daily-caveman-optimizer.lock.yml @@ -848,6 +848,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1124,6 +1125,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-choice-test.lock.yml b/.github/workflows/daily-choice-test.lock.yml index d25141381b1..1dee78c81ed 100644 --- a/.github/workflows/daily-choice-test.lock.yml +++ b/.github/workflows/daily-choice-test.lock.yml @@ -727,6 +727,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -999,6 +1000,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-cli-performance.lock.yml b/.github/workflows/daily-cli-performance.lock.yml index 0b58760a9f5..223dc6ee589 100644 --- a/.github/workflows/daily-cli-performance.lock.yml +++ b/.github/workflows/daily-cli-performance.lock.yml @@ -1008,6 +1008,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1286,6 +1287,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -2176,6 +2178,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/daily-cli-tools-tester.lock.yml b/.github/workflows/daily-cli-tools-tester.lock.yml index 142720c72a6..02e0e153b9e 100644 --- a/.github/workflows/daily-cli-tools-tester.lock.yml +++ b/.github/workflows/daily-cli-tools-tester.lock.yml @@ -789,6 +789,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1026,6 +1027,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-code-debt-aider.lock.yml b/.github/workflows/daily-code-debt-aider.lock.yml index 405fd312d20..a36583d8902 100644 --- a/.github/workflows/daily-code-debt-aider.lock.yml +++ b/.github/workflows/daily-code-debt-aider.lock.yml @@ -740,6 +740,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -966,6 +967,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-code-metrics.lock.yml b/.github/workflows/daily-code-metrics.lock.yml index 5eaf85b5e6f..723132f12e8 100644 --- a/.github/workflows/daily-code-metrics.lock.yml +++ b/.github/workflows/daily-code-metrics.lock.yml @@ -866,6 +866,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1306,6 +1307,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-community-attribution.lock.yml b/.github/workflows/daily-community-attribution.lock.yml index 3c51522162b..7daf28e32b4 100644 --- a/.github/workflows/daily-community-attribution.lock.yml +++ b/.github/workflows/daily-community-attribution.lock.yml @@ -913,6 +913,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1177,6 +1178,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-compiler-quality.lock.yml b/.github/workflows/daily-compiler-quality.lock.yml index 2b726f238e2..c7d76d8c298 100644 --- a/.github/workflows/daily-compiler-quality.lock.yml +++ b/.github/workflows/daily-compiler-quality.lock.yml @@ -804,6 +804,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1110,6 +1111,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-compiler-threat-spec-optimizer.lock.yml b/.github/workflows/daily-compiler-threat-spec-optimizer.lock.yml index ef82225a99a..406f9afcf03 100644 --- a/.github/workflows/daily-compiler-threat-spec-optimizer.lock.yml +++ b/.github/workflows/daily-compiler-threat-spec-optimizer.lock.yml @@ -805,6 +805,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1071,6 +1072,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-credit-limit-test.lock.yml b/.github/workflows/daily-credit-limit-test.lock.yml index 1c1d377ee38..64a82801b81 100644 --- a/.github/workflows/daily-credit-limit-test.lock.yml +++ b/.github/workflows/daily-credit-limit-test.lock.yml @@ -701,6 +701,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -941,6 +942,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-dashboard-language-spec-review.lock.yml b/.github/workflows/daily-dashboard-language-spec-review.lock.yml index d348d342537..f1baae04682 100644 --- a/.github/workflows/daily-dashboard-language-spec-review.lock.yml +++ b/.github/workflows/daily-dashboard-language-spec-review.lock.yml @@ -714,6 +714,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -964,6 +965,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1800,6 +1802,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/daily-doc-healer.lock.yml b/.github/workflows/daily-doc-healer.lock.yml index b9645ba2b61..f2db14bb78b 100644 --- a/.github/workflows/daily-doc-healer.lock.yml +++ b/.github/workflows/daily-doc-healer.lock.yml @@ -921,6 +921,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1229,6 +1230,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-doc-updater.lock.yml b/.github/workflows/daily-doc-updater.lock.yml index b5641b4f2b2..24eb8892c32 100644 --- a/.github/workflows/daily-doc-updater.lock.yml +++ b/.github/workflows/daily-doc-updater.lock.yml @@ -851,6 +851,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1034,6 +1035,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-documentation-diagram.lock.yml b/.github/workflows/daily-documentation-diagram.lock.yml index 25c7f03f89f..bf9d30cb342 100644 --- a/.github/workflows/daily-documentation-diagram.lock.yml +++ b/.github/workflows/daily-documentation-diagram.lock.yml @@ -773,6 +773,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -991,6 +992,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-elixir-credo-snippet-audit.lock.yml b/.github/workflows/daily-elixir-credo-snippet-audit.lock.yml index 9509360758a..a8d88055026 100644 --- a/.github/workflows/daily-elixir-credo-snippet-audit.lock.yml +++ b/.github/workflows/daily-elixir-credo-snippet-audit.lock.yml @@ -779,6 +779,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1045,6 +1046,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-evals-report.lock.yml b/.github/workflows/daily-evals-report.lock.yml index f77875a9ca3..59d4a9ec1eb 100644 --- a/.github/workflows/daily-evals-report.lock.yml +++ b/.github/workflows/daily-evals-report.lock.yml @@ -829,6 +829,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1111,6 +1112,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1971,6 +1973,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/daily-experiment-report.lock.yml b/.github/workflows/daily-experiment-report.lock.yml index 50beb0f989a..766e9a525f7 100644 --- a/.github/workflows/daily-experiment-report.lock.yml +++ b/.github/workflows/daily-experiment-report.lock.yml @@ -832,6 +832,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1058,6 +1059,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-fact.lock.yml b/.github/workflows/daily-fact.lock.yml index e44124d6881..e7eab06406d 100644 --- a/.github/workflows/daily-fact.lock.yml +++ b/.github/workflows/daily-fact.lock.yml @@ -839,6 +839,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1133,6 +1134,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -2026,6 +2028,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/daily-file-diet.lock.yml b/.github/workflows/daily-file-diet.lock.yml index 6072ba14ce8..d360795a4e8 100644 --- a/.github/workflows/daily-file-diet.lock.yml +++ b/.github/workflows/daily-file-diet.lock.yml @@ -754,6 +754,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1050,6 +1051,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-firewall-report.lock.yml b/.github/workflows/daily-firewall-report.lock.yml index dccbac62cfc..7a08d34fd82 100644 --- a/.github/workflows/daily-firewall-report.lock.yml +++ b/.github/workflows/daily-firewall-report.lock.yml @@ -791,6 +791,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1041,6 +1042,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-formal-spec-verifier.lock.yml b/.github/workflows/daily-formal-spec-verifier.lock.yml index f3df9ccdf0e..274a956ff45 100644 --- a/.github/workflows/daily-formal-spec-verifier.lock.yml +++ b/.github/workflows/daily-formal-spec-verifier.lock.yml @@ -766,6 +766,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1021,6 +1022,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-function-namer.lock.yml b/.github/workflows/daily-function-namer.lock.yml index 8efe330b567..a98688599bc 100644 --- a/.github/workflows/daily-function-namer.lock.yml +++ b/.github/workflows/daily-function-namer.lock.yml @@ -765,6 +765,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -974,6 +975,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-geo-optimizer.lock.yml b/.github/workflows/daily-geo-optimizer.lock.yml index d4698b71a71..c7b6eb5f367 100644 --- a/.github/workflows/daily-geo-optimizer.lock.yml +++ b/.github/workflows/daily-geo-optimizer.lock.yml @@ -743,6 +743,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -994,6 +995,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-github-docs-seo-optimizer.lock.yml b/.github/workflows/daily-github-docs-seo-optimizer.lock.yml index 22aeb6438b0..bfb60f3a003 100644 --- a/.github/workflows/daily-github-docs-seo-optimizer.lock.yml +++ b/.github/workflows/daily-github-docs-seo-optimizer.lock.yml @@ -659,6 +659,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -850,6 +851,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-go-test-parallelizer.lock.yml b/.github/workflows/daily-go-test-parallelizer.lock.yml index 88c630a1ed8..d766c1b3a97 100644 --- a/.github/workflows/daily-go-test-parallelizer.lock.yml +++ b/.github/workflows/daily-go-test-parallelizer.lock.yml @@ -769,6 +769,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -981,6 +982,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-go-test-stubs-aider.lock.yml b/.github/workflows/daily-go-test-stubs-aider.lock.yml index 59533a71a3e..a37650abef6 100644 --- a/.github/workflows/daily-go-test-stubs-aider.lock.yml +++ b/.github/workflows/daily-go-test-stubs-aider.lock.yml @@ -740,6 +740,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -966,6 +967,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-graft-intelligence.lock.yml b/.github/workflows/daily-graft-intelligence.lock.yml index a068675e5b6..cc0d07233ce 100644 --- a/.github/workflows/daily-graft-intelligence.lock.yml +++ b/.github/workflows/daily-graft-intelligence.lock.yml @@ -707,6 +707,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -990,6 +991,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-harness-experiment-proposer.lock.yml b/.github/workflows/daily-harness-experiment-proposer.lock.yml index e8d3e22e7f0..e0687fd8652 100644 --- a/.github/workflows/daily-harness-experiment-proposer.lock.yml +++ b/.github/workflows/daily-harness-experiment-proposer.lock.yml @@ -811,6 +811,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1082,6 +1083,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-hippo-learn.lock.yml b/.github/workflows/daily-hippo-learn.lock.yml index dc3fcc730ea..008f369d8fe 100644 --- a/.github/workflows/daily-hippo-learn.lock.yml +++ b/.github/workflows/daily-hippo-learn.lock.yml @@ -854,6 +854,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1047,6 +1048,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-issues-report.lock.yml b/.github/workflows/daily-issues-report.lock.yml index 4f1a9f33258..86840674d2a 100644 --- a/.github/workflows/daily-issues-report.lock.yml +++ b/.github/workflows/daily-issues-report.lock.yml @@ -999,6 +999,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1232,6 +1233,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-malicious-code-scan.lock.yml b/.github/workflows/daily-malicious-code-scan.lock.yml index b225efd0f36..ab33c22dda7 100644 --- a/.github/workflows/daily-malicious-code-scan.lock.yml +++ b/.github/workflows/daily-malicious-code-scan.lock.yml @@ -743,6 +743,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -966,6 +967,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-max-ai-credits-test.lock.yml b/.github/workflows/daily-max-ai-credits-test.lock.yml index 9e683e99b04..4e71617ea78 100644 --- a/.github/workflows/daily-max-ai-credits-test.lock.yml +++ b/.github/workflows/daily-max-ai-credits-test.lock.yml @@ -637,6 +637,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -877,6 +878,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-mcp-concurrency-analysis.lock.yml b/.github/workflows/daily-mcp-concurrency-analysis.lock.yml index 555f1f92104..5dc7afbaf1d 100644 --- a/.github/workflows/daily-mcp-concurrency-analysis.lock.yml +++ b/.github/workflows/daily-mcp-concurrency-analysis.lock.yml @@ -775,6 +775,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1069,6 +1070,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-model-inventory.lock.yml b/.github/workflows/daily-model-inventory.lock.yml index 9966a12aca0..183b9068fc1 100644 --- a/.github/workflows/daily-model-inventory.lock.yml +++ b/.github/workflows/daily-model-inventory.lock.yml @@ -743,6 +743,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -966,6 +967,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-model-resolution.lock.yml b/.github/workflows/daily-model-resolution.lock.yml index 50007a3753a..8d79dbd183b 100644 --- a/.github/workflows/daily-model-resolution.lock.yml +++ b/.github/workflows/daily-model-resolution.lock.yml @@ -751,6 +751,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1001,6 +1002,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-multi-device-docs-tester.lock.yml b/.github/workflows/daily-multi-device-docs-tester.lock.yml index d0b04887571..e5f49f4e501 100644 --- a/.github/workflows/daily-multi-device-docs-tester.lock.yml +++ b/.github/workflows/daily-multi-device-docs-tester.lock.yml @@ -802,6 +802,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -980,6 +981,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-news.lock.yml b/.github/workflows/daily-news.lock.yml index f5e21fb0373..d3ec80892fd 100644 --- a/.github/workflows/daily-news.lock.yml +++ b/.github/workflows/daily-news.lock.yml @@ -926,6 +926,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1128,6 +1129,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-observability-report.lock.yml b/.github/workflows/daily-observability-report.lock.yml index 09871d3723a..d41c19d1e87 100644 --- a/.github/workflows/daily-observability-report.lock.yml +++ b/.github/workflows/daily-observability-report.lock.yml @@ -748,6 +748,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1025,6 +1026,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1880,6 +1882,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/daily-performance-summary.lock.yml b/.github/workflows/daily-performance-summary.lock.yml index 5f62bb2067c..e63e0148493 100644 --- a/.github/workflows/daily-performance-summary.lock.yml +++ b/.github/workflows/daily-performance-summary.lock.yml @@ -1374,6 +1374,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1650,6 +1651,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -2548,6 +2550,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/daily-pr-review-cursor.lock.yml b/.github/workflows/daily-pr-review-cursor.lock.yml index b9651b27b8c..85f3910c71f 100644 --- a/.github/workflows/daily-pr-review-cursor.lock.yml +++ b/.github/workflows/daily-pr-review-cursor.lock.yml @@ -706,6 +706,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -952,6 +953,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-regression-audit-kiro.lock.yml b/.github/workflows/daily-regression-audit-kiro.lock.yml index 17b3dca6eeb..3f1544bbc76 100644 --- a/.github/workflows/daily-regression-audit-kiro.lock.yml +++ b/.github/workflows/daily-regression-audit-kiro.lock.yml @@ -716,6 +716,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -957,6 +958,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-regulatory.lock.yml b/.github/workflows/daily-regulatory.lock.yml index 1df80a64bfd..b6ee9c1da33 100644 --- a/.github/workflows/daily-regulatory.lock.yml +++ b/.github/workflows/daily-regulatory.lock.yml @@ -1314,6 +1314,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1547,6 +1548,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-reliability-review.lock.yml b/.github/workflows/daily-reliability-review.lock.yml index a6555dc8610..39da4efab07 100644 --- a/.github/workflows/daily-reliability-review.lock.yml +++ b/.github/workflows/daily-reliability-review.lock.yml @@ -708,6 +708,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1008,6 +1009,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-rendering-scripts-verifier.lock.yml b/.github/workflows/daily-rendering-scripts-verifier.lock.yml index e2d873435c7..0e3ff209ec9 100644 --- a/.github/workflows/daily-rendering-scripts-verifier.lock.yml +++ b/.github/workflows/daily-rendering-scripts-verifier.lock.yml @@ -861,6 +861,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1194,6 +1195,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-repo-chronicle.lock.yml b/.github/workflows/daily-repo-chronicle.lock.yml index e8d34a3eb42..2794d47e484 100644 --- a/.github/workflows/daily-repo-chronicle.lock.yml +++ b/.github/workflows/daily-repo-chronicle.lock.yml @@ -761,6 +761,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1011,6 +1012,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1897,6 +1899,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/daily-safe-output-integrator.lock.yml b/.github/workflows/daily-safe-output-integrator.lock.yml index d0fd9345deb..783b9e21b25 100644 --- a/.github/workflows/daily-safe-output-integrator.lock.yml +++ b/.github/workflows/daily-safe-output-integrator.lock.yml @@ -771,6 +771,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1002,6 +1003,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-safe-output-optimizer.lock.yml b/.github/workflows/daily-safe-output-optimizer.lock.yml index 2f439acc369..5d6c45acc29 100644 --- a/.github/workflows/daily-safe-output-optimizer.lock.yml +++ b/.github/workflows/daily-safe-output-optimizer.lock.yml @@ -891,6 +891,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1203,6 +1204,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-safe-outputs-conformance.lock.yml b/.github/workflows/daily-safe-outputs-conformance.lock.yml index 36a687e4cd0..c16362727a2 100644 --- a/.github/workflows/daily-safe-outputs-conformance.lock.yml +++ b/.github/workflows/daily-safe-outputs-conformance.lock.yml @@ -735,6 +735,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1001,6 +1002,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-safeoutputs-git-simulator.lock.yml b/.github/workflows/daily-safeoutputs-git-simulator.lock.yml index cf8729fb43f..2d0c00871bb 100644 --- a/.github/workflows/daily-safeoutputs-git-simulator.lock.yml +++ b/.github/workflows/daily-safeoutputs-git-simulator.lock.yml @@ -829,6 +829,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1090,6 +1091,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-schema-audit-cursor.lock.yml b/.github/workflows/daily-schema-audit-cursor.lock.yml index 57283ac0a7a..aef4cab07db 100644 --- a/.github/workflows/daily-schema-audit-cursor.lock.yml +++ b/.github/workflows/daily-schema-audit-cursor.lock.yml @@ -714,6 +714,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -955,6 +956,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-secrets-analysis.lock.yml b/.github/workflows/daily-secrets-analysis.lock.yml index fef28eb56b7..0ca581fa609 100644 --- a/.github/workflows/daily-secrets-analysis.lock.yml +++ b/.github/workflows/daily-secrets-analysis.lock.yml @@ -689,6 +689,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -920,6 +921,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-security-observability.lock.yml b/.github/workflows/daily-security-observability.lock.yml index 098dc1eb722..e231d7d81b5 100644 --- a/.github/workflows/daily-security-observability.lock.yml +++ b/.github/workflows/daily-security-observability.lock.yml @@ -860,6 +860,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1113,6 +1114,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-security-red-team.lock.yml b/.github/workflows/daily-security-red-team.lock.yml index 5acff5411ff..6a7af5c0c90 100644 --- a/.github/workflows/daily-security-red-team.lock.yml +++ b/.github/workflows/daily-security-red-team.lock.yml @@ -777,6 +777,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1077,6 +1078,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-semgrep-scan.lock.yml b/.github/workflows/daily-semgrep-scan.lock.yml index 0b84236ed2c..220c543ae5b 100644 --- a/.github/workflows/daily-semgrep-scan.lock.yml +++ b/.github/workflows/daily-semgrep-scan.lock.yml @@ -750,6 +750,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -969,6 +970,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-spdd-spec-planner.lock.yml b/.github/workflows/daily-spdd-spec-planner.lock.yml index d9eaaa8e933..defe7062dc4 100644 --- a/.github/workflows/daily-spdd-spec-planner.lock.yml +++ b/.github/workflows/daily-spdd-spec-planner.lock.yml @@ -733,6 +733,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -989,6 +990,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-spec-coverage-kiro.lock.yml b/.github/workflows/daily-spec-coverage-kiro.lock.yml index d29c700c752..224bc6273b1 100644 --- a/.github/workflows/daily-spec-coverage-kiro.lock.yml +++ b/.github/workflows/daily-spec-coverage-kiro.lock.yml @@ -715,6 +715,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -955,6 +956,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-spending-forecast.lock.yml b/.github/workflows/daily-spending-forecast.lock.yml index c4c761075d3..27f250b9537 100644 --- a/.github/workflows/daily-spending-forecast.lock.yml +++ b/.github/workflows/daily-spending-forecast.lock.yml @@ -819,6 +819,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1055,6 +1056,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-squid-image-scan.lock.yml b/.github/workflows/daily-squid-image-scan.lock.yml index 4ea4916e0c6..a83486f8312 100644 --- a/.github/workflows/daily-squid-image-scan.lock.yml +++ b/.github/workflows/daily-squid-image-scan.lock.yml @@ -826,6 +826,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1059,6 +1060,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-storify.lock.yml b/.github/workflows/daily-storify.lock.yml index da78a0de17d..7ba1992138a 100644 --- a/.github/workflows/daily-storify.lock.yml +++ b/.github/workflows/daily-storify.lock.yml @@ -804,6 +804,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1051,6 +1052,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-syntax-error-quality.lock.yml b/.github/workflows/daily-syntax-error-quality.lock.yml index 790595ed704..75d0becb56f 100644 --- a/.github/workflows/daily-syntax-error-quality.lock.yml +++ b/.github/workflows/daily-syntax-error-quality.lock.yml @@ -723,6 +723,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -946,6 +947,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-team-evolution-insights.lock.yml b/.github/workflows/daily-team-evolution-insights.lock.yml index 14c2c8ae302..f8fb7b0a088 100644 --- a/.github/workflows/daily-team-evolution-insights.lock.yml +++ b/.github/workflows/daily-team-evolution-insights.lock.yml @@ -771,6 +771,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1148,6 +1149,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-team-status.lock.yml b/.github/workflows/daily-team-status.lock.yml index 805510249f8..356c361ca3c 100644 --- a/.github/workflows/daily-team-status.lock.yml +++ b/.github/workflows/daily-team-status.lock.yml @@ -696,6 +696,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -935,6 +936,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-testify-uber-super-expert.lock.yml b/.github/workflows/daily-testify-uber-super-expert.lock.yml index 26f2f621637..29aed05c19c 100644 --- a/.github/workflows/daily-testify-uber-super-expert.lock.yml +++ b/.github/workflows/daily-testify-uber-super-expert.lock.yml @@ -758,6 +758,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1057,6 +1058,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-token-consumption-report.lock.yml b/.github/workflows/daily-token-consumption-report.lock.yml index 9f2dc2a297b..f36e7591b87 100644 --- a/.github/workflows/daily-token-consumption-report.lock.yml +++ b/.github/workflows/daily-token-consumption-report.lock.yml @@ -810,6 +810,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1187,6 +1188,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-trajectory-grader-implementer.lock.yml b/.github/workflows/daily-trajectory-grader-implementer.lock.yml index d1bc193e266..8d526b4d65c 100644 --- a/.github/workflows/daily-trajectory-grader-implementer.lock.yml +++ b/.github/workflows/daily-trajectory-grader-implementer.lock.yml @@ -735,6 +735,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -982,6 +983,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-vulnhunter-scan.lock.yml b/.github/workflows/daily-vulnhunter-scan.lock.yml index b3be4b735f8..292b36ae656 100644 --- a/.github/workflows/daily-vulnhunter-scan.lock.yml +++ b/.github/workflows/daily-vulnhunter-scan.lock.yml @@ -729,6 +729,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -993,6 +994,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-windows-terminal-integration-builder.lock.yml b/.github/workflows/daily-windows-terminal-integration-builder.lock.yml index 4dd13ec8389..1439bc23787 100644 --- a/.github/workflows/daily-windows-terminal-integration-builder.lock.yml +++ b/.github/workflows/daily-windows-terminal-integration-builder.lock.yml @@ -684,6 +684,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -904,6 +905,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-workflow-updater.lock.yml b/.github/workflows/daily-workflow-updater.lock.yml index 09be21021d7..a6de3e64fe9 100644 --- a/.github/workflows/daily-workflow-updater.lock.yml +++ b/.github/workflows/daily-workflow-updater.lock.yml @@ -737,6 +737,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -968,6 +969,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/daily-yamllint-fixer.lock.yml b/.github/workflows/daily-yamllint-fixer.lock.yml index 4ce8e592487..07feba610c7 100644 --- a/.github/workflows/daily-yamllint-fixer.lock.yml +++ b/.github/workflows/daily-yamllint-fixer.lock.yml @@ -767,6 +767,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1033,6 +1034,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/dataflow-pr-discussion-dataset.lock.yml b/.github/workflows/dataflow-pr-discussion-dataset.lock.yml index 43e5859a9f6..c9fd52a4efd 100644 --- a/.github/workflows/dataflow-pr-discussion-dataset.lock.yml +++ b/.github/workflows/dataflow-pr-discussion-dataset.lock.yml @@ -1089,6 +1089,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1339,6 +1340,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/dead-code-remover.lock.yml b/.github/workflows/dead-code-remover.lock.yml index f26e05b837c..f69917e7065 100644 --- a/.github/workflows/dead-code-remover.lock.yml +++ b/.github/workflows/dead-code-remover.lock.yml @@ -792,6 +792,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1023,6 +1024,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/deep-report.lock.yml b/.github/workflows/deep-report.lock.yml index 293386614f6..217d99c4a8a 100644 --- a/.github/workflows/deep-report.lock.yml +++ b/.github/workflows/deep-report.lock.yml @@ -1424,6 +1424,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1755,6 +1756,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/deepsec-security-scan.lock.yml b/.github/workflows/deepsec-security-scan.lock.yml index 6bcab12cd77..e53022dd136 100644 --- a/.github/workflows/deepsec-security-scan.lock.yml +++ b/.github/workflows/deepsec-security-scan.lock.yml @@ -764,6 +764,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1028,6 +1029,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/delight.lock.yml b/.github/workflows/delight.lock.yml index 1fa0642e8ef..23c4fa48327 100644 --- a/.github/workflows/delight.lock.yml +++ b/.github/workflows/delight.lock.yml @@ -766,6 +766,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1027,6 +1028,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/dependabot-burner.lock.yml b/.github/workflows/dependabot-burner.lock.yml index 8d687b3885d..d2a64a295c7 100644 --- a/.github/workflows/dependabot-burner.lock.yml +++ b/.github/workflows/dependabot-burner.lock.yml @@ -879,6 +879,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1139,6 +1140,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/dependabot-go-checker.lock.yml b/.github/workflows/dependabot-go-checker.lock.yml index 4c0db19030f..4f9771016c5 100644 --- a/.github/workflows/dependabot-go-checker.lock.yml +++ b/.github/workflows/dependabot-go-checker.lock.yml @@ -813,6 +813,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1036,6 +1037,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/deployment-incident-monitor.lock.yml b/.github/workflows/deployment-incident-monitor.lock.yml index 969205cd4e2..542c9ee93bf 100644 --- a/.github/workflows/deployment-incident-monitor.lock.yml +++ b/.github/workflows/deployment-incident-monitor.lock.yml @@ -718,6 +718,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -948,6 +949,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/design-decision-gate.lock.yml b/.github/workflows/design-decision-gate.lock.yml index 6de22d7eb69..07d593ef31f 100644 --- a/.github/workflows/design-decision-gate.lock.yml +++ b/.github/workflows/design-decision-gate.lock.yml @@ -849,6 +849,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1148,6 +1149,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/designer-drift-audit.lock.yml b/.github/workflows/designer-drift-audit.lock.yml index 341ea985dbd..16957c21252 100644 --- a/.github/workflows/designer-drift-audit.lock.yml +++ b/.github/workflows/designer-drift-audit.lock.yml @@ -684,6 +684,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -904,6 +905,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/detection-analysis-report.lock.yml b/.github/workflows/detection-analysis-report.lock.yml index aa2dd1def0b..85270668072 100644 --- a/.github/workflows/detection-analysis-report.lock.yml +++ b/.github/workflows/detection-analysis-report.lock.yml @@ -841,6 +841,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1135,6 +1136,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/dev-hawk.lock.yml b/.github/workflows/dev-hawk.lock.yml index a210b1e343d..f5ed3ac33b0 100644 --- a/.github/workflows/dev-hawk.lock.yml +++ b/.github/workflows/dev-hawk.lock.yml @@ -812,6 +812,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1088,6 +1089,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/dev.lock.yml b/.github/workflows/dev.lock.yml index e94090af203..b23cccdc1e7 100644 --- a/.github/workflows/dev.lock.yml +++ b/.github/workflows/dev.lock.yml @@ -774,6 +774,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1021,6 +1022,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1890,6 +1892,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/developer-docs-consolidator.lock.yml b/.github/workflows/developer-docs-consolidator.lock.yml index 501119f5c8c..67791e1a475 100644 --- a/.github/workflows/developer-docs-consolidator.lock.yml +++ b/.github/workflows/developer-docs-consolidator.lock.yml @@ -850,6 +850,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1185,6 +1186,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/dictation-prompt.lock.yml b/.github/workflows/dictation-prompt.lock.yml index 2e04934a304..c8c1ca0824f 100644 --- a/.github/workflows/dictation-prompt.lock.yml +++ b/.github/workflows/dictation-prompt.lock.yml @@ -738,6 +738,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -969,6 +970,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/docs-noob-tester.lock.yml b/.github/workflows/docs-noob-tester.lock.yml index 7bbd8c8cef7..d9339780efe 100644 --- a/.github/workflows/docs-noob-tester.lock.yml +++ b/.github/workflows/docs-noob-tester.lock.yml @@ -751,6 +751,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -978,6 +979,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/draft-pr-cleanup.lock.yml b/.github/workflows/draft-pr-cleanup.lock.yml index a85d668991f..cea205ff60c 100644 --- a/.github/workflows/draft-pr-cleanup.lock.yml +++ b/.github/workflows/draft-pr-cleanup.lock.yml @@ -738,6 +738,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -988,6 +989,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/duplicate-code-detector.lock.yml b/.github/workflows/duplicate-code-detector.lock.yml index 3c614032bbd..578c250daec 100644 --- a/.github/workflows/duplicate-code-detector.lock.yml +++ b/.github/workflows/duplicate-code-detector.lock.yml @@ -737,6 +737,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1031,6 +1032,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1876,6 +1878,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/eslint-miner.lock.yml b/.github/workflows/eslint-miner.lock.yml index b0fbccb7b18..7ebbdd98d30 100644 --- a/.github/workflows/eslint-miner.lock.yml +++ b/.github/workflows/eslint-miner.lock.yml @@ -756,6 +756,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -982,6 +983,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/eslint-monster.lock.yml b/.github/workflows/eslint-monster.lock.yml index 374e0aaa4d6..d2a2486cf47 100644 --- a/.github/workflows/eslint-monster.lock.yml +++ b/.github/workflows/eslint-monster.lock.yml @@ -870,6 +870,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1048,6 +1049,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/eslint-refiner.lock.yml b/.github/workflows/eslint-refiner.lock.yml index 8e8d73eb713..29b8abb7803 100644 --- a/.github/workflows/eslint-refiner.lock.yml +++ b/.github/workflows/eslint-refiner.lock.yml @@ -767,6 +767,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1051,6 +1052,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/evoskill-evolver.lock.yml b/.github/workflows/evoskill-evolver.lock.yml index b613e36c99e..18037d5f7a5 100644 --- a/.github/workflows/evoskill-evolver.lock.yml +++ b/.github/workflows/evoskill-evolver.lock.yml @@ -744,6 +744,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -997,6 +998,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/example-failure-category-filter.lock.yml b/.github/workflows/example-failure-category-filter.lock.yml index 35fa59c7835..b40d20e65a9 100644 --- a/.github/workflows/example-failure-category-filter.lock.yml +++ b/.github/workflows/example-failure-category-filter.lock.yml @@ -683,6 +683,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -895,6 +896,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/example-permissions-warning.lock.yml b/.github/workflows/example-permissions-warning.lock.yml index 96d24731ec3..8492af78b54 100644 --- a/.github/workflows/example-permissions-warning.lock.yml +++ b/.github/workflows/example-permissions-warning.lock.yml @@ -635,6 +635,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -853,6 +854,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/example-workflow-analyzer.lock.yml b/.github/workflows/example-workflow-analyzer.lock.yml index ec128b92050..60d2861fe05 100644 --- a/.github/workflows/example-workflow-analyzer.lock.yml +++ b/.github/workflows/example-workflow-analyzer.lock.yml @@ -775,6 +775,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1066,6 +1067,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/firewall-escape.lock.yml b/.github/workflows/firewall-escape.lock.yml index 6ef5229d1f0..bea601a3e22 100644 --- a/.github/workflows/firewall-escape.lock.yml +++ b/.github/workflows/firewall-escape.lock.yml @@ -772,6 +772,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1008,6 +1009,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/firewall.lock.yml b/.github/workflows/firewall.lock.yml index fb05eb2cf3a..cb65da78b48 100644 --- a/.github/workflows/firewall.lock.yml +++ b/.github/workflows/firewall.lock.yml @@ -634,6 +634,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -861,6 +862,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/front-page-copy-guard.lock.yml b/.github/workflows/front-page-copy-guard.lock.yml index 26d732766aa..e610598d5f6 100644 --- a/.github/workflows/front-page-copy-guard.lock.yml +++ b/.github/workflows/front-page-copy-guard.lock.yml @@ -717,6 +717,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -944,6 +945,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/functional-pragmatist.lock.yml b/.github/workflows/functional-pragmatist.lock.yml index c1d8a3168d5..e6511152562 100644 --- a/.github/workflows/functional-pragmatist.lock.yml +++ b/.github/workflows/functional-pragmatist.lock.yml @@ -756,6 +756,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -974,6 +975,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/github-mcp-structural-analysis.lock.yml b/.github/workflows/github-mcp-structural-analysis.lock.yml index 25afbd300a0..125ef6dc413 100644 --- a/.github/workflows/github-mcp-structural-analysis.lock.yml +++ b/.github/workflows/github-mcp-structural-analysis.lock.yml @@ -1041,6 +1041,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1330,6 +1331,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/github-mcp-tools-report.lock.yml b/.github/workflows/github-mcp-tools-report.lock.yml index 9bbd30ddd44..26f12f01883 100644 --- a/.github/workflows/github-mcp-tools-report.lock.yml +++ b/.github/workflows/github-mcp-tools-report.lock.yml @@ -820,6 +820,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1089,6 +1090,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/github-remote-mcp-auth-test.lock.yml b/.github/workflows/github-remote-mcp-auth-test.lock.yml index 6689b9a442a..e5cc9b1346c 100644 --- a/.github/workflows/github-remote-mcp-auth-test.lock.yml +++ b/.github/workflows/github-remote-mcp-auth-test.lock.yml @@ -707,6 +707,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -934,6 +935,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/glossary-maintainer.lock.yml b/.github/workflows/glossary-maintainer.lock.yml index 2d8c6a6cd0f..17cb529b8f0 100644 --- a/.github/workflows/glossary-maintainer.lock.yml +++ b/.github/workflows/glossary-maintainer.lock.yml @@ -867,6 +867,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1132,6 +1133,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/go-fan.lock.yml b/.github/workflows/go-fan.lock.yml index 2fa23c56ea2..5f9b50ebc0b 100644 --- a/.github/workflows/go-fan.lock.yml +++ b/.github/workflows/go-fan.lock.yml @@ -784,6 +784,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1126,6 +1127,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/go-logger.lock.yml b/.github/workflows/go-logger.lock.yml index aab2e0c22df..6c3c05a70f7 100644 --- a/.github/workflows/go-logger.lock.yml +++ b/.github/workflows/go-logger.lock.yml @@ -795,6 +795,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1099,6 +1100,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/go-pattern-detector.lock.yml b/.github/workflows/go-pattern-detector.lock.yml index 749662aa40a..b27984ce633 100644 --- a/.github/workflows/go-pattern-detector.lock.yml +++ b/.github/workflows/go-pattern-detector.lock.yml @@ -736,6 +736,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1021,6 +1022,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/gpclean.lock.yml b/.github/workflows/gpclean.lock.yml index 6919e208ba2..a61c61f983e 100644 --- a/.github/workflows/gpclean.lock.yml +++ b/.github/workflows/gpclean.lock.yml @@ -792,6 +792,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1015,6 +1016,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/grumpy-reviewer.lock.yml b/.github/workflows/grumpy-reviewer.lock.yml index dc59b020f8e..9919b917c13 100644 --- a/.github/workflows/grumpy-reviewer.lock.yml +++ b/.github/workflows/grumpy-reviewer.lock.yml @@ -856,6 +856,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1110,6 +1111,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/hippo-embed.lock.yml b/.github/workflows/hippo-embed.lock.yml index 41b731b85ea..1feb9117603 100644 --- a/.github/workflows/hippo-embed.lock.yml +++ b/.github/workflows/hippo-embed.lock.yml @@ -751,6 +751,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -944,6 +945,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/hourly-ci-cleaner.lock.yml b/.github/workflows/hourly-ci-cleaner.lock.yml index e0141e3e4d5..4127e50e860 100644 --- a/.github/workflows/hourly-ci-cleaner.lock.yml +++ b/.github/workflows/hourly-ci-cleaner.lock.yml @@ -801,6 +801,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1067,6 +1068,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/impeccable-skills-reviewer.lock.yml b/.github/workflows/impeccable-skills-reviewer.lock.yml index ec31474d6a7..229569c5ab2 100644 --- a/.github/workflows/impeccable-skills-reviewer.lock.yml +++ b/.github/workflows/impeccable-skills-reviewer.lock.yml @@ -919,6 +919,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1146,6 +1147,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/instructions-janitor.lock.yml b/.github/workflows/instructions-janitor.lock.yml index 6198384b152..5f5a6bc4768 100644 --- a/.github/workflows/instructions-janitor.lock.yml +++ b/.github/workflows/instructions-janitor.lock.yml @@ -774,6 +774,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1077,6 +1078,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/issue-arborist.lock.yml b/.github/workflows/issue-arborist.lock.yml index 6f159641516..d5a32b69b7d 100644 --- a/.github/workflows/issue-arborist.lock.yml +++ b/.github/workflows/issue-arborist.lock.yml @@ -886,6 +886,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1138,6 +1139,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -2004,6 +2006,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/issue-monster.lock.yml b/.github/workflows/issue-monster.lock.yml index a4294fc604c..105c35a6c66 100644 --- a/.github/workflows/issue-monster.lock.yml +++ b/.github/workflows/issue-monster.lock.yml @@ -1269,6 +1269,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1516,6 +1517,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -2367,6 +2369,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/issue-triage-agent.lock.yml b/.github/workflows/issue-triage-agent.lock.yml index 72aaa19a2ce..259460200d8 100644 --- a/.github/workflows/issue-triage-agent.lock.yml +++ b/.github/workflows/issue-triage-agent.lock.yml @@ -899,6 +899,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1120,6 +1121,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/jsweep.lock.yml b/.github/workflows/jsweep.lock.yml index 6a5fa472cb3..a34610ea64e 100644 --- a/.github/workflows/jsweep.lock.yml +++ b/.github/workflows/jsweep.lock.yml @@ -792,6 +792,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1027,6 +1028,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/layout-spec-maintainer.lock.yml b/.github/workflows/layout-spec-maintainer.lock.yml index 282f08532e2..737bd0bcc48 100644 --- a/.github/workflows/layout-spec-maintainer.lock.yml +++ b/.github/workflows/layout-spec-maintainer.lock.yml @@ -754,6 +754,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1024,6 +1025,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/lint-monster.lock.yml b/.github/workflows/lint-monster.lock.yml index 9e8d1850150..bbf212bc4d0 100644 --- a/.github/workflows/lint-monster.lock.yml +++ b/.github/workflows/lint-monster.lock.yml @@ -864,6 +864,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1042,6 +1043,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/linter-miner.lock.yml b/.github/workflows/linter-miner.lock.yml index 929f0bc99cc..9c5f398754b 100644 --- a/.github/workflows/linter-miner.lock.yml +++ b/.github/workflows/linter-miner.lock.yml @@ -814,6 +814,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1084,6 +1085,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/lockfile-stats.lock.yml b/.github/workflows/lockfile-stats.lock.yml index a246818af8e..03272a9b1f9 100644 --- a/.github/workflows/lockfile-stats.lock.yml +++ b/.github/workflows/lockfile-stats.lock.yml @@ -735,6 +735,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1004,6 +1005,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/mattpocock-skills-reviewer.lock.yml b/.github/workflows/mattpocock-skills-reviewer.lock.yml index 118f4dbf835..27bc36ba841 100644 --- a/.github/workflows/mattpocock-skills-reviewer.lock.yml +++ b/.github/workflows/mattpocock-skills-reviewer.lock.yml @@ -1021,6 +1021,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1248,6 +1249,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/mcp-inspector.lock.yml b/.github/workflows/mcp-inspector.lock.yml index 442c0458f36..54bb779da57 100644 --- a/.github/workflows/mcp-inspector.lock.yml +++ b/.github/workflows/mcp-inspector.lock.yml @@ -848,6 +848,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1273,6 +1274,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/mergefest.lock.yml b/.github/workflows/mergefest.lock.yml index 2dceabdafda..df984eb1ab6 100644 --- a/.github/workflows/mergefest.lock.yml +++ b/.github/workflows/mergefest.lock.yml @@ -748,6 +748,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1020,6 +1021,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/metrics-collector.lock.yml b/.github/workflows/metrics-collector.lock.yml index f7b6c3ba7e4..3a5367e0a74 100644 --- a/.github/workflows/metrics-collector.lock.yml +++ b/.github/workflows/metrics-collector.lock.yml @@ -788,6 +788,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1065,6 +1066,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/necromancer.lock.yml b/.github/workflows/necromancer.lock.yml index b5dac771de8..d617070fa59 100644 --- a/.github/workflows/necromancer.lock.yml +++ b/.github/workflows/necromancer.lock.yml @@ -819,6 +819,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1066,6 +1067,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1941,6 +1943,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/notion-issue-summary.lock.yml b/.github/workflows/notion-issue-summary.lock.yml index 80cb58a9645..7e5c4a2d7d7 100644 --- a/.github/workflows/notion-issue-summary.lock.yml +++ b/.github/workflows/notion-issue-summary.lock.yml @@ -642,6 +642,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -860,6 +861,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/objective-impact-report.lock.yml b/.github/workflows/objective-impact-report.lock.yml index cb00dbd47cd..91889a59b36 100644 --- a/.github/workflows/objective-impact-report.lock.yml +++ b/.github/workflows/objective-impact-report.lock.yml @@ -754,6 +754,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -998,6 +999,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/org-health-report.lock.yml b/.github/workflows/org-health-report.lock.yml index 567fb19a36f..9ca3bc85be2 100644 --- a/.github/workflows/org-health-report.lock.yml +++ b/.github/workflows/org-health-report.lock.yml @@ -792,6 +792,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1025,6 +1026,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/outcome-collector.lock.yml b/.github/workflows/outcome-collector.lock.yml index dad36d07c65..87e2736032c 100644 --- a/.github/workflows/outcome-collector.lock.yml +++ b/.github/workflows/outcome-collector.lock.yml @@ -742,6 +742,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -988,6 +989,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/pdf-summary.lock.yml b/.github/workflows/pdf-summary.lock.yml index d1d491619d3..68fc9c14a66 100644 --- a/.github/workflows/pdf-summary.lock.yml +++ b/.github/workflows/pdf-summary.lock.yml @@ -860,6 +860,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1106,6 +1107,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/plan.lock.yml b/.github/workflows/plan.lock.yml index 3a225f44cdc..a4518449154 100644 --- a/.github/workflows/plan.lock.yml +++ b/.github/workflows/plan.lock.yml @@ -855,6 +855,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1104,6 +1105,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/poem-bot.lock.yml b/.github/workflows/poem-bot.lock.yml index d3cece49d71..9e25d1fdb01 100644 --- a/.github/workflows/poem-bot.lock.yml +++ b/.github/workflows/poem-bot.lock.yml @@ -1154,6 +1154,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1338,6 +1339,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/ponytail-reviewer.lock.yml b/.github/workflows/ponytail-reviewer.lock.yml index caab09814fe..e475eb0ea17 100644 --- a/.github/workflows/ponytail-reviewer.lock.yml +++ b/.github/workflows/ponytail-reviewer.lock.yml @@ -921,6 +921,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1175,6 +1176,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/portfolio-analyst.lock.yml b/.github/workflows/portfolio-analyst.lock.yml index 945a8f6ee50..dff842983a2 100644 --- a/.github/workflows/portfolio-analyst.lock.yml +++ b/.github/workflows/portfolio-analyst.lock.yml @@ -789,6 +789,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1147,6 +1148,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/pr-code-quality-reviewer.lock.yml b/.github/workflows/pr-code-quality-reviewer.lock.yml index 0b50e713082..db9e5e07090 100644 --- a/.github/workflows/pr-code-quality-reviewer.lock.yml +++ b/.github/workflows/pr-code-quality-reviewer.lock.yml @@ -924,6 +924,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1102,6 +1103,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/pr-description-caveman.lock.yml b/.github/workflows/pr-description-caveman.lock.yml index 2e3e15b7c2c..9e9c28629f1 100644 --- a/.github/workflows/pr-description-caveman.lock.yml +++ b/.github/workflows/pr-description-caveman.lock.yml @@ -721,6 +721,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -968,6 +969,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/pr-nitpick-reviewer.lock.yml b/.github/workflows/pr-nitpick-reviewer.lock.yml index 5c0b1837f48..ecd174d46eb 100644 --- a/.github/workflows/pr-nitpick-reviewer.lock.yml +++ b/.github/workflows/pr-nitpick-reviewer.lock.yml @@ -883,6 +883,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1113,6 +1114,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/pr-sous-chef.lock.yml b/.github/workflows/pr-sous-chef.lock.yml index cacc3416ff0..df4b1cb4375 100644 --- a/.github/workflows/pr-sous-chef.lock.yml +++ b/.github/workflows/pr-sous-chef.lock.yml @@ -1207,6 +1207,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1385,6 +1386,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/pr-triage-agent.lock.yml b/.github/workflows/pr-triage-agent.lock.yml index 51b6e0ca3c1..5cec6617b17 100644 --- a/.github/workflows/pr-triage-agent.lock.yml +++ b/.github/workflows/pr-triage-agent.lock.yml @@ -1184,6 +1184,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1413,6 +1414,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/prompt-clustering-analysis.lock.yml b/.github/workflows/prompt-clustering-analysis.lock.yml index 4d115baee65..cd5870ef230 100644 --- a/.github/workflows/prompt-clustering-analysis.lock.yml +++ b/.github/workflows/prompt-clustering-analysis.lock.yml @@ -858,6 +858,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1151,6 +1152,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/purelock.lock.yml b/.github/workflows/purelock.lock.yml index 829ab9b511f..290acc7a3bd 100644 --- a/.github/workflows/purelock.lock.yml +++ b/.github/workflows/purelock.lock.yml @@ -843,6 +843,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1094,6 +1095,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/python-data-charts.lock.yml b/.github/workflows/python-data-charts.lock.yml index aa87085fd03..049e2ce658c 100644 --- a/.github/workflows/python-data-charts.lock.yml +++ b/.github/workflows/python-data-charts.lock.yml @@ -839,6 +839,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1118,6 +1119,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/q.lock.yml b/.github/workflows/q.lock.yml index b2cd31c1d18..47bdb974230 100644 --- a/.github/workflows/q.lock.yml +++ b/.github/workflows/q.lock.yml @@ -951,6 +951,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1201,6 +1202,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/refactoring-cadence.lock.yml b/.github/workflows/refactoring-cadence.lock.yml index d6679dc4421..89134b83ee4 100644 --- a/.github/workflows/refactoring-cadence.lock.yml +++ b/.github/workflows/refactoring-cadence.lock.yml @@ -733,6 +733,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -980,6 +981,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/refiner.lock.yml b/.github/workflows/refiner.lock.yml index 25e4c1193c6..3fe3e7d4de7 100644 --- a/.github/workflows/refiner.lock.yml +++ b/.github/workflows/refiner.lock.yml @@ -980,6 +980,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1211,6 +1212,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index 16dfd33f8c3..3e564ac5a60 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -734,6 +734,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -975,6 +976,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/repo-audit-analyzer.lock.yml b/.github/workflows/repo-audit-analyzer.lock.yml index 6a668490009..4886b2324f1 100644 --- a/.github/workflows/repo-audit-analyzer.lock.yml +++ b/.github/workflows/repo-audit-analyzer.lock.yml @@ -735,6 +735,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -958,6 +959,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/repo-tree-map.lock.yml b/.github/workflows/repo-tree-map.lock.yml index 157b2472b95..367c6bb8713 100644 --- a/.github/workflows/repo-tree-map.lock.yml +++ b/.github/workflows/repo-tree-map.lock.yml @@ -708,6 +708,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -954,6 +955,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/repository-quality-improver.lock.yml b/.github/workflows/repository-quality-improver.lock.yml index 0bd4afb2f77..707f022b8da 100644 --- a/.github/workflows/repository-quality-improver.lock.yml +++ b/.github/workflows/repository-quality-improver.lock.yml @@ -728,6 +728,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -954,6 +955,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/research.lock.yml b/.github/workflows/research.lock.yml index 284c1f6acba..e7cf77dce74 100644 --- a/.github/workflows/research.lock.yml +++ b/.github/workflows/research.lock.yml @@ -717,6 +717,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -994,6 +995,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1843,6 +1845,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/ruflo-backed-task.lock.yml b/.github/workflows/ruflo-backed-task.lock.yml index ed3a28da228..59c32177fdb 100644 --- a/.github/workflows/ruflo-backed-task.lock.yml +++ b/.github/workflows/ruflo-backed-task.lock.yml @@ -881,6 +881,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1183,6 +1184,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/safe-output-health.lock.yml b/.github/workflows/safe-output-health.lock.yml index 1c98378fe6f..39a820a5a0d 100644 --- a/.github/workflows/safe-output-health.lock.yml +++ b/.github/workflows/safe-output-health.lock.yml @@ -797,6 +797,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1109,6 +1110,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/schema-consistency-checker.lock.yml b/.github/workflows/schema-consistency-checker.lock.yml index bab36c02c23..5f5bb7e895d 100644 --- a/.github/workflows/schema-consistency-checker.lock.yml +++ b/.github/workflows/schema-consistency-checker.lock.yml @@ -746,6 +746,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -929,6 +930,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/schema-feature-coverage.lock.yml b/.github/workflows/schema-feature-coverage.lock.yml index 382916085ed..3ddc902625e 100644 --- a/.github/workflows/schema-feature-coverage.lock.yml +++ b/.github/workflows/schema-feature-coverage.lock.yml @@ -748,6 +748,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -993,6 +994,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/scout.lock.yml b/.github/workflows/scout.lock.yml index 717ea37f3f1..9703e6293ed 100644 --- a/.github/workflows/scout.lock.yml +++ b/.github/workflows/scout.lock.yml @@ -856,6 +856,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1207,6 +1208,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/security-compliance.lock.yml b/.github/workflows/security-compliance.lock.yml index 7bb2ebc3609..f443171ac2a 100644 --- a/.github/workflows/security-compliance.lock.yml +++ b/.github/workflows/security-compliance.lock.yml @@ -750,6 +750,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -976,6 +977,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/security-review.lock.yml b/.github/workflows/security-review.lock.yml index 8b0c126b1cf..ccb58190d8d 100644 --- a/.github/workflows/security-review.lock.yml +++ b/.github/workflows/security-review.lock.yml @@ -1101,6 +1101,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1353,6 +1354,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/semantic-function-refactor.lock.yml b/.github/workflows/semantic-function-refactor.lock.yml index 91fc37c69c1..673d42a3e3a 100644 --- a/.github/workflows/semantic-function-refactor.lock.yml +++ b/.github/workflows/semantic-function-refactor.lock.yml @@ -776,6 +776,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1098,6 +1099,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/sergo.lock.yml b/.github/workflows/sergo.lock.yml index d7f3eb48c44..a05bc5ba421 100644 --- a/.github/workflows/sergo.lock.yml +++ b/.github/workflows/sergo.lock.yml @@ -784,6 +784,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1105,6 +1106,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/sighthound-security-scan.lock.yml b/.github/workflows/sighthound-security-scan.lock.yml index 4c1adf07262..1e60dbc2936 100644 --- a/.github/workflows/sighthound-security-scan.lock.yml +++ b/.github/workflows/sighthound-security-scan.lock.yml @@ -703,6 +703,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -915,6 +916,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/skillet.lock.yml b/.github/workflows/skillet.lock.yml index f2ef1293d65..49391ba394e 100644 --- a/.github/workflows/skillet.lock.yml +++ b/.github/workflows/skillet.lock.yml @@ -867,6 +867,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1114,6 +1115,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/slide-deck-maintainer.lock.yml b/.github/workflows/slide-deck-maintainer.lock.yml index 066b97c63bb..aa8308c0c47 100644 --- a/.github/workflows/slide-deck-maintainer.lock.yml +++ b/.github/workflows/slide-deck-maintainer.lock.yml @@ -842,6 +842,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1107,6 +1108,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-agent-all-merged.lock.yml b/.github/workflows/smoke-agent-all-merged.lock.yml index 483de0a95bd..512bb9e5470 100644 --- a/.github/workflows/smoke-agent-all-merged.lock.yml +++ b/.github/workflows/smoke-agent-all-merged.lock.yml @@ -799,6 +799,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1066,6 +1067,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-agent-all-none.lock.yml b/.github/workflows/smoke-agent-all-none.lock.yml index 588d2166c99..0436b76ea93 100644 --- a/.github/workflows/smoke-agent-all-none.lock.yml +++ b/.github/workflows/smoke-agent-all-none.lock.yml @@ -797,6 +797,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1061,6 +1062,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-agent-public-approved.lock.yml b/.github/workflows/smoke-agent-public-approved.lock.yml index 4ac4c913b17..a62c70a2130 100644 --- a/.github/workflows/smoke-agent-public-approved.lock.yml +++ b/.github/workflows/smoke-agent-public-approved.lock.yml @@ -847,6 +847,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1115,6 +1116,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-agent-public-none.lock.yml b/.github/workflows/smoke-agent-public-none.lock.yml index 3813aeb312f..5bbbcf1fe9b 100644 --- a/.github/workflows/smoke-agent-public-none.lock.yml +++ b/.github/workflows/smoke-agent-public-none.lock.yml @@ -797,6 +797,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1061,6 +1062,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-agent-scoped-approved.lock.yml b/.github/workflows/smoke-agent-scoped-approved.lock.yml index 161aa1da1e9..5e54a80011b 100644 --- a/.github/workflows/smoke-agent-scoped-approved.lock.yml +++ b/.github/workflows/smoke-agent-scoped-approved.lock.yml @@ -802,6 +802,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1073,6 +1074,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-aider.lock.yml b/.github/workflows/smoke-aider.lock.yml index 5e517c47f0b..62031b376f2 100644 --- a/.github/workflows/smoke-aider.lock.yml +++ b/.github/workflows/smoke-aider.lock.yml @@ -814,6 +814,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1035,6 +1036,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-call-workflow.lock.yml b/.github/workflows/smoke-call-workflow.lock.yml index 4cfdeb7fed7..6bf9f789242 100644 --- a/.github/workflows/smoke-call-workflow.lock.yml +++ b/.github/workflows/smoke-call-workflow.lock.yml @@ -773,6 +773,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1019,6 +1020,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1667,6 +1669,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/smoke-checkout-pr-dispatch.lock.yml b/.github/workflows/smoke-checkout-pr-dispatch.lock.yml index 5a972e779de..d67e97b3102 100644 --- a/.github/workflows/smoke-checkout-pr-dispatch.lock.yml +++ b/.github/workflows/smoke-checkout-pr-dispatch.lock.yml @@ -790,6 +790,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1029,6 +1030,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-ci.lock.yml b/.github/workflows/smoke-ci.lock.yml index a83d3c965a0..b762a39c23d 100644 --- a/.github/workflows/smoke-ci.lock.yml +++ b/.github/workflows/smoke-ci.lock.yml @@ -1034,6 +1034,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1245,6 +1246,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-claude-on-copilot.lock.yml b/.github/workflows/smoke-claude-on-copilot.lock.yml index 2d7f9b4f43d..d825dba5ae5 100644 --- a/.github/workflows/smoke-claude-on-copilot.lock.yml +++ b/.github/workflows/smoke-claude-on-copilot.lock.yml @@ -752,6 +752,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1013,6 +1014,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-claude.lock.yml b/.github/workflows/smoke-claude.lock.yml index 5014f4d2d38..95c8e4adb34 100644 --- a/.github/workflows/smoke-claude.lock.yml +++ b/.github/workflows/smoke-claude.lock.yml @@ -1381,6 +1381,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1734,6 +1735,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-codex.lock.yml b/.github/workflows/smoke-codex.lock.yml index 980f857acd1..1a83c731961 100644 --- a/.github/workflows/smoke-codex.lock.yml +++ b/.github/workflows/smoke-codex.lock.yml @@ -1082,6 +1082,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1377,6 +1378,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -2121,6 +2123,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/smoke-copilot-aoai-apikey.lock.yml b/.github/workflows/smoke-copilot-aoai-apikey.lock.yml index e8c1edc8548..65368f0516b 100644 --- a/.github/workflows/smoke-copilot-aoai-apikey.lock.yml +++ b/.github/workflows/smoke-copilot-aoai-apikey.lock.yml @@ -1946,6 +1946,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -2249,6 +2250,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-copilot-aoai-entra.lock.yml b/.github/workflows/smoke-copilot-aoai-entra.lock.yml index ee16d754488..4e719d5e4ae 100644 --- a/.github/workflows/smoke-copilot-aoai-entra.lock.yml +++ b/.github/workflows/smoke-copilot-aoai-entra.lock.yml @@ -1962,6 +1962,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -2268,6 +2269,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-copilot-arm.lock.yml b/.github/workflows/smoke-copilot-arm.lock.yml index 8af1ba483fe..315f57da6f0 100644 --- a/.github/workflows/smoke-copilot-arm.lock.yml +++ b/.github/workflows/smoke-copilot-arm.lock.yml @@ -1708,6 +1708,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -2008,6 +2009,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-copilot-auto.lock.yml b/.github/workflows/smoke-copilot-auto.lock.yml index ae22f1ced3a..4ecf4929f23 100644 --- a/.github/workflows/smoke-copilot-auto.lock.yml +++ b/.github/workflows/smoke-copilot-auto.lock.yml @@ -740,6 +740,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -961,6 +962,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-copilot-mai.lock.yml b/.github/workflows/smoke-copilot-mai.lock.yml index 15d1b6bf93f..32f0ac44ce4 100644 --- a/.github/workflows/smoke-copilot-mai.lock.yml +++ b/.github/workflows/smoke-copilot-mai.lock.yml @@ -815,6 +815,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1035,6 +1036,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-copilot-sdk.lock.yml b/.github/workflows/smoke-copilot-sdk.lock.yml index bfed3876a75..37662c30d0d 100644 --- a/.github/workflows/smoke-copilot-sdk.lock.yml +++ b/.github/workflows/smoke-copilot-sdk.lock.yml @@ -784,6 +784,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1000,6 +1001,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-copilot-small.lock.yml b/.github/workflows/smoke-copilot-small.lock.yml index bec77864e66..1afb9bb210a 100644 --- a/.github/workflows/smoke-copilot-small.lock.yml +++ b/.github/workflows/smoke-copilot-small.lock.yml @@ -782,6 +782,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -994,6 +995,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-copilot-sub-agents.lock.yml b/.github/workflows/smoke-copilot-sub-agents.lock.yml index 53c2738f1f2..e431f4af5a5 100644 --- a/.github/workflows/smoke-copilot-sub-agents.lock.yml +++ b/.github/workflows/smoke-copilot-sub-agents.lock.yml @@ -738,6 +738,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -955,6 +956,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-copilot.lock.yml b/.github/workflows/smoke-copilot.lock.yml index 4c913bc4009..1e4121c560a 100644 --- a/.github/workflows/smoke-copilot.lock.yml +++ b/.github/workflows/smoke-copilot.lock.yml @@ -1962,6 +1962,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -2264,6 +2265,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-create-cross-repo-pr.lock.yml b/.github/workflows/smoke-create-cross-repo-pr.lock.yml index a204f8b6d21..d02f171ead6 100644 --- a/.github/workflows/smoke-create-cross-repo-pr.lock.yml +++ b/.github/workflows/smoke-create-cross-repo-pr.lock.yml @@ -907,6 +907,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1125,6 +1126,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-crush.lock.yml b/.github/workflows/smoke-crush.lock.yml index f7594c0a169..48be30af6ea 100644 --- a/.github/workflows/smoke-crush.lock.yml +++ b/.github/workflows/smoke-crush.lock.yml @@ -885,6 +885,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1317,6 +1318,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-cursor.lock.yml b/.github/workflows/smoke-cursor.lock.yml index 2799e2eed79..5699ddac55f 100644 --- a/.github/workflows/smoke-cursor.lock.yml +++ b/.github/workflows/smoke-cursor.lock.yml @@ -883,6 +883,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1197,6 +1198,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-deepseek-harness.lock.yml b/.github/workflows/smoke-deepseek-harness.lock.yml index 0e37c2a34f9..700332bbf57 100644 --- a/.github/workflows/smoke-deepseek-harness.lock.yml +++ b/.github/workflows/smoke-deepseek-harness.lock.yml @@ -831,6 +831,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1121,6 +1122,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-drive.lock.yml b/.github/workflows/smoke-drive.lock.yml index 27ed6d86188..42852779534 100644 --- a/.github/workflows/smoke-drive.lock.yml +++ b/.github/workflows/smoke-drive.lock.yml @@ -869,6 +869,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1114,6 +1115,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1753,6 +1755,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/smoke-gemini.lock.yml b/.github/workflows/smoke-gemini.lock.yml index 1938efb6783..5f855c4c07c 100644 --- a/.github/workflows/smoke-gemini.lock.yml +++ b/.github/workflows/smoke-gemini.lock.yml @@ -914,6 +914,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="awmg-mcpg" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1096,6 +1097,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-github-claude.lock.yml b/.github/workflows/smoke-github-claude.lock.yml index 6d3ce156698..30922d314bb 100644 --- a/.github/workflows/smoke-github-claude.lock.yml +++ b/.github/workflows/smoke-github-claude.lock.yml @@ -752,6 +752,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1013,6 +1014,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-goose.lock.yml b/.github/workflows/smoke-goose.lock.yml index d62fdfcb105..14974c17b3e 100644 --- a/.github/workflows/smoke-goose.lock.yml +++ b/.github/workflows/smoke-goose.lock.yml @@ -912,6 +912,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1289,6 +1290,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-kiro.lock.yml b/.github/workflows/smoke-kiro.lock.yml index 780286c1e84..e18982ed23a 100644 --- a/.github/workflows/smoke-kiro.lock.yml +++ b/.github/workflows/smoke-kiro.lock.yml @@ -883,6 +883,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1120,6 +1121,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-multi-pr.lock.yml b/.github/workflows/smoke-multi-pr.lock.yml index 41301082ad2..0c08893e398 100644 --- a/.github/workflows/smoke-multi-pr.lock.yml +++ b/.github/workflows/smoke-multi-pr.lock.yml @@ -844,6 +844,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1088,6 +1089,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-opencode.lock.yml b/.github/workflows/smoke-opencode.lock.yml index 94dd56b7ccb..7a5537421a7 100644 --- a/.github/workflows/smoke-opencode.lock.yml +++ b/.github/workflows/smoke-opencode.lock.yml @@ -842,6 +842,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1142,6 +1143,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-otel-backends.lock.yml b/.github/workflows/smoke-otel-backends.lock.yml index 95df8660a0c..23506738715 100644 --- a/.github/workflows/smoke-otel-backends.lock.yml +++ b/.github/workflows/smoke-otel-backends.lock.yml @@ -826,6 +826,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1207,6 +1208,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1837,6 +1839,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/smoke-pi.lock.yml b/.github/workflows/smoke-pi.lock.yml index 4b7ebde8d99..2f0ac53c10c 100644 --- a/.github/workflows/smoke-pi.lock.yml +++ b/.github/workflows/smoke-pi.lock.yml @@ -862,6 +862,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1040,6 +1041,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-project.lock.yml b/.github/workflows/smoke-project.lock.yml index 9cb7fd36bca..1ad4cac3a4e 100644 --- a/.github/workflows/smoke-project.lock.yml +++ b/.github/workflows/smoke-project.lock.yml @@ -1099,6 +1099,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1316,6 +1317,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-pydantic.lock.yml b/.github/workflows/smoke-pydantic.lock.yml index ccf0ceb5c74..930a21e538a 100644 --- a/.github/workflows/smoke-pydantic.lock.yml +++ b/.github/workflows/smoke-pydantic.lock.yml @@ -874,6 +874,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1285,6 +1286,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-service-ports.lock.yml b/.github/workflows/smoke-service-ports.lock.yml index 7a324b3c756..b92e065b6d0 100644 --- a/.github/workflows/smoke-service-ports.lock.yml +++ b/.github/workflows/smoke-service-ports.lock.yml @@ -779,6 +779,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1029,6 +1030,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1720,6 +1722,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/smoke-temporary-id.lock.yml b/.github/workflows/smoke-temporary-id.lock.yml index 0bd1fb1a8dc..506faf7978d 100644 --- a/.github/workflows/smoke-temporary-id.lock.yml +++ b/.github/workflows/smoke-temporary-id.lock.yml @@ -896,6 +896,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1142,6 +1143,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1853,6 +1855,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -2177,6 +2180,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/smoke-test-tools.lock.yml b/.github/workflows/smoke-test-tools.lock.yml index d6de1eb7bff..226a7b1d43f 100644 --- a/.github/workflows/smoke-test-tools.lock.yml +++ b/.github/workflows/smoke-test-tools.lock.yml @@ -822,6 +822,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1067,6 +1068,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1758,6 +1760,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/smoke-update-cross-repo-pr.lock.yml b/.github/workflows/smoke-update-cross-repo-pr.lock.yml index 7c4bbbadcf8..a17a3aa65af 100644 --- a/.github/workflows/smoke-update-cross-repo-pr.lock.yml +++ b/.github/workflows/smoke-update-cross-repo-pr.lock.yml @@ -902,6 +902,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1120,6 +1121,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-workflow-call-with-inputs.lock.yml b/.github/workflows/smoke-workflow-call-with-inputs.lock.yml index 504ae8ce42c..3c400a5a4c8 100644 --- a/.github/workflows/smoke-workflow-call-with-inputs.lock.yml +++ b/.github/workflows/smoke-workflow-call-with-inputs.lock.yml @@ -798,6 +798,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1034,6 +1035,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/smoke-workflow-call.lock.yml b/.github/workflows/smoke-workflow-call.lock.yml index 71c2012f964..5bc5ef40be6 100644 --- a/.github/workflows/smoke-workflow-call.lock.yml +++ b/.github/workflows/smoke-workflow-call.lock.yml @@ -805,6 +805,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1044,6 +1045,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/spec-enforcer.lock.yml b/.github/workflows/spec-enforcer.lock.yml index 607e5387573..67a4120f72e 100644 --- a/.github/workflows/spec-enforcer.lock.yml +++ b/.github/workflows/spec-enforcer.lock.yml @@ -804,6 +804,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -982,6 +983,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/spec-extractor.lock.yml b/.github/workflows/spec-extractor.lock.yml index 3fc63d62cb8..57cbadd1362 100644 --- a/.github/workflows/spec-extractor.lock.yml +++ b/.github/workflows/spec-extractor.lock.yml @@ -781,6 +781,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1081,6 +1082,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/spec-librarian.lock.yml b/.github/workflows/spec-librarian.lock.yml index 6f31602b1e0..3b342241f30 100644 --- a/.github/workflows/spec-librarian.lock.yml +++ b/.github/workflows/spec-librarian.lock.yml @@ -722,6 +722,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1028,6 +1029,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/squad-game-planner.lock.yml b/.github/workflows/squad-game-planner.lock.yml index 7e7685b983f..98b1807f1a5 100644 --- a/.github/workflows/squad-game-planner.lock.yml +++ b/.github/workflows/squad-game-planner.lock.yml @@ -747,6 +747,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -968,6 +969,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/squad-implement-worker.lock.yml b/.github/workflows/squad-implement-worker.lock.yml index e0a00761a32..b0340a6e434 100644 --- a/.github/workflows/squad-implement-worker.lock.yml +++ b/.github/workflows/squad-implement-worker.lock.yml @@ -899,6 +899,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1120,6 +1121,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/squad-plan.lock.yml b/.github/workflows/squad-plan.lock.yml index 55908f488f3..4f459d24ee1 100644 --- a/.github/workflows/squad-plan.lock.yml +++ b/.github/workflows/squad-plan.lock.yml @@ -804,6 +804,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1025,6 +1026,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/squad.lock.yml b/.github/workflows/squad.lock.yml index 6f33e49ef44..a22a132fe6e 100644 --- a/.github/workflows/squad.lock.yml +++ b/.github/workflows/squad.lock.yml @@ -1435,6 +1435,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1656,6 +1657,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/stale-pr-cleanup.lock.yml b/.github/workflows/stale-pr-cleanup.lock.yml index 2699e690317..80e3d811b4b 100644 --- a/.github/workflows/stale-pr-cleanup.lock.yml +++ b/.github/workflows/stale-pr-cleanup.lock.yml @@ -737,6 +737,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -983,6 +984,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/stale-repo-identifier.lock.yml b/.github/workflows/stale-repo-identifier.lock.yml index b24f41f1357..784c7d9d0a2 100644 --- a/.github/workflows/stale-repo-identifier.lock.yml +++ b/.github/workflows/stale-repo-identifier.lock.yml @@ -963,6 +963,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1214,6 +1215,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -2105,6 +2107,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/static-analysis-report.lock.yml b/.github/workflows/static-analysis-report.lock.yml index d079617edd2..6da035f39da 100644 --- a/.github/workflows/static-analysis-report.lock.yml +++ b/.github/workflows/static-analysis-report.lock.yml @@ -847,6 +847,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1138,6 +1139,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/step-name-alignment.lock.yml b/.github/workflows/step-name-alignment.lock.yml index edc1949eb60..a52362910ee 100644 --- a/.github/workflows/step-name-alignment.lock.yml +++ b/.github/workflows/step-name-alignment.lock.yml @@ -733,6 +733,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1030,6 +1031,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/sub-issue-closer.lock.yml b/.github/workflows/sub-issue-closer.lock.yml index 7104533a67a..c322e6482ae 100644 --- a/.github/workflows/sub-issue-closer.lock.yml +++ b/.github/workflows/sub-issue-closer.lock.yml @@ -791,6 +791,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1043,6 +1044,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | @@ -1893,6 +1895,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') diff --git a/.github/workflows/super-linter.lock.yml b/.github/workflows/super-linter.lock.yml index 0adb3035868..0e257d117fe 100644 --- a/.github/workflows/super-linter.lock.yml +++ b/.github/workflows/super-linter.lock.yml @@ -761,6 +761,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1007,6 +1008,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/technical-doc-writer.lock.yml b/.github/workflows/technical-doc-writer.lock.yml index 4b4996b221f..290e23d2429 100644 --- a/.github/workflows/technical-doc-writer.lock.yml +++ b/.github/workflows/technical-doc-writer.lock.yml @@ -897,6 +897,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1123,6 +1124,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/terminal-stylist.lock.yml b/.github/workflows/terminal-stylist.lock.yml index 4d2899b77b7..8a5c83b06e5 100644 --- a/.github/workflows/terminal-stylist.lock.yml +++ b/.github/workflows/terminal-stylist.lock.yml @@ -708,6 +708,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1003,6 +1004,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/test-quality-sentinel.lock.yml b/.github/workflows/test-quality-sentinel.lock.yml index 138ef4eabda..f25e72cfe76 100644 --- a/.github/workflows/test-quality-sentinel.lock.yml +++ b/.github/workflows/test-quality-sentinel.lock.yml @@ -859,6 +859,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1109,6 +1110,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/tidy.lock.yml b/.github/workflows/tidy.lock.yml index e4462ec1341..78ba053ebbb 100644 --- a/.github/workflows/tidy.lock.yml +++ b/.github/workflows/tidy.lock.yml @@ -844,6 +844,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1098,6 +1099,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/typist.lock.yml b/.github/workflows/typist.lock.yml index 3a6c267bed3..a06ba09a89d 100644 --- a/.github/workflows/typist.lock.yml +++ b/.github/workflows/typist.lock.yml @@ -789,6 +789,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="host.docker.internal" export MCP_GATEWAY_HOST_DOMAIN="host.docker.internal" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1115,6 +1116,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/ubuntu-image-analyzer.lock.yml b/.github/workflows/ubuntu-image-analyzer.lock.yml index 415615dbd2b..92dc1591258 100644 --- a/.github/workflows/ubuntu-image-analyzer.lock.yml +++ b/.github/workflows/ubuntu-image-analyzer.lock.yml @@ -754,6 +754,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1009,6 +1010,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/uk-ai-operational-resilience.lock.yml b/.github/workflows/uk-ai-operational-resilience.lock.yml index a4d710c9ca6..2ba094ca378 100644 --- a/.github/workflows/uk-ai-operational-resilience.lock.yml +++ b/.github/workflows/uk-ai-operational-resilience.lock.yml @@ -747,6 +747,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -994,6 +995,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/unbloat-docs.lock.yml b/.github/workflows/unbloat-docs.lock.yml index 16a586800ae..1f4b15b6aff 100644 --- a/.github/workflows/unbloat-docs.lock.yml +++ b/.github/workflows/unbloat-docs.lock.yml @@ -888,6 +888,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1066,6 +1067,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/update-astro.lock.yml b/.github/workflows/update-astro.lock.yml index a6acc467f60..b493d709188 100644 --- a/.github/workflows/update-astro.lock.yml +++ b/.github/workflows/update-astro.lock.yml @@ -775,6 +775,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -998,6 +999,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/video-analyzer.lock.yml b/.github/workflows/video-analyzer.lock.yml index dd76d368961..07adb0862ae 100644 --- a/.github/workflows/video-analyzer.lock.yml +++ b/.github/workflows/video-analyzer.lock.yml @@ -732,6 +732,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -978,6 +979,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/visual-regression-checker.lock.yml b/.github/workflows/visual-regression-checker.lock.yml index 57ecb200af0..7f5e233f6c3 100644 --- a/.github/workflows/visual-regression-checker.lock.yml +++ b/.github/workflows/visual-regression-checker.lock.yml @@ -767,6 +767,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1009,6 +1010,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/weekly-blog-post-writer.lock.yml b/.github/workflows/weekly-blog-post-writer.lock.yml index 382f15220b0..7e245c505da 100644 --- a/.github/workflows/weekly-blog-post-writer.lock.yml +++ b/.github/workflows/weekly-blog-post-writer.lock.yml @@ -928,6 +928,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1174,6 +1175,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/weekly-editors-health-check.lock.yml b/.github/workflows/weekly-editors-health-check.lock.yml index 2258c145fe2..9bc3022178c 100644 --- a/.github/workflows/weekly-editors-health-check.lock.yml +++ b/.github/workflows/weekly-editors-health-check.lock.yml @@ -780,6 +780,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1031,6 +1032,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/weekly-issue-summary.lock.yml b/.github/workflows/weekly-issue-summary.lock.yml index 8f4562ed84a..5f0ef4dfeb4 100644 --- a/.github/workflows/weekly-issue-summary.lock.yml +++ b/.github/workflows/weekly-issue-summary.lock.yml @@ -753,6 +753,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1003,6 +1004,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/weekly-network-domains-audit.lock.yml b/.github/workflows/weekly-network-domains-audit.lock.yml index 8ac16c3369f..c79dbbda7be 100644 --- a/.github/workflows/weekly-network-domains-audit.lock.yml +++ b/.github/workflows/weekly-network-domains-audit.lock.yml @@ -705,6 +705,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -946,6 +947,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/weekly-safe-outputs-spec-review.lock.yml b/.github/workflows/weekly-safe-outputs-spec-review.lock.yml index 66b1e5b8488..80d00c19ecd 100644 --- a/.github/workflows/weekly-safe-outputs-spec-review.lock.yml +++ b/.github/workflows/weekly-safe-outputs-spec-review.lock.yml @@ -755,6 +755,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1002,6 +1003,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/workflow-generator.lock.yml b/.github/workflows/workflow-generator.lock.yml index b217cf5b48d..c10c4591bdf 100644 --- a/.github/workflows/workflow-generator.lock.yml +++ b/.github/workflows/workflow-generator.lock.yml @@ -811,6 +811,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1037,6 +1038,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/workflow-health-manager.lock.yml b/.github/workflows/workflow-health-manager.lock.yml index 3fd58250eac..4405dec7dcd 100644 --- a/.github/workflows/workflow-health-manager.lock.yml +++ b/.github/workflows/workflow-health-manager.lock.yml @@ -837,6 +837,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1062,6 +1063,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/workflow-normalizer.lock.yml b/.github/workflows/workflow-normalizer.lock.yml index 681a6c00563..a89a71eaa35 100644 --- a/.github/workflows/workflow-normalizer.lock.yml +++ b/.github/workflows/workflow-normalizer.lock.yml @@ -795,6 +795,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -1033,6 +1034,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/.github/workflows/workflow-skill-extractor.lock.yml b/.github/workflows/workflow-skill-extractor.lock.yml index df17bf12b1f..f528d005642 100644 --- a/.github/workflows/workflow-skill-extractor.lock.yml +++ b/.github/workflows/workflow-skill-extractor.lock.yml @@ -744,6 +744,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -984,6 +985,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/Makefile b/Makefile index 00c3030e19f..f75b51afbd9 100644 --- a/Makefile +++ b/Makefile @@ -493,6 +493,7 @@ test-scripts: build bash scripts/check-workflow-drift_test.sh ./$(BINARY_NAME) bash scripts/check-cgo-cjs-workflow-purity_test.sh bash actions/setup/sh/copy_gh_aw_binary_for_mcp_test.sh + bash actions/setup/sh/apple_container_setup_cli_test.sh @echo "✓ All Bash script tests passed" # Test all code (Go, JavaScript, wasm golden, and shell scripts) diff --git a/actions/setup/sh/apple_container_host_preflight.sh b/actions/setup/sh/apple_container_host_preflight.sh new file mode 100644 index 00000000000..b5aacc80736 --- /dev/null +++ b/actions/setup/sh/apple_container_host_preflight.sh @@ -0,0 +1,120 @@ +#!/usr/bin/env bash +set +o histexpand + +# apple_container_host_preflight.sh - Validate runner eligibility for AWF's +# apple-container runtime (Apple Virtualization.framework workloads). +# +# This runs before anything is downloaded or installed, so an ineligible runner +# fails in seconds with a named cause instead of after a multi-gigabyte pull. +# +# The supported scope is narrow and deliberate: +# - self-hosted runners only (GitHub-hosted macOS images are themselves VMs and +# report kern.hv_support=0, so they can never host a nested guest) +# - macOS >= GH_AW_APPLE_CONTAINER_MIN_MACOS +# - arm64 (Rosetta translation is refused by AWF) +# - Virtualization.framework available (kern.hv_support=1) +# - a usable launchd GUI/user domain, because `container system start` registers +# its API server as a per-user LaunchAgent +# - a working Docker daemon, because AWF keeps Squid, the API proxy and the CLI +# proxy in Docker Compose regardless of where the agent runs +# +# Inputs: +# GH_AW_APPLE_CONTAINER_MIN_MACOS - minimum macOS major version (required) + +set -euo pipefail + +MIN_MACOS="${GH_AW_APPLE_CONTAINER_MIN_MACOS:-}" +if [[ -z "${MIN_MACOS}" ]]; then + echo "::error::GH_AW_APPLE_CONTAINER_MIN_MACOS is required" + exit 1 +fi + +fail() { + echo "::error::$1" + exit 1 +} + +echo "::group::apple-container host preflight" + +# --- Runner provenance ------------------------------------------------------ +# RUNNER_ENVIRONMENT is "github-hosted" or "self-hosted". Anything else (unset, +# or a value a future runner introduces) is treated as ineligible rather than +# assumed safe. +if [[ "${RUNNER_ENVIRONMENT:-}" != "self-hosted" ]]; then + fail "apple-container requires a self-hosted runner (RUNNER_ENVIRONMENT='${RUNNER_ENVIRONMENT:-unset}'). GitHub-hosted macOS runners are virtual machines without nested virtualisation and report kern.hv_support=0." +fi + +if [[ "${RUNNER_OS:-}" != "macOS" ]]; then + fail "apple-container requires a macOS runner (RUNNER_OS='${RUNNER_OS:-unset}')." +fi + +if [[ "${RUNNER_ARCH:-}" != "ARM64" ]]; then + fail "apple-container requires an Apple Silicon runner (RUNNER_ARCH='${RUNNER_ARCH:-unset}'). Rosetta translation is refused." +fi + +# uname is checked as well as RUNNER_ARCH: the runner variables describe how the +# runner was registered, uname describes the process actually executing. A +# runner registered as ARM64 but executing under Rosetta would pass the first +# check and fail here. +uname_s="$(uname -s)" +uname_m="$(uname -m)" +[[ "${uname_s}" == "Darwin" ]] || fail "apple-container requires Darwin (uname -s reported '${uname_s}')." +[[ "${uname_m}" == "arm64" ]] || fail "apple-container requires native arm64 (uname -m reported '${uname_m}'). This step must not run under Rosetta." + +# --- macOS version ---------------------------------------------------------- +product_version="$(sw_vers -productVersion)" +macos_major="${product_version%%.*}" +case "${macos_major}" in + ''|*[!0-9]*) fail "could not parse macOS major version from sw_vers -productVersion='${product_version}'." ;; +esac +if (( macos_major < MIN_MACOS )); then + fail "apple-container requires macOS ${MIN_MACOS} or newer; this runner reports ${product_version}." +fi + +# --- Hypervisor ------------------------------------------------------------- +# kern.hv_support is the authoritative signal that Virtualization.framework can +# create a VM here. It is 0 inside every nested/virtualised macOS environment. +hv_support="$(sysctl -n kern.hv_support 2>/dev/null || echo "")" +if [[ "${hv_support}" != "1" ]]; then + fail "Virtualization.framework is unavailable: kern.hv_support='${hv_support:-unreadable}'. apple-container requires bare-metal Apple Silicon; this is 0 on GitHub-hosted macOS and inside any nested VM." +fi + +# --- launchd user domain ---------------------------------------------------- +# `container system start` bootstraps com.apple.container.apiserver into the +# calling user's launchd domain. When the Actions runner is installed as a +# LaunchDaemon (or is otherwise running without a user session) that domain does +# not exist, and the service registration fails with an opaque launchd error +# well after the CLI has been installed. Detect it up front and say exactly what +# has to change. +runner_uid="$(id -u)" +if [[ "${runner_uid}" == "0" ]]; then + fail "apple-container must not run as root: 'container system start' registers a per-user LaunchAgent and the agent's content store is per-user. Run the Actions runner as an unprivileged user." +fi +if ! launchctl print "gui/${runner_uid}" >/dev/null 2>&1; then + fail "launchd GUI domain gui/${runner_uid} is unavailable, so 'container system start' cannot register com.apple.container.apiserver. Install the Actions runner as a per-user LaunchAgent under an auto-logged-in account (./svc.sh install), not as a LaunchDaemon or over a bare SSH session." +fi + +# --- Toolchain --------------------------------------------------------------- +# gh-aw's generated setup scripts use bash 4 features (associative arrays, +# mapfile, ${var@Q}, ${var,,}). macOS ships bash 3.2 as /bin/bash and always +# will, so a runner without a newer bash on PATH would fail deep inside an +# unrelated script with a confusing syntax error. Check it here instead. +bash_major="${BASH_VERSINFO[0]:-0}" +if (( bash_major < 4 )); then + fail "bash ${BASH_VERSION:-unknown} is too old. gh-aw's generated setup scripts require bash 4 or newer, and macOS only ships bash 3.2. Install a newer bash on the runner (for example 'brew install bash') and make sure it precedes /bin/bash on PATH." +fi + +# --- Docker infrastructure -------------------------------------------------- +# Apple Container runs only the agent. Squid, the API proxy and the CLI proxy +# stay in Docker Compose, so a missing Docker daemon is fatal here even though +# the agent never sees it. +command -v docker >/dev/null 2>&1 || fail "docker is not installed. apple-container moves only the agent into a VM; AWF still runs Squid, the API proxy and the CLI proxy under Docker Compose on the host." +docker info >/dev/null 2>&1 || fail "the Docker daemon is not reachable. AWF requires it for the Squid/API-proxy/CLI-proxy infrastructure containers." +docker compose version >/dev/null 2>&1 || fail "the Docker Compose plugin is unavailable ('docker compose version' failed). AWF orchestrates its infrastructure containers with Compose." + +echo "runner is eligible for apple-container:" +echo " macOS ${product_version} (arm64, kern.hv_support=1)" +echo " launchd user domain gui/${runner_uid} available" +echo " bash ${BASH_VERSION}" +echo " docker: $(docker version --format '{{.Server.Version}}' 2>/dev/null || echo 'unknown')" +echo "::endgroup::" diff --git a/actions/setup/sh/apple_container_pull_images.sh b/actions/setup/sh/apple_container_pull_images.sh new file mode 100644 index 00000000000..168219214db --- /dev/null +++ b/actions/setup/sh/apple_container_pull_images.sh @@ -0,0 +1,128 @@ +#!/usr/bin/env bash +set +o histexpand + +# apple_container_pull_images.sh - Populate Apple Container's image store with +# the digest-pinned images AWF needs for the apple-container runtime. +# +# Apple Container keeps its own content store, completely separate from Docker's. +# The Docker pre-download step earlier in the job populates the daemon that runs +# Squid, the API proxy and the CLI proxy; it does nothing for the agent VM. AWF +# honours --skip-pull for this runtime by *verifying* the image is present in the +# Apple store, so a missing image here is a hard AWF failure later, not a silent +# re-pull. +# +# Two images are required: +# - the agent image the workload runs +# - the AWF apple-init image carrying the guest capability relay +# +# Every reference must be digest-pinned. There is no daemon-side content trust to +# fall back on here, so a floating tag would mean the VM boots whatever the +# registry happens to serve. References are passed as arguments, already +# substituted and pin-resolved by the compiler, and are re-checked here so a +# floating reference cannot reach `container image pull` even if some future +# caller forgets. +# +# Usage: apple_container_pull_images.sh REF [REF ...] +# +# Inputs: +# GH_AW_APPLE_CONTAINER_BIN optional explicit CLI path +# CONTAINER_APP_ROOT application root (exported by the start step) + +set -euo pipefail + +fail() { + echo "::error::$1" + exit 1 +} + +if [[ $# -eq 0 ]]; then + fail "at least one image reference is required" +fi + +CONTAINER_BIN="${GH_AW_APPLE_CONTAINER_BIN:-}" +if [[ -z "${CONTAINER_BIN}" ]]; then + CONTAINER_BIN="$(command -v container 2>/dev/null || true)" +fi +[[ -n "${CONTAINER_BIN}" && -x "${CONTAINER_BIN}" ]] || fail "the Apple container CLI was not found; the setup step must run before images are pulled." + +# The store is selected by CONTAINER_APP_ROOT. If the start step exported one and +# it has been lost, pulling here would populate a different store than the one +# AWF reads, and AWF's verification would fail on an image that was just pulled. +if [[ -z "${CONTAINER_APP_ROOT:-}" ]]; then + echo "::warning::CONTAINER_APP_ROOT is not set; using the Apple Container default application root. The AWF invocation must use the same root." +else + echo "using Apple Container application root: ${CONTAINER_APP_ROOT}" +fi + +"${CONTAINER_BIN}" system status >/dev/null 2>&1 || + fail "Apple container services are not running; 'container image pull' requires them. The service start step must run first." + +pull_with_retry() { + local reference="$1" + local max_attempts=3 + local wait_time=5 + local attempt + + for attempt in 1 2 3; do + echo "Attempt ${attempt} of ${max_attempts}: pulling ${reference} into the Apple Container store..." + # --platform is explicit: the agent and init images must be the native arm64 + # variants. Rosetta translation is refused by AWF, and an accidental amd64 + # manifest selection would produce a guest that cannot execute its own init. + if "${CONTAINER_BIN}" image pull --platform linux/arm64 --progress plain "${reference}"; then + echo "pulled ${reference}" + return 0 + fi + if (( attempt < max_attempts )); then + echo "pull failed; retrying in ${wait_time}s" + sleep "${wait_time}" + wait_time=$(( wait_time * 2 )) + fi + done + + return 1 +} + +echo "::group::Pull Apple Container images" +echo "Apple Container uses an image store separate from Docker's; these pulls do not duplicate the Docker pre-download." + +for reference in "$@"; do + [[ -n "${reference}" ]] || fail "empty image reference" + + # Fail closed on anything that is not digest-pinned. This is the guarantee that + # what boots inside the VM is exactly what the workflow declared. + case "${reference}" in + *@sha256:*) ;; + *) fail "image reference '${reference}' is not digest-pinned. The apple-container runtime requires digest-pinned images: Apple Container's store has no daemon-side content trust, so a floating tag would boot whatever the registry currently serves." ;; + esac + + # Reject shell metacharacters outright. References reach this script as argv + # and are never re-parsed by a shell, but a reference that could not be a valid + # OCI reference indicates the compiler substituted something unexpected, and + # continuing would pull an attacker-chosen image. + case "${reference}" in + *[\ \'\"\$\`\;\&\|\<\>\(\)\{\}\*\?\!$'\n'$'\t']*) + fail "image reference '${reference}' contains characters that are not valid in an OCI reference." ;; + esac + + pull_with_retry "${reference}" || + fail "failed to pull ${reference} into the Apple Container image store after 3 attempts." +done + +echo "::endgroup::" + +echo "::group::Verify Apple Container images" +# Verification is separate from the pull so a store that reports a successful +# pull but cannot resolve the reference afterwards is caught here rather than by +# AWF, whose failure would come from inside the VM launch path. +for reference in "$@"; do + if ! "${CONTAINER_BIN}" image inspect "${reference}" >/dev/null 2>&1; then + echo "--- images in the Apple Container store ---" + "${CONTAINER_BIN}" image list --format json 2>/dev/null || "${CONTAINER_BIN}" image list || true + echo "-------------------------------------------" + fail "${reference} is not resolvable in the Apple Container image store after a successful pull. AWF verifies this reference under --skip-pull and would fail during VM launch." + fi + echo "verified ${reference}" +done +echo "::endgroup::" + +echo "Apple Container images ready" diff --git a/actions/setup/sh/apple_container_setup_cli.sh b/actions/setup/sh/apple_container_setup_cli.sh new file mode 100644 index 00000000000..41bfee5efd2 --- /dev/null +++ b/actions/setup/sh/apple_container_setup_cli.sh @@ -0,0 +1,206 @@ +#!/usr/bin/env bash +set +o histexpand + +# apple_container_setup_cli.sh - Ensure a supported Apple `container` CLI is +# present for AWF's apple-container runtime. +# +# Two paths, in order: +# +# 1. Verify a preinstalled CLI. If `container --version` reports a version +# inside the supported window, nothing is downloaded or installed. This is +# the expected steady state on a maintained self-hosted Mac. +# 2. Install the pinned release. Only when --allow-install is passed (that is, +# when the workflow opted in with sandbox.agent.runtime-install). The +# package is pinned by version AND by SHA-256, and its Developer ID +# installer signature is checked before `installer` is ever invoked, so a +# swapped release asset fails on the digest and a re-signed package fails on +# the identity. +# +# There is deliberately no "latest" path and no unsigned-package path. +# +# Usage: apple_container_setup_cli.sh [--allow-install] +# +# Inputs (all required): +# GH_AW_APPLE_CONTAINER_VERSION pinned apple/container release, e.g. 0.12.3 +# GH_AW_APPLE_CONTAINER_PKG_SHA256 SHA-256 of the signed installer package +# GH_AW_APPLE_CONTAINER_PKG_IDENTITY expected Developer ID Installer identity +# GH_AW_APPLE_CONTAINER_MIN_CLI inclusive minimum supported CLI version +# GH_AW_APPLE_CONTAINER_MAX_CLI exclusive maximum supported CLI version +# +# Outputs (GITHUB_ENV): +# GH_AW_APPLE_CONTAINER_BIN absolute path to the verified CLI + +set -euo pipefail + +ALLOW_INSTALL=false +for arg in "$@"; do + case "$arg" in + --allow-install) ALLOW_INSTALL=true ;; + *) echo "::error::unknown argument: ${arg}"; exit 1 ;; + esac +done + +require_env() { + local name="$1" value="$2" + if [[ -z "${value}" ]]; then + echo "::error::${name} is required" + exit 1 + fi +} + +require_env GH_AW_APPLE_CONTAINER_VERSION "${GH_AW_APPLE_CONTAINER_VERSION:-}" +require_env GH_AW_APPLE_CONTAINER_PKG_SHA256 "${GH_AW_APPLE_CONTAINER_PKG_SHA256:-}" +require_env GH_AW_APPLE_CONTAINER_PKG_IDENTITY "${GH_AW_APPLE_CONTAINER_PKG_IDENTITY:-}" +require_env GH_AW_APPLE_CONTAINER_MIN_CLI "${GH_AW_APPLE_CONTAINER_MIN_CLI:-}" +require_env GH_AW_APPLE_CONTAINER_MAX_CLI "${GH_AW_APPLE_CONTAINER_MAX_CLI:-}" + +PINNED_VERSION="${GH_AW_APPLE_CONTAINER_VERSION}" +PINNED_SHA256="${GH_AW_APPLE_CONTAINER_PKG_SHA256}" +EXPECTED_IDENTITY="${GH_AW_APPLE_CONTAINER_PKG_IDENTITY}" +MIN_CLI="${GH_AW_APPLE_CONTAINER_MIN_CLI}" +MAX_CLI="${GH_AW_APPLE_CONTAINER_MAX_CLI}" + +fail() { + echo "::error::$1" + exit 1 +} + +# version_key normalises a dotted version to a zero-padded sortable key so +# comparisons work in bash 3.2 (which is what macOS ships as /bin/bash) without +# sort -V, which BSD sort lacks. Pre-release suffixes are dropped: the window +# check must not accept 1.0.0-beta as "less than 1.0.0". +version_key() { + local raw="$1" + raw="${raw%%-*}" + raw="${raw%%+*}" + local major minor patch + IFS='.' read -r major minor patch <<<"${raw}" + major="${major:-0}"; minor="${minor:-0}"; patch="${patch:-0}" + case "${major}${minor}${patch}" in + ''|*[!0-9]*) return 1 ;; + esac + printf '%05d%05d%05d\n' "${major}" "${minor}" "${patch}" +} + +# version_in_window reports whether $1 satisfies MIN_CLI <= v < MAX_CLI. +version_in_window() { + local candidate min max + candidate="$(version_key "$1")" || return 1 + min="$(version_key "${MIN_CLI}")" || return 1 + max="$(version_key "${MAX_CLI}")" || return 1 + [[ "${candidate}" > "${min}" || "${candidate}" == "${min}" ]] || return 1 + [[ "${candidate}" < "${max}" ]] || return 1 + return 0 +} + +# installed_version prints the bare version of a `container` binary, or nothing. +# `container --version` prints "container CLI version 0.12.3 (build: ...)"-style +# output across releases, so the first dotted token is extracted rather than +# assuming a fixed field position. +installed_version() { + local bin="$1" out + out="$("${bin}" --version 2>/dev/null || true)" + printf '%s\n' "${out}" | tr ' ' '\n' | grep -Eo '^[0-9]+\.[0-9]+(\.[0-9]+)?$' | head -n1 +} + +echo "::group::Resolve Apple container CLI" + +CONTAINER_BIN="$(command -v container 2>/dev/null || true)" +CURRENT_VERSION="" +if [[ -n "${CONTAINER_BIN}" ]]; then + CURRENT_VERSION="$(installed_version "${CONTAINER_BIN}")" + echo "found preinstalled CLI at ${CONTAINER_BIN} reporting version '${CURRENT_VERSION:-unparseable}'" +else + echo "no 'container' CLI on PATH" +fi + +if [[ -n "${CURRENT_VERSION}" ]] && version_in_window "${CURRENT_VERSION}"; then + echo "preinstalled container ${CURRENT_VERSION} is within the supported window [${MIN_CLI}, ${MAX_CLI}); skipping installation" + echo "::endgroup::" + if [[ -n "${GITHUB_ENV:-}" ]]; then + echo "GH_AW_APPLE_CONTAINER_BIN=${CONTAINER_BIN}" >> "${GITHUB_ENV}" + fi + exit 0 +fi + +if [[ "${ALLOW_INSTALL}" != "true" ]]; then + if [[ -n "${CURRENT_VERSION}" ]]; then + fail "installed Apple container CLI ${CURRENT_VERSION} is outside the supported window [${MIN_CLI}, ${MAX_CLI}). AWF's init image contract is only validated against that range: a release outside it may relocate the real vminitd and boot a guest with no capability relay. Install ${PINNED_VERSION} on the runner, or set sandbox.agent.runtime-install: true to let the workflow install the pinned release." + fi + fail "the Apple container CLI is not installed on this runner. Install apple/container ${PINNED_VERSION} (https://github.com/apple/container/releases/tag/${PINNED_VERSION}), or set sandbox.agent.runtime-install: true to let the workflow install the pinned, checksum-verified and signature-verified release." +fi + +echo "::endgroup::" + +echo "::group::Install pinned Apple container ${PINNED_VERSION}" + +# `installer` writes to /usr/local and requires root. Non-interactive sudo is +# mandatory: a password prompt on a headless runner would hang the job until the +# step timeout rather than failing. +if ! sudo -n true 2>/dev/null; then + fail "sandbox.agent.runtime-install requires passwordless sudo to run 'installer -pkg', which this runner does not grant. Either configure NOPASSWD sudo for the runner user, or preinstall apple/container ${PINNED_VERSION} and drop runtime-install." +fi + +pkg_name="container-${PINNED_VERSION}-installer-signed.pkg" +pkg_url="https://github.com/apple/container/releases/download/${PINNED_VERSION}/${pkg_name}" + +work_dir="$(mktemp -d)" +trap 'rm -rf "${work_dir}"' EXIT +pkg_path="${work_dir}/${pkg_name}" + +echo "downloading ${pkg_url}" +curl -fsSL --retry 5 --retry-delay 10 --retry-max-time 300 --retry-all-errors -o "${pkg_path}" "${pkg_url}" + +actual_sha256="$(shasum -a 256 "${pkg_path}" | awk '{print $1}' | tr 'A-F' 'a-f')" +expected_sha256="$(printf '%s' "${PINNED_SHA256}" | tr 'A-F' 'a-f')" +if [[ "${actual_sha256}" != "${expected_sha256}" ]]; then + fail "checksum verification failed for ${pkg_name}: expected ${expected_sha256}, got ${actual_sha256}. The release asset does not match the digest pinned in this repository; do not install it." +fi +echo "checksum verified: ${actual_sha256}" + +# The digest proves the bytes are the reviewed ones. The signature additionally +# proves who produced them, so a checksum bump alone cannot launder a package +# from another signer. +signature_output="$(pkgutil --check-signature "${pkg_path}" 2>&1)" || fail "pkgutil --check-signature failed for ${pkg_name}" +if ! grep -Fq "${EXPECTED_IDENTITY}" <<<"${signature_output}"; then + echo "${signature_output}" + fail "${pkg_name} is not signed by the expected identity '${EXPECTED_IDENTITY}'." +fi +if ! grep -Fq "signed by a developer certificate issued by Apple for distribution" <<<"${signature_output}"; then + echo "${signature_output}" + fail "${pkg_name} does not carry a valid Apple distribution signature." +fi +echo "signature verified: ${EXPECTED_IDENTITY}" + +sudo -n installer -pkg "${pkg_path}" -target / >/dev/null + +hash -r 2>/dev/null || true +CONTAINER_BIN="$(command -v container 2>/dev/null || true)" +if [[ -z "${CONTAINER_BIN}" ]]; then + # The package installs into /usr/local/bin, which is on the default PATH, but + # a runner with a trimmed PATH would not see it. Fall back to the receipt's + # install location rather than failing on a PATH detail. + if [[ -x /usr/local/bin/container ]]; then + CONTAINER_BIN=/usr/local/bin/container + else + fail "apple/container ${PINNED_VERSION} installed but no 'container' binary was found on PATH or at /usr/local/bin/container." + fi +fi + +CURRENT_VERSION="$(installed_version "${CONTAINER_BIN}")" +if [[ -z "${CURRENT_VERSION}" ]]; then + fail "could not read a version from '${CONTAINER_BIN} --version' after installation." +fi +if ! version_in_window "${CURRENT_VERSION}"; then + fail "installed apple/container ${CURRENT_VERSION} is outside the supported window [${MIN_CLI}, ${MAX_CLI}); refusing to continue." +fi +if [[ "${CURRENT_VERSION}" != "${PINNED_VERSION}" ]]; then + echo "::warning::installed container reports ${CURRENT_VERSION} but ${PINNED_VERSION} was requested" +fi + +echo "installed apple/container ${CURRENT_VERSION} at ${CONTAINER_BIN}" +echo "::endgroup::" + +if [[ -n "${GITHUB_ENV:-}" ]]; then + echo "GH_AW_APPLE_CONTAINER_BIN=${CONTAINER_BIN}" >> "${GITHUB_ENV}" +fi diff --git a/actions/setup/sh/apple_container_setup_cli_test.sh b/actions/setup/sh/apple_container_setup_cli_test.sh new file mode 100644 index 00000000000..cfcec74c2b6 --- /dev/null +++ b/actions/setup/sh/apple_container_setup_cli_test.sh @@ -0,0 +1,152 @@ +#!/bin/bash +set +o histexpand + +# Test script for apple_container_setup_cli.sh +# +# The CLI version window is the gate that keeps AWF's init-image contract honest: +# a `container` release outside [MIN, MAX) may relocate the real vminitd and boot +# a guest with no capability relay. These tests exercise the comparison directly +# rather than through an installation, so they run anywhere. + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SCRIPT_PATH="$SCRIPT_DIR/apple_container_setup_cli.sh" + +GREEN='\033[0;32m' +RED='\033[0;31m' +YELLOW='\033[0;33m' +NC='\033[0m' + +TESTS_RUN=0 +TESTS_PASSED=0 +TESTS_FAILED=0 + +print_result() { + local test_name="$1" + local result="$2" + local message="${3:-}" + + TESTS_RUN=$((TESTS_RUN + 1)) + + if [ "$result" = "PASS" ]; then + echo -e "${GREEN}✓ PASS${NC}: $test_name" + TESTS_PASSED=$((TESTS_PASSED + 1)) + else + echo -e "${RED}✗ FAIL${NC}: $test_name" + if [ -n "$message" ]; then + echo -e " ${YELLOW}Message:${NC} $message" + fi + TESTS_FAILED=$((TESTS_FAILED + 1)) + fi +} + +# Extract the pure version-comparison helpers from the script and evaluate them +# in isolation. Sourcing the whole script would run the resolution logic and try +# to touch the host, so only the two functions under test are lifted out. +eval "$(sed -n '/^version_key()/,/^}/p' "$SCRIPT_PATH")" +eval "$(sed -n '/^version_in_window()/,/^}/p' "$SCRIPT_PATH")" + +MIN_CLI="0.4.0" +MAX_CLI="1.0.0" + +assert_in_window() { + local version="$1" + if version_in_window "$version"; then + print_result "version ${version} is accepted" "PASS" + else + print_result "version ${version} is accepted" "FAIL" "expected ${version} to be inside [${MIN_CLI}, ${MAX_CLI})" + fi +} + +assert_out_of_window() { + local version="$1" why="$2" + if version_in_window "$version"; then + print_result "version ${version} is rejected (${why})" "FAIL" "expected ${version} to be outside [${MIN_CLI}, ${MAX_CLI})" + else + print_result "version ${version} is rejected (${why})" "PASS" + fi +} + +echo "" +echo "═══════════════════════════════════════════════════════════" +echo "Test 1: Script syntax is valid" +echo "═══════════════════════════════════════════════════════════" +if bash -n "$SCRIPT_PATH" 2>/dev/null; then + print_result "Script syntax is valid" "PASS" +else + print_result "Script syntax is valid" "FAIL" "bash -n reported an error" +fi + +echo "" +echo "═══════════════════════════════════════════════════════════" +echo "Test 2: Versions inside the supported window are accepted" +echo "═══════════════════════════════════════════════════════════" +assert_in_window "0.4.0" # inclusive lower bound +assert_in_window "0.4.1" +assert_in_window "0.9.0" +assert_in_window "0.12.3" # the pinned release +assert_in_window "0.99.99" + +echo "" +echo "═══════════════════════════════════════════════════════════" +echo "Test 3: Versions outside the supported window are rejected" +echo "═══════════════════════════════════════════════════════════" +assert_out_of_window "0.3.0" "below the minimum" +assert_out_of_window "0.1.0" "below the minimum" +assert_out_of_window "1.0.0" "exclusive upper bound" +assert_out_of_window "1.2.2" "1.x is outside AWF's contract range" +assert_out_of_window "1.3.0" "1.x is outside AWF's contract range" +assert_out_of_window "2.0.0" "far above the maximum" + +echo "" +echo "═══════════════════════════════════════════════════════════" +echo "Test 4: Numeric comparison, not lexicographic" +echo "═══════════════════════════════════════════════════════════" +# A naive string compare would place "0.12.3" below "0.4.0" and reject the +# pinned release outright, so this ordering is asserted explicitly. +assert_in_window "0.12.0" +assert_in_window "0.10.0" +if [ "$(version_key 0.12.3)" \> "$(version_key 0.4.0)" ]; then + print_result "0.12.3 sorts above 0.4.0" "PASS" +else + print_result "0.12.3 sorts above 0.4.0" "FAIL" "double-digit minor versions must compare numerically" +fi + +echo "" +echo "═══════════════════════════════════════════════════════════" +echo "Test 5: Pre-release suffixes do not sneak past the upper bound" +echo "═══════════════════════════════════════════════════════════" +# 1.0.0-beta must not be treated as "less than 1.0.0": the init image layout is +# already allowed to have changed by then. +assert_out_of_window "1.0.0-beta" "pre-release of an unsupported major" +assert_in_window "0.12.3-rc1" + +echo "" +echo "═══════════════════════════════════════════════════════════" +echo "Test 6: Malformed versions are rejected rather than assumed" +echo "═══════════════════════════════════════════════════════════" +assert_out_of_window "" "empty" +assert_out_of_window "latest" "non-numeric" +assert_out_of_window "v0.12.3" "unstripped v prefix is not parsed as numeric" + +echo "" +echo "═══════════════════════════════════════════════════════════" +echo "Test 7: Two-component versions are tolerated" +echo "═══════════════════════════════════════════════════════════" +assert_in_window "0.5" +assert_out_of_window "1.0" "exclusive upper bound without a patch component" + +echo "" +echo "═══════════════════════════════════════════════════════════" +echo "Summary" +echo "═══════════════════════════════════════════════════════════" +echo "Tests run: $TESTS_RUN" +echo -e "Tests passed: ${GREEN}${TESTS_PASSED}${NC}" +echo -e "Tests failed: ${RED}${TESTS_FAILED}${NC}" + +if [ "$TESTS_FAILED" -gt 0 ]; then + exit 1 +fi +echo "" +echo -e "${GREEN}All apple_container_setup_cli.sh tests passed${NC}" diff --git a/actions/setup/sh/apple_container_start_services.sh b/actions/setup/sh/apple_container_start_services.sh new file mode 100644 index 00000000000..7a40f85d37b --- /dev/null +++ b/actions/setup/sh/apple_container_start_services.sh @@ -0,0 +1,178 @@ +#!/usr/bin/env bash +set +o histexpand + +# apple_container_start_services.sh - Start and verify Apple `container` system +# services for AWF's apple-container runtime. +# +# Three things have to be true before AWF may launch an agent VM: +# +# 1. The API server is running and `container system status` reports it +# healthy. AWF's own preflight repeats this, but doing it here means a +# broken service surfaces as a named setup failure rather than as an opaque +# agent-launch error. +# 2. A default kernel is installed. `container system start` prompts for this +# interactively by default, which would hang a headless runner forever, so +# --enable-kernel-install is always passed. +# 3. The service and every later `container` invocation — including the ones +# AWF makes — agree on one application root. The root holds the image +# content store, so a service started under one root and an image pulled +# under another produce a VM that cannot find its own agent image. The root +# is therefore exported through CONTAINER_APP_ROOT in $GITHUB_ENV, which is +# the same variable the CLI reads for --app-root. +# +# State is run-scoped by default: a fresh root per run means no image, kernel or +# container left by an earlier job on this persistent runner can influence this +# one. Operators who would rather keep a warm content store can point +# GH_AW_APPLE_CONTAINER_APP_ROOT at a stable directory; the isolation is then +# theirs to manage. +# +# Inputs: +# GH_AW_APPLE_CONTAINER_APP_ROOT optional override for the application root +# GH_AW_APPLE_CONTAINER_BIN optional explicit CLI path +# GH_AW_APPLE_CONTAINER_TIMEOUT optional API readiness timeout in seconds +# +# Outputs (GITHUB_ENV): +# CONTAINER_APP_ROOT, CONTAINER_LOG_ROOT, GH_AW_APPLE_CONTAINER_APP_ROOT + +set -euo pipefail + +fail() { + echo "::error::$1" + exit 1 +} + +CONTAINER_BIN="${GH_AW_APPLE_CONTAINER_BIN:-}" +if [[ -z "${CONTAINER_BIN}" ]]; then + CONTAINER_BIN="$(command -v container 2>/dev/null || true)" +fi +[[ -n "${CONTAINER_BIN}" && -x "${CONTAINER_BIN}" ]] || fail "the Apple container CLI was not found; the setup step must run before services are started." + +START_TIMEOUT="${GH_AW_APPLE_CONTAINER_TIMEOUT:-120}" +case "${START_TIMEOUT}" in + ''|*[!0-9]*) fail "GH_AW_APPLE_CONTAINER_TIMEOUT must be a positive integer number of seconds, got '${START_TIMEOUT}'." ;; +esac + +: "${RUNNER_TEMP:?RUNNER_TEMP is required}" + +# Run-scoped default. GITHUB_RUN_ID/ATTEMPT are always set in Actions; the job +# name is included so two jobs of the same run on the same runner cannot collide. +run_scope="${GITHUB_RUN_ID:-local}-${GITHUB_RUN_ATTEMPT:-1}-${GITHUB_JOB:-agent}" +run_scope="$(printf '%s' "${run_scope}" | tr -c 'A-Za-z0-9._-' '-')" + +APP_ROOT="${GH_AW_APPLE_CONTAINER_APP_ROOT:-}" +APP_ROOT_IS_SHARED=true +if [[ -z "${APP_ROOT}" ]]; then + APP_ROOT="${RUNNER_TEMP}/gh-aw/apple-container/${run_scope}/app-root" + APP_ROOT_IS_SHARED=false +fi +LOG_ROOT="${APP_ROOT}/logs" + +mkdir -p "${APP_ROOT}" "${LOG_ROOT}" +# The content store and every VM bundle live here. 0700 keeps another local +# account on a shared Mac from reading or planting image content. +chmod 700 "${APP_ROOT}" + +# realpath is not on stock macOS; resolve through the shell instead so the +# exported root is absolute and symlink-free. This matters because /tmp and +# /var are symlinks into /private on macOS, and a root recorded as /tmp/... but +# reported by the service as /private/tmp/... would fail the consistency check +# below for no real reason. +APP_ROOT="$(cd "${APP_ROOT}" && pwd -P)" +LOG_ROOT="$(cd "${LOG_ROOT}" && pwd -P)" + +echo "::group::Start Apple container services" +echo "app root: ${APP_ROOT}" +echo "log root: ${LOG_ROOT}" +if [[ "${APP_ROOT_IS_SHARED}" == "true" ]]; then + echo "::warning::GH_AW_APPLE_CONTAINER_APP_ROOT is set, so Apple Container state is shared across runs on this runner. Run isolation of the image store and container state is the operator's responsibility." +fi + +export CONTAINER_APP_ROOT="${APP_ROOT}" +export CONTAINER_LOG_ROOT="${LOG_ROOT}" + +status_json() { + "${CONTAINER_BIN}" system status --format json 2>/dev/null || true +} + +service_running() { + # `container system status` exits non-zero when the API server is not + # reachable, so the exit status is the signal. The JSON body is only used for + # diagnostics. + "${CONTAINER_BIN}" system status >/dev/null 2>&1 +} + +if service_running; then + echo "container system services are already running; reusing them" +else + echo "starting container system services (kernel install enabled, timeout ${START_TIMEOUT}s)" + # --enable-kernel-install is not optional here. Without it the CLI prompts on + # stdin for permission to fetch the default kernel; a headless runner has no + # stdin, and the process would block until the step is cancelled. + # + # Output is captured so a launchd registration failure can be reported with + # its own message plus the actionable cause, instead of being buried in the + # step log. + start_log="${RUNNER_TEMP}/gh-aw/apple-container-start.log" + mkdir -p "$(dirname "${start_log}")" + if ! "${CONTAINER_BIN}" system start \ + --app-root "${APP_ROOT}" \ + --log-root "${LOG_ROOT}" \ + --enable-kernel-install \ + --timeout "${START_TIMEOUT}" >"${start_log}" 2>&1; then + echo "--- container system start output ---" + cat "${start_log}" || true + echo "-------------------------------------" + if grep -qiE 'bootstrap|launchd|domain|Load failed|5: Input/output error' "${start_log}"; then + fail "'container system start' could not register com.apple.container.apiserver with launchd. This is the known headless failure: the service is a per-user LaunchAgent and needs a real user (Aqua) session. Install the Actions runner with ./svc.sh install under an auto-logged-in account rather than as a LaunchDaemon or over SSH." + fi + fail "'container system start' failed; see the captured output above." + fi + cat "${start_log}" || true +fi + +# Readiness gate. `container system start --timeout` already waits, but a +# service that reports started and then dies still has to be caught before AWF +# is invoked, so status is polled independently. +deadline=$(( $(date +%s) + START_TIMEOUT )) +until service_running; do + if (( $(date +%s) >= deadline )); then + echo "--- container system status ---" + "${CONTAINER_BIN}" system status || true + echo "-------------------------------" + fail "Apple container services did not become healthy within ${START_TIMEOUT}s ('container system status' never succeeded)." + fi + sleep 2 +done + +echo "container system status:" +status_json | head -40 || true +"${CONTAINER_BIN}" system status || true + +# A default kernel must exist or every `container create` fails late with +# "No default kernel configured." There is no read-only query for it in this CLI +# range (`container system kernel` exposes only `set`), so the start output is +# the signal: --enable-kernel-install installs it silently when missing, and +# anything else is repaired here rather than surfacing during agent launch. +if [[ -f "${RUNNER_TEMP}/gh-aw/apple-container-start.log" ]] && + grep -qi 'no default kernel configured' "${RUNNER_TEMP}/gh-aw/apple-container-start.log"; then + echo "no default kernel was configured; installing the recommended kernel" + "${CONTAINER_BIN}" system kernel set --recommended --arch arm64 || + fail "'container system kernel set --recommended' failed. Every 'container create' needs a default kernel; check the runner's network access to Apple's kernel download endpoint." +fi + +echo "::endgroup::" + +# Export the roots so the AWF invocation, the image pull step and the teardown +# step all address the same store. Without this the pull step would populate a +# run-scoped store while AWF read the user default store, and --skip-pull +# verification would fail on an image that had in fact just been pulled. +if [[ -n "${GITHUB_ENV:-}" ]]; then + { + echo "CONTAINER_APP_ROOT=${APP_ROOT}" + echo "CONTAINER_LOG_ROOT=${LOG_ROOT}" + echo "GH_AW_APPLE_CONTAINER_APP_ROOT=${APP_ROOT}" + echo "GH_AW_APPLE_CONTAINER_BIN=${CONTAINER_BIN}" + } >> "${GITHUB_ENV}" +fi + +echo "Apple container services ready" diff --git a/actions/setup/sh/apple_container_teardown.sh b/actions/setup/sh/apple_container_teardown.sh new file mode 100644 index 00000000000..cf8be02bada --- /dev/null +++ b/actions/setup/sh/apple_container_teardown.sh @@ -0,0 +1,113 @@ +#!/usr/bin/env bash +set +o histexpand + +# apple_container_teardown.sh - Collect diagnostics and release Apple Container +# state after the agent has run. +# +# This runs with if: always() so a cancelled or failed job does not leave a VM +# running, a launchd service bound to a directory that is about to be deleted, or +# a run-scoped application root sitting on a persistent runner. +# +# Ordering matters: containers are stopped before the service, and the service is +# stopped before the application root is removed. Stopping the service last would +# leave the API server holding a deleted content store, which surfaces on the +# *next* job as an unexplained failure. +# +# Nothing here is fatal. A teardown failure must not mask the agent's own result, +# so every command is tolerated and reported rather than propagated. +# +# Inputs: +# GH_AW_APPLE_CONTAINER_BIN CLI path (exported by the setup step) +# GH_AW_APPLE_CONTAINER_APP_ROOT application root (exported by the start step) +# GH_AW_APPLE_CONTAINER_PRESERVE when "true", keep state for inspection + +set -uo pipefail + +CONTAINER_BIN="${GH_AW_APPLE_CONTAINER_BIN:-}" +if [[ -z "${CONTAINER_BIN}" ]]; then + CONTAINER_BIN="$(command -v container 2>/dev/null || true)" +fi + +if [[ -z "${CONTAINER_BIN}" || ! -x "${CONTAINER_BIN}" ]]; then + echo "Apple container CLI not present; nothing to tear down" + exit 0 +fi + +APP_ROOT="${GH_AW_APPLE_CONTAINER_APP_ROOT:-${CONTAINER_APP_ROOT:-}}" +PRESERVE="${GH_AW_APPLE_CONTAINER_PRESERVE:-false}" + +echo "::group::Apple Container diagnostics" +echo "--- container system status ---" +"${CONTAINER_BIN}" system status 2>&1 | head -40 || true +echo "--- containers ---" +# `container list --all` output is metadata only. Deliberately no `inspect`: +# inspect output carries initProcess.environment, and this step's output is +# captured into the job log and can be uploaded as an artifact. +"${CONTAINER_BIN}" list --all 2>&1 | head -40 || true +echo "--- system logs (last 5m) ---" +"${CONTAINER_BIN}" system logs --last 5m 2>&1 | tail -100 || true +echo "::endgroup::" + +if [[ "${PRESERVE}" == "true" ]]; then + echo "::warning::GH_AW_APPLE_CONTAINER_PRESERVE=true; leaving Apple Container services and state in place for inspection" + exit 0 +fi + +echo "::group::Apple Container teardown" + +# Stop then delete every container this run left behind, so the service has no +# live guest when it is stopped. +container_ids="$("${CONTAINER_BIN}" list --all --quiet 2>/dev/null || true)" +if [[ -n "${container_ids}" ]]; then + while IFS= read -r cid; do + [[ -n "${cid}" ]] || continue + echo "stopping container ${cid}" + "${CONTAINER_BIN}" stop "${cid}" >/dev/null 2>&1 || true + "${CONTAINER_BIN}" delete --force "${cid}" >/dev/null 2>&1 || true + done <<<"${container_ids}" +else + echo "no containers to remove" +fi + +echo "stopping container system services" +"${CONTAINER_BIN}" system stop >/dev/null 2>&1 || echo "::warning::'container system stop' failed; the launchd service may still be running" + +# Only a run-scoped root is removed. A root the operator pointed at a stable +# directory via GH_AW_APPLE_CONTAINER_APP_ROOT is theirs, and deleting it would +# destroy a warm content store they deliberately chose to keep. +# +# The start step resolves the root with `pwd -P`, so the prefix is compared +# against the physical RUNNER_TEMP as well. On macOS /tmp and /var are symlinks +# into /private, and comparing the logical paths would silently classify a +# run-scoped root as operator-managed and leak it onto the persistent runner. +run_scoped=false +if [[ -n "${APP_ROOT}" && -n "${RUNNER_TEMP:-}" ]]; then + # Reject any path containing a traversal component before it is prefix-matched. + # The start step normalises the root with `pwd -P` before exporting it, but if + # that step died before writing $GITHUB_ENV this falls back to the raw + # operator-supplied GH_AW_APPLE_CONTAINER_APP_ROOT, which has not been + # normalised — and a value like "${RUNNER_TEMP}/gh-aw/apple-container/x/../../.." + # would satisfy the prefix test below and then be handed to rm -rf. + case "${APP_ROOT}" in + *..*) echo "::warning::refusing to remove application root containing '..': ${APP_ROOT}" ;; + *) + runner_temp_physical="${RUNNER_TEMP}" + if [[ -d "${RUNNER_TEMP}" ]]; then + runner_temp_physical="$(cd "${RUNNER_TEMP}" && pwd -P)" + fi + case "${APP_ROOT}" in + "${RUNNER_TEMP}"/gh-aw/apple-container/*) run_scoped=true ;; + "${runner_temp_physical}"/gh-aw/apple-container/*) run_scoped=true ;; + esac + ;; + esac +fi + +if [[ "${run_scoped}" == "true" ]]; then + echo "removing run-scoped application root ${APP_ROOT}" + rm -rf "${APP_ROOT}" || echo "::warning::could not remove ${APP_ROOT}" +elif [[ -n "${APP_ROOT}" ]]; then + echo "application root ${APP_ROOT} is operator-managed; leaving it in place" +fi + +echo "::endgroup::" diff --git a/actions/setup/sh/check_mcp_servers.sh b/actions/setup/sh/check_mcp_servers.sh index c33d96b3e17..ac3222540e9 100755 --- a/actions/setup/sh/check_mcp_servers.sh +++ b/actions/setup/sh/check_mcp_servers.sh @@ -17,10 +17,20 @@ set +o histexpand set -e # Timing helper functions +# `date +%s%3N` is GNU coreutils only; BSD date (macOS, where self-hosted Apple +# Container runners live) has no %N and would emit a literal "3N", breaking every +# timing arithmetic expression below. +if [ "$(date +%3N 2>/dev/null)" = "3N" ] || ! date +%s%3N >/dev/null 2>&1; then + now_ms() { echo "$(($(date +%s) * 1000))"; } +else + now_ms() { date +%s%3N; } +fi + print_timing() { local start_time=$1 local label=$2 - local end_time=$(date +%s%3N) + local end_time + end_time=$(now_ms) local duration=$((end_time - start_time)) echo "⏱️ TIMING: $label took ${duration}ms" } @@ -70,13 +80,13 @@ is_optional_server() { } # Start overall timing -SCRIPT_START_TIME=$(date +%s%3N) +SCRIPT_START_TIME=$(now_ms) echo "Checking MCP servers..." echo "" # Validate configuration file exists -CONFIG_VALIDATION_START=$(date +%s%3N) +CONFIG_VALIDATION_START=$(now_ms) if [ ! -f "$GATEWAY_CONFIG_PATH" ]; then echo "ERROR: Gateway configuration file not found: ${GATEWAY_CONFIG_PATH@Q}" >&2 exit 1 @@ -119,7 +129,7 @@ MAX_RETRIES=3 # Iterate through each server while IFS= read -r SERVER_NAME; do SERVERS_CHECKED=$((SERVERS_CHECKED + 1)) - SERVER_START_TIME=$(date +%s%3N) + SERVER_START_TIME=$(now_ms) # Extract server configuration SERVER_CONFIG=$(echo "$MCP_SERVERS" | jq -r ".\"$SERVER_NAME\"" 2>/dev/null) @@ -142,13 +152,32 @@ while IFS= read -r SERVER_NAME; do # Extract server URL (should be HTTP URL pointing to gateway) SERVER_URL=$(echo "$SERVER_CONFIG" | jq -r '.url // empty' 2>/dev/null) - + if [ -z "$SERVER_URL" ] || [ "$SERVER_URL" = "null" ]; then echo "⚠ $SERVER_NAME: skipped (not HTTP)" SERVERS_SKIPPED=$((SERVERS_SKIPPED + 1)) continue fi - + + # Re-anchor the URL on the caller-supplied GATEWAY_URL origin, keeping only the + # path from the gateway's own output. + # + # The gateway writes URLs using the port it listens on INSIDE its container, + # which is not necessarily the port it was published on: under the + # apple-container runtime the gateway is published on 127.0.0.1:9100 but + # reports 8080. These requests carry the gateway API key in an Authorization + # header, so probing the reported address would send that credential to + # whichever local process owns that port on a long-lived self-hosted runner. + # Only the origin gh-aw published is ever contacted. + if [ -n "$GATEWAY_URL" ]; then + SERVER_PATH="${SERVER_URL#*://}" + case "$SERVER_PATH" in + */*) SERVER_PATH="/${SERVER_PATH#*/}" ;; + *) SERVER_PATH="/" ;; + esac + SERVER_URL="${GATEWAY_URL%/}${SERVER_PATH}" + fi + # Extract authentication headers from gateway configuration AUTH_HEADER="" if echo "$SERVER_CONFIG" | jq -e '.headers.Authorization' >/dev/null 2>&1; then diff --git a/actions/setup/sh/compute_artifact_prefix.sh b/actions/setup/sh/compute_artifact_prefix.sh index c1aa0d5d7d9..b847202c2db 100644 --- a/actions/setup/sh/compute_artifact_prefix.sh +++ b/actions/setup/sh/compute_artifact_prefix.sh @@ -53,7 +53,17 @@ echo " Inputs JSON length: ${#INPUTS} chars" # string values), so different inputs cannot produce the same pre-hash string # as each other or as a different run attempt. HASH_INPUT="${INPUTS}::attempt=${ATTEMPT}" -PREFIX=$(printf '%s' "$HASH_INPUT" | sha256sum | cut -c1-8) +# sha256sum is GNU coreutils and is absent on macOS, where self-hosted runners +# host the apple-container runtime. shasum ships with macOS and produces the +# identical digest, so the computed prefix is stable across platforms. +if command -v sha256sum >/dev/null 2>&1; then + PREFIX=$(printf '%s' "$HASH_INPUT" | sha256sum | cut -c1-8) +elif command -v shasum >/dev/null 2>&1; then + PREFIX=$(printf '%s' "$HASH_INPUT" | shasum -a 256 | cut -c1-8) +else + echo "ERROR: neither sha256sum nor shasum is available" >&2 + exit 1 +fi echo " SHA256 digest (first 8 chars): ${PREFIX}" echo " Artifact prefix: ${PREFIX}-" diff --git a/actions/setup/sh/download_docker_images.sh b/actions/setup/sh/download_docker_images.sh index 5d06e692dab..0145a9049a6 100755 --- a/actions/setup/sh/download_docker_images.sh +++ b/actions/setup/sh/download_docker_images.sh @@ -25,6 +25,45 @@ set +o histexpand set -euo pipefail +# GNU coreutils `timeout` is not present on macOS, where self-hosted runners host +# the apple-container runtime's Docker infrastructure. Resolve an implementation +# once, preferring the real thing (`timeout`, or Homebrew coreutils' `gtimeout`) +# and falling back to a plain watchdog so the pull is still bounded. +# +# The exit status contract is preserved in every branch: 124 means the deadline +# was hit, which the retry loop below reports as a timeout rather than a +# transient failure. +PULL_TIMEOUT_SECONDS="${GH_AW_DOCKER_PULL_TIMEOUT_SECONDS:-300}" + +if command -v timeout >/dev/null 2>&1; then + pull_with_deadline() { timeout "${PULL_TIMEOUT_SECONDS}" docker pull --quiet "$1" 2>&1; } +elif command -v gtimeout >/dev/null 2>&1; then + pull_with_deadline() { gtimeout "${PULL_TIMEOUT_SECONDS}" docker pull --quiet "$1" 2>&1; } +else + pull_with_deadline() { + local image="$1" pull_pid watchdog_pid status + docker pull --quiet "$image" 2>&1 & + pull_pid=$! + ( sleep "${PULL_TIMEOUT_SECONDS}"; kill -TERM "$pull_pid" 2>/dev/null ) & + watchdog_pid=$! + if wait "$pull_pid"; then + status=0 + else + status=$? + fi + kill -TERM "$watchdog_pid" 2>/dev/null || true + wait "$watchdog_pid" 2>/dev/null || true + # A SIGTERM'd child reports 143; translate it to the `timeout` convention so + # the caller's timeout branch stays correct on every platform. + if [ "$status" -eq 143 ]; then + return 124 + fi + return "$status" + } +fi +export PULL_TIMEOUT_SECONDS +export -f pull_with_deadline + # Helper function to pull Docker images with retry logic docker_pull_with_retry() { local image="$1" @@ -34,7 +73,7 @@ docker_pull_with_retry() { for attempt in $(seq 1 $max_attempts); do echo "Attempt $attempt of $max_attempts: Pulling $image..." - if timeout 5m docker pull --quiet "$image" 2>&1; then + if pull_with_deadline "$image"; then echo "Successfully pulled $image" # When pulling with a digest pin, Docker may not create a digest-free @@ -78,7 +117,7 @@ docker_pull_with_retry() { # Timeout produces exit code 124 if [ $exit_code -eq 124 ]; then - echo "docker pull timed out for $image after 5 minutes" + echo "docker pull timed out for $image after ${PULL_TIMEOUT_SECONDS}s" return 1 fi diff --git a/actions/setup/sh/install_awf_binary.sh b/actions/setup/sh/install_awf_binary.sh index e9db03ca777..c0cebbc91b0 100755 --- a/actions/setup/sh/install_awf_binary.sh +++ b/actions/setup/sh/install_awf_binary.sh @@ -91,8 +91,21 @@ fi # from earlier jobs on the same runner. Limit cleanup to directories owned by # root or the current runner user so we do not delete unrelated /tmp entries # that happen to match the name pattern. -echo "Cleaning up stale AWF chroot directories..." -if command -v sudo >/dev/null 2>&1; then +# Clean up any stale AWF chroot directories left by previous runs before we +# execute awf. Rootless AWF can fail its writeConfigs startup path with EACCES +# when stale /tmp/awf-*-chroot-home or /tmp/awf-chroot-* directories remain +# from earlier jobs on the same runner. Limit cleanup to directories owned by +# root or the current runner user so we do not delete unrelated /tmp entries +# that happen to match the name pattern. +# +# Skipped entirely on macOS: the chroot sysroot is a Linux-container concept and +# is never created there. Running it anyway would invoke sudo on a self-hosted +# Mac that may have no passwordless sudo, emitting a confusing prompt-failure +# diagnostic for a cleanup that had nothing to clean. +if [ "$OS" = "Darwin" ]; then + echo "Skipping stale AWF chroot cleanup (not applicable on macOS)" +elif command -v sudo >/dev/null 2>&1; then + echo "Cleaning up stale AWF chroot directories..." sudo find /tmp -maxdepth 1 -name 'awf-*-chroot-home' -type d \( -user root -o -user "$(id -un)" \) -exec rm -rf -- {} + || true sudo find /tmp -maxdepth 1 -name 'awf-chroot-*' -type d \( -user root -o -user "$(id -un)" \) -exec rm -rf -- {} + || true else @@ -232,12 +245,20 @@ install_darwin_binary() { *) echo "ERROR: Unsupported macOS architecture: ${ARCH}"; exit 1 ;; esac - echo "Note: AWF uses iptables for network firewalling, which is not available on macOS." - echo " The AWF CLI will be installed but container-based firewalling will not work natively." + # macOS is a supported AWF host for the apple-container runtime, where the + # agent runs in an Apple Virtualization.framework VM and Squid, the API proxy + # and the CLI proxy run under Docker Compose. There is no iptables path there, + # and none is needed: the guest has no NIC at all. + # + # For every other runtime macOS remains unsupported, because those depend on + # Linux container networking. AWF itself fails preflight in that case. + echo "Installing the macOS ${ARCH} AWF binary (${awf_binary})." + echo "Note: on macOS, only the apple-container runtime is supported; the Linux" + echo " iptables-based runtimes cannot run here." echo "" local binary_url="${BASE_URL}/${awf_binary}" - echo "Downloading binary from ${binary_url@Q}..." + echo "Downloading binary from ${binary_url}..." curl -fsSL --retry 5 --retry-delay 10 --retry-max-time 180 --retry-all-errors -o "${TEMP_DIR}/${awf_binary}" "${binary_url}" # Verify checksum diff --git a/actions/setup/sh/resolve_docker_socket_gid.sh b/actions/setup/sh/resolve_docker_socket_gid.sh index 59478043da1..d56bfe8f308 100755 --- a/actions/setup/sh/resolve_docker_socket_gid.sh +++ b/actions/setup/sh/resolve_docker_socket_gid.sh @@ -48,8 +48,10 @@ fi # Resolve the Docker socket group. GH_AW_DOCKER_SOCK_GID takes precedence, letting # operators supply the group directly. stat -Lc follows symlinks so a symlinked socket # resolves to the real socket's group without requiring a matching chown -h on the link. -# Note: stat -Lc is GNU coreutils (Linux only). macOS self-hosted runners must set -# GH_AW_DOCKER_SOCK_GID explicitly to bypass stat. +# stat -Lc is GNU coreutils; BSD stat (macOS) spells the same query stat -Lf '%g', so +# both are tried before giving up. Automatic discovery therefore works on a +# self-hosted Mac too, and GH_AW_DOCKER_SOCK_GID is only needed where neither can +# see the socket (split-daemon / ARC-DinD setups). # Fail loudly instead of silently falling back to group 0 (root): passing --group-add 0 # to a non-root container gives no Docker-socket access and produces a confusing # downstream "Docker daemon is not accessible" error. @@ -57,6 +59,9 @@ if [ -n "${GH_AW_DOCKER_SOCK_GID:-}" ]; then DOCKER_SOCK_GID="$GH_AW_DOCKER_SOCK_GID" else DOCKER_SOCK_GID=$(stat -Lc '%g' "$DOCKER_SOCK_PATH" 2>/dev/null || true) + if [ -z "$DOCKER_SOCK_GID" ]; then + DOCKER_SOCK_GID=$(stat -Lf '%g' "$DOCKER_SOCK_PATH" 2>/dev/null || true) + fi if [ -z "$DOCKER_SOCK_GID" ]; then echo "::error::Cannot determine Docker socket group for '$DOCKER_SOCK_PATH'. Set GH_AW_DOCKER_SOCK_PATH and GH_AW_DOCKER_SOCK_GID to configure the socket path and group explicitly." >&2 [ -e "$DOCKER_SOCK_PATH" ] || echo "::warning::'$DOCKER_SOCK_PATH' does not exist on this runner." >&2 diff --git a/actions/setup/sh/start_mcp_gateway.sh b/actions/setup/sh/start_mcp_gateway.sh index e5a1fb09869..6863a27ece7 100755 --- a/actions/setup/sh/start_mcp_gateway.sh +++ b/actions/setup/sh/start_mcp_gateway.sh @@ -17,10 +17,29 @@ set -e umask 077 # Timing helper functions +# +# `date +%s%3N` is GNU coreutils only: BSD date (macOS, where self-hosted Apple +# Container runners live) does not implement %N and would emit a literal "3N", +# turning every timing arithmetic expression into a syntax error. Resolve a +# millisecond clock once, falling back to whole seconds scaled to milliseconds. +if [ "$(date +%3N 2>/dev/null)" = "3N" ] || ! date +%s%3N >/dev/null 2>&1; then + now_ms() { echo "$(($(date +%s) * 1000))"; } +else + now_ms() { date +%s%3N; } +fi + +# MCP_GATEWAY_HOST_PORT is the port the gateway container is published on for +# host-side consumers. It equals MCP_GATEWAY_PORT for every runtime except +# apple-container, where AWF relays a distinct macOS loopback port into the +# NIC-less guest. Defaulted here so the script stays correct if an older caller +# does not export it. +: "${MCP_GATEWAY_HOST_PORT:=${MCP_GATEWAY_PORT}}" + print_timing() { local start_time=$1 local label=$2 - local end_time=$(date +%s%3N) + local end_time + end_time=$(now_ms) local duration=$((end_time - start_time)) echo "⏱️ TIMING: $label took ${duration}ms" } @@ -114,11 +133,11 @@ if ! echo "$MCP_GATEWAY_DOCKER_COMMAND" | grep -qE -- '--network'; then fi # Start overall timing -SCRIPT_START_TIME=$(date +%s%3N) +SCRIPT_START_TIME=$(now_ms) # Read MCP configuration from stdin echo "Reading MCP configuration from stdin..." -CONFIG_READ_START=$(date +%s%3N) +CONFIG_READ_START=$(now_ms) MCP_CONFIG=$(cat) print_timing $CONFIG_READ_START "Configuration read from stdin" echo "" @@ -128,7 +147,7 @@ echo "MCP configuration received; contents withheld because it may contain crede echo "" # Validate configuration is valid JSON -CONFIG_VALIDATION_START=$(date +%s%3N) +CONFIG_VALIDATION_START=$(now_ms) if ! echo "$MCP_CONFIG" | jq empty 2>/tmp/gh-aw/mcp-config/jq-error.log; then echo "ERROR: Configuration is not valid JSON" echo "" @@ -184,7 +203,7 @@ echo "" # Start gateway process with container echo "Starting gateway container..." echo "" -GATEWAY_START_TIME=$(date +%s%3N) +GATEWAY_START_TIME=$(now_ms) # Note: MCP_GATEWAY_DOCKER_COMMAND is the full docker command with all flags, mounts, and image # Pass MCP_GATEWAY_LOG_DIR to the container via -e flag echo "$MCP_CONFIG" | MCP_GATEWAY_LOG_DIR="$MCP_GATEWAY_LOG_DIR" $MCP_GATEWAY_DOCKER_COMMAND \ @@ -222,14 +241,14 @@ echo "" # Note: Gateway may take 40-50 seconds when starting multiple MCP servers # (e.g., serena alone takes ~22 seconds to start) echo "Waiting for gateway to be ready..." -HEALTH_CHECK_START=$(date +%s%3N) +HEALTH_CHECK_START=$(now_ms) # Use localhost for health check since: # 1. This script runs on the host (not in a container) # 2. The gateway uses --network host, so it's accessible on localhost # Note: MCP_GATEWAY_DOMAIN may be set to host.docker.internal for use by containers, # but the health check should always use localhost since we're running on the host. HEALTH_CHECK_HOST="localhost" -echo "Health endpoint: http://${HEALTH_CHECK_HOST}:${MCP_GATEWAY_PORT}/health" +echo "Health endpoint: http://${HEALTH_CHECK_HOST}:${MCP_GATEWAY_HOST_PORT}/health" echo "(Note: MCP_GATEWAY_DOMAIN is '${MCP_GATEWAY_DOMAIN}' for container access)" echo "Retrying up to 120 times with exponential backoff (250ms to 1s, ~120s total timeout)" echo "" @@ -249,10 +268,10 @@ CURL_EXIT_CODE=1 echo "=== Health Check Progress ===" while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do RETRY_COUNT=$((RETRY_COUNT + 1)) - RETRY_START=$(date +%s%3N) + RETRY_START=$(now_ms) # Calculate elapsed time since health check started - ELAPSED_MS=$(($(date +%s%3N) - HEALTH_CHECK_START)) + ELAPSED_MS=$(($(now_ms) - HEALTH_CHECK_START)) ELAPSED_SEC=$((ELAPSED_MS / 1000)) if [ $((RETRY_COUNT % 10)) -eq 1 ] || [ $RETRY_COUNT -eq 1 ]; then @@ -260,7 +279,7 @@ while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do fi # Try to connect to health endpoint - RESPONSE=$(curl -s --max-time 2 --connect-timeout 1 -w "\n%{http_code}" "http://${HEALTH_CHECK_HOST}:${MCP_GATEWAY_PORT}/health" 2>&1) + RESPONSE=$(curl -s --max-time 2 --connect-timeout 1 -w "\n%{http_code}" "http://${HEALTH_CHECK_HOST}:${MCP_GATEWAY_HOST_PORT}/health" 2>&1) CURL_EXIT_CODE=$? # Parse response @@ -335,7 +354,7 @@ echo "" # Wait for gateway output (rewritten configuration) echo "Reading gateway output configuration..." -OUTPUT_WAIT_START=$(date +%s%3N) +OUTPUT_WAIT_START=$(now_ms) WAIT_ATTEMPTS=10 WAIT_ATTEMPT=0 while [ $WAIT_ATTEMPT -lt $WAIT_ATTEMPTS ]; do @@ -373,7 +392,7 @@ fi # Convert gateway output to agent-specific format echo "Converting gateway configuration to agent format..." -CONFIG_CONVERT_START=$(date +%s%3N) +CONFIG_CONVERT_START=$(now_ms) export MCP_GATEWAY_OUTPUT=/tmp/gh-aw/mcp-config/gateway-output.json # Validate MCP_GATEWAY_API_KEY is set (required by converter scripts) @@ -450,12 +469,12 @@ echo "" # Check MCP server functionality echo "Checking MCP server functionality..." -MCP_CHECK_START=$(date +%s%3N) +MCP_CHECK_START=$(now_ms) if [ -f ${RUNNER_TEMP}/gh-aw/actions/check_mcp_servers.sh ]; then echo "Running MCP server checks..." if ! bash ${RUNNER_TEMP}/gh-aw/actions/check_mcp_servers.sh \ /tmp/gh-aw/mcp-config/gateway-output.json \ - "http://localhost:${MCP_GATEWAY_PORT}" \ + "http://localhost:${MCP_GATEWAY_HOST_PORT}" \ "${MCP_GATEWAY_API_KEY}"; then echo "ERROR: MCP server checks failed - no servers could be connected" echo "Gateway process will be terminated" @@ -496,7 +515,7 @@ fi echo "" echo "MCP gateway is running:" -echo " - From host: http://localhost:${MCP_GATEWAY_PORT}" +echo " - From host: http://localhost:${MCP_GATEWAY_HOST_PORT}" echo " - From containers: http://${MCP_GATEWAY_DOMAIN}:${MCP_GATEWAY_PORT}" echo "Gateway PID: $GATEWAY_PID" @@ -508,6 +527,7 @@ echo "" { echo "gateway-pid=$GATEWAY_PID" echo "gateway-port=${MCP_GATEWAY_PORT}" + echo "gateway-host-port=${MCP_GATEWAY_HOST_PORT}" echo "gateway-api-key=${MCP_GATEWAY_API_KEY}" echo "gateway-domain=${MCP_GATEWAY_DOMAIN}" } >> "$GITHUB_OUTPUT" diff --git a/actions/setup/sh/stop_mcp_gateway.sh b/actions/setup/sh/stop_mcp_gateway.sh index c6827425c36..700b7a46be3 100755 --- a/actions/setup/sh/stop_mcp_gateway.sh +++ b/actions/setup/sh/stop_mcp_gateway.sh @@ -45,11 +45,26 @@ fi # - Gracefully terminates containers and cleans up resources if [ -n "$MCP_GATEWAY_PORT" ] && [ -n "$MCP_GATEWAY_API_KEY" ]; then echo "Attempting graceful shutdown via /close endpoint..." - - # Use localhost for health check since: - # 1. This script runs on the host (not in a container) - # 2. The gateway uses --network host, so it's accessible on localhost - CLOSE_URL="http://localhost:${MCP_GATEWAY_PORT}/close" + + # Address the port gh-aw actually PUBLISHED the gateway on, not the port the + # gateway listens on inside its container. Those differ under the + # apple-container runtime (published 9100 -> container 8080), and this request + # carries MCP_GATEWAY_API_KEY in an Authorization header: sending it to a port + # gh-aw does not own would hand the gateway credential to whatever local + # process happens to be listening there. On a long-lived self-hosted runner + # that is a realistic local-foothold-to-credential-theft path, and `curl -f` + # failures here are tolerated, so it would be silent. + gateway_host_port="${MCP_GATEWAY_HOST_PORT:-$MCP_GATEWAY_PORT}" + case "$gateway_host_port" in + ''|*[!0-9]*) + echo "Refusing to send the gateway API key: MCP_GATEWAY_HOST_PORT='${gateway_host_port}' is not a port number" + gateway_host_port="" + ;; + esac +fi + +if [ -n "${gateway_host_port:-}" ] && [ -n "$MCP_GATEWAY_API_KEY" ]; then + CLOSE_URL="http://127.0.0.1:${gateway_host_port}/close" # Try to invoke the /close endpoint (with timeout) # Per spec, the endpoint requires Authorization header with the API key diff --git a/actions/setup/sh/verify_mcp_gateway_health.sh b/actions/setup/sh/verify_mcp_gateway_health.sh index f6fee521b95..6f921af0b24 100755 --- a/actions/setup/sh/verify_mcp_gateway_health.sh +++ b/actions/setup/sh/verify_mcp_gateway_health.sh @@ -7,10 +7,22 @@ set +o histexpand set -e # Timing helper functions +# +# `date +%s%3N` is GNU coreutils only: BSD date (macOS, where self-hosted Apple +# Container runners live) does not implement %N and would emit a literal "3N", +# turning every timing arithmetic expression into a syntax error. Resolve a +# millisecond clock once, falling back to whole seconds scaled to milliseconds. +if [ "$(date +%3N 2>/dev/null)" = "3N" ] || ! date +%s%3N >/dev/null 2>&1; then + now_ms() { echo "$(($(date +%s) * 1000))"; } +else + now_ms() { date +%s%3N; } +fi + print_timing() { local start_time=$1 local label=$2 - local end_time=$(date +%s%3N) + local end_time + end_time=$(now_ms) local duration=$((end_time - start_time)) echo "⏱️ TIMING: $label took ${duration}ms" } @@ -36,7 +48,7 @@ mcp_config_path="$2" logs_folder="$3" # Start overall timing -SCRIPT_START_TIME=$(date +%s%3N) +SCRIPT_START_TIME=$(now_ms) echo 'Waiting for MCP Gateway to be ready...' echo '' @@ -61,7 +73,7 @@ echo '' # Wait for gateway to be ready FIRST before checking config echo '=== Testing Gateway Health ===' -HEALTH_CHECK_START=$(date +%s%3N) +HEALTH_CHECK_START=$(now_ms) # Capture both response body and HTTP code with custom retry loop echo "Calling health endpoint: ${gateway_url}/health" @@ -80,7 +92,7 @@ while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do RETRY_COUNT=$((RETRY_COUNT + 1)) # Calculate elapsed time since health check started - ELAPSED_MS=$(($(date +%s%3N) - HEALTH_CHECK_START)) + ELAPSED_MS=$(($(now_ms) - HEALTH_CHECK_START)) ELAPSED_SEC=$((ELAPSED_MS / 1000)) # Show progress every 10 retries or on first attempt @@ -150,7 +162,7 @@ echo '' # Now that gateway is ready, check the config file echo '=== MCP Configuration File ===' -CONFIG_CHECK_START=$(date +%s%3N) +CONFIG_CHECK_START=$(now_ms) if [ -f "$mcp_config_path" ]; then echo "✓ Config file exists at: $mcp_config_path" echo "File size: $(stat -f%z "$mcp_config_path" 2>/dev/null || stat -c%s "$mcp_config_path" 2>/dev/null || echo 'unknown') bytes" @@ -190,7 +202,7 @@ echo '' # Test MCP server connectivity through gateway echo '=== Testing MCP Server Connectivity ===' -CONNECTIVITY_TEST_START=$(date +%s%3N) +CONNECTIVITY_TEST_START=$(now_ms) # Extract first external MCP server name from config (excluding safeinputs/safeoutputs) mcp_server=$(jq -r '.mcpServers | to_entries[] | select(.key != "safeinputs" and .key != "safeoutputs") | .key' "$mcp_config_path" | head -n 1) diff --git a/docs/src/content/docs/reference/agent-runtimes.md b/docs/src/content/docs/reference/agent-runtimes.md index 7af80e8f12a..dbb536c5295 100644 --- a/docs/src/content/docs/reference/agent-runtimes.md +++ b/docs/src/content/docs/reference/agent-runtimes.md @@ -15,8 +15,8 @@ These similarly named fields control different layers: | Field | Purpose | Values covered here | | --- | --- | --- | -| `sandbox.agent.runtime` | Selects the isolation backend for the main agent | `docker`, `docker-sudo-iptables`, `gvisor`, `docker-sbx`, `cloud-hypervisor`, or omitted for Docker | -| `sandbox.agent.runtime-install` | Controls whether gh-aw installs and prepares gVisor or Docker sbx | `true` by default; `false` for a pre-provisioned runner | +| `sandbox.agent.runtime` | Selects the isolation backend for the main agent | `docker`, `docker-sudo-iptables`, `gvisor`, `docker-sbx`, `cloud-hypervisor`, `apple-container`, or omitted for Docker | +| `sandbox.agent.runtime-install` | Controls whether gh-aw installs and prepares gVisor, Docker sbx, or Apple Container | `true` by default; `false` for a pre-provisioned runner | | `runner.topology` | Describes how the runner reaches Docker | `arc-dind`, or omitted for a local Docker daemon | | `runtimes` | Installs language toolchains such as Node.js, Python, and Go | Unrelated to agent isolation | @@ -28,6 +28,7 @@ These similarly named fields control different layers: | gVisor | A `runsc` user-space kernel between the agent and host kernel | Local Docker daemon, `sudo`, systemd, and access to gVisor downloads | Stronger kernel isolation with syscall compatibility and performance overhead | | Docker sbx | A KVM-backed microVM for the agent | KVM, nested virtualization, `sudo`, apt, Docker Hub credentials, and local Docker | Strongest boundary here, but has the most setup cost and platform constraints | | Cloud Hypervisor (preview) | A KVM-backed microVM for the agent | GitHub-hosted Ubuntu x86_64 runner with `/dev/kvm` and AWF release asset download access | Preview-only path with strict host requirements and release-asset provisioning | +| Apple Container (preview) | An Apple Virtualization.framework VM with no network interfaces | Self-hosted bare-metal Apple Silicon, macOS 26+, `kern.hv_support=1`, plus Docker for infrastructure | Only macOS runtime and the strictest network boundary, but needs dedicated hardware and is unvalidated on real hardware | | ARC DinD | Standard Docker agent container in a DinD sidecar | ARC or equivalent Kubernetes runner with a privileged DinD sidecar and shared work volume | Supports Kubernetes runner fleets, but adds split-filesystem and daemon-connectivity complexity | Apply this selection order: @@ -36,13 +37,14 @@ Apply this selection order: 2. Otherwise, use **Docker sbx** when the user requires a hardware-virtualized boundary and the runner exposes working KVM. 3. Use **Cloud Hypervisor (preview)** only when the runtime must be Cloud Hypervisor and the runner is GitHub-hosted Ubuntu x86_64 with `/dev/kvm`. 4. Otherwise, use **gVisor** when untrusted agent code warrants a smaller host-kernel attack surface and the workload is compatible with `runsc`. -5. Use the default **Docker** runtime when compatibility, startup time, or runner portability is more important than an additional kernel or VM boundary. +5. Use **Apple Container (preview)** only when the workload must run on Apple Silicon macOS and a dedicated bare-metal self-hosted Mac is available. +6. Use the default **Docker** runtime when compatibility, startup time, or runner portability is more important than an additional kernel or VM boundary. If the user's requirement is unclear, prefer Docker. Do not select a stronger runtime until the runner prerequisites are known to be available. ## Requirements shared by all choices -The main agent job requires a Linux runner. macOS and Windows runners are not supported. The runner must have enough CPU, memory, and disk for the agent, AWF, the MCP gateway, proxy containers, and any configured MCP servers. +The main agent job requires a Linux runner, except for `sandbox.agent.runtime: apple-container`, which requires a self-hosted bare-metal Apple Silicon macOS runner. Windows runners are not supported. The runner must have enough CPU, memory, and disk for the agent, AWF, the MCP gateway, proxy containers, and any configured MCP servers. Docker must be reachable by the runner user. On a conventional runner, this normally means that `/var/run/docker.sock` exists and the runner user can access it. Verify the baseline before investigating a specialized runtime: @@ -296,6 +298,93 @@ AWF launches with host privileges required to create the VM, but the runtime rem > [!IMPORTANT] > This runtime is preview-only. Keep expectations aligned with AWF preview support and prefer Docker sbx or gVisor when Cloud Hypervisor host constraints are not guaranteed. +## Apple Container (preview) + +Apple Container runs the agent in an Apple Virtualization.framework VM on macOS. It is the only runtime that does not run the agent on Linux, and the only one that requires a self-hosted runner. + +```aw wrap +--- +on: issues +runs-on: [self-hosted, macOS, ARM64] +sandbox: + agent: + id: awf + runtime: apple-container + version: "v0.28.9" +--- + +Investigate this issue. +``` + +### Runner requirements + +Self-hosted bare-metal Apple Silicon only: + +- `runs-on` must list `self-hosted`, `macOS`, and `ARM64` explicitly. Extra pool labels are allowed; a runner group alone, a GitHub Actions expression, or a contradicting OS/arch label is rejected at compile time. +- macOS 26 or newer, arm64, with `sysctl kern.hv_support` reporting `1`. +- The Actions runner must run as an unprivileged user in a real user (Aqua) session — install it with `./svc.sh install` under an auto-logged-in account. `container system start` registers a per-user LaunchAgent, so a LaunchDaemon or a bare SSH session cannot start it. +- bash 4 or newer on `PATH` (`brew install bash`). macOS ships bash 3.2, which cannot run gh-aw's generated setup scripts. +- A working Docker daemon and Compose plugin. + +> [!CAUTION] +> GitHub-hosted macOS runners can never run this runtime, including the Apple Silicon `macos-*-xlarge` images. They are themselves virtual machines, report `kern.hv_support=0`, and cannot nest another hypervisor. Every `macos-*` label is rejected at compile time rather than failing late on the runner. + +### Docker is still required + +Only the agent moves into the VM. AWF keeps Squid, the API proxy, the CLI proxy, and the MCP gateway running under Docker on the host, so a Mac without Docker cannot run this runtime. + +### How the agent reaches anything + +The guest is created with `--network none` and has **zero network interfaces**. Direct IP egress, DNS, DoH, IPv6, raw sockets, and the cloud metadata address do not exist inside it. AWF bridges a fixed allowlist of services in as Unix sockets published into the VM, where a guest-side relay serves each on loopback: + +| Service | Host | Guest | +| --- | --- | --- | +| Squid (sole egress path) | `127.0.0.1:3128` | `127.0.0.1:3128` | +| API proxy (OpenAI, Anthropic, Copilot, Gemini) | `127.0.0.1:10000-10003` | same ports | +| CLI proxy | `127.0.0.1:18443` | same port | +| MCP gateway | `127.0.0.1:9100` | `127.0.0.1:8080` | + +The MCP gateway is the one asymmetric entry. gh-aw starts `awmg-mcpg` itself as a Docker container outside AWF's Compose file, so it publishes it on macOS loopback port **9100** and passes that port to AWF as `appleContainer.mcpGatewayUpstreamPort`. AWF health-probes the port, then publishes `mcp-gateway.sock` into the guest, whose relay serves it on `127.0.0.1:8080`. That guest port is compiled into both halves of AWF's transport contract, so `sandbox.mcp.port` must be left at its default; any other value is rejected at compile time. Gateway API-key authentication, allowed mount roots, and safe-output path permissions are unchanged. + +`network.topologyAttach` is never emitted for this runtime. AWF rejects it, because externally owned peers are not published to macOS loopback and cannot be bridged into a NIC-less guest. + +### Runtime provisioning + +The compiler emits four steps before AWF runs, and a teardown step after the agent: + +1. **Host preflight** — refuses an ineligible runner before anything is downloaded: runner provenance, macOS version, arm64, `kern.hv_support`, the launchd user domain, bash 4, and Docker. +2. **CLI setup** — verifies a preinstalled `container` CLI inside AWF's supported range (`>=0.4.0 <1.0.0`). If none is present and `sandbox.agent.runtime-install` is not `false`, it installs the pinned `apple/container` release, verified by SHA-256 **and** by its `Developer ID Installer: Apple Inc. - Containerization` signature before `installer` runs. Installing requires passwordless `sudo`; set `runtime-install: false` to make the step verification-only. +3. **Service start** — starts `container system start --enable-kernel-install` non-interactively (the default prompts on stdin and would hang a headless runner), gates on `container system status`, and pins one application root for the job. +4. **Image pull** — pulls the digest-pinned agent and `appleInit` images into Apple Container's store. This store is separate from Docker's, so the Docker pre-download step cannot populate it and `docker pull` cannot help. Floating references are refused. + +> [!NOTE] +> Every current `apple/container` release is 1.x, which is **outside** AWF's validated range. A major version bump may relocate the real `vminitd` inside the init image and boot a guest with no capability relay, so the pin stays on the newest 0.x release. + +Apple Container state is run-scoped by default: the application root lives under `${RUNNER_TEMP}/gh-aw/apple-container//app-root` and is removed at teardown, so nothing an earlier job left on the persistent runner can influence this one. Set `GH_AW_APPLE_CONTAINER_APP_ROOT` to keep a warm content store instead; run isolation then becomes the operator's responsibility. `CONTAINER_APP_ROOT` is exported so the service, the image pull, AWF, and teardown all address the same store. + +Teardown stops containers, stops the system services, and removes run-scoped state. Set `GH_AW_APPLE_CONTAINER_PRESERVE=true` to keep everything for inspection. + +### Images + +`sandbox.agent.images` must include the `appleInit` role whenever a manifest is present, and every reference must be digest-pinned. Publishing the AWF `apple-init` image depends on an `APPLE_VMINIT_IMAGE` repository variable on the `gh-aw-firewall` side: when it is unset, no `apple-init` digest is published and the runtime simply cannot be selected rather than falling back to an unknown init. + +### Not supported + +Each of these is rejected at compile time with a message naming the reason: + +- `enclaves`, `network.topologyAttach`, and `runner.topology: arc-dind` +- `sandbox.agent.allow-host-ports`, GitHub Actions `services:` with published ports, and `--enable-host-access` +- `sandbox.agent.mounts`, extra `--volume` mounts, and `filesystem.allowWrite` +- Google Vertex AI credential isolation — its provider port is not in the capability allowlist +- `ssl_bump`, DNS-over-HTTPS, `--legacy-security`, `--dind`, `--tty`, `--build-local`, sysroot/chroot options, and custom agent images + +### Diagnostics + +Teardown prints `container system status`, the container list, and the last five minutes of Apple Container system logs. Container `inspect` output is deliberately not captured: it carries `initProcess.environment`. + +> [!IMPORTANT] +> This runtime is preview-only, and no part of it has been validated on real hardware — bare-metal Apple Silicon runners are not available in hosted CI, and AWF fails preflight on GitHub-hosted macOS by design. Prefer Docker sbx or gVisor unless the Apple Silicon requirement is deliberate. + ## ARC with Docker-in-Docker ARC DinD describes a split-daemon runner: the GitHub Actions runner is one container and Docker runs in a privileged sidecar. The agent still uses standard Docker, so omit `sandbox.agent.runtime`. diff --git a/pkg/constants/version_constants.go b/pkg/constants/version_constants.go index 2a2c7f45c96..b0a8e78f50a 100644 --- a/pkg/constants/version_constants.go +++ b/pkg/constants/version_constants.go @@ -179,6 +179,75 @@ const AWFCloudHypervisorFilesystemAllowWriteMinVersion Version = "v0.28.6" // https://github.com/google/gvisor/releases. const DefaultGVisorVersion = "20250707.0" +// DefaultAppleContainerVersion is the pinned apple/container release installed by +// the compiler-generated setup step for sandbox.agent.runtime: apple-container. +// +// AWF's init-image contract pins the supported `container` CLI window to +// >= AppleContainerMinCLIVersion and < AppleContainerMaxCLIVersionExclusive +// (gh-aw-firewall#7762, transport-capabilities.ts). apple/container has since +// released a 1.x line, and every 1.x release is OUTSIDE that window: a major bump +// may relocate the real `vminitd` inside the init image, which would boot a guest +// with no capability relay at all. 0.12.3 is the newest release inside the window, +// so it is the pin. +// +// Bump this only together with AWF's contract range, never to "latest". +const DefaultAppleContainerVersion = "0.12.3" + +// DefaultAppleContainerPkgSHA256 is the SHA-256 of +// container--installer-signed.pkg from +// https://github.com/apple/container/releases. +// +// apple/container publishes no checksums file, so the digest is pinned here and +// verified by the setup script before `installer` is ever invoked. It must be +// recomputed whenever DefaultAppleContainerVersion changes. +const DefaultAppleContainerPkgSHA256 = "83f363126ac1f064588de39cd6b474340d489c1926492a2c4e59c4d54aa6d8e3" + +// AppleContainerPkgSigningIdentity is the Developer ID Installer identity the +// pinned package must be signed with, as reported by `pkgutil --check-signature`. +// +// The digest pin alone proves the bytes are the ones this repository reviewed; +// the signature check additionally proves those bytes came from Apple's +// Containerization team and are notarised, so a compromised release asset cannot +// be laundered through a checksum bump alone. +const AppleContainerPkgSigningIdentity = "Developer ID Installer: Apple Inc. - Containerization (UPBK2H6LZM)" + +// AppleContainerPkgIdentifier is the installer receipt identifier, used to read +// the installed version back with `pkgutil --pkg-info`. +const AppleContainerPkgIdentifier = "com.apple.container-installer" + +// AppleContainerMinCLIVersion and AppleContainerMaxCLIVersionExclusive mirror +// APPLE_CONTAINER_TRANSPORT_MIN_CLI_VERSION and +// APPLE_CONTAINER_TRANSPORT_MAX_CLI_VERSION_EXCLUSIVE in AWF. AWF re-checks the +// range itself; gh-aw checks it during setup so an incompatible preinstalled CLI +// is reported before any image is pulled or any VM is created. +const ( + AppleContainerMinCLIVersion = "0.4.0" + AppleContainerMaxCLIVersionExclusive = "1.0.0" +) + +// AppleContainerMinMacOSMajor is the minimum macOS major version Apple +// Virtualization.framework requires for the container workloads AWF launches. +const AppleContainerMinMacOSMajor = 26 + +// AppleContainerMCPGatewayHostPort is the macOS loopback port gh-aw binds the MCP +// gateway container (awmg-mcpg) to when the apple-container runtime is active, +// and the value it passes to AWF as appleContainer.mcpGatewayUpstreamPort +// (gh-aw-firewall#7768). +// +// AWF relays that loopback port into the zero-NIC guest as the mcp-gateway +// capability socket. It refuses any port reserved for its own sidecars — Squid +// (3128) and the API proxy provider ports (10000-10004) — so the gateway must +// own a distinct port. 9100 is outside both ranges and outside the ephemeral +// port range, and one agent job runs one gateway, so a fixed value is safe and +// keeps the generated configuration reproducible. +const AppleContainerMCPGatewayHostPort = 9100 + +// AppleContainerMCPGatewayGuestPort is the loopback port the AWF guest relay +// serves the MCP gateway on inside the VM. It is compiled into both halves of +// AWF's transport contract and is not negotiable, so the generated MCP client +// configuration must address exactly http://127.0.0.1:8080. +const AppleContainerMCPGatewayGuestPort = 8080 + // CopilotNoAskUserMinVersion is the minimum Copilot CLI version that supports the --no-ask-user // flag, which enables fully autonomous agentic runs by suppressing interactive prompts. // Workflows using an older Copilot CLI version must not emit --no-ask-user or the run will fail. diff --git a/pkg/workflow/apple_container.go b/pkg/workflow/apple_container.go index e4d86184145..153c04baffa 100644 --- a/pkg/workflow/apple_container.go +++ b/pkg/workflow/apple_container.go @@ -17,6 +17,7 @@ package workflow import ( "fmt" + "strconv" "strings" "github.com/github/gh-aw/pkg/constants" @@ -280,6 +281,25 @@ func validateAppleContainerCompatibility(workflowData *WorkflowData, agentConfig } } + if err := validateAppleContainerFeatures(workflowData, agentConfig, firewallConfig); err != nil { + return err + } + + // The MCP gateway is checked last. Everything above is a property of the + // declared configuration that the author can see and change directly; this one + // depends on the transport contract lining up. + if err := validateAppleContainerMCPGateway(workflowData); err != nil { + return err + } + + appleContainerLog.Print("apple-container runtime configured -- AWF version, runner, and feature compatibility checks passed") + return nil +} + +// validateAppleContainerFeatures rejects each workflow feature AWF refuses under +// this runtime. It is split from validateAppleContainerCompatibility so the +// host/version gate and the feature matrix stay independently readable. +func validateAppleContainerFeatures(workflowData *WorkflowData, agentConfig *AgentSandboxConfig, firewallConfig *FirewallConfig) error { if isArcDindTopology(workflowData) { return appleContainerIncompatibility( "apple-container is incompatible with runner.topology: arc-dind", @@ -339,6 +359,54 @@ func validateAppleContainerCompatibility(workflowData *WorkflowData, agentConfig } } - appleContainerLog.Print("apple-container runtime configured -- AWF version, runner, and feature compatibility checks passed") return nil } + +// hasMCPGatewayForAppleContainer reports whether this workflow starts the gh-aw +// MCP gateway. The predicate is collectMCPTools, which is exactly what +// generateMCPGatewaySetup uses to decide whether awmg-mcpg runs, so the AWF +// capability is requested if and only if there is something to reach. +func hasMCPGatewayForAppleContainer(workflowData *WorkflowData) bool { + if !isAppleContainerRuntime(workflowData) { + return false + } + return len(collectMCPTools(workflowData)) > 0 +} + +// validateAppleContainerMCPGateway enforces the one part of the MCP transport +// contract gh-aw cannot simply satisfy on the author's behalf: the guest-side +// port. +// +// AWF compiles the guest relay's loopback port into both halves of its transport +// contract, so the agent always finds the gateway at +// http://127.0.0.1:AppleContainerMCPGatewayGuestPort. A workflow that pins +// sandbox.mcp.port to anything else would generate an MCP client configuration +// addressing a port nothing listens on inside the VM, which would surface as an +// agent hanging on an unreachable endpoint rather than as a configuration error. +func validateAppleContainerMCPGateway(workflowData *WorkflowData) error { + if workflowData == nil || workflowData.SandboxConfig == nil { + return nil + } + mcpConfig := workflowData.SandboxConfig.MCP + if mcpConfig == nil || mcpConfig.Port == 0 { + return nil + } + if mcpConfig.Port == constants.AppleContainerMCPGatewayGuestPort { + return nil + } + + appleContainerLog.Printf("apple-container: rejecting sandbox.mcp.port %d", mcpConfig.Port) + return NewValidationError( + "sandbox.mcp.port", + strconv.Itoa(mcpConfig.Port), + fmt.Sprintf("sandbox.agent.runtime: %s requires the default MCP gateway port %d", AgentRuntimeAppleContainer, constants.AppleContainerMCPGatewayGuestPort), + fmt.Sprintf("The agent VM has no NIC. AWF bridges the gateway in as a Unix socket and its guest relay serves it on "+ + "http://127.0.0.1:%d, a port compiled into both halves of AWF's transport contract and not configurable. "+ + "gh-aw publishes the gateway container on macOS loopback port %d and tells AWF to relay it, but the port the "+ + "agent addresses inside the guest is fixed.\n\nRemove sandbox.mcp.port (or set it to %d), or change sandbox.agent.runtime.\n\nSee: %s", + constants.AppleContainerMCPGatewayGuestPort, + constants.AppleContainerMCPGatewayHostPort, + constants.AppleContainerMCPGatewayGuestPort, + constants.DocsSandboxURL), + ) +} diff --git a/pkg/workflow/apple_container_install.go b/pkg/workflow/apple_container_install.go new file mode 100644 index 00000000000..77e6f3df5ce --- /dev/null +++ b/pkg/workflow/apple_container_install.go @@ -0,0 +1,202 @@ +// This file generates the GitHub Actions steps that provision AWF's +// apple-container runtime on a self-hosted bare-metal Apple Silicon runner. +// +// The step sequence mirrors the gVisor / docker-sbx / cloud-hypervisor pattern — +// preflight, install, activate, verify — but everything it emits has to be valid +// on macOS with BSD userland and bash 3.2, which is what /bin/bash is there. +// +// Ordering is load-bearing and matches the dependency chain exactly: +// +// 1. Host preflight — refuse an ineligible runner before anything is fetched. +// 2. CLI setup — verify a preinstalled `container`, or install the +// pinned, checksum- and signature-verified package. +// 3. Service start — start the API server, install the default kernel +// non-interactively, and pin one application root for the +// rest of the job. +// 4. Image pull — populate Apple Container's own store, which the Docker +// pre-download earlier in the job cannot reach. +// +// Steps 1–3 run before the AWF binary is installed, so an unusable host costs +// seconds. The image pull runs last because it is the only step that needs a +// live service. + +package workflow + +import ( + "strconv" + "strings" + + "github.com/github/gh-aw/pkg/constants" + "github.com/github/gh-aw/pkg/logger" +) + +var appleContainerInstallLog = logger.New("workflow:apple_container_install") + +// generateAppleContainerHostPreflightStep validates runner eligibility: a +// self-hosted Apple Silicon Mac on a supported macOS with Virtualization.framework +// available, a usable launchd user domain, and a working Docker daemon for the +// infrastructure containers. +func generateAppleContainerHostPreflightStep() GitHubActionStep { + appleContainerInstallLog.Print("Generating apple-container host preflight step") + return GitHubActionStep([]string{ + " - name: Check host eligibility for apple-container", + " env:", + " GH_AW_APPLE_CONTAINER_MIN_MACOS: " + strconv.Itoa(constants.AppleContainerMinMacOSMajor), + ` run: bash "${RUNNER_TEMP}/gh-aw/actions/apple_container_host_preflight.sh"`, + }) +} + +// generateAppleContainerCLISetupStep verifies or installs the Apple `container` +// CLI. +// +// allowInstall reflects sandbox.agent.runtime-install. When it is false the step +// only verifies what the runner image already provides and fails with the exact +// version required; nothing is downloaded and no sudo is used. When it is true +// the step may install the pinned release, which is verified by SHA-256 and by +// its Apple Developer ID installer signature before `installer` runs. +func generateAppleContainerCLISetupStep(allowInstall bool) GitHubActionStep { + appleContainerInstallLog.Printf("Generating apple-container CLI setup step (version %s, allowInstall=%t)", constants.DefaultAppleContainerVersion, allowInstall) + + runArgs := "" + if allowInstall { + runArgs = " --allow-install" + } + + return GitHubActionStep([]string{ + " - name: Set up Apple container CLI", + " env:", + " GH_AW_APPLE_CONTAINER_VERSION: " + constants.DefaultAppleContainerVersion, + " GH_AW_APPLE_CONTAINER_PKG_SHA256: " + constants.DefaultAppleContainerPkgSHA256, + " GH_AW_APPLE_CONTAINER_PKG_IDENTITY: " + strconv.Quote(constants.AppleContainerPkgSigningIdentity), + " GH_AW_APPLE_CONTAINER_MIN_CLI: " + constants.AppleContainerMinCLIVersion, + " GH_AW_APPLE_CONTAINER_MAX_CLI: " + constants.AppleContainerMaxCLIVersionExclusive, + ` run: bash "${RUNNER_TEMP}/gh-aw/actions/apple_container_setup_cli.sh"` + runArgs, + }) +} + +// generateAppleContainerServicesStep starts the Apple Container system services +// and exports the application root every later `container` invocation must use. +func generateAppleContainerServicesStep() GitHubActionStep { + appleContainerInstallLog.Print("Generating apple-container service start step") + return GitHubActionStep([]string{ + " - name: Start Apple container services", + ` run: bash "${RUNNER_TEMP}/gh-aw/actions/apple_container_start_services.sh"`, + }) +} + +// generateAppleContainerImagePullStep pulls the digest-pinned images into Apple +// Container's store. It returns an empty step when there is nothing to pull, so +// a workflow without a resolvable manifest does not emit a no-op step. +func generateAppleContainerImagePullStep(images []string) GitHubActionStep { + if len(images) == 0 { + appleContainerInstallLog.Print("No apple-container images to pull; skipping step") + return GitHubActionStep([]string{}) + } + + appleContainerInstallLog.Printf("Generating apple-container image pull step for %d image(s)", len(images)) + + var run strings.Builder + run.WriteString(` run: bash "${RUNNER_TEMP}/gh-aw/actions/apple_container_pull_images.sh"`) + for _, image := range images { + run.WriteString(" ") + run.WriteString(shellQuoteForRun(image)) + } + + return GitHubActionStep([]string{ + " - name: Pull Apple Container images", + run.String(), + }) +} + +// generateAppleContainerTeardownStep stops the guest and the system services and +// removes run-scoped state. +// +// It runs with if: always() and continue-on-error so a cancelled job still +// releases the runner, and so a teardown problem never rewrites the agent's own +// outcome. +func generateAppleContainerTeardownStep() GitHubActionStep { + appleContainerInstallLog.Print("Generating apple-container teardown step") + return GitHubActionStep([]string{ + " - name: Tear down Apple Container", + " if: always()", + " continue-on-error: true", + ` run: bash "${RUNNER_TEMP}/gh-aw/actions/apple_container_teardown.sh"`, + }) +} + +// appleContainerRuntimeImages returns the digest-pinned references that must +// exist in Apple Container's image store: the agent image the workload runs, and +// the apple-init image carrying the guest capability relay. +// +// It intentionally reuses the same resolution the AWF config emits, so the +// compiler cannot pull one reference while telling AWF to verify another. A role +// whose reference is not digest-pinned is dropped rather than pulled: AWF refuses +// a floating reference for this runtime, and the pull script refuses it too, so +// emitting it here would only turn a clear config error into a confusing pull +// failure. +func appleContainerRuntimeImages(workflowData *WorkflowData) []string { + if !isAppleContainerRuntime(workflowData) { + return nil + } + + firewallConfig := getFirewallConfig(workflowData) + imageTag := getAWFImageTag(firewallConfig) + manifest := getSandboxAgentImages(workflowData) + + roles := []string{awfImageRoleAgent, awfImageRoleAppleInit} + images := make([]string, 0, len(roles)) + seen := make(map[string]struct{}, len(roles)) + + for _, role := range roles { + image := defaultAWFImageForRole(role, imageTag) + if manifest != nil { + if override, ok := manifest[role]; ok && override != "" { + image = override + } + } + if image == "" || !awfPinnedImagePattern.MatchString(image) { + appleContainerInstallLog.Printf("Skipping apple-container image role %q: reference %q is not digest-pinned", role, image) + continue + } + if _, duplicate := seen[image]; duplicate { + continue + } + seen[image] = struct{}{} + images = append(images, image) + } + + return images +} + +// generateAppleContainerSetupSteps returns the full provisioning sequence, in +// dependency order. It is the single entry point engines call so the ordering +// cannot drift between them. +func generateAppleContainerSetupSteps(workflowData *WorkflowData) []GitHubActionStep { + if !isAppleContainerRuntime(workflowData) { + return nil + } + + steps := []GitHubActionStep{ + generateAppleContainerHostPreflightStep(), + generateAppleContainerCLISetupStep(isRuntimeInstallEnabled(workflowData)), + generateAppleContainerServicesStep(), + } + + if pull := generateAppleContainerImagePullStep(appleContainerRuntimeImages(workflowData)); len(pull) > 0 { + steps = append(steps, pull) + } + + appleContainerInstallLog.Printf("Generated %d apple-container setup step(s)", len(steps)) + return steps +} + +// shellQuoteForRun single-quotes a value for safe inclusion in a generated +// `run:` command line. +// +// Image references reaching this function are already validated as digest-pinned +// AWF references, but they originate in workflow frontmatter and are interpolated +// into a shell command, so quoting is applied unconditionally rather than on the +// assumption that validation ran first. +func shellQuoteForRun(value string) string { + return "'" + strings.ReplaceAll(value, "'", `'\''`) + "'" +} diff --git a/pkg/workflow/apple_container_install_test.go b/pkg/workflow/apple_container_install_test.go new file mode 100644 index 00000000000..ce1063e013c --- /dev/null +++ b/pkg/workflow/apple_container_install_test.go @@ -0,0 +1,337 @@ +//go:build !integration + +package workflow + +import ( + "strings" + "testing" + + "github.com/github/gh-aw/pkg/constants" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// stepText joins a generated step's lines so tests can assert on the rendered +// YAML rather than on line indices, which shift whenever a comment is added. +func stepText(step GitHubActionStep) string { + return strings.Join([]string(step), "\n") +} + +// ── Setup step generation ─────────────────────────────────────────────────── + +// newAppleContainerWorkflowWithPinnedImages returns a baseline whose AWF image +// manifest is fully digest-pinned, which is what the image pull step requires. +func newAppleContainerWorkflowWithPinnedImages() *WorkflowData { + const pinned = "ghcr.io/github/gh-aw-firewall/%s:v0.28.9@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + + workflowData := newAppleContainerWorkflow() + workflowData.SandboxConfig.Agent.Images = map[string]string{ + awfImageRoleSquid: strings.ReplaceAll(pinned, "%s", "squid"), + awfImageRoleAgent: strings.ReplaceAll(pinned, "%s", "agent"), + awfImageRoleAPIProxy: strings.ReplaceAll(pinned, "%s", "api-proxy"), + awfImageRoleAppleInit: strings.ReplaceAll(pinned, "%s", "apple-init"), + } + return workflowData +} + +func TestAppleContainerSetupStepsOrdering(t *testing.T) { + t.Parallel() + + steps := generateAppleContainerSetupSteps(newAppleContainerWorkflowWithPinnedImages()) + require.Len(t, steps, 4, "preflight, CLI setup, service start, image pull") + + // Order is a correctness property, not a preference: an ineligible host must + // be rejected before anything is downloaded, the CLI must exist before the + // services start, and the services must be up before any image is pulled. + assert.Contains(t, stepText(steps[0]), "apple_container_host_preflight.sh") + assert.Contains(t, stepText(steps[1]), "apple_container_setup_cli.sh") + assert.Contains(t, stepText(steps[2]), "apple_container_start_services.sh") + assert.Contains(t, stepText(steps[3]), "apple_container_pull_images.sh") +} + +// TestAppleContainerSetupStepsOmitPullWithoutPinnedImages documents that the pull +// step is skipped when no digest-pinned manifest is available. AWF's manifest +// validation is the right place to report a floating reference; emitting a pull +// step that is guaranteed to fail would only bury that diagnostic. +func TestAppleContainerSetupStepsOmitPullWithoutPinnedImages(t *testing.T) { + t.Parallel() + + steps := generateAppleContainerSetupSteps(newAppleContainerWorkflow()) + require.Len(t, steps, 3) + for _, step := range steps { + assert.NotContains(t, stepText(step), "apple_container_pull_images.sh") + } +} + +func TestAppleContainerSetupStepsSkippedForOtherRuntimes(t *testing.T) { + t.Parallel() + + for _, runtime := range []AgentRuntime{ + AgentRuntimeDocker, + AgentRuntimeDockerSudoIptables, + AgentRuntimeGVisor, + AgentRuntimeDockerSbx, + AgentRuntimeCloudHypervisor, + } { + t.Run(string(runtime), func(t *testing.T) { + t.Parallel() + workflowData := newAppleContainerWorkflow() + workflowData.SandboxConfig.Agent.Runtime = runtime + assert.Empty(t, generateAppleContainerSetupSteps(workflowData), + "apple-container provisioning must not leak into other runtimes") + }) + } + + assert.Empty(t, generateAppleContainerSetupSteps(nil)) +} + +func TestAppleContainerHostPreflightStep(t *testing.T) { + t.Parallel() + + text := stepText(generateAppleContainerHostPreflightStep()) + assert.Contains(t, text, "apple_container_host_preflight.sh") + assert.Contains(t, text, "GH_AW_APPLE_CONTAINER_MIN_MACOS: 26", + "the macOS floor must reach the script rather than being hardcoded twice") +} + +func TestAppleContainerCLISetupStepPinsVersionAndDigest(t *testing.T) { + t.Parallel() + + text := stepText(generateAppleContainerCLISetupStep(false)) + + assert.Contains(t, text, "GH_AW_APPLE_CONTAINER_VERSION: "+constants.DefaultAppleContainerVersion) + assert.Contains(t, text, "GH_AW_APPLE_CONTAINER_PKG_SHA256: "+constants.DefaultAppleContainerPkgSHA256) + assert.Contains(t, text, constants.AppleContainerPkgSigningIdentity) + assert.Contains(t, text, "GH_AW_APPLE_CONTAINER_MIN_CLI: "+constants.AppleContainerMinCLIVersion) + assert.Contains(t, text, "GH_AW_APPLE_CONTAINER_MAX_CLI: "+constants.AppleContainerMaxCLIVersionExclusive) + + // "latest" must never appear: an unpinned installer would defeat both the + // digest pin and AWF's CLI version contract. + assert.NotContains(t, text, "latest") +} + +func TestAppleContainerCLISetupStepGatesInstallOnRuntimeInstall(t *testing.T) { + t.Parallel() + + assert.NotContains(t, stepText(generateAppleContainerCLISetupStep(false)), "--allow-install", + "without runtime-install the step only verifies a preinstalled CLI") + assert.Contains(t, stepText(generateAppleContainerCLISetupStep(true)), "--allow-install") +} + +// TestAppleContainerSetupStepsHonourRuntimeInstall pins the default. Like gVisor +// and docker-sbx, provisioning is on unless the workflow opts out, and the script +// still prefers a compatible preinstalled CLI over installing anything. +func TestAppleContainerSetupStepsHonourRuntimeInstall(t *testing.T) { + t.Parallel() + + workflowData := newAppleContainerWorkflow() + assert.Contains(t, stepText(generateAppleContainerSetupSteps(workflowData)[1]), "--allow-install", + "runtime-install defaults to enabled") + + runtimeInstall := false + workflowData.SandboxConfig.Agent.RuntimeInstall = &runtimeInstall + assert.NotContains(t, stepText(generateAppleContainerSetupSteps(workflowData)[1]), "--allow-install", + "runtime-install: false must reduce the step to verification only") +} + +func TestAppleContainerTeardownStepAlwaysRuns(t *testing.T) { + t.Parallel() + + text := stepText(generateAppleContainerTeardownStep()) + assert.Contains(t, text, "apple_container_teardown.sh") + // A cancelled or failed job must still release the guest and the run-scoped + // state on a persistent runner, and teardown must never rewrite the agent's + // own outcome. + assert.Contains(t, text, "if: always()") + assert.Contains(t, text, "continue-on-error: true") +} + +// ── Image preparation ─────────────────────────────────────────────────────── + +func TestAppleContainerRuntimeImagesUseDigestPins(t *testing.T) { + t.Parallel() + + const pinned = "ghcr.io/github/gh-aw-firewall/%s:v0.28.9@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + + workflowData := newAppleContainerWorkflow() + workflowData.SandboxConfig.Agent.Images = map[string]string{ + awfImageRoleSquid: strings.ReplaceAll(pinned, "%s", "squid"), + awfImageRoleAgent: strings.ReplaceAll(pinned, "%s", "agent"), + awfImageRoleAPIProxy: strings.ReplaceAll(pinned, "%s", "api-proxy"), + awfImageRoleAppleInit: strings.ReplaceAll(pinned, "%s", "apple-init"), + } + + images := appleContainerRuntimeImages(workflowData) + require.Len(t, images, 2, "only the agent and apple-init images enter the Apple Container store") + assert.Contains(t, images, strings.ReplaceAll(pinned, "%s", "agent")) + assert.Contains(t, images, strings.ReplaceAll(pinned, "%s", "apple-init")) + + // Squid and the API proxy stay in Docker: they are infrastructure the guest + // never runs, and pulling them into the Apple store would waste time and + // disk for nothing. + assert.NotContains(t, images, strings.ReplaceAll(pinned, "%s", "squid")) + assert.NotContains(t, images, strings.ReplaceAll(pinned, "%s", "api-proxy")) +} + +func TestAppleContainerRuntimeImagesDropFloatingReferences(t *testing.T) { + t.Parallel() + + // The default manifest is tag-based, not digest-pinned. AWF refuses a floating + // reference for this runtime, so the compiler must not hand one to the pull + // script either: the manifest error is the correct diagnostic, not a pull + // failure inside a VM. + images := appleContainerRuntimeImages(newAppleContainerWorkflow()) + for _, image := range images { + assert.Contains(t, image, "@sha256:", "every pulled reference must be digest-pinned") + } + + workflowData := newAppleContainerWorkflow() + workflowData.SandboxConfig.Agent.Images = map[string]string{ + awfImageRoleAgent: "ghcr.io/github/gh-aw-firewall/agent:v0.28.9", + awfImageRoleAppleInit: "ghcr.io/github/gh-aw-firewall/apple-init:v0.28.9", + } + assert.Empty(t, appleContainerRuntimeImages(workflowData), + "floating references must be dropped rather than pulled") +} + +func TestAppleContainerRuntimeImagesEmptyForOtherRuntimes(t *testing.T) { + t.Parallel() + + workflowData := newAppleContainerWorkflow() + workflowData.SandboxConfig.Agent.Runtime = AgentRuntimeDocker + assert.Empty(t, appleContainerRuntimeImages(workflowData)) +} + +func TestAppleContainerImagePullStepQuotesReferences(t *testing.T) { + t.Parallel() + + const reference = "ghcr.io/github/gh-aw-firewall/agent:v1@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + + text := stepText(generateAppleContainerImagePullStep([]string{reference})) + assert.Contains(t, text, "apple_container_pull_images.sh") + assert.Contains(t, text, "'"+reference+"'", "references are single-quoted in the generated run: line") + + assert.Empty(t, generateAppleContainerImagePullStep(nil), "no images means no step") +} + +// TestAppleContainerAppleInitStaysOutOfDockerPredownload proves the two image +// stores stay separate in both directions: Docker never pre-pulls apple-init, and +// the Apple store never receives the infrastructure images. +func TestAppleContainerAppleInitStaysOutOfDockerPredownload(t *testing.T) { + t.Parallel() + + const pinned = "ghcr.io/github/gh-aw-firewall/%s:v0.28.9@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" + + workflowData := newAppleContainerWorkflow() + workflowData.SandboxConfig.Agent.Images = map[string]string{ + awfImageRoleSquid: strings.ReplaceAll(pinned, "%s", "squid"), + awfImageRoleAgent: strings.ReplaceAll(pinned, "%s", "agent"), + awfImageRoleAPIProxy: strings.ReplaceAll(pinned, "%s", "api-proxy"), + awfImageRoleAppleInit: strings.ReplaceAll(pinned, "%s", "apple-init"), + } + + dockerImages := collectDockerImages(workflowData.Tools, workflowData, ActionModeScript) + for _, image := range dockerImages { + assert.NotContains(t, image, "apple-init", + "docker pull cannot populate Apple Container's store, so apple-init must be excluded") + } + // The infrastructure images are still pre-pulled for Docker; only the agent + // crosses the hypervisor boundary. + assert.Contains(t, dockerImages, strings.ReplaceAll(pinned, "%s", "squid")) +} + +// ── Pinned Apple Container release ────────────────────────────────────────── + +func TestAppleContainerPinnedVersionIsInsideAWFContractRange(t *testing.T) { + t.Parallel() + + // AWF's init-image contract is >= 0.4.0 and < 1.0.0. apple/container has a 1.x + // line, and picking the newest release without checking would silently land + // outside the window: a major bump may relocate the real vminitd inside the + // init image and boot a guest with no capability relay. + assert.Equal(t, "0.4.0", constants.AppleContainerMinCLIVersion) + assert.Equal(t, "1.0.0", constants.AppleContainerMaxCLIVersionExclusive) + assert.True(t, strings.HasPrefix(constants.DefaultAppleContainerVersion, "0."), + "the pinned release must be a 0.x release to stay inside AWF's contract range") + assert.NotContains(t, constants.DefaultAppleContainerVersion, "latest") +} + +func TestAppleContainerPkgDigestIsAFullSHA256(t *testing.T) { + t.Parallel() + + digest := constants.DefaultAppleContainerPkgSHA256 + assert.Len(t, digest, 64, "a SHA-256 hex digest is 64 characters") + assert.Equal(t, strings.ToLower(digest), digest, "digests are compared lowercased") + for _, r := range digest { + assert.Contains(t, "0123456789abcdef", string(r), "digest must be lowercase hex") + } +} + +func TestAppleContainerSigningIdentityIsAppleContainerization(t *testing.T) { + t.Parallel() + + // The digest proves the bytes; the identity proves the signer. Losing the + // identity check would let a checksum bump alone launder a package from + // somebody else's Developer ID. + assert.Contains(t, constants.AppleContainerPkgSigningIdentity, "Developer ID Installer") + assert.Contains(t, constants.AppleContainerPkgSigningIdentity, "Apple Inc. - Containerization") + assert.Equal(t, "com.apple.container-installer", constants.AppleContainerPkgIdentifier) +} + +// ── No topology, no guest network ─────────────────────────────────────────── + +// TestAppleContainerGeneratesNoTopologyAttach re-asserts the layer 1 invariant +// against the layer 2 code paths: nothing added here may reintroduce a +// Docker-network peer for the guest. +func TestAppleContainerGeneratesNoTopologyAttach(t *testing.T) { + t.Parallel() + + workflowData := newAppleContainerWorkflow() + assert.Empty(t, buildAWFTopologyAttachList(workflowData)) + + for _, step := range generateAppleContainerSetupSteps(newAppleContainerWorkflowWithPinnedImages()) { + text := stepText(step) + for _, forbidden := range []string{ + "--topology-attach", + "topologyAttach", + "--net=host", + "--network host", + "/var/run/docker.sock", + "DOCKER_HOST", + } { + assert.NotContains(t, text, forbidden, + "apple-container provisioning must not grant the guest a network route or a Docker socket") + } + } + + assert.NotContains(t, stepText(generateAppleContainerTeardownStep()), "/var/run/docker.sock") +} + +// ── Runtime profile ───────────────────────────────────────────────────────── + +func TestAppleContainerProfileSupportsRuntimeInstall(t *testing.T) { + t.Parallel() + + profile := sandboxRuntimeProfiles[AgentRuntimeAppleContainer] + assert.True(t, profile.SupportsRuntimeInstall) + assert.True(t, profile.Rootless, "AWF runs as the runner user; 'container' is unprivileged") + assert.False(t, profile.SupportsHostAccess, "the guest has no NIC") + + // No other runtime's provisioning support may change as a side effect. + assert.True(t, sandboxRuntimeProfiles[AgentRuntimeGVisor].SupportsRuntimeInstall) + assert.True(t, sandboxRuntimeProfiles[AgentRuntimeDockerSbx].SupportsRuntimeInstall) + assert.False(t, sandboxRuntimeProfiles[AgentRuntimeDocker].SupportsRuntimeInstall) + assert.False(t, sandboxRuntimeProfiles[AgentRuntimeCloudHypervisor].SupportsRuntimeInstall) +} + +// ── Shell quoting ─────────────────────────────────────────────────────────── + +func TestShellQuoteForRun(t *testing.T) { + t.Parallel() + + assert.Equal(t, "'plain'", shellQuoteForRun("plain")) + assert.Equal(t, `'it'\''s'`, shellQuoteForRun("it's")) + // A value carrying shell metacharacters must stay a single literal argument. + assert.Equal(t, "'; rm -rf /'", shellQuoteForRun("; rm -rf /")) + assert.Equal(t, "'$(whoami)'", shellQuoteForRun("$(whoami)")) +} diff --git a/pkg/workflow/apple_container_mcp_test.go b/pkg/workflow/apple_container_mcp_test.go new file mode 100644 index 00000000000..1dfe57ea994 --- /dev/null +++ b/pkg/workflow/apple_container_mcp_test.go @@ -0,0 +1,332 @@ +//go:build !integration + +package workflow + +import ( + "encoding/json" + "os" + "path/filepath" + "strconv" + "strings" + "testing" + + "github.com/github/gh-aw/pkg/constants" + "github.com/github/gh-aw/pkg/stringutil" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// This file covers the apple-container MCP gateway transport end to end, from +// frontmatter through to the generated lock file. +// +// The transport has four moving parts that must agree, and each is asserted +// separately so a break names the half that drifted: +// +// 1. gh-aw publishes awmg-mcpg on macOS loopback AppleContainerMCPGatewayHostPort. +// 2. gh-aw declares that port to AWF as appleContainer.mcpGatewayUpstreamPort. +// 3. AWF probes it, then publishes mcp-gateway.sock into the zero-NIC guest. +// 4. The agent's MCP client config addresses the guest relay at +// http://127.0.0.1:AppleContainerMCPGatewayGuestPort. +// +// Step 3 belongs to AWF (gh-aw-firewall#7768); everything else is asserted here. + +// compileAppleContainerWorkflow compiles a minimal apple-container workflow and +// returns the generated lock file. +func compileAppleContainerWorkflow(t *testing.T, frontmatter string) string { + t.Helper() + + compiler := NewCompiler() + tmpDir := t.TempDir() + inputFile := filepath.Join(tmpDir, "test.md") + + require.NoError(t, os.WriteFile(inputFile, []byte(frontmatter), 0644)) + require.NoError(t, compiler.CompileWorkflow(inputFile), "apple-container workflow should compile") + + content, err := os.ReadFile(stringutil.MarkdownToLockFile(inputFile)) + require.NoError(t, err) + return string(content) +} + +const appleContainerWorkflowFrontmatter = `--- +on: workflow_dispatch +engine: copilot +runs-on: [self-hosted, macOS, ARM64] +sandbox: + agent: + runtime: apple-container + version: "` + string(constants.AWFAppleContainerMinVersion) + `" +tools: + github: + mode: remote + toolsets: [repos] +--- + +# Apple Container MCP transport +` + +func TestAppleContainerCompilesWithMCPGateway(t *testing.T) { + t.Parallel() + + lockFile := compileAppleContainerWorkflow(t, appleContainerWorkflowFrontmatter) + + hostPort := strconv.Itoa(constants.AppleContainerMCPGatewayHostPort) + guestPort := strconv.Itoa(constants.AppleContainerMCPGatewayGuestPort) + + // 1. The gateway container is published on macOS loopback, on the dedicated + // host port, and bound to 127.0.0.1 only. Binding 0.0.0.0 would put an + // API-key-authenticated gateway holding a Docker socket mount on every + // interface the self-hosted Mac sits on. + // + // The container port is written as a shell expansion of MCP_GATEWAY_PORT, + // quoted the way the gateway command builder emits expandable variables. + assert.Contains(t, lockFile, "-p 127.0.0.1:"+hostPort+`:'"${MCP_GATEWAY_PORT}"'`, + "the gateway must be published on the dedicated loopback host port") + assert.NotContains(t, lockFile, "-p 0.0.0.0:"+hostPort, + "the gateway must never be published on all interfaces") + + // 2. The host port is declared to AWF, which is the only way the mcp-gateway + // capability is activated. + assert.Contains(t, lockFile, `\"mcpGatewayUpstreamPort\":`+hostPort, + "AWF must be told which loopback port to relay") + + // 4. The agent addresses the guest relay over loopback inside the VM. + assert.Contains(t, lockFile, `export MCP_GATEWAY_DOMAIN="127.0.0.1"`, + "the agent reaches the gateway through the guest relay on loopback") + assert.Contains(t, lockFile, `export MCP_GATEWAY_PORT="`+guestPort+`"`, + "the guest relay port is compiled into AWF's contract and is not negotiable") + + // Host-side probes must use the published port, not the guest port. + assert.Contains(t, lockFile, `export MCP_GATEWAY_HOST_PORT="`+hostPort+`"`, + "health checks run on the host and must probe the published port") +} + +// TestAppleContainerGatewayCredentialTargetsPublishedPort is a security +// regression test. +// +// The Stop MCP Gateway step POSTs to /close with the gateway API key in an +// Authorization header. Before this layer the published port and the gateway's +// own port were always equal, so passing MCP_GATEWAY_PORT was harmless. Under +// apple-container they differ (published 9100, container 8080), and nothing gh-aw +// owns listens on 8080 on the host — so sending the credential to that port would +// hand it to whatever local process happens to own it on a long-lived +// self-hosted runner, silently, because the curl failure is tolerated. +func TestAppleContainerGatewayCredentialTargetsPublishedPort(t *testing.T) { + t.Parallel() + + lockFile := compileAppleContainerWorkflow(t, appleContainerWorkflowFrontmatter) + + assert.Contains(t, lockFile, "MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }}", + "the stop step must receive the published port so it never sends the API key elsewhere") + + // The output the step above consumes has to actually be produced. The start + // script is a repository file rather than generated output, so it is read + // directly; a missing output would leave MCP_GATEWAY_HOST_PORT empty and fall + // the stop script back to the gateway's own port. + startScript, err := os.ReadFile(filepath.Join("..", "..", "actions", "setup", "sh", "start_mcp_gateway.sh")) + require.NoError(t, err) + assert.Contains(t, string(startScript), "gateway-host-port=${MCP_GATEWAY_HOST_PORT}", + "the start step must publish the host port as an output") + + stopScript, err := os.ReadFile(filepath.Join("..", "..", "actions", "setup", "sh", "stop_mcp_gateway.sh")) + require.NoError(t, err) + assert.Contains(t, string(stopScript), `MCP_GATEWAY_HOST_PORT:-$MCP_GATEWAY_PORT`, + "the stop script must prefer the published port") + assert.NotContains(t, string(stopScript), "http://localhost:${MCP_GATEWAY_PORT}/close", + "the API key must never be sent to the gateway's container port on the host") +} + +// TestAppleContainerEmitsBothSelectorsWithUpstreamPort proves the AWF config +// carries the complete apple-container contract as one unit. +func TestAppleContainerEmitsBothSelectorsWithUpstreamPort(t *testing.T) { + t.Parallel() + + lockFile := compileAppleContainerWorkflow(t, appleContainerWorkflowFrontmatter) + + assert.Contains(t, lockFile, `\"containerRuntime\":\"apple-container\"`) + assert.Contains(t, lockFile, `\"previewEnabled\":true`) + assert.Contains(t, lockFile, `\"mcpGatewayUpstreamPort\":`+strconv.Itoa(constants.AppleContainerMCPGatewayHostPort)) +} + +// TestAppleContainerLockFileHasNoGuestNetworkRoute is the security regression +// test for the whole layer: nothing generated for this runtime may give the +// guest a NIC, a Docker socket, or a Docker-network peer. +func TestAppleContainerLockFileHasNoGuestNetworkRoute(t *testing.T) { + t.Parallel() + + lockFile := compileAppleContainerWorkflow(t, appleContainerWorkflowFrontmatter) + + for _, forbidden := range []string{ + "topologyAttach", + "--topology-attach", + "--enable-host-access", + "--allow-host-ports", + "--dind", + "--no-network-isolation", + } { + assert.NotContains(t, lockFile, forbidden, + "apple-container must not emit %q: it would give the zero-NIC guest a route out", forbidden) + } + + // The gateway container legitimately mounts the host Docker socket — it is + // host infrastructure that starts nested MCP servers — but the guest must + // never receive one. Assert the agent-side AWF arguments carry no socket. + assert.NotContains(t, lockFile, "--docker-host-path-prefix") +} + +// TestAppleContainerLockFileEmitsProvisioningAndTeardown asserts the generated +// job actually carries the provisioning sequence and releases the runner +// afterwards. The step generators are unit-tested above; this proves they are +// wired into the compiled workflow at all. +func TestAppleContainerLockFileEmitsProvisioningAndTeardown(t *testing.T) { + t.Parallel() + + lockFile := compileAppleContainerWorkflow(t, appleContainerWorkflowFrontmatter) + + for _, script := range []string{ + "apple_container_host_preflight.sh", + "apple_container_setup_cli.sh", + "apple_container_start_services.sh", + "apple_container_teardown.sh", + } { + assert.Contains(t, lockFile, script, "generated job must run %s", script) + } + + // Provisioning must precede the AWF installation, and teardown must follow the + // agent. Index comparison is the only way to assert that from a flat file. + preflightIdx := strings.Index(lockFile, "apple_container_host_preflight.sh") + cliIdx := strings.Index(lockFile, "apple_container_setup_cli.sh") + servicesIdx := strings.Index(lockFile, "apple_container_start_services.sh") + awfIdx := strings.Index(lockFile, "install_awf_binary.sh") + teardownIdx := strings.Index(lockFile, "apple_container_teardown.sh") + + assert.Less(t, preflightIdx, cliIdx, "an ineligible host must be rejected before anything is installed") + assert.Less(t, cliIdx, servicesIdx, "the CLI must exist before its services are started") + assert.Less(t, servicesIdx, awfIdx, "Apple Container must be ready before AWF is installed and run") + assert.Less(t, awfIdx, teardownIdx, "teardown runs after the agent") +} + +// TestAppleContainerLockFileKeepsDockerInfrastructure guards the half of the +// topology that does not move: Squid, the API proxy and the MCP gateway all stay +// on Docker, and only the agent crosses the hypervisor boundary. +func TestAppleContainerLockFileKeepsDockerInfrastructure(t *testing.T) { + t.Parallel() + + lockFile := compileAppleContainerWorkflow(t, appleContainerWorkflowFrontmatter) + + assert.Contains(t, lockFile, "download_docker_images.sh", + "infrastructure images are still pre-pulled into Docker") + assert.Contains(t, lockFile, "--name awmg-mcpg", + "the MCP gateway still runs as a host Docker container") + assert.Contains(t, lockFile, "docker run -i --rm --network bridge", + "the gateway keeps its bridge network; only the agent loses its NIC") +} + +// against AWF's reserved set. AWF throws when the upstream port collides with a +// port one of its own sidecars binds, and the failure would only appear on a +// runner nobody can easily reproduce. +func TestAppleContainerUpstreamPortAvoidsAWFReservedPorts(t *testing.T) { + t.Parallel() + + port := constants.AppleContainerMCPGatewayHostPort + + assert.NotEqual(t, 3128, port, "3128 is Squid") + for reserved := 10000; reserved <= 10004; reserved++ { + assert.NotEqual(t, reserved, port, "%d is an API proxy provider port", reserved) + } + assert.Greater(t, port, 1024, "the port must not require privileges to bind") + assert.Less(t, port, 32768, "stay below the ephemeral range so the fixed port is not raced") +} + +// TestAppleContainerRejectsNonDefaultMCPPort covers the one part of the contract +// an author can break: the guest-facing port is fixed by AWF. +func TestAppleContainerRejectsNonDefaultMCPPort(t *testing.T) { + t.Parallel() + + workflowData := newAppleContainerWorkflow() + workflowData.SandboxConfig.MCP = &MCPGatewayRuntimeConfig{Port: 9999} + + err := validateSandboxConfig(workflowData) + require.Error(t, err) + require.ErrorContains(t, err, "sandbox.mcp.port") + require.ErrorContains(t, err, strconv.Itoa(constants.AppleContainerMCPGatewayGuestPort)) + + // The default is accepted, and so is an unset port. + workflowData.SandboxConfig.MCP = &MCPGatewayRuntimeConfig{Port: constants.AppleContainerMCPGatewayGuestPort} + require.NoError(t, validateSandboxConfig(workflowData)) + + workflowData.SandboxConfig.MCP = nil + require.NoError(t, validateSandboxConfig(workflowData)) +} + +// TestAppleContainerUpstreamPortOmittedWithoutGateway keeps the capability +// request honest: AWF probes the upstream port before publishing the socket, so +// declaring a port no gateway listens on would fail the run. +func TestAppleContainerUpstreamPortOmittedWithoutGateway(t *testing.T) { + t.Parallel() + + workflowData := newAppleContainerWorkflow() + assert.True(t, hasMCPGatewayForAppleContainer(workflowData)) + + workflowData.Tools = map[string]any{} + assert.False(t, hasMCPGatewayForAppleContainer(workflowData), + "no MCP servers means no gateway to relay") + + // Other runtimes never request the capability at all. + other := newAppleContainerWorkflow() + other.SandboxConfig.Agent.Runtime = AgentRuntimeDocker + assert.False(t, hasMCPGatewayForAppleContainer(other)) +} + +// TestAppleContainerAWFConfigShape parses the generated AWF config rather than +// substring-matching it, so a field that lands in the wrong section is caught. +func TestAppleContainerAWFConfigShape(t *testing.T) { + t.Parallel() + + workflowData := newAppleContainerWorkflow() + configJSON, err := BuildAWFConfigJSON(AWFCommandConfig{WorkflowData: workflowData}) + require.NoError(t, err) + + var parsed struct { + Container struct { + ContainerRuntime string `json:"containerRuntime"` + } `json:"container"` + AppleContainer struct { + PreviewEnabled bool `json:"previewEnabled"` + MCPGatewayUpstreamPort int `json:"mcpGatewayUpstreamPort"` + } `json:"appleContainer"` + Network struct { + TopologyAttach []string `json:"topologyAttach"` + } `json:"network"` + } + require.NoError(t, json.Unmarshal([]byte(configJSON), &parsed)) + + assert.Equal(t, "apple-container", parsed.Container.ContainerRuntime) + assert.True(t, parsed.AppleContainer.PreviewEnabled) + assert.Equal(t, constants.AppleContainerMCPGatewayHostPort, parsed.AppleContainer.MCPGatewayUpstreamPort) + assert.Empty(t, parsed.Network.TopologyAttach, + "AWF rejects topologyAttach for this runtime; the capability socket replaces it") +} + +// TestOtherRuntimesKeepTopologyGatewayAccess is the collateral-damage guard: the +// Linux runtimes must still reach the gateway exactly as before. +func TestOtherRuntimesKeepTopologyGatewayAccess(t *testing.T) { + t.Parallel() + + for _, runtime := range []AgentRuntime{AgentRuntimeDocker, AgentRuntimeGVisor, AgentRuntimeCloudHypervisor} { + t.Run(string(runtime), func(t *testing.T) { + t.Parallel() + workflowData := newAppleContainerWorkflow() + workflowData.SandboxConfig.Agent.Runtime = runtime + workflowData.RunsOn = "runs-on: ubuntu-latest" + + assert.Contains(t, buildAWFTopologyAttachList(workflowData), "awmg-mcpg", + "every other runtime still bridges the gateway over AWF's Docker network") + + configJSON, err := BuildAWFConfigJSON(AWFCommandConfig{WorkflowData: workflowData}) + require.NoError(t, err) + assert.NotContains(t, configJSON, "mcpGatewayUpstreamPort", + "the Apple Container capability must not leak into other runtimes") + assert.NotContains(t, configJSON, "appleContainer") + }) + } +} diff --git a/pkg/workflow/apple_container_test.go b/pkg/workflow/apple_container_test.go index 0d0e7ae7977..254cc986e85 100644 --- a/pkg/workflow/apple_container_test.go +++ b/pkg/workflow/apple_container_test.go @@ -17,6 +17,10 @@ const appleContainerRunsOn = "runs-on:\n - self-hosted\n - macOS\n - ARM64" // newAppleContainerWorkflow builds a minimal apple-container workflow that passes // every check, so each test can mutate exactly one thing. +// +// The `github` MCP tool is required, not incidental: an enabled agent sandbox is +// rejected outright without at least one MCP server, and the gateway reaches the +// zero-NIC guest through AWF's mcp-gateway capability socket. func newAppleContainerWorkflow() *WorkflowData { return &WorkflowData{ RunsOn: appleContainerRunsOn, @@ -50,7 +54,7 @@ func TestAppleContainerRuntimeProfile(t *testing.T) { assert.False(t, profile.LegacySecurity, "apple-container rejects legacy iptables security") assert.True(t, profile.Rootless, "AWF itself runs as the runner user") assert.Equal(t, constants.AWFDefaultCommand.String(), profile.AWFCommand) - assert.False(t, profile.SupportsRuntimeInstall, "layer 1 generates no Apple Container provisioning steps") + assert.True(t, profile.SupportsRuntimeInstall, "layer 2 generates the Apple Container provisioning steps") assert.False(t, profile.SupportsHostAccess, "the guest has no NIC") } @@ -152,7 +156,7 @@ func TestAppleContainerAWFConfigEmitsBothSelectors(t *testing.T) { assert.Contains(t, jsonStr, `"containerRuntime":"apple-container"`, "AWF selects the backend through container.containerRuntime") - assert.Contains(t, jsonStr, `"appleContainer":{"previewEnabled":true}`, + assert.Contains(t, jsonStr, `"appleContainer":{"previewEnabled":true`, "AWF also requires the explicit appleContainer.previewEnabled opt-in") } @@ -590,14 +594,14 @@ func TestAppleContainerRejectsHostPortsAndRuntimeInstall(t *testing.T) { require.ErrorContains(t, err, "services") }) - t.Run("runtime-install", func(t *testing.T) { + // runtime-install is accepted from layer 2 onwards: the compiler now generates + // the pinned, checksum- and signature-verified Apple Container installation. + t.Run("runtime-install is now supported", func(t *testing.T) { t.Parallel() workflowData := newAppleContainerWorkflow() runtimeInstall := true workflowData.SandboxConfig.Agent.RuntimeInstall = &runtimeInstall - err := validateSandboxConfig(workflowData) - require.Error(t, err) - require.ErrorContains(t, err, "runtime-install") + require.NoError(t, validateSandboxConfig(workflowData)) }) } diff --git a/pkg/workflow/awf_config.go b/pkg/workflow/awf_config.go index 9c2d6a9786b..2df2df448df 100644 --- a/pkg/workflow/awf_config.go +++ b/pkg/workflow/awf_config.go @@ -312,6 +312,19 @@ type AWFAppleContainerConfig struct { // CliPath is the absolute path to the Apple "container" CLI when it is not on // PATH. CliPath string `json:"cliPath,omitempty"` + + // MCPGatewayUpstreamPort is the macOS loopback port an externally owned MCP + // gateway listens on (gh-aw-firewall#7768). + // + // gh-aw starts awmg-mcpg itself, outside AWF's Compose file, so AWF has no + // service to publish for it. Setting this port is the only way to add the + // mcp-gateway capability: AWF health-probes 127.0.0.1:, then publishes + // mcp-gateway.sock into the zero-NIC guest, where its relay serves + // http://127.0.0.1:8080. The host is fixed to 127.0.0.1 by AWF and is not + // configurable. + // + // AWF rejects any port reserved for its own sidecars (3128, 10000-10004). + MCPGatewayUpstreamPort int `json:"mcpGatewayUpstreamPort,omitempty"` } // AWFLoggingConfig is the "logging" section of the AWF config file. diff --git a/pkg/workflow/awf_config_build.go b/pkg/workflow/awf_config_build.go index bd77b025278..9d2bed9f4b9 100644 --- a/pkg/workflow/awf_config_build.go +++ b/pkg/workflow/awf_config_build.go @@ -309,7 +309,17 @@ func BuildAWFConfigJSON(config AWFCommandConfig) (string, error) { } if agentRuntime == string(AgentRuntimeAppleContainer) { awfConfig.AppleContainer = &AWFAppleContainerConfig{PreviewEnabled: true} - awfConfigLog.Print("Apple Container section: previewEnabled=true") + // The MCP gateway is gh-aw's own Docker container on macOS loopback, not an + // AWF Compose service, so AWF cannot discover it. Declaring the upstream port + // is what activates the mcp-gateway capability and gets a socket published + // into the NIC-less guest; without it the agent would have no MCP transport + // at all (gh-aw-firewall#7768). + if hasMCPGatewayForAppleContainer(config.WorkflowData) { + awfConfig.AppleContainer.MCPGatewayUpstreamPort = constants.AppleContainerMCPGatewayHostPort + awfConfigLog.Printf("Apple Container section: previewEnabled=true, mcpGatewayUpstreamPort=%d", constants.AppleContainerMCPGatewayHostPort) + } else { + awfConfigLog.Print("Apple Container section: previewEnabled=true (no MCP gateway)") + } } if awfImageTag != "" || isArcDindTopology(config.WorkflowData) || agentRuntime != "" || agentTimeout > 0 || len(containerImages) > 0 { container := &AWFContainerConfig{ diff --git a/pkg/workflow/codex_engine.go b/pkg/workflow/codex_engine.go index a219f6e551c..29d29d074a3 100644 --- a/pkg/workflow/codex_engine.go +++ b/pkg/workflow/codex_engine.go @@ -196,6 +196,10 @@ func (e *CodexEngine) GetInstallationSteps(workflowData *WorkflowData) []GitHubA steps = append(steps, generateCloudHypervisorHostPreflightStep()) steps = append(steps, generateCloudHypervisorBundleSetupStep(getAWFVersionForSetup(workflowData))) } + // Apple Container must be installed, started and stocked with its own + // images before AWF runs: its image store is separate from Docker's, so + // the Docker pre-download step cannot satisfy the agent VM. + steps = append(steps, generateAppleContainerSetupSteps(workflowData)...) // Install AWF binary (or skip if custom command is specified) awfInstall := generateAWFInstallationStep(awfVersion, agentConfig) diff --git a/pkg/workflow/compiler_yaml_ai_execution.go b/pkg/workflow/compiler_yaml_ai_execution.go index af63044ded9..d08d1e2b9e4 100644 --- a/pkg/workflow/compiler_yaml_ai_execution.go +++ b/pkg/workflow/compiler_yaml_ai_execution.go @@ -168,6 +168,11 @@ func (c *Compiler) generateStopMCPGateway(yaml *strings.Builder, data *WorkflowD // Security: Pass all step outputs through environment variables to prevent template injection yaml.WriteString(" env:\n") yaml.WriteString(" MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }}\n") + // The published host port differs from the gateway's own port under + // apple-container. The stop script sends the gateway API key in an + // Authorization header, so it must address the port gh-aw actually published + // and never a port some unrelated local process happens to own. + yaml.WriteString(" MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }}\n") yaml.WriteString(" MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }}\n") yaml.WriteString(" GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }}\n") @@ -516,6 +521,19 @@ func (c *Compiler) generateAgentRunSteps(yaml *strings.Builder, data *WorkflowDa } } + // Apple Container teardown runs as soon as the agent step is done, before the + // log collection below, so the guest is quiesced and the run-scoped + // application root is released even when the agent failed or the job was + // cancelled. It is if: always() / continue-on-error, so it never rewrites the + // agent's own outcome, and it deliberately leaves the Docker infrastructure + // containers alone — they still hold the Squid logs collected next. + if isAppleContainerRuntime(data) { + for _, line := range generateAppleContainerTeardownStep() { + yaml.WriteString(line) + yaml.WriteByte('\n') + } + } + // Collect firewall logs BEFORE secret redaction so secrets in logs can be redacted for _, step := range engine.GetFirewallLogsCollectionStep(data) { for _, line := range step { diff --git a/pkg/workflow/mcp_setup_gateway.go b/pkg/workflow/mcp_setup_gateway.go index 9fa0e7cd18b..d0ba16396dd 100644 --- a/pkg/workflow/mcp_setup_gateway.go +++ b/pkg/workflow/mcp_setup_gateway.go @@ -190,6 +190,13 @@ func resolveMCPGatewayValues(workflowData *WorkflowData, gatewayConfig *MCPGatew // (the Docker bridge gateway). Use this as the MCP gateway domain so that the // CLI wrapper scripts generated inside the microVM point to the correct host. domain = "host.docker.internal" + } else if isAppleContainerRuntime(workflowData) { + // The Apple Container guest has no NIC and reaches the gateway only + // through AWF's mcp-gateway capability socket. AWF's guest relay serves + // it on 127.0.0.1:, a port compiled + // into both halves of its transport contract, so the agent addresses + // loopback inside the VM rather than any Docker hostname. + domain = "127.0.0.1" } else if isAWFNetworkIsolationEnabled(workflowData) { domain = "awmg-mcpg" } else { @@ -237,6 +244,18 @@ func writeMCPGatewayExports(yaml *strings.Builder, opts writeMCPGatewayExportsOp yaml.WriteString(" \n") yaml.WriteString(" # Export gateway environment variables for MCP config and gateway script\n") yaml.WriteString(" export MCP_GATEWAY_PORT=\"" + strconv.Itoa(port) + "\"\n") + // MCP_GATEWAY_HOST_PORT is the port the gateway container is published on for + // host-side consumers (health probes, MCP server checks). It equals + // MCP_GATEWAY_PORT everywhere except apple-container, where the published port + // has to differ from the guest-facing port: AWF relays macOS loopback + // AppleContainerMCPGatewayHostPort into the guest, whose relay then serves the + // fixed guest port. Health checks run on the host and must probe the published + // port, or they would poll a port nothing is listening on and time out. + hostPort := port + if isAppleContainerRuntime(workflowData) { + hostPort = constants.AppleContainerMCPGatewayHostPort + } + yaml.WriteString(" export MCP_GATEWAY_HOST_PORT=\"" + strconv.Itoa(hostPort) + "\"\n") yaml.WriteString(" export MCP_GATEWAY_DOMAIN=\"" + domain + "\"\n") // MCP_GATEWAY_HOST_DOMAIN is the domain used by host-side clients (e.g. Gemini CLI). // When MCP_GATEWAY_DOMAIN is host.docker.internal (only reachable from containers), @@ -360,6 +379,17 @@ func buildMCPGatewayContainerCommand(opts buildMCPGatewayContainerCommandOptions // Docker sbx microVMs: publish to 0.0.0.0 so the guest can reach the gateway via // host.docker.internal (the Docker bridge gateway, 172.17.0.1). containerCmd.WriteString(" -p 0.0.0.0:${MCP_GATEWAY_PORT}:${MCP_GATEWAY_PORT}") + } else if isAppleContainerRuntime(workflowData) { + // Apple Container: publish to a distinct macOS loopback port that AWF + // relays into the NIC-less guest as the mcp-gateway capability socket + // (gh-aw-firewall#7768). It must not collide with the ports AWF binds for + // its own sidecars — Squid (3128) and the API proxy providers + // (10000-10004) — which AWF rejects outright. + // + // 127.0.0.1 is deliberate and not merely conventional: binding 0.0.0.0 + // would expose an API-key-authenticated gateway with a Docker socket + // mount on every interface the self-hosted Mac sits on. + containerCmd.WriteString(" -p 127.0.0.1:" + strconv.Itoa(constants.AppleContainerMCPGatewayHostPort) + ":${MCP_GATEWAY_PORT}") } else { // Publish the gateway port to the host so host-side clients (e.g. Gemini CLI) // can reach the gateway at localhost:${MCP_GATEWAY_PORT}. diff --git a/pkg/workflow/nodejs.go b/pkg/workflow/nodejs.go index d4aad71e21c..d182cd5389f 100644 --- a/pkg/workflow/nodejs.go +++ b/pkg/workflow/nodejs.go @@ -164,6 +164,10 @@ func BuildNpmEngineInstallStepsWithAWF(npmSteps []GitHubActionStep, workflowData steps = append(steps, generateCloudHypervisorHostPreflightStep()) steps = append(steps, generateCloudHypervisorBundleSetupStep(getAWFVersionForSetup(workflowData))) } + // Apple Container must be installed, started and stocked with its own + // images before AWF runs: its image store is separate from Docker's, so + // the Docker pre-download step cannot satisfy the agent VM. + steps = append(steps, generateAppleContainerSetupSteps(workflowData)...) awfInstall := generateAWFInstallationStep(awfVersion, agentConfig) if len(awfInstall) > 0 { diff --git a/pkg/workflow/sandbox_runtime_profile.go b/pkg/workflow/sandbox_runtime_profile.go index 3d32e60deac..8fbbf87d3e9 100644 --- a/pkg/workflow/sandbox_runtime_profile.go +++ b/pkg/workflow/sandbox_runtime_profile.go @@ -94,11 +94,12 @@ var sandboxRuntimeProfiles = map[AgentRuntime]sandboxRuntimeProfile{ // describes the AWF invocation, not the absence of Docker. Rootless: true, AWFCommand: constants.AWFDefaultCommand.String(), - // The Apple Container CLI and the guest init image are provisioned by the - // self-hosted runner image, not by compiler-generated steps. Layer 2 of this - // stack adds the generated setup; until then runtime-install has nothing to - // generate and is rejected rather than silently ignored. - SupportsRuntimeInstall: false, + // The compiler generates the full Apple Container provisioning sequence: + // host preflight, pinned CLI verification or installation, service start + // with a run-scoped application root, and digest-pinned image pulls into + // Apple Container's separate store. runtime-install additionally permits + // the pinned, checksum- and signature-verified package installation. + SupportsRuntimeInstall: true, // The guest has no NIC, so no host port or GitHub Actions services: mapping // can ever reach it. SupportsHostAccess: false, diff --git a/pkg/workflow/sandbox_runtime_profile_test.go b/pkg/workflow/sandbox_runtime_profile_test.go index bf1b129dd8f..e785c558fd0 100644 --- a/pkg/workflow/sandbox_runtime_profile_test.go +++ b/pkg/workflow/sandbox_runtime_profile_test.go @@ -54,7 +54,9 @@ func TestSandboxRuntimeProfiles(t *testing.T) { t.Run("runtime-install is only meaningful for provisioned runtimes", func(t *testing.T) { for _, runtime := range supportedAgentRuntimes { profile := resolveSandboxRuntimeProfile(&AgentSandboxConfig{Runtime: runtime}) - expected := runtime == AgentRuntimeGVisor || runtime == AgentRuntimeDockerSbx + expected := runtime == AgentRuntimeGVisor || + runtime == AgentRuntimeDockerSbx || + runtime == AgentRuntimeAppleContainer assert.Equal(t, expected, profile.SupportsRuntimeInstall, "runtime %q runtime-install support", runtime) } }) diff --git a/pkg/workflow/schemas/awf-config.schema.json b/pkg/workflow/schemas/awf-config.schema.json index 6b873476cc5..7312b950af3 100644 --- a/pkg/workflow/schemas/awf-config.schema.json +++ b/pkg/workflow/schemas/awf-config.schema.json @@ -665,6 +665,12 @@ "cliPath": { "type": "string", "description": "Absolute path to the Apple \"container\" CLI when it is not on PATH." + }, + "mcpGatewayUpstreamPort": { + "type": "integer", + "minimum": 1, + "maximum": 65535, + "description": "macOS loopback port an externally owned MCP gateway listens on. Setting it adds the mcp-gateway capability: AWF health-probes 127.0.0.1:, then publishes mcp-gateway.sock into the zero-NIC guest, whose relay serves http://127.0.0.1:8080. The host is fixed to 127.0.0.1 and is not configurable. Ports reserved for AWF sidecars (3128 and 10000-10004) are rejected." } } }, diff --git a/pkg/workflow/testdata/TestWasmGolden_AllEngines/claude.golden b/pkg/workflow/testdata/TestWasmGolden_AllEngines/claude.golden index 3b17e675e19..69c5fc55901 100644 --- a/pkg/workflow/testdata/TestWasmGolden_AllEngines/claude.golden +++ b/pkg/workflow/testdata/TestWasmGolden_AllEngines/claude.golden @@ -446,6 +446,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -650,6 +651,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/pkg/workflow/testdata/TestWasmGolden_AllEngines/codex.golden b/pkg/workflow/testdata/TestWasmGolden_AllEngines/codex.golden index 2cd7f010c59..4a6595fb50b 100644 --- a/pkg/workflow/testdata/TestWasmGolden_AllEngines/codex.golden +++ b/pkg/workflow/testdata/TestWasmGolden_AllEngines/codex.golden @@ -448,6 +448,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -628,6 +629,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/pkg/workflow/testdata/TestWasmGolden_AllEngines/copilot.golden b/pkg/workflow/testdata/TestWasmGolden_AllEngines/copilot.golden index 479c12a3a54..ad7e0e34a48 100644 --- a/pkg/workflow/testdata/TestWasmGolden_AllEngines/copilot.golden +++ b/pkg/workflow/testdata/TestWasmGolden_AllEngines/copilot.golden @@ -444,6 +444,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -609,6 +610,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/pkg/workflow/testdata/TestWasmGolden_AllEngines/gemini.golden b/pkg/workflow/testdata/TestWasmGolden_AllEngines/gemini.golden index daa0c657f54..c230216af40 100644 --- a/pkg/workflow/testdata/TestWasmGolden_AllEngines/gemini.golden +++ b/pkg/workflow/testdata/TestWasmGolden_AllEngines/gemini.golden @@ -437,6 +437,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="awmg-mcpg" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -568,6 +569,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/pkg/workflow/testdata/TestWasmGolden_AllEngines/pi.golden b/pkg/workflow/testdata/TestWasmGolden_AllEngines/pi.golden index 72fd56d4f96..bdf57e1adce 100644 --- a/pkg/workflow/testdata/TestWasmGolden_AllEngines/pi.golden +++ b/pkg/workflow/testdata/TestWasmGolden_AllEngines/pi.golden @@ -506,6 +506,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/apple-container.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/apple-container.golden new file mode 100644 index 00000000000..e81c691ea0b --- /dev/null +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/apple-container.golden @@ -0,0 +1,793 @@ +name: "Apple Container Smoke" +on: + workflow_dispatch: + inputs: + aw_context: + default: "" + description: "Agent caller context (used internally by Agentic Workflows)." + required: false + type: string + +permissions: {} + +concurrency: + group: "gh-aw-${{ github.workflow }}" + queue: max + +run-name: "Apple Container Smoke" + +jobs: + activation: + needs: pre_activation + if: needs.pre_activation.outputs.activated == 'true' + runs-on: ubuntu-slim + permissions: + actions: read + contents: read + env: + GH_AW_MAX_DAILY_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_DAILY_AI_CREDITS || '5000' }} + GH_AW_RUNTIME_FEATURES: ${{ vars.GH_AW_RUNTIME_FEATURES }} + outputs: + comment_id: "" + comment_repo: "" + daily_ai_credits_exceeded: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_exceeded == 'true' }} + daily_ai_credits_guardrail_status: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_guardrail_status || '' }} + daily_ai_credits_threshold: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_threshold || '' }} + daily_ai_credits_total_effective_tokens: ${{ steps.daily-effective-workflow-guardrail.outputs.daily_ai_credits_total_effective_tokens || '' }} + engine_id: ${{ steps.generate_aw_info.outputs.engine_id }} + lockdown_check_failed: ${{ steps.generate_aw_info.outputs.lockdown_check_failed == 'true' }} + model: ${{ steps.generate_aw_info.outputs.model }} + oauth_token_check_failed: ${{ steps.check-oauth-tokens.outputs.oauth_token_check_failed == 'true' }} + secret_verification_result: ${{ steps.validate-secret.outputs.verification_result }} + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + stale_lock_file_failed: ${{ steps.check-lock-file.outputs.stale_lock_file_failed == 'true' }} + steps: + - name: Checkout actions folder + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: github/gh-aw + sparse-checkout: | + actions + clean: false + persist-credentials: false + - name: Setup Scripts + id: setup + uses: ./actions/setup + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.pre_activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.pre_activation.outputs.setup-parent-span-id || needs.pre_activation.outputs.setup-span-id }} + safe-output-artifact-client: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Apple Container Smoke" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/apple-container.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "COPILOT_VERSION" + GH_AW_INFO_AWF_VERSION: "v0.28.9" + GH_AW_INFO_ENGINE_ID: "copilot" + - name: Generate agentic run info + id: generate_aw_info + env: + GH_AW_INFO_ENGINE_ID: "copilot" + GH_AW_INFO_ENGINE_NAME: "GitHub Copilot CLI" + GH_AW_INFO_MODEL: ${{ vars.GH_AW_MODEL_AGENT_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'default' }} + GH_AW_INFO_VERSION: "COPILOT_VERSION" + GH_AW_INFO_AGENT_VERSION: "COPILOT_VERSION" + GH_AW_INFO_WORKFLOW_NAME: "Apple Container Smoke" + GH_AW_INFO_EXPERIMENTAL: "false" + GH_AW_INFO_SUPPORTS_TOOLS_ALLOWLIST: "true" + GH_AW_INFO_STAGED: "false" + GH_AW_INFO_ALLOWED_DOMAINS: '["defaults","github"]' + GH_AW_INFO_FIREWALL_ENABLED: "true" + GH_AW_INFO_AWF_VERSION: "v0.28.9" + GH_AW_INFO_AWMG_VERSION: "" + GH_AW_INFO_FIREWALL_TYPE: "squid" + GH_AW_INFO_AGENT_RUNTIME: "apple-container" + GH_AW_COMPILED_STRICT: "true" + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'generate_aw_info.cjs')); + await main(core, context); + - name: Restore daily AIC usage cache + id: restore-daily-aic-cache + if: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} + continue-on-error: true + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + key: agentic-workflow-usage-applecontainer-${{ github.run_id }} + restore-keys: agentic-workflow-usage-applecontainer- + path: /tmp/gh-aw/agentic-workflow-usage-cache.jsonl + - name: Restore daily AIC usage cache (artifact fallback) + id: restore-daily-aic-cache-fallback + if: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_RESTORE_DAILY_AIC_CACHE_HIT: ${{ steps.restore-daily-aic-cache.outputs.cache-hit }} + GH_AW_RESTORE_DAILY_AIC_CACHE_MATCHED_KEY: ${{ steps.restore-daily-aic-cache.outputs.cache-matched-key }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'restore_aic_usage_cache_fallback.cjs')); + await main(); + - name: Check daily workflow token guardrail + id: daily-effective-workflow-guardrail + if: ${{ env.GH_AW_MAX_DAILY_AI_CREDITS != '' }} + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_WORKFLOW_NAME: "Apple Container Smoke" + GH_AW_WORKFLOW_ID: "apple-container" + GH_AW_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + GH_AW_WORKFLOW_DISPATCH_AW_CONTEXT: ${{ github.event.inputs.aw_context || '' }} + GH_AW_HAS_SLASH_COMMAND: "false" + GH_AW_HAS_LABEL_COMMAND: "false" + GH_AW_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_AW_MAX_DAILY_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_DAILY_AI_CREDITS || '5000' }} + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'check_daily_aic_workflow_guardrail.cjs')); + await main(); + - name: Validate COPILOT_GITHUB_TOKEN secret + id: validate-secret + run: bash "${RUNNER_TEMP}/gh-aw/actions/validate_multi_secret.sh" COPILOT_GITHUB_TOKEN 'GitHub Copilot CLI' https://github.github.com/gh-aw/reference/engines/#github-copilot-default + env: + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + - name: Check for OAuth tokens + id: check-oauth-tokens + run: bash "${RUNNER_TEMP}/gh-aw/actions/check_oauth_tokens.sh" + env: + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + - name: Checkout .github and .agents folders + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + sparse-checkout: | + .github + .agents + actions/setup + .claude + .codex + .gemini + .pi + sparse-checkout-cone-mode: true + fetch-depth: 1 + - name: Save agent config folders for base branch restoration + env: + GH_AW_AGENT_FOLDERS: ".agents .github" + GH_AW_AGENT_FILES: "AGENTS.md" + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/save_base_github_folders.sh" + - name: Check workflow lock file + id: check-lock-file + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_WORKFLOW_FILE: "apple-container.lock.yml" + GH_AW_CONTEXT_WORKFLOW_REF: "${{ github.workflow_ref }}" + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'check_workflow_timestamp_api.cjs')); + await main(); + - name: Log runtime features + if: ${{ contains(toJSON(vars), '"GH_AW_RUNTIME_FEATURES":') }} + run: bash "${RUNNER_TEMP}/gh-aw/actions/log_runtime_features_summary.sh" + - name: Create prompt with built-in context + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_ACTIONS_DIR: ${{ runner.temp }}/gh-aw/actions + GH_AW_PROMPT: ${{ runner.temp }}/gh-aw/aw-prompts/prompt.txt + GH_AW_PROMPT_CONFIG: "{\"items\":[{\"content_env\":\"GH_AW_PROMPT_CONTENT_0000\"},{\"file\":\"xpia.md\"},{\"file\":\"temp_folder_prompt.md\"},{\"file\":\"markdown.md\"},{\"content_env\":\"GH_AW_PROMPT_CONTENT_0001\"},{\"file\":\"github_mcp_tools_prompt.md\"},{\"content_env\":\"GH_AW_PROMPT_CONTENT_0002\"},{\"content_env\":\"GH_AW_PROMPT_CONTENT_0003\"}]}" + GH_AW_EXPR_1A3A194A: ${{ github.event.discussion.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'discussion' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_463A214A: ${{ github.event.pull_request.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'pull_request' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_802A9F6A: ${{ github.event.issue.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'issue' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_FF1D34CE: ${{ github.event.comment.id || fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').comment_id }} + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + GH_AW_PROMPT_CONTENT_0000: "\n" + GH_AW_PROMPT_CONTENT_0001: "\nThe following GitHub context information is available for this workflow:\n{{#if github.actor}}\n- **actor**: __GH_AW_GITHUB_ACTOR__\n{{/if}}\n{{#if github.repository}}\n- **repository**: __GH_AW_GITHUB_REPOSITORY__\n{{/if}}\n{{#if github.workspace}}\n- **workspace**: __GH_AW_GITHUB_WORKSPACE__\n{{/if}}\n{{#if github.event.issue.number || (github.aw.context.item_type == 'issue' && github.aw.context.item_number)}}\n- **issue-number**: #__GH_AW_EXPR_802A9F6A__\n{{/if}}\n{{#if github.event.discussion.number || (github.aw.context.item_type == 'discussion' && github.aw.context.item_number)}}\n- **discussion-number**: #__GH_AW_EXPR_1A3A194A__\n{{/if}}\n{{#if github.event.pull_request.number || (github.aw.context.item_type == 'pull_request' && github.aw.context.item_number)}}\n- **pull-request-number**: #__GH_AW_EXPR_463A214A__\n{{/if}}\n{{#if github.event.comment.id || github.aw.context.comment_id}}\n- **comment-id**: __GH_AW_EXPR_FF1D34CE__\n{{/if}}\n{{#if github.run_id}}\n- **workflow-run-id**: __GH_AW_GITHUB_RUN_ID__\n{{/if}}\n\n\n" + GH_AW_PROMPT_CONTENT_0002: "\n" + GH_AW_PROMPT_CONTENT_0003: "# Apple Container Runtime Smoke\n\nThis fixture exists to pin the **generated output** for `sandbox.agent.runtime: apple-container`.\nIt is compiled by the wasm golden tests; it is not scheduled and is never dispatched against a\nreal runner from this repository, because no bare-metal Apple Silicon runner is registered here.\n\nThe golden lock file is the regression guard for the properties that make this runtime safe:\n\n- the Apple Container host preflight, CLI setup, and service start steps run before AWF,\n- the MCP gateway is published on macOS loopback only and declared to AWF as\n `appleContainer.mcpGatewayUpstreamPort`,\n- the agent addresses the gateway through the guest relay on loopback,\n- `network.topologyAttach` is absent, and\n- teardown runs with `if: always()`.\n\nReport the repository description and stop.\n\n" + with: + script: | + const { setupGlobals } = require(process.env.GH_AW_ACTIONS_DIR + '/setup_globals.cjs'); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(process.env.GH_AW_ACTIONS_DIR + '/create_prompt.cjs'); + await main(core); + - name: Interpolate variables and render templates + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_PROMPT: ${{ runner.temp }}/gh-aw/aw-prompts/prompt.txt + GH_AW_ENGINE_ID: "copilot" + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'interpolate_prompt.cjs')); + await main(); + - name: Substitute placeholders + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_PROMPT: ${{ runner.temp }}/gh-aw/aw-prompts/prompt.txt + GH_AW_EXPR_1A3A194A: ${{ github.event.discussion.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'discussion' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_463A214A: ${{ github.event.pull_request.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'pull_request' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_802A9F6A: ${{ github.event.issue.number || (fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_type == 'issue' && fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').item_number) }} + GH_AW_EXPR_FF1D34CE: ${{ github.event.comment.id || fromJSON(github.event.inputs.aw_context || github.event.client_payload.aw_context || '{}').comment_id }} + GH_AW_GITHUB_ACTOR: ${{ github.actor }} + GH_AW_GITHUB_REPOSITORY: ${{ github.repository }} + GH_AW_GITHUB_RUN_ID: ${{ github.run_id }} + GH_AW_GITHUB_WORKSPACE: ${{ github.workspace }} + GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: ${{ needs.pre_activation.outputs.activated }} + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + + const substitutePlaceholders = require(path.join(actionsDir, 'substitute_placeholders.cjs')); + + // Call the substitution function + return await substitutePlaceholders({ + file: process.env.GH_AW_PROMPT, + substitutions: { + GH_AW_EXPR_1A3A194A: process.env.GH_AW_EXPR_1A3A194A, + GH_AW_EXPR_463A214A: process.env.GH_AW_EXPR_463A214A, + GH_AW_EXPR_802A9F6A: process.env.GH_AW_EXPR_802A9F6A, + GH_AW_EXPR_FF1D34CE: process.env.GH_AW_EXPR_FF1D34CE, + GH_AW_GITHUB_ACTOR: process.env.GH_AW_GITHUB_ACTOR, + GH_AW_GITHUB_REPOSITORY: process.env.GH_AW_GITHUB_REPOSITORY, + GH_AW_GITHUB_RUN_ID: process.env.GH_AW_GITHUB_RUN_ID, + GH_AW_GITHUB_WORKSPACE: process.env.GH_AW_GITHUB_WORKSPACE, + GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED: process.env.GH_AW_NEEDS_PRE_ACTIVATION_OUTPUTS_ACTIVATED + } + }); + - name: Validate prompt placeholders + env: + GH_AW_PROMPT: ${{ runner.temp }}/gh-aw/aw-prompts/prompt.txt + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/validate_prompt_placeholders.sh" + - name: Print prompt + env: + GH_AW_PROMPT: ${{ runner.temp }}/gh-aw/aw-prompts/prompt.txt + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/print_prompt_summary.sh" + - name: Stage prompt files for artifact upload + run: | + mkdir -p /tmp/gh-aw/aw-prompts + cp -a "${RUNNER_TEMP}/gh-aw/aw-prompts/." /tmp/gh-aw/aw-prompts/ + - name: Upload activation artifact + if: success() || failure() + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: activation + include-hidden-files: true + path: | + /tmp/gh-aw/aw_info.json + /tmp/gh-aw/models.json + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/aw-prompts/prompt-template.txt + /tmp/gh-aw/aw-prompts/prompt-import-tree.json + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/base + /tmp/gh-aw/.github/agents + /tmp/gh-aw/.github/skills + if-no-files-found: ignore + retention-days: 1 + + agent: + needs: activation + if: needs.activation.outputs.daily_ai_credits_exceeded != 'true' + runs-on: + - self-hosted + - macOS + - ARM64 + - apple-container + permissions: + contents: read + issues: read + timeout-minutes: 60 + env: + GH_AW_RUNTIME_FEATURES: ${{ vars.GH_AW_RUNTIME_FEATURES }} + GH_AW_WORKFLOW_ID_SANITIZED: applecontainer + outputs: + agentic_engine_timeout: ${{ steps.detect-agent-errors.outputs.agentic_engine_timeout || 'false' }} + ai_credits_rate_limit_error: ${{ steps.parse-mcp-gateway.outputs.ai_credits_rate_limit_error || 'false' }} + aic: ${{ steps.parse-mcp-gateway.outputs.aic }} + ambient_context: ${{ steps.parse-mcp-gateway.outputs.ambient_context }} + checkout_pr_success: ${{ steps.checkout-pr.outputs.checkout_pr_success || 'true' }} + effective_tokens: ${{ steps.parse-mcp-gateway.outputs.effective_tokens }} + http_400_response_error: ${{ steps.detect-agent-errors.outputs.http_400_response_error || 'false' }} + inference_access_error: ${{ steps.detect-agent-errors.outputs.inference_access_error || 'false' }} + invocation_cap_exceeded: ${{ steps.detect-agent-errors.outputs.invocation_cap_exceeded || 'false' }} + max_cache_misses_exceeded: ${{ steps.detect-agent-errors.outputs.max_cache_misses_exceeded || 'false' }} + mcp_policy_error: ${{ steps.detect-agent-errors.outputs.mcp_policy_error || 'false' }} + missing_model_pricing_error: ${{ steps.detect-agent-errors.outputs.missing_model_pricing_error || 'false' }} + missing_model_pricing_model_name: ${{ steps.detect-agent-errors.outputs.missing_model_pricing_model_name || '' }} + model: ${{ needs.activation.outputs.model }} + model_not_supported_error: ${{ steps.detect-agent-errors.outputs.model_not_supported_error || 'false' }} + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + shell_expansion_guard_rejected: ${{ steps.detect-agent-errors.outputs.shell_expansion_guard_rejected || 'false' }} + unknown_model_ai_credits: ${{ steps.parse-mcp-gateway.outputs.unknown_model_ai_credits || 'false' }} + steps: + - name: Checkout actions folder + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: github/gh-aw + sparse-checkout: | + actions + clean: false + persist-credentials: false + - name: Setup Scripts + id: setup + uses: ./actions/setup + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + trace-id: ${{ needs.activation.outputs.setup-trace-id }} + parent-span-id: ${{ needs.activation.outputs.setup-parent-span-id || needs.activation.outputs.setup-span-id }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Apple Container Smoke" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/apple-container.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "COPILOT_VERSION" + GH_AW_INFO_AWF_VERSION: "v0.28.9" + GH_AW_INFO_ENGINE_ID: "copilot" + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - name: Setup Node.js + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version: '24' + package-manager-cache: false + - name: Create gh-aw temp directory + run: bash "${RUNNER_TEMP}/gh-aw/actions/create_gh_aw_tmp_dir.sh" + - name: Configure gh CLI for GitHub Enterprise + run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_gh_for_ghe.sh" + env: + GH_TOKEN: ${{ github.token }} + - name: Download activation artifact + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: activation + path: /tmp/gh-aw + - name: Configure Git credentials + env: + GITHUB_REPOSITORY: ${{ github.repository }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_git_credentials.sh" + - name: Checkout PR branch + id: checkout-pr + if: | + github.event.pull_request || github.event.issue.pull_request || github.event_name == 'workflow_dispatch' && fromJSON(github.event.inputs.aw_context || '{}').item_type == 'pull_request' + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + with: + github-token: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'checkout_pr_branch.cjs')); + await main(); + - name: Install GitHub Copilot CLI + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_copilot_cli.sh" + env: + GH_HOST: github.com + GH_AW_COMPILED_VERSION: dev + - name: Check host eligibility for apple-container + env: + GH_AW_APPLE_CONTAINER_MIN_MACOS: 26 + run: bash "${RUNNER_TEMP}/gh-aw/actions/apple_container_host_preflight.sh" + - name: Set up Apple container CLI + env: + GH_AW_APPLE_CONTAINER_VERSION: 0.12.3 + GH_AW_APPLE_CONTAINER_PKG_SHA256: 83f363126ac1f064588de39cd6b474340d489c1926492a2c4e59c4d54aa6d8e3 + GH_AW_APPLE_CONTAINER_PKG_IDENTITY: "Developer ID Installer: Apple Inc. - Containerization (UPBK2H6LZM)" + GH_AW_APPLE_CONTAINER_MIN_CLI: 0.4.0 + GH_AW_APPLE_CONTAINER_MAX_CLI: 1.0.0 + run: bash "${RUNNER_TEMP}/gh-aw/actions/apple_container_setup_cli.sh" --allow-install + - name: Start Apple container services + run: bash "${RUNNER_TEMP}/gh-aw/actions/apple_container_start_services.sh" + - name: Install AWF binary + run: bash "${RUNNER_TEMP}/gh-aw/actions/install_awf_binary.sh" v0.28.9 --rootless + - name: Determine automatic lockdown mode for GitHub MCP Server + id: determine-automatic-lockdown + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 (source v9) + env: + GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const determineAutomaticLockdown = require(path.join(actionsDir, 'determine_automatic_lockdown.cjs')); + await determineAutomaticLockdown(github, context, core); + - name: Restore agent config folders from base branch + if: steps.checkout-pr.outcome == 'success' + env: + GH_AW_AGENT_FOLDERS: ".agents .github" + GH_AW_AGENT_FILES: "AGENTS.md" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_base_github_folders.sh" + - name: Restore inline sub-agents from activation artifact + env: + GH_AW_SUB_AGENT_DIR: ".github/agents" + GH_AW_SUB_AGENT_EXT: ".agent.md" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_sub_agents.sh" + - name: Restore inline skills from activation artifact + env: + GH_AW_SKILL_DIR: ".github/skills" + run: bash "${RUNNER_TEMP}/gh-aw/actions/restore_inline_skills.sh" + - name: Download container images + run: bash "${RUNNER_TEMP}/gh-aw/actions/download_docker_images.sh" ghcr.io/github/gh-aw-firewall/agent:0.28.9 ghcr.io/github/gh-aw-firewall/api-proxy:0.28.9 ghcr.io/github/gh-aw-firewall/squid:0.28.9 ghcr.io/github/gh-aw-mcpg:MCPG_VERSION + - name: Start MCP Gateway + id: start-mcp-gateway + env: + GH_AW_SINK_VISIBILITY: ${{ steps.determine-automatic-lockdown.outputs.visibility }} + GITHUB_MCP_GUARD_MIN_INTEGRITY: ${{ steps.determine-automatic-lockdown.outputs.min_integrity }} + GITHUB_MCP_GUARD_REPOS: ${{ steps.determine-automatic-lockdown.outputs.repos }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + run: | + set -eo pipefail + mkdir -p "${RUNNER_TEMP}/gh-aw/mcp-config" + if [ -n "${GITHUB_EVENT_PATH:-}" ] && [ -r "${GITHUB_EVENT_PATH}" ]; then + GH_AW_SAFEOUTPUTS_EVENT_PATH="${RUNNER_TEMP}/gh-aw/safeoutputs/github_event.json" + cp "${GITHUB_EVENT_PATH}" "${GH_AW_SAFEOUTPUTS_EVENT_PATH}" + export GITHUB_EVENT_PATH="${GH_AW_SAFEOUTPUTS_EVENT_PATH}" + fi + + # Export gateway environment variables for MCP config and gateway script + export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="9100" + export MCP_GATEWAY_DOMAIN="127.0.0.1" + export MCP_GATEWAY_HOST_DOMAIN="localhost" + MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') + echo "::add-mask::${MCP_GATEWAY_API_KEY}" + export MCP_GATEWAY_API_KEY + export MCP_GATEWAY_PAYLOAD_DIR="/tmp/gh-aw/mcp-payloads" + mkdir -p "${MCP_GATEWAY_PAYLOAD_DIR}" + export MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD="524288" + export MCP_GATEWAY_ALLOWED_MOUNT_ROOTS="${GITHUB_WORKSPACE}:rw,${RUNNER_TEMP}/gh-aw:ro,${RUNNER_TEMP}/gh-aw/safeoutputs:rw,/opt:ro,/tmp:rw,/usr/bin/gh:ro" + export DEBUG="*" + + export GH_AW_ENGINE="copilot" + export GITHUB_PERSONAL_ACCESS_TOKEN="$GITHUB_MCP_SERVER_TOKEN" + MCP_GATEWAY_UID=$(id -u 2>/dev/null || echo '0') + MCP_GATEWAY_GID=$(id -g 2>/dev/null || echo '0') + source "${RUNNER_TEMP}/gh-aw/actions/resolve_docker_socket_gid.sh" + export MCP_GATEWAY_DOCKER_COMMAND='docker run -i --rm --network bridge -p 127.0.0.1:9100:'"${MCP_GATEWAY_PORT}"' --name awmg-mcpg --add-host host.docker.internal:host-gateway --user '"${MCP_GATEWAY_UID}"':'"${MCP_GATEWAY_GID}"' --group-add '"${DOCKER_SOCK_GID}"' -v '"${DOCKER_SOCK_PATH}"':/var/run/docker.sock -e MCP_GATEWAY_PORT -e MCP_GATEWAY_DOMAIN -e MCP_GATEWAY_API_KEY -e MCP_GATEWAY_PAYLOAD_DIR -e MCP_GATEWAY_PAYLOAD_SIZE_THRESHOLD -e DOCKER_HOST=unix:///var/run/docker.sock -e DEBUG -e MCP_GATEWAY_LOG_DIR -e GH_AW_MCP_LOG_DIR -e GH_AW_SAFE_OUTPUTS -e GH_AW_SAFE_OUTPUTS_CONFIG_PATH -e GH_AW_SAFE_OUTPUTS_TOOLS_PATH -e GH_AW_POLICY_ALLOW_CREATE_PULL_REQUEST -e GH_AW_ASSETS_BRANCH -e GH_AW_ASSETS_MAX_SIZE_KB -e GH_AW_ASSETS_ALLOWED_EXTS -e DEFAULT_BRANCH -e GITHUB_MCP_SERVER_TOKEN -e GITHUB_MCP_GUARD_MIN_INTEGRITY -e GITHUB_MCP_GUARD_REPOS -e GH_AW_SINK_VISIBILITY -e GITHUB_REPOSITORY -e GITHUB_SERVER_URL -e GITHUB_SHA -e GITHUB_WORKSPACE -e GITHUB_TOKEN -e GITHUB_RUN_ID -e GITHUB_RUN_NUMBER -e GITHUB_RUN_ATTEMPT -e GITHUB_JOB -e GITHUB_ACTION -e GITHUB_EVENT_NAME -e GITHUB_EVENT_PATH -e GITHUB_ACTOR -e GITHUB_ACTOR_ID -e GITHUB_TRIGGERING_ACTOR -e GITHUB_WORKFLOW -e GITHUB_WORKFLOW_REF -e GITHUB_WORKFLOW_SHA -e GITHUB_REF -e GITHUB_REF_NAME -e GITHUB_REF_TYPE -e GITHUB_HEAD_REF -e GITHUB_BASE_REF -e RUNNER_TEMP -e RUNNER_TOOL_CACHE -e MCP_GATEWAY_ALLOWED_MOUNT_ROOTS -e GITHUB_PERSONAL_ACCESS_TOKEN -v /tmp/gh-aw/mcp-payloads:/tmp/gh-aw/mcp-payloads:rw -v /opt:/opt:ro -v /tmp:/tmp:rw -v '"${GITHUB_WORKSPACE}"':'"${GITHUB_WORKSPACE}"':rw -v '"${RUNNER_TEMP}"'/gh-aw/safeoutputs:'"${RUNNER_TEMP}"'/gh-aw/safeoutputs:rw ghcr.io/github/gh-aw-mcpg:MCPG_VERSION' + + mkdir -p "$HOME/.copilot" + GH_AW_NODE=$(which node 2>/dev/null || command -v node 2>/dev/null || echo node) + cat << GH_AW_MCP_CONFIG_NORM_EOF | "$GH_AW_NODE" "${RUNNER_TEMP}/gh-aw/actions/start_mcp_gateway.cjs" + { + "mcpServers": { + "github": { + "type": "http", + "url": "https://api.githubcopilot.com/mcp/", + "headers": { + "Authorization": "Bearer \${GITHUB_PERSONAL_ACCESS_TOKEN}", + "X-MCP-Features": "fields_param", + "X-MCP-Readonly": "true", + "X-MCP-Toolsets": "repos" + }, + "env": { + "GITHUB_HOST": "${GITHUB_SERVER_URL}", + "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_MCP_SERVER_TOKEN}" + }, + "guard-policies": { + "allow-only": { + "min-integrity": "$GITHUB_MCP_GUARD_MIN_INTEGRITY", + "repos": "$GITHUB_MCP_GUARD_REPOS" + } + } + } + }, + "gateway": { + "port": $MCP_GATEWAY_PORT, + "domain": "${MCP_GATEWAY_DOMAIN}", + "apiKey": "${MCP_GATEWAY_API_KEY}", + "payloadDir": "${MCP_GATEWAY_PAYLOAD_DIR}", + "startupTimeout": 120 + } + } + GH_AW_MCP_CONFIG_NORM_EOF + - name: Clean credentials + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/clean_git_credentials.sh" + - name: Audit pre-agent workspace + id: pre_agent_audit + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/audit_pre_agent_workspace.sh" + - name: Execute GitHub Copilot CLI + id: agentic_execution + # Copilot CLI tool arguments (sorted): + timeout-minutes: 15 + run: | + set -o pipefail + printf '%s' "$(date +%s%3N)" > /tmp/gh-aw/agent_cli_start_ms.txt + trap 'gh_aw_exit_code=$?; mkdir -p /tmp/gh-aw >/dev/null 2>&1 || true; printf "%s" "$gh_aw_exit_code" > /tmp/gh-aw/agent_execution_exit_code.txt || true; rm -f "$HOME/.copilot/settings.json"; if [ "$gh_aw_exit_code" -ne 0 ]; then echo "::error::Agent execution exited with code $gh_aw_exit_code"; fi' EXIT + mkdir -p "$HOME/.copilot" + printf '%s' '{"builtInAgents":{"rubberDuck":false}}' > "$HOME/.copilot/settings.json" + export XDG_CONFIG_HOME="$HOME" + export GH_AW_MCP_CONFIG="$HOME/.copilot/mcp-config.json" + GH_AW_COPILOT_SRC="$(command -v copilot 2>/dev/null || true)" + if [ -z "$GH_AW_COPILOT_SRC" ] || [ ! -x "$GH_AW_COPILOT_SRC" ]; then + echo "GitHub Copilot CLI executable not found on PATH after installation" >&2 + exit 127 + fi + GH_AW_COPILOT_BIN="${RUNNER_TEMP}/gh-aw/bin/copilot" + mkdir -p "${RUNNER_TEMP}/gh-aw/bin" + if [ "$GH_AW_COPILOT_SRC" != "$GH_AW_COPILOT_BIN" ]; then + cp "$GH_AW_COPILOT_SRC" "$GH_AW_COPILOT_BIN" + fi + chmod 755 "$GH_AW_COPILOT_BIN" + + touch /tmp/gh-aw/agent-step-summary.md + GH_AW_NODE_BIN=$(command -v node 2>/dev/null || true) + export GH_AW_NODE_BIN + export COPILOT_API_KEY="$COPILOT_DUMMY_BYOK" + (umask 177 && touch /tmp/gh-aw/agent-stdio.log) + GH_AW_MAX_AI_CREDITS="${GH_AW_MAX_AI_CREDITS:-1000}" + printf '%s\n' "AWF_CONFIG_PAYLOAD" > "${RUNNER_TEMP}/gh-aw/awf-config.json" + cp "${RUNNER_TEMP}/gh-aw/awf-config.json" /tmp/gh-aw/awf-config.json + export GH_AW_MODELS_JSON_PATH="/tmp/gh-aw/models.json" + GH_AW_DOCKER_HOST="" + if [[ "${DOCKER_HOST:-}" =~ ^tcp:// ]]; then + GH_AW_DOCKER_HOST="${DOCKER_HOST}" + fi + if [[ "${DOCKER_HOST:-}" =~ ^tcp:// ]]; then + GH_AW_CHROOT_BINARIES_SOURCE_PATH="${RUNNER_TEMP}/gh-aw" GH_AW_CHROOT_IDENTITY_HOME="${RUNNER_TEMP}/gh-aw/home" node "${RUNNER_TEMP}/gh-aw/actions/patch_awf_chroot_config.cjs" + fi + GH_AW_TOOL_CACHE_MOUNT="" + GH_AW_TOOL_CACHE="${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}" + if [ -d "$GH_AW_TOOL_CACHE" ]; then + if [[ "$GH_AW_TOOL_CACHE" != /opt/* ]]; then + GH_AW_TOOL_CACHE_MOUNT="$GH_AW_TOOL_CACHE:$GH_AW_TOOL_CACHE:ro" + fi + fi + # shellcheck disable=SC1003,SC2016,SC2086 + awf --config "${RUNNER_TEMP}/gh-aw/awf-config.json" --container-workdir "${GITHUB_WORKSPACE}" --mount "${RUNNER_TEMP}/gh-aw:${RUNNER_TEMP}/gh-aw:ro" --mount "${RUNNER_TEMP}/gh-aw:/host${RUNNER_TEMP}/gh-aw:ro" ${GH_AW_TOOL_CACHE_MOUNT:+--mount "$GH_AW_TOOL_CACHE_MOUNT"} ${GH_AW_DOCKER_HOST:+--docker-host "$GH_AW_DOCKER_HOST"} --env-all --exclude-env ACTIONS_ID_TOKEN_REQUEST_TOKEN --exclude-env ACTIONS_ID_TOKEN_REQUEST_URL --exclude-env COPILOT_GITHUB_TOKEN --exclude-env GITHUB_MCP_SERVER_TOKEN --exclude-env MCP_GATEWAY_API_KEY --mount /tmp/gh-aw:/tmp/gh-aw:rw --log-level info --skip-pull \ + -- /bin/bash -c 'set +o histexpand; : "${RUNNER_TOOL_CACHE:?RUNNER_TOOL_CACHE must be set}"; GH_AW_TOOL_CACHE="$RUNNER_TOOL_CACHE"; export PATH="$(find "$GH_AW_TOOL_CACHE" -maxdepth 5 -type d -name bin 2>/dev/null | tr '\''\n'\'' '\'':'\'')$PATH"; [ -n "$GOROOT" ] && export PATH="$GOROOT/bin:$PATH" || true; [ -n "$ERLANG_HOME" ] && export PATH="$ERLANG_HOME/bin:$PATH" || true && GH_AW_NODE_EXEC="${GH_AW_NODE_BIN:-}"; if [ -z "$GH_AW_NODE_EXEC" ] || [ ! -x "$GH_AW_NODE_EXEC" ]; then GH_AW_NODE_EXEC="$(command -v node 2>/dev/null || true)"; fi; if [ -z "$GH_AW_NODE_EXEC" ]; then echo "node runtime missing on this runner — check runtimes.node in workflow YAML" >&2; exit 127; fi; GH_AW_NPM_GLOBAL_ROOT="$(npm root -g 2>/dev/null || true)"; if [ -n "$GH_AW_NPM_GLOBAL_ROOT" ]; then export NODE_PATH="${GH_AW_NPM_GLOBAL_ROOT}${NODE_PATH:+:${NODE_PATH}}"; fi; "$GH_AW_NODE_EXEC" "${RUNNER_TEMP}/gh-aw/actions/copilot_harness.cjs" "${RUNNER_TEMP}/gh-aw/bin/copilot" --add-dir /tmp/gh-aw/ --log-level all --log-dir /tmp/gh-aw/sandbox/agent/logs/ --disable-builtin-mcps --no-ask-user --allow-all-tools --allow-all-paths --add-dir "${GITHUB_WORKSPACE}" --prompt-file /tmp/gh-aw/aw-prompts/prompt.txt' 2>&1 | tee -a /tmp/gh-aw/agent-stdio.log + env: + AWF_REFLECT_ENABLED: 1 + COPILOT_AGENT_RUNNER_TYPE: STANDALONE + COPILOT_DUMMY_BYOK: dummy-byok-key-for-offline-mode + COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + COPILOT_MODEL: ${{ vars.GH_AW_MODEL_DETECTION_COPILOT || vars.GH_AW_DEFAULT_MODEL_COPILOT || 'default' }} + GH_AW_LLM_PROVIDER: github + GH_AW_MAX_AI_CREDITS: ${{ vars.GH_AW_DEFAULT_MAX_AI_CREDITS || '1000' }} + GH_AW_MAX_TURNS: ${{ vars.GH_AW_DEFAULT_MAX_TURNS || '' }} + GH_AW_PHASE: agent + GH_AW_PROMPT: /tmp/gh-aw/aw-prompts/prompt.txt + GH_AW_TIMEOUT_MINUTES: 15 + GH_AW_VERSION: dev + GITHUB_API_URL: ${{ github.api_url }} + GITHUB_AW: true + GITHUB_COPILOT_INTEGRATION_ID: agentic-workflows + GITHUB_HEAD_REF: ${{ github.head_ref }} + GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN || secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} + GITHUB_REF_NAME: ${{ github.ref_name }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_STEP_SUMMARY: /tmp/gh-aw/agent-step-summary.md + GITHUB_WORKSPACE: ${{ github.workspace }} + GIT_AUTHOR_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_AUTHOR_NAME: github-actions[bot] + GIT_COMMITTER_EMAIL: github-actions[bot]@users.noreply.github.com + GIT_COMMITTER_NAME: github-actions[bot] + RUNNER_TEMP: ${{ runner.temp }} + TRACEPARENT: ${{ env.GITHUB_AW_OTEL_TRACE_ID != '' && env.GITHUB_AW_OTEL_PARENT_SPAN_ID != '' && format('00-{0}-{1}-01', env.GITHUB_AW_OTEL_TRACE_ID, env.GITHUB_AW_OTEL_PARENT_SPAN_ID) || '' }} + - name: Detect agent errors + if: always() + id: detect-agent-errors + continue-on-error: true + env: + GH_AW_AGENTIC_EXECUTION_OUTCOME: ${{ steps.agentic_execution.outcome }} + GH_AW_ENGINE_STEP_TIMEOUT_MINUTES: 15 + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'detect_agent_errors.cjs')); + await main(); + - name: Configure Git credentials + env: + GITHUB_REPOSITORY: ${{ github.repository }} + GITHUB_SERVER_URL: ${{ github.server_url }} + GITHUB_TOKEN: ${{ github.token }} + run: bash "${RUNNER_TEMP}/gh-aw/actions/configure_git_credentials.sh" + - name: Tear down Apple Container + if: always() + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/apple_container_teardown.sh" + - name: Copy Copilot session state files to logs + if: always() + continue-on-error: true + run: bash "${RUNNER_TEMP}/gh-aw/actions/copy_copilot_session_state.sh" + - name: Stop MCP Gateway + if: always() + continue-on-error: true + env: + MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} + MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} + GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} + run: | + bash "${RUNNER_TEMP}/gh-aw/actions/stop_mcp_gateway.sh" "$GATEWAY_PID" + - name: Redact secrets in logs + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'redact_secrets.cjs')); + await main(); + env: + GH_AW_SECRET_NAMES: 'COPILOT_GITHUB_TOKEN,GH_AW_GITHUB_MCP_SERVER_TOKEN,GH_AW_GITHUB_TOKEN,GITHUB_TOKEN' + SECRET_COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }} + SECRET_GH_AW_GITHUB_MCP_SERVER_TOKEN: ${{ secrets.GH_AW_GITHUB_MCP_SERVER_TOKEN }} + SECRET_GH_AW_GITHUB_TOKEN: ${{ secrets.GH_AW_GITHUB_TOKEN }} + SECRET_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Append agent step summary + if: always() + run: bash "${RUNNER_TEMP}/gh-aw/actions/append_agent_step_summary.sh" + - name: Parse agent logs for step summary + if: always() + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_AGENT_OUTPUT: /tmp/gh-aw/sandbox/agent/logs/ + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'parse_copilot_log.cjs')); + await main(); + - name: Parse MCP Gateway logs for step summary + if: always() + id: parse-mcp-gateway + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'parse_mcp_gateway_log.cjs')); + await main(); + - name: Print firewall logs + if: always() + continue-on-error: true + env: + AWF_LOGS_DIR: /tmp/gh-aw/sandbox/firewall/logs + run: bash "${RUNNER_TEMP}/gh-aw/actions/print_firewall_logs.sh" --rootless + - name: Parse token usage for step summary + if: always() + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'parse_token_usage.cjs')); + await main(); + - name: Print AWF reflect summary + if: always() + continue-on-error: true + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'awf_reflect_summary.cjs')); + await main(); + - name: Upload agent artifacts + if: always() + continue-on-error: true + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: agent + path: | + /tmp/gh-aw/aw-prompts/prompt.txt + /tmp/gh-aw/sandbox/agent/logs/ + /tmp/gh-aw/redacted-urls.log + /tmp/gh-aw/mcp-logs/ + /tmp/gh-aw/agent_usage.json + /tmp/gh-aw/agent-stdio.log + /tmp/gh-aw/pre-agent-audit.txt + /tmp/gh-aw/agent/ + /tmp/gh-aw/github_rate_limits.jsonl + /tmp/gh-aw/awf-config.json + /tmp/gh-aw/sandbox/firewall/logs/ + /tmp/gh-aw/sandbox/firewall/audit/ + /tmp/gh-aw/sandbox/firewall/awf-reflect.json + if-no-files-found: ignore + + pre_activation: + runs-on: ubuntu-slim + permissions: + contents: read + env: + GH_AW_RUNTIME_FEATURES: ${{ vars.GH_AW_RUNTIME_FEATURES }} + outputs: + activated: ${{ steps.check_membership.outputs.is_team_member == 'true' }} + matched_command: '' + setup-parent-span-id: ${{ steps.setup.outputs.parent-span-id || steps.setup.outputs.span-id }} + setup-span-id: ${{ steps.setup.outputs.span-id }} + setup-trace-id: ${{ steps.setup.outputs.trace-id }} + steps: + - name: Checkout actions folder + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: github/gh-aw + sparse-checkout: | + actions + clean: false + persist-credentials: false + - name: Setup Scripts + id: setup + uses: ./actions/setup + with: + destination: ${{ runner.temp }}/gh-aw/actions + job-name: ${{ github.job }} + env: + GH_AW_SETUP_WORKFLOW_NAME: "Apple Container Smoke" + GH_AW_CURRENT_WORKFLOW_REF: ${{ github.repository }}/.github/workflows/apple-container.lock.yml@${{ github.ref }} + GH_AW_INFO_VERSION: "COPILOT_VERSION" + GH_AW_INFO_AWF_VERSION: "v0.28.9" + GH_AW_INFO_ENGINE_ID: "copilot" + - name: Check team membership for workflow + id: check_membership + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + GH_AW_REQUIRED_ROLES: "" + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const path = require('path'); + const actionsDir = path.join(process.env.RUNNER_TEMP, 'gh-aw', 'actions'); + const { setupGlobals } = require(path.join(actionsDir, 'setup_globals.cjs')); + setupGlobals(core, github, context, exec, io, getOctokit); + const { main } = require(path.join(actionsDir, 'check_membership.cjs')); + await main(); diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden index 91cf394c316..6d2480f1374 100644 --- a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden @@ -444,6 +444,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -609,6 +610,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/playwright-cli-mode.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/playwright-cli-mode.golden index 015770f1dcd..1d5eb12acc8 100644 --- a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/playwright-cli-mode.golden +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/playwright-cli-mode.golden @@ -454,6 +454,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -619,6 +620,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/smoke-copilot.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/smoke-copilot.golden index 862eca468c2..d7559964c3c 100644 --- a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/smoke-copilot.golden +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/smoke-copilot.golden @@ -536,6 +536,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -771,6 +772,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden index 139c9e51104..e93ec154254 100644 --- a/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden +++ b/pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden @@ -445,6 +445,7 @@ jobs: # Export gateway environment variables for MCP config and gateway script export MCP_GATEWAY_PORT="8080" + export MCP_GATEWAY_HOST_PORT="8080" export MCP_GATEWAY_DOMAIN="awmg-mcpg" export MCP_GATEWAY_HOST_DOMAIN="localhost" MCP_GATEWAY_API_KEY=$(openssl rand -base64 45 | tr -d '/+=') @@ -610,6 +611,7 @@ jobs: continue-on-error: true env: MCP_GATEWAY_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-port }} + MCP_GATEWAY_HOST_PORT: ${{ steps.start-mcp-gateway.outputs.gateway-host-port }} MCP_GATEWAY_API_KEY: ${{ steps.start-mcp-gateway.outputs.gateway-api-key }} GATEWAY_PID: ${{ steps.start-mcp-gateway.outputs.gateway-pid }} run: | diff --git a/pkg/workflow/testdata/wasm_golden/fixtures/apple-container.md b/pkg/workflow/testdata/wasm_golden/fixtures/apple-container.md new file mode 100644 index 00000000000..6c870728db9 --- /dev/null +++ b/pkg/workflow/testdata/wasm_golden/fixtures/apple-container.md @@ -0,0 +1,42 @@ +--- +description: Apple Container runtime smoke fixture +on: + workflow_dispatch: +permissions: + contents: read + issues: read +name: Apple Container Smoke +engine: copilot +runs-on: [self-hosted, macOS, ARM64, apple-container] +sandbox: + agent: + id: awf + runtime: apple-container + version: "v0.28.9" +network: + allowed: + - defaults + - github +tools: + github: + mode: remote + toolsets: [repos] +timeout-minutes: 15 +--- + +# Apple Container Runtime Smoke + +This fixture exists to pin the **generated output** for `sandbox.agent.runtime: apple-container`. +It is compiled by the wasm golden tests; it is not scheduled and is never dispatched against a +real runner from this repository, because no bare-metal Apple Silicon runner is registered here. + +The golden lock file is the regression guard for the properties that make this runtime safe: + +- the Apple Container host preflight, CLI setup, and service start steps run before AWF, +- the MCP gateway is published on macOS loopback only and declared to AWF as + `appleContainer.mcpGatewayUpstreamPort`, +- the agent addresses the gateway through the guest relay on loopback, +- `network.topologyAttach` is absent, and +- teardown runs with `if: always()`. + +Report the repository description and stop.