fix(opencode): address gadfly's dogfood review
Build & push image / build-and-push (pull_request) Successful in 8s
Build & push image / build-and-push (pull_request) Successful in 8s
Gadfly's own swarm reviewed PR #26 and reached consensus (3/3 models) on a real bug, plus flagged security/maintainability items. Fixes: - Pass-through auth (BLOCKING, 3/3 agreement): openCodeEnv() stripped every provider key except OLLAMA_API_KEY, so the documented opencode/<provider>/<model> escape hatch (e.g. opencode/anthropic/...) had no way to authenticate — the reusable workflow forwards ANTHROPIC_API_KEY/OPENAI_API_KEY into the container and the allowlist discarded them. Now forward ANTHROPIC_*/OPENAI_*/GOOGLE_*/ GEMINI_* so OpenCode's built-in providers can authenticate, while still withholding gadfly's own secrets (Gitea/findings tokens, claude-code OAuth). - Read-only hardening (security lens): the generated config denied only edit/bash. Using OpenCode's documented permission schema, also deny webfetch/websearch/ external_directory — the network + out-of-sandbox tools — closing the exfiltration surface a prompt-injected review could otherwise reach. Permission is now a map so the deny set is extensible. - Dedup (maintainability lens, 3/3): extract shared filterEnv() and killGroupOnCancel() helpers in engine.go, used by both shell-out engines' runPass/env builders instead of the copy-pasted blocks. - Cosmetic: split the const block so defaultOpenCodeBaseURL's doc comment no longer visually misattaches to the agent-name const. README updated: the read-only note and the reduced-env note now reflect the broader deny set and the forwarded provider keys. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
@@ -176,13 +176,16 @@ secret in config). Tuning knobs (all optional):
|
||||
| `GADFLY_OPENCODE_BIN` | `opencode` | CLI binary path |
|
||||
|
||||
> **Read-only is enforced through config, not a flag.** OpenCode has no `--append-system-prompt`, so
|
||||
> Gadfly generates a per-lens config — the lens system prompt as a `gadfly` agent's prompt, with
|
||||
> `edit`/`bash` denied at both the global and agent level — and injects it via `OPENCODE_CONFIG_CONTENT`.
|
||||
> That env var is the highest-precedence config source in the container, so it **outranks any
|
||||
> `opencode.json` a reviewed repo ships** — a repo can't re-enable edits on the reviewer. The
|
||||
> subprocess runs with a **minimal environment** (`OLLAMA_API_KEY` + `PATH`/`HOME`/locale/`OPENCODE_*`/
|
||||
> `GADFLY_OPENCODE_*`), not the runner's full env; the Gitea token, Anthropic/Claude keys, and findings
|
||||
> token aren't handed to the CLI.
|
||||
> Gadfly generates a per-lens config — the lens system prompt as a `gadfly` agent's prompt, with the
|
||||
> mutating and network tools (`edit`/`bash`/`webfetch`/`websearch`/`external_directory`) denied at both
|
||||
> the global and agent level — and injects it via `OPENCODE_CONFIG_CONTENT`. That env var is the
|
||||
> highest-precedence config source in the container, so it **outranks any `opencode.json` a reviewed
|
||||
> repo ships** — a repo can't re-enable edits on the reviewer. The subprocess runs with a **reduced
|
||||
> environment**: the provider keys OpenCode needs to authenticate (`OLLAMA_API_KEY` for the primary
|
||||
> path, plus `ANTHROPIC_*`/`OPENAI_*`/`GOOGLE_*`/`GEMINI_*` for the `opencode/<provider>/<model>`
|
||||
> pass-through) alongside `PATH`/`HOME`/locale/`OPENCODE_*`/`GADFLY_OPENCODE_*` — but **not** gadfly's
|
||||
> own secrets (the Gitea token, the findings token, or the claude-code subscription token), which the
|
||||
> CLI has no use for.
|
||||
|
||||
> **Newly wired, lightly tested.** Like the claude-code engine, `auto` specialist selection and the
|
||||
> `delegate_investigation` worker are majordomo-only and are skipped here (OpenCode does its own
|
||||
|
||||
Reference in New Issue
Block a user