@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.
Files changed (81) hide show
  1. package/AGENTS.md +5 -0
  2. package/CHANGELOG.md +16 -0
  3. package/README.md +19 -2
  4. package/dist/browser/driver/capabilities.d.ts +22 -0
  5. package/dist/browser/driver/capabilities.d.ts.map +1 -0
  6. package/dist/browser/driver/capabilities.js +70 -0
  7. package/dist/browser/driver/capabilities.js.map +1 -0
  8. package/dist/browser/driver/cdp-driver.d.ts +77 -0
  9. package/dist/browser/driver/cdp-driver.d.ts.map +1 -0
  10. package/dist/browser/driver/cdp-driver.js +190 -0
  11. package/dist/browser/driver/cdp-driver.js.map +1 -0
  12. package/dist/browser/driver/factory.d.ts +10 -0
  13. package/dist/browser/driver/factory.d.ts.map +1 -0
  14. package/dist/browser/driver/factory.js +23 -0
  15. package/dist/browser/driver/factory.js.map +1 -0
  16. package/dist/browser/driver/index.d.ts +6 -0
  17. package/dist/browser/driver/index.d.ts.map +1 -0
  18. package/dist/browser/driver/index.js +5 -0
  19. package/dist/browser/driver/index.js.map +1 -0
  20. package/dist/browser/driver/types.d.ts +106 -0
  21. package/dist/browser/driver/types.d.ts.map +1 -0
  22. package/dist/browser/driver/types.js +25 -0
  23. package/dist/browser/driver/types.js.map +1 -0
  24. package/dist/browser/types.d.ts +3 -0
  25. package/dist/browser/types.d.ts.map +1 -1
  26. package/dist/commands/connect.d.ts +2 -2
  27. package/dist/commands/connect.d.ts.map +1 -1
  28. package/dist/commands/connect.js +2 -2
  29. package/dist/commands/connect.js.map +1 -1
  30. package/dist/mcp/server.d.ts +9 -15
  31. package/dist/mcp/server.d.ts.map +1 -1
  32. package/dist/mcp/server.js +32 -74
  33. package/dist/mcp/server.js.map +1 -1
  34. package/dist/mcp/tools/browser.d.ts +2 -3
  35. package/dist/mcp/tools/browser.d.ts.map +1 -1
  36. package/dist/mcp/tools/browser.js +38 -72
  37. package/dist/mcp/tools/browser.js.map +1 -1
  38. package/dist/mcp/tools/connect.d.ts +2 -3
  39. package/dist/mcp/tools/connect.d.ts.map +1 -1
  40. package/dist/mcp/tools/connect.js +9 -9
  41. package/dist/mcp/tools/connect.js.map +1 -1
  42. package/dist/mcp/tools/driver-context.d.ts +14 -0
  43. package/dist/mcp/tools/driver-context.d.ts.map +1 -0
  44. package/dist/mcp/tools/driver-context.js +43 -0
  45. package/dist/mcp/tools/driver-context.js.map +1 -0
  46. package/dist/mcp/tools/files.d.ts.map +1 -1
  47. package/dist/mcp/tools/files.js +5 -15
  48. package/dist/mcp/tools/files.js.map +1 -1
  49. package/dist/mcp/tools/interaction.d.ts.map +1 -1
  50. package/dist/mcp/tools/interaction.js +7 -26
  51. package/dist/mcp/tools/interaction.js.map +1 -1
  52. package/dist/mcp/tools/network.d.ts.map +1 -1
  53. package/dist/mcp/tools/network.js +3 -11
  54. package/dist/mcp/tools/network.js.map +1 -1
  55. package/dist/mcp/tools/performance.d.ts.map +1 -1
  56. package/dist/mcp/tools/performance.js +2 -12
  57. package/dist/mcp/tools/performance.js.map +1 -1
  58. package/dist/mcp/tools/snapshot.d.ts.map +1 -1
  59. package/dist/mcp/tools/snapshot.js +3 -14
  60. package/dist/mcp/tools/snapshot.js.map +1 -1
  61. package/dist/mcp/tools/styles.d.ts.map +1 -1
  62. package/dist/mcp/tools/styles.js +2 -11
  63. package/dist/mcp/tools/styles.js.map +1 -1
  64. package/package.json +1 -1
  65. package/src/browser/driver/capabilities.ts +88 -0
  66. package/src/browser/driver/cdp-driver.ts +260 -0
  67. package/src/browser/driver/factory.ts +33 -0
  68. package/src/browser/driver/index.ts +22 -0
  69. package/src/browser/driver/types.ts +156 -0
  70. package/src/browser/types.ts +3 -0
  71. package/src/commands/connect.ts +3 -3
  72. package/src/mcp/server.ts +48 -91
  73. package/src/mcp/tools/browser.ts +39 -90
  74. package/src/mcp/tools/connect.ts +10 -11
  75. package/src/mcp/tools/driver-context.ts +56 -0
  76. package/src/mcp/tools/files.ts +5 -16
  77. package/src/mcp/tools/interaction.ts +7 -27
  78. package/src/mcp/tools/network.ts +2 -12
  79. package/src/mcp/tools/performance.ts +2 -13
  80. package/src/mcp/tools/snapshot.ts +3 -15
  81. 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"}
@@ -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;AAEtD,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,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
+ {"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 { BrowserManager } from '../browser/browser-manager.js';
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(manager: BrowserManager, params: ConnectParams): Promise<ConnectResult>;
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,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,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,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,CAOxB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAajE"}
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"}
@@ -1,7 +1,7 @@
1
- export async function executeConnect(manager, params) {
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 manager.connectExisting({ host, port });
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,OAAuB,EACvB,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,OAAO,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/D,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"}
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"}
@@ -1,26 +1,20 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { BrowserManager } from '../browser.js';
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
- manager: BrowserManager | null;
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>;
@@ -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;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAEhE,OAAO,EACL,eAAe,EAGhB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAuB,MAAM,qBAAqB,CAAC;AASzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAInE,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,UAAU,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IAChD,UAAU,EAAE,SAAS,CAAC;CACvB;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,CA2FD"}
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"}
@@ -1,12 +1,9 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { BrowserManager } from '../browser.js';
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 { attachDialogHandler } from '../browser/interaction/dialogs.js';
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
- manager: null,
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
- function attachEventHandlers(manager) {
45
- let monitoredClient = null;
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.manager) {
101
- await context.manager.destroy();
102
- context.manager = null;
58
+ if (context.driver) {
59
+ await context.driver.destroy();
60
+ context.driver = null;
103
61
  }
104
62
  }
105
63
  };
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
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,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAe/D;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,MAAiB,EACjB,OAAuB,EACvB,UAAyB;IAEzB,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACjD,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACjD,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtC,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrC,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACnD,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnC,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAiB;IAIrD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAmB;QAC9B,MAAM,EAAE,IAAI;QACZ,aAAa,EAAE,IAAI,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;QACnD,aAAa,EAAE,IAAI,aAAa,EAAE;QAClC,aAAa,EAAE,IAAI,aAAa,EAAE;QAClC,WAAW,EAAE,IAAI,WAAW,EAAE;QAC9B,eAAe,EAAE,IAAI,eAAe,EAAE;QACtC,UAAU,EAAE,gBAAgB,EAAE;QAC9B,UAAU,EAAE,MAAM;KACnB,CAAC;IAEF,MAAM,UAAU,GAAkB,GAAG,EAAE,CACrC,YAAY,CACV,QAAQ,EACR,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAChE,OAAO,CACR,CAAC;IAEJ,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAE9C,OAAO;QACL,MAAM;QACN,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACxB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,5 +1,4 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { BrowserManager } from '../../browser.js';
3
- import type { BrowserContext } from '../server.js';
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;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAkQnD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,kBAAkB,EAAE,MAAM,cAAc,GACvC,IAAI,CA2gBN"}
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 { executeScreenshot } from '../../commands/screenshot.js';
5
- import { executeNavigate } from '../../commands/navigate.js';
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 requireClient(context) {
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.manager?.isConnected()) {
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.manager) {
221
- await context.manager.destroy();
222
- context.manager = null;
205
+ if (context.driver) {
206
+ await context.driver.destroy();
207
+ context.driver = null;
223
208
  }
224
- const manager = makeBrowserManager();
225
- const { headless: effectiveHeadless, viewport: effectiveViewport } = await manager.launch({
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.manager = manager;
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.manager) {
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.manager.destroy();
258
- context.manager = null;
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.manager?.getSessionInfo() ?? {
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.manager) {
281
- const info = context.manager.getSessionInfo();
282
- await context.manager.destroy();
283
- context.manager = null;
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 { client } = requireClient(context);
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 { client, manager } = requireClient(context);
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 { client } = requireClient(context);
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
- const { client } = requireClient(context);
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 { client } = requireClient(context);
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 { client, manager } = requireClient(context);
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 { client } = requireClient(context);
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 { manager } = requireClient(context);
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 { manager } = requireClient(context);
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
- const { manager } = requireClient(context);
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
- const { manager } = requireClient(context);
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 { client, manager } = requireClient(context);
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: deviceScaleFactor ?? current?.deviceScaleFactor ?? 1,
497
- mobile: effectiveMobile,
498
- responsive: false,
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 { manager } = requireClient(context);
480
+ const driver = requireDriver(context);
515
481
  switch (action) {
516
482
  case 'list': {
517
- const tabs = await executeListTabs(manager);
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 executeNewTab(manager, url);
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 executeSwitchTab(manager, targetId);
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 executeCloseTab(manager, targetId);
535
+ await driver.closeTab(targetId);
570
536
  return {
571
537
  content: [
572
538
  {