@viyzhu/boss-cli-fork 0.6.8
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/AGENTS.md +30 -0
- package/LICENSE +674 -0
- package/README.md +223 -0
- package/dist/browser/browser_session.d.ts +27 -0
- package/dist/browser/browser_session.d.ts.map +1 -0
- package/dist/browser/browser_session.js +246 -0
- package/dist/browser/browser_session.js.map +1 -0
- package/dist/browser/cdp_browser.d.ts +50 -0
- package/dist/browser/cdp_browser.d.ts.map +1 -0
- package/dist/browser/cdp_browser.js +315 -0
- package/dist/browser/cdp_browser.js.map +1 -0
- package/dist/browser/human_delay.d.ts +117 -0
- package/dist/browser/human_delay.d.ts.map +1 -0
- package/dist/browser/human_delay.js +71 -0
- package/dist/browser/human_delay.js.map +1 -0
- package/dist/browser/index.d.ts +9 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +9 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/timing.d.ts +7 -0
- package/dist/browser/timing.d.ts.map +1 -0
- package/dist/browser/timing.js +34 -0
- package/dist/browser/timing.js.map +1 -0
- package/dist/browser/viewport_temp.d.ts +15 -0
- package/dist/browser/viewport_temp.d.ts.map +1 -0
- package/dist/browser/viewport_temp.js +78 -0
- package/dist/browser/viewport_temp.js.map +1 -0
- package/dist/cli/banner.d.ts +2 -0
- package/dist/cli/banner.d.ts.map +1 -0
- package/dist/cli/banner.js +69 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/cliRouter.d.ts +9 -0
- package/dist/cli/cliRouter.d.ts.map +1 -0
- package/dist/cli/cliRouter.js +604 -0
- package/dist/cli/cliRouter.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +34 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/version.d.ts +29 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +180 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/common/auth.d.ts +44 -0
- package/dist/common/auth.d.ts.map +1 -0
- package/dist/common/auth.js +168 -0
- package/dist/common/auth.js.map +1 -0
- package/dist/common/baidu_user_env.d.ts +7 -0
- package/dist/common/baidu_user_env.d.ts.map +1 -0
- package/dist/common/baidu_user_env.js +56 -0
- package/dist/common/baidu_user_env.js.map +1 -0
- package/dist/common/boss_availability.d.ts +5 -0
- package/dist/common/boss_availability.d.ts.map +1 -0
- package/dist/common/boss_availability.js +245 -0
- package/dist/common/boss_availability.js.map +1 -0
- package/dist/common/boss_modal.d.ts +14 -0
- package/dist/common/boss_modal.d.ts.map +1 -0
- package/dist/common/boss_modal.js +81 -0
- package/dist/common/boss_modal.js.map +1 -0
- package/dist/common/boss_page_guards.d.ts +14 -0
- package/dist/common/boss_page_guards.d.ts.map +1 -0
- package/dist/common/boss_page_guards.js +596 -0
- package/dist/common/boss_page_guards.js.map +1 -0
- package/dist/common/boss_paywall_popup.d.ts +28 -0
- package/dist/common/boss_paywall_popup.d.ts.map +1 -0
- package/dist/common/boss_paywall_popup.js +158 -0
- package/dist/common/boss_paywall_popup.js.map +1 -0
- package/dist/common/boss_session_lock.d.ts +2 -0
- package/dist/common/boss_session_lock.d.ts.map +1 -0
- package/dist/common/boss_session_lock.js +127 -0
- package/dist/common/boss_session_lock.js.map +1 -0
- package/dist/common/boss_session_page.d.ts +27 -0
- package/dist/common/boss_session_page.d.ts.map +1 -0
- package/dist/common/boss_session_page.js +173 -0
- package/dist/common/boss_session_page.js.map +1 -0
- package/dist/common/boss_sidebar_nav.d.ts +7 -0
- package/dist/common/boss_sidebar_nav.d.ts.map +1 -0
- package/dist/common/boss_sidebar_nav.js +53 -0
- package/dist/common/boss_sidebar_nav.js.map +1 -0
- package/dist/common/c_resume_capture.d.ts +19 -0
- package/dist/common/c_resume_capture.d.ts.map +1 -0
- package/dist/common/c_resume_capture.js +185 -0
- package/dist/common/c_resume_capture.js.map +1 -0
- package/dist/common/ensure_page.d.ts +9 -0
- package/dist/common/ensure_page.d.ts.map +1 -0
- package/dist/common/ensure_page.js +14 -0
- package/dist/common/ensure_page.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/ocr/baidu_ocr.d.ts +13 -0
- package/dist/ocr/baidu_ocr.d.ts.map +1 -0
- package/dist/ocr/baidu_ocr.js +80 -0
- package/dist/ocr/baidu_ocr.js.map +1 -0
- package/dist/ocr/index.d.ts +3 -0
- package/dist/ocr/index.d.ts.map +1 -0
- package/dist/ocr/index.js +3 -0
- package/dist/ocr/index.js.map +1 -0
- package/dist/ocr/resume_ocr.d.ts +13 -0
- package/dist/ocr/resume_ocr.d.ts.map +1 -0
- package/dist/ocr/resume_ocr.js +38 -0
- package/dist/ocr/resume_ocr.js.map +1 -0
- package/dist/toolset/action.d.ts +12 -0
- package/dist/toolset/action.d.ts.map +1 -0
- package/dist/toolset/action.js +521 -0
- package/dist/toolset/action.js.map +1 -0
- package/dist/toolset/baidu_credentials.d.ts +5 -0
- package/dist/toolset/baidu_credentials.d.ts.map +1 -0
- package/dist/toolset/baidu_credentials.js +24 -0
- package/dist/toolset/baidu_credentials.js.map +1 -0
- package/dist/toolset/chat.d.ts +10 -0
- package/dist/toolset/chat.d.ts.map +1 -0
- package/dist/toolset/chat.js +763 -0
- package/dist/toolset/chat.js.map +1 -0
- package/dist/toolset/deep-search.d.ts +35 -0
- package/dist/toolset/deep-search.d.ts.map +1 -0
- package/dist/toolset/deep-search.js +1505 -0
- package/dist/toolset/deep-search.js.map +1 -0
- package/dist/toolset/greet.d.ts +6 -0
- package/dist/toolset/greet.d.ts.map +1 -0
- package/dist/toolset/greet.js +81 -0
- package/dist/toolset/greet.js.map +1 -0
- package/dist/toolset/index.d.ts +48 -0
- package/dist/toolset/index.d.ts.map +1 -0
- package/dist/toolset/index.js +71 -0
- package/dist/toolset/index.js.map +1 -0
- package/dist/toolset/jd.d.ts +10 -0
- package/dist/toolset/jd.d.ts.map +1 -0
- package/dist/toolset/jd.js +406 -0
- package/dist/toolset/jd.js.map +1 -0
- package/dist/toolset/list.d.ts +6 -0
- package/dist/toolset/list.d.ts.map +1 -0
- package/dist/toolset/list.js +146 -0
- package/dist/toolset/list.js.map +1 -0
- package/dist/toolset/login.d.ts +6 -0
- package/dist/toolset/login.d.ts.map +1 -0
- package/dist/toolset/login.js +76 -0
- package/dist/toolset/login.js.map +1 -0
- package/dist/toolset/normal-search.d.ts +12 -0
- package/dist/toolset/normal-search.d.ts.map +1 -0
- package/dist/toolset/normal-search.js +301 -0
- package/dist/toolset/normal-search.js.map +1 -0
- package/dist/toolset/preview.d.ts +5 -0
- package/dist/toolset/preview.d.ts.map +1 -0
- package/dist/toolset/preview.js +100 -0
- package/dist/toolset/preview.js.map +1 -0
- package/dist/toolset/recommend.d.ts +36 -0
- package/dist/toolset/recommend.d.ts.map +1 -0
- package/dist/toolset/recommend.js +428 -0
- package/dist/toolset/recommend.js.map +1 -0
- package/dist/toolset/send.d.ts +7 -0
- package/dist/toolset/send.d.ts.map +1 -0
- package/dist/toolset/send.js +52 -0
- package/dist/toolset/send.js.map +1 -0
- package/package.json +69 -0
- package/skills/boss-frontend-analysis/SKILL.md +58 -0
- package/skills/boss-frontend-analysis/agents/openai.yaml +4 -0
- package/skills/boss-frontend-analysis/scripts/capture_boss_frontend.mjs +604 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { ONLINE_RESUME_IFRAME_WAIT_MAX_MS, selectAllModifierKey, sleepRandom, snapshotBossPageViewport, } from '../browser/index.js';
|
|
3
|
+
import { isBossChatIndexUrl } from '../common/auth.js';
|
|
4
|
+
import { closeBossPaywallPopupIfPresent, describeBossPaywallPopupIfPresent, waitForCResumeIframeOrPaywall, } from '../common/boss_paywall_popup.js';
|
|
5
|
+
import { captureCResumeIframeToFile, closeCResumePanel, safeResumeScreenshotFileBase, waitForVisibleCResumeIframeReady, } from '../common/c_resume_capture.js';
|
|
6
|
+
import { ensureAppDataLayout, RESUME_SCREENSHOTS_DIR } from '../config.js';
|
|
7
|
+
import { isResumeOcrEnabled, ocrResumePngToTextFile } from '../ocr/index.js';
|
|
8
|
+
import { runGetCommunicationHistory } from './chat.js';
|
|
9
|
+
function ensureInCandidateChat(page, actionLabel) {
|
|
10
|
+
return (async () => {
|
|
11
|
+
const currentUrl = page.url();
|
|
12
|
+
if (!isBossChatIndexUrl(currentUrl)) {
|
|
13
|
+
throw new Error('请先进入聊天列表页(/web/chat/index)并打开候选人聊天。');
|
|
14
|
+
}
|
|
15
|
+
const inCandidateChat = await page.$('.base-info-single-container');
|
|
16
|
+
if (!inCandidateChat) {
|
|
17
|
+
throw new Error(`请先打开候选人聊天详情页,再执行“${actionLabel}”操作。`);
|
|
18
|
+
}
|
|
19
|
+
})();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 在聊天页右侧操作区执行「不合适」:该入口依赖 hover 后才响应真实点击,先派发 hover 再点一次。
|
|
23
|
+
*/
|
|
24
|
+
async function markCandidateNotFitWithoutReason(page) {
|
|
25
|
+
await ensureInCandidateChat(page, '不合适');
|
|
26
|
+
const hovered = (await page.evaluate(`(() => {
|
|
27
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "").trim();
|
|
28
|
+
function fireHover(el) {
|
|
29
|
+
if (!(el instanceof HTMLElement)) return;
|
|
30
|
+
const r = el.getBoundingClientRect();
|
|
31
|
+
const cx = r.left + r.width / 2;
|
|
32
|
+
const cy = r.top + r.height / 2;
|
|
33
|
+
["mouseover", "mouseenter", "mousemove"].forEach((type) => {
|
|
34
|
+
el.dispatchEvent(
|
|
35
|
+
new MouseEvent(type, { bubbles: true, cancelable: true, clientX: cx, clientY: cy, view: window }),
|
|
36
|
+
);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
const roots = Array.from(document.querySelectorAll(".operate-exchange-right .operate-icon-item, .operate-icon-item"));
|
|
40
|
+
const target = roots.find((el) => {
|
|
41
|
+
const t = norm(el.querySelector(".operate-btn")?.textContent || el.textContent || "");
|
|
42
|
+
return t.includes("不合适");
|
|
43
|
+
});
|
|
44
|
+
if (!target) return false;
|
|
45
|
+
target.scrollIntoView({ block: "center", inline: "nearest" });
|
|
46
|
+
fireHover(target);
|
|
47
|
+
const btn = target.querySelector(".operate-btn");
|
|
48
|
+
if (btn instanceof HTMLElement) fireHover(btn);
|
|
49
|
+
return true;
|
|
50
|
+
})()`));
|
|
51
|
+
if (!hovered) {
|
|
52
|
+
throw new Error('未找到“不合适”按钮,无法执行操作。');
|
|
53
|
+
}
|
|
54
|
+
await sleepRandom(200, 450);
|
|
55
|
+
const clicked = (await page.evaluate(`(() => {
|
|
56
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "").trim();
|
|
57
|
+
const roots = Array.from(document.querySelectorAll(".operate-exchange-right .operate-icon-item, .operate-icon-item"));
|
|
58
|
+
const target = roots.find((el) => {
|
|
59
|
+
const t = norm(el.querySelector(".operate-btn")?.textContent || el.textContent || "");
|
|
60
|
+
return t.includes("不合适");
|
|
61
|
+
});
|
|
62
|
+
if (!target) return false;
|
|
63
|
+
const btn = target.querySelector(".operate-btn");
|
|
64
|
+
const host = btn instanceof HTMLElement ? btn : target;
|
|
65
|
+
host.scrollIntoView({ block: "center", inline: "nearest" });
|
|
66
|
+
host.click();
|
|
67
|
+
return true;
|
|
68
|
+
})()`));
|
|
69
|
+
if (!clicked) {
|
|
70
|
+
throw new Error('未找到“不合适”按钮,无法执行点击。');
|
|
71
|
+
}
|
|
72
|
+
await sleepRandom(320, 780);
|
|
73
|
+
return '已点击「不合适」。';
|
|
74
|
+
}
|
|
75
|
+
/** 在聊天页右侧操作区点击「换微信」。 */
|
|
76
|
+
async function runExchangeWechat(page) {
|
|
77
|
+
await ensureInCandidateChat(page, '换微信');
|
|
78
|
+
const availability = (await page.evaluate(`(() => {
|
|
79
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "");
|
|
80
|
+
const items = Array.from(
|
|
81
|
+
document.querySelectorAll(".operate-exchange-left .operate-icon-item, .operate-icon-item"),
|
|
82
|
+
);
|
|
83
|
+
const target = items.find((el) => norm(el.querySelector(".operate-btn")?.textContent).includes("换微信"));
|
|
84
|
+
if (!target) return { found: false, available: false };
|
|
85
|
+
const btn = target.querySelector(".operate-btn");
|
|
86
|
+
const className = [target.className ?? "", btn?.className ?? ""].join(" ");
|
|
87
|
+
const disabled = /disabled|forbid|ban/i.test(className) || btn?.getAttribute("disabled") !== null;
|
|
88
|
+
return { found: true, available: !disabled };
|
|
89
|
+
})()`));
|
|
90
|
+
if (!availability.found) {
|
|
91
|
+
throw new Error('未找到“换微信”按钮,当前页面可能不支持该操作。');
|
|
92
|
+
}
|
|
93
|
+
if (!availability.available) {
|
|
94
|
+
throw new Error('当前“换微信”按钮不可用,请先确认会话状态是否满足交换条件。');
|
|
95
|
+
}
|
|
96
|
+
await sleepRandom(220, 620);
|
|
97
|
+
const clicked = (await page.evaluate(`(() => {
|
|
98
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "");
|
|
99
|
+
const items = Array.from(
|
|
100
|
+
document.querySelectorAll(".operate-exchange-left .operate-icon-item, .operate-icon-item"),
|
|
101
|
+
);
|
|
102
|
+
const target = items.find((el) => norm(el.querySelector(".operate-btn")?.textContent).includes("换微信"));
|
|
103
|
+
if (!target) return false;
|
|
104
|
+
const btn = target.querySelector(".operate-btn");
|
|
105
|
+
const host = btn instanceof HTMLElement ? btn : target;
|
|
106
|
+
host.scrollIntoView({ block: "center", inline: "nearest" });
|
|
107
|
+
host.click();
|
|
108
|
+
return true;
|
|
109
|
+
})()`));
|
|
110
|
+
if (!clicked) {
|
|
111
|
+
throw new Error('点击“换微信”失败,请确认当前会话是否仍处于可操作状态。');
|
|
112
|
+
}
|
|
113
|
+
await sleepRandom(280, 520);
|
|
114
|
+
await page.waitForFunction(`(() => {
|
|
115
|
+
function isVisible(el) {
|
|
116
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
117
|
+
const st = window.getComputedStyle(el);
|
|
118
|
+
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
119
|
+
const r = el.getBoundingClientRect();
|
|
120
|
+
return r.width > 0 && r.height > 0;
|
|
121
|
+
}
|
|
122
|
+
const tips = Array.from(document.querySelectorAll(".exchange-tooltip"));
|
|
123
|
+
for (const tip of tips) {
|
|
124
|
+
if (!isVisible(tip)) continue;
|
|
125
|
+
const raw = (tip.textContent ?? "").replace(/\\s+/g, "");
|
|
126
|
+
if (!raw.includes("交换微信")) continue;
|
|
127
|
+
const primary = tip.querySelector(".btn-box .boss-btn-primary");
|
|
128
|
+
return primary instanceof HTMLElement;
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
})()`, { timeout: 12_000 });
|
|
132
|
+
const confirmed = (await page.evaluate(`(() => {
|
|
133
|
+
function isVisible(el) {
|
|
134
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
135
|
+
const st = window.getComputedStyle(el);
|
|
136
|
+
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
137
|
+
const r = el.getBoundingClientRect();
|
|
138
|
+
return r.width > 0 && r.height > 0;
|
|
139
|
+
}
|
|
140
|
+
function norm(v) {
|
|
141
|
+
return (v ?? "").replace(/\\s+/g, "").trim();
|
|
142
|
+
}
|
|
143
|
+
const tips = Array.from(document.querySelectorAll(".exchange-tooltip"));
|
|
144
|
+
for (const tip of tips) {
|
|
145
|
+
if (!isVisible(tip)) continue;
|
|
146
|
+
if (!norm(tip.textContent).includes("交换微信")) continue;
|
|
147
|
+
const primary = tip.querySelector(".btn-box .boss-btn-primary.boss-btn, .btn-box .boss-btn-primary");
|
|
148
|
+
if (!(primary instanceof HTMLElement)) continue;
|
|
149
|
+
if (!norm(primary.textContent).includes("确定")) continue;
|
|
150
|
+
primary.scrollIntoView({ block: "center", inline: "nearest" });
|
|
151
|
+
primary.click();
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
})()`));
|
|
156
|
+
if (!confirmed) {
|
|
157
|
+
throw new Error('已弹出交换微信确认框,但未点到「确定」按钮。');
|
|
158
|
+
}
|
|
159
|
+
await sleepRandom(320, 780);
|
|
160
|
+
return '已点击「换微信」并在弹窗中确认。';
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 在聊天页左侧工具栏点击「求简历」,并在确认弹窗中点「确定」。
|
|
164
|
+
* 平台规则:双方需各至少发送一条消息后该入口才可点;否则按钮为禁用态。
|
|
165
|
+
*/
|
|
166
|
+
export async function runRequestAttachmentResume(page) {
|
|
167
|
+
await ensureInCandidateChat(page, '求简历');
|
|
168
|
+
const availability = (await page.evaluate(`(() => {
|
|
169
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "");
|
|
170
|
+
const items = Array.from(
|
|
171
|
+
document.querySelectorAll(".operate-exchange-left .operate-icon-item, .operate-icon-item"),
|
|
172
|
+
);
|
|
173
|
+
const target = items.find((el) => norm(el.querySelector(".operate-btn")?.textContent).includes("求简历"));
|
|
174
|
+
if (!target) return { found: false, available: false };
|
|
175
|
+
const btn = target.querySelector(".operate-btn");
|
|
176
|
+
const className = [target.className ?? "", btn?.className ?? ""].join(" ");
|
|
177
|
+
const disabled = /disabled|forbid|ban/i.test(className) || btn?.getAttribute("disabled") !== null;
|
|
178
|
+
return { found: true, available: !disabled };
|
|
179
|
+
})()`));
|
|
180
|
+
if (!availability.found) {
|
|
181
|
+
throw new Error('未找到「求简历」按钮,当前页面可能不支持该操作。');
|
|
182
|
+
}
|
|
183
|
+
if (!availability.available) {
|
|
184
|
+
throw new Error('当前「求简历」不可用。Boss 要求双方各至少发送一条消息后才可以向对方请求附件简历,请先与对方互发消息后再试。');
|
|
185
|
+
}
|
|
186
|
+
await sleepRandom(220, 620);
|
|
187
|
+
const clicked = (await page.evaluate(`(() => {
|
|
188
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "");
|
|
189
|
+
const items = Array.from(
|
|
190
|
+
document.querySelectorAll(".operate-exchange-left .operate-icon-item, .operate-icon-item"),
|
|
191
|
+
);
|
|
192
|
+
const target = items.find((el) => norm(el.querySelector(".operate-btn")?.textContent).includes("求简历"));
|
|
193
|
+
if (!target) return false;
|
|
194
|
+
const btn = target.querySelector(".operate-btn");
|
|
195
|
+
const host = btn instanceof HTMLElement ? btn : target;
|
|
196
|
+
host.scrollIntoView({ block: "center", inline: "nearest" });
|
|
197
|
+
host.click();
|
|
198
|
+
return true;
|
|
199
|
+
})()`));
|
|
200
|
+
if (!clicked) {
|
|
201
|
+
throw new Error('点击「求简历」失败,请确认当前会话是否仍处于可操作状态。');
|
|
202
|
+
}
|
|
203
|
+
await sleepRandom(280, 520);
|
|
204
|
+
await page.waitForFunction(`(() => {
|
|
205
|
+
function isVisible(el) {
|
|
206
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
207
|
+
const st = window.getComputedStyle(el);
|
|
208
|
+
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
209
|
+
const r = el.getBoundingClientRect();
|
|
210
|
+
return r.width > 0 && r.height > 0;
|
|
211
|
+
}
|
|
212
|
+
const tips = Array.from(document.querySelectorAll(".exchange-tooltip"));
|
|
213
|
+
for (const tip of tips) {
|
|
214
|
+
if (!isVisible(tip)) continue;
|
|
215
|
+
const raw = (tip.textContent ?? "").replace(/\\s+/g, "");
|
|
216
|
+
if (!raw.includes("索取简历")) continue;
|
|
217
|
+
const primary = tip.querySelector(".btn-box .boss-btn-primary");
|
|
218
|
+
return primary instanceof HTMLElement;
|
|
219
|
+
}
|
|
220
|
+
return false;
|
|
221
|
+
})()`, { timeout: 12_000 });
|
|
222
|
+
const confirmed = (await page.evaluate(`(() => {
|
|
223
|
+
function isVisible(el) {
|
|
224
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
225
|
+
const st = window.getComputedStyle(el);
|
|
226
|
+
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
227
|
+
const r = el.getBoundingClientRect();
|
|
228
|
+
return r.width > 0 && r.height > 0;
|
|
229
|
+
}
|
|
230
|
+
function norm(v) {
|
|
231
|
+
return (v ?? "").replace(/\\s+/g, "").trim();
|
|
232
|
+
}
|
|
233
|
+
const tips = Array.from(document.querySelectorAll(".exchange-tooltip"));
|
|
234
|
+
for (const tip of tips) {
|
|
235
|
+
if (!isVisible(tip)) continue;
|
|
236
|
+
if (!norm(tip.textContent).includes("索取简历")) continue;
|
|
237
|
+
const primary = tip.querySelector(".btn-box .boss-btn-primary.boss-btn, .btn-box .boss-btn-primary");
|
|
238
|
+
if (!(primary instanceof HTMLElement)) continue;
|
|
239
|
+
if (!norm(primary.textContent).includes("确定")) continue;
|
|
240
|
+
primary.scrollIntoView({ block: "center", inline: "nearest" });
|
|
241
|
+
primary.click();
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
return false;
|
|
245
|
+
})()`));
|
|
246
|
+
if (!confirmed) {
|
|
247
|
+
throw new Error('已弹出求简历确认框,但未点到「确定」按钮。');
|
|
248
|
+
}
|
|
249
|
+
await sleepRandom(320, 780);
|
|
250
|
+
return '已点击「求简历」并在弹窗中确认(将发送默认话术「方便发一份你的简历过来吗?」)。';
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* 在聊天页通过「更多 -> 备注」更新候选人备注,并点击确认保存。
|
|
254
|
+
*/
|
|
255
|
+
async function updateCandidateRemark(page, remarkText) {
|
|
256
|
+
const nextRemark = remarkText.trim();
|
|
257
|
+
if (!nextRemark) {
|
|
258
|
+
throw new Error('备注内容不能为空。');
|
|
259
|
+
}
|
|
260
|
+
if (nextRemark.length > 120) {
|
|
261
|
+
throw new Error(`备注内容过长(${nextRemark.length}/120),请缩短后重试。`);
|
|
262
|
+
}
|
|
263
|
+
await ensureInCandidateChat(page, '备注');
|
|
264
|
+
const openedMoreMenu = (await page.evaluate(`(() => {
|
|
265
|
+
function isVisible(el) {
|
|
266
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
267
|
+
const st = window.getComputedStyle(el);
|
|
268
|
+
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
269
|
+
const r = el.getBoundingClientRect();
|
|
270
|
+
return r.width > 0 && r.height > 0;
|
|
271
|
+
}
|
|
272
|
+
const popovers = Array.from(document.querySelectorAll(".rightbar-item .popover"))
|
|
273
|
+
.filter((el) => !!el.querySelector(".popover-wrap.rightbar-more-tooltip"));
|
|
274
|
+
if (popovers.length === 0) return false;
|
|
275
|
+
const popover = popovers[popovers.length - 1];
|
|
276
|
+
const host = popover.querySelector(".icon") || popover;
|
|
277
|
+
host.scrollIntoView({ block: "center", inline: "nearest" });
|
|
278
|
+
host.click();
|
|
279
|
+
const wrap = popover.querySelector(".popover-wrap.rightbar-more-tooltip");
|
|
280
|
+
return !!wrap && isVisible(wrap);
|
|
281
|
+
})()`));
|
|
282
|
+
if (!openedMoreMenu) {
|
|
283
|
+
throw new Error('未找到右侧“更多”按钮(rightbar-more),无法打开备注菜单。');
|
|
284
|
+
}
|
|
285
|
+
await sleepRandom(120, 300);
|
|
286
|
+
const clickedRemarkItem = (await page.evaluate(`(() => {
|
|
287
|
+
function norm(v) {
|
|
288
|
+
return (v ?? "").replace(/\\s+/g, "").trim();
|
|
289
|
+
}
|
|
290
|
+
function isVisible(el) {
|
|
291
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
292
|
+
const st = window.getComputedStyle(el);
|
|
293
|
+
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
294
|
+
const r = el.getBoundingClientRect();
|
|
295
|
+
return r.width > 0 && r.height > 0;
|
|
296
|
+
}
|
|
297
|
+
const wraps = Array.from(document.querySelectorAll(".popover-wrap.rightbar-more-tooltip"))
|
|
298
|
+
.filter((el) => isVisible(el));
|
|
299
|
+
if (wraps.length === 0) return false;
|
|
300
|
+
const wrap = wraps[wraps.length - 1];
|
|
301
|
+
const items = Array.from(wrap.querySelectorAll(".more-list .item"))
|
|
302
|
+
.filter((el) => isVisible(el));
|
|
303
|
+
const remark = items.find((el) => norm(el.textContent).includes("备注"));
|
|
304
|
+
if (!remark) return false;
|
|
305
|
+
remark.scrollIntoView({ block: "center", inline: "nearest" });
|
|
306
|
+
remark.click();
|
|
307
|
+
return true;
|
|
308
|
+
})()`));
|
|
309
|
+
if (!clickedRemarkItem) {
|
|
310
|
+
throw new Error('未找到“备注”菜单项,无法打开备注弹窗。');
|
|
311
|
+
}
|
|
312
|
+
const textareaSel = '.boss-dialog__wrapper.dialog-default-v2 .dialog-geek-remark textarea.input, ' +
|
|
313
|
+
'.boss-popup__wrapper.dialog-default-v2 .dialog-geek-remark textarea.input';
|
|
314
|
+
const textarea = await page.waitForSelector(textareaSel, { timeout: 12_000 }).catch(() => null);
|
|
315
|
+
if (!textarea) {
|
|
316
|
+
throw new Error('已点击“备注”,但未出现备注输入弹窗。');
|
|
317
|
+
}
|
|
318
|
+
await sleepRandom(260, 520);
|
|
319
|
+
await page.click(textareaSel);
|
|
320
|
+
await sleepRandom(80, 180);
|
|
321
|
+
const selectAllMod = selectAllModifierKey();
|
|
322
|
+
await page.keyboard.down(selectAllMod);
|
|
323
|
+
await page.keyboard.press('KeyA');
|
|
324
|
+
await page.keyboard.up(selectAllMod);
|
|
325
|
+
await sleepRandom(50, 140);
|
|
326
|
+
await page.keyboard.press('Backspace');
|
|
327
|
+
await sleepRandom(120, 260);
|
|
328
|
+
await page.type(textareaSel, nextRemark, { delay: 24 });
|
|
329
|
+
await sleepRandom(200, 360);
|
|
330
|
+
const filledOk = (await page.evaluate(`((selector, expected) => {
|
|
331
|
+
const el = document.querySelector(selector);
|
|
332
|
+
if (!(el instanceof HTMLTextAreaElement)) return false;
|
|
333
|
+
return (el.value ?? "").trim() === expected;
|
|
334
|
+
})`, textareaSel, nextRemark));
|
|
335
|
+
if (!filledOk) {
|
|
336
|
+
throw new Error('备注输入未生效,请重试。');
|
|
337
|
+
}
|
|
338
|
+
const confirmed = (await page.evaluate(`(() => {
|
|
339
|
+
function norm(v) {
|
|
340
|
+
return (v ?? "").replace(/\\s+/g, "").trim();
|
|
341
|
+
}
|
|
342
|
+
function isVisible(el) {
|
|
343
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
344
|
+
const st = window.getComputedStyle(el);
|
|
345
|
+
if (st.display === "none" || st.visibility === "hidden") return false;
|
|
346
|
+
const r = el.getBoundingClientRect();
|
|
347
|
+
return r.width > 0 && r.height > 0;
|
|
348
|
+
}
|
|
349
|
+
const wrappers = Array.from(document.querySelectorAll(".dialog-default-v2"))
|
|
350
|
+
.filter((el) => isVisible(el) && !!el.querySelector(".dialog-geek-remark"));
|
|
351
|
+
if (wrappers.length === 0) return false;
|
|
352
|
+
const wrapper = wrappers[wrappers.length - 1];
|
|
353
|
+
const buttons = Array.from(wrapper.querySelectorAll(".boss-dialog__footer .boss-dialog__button, .boss-btn"))
|
|
354
|
+
.filter((el) => isVisible(el));
|
|
355
|
+
const confirmBtn = buttons.find((el) => norm(el.textContent).includes("确认"));
|
|
356
|
+
if (!confirmBtn) return false;
|
|
357
|
+
confirmBtn.scrollIntoView({ block: "center", inline: "nearest" });
|
|
358
|
+
confirmBtn.click();
|
|
359
|
+
return true;
|
|
360
|
+
})()`));
|
|
361
|
+
if (!confirmed) {
|
|
362
|
+
throw new Error('已填写备注,但未找到“确认”按钮。');
|
|
363
|
+
}
|
|
364
|
+
await sleepRandom(220, 580);
|
|
365
|
+
return `已更新备注: ${nextRemark}`;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* 对方「附件简历」确认卡片上点击「同意」。
|
|
369
|
+
* 对应按钮 disabled 时视为已处理。
|
|
370
|
+
*/
|
|
371
|
+
async function runIncomingResumeCardAction(page, which) {
|
|
372
|
+
await ensureInCandidateChat(page, '附件简历处理');
|
|
373
|
+
await sleepRandom(200, 550);
|
|
374
|
+
const result = (await page.evaluate((w) => {
|
|
375
|
+
function norm(v) {
|
|
376
|
+
return (v ?? "").replace(/\\s+/g, " ").trim();
|
|
377
|
+
}
|
|
378
|
+
function isDisabledBtn(el) {
|
|
379
|
+
const cls = el.className ?? "";
|
|
380
|
+
if (/disabled|forbid|ban/i.test(cls))
|
|
381
|
+
return true;
|
|
382
|
+
if (el.getAttribute("disabled") !== null)
|
|
383
|
+
return true;
|
|
384
|
+
const st = window.getComputedStyle(el);
|
|
385
|
+
return st.pointerEvents === "none" || Number(st.opacity) < 0.35;
|
|
386
|
+
}
|
|
387
|
+
function matchesLabel(t, mode) {
|
|
388
|
+
if (mode === "agree") {
|
|
389
|
+
return t === "同意" || t.indexOf("同意") === 0;
|
|
390
|
+
}
|
|
391
|
+
return t === "拒绝" || t.indexOf("拒绝") === 0;
|
|
392
|
+
}
|
|
393
|
+
const items = Array.from(document.querySelectorAll(".chat-message-list .message-item"));
|
|
394
|
+
for (let i = items.length - 1; i >= 0; i--) {
|
|
395
|
+
const friend = items[i].querySelector(".item-friend");
|
|
396
|
+
if (!friend)
|
|
397
|
+
continue;
|
|
398
|
+
const title = norm(friend.querySelector(".message-card-top-title")?.textContent);
|
|
399
|
+
if (!title || title.indexOf("附件简历") === -1)
|
|
400
|
+
continue;
|
|
401
|
+
const buttons = friend.querySelectorAll(".message-card-buttons .card-btn");
|
|
402
|
+
for (let j = 0; j < buttons.length; j++) {
|
|
403
|
+
const btn = buttons[j];
|
|
404
|
+
const t = norm(btn.textContent);
|
|
405
|
+
if (!matchesLabel(t, w))
|
|
406
|
+
continue;
|
|
407
|
+
if (isDisabledBtn(btn)) {
|
|
408
|
+
return { kind: "already_handled", which: w };
|
|
409
|
+
}
|
|
410
|
+
btn.scrollIntoView({ block: "center", inline: "nearest" });
|
|
411
|
+
btn.click();
|
|
412
|
+
return { kind: "clicked", which: w };
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return { kind: "not_found", which: w };
|
|
416
|
+
}, which));
|
|
417
|
+
if (result.kind === 'not_found') {
|
|
418
|
+
throw new Error('未找到待处理的「对方发送附件简历」确认卡片(标题需含「附件简历」)。');
|
|
419
|
+
}
|
|
420
|
+
if (result.kind === 'already_handled') {
|
|
421
|
+
return result.which === 'agree'
|
|
422
|
+
? '对方发来的附件简历请求已处理(同意按钮已禁用)。'
|
|
423
|
+
: '对方发来的附件简历请求已处理(拒绝按钮已禁用)。';
|
|
424
|
+
}
|
|
425
|
+
await sleepRandom(350, 900);
|
|
426
|
+
return result.which === 'agree'
|
|
427
|
+
? '已点击「同意」,接受对方发送的附件简历。'
|
|
428
|
+
: '已点击「拒绝」,拒绝接收对方附件简历。';
|
|
429
|
+
}
|
|
430
|
+
async function getCandidateLabelForResumeShot(page) {
|
|
431
|
+
const name = (await page.evaluate(`(() => {
|
|
432
|
+
const node = document.querySelector(".base-info-single-container .name-box");
|
|
433
|
+
const text = node?.textContent ?? "";
|
|
434
|
+
return text.replace(/\\s+/g, " ").trim();
|
|
435
|
+
})()`));
|
|
436
|
+
return name || 'candidate';
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* 点击「在线简历」,对 `iframe` 元素整框截图(含视口外部分,见 `captureBeyondViewport`)。
|
|
440
|
+
* 不依赖 `contentFrame()`,与内页是否 canvas / 跨域无关。
|
|
441
|
+
*
|
|
442
|
+
* 进入前记录视口(`snapshotBossPageViewport`,见 {@link captureCResumeIframeToFile})。
|
|
443
|
+
*/
|
|
444
|
+
async function captureOnlineResumeScreenshot(page, candidateLabel) {
|
|
445
|
+
ensureAppDataLayout();
|
|
446
|
+
const savedViewport = await snapshotBossPageViewport(page);
|
|
447
|
+
const opened = await page.evaluate(() => {
|
|
448
|
+
const a = document.querySelector('a.resume-btn-online');
|
|
449
|
+
if (!a || a.classList.contains('disabled'))
|
|
450
|
+
return false;
|
|
451
|
+
a.scrollIntoView({ block: 'center', inline: 'nearest' });
|
|
452
|
+
a.click();
|
|
453
|
+
return true;
|
|
454
|
+
});
|
|
455
|
+
if (!opened) {
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
const outcome = await waitForCResumeIframeOrPaywall(page, ONLINE_RESUME_IFRAME_WAIT_MAX_MS);
|
|
459
|
+
if (outcome !== 'iframe') {
|
|
460
|
+
const paywall = await describeBossPaywallPopupIfPresent(page);
|
|
461
|
+
await closeBossPaywallPopupIfPresent(page);
|
|
462
|
+
if (paywall) {
|
|
463
|
+
throw new Error(paywall);
|
|
464
|
+
}
|
|
465
|
+
return null;
|
|
466
|
+
}
|
|
467
|
+
const ready = await waitForVisibleCResumeIframeReady(page);
|
|
468
|
+
if (!ready) {
|
|
469
|
+
await closeCResumePanel(page);
|
|
470
|
+
return null;
|
|
471
|
+
}
|
|
472
|
+
const fileName = `online-resume-${safeResumeScreenshotFileBase(candidateLabel)}-${Date.now()}.png`;
|
|
473
|
+
const absPath = join(RESUME_SCREENSHOTS_DIR, fileName);
|
|
474
|
+
const ok = await captureCResumeIframeToFile(page, savedViewport, absPath);
|
|
475
|
+
if (!ok) {
|
|
476
|
+
await closeCResumePanel(page);
|
|
477
|
+
return null;
|
|
478
|
+
}
|
|
479
|
+
return absPath;
|
|
480
|
+
}
|
|
481
|
+
export async function runChatActionOnCurrentConversation(page, options) {
|
|
482
|
+
const action = options.action;
|
|
483
|
+
switch (action) {
|
|
484
|
+
case 'not-fit':
|
|
485
|
+
return markCandidateNotFitWithoutReason(page);
|
|
486
|
+
case 'remark':
|
|
487
|
+
return updateCandidateRemark(page, options.remark ?? '');
|
|
488
|
+
case 'resume': {
|
|
489
|
+
await ensureInCandidateChat(page, '在线简历');
|
|
490
|
+
const candidateLabel = await getCandidateLabelForResumeShot(page);
|
|
491
|
+
const resumeShotPath = await captureOnlineResumeScreenshot(page, candidateLabel);
|
|
492
|
+
if (resumeShotPath === null) {
|
|
493
|
+
throw new Error('未找到在线简历入口,或在线简历弹层未正常出现。');
|
|
494
|
+
}
|
|
495
|
+
if (!isResumeOcrEnabled()) {
|
|
496
|
+
return `在线简历操作成功,截图文件:${resumeShotPath}`;
|
|
497
|
+
}
|
|
498
|
+
try {
|
|
499
|
+
const ocr = await ocrResumePngToTextFile(resumeShotPath);
|
|
500
|
+
return `在线简历操作成功,\n在线简历 OCR 正文:\n\n${ocr.text}`;
|
|
501
|
+
}
|
|
502
|
+
catch (e) {
|
|
503
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
504
|
+
throw new Error(`在线简历截图成功,但 OCR 失败:${msg}`);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
case 'agree-resume':
|
|
508
|
+
return runIncomingResumeCardAction(page, 'agree');
|
|
509
|
+
case 'request-attachment-resume':
|
|
510
|
+
return runRequestAttachmentResume(page);
|
|
511
|
+
case 'exchange-wechat':
|
|
512
|
+
return runExchangeWechat(page);
|
|
513
|
+
case 'history':
|
|
514
|
+
return runGetCommunicationHistory(page);
|
|
515
|
+
default: {
|
|
516
|
+
const _x = action;
|
|
517
|
+
throw new Error(`未知的 chat action: ${String(_x)}`);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
//# sourceMappingURL=action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/toolset/action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baidu_credentials.d.ts","sourceRoot":"","sources":["../../src/toolset/baidu_credentials.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAiBjF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getUserEnvPathForBaidu, writeBaiduCredentialsToUserEnv } from '../common/baidu_user_env.js';
|
|
2
|
+
import { clearBaiduTokenCache } from '../ocr/baidu_ocr.js';
|
|
3
|
+
/**
|
|
4
|
+
* 隐藏命令:将百度 OCR 的 API Key / Secret 写入 ~/.boss-cli/.env,并更新当前进程环境变量。
|
|
5
|
+
*/
|
|
6
|
+
export function implSetBaiduCredentials(apiKey, secretKey) {
|
|
7
|
+
const ak = apiKey.trim();
|
|
8
|
+
const sk = secretKey.trim();
|
|
9
|
+
if (!ak || !sk) {
|
|
10
|
+
throw new Error('API Key 与 Secret Key 均不能为空。');
|
|
11
|
+
}
|
|
12
|
+
writeBaiduCredentialsToUserEnv(ak, sk);
|
|
13
|
+
process.env.BOSS_BAIDU_API_KEY = ak;
|
|
14
|
+
process.env.BOSS_BAIDU_SECRET_KEY = sk;
|
|
15
|
+
clearBaiduTokenCache();
|
|
16
|
+
const path = getUserEnvPathForBaidu();
|
|
17
|
+
return [
|
|
18
|
+
'已保存百度 OCR 凭证。',
|
|
19
|
+
`文件:${path}`,
|
|
20
|
+
'当前进程已生效;新开终端或下次启动 boss 时会自动读取。',
|
|
21
|
+
'若当前工作目录下存在 .env 且含 BOSS_BAIDU_* 或 API_KEY/SECRET_KEY,加载顺序为:用户配置先、项目 .env 后(后者可覆盖)。',
|
|
22
|
+
].join('\n');
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=baidu_credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baidu_credentials.js","sourceRoot":"","sources":["../../src/toolset/baidu_credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AACrG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAc,EAAE,SAAiB;IACvE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,8BAA8B,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,EAAE,CAAC;IACvC,oBAAoB,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;IACtC,OAAO;QACL,eAAe;QACf,MAAM,IAAI,EAAE;QACZ,gCAAgC;QAChC,oFAAoF;KACrF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
export declare function runGetCommunicationHistory(page: Page): Promise<string>;
|
|
3
|
+
export declare function runOpenCandidateChatByIndex(page: Page, params: {
|
|
4
|
+
index: number;
|
|
5
|
+
filter?: 'all' | 'unread';
|
|
6
|
+
expectedName?: string;
|
|
7
|
+
exact?: boolean;
|
|
8
|
+
}): Promise<string>;
|
|
9
|
+
export declare function runOpenCandidateChat(page: Page, candidateName: string, exact?: boolean): Promise<string>;
|
|
10
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/toolset/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAwK3C,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB5E;AA+SD,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,IAAI,EACV,MAAM,EAAE;IACN,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,MAAM,CAAC,CA0DjB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,UAAO,GACX,OAAO,CAAC,MAAM,CAAC,CAuUjB"}
|