@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,292 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSession = createSession;
|
|
4
|
+
exports.getSession = getSession;
|
|
5
|
+
exports.getSessionsByProject = getSessionsByProject;
|
|
6
|
+
exports.getAllSessions = getAllSessions;
|
|
7
|
+
exports.getSessionsByProjectAndEngine = getSessionsByProjectAndEngine;
|
|
8
|
+
exports.updateSession = updateSession;
|
|
9
|
+
exports.deleteSession = deleteSession;
|
|
10
|
+
exports.updateEngineSessionId = updateEngineSessionId;
|
|
11
|
+
exports.touchSessionActivity = touchSessionActivity;
|
|
12
|
+
exports.updateManagementInfo = updateManagementInfo;
|
|
13
|
+
exports.getOrCreateDefaultSession = getOrCreateDefaultSession;
|
|
14
|
+
/**
|
|
15
|
+
* Session Service - Database-backed implementation using Drizzle ORM.
|
|
16
|
+
*
|
|
17
|
+
* Provides CRUD operations for agent sessions with:
|
|
18
|
+
* - Type-safe database queries
|
|
19
|
+
* - Engine-agnostic session configuration storage
|
|
20
|
+
* - JSON config and management info caching
|
|
21
|
+
*/
|
|
22
|
+
const node_crypto_1 = require("node:crypto");
|
|
23
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
24
|
+
const db_1 = require("./db");
|
|
25
|
+
// ============================================================
|
|
26
|
+
// JSON Parsing Utilities
|
|
27
|
+
// ============================================================
|
|
28
|
+
function parseJson(value) {
|
|
29
|
+
if (!value)
|
|
30
|
+
return undefined;
|
|
31
|
+
try {
|
|
32
|
+
return JSON.parse(value);
|
|
33
|
+
}
|
|
34
|
+
catch (_a) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function stringifyJson(value) {
|
|
39
|
+
if (value === null || value === undefined)
|
|
40
|
+
return null;
|
|
41
|
+
return JSON.stringify(value);
|
|
42
|
+
}
|
|
43
|
+
// ============================================================
|
|
44
|
+
// Type Conversion
|
|
45
|
+
// ============================================================
|
|
46
|
+
function rowToSession(row) {
|
|
47
|
+
var _a, _b, _c;
|
|
48
|
+
return {
|
|
49
|
+
id: row.id,
|
|
50
|
+
projectId: row.projectId,
|
|
51
|
+
engineName: row.engineName,
|
|
52
|
+
engineSessionId: (_a = row.engineSessionId) !== null && _a !== void 0 ? _a : undefined,
|
|
53
|
+
name: (_b = row.name) !== null && _b !== void 0 ? _b : undefined,
|
|
54
|
+
model: (_c = row.model) !== null && _c !== void 0 ? _c : undefined,
|
|
55
|
+
permissionMode: row.permissionMode,
|
|
56
|
+
allowDangerouslySkipPermissions: row.allowDangerouslySkipPermissions === '1',
|
|
57
|
+
systemPromptConfig: parseJson(row.systemPromptConfig),
|
|
58
|
+
optionsConfig: parseJson(row.optionsConfig),
|
|
59
|
+
managementInfo: parseJson(row.managementInfo),
|
|
60
|
+
createdAt: row.createdAt,
|
|
61
|
+
updatedAt: row.updatedAt,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// ============================================================
|
|
65
|
+
// Public API
|
|
66
|
+
// ============================================================
|
|
67
|
+
/**
|
|
68
|
+
* Create a new session for a project.
|
|
69
|
+
*/
|
|
70
|
+
async function createSession(projectId, engineName, options = {}) {
|
|
71
|
+
var _a, _b, _c, _d, _e;
|
|
72
|
+
const db = (0, db_1.getDb)();
|
|
73
|
+
const now = new Date().toISOString();
|
|
74
|
+
// Resolve permission mode - AgentChat defaults to bypassPermissions for headless operation
|
|
75
|
+
const resolvedPermissionMode = ((_a = options.permissionMode) === null || _a === void 0 ? void 0 : _a.trim()) || 'bypassPermissions';
|
|
76
|
+
// SDK requires allowDangerouslySkipPermissions=true when using bypassPermissions mode
|
|
77
|
+
// If explicitly provided, use that value; otherwise infer from permission mode
|
|
78
|
+
const resolvedAllowDangerouslySkipPermissions = typeof options.allowDangerouslySkipPermissions === 'boolean'
|
|
79
|
+
? options.allowDangerouslySkipPermissions
|
|
80
|
+
: resolvedPermissionMode === 'bypassPermissions';
|
|
81
|
+
const sessionData = {
|
|
82
|
+
id: ((_b = options.id) === null || _b === void 0 ? void 0 : _b.trim()) || (0, node_crypto_1.randomUUID)(),
|
|
83
|
+
projectId,
|
|
84
|
+
engineName,
|
|
85
|
+
engineSessionId: ((_c = options.engineSessionId) === null || _c === void 0 ? void 0 : _c.trim()) || null,
|
|
86
|
+
name: ((_d = options.name) === null || _d === void 0 ? void 0 : _d.trim()) || null,
|
|
87
|
+
model: ((_e = options.model) === null || _e === void 0 ? void 0 : _e.trim()) || null,
|
|
88
|
+
permissionMode: resolvedPermissionMode,
|
|
89
|
+
allowDangerouslySkipPermissions: resolvedAllowDangerouslySkipPermissions ? '1' : null,
|
|
90
|
+
systemPromptConfig: stringifyJson(options.systemPromptConfig),
|
|
91
|
+
optionsConfig: stringifyJson(options.optionsConfig),
|
|
92
|
+
managementInfo: null,
|
|
93
|
+
createdAt: now,
|
|
94
|
+
updatedAt: now,
|
|
95
|
+
};
|
|
96
|
+
await db.insert(db_1.sessions).values(sessionData);
|
|
97
|
+
return rowToSession(sessionData);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Get a session by ID.
|
|
101
|
+
*/
|
|
102
|
+
async function getSession(sessionId) {
|
|
103
|
+
const db = (0, db_1.getDb)();
|
|
104
|
+
const rows = await db.select().from(db_1.sessions).where((0, drizzle_orm_1.eq)(db_1.sessions.id, sessionId)).limit(1);
|
|
105
|
+
return rows.length > 0 ? rowToSession(rows[0]) : undefined;
|
|
106
|
+
}
|
|
107
|
+
/** Maximum length for preview text */
|
|
108
|
+
const MAX_PREVIEW_LENGTH = 50;
|
|
109
|
+
/**
|
|
110
|
+
* Truncate text to max length with ellipsis.
|
|
111
|
+
*/
|
|
112
|
+
function truncatePreview(text, maxLength = MAX_PREVIEW_LENGTH) {
|
|
113
|
+
const trimmed = text.trim().replace(/\s+/g, ' ');
|
|
114
|
+
if (trimmed.length <= maxLength)
|
|
115
|
+
return trimmed;
|
|
116
|
+
return trimmed.slice(0, maxLength - 1) + '…';
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Add preview to sessions by fetching first user message for each.
|
|
120
|
+
* Shared helper to avoid code duplication.
|
|
121
|
+
*/
|
|
122
|
+
async function addPreviewsToSessions(rows) {
|
|
123
|
+
const db = (0, db_1.getDb)();
|
|
124
|
+
return Promise.all(rows.map(async (row) => {
|
|
125
|
+
const session = rowToSession(row);
|
|
126
|
+
// Query first user message for this session (include metadata for special rendering)
|
|
127
|
+
const firstUserMessages = await db
|
|
128
|
+
.select({ content: db_1.messages.content, metadata: db_1.messages.metadata })
|
|
129
|
+
.from(db_1.messages)
|
|
130
|
+
.where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(db_1.messages.sessionId, row.id), (0, drizzle_orm_1.eq)(db_1.messages.role, 'user')))
|
|
131
|
+
.orderBy((0, drizzle_orm_1.asc)(db_1.messages.createdAt))
|
|
132
|
+
.limit(1);
|
|
133
|
+
if (firstUserMessages.length > 0 && firstUserMessages[0].content) {
|
|
134
|
+
const content = firstUserMessages[0].content;
|
|
135
|
+
const metadataJson = firstUserMessages[0].metadata;
|
|
136
|
+
session.preview = truncatePreview(content);
|
|
137
|
+
// Parse metadata to extract clientMeta/displayText for special rendering
|
|
138
|
+
if (metadataJson) {
|
|
139
|
+
try {
|
|
140
|
+
const parsed = JSON.parse(metadataJson);
|
|
141
|
+
// Type-safe extraction with validation
|
|
142
|
+
const rawClientMeta = parsed.clientMeta;
|
|
143
|
+
const rawDisplayText = parsed.displayText;
|
|
144
|
+
// Validate displayText is a string
|
|
145
|
+
const displayText = typeof rawDisplayText === 'string' ? rawDisplayText : undefined;
|
|
146
|
+
// Validate clientMeta structure
|
|
147
|
+
const clientMeta = rawClientMeta &&
|
|
148
|
+
typeof rawClientMeta === 'object' &&
|
|
149
|
+
'kind' in rawClientMeta &&
|
|
150
|
+
(rawClientMeta.kind === 'web_editor_apply_batch' ||
|
|
151
|
+
rawClientMeta.kind === 'web_editor_apply_single')
|
|
152
|
+
? rawClientMeta
|
|
153
|
+
: undefined;
|
|
154
|
+
// Only set previewMeta if we have valid special metadata
|
|
155
|
+
if (clientMeta || displayText) {
|
|
156
|
+
session.previewMeta = {
|
|
157
|
+
displayText: displayText || truncatePreview(content),
|
|
158
|
+
clientMeta,
|
|
159
|
+
// Truncate fullContent to avoid payload bloat (200 chars max)
|
|
160
|
+
fullContent: truncatePreview(content, 200),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (_a) {
|
|
165
|
+
// Ignore JSON parse errors, just use plain preview
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return session;
|
|
170
|
+
}));
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get all sessions for a project, sorted by most recently updated.
|
|
174
|
+
* Includes preview from first user message for each session.
|
|
175
|
+
*/
|
|
176
|
+
async function getSessionsByProject(projectId) {
|
|
177
|
+
const db = (0, db_1.getDb)();
|
|
178
|
+
const rows = await db
|
|
179
|
+
.select()
|
|
180
|
+
.from(db_1.sessions)
|
|
181
|
+
.where((0, drizzle_orm_1.eq)(db_1.sessions.projectId, projectId))
|
|
182
|
+
.orderBy((0, drizzle_orm_1.desc)(db_1.sessions.updatedAt));
|
|
183
|
+
return addPreviewsToSessions(rows);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get all sessions across all projects, sorted by most recently updated.
|
|
187
|
+
* Includes preview from first user message for each session.
|
|
188
|
+
*/
|
|
189
|
+
async function getAllSessions() {
|
|
190
|
+
const db = (0, db_1.getDb)();
|
|
191
|
+
const rows = await db.select().from(db_1.sessions).orderBy((0, drizzle_orm_1.desc)(db_1.sessions.updatedAt));
|
|
192
|
+
return addPreviewsToSessions(rows);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get sessions for a project filtered by engine name.
|
|
196
|
+
*/
|
|
197
|
+
async function getSessionsByProjectAndEngine(projectId, engineName) {
|
|
198
|
+
const db = (0, db_1.getDb)();
|
|
199
|
+
const rows = await db
|
|
200
|
+
.select()
|
|
201
|
+
.from(db_1.sessions)
|
|
202
|
+
.where((0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(db_1.sessions.projectId, projectId), (0, drizzle_orm_1.eq)(db_1.sessions.engineName, engineName)))
|
|
203
|
+
.orderBy((0, drizzle_orm_1.desc)(db_1.sessions.updatedAt));
|
|
204
|
+
return rows.map(rowToSession);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Update an existing session.
|
|
208
|
+
*/
|
|
209
|
+
async function updateSession(sessionId, updates) {
|
|
210
|
+
var _a, _b, _c, _d;
|
|
211
|
+
const db = (0, db_1.getDb)();
|
|
212
|
+
const now = new Date().toISOString();
|
|
213
|
+
const updateData = {
|
|
214
|
+
updatedAt: now,
|
|
215
|
+
};
|
|
216
|
+
if (updates.engineSessionId !== undefined) {
|
|
217
|
+
updateData.engineSessionId = ((_a = updates.engineSessionId) === null || _a === void 0 ? void 0 : _a.trim()) || null;
|
|
218
|
+
}
|
|
219
|
+
if (updates.name !== undefined) {
|
|
220
|
+
updateData.name = ((_b = updates.name) === null || _b === void 0 ? void 0 : _b.trim()) || null;
|
|
221
|
+
}
|
|
222
|
+
if (updates.model !== undefined) {
|
|
223
|
+
updateData.model = ((_c = updates.model) === null || _c === void 0 ? void 0 : _c.trim()) || null;
|
|
224
|
+
}
|
|
225
|
+
if (updates.permissionMode !== undefined) {
|
|
226
|
+
updateData.permissionMode = ((_d = updates.permissionMode) === null || _d === void 0 ? void 0 : _d.trim()) || 'bypassPermissions';
|
|
227
|
+
}
|
|
228
|
+
if (updates.allowDangerouslySkipPermissions !== undefined) {
|
|
229
|
+
updateData.allowDangerouslySkipPermissions = updates.allowDangerouslySkipPermissions
|
|
230
|
+
? '1'
|
|
231
|
+
: null;
|
|
232
|
+
}
|
|
233
|
+
if (updates.systemPromptConfig !== undefined) {
|
|
234
|
+
updateData.systemPromptConfig = stringifyJson(updates.systemPromptConfig);
|
|
235
|
+
}
|
|
236
|
+
if (updates.optionsConfig !== undefined) {
|
|
237
|
+
updateData.optionsConfig = stringifyJson(updates.optionsConfig);
|
|
238
|
+
}
|
|
239
|
+
if (updates.managementInfo !== undefined) {
|
|
240
|
+
updateData.managementInfo = stringifyJson(updates.managementInfo);
|
|
241
|
+
}
|
|
242
|
+
await db.update(db_1.sessions).set(updateData).where((0, drizzle_orm_1.eq)(db_1.sessions.id, sessionId));
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Delete a session by ID.
|
|
246
|
+
* Note: Messages associated with this session are NOT automatically deleted.
|
|
247
|
+
* The caller should handle message cleanup if needed.
|
|
248
|
+
*/
|
|
249
|
+
async function deleteSession(sessionId) {
|
|
250
|
+
const db = (0, db_1.getDb)();
|
|
251
|
+
await db.delete(db_1.sessions).where((0, drizzle_orm_1.eq)(db_1.sessions.id, sessionId));
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Update the engine session ID (e.g., Claude SDK session_id).
|
|
255
|
+
*/
|
|
256
|
+
async function updateEngineSessionId(sessionId, engineSessionId) {
|
|
257
|
+
await updateSession(sessionId, { engineSessionId });
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Touch session activity - updates the updatedAt timestamp.
|
|
261
|
+
* Used when a message is sent to move the session to the top of the list.
|
|
262
|
+
*/
|
|
263
|
+
async function touchSessionActivity(sessionId) {
|
|
264
|
+
const db = (0, db_1.getDb)();
|
|
265
|
+
const now = new Date().toISOString();
|
|
266
|
+
await db.update(db_1.sessions).set({ updatedAt: now }).where((0, drizzle_orm_1.eq)(db_1.sessions.id, sessionId));
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Update the cached management information.
|
|
270
|
+
*/
|
|
271
|
+
async function updateManagementInfo(sessionId, info) {
|
|
272
|
+
// Add timestamp to management info
|
|
273
|
+
const infoWithTimestamp = info ? { ...info, lastUpdated: new Date().toISOString() } : null;
|
|
274
|
+
await updateSession(sessionId, { managementInfo: infoWithTimestamp });
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Get or create a default session for a project and engine.
|
|
278
|
+
* Useful for backwards compatibility - creates a session if none exists.
|
|
279
|
+
*/
|
|
280
|
+
async function getOrCreateDefaultSession(projectId, engineName, options = {}) {
|
|
281
|
+
const existingSessions = await getSessionsByProjectAndEngine(projectId, engineName);
|
|
282
|
+
if (existingSessions.length > 0) {
|
|
283
|
+
// Return the most recently updated session
|
|
284
|
+
return existingSessions[0];
|
|
285
|
+
}
|
|
286
|
+
// Create a new default session
|
|
287
|
+
return createSession(projectId, engineName, {
|
|
288
|
+
...options,
|
|
289
|
+
name: options.name || `Default ${engineName} session`,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=session-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-service.js","sourceRoot":"","sources":["../../src/agent/session-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve base data directory for agent state.
|
|
3
|
+
*
|
|
4
|
+
* Environment:
|
|
5
|
+
* - CHROME_MCP_AGENT_DATA_DIR: overrides the default base directory.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getAgentDataDir(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Resolve database file path.
|
|
10
|
+
*
|
|
11
|
+
* Environment:
|
|
12
|
+
* - CHROME_MCP_AGENT_DB_FILE: overrides the default database path.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getDatabasePath(): string;
|
|
15
|
+
/**
|
|
16
|
+
* Get the default workspace directory for agent projects.
|
|
17
|
+
* This is a subdirectory under the agent data directory.
|
|
18
|
+
*
|
|
19
|
+
* Cross-platform compatible:
|
|
20
|
+
* - Mac/Linux: ~/.chrome-mcp-agent/workspaces
|
|
21
|
+
* - Windows: %USERPROFILE%\.chrome-mcp-agent\workspaces
|
|
22
|
+
*/
|
|
23
|
+
export declare function getDefaultWorkspaceDir(): string;
|
|
24
|
+
/**
|
|
25
|
+
* Generate a default project root path for a given project name.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getDefaultProjectRoot(projectName: string): string;
|
|
@@ -0,0 +1,73 @@
|
|
|
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.getAgentDataDir = getAgentDataDir;
|
|
7
|
+
exports.getDatabasePath = getDatabasePath;
|
|
8
|
+
exports.getDefaultWorkspaceDir = getDefaultWorkspaceDir;
|
|
9
|
+
exports.getDefaultProjectRoot = getDefaultProjectRoot;
|
|
10
|
+
/**
|
|
11
|
+
* Storage path helpers for agent-related state.
|
|
12
|
+
*
|
|
13
|
+
* Provides unified path resolution for:
|
|
14
|
+
* - SQLite database file
|
|
15
|
+
* - Data directory
|
|
16
|
+
* - Default workspace directory
|
|
17
|
+
*
|
|
18
|
+
* All paths can be overridden via environment variables.
|
|
19
|
+
*/
|
|
20
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
21
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
22
|
+
const DEFAULT_DATA_DIR = node_path_1.default.join(node_os_1.default.homedir(), '.chrome-mcp-agent');
|
|
23
|
+
/**
|
|
24
|
+
* Resolve base data directory for agent state.
|
|
25
|
+
*
|
|
26
|
+
* Environment:
|
|
27
|
+
* - CHROME_MCP_AGENT_DATA_DIR: overrides the default base directory.
|
|
28
|
+
*/
|
|
29
|
+
function getAgentDataDir() {
|
|
30
|
+
const raw = process.env.CHROME_MCP_AGENT_DATA_DIR;
|
|
31
|
+
if (raw && raw.trim()) {
|
|
32
|
+
return node_path_1.default.resolve(raw.trim());
|
|
33
|
+
}
|
|
34
|
+
return DEFAULT_DATA_DIR;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve database file path.
|
|
38
|
+
*
|
|
39
|
+
* Environment:
|
|
40
|
+
* - CHROME_MCP_AGENT_DB_FILE: overrides the default database path.
|
|
41
|
+
*/
|
|
42
|
+
function getDatabasePath() {
|
|
43
|
+
const raw = process.env.CHROME_MCP_AGENT_DB_FILE;
|
|
44
|
+
if (raw && raw.trim()) {
|
|
45
|
+
return node_path_1.default.resolve(raw.trim());
|
|
46
|
+
}
|
|
47
|
+
return node_path_1.default.join(getAgentDataDir(), 'agent.db');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get the default workspace directory for agent projects.
|
|
51
|
+
* This is a subdirectory under the agent data directory.
|
|
52
|
+
*
|
|
53
|
+
* Cross-platform compatible:
|
|
54
|
+
* - Mac/Linux: ~/.chrome-mcp-agent/workspaces
|
|
55
|
+
* - Windows: %USERPROFILE%\.chrome-mcp-agent\workspaces
|
|
56
|
+
*/
|
|
57
|
+
function getDefaultWorkspaceDir() {
|
|
58
|
+
return node_path_1.default.join(getAgentDataDir(), 'workspaces');
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Generate a default project root path for a given project name.
|
|
62
|
+
*/
|
|
63
|
+
function getDefaultProjectRoot(projectName) {
|
|
64
|
+
// Sanitize project name for use as directory name
|
|
65
|
+
const safeName = projectName
|
|
66
|
+
.trim()
|
|
67
|
+
.toLowerCase()
|
|
68
|
+
.replace(/[^a-z0-9_-]/g, '-')
|
|
69
|
+
.replace(/-+/g, '-')
|
|
70
|
+
.replace(/^-|-$/g, '');
|
|
71
|
+
return node_path_1.default.join(getDefaultWorkspaceDir(), safeName || 'default-project');
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/agent/storage.ts"],"names":[],"mappings":";;;;;AAqBA,0CAMC;AAQD,0CAMC;AAUD,wDAEC;AAKD,sDASC;AAnED;;;;;;;;;GASG;AACH,sDAAyB;AACzB,0DAA6B;AAE7B,MAAM,gBAAgB,GAAG,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAEtE;;;;;GAKG;AACH,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAClD,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QACtB,OAAO,mBAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,eAAe;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IACjD,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QACtB,OAAO,mBAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,mBAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,sBAAsB;IACpC,OAAO,mBAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CAAC,WAAmB;IACvD,kDAAkD;IAClD,MAAM,QAAQ,GAAG,WAAW;SACzB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzB,OAAO,mBAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,IAAI,iBAAiB,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ServerResponse } from 'node:http';
|
|
2
|
+
import type { RealtimeEvent } from './types';
|
|
3
|
+
type WebSocketLike = {
|
|
4
|
+
readyState?: number;
|
|
5
|
+
send(data: string): void;
|
|
6
|
+
close?: () => void;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* AgentStreamManager manages SSE/WebSocket connections keyed by sessionId.
|
|
10
|
+
*
|
|
11
|
+
* 中文说明:此实现参考 other/cweb 中的 StreamManager,但适配 Fastify/Node HTTP,
|
|
12
|
+
* 使用 ServerResponse 直接写入 SSE 数据,避免在 Node 环境中额外引入 Web Streams 依赖。
|
|
13
|
+
*/
|
|
14
|
+
export declare class AgentStreamManager {
|
|
15
|
+
private readonly sseClients;
|
|
16
|
+
private readonly webSocketClients;
|
|
17
|
+
private heartbeatTimer;
|
|
18
|
+
addSseStream(sessionId: string, res: ServerResponse): void;
|
|
19
|
+
removeSseStream(sessionId: string, res: ServerResponse): void;
|
|
20
|
+
addWebSocket(sessionId: string, socket: WebSocketLike): void;
|
|
21
|
+
removeWebSocket(sessionId: string, socket: WebSocketLike): void;
|
|
22
|
+
publish(event: RealtimeEvent): void;
|
|
23
|
+
/**
|
|
24
|
+
* Extract sessionId from event based on event type.
|
|
25
|
+
*/
|
|
26
|
+
private extractSessionId;
|
|
27
|
+
/**
|
|
28
|
+
* Send event to a specific session's clients only.
|
|
29
|
+
*/
|
|
30
|
+
private sendToSession;
|
|
31
|
+
/**
|
|
32
|
+
* Broadcast event to all connected clients (used for heartbeat).
|
|
33
|
+
*/
|
|
34
|
+
private broadcastToAll;
|
|
35
|
+
private isResponseDead;
|
|
36
|
+
private isSocketDead;
|
|
37
|
+
closeAll(): void;
|
|
38
|
+
private ensureHeartbeatTimer;
|
|
39
|
+
private stopHeartbeatTimerIfIdle;
|
|
40
|
+
private stopHeartbeatTimer;
|
|
41
|
+
}
|
|
42
|
+
export {};
|