@phnx-labs/agents-cli 1.22.24 → 1.22.26
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 +350 -1
- package/README.md +31 -6
- package/dist/bin/agents +0 -0
- package/dist/browser.js +14 -4
- package/dist/commands/apply.js +52 -8
- package/dist/commands/browser.js +35 -0
- package/dist/commands/cloud.js +9 -5
- package/dist/commands/doctor.d.ts +24 -0
- package/dist/commands/doctor.js +108 -9
- package/dist/commands/exec.js +19 -16
- package/dist/commands/feed.d.ts +5 -0
- package/dist/commands/feed.js +21 -1
- package/dist/commands/focus.js +2 -2
- package/dist/commands/insights.d.ts +25 -19
- package/dist/commands/insights.js +107 -33
- package/dist/commands/menubar.js +8 -0
- package/dist/commands/reconnect.d.ts +46 -0
- package/dist/commands/reconnect.js +109 -0
- package/dist/commands/routines.d.ts +3 -0
- package/dist/commands/routines.js +72 -49
- package/dist/commands/run-cloud.js +1 -1
- package/dist/commands/secrets.d.ts +2 -8
- package/dist/commands/secrets.js +29 -105
- package/dist/commands/sessions-browser.d.ts +1 -1
- package/dist/commands/sessions-browser.js +27 -7
- package/dist/commands/sessions-resume.js +3 -2
- package/dist/commands/sessions.d.ts +13 -1
- package/dist/commands/sessions.js +28 -2
- package/dist/commands/setup-secrets.d.ts +1 -0
- package/dist/commands/setup-secrets.js +1 -1
- package/dist/commands/setup-watchdog.js +5 -10
- package/dist/commands/setup.d.ts +26 -3
- package/dist/commands/setup.js +106 -47
- package/dist/commands/teams.d.ts +6 -0
- package/dist/commands/teams.js +46 -2
- package/dist/commands/trends.d.ts +8 -0
- package/dist/commands/trends.js +10 -156
- package/dist/commands/watchdog.d.ts +3 -4
- package/dist/commands/watchdog.js +26 -66
- package/dist/index.js +37 -2
- package/dist/lib/agents.d.ts +11 -0
- package/dist/lib/agents.js +155 -23
- package/dist/lib/analytics/dashboard.d.ts +10 -6
- package/dist/lib/analytics/dashboard.js +6 -4
- package/dist/lib/analytics/mix-commands.d.ts +53 -0
- package/dist/lib/analytics/mix-commands.js +229 -0
- package/dist/lib/analytics/recipes.d.ts +19 -14
- package/dist/lib/analytics/recipes.js +4 -2
- package/dist/lib/browser/ipc.d.ts +26 -0
- package/dist/lib/browser/ipc.js +139 -24
- package/dist/lib/browser/profiles.d.ts +11 -0
- package/dist/lib/browser/profiles.js +1 -1
- package/dist/lib/browser/stream.d.ts +14 -0
- package/dist/lib/browser/stream.js +71 -0
- package/dist/lib/channels/owner-sink.d.ts +27 -0
- package/dist/lib/channels/owner-sink.js +93 -0
- package/dist/lib/cloud/cursor.d.ts +79 -0
- package/dist/lib/cloud/cursor.js +228 -0
- package/dist/lib/cloud/registry.js +2 -0
- package/dist/lib/cloud/types.d.ts +7 -2
- package/dist/lib/cloud/types.js +14 -0
- package/dist/lib/crabbox/cli.d.ts +2 -2
- package/dist/lib/crabbox/config.d.ts +7 -8
- package/dist/lib/crabbox/config.js +14 -14
- package/dist/lib/crabbox/lease.d.ts +11 -4
- package/dist/lib/crabbox/lease.js +40 -8
- package/dist/lib/crabbox/setup-copy.d.ts +5 -0
- package/dist/lib/crabbox/setup-copy.js +17 -1
- package/dist/lib/daemon.js +27 -1
- package/dist/lib/device-config.js +7 -0
- package/dist/lib/devices/doctor-findings.d.ts +13 -1
- package/dist/lib/devices/doctor-findings.js +73 -2
- package/dist/lib/events.d.ts +9 -0
- package/dist/lib/events.js +58 -0
- package/dist/lib/exec.d.ts +3 -3
- package/dist/lib/exec.js +24 -10
- package/dist/lib/feed-outcome.d.ts +3 -0
- package/dist/lib/feed-outcome.js +18 -10
- package/dist/lib/feed.d.ts +4 -0
- package/dist/lib/fleet/apply.d.ts +59 -3
- package/dist/lib/fleet/apply.js +183 -6
- package/dist/lib/fleet/types.d.ts +21 -2
- package/dist/lib/hooks/cache.js +15 -0
- package/dist/lib/hosts/passthrough.d.ts +44 -0
- package/dist/lib/hosts/passthrough.js +84 -12
- package/dist/lib/hosts/ready.d.ts +2 -0
- package/dist/lib/hosts/ready.js +10 -1
- package/dist/lib/hosts/reconnect.d.ts +14 -12
- package/dist/lib/hosts/reconnect.js +41 -40
- package/dist/lib/mcp.js +5 -1
- package/dist/lib/menubar/MenubarHelper.app/Contents/CodeResources +0 -0
- package/dist/lib/menubar/MenubarHelper.app/Contents/MacOS/MenubarHelper +0 -0
- package/dist/lib/menubar/snapshot.d.ts +15 -0
- package/dist/lib/menubar/snapshot.js +40 -0
- package/dist/lib/plugins.js +13 -1
- package/dist/lib/resources/mcp.js +3 -0
- package/dist/lib/routine-process-cleanup.d.ts +9 -0
- package/dist/lib/routine-process-cleanup.js +73 -0
- package/dist/lib/routines.js +14 -2
- package/dist/lib/runner.d.ts +0 -3
- package/dist/lib/runner.js +6 -19
- package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
- package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
- package/dist/lib/secrets/bundles.js +1 -20
- package/dist/lib/secrets/filestore.d.ts +2 -0
- package/dist/lib/secrets/filestore.js +13 -0
- package/dist/lib/secrets/push.d.ts +94 -0
- package/dist/lib/secrets/push.js +145 -0
- package/dist/lib/secrets/rc-hygiene.d.ts +14 -0
- package/dist/lib/secrets/rc-hygiene.js +14 -1
- package/dist/lib/secrets/reaper.d.ts +15 -1
- package/dist/lib/secrets/reaper.js +30 -3
- package/dist/lib/session/active.d.ts +4 -0
- package/dist/lib/session/db.d.ts +21 -3
- package/dist/lib/session/db.js +229 -15
- package/dist/lib/session/discover.d.ts +1 -0
- package/dist/lib/session/discover.js +115 -19
- package/dist/lib/session/insights.d.ts +18 -0
- package/dist/lib/session/insights.js +143 -1
- package/dist/lib/session/remote-list.d.ts +2 -0
- package/dist/lib/session/remote-list.js +1 -0
- package/dist/lib/session/session-cache.d.ts +4 -4
- package/dist/lib/session/session-cache.js +4 -4
- package/dist/lib/session/tool-index.js +133 -22
- package/dist/lib/session/tool-store.d.ts +26 -2
- package/dist/lib/session/tool-store.js +36 -17
- package/dist/lib/shims.js +21 -1
- package/dist/lib/signin-badge.js +2 -0
- package/dist/lib/ssh-exec.js +8 -2
- package/dist/lib/startup/command-registry.d.ts +16 -0
- package/dist/lib/startup/command-registry.js +46 -0
- package/dist/lib/teams/agents.d.ts +13 -0
- package/dist/lib/teams/agents.js +76 -8
- package/dist/lib/teams/parsers.d.ts +1 -1
- package/dist/lib/teams/placement-probe.d.ts +21 -0
- package/dist/lib/teams/placement-probe.js +135 -0
- package/dist/lib/teams/scheduler.d.ts +74 -1
- package/dist/lib/teams/scheduler.js +187 -10
- package/dist/lib/types.d.ts +1 -1
- package/dist/lib/versions.js +16 -1
- package/dist/lib/watchdog/service.d.ts +17 -0
- package/dist/lib/watchdog/service.js +39 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,356 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.22.26
|
|
4
|
+
|
|
5
|
+
- Make bare `agents setup` a re-runnable onboarding hub with live capability status and direct access to browser, computer, secrets, fleet, share, watchdog, and preference wizards.
|
|
6
|
+
|
|
7
|
+
- **`agents apply --provision-secrets` pushes the manifest's declared secrets
|
|
8
|
+
bundles to each device, instead of only printing a reminder (RUSH-1968).** This
|
|
9
|
+
gap is a direct cause of the ticket: an operator who needed secrets on a worker
|
|
10
|
+
box had no supported path — `apply` said "recreate manually" and nothing else —
|
|
11
|
+
so they hand-exported the file store's master key across the fleet. The
|
|
12
|
+
provisioning primitive now exists, and `apply` runs it as a fifth reconcile
|
|
13
|
+
phase, last, because it is the most sensitive mutation `apply` performs.
|
|
14
|
+
|
|
15
|
+
It is **off by default** and is a **flag, not a manifest field**: `agents.yaml`
|
|
16
|
+
is shared, so a file-level default would mean someone else's `apply -y` silently
|
|
17
|
+
ships credential values. Three gates, and every refusal still prints a
|
|
18
|
+
`needs-secret` reminder so a skipped device is never silent — the flag must be
|
|
19
|
+
set, the device must be reachable, and its host key must be **pinned** (the same
|
|
20
|
+
bar `agents exec --copy-creds` sets, EXEC-34).
|
|
21
|
+
|
|
22
|
+
**Backend follows the platform: `file` on Linux, `keychain` on macOS/Windows.**
|
|
23
|
+
That is the load-bearing default — a headless Linux box has no keychain and its
|
|
24
|
+
file store auto-provisions its OWN machine-local key, so each device gets an
|
|
25
|
+
unshared at-rest key and **no passphrase is forwarded**. That is the direct
|
|
26
|
+
alternative to the fleet-wide shared secret this ticket is about.
|
|
27
|
+
|
|
28
|
+
With provisioning on, `apply` runs one extra `agents secrets list --json` per
|
|
29
|
+
device (metadata only — names and timestamps, never values) and skips a bundle
|
|
30
|
+
the device already has; without that, every run re-resolves the bundle locally
|
|
31
|
+
and a resolve can prompt for Touch ID, so a converged fleet would nag on every
|
|
32
|
+
apply. It compares presence, not content — `--force` re-pushes regardless. The
|
|
33
|
+
`--plan` matrix gains a `secrets` column, shown only when the manifest declares
|
|
34
|
+
bundles, and names the flag when the capability is available but off. Source:
|
|
35
|
+
`apps/cli/src/lib/secrets/push.ts` (extracted from the `export --host` action so
|
|
36
|
+
a lib no longer needs a command module), `apps/cli/src/lib/fleet/apply.ts`,
|
|
37
|
+
`apps/cli/src/commands/apply.ts`.
|
|
38
|
+
|
|
39
|
+
- **`agents teams` auto-scheduling is health-, harness-, and load-aware, and fails loud when no pool device can run the agent (RUSH-2002).** Placing an unpinned teammate onto a `--devices` pool used to be a pure roster count that could land it on an unreachable box, an overloaded one, or one where its agent isn't installed. `teams start` now probes the pool once (reachability + load from the same snapshot `agents devices` shows, plus whether the teammate's agent is installed there) and: excludes unreachable / overloaded (`loaded` headroom) / `agents.max-concurrent`-capped / not-installed devices, then ranks the survivors by agent installed + signed in, then lower load, then fewer running teammates. If no pool device can run a pending teammate's agent, `teams start` fails loud — `No device in the team pool can run claude@2.1.112. Run 'agents devices ping' to see which devices have the agent installed + signed in.` — instead of stranding the teammate or silently falling back to a local run; `--force` downgrades it to a warning. A probe that could not reach the pool does not trigger the failure (no false positives). The pick stays pure and fully unit-tested; `teams add` is unchanged (no probe on the add path). Source: `apps/cli/src/lib/teams/scheduler.ts`, `apps/cli/src/lib/teams/placement-probe.ts`, `apps/cli/src/lib/teams/agents.ts`, `apps/cli/src/commands/teams.ts`.
|
|
40
|
+
|
|
41
|
+
- **`agents reconnect [session-id]` re-enters a dropped remote agent terminal, and the auto-reconnect no longer dead-ends on a dead pane (RUSH-2085).** When the network dropped during `agents run --device <box>` and the peer's tmux pane was gone by the time the link came back, the reattach ran `agents sessions focus <id> --local --attach-only`, which hard-failed with `No live session matching …` and dropped the user at a bare shell with the id scrolled off screen. Two fixes: the auto-reconnect reattach now runs `agents sessions focus <id> --local` (no `--attach-only`), so a surviving pane is joined and a dead one RESUMES in place instead of dead-ending; and a new `agents reconnect` (also `agents sessions reconnect`) is the manual companion for after the auto-loop gave up or a VS Code terminal tab closed — attach the live pane if it survived, else resume the session. With no id it targets the most recent session started from the current directory (the terminal that most likely just dropped), not the full fleet picker. The exhausted / remote-exit notices now print the exact `agents reconnect <id>` command instead of a raw id and a shell prompt. Source: `apps/cli/src/lib/hosts/reconnect.ts`, `apps/cli/src/commands/reconnect.ts`.
|
|
42
|
+
|
|
43
|
+
- **`agents routines add` now rejects an agent the local daemon can't fire, at add time (RUSH-2102).** `--agent opencode` (or any real, installable agent outside the daemon's `AGENT_COMMANDS` table — currently `claude`, `codex`, `gemini`, `cursor`, `kimi`, `droid`, `muse`) used to pass `validateJob` because it only checked the agent against the full agent registry, not the daemon-runnable subset — the routine was written to disk and only failed once the scheduler fired it (`Unsupported agent for daemon jobs: opencode`). `validateJob` now rejects it immediately for the default local placement, with an error naming the supported agents. Routines placed with `hostStrategy: host`/`fleet`/`cloud` are unaffected — those dispatch through `agents run`/a cloud provider, not this table, so a wider agent set is legitimately supported there. Source: `apps/cli/src/lib/routines.ts`, `apps/cli/src/lib/agents.ts`.
|
|
44
|
+
|
|
45
|
+
- **OpenClaw's capability table no longer claims `hooks: true` with zero hooks
|
|
46
|
+
ever installed (RUSH-2122).** `registerHooksToSettings` has no `openclaw`
|
|
47
|
+
branch and silently returned `{ registered: [], errors: [] }` for it, so
|
|
48
|
+
`agents sync openclaw` reported success while installing nothing, and
|
|
49
|
+
`agents doctor` treated the agent as hooks-capable with no way to detect the
|
|
50
|
+
gap. OpenClaw only exposes a fixed set of internal, named hooks (e.g.
|
|
51
|
+
`boot-md`, which runs `BOOT.md` on gateway restart) — there is no general
|
|
52
|
+
event->shell-command registration surface an agents-cli `hooks.yaml`
|
|
53
|
+
manifest could target — so `capabilities.hooks` and `supportsHooks` now read
|
|
54
|
+
`false`, matching what the CLI can actually do. A new completeness test
|
|
55
|
+
(`hooks-capability-completeness.test.ts`) pins every `hooks: true` agent to a
|
|
56
|
+
real branch in `registerHooksToSettings` so a capability flip can never ship
|
|
57
|
+
again without a registrar behind it. Source: `apps/cli/src/lib/agents.ts`,
|
|
58
|
+
`apps/cli/src/lib/hooks-capability-completeness.test.ts`.
|
|
59
|
+
|
|
60
|
+
- **`agents browser stream` keeps one Node process and browser-daemon IPC socket warm across repeated actions (RUSH-2149).** The newline-delimited JSON interface sends every request through the existing browser daemon and its cached CDP connection, so screenshot/click loops no longer need a fresh `agents` process or IPC connection per action. `--task` (or `AGENTS_BROWSER_TASK`) supplies the default task, a `start` response becomes the default for later lines, and malformed input returns an error response without ending the stream. Fleet-remote `start` requests enforce the same device-local `browser remote-control` consent gate as the ordinary command. Source: `apps/cli/src/lib/browser/ipc.ts`, `apps/cli/src/lib/browser/stream.ts`, `apps/cli/src/commands/browser.ts`.
|
|
61
|
+
|
|
62
|
+
- **`agents sessions backfill tools` reads a growing transcript incrementally, and
|
|
63
|
+
the search index compacts itself (RUSH-2208).** Incremental discovery already
|
|
64
|
+
appended tool calls for a Claude/Codex session that grew; the backfill did not.
|
|
65
|
+
Every `ensureToolIndex` pass re-read the transcript from byte 0 and deleted the
|
|
66
|
+
session's stored evidence to rewrite it, so a session backfilled N times cost N
|
|
67
|
+
full parses of an ever-larger file — measured on a 4.5 MiB, 4000-call transcript
|
|
68
|
+
that grew by 20 calls: 344 ms and 4020 calls re-parsed, now 12 ms and 20 calls.
|
|
69
|
+
Schema v36 adds a resume point to `tool_scan_ledger` (`parsed_offset`, the byte
|
|
70
|
+
just past the last complete record consumed, and `parser_state`, the collector
|
|
71
|
+
snapshot at that offset), so a transcript that only grew is read from where the
|
|
72
|
+
last pass stopped and merged into what is already stored; the batch byte budget
|
|
73
|
+
now counts the bytes a pass actually reads rather than the file's size, so one
|
|
74
|
+
bounded batch covers far more growing sessions. A different extractor version, a
|
|
75
|
+
mismatched ledger path, a file shorter than what was parsed, or an unreadable
|
|
76
|
+
snapshot still re-reads the whole file. Two related fixes ride along:
|
|
77
|
+
`tool_call_text` rows are addressed by the `rowid` of the call they describe
|
|
78
|
+
instead of the UNINDEXED `call_key`, which made every delete a full scan of the
|
|
79
|
+
FTS index, and the scan path now runs a bounded, threshold-gated FTS `'merge'`
|
|
80
|
+
after each batch of writes, so index health no longer depends on someone running
|
|
81
|
+
`agents sessions optimize` by hand. Source: `apps/cli/src/lib/session/tool-index.ts`,
|
|
82
|
+
`apps/cli/src/lib/session/tool-store.ts`, `apps/cli/src/lib/session/db.ts`.
|
|
83
|
+
|
|
84
|
+
- **OpenCode session scans re-index only the sessions that changed (RUSH-2210).** OpenCode
|
|
85
|
+
keeps every session in one shared `opencode.db`, and the scanner stamped each session
|
|
86
|
+
with that whole file's mtime/size. Any write to any session therefore invalidated every
|
|
87
|
+
indexed session, so a single new turn re-emitted up to 1000 sessions — and the indexer
|
|
88
|
+
re-opened `opencode.db` once per re-emitted session to re-parse a transcript that had
|
|
89
|
+
not moved. Each session is now stamped with its own newest write time (across its
|
|
90
|
+
`session` row, its messages, and its parts) and the byte length of its message + part
|
|
91
|
+
payloads, so an unchanged session is skipped; the file-level stat stays only as the
|
|
92
|
+
cheap "nothing changed at all" short-circuit, and a scan opens `opencode.db` once
|
|
93
|
+
instead of once per session. The stamp deliberately does not rely on
|
|
94
|
+
`session.time_updated` alone, which real databases leave hours behind the session's
|
|
95
|
+
newest part. A side effect: `sessions.file_size` for an OpenCode row is now that
|
|
96
|
+
session's payload size instead of the whole database's size, so the tool-backfill byte
|
|
97
|
+
budget and its 16 MiB in-memory parser cap finally reflect the real cost of parsing
|
|
98
|
+
that one session. Source: `apps/cli/src/lib/session/discover.ts`.
|
|
99
|
+
|
|
100
|
+
- **Session query hot path is indexable again (RUSH-2211).** The default `agents
|
|
101
|
+
sessions` listing sort (`ORDER BY IFNULL(last_activity, timestamp) DESC`)
|
|
102
|
+
wrapped the sort column in `IFNULL()`, which defeats `idx_sessions_last_activity`
|
|
103
|
+
and forces a full table sort on every list/resume query; a new migration
|
|
104
|
+
backfills `last_activity` so it's unconditionally `NOT NULL` and the sort now
|
|
105
|
+
runs on the bare column (`EXPLAIN QUERY PLAN` confirms `USING INDEX
|
|
106
|
+
idx_sessions_last_activity`). The post-query existence check now batches
|
|
107
|
+
`fs.existsSync` per directory instead of one stat syscall per row — real
|
|
108
|
+
transcript trees put many sessions in one project directory, so this collapses
|
|
109
|
+
thousands of stats into a handful of `readdirSync` calls with the same result.
|
|
110
|
+
Interactive label search (`ftsSearch`) no longer runs a leading-wildcard
|
|
111
|
+
`LOWER(label) LIKE '%q%'` scan of the whole `sessions` table on every keystroke;
|
|
112
|
+
it now queries the already-indexed FTS5 `label` column. Source:
|
|
113
|
+
`apps/cli/src/lib/session/db.ts`.
|
|
114
|
+
|
|
115
|
+
- **The standalone `browser` binary now routes `--host`/`--device` (RUSH-2214).** `browser start --host <box>` dispatches to the remote over SSH, exactly like `agents browser start --host <box>` already did — previously the standalone bin dropped the flag with `unknown option '--host'` because it never entered the top-level router. A self-named or absent host still runs locally. Source: `apps/cli/src/browser.ts`, `apps/cli/src/lib/hosts/passthrough.ts`.
|
|
116
|
+
|
|
117
|
+
- **`agents run --device` no longer reports a host as unreachable when the SSH probe times out (RUSH-2249).** The ready probe (`readyProbe` in `hosts/ready.ts`) now disables SSH multiplexing so a stale control socket cannot hang the local client, and it checks `r.timedOut` before parsing stdout — a slow login shell (nvm/sdkman init, cold node startup) producing an empty stdout was silently treated as "not reachable". A timeout now surfaces a distinct, actionable error that names the cause and suggests `agents ssh <host> agents view` to confirm manually, rather than the misleading "not reachable over SSH" message. Source: `apps/cli/src/lib/hosts/ready.ts`.
|
|
118
|
+
|
|
119
|
+
- **`agents teams start` nudges the operator toward feed milestones (RUSH-2250).**
|
|
120
|
+
After launching teammates, `teams start` now prints a one-line tip — teammates are
|
|
121
|
+
briefed to post IMPORTANT milestones to the feed (watch them with
|
|
122
|
+
`agents feed timeline`), and team progress is watched with `agents teams status
|
|
123
|
+
<team>`. Print-only in both the single-wave and `--watch` paths (suppressed under
|
|
124
|
+
`--json`); no engine behavior changes. Pairs with the `.agents-system` guidance
|
|
125
|
+
that instructs teammates to post those milestones. Source:
|
|
126
|
+
`apps/cli/src/commands/teams.ts`.
|
|
127
|
+
|
|
128
|
+
- **`secrets list` no longer skips every biometry-ACL'd item, so `hold`/`always`-policy
|
|
129
|
+
bundles are readable again (RUSH-2251).** A regression first shipped in v1.22.10 added
|
|
130
|
+
`kSecUseAuthenticationUI: kSecUseAuthenticationUISkip` to the keychain helper's `list`
|
|
131
|
+
data-protection pass. `UISkip` makes `SecItemCopyMatching` silently omit every item
|
|
132
|
+
protected by a biometry access control — which is exactly the value items `set` writes —
|
|
133
|
+
so enumeration returned only the no-ACL metadata and `never`-policy items. Every consumer
|
|
134
|
+
that builds its keychain read set from that enumeration (`secrets exec`/`get`/`unlock`/
|
|
135
|
+
`view --reveal`/`export`, `agents run --secrets`, `ssh`, `browser`, `share`) then reported
|
|
136
|
+
the real secrets as `stored item '…' not found`, and `unlock` could not even warm the
|
|
137
|
+
broker to work around it. The DP pass is now attributes-only with **no** `kSecUseAuthenticationUI`
|
|
138
|
+
key: `kSecReturnAttributes` without `kSecReturnData` never evaluates the ACL, so it
|
|
139
|
+
neither prompts for Touch ID nor filters the ACL'd items out — restoring the design the
|
|
140
|
+
code comment already described. The RUSH-2233 timeout bound on that pass is unchanged.
|
|
141
|
+
Source: `apps/cli/src/lib/secrets/keychain-helper.swift`.
|
|
142
|
+
|
|
143
|
+
- **Hook-cache background refresh recovers from an orphaned single-flight lock (RUSH-2259).**
|
|
144
|
+
The stale-while-revalidate lock (`<cache>.bg.lck`) was only released by the
|
|
145
|
+
background refresh's `EXIT` trap, so a hard kill (SIGKILL, OOM, reboot) that
|
|
146
|
+
skipped the trap orphaned the dir and every future refresh's `mkdir` failed —
|
|
147
|
+
permanently stalling background refresh while stale cache was served forever.
|
|
148
|
+
The shim now reclaims a lock older than a 5-minute TTL before acquiring, so a
|
|
149
|
+
dead lock self-heals on the next fire. Source: `apps/cli/src/lib/hooks/cache.ts`.
|
|
150
|
+
|
|
151
|
+
- **`agents doctor` now fails loud when this box cannot reach the owner-delivery lane (RUSH-2262).** The feed/notify owner lane (`agents notify`, `agents feed post --level important` / `--blocked`) delivers over the rush-backed owner channel (iMessage), which only works from a context that has `rush` on PATH and can read its keychain-bound session — so a headless Linux fleet box (no rush) or a non-GUI SSH session on a mac (login keychain locked) silently could not escalate a blocked agent, surfacing only as an after-the-fact `owner failed: …` line. `agents doctor` had no signal for it. A new critical finding, `owner-sink-unreachable`, probes the same transport from the same context doctor runs in (`which rush` + `rush whoami`, never `~/.rush/user.yaml`, since the token is a keychain item) and reports `owner → unreachable: rush CLI not on this box's PATH` / `rush has no usable session here` with the fix. It fires only when owner delivery is configured for the fleet, so an un-opted-in box is never flagged; `agents notify --dry-run` is not this check (it short-circuits before the `which rush` preflight and reports success even where rush is absent). Source: `apps/cli/src/lib/channels/owner-sink.ts`, `apps/cli/src/lib/devices/doctor-findings.ts`, `apps/cli/src/commands/doctor.ts`.
|
|
152
|
+
|
|
153
|
+
- **`agents insights` owns counter mix; `agents trends` is a deprecated alias.** The
|
|
154
|
+
former top-level `trends` tree (harness/model mix, tools-per-session, token ratios,
|
|
155
|
+
secrets/browser recipes, raw usage query) now lives under `agents insights mix` and
|
|
156
|
+
`agents insights <recipe>` / `query` / `recipes`. Bare `agents insights` remains the
|
|
157
|
+
behavioural report (transcript content, account split). `agents trends` still works
|
|
158
|
+
but prints one deprecation line and runs the same mix tree — no second implementation.
|
|
159
|
+
**Why:** two peer "analytics" verbs (`insights` + `trends`) taught agents and humans
|
|
160
|
+
to guess; one verb, two engines (content vs counters). Latency stays on `agents perf`;
|
|
161
|
+
quota on `agents usage`; skill/slash popularity on `agents sessions stats`. Source:
|
|
162
|
+
`apps/cli/src/lib/analytics/mix-commands.ts`, `commands/insights.ts`,
|
|
163
|
+
`commands/trends.ts`, `docs/06-observability.md`.
|
|
164
|
+
|
|
165
|
+
- **The keychain reaper no longer kills the auto-lock-on-sleep watcher (RUSH-2232 follow-up).**
|
|
166
|
+
The reaper (shipped in 1.22.23) classified a process as a reap target purely by the
|
|
167
|
+
helper binary path, which also matches the broker's deliberately long-lived
|
|
168
|
+
`watch-lock` watcher — a healthy child of the live daemon that wipes the in-memory
|
|
169
|
+
secret store on sleep. Its class-(b) rule ("helper child of a live parent, older than
|
|
170
|
+
90s") therefore killed the watcher on its second sweep (~10 min after the daemon
|
|
171
|
+
started hosting the broker), silently disabling auto-lock-on-sleep. Reap-eligibility
|
|
172
|
+
now matches the full command line and excludes the `watch-lock` verb, so only the
|
|
173
|
+
short-lived keychain reads/writes a wedged `coreauthd` can hang are ever reaped.
|
|
174
|
+
Source: `apps/cli/src/lib/secrets/reaper.ts` (`isReapableHelperCommand`).
|
|
175
|
+
|
|
176
|
+
## 1.22.25
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
issue: 2108
|
|
180
|
+
type: fixed
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
`agents sessions focus ... --active` now excludes closed and crashed registry rows; explicit lifecycle filters such as `--closed` and `--crashed` still select them. Per-device `latest` / `oldest` selectors also wait for the peer's filtered index result instead of widening to live rows whose version is unknown.
|
|
184
|
+
|
|
185
|
+
- **`agents doctor` now reports the file-store master key when it is live in the
|
|
186
|
+
process environment, not just when it is exported from a shell rc file
|
|
187
|
+
(RUSH-1968).** `rc-hygiene.ts` scans FILES, which leaves a real hole: a value
|
|
188
|
+
inherited by a long-lived process outlives the rc line that set it, so an operator
|
|
189
|
+
who deletes `~/.zshenv:8` gets a clean `rc-secret-export` while every shell, editor
|
|
190
|
+
and agent started before the edit still carries the key and hands it to everything
|
|
191
|
+
they spawn. Confirmed on `yosemite-s1`, which has zero rc exports and still had the
|
|
192
|
+
value in its environment. The new `env-secret-export` warning names that state and
|
|
193
|
+
says the deletion is not sufficient; like every other finding it reports only that
|
|
194
|
+
the variable is set, never its value. Expected inside a release sign context
|
|
195
|
+
(`headless-sign-context.sh` sets it deliberately), which the message says so an
|
|
196
|
+
operator on the home base does not chase it. Source:
|
|
197
|
+
`apps/cli/src/lib/secrets/rc-hygiene.ts` (`masterPassphraseInEnv`),
|
|
198
|
+
`apps/cli/src/lib/devices/doctor-findings.ts`, `apps/cli/src/commands/doctor.ts`.
|
|
199
|
+
|
|
200
|
+
- **`agents doctor --devices` now reports a remote box's secret hygiene, and its
|
|
201
|
+
inventory probe no longer times out on a slow box (RUSH-1968).** The fan-out ran
|
|
202
|
+
each remote's own `doctor --json` but parsed only `.fleet`, discarding the
|
|
203
|
+
`findings` the remote had already computed — so a leaking box read as clean from
|
|
204
|
+
anywhere but itself. The remote's `rc-secret-export` / `env-secret-export` rows
|
|
205
|
+
now ride back, but the remote contributes exactly one thing: the **kind**. Severity,
|
|
206
|
+
message and remediation are generated locally, and `device` is overwritten with the
|
|
207
|
+
name that was dialled. Each of those matters separately — a remediation is a command
|
|
208
|
+
a human copies and runs, a message is the one place a secret value could re-enter a
|
|
209
|
+
readout that otherwise never prints one, a severity decides the CRITICAL section, and
|
|
210
|
+
a device name decides which box gets blamed. The cost is detail: the fleet row names
|
|
211
|
+
the box and the kind, and says to run `agents doctor` there for the file and line.
|
|
212
|
+
Only those two kinds forward — sign-in and divergence rows are recomputed centrally
|
|
213
|
+
and would otherwise double.
|
|
214
|
+
|
|
215
|
+
Separately, the probe's 30s timeout was below the real cost of the command it
|
|
216
|
+
runs — `doctor --json` measures 57s on `yosemite-m0` and 136s on an idle box — so
|
|
217
|
+
every slow device silently contributed nothing at all: no inventory, no sign-in,
|
|
218
|
+
no divergence. Raised to 180s, matching `ChildProcess.doctorTimeout`, which was set
|
|
219
|
+
to 180 for this same command for this same reason. Source:
|
|
220
|
+
`apps/cli/src/commands/doctor.ts` (`asRemoteSecretFindings`, `probeFleetInventory`).
|
|
221
|
+
|
|
222
|
+
- **Feed and menu-bar session counts now use the `agents sessions --active` lifecycle model (RUSH-1993).**
|
|
223
|
+
Feed outcome headers count distinct mailbox agents in every state, so repeated
|
|
224
|
+
open blocks from one agent cannot make `needs you` exceed `agents`. Feed rows
|
|
225
|
+
replace generic `terminal` with a known host app and label routine-spawned
|
|
226
|
+
sessions as `routine:<name>`. The menu-bar snapshot backfills the same routine
|
|
227
|
+
metadata as active-session JSON and renders the full canonical status set
|
|
228
|
+
(`working`, `waiting`, `idle`, `queued`, `orphan`, `crashed`, `closed`,
|
|
229
|
+
`abandoned`, `unknown`) without reclassifying warm rows from attention files.
|
|
230
|
+
Source: `apps/cli/src/commands/feed.ts`, `apps/cli/src/commands/sessions.ts`,
|
|
231
|
+
`apps/cli/src/lib/feed-outcome.ts`, `apps/cli/src/lib/menubar/snapshot.ts`,
|
|
232
|
+
`apps/cli/menubar/Sources/MenubarHelper/{LocalState,StatusItemController}.swift`.
|
|
233
|
+
|
|
234
|
+
- **A typo'd command with `--host` said the opposite of the truth (RUSH-2022).** The
|
|
235
|
+
`--host`/`--device` router runs before commander parses, so `agents session resume
|
|
236
|
+
--host <box>` (one letter off `sessions`, which *does* accept `--host`) reported
|
|
237
|
+
`` `agents session` does not support --host/--device `` — a true statement about a
|
|
238
|
+
command nobody typed. Unknown names now fall through to `unknown command '<name>'`
|
|
239
|
+
with a did-you-mean, and the spellcheck can suggest the lazily-registered groups
|
|
240
|
+
(`sessions`/`teams`/`cloud`/…) it previously could not see. A real command with no
|
|
241
|
+
remote semantics still gets the flag-support error. Source:
|
|
242
|
+
`apps/cli/src/lib/hosts/passthrough.ts`, `apps/cli/src/lib/startup/command-registry.ts`.
|
|
243
|
+
|
|
244
|
+
- **`agents publish` is in the lazy command table.** `commands/packages.ts` registers it
|
|
245
|
+
at top level but the registry did not list it, so it only resolved through the
|
|
246
|
+
unknown-command fallback that loads the whole command tree. Found by the new test
|
|
247
|
+
that pins the command-name set against the real tree.
|
|
248
|
+
|
|
249
|
+
- **A mistyped command keeps its `--host`.** The distance-1 auto-correct now re-checks
|
|
250
|
+
routing after correcting the name, so `agents docto --host <box>` corrects to
|
|
251
|
+
`doctor` **and actually routes to `<box>`** — previously the corrected command
|
|
252
|
+
re-parsed locally with a `--host` it silently dropped (a regression caught in review:
|
|
253
|
+
it used to fail loudly with the wrong message, corrected-but-unrouted made it fail
|
|
254
|
+
silently instead). `apps/cli/src/index.ts`.
|
|
255
|
+
|
|
256
|
+
- **Cursor now supports `--mode plan` headless and interactive (RUSH-2101).** The
|
|
257
|
+
capability registry previously listed only `edit` and `skip`, so `agents run cursor --mode plan`
|
|
258
|
+
and routine jobs silently degraded to writable `edit`. `cursor-agent` has supported `--plan`
|
|
259
|
+
since the 2026-01-16 CLI release; the registry, `AGENT_COMMANDS` flag mapping, and the routine
|
|
260
|
+
runner now forward it correctly. Source: `apps/cli/src/lib/agents.ts`, `apps/cli/src/lib/exec.ts`,
|
|
261
|
+
`apps/cli/src/lib/runner.ts`.
|
|
262
|
+
|
|
263
|
+
- **`agents sessions resume` picker now filters in-memory on every keystroke instead of re-querying the database (RUSH-2212).** The `filter` callback in the multi-select picker was calling `filterSessionsByQuery`, which runs a full-text search scan against `sessions.db` on every character typed. It now uses the same cheap in-memory substring match (`sessionMatchesQuery`) the session browser already applies, so the picker stays responsive regardless of library size. Source: `apps/cli/src/commands/sessions-resume.ts`.
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
type: minor
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
Add Cursor Cloud Agents as a native cloud provider so `agents run cursor --cloud` and `agents cloud run --agent cursor` dispatch through Cursor's v1 REST API, with status, streaming, cancellation, and follow-up runs.
|
|
270
|
+
|
|
271
|
+
- **A starved `coreauthd` can no longer hang `secrets list` forever (RUSH-2233).**
|
|
272
|
+
The keychain helper's `list` runs two passes, and the data-protection pass omits
|
|
273
|
+
`kSecUseAuthenticationUI: …Fail` on purpose (that flag drops every biometry-ACL
|
|
274
|
+
item even when authentication is healthy). Omitting it means the query still
|
|
275
|
+
reaches LocalAuthentication/`coreauthd`, which has no deadline of its own — a
|
|
276
|
+
wedged `coreauthd` left `SecItemCopyMatching` blocked for the life of the
|
|
277
|
+
process. That is *why* helpers accumulated for the bounded-spawn + reaper work
|
|
278
|
+
in RUSH-2231/2232 to clean up. The pass now runs on a background thread behind
|
|
279
|
+
a 3-second wait: on timeout the helper logs one line to stderr, skips the pass,
|
|
280
|
+
and prints whatever the file-keychain pass produced — the same handling the
|
|
281
|
+
screen-locked `errSecInteractionNotAllowed` case already got. Set
|
|
282
|
+
`AGENTS_KEYCHAIN_LIST_TIMEOUT_MS` to override the deadline;
|
|
283
|
+
`AGENTS_KEYCHAIN_BOUNDED_TEST=1` runs the helper's headless self-test for the
|
|
284
|
+
bounded wait. Source: `apps/cli/src/lib/secrets/keychain-helper.swift`.
|
|
285
|
+
|
|
286
|
+
- **Use one three-minute AGI Menu snapshot and one watchdog executor (RUSH-2260).**
|
|
287
|
+
The menu bar now reads routines, 40 indexed recent sessions, the daemon-warmed
|
|
288
|
+
active-session cache, and persisted watchdog state in one subprocess every three
|
|
289
|
+
minutes; `doctor --json` remains independently limited to 15 minutes. The menu no
|
|
290
|
+
longer executes watchdog ticks. The daemon is the sole automatic watchdog executor,
|
|
291
|
+
warms active sessions on the same three-minute cadence, is gated by device-local
|
|
292
|
+
`watchdog.enabled`, and cleans failed/timeout routine process groups that are still
|
|
293
|
+
alive before they can overlap a replacement run. Source:
|
|
294
|
+
`apps/cli/src/lib/menubar/snapshot.ts`, `apps/cli/src/lib/daemon.ts`,
|
|
295
|
+
`apps/cli/src/lib/routine-process-cleanup.ts`.
|
|
296
|
+
|
|
297
|
+
- **Add Warp Agent CLI (Oz) as a harness (RUSH-2261).** `warp` is now a
|
|
298
|
+
first-class harness: `agents add warp`, `agents run warp`, `agents teams add
|
|
299
|
+
<team> warp`, resource sync, and `agents view` all work. The CLI command is
|
|
300
|
+
`oz` (the shared Warp binary); install is self-updating via
|
|
301
|
+
`brew install --cask oz` (macOS) / `oz-stable` apt|yum|pacman (Linux), config
|
|
302
|
+
lives under `~/.warp/`, the rules/context file is `AGENTS.md`, and auth is
|
|
303
|
+
`oz login` (browser OAuth) or a `WARP_API_KEY` token for headless/CI.
|
|
304
|
+
Capabilities are truthful and gated by `supports()`: MCP (Claude
|
|
305
|
+
`.mcp.json` schema at `~/.warp/.mcp.json`, stdio + http with headers) and
|
|
306
|
+
skills are on; hooks, allowlist, commands, plugins, subagents, workflows, and
|
|
307
|
+
memory are off (Oz exposes no matching install surface). Sessions are not
|
|
308
|
+
indexed — Oz stores conversations server-side (retrieved with auth via
|
|
309
|
+
`oz run conversation get <id>`), so there is no local transcript for
|
|
310
|
+
`agents sessions`. No usage bar — Oz exposes no usage/limits endpoint.
|
|
311
|
+
Source: `apps/cli/src/lib/{agents,exec,mcp}.ts`.
|
|
312
|
+
|
|
313
|
+
`scripts/release.sh` now runs orchestration in a fresh release-owned worktree, so a dirty shared checkout or feature branch no longer blocks or contaminates a release.
|
|
314
|
+
|
|
315
|
+
- **Plugin discovery warns instead of silently skipping a directory with no
|
|
316
|
+
`.claude-plugin/plugin.json` (RUSH-2270).** A `plugins/<name>/` directory missing
|
|
317
|
+
(or with a malformed) manifest was invisible to `agents plugins list`/`info`/`sync`,
|
|
318
|
+
`agents doctor`, and the marketplace materialize-into-version-homes step, with zero
|
|
319
|
+
diagnostic anywhere in the chain — no `agents sync`/`agents repo pull` could
|
|
320
|
+
surface it, since discovery dropped it before any of those ran. Found via a real
|
|
321
|
+
case: the `work` plugin merged to `phnx-labs/.agents-system` without its manifest
|
|
322
|
+
and sat invisible for a full merge cycle; the same fix run against this box's own
|
|
323
|
+
`~/.agents/plugins/duck` found it missing one too. `discoverPluginsInDir` now
|
|
324
|
+
writes one `agents-cli:` warning to stderr naming the directory and the missing
|
|
325
|
+
manifest path, matching the existing advisory-not-fatal pattern
|
|
326
|
+
`syncMarketplaceManifest` already uses for a malformed (as opposed to missing)
|
|
327
|
+
manifest. Source: `apps/cli/src/lib/plugins.ts`.
|
|
328
|
+
|
|
329
|
+
- **Muse login is recognized under `providers.meta` (balanced no longer signed_out).**
|
|
330
|
+
Live `muse login` writes `~/.config/muse/auth.json` as
|
|
331
|
+
`{ schema_version, providers: { meta: { access_token, user_email, … } } }`.
|
|
332
|
+
The presence detector only walked one object level, so it never saw the token
|
|
333
|
+
under `providers.meta` and reported signed-out after a successful OAuth —
|
|
334
|
+
`agents run muse` under balanced then failed with "excluded: 0.1.0
|
|
335
|
+
(signed_out)". Detection now recurses into nested provider slots and surfaces
|
|
336
|
+
`user_email` when present. Source: `apps/cli/src/lib/agents.ts`.
|
|
337
|
+
|
|
338
|
+
- **File-backed secret resolution now fails on decryption errors instead of treating unreadable ciphertext as an absent value (RUSH-2264).** A wrong `AGENTS_SECRETS_PASSPHRASE` or tampered encrypted value now reports the affected file-store item and stops before launching a consumer with an empty secret such as `HCLOUD_TOKEN`. Source: `apps/cli/src/lib/secrets/filestore.ts`, `apps/cli/src/lib/secrets/bundles.ts`.
|
|
339
|
+
|
|
3
340
|
## 1.22.24
|
|
4
341
|
|
|
342
|
+
- **`agents run --lease` now shares one warm pool across repositories by default (RUSH-2225).** Repo sandbox/CI `profile:` labels no longer split lease reuse into one idle box per repo; a dedicated lease pool is explicit with `.crabbox.yaml` `leaseProfile:`. An empty pool keeps its newly warmed box for later callers. Concurrent runs attach with crabbox `--reclaim` and launch with separate working trees, agent homes, and credential files, so callers share compute without clobbering run state. Switching repos re-syncs the checkout, trading cache latency for lower idle-compute cost. Source: `apps/cli/src/lib/crabbox/config.ts`, `apps/cli/src/lib/crabbox/lease.ts`, `apps/cli/src/commands/exec.ts`.
|
|
343
|
+
|
|
344
|
+
- **`agents sessions insights` turns multi-harness session history into an action list
|
|
345
|
+
(RUSH-2280).** The existing `agents insights` command is now also nested under the
|
|
346
|
+
sessions noun, accepts repeatable `--agent` filters, and reports deterministic offline
|
|
347
|
+
friction/thrash, owner corrections, automatable repeats, harness split, and ranked
|
|
348
|
+
rule/skill/automation/product actions with evidence counts and shortened sample session
|
|
349
|
+
ids. `/sessions-insights` is a thin agent entry over the same CLI implementation;
|
|
350
|
+
`--narrative` remains opt-in and receives aggregate data only. Source:
|
|
351
|
+
`apps/cli/src/commands/insights.ts`, `apps/cli/src/lib/session/insights.ts`,
|
|
352
|
+
`.agents/commands/sessions-insights.md`.
|
|
353
|
+
|
|
5
354
|
- **`agents sessions focus` recovers dead panes and shares the sessions browser's selectors (GH-2108).** A retained tmux `remain-on-exit` pane is probed through `#{pane_dead}` immediately before attach, so dead or missing panes no longer open a `Pane is dead` screen. `focus` accepts session ids, topic/path searches, `agent@version` selectors (including per-device `latest`/`oldest`), device, project/time, team/routine, skill/plugin, favorites, and the complete live-state union. Focus, resume, attach, and `run --resume` now use one recovery decision on the origin device: a healthy exact origin performs native resume; otherwise balanced selection chooses a healthy version of the same harness and sends `/continue <id>` to read the indexed transcript, including transcripts retained under version trash. Host-dispatched rows persist the dispatch host as their origin, and `attach` routes its detach-record cleanup there before resuming. No usable same-harness version fails with the device, origin version, and account-health reason. Source: `apps/cli/src/commands/focus.ts`, `apps/cli/src/commands/sessions-browser.ts`, `apps/cli/src/lib/session/recovery.ts`.
|
|
6
355
|
|
|
7
356
|
- **`agents secrets setup` no longer tells you to set `AGENTS_SECRETS_PASSPHRASE`, and
|
|
@@ -108,7 +457,7 @@
|
|
|
108
457
|
|
|
109
458
|
- **Fix: the keychain-helper reaper never reaped on macOS.** The daemon reaper shelled `ps -o etimes` — a GNU/Linux procps keyword that macOS `ps` rejects with a non-zero exit — so `execFileSync` threw on every tick and `reapOrphanedKeychainProcesses` returned `reaped: 0` on its only supported platform, leaving orphaned/wedged `Agents CLI` helper processes to pile up. Switched to the portable BSD `etime` keyword (`[[dd-]hh:]mm:ss`) with a parser to seconds. This also un-quarantines the darwin integration test that #2153 had to `it.skip` to unblock releases: that test's symlink fixture was correct all along — it read `reaped: 0` only because the reaper's own `ps etimes` call threw before parsing anything. Verified on macOS 15.4.1: 20/20 reaper tests pass, the integration test reaping a real orphaned sleeper. Source: `apps/cli/src/lib/secrets/reaper.ts`, `reaper.test.ts`.
|
|
110
459
|
|
|
111
|
-
- **`agents modes [agent[@version]]` lists the permission modes a harness accepts.** The modes analog of `agents models`: for Claude / Codex / Cursor / …, shows which `--mode plan|edit|auto|skip` values work, the native CLI flags, the native default (`*`), any configured `run.defaults` mode, and degrade notes (e.g. plan→edit on
|
|
460
|
+
- **`agents modes [agent[@version]]` lists the permission modes a harness accepts.** The modes analog of `agents models`: for Claude / Codex / Cursor / …, shows which `--mode plan|edit|auto|skip` values work, the native CLI flags, the native default (`*`), any configured `run.defaults` mode, and degrade notes (e.g. plan→edit on Antigravity). `agents inspect` also prints the mode list next to capabilities, and `agents run --help` / `agents models` point at the new command. Source: `apps/cli/src/commands/modes.ts`, `apps/cli/src/lib/agent-modes.ts`.
|
|
112
461
|
|
|
113
462
|
- **`agents insights --all` now works as an alias for `--since all`.** It previously
|
|
114
463
|
exited with `unknown option '--all'` — a hard failure in the middle of a report the
|
package/README.md
CHANGED
|
@@ -35,6 +35,8 @@
|
|
|
35
35
|
<a href="https://dev.meta.ai/docs/muse-code" title="Meta Muse Code"><strong>Muse</strong></a>
|
|
36
36
|
|
|
37
37
|
<a href="https://omp.sh" title="Oh My Pi"><strong>Pi</strong></a>
|
|
38
|
+
|
|
39
|
+
<a href="https://docs.warp.dev/reference/cli" title="Warp Agent CLI (Oz)"><strong>Warp</strong></a>
|
|
38
40
|
</p>
|
|
39
41
|
|
|
40
42
|
https://agents-cli.sh/demo.mp4
|
|
@@ -43,11 +45,12 @@ https://agents-cli.sh/demo.mp4
|
|
|
43
45
|
|
|
44
46
|
```bash
|
|
45
47
|
npm install -g @phnx-labs/agents-cli # or: curl -fsSL agi-cli.sh | sh
|
|
46
|
-
agents setup # first-time setup
|
|
48
|
+
agents setup # first-time setup, or re-open the capability hub
|
|
49
|
+
agents setup status # readiness for browser, computer, fleet, and more
|
|
47
50
|
agents run claude "explain this repo" # run any agent on your existing subscription
|
|
48
51
|
```
|
|
49
52
|
|
|
50
|
-
`agents setup` is interactive and idempotent -- safe to re-run on a
|
|
53
|
+
`agents setup` is interactive and idempotent -- safe to re-run on any machine. Once core setup exists, it opens a status-aware menu for browser, computer, secrets, fleet, share, watchdog, and device preferences; each choice delegates to the same wizard available under `agents setup <capability>`. In CI or another non-TTY, bare setup prints the checklist without prompting. The `agi-cli.sh` one-liner installs this same canonical `@phnx-labs/agents-cli` package. Prefer bun? `bun install -g @phnx-labs/agents-cli` works too.
|
|
51
54
|
|
|
52
55
|
Already installed? `agents upgrade` updates agents-cli itself to the latest version (`agents upgrade 1.2.3` for a specific version or dist-tag, `-y` to skip the confirm prompt). The command is `upgrade` on every platform -- there is no `agents update` (on macOS, `agents helper update` is a different command that reinstalls the keychain helper, not agents-cli).
|
|
53
56
|
|
|
@@ -147,6 +150,13 @@ agents run antigravity "Write tests for the fixed code"
|
|
|
147
150
|
|
|
148
151
|
Each resolves to the project-pinned version with skills, MCP servers, and permissions already synced. Single-typo names auto-correct across every command — `agents view cladue` resolves to `claude`, `agents add codx@latest` to `codex`.
|
|
149
152
|
|
|
153
|
+
`agents run claude "task" --lease` reuses one shared warm crabbox pool across
|
|
154
|
+
repositories by default. Concurrent runs share the box but execute in isolated
|
|
155
|
+
`~/workspaces/<repo>-<run>` directories with separate agent homes and credential
|
|
156
|
+
files. Add `leaseProfile: private-hot-box` to
|
|
157
|
+
`.crabbox.yaml` only when a repo intentionally needs a dedicated warm pool;
|
|
158
|
+
cross-repo reuse trades re-sync latency for lower idle-compute cost.
|
|
159
|
+
|
|
150
160
|
### Rate-limited? Keep working.
|
|
151
161
|
|
|
152
162
|
```bash
|
|
@@ -286,8 +296,16 @@ agents sessions backfill tools --fleet
|
|
|
286
296
|
agents sessions stats
|
|
287
297
|
agents sessions stats --zero # only the never-invoked (dead weight)
|
|
288
298
|
agents sessions backfill resources # fold historical sessions into the usage index
|
|
299
|
+
|
|
300
|
+
# Friction, owner corrections, repeated recipes, and ranked actions across harnesses
|
|
301
|
+
agents sessions insights --since 30d
|
|
302
|
+
agents sessions insights --agent claude --agent codex --json
|
|
303
|
+
# Top-level alias
|
|
304
|
+
agents insights --since 7d
|
|
289
305
|
```
|
|
290
306
|
|
|
307
|
+
`sessions insights` is deterministic and offline by default. It caches per-session facets, compares harnesses, and emits an actions table with evidence counts plus shortened sample session ids. `--narrative` is opt-in and receives aggregates only, never raw transcripts. The installed `/sessions-insights` slash command invokes the same CLI source of truth.
|
|
308
|
+
|
|
291
309
|
Interactive picker when you're in a terminal. Structured output (`--json`, `--markdown`, filtered by role or turn count) when piped.
|
|
292
310
|
|
|
293
311
|
Backed by a SQLite + FTS5 index at `~/.agents/.history/sessions/sessions.db` with incremental scanning -- warm reads in ~100ms. Tool-call evidence is redacted and bounded before it is cached; repeated `--query` clauses must match distinct calls in one session. Tool queries read SQLite only: `agents sessions backfill tools` performs the one-time historical parse, while normal incremental scans index new and changed sessions. The index stores ordered static Bash program sites, so `--count` reports occurrences, containing tool calls, and distinct sessions without reparsing. `--fleet` executes one origin partition per device, so synced mirrors cannot duplicate compact evidence or counts returned over SSH; transcript bodies stay on their origin machine. This uses relational SQLite rows and literal FTS5 only, with no embeddings, vector database, or model calls. External tools can consume `--json` output as a programmatic observability layer; see [docs/05-sessions.md](apps/cli/docs/05-sessions.md) for the schemas and [docs/06-observability.md](apps/cli/docs/06-observability.md) for the consumption patterns.
|
|
@@ -405,7 +423,7 @@ agents watchdog --nudge # actually inject "Continue." into the stalled split
|
|
|
405
423
|
agents watchdog --watch # daemon loop: a tick every --interval
|
|
406
424
|
```
|
|
407
425
|
|
|
408
|
-
`agents watchdog` detects a stalled session, resolves the *exact* terminal split it lives in (tmux, iTerm, VSCodium, or a raw pty), and injects a nudge -- `Continue.` by default, or set `--text`. It's dry by default; `--nudge` acts on a single tick
|
|
426
|
+
`agents watchdog` detects a stalled session, resolves the *exact* terminal split it lives in (tmux, iTerm, VSCodium, or a raw pty), and injects a nudge -- `Continue.` by default, or set `--text`. It's dry by default; `--nudge` acts on a single tick. `agents watchdog on|off` controls the device-local daemon pass, which runs once every three minutes. Steer a single run with `agents watchdog policy <id> off | keep | handsoff`.
|
|
409
427
|
|
|
410
428
|
A stalled session whose tail shows a hard account limit ("You've hit your weekly limit · resets …") is **rotated in place** instead of nudged: the watchdog gates on the same healthy-account selection `agents run auto` makes (zero healthy → one skip event per cooldown window, terminal untouched), injects the harness's exit sequence, relaunches `agents run auto --interactive --session-id <uuid>` in the *same* tab, then replays the old session's resume once the new TUI is live. Default on; `agents watchdog rotate off` disables it (nudging stays on).
|
|
411
429
|
|
|
@@ -609,10 +627,10 @@ Team state is observable via `agents teams list --json` / `agents teams status -
|
|
|
609
627
|
|
|
610
628
|
## Cloud
|
|
611
629
|
|
|
612
|
-
Some work shouldn't tie up your laptop. `agents cloud run` hands a task to a managed provider that clones the repo, plans, implements, tests, and opens a PR -- while your terminal stays free.
|
|
630
|
+
Some work shouldn't tie up your laptop. `agents cloud run` hands a task to a managed provider that clones the repo, plans, implements, tests, and opens a PR -- while your terminal stays free. The `host` provider dispatches the same way onto machines you own: `agents cloud run "…" --host gpu-box` (tasks track in `agents cloud ps` and `agents hosts ps` alike).
|
|
613
631
|
|
|
614
632
|
<p align="center">
|
|
615
|
-
<img src="assets/cloud.svg" alt="agents cloud run dispatches one prompt to a managed provider (Rush, Codex, Factory, or Antigravity) that
|
|
633
|
+
<img src="assets/cloud.svg" alt="agents cloud run dispatches one prompt to a managed provider (Rush, Codex, Cursor, Factory, or Antigravity) that runs while you keep working" width="100%" />
|
|
616
634
|
</p>
|
|
617
635
|
|
|
618
636
|
```bash
|
|
@@ -626,7 +644,7 @@ agents cloud message <id> "also update the changelog" # steer it mid-run
|
|
|
626
644
|
agents cloud cancel <id>
|
|
627
645
|
```
|
|
628
646
|
|
|
629
|
-
|
|
647
|
+
Five managed backends behind one interface (`agents cloud providers`):
|
|
630
648
|
|
|
631
649
|
| Provider | What runs | Notes |
|
|
632
650
|
|---|---|---|
|
|
@@ -634,6 +652,7 @@ Four managed backends behind one interface (`agents cloud providers`):
|
|
|
634
652
|
| `codex` | A pre-built Codex Cloud environment | Target it with `--env`. |
|
|
635
653
|
| `factory` | `droid exec` on a cloud VM | Computer-use; pick the box with `--computer`. |
|
|
636
654
|
| `antigravity` | Gemini managed agents | Antigravity harness in a remote sandbox. |
|
|
655
|
+
| `cursor` | Cursor Cloud Agents | v1 REST API with repo, status, SSE, cancel, and follow-up runs. |
|
|
637
656
|
|
|
638
657
|
Auto-routes each `--agent` to its native cloud, or pin the backend with `--provider`. Instead of dispatching now, register a run as an **event trigger** with `--on pull_request` (also `push`, `issue_comment`, `workflow_run`) -- it persists as a trigger-bound routine that fires on the event. `--json` on every subcommand for scripting.
|
|
639
658
|
|
|
@@ -810,6 +829,12 @@ agents browser done # Close task's tabs when finished
|
|
|
810
829
|
|
|
811
830
|
# Need to address a different task in the same shell? Override per call:
|
|
812
831
|
agents browser screenshot --task other-flow
|
|
832
|
+
|
|
833
|
+
# Repeated observe/action loops: one Node process and daemon socket stay warm.
|
|
834
|
+
printf '%s\n' \
|
|
835
|
+
'{"action":"screenshot","path":"/tmp/page.jpg"}' \
|
|
836
|
+
'{"action":"click","atX":320,"atY":540}' \
|
|
837
|
+
| agents browser stream --task "$AGENTS_BROWSER_TASK"
|
|
813
838
|
```
|
|
814
839
|
|
|
815
840
|
### Why this works where Playwright fails
|
package/dist/bin/agents
CHANGED
|
Binary file
|
package/dist/browser.js
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { registerBrowserSubcommands } from './commands/browser.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
import { maybeRunStandaloneOnHost } from './lib/hosts/passthrough.js';
|
|
5
|
+
async function main() {
|
|
6
|
+
// `browser … --host <box>` routes to a remote over SSH, exactly like
|
|
7
|
+
// `agents browser … --host <box>` does through index.ts. Standalone-only:
|
|
8
|
+
// this binary never enters index.ts, so without this the flag was dropped.
|
|
9
|
+
if (await maybeRunStandaloneOnHost('browser')) {
|
|
10
|
+
process.exit(process.exitCode ?? 0);
|
|
11
|
+
}
|
|
12
|
+
const program = new Command();
|
|
13
|
+
program.name('browser').description('Browser automation via CDP');
|
|
14
|
+
registerBrowserSubcommands(program);
|
|
15
|
+
program.parse();
|
|
16
|
+
}
|
|
17
|
+
void main();
|