@roll-agent/browser-use-agent 0.2.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/SKILL.md +53 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +111 -0
- package/dist/index.js.map +1 -0
- package/dist/pages/yupao/chat.d.ts +7 -0
- package/dist/pages/yupao/chat.d.ts.map +1 -0
- package/dist/pages/yupao/chat.js +18 -0
- package/dist/pages/yupao/chat.js.map +1 -0
- package/dist/pages/yupao/message-list.d.ts +11 -0
- package/dist/pages/yupao/message-list.d.ts.map +1 -0
- package/dist/pages/yupao/message-list.js +36 -0
- package/dist/pages/yupao/message-list.js.map +1 -0
- package/dist/pages/yupao/navigation.d.ts +10 -0
- package/dist/pages/yupao/navigation.d.ts.map +1 -0
- package/dist/pages/yupao/navigation.js +34 -0
- package/dist/pages/yupao/navigation.js.map +1 -0
- package/dist/pages/yupao/selectors.d.ts +26 -0
- package/dist/pages/yupao/selectors.d.ts.map +1 -0
- package/dist/pages/yupao/selectors.js +26 -0
- package/dist/pages/yupao/selectors.js.map +1 -0
- package/dist/pages/zhipin/anti-detection.d.ts +18 -0
- package/dist/pages/zhipin/anti-detection.d.ts.map +1 -0
- package/dist/pages/zhipin/anti-detection.js +65 -0
- package/dist/pages/zhipin/anti-detection.js.map +1 -0
- package/dist/pages/zhipin/chat-navigation.d.ts +28 -0
- package/dist/pages/zhipin/chat-navigation.d.ts.map +1 -0
- package/dist/pages/zhipin/chat-navigation.js +158 -0
- package/dist/pages/zhipin/chat-navigation.js.map +1 -0
- package/dist/pages/zhipin/selectors.d.ts +128 -0
- package/dist/pages/zhipin/selectors.d.ts.map +1 -0
- package/dist/pages/zhipin/selectors.js +136 -0
- package/dist/pages/zhipin/selectors.js.map +1 -0
- package/dist/platforms.d.ts +8 -0
- package/dist/platforms.d.ts.map +1 -0
- package/dist/platforms.js +20 -0
- package/dist/platforms.js.map +1 -0
- package/dist/runtime-holder.d.ts +8 -0
- package/dist/runtime-holder.d.ts.map +1 -0
- package/dist/runtime-holder.js +50 -0
- package/dist/runtime-holder.js.map +1 -0
- package/dist/tools/browser-status.d.ts +13 -0
- package/dist/tools/browser-status.d.ts.map +1 -0
- package/dist/tools/browser-status.js +49 -0
- package/dist/tools/browser-status.js.map +1 -0
- package/dist/tools/list-pages.d.ts +13 -0
- package/dist/tools/list-pages.d.ts.map +1 -0
- package/dist/tools/list-pages.js +40 -0
- package/dist/tools/list-pages.js.map +1 -0
- package/dist/tools/navigate-active-tab.d.ts +14 -0
- package/dist/tools/navigate-active-tab.d.ts.map +1 -0
- package/dist/tools/navigate-active-tab.js +49 -0
- package/dist/tools/navigate-active-tab.js.map +1 -0
- package/dist/tools/open-platform.d.ts +9 -0
- package/dist/tools/open-platform.d.ts.map +1 -0
- package/dist/tools/open-platform.js +40 -0
- package/dist/tools/open-platform.js.map +1 -0
- package/dist/tools/select-page.d.ts +15 -0
- package/dist/tools/select-page.d.ts.map +1 -0
- package/dist/tools/select-page.js +38 -0
- package/dist/tools/select-page.js.map +1 -0
- package/dist/tools/yupao-read-messages.d.ts +13 -0
- package/dist/tools/yupao-read-messages.d.ts.map +1 -0
- package/dist/tools/yupao-read-messages.js +36 -0
- package/dist/tools/yupao-read-messages.js.map +1 -0
- package/dist/tools/yupao-send-reply.d.ts +10 -0
- package/dist/tools/yupao-send-reply.d.ts.map +1 -0
- package/dist/tools/yupao-send-reply.js +40 -0
- package/dist/tools/yupao-send-reply.js.map +1 -0
- package/dist/tools/zhipin-close-resume.d.ts +6 -0
- package/dist/tools/zhipin-close-resume.d.ts.map +1 -0
- package/dist/tools/zhipin-close-resume.js +73 -0
- package/dist/tools/zhipin-close-resume.js.map +1 -0
- package/dist/tools/zhipin-exchange-wechat.d.ts +14 -0
- package/dist/tools/zhipin-exchange-wechat.d.ts.map +1 -0
- package/dist/tools/zhipin-exchange-wechat.js +218 -0
- package/dist/tools/zhipin-exchange-wechat.js.map +1 -0
- package/dist/tools/zhipin-get-candidate-info.d.ts +34 -0
- package/dist/tools/zhipin-get-candidate-info.d.ts.map +1 -0
- package/dist/tools/zhipin-get-candidate-info.js +247 -0
- package/dist/tools/zhipin-get-candidate-info.js.map +1 -0
- package/dist/tools/zhipin-get-candidate-list.d.ts +24 -0
- package/dist/tools/zhipin-get-candidate-list.d.ts.map +1 -0
- package/dist/tools/zhipin-get-candidate-list.js +175 -0
- package/dist/tools/zhipin-get-candidate-list.js.map +1 -0
- package/dist/tools/zhipin-get-username.d.ts +6 -0
- package/dist/tools/zhipin-get-username.d.ts.map +1 -0
- package/dist/tools/zhipin-get-username.js +47 -0
- package/dist/tools/zhipin-get-username.js.map +1 -0
- package/dist/tools/zhipin-locate-resume-canvas.d.ts +15 -0
- package/dist/tools/zhipin-locate-resume-canvas.d.ts.map +1 -0
- package/dist/tools/zhipin-locate-resume-canvas.js +90 -0
- package/dist/tools/zhipin-locate-resume-canvas.js.map +1 -0
- package/dist/tools/zhipin-open-chat.d.ts +15 -0
- package/dist/tools/zhipin-open-chat.d.ts.map +1 -0
- package/dist/tools/zhipin-open-chat.js +82 -0
- package/dist/tools/zhipin-open-chat.js.map +1 -0
- package/dist/tools/zhipin-open-resume.d.ts +9 -0
- package/dist/tools/zhipin-open-resume.d.ts.map +1 -0
- package/dist/tools/zhipin-open-resume.js +51 -0
- package/dist/tools/zhipin-open-resume.js.map +1 -0
- package/dist/tools/zhipin-read-messages.d.ts +22 -0
- package/dist/tools/zhipin-read-messages.d.ts.map +1 -0
- package/dist/tools/zhipin-read-messages.js +90 -0
- package/dist/tools/zhipin-read-messages.js.map +1 -0
- package/dist/tools/zhipin-say-hello.d.ts +18 -0
- package/dist/tools/zhipin-say-hello.d.ts.map +1 -0
- package/dist/tools/zhipin-say-hello.js +118 -0
- package/dist/tools/zhipin-say-hello.js.map +1 -0
- package/dist/tools/zhipin-send-reply.d.ts +14 -0
- package/dist/tools/zhipin-send-reply.d.ts.map +1 -0
- package/dist/tools/zhipin-send-reply.js +99 -0
- package/dist/tools/zhipin-send-reply.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { defineTool } from "@roll-agent/sdk";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { getContextManager } from "../runtime-holder.js";
|
|
4
|
+
import { performInitialScrollPattern, performRandomScroll, } from "../pages/zhipin/anti-detection.js";
|
|
5
|
+
const CandidateItemSchema = z.object({
|
|
6
|
+
name: z.string(),
|
|
7
|
+
position: z.string(),
|
|
8
|
+
time: z.string(),
|
|
9
|
+
preview: z.string(),
|
|
10
|
+
unreadCount: z.number(),
|
|
11
|
+
hasUnread: z.boolean(),
|
|
12
|
+
index: z.number(),
|
|
13
|
+
});
|
|
14
|
+
const OutputSchema = z.object({
|
|
15
|
+
success: z.boolean(),
|
|
16
|
+
candidates: z.array(CandidateItemSchema),
|
|
17
|
+
total: z.number(),
|
|
18
|
+
stats: z.object({ withName: z.number(), withUnread: z.number() }),
|
|
19
|
+
});
|
|
20
|
+
export const zhipinReadMessages = defineTool({
|
|
21
|
+
name: "zhipin_read_messages",
|
|
22
|
+
description: "读取 BOSS直聘未读候选人列表,支持过滤和排序",
|
|
23
|
+
input: z.object({
|
|
24
|
+
limit: z.number().optional().describe("最多返回条数"),
|
|
25
|
+
onlyUnread: z.boolean().default(true).describe("是否只返回有未读消息的候选人"),
|
|
26
|
+
sortBy: z.enum(["time", "unreadCount", "name"]).default("time"),
|
|
27
|
+
}),
|
|
28
|
+
output: OutputSchema,
|
|
29
|
+
execute: async (input, ctx) => {
|
|
30
|
+
const onlyUnread = input.onlyUnread ?? true;
|
|
31
|
+
ctx.logger.info(`Reading zhipin messages (limit: ${input.limit ?? "all"}, onlyUnread: ${onlyUnread})`);
|
|
32
|
+
const ctxManager = getContextManager();
|
|
33
|
+
const page = await ctxManager.getPage("zhipin");
|
|
34
|
+
if (!page.url().includes("/web/geek/chat") && !page.url().includes("/web/chat")) {
|
|
35
|
+
await page.goto("https://www.zhipin.com/web/geek/chat", { waitUntil: "domcontentloaded" });
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
await page.waitForSelector(".chat-list-wrap, .geek-item", { timeout: 10_000 });
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return { success: false, candidates: [], total: 0, stats: { withName: 0, withUnread: 0 } };
|
|
42
|
+
}
|
|
43
|
+
await performInitialScrollPattern(page);
|
|
44
|
+
const candidates = await page.evaluate(() => {
|
|
45
|
+
const items = document.querySelectorAll(".geek-item");
|
|
46
|
+
const result = [];
|
|
47
|
+
items.forEach((item, index) => {
|
|
48
|
+
const nameEl = item.querySelector('[class*="name"], .nickname, .geek-name, .candidate-name');
|
|
49
|
+
let name = nameEl?.textContent?.trim() ?? "";
|
|
50
|
+
if (name.length > 10) {
|
|
51
|
+
const match = name.match(/[\u4e00-\u9fa5]{2,4}/);
|
|
52
|
+
if (match)
|
|
53
|
+
name = match[0];
|
|
54
|
+
}
|
|
55
|
+
const position = item.querySelector(".source-job")?.textContent?.trim() ?? "";
|
|
56
|
+
const time = item.querySelector(".time, .time-shadow")?.textContent?.trim() ?? "";
|
|
57
|
+
const preview = (item.querySelector(".push-text, .chat-last-msg")?.textContent?.trim() ?? "").slice(0, 100);
|
|
58
|
+
let unreadCount = 0;
|
|
59
|
+
const badgeEl = item.querySelector(".badge-count");
|
|
60
|
+
if (badgeEl)
|
|
61
|
+
unreadCount = parseInt(badgeEl.textContent?.trim() ?? "0", 10) || 0;
|
|
62
|
+
const hasUnread = unreadCount > 0 || item.querySelector(".red-dot") !== null;
|
|
63
|
+
result.push({ name, position, time, preview, unreadCount, hasUnread, index });
|
|
64
|
+
});
|
|
65
|
+
return result;
|
|
66
|
+
});
|
|
67
|
+
let filtered = onlyUnread ? candidates.filter((c) => c.hasUnread) : candidates;
|
|
68
|
+
const sortBy = input.sortBy ?? "time";
|
|
69
|
+
if (sortBy === "time") {
|
|
70
|
+
// DOM 顺序即为时间倒序(最新在上),但做一次稳定排序以防万一
|
|
71
|
+
filtered.sort((a, b) => b.time.localeCompare(a.time));
|
|
72
|
+
}
|
|
73
|
+
else if (sortBy === "unreadCount") {
|
|
74
|
+
filtered.sort((a, b) => b.unreadCount - a.unreadCount);
|
|
75
|
+
}
|
|
76
|
+
else if (sortBy === "name") {
|
|
77
|
+
filtered.sort((a, b) => a.name.localeCompare(b.name));
|
|
78
|
+
}
|
|
79
|
+
if (input.limit !== undefined)
|
|
80
|
+
filtered = filtered.slice(0, input.limit);
|
|
81
|
+
const stats = {
|
|
82
|
+
withName: candidates.filter((c) => c.name.length > 0).length,
|
|
83
|
+
withUnread: candidates.filter((c) => c.hasUnread).length,
|
|
84
|
+
};
|
|
85
|
+
await performRandomScroll(page);
|
|
86
|
+
ctx.logger.info(`Found ${filtered.length} candidates (${stats.withUnread} with unread)`);
|
|
87
|
+
return { success: true, candidates: filtered, total: candidates.length, stats };
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=zhipin-read-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zhipin-read-messages.js","sourceRoot":"","sources":["../../src/tools/zhipin-read-messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const zhipinSayHello: import("@roll-agent/sdk").ToolDefinition<{
|
|
2
|
+
indices: number[];
|
|
3
|
+
}, {
|
|
4
|
+
summary: {
|
|
5
|
+
failed: number;
|
|
6
|
+
total: number;
|
|
7
|
+
succeeded: number;
|
|
8
|
+
};
|
|
9
|
+
success: boolean;
|
|
10
|
+
results: {
|
|
11
|
+
success: boolean;
|
|
12
|
+
index: number;
|
|
13
|
+
candidateName: string;
|
|
14
|
+
candidateId: string;
|
|
15
|
+
error?: string | undefined;
|
|
16
|
+
}[];
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=zhipin-say-hello.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zhipin-say-hello.d.ts","sourceRoot":"","sources":["../../src/tools/zhipin-say-hello.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;EAkHzB,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { defineTool } from "@roll-agent/sdk";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { getContextManager } from "../runtime-holder.js";
|
|
4
|
+
import { humanDelay, shouldAddRandomBehavior, performRandomScroll, } from "../pages/zhipin/anti-detection.js";
|
|
5
|
+
const ResultItemSchema = z.object({
|
|
6
|
+
index: z.number(),
|
|
7
|
+
candidateName: z.string(),
|
|
8
|
+
candidateId: z.string(),
|
|
9
|
+
success: z.boolean(),
|
|
10
|
+
error: z.string().optional(),
|
|
11
|
+
});
|
|
12
|
+
const OutputSchema = z.object({
|
|
13
|
+
success: z.boolean(),
|
|
14
|
+
results: z.array(ResultItemSchema),
|
|
15
|
+
summary: z.object({ total: z.number(), succeeded: z.number(), failed: z.number() }),
|
|
16
|
+
});
|
|
17
|
+
export const zhipinSayHello = defineTool({
|
|
18
|
+
name: "zhipin_say_hello",
|
|
19
|
+
description: "在推荐列表页对候选人点击「打招呼」按钮(支持批量)",
|
|
20
|
+
input: z.object({ indices: z.array(z.number()).describe("要打招呼的候选人索引列表") }),
|
|
21
|
+
output: OutputSchema,
|
|
22
|
+
execute: async (input, ctx) => {
|
|
23
|
+
ctx.logger.info(`Saying hello to ${input.indices.length} candidates`);
|
|
24
|
+
const ctxManager = getContextManager();
|
|
25
|
+
const page = await ctxManager.getPage("zhipin");
|
|
26
|
+
const frame = page.frame("recommendFrame") ?? page.frames().find((f) => f.url().includes("recommend"));
|
|
27
|
+
const target = frame ?? page;
|
|
28
|
+
const results = [];
|
|
29
|
+
for (const idx of input.indices) {
|
|
30
|
+
try {
|
|
31
|
+
const r = await target.evaluate((targetIdx) => {
|
|
32
|
+
// 优先用 .candidate-card-wrap 定位(按钮在这一层),fallback 到 [data-geek]
|
|
33
|
+
let items = Array.from(document.querySelectorAll(".candidate-card-wrap"));
|
|
34
|
+
if (items.length === 0) {
|
|
35
|
+
items = Array.from(document.querySelectorAll("[data-geek], .geek-item"));
|
|
36
|
+
}
|
|
37
|
+
const item = items[targetIdx];
|
|
38
|
+
if (!item)
|
|
39
|
+
return { found: false, error: "索引超出范围" };
|
|
40
|
+
// candidateId 可能在自身或子元素 .card-inner 上
|
|
41
|
+
const candidateId = item.getAttribute("data-geek") ??
|
|
42
|
+
item.querySelector("[data-geek]")?.getAttribute("data-geek") ??
|
|
43
|
+
"";
|
|
44
|
+
const name = item.querySelector(".name")?.textContent?.trim() ?? "";
|
|
45
|
+
// 按钮在 .candidate-card-wrap 层,不在 .card-inner 内
|
|
46
|
+
const btn = item.querySelector("button.btn.btn-greet");
|
|
47
|
+
if (!btn || btn.offsetWidth === 0) {
|
|
48
|
+
return {
|
|
49
|
+
found: true,
|
|
50
|
+
candidateId,
|
|
51
|
+
name,
|
|
52
|
+
clicked: false,
|
|
53
|
+
error: "未找到打招呼按钮",
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// 模拟完整点击事件序列
|
|
57
|
+
btn.scrollIntoView({ behavior: "instant", block: "center" });
|
|
58
|
+
const rect = btn.getBoundingClientRect();
|
|
59
|
+
const x = rect.left + rect.width / 2;
|
|
60
|
+
const y = rect.top + rect.height / 2;
|
|
61
|
+
const evtOpts = { bubbles: true, cancelable: true, view: window, clientX: x, clientY: y, button: 0 };
|
|
62
|
+
btn.dispatchEvent(new MouseEvent("mousedown", evtOpts));
|
|
63
|
+
btn.dispatchEvent(new MouseEvent("mouseup", evtOpts));
|
|
64
|
+
btn.dispatchEvent(new MouseEvent("click", evtOpts));
|
|
65
|
+
btn.click();
|
|
66
|
+
return { found: true, candidateId, name, clicked: true };
|
|
67
|
+
}, idx);
|
|
68
|
+
if (!r.found) {
|
|
69
|
+
results.push({
|
|
70
|
+
index: idx,
|
|
71
|
+
candidateName: "",
|
|
72
|
+
candidateId: "",
|
|
73
|
+
success: false,
|
|
74
|
+
...(r.error !== undefined ? { error: r.error } : {}),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else if (!r.clicked) {
|
|
78
|
+
results.push({
|
|
79
|
+
index: idx,
|
|
80
|
+
candidateName: r.name,
|
|
81
|
+
candidateId: r.candidateId,
|
|
82
|
+
success: false,
|
|
83
|
+
...(r.error !== undefined ? { error: r.error } : {}),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
results.push({
|
|
88
|
+
index: idx,
|
|
89
|
+
candidateName: r.name,
|
|
90
|
+
candidateId: r.candidateId,
|
|
91
|
+
success: true,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
await humanDelay(page);
|
|
95
|
+
if (shouldAddRandomBehavior(0.3)) {
|
|
96
|
+
await performRandomScroll(page);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
results.push({
|
|
101
|
+
index: idx,
|
|
102
|
+
candidateName: "",
|
|
103
|
+
candidateId: "",
|
|
104
|
+
success: false,
|
|
105
|
+
error: err instanceof Error ? err.message : String(err),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const summary = {
|
|
110
|
+
total: results.length,
|
|
111
|
+
succeeded: results.filter((r) => r.success).length,
|
|
112
|
+
failed: results.filter((r) => !r.success).length,
|
|
113
|
+
};
|
|
114
|
+
ctx.logger.info(`Say hello: ${summary.succeeded}/${summary.total} succeeded`);
|
|
115
|
+
return { success: summary.failed === 0, results, summary };
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=zhipin-say-hello.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zhipin-say-hello.js","sourceRoot":"","sources":["../../src/tools/zhipin-say-hello.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const zhipinSendReply: import("@roll-agent/sdk").ToolDefinition<{
|
|
2
|
+
message: string;
|
|
3
|
+
index?: number | undefined;
|
|
4
|
+
candidateName?: string | undefined;
|
|
5
|
+
}, {
|
|
6
|
+
success: boolean;
|
|
7
|
+
sentMessage: string;
|
|
8
|
+
error: string | undefined;
|
|
9
|
+
} | {
|
|
10
|
+
success: boolean;
|
|
11
|
+
sentMessage: string;
|
|
12
|
+
error?: never;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=zhipin-send-reply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zhipin-send-reply.d.ts","sourceRoot":"","sources":["../../src/tools/zhipin-send-reply.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,eAAe;;;;;;;;;;;;EAkG1B,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { defineTool } from "@roll-agent/sdk";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { getContextManager } from "../runtime-holder.js";
|
|
4
|
+
import { randomDelay } from "../pages/zhipin/anti-detection.js";
|
|
5
|
+
import { ensureChatOpen } from "../pages/zhipin/chat-navigation.js";
|
|
6
|
+
const OutputSchema = z.object({
|
|
7
|
+
success: z.boolean(),
|
|
8
|
+
sentMessage: z.string(),
|
|
9
|
+
error: z.string().optional(),
|
|
10
|
+
});
|
|
11
|
+
export const zhipinSendReply = defineTool({
|
|
12
|
+
name: "zhipin_send_reply",
|
|
13
|
+
description: "发送消息。可指定 candidateName 自动打开对应聊天后发送,或不传则发送到当前窗口;例如“回复鲁倩:你好”应提取 candidateName=鲁倩。",
|
|
14
|
+
input: z.object({
|
|
15
|
+
message: z.string().describe("要发送的消息内容"),
|
|
16
|
+
candidateName: z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("候选人姓名。若用户说“回复鲁倩”,这里应提取为“鲁倩”"),
|
|
20
|
+
index: z.number().optional().describe("候选人在列表中的索引(可选)"),
|
|
21
|
+
}),
|
|
22
|
+
output: OutputSchema,
|
|
23
|
+
execute: async (input, ctx) => {
|
|
24
|
+
const { message } = input;
|
|
25
|
+
const ctxManager = getContextManager();
|
|
26
|
+
const page = await ctxManager.getPage("zhipin");
|
|
27
|
+
// 如果指定了候选人,先导航到对应聊天
|
|
28
|
+
const nav = await ensureChatOpen(page, {
|
|
29
|
+
candidateName: input.candidateName,
|
|
30
|
+
index: input.index,
|
|
31
|
+
});
|
|
32
|
+
if (nav && !nav.found) {
|
|
33
|
+
return { success: false, sentMessage: message, error: nav.error };
|
|
34
|
+
}
|
|
35
|
+
ctx.logger.info(`Sending message (${message.length} chars)${nav ? ` to ${nav.name}` : ""}`);
|
|
36
|
+
try {
|
|
37
|
+
const inputSelector = "#boss-chat-editor-input, textarea.chat-input, .chat-input";
|
|
38
|
+
await page.waitForSelector(inputSelector, { timeout: 5_000 });
|
|
39
|
+
const isContentEditable = await page.evaluate((sel) => {
|
|
40
|
+
const el = document.querySelector(sel);
|
|
41
|
+
return el?.getAttribute("contenteditable") === "true";
|
|
42
|
+
}, inputSelector);
|
|
43
|
+
if (isContentEditable) {
|
|
44
|
+
await page.evaluate((args) => {
|
|
45
|
+
const el = document.querySelector(args.sel);
|
|
46
|
+
if (!el)
|
|
47
|
+
return;
|
|
48
|
+
el.focus();
|
|
49
|
+
el.innerHTML = args.msg
|
|
50
|
+
.split("\n")
|
|
51
|
+
.map((line) => `<p>${line}</p>`)
|
|
52
|
+
.join("");
|
|
53
|
+
el.dispatchEvent(new Event("input", { bubbles: true }));
|
|
54
|
+
}, { sel: inputSelector, msg: message });
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
await page.fill(inputSelector, message);
|
|
58
|
+
}
|
|
59
|
+
await randomDelay(page, 200, 500);
|
|
60
|
+
const sendClicked = await page.evaluate(() => {
|
|
61
|
+
const selectors = [
|
|
62
|
+
".submit-content .submit.active",
|
|
63
|
+
".submit-content .submit",
|
|
64
|
+
".submit-content",
|
|
65
|
+
".btn-send",
|
|
66
|
+
];
|
|
67
|
+
for (const sel of selectors) {
|
|
68
|
+
const btn = document.querySelector(sel);
|
|
69
|
+
if (btn && btn.offsetWidth > 0) {
|
|
70
|
+
btn.click();
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const spans = Array.from(document.querySelectorAll("span"));
|
|
75
|
+
for (const span of spans) {
|
|
76
|
+
if (span.textContent?.trim() === "发送") {
|
|
77
|
+
span.click();
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
});
|
|
83
|
+
if (!sendClicked) {
|
|
84
|
+
return { success: false, sentMessage: message, error: "未找到发送按钮" };
|
|
85
|
+
}
|
|
86
|
+
await randomDelay(page, 500, 1200);
|
|
87
|
+
ctx.logger.info("Message sent successfully");
|
|
88
|
+
return { success: true, sentMessage: message };
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
sentMessage: message,
|
|
94
|
+
error: err instanceof Error ? err.message : String(err),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
//# sourceMappingURL=zhipin-send-reply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zhipin-send-reply.js","sourceRoot":"","sources":["../../src/tools/zhipin-send-reply.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@roll-agent/browser-use-agent",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/steveoon/roll-agent"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/steveoon/roll-agent",
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/steveoon/roll-agent/issues"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"SKILL.md"
|
|
16
|
+
],
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=22.6.0"
|
|
19
|
+
},
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
|
+
"default": "./dist/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"dev": "node --experimental-strip-types src/index.ts",
|
|
28
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json",
|
|
29
|
+
"typecheck": "tsc --noEmit",
|
|
30
|
+
"clean": "rm -rf dist"
|
|
31
|
+
},
|
|
32
|
+
"rollAgent": {
|
|
33
|
+
"runtime": {
|
|
34
|
+
"ownership": "core-managed",
|
|
35
|
+
"transport": "streamable-http"
|
|
36
|
+
},
|
|
37
|
+
"start": {
|
|
38
|
+
"command": "node",
|
|
39
|
+
"args": [
|
|
40
|
+
"dist/index.js"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"endpoint": {
|
|
44
|
+
"path": "/mcp",
|
|
45
|
+
"port": 3100
|
|
46
|
+
},
|
|
47
|
+
"setup": {
|
|
48
|
+
"playwright": {
|
|
49
|
+
"browsers": [
|
|
50
|
+
"chromium"
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@roll-agent/sdk": "workspace:*",
|
|
57
|
+
"@roll-agent/browser": "workspace:*",
|
|
58
|
+
"zod": "^3.25.0"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@types/node": "^22.0.0"
|
|
62
|
+
}
|
|
63
|
+
}
|