Skip to content

feat: add OpenCode engine integration (re-apply PR #18403)#25830

Merged
pelikhan merged 29 commits intomainfrom
copilot/reapply-previous-pull-request-18403
Apr 17, 2026
Merged

feat: add OpenCode engine integration (re-apply PR #18403)#25830
pelikhan merged 29 commits intomainfrom
copilot/reapply-previous-pull-request-18403

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 11, 2026

Re-applies the OpenCode engine integration from #18403, adapted to current HEAD. OpenCode is a provider-agnostic, open-source AI coding agent supporting 75+ models via BYOK (Bring Your Own Key).

New engine (pkg/workflow/opencode_engine.go, opencode_mcp.go)

  • API proxy on port 10004, default Copilot routing via COPILOT_GITHUB_TOKEN (or ${{ github.token }} when copilot-requests feature is enabled)
  • OPENAI_API_KEY env var is sourced from the Copilot token for OpenAI-compatible API access
  • GetSecretValidationStep override skips validation when copilot-requests is enabled (matches Copilot engine pattern)
  • Dynamic domain allowlists based on model provider prefix (copilot/, anthropic/, openai/, google/, groq/, etc.)
  • Writes opencode.jsonc with all permissions set to allow to prevent CI hanging (umask 077 + chmod 600 for credential protection)
  • MCP Gateway integration via convert_gateway_config_opencode.sh (gateway HTTP → OpenCode remote format, with umask 077 + chmod 600)
  • NPM-based installation (opencode-ai@1.2.14)
  • Agent manifest files (opencode.jsonc, AGENTS.md) and path prefixes (.opencode/) for fork PR injection protection

Constants & registration

  • OpenCodeLLMGatewayPort = 10004, OpenCodeCLIModelEnvVar = "OPENCODE_MODEL"
  • Engine definition in data/engines/opencode.md, registered in NewEngineRegistry()
  • AgenticEngines updated to 5 entries, EngineOptions includes COPILOT_GITHUB_TOKEN as primary secret with ANTHROPIC_API_KEY/GOOGLE_API_KEY alternatives
  • Schema descriptions updated to list opencode

Domain allowlists (domains.go)

  • OpenCodeBaseDefaultDomains + openCodeProviderDomains map for dynamic per-provider domains (including copilotapi.githubcopilot.com)
  • extractProviderFromModel() parses provider/model format, defaults to copilot
  • getDefaultDomainsForEngine() / GetAllowedDomainsForEngineWithModel() wire dynamic provider-specific domains into AWF and sanitization
  • Prompt argument kept outside shellJoinArgs so $(cat ...) command substitution expands at runtime

Smoke test (.github/workflows/smoke-opencode.md)

  • 5 tests: GitHub MCP, web-fetch, file write, bash, make build
  • Triggered on workflow_dispatch, pull_request (labeled "smoke"), and reaction (no scheduled runs)

Codebase-wide engine parity

  • Added "opencode" to getDefaultAgentModel() in compiler_yaml_lookups.go (returns "auto" like other built-in engines)
  • Updated CLI --engine flag help text in tokens_bootstrap.go and engine name completions test
  • Updated JSON schema: AWF firewall description and engine identifier examples now include opencode
  • Updated all documentation to reference OpenCode alongside other engines:
    • engines.md: available agents table, feature comparison, version pinning, custom API endpoints, tool timeout, summary tables
    • github-agentic-workflows.md: engine string format, config comments, engine notes, validation enums
    • cli.md, faq.md, environment-variables.md: engine lists and model override variables
    • Auto-regenerated frontmatter-full.md from updated schema
  • Updated pkg/workflow/README.md, pkg/console/README.md, daily-rendering-scripts-verifier.md workflow

Adaptations from original PR

  • Removed SafeInputs references (not in current codebase)
  • Used current helpers: BuildStandardNpmEngineInstallSteps, collectCommonMCPSecrets, renderStandardJSONMCPConfig
  • Removed non-existent BaseEngine fields (supportsWebFetch, supportsPlugins)
  • Paths use current ${RUNNER_TEMP}/gh-aw convention (not legacy /opt/gh-aw)

Tests

  • 28 unit tests covering identity, capabilities, secrets, installation, execution, firewall integration, provider extraction, secret validation with/without copilot-requests, copilot-requests token routing, and agent manifest files/folders
  • Updated engine_catalog_test.go, engine_definition_test.go, constants_test.go for 5 built-in engines
  • Updated completions_test.go for 5 engine names and wasm golden files


✨ PR Review Safe Output Test - Run 24542828858

💥 [THE END] — Illustrated by Smoke Claude · ● 214.7K ·

Copilot AI and others added 2 commits April 11, 2026 15:40
Add OpenCode as a new provider-agnostic agentic engine (BYOK).
- Full API proxy support on port 10004 (default: Anthropic routing)
- Full MCP Gateway integration with opencode.jsonc converter script
- Dynamic domain allowlists based on model provider prefix
- Headless CI mode via opencode run with auto-configured permissions
- Smoke test workflow with 5 tests
- 22 unit tests covering engine identity, secrets, installation, execution, firewall integration

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/3e72b185-d3f9-489e-bd5f-fe95a7f4586e

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
@pelikhan
Copy link
Copy Markdown
Collaborator

@lpcox

@pelikhan pelikhan marked this pull request as ready for review April 11, 2026 17:37
Copilot AI review requested due to automatic review settings April 11, 2026 17:37
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Re-applies the OpenCode engine integration by adding a new built-in opencode agentic engine, wiring it into engine registration/catalog/schema/constants, and introducing an OpenCode-focused smoke workflow plus MCP gateway conversion support.

Changes:

  • Added OpenCode engine implementation + MCP config rendering and comprehensive unit tests.
  • Extended engine registry/catalog/constants/schema to recognize opencode as a built-in engine (now 5 total).
  • Added MCP gateway converter script for OpenCode and a dedicated smoke workflow + generated lock file.
Show a summary per file
File Description
pkg/workflow/opencode_mcp.go Adds MCP JSON config rendering for OpenCode via shared renderer.
pkg/workflow/opencode_engine.go Implements OpenCode engine install/execution/config writing and firewall integration.
pkg/workflow/opencode_engine_test.go Adds unit tests for OpenCode identity, secrets, install, execution, firewall, and provider parsing.
pkg/workflow/engine_definition.go Updates built-in engine count/comment to include opencode.
pkg/workflow/engine_definition_test.go Extends built-in engine definition tests to cover opencode.
pkg/workflow/engine_catalog_test.go Updates expected built-in engine IDs to include opencode.
pkg/workflow/domains.go Adds OpenCode domain sets/provider parsing and registers OpenCode defaults in domain merging.
pkg/workflow/data/engines/opencode.md Introduces embedded engine definition metadata for opencode.
pkg/workflow/agentic_engine.go Registers NewOpenCodeEngine() in the engine registry.
pkg/parser/schemas/main_workflow_schema.json Updates schema descriptions/examples to mention opencode.
pkg/constants/version_constants.go Adds DefaultOpenCodeVersion constant.
pkg/constants/engine_constants.go Adds OpenCodeEngine, updates AgenticEngines and EngineOptions, and introduces OpenCode model env var constant.
pkg/constants/constants.go Adds OpenCodeLLMGatewayPort = 10004.
pkg/constants/constants_test.go Updates tests for the expanded built-in engine list.
actions/setup/sh/start_mcp_gateway.sh Adds opencode) branch to run the OpenCode gateway converter.
actions/setup/sh/convert_gateway_config_opencode.sh Adds a converter from MCP gateway output to opencode.jsonc format.
.github/workflows/smoke-opencode.md Adds a smoke workflow definition for OpenCode.
.github/workflows/smoke-opencode.lock.yml Adds the compiled lock workflow for the OpenCode smoke test.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 18/18 changed files
  • Comments generated: 4

Comment thread pkg/workflow/opencode_engine.go Outdated
Comment on lines +129 to +137
// Prompt from file (positional argument to `opencode run`)
opencodeArgs = append(opencodeArgs, "\"$(cat /tmp/gh-aw/aw-prompts/prompt.txt)\"")

// Build command name
commandName := "opencode"
if workflowData.EngineConfig != nil && workflowData.EngineConfig.Command != "" {
commandName = workflowData.EngineConfig.Command
}
opencodeCommand := fmt.Sprintf("%s run %s", commandName, shellJoinArgs(opencodeArgs))
Copy link

Copilot AI Apr 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The prompt argument is being built as an element of opencodeArgs and then passed through shellJoinArgs. shellJoinArgs will single-quote strings containing "$()", which prevents command substitution when the firewall is disabled (the prompt won’t be read from prompt.txt). Build the command like the Claude/Gemini engines: join the flags with shellJoinArgs, but append the prompt command ("$(cat …)") as a raw positional argument outside of shellJoinArgs so it expands at runtime.

Suggested change
// Prompt from file (positional argument to `opencode run`)
opencodeArgs = append(opencodeArgs, "\"$(cat /tmp/gh-aw/aw-prompts/prompt.txt)\"")
// Build command name
commandName := "opencode"
if workflowData.EngineConfig != nil && workflowData.EngineConfig.Command != "" {
commandName = workflowData.EngineConfig.Command
}
opencodeCommand := fmt.Sprintf("%s run %s", commandName, shellJoinArgs(opencodeArgs))
// Prompt from file (positional argument to `opencode run`).
// Keep this outside shellJoinArgs so command substitution expands at runtime.
promptArg := "\"$(cat /tmp/gh-aw/aw-prompts/prompt.txt)\""
// Build command name
commandName := "opencode"
if workflowData.EngineConfig != nil && workflowData.EngineConfig.Command != "" {
commandName = workflowData.EngineConfig.Command
}
opencodeCommand := fmt.Sprintf("%s run %s %s", commandName, shellJoinArgs(opencodeArgs), promptArg)

Copilot uses AI. Check for mistakes.
Comment thread pkg/workflow/domains.go Outdated
Comment on lines 613 to 621
// engineDefaultDomains maps each engine to its default required domains.
// Add new engines here to avoid adding new engine-specific domain functions.
var engineDefaultDomains = map[constants.EngineName][]string{
constants.CopilotEngine: CopilotDefaultDomains,
constants.ClaudeEngine: ClaudeDefaultDomains,
constants.CodexEngine: CodexDefaultDomains,
constants.GeminiEngine: GeminiDefaultDomains,
constants.CopilotEngine: CopilotDefaultDomains,
constants.ClaudeEngine: ClaudeDefaultDomains,
constants.CodexEngine: CodexDefaultDomains,
constants.GeminiEngine: GeminiDefaultDomains,
constants.OpenCodeEngine: OpenCodeDefaultDomains,
}
Copy link

Copilot AI Apr 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Allowed domains for OpenCode are currently sourced from OpenCodeDefaultDomains via engineDefaultDomains, which is a static list and does not use extractProviderFromModel/GetOpenCodeDefaultDomains. As a result, provider-specific domains like api.groq.com/api.mistral.ai/api.x.ai are never added automatically, despite the presence of openCodeProviderDomains. Either wire GetOpenCodeDefaultDomains(workflowData.EngineConfig.Model) into the OpenCode allowed-domain computation (AWF + sanitization), or remove the unused dynamic-provider helpers to avoid misleading behavior.

See below for a potential fix:

// engineDefaultDomains maps each engine to its static default required domains.
// Engines with model-specific defaults (for example, OpenCode) are resolved in
// getDefaultDomainsForEngine instead of being stored directly in this map.
var engineDefaultDomains = map[constants.EngineName][]string{
	constants.CopilotEngine: CopilotDefaultDomains,
	constants.ClaudeEngine:  ClaudeDefaultDomains,
	constants.CodexEngine:   CodexDefaultDomains,
	constants.GeminiEngine:  GeminiDefaultDomains,
}

// getDefaultDomainsForEngine returns the engine's default required domains.
// OpenCode domains are model/provider-specific, so they must be resolved via
// GetOpenCodeDefaultDomains(model) rather than the static engineDefaultDomains map.
// Falls back to an empty default domain list for unknown engines.
func getDefaultDomainsForEngine(engine constants.EngineName, model string) []string {
	if engine == constants.OpenCodeEngine {
		return GetOpenCodeDefaultDomains(model)
	}

	return engineDefaultDomains[engine]
}

// GetAllowedDomainsForEngineWithModel merges the engine's default domains with
// NetworkPermissions, HTTP MCP server domains, and runtime ecosystem domains.
// For engines with model/provider-specific defaults (such as OpenCode), pass the
// selected model so the correct default domains are included.
// Returns a deduplicated, sorted, comma-separated string suitable for AWF's
// --allow-domains flag.
func GetAllowedDomainsForEngineWithModel(engine constants.EngineName, model string, network *NetworkPermissions, tools map[string]any, runtimes map[string]any) string {
	return mergeDomainsWithNetworkToolsAndRuntimes(getDefaultDomainsForEngine(engine, model), network, tools, runtimes)
}

// GetAllowedDomainsForEngine merges the engine's default domains with NetworkPermissions,
// HTTP MCP server domains, and runtime ecosystem domains.
// Returns a deduplicated, sorted, comma-separated string suitable for AWF's --allow-domains flag.
// Falls back to an empty default domain list for unknown engines.
// For model/provider-specific engines such as OpenCode, prefer
// GetAllowedDomainsForEngineWithModel so provider domains are included.
func GetAllowedDomainsForEngine(engine constants.EngineName, network *NetworkPermissions, tools map[string]any, runtimes map[string]any) string {
	return GetAllowedDomainsForEngineWithModel(engine, "", network, tools, runtimes)

Copilot uses AI. Check for mistakes.
Comment thread pkg/workflow/opencode_engine.go Outdated
Comment on lines +224 to +232
command := fmt.Sprintf(`mkdir -p "$GITHUB_WORKSPACE"
CONFIG="$GITHUB_WORKSPACE/opencode.jsonc"
BASE_CONFIG='%s'
if [ -f "$CONFIG" ]; then
MERGED=$(jq -n --argjson base "$BASE_CONFIG" --argjson existing "$(cat "$CONFIG")" '$existing * $base')
echo "$MERGED" > "$CONFIG"
else
echo "$BASE_CONFIG" > "$CONFIG"
fi`, configJSON)
Copy link

Copilot AI Apr 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

opencode.jsonc will contain MCP gateway headers/tokens after convert_gateway_config_opencode.sh merges MCP config. This step writes/merges the file without setting a restrictive umask or chmod, so it can end up world-readable (default umask 022). Match the other gateway/config scripts by using umask 077 and chmod 600 on the resulting opencode.jsonc.

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +18
set -e

# Required environment variables:
# - MCP_GATEWAY_OUTPUT: Path to gateway output configuration file
# - MCP_GATEWAY_DOMAIN: Domain to use for MCP server URLs (e.g., host.docker.internal)
# - MCP_GATEWAY_PORT: Port for MCP gateway (e.g., 80)
# - GITHUB_WORKSPACE: Workspace directory for project-level config
Copy link

Copilot AI Apr 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This converter writes ${GITHUB_WORKSPACE}/opencode.jsonc, which includes Authorization headers for MCP servers. Unlike convert_gateway_config_gemini.sh/start_mcp_gateway.sh, it doesn’t set a restrictive umask or chmod the output, so the config may be created with overly-permissive mode (e.g., 0644). Consider adding umask 077, set -euo pipefail, and chmod 600 on opencode.jsonc (and any temp files) after writing/merging.

Copilot uses AI. Check for mistakes.
@github-actions
Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 96/100

Excellent test quality

Metric Value
New/modified tests analyzed 5 new top-level functions (~24 sub-cases via t.Run)
✅ Design tests (behavioral contracts) 5 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 5 (100%)
Duplicate test clusters 0
Test inflation detected No (347 test lines / 237 production lines = 1.46:1)
🚨 Coding-guideline violations 1 minor — missing assertion messages in TestExtractProviderFromModel

Test Classification Details

📋 All 5 new test functions (click to expand)
Test File Classification Notes
TestOpenCodeEngine pkg/workflow/opencode_engine_test.go:14 ✅ Design 7 sub-cases; tests engine identity, capabilities, secret requirements. All assertions have messages.
TestOpenCodeEngineInstallation pkg/workflow/opencode_engine_test.go:82 ✅ Design 3 sub-cases including "custom command skips install" (edge case) and firewall integration.
TestOpenCodeEngineExecution pkg/workflow/opencode_engine_test.go:131 ✅ Design 8 sub-cases; tests generated YAML content for execution steps under multiple configurations. Includes NotContains assertions (negative testing).
TestOpenCodeEngineFirewallIntegration pkg/workflow/opencode_engine_test.go:283 ✅ Design 2 complementary sub-cases: firewall enabled vs. disabled. Clear behavioral split.
TestExtractProviderFromModel pkg/workflow/opencode_engine_test.go:325 ✅ Design 4 sub-cases covering standard format, empty model, no-slash model, and case-insensitivity. Pure function with excellent boundary coverage. ⚠️ Missing assertion messages (see below).

Flagged Tests — Requires Review

⚠️ TestExtractProviderFromModel (pkg/workflow/opencode_engine_test.go:325)

Classification: Design test — good behavioral coverage
Issue: The 6 assert.Equal calls inside the sub-tests at lines 331–345 are bare (no message argument), which violates the project guideline that every assertion must include a descriptive message.

// ❌ Current — no message
assert.Equal(t, "anthropic", extractProviderFromModel("anthropic/claude-sonnet-4-20250514"))

// ✅ Suggested — with message
assert.Equal(t, "anthropic", extractProviderFromModel("anthropic/claude-sonnet-4-20250514"),
    "standard 'provider/model' format should extract the provider prefix")

Impact: Low — test intent is still clear from the sub-test names and literal values, but a failure message like "Not equal: expected 'anthropic', got 'openai'" lacks context without the message.


Scoring Breakdown

Component Formula Points
Behavioral Coverage (5 design / 5 total) × 40 40/40
Edge/Error Case Coverage (5 with edge cases / 5 total) × 30 30/30
Low Duplication 0 duplicate clusters × 5 penalty 20/20
Proportional Growth Ratio 1.46:1 (< 2:1 threshold) 10/10
Minor deduction Missing assertion messages in TestExtractProviderFromModel −4
Total 96/100

Language Support

Tests analyzed:

  • 🐹 Go (*_test.go): 5 new top-level functions (unit, //go:build !integration) across 4 files. 3 additional files had minor modifications (adding "opencode" to expected-engine lists — correct maintenance of existing contracts).

Verdict

Check passed. 0% of new tests are implementation tests (threshold: 30%). The new opencode_engine_test.go is well-structured with table-driven subtests, descriptive assertion messages (except in TestExtractProviderFromModel), proper build tags, zero mock usage, and solid behavioral coverage including negative/edge cases. Please add assertion messages to the bare assert.Equal calls in TestExtractProviderFromModel.


📖 Understanding Test Classifications

Design Tests (High Value) verify what the system does:

  • Assert on observable outputs, return values, or state changes
  • Cover error paths and boundary conditions
  • Would catch a behavioral regression if deleted
  • Remain valid even after internal refactoring

Implementation Tests (Low Value) verify how the system does it:

  • Assert on internal function calls (mocking internals)
  • Only test the happy path with typical inputs
  • Break during legitimate refactoring even when behavior is correct
  • Give false assurance: they pass even when the system is wrong

Goal: Shift toward tests that describe the system's behavioral contract — the promises it makes to its users and collaborators.

🧪 Test quality analysis by Test Quality Sentinel · ● 717.5K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Test Quality Sentinel: 96/100. Test quality is excellent — 0% of new tests are implementation tests (threshold: 30%). One minor guideline issue: add assertion messages to the bare assert.Equal calls in TestExtractProviderFromModel (lines 331–345 of opencode_engine_test.go).

Generated by the Design Decision Gate workflow to document the
architectural decision to integrate OpenCode as a provider-agnostic
BYOK agentic engine with dynamic firewall domain allowlisting.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

Commit pushed: ae35c9c

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions
Copy link
Copy Markdown
Contributor

🏗️ Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (713 new lines in pkg/) but does not have a linked Architecture Decision Record (ADR).

AI has analyzed the PR diff and generated a draft ADR to help you get started:

📄 Draft ADR: docs/adr/25830-opencode-engine-integration.md

The draft covers the following design decisions identified in the diff:

  • OpenCode as a fifth built-in BYOK engine — rationale, alternatives to a custom engine wrapper or extending an existing engine, and trade-offs
  • Dynamic per-provider firewall domain allowlisting — why provider domains are parsed from the provider/model string at compile time rather than statically listed
  • Pre-granting all tool permissions via opencode.jsonc — why CI headless mode requires this and the security implications

What to do next

  1. Review the draft ADR committed to your branch at docs/adr/25830-opencode-engine-integration.md
  2. Complete any missing sections — add context the AI couldn't infer, refine the decision rationale, and verify the alternatives reflect what was actually considered
  3. Reference the ADR in this PR body by adding a line such as:

    ADR: ADR-25830: Add OpenCode as a Provider-Agnostic BYOK Agentic Engine

Once an ADR is linked in the PR body, this gate will re-run and verify the implementation matches the decision.

Why ADRs Matter

"AI made me procrastinate on key design decisions. Because refactoring was cheap, I could always say 'I'll deal with this later.' Deferring decisions corroded my ability to think clearly."

ADRs create a searchable, permanent record of why the codebase looks the way it does. Future contributors (and your future self) will thank you.


📋 Michael Nygard ADR Format Reference

An ADR must contain these four sections to be considered complete:

  • Context — What is the problem? What forces are at play?
  • Decision — What did you decide? Why?
  • Alternatives Considered — What else could have been done?
  • Consequences — What are the trade-offs (positive and negative)?

All ADRs are stored in docs/adr/ as Markdown files numbered by PR number (e.g., 25830-opencode-engine-integration.md for this PR).

🔒 This PR has been marked as requesting changes. It cannot merge until an ADR is linked in the PR body.

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · ● 221.6K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR requires an Architecture Decision Record (ADR) before it can merge. A draft ADR has been generated and committed to your branch at docs/adr/25830-opencode-engine-integration.md. Please review, complete, and link it in the PR body. See the comment above for instructions.

@github-actions github-actions bot mentioned this pull request Apr 11, 2026
@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot review all comments

…issions

- Move prompt arg outside shellJoinArgs so command substitution expands at runtime
- Wire GetOpenCodeDefaultDomains(model) into domain computation via
  getDefaultDomainsForEngine/GetAllowedDomainsForEngineWithModel so
  provider-specific API domains (groq, mistral, xai, etc.) are included
- Add umask 077 + chmod 600 to opencode.jsonc config step and converter
  script to protect credential-bearing files

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/61b6fd43-989c-43cc-a63a-9516327a7156

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 11, 2026

@copilot review all comments

Addressed all four review comments in ce0f3e8:

  1. Prompt arg — moved "$(cat ...)" outside shellJoinArgs so command substitution expands at runtime (matches Gemini engine pattern).
  2. Dynamic provider domains — introduced getDefaultDomainsForEngine()/GetAllowedDomainsForEngineWithModel() so OpenCode resolves domains via GetOpenCodeDefaultDomains(model) instead of the static OpenCodeDefaultDomains list. Provider-specific API domains (groq, mistral, xai, etc.) are now included based on model prefix.
  3. Config step permissions — added umask 077 + chmod 600 to the generateOpenCodeConfigStep shell command.
  4. Converter script permissions — added set -euo pipefail, umask 077, and chmod 600 to convert_gateway_config_opencode.sh, matching convert_gateway_config_gemini.sh.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw ase,codename,all-C (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw fflib (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /usr/bin/git GOINSECURE GOMOD GOMODCACHE git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq .object.sha -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE node /opt�� prettier --check 64/bin/go **/*.ts **/*.json --ignore-path /bin/sh (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha --show-toplevel GOPROXY /usr/bin/git GOSUMDB GOWORK 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq .object.sha --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE x_amd64/compile git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha --show-toplevel 388ea2863704f09eGO111MODULE /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel sh /usr/bin/git &#34;prettier&#34; --chegit GOPROXY 64/bin/go git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v9
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha 2929380/b075/_pkg_.a GO111MODULE 2929380/b075=&gt; GOINSECURE GOMOD GOMODCACHE go env KjwS/df7AkiWtgR1_srA3KjwS GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE x_amd64/link git (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha ignore-path ../../../.prettierignore /deps.go x_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha ath ../../../.pr**/*.json (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha h ../../../.prettierignore (http block)
  • https://api.github.com/repos/docker/build-push-action/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/docker/build-push-action/git/ref/tags/v7 --jq .object.sha th .prettierignore --log-level=e!../../../pkg/workflow/js/**/*.json .cfg $name) { hasDiscussionsEnabled } } user.name (http block)
    • Triggering command: /usr/bin/gh gh api /repos/docker/build-push-action/git/ref/tags/v7 --jq .object.sha 07a9d4d84ff7a3b --local _modules/.bin/node user.email (http block)
  • https://api.github.com/repos/docker/metadata-action/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/docker/metadata-action/git/ref/tags/v6 --jq .object.sha th .prettierignore --log-level=e!../../../pkg/workflow/js/**/*.json .cfg r: $owner, name: $name) { hasDiscussionsEnabled } } user.email (http block)
    • Triggering command: /usr/bin/gh gh api /repos/docker/metadata-action/git/ref/tags/v6 --jq .object.sha th .prettierignore --log-level=error --local node user.email (http block)
  • https://api.github.com/repos/docker/setup-buildx-action/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/docker/setup-buildx-action/git/ref/tags/v4 --jq .object.sha th .prettierigno-f --local 64/pkg/tool/linu-f user.name (http block)
    • Triggering command: /usr/bin/gh gh api /repos/docker/setup-buildx-action/git/ref/tags/v4 --jq .object.sha th .prettierigno-f .cfg 64/pkg/tool/linu-f user.email (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility ../pkg/workflow/remote.origin.url .cfg r: $owner, name: $name) { hasDiscussionsEnabled } } yAccounting=yes ota=5% yHigh=170M ache/go/1.25.8/xconfig conf�� -2.15.1.3-py3.12remote.origin.url pull.rebase ache/go/1.25.8/x64/pkg/tool/linu-f (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0.1.2
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v0.47.4
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq .object.sha --show-toplevel ache/go/1.25.8/xGO111MODULE /usr/bin/git 7938098/b419/_pkgit GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git 6E0i/hsXwcYQcv29/bin/sh GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq .object.sha GOSUMDB GOWORK 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha js/**/*.json&#39; --ignore-path ../../../.prettierignore (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq .object.sha GOSUMDB GOWORK 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh (http block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI requested a review from pelikhan April 11, 2026 19:22
@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot default to copilot routing

Copilot AI and others added 2 commits April 11, 2026 19:59
Change the OpenCode engine to route through the Copilot API by default
(OpenAI-compatible endpoint) instead of Anthropic:

- ANTHROPIC_API_KEY → OPENAI_API_KEY as default secret
- ANTHROPIC_BASE_URL → OPENAI_BASE_URL for LLM gateway proxy
- Default provider in extractProviderFromModel() changed to "copilot"
- Added "copilot" entry to openCodeProviderDomains with Copilot API domains
- Updated OpenCodeDefaultDomains static list to include api.githubcopilot.com
- Updated engine definition auth secret and engine options metadata
- Updated all tests to match new Copilot-first defaults

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/9e268586-d79a-426a-ab44-de1e618ff6fe

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 11, 2026

@copilot default to copilot routing

Switched to Copilot routing in 5eff362:

  • Default API key: ANTHROPIC_API_KEYOPENAI_API_KEY (OpenAI-compatible Copilot API)
  • Default gateway URL: ANTHROPIC_BASE_URLOPENAI_BASE_URL
  • Default provider: extractProviderFromModel() now returns "copilot" (not "anthropic")
  • Added "copilot": "api.githubcopilot.com" to openCodeProviderDomains
  • Updated engine definition auth, constants metadata, and all tests

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw c.*target|copiloapi g/workflow/awf_h/repos/actions/upload-artifact/git/ref/tags/v7 x_amd64/vet (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw fflib (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /usr/bin/git GOINSECURE GOMOD GOMODCACHE git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq .object.sha -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE node /opt�� prettier --check 64/bin/go **/*.ts **/*.json --ignore-path node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha --show-toplevel GOPROXY /usr/bin/git GOSUMDB GOWORK 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq .object.sha --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE x_amd64/compile git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel node /usr/bin/git prettier --check 64/bin/go git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v9
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha 931357/b075/_pkg_.a GO111MODULE 931357/b075=&gt; GOINSECURE GOMOD GOMODCACHE go env BZwr/diLhUmd-Mii9BOawBZwr GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE x_amd64/link git (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha ignore-path ../../../.prettierignore rt/assertion_for-ifaceassert x_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha h ../../../.prettierignore (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha h ../../../.prettierignore (http block)
  • https://api.github.com/repos/docker/build-push-action/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/docker/build-push-action/git/ref/tags/v7 --jq .object.sha th .prettierignore --log-level=e!../../../pkg/workflow/js/**/*.json cfg $name) { hasDiscussionsEnabled } } user.email (http block)
    • Triggering command: /usr/bin/gh gh api /repos/docker/build-push-action/git/ref/tags/v7 --jq .object.sha th .prettierignore --log-level=error --local 64/pkg/tool/linux_amd64/vet user.email (http block)
  • https://api.github.com/repos/docker/metadata-action/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/docker/metadata-action/git/ref/tags/v6 --jq .object.sha th .prettierignore --log-level=e!../../../pkg/workflow/js/**/*.json cfg r: $owner, name: $name) { hasDiscussionsEnabled } } user.email (http block)
    • Triggering command: /usr/bin/gh gh api /repos/docker/metadata-action/git/ref/tags/v6 --jq .object.sha th .prettierignoremote.origin.url --local 64/pkg/tool/linux_amd64/vet user.email (http block)
  • https://api.github.com/repos/docker/setup-buildx-action/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/docker/setup-buildx-action/git/ref/tags/v4 --jq .object.sha th .prettierigno-f --local 64/pkg/tool/linu-f user.email (http block)
    • Triggering command: /usr/bin/gh gh api /repos/docker/setup-buildx-action/git/ref/tags/v4 --jq .object.sha th .prettierigno-f cfg 64/pkg/tool/linu-f user.email (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .visibility ../pkg/workflow/remote.origin.url --local r: $owner, name: $name) { hasDiscussionsEnabled } } pull.rebase (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0.1.2
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq .object.sha -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v0.47.4
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq .object.sha --show-toplevel ache/go/1.25.8/xGO111MODULE /usr/bin/git 4880128/b415/_pkgit GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git iBzS/dZ4dH4-QVtj/bin/sh GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq .object.sha GOSUMDB GOWORK 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha js/**/*.json&#39; --ignore-path ../../../.prettierignore (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq .object.sha GOSUMDB GOWORK 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@github-actions
Copy link
Copy Markdown
Contributor

Hey @Copilot 👋 — great work on the OpenCode engine integration! This re-application of #18403 is well-adapted to current HEAD and follows all the established codebase conventions. Here's a quick summary of what makes this PR stand out:

  • Engine Separation Patternopencode_engine.go and opencode_mcp.go follow the same per-engine file layout used by codex_engine.go, claude_engine.go, copilot_engine.go, and gemini_engine.go.
  • Port continuityOpenCodeLLMGatewayPort = 10004 is the natural next value after Claude (10000), Codex (10001), Copilot (10002), Gemini (10003).
  • Runtime npm installation — uses BuildStandardNpmEngineInstallSteps (same pattern as GeminiEngine), no manifest changes needed.
  • Comprehensive tests — 22 unit tests covering identity, capabilities, secrets, installation, execution, firewall integration, and provider extraction, plus a 5-scenario smoke test workflow.
  • Process compliance — authored by the Copilot coding agent with pelikhan as assignee and reviewer, matching the core-team agentic development model described in CONTRIBUTING.md.

This PR looks ready for maintainer review. 🚀


Contribution check: 🟢 Aligned · lgtm · 2,539 lines changed across 19 files

Generated by Contribution Check · ● 2.7M ·

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 17, 2026

@copilot review OpenCode integration, make sure it is referenced everywhere other engines are mentioned. Search for Gemini and compare.

Reviewed all engine references against Gemini and updated 15 files in 403dba4:

Code: Added "opencode" to getDefaultAgentModel() switch, updated CLI --engine flag help text, fixed completion test (4→5 engines), updated wasm golden files.

Schema: Added opencode to AWF firewall description and engine identifier examples.

Docs: Updated engines.md (available agents table, feature comparison, version pinning, tool timeout, custom API endpoint example, summary tables), github-agentic-workflows.md (engine string format, config comment, engine notes, validation enums), cli.md, faq.md, environment-variables.md (model override vars), and auto-regenerated frontmatter-full.md.

Other: Updated pkg/workflow/README.md, pkg/console/README.md, daily-rendering-scripts-verifier.md workflow.

The only references that correctly omit OpenCode are the bare mode descriptions (schema + engine.go) since OpenCode doesn't support SupportsBareMode.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw -embedcfg /tmp/go-build1470446758/b345/embedcfg -pack (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw n_mode.go n_pins.go n_pins_integration_test.go n_pi�� n_pins_test.go n_reference.go n_reference_test.go n_resolver.go n_resolver_test.-C n_sha_checker.go/home/REDACTED/work/gh-aw/gh-aw n_sha_checker_inshow (http block)
  • https://api.github.com/orgs/test-owner/actions/secrets
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv --show-toplevel 64/pkg/tool/linu-trimpath /usr/bin/infocmp -json GO111MODULE 64/pkg/tool/linu--show-toplevel infocmp -1 xterm-color 64/pkg/tool/linurev-parse /usr/bin/git 1146703945/.githgit til.go 64/pkg/tool/linu--show-toplevel git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv e: ${{ secrets.TOKEN }} rev-parse /usr/bin/git -json GO111MODULE 64/bin/go git conf�� --get remote.origin.url /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv t2201990116 kTMme1tRE .yml GOINSECURE record GOMODCACHE ache/go/1.25.8/xrepos/{owner}/{repo}/actions/runs/2/artifacts env 8269/001/stabili.artifacts[].name b6yT/BbTJryFBLs-ik_mNb6yT ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linu/tmp/go-build2021818434/b114/vet.cfg (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel 64/pkg/tool/linuTest User /usr/bin/git g_.a JytyNgNV_ 64/pkg/tool/linu--show-toplevel git rev-�� --show-toplevel 64/pkg/tool/linux_amd64/compile /usr/bin/git g_.a GO111MODULE ache/go/1.25.8/x--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel 1818434/b402/importcfg /usr/bin/git 1818434/b402/embgit l 1818434/b432/sem--show-toplevel git rev-�� --show-toplevel 1818434/b432/semverutil.test /usr/bin/git t0 -importcfg (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --show-toplevel ache/go/1.25.8/x64/pkg/tool/linu-buildtags /usr/bin/git 0056411/b106/_pkgit om/segmentio/asmrev-parse ache/go/1.25.8/xHEAD git rev-�� --show-toplevel ache/go/1.25.8/xREDACTED /usr/bin/git 0056411/b098/_pkgit I_fS/lEXOLD1Q0N_rev-parse ache/go/1.25.8/x--show-toplevel git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v9
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv go1.25.8 -c=4 -nolocalimports -importcfg /tmp/go-build1470056411/b255/importcfg -pack /home/REDACTED/work/gh-aw/gh-aw/pkg/gitutil/gitutil.go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE x_amd64/asm GOINSECURE GOMOD GOMODCACHE x_amd64/asm (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv -json th_meta.go 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE x_amd64/asm GOINSECURE GOMOD GOMODCACHE x_amd64/asm (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv GOMODCACHE x_amd64/compile /usr/bin/git 4/001 GO111MODULE x_amd64/vet git rev-�� --git-dir x_amd64/vet /opt/hostedtoolcache/node/24.14.1/x64/bin/node -json GO111MODULE 64/pkg/tool/linu--show-toplevel /opt/hostedtoolcache/node/24.14.1/x64/bin/node (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv remove remote2 /usr/bin/git 4/001 GO111MODULE x_amd64/link git conf�� user.name Test User /opt/hostedtoolcache/node/24.14.1/x64/bin/node -json eutil.go 64/pkg/tool/linu--show-toplevel /opt/hostedtoolcache/node/24.14.1/x64/bin/node (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv -aw/git/ref/tags/v2.0.0 pnN9IHobo0_Hgqea9f-D/pnN9IHobo0_Hgqea9f-D bject.type] | @tsv -goversion go1.25.8 -c=4 /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -ato�� ons-test3248845124 -buildtags /usr/bin/git l -ifaceassert -nilfunc git (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv quest-18403 (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0.1.2
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv GOMODCACHE x_amd64/compile /usr/bin/git 3/001 GO111MODULE x_amd64/vet git conf�� user.name Test User /opt/hostedtoolcache/node/24.14.1/x64/bin/node -json GO111MODULE 64/pkg/tool/linu--show-toplevel node (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv --show-toplevel -dwarf=false 1/x64/bin/node go1.25.8 -c=4 -nolocalimports git t-ha�� ithub/workflows/api-consumption-report.md remote ow-without-reaction.lock.yml -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv -bool -buildtags /usr/bin/git -errorsas -ifaceassert -nilfunc git -C ons-test3248845124 rev-parse /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/1/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/1/artifacts --jq .artifacts[].name l.go 64/pkg/tool/linux_amd64/compile GOINSECURE .o 64/src/internal/--show-toplevel 64/pkg/tool/linux_amd64/compile env 3860414000 GO111MODULE ache/go/1.25.8/x64/pkg/tool/linu-test.short=true GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linuconfig (http block)
    • Triggering command: /usr/bin/gh gh run download 1 --dir test-logs/run-1 rotocol/go-sdk@v1.5.0/auth/auth.main 64/pkg/tool/linux_amd64/compile GOINSECURE ty.o 64/src/internal/--show-toplevel 64/pkg/tool/linux_amd64/compile env 3674662818/.github/workflows NG8R67gve util.test GOINSECURE go-sdk/mcp GOMODCACHE util.test (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12345/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12345/artifacts --jq .artifacts[].name GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env g_.a JtV1iahb4 /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE go-sdk/internal/rev-parse GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 12345 --dir test-logs/run-12345 SUy_HbpQE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env g_.a InX8DV7o_ 64/pkg/tool/linux_amd64/link GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/link (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12346/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12346/artifacts --jq .artifacts[].name GO111MODULE x_amd64/link GOINSECURE GOMOD GOMODCACHE x_amd64/link env g_.a GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD abis jJ/eNLpKCNOPvJX5m-Eh2k5/90yjX1q7tOqJYdO6KetQ (http block)
    • Triggering command: /usr/bin/gh gh run download 12346 --dir test-logs/run-12346 rotocol/go-sdk@v1.5.0/jsonrpc/jsonrpc.go 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env g_.a dq87ptaK6 64/pkg/tool/linux_amd64/link GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/link (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/2/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/2/artifacts --jq .artifacts[].name ik_mNb6yT 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linu/tmp/go-build2021818434/b114/vet.cfg env 3860414000 DfcRFzBGz ache/go/1.25.8/x64/pkg/tool/linu-test.short=true GOINSECURE til GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linurev-parse (http block)
    • Triggering command: /usr/bin/gh gh run download 2 --dir test-logs/run-2 GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD abis 64/pkg/tool/linuTest User env g_.a deRMpwyMD x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/3/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/3/artifacts --jq .artifacts[].name 4/apic.go 64/pkg/tool/linux_amd64/compile GOINSECURE essage abis 64/pkg/tool/linux_amd64/compile env 3860414000 ke8fejfLv 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh run download 3 --dir test-logs/run-3 5.0/deviceauth.go 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env g_.a tVIFB3NxN ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile GOINSECURE go-sdk/oauthex GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linuremote (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/4/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/4/artifacts --jq .artifacts[].name verutil.go 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env 3860414000 GO111MODULE ache/go/1.25.8/x64/pkg/tool/linu-nilfunc GOINSECURE onpins GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linu-tests (http block)
    • Triggering command: /usr/bin/gh gh run download 4 --dir test-logs/run-4 2C7db5rpj 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linutest@example.com env g_.a QuPWq4ACQ ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linurev-parse (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/5/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/5/artifacts --jq .artifacts[].name GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD abis 64/pkg/tool/linux_amd64/compile env 3860414000 bbyq8rTOi ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh run download 5 --dir test-logs/run-5 5.0/internal/doc.go 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD abis 64/pkg/tool/linux_amd64/compile env g_.a Bzwz7Kv-X ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linuconfig (http block)
  • https://api.github.com/repos/github/gh-aw/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path 316774198/001&#39; 316774198/001&#39; 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE y.s (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 100 GOMOD GOMODCACHE x_amd64/asm env -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 6 GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env g_.a GO111MODULE x_amd64/vet GOINSECURE GOMOD abis x_amd64/vet (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v0.47.4
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq [.object.sha, .object.type] | @tsv --show-toplevel 64/pkg/tool/linutest@example.com /usr/bin/git ortcfg qbNVEaFt_ k git rev-�� --show-toplevel ache/go/1.25.8/x64/pkg/tool/linuTest User /usr/bin/git 8269/001/stabilils GO111MODULE .cfg git (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv g_.a dtNyzpRaw 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet estl�� ortcfg DFryr79XR ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile env -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v2.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile env -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v3.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile env -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq [.object.sha, .object.type] | @tsv g_.a Fs27lbYse 64/pkg/tool/linux_amd64/link GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linuremote.origin.url estl�� stants.test 0kiaYELPw ortcfg.link GOINSECURE GOMOD GOMODCACHE aj4uKk_plXJDlpPi^remote\..*\.gh-resolved$ (http block)
  • https://api.github.com/repos/nonexistent/repo/actions/runs/12345
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion GOINSECURE (http block)
  • https://api.github.com/repos/owner/repo/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json go 64/bin/go GOINSECURE GOMOD y.s go (http block)
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/owner/repo/contents/file.md
    • Triggering command: /tmp/go-build2021818434/b400/cli.test /tmp/go-build2021818434/b400/cli.test -test.testlogfile=/tmp/go-build2021818434/b400/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true -nolocalimports -importcfg /tmp/go-build1470056411/b206/importcfg -pack env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/test-owner/test-repo/actions/secrets
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD tomic_wasm.s go (http block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI and others added 2 commits April 17, 2026 01:21
…ous-pull-request-18403

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Agent-Logs-Url: https://github.com/github/gh-aw/sessions/9f048657-6f8d-46f1-acad-714104424b9b

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 17, 2026

@copilot merge main and recompile

Merged main and recompiled all 193 workflows in 474111f. Build and fmt pass cleanly.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw -embedcfg /tmp/go-build1492507628/b345/embedcfg -pack (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw Cd/olG6yNtYMQl-eview (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@github-actions
Copy link
Copy Markdown
Contributor

📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 17, 2026

🎬 THE ENDSmoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨

@github-actions github-actions bot removed the smoke label Apr 17, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 17, 2026

🎯 Smoke OpenCode MISSION COMPLETE! OpenCode has delivered. ⚡

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 17, 2026

⚠️ Smoke Gemini failed. Gemini encountered unexpected challenges...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 17, 2026

🌑 The shadows whisper... Smoke Codex failed. The oracle requires further meditation...

@github-actions
Copy link
Copy Markdown
Contributor

Agent Container Tool Check

Tool Status Version
bash 5.2.21
sh available
git 2.53.0
jq 1.7
yq v4.52.5
curl 8.5.0
gh 2.89.0
node v20.20.2
python3 3.12.3
go 1.24.13
java 21.0.10 (Temurin)
dotnet 10.0.201

Result: 12/12 tools available ✅

Overall Status: PASS

🔧 Tool validation by Agent Container Smoke Test · ● 165.4K ·

@github-actions
Copy link
Copy Markdown
Contributor

💥 Smoke Test 24542828858 — Claude engine

Test
#1 GitHub MCP
#2 GH CLI
#3 Serena LSP
#4 Make Build ⚠️ (make timeout, go build ✅)
#5 Playwright
#6 Tavily Search
#7-8 File/Bash
#9 Discussion
#10 AWF MCP ❌ tool unavailable
#11 Slack
#12 Code Scan
#13 Update PR
#14 Review Comments
#15 Submit Review
#16 Resolve Thread ⚠️ skipped
#17 Add Reviewer
#18 Push Branch
#19 Close PR ⚠️ skipped

Status: PARTIAL (15 pass, 1 fail, 3 skip)

💥 [THE END] — Illustrated by Smoke Claude · ● 214.7K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💥 Automated smoke test review - all systems nominal! This review is part of automated smoke testing (run 24542828858) to validate the PR review safe output pipeline for the Claude engine.

💥 [THE END] — Illustrated by Smoke Claude · ● 214.7K


- **`engine:`** - AI processor configuration
- String format: `"copilot"` (default, recommended), `"claude"`, `"codex"`, or `"gemini"`
- String format: `"copilot"` (default, recommended), `"claude"`, `"codex"`, `"gemini"`, or `"opencode"` (experimental)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Smoke Test Review Comment #1 — The OpenCode engine string format description looks good! The addition of "opencode" (experimental) to the list of supported engines is clear and consistent with other engine entries. Consider adding a brief note about the BYOK model requirement in the description for discoverability. — Automated smoke test run 24542828858

- **Note**: The `version`, `model`, and `max-turns` fields have sensible defaults and can typically be omitted unless you need specific customization.
- **`gemini` engine**: Google Gemini CLI. Requires `GEMINI_API_KEY` secret. Does not support `max-turns`, `web-fetch`, or `web-search`. Supports AWF firewall and LLM gateway.
- **`opencode` engine** (experimental): Provider-agnostic, open-source AI coding agent (BYOK). Defaults to Copilot routing via `COPILOT_GITHUB_TOKEN` (or `${{ github.token }}` with `copilot-requests` feature). Supports 75+ models via `provider/model` format. Supports AWF firewall and LLM gateway.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Smoke Test Review Comment #2 — The new OpenCode engine documentation note is well-written. The mention of COPILOT_GITHUB_TOKEN as the default routing mechanism and the 75+ models via provider/model format gives users a clear picture. One suggestion: add an example provider/model value (e.g., anthropic/claude-opus-4-5) to make it even more actionable. — Automated smoke test run 24542828858

@github-actions
Copy link
Copy Markdown
Contributor

Smoke Test Results — Run §24542828848

Test Status
GitHub MCP
MCP Scripts GH CLI
Serena CLI
Playwright CLI
Web Fetch
File Writing + Bash
Discussion Interaction
Build gh-aw
Upload artifact
Discussion Creation
Workflow Dispatch
PR Review

Overall: ✅ PASS

@copilot-swe-agent — all checks green!

📰 BREAKING: Report filed by Smoke Copilot · ● 1.3M ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Smoke test review of PR #25830 — OpenCode engine integration. The documentation changes are well-structured, clearly marking opencode as experimental. Two minor suggestions: clarify BYOK terminology and ensure auth requirements are as prominent as they are for other engines (gemini's GEMINI_API_KEY note).

📰 BREAKING: Report filed by Smoke Copilot · ● 1.3M


- **`engine:`** - AI processor configuration
- String format: `"copilot"` (default, recommended), `"claude"`, `"codex"`, or `"gemini"`
- String format: `"copilot"` (default, recommended), `"claude"`, `"codex"`, `"gemini"`, or `"opencode"` (experimental)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Good addition of opencode as an experimental engine option. The documentation clearly marks it as experimental, which is appropriate for a new integration. Consider adding a note about the required COPILOT_GITHUB_TOKEN or github.token with copilot-requests feature, similar to how gemini mentions GEMINI_API_KEY.


- **Note**: The `version`, `model`, and `max-turns` fields have sensible defaults and can typically be omitted unless you need specific customization.
- **`gemini` engine**: Google Gemini CLI. Requires `GEMINI_API_KEY` secret. Does not support `max-turns`, `web-fetch`, or `web-search`. Supports AWF firewall and LLM gateway.
- **`opencode` engine** (experimental): Provider-agnostic, open-source AI coding agent (BYOK). Defaults to Copilot routing via `COPILOT_GITHUB_TOKEN` (or `${{ github.token }}` with `copilot-requests` feature). Supports 75+ models via `provider/model` format. Supports AWF firewall and LLM gateway.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new opencode engine description is comprehensive. One suggestion: the parenthetical "(BYOK)" might not be familiar to all users — consider spelling out "Bring Your Own Key" or linking to documentation explaining the BYOK model.

@github-actions
Copy link
Copy Markdown
Contributor

📰 VERDICT: Smoke Copilot has concluded. All systems operational. This is a developing story. 🎤

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot pp Mark open code as experimental.

@pelikhan pelikhan merged commit a5c7a94 into main Apr 17, 2026
161 of 165 checks passed
@pelikhan pelikhan deleted the copilot/reapply-previous-pull-request-18403 branch April 17, 2026 01:50
Copilot stopped work on behalf of pelikhan due to an error April 17, 2026 01:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants