diff --git a/apps/worker/src/env.ts b/apps/worker/src/env.ts index 8a852ec..54a65d9 100644 --- a/apps/worker/src/env.ts +++ b/apps/worker/src/env.ts @@ -38,11 +38,11 @@ const envSchema = z.object({ .enum(["minimal", "openhands"]) .optional() .default("minimal"), - /** OpenHands agent-server URL (local: http://localhost:18000, Cloud: from conversation). */ + /** OpenHands agent-server URL. Docker: http://agent-server:8001, Local: http://localhost:18000 */ AGENT_SERVER_URL: z .string() .optional() - .transform((value) => value?.trim() || "http://localhost:18000"), + .transform((value) => value?.trim() || "http://agent-server:8001"), /** OpenHands session API key for agent-server auth. */ SESSION_API_KEY: z .string() diff --git a/docker/docker-compose.agent-server.yml b/docker/docker-compose.agent-server.yml new file mode 100644 index 0000000..67baa32 --- /dev/null +++ b/docker/docker-compose.agent-server.yml @@ -0,0 +1,51 @@ +# OpenHands Agent Server for Submatter +# Deploys on Dokploy (CT 102) alongside the existing stack +# Worker connects via internal Docker DNS: http://agent-server:8001 + +version: '3.8' + +services: + agent-server: + image: ghcr.io/open-hands/agent-server:0.19.0 # pin to stable version + container_name: echodo-agent-server + ports: + - "8001:8001" # agent-server API + environment: + # Server config + - AGENT_SERVER_HOST=0.0.0.0 + - AGENT_SERVER_PORT=8001 + - LOCAL_BACKEND_API_KEY=${LOCAL_BACKEND_API_KEY} + # LLM config for the agent-server's own operations + - LLM_MODEL=${OMNIROUTE_MODEL:-auto/coding} + - LLM_API_KEY=${OMNIROUTE_API_KEY} + - LLM_BASE_URL=${OMNIROUTE_BASE_URL} + # Sandbox config + - SANDBOX_TYPE=docker + - SANDBOX_DOCKER_IMAGE=ghcr.io/open-hands/sandbox:latest + - SANDBOX_TIMEOUT=300 + # Workspace persistence + - WORKSPACE_BASE=/workspace + volumes: + - agent-server-workspace:/workspace + - /var/run/docker.sock:/var/run/docker.sock # for sandbox containers + networks: + - echodo-network + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8001/server_info"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s + deploy: + resources: + limits: + memory: 2G + cpus: '2' + +volumes: + agent-server-workspace: + +networks: + echodo-network: + external: true diff --git a/docs/AGENT-AUTONOMOUS-CONVOYS.md b/docs/AGENT-AUTONOMOUS-CONVOYS.md index 4646a46..6a54e16 100644 --- a/docs/AGENT-AUTONOMOUS-CONVOYS.md +++ b/docs/AGENT-AUTONOMOUS-CONVOYS.md @@ -435,15 +435,42 @@ By end of Phase 4: --- +## Phase 5: ACP Harness & Runtime Agnosticism (post-v0.1) + +**Goal:** Make submatter runtime-agnostic via Agent Client Protocol (ACP). + +**Why:** ACP is an emerging standard that allows OpenHands, Claude Code, Gemini CLI, and other runtimes to be swapped via a single protocol. This prevents vendor lock-in and lets operators choose the best runtime per task. + +**Tasks:** + +1. Add `HarnessType: "acp"` to shared types +2. Create `apps/worker/src/executor/acp-executor.ts` — implements ACP client (connects to any ACP-compatible server) +3. Support ACP discovery via `/.well-known/agent.json` (runtime metadata) +4. Add `acp` harness type to executor registry +5. Support sub-agents via ACP Task Tool Set + +**ACP-compatible runtimes:** +- OpenHands (primary) +- Claude Code (Anthropic) +- Gemini CLI (Google) +- Cursor (experimental) +- Custom (any ACP server) + +**This is NOT required for v0.1 testing.** Ships after v0.1 ships and proves out. + +--- + ## Rollout & Scaling Once Phase 4 succeeds: 1. **Publish to v0.1** — Mark the orchestrator + worker as production-ready for autonomous convoys -2. **Scale briefs** — Extend to 5–6 briefs per convoy (architect → implementer → reviewer → ops-copilot → etc.) -3. **Scale roles** — Add `role-docs-writer`, `role-security-auditor`, `role-performance-reviewer` as needed -4. **Scale models** — Extend omniroute integration to support Claude/OpenAI/Gemini APIs side-by-side -5. **Migrate Cursor convoys** — For convoys that have historically run in Cursor, run them via OpenHands instead (backward compat: human-initiated, not automated) +2. **Deploy OpenHands Agent Server** — Docker container on Dokploy (CT 102), worker connects via internal Docker DNS +3. **Scale briefs** — Extend to 5–6 briefs per convoy (architect → implementer → reviewer → ops-copilot → etc.) +4. **Scale roles** — Add `role-docs-writer`, `role-security-auditor`, `role-performance-reviewer` as needed +5. **Scale models** — Extend omniroute integration to support Claude/OpenAI/Gemini APIs side-by-side +6. **Migrate Cursor convoys** — For convoys that have historically run in Cursor, run them via OpenHands instead (backward compat: human-initiated, not automated) +7. **ACP harness** — After v0.1 ships, add ACP support to enable runtime-agnostic agent execution ---