@phnx-labs/agents-cli 1.22.114 → 1.22.115

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 (176) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/README.md +22 -102
  3. package/dist/browser.js +0 -0
  4. package/dist/cli/command-registry.js +0 -7
  5. package/dist/commands/accounts.d.ts +3 -77
  6. package/dist/commands/accounts.js +13 -366
  7. package/dist/commands/audit.js +1 -1
  8. package/dist/commands/auth.js +0 -2
  9. package/dist/commands/browser.d.ts +53 -0
  10. package/dist/commands/browser.js +199 -9
  11. package/dist/commands/doctor.d.ts +2 -3
  12. package/dist/commands/doctor.js +0 -11
  13. package/dist/commands/events.d.ts +1 -3
  14. package/dist/commands/events.js +4 -7
  15. package/dist/commands/exec.d.ts +0 -1
  16. package/dist/commands/exec.js +2 -7
  17. package/dist/commands/feed-watch.js +52 -8
  18. package/dist/commands/focus.js +1 -1
  19. package/dist/commands/go.d.ts +0 -17
  20. package/dist/commands/go.js +2 -19
  21. package/dist/commands/logs.js +1 -1
  22. package/dist/commands/mcp.js +8 -83
  23. package/dist/commands/memory.js +4 -47
  24. package/dist/commands/message.js +4 -4
  25. package/dist/commands/plugins.js +1 -93
  26. package/dist/commands/repo.js +0 -44
  27. package/dist/commands/resume.js +4 -1
  28. package/dist/commands/secrets-passthrough.js +2 -2
  29. package/dist/commands/send.d.ts +4 -4
  30. package/dist/commands/send.js +6 -51
  31. package/dist/commands/sessions-backup-setup.js +1 -1
  32. package/dist/commands/sessions-resume.js +0 -1
  33. package/dist/commands/sessions-share.d.ts +5 -7
  34. package/dist/commands/sessions-share.js +98 -49
  35. package/dist/commands/sessions.js +1 -8
  36. package/dist/commands/setup-browser.js +18 -2
  37. package/dist/commands/setup-computer.js +20 -6
  38. package/dist/commands/setup-secrets.js +24 -4
  39. package/dist/commands/setup-terminal.d.ts +3 -0
  40. package/dist/commands/setup-terminal.js +22 -0
  41. package/dist/commands/setup.d.ts +1 -1
  42. package/dist/commands/setup.js +20 -10
  43. package/dist/commands/skills.js +0 -8
  44. package/dist/commands/ssh.d.ts +6 -0
  45. package/dist/commands/ssh.js +92 -233
  46. package/dist/commands/sync.js +14 -5
  47. package/dist/commands/teams.js +1 -1
  48. package/dist/commands/traces.js +1 -1
  49. package/dist/lib/accounts/add.d.ts +0 -5
  50. package/dist/lib/accounts/add.js +1 -7
  51. package/dist/lib/artifacts-client.d.ts +20 -0
  52. package/dist/lib/artifacts-client.js +46 -0
  53. package/dist/lib/auth-mint.js +2 -2
  54. package/dist/lib/browser/runtime-state.d.ts +55 -0
  55. package/dist/lib/browser/runtime-state.js +99 -18
  56. package/dist/lib/browser/service.js +21 -1
  57. package/dist/lib/cli-resources.js +3 -1
  58. package/dist/lib/cloud/dispatch.js +1 -1
  59. package/dist/lib/cloudflare/creds.d.ts +10 -0
  60. package/dist/lib/cloudflare/creds.js +46 -0
  61. package/dist/lib/cloudflare/provision.d.ts +35 -0
  62. package/dist/lib/cloudflare/provision.js +144 -0
  63. package/dist/lib/computer/sessions-list.d.ts +55 -0
  64. package/dist/lib/computer/sessions-list.js +168 -1
  65. package/dist/lib/daemon/daemon.js +8 -1
  66. package/dist/lib/daemon/feed-stream-service.d.ts +23 -0
  67. package/dist/lib/daemon/feed-stream-service.js +40 -0
  68. package/dist/lib/daemon-services.d.ts +1 -1
  69. package/dist/lib/daemon-services.js +5 -0
  70. package/dist/lib/devices/connect.d.ts +49 -5
  71. package/dist/lib/devices/connect.js +169 -21
  72. package/dist/lib/feed/envelope.d.ts +79 -0
  73. package/dist/lib/feed/envelope.js +23 -0
  74. package/dist/lib/feed/events.d.ts +6 -0
  75. package/dist/lib/feed/events.js +8 -0
  76. package/dist/lib/feed/hub-server.d.ts +86 -0
  77. package/dist/lib/feed/hub-server.js +334 -0
  78. package/dist/lib/feed/hub.d.ts +95 -0
  79. package/dist/lib/feed/hub.js +255 -0
  80. package/dist/lib/feed/tool-activity.d.ts +108 -0
  81. package/dist/lib/feed/tool-activity.js +313 -0
  82. package/dist/lib/feed/tools.d.ts +198 -0
  83. package/dist/lib/feed/tools.js +265 -0
  84. package/dist/lib/feed/watch.d.ts +50 -50
  85. package/dist/lib/feed/watch.js +147 -16
  86. package/dist/lib/format.d.ts +1 -1
  87. package/dist/lib/format.js +1 -1
  88. package/dist/lib/git.d.ts +0 -16
  89. package/dist/lib/git.js +0 -58
  90. package/dist/lib/helper-versions.js +1 -1
  91. package/dist/lib/hosts/remote-cmd.d.ts +51 -1
  92. package/dist/lib/hosts/remote-cmd.js +125 -8
  93. package/dist/lib/hosts/remote-cmd.test-fixture.d.ts +2 -0
  94. package/dist/lib/hosts/remote-cmd.test-fixture.js +22 -0
  95. package/dist/lib/mcp.js +17 -11
  96. package/dist/lib/probe.d.ts +4 -1
  97. package/dist/lib/probe.js +5 -2
  98. package/dist/lib/pwsh.d.ts +33 -0
  99. package/dist/lib/pwsh.js +56 -0
  100. package/dist/lib/redact.d.ts +8 -0
  101. package/dist/lib/redact.js +11 -0
  102. package/dist/lib/refresh.d.ts +6 -2
  103. package/dist/lib/refresh.js +92 -72
  104. package/dist/lib/secrets-cli.d.ts +11 -0
  105. package/dist/lib/secrets-cli.js +30 -0
  106. package/dist/lib/secrets-client.js +3 -2
  107. package/dist/lib/session/detached.d.ts +7 -0
  108. package/dist/lib/session/detached.js +29 -0
  109. package/dist/lib/session/remote/peer-stream.d.ts +24 -2
  110. package/dist/lib/session/remote/peer-stream.js +33 -6
  111. package/dist/lib/session/sync/backend.d.ts +3 -3
  112. package/dist/lib/session/sync/backend.js +3 -3
  113. package/dist/lib/session/sync/provision.d.ts +1 -1
  114. package/dist/lib/session/sync/provision.js +2 -2
  115. package/dist/lib/sessions-client.js +0 -3
  116. package/dist/lib/setup-tool-install.d.ts +3 -0
  117. package/dist/lib/setup-tool-install.js +26 -0
  118. package/dist/lib/setup-tool-status.d.ts +22 -0
  119. package/dist/lib/setup-tool-status.js +215 -0
  120. package/dist/lib/share-runtime.d.ts +11 -0
  121. package/dist/lib/share-runtime.js +63 -0
  122. package/dist/lib/smart-launch.d.ts +1 -5
  123. package/dist/lib/smart-launch.js +3 -11
  124. package/dist/lib/ssh-exec.d.ts +44 -0
  125. package/dist/lib/ssh-exec.js +119 -0
  126. package/dist/lib/startup/command-registry.d.ts +6 -4
  127. package/dist/lib/startup/command-registry.js +10 -7
  128. package/dist/lib/state.js +2 -2
  129. package/dist/lib/storage/selection.d.ts +2 -2
  130. package/dist/lib/storage/selection.js +2 -2
  131. package/dist/lib/sync-umbrella.d.ts +5 -0
  132. package/dist/lib/sync-umbrella.js +18 -10
  133. package/dist/lib/traces/backend.d.ts +1 -2
  134. package/dist/lib/traces/backend.js +1 -2
  135. package/dist/lib/traces/provision.d.ts +1 -1
  136. package/dist/lib/traces/provision.js +2 -2
  137. package/dist/lib/types.d.ts +8 -6
  138. package/package.json +2 -3
  139. package/dist/commands/artifacts-setup.d.ts +0 -53
  140. package/dist/commands/artifacts-setup.js +0 -161
  141. package/dist/commands/artifacts.d.ts +0 -18
  142. package/dist/commands/artifacts.js +0 -58
  143. package/dist/commands/attach.d.ts +0 -12
  144. package/dist/commands/attach.js +0 -86
  145. package/dist/commands/auth-mint.d.ts +0 -12
  146. package/dist/commands/auth-mint.js +0 -108
  147. package/dist/commands/reconnect.d.ts +0 -46
  148. package/dist/commands/reconnect.js +0 -115
  149. package/dist/commands/share.d.ts +0 -293
  150. package/dist/commands/share.js +0 -1424
  151. package/dist/lib/share/analytics.d.ts +0 -13
  152. package/dist/lib/share/analytics.js +0 -45
  153. package/dist/lib/share/backend.d.ts +0 -120
  154. package/dist/lib/share/backend.js +0 -176
  155. package/dist/lib/share/capture.d.ts +0 -31
  156. package/dist/lib/share/capture.js +0 -174
  157. package/dist/lib/share/config.d.ts +0 -72
  158. package/dist/lib/share/config.js +0 -211
  159. package/dist/lib/share/delete.d.ts +0 -123
  160. package/dist/lib/share/delete.js +0 -173
  161. package/dist/lib/share/html.d.ts +0 -20
  162. package/dist/lib/share/html.js +0 -88
  163. package/dist/lib/share/http-error.d.ts +0 -53
  164. package/dist/lib/share/http-error.js +0 -65
  165. package/dist/lib/share/og.d.ts +0 -26
  166. package/dist/lib/share/og.js +0 -84
  167. package/dist/lib/share/provision.d.ts +0 -127
  168. package/dist/lib/share/provision.js +0 -285
  169. package/dist/lib/share/publish.d.ts +0 -379
  170. package/dist/lib/share/publish.js +0 -818
  171. package/dist/lib/share/worker-template.d.ts +0 -27
  172. package/dist/lib/share/worker-template.js +0 -2424
  173. package/dist/lib/storage/index.d.ts +0 -14
  174. package/dist/lib/storage/index.js +0 -14
  175. package/dist/lib/storage/visibility.d.ts +0 -82
  176. package/dist/lib/storage/visibility.js +0 -99
@@ -5,14 +5,14 @@ import ora from 'ora';
5
5
  import { checkbox } from '@inquirer/prompts';
6
6
  import { capableAgents, isCapable } from '../lib/capabilities.js';
7
7
  import { emit } from '../lib/feed/events.js';
8
- import { AGENTS, getAllCliStates, resolveAgentName, formatAgentError, registerMcpToTargets, unregisterMcpFromTargets, listInstalledMcpsWithScope, parseMcpConfig, getMcpConfigPathForHome, agentLabel, } from '../lib/agents.js';
8
+ import { AGENTS, getAllCliStates, resolveAgentName, formatAgentError, unregisterMcpFromTargets, listInstalledMcpsWithScope, parseMcpConfig, getMcpConfigPathForHome, agentLabel, } from '../lib/agents.js';
9
9
  import { readManifest, writeManifest, createDefaultManifest } from '../lib/manifest.js';
10
10
  import { listMcpServerConfigs, discoverMcpConfigsFromRepo, installMcpConfigCentrally, isProjectMcpTrusted, trustProjectMcp, untrustProjectMcp, getMcpTrustStorePath, } from '../lib/mcp.js';
11
11
  import { cloneRepo } from '../lib/git.js';
12
12
  import { getMcpDir, getProjectAgentsDir } from '../lib/state.js';
13
- import { getEffectiveHome, getGlobalDefault, listInstalledVersions, getVersionHomePath, resolveInstalledAgentTargets, resolveConfiguredAgentTargets, syncResourcesToVersion, } from '../lib/installations/versions.js';
13
+ import { getEffectiveHome, getGlobalDefault, listInstalledVersions, getVersionHomePath, resolveInstalledAgentTargets, syncResourcesToVersion, } from '../lib/installations/versions.js';
14
14
  import { getUserAgentsDir } from '../lib/state.js';
15
- import { isPromptCancelled, isInteractiveTerminal, requireInteractiveSelection, promptRemovalTargets, parseCommaSeparatedList, ensureAgentVersionsInstalled, resolveAgentTargetsAutoInstalling, resolveInstalledAgentTargetsAutoInstalling, VersionNotInstalledError, resolveListFilterOrExit, } from './utils.js';
15
+ import { isPromptCancelled, isInteractiveTerminal, requireInteractiveSelection, promptRemovalTargets, parseCommaSeparatedList, ensureAgentVersionsInstalled, resolveAgentTargetsAutoInstalling, VersionNotInstalledError, resolveListFilterOrExit, } from './utils.js';
16
16
  import { showResourceList, buildTargetsSection, } from './resource-view.js';
17
17
  /**
18
18
  * Parse a comma-separated --agents string into validated agent IDs and
@@ -137,12 +137,12 @@ Examples:
137
137
  agents mcp add my-api https://api.example.com --transport http --agents claude
138
138
 
139
139
  # Apply servers from manifest to specific agents
140
- agents mcp register --agents codex@0.116.0
140
+ agents sync --mcp codex@0.116.0
141
141
 
142
142
  When to use:
143
143
  - After install: 'agents mcp add <server>' to connect a new service
144
- - Version upgrade: 'agents mcp register' to sync servers to the new version
145
- - Team setup: commit mcp config to .agents and run 'agents mcp register'
144
+ - Version upgrade: 'agents sync --mcp' to sync servers to the new version
145
+ - Team setup: commit mcp config to .agents and run 'agents sync --mcp'
146
146
  `);
147
147
  withAliases(mcpCmd
148
148
  .command('list [agent]'), 'list')
@@ -220,7 +220,7 @@ When to use:
220
220
  });
221
221
  mcpCmd
222
222
  .command('add <name> [command_or_url...]')
223
- .description('Add an MCP server to the manifest (run "agents mcp register" afterward to apply)')
223
+ .description('Add an MCP server to the manifest (run "agents sync --mcp" afterward to apply)')
224
224
  .option('-a, --agents <list>', 'Targets: claude, codex@0.116.0', capableAgents('mcp').join(','))
225
225
  .option('-s, --scope <scope>', 'user (global) or project (repo-specific)', 'user')
226
226
  .option('-t, --transport <type>', 'stdio (default) or http', 'stdio')
@@ -336,7 +336,7 @@ Examples:
336
336
  writeManifest(localPath, manifest);
337
337
  emit('mcp.add', { module: 'mcp', server: name });
338
338
  console.log(chalk.green(`Added MCP server '${name}' to manifest`));
339
- console.log(chalk.gray('Run: agents mcp register to apply'));
339
+ console.log(chalk.gray('Run: agents sync --mcp to apply'));
340
340
  });
341
341
  withAliases(mcpCmd
342
342
  .command('remove [name]'), 'remove')
@@ -565,81 +565,6 @@ Examples:
565
565
  }
566
566
  console.log();
567
567
  });
568
- // Deprecated: superseded by `agents sync --mcp`. Kept as a warned, functional
569
- // alias so old muscle-memory and scripts don't break.
570
- mcpCmd
571
- .command('register [name]', { hidden: true })
572
- .description('Deprecated — use `agents sync --mcp` instead.')
573
- .option('-a, --agents <list>', 'Override manifest targets: claude, codex@0.116.0')
574
- .option('-y, --yes', 'Auto-install any missing agent versions without prompting')
575
- .addHelpText('after', `
576
- Examples:
577
- # Register all servers from manifest
578
- agents mcp register
579
-
580
- # Register a specific server
581
- agents mcp register notion
582
-
583
- # Register to specific agents (overrides manifest config)
584
- agents mcp register --agents codex@0.116.0
585
- `)
586
- .action(async (name, options) => {
587
- console.warn(chalk.yellow('`agents mcp register` is deprecated — use `agents sync --mcp` instead:'));
588
- console.warn(chalk.gray(' all servers: agents sync --mcp'));
589
- console.warn(chalk.gray(' specific server: agents sync --mcp <name>'));
590
- const localPath = getUserAgentsDir();
591
- const manifest = readManifest(localPath);
592
- if (!manifest?.mcp) {
593
- console.log(chalk.yellow('No MCP servers in manifest'));
594
- return;
595
- }
596
- const entries = name
597
- ? (() => {
598
- const config = manifest.mcp?.[name];
599
- return config ? [[name, config]] : [];
600
- })()
601
- : Object.entries(manifest.mcp);
602
- if (entries.length === 0) {
603
- console.log(chalk.yellow(`MCP server '${name}' not found in manifest`));
604
- return;
605
- }
606
- for (const [mcpName, config] of entries) {
607
- const transport = config.transport || 'stdio';
608
- const commandOrUrl = transport === 'http' ? config.url : config.command;
609
- if (!commandOrUrl) {
610
- console.log(`\n ${chalk.cyan(mcpName)}: ${chalk.yellow(`missing ${transport === 'http' ? 'url' : 'command'}`)}`);
611
- continue;
612
- }
613
- console.log(`\n ${chalk.cyan(mcpName)}:`);
614
- let targets;
615
- if (options.agents) {
616
- const resolved = await resolveInstalledAgentTargetsAutoInstalling(options.agents, capableAgents('mcp'), { yes: options.yes });
617
- if (!resolved) {
618
- console.log(chalk.gray(' Cancelled.'));
619
- continue;
620
- }
621
- targets = resolved;
622
- }
623
- else {
624
- targets = resolveConfiguredAgentTargets(config.agents, config.agentVersions, capableAgents('mcp'));
625
- }
626
- const results = await registerMcpToTargets(targets, mcpName, commandOrUrl, config.scope || 'user', transport, { headers: config.headers });
627
- const applied = results.filter(r => r.success).length;
628
- for (const result of results) {
629
- if (result.success) {
630
- console.log(` ${chalk.green('+')} ${formatTargetLabel(result.agentId, result.version)}`);
631
- }
632
- else if (result.error?.startsWith('skipped:')) {
633
- console.log(` ${chalk.yellow('-')} ${formatTargetLabel(result.agentId, result.version)}: ${result.error}`);
634
- }
635
- else {
636
- console.log(` ${chalk.red('x')} ${formatTargetLabel(result.agentId, result.version)}: ${result.error}`);
637
- }
638
- }
639
- if (applied > 0)
640
- emit('mcp.register', { module: 'mcp', server: mcpName, applied });
641
- }
642
- });
643
568
  }
644
569
  async function installMcpsFromRepoSource(source, options) {
645
570
  const spinner = ora('Cloning repository...').start();
@@ -7,9 +7,9 @@
7
7
  import { withAliases } from '../lib/verbs.js';
8
8
  import chalk from 'chalk';
9
9
  import * as fs from 'fs';
10
- import { listMemoryFacts, addMemoryFact, removeMemoryFact, readMemoryFact, ensureUserMemoryDir, getUserMemoryDir, syncMemoryToVersionHome, } from '../lib/memory.js';
10
+ import { listMemoryFacts, addMemoryFact, removeMemoryFact, readMemoryFact, getUserMemoryDir, syncMemoryToVersionHome, } from '../lib/memory.js';
11
11
  import { capableAgents } from '../lib/capabilities.js';
12
- import { resolveAgentName, formatAgentError, agentLabel, ALL_AGENT_IDS } from '../lib/agents.js';
12
+ import { ALL_AGENT_IDS } from '../lib/agents.js';
13
13
  import { listInstalledVersions, getVersionHomePath, } from '../lib/installations/versions.js';
14
14
  import { supports } from '../lib/capabilities.js';
15
15
  import { setHelpSections } from '../lib/help.js';
@@ -33,7 +33,7 @@ export function registerMemoryCommands(program) {
33
33
  agents memory remove preferred-editor
34
34
 
35
35
  # Fan out to all capable installed agent versions
36
- agents memory sync
36
+ agents sync --memory
37
37
  `,
38
38
  notes: `
39
39
  Memory is the knowledge store (learned facts), distinct from rules
@@ -84,7 +84,7 @@ export function registerMemoryCommands(program) {
84
84
  }
85
85
  }
86
86
  else {
87
- console.log(chalk.gray(' Run: agents memory sync (or agents sync) to fan out'));
87
+ console.log(chalk.gray(' Run: agents sync --memory to fan out'));
88
88
  }
89
89
  });
90
90
  withAliases(memoryCmd
@@ -111,49 +111,6 @@ export function registerMemoryCommands(program) {
111
111
  console.log(chalk.dim(`# ${fact.name} [${fact.layer}] ${fact.path}`));
112
112
  console.log(fs.readFileSync(fact.path, 'utf-8'));
113
113
  });
114
- // Deprecated: superseded by `agents sync --memory`. Kept as a warned, functional
115
- // alias so old muscle-memory and scripts don't break.
116
- memoryCmd
117
- .command('sync [agent]', { hidden: true })
118
- .description('Deprecated — use `agents sync --memory` instead.')
119
- .option('-a, --agent <agent>', 'Limit to one agent (or agent@version)')
120
- .action(async (agentArg, options) => {
121
- console.warn(chalk.yellow('`agents memory sync` is deprecated — use `agents sync --memory` instead:'));
122
- console.warn(chalk.gray(' all agents: agents sync --memory'));
123
- console.warn(chalk.gray(' one agent: agents sync --memory <agent>'));
124
- ensureUserMemoryDir();
125
- const input = agentArg || options.agent;
126
- if (input) {
127
- const parts = input.split('@');
128
- const resolved = resolveAgentName(parts[0]);
129
- if (!resolved) {
130
- console.error(chalk.red(formatAgentError(parts[0], capableAgents('memory'))));
131
- process.exit(1);
132
- }
133
- const agent = resolved;
134
- const versions = parts[1]
135
- ? [parts[1]]
136
- : listInstalledVersions(agent);
137
- if (versions.length === 0) {
138
- console.log(chalk.yellow(`No installed versions of ${agentLabel(agent)}`));
139
- return;
140
- }
141
- for (const version of versions) {
142
- const home = getVersionHomePath(agent, version);
143
- const facts = syncMemoryToVersionHome(agent, home, process.cwd());
144
- console.log(chalk.green(`Synced ${facts.length} fact(s) → ${agent}@${version}`));
145
- }
146
- return;
147
- }
148
- const results = syncAllMemory(process.cwd());
149
- if (results.length === 0) {
150
- console.log(chalk.gray('No memory-capable agent versions installed.'));
151
- return;
152
- }
153
- for (const r of results) {
154
- console.log(chalk.green(`Synced ${r.facts.length} fact(s) → ${r.agent}@${r.version}`));
155
- }
156
- });
157
114
  }
158
115
  function syncAllMemory(cwd) {
159
116
  const out = [];
@@ -153,17 +153,17 @@ async function deliverViaHostReroute(route, text, opts) {
153
153
  * injected input a running agent consumes, never a notification a human reads.
154
154
  * Mirrors SHARED_NOTES in commands/send.ts so an agent reading either --help
155
155
  * sees the same three-plane map and doesn't reach for `message` when it means
156
- * `send`/`notify`.
156
+ * `send`.
157
157
  */
158
158
  const CONTROL_PLANE_NOTES = `
159
159
  Planes (do not mix them up):
160
160
  message / sessions inject - CONTROL a running agent (mailbox answer, terminal keystroke, or resume by runtime)
161
- send / notify - DELIVER a message to a human recipient over a channel provider
162
- feed post - RECORD progress / milestones (optional broadcast may call send/notify)
161
+ send - DELIVER a message to a human recipient over a channel provider
162
+ feed post - RECORD progress / milestones (optional broadcast may call send)
163
163
 
164
164
  <text> here is consumed BY THE TARGET AGENT (an answer, a keystroke, or the
165
165
  argument to a resume) -- it is not a notification a person reads on their
166
- phone. To reach the operator instead, use \`agents send\` / \`agents notify\`
166
+ phone. To reach the operator instead, use \`agents send --to owner\`
167
167
  (or a feed.broadcast \`channel:\` sink).
168
168
  `;
169
169
  export function registerMessageCommand(program) {
@@ -48,7 +48,7 @@ Examples:
48
48
  agents plugins view rush-toolkit
49
49
 
50
50
  # Sync a plugin to specific agents
51
- agents plugins sync rush-toolkit claude
51
+ agents sync --plugin rush-toolkit claude
52
52
 
53
53
  # Remove a plugin from all agents and delete its source
54
54
  agents plugins remove rush-toolkit
@@ -283,98 +283,6 @@ Examples:
283
283
  }
284
284
  console.log();
285
285
  });
286
- // Deprecated: superseded by `agents sync --plugin <name>`. Kept as a warned,
287
- // functional alias so old muscle-memory and scripts don't break.
288
- pluginsCmd
289
- .command('sync <name> [agent]', { hidden: true })
290
- .description('Deprecated — use `agents sync --plugin <name>` instead.')
291
- .option('--allow-exec-surfaces', 'Enable the plugin even when it ships hooks/, .mcp.json, bin/, scripts/, settings.json, or permissions/')
292
- .addHelpText('after', `
293
- Examples:
294
- # Sync a plugin to every installed version of an agent
295
- agents plugins sync rush-toolkit claude
296
-
297
- # Sync to one specific version (parity with 'agents sync')
298
- agents plugins sync rush-toolkit claude@2.1.142
299
-
300
- # Sync to all supported agents (every installed version of each)
301
- agents plugins sync rush-toolkit
302
-
303
- # Re-affirm consent for a hooks-bearing plugin
304
- agents plugins sync hivemind claude --allow-exec-surfaces
305
- `)
306
- .action(async (name, agentArg, options) => {
307
- console.warn(chalk.yellow('`agents plugins sync` is deprecated — use `agents sync --plugin` instead:'));
308
- console.warn(chalk.gray(` agents sync --plugin ${name}`));
309
- const plugin = getPlugin(name);
310
- if (!plugin) {
311
- console.log(chalk.red(`Plugin '${name}' not found`));
312
- process.exit(1);
313
- }
314
- // Accept the same "agent@version" form as `agents sync`. Splitting here
315
- // also means an unknown spec is reported cleanly rather than crashing
316
- // isCapable() with a bare "claude@2.1.168".
317
- let versionArg;
318
- let agentName = agentArg;
319
- if (agentArg && agentArg.includes('@')) {
320
- const at = agentArg.lastIndexOf('@');
321
- agentName = agentArg.slice(0, at);
322
- versionArg = agentArg.slice(at + 1);
323
- }
324
- // Determine target agents
325
- let targetAgents;
326
- if (agentName) {
327
- const agentId = agentName;
328
- if (!isCapable(agentId, 'plugins')) {
329
- console.log(chalk.red(`Agent '${agentName}' does not support plugins`));
330
- process.exit(1);
331
- }
332
- if (!pluginSupportsAgent(plugin, agentId)) {
333
- console.log(chalk.red(`Plugin '${name}' does not support ${agentLabel(agentId)}`));
334
- process.exit(1);
335
- }
336
- targetAgents = [agentId];
337
- }
338
- else {
339
- if (versionArg) {
340
- console.log(chalk.red(`A version (@${versionArg}) requires naming the agent, e.g. claude@${versionArg}`));
341
- process.exit(1);
342
- }
343
- targetAgents = capableAgents('plugins').filter(a => pluginSupportsAgent(plugin, a));
344
- }
345
- const allowExec = options.allowExecSurfaces === true;
346
- for (const agentId of targetAgents) {
347
- const versions = listInstalledVersions(agentId);
348
- if (versions.length === 0)
349
- continue;
350
- // Default to EVERY installed version. The previous behaviour synced only
351
- // the global default, which silently skipped non-default versions used
352
- // by balanced rotation -- so a rotated version would lack the plugin's
353
- // slash commands. An explicit agent@version narrows back to one.
354
- let targetVersions;
355
- if (versionArg) {
356
- if (!versions.includes(versionArg)) {
357
- console.log(chalk.red(`${agentLabel(agentId)} has no installed version ${versionArg} (installed: ${versions.join(', ')})`));
358
- process.exit(1);
359
- }
360
- targetVersions = [versionArg];
361
- }
362
- else {
363
- targetVersions = versions;
364
- }
365
- for (const version of targetVersions) {
366
- const didSync = allowExec
367
- ? syncPluginToVersion(plugin, agentId, getVersionHomePath(agentId, version), { allowExecSurfaces: true, version }).success
368
- : syncResourcesToVersion(agentId, version, { plugins: [name] }).plugins.length > 0;
369
- if (didSync) {
370
- console.log(chalk.green(`Synced ${name} to ${agentLabel(agentId)}@${version}${allowExec ? ' (exec surfaces enabled)' : ''}`));
371
- }
372
- else {
373
- console.log(chalk.gray(`${name} already synced to ${agentLabel(agentId)}@${version}`));
374
- }
375
- }
376
- }
377
- });
378
286
  // agents plugins remove [name]
379
287
  withAliases(pluginsCmd
380
288
  .command('remove [name]'), 'remove')
@@ -31,8 +31,6 @@ function resolveRepoPath(target) {
31
31
  import { applyExtraAliasToVersions, ensureAgentsDir, getExtraRepoDir, getSystemAgentsDir, getUserAgentsDir, readMeta, resolveExtraRepoDir, updateMeta, } from '../lib/state.js';
32
32
  import { parseSource, pullRepo, commitAndPush, isGitRepo, isSystemRepoOrigin, adoptRepo, adoptUserRepoIfNeeded, recordUserRepoRemote, resolveUserRepoRemoteUrl, getRemoteUrl, sameGitRemote, displayHomePath, syncRepoGit, } from '../lib/git.js';
33
33
  import { DEFAULT_SYSTEM_REPO } from '../lib/types.js';
34
- import { ALL_AGENT_IDS, isAgentName, resolveAgentName } from '../lib/agents.js';
35
- import { refresh } from '../lib/refresh.js';
36
34
  import { capableAgents } from '../lib/capabilities.js';
37
35
  import { getGlobalDefault, getVersionHomePath, listInstalledVersions } from '../lib/installations/versions.js';
38
36
  import { syncAllMarketplaces } from '../lib/plugins/plugin-marketplace.js';
@@ -1230,48 +1228,6 @@ Examples:
1230
1228
  }
1231
1229
  }
1232
1230
  });
1233
- // Deprecated: superseded by `agents sync`. `agents sync --local` runs the same
1234
- // reconcile stage (sync-umbrella.ts calls this exact `refresh()`), and `agents
1235
- // sync <agent>` targets one agent — with the added reach `refresh` lacks
1236
- // (all installed versions, no silent skip when there is no global default).
1237
- // Hidden from help; kept as a warned, functional alias so old muscle-memory and
1238
- // scripts don't break. Migrate callers to `agents sync`.
1239
- repoCmd
1240
- .command('refresh [agent]', { hidden: true })
1241
- .description('Deprecated — use `agents sync` instead.')
1242
- .option('-y, --yes', 'Auto-sync everything without prompting')
1243
- .option('--skip-clis', 'Skip CLI version install/upgrade from agents.yaml')
1244
- .action(async (arg, options) => {
1245
- console.warn(chalk.yellow('`agents repo refresh` is deprecated — use `agents sync` instead:'));
1246
- console.warn(chalk.gray(' all agents: agents sync --local'));
1247
- console.warn(chalk.gray(' one agent: agents sync <agent>'));
1248
- let agentFilter;
1249
- if (arg) {
1250
- if (!isAgentName(arg)) {
1251
- console.log(chalk.red(`Unknown agent "${arg}".`));
1252
- console.log(chalk.gray(`Available: ${ALL_AGENT_IDS.join(', ')}`));
1253
- process.exitCode = 1;
1254
- return;
1255
- }
1256
- agentFilter = resolveAgentName(arg);
1257
- }
1258
- try {
1259
- await refresh({
1260
- agentFilter,
1261
- skipPrompts: options.yes,
1262
- skipClis: options.skipClis,
1263
- });
1264
- console.log(chalk.green('\nRefresh complete'));
1265
- }
1266
- catch (err) {
1267
- if (isPromptCancelled(err)) {
1268
- console.log(chalk.yellow('\nCancelled'));
1269
- return;
1270
- }
1271
- console.error(chalk.red(err.message));
1272
- process.exit(1);
1273
- }
1274
- });
1275
1231
  const statusCmd = repoCmd
1276
1232
  .command('status [alias]', { hidden: true })
1277
1233
  .description('Alias of `list` (kept for muscle memory). Add --devices-all to report across the fleet.')
@@ -8,6 +8,7 @@ import chalk from 'chalk';
8
8
  import { resolveSessionMetadataValue } from './sessions.js';
9
9
  import { sessionOwnerDevice, consumeResumePinned, RESUME_PINNED_ENV } from '../lib/session/resume-owner.js';
10
10
  import { machineId } from '../lib/machine-id.js';
11
+ import { takeOverDetachedSession } from '../lib/session/detached.js';
11
12
  const RESUME_SOURCE_ENV = 'AGENTS_RESUME_SOURCE_JSON';
12
13
  /** Inspect local archived context after the owner hop fails. Recovery still
13
14
  * requires readable content and explicit replay consent before starting a run. */
@@ -161,7 +162,9 @@ export async function runStrictResume(sessionId, prompt, options) {
161
162
  }
162
163
  return;
163
164
  }
164
- process.exitCode = await delegateLocalResume(pinnedHere ? resumeLocalFallbackSource(outcome.session) : outcome.session, prompt, options);
165
+ const localSession = pinnedHere ? resumeLocalFallbackSource(outcome.session) : outcome.session;
166
+ await takeOverDetachedSession(localSession.id);
167
+ process.exitCode = await delegateLocalResume(localSession, prompt, options);
165
168
  }
166
169
  /**
167
170
  * Spawn the delegated local `agents run --resume` for a session this box owns
@@ -4,7 +4,7 @@ import { buildServeEnv, invocation, resolveSecretsBin, SecretsClientError } from
4
4
  import { flagValue } from '../lib/hosts/routing-flag.js';
5
5
  import { stripRoutingFlags } from '../lib/hosts/remote-cmd.js';
6
6
  import { resolveRemoteDevice } from '../lib/ssh-tunnel.js';
7
- const INSTALL_HINT = 'npm i -g @phnx-labs/secrets-cli';
7
+ import { SECRETS_CLI_INSTALL_HINT } from '../lib/secrets-cli.js';
8
8
  /**
9
9
  * Rewrite a `--device <name>` (or `-D`) on the forwarded argv to
10
10
  * `--host ssh://user@host`, the address grammar `secrets` speaks (PHNX-4090).
@@ -39,7 +39,7 @@ export function registerSecretsCommands(program) {
39
39
  if (err instanceof SecretsClientError && err.code === 'SECRETS_BIN_MISSING') {
40
40
  console.error(chalk.red('The standalone `secrets` CLI is not installed.'));
41
41
  console.error(chalk.gray(`Install it, then re-run this command:`));
42
- console.error(chalk.cyan(` ${INSTALL_HINT}`));
42
+ console.error(chalk.cyan(` ${SECRETS_CLI_INSTALL_HINT}`));
43
43
  process.exit(1);
44
44
  }
45
45
  throw err;
@@ -10,10 +10,10 @@
10
10
  *
11
11
  * Compat: positional text still works (`agents send "hi" --channel … --to …`).
12
12
  *
13
- * `agents notify` is the same delivery path with owner defaults
14
- * (`send --to owner`) and is deprecated — new callers should use
15
- * `agents feed post`. Not a second stack. Not agent control — use
16
- * `agents message` / `agents sessions inject` for running agents.
13
+ * `send --to owner` is the owner-delivery path; `agents feed post --level
14
+ * important` records a milestone and broadcasts it through the same sink.
15
+ * Not a second stack. Not agent control — use `agents message` /
16
+ * `agents sessions inject` for running agents.
17
17
  *
18
18
  * Feed / activity are a different plane (record + read); feed.broadcast may
19
19
  * call this command as a forward sink.
@@ -9,7 +9,7 @@ function mergeAttachments(opts) {
9
9
  const list = [...(opts.attach ?? []), ...(opts.attachment ?? [])];
10
10
  return list.length ? list : undefined;
11
11
  }
12
- function toInput(positionalText, opts, ownerMode) {
12
+ function toInput(positionalText, opts) {
13
13
  return {
14
14
  text: opts.text,
15
15
  positionalText,
@@ -20,18 +20,17 @@ function toInput(positionalText, opts, ownerMode) {
20
20
  urls: opts.url,
21
21
  from: opts.from,
22
22
  dryRun: opts.dryRun,
23
- ownerMode,
24
23
  };
25
24
  }
26
- async function runSend(positionalText, opts, ownerMode) {
25
+ async function runSend(positionalText, opts) {
27
26
  const meta = readMeta();
28
- let input = toInput(positionalText, opts, ownerMode);
29
- // An owner-bound ping (`agents notify`, `agents send --to owner`) goes through
27
+ let input = toInput(positionalText, opts);
28
+ // An owner-bound ping (`agents send --to owner`) goes through
30
29
  // the SAME composer as an important `feed post` (PHNX-3698): short-shaped body,
31
30
  // TEAM-N keys linkified, session crumb as a tappable console URL — instead of a
32
31
  // raw dump. A non-owner send (explicit --channel/--to) is delivered verbatim.
33
32
  let ownerCompose;
34
- if (ownerMode || isOwnerAlias(opts.to)) {
33
+ if (isOwnerAlias(opts.to)) {
35
34
  const flagged = opts.text?.trim() ?? '';
36
35
  const positional = (positionalText ?? '').trim();
37
36
  const raw = flagged || positional;
@@ -112,9 +111,6 @@ export function registerSendCommand(program) {
112
111
  # Attach a local file
113
112
  agents send --to owner --text "screenshot" --attach ./out/cover.png
114
113
 
115
- # Owner alias without the notify verb
116
- agents send --to owner --text "wiring test"
117
-
118
114
  # Legacy positional text still works
119
115
  agents send "hi" --channel desktop --to local
120
116
 
@@ -124,47 +120,6 @@ export function registerSendCommand(program) {
124
120
  notes: SHARED_NOTES,
125
121
  });
126
122
  sendCmd.action(async (text, opts) => {
127
- await runSend(text, opts, false);
128
- });
129
- const notifyCmd = program
130
- .command('notify [text]')
131
- .description('[DEPRECATED] Deliver to the owner (alias of send --to owner). Use "agents feed post" for new code.')
132
- .option('--text <text>', 'message body (preferred over positional text)')
133
- .option('--channel <name>', 'override owner channel')
134
- .option('--to <target>', 'override owner target (or pass a non-owner dest with --channel)')
135
- .option('--thread <id>', 'channel thread id / timestamp')
136
- .option('--attach <path...>', 'local file attachment path (repeatable)')
137
- .option('--attachment <path...>', 'alias of --attach')
138
- .option('--url <url...>', 'link or remote media URL to include in the body (repeatable)')
139
- .option('--from <who>', 'sender label (mailbox)')
140
- .option('--json', 'output JSON')
141
- .option('--dry-run', 'resolve + build but do not send');
142
- setHelpSections(notifyCmd, {
143
- examples: `
144
- # Deprecated: prefer "agents feed post --title \"…\" \"…\" --level important"
145
- agents notify --text "Build finished — PR #1346 is green"
146
- agents notify "legacy positional still works"
147
-
148
- # Override channel for this one ping
149
- agents notify --text "fallback" --channel desktop --to local
150
-
151
- agents notify --text "probe" --dry-run --json
152
- `,
153
- notes: `
154
- DEPRECATED. notify ≡ send --to owner and still works, but new callers
155
- should use "agents feed post" (record + optional broadcast) instead.
156
- Set owner.channels + owner.policy.normal in humans.yaml once per fleet.
157
- Every channel listed in the normal policy receives an owner-addressed send.
158
-
159
- Owner sends go through the same composer as "feed post": the body is
160
- short-shaped, any TEAM-N key becomes a Linear URL, and the session crumb
161
- becomes a tappable https://prix.dev/console/sessions/<id> link.
162
-
163
- ${SHARED_NOTES}
164
- `,
165
- });
166
- notifyCmd.action(async (text, opts) => {
167
- console.error(chalk.yellow('Warning: "agents notify" is deprecated. Use "agents feed post" for progress posts that can also reach the owner.'));
168
- await runSend(text, opts, true);
123
+ await runSend(text, opts);
169
124
  });
170
125
  }
@@ -10,7 +10,7 @@
10
10
  // the same idempotent `deployWorker`/`createBucket` primitives. Provisioning is
11
11
  // idempotent — re-running redeploys the current Worker template in place.
12
12
  import chalk from 'chalk';
13
- import { DEFAULT_CF_BUNDLE, readCloudflareCreds } from '../lib/share/config.js';
13
+ import { DEFAULT_CF_BUNDLE, readCloudflareCreds } from '../lib/cloudflare/creds.js';
14
14
  import { PHOENIX_ID_BASE } from '../lib/identity/client.js';
15
15
  import { provisionSessions } from '../lib/session/sync/provision.js';
16
16
  import { DEFAULT_SESSIONS_BUCKET_NAME, DEFAULT_SESSIONS_DOMAIN, DEFAULT_SESSIONS_WORKER_NAME, } from '../lib/session/sync/managed-config.js';
@@ -95,7 +95,6 @@ export function registerSessionsResumeCommand(sessionsCmd) {
95
95
  - Attach a live pane without forking: agents sessions focus <id>.
96
96
  - This is the ONE verb for getting back in. It detects the state: a live tmux pane is attached, a headless session comes to the foreground, an ended one recovers on its owning device.
97
97
  - A UUID/prefix or ag-<agent>-<suffix> alias bypasses the picker. A live alias attaches by name even when the session index cannot attribute it.
98
- - Retired spellings still work for one release and print the replacement: sessions attach, sessions go, reconnect.
99
98
  - Going the other way (foreground -> background) is 'agents sessions detach <id>'.
100
99
  - With no identity selector, space toggles a session, enter confirms, and tab toggles the preview pane.
101
100
  - Layout: one tab per session by default. --splits packs session pairs side by side in each tab.
@@ -1,6 +1,5 @@
1
1
  import type { Command } from 'commander';
2
2
  import type { SessionMeta } from '../lib/session/types.js';
3
- import { type PublishOptions } from '../lib/share/publish.js';
4
3
  interface ShareOptions {
5
4
  public?: boolean;
6
5
  slug?: string;
@@ -13,13 +12,12 @@ interface ShareOptions {
13
12
  /** `session-<shortId>` — stable per session, so re-sharing updates the same URL. */
14
13
  export declare function defaultSessionSlug(session: SessionMeta): string;
15
14
  /**
16
- * Map the command's flags onto {@link PublishOptions}.
15
+ * Build the `artifacts share` argv for a session publish.
17
16
  *
18
- * Extracted so the defaults are testable directly. `unlisted` in particular is the
19
- * security-relevant one — it inverts the parent command's public-by-default
20
- * behavior, and a test that re-implements this mapping would still pass with it
21
- * flipped.
17
+ * Extracted so the mapping is testable directly. The security-relevant default
18
+ * is `--visibility unlisted` — it inverts `artifacts share`'s public default, and
19
+ * a test that re-implements this mapping would still pass with it flipped.
22
20
  */
23
- export declare function buildSharePublishOptions(session: SessionMeta, options: Pick<ShareOptions, 'public' | 'slug' | 'label' | 'expire' | 'force' | 'cover'>): PublishOptions;
21
+ export declare function buildArtifactsShareArgs(session: SessionMeta, options: Pick<ShareOptions, 'public' | 'slug' | 'label' | 'expire' | 'force' | 'cover'>, file: string): string[];
24
22
  export declare function registerSessionsShareCommand(sessionsCmd: Command): void;
25
23
  export {};