@joohw/boss-cli 0.1.7 → 0.1.9
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 +25 -25
- package/README.md +36 -16
- package/dist/browser/agent_operating_indicator.d.ts +9 -0
- package/dist/browser/agent_operating_indicator.d.ts.map +1 -0
- package/dist/browser/agent_operating_indicator.js +92 -0
- package/dist/browser/agent_operating_indicator.js.map +1 -0
- package/dist/browser/c_resume_capture.d.ts +11 -0
- package/dist/browser/c_resume_capture.d.ts.map +1 -0
- package/dist/browser/c_resume_capture.js +76 -0
- package/dist/browser/c_resume_capture.js.map +1 -0
- package/dist/browser/chat.d.ts +3 -3
- package/dist/browser/chat.d.ts.map +1 -1
- package/dist/browser/chat.js +20 -4
- package/dist/browser/chat.js.map +1 -1
- package/dist/browser/human_delay.d.ts +5 -0
- package/dist/browser/human_delay.d.ts.map +1 -1
- package/dist/browser/human_delay.js +5 -0
- package/dist/browser/human_delay.js.map +1 -1
- package/dist/browser/index.d.ts +3 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +3 -1
- package/dist/browser/index.js.map +1 -1
- 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 +1 -1
- package/dist/cli/banner.d.ts.map +1 -1
- package/dist/cli/banner.js +40 -1
- package/dist/cli/banner.js.map +1 -1
- package/dist/cli/cliRouter.d.ts.map +1 -1
- package/dist/cli/cliRouter.js +116 -59
- package/dist/cli/cliRouter.js.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/version.d.ts +7 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +59 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/common/boss_paywall_popup.d.ts +16 -0
- package/dist/common/boss_paywall_popup.d.ts.map +1 -0
- package/dist/common/boss_paywall_popup.js +140 -0
- package/dist/common/boss_paywall_popup.js.map +1 -0
- package/dist/common/boss_sidebar_nav.d.ts +6 -0
- package/dist/common/boss_sidebar_nav.d.ts.map +1 -0
- package/dist/common/boss_sidebar_nav.js +37 -0
- package/dist/common/boss_sidebar_nav.js.map +1 -0
- package/dist/common/c_resume_capture.d.ts +11 -0
- package/dist/common/c_resume_capture.d.ts.map +1 -0
- package/dist/common/c_resume_capture.js +76 -0
- package/dist/common/c_resume_capture.js.map +1 -0
- package/dist/toolset/action.d.ts +1 -1
- package/dist/toolset/action.d.ts.map +1 -1
- package/dist/toolset/action.js +311 -228
- package/dist/toolset/action.js.map +1 -1
- package/dist/toolset/c_resume_capture.d.ts +11 -0
- package/dist/toolset/c_resume_capture.d.ts.map +1 -0
- package/dist/toolset/c_resume_capture.js +76 -0
- package/dist/toolset/c_resume_capture.js.map +1 -0
- package/dist/toolset/chat.d.ts.map +1 -1
- package/dist/toolset/chat.js +4 -3
- package/dist/toolset/chat.js.map +1 -1
- package/dist/toolset/deep-search.d.ts +24 -0
- package/dist/toolset/deep-search.d.ts.map +1 -0
- package/dist/toolset/deep-search.js +1039 -0
- package/dist/toolset/deep-search.js.map +1 -0
- package/dist/toolset/greet.d.ts +2 -0
- package/dist/toolset/greet.d.ts.map +1 -0
- package/dist/toolset/greet.js +47 -0
- package/dist/toolset/greet.js.map +1 -0
- package/dist/toolset/index.d.ts +15 -5
- package/dist/toolset/index.d.ts.map +1 -1
- package/dist/toolset/index.js +19 -10
- package/dist/toolset/index.js.map +1 -1
- package/dist/toolset/jd.d.ts.map +1 -1
- package/dist/toolset/jd.js +29 -35
- package/dist/toolset/jd.js.map +1 -1
- package/dist/toolset/list.d.ts +6 -0
- package/dist/toolset/list.d.ts.map +1 -1
- package/dist/toolset/list.js +36 -60
- package/dist/toolset/list.js.map +1 -1
- package/dist/toolset/login.d.ts.map +1 -1
- package/dist/toolset/login.js +2 -5
- package/dist/toolset/login.js.map +1 -1
- package/dist/toolset/recommend.d.ts +34 -0
- package/dist/toolset/recommend.d.ts.map +1 -0
- package/dist/toolset/recommend.js +445 -0
- package/dist/toolset/recommend.js.map +1 -0
- package/dist/toolset/recommend_greet.d.ts +2 -0
- package/dist/toolset/recommend_greet.d.ts.map +1 -0
- package/dist/toolset/recommend_greet.js +27 -0
- package/dist/toolset/recommend_greet.js.map +1 -0
- package/dist/toolset/search.d.ts +23 -1
- package/dist/toolset/search.d.ts.map +1 -1
- package/dist/toolset/search.js +556 -48
- package/dist/toolset/search.js.map +1 -1
- package/dist/toolset/send.d.ts +0 -6
- package/dist/toolset/send.d.ts.map +1 -1
- package/dist/toolset/send.js +22 -190
- package/dist/toolset/send.js.map +1 -1
- package/package.json +2 -2
- package/skills/README.md +0 -11
- package/skills/boss-cli/SKILL.md +0 -58
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/toolset/login.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/toolset/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Frame, Page } from 'puppeteer-core';
|
|
2
|
+
export type RecommendCandidate = {
|
|
3
|
+
geekId: string;
|
|
4
|
+
name: string;
|
|
5
|
+
salary: string;
|
|
6
|
+
baseInfo: string;
|
|
7
|
+
expect: string;
|
|
8
|
+
experience: string;
|
|
9
|
+
advantage: string;
|
|
10
|
+
highlights: string[];
|
|
11
|
+
canGreet: boolean;
|
|
12
|
+
hasHistoryChat: boolean;
|
|
13
|
+
/** 卡片为灰色「已看过」样式(如 `.candidate-card-wrap.has-viewed` / `.card-inner.has-viewed`) */
|
|
14
|
+
hasViewed: boolean;
|
|
15
|
+
};
|
|
16
|
+
export declare function isBossChatRecommendUrl(url: string): boolean;
|
|
17
|
+
export declare function ensureInRecommendPage(page: Page): Promise<Frame>;
|
|
18
|
+
export declare function readRecommendList(frame: Frame): Promise<RecommendCandidate[]>;
|
|
19
|
+
export declare function renderRecommendList(candidates: RecommendCandidate[]): string;
|
|
20
|
+
export declare function clickGreet(frame: Frame, target: string): Promise<{
|
|
21
|
+
message: string;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function markGreetProduced(before: RecommendCandidate[], after: RecommendCandidate[]): void;
|
|
24
|
+
/**
|
|
25
|
+
* 在推荐 iframe 内根据姓名或序号打开在线简历预览:点击候选人卡片主体 `.card-inner`(与侧栏「打招呼」分离)。
|
|
26
|
+
* 父页随后出现 `c-resume` iframe(如 `source=recommend`)。旧版仅有「在线简历」链接时仍尝试点击链接。
|
|
27
|
+
*/
|
|
28
|
+
export declare function openRecommendResumePreview(frame: Frame, target: string): Promise<boolean>;
|
|
29
|
+
export declare function runRecommendPreview(options: {
|
|
30
|
+
candidateTarget: string;
|
|
31
|
+
jobKeyword?: string;
|
|
32
|
+
}): Promise<string>;
|
|
33
|
+
export declare function runRecommend(jobKeyword?: string): Promise<string>;
|
|
34
|
+
//# sourceMappingURL=recommend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../src/toolset/recommend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA0BlD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;IACxB,mFAAmF;IACnF,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAWF,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAW3D;AAmGD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAWtE;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAmEnF;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAkD5E;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA0E9B;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,EAAE,EAC5B,KAAK,EAAE,kBAAkB,EAAE,GAC1B,IAAI,CAON;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAqD/F;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsDlB;AAED,wBAAsB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBvE"}
|
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { createWaitManualLoginRequiredText, ONLINE_RESUME_IFRAME_APPEAR_MS, ONLINE_RESUME_IFRAME_SETTLE_MS, ONLINE_RESUME_IFRAME_WAIT_MAX_MS, sleepRandom, snapshotBossPageViewport, withBossSessionPage, } from '../browser/index.js';
|
|
3
|
+
import { clickBossSidebarMenuToPath } from '../common/boss_sidebar_nav.js';
|
|
4
|
+
import { closeBossPaywallPopupIfPresent, describeBossPaywallPopupIfPresent, waitForCResumeIframeOrPaywall, } from '../common/boss_paywall_popup.js';
|
|
5
|
+
import { captureCResumeIframeToFile, closeCResumePanel, safeResumeScreenshotFileBase, } from '../common/c_resume_capture.js';
|
|
6
|
+
import { ensureAppDataLayout, RESUME_SCREENSHOTS_DIR } from '../config.js';
|
|
7
|
+
const BOSS_CHAT_RECOMMEND_URL = 'https://www.zhipin.com/web/chat/recommend';
|
|
8
|
+
const RECOMMEND_SETTLE_MS = { min: 1400, max: 2400 };
|
|
9
|
+
/** 会话内记录:通过 greet 新出现的推荐卡片(以 geekId 识别) */
|
|
10
|
+
const sessionGreetProducedGeekIds = new Set();
|
|
11
|
+
/**
|
|
12
|
+
* 推荐列表里「一张候选人卡片」的根节点(新版 `.candidate-card-wrap` 与旧版 `.card-item` / `.geek-card` 并存)。
|
|
13
|
+
* 在线简历预览:点击卡片主体 `.card-inner`,而非「在线简历」链接或「打招呼」。
|
|
14
|
+
*/
|
|
15
|
+
const RECOMMEND_CARD_ROOT_SELECTOR = '.candidate-card-wrap, .card-list .card-item, .geek-list .geek-card';
|
|
16
|
+
export function isBossChatRecommendUrl(url) {
|
|
17
|
+
try {
|
|
18
|
+
const u = new URL(url);
|
|
19
|
+
if (!u.hostname.includes('zhipin.com')) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
const p = u.pathname.replace(/\/+$/, '') || '/';
|
|
23
|
+
return p === '/web/chat/recommend';
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function getRecommendFrame(page) {
|
|
30
|
+
await page.waitForSelector('iframe[name="recommendFrame"]', { timeout: 15_000 });
|
|
31
|
+
const frameByName = page.frames().find((f) => f.name() === 'recommendFrame') ?? null;
|
|
32
|
+
if (frameByName) {
|
|
33
|
+
return frameByName;
|
|
34
|
+
}
|
|
35
|
+
const frameByUrl = page.frames().find((f) => {
|
|
36
|
+
try {
|
|
37
|
+
return f.url().includes('/web/frame/recommend');
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}) ?? null;
|
|
43
|
+
if (frameByUrl) {
|
|
44
|
+
return frameByUrl;
|
|
45
|
+
}
|
|
46
|
+
throw new Error('已检测到推荐 iframe,但无法获取其页面上下文(recommendFrame)。');
|
|
47
|
+
}
|
|
48
|
+
async function ensureRecommendFrameReady(frame) {
|
|
49
|
+
await frame.waitForFunction(`(() => {
|
|
50
|
+
const sel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
51
|
+
if (document.querySelector(sel)) return true;
|
|
52
|
+
const root = document.querySelector(".card-list, .geek-list-wrap .geek-list");
|
|
53
|
+
return !!root;
|
|
54
|
+
})()`, { timeout: 15_000 });
|
|
55
|
+
}
|
|
56
|
+
async function readCurrentRecommendJobLabel(frame) {
|
|
57
|
+
return (await frame.evaluate(`(() => {
|
|
58
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
59
|
+
return norm(document.querySelector(".job-selecter-wrap .ui-dropmenu-label")?.textContent);
|
|
60
|
+
})()`));
|
|
61
|
+
}
|
|
62
|
+
async function selectRecommendJob(frame, keyword) {
|
|
63
|
+
const kw = keyword.trim();
|
|
64
|
+
if (!kw) {
|
|
65
|
+
return readCurrentRecommendJobLabel(frame);
|
|
66
|
+
}
|
|
67
|
+
const kwLiteral = JSON.stringify(kw);
|
|
68
|
+
const opened = (await frame.evaluate(`(() => {
|
|
69
|
+
const host = document.querySelector(".job-selecter-wrap .ui-dropmenu-label");
|
|
70
|
+
if (!(host instanceof HTMLElement)) return false;
|
|
71
|
+
host.scrollIntoView({ block: "center", inline: "nearest" });
|
|
72
|
+
host.click();
|
|
73
|
+
return true;
|
|
74
|
+
})()`));
|
|
75
|
+
if (!opened) {
|
|
76
|
+
throw new Error('未找到岗位下拉入口(.job-selecter-wrap .ui-dropmenu-label)。');
|
|
77
|
+
}
|
|
78
|
+
await sleepRandom(380, 820);
|
|
79
|
+
const searched = (await frame.evaluate(`(() => {
|
|
80
|
+
const kw = ${kwLiteral};
|
|
81
|
+
const input = document.querySelector(".job-selecter-options .top-chat-search .chat-job-search");
|
|
82
|
+
if (!(input instanceof HTMLInputElement)) return false;
|
|
83
|
+
input.focus();
|
|
84
|
+
input.value = kw;
|
|
85
|
+
input.dispatchEvent(new Event("input", { bubbles: true }));
|
|
86
|
+
input.dispatchEvent(new Event("change", { bubbles: true }));
|
|
87
|
+
return true;
|
|
88
|
+
})()`));
|
|
89
|
+
if (!searched) {
|
|
90
|
+
throw new Error('已打开岗位下拉,但未找到职位搜索框(.chat-job-search)。');
|
|
91
|
+
}
|
|
92
|
+
await sleepRandom(520, 1080);
|
|
93
|
+
const picked = (await frame.evaluate(`(() => {
|
|
94
|
+
const kw = ${kwLiteral};
|
|
95
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, "").trim().toLowerCase();
|
|
96
|
+
const rows = Array.from(document.querySelectorAll(".job-selecter-options .job-list .job-item"));
|
|
97
|
+
if (rows.length === 0) return { ok: false, reason: "empty" };
|
|
98
|
+
const target = rows.find((el) => {
|
|
99
|
+
const label = norm(el.querySelector(".label")?.textContent || el.textContent || "");
|
|
100
|
+
return label.includes(norm(kw));
|
|
101
|
+
});
|
|
102
|
+
if (!(target instanceof HTMLElement)) return { ok: false, reason: "not_found" };
|
|
103
|
+
const label = (target.querySelector(".label")?.textContent ?? target.textContent ?? "")
|
|
104
|
+
.replace(/\\s+/g, " ")
|
|
105
|
+
.trim();
|
|
106
|
+
target.scrollIntoView({ block: "center", inline: "nearest" });
|
|
107
|
+
target.click();
|
|
108
|
+
return { ok: true, label };
|
|
109
|
+
})()`));
|
|
110
|
+
if (!picked.ok) {
|
|
111
|
+
throw new Error(`未找到匹配岗位“${kw}”。`);
|
|
112
|
+
}
|
|
113
|
+
await sleepRandom(900, 1500);
|
|
114
|
+
return picked.label ?? kw;
|
|
115
|
+
}
|
|
116
|
+
export async function ensureInRecommendPage(page) {
|
|
117
|
+
if (!isBossChatRecommendUrl(page.url())) {
|
|
118
|
+
await clickBossSidebarMenuToPath(page, '推荐', '/web/chat/recommend');
|
|
119
|
+
await sleepRandom(RECOMMEND_SETTLE_MS.min, RECOMMEND_SETTLE_MS.max);
|
|
120
|
+
}
|
|
121
|
+
if (!isBossChatRecommendUrl(page.url())) {
|
|
122
|
+
throw new Error('通过侧边栏“推荐”进入页面失败,请确认已登录并可访问 /web/chat/recommend。');
|
|
123
|
+
}
|
|
124
|
+
const frame = await getRecommendFrame(page);
|
|
125
|
+
await ensureRecommendFrameReady(frame);
|
|
126
|
+
return frame;
|
|
127
|
+
}
|
|
128
|
+
export async function readRecommendList(frame) {
|
|
129
|
+
return (await frame.evaluate(`(() => {
|
|
130
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
131
|
+
const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
132
|
+
const cards = Array.from(document.querySelectorAll(cardSel));
|
|
133
|
+
return cards.map((item) => {
|
|
134
|
+
const inner = item.querySelector(".card-inner") || item;
|
|
135
|
+
const wrap = item.matches(".candidate-card-wrap")
|
|
136
|
+
? item
|
|
137
|
+
: item.querySelector(".candidate-card-wrap");
|
|
138
|
+
const hasViewed = Boolean(
|
|
139
|
+
(wrap && wrap.classList.contains("has-viewed")) ||
|
|
140
|
+
(inner && inner.classList.contains("has-viewed")),
|
|
141
|
+
);
|
|
142
|
+
const geekId =
|
|
143
|
+
inner?.getAttribute("data-geekid") ??
|
|
144
|
+
inner?.getAttribute("data-geek") ??
|
|
145
|
+
"";
|
|
146
|
+
const name =
|
|
147
|
+
norm(item.querySelector(".name-wrap .name")?.textContent) ||
|
|
148
|
+
norm(item.querySelector(".name")?.textContent);
|
|
149
|
+
const salary = norm(item.querySelector(".salary-wrap span")?.textContent);
|
|
150
|
+
const baseInfo = Array.from(item.querySelectorAll(".base-info span"))
|
|
151
|
+
.map((el) => norm(el.textContent))
|
|
152
|
+
.filter(Boolean)
|
|
153
|
+
.join(" / ");
|
|
154
|
+
const expect =
|
|
155
|
+
norm(item.querySelector(".expect-wrap .content")?.textContent) ||
|
|
156
|
+
norm(item.querySelector(".expect-wrap .join-text-wrap")?.textContent);
|
|
157
|
+
const experience = norm(item.querySelector(".experience-wrap .join-text-wrap")?.textContent);
|
|
158
|
+
const advantage = norm(item.querySelector(".geek-desc .content")?.textContent);
|
|
159
|
+
const highlightLabels = [
|
|
160
|
+
...Array.from(item.querySelectorAll(".operate .labels .label")),
|
|
161
|
+
...Array.from(item.querySelectorAll(".tags-wrap .tag-item")),
|
|
162
|
+
]
|
|
163
|
+
.map((el) => norm(el.textContent))
|
|
164
|
+
.filter(Boolean);
|
|
165
|
+
const highlights = [...new Set(highlightLabels)];
|
|
166
|
+
const greetBtn = item.querySelector(".button-chat-wrap .btn.btn-greet");
|
|
167
|
+
const btnCls = greetBtn?.className ?? "";
|
|
168
|
+
const disabled =
|
|
169
|
+
!greetBtn ||
|
|
170
|
+
/disabled|forbid|ban/i.test(btnCls) ||
|
|
171
|
+
greetBtn.getAttribute("disabled") !== null;
|
|
172
|
+
const hasHistoryChat = (() => {
|
|
173
|
+
if (item.querySelector(".tooltip-wrap.chat-history .icon-chat-history")) return true;
|
|
174
|
+
const uses = Array.from(item.querySelectorAll("use"));
|
|
175
|
+
return uses.some((u) => {
|
|
176
|
+
const href = u.getAttribute("href") ?? u.getAttributeNS("http://www.w3.org/1999/xlink", "href") ?? "";
|
|
177
|
+
return href.includes("icon-chat-history");
|
|
178
|
+
});
|
|
179
|
+
})();
|
|
180
|
+
return {
|
|
181
|
+
geekId,
|
|
182
|
+
name,
|
|
183
|
+
salary,
|
|
184
|
+
baseInfo,
|
|
185
|
+
expect,
|
|
186
|
+
experience,
|
|
187
|
+
advantage,
|
|
188
|
+
highlights,
|
|
189
|
+
canGreet: !disabled,
|
|
190
|
+
hasHistoryChat,
|
|
191
|
+
hasViewed,
|
|
192
|
+
};
|
|
193
|
+
}).filter((x) => x.name);
|
|
194
|
+
})()`));
|
|
195
|
+
}
|
|
196
|
+
export function renderRecommendList(candidates) {
|
|
197
|
+
if (candidates.length === 0) {
|
|
198
|
+
return '推荐列表为空。';
|
|
199
|
+
}
|
|
200
|
+
const greetProduced = [];
|
|
201
|
+
const normal = [];
|
|
202
|
+
candidates.forEach((c) => {
|
|
203
|
+
if (c.geekId && sessionGreetProducedGeekIds.has(c.geekId)) {
|
|
204
|
+
greetProduced.push(c);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
normal.push(c);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
const renderItems = (title, items) => {
|
|
211
|
+
const lines = [];
|
|
212
|
+
lines.push(`${title}(${items.length})`);
|
|
213
|
+
if (items.length === 0) {
|
|
214
|
+
lines.push(' - 暂无');
|
|
215
|
+
return lines;
|
|
216
|
+
}
|
|
217
|
+
items.forEach((m, idx) => {
|
|
218
|
+
const advantageText = m.advantage ||
|
|
219
|
+
(m.highlights.length > 0 ? m.highlights.slice(0, 3).join(' / ') : '(无)');
|
|
220
|
+
const fields = [
|
|
221
|
+
m.salary ? `薪资:${m.salary}` : '',
|
|
222
|
+
m.baseInfo ? `信息:${m.baseInfo}` : '',
|
|
223
|
+
m.expect ? `期望:${m.expect}` : '',
|
|
224
|
+
m.experience ? `经历:${m.experience}` : '',
|
|
225
|
+
m.hasHistoryChat ? '同事沟通过' : '',
|
|
226
|
+
m.canGreet ? '可打招呼' : '已打招呼',
|
|
227
|
+
]
|
|
228
|
+
.filter(Boolean)
|
|
229
|
+
.join('|');
|
|
230
|
+
const nameWithViewed = m.hasViewed ? `${m.name} | 看过` : m.name;
|
|
231
|
+
lines.push(` - ${idx + 1}. ${nameWithViewed}|${fields}`);
|
|
232
|
+
lines.push(` 优势: ${advantageText}`);
|
|
233
|
+
});
|
|
234
|
+
return lines;
|
|
235
|
+
};
|
|
236
|
+
const out = [];
|
|
237
|
+
out.push(`推荐列表(按来源分组):共 ${candidates.length} 人。`);
|
|
238
|
+
out.push('');
|
|
239
|
+
out.push(...renderItems('常规推荐', normal));
|
|
240
|
+
out.push('');
|
|
241
|
+
out.push(...renderItems('打招呼产生的推荐', greetProduced));
|
|
242
|
+
return out.join('\n');
|
|
243
|
+
}
|
|
244
|
+
export async function clickGreet(frame, target) {
|
|
245
|
+
const targetLiteral = JSON.stringify(target.trim());
|
|
246
|
+
const result = (await frame.evaluate(`(() => {
|
|
247
|
+
const raw = ${targetLiteral};
|
|
248
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
249
|
+
const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
250
|
+
const cards = Array.from(document.querySelectorAll(cardSel));
|
|
251
|
+
if (cards.length === 0) {
|
|
252
|
+
return { kind: "empty" };
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const idxNum = Number.parseInt(raw, 10);
|
|
256
|
+
let targetCard = null;
|
|
257
|
+
if (Number.isFinite(idxNum) && idxNum >= 1 && idxNum <= cards.length) {
|
|
258
|
+
targetCard = cards[idxNum - 1];
|
|
259
|
+
} else {
|
|
260
|
+
targetCard = cards.find((item) => {
|
|
261
|
+
const name =
|
|
262
|
+
norm(item.querySelector(".name-wrap .name")?.textContent) ||
|
|
263
|
+
norm(item.querySelector(".name")?.textContent);
|
|
264
|
+
return name === raw || name.includes(raw);
|
|
265
|
+
}) ?? null;
|
|
266
|
+
}
|
|
267
|
+
if (!targetCard) {
|
|
268
|
+
return { kind: "not_found", target: raw };
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const name =
|
|
272
|
+
norm(targetCard.querySelector(".name-wrap .name")?.textContent) ||
|
|
273
|
+
norm(targetCard.querySelector(".name")?.textContent);
|
|
274
|
+
const inner = targetCard.querySelector(".card-inner") || targetCard;
|
|
275
|
+
const geekId =
|
|
276
|
+
inner?.getAttribute("data-geekid") ??
|
|
277
|
+
inner?.getAttribute("data-geek") ??
|
|
278
|
+
"";
|
|
279
|
+
const btn = targetCard.querySelector(".button-chat-wrap .btn.btn-greet");
|
|
280
|
+
if (!(btn instanceof HTMLElement)) {
|
|
281
|
+
return { kind: "no_btn", name };
|
|
282
|
+
}
|
|
283
|
+
const cls = btn.className ?? "";
|
|
284
|
+
const disabled = /disabled|forbid|ban/i.test(cls) || btn.getAttribute("disabled") !== null;
|
|
285
|
+
if (disabled) {
|
|
286
|
+
return { kind: "disabled", name };
|
|
287
|
+
}
|
|
288
|
+
btn.scrollIntoView({ block: "center", inline: "nearest" });
|
|
289
|
+
btn.click();
|
|
290
|
+
return { kind: "clicked", name, geekId };
|
|
291
|
+
})()`));
|
|
292
|
+
switch (result.kind) {
|
|
293
|
+
case 'empty':
|
|
294
|
+
throw new Error('推荐列表为空,无法执行打招呼。');
|
|
295
|
+
case 'not_found':
|
|
296
|
+
throw new Error(`未在推荐列表中找到目标:${result.target}`);
|
|
297
|
+
case 'no_btn':
|
|
298
|
+
throw new Error(`候选人 ${result.name} 缺少“打招呼”按钮,无法执行。`);
|
|
299
|
+
case 'disabled':
|
|
300
|
+
throw new Error(`候选人 ${result.name} 已打招呼。`);
|
|
301
|
+
case 'clicked':
|
|
302
|
+
return {
|
|
303
|
+
message: `已对 ${result.name} 点击“打招呼”。`,
|
|
304
|
+
};
|
|
305
|
+
default: {
|
|
306
|
+
const _x = result;
|
|
307
|
+
throw new Error(`未知结果:${String(_x)}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
export function markGreetProduced(before, after) {
|
|
312
|
+
const beforeIds = new Set(before.map((x) => x.geekId).filter(Boolean));
|
|
313
|
+
after.forEach((x) => {
|
|
314
|
+
if (x.geekId && !beforeIds.has(x.geekId)) {
|
|
315
|
+
sessionGreetProducedGeekIds.add(x.geekId);
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* 在推荐 iframe 内根据姓名或序号打开在线简历预览:点击候选人卡片主体 `.card-inner`(与侧栏「打招呼」分离)。
|
|
321
|
+
* 父页随后出现 `c-resume` iframe(如 `source=recommend`)。旧版仅有「在线简历」链接时仍尝试点击链接。
|
|
322
|
+
*/
|
|
323
|
+
export async function openRecommendResumePreview(frame, target) {
|
|
324
|
+
const raw = target.trim();
|
|
325
|
+
const targetLiteral = JSON.stringify(raw);
|
|
326
|
+
return (await frame.evaluate(`(() => {
|
|
327
|
+
const raw = ${targetLiteral};
|
|
328
|
+
const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
|
|
329
|
+
const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
|
|
330
|
+
const cards = Array.from(document.querySelectorAll(cardSel));
|
|
331
|
+
if (cards.length === 0) return false;
|
|
332
|
+
const idxNum = Number.parseInt(raw, 10);
|
|
333
|
+
let targetCard = null;
|
|
334
|
+
if (Number.isFinite(idxNum) && idxNum >= 1 && idxNum <= cards.length) {
|
|
335
|
+
targetCard = cards[idxNum - 1];
|
|
336
|
+
} else {
|
|
337
|
+
targetCard = cards.find((item) => {
|
|
338
|
+
const name =
|
|
339
|
+
norm(item.querySelector(".name-wrap .name")?.textContent) ||
|
|
340
|
+
norm(item.querySelector(".name")?.textContent);
|
|
341
|
+
return name === raw || name.includes(raw);
|
|
342
|
+
}) ?? null;
|
|
343
|
+
}
|
|
344
|
+
if (!targetCard) return false;
|
|
345
|
+
|
|
346
|
+
function tryOpen(el) {
|
|
347
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
348
|
+
if (el.classList.contains("disabled")) return false;
|
|
349
|
+
const st = window.getComputedStyle(el);
|
|
350
|
+
if (st.pointerEvents === "none" || Number(st.opacity) < 0.3) return false;
|
|
351
|
+
el.scrollIntoView({ block: "center", inline: "nearest" });
|
|
352
|
+
el.click();
|
|
353
|
+
return true;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
const inner = targetCard.querySelector(".card-inner");
|
|
357
|
+
if (inner instanceof HTMLElement) {
|
|
358
|
+
inner.scrollIntoView({ block: "center", inline: "nearest" });
|
|
359
|
+
inner.click();
|
|
360
|
+
return true;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const resumeOnline = targetCard.querySelector("a.resume-btn-online");
|
|
364
|
+
if (tryOpen(resumeOnline)) return true;
|
|
365
|
+
const hrefResume = targetCard.querySelector('a[href*="c-resume"], a[href*="frame/c-resume"]');
|
|
366
|
+
if (tryOpen(hrefResume)) return true;
|
|
367
|
+
|
|
368
|
+
const links = Array.from(targetCard.querySelectorAll("a, button, .btn")).filter((node) => {
|
|
369
|
+
const t = norm(node.textContent);
|
|
370
|
+
return /在线简历|查看简历|简历预览|预览/.test(t);
|
|
371
|
+
});
|
|
372
|
+
if (links.length > 0 && tryOpen(links[0])) return true;
|
|
373
|
+
|
|
374
|
+
return false;
|
|
375
|
+
})()`));
|
|
376
|
+
}
|
|
377
|
+
export async function runRecommendPreview(options) {
|
|
378
|
+
const target = options.candidateTarget.trim();
|
|
379
|
+
if (!target) {
|
|
380
|
+
throw new Error('请提供候选人姓名或列表序号。');
|
|
381
|
+
}
|
|
382
|
+
try {
|
|
383
|
+
return await withBossSessionPage(async (page) => {
|
|
384
|
+
const frame = await ensureInRecommendPage(page);
|
|
385
|
+
const selectedJob = await selectRecommendJob(frame, (options.jobKeyword ?? '').trim());
|
|
386
|
+
const savedOriginal = await snapshotBossPageViewport(page);
|
|
387
|
+
const opened = await openRecommendResumePreview(frame, target);
|
|
388
|
+
if (!opened) {
|
|
389
|
+
throw new Error('未在推荐列表中找到该候选人,或点击卡片未能打开简历预览。');
|
|
390
|
+
}
|
|
391
|
+
await sleepRandom(ONLINE_RESUME_IFRAME_APPEAR_MS.min, ONLINE_RESUME_IFRAME_APPEAR_MS.max);
|
|
392
|
+
const outcome = await waitForCResumeIframeOrPaywall(page, ONLINE_RESUME_IFRAME_WAIT_MAX_MS);
|
|
393
|
+
if (outcome !== 'iframe') {
|
|
394
|
+
const paywall = await describeBossPaywallPopupIfPresent(page);
|
|
395
|
+
await closeBossPaywallPopupIfPresent(page);
|
|
396
|
+
if (paywall) {
|
|
397
|
+
throw new Error(paywall);
|
|
398
|
+
}
|
|
399
|
+
throw new Error('点击后未出现在线简历 iframe(c-resume)。');
|
|
400
|
+
}
|
|
401
|
+
await sleepRandom(ONLINE_RESUME_IFRAME_SETTLE_MS.min, ONLINE_RESUME_IFRAME_SETTLE_MS.max);
|
|
402
|
+
ensureAppDataLayout();
|
|
403
|
+
const fileName = `recommend-preview-${safeResumeScreenshotFileBase(target)}-${Date.now()}.png`;
|
|
404
|
+
const absPath = join(RESUME_SCREENSHOTS_DIR, fileName);
|
|
405
|
+
const ok = await captureCResumeIframeToFile(page, savedOriginal, absPath);
|
|
406
|
+
if (!ok) {
|
|
407
|
+
await closeCResumePanel(page);
|
|
408
|
+
throw new Error('在线简历 iframe 截图失败。');
|
|
409
|
+
}
|
|
410
|
+
const jobLine = selectedJob ? `当前岗位:${selectedJob}` : '当前岗位:默认';
|
|
411
|
+
return [
|
|
412
|
+
jobLine,
|
|
413
|
+
`推荐在线简历预览截图:${absPath}`,
|
|
414
|
+
'',
|
|
415
|
+
'说明:平台对推荐在线简历的每日可查看次数有限,请按需使用、谨慎查看。',
|
|
416
|
+
].join('\n');
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
catch (e) {
|
|
420
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
421
|
+
if (e instanceof Error && e.message.includes('浏览器会话尚未初始化')) {
|
|
422
|
+
throw new Error(createWaitManualLoginRequiredText('推荐在线简历预览截图'));
|
|
423
|
+
}
|
|
424
|
+
throw new Error(`推荐在线简历预览失败:${message}`);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
export async function runRecommend(jobKeyword) {
|
|
428
|
+
try {
|
|
429
|
+
return await withBossSessionPage(async (page) => {
|
|
430
|
+
const frame = await ensureInRecommendPage(page);
|
|
431
|
+
const selectedJob = await selectRecommendJob(frame, (jobKeyword ?? '').trim());
|
|
432
|
+
const candidates = await readRecommendList(frame);
|
|
433
|
+
const title = selectedJob ? `当前岗位:${selectedJob}` : '当前岗位:默认';
|
|
434
|
+
return [title, '', renderRecommendList(candidates)].join('\n');
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
catch (e) {
|
|
438
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
439
|
+
if (e instanceof Error && e.message.includes('浏览器会话尚未初始化')) {
|
|
440
|
+
throw new Error(createWaitManualLoginRequiredText('查看推荐列表'));
|
|
441
|
+
}
|
|
442
|
+
throw new Error(`读取推荐列表失败:${message}`);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=recommend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/toolset/recommend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend_greet.d.ts","sourceRoot":"","sources":["../../src/toolset/recommend_greet.ts"],"names":[],"mappings":"AAaA,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBvE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createWaitManualLoginRequiredText, sleepRandom, withChatPage, } from '../browser/index.js';
|
|
2
|
+
import { clickGreet, ensureInRecommendPage, markGreetProduced, readRecommendList, renderRecommendList, } from './recommend.js';
|
|
3
|
+
export async function runRecommendGreet(target) {
|
|
4
|
+
const t = target.trim();
|
|
5
|
+
if (!t) {
|
|
6
|
+
throw new Error('请提供打招呼目标(姓名或序号)。');
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
return await withChatPage(async (page) => {
|
|
10
|
+
const frame = await ensureInRecommendPage(page);
|
|
11
|
+
const before = await readRecommendList(frame);
|
|
12
|
+
const greetResult = await clickGreet(frame, t);
|
|
13
|
+
await sleepRandom(380, 1000);
|
|
14
|
+
const after = await readRecommendList(frame);
|
|
15
|
+
markGreetProduced(before, after);
|
|
16
|
+
return [greetResult.message, '', '当前推荐列表(来源分组):', renderRecommendList(after)].join('\n');
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
21
|
+
if (e instanceof Error && e.message.includes('浏览器会话尚未初始化')) {
|
|
22
|
+
throw new Error(createWaitManualLoginRequiredText('推荐打招呼'));
|
|
23
|
+
}
|
|
24
|
+
throw new Error(`执行推荐打招呼失败:${message}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=recommend_greet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommend_greet.js","sourceRoot":"","sources":["../../src/toolset/recommend_greet.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,WAAW,EACX,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/C,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
|
package/dist/toolset/search.d.ts
CHANGED
|
@@ -1,2 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
export type DeepSearchGeekItem = {
|
|
3
|
+
name: string;
|
|
4
|
+
meta: string;
|
|
5
|
+
work: string;
|
|
6
|
+
edu: string;
|
|
7
|
+
reason: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function isBossChatAiFormUrl(url: string): boolean;
|
|
10
|
+
export declare function ensureInDeepSearchPage(page: Page): Promise<void>;
|
|
11
|
+
export declare function readDeepSearchGeekList(page: Page): Promise<DeepSearchGeekItem[]>;
|
|
12
|
+
export declare function renderGeekListSection(title: string, items: DeepSearchGeekItem[]): string;
|
|
13
|
+
export declare function clickGreetDeepSearch(page: Page, target: string): Promise<{
|
|
14
|
+
message: string;
|
|
15
|
+
}>;
|
|
16
|
+
export declare function runBossSearchSet(opts: {
|
|
17
|
+
jobKeyword?: string;
|
|
18
|
+
coreRequirements?: string[];
|
|
19
|
+
bonusRequirements?: string[];
|
|
20
|
+
}): Promise<string>;
|
|
21
|
+
export declare function runBossSearch(opts?: {
|
|
22
|
+
jobKeyword?: string;
|
|
23
|
+
}): Promise<string>;
|
|
2
24
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/toolset/search.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/toolset/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAkB3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWxD;AAkBD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtE;AAkYD,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA4BtF;AAsBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAoBxF;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAuFnG;AAgED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,GAAG,OAAO,CAAC,MAAM,CAAC,CAgDlB;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCvF"}
|