Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .deva.example
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ EPHEMERAL=false
# Hybrid Agent Setup:
#
# Hybrid is the DEFAULT. deva walks every populated subdir under
# ~/.config/deva/ (claude, codex, gemini, grok, kimi, opencode) and mounts each agent's
# ~/.config/deva/ (claude, codex, gemini, grok, kimi, opencode, pi) and mounts each agent's
# canonical entries into the container. Populated = you either
# hand-created the subdir or autolink symlinked it from legacy
# ~/.claude, ~/.codex, ~/.gemini, ~/.grok, ~/.kimi-code, or the opencode
# XDG dirs (~/.config/opencode + ~/.local/share/opencode +
# ~/.claude, ~/.codex, ~/.gemini, ~/.grok, ~/.kimi-code, ~/.pi, or the
# opencode XDG dirs (~/.config/opencode + ~/.local/share/opencode +
# ~/.local/state/opencode) on first run.
#
# No .deva entries required for the common case. To opt OUT of
Expand Down
11 changes: 11 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ jobs:
--build-arg GROK_CLI_VERSION="${{ steps.pins.outputs.grok_cli_version }}" \
--build-arg KIMI_CODE_VERSION="${{ steps.pins.outputs.kimi_code_version }}" \
--build-arg OPENCODE_VERSION="${{ steps.pins.outputs.opencode_version }}" \
--build-arg PI_CODING_AGENT_VERSION="${{ steps.pins.outputs.pi_coding_agent_version }}" \
--build-arg CCX_VERSION="${{ steps.pins.outputs.ccx_version }}" \
--build-arg COPILOT_API_VERSION="${{ steps.pins.outputs.copilot_api_version }}" \
.
Expand All @@ -106,6 +107,7 @@ jobs:
GROK_CLI_VERSION="${{ steps.pins.outputs.grok_cli_version }}" \
KIMI_CODE_VERSION="${{ steps.pins.outputs.kimi_code_version }}" \
OPENCODE_VERSION="${{ steps.pins.outputs.opencode_version }}" \
PI_CODING_AGENT_VERSION="${{ steps.pins.outputs.pi_coding_agent_version }}" \
CCX_VERSION="${{ steps.pins.outputs.ccx_version }}" \
COPILOT_API_VERSION="${{ steps.pins.outputs.copilot_api_version }}" \
PLAYWRIGHT_VERSION="${{ steps.pins.outputs.playwright_version }}" \
Expand Down Expand Up @@ -133,6 +135,7 @@ jobs:
deva.sh grok -Q -- --version
deva.sh kimi -Q -- --version
deva.sh opencode -Q -- --version
deva.sh pi -Q -- --version

- name: Smoke Claude --chrome mount assembly
shell: bash
Expand Down Expand Up @@ -194,6 +197,14 @@ jobs:
DEVA_DOCKER_TAG=ci \
./scripts/test-opencode-auth.sh

- name: Smoke pi auth wiring
shell: bash
run: |
set -euo pipefail
DEVA_DOCKER_IMAGE=deva-smoke \
DEVA_DOCKER_TAG=ci \
./scripts/test-pi-auth.sh

- name: Smoke version targets
shell: bash
run: |
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/nightly-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ jobs:
grok_cli_version: ${{ steps.versions.outputs.grok_cli_version }}
kimi_code_version: ${{ steps.versions.outputs.kimi_code_version }}
opencode_version: ${{ steps.versions.outputs.opencode_version }}
pi_coding_agent_version: ${{ steps.versions.outputs.pi_coding_agent_version }}
ccx_version: ${{ steps.versions.outputs.ccx_version }}
copilot_api_version: ${{ steps.versions.outputs.copilot_api_version }}
steps:
Expand Down Expand Up @@ -86,6 +87,7 @@ jobs:
- Grok CLI: \`${{ steps.versions.outputs.grok_cli_version }}\`
- Kimi Code: \`${{ steps.versions.outputs.kimi_code_version }}\`
- opencode: \`${{ steps.versions.outputs.opencode_version }}\`
- pi: \`${{ steps.versions.outputs.pi_coding_agent_version }}\`
- ccx: \`${{ steps.versions.outputs.ccx_version }}\`
- Copilot API: \`${{ steps.versions.outputs.copilot_api_version }}\`
- Stamp: \`${{ steps.versions.outputs.stamp }}\`
Expand Down Expand Up @@ -149,6 +151,7 @@ jobs:
GROK_CLI_VERSION=${{ needs.resolve-versions.outputs.grok_cli_version }}
KIMI_CODE_VERSION=${{ needs.resolve-versions.outputs.kimi_code_version }}
OPENCODE_VERSION=${{ needs.resolve-versions.outputs.opencode_version }}
PI_CODING_AGENT_VERSION=${{ needs.resolve-versions.outputs.pi_coding_agent_version }}
CCX_VERSION=${{ needs.resolve-versions.outputs.ccx_version }}
COPILOT_API_VERSION=${{ needs.resolve-versions.outputs.copilot_api_version }}

Expand Down Expand Up @@ -205,6 +208,7 @@ jobs:
GROK_CLI_VERSION=${{ needs.resolve-versions.outputs.grok_cli_version }}
KIMI_CODE_VERSION=${{ needs.resolve-versions.outputs.kimi_code_version }}
OPENCODE_VERSION=${{ needs.resolve-versions.outputs.opencode_version }}
PI_CODING_AGENT_VERSION=${{ needs.resolve-versions.outputs.pi_coding_agent_version }}
CCX_VERSION=${{ needs.resolve-versions.outputs.ccx_version }}
PLAYWRIGHT_VERSION=${{ needs.load-version-pins.outputs.playwright_version }}
RUST_TOOLCHAINS=${{ needs.load-version-pins.outputs.rust_toolchains }}
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ jobs:
grok_cli_version: ${{ steps.pins.outputs.grok_cli_version }}
kimi_code_version: ${{ steps.pins.outputs.kimi_code_version }}
opencode_version: ${{ steps.pins.outputs.opencode_version }}
pi_coding_agent_version: ${{ steps.pins.outputs.pi_coding_agent_version }}
ccx_version: ${{ steps.pins.outputs.ccx_version }}
copilot_api_version: ${{ steps.pins.outputs.copilot_api_version }}
playwright_version: ${{ steps.pins.outputs.playwright_version }}
Expand Down Expand Up @@ -91,6 +92,7 @@ jobs:
- Grok CLI: \`${{ steps.pins.outputs.grok_cli_version }}\`
- Kimi Code: \`${{ steps.pins.outputs.kimi_code_version }}\`
- opencode: \`${{ steps.pins.outputs.opencode_version }}\`
- pi: \`${{ steps.pins.outputs.pi_coding_agent_version }}\`
- ccx: \`${{ steps.pins.outputs.ccx_version }}\`
- Copilot API: \`${{ steps.pins.outputs.copilot_api_version }}\`
- Playwright: \`${{ steps.pins.outputs.playwright_version }}\`
Expand Down Expand Up @@ -157,6 +159,7 @@ jobs:
GROK_CLI_VERSION=${{ needs.load-version-pins.outputs.grok_cli_version }}
KIMI_CODE_VERSION=${{ needs.load-version-pins.outputs.kimi_code_version }}
OPENCODE_VERSION=${{ needs.load-version-pins.outputs.opencode_version }}
PI_CODING_AGENT_VERSION=${{ needs.load-version-pins.outputs.pi_coding_agent_version }}
CCX_VERSION=${{ needs.load-version-pins.outputs.ccx_version }}
COPILOT_API_VERSION=${{ needs.load-version-pins.outputs.copilot_api_version }}

Expand Down Expand Up @@ -215,6 +218,7 @@ jobs:
GROK_CLI_VERSION=${{ needs.load-version-pins.outputs.grok_cli_version }}
KIMI_CODE_VERSION=${{ needs.load-version-pins.outputs.kimi_code_version }}
OPENCODE_VERSION=${{ needs.load-version-pins.outputs.opencode_version }}
PI_CODING_AGENT_VERSION=${{ needs.load-version-pins.outputs.pi_coding_agent_version }}
CCX_VERSION=${{ needs.load-version-pins.outputs.ccx_version }}
PLAYWRIGHT_VERSION=${{ needs.load-version-pins.outputs.playwright_version }}
RUST_TOOLCHAINS=${{ needs.load-version-pins.outputs.rust_toolchains }}
Expand Down
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Added
- pi (earendil-works/pi, the minimal multi-provider agent harness by
badlogic) as the 7th agent: `deva.sh pi` (#552). One dot-dir —
everything persists under `~/.pi/agent/` (auth.json, sessions,
settings, trust.json); default `oauth` mounts `~/.pi` writable
(tokens auto-refresh in place, first login via in-app `/login`);
`--auth-with api-key` passes the set provider env keys
(ANTHROPIC/OPENAI/GEMINI/XAI/OPENROUTER) and mounts nothing —
pi's auth.json outranks env keys, so the blank overlay guards the
default path. pi has no permission system by design (its security
doc: run it in a container); deva passes `--approve` for the one
interactive gate (project trust) and sets PI_SKIP_VERSION_CHECK=1
since the image pins `@earendil-works/pi-coding-agent`
(PI_CODING_AGENT_VERSION). `--trace` rejected until cctrace ships
a pi profile
- Stable trace URL via portless (vercel-labs): when the `portless` CLI
is on the host, `--trace` registers/refreshes the `cctrace` alias
for the published UI port and announces the routed URL — the live
Expand Down
5 changes: 5 additions & 0 deletions DEV-LOGS.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,11 @@
- Minimal markdown markers, no unnecessary formatting, minimal emojis.
- Reference issue numbers in the format `#<issue-number>` for easy linking.

# [2026-08-12] Dev Log: pi as the 7th agent #552
- Why: pi (earendil-works/pi, ex badlogic/pi-mono) is the cleanest container-fit yet — no permission system at all, its own security doc says "run it in a contained environment". Multi-provider harness rounds out the herd.
- What: agents/pi.sh (oauth mounts ~/.pi rw — tokens auto-refresh; api-key passes provider env keys, mounts nothing, blank-overlays .pi/agent/auth.json which outranks env), deva.sh registration (auth tag, version label, mounts, autolink, status, env scrub of the 5 provider keys), image pin PI_CODING_AGENT_VERSION=0.84.1 (@earendil-works/pi-coding-agent, needs node >= 22.19 — NODE_MAJOR=22 covers it) through versions.env/Makefile/scripts/CI, scripts/test-pi-auth.sh (16 asserts). Trap dodged: @mariozechner scope is dead (moved to @earendil-works), and @mariozechner/pi is an unrelated vLLM tool.
- Result: 7 agents. test-pi-auth 16/16, release-utils 67/67, tooling test green. --trace deferred (no cctrace pi profile).

# [2026-08-09] Dev Log: context injection moves to local files #548
- Why: every launch appended the container block to tracked AGENTS.md/.claude/CLAUDE.md — phantom diffs, committed container-context lying to host agents, circular @imports triple-loading the block with contradictory persist lines.
- What: inject_workspace_context now writes CLAUDE.local.md (Claude Code's sanctioned local memory, per official docs) + a deva-owned AGENTS.md only when the workspace has none (survey of codex/grok/kimi/opencode sources: all read plain AGENTS.md; AGENTS.override.md SHADOWS team files so it's unsafe to auto-write; kimi's .kimi-code/AGENTS.md is the only additive slot). Both excluded via .git/info/exclude (worktree-safe via rev-parse --git-path); legacy blocks healed on next launch, marker-only files removed. Repo's own polluted AGENTS.md rewritten (imports + block removed), untracked .claude/CLAUDE.md residue deleted.
Expand Down
2 changes: 2 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ ARG GEMINI_CLI_VERSION=0.42.0
ARG GROK_CLI_VERSION=0.2.93
ARG KIMI_CODE_VERSION=0.28.0
ARG OPENCODE_VERSION=1.18.14
ARG PI_CODING_AGENT_VERSION=0.84.1

# Record key tool versions as labels for quick inspection
LABEL org.opencontainers.image.claude_code_version=${CLAUDE_CODE_VERSION}
Expand All @@ -222,6 +223,7 @@ LABEL org.opencontainers.image.gemini_cli_version=${GEMINI_CLI_VERSION}
LABEL org.opencontainers.image.grok_cli_version=${GROK_CLI_VERSION}
LABEL org.opencontainers.image.kimi_code_version=${KIMI_CODE_VERSION}
LABEL org.opencontainers.image.opencode_version=${OPENCODE_VERSION}
LABEL org.opencontainers.image.pi_coding_agent_version=${PI_CODING_AGENT_VERSION}

ARG CCX_VERSION=v0.7.0

Expand Down
2 changes: 2 additions & 0 deletions Dockerfile.rust
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ ARG GEMINI_CLI_VERSION=0.42.0
ARG GROK_CLI_VERSION=0.2.93
ARG KIMI_CODE_VERSION=0.28.0
ARG OPENCODE_VERSION=1.18.14
ARG PI_CODING_AGENT_VERSION=0.84.1
ARG CCX_VERSION=v0.7.0
ARG PLAYWRIGHT_VERSION=1.60.0
ARG RUST_TOOLCHAINS="stable"
Expand All @@ -26,6 +27,7 @@ LABEL org.opencontainers.image.gemini_cli_version=${GEMINI_CLI_VERSION}
LABEL org.opencontainers.image.grok_cli_version=${GROK_CLI_VERSION}
LABEL org.opencontainers.image.kimi_code_version=${KIMI_CODE_VERSION}
LABEL org.opencontainers.image.opencode_version=${OPENCODE_VERSION}
LABEL org.opencontainers.image.pi_coding_agent_version=${PI_CODING_AGENT_VERSION}
LABEL org.opencontainers.image.ccx_version=${CCX_VERSION}
LABEL org.opencontainers.image.playwright_version=${PLAYWRIGHT_VERSION}

Expand Down
17 changes: 14 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ GEMINI_CLI_VERSION ?= 0.42.0
GROK_CLI_VERSION ?= 0.2.93
KIMI_CODE_VERSION ?= 0.28.0
OPENCODE_VERSION ?= 1.18.14
PI_CODING_AGENT_VERSION ?= 0.84.1
CCX_VERSION ?= v0.1.4
COPILOT_API_VERSION ?= 0ea08febdd7e3e055b03dd298bf57e669500b5c1
PLAYWRIGHT_VERSION ?= 1.60.0
Expand Down Expand Up @@ -92,6 +93,7 @@ AGENT_BUILD_ARGS := \
--build-arg GROK_CLI_VERSION=$(GROK_CLI_VERSION) \
--build-arg KIMI_CODE_VERSION=$(KIMI_CODE_VERSION) \
--build-arg OPENCODE_VERSION=$(OPENCODE_VERSION) \
--build-arg PI_CODING_AGENT_VERSION=$(PI_CODING_AGENT_VERSION) \
--build-arg CCX_VERSION=$(CCX_VERSION)

MAIN_BUILD_ARGS := $(TOOLCHAIN_BUILD_ARGS) $(AGENT_BUILD_ARGS) \
Expand Down Expand Up @@ -120,6 +122,7 @@ VERSION_QUERY_OVERRIDES := \
$(if $(filter command line environment environment\ override override,$(origin GROK_CLI_VERSION)),GROK_CLI_VERSION=$(GROK_CLI_VERSION)) \
$(if $(filter command line environment environment\ override override,$(origin KIMI_CODE_VERSION)),KIMI_CODE_VERSION=$(KIMI_CODE_VERSION)) \
$(if $(filter command line environment environment\ override override,$(origin OPENCODE_VERSION)),OPENCODE_VERSION=$(OPENCODE_VERSION)) \
$(if $(filter command line environment environment\ override override,$(origin PI_CODING_AGENT_VERSION)),PI_CODING_AGENT_VERSION=$(PI_CODING_AGENT_VERSION)) \
$(if $(filter command line environment environment\ override override,$(origin CCX_VERSION)),CCX_VERSION=$(CCX_VERSION)) \
$(if $(filter command line environment environment\ override override,$(origin COPILOT_API_VERSION)),COPILOT_API_VERSION=$(COPILOT_API_VERSION)) \
$(if $(filter command line environment environment\ override override,$(origin PLAYWRIGHT_VERSION)),PLAYWRIGHT_VERSION=$(PLAYWRIGHT_VERSION)) \
Expand Down Expand Up @@ -167,16 +170,18 @@ build-main: build-network-check
prev_grok=$$(docker inspect --format='{{ index .Config.Labels "org.opencontainers.image.grok_cli_version" }}' $(MAIN_IMAGE) 2>/dev/null || true); \
prev_kimi=$$(docker inspect --format='{{ index .Config.Labels "org.opencontainers.image.kimi_code_version" }}' $(MAIN_IMAGE) 2>/dev/null || true); \
prev_opencode=$$(docker inspect --format='{{ index .Config.Labels "org.opencontainers.image.opencode_version" }}' $(MAIN_IMAGE) 2>/dev/null || true); \
prev_pi=$$(docker inspect --format='{{ index .Config.Labels "org.opencontainers.image.pi_coding_agent_version" }}' $(MAIN_IMAGE) 2>/dev/null || true); \
fmt() { v="$$1"; if [ -z "$$v" ] || [ "$$v" = "<no value>" ]; then echo "-"; else case "$$v" in v*) echo "$$v";; *) echo "v$$v";; esac; fi; }; \
curC=$$(fmt "$$prev_claude"); curX=$$(fmt "$$prev_codex"); curG=$$(fmt "$$prev_gemini"); curK=$$(fmt "$$prev_grok"); curKi=$$(fmt "$$prev_kimi"); curO=$$(fmt "$$prev_opencode"); \
tgtC=$$(fmt "$(CLAUDE_CODE_VERSION)"); tgtX=$$(fmt "$(CODEX_VERSION)"); tgtG=$$(fmt "$(GEMINI_CLI_VERSION)"); tgtK=$$(fmt "$(GROK_CLI_VERSION)"); tgtKi=$$(fmt "$(KIMI_CODE_VERSION)"); tgtO=$$(fmt "$(OPENCODE_VERSION)"); \
if [ "$$curC" = "$$tgtC" ] && [ "$$curX" = "$$tgtX" ] && [ "$$curG" = "$$tgtG" ] && [ "$$curK" = "$$tgtK" ] && [ "$$curKi" = "$$tgtKi" ] && [ "$$curO" = "$$tgtO" ]; then \
curC=$$(fmt "$$prev_claude"); curX=$$(fmt "$$prev_codex"); curG=$$(fmt "$$prev_gemini"); curK=$$(fmt "$$prev_grok"); curKi=$$(fmt "$$prev_kimi"); curO=$$(fmt "$$prev_opencode"); curP=$$(fmt "$$prev_pi"); \
tgtC=$$(fmt "$(CLAUDE_CODE_VERSION)"); tgtX=$$(fmt "$(CODEX_VERSION)"); tgtG=$$(fmt "$(GEMINI_CLI_VERSION)"); tgtK=$$(fmt "$(GROK_CLI_VERSION)"); tgtKi=$$(fmt "$(KIMI_CODE_VERSION)"); tgtO=$$(fmt "$(OPENCODE_VERSION)"); tgtP=$$(fmt "$(PI_CODING_AGENT_VERSION)"); \
if [ "$$curC" = "$$tgtC" ] && [ "$$curX" = "$$tgtX" ] && [ "$$curG" = "$$tgtG" ] && [ "$$curK" = "$$tgtK" ] && [ "$$curKi" = "$$tgtKi" ] && [ "$$curO" = "$$tgtO" ] && [ "$$curP" = "$$tgtP" ]; then \
echo "Claude: $$tgtC (no change)"; \
echo "Codex: $$tgtX (no change)"; \
echo "Gemini: $$tgtG (no change)"; \
echo "Grok: $$tgtK (no change)"; \
echo "Kimi: $$tgtKi (no change)"; \
echo "opencode: $$tgtO (no change)"; \
echo "pi: $$tgtP (no change)"; \
echo "Already up-to-date"; \
else \
if [ "$$curC" = "$$tgtC" ]; then \
Expand Down Expand Up @@ -209,6 +214,11 @@ build-main: build-network-check
else \
echo "opencode: $$curO -> $$tgtO"; \
fi; \
if [ "$$curP" = "$$tgtP" ]; then \
echo "pi: $$tgtP (no change)"; \
else \
echo "pi: $$curP -> $$tgtP"; \
fi; \
fi
@echo "Hint: override via GO_VERSION=... CLAUDE_CODE_VERSION=... or run 'make versions-pin'"
docker build $(DOCKER_BUILD_FLAGS) -f $(DOCKERFILE) $(MAIN_BUILD_ARGS) -t $(MAIN_IMAGE) .
Expand Down Expand Up @@ -508,6 +518,7 @@ help:
@echo " GROK_CLI_VERSION Grok CLI version (default: $(GROK_CLI_VERSION))"
@echo " KIMI_CODE_VERSION Kimi Code CLI version (default: $(KIMI_CODE_VERSION))"
@echo " OPENCODE_VERSION opencode CLI version (default: $(OPENCODE_VERSION))"
@echo " PI_CODING_AGENT_VERSION pi CLI version (default: $(PI_CODING_AGENT_VERSION))"
@echo " CCX_VERSION Atlas CLI version (default: $(CCX_VERSION))"
@echo " PLAYWRIGHT_VERSION Playwright version (default: $(PLAYWRIGHT_VERSION))"
@echo " CLOAKBROWSER_WRAPPER_VERSION CloakBrowser npm wrapper version (default: $(CLOAKBROWSER_WRAPPER_VERSION))"
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ English | [简体中文](README.zh-CN.md)
[![Docs](https://img.shields.io/badge/docs-docs.deva.sh-111111)](https://docs.deva.sh)
[![License](https://img.shields.io/github/license/thevibeworks/deva)](LICENSE)

Run Claude Code, Codex, Gemini, Grok, Kimi, and opencode inside Docker without pretending the agents' own permission prompts are the thing keeping you safe.
Run Claude Code, Codex, Gemini, Grok, Kimi, opencode, and pi inside Docker without pretending the agents' own permission prompts are the thing keeping you safe.

The container is the sandbox, mounts are the contract. What that buys you:

- Full-speed agents. Permission prompts exist because the blast radius is your host. Make the blast radius a container and YOLO stops being reckless — all six agents run with their permission systems off (`claude --dangerously-skip-permissions`, `codex --dangerously-bypass-approvals-and-sandbox`, `gemini --yolo`, `grok --always-approve`, `kimi --yolo`, opencode via `OPENCODE_PERMISSION` allow-all). Worst case dies with the container.
- Full-speed agents. Permission prompts exist because the blast radius is your host. Make the blast radius a container and YOLO stops being reckless — all seven agents run with their permission systems off (`claude --dangerously-skip-permissions`, `codex --dangerously-bypass-approvals-and-sandbox`, `gemini --yolo`, `grok --always-approve`, `kimi --yolo`, opencode via `OPENCODE_PERMISSION` allow-all, pi has no permission system by design). Worst case dies with the container.
- The vendor's code never sees your host. Agent CLIs are fast-moving npm trees with auto-updaters. Here they are born inside the image: no `~/.ssh`, no `~/.aws`, no shell env soup, no browser profiles. Nothing to harvest.
- Everything that crosses the boundary is explicit. Files: mounts. Secrets: the env you pass. Network: the posture you pick — default bridge, your proxy, `--host-net`, or nothing. If you didn't wire it, the agent doesn't have it.
- Identity is a launch flag, not a global singleton. Per-agent config homes under `~/.config/deva/`, `--auth-with` / `--config-home` for the second account or API-key billing. Switch accounts per run; project, sessions, and container state stay put.
Expand Down Expand Up @@ -40,6 +40,7 @@ deva.sh gemini
deva.sh grok
deva.sh kimi
deva.sh opencode
deva.sh pi

deva.sh claude --rm # throwaway container
deva.sh claude --debug --dry-run # inspect the docker run before trusting it
Expand Down
Loading
Loading