@openacp/cli 0.5.0 → 0.5.1

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 (44) hide show
  1. package/README.md +1 -1
  2. package/dist/{agent-catalog-4IAJ7HEG.js → agent-catalog-LAAVBVLY.js} +3 -3
  3. package/dist/agent-dependencies-FCLRGMZM.js +23 -0
  4. package/dist/{agent-registry-B5YAMA4T.js → agent-registry-KZANAFXQ.js} +2 -2
  5. package/dist/{chunk-S3DRLJPM.js → chunk-5MH66WUY.js} +6 -4
  6. package/dist/chunk-5MH66WUY.js.map +1 -0
  7. package/dist/{chunk-LAFKARV3.js → chunk-776VAU3T.js} +2 -2
  8. package/dist/chunk-GUHCS6X7.js +282 -0
  9. package/dist/chunk-GUHCS6X7.js.map +1 -0
  10. package/dist/{chunk-UG6X672R.js → chunk-IURZ4QHG.js} +3 -2
  11. package/dist/chunk-IURZ4QHG.js.map +1 -0
  12. package/dist/{chunk-FWN3UIRT.js → chunk-PHC67OP4.js} +114 -29
  13. package/dist/chunk-PHC67OP4.js.map +1 -0
  14. package/dist/{chunk-D73LCTPF.js → chunk-QODDJ4PH.js} +19 -10
  15. package/dist/chunk-QODDJ4PH.js.map +1 -0
  16. package/dist/cli.js +269 -65
  17. package/dist/cli.js.map +1 -1
  18. package/dist/{config-editor-5L7AJ5AF.js → config-editor-RGV6VKPZ.js} +4 -4
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.js +15 -15
  21. package/dist/integrate-X7LI6MUO.js +257 -0
  22. package/dist/integrate-X7LI6MUO.js.map +1 -0
  23. package/dist/{main-37GLOJ7G.js → main-DSQBCJHR.js} +10 -10
  24. package/dist/{menu-6RCPBVGQ.js → menu-J5YVH665.js} +2 -2
  25. package/dist/{setup-QAS3QW3M.js → setup-3A3XDGCM.js} +3 -3
  26. package/dist/setup-3A3XDGCM.js.map +1 -0
  27. package/dist/suggest-RST5VOHB.js +36 -0
  28. package/dist/suggest-RST5VOHB.js.map +1 -0
  29. package/package.json +2 -1
  30. package/dist/chunk-D73LCTPF.js.map +0 -1
  31. package/dist/chunk-FWN3UIRT.js.map +0 -1
  32. package/dist/chunk-S3DRLJPM.js.map +0 -1
  33. package/dist/chunk-UG6X672R.js.map +0 -1
  34. package/dist/chunk-XJJ7LPXP.js +0 -85
  35. package/dist/chunk-XJJ7LPXP.js.map +0 -1
  36. package/dist/integrate-WUPLRJD3.js +0 -145
  37. package/dist/integrate-WUPLRJD3.js.map +0 -1
  38. /package/dist/{agent-catalog-4IAJ7HEG.js.map → agent-catalog-LAAVBVLY.js.map} +0 -0
  39. /package/dist/{agent-registry-B5YAMA4T.js.map → agent-dependencies-FCLRGMZM.js.map} +0 -0
  40. /package/dist/{config-editor-5L7AJ5AF.js.map → agent-registry-KZANAFXQ.js.map} +0 -0
  41. /package/dist/{chunk-LAFKARV3.js.map → chunk-776VAU3T.js.map} +0 -0
  42. /package/dist/{menu-6RCPBVGQ.js.map → config-editor-RGV6VKPZ.js.map} +0 -0
  43. /package/dist/{main-37GLOJ7G.js.map → main-DSQBCJHR.js.map} +0 -0
  44. /package/dist/{setup-QAS3QW3M.js.map → menu-J5YVH665.js.map} +0 -0
@@ -1,19 +1,19 @@
1
+ import {
2
+ DoctorEngine
3
+ } from "./chunk-IRGYTNLP.js";
1
4
  import {
2
5
  buildMenuKeyboard,
3
6
  buildSkillMessages,
4
7
  handleClear,
5
8
  handleHelp,
6
9
  handleMenu
7
- } from "./chunk-UG6X672R.js";
10
+ } from "./chunk-IURZ4QHG.js";
8
11
  import {
9
12
  AgentCatalog
10
- } from "./chunk-S3DRLJPM.js";
13
+ } from "./chunk-5MH66WUY.js";
11
14
  import {
12
15
  getAgentCapabilities
13
- } from "./chunk-XJJ7LPXP.js";
14
- import {
15
- DoctorEngine
16
- } from "./chunk-IRGYTNLP.js";
16
+ } from "./chunk-GUHCS6X7.js";
17
17
  import {
18
18
  getConfigValue,
19
19
  getSafeFields,
@@ -3709,7 +3709,36 @@ Downloading... ${bar} ${percent}%`, { parse_mode: "HTML" });
3709
3709
  }
3710
3710
  }
3711
3711
  };
3712
- await catalog.install(nameOrId, progress);
3712
+ const result = await catalog.install(nameOrId, progress);
3713
+ if (result.ok) {
3714
+ const { getAgentCapabilities: getAgentCapabilities2 } = await import("./agent-dependencies-FCLRGMZM.js");
3715
+ const caps = getAgentCapabilities2(result.agentKey);
3716
+ if (caps.integration) {
3717
+ const { installIntegration } = await import("./integrate-X7LI6MUO.js");
3718
+ const intResult = await installIntegration(result.agentKey, caps.integration);
3719
+ if (intResult.success) {
3720
+ try {
3721
+ await ctx.reply(`\u{1F517} Handoff integration installed for <b>${escapeHtml(result.agentKey)}</b>`, { parse_mode: "HTML" });
3722
+ } catch {
3723
+ }
3724
+ }
3725
+ }
3726
+ }
3727
+ if (result.ok && result.setupSteps?.length) {
3728
+ let setupText = `\u{1F4CB} <b>Setup for ${escapeHtml(result.agentKey)}:</b>
3729
+
3730
+ `;
3731
+ for (const step of result.setupSteps) {
3732
+ setupText += `\u2192 ${escapeHtml(step)}
3733
+ `;
3734
+ }
3735
+ setupText += `
3736
+ <i>Run in terminal: openacp agents info ${escapeHtml(result.agentKey)}</i>`;
3737
+ try {
3738
+ await ctx.reply(setupText, { parse_mode: "HTML" });
3739
+ } catch {
3740
+ }
3741
+ }
3713
3742
  }
3714
3743
  function truncate(text, maxLen) {
3715
3744
  if (text.length <= maxLen) return text;
@@ -3724,7 +3753,7 @@ function buildProgressBar(percent) {
3724
3753
  // src/adapters/telegram/commands/integrate.ts
3725
3754
  import { InlineKeyboard as InlineKeyboard5 } from "grammy";
3726
3755
  async function handleIntegrate(ctx, _core) {
3727
- const { listIntegrations } = await import("./integrate-WUPLRJD3.js");
3756
+ const { listIntegrations } = await import("./integrate-X7LI6MUO.js");
3728
3757
  const agents = listIntegrations();
3729
3758
  const keyboard = new InlineKeyboard5();
3730
3759
  for (const agent of agents) {
@@ -3757,7 +3786,7 @@ function setupIntegrateCallbacks(bot, core) {
3757
3786
  } catch {
3758
3787
  }
3759
3788
  if (data === "i:back") {
3760
- const { listIntegrations } = await import("./integrate-WUPLRJD3.js");
3789
+ const { listIntegrations } = await import("./integrate-X7LI6MUO.js");
3761
3790
  const agents = listIntegrations();
3762
3791
  const keyboard2 = new InlineKeyboard5();
3763
3792
  for (const agent of agents) {
@@ -3777,7 +3806,7 @@ Select an agent to manage its integrations.`,
3777
3806
  const agentMatch = data.match(/^i:agent:(.+)$/);
3778
3807
  if (agentMatch) {
3779
3808
  const agentName2 = agentMatch[1];
3780
- const { getIntegration: getIntegration2 } = await import("./integrate-WUPLRJD3.js");
3809
+ const { getIntegration: getIntegration2 } = await import("./integrate-X7LI6MUO.js");
3781
3810
  const integration2 = getIntegration2(agentName2);
3782
3811
  if (!integration2) {
3783
3812
  await ctx.reply(`\u274C No integration available for '${escapeHtml(agentName2)}'.`, { parse_mode: "HTML" });
@@ -3804,7 +3833,7 @@ ${integration2.items.map((i) => `\u2022 <b>${escapeHtml(i.name)}</b> \u2014 ${es
3804
3833
  const action = actionMatch[1];
3805
3834
  const agentName = actionMatch[2];
3806
3835
  const itemId = actionMatch[3];
3807
- const { getIntegration } = await import("./integrate-WUPLRJD3.js");
3836
+ const { getIntegration } = await import("./integrate-X7LI6MUO.js");
3808
3837
  const integration = getIntegration(agentName);
3809
3838
  if (!integration) return;
3810
3839
  const item = integration.items.find((i) => i.id === itemId);
@@ -3988,7 +4017,7 @@ Tap to change:`, {
3988
4017
  await ctx.answerCallbackQuery();
3989
4018
  } catch {
3990
4019
  }
3991
- const { buildMenuKeyboard: buildMenuKeyboard3 } = await import("./menu-6RCPBVGQ.js");
4020
+ const { buildMenuKeyboard: buildMenuKeyboard3 } = await import("./menu-J5YVH665.js");
3992
4021
  try {
3993
4022
  await ctx.editMessageText(`<b>OpenACP Menu</b>
3994
4023
  Choose an action:`, {
@@ -4324,9 +4353,29 @@ A session = one conversation with one AI agent working in one project folder.
4324
4353
  Each session gets its own Telegram topic. Chat there to give instructions to the agent.
4325
4354
 
4326
4355
  ### Agents
4327
- An agent is an AI coding tool (e.g., Claude Code). You can configure multiple agents.
4356
+ An agent is an AI coding tool (e.g., Claude Code, Gemini, Cursor, Codex, etc.).
4357
+ OpenACP supports 28+ agents from the official ACP Registry (agentclientprotocol.com).
4358
+ You can install multiple agents and choose which one to use per session.
4328
4359
  The default agent is used when you don't specify one.
4329
4360
 
4361
+ ### Agent Management
4362
+ - Browse agents: \`/agents\` in Telegram or \`openacp agents\` in CLI
4363
+ - Install: tap the install button in /agents, or \`openacp agents install <name>\`
4364
+ - Uninstall: \`openacp agents uninstall <name>\`
4365
+ - Setup/login: \`openacp agents run <name> -- <args>\` (e.g., \`openacp agents run gemini -- auth login\`)
4366
+ - Details: \`openacp agents info <name>\` shows version, dependencies, and setup steps
4367
+
4368
+ Some agents need additional setup before they can be used:
4369
+ - Claude: requires \`claude login\`
4370
+ - Gemini: requires \`openacp agents run gemini -- auth login\`
4371
+ - Codex: requires setting \`OPENAI_API_KEY\` environment variable
4372
+ - GitHub Copilot: requires \`openacp agents run copilot -- auth login\`
4373
+
4374
+ Agents are installed in three ways depending on the agent:
4375
+ - **npx** \u2014 Node.js agents, downloaded automatically on first use
4376
+ - **uvx** \u2014 Python agents, downloaded automatically on first use
4377
+ - **binary** \u2014 Platform-specific binaries, downloaded to \`~/.openacp/agents/\`
4378
+
4330
4379
  ### Project Folder (Workspace)
4331
4380
  The directory where the agent reads, writes, and runs code.
4332
4381
  When creating a session, you choose which folder the agent works in.
@@ -4459,7 +4508,8 @@ Just chat naturally: "How do I create a session?", "What's the status?", "Someth
4459
4508
  | \`/cancel\` | Session topic | Cancel current session |
4460
4509
  | \`/status\` | Anywhere | Show status |
4461
4510
  | \`/sessions\` | Anywhere | List all sessions |
4462
- | \`/agents\` | Anywhere | List available agents |
4511
+ | \`/agents\` | Anywhere | Browse & install agents from ACP Registry |
4512
+ | \`/install <name>\` | Anywhere | Install an agent |
4463
4513
  | \`/enable_dangerous\` | Session topic | Auto-approve all permissions |
4464
4514
  | \`/disable_dangerous\` | Session topic | Restore permission prompts |
4465
4515
  | \`/handoff\` | Session topic | Transfer session to terminal |
@@ -4506,6 +4556,14 @@ Just chat naturally: "How do I create a session?", "What's the status?", "Someth
4506
4556
  - \`openacp config\` \u2014 Interactive config editor
4507
4557
  - \`openacp reset\` \u2014 Delete all data and start fresh
4508
4558
 
4559
+ ### Agent Management (CLI)
4560
+ - \`openacp agents\` \u2014 List all agents (installed + available from ACP Registry)
4561
+ - \`openacp agents install <name>\` \u2014 Install an agent
4562
+ - \`openacp agents uninstall <name>\` \u2014 Remove an agent
4563
+ - \`openacp agents info <name>\` \u2014 Show details, dependencies, and setup guide
4564
+ - \`openacp agents run <name> [-- args]\` \u2014 Run agent CLI directly (for login, config, etc.)
4565
+ - \`openacp agents refresh\` \u2014 Force-refresh registry cache
4566
+
4509
4567
  ### Plugins
4510
4568
  - \`openacp install <package>\` \u2014 Install adapter plugin (e.g., \`@openacp/adapter-discord\`)
4511
4569
  - \`openacp uninstall <package>\` \u2014 Remove adapter plugin
@@ -4564,10 +4622,10 @@ Config file: \`~/.openacp/config.json\`
4564
4622
  - **telegram.chatId** \u2014 Your Telegram supergroup ID
4565
4623
 
4566
4624
  ### Agents
4567
- - **agents.<name>.command** \u2014 Agent executable path (e.g., \`claude\`, \`codex\`)
4568
- - **agents.<name>.args** \u2014 Arguments to pass to the agent command
4569
- - **agents.<name>.env** \u2014 Custom environment variables for the agent subprocess
4570
4625
  - **defaultAgent** \u2014 Which agent to use by default
4626
+ - Agents are managed via \`/agents\` (Telegram) or \`openacp agents\` (CLI)
4627
+ - Installed agents are stored in \`~/.openacp/agents.json\`
4628
+ - Agent list is fetched from the ACP Registry CDN and cached locally (24h)
4571
4629
 
4572
4630
  ### Workspace
4573
4631
  - **workspace.baseDir** \u2014 Base directory for project folders (default: \`~/openacp-workspace\`)
@@ -4619,9 +4677,10 @@ Override config with env vars:
4619
4677
  - Check system health: Assistant can run health check
4620
4678
 
4621
4679
  ### Agent not found
4622
- - Check available agents: \`/agents\`
4623
- - Verify agent command is installed and in PATH
4624
- - Check config: agent command + args must be correct
4680
+ - Check available agents: \`/agents\` or \`openacp agents\`
4681
+ - Install missing agent: \`openacp agents install <name>\`
4682
+ - Some agents need login first: \`openacp agents info <name>\` to see setup steps
4683
+ - Run agent CLI for setup: \`openacp agents run <name> -- <args>\`
4625
4684
 
4626
4685
  ### Permission request not showing
4627
4686
  - Check Notifications topic for the alert
@@ -4652,6 +4711,9 @@ Override config with env vars:
4652
4711
 
4653
4712
  All data is stored in \`~/.openacp/\`:
4654
4713
  - \`config.json\` \u2014 Configuration
4714
+ - \`agents.json\` \u2014 Installed agents (managed by AgentCatalog)
4715
+ - \`registry-cache.json\` \u2014 Cached ACP Registry data (refreshes every 24h)
4716
+ - \`agents/\` \u2014 Downloaded binary agents
4655
4717
  - \`sessions/\` \u2014 Session records and state
4656
4718
  - \`topics/\` \u2014 Topic-to-session mappings
4657
4719
  - \`logs/\` \u2014 System and session logs
@@ -4683,11 +4745,16 @@ async function spawnAssistant(core, adapter, assistantTopicId) {
4683
4745
  statusCounts.set(r.status, (statusCounts.get(r.status) ?? 0) + 1);
4684
4746
  }
4685
4747
  const topicSummary = Array.from(statusCounts.entries()).map(([status, count]) => ({ status, count }));
4748
+ const installedAgents = Object.keys(core.agentCatalog.getInstalledEntries());
4749
+ const availableItems = core.agentCatalog.getAvailable();
4750
+ const availableAgentCount = availableItems.filter((i) => !i.installed).length;
4686
4751
  const ctx = {
4687
4752
  config,
4688
4753
  activeSessionCount: activeCount,
4689
4754
  totalSessionCount: allRecords.length,
4690
- topicSummary
4755
+ topicSummary,
4756
+ installedAgents,
4757
+ availableAgentCount
4691
4758
  };
4692
4759
  const systemPrompt = buildAssistantSystemPrompt(ctx);
4693
4760
  const ready = session.enqueuePrompt(systemPrompt).then(() => {
@@ -4719,15 +4786,16 @@ Agents: ${agentList}`;
4719
4786
  Agents: ${agentList}`;
4720
4787
  }
4721
4788
  function buildAssistantSystemPrompt(ctx) {
4722
- const { config, activeSessionCount, totalSessionCount, topicSummary } = ctx;
4723
- const agentNames = Object.keys(config.agents).join(", ");
4789
+ const { config, activeSessionCount, totalSessionCount, topicSummary, installedAgents, availableAgentCount } = ctx;
4790
+ const agentNames = installedAgents?.length ? installedAgents.join(", ") : Object.keys(config.agents).join(", ");
4724
4791
  const topicBreakdown = topicSummary.map((s) => `${s.status}: ${s.count}`).join(", ") || "none";
4725
4792
  return `You are the OpenACP Assistant \u2014 a helpful guide for managing AI coding sessions.
4726
4793
 
4727
4794
  ## Current State
4728
4795
  - Active sessions: ${activeSessionCount} / ${totalSessionCount} total
4729
4796
  - Topics by status: ${topicBreakdown}
4730
- - Available agents: ${agentNames}
4797
+ - Installed agents: ${agentNames}
4798
+ - Available in ACP Registry: ${availableAgentCount ?? "28+"} more agents (use /agents to browse)
4731
4799
  - Default agent: ${config.defaultAgent}
4732
4800
  - Workspace base directory: ${config.workspace.baseDir}
4733
4801
 
@@ -4735,11 +4803,22 @@ function buildAssistantSystemPrompt(ctx) {
4735
4803
 
4736
4804
  ### Create Session
4737
4805
  - The workspace is the project directory where the agent will work (read, write, execute code). It is NOT the base directory \u2014 it should be a specific project folder like \`~/code/my-project\` or \`${config.workspace.baseDir}/my-app\`.
4738
- - Ask which agent to use (if multiple are configured). Show available: ${agentNames}
4806
+ - Ask which agent to use (if multiple are installed). Show installed: ${agentNames}
4739
4807
  - Ask which project directory to use as workspace. Suggest \`${config.workspace.baseDir}\` as the base, but explain the user can provide any path.
4740
4808
  - Confirm before creating: show agent name + full workspace path.
4741
4809
  - Create via: \`openacp api new <agent> <workspace>\`
4742
4810
 
4811
+ ### Browse & Install Agents
4812
+ - Guide users to /agents command to see all available agents (installed + from ACP Registry)
4813
+ - The /agents list is paginated with install buttons \u2014 users can tap to install directly
4814
+ - For CLI users: \`openacp agents install <name>\`
4815
+ - Some agents need login/setup after install \u2014 guide users to \`openacp agents info <name>\` for setup steps
4816
+ - To run agent CLI for login: \`openacp agents run <name> -- <args>\`
4817
+ - Common setup examples:
4818
+ - Gemini: \`openacp agents run gemini -- auth login\`
4819
+ - GitHub Copilot: \`openacp agents run copilot -- auth login\`
4820
+ - Codex: needs OPENAI_API_KEY environment variable
4821
+
4743
4822
  ### Check Status / List Sessions
4744
4823
  - Run \`openacp api status\` for active sessions overview
4745
4824
  - Run \`openacp api topics\` for full list with statuses
@@ -4792,12 +4871,18 @@ openacp api delete-topic <id> --force # Force delete active
4792
4871
  openacp api cleanup # Cleanup finished topics
4793
4872
  openacp api cleanup --status finished,error
4794
4873
 
4874
+ # Agent management (user-facing CLI commands)
4875
+ openacp agents # List installed + available agents
4876
+ openacp agents install <name> # Install agent from ACP Registry
4877
+ openacp agents uninstall <name> # Remove agent
4878
+ openacp agents info <name> # Show details & setup guide
4879
+ openacp agents run <name> -- <args> # Run agent CLI (for login, etc.)
4880
+ openacp agents refresh # Force-refresh registry
4881
+
4795
4882
  # System
4796
4883
  openacp api health # System health
4797
4884
  openacp config # Edit config (interactive)
4798
4885
  openacp config set <key> <value> # Update config value
4799
- openacp api config # Show config (deprecated)
4800
- openacp api config set <key> <value> # Update config (deprecated)
4801
4886
  openacp api adapters # List adapters
4802
4887
  openacp api tunnel # Tunnel status
4803
4888
  openacp api notify "message" # Send notification
@@ -5956,7 +6041,7 @@ var TelegramAdapter = class extends ChannelAdapter {
5956
6041
  });
5957
6042
  return;
5958
6043
  }
5959
- const { getAgentCapabilities: getAgentCapabilities2 } = await import("./agent-registry-B5YAMA4T.js");
6044
+ const { getAgentCapabilities: getAgentCapabilities2 } = await import("./agent-registry-KZANAFXQ.js");
5960
6045
  const caps = getAgentCapabilities2(agentName);
5961
6046
  if (!caps.supportsResume || !caps.resumeCommand) {
5962
6047
  await ctx.reply("This agent does not support session transfer.", {
@@ -6332,4 +6417,4 @@ export {
6332
6417
  TopicManager,
6333
6418
  TelegramAdapter
6334
6419
  };
6335
- //# sourceMappingURL=chunk-FWN3UIRT.js.map
6420
+ //# sourceMappingURL=chunk-PHC67OP4.js.map