Files
Ignacy Łątka 5f3b005610 fix(http): require auth token + drop wildcard CORS
The tool-server exposed every registered tool over HTTP with no
authentication and Access-Control-Allow-Origin: * on every response, so
any web origin (Firefox unconditionally; Chrome via PNA-disabled or
loopback-served) could read /tools and invoke /tools/:name from a
cross-origin browser tab.

Adds a per-process auth token:

  - launcher.ts generates a 32-byte hex token at server start, passes it
    to the spawned tool-server via ARGENT_AUTH_TOKEN, and persists it in
    ~/.argent/tool-server.json with mode 0600.
  - http.ts requires Authorization: Bearer <token> on every route except
    /preview (which is the in-process UI and was not gated before;
    tightening it is a follow-up). Constant-time compare prevents
    byte-by-byte timing recovery. Wrong/missing token returns 401.
  - argent-tools-client and argent-mcp/mcp-server thread the token
    through every fetch (fetchTools, callTool, healthcheck, /shutdown).
  - argent-cli/server.ts reads the token for `argent server status`
    healthcheck. The token is hidden from --json output (replaced with
    `hasToken: bool`).
  - ensureToolsServer now returns { url, token } instead of just url.

Also drops the global Access-Control-Allow-Origin: * middleware. The
tool-server is in-process stdio for MCP and same-origin for /preview;
no browser needs cross-origin access. Without CORS, the browser cannot
even read response bodies for hostile cross-origin probes.

Backward compat: when ARGENT_AUTH_TOKEN is unset (e.g., `npm run dev`)
the server logs a one-shot warning and skips the gate, so existing local
dev workflows keep working. Stale state files lacking a token are
treated as a launcher-generation mismatch and the server is respawned.
2026-05-07 15:25:20 +02:00
..