@joohw/boss-cli 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/AGENTS.md +25 -25
  2. package/README.md +34 -19
  3. package/dist/browser/agent_operating_indicator.d.ts +9 -0
  4. package/dist/browser/agent_operating_indicator.d.ts.map +1 -0
  5. package/dist/browser/agent_operating_indicator.js +92 -0
  6. package/dist/browser/agent_operating_indicator.js.map +1 -0
  7. package/dist/browser/c_resume_capture.d.ts +11 -0
  8. package/dist/browser/c_resume_capture.d.ts.map +1 -0
  9. package/dist/browser/c_resume_capture.js +76 -0
  10. package/dist/browser/c_resume_capture.js.map +1 -0
  11. package/dist/browser/chat.d.ts +3 -3
  12. package/dist/browser/chat.d.ts.map +1 -1
  13. package/dist/browser/chat.js +43 -5
  14. package/dist/browser/chat.js.map +1 -1
  15. package/dist/browser/human_delay.d.ts +5 -0
  16. package/dist/browser/human_delay.d.ts.map +1 -1
  17. package/dist/browser/human_delay.js +5 -0
  18. package/dist/browser/human_delay.js.map +1 -1
  19. package/dist/browser/index.d.ts +2 -2
  20. package/dist/browser/index.d.ts.map +1 -1
  21. package/dist/browser/index.js +2 -2
  22. package/dist/browser/index.js.map +1 -1
  23. package/dist/browser/viewport_temp.d.ts +15 -0
  24. package/dist/browser/viewport_temp.d.ts.map +1 -0
  25. package/dist/browser/viewport_temp.js +78 -0
  26. package/dist/browser/viewport_temp.js.map +1 -0
  27. package/dist/cli/banner.d.ts +1 -1
  28. package/dist/cli/banner.d.ts.map +1 -1
  29. package/dist/cli/banner.js +8 -39
  30. package/dist/cli/banner.js.map +1 -1
  31. package/dist/cli/cliRouter.d.ts.map +1 -1
  32. package/dist/cli/cliRouter.js +40 -11
  33. package/dist/cli/cliRouter.js.map +1 -1
  34. package/dist/common/auth.d.ts +38 -0
  35. package/dist/common/auth.d.ts.map +1 -0
  36. package/dist/common/auth.js +150 -0
  37. package/dist/common/auth.js.map +1 -0
  38. package/dist/common/boss_paywall_popup.d.ts +17 -0
  39. package/dist/common/boss_paywall_popup.d.ts.map +1 -0
  40. package/dist/common/boss_paywall_popup.js +132 -0
  41. package/dist/common/boss_paywall_popup.js.map +1 -0
  42. package/dist/common/boss_session_page.d.ts +11 -0
  43. package/dist/common/boss_session_page.d.ts.map +1 -0
  44. package/dist/common/boss_session_page.js +155 -0
  45. package/dist/common/boss_session_page.js.map +1 -0
  46. package/dist/common/boss_sidebar_nav.d.ts +6 -0
  47. package/dist/common/boss_sidebar_nav.d.ts.map +1 -0
  48. package/dist/common/boss_sidebar_nav.js +37 -0
  49. package/dist/common/boss_sidebar_nav.js.map +1 -0
  50. package/dist/common/c_resume_capture.d.ts +18 -0
  51. package/dist/common/c_resume_capture.d.ts.map +1 -0
  52. package/dist/common/c_resume_capture.js +125 -0
  53. package/dist/common/c_resume_capture.js.map +1 -0
  54. package/dist/toolset/action.d.ts +1 -1
  55. package/dist/toolset/action.d.ts.map +1 -1
  56. package/dist/toolset/action.js +193 -152
  57. package/dist/toolset/action.js.map +1 -1
  58. package/dist/toolset/c_resume_capture.d.ts +11 -0
  59. package/dist/toolset/c_resume_capture.d.ts.map +1 -0
  60. package/dist/toolset/c_resume_capture.js +76 -0
  61. package/dist/toolset/c_resume_capture.js.map +1 -0
  62. package/dist/toolset/chat.d.ts.map +1 -1
  63. package/dist/toolset/chat.js +6 -4
  64. package/dist/toolset/chat.js.map +1 -1
  65. package/dist/toolset/deep-search.d.ts +31 -0
  66. package/dist/toolset/deep-search.d.ts.map +1 -0
  67. package/dist/toolset/deep-search.js +1057 -0
  68. package/dist/toolset/deep-search.js.map +1 -0
  69. package/dist/toolset/greet.d.ts.map +1 -1
  70. package/dist/toolset/greet.js +32 -10
  71. package/dist/toolset/greet.js.map +1 -1
  72. package/dist/toolset/index.d.ts +13 -1
  73. package/dist/toolset/index.d.ts.map +1 -1
  74. package/dist/toolset/index.js +13 -6
  75. package/dist/toolset/index.js.map +1 -1
  76. package/dist/toolset/jd.d.ts.map +1 -1
  77. package/dist/toolset/jd.js +6 -35
  78. package/dist/toolset/jd.js.map +1 -1
  79. package/dist/toolset/list.d.ts +6 -0
  80. package/dist/toolset/list.d.ts.map +1 -1
  81. package/dist/toolset/list.js +38 -60
  82. package/dist/toolset/list.js.map +1 -1
  83. package/dist/toolset/login.d.ts.map +1 -1
  84. package/dist/toolset/login.js +2 -5
  85. package/dist/toolset/login.js.map +1 -1
  86. package/dist/toolset/preview.d.ts +6 -0
  87. package/dist/toolset/preview.d.ts.map +1 -0
  88. package/dist/toolset/preview.js +103 -0
  89. package/dist/toolset/preview.js.map +1 -0
  90. package/dist/toolset/recommend.d.ts +13 -0
  91. package/dist/toolset/recommend.d.ts.map +1 -1
  92. package/dist/toolset/recommend.js +104 -46
  93. package/dist/toolset/recommend.js.map +1 -1
  94. package/dist/toolset/search.d.ts +23 -1
  95. package/dist/toolset/search.d.ts.map +1 -1
  96. package/dist/toolset/search.js +556 -48
  97. package/dist/toolset/search.js.map +1 -1
  98. package/dist/toolset/send.d.ts.map +1 -1
  99. package/dist/toolset/send.js +4 -2
  100. package/dist/toolset/send.js.map +1 -1
  101. package/package.json +2 -2
@@ -0,0 +1,103 @@
1
+ /**
2
+ * 在线简历预览:须在「推荐」页或「深度搜索 aiform」页且列表已加载;不自动跳转,否则报错。
3
+ */
4
+ import { join } from 'node:path';
5
+ import { ONLINE_RESUME_IFRAME_APPEAR_MS, ONLINE_RESUME_IFRAME_SETTLE_MS, ONLINE_RESUME_IFRAME_WAIT_MAX_MS, sleepRandom, snapshotBossPageViewport, } from '../browser/index.js';
6
+ import { createWaitManualLoginRequiredText } from '../common/auth.js';
7
+ import { withBossSessionPage } from '../common/boss_session_page.js';
8
+ import { closeBossPaywallPopupIfPresent, describeBossPaywallPopupIfPresent, waitForCResumeIframeOrPaywall, } from '../common/boss_paywall_popup.js';
9
+ import { captureCResumeIframeToFile, closeCResumePanel, safeResumeScreenshotFileBase, } from '../common/c_resume_capture.js';
10
+ import { ensureAppDataLayout, RESUME_SCREENSHOTS_DIR } from '../config.js';
11
+ import { isResumeOcrEnabled, ocrResumePngToTextFile } from '../ocr/index.js';
12
+ import { ensureInDeepSearchPage, isBossChatAiFormUrl, openDeepSearchResumePreview, readAiFormSelectedJobLabel, selectAiFormJob, } from './deep-search.js';
13
+ import { assertRecommendPageReadyForPreview, isBossChatRecommendUrl, openRecommendResumePreview, selectRecommendJob, } from './recommend.js';
14
+ export async function runPreview(options) {
15
+ const target = options.candidateTarget.trim();
16
+ if (!target) {
17
+ throw new Error('请提供候选人姓名或列表序号。');
18
+ }
19
+ try {
20
+ return await withBossSessionPage(async (page) => {
21
+ const kw = (options.jobKeyword ?? '').trim();
22
+ const url = page.url();
23
+ let jobLine;
24
+ let savedOriginal;
25
+ let opened;
26
+ if (isBossChatAiFormUrl(url)) {
27
+ await ensureInDeepSearchPage(page);
28
+ if (kw) {
29
+ const label = await selectAiFormJob(page, kw);
30
+ await ensureInDeepSearchPage(page);
31
+ jobLine = `当前岗位:${label}`;
32
+ }
33
+ else {
34
+ const label = await readAiFormSelectedJobLabel(page);
35
+ jobLine = `当前岗位:${label}`;
36
+ }
37
+ savedOriginal = await snapshotBossPageViewport(page);
38
+ opened = await openDeepSearchResumePreview(page, target);
39
+ }
40
+ else if (isBossChatRecommendUrl(url)) {
41
+ const frame = await assertRecommendPageReadyForPreview(page);
42
+ const selectedJob = await selectRecommendJob(frame, kw);
43
+ jobLine = selectedJob ? `当前岗位:${selectedJob}` : '当前岗位:默认';
44
+ savedOriginal = await snapshotBossPageViewport(page);
45
+ opened = await openRecommendResumePreview(frame, target);
46
+ }
47
+ else {
48
+ throw new Error('当前不在推荐列表页或搜索结果页,无法预览候选人。');
49
+ }
50
+ if (!opened) {
51
+ throw new Error('未在列表中找到该候选人,或点击未能打开简历预览。');
52
+ }
53
+ await sleepRandom(ONLINE_RESUME_IFRAME_APPEAR_MS.min, ONLINE_RESUME_IFRAME_APPEAR_MS.max);
54
+ const outcome = await waitForCResumeIframeOrPaywall(page, ONLINE_RESUME_IFRAME_WAIT_MAX_MS);
55
+ if (outcome !== 'iframe') {
56
+ const paywall = await describeBossPaywallPopupIfPresent(page);
57
+ await closeBossPaywallPopupIfPresent(page);
58
+ if (paywall) {
59
+ throw new Error(paywall);
60
+ }
61
+ throw new Error('点击后未出现在线简历 iframe(c-resume)。');
62
+ }
63
+ await sleepRandom(ONLINE_RESUME_IFRAME_SETTLE_MS.min, ONLINE_RESUME_IFRAME_SETTLE_MS.max);
64
+ ensureAppDataLayout();
65
+ const fileName = `preview-${safeResumeScreenshotFileBase(target)}-${Date.now()}.png`;
66
+ const absPath = join(RESUME_SCREENSHOTS_DIR, fileName);
67
+ const ok = await captureCResumeIframeToFile(page, savedOriginal, absPath);
68
+ if (!ok) {
69
+ await closeCResumePanel(page);
70
+ throw new Error('在线简历 iframe 截图失败。');
71
+ }
72
+ const disclaimer = '说明:平台对在线简历的每日可查看次数有限,请按需使用、谨慎查看。';
73
+ if (!isResumeOcrEnabled()) {
74
+ return [jobLine, `简历预览截图:${absPath}`, '', disclaimer].join('\n');
75
+ }
76
+ try {
77
+ const ocr = await ocrResumePngToTextFile(absPath);
78
+ return [
79
+ jobLine,
80
+ `简历预览截图:${absPath}`,
81
+ '',
82
+ '在线简历 OCR 正文:',
83
+ '',
84
+ ocr.text,
85
+ '',
86
+ disclaimer,
87
+ ].join('\n');
88
+ }
89
+ catch (e) {
90
+ const msg = e instanceof Error ? e.message : String(e);
91
+ throw new Error(`简历预览截图已保存,但 OCR 失败:${msg}`);
92
+ }
93
+ });
94
+ }
95
+ catch (e) {
96
+ const message = e instanceof Error ? e.message : String(e);
97
+ if (e instanceof Error && e.message.includes('浏览器会话尚未初始化')) {
98
+ throw new Error(createWaitManualLoginRequiredText('简历预览截图'));
99
+ }
100
+ throw new Error(`简历预览失败:${message}`);
101
+ }
102
+ }
103
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/toolset/preview.ts"],"names":[],"mappings":"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"}
@@ -10,13 +10,26 @@ export type RecommendCandidate = {
10
10
  highlights: string[];
11
11
  canGreet: boolean;
12
12
  hasHistoryChat: boolean;
13
+ /** 卡片为灰色「已看过」样式(如 `.candidate-card-wrap.has-viewed` / `.card-inner.has-viewed`) */
14
+ hasViewed: boolean;
13
15
  };
16
+ export declare function isBossChatRecommendUrl(url: string): boolean;
17
+ export declare function selectRecommendJob(frame: Frame, keyword: string): Promise<string>;
14
18
  export declare function ensureInRecommendPage(page: Page): Promise<Frame>;
19
+ /**
20
+ * 供 `preview` 使用:不导航;若当前主页面不在推荐页或未就绪推荐 iframe,直接抛错。
21
+ */
22
+ export declare function assertRecommendPageReadyForPreview(page: Page): Promise<Frame>;
15
23
  export declare function readRecommendList(frame: Frame): Promise<RecommendCandidate[]>;
16
24
  export declare function renderRecommendList(candidates: RecommendCandidate[]): string;
17
25
  export declare function clickGreet(frame: Frame, target: string): Promise<{
18
26
  message: string;
19
27
  }>;
20
28
  export declare function markGreetProduced(before: RecommendCandidate[], after: RecommendCandidate[]): void;
29
+ /**
30
+ * 在推荐 iframe 内根据姓名或序号打开在线简历预览:点击候选人卡片主体 `.card-inner`(与侧栏「打招呼」分离)。
31
+ * 父页随后出现 `c-resume` iframe(如 `source=recommend`)。旧版仅有「在线简历」链接时仍尝试点击链接。
32
+ */
33
+ export declare function openRecommendResumePreview(frame: Frame, target: string): Promise<boolean>;
21
34
  export declare function runRecommend(jobKeyword?: string): Promise<string>;
22
35
  //# sourceMappingURL=recommend.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../src/toolset/recommend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAUlD,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;CACzB,CAAC;AA2JF,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,CAwDnF;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAiD5E;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA2E9B;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,EAAE,EAC5B,KAAK,EAAE,kBAAkB,EAAE,GAC1B,IAAI,CAON;AAED,wBAAsB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBvE"}
1
+ {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../src/toolset/recommend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AASlD,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;AAyCD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDvF;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAWtE;AAED;;GAEG;AACH,wBAAsB,kCAAkC,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAOnF;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,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBvE"}
@@ -1,9 +1,17 @@
1
- import { createWaitManualLoginRequiredText, sleepRandom, withChatPage, } from '../browser/index.js';
1
+ import { sleepRandom } from '../browser/index.js';
2
+ import { createWaitManualLoginRequiredText } from '../common/auth.js';
3
+ import { withBossSessionPage } from '../common/boss_session_page.js';
4
+ import { clickBossSidebarMenuToPath } from '../common/boss_sidebar_nav.js';
2
5
  const BOSS_CHAT_RECOMMEND_URL = 'https://www.zhipin.com/web/chat/recommend';
3
6
  const RECOMMEND_SETTLE_MS = { min: 1400, max: 2400 };
4
7
  /** 会话内记录:通过 greet 新出现的推荐卡片(以 geekId 识别) */
5
8
  const sessionGreetProducedGeekIds = new Set();
6
- function isBossChatRecommendUrl(url) {
9
+ /**
10
+ * 推荐列表里「一张候选人卡片」的根节点(新版 `.candidate-card-wrap` 与旧版 `.card-item` / `.geek-card` 并存)。
11
+ * 在线简历预览:点击卡片主体 `.card-inner`,而非「在线简历」链接或「打招呼」。
12
+ */
13
+ const RECOMMEND_CARD_ROOT_SELECTOR = '.candidate-card-wrap, .card-list .card-item, .geek-list .geek-card';
14
+ export function isBossChatRecommendUrl(url) {
7
15
  try {
8
16
  const u = new URL(url);
9
17
  if (!u.hostname.includes('zhipin.com')) {
@@ -16,38 +24,6 @@ function isBossChatRecommendUrl(url) {
16
24
  return false;
17
25
  }
18
26
  }
19
- async function clickSidebarMenuToPath(page, menuLabel, targetPath) {
20
- const labelLiteral = JSON.stringify(menuLabel);
21
- const pathLiteral = JSON.stringify(targetPath);
22
- const clicked = (await page.evaluate(`(() => {
23
- const label = ${labelLiteral};
24
- const path = ${pathLiteral};
25
- const norm = (v) => (v ?? "").replace(/\\s+/g, "");
26
- const links = Array.from(document.querySelectorAll(".menu-list a"));
27
- const target = links.find((a) => {
28
- const href = a.getAttribute("href") ?? "";
29
- if (href.includes(path)) return true;
30
- const text = norm(a.querySelector(".menu-item-content span")?.textContent ?? a.textContent);
31
- return text.includes(label);
32
- });
33
- if (!(target instanceof HTMLElement)) return false;
34
- target.scrollIntoView({ block: "center", inline: "nearest" });
35
- target.click();
36
- return true;
37
- })()`));
38
- if (!clicked) {
39
- throw new Error(`未找到侧边栏菜单“${menuLabel}”,无法跳转到 ${targetPath}。`);
40
- }
41
- await page.waitForFunction(`(() => {
42
- const path = ${pathLiteral};
43
- try {
44
- const p = window.location.pathname.replace(/\\/+$/g, "") || "/";
45
- return p === path;
46
- } catch {
47
- return false;
48
- }
49
- })()`, { timeout: 15_000 });
50
- }
51
27
  async function getRecommendFrame(page) {
52
28
  await page.waitForSelector('iframe[name="recommendFrame"]', { timeout: 15_000 });
53
29
  const frameByName = page.frames().find((f) => f.name() === 'recommendFrame') ?? null;
@@ -69,6 +45,8 @@ async function getRecommendFrame(page) {
69
45
  }
70
46
  async function ensureRecommendFrameReady(frame) {
71
47
  await frame.waitForFunction(`(() => {
48
+ const sel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
49
+ if (document.querySelector(sel)) return true;
72
50
  const root = document.querySelector(".card-list, .geek-list-wrap .geek-list");
73
51
  return !!root;
74
52
  })()`, { timeout: 15_000 });
@@ -79,7 +57,7 @@ async function readCurrentRecommendJobLabel(frame) {
79
57
  return norm(document.querySelector(".job-selecter-wrap .ui-dropmenu-label")?.textContent);
80
58
  })()`));
81
59
  }
82
- async function selectRecommendJob(frame, keyword) {
60
+ export async function selectRecommendJob(frame, keyword) {
83
61
  const kw = keyword.trim();
84
62
  if (!kw) {
85
63
  return readCurrentRecommendJobLabel(frame);
@@ -135,7 +113,7 @@ async function selectRecommendJob(frame, keyword) {
135
113
  }
136
114
  export async function ensureInRecommendPage(page) {
137
115
  if (!isBossChatRecommendUrl(page.url())) {
138
- await clickSidebarMenuToPath(page, '推荐', '/web/chat/recommend');
116
+ await clickBossSidebarMenuToPath(page, '推荐', '/web/chat/recommend');
139
117
  await sleepRandom(RECOMMEND_SETTLE_MS.min, RECOMMEND_SETTLE_MS.max);
140
118
  }
141
119
  if (!isBossChatRecommendUrl(page.url())) {
@@ -145,14 +123,31 @@ export async function ensureInRecommendPage(page) {
145
123
  await ensureRecommendFrameReady(frame);
146
124
  return frame;
147
125
  }
126
+ /**
127
+ * 供 `preview` 使用:不导航;若当前主页面不在推荐页或未就绪推荐 iframe,直接抛错。
128
+ */
129
+ export async function assertRecommendPageReadyForPreview(page) {
130
+ if (!isBossChatRecommendUrl(page.url())) {
131
+ throw new Error('当前不在推荐列表页或搜索结果页,无法预览候选人。');
132
+ }
133
+ const frame = await getRecommendFrame(page);
134
+ await ensureRecommendFrameReady(frame);
135
+ return frame;
136
+ }
148
137
  export async function readRecommendList(frame) {
149
138
  return (await frame.evaluate(`(() => {
150
139
  const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
151
- const cards = Array.from(
152
- document.querySelectorAll(".card-list .card-item, .geek-list .geek-card"),
153
- );
140
+ const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
141
+ const cards = Array.from(document.querySelectorAll(cardSel));
154
142
  return cards.map((item) => {
155
143
  const inner = item.querySelector(".card-inner") || item;
144
+ const wrap = item.matches(".candidate-card-wrap")
145
+ ? item
146
+ : item.querySelector(".candidate-card-wrap");
147
+ const hasViewed = Boolean(
148
+ (wrap && wrap.classList.contains("has-viewed")) ||
149
+ (inner && inner.classList.contains("has-viewed")),
150
+ );
156
151
  const geekId =
157
152
  inner?.getAttribute("data-geekid") ??
158
153
  inner?.getAttribute("data-geek") ??
@@ -170,9 +165,13 @@ export async function readRecommendList(frame) {
170
165
  norm(item.querySelector(".expect-wrap .join-text-wrap")?.textContent);
171
166
  const experience = norm(item.querySelector(".experience-wrap .join-text-wrap")?.textContent);
172
167
  const advantage = norm(item.querySelector(".geek-desc .content")?.textContent);
173
- const highlights = Array.from(item.querySelectorAll(".operate .labels .label"))
168
+ const highlightLabels = [
169
+ ...Array.from(item.querySelectorAll(".operate .labels .label")),
170
+ ...Array.from(item.querySelectorAll(".tags-wrap .tag-item")),
171
+ ]
174
172
  .map((el) => norm(el.textContent))
175
173
  .filter(Boolean);
174
+ const highlights = [...new Set(highlightLabels)];
176
175
  const greetBtn = item.querySelector(".button-chat-wrap .btn.btn-greet");
177
176
  const btnCls = greetBtn?.className ?? "";
178
177
  const disabled =
@@ -198,6 +197,7 @@ export async function readRecommendList(frame) {
198
197
  highlights,
199
198
  canGreet: !disabled,
200
199
  hasHistoryChat,
200
+ hasViewed,
201
201
  };
202
202
  }).filter((x) => x.name);
203
203
  })()`));
@@ -231,12 +231,13 @@ export function renderRecommendList(candidates) {
231
231
  m.baseInfo ? `信息:${m.baseInfo}` : '',
232
232
  m.expect ? `期望:${m.expect}` : '',
233
233
  m.experience ? `经历:${m.experience}` : '',
234
- m.hasHistoryChat ? '有历史沟通' : '',
234
+ m.hasHistoryChat ? '同事沟通过' : '',
235
235
  m.canGreet ? '可打招呼' : '已打招呼',
236
236
  ]
237
237
  .filter(Boolean)
238
238
  .join('|');
239
- lines.push(` - ${idx + 1}. ${m.name}|${fields}`);
239
+ const nameWithViewed = m.hasViewed ? `${m.name} | 看过` : m.name;
240
+ lines.push(` - ${idx + 1}. ${nameWithViewed}|${fields}`);
240
241
  lines.push(` 优势: ${advantageText}`);
241
242
  });
242
243
  return lines;
@@ -254,9 +255,8 @@ export async function clickGreet(frame, target) {
254
255
  const result = (await frame.evaluate(`(() => {
255
256
  const raw = ${targetLiteral};
256
257
  const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
257
- const cards = Array.from(
258
- document.querySelectorAll(".card-list .card-item, .geek-list .geek-card"),
259
- );
258
+ const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
259
+ const cards = Array.from(document.querySelectorAll(cardSel));
260
260
  if (cards.length === 0) {
261
261
  return { kind: "empty" };
262
262
  }
@@ -325,9 +325,67 @@ export function markGreetProduced(before, after) {
325
325
  }
326
326
  });
327
327
  }
328
+ /**
329
+ * 在推荐 iframe 内根据姓名或序号打开在线简历预览:点击候选人卡片主体 `.card-inner`(与侧栏「打招呼」分离)。
330
+ * 父页随后出现 `c-resume` iframe(如 `source=recommend`)。旧版仅有「在线简历」链接时仍尝试点击链接。
331
+ */
332
+ export async function openRecommendResumePreview(frame, target) {
333
+ const raw = target.trim();
334
+ const targetLiteral = JSON.stringify(raw);
335
+ return (await frame.evaluate(`(() => {
336
+ const raw = ${targetLiteral};
337
+ const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
338
+ const cardSel = ${JSON.stringify(RECOMMEND_CARD_ROOT_SELECTOR)};
339
+ const cards = Array.from(document.querySelectorAll(cardSel));
340
+ if (cards.length === 0) return false;
341
+ const idxNum = Number.parseInt(raw, 10);
342
+ let targetCard = null;
343
+ if (Number.isFinite(idxNum) && idxNum >= 1 && idxNum <= cards.length) {
344
+ targetCard = cards[idxNum - 1];
345
+ } else {
346
+ targetCard = cards.find((item) => {
347
+ const name =
348
+ norm(item.querySelector(".name-wrap .name")?.textContent) ||
349
+ norm(item.querySelector(".name")?.textContent);
350
+ return name === raw || name.includes(raw);
351
+ }) ?? null;
352
+ }
353
+ if (!targetCard) return false;
354
+
355
+ function tryOpen(el) {
356
+ if (!(el instanceof HTMLElement)) return false;
357
+ if (el.classList.contains("disabled")) return false;
358
+ const st = window.getComputedStyle(el);
359
+ if (st.pointerEvents === "none" || Number(st.opacity) < 0.3) return false;
360
+ el.scrollIntoView({ block: "center", inline: "nearest" });
361
+ el.click();
362
+ return true;
363
+ }
364
+
365
+ const inner = targetCard.querySelector(".card-inner");
366
+ if (inner instanceof HTMLElement) {
367
+ inner.scrollIntoView({ block: "center", inline: "nearest" });
368
+ inner.click();
369
+ return true;
370
+ }
371
+
372
+ const resumeOnline = targetCard.querySelector("a.resume-btn-online");
373
+ if (tryOpen(resumeOnline)) return true;
374
+ const hrefResume = targetCard.querySelector('a[href*="c-resume"], a[href*="frame/c-resume"]');
375
+ if (tryOpen(hrefResume)) return true;
376
+
377
+ const links = Array.from(targetCard.querySelectorAll("a, button, .btn")).filter((node) => {
378
+ const t = norm(node.textContent);
379
+ return /在线简历|查看简历|简历预览|预览/.test(t);
380
+ });
381
+ if (links.length > 0 && tryOpen(links[0])) return true;
382
+
383
+ return false;
384
+ })()`));
385
+ }
328
386
  export async function runRecommend(jobKeyword) {
329
387
  try {
330
- return await withChatPage(async (page) => {
388
+ return await withBossSessionPage(async (page) => {
331
389
  const frame = await ensureInRecommendPage(page);
332
390
  const selectedJob = await selectRecommendJob(frame, (jobKeyword ?? '').trim());
333
391
  const candidates = await readRecommendList(frame);
@@ -1 +1 @@
1
- {"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/toolset/recommend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../src/toolset/recommend.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,24 @@
1
- export declare function runBossSearch(): Promise<string>;
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":"AAwLA,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CA2BrD"}
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"}