@phnx-labs/agents-cli 1.22.57 → 1.22.59

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.
Files changed (152) hide show
  1. package/CHANGELOG.md +294 -0
  2. package/README.md +29 -0
  3. package/dist/bootstrap.js +39 -1
  4. package/dist/commands/accounts.js +7 -3
  5. package/dist/commands/apply.js +10 -2
  6. package/dist/commands/fork.d.ts +23 -10
  7. package/dist/commands/fork.js +115 -58
  8. package/dist/commands/monitors.js +198 -23
  9. package/dist/commands/prune.js +5 -3
  10. package/dist/commands/routines.d.ts +8 -0
  11. package/dist/commands/routines.js +57 -3
  12. package/dist/commands/routines.test-fixture.js +5 -0
  13. package/dist/commands/send.d.ts +2 -1
  14. package/dist/commands/send.js +7 -5
  15. package/dist/commands/sessions-picker.d.ts +11 -0
  16. package/dist/commands/sessions-picker.js +16 -0
  17. package/dist/commands/sessions-stats.js +37 -5
  18. package/dist/commands/sessions.js +40 -5
  19. package/dist/commands/share.d.ts +14 -0
  20. package/dist/commands/share.js +43 -2
  21. package/dist/commands/ssh.js +12 -1
  22. package/dist/commands/status.js +1 -1
  23. package/dist/commands/sync.js +83 -7
  24. package/dist/commands/traces.js +7 -0
  25. package/dist/commands/versions.js +12 -4
  26. package/dist/commands/view.js +7 -2
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +6 -1
  29. package/dist/lib/account-registry.d.ts +5 -1
  30. package/dist/lib/account-registry.js +47 -14
  31. package/dist/lib/accounting/capacity.d.ts +18 -7
  32. package/dist/lib/accounting/capacity.js +19 -8
  33. package/dist/lib/accounting/usage-sync.d.ts +29 -1
  34. package/dist/lib/accounting/usage-sync.js +76 -2
  35. package/dist/lib/accounting/usage.js +7 -1
  36. package/dist/lib/auth-mint.d.ts +11 -1
  37. package/dist/lib/auth-mint.js +21 -6
  38. package/dist/lib/auto-pull-worker.js +7 -2
  39. package/dist/lib/browser/ipc.d.ts +8 -0
  40. package/dist/lib/browser/ipc.js +87 -0
  41. package/dist/lib/browser/service.d.ts +19 -0
  42. package/dist/lib/browser/service.js +96 -11
  43. package/dist/lib/browser/sessions-list.js +10 -1
  44. package/dist/lib/cloud/rush.d.ts +7 -0
  45. package/dist/lib/cloud/rush.js +29 -1
  46. package/dist/lib/daemon/daemon.d.ts +22 -0
  47. package/dist/lib/daemon/daemon.js +39 -0
  48. package/dist/lib/daemon/runner.d.ts +3 -0
  49. package/dist/lib/daemon/runner.js +86 -45
  50. package/dist/lib/daemon/session-index-service.js +9 -1
  51. package/dist/lib/daemon/usage-sync-service.d.ts +3 -3
  52. package/dist/lib/daemon/usage-sync-service.js +14 -8
  53. package/dist/lib/daemon-services.js +1 -1
  54. package/dist/lib/daemon-ticks.d.ts +15 -0
  55. package/dist/lib/daemon-ticks.js +26 -0
  56. package/dist/lib/device-config.d.ts +5 -1
  57. package/dist/lib/device-config.js +2 -2
  58. package/dist/lib/devices/connect.d.ts +17 -8
  59. package/dist/lib/devices/connect.js +31 -14
  60. package/dist/lib/devices/health.js +5 -1
  61. package/dist/lib/devices/pool.d.ts +25 -2
  62. package/dist/lib/devices/pool.js +32 -2
  63. package/dist/lib/devices/stats-cache.d.ts +0 -6
  64. package/dist/lib/devices/stats-cache.js +2 -9
  65. package/dist/lib/doctor-diff.d.ts +14 -0
  66. package/dist/lib/doctor-diff.js +120 -9
  67. package/dist/lib/fleet/manifest.d.ts +17 -0
  68. package/dist/lib/fleet/manifest.js +26 -0
  69. package/dist/lib/git.d.ts +38 -0
  70. package/dist/lib/git.js +58 -0
  71. package/dist/lib/hooks/install.d.ts +27 -11
  72. package/dist/lib/hooks/install.js +42 -17
  73. package/dist/lib/hosts/ready.d.ts +8 -0
  74. package/dist/lib/hosts/ready.js +13 -2
  75. package/dist/lib/hosts/reconnect.d.ts +52 -203
  76. package/dist/lib/hosts/reconnect.js +64 -284
  77. package/dist/lib/installations/migrate.d.ts +6 -120
  78. package/dist/lib/installations/migrate.js +27 -259
  79. package/dist/lib/installations/shims.d.ts +13 -95
  80. package/dist/lib/installations/shims.js +22 -139
  81. package/dist/lib/installations/store.js +1 -1
  82. package/dist/lib/installations/versions.d.ts +43 -133
  83. package/dist/lib/installations/versions.js +94 -206
  84. package/dist/lib/monitors/config.d.ts +71 -3
  85. package/dist/lib/monitors/config.js +100 -12
  86. package/dist/lib/monitors/pid-watch.d.ts +35 -0
  87. package/dist/lib/monitors/pid-watch.js +45 -0
  88. package/dist/lib/monitors/remote.d.ts +18 -0
  89. package/dist/lib/monitors/remote.js +11 -0
  90. package/dist/lib/permissions.js +7 -2
  91. package/dist/lib/plugins/plugins.d.ts +17 -3
  92. package/dist/lib/plugins/plugins.js +84 -9
  93. package/dist/lib/plugins/skills.d.ts +8 -1
  94. package/dist/lib/plugins/skills.js +18 -2
  95. package/dist/lib/pty-server.d.ts +14 -0
  96. package/dist/lib/pty-server.js +49 -5
  97. package/dist/lib/refresh.d.ts +9 -0
  98. package/dist/lib/refresh.js +3 -1
  99. package/dist/lib/routine-readiness.d.ts +15 -1
  100. package/dist/lib/routine-readiness.js +41 -0
  101. package/dist/lib/sandbox.d.ts +4 -1
  102. package/dist/lib/sandbox.js +30 -1
  103. package/dist/lib/secrets/agent.d.ts +80 -225
  104. package/dist/lib/secrets/agent.js +139 -401
  105. package/dist/lib/secrets/bundles.d.ts +73 -222
  106. package/dist/lib/secrets/bundles.js +168 -467
  107. package/dist/lib/secrets/drivers/rush.js +5 -0
  108. package/dist/lib/secrets/reaper.d.ts +28 -70
  109. package/dist/lib/secrets/reaper.js +30 -85
  110. package/dist/lib/secrets/remote.d.ts +42 -129
  111. package/dist/lib/secrets/remote.js +55 -173
  112. package/dist/lib/self-heal/checks/install-staging.d.ts +4 -0
  113. package/dist/lib/self-heal/checks/install-staging.js +96 -0
  114. package/dist/lib/self-heal/registry.js +2 -0
  115. package/dist/lib/self-heal/types.d.ts +1 -1
  116. package/dist/lib/self-update.d.ts +65 -0
  117. package/dist/lib/self-update.js +138 -0
  118. package/dist/lib/session/active.d.ts +13 -1
  119. package/dist/lib/session/active.js +2 -0
  120. package/dist/lib/session/cloud.js +5 -0
  121. package/dist/lib/session/db.d.ts +51 -6
  122. package/dist/lib/session/db.js +266 -20
  123. package/dist/lib/session/fork.d.ts +45 -26
  124. package/dist/lib/session/fork.js +32 -95
  125. package/dist/lib/session/tool-calls.d.ts +43 -1
  126. package/dist/lib/session/tool-calls.js +74 -44
  127. package/dist/lib/session/tool-store.d.ts +33 -2
  128. package/dist/lib/session/tool-store.js +56 -3
  129. package/dist/lib/smart-launch.d.ts +6 -0
  130. package/dist/lib/smart-launch.js +5 -2
  131. package/dist/lib/staleness/writers/plugins.js +5 -2
  132. package/dist/lib/staleness/writers/sources.d.ts +5 -0
  133. package/dist/lib/staleness/writers/sources.js +2 -1
  134. package/dist/lib/staleness/writers/subagents.js +13 -3
  135. package/dist/lib/state.d.ts +7 -4
  136. package/dist/lib/state.js +7 -4
  137. package/dist/lib/subagents.js +8 -2
  138. package/dist/lib/sync-status.d.ts +22 -0
  139. package/dist/lib/sync-status.js +27 -0
  140. package/dist/lib/sync-umbrella.d.ts +9 -0
  141. package/dist/lib/sync-umbrella.js +21 -2
  142. package/dist/lib/teams/scheduler.d.ts +10 -0
  143. package/dist/lib/teams/scheduler.js +8 -0
  144. package/dist/lib/traces/insights.d.ts +47 -14
  145. package/dist/lib/traces/insights.js +92 -21
  146. package/dist/lib/traces/phenotype.d.ts +23 -3
  147. package/dist/lib/traces/phenotype.js +72 -24
  148. package/dist/lib/traces/sync.d.ts +128 -6
  149. package/dist/lib/traces/sync.js +294 -35
  150. package/dist/lib/traces/worker-template.js +154 -1
  151. package/dist/lib/view-types.d.ts +12 -0
  152. package/package.json +2 -2
@@ -1,37 +1,14 @@
1
1
  /**
2
2
  * Remote secrets — read and use `agents secrets` bundles that live on another
3
- * host, over the same hardened SSH path that `agents secrets export --device`
4
- * (the write inverse) already uses.
3
+ * host over the same SSH path that `agents secrets export --device` uses.
5
4
  *
6
- * This is the READ / USE direction:
7
- * - browse: drive the remote `agents secrets list|view` and stream its
8
- * stdout back verbatim (lossless, no parsing).
9
- * - use: resolve a remote bundle to an env map (JSON over ssh stdout) and
10
- * inject it ephemerally — never written to this machine's keychain.
11
- *
12
- * Trust model: relies on the operator's existing SSH access to the host (same
13
- * boundary as `export --device` / `run --device`). Bundle names are shell-quoted
14
- * into the remote command; resolved VALUES return over ssh stdout. File-backend
15
- * import never forwards AGENTS_SECRETS_PASSPHRASE (PHNX-2371). Nothing is
16
- * persisted locally.
5
+ * Browse streams remote stdout verbatim; use resolves a bundle to an env map
6
+ * and injects it ephemerally without persisting it locally.
17
7
  */
18
8
  import { type SshExecResult } from '../ssh-exec.js';
19
9
  /**
20
- * SSH options for a SECRET-carrying transport (RUSH-2527). Every `agents secrets
21
- * --host` operation moves credential bytes — over ssh stdin (push) or ssh stdout
22
- * (resolve/read-back) — so it MUST NOT ride the shared `accept-new` baseline
23
- * against the user's own `~/.ssh/known_hosts` with a reusable control socket.
24
- * Two hardenings over that baseline, matching the posture the `--copy-creds`
25
- * dispatch already uses (`hosts/dispatch.ts` -> `hostKeyCheckingOpts`):
26
- *
27
- * - **Managed pinned host keys.** Verify against the CLI-owned known_hosts
28
- * store (`known-hosts.ts`), not `~/.ssh/known_hosts`. A CHANGED key on a
29
- * known host is refused (`StrictHostKeyChecking` `yes` once pinned,
30
- * `accept-new` before that). Callers that copy durable provider credentials
31
- * must separately require an existing pin before invoking this transport.
32
- * - **No multiplex reuse.** `multiplex: false` — a credential channel never
33
- * leaves a persistent `ControlMaster` socket lingering (60s `ControlPersist`)
34
- * that any other `agents` invocation to that host would silently reuse.
10
+ * SSH options for secret-carrying transport. Pins the managed host key and
11
+ * disables multiplex so no reusable control socket lingers for other invocations.
35
12
  */
36
13
  export declare function credentialTransportSshOpts(target: string): {
37
14
  hostKeyOpts: string[];
@@ -40,37 +17,21 @@ export declare function credentialTransportSshOpts(target: string): {
40
17
  /** Refuse durable credential transfer until the destination SSH key is pinned. */
41
18
  export declare function assertCredentialTransportHostPinned(target: string, pinned?: boolean): void;
42
19
  /**
43
- * Trust boundary for a remote-resolved env map. A peer's `secrets export` output
44
- * is untrusted input: a compromised or misconfigured host could return keys that
45
- * silently reshape THIS process's behavior once merged into the agent env
46
- * (bundles.ts:251 `sanitizeProcessEnv` only strips loader vars from process.env,
47
- * never the remote bundle). Block the dangerous-override classes here — at the
48
- * source — so every consumer (`run --secrets b@host`, `secrets exec --host`) is
49
- * protected, not just one call site:
50
- * - LD_* / DYLD_* / NODE_OPTIONS and the other loader/interpreter injections
51
- * (reuses the canonical bundles.ts predicate);
52
- * - GIT_* — GIT_SSH_COMMAND et al. hijack every git subprocess;
53
- * - *_PROXY — HTTP(S)_PROXY / ALL_PROXY reroute outbound traffic (MITM);
54
- * - *_BASE_URL — ANTHROPIC_BASE_URL / OPENAI_BASE_URL redirect the model API.
55
- * These keys are already rejected on the ADD side (validateEnvKey for loaders),
56
- * so a legitimate bundle never carries them — only a hostile peer would.
20
+ * Trust boundary for a remote-resolved env map. A peer's export output is
21
+ * untrusted input that could reshape this process once merged into the env, so
22
+ * block dangerous override classes here for every consumer:
23
+ * loader/interpreter vars, GIT_*, *_PROXY, and *_BASE_URL.
57
24
  */
58
25
  export declare function isDangerousRemoteEnvKey(name: string): boolean;
59
26
  /**
60
- * Resolve a `--device` value to an ssh target STRING for the remote-secrets path.
61
- * Delegates to the single host/device resolver (`resolveHost`, RUSH-1967) so a
62
- * name here dials the exact same box `run --device` does; on a miss, treats the
63
- * value as a raw ssh target and validates it against injection. Named distinctly
64
- * from `../devices/resolve-target.ts` (which returns richer shapes) so importing
65
- * the wrong one can't silently change which machine you dial.
27
+ * Resolve a `--device` value to an ssh target string for the remote-secrets
28
+ * path. Delegates to the same resolver `run --device` uses; on a miss, treats
29
+ * the value as a raw ssh target and validates it.
66
30
  */
67
31
  export declare function resolveHostSshTarget(nameOrAlias: string): Promise<string>;
68
32
  /**
69
- * Merge `--host <single>` / `--hosts <a,b,c>` (and their `--device` / `--devices`
70
- * aliases) into an ordered, de-duplicated list. All four flags compose; any alone
71
- * works. `--device`/`--devices` resolve identically to `--device`/`--hosts` so the
72
- * fleet-wide `--device` vocabulary (see `agents run --device`, `agents feed --host`)
73
- * works on the secrets remote commands too. Empty when none is set.
33
+ * Merge `--host` / `--hosts` (and their `--device` / `--devices` aliases) into
34
+ * an ordered, de-duplicated list. Empty when none is set.
74
35
  */
75
36
  export declare function parseHostsOption(opts: {
76
37
  host?: string;
@@ -79,11 +40,9 @@ export declare function parseHostsOption(opts: {
79
40
  devices?: string;
80
41
  }): string[];
81
42
  /**
82
- * Split a `bundle@host` reference. No `@` → a local bundle (host undefined).
83
- * Bundle names can't contain `@` (BUNDLE_NAME_PATTERN), so the FIRST `@`
84
- * separates the bundle from the ssh target — and the target itself may be a
85
- * `user@host` (e.g. `r2.backups@muqsit@box` → bundle `r2.backups`, host
86
- * `muqsit@box`).
43
+ * Split a `bundle@host` reference. No `@` → a local bundle. Bundle names can't
44
+ * contain `@`, so the FIRST `@` separates bundle from ssh target; the target
45
+ * itself may be `user@host` (e.g. `r2.backups@muqsit@box`).
87
46
  */
88
47
  export declare function splitBundleRef(ref: string): {
89
48
  bundle: string;
@@ -91,9 +50,8 @@ export declare function splitBundleRef(ref: string): {
91
50
  };
92
51
  /**
93
52
  * Run `agents secrets <args>` on a remote host over ssh and return the raw
94
- * result. Used by the browse commands — the remote's human-readable stdout is
95
- * streamed back unchanged. `tty` forces an interactive ssh session (`-tt`) so a
96
- * remote Touch-ID / passphrase prompt can surface (e.g. `view --reveal`).
53
+ * result. Used by browse commands; `tty` forces `-tt` so remote passphrase
54
+ * prompts can surface.
97
55
  */
98
56
  export declare function remoteSecretsRaw(target: string, args: string[], opts?: {
99
57
  tty?: boolean;
@@ -102,17 +60,9 @@ export declare function remoteSecretsRaw(target: string, args: string[], opts?:
102
60
  secret?: boolean;
103
61
  }): SshExecResult;
104
62
  /**
105
- * Run a remote `agents secrets <args>` FOREGROUND, with the local stdio wired
106
- * straight through (`stdio: 'inherit'` + `-tt`), and return its exit code.
107
- *
108
- * Unlike `remoteSecretsRaw` — which pipes stdin, so even with `-tt` the remote
109
- * process's `process.stdin.isTTY` is false and a passphrase prompt refuses to
110
- * appear (the macOS file-store guard then hard-errors "needs
111
- * AGENTS_SECRETS_PASSPHRASE") — this inherits the caller's real terminal, so the
112
- * remote sees a genuine TTY and its hidden passphrase prompt surfaces and reads
113
- * the keystrokes. This is the transport for `unlock --device`: you type the remote
114
- * bundle's passphrase at your own terminal. Output is NOT captured (it streams
115
- * to the terminal); only the exit code is returned.
63
+ * Run a remote `agents secrets <args>` foreground with local stdio inherited,
64
+ * so the remote sees a real TTY and its passphrase prompt surfaces and reads
65
+ * keystrokes. Output streams to the terminal; only the exit code is returned.
116
66
  */
117
67
  export declare function remoteSecretsStream(target: string, args: string[], opts?: {
118
68
  osLookupName?: string;
@@ -120,31 +70,20 @@ export declare function remoteSecretsStream(target: string, args: string[], opts
120
70
  /**
121
71
  * Resolve a remote bundle to a plaintext env map by driving the remote's
122
72
  * `agents secrets export <bundle> --plaintext --format json`. Values cross over
123
- * ssh stdout (encrypted in transit), parsed in memory, never persisted.
73
+ * ssh stdout, parsed in memory, never persisted.
124
74
  *
125
- * The remote unlocks the bundle with ITS OWN credentials — the owner host's
126
- * keychain/secrets-agent, or its own `AGENTS_SECRETS_PASSPHRASE` (in the login
127
- * env) for a file-backed bundle. We deliberately do NOT forward this machine's
128
- * passphrase: the remote bundle is encrypted with the remote's passphrase, so
129
- * overriding it would break the read. (A macOS remote under non-interactive
130
- * SSH will block on Touch-ID — use `view`/`exec` with a remote `file` bundle,
131
- * an already-unlocked remote secrets-agent, or an interactive `-tt` session.)
75
+ * The remote unlocks the bundle with its own credentials; this machine does NOT
76
+ * forward its passphrase because the remote bundle is encrypted with the
77
+ * remote's passphrase.
132
78
  */
133
79
  export declare function remoteResolveEnv(target: string, bundle: string, opts?: {
134
80
  osLookupName?: string;
135
81
  }): Promise<Record<string, string>>;
136
82
  /**
137
- * Outcome of a post-push read-back verification (see verifyRemoteKeychainPush).
138
- * - `ok` — the pushed keys materialized readably on the remote.
139
- * - `locked-keychain` — the read-back gave the SPECIFIC signal of a keychain
140
- * that didn't persist (the remote's headless "not unlocked
141
- * in the secrets agent" guard, or a "stored item … not
142
- * found" on read-back, or pushed keys simply absent). Only
143
- * this verdict earns the locked-login-keychain diagnosis +
144
- * `--remote-backend file` steer.
145
- * - `error` — a DIFFERENT failure (flaky SSH, timeout, unparseable
146
- * payload). The raw error is re-surfaced verbatim, never
147
- * mislabeled as a locked keychain.
83
+ * Outcome of a post-push read-back verification.
84
+ * - `ok` — the pushed keys materialized readably.
85
+ * - `locked-keychain` — read-back gave the specific locked-keychain signal.
86
+ * - `error` — a different failure (SSH, timeout, etc.).
148
87
  */
149
88
  export type RemoteKeychainWriteVerification = {
150
89
  ok: true;
@@ -158,24 +97,10 @@ export type RemoteKeychainWriteVerification = {
158
97
  reason: string;
159
98
  };
160
99
  /**
161
- * Decide whether a keychain-backed push to a remote actually PERSISTED its secret
162
- * value items, given the read-back of that bundle from the remote's own store.
163
- *
164
- * The silent-failure this guards: pushing `--remote-backend keychain` (default) to
165
- * a macOS host over headless SSH lands the bundle METADATA but not readable value
166
- * items — the remote login keychain is locked in the non-interactive SSH context,
167
- * so Security accepts the item WRITE at the DB level but the biometry-ACL'd item is
168
- * unreadable, and the remote `import` still reports success (values written first,
169
- * metadata `noAcl` last — bundles.ts writeBundleWithItems). The metadata-only bundle
170
- * then fails every later read with the confusing `Bundle '<b>' key '<k>': stored
171
- * item '<item>' not found` (bundles.ts resolveBundleEnv). We catch it by reading
172
- * the bundle back the same way a later `secrets exec`/resolve will (the marker-gated
173
- * json transport, driven headlessly on the remote so its `agentOnly` guard FAILS FAST
174
- * before any keychain read — no Touch ID prompt) and confirming every pushed key
175
- * returned.
176
- *
177
- * Pure so both branches are unit-testable without a real locked keychain: inject the
178
- * "read-back failed / key absent" condition through `readBack`.
100
+ * Decide whether a keychain-backed push to a remote actually persisted its
101
+ * secret value items by reading the bundle back the same way a later resolve
102
+ * will. Catches the silent failure where headless SSH writes metadata but not
103
+ * readable value items to a locked macOS login keychain.
179
104
  */
180
105
  export declare function evaluateKeychainWriteVerification(pushedKeys: string[], readBack: {
181
106
  ok: true;
@@ -185,38 +110,26 @@ export declare function evaluateKeychainWriteVerification(pushedKeys: string[],
185
110
  stderr: string;
186
111
  }): RemoteKeychainWriteVerification;
187
112
  /**
188
- * The actionable error message for a failed keychain-over-SSH push verification.
189
- * Names the cause (locked remote login keychain) and steers to the two real fixes:
190
- * re-run with the headless-readable file backend, or unlock the remote keychain.
191
- * Pure + exported so the exact guidance is asserted in tests.
113
+ * Actionable error message for a failed keychain-over-SSH push. Names the cause
114
+ * (locked remote login keychain) and steers to the two real fixes.
192
115
  */
193
116
  export declare function keychainWriteFailureMessage(host: string, bundle: string, reason: string): string;
194
117
  /**
195
- * Read a bundle back from a remote over SSH (headlessly, so it fails fast rather
196
- * than prompting Touch ID) and confirm the pushed keys materialized. Drives the
197
- * remote's marker-gated json transport (`secrets export <bundle> --plaintext
198
- * --format json` under AGENTS_SECRETS_REMOTE_TRANSPORT) but keeps only the KEY
199
- * NAMES; the plaintext values are dropped immediately and never retained or
200
- * logged. Returns a verification verdict; the caller renders
201
- * `keychainWriteFailureMessage` on failure.
118
+ * Read a bundle back from a remote over SSH and confirm the pushed keys
119
+ * materialized. Drives the marker-gated json transport but keeps only KEY NAMES;
120
+ * plaintext values are discarded immediately. Returns a verification verdict.
202
121
  */
203
122
  export declare function verifyRemoteKeychainPush(target: string, bundle: string, pushedKeys: string[], opts?: {
204
123
  osLookupName?: string;
205
124
  secret?: boolean;
206
125
  }): RemoteKeychainWriteVerification;
207
126
  /**
208
- * The `bash -lc` command + stdin payload that drives a **file-backed** remote
209
- * import for `secrets export --device … --remote-backend file`.
127
+ * `bash -lc` command + stdin payload for a file-backed remote import.
210
128
  *
211
- * The file store is passphrase-free: the remote `agents secrets import --backend
212
- * file` auto-provisions the remote's own machine-local key (0600 under
213
- * `~/.agents/.secrets-key/`), so its reads are HEADLESS — no passphrase, no
214
- * Touch ID. AGENTS_SECRETS_PASSPHRASE is a deprecated override and MUST NOT be
129
+ * The file store is passphrase-free: the remote auto-provisions its own machine-
130
+ * local key, so reads are headless. AGENTS_SECRETS_PASSPHRASE must NOT be
215
131
  * forwarded (PHNX-2371): a remote keyed to a secret its daemon does not hold
216
132
  * reports "Imported N key(s)" then fails every later decrypt.
217
- *
218
- * Pure — no I/O — so the exact command string and stdin ordering are unit-testable
219
- * against the SSH boundary the same way `remoteSecretsRaw` is.
220
133
  */
221
134
  export declare function buildRemoteFileImportCommand(bundle: string, dotenv: string, opts?: {
222
135
  force?: boolean;