@everydaydevopsio/pilot 0.6.3 → 0.7.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/AGENTS.md +5 -0
- package/CHANGELOG.md +16 -0
- package/README.md +19 -2
- package/dist/browser/driver/capabilities.d.ts +22 -0
- package/dist/browser/driver/capabilities.d.ts.map +1 -0
- package/dist/browser/driver/capabilities.js +70 -0
- package/dist/browser/driver/capabilities.js.map +1 -0
- package/dist/browser/driver/cdp-driver.d.ts +77 -0
- package/dist/browser/driver/cdp-driver.d.ts.map +1 -0
- package/dist/browser/driver/cdp-driver.js +190 -0
- package/dist/browser/driver/cdp-driver.js.map +1 -0
- package/dist/browser/driver/factory.d.ts +10 -0
- package/dist/browser/driver/factory.d.ts.map +1 -0
- package/dist/browser/driver/factory.js +23 -0
- package/dist/browser/driver/factory.js.map +1 -0
- package/dist/browser/driver/index.d.ts +6 -0
- package/dist/browser/driver/index.d.ts.map +1 -0
- package/dist/browser/driver/index.js +5 -0
- package/dist/browser/driver/index.js.map +1 -0
- package/dist/browser/driver/types.d.ts +106 -0
- package/dist/browser/driver/types.d.ts.map +1 -0
- package/dist/browser/driver/types.js +25 -0
- package/dist/browser/driver/types.js.map +1 -0
- package/dist/browser/types.d.ts +3 -0
- package/dist/browser/types.d.ts.map +1 -1
- package/dist/commands/connect.d.ts +2 -2
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +2 -2
- package/dist/commands/connect.js.map +1 -1
- package/dist/mcp/server.d.ts +9 -15
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +32 -74
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/browser.d.ts +2 -3
- package/dist/mcp/tools/browser.d.ts.map +1 -1
- package/dist/mcp/tools/browser.js +38 -72
- package/dist/mcp/tools/browser.js.map +1 -1
- package/dist/mcp/tools/connect.d.ts +2 -3
- package/dist/mcp/tools/connect.d.ts.map +1 -1
- package/dist/mcp/tools/connect.js +9 -9
- package/dist/mcp/tools/connect.js.map +1 -1
- package/dist/mcp/tools/driver-context.d.ts +14 -0
- package/dist/mcp/tools/driver-context.d.ts.map +1 -0
- package/dist/mcp/tools/driver-context.js +43 -0
- package/dist/mcp/tools/driver-context.js.map +1 -0
- package/dist/mcp/tools/files.d.ts.map +1 -1
- package/dist/mcp/tools/files.js +5 -15
- package/dist/mcp/tools/files.js.map +1 -1
- package/dist/mcp/tools/interaction.d.ts.map +1 -1
- package/dist/mcp/tools/interaction.js +7 -26
- package/dist/mcp/tools/interaction.js.map +1 -1
- package/dist/mcp/tools/network.d.ts.map +1 -1
- package/dist/mcp/tools/network.js +3 -11
- package/dist/mcp/tools/network.js.map +1 -1
- package/dist/mcp/tools/performance.d.ts.map +1 -1
- package/dist/mcp/tools/performance.js +2 -12
- package/dist/mcp/tools/performance.js.map +1 -1
- package/dist/mcp/tools/snapshot.d.ts.map +1 -1
- package/dist/mcp/tools/snapshot.js +3 -14
- package/dist/mcp/tools/snapshot.js.map +1 -1
- package/dist/mcp/tools/styles.d.ts.map +1 -1
- package/dist/mcp/tools/styles.js +2 -11
- package/dist/mcp/tools/styles.js.map +1 -1
- package/package.json +1 -1
- package/src/browser/driver/capabilities.ts +88 -0
- package/src/browser/driver/cdp-driver.ts +260 -0
- package/src/browser/driver/factory.ts +33 -0
- package/src/browser/driver/index.ts +22 -0
- package/src/browser/driver/types.ts +156 -0
- package/src/browser/types.ts +3 -0
- package/src/commands/connect.ts +3 -3
- package/src/mcp/server.ts +48 -91
- package/src/mcp/tools/browser.ts +39 -90
- package/src/mcp/tools/connect.ts +10 -11
- package/src/mcp/tools/driver-context.ts +56 -0
- package/src/mcp/tools/files.ts +5 -16
- package/src/mcp/tools/interaction.ts +7 -27
- package/src/mcp/tools/network.ts +2 -12
- package/src/mcp/tools/performance.ts +2 -13
- package/src/mcp/tools/snapshot.ts +3 -15
- package/src/mcp/tools/styles.ts +2 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/browser/driver/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Browsers Pilot knows about. Only `chrome` has a driver today. */
|
|
2
|
+
export const BROWSER_KINDS = ['chrome', 'firefox', 'safari', 'webkit'];
|
|
3
|
+
/**
|
|
4
|
+
* Features a driver may or may not provide. Each MCP tool declares the
|
|
5
|
+
* capabilities it needs (see capabilities.ts); a tool whose capabilities the
|
|
6
|
+
* active driver lacks fails with a CapabilityError before touching the browser.
|
|
7
|
+
*/
|
|
8
|
+
export const CAPABILITIES = [
|
|
9
|
+
'tabs',
|
|
10
|
+
'navigation',
|
|
11
|
+
'evaluate',
|
|
12
|
+
'input',
|
|
13
|
+
'screenshot',
|
|
14
|
+
'viewport',
|
|
15
|
+
'accessibilitySnapshot',
|
|
16
|
+
'styles',
|
|
17
|
+
'console',
|
|
18
|
+
'network',
|
|
19
|
+
'dialogs',
|
|
20
|
+
'uploads',
|
|
21
|
+
'downloads',
|
|
22
|
+
'performanceTrace',
|
|
23
|
+
'connectExisting'
|
|
24
|
+
];
|
|
25
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/browser/driver/types.ts"],"names":[],"mappings":"AAgDA,oEAAoE;AACpE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAC;AAGhF;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,MAAM;IACN,YAAY;IACZ,UAAU;IACV,OAAO;IACP,YAAY;IACZ,UAAU;IACV,uBAAuB;IACvB,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,WAAW;IACX,kBAAkB;IAClB,iBAAiB;CACT,CAAC"}
|
package/dist/browser/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Client } from 'chrome-remote-interface';
|
|
2
|
+
import type { BrowserKind } from './driver/types.js';
|
|
2
3
|
export type BrowserEventCallback = (event: string, data: unknown) => void;
|
|
3
4
|
export interface TabInfo {
|
|
4
5
|
targetId: string;
|
|
@@ -24,6 +25,8 @@ export interface LaunchOptions {
|
|
|
24
25
|
startupTimeoutMs?: number;
|
|
25
26
|
}
|
|
26
27
|
export interface SessionInfo {
|
|
28
|
+
/** Browser the session drives; set by the driver. */
|
|
29
|
+
browser?: BrowserKind;
|
|
27
30
|
/** launched: Chrome started by this session; external: browser_connect. */
|
|
28
31
|
mode: 'launched' | 'external' | 'none';
|
|
29
32
|
connected: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/browser/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/browser/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;AAE1E,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,2EAA2E;IAC3E,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,eAAe,GACzB;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAAA;CAAE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { BrowserDriver } from '../browser/driver/types.js';
|
|
2
2
|
import type { TabInfo } from '../browser/types.js';
|
|
3
3
|
export interface ConnectParams {
|
|
4
4
|
host?: string;
|
|
@@ -9,6 +9,6 @@ export interface ConnectResult {
|
|
|
9
9
|
port: number;
|
|
10
10
|
tabs: TabInfo[];
|
|
11
11
|
}
|
|
12
|
-
export declare function executeConnect(
|
|
12
|
+
export declare function executeConnect(driver: Pick<BrowserDriver, 'connectExisting'>, params: ConnectParams): Promise<ConnectResult>;
|
|
13
13
|
export declare function formatConnectResult(result: ConnectResult): string;
|
|
14
14
|
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,EAC9C,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,CAOxB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAajE"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export async function executeConnect(
|
|
1
|
+
export async function executeConnect(driver, params) {
|
|
2
2
|
const host = params.host ?? '127.0.0.1';
|
|
3
3
|
const port = params.port ?? 9222;
|
|
4
|
-
const { tabs } = await
|
|
4
|
+
const { tabs } = await driver.connectExisting({ host, port });
|
|
5
5
|
return { host, port, tabs };
|
|
6
6
|
}
|
|
7
7
|
export function formatConnectResult(result) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAA8C,EAC9C,MAAqB;IAErB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IAEjC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAqB;IACvD,MAAM,KAAK,GAAG;QACZ,0BAA0B,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;QACtD,EAAE;QACF,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI;KAChC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -1,26 +1,20 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import {
|
|
3
|
-
import { ElementRefMap } from '../browser/inspect/element-ref.js';
|
|
4
|
-
import { DialogQueue } from '../browser/interaction/dialogs.js';
|
|
5
|
-
import { DownloadTracker } from '../browser/interaction/downloads.js';
|
|
6
|
-
import { NetworkBuffer } from '../browser/network/network-buffer.js';
|
|
7
|
-
import { ConsoleBuffer } from './console-buffer.js';
|
|
8
|
-
import { createTraceState } from '../browser/performance/trace.js';
|
|
2
|
+
import type { BrowserDriver, DriverSession } from '../browser/driver/types.js';
|
|
9
3
|
export interface McpConfig {
|
|
10
4
|
bufferSize: number;
|
|
11
5
|
cdpPort?: number;
|
|
12
6
|
cdpHost?: string;
|
|
13
7
|
}
|
|
14
|
-
export interface BrowserContext {
|
|
15
|
-
|
|
16
|
-
consoleBuffer: ConsoleBuffer;
|
|
17
|
-
elementRefMap: ElementRefMap;
|
|
18
|
-
networkBuffer: NetworkBuffer;
|
|
19
|
-
dialogQueue: DialogQueue;
|
|
20
|
-
downloadTracker: DownloadTracker;
|
|
21
|
-
traceState: ReturnType<typeof createTraceState>;
|
|
8
|
+
export interface BrowserContext extends DriverSession {
|
|
9
|
+
driver: BrowserDriver | null;
|
|
22
10
|
baseConfig: McpConfig;
|
|
23
11
|
}
|
|
12
|
+
export type DriverFactory = () => BrowserDriver;
|
|
13
|
+
/**
|
|
14
|
+
* Register every Pilot tool behind the capability gate, so a tool the active
|
|
15
|
+
* driver cannot support fails before its handler runs.
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerAllTools(server: McpServer, context: BrowserContext, makeDriver: DriverFactory): void;
|
|
24
18
|
export declare function createMcpServer(config: McpConfig): Promise<{
|
|
25
19
|
server: McpServer;
|
|
26
20
|
cleanup: () => Promise<void>;
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAoB/E,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,aAAa,GACxB,IAAI,CAYN;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAChE,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC,CAmCD"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import {
|
|
2
|
+
import { createDriver } from '../browser/driver/factory.js';
|
|
3
3
|
import { ElementRefMap } from '../browser/inspect/element-ref.js';
|
|
4
|
-
import { resetCssState } from '../browser/inspect/styles.js';
|
|
5
4
|
import { DialogQueue } from '../browser/interaction/dialogs.js';
|
|
6
|
-
import {
|
|
7
|
-
import { DownloadTracker, enableDownloads, attachDownloadHandler } from '../browser/interaction/downloads.js';
|
|
5
|
+
import { DownloadTracker } from '../browser/interaction/downloads.js';
|
|
8
6
|
import { NetworkBuffer } from '../browser/network/network-buffer.js';
|
|
9
|
-
import { attachNetworkMonitor } from '../browser/network/network-monitor.js';
|
|
10
7
|
import { loadConfig } from '../util/config.js';
|
|
11
8
|
import { ConsoleBuffer } from './console-buffer.js';
|
|
12
9
|
import { registerBrowserTools } from './tools/browser.js';
|
|
@@ -20,86 +17,47 @@ import { registerFilesTools } from './tools/files.js';
|
|
|
20
17
|
import { createTraceState } from '../browser/performance/trace.js';
|
|
21
18
|
import { registerPerformanceTools } from './tools/performance.js';
|
|
22
19
|
import { registerConnectTools } from './tools/connect.js';
|
|
20
|
+
import { withCapabilityGate } from './tools/driver-context.js';
|
|
21
|
+
/**
|
|
22
|
+
* Register every Pilot tool behind the capability gate, so a tool the active
|
|
23
|
+
* driver cannot support fails before its handler runs.
|
|
24
|
+
*/
|
|
25
|
+
export function registerAllTools(server, context, makeDriver) {
|
|
26
|
+
const gated = withCapabilityGate(server, () => context.driver);
|
|
27
|
+
registerBrowserTools(gated, context, makeDriver);
|
|
28
|
+
registerErrorTools(gated, context.consoleBuffer);
|
|
29
|
+
registerSnapshotTools(gated, context);
|
|
30
|
+
registerInteractionTools(gated, context);
|
|
31
|
+
registerNetworkTools(gated, context);
|
|
32
|
+
registerRuntimeTools(gated, context.consoleBuffer);
|
|
33
|
+
registerStylesTools(gated, context);
|
|
34
|
+
registerFilesTools(gated, context);
|
|
35
|
+
registerPerformanceTools(gated, context);
|
|
36
|
+
registerConnectTools(gated, context, makeDriver);
|
|
37
|
+
}
|
|
23
38
|
export async function createMcpServer(config) {
|
|
24
39
|
const server = new McpServer({
|
|
25
40
|
name: 'pilot',
|
|
26
41
|
version: '0.1.0'
|
|
27
42
|
});
|
|
28
|
-
const consoleBuffer = new ConsoleBuffer(config.bufferSize);
|
|
29
|
-
const elementRefMap = new ElementRefMap();
|
|
30
|
-
const networkBuffer = new NetworkBuffer();
|
|
31
|
-
const dialogQueue = new DialogQueue();
|
|
32
|
-
const downloadTracker = new DownloadTracker();
|
|
33
|
-
const traceState = createTraceState();
|
|
34
43
|
const context = {
|
|
35
|
-
|
|
36
|
-
consoleBuffer,
|
|
37
|
-
elementRefMap,
|
|
38
|
-
networkBuffer,
|
|
39
|
-
dialogQueue,
|
|
40
|
-
downloadTracker,
|
|
41
|
-
traceState,
|
|
44
|
+
driver: null,
|
|
45
|
+
consoleBuffer: new ConsoleBuffer(config.bufferSize),
|
|
46
|
+
elementRefMap: new ElementRefMap(),
|
|
47
|
+
networkBuffer: new NetworkBuffer(),
|
|
48
|
+
dialogQueue: new DialogQueue(),
|
|
49
|
+
downloadTracker: new DownloadTracker(),
|
|
50
|
+
traceState: createTraceState(),
|
|
42
51
|
baseConfig: config
|
|
43
52
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
function ensureMonitors() {
|
|
47
|
-
const client = manager.getClient();
|
|
48
|
-
if (client && client !== monitoredClient) {
|
|
49
|
-
attachNetworkMonitor(client, networkBuffer);
|
|
50
|
-
attachDialogHandler(client, dialogQueue);
|
|
51
|
-
attachDownloadHandler(client, downloadTracker);
|
|
52
|
-
void enableDownloads(client).catch(() => {
|
|
53
|
-
// Download behavior setup may fail in some environments
|
|
54
|
-
});
|
|
55
|
-
monitoredClient = client;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
manager.setEventCallback((event, data) => {
|
|
59
|
-
if (event === 'console_message') {
|
|
60
|
-
consoleBuffer.push(data);
|
|
61
|
-
}
|
|
62
|
-
if (event === 'page_navigated') {
|
|
63
|
-
elementRefMap.invalidate();
|
|
64
|
-
}
|
|
65
|
-
if (event === 'browser_connected') {
|
|
66
|
-
ensureMonitors();
|
|
67
|
-
}
|
|
68
|
-
if (event === 'browser_disconnected') {
|
|
69
|
-
monitoredClient = null;
|
|
70
|
-
resetCssState();
|
|
71
|
-
dialogQueue.clear();
|
|
72
|
-
downloadTracker.clear();
|
|
73
|
-
}
|
|
74
|
-
// Reattach after tab switch (new client, no connect event)
|
|
75
|
-
ensureMonitors();
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
function makeBrowserManager() {
|
|
79
|
-
const browserConfig = loadConfig({
|
|
80
|
-
cdpPort: config.cdpPort,
|
|
81
|
-
cdpHost: config.cdpHost
|
|
82
|
-
});
|
|
83
|
-
const manager = new BrowserManager(browserConfig);
|
|
84
|
-
attachEventHandlers(manager);
|
|
85
|
-
return manager;
|
|
86
|
-
}
|
|
87
|
-
registerBrowserTools(server, context, makeBrowserManager);
|
|
88
|
-
registerErrorTools(server, consoleBuffer);
|
|
89
|
-
registerSnapshotTools(server, context);
|
|
90
|
-
registerInteractionTools(server, context);
|
|
91
|
-
registerNetworkTools(server, context);
|
|
92
|
-
registerRuntimeTools(server, consoleBuffer);
|
|
93
|
-
registerStylesTools(server, context);
|
|
94
|
-
registerFilesTools(server, context);
|
|
95
|
-
registerPerformanceTools(server, context);
|
|
96
|
-
registerConnectTools(server, context, makeBrowserManager);
|
|
53
|
+
const makeDriver = () => createDriver('chrome', loadConfig({ cdpPort: config.cdpPort, cdpHost: config.cdpHost }), context);
|
|
54
|
+
registerAllTools(server, context, makeDriver);
|
|
97
55
|
return {
|
|
98
56
|
server,
|
|
99
57
|
cleanup: async () => {
|
|
100
|
-
if (context.
|
|
101
|
-
await context.
|
|
102
|
-
context.
|
|
58
|
+
if (context.driver) {
|
|
59
|
+
await context.driver.destroy();
|
|
60
|
+
context.driver = null;
|
|
103
61
|
}
|
|
104
62
|
}
|
|
105
63
|
};
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
export declare function registerBrowserTools(server: McpServer, context: BrowserContext, makeBrowserManager: () => BrowserManager): void;
|
|
2
|
+
import type { BrowserContext, DriverFactory } from '../server.js';
|
|
3
|
+
export declare function registerBrowserTools(server: McpServer, context: BrowserContext, makeDriver: DriverFactory): void;
|
|
5
4
|
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/browser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/browser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAsOlE,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,aAAa,GACxB,IAAI,CAsfN"}
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { DEFAULT_STARTUP_TIMEOUT_MS } from '../../browser/chrome-launcher.js';
|
|
3
3
|
import { listProfiles, pilotDataDir, stopPilotBrowsers } from '../../browser/sessions.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { executeClick } from '../../commands/click.js';
|
|
7
|
-
import { executeType } from '../../commands/type.js';
|
|
8
|
-
import { executeEvaluate } from '../../commands/evaluate.js';
|
|
9
|
-
import { executeWait } from '../../commands/wait.js';
|
|
10
|
-
import { executePageInfo } from '../../commands/page_info.js';
|
|
11
|
-
import { executeListTabs, executeNewTab, executeCloseTab, executeSwitchTab } from '../../commands/tabs.js';
|
|
12
|
-
import { VIEWPORT_PRESETS, applyViewport } from '../../viewport.js';
|
|
4
|
+
import { VIEWPORT_PRESETS } from '../../viewport.js';
|
|
5
|
+
import { requireDriver } from './driver-context.js';
|
|
13
6
|
// Raw shapes for MCP SDK (expects ZodRawShape, not ZodObject)
|
|
14
7
|
const screenshotShape = {
|
|
15
8
|
format: z
|
|
@@ -197,17 +190,9 @@ const viewportResizeShape = {
|
|
|
197
190
|
.optional()
|
|
198
191
|
.describe('Emulate a mobile device. Defaults to the current value if omitted.')
|
|
199
192
|
};
|
|
200
|
-
function
|
|
201
|
-
const manager = context.manager;
|
|
202
|
-
if (!manager || !manager.isConnected()) {
|
|
203
|
-
throw new Error('Browser not started. Call browser_start first.');
|
|
204
|
-
}
|
|
205
|
-
const client = manager.getClient();
|
|
206
|
-
return { client, manager };
|
|
207
|
-
}
|
|
208
|
-
export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
193
|
+
export function registerBrowserTools(server, context, makeDriver) {
|
|
209
194
|
server.tool('browser_start', 'Launch the Chrome browser. Call this before using any other browser tools.', startShape, async ({ headless, chromePath, profileName, viewport, viewportWidth, viewportHeight, deviceScaleFactor, responsive, startupTimeoutMs }) => {
|
|
210
|
-
if (context.
|
|
195
|
+
if (context.driver?.isConnected()) {
|
|
211
196
|
return {
|
|
212
197
|
content: [
|
|
213
198
|
{
|
|
@@ -217,12 +202,12 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
217
202
|
]
|
|
218
203
|
};
|
|
219
204
|
}
|
|
220
|
-
if (context.
|
|
221
|
-
await context.
|
|
222
|
-
context.
|
|
205
|
+
if (context.driver) {
|
|
206
|
+
await context.driver.destroy();
|
|
207
|
+
context.driver = null;
|
|
223
208
|
}
|
|
224
|
-
const
|
|
225
|
-
const { headless: effectiveHeadless, viewport: effectiveViewport } = await
|
|
209
|
+
const driver = makeDriver();
|
|
210
|
+
const { headless: effectiveHeadless, viewport: effectiveViewport } = await driver.launch({
|
|
226
211
|
headless,
|
|
227
212
|
chromePath,
|
|
228
213
|
profileName,
|
|
@@ -233,7 +218,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
233
218
|
responsive,
|
|
234
219
|
startupTimeoutMs
|
|
235
220
|
});
|
|
236
|
-
context.
|
|
221
|
+
context.driver = driver;
|
|
237
222
|
return {
|
|
238
223
|
content: [
|
|
239
224
|
{
|
|
@@ -244,7 +229,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
244
229
|
};
|
|
245
230
|
});
|
|
246
231
|
server.tool('browser_stop', 'Stop the Chrome browser and free all resources.', {}, async () => {
|
|
247
|
-
if (!context.
|
|
232
|
+
if (!context.driver) {
|
|
248
233
|
return {
|
|
249
234
|
content: [
|
|
250
235
|
{
|
|
@@ -254,15 +239,15 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
254
239
|
]
|
|
255
240
|
};
|
|
256
241
|
}
|
|
257
|
-
await context.
|
|
258
|
-
context.
|
|
242
|
+
await context.driver.destroy();
|
|
243
|
+
context.driver = null;
|
|
259
244
|
return {
|
|
260
245
|
content: [{ type: 'text', text: 'Browser stopped.' }]
|
|
261
246
|
};
|
|
262
247
|
});
|
|
263
248
|
server.tool('browser_status', 'Show the browser tracked by this Pilot session and the lock state of every Pilot profile on this machine (including browsers started by other Pilot sessions). Read-only. Use it to diagnose "profile already in use" errors.', {}, async () => {
|
|
264
249
|
const status = {
|
|
265
|
-
session: context.
|
|
250
|
+
session: context.driver?.getSessionInfo() ?? {
|
|
266
251
|
mode: 'none',
|
|
267
252
|
connected: false
|
|
268
253
|
},
|
|
@@ -277,10 +262,10 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
277
262
|
});
|
|
278
263
|
server.tool('browser_stop_all', 'Stop every Pilot-managed Chrome on this machine: the browser in this session plus any Chrome holding a Pilot profile lock, including ones started by other Pilot sessions. Only processes whose command line shows Chrome using a Pilot profile directory are stopped; browsers on other hosts and unverifiable locks are skipped. Also removes stale locks. Ask the user before calling this, since it can close browsers other agents are using.', {}, async () => {
|
|
279
264
|
const lines = [];
|
|
280
|
-
if (context.
|
|
281
|
-
const info = context.
|
|
282
|
-
await context.
|
|
283
|
-
context.
|
|
265
|
+
if (context.driver) {
|
|
266
|
+
const info = context.driver.getSessionInfo();
|
|
267
|
+
await context.driver.destroy();
|
|
268
|
+
context.driver = null;
|
|
284
269
|
if (info.mode === 'launched') {
|
|
285
270
|
lines.push(`this session: stopped Chrome pid ${info.pid} (profile "${info.profile}")`);
|
|
286
271
|
}
|
|
@@ -303,8 +288,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
303
288
|
};
|
|
304
289
|
});
|
|
305
290
|
server.tool('browser_screenshot', 'Capture a screenshot of the current browser viewport or full page', screenshotShape, async ({ format, quality, fullPage }) => {
|
|
306
|
-
const
|
|
307
|
-
const result = await executeScreenshot(client, {
|
|
291
|
+
const result = await requireDriver(context).screenshot({
|
|
308
292
|
format,
|
|
309
293
|
quality,
|
|
310
294
|
fullPage
|
|
@@ -331,8 +315,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
331
315
|
};
|
|
332
316
|
});
|
|
333
317
|
server.tool('browser_navigate', 'Navigate to a URL and wait for page load', navigateShape, async ({ url, waitUntil, timeoutMs }) => {
|
|
334
|
-
const
|
|
335
|
-
const result = await executeNavigate(client, manager, {
|
|
318
|
+
const result = await requireDriver(context).navigate({
|
|
336
319
|
url,
|
|
337
320
|
waitUntil,
|
|
338
321
|
timeoutMs
|
|
@@ -360,8 +343,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
360
343
|
isError: true
|
|
361
344
|
};
|
|
362
345
|
}
|
|
363
|
-
const
|
|
364
|
-
const result = await executeClick(client, params, context.elementRefMap);
|
|
346
|
+
const result = await requireDriver(context).click(params);
|
|
365
347
|
return {
|
|
366
348
|
content: [
|
|
367
349
|
{
|
|
@@ -372,8 +354,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
372
354
|
};
|
|
373
355
|
});
|
|
374
356
|
server.tool('browser_type', 'Type text into the focused element, a ref (from browser_snapshot), or a CSS selector. Generates keystroke events (use browser_fill to replace a field value entirely).', typeShape, async (params) => {
|
|
375
|
-
|
|
376
|
-
await executeType(client, params, context.elementRefMap);
|
|
357
|
+
await requireDriver(context).type(params);
|
|
377
358
|
const target = params.ref ?? params.selector;
|
|
378
359
|
return {
|
|
379
360
|
content: [
|
|
@@ -385,8 +366,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
385
366
|
};
|
|
386
367
|
});
|
|
387
368
|
server.tool('browser_evaluate', 'Execute JavaScript in the page context and return the result', evaluateShape, async ({ expression, awaitPromise, timeoutMs }) => {
|
|
388
|
-
const
|
|
389
|
-
const result = await executeEvaluate(client, {
|
|
369
|
+
const result = await requireDriver(context).evaluate({
|
|
390
370
|
expression,
|
|
391
371
|
awaitPromise,
|
|
392
372
|
timeoutMs
|
|
@@ -415,8 +395,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
415
395
|
isError: true
|
|
416
396
|
};
|
|
417
397
|
}
|
|
418
|
-
const
|
|
419
|
-
const result = await executeWait(client, manager, params);
|
|
398
|
+
const result = await requireDriver(context).wait(params);
|
|
420
399
|
return {
|
|
421
400
|
content: [
|
|
422
401
|
{
|
|
@@ -427,8 +406,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
427
406
|
};
|
|
428
407
|
});
|
|
429
408
|
server.tool('browser_page_info', 'Get information about the current page (URL, title, ready state)', {}, async () => {
|
|
430
|
-
const
|
|
431
|
-
const result = await executePageInfo(client);
|
|
409
|
+
const result = await requireDriver(context).pageInfo();
|
|
432
410
|
return {
|
|
433
411
|
content: [
|
|
434
412
|
{
|
|
@@ -439,8 +417,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
439
417
|
};
|
|
440
418
|
});
|
|
441
419
|
server.tool('browser_list_tabs', 'List all open browser tabs with their target IDs, URLs, titles, and active status', {}, async () => {
|
|
442
|
-
const
|
|
443
|
-
const tabs = await executeListTabs(manager);
|
|
420
|
+
const tabs = await requireDriver(context).listTabs();
|
|
444
421
|
return {
|
|
445
422
|
content: [
|
|
446
423
|
{
|
|
@@ -451,8 +428,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
451
428
|
};
|
|
452
429
|
});
|
|
453
430
|
server.tool('browser_new_tab', 'Open a new browser tab, optionally navigating to a URL', newTabShape, async ({ url }) => {
|
|
454
|
-
const
|
|
455
|
-
const result = await executeNewTab(manager, url);
|
|
431
|
+
const result = await requireDriver(context).newTab(url);
|
|
456
432
|
return {
|
|
457
433
|
content: [
|
|
458
434
|
{
|
|
@@ -463,8 +439,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
463
439
|
};
|
|
464
440
|
});
|
|
465
441
|
server.tool('browser_close_tab', 'Close a browser tab by its target ID. Cannot close the currently active tab.', closeTabShape, async ({ targetId }) => {
|
|
466
|
-
|
|
467
|
-
await executeCloseTab(manager, targetId);
|
|
442
|
+
await requireDriver(context).closeTab(targetId);
|
|
468
443
|
return {
|
|
469
444
|
content: [
|
|
470
445
|
{
|
|
@@ -475,8 +450,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
475
450
|
};
|
|
476
451
|
});
|
|
477
452
|
server.tool('browser_switch_tab', 'Switch the active browser tab to the one with the given target ID. All subsequent commands will target this tab.', switchTabShape, async ({ targetId }) => {
|
|
478
|
-
|
|
479
|
-
await executeSwitchTab(manager, targetId);
|
|
453
|
+
await requireDriver(context).switchTab(targetId);
|
|
480
454
|
return {
|
|
481
455
|
content: [
|
|
482
456
|
{
|
|
@@ -487,20 +461,12 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
487
461
|
};
|
|
488
462
|
});
|
|
489
463
|
server.tool('browser_viewport_resize', 'Resize the browser viewport to new dimensions. Updates both the window size and the rendering viewport. Disables responsive mode so the viewport stays locked at the specified size.', viewportResizeShape, async ({ width, height, deviceScaleFactor, mobile }) => {
|
|
490
|
-
const
|
|
491
|
-
const current = manager.getViewportConfig();
|
|
492
|
-
const effectiveMobile = mobile ?? current?.mobile ?? false;
|
|
493
|
-
const newConfig = {
|
|
464
|
+
const newConfig = await requireDriver(context).resizeViewport({
|
|
494
465
|
width,
|
|
495
466
|
height,
|
|
496
|
-
deviceScaleFactor
|
|
497
|
-
mobile
|
|
498
|
-
|
|
499
|
-
...(effectiveMobile &&
|
|
500
|
-
current?.userAgent && { userAgent: current.userAgent })
|
|
501
|
-
};
|
|
502
|
-
await applyViewport(client, newConfig);
|
|
503
|
-
manager.setViewportConfig(newConfig);
|
|
467
|
+
deviceScaleFactor,
|
|
468
|
+
mobile
|
|
469
|
+
});
|
|
504
470
|
return {
|
|
505
471
|
content: [
|
|
506
472
|
{
|
|
@@ -511,10 +477,10 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
511
477
|
};
|
|
512
478
|
});
|
|
513
479
|
server.tool('browser_tabs', 'Manage browser tabs. Actions: "list" shows all tabs, "new" opens a tab (optional url), "select" switches to a tab (requires targetId), "close" closes a tab (requires targetId).', tabsShape, async ({ action, targetId, url }) => {
|
|
514
|
-
const
|
|
480
|
+
const driver = requireDriver(context);
|
|
515
481
|
switch (action) {
|
|
516
482
|
case 'list': {
|
|
517
|
-
const tabs = await
|
|
483
|
+
const tabs = await driver.listTabs();
|
|
518
484
|
return {
|
|
519
485
|
content: [
|
|
520
486
|
{ type: 'text', text: JSON.stringify(tabs, null, 2) }
|
|
@@ -522,7 +488,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
522
488
|
};
|
|
523
489
|
}
|
|
524
490
|
case 'new': {
|
|
525
|
-
const result = await
|
|
491
|
+
const result = await driver.newTab(url);
|
|
526
492
|
return {
|
|
527
493
|
content: [
|
|
528
494
|
{
|
|
@@ -544,7 +510,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
544
510
|
isError: true
|
|
545
511
|
};
|
|
546
512
|
}
|
|
547
|
-
await
|
|
513
|
+
await driver.switchTab(targetId);
|
|
548
514
|
return {
|
|
549
515
|
content: [
|
|
550
516
|
{
|
|
@@ -566,7 +532,7 @@ export function registerBrowserTools(server, context, makeBrowserManager) {
|
|
|
566
532
|
isError: true
|
|
567
533
|
};
|
|
568
534
|
}
|
|
569
|
-
await
|
|
535
|
+
await driver.closeTab(targetId);
|
|
570
536
|
return {
|
|
571
537
|
content: [
|
|
572
538
|
{
|