@canaryai/cli 0.2.3 → 0.2.4

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 (57) hide show
  1. package/dist/bin.js +1 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/{chunk-DXJNFJ3A.js → chunk-6WWHXWCS.js} +3 -2
  4. package/dist/{chunk-DXJNFJ3A.js.map → chunk-6WWHXWCS.js.map} +1 -1
  5. package/dist/{chunk-HOYYXZPV.js → chunk-DXIAHB72.js} +3 -2
  6. package/dist/{chunk-HOYYXZPV.js.map → chunk-DXIAHB72.js.map} +1 -1
  7. package/dist/chunk-FIQBGAKW.js +373 -0
  8. package/dist/chunk-FIQBGAKW.js.map +1 -0
  9. package/dist/{chunk-JMI7WWPF.js → chunk-ILEPYWZX.js} +3 -2
  10. package/dist/{chunk-JMI7WWPF.js.map → chunk-ILEPYWZX.js.map} +1 -1
  11. package/dist/{chunk-7R4YFGP6.js → chunk-PWWQGYFG.js} +3 -1
  12. package/dist/{chunk-7R4YFGP6.js.map → chunk-PWWQGYFG.js.map} +1 -1
  13. package/dist/chunk-VLFUCAPZ.js +12 -0
  14. package/dist/{debug-workflow-PMLMWKWI.js → debug-workflow-PT3OUR3V.js} +5 -5
  15. package/dist/docs-GCYDTEOY.js +270 -0
  16. package/dist/docs-GCYDTEOY.js.map +1 -0
  17. package/dist/{feature-flag-D3QTHGL6.js → feature-flag-S5B5GLPP.js} +77 -33
  18. package/dist/feature-flag-S5B5GLPP.js.map +1 -0
  19. package/dist/index.js +26 -12
  20. package/dist/index.js.map +1 -1
  21. package/dist/{issues-6MHRFKTU.js → issues-4ZEDHPLW.js} +5 -4
  22. package/dist/{issues-6MHRFKTU.js.map → issues-4ZEDHPLW.js.map} +1 -1
  23. package/dist/{knobs-ED6LXBVM.js → knobs-RKUVK3HC.js} +5 -4
  24. package/dist/{knobs-ED6LXBVM.js.map → knobs-RKUVK3HC.js.map} +1 -1
  25. package/dist/{local-browser-YSE3XCUW.js → local-browser-J6WGFLVD.js} +5 -5
  26. package/dist/mcp-HGYBMDYZ.js +687 -0
  27. package/dist/mcp-HGYBMDYZ.js.map +1 -0
  28. package/dist/{psql-U5LF6ELS.js → psql-WVIHMC6A.js} +4 -3
  29. package/dist/{psql-U5LF6ELS.js.map → psql-WVIHMC6A.js.map} +1 -1
  30. package/dist/record-X4SVNYP3.js +334 -0
  31. package/dist/record-X4SVNYP3.js.map +1 -0
  32. package/dist/{redis-PBQZGU6T.js → redis-RGHECKV5.js} +4 -3
  33. package/dist/{redis-PBQZGU6T.js.map → redis-RGHECKV5.js.map} +1 -1
  34. package/dist/{release-QBSP474D.js → release-ZOD4Y2BF.js} +4 -3
  35. package/dist/{release-QBSP474D.js.map → release-ZOD4Y2BF.js.map} +1 -1
  36. package/dist/runner/preload.js +3 -2
  37. package/dist/runner/preload.js.map +1 -1
  38. package/dist/test.js +3 -2
  39. package/dist/test.js.map +1 -1
  40. package/package.json +2 -2
  41. package/dist/chunk-OE6O7H45.js +0 -92
  42. package/dist/chunk-OE6O7H45.js.map +0 -1
  43. package/dist/chunk-PLDDJCW6.js +0 -49
  44. package/dist/chunk-ZTWHPIXU.js +0 -42798
  45. package/dist/chunk-ZTWHPIXU.js.map +0 -1
  46. package/dist/dist-6NXLJYRZ.js +0 -335
  47. package/dist/dist-6NXLJYRZ.js.map +0 -1
  48. package/dist/feature-flag-D3QTHGL6.js.map +0 -1
  49. package/dist/mcp-LKHFYMA6.js +0 -385
  50. package/dist/mcp-LKHFYMA6.js.map +0 -1
  51. package/dist/pdf-extract-YIDRKYUD.js +0 -12
  52. package/dist/pdf-extract-YIDRKYUD.js.map +0 -1
  53. package/dist/pdfjs-44AOKLEM.js +0 -35242
  54. package/dist/pdfjs-44AOKLEM.js.map +0 -1
  55. /package/dist/{chunk-PLDDJCW6.js.map → chunk-VLFUCAPZ.js.map} +0 -0
  56. /package/dist/{debug-workflow-PMLMWKWI.js.map → debug-workflow-PT3OUR3V.js.map} +0 -0
  57. /package/dist/{local-browser-YSE3XCUW.js.map → local-browser-J6WGFLVD.js.map} +0 -0
@@ -1,385 +0,0 @@
1
- import {
2
- connectTunnel,
3
- createLocalRun,
4
- createTunnel
5
- } from "./chunk-HOYYXZPV.js";
6
- import {
7
- LocalBrowserHost
8
- } from "./chunk-ZTWHPIXU.js";
9
- import {
10
- readStoredToken
11
- } from "./chunk-7R4YFGP6.js";
12
- import "./chunk-OE6O7H45.js";
13
- import "./chunk-PLDDJCW6.js";
14
-
15
- // src/mcp.ts
16
- import process from "process";
17
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
18
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
19
- import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
20
- import { createParser } from "eventsource-parser";
21
- var browserSessions = /* @__PURE__ */ new Map();
22
- var DEFAULT_API_URL = "https://api.trycanary.ai";
23
- function resolveApiUrl(input) {
24
- return input ?? process.env.CANARY_API_URL ?? DEFAULT_API_URL;
25
- }
26
- async function resolveToken() {
27
- const token = process.env.CANARY_API_TOKEN ?? await readStoredToken();
28
- if (!token) {
29
- throw new Error("Missing token. Run `canary login` first or set CANARY_API_TOKEN.");
30
- }
31
- return token;
32
- }
33
- function toolText(text) {
34
- return { content: [{ type: "text", text }] };
35
- }
36
- function toolJson(data) {
37
- return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
38
- }
39
- async function runMcp(argv) {
40
- const server = new Server(
41
- { name: "canary-cli", version: "0.1.0" },
42
- { capabilities: { tools: {} } }
43
- );
44
- server.setRequestHandler(ListToolsRequestSchema, async () => ({
45
- tools: [
46
- {
47
- name: "local_run_tests",
48
- description: "Start an async local test run. A tunnel is opened automatically. Returns runId and watchUrl.",
49
- inputSchema: {
50
- type: "object",
51
- properties: {
52
- port: { type: "number" },
53
- instructions: { type: "string" },
54
- title: { type: "string" }
55
- },
56
- required: ["port", "instructions"]
57
- }
58
- },
59
- {
60
- name: "local_wait_for_results",
61
- description: "Wait for a local test run to complete. Streams until completion and returns a compact report.",
62
- inputSchema: {
63
- type: "object",
64
- properties: {
65
- runId: { type: "string" }
66
- },
67
- required: ["runId"]
68
- }
69
- },
70
- {
71
- name: "local_browser_start",
72
- description: "Start a local browser session that connects to the cloud agent. The cloud agent can then control this browser to test local applications. Returns sessionId for tracking.",
73
- inputSchema: {
74
- type: "object",
75
- properties: {
76
- mode: {
77
- type: "string",
78
- enum: ["playwright", "cdp"],
79
- description: "Browser mode: 'playwright' for fresh browser, 'cdp' to connect to existing Chrome"
80
- },
81
- cdpUrl: {
82
- type: "string",
83
- description: "CDP endpoint URL when mode is 'cdp' (e.g. http://localhost:9222)"
84
- },
85
- headless: {
86
- type: "boolean",
87
- description: "Run browser headless (default: true for playwright mode)"
88
- },
89
- storageStatePath: {
90
- type: "string",
91
- description: "Path to Playwright storage state JSON for pre-authenticated sessions"
92
- },
93
- instructions: {
94
- type: "string",
95
- description: "Instructions for the cloud agent on what to test"
96
- }
97
- }
98
- }
99
- },
100
- {
101
- name: "local_browser_status",
102
- description: "Check the status of a local browser session.",
103
- inputSchema: {
104
- type: "object",
105
- properties: {
106
- sessionId: { type: "string" }
107
- },
108
- required: ["sessionId"]
109
- }
110
- },
111
- {
112
- name: "local_browser_stop",
113
- description: "Stop a local browser session and close the browser.",
114
- inputSchema: {
115
- type: "object",
116
- properties: {
117
- sessionId: { type: "string" }
118
- },
119
- required: ["sessionId"]
120
- }
121
- },
122
- {
123
- name: "local_browser_list",
124
- description: "List all active local browser sessions.",
125
- inputSchema: {
126
- type: "object",
127
- properties: {}
128
- }
129
- },
130
- {
131
- name: "local_browser_run",
132
- description: "Start a test run on an active local browser session. The cloud agent will control the local browser according to the instructions.",
133
- inputSchema: {
134
- type: "object",
135
- properties: {
136
- sessionId: {
137
- type: "string",
138
- description: "The session ID from local_browser_start"
139
- },
140
- instructions: {
141
- type: "string",
142
- description: "Instructions for the cloud agent on what to test"
143
- },
144
- startUrl: {
145
- type: "string",
146
- description: "Optional URL to navigate to before starting"
147
- }
148
- },
149
- required: ["sessionId", "instructions"]
150
- }
151
- }
152
- ]
153
- }));
154
- server.setRequestHandler(CallToolRequestSchema, async (req) => {
155
- const token = await resolveToken();
156
- const tool = req.params.name;
157
- if (tool === "local_run_tests") {
158
- const input = req.params.arguments;
159
- const apiUrl = resolveApiUrl();
160
- const tunnel = await createTunnel({ apiUrl, token, port: input.port });
161
- connectTunnel({
162
- apiUrl,
163
- tunnelId: tunnel.tunnelId,
164
- token: tunnel.token,
165
- port: input.port
166
- });
167
- const tunnelUrl = tunnel.publicUrl;
168
- const run = await createLocalRun({
169
- apiUrl,
170
- token,
171
- title: input.title ?? "Local MCP run",
172
- featureSpec: input.instructions,
173
- startUrl: void 0,
174
- tunnelUrl
175
- });
176
- return toolJson({
177
- runId: run.runId,
178
- watchUrl: run.watchUrl,
179
- tunnelUrl,
180
- note: "Testing is asynchronous. Use local_wait_for_results with the runId to wait for completion."
181
- });
182
- }
183
- if (tool === "local_wait_for_results") {
184
- const input = req.params.arguments;
185
- const apiUrl = resolveApiUrl();
186
- const report = await waitForResult({ apiUrl, token, runId: input.runId });
187
- return toolJson(report);
188
- }
189
- if (tool === "local_browser_start") {
190
- const input = req.params.arguments;
191
- const apiUrl = resolveApiUrl();
192
- const mode = input.mode ?? "playwright";
193
- const sessionResponse = await fetch(`${apiUrl}/local-browser/sessions`, {
194
- method: "POST",
195
- headers: {
196
- "Content-Type": "application/json",
197
- Authorization: `Bearer ${token}`
198
- },
199
- body: JSON.stringify({
200
- browserMode: mode,
201
- instructions: input.instructions ?? null
202
- })
203
- });
204
- if (!sessionResponse.ok) {
205
- const text = await sessionResponse.text();
206
- return toolJson({ ok: false, error: `Failed to create session: ${text}` });
207
- }
208
- const session = await sessionResponse.json();
209
- const host = new LocalBrowserHost({
210
- apiUrl,
211
- wsToken: session.wsToken,
212
- sessionId: session.sessionId,
213
- browserMode: mode,
214
- cdpUrl: input.cdpUrl,
215
- headless: input.headless ?? true,
216
- storageStatePath: input.storageStatePath,
217
- onLog: (level, message) => {
218
- if (level === "error") {
219
- console.error(`[LocalBrowser] ${message}`);
220
- }
221
- }
222
- });
223
- host.start().catch((err) => {
224
- console.error("Failed to start local browser:", err);
225
- browserSessions.delete(session.sessionId);
226
- });
227
- browserSessions.set(session.sessionId, {
228
- sessionId: session.sessionId,
229
- host,
230
- startedAt: Date.now(),
231
- mode
232
- });
233
- return toolJson({
234
- ok: true,
235
- sessionId: session.sessionId,
236
- mode,
237
- expiresAt: session.expiresAt,
238
- note: "Browser session started. The cloud agent can now control this browser. Use local_browser_stop to end the session."
239
- });
240
- }
241
- if (tool === "local_browser_status") {
242
- const input = req.params.arguments;
243
- const session = browserSessions.get(input.sessionId);
244
- if (!session) {
245
- return toolJson({ ok: false, error: "Session not found", sessionId: input.sessionId });
246
- }
247
- return toolJson({
248
- ok: true,
249
- sessionId: session.sessionId,
250
- mode: session.mode,
251
- startedAt: new Date(session.startedAt).toISOString(),
252
- uptimeMs: Date.now() - session.startedAt
253
- });
254
- }
255
- if (tool === "local_browser_stop") {
256
- const input = req.params.arguments;
257
- const session = browserSessions.get(input.sessionId);
258
- if (!session) {
259
- return toolJson({ ok: false, error: "Session not found", sessionId: input.sessionId });
260
- }
261
- await session.host.stop();
262
- browserSessions.delete(input.sessionId);
263
- return toolJson({
264
- ok: true,
265
- sessionId: input.sessionId,
266
- note: "Browser session stopped and browser closed."
267
- });
268
- }
269
- if (tool === "local_browser_list") {
270
- const sessions = Array.from(browserSessions.values()).map((s) => ({
271
- sessionId: s.sessionId,
272
- mode: s.mode,
273
- startedAt: new Date(s.startedAt).toISOString(),
274
- uptimeMs: Date.now() - s.startedAt
275
- }));
276
- return toolJson({
277
- ok: true,
278
- count: sessions.length,
279
- sessions
280
- });
281
- }
282
- if (tool === "local_browser_run") {
283
- const input = req.params.arguments;
284
- const apiUrl = resolveApiUrl();
285
- const session = browserSessions.get(input.sessionId);
286
- if (!session) {
287
- return toolJson({
288
- ok: false,
289
- error: "Session not found locally. Make sure you started it with local_browser_start.",
290
- sessionId: input.sessionId
291
- });
292
- }
293
- const response = await fetch(`${apiUrl}/local-browser/sessions/${input.sessionId}/run`, {
294
- method: "POST",
295
- headers: {
296
- "Content-Type": "application/json",
297
- Authorization: `Bearer ${token}`
298
- },
299
- body: JSON.stringify({
300
- instructions: input.instructions,
301
- startUrl: input.startUrl ?? null
302
- })
303
- });
304
- if (!response.ok) {
305
- const text = await response.text();
306
- return toolJson({ ok: false, error: `Failed to start run: ${text}` });
307
- }
308
- const result = await response.json();
309
- return toolJson({
310
- ok: true,
311
- jobId: result.jobId,
312
- sessionId: result.sessionId,
313
- note: "Test run started. The cloud agent is now controlling your local browser. You can watch the browser to see the test in action."
314
- });
315
- }
316
- return toolText(`Unknown tool: ${tool}`);
317
- });
318
- const transport = new StdioServerTransport();
319
- await server.connect(transport);
320
- return new Promise(() => void 0);
321
- }
322
- async function waitForResult(input) {
323
- await streamUntilComplete(input);
324
- const response = await fetch(`${input.apiUrl}/local-tests/runs/${input.runId}`, {
325
- credentials: "include",
326
- headers: { authorization: `Bearer ${input.token}` }
327
- });
328
- const data = await response.json();
329
- const run = data?.data?.run ?? data?.run ?? data?.data;
330
- const summary = run?.summaryJson;
331
- return formatReport({ run, summary });
332
- }
333
- async function streamUntilComplete(input) {
334
- const response = await fetch(`${input.apiUrl}/local-tests/runs/${input.runId}/stream`, {
335
- headers: { authorization: `Bearer ${input.token}` }
336
- });
337
- if (!response.body) return;
338
- const reader = response.body.getReader();
339
- const decoder = new TextDecoder();
340
- const parser = createParser({
341
- onEvent: (event) => {
342
- if (event.event === "status") {
343
- try {
344
- const payload = JSON.parse(event.data);
345
- if (payload?.status === "completed" || payload?.status === "failed") {
346
- reader.cancel().catch(() => void 0);
347
- }
348
- } catch {
349
- }
350
- }
351
- if (event.event === "complete" || event.event === "error") {
352
- reader.cancel().catch(() => void 0);
353
- }
354
- }
355
- });
356
- while (true) {
357
- const { done, value } = await reader.read();
358
- if (done) break;
359
- parser.feed(decoder.decode(value, { stream: true }));
360
- }
361
- }
362
- function formatReport(input) {
363
- if (!input.summary) {
364
- return {
365
- runId: input.run?.id,
366
- status: input.run?.status ?? "unknown",
367
- summary: "No final report available."
368
- };
369
- }
370
- const tested = Array.isArray(input.summary.testedItems) ? input.summary.testedItems : [];
371
- const status = input.summary.status ?? input.run?.status ?? "unknown";
372
- const issues = status === "issues_found" ? input.summary.notes ? [input.summary.notes] : ["Issues reported."] : [];
373
- return {
374
- runId: input.run?.id,
375
- status,
376
- summary: input.summary.summary ?? "Run completed.",
377
- testedItems: tested,
378
- issues,
379
- notes: input.summary.notes ?? null
380
- };
381
- }
382
- export {
383
- runMcp
384
- };
385
- //# sourceMappingURL=mcp-LKHFYMA6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/mcp.ts"],"sourcesContent":["import process from \"node:process\";\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { CallToolRequestSchema, ListToolsRequestSchema } from \"@modelcontextprotocol/sdk/types.js\";\nimport { createParser, type EventSourceMessage } from \"eventsource-parser\";\nimport { readStoredToken } from \"./auth\";\nimport { createLocalRun } from \"./local-run\";\nimport { connectTunnel, createTunnel } from \"./tunnel\";\nimport { LocalBrowserHost } from \"./local-browser/host\";\nimport type { LocalBrowserMode } from \"./local-browser/protocol\";\n\ntype RunLocalInput = {\n port: number;\n instructions: string;\n title?: string;\n};\n\ntype WaitForRunInput = {\n runId: string;\n};\n\ntype LocalBrowserStartInput = {\n mode?: LocalBrowserMode;\n cdpUrl?: string;\n headless?: boolean;\n storageStatePath?: string;\n instructions?: string;\n};\n\ntype LocalBrowserStopInput = {\n sessionId: string;\n};\n\ntype LocalBrowserStatusInput = {\n sessionId: string;\n};\n\ninterface BrowserSession {\n sessionId: string;\n host: LocalBrowserHost;\n startedAt: number;\n mode: LocalBrowserMode;\n}\n\n// Global browser sessions managed by MCP\nconst browserSessions = new Map<string, BrowserSession>();\n\nconst DEFAULT_API_URL = \"https://api.trycanary.ai\";\n\nfunction resolveApiUrl(input?: string): string {\n return input ?? process.env.CANARY_API_URL ?? DEFAULT_API_URL;\n}\n\nasync function resolveToken(): Promise<string> {\n const token = process.env.CANARY_API_TOKEN ?? (await readStoredToken());\n if (!token) {\n throw new Error(\"Missing token. Run `canary login` first or set CANARY_API_TOKEN.\");\n }\n return token;\n}\n\nfunction toolText(text: string) {\n return { content: [{ type: \"text\", text }] };\n}\n\nfunction toolJson(data: unknown) {\n return { content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }] };\n}\n\nexport async function runMcp(argv: string[]) {\n const server = new Server(\n { name: \"canary-cli\", version: \"0.1.0\" },\n { capabilities: { tools: {} } }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n {\n name: \"local_run_tests\",\n description:\n \"Start an async local test run. A tunnel is opened automatically. Returns runId and watchUrl.\",\n inputSchema: {\n type: \"object\",\n properties: {\n port: { type: \"number\" },\n instructions: { type: \"string\" },\n title: { type: \"string\" },\n },\n required: [\"port\", \"instructions\"],\n },\n },\n {\n name: \"local_wait_for_results\",\n description:\n \"Wait for a local test run to complete. Streams until completion and returns a compact report.\",\n inputSchema: {\n type: \"object\",\n properties: {\n runId: { type: \"string\" },\n },\n required: [\"runId\"],\n },\n },\n {\n name: \"local_browser_start\",\n description:\n \"Start a local browser session that connects to the cloud agent. The cloud agent can then control this browser to test local applications. Returns sessionId for tracking.\",\n inputSchema: {\n type: \"object\",\n properties: {\n mode: {\n type: \"string\",\n enum: [\"playwright\", \"cdp\"],\n description: \"Browser mode: 'playwright' for fresh browser, 'cdp' to connect to existing Chrome\",\n },\n cdpUrl: {\n type: \"string\",\n description: \"CDP endpoint URL when mode is 'cdp' (e.g. http://localhost:9222)\",\n },\n headless: {\n type: \"boolean\",\n description: \"Run browser headless (default: true for playwright mode)\",\n },\n storageStatePath: {\n type: \"string\",\n description: \"Path to Playwright storage state JSON for pre-authenticated sessions\",\n },\n instructions: {\n type: \"string\",\n description: \"Instructions for the cloud agent on what to test\",\n },\n },\n },\n },\n {\n name: \"local_browser_status\",\n description: \"Check the status of a local browser session.\",\n inputSchema: {\n type: \"object\",\n properties: {\n sessionId: { type: \"string\" },\n },\n required: [\"sessionId\"],\n },\n },\n {\n name: \"local_browser_stop\",\n description: \"Stop a local browser session and close the browser.\",\n inputSchema: {\n type: \"object\",\n properties: {\n sessionId: { type: \"string\" },\n },\n required: [\"sessionId\"],\n },\n },\n {\n name: \"local_browser_list\",\n description: \"List all active local browser sessions.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n },\n {\n name: \"local_browser_run\",\n description:\n \"Start a test run on an active local browser session. The cloud agent will control the local browser according to the instructions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n sessionId: {\n type: \"string\",\n description: \"The session ID from local_browser_start\",\n },\n instructions: {\n type: \"string\",\n description: \"Instructions for the cloud agent on what to test\",\n },\n startUrl: {\n type: \"string\",\n description: \"Optional URL to navigate to before starting\",\n },\n },\n required: [\"sessionId\", \"instructions\"],\n },\n },\n ],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (req) => {\n const token = await resolveToken();\n const tool = req.params.name;\n\n if (tool === \"local_run_tests\") {\n const input = req.params.arguments as RunLocalInput;\n const apiUrl = resolveApiUrl();\n const tunnel = await createTunnel({ apiUrl, token, port: input.port });\n connectTunnel({\n apiUrl,\n tunnelId: tunnel.tunnelId,\n token: tunnel.token,\n port: input.port,\n });\n const tunnelUrl = tunnel.publicUrl;\n\n const run = await createLocalRun({\n apiUrl,\n token,\n title: input.title ?? \"Local MCP run\",\n featureSpec: input.instructions,\n startUrl: undefined,\n tunnelUrl,\n });\n\n return toolJson({\n runId: run.runId,\n watchUrl: run.watchUrl,\n tunnelUrl,\n note:\n \"Testing is asynchronous. Use local_wait_for_results with the runId to wait for completion.\",\n });\n }\n\n if (tool === \"local_wait_for_results\") {\n const input = req.params.arguments as WaitForRunInput;\n const apiUrl = resolveApiUrl();\n const report = await waitForResult({ apiUrl, token, runId: input.runId });\n return toolJson(report);\n }\n\n if (tool === \"local_browser_start\") {\n const input = req.params.arguments as LocalBrowserStartInput;\n const apiUrl = resolveApiUrl();\n const mode = input.mode ?? \"playwright\";\n\n // Create session with cloud API\n const sessionResponse = await fetch(`${apiUrl}/local-browser/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n browserMode: mode,\n instructions: input.instructions ?? null,\n }),\n });\n\n if (!sessionResponse.ok) {\n const text = await sessionResponse.text();\n return toolJson({ ok: false, error: `Failed to create session: ${text}` });\n }\n\n const session = (await sessionResponse.json()) as {\n ok: boolean;\n sessionId: string;\n wsToken: string;\n expiresAt: string;\n };\n\n // Start the local browser host\n const host = new LocalBrowserHost({\n apiUrl,\n wsToken: session.wsToken,\n sessionId: session.sessionId,\n browserMode: mode,\n cdpUrl: input.cdpUrl,\n headless: input.headless ?? true,\n storageStatePath: input.storageStatePath,\n onLog: (level, message) => {\n // Silent logging for MCP context\n if (level === \"error\") {\n console.error(`[LocalBrowser] ${message}`);\n }\n },\n });\n\n // Start in background\n host.start().catch((err) => {\n console.error(\"Failed to start local browser:\", err);\n browserSessions.delete(session.sessionId);\n });\n\n browserSessions.set(session.sessionId, {\n sessionId: session.sessionId,\n host,\n startedAt: Date.now(),\n mode,\n });\n\n return toolJson({\n ok: true,\n sessionId: session.sessionId,\n mode,\n expiresAt: session.expiresAt,\n note: \"Browser session started. The cloud agent can now control this browser. Use local_browser_stop to end the session.\",\n });\n }\n\n if (tool === \"local_browser_status\") {\n const input = req.params.arguments as LocalBrowserStatusInput;\n const session = browserSessions.get(input.sessionId);\n\n if (!session) {\n return toolJson({ ok: false, error: \"Session not found\", sessionId: input.sessionId });\n }\n\n return toolJson({\n ok: true,\n sessionId: session.sessionId,\n mode: session.mode,\n startedAt: new Date(session.startedAt).toISOString(),\n uptimeMs: Date.now() - session.startedAt,\n });\n }\n\n if (tool === \"local_browser_stop\") {\n const input = req.params.arguments as LocalBrowserStopInput;\n const session = browserSessions.get(input.sessionId);\n\n if (!session) {\n return toolJson({ ok: false, error: \"Session not found\", sessionId: input.sessionId });\n }\n\n await session.host.stop();\n browserSessions.delete(input.sessionId);\n\n return toolJson({\n ok: true,\n sessionId: input.sessionId,\n note: \"Browser session stopped and browser closed.\",\n });\n }\n\n if (tool === \"local_browser_list\") {\n const sessions = Array.from(browserSessions.values()).map((s) => ({\n sessionId: s.sessionId,\n mode: s.mode,\n startedAt: new Date(s.startedAt).toISOString(),\n uptimeMs: Date.now() - s.startedAt,\n }));\n\n return toolJson({\n ok: true,\n count: sessions.length,\n sessions,\n });\n }\n\n if (tool === \"local_browser_run\") {\n const input = req.params.arguments as {\n sessionId: string;\n instructions: string;\n startUrl?: string;\n };\n const apiUrl = resolveApiUrl();\n\n // Verify session is active locally\n const session = browserSessions.get(input.sessionId);\n if (!session) {\n return toolJson({\n ok: false,\n error: \"Session not found locally. Make sure you started it with local_browser_start.\",\n sessionId: input.sessionId,\n });\n }\n\n // Call the API to start the run\n const response = await fetch(`${apiUrl}/local-browser/sessions/${input.sessionId}/run`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify({\n instructions: input.instructions,\n startUrl: input.startUrl ?? null,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n return toolJson({ ok: false, error: `Failed to start run: ${text}` });\n }\n\n const result = (await response.json()) as { ok: boolean; jobId: string; sessionId: string };\n\n return toolJson({\n ok: true,\n jobId: result.jobId,\n sessionId: result.sessionId,\n note: \"Test run started. The cloud agent is now controlling your local browser. You can watch the browser to see the test in action.\",\n });\n }\n\n return toolText(`Unknown tool: ${tool}`);\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n return new Promise<void>(() => undefined);\n}\n\nasync function waitForResult(input: { apiUrl: string; token: string; runId: string }) {\n await streamUntilComplete(input);\n const response = await fetch(`${input.apiUrl}/local-tests/runs/${input.runId}`, {\n credentials: \"include\",\n headers: { authorization: `Bearer ${input.token}` },\n });\n const data = await response.json();\n const run = data?.data?.run ?? data?.run ?? data?.data;\n const summary = run?.summaryJson;\n return formatReport({ run, summary });\n}\n\nasync function streamUntilComplete(input: { apiUrl: string; token: string; runId: string }) {\n const response = await fetch(`${input.apiUrl}/local-tests/runs/${input.runId}/stream`, {\n headers: { authorization: `Bearer ${input.token}` },\n });\n\n if (!response.body) return;\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parser = createParser({\n onEvent: (event: EventSourceMessage) => {\n if (event.event === \"status\") {\n try {\n const payload = JSON.parse(event.data);\n if (payload?.status === \"completed\" || payload?.status === \"failed\") {\n reader.cancel().catch(() => undefined);\n }\n } catch {}\n }\n if (event.event === \"complete\" || event.event === \"error\") {\n reader.cancel().catch(() => undefined);\n }\n },\n });\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n parser.feed(decoder.decode(value, { stream: true }));\n }\n}\n\nfunction formatReport(input: { run: any; summary: any }) {\n if (!input.summary) {\n return {\n runId: input.run?.id,\n status: input.run?.status ?? \"unknown\",\n summary: \"No final report available.\",\n };\n }\n\n const tested = Array.isArray(input.summary.testedItems) ? input.summary.testedItems : [];\n const status = input.summary.status ?? input.run?.status ?? \"unknown\";\n const issues =\n status === \"issues_found\"\n ? (input.summary.notes ? [input.summary.notes] : [\"Issues reported.\"])\n : [];\n\n return {\n runId: input.run?.id,\n status,\n summary: input.summary.summary ?? \"Run completed.\",\n testedItems: tested,\n issues,\n notes: input.summary.notes ?? null,\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,12 +0,0 @@
1
- import {
2
- extractPdfText,
3
- extractPdfTextFromBuffer,
4
- setPdfExtractLogger
5
- } from "./chunk-OE6O7H45.js";
6
- import "./chunk-PLDDJCW6.js";
7
- export {
8
- extractPdfText,
9
- extractPdfTextFromBuffer,
10
- setPdfExtractLogger
11
- };
12
- //# sourceMappingURL=pdf-extract-YIDRKYUD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}