ai-browser 0.2.5 → 0.3.1
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 +10 -1
- package/dist/agent/agent-loop.d.ts +18 -0
- package/dist/agent/agent-loop.d.ts.map +1 -1
- package/dist/agent/agent-loop.js +233 -3
- package/dist/agent/agent-loop.js.map +1 -1
- package/dist/agent/content-budget.d.ts.map +1 -1
- package/dist/agent/content-budget.js +4 -0
- package/dist/agent/content-budget.js.map +1 -1
- package/dist/agent/conversation-manager.d.ts.map +1 -1
- package/dist/agent/conversation-manager.js +20 -6
- package/dist/agent/conversation-manager.js.map +1 -1
- package/dist/agent/index.js +7 -2
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/prompt.d.ts +1 -1
- package/dist/agent/prompt.d.ts.map +1 -1
- package/dist/agent/prompt.js +8 -0
- package/dist/agent/prompt.js.map +1 -1
- package/dist/agent/tool-usage-tracker.d.ts.map +1 -1
- package/dist/agent/tool-usage-tracker.js +7 -3
- package/dist/agent/tool-usage-tracker.js.map +1 -1
- package/dist/agent/types.d.ts +6 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/api/mcp-sse.d.ts +2 -1
- package/dist/api/mcp-sse.d.ts.map +1 -1
- package/dist/api/mcp-sse.js +2 -1
- package/dist/api/mcp-sse.js.map +1 -1
- package/dist/api/routes.d.ts +2 -1
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +289 -14
- package/dist/api/routes.js.map +1 -1
- package/dist/browser/BrowserManager.d.ts.map +1 -1
- package/dist/browser/BrowserManager.js +5 -2
- package/dist/browser/BrowserManager.js.map +1 -1
- package/dist/cli/mcp-stdio.js +3 -0
- package/dist/cli/mcp-stdio.js.map +1 -1
- package/dist/cli/server.js +15 -3
- package/dist/cli/server.js.map +1 -1
- package/dist/mcp/ai-markdown.d.ts.map +1 -1
- package/dist/mcp/ai-markdown.js +106 -38
- package/dist/mcp/ai-markdown.js.map +1 -1
- package/dist/mcp/browser-mcp-server.d.ts +2 -0
- package/dist/mcp/browser-mcp-server.d.ts.map +1 -1
- package/dist/mcp/browser-mcp-server.js +72 -13
- package/dist/mcp/browser-mcp-server.js.map +1 -1
- package/dist/mcp/task-tools.d.ts.map +1 -1
- package/dist/mcp/task-tools.js +1 -0
- package/dist/mcp/task-tools.js.map +1 -1
- package/dist/memory/KnowledgeCardStore.d.ts +35 -0
- package/dist/memory/KnowledgeCardStore.d.ts.map +1 -0
- package/dist/memory/KnowledgeCardStore.js +304 -0
- package/dist/memory/KnowledgeCardStore.js.map +1 -0
- package/dist/memory/MemoryCapturer.d.ts +14 -0
- package/dist/memory/MemoryCapturer.d.ts.map +1 -0
- package/dist/memory/MemoryCapturer.js +183 -0
- package/dist/memory/MemoryCapturer.js.map +1 -0
- package/dist/memory/MemoryInjector.d.ts +23 -0
- package/dist/memory/MemoryInjector.d.ts.map +1 -0
- package/dist/memory/MemoryInjector.js +180 -0
- package/dist/memory/MemoryInjector.js.map +1 -0
- package/dist/memory/RecordingConverter.d.ts +16 -0
- package/dist/memory/RecordingConverter.d.ts.map +1 -0
- package/dist/memory/RecordingConverter.js +108 -0
- package/dist/memory/RecordingConverter.js.map +1 -0
- package/dist/memory/SessionRecorder.d.ts +39 -0
- package/dist/memory/SessionRecorder.d.ts.map +1 -0
- package/dist/memory/SessionRecorder.js +198 -0
- package/dist/memory/SessionRecorder.js.map +1 -0
- package/dist/memory/index.d.ts +8 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +6 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/types.d.ts +39 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/semantic/PageAnalyzer.d.ts.map +1 -1
- package/dist/semantic/PageAnalyzer.js +2 -1
- package/dist/semantic/PageAnalyzer.js.map +1 -1
- package/dist/task/templates/login-keep-session.d.ts.map +1 -1
- package/dist/task/templates/login-keep-session.js +2 -4
- package/dist/task/templates/login-keep-session.js.map +1 -1
- package/dist/task/tool-actions.d.ts.map +1 -1
- package/dist/task/tool-actions.js +6 -11
- package/dist/task/tool-actions.js.map +1 -1
- package/dist/utils/safe-page.d.ts +9 -0
- package/dist/utils/safe-page.d.ts.map +1 -0
- package/dist/utils/safe-page.js +14 -0
- package/dist/utils/safe-page.js.map +1 -0
- package/package.json +3 -1
- package/public/index.html +1651 -133
- package/public/task-result.html +107 -12
- package/public/tasks.html +83 -10
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import
|
|
1
|
+
import vanillaPuppeteer from 'puppeteer-core';
|
|
2
|
+
import { addExtra } from 'puppeteer-extra';
|
|
3
|
+
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
|
|
2
4
|
import { existsSync } from 'node:fs';
|
|
3
5
|
import { execSync } from 'node:child_process';
|
|
6
|
+
const puppeteer = addExtra(vanillaPuppeteer);
|
|
7
|
+
puppeteer.use(StealthPlugin());
|
|
4
8
|
export class BrowserManager {
|
|
5
9
|
headlessBrowser = null;
|
|
6
10
|
headfulBrowser = null;
|
|
@@ -43,7 +47,6 @@ export class BrowserManager {
|
|
|
43
47
|
const args = [
|
|
44
48
|
'--no-sandbox',
|
|
45
49
|
'--disable-setuid-sandbox',
|
|
46
|
-
'--disable-blink-features=AutomationControlled',
|
|
47
50
|
'--disable-infobars',
|
|
48
51
|
];
|
|
49
52
|
if (proxyServer) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowserManager.js","sourceRoot":"","sources":["../../src/browser/BrowserManager.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"BrowserManager.js","sourceRoot":"","sources":["../../src/browser/BrowserManager.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/mcp-stdio.js
CHANGED
|
@@ -3,6 +3,7 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
|
3
3
|
import { BrowserManager, SessionManager } from '../browser/index.js';
|
|
4
4
|
import { createBrowserMcpServer } from '../mcp/browser-mcp-server.js';
|
|
5
5
|
import { CookieStore } from '../browser/CookieStore.js';
|
|
6
|
+
import { KnowledgeCardStore } from '../memory/index.js';
|
|
6
7
|
async function main() {
|
|
7
8
|
// 将日志输出到 stderr,避免干扰 stdio 通信
|
|
8
9
|
const log = (...args) => console.error('[ai-browser-mcp]', ...args);
|
|
@@ -12,9 +13,11 @@ async function main() {
|
|
|
12
13
|
const sessionManager = new SessionManager(browserManager);
|
|
13
14
|
const cookieStore = new CookieStore();
|
|
14
15
|
sessionManager.setCookieStore(cookieStore);
|
|
16
|
+
const knowledgeStore = new KnowledgeCardStore();
|
|
15
17
|
log('Creating MCP server...');
|
|
16
18
|
const mcpServer = createBrowserMcpServer(sessionManager, cookieStore, {
|
|
17
19
|
trustLevel: 'local',
|
|
20
|
+
knowledgeStore,
|
|
18
21
|
});
|
|
19
22
|
const transport = new StdioServerTransport();
|
|
20
23
|
await mcpServer.connect(transport);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-stdio.js","sourceRoot":"","sources":["../../src/cli/mcp-stdio.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,KAAK,UAAU,IAAI;IACjB,8BAA8B;IAC9B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC;IAE/E,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC3B,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;IAE9B,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IACtC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-stdio.js","sourceRoot":"","sources":["../../src/cli/mcp-stdio.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,KAAK,UAAU,IAAI;IACjB,8BAA8B;IAC9B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC;IAE/E,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC3B,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IAC5C,MAAM,cAAc,CAAC,MAAM,EAAE,CAAC;IAE9B,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IACtC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;IAEhD,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,sBAAsB,CAAC,cAAc,EAAE,WAAW,EAAE;QACpE,UAAU,EAAE,OAAO;QACnB,cAAc;KACf,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IAE3D,OAAO;IACP,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACxB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,cAAc,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/cli/server.js
CHANGED
|
@@ -7,6 +7,7 @@ import { fileURLToPath } from 'url';
|
|
|
7
7
|
import { BrowserManager, SessionManager, CookieStore } from '../browser/index.js';
|
|
8
8
|
import { registerRoutes, ApiError } from '../api/index.js';
|
|
9
9
|
import { registerMcpSseRoutes } from '../api/mcp-sse.js';
|
|
10
|
+
import { KnowledgeCardStore } from '../memory/index.js';
|
|
10
11
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
12
|
const DEFAULT_PORT = 3000;
|
|
12
13
|
const DEFAULT_HOST = '127.0.0.1';
|
|
@@ -25,10 +26,20 @@ async function main() {
|
|
|
25
26
|
// 进程级共享 CookieStore,REST API 和 SSE MCP 共用
|
|
26
27
|
const cookieStore = new CookieStore();
|
|
27
28
|
sessionManager.setCookieStore(cookieStore);
|
|
28
|
-
//
|
|
29
|
+
// 站点记忆存储
|
|
30
|
+
const knowledgeStore = new KnowledgeCardStore();
|
|
31
|
+
// 静态文件服务 (disable caching for HTML to ensure latest UI)
|
|
29
32
|
await app.register(fastifyStatic, {
|
|
30
33
|
root: path.join(__dirname, '../../public'),
|
|
31
34
|
prefix: '/',
|
|
35
|
+
cacheControl: false,
|
|
36
|
+
});
|
|
37
|
+
app.addHook('onSend', (request, reply, payload, done) => {
|
|
38
|
+
const url = request.url;
|
|
39
|
+
if (url === '/' || url.endsWith('.html')) {
|
|
40
|
+
reply.header('Cache-Control', 'no-cache, no-store, must-revalidate');
|
|
41
|
+
}
|
|
42
|
+
done();
|
|
32
43
|
});
|
|
33
44
|
// 错误处理
|
|
34
45
|
app.setErrorHandler((error, request, reply) => {
|
|
@@ -46,9 +57,9 @@ async function main() {
|
|
|
46
57
|
}
|
|
47
58
|
});
|
|
48
59
|
// 注册 REST API 路由
|
|
49
|
-
registerRoutes(app, sessionManager, cookieStore);
|
|
60
|
+
registerRoutes(app, sessionManager, cookieStore, knowledgeStore);
|
|
50
61
|
// 注册 SSE MCP 端点
|
|
51
|
-
registerMcpSseRoutes(app, sessionManager, cookieStore);
|
|
62
|
+
registerMcpSseRoutes(app, sessionManager, cookieStore, knowledgeStore);
|
|
52
63
|
// 优先级: --port > PORT 环境变量 > 默认值
|
|
53
64
|
const portStr = typeof args.port === 'string' ? args.port : process.env.PORT;
|
|
54
65
|
const port = parseInt(portStr || String(DEFAULT_PORT), 10);
|
|
@@ -68,6 +79,7 @@ async function main() {
|
|
|
68
79
|
app.log.info('Shutting down...');
|
|
69
80
|
await sessionManager.closeAll();
|
|
70
81
|
cookieStore.dispose();
|
|
82
|
+
knowledgeStore.dispose();
|
|
71
83
|
await browserManager.close();
|
|
72
84
|
await app.close();
|
|
73
85
|
process.exit(0);
|
package/dist/cli/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/cli/server.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/cli/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-markdown.d.ts","sourceRoot":"","sources":["../../src/mcp/ai-markdown.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ai-markdown.d.ts","sourceRoot":"","sources":["../../src/mcp/ai-markdown.ts"],"names":[],"mappings":"AAoEA,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAmC7E"}
|
package/dist/mcp/ai-markdown.js
CHANGED
|
@@ -79,6 +79,7 @@ function normalizeToolName(toolName) {
|
|
|
79
79
|
'fill_form',
|
|
80
80
|
'click_and_wait',
|
|
81
81
|
'navigate_and_extract',
|
|
82
|
+
'recall_site_memory',
|
|
82
83
|
];
|
|
83
84
|
return direct.includes(toolName) ? toolName : null;
|
|
84
85
|
}
|
|
@@ -147,6 +148,8 @@ function buildAiMarkdown(toolName, data) {
|
|
|
147
148
|
return formatClickAndWait(data);
|
|
148
149
|
case 'navigate_and_extract':
|
|
149
150
|
return formatNavigateAndExtract(data);
|
|
151
|
+
case 'recall_site_memory':
|
|
152
|
+
return formatRecallSiteMemory(data);
|
|
150
153
|
default:
|
|
151
154
|
return '';
|
|
152
155
|
}
|
|
@@ -187,7 +190,6 @@ function buildAiSummary(toolName, data) {
|
|
|
187
190
|
case 'type_text':
|
|
188
191
|
case 'press_key':
|
|
189
192
|
case 'wait':
|
|
190
|
-
case 'wait_for_stable':
|
|
191
193
|
case 'scroll':
|
|
192
194
|
case 'go_back':
|
|
193
195
|
case 'select_option':
|
|
@@ -198,6 +200,8 @@ function buildAiSummary(toolName, data) {
|
|
|
198
200
|
case 'handle_dialog':
|
|
199
201
|
case 'upload_file':
|
|
200
202
|
return `${toolName} executed: success=${boolText(data.success)}`;
|
|
203
|
+
case 'wait_for_stable':
|
|
204
|
+
return `wait_for_stable executed: stable=${boolText(data.stable)}, networkPending=${numberOrNull(data.networkPending) ?? '-'}`;
|
|
201
205
|
case 'create_tab':
|
|
202
206
|
return `Created tab: ${asString(data.tabId) || 'unknown-tab'}${data.partial ? ' (partial navigation)' : ''}`;
|
|
203
207
|
case 'list_tabs': {
|
|
@@ -259,21 +263,24 @@ function buildAiSummary(toolName, data) {
|
|
|
259
263
|
case 'get_runtime_profile':
|
|
260
264
|
return `Runtime profile: maxConcurrentRuns=${numberOrNull(data.maxConcurrentRuns) ?? '-'}, trustLevel=${asString(data.trustLevel) || '-'}`;
|
|
261
265
|
case 'fill_form': {
|
|
262
|
-
const results = Array.isArray(data.
|
|
266
|
+
const results = Array.isArray(data.fieldResults) ? data.fieldResults : [];
|
|
263
267
|
const ok = results.filter((r) => r?.success).length;
|
|
264
268
|
const submitOk = data.submitResult ? boolText(data.submitResult.success) : 'skipped';
|
|
265
269
|
return `Form filled: ${ok}/${results.length} fields succeeded, submit=${submitOk}`;
|
|
266
270
|
}
|
|
267
271
|
case 'click_and_wait': {
|
|
268
|
-
const clickOk = boolText(data.
|
|
269
|
-
const
|
|
270
|
-
return `Click+wait: click=${clickOk}, wait=${
|
|
272
|
+
const clickOk = boolText(data.success);
|
|
273
|
+
const waitStable = boolText(data.waitResult?.stable);
|
|
274
|
+
return `Click+wait: click=${clickOk}, wait=${waitStable}`;
|
|
271
275
|
}
|
|
272
276
|
case 'navigate_and_extract': {
|
|
273
|
-
const navOk = boolText(data.
|
|
274
|
-
const title = asString(data.
|
|
277
|
+
const navOk = boolText(data.navigation?.success);
|
|
278
|
+
const title = asString(data.navigation?.page?.title) || '-';
|
|
275
279
|
return `Navigate+extract: nav=${navOk}, page=${title}`;
|
|
276
280
|
}
|
|
281
|
+
case 'recall_site_memory': {
|
|
282
|
+
return asString(data.aiSummary) || `recall_site_memory: found=${boolText(data.found)}`;
|
|
283
|
+
}
|
|
277
284
|
default:
|
|
278
285
|
return `${toolName} completed`;
|
|
279
286
|
}
|
|
@@ -307,6 +314,18 @@ function buildAiHints(toolName, data) {
|
|
|
307
314
|
return ['If key information is missing, scroll and call get_page_content again.'];
|
|
308
315
|
case 'find_element':
|
|
309
316
|
return ['Pick the highest score candidate first; fallback to next candidate on failure.'];
|
|
317
|
+
case 'click':
|
|
318
|
+
return ['Call get_page_info after click to inspect the resulting page state.'];
|
|
319
|
+
case 'type_text':
|
|
320
|
+
return ['If the field requires submission, follow up with press_key Enter or click the submit button.'];
|
|
321
|
+
case 'press_key':
|
|
322
|
+
return ['Call get_page_info to verify the effect of the key press on the page.'];
|
|
323
|
+
case 'wait':
|
|
324
|
+
return ['After waiting, call get_page_info or get_page_content to inspect the updated page.'];
|
|
325
|
+
case 'wait_for_stable':
|
|
326
|
+
return data.stable
|
|
327
|
+
? ['Page is stable; proceed with get_page_info to inspect elements.']
|
|
328
|
+
: ['Page did not stabilize; consider increasing timeout or checking for dynamic content.'];
|
|
310
329
|
case 'scroll':
|
|
311
330
|
return ['After scrolling, call get_page_info or get_page_content to refresh visible information.'];
|
|
312
331
|
case 'go_back':
|
|
@@ -394,6 +413,10 @@ function buildAiHints(toolName, data) {
|
|
|
394
413
|
'Review extracted content; if incomplete, call get_page_content with scroll.',
|
|
395
414
|
'Use get_page_info if you need interactive elements instead of text content.',
|
|
396
415
|
];
|
|
416
|
+
case 'recall_site_memory':
|
|
417
|
+
return data.found
|
|
418
|
+
? ['参考历史经验中的选择器和操作路径,如页面结构已变化请忽略并重新探索。']
|
|
419
|
+
: ['使用 get_page_info 探索页面结构', '使用 get_page_content 获取页面内容'];
|
|
397
420
|
default:
|
|
398
421
|
return [];
|
|
399
422
|
}
|
|
@@ -634,7 +657,7 @@ function buildNextActions(toolName, data, detailLevel) {
|
|
|
634
657
|
}
|
|
635
658
|
break;
|
|
636
659
|
case 'fill_form': {
|
|
637
|
-
const fieldResults = Array.isArray(data.
|
|
660
|
+
const fieldResults = Array.isArray(data.fieldResults) ? data.fieldResults : [];
|
|
638
661
|
const failed = fieldResults.filter((r) => !r?.success);
|
|
639
662
|
if (failed.length > 0) {
|
|
640
663
|
add({ tool: 'type_text', reason: 'Retry failed fields individually with type_text', priority: 'high' });
|
|
@@ -647,16 +670,42 @@ function buildNextActions(toolName, data, detailLevel) {
|
|
|
647
670
|
}
|
|
648
671
|
case 'click_and_wait':
|
|
649
672
|
add({ tool: 'get_page_info', reason: 'Inspect page elements after click+wait', priority: 'high' });
|
|
650
|
-
if (!data.waitResult?.
|
|
651
|
-
add({ tool: 'wait_for_stable', reason: 'Wait
|
|
673
|
+
if (!data.waitResult?.stable) {
|
|
674
|
+
add({ tool: 'wait_for_stable', reason: 'Wait not stable; retry with explicit stability check', priority: 'medium' });
|
|
652
675
|
}
|
|
653
676
|
break;
|
|
654
677
|
case 'navigate_and_extract':
|
|
655
|
-
if (data.
|
|
678
|
+
if (data.content?.sections?.length === 0) {
|
|
656
679
|
add({ tool: 'get_page_content', reason: 'No content extracted; try scrolling and re-extracting', priority: 'high' });
|
|
657
680
|
}
|
|
658
681
|
add({ tool: 'get_page_info', reason: 'Inspect interactive elements if interaction is needed', priority: 'medium' });
|
|
659
682
|
break;
|
|
683
|
+
case 'recall_site_memory':
|
|
684
|
+
add({ tool: 'navigate', reason: '记忆已查询,继续导航到目标页面', priority: 'high' });
|
|
685
|
+
add({ tool: 'navigate_and_extract', reason: '如果只需提取内容,用 navigate_and_extract 更高效', priority: 'medium' });
|
|
686
|
+
break;
|
|
687
|
+
case 'click':
|
|
688
|
+
add({ tool: 'get_page_info', reason: 'Inspect page state after click', priority: 'high' });
|
|
689
|
+
if (data.newTabCreated) {
|
|
690
|
+
add({ tool: 'list_tabs', reason: 'Click opened a new tab; list tabs to manage context', priority: 'high' });
|
|
691
|
+
}
|
|
692
|
+
break;
|
|
693
|
+
case 'type_text':
|
|
694
|
+
add({ tool: 'get_page_info', reason: 'Verify input state after typing', priority: 'medium' });
|
|
695
|
+
break;
|
|
696
|
+
case 'press_key':
|
|
697
|
+
add({ tool: 'get_page_info', reason: 'Inspect page state after key press', priority: 'medium' });
|
|
698
|
+
break;
|
|
699
|
+
case 'scroll':
|
|
700
|
+
add({ tool: 'get_page_info', reason: 'Refresh visible elements after scrolling', priority: 'high' });
|
|
701
|
+
add({ tool: 'get_page_content', reason: 'Refresh visible content after scrolling', priority: 'medium' });
|
|
702
|
+
break;
|
|
703
|
+
case 'create_tab':
|
|
704
|
+
add({ tool: 'get_page_info', reason: 'Inspect elements in the new tab', priority: 'high' });
|
|
705
|
+
if (data.partial) {
|
|
706
|
+
add({ tool: 'wait_for_stable', reason: 'Tab navigation was partial; wait for stability', priority: 'high' });
|
|
707
|
+
}
|
|
708
|
+
break;
|
|
660
709
|
default:
|
|
661
710
|
break;
|
|
662
711
|
}
|
|
@@ -1043,7 +1092,8 @@ function formatRuntimeProfile(data) {
|
|
|
1043
1092
|
return lines.join('\n');
|
|
1044
1093
|
}
|
|
1045
1094
|
function formatFillForm(data) {
|
|
1046
|
-
|
|
1095
|
+
// Server returns fieldResults (not results)
|
|
1096
|
+
const results = Array.isArray(data.fieldResults) ? data.fieldResults : [];
|
|
1047
1097
|
const lines = [
|
|
1048
1098
|
'## Fill Form Result',
|
|
1049
1099
|
'',
|
|
@@ -1054,7 +1104,7 @@ function formatFillForm(data) {
|
|
|
1054
1104
|
if (results.length > 0) {
|
|
1055
1105
|
lines.push('', '| element_id | success | error |', '|---|---|---|');
|
|
1056
1106
|
for (const r of results) {
|
|
1057
|
-
const id = asString(r?.
|
|
1107
|
+
const id = asString(r?.element_id) || '-';
|
|
1058
1108
|
const ok = boolText(r?.success);
|
|
1059
1109
|
const err = asString(r?.error) || '-';
|
|
1060
1110
|
lines.push(`| \`${tableSafe(id)}\` | ${ok} | ${tableSafe(compactText(err, 80))} |`);
|
|
@@ -1063,30 +1113,39 @@ function formatFillForm(data) {
|
|
|
1063
1113
|
if (data.submitResult) {
|
|
1064
1114
|
lines.push('', '### Submit Result', '');
|
|
1065
1115
|
lines.push(`- Success: ${boolText(data.submitResult.success)}`);
|
|
1066
|
-
if (data.submitResult.
|
|
1067
|
-
lines.push(`-
|
|
1068
|
-
lines.push(`- Title: ${asString(data.submitResult.page.title) || '-'}`);
|
|
1116
|
+
if (data.submitResult.error) {
|
|
1117
|
+
lines.push(`- Error: ${asString(data.submitResult.error)}`);
|
|
1069
1118
|
}
|
|
1070
1119
|
}
|
|
1120
|
+
// page is at top level
|
|
1121
|
+
if (data.page) {
|
|
1122
|
+
lines.push(`- URL: ${asString(data.page.url) || '-'}`);
|
|
1123
|
+
lines.push(`- Title: ${asString(data.page.title) || '-'}`);
|
|
1124
|
+
}
|
|
1071
1125
|
lines.push('', '### Recommended Next Step', '', '- Call `get_page_info` to verify form submission result.');
|
|
1072
1126
|
return lines.join('\n');
|
|
1073
1127
|
}
|
|
1074
1128
|
function formatClickAndWait(data) {
|
|
1129
|
+
// Server returns flat structure: { success, waitResult: { stable, method }, page, newTabCreated?, dialog? }
|
|
1075
1130
|
const lines = [
|
|
1076
1131
|
'## Click and Wait Result',
|
|
1077
1132
|
'',
|
|
1078
|
-
`- Click Success: ${boolText(data.
|
|
1079
|
-
`- Wait
|
|
1133
|
+
`- Click Success: ${boolText(data.success)}`,
|
|
1134
|
+
`- Wait Stable: ${boolText(data.waitResult?.stable)}`,
|
|
1135
|
+
`- Wait Method: ${asString(data.waitResult?.method) || '-'}`,
|
|
1080
1136
|
];
|
|
1081
|
-
if (data.
|
|
1082
|
-
lines.push(`- URL: ${asString(data.
|
|
1083
|
-
lines.push(`- Title: ${asString(data.
|
|
1137
|
+
if (data.page) {
|
|
1138
|
+
lines.push(`- URL: ${asString(data.page.url) || '-'}`);
|
|
1139
|
+
lines.push(`- Title: ${asString(data.page.title) || '-'}`);
|
|
1084
1140
|
}
|
|
1085
|
-
if (data.
|
|
1086
|
-
lines.push(`- New Tab Created: ${asString(data.
|
|
1141
|
+
if (data.newTabCreated) {
|
|
1142
|
+
lines.push(`- New Tab Created: ${asString(data.newTabCreated)}`);
|
|
1087
1143
|
}
|
|
1088
|
-
if (data.waitResult && !data.waitResult.
|
|
1089
|
-
lines.push(`- Wait
|
|
1144
|
+
if (data.waitResult && !data.waitResult.stable) {
|
|
1145
|
+
lines.push(`- Wait Note: page may not be fully stable`);
|
|
1146
|
+
}
|
|
1147
|
+
if (data.dialog) {
|
|
1148
|
+
lines.push(`- Pending Dialog: ${asString(data.dialog.type) || 'unknown'} — "${compactText(asString(data.dialog.message) || '', 80)}"`);
|
|
1090
1149
|
}
|
|
1091
1150
|
lines.push('', '### Recommended Next Step', '', '- Call `get_page_info` to inspect the page after click+wait.');
|
|
1092
1151
|
return lines.join('\n');
|
|
@@ -1096,18 +1155,19 @@ function formatNavigateAndExtract(data) {
|
|
|
1096
1155
|
'## Navigate and Extract Result',
|
|
1097
1156
|
'',
|
|
1098
1157
|
];
|
|
1099
|
-
// Navigation part
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
lines.push(`-
|
|
1103
|
-
lines.push(`-
|
|
1104
|
-
|
|
1105
|
-
|
|
1158
|
+
// Navigation part — server returns `navigation` (not `navigateResult`)
|
|
1159
|
+
const nav = data.navigation;
|
|
1160
|
+
if (nav) {
|
|
1161
|
+
lines.push(`- Nav Success: ${boolText(nav.success)}`);
|
|
1162
|
+
lines.push(`- URL: ${asString(nav.page?.url) || '-'}`);
|
|
1163
|
+
lines.push(`- Title: ${asString(nav.page?.title) || '-'}`);
|
|
1164
|
+
if (typeof nav.statusCode === 'number') {
|
|
1165
|
+
lines.push(`- HTTP Status: ${nav.statusCode}`);
|
|
1106
1166
|
}
|
|
1107
1167
|
}
|
|
1108
|
-
//
|
|
1109
|
-
if (data.
|
|
1110
|
-
const sections = Array.isArray(data.
|
|
1168
|
+
// Content part — server returns `content` (not `extractResult`)
|
|
1169
|
+
if (data.content) {
|
|
1170
|
+
const sections = Array.isArray(data.content.sections) ? data.content.sections : [];
|
|
1111
1171
|
// Sort by attention descending so the most relevant content is shown first
|
|
1112
1172
|
const sorted = [...sections].sort((a, b) => (numberOrNull(b?.attention) ?? 0) - (numberOrNull(a?.attention) ?? 0));
|
|
1113
1173
|
const topSections = sorted.slice(0, 20);
|
|
@@ -1121,13 +1181,22 @@ function formatNavigateAndExtract(data) {
|
|
|
1121
1181
|
}
|
|
1122
1182
|
}
|
|
1123
1183
|
}
|
|
1124
|
-
|
|
1125
|
-
|
|
1184
|
+
// Elements part — server returns `elements` (not `elementsResult`)
|
|
1185
|
+
if (data.elements) {
|
|
1186
|
+
const elements = Array.isArray(data.elements.elements) ? data.elements.elements : [];
|
|
1126
1187
|
lines.push(`- Elements Found: ${elements.length}`);
|
|
1127
1188
|
}
|
|
1128
1189
|
lines.push('', '### Recommended Next Step', '', '- If content is incomplete, scroll and call `get_page_content` again.');
|
|
1129
1190
|
return lines.join('\n');
|
|
1130
1191
|
}
|
|
1192
|
+
function formatRecallSiteMemory(data) {
|
|
1193
|
+
if (data.found && data.context) {
|
|
1194
|
+
return asString(data.context);
|
|
1195
|
+
}
|
|
1196
|
+
const lines = [`## 站点记忆: ${asString(data.domain) || 'unknown'}`];
|
|
1197
|
+
lines.push('', '没有该站点的历史记忆。请自行探索页面结构。');
|
|
1198
|
+
return lines.join('\n');
|
|
1199
|
+
}
|
|
1131
1200
|
function formatNavigate(data) {
|
|
1132
1201
|
const lines = [
|
|
1133
1202
|
'## Navigation Result',
|
|
@@ -1243,7 +1312,6 @@ function formatPageContent(data) {
|
|
|
1243
1312
|
'## Page Content Snapshot',
|
|
1244
1313
|
'',
|
|
1245
1314
|
`- Title: ${asString(data.title) || '-'}`,
|
|
1246
|
-
`- URL: ${asString(data.url) || '-'}`,
|
|
1247
1315
|
`- Sections: ${sections.length}`,
|
|
1248
1316
|
'',
|
|
1249
1317
|
'### Key Text Blocks',
|