@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,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.messages = exports.sessions = exports.projects = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Drizzle ORM Schema for Agent Storage.
|
|
6
|
+
*
|
|
7
|
+
* Design principles:
|
|
8
|
+
* - Type-safe database access
|
|
9
|
+
* - Consistent with shared types (AgentProject, AgentStoredMessage)
|
|
10
|
+
* - Proper indexes for common query patterns
|
|
11
|
+
* - Foreign key constraints with cascade delete
|
|
12
|
+
*/
|
|
13
|
+
const sqlite_core_1 = require("drizzle-orm/sqlite-core");
|
|
14
|
+
// ============================================================
|
|
15
|
+
// Projects Table
|
|
16
|
+
// ============================================================
|
|
17
|
+
exports.projects = (0, sqlite_core_1.sqliteTable)('projects', {
|
|
18
|
+
id: (0, sqlite_core_1.text)().primaryKey(),
|
|
19
|
+
name: (0, sqlite_core_1.text)().notNull(),
|
|
20
|
+
description: (0, sqlite_core_1.text)(),
|
|
21
|
+
rootPath: (0, sqlite_core_1.text)('root_path').notNull(),
|
|
22
|
+
preferredCli: (0, sqlite_core_1.text)('preferred_cli'),
|
|
23
|
+
selectedModel: (0, sqlite_core_1.text)('selected_model'),
|
|
24
|
+
/**
|
|
25
|
+
* Active Claude session ID (UUID format) for session resumption.
|
|
26
|
+
* Captured from SDK's system/init message.
|
|
27
|
+
*/
|
|
28
|
+
activeClaudeSessionId: (0, sqlite_core_1.text)('active_claude_session_id'),
|
|
29
|
+
/**
|
|
30
|
+
* Whether to use Claude Code Router (CCR) for this project.
|
|
31
|
+
* Stored as '1' (true) or '0'/null (false).
|
|
32
|
+
*/
|
|
33
|
+
useCcr: (0, sqlite_core_1.text)('use_ccr'),
|
|
34
|
+
/**
|
|
35
|
+
* Whether to enable the local Chrome MCP server integration for this project.
|
|
36
|
+
* Stored as '1' (true) or '0' (false). Default: '1' (enabled).
|
|
37
|
+
*/
|
|
38
|
+
enableChromeMcp: (0, sqlite_core_1.text)('enable_chrome_mcp').notNull().default('1'),
|
|
39
|
+
createdAt: (0, sqlite_core_1.text)('created_at').notNull(),
|
|
40
|
+
updatedAt: (0, sqlite_core_1.text)('updated_at').notNull(),
|
|
41
|
+
lastActiveAt: (0, sqlite_core_1.text)('last_active_at'),
|
|
42
|
+
}, (table) => ({
|
|
43
|
+
lastActiveIdx: (0, sqlite_core_1.index)('projects_last_active_idx').on(table.lastActiveAt),
|
|
44
|
+
}));
|
|
45
|
+
// ============================================================
|
|
46
|
+
// Sessions Table
|
|
47
|
+
// ============================================================
|
|
48
|
+
exports.sessions = (0, sqlite_core_1.sqliteTable)('sessions', {
|
|
49
|
+
id: (0, sqlite_core_1.text)().primaryKey(),
|
|
50
|
+
projectId: (0, sqlite_core_1.text)('project_id')
|
|
51
|
+
.notNull()
|
|
52
|
+
.references(() => exports.projects.id, { onDelete: 'cascade' }),
|
|
53
|
+
/**
|
|
54
|
+
* Engine name: claude, codex, cursor, qwen, glm, etc.
|
|
55
|
+
*/
|
|
56
|
+
engineName: (0, sqlite_core_1.text)('engine_name').notNull(),
|
|
57
|
+
/**
|
|
58
|
+
* Engine-specific session ID for resumption.
|
|
59
|
+
* For Claude: SDK's session_id from system:init message.
|
|
60
|
+
*/
|
|
61
|
+
engineSessionId: (0, sqlite_core_1.text)('engine_session_id'),
|
|
62
|
+
/**
|
|
63
|
+
* User-defined session name for display.
|
|
64
|
+
*/
|
|
65
|
+
name: (0, sqlite_core_1.text)(),
|
|
66
|
+
/**
|
|
67
|
+
* Model override for this session.
|
|
68
|
+
*/
|
|
69
|
+
model: (0, sqlite_core_1.text)(),
|
|
70
|
+
/**
|
|
71
|
+
* Permission mode: default, acceptEdits, bypassPermissions, plan, dontAsk.
|
|
72
|
+
*/
|
|
73
|
+
permissionMode: (0, sqlite_core_1.text)('permission_mode').notNull().default('bypassPermissions'),
|
|
74
|
+
/**
|
|
75
|
+
* Whether to allow bypassing interactive permission prompts.
|
|
76
|
+
* Stored as '1' (true) or null (false).
|
|
77
|
+
*/
|
|
78
|
+
allowDangerouslySkipPermissions: (0, sqlite_core_1.text)('allow_dangerously_skip_permissions'),
|
|
79
|
+
/**
|
|
80
|
+
* JSON: System prompt configuration.
|
|
81
|
+
* Format: { type: 'custom', text: string } | { type: 'preset', preset: 'claude_code', append?: string }
|
|
82
|
+
*/
|
|
83
|
+
systemPromptConfig: (0, sqlite_core_1.text)('system_prompt_config'),
|
|
84
|
+
/**
|
|
85
|
+
* JSON: Engine/session option overrides (settingSources, tools, betas, etc.).
|
|
86
|
+
*/
|
|
87
|
+
optionsConfig: (0, sqlite_core_1.text)('options_config'),
|
|
88
|
+
/**
|
|
89
|
+
* JSON: Cached management info (supported models, commands, account, MCP servers, etc.).
|
|
90
|
+
*/
|
|
91
|
+
managementInfo: (0, sqlite_core_1.text)('management_info'),
|
|
92
|
+
createdAt: (0, sqlite_core_1.text)('created_at').notNull(),
|
|
93
|
+
updatedAt: (0, sqlite_core_1.text)('updated_at').notNull(),
|
|
94
|
+
}, (table) => ({
|
|
95
|
+
projectIdIdx: (0, sqlite_core_1.index)('sessions_project_id_idx').on(table.projectId),
|
|
96
|
+
engineNameIdx: (0, sqlite_core_1.index)('sessions_engine_name_idx').on(table.engineName),
|
|
97
|
+
}));
|
|
98
|
+
// ============================================================
|
|
99
|
+
// Messages Table
|
|
100
|
+
// ============================================================
|
|
101
|
+
exports.messages = (0, sqlite_core_1.sqliteTable)('messages', {
|
|
102
|
+
id: (0, sqlite_core_1.text)().primaryKey(),
|
|
103
|
+
projectId: (0, sqlite_core_1.text)('project_id')
|
|
104
|
+
.notNull()
|
|
105
|
+
.references(() => exports.projects.id, { onDelete: 'cascade' }),
|
|
106
|
+
sessionId: (0, sqlite_core_1.text)('session_id').notNull(),
|
|
107
|
+
conversationId: (0, sqlite_core_1.text)('conversation_id'),
|
|
108
|
+
role: (0, sqlite_core_1.text)().notNull(), // 'user' | 'assistant' | 'tool' | 'system'
|
|
109
|
+
content: (0, sqlite_core_1.text)().notNull(),
|
|
110
|
+
messageType: (0, sqlite_core_1.text)('message_type').notNull(), // 'chat' | 'tool_use' | 'tool_result' | 'status'
|
|
111
|
+
metadata: (0, sqlite_core_1.text)(), // JSON string
|
|
112
|
+
cliSource: (0, sqlite_core_1.text)('cli_source'),
|
|
113
|
+
requestId: (0, sqlite_core_1.text)('request_id'),
|
|
114
|
+
createdAt: (0, sqlite_core_1.text)('created_at').notNull(),
|
|
115
|
+
}, (table) => ({
|
|
116
|
+
projectIdIdx: (0, sqlite_core_1.index)('messages_project_id_idx').on(table.projectId),
|
|
117
|
+
sessionIdIdx: (0, sqlite_core_1.index)('messages_session_id_idx').on(table.sessionId),
|
|
118
|
+
createdAtIdx: (0, sqlite_core_1.index)('messages_created_at_idx').on(table.createdAt),
|
|
119
|
+
requestIdIdx: (0, sqlite_core_1.index)('messages_request_id_idx').on(table.requestId),
|
|
120
|
+
}));
|
|
121
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/agent/db/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface DirectoryPickerResult {
|
|
2
|
+
success: boolean;
|
|
3
|
+
path?: string;
|
|
4
|
+
cancelled?: boolean;
|
|
5
|
+
error?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Open a native directory picker dialog.
|
|
9
|
+
* Returns the selected directory path or indicates cancellation.
|
|
10
|
+
*/
|
|
11
|
+
export declare function openDirectoryPicker(title?: string): Promise<DirectoryPickerResult>;
|
|
@@ -0,0 +1,149 @@
|
|
|
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.openDirectoryPicker = openDirectoryPicker;
|
|
7
|
+
/**
|
|
8
|
+
* Directory Picker Service.
|
|
9
|
+
*
|
|
10
|
+
* Provides cross-platform directory selection using native system dialogs.
|
|
11
|
+
* Uses platform-specific commands:
|
|
12
|
+
* - macOS: osascript (AppleScript)
|
|
13
|
+
* - Windows: PowerShell
|
|
14
|
+
* - Linux: zenity or kdialog
|
|
15
|
+
*/
|
|
16
|
+
const node_child_process_1 = require("node:child_process");
|
|
17
|
+
const node_util_1 = require("node:util");
|
|
18
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
19
|
+
const execAsync = (0, node_util_1.promisify)(node_child_process_1.exec);
|
|
20
|
+
/**
|
|
21
|
+
* Open a native directory picker dialog.
|
|
22
|
+
* Returns the selected directory path or indicates cancellation.
|
|
23
|
+
*/
|
|
24
|
+
async function openDirectoryPicker(title = 'Select Project Directory') {
|
|
25
|
+
const platform = node_os_1.default.platform();
|
|
26
|
+
try {
|
|
27
|
+
switch (platform) {
|
|
28
|
+
case 'darwin':
|
|
29
|
+
return await openMacOSPicker(title);
|
|
30
|
+
case 'win32':
|
|
31
|
+
return await openWindowsPicker(title);
|
|
32
|
+
case 'linux':
|
|
33
|
+
return await openLinuxPicker(title);
|
|
34
|
+
default:
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
error: `Unsupported platform: ${platform}`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return {
|
|
43
|
+
success: false,
|
|
44
|
+
error: error instanceof Error ? error.message : String(error),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* macOS: Use osascript to open Finder folder picker.
|
|
50
|
+
*/
|
|
51
|
+
async function openMacOSPicker(title) {
|
|
52
|
+
const script = `
|
|
53
|
+
set selectedFolder to choose folder with prompt "${title}"
|
|
54
|
+
return POSIX path of selectedFolder
|
|
55
|
+
`;
|
|
56
|
+
try {
|
|
57
|
+
const { stdout } = await execAsync(`osascript -e '${script}'`);
|
|
58
|
+
const path = stdout.trim();
|
|
59
|
+
if (path) {
|
|
60
|
+
return { success: true, path };
|
|
61
|
+
}
|
|
62
|
+
return { success: false, cancelled: true };
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
// User cancelled returns error code 1
|
|
66
|
+
const err = error;
|
|
67
|
+
if (err.code === 1) {
|
|
68
|
+
return { success: false, cancelled: true };
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Windows: Use PowerShell to open folder browser dialog.
|
|
75
|
+
*/
|
|
76
|
+
async function openWindowsPicker(title) {
|
|
77
|
+
const psScript = `
|
|
78
|
+
Add-Type -AssemblyName System.Windows.Forms
|
|
79
|
+
$dialog = New-Object System.Windows.Forms.FolderBrowserDialog
|
|
80
|
+
$dialog.Description = "${title}"
|
|
81
|
+
$dialog.ShowNewFolderButton = $true
|
|
82
|
+
$result = $dialog.ShowDialog()
|
|
83
|
+
if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
|
|
84
|
+
Write-Output $dialog.SelectedPath
|
|
85
|
+
}
|
|
86
|
+
`;
|
|
87
|
+
// Escape for command line
|
|
88
|
+
const escapedScript = psScript.replace(/"/g, '\\"').replace(/\n/g, ' ');
|
|
89
|
+
try {
|
|
90
|
+
const { stdout } = await execAsync(`powershell -NoProfile -Command "${escapedScript}"`, { timeout: 60000 });
|
|
91
|
+
const path = stdout.trim();
|
|
92
|
+
if (path) {
|
|
93
|
+
return { success: true, path };
|
|
94
|
+
}
|
|
95
|
+
return { success: false, cancelled: true };
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const err = error;
|
|
99
|
+
if (err.killed) {
|
|
100
|
+
return { success: false, error: 'Dialog timed out' };
|
|
101
|
+
}
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Linux: Try zenity first, then kdialog as fallback.
|
|
107
|
+
*/
|
|
108
|
+
async function openLinuxPicker(title) {
|
|
109
|
+
// Try zenity first (GTK)
|
|
110
|
+
try {
|
|
111
|
+
const { stdout } = await execAsync(`zenity --file-selection --directory --title="${title}"`, {
|
|
112
|
+
timeout: 60000,
|
|
113
|
+
});
|
|
114
|
+
const path = stdout.trim();
|
|
115
|
+
if (path) {
|
|
116
|
+
return { success: true, path };
|
|
117
|
+
}
|
|
118
|
+
return { success: false, cancelled: true };
|
|
119
|
+
}
|
|
120
|
+
catch (zenityError) {
|
|
121
|
+
// zenity returns exit code 1 on cancel, 5 if not installed
|
|
122
|
+
const err = zenityError;
|
|
123
|
+
if (err.code === 1) {
|
|
124
|
+
return { success: false, cancelled: true };
|
|
125
|
+
}
|
|
126
|
+
// Try kdialog as fallback (KDE)
|
|
127
|
+
try {
|
|
128
|
+
const { stdout } = await execAsync(`kdialog --getexistingdirectory ~ --title "${title}"`, {
|
|
129
|
+
timeout: 60000,
|
|
130
|
+
});
|
|
131
|
+
const path = stdout.trim();
|
|
132
|
+
if (path) {
|
|
133
|
+
return { success: true, path };
|
|
134
|
+
}
|
|
135
|
+
return { success: false, cancelled: true };
|
|
136
|
+
}
|
|
137
|
+
catch (kdialogError) {
|
|
138
|
+
const kdErr = kdialogError;
|
|
139
|
+
if (kdErr.code === 1) {
|
|
140
|
+
return { success: false, cancelled: true };
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
error: 'No directory picker available. Please install zenity or kdialog.',
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=directory-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-picker.js","sourceRoot":"","sources":["../../src/agent/directory-picker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { AgentEngine, EngineExecutionContext, EngineInitOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* ClaudeEngine integrates the Claude Agent SDK as an AgentEngine implementation.
|
|
4
|
+
*
|
|
5
|
+
* This engine uses the @anthropic-ai/claude-agent-sdk to interact with Claude,
|
|
6
|
+
* streaming events back to the sidepanel UI via RealtimeEvent envelopes.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ClaudeEngine implements AgentEngine {
|
|
9
|
+
readonly name: "claude";
|
|
10
|
+
readonly supportsMcp = true;
|
|
11
|
+
/**
|
|
12
|
+
* Maximum number of stderr lines to keep in memory.
|
|
13
|
+
*/
|
|
14
|
+
private static readonly MAX_STDERR_LINES;
|
|
15
|
+
initializeAndRun(options: EngineInitOptions, ctx: EngineExecutionContext): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Build environment variables for Claude Code.
|
|
18
|
+
* Supports Claude Code Router (CCR) when useCcr is true:
|
|
19
|
+
* 1. Auto-detecting CCR from config file (~/.claude-code-router/config.json)
|
|
20
|
+
* 2. Passing through env vars if already set (via `eval "$(ccr activate)"`)
|
|
21
|
+
*
|
|
22
|
+
* SDK treats options.env as a complete replacement (not merged with process.env),
|
|
23
|
+
* so we must explicitly include all necessary variables.
|
|
24
|
+
*
|
|
25
|
+
* @param useCcr - Whether CCR is enabled for this project. When false/undefined, CCR detection is skipped.
|
|
26
|
+
*/
|
|
27
|
+
private buildClaudeEnv;
|
|
28
|
+
/**
|
|
29
|
+
* Resolve project root path.
|
|
30
|
+
*/
|
|
31
|
+
private resolveRepoPath;
|
|
32
|
+
/**
|
|
33
|
+
* Pick first string value from unknown input.
|
|
34
|
+
*/
|
|
35
|
+
private pickFirstString;
|
|
36
|
+
/**
|
|
37
|
+
* Extract content from SDK message.
|
|
38
|
+
* Handles various message structures from Claude Agent SDK:
|
|
39
|
+
* - result.result (final result text)
|
|
40
|
+
* - assistant.message (nested message content)
|
|
41
|
+
* - content/text (direct content fields)
|
|
42
|
+
* - content[] (array of content blocks)
|
|
43
|
+
*
|
|
44
|
+
* @param message - The message object to extract content from
|
|
45
|
+
* @param depth - Current recursion depth (max 3 to prevent infinite loops)
|
|
46
|
+
*/
|
|
47
|
+
private extractMessageContent;
|
|
48
|
+
/**
|
|
49
|
+
* Format error message for user display.
|
|
50
|
+
* Preserves the original error message and only appends stderr context if useful.
|
|
51
|
+
*/
|
|
52
|
+
private classifyError;
|
|
53
|
+
/**
|
|
54
|
+
* Validate CCR configuration and emit a warning message if issues are found.
|
|
55
|
+
* This is a best-effort check to provide actionable guidance before CCR crashes.
|
|
56
|
+
*/
|
|
57
|
+
private validateAndWarnCcrConfig;
|
|
58
|
+
/**
|
|
59
|
+
* Enhance error messages for CCR-related errors.
|
|
60
|
+
* Detects the common "includes of undefined" crash and provides actionable guidance.
|
|
61
|
+
*/
|
|
62
|
+
private enhanceCcrErrorMessage;
|
|
63
|
+
/**
|
|
64
|
+
* Build metadata for tool result events.
|
|
65
|
+
*/
|
|
66
|
+
private buildToolResultMetadata;
|
|
67
|
+
/**
|
|
68
|
+
* Extract content from a tool_result block.
|
|
69
|
+
*/
|
|
70
|
+
private extractToolResultContent;
|
|
71
|
+
/**
|
|
72
|
+
* Encode string to base64 for hashing.
|
|
73
|
+
*/
|
|
74
|
+
private encodeHash;
|
|
75
|
+
/**
|
|
76
|
+
* Write an attachment to a temporary file and return its path.
|
|
77
|
+
*/
|
|
78
|
+
private writeAttachmentToTemp;
|
|
79
|
+
}
|