Commit Graph

16 Commits

Author SHA1 Message Date
Carlos Florêncio 7ce2e24150 feat(backend): add 10 ACP agents, set_config_option, auth_required flow (#807) 2026-05-04 07:46:56 +01:00
João Salavisa dccff23cc0 feat(backend): per-launch authentication for agentctl (#666)
* feat(backend): per-launch authentication for agentctl

Add nonce-based handshake protocol to secure all agentctl HTTP/WS
endpoints. On launch, the parent (backend) passes a one-time bootstrap
nonce via AGENTCTL_BOOTSTRAP_NONCE env var. agentctl generates its own
auth token, enables Bearer auth immediately, and returns the token to
the parent via POST /auth/handshake (validated by nonce).

Standalone, Docker, and Sprites executors all use the same handshake
flow. Removes the old AGENTCTL_AUTH_TOKEN env var approach. For
Docker/Sprites, the retrieved token is persisted encrypted in
SecretStore (AES-256-GCM) for crash recovery.

Security properties:
- Auth enabled from boot (no unprotected window)
- Token never in env vars (only the burned nonce)
- Nonce is one-shot (replay impossible)
- Constant-time token comparison (timing-safe)

* fix: check fmt.Sscanf return value in integration test

* fix: address review feedback - constant-time nonce comparison, safe ID truncation

* fix(backend): exempt MCP routes from agentctl auth middleware

The agent subprocess connects to agentctl's MCP endpoints (/sse, /message,
/mcp) to use kandev tools (create_task, ask_user_question, etc.). These
endpoints run on the same HTTP server as the authenticated API, but the
agent process doesn't possess the auth token — it was only exchanged
between the backend and agentctl during the handshake.

Exempt /sse, /message, and /mcp from the Bearer auth middleware since the
agent process runs in the same trust boundary as agentctl.

* refactor(backend): remove query param token fallback and document SetAuthToken constraint

Remove the ?token= query parameter fallback from extractBearerToken —
tokens in URLs leak via access logs, referer headers, and browser history.
All WS callers already use Authorization headers via wsAuthHeaders().

Document SetAuthToken's concurrency constraint: it must not be called
concurrently with HTTP requests on the same client.

* fix(backend): enforce mutex in ControlClient/Launcher auth, fix Start() lock scope

- Add sync.Mutex to ControlClient; protect SetAuthToken and AuthToken() reads
- Guard Launcher.AuthToken() with l.mu (written under lock in Start, read unprotected)
- Extract buildAndStartProcess and performHandshake from Start() (was 106 lines, over 80-line limit)
- Release l.mu before blocking health/handshake calls so monitorExit() can close
  l.exited — previously the fast-fail path in waitForHealthy was unreachable
- Update stale executor_backend.go comment (standalone no longer uses env var auth)

Co-authored-by: João Salavisa <undefined@users.noreply.github.com>

---------

Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com>
Co-authored-by: João Salavisa <undefined@users.noreply.github.com>
2026-04-21 14:00:49 +01:00
José Almeida 5b7e54f5da fix: pass MCP servers through LoadSession so tools survive session resume (#450)
* fix: pass MCP servers through LoadSession so tools survive session resume

* fix: pass MCP servers to Copilot ResumeSession (address CR feedback)
2026-03-22 23:19:37 +00:00
Carlos Florêncio bb1caaba11 feat: add ACP agent variants for Claude, Codex, Copilot, and Amp (#387) 2026-03-10 17:30:04 +00:00
Carlos Florêncio 4336f2e4f8 feat: improve mcp ask user debug (#376) 2026-03-05 20:28:13 +00:00
Carlos Florêncio 01b0e9edf1 feat: improve acp + tracing (#258) 2026-02-20 17:30:14 +00:00
Carlos Florêncio 61ef224ec7 style: fix format issues (#255) 2026-02-19 22:18:01 +00:00
Carlos Florêncio fd4ae1eb54 fix: resolve all backend golangci-lint violations (#245) 2026-02-18 18:24:24 +00:00
João Salavisa e2ba35b3bd feat: migrate agent operations from HTTP to WebSocket (#218) 2026-02-13 09:05:40 +00:00
Carlos Florêncio 4e1951aa41 feat: remove blocking http call when creating the agent (#214) 2026-02-09 21:58:15 +00:00
Carlos Florêncio ead9a210f9 feat: add agent boot message (#213) 2026-02-08 23:30:40 +00:00
Carlos Florêncio 3196a02220 feat: file icons (#207) 2026-02-07 15:40:59 +00:00
João Salavisa 93e3759c5f feat: Implement image paste functionality for Claude Code (#188) 2026-02-05 22:34:30 +00:00
João Salavisa 68b398f800 fix: prevent duplicate agent messages in database (#181) 2026-02-04 23:52:26 +00:00
João Salavisa 6eb24006f9 feat: implement task plans feature (#131) 2026-01-31 00:51:17 +00:00
João Salavisa c9355e526b fix: increase prompt timeout to 60min, add error feedback, rename acp to agent API (#97)
* fix: strip origin/ prefix from base branch for rebase/merge operations

The frontend was passing 'origin/main' as the base branch, but the backend
expects just the branch name (e.g., 'main') and constructs 'origin/' itself.

This caused git fetch to fail with:
  fatal: couldn't find remote ref origin/main

Because the command became 'git fetch origin origin/main' instead of
'git fetch origin main'.

* fix: increase prompt timeout to 60min, add error feedback, rename acp to agent API

- Add PromptTimeout constant (60 minutes) in common/constants/timeouts.go
- Update agentctl client and server to use the constant
- Add error message creation when prompt fails (timeout, agent not running, etc)
- Rename /acp/* endpoints to /agent/* (protocol-agnostic naming)
- Rename acp.go files to agent.go in both client and server
- Rename handler functions from handleACP* to handleAgent*
2026-01-25 20:58:30 +00:00