@phnx-labs/agents-cli 1.22.114 → 1.22.116
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 +245 -0
- package/README.md +22 -102
- package/dist/browser.js +0 -0
- package/dist/cli/command-registry.js +0 -7
- package/dist/commands/accounts.d.ts +3 -77
- package/dist/commands/accounts.js +13 -366
- package/dist/commands/audit.js +1 -1
- package/dist/commands/auth.js +0 -2
- package/dist/commands/browser.d.ts +53 -0
- package/dist/commands/browser.js +210 -9
- package/dist/commands/doctor.d.ts +2 -3
- package/dist/commands/doctor.js +0 -11
- package/dist/commands/events.d.ts +1 -3
- package/dist/commands/events.js +4 -7
- package/dist/commands/exec.d.ts +0 -1
- package/dist/commands/exec.js +214 -148
- package/dist/commands/feed-watch.js +52 -8
- package/dist/commands/feed.js +65 -14
- package/dist/commands/focus.js +1 -1
- package/dist/commands/go.d.ts +0 -17
- package/dist/commands/go.js +2 -19
- package/dist/commands/logs.js +1 -1
- package/dist/commands/mcp.js +8 -83
- package/dist/commands/memory.js +4 -47
- package/dist/commands/message.js +4 -4
- package/dist/commands/plugins.js +1 -93
- package/dist/commands/repo.js +0 -44
- package/dist/commands/resume.js +4 -1
- package/dist/commands/secrets-passthrough.js +2 -2
- package/dist/commands/send.d.ts +4 -4
- package/dist/commands/send.js +6 -51
- package/dist/commands/sessions-backup-setup.js +1 -1
- package/dist/commands/sessions-picker.d.ts +11 -0
- package/dist/commands/sessions-picker.js +88 -7
- package/dist/commands/sessions-resume.js +0 -1
- package/dist/commands/sessions-share.d.ts +5 -7
- package/dist/commands/sessions-share.js +98 -49
- package/dist/commands/sessions.d.ts +21 -2
- package/dist/commands/sessions.js +158 -11
- package/dist/commands/setup-browser.js +18 -2
- package/dist/commands/setup-computer.js +20 -6
- package/dist/commands/setup-secrets.d.ts +2 -2
- package/dist/commands/setup-secrets.js +24 -4
- package/dist/commands/setup-term.d.ts +24 -0
- package/dist/commands/setup-term.js +70 -0
- package/dist/commands/setup-terminal.d.ts +3 -0
- package/dist/commands/setup-terminal.js +22 -0
- package/dist/commands/setup.d.ts +1 -1
- package/dist/commands/setup.js +29 -11
- package/dist/commands/skills.js +0 -8
- package/dist/commands/ssh.d.ts +6 -0
- package/dist/commands/ssh.js +93 -302
- package/dist/commands/sync.js +14 -5
- package/dist/commands/teams.js +1 -1
- package/dist/commands/traces.js +1 -1
- package/dist/lib/accounting/rotate.d.ts +63 -1
- package/dist/lib/accounting/rotate.js +56 -0
- package/dist/lib/accounts/add.d.ts +0 -5
- package/dist/lib/accounts/add.js +3 -9
- package/dist/lib/accounts/slots.js +32 -2
- package/dist/lib/answer-router.d.ts +11 -2
- package/dist/lib/answer-router.js +26 -2
- package/dist/lib/artifacts-client.d.ts +20 -0
- package/dist/lib/artifacts-client.js +46 -0
- package/dist/lib/auth-mint.d.ts +5 -4
- package/dist/lib/auth-mint.js +6 -5
- package/dist/lib/browser/drivers/arc.d.ts +1 -1
- package/dist/lib/browser/runtime-state.d.ts +55 -0
- package/dist/lib/browser/runtime-state.js +99 -18
- package/dist/lib/browser/service.d.ts +10 -0
- package/dist/lib/browser/service.js +229 -37
- package/dist/lib/browser/types.d.ts +18 -0
- package/dist/lib/cli-resources.js +3 -1
- package/dist/lib/cloud/dispatch.js +1 -1
- package/dist/lib/cloudflare/creds.d.ts +10 -0
- package/dist/lib/cloudflare/creds.js +46 -0
- package/dist/lib/cloudflare/provision.d.ts +35 -0
- package/dist/lib/cloudflare/provision.js +144 -0
- package/dist/lib/computer/sessions-list.d.ts +55 -0
- package/dist/lib/computer/sessions-list.js +168 -1
- package/dist/lib/config-keys.d.ts +1 -1
- package/dist/lib/config-keys.js +5 -0
- package/dist/lib/daemon/daemon.js +8 -1
- package/dist/lib/daemon/feed-stream-service.d.ts +23 -0
- package/dist/lib/daemon/feed-stream-service.js +40 -0
- package/dist/lib/daemon-services.d.ts +1 -1
- package/dist/lib/daemon-services.js +5 -0
- package/dist/lib/device-config.js +61 -0
- package/dist/lib/devices/connect.d.ts +49 -5
- package/dist/lib/devices/connect.js +169 -21
- package/dist/lib/devices/doctor-findings.js +2 -6
- package/dist/lib/feed/answer.d.ts +153 -4
- package/dist/lib/feed/answer.js +716 -105
- package/dist/lib/feed/envelope.d.ts +79 -0
- package/dist/lib/feed/envelope.js +23 -0
- package/dist/lib/feed/events.d.ts +6 -0
- package/dist/lib/feed/events.js +8 -0
- package/dist/lib/feed/feed.d.ts +61 -1
- package/dist/lib/feed/feed.js +226 -14
- package/dist/lib/feed/hub-server.d.ts +141 -0
- package/dist/lib/feed/hub-server.js +586 -0
- package/dist/lib/feed/hub.d.ts +95 -0
- package/dist/lib/feed/hub.js +255 -0
- package/dist/lib/feed/pr-status.d.ts +8 -0
- package/dist/lib/feed/pr-status.js +9 -1
- package/dist/lib/feed/tool-activity.d.ts +108 -0
- package/dist/lib/feed/tool-activity.js +313 -0
- package/dist/lib/feed/tools.d.ts +198 -0
- package/dist/lib/feed/tools.js +265 -0
- package/dist/lib/feed/watch.d.ts +50 -50
- package/dist/lib/feed/watch.js +147 -16
- package/dist/lib/feed-outcome.d.ts +1 -1
- package/dist/lib/feed-outcome.js +9 -2
- package/dist/lib/feed-policy.js +9 -3
- package/dist/lib/fleet/auth-sync.d.ts +2 -55
- package/dist/lib/fleet/auth-sync.js +2 -89
- package/dist/lib/format.d.ts +1 -1
- package/dist/lib/format.js +1 -1
- package/dist/lib/git.d.ts +0 -16
- package/dist/lib/git.js +0 -58
- package/dist/lib/harness-auth-capabilities.js +7 -2
- package/dist/lib/helper-versions.js +1 -1
- package/dist/lib/hosts/dispatch.d.ts +20 -1
- package/dist/lib/hosts/dispatch.js +52 -30
- package/dist/lib/hosts/remote-cmd.d.ts +72 -1
- package/dist/lib/hosts/remote-cmd.js +151 -10
- package/dist/lib/hosts/remote-cmd.test-fixture.d.ts +2 -0
- package/dist/lib/hosts/remote-cmd.test-fixture.js +22 -0
- package/dist/lib/mailbox.d.ts +12 -0
- package/dist/lib/mailbox.js +16 -2
- package/dist/lib/mcp.js +17 -11
- package/dist/lib/menubar/snapshot.d.ts +51 -0
- package/dist/lib/menubar/snapshot.js +42 -3
- package/dist/lib/open-url.js +2 -2
- package/dist/lib/probe.d.ts +4 -1
- package/dist/lib/probe.js +5 -2
- package/dist/lib/projects.d.ts +23 -0
- package/dist/lib/projects.js +78 -0
- package/dist/lib/pwsh.d.ts +33 -0
- package/dist/lib/pwsh.js +56 -0
- package/dist/lib/redact.d.ts +8 -0
- package/dist/lib/redact.js +11 -0
- package/dist/lib/refresh.d.ts +6 -2
- package/dist/lib/refresh.js +92 -72
- package/dist/lib/secrets-cli.d.ts +11 -0
- package/dist/lib/secrets-cli.js +30 -0
- package/dist/lib/secrets-client.js +3 -2
- package/dist/lib/session/active.d.ts +1 -0
- package/dist/lib/session/active.js +8 -0
- package/dist/lib/session/db.d.ts +67 -3
- package/dist/lib/session/db.js +381 -126
- package/dist/lib/session/detached.d.ts +7 -0
- package/dist/lib/session/detached.js +29 -0
- package/dist/lib/session/prompt.d.ts +23 -7
- package/dist/lib/session/prompt.js +46 -8
- package/dist/lib/session/remote/peer-stream.d.ts +24 -2
- package/dist/lib/session/remote/peer-stream.js +33 -6
- package/dist/lib/session/remote/remote-list.d.ts +20 -0
- package/dist/lib/session/remote/remote-list.js +22 -6
- package/dist/lib/session/remote/watch.d.ts +12 -0
- package/dist/lib/session/remote/watch.js +9 -0
- package/dist/lib/session/remote-preview-cache.d.ts +29 -0
- package/dist/lib/session/remote-preview-cache.js +373 -0
- package/dist/lib/session/sync/backend.d.ts +3 -3
- package/dist/lib/session/sync/backend.js +3 -3
- package/dist/lib/session/sync/provision.d.ts +1 -1
- package/dist/lib/session/sync/provision.js +2 -2
- package/dist/lib/session/tail.d.ts +50 -0
- package/dist/lib/session/tail.js +219 -0
- package/dist/lib/sessions-client.js +0 -3
- package/dist/lib/setup-tool-install.d.ts +3 -0
- package/dist/lib/setup-tool-install.js +27 -0
- package/dist/lib/setup-tool-status.d.ts +22 -0
- package/dist/lib/setup-tool-status.js +220 -0
- package/dist/lib/share-runtime.d.ts +11 -0
- package/dist/lib/share-runtime.js +63 -0
- package/dist/lib/signin-badge.d.ts +19 -4
- package/dist/lib/signin-badge.js +29 -11
- package/dist/lib/smart-launch.d.ts +1 -5
- package/dist/lib/smart-launch.js +3 -11
- package/dist/lib/ssh-exec.d.ts +44 -0
- package/dist/lib/ssh-exec.js +119 -0
- package/dist/lib/startup/command-registry.d.ts +6 -4
- package/dist/lib/startup/command-registry.js +10 -7
- package/dist/lib/state.js +2 -2
- package/dist/lib/storage/selection.d.ts +2 -2
- package/dist/lib/storage/selection.js +2 -2
- package/dist/lib/sync-umbrella.d.ts +5 -0
- package/dist/lib/sync-umbrella.js +18 -10
- package/dist/lib/term-driver.d.ts +24 -0
- package/dist/lib/term-driver.js +36 -0
- package/dist/lib/terminal/index.d.ts +1 -1
- package/dist/lib/terminal/index.js +1 -1
- package/dist/lib/terminal/inject.d.ts +38 -0
- package/dist/lib/terminal/inject.js +55 -9
- package/dist/lib/terminal/transport.d.ts +15 -5
- package/dist/lib/terminal/transport.js +61 -11
- package/dist/lib/traces/backend.d.ts +1 -2
- package/dist/lib/traces/backend.js +1 -2
- package/dist/lib/traces/provision.d.ts +1 -1
- package/dist/lib/traces/provision.js +2 -2
- package/dist/lib/types.d.ts +8 -6
- package/package.json +2 -3
- package/dist/commands/artifacts-setup.d.ts +0 -53
- package/dist/commands/artifacts-setup.js +0 -161
- package/dist/commands/artifacts.d.ts +0 -18
- package/dist/commands/artifacts.js +0 -58
- package/dist/commands/attach.d.ts +0 -12
- package/dist/commands/attach.js +0 -86
- package/dist/commands/auth-mint.d.ts +0 -12
- package/dist/commands/auth-mint.js +0 -108
- package/dist/commands/reconnect.d.ts +0 -46
- package/dist/commands/reconnect.js +0 -115
- package/dist/commands/share.d.ts +0 -293
- package/dist/commands/share.js +0 -1424
- package/dist/lib/fleet/remote-login.d.ts +0 -170
- package/dist/lib/fleet/remote-login.js +0 -568
- package/dist/lib/share/analytics.d.ts +0 -13
- package/dist/lib/share/analytics.js +0 -45
- package/dist/lib/share/backend.d.ts +0 -120
- package/dist/lib/share/backend.js +0 -176
- package/dist/lib/share/capture.d.ts +0 -31
- package/dist/lib/share/capture.js +0 -174
- package/dist/lib/share/config.d.ts +0 -72
- package/dist/lib/share/config.js +0 -211
- package/dist/lib/share/delete.d.ts +0 -123
- package/dist/lib/share/delete.js +0 -173
- package/dist/lib/share/html.d.ts +0 -20
- package/dist/lib/share/html.js +0 -88
- package/dist/lib/share/http-error.d.ts +0 -53
- package/dist/lib/share/http-error.js +0 -65
- package/dist/lib/share/og.d.ts +0 -26
- package/dist/lib/share/og.js +0 -84
- package/dist/lib/share/provision.d.ts +0 -127
- package/dist/lib/share/provision.js +0 -285
- package/dist/lib/share/publish.d.ts +0 -379
- package/dist/lib/share/publish.js +0 -818
- package/dist/lib/share/worker-template.d.ts +0 -27
- package/dist/lib/share/worker-template.js +0 -2424
- package/dist/lib/storage/index.d.ts +0 -14
- package/dist/lib/storage/index.js +0 -14
- package/dist/lib/storage/visibility.d.ts +0 -82
- package/dist/lib/storage/visibility.js +0 -99
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,250 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.22.116
|
|
4
|
+
|
|
5
|
+
- **`agents feed answer` is bounded, exactly-once, and truthful about delivery
|
|
6
|
+
(PHNX-3999).** The AGI Menu abandons a reply at 30s; this path used to blow
|
|
7
|
+
that budget and then report a fabricated receipt.
|
|
8
|
+
- **Bounded.** The requested attention key names its session, so only that
|
|
9
|
+
session is reconciled and the optional `gh pr view` enrichment runs only for
|
|
10
|
+
a key whose generation is a PR review. Previously every active session was
|
|
11
|
+
enriched — one 15s-bounded `gh` call each — *before* the key was compared.
|
|
12
|
+
The whole operation now runs under one deadline, and a forwarded answer is
|
|
13
|
+
raced against it directly rather than trusting the transport's own timer.
|
|
14
|
+
- **Exact tokens across the hop.** A forwarded answer is POSIX-quoted with the
|
|
15
|
+
canonical `shellQuote` and run through the canonical `sshExecAsync`, so a
|
|
16
|
+
multiline answer or one carrying `$`, backticks, quotes or `;` arrives
|
|
17
|
+
byte-identical instead of being re-parsed by the remote shell.
|
|
18
|
+
- **Multiline free text.** A multiline answer is delivered into a tmux rail as
|
|
19
|
+
one bracketed paste (`injectIntoTerminal`'s new `paste` option), so a TUI
|
|
20
|
+
inserts it verbatim instead of submitting one line at a time. A rail that
|
|
21
|
+
cannot carry the framing refuses *before* the claim is taken.
|
|
22
|
+
- **A claim is no longer a resolution.** `recordAnswer` gains a two-phase
|
|
23
|
+
`pending` mode: the claim locks the item but leaves the block `open` and
|
|
24
|
+
writes no resolution tombstone, so an unconfirmed delivery can no longer make
|
|
25
|
+
the request silently vanish from the feed. Only the AGENT's own
|
|
26
|
+
acknowledgement resolves it — a `consumed`/`continued` receipt promotes the
|
|
27
|
+
claim through `confirmAnswerResolution`, bound to the generation and attempt
|
|
28
|
+
it was taken for, so a slow delivery cannot resolve the question the agent
|
|
29
|
+
has since moved on to. A `queued` receipt never does.
|
|
30
|
+
- **Truthful, typed outcomes for the operator UI.** `--json` now emits
|
|
31
|
+
`status` (`delivered` / `already_answered` / `unknown` / `failed`),
|
|
32
|
+
`delivery` (`receipt` / `unconfirmed` / `failed`), `resolved`, `host`,
|
|
33
|
+
`attempt`, and the block's **real** `MessageReceipt` — never a synthesized
|
|
34
|
+
one. `queued` is delivery, never resolution; `dropped`/`expired` read as
|
|
35
|
+
failures rather than as the furthest-along success. A timeout, a truncated
|
|
36
|
+
remote reply, or a partly-written keystroke sequence is `unknown` (the claim
|
|
37
|
+
is kept, so a retry cannot double-send); only a provable non-delivery is
|
|
38
|
+
`failed`.
|
|
39
|
+
- **`agents feed answer <key> --check [--attempt <at>]`** is a new read-only
|
|
40
|
+
reconciliation — the "check delivery" path for an unconfirmed answer. It
|
|
41
|
+
never claims, routes or resends, and it is bound to the requested generation
|
|
42
|
+
and attempt, so a stale card can never be resolved by the next question's
|
|
43
|
+
receipt.
|
|
44
|
+
- **Stranded claims reconcile.** A claim a kill left with no receipt is adopted
|
|
45
|
+
and completed only on the mailbox rail, where the whole spool (inbox,
|
|
46
|
+
processing and consumed) is scanned by block id so the answer is never
|
|
47
|
+
enqueued twice, and only through a compare-and-swap so two retries cannot
|
|
48
|
+
both adopt it.
|
|
49
|
+
|
|
50
|
+
- **AGI Menu: synchronized Headless-runs defaults, Home and device preferences.**
|
|
51
|
+
Five new `agents config` keys, validated at write time and synced fleet-wide like
|
|
52
|
+
the existing `menubar.menu.*` set: `menubar.menu.headlessAgent` and
|
|
53
|
+
`menubar.menu.headlessFallbackAgent` (each a registered agent id — a typo is
|
|
54
|
+
refused, not stored), `menubar.menu.headlessPlacement`
|
|
55
|
+
(`auto` | `local` | `interactive` | a device name),
|
|
56
|
+
`menubar.menu.sessionUpdates`, and `menubar.menu.deviceSort`
|
|
57
|
+
(`name` | `role` | `load` | `memory` | `disk`).
|
|
58
|
+
- **`agents run --fallback <agent>` now reaches the alternate harness when the
|
|
59
|
+
primary's accounts are exhausted before the run starts.** Previously that case
|
|
60
|
+
printed "no healthy account" and exited 1, so a configured alternate never fired
|
|
61
|
+
for the one situation it exists for; the mid-run handoff also no longer stops at
|
|
62
|
+
three accounts when an explicit alternate is configured, so every healthy account
|
|
63
|
+
of the primary is tried before another harness. A signed-out primary still fails
|
|
64
|
+
loud with the login hint — logging in is the fix there, not a different harness.
|
|
65
|
+
- **`agents menubar snapshot --json` reports each device's role and specs.** Every
|
|
66
|
+
`devices[]` row gains `role`, `autoEligible` (whether `--device auto` may pick it)
|
|
67
|
+
and `stats` — cores, total/free memory and disk, load, reachability, and when each
|
|
68
|
+
was observed. Read from the existing fleet-stats cache, so no fleet probe; `null`
|
|
69
|
+
for a device never measured, and every unobserved number is `null` rather than `0`.
|
|
70
|
+
- **Session rows carry `confirmedProject`.** The registered project whose root
|
|
71
|
+
contains the session's working directory, or `null` when the association is not
|
|
72
|
+
confirmed, on `agents feed watch --json`, `agents sessions watch --json`, and
|
|
73
|
+
`agents sessions --active --json`. A directory no project definition names — even
|
|
74
|
+
one that happens to be a git repository — is no longer filed under a project
|
|
75
|
+
invented from its folder name. The existing `project` field is unchanged.
|
|
76
|
+
- **Session titles exclude shell and control scaffolding.** A harness-generated
|
|
77
|
+
title that is a `<bash-input>`/`<command-name>`/`<system-reminder>` wrapper, or a
|
|
78
|
+
bare control command such as `/clear` or `/compact`, is rejected so the row shows
|
|
79
|
+
the generated title or the user's own first prompt instead. A `/rename` title is
|
|
80
|
+
still kept verbatim, and the original prompt stays on the row. Existing indexed
|
|
81
|
+
sessions are re-derived on their next scan.
|
|
82
|
+
|
|
83
|
+
- **Session previews retain details across devices (PHNX-3999).** An exact session
|
|
84
|
+
ID and owning device use one bounded request, with a durable local copy for
|
|
85
|
+
offline reading. Reopening unchanged sessions avoids network requests; activity
|
|
86
|
+
changes invalidate the copy, and failed requests back off without hiding prior
|
|
87
|
+
content. Concurrent requests coalesce, including failed manual refreshes.
|
|
88
|
+
SQLite contention, lock waiting, and transport share a 10-second budget.
|
|
89
|
+
- **Large local transcripts show bounded recent details.** Previews reuse the
|
|
90
|
+
canonical transcript parsers and timeline projection, mark partial history,
|
|
91
|
+
and report missing transcripts explicitly. Cached timeline data is accepted
|
|
92
|
+
only for the exact file modification time and size that produced it.
|
|
93
|
+
|
|
94
|
+
- `agents setup secrets` / `agents clis install secrets` now install Secrets CLI 0.1.5, which accepts the shared Phoenix `--host` address grammar (`ssh://[user@]host`, bare `user@host`/alias; other schemes fail loud) on `secrets` and `secrets hosts pin` (PHNX-4090) — matching the `--host` grammar computer-cli 0.1.5 already ships. Existing installs are unaffected; the canonical pin lives in `cli/src/lib/secrets-cli.ts`.
|
|
95
|
+
|
|
96
|
+
- **`agents setup` now installs the standalone `term` CLI as a first-class onboarding phase (PHNX-4092).** The PTY engine `agents fleet login` and `agents auth mint` spawn on demand lives in `@phnx-labs/term-cli` (extracted PHNX-4091); a fleet device with it missing failed those flows loud. The onboarding hub gains a `term` phase and an `agents setup term` wizard (with `--install-only` / `--terminal`) that installs the pinned `@phnx-labs/term-cli@0.1.0` — via the system `clis/term.yaml` manifest, else a pinned `npm i -g` — the same way `browser`/`computer`/`secrets` install. `agents setup status` and `--tool term` report its readiness: unlike the other tools `term` has no `status --json` health surface, so presence on PATH is the whole readiness signal (no probe, no configure step). Source: `cli/src/commands/setup-term.ts`, `cli/src/commands/setup.ts`, `cli/src/lib/setup-tool-status.ts`, `cli/src/lib/setup-tool-install.ts`.
|
|
97
|
+
|
|
98
|
+
- **`browser status` no longer goes blank when one Arc task is stale (PHNX-3999).** A
|
|
99
|
+
single Arc tab that had been moved to another window or Space — or closed — made
|
|
100
|
+
`agents browser status` throw, and **every** profile vanished from the listing,
|
|
101
|
+
including healthy ones with nothing to do with Arc. The refusal to adopt a moved
|
|
102
|
+
tab is correct and is unchanged: an action still will not drive a tab its task no
|
|
103
|
+
longer owns. What changed is that read-only `status` no longer inherits the blast
|
|
104
|
+
radius. An unreadable task is reported with the tab count it owns on disk plus the
|
|
105
|
+
reason its live tabs could not be read, an unreadable profile is listed with an
|
|
106
|
+
`unavailable` reason instead of disappearing, and the other profiles are reported
|
|
107
|
+
normally. `tabs` is absent rather than empty for such a task, so nothing claims a
|
|
108
|
+
stale tab is live. Source: `cli/src/lib/browser/service.ts`.
|
|
109
|
+
- **`browser status` reads Arc once per pass instead of once per tab (PHNX-3999).** A
|
|
110
|
+
profile with 28 tasks paid one AppleScript round trip per owned tab, plus one
|
|
111
|
+
liveness probe per saved Arc runtime while reconnecting, so a cold `status` spent
|
|
112
|
+
dozens of serialized round trips before printing anything. It now takes a single
|
|
113
|
+
snapshot and a single liveness probe for the entire pass, shared across every Arc
|
|
114
|
+
profile, and never contacts Arc at all when no Arc profile is present. Actions are
|
|
115
|
+
unchanged and still read Arc live per tab. Source: `cli/src/lib/browser/service.ts`.
|
|
116
|
+
|
|
117
|
+
- **grok signs in through its device-code flow.** `agents accounts add grok`, `agents accounts login grok#<name>`, and the logged-out hint all run `grok login --device-auth`. Bare `grok login` defaults to `--oauth`, the loopback browser flow, which opens whatever browser profile the OS defaults to. The device-code screen prints the URL and code instead, so the human finishes the sign-in in the browser profile they choose — which is what makes it usable over an SSH shell on a worker. Source: `cli/src/lib/harness-auth-capabilities.ts`, `cli/src/lib/signin-badge.ts`.
|
|
118
|
+
|
|
119
|
+
- **A feed snapshot larger than the reader budget now reaches the reader whole (PHNX-3999).**
|
|
120
|
+
The daemon's shared feed socket wrote each envelope in one `socket.write` and dropped the
|
|
121
|
+
reader the moment its unflushed bytes passed 4 MiB — so a healthy Menu or `agents feed
|
|
122
|
+
watch --json` client attaching to a fleet whose reset exceeded that got 8 KiB of it, no
|
|
123
|
+
newline, then EOF, and the CLI exited 0 as if the fleet were empty. Each connection now has
|
|
124
|
+
one ordered writer that streams the snapshot before any live event in 64 KiB chunks paced
|
|
125
|
+
by the socket's own `'drain'`. A reader is dropped only when it stays more than 4 MiB of
|
|
126
|
+
live events behind for 2 s, or leaves a chunk unaccepted for 30 s — a burst of peer resets
|
|
127
|
+
to a healthy reader is never a drop. The client rejects any close it did not ask for,
|
|
128
|
+
naming a mid-frame truncation, and a throwing consumer fails that same promise instead of
|
|
129
|
+
escaping as an uncaught exception. Source: `cli/src/lib/feed/hub-server.ts`.
|
|
130
|
+
|
|
131
|
+
- **Browser setup installs Browser CLI 0.1.5 (PHNX-3999).** New installations
|
|
132
|
+
include the status fix that reports unavailable Arc tasks without hiding healthy
|
|
133
|
+
profiles and reads visible Arc tabs once per status request. Existing browser
|
|
134
|
+
installations are preserved; upgrade them explicitly with
|
|
135
|
+
`npm install -g @phnx-labs/browser-cli@0.1.5`. (0.1.5 is a clean re-cut of the
|
|
136
|
+
partially-published 0.1.4; same behavior.)
|
|
137
|
+
|
|
138
|
+
- **Removed `agents devices login` (a.k.a. "fleet login").** The remote device-code login orchestration could not work in the account-slot model — a box may hold several accounts per harness, and a per-box native login has no way to say which account it is signing in. It is gone entirely (not deprecated-and-hidden). Accounts are provisioned from durable worker credentials (`agents accounts add/login <harness>#<name>`); a token-less harness (kimi/antigravity) logs in per box — run the harness on that device and complete its native login. Logged-out hints for per-device harnesses now point at that path instead. Source: `cli/src/commands/ssh.ts`, `cli/src/lib/fleet/auth-sync.ts`, `cli/src/lib/signin-badge.ts`, `cli/src/lib/accounts/add.ts`, `cli/src/lib/auth-mint.ts`.
|
|
139
|
+
|
|
140
|
+
## 1.22.115
|
|
141
|
+
|
|
142
|
+
- **Artifact sharing moved out to the standalone `artifacts` CLI (breaking).**
|
|
143
|
+
`agents artifacts`, `agents artifacts share` (and its `list`/`delete`/`open`/
|
|
144
|
+
`visibility`/`edit`/`revisions`/`update`/`setup`/`join`/`status`/`analytics`
|
|
145
|
+
subcommands), and `agents artifacts setup` are removed — artifact sharing now
|
|
146
|
+
lives entirely in `@phnx-labs/artifacts-cli` (`artifacts share …`,
|
|
147
|
+
`artifacts auth login`), mirroring the secrets (PHNX-3989) and computer
|
|
148
|
+
(PHNX-4075) extractions. Install it with `npm i -g @phnx-labs/artifacts-cli`.
|
|
149
|
+
`agents sessions share <id>` stays — it
|
|
150
|
+
renders the session locally and now publishes through `artifacts share`, so it
|
|
151
|
+
needs that CLI installed. `agents traces` and `agents sessions export`/`backup`
|
|
152
|
+
are unaffected (their own Cloudflare/R2 paths). The ordinary CLI release no
|
|
153
|
+
longer deploys the managed share Worker (`--deploy-worker` is gone); that deploy
|
|
154
|
+
moved to artifacts-cli's own release. Source: removed `cli/src/lib/share/` and
|
|
155
|
+
`cli/src/commands/{artifacts,artifacts-setup,share}.ts`; the generic Cloudflare
|
|
156
|
+
provisioning primitives `agents traces`/`agents sessions backup` borrowed now
|
|
157
|
+
live in `cli/src/lib/cloudflare/provision.ts`.
|
|
158
|
+
|
|
159
|
+
- **Browser tasks and computer runs ride the feed stream, and N readers now cost one
|
|
160
|
+
connection per peer (PHNX-3999).** `agents feed watch --json` carries a third row
|
|
161
|
+
kind alongside agents and attention: canonical tool rows for each browser task and
|
|
162
|
+
computer run, with the driven device, the owning agent session, captures, and — for
|
|
163
|
+
a still-bound browser task only — the commands that show a tab or close the task.
|
|
164
|
+
Switching an All/Agents/Browser/Computer filter launches no commands: every row for
|
|
165
|
+
every tab is already on the one stream. Computer runs are ledger history: they report `live: false` and carry no
|
|
166
|
+
stop/close affordance, because the process that performed them has exited. Task URLs
|
|
167
|
+
are redacted (userinfo stripped, credential-shaped query parameters replaced) before
|
|
168
|
+
they leave the producing machine. Source: `cli/src/lib/feed/tools.ts`,
|
|
169
|
+
`cli/src/lib/feed/tool-activity.ts`.
|
|
170
|
+
- **One shared fleet feed collector, owned by the daemon (PHNX-3999).** `watchFleetFeed`
|
|
171
|
+
opened a persistent `ssh <peer> agents feed watch --json --local` per dialable
|
|
172
|
+
device *per caller*, so three readers on a thirteen-device fleet held thirty-nine
|
|
173
|
+
ssh children carrying byte-identical NDJSON. The new `feed-stream` daemon service
|
|
174
|
+
runs exactly one fan-out and serves every reader over a socket; a late reader is
|
|
175
|
+
brought up to date from held per-scope state with no re-dial, and the fan-out is
|
|
176
|
+
demand-gated so a box with no reader open holds no peer connections at all.
|
|
177
|
+
`agents feed watch --json --local` is unchanged — it is the per-machine stream the
|
|
178
|
+
collector itself subscribes to. Source: `cli/src/lib/feed/hub.ts`,
|
|
179
|
+
`cli/src/lib/daemon/feed-stream-service.ts`.
|
|
180
|
+
- **The standalone browser and computer engines are read at their real source
|
|
181
|
+
(PHNX-3999).** The standalone `computer` engine always appends to its own
|
|
182
|
+
`<cache>/computer/actions/<day>.jsonl`, which never reaches agents-cli's
|
|
183
|
+
recorder — so a `computer` command run directly was invisible to every
|
|
184
|
+
agents-cli surface. `agents computer sessions` and the feed now merge that
|
|
185
|
+
ledger, deduped on `invocationId` (forwarding rewrites `ts`/`pid`, so a
|
|
186
|
+
timestamp dedupe double-counts), and attribute a record the producer left
|
|
187
|
+
unidentified to the machine whose ledger it came from instead of `unknown`.
|
|
188
|
+
Live browser tasks are read from `tasks.json`, so a task that has produced no
|
|
189
|
+
capture yet now appears — with its real tabs, and a `show`/`close` command that
|
|
190
|
+
names the host to run it on. Source: `cli/src/lib/computer/sessions-list.ts`,
|
|
191
|
+
`cli/src/lib/feed/tool-activity.ts`.
|
|
192
|
+
- **Tool setup readiness rides the feed (PHNX-3999).** `reset.setup` and
|
|
193
|
+
`setup.snapshot` carry each device's browser/computer/secrets readiness from the
|
|
194
|
+
setup cache, so a Settings surface needs no per-tool polling and no probe of its
|
|
195
|
+
own. Source: `cli/src/lib/feed/watch.ts`.
|
|
196
|
+
- **A long-offline peer is retired instead of dialed forever (PHNX-3999).** The 60 s
|
|
197
|
+
backoff cap bounded the delay but not the total work: a box off for a weekend was
|
|
198
|
+
dialed every 60 s for two days. After ten consecutive failures the re-dial drops to
|
|
199
|
+
15 minutes, still waking immediately on a device-registry change. Source:
|
|
200
|
+
`cli/src/lib/session/remote/peer-stream.ts`.
|
|
201
|
+
- **`agents ssh --argv` delivers exact argv tokens (PHNX-3999).** The remote command
|
|
202
|
+
was assembled by joining tokens with a space, so any token containing a space or a
|
|
203
|
+
shell metacharacter was destroyed on the way to the peer — `--title "two words"`
|
|
204
|
+
arrived as two arguments and `a & b` arrived as a backgrounded command. Pass
|
|
205
|
+
`--argv '["prog","two words","a & b"]'` to deliver each element as exactly one
|
|
206
|
+
token. The positional form is unchanged and still parsed by the remote shell, so
|
|
207
|
+
the two are mutually exclusive. On Windows, where a process receives one string
|
|
208
|
+
and splits it itself, a native target is launched through `System.Diagnostics.Process`
|
|
209
|
+
with a `CommandLineToArgvW`-escaped argument string and a script or `.cmd`
|
|
210
|
+
launcher is invoked with a splatted array — PowerShell 5.1's own native
|
|
211
|
+
serializer drops an empty argument and eats embedded quotes. The Agents CLI itself
|
|
212
|
+
is launched through its package's declared entry rather than the npm `agents.ps1`
|
|
213
|
+
shim, because that shim splats its own `$args` into native `node.exe` and lost the
|
|
214
|
+
arguments one layer deeper — a quoted device name reached the parser unquoted. The
|
|
215
|
+
fleet-provenance
|
|
216
|
+
prefix is composed around the quoted argv rather than inside it; quoting it twice
|
|
217
|
+
broke any actor value containing a space or a quote. Source:
|
|
218
|
+
`cli/src/lib/devices/connect.ts`.
|
|
219
|
+
- **`agents browser show <path> --device <host>` views a capture held on another
|
|
220
|
+
machine (PHNX-3999).** The file is fetched into a private local path (0600 inside a
|
|
221
|
+
0700 dir), bounded as it streams so an oversized file is refused rather than
|
|
222
|
+
transferred, and then opened with the normal local viewer — nothing is opened on
|
|
223
|
+
the remote box. `--device` here names where the FILE is; it requires an absolute
|
|
224
|
+
path and is refused together with a URL. Transport uses the device's canonical
|
|
225
|
+
auth, so a password-auth box and an explicit identity file both work, and the read
|
|
226
|
+
is platform-correct: POSIX gets `cat`, while Windows gets a .NET binary stream
|
|
227
|
+
because `cat` there is a text reader that corrupts a capture. Source:
|
|
228
|
+
`cli/src/commands/browser.ts`.
|
|
229
|
+
- **Setup from the menu uses a real terminal.** `agents setup browser|computer|secrets --terminal` hands interactive onboarding to the existing terminal engine and reports launch errors. Installation and readiness remain separate; only explicit checks run health probes, and concurrent checks share one probe.
|
|
230
|
+
|
|
231
|
+
- **AGI Menu 1.5.0 adds tool sessions and Setup.** The menu separates Agents, Browser and Computer activity, shows browser controls and recorded computer captures, and reports installation and readiness for Browser, Computer and Secrets CLI. It consumes the shared daemon feed without periodic tool subprocesses. The helper floor selects the signed and notarized `menubar/v1.5.0` release.
|
|
232
|
+
|
|
233
|
+
- **Daemon startup preserves surviving local browsers (PHNX-3999).** The startup
|
|
234
|
+
reaper keeps a live local browser's runtime and task records when its previous
|
|
235
|
+
daemon has exited. Dead process records and stale SSH tunnels are handled
|
|
236
|
+
separately. Ownership changes only after an identity-checked reattach succeeds,
|
|
237
|
+
preserving the original launch metadata. Reconnection requires an existing
|
|
238
|
+
debugging port: `--remote-debugging-pipe` handles belong to the original service
|
|
239
|
+
process and cannot transfer to a replacement daemon. Coordinate release of an
|
|
240
|
+
active pipe-connected browser before restarting its daemon.
|
|
241
|
+
- **Browser setup selects standalone Browser CLI 0.1.3.** The default package for
|
|
242
|
+
`agents setup browser --install-only` now includes the browser preservation and
|
|
243
|
+
task-restoration fixes. Existing installations and configured CLI manifests
|
|
244
|
+
retain their current behavior.
|
|
245
|
+
|
|
246
|
+
- **BREAKING — deprecated command shims are deleted; every surface has one spelling.** The hidden and warned aliases that kept "still works this release" paths alive are gone, not tombstoned: a script that still calls one now gets commander's `unknown command` / `unknown option` and exits non-zero. Removed → replacement: `agents notify` → `agents send --to owner` (or `agents feed post --level important` for a milestone that should reach the owner; a `feed.broadcast` sink that spawned `agents notify "{message}"` becomes `channel: owner`); `agents doctor --fix` → `agents sync <agent>@all` (doctor is diagnose-only); `agents accounts connect|name|label|attach|detach|switch|set-default` and the hidden `agents accounts mint` / `agents auth mint` → `agents accounts add <harness> [name]`, `agents accounts login <harness>#<name>`, `agents accounts default <harness> [name]`, `agents accounts rename`, and `agents run <harness>#<name>` (accounts select by name; installation bindings are gone); `agents sessions go` → `agents sessions resume --attach-only`; `agents sessions attach` and `agents reconnect` / `agents sessions reconnect` → `agents sessions resume [id]`; `agents repo refresh` → `agents sync`; `agents mcp register` → `agents sync --mcp`; `agents memory sync` → `agents sync --memory`; `agents plugins sync <name>` → `agents sync --plugin <name>`; `agents skills info` → `agents skills view`; `agents run --smart` → `agents run --device auto`; `agents events --audit` → `agents events audit` or `--include ops`; `agents devices prefer|unprefer <name>` → `agents devices config <name> auto-launch.preferred on|--unset`; `agents devices set-interactive [name]` → `agents config set interactive.host <name>` (or `agents devices config <name> interactive.host <name>`); `agents devices configure|note|set <name>` → `agents devices config <name> <key> <value>`. `agents devices enable|disable <name>` stay as first-class, visible sugar over `auto-launch.enabled` (no deprecation notice). Folding `mcp register` into `agents sync` also closed a gap in the replacement: sync's reconcile stage skipped every HTTP MCP server declared in `agents.yaml` (`refresh.ts` `continue`d on `transport: http`) while the removed command registered it — it now registers HTTP servers through the same `registerMcpToTargets` path (`codex mcp add <name> --url <url>`), and the yaml-resource writer's Codex arm no longer silently no-ops on HTTP either (`installMcpViaCodex`). Source: `cli/src/commands/send.ts`, `doctor.ts`, `accounts.ts`, `auth.ts`, `go.ts`, `sessions.ts`, `repo.ts`, `mcp.ts`, `memory.ts`, `plugins.ts`, `skills.ts`, `exec.ts`, `events.ts`, `ssh.ts`, `cli/src/lib/smart-launch.ts`.
|
|
247
|
+
|
|
3
248
|
## 1.22.114
|
|
4
249
|
|
|
5
250
|
- **`agents projects prs <project>` — every open PR across a project's repos (PHNX-3999).** Reads the whole open PR board (drafts included, no author filter) straight from GitHub over REST, paginated, for the project's own attached repos only — unlike `projects status`, whose `openPrs` only carries PRs the fleet's sessions opened. `--repo <owner/repo>` restricts to one attached repo; `--repo … --number <n>` lazily enriches exactly that PR with its head-SHA checks and reviewDecision. A per-repo fetch failure is reported and marks the result partial, never relabeled as zero open PRs. Source: `cli/src/lib/github/project-prs.ts`, `cli/src/commands/projects.ts`.
|
package/README.md
CHANGED
|
@@ -53,7 +53,7 @@ agents setup status # readiness for browser, computer, fleet,
|
|
|
53
53
|
agents run claude "explain this repo" # run any agent on your existing subscription
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
Everything here — and every other command in this README — is free and needs no account; the optional `agents auth login` unlocks the hosted surfaces — [team spaces](#sign-in) and managed
|
|
56
|
+
Everything here — and every other command in this README — is free and needs no account; the optional `agents auth login` unlocks the hosted surfaces — [team spaces](#sign-in) and managed trace sync (`agents traces sync` with no Cloudflare setup). `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, term, fleet, 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.
|
|
57
57
|
|
|
58
58
|
The command surface teaches setup through `agents setup` and group-level `--help`.
|
|
59
59
|
The durable system model starts at [`cli/docs/README.md`](cli/docs/README.md).
|
|
@@ -943,8 +943,8 @@ agents plugins add hivemind@https://github.com/activeloopai/hivemind.git
|
|
|
943
943
|
agents plugins add ./my-plugin
|
|
944
944
|
|
|
945
945
|
# Apply to one agent (default version) or all supported
|
|
946
|
-
agents
|
|
947
|
-
agents
|
|
946
|
+
agents sync --plugin rush-toolkit claude
|
|
947
|
+
agents sync --plugin rush-toolkit
|
|
948
948
|
```
|
|
949
949
|
|
|
950
950
|
A plugin is a directory with a manifest:
|
|
@@ -972,7 +972,7 @@ agents plugins add hivemind@https://github.com/activeloopai/hivemind.git \
|
|
|
972
972
|
--allow-exec-surfaces
|
|
973
973
|
|
|
974
974
|
# Same gate on re-sync (e.g., after upstream updates)
|
|
975
|
-
agents
|
|
975
|
+
agents sync --plugin hivemind claude --allow-exec-surfaces
|
|
976
976
|
```
|
|
977
977
|
|
|
978
978
|
Skills, commands, and subagents are declarative and never trip the gate. The gate is per-plugin, per-install: consenting to hivemind doesn't grant blanket exec-surface trust to anything else.
|
|
@@ -1150,7 +1150,7 @@ agents browser profiles create cloud \
|
|
|
1150
1150
|
|
|
1151
1151
|
## Sign in
|
|
1152
1152
|
|
|
1153
|
-
Signing in is **optional**. Every local feature — `agents run`, sessions, teams, fleet dispatch, secrets, browser, computer — works with no account. Signing in unlocks the hosted surfaces: **team spaces** (`agents auth space`) and **managed
|
|
1153
|
+
Signing in is **optional**. Every local feature — `agents run`, sessions, teams, fleet dispatch, secrets, browser, computer — works with no account. Signing in unlocks the hosted surfaces: **team spaces** (`agents auth space`) and **managed trace sync** — `agents traces sync` publishes to our storage with **zero Cloudflare setup**. `agents auth` signs this machine in to **Phoenix ID**, the Phoenix Labs account layer behind these hosted surfaces. Sign-in is Google-only and runs a device-code flow: the CLI shows a code, your browser confirms it, and the CLI picks the session up.
|
|
1154
1154
|
|
|
1155
1155
|
```bash
|
|
1156
1156
|
agents auth login # shows a code, opens a Phoenix-branded page
|
|
@@ -1242,9 +1242,9 @@ is the only way a provider credential crosses machines.
|
|
|
1242
1242
|
|
|
1243
1243
|
Selection order for a run is explicit `--account` / `<harness>#<name>`, then
|
|
1244
1244
|
`accounts default` for that harness, then the harness's native/balanced behavior.
|
|
1245
|
-
The
|
|
1246
|
-
`
|
|
1247
|
-
|
|
1245
|
+
The `connect` / `name` / `label` / `mint` / `attach` / `detach` / `switch` /
|
|
1246
|
+
`set-default` verbs are deleted; use `add` / `login` / `default` /
|
|
1247
|
+
`run <harness>#<name>` instead.
|
|
1248
1248
|
|
|
1249
1249
|
---
|
|
1250
1250
|
|
|
@@ -1281,7 +1281,7 @@ Merge order: profile env < `--secrets` < `--env K=V`. A missing keychain item ab
|
|
|
1281
1281
|
### Cross-machine sync
|
|
1282
1282
|
|
|
1283
1283
|
Secrets are provided by the standalone [`@phnx-labs/secrets-cli`](https://github.com/phnx-labs/secrets-cli)
|
|
1284
|
-
engine (`agents setup secrets`
|
|
1284
|
+
engine (`agents setup secrets` installs it if missing). Its `push`/`pull`
|
|
1285
1285
|
verbs move a bundle between machines by encrypting it and round-tripping it
|
|
1286
1286
|
through `api.prix.dev` — no copy-paste, no `.env` files emailed to yourself:
|
|
1287
1287
|
|
|
@@ -1446,99 +1446,19 @@ Sources: a command's stdout (`--watch` / `--poll`), an HTTP endpoint (`--poll-ht
|
|
|
1446
1446
|
|
|
1447
1447
|
## Share
|
|
1448
1448
|
|
|
1449
|
+
Publishing an agent's HTML output to a shareable link now lives in the standalone
|
|
1450
|
+
`artifacts` CLI (`@phnx-labs/artifacts-cli`), not in `agents`. The `agents artifacts`
|
|
1451
|
+
command group was removed (PHNX-3992), the same split as secrets (PHNX-3989) and
|
|
1452
|
+
computer (PHNX-4075). Sign in and publish with it directly:
|
|
1453
|
+
|
|
1449
1454
|
```bash
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
agents traces setup # provision the private traces Worker + R2 bucket
|
|
1458
|
-
agents artifacts share plan.html --slug fleet --expire 30d # → https://<base>/fleet
|
|
1459
|
-
agents artifacts share plan.html --label "Q3 fleet plan" --meta kind=plan # human title + structured metadata
|
|
1460
|
-
agents artifacts share plan.html --json # URL object for plan-render hooks
|
|
1461
|
-
agents artifacts share list --agent claude # public gallery, filterable
|
|
1462
|
-
agents artifacts share list --meta kind=plan # exact, repeatable metadata filters
|
|
1463
|
-
agents artifacts share list --all # include hidden unlisted/private/me/org pages
|
|
1464
|
-
agents artifacts share list --scope me # just the owner-only pages
|
|
1465
|
-
agents artifacts share edit fleet --label "Final fleet plan" --meta status=final
|
|
1466
|
-
agents artifacts share revisions fleet # prior versions kept under a slug
|
|
1467
|
-
agents artifacts share visibility fleet me # re-scope a published page in place (public|unlisted|me|org)
|
|
1468
|
-
agents artifacts share open fleet # open your page signed in, so its in-page visibility control is live
|
|
1469
|
-
agents artifacts share status # show the endpoint
|
|
1470
|
-
agents artifacts unshare fleet # take a published link (+ its OG cover) down
|
|
1471
|
-
```
|
|
1472
|
-
|
|
1473
|
-
`agents artifacts share` closes the loop: an agent makes work (a plan, a viz, a report),
|
|
1474
|
-
publishes it, and you open the link to see it. **Signed-in users** publish to the
|
|
1475
|
-
already-live managed endpoint (`share.agents-cli.sh/<handle>/…`) with the Phoenix session — no
|
|
1476
|
-
Cloudflare account, bucket, or write token — and `share status` / `list` / `revisions`
|
|
1477
|
-
/ `unshare` talk to that same endpoint. The handle is the local-part of the signed-in
|
|
1478
|
-
email (`muqsitnawaz@gmail.com` → `muqsitnawaz`); the page slug is readable plus a
|
|
1479
|
-
short view-id. HTML is stored as one object: local images are inlined, `file://` TOC
|
|
1480
|
-
links become in-page hashes, so the published page is actually viewable. The managed
|
|
1481
|
-
Worker lazily renders and caches the branded 1200×630 Open Graph card at `<slug>.png`,
|
|
1482
|
-
so publishing from Linux does not require a local Chromium; BYO endpoints keep the
|
|
1483
|
-
local screenshot fallback. `--visibility unlisted` (hidden aliases
|
|
1484
|
-
`--unlisted` / `--private`) is a capability URL: GET still works, the gallery hides it,
|
|
1485
|
-
and the Worker sends `X-Robots-Tag: noindex`. `--protected` (`--visibility private`)
|
|
1486
|
-
is token-gated: the published URL carries a secret `?k=` key (`Authorization: Bearer`
|
|
1487
|
-
is accepted too) and GET returns 404 without it — treat the whole link as a secret.
|
|
1488
|
-
`--visibility me` is visible only to
|
|
1489
|
-
you (the signed-in owner); `--visibility org` is visible to anyone at your email
|
|
1490
|
-
**domain** — derived from your own address, so it needs a **workspace** Google
|
|
1491
|
-
account and is refused on a public-inbox domain (`gmail.com`, `outlook.com`,
|
|
1492
|
-
`icloud.com`, …). Both need a Phoenix session and are identity-gated at read time (a
|
|
1493
|
-
stranger is redirected to sign in, then 404s). `share visibility <target> <level>`
|
|
1494
|
-
re-scopes an **already-published** page in place — the slug/URL is preserved and the
|
|
1495
|
-
body is untouched (a metadata-only change, like `share edit`, so no revision) — so you
|
|
1496
|
-
can promote a draft to `public` or pull a link back to `me`/`org` without re-publishing
|
|
1497
|
-
(`me`/`org` need a Phoenix session; `org` needs a workspace domain). The served page
|
|
1498
|
-
also carries an **in-page visibility control** — a chip you can switch right on the page
|
|
1499
|
-
— but it is interactive only for the signed-in owner, and a plain link has no login;
|
|
1500
|
-
`share open <target>` mints a short-lived, single-use login ticket and opens your page
|
|
1501
|
-
with it so the chip becomes a live dropdown. Sign-in is a
|
|
1502
|
-
single **Phoenix ID** (Google-only device-code OAuth, `agents auth login`) — see
|
|
1503
|
-
[`docs/share.md`](cli/docs/share.md) for the full identity + visibility model.
|
|
1504
|
-
**BYO Cloudflare** remains: `setup` reads
|
|
1505
|
-
a Cloudflare API token from your `cloudflare.com` secrets bundle (or `--token`), creates
|
|
1506
|
-
an R2 bucket, uploads a tiny Worker, and enables the free `*.workers.dev` subdomain (or
|
|
1507
|
-
maps `--domain share.example.com` when the token owns the zone). Writes are bearer-gated
|
|
1508
|
-
**through** the Worker (Phoenix bearer or static `WRITE_TOKEN`); public and unlisted
|
|
1509
|
-
reads are **public** so a link outlives the agent, while `--protected` token-gates
|
|
1510
|
-
reads on BYO too. R2 has zero egress + a 10 GB free tier, so BYO is still
|
|
1511
|
-
effectively free.
|
|
1512
|
-
|
|
1513
|
-
**Fleet mode:** provision one endpoint, then every fleet / cloud / ephemeral agent
|
|
1514
|
-
publishes through it with a shared write token — `agents artifacts share join <baseUrl>` uses an
|
|
1515
|
-
existing endpoint with no provisioning. `--expire 30d|12h|<date>` auto-expires a link.
|
|
1516
|
-
`--json` emits `{ url, coverUrl, expiresAt, visibility, unlisted?, label, labelSource }` so plan-render automation can
|
|
1517
|
-
publish the rendered HTML and post the returned link without scraping terminal text.
|
|
1518
|
-
|
|
1519
|
-
**Every share carries provenance and a title.** Agent/session/host/repo/date are
|
|
1520
|
-
captured automatically from the exec env and git — never invented, only sent when
|
|
1521
|
-
present. `--label`/`--title` names a share (else one is derived from the HTML
|
|
1522
|
-
`<title>`, frontmatter, or filename, with a nudge — never a blocking prompt); `--meta
|
|
1523
|
-
key=value` attaches structured metadata (`kind`, `project`, `ticket`, `status`, ...).
|
|
1524
|
-
`agents artifacts share list --agent <name> | --session <id> | --label-contains <substr>
|
|
1525
|
-
| --meta <key=value>` filters by provenance, title, or exact structured metadata, so
|
|
1526
|
-
the listing is a real "what have I shared" gallery, not just slugs. By default it mirrors
|
|
1527
|
-
the public gallery; `--scope unlisted|me|org` (or `--all`) includes your hidden pages and
|
|
1528
|
-
marks each row with its visibility so you can tell public from private at a glance.
|
|
1529
|
-
`agents artifacts share edit <slug>` changes only the label/arbitrary metadata in place:
|
|
1530
|
-
the URL, exact body, HTTP metadata, publication time, visibility, expiry, provenance,
|
|
1531
|
-
cover, and revision history stay unchanged.
|
|
1532
|
-
Republishing an existing slug keeps the prior version as a revision by default
|
|
1533
|
-
(`--no-revision` to skip); `agents artifacts share revisions <slug>` shows the retained
|
|
1534
|
-
history, newest first.
|
|
1535
|
-
|
|
1536
|
-
`agents artifacts share delete <targets...>` (alias `agents artifacts unshare`) takes a page down — pass a
|
|
1537
|
-
full URL, `<user>/<slug>`, or a bare slug (resolved against your own namespace); several
|
|
1538
|
-
targets at once are fine. It also deletes the sibling `<slug>.png` OG cover by default
|
|
1539
|
-
(`--keep-cover` opts out) and verifies the page actually 404s before reporting success —
|
|
1540
|
-
the Worker's delete is idempotent, so `{"ok":true}` alone is never proof.
|
|
1541
|
-
See the publication boundary in [observability](cli/docs/observability.md).
|
|
1455
|
+
artifacts auth login # Phoenix ID device-code sign-in
|
|
1456
|
+
artifacts share plan.html # publish the HTML and print the link
|
|
1457
|
+
```
|
|
1458
|
+
|
|
1459
|
+
`agents sessions share <id>` stays in this CLI: it renders a session transcript to
|
|
1460
|
+
HTML locally, then shells out to `artifacts share` to publish it, so a conversation
|
|
1461
|
+
becomes a shareable link the same way any other artifact does.
|
|
1542
1462
|
|
|
1543
1463
|
---
|
|
1544
1464
|
|
|
@@ -1777,7 +1697,7 @@ Claude Code, Codex CLI, Antigravity, Grok Build, and others each have their own
|
|
|
1777
1697
|
|
|
1778
1698
|
### Is it free?
|
|
1779
1699
|
|
|
1780
|
-
Yes — every feature, with no account and no signup. `agents run`, sessions, teams, fleet dispatch, secrets, browser, and computer automation all work the moment you install. The optional `agents auth login` unlocks the hosted surfaces — team spaces (`agents auth space`) and managed
|
|
1700
|
+
Yes — every feature, with no account and no signup. `agents run`, sessions, teams, fleet dispatch, secrets, browser, and computer automation all work the moment you install. The optional `agents auth login` unlocks the hosted surfaces — team spaces (`agents auth space`) and managed trace sync (`agents traces sync`, no Cloudflare setup); there are no paid tiers. This developer tool is entirely free because we believe developers should have the best tools — fast and robust — so they can create the best products for their users.
|
|
1781
1701
|
|
|
1782
1702
|
### Is this like `nvm` / `mise` / `asdf` for AI agents?
|
|
1783
1703
|
|
package/dist/browser.js
CHANGED
|
File without changes
|
|
@@ -49,7 +49,6 @@ const loadMonitors = async () => (await import('../commands/monitors.js')).regis
|
|
|
49
49
|
const loadProjects = async () => (await import('../commands/projects.js')).registerProjectsCommands;
|
|
50
50
|
export const loadRun = async () => (await import('../commands/exec.js')).registerRunCommand;
|
|
51
51
|
const loadOpen = async () => (await import('../commands/open.js')).registerOpenCommand;
|
|
52
|
-
const loadReconnect = async () => (await import('../commands/reconnect.js')).registerReconnectCommand;
|
|
53
52
|
const loadFork = async () => (await import('../commands/fork.js')).registerForkCommand;
|
|
54
53
|
const loadConfig = async () => (await import('../commands/config.js')).registerConfigCommand;
|
|
55
54
|
const loadModels = async () => (await import('../commands/models.js')).registerModelsCommand;
|
|
@@ -89,8 +88,6 @@ const loadMessage = async () => (await import('../commands/message.js')).registe
|
|
|
89
88
|
const loadSend = async () => (await import('../commands/send.js')).registerSendCommand;
|
|
90
89
|
const loadFeed = async () => (await import('../commands/feed.js')).registerFeedCommand;
|
|
91
90
|
const loadMailboxes = async () => (await import('../commands/mailboxes.js')).registerMailboxesCommand;
|
|
92
|
-
// Registers the `artifacts` group (`share` + `setup` + nested `unshare`).
|
|
93
|
-
const loadArtifacts = async () => (await import('../commands/artifacts.js')).registerArtifactsCommands;
|
|
94
91
|
const loadWebhooks = async () => (await import('../commands/webhook.js')).registerWebhooksCommand;
|
|
95
92
|
const loadHumans = async () => (await import('../commands/humans.js')).registerHumansCommands;
|
|
96
93
|
const loadAccounts = async () => (await import('../commands/accounts.js')).registerAccountsCommand;
|
|
@@ -108,7 +105,6 @@ export const loadReminders = async () => (await import('../commands/reminders.js
|
|
|
108
105
|
// `roster` was a sessions --active alias — removed; use sessions --active.
|
|
109
106
|
export const LAZY_COMMAND_NAMES = new Set([
|
|
110
107
|
'sessions',
|
|
111
|
-
'reconnect',
|
|
112
108
|
'teams',
|
|
113
109
|
'cloud',
|
|
114
110
|
'message',
|
|
@@ -165,7 +161,6 @@ export const COMMAND_LOADERS = {
|
|
|
165
161
|
// tokens must lazy-load the same module so either resolves. See commands/open.ts.
|
|
166
162
|
_callback: [loadOpen],
|
|
167
163
|
open: [loadOpen],
|
|
168
|
-
reconnect: [loadReconnect],
|
|
169
164
|
fork: [loadFork],
|
|
170
165
|
config: [loadConfig],
|
|
171
166
|
models: [loadModels],
|
|
@@ -210,11 +205,9 @@ export const COMMAND_LOADERS = {
|
|
|
210
205
|
cloud: [loadCloud],
|
|
211
206
|
message: [loadMessage],
|
|
212
207
|
send: [loadSend],
|
|
213
|
-
notify: [loadSend],
|
|
214
208
|
feed: [loadFeed],
|
|
215
209
|
mailboxes: [loadMailboxes],
|
|
216
210
|
mailbox: [loadMailboxes],
|
|
217
|
-
artifacts: [loadArtifacts],
|
|
218
211
|
webhooks: [loadWebhooks],
|
|
219
212
|
humans: [loadHumans],
|
|
220
213
|
daemon: [loadDaemon],
|
|
@@ -1,45 +1,7 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
2
|
import type { AgentId } from '../lib/types.js';
|
|
3
|
-
import { collectRunCandidates, type RotateCandidate } from '../lib/accounting/rotate.js';
|
|
4
|
-
import { type Profile } from '../lib/profiles.js';
|
|
5
3
|
import { type NativeAccountCatalogRow, type ProviderAccountCatalogRow } from '../lib/account-catalog.js';
|
|
6
4
|
import { type UnifiedAccount } from '../lib/account-registry.js';
|
|
7
|
-
export declare function nativeIdentityFromSource(raw: string): Promise<{
|
|
8
|
-
agent: AgentId;
|
|
9
|
-
version: string;
|
|
10
|
-
identityKey: string;
|
|
11
|
-
identityLabel?: string;
|
|
12
|
-
scope: 'version' | 'device';
|
|
13
|
-
}>;
|
|
14
|
-
type AttachTarget = {
|
|
15
|
-
kind: 'installation';
|
|
16
|
-
agent: AgentId;
|
|
17
|
-
version: string;
|
|
18
|
-
} | {
|
|
19
|
-
kind: 'device-agent';
|
|
20
|
-
agent: AgentId;
|
|
21
|
-
} | {
|
|
22
|
-
kind: 'profile';
|
|
23
|
-
profile: Profile;
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* Classify + validate an attach target, rejecting a typo BEFORE any binding is
|
|
27
|
-
* written: it must be an existing custom-harness profile, an installed
|
|
28
|
-
* `agent@version`, or a known harness id.
|
|
29
|
-
*/
|
|
30
|
-
export declare function classifyAttachTarget(target: string): AttachTarget;
|
|
31
|
-
/**
|
|
32
|
-
* Persist the attached setup-token to a per-version `.oauth_token` file so an
|
|
33
|
-
* INTERACTIVE Claude launch on a keychain-less Linux worker can authenticate from it.
|
|
34
|
-
* Headless runs inject the token via `buildExecEnv`. Since PHNX-3502 an interactive
|
|
35
|
-
* launch on a worker-role device ALSO injects it through `claudeAdapter.applyExecConfigEnv`
|
|
36
|
-
* (only a headed `personal`/`desktop` device defers to its per-version native login), and
|
|
37
|
-
* the shim's Linux fallback (`claudeAdapter.shimConfigEnvBash`) reads exactly this file —
|
|
38
|
-
* so writing it is what makes a freshly-attached setup-token visible to that shim fallback
|
|
39
|
-
* on a worker. macOS keeps the credential in the keychain, so `resolveClaudeSetupToken`
|
|
40
|
-
* returns null there and this is a no-op off Linux.
|
|
41
|
-
*/
|
|
42
|
-
export declare function writeClaudeInteractiveOauthToken(target: AttachTarget, targetAgent: AgentId, email?: string): void;
|
|
43
5
|
export declare function parseBundleKey(raw: string): {
|
|
44
6
|
bundle: string;
|
|
45
7
|
key: string;
|
|
@@ -49,52 +11,17 @@ export declare function renderAccountList(native: NativeAccountCatalogRow[], pro
|
|
|
49
11
|
harness?: AgentId;
|
|
50
12
|
localDevice?: string;
|
|
51
13
|
}): string;
|
|
52
|
-
/**
|
|
53
|
-
export interface LabelIdentity {
|
|
54
|
-
identityKey: string;
|
|
55
|
-
email: string | null;
|
|
56
|
-
versions: string[];
|
|
57
|
-
isDefault: boolean;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Fold signed-in run candidates into distinct identities — the unit a label
|
|
61
|
-
* binds to. The same account signed into several versions is ONE row, so a
|
|
62
|
-
* multi-version single-account harness never demands a selector. Candidates
|
|
63
|
-
* with no stable identity (no accountKey, no email) are dropped: there is
|
|
64
|
-
* nothing durable for a label to bind to. Default-version identity first.
|
|
65
|
-
*/
|
|
66
|
-
export declare function groupLabelIdentities(candidates: Pick<RotateCandidate, 'version' | 'email' | 'accountKey'>[], defaultVersion: string | null): LabelIdentity[];
|
|
67
|
-
export type LabelSelection = {
|
|
68
|
-
kind: 'selected';
|
|
69
|
-
identity: LabelIdentity;
|
|
70
|
-
} | {
|
|
71
|
-
kind: 'ambiguous';
|
|
72
|
-
identities: LabelIdentity[];
|
|
73
|
-
};
|
|
74
|
-
/**
|
|
75
|
-
* Resolve which signed-in login a bare-harness `accounts label` call means.
|
|
76
|
-
* `collect` is injectable (the `resolveRunVersion` pattern) so tests drive the
|
|
77
|
-
* real selection path against fixture candidates.
|
|
78
|
-
*/
|
|
79
|
-
export declare function resolveLabelIdentity(agent: AgentId, accountSelector: string | undefined, collect?: typeof collectRunCandidates): Promise<LabelSelection>;
|
|
80
|
-
/**
|
|
81
|
-
* Body of `accounts label`, exported with the injectable candidate collector
|
|
82
|
-
* so tests exercise everything but the TTY prompt itself.
|
|
83
|
-
*/
|
|
84
|
-
export declare function runAccountsLabel(source: string, label: string | undefined, opts: {
|
|
85
|
-
account?: string;
|
|
86
|
-
}, collect?: typeof collectRunCandidates): Promise<void>;
|
|
87
|
-
/** Named accounts that `set-default` / `switch` can pin for this harness. */
|
|
14
|
+
/** Named accounts that `accounts default` can pin for this harness. */
|
|
88
15
|
export declare function listSwitchableAccounts(agent: AgentId): Promise<UnifiedAccount[]>;
|
|
89
16
|
/**
|
|
90
|
-
* Pin the per-harness default
|
|
17
|
+
* Pin the per-harness default — the `accounts default` write path.
|
|
91
18
|
* Provider accounts must authenticate the harness; native accounts must belong to it.
|
|
92
19
|
*/
|
|
93
20
|
export declare function setDefaultAccount(agentRaw: string, name: string): {
|
|
94
21
|
agent: AgentId;
|
|
95
22
|
account: UnifiedAccount;
|
|
96
23
|
};
|
|
97
|
-
export declare function
|
|
24
|
+
export declare function runAccountsDefault(harness: string, accountName: string | undefined, opts: {
|
|
98
25
|
json: boolean;
|
|
99
26
|
}): Promise<void>;
|
|
100
27
|
/**
|
|
@@ -118,4 +45,3 @@ export declare function resolveLogoutTarget(target: string): Promise<{
|
|
|
118
45
|
version: string;
|
|
119
46
|
}>;
|
|
120
47
|
export declare function registerAccountsCommand(program: Command): void;
|
|
121
|
-
export {};
|