@phnx-labs/agents-cli 1.22.53 → 1.22.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +208 -0
- package/README.md +59 -9
- package/dist/bootstrap.js +55 -154
- package/dist/cli/command-registry.d.ts +5 -0
- package/dist/cli/command-registry.js +8 -1
- package/dist/commands/accounts.js +219 -173
- package/dist/commands/apply.js +6 -3
- package/dist/commands/auth-mint.d.ts +8 -0
- package/dist/commands/auth-mint.js +96 -0
- package/dist/commands/auth.js +5 -1
- package/dist/commands/browser.js +1 -1
- package/dist/commands/cost.js +8 -2
- package/dist/commands/daemon.js +2 -2
- package/dist/commands/doctor.js +6 -1
- package/dist/commands/exec.js +10 -8
- package/dist/commands/focus.d.ts +1 -0
- package/dist/commands/focus.js +2 -2
- package/dist/commands/go.d.ts +5 -4
- package/dist/commands/go.js +7 -7
- package/dist/commands/insights.js +9 -0
- package/dist/commands/monitors.js +85 -30
- package/dist/commands/output.js +8 -2
- package/dist/commands/repo.js +18 -0
- package/dist/commands/routines.js +31 -2
- package/dist/commands/secrets.js +33 -14
- package/dist/commands/sessions.d.ts +20 -12
- package/dist/commands/sessions.js +64 -20
- package/dist/commands/setup-accounts.d.ts +8 -0
- package/dist/commands/setup-accounts.js +47 -0
- package/dist/commands/setup.d.ts +1 -1
- package/dist/commands/setup.js +11 -2
- package/dist/commands/share.d.ts +79 -3
- package/dist/commands/share.js +347 -18
- package/dist/commands/ssh.d.ts +7 -0
- package/dist/commands/ssh.js +18 -2
- package/dist/commands/status.js +14 -0
- package/dist/commands/view.d.ts +11 -1
- package/dist/commands/view.js +35 -7
- package/dist/lib/account-registry.js +15 -3
- package/dist/lib/accounting/rotate.d.ts +20 -6
- package/dist/lib/accounting/rotate.js +38 -7
- package/dist/lib/accounting/usage.d.ts +68 -1
- package/dist/lib/accounting/usage.js +116 -10
- package/dist/lib/agent-spec/agents.d.ts +5 -2
- package/dist/lib/agent-spec/agents.js +25 -7
- package/dist/lib/analytics/mix-commands.js +12 -6
- package/dist/lib/auth-mint.d.ts +150 -0
- package/dist/lib/auth-mint.js +434 -0
- package/dist/lib/browser/cdp.d.ts +1 -1
- package/dist/lib/browser/cdp.js +1 -1
- package/dist/lib/browser/ffmpeg.d.ts +12 -0
- package/dist/lib/browser/ffmpeg.js +184 -0
- package/dist/lib/browser/remote-control.d.ts +9 -7
- package/dist/lib/browser/remote-control.js +9 -7
- package/dist/lib/browser/service.js +119 -25
- package/dist/lib/claude-account-token.d.ts +10 -0
- package/dist/lib/claude-account-token.js +14 -4
- package/dist/lib/config-drift.d.ts +37 -0
- package/dist/lib/config-drift.js +72 -0
- package/dist/lib/daemon/auth-sync-service.d.ts +19 -0
- package/dist/lib/daemon/auth-sync-service.js +34 -0
- package/dist/lib/daemon/browser-task-reap-service.d.ts +14 -0
- package/dist/lib/daemon/browser-task-reap-service.js +26 -0
- package/dist/lib/daemon/daemon.js +87 -176
- package/dist/lib/daemon/heartbeat-service.d.ts +13 -0
- package/dist/lib/daemon/heartbeat-service.js +26 -0
- package/dist/lib/daemon/monitor-engine-service.d.ts +9 -5
- package/dist/lib/daemon/monitor-engine-service.js +15 -7
- package/dist/lib/daemon/runner.d.ts +15 -0
- package/dist/lib/daemon/runner.js +23 -0
- package/dist/lib/daemon/secrets-broker-service.d.ts +5 -4
- package/dist/lib/daemon/secrets-broker-service.js +17 -32
- package/dist/lib/daemon/service.d.ts +2 -2
- package/dist/lib/daemon/service.js +1 -1
- package/dist/lib/daemon/session-state-service.d.ts +21 -0
- package/dist/lib/daemon/session-state-service.js +34 -0
- package/dist/lib/daemon/supervisor.d.ts +17 -7
- package/dist/lib/daemon/supervisor.js +87 -14
- package/dist/lib/daemon/tmux-reap-service.d.ts +11 -0
- package/dist/lib/daemon/tmux-reap-service.js +28 -0
- package/dist/lib/daemon/webhook-receiver-service.d.ts +9 -0
- package/dist/lib/daemon/webhook-receiver-service.js +17 -0
- package/dist/lib/daemon-services.d.ts +1 -1
- package/dist/lib/daemon-services.js +25 -0
- package/dist/lib/device-config.d.ts +3 -3
- package/dist/lib/device-config.js +5 -5
- package/dist/lib/devices/connect.d.ts +26 -0
- package/dist/lib/devices/connect.js +48 -1
- package/dist/lib/devices/doctor-findings.d.ts +5 -1
- package/dist/lib/devices/doctor-findings.js +19 -1
- package/dist/lib/devices/harness-inventory.js +5 -2
- package/dist/lib/exec.d.ts +28 -0
- package/dist/lib/exec.js +73 -7
- package/dist/lib/feed/feed.d.ts +1 -1
- package/dist/lib/feed/feed.js +23 -1
- package/dist/lib/feed-broadcast.js +1 -1
- package/dist/lib/fleet/apply.d.ts +11 -0
- package/dist/lib/fleet/apply.js +23 -3
- package/dist/lib/fleet/auth-sync.js +5 -3
- package/dist/lib/help.d.ts +9 -0
- package/dist/lib/help.js +29 -1
- package/dist/lib/hosts/passthrough.d.ts +1 -10
- package/dist/lib/hosts/passthrough.js +1 -13
- package/dist/lib/installations/versions.js +9 -1
- package/dist/lib/linux-userns.d.ts +58 -0
- package/dist/lib/linux-userns.js +116 -0
- package/dist/lib/memory.d.ts +26 -0
- package/dist/lib/memory.js +80 -1
- package/dist/lib/monitors/config.d.ts +11 -0
- package/dist/lib/monitors/config.js +8 -0
- package/dist/lib/monitors/engine.d.ts +5 -1
- package/dist/lib/monitors/engine.js +13 -4
- package/dist/lib/monitors/state.d.ts +37 -1
- package/dist/lib/monitors/state.js +79 -4
- package/dist/lib/permissions-registry.d.ts +2 -0
- package/dist/lib/permissions-registry.js +116 -14
- package/dist/lib/permissions.d.ts +5 -3
- package/dist/lib/permissions.js +25 -27
- package/dist/lib/profiles.d.ts +8 -7
- package/dist/lib/profiles.js +12 -0
- package/dist/lib/project-key.d.ts +9 -0
- package/dist/lib/project-key.js +11 -0
- package/dist/lib/scheduling/routines.d.ts +47 -0
- package/dist/lib/scheduling/routines.js +70 -1
- package/dist/lib/secrets/bundles.d.ts +35 -0
- package/dist/lib/secrets/bundles.js +78 -1
- package/dist/lib/secrets/push.d.ts +3 -8
- package/dist/lib/secrets/push.js +18 -14
- package/dist/lib/secrets/remote.d.ts +9 -18
- package/dist/lib/secrets/remote.js +11 -26
- package/dist/lib/secrets/reserved-sync.d.ts +65 -0
- package/dist/lib/secrets/reserved-sync.js +129 -0
- package/dist/lib/self-heal/checks/hook-manifest.d.ts +2 -0
- package/dist/lib/self-heal/checks/hook-manifest.js +56 -0
- package/dist/lib/self-heal/registry.js +4 -0
- package/dist/lib/self-heal/types.d.ts +1 -1
- package/dist/lib/session/active.js +1 -4
- package/dist/lib/session/db.d.ts +41 -5
- package/dist/lib/session/db.js +132 -30
- package/dist/lib/session/discover.d.ts +32 -4
- package/dist/lib/session/discover.js +119 -25
- package/dist/lib/session/insights.d.ts +14 -0
- package/dist/lib/session/insights.js +25 -2
- package/dist/lib/session/linear.js +1 -1
- package/dist/lib/session/shell-programs.d.ts +17 -0
- package/dist/lib/session/shell-programs.js +21 -0
- package/dist/lib/session/state.js +2 -1
- package/dist/lib/session/stream-render.js +2 -1
- package/dist/lib/session/tool-calls.js +2 -5
- package/dist/lib/session/trajectory-html.js +2 -1
- package/dist/lib/session/trajectory.js +3 -12
- package/dist/lib/session/types.d.ts +8 -0
- package/dist/lib/share/capture.js +11 -2
- package/dist/lib/share/publish.d.ts +56 -5
- package/dist/lib/share/publish.js +126 -18
- package/dist/lib/share/worker-template.d.ts +3 -12
- package/dist/lib/share/worker-template.js +860 -59
- package/dist/lib/startup/root-command.js +2 -1
- package/dist/lib/state.d.ts +16 -0
- package/dist/lib/state.js +178 -46
- package/dist/lib/sync-status.d.ts +4 -0
- package/dist/lib/sync-status.js +3 -0
- package/dist/lib/traces/classify.js +24 -19
- package/dist/lib/usage-refresh.js +2 -1
- package/dist/lib/view-types.d.ts +7 -0
- package/package.json +9 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,213 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.22.55
|
|
4
|
+
|
|
5
|
+
- **Managed shares generate their Open Graph cover server-side (PHNX-2835).** Publishing HTML to `share.agents-cli.sh` no longer launches local Chromium. The Worker lazily renders a deterministic 1200×630 AGI card with Satori and resvg-wasm, bundles Inter and JetBrains Mono, inherits the canonical page's visibility gate, and caches the PNG in R2. BYO endpoints keep their local screenshot fallback. An explicit missing `AGENTS_SHARE_BROWSER` or `PUPPETEER_EXECUTABLE_PATH` now fails loudly instead of silently falling through. Source: `cli/src/lib/share/{capture,publish,worker-template}.ts`.
|
|
6
|
+
|
|
7
|
+
- **`agents routines status --json` — the daemon-owned scheduler status surface (PHNX-3215).** `routines status` printed human-only scheduler health and upcoming fires with no machine-readable form; the JSON that existed (`routines list --json`) is definition-shaped and does not answer "did this routine fire here, and is one running right now?" The new `--json` emits a `scheduler` block (state, pid, heartbeat age, enabled/total counts) plus a `routines` array where each row carries the routine's single **owner device** (`ownerDevice`, with `ambiguousDevicePin` when `devices:` names more than one), whether it fires here (`runsHere`), the last local fire's outcome and error (`lastStatus`, `failureReason`, `lastRunStartedAt`/`CompletedAt`), and any **in-flight spawn** (`inFlight: { runId, pid, startedAt, triggerKind }`) — surfaced only for a run that is genuinely live on this device (a live local child or a host-placed run), never a provisional pre-spawn claim. The routine set and counts are the schedulable ones (matching plain `routines status`), so the JSON never inflates totals with discoverable-but-unmaterialised project routines. Source: `cli/src/lib/scheduling/routines.ts` (`buildRoutineStatusRows`), `cli/src/commands/routines.ts`.
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Daemon service restarts now replace periodic timers instead of multiplying their tick rate, and a timed-out tick parks until its real work settles instead of overlapping teardown or another tick. Live-session metadata publishing, monitor evaluation, heartbeat/process reconciliation, tmux and browser-task reaping, broker self-heal, and signed webhook ingress now run under the per-service supervisor with measured health and isolated failure handling.
|
|
12
|
+
|
|
13
|
+
- **`agents view --json` and `agents devices harnesses/accounts --json` no longer leak the internal `'stale'` sentinel in their usage-error fields (PHNX-3348).** Without `--refresh`, a read-only usage lookup on a never-cached account returns the internal `USAGE_NOT_COLLECTED_MARKER` (`'stale'`) — a cache signal, not a message — and the JSON builders emitted it verbatim (as `usageError`, and as `quota.unavailableReason`), contradicting those fields' "human-readable" contract. Both surfaces now normalize through a new shared `usageErrorForDisplay` to a plain-language, actionable string (`Usage not collected yet — run \`agents view --refresh\` to fetch it.`); every genuine, already-human error passes through unchanged, and the human terminal renders were already correct and are untouched. Source: `cli/src/lib/accounting/usage.ts`, `cli/src/commands/view.ts`, `cli/src/lib/view-types.ts`, `cli/src/lib/devices/harness-inventory.ts`.
|
|
14
|
+
|
|
15
|
+
- **`agents artifacts share open <target>` — open your own published page signed in as the owner, so its inline visibility control is actually usable (PHNX-3370).** The shared page's `Public`/`Unlisted`/… chip is an interactive dropdown only for the signed-in owner, but nothing ever handed a browser the login it needed — the Worker could *redeem* a `phoenix_ticket` cookie yet nothing *minted* one, so opening your own link left the chip a static cue. Now the share Worker mints a short-lived, single-use, self-signed login ticket at `POST /__ticket` (authenticated by the caller's Phoenix bearer — it grants nothing the caller didn't already have, and is domain-separated from the identity cookie so neither can be replayed as the other), and `share open` appends it to your page URL so the browser trades it for the `__share` cookie and the chip becomes a live control. Managed (Phoenix) endpoints only; run `agents artifacts share update` once to redeploy a Worker that predates the mint route. `agents artifacts share visibility <target> <level>` remains the no-browser way to re-scope in place. Source: `cli/src/commands/share.ts`, `cli/src/lib/share/worker-template.ts`.
|
|
16
|
+
|
|
17
|
+
- **The new human task taxonomy actually applies to existing sessions now.** The traces topic classifier's output changed (Feature work / Bug fixes / Refactor / … in 1.22.54), but `classifyTopic`'s result is cached per-session in `session_topics` keyed by `SESSION_TOPIC_EXTRACTOR_VERSION` — which wasn't bumped, so every already-classified session stayed a cache hit at v1 with its old `Engineering`/`Operations` label and `agents traces sync` kept re-uploading the *old* labels. Bumped the version 1→2 so every session re-classifies with the new taxonomy on the next sync, and the Evals console treemap reflects it. Source: `cli/src/lib/session/db.ts`.
|
|
18
|
+
|
|
19
|
+
- **`agents view claude` shows live session + week usage bars again on a personal device (RUSH-2392).** A foreground `agents view` at a TTY on a `personal` device now falls through to the interactive Claude login for the usage read — the only credential carrying the `user:profile` scope the usage endpoint needs — so `agents view --refresh` repopulates the session (5h) + week (7d) window for every signed-in account instead of showing `S: █████ unavailable` on idle homes. `3f3554c51` (RUSH-1822) had removed that fallback for *every* caller to stop the daemon's unattended usage/auth-health loops from firing the interactive token at Anthropic and getting the fleet logged out; that guarantee is intact — the read is now gated by `allowInteractiveUsageLogin(role, isTTY)`, so every background caller (daemon usage warm, auth-health probe, watchdog) and every `--json`/piped reader stays setup-token-only and default-closed. #2987's blanket-wording change was treating the symptom; this restores the data. A usage read still never *refreshes* an access token — an expired interactive login reports `expired-credential`. Source: `cli/src/lib/accounting/usage.ts`, `cli/src/commands/view.ts`, `cli/docs/secrets.md`, `cli/docs/specifications.md`.
|
|
20
|
+
|
|
21
|
+
## 1.22.54
|
|
22
|
+
|
|
23
|
+
- **`agents accounts mint claude` (also `agents auth mint claude`) mints a
|
|
24
|
+
setup-token and seeds it — the first-class close of the mint-auth recipe
|
|
25
|
+
(PHNX-2364).** `claude setup-token` is driven through the same injectable PTY
|
|
26
|
+
driver `agents fleet login` uses; the authorize URL is opened on this machine;
|
|
27
|
+
the captured value is accepted only when it is a single-line `sk-ant-oat01-…`
|
|
28
|
+
token (the #1767 TTY-banner capture is refused). The command seeds a named
|
|
29
|
+
provider account (policy never) for `agents run --account` / `agents accounts
|
|
30
|
+
sync` **and** the reserved FILE-BASED `auth` bundle keyed per email, which
|
|
31
|
+
usage/probe reads. `--token-stdin` skips the browser dance; `--fleet` /
|
|
32
|
+
`--device` syncs both bundles to workers. `--json` (including `--code --json`)
|
|
33
|
+
emits only the machine-readable result on stdout — progress URLs are
|
|
34
|
+
suppressed, matching `agents fleet login`. Native rotating OAuth is never
|
|
35
|
+
copied. Other harnesses fail loud (`agents fleet login` for device-code,
|
|
36
|
+
`agents accounts add` for API keys). `agents setup accounts` surfaces the
|
|
37
|
+
same step in the onboarding hub. Source: `cli/src/lib/auth-mint.ts`,
|
|
38
|
+
`cli/src/commands/auth-mint.ts`, `cli/src/commands/setup-accounts.ts`.
|
|
39
|
+
|
|
40
|
+
- **Reserve the `auth` secrets bundle as file-backed (PHNX-2365 / SEC-GAP-3).**
|
|
41
|
+
`agents secrets create/import auth` now forces the file backend and fails
|
|
42
|
+
loud on keychain or vault, instead of letting a keychain-backed `auth`
|
|
43
|
+
bundle be silently ignored by usage/probe. `resolveClaudeSetupToken` throws
|
|
44
|
+
the same error rather than returning null, and `agents doctor` emits
|
|
45
|
+
`auth-bundle-wrong-backend`. Source: `cli/src/lib/secrets/bundles.ts`,
|
|
46
|
+
`cli/src/lib/claude-account-token.ts`.
|
|
47
|
+
|
|
48
|
+
- **Auto-sync the reserved `auth` bundle across the fleet (PHNX-2371).**
|
|
49
|
+
File-backend `secrets export --device` no longer forwards
|
|
50
|
+
`AGENTS_SECRETS_PASSPHRASE` (that keyed remotes to a secret their daemons
|
|
51
|
+
lacked while still printing "Imported N key(s)"). Import and remote push
|
|
52
|
+
now read-back-verify decryptability. The daemon `auth-sync` service, plus
|
|
53
|
+
`fleet apply` and `repo push/pull user`, push a local file-backed `auth`
|
|
54
|
+
bundle to pinned devices that lack it. Source: `cli/src/lib/secrets/reserved-sync.ts`,
|
|
55
|
+
`cli/src/lib/secrets/remote.ts`, `cli/src/lib/daemon/auth-sync-service.ts`.
|
|
56
|
+
|
|
57
|
+
- **The menu-bar helper no longer permanently forgets refresh children after a crash (PHNX-2413).** Child ownership is persisted before spawn in a versioned, cross-process-locked registry, completed with PID/PGID/start-time/executable/argv identity, and recoverable from an unguessable provenance marker carried by the group-leading supervisor if the helper dies in the spawn-to-registration window. Reaping now retains individual ambiguous entries and registry I/O failures for retry, and deletes a child only after its process group is confirmed absent. Existing two-field records migrate conservatively. Source: `cli/menubar/Sources/MenubarHelper/ChildProcess.swift`.
|
|
58
|
+
|
|
59
|
+
- **Honor an OpenCode custom-harness `--model` pin (PHNX-2577).** `agents run`
|
|
60
|
+
of a harness forked from opencode now forwards the pinned model as
|
|
61
|
+
`--model` on `opencode run`. OpenCode does not read `OPENCODE_MODEL`, so the
|
|
62
|
+
pin previously vanished and the host used its configured default. Source:
|
|
63
|
+
`cli/src/lib/profiles.ts`, `cli/src/lib/exec.ts`.
|
|
64
|
+
|
|
65
|
+
- **`agents accounts` now fails with a clean CLI error instead of an uncaught Node stack (PHNX-2578).** A missing or locked `--from-secrets` bundle, or `inspect` of an unknown name, prints the user-facing message and exits 1. Ctrl+C at the add/set-key secret prompt still exits 130 with no error. Source: `cli/src/commands/accounts.ts`.
|
|
66
|
+
|
|
67
|
+
- **`agents monitors add` no longer auto-starts the daemon when `daemon.enabled` is false (PHNX-2637).** The kill switch already stopped `routines add`/`start`/`catchup` and webhook auto-start; `monitors add` called `startDaemon()` directly and brought the daemon up (and wrote the systemd autostart symlink) on a box whose config disabled it. Auto-start now goes through the same `assertDaemonEnabled()` gate: the monitor is still created, the refusal names `agents daemon enable`, and the engine-pickup wait is skipped. Source: `cli/src/commands/monitors.ts`.
|
|
68
|
+
|
|
69
|
+
- **Unpinned dispatch no longer dies on a logged-out default version (PHNX-2685).** Version selection now consults per-device auth state: a logged-out (or revoked) workspace/global default yields to a signed-in sibling on the execution device instead of spawning into a credential-less home, and fails loud naming each excluded version when nothing is signed in. `--strategy pinned` still forces a *rate-limited* default; an explicit `@version` pin is unchanged. Off macOS, a Claude home whose `.credentials.json` is missing (and which has no setup-token) reports signed out even when leftover `.claude.json` still names an email. Source: `cli/src/lib/accounting/rotate.ts`, `cli/src/lib/agent-spec/agents.ts`, `cli/src/commands/exec.ts`.
|
|
70
|
+
|
|
71
|
+
- **Codex `permissions list` now shows deny rules, and a later apply with no deny clears them (PHNX-2703).** `toCanonical` used to skip `.codex/rules/agents-deny.rules`, so `agents permissions list codex` omitted every forbid the writer had already emitted. The reader now inverts that file, and the writer deletes it when a later apply has an empty deny so a removed forbid does not persist. Source: `cli/src/lib/permissions-registry.ts`, `cli/src/lib/permissions.ts`.
|
|
72
|
+
|
|
73
|
+
- **Content search returns indexed transcripts the listing page missed (PHNX-2767).** `agents sessions "tmux pane"` intersected FTS hits with the in-memory pool (cwd-scoped, default-capped at 50), so grep-visible project transcripts dropped out and the query returned 0. FTS hits are now unioned with the pool and hydrated from the index when the page does not already hold them. `--project` / `--agent` / `--routine` still apply after that union, so a content hit outside the requested scope does not reappear as a multi-match. Source: `cli/src/lib/session/discover.ts`, `cli/src/commands/sessions.ts`.
|
|
74
|
+
|
|
75
|
+
- **A non-ASCII share title / `--label` / `--meta` value now publishes in full instead of degrading to `(unnamed)` or dropping glyphs (PHNX-2786).** `publishToEndpoint` still sends the latin1-safe folded value in `x-share-<field>` (so an already-deployed Worker keeps rendering exactly as before — the ByteString crash stays fixed), and now ALSO sends a percent-encoded `x-share-<field>-u` companion plus an `x-share-encoding: percent` opt-in whenever the fold was lossy. An updated Worker (`agents artifacts share update`) prefers the decoded companion, so a Japanese/Arabic/Hindi title or an emoji renders as written; a Worker that predates the scheme ignores the unknown headers and folds gracefully. `--meta` rides its whole raw object in one percent-encoded `x-share-meta-u` companion. Source: `cli/src/lib/share/publish.ts`, `cli/src/lib/share/worker-template.ts`.
|
|
76
|
+
|
|
77
|
+
- **Claude Code's native per-project memory now survives an agent version upgrade (PHNX-2817).** `getVersionHomePath` gives every installed Claude version its own isolated HOME, so `.claude/projects/<project-key>/memory/*.md` — the freeform notes Claude writes into itself, distinct from the `agents memory` resource — was a THIRD, unmanaged per-version copy: a note written under one version was invisible under another (empty dir, no symlink, no copy). Every version home's copy is now a symlink into one canonical dir shared across versions for that project, wired into the same sync path as `agents memory` (`agents sync` / `agents run` / `agents doctor --fix`); a pre-existing real directory's content is migrated into the canonical dir once instead of discarded. Source: `cli/src/lib/memory.ts`, `cli/src/lib/installations/versions.ts`.
|
|
78
|
+
|
|
79
|
+
- **`agents monitors` `--run` no longer records `ok` just because the agent
|
|
80
|
+
exited 0 (PHNX-2842).** A fire's frozen `ok` was reconciled against the run's
|
|
81
|
+
later status (RUSH-2690), but `completed` still counted as success — so a
|
|
82
|
+
merge-on-green monitor whose agent ran, hunted the fleet, and never merged
|
|
83
|
+
showed `ok` while the PR stayed OPEN. `run`/`routine` actions now take an
|
|
84
|
+
optional `postcondition` (CLI: `--postcondition <cmd>`, YAML:
|
|
85
|
+
`action.postcondition`) — a shell command, `{event}` interpolated, that must
|
|
86
|
+
exit 0 after the run settles. `agents monitors runs`/`view` then show `no
|
|
87
|
+
effect` (not `ok`) when it fails, and persist the result on the fire record.
|
|
88
|
+
`--run` without a postcondition still records `ok` on `completed` and warns
|
|
89
|
+
at add time. Source: `cli/src/lib/monitors/{state,config,engine}.ts`,
|
|
90
|
+
`cli/src/commands/monitors.ts`.
|
|
91
|
+
|
|
92
|
+
Provider accounts created with `accounts add` now resolve silently in headless
|
|
93
|
+
`--account` launches on macOS. Their `policy never` credentials are stored
|
|
94
|
+
without a biometry ACL and are read through the policy-aware secrets bundle
|
|
95
|
+
path instead of being rejected by the raw-keychain Touch ID guard.
|
|
96
|
+
|
|
97
|
+
- **`agents ssh <box> agents browser …` is gated by `browser.remote-control` (PHNX-3065).** The `--device` passthrough already stamped `AGENTS_FLEET_REMOTE=1` so the far-side consent gate could refuse a drive when remote-control is off. `agents ssh` built its invocation with only askpass vars in the local env — which OpenSSH does not forward — so a browser drive over ssh skipped the gate entirely. `buildSshInvocation` now prefixes an `agents browser` / `ag browser` / standalone `browser` remote command with the same `markFleetRemote` helper the fan-out uses (`env AGENTS_FLEET_REMOTE=1 …` on POSIX, `$env:AGENTS_FLEET_REMOTE='1'; …` on PowerShell). Non-browser commands and interactive logins stay unmarked. Source: `cli/src/lib/devices/connect.ts`, `cli/src/lib/hosts/passthrough.ts`.
|
|
98
|
+
|
|
99
|
+
- **Feed terminal answers now write a resolution tombstone (PHNX-3074).**
|
|
100
|
+
The TypeScript `recordAnswer` / `removeBlock` paths already recorded
|
|
101
|
+
`resolutions/<id>.json` before clearing an open block, but the Python
|
|
102
|
+
`UserPromptSubmit` hook (the path that fires when a human types in the
|
|
103
|
+
TUI) unlinked the block with no tombstone. A later `reconcileAttention`
|
|
104
|
+
consumer would then resurrect that generation from a stale session
|
|
105
|
+
re-read at the same cursor. The hook now writes an `answered` tombstone
|
|
106
|
+
(generation + `sourceCursor` from the still-present block) before
|
|
107
|
+
unlink, matching the TS writer. Source: `cli/src/lib/feed/feed.ts`.
|
|
108
|
+
|
|
109
|
+
- **Daemon PATH now includes `~/.rush/bin` and `~/.local/bin` (PHNX-3075).**
|
|
110
|
+
systemd/launchd pin a PATH that never sources a login shell, so `which rush`
|
|
111
|
+
failed inside the daemon even when an interactive shell on the same box
|
|
112
|
+
resolved `~/.rush/bin/rush`. Monitor `notify` actions and dispatched
|
|
113
|
+
`agents run` children inherit that PATH and silently never delivered
|
|
114
|
+
(`rush CLI not found on PATH`) while the watcher kept polling. Both
|
|
115
|
+
user-bin dirs now sit after the agents shim and Node dirs (so a
|
|
116
|
+
`~/.local/bin/agents` cannot shadow the daemon binary) and before the
|
|
117
|
+
platform system dirs. Source: `cli/src/lib/daemon/daemon.ts`.
|
|
118
|
+
|
|
119
|
+
- **Kimi expired usage state says "run Kimi once" and `--json --refresh` exposes the refresh result (PHNX-3198).** An expired Kimi OAuth credential used to render "re-auth for usage", even though a normal Kimi launch refreshes its own token. The usage error now reads "run Kimi once". `agents view <agent> --refresh --json` now actually forces a live refresh and includes a `usageError` field on each version so programmatic consumers see why a snapshot is missing. Source: `cli/src/lib/accounting/usage.ts`, `cli/src/commands/view.ts`, `cli/src/lib/view-types.ts`.
|
|
120
|
+
|
|
121
|
+
- **Share metadata can be corrected without republishing (PHNX-3278).** `agents artifacts share edit <target>` now sets/removes labels and merges, replaces, or removes validated arbitrary metadata through an authenticated Worker `PATCH`. The Worker streams the exact stored body back to R2 while preserving HTTP metadata, publication time, visibility, expiry, provenance, cover, and revisions, and deliberately creates no revision. `agents artifacts share list --meta key=value` is repeatable and filters exact metadata values in both human and `--list-json` output. Reserved keys and missing targets fail loudly.
|
|
122
|
+
|
|
123
|
+
- **Fail loud when codex's Linux sandbox can't start, instead of landing zero tools (PHNX-3285).**
|
|
124
|
+
Codex ≥0.146 sandboxes its `read-only` and `workspace-write` runs on Linux with a
|
|
125
|
+
bundled bubblewrap that needs an unprivileged user namespace. On Ubuntu 23.10+
|
|
126
|
+
(`kernel.apparmor_restrict_unprivileged_userns=1`) that's denied, so bwrap dies with
|
|
127
|
+
`bwrap: setting up uid map: Permission denied` and a **headless** codex run — an
|
|
128
|
+
`agents teams` codex teammate, or `agents run codex`, always headless + sandboxed —
|
|
129
|
+
burned a turn and wrote nothing while still reporting a completed turn. `agents run`
|
|
130
|
+
now preflights the box before spawning a headless sandboxed codex and **fails loud**
|
|
131
|
+
with the one-time fix, rather than silently under-delivering. The preflight is scoped
|
|
132
|
+
to codex + Linux + a headless + sandboxed (non-`skip`) run — an interactive TUI, a
|
|
133
|
+
`--mode skip` (no-sandbox) run, macOS/Windows, and every other harness are untouched,
|
|
134
|
+
and the intended `auto`=workspace-write + `approval_policy=never` config is preserved,
|
|
135
|
+
never downgraded to `danger-full-access`. `cli/scripts/enable-codex-sandbox.sh`
|
|
136
|
+
re-enables unprivileged userns on a box (sysctl drop-in, idempotent, self-verifying)
|
|
137
|
+
so codex's sandbox works with its isolation intact; run it once per fleet worker.
|
|
138
|
+
Source: `cli/src/lib/linux-userns.ts`, `cli/src/lib/exec.ts` (`codexSandboxPreflight`),
|
|
139
|
+
`cli/scripts/enable-codex-sandbox.sh`.
|
|
140
|
+
|
|
141
|
+
- **New `hook-manifest` self-heal check — a hook registered at an unresolvable path no longer fails silently.** `resolveHookScriptPath` only resolves a manifest `script:` under `<root>/hooks/`, and `resolveContainedHookPath` rejects any candidate escaping that root; an entry pointing anywhere else returns `null` and the hook is dropped with no error, no warning, and no trace in `agents doctor`. This is how `main-branch-guard` — declared in `agents.yaml` as `rules/subrules/truly-agentic-git-workflow/main-branch-guard.sh`, authored and covered by a 100+ case suite — reached zero of 25 settings files across three machines, and stayed there until four agent sessions had already written into a primary checkout it exists to prevent. The check walks the manifest, resolves every relative `script:`, and reports each one that resolves to nothing. Detect-only: guessing where a script was meant to live could wire the wrong file into a `PreToolUse` gate, so it names the broken entry instead. Absolute scripts (subrule-composed hooks, which bypass the `hooks/` resolver) and `enabled: false` entries are skipped. Source: `cli/src/lib/self-heal/checks/hook-manifest.ts`. (PHNX-3312)
|
|
142
|
+
|
|
143
|
+
- **Device-scope is now the DEFAULT for new config keys, not a hardcoded set (PHNX-3315).**
|
|
144
|
+
Routing a `Meta` key used to hinge on a decorative `Record<keyof Meta, 'central' | 'device'>`
|
|
145
|
+
string map whose values nothing consumed — the real split was a hand-written
|
|
146
|
+
destructure, so a newly added key that nobody wired silently landed in the synced
|
|
147
|
+
top-level `agents.yaml` (`central`), the very trap behind the recurring per-box
|
|
148
|
+
churn and key-loss. Classification is now an OPT-IN `CENTRAL_META_KEYS` allowlist
|
|
149
|
+
that DRIVES routing: a key not explicitly marked fleet-shared is device-scoped by
|
|
150
|
+
default and round-trips through this box's `devices/<host>/agents.yaml` under its
|
|
151
|
+
own name, with no bespoke wiring — so a slipped-through key can never leak to the
|
|
152
|
+
shared file. A compile-time check keeps the classification exhaustive (a nudge,
|
|
153
|
+
not a safety gate — the runtime default is still the safe per-box file), and a
|
|
154
|
+
foreign key an older CLI does not model but a newer one wrote to central is left
|
|
155
|
+
in place and preserved verbatim (never relocated). Behavior-identical for every
|
|
156
|
+
existing key. Source: `cli/src/lib/state.ts`.
|
|
157
|
+
- **`agents sync status` now surfaces config drift — a box that hasn't drained its device-scoped state (PHNX-3315).**
|
|
158
|
+
The one-shot fold-and-delete migrations (P1's frozen-header heal + central
|
|
159
|
+
`browser:` tombstone drain; P2's `fleet.discovery`/`fleet.ignored`, `hosts:`, and
|
|
160
|
+
device-scoped `accounts:` folds) run on config access, so a converged box shows
|
|
161
|
+
nothing — but a box that never re-synced kept carrying that state centrally, and
|
|
162
|
+
it was INVISIBLE: the report only showed per-agent "N missing", so the un-drained
|
|
163
|
+
box was found the hard way, as a mystery `agents repo pull` conflict. A distinct
|
|
164
|
+
drift line now flags (1) a stale top-level `agents.yaml` header (!= the current
|
|
165
|
+
header) and (2) any lingering central `fleet` / `hosts` / `accounts` (device-scoped)
|
|
166
|
+
/ `browser` block that should have folded into the device doc. The detector is
|
|
167
|
+
read-only and never triggers the migration; the machine-readable
|
|
168
|
+
`UnifiedSyncStatus` gains a `config` field. Source: `cli/src/lib/config-drift.ts`
|
|
169
|
+
(new), `cli/src/lib/{sync-status,state}.ts`, `cli/src/commands/status.ts`.
|
|
170
|
+
|
|
171
|
+
- **Root `--help` now surfaces the measured front-door groups and points to the full surface (PHNX-3320).** `agents --help` renders the ten most-used groups (Quick start: setup, view, run, sessions; Most-used: teams, browser, secrets, devices, accounts, add) and a pointer to `agents --help-all`, which lists all 69 command groups. Previously 29 groups were never mentioned on root help. Source: `cli/src/lib/help.ts`, `cli/src/cli/command-registry.ts`, `cli/src/bootstrap.ts`.
|
|
172
|
+
|
|
173
|
+
- **`agents focus <id> --attach-only` now names the real session id in its recovery hint when the live row has not registered one yet (PHNX-3356).** A live IDE/plain-terminal session with no `sessionId` used to print the literal `agents sessions resume <id>` placeholder even though the caller already had the indexed id. Attach-only still refuses rather than forking. Source: `cli/src/commands/go.ts`, `cli/src/commands/focus.ts`.
|
|
174
|
+
|
|
175
|
+
- **Every `agents insights` subcommand now honors `--json` / `--since` / `--by` (PHNX-3360).** These flags share their long names with the `insights` parent command, so commander bound them to the parent at parse time and the subcommand actions — which read their own `opts()` — never saw them: `--json` printed the human table (invalid for machine callers), `--by` fell back to the default agent grouping, and `--since` was ignored (7d default). The whole group is affected — `output`, `cost`, `mix`, `trends`, `recipes`, `query`, and the per-recipe leaves — and all now read `command.optsWithGlobals()`. Unblocks the `yc:workweave` shipped-output engine, which shells `agents insights output --by project --json`. Source: `cli/src/commands/output.ts`, `cli/src/commands/cost.ts`, `cli/src/lib/analytics/mix-commands.ts`.
|
|
176
|
+
|
|
177
|
+
- **`agents sessions` content search now indexes what the agent ANSWERED, not just what you asked (PHNX-3363).** `session_text`'s extractor pushed only `role === 'user'` text — every harness parser's assistant branch recorded tokens/skills/tools but never the reply itself — so `agents sessions "<an assistant-only phrase>"` returned 0 hits even when the transcript on disk plainly had it. Every harness parser (Claude, Codex, Gemini, Rush, Hermes, Muse, Droid, Cursor) now accumulates the agent's answer text the same way it already accumulates the user's prompt text, into a new `session_text.assistant` FTS5 column with a lower BM25 weight than `content` (an equivalent user-prompt match still ranks first). A `scan_ledger.extractor_version` + `CONTENT_INDEX_VERSION` (`lib/session/db.ts`) lever makes the change-detector (`filterChangedEntries`) re-extract an already-indexed, byte-unchanged session on its next scan — the mechanism that backfills every existing session's assistant text without a destructive `DELETE FROM scan_ledger` (which would also drop the Claude/Codex resumable `parser_state`). `ftsSearch`'s FTS5-tier hit now carries a short bm25 `snippet()` excerpt (auto-picking the best-matching column), surfaced on `SessionMeta.snippet` and included, unlike `_matchedTerms`/`_bm25Score`, in `--json` output. Source: `cli/src/lib/session/db.ts`, `cli/src/lib/session/discover.ts`.
|
|
178
|
+
|
|
179
|
+
- **`agents artifacts share visibility <target> <level>` changes a published page's visibility in place.** Until now the only way to re-scope an already-shared page (public ↔ unlisted ↔ me ↔ org) was a full re-publish or a delete. The new verb re-stamps only the visibility on the stored object: the slug — and so the URL — is preserved, the body is untouched, and (like `agents artifacts share edit`) it is a metadata-only rewrite that creates no revision. It reuses the delete target parser (full URL, `<user>/<slug>`, or a bare slug in your namespace) and the same `PATCH` metadata-edit route/client — visibility is a first-class edit field alongside `label`, never a `--meta` entry (`visibility` is reserved). `me`/`org` require a Phoenix session and fail loud with an `agents auth login` hint when signed out; `org` is refused on a public-inbox email domain. A BYO endpoint whose deployed Worker predates the visibility edit fails loud (`agents artifacts share update`) rather than silently reporting success. **Adds a `visibility` field to the Worker `PATCH` route, so already-provisioned BYO endpoints must run `agents artifacts share update` to pick it up (their template reads `outdated` until then); the managed endpoint is updated by the release.** Source: `cli/src/commands/share.ts`, `cli/src/lib/share/worker-template.ts`, `cli/src/lib/share/publish.ts`.
|
|
180
|
+
|
|
181
|
+
- **The cross-platform CI matrix moved off the release path to a nightly lane (PHNX-3237).** The six-job `ci.yml` matrix (ubuntu + macOS + Windows × Node 22/24) used to fire on every `release/**` branch — 16-53 min of macOS-10×/Windows-2×-billed work that gated nothing: it is not a required check, and `release.sh` gates the merge on `test` + `gitleaks` and the publish on an exact-tree attestation, never this matrix. Worse, a macOS-only failure had it red on every recent release, adding a false "release is failing" signal. It now runs on a nightly schedule plus manual `workflow_dispatch`, so cross-platform regressions are still caught without putting slow, billed, non-gating work on the release. Source: `.github/workflows/ci.yml`, `.github/workflows/ci.test.ts`.
|
|
182
|
+
|
|
183
|
+
- **A release-tree attestation can now inherit the suite result instead of re-running the full suite (PHNX-3237).** An ordinary release ran the ~13k-test suite twice — once for the default-branch tree, once for the `chore(release)` commit tree — even though the second differs from the first only by the version bump, the folded changelog, and the regenerated command-index. New `release-attestation.sh derive --base <green-attestation.json> --tarball <release.tgz>` mints the release-tree record by inheriting the base's suite pass, verifying that the tree diff touches **only** `package.json`, `.changelog/**`, `CHANGELOG.md`, and `docs/command-index.{md,json}` — it fails closed on any other changed path, so a code change can never ride a stale pass. `release-attestation-produce.sh --inherit-suite-from <base.json>` uses it to skip the suite while still building + packing the real release-tree tarball, cutting the second full-suite run per release. The derived record inherits the base's lockfile/policy/toolchain identity, which the allowlist proves are byte-identical to the release tree's, so the release's `require()` still keys to it exactly. Source: `cli/scripts/release-attestation.sh`, `cli/scripts/release-attestation-produce.sh`.
|
|
184
|
+
|
|
185
|
+
- **`agents view` names why a Claude usage bar is empty instead of printing a blanket "usage unavailable" (#2987).** Three distinct states shared one generic label, so an operator chasing empty bars was sent to `claude setup-token` for a remedy that cannot work. (1) A signed-in Claude account with no provisioned setup-token reported the shared `usageNoCredentialError` — "sign in, or provision a long-lived token" — advice whose first half the usage path will never honour: a read-only caller resolves only a file-based setup-token and never the interactive login (RUSH-1822), so an account that IS signed in still reads as unreadable. It now reports `usage unavailable (no usage credential)` and states both constraints, including that a setup-token cannot read usage either (RUSH-2392). (2) `headless-scope` was listed with the generic bucket in `formatUsageErrorKindLabel`, so the RUSH-2392 phrase appeared only on the surface that also passes the `headless` flag — every other caller printed "usage unavailable" for the same account. It now renders `usage unavailable (headless)` from the classified kind alone. (3) The read-only cache-miss sentinel (`'stale'`, now the exported `USAGE_NOT_COLLECTED_MARKER`) had no classification arm and fell through to `'rejected'`, so a cold cache — no request made, nothing failed — rendered as a failure; it classifies as `not-collected` and renders `usage pending`. Source: `cli/src/lib/accounting/usage.ts`, `cli/docs/secrets.md`.
|
|
186
|
+
|
|
187
|
+
- **`agents insights` now breaks the `Bash` lump down by binary.** The tool mix used to render every shell call as one undifferentiated `Bash` bar (and one `failed tool loop: Bash` line), which said nothing about *what* ran. Two new sections split it by the actual executable + subcommand, reusing the existing `bucketKey` classifier: **Shell commands** (`git commit`, `gh pr`, `agents ssh`, `find`, `ssh→git pull`, …) and **Shell command failures** (which binary was running when a tool loop failed). It is cross-harness — keyed on the command string, which Codex's `exec_command` carries too, not just Claude's `Bash`. The Actions block also now prints a one-line pointer to drill a sample session id into its full timeline (`agents sessions trace <id>`); the report itself stays aggregate by contract (SES-IF-4c). Source: `cli/src/lib/session/insights.ts`, `cli/src/commands/insights.ts`.
|
|
188
|
+
|
|
189
|
+
- **`release.sh --apply` from a non-interactive shell now fails loudly instead of exiting 0 having published nothing (PHNX-3176).** The confirmation gate reads `[y/N]` from stdin; with no TTY (a backgrounded run, a sandbox, `< /dev/null`) `read` gets EOF, the prompt default-declines, and the script exited **0** having done nothing — no attestation, no PR, no tag, no publish. A caller that backgrounded the release, checked `$?`, and saw 0 then believed a release shipped when none did, which is exactly how a silent version gap opens. `--apply` without a TTY and without `--yes` now aborts with a non-zero exit before any work, naming `--yes` as the sanctioned non-interactive path. The internal `--home-base-phase` / `--orchestration-phase` re-execs are exempt (they inherit the already-checked stdin). Source: `cli/scripts/release.sh`.
|
|
190
|
+
|
|
191
|
+
- **The release attestation no longer dead-loops on a changed `computer-mac` helper (PHNX-2943).** `release-attestation-produce.sh` never rebuilds `computer-mac` (it is signed on a separate macOS path), so when its source drifted it died telling the operator to run `publish-computer-helper-mac.sh` and re-run — but that script recorded nothing, so the re-run hit the identical error forever (workaround used live cutting 1.22.43). The publish script now uploads a `computer-mac-input-digest.txt` sidecar naming the exact source it built from, and the producer records the published binary against the current source **only after** that sidecar matches (verifying the downloaded zip against its `.sha256`). A mismatch, a missing sidecar, or an undownloadable release fails closed with the exact publish command, so a stale binary can never be attested against changed source. Source: `cli/scripts/release-attestation-produce.sh`, `cli/scripts/publish-computer-helper-mac.sh`.
|
|
192
|
+
|
|
193
|
+
- **`release.sh` now refuses to fold the changelog queue when an earlier release's version-bump PR is still open, closing a cross-version note-misattribution (PHNX-3084).** The decoupled release (RUSH-2395) merges the version-bump PR asynchronously after publish; if that merge is stuck on a CHANGELOG conflict, v1.2.3's `.changelog/next/*` fragments stay queued on `main`, and a later `release.sh 1.2.4` re-read them and folded v1.2.3's notes under v1.2.4. The same-target `STUCK_BUMP_PR` retry only ever queried `release/v<current-target>`, so it was blind to an OTHER version's stuck PR. Before folding, `release.sh` now detects any other open `release/v*` bump PR (via the new unit-tested `scripts/release-other-bump-prs.sh`) and fails loud with the exact merge command, rather than silently re-attributing an earlier version's release notes. Source: `cli/scripts/release.sh`, `cli/scripts/release-other-bump-prs.sh`.
|
|
194
|
+
|
|
195
|
+
- **Shared images / videos / PDFs now get the attribution bar too, via a viewer page (PHNX-3332).** The attribution bar only injects into HTML; a directly-shared non-HTML asset had no "shared by / visibility" chrome. Now a **browser** navigating to a shared image, video, audio, or PDF gets a lightweight viewer page — the same attribution bar on top, the asset centered below. A **non-browser fetch** (Accept without `text/html`: an `<img src>`, an OG crawler, curl) still gets the **raw bytes**, so embeds and social previews are never broken; the viewer's own media element points back at the asset with `?raw` (which also re-runs the me/org gate, so a private asset stays private inside its own viewer). Non-viewable types (JSON, arbitrary downloads) are served raw. Source: `cli/src/lib/share/worker-template.ts`.
|
|
196
|
+
|
|
197
|
+
- **The share attribution bar now always shows the sharer's avatar.** Every shared page (and every asset viewer page) renders an avatar in the bar next to "Shared by …": a coloured initials circle derived from the handle, always present, so a share is never faceless — especially useful for an org/company share where knowing *who* posted it matters. When the sharer is signed in, the CLI stamps a Gravatar (keyed on a SHA-256 of the lowercased email — only the hash lands in public metadata, never the raw address) so a real profile photo layers over the initials; if the user has no Gravatar the photo request 404s and the bar cleanly falls back to the initials circle (`onerror`, honoured because the share page sets no CSP). Source: `cli/src/lib/share/worker-template.ts` (render + `x-share-avatar` → `customMetadata.avatar`), `cli/src/lib/share/publish.ts` (`resolveShareAvatar`). Deployed by re-running `agents artifacts share update`; a hosted-photo pipeline for users without a Gravatar is tracked as a follow-up.
|
|
198
|
+
|
|
199
|
+
- **Shared pages now show page stats and let the owner change visibility inline.** The attribution bar injected on every shared HTML page gained a right-side stats cluster — `👁 <n> views · updated <rel>` — where views is a per-slug visitor count (owner views and `?raw`/embed fetches are not counted) and the relative time comes from the page's last write. For the page's owner (the signed-in viewer whose handle is the namespace), the visibility chip becomes a live control: click it for an inline dropdown of Public / Unlisted / Only you / Anyone at your org, pick a level, and the bar PATCHes the same in-place edit route `share visibility` uses (with `credentials:'include'`), flipping the chip optimistically and reverting with the server's error text on failure (e.g. org from a public-inbox domain). Everyone else keeps today's static read-only cue. The view counter is a separate `__views/<path>` R2 object, so counting a view never rewrites the page (which would corrupt "last updated"). Source: `cli/src/lib/share/worker-template.ts` (`renderAttributionBar` owner control + stats, `readViews`/`writeViews`, `gateVisibility`, owner-cookie write principal in `authorizeWrite`). Because this changes the Worker template, a deployed endpoint reads `outdated` until its owner redeploys with **`agents artifacts share update`** — a pure Worker update, no new bindings.
|
|
200
|
+
|
|
201
|
+
- **`agents artifacts share list` can now show the owner's hidden pages.** The default remains the public gallery (`--scope public`). Pass `--scope unlisted|me|org` or `--all` to include pages that are hidden from the public listing; the CLI sends the owner's bearer and a `scope=mine` hint to the Worker's JSON listing route, which returns hidden pages only after verifying the caller owns the namespace. Each human row now shows the page's visibility so public vs hidden is obvious at a glance. Source: `cli/src/commands/share.ts` (`--scope`/`--all` filter, owner bearer forwarding, visibility column), `cli/src/lib/share/worker-template.ts` (`resolveListingScope` + owner-gated hidden inclusion in `renderListing`). The Worker change only takes effect on a live endpoint after its owner runs `agents artifacts share update`.
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
type: fix
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
`agents sessions trace` now recognizes a session's shell steps consistently across every surface. The "is this tool a shell command?" test lived as six hand-synced copies that had drifted apart — the tool-call indexer treated Codex's `exec`/`execute`/`run_command` as shell, but the trajectory model, the directory-touched scan, and both the HTML and stream renderers each used a narrower or differently-cased list. They now share one case-insensitive `isShellExecTool` predicate (`shell-programs.ts`), so a Codex or Droid shell step is colored, program-resolved, and counted the same as Claude's `Bash` everywhere the trace reads it.
|
|
208
|
+
|
|
209
|
+
- **Phoenix Evals topic buckets now read as human task types, not five generic labels.** The session-topic classifier (`agents traces sync`) collapsed every code session into `Engineering` and every ops session into `Operations`, so the console treemap showed coarse, robotic labels. `classifyTopic` now emits the taxonomy the approved console mockup always intended — **Feature work · Bug fixes · Refactor · Debugging · Code review · Release · Blog & docs · Fleet / ops** — as an ordered rules table (still metadata/tool-mix only, no transcript read), keyed within the five stable `TraceTopicGroup` groups so the treemap grouping and existing consumers don't move. One-time: a session previously bucketed as `engineering`/`operations`/`content` re-keys on next sync, so `bucketHistory`/`driftSignals` show a single-day discontinuity the day this ships, then track the new keys. Source: `cli/src/lib/traces/classify.ts`.
|
|
210
|
+
|
|
3
211
|
## 1.22.53
|
|
4
212
|
|
|
5
213
|
- **Custom-harness runs launched via a profile now show their real harness name in agents sessions instead of 'claude' (PHNX-2935).**
|
package/README.md
CHANGED
|
@@ -194,7 +194,7 @@ agents run claude@ --device auto # pick the device, then choose there
|
|
|
194
194
|
agents run claude@ --device yosemite-s0 # choose from one device's accounts
|
|
195
195
|
```
|
|
196
196
|
|
|
197
|
-
`--strategy balanced` spreads work across available versions of the same agent -- useful when you have multiple accounts and want to avoid burning through one. When a Claude run reports a session limit, agents-cli records the stated reset time, shows `session-limited` in `agents view`, and excludes that account until the reset. When every account is rate-limited, the run exits nonzero naming each excluded account and the earliest window reset (use `--strategy pinned` to force
|
|
197
|
+
`--strategy balanced` spreads work across available versions of the same agent -- useful when you have multiple accounts and want to avoid burning through one. When a Claude run reports a session limit, agents-cli records the stated reset time, shows `session-limited` in `agents view`, and excludes that account until the reset. When every account is rate-limited, the run exits nonzero naming each excluded account and the earliest window reset (use `--strategy pinned` to force a rate-limited default) -- it never launches into an exhausted account. A logged-out default is never forced: unpinned dispatch picks a signed-in version on the execution device instead of dying on a credential-less default home.
|
|
198
198
|
|
|
199
199
|
### Don't care which harness? `agents run auto`
|
|
200
200
|
|
|
@@ -523,7 +523,7 @@ agents add claude@2.0.65 # Install a specific version
|
|
|
523
523
|
agents add codex@latest # Install latest
|
|
524
524
|
agents add codex@oldest # Install the oldest published version
|
|
525
525
|
agents view # See everything installed
|
|
526
|
-
agents accounts
|
|
526
|
+
agents accounts mint claude --account work # mint a setup-token into a named account
|
|
527
527
|
agents run claude --account work
|
|
528
528
|
```
|
|
529
529
|
|
|
@@ -959,6 +959,9 @@ agents browser refs # Get interactive element refs
|
|
|
959
959
|
agents browser click 42 # Click element ref 42
|
|
960
960
|
agents browser type 15 --text "hello" # Type into element ref 15
|
|
961
961
|
agents browser screenshot # Smart resizing, token-efficient
|
|
962
|
+
agents browser record start --fps 10 --duration 40
|
|
963
|
+
# Drive the page, then finalize a playable WebM under the task's recordings/ dir.
|
|
964
|
+
agents browser record stop
|
|
962
965
|
agents browser tabs # List tabs open for the current task
|
|
963
966
|
agents browser tab focus tab123 # Switch focus to another tab
|
|
964
967
|
agents browser done # Close task's tabs when finished
|
|
@@ -973,6 +976,11 @@ printf '%s\n' \
|
|
|
973
976
|
| agents browser stream --task "$AGENTS_BROWSER_TASK"
|
|
974
977
|
```
|
|
975
978
|
|
|
979
|
+
Recording resolves ffmpeg automatically. It reuses a usable binary on `PATH` or
|
|
980
|
+
under `~/.agents/.cache`, and when none exists it installs through Homebrew on
|
|
981
|
+
macOS, apt on Debian/Ubuntu, or the available platform package manager. If the
|
|
982
|
+
automatic path cannot run, the error names the exact manual install command.
|
|
983
|
+
|
|
976
984
|
### Why this works where Playwright fails
|
|
977
985
|
|
|
978
986
|
Playwright and Puppeteer spin up fresh browser instances with automation flags. Sites like LinkedIn, Google, and most finance apps detect and block them immediately.
|
|
@@ -1070,6 +1078,8 @@ Distinct from **Accounts** below: this is *your human identity*; those are the *
|
|
|
1070
1078
|
Give a provider credential a durable name once, reuse it everywhere -- across harnesses, across machines.
|
|
1071
1079
|
|
|
1072
1080
|
```bash
|
|
1081
|
+
agents accounts mint claude # drive `claude setup-token`, seed a named account + reserved auth bundle
|
|
1082
|
+
agents accounts mint claude --token-stdin # already have a token
|
|
1073
1083
|
agents accounts add work --provider anthropic --auth setup-token
|
|
1074
1084
|
agents accounts add gateway --provider openrouter --auth api-key \
|
|
1075
1085
|
--from-secrets openrouter.ai:OPENROUTER_API_KEY # import from an existing secrets bundle
|
|
@@ -1083,6 +1093,8 @@ agents run claude --account work
|
|
|
1083
1093
|
agents harness add deepinfra --account deepinfra
|
|
1084
1094
|
```
|
|
1085
1095
|
|
|
1096
|
+
`agents accounts mint claude` (also `agents auth mint claude`) is the first-class replacement for the mint-auth recipe: it drives `claude setup-token` in a PTY, captures a well-formed `sk-ant-oat01-` token, and seeds both the named account and the reserved file-based `auth` bundle that usage/probe reads. Native rotating OAuth is never copied.
|
|
1097
|
+
|
|
1086
1098
|
One provider account **is** one `agents secrets` bundle -- `agents accounts add` creates it with secrets policy `never`, so a background agent launch on that account never raises Touch ID. `agents accounts` (no subcommand) lists provider bundles next to harness-native signed-in identities so you see both kinds of credential together; `accounts list` / `inspect <name>` / `set-key <name>` (rotate) / `rename` / `remove` manage a bundle by its stable id, independent of its current label. `accounts switch <harness>` is the fast picker over that default -- it writes the same binding as `set-default`, and balanced rotation already honors it.
|
|
1087
1099
|
|
|
1088
1100
|
Harness-native OAuth logins (Claude Code's own `/login`, `codex login`, and so on) stay exactly where the harness put them -- agi-cli discovers and displays them but never copies, renames, or converts them into a provider bundle. Native `accounts name` / `attach` is only for harnesses agents-cli can isolate today (claude, codex, grok; muse when an email is present). A device-scoped login (kimi, droid, …) is refused with a named reason; provider `accounts add --provider` is unrestricted. Native **labels** (`agents accounts label codex personal`) bind to a stable identityKey on the central account row in `agents.yaml`, which `agents repo push/pull` already syncs fleet-wide, so `codex#personal` selects the same login on every box. `accounts sync <name> --device <device>` is the only way a **provider** account credential crosses machines, and it's explicit: nothing copies OAuth automatically. Selection order for a run is explicit `--account`, then `accounts set-default` / `switch` for that harness, then the harness's native/balanced account behavior.
|
|
@@ -1152,6 +1164,7 @@ agents routines add daily-digest \
|
|
|
1152
1164
|
--prompt "Review yesterday's PRs and summarize key changes"
|
|
1153
1165
|
|
|
1154
1166
|
agents routines list # All jobs + next run times
|
|
1167
|
+
agents routines status # Scheduler health + next fires (add --json for owner device, last fire, last error, in-flight run per routine)
|
|
1155
1168
|
agents routines run daily-digest # Test it now, ignore the schedule
|
|
1156
1169
|
agents routines logs daily-digest # Last execution — status + report (add --full for raw stdout)
|
|
1157
1170
|
agents routines runs daily-digest # Every attempt, including blocked/skipped pre-session runs
|
|
@@ -1219,7 +1232,7 @@ on `SIGHUP reload`.
|
|
|
1219
1232
|
There is no `agents daemon jobs` -- scheduled work is always `agents routines`
|
|
1220
1233
|
(see `agents routines stats` for per-routine failure detail). `disable` is a
|
|
1221
1234
|
device-local kill switch: with it set, `routines add`/`routines start`/
|
|
1222
|
-
`routines catchup`/webhook triggers stop auto-starting the daemon, mirroring
|
|
1235
|
+
`routines catchup`/`monitors add`/webhook triggers stop auto-starting the daemon, mirroring
|
|
1223
1236
|
`systemctl disable` -- `agents daemon start` still works as the explicit
|
|
1224
1237
|
override.
|
|
1225
1238
|
|
|
@@ -1242,6 +1255,12 @@ agents monitors add ci-red \
|
|
|
1242
1255
|
--run claude --prompt 'CI failed: {event}. Diagnose and fix.' \
|
|
1243
1256
|
--device yosemite-s0
|
|
1244
1257
|
|
|
1258
|
+
# Merge-on-green: ok only if the PR actually merged, not just because the agent exited 0
|
|
1259
|
+
agents monitors add merge-1682 \
|
|
1260
|
+
--poll 'gh pr view 1682 --json state --jq .state' 2m --match OPEN \
|
|
1261
|
+
--run claude --prompt 'Rebase-merge #1682: {event}' \
|
|
1262
|
+
--postcondition 'gh pr view 1682 --json state --jq .state | grep -qx MERGED'
|
|
1263
|
+
|
|
1245
1264
|
# A fleet box goes unreachable or overloaded -> notify (watch the fleet itself)
|
|
1246
1265
|
agents monitors add box-down --watch-device mac-mini --on-change --notify telegram
|
|
1247
1266
|
|
|
@@ -1253,7 +1272,7 @@ agents monitors test ci-red # Dry-run: evaluate the source once, show what it
|
|
|
1253
1272
|
agents monitors list # Every monitor: source, owner device, last fired
|
|
1254
1273
|
```
|
|
1255
1274
|
|
|
1256
|
-
Sources: a command's stdout (`--watch` / `--poll`), an HTTP endpoint (`--poll-http`), a file (`--watch-file`), or a fleet device's reachability + load (`--watch-device`). Push sources -- a signed webhook (`--on`) and a WebSocket (`--ws`) -- are accepted today and delivered through a receiver wired in a follow-up. Conditions: fire on any change (`--on-change`), on a regex (`--match`), or `--every` tick -- deduped by a native state store, so a monitor stays silent until something *actually* changes. Actions: `--run <agent>` (the event is injected into the prompt as `{event}`), `--routine`, `--notify`, or `--webhook-out`. Pin a monitor to one owner device with `--device` (exactly-once), or offload the action elsewhere with `--run-on`. Runs in the routines daemon; `agents monitors pause` / `resume` any time.
|
|
1275
|
+
Sources: a command's stdout (`--watch` / `--poll`), an HTTP endpoint (`--poll-http`), a file (`--watch-file`), or a fleet device's reachability + load (`--watch-device`). Push sources -- a signed webhook (`--on`) and a WebSocket (`--ws`) -- are accepted today and delivered through a receiver wired in a follow-up. Conditions: fire on any change (`--on-change`), on a regex (`--match`), or `--every` tick -- deduped by a native state store, so a monitor stays silent until something *actually* changes. Actions: `--run <agent>` (the event is injected into the prompt as `{event}`), `--routine`, `--notify`, or `--webhook-out`. A `--run`/`--routine` action can take `--postcondition '<cmd>'` — a shell command that must exit 0 after the agent settles, otherwise `agents monitors runs` records `no effect` rather than `ok`. Pin a monitor to one owner device with `--device` (exactly-once), or offload the action elsewhere with `--run-on`. Runs in the routines daemon; `agents monitors pause` / `resume` any time.
|
|
1257
1276
|
|
|
1258
1277
|
---
|
|
1259
1278
|
|
|
@@ -1270,8 +1289,14 @@ agents traces setup # provision the priv
|
|
|
1270
1289
|
agents artifacts share plan.html --slug fleet --expire 30d # → https://<base>/fleet
|
|
1271
1290
|
agents artifacts share plan.html --label "Q3 fleet plan" --meta kind=plan # human title + structured metadata
|
|
1272
1291
|
agents artifacts share plan.html --json # URL object for plan-render hooks
|
|
1273
|
-
agents artifacts share list --agent claude #
|
|
1292
|
+
agents artifacts share list --agent claude # public gallery, filterable
|
|
1293
|
+
agents artifacts share list --meta kind=plan # exact, repeatable metadata filters
|
|
1294
|
+
agents artifacts share list --all # include hidden unlisted/me/org pages
|
|
1295
|
+
agents artifacts share list --scope me # just the owner-only pages
|
|
1296
|
+
agents artifacts share edit fleet --label "Final fleet plan" --meta status=final
|
|
1274
1297
|
agents artifacts share revisions fleet # prior versions kept under a slug
|
|
1298
|
+
agents artifacts share visibility fleet me # re-scope a published page in place (public|unlisted|me|org)
|
|
1299
|
+
agents artifacts share open fleet # open your page signed in, so its in-page visibility control is live
|
|
1275
1300
|
agents artifacts share status # show the endpoint
|
|
1276
1301
|
agents artifacts unshare fleet # take a published link (+ its OG cover) down
|
|
1277
1302
|
```
|
|
@@ -1283,9 +1308,28 @@ Cloudflare account, bucket, or write token — and `share status` / `list` / `re
|
|
|
1283
1308
|
/ `unshare` talk to that same endpoint. The handle is the local-part of the signed-in
|
|
1284
1309
|
email (`muqsitnawaz@gmail.com` → `muqsitnawaz`); the page slug is readable plus a
|
|
1285
1310
|
short view-id. HTML is stored as one object: local images are inlined, `file://` TOC
|
|
1286
|
-
links become in-page hashes, so the published page is actually viewable.
|
|
1311
|
+
links become in-page hashes, so the published page is actually viewable. The managed
|
|
1312
|
+
Worker lazily renders and caches the branded 1200×630 Open Graph card at `<slug>.png`,
|
|
1313
|
+
so publishing from Linux does not require a local Chromium; BYO endpoints keep the
|
|
1314
|
+
local screenshot fallback. `--visibility unlisted` (hidden aliases
|
|
1287
1315
|
`--unlisted` / `--private`) is a capability URL: GET still works, the gallery hides it,
|
|
1288
|
-
and the Worker sends `X-Robots-Tag: noindex`.
|
|
1316
|
+
and the Worker sends `X-Robots-Tag: noindex`. `--visibility me` is visible only to
|
|
1317
|
+
you (the signed-in owner); `--visibility org` is visible to anyone at your email
|
|
1318
|
+
**domain** — derived from your own address, so it needs a **workspace** Google
|
|
1319
|
+
account and is refused on a public-inbox domain (`gmail.com`, `outlook.com`,
|
|
1320
|
+
`icloud.com`, …). Both need a Phoenix session and are identity-gated at read time (a
|
|
1321
|
+
stranger is redirected to sign in, then 404s). `share visibility <target> <level>`
|
|
1322
|
+
re-scopes an **already-published** page in place — the slug/URL is preserved and the
|
|
1323
|
+
body is untouched (a metadata-only change, like `share edit`, so no revision) — so you
|
|
1324
|
+
can promote a draft to `public` or pull a link back to `me`/`org` without re-publishing
|
|
1325
|
+
(`me`/`org` need a Phoenix session; `org` needs a workspace domain). The served page
|
|
1326
|
+
also carries an **in-page visibility control** — a chip you can switch right on the page
|
|
1327
|
+
— but it is interactive only for the signed-in owner, and a plain link has no login;
|
|
1328
|
+
`share open <target>` mints a short-lived, single-use login ticket and opens your page
|
|
1329
|
+
with it so the chip becomes a live dropdown. Sign-in is a
|
|
1330
|
+
single **Phoenix ID** (Google-only device-code OAuth, `agents auth login`) — see
|
|
1331
|
+
[`docs/share.md`](cli/docs/share.md) for the full identity + visibility model.
|
|
1332
|
+
**BYO Cloudflare** remains: `setup` reads
|
|
1289
1333
|
a Cloudflare API token from your `cloudflare.com` secrets bundle (or `--token`), creates
|
|
1290
1334
|
an R2 bucket, uploads a tiny Worker, and enables the free `*.workers.dev` subdomain (or
|
|
1291
1335
|
maps `--domain share.example.com` when the token owns the zone). Writes are bearer-gated
|
|
@@ -1304,8 +1348,14 @@ captured automatically from the exec env and git — never invented, only sent w
|
|
|
1304
1348
|
present. `--label`/`--title` names a share (else one is derived from the HTML
|
|
1305
1349
|
`<title>`, frontmatter, or filename, with a nudge — never a blocking prompt); `--meta
|
|
1306
1350
|
key=value` attaches structured metadata (`kind`, `project`, `ticket`, `status`, ...).
|
|
1307
|
-
`agents artifacts share list --agent <name> | --session <id> | --label-contains <substr
|
|
1308
|
-
|
|
1351
|
+
`agents artifacts share list --agent <name> | --session <id> | --label-contains <substr>
|
|
1352
|
+
| --meta <key=value>` filters by provenance, title, or exact structured metadata, so
|
|
1353
|
+
the listing is a real "what have I shared" gallery, not just slugs. By default it mirrors
|
|
1354
|
+
the public gallery; `--scope unlisted|me|org` (or `--all`) includes your hidden pages and
|
|
1355
|
+
marks each row with its visibility so you can tell public from private at a glance.
|
|
1356
|
+
`agents artifacts share edit <slug>` changes only the label/arbitrary metadata in place:
|
|
1357
|
+
the URL, exact body, HTTP metadata, publication time, visibility, expiry, provenance,
|
|
1358
|
+
cover, and revision history stay unchanged.
|
|
1309
1359
|
Republishing an existing slug keeps the prior version as a revision by default
|
|
1310
1360
|
(`--no-revision` to skip); `agents artifacts share revisions <slug>` shows the retained
|
|
1311
1361
|
history, newest first.
|