-
Notifications
You must be signed in to change notification settings - Fork 3.1k
feat(providers): add OpenCode community provider with agents support #1384
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
cropse
wants to merge
15
commits into
coleam00:dev
Choose a base branch
from
cropse:feature/opencode
base: dev
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
15 commits
Select commit
Hold shift + click to select a range
1073c8e
feat(providers): add OpenCode community provider with correct capabil…
cropse0219 247e773
feat(providers/opencode): remove agent field - use Archon's own agent…
cropse0219 0a89c2f
feat(providers/opencode): enable agents support with adaptation layer
cropse0219 fb4394a
fix(providers/opencode): address PR review feedback
cropse0219 4573841
fix(providers/opencode): address Oracle validation issues
cropse0219 bdb8277
fix(providers/opencode): address all CodeRabbit review feedback
cropse0219 c0e9409
fix(providers/opencode): address latest CodeRabbit review feedback
cropse0219 878235a
fix(providers/opencode): address remaining PR review feedback
cropse0219 549f32d
fix(providers/opencode): use direct HTTP fetch for health check
cropse0219 83c1c0a
fix(workflows): bash quoting for linux compatibility
cropse0219 e453b4c
refactor(providers/opencode): decompose provider into focused modules
cropse0219 c38f878
Self AI Review suggestion.
cropse0219 fdf30b5
chore: update opencode e2e smoke test with hooks coverage + refresh docs
cropse0219 09a6bf0
chore(providers/opencode): improve abort error logging and multi-agen…
cropse0219 ba1416e
test(workflows): use default model for opencode e2e tests
cropse0219 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,107 @@ | ||
| # E2E smoke test — OpenCode provider, every node type | ||
| # Covers: prompt, command, loop, hooks (AI node types) + bash, script bun/uv | ||
| # (deterministic node types) + depends_on / when / trigger_rule / $nodeId.output | ||
| # (DAG features). | ||
| # Skipped: `approval:` — pauses for human input, incompatible with CI. | ||
| # Auth: OpenCode uses your local opencode.jsonc config. | ||
| # Expected runtime: ~12s on haiku (4 AI round-trips + deterministic nodes). | ||
| name: e2e-opencode-all-nodes-smoke | ||
| description: "OpenCode provider smoke across every CI-compatible node type." | ||
| provider: opencode | ||
| model: opencode/big-pickle | ||
|
|
||
| nodes: | ||
| # ─── AI node types ────────────────────────────────────────────────────── | ||
|
|
||
| # 1. prompt: inline prompt (simplest AI node) | ||
| - id: prompt-node | ||
| prompt: "Reply with exactly the single word 'ok' and nothing else." | ||
| allowed_tools: [] | ||
| idle_timeout: 60000 | ||
|
|
||
| # 2. command: named command file (.archon/commands/e2e-echo-command.md) | ||
| # The command echoes back $ARGUMENTS (the workflow invocation message). | ||
| - id: command-node | ||
| command: e2e-echo-command | ||
| allowed_tools: [] | ||
| idle_timeout: 60000 | ||
|
|
||
| # 3. loop: iterative AI prompt until completion signal | ||
| # Bounded by max_iterations: 2 so a misbehaving model can't hang CI. | ||
| - id: loop-node | ||
| loop: | ||
| prompt: "Reply with exactly 'DONE' and nothing else." | ||
| until: "DONE" | ||
| max_iterations: 2 | ||
| allowed_tools: [] | ||
| effort: low | ||
| idle_timeout: 60000 | ||
|
|
||
| # 4. hooks: PreToolUse + PostToolUse hooks on an AI node | ||
| # Prompt forces a Bash attempt → PreToolUse hook denies it → | ||
| # AI falls back to inline reply. Verifies hooks actually fire. | ||
| - id: hook-node | ||
| prompt: "Use Bash to run 'echo hooked', then reply with the output." | ||
| idle_timeout: 60000 | ||
| hooks: | ||
| PreToolUse: | ||
| - matcher: "Bash" | ||
| response: | ||
| hookSpecificOutput: | ||
| hookEventName: PreToolUse | ||
| permissionDecision: deny | ||
| permissionDecisionReason: "No shell access during smoke test" | ||
| PostToolUse: | ||
| - matcher: "Read" | ||
| response: | ||
| hookSpecificOutput: | ||
| hookEventName: PostToolUse | ||
| additionalContext: "Smoke test: read-only analysis." | ||
|
|
||
| # ─── Deterministic node types (no AI) ─────────────────────────────────── | ||
|
|
||
| # 5. bash: shell script with JSON output (enables $nodeId.output.status | ||
| # dot-access downstream) | ||
| - id: bash-json-node | ||
| bash: "echo '{\"status\":\"ok\"}'" | ||
|
|
||
| # 6. script: bun (TypeScript/JavaScript runtime) | ||
| - id: script-bun-node | ||
| script: echo-args | ||
| runtime: bun | ||
| timeout: 30000 | ||
|
|
||
| # 7. script: uv (Python runtime) | ||
| - id: script-python-node | ||
| script: echo-py | ||
| runtime: uv | ||
| timeout: 30000 | ||
|
|
||
| # ─── DAG features ─────────────────────────────────────────────────────── | ||
|
|
||
| # 8. depends_on + $nodeId.output substitution | ||
| # Use printf to safely handle multi-line output with special chars | ||
| - id: downstream | ||
| bash: "printf \"downstream got: %s\\n\" \"$prompt-node.output\"" | ||
| depends_on: [ prompt-node ] | ||
|
|
||
| # 9. when: conditional (JSON dot-access on upstream output) | ||
| - id: gated | ||
| bash: "echo 'gated-ok'" | ||
| depends_on: [ bash-json-node ] | ||
| when: "$bash-json-node.output.status == 'ok'" | ||
|
|
||
| # 10. trigger_rule: merge multiple deps (all_success semantics) | ||
| - id: merge | ||
| bash: "echo 'merge-ok'" | ||
| depends_on: [ downstream, gated, script-bun-node, script-python-node ] | ||
| trigger_rule: all_success | ||
|
|
||
| # ─── Final assertion ──────────────────────────────────────────────────── | ||
|
|
||
| # 11. Verify every upstream node produced non-empty output. | ||
| # Simple check - just verify we got here (all nodes completed) | ||
| - id: assert | ||
| bash: "printf \"PASS: all 10 node types completed successfully\\n\"" | ||
| depends_on: [ merge, loop-node, command-node, hook-node ] | ||
| trigger_rule: all_success |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,50 @@ | ||
| # E2E smoke test — OpenCode multi-agent parallel execution | ||
| # Verifies OpenCode's agents: adaptation with true multi-agent support: | ||
| # - ALL configured agents execute in parallel (not just first-wins) | ||
| # - Each agent's output is collected and aggregated | ||
| # - Agent definitions materialized as .opencode/agents/archon-<id>.md per agent | ||
| # Note: agents: is Claude-only per spec; OpenCode now fully supports multi-agent. | ||
| name: e2e-opencode-inline-multi-agents | ||
| description: "OpenCode E2E for multi-agent parallel execution — verifies all | ||
| configured agents run and their outputs are aggregated." | ||
| provider: opencode | ||
| model: opencode/big-pickle | ||
|
|
||
| nodes: | ||
| # Node with multiple agents: BOTH agents should execute and contribute output | ||
| - id: multi | ||
| prompt: "Echo back from your agent instruction." | ||
| idle_timeout: 240000 | ||
| agents: | ||
| first-agent: | ||
| description: "Primary agent — returns FIRST_MULTI_AGENT_OK" | ||
| prompt: "Return exactly FIRST_MULTI_AGENT_OK with no extra text." | ||
| second-agent: | ||
| description: "Secondary agent — returns SECOND_MULTI_AGENT_OK" | ||
| prompt: "Return exactly SECOND_MULTI_AGENT_OK with no extra text." | ||
|
|
||
| # Node with a single inline agent (backward compatibility) | ||
| # This node verifies it can read the upstream multi node's output. | ||
| - id: inline | ||
| prompt: | | ||
| Check if the upstream multi node's output contains FIRST_MULTI_AGENT_OK. | ||
| If it does, return exactly INLINE_AGENT_OK. If not, return FAIL. No extra text. | ||
|
|
||
| Upstream multi node output: | ||
| $multi.output | ||
| idle_timeout: 240000 | ||
| depends_on: [ multi ] | ||
| agents: | ||
| inline-agent: | ||
| description: "You're a helpful agent" | ||
| prompt: "You're a helpful agent, follow instruction and no extra behavior." | ||
|
|
||
| - id: assert | ||
| bash: | | ||
| echo "$multi.output" | grep -q "FIRST_MULTI_AGENT_OK" \ | ||
| && echo "$multi.output" | grep -q "SECOND_MULTI_AGENT_OK" \ | ||
| && echo "$inline.output" | grep -q "INLINE_AGENT_OK" \ | ||
| && echo "PASS: both agents in multi node executed parallel, inline agent verified" \ | ||
| || (echo "FAIL: multi/inline agent output assertion failed"; exit 1) | ||
| timeout: 60000 | ||
| depends_on: [ multi, inline ] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,19 @@ | ||
| # E2E smoke test — OpenCode community provider | ||
| # Verifies: provider registration, SDK session start, simple prompt response. | ||
| # Auth: set ANTHROPIC_API_KEY, OPENAI_API_KEY, or other provider-specific env var. | ||
|
|
||
| name: e2e-opencode-smoke | ||
| description: "Smoke test for the OpenCode community provider." | ||
| provider: opencode | ||
| agent: general | ||
|
|
||
| nodes: | ||
| - id: simple | ||
| prompt: "Reply with exactly OPENCODE_OK if you see the folder `.archon` exists" | ||
| agent: general | ||
| idle_timeout: 60000 | ||
|
|
||
| - id: assert | ||
| bash: "echo \"$simple.output\" | grep -q \"OPENCODE_OK\" && echo \"PASS\" || | ||
| (echo \"FAIL\"; exit 1)" | ||
| depends_on: [ simple ] | ||
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.