@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.
Files changed (102) hide show
  1. package/README.md +229 -127
  2. package/dist/accounts/store.d.ts +12 -0
  3. package/dist/accounts/store.d.ts.map +1 -1
  4. package/dist/accounts/store.js.map +1 -1
  5. package/dist/commands/launch.d.ts +9 -0
  6. package/dist/commands/launch.d.ts.map +1 -0
  7. package/dist/commands/launch.js +162 -0
  8. package/dist/commands/launch.js.map +1 -0
  9. package/dist/commands/mcp.d.ts +9 -0
  10. package/dist/commands/mcp.d.ts.map +1 -0
  11. package/dist/commands/mcp.js +112 -0
  12. package/dist/commands/mcp.js.map +1 -0
  13. package/dist/commands/profile-test.d.ts +17 -0
  14. package/dist/commands/profile-test.d.ts.map +1 -0
  15. package/dist/commands/profile-test.js +188 -0
  16. package/dist/commands/profile-test.js.map +1 -0
  17. package/dist/commands/profile.d.ts +8 -0
  18. package/dist/commands/profile.d.ts.map +1 -0
  19. package/dist/commands/profile.js +125 -0
  20. package/dist/commands/profile.js.map +1 -0
  21. package/dist/core/model-router.d.ts.map +1 -1
  22. package/dist/core/model-router.js +36 -3
  23. package/dist/core/model-router.js.map +1 -1
  24. package/dist/{dashboard-server.d.ts → dashboard/server.d.ts} +1 -1
  25. package/dist/dashboard/server.d.ts.map +1 -0
  26. package/dist/{dashboard-server.js → dashboard/server.js} +254 -48
  27. package/dist/dashboard/server.js.map +1 -0
  28. package/dist/mcc.d.ts +4 -2
  29. package/dist/mcc.d.ts.map +1 -1
  30. package/dist/mcc.js +127 -408
  31. package/dist/mcc.js.map +1 -1
  32. package/dist/mcp/installer.d.ts.map +1 -1
  33. package/dist/mcp/installer.js +5 -2
  34. package/dist/mcp/installer.js.map +1 -1
  35. package/dist/mcp/mcp-config.d.ts +33 -3
  36. package/dist/mcp/mcp-config.d.ts.map +1 -1
  37. package/dist/mcp/mcp-config.js +81 -29
  38. package/dist/mcp/mcp-config.js.map +1 -1
  39. package/dist/proxy/proxy-daemon.d.ts +1 -1
  40. package/dist/proxy/proxy-daemon.d.ts.map +1 -1
  41. package/dist/proxy/proxy-daemon.js +27 -7
  42. package/dist/proxy/proxy-daemon.js.map +1 -1
  43. package/dist/proxy/proxy-entry.js +11 -4
  44. package/dist/proxy/proxy-entry.js.map +1 -1
  45. package/dist/proxy/proxy-paths.d.ts +1 -0
  46. package/dist/proxy/proxy-paths.d.ts.map +1 -1
  47. package/dist/proxy/proxy-paths.js.map +1 -1
  48. package/dist/proxy/proxy-server.d.ts +1 -0
  49. package/dist/proxy/proxy-server.d.ts.map +1 -1
  50. package/dist/proxy/proxy-server.js +114 -6
  51. package/dist/proxy/proxy-server.js.map +1 -1
  52. package/dist/shared/config.d.ts +15 -0
  53. package/dist/shared/config.d.ts.map +1 -0
  54. package/dist/shared/config.js +79 -0
  55. package/dist/shared/config.js.map +1 -0
  56. package/dist/shared/logger.d.ts +23 -18
  57. package/dist/shared/logger.d.ts.map +1 -1
  58. package/dist/shared/logger.js +17 -178
  59. package/dist/shared/logger.js.map +1 -1
  60. package/dist/shared/provider-preset-catalog.d.ts +8 -2
  61. package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
  62. package/dist/shared/provider-preset-catalog.js +61 -31
  63. package/dist/shared/provider-preset-catalog.js.map +1 -1
  64. package/dist/shared/test-image.d.ts +15 -0
  65. package/dist/shared/test-image.d.ts.map +1 -0
  66. package/dist/shared/test-image.js +89 -0
  67. package/dist/shared/test-image.js.map +1 -0
  68. package/dist/ui/assets/index-7kowlJw9.js +40 -0
  69. package/dist/ui/assets/index-DnC-lskL.css +1 -0
  70. package/dist/ui/index.html +21 -13
  71. package/dist/update.d.ts +31 -0
  72. package/dist/update.d.ts.map +1 -0
  73. package/dist/update.js +196 -0
  74. package/dist/update.js.map +1 -0
  75. package/lib/mcp/mcc-image-analysis-server.cjs +454 -454
  76. package/lib/mcp/mcc-websearch-server.cjs +339 -339
  77. package/lib/mcp-hooks/image-analysis-runtime.cjs +563 -510
  78. package/lib/mcp-hooks/image-analyzer-transformer.cjs +526 -526
  79. package/lib/mcp-hooks/websearch-transformer.cjs +1597 -1421
  80. package/lib/proxy/config/config-loader-facade.js +24 -24
  81. package/lib/proxy/glmt/delta-accumulator.js +362 -362
  82. package/lib/proxy/glmt/glmt-transformer.js +203 -203
  83. package/lib/proxy/glmt/index.js +40 -40
  84. package/lib/proxy/glmt/locale-enforcer.js +68 -68
  85. package/lib/proxy/glmt/pipeline/content-transformer.js +161 -161
  86. package/lib/proxy/glmt/pipeline/index.js +19 -19
  87. package/lib/proxy/glmt/pipeline/request-transformer.js +115 -115
  88. package/lib/proxy/glmt/pipeline/response-builder.js +204 -204
  89. package/lib/proxy/glmt/pipeline/stream-parser.js +233 -233
  90. package/lib/proxy/glmt/pipeline/tool-call-handler.js +77 -77
  91. package/lib/proxy/glmt/pipeline/types.js +5 -5
  92. package/lib/proxy/glmt/reasoning-enforcer.js +150 -150
  93. package/lib/proxy/glmt/sse-parser.js +101 -101
  94. package/lib/proxy/services/logging.js +13 -13
  95. package/lib/proxy/transformers/request-transformer.js +471 -471
  96. package/lib/proxy/transformers/sse-stream-transformer.js +198 -198
  97. package/lib/shared/logger.cjs +160 -138
  98. package/package.json +58 -41
  99. package/dist/dashboard-server.d.ts.map +0 -1
  100. package/dist/dashboard-server.js.map +0 -1
  101. package/dist/ui/assets/index-B16lhKZ6.js +0 -40
  102. 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;AAGjD,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,CAiDrG"}
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 iaProvider = (0, mcp_config_1.getActiveImageAnalysisProvider)(mcpConfig);
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[`MCC_WEBSEARCH_${p.toUpperCase()}`] = '1';
41
- // Set API key env vars for providers that need them
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;;AAuBH,0CAiDC;AArED,kDAAgH;AAgBhH;;;GAGG;AACH,SAAgB,eAAe,CAAC,OAAgB,EAAE,MAAc,EAAE,eAAuB;IACvF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,wCAAwC;IACxC,MAAM,SAAS,GAAG,IAAA,0BAAa,GAAE,CAAC;IAClC,MAAM,WAAW,GAAG,IAAA,yCAA4B,EAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAA,2CAA8B,EAAC,SAAS,CAAC,CAAC;IAE7D,MAAM,GAAG,GAA2B;QAClC,kBAAkB,EAAE,OAAO,CAAC,OAAO;QACnC,oBAAoB,EAAE,MAAM;QAC5B,eAAe,EAAE,KAAK;QACtB,4BAA4B,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK;QACxD,8BAA8B,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;QAC5D,6BAA6B,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK;QAC1D,0BAA0B,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK;QACvD,iBAAiB,EAAE,GAAG;QACtB,qBAAqB,EAAE,GAAG;QAC1B,iBAAiB,EAAE,eAAe;KACnC,CAAC;IAEF,iBAAiB;IACjB,GAAG,CAAC,qBAAqB,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,GAAG,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;QAC9C,oDAAoD;QACpD,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,cAAc,EAAE,MAAM,EAAE,CAAC;YAC3B,MAAM,SAAS,GAA2B;gBACxC,GAAG,EAAE,2BAA2B;gBAChC,MAAM,EAAE,8BAA8B;gBACtC,KAAK,EAAE,6BAA6B;aACrC,CAAC;YACF,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,SAAS,CAAC,aAAa,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;QAClD,GAAG,CAAC,0BAA0B,GAAG,GAAG,CAAC;QACrC,GAAG,CAAC,mCAAmC,GAAG,UAAU,CAAC,OAAO,CAAC;QAC7D,GAAG,CAAC,kCAAkC,GAAG,UAAU,CAAC,MAAM,CAAC;QAC3D,GAAG,CAAC,wBAAwB,GAAG,UAAU,CAAC,KAAK,CAAC;QAChD,GAAG,CAAC,yBAAyB,GAAG,UAAU,CAAC,MAAM,CAAC;IACpD,CAAC;IAED,OAAO,GAA4B,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/core/model-router.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,4 @@
2
2
  * Dashboard Server - Express API + static file server
3
3
  */
4
4
  export {};
5
- //# sourceMappingURL=dashboard-server.d.ts.map
5
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"AAAA;;GAEG"}