@ai-support-agent/cli 0.0.22 → 0.0.23-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/agent-transport.d.ts.map +1 -1
  2. package/dist/agent-transport.js +1 -0
  3. package/dist/agent-transport.js.map +1 -1
  4. package/dist/api-client.d.ts +2 -1
  5. package/dist/api-client.d.ts.map +1 -1
  6. package/dist/api-client.js +4 -0
  7. package/dist/api-client.js.map +1 -1
  8. package/dist/browser/browser-local-server.d.ts +54 -0
  9. package/dist/browser/browser-local-server.d.ts.map +1 -0
  10. package/dist/browser/browser-local-server.js +295 -0
  11. package/dist/browser/browser-local-server.js.map +1 -0
  12. package/dist/commands/chat-executor.d.ts +1 -0
  13. package/dist/commands/chat-executor.d.ts.map +1 -1
  14. package/dist/commands/chat-executor.js +5 -3
  15. package/dist/commands/chat-executor.js.map +1 -1
  16. package/dist/commands/claude-code-runner.d.ts +2 -0
  17. package/dist/commands/claude-code-runner.d.ts.map +1 -1
  18. package/dist/commands/claude-code-runner.js +4 -0
  19. package/dist/commands/claude-code-runner.js.map +1 -1
  20. package/dist/commands/index.d.ts +1 -0
  21. package/dist/commands/index.d.ts.map +1 -1
  22. package/dist/commands/index.js +1 -0
  23. package/dist/commands/index.js.map +1 -1
  24. package/dist/constants.d.ts +1 -0
  25. package/dist/constants.d.ts.map +1 -1
  26. package/dist/constants.js +1 -0
  27. package/dist/constants.js.map +1 -1
  28. package/dist/mcp/config-writer.d.ts +4 -0
  29. package/dist/mcp/config-writer.d.ts.map +1 -1
  30. package/dist/mcp/config-writer.js +5 -0
  31. package/dist/mcp/config-writer.js.map +1 -1
  32. package/dist/mcp/server.d.ts +2 -1
  33. package/dist/mcp/server.d.ts.map +1 -1
  34. package/dist/mcp/server.js +3 -1
  35. package/dist/mcp/server.js.map +1 -1
  36. package/dist/mcp/tools/browser/browser-action-log.d.ts +20 -0
  37. package/dist/mcp/tools/browser/browser-action-log.d.ts.map +1 -0
  38. package/dist/mcp/tools/browser/browser-action-log.js +46 -0
  39. package/dist/mcp/tools/browser/browser-action-log.js.map +1 -0
  40. package/dist/mcp/tools/browser/browser-proxy-session.d.ts +95 -0
  41. package/dist/mcp/tools/browser/browser-proxy-session.d.ts.map +1 -0
  42. package/dist/mcp/tools/browser/browser-proxy-session.js +210 -0
  43. package/dist/mcp/tools/browser/browser-proxy-session.js.map +1 -0
  44. package/dist/mcp/tools/browser/browser-security.d.ts +13 -0
  45. package/dist/mcp/tools/browser/browser-security.d.ts.map +1 -0
  46. package/dist/mcp/tools/browser/browser-security.js +27 -0
  47. package/dist/mcp/tools/browser/browser-security.js.map +1 -0
  48. package/dist/mcp/tools/browser/browser-session-manager.d.ts +50 -0
  49. package/dist/mcp/tools/browser/browser-session-manager.d.ts.map +1 -0
  50. package/dist/mcp/tools/browser/browser-session-manager.js +111 -0
  51. package/dist/mcp/tools/browser/browser-session-manager.js.map +1 -0
  52. package/dist/mcp/tools/browser/browser-session.d.ts +93 -0
  53. package/dist/mcp/tools/browser/browser-session.d.ts.map +1 -0
  54. package/dist/mcp/tools/browser/browser-session.js +254 -0
  55. package/dist/mcp/tools/browser/browser-session.js.map +1 -0
  56. package/dist/mcp/tools/browser/browser-types.d.ts +7 -0
  57. package/dist/mcp/tools/browser/browser-types.d.ts.map +1 -0
  58. package/dist/mcp/tools/browser/browser-types.js +9 -0
  59. package/dist/mcp/tools/browser/browser-types.js.map +1 -0
  60. package/dist/mcp/tools/browser/element-info.d.ts +38 -0
  61. package/dist/mcp/tools/browser/element-info.d.ts.map +1 -0
  62. package/dist/mcp/tools/browser/element-info.js +223 -0
  63. package/dist/mcp/tools/browser/element-info.js.map +1 -0
  64. package/dist/mcp/tools/browser/playwright-loader.d.ts +20 -0
  65. package/dist/mcp/tools/browser/playwright-loader.d.ts.map +1 -0
  66. package/dist/mcp/tools/browser/playwright-loader.js +50 -0
  67. package/dist/mcp/tools/browser/playwright-loader.js.map +1 -0
  68. package/dist/mcp/tools/browser.d.ts +15 -0
  69. package/dist/mcp/tools/browser.d.ts.map +1 -0
  70. package/dist/mcp/tools/browser.js +294 -0
  71. package/dist/mcp/tools/browser.js.map +1 -0
  72. package/dist/mcp/tools/mcp-response.d.ts +12 -1
  73. package/dist/mcp/tools/mcp-response.d.ts.map +1 -1
  74. package/dist/mcp/tools/mcp-response.js +9 -0
  75. package/dist/mcp/tools/mcp-response.js.map +1 -1
  76. package/dist/types/chat.d.ts +1 -0
  77. package/dist/types/chat.d.ts.map +1 -1
  78. package/dist/types/project.d.ts +20 -0
  79. package/dist/types/project.d.ts.map +1 -1
  80. package/dist/update-checker.d.ts.map +1 -1
  81. package/dist/update-checker.js +2 -1
  82. package/dist/update-checker.js.map +1 -1
  83. package/dist/vscode/vscode-tunnel-websocket.d.ts +54 -2
  84. package/dist/vscode/vscode-tunnel-websocket.d.ts.map +1 -1
  85. package/dist/vscode/vscode-tunnel-websocket.js +303 -0
  86. package/dist/vscode/vscode-tunnel-websocket.js.map +1 -1
  87. package/docker/Dockerfile +7 -0
  88. package/package.json +3 -2
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * BrowserProxySession — proxy that delegates browser operations to the main
4
+ * process via the local HTTP server.
5
+ *
6
+ * Used by MCP tools in the child process when AI_SUPPORT_BROWSER_LOCAL_PORT
7
+ * is set. Presents the same interface as BrowserSession so that MCP tools
8
+ * can operate transparently.
9
+ */
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.BrowserProxySession = void 0;
15
+ const http_1 = __importDefault(require("http"));
16
+ const logger_1 = require("../../../logger");
17
+ const browser_action_log_1 = require("./browser-action-log");
18
+ class BrowserProxySession {
19
+ baseUrl;
20
+ sessionId;
21
+ variables;
22
+ actionLog = new browser_action_log_1.BrowserActionLog();
23
+ constructor(baseUrl, sessionId) {
24
+ this.baseUrl = baseUrl;
25
+ this.sessionId = sessionId;
26
+ this.variables = new ProxyVariableMap(baseUrl, sessionId);
27
+ }
28
+ /**
29
+ * Navigate to a URL and return a screenshot buffer.
30
+ */
31
+ async navigate(url, options) {
32
+ const result = await this.post('navigate', {
33
+ url,
34
+ waitForSelector: options?.waitForSelector,
35
+ waitForTimeout: options?.waitForTimeout,
36
+ fullPage: options?.fullPage ?? true,
37
+ });
38
+ return {
39
+ title: result.title,
40
+ url: result.url,
41
+ screenshot: Buffer.from(result.screenshot, 'base64'),
42
+ };
43
+ }
44
+ /**
45
+ * Click an element by CSS selector.
46
+ */
47
+ async click(selector, options) {
48
+ const result = await this.post('click', {
49
+ selector,
50
+ waitForNavigation: options?.waitForNavigation ?? false,
51
+ screenshot: options?.screenshot ?? true,
52
+ });
53
+ return {
54
+ title: result.title,
55
+ url: result.url,
56
+ screenshot: result.screenshot ? Buffer.from(result.screenshot, 'base64') : undefined,
57
+ };
58
+ }
59
+ /**
60
+ * Fill a form field.
61
+ */
62
+ async fill(selector, value, screenshot) {
63
+ const result = await this.post('fill', { selector, value, screenshot: screenshot ?? false });
64
+ return result.screenshot ? Buffer.from(result.screenshot, 'base64') : undefined;
65
+ }
66
+ /**
67
+ * Get text content from the page.
68
+ */
69
+ async getText(selector) {
70
+ const result = await this.post('get-text', { selector });
71
+ return result.text;
72
+ }
73
+ /**
74
+ * Take a screenshot.
75
+ */
76
+ async screenshot(fullPage) {
77
+ const result = await this.post('screenshot', { fullPage: fullPage ?? true });
78
+ return Buffer.from(result.screenshot, 'base64');
79
+ }
80
+ /**
81
+ * Get the current URL.
82
+ */
83
+ async getUrl() {
84
+ const result = await this.get('url');
85
+ return result.url;
86
+ }
87
+ /**
88
+ * Get the current page title.
89
+ */
90
+ async getTitle() {
91
+ const result = await this.get('title');
92
+ return result.title;
93
+ }
94
+ /**
95
+ * Set a session variable.
96
+ */
97
+ async setVariable(name, value) {
98
+ await this.post('variable', { name, value });
99
+ }
100
+ /**
101
+ * Get a session variable.
102
+ */
103
+ async getVariable(name) {
104
+ try {
105
+ const result = await this.get(`variable/${name}`);
106
+ return result.value;
107
+ }
108
+ catch {
109
+ return undefined;
110
+ }
111
+ }
112
+ /**
113
+ * List all session variables.
114
+ */
115
+ async listVariables() {
116
+ const result = await this.get('variables');
117
+ return (result.variables ?? {});
118
+ }
119
+ /**
120
+ * Stub for isActive — proxy sessions are always considered active
121
+ * as long as the main process session is alive.
122
+ */
123
+ isActive() {
124
+ return true;
125
+ }
126
+ post(action, data) {
127
+ return httpRequest(this.baseUrl, 'POST', `/browser/${this.sessionId}/${action}`, JSON.stringify(data));
128
+ }
129
+ get(action) {
130
+ return httpRequest(this.baseUrl, 'GET', `/browser/${this.sessionId}/${action}`);
131
+ }
132
+ }
133
+ exports.BrowserProxySession = BrowserProxySession;
134
+ /**
135
+ * Proxy Map that delegates variable operations to the local HTTP server.
136
+ * Provides a synchronous get() that uses a local cache, refreshed by the proxy session methods.
137
+ */
138
+ class ProxyVariableMap {
139
+ baseUrl;
140
+ sessionId;
141
+ cache = new Map();
142
+ constructor(baseUrl, sessionId) {
143
+ this.baseUrl = baseUrl;
144
+ this.sessionId = sessionId;
145
+ }
146
+ get(name) {
147
+ return this.cache.get(name);
148
+ }
149
+ set(name, value) {
150
+ this.cache.set(name, value);
151
+ // Fire-and-forget to the server
152
+ httpRequest(this.baseUrl, 'POST', `/browser/${this.sessionId}/variable`, JSON.stringify({ name, value }))
153
+ .catch((err) => { logger_1.logger.warn(`[proxy-variable] Failed to sync variable "${name}" to server: ${String(err)}`); });
154
+ return this;
155
+ }
156
+ entries() {
157
+ return this.cache.entries();
158
+ }
159
+ /** Refresh cache from the server. Call before reading variables. */
160
+ async refresh() {
161
+ const result = await httpRequest(this.baseUrl, 'GET', `/browser/${this.sessionId}/variables`);
162
+ const vars = (result.variables ?? {});
163
+ this.cache.clear();
164
+ for (const [k, v] of Object.entries(vars)) {
165
+ this.cache.set(k, v);
166
+ }
167
+ }
168
+ }
169
+ function httpRequest(baseUrl, method, path, body) {
170
+ return new Promise((resolve, reject) => {
171
+ const url = new URL(path, baseUrl);
172
+ const options = {
173
+ hostname: url.hostname,
174
+ port: url.port,
175
+ path: url.pathname,
176
+ method,
177
+ headers: {
178
+ 'Content-Type': 'application/json',
179
+ },
180
+ };
181
+ const req = http_1.default.request(options, (res) => {
182
+ const chunks = [];
183
+ res.on('data', (chunk) => chunks.push(chunk));
184
+ res.on('end', () => {
185
+ const responseBody = Buffer.concat(chunks).toString();
186
+ try {
187
+ const json = JSON.parse(responseBody);
188
+ if (res.statusCode && res.statusCode >= 400) {
189
+ reject(new Error(json.error ?? `HTTP ${res.statusCode}`));
190
+ }
191
+ else {
192
+ resolve(json);
193
+ }
194
+ }
195
+ catch {
196
+ reject(new Error(`Invalid JSON response: ${responseBody}`));
197
+ }
198
+ });
199
+ });
200
+ req.on('error', reject);
201
+ req.setTimeout(60000, () => {
202
+ req.destroy(new Error('Request timeout'));
203
+ });
204
+ if (body) {
205
+ req.write(body);
206
+ }
207
+ req.end();
208
+ });
209
+ }
210
+ //# sourceMappingURL=browser-proxy-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-proxy-session.js","sourceRoot":"","sources":["../../../../src/mcp/tools/browser/browser-proxy-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Browser URL security validation.
3
+ */
4
+ /**
5
+ * Validate a URL for browser navigation.
6
+ * Blocks dangerous protocols (file://, javascript://, data://).
7
+ * In Phase 3, URL whitelist from project settings will be enforced here.
8
+ */
9
+ export declare function validateUrl(url: string): {
10
+ valid: boolean;
11
+ reason?: string;
12
+ };
13
+ //# sourceMappingURL=browser-security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-security.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/browser/browser-security.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAc5E"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * Browser URL security validation.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateUrl = validateUrl;
7
+ const browser_types_1 = require("./browser-types");
8
+ /**
9
+ * Validate a URL for browser navigation.
10
+ * Blocks dangerous protocols (file://, javascript://, data://).
11
+ * In Phase 3, URL whitelist from project settings will be enforced here.
12
+ */
13
+ function validateUrl(url) {
14
+ let parsed;
15
+ try {
16
+ parsed = new URL(url);
17
+ }
18
+ catch {
19
+ return { valid: false, reason: `Invalid URL: ${url}` };
20
+ }
21
+ const protocol = parsed.protocol.toLowerCase();
22
+ if (browser_types_1.BLOCKED_PROTOCOLS.includes(protocol)) {
23
+ return { valid: false, reason: `Blocked protocol: ${protocol} — only http: and https: are allowed` };
24
+ }
25
+ return { valid: true };
26
+ }
27
+ //# sourceMappingURL=browser-security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-security.js","sourceRoot":"","sources":["../../../../src/mcp/tools/browser/browser-security.ts"],"names":[],"mappings":";AAAA;;GAEG;;AASH,kCAcC;AArBD,mDAAmD;AAEnD;;;;GAIG;AACH,SAAgB,WAAW,CAAC,GAAW;IACrC,IAAI,MAAW,CAAA;IACf,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAAG,EAAE,EAAE,CAAA;IACxD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;IAC9C,IAAI,iCAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,QAAQ,sCAAsC,EAAE,CAAA;IACtG,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * BrowserSessionManager — manages multiple browser sessions for live view.
3
+ */
4
+ import { BrowserSession } from './browser-session';
5
+ export declare class BrowserSessionManager {
6
+ private sessions;
7
+ private conversationMap;
8
+ private readonly maxSessions;
9
+ constructor(maxSessions?: number);
10
+ /**
11
+ * Get an existing session or create a new one.
12
+ */
13
+ getOrCreate(sessionId: string): Promise<BrowserSession>;
14
+ /**
15
+ * Get an existing session by session ID.
16
+ */
17
+ get(sessionId: string): BrowserSession | undefined;
18
+ /**
19
+ * Get a session by conversation ID.
20
+ */
21
+ getByConversationId(conversationId: string): BrowserSession | undefined;
22
+ /**
23
+ * Get the session ID for a given conversation ID.
24
+ */
25
+ getSessionIdByConversationId(conversationId: string): string | undefined;
26
+ /**
27
+ * Link a conversation to a session.
28
+ */
29
+ linkConversation(conversationId: string, sessionId: string): void;
30
+ /**
31
+ * Close and remove a session.
32
+ */
33
+ close(sessionId: string): Promise<void>;
34
+ /**
35
+ * Close all sessions.
36
+ */
37
+ closeAll(): Promise<void>;
38
+ /**
39
+ * List all active sessions.
40
+ */
41
+ listSessions(): Array<{
42
+ sessionId: string;
43
+ conversationId?: string;
44
+ }>;
45
+ /**
46
+ * Get the number of active sessions.
47
+ */
48
+ get size(): number;
49
+ }
50
+ //# sourceMappingURL=browser-session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session-manager.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/browser/browser-session-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;gBAExB,WAAW,GAAE,MAAU;IAInC;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAc7D;;OAEG;IACH,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIlD;;OAEG;IACH,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAMvE;;OAEG;IACH,4BAA4B,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIxE;;OAEG;IACH,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAKjE;;OAEG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB7C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B;;OAEG;IACH,YAAY,IAAI,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBrE;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ /**
3
+ * BrowserSessionManager — manages multiple browser sessions for live view.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BrowserSessionManager = void 0;
7
+ const logger_1 = require("../../../logger");
8
+ const browser_session_1 = require("./browser-session");
9
+ class BrowserSessionManager {
10
+ sessions = new Map();
11
+ conversationMap = new Map(); // conversationId → sessionId
12
+ maxSessions;
13
+ constructor(maxSessions = 3) {
14
+ this.maxSessions = maxSessions;
15
+ }
16
+ /**
17
+ * Get an existing session or create a new one.
18
+ */
19
+ async getOrCreate(sessionId) {
20
+ const existing = this.sessions.get(sessionId);
21
+ if (existing)
22
+ return existing;
23
+ if (this.sessions.size >= this.maxSessions) {
24
+ throw new Error(`Max browser sessions reached (${this.maxSessions})`);
25
+ }
26
+ const session = new browser_session_1.BrowserSession();
27
+ this.sessions.set(sessionId, session);
28
+ logger_1.logger.debug(`[browser-manager] Session created: ${sessionId}`);
29
+ return session;
30
+ }
31
+ /**
32
+ * Get an existing session by session ID.
33
+ */
34
+ get(sessionId) {
35
+ return this.sessions.get(sessionId);
36
+ }
37
+ /**
38
+ * Get a session by conversation ID.
39
+ */
40
+ getByConversationId(conversationId) {
41
+ const sessionId = this.conversationMap.get(conversationId);
42
+ if (!sessionId)
43
+ return undefined;
44
+ return this.sessions.get(sessionId);
45
+ }
46
+ /**
47
+ * Get the session ID for a given conversation ID.
48
+ */
49
+ getSessionIdByConversationId(conversationId) {
50
+ return this.conversationMap.get(conversationId);
51
+ }
52
+ /**
53
+ * Link a conversation to a session.
54
+ */
55
+ linkConversation(conversationId, sessionId) {
56
+ this.conversationMap.set(conversationId, sessionId);
57
+ logger_1.logger.debug(`[browser-manager] Linked conversation ${conversationId} → session ${sessionId}`);
58
+ }
59
+ /**
60
+ * Close and remove a session.
61
+ */
62
+ async close(sessionId) {
63
+ const session = this.sessions.get(sessionId);
64
+ if (!session)
65
+ return;
66
+ await session.close();
67
+ this.sessions.delete(sessionId);
68
+ // Remove conversation mappings pointing to this session
69
+ for (const [convId, sid] of this.conversationMap) {
70
+ if (sid === sessionId) {
71
+ this.conversationMap.delete(convId);
72
+ }
73
+ }
74
+ logger_1.logger.debug(`[browser-manager] Session closed: ${sessionId}`);
75
+ }
76
+ /**
77
+ * Close all sessions.
78
+ */
79
+ async closeAll() {
80
+ const sessionIds = Array.from(this.sessions.keys());
81
+ for (const sessionId of sessionIds) {
82
+ await this.close(sessionId);
83
+ }
84
+ }
85
+ /**
86
+ * List all active sessions.
87
+ */
88
+ listSessions() {
89
+ const result = [];
90
+ // Build reverse map of sessionId → conversationId
91
+ const reverseMap = new Map();
92
+ for (const [convId, sessId] of this.conversationMap) {
93
+ reverseMap.set(sessId, convId);
94
+ }
95
+ for (const sessionId of this.sessions.keys()) {
96
+ result.push({
97
+ sessionId,
98
+ conversationId: reverseMap.get(sessionId),
99
+ });
100
+ }
101
+ return result;
102
+ }
103
+ /**
104
+ * Get the number of active sessions.
105
+ */
106
+ get size() {
107
+ return this.sessions.size;
108
+ }
109
+ }
110
+ exports.BrowserSessionManager = BrowserSessionManager;
111
+ //# sourceMappingURL=browser-session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session-manager.js","sourceRoot":"","sources":["../../../../src/mcp/tools/browser/browser-session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * BrowserSession — Playwright wrapper managing a singleton browser + page.
3
+ * Auto-closes after idle timeout (5 minutes).
4
+ * Supports live view streaming (JPEG frames) and direct interaction.
5
+ */
6
+ import { BrowserActionLog } from './browser-action-log';
7
+ type Page = any;
8
+ export declare class BrowserSession {
9
+ private browser;
10
+ private page;
11
+ private idleTimer;
12
+ private readonly idleTimeoutMs;
13
+ private liveViewInterval;
14
+ /** Session-scoped temporary variables */
15
+ readonly variables: Map<string, string>;
16
+ /** Action log for recording browser operations */
17
+ readonly actionLog: BrowserActionLog;
18
+ constructor(idleTimeoutMs?: number);
19
+ /**
20
+ * Get the current page, launching browser if needed.
21
+ */
22
+ getPage(): Promise<Page>;
23
+ /**
24
+ * Check if a browser session is currently active.
25
+ */
26
+ isActive(): boolean;
27
+ /**
28
+ * Close the browser and clean up resources.
29
+ */
30
+ close(): Promise<void>;
31
+ /**
32
+ * Set the viewport size for the current page.
33
+ */
34
+ setViewport(width: number, height: number): Promise<void>;
35
+ /**
36
+ * Take a screenshot of the current page.
37
+ */
38
+ screenshot(fullPage?: boolean): Promise<Buffer>;
39
+ /**
40
+ * Start live view streaming. Takes JPEG screenshots at the specified interval
41
+ * and calls the onFrame callback with the base64-encoded data.
42
+ * While live view is active, the idle timeout is disabled.
43
+ */
44
+ startLiveView(intervalMs: number, onFrame: (base64: string) => void): void;
45
+ /**
46
+ * Stop live view streaming and re-enable idle timeout.
47
+ */
48
+ stopLiveView(): void;
49
+ /**
50
+ * Check if live view is currently active.
51
+ */
52
+ isLiveViewActive(): boolean;
53
+ /**
54
+ * Click at the specified coordinates.
55
+ */
56
+ executeMouseClick(x: number, y: number, button?: string, clickCount?: number): Promise<void>;
57
+ /**
58
+ * Scroll the page.
59
+ */
60
+ executeMouseWheel(deltaX: number, deltaY: number): Promise<void>;
61
+ /**
62
+ * Type text into the focused element.
63
+ */
64
+ executeKeyboardType(text: string): Promise<void>;
65
+ /**
66
+ * Press a key combination.
67
+ */
68
+ executeKeyboardPress(key: string, modifiers?: string[]): Promise<void>;
69
+ /**
70
+ * Navigate back.
71
+ */
72
+ goBack(): Promise<void>;
73
+ /**
74
+ * Navigate forward.
75
+ */
76
+ goForward(): Promise<void>;
77
+ /**
78
+ * Reload the page.
79
+ */
80
+ reload(): Promise<void>;
81
+ /**
82
+ * Get current page URL.
83
+ */
84
+ getCurrentUrl(): string;
85
+ /**
86
+ * Get current page title.
87
+ */
88
+ getPageTitle(): Promise<string>;
89
+ private resetIdleTimer;
90
+ private clearIdleTimer;
91
+ }
92
+ export {};
93
+ //# sourceMappingURL=browser-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-session.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/browser/browser-session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AASvD,KAAK,IAAI,GAAG,GAAG,CAAA;AAEf,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,gBAAgB,CAA8C;IAEtE,yCAAyC;IACzC,QAAQ,CAAC,SAAS,sBAA4B;IAE9C,kDAAkD;IAClD,QAAQ,CAAC,SAAS,mBAAyB;gBAE/B,aAAa,GAAE,MAAgC;IAI3D;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB9B;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/D;;OAEG;IACG,UAAU,CAAC,QAAQ,GAAE,OAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAO3D;;;;OAIG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAuB1E;;OAEG;IACH,YAAY,IAAI,IAAI;IAYpB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAM3B;;OAEG;IACG,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlG;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtE;;OAEG;IACG,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatD;;OAEG;IACG,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB5E;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAOhC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7B;;OAEG;IACH,aAAa,IAAI,MAAM;IAKvB;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAKrC,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,cAAc;CAMvB"}