@helmisatria/mcp-chrome-bridge 1.0.30
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 +183 -0
- package/dist/README.md +25 -0
- package/dist/agent/attachment-service.d.ts +83 -0
- package/dist/agent/attachment-service.js +370 -0
- package/dist/agent/attachment-service.js.map +1 -0
- package/dist/agent/ccr-detector.d.ts +59 -0
- package/dist/agent/ccr-detector.js +311 -0
- package/dist/agent/ccr-detector.js.map +1 -0
- package/dist/agent/chat-service.d.ts +50 -0
- package/dist/agent/chat-service.js +439 -0
- package/dist/agent/chat-service.js.map +1 -0
- package/dist/agent/db/client.d.ts +26 -0
- package/dist/agent/db/client.js +244 -0
- package/dist/agent/db/client.js.map +1 -0
- package/dist/agent/db/index.d.ts +5 -0
- package/dist/agent/db/index.js +22 -0
- package/dist/agent/db/index.js.map +1 -0
- package/dist/agent/db/schema.d.ts +711 -0
- package/dist/agent/db/schema.js +121 -0
- package/dist/agent/db/schema.js.map +1 -0
- package/dist/agent/directory-picker.d.ts +11 -0
- package/dist/agent/directory-picker.js +149 -0
- package/dist/agent/directory-picker.js.map +1 -0
- package/dist/agent/engines/claude.d.ts +79 -0
- package/dist/agent/engines/claude.js +1338 -0
- package/dist/agent/engines/claude.js.map +1 -0
- package/dist/agent/engines/codex.d.ts +48 -0
- package/dist/agent/engines/codex.js +822 -0
- package/dist/agent/engines/codex.js.map +1 -0
- package/dist/agent/engines/types.d.ts +133 -0
- package/dist/agent/engines/types.js +3 -0
- package/dist/agent/engines/types.js.map +1 -0
- package/dist/agent/message-service.d.ts +56 -0
- package/dist/agent/message-service.js +198 -0
- package/dist/agent/message-service.js.map +1 -0
- package/dist/agent/open-project.d.ts +25 -0
- package/dist/agent/open-project.js +469 -0
- package/dist/agent/open-project.js.map +1 -0
- package/dist/agent/project-service.d.ts +49 -0
- package/dist/agent/project-service.js +254 -0
- package/dist/agent/project-service.js.map +1 -0
- package/dist/agent/project-types.d.ts +27 -0
- package/dist/agent/project-types.js +3 -0
- package/dist/agent/project-types.js.map +1 -0
- package/dist/agent/session-service.d.ts +198 -0
- package/dist/agent/session-service.js +292 -0
- package/dist/agent/session-service.js.map +1 -0
- package/dist/agent/storage.d.ts +27 -0
- package/dist/agent/storage.js +73 -0
- package/dist/agent/storage.js.map +1 -0
- package/dist/agent/stream-manager.d.ts +42 -0
- package/dist/agent/stream-manager.js +243 -0
- package/dist/agent/stream-manager.js.map +1 -0
- package/dist/agent/tool-bridge.d.ts +44 -0
- package/dist/agent/tool-bridge.js +50 -0
- package/dist/agent/tool-bridge.js.map +1 -0
- package/dist/agent/types.d.ts +6 -0
- package/dist/agent/types.js +3 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +1 -0
- package/dist/constant/index.d.ts +60 -0
- package/dist/constant/index.js +80 -0
- package/dist/constant/index.js.map +1 -0
- package/dist/file-handler.d.ts +41 -0
- package/dist/file-handler.js +295 -0
- package/dist/file-handler.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/mcp-server-stdio.d.ts +72 -0
- package/dist/mcp/mcp-server-stdio.js +143 -0
- package/dist/mcp/mcp-server-stdio.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +36 -0
- package/dist/mcp/mcp-server.js +26 -0
- package/dist/mcp/mcp-server.js.map +1 -0
- package/dist/mcp/register-tools.d.ts +2 -0
- package/dist/mcp/register-tools.js +148 -0
- package/dist/mcp/register-tools.js.map +1 -0
- package/dist/mcp/stdio-config.json +3 -0
- package/dist/native-messaging-host.d.ts +42 -0
- package/dist/native-messaging-host.js +312 -0
- package/dist/native-messaging-host.js.map +1 -0
- package/dist/run_host.bat +194 -0
- package/dist/run_host.sh +264 -0
- package/dist/scripts/browser-config.d.ts +28 -0
- package/dist/scripts/browser-config.js +229 -0
- package/dist/scripts/browser-config.js.map +1 -0
- package/dist/scripts/build.d.ts +1 -0
- package/dist/scripts/build.js +126 -0
- package/dist/scripts/build.js.map +1 -0
- package/dist/scripts/constant.d.ts +4 -0
- package/dist/scripts/constant.js +8 -0
- package/dist/scripts/constant.js.map +1 -0
- package/dist/scripts/doctor.d.ts +70 -0
- package/dist/scripts/doctor.js +930 -0
- package/dist/scripts/doctor.js.map +1 -0
- package/dist/scripts/postinstall.d.ts +2 -0
- package/dist/scripts/postinstall.js +246 -0
- package/dist/scripts/postinstall.js.map +1 -0
- package/dist/scripts/register-dev.d.ts +1 -0
- package/dist/scripts/register-dev.js +5 -0
- package/dist/scripts/register-dev.js.map +1 -0
- package/dist/scripts/register.d.ts +2 -0
- package/dist/scripts/register.js +28 -0
- package/dist/scripts/register.js.map +1 -0
- package/dist/scripts/report.d.ts +96 -0
- package/dist/scripts/report.js +686 -0
- package/dist/scripts/report.js.map +1 -0
- package/dist/scripts/utils.d.ts +64 -0
- package/dist/scripts/utils.js +443 -0
- package/dist/scripts/utils.js.map +1 -0
- package/dist/server/index.d.ts +35 -0
- package/dist/server/index.js +312 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/agent.d.ts +21 -0
- package/dist/server/routes/agent.js +971 -0
- package/dist/server/routes/agent.js.map +1 -0
- package/dist/server/routes/index.d.ts +4 -0
- package/dist/server/routes/index.js +9 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/trace-analyzer.d.ts +14 -0
- package/dist/trace-analyzer.js +113 -0
- package/dist/trace-analyzer.js.map +1 -0
- package/dist/util/logger.d.ts +1 -0
- package/dist/util/logger.js +43 -0
- package/dist/util/logger.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of CCR detection.
|
|
3
|
+
*/
|
|
4
|
+
export interface CcrDetectionResult {
|
|
5
|
+
detected: boolean;
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
authToken?: string;
|
|
8
|
+
source?: 'env' | 'config';
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Result of validating CCR configuration.
|
|
13
|
+
*/
|
|
14
|
+
export interface CcrValidationResult {
|
|
15
|
+
/** Whether a CCR config file was found and inspected */
|
|
16
|
+
checked: boolean;
|
|
17
|
+
/** Whether the configuration is valid */
|
|
18
|
+
valid: boolean;
|
|
19
|
+
/** Path to the CCR config file */
|
|
20
|
+
configPath: string;
|
|
21
|
+
/** Current Router.default value if available */
|
|
22
|
+
routerDefault?: string;
|
|
23
|
+
/** Human-readable issue description when valid is false */
|
|
24
|
+
issue?: string;
|
|
25
|
+
/** Suggested Router.default value in "provider,model" format */
|
|
26
|
+
suggestedFix?: string;
|
|
27
|
+
/** Full suggestion message for the user */
|
|
28
|
+
suggestion?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Detect CCR configuration and verify it's running.
|
|
32
|
+
*
|
|
33
|
+
* This function:
|
|
34
|
+
* 1. Returns cached result if still valid
|
|
35
|
+
* 2. Checks if CCR env vars are already set in process.env
|
|
36
|
+
* 3. If not, reads and parses CCR config file
|
|
37
|
+
* 4. Verifies CCR is running via health check
|
|
38
|
+
*
|
|
39
|
+
* @returns Detection result with baseUrl and authToken if CCR is available
|
|
40
|
+
*/
|
|
41
|
+
export declare function detectCcr(): Promise<CcrDetectionResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Clear the CCR detection cache.
|
|
44
|
+
* Useful for testing or when user wants to re-detect.
|
|
45
|
+
*/
|
|
46
|
+
export declare function clearCcrCache(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Validate CCR configuration for common misconfigurations.
|
|
49
|
+
*
|
|
50
|
+
* This function checks for issues that would cause runtime errors in CCR,
|
|
51
|
+
* particularly the "Router.default must be provider,model" requirement.
|
|
52
|
+
*
|
|
53
|
+
* The most common misconfiguration is setting Router.default to just a provider
|
|
54
|
+
* name (e.g., "venus") instead of the required "provider,model" format
|
|
55
|
+
* (e.g., "venus,claude-4-5-sonnet-20250929"). This causes CCR to crash with
|
|
56
|
+
* "Cannot read properties of undefined (reading 'includes')" when it tries
|
|
57
|
+
* to split the model name.
|
|
58
|
+
*/
|
|
59
|
+
export declare function validateCcrConfig(): Promise<CcrValidationResult>;
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.detectCcr = detectCcr;
|
|
7
|
+
exports.clearCcrCache = clearCcrCache;
|
|
8
|
+
exports.validateCcrConfig = validateCcrConfig;
|
|
9
|
+
/**
|
|
10
|
+
* Claude Code Router (CCR) Auto-Detection Module.
|
|
11
|
+
*
|
|
12
|
+
* This module provides automatic detection of CCR configuration
|
|
13
|
+
* for users who have already set up CCR on their system.
|
|
14
|
+
*
|
|
15
|
+
* CCR config location: ~/.claude-code-router/config.json
|
|
16
|
+
* CCR uses env vars: ANTHROPIC_BASE_URL, ANTHROPIC_AUTH_TOKEN
|
|
17
|
+
*
|
|
18
|
+
* The detection flow:
|
|
19
|
+
* 1. Check if CCR env vars are already set (skip if yes)
|
|
20
|
+
* 2. Read CCR config file
|
|
21
|
+
* 3. Parse JSON5 config with env var interpolation
|
|
22
|
+
* 4. Verify CCR is running via health check
|
|
23
|
+
* 5. Return derived env vars if healthy
|
|
24
|
+
*/
|
|
25
|
+
const promises_1 = require("node:fs/promises");
|
|
26
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
27
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
28
|
+
/**
|
|
29
|
+
* Default CCR port.
|
|
30
|
+
*/
|
|
31
|
+
const DEFAULT_CCR_PORT = 9898;
|
|
32
|
+
/**
|
|
33
|
+
* CCR config file path.
|
|
34
|
+
*/
|
|
35
|
+
const CCR_CONFIG_PATH = node_path_1.default.join(node_os_1.default.homedir(), '.claude-code-router', 'config.json');
|
|
36
|
+
/**
|
|
37
|
+
* Health check timeout in milliseconds.
|
|
38
|
+
*/
|
|
39
|
+
const HEALTH_CHECK_TIMEOUT = 2000;
|
|
40
|
+
/**
|
|
41
|
+
* Cache for CCR detection result (to avoid repeated file reads and health checks).
|
|
42
|
+
* Cached for the lifetime of the process.
|
|
43
|
+
*/
|
|
44
|
+
let cachedResult = null;
|
|
45
|
+
let cacheTimestamp = 0;
|
|
46
|
+
const CACHE_TTL = 60000; // 1 minute
|
|
47
|
+
/**
|
|
48
|
+
* Detect CCR configuration and verify it's running.
|
|
49
|
+
*
|
|
50
|
+
* This function:
|
|
51
|
+
* 1. Returns cached result if still valid
|
|
52
|
+
* 2. Checks if CCR env vars are already set in process.env
|
|
53
|
+
* 3. If not, reads and parses CCR config file
|
|
54
|
+
* 4. Verifies CCR is running via health check
|
|
55
|
+
*
|
|
56
|
+
* @returns Detection result with baseUrl and authToken if CCR is available
|
|
57
|
+
*/
|
|
58
|
+
async function detectCcr() {
|
|
59
|
+
var _a, _b, _c, _d, _e;
|
|
60
|
+
// Check cache
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
if (cachedResult && now - cacheTimestamp < CACHE_TTL) {
|
|
63
|
+
return cachedResult;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
// First, check if env vars are already set (user ran `eval "$(ccr activate)"`)
|
|
67
|
+
const envBaseUrl = process.env.ANTHROPIC_BASE_URL;
|
|
68
|
+
const envAuthToken = process.env.ANTHROPIC_AUTH_TOKEN;
|
|
69
|
+
if (envBaseUrl && envAuthToken) {
|
|
70
|
+
// Verify CCR is running
|
|
71
|
+
const healthy = await checkCcrHealth(envBaseUrl);
|
|
72
|
+
if (healthy) {
|
|
73
|
+
cachedResult = {
|
|
74
|
+
detected: true,
|
|
75
|
+
baseUrl: envBaseUrl,
|
|
76
|
+
authToken: envAuthToken,
|
|
77
|
+
source: 'env',
|
|
78
|
+
};
|
|
79
|
+
cacheTimestamp = now;
|
|
80
|
+
return cachedResult;
|
|
81
|
+
}
|
|
82
|
+
// Env vars set but CCR not healthy - fall through to config detection
|
|
83
|
+
}
|
|
84
|
+
// Try to read CCR config file
|
|
85
|
+
const configResult = await readCcrConfig();
|
|
86
|
+
if (!configResult.config) {
|
|
87
|
+
cachedResult = {
|
|
88
|
+
detected: false,
|
|
89
|
+
error: configResult.error || 'CCR config not found or invalid',
|
|
90
|
+
};
|
|
91
|
+
cacheTimestamp = now;
|
|
92
|
+
return cachedResult;
|
|
93
|
+
}
|
|
94
|
+
const config = configResult.config;
|
|
95
|
+
// Derive env vars from config (support both uppercase and lowercase field names)
|
|
96
|
+
const port = (_b = (_a = config.PORT) !== null && _a !== void 0 ? _a : config.port) !== null && _b !== void 0 ? _b : DEFAULT_CCR_PORT;
|
|
97
|
+
const host = (_d = (_c = config.HOST) !== null && _c !== void 0 ? _c : config.host) !== null && _d !== void 0 ? _d : '127.0.0.1';
|
|
98
|
+
const baseUrl = `http://${host}:${port}`;
|
|
99
|
+
// APIKEY can be empty string in config, use 'APIKEY' as fallback (CCR accepts this)
|
|
100
|
+
const apiKey = (_e = config.APIKEY) !== null && _e !== void 0 ? _e : config.apiKey;
|
|
101
|
+
const authToken = apiKey && apiKey.length > 0 ? apiKey : 'APIKEY';
|
|
102
|
+
// Verify CCR is running
|
|
103
|
+
const healthy = await checkCcrHealth(baseUrl);
|
|
104
|
+
if (!healthy) {
|
|
105
|
+
cachedResult = {
|
|
106
|
+
detected: false,
|
|
107
|
+
error: 'CCR config found but service not running',
|
|
108
|
+
};
|
|
109
|
+
cacheTimestamp = now;
|
|
110
|
+
return cachedResult;
|
|
111
|
+
}
|
|
112
|
+
cachedResult = {
|
|
113
|
+
detected: true,
|
|
114
|
+
baseUrl,
|
|
115
|
+
authToken,
|
|
116
|
+
source: 'config',
|
|
117
|
+
};
|
|
118
|
+
cacheTimestamp = now;
|
|
119
|
+
return cachedResult;
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
123
|
+
cachedResult = { detected: false, error: message };
|
|
124
|
+
cacheTimestamp = now;
|
|
125
|
+
return cachedResult;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Read and parse CCR config file.
|
|
130
|
+
*/
|
|
131
|
+
async function readCcrConfig() {
|
|
132
|
+
try {
|
|
133
|
+
const content = await (0, promises_1.readFile)(CCR_CONFIG_PATH, 'utf-8');
|
|
134
|
+
const config = parseJson5Config(content);
|
|
135
|
+
if (!config) {
|
|
136
|
+
return { config: null, error: 'Failed to parse CCR config file' };
|
|
137
|
+
}
|
|
138
|
+
return { config };
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const err = error;
|
|
142
|
+
if (err.code === 'ENOENT') {
|
|
143
|
+
// Config file doesn't exist - CCR not installed
|
|
144
|
+
return { config: null, error: 'CCR config file not found' };
|
|
145
|
+
}
|
|
146
|
+
return { config: null, error: `Failed to read CCR config: ${err.message}` };
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Parse CCR config file.
|
|
151
|
+
*
|
|
152
|
+
* CCR config is standard JSON (not JSON5), so we can use JSON.parse directly.
|
|
153
|
+
* We only need to handle env var interpolation: ${VAR_NAME}
|
|
154
|
+
*
|
|
155
|
+
* Note: Previous implementation tried to strip comments using regex which
|
|
156
|
+
* incorrectly matched "http://" URLs inside strings.
|
|
157
|
+
*/
|
|
158
|
+
function parseJson5Config(content) {
|
|
159
|
+
try {
|
|
160
|
+
// First try standard JSON parse (CCR config is usually valid JSON)
|
|
161
|
+
// Only interpolate env vars if needed
|
|
162
|
+
let processed = content;
|
|
163
|
+
// Interpolate env vars: ${VAR_NAME} -> value
|
|
164
|
+
// Only do this outside of the JSON parsing to avoid breaking strings
|
|
165
|
+
if (content.includes('${')) {
|
|
166
|
+
processed = content.replace(/\$\{([^}]+)\}/g, (_, varName) => {
|
|
167
|
+
const value = process.env[varName.trim()];
|
|
168
|
+
return value || '';
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const parsed = JSON.parse(processed);
|
|
172
|
+
return parsed;
|
|
173
|
+
}
|
|
174
|
+
catch (parseError) {
|
|
175
|
+
// Log parse error for debugging
|
|
176
|
+
console.error('[CCR] Failed to parse config:', parseError);
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Check if CCR is running by hitting its health endpoint.
|
|
182
|
+
*/
|
|
183
|
+
async function checkCcrHealth(baseUrl) {
|
|
184
|
+
try {
|
|
185
|
+
const healthUrl = `${baseUrl}/health`;
|
|
186
|
+
const controller = new AbortController();
|
|
187
|
+
const timeoutId = setTimeout(() => controller.abort(), HEALTH_CHECK_TIMEOUT);
|
|
188
|
+
try {
|
|
189
|
+
const response = await fetch(healthUrl, {
|
|
190
|
+
method: 'GET',
|
|
191
|
+
signal: controller.signal,
|
|
192
|
+
});
|
|
193
|
+
clearTimeout(timeoutId);
|
|
194
|
+
return response.ok;
|
|
195
|
+
}
|
|
196
|
+
catch (_a) {
|
|
197
|
+
clearTimeout(timeoutId);
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch (_b) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Clear the CCR detection cache.
|
|
207
|
+
* Useful for testing or when user wants to re-detect.
|
|
208
|
+
*/
|
|
209
|
+
function clearCcrCache() {
|
|
210
|
+
cachedResult = null;
|
|
211
|
+
cacheTimestamp = 0;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Validate CCR configuration for common misconfigurations.
|
|
215
|
+
*
|
|
216
|
+
* This function checks for issues that would cause runtime errors in CCR,
|
|
217
|
+
* particularly the "Router.default must be provider,model" requirement.
|
|
218
|
+
*
|
|
219
|
+
* The most common misconfiguration is setting Router.default to just a provider
|
|
220
|
+
* name (e.g., "venus") instead of the required "provider,model" format
|
|
221
|
+
* (e.g., "venus,claude-4-5-sonnet-20250929"). This causes CCR to crash with
|
|
222
|
+
* "Cannot read properties of undefined (reading 'includes')" when it tries
|
|
223
|
+
* to split the model name.
|
|
224
|
+
*/
|
|
225
|
+
async function validateCcrConfig() {
|
|
226
|
+
var _a, _b, _c;
|
|
227
|
+
const configResult = await readCcrConfig();
|
|
228
|
+
// If we can't read the config, return early (not our problem to report)
|
|
229
|
+
if (!configResult.config) {
|
|
230
|
+
return {
|
|
231
|
+
checked: false,
|
|
232
|
+
valid: true,
|
|
233
|
+
configPath: CCR_CONFIG_PATH,
|
|
234
|
+
issue: configResult.error,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const config = configResult.config;
|
|
238
|
+
const router = (_a = config.Router) !== null && _a !== void 0 ? _a : config.router;
|
|
239
|
+
const routerDefault = (_b = router === null || router === void 0 ? void 0 : router.default) === null || _b === void 0 ? void 0 : _b.trim();
|
|
240
|
+
// No Router.default configured
|
|
241
|
+
if (!routerDefault) {
|
|
242
|
+
return {
|
|
243
|
+
checked: true,
|
|
244
|
+
valid: false,
|
|
245
|
+
configPath: CCR_CONFIG_PATH,
|
|
246
|
+
issue: 'CCR Router.default is not configured.',
|
|
247
|
+
suggestion: `Edit ${CCR_CONFIG_PATH} and set Router.default to "provider,model" format, then restart CCR.`,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
// Check if Router.default contains a comma (required format: provider,model)
|
|
251
|
+
if (!routerDefault.includes(',')) {
|
|
252
|
+
const suggestedFix = inferSuggestedRouterDefault(routerDefault, config, router);
|
|
253
|
+
const example = suggestedFix !== null && suggestedFix !== void 0 ? suggestedFix : `${routerDefault},<model>`;
|
|
254
|
+
return {
|
|
255
|
+
checked: true,
|
|
256
|
+
valid: false,
|
|
257
|
+
configPath: CCR_CONFIG_PATH,
|
|
258
|
+
routerDefault,
|
|
259
|
+
issue: `CCR Router.default must be "provider,model" format, but got "${routerDefault}" (missing model).`,
|
|
260
|
+
suggestedFix,
|
|
261
|
+
suggestion: `Edit ${CCR_CONFIG_PATH} and change Router.default from "${routerDefault}" to "${example}", then restart CCR.`,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// Validate the model part is not empty after splitting
|
|
265
|
+
const [providerPart, modelPart] = routerDefault.split(',', 2);
|
|
266
|
+
if (!(providerPart === null || providerPart === void 0 ? void 0 : providerPart.trim()) || !(modelPart === null || modelPart === void 0 ? void 0 : modelPart.trim())) {
|
|
267
|
+
const suggestedFix = inferSuggestedRouterDefault((_c = providerPart === null || providerPart === void 0 ? void 0 : providerPart.trim()) !== null && _c !== void 0 ? _c : '', config, router);
|
|
268
|
+
return {
|
|
269
|
+
checked: true,
|
|
270
|
+
valid: false,
|
|
271
|
+
configPath: CCR_CONFIG_PATH,
|
|
272
|
+
routerDefault,
|
|
273
|
+
issue: `CCR Router.default "${routerDefault}" has empty provider or model part.`,
|
|
274
|
+
suggestedFix,
|
|
275
|
+
suggestion: `Edit ${CCR_CONFIG_PATH} and set Router.default to a valid "provider,model" format, then restart CCR.`,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
checked: true,
|
|
280
|
+
valid: true,
|
|
281
|
+
configPath: CCR_CONFIG_PATH,
|
|
282
|
+
routerDefault,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Try to infer a suggested Router.default value based on available providers and models.
|
|
287
|
+
*/
|
|
288
|
+
function inferSuggestedRouterDefault(providerName, config, router) {
|
|
289
|
+
var _a, _b, _c;
|
|
290
|
+
const normalizedProvider = providerName.toLowerCase();
|
|
291
|
+
if (!normalizedProvider)
|
|
292
|
+
return undefined;
|
|
293
|
+
// Try to find the provider in Providers array and get its first model
|
|
294
|
+
const providers = (_b = (_a = config.Providers) !== null && _a !== void 0 ? _a : config.providers) !== null && _b !== void 0 ? _b : [];
|
|
295
|
+
const matchedProvider = providers.find((p) => { var _a; return ((_a = p.name) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === normalizedProvider; });
|
|
296
|
+
if ((matchedProvider === null || matchedProvider === void 0 ? void 0 : matchedProvider.name) && ((_c = matchedProvider.models) === null || _c === void 0 ? void 0 : _c[0])) {
|
|
297
|
+
return `${matchedProvider.name},${matchedProvider.models[0]}`;
|
|
298
|
+
}
|
|
299
|
+
// Fallback: look at other Router entries that have valid "provider,model" format
|
|
300
|
+
const routerEntries = [router === null || router === void 0 ? void 0 : router.background, router === null || router === void 0 ? void 0 : router.think, router === null || router === void 0 ? void 0 : router.longContext];
|
|
301
|
+
for (const entry of routerEntries) {
|
|
302
|
+
if (!entry || !entry.includes(','))
|
|
303
|
+
continue;
|
|
304
|
+
const [p, m] = entry.split(',', 2);
|
|
305
|
+
if ((p === null || p === void 0 ? void 0 : p.trim().toLowerCase()) === normalizedProvider && (m === null || m === void 0 ? void 0 : m.trim())) {
|
|
306
|
+
return `${providerName},${m.trim()}`;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return undefined;
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=ccr-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ccr-detector.js","sourceRoot":"","sources":["../../src/agent/ccr-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AgentActRequest } from './types';
|
|
2
|
+
import type { AgentEngine, EngineName, RunningExecution } from './engines/types';
|
|
3
|
+
import { AgentStreamManager } from './stream-manager';
|
|
4
|
+
export interface AgentChatServiceOptions {
|
|
5
|
+
engines: AgentEngine[];
|
|
6
|
+
streamManager: AgentStreamManager;
|
|
7
|
+
defaultEngineName?: EngineName;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* AgentChatService coordinates incoming /agent/chat requests and delegates to engines.
|
|
11
|
+
*
|
|
12
|
+
* 中文说明:该服务负责会话级调度,不关心具体 CLI/SDK 实现细节。
|
|
13
|
+
* 通过 Engine 接口实现依赖倒置,后续替换或新增引擎时无需修改 HTTP 路由层。
|
|
14
|
+
*/
|
|
15
|
+
export declare class AgentChatService {
|
|
16
|
+
private readonly engines;
|
|
17
|
+
private readonly streamManager;
|
|
18
|
+
private readonly defaultEngineName;
|
|
19
|
+
/**
|
|
20
|
+
* Registry of currently running executions, keyed by requestId.
|
|
21
|
+
*/
|
|
22
|
+
private readonly runningExecutions;
|
|
23
|
+
constructor(options: AgentChatServiceOptions);
|
|
24
|
+
handleAct(sessionId: string, payload: AgentActRequest): Promise<{
|
|
25
|
+
requestId: string;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Cancel a running execution by requestId.
|
|
29
|
+
* Returns true if the execution was found and cancelled, false otherwise.
|
|
30
|
+
*/
|
|
31
|
+
cancelExecution(requestId: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Cancel all running executions for a session.
|
|
34
|
+
* Returns the number of executions cancelled.
|
|
35
|
+
*/
|
|
36
|
+
cancelSessionExecutions(sessionId: string): number;
|
|
37
|
+
/**
|
|
38
|
+
* Get list of running executions for diagnostics.
|
|
39
|
+
*/
|
|
40
|
+
getRunningExecutions(): RunningExecution[];
|
|
41
|
+
private resolveEngineName;
|
|
42
|
+
private runEngine;
|
|
43
|
+
/**
|
|
44
|
+
* Expose registered engines for UI and diagnostics.
|
|
45
|
+
*/
|
|
46
|
+
getEngineInfos(): Array<{
|
|
47
|
+
name: EngineName;
|
|
48
|
+
supportsMcp?: boolean;
|
|
49
|
+
}>;
|
|
50
|
+
}
|