Watch and run all of Fulltrace from inside the editor
The window onto Fulltrace, built into my code editor: a VSCode extension that shows everything the system is doing without leaving it. A sidebar tree gives status at a glance; a seven-tab panel goes deeper, headlined by Studio. I pick a job, see the price before it runs, approve the spend, and watch it work live through to the finished report.
07 dashboard tabs05 studio views03 clients tracked0 runtime dependencies
the_tour[01]
The Dashboard, Toured
The dashboard, walked live: the sidebar rail, the seven tabs, a workflow taken from the catalogue through to what it cost, and then a finished run opened up to its per-stage verdicts and findings. Hover to hold a step, or drive with the dots.
AGENTOS DASHBOARD···
STATUS
Online5h 21m
MEMORY
57 MB
RESTARTS
2
UPTIME %
88.7%
Start
Restart
Stop
Open Dashboard
USAGE
SUBSCRIPTION
CLAUDE USAGE
5h42%
7d83%
5h resets in 20m7d resets in 23h 50m
CODEX USAGE
30d99%
resets in 24d 7h
API
OPENROUTER CREDITS
used50%
$17.39 left$35.00
TOOL USE
SESSION
ALL-TIME
Uptime
5h 21m
6d 5h
Requests
165
1,689
Context reads
0
14
Commands
39
185
Tokens
16K
7.9M
TOKENS BY MODEL
kimi
0
7.1M
deepseek
0
798.7K
haiku
9.5K
34.9K
sonnet
5.9K
33K
opus
594
16.1K
fable
0
2.9K
unattributed
0
10.6K
MCP SERVER
Context
Commands
Memory
Hooks
The sidebar rail, toured. Each section expands as it is explained, and Open Dashboard reveals the workspace; hover to hold a step, or jump straight to one with the dots.
1Runtime health. Online state, uptime, memory and restarts, with start, restart and stop controls.
2Open the workspace. Open Dashboard opens the full panel and fills the main area with the workflow catalogue.
3Budget windows. Live usage against Claude's 5h and 7d windows, Codex's 30d window, and OpenRouter credits, each with its reset timer.
4Session telemetry. Session and all-time counters, plus a per-model token breakdown for attributable spend.
5MCP surface. The extension's own MCP server: Context, Commands, Memory and Hooks as live resource trees.
The seven top-level tabs, toured: the screenshot itself swaps to each tab's real content as you move through it. Hover a tab to jump to it, or step through with the dots.
1Studio. The run hub: Workflows, Runs, Audits, Models and Agents, priced and launched from one screen.
2Config. Setup wizard, MCP servers with live probes, shared commands, settings and hooks.
3Analytics. Per-model usage and cost across Claude, Codex, Cursor and OpenRouter, with a Compare view.
4Context. The ten portfolio files, with read counts and last-read times.
5Memory. Claude and Codex memory in one list, with create and guarded remove.
6Logs. Every log stream in one place, plus per-client file sync checks.
7Development. Dev slices, the roadmap and build log, the UI/UX register, and the decision inbox.
Running a workflow, toured. The catalogue is spotlit, a click opens the detail, and the tour zooms through its shape, options, targets, models, price and history; hover to hold a step, or jump straight to one with the dots.
1Studio's five views. Seven tabs, headlined by Studio and its five run-lifecycle views.
2Workflow catalogue. Executable against Planned, capability flags, and a real average cost per run before launch.
3Open a workflow. Clicking a row opens its detail: the shape it runs, what it costs, and what past runs did.
4The shape. Fan out across the enrolled targets, an optional deterministic verify gate, an advisory challenge, then gather.
5Capabilities and options. What the workflow can do, and the Configure toggles for this run only.
6Targets and parallelism. Which projects the run fans out across, and how many run at once.
7A model per stage. Per-stage defaults, each overridable for a single run without touching the workflow default.
8Defaults for future runs. Edit the workflow's own default models: a deliberate act that outlives the run.
9Priced before it runs. An estimate from past runs, the real average beside it as an honesty check, and the pass rate.
Inside a finished run, toured. The run history is spotlit, a click opens one run, and the tour walks its cost, its graph and its verdicts before drilling into a single node's stages and findings; hover to hold a step, or jump straight to one with the dots.
1Every run that has happened. The durable history, newest first, with the workflow each ran and how it ended.
2What each one cost. Cost, tokens and models joined onto every finished run.
3Open one. A portfolio code audit from 15 July: $0.32, across 864,300 tokens.
4What the run was. Workflow, outcome, start time, tokens in and out, and the node tally.
5What it cost, model by model. Total against the workflow average, split into spend, requests and tokens per model.
6The graph it actually ran. Three audit targets fanned out in parallel, then gathered, each node with its own duration and tokens.
7Verdicts, not just statuses. COMPLETE is that a node ran; review: approved is that what it produced passed.
8Into a node. Clicking a fan-out node opens the stages it ran and the report it wrote.
9Every stage, every model. Seven stages, two rejections and a correction loop, all on the record.
10What it found. A passed verdict and seven findings, ready to carry into review and apply.
studio[02]
One Hub for the Whole Run Lifecycle
Studio consolidates workflows, runs, audits, models, and agents into one screen organised around the life of a run. I choose the work, check the price, confirm the spend, and watch it happen live through to the result, without touching a terminal. Watching is always read-only; anything that acts, launching a run, editing a workflow's saved default models, warming or evicting a local model, running or removing a sub-agent, recording a disposition against a finding, is a deliberate, confirmed press, and every one of those acts is ledgered.
flowchart LR
D["Discover workflow catalogue"] --> C["Configure choose options and targets"]
C --> E["Estimate cost priced from run history"]
E --> L["Launch explicit spend confirmation"]
L --> O["Observe live runs + graph view"]
O --> U["Understand results and findings"]
%% Blueprint tokens as literal hex (Mermaid cannot parse CSS vars or color-mix)
classDef step fill:#62d99a1f,stroke:#62d99a,stroke-width:1.5px;
classDef spend fill:#e0be621f,stroke:#e0be62,stroke-width:1.5px;
class D,C,E,O,U step;
class L spend;
Live without a reload
The screen updates itself every 4 seconds while a job runs, advancing node statuses and moving finished runs from Active to Completed. An idle tick never redraws the page or closes something I have open.
Outcomes, not just statuses
Graph nodes badge whether their newest stage was approved or rejected, not just whether it ran. Finished runs carry their cost, tokens, and models, and by-model donut charts break spend down per model for a workflow or a single run.
Drill through to the evidence
Clicking any fan-out node opens its detail: the findings report it produced, a clear passed-or-failed verdict, the models and tokens each stage used, and a jump straight into the Audits view with that target already selected.
apply[03]
Approving a Fix, Without Trusting It
The audit does not just find problems, it offers to fix them, and this is the one place in Fulltrace where an AI can actually change my code. So it is the part I was most careful with. The flow is four steps: review, dry-run, approve, apply, and what makes it safe is what sits between them. I see the exact change first, the project's own build has to accept it before I am even asked, and what I approve is that one specific change, not a standing permission.
A code audit findings report, toured. Two findings from the same run, treated differently: the structural one is refused an automatic fix, the safe one is offered a dry-run, and the last word on both is mine. Hover to hold a step, or jump straight to one with the dots.
1Seven findings, one report. What a run's audit node produced, each finding its own card.
2Graded before it is read. Severity, model confidence, and the risk of the fix, then the file, line and function.
3Reasoning, then remedy. The argument is kept separate from the patch, with a jump to the source.
4Not every finding gets a fix button. Structural findings are refused an automatic fix and offered a plan instead.
5The safe ones get a dry-run. Prepare fix drafts a change and freezes it as a hashed artefact, applying nothing.
6My call, and it stays mine. Accept, reject, defer or ask for evidence, recorded with no effect on future audits.
Frozen, then fingerprinted
The proposed diff is frozen as an immutable artefact and hashed the moment I see it, and my approval binds to that exact hash. If anything about it shifts afterwards, a newer dry-run supersedes the old approval rather than inheriting it, and any drift refuses fail-closed. Grants carry a short TTL, and I can withdraw one at any time.
Simulated before it is offered
Before I am asked anything, the fix is applied for real against the project, run through that project's own build gate, and always reverted. Only a fix that passes this simulation ever reaches an approval prompt, so I am never asked to approve something that would immediately fail. Nothing unapproved is ever kept.
Stricter from Studio than from the CLI
The easy button is the safe one: a write triggered from Studio always runs with approvalRequired switched on, stricter than the command line's own default. The surface with the friendliest buttons is the one with the tightest gates, not the other way around, and every attempt is ledgered, kept or reverted.
It has already earned its keep
A fix the AI proposed once referenced a class that did not exist. The target's own compile rejected it, the change auto-reverted, and I was shown the verbatim error. Once simulation shipped, that entire class of fix stopped reaching approval at all. Real fixes have been applied and kept through the full path since, the milestone being the first artefact-bound, human-approved write driven end to end from Studio.
architecture[04]
Single Poller, Two Surfaces
One StatusPoller polls the gateway's GET /status every 4 seconds and scans the filesystem for skills, commands, memory files, and agents. The sidebar and the full panel both read from that same poller, so the two surfaces never drift out of sync with each other.
Sidebar TreeView
Always visible in the VSCode activity bar. Shows server status, uptime, last memory sync time, and the portfolio file list, and opens any portfolio file straight into the editor. No interaction needed to keep it current: the poller drives updates automatically.
WebviewPanel
Opens on demand from the activity bar or command palette into the full seven-tab interface. It is a passive consumer of the same poller state, so opening it triggers no extra requests. The layout fills the editor window and scrolls within the active tab only; the status card and tab nav stay fixed.
status_poller_scanwhat one poller reads, every 4s
StatusPoller(4s interval)
├── polls GET /status ──▶ server metrics, token counts, logs
The extension runs on only the VSCode extension API, Node's own built-ins (http, child_process, fs), and the TypeScript compiler at dev time only. No npm packages ship at runtime, no bundler: just a VSIX installed via code.cmd --install-extension.
02
Theme-aware, colour-coded UI
Every colour is a var(--vscode-*) theme token, not a hardcoded hex value, so the webview matches whatever theme the editor is in automatically, and a nonce-based CSP keeps it from running injected script. Each AI client also gets its own distinct, consistent colour across every tab and badge, so a client is recognisable at a glance.
configuration[06]
Settings
Every part of the connection is configurable under agentOsDashboard.* in VSCode settings: which host and port the gateway listens on, how often it polls, and which pm2 process the Start/Stop/Restart controls drive. Those controls call pm2 with no shell and a process-name allowlist regex, so the configured name can never break out into an arbitrary command.
dashboard_settingsevery agentOsDashboard.* key
Server connection
host: MCP server host (default: 127.0.0.1)
port: MCP server port (default: 3000)
statusPath: status endpoint path (default: /status)
pollInterval: poll frequency in ms (default: 4000)
pm2 integration
pm2ProcessName: pm2 process to control (default: agentOS-portfolio)
Start/Stop/Restart buttons in the Status tab drive pm2 via child_process.spawn with no shell, plus a process-name allowlist regex, so the configured name cannot break out into arbitrary commands