@john523100/vela-mcp 0.6.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.
- package/README.md +91 -0
- package/dist/adapter.d.ts +31 -0
- package/dist/adapter.js +32 -0
- package/dist/adapter.js.map +1 -0
- package/dist/capture.d.ts +41 -0
- package/dist/capture.js +96 -0
- package/dist/capture.js.map +1 -0
- package/dist/cdp.d.ts +18 -0
- package/dist/cdp.js +60 -0
- package/dist/cdp.js.map +1 -0
- package/dist/debug.d.ts +40 -0
- package/dist/debug.js +133 -0
- package/dist/debug.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +146 -0
- package/dist/index.js.map +1 -0
- package/dist/launcher.d.ts +17 -0
- package/dist/launcher.js +128 -0
- package/dist/launcher.js.map +1 -0
- package/dist/ports.d.ts +2 -0
- package/dist/ports.js +22 -0
- package/dist/ports.js.map +1 -0
- package/dist/probe.d.ts +15 -0
- package/dist/probe.js +40 -0
- package/dist/probe.js.map +1 -0
- package/dist/session.d.ts +26 -0
- package/dist/session.js +31 -0
- package/dist/session.js.map +1 -0
- package/dist/spec.d.ts +39 -0
- package/dist/spec.js +116 -0
- package/dist/spec.js.map +1 -0
- package/dist/targets.d.ts +24 -0
- package/dist/targets.js +29 -0
- package/dist/targets.js.map +1 -0
- package/dist/tools/capture.d.ts +21 -0
- package/dist/tools/capture.js +30 -0
- package/dist/tools/capture.js.map +1 -0
- package/dist/tools/debug.d.ts +50 -0
- package/dist/tools/debug.js +65 -0
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/eval.d.ts +9 -0
- package/dist/tools/eval.js +7 -0
- package/dist/tools/eval.js.map +1 -0
- package/dist/tools/ipc.d.ts +14 -0
- package/dist/tools/ipc.js +19 -0
- package/dist/tools/ipc.js.map +1 -0
- package/dist/tools/launch.d.ts +16 -0
- package/dist/tools/launch.js +20 -0
- package/dist/tools/launch.js.map +1 -0
- package/dist/tools/main.d.ts +7 -0
- package/dist/tools/main.js +12 -0
- package/dist/tools/main.js.map +1 -0
- package/dist/tools/screenshot.d.ts +7 -0
- package/dist/tools/screenshot.js +16 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/spec.d.ts +18 -0
- package/dist/tools/spec.js +14 -0
- package/dist/tools/spec.js.map +1 -0
- package/dist/tools/targets.d.ts +13 -0
- package/dist/tools/targets.js +15 -0
- package/dist/tools/targets.js.map +1 -0
- package/package.json +51 -0
package/dist/spec.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../src/spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface CdpTarget {
|
|
2
|
+
id: string;
|
|
3
|
+
type: string;
|
|
4
|
+
url: string;
|
|
5
|
+
title: string;
|
|
6
|
+
webSocketDebuggerUrl: string;
|
|
7
|
+
parentId?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface NamedTarget extends CdpTarget {
|
|
10
|
+
name: string;
|
|
11
|
+
}
|
|
12
|
+
/** Pick the renderer page target, skipping devtools pages and non-page targets. */
|
|
13
|
+
export declare function pickPageTarget(targets: CdpTarget[]): CdpTarget | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Assign stable logical names to CDP targets.
|
|
16
|
+
* - `<webview>` guests (type "webview") -> "webview#N"
|
|
17
|
+
* - the primary window renderer -> "renderer" (the page that parents a webview, else the first page)
|
|
18
|
+
* - other pages (incl. BrowserView/WebContentsView) -> "page#N"
|
|
19
|
+
* Devtools pages and targets without a websocket URL are dropped.
|
|
20
|
+
*
|
|
21
|
+
* Note: a WebContentsView/BrowserView is indistinguishable from a window renderer via /json
|
|
22
|
+
* alone, so it surfaces as "page#N". Authoritative role labelling arrives in P2 via the dev probe.
|
|
23
|
+
*/
|
|
24
|
+
export declare function nameTargets(targets: CdpTarget[]): NamedTarget[];
|
package/dist/targets.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Pick the renderer page target, skipping devtools pages and non-page targets. */
|
|
2
|
+
export function pickPageTarget(targets) {
|
|
3
|
+
return targets.find((t) => t.type === "page" && !t.url.startsWith("devtools://"));
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Assign stable logical names to CDP targets.
|
|
7
|
+
* - `<webview>` guests (type "webview") -> "webview#N"
|
|
8
|
+
* - the primary window renderer -> "renderer" (the page that parents a webview, else the first page)
|
|
9
|
+
* - other pages (incl. BrowserView/WebContentsView) -> "page#N"
|
|
10
|
+
* Devtools pages and targets without a websocket URL are dropped.
|
|
11
|
+
*
|
|
12
|
+
* Note: a WebContentsView/BrowserView is indistinguishable from a window renderer via /json
|
|
13
|
+
* alone, so it surfaces as "page#N". Authoritative role labelling arrives in P2 via the dev probe.
|
|
14
|
+
*/
|
|
15
|
+
export function nameTargets(targets) {
|
|
16
|
+
const usable = targets.filter((t) => t.webSocketDebuggerUrl && !t.url.startsWith("devtools://"));
|
|
17
|
+
const webviews = usable.filter((t) => t.type === "webview");
|
|
18
|
+
const pages = usable.filter((t) => t.type === "page");
|
|
19
|
+
const webviewParentIds = new Set(webviews.map((w) => w.parentId).filter((id) => Boolean(id)));
|
|
20
|
+
const rendererId = pages.find((p) => webviewParentIds.has(p.id))?.id ?? pages[0]?.id;
|
|
21
|
+
const named = [];
|
|
22
|
+
let pageIdx = 0;
|
|
23
|
+
for (const p of pages) {
|
|
24
|
+
named.push({ ...p, name: p.id === rendererId ? "renderer" : `page#${pageIdx++}` });
|
|
25
|
+
}
|
|
26
|
+
webviews.forEach((w, i) => named.push({ ...w, name: `webview#${i}` }));
|
|
27
|
+
return named;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../src/targets.ts"],"names":[],"mappings":"AAaA,mFAAmF;AACnF,MAAM,UAAU,cAAc,CAAC,OAAoB;IACjD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,OAAoB;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAClE,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAEtD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAC1E,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAErF,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SessionRegistry } from "../session.js";
|
|
2
|
+
import { CaptureRegistry, type CaptureSnapshot } from "../capture.js";
|
|
3
|
+
export declare function captureStartTool(registry: SessionRegistry, capReg: CaptureRegistry, args: {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
target?: string;
|
|
6
|
+
console?: boolean;
|
|
7
|
+
network?: boolean;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
capturing: true;
|
|
10
|
+
target: string;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function captureReadTool(capReg: CaptureRegistry, args: {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
target?: string;
|
|
15
|
+
}): Promise<CaptureSnapshot>;
|
|
16
|
+
export declare function captureStopTool(capReg: CaptureRegistry, args: {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
target?: string;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
stopped: true;
|
|
21
|
+
}>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { CaptureSession } from "../capture.js";
|
|
2
|
+
import { CdpClient } from "../cdp.js";
|
|
3
|
+
function key(sessionId, target) {
|
|
4
|
+
return `${sessionId}:${target}`;
|
|
5
|
+
}
|
|
6
|
+
async function resolveWs(registry, sessionId, target) {
|
|
7
|
+
const session = registry.get(sessionId);
|
|
8
|
+
const named = await new CdpClient(session.port).listNamed();
|
|
9
|
+
const t = named.find((n) => n.name === target);
|
|
10
|
+
if (!t)
|
|
11
|
+
throw new Error(`Unknown target "${target}". Available: ${named.map((n) => n.name).join(", ")}`);
|
|
12
|
+
return t.webSocketDebuggerUrl;
|
|
13
|
+
}
|
|
14
|
+
export async function captureStartTool(registry, capReg, args) {
|
|
15
|
+
const target = args.target ?? "renderer";
|
|
16
|
+
const ws = await resolveWs(registry, args.sessionId, target);
|
|
17
|
+
const session = await CaptureSession.start(ws, { console: args.console, network: args.network });
|
|
18
|
+
capReg.set(key(args.sessionId, target), session);
|
|
19
|
+
return { capturing: true, target };
|
|
20
|
+
}
|
|
21
|
+
export async function captureReadTool(capReg, args) {
|
|
22
|
+
const target = args.target ?? "renderer";
|
|
23
|
+
return capReg.get(key(args.sessionId, target)).snapshot();
|
|
24
|
+
}
|
|
25
|
+
export async function captureStopTool(capReg, args) {
|
|
26
|
+
const target = args.target ?? "renderer";
|
|
27
|
+
await capReg.remove(key(args.sessionId, target));
|
|
28
|
+
return { stopped: true };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=capture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/tools/capture.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,cAAc,EAAwB,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,SAAS,GAAG,CAAC,SAAiB,EAAE,MAAc;IAC5C,OAAO,GAAG,SAAS,IAAI,MAAM,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,QAAyB,EAAE,SAAiB,EAAE,MAAc;IACnF,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;IAC5D,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,iBAAiB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzG,OAAO,CAAC,CAAC,oBAAoB,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAyB,EACzB,MAAuB,EACvB,IAAkF;IAElF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IACzC,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACjG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;IACjD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAuB,EACvB,IAA4C;IAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IACzC,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAuB,EACvB,IAA4C;IAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;IACzC,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { SessionRegistry } from "../session.js";
|
|
2
|
+
import { DebugRegistry, type PausedInfo } from "../debug.js";
|
|
3
|
+
export declare function debugAttachTool(registry: SessionRegistry, debugReg: DebugRegistry, args: {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
target: string;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
attached: true;
|
|
8
|
+
target: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function debugSetBreakpointTool(debugReg: DebugRegistry, args: {
|
|
11
|
+
sessionId: string;
|
|
12
|
+
target: string;
|
|
13
|
+
urlRegex: string;
|
|
14
|
+
line: number;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
breakpointId: string;
|
|
17
|
+
locations: number;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function debugWaitPausedTool(debugReg: DebugRegistry, args: {
|
|
20
|
+
sessionId: string;
|
|
21
|
+
target: string;
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}): Promise<PausedInfo>;
|
|
24
|
+
export declare function debugEvalFrameTool(debugReg: DebugRegistry, args: {
|
|
25
|
+
sessionId: string;
|
|
26
|
+
target: string;
|
|
27
|
+
frameIndex?: number;
|
|
28
|
+
expression: string;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
value: unknown;
|
|
31
|
+
}>;
|
|
32
|
+
export declare function debugStepTool(debugReg: DebugRegistry, args: {
|
|
33
|
+
sessionId: string;
|
|
34
|
+
target: string;
|
|
35
|
+
kind?: "over" | "into" | "out";
|
|
36
|
+
}): Promise<{
|
|
37
|
+
stepped: "over" | "into" | "out";
|
|
38
|
+
}>;
|
|
39
|
+
export declare function debugResumeTool(debugReg: DebugRegistry, args: {
|
|
40
|
+
sessionId: string;
|
|
41
|
+
target: string;
|
|
42
|
+
}): Promise<{
|
|
43
|
+
resumed: true;
|
|
44
|
+
}>;
|
|
45
|
+
export declare function debugDetachTool(debugReg: DebugRegistry, args: {
|
|
46
|
+
sessionId: string;
|
|
47
|
+
target: string;
|
|
48
|
+
}): Promise<{
|
|
49
|
+
detached: true;
|
|
50
|
+
}>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { DebugSession } from "../debug.js";
|
|
2
|
+
import { CdpClient } from "../cdp.js";
|
|
3
|
+
function key(sessionId, target) {
|
|
4
|
+
return `${sessionId}:${target}`;
|
|
5
|
+
}
|
|
6
|
+
/** Resolve the websocket debugger URL for a logical target ("main" → node inspector). */
|
|
7
|
+
async function resolveWsUrl(registry, sessionId, target) {
|
|
8
|
+
const session = registry.get(sessionId);
|
|
9
|
+
if (target === "main") {
|
|
10
|
+
if (!session.inspectPort)
|
|
11
|
+
throw new Error("No main-process inspector port for this session");
|
|
12
|
+
// The Node inspector may need a beat to start serving /json after launch; poll briefly.
|
|
13
|
+
let lastErr;
|
|
14
|
+
for (let attempt = 0; attempt < 20; attempt++) {
|
|
15
|
+
try {
|
|
16
|
+
const list = (await (await fetch(`http://127.0.0.1:${session.inspectPort}/json`)).json());
|
|
17
|
+
const ws = list[0]?.webSocketDebuggerUrl;
|
|
18
|
+
if (ws)
|
|
19
|
+
return ws;
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
lastErr = e;
|
|
23
|
+
}
|
|
24
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`Main-process inspector not reachable yet${lastErr ? `: ${lastErr.message}` : ""}`);
|
|
27
|
+
}
|
|
28
|
+
const named = await new CdpClient(session.port).listNamed();
|
|
29
|
+
const t = named.find((n) => n.name === target);
|
|
30
|
+
if (!t)
|
|
31
|
+
throw new Error(`Unknown target "${target}". Available: ${named.map((n) => n.name).join(", ")}, main`);
|
|
32
|
+
return t.webSocketDebuggerUrl;
|
|
33
|
+
}
|
|
34
|
+
export async function debugAttachTool(registry, debugReg, args) {
|
|
35
|
+
const ws = await resolveWsUrl(registry, args.sessionId, args.target);
|
|
36
|
+
const ds = await DebugSession.attachToWs(ws);
|
|
37
|
+
debugReg.set(key(args.sessionId, args.target), ds);
|
|
38
|
+
return { attached: true, target: args.target };
|
|
39
|
+
}
|
|
40
|
+
export async function debugSetBreakpointTool(debugReg, args) {
|
|
41
|
+
return debugReg.get(key(args.sessionId, args.target)).setBreakpoint(args.urlRegex, args.line);
|
|
42
|
+
}
|
|
43
|
+
export async function debugWaitPausedTool(debugReg, args) {
|
|
44
|
+
return debugReg.get(key(args.sessionId, args.target)).waitPaused(args.timeoutMs ?? 10_000);
|
|
45
|
+
}
|
|
46
|
+
export async function debugEvalFrameTool(debugReg, args) {
|
|
47
|
+
const value = await debugReg
|
|
48
|
+
.get(key(args.sessionId, args.target))
|
|
49
|
+
.evalOnFrame(args.frameIndex ?? 0, args.expression);
|
|
50
|
+
return { value };
|
|
51
|
+
}
|
|
52
|
+
export async function debugStepTool(debugReg, args) {
|
|
53
|
+
const kind = args.kind ?? "over";
|
|
54
|
+
await debugReg.get(key(args.sessionId, args.target)).step(kind);
|
|
55
|
+
return { stepped: kind };
|
|
56
|
+
}
|
|
57
|
+
export async function debugResumeTool(debugReg, args) {
|
|
58
|
+
await debugReg.get(key(args.sessionId, args.target)).resume();
|
|
59
|
+
return { resumed: true };
|
|
60
|
+
}
|
|
61
|
+
export async function debugDetachTool(debugReg, args) {
|
|
62
|
+
await debugReg.remove(key(args.sessionId, args.target));
|
|
63
|
+
return { detached: true };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/tools/debug.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CdpClient } from "../cdp.js";
|
|
2
|
+
export async function evalTool(registry, args) {
|
|
3
|
+
const session = registry.get(args.sessionId);
|
|
4
|
+
const cdp = new CdpClient(session.port);
|
|
5
|
+
return cdp.evaluate(args.expression, args.awaitPromise ?? true, args.target ?? "renderer");
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../src/tools/eval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAyB,EACzB,IAAwF;IAExF,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC;AAC7F,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SessionRegistry } from "../session.js";
|
|
2
|
+
import { type IpcChannelInfo } from "../probe.js";
|
|
3
|
+
export declare function ipcListTool(registry: SessionRegistry, args: {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
}): Promise<{
|
|
6
|
+
channels: IpcChannelInfo[];
|
|
7
|
+
}>;
|
|
8
|
+
export declare function ipcInvokeTool(registry: SessionRegistry, args: {
|
|
9
|
+
sessionId: string;
|
|
10
|
+
channel: string;
|
|
11
|
+
args?: unknown[];
|
|
12
|
+
}): Promise<{
|
|
13
|
+
result: unknown;
|
|
14
|
+
}>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ProbeClient } from "../probe.js";
|
|
2
|
+
const NO_PROBE = "This session has no Vela probe. Add `vela-agent` (devDependency) and call " +
|
|
3
|
+
"`require('vela-agent').attach()` at the top of the app's main process (dev). " +
|
|
4
|
+
"CDP tools (vela_eval/vela_screenshot/vela_targets) work without it.";
|
|
5
|
+
function probeFor(registry, sessionId) {
|
|
6
|
+
const session = registry.get(sessionId);
|
|
7
|
+
if (!session.probe)
|
|
8
|
+
throw new Error(NO_PROBE);
|
|
9
|
+
return new ProbeClient(session.probe.port, session.probe.token);
|
|
10
|
+
}
|
|
11
|
+
export async function ipcListTool(registry, args) {
|
|
12
|
+
const channels = await probeFor(registry, args.sessionId).ipcList();
|
|
13
|
+
return { channels };
|
|
14
|
+
}
|
|
15
|
+
export async function ipcInvokeTool(registry, args) {
|
|
16
|
+
const result = await probeFor(registry, args.sessionId).ipcInvoke(args.channel, args.args ?? []);
|
|
17
|
+
return { result };
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=ipc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../src/tools/ipc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAuB,MAAM,aAAa,CAAC;AAE/D,MAAM,QAAQ,GACZ,4EAA4E;IAC5E,+EAA+E;IAC/E,qEAAqE,CAAC;AAExE,SAAS,QAAQ,CAAC,QAAyB,EAAE,SAAiB;IAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAyB,EACzB,IAA2B;IAE3B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACpE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAyB,EACzB,IAA8D;IAE9D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACjG,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SessionRegistry } from "../session.js";
|
|
2
|
+
export interface LaunchResult {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
port: number;
|
|
5
|
+
targets: Array<{
|
|
6
|
+
id: string;
|
|
7
|
+
type: string;
|
|
8
|
+
url: string;
|
|
9
|
+
title: string;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
export declare function launchTool(registry: SessionRegistry, args: {
|
|
13
|
+
projectPath?: string;
|
|
14
|
+
mode?: "launch" | "attach";
|
|
15
|
+
port?: number;
|
|
16
|
+
}): Promise<LaunchResult>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CdpClient } from "../cdp.js";
|
|
2
|
+
import { ElectronAdapter, AttachAdapter } from "../adapter.js";
|
|
3
|
+
export async function launchTool(registry, args) {
|
|
4
|
+
const adapter = args.mode === "attach" ? new AttachAdapter() : new ElectronAdapter();
|
|
5
|
+
const handle = await adapter.launch({ projectPath: args.projectPath, port: args.port });
|
|
6
|
+
const sessionId = registry.register({
|
|
7
|
+
projectPath: args.projectPath ?? `attach:${handle.cdpPort}`,
|
|
8
|
+
port: handle.cdpPort,
|
|
9
|
+
inspectPort: handle.inspectPort,
|
|
10
|
+
probe: handle.probe,
|
|
11
|
+
dispose: handle.dispose
|
|
12
|
+
});
|
|
13
|
+
const targets = await new CdpClient(handle.cdpPort).listTargets();
|
|
14
|
+
return {
|
|
15
|
+
sessionId,
|
|
16
|
+
port: handle.cdpPort,
|
|
17
|
+
targets: targets.map((t) => ({ id: t.id, type: t.type, url: t.url, title: t.title }))
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=launch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/tools/launch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAsB,MAAM,eAAe,CAAC;AAQnF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,QAAyB,EACzB,IAAyE;IAEzE,MAAM,OAAO,GAAkB,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC;IACpG,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAClC,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,UAAU,MAAM,CAAC,OAAO,EAAE;QAC3D,IAAI,EAAE,MAAM,CAAC,OAAO;QACpB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,OAAO;QACL,SAAS;QACT,IAAI,EAAE,MAAM,CAAC,OAAO;QACpB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;KACtF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ProbeClient } from "../probe.js";
|
|
2
|
+
const NO_PROBE = "This session has no Vela probe. Add `vela-agent` (devDependency) and call " +
|
|
3
|
+
"`require('vela-agent').attach()` at the top of the app's main process (dev). " +
|
|
4
|
+
"CDP tools (vela_eval/vela_screenshot/vela_targets) work without it.";
|
|
5
|
+
export async function mainEvalTool(registry, args) {
|
|
6
|
+
const session = registry.get(args.sessionId);
|
|
7
|
+
if (!session.probe)
|
|
8
|
+
throw new Error(NO_PROBE);
|
|
9
|
+
const value = await new ProbeClient(session.probe.port, session.probe.token).mainEval(args.code);
|
|
10
|
+
return { value };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/tools/main.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,QAAQ,GACZ,4EAA4E;IAC5E,+EAA+E;IAC/E,qEAAqE,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAyB,EACzB,IAAyC;IAEzC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjG,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { CdpClient } from "../cdp.js";
|
|
6
|
+
export async function screenshotTool(registry, args) {
|
|
7
|
+
const session = registry.get(args.sessionId);
|
|
8
|
+
const cdp = new CdpClient(session.port);
|
|
9
|
+
const base64 = await cdp.screenshotBase64(args.target ?? "renderer");
|
|
10
|
+
const dir = path.join(os.tmpdir(), "vela", args.sessionId);
|
|
11
|
+
await fs.mkdir(dir, { recursive: true });
|
|
12
|
+
const file = path.join(dir, `screenshot-${randomUUID()}.png`);
|
|
13
|
+
await fs.writeFile(file, Buffer.from(base64, "base64"));
|
|
14
|
+
return { path: file };
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=screenshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../src/tools/screenshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAyB,EACzB,IAA4C;IAE5C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type SpecStep, type SpecReport } from "../spec.js";
|
|
2
|
+
export declare function specSaveTool(args: {
|
|
3
|
+
name: string;
|
|
4
|
+
projectPath: string;
|
|
5
|
+
steps: SpecStep[];
|
|
6
|
+
specsDir?: string;
|
|
7
|
+
}): Promise<{
|
|
8
|
+
saved: string;
|
|
9
|
+
}>;
|
|
10
|
+
export declare function specRunTool(args: {
|
|
11
|
+
name: string;
|
|
12
|
+
specsDir?: string;
|
|
13
|
+
}): Promise<SpecReport>;
|
|
14
|
+
export declare function specListTool(args: {
|
|
15
|
+
specsDir?: string;
|
|
16
|
+
}): Promise<{
|
|
17
|
+
specs: string[];
|
|
18
|
+
}>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { saveSpec, loadSpec, listSpecs, runSpec } from "../spec.js";
|
|
2
|
+
export async function specSaveTool(args) {
|
|
3
|
+
const spec = { name: args.name, projectPath: args.projectPath, steps: args.steps };
|
|
4
|
+
const file = await saveSpec(spec, args.specsDir);
|
|
5
|
+
return { saved: file };
|
|
6
|
+
}
|
|
7
|
+
export async function specRunTool(args) {
|
|
8
|
+
const spec = await loadSpec(args.name, args.specsDir);
|
|
9
|
+
return runSpec(spec);
|
|
10
|
+
}
|
|
11
|
+
export async function specListTool(args) {
|
|
12
|
+
return { specs: await listSpecs(args.specsDir) };
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/tools/spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAA6C,MAAM,YAAY,CAAC;AAE/G,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAKlC;IACC,MAAM,IAAI,GAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACzF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAyC;IACzE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAA2B;IAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SessionRegistry } from "../session.js";
|
|
2
|
+
export interface TargetInfo {
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
url: string;
|
|
6
|
+
title: string;
|
|
7
|
+
parentId?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function targetsTool(registry: SessionRegistry, args: {
|
|
10
|
+
sessionId: string;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
targets: TargetInfo[];
|
|
13
|
+
}>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CdpClient } from "../cdp.js";
|
|
2
|
+
export async function targetsTool(registry, args) {
|
|
3
|
+
const session = registry.get(args.sessionId);
|
|
4
|
+
const named = await new CdpClient(session.port).listNamed();
|
|
5
|
+
return {
|
|
6
|
+
targets: named.map((t) => ({
|
|
7
|
+
name: t.name,
|
|
8
|
+
type: t.type,
|
|
9
|
+
url: t.url,
|
|
10
|
+
title: t.title,
|
|
11
|
+
parentId: t.parentId
|
|
12
|
+
}))
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/tools/targets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAUtC,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAyB,EACzB,IAA2B;IAE3B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;IAC5D,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@john523100/vela-mcp",
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "AI-driven dynamic test framework for Electron apps — drive renderer, webview, BrowserView, IPC, main process, breakpoints, console/network capture, and re-runnable specs over MCP.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Vela authors <colleenkantner@gmail.com>",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"electron",
|
|
9
|
+
"testing",
|
|
10
|
+
"mcp",
|
|
11
|
+
"cdp",
|
|
12
|
+
"devtools",
|
|
13
|
+
"ai",
|
|
14
|
+
"claude",
|
|
15
|
+
"automation",
|
|
16
|
+
"debugging"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/michael-ltm/vela.git"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/michael-ltm/vela#readme",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/michael-ltm/vela/issues"
|
|
25
|
+
},
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=20"
|
|
28
|
+
},
|
|
29
|
+
"type": "module",
|
|
30
|
+
"main": "dist/index.js",
|
|
31
|
+
"bin": { "vela-mcp": "dist/index.js" },
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"README.md"
|
|
35
|
+
],
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc -p tsconfig.json",
|
|
41
|
+
"prepublishOnly": "pnpm run build"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
45
|
+
"chrome-remote-interface": "^0.33.2",
|
|
46
|
+
"zod": "^3.23.0"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/chrome-remote-interface": "^0.31.10"
|
|
50
|
+
}
|
|
51
|
+
}
|