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.
- package/README.md +213 -0
- package/browser-op/backend/browserd.cjs +1004 -0
- package/browser-op/backend/rpc-client.cjs +64 -0
- package/browser-op/backend/state.cjs +51 -0
- package/browser-op/cdp/capture-inject.js +426 -0
- package/browser-op/cdp/capture-inject.ts +426 -0
- package/browser-op/cdp/capture-service.cjs +172 -0
- package/browser-op/cdp/chrome-launcher.cjs +370 -0
- package/browser-op/cdp/chrome-path.cjs +57 -0
- package/browser-op/cdp/state.cjs +89 -0
- package/browser-op/extension/extension-detect.cjs +228 -0
- package/browser-op/extension/server.cjs +197 -0
- package/browser-op/extension/service.cjs +228 -0
- package/browser-op/extension/state.cjs +78 -0
- package/browser-op/index.cjs +389 -0
- package/browser-op/package.json +17 -0
- package/browser-op/py/behavior.py +138 -0
- package/browser-op/py/browser.py +340 -0
- package/browser-op/py/captcha.py +115 -0
- package/browser-op/py/crawler.py +125 -0
- package/browser-op/py/examples/01_open_and_probe.py +48 -0
- package/browser-op/py/examples/02_reuse_and_probe.py +66 -0
- package/browser-op/py/examples/03_interact.py +66 -0
- package/browser-op/py/find.py +150 -0
- package/browser-op/py/honeypot.py +73 -0
- package/browser-op/py/humanize.py +392 -0
- package/browser-op/py/image.py +186 -0
- package/browser-op/py/interact.py +193 -0
- package/browser-op/py/markdown.py +38 -0
- package/browser-op/py/pyproject.toml +32 -0
- package/browser-op/py/ready.py +208 -0
- package/browser-op/py/scroll.py +180 -0
- package/browser-op/py/upload.py +103 -0
- package/browser-op/py/visual_target.py +47 -0
- package/browser-op/py/visualize.py +91 -0
- package/browser-op/state.cjs +63 -0
- package/browser-op/web/behavior.js +153 -0
- package/browser-op/web/browser.js +231 -0
- package/browser-op/web/captcha.js +85 -0
- package/browser-op/web/crawler.js +109 -0
- package/browser-op/web/find.js +147 -0
- package/browser-op/web/honeypot.js +68 -0
- package/browser-op/web/humanize.js +522 -0
- package/browser-op/web/image.js +177 -0
- package/browser-op/web/interact.js +169 -0
- package/browser-op/web/markdown.js +80 -0
- package/browser-op/web/ready.js +295 -0
- package/browser-op/web/scroll.js +167 -0
- package/browser-op/web/upload.js +116 -0
- package/browser-op/web/visual-runtime.inject.cjs +6 -0
- package/browser-op/webplater/.env.example +7 -0
- package/browser-op/webplater/ARCHITECTURE.md +102 -0
- package/browser-op/webplater/dist/chrome-mv3/assets/popup-BUZEUmsx.css +1 -0
- package/browser-op/webplater/dist/chrome-mv3/background.js +2 -0
- package/browser-op/webplater/dist/chrome-mv3/capture.js +310 -0
- package/browser-op/webplater/dist/chrome-mv3/chunks/_virtual_wxt-html-plugins-DPbbfBKe.js +1 -0
- package/browser-op/webplater/dist/chrome-mv3/chunks/offscreen-CFXYw9Mo.js +1 -0
- package/browser-op/webplater/dist/chrome-mv3/chunks/popup-C-lpxZZO.js +1 -0
- package/browser-op/webplater/dist/chrome-mv3/content-scripts/content.js +7 -0
- package/browser-op/webplater/dist/chrome-mv3/manifest.json +1 -0
- package/browser-op/webplater/dist/chrome-mv3/offscreen.html +16 -0
- package/browser-op/webplater/dist/chrome-mv3/popup.html +31 -0
- package/browser-op/webplater/entrypoints/background.ts +938 -0
- package/browser-op/webplater/entrypoints/content.ts +1150 -0
- package/browser-op/webplater/entrypoints/offscreen/index.html +15 -0
- package/browser-op/webplater/entrypoints/offscreen/main.ts +161 -0
- package/browser-op/webplater/entrypoints/popup/index.html +29 -0
- package/browser-op/webplater/entrypoints/popup/main.ts +61 -0
- package/browser-op/webplater/entrypoints/popup/style.css +100 -0
- package/browser-op/webplater/lib/snapshot.ts +352 -0
- package/browser-op/webplater/package.json +29 -0
- package/browser-op/webplater/pnpm-lock.yaml +3411 -0
- package/browser-op/webplater/public/capture.js +310 -0
- package/browser-op/webplater/scripts/publish-extension.mjs +176 -0
- package/browser-op/webplater/tsconfig.json +19 -0
- package/browser-op/webplater/wxt.config.ts +34 -0
- package/dist/actions.md +102 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +278 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +94 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +277 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +61 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +119 -0
- package/dist/config.js.map +1 -0
- package/dist/protocol.d.ts +195 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +11 -0
- package/dist/protocol.js.map +1 -0
- package/dist/server.d.ts +66 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +259 -0
- package/dist/server.js.map +1 -0
- package/package.json +78 -0
- package/schemas/browser.clearCookies.schema.json +13 -0
- package/schemas/browser.close.schema.json +9 -0
- package/schemas/browser.getCookies.schema.json +13 -0
- package/schemas/browser.getDownload.schema.json +15 -0
- package/schemas/browser.health.schema.json +9 -0
- package/schemas/browser.listDownloads.schema.json +16 -0
- package/schemas/browser.listTabs.schema.json +9 -0
- package/schemas/browser.newTab.schema.json +15 -0
- package/schemas/browser.open.schema.json +15 -0
- package/schemas/browser.operate.schema.json +15 -0
- package/schemas/browser.reuseTab.schema.json +15 -0
- package/schemas/browser.setCookies.schema.json +15 -0
- package/schemas/browser.waitFor.schema.json +15 -0
- package/schemas/browser.waitForDownload.schema.json +15 -0
- package/skills/browser/SKILL.md +110 -0
- package/skills/browser/references/collect.md +163 -0
- package/skills/browser/references/high-risk.md +161 -0
- package/skills/browser/references/operate-actions.md +92 -0
- package/skills/browser/references/probing.md +302 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/** 浏览器连接模式。 */
|
|
2
|
+
export type BrowserMode = "extension" | "cdp";
|
|
3
|
+
/** 路由模式:自动检测 / 强制扩展 / 强制 CDP。 */
|
|
4
|
+
export type RouteMode = "auto" | "extension" | "cdp";
|
|
5
|
+
/**
|
|
6
|
+
* 浏览器句柄。由 open() 返回。
|
|
7
|
+
* 标识一个已打开的浏览器实例(extension 模式或 CDP 直连)。
|
|
8
|
+
* 不可变,没有“切当前 tab”的操作。
|
|
9
|
+
*/
|
|
10
|
+
export interface BrowserHandle {
|
|
11
|
+
/** 连接模式:extension(浏览器扩展)或 cdp(Playwright CDP)。 */
|
|
12
|
+
mode: BrowserMode;
|
|
13
|
+
/** 启动通知信息,如 profile 路径、建议等。 */
|
|
14
|
+
notice?: {
|
|
15
|
+
level?: "info" | "warn" | "error";
|
|
16
|
+
message: string;
|
|
17
|
+
} | string | null;
|
|
18
|
+
/** 所有者标识。 */
|
|
19
|
+
ownerId: string;
|
|
20
|
+
/** CDP 模式的 WebSocket 端点。 */
|
|
21
|
+
wsEndpoint?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 标签页句柄。由 newTab()/listTabs() 返回,在 operate() 中作为 pageHandle 传入。
|
|
25
|
+
* pageId 是 browserd 维护的 page registry key(如 "p1"、"p2"),是 operate 的必备字段。
|
|
26
|
+
*/
|
|
27
|
+
export interface PageHandle {
|
|
28
|
+
/** 连接模式。 */
|
|
29
|
+
mode: BrowserMode;
|
|
30
|
+
/** 内部 pageId,browserd 维护的 page registry key。格式如 "p1"、"p2"。 */
|
|
31
|
+
pageId: string;
|
|
32
|
+
/** 标签页 URL。 */
|
|
33
|
+
url?: string;
|
|
34
|
+
/** 浏览器 tabId(仅 extension 模式)。 */
|
|
35
|
+
tabId?: string;
|
|
36
|
+
/** 所有者标识。 */
|
|
37
|
+
ownerId?: string;
|
|
38
|
+
}
|
|
39
|
+
/** browser.open() 选项。 */
|
|
40
|
+
export interface BrowserOpenOptions {
|
|
41
|
+
/** 是否无头启动(仅 CDP 模式生效,扩展模式忽略)。默认 false。 */
|
|
42
|
+
headless?: boolean;
|
|
43
|
+
/** 路由模式:auto(自动)/ extension / cdp。默认 auto。 */
|
|
44
|
+
routeMode?: RouteMode;
|
|
45
|
+
/** Chrome 可执行文件路径。不传则自动查找。 */
|
|
46
|
+
executablePath?: string;
|
|
47
|
+
}
|
|
48
|
+
/** 标签页信息(newTab/listTabs/reuseTab 统一返回)。包含 pageHandle(operate 传它)+ 元信息。 */
|
|
49
|
+
export interface TabInfo {
|
|
50
|
+
/** 标签页句柄(必有 pageId,operate 传它)。 */
|
|
51
|
+
pageHandle: PageHandle;
|
|
52
|
+
/** 标签页 URL。 */
|
|
53
|
+
url?: string;
|
|
54
|
+
/** 标签页标题。 */
|
|
55
|
+
title?: string;
|
|
56
|
+
/** 是否活动标签。 */
|
|
57
|
+
active?: boolean;
|
|
58
|
+
/** reuseTab 返回:是否复用了已有 tab。 */
|
|
59
|
+
reused?: boolean;
|
|
60
|
+
}
|
|
61
|
+
/** browser.newTab() 选项。 */
|
|
62
|
+
export interface BrowserNewTabOptions {
|
|
63
|
+
/** 新标签页打开的 URL。 */
|
|
64
|
+
url?: string;
|
|
65
|
+
/** 强制开新 tab(默认同 host 复用已有 tab)。 */
|
|
66
|
+
force?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* operate 动作参数。
|
|
70
|
+
* 不同 action 接受的 params 字段不同;常见动作见 browserd 的 rpcOperate(40+ 个动作)。
|
|
71
|
+
*/
|
|
72
|
+
export interface BrowserOperateParams {
|
|
73
|
+
/** 标签页句柄(由 newTab()/listTabs() 获取,传 tab.pageHandle)。 */
|
|
74
|
+
pageHandle: PageHandle;
|
|
75
|
+
/** 动作名。常见:click / fill / type / press / hover / goto / screenshot / snapshot / evaluate 等。 */
|
|
76
|
+
action: string;
|
|
77
|
+
/** 动作参数。具体字段因 action 而异。 */
|
|
78
|
+
params?: Record<string, unknown>;
|
|
79
|
+
}
|
|
80
|
+
/** Cookie 筛选条件。透传到 browserd。 */
|
|
81
|
+
export interface CookieFilter {
|
|
82
|
+
/** Cookie name 筛选。 */
|
|
83
|
+
name?: string;
|
|
84
|
+
/** Cookie domain 筛选。 */
|
|
85
|
+
domain?: string;
|
|
86
|
+
/** Cookie path 筛选。 */
|
|
87
|
+
path?: string;
|
|
88
|
+
/** 其他筛选条件透传到 browserd。 */
|
|
89
|
+
[key: string]: unknown;
|
|
90
|
+
}
|
|
91
|
+
/** reuseTab() 选项。 */
|
|
92
|
+
export interface ReuseTabOptions {
|
|
93
|
+
/** URL 匹配正则。找到第一个 url 匹配的 tab 复用(切过去);找不到则 newTab。 */
|
|
94
|
+
urlMatch: RegExp;
|
|
95
|
+
/** 未匹配时 newTab 打开的 URL。 */
|
|
96
|
+
url?: string;
|
|
97
|
+
}
|
|
98
|
+
/** waitForDownload() 选项。基于 chrome.downloads API 原生监听。 */
|
|
99
|
+
export interface WaitForDownloadOptions {
|
|
100
|
+
/** 文件名匹配正则源串(如 "每日数据_.*\\.xlsx$")。 */
|
|
101
|
+
filenameRegex?: string;
|
|
102
|
+
/** 只看 startTime > sinceMs 的下载(下载前时间戳,防止命中旧下载)。 */
|
|
103
|
+
sinceMs?: number;
|
|
104
|
+
/** 轮询超时(毫秒)。默认 60000。 */
|
|
105
|
+
timeoutMs?: number;
|
|
106
|
+
/** 轮询间隔(毫秒)。默认 2000。 */
|
|
107
|
+
intervalMs?: number;
|
|
108
|
+
}
|
|
109
|
+
/** 单个下载状态摘要。 */
|
|
110
|
+
export interface DownloadSummary {
|
|
111
|
+
/** 下载 id(chrome.downloads 分配)。 */
|
|
112
|
+
id: number;
|
|
113
|
+
/** 本地文件名(绝对路径)。 */
|
|
114
|
+
filename: string;
|
|
115
|
+
/** 下载源 URL。 */
|
|
116
|
+
url: string;
|
|
117
|
+
/** 下载状态:进行中/中断/完成。 */
|
|
118
|
+
state: "in_progress" | "interrupted" | "complete";
|
|
119
|
+
/** 已接收字节。 */
|
|
120
|
+
bytesReceived: number;
|
|
121
|
+
/** 总字节(-1 = 未知)。 */
|
|
122
|
+
totalBytes: number;
|
|
123
|
+
/** 文件是否仍存在于磁盘。 */
|
|
124
|
+
exists: boolean;
|
|
125
|
+
}
|
|
126
|
+
/** waitFor() 选项。通用等待:DOM 节点/文本出现,带刷新重试。 */
|
|
127
|
+
export interface WaitForOptions {
|
|
128
|
+
/** 标签页句柄。 */
|
|
129
|
+
tab: PageHandle;
|
|
130
|
+
/** 目标所在的 frameId(跨域 iframe 内的元素必须传,顶层元素不传)。 */
|
|
131
|
+
frameId?: number;
|
|
132
|
+
/** CSS selector 等待出现(与 text 二选一或都传,任一满足即返回)。 */
|
|
133
|
+
selector?: string;
|
|
134
|
+
/** 等待页面出现的文本(innerText 含此子串即满足)。 */
|
|
135
|
+
text?: string;
|
|
136
|
+
/** 单次轮询总超时(毫秒),到了若未满足触发一次刷新。默认 10000。 */
|
|
137
|
+
pollTimeoutMs?: number;
|
|
138
|
+
/** 轮询间隔(毫秒)。默认 1000。 */
|
|
139
|
+
intervalMs?: number;
|
|
140
|
+
/** 连续检测不到时,刷新页面重新检测的最大次数。默认 2。 */
|
|
141
|
+
maxRefresh?: number;
|
|
142
|
+
/** 刷新后等待页面就绪的时间(毫秒)。默认 5000。 */
|
|
143
|
+
refreshSettleMs?: number;
|
|
144
|
+
}
|
|
145
|
+
/** waitFor() 结果。 */
|
|
146
|
+
export interface WaitForResult {
|
|
147
|
+
/** 是否等到(selector 或 text 出现)。 */
|
|
148
|
+
ok: boolean;
|
|
149
|
+
/** 实际满足的条件:selector / text。 */
|
|
150
|
+
matched: "selector" | "text" | null;
|
|
151
|
+
/** 刷新了几次才等到(0 = 未刷新直接等到)。 */
|
|
152
|
+
refreshCount: number;
|
|
153
|
+
/** 总耗时(毫秒)。 */
|
|
154
|
+
elapsedMs: number;
|
|
155
|
+
}
|
|
156
|
+
/** 待设置的 Cookie。字段对齐 CDP Cookie 协议。 */
|
|
157
|
+
export interface CookieSet {
|
|
158
|
+
/** Cookie 名称。 */
|
|
159
|
+
name: string;
|
|
160
|
+
/** Cookie 值。 */
|
|
161
|
+
value: string;
|
|
162
|
+
/** Cookie 作用 URL(CDP 路由需要 url 或 domain)。 */
|
|
163
|
+
url?: string;
|
|
164
|
+
/** Cookie 作用 domain。 */
|
|
165
|
+
domain?: string;
|
|
166
|
+
/** Cookie 作用 path。默认 "/"。 */
|
|
167
|
+
path?: string;
|
|
168
|
+
/** 是否仅 HTTPS。 */
|
|
169
|
+
secure?: boolean;
|
|
170
|
+
/** 是否仅 HTTP(不可被 JS 读取)。 */
|
|
171
|
+
httpOnly?: boolean;
|
|
172
|
+
}
|
|
173
|
+
/** browserd RPC 方法名(与 browserd.cjs 的 switch 一一对应)。 */
|
|
174
|
+
export type RpcMethod = "open" | "newTab" | "listTabs" | "operate" | "getCookies" | "setCookies" | "clearCookies" | "close" | "reuseTab" | "listDownloads" | "getDownload" | "waitForDownload";
|
|
175
|
+
/** RPC 请求信封。 */
|
|
176
|
+
export interface RpcRequest {
|
|
177
|
+
id: number;
|
|
178
|
+
method: RpcMethod;
|
|
179
|
+
params?: Record<string, unknown>;
|
|
180
|
+
}
|
|
181
|
+
/** RPC 成功响应。 */
|
|
182
|
+
export interface RpcOkResponse {
|
|
183
|
+
id: number;
|
|
184
|
+
ok: true;
|
|
185
|
+
result: unknown;
|
|
186
|
+
}
|
|
187
|
+
/** RPC 失败响应。 */
|
|
188
|
+
export interface RpcErrorResponse {
|
|
189
|
+
id?: number;
|
|
190
|
+
ok: false;
|
|
191
|
+
error: string;
|
|
192
|
+
}
|
|
193
|
+
/** RPC 响应(成功或失败)。 */
|
|
194
|
+
export type RpcResponse = RpcOkResponse | RpcErrorResponse;
|
|
195
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// -*- coding: utf-8 -*-
|
|
2
|
+
// protocol.ts — @mooncat/browser 公共类型契约。
|
|
3
|
+
//
|
|
4
|
+
// 这些类型构成 @mooncat/browser 的公开 contract:
|
|
5
|
+
// - client / server / cli 共用
|
|
6
|
+
// - 用户 import { PageHandle, TabInfo, ... } 用于类型标注
|
|
7
|
+
//
|
|
8
|
+
// 设计原则:handle 是纯数据,绝不带方法/路由判断(见 browser co-work 模型)。
|
|
9
|
+
// 路由(extension/CDP)是 browserd 内部的事,handle 只携带 mode/pageId/tabId 等标识。
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,yCAAyC;AACzC,EAAE;AACF,wCAAwC;AACxC,+BAA+B;AAC/B,oDAAoD;AACpD,EAAE;AACF,qDAAqD;AACrD,qEAAqE"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type ResolvedConfig } from "./config.js";
|
|
2
|
+
/** browserd.cjs 路径:dist/ 在包根下,browser-op 在包根下。允许用环境变量覆盖(开发态)。 */
|
|
3
|
+
export declare function browserdScriptPath(): string;
|
|
4
|
+
/** wrapper 进程状态文件路径(按 rpcPort 分隔,支持多实例)。 */
|
|
5
|
+
export declare function serviceStatePath(rpcPort: number): string;
|
|
6
|
+
/** wrapper 进程状态(stop 命令据此定位 healthPort)。 */
|
|
7
|
+
export interface ServiceState {
|
|
8
|
+
pid: number;
|
|
9
|
+
rpcPort: number;
|
|
10
|
+
healthPort: number;
|
|
11
|
+
profile: string;
|
|
12
|
+
startedAt: string;
|
|
13
|
+
}
|
|
14
|
+
/** 服务运行状态(/health 返回的一部分)。 */
|
|
15
|
+
export interface ServiceStatus {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
status: "ok" | "degraded" | "down" | "stopping";
|
|
18
|
+
rpcPort: number;
|
|
19
|
+
healthPort: number;
|
|
20
|
+
browserd: boolean;
|
|
21
|
+
browserdPid: number | null;
|
|
22
|
+
lastExit: {
|
|
23
|
+
code: number | string | null;
|
|
24
|
+
at: string;
|
|
25
|
+
} | null;
|
|
26
|
+
profile: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* browserd 服务包装器。
|
|
30
|
+
*
|
|
31
|
+
* 用 startService(cfg) 启动;返回的对象含 stop() 用于 graceful 关闭。
|
|
32
|
+
* 进程信号(SIGINT/SIGTERM)会触发 graceful 关闭。
|
|
33
|
+
*/
|
|
34
|
+
export declare class BrowserService {
|
|
35
|
+
private readonly cfg;
|
|
36
|
+
private readonly logStream;
|
|
37
|
+
private browserd;
|
|
38
|
+
private lastExit;
|
|
39
|
+
private stopping;
|
|
40
|
+
private restartTimer;
|
|
41
|
+
private healthServer;
|
|
42
|
+
private shuttingDown;
|
|
43
|
+
constructor(cfg: ResolvedConfig);
|
|
44
|
+
private log;
|
|
45
|
+
/** 启动 wrapper:spawn browserd + 起 health server + 写 pidfile + 注册信号。 */
|
|
46
|
+
start(): Promise<void>;
|
|
47
|
+
/** spawn browserd 子进程(崩溃自动重启,除非 stopping)。 */
|
|
48
|
+
private startBrowserd;
|
|
49
|
+
/** 查询当前状态(代理 browserd /health + wrapper 状态)。 */
|
|
50
|
+
status(): Promise<ServiceStatus>;
|
|
51
|
+
/**
|
|
52
|
+
* Graceful 关闭:
|
|
53
|
+
* 1. 标记 stopping(阻止重启)
|
|
54
|
+
* 2. 发 close 给 browserd(browserd graceful 关 Chrome,保留登录态)
|
|
55
|
+
* 3. 等 browserd 退出(最多 10s),仍未退则 kill
|
|
56
|
+
* 4. 关 health server + 删 pidfile + exit
|
|
57
|
+
*/
|
|
58
|
+
stop(): Promise<void>;
|
|
59
|
+
/** 等 browserd 子进程退出,最多 timeoutMs;超时则 SIGKILL。 */
|
|
60
|
+
private waitForBrowserdExit;
|
|
61
|
+
}
|
|
62
|
+
/** 便捷入口:解析配置并启动 wrapper(CLI start 命令调用)。 */
|
|
63
|
+
export declare function startService(cfg: ResolvedConfig): Promise<BrowserService>;
|
|
64
|
+
/** 读取已运行 wrapper 的状态(用于 stop 命令定位 healthPort)。 */
|
|
65
|
+
export declare function readServiceState(rpcPort: number): ServiceState | null;
|
|
66
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAuBA,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAI3E,iEAAiE;AACjE,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,4CAA4C;AAC5C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,QAAQ,CAA6D;IAC7E,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,YAAY,CAAS;gBAEjB,GAAG,EAAE,cAAc;IAM/B,OAAO,CAAC,GAAG;IAUX,sEAAsE;IAChE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C5B,8CAA8C;IAC9C,OAAO,CAAC,aAAa;IA0BrB,gDAAgD;IAC1C,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;IA8BtC;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C3B,iDAAiD;IACjD,OAAO,CAAC,mBAAmB;CAsB5B;AAED,4CAA4C;AAC5C,wBAAsB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAI/E;AAED,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CASrE"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// -*- coding: utf-8 -*-
|
|
2
|
+
// server.ts — @mooncat/browser 服务包装层。
|
|
3
|
+
//
|
|
4
|
+
// 形态(与原 mooncat services/browser/main.cjs 一致,迁移风险最低):
|
|
5
|
+
//
|
|
6
|
+
// mooncat-browser start
|
|
7
|
+
// -> 启动本 wrapper(health server on healthPort)
|
|
8
|
+
// -> wrapper spawn browserd.cjs(RPC on rpcPort)
|
|
9
|
+
// -> GET /health 代理 browserd /health + wrapper 状态
|
|
10
|
+
// -> POST /shutdown graceful:发 close 给 browserd(graceful 关 Chrome),
|
|
11
|
+
// 等其退出,wrapper 退出(不重启)
|
|
12
|
+
//
|
|
13
|
+
// browserd 崩溃(非 shutdown)时 wrapper 自动 3s 后重启。
|
|
14
|
+
//
|
|
15
|
+
// 注意:browserd.cjs 是原 mooncat libs/browser 的核心,原样复制,不改其内部逻辑。
|
|
16
|
+
// wrapper 通过环境变量(BROWSERD_PORT / BROWSER_OP_USERDATA / BROWSER_OP_CHROME_PATH)
|
|
17
|
+
// 把本包的配置语义桥接给 browserd。
|
|
18
|
+
import http from "node:http";
|
|
19
|
+
import { spawn } from "node:child_process";
|
|
20
|
+
import { createWriteStream, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
import { fileURLToPath } from "node:url";
|
|
23
|
+
import { appDataDir, browserdEnv } from "./config.js";
|
|
24
|
+
const __dirname = fileURLToPath(new URL(".", import.meta.url));
|
|
25
|
+
/** browserd.cjs 路径:dist/ 在包根下,browser-op 在包根下。允许用环境变量覆盖(开发态)。 */
|
|
26
|
+
export function browserdScriptPath() {
|
|
27
|
+
return (process.env.MOONCAT_BROWSERD_BIN ||
|
|
28
|
+
join(__dirname, "..", "browser-op", "backend", "browserd.cjs"));
|
|
29
|
+
}
|
|
30
|
+
/** wrapper 进程状态文件路径(按 rpcPort 分隔,支持多实例)。 */
|
|
31
|
+
export function serviceStatePath(rpcPort) {
|
|
32
|
+
return join(appDataDir(), `service-${rpcPort}.json`);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* browserd 服务包装器。
|
|
36
|
+
*
|
|
37
|
+
* 用 startService(cfg) 启动;返回的对象含 stop() 用于 graceful 关闭。
|
|
38
|
+
* 进程信号(SIGINT/SIGTERM)会触发 graceful 关闭。
|
|
39
|
+
*/
|
|
40
|
+
export class BrowserService {
|
|
41
|
+
cfg;
|
|
42
|
+
logStream;
|
|
43
|
+
browserd = null;
|
|
44
|
+
lastExit = null;
|
|
45
|
+
stopping = false;
|
|
46
|
+
restartTimer = null;
|
|
47
|
+
healthServer = null;
|
|
48
|
+
shuttingDown = false;
|
|
49
|
+
constructor(cfg) {
|
|
50
|
+
this.cfg = cfg;
|
|
51
|
+
mkdirSync(this.cfg.logsDir, { recursive: true });
|
|
52
|
+
this.logStream = createWriteStream(join(this.cfg.logsDir, "service.log"), { flags: "a" });
|
|
53
|
+
}
|
|
54
|
+
log(msg) {
|
|
55
|
+
const line = `[${new Date().toISOString()}] ${msg}`;
|
|
56
|
+
console.error(line);
|
|
57
|
+
try {
|
|
58
|
+
this.logStream.write(line + "\n");
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
/* 日志写入失败不阻塞主流程 */
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** 启动 wrapper:spawn browserd + 起 health server + 写 pidfile + 注册信号。 */
|
|
65
|
+
async start() {
|
|
66
|
+
const state = {
|
|
67
|
+
pid: process.pid,
|
|
68
|
+
rpcPort: this.cfg.rpcPort,
|
|
69
|
+
healthPort: this.cfg.healthPort,
|
|
70
|
+
profile: this.cfg.profile,
|
|
71
|
+
startedAt: new Date().toISOString(),
|
|
72
|
+
};
|
|
73
|
+
writeFileSync(serviceStatePath(this.cfg.rpcPort), JSON.stringify(state, null, 2), "utf8");
|
|
74
|
+
this.log(`service wrapper started pid=${process.pid} (rpc :${this.cfg.rpcPort}, health :${this.cfg.healthPort})`);
|
|
75
|
+
this.startBrowserd();
|
|
76
|
+
this.healthServer = http.createServer(async (req, res) => {
|
|
77
|
+
res.setHeader("Content-Type", "application/json");
|
|
78
|
+
if (req.method === "GET" && req.url === "/health") {
|
|
79
|
+
res.end(JSON.stringify(await this.status()));
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (req.method === "POST" && req.url === "/shutdown") {
|
|
83
|
+
res.end(JSON.stringify({ ok: true, message: "shutting down" }));
|
|
84
|
+
this.stop().catch((e) => this.log(`stop error: ${e.message}`));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
res.statusCode = 404;
|
|
88
|
+
res.end(JSON.stringify({ ok: false, error: "not found" }));
|
|
89
|
+
});
|
|
90
|
+
await new Promise((resolve, reject) => {
|
|
91
|
+
this.healthServer.listen(this.cfg.healthPort, "127.0.0.1", resolve);
|
|
92
|
+
this.healthServer.on("error", (e) => reject(e));
|
|
93
|
+
});
|
|
94
|
+
this.log(`health listening on http://127.0.0.1:${this.cfg.healthPort}/health`);
|
|
95
|
+
// 信号 → graceful 关闭
|
|
96
|
+
const shutdownSignal = (sig) => () => {
|
|
97
|
+
this.log(`received ${sig}`);
|
|
98
|
+
this.stop().catch((e) => this.log(`stop error: ${e.message}`));
|
|
99
|
+
};
|
|
100
|
+
process.on("SIGINT", shutdownSignal("SIGINT"));
|
|
101
|
+
process.on("SIGTERM", shutdownSignal("SIGTERM"));
|
|
102
|
+
}
|
|
103
|
+
/** spawn browserd 子进程(崩溃自动重启,除非 stopping)。 */
|
|
104
|
+
startBrowserd() {
|
|
105
|
+
const env = { ...process.env, ...browserdEnv(this.cfg) };
|
|
106
|
+
this.browserd = spawn(process.execPath, [browserdScriptPath()], {
|
|
107
|
+
cwd: process.cwd(),
|
|
108
|
+
env,
|
|
109
|
+
stdio: "inherit",
|
|
110
|
+
});
|
|
111
|
+
this.log(`browserd started pid=${this.browserd.pid} (rpc :${this.cfg.rpcPort})`);
|
|
112
|
+
this.browserd.on("exit", (code, signal) => {
|
|
113
|
+
this.lastExit = { code: code != null ? code : signal, at: new Date().toISOString() };
|
|
114
|
+
this.log(`browserd exited code=${code} signal=${signal}`);
|
|
115
|
+
this.browserd = null;
|
|
116
|
+
if (this.stopping) {
|
|
117
|
+
// 主动关闭触发的退出,不重启;由 stop() 继续收尾
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// 非主动退出 → 3s 后重启
|
|
121
|
+
this.restartTimer = setTimeout(() => {
|
|
122
|
+
if (this.stopping)
|
|
123
|
+
return;
|
|
124
|
+
this.log(`browserd restarting (auto)`);
|
|
125
|
+
this.startBrowserd();
|
|
126
|
+
}, 3000);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/** 查询当前状态(代理 browserd /health + wrapper 状态)。 */
|
|
130
|
+
async status() {
|
|
131
|
+
let browserdUp = false;
|
|
132
|
+
try {
|
|
133
|
+
const resp = await fetch(`http://127.0.0.1:${this.cfg.rpcPort}/health`);
|
|
134
|
+
if (resp.ok) {
|
|
135
|
+
await resp.text();
|
|
136
|
+
browserdUp = true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
browserdUp = false;
|
|
141
|
+
}
|
|
142
|
+
const status = this.stopping
|
|
143
|
+
? "stopping"
|
|
144
|
+
: browserdUp
|
|
145
|
+
? "ok"
|
|
146
|
+
: this.lastExit
|
|
147
|
+
? "degraded"
|
|
148
|
+
: "down";
|
|
149
|
+
return {
|
|
150
|
+
ok: status === "ok",
|
|
151
|
+
status,
|
|
152
|
+
rpcPort: this.cfg.rpcPort,
|
|
153
|
+
healthPort: this.cfg.healthPort,
|
|
154
|
+
browserd: browserdUp,
|
|
155
|
+
browserdPid: this.browserd?.pid ?? null,
|
|
156
|
+
lastExit: this.lastExit,
|
|
157
|
+
profile: this.cfg.profile,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Graceful 关闭:
|
|
162
|
+
* 1. 标记 stopping(阻止重启)
|
|
163
|
+
* 2. 发 close 给 browserd(browserd graceful 关 Chrome,保留登录态)
|
|
164
|
+
* 3. 等 browserd 退出(最多 10s),仍未退则 kill
|
|
165
|
+
* 4. 关 health server + 删 pidfile + exit
|
|
166
|
+
*/
|
|
167
|
+
async stop() {
|
|
168
|
+
if (this.shuttingDown)
|
|
169
|
+
return;
|
|
170
|
+
this.shuttingDown = true;
|
|
171
|
+
this.stopping = true;
|
|
172
|
+
if (this.restartTimer) {
|
|
173
|
+
clearTimeout(this.restartTimer);
|
|
174
|
+
this.restartTimer = null;
|
|
175
|
+
}
|
|
176
|
+
this.log(`graceful shutdown begin`);
|
|
177
|
+
// 1) 发 close 给 browserd(graceful 关 Chrome)
|
|
178
|
+
try {
|
|
179
|
+
const body = JSON.stringify({ id: 1, method: "close", params: {} });
|
|
180
|
+
await fetch(`http://127.0.0.1:${this.cfg.rpcPort}/rpc`, {
|
|
181
|
+
method: "POST",
|
|
182
|
+
headers: { "Content-Type": "application/json", "Content-Length": String(Buffer.byteLength(body)) },
|
|
183
|
+
body,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
catch (e) {
|
|
187
|
+
this.log(`close rpc failed (browserd may already be down): ${e.message}`);
|
|
188
|
+
}
|
|
189
|
+
// 2) 等 browserd 退出
|
|
190
|
+
await this.waitForBrowserdExit(10000);
|
|
191
|
+
// 3) 关 health server
|
|
192
|
+
await new Promise((resolve) => {
|
|
193
|
+
if (!this.healthServer)
|
|
194
|
+
return resolve();
|
|
195
|
+
this.healthServer.close(() => resolve());
|
|
196
|
+
setTimeout(resolve, 1000);
|
|
197
|
+
});
|
|
198
|
+
// 4) 删 pidfile + exit
|
|
199
|
+
try {
|
|
200
|
+
unlinkSync(serviceStatePath(this.cfg.rpcPort));
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
/* ignore */
|
|
204
|
+
}
|
|
205
|
+
this.log(`graceful shutdown complete`);
|
|
206
|
+
try {
|
|
207
|
+
this.logStream.end();
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
/* ignore */
|
|
211
|
+
}
|
|
212
|
+
process.exit(0);
|
|
213
|
+
}
|
|
214
|
+
/** 等 browserd 子进程退出,最多 timeoutMs;超时则 SIGKILL。 */
|
|
215
|
+
waitForBrowserdExit(timeoutMs) {
|
|
216
|
+
return new Promise((resolve) => {
|
|
217
|
+
if (!this.browserd)
|
|
218
|
+
return resolve();
|
|
219
|
+
const done = () => {
|
|
220
|
+
clearTimeout(timer);
|
|
221
|
+
resolve();
|
|
222
|
+
};
|
|
223
|
+
this.browserd.once("exit", done);
|
|
224
|
+
const timer = setTimeout(() => {
|
|
225
|
+
if (this.browserd) {
|
|
226
|
+
this.log(`browserd did not exit in ${timeoutMs}ms, killing`);
|
|
227
|
+
try {
|
|
228
|
+
this.browserd.kill("SIGKILL");
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
/* ignore */
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// 给 kill 一点时间
|
|
235
|
+
setTimeout(done, 500);
|
|
236
|
+
}, timeoutMs);
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/** 便捷入口:解析配置并启动 wrapper(CLI start 命令调用)。 */
|
|
241
|
+
export async function startService(cfg) {
|
|
242
|
+
const svc = new BrowserService(cfg);
|
|
243
|
+
await svc.start();
|
|
244
|
+
return svc;
|
|
245
|
+
}
|
|
246
|
+
/** 读取已运行 wrapper 的状态(用于 stop 命令定位 healthPort)。 */
|
|
247
|
+
export function readServiceState(rpcPort) {
|
|
248
|
+
const f = serviceStatePath(rpcPort);
|
|
249
|
+
if (!existsSync(f))
|
|
250
|
+
return null;
|
|
251
|
+
try {
|
|
252
|
+
const obj = JSON.parse(readFileSync(f, "utf8"));
|
|
253
|
+
return obj && typeof obj === "object" && obj.pid ? obj : null;
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mooncat-browser",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "浏览器自动化工具包:可独立启动的本地服务(browserd)+ JS/TS client。双路由(WebPlater 扩展 / CDP),不依赖 mooncat 总发行体。",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/client.js",
|
|
7
|
+
"module": "./dist/client.js",
|
|
8
|
+
"types": "./dist/client.d.ts",
|
|
9
|
+
"bin": {
|
|
10
|
+
"mooncat-browser": "./dist/cli.js"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/client.d.ts",
|
|
15
|
+
"import": "./dist/client.js"
|
|
16
|
+
},
|
|
17
|
+
"./client": {
|
|
18
|
+
"types": "./dist/client.d.ts",
|
|
19
|
+
"import": "./dist/client.js"
|
|
20
|
+
},
|
|
21
|
+
"./server": {
|
|
22
|
+
"types": "./dist/server.d.ts",
|
|
23
|
+
"import": "./dist/server.js"
|
|
24
|
+
},
|
|
25
|
+
"./protocol": {
|
|
26
|
+
"types": "./dist/protocol.d.ts",
|
|
27
|
+
"import": "./dist/protocol.js"
|
|
28
|
+
},
|
|
29
|
+
"./config": {
|
|
30
|
+
"types": "./dist/config.d.ts",
|
|
31
|
+
"import": "./dist/config.js"
|
|
32
|
+
},
|
|
33
|
+
"./schemas/*": "./schemas/*",
|
|
34
|
+
"./package.json": "./package.json"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist",
|
|
38
|
+
"browser-op",
|
|
39
|
+
"schemas",
|
|
40
|
+
"skills",
|
|
41
|
+
"README.md"
|
|
42
|
+
],
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=20"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "npm run build:ts && npm run build:docs && npm run build:extension",
|
|
48
|
+
"build:ts": "tsc",
|
|
49
|
+
"build:docs": "node scripts/generate-actions.mjs",
|
|
50
|
+
"build:extension": "cd browser-op/webplater && pnpm install --frozen-lockfile && pnpm run build",
|
|
51
|
+
"clean": "node scripts/clean.mjs",
|
|
52
|
+
"typecheck": "tsc --noEmit",
|
|
53
|
+
"test": "vitest run",
|
|
54
|
+
"prepublishOnly": "npm run build:ts"
|
|
55
|
+
},
|
|
56
|
+
"dependencies": {
|
|
57
|
+
"cheerio": "^1.2.0",
|
|
58
|
+
"commander": "^12.1.0",
|
|
59
|
+
"playwright-core": "^1.61.0",
|
|
60
|
+
"turndown": "^7.2.0",
|
|
61
|
+
"ws": "^8.21.0"
|
|
62
|
+
},
|
|
63
|
+
"devDependencies": {
|
|
64
|
+
"@types/node": "^22.10.0",
|
|
65
|
+
"typescript": "^5.7.2",
|
|
66
|
+
"vitest": "^2.1.0"
|
|
67
|
+
},
|
|
68
|
+
"keywords": [
|
|
69
|
+
"browser",
|
|
70
|
+
"automation",
|
|
71
|
+
"playwright",
|
|
72
|
+
"chrome",
|
|
73
|
+
"cdp",
|
|
74
|
+
"web-automation",
|
|
75
|
+
"mooncat"
|
|
76
|
+
],
|
|
77
|
+
"license": "MIT"
|
|
78
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://mooncat/sdk/browser.clearCookies.schema.json",
|
|
4
|
+
"title": "browser.clearCookies",
|
|
5
|
+
"description": "browser.clearCookies input",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"properties": {
|
|
8
|
+
"filter": {
|
|
9
|
+
"type": null
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"required": []
|
|
13
|
+
}
|