@everydaydevopsio/pilot 0.6.2 → 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 +11 -0
- package/CHANGELOG.md +45 -0
- package/README.md +105 -11
- package/dist/browser/browser-manager.d.ts +7 -1
- package/dist/browser/browser-manager.d.ts.map +1 -1
- package/dist/browser/browser-manager.js +196 -40
- package/dist/browser/browser-manager.js.map +1 -1
- package/dist/browser/chrome-launcher.d.ts +13 -2
- package/dist/browser/chrome-launcher.d.ts.map +1 -1
- package/dist/browser/chrome-launcher.js +33 -4
- package/dist/browser/chrome-launcher.js.map +1 -1
- 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/sessions.d.ts +49 -0
- package/dist/browser/sessions.d.ts.map +1 -0
- package/dist/browser/sessions.js +249 -0
- package/dist/browser/sessions.js.map +1 -0
- package/dist/browser/types.d.ts +13 -0
- package/dist/browser/types.d.ts.map +1 -1
- package/dist/cli/skill-template.d.ts +1 -1
- package/dist/cli/skill-template.d.ts.map +1 -1
- package/dist/cli/skill-template.js +1 -1
- package/dist/cli/skill-template.js.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 +85 -70
- 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/names.d.ts +1 -1
- package/dist/mcp/tools/names.d.ts.map +1 -1
- package/dist/mcp/tools/names.js +2 -0
- package/dist/mcp/tools/names.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/skills/pilot/SKILL.md +9 -0
- package/src/browser/browser-manager.ts +248 -41
- package/src/browser/chrome-launcher.ts +40 -4
- 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/sessions.ts +299 -0
- package/src/browser/types.ts +14 -0
- package/src/cli/skill-template.ts +1 -1
- package/src/commands/connect.ts +3 -3
- package/src/mcp/server.ts +48 -91
- package/src/mcp/tools/browser.ts +105 -87
- 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/names.ts +2 -0
- 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,43 @@
|
|
|
1
|
+
import { TOOL_CAPABILITIES, assertToolSupported } from '../../browser/driver/capabilities.js';
|
|
2
|
+
/** Return the connected driver or fail with the standard "not started" error. */
|
|
3
|
+
export function requireDriver(context) {
|
|
4
|
+
const driver = context.driver;
|
|
5
|
+
if (!driver || !driver.isConnected()) {
|
|
6
|
+
throw new Error('Browser not started. Call browser_start first.');
|
|
7
|
+
}
|
|
8
|
+
return driver;
|
|
9
|
+
}
|
|
10
|
+
function isToolName(name) {
|
|
11
|
+
return Object.prototype.hasOwnProperty.call(TOOL_CAPABILITIES, name);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Wrap an McpServer so every registered tool first checks that the active
|
|
15
|
+
* driver (if any) has the capabilities the tool declares in TOOL_CAPABILITIES.
|
|
16
|
+
* Registering a tool without a capability declaration throws, so new tools
|
|
17
|
+
* cannot skip the check.
|
|
18
|
+
*/
|
|
19
|
+
export function withCapabilityGate(server, getDriver) {
|
|
20
|
+
return new Proxy(server, {
|
|
21
|
+
get(target, prop, receiver) {
|
|
22
|
+
if (prop !== 'tool')
|
|
23
|
+
return Reflect.get(target, prop, receiver);
|
|
24
|
+
return (name, ...rest) => {
|
|
25
|
+
if (!isToolName(name)) {
|
|
26
|
+
throw new Error(`Tool ${name} has no entry in TOOL_CAPABILITIES; declare the driver capabilities it needs.`);
|
|
27
|
+
}
|
|
28
|
+
const last = rest.length - 1;
|
|
29
|
+
const handler = rest[last];
|
|
30
|
+
if (typeof handler === 'function') {
|
|
31
|
+
rest[last] = async (...args) => {
|
|
32
|
+
const driver = getDriver();
|
|
33
|
+
if (driver)
|
|
34
|
+
assertToolSupported(name, driver);
|
|
35
|
+
return handler(...args);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return target.tool(name, ...rest);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=driver-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"driver-context.js","sourceRoot":"","sources":["../../../src/mcp/tools/driver-context.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,sCAAsC,CAAC;AAI9C,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,OAE7B;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,SAAqC;IAErC,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;QACvB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACxB,IAAI,IAAI,KAAK,MAAM;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChE,OAAO,CAAC,IAAY,EAAE,GAAG,IAAe,EAAE,EAAE;gBAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACtB,MAAM,IAAI,KAAK,CACb,QAAQ,IAAI,+EAA+E,CAC5F,CAAC;gBACJ,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;oBAClC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;wBACxC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;wBAC3B,IAAI,MAAM;4BAAE,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;wBAC9C,OAAO,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;oBAC1B,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAQ,MAAM,CAAC,IAAqC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;YACtE,CAAC,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/files.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/files.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAiDnD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,GACtB,IAAI,CAsDN"}
|
package/dist/mcp/tools/files.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { formatDialogResult } from '../../commands/dialog.js';
|
|
3
|
+
import { requireDriver } from './driver-context.js';
|
|
4
4
|
import { executeDownloads, formatDownloadsResult } from '../../commands/downloads.js';
|
|
5
5
|
const dialogShape = {
|
|
6
6
|
action: z
|
|
@@ -34,18 +34,9 @@ const downloadsShape = {
|
|
|
34
34
|
.optional()
|
|
35
35
|
.describe('Timeout for wait action in milliseconds (default: 30000)')
|
|
36
36
|
};
|
|
37
|
-
function requireContext(context) {
|
|
38
|
-
const manager = context.manager;
|
|
39
|
-
if (!manager || !manager.isConnected()) {
|
|
40
|
-
throw new Error('Browser not started. Call browser_start first.');
|
|
41
|
-
}
|
|
42
|
-
const client = manager.getClient();
|
|
43
|
-
return { client };
|
|
44
|
-
}
|
|
45
37
|
export function registerFilesTools(server, context) {
|
|
46
38
|
server.tool('browser_dialog', 'Handle browser dialogs (alert, confirm, prompt). Use "list" to see pending dialogs, "accept" to click OK/Yes, or "dismiss" to click Cancel/No. For prompt dialogs, provide promptText with accept.', dialogShape, async ({ action, promptText }) => {
|
|
47
|
-
const
|
|
48
|
-
const result = await executeDialog(client, context.dialogQueue, {
|
|
39
|
+
const result = await requireDriver(context).dialog({
|
|
49
40
|
action,
|
|
50
41
|
promptText
|
|
51
42
|
});
|
|
@@ -54,8 +45,7 @@ export function registerFilesTools(server, context) {
|
|
|
54
45
|
};
|
|
55
46
|
});
|
|
56
47
|
server.tool('browser_upload', 'Upload files to a file input element by ref. Files must exist, be regular files, and be under allowed roots (PILOT_UPLOAD_ROOTS env, default: cwd). Use browser_snapshot to find file input refs.', uploadShape, async ({ ref, files }) => {
|
|
57
|
-
const
|
|
58
|
-
const result = await executeUpload(client, context.elementRefMap, {
|
|
48
|
+
const result = await requireDriver(context).upload({
|
|
59
49
|
ref,
|
|
60
50
|
files
|
|
61
51
|
});
|
|
@@ -69,7 +59,7 @@ export function registerFilesTools(server, context) {
|
|
|
69
59
|
};
|
|
70
60
|
});
|
|
71
61
|
server.tool('browser_downloads', 'Track file downloads. Actions: "list" shows tracked downloads with status/progress; "wait" blocks until a download (by GUID) completes; "clear" resets the tracker.', downloadsShape, async ({ action, guid, timeoutMs }) => {
|
|
72
|
-
|
|
62
|
+
requireDriver(context);
|
|
73
63
|
const result = await executeDownloads(context.downloadTracker, {
|
|
74
64
|
action,
|
|
75
65
|
guid,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/mcp/tools/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/mcp/tools/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interaction.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/interaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"interaction.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/interaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA0DnD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,GACtB,IAAI,CAoJN"}
|
|
@@ -1,18 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
3
|
-
import { executeHover } from '../../commands/hover.js';
|
|
4
|
-
import { executePressKey } from '../../commands/press_key.js';
|
|
5
|
-
import { executeSelect } from '../../commands/select.js';
|
|
6
|
-
import { executeCheck } from '../../commands/check.js';
|
|
7
|
-
import { executeScroll } from '../../commands/scroll.js';
|
|
8
|
-
function requireContext(context) {
|
|
9
|
-
const manager = context.manager;
|
|
10
|
-
if (!manager || !manager.isConnected()) {
|
|
11
|
-
throw new Error('Browser not started. Call browser_start first.');
|
|
12
|
-
}
|
|
13
|
-
const client = manager.getClient();
|
|
14
|
-
return { client, refMap: context.elementRefMap };
|
|
15
|
-
}
|
|
2
|
+
import { requireDriver } from './driver-context.js';
|
|
16
3
|
const fillShape = {
|
|
17
4
|
ref: z.string().describe('Element ref from browser_snapshot (e.g. "e3")'),
|
|
18
5
|
value: z.string().describe('Value to set in the field')
|
|
@@ -62,8 +49,7 @@ const scrollShape = {
|
|
|
62
49
|
};
|
|
63
50
|
export function registerInteractionTools(server, context) {
|
|
64
51
|
server.tool('browser_fill', 'Fill a form field by element ref. Replaces the entire field value and fires input/change events compatible with React, Vue, and Svelte. Use browser_snapshot first to get refs.', fillShape, async ({ ref, value }) => {
|
|
65
|
-
const {
|
|
66
|
-
const result = await executeFill(client, refMap, { ref, value });
|
|
52
|
+
const result = await requireDriver(context).fill({ ref, value });
|
|
67
53
|
return {
|
|
68
54
|
content: [
|
|
69
55
|
{
|
|
@@ -86,8 +72,7 @@ export function registerInteractionTools(server, context) {
|
|
|
86
72
|
isError: true
|
|
87
73
|
};
|
|
88
74
|
}
|
|
89
|
-
const
|
|
90
|
-
const result = await executeHover(client, refMap, params);
|
|
75
|
+
const result = await requireDriver(context).hover(params);
|
|
91
76
|
return {
|
|
92
77
|
content: [
|
|
93
78
|
{
|
|
@@ -98,8 +83,7 @@ export function registerInteractionTools(server, context) {
|
|
|
98
83
|
};
|
|
99
84
|
});
|
|
100
85
|
server.tool('browser_press_key', 'Press a key or key combination. Supports named keys (Enter, Tab, Escape, etc.) and modifier combos (Control+a, Meta+c, Shift+Enter).', pressKeyShape, async ({ key }) => {
|
|
101
|
-
const
|
|
102
|
-
const result = await executePressKey(client, { key });
|
|
86
|
+
const result = await requireDriver(context).pressKey({ key });
|
|
103
87
|
const modStr = result.modifiers.length > 0
|
|
104
88
|
? ` with modifiers: ${result.modifiers.join('+')}`
|
|
105
89
|
: '';
|
|
@@ -123,8 +107,7 @@ export function registerInteractionTools(server, context) {
|
|
|
123
107
|
isError: true
|
|
124
108
|
};
|
|
125
109
|
}
|
|
126
|
-
const
|
|
127
|
-
const result = await executeSelect(client, refMap, params);
|
|
110
|
+
const result = await requireDriver(context).select(params);
|
|
128
111
|
return {
|
|
129
112
|
content: [
|
|
130
113
|
{
|
|
@@ -135,8 +118,7 @@ export function registerInteractionTools(server, context) {
|
|
|
135
118
|
};
|
|
136
119
|
});
|
|
137
120
|
server.tool('browser_check', 'Toggle a checkbox or radio button by ref. Optionally set to a specific checked state.', checkShape, async ({ ref, checked }) => {
|
|
138
|
-
const {
|
|
139
|
-
const result = await executeCheck(client, refMap, { ref, checked });
|
|
121
|
+
const result = await requireDriver(context).check({ ref, checked });
|
|
140
122
|
return {
|
|
141
123
|
content: [
|
|
142
124
|
{
|
|
@@ -161,8 +143,7 @@ export function registerInteractionTools(server, context) {
|
|
|
161
143
|
isError: true
|
|
162
144
|
};
|
|
163
145
|
}
|
|
164
|
-
const
|
|
165
|
-
const result = await executeScroll(client, refMap, params);
|
|
146
|
+
const result = await requireDriver(context).scroll(params);
|
|
166
147
|
return {
|
|
167
148
|
content: [
|
|
168
149
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interaction.js","sourceRoot":"","sources":["../../../src/mcp/tools/interaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"interaction.js","sourceRoot":"","sources":["../../../src/mcp/tools/interaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
* Canonical list of MCP tool names registered by this server.
|
|
3
3
|
* Shared between the smoke test and e2e test suite so both stay in sync.
|
|
4
4
|
*/
|
|
5
|
-
export declare const EXPECTED_TOOLS: readonly ["browser_start", "browser_stop", "browser_screenshot", "browser_navigate", "browser_click", "browser_type", "browser_evaluate", "browser_wait", "browser_page_info", "browser_list_tabs", "browser_new_tab", "browser_close_tab", "browser_switch_tab", "browser_viewport_resize", "browser_get_console_logs", "browser_get_errors", "browser_clear_errors", "browser_snapshot", "browser_find", "browser_fill", "browser_hover", "browser_press_key", "browser_select", "browser_check", "browser_scroll", "browser_network", "browser_console", "browser_errors", "browser_styles", "browser_dialog", "browser_upload", "browser_downloads", "browser_performance", "browser_connect", "browser_tabs"];
|
|
5
|
+
export declare const EXPECTED_TOOLS: readonly ["browser_start", "browser_stop", "browser_status", "browser_stop_all", "browser_screenshot", "browser_navigate", "browser_click", "browser_type", "browser_evaluate", "browser_wait", "browser_page_info", "browser_list_tabs", "browser_new_tab", "browser_close_tab", "browser_switch_tab", "browser_viewport_resize", "browser_get_console_logs", "browser_get_errors", "browser_clear_errors", "browser_snapshot", "browser_find", "browser_fill", "browser_hover", "browser_press_key", "browser_select", "browser_check", "browser_scroll", "browser_network", "browser_console", "browser_errors", "browser_styles", "browser_dialog", "browser_upload", "browser_downloads", "browser_performance", "browser_connect", "browser_tabs"];
|
|
6
6
|
export type ToolName = (typeof EXPECTED_TOOLS)[number];
|
|
7
7
|
//# sourceMappingURL=names.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,cAAc,0tBAsCjB,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
package/dist/mcp/tools/names.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../../src/mcp/tools/names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,eAAe;IACf,cAAc;IACd,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,kBAAkB;IAClB,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,iBAAiB;IACjB,mBAAmB;IACnB,oBAAoB;IACpB,yBAAyB;IACzB,0BAA0B;IAC1B,oBAAoB;IACpB,sBAAsB;IACtB,kBAAkB;IAClB,cAAc;IACd,cAAc;IACd,eAAe;IACf,mBAAmB;IACnB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,mBAAmB;IACnB,qBAAqB;IACrB,iBAAiB;IACjB,cAAc;CACN,CAAC"}
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../../src/mcp/tools/names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,oBAAoB;IACpB,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,kBAAkB;IAClB,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,iBAAiB;IACjB,mBAAmB;IACnB,oBAAoB;IACpB,yBAAyB;IACzB,0BAA0B;IAC1B,oBAAoB;IACpB,sBAAsB;IACtB,kBAAkB;IAClB,cAAc;IACd,cAAc;IACd,eAAe;IACf,mBAAmB;IACnB,gBAAgB;IAChB,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,mBAAmB;IACnB,qBAAqB;IACrB,iBAAiB;IACjB,cAAc;CACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/network.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/network.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAgDnD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,GACtB,IAAI,CAsBN"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { requireDriver } from './driver-context.js';
|
|
3
|
+
import { formatNetworkList, formatNetworkDetail } from '../../commands/network.js';
|
|
3
4
|
const networkShape = {
|
|
4
5
|
action: z
|
|
5
6
|
.enum(['list', 'get', 'clear'])
|
|
@@ -38,18 +39,9 @@ const networkShape = {
|
|
|
38
39
|
.optional()
|
|
39
40
|
.describe('Maximum number of results (list only)')
|
|
40
41
|
};
|
|
41
|
-
function requireContext(context) {
|
|
42
|
-
const manager = context.manager;
|
|
43
|
-
if (!manager || !manager.isConnected()) {
|
|
44
|
-
throw new Error('Browser not started. Call browser_start first.');
|
|
45
|
-
}
|
|
46
|
-
const client = manager.getClient();
|
|
47
|
-
return { client, networkBuffer: context.networkBuffer };
|
|
48
|
-
}
|
|
49
42
|
export function registerNetworkTools(server, context) {
|
|
50
43
|
server.tool('browser_network', 'Inspect captured network requests. Actions: "list" shows request summaries with filters (url, method, status, resourceType, failed); "get" returns full detail for a request ID including headers and response body; "clear" resets the buffer.', networkShape, async (params) => {
|
|
51
|
-
const
|
|
52
|
-
const result = await executeNetwork(client, networkBuffer, params);
|
|
44
|
+
const result = await requireDriver(context).network(params);
|
|
53
45
|
let text;
|
|
54
46
|
if (result.action === 'list') {
|
|
55
47
|
text = formatNetworkList(result);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/mcp/tools/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,
|
|
1
|
+
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/mcp/tools/network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,YAAY,GAAG;IACnB,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;SAC9B,QAAQ,CAAC,4DAA4D,CAAC;IACzE,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,wCAAwC,CAAC;IACrD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;IAC1E,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mDAAmD,CAAC;IAChE,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,CAAC,2CAA2C,CAAC;IACxD,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,CAAC,2CAA2C,CAAC;IACxD,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,4FAA4F,CAC7F;IACH,MAAM,EAAE,CAAC;SACN,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,4CAA4C,CAAC;IACzD,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,uCAAuC,CAAC;CACrD,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,OAAuB;IAEvB,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,iPAAiP,EACjP,YAAY,EACZ,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE5D,IAAI,IAAY,CAAC;QACjB,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACnC,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,WAAW,MAAM,CAAC,OAAO,mBAAmB,CAAC;QACtD,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC;SAC3C,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/performance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"performance.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/performance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAWnD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,GACtB,IAAI,CAYN"}
|
|
@@ -1,23 +1,13 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { requireDriver } from './driver-context.js';
|
|
3
3
|
const performanceShape = {
|
|
4
4
|
action: z
|
|
5
5
|
.enum(['start', 'stop', 'analyze'])
|
|
6
6
|
.describe('Action: "start" begins tracing, "stop" ends collection, "analyze" returns a summary of navigation timing, long tasks, slow requests, and large resources')
|
|
7
7
|
};
|
|
8
|
-
function requireContext(context) {
|
|
9
|
-
const manager = context.manager;
|
|
10
|
-
if (!manager || !manager.isConnected()) {
|
|
11
|
-
throw new Error('Browser not started. Call browser_start first.');
|
|
12
|
-
}
|
|
13
|
-
return { client: manager.getClient() };
|
|
14
|
-
}
|
|
15
8
|
export function registerPerformanceTools(server, context) {
|
|
16
9
|
server.tool('browser_performance', 'Inspect page performance. Actions: "start" begins tracing (call before navigating), "stop" ends collection, "analyze" returns an agent-friendly summary with navigation timing, long tasks, slow requests, large resources, and JS execution time.', performanceShape, async ({ action }) => {
|
|
17
|
-
const
|
|
18
|
-
const result = await executePerformance(client, context.traceState, {
|
|
19
|
-
action
|
|
20
|
-
});
|
|
10
|
+
const result = await requireDriver(context).performance({ action });
|
|
21
11
|
return {
|
|
22
12
|
content: [{ type: 'text', text: result.text }]
|
|
23
13
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../src/mcp/tools/performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"performance.js","sourceRoot":"","sources":["../../../src/mcp/tools/performance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,gBAAgB,GAAG;IACvB,MAAM,EAAE,CAAC;SACN,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;SAClC,QAAQ,CACP,0JAA0J,CAC3J;CACJ,CAAC;AAEF,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,OAAuB;IAEvB,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,oPAAoP,EACpP,gBAAgB,EAChB,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/snapshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/snapshot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAsBnD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,GACtB,IAAI,CAwBN"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
3
|
-
import { executeFind } from '../../commands/find.js';
|
|
2
|
+
import { requireDriver } from './driver-context.js';
|
|
4
3
|
const findShape = {
|
|
5
4
|
role: z
|
|
6
5
|
.string()
|
|
@@ -15,25 +14,15 @@ const findShape = {
|
|
|
15
14
|
.optional()
|
|
16
15
|
.describe('Filter by text content — matches name, value, or description (substring, case-insensitive)')
|
|
17
16
|
};
|
|
18
|
-
function requireContext(context) {
|
|
19
|
-
const manager = context.manager;
|
|
20
|
-
if (!manager || !manager.isConnected()) {
|
|
21
|
-
throw new Error('Browser not started. Call browser_start first.');
|
|
22
|
-
}
|
|
23
|
-
const client = manager.getClient();
|
|
24
|
-
return { client, refMap: context.elementRefMap };
|
|
25
|
-
}
|
|
26
17
|
export function registerSnapshotTools(server, context) {
|
|
27
18
|
server.tool('browser_snapshot', 'Capture a structured accessibility snapshot of the current page. Returns interactive and meaningful elements with short refs (e1, e2, ...) that can be used with browser_click and other interaction tools instead of CSS selectors.', {}, async () => {
|
|
28
|
-
const
|
|
29
|
-
const result = await executeSnapshot(client, refMap);
|
|
19
|
+
const result = await requireDriver(context).snapshot();
|
|
30
20
|
return {
|
|
31
21
|
content: [{ type: 'text', text: result.text }]
|
|
32
22
|
};
|
|
33
23
|
});
|
|
34
24
|
server.tool('browser_find', 'Find elements in the current page matching a query. Takes a new snapshot and filters by role, name, or text. Returns matching elements with refs.', findShape, async ({ role, name, text }) => {
|
|
35
|
-
const {
|
|
36
|
-
const result = await executeFind(client, refMap, { role, name, text });
|
|
25
|
+
const result = await requireDriver(context).find({ role, name, text });
|
|
37
26
|
return {
|
|
38
27
|
content: [{ type: 'text', text: result.text }]
|
|
39
28
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/mcp/tools/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../../src/mcp/tools/snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,SAAS,GAAG;IAChB,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,4EAA4E,CAC7E;IACH,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,yDAAyD,CAAC;IACtE,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,4FAA4F,CAC7F;CACJ,CAAC;AAEF,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,OAAuB;IAEvB,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,sOAAsO,EACtO,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QACvD,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,mJAAmJ,EACnJ,SAAS,EACT,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/styles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/styles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAanD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,cAAc,GACtB,IAAI,CAYN"}
|
package/dist/mcp/tools/styles.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { requireDriver } from './driver-context.js';
|
|
3
3
|
const stylesShape = {
|
|
4
4
|
ref: z.string().describe('Element ref from browser_snapshot (e.g. "e3")'),
|
|
5
5
|
properties: z
|
|
@@ -7,18 +7,9 @@ const stylesShape = {
|
|
|
7
7
|
.optional()
|
|
8
8
|
.describe('CSS properties to return (e.g. ["display", "color"]). Omit for a default diagnostic set covering layout, visibility, and common properties.')
|
|
9
9
|
};
|
|
10
|
-
function requireContext(context) {
|
|
11
|
-
const manager = context.manager;
|
|
12
|
-
if (!manager || !manager.isConnected()) {
|
|
13
|
-
throw new Error('Browser not started. Call browser_start first.');
|
|
14
|
-
}
|
|
15
|
-
const client = manager.getClient();
|
|
16
|
-
return { client, refMap: context.elementRefMap };
|
|
17
|
-
}
|
|
18
10
|
export function registerStylesTools(server, context) {
|
|
19
11
|
server.tool('browser_styles', 'Inspect computed styles, matched CSS rules, and box model for an element by ref. Helps diagnose visibility issues (display:none, opacity:0), layout problems (margins, positioning, overflow), and identify which CSS rule is responsible for a property. Use browser_snapshot first to get refs.', stylesShape, async ({ ref, properties }) => {
|
|
20
|
-
const {
|
|
21
|
-
const result = await executeStyles(client, refMap, { ref, properties });
|
|
12
|
+
const result = await requireDriver(context).styles({ ref, properties });
|
|
22
13
|
return {
|
|
23
14
|
content: [{ type: 'text', text: result.text }]
|
|
24
15
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/mcp/tools/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/mcp/tools/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,GAAG;IAClB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IACzE,UAAU,EAAE,CAAC;SACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CACP,6IAA6I,CAC9I;CACJ,CAAC;AAEF,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,OAAuB;IAEvB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,mSAAmS,EACnS,WAAW,EACX,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;QACxE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
package/skills/pilot/SKILL.md
CHANGED
|
@@ -34,6 +34,15 @@ env = { DISPLAY = ":1" }
|
|
|
34
34
|
|
|
35
35
|
Replace `:1` with the actual value. If the X server requires a cookie, forward `XAUTHORITY` in the same map. For SSH, use trusted X11 forwarding (`ssh -Y`) when policy permits, or use a remote desktop session and its display value. Use `PILOT_HEADLESS=true` on systems without a desktop. In CI, use headless mode or run Pilot under Xvfb.
|
|
36
36
|
|
|
37
|
+
### Startup failures
|
|
38
|
+
|
|
39
|
+
Read the `Launch:`, `Cleanup:`, and `Next:` lines in the `browser_start` error before retrying.
|
|
40
|
+
|
|
41
|
+
- A failed `browser_start` stops the Chrome it launched and frees the profile unless `Cleanup:` names a pid that did not stop. Do not switch profiles just because a start failed.
|
|
42
|
+
- On a timeout, retry once with a larger `startupTimeoutMs` (for example `180000`). First runs and software-rendered Linux desktops can be slow.
|
|
43
|
+
- If Chrome exited in visible mode, check the display (above) or retry with `headless: true`.
|
|
44
|
+
- If the profile is already in use, the error names the owning Chrome pid and host. `browser_stop` cannot stop a browser that this session did not launch. Call `browser_status` to see which profiles are free and who holds the others. Use a different `profileName`, or, only after the user agrees, call `browser_stop_all`. It also stops browsers that other agents may be using.
|
|
45
|
+
|
|
37
46
|
### Other Linux preflight failures
|
|
38
47
|
|
|
39
48
|
- If the profile directory is not writable, set `XDG_DATA_HOME` to a writable directory.
|