@joohw/boss-cli 0.1.3 → 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 +83 -56
- 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,39 +17,26 @@ 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
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
async function cleanupAfterCommand(cmd, nonInteractive) {
|
|
43
|
-
// 约定:一次性命令默认自动清理,确保进程能退出;交互模式默认不清理(便于持续复用会话)。
|
|
44
|
-
const autoClose = hasExplicitAutoCloseEnv() ? shouldAutoCloseBrowser() : nonInteractive;
|
|
45
|
-
if (!autoClose)
|
|
46
|
-
return;
|
|
47
|
-
// login 需要用户继续在浏览器里操作:只断开连接,不关浏览器窗口
|
|
48
|
-
if (cmd === 'login') {
|
|
49
|
-
await detachBrowserSession().catch(() => { });
|
|
31
|
+
/**
|
|
32
|
+
* 一次性命令结束后:detach CDP,不关浏览器窗口。
|
|
33
|
+
* 交互模式在循环内不调用;退出 REPL 时在 `runInteractiveLoop` 的 finally 里单独 detach(避免 Node 退出时拖死 Chrome)。
|
|
34
|
+
*/
|
|
35
|
+
async function cleanupAfterCommand(_cmd, nonInteractive) {
|
|
36
|
+
if (!nonInteractive) {
|
|
50
37
|
return;
|
|
51
38
|
}
|
|
52
|
-
|
|
53
|
-
await disconnectBrowserSession().catch(() => { });
|
|
39
|
+
await detachBrowserSession().catch(() => { });
|
|
54
40
|
}
|
|
55
41
|
function die(msg) {
|
|
56
42
|
throw new CliError(msg);
|
|
@@ -97,6 +83,21 @@ function splitShellLine(line) {
|
|
|
97
83
|
}
|
|
98
84
|
return out;
|
|
99
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
|
+
}
|
|
100
101
|
function printHelp() {
|
|
101
102
|
console.error(`boss-cli — Boss 直聘浏览器自动化(纯 CLI,无 Agent 运行时)
|
|
102
103
|
|
|
@@ -107,19 +108,20 @@ function printHelp() {
|
|
|
107
108
|
显示本帮助
|
|
108
109
|
boss login
|
|
109
110
|
打开登录页(需要在浏览器中自行完成登录)
|
|
110
|
-
boss list
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
boss open-chat <姓名> [--strict]
|
|
111
|
+
boss list [--unread]
|
|
112
|
+
读取「全部」聊天列表候选人;--unread 仅显示未读(角标>0)
|
|
113
|
+
boss chat <姓名> [--strict] [--action online-resume]
|
|
114
114
|
打开指定联系人会话;默认包含匹配,--strict 为精确匹配
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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 覆盖根目录)
|
|
123
125
|
`);
|
|
124
126
|
}
|
|
125
127
|
/** 解析 `--key value` / `--key=value` / 布尔 `--flag` */
|
|
@@ -181,44 +183,68 @@ export async function executeCommand(argv) {
|
|
|
181
183
|
if (argv.length === 0) {
|
|
182
184
|
die('❌ 空命令');
|
|
183
185
|
}
|
|
184
|
-
const cmd = argv[0];
|
|
186
|
+
const cmd = normalizeSubcommand(argv[0]);
|
|
185
187
|
const tail = argv.slice(1);
|
|
186
188
|
configureHeadlessForCommand(cmd);
|
|
187
189
|
if (cmd === 'login') {
|
|
188
190
|
return implLogin();
|
|
189
191
|
}
|
|
190
|
-
if (cmd === 'list
|
|
192
|
+
if (cmd === 'list') {
|
|
191
193
|
const { flags } = parseOpts(tail);
|
|
192
194
|
if (flags.has('unread')) {
|
|
193
195
|
return implListUnreadCandidates();
|
|
194
196
|
}
|
|
195
197
|
return implListCandidates();
|
|
196
198
|
}
|
|
197
|
-
if (cmd === '
|
|
198
|
-
const { rest, flags } = parseOpts(tail);
|
|
199
|
+
if (cmd === 'chat') {
|
|
200
|
+
const { rest, flags, opts } = parseOpts(tail);
|
|
199
201
|
const nameArg = rest[0]?.trim();
|
|
200
202
|
if (!nameArg) {
|
|
201
|
-
die('❌ 用法:
|
|
203
|
+
die('❌ 用法: chat <姓名> [--strict] [--action online-resume]');
|
|
202
204
|
}
|
|
203
205
|
// 默认模糊匹配(包含);仅在指定 --strict 时做精确匹配
|
|
204
206
|
const exact = flags.has('strict');
|
|
205
|
-
|
|
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);
|
|
206
219
|
}
|
|
207
|
-
if (cmd === 'send
|
|
208
|
-
const { opts
|
|
220
|
+
if (cmd === 'send') {
|
|
221
|
+
const { opts } = parseOpts(tail);
|
|
209
222
|
const text = opts.text?.trim() || opts.t?.trim() || '';
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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](至少其一)');
|
|
215
238
|
}
|
|
216
|
-
return implSendMessage(text,
|
|
239
|
+
return implSendMessage({ text, action });
|
|
217
240
|
}
|
|
218
|
-
if (cmd === '
|
|
241
|
+
if (cmd === 'jd') {
|
|
219
242
|
return implListPositions();
|
|
220
243
|
}
|
|
221
|
-
|
|
244
|
+
if (cmd === 'skill') {
|
|
245
|
+
return implSkill(tail);
|
|
246
|
+
}
|
|
247
|
+
die(`❌ 未知命令 “${argv[0]}”。输入 help 查看用法。`);
|
|
222
248
|
}
|
|
223
249
|
export async function runOneCommand(argv) {
|
|
224
250
|
if (argv.length === 0) {
|
|
@@ -272,7 +298,8 @@ async function runInteractiveLoop() {
|
|
|
272
298
|
}
|
|
273
299
|
finally {
|
|
274
300
|
rl.close();
|
|
275
|
-
|
|
301
|
+
// 退出交互时进程即将结束,必须 detach + unref 子进程,否则 Chrome 常随 Node 一起退出
|
|
302
|
+
await detachBrowserSession().catch(() => { });
|
|
276
303
|
}
|
|
277
304
|
}
|
|
278
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"}
|