mooncat-browser 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +213 -0
  2. package/browser-op/backend/browserd.cjs +1004 -0
  3. package/browser-op/backend/rpc-client.cjs +64 -0
  4. package/browser-op/backend/state.cjs +51 -0
  5. package/browser-op/cdp/capture-inject.js +426 -0
  6. package/browser-op/cdp/capture-inject.ts +426 -0
  7. package/browser-op/cdp/capture-service.cjs +172 -0
  8. package/browser-op/cdp/chrome-launcher.cjs +370 -0
  9. package/browser-op/cdp/chrome-path.cjs +57 -0
  10. package/browser-op/cdp/state.cjs +89 -0
  11. package/browser-op/extension/extension-detect.cjs +228 -0
  12. package/browser-op/extension/server.cjs +197 -0
  13. package/browser-op/extension/service.cjs +228 -0
  14. package/browser-op/extension/state.cjs +78 -0
  15. package/browser-op/index.cjs +389 -0
  16. package/browser-op/package.json +17 -0
  17. package/browser-op/py/behavior.py +138 -0
  18. package/browser-op/py/browser.py +340 -0
  19. package/browser-op/py/captcha.py +115 -0
  20. package/browser-op/py/crawler.py +125 -0
  21. package/browser-op/py/examples/01_open_and_probe.py +48 -0
  22. package/browser-op/py/examples/02_reuse_and_probe.py +66 -0
  23. package/browser-op/py/examples/03_interact.py +66 -0
  24. package/browser-op/py/find.py +150 -0
  25. package/browser-op/py/honeypot.py +73 -0
  26. package/browser-op/py/humanize.py +392 -0
  27. package/browser-op/py/image.py +186 -0
  28. package/browser-op/py/interact.py +193 -0
  29. package/browser-op/py/markdown.py +38 -0
  30. package/browser-op/py/pyproject.toml +32 -0
  31. package/browser-op/py/ready.py +208 -0
  32. package/browser-op/py/scroll.py +180 -0
  33. package/browser-op/py/upload.py +103 -0
  34. package/browser-op/py/visual_target.py +47 -0
  35. package/browser-op/py/visualize.py +91 -0
  36. package/browser-op/state.cjs +63 -0
  37. package/browser-op/web/behavior.js +153 -0
  38. package/browser-op/web/browser.js +231 -0
  39. package/browser-op/web/captcha.js +85 -0
  40. package/browser-op/web/crawler.js +109 -0
  41. package/browser-op/web/find.js +147 -0
  42. package/browser-op/web/honeypot.js +68 -0
  43. package/browser-op/web/humanize.js +522 -0
  44. package/browser-op/web/image.js +177 -0
  45. package/browser-op/web/interact.js +169 -0
  46. package/browser-op/web/markdown.js +80 -0
  47. package/browser-op/web/ready.js +295 -0
  48. package/browser-op/web/scroll.js +167 -0
  49. package/browser-op/web/upload.js +116 -0
  50. package/browser-op/web/visual-runtime.inject.cjs +6 -0
  51. package/browser-op/webplater/.env.example +7 -0
  52. package/browser-op/webplater/ARCHITECTURE.md +102 -0
  53. package/browser-op/webplater/dist/chrome-mv3/assets/popup-BUZEUmsx.css +1 -0
  54. package/browser-op/webplater/dist/chrome-mv3/background.js +2 -0
  55. package/browser-op/webplater/dist/chrome-mv3/capture.js +310 -0
  56. package/browser-op/webplater/dist/chrome-mv3/chunks/_virtual_wxt-html-plugins-DPbbfBKe.js +1 -0
  57. package/browser-op/webplater/dist/chrome-mv3/chunks/offscreen-CFXYw9Mo.js +1 -0
  58. package/browser-op/webplater/dist/chrome-mv3/chunks/popup-C-lpxZZO.js +1 -0
  59. package/browser-op/webplater/dist/chrome-mv3/content-scripts/content.js +7 -0
  60. package/browser-op/webplater/dist/chrome-mv3/manifest.json +1 -0
  61. package/browser-op/webplater/dist/chrome-mv3/offscreen.html +16 -0
  62. package/browser-op/webplater/dist/chrome-mv3/popup.html +31 -0
  63. package/browser-op/webplater/entrypoints/background.ts +938 -0
  64. package/browser-op/webplater/entrypoints/content.ts +1150 -0
  65. package/browser-op/webplater/entrypoints/offscreen/index.html +15 -0
  66. package/browser-op/webplater/entrypoints/offscreen/main.ts +161 -0
  67. package/browser-op/webplater/entrypoints/popup/index.html +29 -0
  68. package/browser-op/webplater/entrypoints/popup/main.ts +61 -0
  69. package/browser-op/webplater/entrypoints/popup/style.css +100 -0
  70. package/browser-op/webplater/lib/snapshot.ts +352 -0
  71. package/browser-op/webplater/package.json +29 -0
  72. package/browser-op/webplater/pnpm-lock.yaml +3411 -0
  73. package/browser-op/webplater/public/capture.js +310 -0
  74. package/browser-op/webplater/scripts/publish-extension.mjs +176 -0
  75. package/browser-op/webplater/tsconfig.json +19 -0
  76. package/browser-op/webplater/wxt.config.ts +34 -0
  77. package/dist/actions.md +102 -0
  78. package/dist/cli.d.ts +2 -0
  79. package/dist/cli.d.ts.map +1 -0
  80. package/dist/cli.js +278 -0
  81. package/dist/cli.js.map +1 -0
  82. package/dist/client.d.ts +94 -0
  83. package/dist/client.d.ts.map +1 -0
  84. package/dist/client.js +277 -0
  85. package/dist/client.js.map +1 -0
  86. package/dist/config.d.ts +61 -0
  87. package/dist/config.d.ts.map +1 -0
  88. package/dist/config.js +119 -0
  89. package/dist/config.js.map +1 -0
  90. package/dist/protocol.d.ts +195 -0
  91. package/dist/protocol.d.ts.map +1 -0
  92. package/dist/protocol.js +11 -0
  93. package/dist/protocol.js.map +1 -0
  94. package/dist/server.d.ts +66 -0
  95. package/dist/server.d.ts.map +1 -0
  96. package/dist/server.js +259 -0
  97. package/dist/server.js.map +1 -0
  98. package/package.json +78 -0
  99. package/schemas/browser.clearCookies.schema.json +13 -0
  100. package/schemas/browser.close.schema.json +9 -0
  101. package/schemas/browser.getCookies.schema.json +13 -0
  102. package/schemas/browser.getDownload.schema.json +15 -0
  103. package/schemas/browser.health.schema.json +9 -0
  104. package/schemas/browser.listDownloads.schema.json +16 -0
  105. package/schemas/browser.listTabs.schema.json +9 -0
  106. package/schemas/browser.newTab.schema.json +15 -0
  107. package/schemas/browser.open.schema.json +15 -0
  108. package/schemas/browser.operate.schema.json +15 -0
  109. package/schemas/browser.reuseTab.schema.json +15 -0
  110. package/schemas/browser.setCookies.schema.json +15 -0
  111. package/schemas/browser.waitFor.schema.json +15 -0
  112. package/schemas/browser.waitForDownload.schema.json +15 -0
  113. package/skills/browser/SKILL.md +110 -0
  114. package/skills/browser/references/collect.md +163 -0
  115. package/skills/browser/references/high-risk.md +161 -0
  116. package/skills/browser/references/operate-actions.md +92 -0
  117. package/skills/browser/references/probing.md +302 -0
package/README.md ADDED
@@ -0,0 +1,213 @@
1
+ # @mooncat/browser
2
+
3
+ > 浏览器自动化工具包:可独立启动的本地服务(browserd)+ JS/TS client。
4
+ > 双路由(WebPlater 扩展 / CDP),控制**宿主 Chrome**(用户看得见的本地 Chrome,不是无头集群)。
5
+
6
+ `@mooncat/browser` 是从 [mooncat](https://github.com/) 总发行体中拆出的浏览器能力,
7
+ **不依赖** mooncat 总发行体、`MOONCAT_DIST`、workspace 结构或 PM2。
8
+ 它只管 browser 自己。
9
+
10
+ ## 它是什么
11
+
12
+ ```
13
+ 你的代码 (BrowserClient)
14
+ │ HTTP JSON-RPC (:17322)
15
+
16
+ browserd (常驻服务,持有会话)
17
+ │ 双路由自动选择
18
+ ├── WebPlater 扩展路(无 CDP 端口,对高危平台更安全)
19
+ └── CDP 路(Playwright connectOverCDP 直连宿主 Chrome)
20
+ ```
21
+
22
+ - **browserd** 是真正持有 Chrome 的常驻进程。open 一次,跨多步复用 handle,满意前不 close。
23
+ - **handle 是纯数据**:拿到 `pageHandle` 就直接用,所有页面动作走 `operate({ pageHandle, action, params })`。
24
+ 绝不判断路由(extension/CDP 是 browserd 内部的事)。
25
+ - **CDP 路用 `playwright-core`**:通过 `connectOverCDP` 连接你机器上的 Chrome,
26
+ **从不下载自带浏览器**(install 不会拉几百 MB 的 chromium)。
27
+
28
+ ## 安装
29
+
30
+ ### 全局服务
31
+
32
+ ```powershell
33
+ npm i -g @mooncat/browser
34
+ mooncat-browser start --port 17322 --profile D:\browser-profile
35
+ ```
36
+
37
+ ### 项目内 client
38
+
39
+ ```powershell
40
+ npm i @mooncat/browser
41
+ ```
42
+
43
+ ## 快速开始
44
+
45
+ ```ts
46
+ import { BrowserClient } from "@mooncat/browser";
47
+
48
+ const browser = new BrowserClient({ baseUrl: "http://127.0.0.1:17322" });
49
+
50
+ // 1. 探测服务是否就绪
51
+ const h = await browser.health();
52
+ if (!h?.browserOpen) await browser.open({ headless: false });
53
+
54
+ // 2. 打开页面(newTab 返回 TabInfo,operate 传 tab.pageHandle)
55
+ const tab = await browser.newTab({ url: "https://example.com" });
56
+
57
+ // 3. 页面动作(40+ 个 action:click/fill/goto/snapshot/evaluate/...)
58
+ await browser.operate({
59
+ pageHandle: tab.pageHandle,
60
+ action: "click",
61
+ params: { selector: "button" },
62
+ });
63
+
64
+ // 4. 满意后再 close(保留登录态)
65
+ await browser.close();
66
+ ```
67
+
68
+ ## CLI
69
+
70
+ ```powershell
71
+ mooncat-browser start [--port 17322] [--profile D:\p] [--chrome path] [--health-port 17440]
72
+ mooncat-browser health [--port 17322]
73
+ mooncat-browser stop [--port 17322]
74
+ mooncat-browser open --url <url> [--port 17322]
75
+ mooncat-browser install-extension
76
+ ```
77
+
78
+ | 命令 | 说明 |
79
+ | --- | --- |
80
+ | `start` | 启动 browser 服务(wrapper + browserd 常驻;browserd 崩溃自动重启) |
81
+ | `health` | 探测 browserd 是否就绪 + 是否已 open |
82
+ | `stop` | graceful 停止(关闭 Chrome + 退出 wrapper,不重启;保留登录态) |
83
+ | `open` | 连接已运行的服务,打开/复用浏览器并导航到 URL |
84
+ | `install-extension` | 打印 WebPlater 扩展路径 + Chrome "Load unpacked" 指引 |
85
+
86
+ ## 配置
87
+
88
+ 优先级(高 → 低):**CLI 参数 > 环境变量 > 配置文件 > 默认值**。
89
+
90
+ ### 环境变量
91
+
92
+ | 变量 | 含义 | 默认 |
93
+ | --- | --- | --- |
94
+ | `MOONCAT_BROWSERD_PORT` | browserd RPC 端口(client 连这里) | `17322` |
95
+ | `MOONCAT_BROWSER_PORT` | wrapper health 端口 | `17440` |
96
+ | `MOONCAT_BROWSER_PROFILE` | Chrome user-data-dir | `<appData>/mooncat-browser/profile` |
97
+ | `MOONCAT_BROWSER_CHROME` | Chrome 可执行文件路径 | 自动探测 |
98
+ | `MOONCAT_BROWSER_CONFIG` | 配置文件路径 | `<appData>/mooncat-browser/config.json` |
99
+
100
+ ### 配置文件(JSON)
101
+
102
+ - Windows: `%LOCALAPPDATA%\mooncat-browser\config.json`
103
+ - macOS: `~/Library/Application Support/mooncat-browser/config.json`
104
+ - Linux: `$XDG_DATA_HOME/mooncat-browser/config.json`(默认 `~/.local/share/...`)
105
+
106
+ ```json
107
+ {
108
+ "rpcPort": 17322,
109
+ "healthPort": 17440,
110
+ "profile": "D:\\browser-profile",
111
+ "chromePath": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
112
+ }
113
+ ```
114
+
115
+ ### 端口语义
116
+
117
+ - `--port` / `MOONCAT_BROWSERD_PORT`(默认 **17322**)= **RPC 端口**,browserd 监听这里,
118
+ 也是 `BrowserClient` 连接的端口。`mooncat-browser start --port 17322` 后,
119
+ client 用 `baseUrl: "http://127.0.0.1:17322"`。
120
+ - `--health-port` / `MOONCAT_BROWSER_PORT`(默认 **17440**)= **wrapper health 端口**,
121
+ 供 `mooncat-browser health`(探测 wrapper)/ `stop`(POST /shutdown)/ 外部监控用。
122
+
123
+ ## 公开 API(BrowserClient)
124
+
125
+ ```
126
+ health() 探测 browserd(返回 /health 或 null)
127
+ open(options?) 打开浏览器(双路由自动选择 extension/cdp)
128
+ newTab(options?) 新建/复用标签页(同 host 默认复用)
129
+ listTabs() 列出所有标签页
130
+ operate(params) 在页面上执行动作(40+ 个 action)
131
+ getCookies(filter?) 获取 cookies
132
+ setCookies(cookies) 设置 cookies
133
+ clearCookies(filter?) 清除 cookies
134
+ close() 关闭浏览器(graceful)
135
+ reuseTab(options) 按 url 复用 tab(高危平台避免重开)
136
+ listDownloads(limit?) 列出最近下载(仅 extension 模式)
137
+ getDownload(id) 查单个下载(仅 extension 模式)
138
+ waitForDownload(opts) 轮询等下载完成(仅 extension 模式)
139
+ waitFor(opts) 通用等待 selector/text 出现(带刷新重试)
140
+ ```
141
+
142
+ 类型契约见 [`src/protocol.ts`](./src/protocol.ts),JSON Schema 草稿见 [`schemas/`](./schemas/)。
143
+
144
+ ## operate 的 action 清单
145
+
146
+ `operate({ pageHandle, action, params })` 支持 40+ 个 action,覆盖导航 / 交互 / 读取 / 等待 / 存储 / 截图。
147
+ 完整清单见 `browser-op/backend/browserd.cjs` 的 `rpcOperate`。常用:
148
+
149
+ - 导航:`goto` `goBack` `goForward` `reload` `status` `waitForLoadState` `waitForURL`
150
+ - 交互:`click` `fill` `type` `press` `hover` `focus` `check` `uncheck` `selectOption` `dblclick` `dragTo` `clickAt` `clickByText`
151
+ - 读取:`innerHTML` `innerText` `textContent` `getAttribute` `inputValue` `boundingBox` `count` `snapshot`
152
+ - 等待:`waitForSelector` `waitForFunction` `waitForTimeout`
153
+ - 存储:`getLocalStorage` `setLocalStorage` `removeLocalStorage` `clearLocalStorage`
154
+ - 截图:`screenshot`
155
+ - 进阶:`evaluate` `operateSequence` `locateVisibleText` `setInputFiles` `setDialogHandler`
156
+
157
+ selector 语法:CSS / `aria-ref=eN`(来自 snapshot 的 ref)/ `.cls>>nth(n)` / `.cls>>last`。
158
+
159
+ ## 路由(extension / cdp)
160
+
161
+ `open({ routeMode })` 自动探测:
162
+ - WebPlater 扩展已装且活 → `mode: "extension"`(不暴露 CDP 端口,对淘宝/京东等高危平台更安全)
163
+ - 未装 / 被禁用 / 不响应 → `mode: "cdp"`(带调试端口,用 `playwright-core` 连)
164
+
165
+ 装扩展后需**重启浏览器**(`close()` + `open()`)才会切到 extension 路。
166
+ 要安装扩展:`mooncat-browser install-extension`(Load unpacked 指向包内 `browser-op/webplater/dist/chrome-mv3`)。
167
+
168
+ ## 目录结构
169
+
170
+ ```
171
+ mooncat-browser/
172
+ package.json @mooncat/browser
173
+ tsconfig.json
174
+ src/ TypeScript 源码(编译到 dist/)
175
+ cli.ts mooncat-browser 命令
176
+ server.ts 服务包装层(spawn browserd + health 代理 + graceful shutdown)
177
+ client.ts BrowserClient(HTTP JSON-RPC client)
178
+ protocol.ts 公共类型契约
179
+ config.ts 配置解析(CLI > env > file > default)
180
+ browser-op/ 双路由核心(CJS,原样来自 mooncat libs/browser)
181
+ backend/browserd.cjs 常驻 daemon(HTTP RPC :17322)
182
+ index.cjs BrowserOp 双路由总入口
183
+ cdp/ extension/ web/ 各路由实现
184
+ webplater/ WebPlater Chrome 扩展(wxt 构建)
185
+ schemas/ browser.* JSON Schema(API 草稿)
186
+ scripts/clean.mjs
187
+ tests/ 单元/集成测试(vitest)
188
+ ```
189
+
190
+ ## 开发
191
+
192
+ ```powershell
193
+ npm install # 装根依赖(含 playwright-core,不下载浏览器)
194
+ npm run build:ts # 编译 src/ -> dist/
195
+ npm run build:extension # 构建 WebPlater 扩展(需 pnpm + 网络)
196
+ npm run build # = build:ts + build:extension
197
+ npm test # vitest(不依赖真实 Chrome)
198
+ npm run typecheck
199
+ ```
200
+
201
+ > `build:extension` 需要 `pnpm`。若只改 TS 层(client/server/cli/config),`npm run build:ts` 即可。
202
+ > 扩展构建产物在 `browser-op/webplater/dist/chrome-mv3`,随包发布以便 `install-extension` 开箱即用。
203
+
204
+ ## 设计原则
205
+
206
+ 1. **handle 是纯数据**——绝不 `if (ph.mode === 'cdp')`,路由不泄漏。
207
+ 2. **会话长生命周期**——`open()` 一次跨多步复用,满意前不 `close()`(启动 Chrome 慢,反复开关丢登录态)。
208
+ 3. **步进式 co-work**——一步一确认,中间产物落盘。
209
+ 4. **出错就 STOP**——报告具体错误,等指示;绝不强杀 Chrome(丢登录态/留僵尸端口)。
210
+
211
+ ## License
212
+
213
+ MIT