@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.
Files changed (129) hide show
  1. package/README.md +183 -0
  2. package/dist/README.md +25 -0
  3. package/dist/agent/attachment-service.d.ts +83 -0
  4. package/dist/agent/attachment-service.js +370 -0
  5. package/dist/agent/attachment-service.js.map +1 -0
  6. package/dist/agent/ccr-detector.d.ts +59 -0
  7. package/dist/agent/ccr-detector.js +311 -0
  8. package/dist/agent/ccr-detector.js.map +1 -0
  9. package/dist/agent/chat-service.d.ts +50 -0
  10. package/dist/agent/chat-service.js +439 -0
  11. package/dist/agent/chat-service.js.map +1 -0
  12. package/dist/agent/db/client.d.ts +26 -0
  13. package/dist/agent/db/client.js +244 -0
  14. package/dist/agent/db/client.js.map +1 -0
  15. package/dist/agent/db/index.d.ts +5 -0
  16. package/dist/agent/db/index.js +22 -0
  17. package/dist/agent/db/index.js.map +1 -0
  18. package/dist/agent/db/schema.d.ts +711 -0
  19. package/dist/agent/db/schema.js +121 -0
  20. package/dist/agent/db/schema.js.map +1 -0
  21. package/dist/agent/directory-picker.d.ts +11 -0
  22. package/dist/agent/directory-picker.js +149 -0
  23. package/dist/agent/directory-picker.js.map +1 -0
  24. package/dist/agent/engines/claude.d.ts +79 -0
  25. package/dist/agent/engines/claude.js +1338 -0
  26. package/dist/agent/engines/claude.js.map +1 -0
  27. package/dist/agent/engines/codex.d.ts +48 -0
  28. package/dist/agent/engines/codex.js +822 -0
  29. package/dist/agent/engines/codex.js.map +1 -0
  30. package/dist/agent/engines/types.d.ts +133 -0
  31. package/dist/agent/engines/types.js +3 -0
  32. package/dist/agent/engines/types.js.map +1 -0
  33. package/dist/agent/message-service.d.ts +56 -0
  34. package/dist/agent/message-service.js +198 -0
  35. package/dist/agent/message-service.js.map +1 -0
  36. package/dist/agent/open-project.d.ts +25 -0
  37. package/dist/agent/open-project.js +469 -0
  38. package/dist/agent/open-project.js.map +1 -0
  39. package/dist/agent/project-service.d.ts +49 -0
  40. package/dist/agent/project-service.js +254 -0
  41. package/dist/agent/project-service.js.map +1 -0
  42. package/dist/agent/project-types.d.ts +27 -0
  43. package/dist/agent/project-types.js +3 -0
  44. package/dist/agent/project-types.js.map +1 -0
  45. package/dist/agent/session-service.d.ts +198 -0
  46. package/dist/agent/session-service.js +292 -0
  47. package/dist/agent/session-service.js.map +1 -0
  48. package/dist/agent/storage.d.ts +27 -0
  49. package/dist/agent/storage.js +73 -0
  50. package/dist/agent/storage.js.map +1 -0
  51. package/dist/agent/stream-manager.d.ts +42 -0
  52. package/dist/agent/stream-manager.js +243 -0
  53. package/dist/agent/stream-manager.js.map +1 -0
  54. package/dist/agent/tool-bridge.d.ts +44 -0
  55. package/dist/agent/tool-bridge.js +50 -0
  56. package/dist/agent/tool-bridge.js.map +1 -0
  57. package/dist/agent/types.d.ts +6 -0
  58. package/dist/agent/types.js +3 -0
  59. package/dist/agent/types.js.map +1 -0
  60. package/dist/cli.d.ts +2 -0
  61. package/dist/cli.js +224 -0
  62. package/dist/cli.js.map +1 -0
  63. package/dist/constant/index.d.ts +60 -0
  64. package/dist/constant/index.js +80 -0
  65. package/dist/constant/index.js.map +1 -0
  66. package/dist/file-handler.d.ts +41 -0
  67. package/dist/file-handler.js +295 -0
  68. package/dist/file-handler.js.map +1 -0
  69. package/dist/index.d.ts +2 -0
  70. package/dist/index.js +35 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/mcp/mcp-server-stdio.d.ts +72 -0
  73. package/dist/mcp/mcp-server-stdio.js +143 -0
  74. package/dist/mcp/mcp-server-stdio.js.map +1 -0
  75. package/dist/mcp/mcp-server.d.ts +36 -0
  76. package/dist/mcp/mcp-server.js +26 -0
  77. package/dist/mcp/mcp-server.js.map +1 -0
  78. package/dist/mcp/register-tools.d.ts +2 -0
  79. package/dist/mcp/register-tools.js +148 -0
  80. package/dist/mcp/register-tools.js.map +1 -0
  81. package/dist/mcp/stdio-config.json +3 -0
  82. package/dist/native-messaging-host.d.ts +42 -0
  83. package/dist/native-messaging-host.js +312 -0
  84. package/dist/native-messaging-host.js.map +1 -0
  85. package/dist/run_host.bat +194 -0
  86. package/dist/run_host.sh +264 -0
  87. package/dist/scripts/browser-config.d.ts +28 -0
  88. package/dist/scripts/browser-config.js +229 -0
  89. package/dist/scripts/browser-config.js.map +1 -0
  90. package/dist/scripts/build.d.ts +1 -0
  91. package/dist/scripts/build.js +126 -0
  92. package/dist/scripts/build.js.map +1 -0
  93. package/dist/scripts/constant.d.ts +4 -0
  94. package/dist/scripts/constant.js +8 -0
  95. package/dist/scripts/constant.js.map +1 -0
  96. package/dist/scripts/doctor.d.ts +70 -0
  97. package/dist/scripts/doctor.js +930 -0
  98. package/dist/scripts/doctor.js.map +1 -0
  99. package/dist/scripts/postinstall.d.ts +2 -0
  100. package/dist/scripts/postinstall.js +246 -0
  101. package/dist/scripts/postinstall.js.map +1 -0
  102. package/dist/scripts/register-dev.d.ts +1 -0
  103. package/dist/scripts/register-dev.js +5 -0
  104. package/dist/scripts/register-dev.js.map +1 -0
  105. package/dist/scripts/register.d.ts +2 -0
  106. package/dist/scripts/register.js +28 -0
  107. package/dist/scripts/register.js.map +1 -0
  108. package/dist/scripts/report.d.ts +96 -0
  109. package/dist/scripts/report.js +686 -0
  110. package/dist/scripts/report.js.map +1 -0
  111. package/dist/scripts/utils.d.ts +64 -0
  112. package/dist/scripts/utils.js +443 -0
  113. package/dist/scripts/utils.js.map +1 -0
  114. package/dist/server/index.d.ts +35 -0
  115. package/dist/server/index.js +312 -0
  116. package/dist/server/index.js.map +1 -0
  117. package/dist/server/routes/agent.d.ts +21 -0
  118. package/dist/server/routes/agent.js +971 -0
  119. package/dist/server/routes/agent.js.map +1 -0
  120. package/dist/server/routes/index.d.ts +4 -0
  121. package/dist/server/routes/index.js +9 -0
  122. package/dist/server/routes/index.js.map +1 -0
  123. package/dist/trace-analyzer.d.ts +14 -0
  124. package/dist/trace-analyzer.js +113 -0
  125. package/dist/trace-analyzer.js.map +1 -0
  126. package/dist/util/logger.d.ts +1 -0
  127. package/dist/util/logger.js +43 -0
  128. package/dist/util/logger.js.map +1 -0
  129. 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 {};