You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit e1780fd
Browse filesBrowse the repository at this point in the historyBrowse files
feat: report per-program configuration status to the controller
Each apply reports every managed program's outcome with a detail: applied,
unchanged, removed, conflict, inactive (the program uses the gateway but the
local proxy is not running), blocked (not applied because another program
conflicted) or failed. The daemon logs one line per program that was not
applied and sends the list with its ConfigStatus (additive proto fields
`programs`, `programs_reported`).
The controller stores the latest list per device (migration 0003,
`device_program_status`), returns it in `GET /api/v1/devices/{id}`, and the
device page shows a "Managed programs" card. Upgrade the controller first
(migration 0003 is one-way).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each apply reports the outcome for every managed program, next to the
593
+
device-wide state. The device page in the controller lists them under
594
+
"Managed programs"(`GET /api/v1/devices/{id}` returns them as `programs`):
595
+
596
+
| State | Meaning |
597
+
| --- | --- |
598
+
| `applied` | The program is configured and its files were changed. |
599
+
| `unchanged` | The program is configured and nothing needed to change. |
600
+
| `removed` | The program is no longer configured and its managed content was removed. |
601
+
| `conflict` | A managed file holds configuration the daemon will not overwrite; the detail names the file. |
602
+
| `inactive` | The program uses the LLM gateway but the local LLM proxy is not running (see `llmProxy.error` in daemon-info), so its files point nowhere and were removed. |
603
+
| `blocked` | The program had changes, but none were written because another program conflicted or failed; the detail names that program. |
604
+
| `failed` | Planning or writing this program failed; the detail carries the error. |
605
+
606
+
When several apply, the first in the list `failed`, `conflict`, `blocked`,
607
+
`inactive`, `applied`/`removed`, `unchanged` is shown. An apply is all or
608
+
nothing across programs: one conflict or failure means no file is written for
609
+
any program, which is what `blocked` makes visible. Programs that are not
610
+
configured and have nothing to clean up, and discovery-only tools, are not
611
+
listed. After each apply the daemon logs one `program configuration outcome`
612
+
line (`program`, `state`, `detail`) per program that is not `applied` or
613
+
`unchanged`. A daemon restart reports again, because the controller re-sends
614
+
the configuration on every connection; the files are already written by the
615
+
startup apply of the saved configuration at that point, so the report after a
616
+
restart usually says `unchanged` (the startup apply's outcome lines for programs
617
+
that are not `applied` or `unchanged` are in the daemon log). If the controller
618
+
rejects a report (an agent outside the reporting limits), it keeps the device
619
+
status and the last accepted program rows; rows from an earlier revision show
620
+
that revision on the device page. Agents and controllers can be upgraded
621
+
in either order: an older agent shows as "Per-program status is not reported
622
+
by this agent version", and an older controller ignores the new fields. The
623
+
controller's database migration is one-way: once this controller has run, an
624
+
older controller refuses the same database, so roll back from a database
625
+
backup taken before the upgrade.
626
+
590
627
## Core capabilities
591
628
592
629
- **AI tool discovery:** detect supported developer tools and their versions
Copy file name to clipboardExpand all lines: crates/agent/src/provider/copilot/reconcile.rs
+1Lines changed: 1 addition & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -112,6 +112,7 @@ pub(super) fn plan(
112
112
path = %path.display(),
113
113
"programs.copilot is configured but the local LLM proxy is not available, so the Copilot CLI is not pointed at the gateway; the reason is llmProxy.error in daemon-info (or daemon.llmProxy.listen is unset); removing the managed Copilot CLI providers"
0 commit comments