@viyzhu/boss-cli-fork 0.6.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.
- package/AGENTS.md +30 -0
- package/LICENSE +674 -0
- package/README.md +223 -0
- package/dist/browser/browser_session.d.ts +27 -0
- package/dist/browser/browser_session.d.ts.map +1 -0
- package/dist/browser/browser_session.js +246 -0
- package/dist/browser/browser_session.js.map +1 -0
- package/dist/browser/cdp_browser.d.ts +50 -0
- package/dist/browser/cdp_browser.d.ts.map +1 -0
- package/dist/browser/cdp_browser.js +315 -0
- package/dist/browser/cdp_browser.js.map +1 -0
- package/dist/browser/human_delay.d.ts +117 -0
- package/dist/browser/human_delay.d.ts.map +1 -0
- package/dist/browser/human_delay.js +71 -0
- package/dist/browser/human_delay.js.map +1 -0
- package/dist/browser/index.d.ts +9 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +9 -0
- package/dist/browser/index.js.map +1 -0
- 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/browser/viewport_temp.d.ts +15 -0
- package/dist/browser/viewport_temp.d.ts.map +1 -0
- package/dist/browser/viewport_temp.js +78 -0
- package/dist/browser/viewport_temp.js.map +1 -0
- package/dist/cli/banner.d.ts +2 -0
- package/dist/cli/banner.d.ts.map +1 -0
- package/dist/cli/banner.js +69 -0
- package/dist/cli/banner.js.map +1 -0
- package/dist/cli/cliRouter.d.ts +9 -0
- package/dist/cli/cliRouter.d.ts.map +1 -0
- package/dist/cli/cliRouter.js +604 -0
- package/dist/cli/cliRouter.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +34 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/version.d.ts +29 -0
- package/dist/cli/version.d.ts.map +1 -0
- package/dist/cli/version.js +180 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/common/auth.d.ts +44 -0
- package/dist/common/auth.d.ts.map +1 -0
- package/dist/common/auth.js +168 -0
- package/dist/common/auth.js.map +1 -0
- package/dist/common/baidu_user_env.d.ts +7 -0
- package/dist/common/baidu_user_env.d.ts.map +1 -0
- package/dist/common/baidu_user_env.js +56 -0
- package/dist/common/baidu_user_env.js.map +1 -0
- package/dist/common/boss_availability.d.ts +5 -0
- package/dist/common/boss_availability.d.ts.map +1 -0
- package/dist/common/boss_availability.js +245 -0
- package/dist/common/boss_availability.js.map +1 -0
- package/dist/common/boss_modal.d.ts +14 -0
- package/dist/common/boss_modal.d.ts.map +1 -0
- package/dist/common/boss_modal.js +81 -0
- package/dist/common/boss_modal.js.map +1 -0
- package/dist/common/boss_page_guards.d.ts +14 -0
- package/dist/common/boss_page_guards.d.ts.map +1 -0
- package/dist/common/boss_page_guards.js +596 -0
- package/dist/common/boss_page_guards.js.map +1 -0
- package/dist/common/boss_paywall_popup.d.ts +28 -0
- package/dist/common/boss_paywall_popup.d.ts.map +1 -0
- package/dist/common/boss_paywall_popup.js +158 -0
- package/dist/common/boss_paywall_popup.js.map +1 -0
- package/dist/common/boss_session_lock.d.ts +2 -0
- package/dist/common/boss_session_lock.d.ts.map +1 -0
- package/dist/common/boss_session_lock.js +127 -0
- package/dist/common/boss_session_lock.js.map +1 -0
- package/dist/common/boss_session_page.d.ts +27 -0
- package/dist/common/boss_session_page.d.ts.map +1 -0
- package/dist/common/boss_session_page.js +173 -0
- package/dist/common/boss_session_page.js.map +1 -0
- package/dist/common/boss_sidebar_nav.d.ts +7 -0
- package/dist/common/boss_sidebar_nav.d.ts.map +1 -0
- package/dist/common/boss_sidebar_nav.js +53 -0
- package/dist/common/boss_sidebar_nav.js.map +1 -0
- package/dist/common/c_resume_capture.d.ts +19 -0
- package/dist/common/c_resume_capture.d.ts.map +1 -0
- package/dist/common/c_resume_capture.js +185 -0
- package/dist/common/c_resume_capture.js.map +1 -0
- package/dist/common/ensure_page.d.ts +9 -0
- package/dist/common/ensure_page.d.ts.map +1 -0
- package/dist/common/ensure_page.js +14 -0
- package/dist/common/ensure_page.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -0
- package/dist/ocr/baidu_ocr.d.ts +13 -0
- package/dist/ocr/baidu_ocr.d.ts.map +1 -0
- package/dist/ocr/baidu_ocr.js +80 -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 +38 -0
- package/dist/ocr/resume_ocr.js.map +1 -0
- package/dist/toolset/action.d.ts +12 -0
- package/dist/toolset/action.d.ts.map +1 -0
- package/dist/toolset/action.js +521 -0
- package/dist/toolset/action.js.map +1 -0
- package/dist/toolset/baidu_credentials.d.ts +5 -0
- package/dist/toolset/baidu_credentials.d.ts.map +1 -0
- package/dist/toolset/baidu_credentials.js +24 -0
- package/dist/toolset/baidu_credentials.js.map +1 -0
- package/dist/toolset/chat.d.ts +10 -0
- package/dist/toolset/chat.d.ts.map +1 -0
- package/dist/toolset/chat.js +763 -0
- package/dist/toolset/chat.js.map +1 -0
- package/dist/toolset/deep-search.d.ts +35 -0
- package/dist/toolset/deep-search.d.ts.map +1 -0
- package/dist/toolset/deep-search.js +1505 -0
- package/dist/toolset/deep-search.js.map +1 -0
- package/dist/toolset/greet.d.ts +6 -0
- package/dist/toolset/greet.d.ts.map +1 -0
- package/dist/toolset/greet.js +81 -0
- package/dist/toolset/greet.js.map +1 -0
- package/dist/toolset/index.d.ts +48 -0
- package/dist/toolset/index.d.ts.map +1 -0
- package/dist/toolset/index.js +71 -0
- package/dist/toolset/index.js.map +1 -0
- package/dist/toolset/jd.d.ts +10 -0
- package/dist/toolset/jd.d.ts.map +1 -0
- package/dist/toolset/jd.js +406 -0
- package/dist/toolset/jd.js.map +1 -0
- package/dist/toolset/list.d.ts +6 -0
- package/dist/toolset/list.d.ts.map +1 -0
- package/dist/toolset/list.js +146 -0
- package/dist/toolset/list.js.map +1 -0
- package/dist/toolset/login.d.ts +6 -0
- package/dist/toolset/login.d.ts.map +1 -0
- package/dist/toolset/login.js +76 -0
- package/dist/toolset/login.js.map +1 -0
- package/dist/toolset/normal-search.d.ts +12 -0
- package/dist/toolset/normal-search.d.ts.map +1 -0
- package/dist/toolset/normal-search.js +301 -0
- package/dist/toolset/normal-search.js.map +1 -0
- package/dist/toolset/preview.d.ts +5 -0
- package/dist/toolset/preview.d.ts.map +1 -0
- package/dist/toolset/preview.js +100 -0
- package/dist/toolset/preview.js.map +1 -0
- package/dist/toolset/recommend.d.ts +36 -0
- package/dist/toolset/recommend.d.ts.map +1 -0
- package/dist/toolset/recommend.js +428 -0
- package/dist/toolset/recommend.js.map +1 -0
- package/dist/toolset/send.d.ts +7 -0
- package/dist/toolset/send.d.ts.map +1 -0
- package/dist/toolset/send.js +52 -0
- package/dist/toolset/send.js.map +1 -0
- package/package.json +69 -0
- package/skills/boss-frontend-analysis/SKILL.md +58 -0
- package/skills/boss-frontend-analysis/agents/openai.yaml +4 -0
- package/skills/boss-frontend-analysis/scripts/capture_boss_frontend.mjs +604 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
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';
|
|
8
|
+
import { runCli, isReadlineAbortError } from './cliRouter.js';
|
|
9
|
+
const userEnvPath = join(APP_HOME, '.env');
|
|
10
|
+
if (existsSync(userEnvPath)) {
|
|
11
|
+
loadEnv({ path: userEnvPath, quiet: true });
|
|
12
|
+
}
|
|
13
|
+
loadEnv({ quiet: true });
|
|
14
|
+
async function main() {
|
|
15
|
+
const args = process.argv.slice(2);
|
|
16
|
+
try {
|
|
17
|
+
await runCli(args);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
if (isReadlineAbortError(error)) {
|
|
21
|
+
process.exit(0);
|
|
22
|
+
}
|
|
23
|
+
console.error('❌ 执行出错:', error);
|
|
24
|
+
if (error instanceof Error) {
|
|
25
|
+
console.error('错误信息:', error.message);
|
|
26
|
+
}
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
main().catch((err) => {
|
|
31
|
+
console.error('❌ 未捕获错误:', err);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC;AACD,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEzB,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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare function getPackageMeta(): {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
};
|
|
5
|
+
/** 比较 semver x.y.z(忽略预发布标签,仅比较主版本段) */
|
|
6
|
+
export declare function compareSemver(a: string, b: string): number;
|
|
7
|
+
export type PackageUpdateCheckResult = {
|
|
8
|
+
checked: boolean;
|
|
9
|
+
current: string;
|
|
10
|
+
latest: string | null;
|
|
11
|
+
updateAvailable: boolean;
|
|
12
|
+
};
|
|
13
|
+
type CheckPackageUpdateOptions = {
|
|
14
|
+
currentVersion?: string;
|
|
15
|
+
fetchLatestVersion?: (packageName: string) => Promise<string>;
|
|
16
|
+
force?: boolean;
|
|
17
|
+
intervalMs?: number;
|
|
18
|
+
now?: Date;
|
|
19
|
+
packageName?: string;
|
|
20
|
+
statePath?: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function fetchNpmLatestVersion(packageName: string): Promise<string>;
|
|
23
|
+
export declare function formatPackageUpdateNotice(result: PackageUpdateCheckResult): string;
|
|
24
|
+
export declare function checkPackageUpdate(options?: CheckPackageUpdateOptions): Promise<PackageUpdateCheckResult>;
|
|
25
|
+
export declare function printPackageUpdateNoticeIfDue(): Promise<void>;
|
|
26
|
+
export declare function printVersionInfo(): Promise<void>;
|
|
27
|
+
export declare function runPackageUpdate(): Promise<string>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":"AAeA,wBAAgB,cAAc,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CASlE;AAED,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB1D;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC;AASF,KAAK,yBAAyB,GAAG;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAchF;AAqDD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,CAKlF;AAED,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,wBAAwB,CAAC,CAkCnC;AAED,wBAAsB,6BAA6B,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAStD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAyBxD"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import process from 'node:process';
|
|
6
|
+
import { fileURLToPath } from 'node:url';
|
|
7
|
+
import { CACHE_DIR } from '../config.js';
|
|
8
|
+
const UPDATE_CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
9
|
+
const UPDATE_CHECK_STATE_FILE = join(CACHE_DIR, 'version-check.json');
|
|
10
|
+
function getPackageJsonPath() {
|
|
11
|
+
return join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'package.json');
|
|
12
|
+
}
|
|
13
|
+
export function getPackageMeta() {
|
|
14
|
+
const raw = readFileSync(getPackageJsonPath(), 'utf8');
|
|
15
|
+
const parsed = JSON.parse(raw);
|
|
16
|
+
const name = typeof parsed.name === 'string' ? parsed.name : '';
|
|
17
|
+
const version = typeof parsed.version === 'string' ? parsed.version : '';
|
|
18
|
+
if (!name || !version) {
|
|
19
|
+
throw new Error('package.json 缺少有效的 name 或 version 字段');
|
|
20
|
+
}
|
|
21
|
+
return { name, version };
|
|
22
|
+
}
|
|
23
|
+
/** 比较 semver x.y.z(忽略预发布标签,仅比较主版本段) */
|
|
24
|
+
export function compareSemver(a, b) {
|
|
25
|
+
const core = (s) => s.split('-')[0] ?? '';
|
|
26
|
+
const pa = core(a).split('.').map((x) => parseInt(x, 10));
|
|
27
|
+
const pb = core(b).split('.').map((x) => parseInt(x, 10));
|
|
28
|
+
if (pa.some((n) => Number.isNaN(n)) || pb.some((n) => Number.isNaN(n))) {
|
|
29
|
+
throw new Error(`无法解析的版本号: ${JSON.stringify(a)} / ${JSON.stringify(b)}`);
|
|
30
|
+
}
|
|
31
|
+
const len = Math.max(pa.length, pb.length);
|
|
32
|
+
for (let i = 0; i < len; i++) {
|
|
33
|
+
const da = pa[i] ?? 0;
|
|
34
|
+
const db = pb[i] ?? 0;
|
|
35
|
+
if (da !== db) {
|
|
36
|
+
return da > db ? 1 : -1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
export async function fetchNpmLatestVersion(packageName) {
|
|
42
|
+
const path = `${encodeURIComponent(packageName)}/latest`;
|
|
43
|
+
const url = `https://registry.npmjs.org/${path}`;
|
|
44
|
+
const res = await fetch(url, {
|
|
45
|
+
headers: { Accept: 'application/json' },
|
|
46
|
+
});
|
|
47
|
+
if (!res.ok) {
|
|
48
|
+
throw new Error(`查询 npm 最新版本失败:HTTP ${res.status}(${url})`);
|
|
49
|
+
}
|
|
50
|
+
const data = (await res.json());
|
|
51
|
+
if (typeof data.version !== 'string' || data.version.length === 0) {
|
|
52
|
+
throw new Error('npm registry 响应缺少有效的 version 字段');
|
|
53
|
+
}
|
|
54
|
+
return data.version;
|
|
55
|
+
}
|
|
56
|
+
function getUpdateCheckStatePath() {
|
|
57
|
+
return process.env.BOSS_CLI_UPDATE_CHECK_STATE_PATH?.trim() || UPDATE_CHECK_STATE_FILE;
|
|
58
|
+
}
|
|
59
|
+
function shouldCheckFromState(state, now, intervalMs) {
|
|
60
|
+
if (!state) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
const checkedAtMs = Date.parse(state.checkedAt);
|
|
64
|
+
if (Number.isNaN(checkedAtMs)) {
|
|
65
|
+
throw new Error(`版本检查缓存 checkedAt 无法解析:${state.checkedAt}`);
|
|
66
|
+
}
|
|
67
|
+
return now.getTime() - checkedAtMs > intervalMs;
|
|
68
|
+
}
|
|
69
|
+
async function readUpdateCheckState(statePath) {
|
|
70
|
+
if (!existsSync(statePath)) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const raw = await readFile(statePath, 'utf8');
|
|
74
|
+
const parsed = JSON.parse(raw);
|
|
75
|
+
if (typeof parsed.checkedAt !== 'string' ||
|
|
76
|
+
typeof parsed.packageName !== 'string' ||
|
|
77
|
+
typeof parsed.currentVersion !== 'string' ||
|
|
78
|
+
typeof parsed.latestVersion !== 'string') {
|
|
79
|
+
throw new Error(`版本检查缓存格式无效:${statePath}`);
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
checkedAt: parsed.checkedAt,
|
|
83
|
+
packageName: parsed.packageName,
|
|
84
|
+
currentVersion: parsed.currentVersion,
|
|
85
|
+
latestVersion: parsed.latestVersion,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async function writeUpdateCheckState(statePath, state) {
|
|
89
|
+
await mkdir(dirname(statePath), { recursive: true });
|
|
90
|
+
const tmpPath = `${statePath}.tmp`;
|
|
91
|
+
await writeFile(tmpPath, `${JSON.stringify(state, null, 2)}\n`, 'utf8');
|
|
92
|
+
await rename(tmpPath, statePath);
|
|
93
|
+
}
|
|
94
|
+
export function formatPackageUpdateNotice(result) {
|
|
95
|
+
if (!result.updateAvailable || !result.latest) {
|
|
96
|
+
throw new Error('没有可用更新,无法生成升级提示');
|
|
97
|
+
}
|
|
98
|
+
return `[boss-cli] boss-cli 需要升级:当前 ${result.current},最新 ${result.latest}。请运行 boss update`;
|
|
99
|
+
}
|
|
100
|
+
export async function checkPackageUpdate(options = {}) {
|
|
101
|
+
const meta = getPackageMeta();
|
|
102
|
+
const packageName = options.packageName ?? meta.name;
|
|
103
|
+
const current = options.currentVersion ?? meta.version;
|
|
104
|
+
const now = options.now ?? new Date();
|
|
105
|
+
const intervalMs = options.intervalMs ?? UPDATE_CHECK_INTERVAL_MS;
|
|
106
|
+
const statePath = options.statePath ?? getUpdateCheckStatePath();
|
|
107
|
+
const fetchLatestVersion = options.fetchLatestVersion ?? fetchNpmLatestVersion;
|
|
108
|
+
const state = await readUpdateCheckState(statePath);
|
|
109
|
+
if (!options.force && !shouldCheckFromState(state, now, intervalMs)) {
|
|
110
|
+
const latest = state?.latestVersion ?? null;
|
|
111
|
+
return {
|
|
112
|
+
checked: false,
|
|
113
|
+
current,
|
|
114
|
+
latest,
|
|
115
|
+
updateAvailable: latest ? compareSemver(latest, current) > 0 : false,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const latest = await fetchLatestVersion(packageName);
|
|
119
|
+
const result = {
|
|
120
|
+
checked: true,
|
|
121
|
+
current,
|
|
122
|
+
latest,
|
|
123
|
+
updateAvailable: compareSemver(latest, current) > 0,
|
|
124
|
+
};
|
|
125
|
+
await writeUpdateCheckState(statePath, {
|
|
126
|
+
checkedAt: now.toISOString(),
|
|
127
|
+
packageName,
|
|
128
|
+
currentVersion: current,
|
|
129
|
+
latestVersion: latest,
|
|
130
|
+
});
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
export async function printPackageUpdateNoticeIfDue() {
|
|
134
|
+
try {
|
|
135
|
+
const result = await checkPackageUpdate();
|
|
136
|
+
if (result.checked && result.updateAvailable) {
|
|
137
|
+
console.error(formatPackageUpdateNotice(result));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (e) {
|
|
141
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
142
|
+
console.error(`[boss-cli] 版本更新检查失败:${message}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
export async function printVersionInfo() {
|
|
146
|
+
const { name, version: current } = getPackageMeta();
|
|
147
|
+
console.log(`${name} ${current}`);
|
|
148
|
+
const result = await checkPackageUpdate({ force: true });
|
|
149
|
+
if (result.updateAvailable) {
|
|
150
|
+
console.log(formatPackageUpdateNotice(result));
|
|
151
|
+
}
|
|
152
|
+
else if (result.latest) {
|
|
153
|
+
console.log(`未发现更新:当前 ${result.current},npm latest ${result.latest}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
export async function runPackageUpdate() {
|
|
157
|
+
const { name } = getPackageMeta();
|
|
158
|
+
const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';
|
|
159
|
+
const args = ['install', '-g', `${name}@latest`];
|
|
160
|
+
console.error(`[boss-cli] 正在执行:npm install -g ${name}@latest`);
|
|
161
|
+
const code = await new Promise((resolve, reject) => {
|
|
162
|
+
const child = spawn(npmCommand, args, {
|
|
163
|
+
shell: process.platform === 'win32',
|
|
164
|
+
stdio: 'inherit',
|
|
165
|
+
});
|
|
166
|
+
child.on('error', reject);
|
|
167
|
+
child.on('close', (exitCode, signal) => {
|
|
168
|
+
if (signal) {
|
|
169
|
+
reject(new Error(`npm 更新进程被信号中断:${signal}`));
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
resolve(exitCode ?? 0);
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
if (code !== 0) {
|
|
176
|
+
throw new Error(`npm 更新失败,退出码 ${code}`);
|
|
177
|
+
}
|
|
178
|
+
return 'boss-cli 更新完成。请重新运行 boss version 确认当前版本。';
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/cli/version.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boss 直聘 URL 约定、登录态探测文案与 `Page` 上只读探测(不连 CDP、不启动浏览器)。
|
|
3
|
+
*/
|
|
4
|
+
import type { Page } from 'puppeteer-core';
|
|
5
|
+
/** Boss 直聘首页 */
|
|
6
|
+
export declare const BOSS_ZHIPIN_HOME = "https://www.zhipin.com/";
|
|
7
|
+
/** 默认落地页(杭州 SEO 首页);CLI 等未配置环境变量时使用 */
|
|
8
|
+
export declare const BOSS_DEFAULT_LANDING_URL = "https://www.zhipin.com/hangzhou/?seoRefer=index";
|
|
9
|
+
/** 沟通页(登录成功后的典型落地页之一) */
|
|
10
|
+
export declare const BOSS_CHAT_INDEX_URL = "https://www.zhipin.com/web/chat/index";
|
|
11
|
+
/** 尚未有可用的浏览器会话时的提示文本(供工具抛错复用)。 */
|
|
12
|
+
export declare function createWaitManualLoginRequiredText(action: string): string;
|
|
13
|
+
/** 当前 URL 是否属于 Boss 直聘站点(hostname 含 `zhipin.com`);`about:blank` / 空 / 非法视为否 */
|
|
14
|
+
export declare function isBossZhipinSiteUrl(url: string): boolean;
|
|
15
|
+
/** 当前 URL 是否为沟通页 `/web/chat/index`(允许带 query) */
|
|
16
|
+
export declare function isBossChatIndexUrl(url: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 是否已经位于 Boss 已登录主壳页(pathname 以 `/web/chat/` 开头)。
|
|
19
|
+
* 当前已知主壳页:`/web/chat/index`、`/web/chat/recommend`、`/web/chat/aiform`、`/web/chat/job/list`。
|
|
20
|
+
* 它们共享同一套侧栏 `.menu-list`,校验登录态时不必再额外跳回 `/web/chat/index`。
|
|
21
|
+
*/
|
|
22
|
+
export declare function isBossChatShellUrl(url: string): boolean;
|
|
23
|
+
/** 未登录时常见跳转:如 `https://www.zhipin.com/web/user/?ka=bticket` */
|
|
24
|
+
export declare function isWebUserLoginUrl(url: string): boolean;
|
|
25
|
+
export type ProbeLoggedInSignals = {
|
|
26
|
+
hasNickname: boolean;
|
|
27
|
+
navLoginCta: boolean;
|
|
28
|
+
hasLogoutHint: boolean;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* 根据当前页判断是否已登录(不导航)。
|
|
32
|
+
*
|
|
33
|
+
* **已登录(true)**:检测到顶栏昵称、或「退出登录」/logout 等信号。
|
|
34
|
+
* 会短轮询等待 SPA 渲染,避免 `goto` 后立即读静态 HTML 误判。
|
|
35
|
+
*
|
|
36
|
+
* **未登录(false)**:`/web/user/` 登录流 URL、顶栏出现「我要登录」入口、且轮询结束仍无昵称/退出类信号。
|
|
37
|
+
*/
|
|
38
|
+
export declare function probeLoggedInFromPage(page: Page): Promise<{
|
|
39
|
+
loggedIn: boolean;
|
|
40
|
+
url: string;
|
|
41
|
+
}>;
|
|
42
|
+
/** 沟通页且已登录(与 {@link probeLoggedInFromPage} 一致)。 */
|
|
43
|
+
export declare function probeBossChatIndexLoggedIn(page: Page): Promise<boolean>;
|
|
44
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/common/auth.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAI3C,gBAAgB;AAChB,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D,uCAAuC;AACvC,eAAO,MAAM,wBAAwB,oDACc,CAAC;AAEpD,yBAAyB;AACzB,eAAO,MAAM,mBAAmB,0CAA0C,CAAC;AAE3E,kCAAkC;AAClC,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUxD;AAED,iDAAiD;AACjD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWvD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWvD;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUtD;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AA6DF;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,IAAI,GACT,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB7C;AAED,mDAAmD;AACnD,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7E"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { PROBE_LOGIN_POLL_MS } from '../browser/human_delay.js';
|
|
2
|
+
import { sleepRandom } from '../browser/timing.js';
|
|
3
|
+
/** Boss 直聘首页 */
|
|
4
|
+
export const BOSS_ZHIPIN_HOME = 'https://www.zhipin.com/';
|
|
5
|
+
/** 默认落地页(杭州 SEO 首页);CLI 等未配置环境变量时使用 */
|
|
6
|
+
export const BOSS_DEFAULT_LANDING_URL = 'https://www.zhipin.com/hangzhou/?seoRefer=index';
|
|
7
|
+
/** 沟通页(登录成功后的典型落地页之一) */
|
|
8
|
+
export const BOSS_CHAT_INDEX_URL = 'https://www.zhipin.com/web/chat/index';
|
|
9
|
+
/** 尚未有可用的浏览器会话时的提示文本(供工具抛错复用)。 */
|
|
10
|
+
export function createWaitManualLoginRequiredText(action) {
|
|
11
|
+
return `浏览器尚未初始化,无法${action}。请先运行 boss login 并在浏览器中完成登录。`;
|
|
12
|
+
}
|
|
13
|
+
/** 当前 URL 是否属于 Boss 直聘站点(hostname 含 `zhipin.com`);`about:blank` / 空 / 非法视为否 */
|
|
14
|
+
export function isBossZhipinSiteUrl(url) {
|
|
15
|
+
if (!url || url === 'about:blank') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const u = new URL(url);
|
|
20
|
+
return u.hostname.includes('zhipin.com');
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** 当前 URL 是否为沟通页 `/web/chat/index`(允许带 query) */
|
|
27
|
+
export function isBossChatIndexUrl(url) {
|
|
28
|
+
try {
|
|
29
|
+
const u = new URL(url);
|
|
30
|
+
if (!u.hostname.includes('zhipin.com')) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const p = u.pathname.replace(/\/+$/, '') || '/';
|
|
34
|
+
return p === '/web/chat/index';
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 是否已经位于 Boss 已登录主壳页(pathname 以 `/web/chat/` 开头)。
|
|
42
|
+
* 当前已知主壳页:`/web/chat/index`、`/web/chat/recommend`、`/web/chat/aiform`、`/web/chat/job/list`。
|
|
43
|
+
* 它们共享同一套侧栏 `.menu-list`,校验登录态时不必再额外跳回 `/web/chat/index`。
|
|
44
|
+
*/
|
|
45
|
+
export function isBossChatShellUrl(url) {
|
|
46
|
+
try {
|
|
47
|
+
const u = new URL(url);
|
|
48
|
+
if (!u.hostname.includes('zhipin.com')) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const p = u.pathname.replace(/\/+$/, '') || '/';
|
|
52
|
+
return p === '/web/chat' || p.startsWith('/web/chat/');
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** 未登录时常见跳转:如 `https://www.zhipin.com/web/user/?ka=bticket` */
|
|
59
|
+
export function isWebUserLoginUrl(url) {
|
|
60
|
+
try {
|
|
61
|
+
const u = new URL(url);
|
|
62
|
+
if (!u.hostname.includes('zhipin.com')) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return u.pathname.includes('/web/user/');
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 必须在页面里执行的探测脚本(纯字符串)。
|
|
73
|
+
* `tsx`/esbuild 转译 `page.evaluate(() => { ... })` 时可能注入 `__name(...)`,序列化到浏览器后会报 `__name is not defined`。
|
|
74
|
+
*/
|
|
75
|
+
const PROBE_LOGGED_IN_SIGNALS_SCRIPT = `(() => {
|
|
76
|
+
function isNick(t) {
|
|
77
|
+
const s = t.replace(/\\s+/g, " ").trim();
|
|
78
|
+
if (s.length < 2 || s.length > 64) return false;
|
|
79
|
+
return !/^(我要登录|登录|注册|登录\\/注册)$/u.test(s);
|
|
80
|
+
}
|
|
81
|
+
var hasNickname = false;
|
|
82
|
+
var nickSelectors = [
|
|
83
|
+
".user-name",
|
|
84
|
+
"span.user-name",
|
|
85
|
+
"[class*='user-name']",
|
|
86
|
+
".label-name",
|
|
87
|
+
".nav-user .name",
|
|
88
|
+
".nav-user-name",
|
|
89
|
+
"a.nav-user",
|
|
90
|
+
".header-nav [class*='name']",
|
|
91
|
+
];
|
|
92
|
+
var si, i, els, el, t;
|
|
93
|
+
for (si = 0; si < nickSelectors.length; si++) {
|
|
94
|
+
els = document.querySelectorAll(nickSelectors[si]);
|
|
95
|
+
for (i = 0; i < els.length; i++) {
|
|
96
|
+
el = els[i];
|
|
97
|
+
t = (el.textContent || "").trim();
|
|
98
|
+
if (isNick(t)) {
|
|
99
|
+
hasNickname = true;
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (hasNickname) break;
|
|
104
|
+
}
|
|
105
|
+
var navRoots = [];
|
|
106
|
+
var navSels = ["header", ".nav-header", ".nav-wrap", ".top-header", "#header", ".header", ".navbar"];
|
|
107
|
+
var j, ne;
|
|
108
|
+
for (j = 0; j < navSels.length; j++) {
|
|
109
|
+
ne = document.querySelector(navSels[j]);
|
|
110
|
+
if (ne instanceof HTMLElement) navRoots.push(ne);
|
|
111
|
+
}
|
|
112
|
+
var navLoginCta = false;
|
|
113
|
+
for (i = 0; i < navRoots.length; i++) {
|
|
114
|
+
if (/\\b我要登录\\b/u.test(navRoots[i].innerText || "")) {
|
|
115
|
+
navLoginCta = true;
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
var bodyText = document.body instanceof HTMLElement ? document.body.innerText || "" : "";
|
|
120
|
+
var hasLogoutHint =
|
|
121
|
+
/\\b退出登录\\b/u.test(bodyText) ||
|
|
122
|
+
!!document.querySelector("a[href*='logout'], a[href*='signout'], [data-url*='logout']");
|
|
123
|
+
return { hasNickname: hasNickname, navLoginCta: navLoginCta, hasLogoutHint: hasLogoutHint };
|
|
124
|
+
})()`;
|
|
125
|
+
async function probeLoggedInSignals(page) {
|
|
126
|
+
return (await page.evaluate(PROBE_LOGGED_IN_SIGNALS_SCRIPT));
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 根据当前页判断是否已登录(不导航)。
|
|
130
|
+
*
|
|
131
|
+
* **已登录(true)**:检测到顶栏昵称、或「退出登录」/logout 等信号。
|
|
132
|
+
* 会短轮询等待 SPA 渲染,避免 `goto` 后立即读静态 HTML 误判。
|
|
133
|
+
*
|
|
134
|
+
* **未登录(false)**:`/web/user/` 登录流 URL、顶栏出现「我要登录」入口、且轮询结束仍无昵称/退出类信号。
|
|
135
|
+
*/
|
|
136
|
+
export async function probeLoggedInFromPage(page) {
|
|
137
|
+
const url = page.url();
|
|
138
|
+
if (!url || url === 'about:blank') {
|
|
139
|
+
return { loggedIn: false, url: url || '' };
|
|
140
|
+
}
|
|
141
|
+
if (isWebUserLoginUrl(url)) {
|
|
142
|
+
return { loggedIn: false, url };
|
|
143
|
+
}
|
|
144
|
+
const maxAttempts = 25;
|
|
145
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
146
|
+
const s = await probeLoggedInSignals(page);
|
|
147
|
+
if (s.hasNickname || s.hasLogoutHint) {
|
|
148
|
+
return { loggedIn: true, url };
|
|
149
|
+
}
|
|
150
|
+
if (s.navLoginCta) {
|
|
151
|
+
return { loggedIn: false, url };
|
|
152
|
+
}
|
|
153
|
+
if (attempt < maxAttempts - 1) {
|
|
154
|
+
await sleepRandom(PROBE_LOGIN_POLL_MS.min, PROBE_LOGIN_POLL_MS.max);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { loggedIn: false, url };
|
|
158
|
+
}
|
|
159
|
+
/** 沟通页且已登录(与 {@link probeLoggedInFromPage} 一致)。 */
|
|
160
|
+
export async function probeBossChatIndexLoggedIn(page) {
|
|
161
|
+
const url = page.url();
|
|
162
|
+
if (!isBossChatIndexUrl(url)) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
const { loggedIn } = await probeLoggedInFromPage(page);
|
|
166
|
+
return loggedIn;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/common/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const BAIDU_ENV_KEYS: {
|
|
2
|
+
readonly apiKey: "BOSS_BAIDU_API_KEY";
|
|
3
|
+
readonly secretKey: "BOSS_BAIDU_SECRET_KEY";
|
|
4
|
+
};
|
|
5
|
+
export declare function getUserEnvPathForBaidu(): string;
|
|
6
|
+
export declare function writeBaiduCredentialsToUserEnv(apiKey: string, secretKey: string): void;
|
|
7
|
+
//# sourceMappingURL=baidu_user_env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baidu_user_env.d.ts","sourceRoot":"","sources":["../../src/common/baidu_user_env.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAwCX,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAKtF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将百度 OCR 凭证写入用户级 ~/.boss-cli/.env(与 cli 入口加载顺序一致)。
|
|
3
|
+
* 使用 BOSS_BAIDU_*,避免与项目内通用 API_KEY 混淆。
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { APP_HOME } from '../config.js';
|
|
8
|
+
export const BAIDU_ENV_KEYS = {
|
|
9
|
+
apiKey: 'BOSS_BAIDU_API_KEY',
|
|
10
|
+
secretKey: 'BOSS_BAIDU_SECRET_KEY',
|
|
11
|
+
};
|
|
12
|
+
const USER_ENV_PATH = join(APP_HOME, '.env');
|
|
13
|
+
function formatEnvLine(key, value) {
|
|
14
|
+
if (/^[A-Za-z0-9_.\-]+$/.test(value)) {
|
|
15
|
+
return `${key}=${value}`;
|
|
16
|
+
}
|
|
17
|
+
return `${key}="${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`;
|
|
18
|
+
}
|
|
19
|
+
function mergeUserEnv(updates) {
|
|
20
|
+
if (!existsSync(APP_HOME)) {
|
|
21
|
+
mkdirSync(APP_HOME, { recursive: true });
|
|
22
|
+
}
|
|
23
|
+
const dropKeys = new Set(Object.keys(updates));
|
|
24
|
+
let lines = [];
|
|
25
|
+
if (existsSync(USER_ENV_PATH)) {
|
|
26
|
+
const raw = readFileSync(USER_ENV_PATH, 'utf8');
|
|
27
|
+
lines = raw.split(/\r?\n/);
|
|
28
|
+
}
|
|
29
|
+
const kept = [];
|
|
30
|
+
for (const line of lines) {
|
|
31
|
+
const m = /^([A-Za-z_][A-Za-z0-9_]*)=/.exec(line);
|
|
32
|
+
if (m && dropKeys.has(m[1])) {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
kept.push(line);
|
|
36
|
+
}
|
|
37
|
+
while (kept.length > 0 && kept[kept.length - 1] === '') {
|
|
38
|
+
kept.pop();
|
|
39
|
+
}
|
|
40
|
+
const out = kept.length > 0 ? [...kept, ''] : [];
|
|
41
|
+
for (const [k, v] of Object.entries(updates)) {
|
|
42
|
+
out.push(formatEnvLine(k, v));
|
|
43
|
+
}
|
|
44
|
+
out.push('');
|
|
45
|
+
writeFileSync(USER_ENV_PATH, out.join('\n'), 'utf8');
|
|
46
|
+
}
|
|
47
|
+
export function getUserEnvPathForBaidu() {
|
|
48
|
+
return USER_ENV_PATH;
|
|
49
|
+
}
|
|
50
|
+
export function writeBaiduCredentialsToUserEnv(apiKey, secretKey) {
|
|
51
|
+
mergeUserEnv({
|
|
52
|
+
[BAIDU_ENV_KEYS.apiKey]: apiKey,
|
|
53
|
+
[BAIDU_ENV_KEYS.secretKey]: secretKey,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=baidu_user_env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baidu_user_env.js","sourceRoot":"","sources":["../../src/common/baidu_user_env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE,oBAAoB;IAC5B,SAAS,EAAE,uBAAuB;CAC1B,CAAC;AAEX,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAE7C,SAAS,aAAa,CAAC,GAAW,EAAE,KAAa;IAC/C,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,GAAG,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;AAC/F,CAAC;AAED,SAAS,YAAY,CAAC,OAA+B;IACnD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAa,EAAE,CAAC;IACzB,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAChD,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACb,aAAa,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,MAAc,EAAE,SAAiB;IAC9E,YAAY,CAAC;QACX,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM;QAC/B,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,SAAS;KACtC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boss_availability.d.ts","sourceRoot":"","sources":["../../src/common/boss_availability.ts"],"names":[],"mappings":"AAsGA,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAwHD,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CA+C5D"}
|