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
95 changes: 80 additions & 15 deletions docs/agent-control.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,9 @@ choices come from the selected harness; model discovery uses the current draft.
Existing/custom values remain intact when another field changes. Workspace,
arguments and write-only environment patches remain under **Advanced**;
Start/Stop/Restart and exact identity are under **Runtime and identity**. Save uses
native ID/revision and does not restart. Dirty drafts resist backdrop/Escape;
explicit Cancel/Close discards. Page navigation/reload still discards page-local drafts.
native ID/revision; the planned restart-on-save flow is described below. Dirty
drafts resist backdrop/Escape; explicit Cancel/Close discards. Page
navigation/reload still discards page-local drafts.

**Browse models** requests the current Databricks catalog on explicit button
activation, including when typing has already opened the local popup. Typing,
Expand Down Expand Up @@ -165,6 +166,62 @@ and `DATABRICKS_TOKEN` still conflicts with app-isolated persistent OAuth.
See [configuration parity](configuration.md) for development routing, release
flag exclusions and the supported deployment boundary.

## Planned: Harnesses and agent defaults

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Add the missing Signed-off-by trailer

Commit 07b867794b37755edcac0b84a7a7b7cfbb1c7b25 has no Signed-off-by trailer, so it violates the repository's per-commit DCO requirement and the hosted DCO Check will reject this head. Recreate the commit with a sign-off from the actual author and verify the check at the resulting head.

AGENTS.md reference: AGENTS.md:L153-L163

Useful? React with 👍 / 👎.


This is the approved Settings → Agents contract for the next implementation
slices, not a description of controls already shipped. The current desktop still
requires a restart to discover newly installed CLIs, and Save currently leaves
running agents unchanged. Individual-agent configuration stays on the Agents
Comment on lines +171 to +174

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P3] Describe the existing refresh-based harness detection accurately

The new sentence says the current desktop requires a restart to discover newly installed CLIs, but the existing call path already re-detects them: agent_control_snapshot calls Host::snapshot(), Snapshot::from() calls harness_options() on every snapshot, and installed() checks the filesystem rather than a startup cache (src-tauri/src/agents.rs:25–33,114–119,222–225,376–379; crates/agent-controller/src/runtime.rs:232–247). The mounted Agents UI refreshes every five seconds while visible/ready (src/features/agents/control-react.ts:11–20), and AgentSettingsFields.tsx:85–88 passes the refreshed options into the harness selector.

Thus installing Goose or the Pi executables in an already searched directory can update availability without an app restart today. A changed process PATH is a separate limitation, not a blanket restart requirement. Please distinguish the planned dedicated Check again/setup UI from the existing snapshot-based detection, and align the edited Pi fallback wording below. The scope can stay documentation-only; no new detection owner is needed to correct this claim.

page; Settings → Agents owns installation guidance and device-wide defaults.

### Harnesses

The **Harnesses** card lists only **Buzz Agent**, **Goose**, and **Pi**:

- **Buzz Agent** is bundled and shows **Ready**.
- **Goose** shows **Ready** or **CLI needed**, with **Install** when needed.
Install runs upstream `download_cli.sh` with `CONFIGURE=false`, as old Buzz
did; Goose then uses built-in `goose acp`. One install runs at a time.
Afterward Buzz re-detects, writes an install log, and restarts agents that
were waiting for Goose.
- **Pi** shows **Ready**, **CLI needed**, or **Adapter needed**. V1 shows a hint
and copyable commands (Node.js required); one-click Pi install comes later:

```sh
npm install -g @earendil-works/pi-coding-agent
npm install -g --install-links=true 'git+https://github.com/salman1993/buzz-pi-acp.git#86b201e'
```

**Check again** re-detects installed Harnesses without reopening Buzz. Status
is executable detection, not a guarantee of sign-in, ACP readiness or inference.
Add/Edit links to Settings → Agents for setup instead of telling people to reopen
the app. The ACP tooltip says:

> Buzz talks to harnesses through the Agent Client Protocol (ACP). Goose supports it natively. Pi needs a small adapter, `buzz-pi-acp`. Your existing CLI setup and sign-in are left untouched.

### Global agent defaults and saving

Settings → Agents provides a default harness, provider, model, effort and
environment variables. The default harness is **copied into each new agent** at
creation; changing it later does not switch existing agents. Provider, model,
effort and environment defaults are **looked up at each start** only for fields
an agent leaves blank; per-agent values win. Per-agent effort is not yet an
editable field. Changing the default harness clears the default model and effort.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Clear the provider when changing the default harness

When a default provider is set and the user changes the default harness—for example, from Goose to Pi—this contract clears only model and effort. Provider choices are harness-specific elsewhere in this document, so the stale Goose provider remains eligible for inheritance by blank Pi agents and can make their next launch invalid or select the wrong backend. Clear or revalidate the default provider during this transition as well.

AGENTS.md reference: AGENTS.md:L83-L86

Useful? React with 👍 / 👎.


These mutable defaults live in a native store under app-data
`agent-controller/`, not localStorage. Native files use owner-only permissions
(0600); environment values are write-only and never read back into the UI, as
with per-agent API keys. This layer sits above
[`BuildDefaults::resolve()`](../crates/agent-controller/src/defaults.rs): global
defaults win over the [nonsecret build floor](#nonsecret-build-defaults), which
stays compiled and is not the editable store.

Saving an agent or defaults restarts **running agents whose effective settings
changed** through the native supervisor and reports **“Saved. Restarted N
agents.”** Unchanged and stopped agents are not restarted. Effective settings
include inherited defaults, so today's `restartDiff` (raw saved configs) is not
enough on its own. This supersedes the current Save-without-restart rule.
Comment on lines +219 to +223

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Define recovery for failed save-triggered restarts

If saving defaults persists successfully but one of the affected agents fails to restart—for example because its CLI disappeared or its newly inherited configuration is invalid—the operation is now partially complete and the documented success message is inapplicable. The contract does not say whether other agents continue restarting, how the saved-but-stopped agent is reported, or how the user retries without re-saving; specify partial-success and recovery behavior before this becomes the implementation contract.

AGENTS.md reference: AGENTS.md:L83-L90

Useful? React with 👍 / 👎.


## Avatar editing

Edit uses the same draft avatar picker as human Profile settings: upload/drop an
Expand Down Expand Up @@ -255,21 +312,25 @@ containment on non-Unix platforms.
- `running` is **process-alive evidence only**, labeled “Process running · relay
readiness unverified.” It is not a Listening/Working badge or proof a mention
can be received. Native wake/readiness acceptance is separate.
- Save uses `expectedRevision`, updates only editable fields and never restarts.
- Save uses `expectedRevision` and updates only editable fields. The planned
flow restarts running agents whose effective settings change (see
[Global agent defaults and saving](#global-agent-defaults-and-saving)).
Saved/running revisions remain distinct. Dirty drafts survive refresh and save
failure. A newer saved revision blocks overwrite and offers explicit discard;
the person can copy their edits before discarding. Drafts are page-local and
are not persisted across navigation/reload.
- Arguments use a JSON string array rather than splitting shell text, preserving
spaces and literal quoting. Empty/comma-containing arguments are rejected because
the current ACP transport cannot represent them faithfully. The executable is a per-agent
harness choice, not a new installation/catalog system. The host must validate
launch configuration and unsupported imported semantics before execution.
harness choice; Settings → Agents owns the planned Harnesses setup card. The
host must validate launch configuration and unsupported imported semantics
before execution.
- Harness and Provider choices come from native `harnessOptions` through the
injected Core snapshot. Buzz Agent offers Databricks v2. Goose appears with an
absolute executable path when the local CLI is installed, and offers common
Goose providers plus a custom ID. A missing CLI leaves Goose disabled until
installation and desktop restart. Switching into or out of Goose supplies ACP
Goose providers plus a custom ID. A missing CLI leaves Goose disabled; the
planned **Check again** action re-detects it after installation without an app
restart. Switching into or out of Goose supplies ACP
arguments and clears the previous provider/model; selecting a Goose provider clears the
previous model. For Goose, an explicit Browse asks Goose ACP for the selected
provider's supported-model list and searches it in the existing picker. The
Expand Down Expand Up @@ -408,8 +469,8 @@ bin/node --test tests/integration/agent-runtime.test.mjs

These checks use isolated fixtures, including the staged binaries; they do not
launch the app or access live credentials. Exercise upstream behavior changes
with relevant bundled-tool smoke checks. Do not commit generated resources or
restart running agents implicitly; live handover remains a separate step below.
with relevant bundled-tool smoke checks. Do not commit generated resources;
live handover remains a separate step below.

## Handover and rollback

Expand Down Expand Up @@ -438,7 +499,8 @@ restart running agents implicitly; live handover remains a separate step below.

`control.test.ts`, `control-native.test.ts`, `agent-edit.test.ts` cover projection
races, unavailable browser, exact IPC payloads, uncertain result handling,
save/restart distinction, literal arguments and environment patch semantics.
the current save/restart distinction, literal arguments and environment patch
semantics.
`tests/browser/agent-control.spec.mjs` drives the real editor and capability over
the isolated fake host in Chromium/WebKit: dirty refresh, save failure, revisions,
write-only replacement, Stop, unmount without control actions, selected import,
Expand Down Expand Up @@ -477,9 +539,11 @@ forced native quit, signed packaging or other-platform behavior.

## Pi harness

Install Pi, Node.js, and the `buzz-pi-acp` adapter, then reopen the desktop app.
Pi appears alongside Buzz Agent and Goose. Availability means the executables
were found, not that authentication or inference has been verified. This
Install Pi, Node.js, and the `buzz-pi-acp` adapter. In the planned Harnesses
card, choose **Check again** to re-detect without reopening the app; until that
ships, reopen the current desktop app. Pi appears alongside Buzz Agent and Goose.
Availability means the executables were found, not that authentication or
inference has been verified. This
integration uses the adapter's Pi argument forwarding after `--` (verified with
buzz-pi-acp 0.0.33) and Pi's `get_available_models` RPC (verified with Pi 0.86.1).

Expand All @@ -495,8 +559,9 @@ The Advanced model field preserves text literally, including IDs that themselves
start with the provider name. After Browse, an unlisted ID carries a warning;
manual IDs remain allowed and an available catalog is not inference validation.
Clear both fields to keep Pi's own defaults. Choosing a provider requires a model
before Start; Pi otherwise silently ignores a provider-only flag. Save does not restart a running agent;
use Restart explicitly to apply changes.
before Start; Pi otherwise silently ignores a provider-only flag. Until the
planned restart-on-save flow ships, use Restart explicitly to apply a saved
change to a running Pi agent.

Discovery launches the same locally resolved Pi used by the ACP adapter, in the
agent's workspace, with the same explicit environment and extension arguments.
Expand Down
8 changes: 5 additions & 3 deletions docs/settings.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,10 @@ Do not expose the control until the native host owns the complete lifecycle:

The first implementation may be macOS-only if other platforms show an explicit
unsupported state. Linux and Windows need their own inhibitor decisions and native
acceptance. Agent runtime catalogs and inherited global defaults remain separate
product slices; individual-agent configuration stays on the Agents page.
acceptance. The approved
[Harnesses and global agent defaults](agent-control.md#planned-harnesses-and-agent-defaults)
are separate implementation slices; individual-agent configuration stays on the
Agents page.

## Settings coverage ledger

Expand All @@ -102,7 +104,7 @@ when a product decision or complete Buzz 1.0 owner exists.
| Per-category sounds and sound preview | Pending a sound catalog, assets, preview, persistence, and delivery contract. |
| Agent conversation behavior | Implemented under **Agents**. |
| Keep awake while agents are active | Approved as a future device-wide preference; requires the bounded native lifecycle above. |
| Agent runtimes and inherited defaults | Separate future native-agent product decisions; individual configuration remains on the Agents page. |
| Harnesses and global agent defaults | Approved for Settings → Agents, pending implementation; individual configuration remains on the Agents page. See [the planned contract](agent-control.md#planned-harnesses-and-agent-defaults). |
| Voice, custom emoji, local archive, and channel templates | Pending dedicated product and implementation slices. |
| Compute, experiments, mobile pairing, and updates | Pending dedicated native/app capability owners. |
| Community profiles and administration | Planned for the Communities list-detail architecture below. |
Expand Down
Loading