@thinkrun/mcp 0.3.5

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 (50) hide show
  1. package/README.md +356 -0
  2. package/dist/bin/thinkrun-mcp.d.ts +3 -0
  3. package/dist/bin/thinkrun-mcp.d.ts.map +1 -0
  4. package/dist/bin/thinkrun-mcp.js +305 -0
  5. package/dist/bin/thinkrun-mcp.js.map +1 -0
  6. package/dist/src/client.d.ts +422 -0
  7. package/dist/src/client.d.ts.map +1 -0
  8. package/dist/src/client.js +2 -0
  9. package/dist/src/client.js.map +1 -0
  10. package/dist/src/cloud-client.d.ts +69 -0
  11. package/dist/src/cloud-client.d.ts.map +1 -0
  12. package/dist/src/cloud-client.js +291 -0
  13. package/dist/src/cloud-client.js.map +1 -0
  14. package/dist/src/extension-proxy-client.d.ts +139 -0
  15. package/dist/src/extension-proxy-client.d.ts.map +1 -0
  16. package/dist/src/extension-proxy-client.js +451 -0
  17. package/dist/src/extension-proxy-client.js.map +1 -0
  18. package/dist/src/index.d.ts +11 -0
  19. package/dist/src/index.d.ts.map +1 -0
  20. package/dist/src/index.js +6 -0
  21. package/dist/src/index.js.map +1 -0
  22. package/dist/src/local-client.d.ts +120 -0
  23. package/dist/src/local-client.d.ts.map +1 -0
  24. package/dist/src/local-client.js +947 -0
  25. package/dist/src/local-client.js.map +1 -0
  26. package/dist/src/local-locks.d.ts +26 -0
  27. package/dist/src/local-locks.d.ts.map +1 -0
  28. package/dist/src/local-locks.js +315 -0
  29. package/dist/src/local-locks.js.map +1 -0
  30. package/dist/src/package-version.d.ts +2 -0
  31. package/dist/src/package-version.d.ts.map +1 -0
  32. package/dist/src/package-version.js +13 -0
  33. package/dist/src/package-version.js.map +1 -0
  34. package/dist/src/page-cache-http.d.ts +15 -0
  35. package/dist/src/page-cache-http.d.ts.map +1 -0
  36. package/dist/src/page-cache-http.js +44 -0
  37. package/dist/src/page-cache-http.js.map +1 -0
  38. package/dist/src/server.d.ts +135 -0
  39. package/dist/src/server.d.ts.map +1 -0
  40. package/dist/src/server.js +1454 -0
  41. package/dist/src/server.js.map +1 -0
  42. package/dist/src/test-utils/lock-fixtures.d.ts +18 -0
  43. package/dist/src/test-utils/lock-fixtures.d.ts.map +1 -0
  44. package/dist/src/test-utils/lock-fixtures.js +33 -0
  45. package/dist/src/test-utils/lock-fixtures.js.map +1 -0
  46. package/dist/src/unwrap-evaluate-payload.d.ts +8 -0
  47. package/dist/src/unwrap-evaluate-payload.d.ts.map +1 -0
  48. package/dist/src/unwrap-evaluate-payload.js +19 -0
  49. package/dist/src/unwrap-evaluate-payload.js.map +1 -0
  50. package/package.json +65 -0
@@ -0,0 +1,291 @@
1
+ import { fetchPageCacheJson, PageCacheRequestError } from './page-cache-http.js';
2
+ export class CloudClient {
3
+ baseUrl;
4
+ apiKey;
5
+ constructor(config) {
6
+ this.baseUrl = config.baseUrl.replace(/\/$/, '');
7
+ this.apiKey = config.apiKey;
8
+ }
9
+ async request(method, path, body) {
10
+ const url = `${this.baseUrl}${path}`;
11
+ const headers = {
12
+ 'x-api-key': this.apiKey,
13
+ };
14
+ if (body) {
15
+ headers['Content-Type'] = 'application/json';
16
+ }
17
+ const response = await fetch(url, {
18
+ method,
19
+ headers,
20
+ body: body ? JSON.stringify(body) : undefined,
21
+ });
22
+ if (!response.ok) {
23
+ const text = await response.text();
24
+ let parsed;
25
+ try {
26
+ parsed = JSON.parse(text);
27
+ }
28
+ catch {
29
+ // not JSON
30
+ }
31
+ throw new ApiError(parsed?.error || `HTTP ${response.status}: ${text}`, response.status, parsed?.code, parsed?.hint);
32
+ }
33
+ return response.json();
34
+ }
35
+ // --- Session lifecycle ---
36
+ async createSession(options) {
37
+ const result = await this.request('POST', '/api/sessions', options || {});
38
+ if (result.data?.sessionId)
39
+ return result.data;
40
+ if (result.sessionId && result.status)
41
+ return result;
42
+ const keys = result && typeof result === 'object' ? Object.keys(result).join(', ') : typeof result;
43
+ throw new Error(`Unexpected createSession response shape (keys: ${keys})`);
44
+ }
45
+ async getSession(sessionId) {
46
+ const result = await this.request('GET', `/api/sessions/${sessionId}`);
47
+ if (result.data?.sessionId)
48
+ return result.data;
49
+ if (result.sessionId && result.status)
50
+ return result;
51
+ const keys = result && typeof result === 'object' ? Object.keys(result).join(', ') : typeof result;
52
+ throw new Error(`Unexpected getSession response shape (keys: ${keys})`);
53
+ }
54
+ async deleteSession(sessionId) {
55
+ return this.request('DELETE', `/api/sessions/${sessionId}`);
56
+ }
57
+ async listSessions() {
58
+ const result = await this.request('GET', '/api/sessions');
59
+ const sessions = result.data?.sessions || result.sessions;
60
+ if (!sessions)
61
+ throw new Error(`Unexpected listSessions response shape (keys: ${Object.keys(result).join(', ')})`);
62
+ return sessions;
63
+ }
64
+ async attachToTab(_tabId) {
65
+ throw new Error('Tab attachment is only available in local mode');
66
+ }
67
+ async switchToTab(_tabId) {
68
+ throw new Error('Tab switching is only available in local mode');
69
+ }
70
+ async openNewWindow(_url) {
71
+ throw new Error('Opening a new window is only available in local mode');
72
+ }
73
+ async releaseSession(_sessionId) {
74
+ throw new Error('Session release is only available in local mode');
75
+ }
76
+ async listArtifacts(sessionId) {
77
+ try {
78
+ return await this.request('GET', `/api/sessions/${sessionId}/artifacts`);
79
+ }
80
+ catch (err) {
81
+ if (err instanceof ApiError) {
82
+ return { success: false, error: err.message };
83
+ }
84
+ throw err;
85
+ }
86
+ }
87
+ // --- Navigation ---
88
+ async navigate(sessionId, params) {
89
+ // Cloud sessions run on Fly.io machines — they cannot reach localhost or
90
+ // any loopback address on the user's machine. Catch this early with a clear
91
+ // error rather than a confusing navigation timeout.
92
+ try {
93
+ const parsed = new URL(params.url);
94
+ // WHATWG URL parser brackets IPv6 addresses: new URL('http://[::1]/').hostname === '[::1]'
95
+ // Note: IPv4-mapped IPv6 loopback (::ffff:127.0.0.1 / [::ffff:7f00:1]) is not
96
+ // blocked here — WHATWG surfaces it as '[::ffff:7f00:1]', distinct from the
97
+ // patterns below. In practice agents don't use these forms; accepted known gap.
98
+ if (parsed.hostname === 'localhost' ||
99
+ parsed.hostname.startsWith('127.') ||
100
+ parsed.hostname === '[::1]' ||
101
+ parsed.hostname === '0.0.0.0') {
102
+ throw new Error(`Cannot navigate to ${params.url} in cloud mode — cloud sessions run on remote machines and cannot reach your local network. ` +
103
+ 'Use a publicly accessible URL, or switch to local mode to control your own Chrome.');
104
+ }
105
+ }
106
+ catch (err) {
107
+ // new URL() throws TypeError on invalid input — fall through to the server request.
108
+ // Re-throw our intentional loopback Error (not a TypeError).
109
+ if (!(err instanceof TypeError))
110
+ throw err;
111
+ }
112
+ return this.request('POST', `/api/sessions/${sessionId}/navigate`, params);
113
+ }
114
+ async wait(sessionId, params) {
115
+ return this.request('POST', `/api/sessions/${sessionId}/wait`, params);
116
+ }
117
+ // --- Interaction ---
118
+ async click(sessionId, params) {
119
+ return this.request('POST', `/api/sessions/${sessionId}/click`, params);
120
+ }
121
+ async type(sessionId, params) {
122
+ return this.request('POST', `/api/sessions/${sessionId}/type`, params);
123
+ }
124
+ async fill(sessionId, params) {
125
+ return this.request('POST', `/api/sessions/${sessionId}/fill`, params);
126
+ }
127
+ async press(sessionId, params) {
128
+ return this.request('POST', `/api/sessions/${sessionId}/press`, params);
129
+ }
130
+ async scroll(sessionId, params) {
131
+ return this.request('POST', `/api/sessions/${sessionId}/scroll`, params);
132
+ }
133
+ async hover(sessionId, params) {
134
+ return this.request('POST', `/api/sessions/${sessionId}/hover`, params);
135
+ }
136
+ async select(sessionId, params) {
137
+ return this.request('POST', `/api/sessions/${sessionId}/select`, params);
138
+ }
139
+ // --- Observation ---
140
+ async snapshot(sessionId) {
141
+ return this.request('POST', `/api/sessions/${sessionId}/snapshot`);
142
+ }
143
+ async screenshot(sessionId, params) {
144
+ return this.request('POST', `/api/sessions/${sessionId}/screenshot`, params || {});
145
+ }
146
+ async extract(sessionId, params) {
147
+ return this.request('POST', `/api/sessions/${sessionId}/extract`, params);
148
+ }
149
+ async evaluate(sessionId, params) {
150
+ return this.request('POST', `/api/sessions/${sessionId}/evaluate`, params);
151
+ }
152
+ // --- Wait for text ---
153
+ async waitForText(sessionId, params) {
154
+ return this.request('POST', `/api/sessions/${sessionId}/wait-for-text`, params);
155
+ }
156
+ // --- Dialog handling ---
157
+ async getDialog(sessionId) {
158
+ return this.request('GET', `/api/sessions/${sessionId}/dialog`);
159
+ }
160
+ async handleDialog(sessionId, params) {
161
+ return this.request('POST', `/api/sessions/${sessionId}/dialog`, params);
162
+ }
163
+ // --- Navigation history ---
164
+ async goBack(sessionId) {
165
+ return this.request('POST', `/api/sessions/${sessionId}/go-back`);
166
+ }
167
+ async goForward(sessionId) {
168
+ return this.request('POST', `/api/sessions/${sessionId}/go-forward`);
169
+ }
170
+ // --- Tab management (not available in cloud mode) ---
171
+ async listTabs(_sessionId) {
172
+ return { success: false, error: 'Tab management is only available in local mode' };
173
+ }
174
+ async newTab(_sessionId, _url) {
175
+ // Return a sentinel value; the server.ts handler wraps in try/catch
176
+ throw new Error('Tab management is only available in local mode');
177
+ }
178
+ async closeTab(_sessionId, _tabId) {
179
+ return { success: false, error: 'Tab management is only available in local mode' };
180
+ }
181
+ // --- Monitoring ---
182
+ async getConsoleMessages(sessionId) {
183
+ const result = await this.request('GET', `/api/sessions/${sessionId}/console`);
184
+ return {
185
+ success: result.success,
186
+ logs: result.data?.logs || [],
187
+ count: result.data?.count || 0,
188
+ };
189
+ }
190
+ async getNetworkRequests(sessionId) {
191
+ const result = await this.request('GET', `/api/sessions/${sessionId}/network`);
192
+ return {
193
+ success: result.success,
194
+ requests: result.data?.requests || [],
195
+ count: result.data?.count || 0,
196
+ };
197
+ }
198
+ async clearLogs(sessionId) {
199
+ try {
200
+ return await this.request('POST', `/api/sessions/${sessionId}/clear-logs`, {});
201
+ }
202
+ catch (err) {
203
+ if (err instanceof ApiError) {
204
+ return { success: false, error: err.message };
205
+ }
206
+ throw err;
207
+ }
208
+ }
209
+ // --- Task planning ---
210
+ async createTask(params) {
211
+ return this.request('POST', '/api/tasks/from-text', params);
212
+ }
213
+ async executeTask(planId) {
214
+ return this.request('POST', `/api/tasks/${planId}/execute`);
215
+ }
216
+ async getTaskStatus(planId) {
217
+ return this.request('GET', `/api/tasks/${planId}`);
218
+ }
219
+ async runLocalAction(_params) {
220
+ throw new Error('local_action_run is only available in local mode');
221
+ }
222
+ async getLocalActionStatus(_actionId) {
223
+ throw new Error('local_action_status is only available in local mode');
224
+ }
225
+ async cancelLocalAction(_actionId) {
226
+ throw new Error('local_action_cancel is only available in local mode');
227
+ }
228
+ async getLocalDiagnostics(_options) {
229
+ return {
230
+ success: false,
231
+ code: 'LOCAL_ONLY_TOOL',
232
+ error: 'Local diagnostics are only available in local mode',
233
+ hint: 'Switch thinkrun-mcp to local mode and attach a local tab first.',
234
+ };
235
+ }
236
+ async resetLocalConnection() {
237
+ return {
238
+ success: false,
239
+ code: 'LOCAL_ONLY_TOOL',
240
+ error: 'Local connection reset is only available in local mode',
241
+ hint: 'Switch thinkrun-mcp to local mode to access the native-host recovery path.',
242
+ };
243
+ }
244
+ // --- Stateless page cache (no session) ---
245
+ async pageCacheHtml(params) {
246
+ try {
247
+ return await fetchPageCacheJson(this.baseUrl, this.apiKey, '/api/cache/html', params);
248
+ }
249
+ catch (e) {
250
+ if (e instanceof PageCacheRequestError) {
251
+ throw new ApiError(e.message, e.status, e.code, e.hint);
252
+ }
253
+ throw e;
254
+ }
255
+ }
256
+ async pageCacheText(params) {
257
+ try {
258
+ return await fetchPageCacheJson(this.baseUrl, this.apiKey, '/api/cache/text', params);
259
+ }
260
+ catch (e) {
261
+ if (e instanceof PageCacheRequestError) {
262
+ throw new ApiError(e.message, e.status, e.code, e.hint);
263
+ }
264
+ throw e;
265
+ }
266
+ }
267
+ async pageCacheScreenshot(params) {
268
+ try {
269
+ return await fetchPageCacheJson(this.baseUrl, this.apiKey, '/api/cache/screenshot', params);
270
+ }
271
+ catch (e) {
272
+ if (e instanceof PageCacheRequestError) {
273
+ throw new ApiError(e.message, e.status, e.code, e.hint);
274
+ }
275
+ throw e;
276
+ }
277
+ }
278
+ }
279
+ export class ApiError extends Error {
280
+ status;
281
+ code;
282
+ hint;
283
+ constructor(message, status, code, hint) {
284
+ super(message);
285
+ this.status = status;
286
+ this.code = code;
287
+ this.hint = hint;
288
+ this.name = 'ApiError';
289
+ }
290
+ }
291
+ //# sourceMappingURL=cloud-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-client.js","sourceRoot":"","sources":["../../src/cloud-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Extension Proxy Client — relays MCP tool calls over WebSocket to a
3
+ * connected Chrome extension.
4
+ *
5
+ * Used by Mode 2 (Extension Agent): the Gemini CLI runs on the server and
6
+ * calls MCP tools. This client serializes each tool call as a JSON command,
7
+ * sends it over the WebSocket, and waits for the extension to execute it
8
+ * and return a result.
9
+ *
10
+ * Implements the same ThinkRun client interface as CloudClient (REST →
11
+ * Playwright) and LocalClient (HTTP → bridge → extension). The command
12
+ * protocol matches bridge-server.ts so the extension's existing command
13
+ * handler works with minimal changes.
14
+ */
15
+ import type { ThinkRunClient, CreateSessionOptions, LocalSessionResult, SessionResult, NavigateParams, WaitParams, ClickParams, TypeParams, FillParams, PressParams, ScrollParams, HoverParams, SelectParams, ScreenshotParams, ExtractParams, EvaluateParams, CreateTaskParams, LocalActionRunParams, WaitForTextParams, HandleDialogParams, DialogResult, ActionResult, SnapshotResult, ScreenshotResult, ExtractResult, EvaluateResult, TabInfo, TabListResult, ConsoleResult, NetworkResult, TaskResult, LocalActionResult, LocalActionStatusResult, LocalActionCancelResult, LocalDiagnosticsResult, LocalResetConnectionResult, ArtifactsResult, PageCacheRequestBody, PageCacheHtmlResult, PageCacheTextResult, PageCacheScreenshotResult } from './client.js';
16
+ export interface ExtensionProxyClientConfig {
17
+ /** Timeout per command in ms. Default: 30000 (30s). */
18
+ commandTimeoutMs?: number;
19
+ /** Ping interval in ms. Default: 15000 (15s). */
20
+ pingIntervalMs?: number;
21
+ /** Pong timeout in ms. Default: 5000 (5s). */
22
+ pongTimeoutMs?: number;
23
+ /** Called when the WebSocket disconnects unexpectedly. */
24
+ onDisconnect?: (reason: string) => void;
25
+ /** mech-browser-service base URL for `/api/cache/*` (extension relay has no cache routes). */
26
+ serviceBaseUrl?: string;
27
+ /** API key for page-cache calls. Defaults to `THINKRUN_API_KEY`. */
28
+ serviceApiKey?: string;
29
+ }
30
+ /** Minimal WebSocket interface — works with both `ws` (Node) and native WebSocket. */
31
+ export interface ProxyWebSocket {
32
+ send(data: string): void;
33
+ close(code?: number, reason?: string): void;
34
+ readonly readyState: number;
35
+ }
36
+ export declare class ExtensionProxyClient implements ThinkRunClient {
37
+ private ws;
38
+ private pending;
39
+ private readonly commandTimeoutMs;
40
+ private readonly pingIntervalMs;
41
+ private readonly pongTimeoutMs;
42
+ private readonly onDisconnect?;
43
+ private readonly serviceBaseUrl?;
44
+ private readonly serviceApiKey?;
45
+ private pingTimer;
46
+ private pongTimer;
47
+ constructor(config?: ExtensionProxyClientConfig);
48
+ /**
49
+ * Attach a WebSocket connection from the extension.
50
+ * Call this when the extension connects to the WS relay endpoint.
51
+ */
52
+ attachWebSocket(ws: ProxyWebSocket): void;
53
+ /**
54
+ * Detach the WebSocket and reject all pending commands.
55
+ * Call this on WS close/error.
56
+ */
57
+ detachWebSocket(reason?: string): void;
58
+ /** Whether a WebSocket is attached and open. */
59
+ get isConnected(): boolean;
60
+ /**
61
+ * Handle an incoming message from the extension.
62
+ * Call this from the WS message handler.
63
+ */
64
+ handleMessage(raw: string): void;
65
+ createSession(_options?: CreateSessionOptions): Promise<SessionResult>;
66
+ getSession(sessionId: string): Promise<SessionResult>;
67
+ deleteSession(_sessionId: string): Promise<{
68
+ success: boolean;
69
+ }>;
70
+ listSessions(): Promise<SessionResult[]>;
71
+ attachToTab(tabId: number): Promise<LocalSessionResult>;
72
+ switchToTab(tabId: number): Promise<ActionResult>;
73
+ releaseSession(_sessionId?: string): Promise<ActionResult>;
74
+ openNewWindow(url?: string): Promise<LocalSessionResult>;
75
+ listArtifacts(_sessionId: string): Promise<ArtifactsResult>;
76
+ navigate(_sessionId: string, params: NavigateParams): Promise<ActionResult>;
77
+ wait(_sessionId: string, params: WaitParams): Promise<ActionResult>;
78
+ click(_sessionId: string, params: ClickParams): Promise<ActionResult>;
79
+ type(_sessionId: string, params: TypeParams): Promise<ActionResult>;
80
+ fill(_sessionId: string, params: FillParams): Promise<ActionResult>;
81
+ press(_sessionId: string, params: PressParams): Promise<ActionResult>;
82
+ scroll(_sessionId: string, params: ScrollParams): Promise<ActionResult>;
83
+ hover(_sessionId: string, params: HoverParams): Promise<ActionResult>;
84
+ select(_sessionId: string, params: SelectParams): Promise<ActionResult>;
85
+ snapshot(_sessionId: string): Promise<SnapshotResult>;
86
+ screenshot(_sessionId: string, params?: ScreenshotParams): Promise<ScreenshotResult>;
87
+ extract(_sessionId: string, params: ExtractParams): Promise<ExtractResult>;
88
+ evaluate(_sessionId: string, params: EvaluateParams): Promise<EvaluateResult>;
89
+ goBack(_sessionId: string): Promise<ActionResult>;
90
+ goForward(_sessionId: string): Promise<ActionResult>;
91
+ listTabs(_sessionId: string): Promise<TabListResult>;
92
+ newTab(_sessionId: string, url?: string): Promise<TabInfo>;
93
+ closeTab(_sessionId: string, tabId?: number): Promise<ActionResult>;
94
+ waitForText(_sessionId: string, params: WaitForTextParams): Promise<ActionResult>;
95
+ getDialog(_sessionId: string): Promise<DialogResult>;
96
+ handleDialog(_sessionId: string, params: HandleDialogParams): Promise<ActionResult>;
97
+ getConsoleMessages(_sessionId: string): Promise<ConsoleResult>;
98
+ getNetworkRequests(_sessionId: string): Promise<NetworkResult>;
99
+ clearLogs(_sessionId: string): Promise<ActionResult>;
100
+ createTask(_params: CreateTaskParams): Promise<TaskResult>;
101
+ executeTask(_planId: string): Promise<TaskResult>;
102
+ getTaskStatus(_planId: string): Promise<TaskResult>;
103
+ runLocalAction(_params: LocalActionRunParams): Promise<LocalActionResult>;
104
+ getLocalActionStatus(_actionId: string): Promise<LocalActionStatusResult>;
105
+ cancelLocalAction(_actionId: string): Promise<LocalActionCancelResult>;
106
+ getLocalDiagnostics(_options?: {
107
+ bridgeTimeoutMs?: number;
108
+ }): Promise<LocalDiagnosticsResult>;
109
+ resetLocalConnection(): Promise<LocalResetConnectionResult>;
110
+ private resolvePageCacheAuth;
111
+ pageCacheHtml(params: PageCacheRequestBody): Promise<PageCacheHtmlResult>;
112
+ pageCacheText(params: PageCacheRequestBody): Promise<PageCacheTextResult>;
113
+ pageCacheScreenshot(params: PageCacheRequestBody): Promise<PageCacheScreenshotResult>;
114
+ /**
115
+ * Send a command to the extension and wait for the response.
116
+ *
117
+ * Serializes the command as JSON: `{ id, command, params }`.
118
+ * Returns a promise that resolves when the extension responds with
119
+ * a matching `{ id, success, data }` message.
120
+ *
121
+ * Rejects after `commandTimeoutMs` if no response is received.
122
+ */
123
+ private sendCommand;
124
+ /**
125
+ * Handle a response from the extension — resolve or reject the
126
+ * matching pending promise.
127
+ */
128
+ private handleResponse;
129
+ private startPing;
130
+ private stopPing;
131
+ private handlePong;
132
+ private rejectAllPending;
133
+ }
134
+ export declare class ExtensionProxyError extends Error {
135
+ code: string;
136
+ retryable: boolean;
137
+ constructor(message: string, code: string, retryable: boolean);
138
+ }
139
+ //# sourceMappingURL=extension-proxy-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-proxy-client.d.ts","sourceRoot":"","sources":["../../src/extension-proxy-client.ts"],"names":[],"mappings":"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"}