@hileeon/mcc 0.1.8 → 0.2.0
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 +229 -127
- package/dist/accounts/store.d.ts +12 -0
- package/dist/accounts/store.d.ts.map +1 -1
- package/dist/accounts/store.js.map +1 -1
- package/dist/commands/launch.d.ts +9 -0
- package/dist/commands/launch.d.ts.map +1 -0
- package/dist/commands/launch.js +162 -0
- package/dist/commands/launch.js.map +1 -0
- package/dist/commands/mcp.d.ts +9 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +112 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/profile-test.d.ts +17 -0
- package/dist/commands/profile-test.d.ts.map +1 -0
- package/dist/commands/profile-test.js +188 -0
- package/dist/commands/profile-test.js.map +1 -0
- package/dist/commands/profile.d.ts +8 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +125 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/core/model-router.d.ts.map +1 -1
- package/dist/core/model-router.js +36 -3
- package/dist/core/model-router.js.map +1 -1
- package/dist/{dashboard-server.d.ts → dashboard/server.d.ts} +1 -1
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/{dashboard-server.js → dashboard/server.js} +254 -48
- package/dist/dashboard/server.js.map +1 -0
- package/dist/mcc.d.ts +4 -2
- package/dist/mcc.d.ts.map +1 -1
- package/dist/mcc.js +127 -408
- package/dist/mcc.js.map +1 -1
- package/dist/mcp/installer.d.ts.map +1 -1
- package/dist/mcp/installer.js +5 -2
- package/dist/mcp/installer.js.map +1 -1
- package/dist/mcp/mcp-config.d.ts +33 -3
- package/dist/mcp/mcp-config.d.ts.map +1 -1
- package/dist/mcp/mcp-config.js +81 -29
- package/dist/mcp/mcp-config.js.map +1 -1
- package/dist/proxy/proxy-daemon.d.ts +1 -1
- package/dist/proxy/proxy-daemon.d.ts.map +1 -1
- package/dist/proxy/proxy-daemon.js +27 -7
- package/dist/proxy/proxy-daemon.js.map +1 -1
- package/dist/proxy/proxy-entry.js +11 -4
- package/dist/proxy/proxy-entry.js.map +1 -1
- package/dist/proxy/proxy-paths.d.ts +1 -0
- package/dist/proxy/proxy-paths.d.ts.map +1 -1
- package/dist/proxy/proxy-paths.js.map +1 -1
- package/dist/proxy/proxy-server.d.ts +1 -0
- package/dist/proxy/proxy-server.d.ts.map +1 -1
- package/dist/proxy/proxy-server.js +114 -6
- package/dist/proxy/proxy-server.js.map +1 -1
- package/dist/shared/config.d.ts +15 -0
- package/dist/shared/config.d.ts.map +1 -0
- package/dist/shared/config.js +79 -0
- package/dist/shared/config.js.map +1 -0
- package/dist/shared/logger.d.ts +23 -18
- package/dist/shared/logger.d.ts.map +1 -1
- package/dist/shared/logger.js +17 -178
- package/dist/shared/logger.js.map +1 -1
- package/dist/shared/provider-preset-catalog.d.ts +8 -2
- package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
- package/dist/shared/provider-preset-catalog.js +61 -31
- package/dist/shared/provider-preset-catalog.js.map +1 -1
- package/dist/shared/test-image.d.ts +15 -0
- package/dist/shared/test-image.d.ts.map +1 -0
- package/dist/shared/test-image.js +89 -0
- package/dist/shared/test-image.js.map +1 -0
- package/dist/ui/assets/index-7kowlJw9.js +40 -0
- package/dist/ui/assets/index-DnC-lskL.css +1 -0
- package/dist/ui/index.html +21 -13
- package/dist/update.d.ts +31 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +196 -0
- package/dist/update.js.map +1 -0
- package/lib/mcp/mcc-image-analysis-server.cjs +454 -454
- package/lib/mcp/mcc-websearch-server.cjs +339 -339
- package/lib/mcp-hooks/image-analysis-runtime.cjs +563 -510
- package/lib/mcp-hooks/image-analyzer-transformer.cjs +526 -526
- package/lib/mcp-hooks/websearch-transformer.cjs +1597 -1421
- package/lib/proxy/config/config-loader-facade.js +24 -24
- package/lib/proxy/glmt/delta-accumulator.js +362 -362
- package/lib/proxy/glmt/glmt-transformer.js +203 -203
- package/lib/proxy/glmt/index.js +40 -40
- package/lib/proxy/glmt/locale-enforcer.js +68 -68
- package/lib/proxy/glmt/pipeline/content-transformer.js +161 -161
- package/lib/proxy/glmt/pipeline/index.js +19 -19
- package/lib/proxy/glmt/pipeline/request-transformer.js +115 -115
- package/lib/proxy/glmt/pipeline/response-builder.js +204 -204
- package/lib/proxy/glmt/pipeline/stream-parser.js +233 -233
- package/lib/proxy/glmt/pipeline/tool-call-handler.js +77 -77
- package/lib/proxy/glmt/pipeline/types.js +5 -5
- package/lib/proxy/glmt/reasoning-enforcer.js +150 -150
- package/lib/proxy/glmt/sse-parser.js +101 -101
- package/lib/proxy/services/logging.js +13 -13
- package/lib/proxy/transformers/request-transformer.js +471 -471
- package/lib/proxy/transformers/sse-stream-transformer.js +198 -198
- package/lib/shared/logger.cjs +160 -138
- package/package.json +58 -41
- package/dist/dashboard-server.d.ts.map +0 -1
- package/dist/dashboard-server.js.map +0 -1
- package/dist/ui/assets/index-B16lhKZ6.js +0 -40
- package/dist/ui/assets/index-jEfiB6-h.css +0 -1
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `mcc mcp <list|add|remove|enable|disable>` — external MCP server management.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cmdMcpList = cmdMcpList;
|
|
7
|
+
exports.cmdMcpAdd = cmdMcpAdd;
|
|
8
|
+
exports.cmdMcpRemove = cmdMcpRemove;
|
|
9
|
+
exports.cmdMcpEnable = cmdMcpEnable;
|
|
10
|
+
exports.cmdMcpDisable = cmdMcpDisable;
|
|
11
|
+
const store_1 = require("../accounts/store");
|
|
12
|
+
const instance_manager_1 = require("../accounts/instance-manager");
|
|
13
|
+
const installer_1 = require("../mcp/installer");
|
|
14
|
+
const registry_1 = require("../mcp/registry");
|
|
15
|
+
const external_registry_1 = require("../mcp/external-registry");
|
|
16
|
+
const instanceMgr = new instance_manager_1.MCCInstanceManager();
|
|
17
|
+
function getFlag(args, flag) {
|
|
18
|
+
const idx = args.indexOf(flag);
|
|
19
|
+
return idx !== -1 ? args[idx + 1] : undefined;
|
|
20
|
+
}
|
|
21
|
+
async function cmdMcpList() {
|
|
22
|
+
const servers = (0, registry_1.getAllServers)();
|
|
23
|
+
console.log('MCP Servers:');
|
|
24
|
+
for (const s of servers) {
|
|
25
|
+
const isBuiltin = 'config' in s;
|
|
26
|
+
const marker = isBuiltin && s.enabledByDefault ? ' (builtin, default)' : isBuiltin ? ' (builtin)' : '';
|
|
27
|
+
console.log(` ${s.name}${marker}`);
|
|
28
|
+
console.log(` ${s.displayName}: ${s.description}`);
|
|
29
|
+
if (!isBuiltin) {
|
|
30
|
+
const ext = s;
|
|
31
|
+
console.log(` Command: ${ext.command} ${ext.args.join(' ')}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async function cmdMcpAdd(args) {
|
|
36
|
+
const name = getFlag(args, '--name');
|
|
37
|
+
const displayName = getFlag(args, '--display-name') ?? name ?? '';
|
|
38
|
+
const description = getFlag(args, '--description') ?? '';
|
|
39
|
+
const command = getFlag(args, '--command') ?? 'uvx';
|
|
40
|
+
const argsStr = getFlag(args, '--args') ?? '';
|
|
41
|
+
const argsList = argsStr ? argsStr.split(',').map((s) => s.trim()) : [];
|
|
42
|
+
const providerRef = getFlag(args, '--provider-ref');
|
|
43
|
+
const enabledByDefault = args.includes('--enabled-by-default');
|
|
44
|
+
if (!name || !command) {
|
|
45
|
+
console.error('[!] --name and --command are required');
|
|
46
|
+
console.error(' Usage: mcc mcp add --name <id> --command <cmd> --args "<arg1>,<arg2>" [--display-name <name>] [--description <desc>] [--provider-ref <provider>] [--enabled-by-default]');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
const envVars = {};
|
|
50
|
+
if (providerRef) {
|
|
51
|
+
envVars.MINIMAX_API_KEY = `\${MCC_PROVIDER_KEY:${providerRef}}`;
|
|
52
|
+
envVars.MINIMAX_API_HOST = 'https://api.minimaxi.com';
|
|
53
|
+
}
|
|
54
|
+
const server = {
|
|
55
|
+
name,
|
|
56
|
+
displayName,
|
|
57
|
+
description,
|
|
58
|
+
command,
|
|
59
|
+
args: argsList,
|
|
60
|
+
envVars,
|
|
61
|
+
enabledByDefault,
|
|
62
|
+
};
|
|
63
|
+
(0, external_registry_1.addExternalMcpServer)(server);
|
|
64
|
+
console.log(`[OK] External MCP added: ${name}`);
|
|
65
|
+
}
|
|
66
|
+
async function cmdMcpRemove(args) {
|
|
67
|
+
const name = args[0];
|
|
68
|
+
if (!name) {
|
|
69
|
+
console.error('[!] Usage: mcc mcp remove <name>');
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
const existing = (0, external_registry_1.readExternalMcpRegistry)().find((s) => s.name === name);
|
|
73
|
+
if (!existing) {
|
|
74
|
+
console.error(`[!] External MCP not found: ${name}`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
(0, external_registry_1.removeExternalMcpServer)(name);
|
|
78
|
+
console.log(`[OK] External MCP removed: ${name}`);
|
|
79
|
+
}
|
|
80
|
+
async function cmdMcpEnable(args) {
|
|
81
|
+
const name = args[0];
|
|
82
|
+
const profileName = args[1];
|
|
83
|
+
if (!name || !profileName) {
|
|
84
|
+
console.error('[!] Usage: mcc mcp enable <name> <profile>');
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
if (!(0, store_1.hasProfile)(profileName)) {
|
|
88
|
+
console.error(`[!] Profile not found: ${profileName}`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
const instancePath = instanceMgr.getInstancePath(profileName);
|
|
92
|
+
(0, installer_1.enableInstanceExternalMcp)(instancePath, name);
|
|
93
|
+
(0, installer_1.syncInstanceMcpServers)(instancePath, registry_1.BUILTIN_MCP_SERVERS.map((s) => s.name), profileName);
|
|
94
|
+
console.log(`[OK] External MCP '${name}' enabled for profile '${profileName}'`);
|
|
95
|
+
}
|
|
96
|
+
async function cmdMcpDisable(args) {
|
|
97
|
+
const name = args[0];
|
|
98
|
+
const profileName = args[1];
|
|
99
|
+
if (!name || !profileName) {
|
|
100
|
+
console.error('[!] Usage: mcc mcp disable <name> <profile>');
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
if (!(0, store_1.hasProfile)(profileName)) {
|
|
104
|
+
console.error(`[!] Profile not found: ${profileName}`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
const instancePath = instanceMgr.getInstancePath(profileName);
|
|
108
|
+
(0, installer_1.disableInstanceExternalMcp)(instancePath, name);
|
|
109
|
+
(0, installer_1.syncInstanceMcpServers)(instancePath, registry_1.BUILTIN_MCP_SERVERS.map((s) => s.name), profileName);
|
|
110
|
+
console.log(`[OK] External MCP '${name}' disabled for profile '${profileName}'`);
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mcc profile test [name] [--vision]` — live health-check a profile's key.
|
|
3
|
+
*
|
|
4
|
+
* Three independent probes, each reported separately:
|
|
5
|
+
* 1. models — GET the provider's model list. Proves the key *authenticates*.
|
|
6
|
+
* 2. usable — a 1-token chat/messages call. Proves the account is actually
|
|
7
|
+
* callable (catches "key valid but balance = 0", e.g. DeepSeek 402,
|
|
8
|
+
* which the models endpoint alone reports as OK).
|
|
9
|
+
* 3. vision — (only with --vision) sends a 4-quadrant probe image to the
|
|
10
|
+
* profile's own model and checks it names all four colors, i.e.
|
|
11
|
+
* whether the main model can natively see images.
|
|
12
|
+
*
|
|
13
|
+
* Calls the upstream provider directly (not through the local proxy) so the
|
|
14
|
+
* result reflects the real provider, not the translation layer.
|
|
15
|
+
*/
|
|
16
|
+
export declare function cmdProfileTest(args: string[]): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=profile-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-test.d.ts","sourceRoot":"","sources":["../../src/commands/profile-test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAwJH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoClE"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `mcc profile test [name] [--vision]` — live health-check a profile's key.
|
|
4
|
+
*
|
|
5
|
+
* Three independent probes, each reported separately:
|
|
6
|
+
* 1. models — GET the provider's model list. Proves the key *authenticates*.
|
|
7
|
+
* 2. usable — a 1-token chat/messages call. Proves the account is actually
|
|
8
|
+
* callable (catches "key valid but balance = 0", e.g. DeepSeek 402,
|
|
9
|
+
* which the models endpoint alone reports as OK).
|
|
10
|
+
* 3. vision — (only with --vision) sends a 4-quadrant probe image to the
|
|
11
|
+
* profile's own model and checks it names all four colors, i.e.
|
|
12
|
+
* whether the main model can natively see images.
|
|
13
|
+
*
|
|
14
|
+
* Calls the upstream provider directly (not through the local proxy) so the
|
|
15
|
+
* result reflects the real provider, not the translation layer.
|
|
16
|
+
*/
|
|
17
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
18
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.cmdProfileTest = cmdProfileTest;
|
|
22
|
+
const picocolors_1 = __importDefault(require("picocolors"));
|
|
23
|
+
const store_1 = require("../accounts/store");
|
|
24
|
+
const test_image_1 = require("../shared/test-image");
|
|
25
|
+
const TIMEOUT_MS = 30000;
|
|
26
|
+
function trimBase(baseUrl) {
|
|
27
|
+
return baseUrl.trim().replace(/\/+$/, '');
|
|
28
|
+
}
|
|
29
|
+
function authHeaders(key, protocol) {
|
|
30
|
+
return protocol === 'anthropic'
|
|
31
|
+
? { 'x-api-key': key, 'anthropic-version': '2023-06-01', 'Content-Type': 'application/json' }
|
|
32
|
+
: { Authorization: `Bearer ${key}`, 'Content-Type': 'application/json' };
|
|
33
|
+
}
|
|
34
|
+
async function http(url, init) {
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
37
|
+
try {
|
|
38
|
+
const resp = await fetch(url, { ...init, signal: controller.signal });
|
|
39
|
+
const text = await resp.text();
|
|
40
|
+
let json = undefined;
|
|
41
|
+
try {
|
|
42
|
+
json = JSON.parse(text);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
/* non-JSON body */
|
|
46
|
+
}
|
|
47
|
+
return { status: resp.status, json, text };
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
clearTimeout(timer);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function errSnippet(status, json, text) {
|
|
54
|
+
const j = json;
|
|
55
|
+
const raw = j?.error?.message ?? j?.message ?? text;
|
|
56
|
+
// Collapse whitespace and strip HTML so a 404 error page stays one tidy line.
|
|
57
|
+
const msg = raw.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim().slice(0, 100);
|
|
58
|
+
return `HTTP ${status}${msg ? ` — ${msg}` : ''}`;
|
|
59
|
+
}
|
|
60
|
+
async function probeModels(base, key, protocol) {
|
|
61
|
+
const url = protocol === 'anthropic' ? `${base}/v1/models` : `${base}/models`;
|
|
62
|
+
try {
|
|
63
|
+
const { status, json, text } = await http(url, { method: 'GET', headers: authHeaders(key, protocol) });
|
|
64
|
+
// Many Anthropic-compatible providers don't expose /v1/models — a 404 here
|
|
65
|
+
// says nothing about the key (the `usable` probe is the real auth check).
|
|
66
|
+
if (status === 404)
|
|
67
|
+
return { ok: true, neutral: true, detail: 'no /v1/models endpoint' };
|
|
68
|
+
if (status !== 200)
|
|
69
|
+
return { ok: false, detail: errSnippet(status, json, text) };
|
|
70
|
+
const body = json;
|
|
71
|
+
const list = Array.isArray(body?.data) ? body.data : Array.isArray(body?.models) ? body.models : [];
|
|
72
|
+
return { ok: true, detail: `${list.length} models` };
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
return { ok: false, detail: e.message };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function probeUsable(base, key, protocol, model) {
|
|
79
|
+
const url = protocol === 'anthropic' ? `${base}/v1/messages` : `${base}/chat/completions`;
|
|
80
|
+
const body = JSON.stringify({ model, max_tokens: 8, messages: [{ role: 'user', content: 'hi' }] });
|
|
81
|
+
try {
|
|
82
|
+
const { status, json, text } = await http(url, { method: 'POST', headers: authHeaders(key, protocol), body });
|
|
83
|
+
if (status !== 200)
|
|
84
|
+
return { ok: false, detail: errSnippet(status, json, text) };
|
|
85
|
+
return { ok: true, detail: `model=${model}` };
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
return { ok: false, detail: e.message };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function extractReply(protocol, json) {
|
|
92
|
+
if (protocol === 'anthropic') {
|
|
93
|
+
const d = json;
|
|
94
|
+
return (d?.content ?? [])
|
|
95
|
+
.filter((b) => b?.type === 'text' && typeof b.text === 'string')
|
|
96
|
+
.map((b) => b.text)
|
|
97
|
+
.join(' ');
|
|
98
|
+
}
|
|
99
|
+
const d = json;
|
|
100
|
+
const m = d?.choices?.[0]?.message;
|
|
101
|
+
return m?.content || m?.reasoning_content || '';
|
|
102
|
+
}
|
|
103
|
+
async function probeVision(base, key, protocol, model) {
|
|
104
|
+
const url = protocol === 'anthropic' ? `${base}/v1/messages` : `${base}/chat/completions`;
|
|
105
|
+
const b64 = (0, test_image_1.makeVisionProbeBase64)();
|
|
106
|
+
const content = protocol === 'anthropic'
|
|
107
|
+
? [
|
|
108
|
+
{ type: 'text', text: test_image_1.VISION_PROBE_PROMPT },
|
|
109
|
+
{ type: 'image', source: { type: 'base64', media_type: 'image/png', data: b64 } },
|
|
110
|
+
]
|
|
111
|
+
: [
|
|
112
|
+
{ type: 'text', text: test_image_1.VISION_PROBE_PROMPT },
|
|
113
|
+
{ type: 'image_url', image_url: { url: `data:image/png;base64,${b64}` } },
|
|
114
|
+
];
|
|
115
|
+
const body = JSON.stringify({ model, max_tokens: 300, messages: [{ role: 'user', content }] });
|
|
116
|
+
try {
|
|
117
|
+
const { status, json, text } = await http(url, { method: 'POST', headers: authHeaders(key, protocol), body });
|
|
118
|
+
if (status !== 200)
|
|
119
|
+
return { ok: false, detail: errSnippet(status, json, text) };
|
|
120
|
+
const reply = extractReply(protocol, json).replace(/\s+/g, ' ').trim();
|
|
121
|
+
if ((0, test_image_1.passesVisionProbe)(reply))
|
|
122
|
+
return { ok: true, detail: `read image: "${reply.slice(0, 60)}"` };
|
|
123
|
+
return { ok: false, detail: `wrong/blind: "${reply.slice(0, 60) || '(empty)'}"` };
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
return { ok: false, detail: e.message };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function line(label, probe) {
|
|
130
|
+
if (!probe)
|
|
131
|
+
return ` ${picocolors_1.default.dim('vision'.padEnd(7))} ${picocolors_1.default.dim('–')} ${picocolors_1.default.dim('skipped (pass --vision)')}`;
|
|
132
|
+
const mark = probe.neutral ? picocolors_1.default.dim('•') : probe.ok ? picocolors_1.default.green('✓') : picocolors_1.default.red('✗');
|
|
133
|
+
const text = probe.neutral || probe.ok ? picocolors_1.default.dim(probe.detail) : picocolors_1.default.red(probe.detail);
|
|
134
|
+
return ` ${picocolors_1.default.dim(label.padEnd(7))} ${mark} ${text}`;
|
|
135
|
+
}
|
|
136
|
+
async function testOne(profile, wantVision) {
|
|
137
|
+
const protocol = profile.protocol || 'anthropic';
|
|
138
|
+
const key = (0, store_1.getProfileApiKey)(profile.name);
|
|
139
|
+
const head = ` ${picocolors_1.default.bold(profile.name)} ${picocolors_1.default.dim('·')} ${picocolors_1.default.dim(protocol)} ${picocolors_1.default.dim('·')} ${picocolors_1.default.cyan(profile.model)}`;
|
|
140
|
+
if (!key) {
|
|
141
|
+
console.log(head);
|
|
142
|
+
console.log(` ${picocolors_1.default.red('✗')} ${picocolors_1.default.red('no API key stored')}`);
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
const base = trimBase(profile.baseUrl);
|
|
146
|
+
const models = await probeModels(base, key, protocol);
|
|
147
|
+
const usable = await probeUsable(base, key, protocol, profile.model);
|
|
148
|
+
const vision = wantVision ? await probeVision(base, key, protocol, profile.model) : null;
|
|
149
|
+
console.log(head);
|
|
150
|
+
console.log(line('models', models));
|
|
151
|
+
console.log(line('usable', usable));
|
|
152
|
+
console.log(line('vision', vision));
|
|
153
|
+
// "Healthy" = can actually be used. Models-only success with an unusable
|
|
154
|
+
// account (balance 0) is still a failure worth surfacing in the exit code.
|
|
155
|
+
return usable.ok;
|
|
156
|
+
}
|
|
157
|
+
async function cmdProfileTest(args) {
|
|
158
|
+
const wantVision = args.includes('--vision');
|
|
159
|
+
const names = args.filter((a) => !a.startsWith('--'));
|
|
160
|
+
const targets = names.length
|
|
161
|
+
? names.map((n) => (0, store_1.getProfile)(n)).filter((p) => Boolean(p))
|
|
162
|
+
: (0, store_1.listProfiles)();
|
|
163
|
+
if (names.length) {
|
|
164
|
+
const missing = names.filter((n) => !(0, store_1.getProfile)(n));
|
|
165
|
+
if (missing.length) {
|
|
166
|
+
console.error(`[!] Profile not found: ${missing.join(', ')}`);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (targets.length === 0) {
|
|
171
|
+
console.log('[i] No profiles to test.');
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
console.log(`Testing ${targets.length} profile(s)${wantVision ? ' + vision' : ''} ${picocolors_1.default.dim('(models = auth · usable = balance · vision = main model sees images)')}\n`);
|
|
175
|
+
let failures = 0;
|
|
176
|
+
for (const p of targets) {
|
|
177
|
+
const ok = await testOne(p, wantVision);
|
|
178
|
+
if (!ok)
|
|
179
|
+
failures++;
|
|
180
|
+
console.log();
|
|
181
|
+
}
|
|
182
|
+
if (failures > 0) {
|
|
183
|
+
console.log(picocolors_1.default.dim(`${failures}/${targets.length} profile(s) not usable.`));
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
console.log(picocolors_1.default.green(`All ${targets.length} profile(s) usable.`));
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=profile-test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-test.js","sourceRoot":"","sources":["../../src/commands/profile-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mcc profile <add|list|remove|default>` — profile lifecycle commands.
|
|
3
|
+
*/
|
|
4
|
+
export declare function cmdProfileAdd(args: string[]): Promise<void>;
|
|
5
|
+
export declare function cmdProfileList(): Promise<void>;
|
|
6
|
+
export declare function cmdProfileRemove(args: string[]): Promise<void>;
|
|
7
|
+
export declare function cmdProfileDefault(args: string[]): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmDjE;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBpD;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAapE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAarE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `mcc profile <add|list|remove|default>` — profile lifecycle commands.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.cmdProfileAdd = cmdProfileAdd;
|
|
7
|
+
exports.cmdProfileList = cmdProfileList;
|
|
8
|
+
exports.cmdProfileRemove = cmdProfileRemove;
|
|
9
|
+
exports.cmdProfileDefault = cmdProfileDefault;
|
|
10
|
+
const store_1 = require("../accounts/store");
|
|
11
|
+
const instance_manager_1 = require("../accounts/instance-manager");
|
|
12
|
+
const installer_1 = require("../mcp/installer");
|
|
13
|
+
const registry_1 = require("../mcp/registry");
|
|
14
|
+
const instanceMgr = new instance_manager_1.MCCInstanceManager();
|
|
15
|
+
function getFlag(args, flag) {
|
|
16
|
+
const idx = args.indexOf(flag);
|
|
17
|
+
return idx !== -1 ? args[idx + 1] : undefined;
|
|
18
|
+
}
|
|
19
|
+
async function cmdProfileAdd(args) {
|
|
20
|
+
const name = args[0];
|
|
21
|
+
if (!name) {
|
|
22
|
+
console.error('[!] Usage: mcc profile add <name> --base-url <url> --api-key <key> --model <model> [--display-name <label>] [--protocol anthropic|openai] [--opus-model <m>] [--sonnet-model <m>] [--haiku-model <m>]');
|
|
23
|
+
process.exit(1);
|
|
24
|
+
}
|
|
25
|
+
const baseUrl = getFlag(args, '--base-url');
|
|
26
|
+
const apiKey = getFlag(args, '--api-key');
|
|
27
|
+
const displayName = getFlag(args, '--display-name');
|
|
28
|
+
const model = getFlag(args, '--model') ?? 'claude-sonnet-4-6';
|
|
29
|
+
const protocol = getFlag(args, '--protocol') ?? 'anthropic';
|
|
30
|
+
const proxyChatCompletionsPath = getFlag(args, '--proxy-chat-completions-path');
|
|
31
|
+
if (!baseUrl || !apiKey) {
|
|
32
|
+
console.error('[!] --base-url and --api-key are required');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
if (protocol !== 'anthropic' && protocol !== 'openai') {
|
|
36
|
+
console.error('[!] --protocol must be "anthropic" or "openai"');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
const profile = {
|
|
40
|
+
name,
|
|
41
|
+
displayName: displayName?.trim() || undefined,
|
|
42
|
+
baseUrl,
|
|
43
|
+
model,
|
|
44
|
+
opusModel: getFlag(args, '--opus-model'),
|
|
45
|
+
sonnetModel: getFlag(args, '--sonnet-model'),
|
|
46
|
+
haikuModel: getFlag(args, '--haiku-model'),
|
|
47
|
+
protocol,
|
|
48
|
+
proxyChatCompletionsPath: proxyChatCompletionsPath || undefined,
|
|
49
|
+
createdAt: new Date().toISOString(),
|
|
50
|
+
};
|
|
51
|
+
(0, store_1.saveProfile)(profile, apiKey);
|
|
52
|
+
await instanceMgr.ensureInstance(name);
|
|
53
|
+
const instancePath = instanceMgr.getInstancePath(name);
|
|
54
|
+
(0, installer_1.syncInstanceMcpServers)(instancePath, registry_1.BUILTIN_MCP_SERVERS.map((s) => s.name), name);
|
|
55
|
+
console.log(`[OK] Profile created: ${name}`);
|
|
56
|
+
if (profile.displayName)
|
|
57
|
+
console.log(` Display name: ${profile.displayName}`);
|
|
58
|
+
console.log(` Base URL: ${baseUrl}`);
|
|
59
|
+
console.log(` Model: ${model}`);
|
|
60
|
+
console.log(` Protocol: ${protocol}`);
|
|
61
|
+
if (profile.opusModel)
|
|
62
|
+
console.log(` Opus: ${profile.opusModel}`);
|
|
63
|
+
if (profile.sonnetModel)
|
|
64
|
+
console.log(` Sonnet: ${profile.sonnetModel}`);
|
|
65
|
+
if (profile.haikuModel)
|
|
66
|
+
console.log(` Haiku: ${profile.haikuModel}`);
|
|
67
|
+
if (profile.proxyChatCompletionsPath)
|
|
68
|
+
console.log(` Proxy chat path: ${profile.proxyChatCompletionsPath}`);
|
|
69
|
+
}
|
|
70
|
+
async function cmdProfileList() {
|
|
71
|
+
const profiles = (0, store_1.listProfiles)();
|
|
72
|
+
const defaultProfile = (0, store_1.getDefaultProfile)();
|
|
73
|
+
if (profiles.length === 0) {
|
|
74
|
+
console.log('[i] No profiles. Run: mcc profile add <name> --base-url <url> --api-key <key> --model <model>');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
console.log('Profiles:');
|
|
78
|
+
for (const p of profiles) {
|
|
79
|
+
const marker = p.name === defaultProfile ? ' (default)' : '';
|
|
80
|
+
const label = p.displayName && p.displayName !== p.name ? ` — ${p.displayName}` : '';
|
|
81
|
+
console.log(` ${p.name}${marker}${label}`);
|
|
82
|
+
console.log(` Base URL: ${p.baseUrl}`);
|
|
83
|
+
console.log(` Model: ${p.model}`);
|
|
84
|
+
console.log(` Protocol: ${p.protocol || 'anthropic'}`);
|
|
85
|
+
if (p.opusModel)
|
|
86
|
+
console.log(` Opus: ${p.opusModel}`);
|
|
87
|
+
if (p.sonnetModel)
|
|
88
|
+
console.log(` Sonnet: ${p.sonnetModel}`);
|
|
89
|
+
if (p.haikuModel)
|
|
90
|
+
console.log(` Haiku: ${p.haikuModel}`);
|
|
91
|
+
if (p.proxyChatCompletionsPath)
|
|
92
|
+
console.log(` Proxy chat path: ${p.proxyChatCompletionsPath}`);
|
|
93
|
+
console.log();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function cmdProfileRemove(args) {
|
|
97
|
+
const name = args[0];
|
|
98
|
+
if (!name) {
|
|
99
|
+
console.error('[!] Usage: mcc profile remove <name>');
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
if (!(0, store_1.hasProfile)(name)) {
|
|
103
|
+
console.error(`[!] Profile not found: ${name}`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
(0, store_1.deleteProfile)(name);
|
|
107
|
+
await instanceMgr.deleteInstance(name);
|
|
108
|
+
console.log(`[OK] Profile removed: ${name}`);
|
|
109
|
+
}
|
|
110
|
+
async function cmdProfileDefault(args) {
|
|
111
|
+
const name = args[0];
|
|
112
|
+
if (name) {
|
|
113
|
+
if (!(0, store_1.hasProfile)(name)) {
|
|
114
|
+
console.error(`[!] Profile not found: ${name}`);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
(0, store_1.setDefaultProfile)(name);
|
|
118
|
+
console.log(`[OK] Default profile set: ${name}`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
const defaultProf = (0, store_1.getDefaultProfile)();
|
|
122
|
+
console.log(defaultProf ? `Default profile: ${defaultProf}` : '[i] No default profile set');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../src/core/model-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../src/core/model-router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAOjD,MAAM,WAAW,UAAU;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,4BAA4B,EAAE,MAAM,CAAC;IACrC,8BAA8B,EAAE,MAAM,CAAC;IACvC,6BAA6B,EAAE,MAAM,CAAC;IACtC,0BAA0B,EAAE,MAAM,CAAC;IACnC,iBAAiB,EAAE,GAAG,CAAC;IACvB,qBAAqB,EAAE,GAAG,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,UAAU,CAqFrG"}
|
|
@@ -21,7 +21,8 @@ function buildProfileEnv(profile, apiKey, claudeConfigDir) {
|
|
|
21
21
|
// Read MCP config for provider settings
|
|
22
22
|
const mcpConfig = (0, mcp_config_1.readMcpConfig)();
|
|
23
23
|
const wsProviders = (0, mcp_config_1.getEnabledWebSearchProviders)(mcpConfig);
|
|
24
|
-
const
|
|
24
|
+
const iaProviders = (0, mcp_config_1.getEnabledImageAnalysisProviders)(mcpConfig);
|
|
25
|
+
const iaProvider = iaProviders[0] ?? null;
|
|
25
26
|
const env = {
|
|
26
27
|
ANTHROPIC_BASE_URL: profile.baseUrl,
|
|
27
28
|
ANTHROPIC_AUTH_TOKEN: apiKey,
|
|
@@ -34,17 +35,39 @@ function buildProfileEnv(profile, apiKey, claudeConfigDir) {
|
|
|
34
35
|
DISABLE_COST_WARNINGS: '1',
|
|
35
36
|
CLAUDE_CONFIG_DIR: claudeConfigDir,
|
|
36
37
|
};
|
|
38
|
+
// Thinking, driven by Claude Code itself so the user's /effort + Tab toggle
|
|
39
|
+
// are the source of truth. We seed two env vars so thinking is ON by default
|
|
40
|
+
// regardless of how Claude Code treats a third-party model id:
|
|
41
|
+
// - CLAUDE_CODE_EFFORT_LEVEL → adaptive-thinking path (modern models):
|
|
42
|
+
// sends thinking{type:adaptive} + output_config.effort.
|
|
43
|
+
// - MAX_THINKING_TOKENS → legacy path: sends thinking{type:enabled,budget}.
|
|
44
|
+
// Both matter because some upstreams MANDATE thinking (e.g. kimi-k2.7-code
|
|
45
|
+
// 400s on a request with no thinking) — seeding both guarantees Claude Code
|
|
46
|
+
// emits a thinking field those models accept. For openai-protocol the proxy
|
|
47
|
+
// re-reads whatever Claude Code sent and translates it per provider.
|
|
48
|
+
// Undefined ⇒ 'high'. 'off' leaves thinking to the model/user default.
|
|
49
|
+
const effort = profile.reasoningEffort ?? 'high';
|
|
50
|
+
if (effort !== 'off') {
|
|
51
|
+
env.CLAUDE_CODE_EFFORT_LEVEL = effort;
|
|
52
|
+
const budgetByEffort = {
|
|
53
|
+
low: 4096, medium: 8192, high: 16384, max: 32768,
|
|
54
|
+
};
|
|
55
|
+
env.MAX_THINKING_TOKENS = String(budgetByEffort[effort] ?? 16384);
|
|
56
|
+
}
|
|
37
57
|
// MCP: WebSearch
|
|
38
58
|
env.MCC_WEBSEARCH_ENABLED = mcpConfig.websearch.enabled ? '1' : '0';
|
|
39
59
|
for (const p of wsProviders) {
|
|
40
|
-
env
|
|
41
|
-
|
|
60
|
+
// Normalize provider id to a valid env-var suffix (no dashes).
|
|
61
|
+
const envKey = p.replace(/-/g, '_').toUpperCase();
|
|
62
|
+
env[`MCC_WEBSEARCH_${envKey}`] = '1';
|
|
42
63
|
const providerConfig = mcpConfig.websearch.providers[p];
|
|
43
64
|
if (providerConfig?.apiKey) {
|
|
44
65
|
const keyEnvMap = {
|
|
45
66
|
exa: 'MCC_WEBSEARCH_EXA_API_KEY',
|
|
46
67
|
tavily: 'MCC_WEBSEARCH_TAVILY_API_KEY',
|
|
47
68
|
brave: 'MCC_WEBSEARCH_BRAVE_API_KEY',
|
|
69
|
+
bocha: 'MCC_WEBSEARCH_BOCHA_API_KEY',
|
|
70
|
+
minimax: 'MCC_WEBSEARCH_MINIMAX_API_KEY',
|
|
48
71
|
};
|
|
49
72
|
if (keyEnvMap[p]) {
|
|
50
73
|
env[keyEnvMap[p]] = providerConfig.apiKey;
|
|
@@ -54,10 +77,20 @@ function buildProfileEnv(profile, apiKey, claudeConfigDir) {
|
|
|
54
77
|
// MCP: Image Analysis
|
|
55
78
|
if (mcpConfig.imageAnalysis.enabled && iaProvider) {
|
|
56
79
|
env.MCC_IMAGE_ANALYSIS_ENABLED = '1';
|
|
80
|
+
// Legacy single-provider vars — kept for back-compat / launch display.
|
|
57
81
|
env.MCC_IMAGE_ANALYSIS_RUNTIME_BASE_URL = iaProvider.baseUrl;
|
|
58
82
|
env.MCC_IMAGE_ANALYSIS_RUNTIME_API_KEY = iaProvider.apiKey;
|
|
59
83
|
env.MCC_IMAGE_ANALYSIS_MODEL = iaProvider.model;
|
|
60
84
|
env.MCC_IMAGE_ANALYSIS_FORMAT = iaProvider.format;
|
|
85
|
+
// Full fallback chain — the runtime tries these in order; the first that
|
|
86
|
+
// succeeds wins, the rest are tried on 402 / auth / network errors.
|
|
87
|
+
env.MCC_IMAGE_ANALYSIS_PROVIDERS = JSON.stringify(iaProviders.map((p) => ({
|
|
88
|
+
id: p.id,
|
|
89
|
+
baseUrl: p.baseUrl,
|
|
90
|
+
apiKey: p.apiKey,
|
|
91
|
+
model: p.model,
|
|
92
|
+
format: p.format,
|
|
93
|
+
})));
|
|
61
94
|
}
|
|
62
95
|
return env;
|
|
63
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/core/model-router.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;
|
|
1
|
+
{"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/core/model-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|