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.
- package/README.md +84 -43
- package/README.zh-CN.md +83 -42
- package/agent_templates/main/agent.yaml +1 -0
- package/dist/auth/openai-oauth.d.ts.map +1 -1
- package/dist/auth/openai-oauth.js +6 -10
- package/dist/auth/openai-oauth.js.map +1 -1
- package/dist/cli.d.ts +1 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +81 -60
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +6 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +115 -26
- package/dist/commands.js.map +1 -1
- package/dist/config.d.ts +19 -26
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +80 -120
- package/dist/config.js.map +1 -1
- package/dist/dotenv.d.ts +18 -0
- package/dist/dotenv.d.ts.map +1 -0
- package/dist/dotenv.js +91 -0
- package/dist/dotenv.js.map +1 -0
- package/dist/home-path.d.ts +3 -0
- package/dist/home-path.d.ts.map +1 -0
- package/dist/home-path.js +7 -0
- package/dist/home-path.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/init-wizard.d.ts +2 -3
- package/dist/init-wizard.d.ts.map +1 -1
- package/dist/init-wizard.js +349 -145
- package/dist/init-wizard.js.map +1 -1
- package/dist/managed-provider-credentials.d.ts +23 -0
- package/dist/managed-provider-credentials.d.ts.map +1 -0
- package/dist/managed-provider-credentials.js +56 -0
- package/dist/managed-provider-credentials.js.map +1 -0
- package/dist/mcp-client.d.ts.map +1 -1
- package/dist/mcp-client.js +2 -1
- package/dist/mcp-client.js.map +1 -1
- package/dist/mcp-config.d.ts +13 -0
- package/dist/mcp-config.d.ts.map +1 -0
- package/dist/mcp-config.js +64 -0
- package/dist/mcp-config.js.map +1 -0
- package/dist/model-discovery.d.ts +20 -0
- package/dist/model-discovery.d.ts.map +1 -0
- package/dist/model-discovery.js +47 -0
- package/dist/model-discovery.js.map +1 -0
- package/dist/model-selection.d.ts +1 -1
- package/dist/model-selection.d.ts.map +1 -1
- package/dist/model-selection.js +20 -10
- package/dist/model-selection.js.map +1 -1
- package/dist/persistence.d.ts +12 -0
- package/dist/persistence.d.ts.map +1 -1
- package/dist/persistence.js +8 -6
- package/dist/persistence.js.map +1 -1
- package/dist/provider-credential-flow.d.ts +28 -0
- package/dist/provider-credential-flow.d.ts.map +1 -0
- package/dist/provider-credential-flow.js +112 -0
- package/dist/provider-credential-flow.js.map +1 -0
- package/dist/provider-presets.d.ts +4 -0
- package/dist/provider-presets.d.ts.map +1 -1
- package/dist/provider-presets.js +26 -9
- package/dist/provider-presets.js.map +1 -1
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +3 -2
- package/dist/providers/registry.js.map +1 -1
- package/dist/session.d.ts +6 -15
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +34 -60
- package/dist/session.js.map +1 -1
- package/dist/settings.d.ts +8 -27
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +4 -108
- package/dist/settings.js.map +1 -1
- package/dist/tui/app.d.ts.map +1 -1
- package/dist/tui/app.js +116 -2
- package/dist/tui/app.js.map +1 -1
- package/dist/tui/components/command-prompt-panel.d.ts +22 -0
- package/dist/tui/components/command-prompt-panel.d.ts.map +1 -0
- package/dist/tui/components/command-prompt-panel.js +26 -0
- package/dist/tui/components/command-prompt-panel.js.map +1 -0
- package/dist/tui/components/logo-panel.d.ts.map +1 -1
- package/dist/tui/components/logo-panel.js +2 -4
- package/dist/tui/components/logo-panel.js.map +1 -1
- package/dist/update-check.d.ts +19 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +116 -0
- package/dist/update-check.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/package.json +7 -3
- 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,
|
|
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 {
|
|
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
|
-
|
|
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
|
-
//
|
|
84
|
-
let
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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-
|
|
95
|
-
|
|
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
|
|
102
|
-
" Run 'longeragent init' to set up
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
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
|
-
//
|
|
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:
|
|
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
|
|
173
|
-
|
|
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
|
-
|
|
201
|
+
contextRatio,
|
|
197
202
|
});
|
|
198
|
-
|
|
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
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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":";AAEA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/commands.d.ts
CHANGED
|
@@ -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
|
|
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
|
*/
|
package/dist/commands.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
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.
|
|
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
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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 (
|
|
401
|
-
|
|
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
|
|
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
|
-
|
|
460
|
-
|
|
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
|
-
:
|
|
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'
|
|
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
|
|
681
|
-
|
|
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) {
|