Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions AGENTS.md

Large diffs are not rendered by default.

74 changes: 74 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
local user can write to.
- **Registry TOML values are escaped** — a registry whose source or type
contained a quote or a backslash produced a file that could not be re-read.
- **`conductor stop` against a foreground run is no longer a silent no-op.**
With the interactive keyboard listener active, the `SIGTERM` handler
delegated to the previous disposition only when it was *callable* — and in
an unmodified process `signal.getsignal(SIGTERM)` returns `SIG_DFL`, an
`IntEnum` member that is not callable, so the signal fell through and was
swallowed entirely: the process survived and kept running. The handler now
restores the default disposition and re-raises against itself. An inherited
`SIG_IGN` is honoured rather than converted into a termination.
- **A `questions` node no longer leaves the run parked at an already-answered
gate.** A questions node reuses `gate_presented` but never emitted the
matching `gate_resolved`, so every consumer of the event stream — the web
dashboard as well as the Fleet Manager — held a gate that never closed for
the remainder of the run.
- **Dashboard context-window bar no longer reports cumulative input tokens as
a false red at >100% of the cap** (#412). The bar reused
`AgentOutput.input_tokens` — a *billing* total summed across every API call
Expand Down Expand Up @@ -649,6 +662,67 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
pane; the view is not refit in either case. The same compensation steadies
the graph when a running workflow's topology grows — a `for_each` fanning
out or a subworkflow's DAG arriving.
- **`workflow_started` now records the run's resolved `inputs`.** Two runs of
the same workflow are otherwise indistinguishable in a listing. The values
are written to the run's JSONL event log, which is also read by `conductor
replay` and the dashboard.
- **Fleet Manager: `conductor stop`, `conductor fleet list`, and a new
interactive `conductor fleet` TUI now discover every run, not just
`--web-bg` ones.** Previously only `--web-bg` wrote a discoverable
(port-keyed `.pid`) record, so a plain `conductor run` or `conductor run
--web` process was invisible to `conductor stop` and had to be killed by
hand. Every run path now writes a `run_id`-keyed JSON record to
`~/.conductor/runs/<run_id>.json` describing its mode (`fg`/`fg-web`/`bg`),
PID, workflow path, and dashboard port (when it has one); `stop`,
`fleet list`, and the TUI all read from this same store. The legacy
port-keyed `.pid` file is still read (and cleaned up) for a still-running
pre-upgrade process, but is no longer written by any current code path.
**Behavior change:** stopping a **foreground** run (`mode` `fg`/`fg-web` —
anything holding a terminal) now requires interactive confirmation, since a
plain `SIGTERM` discards in-flight progress unless periodic checkpoints are
enabled for that run; a background-only fleet is unaffected. Use
`--yes`/`-y` to skip the prompt (e.g. scripts, CI); a non-interactive
`stdin` without `--yes` refuses to proceed rather than silently defaulting
to "yes". `stop` also gained `--run-id`, the only selector that can target a
foreground run with no dashboard port to match on. See
[`docs/cli-reference.md`](docs/cli-reference.md#conductor-stop).

- **`conductor fleet`** — an optional interactive Textual TUI (`pip install
'conductor-cli[tui]'`) for monitoring, managing, and launching Conductor
runs across dedicated screens: Runs (home, ~2s-polled, sorted by recency),
Run detail (per-agent topology and timings, not a DAG), Providers
(collapsed-by-default provider/model diagnostics, reusing
`providers/diagnostics.py`), Registries (registries → workflows → inputs),
New Run (form generated from a workflow's declared `input:`, launches via
the same `conductor run --web-bg` path the CLI uses), and History
(every retained run regardless of outcome, bounded by retention plus an
independent 200-entry display cap, delegating replay to `conductor
replay <log>` rather than re-implementing it). A human gate is displayed as
a persistent badge for every run mode; it can additionally be **resolved**
from the TUI (`g`) for any run with a dashboard port (`fg-web`/`bg`) via the
existing `conductor gate respond` HTTP path — a plain foreground run's gate
is display-only (its PID is shown) since its blocking prompt thread cannot
be reached remotely. A terminal bell / OSC 9 notification fires once per
transition into `at-gate` or a failure. `conductor fleet list` and
`conductor fleet prune` need no optional dependency; only the bare,
no-subcommand `conductor fleet` (which launches the TUI) requires the `tui`
extra. See [`docs/fleet.md`](docs/fleet.md).

- **`~/.conductor/config.toml`** — a new machine-wide, read-only-in-v1
settings file (`src/conductor/settings.py`), read with stdlib `tomllib` and
honoring `$CONDUCTOR_HOME` the same way `registries.toml` does. Currently
controls `[fleet.retention]`: an opportunistic sweep (`enabled = true` by
default, `keep_last = 200`) that bounds the otherwise-unbounded
`$TMPDIR/conductor/` directory of event logs at the start of every
`conductor run`/`resume`. Never deletes the `checkpoints/` subdirectory or
an event log a live/resuming run still references. `conductor fleet prune`
is the explicit manual entry point (with `--keep-last`/`--dry-run`) and
always works regardless of the `enabled` setting. A missing file is normal
(every setting defaults cleanly); a malformed file only breaks an explicit
reader (`fleet prune` with no `--keep-last` override) — never `conductor
run`/`resume`, which swallow a settings load failure and just skip the
feature it configures. See
[`docs/configuration.md`](docs/configuration.md#machine-wide-settings-conductorconfigtoml).

## [0.1.27](https://github.com/microsoft/conductor/compare/v0.1.26...v0.1.27) - 2026-08-04

Expand Down
51 changes: 51 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ Conductor makes multi-agent workflows — code review pipelines, research-then-s
- **Human-in-the-loop** - Pause for human decisions with Markdown-rendered prompts and clickable file links
- **Safety limits** - Max iterations and timeout enforcement
- **[Web dashboard](#web-dashboard)** - Real-time workflow visualization with interactive DAG graph, breadcrumb navigation into sub-workflows, live streaming, and in-browser human gates
- **[Fleet Manager](#fleet-manager-tui)** - An interactive TUI over every running `conductor` process (foreground, `--web`, or `--web-bg`): live status, tokens and cost, gate alerts you can answer, step-level drill-down, and launching new runs — plus non-interactive `conductor stop` / `conductor fleet list`
- **Validation** - Catches stale template references, missing inputs, and undeclared dependencies before runtime

## Installation
Expand Down Expand Up @@ -211,6 +212,40 @@ conductor guide --text "Prefer Python 3.12 examples"
conductor stop
```

## Fleet Manager (TUI)

The dashboard shows you one run in depth. The **Fleet Manager** shows you *every* run at once — and it's where you go when something needs you. Launch it with `conductor fleet`:

```bash
pip install 'conductor-cli[tui]' # one-time: the TUI ships as an optional extra
conductor fleet
```

![Fleet Manager](docs/img/fleet-manager.png)

> **TUI = breadth. Dashboard = depth.**
>
> The TUI answers *"what's happening across my fleet, and what needs me?"* The dashboard answers *"what exactly is this one run doing?"* They compose — press `w` on any run to open its dashboard in a browser.

**Key features:**

- **Every run is discoverable** — Foreground, `--web`, and `--web-bg` runs all appear. Previously only `--web-bg` runs were visible to `conductor stop`; a plain `conductor run` had to be hunted down and killed by hand.
- **Live fleet table** — Each run's status, current step, elapsed time, tokens, cost, and a token-burn sparkline, polled continuously and sorted by recency
- **Gates that find you** — A run blocked on a human gate is badged in the table and fires a terminal bell, so a waiting workflow doesn't sit unnoticed. Press `g` to answer it without leaving the TUI.
- **Drill down** — `enter` opens a run's per-agent breakdown, then `enter` again on any step shows what it actually did: its input, output, and activity stream
- **Launch new runs** — `n` builds a form from a workflow's declared `input:` block and starts it in the background, so the TUI both watches and starts work
- **Browse and re-run** — Providers and model diagnostics (`p`), registries and their workflows (`r`), and History (`h`) for finished runs, which hands off to `conductor replay`
- **Kill safely** — `k` stops the selected run, `K` the whole fleet. Both confirm first, and a foreground run is named explicitly, since stopping one discards in-flight progress unless periodic checkpoints are enabled.

```bash
# Not interactive? These need no extra dependency:
conductor fleet list # table of every live run
conductor stop # stop the only running workflow, or list them
conductor fleet prune # bound the event logs in $TMPDIR/conductor
```

See [docs/fleet.md](docs/fleet.md) for every screen, key binding, the status vocabulary, and retention settings.

## Providers

Conductor supports multiple AI providers. Choose based on your needs:
Expand Down Expand Up @@ -352,6 +387,21 @@ Validate a workflow file without executing.
conductor validate <workflow.yaml>
```

### `conductor fleet`

Discover and manage every running `conductor` process — foreground,
`--web`, or `--web-bg`. See [Fleet Manager](#fleet-manager-tui) above for
the interactive TUI; these need no extra dependency:

```bash
conductor stop # stop the only running workflow, or list them
conductor fleet list # non-interactive table of every live run
conductor fleet # interactive TUI (requires the `tui` extra)
```

See [docs/fleet.md](docs/fleet.md) for the TUI's screens, key bindings, and
status vocabulary.

**Full CLI documentation:** [docs/cli-reference.md](docs/cli-reference.md)

## Workflow Registries
Expand Down Expand Up @@ -401,6 +451,7 @@ See the [`examples/`](./examples/) directory for complete workflows:
|----------|-------------|
| [Workflow Syntax](./docs/workflow-syntax.md) | Complete YAML schema reference |
| [CLI Reference](./docs/cli-reference.md) | Full command-line documentation |
| [Fleet Manager](./docs/fleet.md) | `conductor fleet` TUI: screens, key bindings, gate resolvability, retention |
| [Parallel Execution](./docs/parallel-execution.md) | Static parallel groups |
| [Dynamic Parallel](./docs/dynamic-parallel.md) | For-each groups and array processing |
| [Claude Provider](./docs/providers/claude.md) | Claude setup and configuration |
Expand Down
Loading
Loading