@joohw/boss-cli 0.4.0 → 0.5.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 (115) hide show
  1. package/README.md +170 -172
  2. package/dist/browser/agent_operating_indicator.js +51 -51
  3. package/dist/browser/human_delay.d.ts +2 -0
  4. package/dist/browser/human_delay.d.ts.map +1 -1
  5. package/dist/browser/human_delay.js +4 -0
  6. package/dist/browser/human_delay.js.map +1 -1
  7. package/dist/cli/cliRouter.d.ts.map +1 -1
  8. package/dist/cli/cliRouter.js +56 -43
  9. package/dist/cli/cliRouter.js.map +1 -1
  10. package/dist/cli/version.d.ts +22 -0
  11. package/dist/cli/version.d.ts.map +1 -1
  12. package/dist/cli/version.js +127 -6
  13. package/dist/cli/version.js.map +1 -1
  14. package/dist/common/auth.js +49 -49
  15. package/dist/common/boss_paywall_popup.js +87 -87
  16. package/dist/common/boss_session_lock.d.ts.map +1 -1
  17. package/dist/common/boss_session_lock.js +7 -1
  18. package/dist/common/boss_session_lock.js.map +1 -1
  19. package/dist/common/boss_session_page.d.ts +2 -2
  20. package/dist/common/boss_session_page.d.ts.map +1 -1
  21. package/dist/common/boss_session_page.js +18 -29
  22. package/dist/common/boss_session_page.js.map +1 -1
  23. package/dist/common/boss_sidebar_nav.js +25 -26
  24. package/dist/common/boss_sidebar_nav.js.map +1 -1
  25. package/dist/common/c_resume_capture.d.ts +1 -0
  26. package/dist/common/c_resume_capture.d.ts.map +1 -1
  27. package/dist/common/c_resume_capture.js +69 -32
  28. package/dist/common/c_resume_capture.js.map +1 -1
  29. package/dist/ocr/resume_ocr.d.ts.map +1 -1
  30. package/dist/ocr/resume_ocr.js +4 -1
  31. package/dist/ocr/resume_ocr.js.map +1 -1
  32. package/dist/toolset/action.d.ts.map +1 -1
  33. package/dist/toolset/action.js +11 -7
  34. package/dist/toolset/action.js.map +1 -1
  35. package/dist/toolset/chat.d.ts.map +1 -1
  36. package/dist/toolset/chat.js +246 -230
  37. package/dist/toolset/chat.js.map +1 -1
  38. package/dist/toolset/deep-search.d.ts.map +1 -1
  39. package/dist/toolset/deep-search.js +289 -265
  40. package/dist/toolset/deep-search.js.map +1 -1
  41. package/dist/toolset/greet.d.ts.map +1 -1
  42. package/dist/toolset/greet.js +1 -6
  43. package/dist/toolset/greet.js.map +1 -1
  44. package/dist/toolset/jd.d.ts.map +1 -1
  45. package/dist/toolset/jd.js +132 -136
  46. package/dist/toolset/jd.js.map +1 -1
  47. package/dist/toolset/list.d.ts.map +1 -1
  48. package/dist/toolset/list.js +52 -45
  49. package/dist/toolset/list.js.map +1 -1
  50. package/dist/toolset/preview.d.ts.map +1 -1
  51. package/dist/toolset/preview.js +6 -8
  52. package/dist/toolset/preview.js.map +1 -1
  53. package/dist/toolset/recommend.d.ts.map +1 -1
  54. package/dist/toolset/recommend.js +222 -196
  55. package/dist/toolset/recommend.js.map +1 -1
  56. package/dist/toolset/send.d.ts.map +1 -1
  57. package/dist/toolset/send.js +6 -9
  58. package/dist/toolset/send.js.map +1 -1
  59. package/package.json +65 -65
  60. package/dist/browser/auth.d.ts +0 -33
  61. package/dist/browser/auth.d.ts.map +0 -1
  62. package/dist/browser/auth.js +0 -137
  63. package/dist/browser/auth.js.map +0 -1
  64. package/dist/browser/c_resume_capture.d.ts +0 -11
  65. package/dist/browser/c_resume_capture.d.ts.map +0 -1
  66. package/dist/browser/c_resume_capture.js +0 -76
  67. package/dist/browser/c_resume_capture.js.map +0 -1
  68. package/dist/browser/chat.d.ts +0 -7
  69. package/dist/browser/chat.d.ts.map +0 -1
  70. package/dist/browser/chat.js +0 -155
  71. package/dist/browser/chat.js.map +0 -1
  72. package/dist/browser/withLoggedInPage.d.ts +0 -7
  73. package/dist/browser/withLoggedInPage.d.ts.map +0 -1
  74. package/dist/browser/withLoggedInPage.js +0 -19
  75. package/dist/browser/withLoggedInPage.js.map +0 -1
  76. package/dist/facebook-cli/index.d.ts +0 -2
  77. package/dist/facebook-cli/index.d.ts.map +0 -1
  78. package/dist/facebook-cli/index.js +0 -2
  79. package/dist/facebook-cli/index.js.map +0 -1
  80. package/dist/toolset/c_resume_capture.d.ts +0 -11
  81. package/dist/toolset/c_resume_capture.d.ts.map +0 -1
  82. package/dist/toolset/c_resume_capture.js +0 -76
  83. package/dist/toolset/c_resume_capture.js.map +0 -1
  84. package/dist/toolset/chat_action.d.ts +0 -7
  85. package/dist/toolset/chat_action.d.ts.map +0 -1
  86. package/dist/toolset/chat_action.js +0 -355
  87. package/dist/toolset/chat_action.js.map +0 -1
  88. package/dist/toolset/list_candidates.d.ts +0 -4
  89. package/dist/toolset/list_candidates.d.ts.map +0 -1
  90. package/dist/toolset/list_candidates.js +0 -120
  91. package/dist/toolset/list_candidates.js.map +0 -1
  92. package/dist/toolset/list_positions.d.ts +0 -9
  93. package/dist/toolset/list_positions.d.ts.map +0 -1
  94. package/dist/toolset/list_positions.js +0 -41
  95. package/dist/toolset/list_positions.js.map +0 -1
  96. package/dist/toolset/open_chat.d.ts +0 -3
  97. package/dist/toolset/open_chat.d.ts.map +0 -1
  98. package/dist/toolset/open_chat.js +0 -423
  99. package/dist/toolset/open_chat.js.map +0 -1
  100. package/dist/toolset/recommend_greet.d.ts +0 -2
  101. package/dist/toolset/recommend_greet.d.ts.map +0 -1
  102. package/dist/toolset/recommend_greet.js +0 -27
  103. package/dist/toolset/recommend_greet.js.map +0 -1
  104. package/dist/toolset/search.d.ts +0 -24
  105. package/dist/toolset/search.d.ts.map +0 -1
  106. package/dist/toolset/search.js +0 -682
  107. package/dist/toolset/search.js.map +0 -1
  108. package/dist/toolset/send_message.d.ts +0 -12
  109. package/dist/toolset/send_message.d.ts.map +0 -1
  110. package/dist/toolset/send_message.js +0 -214
  111. package/dist/toolset/send_message.js.map +0 -1
  112. package/dist/toolset/skill.d.ts +0 -13
  113. package/dist/toolset/skill.d.ts.map +0 -1
  114. package/dist/toolset/skill.js +0 -85
  115. package/dist/toolset/skill.js.map +0 -1
@@ -1,41 +0,0 @@
1
- import { readdir, readFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { JD_DIR, ensureAppDataLayout } from '../config.js';
4
- function defaultJdDir() {
5
- return JD_DIR;
6
- }
7
- function isMdFile(name) {
8
- return name.toLowerCase().endsWith('.md');
9
- }
10
- export async function runListOpenPositions(deps = {}) {
11
- ensureAppDataLayout();
12
- const jdDir = deps.jdDir ?? defaultJdDir();
13
- console.error(`[boss-cli] list_open_positions jdDir=${jdDir}`);
14
- try {
15
- const entries = await readdir(jdDir, { withFileTypes: true });
16
- const files = entries
17
- .filter((e) => e.isFile() && isMdFile(e.name))
18
- .map((e) => e.name)
19
- .sort((a, b) => a.localeCompare(b, 'zh-Hans-CN'));
20
- const positions = [];
21
- for (const filename of files) {
22
- const full = path.join(jdDir, filename);
23
- const content = await readFile(full, 'utf8');
24
- const base = path.basename(filename, path.extname(filename));
25
- positions.push({ title: base, filename, content });
26
- }
27
- const header = `已读取 ${positions.length} 个岗位 JD(目录:${jdDir})`;
28
- const blocks = positions.map((p, i) => {
29
- const sep = '---';
30
- return [`## ${i + 1}. ${p.title}(${p.filename})`, sep, p.content.trimEnd()].join('\n');
31
- });
32
- const textBody = blocks.length > 0 ? blocks.join('\n\n') : '(该目录下暂无 .md/.MD 岗位文件)';
33
- return [header, textBody].filter(Boolean).join('\n');
34
- }
35
- catch (e) {
36
- const message = e instanceof Error ? e.message : String(e);
37
- console.error(`[boss-cli] list_open_positions error: ${message}`);
38
- throw new Error(`读取岗位 JD 失败:${message}`);
39
- }
40
- }
41
- //# sourceMappingURL=list_positions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list_positions.js","sourceRoot":"","sources":["../../src/toolset/list_positions.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { Page } from 'puppeteer-core';
2
- export declare function runOpenCandidateChat(page: Page, candidateName: string, exact?: boolean): Promise<string>;
3
- //# sourceMappingURL=open_chat.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"open_chat.d.ts","sourceRoot":"","sources":["../../src/toolset/open_chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAoO3C,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,UAAO,GACX,OAAO,CAAC,MAAM,CAAC,CAiQjB"}
@@ -1,423 +0,0 @@
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';
2
- function chatRoleTag(from) {
3
- switch (from) {
4
- case 'friend':
5
- return '[candidate]';
6
- case 'myself':
7
- return '[you]';
8
- case 'system':
9
- return '[system]';
10
- default:
11
- return '[unknown]';
12
- }
13
- }
14
- /**
15
- * 打开「沟通记录」弹窗,依次读取「同事沟通」「我的沟通」列表,关闭弹窗。
16
- * 未找到入口时返回 null(视为暂无同事沟通记录,不输出该段)。
17
- */
18
- async function fetchColleagueChatHistorySection(page) {
19
- const clicked = await page.evaluate(() => {
20
- function norm(v) {
21
- return (v ?? '').replace(/\s+/g, ' ').trim();
22
- }
23
- const tooltips = Array.from(document.querySelectorAll('.chat-tooltip-custom'));
24
- for (const el of tooltips) {
25
- if (!norm(el.textContent).includes('沟通记录'))
26
- continue;
27
- const host = el.closest('span.icon') ?? el.closest('span') ?? el.parentElement;
28
- if (host) {
29
- host.click();
30
- return true;
31
- }
32
- el.click();
33
- return true;
34
- }
35
- const uses = Array.from(document.querySelectorAll('use'));
36
- for (const u of uses) {
37
- const h = u.getAttribute('href') ||
38
- u.getAttributeNS('http://www.w3.org/1999/xlink', 'href') ||
39
- '';
40
- if (h.includes('icon-chat-history')) {
41
- const p = u.closest('span.icon') ?? u.parentElement?.parentElement;
42
- if (p) {
43
- p.click();
44
- return true;
45
- }
46
- }
47
- }
48
- return false;
49
- });
50
- if (!clicked) {
51
- return null;
52
- }
53
- try {
54
- await page.waitForSelector('.boss-dialog__body .chat-history-process', { timeout: 12_000 });
55
- }
56
- catch {
57
- return '(已点击「沟通记录」,但弹窗未在预期时间内出现。)';
58
- }
59
- await sleepRandom(CHAT_HISTORY_DIALOG_WAIT_MS.min, CHAT_HISTORY_DIALOG_WAIT_MS.max);
60
- const scrapeRows = () => page.evaluate(() => {
61
- function norm(v) {
62
- return (v ?? '').replace(/\s+/g, ' ').trim();
63
- }
64
- const root = document.querySelector('.chat-history-process');
65
- if (!root)
66
- return [];
67
- return Array.from(root.querySelectorAll('.record li'))
68
- .map((li) => ({
69
- action: norm(li.querySelector('.action')?.textContent),
70
- operat: norm(li.querySelector('.operat')?.textContent),
71
- }))
72
- .filter((x) => x.action || x.operat);
73
- });
74
- const clickTab = (label) => page.evaluate((lab) => {
75
- function norm(v) {
76
- return (v ?? '').replace(/\s+/g, ' ').trim();
77
- }
78
- const root = document.querySelector('.chat-history-process');
79
- if (!root)
80
- return;
81
- const spans = Array.from(root.querySelectorAll('.tab-hd span'));
82
- const sp = spans.find((s) => norm(s.textContent) === lab);
83
- if (sp && !sp.classList.contains('selected')) {
84
- sp.click();
85
- }
86
- }, label);
87
- await clickTab('同事沟通');
88
- await sleepRandom(CHAT_HISTORY_TAB_SWITCH_MS.min, CHAT_HISTORY_TAB_SWITCH_MS.max);
89
- const rowsColleague = await scrapeRows();
90
- await clickTab('我的沟通');
91
- await sleepRandom(CHAT_HISTORY_TAB_SWITCH_MS.min, CHAT_HISTORY_TAB_SWITCH_MS.max);
92
- const rowsMine = await scrapeRows();
93
- const fmt = (label, rows) => {
94
- const lines = [`[${label}]`];
95
- if (rows.length === 0) {
96
- lines.push('(暂无)');
97
- return lines;
98
- }
99
- rows.forEach((r, i) => {
100
- const line = [r.action, r.operat].filter(Boolean).join(' | ');
101
- lines.push(`${i + 1}. ${line}`);
102
- });
103
- return lines;
104
- };
105
- const parts = [];
106
- parts.push(...fmt('同事沟通', rowsColleague));
107
- parts.push('');
108
- parts.push(...fmt('我的沟通', rowsMine));
109
- await closeChatHistoryPopup(page);
110
- return parts.join('\n');
111
- }
112
- /** 关闭「沟通记录」弹层(优先点 Boss 提供的 popup 关闭钮) */
113
- async function closeChatHistoryPopup(page) {
114
- try {
115
- const selectors = [
116
- '.boss-popup__wrapper.chat-history .boss-popup__close',
117
- '.boss-dialog__wrapper.chat-history .boss-popup__close',
118
- '.boss-popup__wrapper.boss-dialog.chat-history .boss-popup__close',
119
- ];
120
- let btn = null;
121
- for (const sel of selectors) {
122
- btn = await page.$(sel);
123
- if (btn)
124
- break;
125
- }
126
- if (btn) {
127
- await btn.click();
128
- }
129
- else {
130
- await page.evaluate(() => {
131
- const root = document.querySelector('.boss-popup__wrapper.chat-history') ||
132
- document.querySelector('.boss-dialog__wrapper.chat-history');
133
- const c = root?.querySelector('.boss-popup__close') ?? document.querySelector('.boss-popup__close');
134
- if (c) {
135
- c.click();
136
- }
137
- });
138
- }
139
- await sleepRandom(250, 550);
140
- const popupWrap = await page.$('.boss-popup__wrapper.chat-history');
141
- if (popupWrap) {
142
- await page.evaluate(() => {
143
- const root = document.querySelector('.boss-popup__wrapper.chat-history') ||
144
- document.querySelector('.boss-dialog__wrapper.chat-history');
145
- const c = root?.querySelector('.boss-popup__close') ?? document.querySelector('.boss-popup__close');
146
- c?.click();
147
- });
148
- await sleepRandom(150, 350);
149
- }
150
- }
151
- catch {
152
- /* ignore */
153
- }
154
- }
155
- async function fetchCandidateSummary(page) {
156
- const scraped = (await page.evaluate(`(() => {
157
- const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
158
- const root = document.querySelector(".base-info-single-container");
159
- if (!root) {
160
- throw new Error("未找到候选人详情容器(.base-info-single-container)。");
161
- }
162
- const name = norm(root.querySelector(".name-box")?.textContent);
163
- const active = norm(root.querySelector(".high-light-orange.active-time span")?.textContent);
164
- const basicFacts = Array.from(root.querySelectorAll(".base-info-single-detial > div"))
165
- .filter((el) => !el.classList.contains("name-contet") && !el.classList.contains("active-time"))
166
- .map((el) => norm(el.textContent))
167
- .filter((v) => v.length > 0);
168
- const recentExperience = Array.from(
169
- root.querySelectorAll(".experience-content.detail-list .work-content .value"),
170
- )
171
- .map((el) => norm(el.textContent))
172
- .filter((v) => v.length > 0);
173
- const communicationPosition = norm(
174
- root.querySelector(".position-item .position-name")?.textContent,
175
- );
176
- const expectation = norm(root.querySelector(".position-item.expect .value.job")?.textContent);
177
- const remark = norm(
178
- root.querySelector(".label-remark-content .remark span:last-child")?.textContent,
179
- );
180
- return {
181
- name,
182
- active,
183
- basicFacts,
184
- recentExperience,
185
- communicationPosition,
186
- expectation,
187
- remark,
188
- };
189
- })()`));
190
- return scraped;
191
- }
192
- export async function runOpenCandidateChat(page, candidateName, exact = true) {
193
- const targetName = candidateName.trim();
194
- try {
195
- const currentUrl = page.url();
196
- if (!isBossChatIndexUrl(currentUrl)) {
197
- throw new Error('请先进入聊天列表页(/web/chat/index)再打开候选人聊天。');
198
- }
199
- const norm = (v) => (v ?? '').replace(/\s+/g, ' ').trim();
200
- const matcher = (value) => exact ? value === targetName : value.includes(targetName);
201
- let targetWrap = null;
202
- let foundName = '';
203
- const maxScrollRounds = 40;
204
- for (let round = 0; round < maxScrollRounds && !targetWrap; round++) {
205
- const wraps = await page.$$('.geek-item-wrap');
206
- for (const wrap of wraps) {
207
- const nameText = await wrap
208
- .$eval('.geek-name', (el) => (el.textContent ?? '').trim())
209
- .catch(() => '');
210
- const candidate = norm(nameText);
211
- if (!candidate)
212
- continue;
213
- if (matcher(candidate)) {
214
- targetWrap = wrap;
215
- foundName = candidate;
216
- break;
217
- }
218
- }
219
- if (targetWrap)
220
- break;
221
- const scrollState = (await page.evaluate(`(() => {
222
- const first = document.querySelector(".geek-item-wrap");
223
- if (!first) return { moved: false, atEnd: true };
224
- let node = first.parentElement;
225
- let scroller = null;
226
- while (node) {
227
- const style = window.getComputedStyle(node);
228
- const overflowY = style.overflowY;
229
- const canScroll =
230
- (overflowY === "auto" || overflowY === "scroll") &&
231
- node.scrollHeight > node.clientHeight;
232
- if (canScroll) {
233
- scroller = node;
234
- break;
235
- }
236
- node = node.parentElement;
237
- }
238
- if (!scroller) return { moved: false, atEnd: true };
239
- const prev = scroller.scrollTop;
240
- const step = Math.max(160, Math.floor(scroller.clientHeight * 0.8));
241
- scroller.scrollTop = Math.min(scroller.scrollTop + step, scroller.scrollHeight);
242
- const moved = scroller.scrollTop !== prev;
243
- const atEnd = scroller.scrollTop + scroller.clientHeight >= scroller.scrollHeight - 2;
244
- return { moved, atEnd };
245
- })()`));
246
- if (!scrollState.moved || scrollState.atEnd) {
247
- break;
248
- }
249
- await sleepRandom(OPEN_CHAT_SCROLL_GAP_MS.min, OPEN_CHAT_SCROLL_GAP_MS.max);
250
- }
251
- if (!targetWrap) {
252
- throw new Error(`未在聊天列表中找到候选人:${targetName}`);
253
- }
254
- try {
255
- await targetWrap.evaluate((el) => {
256
- const row = el.querySelector('.geek-item') ?? el;
257
- row.scrollIntoView({ behavior: 'instant', block: 'center', inline: 'nearest' });
258
- row.click();
259
- });
260
- }
261
- catch {
262
- const box = await targetWrap.boundingBox();
263
- if (!box) {
264
- throw new Error(`已定位候选人 ${foundName},但元素不可点击。`);
265
- }
266
- await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2, {
267
- delay: randomIntInclusive(MOUSE_CLICK_PRESS_MS.min, MOUSE_CLICK_PRESS_MS.max),
268
- });
269
- }
270
- await sleepRandom(OPEN_CHAT_AFTER_ROW_CLICK_MS.min, OPEN_CHAT_AFTER_ROW_CLICK_MS.max);
271
- const selected = await targetWrap
272
- .$eval('.geek-item', (el) => el.classList.contains('selected'))
273
- .catch(() => false);
274
- try {
275
- await page.waitForSelector('.base-info-single-container', { timeout: 12_000 });
276
- await page.waitForFunction(`((name) => {
277
- const text = document.querySelector(".base-info-single-container .name-box")?.textContent ?? "";
278
- return text.replace(/\\s+/g, " ").trim().includes(name);
279
- })`, { timeout: 12_000 }, foundName || targetName);
280
- await page.waitForFunction(`(() => {
281
- const list = document.querySelector(".chat-message-list");
282
- if (!list) return false;
283
- const items = list.querySelectorAll(".message-item");
284
- if (!items || items.length === 0) return false;
285
- const hasText = Array.from(items).some((item) => {
286
- const txt =
287
- item.querySelector(".item-friend .text span")?.textContent ??
288
- item.querySelector(".item-myself .text span")?.textContent ??
289
- item.querySelector(".item-system .message-card-top-title")?.textContent ??
290
- "";
291
- return txt.replace(/\\s+/g, " ").trim().length > 0;
292
- });
293
- return hasText;
294
- })()`, { timeout: 16_000 });
295
- }
296
- catch {
297
- throw new Error(`已尝试点击 ${foundName}(selected=${String(selected)}),但未检测到对应聊天详情面板。`);
298
- }
299
- let fullMessages = [];
300
- let hasFriendResumeAttachment = false;
301
- try {
302
- const scraped = (await page.evaluate(`(() => {
303
- const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
304
- /** Boss 系统里的「消息优先提醒」增值服务条,对业务无意义,过滤掉 */
305
- function isBossPriorityUpsellSystemText(text) {
306
- return norm(text).indexOf("优先提醒") !== -1;
307
- }
308
- const items = Array.from(document.querySelectorAll(".chat-message-list .message-item"));
309
- let currentTime = "";
310
- const messages = [];
311
- let hasFriendResumeAttachment = false;
312
- for (const item of items) {
313
- const timeNode = item.querySelector(".message-time .time");
314
- if (timeNode) {
315
- const t = norm(timeNode.textContent);
316
- if (t) currentTime = t;
317
- }
318
- const friendRoot = item.querySelector(".item-friend");
319
- let friendText = "";
320
- if (friendRoot) {
321
- friendText = norm(friendRoot.querySelector(".text > span")?.textContent);
322
- if (!friendText) {
323
- const resumeIcon = friendRoot.querySelector(".resume-icon");
324
- const title = norm(friendRoot.querySelector(".message-card-top-title")?.textContent);
325
- const cardBtn = norm(friendRoot.querySelector(".message-card-buttons .card-btn")?.textContent);
326
- if (resumeIcon) hasFriendResumeAttachment = true;
327
- if (title || cardBtn) {
328
- const parts = [];
329
- if (title) parts.push(title);
330
- if (cardBtn) parts.push(cardBtn);
331
- friendText = parts.length ? parts.join(" · ") : "";
332
- }
333
- if (!friendText) friendText = norm(friendRoot.querySelector(".text")?.textContent);
334
- }
335
- }
336
- const myselfText = norm(item.querySelector(".item-myself .text span")?.textContent);
337
- const systemText =
338
- norm(item.querySelector(".item-system .message-card-top-title")?.textContent) ||
339
- norm(item.querySelector(".item-system .text span")?.textContent);
340
- if (friendText) {
341
- messages.push({ text: friendText, time: currentTime, from: "friend" });
342
- } else if (myselfText) {
343
- messages.push({ text: myselfText, time: currentTime, from: "myself" });
344
- } else if (systemText) {
345
- if (!isBossPriorityUpsellSystemText(systemText)) {
346
- messages.push({ text: systemText, time: currentTime, from: "system" });
347
- }
348
- }
349
- }
350
- return { messages, hasFriendResumeAttachment };
351
- })()`));
352
- fullMessages = scraped.messages;
353
- hasFriendResumeAttachment = scraped.hasFriendResumeAttachment;
354
- }
355
- catch {
356
- /* 抓取消息失败时仍返回摘要,不刷屏 stderr */
357
- }
358
- const detailLines = fullMessages.map((m) => {
359
- const tag = chatRoleTag(m.from);
360
- const timePart = m.time ? ` ${m.time}` : '';
361
- return `${tag}${timePart} ${m.text}`.trimEnd();
362
- });
363
- const resumeStatus = hasFriendResumeAttachment ? '已获取' : '未获取';
364
- const summary = await fetchCandidateSummary(page);
365
- let historyBlock = null;
366
- try {
367
- historyBlock = await fetchColleagueChatHistorySection(page);
368
- }
369
- catch {
370
- historyBlock = null;
371
- }
372
- const out = [
373
- `成功进入候选人聊天:${foundName}`,
374
- `简历获取状态: ${resumeStatus}`,
375
- ];
376
- const summaryLines = [];
377
- const summaryName = summary.name || foundName || targetName;
378
- summaryLines.push(`姓名: ${summaryName}`);
379
- if (summary.active) {
380
- summaryLines.push(`活跃状态: ${summary.active}`);
381
- }
382
- if (summary.basicFacts.length > 0) {
383
- summaryLines.push(`基本信息: ${summary.basicFacts.join(' / ')}`);
384
- }
385
- if (summary.communicationPosition) {
386
- summaryLines.push(`沟通职位: ${summary.communicationPosition}`);
387
- }
388
- if (summary.expectation) {
389
- summaryLines.push(`期望: ${summary.expectation}`);
390
- }
391
- if (summary.recentExperience.length > 0) {
392
- summaryLines.push('近期经历:');
393
- summary.recentExperience.forEach((it, idx) => {
394
- summaryLines.push(`${idx + 1}. ${it}`);
395
- });
396
- }
397
- if (summaryLines.length > 0) {
398
- out.push('', '人才摘要:', '', ...summaryLines);
399
- }
400
- if (summary.remark) {
401
- out.push('', `备注: ${summary.remark}`);
402
- }
403
- if (historyBlock !== null) {
404
- out.push('', '同事/我的沟通记录:', '', historyBlock);
405
- }
406
- out.push('', '完整聊天消息:');
407
- if (detailLines.length > 0) {
408
- out.push('', ...detailLines);
409
- }
410
- else {
411
- out.push('', '(暂无)');
412
- }
413
- return out.join('\n');
414
- }
415
- catch (e) {
416
- const message = e instanceof Error ? e.message : String(e);
417
- if (e instanceof Error) {
418
- throw e;
419
- }
420
- throw new Error(`打开候选人聊天失败:${message}`);
421
- }
422
- }
423
- //# sourceMappingURL=open_chat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"open_chat.js","sourceRoot":"","sources":["../../src/toolset/open_chat.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function runRecommendGreet(target: string): Promise<string>;
2
- //# sourceMappingURL=recommend_greet.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recommend_greet.d.ts","sourceRoot":"","sources":["../../src/toolset/recommend_greet.ts"],"names":[],"mappings":"AAaA,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBvE"}
@@ -1,27 +0,0 @@
1
- import { createWaitManualLoginRequiredText, sleepRandom, withChatPage, } from '../browser/index.js';
2
- import { clickGreet, ensureInRecommendPage, markGreetProduced, readRecommendList, renderRecommendList, } from './recommend.js';
3
- export async function runRecommendGreet(target) {
4
- const t = target.trim();
5
- if (!t) {
6
- throw new Error('请提供打招呼目标(姓名或序号)。');
7
- }
8
- try {
9
- return await withChatPage(async (page) => {
10
- const frame = await ensureInRecommendPage(page);
11
- const before = await readRecommendList(frame);
12
- const greetResult = await clickGreet(frame, t);
13
- await sleepRandom(380, 1000);
14
- const after = await readRecommendList(frame);
15
- markGreetProduced(before, after);
16
- return [greetResult.message, '', '当前推荐列表(来源分组):', renderRecommendList(after)].join('\n');
17
- });
18
- }
19
- catch (e) {
20
- const message = e instanceof Error ? e.message : String(e);
21
- if (e instanceof Error && e.message.includes('浏览器会话尚未初始化')) {
22
- throw new Error(createWaitManualLoginRequiredText('推荐打招呼'));
23
- }
24
- throw new Error(`执行推荐打招呼失败:${message}`);
25
- }
26
- }
27
- //# sourceMappingURL=recommend_greet.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recommend_greet.js","sourceRoot":"","sources":["../../src/toolset/recommend_greet.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,WAAW,EACX,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/C,MAAM,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC7C,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACjC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,OAAO,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC"}
@@ -1,24 +0,0 @@
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>;
24
- //# sourceMappingURL=search.d.ts.map
@@ -1 +0,0 @@
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"}