@joohw/boss-cli 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -20
- package/dist/browser/auth.d.ts +0 -1
- package/dist/browser/auth.d.ts.map +1 -1
- package/dist/browser/auth.js +3 -19
- package/dist/browser/auth.js.map +1 -1
- package/dist/browser/browser_session.d.ts +4 -0
- package/dist/browser/browser_session.d.ts.map +1 -1
- package/dist/browser/browser_session.js +27 -14
- package/dist/browser/browser_session.js.map +1 -1
- package/dist/browser/cdp_browser.d.ts +10 -0
- package/dist/browser/cdp_browser.d.ts.map +1 -1
- package/dist/browser/cdp_browser.js +219 -11
- package/dist/browser/cdp_browser.js.map +1 -1
- package/dist/browser/chat.d.ts.map +1 -1
- package/dist/browser/chat.js +5 -3
- package/dist/browser/chat.js.map +1 -1
- package/dist/browser/human_delay.d.ts +88 -0
- package/dist/browser/human_delay.d.ts.map +1 -0
- package/dist/browser/human_delay.js +52 -0
- package/dist/browser/human_delay.js.map +1 -0
- package/dist/browser/index.d.ts +3 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +3 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/timing.d.ts +7 -0
- package/dist/browser/timing.d.ts.map +1 -0
- package/dist/browser/timing.js +34 -0
- package/dist/browser/timing.js.map +1 -0
- package/dist/cli/banner.d.ts.map +1 -1
- package/dist/cli/banner.js +43 -9
- package/dist/cli/banner.js.map +1 -1
- package/dist/cli/cliRouter.d.ts.map +1 -1
- package/dist/cli/cliRouter.js +81 -63
- package/dist/cli/cliRouter.js.map +1 -1
- package/dist/cli/index.js +14 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -1
- package/dist/ocr/baidu_ocr.d.ts +11 -0
- package/dist/ocr/baidu_ocr.d.ts.map +1 -0
- package/dist/ocr/baidu_ocr.js +76 -0
- package/dist/ocr/baidu_ocr.js.map +1 -0
- package/dist/ocr/index.d.ts +3 -0
- package/dist/ocr/index.d.ts.map +1 -0
- package/dist/ocr/index.js +3 -0
- package/dist/ocr/index.js.map +1 -0
- package/dist/ocr/resume_ocr.d.ts +13 -0
- package/dist/ocr/resume_ocr.d.ts.map +1 -0
- package/dist/ocr/resume_ocr.js +35 -0
- package/dist/ocr/resume_ocr.js.map +1 -0
- package/dist/toolset/index.d.ts +12 -2
- package/dist/toolset/index.d.ts.map +1 -1
- package/dist/toolset/index.js +11 -4
- package/dist/toolset/index.js.map +1 -1
- package/dist/toolset/list_candidates.d.ts.map +1 -1
- package/dist/toolset/list_candidates.js +12 -19
- package/dist/toolset/list_candidates.js.map +1 -1
- package/dist/toolset/login.d.ts.map +1 -1
- package/dist/toolset/login.js +7 -4
- package/dist/toolset/login.js.map +1 -1
- package/dist/toolset/open_chat.d.ts +4 -1
- package/dist/toolset/open_chat.d.ts.map +1 -1
- package/dist/toolset/open_chat.js +365 -25
- package/dist/toolset/open_chat.js.map +1 -1
- package/dist/toolset/send_message.d.ts +11 -1
- package/dist/toolset/send_message.d.ts.map +1 -1
- package/dist/toolset/send_message.js +120 -21
- package/dist/toolset/send_message.js.map +1 -1
- package/dist/toolset/skill.d.ts +13 -0
- package/dist/toolset/skill.d.ts.map +1 -0
- package/dist/toolset/skill.js +85 -0
- package/dist/toolset/skill.js.map +1 -0
- package/package.json +5 -2
- package/skills/README.md +11 -0
- package/skills/boss-cli/SKILL.md +58 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Page } from 'puppeteer-core';
|
|
2
|
+
/** 导航到沟通页并 load 后,等待 SPA/接口渲染 */
|
|
3
|
+
export declare const CHAT_GOTO_SETTLE_MS: {
|
|
4
|
+
readonly min: 2800;
|
|
5
|
+
readonly max: 5200;
|
|
6
|
+
};
|
|
7
|
+
/** 页面执行上下文被销毁后重试前 */
|
|
8
|
+
export declare const CONTEXT_DESTROY_RETRY_MS: {
|
|
9
|
+
readonly min: 900;
|
|
10
|
+
readonly max: 1800;
|
|
11
|
+
};
|
|
12
|
+
/** 列表滚动查找候选人时,每轮之间的间隔 */
|
|
13
|
+
export declare const OPEN_CHAT_SCROLL_GAP_MS: {
|
|
14
|
+
readonly min: 200;
|
|
15
|
+
readonly max: 580;
|
|
16
|
+
};
|
|
17
|
+
/** 点击会话行后,等待右侧面板出现的短停顿 */
|
|
18
|
+
export declare const OPEN_CHAT_AFTER_ROW_CLICK_MS: {
|
|
19
|
+
readonly min: 420;
|
|
20
|
+
readonly max: 1200;
|
|
21
|
+
};
|
|
22
|
+
/** mouse.click 的按下/抬起间隔(Puppeteer delay 选项) */
|
|
23
|
+
export declare const MOUSE_CLICK_PRESS_MS: {
|
|
24
|
+
readonly min: 55;
|
|
25
|
+
readonly max: 180;
|
|
26
|
+
};
|
|
27
|
+
/** 筛选「全部」等操作之间的停顿 */
|
|
28
|
+
export declare const LIST_FILTER_GAP_MS: {
|
|
29
|
+
readonly min: 780;
|
|
30
|
+
readonly max: 1400;
|
|
31
|
+
};
|
|
32
|
+
/** 列表稳定轮询间隔(随机) */
|
|
33
|
+
export declare const LIST_POLL_MS: {
|
|
34
|
+
readonly min: 340;
|
|
35
|
+
readonly max: 620;
|
|
36
|
+
};
|
|
37
|
+
/** 列表为空时至少等待多久才认为稳定 */
|
|
38
|
+
export declare const LIST_MIN_BEFORE_EMPTY_OK_MS = 3600;
|
|
39
|
+
/** 登录态探测轮询间隔 */
|
|
40
|
+
export declare const PROBE_LOGIN_POLL_MS: {
|
|
41
|
+
readonly min: 520;
|
|
42
|
+
readonly max: 980;
|
|
43
|
+
};
|
|
44
|
+
/** 点击聊天输入框 */
|
|
45
|
+
export declare const SEND_INPUT_CLICK_MS: {
|
|
46
|
+
readonly min: 45;
|
|
47
|
+
readonly max: 160;
|
|
48
|
+
};
|
|
49
|
+
/** 逐字输入:字符间隔(随机) */
|
|
50
|
+
export declare const SEND_TYPING_GAP_MS: {
|
|
51
|
+
readonly min: 38;
|
|
52
|
+
readonly max: 125;
|
|
53
|
+
};
|
|
54
|
+
/** 按下 Enter 后、流程结束前短停顿 */
|
|
55
|
+
export declare const SEND_AFTER_ENTER_MS: {
|
|
56
|
+
readonly min: 260;
|
|
57
|
+
readonly max: 920;
|
|
58
|
+
};
|
|
59
|
+
/** `send` 中先发完文字后、再执行 `--action` 前的默认随机间隔(求简历 / 同意或拒绝附件等) */
|
|
60
|
+
export declare const SEND_BEFORE_RESUME_MS: {
|
|
61
|
+
readonly min: 2800;
|
|
62
|
+
readonly max: 5600;
|
|
63
|
+
};
|
|
64
|
+
/** 点击「沟通记录」后等待弹窗与列表渲染 */
|
|
65
|
+
export declare const CHAT_HISTORY_DIALOG_WAIT_MS: {
|
|
66
|
+
readonly min: 500;
|
|
67
|
+
readonly max: 1400;
|
|
68
|
+
};
|
|
69
|
+
/** 「同事沟通」/「我的沟通」切换后等待列表刷新 */
|
|
70
|
+
export declare const CHAT_HISTORY_TAB_SWITCH_MS: {
|
|
71
|
+
readonly min: 350;
|
|
72
|
+
readonly max: 900;
|
|
73
|
+
};
|
|
74
|
+
/** 点击「在线简历」后等待 iframe 出现 */
|
|
75
|
+
export declare const ONLINE_RESUME_IFRAME_APPEAR_MS: {
|
|
76
|
+
readonly min: 600;
|
|
77
|
+
readonly max: 1600;
|
|
78
|
+
};
|
|
79
|
+
/** iframe 出现后等待简历区域渲染 */
|
|
80
|
+
export declare const ONLINE_RESUME_IFRAME_SETTLE_MS: {
|
|
81
|
+
readonly min: 1800;
|
|
82
|
+
readonly max: 4200;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* 逐字符输入,字符之间为随机间隔(末尾字符后不再额外等待)。
|
|
86
|
+
*/
|
|
87
|
+
export declare function typeTextWithRandomKeyDelay(page: Page, text: string, minGapMs: number, maxGapMs: number, signal?: AbortSignal): Promise<void>;
|
|
88
|
+
//# sourceMappingURL=human_delay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human_delay.d.ts","sourceRoot":"","sources":["../../src/browser/human_delay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAG3C,iCAAiC;AACjC,eAAO,MAAM,mBAAmB;;;CAAoC,CAAC;AAErE,qBAAqB;AACrB,eAAO,MAAM,wBAAwB;;;CAAmC,CAAC;AAEzE,yBAAyB;AACzB,eAAO,MAAM,uBAAuB;;;CAAkC,CAAC;AAEvE,0BAA0B;AAC1B,eAAO,MAAM,4BAA4B;;;CAAmC,CAAC;AAE7E,+CAA+C;AAC/C,eAAO,MAAM,oBAAoB;;;CAAiC,CAAC;AAEnE,qBAAqB;AACrB,eAAO,MAAM,kBAAkB;;;CAAmC,CAAC;AAEnE,mBAAmB;AACnB,eAAO,MAAM,YAAY;;;CAAkC,CAAC;AAE5D,uBAAuB;AACvB,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,gBAAgB;AAChB,eAAO,MAAM,mBAAmB;;;CAAkC,CAAC;AAEnE,cAAc;AACd,eAAO,MAAM,mBAAmB;;;CAAiC,CAAC;AAElE,oBAAoB;AACpB,eAAO,MAAM,kBAAkB;;;CAAiC,CAAC;AAEjE,0BAA0B;AAC1B,eAAO,MAAM,mBAAmB;;;CAAkC,CAAC;AAEnE,6DAA6D;AAC7D,eAAO,MAAM,qBAAqB;;;CAAoC,CAAC;AAEvE,yBAAyB;AACzB,eAAO,MAAM,2BAA2B;;;CAAmC,CAAC;AAE5E,6BAA6B;AAC7B,eAAO,MAAM,0BAA0B;;;CAAkC,CAAC;AAE1E,4BAA4B;AAC5B,eAAO,MAAM,8BAA8B;;;CAAmC,CAAC;AAE/E,yBAAyB;AACzB,eAAO,MAAM,8BAA8B;;;CAAoC,CAAC;AAEhF;;GAEG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAYf"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { randomIntInclusive, sleep } from './timing.js';
|
|
2
|
+
/** 导航到沟通页并 load 后,等待 SPA/接口渲染 */
|
|
3
|
+
export const CHAT_GOTO_SETTLE_MS = { min: 2800, max: 5200 };
|
|
4
|
+
/** 页面执行上下文被销毁后重试前 */
|
|
5
|
+
export const CONTEXT_DESTROY_RETRY_MS = { min: 900, max: 1800 };
|
|
6
|
+
/** 列表滚动查找候选人时,每轮之间的间隔 */
|
|
7
|
+
export const OPEN_CHAT_SCROLL_GAP_MS = { min: 200, max: 580 };
|
|
8
|
+
/** 点击会话行后,等待右侧面板出现的短停顿 */
|
|
9
|
+
export const OPEN_CHAT_AFTER_ROW_CLICK_MS = { min: 420, max: 1200 };
|
|
10
|
+
/** mouse.click 的按下/抬起间隔(Puppeteer delay 选项) */
|
|
11
|
+
export const MOUSE_CLICK_PRESS_MS = { min: 55, max: 180 };
|
|
12
|
+
/** 筛选「全部」等操作之间的停顿 */
|
|
13
|
+
export const LIST_FILTER_GAP_MS = { min: 780, max: 1400 };
|
|
14
|
+
/** 列表稳定轮询间隔(随机) */
|
|
15
|
+
export const LIST_POLL_MS = { min: 340, max: 620 };
|
|
16
|
+
/** 列表为空时至少等待多久才认为稳定 */
|
|
17
|
+
export const LIST_MIN_BEFORE_EMPTY_OK_MS = 3600;
|
|
18
|
+
/** 登录态探测轮询间隔 */
|
|
19
|
+
export const PROBE_LOGIN_POLL_MS = { min: 520, max: 980 };
|
|
20
|
+
/** 点击聊天输入框 */
|
|
21
|
+
export const SEND_INPUT_CLICK_MS = { min: 45, max: 160 };
|
|
22
|
+
/** 逐字输入:字符间隔(随机) */
|
|
23
|
+
export const SEND_TYPING_GAP_MS = { min: 38, max: 125 };
|
|
24
|
+
/** 按下 Enter 后、流程结束前短停顿 */
|
|
25
|
+
export const SEND_AFTER_ENTER_MS = { min: 260, max: 920 };
|
|
26
|
+
/** `send` 中先发完文字后、再执行 `--action` 前的默认随机间隔(求简历 / 同意或拒绝附件等) */
|
|
27
|
+
export const SEND_BEFORE_RESUME_MS = { min: 2800, max: 5600 };
|
|
28
|
+
/** 点击「沟通记录」后等待弹窗与列表渲染 */
|
|
29
|
+
export const CHAT_HISTORY_DIALOG_WAIT_MS = { min: 500, max: 1400 };
|
|
30
|
+
/** 「同事沟通」/「我的沟通」切换后等待列表刷新 */
|
|
31
|
+
export const CHAT_HISTORY_TAB_SWITCH_MS = { min: 350, max: 900 };
|
|
32
|
+
/** 点击「在线简历」后等待 iframe 出现 */
|
|
33
|
+
export const ONLINE_RESUME_IFRAME_APPEAR_MS = { min: 600, max: 1600 };
|
|
34
|
+
/** iframe 出现后等待简历区域渲染 */
|
|
35
|
+
export const ONLINE_RESUME_IFRAME_SETTLE_MS = { min: 1800, max: 4200 };
|
|
36
|
+
/**
|
|
37
|
+
* 逐字符输入,字符之间为随机间隔(末尾字符后不再额外等待)。
|
|
38
|
+
*/
|
|
39
|
+
export async function typeTextWithRandomKeyDelay(page, text, minGapMs, maxGapMs, signal) {
|
|
40
|
+
const codepoints = Array.from(text);
|
|
41
|
+
for (let i = 0; i < codepoints.length; i++) {
|
|
42
|
+
if (signal?.aborted) {
|
|
43
|
+
throw new Error('Aborted');
|
|
44
|
+
}
|
|
45
|
+
const ch = codepoints[i];
|
|
46
|
+
await page.keyboard.type(ch, { delay: 0 });
|
|
47
|
+
if (i < codepoints.length - 1) {
|
|
48
|
+
await sleep(randomIntInclusive(minGapMs, maxGapMs), signal);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=human_delay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human_delay.js","sourceRoot":"","sources":["../../src/browser/human_delay.ts"],"names":[],"mappings":"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"}
|
package/dist/browser/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 浏览器:CDP 连接与会话(统一出口)。
|
|
3
3
|
*/
|
|
4
|
-
export
|
|
4
|
+
export * from './timing.js';
|
|
5
|
+
export * from './human_delay.js';
|
|
6
|
+
export { connectBrowser, createPageCDPSession, defaultViewportFromEnv, LAUNCH_ARGS_ALLOW_ALL_CORS, LAUNCH_ARGS_LESS_AUTOMATION, type ConnectBrowserOptions, wasLastChromeLaunchHeadless, } from './cdp_browser.js';
|
|
5
7
|
export { detachBrowserSession, disconnectBrowserSession, ensureAndGetBrowser, ensureBrowserSession, getBrowserRef, getPageRef, setSessionPage, } from './browser_session.js';
|
|
6
8
|
export * from './auth.js';
|
|
7
9
|
export { withLoggedInPage } from './withLoggedInPage.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,KAAK,qBAAqB,EAC1B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/browser/index.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 浏览器:CDP 连接与会话(统一出口)。
|
|
3
3
|
*/
|
|
4
|
-
export
|
|
4
|
+
export * from './timing.js';
|
|
5
|
+
export * from './human_delay.js';
|
|
6
|
+
export { connectBrowser, createPageCDPSession, defaultViewportFromEnv, LAUNCH_ARGS_ALLOW_ALL_CORS, LAUNCH_ARGS_LESS_AUTOMATION, wasLastChromeLaunchHeadless, } from './cdp_browser.js';
|
|
5
7
|
export { detachBrowserSession, disconnectBrowserSession, ensureAndGetBrowser, ensureBrowserSession, getBrowserRef, getPageRef, setSessionPage, } from './browser_session.js';
|
|
6
8
|
export * from './auth.js';
|
|
7
9
|
export { withLoggedInPage } from './withLoggedInPage.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,2BAA2B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAE3B,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** 固定休眠(支持 AbortSignal,与原先 auth.sleep 行为一致) */
|
|
2
|
+
export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
3
|
+
/** 含两端在内的随机整数(使用 crypto.randomInt) */
|
|
4
|
+
export declare function randomIntInclusive(min: number, max: number): number;
|
|
5
|
+
/** 在 [minMs, maxMs] 内随机等待 */
|
|
6
|
+
export declare function sleepRandom(minMs: number, maxMs: number, signal?: AbortSignal): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/browser/timing.ts"],"names":[],"mappings":"AAEA,+CAA+C;AAC/C,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBrE;AAED,sCAAsC;AACtC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOnE;AAED,6BAA6B;AAC7B,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAGf"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { randomInt } from 'node:crypto';
|
|
2
|
+
/** 固定休眠(支持 AbortSignal,与原先 auth.sleep 行为一致) */
|
|
3
|
+
export function sleep(ms, signal) {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
if (signal?.aborted) {
|
|
6
|
+
reject(new Error('Aborted'));
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const id = setTimeout(() => {
|
|
10
|
+
signal?.removeEventListener('abort', onAbort);
|
|
11
|
+
resolve();
|
|
12
|
+
}, ms);
|
|
13
|
+
const onAbort = () => {
|
|
14
|
+
clearTimeout(id);
|
|
15
|
+
reject(new Error('Aborted'));
|
|
16
|
+
};
|
|
17
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** 含两端在内的随机整数(使用 crypto.randomInt) */
|
|
21
|
+
export function randomIntInclusive(min, max) {
|
|
22
|
+
if (max < min) {
|
|
23
|
+
const t = min;
|
|
24
|
+
min = max;
|
|
25
|
+
max = t;
|
|
26
|
+
}
|
|
27
|
+
return randomInt(min, max + 1);
|
|
28
|
+
}
|
|
29
|
+
/** 在 [minMs, maxMs] 内随机等待 */
|
|
30
|
+
export async function sleepRandom(minMs, maxMs, signal) {
|
|
31
|
+
const ms = randomIntInclusive(minMs, maxMs);
|
|
32
|
+
return sleep(ms, signal);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/browser/timing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,+CAA+C;AAC/C,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,MAAoB;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE;YACzB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,EAAE,CAAC,CAAC;YACjB,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,GAAW;IACzD,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACd,MAAM,CAAC,GAAG,GAAG,CAAC;QACd,GAAG,GAAG,GAAG,CAAC;QACV,GAAG,GAAG,CAAC,CAAC;IACV,CAAC;IACD,OAAO,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,6BAA6B;AAC7B,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,KAAa,EACb,MAAoB;IAEpB,MAAM,EAAE,GAAG,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC"}
|
package/dist/cli/banner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/cli/banner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/cli/banner.ts"],"names":[],"mappings":"AA+CA,wBAAgB,0BAA0B,IAAI,IAAI,CAmBjD"}
|
package/dist/cli/banner.js
CHANGED
|
@@ -1,26 +1,60 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 进入交互模式(无参 `boss
|
|
3
|
-
*
|
|
2
|
+
* 进入交互模式(无参 `boss`)时在终端打印大号 ASCII 品牌条。
|
|
3
|
+
* figlet -f big BOSS-CLI(全大写,斜线/竖线/下划线拼字);无 NO_COLOR 且 stderr 为 TTY 时黑底白字。
|
|
4
4
|
*/
|
|
5
5
|
import process from 'node:process';
|
|
6
|
-
/**
|
|
7
|
-
const
|
|
6
|
+
/** 比字形略宽,左右留白(字形本身 54 列) */
|
|
7
|
+
const BANNER_WIDTH = 60;
|
|
8
|
+
/** figlet -f big BOSS-CLI(每行 54 字符) */
|
|
9
|
+
const BANNER_ART = [
|
|
10
|
+
' ____ ____ _____ _____ _____ _ _____ ',
|
|
11
|
+
' | _ \\ / __ \\ / ____/ ____| / ____| | |_ _|',
|
|
12
|
+
' | |_) | | | | (___| (___ ______| | | | | | ',
|
|
13
|
+
' | _ <| | | |\\___ \\\\___ \\______| | | | | | ',
|
|
14
|
+
' | |_) | |__| |____) |___) | | |____| |____ _| |_ ',
|
|
15
|
+
' |____/ \\____/|_____/_____/ \\_____|______|_____|',
|
|
16
|
+
];
|
|
17
|
+
function padCenter(line, width) {
|
|
18
|
+
const t = line.length > width ? line.slice(0, width) : line;
|
|
19
|
+
if (t.length >= width)
|
|
20
|
+
return t;
|
|
21
|
+
return t
|
|
22
|
+
.padStart(Math.floor((width + t.length) / 2), ' ')
|
|
23
|
+
.padEnd(width, ' ');
|
|
24
|
+
}
|
|
25
|
+
const BANNER_LINES = BANNER_ART.map((line) => padCenter(line, BANNER_WIDTH));
|
|
26
|
+
/** 黑底(40)+ 亮白字(97)+ 粗体,与空白行一致,保证整条色带对比度一致 */
|
|
27
|
+
const BG = '\x1b[40m';
|
|
28
|
+
const FG = '\x1b[97m';
|
|
29
|
+
const BD = '\x1b[1m';
|
|
30
|
+
const Z = '\x1b[0m';
|
|
31
|
+
function styleBannerLine(content) {
|
|
32
|
+
return `${BG}${FG}${BD}${content}${Z}`;
|
|
33
|
+
}
|
|
34
|
+
function blankBannerLine(useAnsi) {
|
|
35
|
+
if (useAnsi) {
|
|
36
|
+
console.error(styleBannerLine(' '.repeat(BANNER_WIDTH)));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.error('');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
8
42
|
export function printBossInteractiveBanner() {
|
|
9
43
|
const useAnsi = !process.env.NO_COLOR && process.env.TERM !== 'dumb' && (process.stderr.isTTY ?? false);
|
|
10
44
|
console.error('');
|
|
11
45
|
if (useAnsi) {
|
|
12
|
-
|
|
13
|
-
const W = '\x1b[97m';
|
|
14
|
-
const B = '\x1b[1m';
|
|
15
|
-
const Z = '\x1b[0m';
|
|
46
|
+
blankBannerLine(true);
|
|
16
47
|
for (const line of BANNER_LINES) {
|
|
17
|
-
console.error(
|
|
48
|
+
console.error(styleBannerLine(line));
|
|
18
49
|
}
|
|
50
|
+
blankBannerLine(true);
|
|
19
51
|
}
|
|
20
52
|
else {
|
|
53
|
+
blankBannerLine(false);
|
|
21
54
|
for (const line of BANNER_LINES) {
|
|
22
55
|
console.error(line);
|
|
23
56
|
}
|
|
57
|
+
blankBannerLine(false);
|
|
24
58
|
}
|
|
25
59
|
console.error('');
|
|
26
60
|
}
|
package/dist/cli/banner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/cli/banner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/cli/banner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,4BAA4B;AAC5B,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB,uCAAuC;AACvC,MAAM,UAAU,GAAG;IACjB,wDAAwD;IACxD,0DAA0D;IAC1D,wDAAwD;IACxD,4DAA4D;IAC5D,wDAAwD;IACxD,0DAA0D;CAC3D,CAAC;AAEF,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa;IAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5D,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC;SACL,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;SACjD,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;AAE7E,6CAA6C;AAC7C,MAAM,EAAE,GAAG,UAAU,CAAC;AACtB,MAAM,EAAE,GAAG,UAAU,CAAC;AACtB,MAAM,EAAE,GAAG,SAAS,CAAC;AACrB,MAAM,CAAC,GAAG,SAAS,CAAC;AAEpB,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CAAC,OAAgB;IACvC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,MAAM,OAAO,GACX,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IAE1F,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,IAAI,OAAO,EAAE,CAAC;QACZ,eAAe,CAAC,IAAI,CAAC,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,eAAe,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QACD,eAAe,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cliRouter.d.ts","sourceRoot":"","sources":["../../src/cli/cliRouter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cliRouter.d.ts","sourceRoot":"","sources":["../../src/cli/cliRouter.ts"],"names":[],"mappings":"AA4DA,gEAAgE;AAChE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAMxD;AAwID;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4EpE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAWjE;AA2CD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB1D"}
|
package/dist/cli/cliRouter.js
CHANGED
|
@@ -4,9 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { createInterface } from 'node:readline/promises';
|
|
6
6
|
import { stdin as input, stdout as output } from 'node:process';
|
|
7
|
-
import { detachBrowserSession
|
|
8
|
-
import {
|
|
9
|
-
import { implLogin, implListCandidates, implListUnreadCandidates, implListPositions, implOpenChat, implSendMessage, } from '../toolset/index.js';
|
|
7
|
+
import { detachBrowserSession } from '../browser/index.js';
|
|
8
|
+
import { implLogin, implListCandidates, implListUnreadCandidates, implListPositions, implOpenChat, implSendMessage, implSkill, } from '../toolset/index.js';
|
|
10
9
|
import { printBossInteractiveBanner } from './banner.js';
|
|
11
10
|
class CliError extends Error {
|
|
12
11
|
constructor(message) {
|
|
@@ -18,45 +17,23 @@ function envTruthy(name) {
|
|
|
18
17
|
const v = (process.env[name] ?? '').trim().toLowerCase();
|
|
19
18
|
return v === '1' || v === 'true' || v === 'yes' || v === 'y';
|
|
20
19
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
envTruthy('BOSSCLI_HEADFUL') ||
|
|
25
|
-
envTruthy('BOSS_CLI_HEADFUL'));
|
|
20
|
+
/** 默认有头;仅当环境变量为真时启用无头(与 `connectBrowser` 读取的 `BOSS_BROWSER_HEADLESS` 一致)。 */
|
|
21
|
+
function shouldRunHeadless() {
|
|
22
|
+
return envTruthy('BOSS_BROWSER_HEADLESS');
|
|
26
23
|
}
|
|
27
24
|
function configureHeadlessForCommand(cmd) {
|
|
28
25
|
if (cmd === 'login') {
|
|
29
|
-
// 登录必须可见:方便扫码/人机验证/手动操作
|
|
30
26
|
process.env.BOSS_BROWSER_HEADLESS = 'false';
|
|
31
27
|
return;
|
|
32
28
|
}
|
|
33
|
-
process.env.BOSS_BROWSER_HEADLESS =
|
|
29
|
+
process.env.BOSS_BROWSER_HEADLESS = shouldRunHeadless() ? 'true' : 'false';
|
|
34
30
|
}
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
async function cleanupAfterCommand(
|
|
40
|
-
const kill = shouldKillBrowserProcess();
|
|
41
|
-
// 交互模式:默认不断开;仅当显式要求关闭浏览器时处理(便于长时间复用同一会话)。
|
|
31
|
+
/**
|
|
32
|
+
* 一次性命令结束后:detach CDP,不关浏览器窗口。
|
|
33
|
+
* 交互模式在循环内不调用;退出 REPL 时在 `runInteractiveLoop` 的 finally 里单独 detach(避免 Node 退出时拖死 Chrome)。
|
|
34
|
+
*/
|
|
35
|
+
async function cleanupAfterCommand(_cmd, nonInteractive) {
|
|
42
36
|
if (!nonInteractive) {
|
|
43
|
-
if (!kill)
|
|
44
|
-
return;
|
|
45
|
-
if (cmd === 'login') {
|
|
46
|
-
await detachBrowserSession().catch(() => { });
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
await disconnectBrowserSession().catch(() => { });
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
// 一次性命令:login 始终只 detach,便于用户继续在窗口内操作。
|
|
53
|
-
if (cmd === 'login') {
|
|
54
|
-
await detachBrowserSession().catch(() => { });
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
// 其它命令:默认仅断开 CDP(进程可退出、浏览器窗口保留);BOSS_BROWSER_AUTO_CLOSE=1 时才 close。
|
|
58
|
-
if (kill) {
|
|
59
|
-
await disconnectBrowserSession().catch(() => { });
|
|
60
37
|
return;
|
|
61
38
|
}
|
|
62
39
|
await detachBrowserSession().catch(() => { });
|
|
@@ -106,6 +83,21 @@ function splitShellLine(line) {
|
|
|
106
83
|
}
|
|
107
84
|
return out;
|
|
108
85
|
}
|
|
86
|
+
/** 短命令为主;保留旧长名作为别名,避免已有脚本失效 */
|
|
87
|
+
function normalizeSubcommand(cmd) {
|
|
88
|
+
switch (cmd) {
|
|
89
|
+
case 'list-candidates':
|
|
90
|
+
return 'list';
|
|
91
|
+
case 'open-chat':
|
|
92
|
+
return 'chat';
|
|
93
|
+
case 'send-message':
|
|
94
|
+
return 'send';
|
|
95
|
+
case 'list-positions':
|
|
96
|
+
return 'jd';
|
|
97
|
+
default:
|
|
98
|
+
return cmd;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
109
101
|
function printHelp() {
|
|
110
102
|
console.error(`boss-cli — Boss 直聘浏览器自动化(纯 CLI,无 Agent 运行时)
|
|
111
103
|
|
|
@@ -116,19 +108,20 @@ function printHelp() {
|
|
|
116
108
|
显示本帮助
|
|
117
109
|
boss login
|
|
118
110
|
打开登录页(需要在浏览器中自行完成登录)
|
|
119
|
-
boss list
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
boss open-chat <姓名> [--strict]
|
|
111
|
+
boss list [--unread]
|
|
112
|
+
读取「全部」聊天列表候选人;--unread 仅显示未读(角标>0)
|
|
113
|
+
boss chat <姓名> [--strict] [--action online-resume]
|
|
123
114
|
打开指定联系人会话;默认包含匹配,--strict 为精确匹配
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
115
|
+
--action online-resume:额外点击「在线简历」并截图(可选 OCR,见环境变量说明)
|
|
116
|
+
boss send [--text <内容>] [-t <内容>] [--action <操作>]
|
|
117
|
+
--text 与 --action 可同时使用;先发消息再执行 action,中间有默认随机间隔
|
|
118
|
+
--action: request-resume | agree-resume | confuse-resume(confuse-resume=拒绝附件);须至少 text 或 action 其一
|
|
119
|
+
boss jd
|
|
120
|
+
读取本地 ~/.boss-cli/jd 目录下的岗位 Markdown(Windows 为 %USERPROFILE%\\.boss-cli\\jd)
|
|
121
|
+
boss skill
|
|
122
|
+
仅输出本包 Agent Skill 的说明(不安装)
|
|
123
|
+
boss skill install | boss skill uninstall
|
|
124
|
+
安装或移除唯一 Skill(boss-cli)到 ~/.agents/skills/(可用 BOSS_AGENT_SKILLS_DIR 覆盖根目录)
|
|
132
125
|
`);
|
|
133
126
|
}
|
|
134
127
|
/** 解析 `--key value` / `--key=value` / 布尔 `--flag` */
|
|
@@ -190,44 +183,68 @@ export async function executeCommand(argv) {
|
|
|
190
183
|
if (argv.length === 0) {
|
|
191
184
|
die('❌ 空命令');
|
|
192
185
|
}
|
|
193
|
-
const cmd = argv[0];
|
|
186
|
+
const cmd = normalizeSubcommand(argv[0]);
|
|
194
187
|
const tail = argv.slice(1);
|
|
195
188
|
configureHeadlessForCommand(cmd);
|
|
196
189
|
if (cmd === 'login') {
|
|
197
190
|
return implLogin();
|
|
198
191
|
}
|
|
199
|
-
if (cmd === 'list
|
|
192
|
+
if (cmd === 'list') {
|
|
200
193
|
const { flags } = parseOpts(tail);
|
|
201
194
|
if (flags.has('unread')) {
|
|
202
195
|
return implListUnreadCandidates();
|
|
203
196
|
}
|
|
204
197
|
return implListCandidates();
|
|
205
198
|
}
|
|
206
|
-
if (cmd === '
|
|
207
|
-
const { rest, flags } = parseOpts(tail);
|
|
199
|
+
if (cmd === 'chat') {
|
|
200
|
+
const { rest, flags, opts } = parseOpts(tail);
|
|
208
201
|
const nameArg = rest[0]?.trim();
|
|
209
202
|
if (!nameArg) {
|
|
210
|
-
die('❌ 用法:
|
|
203
|
+
die('❌ 用法: chat <姓名> [--strict] [--action online-resume]');
|
|
211
204
|
}
|
|
212
205
|
// 默认模糊匹配(包含);仅在指定 --strict 时做精确匹配
|
|
213
206
|
const exact = flags.has('strict');
|
|
214
|
-
|
|
207
|
+
const rawChatAction = (opts.action ?? '').trim().toLowerCase();
|
|
208
|
+
const chatActionMap = {
|
|
209
|
+
'online-resume': 'online-resume',
|
|
210
|
+
};
|
|
211
|
+
let chatAction;
|
|
212
|
+
if (rawChatAction) {
|
|
213
|
+
chatAction = chatActionMap[rawChatAction];
|
|
214
|
+
if (!chatAction) {
|
|
215
|
+
die(`❌ 未知 --action “${rawChatAction}”,可选:online-resume`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return implOpenChat(nameArg, exact, chatAction ? { action: chatAction } : undefined);
|
|
215
219
|
}
|
|
216
|
-
if (cmd === 'send
|
|
217
|
-
const { opts
|
|
220
|
+
if (cmd === 'send') {
|
|
221
|
+
const { opts } = parseOpts(tail);
|
|
218
222
|
const text = opts.text?.trim() || opts.t?.trim() || '';
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
223
|
+
const raw = (opts.action ?? '').trim().toLowerCase();
|
|
224
|
+
const actionMap = {
|
|
225
|
+
'request-resume': 'request-resume',
|
|
226
|
+
'agree-resume': 'agree-resume',
|
|
227
|
+
'confuse-resume': 'confuse-resume',
|
|
228
|
+
};
|
|
229
|
+
let action;
|
|
230
|
+
if (raw) {
|
|
231
|
+
action = actionMap[raw];
|
|
232
|
+
if (!action) {
|
|
233
|
+
die(`❌ 未知 --action “${raw}”,可选:request-resume | agree-resume | confuse-resume`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (!text && !action) {
|
|
237
|
+
die('❌ 用法: send [--text <消息>] [-t <消息>] [--action request-resume|agree-resume|confuse-resume](至少其一)');
|
|
224
238
|
}
|
|
225
|
-
return implSendMessage(text,
|
|
239
|
+
return implSendMessage({ text, action });
|
|
226
240
|
}
|
|
227
|
-
if (cmd === '
|
|
241
|
+
if (cmd === 'jd') {
|
|
228
242
|
return implListPositions();
|
|
229
243
|
}
|
|
230
|
-
|
|
244
|
+
if (cmd === 'skill') {
|
|
245
|
+
return implSkill(tail);
|
|
246
|
+
}
|
|
247
|
+
die(`❌ 未知命令 “${argv[0]}”。输入 help 查看用法。`);
|
|
231
248
|
}
|
|
232
249
|
export async function runOneCommand(argv) {
|
|
233
250
|
if (argv.length === 0) {
|
|
@@ -281,7 +298,8 @@ async function runInteractiveLoop() {
|
|
|
281
298
|
}
|
|
282
299
|
finally {
|
|
283
300
|
rl.close();
|
|
284
|
-
|
|
301
|
+
// 退出交互时进程即将结束,必须 detach + unref 子进程,否则 Chrome 常随 Node 一起退出
|
|
302
|
+
await detachBrowserSession().catch(() => { });
|
|
285
303
|
}
|
|
286
304
|
}
|
|
287
305
|
export async function runCli(argv) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cliRouter.js","sourceRoot":"","sources":["../../src/cli/cliRouter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"cliRouter.js","sourceRoot":"","sources":["../../src/cli/cliRouter.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// boss-cli 入口:子命令见 cliRouter;业务能力见 toolset(impl*)
|
|
3
|
+
// 环境变量:先读 ~/.boss-cli/.env,再读当前工作目录下的 .env(后者覆盖前者)。
|
|
4
|
+
import { existsSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { config as loadEnv } from 'dotenv';
|
|
7
|
+
import { APP_HOME } from '../config.js';
|
|
3
8
|
import { runCli, isReadlineAbortError } from './cliRouter.js';
|
|
9
|
+
const userEnvPath = join(APP_HOME, '.env');
|
|
10
|
+
if (existsSync(userEnvPath)) {
|
|
11
|
+
loadEnv({ path: userEnvPath });
|
|
12
|
+
}
|
|
13
|
+
loadEnv();
|
|
4
14
|
async function main() {
|
|
5
15
|
const args = process.argv.slice(2);
|
|
6
16
|
try {
|
|
@@ -17,5 +27,8 @@ async function main() {
|
|
|
17
27
|
process.exit(1);
|
|
18
28
|
}
|
|
19
29
|
}
|
|
20
|
-
main()
|
|
30
|
+
main().catch((err) => {
|
|
31
|
+
console.error('❌ 未捕获错误:', err);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
21
34
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,kDAAkD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,kDAAkD;AAClD,oDAAoD;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE9D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC3C,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;AACjC,CAAC;AACD,OAAO,EAAE,CAAC;AAEV,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAChC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|