@phnx-labs/agents-cli 1.19.2 → 1.20.3

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 (156) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/README.md +72 -12
  3. package/dist/browser.js +0 -0
  4. package/dist/commands/browser.js +88 -16
  5. package/dist/commands/cli.d.ts +14 -0
  6. package/dist/commands/cli.js +244 -0
  7. package/dist/commands/cloud.js +1 -1
  8. package/dist/commands/commands.js +27 -10
  9. package/dist/commands/computer.js +18 -1
  10. package/dist/commands/doctor.d.ts +1 -1
  11. package/dist/commands/doctor.js +2 -2
  12. package/dist/commands/exec.js +38 -18
  13. package/dist/commands/factory.d.ts +3 -14
  14. package/dist/commands/factory.js +3 -3
  15. package/dist/commands/feedback.d.ts +7 -0
  16. package/dist/commands/feedback.js +89 -0
  17. package/dist/commands/helper.d.ts +12 -0
  18. package/dist/commands/helper.js +87 -0
  19. package/dist/commands/hooks.js +89 -10
  20. package/dist/commands/mcp.js +166 -10
  21. package/dist/commands/packages.js +196 -27
  22. package/dist/commands/permissions.js +21 -6
  23. package/dist/commands/plugins.js +11 -4
  24. package/dist/commands/profiles.d.ts +8 -0
  25. package/dist/commands/profiles.js +118 -5
  26. package/dist/commands/prune.js +39 -160
  27. package/dist/commands/pull.js +58 -5
  28. package/dist/commands/routines.js +107 -14
  29. package/dist/commands/rules.js +8 -4
  30. package/dist/commands/secrets-migrate.d.ts +24 -0
  31. package/dist/commands/secrets-migrate.js +198 -0
  32. package/dist/commands/secrets-sync.d.ts +11 -0
  33. package/dist/commands/secrets-sync.js +155 -0
  34. package/dist/commands/secrets.js +79 -46
  35. package/dist/commands/sessions.d.ts +28 -0
  36. package/dist/commands/sessions.js +98 -33
  37. package/dist/commands/setup.d.ts +1 -0
  38. package/dist/commands/setup.js +37 -28
  39. package/dist/commands/skills.js +25 -8
  40. package/dist/commands/subagents.js +69 -49
  41. package/dist/commands/teams.js +61 -10
  42. package/dist/commands/utils.d.ts +33 -0
  43. package/dist/commands/utils.js +139 -0
  44. package/dist/commands/versions.d.ts +4 -3
  45. package/dist/commands/versions.js +134 -130
  46. package/dist/commands/view.d.ts +6 -0
  47. package/dist/commands/view.js +175 -19
  48. package/dist/commands/workflows.js +29 -6
  49. package/dist/computer.js +0 -0
  50. package/dist/index.js +38 -6
  51. package/dist/lib/acp/client.js +6 -1
  52. package/dist/lib/acp/harnesses.js +8 -0
  53. package/dist/lib/agents.d.ts +4 -0
  54. package/dist/lib/agents.js +125 -34
  55. package/dist/lib/auto-pull-worker.js +18 -1
  56. package/dist/lib/browser/cdp.d.ts +8 -1
  57. package/dist/lib/browser/cdp.js +40 -3
  58. package/dist/lib/browser/chrome.d.ts +13 -0
  59. package/dist/lib/browser/chrome.js +46 -3
  60. package/dist/lib/browser/domain-skills.d.ts +51 -0
  61. package/dist/lib/browser/domain-skills.js +157 -0
  62. package/dist/lib/browser/drivers/local.js +45 -4
  63. package/dist/lib/browser/drivers/ssh.js +2 -2
  64. package/dist/lib/browser/ipc.d.ts +8 -1
  65. package/dist/lib/browser/ipc.js +37 -28
  66. package/dist/lib/browser/profiles.d.ts +16 -3
  67. package/dist/lib/browser/profiles.js +44 -4
  68. package/dist/lib/browser/service.d.ts +3 -0
  69. package/dist/lib/browser/service.js +40 -5
  70. package/dist/lib/browser/types.d.ts +11 -4
  71. package/dist/lib/cli-resources.d.ts +137 -0
  72. package/dist/lib/cli-resources.js +477 -0
  73. package/dist/lib/cloud/factory.d.ts +1 -1
  74. package/dist/lib/cloud/factory.js +1 -1
  75. package/dist/lib/cloud/rush.js +5 -5
  76. package/dist/lib/command-skills.js +0 -2
  77. package/dist/lib/computer-rpc.d.ts +3 -0
  78. package/dist/lib/computer-rpc.js +53 -0
  79. package/dist/lib/daemon.js +20 -0
  80. package/dist/lib/events.d.ts +16 -2
  81. package/dist/lib/events.js +33 -2
  82. package/dist/lib/exec.d.ts +42 -13
  83. package/dist/lib/exec.js +127 -33
  84. package/dist/lib/help.js +11 -5
  85. package/dist/lib/hooks/cache.d.ts +38 -0
  86. package/dist/lib/hooks/cache.js +242 -0
  87. package/dist/lib/hooks/profile.d.ts +33 -0
  88. package/dist/lib/hooks/profile.js +129 -0
  89. package/dist/lib/hooks.d.ts +0 -10
  90. package/dist/lib/hooks.js +246 -11
  91. package/dist/lib/mcp.d.ts +15 -0
  92. package/dist/lib/mcp.js +46 -0
  93. package/dist/lib/migrate.js +1 -1
  94. package/dist/lib/overdue.d.ts +26 -0
  95. package/dist/lib/overdue.js +101 -0
  96. package/dist/lib/permissions.d.ts +13 -0
  97. package/dist/lib/permissions.js +55 -1
  98. package/dist/lib/plugin-marketplace.js +1 -1
  99. package/dist/lib/plugins.js +15 -1
  100. package/dist/lib/profiles-presets.d.ts +26 -0
  101. package/dist/lib/profiles-presets.js +216 -0
  102. package/dist/lib/profiles.d.ts +34 -0
  103. package/dist/lib/profiles.js +112 -1
  104. package/dist/lib/resources/mcp.js +37 -0
  105. package/dist/lib/resources.d.ts +1 -1
  106. package/dist/lib/rotate.js +10 -4
  107. package/dist/lib/routines-format.d.ts +47 -0
  108. package/dist/lib/routines-format.js +194 -0
  109. package/dist/lib/routines.d.ts +8 -2
  110. package/dist/lib/routines.js +34 -14
  111. package/dist/lib/runner.js +83 -15
  112. package/dist/lib/scheduler.js +8 -1
  113. package/dist/lib/secrets/Agents CLI.app/Contents/CodeResources +0 -0
  114. package/dist/lib/secrets/Agents CLI.app/Contents/MacOS/Agents CLI +0 -0
  115. package/dist/lib/secrets/Agents CLI.app/Contents/_CodeSignature/CodeResources +1 -9
  116. package/dist/lib/secrets/bundles.d.ts +34 -17
  117. package/dist/lib/secrets/bundles.js +210 -36
  118. package/dist/lib/secrets/index.d.ts +49 -30
  119. package/dist/lib/secrets/index.js +126 -115
  120. package/dist/lib/secrets/install-helper.d.ts +45 -0
  121. package/dist/lib/secrets/install-helper.js +165 -0
  122. package/dist/lib/secrets/linux.js +4 -4
  123. package/dist/lib/secrets/sync.d.ts +56 -0
  124. package/dist/lib/secrets/sync.js +180 -0
  125. package/dist/lib/session/active.d.ts +8 -0
  126. package/dist/lib/session/active.js +3 -2
  127. package/dist/lib/session/db.d.ts +0 -4
  128. package/dist/lib/session/db.js +0 -26
  129. package/dist/lib/session/parse.d.ts +1 -0
  130. package/dist/lib/session/parse.js +44 -0
  131. package/dist/lib/session/render.js +4 -4
  132. package/dist/lib/session/types.d.ts +2 -2
  133. package/dist/lib/session/types.js +1 -1
  134. package/dist/lib/shims.d.ts +5 -2
  135. package/dist/lib/shims.js +70 -38
  136. package/dist/lib/state.d.ts +14 -2
  137. package/dist/lib/state.js +51 -20
  138. package/dist/lib/teams/agents.d.ts +5 -4
  139. package/dist/lib/teams/agents.js +48 -22
  140. package/dist/lib/teams/api.d.ts +2 -1
  141. package/dist/lib/teams/api.js +4 -3
  142. package/dist/lib/teams/parsers.d.ts +1 -1
  143. package/dist/lib/teams/parsers.js +153 -3
  144. package/dist/lib/teams/summarizer.js +18 -2
  145. package/dist/lib/teams/worktree.js +14 -3
  146. package/dist/lib/types.d.ts +63 -4
  147. package/dist/lib/types.js +8 -3
  148. package/dist/lib/usage.d.ts +27 -2
  149. package/dist/lib/usage.js +100 -17
  150. package/dist/lib/versions.d.ts +45 -3
  151. package/dist/lib/versions.js +455 -60
  152. package/package.json +15 -14
  153. package/scripts/install-helper.js +97 -0
  154. package/scripts/postinstall.js +16 -0
  155. package/dist/lib/secrets/Agents CLI.app/Contents/embedded.provisionprofile +0 -0
  156. package/npm-shrinkwrap.json +0 -3162
@@ -7,7 +7,7 @@ import { AGENTS, ALL_AGENT_IDS, getAccountEmail, getAccountInfo, agentLabel, } f
7
7
  import { formatUsageSummary, getUsageInfoForIdentity, getUsageInfoByIdentity, getUsageLookupKey, } from '../lib/usage.js';
8
8
  import { viewAction } from './view.js';
9
9
  import { readManifest, writeManifest, createDefaultManifest } from '../lib/manifest.js';
10
- import { installVersion, removeVersion, listInstalledVersions, isVersionInstalled, isLatestInstalled, getGlobalDefault, setGlobalDefault, getVersionHomePath, getVersionDir, syncResourcesToVersion, parseAgentSpec, promptResourceSelection, promptNewResourceSelection, getAvailableResources, getActuallySyncedResources, getNewResources, hasNewResources, } from '../lib/versions.js';
10
+ import { installVersion, removeVersion, listInstalledVersions, isVersionInstalled, isLatestInstalled, getGlobalDefault, setGlobalDefault, getVersionHomePath, getVersionDir, syncResourcesToVersion, parseAgentSpec, promptResourceSelection, promptNewResourceSelection, getAvailableResources, getActuallySyncedResources, getNewResources, getProjectOnlyResources, hasNewResources, printTrashFooter, } from '../lib/versions.js';
11
11
  import { createShim, createVersionedAlias, removeShim, shimExists, getShimsDir, getShimPath, getPathShadowingExecutable, isShimsInPath, getPathSetupInstructions, addShimsToPath, switchConfigSymlink, switchHomeFileSymlinks, } from '../lib/shims.js';
12
12
  import { isInteractiveTerminal, isPromptCancelled, requireInteractiveSelection } from './utils.js';
13
13
  import { tryAutoPull } from '../lib/git.js';
@@ -93,7 +93,130 @@ function warnIfShimShadowed(agent) {
93
93
  console.log(chalk.gray(` Managed shim: ${getShimPath(agent)}`));
94
94
  console.log(chalk.gray(` ${getPathSetupInstructions().split('\n').join('\n ')}`));
95
95
  }
96
- /** Register `agents add`, `agents remove`, `agents use`, and `agents list` (deprecated). */
96
+ async function versionPruneAction(specs, options, commandName) {
97
+ const isProject = options.project;
98
+ const moved = [];
99
+ for (const spec of specs) {
100
+ const parsed = parseAgentSpec(spec);
101
+ if (!parsed) {
102
+ console.log(chalk.red(`Invalid agent: ${spec}`));
103
+ console.log(chalk.gray(`Format: <agent>[@version]. Available: ${ALL_AGENT_IDS.join(', ')}`));
104
+ continue;
105
+ }
106
+ const { agent, version } = parsed;
107
+ const agentConfig = AGENTS[agent];
108
+ if (version === 'latest' || !spec.includes('@')) {
109
+ const versions = listInstalledVersions(agent);
110
+ if (versions.length === 0) {
111
+ console.log(chalk.gray(`No versions of ${agentLabel(agentConfig.id)} installed`));
112
+ continue;
113
+ }
114
+ if (!isInteractiveTerminal()) {
115
+ requireInteractiveSelection(`Selecting ${agentLabel(agentConfig.id)} versions to ${commandName}`, [
116
+ `agents ${commandName} ${agent}@${versions[0]}`,
117
+ ]);
118
+ }
119
+ const globalDefault = getGlobalDefault(agent);
120
+ const sortedVersions = [...versions].sort((a, b) => {
121
+ if (a === globalDefault)
122
+ return -1;
123
+ if (b === globalDefault)
124
+ return 1;
125
+ return 0;
126
+ });
127
+ try {
128
+ const toRemove = await checkbox({
129
+ message: `Select ${agentLabel(agentConfig.id)} versions to ${commandName}:`,
130
+ choices: sortedVersions.map((v) => ({
131
+ name: v === globalDefault ? `${v} ${chalk.green('(default)')}` : v,
132
+ value: v,
133
+ checked: false,
134
+ })),
135
+ });
136
+ if (toRemove.length === 0) {
137
+ console.log(chalk.gray('No versions selected'));
138
+ continue;
139
+ }
140
+ for (const v of toRemove) {
141
+ const versionDir = getVersionDir(agent, v);
142
+ removeVersion(agent, v);
143
+ fixSessionFilePaths(agent, v, versionDir);
144
+ console.log(chalk.green(`Moved ${agentLabel(agentConfig.id)}@${v} to trash`));
145
+ moved.push({ agent, version: v });
146
+ }
147
+ if (globalDefault && toRemove.includes(globalDefault)) {
148
+ setGlobalDefault(agent, undefined);
149
+ console.log(chalk.yellow(`Default version removed. Run: agents use ${agent}@<version> to set a new default`));
150
+ }
151
+ const remaining = listInstalledVersions(agent);
152
+ if (remaining.length === 0) {
153
+ removeShim(agent);
154
+ }
155
+ }
156
+ catch (err) {
157
+ if (isPromptCancelled(err)) {
158
+ console.log(chalk.gray('Cancelled'));
159
+ continue;
160
+ }
161
+ throw err;
162
+ }
163
+ }
164
+ else if (!isVersionInstalled(agent, version)) {
165
+ console.log(chalk.gray(`${agentLabel(agentConfig.id)}@${version} not installed`));
166
+ }
167
+ else {
168
+ const versionDir = getVersionDir(agent, version);
169
+ removeVersion(agent, version);
170
+ fixSessionFilePaths(agent, version, versionDir);
171
+ console.log(chalk.green(`Moved ${agentLabel(agentConfig.id)}@${version} to trash`));
172
+ moved.push({ agent, version });
173
+ const remaining = listInstalledVersions(agent);
174
+ if (remaining.length === 0) {
175
+ removeShim(agent);
176
+ }
177
+ }
178
+ if (isProject) {
179
+ const projectManifestPath = path.join(process.cwd(), '.agents', 'agents.yaml');
180
+ if (fs.existsSync(projectManifestPath)) {
181
+ const manifest = readManifest(process.cwd());
182
+ if (manifest?.agents?.[agent]) {
183
+ delete manifest.agents[agent];
184
+ writeManifest(process.cwd(), manifest);
185
+ console.log(chalk.gray(` Removed from .agents/agents.yaml`));
186
+ }
187
+ }
188
+ }
189
+ }
190
+ printTrashFooter(moved);
191
+ }
192
+ function configureVersionPruneCommand(cmd, commandName) {
193
+ const isAlias = commandName === 'remove';
194
+ cmd
195
+ .description(isAlias
196
+ ? 'Alias for agents prune. Uninstalls agent CLI versions.'
197
+ : 'Uninstall agent CLI versions. Moves version data to trash for recovery.')
198
+ .option('-p, --project', 'Also clear the pinned version from .agents/agents.yaml in the current project');
199
+ setHelpSections(cmd, {
200
+ examples: `
201
+ # Prune a specific version
202
+ agents ${commandName} claude@2.0.50
203
+
204
+ # Pick interactively if you omit the version
205
+ agents ${commandName} claude
206
+
207
+ # Prune and also clear the project pin
208
+ agents ${commandName} claude@2.0.50 --project
209
+ `,
210
+ notes: `
211
+ - Pruned version directories move to trash with their home/ data intact.
212
+ - Session file paths are rewritten so session history remains readable.
213
+ - Removing the default version unsets the default; run 'agents use' to pick a new one.
214
+ - Reinstall any time with 'agents add'.
215
+ `,
216
+ });
217
+ cmd.action((specs, options) => versionPruneAction(specs, options, commandName));
218
+ }
219
+ /** Register `agents add`, `agents prune`, `agents remove`, `agents use`, and `agents list` (deprecated). */
97
220
  export function registerVersionsCommands(program) {
98
221
  const addCmd = program
99
222
  .command('add <specs...>')
@@ -132,7 +255,7 @@ export function registerVersionsCommands(program) {
132
255
  }
133
256
  const { agent, version } = parsed;
134
257
  const agentConfig = AGENTS[agent];
135
- if (!agentConfig.npmPackage) {
258
+ if (!agentConfig.npmPackage && !agentConfig.installScript) {
136
259
  console.log(chalk.yellow(`${agentLabel(agentConfig.id)} has no npm package. Install manually.`));
137
260
  continue;
138
261
  }
@@ -170,7 +293,7 @@ export function registerVersionsCommands(program) {
170
293
  // Smart resource detection: compare available vs ACTUALLY synced (source of truth: files)
171
294
  const available = getAvailableResources();
172
295
  const actuallySynced = getActuallySyncedResources(agent, installedVersion);
173
- const newResources = getNewResources(available, actuallySynced);
296
+ const newResources = getNewResources(available, actuallySynced, getProjectOnlyResources());
174
297
  const hasAnySynced = actuallySynced.commands.length > 0 ||
175
298
  actuallySynced.skills.length > 0 ||
176
299
  actuallySynced.hooks.length > 0 ||
@@ -195,9 +318,9 @@ export function registerVersionsCommands(program) {
195
318
  selection = userSelection;
196
319
  }
197
320
  }
198
- else if (hasNewResources(newResources, agent)) {
321
+ else if (hasNewResources(newResources, agent, installedVersion)) {
199
322
  // Some synced, but NEW resources available - prompt for new only
200
- const userSelection = await promptNewResourceSelection(agent, newResources);
323
+ const userSelection = await promptNewResourceSelection(agent, newResources, installedVersion);
201
324
  if (userSelection) {
202
325
  selection = userSelection;
203
326
  }
@@ -311,127 +434,8 @@ export function registerVersionsCommands(program) {
311
434
  }
312
435
  }
313
436
  });
314
- const removeCmd = program
315
- .command('remove <specs...>')
316
- .description('Uninstall agent CLI versions. Frees disk space and removes the version\'s auth token.')
317
- .option('-p, --project', 'Also clear the pinned version from .agents/agents.yaml in the current project');
318
- setHelpSections(removeCmd, {
319
- examples: `
320
- # Remove a specific version
321
- agents remove claude@2.0.50
322
-
323
- # Pick interactively if you omit the version
324
- agents remove claude
325
-
326
- # Remove and also clear the project pin
327
- agents remove claude@2.0.50 --project
328
- `,
329
- notes: `
330
- - Removing the default version unsets the default; run 'agents use' to pick a new one.
331
- - Reinstall any time with 'agents add'.
332
- `,
333
- });
334
- removeCmd.action(async (specs, options) => {
335
- const isProject = options.project;
336
- for (const spec of specs) {
337
- const parsed = parseAgentSpec(spec);
338
- if (!parsed) {
339
- console.log(chalk.red(`Invalid agent: ${spec}`));
340
- console.log(chalk.gray(`Format: <agent>[@version]. Available: ${ALL_AGENT_IDS.join(', ')}`));
341
- continue;
342
- }
343
- const { agent, version } = parsed;
344
- const agentConfig = AGENTS[agent];
345
- if (version === 'latest' || !spec.includes('@')) {
346
- // Show picker for which versions to remove
347
- const versions = listInstalledVersions(agent);
348
- if (versions.length === 0) {
349
- console.log(chalk.gray(`No versions of ${agentLabel(agentConfig.id)} installed`));
350
- continue;
351
- }
352
- if (!isInteractiveTerminal()) {
353
- requireInteractiveSelection(`Selecting ${agentLabel(agentConfig.id)} versions to remove`, [
354
- `agents remove ${agent}@${versions[0]}`,
355
- ]);
356
- }
357
- const globalDefault = getGlobalDefault(agent);
358
- // Sort versions with default first
359
- const sortedVersions = [...versions].sort((a, b) => {
360
- if (a === globalDefault)
361
- return -1;
362
- if (b === globalDefault)
363
- return 1;
364
- return 0;
365
- });
366
- try {
367
- const toRemove = await checkbox({
368
- message: `Select ${agentLabel(agentConfig.id)} versions to remove:`,
369
- choices: sortedVersions.map((v) => ({
370
- name: v === globalDefault ? `${v} ${chalk.green('(default)')}` : v,
371
- value: v,
372
- checked: false, // All unchecked by default
373
- })),
374
- });
375
- if (toRemove.length === 0) {
376
- console.log(chalk.gray('No versions selected'));
377
- continue;
378
- }
379
- for (const v of toRemove) {
380
- const versionDir = getVersionDir(agent, v);
381
- removeVersion(agent, v);
382
- fixSessionFilePaths(agent, v, versionDir);
383
- console.log(chalk.green(`Removed ${agentLabel(agentConfig.id)}@${v}`));
384
- }
385
- // Check if default was removed
386
- if (globalDefault && toRemove.includes(globalDefault)) {
387
- setGlobalDefault(agent, undefined);
388
- console.log(chalk.yellow(`Default version removed. Run: agents use ${agent}@<version> to set a new default`));
389
- }
390
- // Remove shim if no versions left
391
- const remaining = listInstalledVersions(agent);
392
- if (remaining.length === 0) {
393
- removeShim(agent);
394
- }
395
- }
396
- catch (err) {
397
- if (isPromptCancelled(err)) {
398
- console.log(chalk.gray('Cancelled'));
399
- continue;
400
- }
401
- throw err;
402
- }
403
- }
404
- else {
405
- // Remove specific version
406
- if (!isVersionInstalled(agent, version)) {
407
- console.log(chalk.gray(`${agentLabel(agentConfig.id)}@${version} not installed`));
408
- }
409
- else {
410
- const versionDir = getVersionDir(agent, version);
411
- removeVersion(agent, version);
412
- fixSessionFilePaths(agent, version, versionDir);
413
- console.log(chalk.green(`Removed ${agentLabel(agentConfig.id)}@${version}`));
414
- // Remove shim if no versions left
415
- const remaining = listInstalledVersions(agent);
416
- if (remaining.length === 0) {
417
- removeShim(agent);
418
- }
419
- }
420
- }
421
- // Update project manifest if -p flag
422
- if (isProject) {
423
- const projectManifestPath = path.join(process.cwd(), '.agents', 'agents.yaml');
424
- if (fs.existsSync(projectManifestPath)) {
425
- const manifest = readManifest(process.cwd());
426
- if (manifest?.agents?.[agent]) {
427
- delete manifest.agents[agent];
428
- writeManifest(process.cwd(), manifest);
429
- console.log(chalk.gray(` Removed from .agents/agents.yaml`));
430
- }
431
- }
432
- }
433
- }
434
- });
437
+ configureVersionPruneCommand(program.command('prune <specs...>'), 'prune');
438
+ configureVersionPruneCommand(program.command('remove <specs...>', { hidden: true }), 'remove');
435
439
  const useCmd = program
436
440
  .command('use <agent> [version]')
437
441
  .description('Switch the active version for an agent. This is the only command that sets the default.')
@@ -573,7 +577,7 @@ export function registerVersionsCommands(program) {
573
577
  // Smart resource detection: compare available vs ACTUALLY synced (source of truth: files, not tracking)
574
578
  const available = getAvailableResources();
575
579
  const actuallySynced = getActuallySyncedResources(agentId, finalVersion);
576
- const newResources = getNewResources(available, actuallySynced);
580
+ const newResources = getNewResources(available, actuallySynced, getProjectOnlyResources());
577
581
  // Check if anything is actually synced (source of truth: actual files)
578
582
  const hasAnySynced = actuallySynced.commands.length > 0 ||
579
583
  actuallySynced.skills.length > 0 ||
@@ -638,9 +642,9 @@ export function registerVersionsCommands(program) {
638
642
  }
639
643
  }
640
644
  }
641
- else if (hasNewResources(newResources, agentId)) {
645
+ else if (hasNewResources(newResources, agentId, finalVersion)) {
642
646
  // Has synced before, but NEW items available
643
- const userSelection = await promptNewResourceSelection(agentId, newResources);
647
+ const userSelection = await promptNewResourceSelection(agentId, newResources, finalVersion);
644
648
  if (userSelection && Object.keys(userSelection).length > 0) {
645
649
  const syncResult = syncResourcesToVersion(agentId, finalVersion, userSelection);
646
650
  const syncedTypes = [];
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import type { Command } from 'commander';
10
10
  import type { AgentId } from '../lib/types.js';
11
+ import { type ProfileSummary } from '../lib/profiles.js';
11
12
  /** Machine-readable entry for a single installed version. */
12
13
  export interface ViewJsonVersion {
13
14
  version: string;
@@ -16,6 +17,10 @@ export interface ViewJsonVersion {
16
17
  email: string | null;
17
18
  plan: string | null;
18
19
  usageStatus: 'available' | 'rate_limited' | 'out_of_credits' | null;
20
+ overageCredits?: {
21
+ amount: number;
22
+ currency: string;
23
+ } | null;
19
24
  windows: Array<{
20
25
  key: 'session' | 'week' | 'sonnet_week';
21
26
  usedPercent: number;
@@ -28,6 +33,7 @@ export interface ViewJsonVersion {
28
33
  export interface ViewJsonAgent {
29
34
  agent: AgentId;
30
35
  versions: ViewJsonVersion[];
36
+ profiles: ProfileSummary[];
31
37
  }
32
38
  /**
33
39
  * Prune older installed versions that share an email with a newer installed