@everydaydevopsio/pilot 0.5.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 (108) hide show
  1. package/.ai-agent-bridge.yaml +10 -0
  2. package/.dockerignore +9 -0
  3. package/CLAUDE.md +61 -0
  4. package/LICENSE +21 -0
  5. package/README.md +252 -0
  6. package/dist/browser.d.ts +100 -0
  7. package/dist/browser.d.ts.map +1 -0
  8. package/dist/browser.js +654 -0
  9. package/dist/browser.js.map +1 -0
  10. package/dist/cli/init.d.ts +4 -0
  11. package/dist/cli/init.d.ts.map +1 -0
  12. package/dist/cli/init.js +56 -0
  13. package/dist/cli/init.js.map +1 -0
  14. package/dist/cli/skill-template.d.ts +2 -0
  15. package/dist/cli/skill-template.d.ts.map +1 -0
  16. package/dist/cli/skill-template.js +114 -0
  17. package/dist/cli/skill-template.js.map +1 -0
  18. package/dist/commands/click.d.ts +21 -0
  19. package/dist/commands/click.d.ts.map +1 -0
  20. package/dist/commands/click.js +64 -0
  21. package/dist/commands/click.js.map +1 -0
  22. package/dist/commands/evaluate.d.ts +14 -0
  23. package/dist/commands/evaluate.d.ts.map +1 -0
  24. package/dist/commands/evaluate.js +28 -0
  25. package/dist/commands/evaluate.js.map +1 -0
  26. package/dist/commands/navigate.d.ts +19 -0
  27. package/dist/commands/navigate.d.ts.map +1 -0
  28. package/dist/commands/navigate.js +78 -0
  29. package/dist/commands/navigate.js.map +1 -0
  30. package/dist/commands/page_info.d.ts +8 -0
  31. package/dist/commands/page_info.d.ts.map +1 -0
  32. package/dist/commands/page_info.js +13 -0
  33. package/dist/commands/page_info.js.map +1 -0
  34. package/dist/commands/screenshot.d.ts +18 -0
  35. package/dist/commands/screenshot.d.ts.map +1 -0
  36. package/dist/commands/screenshot.js +37 -0
  37. package/dist/commands/screenshot.js.map +1 -0
  38. package/dist/commands/tabs.d.ts +10 -0
  39. package/dist/commands/tabs.d.ts.map +1 -0
  40. package/dist/commands/tabs.js +15 -0
  41. package/dist/commands/tabs.js.map +1 -0
  42. package/dist/commands/type.d.ts +14 -0
  43. package/dist/commands/type.d.ts.map +1 -0
  44. package/dist/commands/type.js +61 -0
  45. package/dist/commands/type.js.map +1 -0
  46. package/dist/commands/wait.d.ts +17 -0
  47. package/dist/commands/wait.d.ts.map +1 -0
  48. package/dist/commands/wait.js +61 -0
  49. package/dist/commands/wait.js.map +1 -0
  50. package/dist/mcp/console-buffer.d.ts +28 -0
  51. package/dist/mcp/console-buffer.d.ts.map +1 -0
  52. package/dist/mcp/console-buffer.js +68 -0
  53. package/dist/mcp/console-buffer.js.map +1 -0
  54. package/dist/mcp/index.d.ts +3 -0
  55. package/dist/mcp/index.d.ts.map +1 -0
  56. package/dist/mcp/index.js +74 -0
  57. package/dist/mcp/index.js.map +1 -0
  58. package/dist/mcp/server.d.ts +18 -0
  59. package/dist/mcp/server.d.ts.map +1 -0
  60. package/dist/mcp/server.js +46 -0
  61. package/dist/mcp/server.js.map +1 -0
  62. package/dist/mcp/tools/browser.d.ts +5 -0
  63. package/dist/mcp/tools/browser.d.ts.map +1 -0
  64. package/dist/mcp/tools/browser.js +435 -0
  65. package/dist/mcp/tools/browser.js.map +1 -0
  66. package/dist/mcp/tools/errors.d.ts +4 -0
  67. package/dist/mcp/tools/errors.d.ts.map +1 -0
  68. package/dist/mcp/tools/errors.js +117 -0
  69. package/dist/mcp/tools/errors.js.map +1 -0
  70. package/dist/mcp/tools/names.d.ts +7 -0
  71. package/dist/mcp/tools/names.d.ts.map +1 -0
  72. package/dist/mcp/tools/names.js +24 -0
  73. package/dist/mcp/tools/names.js.map +1 -0
  74. package/dist/util/config.d.ts +34 -0
  75. package/dist/util/config.d.ts.map +1 -0
  76. package/dist/util/config.js +53 -0
  77. package/dist/util/config.js.map +1 -0
  78. package/dist/util/logger.d.ts +4 -0
  79. package/dist/util/logger.d.ts.map +1 -0
  80. package/dist/util/logger.js +16 -0
  81. package/dist/util/logger.js.map +1 -0
  82. package/dist/viewport.d.ts +105 -0
  83. package/dist/viewport.d.ts.map +1 -0
  84. package/dist/viewport.js +145 -0
  85. package/dist/viewport.js.map +1 -0
  86. package/package.json +74 -0
  87. package/smoke/mcp-smoke.ts +161 -0
  88. package/src/browser.ts +798 -0
  89. package/src/cli/init.ts +62 -0
  90. package/src/cli/skill-template.ts +113 -0
  91. package/src/commands/click.ts +93 -0
  92. package/src/commands/evaluate.ts +45 -0
  93. package/src/commands/navigate.ts +105 -0
  94. package/src/commands/page_info.ts +21 -0
  95. package/src/commands/screenshot.ts +72 -0
  96. package/src/commands/tabs.ts +35 -0
  97. package/src/commands/type.ts +77 -0
  98. package/src/commands/wait.ts +90 -0
  99. package/src/mcp/console-buffer.ts +94 -0
  100. package/src/mcp/index.ts +107 -0
  101. package/src/mcp/server.ts +67 -0
  102. package/src/mcp/tools/browser.ts +605 -0
  103. package/src/mcp/tools/errors.ts +158 -0
  104. package/src/mcp/tools/names.ts +25 -0
  105. package/src/util/config.ts +71 -0
  106. package/src/util/logger.ts +18 -0
  107. package/src/viewport.ts +204 -0
  108. package/tsconfig.json +24 -0
@@ -0,0 +1,15 @@
1
+ export async function executeListTabs(manager) {
2
+ return manager.listTabs();
3
+ }
4
+ export async function executeNewTab(manager, url) {
5
+ const tab = await manager.createTab(url);
6
+ await manager.switchTab(tab.targetId);
7
+ return { targetId: tab.targetId, url: tab.url };
8
+ }
9
+ export async function executeCloseTab(manager, targetId) {
10
+ await manager.closeTab(targetId);
11
+ }
12
+ export async function executeSwitchTab(manager, targetId) {
13
+ await manager.switchTab(targetId);
14
+ }
15
+ //# sourceMappingURL=tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/commands/tabs.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAuB;IAEvB,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAuB,EACvB,GAAY;IAEZ,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAuB,EACvB,QAAgB;IAEhB,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAuB,EACvB,QAAgB;IAEhB,MAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from 'zod';
2
+ import type { Client } from 'chrome-remote-interface';
3
+ export declare const TypeParamsSchema: z.ZodObject<{
4
+ text: z.ZodString;
5
+ selector: z.ZodOptional<z.ZodString>;
6
+ clearFirst: z.ZodDefault<z.ZodBoolean>;
7
+ delayMs: z.ZodDefault<z.ZodNumber>;
8
+ }, z.core.$strip>;
9
+ export type TypeParams = z.infer<typeof TypeParamsSchema>;
10
+ export interface TypeResult {
11
+ ok: boolean;
12
+ }
13
+ export declare function executeType(client: Client, params: TypeParams): Promise<TypeResult>;
14
+ //# sourceMappingURL=type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/commands/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEtD,eAAO,MAAM,gBAAgB;;;;;iBAK3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;CACb;AAgBD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,UAAU,CAAC,CA2CrB"}
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ export const TypeParamsSchema = z.object({
3
+ text: z.string(),
4
+ selector: z.string().optional(),
5
+ clearFirst: z.boolean().default(false),
6
+ delayMs: z.number().int().min(0).default(0)
7
+ });
8
+ async function focusSelector(client, selector) {
9
+ const result = await client.Runtime.evaluate({
10
+ expression: `(function() {
11
+ const el = document.querySelector(${JSON.stringify(selector)});
12
+ if (!el) return false;
13
+ el.focus();
14
+ return true;
15
+ })()`
16
+ });
17
+ if (!result.result.value) {
18
+ throw new Error(`Element not found: ${selector}`);
19
+ }
20
+ }
21
+ export async function executeType(client, params) {
22
+ if (params.selector) {
23
+ await focusSelector(client, params.selector);
24
+ }
25
+ if (params.clearFirst) {
26
+ // Select all and delete
27
+ await client.Input.dispatchKeyEvent({
28
+ type: 'keyDown',
29
+ key: 'a',
30
+ modifiers: 2 // Ctrl
31
+ });
32
+ await client.Input.dispatchKeyEvent({
33
+ type: 'keyUp',
34
+ key: 'a',
35
+ modifiers: 2
36
+ });
37
+ await client.Input.dispatchKeyEvent({
38
+ type: 'keyDown',
39
+ key: 'Delete'
40
+ });
41
+ await client.Input.dispatchKeyEvent({
42
+ type: 'keyUp',
43
+ key: 'Delete'
44
+ });
45
+ }
46
+ for (const char of params.text) {
47
+ await client.Input.dispatchKeyEvent({
48
+ type: 'keyDown',
49
+ text: char
50
+ });
51
+ await client.Input.dispatchKeyEvent({
52
+ type: 'keyUp',
53
+ text: char
54
+ });
55
+ if (params.delayMs > 0) {
56
+ await new Promise((r) => setTimeout(r, params.delayMs));
57
+ }
58
+ }
59
+ return { ok: true };
60
+ }
61
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/commands/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;CAC5C,CAAC,CAAC;AAQH,KAAK,UAAU,aAAa,CAAC,MAAc,EAAE,QAAgB;IAC3D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC3C,UAAU,EAAE;0CAC0B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;;;SAIzD;KACN,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,MAAkB;IAElB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,wBAAwB;QACxB,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAClC,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,GAAG;YACR,SAAS,EAAE,CAAC,CAAC,OAAO;SACrB,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAClC,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,GAAG;YACR,SAAS,EAAE,CAAC;SACb,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAClC,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAClC,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAClC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC;YAClC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ import type { Client } from 'chrome-remote-interface';
3
+ import type { BrowserManager } from '../browser.js';
4
+ export declare const WaitParamsSchema: z.ZodObject<{
5
+ selector: z.ZodOptional<z.ZodString>;
6
+ selectorVisible: z.ZodOptional<z.ZodString>;
7
+ networkIdle: z.ZodOptional<z.ZodBoolean>;
8
+ ms: z.ZodOptional<z.ZodNumber>;
9
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
10
+ }, z.core.$strip>;
11
+ export type WaitParams = z.infer<typeof WaitParamsSchema>;
12
+ export interface WaitResult {
13
+ ok: boolean;
14
+ elapsed: number;
15
+ }
16
+ export declare function executeWait(client: Client, manager: BrowserManager, params: WaitParams): Promise<WaitResult>;
17
+ //# sourceMappingURL=wait.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../src/commands/wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,eAAO,MAAM,gBAAgB;;;;;;iBAe1B,CAAC;AAEJ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAyCD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,UAAU,CAAC,CAkBrB"}
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ export const WaitParamsSchema = z
3
+ .object({
4
+ selector: z.string().optional(),
5
+ selectorVisible: z.string().optional(),
6
+ networkIdle: z.boolean().optional(),
7
+ ms: z.number().int().min(0).optional(),
8
+ timeoutMs: z.number().int().positive().default(10000)
9
+ })
10
+ .refine((v) => v.selector !== undefined ||
11
+ v.selectorVisible !== undefined ||
12
+ v.networkIdle !== undefined ||
13
+ v.ms !== undefined, { message: 'At least one wait condition is required' });
14
+ async function waitForSelectorPresent(client, selector, timeoutMs) {
15
+ const start = Date.now();
16
+ while (Date.now() - start < timeoutMs) {
17
+ const result = await client.Runtime.evaluate({
18
+ expression: `!!document.querySelector(${JSON.stringify(selector)})`,
19
+ returnByValue: true
20
+ });
21
+ if (result.result.value === true)
22
+ return;
23
+ await new Promise((r) => setTimeout(r, 100));
24
+ }
25
+ throw new Error(`timeout waiting for selector: ${selector}`);
26
+ }
27
+ async function waitForSelectorVisible(client, selector, timeoutMs) {
28
+ const start = Date.now();
29
+ while (Date.now() - start < timeoutMs) {
30
+ const result = await client.Runtime.evaluate({
31
+ expression: `(function() {
32
+ const el = document.querySelector(${JSON.stringify(selector)});
33
+ if (!el) return false;
34
+ const rect = el.getBoundingClientRect();
35
+ return rect.width > 0 && rect.height > 0;
36
+ })()`,
37
+ returnByValue: true
38
+ });
39
+ if (result.result.value === true)
40
+ return;
41
+ await new Promise((r) => setTimeout(r, 100));
42
+ }
43
+ throw new Error(`timeout waiting for visible selector: ${selector}`);
44
+ }
45
+ export async function executeWait(client, manager, params) {
46
+ const start = Date.now();
47
+ if (params.ms !== undefined) {
48
+ await new Promise((r) => setTimeout(r, params.ms));
49
+ }
50
+ else if (params.selector !== undefined) {
51
+ await waitForSelectorPresent(client, params.selector, params.timeoutMs);
52
+ }
53
+ else if (params.selectorVisible !== undefined) {
54
+ await waitForSelectorVisible(client, params.selectorVisible, params.timeoutMs);
55
+ }
56
+ else if (params.networkIdle) {
57
+ await manager.waitForNetworkIdle(params.timeoutMs);
58
+ }
59
+ return { ok: true, elapsed: Date.now() - start };
60
+ }
61
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/commands/wait.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export type ConsoleLevel = 'log' | 'warn' | 'error' | 'info' | 'debug';
2
+ export interface ConsoleMessage {
3
+ level: ConsoleLevel;
4
+ text: string;
5
+ url: string;
6
+ lineNumber: number;
7
+ timestamp: number;
8
+ }
9
+ export interface ConsoleFilter {
10
+ level?: ConsoleLevel | ConsoleLevel[];
11
+ sinceMs?: number;
12
+ limit?: number;
13
+ }
14
+ export declare class ConsoleBuffer {
15
+ private readonly maxSize;
16
+ private buffer;
17
+ private head;
18
+ private count;
19
+ constructor(maxSize?: number);
20
+ push(msg: ConsoleMessage): void;
21
+ getAll(filter?: ConsoleFilter): ConsoleMessage[];
22
+ getErrors(sinceMs?: number): ConsoleMessage[];
23
+ clear(): number;
24
+ size(): number;
25
+ private toArray;
26
+ private applyFilter;
27
+ }
28
+ //# sourceMappingURL=console-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-buffer.d.ts","sourceRoot":"","sources":["../../src/mcp/console-buffer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,YAAY,GAAG,YAAY,EAAE,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAa;IAKZ,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,KAAK,CAAK;gBAEW,OAAO,GAAE,MAAa;IAEnD,IAAI,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI;IAU/B,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,cAAc,EAAE;IAKhD,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IAO7C,KAAK,IAAI,MAAM;IAQf,IAAI,IAAI,MAAM;IAId,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,WAAW;CA0BpB"}
@@ -0,0 +1,68 @@
1
+ export class ConsoleBuffer {
2
+ maxSize;
3
+ buffer = [];
4
+ head = 0;
5
+ count = 0;
6
+ constructor(maxSize = 1000) {
7
+ this.maxSize = maxSize;
8
+ }
9
+ push(msg) {
10
+ if (this.count < this.maxSize) {
11
+ this.buffer.push(msg);
12
+ this.count++;
13
+ }
14
+ else {
15
+ this.buffer[this.head] = msg;
16
+ this.head = (this.head + 1) % this.maxSize;
17
+ }
18
+ }
19
+ getAll(filter) {
20
+ const messages = this.toArray();
21
+ return this.applyFilter(messages, filter);
22
+ }
23
+ getErrors(sinceMs) {
24
+ return this.getAll({
25
+ level: 'error',
26
+ sinceMs
27
+ });
28
+ }
29
+ clear() {
30
+ const cleared = this.count;
31
+ this.buffer = [];
32
+ this.head = 0;
33
+ this.count = 0;
34
+ return cleared;
35
+ }
36
+ size() {
37
+ return this.count;
38
+ }
39
+ toArray() {
40
+ if (this.count < this.maxSize) {
41
+ return [...this.buffer];
42
+ }
43
+ return [
44
+ ...this.buffer.slice(this.head),
45
+ ...this.buffer.slice(0, this.head)
46
+ ];
47
+ }
48
+ applyFilter(messages, filter) {
49
+ if (!filter)
50
+ return messages;
51
+ let result = messages;
52
+ if (filter.level) {
53
+ const levels = Array.isArray(filter.level)
54
+ ? filter.level
55
+ : [filter.level];
56
+ result = result.filter((m) => levels.includes(m.level));
57
+ }
58
+ if (filter.sinceMs !== undefined) {
59
+ const cutoff = Date.now() - filter.sinceMs;
60
+ result = result.filter((m) => m.timestamp >= cutoff);
61
+ }
62
+ if (filter.limit !== undefined && result.length > filter.limit) {
63
+ result = result.slice(-filter.limit);
64
+ }
65
+ return result;
66
+ }
67
+ }
68
+ //# sourceMappingURL=console-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-buffer.js","sourceRoot":"","sources":["../../src/mcp/console-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from 'fs';
3
+ import { fileURLToPath } from 'url';
4
+ import { dirname, join } from 'path';
5
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
+ import { createMcpServer } from './server.js';
7
+ import { loadConfig } from '../util/config.js';
8
+ import { createLogger } from '../util/logger.js';
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ const pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));
11
+ const args = process.argv.slice(2);
12
+ async function run() {
13
+ if (args.includes('--version') || args.includes('-v')) {
14
+ console.log(pkg.version);
15
+ return;
16
+ }
17
+ if (args.includes('--help') || args.includes('-h')) {
18
+ console.log(`${pkg.name} v${pkg.version}`);
19
+ console.log(pkg.description);
20
+ console.log('');
21
+ console.log('Usage: pilot [command] [options]');
22
+ console.log('');
23
+ console.log('Commands:');
24
+ console.log(' init [--force] Install the Claude Code debug-browser skill');
25
+ console.log(' (default) Start the MCP server on stdio');
26
+ console.log('');
27
+ console.log('Options:');
28
+ console.log(' --version, -v Show version number');
29
+ console.log(' --help, -h Show this help message');
30
+ console.log('');
31
+ console.log('Environment variables:');
32
+ console.log(' PILOT_CDP_PORT Chrome DevTools Protocol port (default: 9222)');
33
+ console.log(' PILOT_CDP_HOST Chrome DevTools Protocol host (default: 127.0.0.1)');
34
+ console.log(' PILOT_MCP_BUFFER_SIZE Console event buffer size (default: 1000)');
35
+ console.log(' PILOT_LOG_LEVEL Log level: trace|debug|info|warn|error|fatal (default: info)');
36
+ console.log(' PILOT_PROFILE_NAME Browser profile name (default: profile1)');
37
+ console.log(' PILOT_CHROME_NO_SANDBOX Override Chrome sandbox (true/false)');
38
+ console.log(' PILOT_VIEWPORT Viewport preset (default: desktop)');
39
+ console.log(' Presets: desktop, desktop-small, tablet,');
40
+ console.log(' tablet-landscape, mobile, mobile-landscape, mobile-small');
41
+ return;
42
+ }
43
+ const subcommand = args[0] && !args[0].startsWith('-') ? args[0] : null;
44
+ const baseConfig = loadConfig();
45
+ createLogger(baseConfig.logLevel);
46
+ if (subcommand === 'init') {
47
+ const { runInit } = await import('../cli/init.js');
48
+ const force = args.includes('--force');
49
+ await runInit({ force });
50
+ return;
51
+ }
52
+ const config = {
53
+ bufferSize: parseInt(process.env.PILOT_MCP_BUFFER_SIZE ?? '1000', 10),
54
+ cdpPort: process.env.PILOT_CDP_PORT
55
+ ? parseInt(process.env.PILOT_CDP_PORT, 10)
56
+ : undefined,
57
+ cdpHost: process.env.PILOT_CDP_HOST
58
+ };
59
+ const { server, cleanup } = await createMcpServer(config);
60
+ const transport = new StdioServerTransport();
61
+ async function shutdown() {
62
+ await cleanup();
63
+ process.exit(0);
64
+ }
65
+ process.on('SIGINT', () => void shutdown());
66
+ process.on('SIGTERM', () => void shutdown());
67
+ await server.connect(transport);
68
+ console.error('[pilot] MCP server running on stdio');
69
+ }
70
+ run().catch((err) => {
71
+ console.error('[pilot] Failed to start:', err);
72
+ process.exit(1);
73
+ });
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { BrowserManager } from '../browser.js';
3
+ import { ConsoleBuffer } from './console-buffer.js';
4
+ export interface McpConfig {
5
+ bufferSize: number;
6
+ cdpPort?: number;
7
+ cdpHost?: string;
8
+ }
9
+ export interface BrowserContext {
10
+ manager: BrowserManager | null;
11
+ consoleBuffer: ConsoleBuffer;
12
+ baseConfig: McpConfig;
13
+ }
14
+ export declare function createMcpServer(config: McpConfig): Promise<{
15
+ server: McpServer;
16
+ cleanup: () => Promise<void>;
17
+ }>;
18
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +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;AAE/C,OAAO,EAAE,aAAa,EAAuB,MAAM,qBAAqB,CAAC;AAIzE,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,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,CA4CD"}
@@ -0,0 +1,46 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { BrowserManager } from '../browser.js';
3
+ import { loadConfig } from '../util/config.js';
4
+ import { ConsoleBuffer } from './console-buffer.js';
5
+ import { registerBrowserTools } from './tools/browser.js';
6
+ import { registerErrorTools } from './tools/errors.js';
7
+ export async function createMcpServer(config) {
8
+ const server = new McpServer({
9
+ name: 'pilot',
10
+ version: '0.1.0'
11
+ });
12
+ const consoleBuffer = new ConsoleBuffer(config.bufferSize);
13
+ const context = {
14
+ manager: null,
15
+ consoleBuffer,
16
+ baseConfig: config
17
+ };
18
+ function attachConsoleBuffer(manager) {
19
+ manager.setEventCallback((event, data) => {
20
+ if (event === 'console_message') {
21
+ consoleBuffer.push(data);
22
+ }
23
+ });
24
+ }
25
+ function makeBrowserManager() {
26
+ const browserConfig = loadConfig({
27
+ cdpPort: config.cdpPort,
28
+ cdpHost: config.cdpHost
29
+ });
30
+ const manager = new BrowserManager(browserConfig);
31
+ attachConsoleBuffer(manager);
32
+ return manager;
33
+ }
34
+ registerBrowserTools(server, context, makeBrowserManager);
35
+ registerErrorTools(server, consoleBuffer);
36
+ return {
37
+ server,
38
+ cleanup: async () => {
39
+ if (context.manager) {
40
+ await context.manager.destroy();
41
+ context.manager = null;
42
+ }
43
+ }
44
+ };
45
+ }
46
+ //# sourceMappingURL=server.js.map
@@ -0,0 +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,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAuB,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAcvD,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,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAmB;QAC9B,OAAO,EAAE,IAAI;QACb,aAAa;QACb,UAAU,EAAE,MAAM;KACnB,CAAC;IAEF,SAAS,mBAAmB,CAAC,OAAuB;QAClD,OAAO,CAAC,gBAAgB,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvC,IAAI,KAAK,KAAK,iBAAiB,EAAE,CAAC;gBAChC,aAAa,CAAC,IAAI,CAAC,IAAsB,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,kBAAkB;QACzB,MAAM,aAAa,GAAG,UAAU,CAAC;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,aAAa,CAAC,CAAC;QAClD,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAC1D,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAE1C,OAAO;QACL,MAAM;QACN,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;YACzB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
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;
5
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +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;AA0NnD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,EACvB,kBAAkB,EAAE,MAAM,cAAc,GACvC,IAAI,CA0XN"}