Skip to content

Feat/dashboard UI - #3

Merged
crossben merged 30 commits into
mainfrom
feat/dashboard-ui
Sep 26, 2026
Merged

crossben merged 30 commits into
mainfrom
feat/dashboard-ui

Conversation

@crossben

Copy link
Copy Markdown
Owner

No description provided.

crossben and others added 30 commits September 25, 2026 15:17
…otes

opencode colours its output. The live panel already cleaned it, but the
final reply went to glamour raw, which drops ESC and leaves literal
"[0m" in the transcript. Replies (and failing-check output in review)
now go through the same cleaning. Long system notes also wrap with an
indent instead of starting at column 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Only pgup/pgdn scrolled the transcript; arrows went to the input and the
program never enabled mouse reporting, so a long reply looked stuck at
its end.

- Mouse wheel scrolls the transcript and open diffs, and moves the
  selection in Changes/History (tea.WithMouseCellMotion).
- ↑/↓ scroll the transcript while the input is empty.
- Status bar shows "scrolled · N%" when not at the bottom.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Below the minimum the layout was clipped from the top (header and tabs
disappeared). Frames now always fit the window, and tiny windows say
what size is needed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add APIClassifier, which classifies a message by calling an llm.Provider
directly (system prompt = the shared output contract, temperature 0,
256 max tokens, own 30s timeout) instead of spawning the router agent's
CLI. Configured with an optional router.classifier block; BuildRouter
uses it only when a model is set and its key env var is non-empty, and
otherwise falls back to the CLI classifier without failing startup.
router.agent still answers plain questions.

Includes the Router v2 design spec.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The git worktree Manager now satisfies an Isolator interface; a new
CopyIsolator gives each task a directory copy (fsdiff exclusion rules,
modes and symlinks preserved), diffs it with fsdiff, and merges accepted
changes back all-or-nothing with per-file conflict detection and
traversal-guarded writes. worktree.New picks the backend.

engine.ExecuteHeadless diffs against a snapshot and skips the commit
when its directory is not a git repository; inside a repo it is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolution order is now: the AI's healthy suggestion -> the agent with
the best track record in this directory -> static routes -> default
agent -> first healthy agent.

The router defines a History interface (BestAgent(dir, candidates)) set
via Router.WithHistory; nil keeps the old behaviour. memory.Store
implements it: successes = accepted runs + benchmark wins, samples = all
runs + wins + validation-failed benchmarks, score = (s+1)/(n+2). A pick
needs >=3 samples, more successes than failures and a strictly higher
score than every other healthy candidate; ties yield no pick. The
decision reason explains it, e.g. "claude: 8/10 accepted in this dir".

Wired into the shell and dashboard using their existing memory store;
skipped silently when the store did not open. Only the choice of agent
changes - dispatch, validation, retry and diff review are untouched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gents

Providers parse usage (OpenAI prompt/completion_tokens, Anthropic
input/output_tokens); a missing usage object is zero, never an error.
agent.Result gains Usage; APIAgent fills it and prices it from the new
optional price_input_per_mtok / price_output_per_mtok agent fields.
Includes the design spec.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Check compares the latest release tag by semver (never offering a
prerelease to a stable build; dev/snapshot builds skip the network).
Install picks the GoReleaser archive for this platform, verifies its
SHA-256 against checksums.txt, extracts only the orchestra binary
(refusing traversal entries) and atomically swaps the resolved
executable (rename-aside to .old on windows). A small JSON state file
throttles automatic checks to once per 24h.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A root PersistentPreRunE checks for a newer release (2s timeout,
throttled to once a day) only in interactive terminals, never in CI,
for dev builds, with ORCHESTRA_NO_UPDATE_CHECK=1, or for help,
completion, --version and update itself. Accepting installs, prints
'Updated to vX. Please relaunch orchestra.' and exits 0; declining or
a failed install continues with the requested command.
`orchestra update` forces a check (--check to report, -y to skip the
prompt).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both commands now pick their isolation backend with worktree.New: git
worktrees inside a repository (unchanged), folder copies elsewhere. The
'needs a git repository' errors are gone; the clean-tree check still
applies inside a repo. In a plain folder the stray-write guard snapshots
the base before each wave and restores it with fsdiff. The benchmark body
moves into runBenchmark so it can be tested with fake agents.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Outcome and Turn carry Usage summed over every attempt (including one
whose agent call failed); EventAgentDone carries per-attempt usage for
the dashboard. run/do/shell print a one-line summary when usage is known.
runs and benchmarks gain tokens_in, tokens_out and cost_usd via the
idempotent ADD COLUMN migration; StatsByAgent returns per-agent totals.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Files over MaxFileBytes were always reported as "Binary files … differ",
so git-free runs, copy isolation and the stray-write guard saw phantom
changes in folders holding large files. Withheld files now carry a
streamed SHA-256; matching fingerprints are treated as unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
orchestra history and the benchmark leaderboard gain TOKENS/COST columns
(and benchmarks persist usage). The dashboard shows them in History and
Benchmarks, per-agent totals in Agents, and a running total in the live
run panel; usage columns appear only when some row has usage, and narrow
windows shed low-priority columns (new col.drop) instead of overflowing.
Chat turns now record their summed usage to history.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…updater

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New internal/parallel package holds the UI-free pieces of the parallel
workflow: step id/prompt/agent helpers, a dependency Graph (ready waves,
done/dead bookkeeping, waves-left estimate), the base-tree stray-write
BaseGuard, and RunStep (quiet Produce + commit on a worktree branch) for
UIs. do --parallel now uses it; its output and behaviour are unchanged.
engine exports CommitMessage. Adds the dashboard-parallel design spec.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Chat message starting with /parallel (or /par) plans the request with
the default agent, then runs it wave by wave: each ready step in its own
isolated tree (worktree.New: git worktrees in a repo, folder copies
elsewhere), up to parallel.DefaultJobs at a time, via parallel.RunStep.

- Live view: the run panel becomes a task list (status, agent, attempt,
  elapsed, last output line); up/down or j/k select, enter/tab expand
  the task's full output, esc collapses (esc on the list cancels).
  Worker events/output are tagged with the task id over the channel.
- Review: after each wave, tasks with changes open in the existing
  reviewer headed "wave i/N · task k/M"; y merges (Isolator.Merge; a
  conflict is reported and counts as rejected), n discards. Failed tasks
  are reported and skipped; dependents of dead steps are skipped.
- ctrl+c mid-run cancels all tasks, restores stray base writes (guard),
  removes every isolated tree, then quits.
- Every task outcome is recorded to memory like single runs.
- README documents /parallel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The /parallel branch predates usage tracking, so its history records
dropped tokens and cost. Stamp them via usageRun like single runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
do --parallel creates worktrees from several goroutines; appending to
the tree list raced (caught by -race) and concurrent git worktree add
contends on git's locks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@crossben
crossben merged commit bd7b80c into main Sep 26, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant