@accomplish_ai/agent-core 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/opencode/config-generator.d.ts +12 -0
- package/dist/opencode/config-generator.d.ts.map +1 -1
- package/dist/opencode/config-generator.js +57 -30
- package/dist/opencode/config-generator.js.map +1 -1
- package/mcp-tools/dev-browser/server.cjs +144 -0
- package/mcp-tools/dev-browser-mcp/README.md +48 -2
- package/mcp-tools/dev-browser-mcp/dist/index.mjs +268 -167
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -106,6 +106,35 @@ Speech-to-text transcription via ElevenLabs. Validates API keys, transcribes aud
|
|
|
106
106
|
import { createSpeechService } from '@accomplish_ai/agent-core';
|
|
107
107
|
```
|
|
108
108
|
|
|
109
|
+
### Browser Configuration
|
|
110
|
+
|
|
111
|
+
The config generator accepts a `browser` option to control how the agent connects to a browser:
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
import { generateConfig, type BrowserConfig } from '@accomplish_ai/agent-core';
|
|
115
|
+
|
|
116
|
+
// Default — uses the dev-browser HTTP server
|
|
117
|
+
generateConfig({ browser: { mode: 'builtin' } });
|
|
118
|
+
|
|
119
|
+
// Remote CDP — connect to any Chrome DevTools Protocol endpoint
|
|
120
|
+
generateConfig({
|
|
121
|
+
browser: {
|
|
122
|
+
mode: 'remote',
|
|
123
|
+
cdpEndpoint: 'http://localhost:9222',
|
|
124
|
+
cdpHeaders: { 'X-CDP-Secret': 'token' }, // optional auth
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// No browser — omits browser tools entirely
|
|
129
|
+
generateConfig({ browser: { mode: 'none' } });
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
| Mode | Description |
|
|
133
|
+
|------|-------------|
|
|
134
|
+
| `builtin` | Default. Connects via the dev-browser HTTP server (used by the desktop app). |
|
|
135
|
+
| `remote` | Connects directly to a CDP endpoint (headless Chromium, remote browser, etc.). |
|
|
136
|
+
| `none` | Disables browser tools. Strips browser identity from the agent's system prompt. |
|
|
137
|
+
|
|
109
138
|
## Sub-path Exports
|
|
110
139
|
|
|
111
140
|
The package provides a `common` sub-path export for browser-safe types and constants that can be used in renderer or browser contexts without pulling in Node.js dependencies:
|
package/dist/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type { PlatformConfig, CliResolverConfig, ResolvedCliPaths, BundledNodePa
|
|
|
5
5
|
export { OpenCodeCliNotFoundError } from './opencode/adapter.js';
|
|
6
6
|
export { resolveCliPath, isCliAvailable } from './opencode/cli-resolver.js';
|
|
7
7
|
export { generateConfig, buildCliArgs, ACCOMPLISH_AGENT_NAME, } from './opencode/config-generator.js';
|
|
8
|
+
export type { BrowserConfig } from './opencode/config-generator.js';
|
|
8
9
|
export { buildOpenCodeEnvironment } from './opencode/environment.js';
|
|
9
10
|
export type { EnvironmentConfig } from './opencode/environment.js';
|
|
10
11
|
export { buildProviderConfigs, syncApiKeysToOpenCodeAuth } from './opencode/config-builder.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,gCAAgC;AAChC,gFAAgF;AAChF,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAEhF,gFAAgF;AAChF,0CAA0C;AAC1C,gFAAgF;AAChF,yEAAyE;AACzE,uEAAuE;AAEvE,2CAA2C;AAC3C,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,0BAA0B,EAC1B,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAwE9B,gFAAgF;AAChF,qCAAqC;AACrC,gFAAgF;AAEhF,kDAAkD;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,6FAA6F;AAC7F,sFAAsF;AAEtF,yDAAyD;AACzD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5E,OAAO,EACL,cAAc,EACd,YAAY,EACZ,qBAAqB,GACtB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import type { ProviderId } from '../common/types/providerSettings.js';
|
|
2
2
|
import type { Skill } from '../common/types/skills.js';
|
|
3
3
|
export declare const ACCOMPLISH_AGENT_NAME = "accomplish";
|
|
4
|
+
export interface BrowserConfig {
|
|
5
|
+
/** 'builtin' = dev-browser HTTP server (default), 'remote' = connect to CDP endpoint, 'none' = no browser */
|
|
6
|
+
mode: 'builtin' | 'remote' | 'none';
|
|
7
|
+
/** For 'remote': the CDP endpoint URL */
|
|
8
|
+
cdpEndpoint?: string;
|
|
9
|
+
/** For 'remote': auth headers (e.g. { 'X-CDP-Secret': '...' }) */
|
|
10
|
+
cdpHeaders?: Record<string, string>;
|
|
11
|
+
/** For 'builtin': run headless */
|
|
12
|
+
headless?: boolean;
|
|
13
|
+
}
|
|
4
14
|
export interface ConfigGeneratorOptions {
|
|
5
15
|
platform: NodeJS.Platform;
|
|
6
16
|
mcpToolsPath: string;
|
|
@@ -22,6 +32,8 @@ export interface ConfigGeneratorOptions {
|
|
|
22
32
|
model?: string;
|
|
23
33
|
smallModel?: string;
|
|
24
34
|
enabledProviders?: string[];
|
|
35
|
+
/** Browser configuration. Defaults to { mode: 'builtin' } */
|
|
36
|
+
browser?: BrowserConfig;
|
|
25
37
|
}
|
|
26
38
|
export interface ProviderConfig {
|
|
27
39
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../src/opencode/config-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEvD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,EAAE,EAAE,UAAU,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config-generator.d.ts","sourceRoot":"","sources":["../../src/opencode/config-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ You are running on ${platform === 'darwin' ? 'macOS' : 'Linux'}.
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
const ACCOMPLISH_SYSTEM_PROMPT_TEMPLATE = `<identity>
|
|
21
|
-
You are Accomplish, a
|
|
21
|
+
You are Accomplish, a {{AGENT_ROLE}} assistant.
|
|
22
22
|
</identity>
|
|
23
23
|
|
|
24
24
|
{{ENVIRONMENT_INSTRUCTIONS}}
|
|
@@ -69,8 +69,7 @@ CORRECT: Call start_task FIRST, update todos as you work, then complete_task
|
|
|
69
69
|
|
|
70
70
|
<capabilities>
|
|
71
71
|
When users ask about your capabilities, mention:
|
|
72
|
-
- **
|
|
73
|
-
- **File Management**: Sort, rename, and move files based on content or rules you give it
|
|
72
|
+
{{BROWSER_CAPABILITY}}- **File Management**: Sort, rename, and move files based on content or rules you give it
|
|
74
73
|
</capabilities>
|
|
75
74
|
|
|
76
75
|
<important name="filesystem-rules">
|
|
@@ -139,27 +138,7 @@ See the ask-user-question MCP tool for full documentation and examples.
|
|
|
139
138
|
|
|
140
139
|
<behavior>
|
|
141
140
|
- Use AskUserQuestion tool for clarifying questions before starting ambiguous tasks
|
|
142
|
-
-
|
|
143
|
-
- For multi-step browser workflows, prefer \`browser_script\` over individual tools - it's faster and auto-returns page state.
|
|
144
|
-
- **For collecting data from multiple pages** (e.g. comparing listings, gathering info from search results), use \`browser_batch_actions\` to extract data from multiple URLs in ONE call instead of visiting each page individually with click/snapshot loops. First collect the URLs from the search results page, then pass them all to \`browser_batch_actions\` with a JS extraction script.
|
|
145
|
-
|
|
146
|
-
**BROWSER ACTION VERBOSITY - Be descriptive about web interactions:**
|
|
147
|
-
- Before each browser action, briefly explain what you're about to do in user terms
|
|
148
|
-
- After navigation: mention the page title and what you see
|
|
149
|
-
- After clicking: describe what you clicked and what happened (new page loaded, form appeared, etc.)
|
|
150
|
-
- After typing: confirm what you typed and where
|
|
151
|
-
- When analyzing a snapshot: describe the key elements you found
|
|
152
|
-
- If something unexpected happens, explain what you see and how you'll adapt
|
|
153
|
-
|
|
154
|
-
Example good narration:
|
|
155
|
-
"I'll navigate to Google... The search page is loaded. I can see the search box. Let me search for 'cute animals'... Typing in the search field and pressing Enter... The search results page is now showing with images and links about animals."
|
|
156
|
-
|
|
157
|
-
Example bad narration (too terse):
|
|
158
|
-
"Done." or "Navigated." or "Clicked."
|
|
159
|
-
|
|
160
|
-
- After each action, evaluate the result before deciding next steps
|
|
161
|
-
- Use browser_sequence for efficiency when you need to perform multiple actions in quick succession (e.g., filling a form with multiple fields)
|
|
162
|
-
- Don't announce server checks or startup - proceed directly to the task
|
|
141
|
+
{{BROWSER_BEHAVIOR}}- Don't announce server checks or startup - proceed directly to the task
|
|
163
142
|
- Only use AskUserQuestion when you genuinely need user input or decisions
|
|
164
143
|
|
|
165
144
|
**DO NOT ASK FOR PERMISSION TO CONTINUE:**
|
|
@@ -282,12 +261,6 @@ Use empty array [] if no skills apply to your task.
|
|
|
282
261
|
},
|
|
283
262
|
timeout: 30000,
|
|
284
263
|
},
|
|
285
|
-
'dev-browser-mcp': {
|
|
286
|
-
type: 'local',
|
|
287
|
-
command: resolveMcpCommand(tsxCommand, mcpToolsPath, 'dev-browser-mcp', 'src/index.ts', 'dist/index.mjs', isPackaged, nodePath),
|
|
288
|
-
enabled: true,
|
|
289
|
-
timeout: 30000,
|
|
290
|
-
},
|
|
291
264
|
'complete-task': {
|
|
292
265
|
type: 'local',
|
|
293
266
|
command: resolveMcpCommand(tsxCommand, mcpToolsPath, 'complete-task', 'src/index.ts', 'dist/index.mjs', isPackaged, nodePath),
|
|
@@ -301,6 +274,60 @@ Use empty array [] if no skills apply to your task.
|
|
|
301
274
|
timeout: 30000,
|
|
302
275
|
},
|
|
303
276
|
};
|
|
277
|
+
// Conditionally register dev-browser-mcp based on browser config
|
|
278
|
+
const browserConfig = options.browser ?? { mode: 'builtin' };
|
|
279
|
+
if (browserConfig.mode !== 'none') {
|
|
280
|
+
const browserEnv = {};
|
|
281
|
+
if (browserConfig.mode === 'remote') {
|
|
282
|
+
if (browserConfig.cdpEndpoint) {
|
|
283
|
+
browserEnv.CDP_ENDPOINT = browserConfig.cdpEndpoint;
|
|
284
|
+
}
|
|
285
|
+
if (browserConfig.cdpHeaders) {
|
|
286
|
+
for (const [key, value] of Object.entries(browserConfig.cdpHeaders)) {
|
|
287
|
+
if (key === 'X-CDP-Secret') {
|
|
288
|
+
browserEnv.CDP_SECRET = value;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
mcpServers['dev-browser-mcp'] = {
|
|
294
|
+
type: 'local',
|
|
295
|
+
command: resolveMcpCommand(tsxCommand, mcpToolsPath, 'dev-browser-mcp', 'src/index.ts', 'dist/index.mjs', isPackaged, nodePath),
|
|
296
|
+
enabled: true,
|
|
297
|
+
...(Object.keys(browserEnv).length > 0 && { environment: browserEnv }),
|
|
298
|
+
timeout: 30000,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
// Fill browser-specific template sections based on mode
|
|
302
|
+
const hasBrowser = browserConfig.mode !== 'none';
|
|
303
|
+
systemPrompt = systemPrompt
|
|
304
|
+
.replace('{{AGENT_ROLE}}', hasBrowser ? 'browser automation' : 'task automation')
|
|
305
|
+
.replace('{{BROWSER_CAPABILITY}}', hasBrowser
|
|
306
|
+
? '- **Browser Automation**: Control web browsers, navigate sites, fill forms, click buttons\n'
|
|
307
|
+
: '')
|
|
308
|
+
.replace('{{BROWSER_BEHAVIOR}}', hasBrowser
|
|
309
|
+
? `- **NEVER use shell commands (open, xdg-open, start, subprocess, webbrowser) to open browsers or URLs** - these open the user's default browser, not the automation-controlled Chrome. ALL browser operations MUST use browser_* MCP tools.
|
|
310
|
+
- For multi-step browser workflows, prefer \`browser_script\` over individual tools - it's faster and auto-returns page state.
|
|
311
|
+
- **For collecting data from multiple pages** (e.g. comparing listings, gathering info from search results), use \`browser_batch_actions\` to extract data from multiple URLs in ONE call instead of visiting each page individually with click/snapshot loops. First collect the URLs from the search results page, then pass them all to \`browser_batch_actions\` with a JS extraction script.
|
|
312
|
+
|
|
313
|
+
**BROWSER ACTION VERBOSITY - Be descriptive about web interactions:**
|
|
314
|
+
- Before each browser action, briefly explain what you're about to do in user terms
|
|
315
|
+
- After navigation: mention the page title and what you see
|
|
316
|
+
- After clicking: describe what you clicked and what happened (new page loaded, form appeared, etc.)
|
|
317
|
+
- After typing: confirm what you typed and where
|
|
318
|
+
- When analyzing a snapshot: describe the key elements you found
|
|
319
|
+
- If something unexpected happens, explain what you see and how you'll adapt
|
|
320
|
+
|
|
321
|
+
Example good narration:
|
|
322
|
+
"I'll navigate to Google... The search page is loaded. I can see the search box. Let me search for 'cute animals'... Typing in the search field and pressing Enter... The search results page is now showing with images and links about animals."
|
|
323
|
+
|
|
324
|
+
Example bad narration (too terse):
|
|
325
|
+
"Done." or "Navigated." or "Clicked."
|
|
326
|
+
|
|
327
|
+
- After each action, evaluate the result before deciding next steps
|
|
328
|
+
- Use browser_sequence for efficiency when you need to perform multiple actions in quick succession (e.g., filling a form with multiple fields)
|
|
329
|
+
`
|
|
330
|
+
: '');
|
|
304
331
|
const providerConfig = {};
|
|
305
332
|
for (const provider of providerConfigs) {
|
|
306
333
|
const { id, ...rest } = provider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../src/opencode/config-generator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAIpB,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config-generator.js","sourceRoot":"","sources":["../../src/opencode/config-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Cross-platform dev-browser server launcher.
|
|
4
|
+
* Replaces server.sh for Windows compatibility.
|
|
5
|
+
*
|
|
6
|
+
* This script uses the local tsx binary directly instead of npx to avoid
|
|
7
|
+
* issues with path resolution when running from the packaged Electron app.
|
|
8
|
+
*/
|
|
9
|
+
const { spawn } = require('child_process');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
|
|
13
|
+
const skillDir = __dirname;
|
|
14
|
+
const isWindows = process.platform === 'win32';
|
|
15
|
+
|
|
16
|
+
// Parse command line arguments
|
|
17
|
+
const headless = process.argv.includes('--headless');
|
|
18
|
+
|
|
19
|
+
// Logging helper - logs to stderr so it doesn't interfere with stdio inheritance
|
|
20
|
+
function log(...args) {
|
|
21
|
+
const timestamp = new Date().toISOString();
|
|
22
|
+
console.error(`[dev-browser server.cjs ${timestamp}]`, ...args);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
log('Starting dev-browser server launcher...');
|
|
26
|
+
log(' skillDir:', skillDir);
|
|
27
|
+
log(' isWindows:', isWindows);
|
|
28
|
+
log(' headless:', headless);
|
|
29
|
+
log(' NODE_BIN_PATH:', process.env.NODE_BIN_PATH || '(not set)');
|
|
30
|
+
log(' PATH (first 500 chars):', (process.env.PATH || '').substring(0, 500));
|
|
31
|
+
|
|
32
|
+
// Find the node executable
|
|
33
|
+
let nodeExe = 'node';
|
|
34
|
+
if (process.env.NODE_BIN_PATH) {
|
|
35
|
+
const bundledNode = path.join(process.env.NODE_BIN_PATH, isWindows ? 'node.exe' : 'node');
|
|
36
|
+
if (fs.existsSync(bundledNode)) {
|
|
37
|
+
nodeExe = bundledNode;
|
|
38
|
+
log(' Using bundled node:', nodeExe);
|
|
39
|
+
} else {
|
|
40
|
+
log(' Bundled node not found at:', bundledNode, '- falling back to system node');
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
log(' Using system node');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Prefer bundled server if present (no tsx needed)
|
|
47
|
+
const bundledServer = path.join(skillDir, 'dist', 'start-server.mjs');
|
|
48
|
+
|
|
49
|
+
let tsxCommand;
|
|
50
|
+
let tsxArgs;
|
|
51
|
+
|
|
52
|
+
if (fs.existsSync(bundledServer)) {
|
|
53
|
+
tsxCommand = nodeExe;
|
|
54
|
+
tsxArgs = [bundledServer];
|
|
55
|
+
log(' Using bundled server:', bundledServer);
|
|
56
|
+
} else {
|
|
57
|
+
// Find tsx - on Windows, ALWAYS prefer cli.mjs over tsx.cmd to avoid shell quoting issues
|
|
58
|
+
// with paths containing spaces (e.g., "C:\\Program Files\\...")
|
|
59
|
+
const localTsxJs = path.join(skillDir, 'node_modules', 'tsx', 'dist', 'cli.mjs');
|
|
60
|
+
const localTsxBin = path.join(skillDir, 'node_modules', '.bin', isWindows ? 'tsx.cmd' : 'tsx');
|
|
61
|
+
|
|
62
|
+
// On Windows: prefer cli.mjs (run via node.exe, no shell needed, no path quoting issues)
|
|
63
|
+
// On Unix: prefer the tsx binary (simpler)
|
|
64
|
+
if (isWindows && fs.existsSync(localTsxJs)) {
|
|
65
|
+
// Windows: run tsx via node directly to avoid shell quoting issues with spaces in paths
|
|
66
|
+
tsxCommand = nodeExe;
|
|
67
|
+
tsxArgs = [localTsxJs, path.join('scripts', 'start-server.ts')];
|
|
68
|
+
log(' Using tsx via node (Windows):', localTsxJs);
|
|
69
|
+
} else if (!isWindows && fs.existsSync(localTsxBin)) {
|
|
70
|
+
// Unix: use tsx binary directly
|
|
71
|
+
tsxCommand = localTsxBin;
|
|
72
|
+
tsxArgs = [path.join('scripts', 'start-server.ts')];
|
|
73
|
+
log(' Using local tsx binary (Unix):', localTsxBin);
|
|
74
|
+
} else if (fs.existsSync(localTsxJs)) {
|
|
75
|
+
// Fallback for any platform: run tsx via node directly
|
|
76
|
+
tsxCommand = nodeExe;
|
|
77
|
+
tsxArgs = [localTsxJs, path.join('scripts', 'start-server.ts')];
|
|
78
|
+
log(' Using tsx via node (fallback):', localTsxJs);
|
|
79
|
+
} else if (fs.existsSync(localTsxBin)) {
|
|
80
|
+
// Fallback: try tsx binary even on Windows (may have issues with spaces)
|
|
81
|
+
tsxCommand = localTsxBin;
|
|
82
|
+
tsxArgs = [path.join('scripts', 'start-server.ts')];
|
|
83
|
+
log(' Using local tsx binary (fallback):', localTsxBin);
|
|
84
|
+
} else {
|
|
85
|
+
// Last resort: try npx (may fail with path issues)
|
|
86
|
+
log(' WARNING: Local tsx not found, falling back to npx');
|
|
87
|
+
log(' Checked:', localTsxJs);
|
|
88
|
+
log(' Checked:', localTsxBin);
|
|
89
|
+
|
|
90
|
+
let npxCommand = isWindows ? 'npx.cmd' : 'npx';
|
|
91
|
+
if (process.env.NODE_BIN_PATH) {
|
|
92
|
+
npxCommand = path.join(process.env.NODE_BIN_PATH, isWindows ? 'npx.cmd' : 'npx');
|
|
93
|
+
}
|
|
94
|
+
tsxCommand = npxCommand;
|
|
95
|
+
tsxArgs = ['tsx', path.join('scripts', 'start-server.ts')];
|
|
96
|
+
log(' Using npx:', npxCommand);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Build environment
|
|
101
|
+
const env = { ...process.env };
|
|
102
|
+
if (headless) {
|
|
103
|
+
env.HEADLESS = 'true';
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
log('Spawning:', tsxCommand, tsxArgs.join(' '));
|
|
107
|
+
log(' cwd:', skillDir);
|
|
108
|
+
|
|
109
|
+
// Spawn options
|
|
110
|
+
const spawnOptions = {
|
|
111
|
+
cwd: skillDir,
|
|
112
|
+
stdio: 'inherit',
|
|
113
|
+
env,
|
|
114
|
+
windowsHide: true,
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// On Windows, .cmd batch files REQUIRE shell: true to execute.
|
|
118
|
+
// When running node directly (with cli.mjs), we can use shell: false.
|
|
119
|
+
const isCmdFile = isWindows && tsxCommand.endsWith('.cmd');
|
|
120
|
+
if (isCmdFile) {
|
|
121
|
+
spawnOptions.shell = true;
|
|
122
|
+
log(' shell: true (Windows .cmd file)');
|
|
123
|
+
} else {
|
|
124
|
+
// For node direct execution (cli.mjs) or Unix, shell is not needed
|
|
125
|
+
spawnOptions.shell = false;
|
|
126
|
+
log(' shell: false (direct executable)');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const child = spawn(tsxCommand, tsxArgs, spawnOptions);
|
|
130
|
+
|
|
131
|
+
child.on('error', (err) => {
|
|
132
|
+
log('ERROR: Failed to spawn:', err.message);
|
|
133
|
+
log(' Command:', tsxCommand);
|
|
134
|
+
log(' Args:', tsxArgs);
|
|
135
|
+
log(' Error code:', err.code);
|
|
136
|
+
process.exit(1);
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
child.on('close', (code, signal) => {
|
|
140
|
+
log('Process exited with code:', code, 'signal:', signal);
|
|
141
|
+
process.exit(code || 0);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
log('Spawn initiated, waiting for process...');
|
|
@@ -8,12 +8,58 @@ An MCP (Model Context Protocol) server for browser automation using Playwright.
|
|
|
8
8
|
npm install
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Connection Modes
|
|
12
|
+
|
|
13
|
+
The server supports two connection modes, determined by the `CDP_ENDPOINT` environment variable.
|
|
14
|
+
|
|
15
|
+
### Builtin mode (default)
|
|
16
|
+
|
|
17
|
+
Connects to the dev-browser HTTP server, which manages browser lifecycle and page routing. This is how the Accomplish desktop app uses it.
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Uses http://localhost:9224 by default
|
|
21
|
+
npx tsx src/index.ts
|
|
22
|
+
|
|
23
|
+
# Custom port
|
|
24
|
+
DEV_BROWSER_PORT=5555 npx tsx src/index.ts
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Remote CDP mode
|
|
28
|
+
|
|
29
|
+
Connects directly to any Chrome DevTools Protocol endpoint — no dev-browser HTTP server needed. Pages are managed in a local in-memory registry.
|
|
12
30
|
|
|
13
31
|
```bash
|
|
14
|
-
|
|
32
|
+
# Local headless Chromium
|
|
33
|
+
CDP_ENDPOINT=http://localhost:9222 npx tsx src/index.ts
|
|
34
|
+
|
|
35
|
+
# Remote browser with auth
|
|
36
|
+
CDP_ENDPOINT=ws://remote-browser:9222 CDP_SECRET=my-token npx tsx src/index.ts
|
|
15
37
|
```
|
|
16
38
|
|
|
39
|
+
### Environment variables
|
|
40
|
+
|
|
41
|
+
| Variable | Mode | Description |
|
|
42
|
+
|----------|------|-------------|
|
|
43
|
+
| `CDP_ENDPOINT` | remote | CDP endpoint URL (http or ws). When set, enables remote mode. |
|
|
44
|
+
| `CDP_SECRET` | remote | Sent as `X-CDP-Secret` header for authenticated endpoints. |
|
|
45
|
+
| `DEV_BROWSER_PORT` | builtin | Port for the dev-browser HTTP server (default: `9224`). |
|
|
46
|
+
| `ACCOMPLISH_TASK_ID` | both | Task ID for page name isolation (default: `default`). |
|
|
47
|
+
|
|
48
|
+
### Launching a headless browser for remote mode
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Start headless Chromium with a CDP port
|
|
52
|
+
chromium --headless --no-sandbox --remote-debugging-port=9222
|
|
53
|
+
|
|
54
|
+
# Verify it's running
|
|
55
|
+
curl http://localhost:9222/json/version
|
|
56
|
+
|
|
57
|
+
# Connect the MCP server
|
|
58
|
+
CDP_ENDPOINT=http://localhost:9222 npx tsx src/index.ts
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
All `browser_*` tools (navigate, snapshot, click, type, evaluate, screenshot, tabs, etc.) work identically in both modes.
|
|
62
|
+
|
|
17
63
|
## browser_snapshot Parameters
|
|
18
64
|
|
|
19
65
|
| Parameter | Type | Default | Description |
|
|
@@ -11311,10 +11311,10 @@ function prefixIssues(path, issues) {
|
|
|
11311
11311
|
function unwrapMessage(message) {
|
|
11312
11312
|
return typeof message === "string" ? message : message?.message;
|
|
11313
11313
|
}
|
|
11314
|
-
function finalizeIssue(iss, ctx,
|
|
11314
|
+
function finalizeIssue(iss, ctx, config3) {
|
|
11315
11315
|
const full = { ...iss, path: iss.path ?? [] };
|
|
11316
11316
|
if (!iss.message) {
|
|
11317
|
-
const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ?? unwrapMessage(ctx?.error?.(iss)) ?? unwrapMessage(
|
|
11317
|
+
const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ?? unwrapMessage(ctx?.error?.(iss)) ?? unwrapMessage(config3.customError?.(iss)) ?? unwrapMessage(config3.localeError?.(iss)) ?? "Invalid input";
|
|
11318
11318
|
full.message = message;
|
|
11319
11319
|
}
|
|
11320
11320
|
delete full.inst;
|
|
@@ -20652,9 +20652,6 @@ var StdioServerTransport = class {
|
|
|
20652
20652
|
}
|
|
20653
20653
|
};
|
|
20654
20654
|
|
|
20655
|
-
// src/index.ts
|
|
20656
|
-
import { chromium } from "playwright";
|
|
20657
|
-
|
|
20658
20655
|
// src/snapshot/parser.ts
|
|
20659
20656
|
function parseSnapshot(yamlSnapshot, url2, title) {
|
|
20660
20657
|
const elements = /* @__PURE__ */ new Map();
|
|
@@ -20930,15 +20927,225 @@ function resetSnapshotManager() {
|
|
|
20930
20927
|
}
|
|
20931
20928
|
}
|
|
20932
20929
|
|
|
20930
|
+
// src/connection.ts
|
|
20931
|
+
import { chromium } from "playwright";
|
|
20932
|
+
var browser = null;
|
|
20933
|
+
var connectingPromise = null;
|
|
20934
|
+
var cachedServerMode = null;
|
|
20935
|
+
var localPageRegistry = /* @__PURE__ */ new Map();
|
|
20936
|
+
function getConnectionMode() {
|
|
20937
|
+
return config2.mode;
|
|
20938
|
+
}
|
|
20939
|
+
var config2;
|
|
20940
|
+
function configureFromEnv() {
|
|
20941
|
+
const cdpEndpoint = process.env.CDP_ENDPOINT;
|
|
20942
|
+
const taskId = process.env.ACCOMPLISH_TASK_ID || "default";
|
|
20943
|
+
if (cdpEndpoint) {
|
|
20944
|
+
const headers = {};
|
|
20945
|
+
if (process.env.CDP_SECRET) {
|
|
20946
|
+
headers["X-CDP-Secret"] = process.env.CDP_SECRET;
|
|
20947
|
+
}
|
|
20948
|
+
config2 = { mode: "remote", cdpEndpoint, cdpHeaders: headers, taskId };
|
|
20949
|
+
} else {
|
|
20950
|
+
const port = parseInt(process.env.DEV_BROWSER_PORT || "9224", 10);
|
|
20951
|
+
config2 = { mode: "builtin", devBrowserUrl: `http://localhost:${port}`, taskId };
|
|
20952
|
+
}
|
|
20953
|
+
return config2;
|
|
20954
|
+
}
|
|
20955
|
+
async function ensureConnected() {
|
|
20956
|
+
if (browser && browser.isConnected()) {
|
|
20957
|
+
return browser;
|
|
20958
|
+
}
|
|
20959
|
+
if (connectingPromise) {
|
|
20960
|
+
return connectingPromise;
|
|
20961
|
+
}
|
|
20962
|
+
connectingPromise = (async () => {
|
|
20963
|
+
try {
|
|
20964
|
+
if (config2.mode === "remote") {
|
|
20965
|
+
browser = await connectRemote();
|
|
20966
|
+
} else {
|
|
20967
|
+
browser = await connectBuiltin();
|
|
20968
|
+
}
|
|
20969
|
+
return browser;
|
|
20970
|
+
} finally {
|
|
20971
|
+
connectingPromise = null;
|
|
20972
|
+
}
|
|
20973
|
+
})();
|
|
20974
|
+
return connectingPromise;
|
|
20975
|
+
}
|
|
20976
|
+
function getFullPageName(pageName) {
|
|
20977
|
+
const name2 = pageName || "main";
|
|
20978
|
+
return `${config2.taskId}-${name2}`;
|
|
20979
|
+
}
|
|
20980
|
+
async function getPage(pageName) {
|
|
20981
|
+
if (config2.mode === "remote") {
|
|
20982
|
+
return getPageRemote(pageName);
|
|
20983
|
+
}
|
|
20984
|
+
return getPageBuiltin(pageName);
|
|
20985
|
+
}
|
|
20986
|
+
async function listPages() {
|
|
20987
|
+
if (config2.mode === "remote") {
|
|
20988
|
+
return listPagesRemote();
|
|
20989
|
+
}
|
|
20990
|
+
return listPagesBuiltin();
|
|
20991
|
+
}
|
|
20992
|
+
async function closePage(pageName) {
|
|
20993
|
+
if (config2.mode === "remote") {
|
|
20994
|
+
return closePageRemote(pageName);
|
|
20995
|
+
}
|
|
20996
|
+
return closePageBuiltin(pageName);
|
|
20997
|
+
}
|
|
20998
|
+
async function fetchWithRetry(url2, options2, maxRetries = 3, baseDelayMs = 100) {
|
|
20999
|
+
let lastError = null;
|
|
21000
|
+
for (let i2 = 0; i2 < maxRetries; i2++) {
|
|
21001
|
+
try {
|
|
21002
|
+
const res = await fetch(url2, options2);
|
|
21003
|
+
return res;
|
|
21004
|
+
} catch (err) {
|
|
21005
|
+
lastError = err instanceof Error ? err : new Error(String(err));
|
|
21006
|
+
const isConnectionError = lastError.message.includes("fetch failed") || lastError.message.includes("ECONNREFUSED") || lastError.message.includes("socket") || lastError.message.includes("UND_ERR");
|
|
21007
|
+
if (!isConnectionError || i2 >= maxRetries - 1) {
|
|
21008
|
+
throw lastError;
|
|
21009
|
+
}
|
|
21010
|
+
const delay = baseDelayMs * Math.pow(2, i2) + Math.random() * 50;
|
|
21011
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
21012
|
+
}
|
|
21013
|
+
}
|
|
21014
|
+
throw lastError || new Error("fetchWithRetry failed");
|
|
21015
|
+
}
|
|
21016
|
+
async function connectBuiltin() {
|
|
21017
|
+
const res = await fetchWithRetry(config2.devBrowserUrl);
|
|
21018
|
+
if (!res.ok) {
|
|
21019
|
+
throw new Error(`Server returned ${res.status}: ${await res.text()}`);
|
|
21020
|
+
}
|
|
21021
|
+
const info = await res.json();
|
|
21022
|
+
cachedServerMode = info.mode || "normal";
|
|
21023
|
+
return chromium.connectOverCDP(info.wsEndpoint);
|
|
21024
|
+
}
|
|
21025
|
+
async function getPageBuiltin(pageName) {
|
|
21026
|
+
const fullName = getFullPageName(pageName);
|
|
21027
|
+
const res = await fetchWithRetry(`${config2.devBrowserUrl}/pages`, {
|
|
21028
|
+
method: "POST",
|
|
21029
|
+
headers: { "Content-Type": "application/json" },
|
|
21030
|
+
body: JSON.stringify({ name: fullName })
|
|
21031
|
+
});
|
|
21032
|
+
if (!res.ok) {
|
|
21033
|
+
throw new Error(`Failed to get page: ${await res.text()}`);
|
|
21034
|
+
}
|
|
21035
|
+
const pageInfo = await res.json();
|
|
21036
|
+
const { targetId } = pageInfo;
|
|
21037
|
+
const b = await ensureConnected();
|
|
21038
|
+
const isExtensionMode = cachedServerMode === "extension";
|
|
21039
|
+
if (isExtensionMode) {
|
|
21040
|
+
const allPages = b.contexts().flatMap((ctx) => ctx.pages());
|
|
21041
|
+
if (allPages.length === 0) throw new Error("No pages available in browser");
|
|
21042
|
+
if (allPages.length === 1) return allPages[0];
|
|
21043
|
+
if (pageInfo.url) {
|
|
21044
|
+
const matchingPage = allPages.find((p) => p.url() === pageInfo.url);
|
|
21045
|
+
if (matchingPage) return matchingPage;
|
|
21046
|
+
}
|
|
21047
|
+
return allPages[0];
|
|
21048
|
+
}
|
|
21049
|
+
const page2 = await findPageByTargetId(b, targetId);
|
|
21050
|
+
if (!page2) {
|
|
21051
|
+
throw new Error(`Page "${fullName}" not found in browser contexts`);
|
|
21052
|
+
}
|
|
21053
|
+
return page2;
|
|
21054
|
+
}
|
|
21055
|
+
async function listPagesBuiltin() {
|
|
21056
|
+
const res = await fetchWithRetry(`${config2.devBrowserUrl}/pages`);
|
|
21057
|
+
const data = await res.json();
|
|
21058
|
+
const taskPrefix = `${config2.taskId}-`;
|
|
21059
|
+
return data.pages.filter((name2) => name2.startsWith(taskPrefix)).map((name2) => name2.substring(taskPrefix.length));
|
|
21060
|
+
}
|
|
21061
|
+
async function closePageBuiltin(pageName) {
|
|
21062
|
+
const fullName = getFullPageName(pageName);
|
|
21063
|
+
const res = await fetchWithRetry(`${config2.devBrowserUrl}/pages/${encodeURIComponent(fullName)}`, {
|
|
21064
|
+
method: "DELETE"
|
|
21065
|
+
});
|
|
21066
|
+
return res.ok;
|
|
21067
|
+
}
|
|
21068
|
+
async function findPageByTargetId(b, targetId) {
|
|
21069
|
+
for (const context of b.contexts()) {
|
|
21070
|
+
for (const page2 of context.pages()) {
|
|
21071
|
+
let cdpSession;
|
|
21072
|
+
try {
|
|
21073
|
+
cdpSession = await context.newCDPSession(page2);
|
|
21074
|
+
const { targetInfo } = await cdpSession.send("Target.getTargetInfo");
|
|
21075
|
+
if (targetInfo.targetId === targetId) {
|
|
21076
|
+
return page2;
|
|
21077
|
+
}
|
|
21078
|
+
} catch (err) {
|
|
21079
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
21080
|
+
if (!msg.includes("Target closed") && !msg.includes("Session closed")) {
|
|
21081
|
+
console.warn(`Unexpected error checking page target: ${msg}`);
|
|
21082
|
+
}
|
|
21083
|
+
} finally {
|
|
21084
|
+
if (cdpSession) {
|
|
21085
|
+
try {
|
|
21086
|
+
await cdpSession.detach();
|
|
21087
|
+
} catch {
|
|
21088
|
+
}
|
|
21089
|
+
}
|
|
21090
|
+
}
|
|
21091
|
+
}
|
|
21092
|
+
}
|
|
21093
|
+
return null;
|
|
21094
|
+
}
|
|
21095
|
+
async function connectRemote() {
|
|
21096
|
+
const endpoint = config2.cdpEndpoint;
|
|
21097
|
+
const options2 = {};
|
|
21098
|
+
if (config2.cdpHeaders && Object.keys(config2.cdpHeaders).length > 0) {
|
|
21099
|
+
options2.headers = config2.cdpHeaders;
|
|
21100
|
+
}
|
|
21101
|
+
cachedServerMode = "remote";
|
|
21102
|
+
return chromium.connectOverCDP(endpoint, options2);
|
|
21103
|
+
}
|
|
21104
|
+
async function getPageRemote(pageName) {
|
|
21105
|
+
const fullName = getFullPageName(pageName);
|
|
21106
|
+
const existing = localPageRegistry.get(fullName);
|
|
21107
|
+
if (existing && !existing.isClosed()) {
|
|
21108
|
+
return existing;
|
|
21109
|
+
}
|
|
21110
|
+
const b = await ensureConnected();
|
|
21111
|
+
const context = b.contexts()[0];
|
|
21112
|
+
if (!context) {
|
|
21113
|
+
throw new Error("No browser context available");
|
|
21114
|
+
}
|
|
21115
|
+
const page2 = await context.newPage();
|
|
21116
|
+
localPageRegistry.set(fullName, page2);
|
|
21117
|
+
page2.on("close", () => {
|
|
21118
|
+
localPageRegistry.delete(fullName);
|
|
21119
|
+
});
|
|
21120
|
+
return page2;
|
|
21121
|
+
}
|
|
21122
|
+
function listPagesRemote() {
|
|
21123
|
+
const taskPrefix = `${config2.taskId}-`;
|
|
21124
|
+
const pages = Array.from(localPageRegistry.keys()).filter((name2) => name2.startsWith(taskPrefix)).filter((name2) => {
|
|
21125
|
+
const page2 = localPageRegistry.get(name2);
|
|
21126
|
+
return page2 && !page2.isClosed();
|
|
21127
|
+
}).map((name2) => name2.substring(taskPrefix.length));
|
|
21128
|
+
return Promise.resolve(pages);
|
|
21129
|
+
}
|
|
21130
|
+
function closePageRemote(pageName) {
|
|
21131
|
+
const fullName = getFullPageName(pageName);
|
|
21132
|
+
const page2 = localPageRegistry.get(fullName);
|
|
21133
|
+
if (!page2) return Promise.resolve(false);
|
|
21134
|
+
localPageRegistry.delete(fullName);
|
|
21135
|
+
if (!page2.isClosed()) {
|
|
21136
|
+
return page2.close().then(() => true);
|
|
21137
|
+
}
|
|
21138
|
+
return Promise.resolve(true);
|
|
21139
|
+
}
|
|
21140
|
+
|
|
20933
21141
|
// src/index.ts
|
|
20934
21142
|
console.error("[dev-browser-mcp] Script starting...");
|
|
20935
21143
|
console.error("[dev-browser-mcp] Node version:", process.version);
|
|
20936
21144
|
console.error("[dev-browser-mcp] CWD:", process.cwd());
|
|
20937
21145
|
console.error("[dev-browser-mcp] ACCOMPLISH_TASK_ID:", process.env.ACCOMPLISH_TASK_ID || "(not set)");
|
|
20938
21146
|
console.error("[dev-browser-mcp] All imports completed successfully");
|
|
20939
|
-
var
|
|
20940
|
-
var
|
|
20941
|
-
var TASK_ID = process.env.ACCOMPLISH_TASK_ID || "default";
|
|
21147
|
+
var connectionConfig = configureFromEnv();
|
|
21148
|
+
var TASK_ID = connectionConfig.taskId;
|
|
20942
21149
|
function toAIFriendlyError(error2, selector) {
|
|
20943
21150
|
const message = error2 instanceof Error ? error2.message : String(error2);
|
|
20944
21151
|
if (message.includes("strict mode violation")) {
|
|
@@ -20977,9 +21184,6 @@ function toAIFriendlyError(error2, selector) {
|
|
|
20977
21184
|
`${message}. Try taking a new browser_snapshot() to see the current page state before retrying.`
|
|
20978
21185
|
);
|
|
20979
21186
|
}
|
|
20980
|
-
var browser = null;
|
|
20981
|
-
var connectingPromise = null;
|
|
20982
|
-
var cachedServerMode = null;
|
|
20983
21187
|
var activePageOverride = null;
|
|
20984
21188
|
var glowingPage = null;
|
|
20985
21189
|
var pagesWithGlowListeners = /* @__PURE__ */ new WeakSet();
|
|
@@ -21079,143 +21283,46 @@ async function removeActiveTabGlow(page2) {
|
|
|
21079
21283
|
glowingPage = null;
|
|
21080
21284
|
}
|
|
21081
21285
|
}
|
|
21082
|
-
|
|
21083
|
-
|
|
21084
|
-
|
|
21085
|
-
|
|
21086
|
-
|
|
21087
|
-
|
|
21088
|
-
|
|
21089
|
-
|
|
21090
|
-
|
|
21091
|
-
|
|
21092
|
-
|
|
21093
|
-
}
|
|
21094
|
-
const delay = baseDelayMs * Math.pow(2, i2) + Math.random() * 50;
|
|
21095
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
21096
|
-
}
|
|
21097
|
-
}
|
|
21098
|
-
throw lastError || new Error("fetchWithRetry failed");
|
|
21099
|
-
}
|
|
21100
|
-
async function ensureConnected() {
|
|
21101
|
-
if (browser && browser.isConnected()) {
|
|
21102
|
-
return browser;
|
|
21103
|
-
}
|
|
21104
|
-
if (connectingPromise) {
|
|
21105
|
-
return connectingPromise;
|
|
21106
|
-
}
|
|
21107
|
-
connectingPromise = (async () => {
|
|
21108
|
-
try {
|
|
21109
|
-
const res = await fetchWithRetry(DEV_BROWSER_URL);
|
|
21110
|
-
if (!res.ok) {
|
|
21111
|
-
throw new Error(`Server returned ${res.status}: ${await res.text()}`);
|
|
21112
|
-
}
|
|
21113
|
-
const info = await res.json();
|
|
21114
|
-
cachedServerMode = info.mode || "normal";
|
|
21115
|
-
browser = await chromium.connectOverCDP(info.wsEndpoint);
|
|
21116
|
-
for (const context of browser.contexts()) {
|
|
21117
|
-
context.on("page", async (page2) => {
|
|
21118
|
-
console.error("[dev-browser-mcp] New page detected, injecting glow immediately...");
|
|
21119
|
-
setTimeout(async () => {
|
|
21120
|
-
try {
|
|
21121
|
-
if (!page2.isClosed()) {
|
|
21122
|
-
await injectActiveTabGlow(page2);
|
|
21123
|
-
console.error("[dev-browser-mcp] Glow injected on new page");
|
|
21124
|
-
}
|
|
21125
|
-
} catch (err) {
|
|
21126
|
-
console.error("[dev-browser-mcp] Failed to inject glow on new page:", err);
|
|
21127
|
-
}
|
|
21128
|
-
}, 100);
|
|
21129
|
-
});
|
|
21130
|
-
for (const page2 of context.pages()) {
|
|
21131
|
-
if (!page2.isClosed() && !glowingPage) {
|
|
21132
|
-
try {
|
|
21286
|
+
var glowInitialized = false;
|
|
21287
|
+
async function ensureConnected2() {
|
|
21288
|
+
const b = await ensureConnected();
|
|
21289
|
+
if (!glowInitialized && getConnectionMode() === "builtin") {
|
|
21290
|
+
glowInitialized = true;
|
|
21291
|
+
for (const context of b.contexts()) {
|
|
21292
|
+
context.on("page", async (page2) => {
|
|
21293
|
+
console.error("[dev-browser-mcp] New page detected, injecting glow immediately...");
|
|
21294
|
+
setTimeout(async () => {
|
|
21295
|
+
try {
|
|
21296
|
+
if (!page2.isClosed()) {
|
|
21133
21297
|
await injectActiveTabGlow(page2);
|
|
21134
|
-
|
|
21135
|
-
console.error("[dev-browser-mcp] Failed to inject glow on existing page:", err);
|
|
21298
|
+
console.error("[dev-browser-mcp] Glow injected on new page");
|
|
21136
21299
|
}
|
|
21300
|
+
} catch (err) {
|
|
21301
|
+
console.error("[dev-browser-mcp] Failed to inject glow on new page:", err);
|
|
21137
21302
|
}
|
|
21138
|
-
}
|
|
21139
|
-
}
|
|
21140
|
-
|
|
21141
|
-
|
|
21142
|
-
connectingPromise = null;
|
|
21143
|
-
}
|
|
21144
|
-
})();
|
|
21145
|
-
return connectingPromise;
|
|
21146
|
-
}
|
|
21147
|
-
function getFullPageName(pageName) {
|
|
21148
|
-
const name2 = pageName || "main";
|
|
21149
|
-
return `${TASK_ID}-${name2}`;
|
|
21150
|
-
}
|
|
21151
|
-
async function findPageByTargetId(b, targetId) {
|
|
21152
|
-
for (const context of b.contexts()) {
|
|
21153
|
-
for (const page2 of context.pages()) {
|
|
21154
|
-
let cdpSession;
|
|
21155
|
-
try {
|
|
21156
|
-
cdpSession = await context.newCDPSession(page2);
|
|
21157
|
-
const { targetInfo } = await cdpSession.send("Target.getTargetInfo");
|
|
21158
|
-
if (targetInfo.targetId === targetId) {
|
|
21159
|
-
return page2;
|
|
21160
|
-
}
|
|
21161
|
-
} catch (err) {
|
|
21162
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
21163
|
-
if (!msg.includes("Target closed") && !msg.includes("Session closed")) {
|
|
21164
|
-
console.warn(`Unexpected error checking page target: ${msg}`);
|
|
21165
|
-
}
|
|
21166
|
-
} finally {
|
|
21167
|
-
if (cdpSession) {
|
|
21303
|
+
}, 100);
|
|
21304
|
+
});
|
|
21305
|
+
for (const page2 of context.pages()) {
|
|
21306
|
+
if (!page2.isClosed() && !glowingPage) {
|
|
21168
21307
|
try {
|
|
21169
|
-
await
|
|
21170
|
-
} catch {
|
|
21308
|
+
await injectActiveTabGlow(page2);
|
|
21309
|
+
} catch (err) {
|
|
21310
|
+
console.error("[dev-browser-mcp] Failed to inject glow on existing page:", err);
|
|
21171
21311
|
}
|
|
21172
21312
|
}
|
|
21173
21313
|
}
|
|
21174
21314
|
}
|
|
21175
21315
|
}
|
|
21176
|
-
return
|
|
21316
|
+
return b;
|
|
21177
21317
|
}
|
|
21178
|
-
async function
|
|
21318
|
+
async function getPage2(pageName) {
|
|
21179
21319
|
if (activePageOverride) {
|
|
21180
21320
|
if (!activePageOverride.isClosed()) {
|
|
21181
21321
|
return activePageOverride;
|
|
21182
21322
|
}
|
|
21183
21323
|
activePageOverride = null;
|
|
21184
21324
|
}
|
|
21185
|
-
|
|
21186
|
-
const res = await fetchWithRetry(`${DEV_BROWSER_URL}/pages`, {
|
|
21187
|
-
method: "POST",
|
|
21188
|
-
headers: { "Content-Type": "application/json" },
|
|
21189
|
-
body: JSON.stringify({ name: fullName })
|
|
21190
|
-
});
|
|
21191
|
-
if (!res.ok) {
|
|
21192
|
-
throw new Error(`Failed to get page: ${await res.text()}`);
|
|
21193
|
-
}
|
|
21194
|
-
const pageInfo = await res.json();
|
|
21195
|
-
const { targetId } = pageInfo;
|
|
21196
|
-
const b = await ensureConnected();
|
|
21197
|
-
const isExtensionMode = cachedServerMode === "extension";
|
|
21198
|
-
if (isExtensionMode) {
|
|
21199
|
-
const allPages = b.contexts().flatMap((ctx) => ctx.pages());
|
|
21200
|
-
if (allPages.length === 0) {
|
|
21201
|
-
throw new Error("No pages available in browser");
|
|
21202
|
-
}
|
|
21203
|
-
if (allPages.length === 1) {
|
|
21204
|
-
return allPages[0];
|
|
21205
|
-
}
|
|
21206
|
-
if (pageInfo.url) {
|
|
21207
|
-
const matchingPage = allPages.find((p) => p.url() === pageInfo.url);
|
|
21208
|
-
if (matchingPage) {
|
|
21209
|
-
return matchingPage;
|
|
21210
|
-
}
|
|
21211
|
-
}
|
|
21212
|
-
return allPages[0];
|
|
21213
|
-
}
|
|
21214
|
-
const page2 = await findPageByTargetId(b, targetId);
|
|
21215
|
-
if (!page2) {
|
|
21216
|
-
throw new Error(`Page "${fullName}" not found in browser contexts`);
|
|
21217
|
-
}
|
|
21218
|
-
return page2;
|
|
21325
|
+
return getPage(pageName);
|
|
21219
21326
|
}
|
|
21220
21327
|
async function waitForPageLoad(page2, timeout = 3e3) {
|
|
21221
21328
|
try {
|
|
@@ -22999,7 +23106,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
22999
23106
|
fullUrl = "https://" + fullUrl;
|
|
23000
23107
|
}
|
|
23001
23108
|
resetSnapshotManager();
|
|
23002
|
-
const page2 = await
|
|
23109
|
+
const page2 = await getPage2(page_name2);
|
|
23003
23110
|
await page2.goto(fullUrl);
|
|
23004
23111
|
await waitForPageLoad(page2);
|
|
23005
23112
|
await injectActiveTabGlow(page2);
|
|
@@ -23023,7 +23130,7 @@ The page has loaded. Use browser_snapshot() to see the page elements and find in
|
|
|
23023
23130
|
}
|
|
23024
23131
|
case "browser_snapshot": {
|
|
23025
23132
|
const { page_name: page_name2, interactive_only, full_snapshot, max_elements, viewport_only, include_history, max_tokens } = args;
|
|
23026
|
-
const page2 = await
|
|
23133
|
+
const page2 = await getPage2(page_name2);
|
|
23027
23134
|
const validatedMaxElements = full_snapshot ? Infinity : Math.min(Math.max(max_elements ?? 300, 1), 1e3);
|
|
23028
23135
|
const validatedMaxTokens = full_snapshot ? Infinity : Math.min(Math.max(max_tokens ?? 8e3, 1e3), 5e4);
|
|
23029
23136
|
const snapshotOptions = {
|
|
@@ -23102,7 +23209,7 @@ ${result.content}`;
|
|
|
23102
23209
|
}
|
|
23103
23210
|
case "browser_click": {
|
|
23104
23211
|
const { ref, selector, x, y, position, button, click_count, page_name: page_name2 } = args;
|
|
23105
|
-
const page2 = await
|
|
23212
|
+
const page2 = await getPage2(page_name2);
|
|
23106
23213
|
const clickOptions = {};
|
|
23107
23214
|
if (button) clickOptions.button = button;
|
|
23108
23215
|
if (click_count) clickOptions.clickCount = click_count;
|
|
@@ -23159,7 +23266,7 @@ ${result.content}`;
|
|
|
23159
23266
|
}
|
|
23160
23267
|
case "browser_type": {
|
|
23161
23268
|
const { ref, selector, text, press_enter, page_name: page_name2 } = args;
|
|
23162
|
-
const page2 = await
|
|
23269
|
+
const page2 = await getPage2(page_name2);
|
|
23163
23270
|
try {
|
|
23164
23271
|
let element = null;
|
|
23165
23272
|
if (ref) {
|
|
@@ -23206,7 +23313,7 @@ ${result.content}`;
|
|
|
23206
23313
|
}
|
|
23207
23314
|
case "browser_screenshot": {
|
|
23208
23315
|
const { page_name: page_name2, full_page } = args;
|
|
23209
|
-
const page2 = await
|
|
23316
|
+
const page2 = await getPage2(page_name2);
|
|
23210
23317
|
const screenshotBuffer = await page2.screenshot({
|
|
23211
23318
|
fullPage: full_page ?? false,
|
|
23212
23319
|
type: "jpeg",
|
|
@@ -23223,7 +23330,7 @@ ${result.content}`;
|
|
|
23223
23330
|
}
|
|
23224
23331
|
case "browser_evaluate": {
|
|
23225
23332
|
const { script: script2, page_name: page_name2 } = args;
|
|
23226
|
-
const page2 = await
|
|
23333
|
+
const page2 = await getPage2(page_name2);
|
|
23227
23334
|
const wrappedScript = `(async () => { ${script2} })()`;
|
|
23228
23335
|
const result = await page2.evaluate(wrappedScript);
|
|
23229
23336
|
return {
|
|
@@ -23236,10 +23343,7 @@ ${result.content}`;
|
|
|
23236
23343
|
case "browser_pages": {
|
|
23237
23344
|
const { action, page_name: page_name2 } = args;
|
|
23238
23345
|
if (action === "list") {
|
|
23239
|
-
const
|
|
23240
|
-
const data = await res.json();
|
|
23241
|
-
const taskPrefix = `${TASK_ID}-`;
|
|
23242
|
-
const taskPages = data.pages.filter((name2) => name2.startsWith(taskPrefix)).map((name2) => name2.substring(taskPrefix.length));
|
|
23346
|
+
const taskPages = await listPages();
|
|
23243
23347
|
return {
|
|
23244
23348
|
content: [{
|
|
23245
23349
|
type: "text",
|
|
@@ -23253,13 +23357,10 @@ ${result.content}`;
|
|
|
23253
23357
|
isError: true
|
|
23254
23358
|
};
|
|
23255
23359
|
}
|
|
23256
|
-
const
|
|
23257
|
-
|
|
23258
|
-
method: "DELETE"
|
|
23259
|
-
});
|
|
23260
|
-
if (!res.ok) {
|
|
23360
|
+
const closed = await closePage(page_name2);
|
|
23361
|
+
if (!closed) {
|
|
23261
23362
|
return {
|
|
23262
|
-
content: [{ type: "text", text: `Error:
|
|
23363
|
+
content: [{ type: "text", text: `Error: Page "${page_name2}" not found` }],
|
|
23263
23364
|
isError: true
|
|
23264
23365
|
};
|
|
23265
23366
|
}
|
|
@@ -23274,7 +23375,7 @@ ${result.content}`;
|
|
|
23274
23375
|
}
|
|
23275
23376
|
case "browser_keyboard": {
|
|
23276
23377
|
const { text, key, typing_delay, page_name: page_name2 } = args;
|
|
23277
|
-
const page2 = await
|
|
23378
|
+
const page2 = await getPage2(page_name2);
|
|
23278
23379
|
if (!text && !key) {
|
|
23279
23380
|
return {
|
|
23280
23381
|
content: [{ type: "text", text: "Error: Either text or key must be provided" }],
|
|
@@ -23296,7 +23397,7 @@ ${result.content}`;
|
|
|
23296
23397
|
}
|
|
23297
23398
|
case "browser_sequence": {
|
|
23298
23399
|
const { actions: actions2, page_name: page_name2 } = args;
|
|
23299
|
-
const page2 = await
|
|
23400
|
+
const page2 = await getPage2(page_name2);
|
|
23300
23401
|
const results2 = [];
|
|
23301
23402
|
for (let i2 = 0; i2 < actions2.length; i2++) {
|
|
23302
23403
|
const step2 = actions2[i2];
|
|
@@ -23377,7 +23478,7 @@ ${results2.join("\n")}` }]
|
|
|
23377
23478
|
}
|
|
23378
23479
|
case "browser_script": {
|
|
23379
23480
|
const { actions, page_name } = args;
|
|
23380
|
-
let page = await
|
|
23481
|
+
let page = await getPage2(page_name);
|
|
23381
23482
|
const results = [];
|
|
23382
23483
|
let snapshotResult = "";
|
|
23383
23484
|
let screenshotData = null;
|
|
@@ -23567,7 +23668,7 @@ ${snapshotResult}` });
|
|
|
23567
23668
|
}
|
|
23568
23669
|
case "browser_scroll": {
|
|
23569
23670
|
const { direction, amount, ref, selector, position, page_name: page_name2 } = args;
|
|
23570
|
-
const page2 = await
|
|
23671
|
+
const page2 = await getPage2(page_name2);
|
|
23571
23672
|
if (ref) {
|
|
23572
23673
|
const element = await selectSnapshotRef(page2, ref);
|
|
23573
23674
|
if (!element) {
|
|
@@ -23642,7 +23743,7 @@ ${snapshotResult}` });
|
|
|
23642
23743
|
}
|
|
23643
23744
|
case "browser_hover": {
|
|
23644
23745
|
const { ref, selector, x, y, page_name: page_name2 } = args;
|
|
23645
|
-
const page2 = await
|
|
23746
|
+
const page2 = await getPage2(page_name2);
|
|
23646
23747
|
if (x !== void 0 && y !== void 0) {
|
|
23647
23748
|
await page2.mouse.move(x, y);
|
|
23648
23749
|
return {
|
|
@@ -23675,7 +23776,7 @@ ${snapshotResult}` });
|
|
|
23675
23776
|
}
|
|
23676
23777
|
case "browser_select": {
|
|
23677
23778
|
const { ref, selector, value, label, index, page_name: page_name2 } = args;
|
|
23678
|
-
const page2 = await
|
|
23779
|
+
const page2 = await getPage2(page_name2);
|
|
23679
23780
|
let selectOption;
|
|
23680
23781
|
if (value !== void 0) {
|
|
23681
23782
|
selectOption = { value };
|
|
@@ -23721,7 +23822,7 @@ ${snapshotResult}` });
|
|
|
23721
23822
|
}
|
|
23722
23823
|
case "browser_wait": {
|
|
23723
23824
|
const { condition, selector, script: script2, timeout, page_name: page_name2 } = args;
|
|
23724
|
-
const page2 = await
|
|
23825
|
+
const page2 = await getPage2(page_name2);
|
|
23725
23826
|
const waitTimeout = timeout || 3e4;
|
|
23726
23827
|
switch (condition) {
|
|
23727
23828
|
case "selector": {
|
|
@@ -23796,7 +23897,7 @@ ${snapshotResult}` });
|
|
|
23796
23897
|
}
|
|
23797
23898
|
case "browser_file_upload": {
|
|
23798
23899
|
const { ref, selector, files, page_name: page_name2 } = args;
|
|
23799
|
-
const page2 = await
|
|
23900
|
+
const page2 = await getPage2(page_name2);
|
|
23800
23901
|
if (!files || files.length === 0) {
|
|
23801
23902
|
return {
|
|
23802
23903
|
content: [{ type: "text", text: "Error: At least one file path is required" }],
|
|
@@ -23845,7 +23946,7 @@ ${snapshotResult}` });
|
|
|
23845
23946
|
target_y,
|
|
23846
23947
|
page_name: page_name2
|
|
23847
23948
|
} = args;
|
|
23848
|
-
const page2 = await
|
|
23949
|
+
const page2 = await getPage2(page_name2);
|
|
23849
23950
|
let sourcePos = null;
|
|
23850
23951
|
if (source_x !== void 0 && source_y !== void 0) {
|
|
23851
23952
|
sourcePos = { x: source_x, y: source_y };
|
|
@@ -23942,7 +24043,7 @@ ${snapshotResult}` });
|
|
|
23942
24043
|
}
|
|
23943
24044
|
case "browser_get_text": {
|
|
23944
24045
|
const { ref, selector, page_name: page_name2 } = args;
|
|
23945
|
-
const page2 = await
|
|
24046
|
+
const page2 = await getPage2(page_name2);
|
|
23946
24047
|
let element = null;
|
|
23947
24048
|
let target;
|
|
23948
24049
|
if (ref) {
|
|
@@ -23984,7 +24085,7 @@ ${snapshotResult}` });
|
|
|
23984
24085
|
}
|
|
23985
24086
|
case "browser_is_visible": {
|
|
23986
24087
|
const { ref, selector, page_name: page_name2 } = args;
|
|
23987
|
-
const page2 = await
|
|
24088
|
+
const page2 = await getPage2(page_name2);
|
|
23988
24089
|
try {
|
|
23989
24090
|
if (ref) {
|
|
23990
24091
|
const element = await selectSnapshotRef(page2, ref);
|
|
@@ -24025,7 +24126,7 @@ ${snapshotResult}` });
|
|
|
24025
24126
|
}
|
|
24026
24127
|
case "browser_is_enabled": {
|
|
24027
24128
|
const { ref, selector, page_name: page_name2 } = args;
|
|
24028
|
-
const page2 = await
|
|
24129
|
+
const page2 = await getPage2(page_name2);
|
|
24029
24130
|
try {
|
|
24030
24131
|
if (ref) {
|
|
24031
24132
|
const element = await selectSnapshotRef(page2, ref);
|
|
@@ -24066,7 +24167,7 @@ ${snapshotResult}` });
|
|
|
24066
24167
|
}
|
|
24067
24168
|
case "browser_is_checked": {
|
|
24068
24169
|
const { ref, selector, page_name: page_name2 } = args;
|
|
24069
|
-
const page2 = await
|
|
24170
|
+
const page2 = await getPage2(page_name2);
|
|
24070
24171
|
try {
|
|
24071
24172
|
if (ref) {
|
|
24072
24173
|
const element = await selectSnapshotRef(page2, ref);
|
|
@@ -24107,7 +24208,7 @@ ${snapshotResult}` });
|
|
|
24107
24208
|
}
|
|
24108
24209
|
case "browser_iframe": {
|
|
24109
24210
|
const { action, ref, selector, page_name: page_name2 } = args;
|
|
24110
|
-
const page2 = await
|
|
24211
|
+
const page2 = await getPage2(page_name2);
|
|
24111
24212
|
if (action === "enter") {
|
|
24112
24213
|
let frameElement = null;
|
|
24113
24214
|
if (ref) {
|
|
@@ -24156,7 +24257,7 @@ Note: Use browser_evaluate with frame-aware selectors, or take a snapshot to see
|
|
|
24156
24257
|
}
|
|
24157
24258
|
case "browser_tabs": {
|
|
24158
24259
|
const { action, index, timeout, page_name: page_name2 } = args;
|
|
24159
|
-
const b = await
|
|
24260
|
+
const b = await ensureConnected2();
|
|
24160
24261
|
if (action === "list") {
|
|
24161
24262
|
const allPages = b.contexts().flatMap((ctx) => ctx.pages());
|
|
24162
24263
|
const pageList = allPages.map((p, i2) => `${i2}: ${p.url()}`).join("\n");
|
|
@@ -24252,7 +24353,7 @@ Now use browser_snapshot() to see the content of this tab.` }]
|
|
|
24252
24353
|
}
|
|
24253
24354
|
case "browser_canvas_type": {
|
|
24254
24355
|
const { text, position, page_name: page_name2 } = args;
|
|
24255
|
-
const page2 = await
|
|
24356
|
+
const page2 = await getPage2(page_name2);
|
|
24256
24357
|
const jumpToStart = position !== "current";
|
|
24257
24358
|
const viewport = page2.viewportSize();
|
|
24258
24359
|
const clickX = (viewport?.width || 1280) / 2;
|
|
@@ -24273,7 +24374,7 @@ Now use browser_snapshot() to see the content of this tab.` }]
|
|
|
24273
24374
|
}
|
|
24274
24375
|
case "browser_highlight": {
|
|
24275
24376
|
const { enabled, page_name: page_name2 } = args;
|
|
24276
|
-
const page2 = await
|
|
24377
|
+
const page2 = await getPage2(page_name2);
|
|
24277
24378
|
if (enabled) {
|
|
24278
24379
|
await injectActiveTabGlow(page2);
|
|
24279
24380
|
return {
|
|
@@ -24308,7 +24409,7 @@ Now use browser_snapshot() to see the content of this tab.` }]
|
|
|
24308
24409
|
}
|
|
24309
24410
|
const BATCH_TIMEOUT_MS = 12e4;
|
|
24310
24411
|
const MAX_RESULT_SIZE_BYTES = 1048576;
|
|
24311
|
-
const page2 = await
|
|
24412
|
+
const page2 = await getPage2(page_name2);
|
|
24312
24413
|
const batchResults = [];
|
|
24313
24414
|
const batchStart = Date.now();
|
|
24314
24415
|
for (const url2 of urls) {
|
|
@@ -24385,7 +24486,7 @@ async function main() {
|
|
|
24385
24486
|
console.error("[dev-browser-mcp] MCP Server ready and listening for tool calls");
|
|
24386
24487
|
console.error("[dev-browser-mcp] Connecting to browser for auto-glow setup...");
|
|
24387
24488
|
try {
|
|
24388
|
-
await
|
|
24489
|
+
await ensureConnected2();
|
|
24389
24490
|
console.error("[dev-browser-mcp] Browser connected, page listeners active");
|
|
24390
24491
|
} catch (err) {
|
|
24391
24492
|
console.error("[dev-browser-mcp] Could not connect to browser yet (will retry on first tool call):", err);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@accomplish_ai/agent-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Core logic for Accomplish - OpenCode adapter, storage, providers, MCP tools, and skills",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,6 +46,7 @@
|
|
|
46
46
|
"dist",
|
|
47
47
|
"mcp-tools/*/dist",
|
|
48
48
|
"mcp-tools/*/package.json",
|
|
49
|
+
"mcp-tools/*/*.cjs",
|
|
49
50
|
"mcp-tools/*/*.md",
|
|
50
51
|
"mcp-tools/package.json"
|
|
51
52
|
],
|