@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
@@ -1,41 +1,11 @@
1
1
  import { join } from 'node:path';
2
- import { defaultViewportFromEnv, isBossChatIndexUrl, ONLINE_RESUME_IFRAME_APPEAR_MS, ONLINE_RESUME_IFRAME_SETTLE_MS, sleepRandom, } from '../browser/index.js';
2
+ import { ONLINE_RESUME_IFRAME_APPEAR_MS, ONLINE_RESUME_IFRAME_SETTLE_MS, ONLINE_RESUME_IFRAME_WAIT_MAX_MS, sleepRandom, snapshotBossPageViewport, } from '../browser/index.js';
3
+ import { isBossChatIndexUrl } from '../common/auth.js';
4
+ import { closeBossPaywallPopupIfPresent, describeBossPaywallPopupIfPresent, waitForCResumeIframeOrPaywall, } from '../common/boss_paywall_popup.js';
5
+ import { captureCResumeIframeToFile, closeCResumePanel, safeResumeScreenshotFileBase, } from '../common/c_resume_capture.js';
3
6
  import { ensureAppDataLayout, RESUME_SCREENSHOTS_DIR } from '../config.js';
4
7
  import { isResumeOcrEnabled, ocrResumePngToTextFile } from '../ocr/index.js';
5
8
  import { runGetCommunicationHistory } from './chat.js';
6
- /** 在线简历截图前临时拉高的视口高度(CSS px)。可用 `BOSS_RESUME_SCREENSHOT_VIEWPORT_HEIGHT` 覆盖。 */
7
- const ONLINE_RESUME_SNAPSHOT_VIEWPORT_HEIGHT_PX = 5000;
8
- function safeResumeFileBase(name) {
9
- const t = name.replace(/[/\\?%*:|"<>]/g, '_').trim().slice(0, 64);
10
- return t.length > 0 ? t : 'candidate';
11
- }
12
- function viewportForOnlineResumeSnapshot(prev) {
13
- const envH = Number.parseInt(process.env.BOSS_RESUME_SCREENSHOT_VIEWPORT_HEIGHT?.trim() ?? '', 10);
14
- const height = Number.isFinite(envH) && envH > 0 ? envH : ONLINE_RESUME_SNAPSHOT_VIEWPORT_HEIGHT_PX;
15
- const base = defaultViewportFromEnv();
16
- return {
17
- width: prev?.width ?? base.width,
18
- height,
19
- deviceScaleFactor: prev?.deviceScaleFactor ?? 1,
20
- isMobile: prev?.isMobile ?? false,
21
- hasTouch: prev?.hasTouch ?? false,
22
- isLandscape: prev?.isLandscape ?? false,
23
- };
24
- }
25
- function viewportRestoreAfterResumeSnapshot(prev) {
26
- if (prev) {
27
- return prev;
28
- }
29
- const d = defaultViewportFromEnv();
30
- return {
31
- width: d.width,
32
- height: d.height,
33
- deviceScaleFactor: 1,
34
- isMobile: false,
35
- hasTouch: false,
36
- isLandscape: false,
37
- };
38
- }
39
9
  function ensureInCandidateChat(page, actionLabel) {
40
10
  return (async () => {
41
11
  const currentUrl = page.url();
@@ -49,73 +19,58 @@ function ensureInCandidateChat(page, actionLabel) {
49
19
  })();
50
20
  }
51
21
  /**
52
- * 在聊天页右侧操作区执行「不合适」:
53
- * 仅点击入口与底部确认按钮,不选择任何原因。
22
+ * 在聊天页右侧操作区执行「不合适」:该入口依赖 hover 后才响应真实点击,先派发 hover 再点一次。
54
23
  */
55
24
  async function markCandidateNotFitWithoutReason(page) {
56
25
  await ensureInCandidateChat(page, '不合适');
57
- const opened = (await page.evaluate(`(() => {
26
+ const hovered = (await page.evaluate(`(() => {
58
27
  const norm = (v) => (v ?? "").replace(/\\s+/g, "").trim();
28
+ function fireHover(el) {
29
+ if (!(el instanceof HTMLElement)) return;
30
+ const r = el.getBoundingClientRect();
31
+ const cx = r.left + r.width / 2;
32
+ const cy = r.top + r.height / 2;
33
+ ["mouseover", "mouseenter", "mousemove"].forEach((type) => {
34
+ el.dispatchEvent(
35
+ new MouseEvent(type, { bubbles: true, cancelable: true, clientX: cx, clientY: cy, view: window }),
36
+ );
37
+ });
38
+ }
59
39
  const roots = Array.from(document.querySelectorAll(".operate-exchange-right .operate-icon-item, .operate-icon-item"));
60
40
  const target = roots.find((el) => {
61
41
  const t = norm(el.querySelector(".operate-btn")?.textContent || el.textContent || "");
62
42
  return t.includes("不合适");
63
43
  });
64
44
  if (!target) return false;
45
+ target.scrollIntoView({ block: "center", inline: "nearest" });
46
+ fireHover(target);
65
47
  const btn = target.querySelector(".operate-btn");
66
- const host = btn || target;
67
- host.scrollIntoView({ block: "center", inline: "nearest" });
68
- host.click();
48
+ if (btn instanceof HTMLElement) fireHover(btn);
69
49
  return true;
70
50
  })()`));
71
- if (!opened) {
51
+ if (!hovered) {
72
52
  throw new Error('未找到“不合适”按钮,无法执行操作。');
73
53
  }
74
- await sleepRandom(260, 620);
75
- const confirmed = (await page.evaluate(`(() => {
76
- function norm(v) {
77
- return (v ?? "").replace(/\\s+/g, "").trim();
78
- }
79
- function isVisible(el) {
80
- if (!(el instanceof HTMLElement)) return false;
81
- const st = window.getComputedStyle(el);
82
- if (st.display === "none" || st.visibility === "hidden") return false;
83
- const r = el.getBoundingClientRect();
84
- return r.width > 0 && r.height > 0;
85
- }
86
- const wrappers = Array.from(document.querySelectorAll(".not-fit-wrap"))
87
- .filter((el) => isVisible(el) && !!el.querySelector(".main-content"));
88
- if (wrappers.length === 0) return false;
89
- const wrapper = wrappers[wrappers.length - 1];
90
- const candidates = Array.from(
91
- wrapper.querySelectorAll(
92
- ".boss-btn-primary, .boss-btn, button, .footer .btn, .bottom .btn, .submit-btn, .confirm-btn",
93
- ),
94
- ).filter((el) => isVisible(el));
95
- if (candidates.length === 0) return false;
96
-
97
- const preferred = candidates.filter((el) => {
98
- const t = norm(el.textContent);
99
- return (
100
- t.includes("确定") ||
101
- t.includes("确认") ||
102
- t.includes("提交") ||
103
- t.includes("完成") ||
104
- t.includes("不合适")
105
- );
54
+ await sleepRandom(200, 450);
55
+ const clicked = (await page.evaluate(`(() => {
56
+ const norm = (v) => (v ?? "").replace(/\\s+/g, "").trim();
57
+ const roots = Array.from(document.querySelectorAll(".operate-exchange-right .operate-icon-item, .operate-icon-item"));
58
+ const target = roots.find((el) => {
59
+ const t = norm(el.querySelector(".operate-btn")?.textContent || el.textContent || "");
60
+ return t.includes("不合适");
106
61
  });
107
- const pool = preferred.length > 0 ? preferred : candidates;
108
- pool.sort((a, b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top);
109
- const target = pool[pool.length - 1];
110
- target.scrollIntoView({ block: "center", inline: "nearest" });
111
- target.click();
62
+ if (!target) return false;
63
+ const btn = target.querySelector(".operate-btn");
64
+ const host = btn instanceof HTMLElement ? btn : target;
65
+ host.scrollIntoView({ block: "center", inline: "nearest" });
66
+ host.click();
112
67
  return true;
113
68
  })()`));
114
- if (!confirmed) {
115
- throw new Error('已点击“不合适”,但未找到底部确认按钮。');
69
+ if (!clicked) {
70
+ throw new Error('未找到“不合适”按钮,无法执行点击。');
116
71
  }
117
- await sleepRandom(320, 880);
118
- return '已标记为不合适(未选择原因,已点击底部确认按钮)。';
72
+ await sleepRandom(320, 780);
73
+ return '已点击「不合适」。';
119
74
  }
120
75
  /** 在聊天页右侧操作区点击「换微信」。 */
121
76
  async function runExchangeWechat(page) {
@@ -147,7 +102,7 @@ async function runExchangeWechat(page) {
147
102
  const target = items.find((el) => norm(el.querySelector(".operate-btn")?.textContent).includes("换微信"));
148
103
  if (!target) return false;
149
104
  const btn = target.querySelector(".operate-btn");
150
- const host = btn || target;
105
+ const host = btn instanceof HTMLElement ? btn : target;
151
106
  host.scrollIntoView({ block: "center", inline: "nearest" });
152
107
  host.click();
153
108
  return true;
@@ -155,8 +110,144 @@ async function runExchangeWechat(page) {
155
110
  if (!clicked) {
156
111
  throw new Error('点击“换微信”失败,请确认当前会话是否仍处于可操作状态。');
157
112
  }
158
- await sleepRandom(320, 860);
159
- return '已点击“换微信”。';
113
+ await sleepRandom(280, 520);
114
+ await page.waitForFunction(`(() => {
115
+ function isVisible(el) {
116
+ if (!(el instanceof HTMLElement)) return false;
117
+ const st = window.getComputedStyle(el);
118
+ if (st.display === "none" || st.visibility === "hidden") return false;
119
+ const r = el.getBoundingClientRect();
120
+ return r.width > 0 && r.height > 0;
121
+ }
122
+ const tips = Array.from(document.querySelectorAll(".exchange-tooltip"));
123
+ for (const tip of tips) {
124
+ if (!isVisible(tip)) continue;
125
+ const raw = (tip.textContent ?? "").replace(/\\s+/g, "");
126
+ if (!raw.includes("交换微信")) continue;
127
+ const primary = tip.querySelector(".btn-box .boss-btn-primary");
128
+ return primary instanceof HTMLElement;
129
+ }
130
+ return false;
131
+ })()`, { timeout: 12_000 });
132
+ const confirmed = (await page.evaluate(`(() => {
133
+ function isVisible(el) {
134
+ if (!(el instanceof HTMLElement)) return false;
135
+ const st = window.getComputedStyle(el);
136
+ if (st.display === "none" || st.visibility === "hidden") return false;
137
+ const r = el.getBoundingClientRect();
138
+ return r.width > 0 && r.height > 0;
139
+ }
140
+ function norm(v) {
141
+ return (v ?? "").replace(/\\s+/g, "").trim();
142
+ }
143
+ const tips = Array.from(document.querySelectorAll(".exchange-tooltip"));
144
+ for (const tip of tips) {
145
+ if (!isVisible(tip)) continue;
146
+ if (!norm(tip.textContent).includes("交换微信")) continue;
147
+ const primary = tip.querySelector(".btn-box .boss-btn-primary.boss-btn, .btn-box .boss-btn-primary");
148
+ if (!(primary instanceof HTMLElement)) continue;
149
+ if (!norm(primary.textContent).includes("确定")) continue;
150
+ primary.scrollIntoView({ block: "center", inline: "nearest" });
151
+ primary.click();
152
+ return true;
153
+ }
154
+ return false;
155
+ })()`));
156
+ if (!confirmed) {
157
+ throw new Error('已弹出交换微信确认框,但未点到「确定」按钮。');
158
+ }
159
+ await sleepRandom(320, 780);
160
+ return '已点击「换微信」并在弹窗中确认。';
161
+ }
162
+ /**
163
+ * 在聊天页左侧工具栏点击「求简历」,并在确认弹窗中点「确定」。
164
+ * 平台规则:双方需各至少发送一条消息后该入口才可点;否则按钮为禁用态。
165
+ */
166
+ async function runRequestAttachmentResume(page) {
167
+ await ensureInCandidateChat(page, '求简历');
168
+ const availability = (await page.evaluate(`(() => {
169
+ const norm = (v) => (v ?? "").replace(/\\s+/g, "");
170
+ const items = Array.from(
171
+ document.querySelectorAll(".operate-exchange-left .operate-icon-item, .operate-icon-item"),
172
+ );
173
+ const target = items.find((el) => norm(el.querySelector(".operate-btn")?.textContent).includes("求简历"));
174
+ if (!target) return { found: false, available: false };
175
+ const btn = target.querySelector(".operate-btn");
176
+ const className = [target.className ?? "", btn?.className ?? ""].join(" ");
177
+ const disabled = /disabled|forbid|ban/i.test(className) || btn?.getAttribute("disabled") !== null;
178
+ return { found: true, available: !disabled };
179
+ })()`));
180
+ if (!availability.found) {
181
+ throw new Error('未找到「求简历」按钮,当前页面可能不支持该操作。');
182
+ }
183
+ if (!availability.available) {
184
+ throw new Error('当前「求简历」不可用。Boss 要求双方各至少发送一条消息后才可以向对方请求附件简历,请先与对方互发消息后再试。');
185
+ }
186
+ await sleepRandom(220, 620);
187
+ const clicked = (await page.evaluate(`(() => {
188
+ const norm = (v) => (v ?? "").replace(/\\s+/g, "");
189
+ const items = Array.from(
190
+ document.querySelectorAll(".operate-exchange-left .operate-icon-item, .operate-icon-item"),
191
+ );
192
+ const target = items.find((el) => norm(el.querySelector(".operate-btn")?.textContent).includes("求简历"));
193
+ if (!target) return false;
194
+ const btn = target.querySelector(".operate-btn");
195
+ const host = btn instanceof HTMLElement ? btn : target;
196
+ host.scrollIntoView({ block: "center", inline: "nearest" });
197
+ host.click();
198
+ return true;
199
+ })()`));
200
+ if (!clicked) {
201
+ throw new Error('点击「求简历」失败,请确认当前会话是否仍处于可操作状态。');
202
+ }
203
+ await sleepRandom(280, 520);
204
+ await page.waitForFunction(`(() => {
205
+ function isVisible(el) {
206
+ if (!(el instanceof HTMLElement)) return false;
207
+ const st = window.getComputedStyle(el);
208
+ if (st.display === "none" || st.visibility === "hidden") return false;
209
+ const r = el.getBoundingClientRect();
210
+ return r.width > 0 && r.height > 0;
211
+ }
212
+ const tips = Array.from(document.querySelectorAll(".exchange-tooltip"));
213
+ for (const tip of tips) {
214
+ if (!isVisible(tip)) continue;
215
+ const raw = (tip.textContent ?? "").replace(/\\s+/g, "");
216
+ if (!raw.includes("请求简历")) continue;
217
+ const primary = tip.querySelector(".btn-box .boss-btn-primary");
218
+ return primary instanceof HTMLElement;
219
+ }
220
+ return false;
221
+ })()`, { timeout: 12_000 });
222
+ const confirmed = (await page.evaluate(`(() => {
223
+ function isVisible(el) {
224
+ if (!(el instanceof HTMLElement)) return false;
225
+ const st = window.getComputedStyle(el);
226
+ if (st.display === "none" || st.visibility === "hidden") return false;
227
+ const r = el.getBoundingClientRect();
228
+ return r.width > 0 && r.height > 0;
229
+ }
230
+ function norm(v) {
231
+ return (v ?? "").replace(/\\s+/g, "").trim();
232
+ }
233
+ const tips = Array.from(document.querySelectorAll(".exchange-tooltip"));
234
+ for (const tip of tips) {
235
+ if (!isVisible(tip)) continue;
236
+ if (!norm(tip.textContent).includes("请求简历")) continue;
237
+ const primary = tip.querySelector(".btn-box .boss-btn-primary.boss-btn, .btn-box .boss-btn-primary");
238
+ if (!(primary instanceof HTMLElement)) continue;
239
+ if (!norm(primary.textContent).includes("确定")) continue;
240
+ primary.scrollIntoView({ block: "center", inline: "nearest" });
241
+ primary.click();
242
+ return true;
243
+ }
244
+ return false;
245
+ })()`));
246
+ if (!confirmed) {
247
+ throw new Error('已弹出求简历确认框,但未点到「确定」按钮。');
248
+ }
249
+ await sleepRandom(320, 780);
250
+ return '已点击「求简历」并在弹窗中确认(将发送默认话术「方便发一份你的简历过来吗?」)。';
160
251
  }
161
252
  /**
162
253
  * 在聊天页通过「更多 -> 备注」更新候选人备注,并点击确认保存。
@@ -272,36 +363,6 @@ async function updateCandidateRemark(page, remarkText) {
272
363
  await sleepRandom(220, 580);
273
364
  return `已更新备注: ${nextRemark}`;
274
365
  }
275
- async function closeOnlineResumePanel(page) {
276
- try {
277
- await page.evaluate(() => {
278
- const wraps = Array.from(document.querySelectorAll('.boss-popup__wrapper'));
279
- for (const w of wraps) {
280
- if (w.querySelector('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]')) {
281
- const c = w.querySelector('.boss-popup__close');
282
- if (c) {
283
- c.click();
284
- return;
285
- }
286
- }
287
- }
288
- const iframe = document.querySelector('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]');
289
- let node = iframe?.parentElement ?? null;
290
- for (let i = 0; i < 12 && node; i++) {
291
- const c = node.querySelector('.boss-popup__close, .drawer-close, .icon-close');
292
- if (c) {
293
- c.click();
294
- return;
295
- }
296
- node = node.parentElement;
297
- }
298
- });
299
- await sleepRandom(200, 450);
300
- }
301
- catch {
302
- /* ignore */
303
- }
304
- }
305
366
  /**
306
367
  * 对方「附件简历」确认卡片上点击「同意」。
307
368
  * 对应按钮 disabled 时视为已处理。
@@ -377,11 +438,11 @@ async function getCandidateLabelForResumeShot(page) {
377
438
  * 点击「在线简历」,对 `iframe` 元素整框截图(含视口外部分,见 `captureBeyondViewport`)。
378
439
  * 不依赖 `contentFrame()`,与内页是否 canvas / 跨域无关。
379
440
  *
380
- * 进入前记录 `page.viewport()`,截图前临时 `setViewport` 拉高(默认高度 5000),结束后恢复。
441
+ * 进入前记录视口(`snapshotBossPageViewport`,见 {@link captureCResumeIframeToFile})。
381
442
  */
382
443
  async function captureOnlineResumeScreenshot(page, candidateLabel) {
383
444
  ensureAppDataLayout();
384
- const savedViewport = await page.viewport();
445
+ const savedViewport = await snapshotBossPageViewport(page);
385
446
  const opened = await page.evaluate(() => {
386
447
  const a = document.querySelector('a.resume-btn-online');
387
448
  if (!a || a.classList.contains('disabled'))
@@ -394,46 +455,24 @@ async function captureOnlineResumeScreenshot(page, candidateLabel) {
394
455
  return null;
395
456
  }
396
457
  await sleepRandom(ONLINE_RESUME_IFRAME_APPEAR_MS.min, ONLINE_RESUME_IFRAME_APPEAR_MS.max);
397
- const hasIframe = await page
398
- .waitForSelector('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]', { timeout: 22_000 })
399
- .catch(() => null);
400
- if (!hasIframe) {
458
+ const outcome = await waitForCResumeIframeOrPaywall(page, ONLINE_RESUME_IFRAME_WAIT_MAX_MS);
459
+ if (outcome !== 'iframe') {
460
+ const paywall = await describeBossPaywallPopupIfPresent(page);
461
+ await closeBossPaywallPopupIfPresent(page);
462
+ if (paywall) {
463
+ throw new Error(paywall);
464
+ }
401
465
  return null;
402
466
  }
403
467
  await sleepRandom(ONLINE_RESUME_IFRAME_SETTLE_MS.min, ONLINE_RESUME_IFRAME_SETTLE_MS.max);
404
- const fileName = `online-resume-${safeResumeFileBase(candidateLabel)}-${Date.now()}.png`;
468
+ const fileName = `online-resume-${safeResumeScreenshotFileBase(candidateLabel)}-${Date.now()}.png`;
405
469
  const absPath = join(RESUME_SCREENSHOTS_DIR, fileName);
406
- try {
407
- await page.setViewport(viewportForOnlineResumeSnapshot(savedViewport));
408
- await sleepRandom(100, 320);
409
- const iframe = await page.$('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]');
410
- if (!iframe) {
411
- return null;
412
- }
413
- await iframe.evaluate((el) => {
414
- el.scrollIntoView({ block: 'start', inline: 'nearest' });
415
- });
416
- const box = await iframe.boundingBox();
417
- if (!box) {
418
- await iframe.dispose();
419
- return null;
420
- }
421
- try {
422
- await iframe.screenshot({
423
- path: absPath,
424
- type: 'png',
425
- captureBeyondViewport: true,
426
- });
427
- }
428
- finally {
429
- await iframe.dispose();
430
- }
431
- await closeOnlineResumePanel(page);
432
- return absPath;
433
- }
434
- finally {
435
- await page.setViewport(viewportRestoreAfterResumeSnapshot(savedViewport));
470
+ const ok = await captureCResumeIframeToFile(page, savedViewport, absPath);
471
+ if (!ok) {
472
+ await closeCResumePanel(page);
473
+ return null;
436
474
  }
475
+ return absPath;
437
476
  }
438
477
  export async function runChatActionOnCurrentConversation(page, options) {
439
478
  const action = options.action;
@@ -463,6 +502,8 @@ export async function runChatActionOnCurrentConversation(page, options) {
463
502
  }
464
503
  case 'agree-resume':
465
504
  return runIncomingResumeCardAction(page, 'agree');
505
+ case 'request-attachment-resume':
506
+ return runRequestAttachmentResume(page);
466
507
  case 'exchange-wechat':
467
508
  return runExchangeWechat(page);
468
509
  case 'history':
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/toolset/action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,EAClB,8BAA8B,EAC9B,8BAA8B,EAC9B,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAEvD,+EAA+E;AAC/E,MAAM,yCAAyC,GAAG,IAAI,CAAC;AAGvD,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACxC,CAAC;AAED,SAAS,+BAA+B,CACtC,IAA2C;IAE3C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACnG,MAAM,MAAM,GACV,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,yCAAyC,CAAC;IACvF,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;IACtC,OAAO;QACL,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK;QAChC,MAAM;QACN,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,IAAI,CAAC;QAC/C,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK;QACjC,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK;QACjC,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,KAAK;KACxC,CAAC;AACJ,CAAC;AAED,SAAS,kCAAkC,CACzC,IAA2C;IAE3C,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,GAAG,sBAAsB,EAAE,CAAC;IACnC,OAAO;QACL,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,iBAAiB,EAAE,CAAC;QACpB,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAU,EAAE,WAAmB;IAC5D,OAAO,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC;QACpE,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,oBAAoB,WAAW,MAAM,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,gCAAgC,CAAC,IAAU;IACxD,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;;OAa/B,CAAC,CAAY,CAAC;IACnB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsClC,CAAC,CAAY,CAAC;IACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,2BAA2B,CAAC;AACrC,CAAC;AAED,wBAAwB;AACxB,KAAK,UAAU,iBAAiB,CAAC,IAAU;IACzC,MAAM,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEzC,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;OAWrC,CAAC,CAA2C,CAAC;IAClD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE5B,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;OAYhC,CAAC,CAAY,CAAC;IACnB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAAC,IAAU,EAAE,UAAkB;IACjE,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,UAAU,UAAU,CAAC,MAAM,eAAe,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAExC,MAAM,cAAc,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;OAiBvC,CAAC,CAAY,CAAC;IACnB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE5B,MAAM,iBAAiB,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;OAsB1C,CAAC,CAAY,CAAC;IACnB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,WAAW,GACf,8EAA8E;QAC9E,2EAA2E,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE5B,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC9B,MAAM,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,WAAW,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACxD,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE5B,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CACnC;;;;OAIG,EACH,WAAW,EACX,UAAU,CACX,CAAY,CAAC;IACd,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;OAsBlC,CAAC,CAAY,CAAC;IACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,UAAU,UAAU,EAAE,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,IAAU;IAC9C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC5E,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC,CAAC,aAAa,CAAC,wDAAwD,CAAC,EAAE,CAAC;oBAC9E,MAAM,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;oBAChD,IAAI,CAAC,EAAE,CAAC;wBACL,CAAiB,CAAC,KAAK,EAAE,CAAC;wBAC3B,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CACnC,wDAAwD,CACzD,CAAC;YACF,IAAI,IAAI,GAAmB,MAAM,EAAE,aAAa,IAAI,IAAI,CAAC;YACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,gDAAgD,CAAC,CAAC;gBAC/E,IAAI,CAAC,EAAE,CAAC;oBACL,CAAiB,CAAC,KAAK,EAAE,CAAC;oBAC3B,OAAO;gBACT,CAAC;gBACD,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,2BAA2B,CAAC,IAAU,EAAE,KAAsB;IAC3E,MAAM,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5C,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE5B,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAqB,EAAE,EAAE;QAC5D,SAAS,IAAI,CAAC,CAA4B;YACxC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QACD,SAAS,aAAa,CAAC,EAAW;YAChC,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC;YAC/B,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClD,IAAI,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACtD,MAAM,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACvC,OAAO,EAAE,CAAC,aAAa,KAAK,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;QAClE,CAAC;QACD,SAAS,YAAY,CAAC,CAAS,EAAE,IAAY;YAC3C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,kCAAkC,CAAC,CAAC,CAAC;QACxF,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM;gBAAE,SAAS;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,WAAW,CAAC,CAAC;YACjF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAAE,SAAS;YACrD,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,iCAAiC,CAAC,CAAC;YAC3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACvB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAChC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;oBAAE,SAAS;gBAClC,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC/C,CAAC;gBACA,GAAmB,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC3E,GAAmB,CAAC,KAAK,EAAE,CAAC;gBAC7B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACzC,CAAC,EAAE,KAAK,CAAC,CAGwC,CAAC;IAElD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,KAAK,KAAK,OAAO;YAC7B,CAAC,CAAC,0BAA0B;YAC5B,CAAC,CAAC,0BAA0B,CAAC;IACjC,CAAC;IACD,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC,KAAK,KAAK,OAAO;QAC7B,CAAC,CAAC,sBAAsB;QACxB,CAAC,CAAC,qBAAqB,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,8BAA8B,CAAC,IAAU;IACtD,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC;;;;OAI7B,CAAC,CAAW,CAAC;IAClB,OAAO,IAAI,IAAI,WAAW,CAAC;AAC7B,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,6BAA6B,CAAC,IAAU,EAAE,cAAsB;IAC7E,mBAAmB,EAAE,CAAC;IAEtB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IAE5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QACtC,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,qBAAqB,CAA6B,CAAC;QACpF,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QACzD,CAAC,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC,CAAC,KAAK,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,CAAC,8BAA8B,CAAC,GAAG,EAAE,8BAA8B,CAAC,GAAG,CAAC,CAAC;IAE1F,MAAM,SAAS,GAAG,MAAM,IAAI;SACzB,eAAe,CAAC,wDAAwD,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAC9F,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACrB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,CAAC,8BAA8B,CAAC,GAAG,EAAE,8BAA8B,CAAC,GAAG,CAAC,CAAC;IAE1F,MAAM,QAAQ,GAAG,iBAAiB,kBAAkB,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IACzF,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,WAAW,CAAC,+BAA+B,CAAC,aAAa,CAAC,CAAC,CAAC;QACvE,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,wDAAwD,CAAC,CAAC;QACtF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE;YAC1B,EAAkB,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,UAAU,CAAC;gBACtB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,KAAK;gBACX,qBAAqB,EAAE,IAAI;aAC5B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,OAAO,CAAC;IACjB,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,WAAW,CAAC,kCAAkC,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,kCAAkC,CACtD,IAAU,EACV,OAAoD;IAEpD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,gCAAgC,CAAC,IAAI,CAAC,CAAC;QAChD,KAAK,QAAQ;YACX,OAAO,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC3D,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1C,MAAM,cAAc,GAAG,MAAM,8BAA8B,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,cAAc,GAAG,MAAM,6BAA6B,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YACjF,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YACD,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;gBAC1B,OAAO,iBAAiB,cAAc,EAAE,CAAC;YAC3C,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,sBAAsB,CAAC,cAAc,CAAC,CAAC;gBACzD,OAAO,8BAA8B,GAAG,CAAC,IAAI,EAAE,CAAC;YAClD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,KAAK,cAAc;YACjB,OAAO,2BAA2B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,KAAK,iBAAiB;YACpB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,EAAE,GAAU,MAAM,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/toolset/action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Page } from 'puppeteer-core';
2
+ /** 截图文件名安全段(在线简历 / 推荐预览共用) */
3
+ export declare function safeResumeScreenshotFileBase(name: string): string;
4
+ /** 关闭含 `c-resume` iframe 的弹层(聊天「在线简历」与推荐「预览」共用)。 */
5
+ export declare function closeCResumePanel(page: Page): Promise<void>;
6
+ /**
7
+ * 在已出现 `c-resume` iframe 的页面上,对 iframe 整框截图并关闭弹层。
8
+ * `preOpenViewport` 为打开弹层前 `page.viewport()` 的快照(与在线简历截图一致)。
9
+ */
10
+ export declare function captureCResumeIframeToFile(page: Page, preOpenViewport: Awaited<ReturnType<Page['viewport']>>, absPath: string): Promise<boolean>;
11
+ //# sourceMappingURL=c_resume_capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c_resume_capture.d.ts","sourceRoot":"","sources":["../../src/toolset/c_resume_capture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAI3C,8BAA8B;AAC9B,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjE;AAED,oDAAoD;AACpD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BjE;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EACtD,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAmClB"}
@@ -0,0 +1,76 @@
1
+ import { sleepRandom } from '../browser/timing.js';
2
+ import { resumeHeight, setTempHeight } from '../browser/viewport_temp.js';
3
+ /** 截图文件名安全段(在线简历 / 推荐预览共用) */
4
+ export function safeResumeScreenshotFileBase(name) {
5
+ const t = name.replace(/[/\\?%*:|"<>]/g, '_').trim().slice(0, 64);
6
+ return t.length > 0 ? t : 'candidate';
7
+ }
8
+ /** 关闭含 `c-resume` iframe 的弹层(聊天「在线简历」与推荐「预览」共用)。 */
9
+ export async function closeCResumePanel(page) {
10
+ try {
11
+ await page.evaluate(() => {
12
+ const wraps = Array.from(document.querySelectorAll('.boss-popup__wrapper'));
13
+ for (const w of wraps) {
14
+ if (w.querySelector('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]')) {
15
+ const c = w.querySelector('.boss-popup__close');
16
+ if (c) {
17
+ c.click();
18
+ return;
19
+ }
20
+ }
21
+ }
22
+ const iframe = document.querySelector('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]');
23
+ let node = iframe?.parentElement ?? null;
24
+ for (let i = 0; i < 12 && node; i++) {
25
+ const c = node.querySelector('.boss-popup__close, .drawer-close, .icon-close');
26
+ if (c) {
27
+ c.click();
28
+ return;
29
+ }
30
+ node = node.parentElement;
31
+ }
32
+ });
33
+ await sleepRandom(200, 450);
34
+ }
35
+ catch {
36
+ /* ignore */
37
+ }
38
+ }
39
+ /**
40
+ * 在已出现 `c-resume` iframe 的页面上,对 iframe 整框截图并关闭弹层。
41
+ * `preOpenViewport` 为打开弹层前 `page.viewport()` 的快照(与在线简历截图一致)。
42
+ */
43
+ export async function captureCResumeIframeToFile(page, preOpenViewport, absPath) {
44
+ try {
45
+ await setTempHeight(page, preOpenViewport);
46
+ await sleepRandom(100, 320);
47
+ const iframe = await page.$('iframe[src*="c-resume"], iframe[src*="frame/c-resume"]');
48
+ if (!iframe) {
49
+ return false;
50
+ }
51
+ await iframe.evaluate((el) => {
52
+ el.scrollIntoView({ block: 'start', inline: 'nearest' });
53
+ });
54
+ const box = await iframe.boundingBox();
55
+ if (!box) {
56
+ await iframe.dispose();
57
+ return false;
58
+ }
59
+ try {
60
+ await iframe.screenshot({
61
+ path: absPath,
62
+ type: 'png',
63
+ captureBeyondViewport: true,
64
+ });
65
+ }
66
+ finally {
67
+ await iframe.dispose();
68
+ }
69
+ await closeCResumePanel(page);
70
+ return true;
71
+ }
72
+ finally {
73
+ await resumeHeight(page, preOpenViewport);
74
+ }
75
+ }
76
+ //# sourceMappingURL=c_resume_capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c_resume_capture.js","sourceRoot":"","sources":["../../src/toolset/c_resume_capture.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/toolset/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAwI3C,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB5E;AA6FD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,UAAO,GACX,OAAO,CAAC,MAAM,CAAC,CAuPjB"}
1
+ {"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/toolset/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAyI3C,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB5E;AA6FD,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,UAAO,GACX,OAAO,CAAC,MAAM,CAAC,CAuPjB"}
@@ -1,4 +1,6 @@
1
- import { CHAT_HISTORY_DIALOG_WAIT_MS, CHAT_HISTORY_TAB_SWITCH_MS, isBossChatIndexUrl, MOUSE_CLICK_PRESS_MS, OPEN_CHAT_AFTER_ROW_CLICK_MS, OPEN_CHAT_SCROLL_GAP_MS, randomIntInclusive, sleepRandom, } from '../browser/index.js';
1
+ import { CHAT_HISTORY_DIALOG_WAIT_MS, CHAT_HISTORY_TAB_SWITCH_MS, MOUSE_CLICK_PRESS_MS, OPEN_CHAT_AFTER_ROW_CLICK_MS, OPEN_CHAT_SCROLL_GAP_MS, randomIntInclusive, sleepRandom, } from '../browser/index.js';
2
+ import { isBossChatIndexUrl } from '../common/auth.js';
3
+ import { ensureChatIndexAllFilter } from './list.js';
2
4
  function chatRoleTag(from) {
3
5
  switch (from) {
4
6
  case 'friend':
@@ -213,9 +215,9 @@ async function fetchCandidateSummary(page) {
213
215
  export async function runOpenCandidateChat(page, candidateName, exact = true) {
214
216
  const targetName = candidateName.trim();
215
217
  try {
216
- const currentUrl = page.url();
217
- if (!isBossChatIndexUrl(currentUrl)) {
218
- throw new Error('请先进入聊天列表页(/web/chat/index)再打开候选人聊天。');
218
+ await ensureChatIndexAllFilter(page);
219
+ if (!isBossChatIndexUrl(page.url())) {
220
+ throw new Error('当前不在沟通列表页(/web/chat/index),无法打开候选人聊天。');
219
221
  }
220
222
  const norm = (v) => (v ?? '').replace(/\s+/g, ' ').trim();
221
223
  const matcher = (value) => exact ? value === targetName : value.includes(targetName);