@joohw/boss-cli 0.3.4 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +172 -130
- package/dist/browser/agent_operating_indicator.d.ts +1 -0
- package/dist/browser/agent_operating_indicator.d.ts.map +1 -1
- package/dist/browser/agent_operating_indicator.js +15 -3
- package/dist/browser/agent_operating_indicator.js.map +1 -1
- package/dist/cli/cliRouter.d.ts.map +1 -1
- package/dist/cli/cliRouter.js +55 -49
- package/dist/cli/cliRouter.js.map +1 -1
- package/dist/common/auth.d.ts +6 -0
- package/dist/common/auth.d.ts.map +1 -1
- package/dist/common/auth.js +18 -0
- package/dist/common/auth.js.map +1 -1
- 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_paywall_popup.d.ts +5 -0
- package/dist/common/boss_paywall_popup.d.ts.map +1 -1
- package/dist/common/boss_paywall_popup.js +8 -2
- package/dist/common/boss_paywall_popup.js.map +1 -1
- 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 +121 -0
- package/dist/common/boss_session_lock.js.map +1 -0
- package/dist/common/boss_session_page.d.ts +2 -1
- package/dist/common/boss_session_page.d.ts.map +1 -1
- package/dist/common/boss_session_page.js +60 -51
- package/dist/common/boss_session_page.js.map +1 -1
- package/dist/common/c_resume_capture.js +1 -1
- package/dist/toolset/deep-search.d.ts +1 -1
- package/dist/toolset/deep-search.d.ts.map +1 -1
- package/dist/toolset/deep-search.js +12 -26
- package/dist/toolset/deep-search.js.map +1 -1
- package/dist/toolset/greet.d.ts +5 -1
- package/dist/toolset/greet.d.ts.map +1 -1
- package/dist/toolset/greet.js +30 -7
- package/dist/toolset/greet.js.map +1 -1
- package/dist/toolset/index.d.ts +4 -1
- package/dist/toolset/index.d.ts.map +1 -1
- package/dist/toolset/index.js +2 -2
- package/dist/toolset/index.js.map +1 -1
- package/dist/toolset/jd.d.ts.map +1 -1
- package/dist/toolset/jd.js +2 -6
- package/dist/toolset/jd.js.map +1 -1
- package/dist/toolset/login.d.ts.map +1 -1
- package/dist/toolset/login.js +10 -3
- package/dist/toolset/login.js.map +1 -1
- package/dist/toolset/preview.js +1 -1
- package/dist/toolset/preview.js.map +1 -1
- package/dist/toolset/recommend.d.ts +1 -1
- package/dist/toolset/recommend.d.ts.map +1 -1
- package/dist/toolset/recommend.js +13 -26
- package/dist/toolset/recommend.js.map +1 -1
- package/package.json +34 -2
package/dist/common/auth.js
CHANGED
|
@@ -37,6 +37,24 @@ export function isBossChatIndexUrl(url) {
|
|
|
37
37
|
return false;
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* 是否已经位于 Boss 已登录主壳页(pathname 以 `/web/chat/` 开头)。
|
|
42
|
+
* 当前已知主壳页:`/web/chat/index`、`/web/chat/recommend`、`/web/chat/aiform`、`/web/chat/job/list`。
|
|
43
|
+
* 它们共享同一套侧栏 `.menu-list`,校验登录态时不必再额外跳回 `/web/chat/index`。
|
|
44
|
+
*/
|
|
45
|
+
export function isBossChatShellUrl(url) {
|
|
46
|
+
try {
|
|
47
|
+
const u = new URL(url);
|
|
48
|
+
if (!u.hostname.includes('zhipin.com')) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const p = u.pathname.replace(/\/+$/, '') || '/';
|
|
52
|
+
return p === '/web/chat' || p.startsWith('/web/chat/');
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
40
58
|
/** 未登录时常见跳转:如 `https://www.zhipin.com/web/user/?ka=bticket` */
|
|
41
59
|
export function isWebUserLoginUrl(url) {
|
|
42
60
|
try {
|
package/dist/common/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/common/auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/common/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
/**
|
|
3
|
+
* 关闭当前可见的 Boss 弹层(通常同一时刻只会出现一个)。
|
|
4
|
+
* 覆盖 `.boss-popup__wrapper` / `.boss-dialog__wrapper` / `.dialog-container`,
|
|
5
|
+
* 以及含 c-resume 的简历预览层(`.close-btn`)。
|
|
6
|
+
* 会在主文档与各子 frame 中尝试。返回是否执行了关闭。
|
|
7
|
+
*/
|
|
8
|
+
export declare function closeBossModalIfPresent(page: Page): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* 轮询直到出现可见弹层并关闭,或超时。
|
|
11
|
+
* 用于操作完成后清理延迟出现的提示框(如「当前职位尚未开放」)。
|
|
12
|
+
*/
|
|
13
|
+
export declare function waitAndCloseBossModalIfPresent(page: Page, timeoutMs: number): Promise<boolean>;
|
|
14
|
+
//# sourceMappingURL=boss_modal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_modal.d.ts","sourceRoot":"","sources":["../../src/common/boss_modal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAgD3C;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAa1E;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CASlB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { C_RESUME_IFRAME_SELECTOR } from './c_resume_capture.js';
|
|
2
|
+
import { sleepRandom } from '../browser/timing.js';
|
|
3
|
+
const CLOSE_BOSS_MODAL_SCRIPT = `(() => {
|
|
4
|
+
function isVisible(el) {
|
|
5
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
6
|
+
const st = window.getComputedStyle(el);
|
|
7
|
+
if (st.display === "none" || st.visibility === "hidden" || Number(st.opacity) < 0.05) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
const rect = el.getBoundingClientRect();
|
|
11
|
+
return rect.width >= 20 && rect.height >= 20;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function tryClickClose(root) {
|
|
15
|
+
const closeBtn =
|
|
16
|
+
root.querySelector(".boss-popup__close, .boss-dialog__close, .drawer-close") ||
|
|
17
|
+
root.querySelector(".dialog-header .close") ||
|
|
18
|
+
root.querySelector(".close-btn") ||
|
|
19
|
+
root.querySelector(".icon-close");
|
|
20
|
+
if (closeBtn instanceof HTMLElement) {
|
|
21
|
+
closeBtn.click();
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const roots = Array.from(
|
|
28
|
+
document.querySelectorAll(".boss-popup__wrapper, .boss-dialog__wrapper, .dialog-container"),
|
|
29
|
+
);
|
|
30
|
+
for (const root of roots) {
|
|
31
|
+
if (!isVisible(root)) continue;
|
|
32
|
+
if (tryClickClose(root)) return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const resumeIframe = document.querySelector(${JSON.stringify(C_RESUME_IFRAME_SELECTOR)});
|
|
36
|
+
if (resumeIframe instanceof HTMLElement && isVisible(resumeIframe)) {
|
|
37
|
+
let node = resumeIframe.parentElement;
|
|
38
|
+
for (let i = 0; i < 15 && node; i++) {
|
|
39
|
+
if (tryClickClose(node)) return true;
|
|
40
|
+
node = node.parentElement;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return false;
|
|
45
|
+
})()`;
|
|
46
|
+
/**
|
|
47
|
+
* 关闭当前可见的 Boss 弹层(通常同一时刻只会出现一个)。
|
|
48
|
+
* 覆盖 `.boss-popup__wrapper` / `.boss-dialog__wrapper` / `.dialog-container`,
|
|
49
|
+
* 以及含 c-resume 的简历预览层(`.close-btn`)。
|
|
50
|
+
* 会在主文档与各子 frame 中尝试。返回是否执行了关闭。
|
|
51
|
+
*/
|
|
52
|
+
export async function closeBossModalIfPresent(page) {
|
|
53
|
+
for (const frame of page.frames()) {
|
|
54
|
+
try {
|
|
55
|
+
const closed = (await frame.evaluate(CLOSE_BOSS_MODAL_SCRIPT));
|
|
56
|
+
if (closed) {
|
|
57
|
+
await sleepRandom(220, 480);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* detached / 无权限 */
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 轮询直到出现可见弹层并关闭,或超时。
|
|
69
|
+
* 用于操作完成后清理延迟出现的提示框(如「当前职位尚未开放」)。
|
|
70
|
+
*/
|
|
71
|
+
export async function waitAndCloseBossModalIfPresent(page, timeoutMs) {
|
|
72
|
+
const deadline = Date.now() + timeoutMs;
|
|
73
|
+
while (Date.now() < deadline) {
|
|
74
|
+
if (await closeBossModalIfPresent(page)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
await sleepRandom(160, 240);
|
|
78
|
+
}
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=boss_modal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_modal.js","sourceRoot":"","sources":["../../src/common/boss_modal.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gDAgCgB,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC;;;;;;;;;;KAUnF,CAAC;AAEN;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,IAAU;IACtD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,MAAM,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAY,CAAC;YAC1E,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,IAAU,EACV,SAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,MAAM,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -4,6 +4,11 @@ import type { Page } from 'puppeteer-core';
|
|
|
4
4
|
* c-resume 可能在主文档,也可能在 `recommendFrame` 等子 frame 内(推荐预览),故遍历 {@link Page.frames}。
|
|
5
5
|
*/
|
|
6
6
|
export declare function waitForCResumeIframeOrPaywall(page: Page, timeoutMs?: number): Promise<'iframe' | 'paywall' | 'neither'>;
|
|
7
|
+
/**
|
|
8
|
+
* 单次探测:主文档是否当前正显示付费弹层(与 {@link describeBossPaywallPopupIfPresent} 判定一致)。
|
|
9
|
+
* 供合并轮询(同一循环内同时检测多类弹层)使用,避免重复编写检测脚本。
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectBossPaywallPopup(page: Page): Promise<boolean>;
|
|
7
12
|
/**
|
|
8
13
|
* 打招呼等操作后,轮询主文档是否出现付费弹层(与 {@link describeBossPaywallPopupIfPresent} 判定一致)。
|
|
9
14
|
* 命中则返回 true;超时未出现则返回 false。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boss_paywall_popup.d.ts","sourceRoot":"","sources":["../../src/common/boss_paywall_popup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAgC3C;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,MAAyC,GACnD,OAAO,CAAC,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,CAkB3C;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,MAAkC,GAC5C,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"boss_paywall_popup.d.ts","sourceRoot":"","sources":["../../src/common/boss_paywall_popup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAgC3C;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,MAAyC,GACnD,OAAO,CAAC,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,CAkB3C;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzE;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,SAAS,GAAE,MAAkC,GAC5C,OAAO,CAAC,OAAO,CAAC,CASlB;AAED;;;GAGG;AACH,wBAAsB,8BAA8B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAoCjF;AAED;;;;GAIG;AACH,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,QAAQ,GAAG,OAAkB,GACrC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuCxB"}
|
|
@@ -48,6 +48,13 @@ export async function waitForCResumeIframeOrPaywall(page, timeoutMs = ONLINE_RES
|
|
|
48
48
|
}
|
|
49
49
|
return 'neither';
|
|
50
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* 单次探测:主文档是否当前正显示付费弹层(与 {@link describeBossPaywallPopupIfPresent} 判定一致)。
|
|
53
|
+
* 供合并轮询(同一循环内同时检测多类弹层)使用,避免重复编写检测脚本。
|
|
54
|
+
*/
|
|
55
|
+
export async function detectBossPaywallPopup(page) {
|
|
56
|
+
return (await page.evaluate(HAS_PAYWALL_SCRIPT));
|
|
57
|
+
}
|
|
51
58
|
/**
|
|
52
59
|
* 打招呼等操作后,轮询主文档是否出现付费弹层(与 {@link describeBossPaywallPopupIfPresent} 判定一致)。
|
|
53
60
|
* 命中则返回 true;超时未出现则返回 false。
|
|
@@ -55,8 +62,7 @@ export async function waitForCResumeIframeOrPaywall(page, timeoutMs = ONLINE_RES
|
|
|
55
62
|
export async function waitForBossPaywallPopup(page, timeoutMs = GREET_PAYWALL_WAIT_MAX_MS) {
|
|
56
63
|
const deadline = Date.now() + timeoutMs;
|
|
57
64
|
while (Date.now() < deadline) {
|
|
58
|
-
|
|
59
|
-
if (paywall) {
|
|
65
|
+
if (await detectBossPaywallPopup(page)) {
|
|
60
66
|
return true;
|
|
61
67
|
}
|
|
62
68
|
await sleepRandom(160, 240);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boss_paywall_popup.js","sourceRoot":"","sources":["../../src/common/boss_paywall_popup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AACxG,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE,2EAA2E;AAC3E,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;KAwBtB,CAAC;AAEN;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,IAAU,EACV,YAAoB,gCAAgC;IAEpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAY,CAAC;QACrE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,MAAM,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAU,EACV,YAAoB,yBAAyB;IAE7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,
|
|
1
|
+
{"version":3,"file":"boss_paywall_popup.js","sourceRoot":"","sources":["../../src/common/boss_paywall_popup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AACxG,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE,2EAA2E;AAC3E,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;KAwBtB,CAAC;AAEN;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,IAAU,EACV,YAAoB,gCAAgC;IAEpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAY,CAAC;QACrE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,MAAM,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAU;IACrD,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAY,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAU,EACV,YAAoB,yBAAyB;IAE7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,MAAM,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,IAAU;IAC7D,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8B/B,CAAC,CAAY,CAAC;IACnB,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,IAAU,EACV,UAA8B,QAAQ;IAEtC,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiC5B,CAAC,CAAkB,CAAC;IACzB,IAAI,CAAC,GAAG,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_session_lock.d.ts","sourceRoot":"","sources":["../../src/common/boss_session_lock.ts"],"names":[],"mappings":"AAgGA,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAyCnF"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { open, readFile, rm } from 'node:fs/promises';
|
|
2
|
+
import { hostname } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { sleepRandom } from '../browser/timing.js';
|
|
5
|
+
import { CACHE_DIR, ensureAppDataLayout } from '../config.js';
|
|
6
|
+
const SESSION_LOCK_FILE = join(CACHE_DIR, 'session.lock');
|
|
7
|
+
const SESSION_LOCK_WAIT_MAX_MS = 30_000;
|
|
8
|
+
const SESSION_LOCK_POLL_MS = 250;
|
|
9
|
+
function buildSessionLockMeta() {
|
|
10
|
+
return {
|
|
11
|
+
pid: process.pid,
|
|
12
|
+
createdAt: Date.now(),
|
|
13
|
+
hostname: hostname(),
|
|
14
|
+
cwd: process.cwd(),
|
|
15
|
+
command: process.argv.join(' ').trim(),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async function readSessionLockMeta() {
|
|
19
|
+
try {
|
|
20
|
+
const raw = await readFile(SESSION_LOCK_FILE, 'utf8');
|
|
21
|
+
const parsed = JSON.parse(raw);
|
|
22
|
+
if (typeof parsed.pid !== 'number' ||
|
|
23
|
+
typeof parsed.createdAt !== 'number' ||
|
|
24
|
+
typeof parsed.hostname !== 'string' ||
|
|
25
|
+
typeof parsed.cwd !== 'string' ||
|
|
26
|
+
typeof parsed.command !== 'string') {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
pid: parsed.pid,
|
|
31
|
+
createdAt: parsed.createdAt,
|
|
32
|
+
hostname: parsed.hostname,
|
|
33
|
+
cwd: parsed.cwd,
|
|
34
|
+
command: parsed.command,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function processExists(pid) {
|
|
42
|
+
if (!Number.isInteger(pid) || pid <= 0) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
process.kill(pid, 0);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const code = error && typeof error === 'object' && 'code' in error ? error.code : '';
|
|
51
|
+
return code === 'EPERM';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function clearStaleSessionLockIfNeeded() {
|
|
55
|
+
const meta = await readSessionLockMeta();
|
|
56
|
+
if (!meta) {
|
|
57
|
+
await rm(SESSION_LOCK_FILE, { force: true }).catch(() => { });
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (meta.hostname !== hostname()) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (await processExists(meta.pid)) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
await rm(SESSION_LOCK_FILE, { force: true }).catch(() => { });
|
|
67
|
+
}
|
|
68
|
+
function formatSessionLockOwner(meta) {
|
|
69
|
+
if (!meta) {
|
|
70
|
+
return 'unknown';
|
|
71
|
+
}
|
|
72
|
+
const ageSeconds = Math.max(0, Math.floor((Date.now() - meta.createdAt) / 1000));
|
|
73
|
+
return [
|
|
74
|
+
'pid=' + meta.pid,
|
|
75
|
+
'host=' + meta.hostname,
|
|
76
|
+
'age=' + ageSeconds + 's',
|
|
77
|
+
meta.command ? 'cmd=' + meta.command : '',
|
|
78
|
+
]
|
|
79
|
+
.filter(Boolean)
|
|
80
|
+
.join(', ');
|
|
81
|
+
}
|
|
82
|
+
export async function withBossSessionLock(callback) {
|
|
83
|
+
ensureAppDataLayout();
|
|
84
|
+
const deadline = Date.now() + SESSION_LOCK_WAIT_MAX_MS;
|
|
85
|
+
while (true) {
|
|
86
|
+
try {
|
|
87
|
+
const handle = await open(SESSION_LOCK_FILE, 'wx');
|
|
88
|
+
let lockCreated = false;
|
|
89
|
+
try {
|
|
90
|
+
await handle.writeFile(JSON.stringify(buildSessionLockMeta()), 'utf8');
|
|
91
|
+
lockCreated = true;
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
await handle.close().catch(() => { });
|
|
95
|
+
}
|
|
96
|
+
if (!lockCreated) {
|
|
97
|
+
await rm(SESSION_LOCK_FILE, { force: true }).catch(() => { });
|
|
98
|
+
throw new Error('Boss session lock creation failed.');
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
return await callback();
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
await rm(SESSION_LOCK_FILE, { force: true }).catch(() => { });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const code = error && typeof error === 'object' && 'code' in error ? error.code : '';
|
|
109
|
+
if (code !== 'EEXIST') {
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
await clearStaleSessionLockIfNeeded();
|
|
113
|
+
if (Date.now() >= deadline) {
|
|
114
|
+
const meta = await readSessionLockMeta();
|
|
115
|
+
throw new Error('Boss session is busy for more than 30s. Lock owner: ' + formatSessionLockOwner(meta));
|
|
116
|
+
}
|
|
117
|
+
await sleepRandom(SESSION_LOCK_POLL_MS, SESSION_LOCK_POLL_MS);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=boss_session_lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_session_lock.js","sourceRoot":"","sources":["../../src/common/boss_session_lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
import type { Page } from 'puppeteer-core';
|
|
6
6
|
/**
|
|
7
7
|
* 在已连接浏览器、且当前页为 Boss 已登录主壳(含侧栏 `.menu-list` 稳定)的前提下执行回调。
|
|
8
|
-
* 会先按 URL
|
|
8
|
+
* 会先按 URL 确保落在 `/web/chat/*` 主壳页(已在主壳子页则保留原路径,否则跳回沟通页 `/web/chat/index`),
|
|
9
|
+
* 再校验侧栏;回调内可再导航到职位/推荐等业务路由。
|
|
9
10
|
*/
|
|
10
11
|
export declare function withBossSessionPage<T>(callback: (page: Page) => Promise<T>): Promise<T>;
|
|
11
12
|
//# sourceMappingURL=boss_session_page.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boss_session_page.d.ts","sourceRoot":"","sources":["../../src/common/boss_session_page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"boss_session_page.d.ts","sourceRoot":"","sources":["../../src/common/boss_session_page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA4IpD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA4D7F"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { BOSS_CHAT_INDEX_URL,
|
|
1
|
+
import { BOSS_CHAT_INDEX_URL, isBossChatShellUrl } from './auth.js';
|
|
2
2
|
import { hideAgentOperatingIndicator, showAgentOperatingIndicator, } from '../browser/agent_operating_indicator.js';
|
|
3
3
|
import { ensureBrowserSession, getBrowserRef, getPageRef, setSessionPage, } from '../browser/browser_session.js';
|
|
4
4
|
import { CONTEXT_DESTROY_RETRY_MS } from '../browser/human_delay.js';
|
|
5
5
|
import { sleepRandom } from '../browser/timing.js';
|
|
6
6
|
import { installBossPageGuards } from './boss_page_guards.js';
|
|
7
|
+
import { withBossSessionLock } from './boss_session_lock.js';
|
|
7
8
|
const SHOULD_DISABLE_JS = process.env.BOSS_BROWSER_DISABLE_JS === 'true' || process.env.BOSS_BROWSER_DISABLE_JS === '1';
|
|
8
9
|
/** 设为 `1` / `true` 时不注入顶栏滚动提示(调试或截图对比用)。 */
|
|
9
10
|
const SKIP_AGENT_OPERATING_OVERLAY = process.env.BOSS_CLI_NO_AGENT_OVERLAY === '1' ||
|
|
@@ -54,9 +55,14 @@ async function readMenuListSnapshot(page) {
|
|
|
54
55
|
return { exists: true, signature: entries.join("|") };
|
|
55
56
|
})()`));
|
|
56
57
|
}
|
|
57
|
-
/**
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
/**
|
|
59
|
+
* 先按 URL 判断:不在 Boss 已登录主壳页(`/web/chat/*`)时跳到沟通页 `/web/chat/index`,
|
|
60
|
+
* 再交由 {@link ensureMenuListStableAfterLoad} 查 `.menu-list`。
|
|
61
|
+
* 已经在 `/web/chat/recommend`、`/web/chat/aiform` 等主壳子页时直接跳过 goto,
|
|
62
|
+
* 避免触发"先回到聊天页再切回业务页"的额外跳转。
|
|
63
|
+
*/
|
|
64
|
+
async function ensureBossChatShellUrlBeforeMenuList(page) {
|
|
65
|
+
if (isBossChatShellUrl(page.url())) {
|
|
60
66
|
return;
|
|
61
67
|
}
|
|
62
68
|
await page.goto(BOSS_CHAT_INDEX_URL, { waitUntil: 'load', timeout: 60_000 });
|
|
@@ -95,60 +101,63 @@ async function ensureMenuListStableAfterLoad(page) {
|
|
|
95
101
|
}
|
|
96
102
|
/**
|
|
97
103
|
* 在已连接浏览器、且当前页为 Boss 已登录主壳(含侧栏 `.menu-list` 稳定)的前提下执行回调。
|
|
98
|
-
* 会先按 URL
|
|
104
|
+
* 会先按 URL 确保落在 `/web/chat/*` 主壳页(已在主壳子页则保留原路径,否则跳回沟通页 `/web/chat/index`),
|
|
105
|
+
* 再校验侧栏;回调内可再导航到职位/推荐等业务路由。
|
|
99
106
|
*/
|
|
100
107
|
export async function withBossSessionPage(callback) {
|
|
101
|
-
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
msg.includes('
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
await ensureBrowserSession();
|
|
112
|
-
const browser = getBrowserRef();
|
|
113
|
-
if (!browser) {
|
|
114
|
-
throw new Error('无法获取浏览器实例。');
|
|
115
|
-
}
|
|
116
|
-
let page = getPageRef();
|
|
117
|
-
if (!page || page.isClosed()) {
|
|
118
|
-
page = (await pickExistingPage(browser)) ?? (await browser.newPage());
|
|
119
|
-
}
|
|
120
|
-
setSessionPage(page);
|
|
121
|
-
await page.bringToFront();
|
|
122
|
-
await installBossPageGuards(page);
|
|
123
|
-
await ensureBossChatIndexUrlBeforeMenuList(page);
|
|
124
|
-
if (SHOULD_DISABLE_JS) {
|
|
125
|
-
await page.setJavaScriptEnabled(false);
|
|
126
|
-
}
|
|
127
|
-
await ensureMenuListStableAfterLoad(page);
|
|
128
|
-
if (!SHOULD_DISABLE_JS && !SKIP_AGENT_OPERATING_OVERLAY) {
|
|
129
|
-
await showAgentOperatingIndicator(page).catch(() => {
|
|
130
|
-
/* 注入失败不阻断业务 */
|
|
131
|
-
});
|
|
132
|
-
}
|
|
108
|
+
return withBossSessionLock(async () => {
|
|
109
|
+
const isContextDestroyed = (e) => {
|
|
110
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
111
|
+
return (msg.includes('Execution context was destroyed') ||
|
|
112
|
+
msg.includes('Cannot find context with specified id') ||
|
|
113
|
+
msg.includes('Most likely because of a navigation'));
|
|
114
|
+
};
|
|
115
|
+
const maxAttempts = 2;
|
|
116
|
+
let lastErr;
|
|
117
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
133
118
|
try {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
119
|
+
await ensureBrowserSession();
|
|
120
|
+
const browser = getBrowserRef();
|
|
121
|
+
if (!browser) {
|
|
122
|
+
throw new Error('无法获取浏览器实例。');
|
|
123
|
+
}
|
|
124
|
+
let page = getPageRef();
|
|
125
|
+
if (!page || page.isClosed()) {
|
|
126
|
+
page = (await pickExistingPage(browser)) ?? (await browser.newPage());
|
|
127
|
+
}
|
|
128
|
+
setSessionPage(page);
|
|
129
|
+
await page.bringToFront();
|
|
130
|
+
await installBossPageGuards(page);
|
|
131
|
+
await ensureBossChatShellUrlBeforeMenuList(page);
|
|
132
|
+
if (SHOULD_DISABLE_JS) {
|
|
133
|
+
await page.setJavaScriptEnabled(false);
|
|
134
|
+
}
|
|
135
|
+
await ensureMenuListStableAfterLoad(page);
|
|
137
136
|
if (!SHOULD_DISABLE_JS && !SKIP_AGENT_OPERATING_OVERLAY) {
|
|
138
|
-
await
|
|
137
|
+
await showAgentOperatingIndicator(page).catch(() => {
|
|
138
|
+
/* 注入失败不阻断业务 */
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
return await callback(page);
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
if (!SHOULD_DISABLE_JS && !SKIP_AGENT_OPERATING_OVERLAY) {
|
|
146
|
+
await hideAgentOperatingIndicator(page);
|
|
147
|
+
}
|
|
139
148
|
}
|
|
140
149
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
150
|
+
catch (e) {
|
|
151
|
+
lastErr = e;
|
|
152
|
+
if (attempt < maxAttempts - 1 && isContextDestroyed(e)) {
|
|
153
|
+
// Boss 页面偶发跳转/重渲染会销毁执行上下文;短暂等待并重试一次即可。
|
|
154
|
+
await sleepRandom(CONTEXT_DESTROY_RETRY_MS.min, CONTEXT_DESTROY_RETRY_MS.max);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
throw e;
|
|
148
158
|
}
|
|
149
|
-
throw e;
|
|
150
159
|
}
|
|
151
|
-
|
|
152
|
-
|
|
160
|
+
throw lastErr instanceof Error ? lastErr : new Error(String(lastErr));
|
|
161
|
+
});
|
|
153
162
|
}
|
|
154
163
|
//# sourceMappingURL=boss_session_page.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boss_session_page.js","sourceRoot":"","sources":["../../src/common/boss_session_page.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"boss_session_page.js","sourceRoot":"","sources":["../../src/common/boss_session_page.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ const CLOSE_C_RESUME_PANEL_SCRIPT = `(() => {
|
|
|
19
19
|
var node = iframe ? iframe.parentElement : null;
|
|
20
20
|
for (var i = 0; i < 12 && node; i++) {
|
|
21
21
|
var closeBtn = node.querySelector(
|
|
22
|
-
'.boss-popup__close, .drawer-close, .icon-close, .btn-quxiao',
|
|
22
|
+
'.boss-popup__close, .drawer-close, .icon-close, .close-btn, .btn-quxiao',
|
|
23
23
|
);
|
|
24
24
|
if (closeBtn) {
|
|
25
25
|
closeBtn.click();
|
|
@@ -12,7 +12,7 @@ export declare function selectAiFormJob(page: Page, keyword: string): Promise<st
|
|
|
12
12
|
/** 深度搜索页当前选中的岗位文案(无则「默认」) */
|
|
13
13
|
export declare function readAiFormSelectedJobLabel(page: Page): Promise<string>;
|
|
14
14
|
/**
|
|
15
|
-
* 在深度搜索(aiform
|
|
15
|
+
* 在深度搜索(aiform)主文档中按姓名打开在线简历预览(与 {@link clickGreetDeepSearch} 同一卡片集合,排除「继续沟通」)。
|
|
16
16
|
*/
|
|
17
17
|
export declare function openDeepSearchResumePreview(page: Page, target: string): Promise<boolean>;
|
|
18
18
|
export declare function readDeepSearchGeekList(page: Page): Promise<DeepSearchGeekItem[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep-search.d.ts","sourceRoot":"","sources":["../../src/toolset/deep-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAgB3C,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;AAgvBD,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0ElF;AAED,6BAA6B;AAC7B,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5E;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"deep-search.d.ts","sourceRoot":"","sources":["../../src/toolset/deep-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAgB3C,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;AAgvBD,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0ElF;AAED,6BAA6B;AAC7B,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5E;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA2D9F;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA4BtF;AAED,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,CAgFnG;AAeD,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,CAmCvF"}
|
|
@@ -767,7 +767,7 @@ export async function readAiFormSelectedJobLabel(page) {
|
|
|
767
767
|
})()`));
|
|
768
768
|
}
|
|
769
769
|
/**
|
|
770
|
-
* 在深度搜索(aiform
|
|
770
|
+
* 在深度搜索(aiform)主文档中按姓名打开在线简历预览(与 {@link clickGreetDeepSearch} 同一卡片集合,排除「继续沟通」)。
|
|
771
771
|
*/
|
|
772
772
|
export async function openDeepSearchResumePreview(page, target) {
|
|
773
773
|
const raw = target.trim();
|
|
@@ -784,18 +784,11 @@ export async function openDeepSearchResumePreview(page, target) {
|
|
|
784
784
|
return !chatLabel.includes("继续沟通");
|
|
785
785
|
});
|
|
786
786
|
if (cards.length === 0) return false;
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
} else {
|
|
793
|
-
targetCard =
|
|
794
|
-
cards.find((item) => {
|
|
795
|
-
const name = norm(item.querySelector(".geek-name")?.textContent);
|
|
796
|
-
return name === raw || name.includes(raw);
|
|
797
|
-
}) ?? null;
|
|
798
|
-
}
|
|
787
|
+
const targetCard =
|
|
788
|
+
cards.find((item) => {
|
|
789
|
+
const name = norm(item.querySelector(".geek-name")?.textContent);
|
|
790
|
+
return name === raw || name.includes(raw);
|
|
791
|
+
}) ?? null;
|
|
799
792
|
if (!targetCard) return false;
|
|
800
793
|
|
|
801
794
|
function tryOpen(el) {
|
|
@@ -904,18 +897,11 @@ export async function clickGreetDeepSearch(page, target) {
|
|
|
904
897
|
if (cards.length === 0) {
|
|
905
898
|
return { kind: "all_continue" };
|
|
906
899
|
}
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
} else {
|
|
913
|
-
targetCard =
|
|
914
|
-
cards.find((item) => {
|
|
915
|
-
const name = norm(item.querySelector(".geek-name")?.textContent);
|
|
916
|
-
return name === raw || name.includes(raw);
|
|
917
|
-
}) ?? null;
|
|
918
|
-
}
|
|
900
|
+
const targetCard =
|
|
901
|
+
cards.find((item) => {
|
|
902
|
+
const name = norm(item.querySelector(".geek-name")?.textContent);
|
|
903
|
+
return name === raw || name.includes(raw);
|
|
904
|
+
}) ?? null;
|
|
919
905
|
if (!targetCard) {
|
|
920
906
|
return { kind: "not_found", target: raw };
|
|
921
907
|
}
|
|
@@ -947,7 +933,7 @@ export async function clickGreetDeepSearch(page, target) {
|
|
|
947
933
|
case 'all_continue':
|
|
948
934
|
throw new Error('当前列表均为「继续沟通」状态,已无待打招呼人选(与 boss deep-search 列表展示一致)。');
|
|
949
935
|
case 'not_found':
|
|
950
|
-
throw new Error(`未在可打招呼的深度搜索列表中找到目标:${result.target}(「继续沟通」人选已排除,请用 boss deep-search
|
|
936
|
+
throw new Error(`未在可打招呼的深度搜索列表中找到目标:${result.target}(「继续沟通」人选已排除,请用 boss deep-search 核对姓名)。`);
|
|
951
937
|
case 'no_btn':
|
|
952
938
|
throw new Error(`候选人 ${result.name} 缺少「打招呼」按钮,无法执行。`);
|
|
953
939
|
case 'not_greet':
|