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.
Files changed (92) hide show
  1. package/README.md +10 -1
  2. package/dist/agent/agent-loop.d.ts +18 -0
  3. package/dist/agent/agent-loop.d.ts.map +1 -1
  4. package/dist/agent/agent-loop.js +233 -3
  5. package/dist/agent/agent-loop.js.map +1 -1
  6. package/dist/agent/content-budget.d.ts.map +1 -1
  7. package/dist/agent/content-budget.js +4 -0
  8. package/dist/agent/content-budget.js.map +1 -1
  9. package/dist/agent/conversation-manager.d.ts.map +1 -1
  10. package/dist/agent/conversation-manager.js +20 -6
  11. package/dist/agent/conversation-manager.js.map +1 -1
  12. package/dist/agent/index.js +7 -2
  13. package/dist/agent/index.js.map +1 -1
  14. package/dist/agent/prompt.d.ts +1 -1
  15. package/dist/agent/prompt.d.ts.map +1 -1
  16. package/dist/agent/prompt.js +8 -0
  17. package/dist/agent/prompt.js.map +1 -1
  18. package/dist/agent/tool-usage-tracker.d.ts.map +1 -1
  19. package/dist/agent/tool-usage-tracker.js +7 -3
  20. package/dist/agent/tool-usage-tracker.js.map +1 -1
  21. package/dist/agent/types.d.ts +6 -0
  22. package/dist/agent/types.d.ts.map +1 -1
  23. package/dist/api/mcp-sse.d.ts +2 -1
  24. package/dist/api/mcp-sse.d.ts.map +1 -1
  25. package/dist/api/mcp-sse.js +2 -1
  26. package/dist/api/mcp-sse.js.map +1 -1
  27. package/dist/api/routes.d.ts +2 -1
  28. package/dist/api/routes.d.ts.map +1 -1
  29. package/dist/api/routes.js +289 -14
  30. package/dist/api/routes.js.map +1 -1
  31. package/dist/browser/BrowserManager.d.ts.map +1 -1
  32. package/dist/browser/BrowserManager.js +5 -2
  33. package/dist/browser/BrowserManager.js.map +1 -1
  34. package/dist/cli/mcp-stdio.js +3 -0
  35. package/dist/cli/mcp-stdio.js.map +1 -1
  36. package/dist/cli/server.js +15 -3
  37. package/dist/cli/server.js.map +1 -1
  38. package/dist/mcp/ai-markdown.d.ts.map +1 -1
  39. package/dist/mcp/ai-markdown.js +106 -38
  40. package/dist/mcp/ai-markdown.js.map +1 -1
  41. package/dist/mcp/browser-mcp-server.d.ts +2 -0
  42. package/dist/mcp/browser-mcp-server.d.ts.map +1 -1
  43. package/dist/mcp/browser-mcp-server.js +72 -13
  44. package/dist/mcp/browser-mcp-server.js.map +1 -1
  45. package/dist/mcp/task-tools.d.ts.map +1 -1
  46. package/dist/mcp/task-tools.js +1 -0
  47. package/dist/mcp/task-tools.js.map +1 -1
  48. package/dist/memory/KnowledgeCardStore.d.ts +35 -0
  49. package/dist/memory/KnowledgeCardStore.d.ts.map +1 -0
  50. package/dist/memory/KnowledgeCardStore.js +304 -0
  51. package/dist/memory/KnowledgeCardStore.js.map +1 -0
  52. package/dist/memory/MemoryCapturer.d.ts +14 -0
  53. package/dist/memory/MemoryCapturer.d.ts.map +1 -0
  54. package/dist/memory/MemoryCapturer.js +183 -0
  55. package/dist/memory/MemoryCapturer.js.map +1 -0
  56. package/dist/memory/MemoryInjector.d.ts +23 -0
  57. package/dist/memory/MemoryInjector.d.ts.map +1 -0
  58. package/dist/memory/MemoryInjector.js +180 -0
  59. package/dist/memory/MemoryInjector.js.map +1 -0
  60. package/dist/memory/RecordingConverter.d.ts +16 -0
  61. package/dist/memory/RecordingConverter.d.ts.map +1 -0
  62. package/dist/memory/RecordingConverter.js +108 -0
  63. package/dist/memory/RecordingConverter.js.map +1 -0
  64. package/dist/memory/SessionRecorder.d.ts +39 -0
  65. package/dist/memory/SessionRecorder.d.ts.map +1 -0
  66. package/dist/memory/SessionRecorder.js +198 -0
  67. package/dist/memory/SessionRecorder.js.map +1 -0
  68. package/dist/memory/index.d.ts +8 -0
  69. package/dist/memory/index.d.ts.map +1 -0
  70. package/dist/memory/index.js +6 -0
  71. package/dist/memory/index.js.map +1 -0
  72. package/dist/memory/types.d.ts +39 -0
  73. package/dist/memory/types.d.ts.map +1 -0
  74. package/dist/memory/types.js +2 -0
  75. package/dist/memory/types.js.map +1 -0
  76. package/dist/semantic/PageAnalyzer.d.ts.map +1 -1
  77. package/dist/semantic/PageAnalyzer.js +2 -1
  78. package/dist/semantic/PageAnalyzer.js.map +1 -1
  79. package/dist/task/templates/login-keep-session.d.ts.map +1 -1
  80. package/dist/task/templates/login-keep-session.js +2 -4
  81. package/dist/task/templates/login-keep-session.js.map +1 -1
  82. package/dist/task/tool-actions.d.ts.map +1 -1
  83. package/dist/task/tool-actions.js +6 -11
  84. package/dist/task/tool-actions.js.map +1 -1
  85. package/dist/utils/safe-page.d.ts +9 -0
  86. package/dist/utils/safe-page.d.ts.map +1 -0
  87. package/dist/utils/safe-page.js +14 -0
  88. package/dist/utils/safe-page.js.map +1 -0
  89. package/package.json +3 -1
  90. package/public/index.html +1651 -133
  91. package/public/task-result.html +107 -12
  92. package/public/tasks.html +83 -10
@@ -1,6 +1,10 @@
1
- import puppeteer from 'puppeteer-core';
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":"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"}
1
+ {"version":3,"file":"BrowserManager.js","sourceRoot":"","sources":["../../src/browser/BrowserManager.ts"],"names":[],"mappings":"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"}
@@ -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;IAE3C,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,sBAAsB,CAAC,cAAc,EAAE,WAAW,EAAE;QACpE,UAAU,EAAE,OAAO;KACpB,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"}
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"}
@@ -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);
@@ -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;AAEzD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,WAAW,CAAC;AAEjC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;IACjC,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;QACpC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;KACrC;IACD,MAAM,EAAE,KAAK;CACd,CAAC,CAAC;AAEH,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,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,0CAA0C;IAC1C,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IACtC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAE3C,SAAS;IACT,MAAM,GAAG,CAAC,QAAQ,CAAC,aAAa,EAAE;QAChC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC;QAC1C,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IAEH,OAAO;IACP,GAAG,CAAC,eAAe,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC5C,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACrB,KAAK,EAAE;oBACL,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,uBAAuB;iBACjC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,iBAAiB;IACjB,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IAEjD,gBAAgB;IAChB,oBAAoB,CAAC,GAAG,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IAEvD,gCAAgC;IAChC,MAAM,OAAO,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7E,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC;IAE5F,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,uCAAuC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,IAAI,IAAI,IAAI,UAAU,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO;IACP,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjC,MAAM,cAAc,CAAC,QAAQ,EAAE,CAAC;QAChC,WAAW,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,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,OAAO,CAAC,KAAK,CAAC,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":"AAmEA,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAmC7E"}
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"}
@@ -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.results) ? data.results : [];
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.clickResult?.success);
269
- const waitOk = boolText(data.waitResult?.success);
270
- return `Click+wait: click=${clickOk}, wait=${waitOk}`;
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.navigateResult?.success);
274
- const title = asString(data.navigateResult?.page?.title) || '-';
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.results) ? data.results : [];
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?.success) {
651
- add({ tool: 'wait_for_stable', reason: 'Wait failed; retry with explicit stability check', priority: 'medium' });
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.extractResult?.sections?.length === 0) {
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
- const results = Array.isArray(data.results) ? data.results : [];
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?.elementId) || '-';
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.page) {
1067
- lines.push(`- URL: ${asString(data.submitResult.page.url) || '-'}`);
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.clickResult?.success)}`,
1079
- `- Wait Success: ${boolText(data.waitResult?.success)}`,
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.clickResult?.page) {
1082
- lines.push(`- URL: ${asString(data.clickResult.page.url) || '-'}`);
1083
- lines.push(`- Title: ${asString(data.clickResult.page.title) || '-'}`);
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.clickResult?.newTabCreated) {
1086
- lines.push(`- New Tab Created: ${asString(data.clickResult.newTabCreated)}`);
1141
+ if (data.newTabCreated) {
1142
+ lines.push(`- New Tab Created: ${asString(data.newTabCreated)}`);
1087
1143
  }
1088
- if (data.waitResult && !data.waitResult.success) {
1089
- lines.push(`- Wait Reason: ${asString(data.waitResult.reason) || 'timeout or instability'}`);
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
- if (data.navigateResult) {
1101
- lines.push(`- Nav Success: ${boolText(data.navigateResult.success)}`);
1102
- lines.push(`- URL: ${asString(data.navigateResult.page?.url) || '-'}`);
1103
- lines.push(`- Title: ${asString(data.navigateResult.page?.title) || '-'}`);
1104
- if (typeof data.navigateResult.statusCode === 'number') {
1105
- lines.push(`- HTTP Status: ${data.navigateResult.statusCode}`);
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
- // Extract part
1109
- if (data.extractResult) {
1110
- const sections = Array.isArray(data.extractResult.sections) ? data.extractResult.sections : [];
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
- if (data.elementsResult) {
1125
- const elements = Array.isArray(data.elementsResult.elements) ? data.elementsResult.elements : [];
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',