VS Code extension: AI coding assistant with streaming tool calls, inline diff viewer, and custom skill support. Built in TypeScript, active in 2026.
Argus runs Claude Code or Codex conversations in a VS Code webview or browser. The provider button beside the composer opens the account and model picker. Switching provider starts a new conversation; existing conversations retain their provider and can be resumed from history. Provider and model changes are saved automatically for new conversations. Fresh settings start with Codex and GPT-6-Luna. The permission picker remembers each provider's level separately and defaults to Full.
React webview / browser
<-> WebSocket server, workspace channels and conversation state
<-> provider registry (AgentProvider + AgentSession)
| Claude Code: existing streaming CLI execution
| Codex: bidirectional app-server JSONL RPC over stdio
Adapters own native protocols, model discovery, account usage, skills and history.
The UI consumes shared events and capability descriptors. Session bindings and
selection are saved in ~/.argus/argus-provider-sessions.json beside
~/.argus/config.json. Argus stores remote-access credentials and daemon
discovery in the same directory. Existing files under ~/.claude/ migrate on
first use; native provider transcripts and credentials remain with their runtimes.
ARGUS_CONFIG, ARGUS_AUTH_FILE, and ARGUS_DAEMON_FILE still override the
default paths.
For Codex, install the CLI on the server machine and sign in there with
codex login. Argus uses that login. If the executable is not on PATH, set
ARGUS_CODEX_BIN to its executable path before starting the server. The adapter
uses codex app-server; it was verified with 0.155.0-alpha.16. It discovers models
and supported effort levels from the signed-in runtime.
Codex supports text/images, command and file-change approvals, and user-input requests. The composer offers Ask (workspace-write with on-request approvals), Plan (read-only), and Full (unrestricted access without approval prompts). Unsupported permission requests are rejected. A timed-out turn is never automatically replayed. PDF input, Claude-specific usage attribution, background-task markers and transcript tool-image preview remain Claude features. Codex history currently lists conversations created through Argus. Provider switching does not transfer context. Inline completions still use their existing Claude path.
Add a provider by implementing the contracts in src/backend/providers/types.ts,
registering it in registry.ts, and translating native events inside the adapter.
Do not add native protocol branches to React components. Run npm run test:providers
for the transport/lifecycle contract tests and the provider picker/switch Playwright
specs for the browser workflow.
| Command | Shortcut | Description |
|---|---|---|
| Argus: Open Chat | Ctrl+Shift+A |
Open a new chat panel |
| Argus: Ask About Selection | Ctrl+Shift+Q |
Send highlighted code with a question |
| Argus: Edit Selection with AI | - | Apply an AI edit to the selection |
| Argus: Review Selection | - | Run a code review on the selection |
| Argus: New Session | - | Start a fresh conversation |
- Streaming chat with real-time tool calls (read, write, edit, bash, grep, glob, web fetch).
- Live token counter: input and output counts update during streaming.
- Context usage pill showing how full the window is, as a share of the active model's own window (200k or 1M depending on the model, not a fixed number).
- Collapsible thinking blocks with token estimate; click to expand.
- Plan mode: dry-run exploration without file edits.
- Slash commands: built-in and custom skills from
~/.claude/skills/. - Model picker with live model list and per-family descriptions; model data (list, descriptions, detected CLI default) auto-refreshes daily via the daemon (
yarn update-modelsto force). - Image paste via
Ctrl+V. - Inline diff and file viewers next to tool calls. Codex file changes show added and removed line counts; click a path for the current file text or Diff for the saved patch. An
.htmlfile opens as the rendered document, painted in the panel's own theme, with its source one click away. - Command rows use shell-specific icons and show the inner command instead of repeated PowerShell, Bash, or cmd executable paths. Hover to see the full invocation.
- Images a tool read open from the conversation itself, so a file the agent has since renamed, packaged or deleted still previews; the bytes are fetched per click instead of travelling inside the message.
- Clickable paths and URLs everywhere in messages, including code blocks: a file path opens an in-app preview (dotted underline), a URL opens in the browser.
- A path pointing at a folder opens a browsable listing with file-type icons and sizes, sorted folders-first like an explorer: click a sub-folder to walk in, a file to preview it, Back to walk out.
- OS toast notifications on task completion. A turn the CLI started by itself, to report a finished background task, stays silent while more are still running, so a long watch does not ping every few minutes; the one that ends the chain still notifies.
- A
✻ Npill beside the context pill counts the background tasks running right now, for as long as they run. - A turn the CLI started by itself says so: it opens with the report of the background task that woke it ("Background command "Watch CI until all checks complete" completed (exit code 0)") and a link to that task's output, instead of appearing out of nowhere. Its completion time is shown in a neutral colour rather than the success green while any task is still running.
- A CLI process panel, opened from the process counts in Settings > Info: every Claude CLI running on the server's machine with its pid, session, uptime, CPU and memory, grouped under the process that started each one (the daemon, a dev server, a terminal). Any single one can be terminated from its row, and a session that is mid-turn is marked as such.
- Optional idle-CLI timeout (Settings > Watchdog): a finished turn keeps its CLI alive for reuse, which costs ~250MB per abandoned panel, so a limit in seconds reclaims them. Only ever an idle process - one mid-turn is never touched - and the conversation survives, since the next message respawns with
--resume. - Configurable error retries (Settings > Watchdog): enter one case-insensitive regular expression per line to choose which terminal errors trigger a retry across providers. Defaults to five retries, ten seconds apart, with a model-capacity pattern; an empty list disables error retries.
- Optional connection idle timeout (Settings > Network): closes a WebSocket connection that has sat unused this long, to stop an abandoned panel showing up in "Active connections" indefinitely. A connection mid-turn is never touched, and a panel reconnects on its own once it is looked at again.
- Optional "Ask Argus" code lens above functions and classes.
- Optional inline completions (Haiku model, Copilot-style).
| Setting | Default | Description |
|---|---|---|
argus.model |
(CLI default) | Chat model (any CLI-supported name) |
argus.inlineCompletions.enabled |
false |
Enable inline code completions |
argus.inlineCompletions.debounceMs |
500 |
Debounce for inline completions |
argus.codeLens.enabled |
true |
Show "Ask Argus" code lens |
argus.bash.useIntegratedTerminal |
true |
Run bash tool calls in integrated terminal |
- At least one installed, authenticated provider CLI: Claude Code (
claudeto log in) or Codex (codex login). Codex requires theapp-servercommand. - On Windows, Codex uses
ARGUS_CODEX_BINwhen set, thencodex.exeon PATH, then the newest executable in the installed desktop app's local bin cache. This also works from terminals that do not inherit the desktop app's PATH. - VS Code 1.85 or newer.
Run npm run test:e2e:integration -- --retries=0 for the full integration project.
Shared scenarios use the real Codex runtime by default. The fixture selects and
restores e2e/argus.json for each case; integration tests run with one worker.
@shared: provider-independent behavior, exercised with Codex by default.@codex: native Codex capabilities and protocol behavior.@claude: Claude-specific formats, configuration or launch arguments; local checks still run without Claude network access.@claude-live: requires a working Claude account/network connection and is skipped unlessARGUS_TEST_CLAUDE=1. Existing unsupported AskUserQuestion cases remain explicitly skipped even with that switch.
Set ARGUS_TEST_PROVIDER=claude to exercise shared cases with Claude when access
is available. npm run test:providers runs the isolated app-server contract tests.
For Codex-only shared/native integration coverage, use
npm run test:e2e:integration -- --grep "@shared|@codex" --retries=0.
Proprietary.