opencode-agent changelog¶
0.6.0¶
Released 2026-10-26.
Changes¶
Google Workspace, Microsoft 365 and Azure CLIs in the image¶
The OpenCode image the chart builds now carries gws (Google Workspace CLI
0.22.5), m365 (CLI for Microsoft 365 11.11.0) and az (Azure CLI 2.91.0),
next to aws (AWS CLI v2) that it already had. The three are pinned to these
releases; the gws download is checked against its published digest. The build
runs each of them once and fails when one does not start.
The image holds no credential for them. Log in from the agent's terminal:
gws auth login, m365 setup once and then m365 login, aws configure sso,
az login --use-device-code. The login stays in the home directory on the
agent's volume, and the agent then acts with your rights in that service.
The image grows by about 700 MB, mostly the Azure CLI and the CLI for Microsoft 365.
Upgrade¶
Nothing to do. With builds.enabled the upgrade starts a new image build, and
the agent restarts on the new image when it is done. With builds.enabled
false, the image in opencode.image decides which tools the agent has.
0.5.2¶
Released 2026-10-25.
Changes¶
Room for an agent at work¶
The opencode container now requests 500m CPU and 2Gi and is limited to 8 CPU and 16Gi, so a busy agent is neither killed for memory nor throttled hard. The sizes follow measured usage of the agents on the platform with generous headroom. The proxy sidecars may use 256Mi instead of 128Mi.
0.5.1¶
Released 2026-10-25.
Changes¶
Token proxy: agent identity through the tenant realm¶
The token proxy copy follows images/agent-identity/token-proxy.py. With AGENT_TOKEN_VIA_URL set, the agent first gets a token from its tenant's own realm with its ServiceAccount token, and that token is the client assertion for the shared realm. Without the variable nothing changes.
0.5.0¶
Released 2026-10-25.
Changes¶
Apps of a team¶
team and tenant put every object of the chart into <tenant>-<team>, the
namespace of the tenant's team, so an app ordered for a team runs next to the
team's agents and MCP servers. Without team the chart renders into the release
namespace as before.
0.4.2¶
Released 2026-10-25.
Changes¶
Labels on the Agent¶
agentLabels puts labels on the kagent Agent. kagent creates the agent's ServiceAccount itself, so a platform that registers ServiceAccounts as OpenID Connect clients reads its label from the Agent instead; with tokenProxy.agentToken the agent then carries its own token on MCP calls.
Upgrade¶
Nothing changes until agentLabels is set.
0.4.1¶
Released 2026-10-25.
Changes¶
The agent's own token for MCP servers¶
The token proxy can carry the agent's own OpenID Connect token on MCP calls. With tokenProxy.agentToken.tokenUrl set, calls under tokenProxy.agentToken.paths (default /mcp) get a token from a client_credentials grant at that endpoint, authenticated with a short-lived ServiceAccount token for tokenProxy.agentToken.audience (federated client authentication). No secret is stored; the token is kept until shortly before it expires. Model calls keep the ServiceAccount token. serviceAccount.labels puts labels on the ServiceAccount, for example the one a platform uses to register it as a client of the realm.
Upgrade¶
Nothing changes until tokenProxy.agentToken.tokenUrl is set. The pod restarts once, because the token proxy script changed.
0.4.0¶
Released 2026-10-24.
Changes¶
Admit the tenant's callers by JWT¶
kagent forwards the Authorization header of whoever chats with an agent
to the agent's A2A adapter. The adapter knew only the per-agent static
credential, so kagent's chat got 401 from every opencode agent. With
a2a.tenantAuth (on by default) the adapter also admits a bearer JWT of
the agent's tenant: a ServiceAccount token from a namespace
The adapter default moves to opencode-a2a 2.0.0+hoolia.2, the first release with this support. A prebuilt a2a.image must be that release or later, or a2a.tenantAuth.enabled set to false.
0.3.6¶
Released 2026-10-22.
Changes¶
Bind login groups to a ClusterRole¶
Kubernetes refuses a Role that grants permissions the creator does not
hold. A project admin, and the project's Argo CD with admin, do not hold
the verb login, so the group lockdown of 0.1.2, 0.3.5 and 0.2.1 failed
to sync for them ("attempting to grant RBAC permissions not currently
held"). oauth.loginClusterRole names a ClusterRole holding that verb;
allowedGroups are bound to it in a RoleBinding
0.3.5¶
Released 2026-10-22.
Changes¶
openhands 0.1.2 (Agent Canvas 1.30.0), owner or group login lockdown (#34)¶
Agent Canvas 1.30.0 binds the frontend through STATIC_SERVER_BIND_HOST instead of a literal --host ::, so the loopback patch rewrites both assignments (the build still asserts two hits). The volume claim template drops the version label: Kubernetes refuses any change there, so every appVersion bump failed the StatefulSet update. A cookie secret that is not 16, 24 or 32 characters long is hashed to 32, as in opencode-agent and openwebui, so a 48-character generated value works.
opencode-agent 0.3.5 and openwebui 0.2.1: with neither oauth.ownerEmail nor person.email set, the login proxy drops the emails file and admits everyone who may get services/proxy on the UI Service, which admin and edit grant. A team instance from a managed Template needs no e-mail. Open WebUI then allows sign-up with role user; the first user is admin. With an owner set the render is unchanged.
Every chart now offers two lockdowns. oauth.ownerEmail admits that one user (emails file). oauth.allowedGroups admits only members of those groups: the login Role grants the verb login on services/proxy of the UI Service and the login proxy checks that verb. The previous check, get on services/proxy, is also held by admin and edit, so any project editor passed a group lockdown. With neither set, project editors log in. openhands gains oauth.ownerEmail.
Verified on berry-ai with the authorization.openshift.io SAR the proxy sends: a grncloud-engineering member is allowed login, a grncloud-admins project admin and an outsider are refused, the same admin is allowed get.
The group lockdown checks the verb login, which only the login Role grants; the tests asserted the previous verb get.
0.3.4¶
Released 2026-10-22.
Changes¶
opencode-agent 0.3.4 turns on formatter and todo (#32)¶
The generated opencode.json uses the OpenCode 2 keys: update disable replaces autoupdate, formatter formats edited files, experimental.todo gives the agent a visible to-do list, worktree.directory keeps worktrees on the volume and watcher.ignore skips dependency and build trees. The opencode container gets no probe: the new pod waits for the old pod's workspace lock and kagent's Deployment rolls.
0.3.3¶
Released 2026-10-21.
Changes¶
opencode-agent 0.3.3 sends no body on 204 and 304 (#26)¶
The UI and token proxies framed every response without a length as chunked, including 204 and 304, and wrote the closing chunk after them. Those responses have no body, so oauth-proxy read the stray chunk as the start of the next response and failed that request: the web UI showed no providers. Responses without a body now go out without chunked framing.
openwebui carries the same token proxy as opencode-agent and CI requires the copies to match. A regression test covers 204 and 304 on a reused connection.
0.3.2¶
Released 2026-10-21.
Changes¶
opencode-agent 0.3.2 turns opencode's provider off (#25)¶
OpenCode enables opencode.ai's public inference with the key "public" on every agent, so a prompt could leave through it instead of the gateway. opencode.disabledProviders (default [opencode]) writes disabled_providers into the generated opencode.json. A user's own global config outranks it, so an allow policy there turns the provider back on.
0.3.1¶
Released 2026-10-21.
Changes¶
opencode-agent 0.3.1 trusts the work tree volume in git (#24)¶
0.3.0¶
Released 2026-10-20.
Changes¶
Run opencode-agent on OpenCode 2 (#19)¶
OpenCode 2.1.1 replaces opencode web with opencode serve and
accepts HTTP Basic only for the user "opencode". oauth-proxy sends
the person as the Basic user, so a new ui-proxy container hands the
UI to OpenCode with OpenCode's own credential; it keeps the Host
header for terminals and tunnels WebSocket upgrades.
The A2A adapter comes from the hoolia/opencode-a2a fork with the OpenCode 2 API, built from its source archive. OpenCode 2 migrates opencode.db in place, so backup-db.sh keeps one copy of the 1.x store under the work tree lock before the first 2.x start.
setup-helm "latest" falls back to Helm 3.18.4 when its release lookup fails, and Helm 3 words the schema error differently, so the access mode test failed now and then. Helm is pinned and the test accepts both wordings.
semgrep 1.182.0 has no musl wheel; uv built its sdist, which lacks semgrep-core, so every new OpenCode image build failed its tool check.
0.2.3¶
Released 2026-10-20.
Changes¶
Let opencode-agent choose its nodes (#17)¶
Chart 0.2.3. builds.nodeSelector places the image builds, nodeSelector and affinity place the agent pod. The 5.7G toolset image built once per agent pushed a small-disk node into DiskPressure, which evicted the builds and an agent pod.
0.2.2¶
Released 2026-10-20.
Changes¶
Add security scanners to opencode-agent (#15)¶
Chart 0.2.2. The OpenCode image carries opa, conftest, trivy, grype, syft, kube-linter, hadolint, shellcheck, kubeconform, cosign, semgrep, checkov, sonar-scanner (on Alpine's OpenJDK 21), renovate and snyk, each at the newest release when the image is built.
0.2.1¶
Released 2026-10-20.
Changes¶
Add MCP runtimes and more CLIs to opencode-agent (#14)¶
Chart 0.2.1. The OpenCode image can run project-defined local MCP servers (node, npm, npx, uv, uvx) and carries go, terraform, packer, ansible-core with common collections, hf, fastapi, uvicorn, gh, promtool, gitleaks, rclone, kubectl-mariadb, kubectl-mdba and database clients. The A2A adapter keeps its SQLite task store in an emptyDir: during a rolling update two adapters on one shared file failed with "locking protocol" and the new pod never became ready.
0.2.0¶
Released 2026-10-20.
Changes¶
Add toolset and A2A peers to opencode-agent (#12)¶
Chart 0.2.0. The OpenCode image now carries a command-line toolset at the newest upstream releases (oc, kubectl, helm, argocd, virtctl, odf and more); the build runs every tool once as a non-root user and fails when one does not start. a2a.peers renders A2A_PEERS for the model plugin's a2a_list_agents and a2a_call tools, and the agent instructions describe those tools only when they exist; they no longer point the model at a tool that is not registered.
0.1.1¶
Released 2026-10-19.
Changes¶
Show the work tree in the project picker (#10)¶
The OpenCode web UI keeps its open projects in the browser, so a new browser starts with none and New session does nothing. Add project offers a picker rooted at HOME, which was /workspace/.home and did not contain the work tree, so the repository could not be picked.
HOME is now /workspace, the parent of the work tree. The XDG directories stay under /workspace/.home, so sessions and settings are kept. Release 0.1.1.
0.1.0¶
Released 2026-10-18.