longer-agent 0.1.0 → 0.1.2

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 (96) hide show
  1. package/README.md +84 -43
  2. package/README.zh-CN.md +83 -42
  3. package/agent_templates/main/agent.yaml +1 -0
  4. package/dist/auth/openai-oauth.d.ts.map +1 -1
  5. package/dist/auth/openai-oauth.js +6 -10
  6. package/dist/auth/openai-oauth.js.map +1 -1
  7. package/dist/cli.d.ts +1 -2
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +81 -60
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands.d.ts +6 -1
  12. package/dist/commands.d.ts.map +1 -1
  13. package/dist/commands.js +115 -26
  14. package/dist/commands.js.map +1 -1
  15. package/dist/config.d.ts +19 -26
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +80 -120
  18. package/dist/config.js.map +1 -1
  19. package/dist/dotenv.d.ts +18 -0
  20. package/dist/dotenv.d.ts.map +1 -0
  21. package/dist/dotenv.js +91 -0
  22. package/dist/dotenv.js.map +1 -0
  23. package/dist/home-path.d.ts +3 -0
  24. package/dist/home-path.d.ts.map +1 -0
  25. package/dist/home-path.js +7 -0
  26. package/dist/home-path.js.map +1 -0
  27. package/dist/index.d.ts +6 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +10 -2
  30. package/dist/index.js.map +1 -1
  31. package/dist/init-wizard.d.ts +2 -3
  32. package/dist/init-wizard.d.ts.map +1 -1
  33. package/dist/init-wizard.js +349 -145
  34. package/dist/init-wizard.js.map +1 -1
  35. package/dist/managed-provider-credentials.d.ts +23 -0
  36. package/dist/managed-provider-credentials.d.ts.map +1 -0
  37. package/dist/managed-provider-credentials.js +56 -0
  38. package/dist/managed-provider-credentials.js.map +1 -0
  39. package/dist/mcp-client.d.ts.map +1 -1
  40. package/dist/mcp-client.js +2 -1
  41. package/dist/mcp-client.js.map +1 -1
  42. package/dist/mcp-config.d.ts +13 -0
  43. package/dist/mcp-config.d.ts.map +1 -0
  44. package/dist/mcp-config.js +64 -0
  45. package/dist/mcp-config.js.map +1 -0
  46. package/dist/model-discovery.d.ts +20 -0
  47. package/dist/model-discovery.d.ts.map +1 -0
  48. package/dist/model-discovery.js +47 -0
  49. package/dist/model-discovery.js.map +1 -0
  50. package/dist/model-selection.d.ts +1 -1
  51. package/dist/model-selection.d.ts.map +1 -1
  52. package/dist/model-selection.js +20 -10
  53. package/dist/model-selection.js.map +1 -1
  54. package/dist/persistence.d.ts +12 -0
  55. package/dist/persistence.d.ts.map +1 -1
  56. package/dist/persistence.js +8 -6
  57. package/dist/persistence.js.map +1 -1
  58. package/dist/provider-credential-flow.d.ts +28 -0
  59. package/dist/provider-credential-flow.d.ts.map +1 -0
  60. package/dist/provider-credential-flow.js +112 -0
  61. package/dist/provider-credential-flow.js.map +1 -0
  62. package/dist/provider-presets.d.ts +4 -0
  63. package/dist/provider-presets.d.ts.map +1 -1
  64. package/dist/provider-presets.js +26 -9
  65. package/dist/provider-presets.js.map +1 -1
  66. package/dist/providers/registry.d.ts.map +1 -1
  67. package/dist/providers/registry.js +3 -2
  68. package/dist/providers/registry.js.map +1 -1
  69. package/dist/session.d.ts +6 -15
  70. package/dist/session.d.ts.map +1 -1
  71. package/dist/session.js +34 -60
  72. package/dist/session.js.map +1 -1
  73. package/dist/settings.d.ts +8 -27
  74. package/dist/settings.d.ts.map +1 -1
  75. package/dist/settings.js +4 -108
  76. package/dist/settings.js.map +1 -1
  77. package/dist/tui/app.d.ts.map +1 -1
  78. package/dist/tui/app.js +116 -2
  79. package/dist/tui/app.js.map +1 -1
  80. package/dist/tui/components/command-prompt-panel.d.ts +22 -0
  81. package/dist/tui/components/command-prompt-panel.d.ts.map +1 -0
  82. package/dist/tui/components/command-prompt-panel.js +26 -0
  83. package/dist/tui/components/command-prompt-panel.js.map +1 -0
  84. package/dist/tui/components/logo-panel.d.ts.map +1 -1
  85. package/dist/tui/components/logo-panel.js +2 -4
  86. package/dist/tui/components/logo-panel.js.map +1 -1
  87. package/dist/update-check.d.ts +19 -0
  88. package/dist/update-check.d.ts.map +1 -0
  89. package/dist/update-check.js +116 -0
  90. package/dist/update-check.js.map +1 -0
  91. package/dist/version.d.ts +2 -0
  92. package/dist/version.d.ts.map +1 -0
  93. package/dist/version.js +7 -0
  94. package/dist/version.js.map +1 -0
  95. package/package.json +7 -3
  96. package/configExample.yaml +0 -83
package/dist/cli.js CHANGED
@@ -6,20 +6,25 @@
6
6
  *
7
7
  * longeragent # auto-detect config
8
8
  * longeragent init # run initialization wizard
9
- * longeragent --config my.yaml # explicit config path
10
9
  * longeragent --templates ./tpls # explicit templates path
11
10
  * longeragent --verbose # enable debug logging
12
11
  */
13
- import { existsSync, statSync } from "node:fs";
14
- import { join } from "node:path";
12
+ import { existsSync, realpathSync, statSync } from "node:fs";
13
+ import { join, resolve } from "node:path";
14
+ import { fileURLToPath } from "node:url";
15
15
  import { Command } from "commander";
16
- import { Config, resolveConfigPaths, getBundledAssetsDir } from "./config.js";
16
+ import { Config, resolveAssetPaths, getBundledAssetsDir } from "./config.js";
17
17
  import { Session } from "./session.js";
18
18
  import { loadTemplates } from "./templates/loader.js";
19
19
  import { loadSkillsMulti } from "./skills/loader.js";
20
20
  import { SessionStore } from "./persistence.js";
21
- import { loadSettingsFile, resolveSettings } from "./settings.js";
21
+ import { loadMcpServers } from "./mcp-config.js";
22
+ import { loadDotenv } from "./dotenv.js";
23
+ import { getLongerAgentHomeDir } from "./home-path.js";
24
+ import { checkForUpdates } from "./update-check.js";
25
+ import { VERSION } from "./version.js";
22
26
  import { buildDefaultRegistry, registerSkillCommands, resolveModelSelection, } from "./commands.js";
27
+ import { hasAnyManagedCredential, isManagedProvider } from "./managed-provider-credentials.js";
23
28
  import { setAccent } from "./tui/theme.js";
24
29
  // ------------------------------------------------------------------
25
30
  // Primary agent resolution
@@ -41,12 +46,12 @@ function identifyPrimaryAgent(agents, name = "main") {
41
46
  // ------------------------------------------------------------------
42
47
  // Main
43
48
  // ------------------------------------------------------------------
44
- async function main() {
49
+ export async function main(argv = process.argv) {
45
50
  const program = new Command();
46
51
  program
47
52
  .name("longeragent")
53
+ .version(VERSION, "-V, --version", "Output the current version")
48
54
  .description("A terminal AI coding agent built for long sessions")
49
- .option("--config <path>", "Path to config.yaml")
50
55
  .option("--templates <path>", "Path to agent_templates directory")
51
56
  .option("--verbose", "Enable debug logging");
52
57
  // Subcommands
@@ -70,47 +75,66 @@ async function main() {
70
75
  // Default action — prevents Commander from showing help and exiting
71
76
  // when no subcommand is provided.
72
77
  program.action(() => { });
73
- await program.parseAsync(process.argv);
78
+ // Load ~/.longeragent/.env before dispatching any subcommand so `init`
79
+ // can detect previously saved keys and offer the expected reuse flow.
80
+ loadDotenv(getLongerAgentHomeDir());
81
+ await program.parseAsync(argv);
74
82
  // If a subcommand ran, exit — don't continue into TUI
75
83
  if (ranSubcommand)
76
84
  return;
77
85
  const opts = program.opts();
86
+ // Start update check in background (non-blocking)
87
+ const showUpdateNotice = checkForUpdates(VERSION);
78
88
  // Logging
79
89
  if (opts.verbose) {
80
90
  const origDebug = console.debug;
81
91
  console.debug = (...args) => origDebug("[DEBUG]", ...args);
82
92
  }
83
- // Resolve paths with discovery chain: CLI flags → ~/.longeragent/ → cwd/
84
- let paths = resolveConfigPaths({
85
- configFlag: opts.config,
86
- templatesFlag: opts.templates,
87
- });
88
- // If no config found, run the initialization wizard
89
- if (!paths.configPath) {
90
- console.log("No configuration found. Starting setup wizard...\n");
93
+ // Session store (also used for loading preferences)
94
+ let store;
95
+ try {
96
+ store = new SessionStore({ projectPath: process.cwd() });
97
+ }
98
+ catch (e) {
99
+ console.error(`Error: Failed to initialize session storage.\n` +
100
+ `Reason: ${e}\n` +
101
+ `Possible causes:\n` +
102
+ ` - File permission issues`);
103
+ process.exit(1);
104
+ }
105
+ // Load global preferences (provider env vars, model selection, etc.)
106
+ let globalPreferences = store.loadGlobalPreferences();
107
+ // If no providers configured, run initialization wizard
108
+ const hasLegacyCloudProviders = Boolean(globalPreferences.providerEnvVars
109
+ && Object.keys(globalPreferences.providerEnvVars).some((providerId) => !isManagedProvider(providerId)));
110
+ const hasProviders = hasLegacyCloudProviders
111
+ || (globalPreferences.localProviders && Object.keys(globalPreferences.localProviders).length > 0)
112
+ || hasAnyManagedCredential();
113
+ if (!hasProviders) {
114
+ console.log("No providers configured. Starting setup wizard...\n");
91
115
  try {
92
116
  const { runInitWizard } = await import("./init-wizard.js");
93
117
  await runInitWizard();
94
- // Re-resolve paths after wizard completes
95
- paths = resolveConfigPaths({
96
- configFlag: opts.config,
97
- templatesFlag: opts.templates,
98
- });
118
+ // Re-load preferences after wizard completes
119
+ globalPreferences = store.loadGlobalPreferences();
99
120
  }
100
121
  catch {
101
- console.error("Error: no config.yaml found.\n" +
102
- " Run 'longeragent init' to set up, or use --config to specify the path.");
122
+ console.error("Error: no providers configured.\n" +
123
+ " Run 'longeragent init' to set up providers.");
103
124
  process.exit(1);
104
125
  }
105
126
  }
106
- if (!paths.configPath) {
107
- console.error("Error: no config.yaml found after setup.\n" +
108
- " Run 'longeragent init' to set up, or use --config to specify the path.");
109
- process.exit(1);
110
- }
111
- const configPath = paths.configPath;
112
- // Load config
113
- const config = new Config({ path: configPath });
127
+ // Resolve asset paths: templates, prompts, skills
128
+ const paths = resolveAssetPaths({
129
+ templatesFlag: opts.templates,
130
+ });
131
+ // Build Config from preferences
132
+ const mcpServers = loadMcpServers(paths.homeDir);
133
+ const config = new Config({
134
+ providerEnvVars: globalPreferences.providerEnvVars ?? {},
135
+ localProviders: globalPreferences.localProviders ?? {},
136
+ mcpServers,
137
+ });
114
138
  // Refresh OAuth tokens if any model uses them (before building providers)
115
139
  const oauthEntries = config.listModelEntries().filter((e) => e.apiKeyRaw === "oauth:openai-codex");
116
140
  if (oauthEntries.length > 0) {
@@ -123,14 +147,7 @@ async function main() {
123
147
  console.warn("Run 'longeragent oauth' to re-authenticate.\n");
124
148
  }
125
149
  }
126
- // Load user settings (~/.longeragent/settings.json)
127
- const rawSettings = loadSettingsFile(paths.homeDir);
128
- const settings = resolveSettings(rawSettings);
129
- // Display settings warnings (invalid thresholds, clamped values, etc.)
130
- for (const warning of settings.warnings) {
131
- console.warn(`Warning: ${warning}`);
132
- }
133
- // Initialise MCP client manager (if mcp_servers configured)
150
+ // Initialise MCP client manager (if mcp.json configured)
134
151
  let mcpManager = null;
135
152
  if (config.mcpServerConfigs.length > 0) {
136
153
  try {
@@ -139,7 +156,7 @@ async function main() {
139
156
  mcpManager = new MCPClientManager(config.mcpServerConfigs);
140
157
  }
141
158
  catch {
142
- console.warn("Warning: mcp_servers configured but MCP client module not available. " +
159
+ console.warn("Warning: mcp.json configured but MCP client module not available. " +
143
160
  "Install with: npm install @modelcontextprotocol/sdk");
144
161
  }
145
162
  }
@@ -169,20 +186,8 @@ async function main() {
169
186
  skillRoots.push(userSkillsPath);
170
187
  }
171
188
  const skills = loadSkillsMulti(skillRoots);
172
- // Session store (session directory is created lazily on the first turn)
173
- let store;
174
- try {
175
- store = new SessionStore({ projectPath: process.cwd() });
176
- }
177
- catch (e) {
178
- console.error(`Error: Failed to initialize session storage.\n` +
179
- `Reason: ${e}\n` +
180
- `Possible causes:\n` +
181
- ` - Invalid LONGERAGENT_HOME configuration\n` +
182
- ` - File permission issues`);
183
- process.exit(1);
184
- }
185
- // Build Session with store attached from the start
189
+ // Build Session
190
+ const contextRatio = globalPreferences.contextRatio ?? 1.0;
186
191
  const session = new Session({
187
192
  primaryAgent: primary,
188
193
  config,
@@ -193,9 +198,9 @@ async function main() {
193
198
  mcpManager: mcpManager,
194
199
  promptsDirs,
195
200
  store: store,
196
- settings,
201
+ contextRatio,
197
202
  });
198
- const globalPreferences = store.loadGlobalPreferences();
203
+ // Restore model selection from preferences
199
204
  try {
200
205
  if (globalPreferences.modelConfigName) {
201
206
  try {
@@ -241,14 +246,30 @@ async function main() {
241
246
  // Commands
242
247
  const commandRegistry = buildDefaultRegistry();
243
248
  registerSkillCommands(commandRegistry, session.skills);
249
+ // Show update notice (if background check found a newer version)
250
+ showUpdateNotice();
244
251
  // Launch TUI
245
252
  const { launchTui } = await import("./tui/launch.js");
246
253
  await launchTui(session, commandRegistry, store, {
247
254
  verbose: opts.verbose,
248
255
  });
249
256
  }
250
- main().catch((err) => {
251
- console.error("Fatal error:", err);
252
- process.exit(1);
253
- });
257
+ function normalizeEntryPath(pathValue) {
258
+ if (!pathValue)
259
+ return null;
260
+ try {
261
+ return realpathSync(resolve(pathValue));
262
+ }
263
+ catch {
264
+ return null;
265
+ }
266
+ }
267
+ const entryPath = normalizeEntryPath(process.argv[1]);
268
+ const modulePath = normalizeEntryPath(fileURLToPath(import.meta.url));
269
+ if (entryPath && modulePath && entryPath === modulePath) {
270
+ main().catch((err) => {
271
+ console.error("Fatal error:", err);
272
+ process.exit(1);
273
+ });
274
+ }
254
275
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE7E,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EAErB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAE/F,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,qEAAqE;AACrE,2BAA2B;AAC3B,qEAAqE;AAErE,SAAS,oBAAoB,CAC3B,MAA6B,EAC7B,IAAI,GAAG,MAAM;IAEb,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,uCAAuC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,IAAI,CACV,aAAa,IAAI,6BAA6B,SAAS,YAAY,CACpE,CAAC;QACF,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,qEAAqE;AACrE,OAAO;AACP,qEAAqE;AAErE,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI;IACtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,aAAa,CAAC;SACnB,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC;SAC/D,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,oBAAoB,EAAE,mCAAmC,CAAC;SACjE,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAE/C,cAAc;IACd,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,aAAa,GAAG,IAAI,CAAC;QACrB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC3D,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,KAAK,EAAE,MAAe,EAAE,EAAE;QAChC,aAAa,GAAG,IAAI,CAAC;QACrB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAChE,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEL,oEAAoE;IACpE,kCAAkC;IAClC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAEzB,uEAAuE;IACvE,sEAAsE;IACtE,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAEpC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAE/B,sDAAsD;IACtD,IAAI,aAAa;QAAE,OAAO;IAE1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAGrB,CAAC;IAEL,kDAAkD;IAClD,MAAM,gBAAgB,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAElD,UAAU;IACV,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;QAChC,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IACxE,CAAC;IAED,oDAAoD;IACpD,IAAI,KAAmB,CAAC;IACxB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,YAAY,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CACX,gDAAgD;YAChD,WAAW,CAAC,IAAI;YAChB,oBAAoB;YACpB,4BAA4B,CAC7B,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qEAAqE;IACrE,IAAI,iBAAiB,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;IAEtD,wDAAwD;IACxD,MAAM,uBAAuB,GAAG,OAAO,CACrC,iBAAiB,CAAC,eAAe;WAC5B,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CACzG,CAAC;IACF,MAAM,YAAY,GAAG,uBAAuB;WACvC,CAAC,iBAAiB,CAAC,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;WAC9F,uBAAuB,EAAE,CAAC;IAE/B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC3D,MAAM,aAAa,EAAE,CAAC;YACtB,6CAA6C;YAC7C,iBAAiB,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CACX,mCAAmC;gBACnC,+CAA+C,CAChD,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,MAAM,KAAK,GAAG,iBAAiB,CAAC;QAC9B,aAAa,EAAE,IAAI,CAAC,SAAS;KAC9B,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,eAAe,EAAE,iBAAiB,CAAC,eAAe,IAAI,EAAE;QACxD,cAAc,EAAE,iBAAiB,CAAC,cAAc,IAAI,EAAE;QACtD,UAAU;KACX,CAAC,CAAC;IAEH,0EAA0E;IAC1E,MAAM,YAAY,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC,MAAM,CACnD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,oBAAoB,CAC5C,CAAC;IACF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YACpE,MAAM,gBAAgB,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CACV,wCAAwC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC3F,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,yDAAyD;IACzD,IAAI,UAAU,GAAY,IAAI,CAAC;IAC/B,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,sCAAsC;YACtC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC7D,UAAU,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CACV,oEAAoE;gBAClE,qDAAqD,CACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC7D,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAEnD,kEAAkE;IAClE,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,WAAW;QAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3D,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAEjC,+EAA+E;IAC/E,MAAM,MAAM,GAAG,aAAa,CAC1B,gBAAgB,EAChB,MAAM,EACN,UAAiB,EACjB,WAAW,EACX,KAAK,CAAC,aAAa,IAAI,SAAS,CACjC,CAAC;IACF,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7C,mEAAmE;IACnE,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,UAAU,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACvE,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjC,CAAC;IACD,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC;IACxC,IACE,cAAc;QACd,cAAc,KAAK,aAAa;QAChC,UAAU,CAAC,cAAc,CAAC;QAC1B,QAAQ,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,EACtC,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAE3C,gBAAgB;IAChB,MAAM,YAAY,GAAG,iBAAiB,CAAC,YAAY,IAAI,GAAG,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,YAAY,EAAE,OAAgB;QAC9B,MAAM;QACN,cAAc,EAAE,MAAe;QAC/B,MAAM,EAAE,MAAe;QACvB,UAAU;QACV,QAAQ,EAAE,SAAS;QACnB,UAAU,EAAE,UAAmB;QAC/B,WAAW;QACX,KAAK,EAAE,KAAc;QACrB,YAAY;KACb,CAAC,CAAC;IAEH,2CAA2C;IAC3C,IAAI,CAAC;QACH,IAAI,iBAAiB,CAAC,eAAe,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;gBACvD,OAAO,CAAC,0BAA0B,EAAE,CAAC;oBACnC,eAAe,EAAE,iBAAiB,CAAC,eAAe;oBAClD,aAAa,EAAE,iBAAiB,CAAC,aAAa;oBAC9C,iBAAiB,EAAE,iBAAiB,CAAC,iBAAiB;oBACtD,OAAO,EAAE,iBAAiB,CAAC,OAAO;iBACD,CAAC,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,iBAAiB,CAAC,aAAa,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC1G,MAAM,QAAQ,GAAG,qBAAqB,CACpC,OAAO,EACP,GAAG,iBAAiB,CAAC,aAAa,IAAI,iBAAiB,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,OAAO,EAAE,CACzG,CAAC;oBACF,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;oBACjD,OAAO,CAAC,0BAA0B,EAAE,CAAC;wBACnC,eAAe,EAAE,QAAQ,CAAC,kBAAkB;wBAC5C,aAAa,EAAE,QAAQ,CAAC,aAAa;wBACrC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;wBAC7C,OAAO,EAAE,QAAQ,CAAC,OAAO;qBACQ,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,iBAAiB,CAAC,aAAa,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;YACjH,MAAM,QAAQ,GAAG,qBAAqB,CACpC,OAAO,EACP,GAAG,iBAAiB,CAAC,aAAa,IAAI,iBAAiB,CAAC,iBAAiB,IAAI,iBAAiB,CAAC,OAAO,EAAE,CACzG,CAAC;YACF,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YACjD,OAAO,CAAC,0BAA0B,EAAE,CAAC;gBACnC,eAAe,EAAE,QAAQ,CAAC,kBAAkB;gBAC5C,aAAa,EAAE,QAAQ,CAAC,aAAa;gBACrC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;gBAC7C,OAAO,EAAE,QAAQ,CAAC,OAAO;aACQ,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CACV,sDAAsD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACzG,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IAClD,IAAI,iBAAiB,CAAC,WAAW,EAAE,CAAC;QAClC,SAAS,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAED,WAAW;IACX,MAAM,eAAe,GAAG,oBAAoB,EAAE,CAAC;IAC/C,qBAAqB,CAAC,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvD,iEAAiE;IACjE,gBAAgB,EAAE,CAAC;IAEnB,aAAa;IACb,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC,OAAgC,EAAE,eAAe,EAAE,KAAK,EAAE;QACxE,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CAAC,SAA6B;IACvD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,MAAM,UAAU,GAAG,kBAAkB,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACtE,IAAI,SAAS,IAAI,UAAU,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;IACxD,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -10,6 +10,7 @@
10
10
  * }
11
11
  */
12
12
  import type { SessionStore } from "./persistence.js";
13
+ import { type PromptSecretRequest, type PromptSelectRequest } from "./provider-credential-flow.js";
13
14
  import { type SkillMeta } from "./skills/loader.js";
14
15
  /**
15
16
  * Callback used by command handlers to display a message to the user.
@@ -42,6 +43,10 @@ export interface CommandContext {
42
43
  onManualSummarizeRequested?: (instruction: string) => void;
43
44
  /** Trigger a manual compact request through the TUI execution pipeline. */
44
45
  onManualCompactRequested?: (instruction: string) => void;
46
+ /** Prompt the user to choose one option during command execution. */
47
+ promptSelect?: (request: PromptSelectRequest) => Promise<string | undefined>;
48
+ /** Prompt the user for a secret value during command execution. */
49
+ promptSecret?: (request: PromptSecretRequest) => Promise<string | undefined>;
45
50
  }
46
51
  /**
47
52
  * An option entry for command overlays.
@@ -98,7 +103,7 @@ export declare class CommandRegistry {
98
103
  /** Return command names that start with the given prefix (for completion). */
99
104
  getCompletions(prefix: string): string[];
100
105
  }
101
- export declare function resolveModelSelection(session: any, target: string, apiKey?: string): import("./model-selection.js").ResolvedModelSelection;
106
+ export declare function resolveModelSelection(session: any, target: string): import("./model-selection.js").ResolvedModelSelection;
102
107
  /**
103
108
  * Build the default command registry with all built-in commands.
104
109
  */
@@ -1 +1 @@
1
- {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
package/dist/commands.js CHANGED
@@ -15,6 +15,8 @@ import { loadLog, validateAndRepairLog } from "./persistence.js";
15
15
  import { formatDisplayModelName, formatScopedModelName, getThinkingLevels, } from "./config.js";
16
16
  import { PROVIDER_PRESETS, } from "./provider-presets.js";
17
17
  import { resolveModelSelection as resolveModelSelectionCore } from "./model-selection.js";
18
+ import { isManagedProvider, } from "./managed-provider-credentials.js";
19
+ import { ensureManagedProviderCredential, } from "./provider-credential-flow.js";
18
20
  import { resolveSkillContent } from "./skills/loader.js";
19
21
  import { ACCENT_PRESETS, setAccent, theme } from "./tui/theme.js";
20
22
  import { hasOAuthTokens } from "./auth/openai-oauth.js";
@@ -231,7 +233,17 @@ function persistGlobalPreferences(ctx) {
231
233
  if (typeof ctx.session.getGlobalPreferences !== "function")
232
234
  return;
233
235
  try {
234
- ctx.store.saveGlobalPreferences(ctx.session.getGlobalPreferences());
236
+ const current = ctx.session.getGlobalPreferences();
237
+ const existing = typeof ctx.store.loadGlobalPreferences === "function"
238
+ ? ctx.store.loadGlobalPreferences()
239
+ : undefined;
240
+ ctx.store.saveGlobalPreferences({
241
+ ...existing,
242
+ ...current,
243
+ providerEnvVars: current.providerEnvVars ?? existing?.providerEnvVars,
244
+ localProviders: current.localProviders ?? existing?.localProviders,
245
+ contextRatio: current.contextRatio ?? existing?.contextRatio,
246
+ });
235
247
  }
236
248
  catch {
237
249
  // Ignore preference persistence failures during command execution.
@@ -332,13 +344,7 @@ const PROVIDER_KEY_GROUP_ALIASES = {
332
344
  "openai-chat": "openai",
333
345
  "openai-responses": "openai",
334
346
  "openai-codex": "openai-codex", // Separate group — uses OAuth, not shared API key
335
- "kimi-cn": "kimi",
336
347
  "kimi-ai": "kimi",
337
- "kimi-code": "kimi",
338
- "glm-intl": "glm",
339
- "glm-code": "glm",
340
- "glm-intl-code": "glm",
341
- "minimax-cn": "minimax",
342
348
  };
343
349
  function providerKeyGroup(provider) {
344
350
  return PROVIDER_KEY_GROUP_ALIASES[provider] ?? provider;
@@ -386,21 +392,17 @@ function parseModelArgs(args) {
386
392
  const tokens = args.trim().split(/\s+/).filter(Boolean);
387
393
  const target = tokens[0] ?? "";
388
394
  const rest = tokens.slice(1);
389
- let apiKey;
390
- for (const t of rest) {
391
- if (t.startsWith("key=")) {
392
- apiKey = t.slice("key=".length);
393
- break;
394
- }
395
- if (t.startsWith("api_key=")) {
396
- apiKey = t.slice("api_key=".length);
397
- break;
398
- }
395
+ const inlineKeySyntax = rest.some((t) => t.startsWith("key=") || t.startsWith("api_key="));
396
+ if (inlineKeySyntax || rest.length === 1) {
397
+ throw new Error("Inline API keys in `/model` are no longer supported.\n" +
398
+ "Use `/model` to select the model and follow the prompt to import or paste a key,\n" +
399
+ "or run 'longeragent init' to configure providers.");
399
400
  }
400
- if (!apiKey && rest.length === 1) {
401
- apiKey = rest[0];
401
+ if (rest.length > 0) {
402
+ throw new Error("Invalid /model arguments.\n" +
403
+ "Use a config name or provider:model (for example `openai:gpt-5.4`).");
402
404
  }
403
- return { target, apiKey };
405
+ return { target };
404
406
  }
405
407
  function parseProviderModelTarget(target) {
406
408
  const idx = target.indexOf(":");
@@ -418,6 +420,15 @@ function hasEnvApiKey(envVar) {
418
420
  return typeof raw === "string" && raw.trim() !== "";
419
421
  }
420
422
  function getProviderKeySource(entries, provider) {
423
+ if (isManagedProvider(provider)) {
424
+ const fromConfig = entries.find((e) => e.provider === provider && e.hasResolvedApiKey && e.apiKeyRaw.trim() !== "");
425
+ if (fromConfig)
426
+ return fromConfig.apiKeyRaw;
427
+ const preset = PROVIDER_PRESETS.find((p) => p.id === provider);
428
+ if (preset && hasEnvApiKey(preset.envVar))
429
+ return `\${${preset.envVar}}`;
430
+ return undefined;
431
+ }
421
432
  const group = providerKeyGroup(provider);
422
433
  const fromConfig = entries.find((e) => providerKeyGroup(e.provider) === group && e.hasResolvedApiKey && e.apiKeyRaw.trim() !== "");
423
434
  if (fromConfig)
@@ -456,8 +467,16 @@ function formatPresetSelectedHint(provider, presetModel) {
456
467
  }
457
468
  return label;
458
469
  }
459
- export function resolveModelSelection(session, target, apiKey) {
460
- return resolveModelSelectionCore(session, target, apiKey);
470
+ function createCommandPromptAdapter(ctx) {
471
+ if (!ctx.promptSelect || !ctx.promptSecret)
472
+ return null;
473
+ return {
474
+ select: (request) => ctx.promptSelect(request),
475
+ secret: (request) => ctx.promptSecret(request),
476
+ };
477
+ }
478
+ export function resolveModelSelection(session, target) {
479
+ return resolveModelSelectionCore(session, target);
461
480
  }
462
481
  /**
463
482
  * Build model children (leaf-level options) for a single provider.
@@ -475,7 +494,9 @@ function buildModelChildren(provider, byProvider, providerHasKey, session, curre
475
494
  const missingApiKey = !providerHasKey.get(providerKeyGroup(provider));
476
495
  const missingHint = provider === "openai-codex"
477
496
  ? "not logged in: run longeragent oauth"
478
- : "key missing: run longeragent init";
497
+ : isManagedProvider(provider)
498
+ ? "key missing: select to configure"
499
+ : "key missing: run longeragent init";
479
500
  let label = item.label;
480
501
  if (isCurrent && missingApiKey) {
481
502
  label = `${label} (current, ${missingHint})`;
@@ -669,7 +690,7 @@ async function cmdModel(ctx, args) {
669
690
  : displayCurrent;
670
691
  ctx.showMessage(`Current model: ${current}\n` +
671
692
  "Use /model to select a new model.\n" +
672
- "For models marked 'key missing', run 'longeragent init' (or use /model provider:model key=YOUR_API_KEY).");
693
+ "For models marked 'key missing', run 'longeragent init' or select the model to import/paste a key.");
673
694
  return;
674
695
  }
675
696
  if (!session.switchModel) {
@@ -677,8 +698,26 @@ async function cmdModel(ctx, args) {
677
698
  return;
678
699
  }
679
700
  try {
680
- const { target, apiKey } = parseModelArgs(trimmed);
681
- const resolvedSelection = resolveModelSelection(session, target, apiKey);
701
+ const { target } = parseModelArgs(trimmed);
702
+ let resolvedSelection;
703
+ try {
704
+ resolvedSelection = resolveModelSelection(session, target);
705
+ }
706
+ catch (err) {
707
+ const parsed = parseProviderModelTarget(target);
708
+ const adapter = createCommandPromptAdapter(ctx);
709
+ if (parsed && isManagedProvider(parsed.provider) && adapter) {
710
+ const result = await ensureManagedProviderCredential(parsed.provider, adapter, { mode: "model", allowReplaceExisting: false });
711
+ if (result.status === "skipped") {
712
+ ctx.showMessage("Model switch cancelled.");
713
+ return;
714
+ }
715
+ resolvedSelection = resolveModelSelection(session, target);
716
+ }
717
+ else {
718
+ throw err;
719
+ }
720
+ }
682
721
  const { selectedConfigName, selectedHint } = resolvedSelection;
683
722
  // Save current session before switching
684
723
  ctx.resetUiState();
@@ -763,9 +802,59 @@ export function buildDefaultRegistry() {
763
802
  registry.register({ name: "/cachehit", description: "Prompt caching", handler: cmdCacheHit, options: cacheHitOptions });
764
803
  registry.register({ name: "/theme", description: "Change accent color", handler: cmdTheme, options: themeOptions });
765
804
  registry.register({ name: "/skills", description: "Manage installed skills", handler: cmdSkills, options: skillsOptions, checkboxMode: true });
805
+ registry.register({ name: "/mcp", description: "Show MCP server status and tools", handler: cmdMcp });
766
806
  return registry;
767
807
  }
768
808
  // ------------------------------------------------------------------
809
+ // /mcp command
810
+ // ------------------------------------------------------------------
811
+ async function cmdMcp(ctx) {
812
+ const session = ctx.session;
813
+ const mcpManager = session.mcpManager;
814
+ if (!mcpManager) {
815
+ ctx.showMessage("No MCP servers configured.\n" +
816
+ "Add servers to ~/.longeragent/mcp.json to enable MCP tools.");
817
+ return;
818
+ }
819
+ try {
820
+ if (typeof session.ensureMcpReady === "function") {
821
+ await session.ensureMcpReady();
822
+ }
823
+ else if (typeof mcpManager.connectAll === "function") {
824
+ await mcpManager.connectAll();
825
+ }
826
+ }
827
+ catch (err) {
828
+ ctx.showMessage("Failed to connect MCP servers.\n" +
829
+ `${err instanceof Error ? err.message : String(err)}`);
830
+ return;
831
+ }
832
+ const allTools = mcpManager.getAllTools();
833
+ if (allTools.length === 0) {
834
+ ctx.showMessage("MCP configured but no tools discovered.\n" +
835
+ "Make sure your MCP servers are running and exposing tools.");
836
+ return;
837
+ }
838
+ // Group tools by server (parse mcp__server__tool naming)
839
+ const byServer = new Map();
840
+ for (const tool of allTools) {
841
+ const parts = tool.name.split("__");
842
+ const server = parts.length >= 3 ? parts[1] : "unknown";
843
+ if (!byServer.has(server))
844
+ byServer.set(server, []);
845
+ const originalName = parts.length >= 3 ? parts.slice(2).join("__") : tool.name;
846
+ byServer.get(server).push(originalName);
847
+ }
848
+ const lines = [`MCP: ${byServer.size} server(s), ${allTools.length} tool(s)\n`];
849
+ for (const [server, tools] of byServer) {
850
+ lines.push(` ${server} (${tools.length} tools)`);
851
+ for (const t of tools) {
852
+ lines.push(` - ${t}`);
853
+ }
854
+ }
855
+ ctx.showMessage(lines.join("\n"));
856
+ }
857
+ // ------------------------------------------------------------------
769
858
  // /skills command
770
859
  // ------------------------------------------------------------------
771
860
  function skillsOptions(ctx) {