@joohw/boss-cli 0.1.5 → 0.1.8

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 (80) hide show
  1. package/README.md +7 -2
  2. package/dist/browser/browser_session.d.ts.map +1 -1
  3. package/dist/browser/browser_session.js +38 -0
  4. package/dist/browser/browser_session.js.map +1 -1
  5. package/dist/browser/cdp_browser.d.ts +1 -2
  6. package/dist/browser/cdp_browser.d.ts.map +1 -1
  7. package/dist/browser/cdp_browser.js +29 -5
  8. package/dist/browser/cdp_browser.js.map +1 -1
  9. package/dist/browser/chat.d.ts +2 -2
  10. package/dist/browser/chat.d.ts.map +1 -1
  11. package/dist/browser/chat.js +48 -18
  12. package/dist/browser/chat.js.map +1 -1
  13. package/dist/browser/index.d.ts +0 -1
  14. package/dist/browser/index.d.ts.map +1 -1
  15. package/dist/browser/index.js +0 -1
  16. package/dist/browser/index.js.map +1 -1
  17. package/dist/cli/banner.d.ts +1 -1
  18. package/dist/cli/banner.d.ts.map +1 -1
  19. package/dist/cli/banner.js +40 -1
  20. package/dist/cli/banner.js.map +1 -1
  21. package/dist/cli/cliRouter.d.ts.map +1 -1
  22. package/dist/cli/cliRouter.js +145 -57
  23. package/dist/cli/cliRouter.js.map +1 -1
  24. package/dist/cli/index.js +2 -2
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/version.d.ts +7 -0
  27. package/dist/cli/version.d.ts.map +1 -0
  28. package/dist/cli/version.js +59 -0
  29. package/dist/cli/version.js.map +1 -0
  30. package/dist/toolset/action.d.ts +7 -0
  31. package/dist/toolset/action.d.ts.map +1 -0
  32. package/dist/toolset/action.js +476 -0
  33. package/dist/toolset/action.js.map +1 -0
  34. package/dist/toolset/chat.d.ts +4 -0
  35. package/dist/toolset/chat.d.ts.map +1 -0
  36. package/dist/toolset/chat.js +434 -0
  37. package/dist/toolset/chat.js.map +1 -0
  38. package/dist/toolset/chat_action.d.ts +7 -0
  39. package/dist/toolset/chat_action.d.ts.map +1 -0
  40. package/dist/toolset/chat_action.js +355 -0
  41. package/dist/toolset/chat_action.js.map +1 -0
  42. package/dist/toolset/greet.d.ts +2 -0
  43. package/dist/toolset/greet.d.ts.map +1 -0
  44. package/dist/toolset/greet.js +27 -0
  45. package/dist/toolset/greet.js.map +1 -0
  46. package/dist/toolset/index.d.ts +13 -8
  47. package/dist/toolset/index.d.ts.map +1 -1
  48. package/dist/toolset/index.js +27 -10
  49. package/dist/toolset/index.js.map +1 -1
  50. package/dist/toolset/jd.d.ts +10 -0
  51. package/dist/toolset/jd.d.ts.map +1 -0
  52. package/dist/toolset/jd.js +443 -0
  53. package/dist/toolset/jd.js.map +1 -0
  54. package/dist/toolset/list.d.ts +4 -0
  55. package/dist/toolset/list.d.ts.map +1 -0
  56. package/dist/toolset/list.js +156 -0
  57. package/dist/toolset/list.js.map +1 -0
  58. package/dist/toolset/open_chat.d.ts +1 -4
  59. package/dist/toolset/open_chat.d.ts.map +1 -1
  60. package/dist/toolset/open_chat.js +66 -164
  61. package/dist/toolset/open_chat.js.map +1 -1
  62. package/dist/toolset/recommend.d.ts +22 -0
  63. package/dist/toolset/recommend.d.ts.map +1 -0
  64. package/dist/toolset/recommend.js +346 -0
  65. package/dist/toolset/recommend.js.map +1 -0
  66. package/dist/toolset/recommend_greet.d.ts +2 -0
  67. package/dist/toolset/recommend_greet.d.ts.map +1 -0
  68. package/dist/toolset/recommend_greet.js +27 -0
  69. package/dist/toolset/recommend_greet.js.map +1 -0
  70. package/dist/toolset/search.d.ts +2 -0
  71. package/dist/toolset/search.d.ts.map +1 -0
  72. package/dist/toolset/search.js +174 -0
  73. package/dist/toolset/search.js.map +1 -0
  74. package/dist/toolset/send.d.ts +6 -0
  75. package/dist/toolset/send.d.ts.map +1 -0
  76. package/dist/toolset/send.js +46 -0
  77. package/dist/toolset/send.js.map +1 -0
  78. package/package.json +1 -1
  79. package/skills/README.md +0 -11
  80. package/skills/boss-cli/SKILL.md +0 -58
@@ -0,0 +1,443 @@
1
+ import { access, readFile, writeFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { createWaitManualLoginRequiredText, sleepRandom, withChatPage, } from '../browser/index.js';
4
+ import { JD_DIR } from '../config.js';
5
+ const BOSS_CHAT_JOB_LIST_URL = 'https://www.zhipin.com/web/chat/job/list';
6
+ const JD_PAGE_SETTLE_MS = { min: 3200, max: 5600 };
7
+ const JD_DETAIL_DEFAULT_WAIT_MS = 10_000;
8
+ const CLICK_JD_BACK_BUTTON_SCRIPT = `(() => {
9
+ const isVisible = (el) => {
10
+ if (!(el instanceof HTMLElement)) return false;
11
+ const st = window.getComputedStyle(el);
12
+ if (st.display === "none" || st.visibility === "hidden") return false;
13
+ const r = el.getBoundingClientRect();
14
+ return r.width > 0 && r.height > 0;
15
+ };
16
+ const topNav = document.querySelector(".top-nav");
17
+ if (!(topNav instanceof HTMLElement)) {
18
+ return false;
19
+ }
20
+ const backBtn = topNav.querySelector(".history-back-container .back-btn");
21
+ const icon = backBtn?.querySelector("i.iboss-right");
22
+ if (!(icon instanceof HTMLElement)) {
23
+ return false;
24
+ }
25
+ if (!(backBtn instanceof HTMLElement) || !isVisible(backBtn)) {
26
+ return false;
27
+ }
28
+ backBtn.scrollIntoView({ block: "center", inline: "nearest" });
29
+ backBtn.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
30
+ backBtn.click();
31
+ return true;
32
+ })()`;
33
+ function isBossChatJobListUrl(url) {
34
+ try {
35
+ const u = new URL(url);
36
+ if (!u.hostname.includes('zhipin.com')) {
37
+ return false;
38
+ }
39
+ const p = u.pathname.replace(/\/+$/, '') || '/';
40
+ return p === '/web/chat/job/list';
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ async function clickSidebarMenuToPath(page, menuLabel, targetPath) {
47
+ const clicked = (await page.evaluate(({ label, path }) => {
48
+ const norm = (v) => (v ?? '').replace(/\s+/g, '');
49
+ const links = Array.from(document.querySelectorAll('.menu-list a'));
50
+ const target = links.find((a) => {
51
+ const href = a.getAttribute('href') ?? '';
52
+ if (href.includes(path)) {
53
+ return true;
54
+ }
55
+ const text = norm(a.querySelector('.menu-item-content span')?.textContent ?? a.textContent);
56
+ return text.includes(label);
57
+ });
58
+ if (!(target instanceof HTMLElement)) {
59
+ return false;
60
+ }
61
+ target.scrollIntoView({ block: 'center', inline: 'nearest' });
62
+ target.click();
63
+ return true;
64
+ }, { label: menuLabel, path: targetPath }));
65
+ if (!clicked) {
66
+ throw new Error(`未找到侧边栏菜单“${menuLabel}”,无法跳转到 ${targetPath}。`);
67
+ }
68
+ await page.waitForFunction((path) => {
69
+ try {
70
+ const p = window.location.pathname.replace(/\/+$/, '') || '/';
71
+ return p === path;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }, { timeout: 15_000 }, targetPath);
77
+ }
78
+ function resolveTargetJob(jobs, detailInput) {
79
+ const raw = detailInput.trim();
80
+ if (!raw)
81
+ return null;
82
+ const asIndex = Number.parseInt(raw, 10);
83
+ if (Number.isFinite(asIndex) && String(asIndex) === raw && asIndex >= 1 && asIndex <= jobs.length) {
84
+ return jobs[asIndex - 1] ?? null;
85
+ }
86
+ const exact = jobs.find((job) => job.title === raw);
87
+ if (exact)
88
+ return exact;
89
+ const needle = raw.toLowerCase();
90
+ const fuzzy = jobs.filter((job) => job.title.toLowerCase().includes(needle));
91
+ if (fuzzy.length === 1) {
92
+ return fuzzy[0] ?? null;
93
+ }
94
+ if (fuzzy.length > 1) {
95
+ const picks = fuzzy
96
+ .slice(0, 8)
97
+ .map((j, idx) => `${idx + 1}. ${j.title}`)
98
+ .join('|');
99
+ throw new Error(`“${raw}”命中多个职位,请改用更精确名称或序号。候选:${picks}`);
100
+ }
101
+ return null;
102
+ }
103
+ function stripControlChars(input) {
104
+ return input.replace(/[<>:"/\\|?*]/g, '_');
105
+ }
106
+ function cacheFileCandidates(projectDir, title) {
107
+ const exact = path.resolve(projectDir, `${title}.md`);
108
+ const safe = path.resolve(projectDir, `${stripControlChars(title)}.md`);
109
+ if (safe === exact) {
110
+ return [exact];
111
+ }
112
+ return [exact, safe];
113
+ }
114
+ async function fileExists(target) {
115
+ try {
116
+ await access(target);
117
+ return true;
118
+ }
119
+ catch {
120
+ return false;
121
+ }
122
+ }
123
+ async function readJobsFromFrame(frame) {
124
+ return (await frame.evaluate(`(() => {
125
+ const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
126
+ const rows = Array.from(document.querySelectorAll(".job-jobInfo-warp"));
127
+ const jobs = rows.map((el) => {
128
+ const statusText = norm(el.querySelector(".job-status-wrapper .status-box")?.textContent);
129
+ const labelText = norm(el.querySelector(".job-title .label-common")?.textContent);
130
+ const meta = Array.from(el.querySelectorAll(".job-main-info-wrapper .info-labels span"))
131
+ .map((x) => norm(x.textContent))
132
+ .filter(Boolean);
133
+ const nums = Array.from(el.querySelectorAll(".job-about-num-wrapper .inner-box .num"))
134
+ .map((x) => norm(x.textContent));
135
+ return {
136
+ id: norm(el.getAttribute("data-id")),
137
+ title: norm(el.querySelector(".job-title a")?.textContent),
138
+ label: labelText,
139
+ status: statusText,
140
+ meta,
141
+ viewed: nums[0] || "0",
142
+ chatted: nums[1] || "0",
143
+ interested: nums[2] || "0",
144
+ };
145
+ });
146
+ const totalText = norm(document.querySelector(".total-num")?.textContent);
147
+ const bodyText = norm(document.body?.innerText ?? "");
148
+ return {
149
+ rows: rows.length,
150
+ totalText,
151
+ title: document.title || "",
152
+ url: location.href,
153
+ bodyPreview: bodyText.slice(0, 120),
154
+ jobs,
155
+ };
156
+ })()`));
157
+ }
158
+ async function readJobsFromPageAnyFrame(page) {
159
+ const main = await readJobsFromFrame(page.mainFrame());
160
+ if (main.rows > 0 || main.totalText.length > 0) {
161
+ return {
162
+ frame: page.mainFrame(),
163
+ data: main,
164
+ fromFrame: false,
165
+ frameUrl: main.url,
166
+ mainState: main,
167
+ };
168
+ }
169
+ const frames = page.frames();
170
+ for (const frame of frames) {
171
+ if (frame === page.mainFrame()) {
172
+ continue;
173
+ }
174
+ try {
175
+ const state = await readJobsFromFrame(frame);
176
+ if (state.rows > 0 || state.totalText.length > 0) {
177
+ return {
178
+ frame,
179
+ data: state,
180
+ fromFrame: true,
181
+ frameUrl: state.url,
182
+ mainState: main,
183
+ };
184
+ }
185
+ }
186
+ catch {
187
+ // ignore cross-origin / detached frames
188
+ }
189
+ }
190
+ return {
191
+ frame: page.mainFrame(),
192
+ data: main,
193
+ fromFrame: false,
194
+ frameUrl: main.url,
195
+ mainState: main,
196
+ };
197
+ }
198
+ async function waitForJobRowsReady(page, timeoutMs) {
199
+ const start = Date.now();
200
+ while (Date.now() - start < timeoutMs) {
201
+ const state = await readJobsFromPageAnyFrame(page);
202
+ if (state.data.rows > 0 || state.data.totalText.length > 0) {
203
+ return state;
204
+ }
205
+ await sleepRandom(260, 520);
206
+ }
207
+ const last = await readJobsFromPageAnyFrame(page);
208
+ throw new Error([
209
+ '等待职位列表超时',
210
+ `main.rows=${last.mainState.rows}`,
211
+ `main.total="${last.mainState.totalText}"`,
212
+ `main.title="${last.mainState.title}"`,
213
+ `main.url=${last.mainState.url}`,
214
+ `main.body="${last.mainState.bodyPreview}"`,
215
+ `frameHit=${last.fromFrame ? 'yes' : 'no'}`,
216
+ `frame.url=${last.frameUrl}`,
217
+ ].join(';'));
218
+ }
219
+ async function clickEditForJob(frame, job) {
220
+ const targetId = JSON.stringify(job.id ?? '');
221
+ const targetTitle = JSON.stringify(job.title ?? '');
222
+ const clicked = (await frame.evaluate(`(() => {
223
+ const jobId = ${targetId};
224
+ const title = ${targetTitle};
225
+ const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
226
+ const rows = Array.from(document.querySelectorAll(".job-jobInfo-warp"));
227
+ let row = null;
228
+ if (jobId) {
229
+ row = rows.find((el) => norm(el.getAttribute("data-id")) === jobId) ?? null;
230
+ }
231
+ if (!row && title) {
232
+ row = rows.find((el) => {
233
+ const t = norm(el.querySelector(".job-title a")?.textContent);
234
+ return t === title;
235
+ }) ?? null;
236
+ }
237
+ if (!row) return false;
238
+ const editBtn = row.querySelector(".position-edit");
239
+ if (!(editBtn instanceof HTMLElement)) return false;
240
+ editBtn.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
241
+ editBtn.click();
242
+ return true;
243
+ })()`));
244
+ if (!clicked) {
245
+ throw new Error(`未找到职位“${job.title}”的编辑入口`);
246
+ }
247
+ }
248
+ async function readJobDetailFromFrame(frame) {
249
+ const detail = (await frame.evaluate(`(() => {
250
+ const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
251
+ const root = document.querySelector(".job-edit-container.edit-job");
252
+ if (!root) {
253
+ return null;
254
+ }
255
+ const rows = Array.from(root.querySelectorAll(".form-row"));
256
+ const rowValueByTitle = {};
257
+ for (const row of rows) {
258
+ const title = norm(row.querySelector(".title")?.textContent);
259
+ if (!title) continue;
260
+ const content = norm(row.querySelector(".content")?.innerText);
261
+ if (content && !rowValueByTitle[title]) {
262
+ rowValueByTitle[title] = content;
263
+ }
264
+ }
265
+ const salaryValues = Array.from(
266
+ root.querySelectorAll(".scope-selecter .scope-select .ui-select-selected-value"),
267
+ ).map((el) => norm(el.textContent));
268
+ const keywordValues = Array.from(
269
+ root.querySelectorAll(".job-skill-content .job-skill-item, .job-skill-content .skill-tag, .job-skill-content .tag"),
270
+ )
271
+ .map((el) => norm(el.textContent))
272
+ .filter(Boolean);
273
+ const detail = {
274
+ pageTitle: document.title || "",
275
+ pageUrl: location.href,
276
+ company: norm(root.querySelector(".base-info .text-primary")?.textContent),
277
+ recruitmentType: norm(root.querySelector(".recruitment-type-wrap .ui-select-selected-value")?.textContent),
278
+ jobName:
279
+ norm(root.querySelector("input[name='jobName']")?.value) ||
280
+ norm(root.querySelector(".job-name input")?.value) ||
281
+ (rowValueByTitle["职位名称"] || ""),
282
+ description: norm(root.querySelector(".performance-row textarea")?.value),
283
+ overseas: norm(root.querySelector(".overseas-entry-container .chose-item.active")?.textContent),
284
+ jobCategory:
285
+ norm(root.querySelector("input[name='jobCategory']")?.value) ||
286
+ norm(root.querySelector(".job-category-tag-container")?.innerText),
287
+ experience:
288
+ norm(root.querySelector(".job-experience-row .experience-select .ui-select-selected-value")?.textContent) ||
289
+ (rowValueByTitle["经验"] || ""),
290
+ education:
291
+ norm(root.querySelector(".form-row .title")?.textContent?.includes("学历")
292
+ ? root.querySelector(".form-row .experience-select .ui-select-selected-value")?.textContent
293
+ : "") ||
294
+ (rowValueByTitle["学历"] || ""),
295
+ salaryRange:
296
+ salaryValues.length >= 2 ? (salaryValues[0] + "-" + salaryValues[1]) : salaryValues.join("-"),
297
+ salaryMonths: norm(root.querySelector(".salaryMonth-select .ui-select-selected-value")?.textContent),
298
+ keywords: keywordValues.join("|"),
299
+ workLocation:
300
+ norm(root.querySelector(".job-address input.ipt")?.value) ||
301
+ (rowValueByTitle["工作地点"] || ""),
302
+ };
303
+ return detail;
304
+ })()`));
305
+ return detail;
306
+ }
307
+ async function waitForJobDetailReady(page, timeoutMs) {
308
+ const start = Date.now();
309
+ while (Date.now() - start < timeoutMs) {
310
+ for (const frame of page.frames()) {
311
+ try {
312
+ const detail = await readJobDetailFromFrame(frame);
313
+ if (detail) {
314
+ return detail;
315
+ }
316
+ }
317
+ catch {
318
+ // ignore detached/cross-origin frame read errors
319
+ }
320
+ }
321
+ await sleepRandom(260, 520);
322
+ }
323
+ throw new Error('等待职位详情表单超时,未找到 .job-edit-container.edit-job');
324
+ }
325
+ async function closeJobDetailPanel(page, timeoutMs = 8_000) {
326
+ const start = Date.now();
327
+ while (Date.now() - start < timeoutMs) {
328
+ const backClicked = (await page.evaluate(CLICK_JD_BACK_BUTTON_SCRIPT));
329
+ if (backClicked) {
330
+ return;
331
+ }
332
+ await sleepRandom(160, 360);
333
+ }
334
+ throw new Error('已读取职位详情,但未找到 top-nav 内可点击的返回按钮(.history-back-container .back-btn > i.iboss-right)。');
335
+ }
336
+ function formatJobDetailMarkdown(job, detail) {
337
+ return [
338
+ `# ${job.title}`,
339
+ '',
340
+ `- 状态: ${job.status || '未知'}`,
341
+ `- 标签: ${job.label || '无'}`,
342
+ '',
343
+ '## 基本信息',
344
+ `- 公司: ${detail.company || '未知'}`,
345
+ `- 招聘类型: ${detail.recruitmentType || '未知'}`,
346
+ `- 职位名称: ${detail.jobName || job.title}`,
347
+ `- 职位类型: ${detail.jobCategory || '未知'}`,
348
+ `- 是否驻外: ${detail.overseas || '未知'}`,
349
+ '',
350
+ '## 要求',
351
+ `- 经验: ${detail.experience || '未知'}`,
352
+ `- 学历: ${detail.education || '未知'}`,
353
+ `- 薪资范围: ${detail.salaryRange || '未知'}`,
354
+ `- 薪资月数: ${detail.salaryMonths || '未知'}`,
355
+ `- 关键词: ${detail.keywords || '无'}`,
356
+ `- 工作地点: ${detail.workLocation || '未知'}`,
357
+ '',
358
+ '## 职位描述',
359
+ detail.description || '(空)',
360
+ '',
361
+ ].join('\n');
362
+ }
363
+ export async function runListOpenPositions(deps = {}) {
364
+ const settleMin = deps.settleWaitMsMin ?? JD_PAGE_SETTLE_MS.min;
365
+ const settleMax = deps.settleWaitMsMax ?? JD_PAGE_SETTLE_MS.max;
366
+ const detailMode = deps.detail === true;
367
+ const detailName = (deps.detailName ?? '').trim();
368
+ const projectDir = deps.projectDir ?? JD_DIR;
369
+ const detailWaitMs = deps.detailWaitMs ?? JD_DETAIL_DEFAULT_WAIT_MS;
370
+ if (detailMode && detailName) {
371
+ const candidates = cacheFileCandidates(projectDir, detailName);
372
+ for (const p of candidates) {
373
+ if (await fileExists(p)) {
374
+ return readFile(p, 'utf8');
375
+ }
376
+ }
377
+ }
378
+ try {
379
+ return await withChatPage(async (page) => {
380
+ const currentUrl = page.url();
381
+ if (!isBossChatJobListUrl(currentUrl)) {
382
+ await clickSidebarMenuToPath(page, '职位管理', '/web/chat/job/list');
383
+ await sleepRandom(settleMin, settleMax);
384
+ }
385
+ if (!isBossChatJobListUrl(page.url())) {
386
+ throw new Error('通过侧边栏“职位管理”进入职位页失败,请确认已登录并可访问 /web/chat/job/list。');
387
+ }
388
+ const ready = await waitForJobRowsReady(page, 16_000);
389
+ await sleepRandom(350, 920);
390
+ const jobs = ready.data.jobs.filter((it) => it.title.length > 0);
391
+ const jobLines = jobs.map((it, idx) => {
392
+ const info = it.meta.length > 0 ? it.meta.join('|') : '信息缺失';
393
+ const stats = `看过我:${it.viewed}|沟通过:${it.chatted}|感兴趣:${it.interested}`;
394
+ const tag = it.label ? `|标签:${it.label}` : '';
395
+ const id = it.id ? `|ID:${it.id}` : '';
396
+ return `${idx + 1}. ${it.title}|状态:${it.status || '未知'}${tag}|${info}|${stats}${id}`;
397
+ });
398
+ const details = jobLines.length > 0 ? jobLines.join('\n') : '当前页面未读取到职位。';
399
+ const openCount = jobs.filter((it) => it.status.includes('开放中')).length;
400
+ const waitOpenCount = jobs.filter((it) => it.status.includes('待开放')).length;
401
+ const closedCount = jobs.filter((it) => it.status.includes('已关闭')).length;
402
+ const totalText = ready.data.totalText ? `(页面统计:${ready.data.totalText})` : '';
403
+ if (!detailMode) {
404
+ return [
405
+ `已读取 ${jobs.length} 个职位${totalText}。`,
406
+ `状态统计:开放中 ${openCount}|待开放 ${waitOpenCount}|已关闭 ${closedCount}`,
407
+ `来源页面:${BOSS_CHAT_JOB_LIST_URL}`,
408
+ `职位明细:\n${details}`,
409
+ ].join('\n');
410
+ }
411
+ const targetJob = resolveTargetJob(jobs, detailName);
412
+ if (!targetJob) {
413
+ const available = jobs.slice(0, 8).map((j) => j.title).join('|');
414
+ throw new Error(`未找到职位“${detailName}”(支持序号和模糊匹配)。可选职位:${available || '(空)'}`);
415
+ }
416
+ const candidates = cacheFileCandidates(projectDir, targetJob.title);
417
+ const listCtx = await waitForJobRowsReady(page, 16_000);
418
+ await clickEditForJob(listCtx.frame, targetJob);
419
+ await sleepRandom(detailWaitMs, detailWaitMs);
420
+ const detail = await waitForJobDetailReady(page, 12_000);
421
+ const outPath = candidates[candidates.length - 1];
422
+ const markdown = formatJobDetailMarkdown(targetJob, detail);
423
+ await writeFile(outPath, markdown, 'utf8');
424
+ try {
425
+ await closeJobDetailPanel(page);
426
+ }
427
+ catch (closeError) {
428
+ const msg = closeError instanceof Error ? closeError.message : String(closeError);
429
+ console.warn(`[boss-cli] jd detail close warning: ${msg}`);
430
+ }
431
+ return markdown;
432
+ });
433
+ }
434
+ catch (e) {
435
+ const message = e instanceof Error ? e.message : String(e);
436
+ if (e instanceof Error && e.message.includes('浏览器会话尚未初始化')) {
437
+ throw new Error(createWaitManualLoginRequiredText('获取岗位列表'));
438
+ }
439
+ console.error(`[boss-cli] list_open_positions error: ${message}`);
440
+ throw new Error(`获取岗位列表失败:${message}`);
441
+ }
442
+ }
443
+ //# sourceMappingURL=jd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jd.js","sourceRoot":"","sources":["../../src/toolset/jd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function runGetCandidateList(opts?: {
2
+ unreadOnly?: boolean;
3
+ }): Promise<string>;
4
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/toolset/list.ts"],"names":[],"mappings":"AA6GA,wBAAsB,mBAAmB,CACvC,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,MAAM,CAAC,CA+FjB"}
@@ -0,0 +1,156 @@
1
+ import { CHAT_GOTO_SETTLE_MS, createWaitManualLoginRequiredText, isBossChatIndexUrl, LIST_FILTER_GAP_MS, LIST_MIN_BEFORE_EMPTY_OK_MS, LIST_POLL_MS, sleepRandom, withChatPage, } from '../browser/index.js';
2
+ async function waitForCandidateListSettled(page, opts) {
3
+ const start = Date.now();
4
+ let prev = -1;
5
+ let stable = 0;
6
+ while (Date.now() - start < opts.timeoutMs) {
7
+ const n = (await page.evaluate(`(() => document.querySelectorAll(".geek-item").length)()`));
8
+ const elapsed = Date.now() - start;
9
+ if (n === prev) {
10
+ stable++;
11
+ }
12
+ else {
13
+ prev = n;
14
+ stable = 1;
15
+ }
16
+ if (stable >= 2) {
17
+ if (n > 0) {
18
+ return;
19
+ }
20
+ if (n === 0 && elapsed >= opts.minMsBeforeEmptyOk) {
21
+ return;
22
+ }
23
+ }
24
+ await sleepRandom(opts.pollMsMin, opts.pollMsMax);
25
+ }
26
+ }
27
+ async function clickChatFilterTabAll(page) {
28
+ await page.evaluate(`(() => {
29
+ const targetText = "全部";
30
+ const container = document.querySelector(".chat-message-filter-left");
31
+ if (!container) return;
32
+ const spans = Array.from(container.querySelectorAll("span"));
33
+ const norm = (v) => (v ?? "").replace(/\\s+/g, "");
34
+ const target = spans.find((el) => norm(el.textContent).includes(targetText));
35
+ if (!target) return;
36
+ target.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
37
+ target.click();
38
+ })()`);
39
+ }
40
+ async function clickSidebarMenuToPath(page, menuLabel, targetPath) {
41
+ const clicked = (await page.evaluate(({ label, path }) => {
42
+ const norm = (v) => (v ?? '').replace(/\s+/g, '');
43
+ const links = Array.from(document.querySelectorAll('.menu-list a'));
44
+ const target = links.find((a) => {
45
+ const href = a.getAttribute('href') ?? '';
46
+ if (href.includes(path)) {
47
+ return true;
48
+ }
49
+ const text = norm(a.querySelector('.menu-item-content span')?.textContent ?? a.textContent);
50
+ return text.includes(label);
51
+ });
52
+ if (!(target instanceof HTMLElement)) {
53
+ return false;
54
+ }
55
+ target.scrollIntoView({ block: 'center', inline: 'nearest' });
56
+ target.click();
57
+ return true;
58
+ }, { label: menuLabel, path: targetPath }));
59
+ if (!clicked) {
60
+ throw new Error(`未找到侧边栏菜单“${menuLabel}”,无法跳转到 ${targetPath}。`);
61
+ }
62
+ await page.waitForFunction((path) => {
63
+ try {
64
+ const p = window.location.pathname.replace(/\/+$/, '') || '/';
65
+ return p === path;
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ }, { timeout: 15_000 }, targetPath);
71
+ }
72
+ export async function runGetCandidateList(opts = {}) {
73
+ const unreadOnly = opts.unreadOnly === true;
74
+ try {
75
+ return await withChatPage(async (page) => {
76
+ const currentUrl = page.url();
77
+ if (!isBossChatIndexUrl(currentUrl)) {
78
+ await clickSidebarMenuToPath(page, '沟通', '/web/chat/index');
79
+ await sleepRandom(CHAT_GOTO_SETTLE_MS.min, CHAT_GOTO_SETTLE_MS.max);
80
+ }
81
+ if (!isBossChatIndexUrl(page.url())) {
82
+ throw new Error('通过侧边栏“沟通”进入聊天列表页失败,请确认已登录并可访问 /web/chat/index。');
83
+ }
84
+ await page.waitForFunction(`(() => {
85
+ const filter = document.querySelector(".chat-message-filter-left");
86
+ if (!filter) return false;
87
+ const tabs = Array.from(filter.querySelectorAll("span"));
88
+ if (tabs.length < 2) return false;
89
+ const list = document.querySelector(".chat-list, .chat-item-list, .geek-list");
90
+ const hasItems = document.querySelectorAll(".geek-item").length > 0;
91
+ return !!list || hasItems;
92
+ })()`, { timeout: 12_000 });
93
+ await clickChatFilterTabAll(page);
94
+ await sleepRandom(LIST_FILTER_GAP_MS.min, LIST_FILTER_GAP_MS.max);
95
+ await sleepRandom(LIST_FILTER_GAP_MS.min, LIST_FILTER_GAP_MS.max);
96
+ await clickChatFilterTabAll(page);
97
+ await sleepRandom(LIST_FILTER_GAP_MS.min, LIST_FILTER_GAP_MS.max);
98
+ await waitForCandidateListSettled(page, {
99
+ timeoutMs: 14_000,
100
+ pollMsMin: LIST_POLL_MS.min,
101
+ pollMsMax: LIST_POLL_MS.max,
102
+ minMsBeforeEmptyOk: LIST_MIN_BEFORE_EMPTY_OK_MS,
103
+ });
104
+ const items = (await page.evaluate(`(() => {
105
+ const norm = (v) => (v ?? "").replace(/\\s+/g, " ").trim();
106
+ return Array.from(document.querySelectorAll(".geek-item")).map((el) => {
107
+ const name = norm(el.querySelector(".geek-name")?.textContent);
108
+ const job = norm(el.querySelector(".source-job")?.textContent);
109
+ const time = norm(el.querySelector(".time")?.textContent);
110
+ const message = norm(el.querySelector(".push-text")?.textContent);
111
+ const badge = el.querySelector(".badge-count");
112
+ let unreadCount = 0;
113
+ if (badge) {
114
+ const digits = norm(badge.textContent).replace(/\\D/g, "");
115
+ if (digits) unreadCount = parseInt(digits, 10) || 0;
116
+ }
117
+ return { name, job, time, message, unreadCount };
118
+ });
119
+ })()`));
120
+ const candidates = items.filter((it) => it.name);
121
+ const withUnread = candidates.filter((it) => it.unreadCount > 0).length;
122
+ const visible = unreadOnly ? candidates.filter((it) => it.unreadCount > 0) : candidates;
123
+ const lines = visible.map((it, idx) => {
124
+ const base = `${idx + 1}. ${it.name}${it.job ? `|${it.job}` : ''}`;
125
+ const meta = [
126
+ it.unreadCount > 0 ? `未读:${it.unreadCount}` : '',
127
+ it.time ? `时间:${it.time}` : '',
128
+ it.message ? `消息:${it.message}` : '',
129
+ ]
130
+ .filter(Boolean)
131
+ .join('|');
132
+ return meta ? `${base}|${meta}` : base;
133
+ });
134
+ const previewText = lines.length > 0 ? `候选人明细:\n${lines.join('\n')}` : '候选人明细:暂无。';
135
+ return [
136
+ unreadOnly
137
+ ? `未读筛选:共 ${visible.length} 人(全部列表 ${candidates.length} 人中有未读角标者 ${withUnread} 人)。`
138
+ : `沟通列表共 ${candidates.length} 人,其中 ${withUnread} 人有未读消息。`,
139
+ previewText,
140
+ ]
141
+ .filter(Boolean)
142
+ .join('\n');
143
+ });
144
+ }
145
+ catch (e) {
146
+ const message = e instanceof Error ? e.message : String(e);
147
+ if (e instanceof Error) {
148
+ if (e.message.includes('浏览器会话尚未初始化')) {
149
+ throw new Error(createWaitManualLoginRequiredText('获取候选人列表'));
150
+ }
151
+ throw e;
152
+ }
153
+ throw new Error(`获取候选人列表失败:${message}`);
154
+ }
155
+ }
156
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/toolset/list.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,3 @@
1
1
  import type { Page } from 'puppeteer-core';
2
- export type ChatOpenAction = 'online-resume';
3
- export declare function runOpenCandidateChat(page: Page, candidateName: string, exact?: boolean, options?: {
4
- action?: ChatOpenAction;
5
- }): Promise<string>;
2
+ export declare function runOpenCandidateChat(page: Page, candidateName: string, exact?: boolean): Promise<string>;
6
3
  //# sourceMappingURL=open_chat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"open_chat.d.ts","sourceRoot":"","sources":["../../src/toolset/open_chat.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AA0U3C,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC;AAE7C,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,UAAO,EACZ,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,cAAc,CAAA;CAAE,GACpC,OAAO,CAAC,MAAM,CAAC,CA0QjB"}
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"}