helixlife-expert-cli 0.5.8 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/cli/dist/core/api/client.d.ts +1 -1
- package/cli/dist/core/api/client.d.ts.map +1 -1
- package/cli/dist/core/api/client.js +39 -35
- package/cli/dist/core/api/client.js.map +1 -1
- package/cli/dist/core/api/response.d.ts.map +1 -1
- package/cli/dist/core/api/response.js +12 -8
- package/cli/dist/core/api/response.js.map +1 -1
- package/cli/dist/core/env-config.d.ts +2 -2
- package/cli/dist/core/env-config.d.ts.map +1 -1
- package/cli/dist/core/env-config.js +44 -23
- package/cli/dist/core/env-config.js.map +1 -1
- package/cli/dist/core/index.d.ts +1 -1
- package/cli/dist/core/index.d.ts.map +1 -1
- package/cli/dist/core/index.js +1 -1
- package/cli/dist/core/index.js.map +1 -1
- package/cli/dist/core/token/index.js +1 -1
- package/cli/dist/core/token/index.js.map +1 -1
- package/cli/dist/core/types/config.d.ts.map +1 -1
- package/cli/dist/core/types/config.js +3 -2
- package/cli/dist/core/types/config.js.map +1 -1
- package/cli/dist/modules/analysis/api.d.ts.map +1 -1
- package/cli/dist/modules/analysis/api.js +12 -47
- package/cli/dist/modules/analysis/api.js.map +1 -1
- package/cli/dist/modules/analysis/files.d.ts.map +1 -1
- package/cli/dist/modules/analysis/files.js +2 -1
- package/cli/dist/modules/analysis/files.js.map +1 -1
- package/cli/dist/modules/analysis/throttle.d.ts +6 -0
- package/cli/dist/modules/analysis/throttle.d.ts.map +1 -0
- package/cli/dist/modules/analysis/throttle.js +39 -0
- package/cli/dist/modules/analysis/throttle.js.map +1 -0
- package/cli/dist/modules/meta/api.js +1 -1
- package/cli/dist/modules/meta/api.js.map +1 -1
- package/package.json +1 -1
- package/cli/dist/core/auth/index.d.ts +0 -35
- package/cli/dist/core/auth/index.d.ts.map +0 -1
- package/cli/dist/core/auth/index.js +0 -150
- package/cli/dist/core/auth/index.js.map +0 -1
- package/cli/dist/modules/auth/index.d.ts +0 -3
- package/cli/dist/modules/auth/index.d.ts.map +0 -1
- package/cli/dist/modules/auth/index.js +0 -76
- package/cli/dist/modules/auth/index.js.map +0 -1
- package/cli/dist/modules/proposal/artifacts.d.ts +0 -18
- package/cli/dist/modules/proposal/artifacts.d.ts.map +0 -1
- package/cli/dist/modules/proposal/artifacts.js +0 -43
- package/cli/dist/modules/proposal/artifacts.js.map +0 -1
- package/cli/dist/modules/proposal/commands/basic-create.d.ts +0 -22
- package/cli/dist/modules/proposal/commands/basic-create.d.ts.map +0 -1
- package/cli/dist/modules/proposal/commands/basic-create.js +0 -81
- package/cli/dist/modules/proposal/commands/basic-create.js.map +0 -1
- package/cli/dist/modules/proposal/commands/basic-result.d.ts +0 -24
- package/cli/dist/modules/proposal/commands/basic-result.d.ts.map +0 -1
- package/cli/dist/modules/proposal/commands/basic-result.js +0 -96
- package/cli/dist/modules/proposal/commands/basic-result.js.map +0 -1
- package/cli/dist/modules/proposal/newidea-env.d.ts +0 -28
- package/cli/dist/modules/proposal/newidea-env.d.ts.map +0 -1
- package/cli/dist/modules/proposal/newidea-env.js +0 -69
- package/cli/dist/modules/proposal/newidea-env.js.map +0 -1
- package/cli/dist/modules/proposal/newidea-runner.d.ts +0 -25
- package/cli/dist/modules/proposal/newidea-runner.d.ts.map +0 -1
- package/cli/dist/modules/proposal/newidea-runner.js +0 -158
- package/cli/dist/modules/proposal/newidea-runner.js.map +0 -1
- package/cli/dist/modules/proposal/parse.d.ts +0 -25
- package/cli/dist/modules/proposal/parse.d.ts.map +0 -1
- package/cli/dist/modules/proposal/parse.js +0 -173
- package/cli/dist/modules/proposal/parse.js.map +0 -1
package/README.md
CHANGED
|
@@ -8,18 +8,18 @@
|
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install -g helixlife-expert-cli
|
|
11
|
-
#
|
|
11
|
+
# 请求凭证与接口基址由外部环境写入 ~/.open-science-pro/platform-auth.json
|
|
12
12
|
helixlife-expert upgrade # 检查并按需升级到 npm 最新版
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
接口基址与请求凭证在同一个文件 `~/.open-science-pro/platform-auth.json`:
|
|
16
16
|
|
|
17
|
-
-
|
|
18
|
-
-
|
|
17
|
+
- `token`:请求凭证
|
|
18
|
+
- `api` / `agent_api`:接口基址(缺省回退生产地址)
|
|
19
19
|
|
|
20
20
|
## 环境地址
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
默认使用生产基址。`api` / `agent_api` 写在 `platform-auth.json`(完整 URL,原样使用)。`config set` 只更新这两个字段,不改 `token`:
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
25
|
helixlife-expert config # 查看当前生效地址
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type SseDataPayload } from "./sse.js";
|
|
2
|
+
export declare function readApiErrorMessage(text: string): string;
|
|
2
3
|
export interface RequestOptions {
|
|
3
4
|
method?: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
|
|
4
5
|
params?: Record<string, string | number | boolean | undefined>;
|
|
@@ -18,7 +19,6 @@ export declare class ApiClient {
|
|
|
18
19
|
private buildUrl;
|
|
19
20
|
private buildHeaders;
|
|
20
21
|
private assertOkResponse;
|
|
21
|
-
private resolveForbiddenMessage;
|
|
22
22
|
private send;
|
|
23
23
|
request<T>(path: string, options?: RequestOptions): Promise<T>;
|
|
24
24
|
requestBinary(path: string, options?: RequestOptions & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/api/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/core/api/client.ts"],"names":[],"mappings":"AAQA,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAa/D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAiBxD;AAaD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IAGrB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;CAChD;AAGD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAiBD,qBAAa,SAAS;IAEpB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,YAAY;YAiBN,gBAAgB;YA2BhB,IAAI;IAmCZ,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IA0BlE,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,cAAc,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GAClD,OAAO,CAAC,cAAc,CAAC;IAQpB,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI,GACzC,OAAO,CAAC,IAAI,CAAC;YA0CF,kBAAkB;IAehC,OAAO,CAAC,qCAAqC;CAa9C"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// 后台 API 请求客户端:统一附加 Token、平台头、超时与 401 处理
|
|
2
|
-
import { helixlifeError, helixlifeErrorCode, isNonRetryableServerMessage, NOT_AUTHENTICATED_MESSAGE,
|
|
2
|
+
import { helixlifeError, helixlifeErrorCode, isNonRetryableServerMessage, NOT_AUTHENTICATED_MESSAGE, } from "../errors.js";
|
|
3
3
|
import { getDefaultBaseUrl } from "../types/config.js";
|
|
4
4
|
import { parseSseStream } from "./sse.js";
|
|
5
5
|
import { loadTokenFromFile } from "../token/index.js";
|
|
@@ -7,6 +7,26 @@ import { getPackageVersion } from "../version.js";
|
|
|
7
7
|
import { DEFAULT_REQUEST_TIMEOUT_MS, fetchWithTimeout, toNetworkError, } from "./http.js";
|
|
8
8
|
// 后端常见的追踪 ID 响应头
|
|
9
9
|
const TRACE_ID_HEADERS = ["x-trace-id", "trace-id", "x-request-id", "traceid"];
|
|
10
|
+
// 从错误响应里取出后台 message。JSON 没有 message 时再用 msg;非 JSON 则保留正文。
|
|
11
|
+
export function readApiErrorMessage(text) {
|
|
12
|
+
const raw = text.trim();
|
|
13
|
+
if (!raw) {
|
|
14
|
+
return "";
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const body = JSON.parse(raw);
|
|
18
|
+
if (typeof body.message === "string" && body.message.trim()) {
|
|
19
|
+
return body.message.trim();
|
|
20
|
+
}
|
|
21
|
+
if (typeof body.msg === "string" && body.msg.trim()) {
|
|
22
|
+
return body.msg.trim();
|
|
23
|
+
}
|
|
24
|
+
return "";
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return raw;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
10
30
|
function readTraceId(response) {
|
|
11
31
|
for (const name of TRACE_ID_HEADERS) {
|
|
12
32
|
const value = response.headers.get(name);
|
|
@@ -63,45 +83,29 @@ export class ApiClient {
|
|
|
63
83
|
headers.Authorization = `Bearer ${token}`;
|
|
64
84
|
return headers;
|
|
65
85
|
}
|
|
66
|
-
//
|
|
86
|
+
// 非 2xx:错误码仍按状态区分,文案使用响应里的 message,不再换成固定句子。
|
|
67
87
|
async assertOkResponse(response, url) {
|
|
88
|
+
if (response.ok) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
68
91
|
const traceId = readTraceId(response);
|
|
92
|
+
const text = await response.text().catch(() => "");
|
|
93
|
+
const message = readApiErrorMessage(text) || `请求失败 (${response.status})`;
|
|
69
94
|
if (response.status === 401) {
|
|
70
|
-
throw new helixlifeError(helixlifeErrorCode.TOKEN_EXPIRED,
|
|
95
|
+
throw new helixlifeError(helixlifeErrorCode.TOKEN_EXPIRED, message, { traceId });
|
|
71
96
|
}
|
|
72
97
|
if (response.status === 403) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
nextAction: transient ? "retry_once" : "stop_and_report",
|
|
85
|
-
detail: { status: response.status, path: url.pathname },
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
// 403 优先使用后端 message(已含购买链接),解析失败再回退原始正文
|
|
90
|
-
resolveForbiddenMessage(text, statusText) {
|
|
91
|
-
const fallback = `请求失败 (403): ${text || statusText}`;
|
|
92
|
-
if (!text) {
|
|
93
|
-
return fallback;
|
|
94
|
-
}
|
|
95
|
-
try {
|
|
96
|
-
const body = JSON.parse(text);
|
|
97
|
-
const message = (typeof body.message === "string" && body.message.trim()) ||
|
|
98
|
-
(typeof body.msg === "string" && body.msg.trim()) ||
|
|
99
|
-
"";
|
|
100
|
-
return message || fallback;
|
|
101
|
-
}
|
|
102
|
-
catch {
|
|
103
|
-
return fallback;
|
|
104
|
-
}
|
|
98
|
+
throw new helixlifeError(helixlifeErrorCode.PERMISSION_DENIED, message, { traceId });
|
|
99
|
+
}
|
|
100
|
+
// 5xx / 429 多为瞬时故障;其余 4xx 与「参数非法」类为确定性失败
|
|
101
|
+
const transient = (response.status >= 500 || response.status === 429) &&
|
|
102
|
+
!isNonRetryableServerMessage(message);
|
|
103
|
+
throw new helixlifeError(helixlifeErrorCode.REQUEST_FAILED, message, {
|
|
104
|
+
traceId,
|
|
105
|
+
retryable: transient,
|
|
106
|
+
nextAction: transient ? "retry_once" : "stop_and_report",
|
|
107
|
+
detail: { status: response.status, path: url.pathname },
|
|
108
|
+
});
|
|
105
109
|
}
|
|
106
110
|
// REST / 二进制请求的共用骨架:校验 token、拼 URL、组装头与请求体,发起带超时请求并校验状态。
|
|
107
111
|
// 无本地 token 抛 E1001,遇 401 抛 E1004,遇 403 抛 E1005。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/api/client.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,2BAA2B,EAC3B,yBAAyB,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/core/api/response.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../../src/core/api/response.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAY7D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAc5E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,QAAQ,EAAE,WAAW,CAAC;IAAE,IAAI,CAAC,EAAE,CAAC,CAAA;CAAE,GAAG,CAAC,CAAC,EACvC,MAAM,EAAE,MAAM,GACb,CAAC,CASH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAuB7E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,CAAC,WAAW,CAAC;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GACxD,MAAM,CAUR"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { helixlifeError, helixlifeErrorCode } from "../errors.js";
|
|
2
|
+
function readEnvelopeMessage(response) {
|
|
3
|
+
const message = typeof response.message === "string" ? response.message.trim() : "";
|
|
4
|
+
if (message) {
|
|
5
|
+
return message;
|
|
6
|
+
}
|
|
7
|
+
const data = response.data;
|
|
8
|
+
const nested = typeof data?.msg === "string" ? data.msg.trim() : "";
|
|
9
|
+
return nested;
|
|
10
|
+
}
|
|
2
11
|
/**
|
|
3
12
|
* 统一 API 响应解析
|
|
4
13
|
* - 成功时返回 data
|
|
@@ -6,10 +15,7 @@ import { helixlifeError, helixlifeErrorCode } from "../errors.js";
|
|
|
6
15
|
*/
|
|
7
16
|
export function unwrapResponse(response) {
|
|
8
17
|
if (!response.success) {
|
|
9
|
-
const errorMessage = response
|
|
10
|
-
response.message ||
|
|
11
|
-
response.message ||
|
|
12
|
-
"请求失败";
|
|
18
|
+
const errorMessage = readEnvelopeMessage(response) || "请求失败";
|
|
13
19
|
throw new helixlifeError(helixlifeErrorCode.REQUEST_FAILED, errorMessage);
|
|
14
20
|
}
|
|
15
21
|
if (response.data === undefined) {
|
|
@@ -25,7 +31,7 @@ export function unwrapResponse(response) {
|
|
|
25
31
|
*/
|
|
26
32
|
export function unwrapApiData(response, action) {
|
|
27
33
|
if (response.success === false) {
|
|
28
|
-
throw new helixlifeError(helixlifeErrorCode.REQUEST_FAILED, response
|
|
34
|
+
throw new helixlifeError(helixlifeErrorCode.REQUEST_FAILED, readEnvelopeMessage(response) || `${action}失败`);
|
|
29
35
|
}
|
|
30
36
|
if (response.data === undefined) {
|
|
31
37
|
throw new helixlifeError(helixlifeErrorCode.INVALID_RESPONSE, `${action}响应缺少 data 字段`);
|
|
@@ -52,9 +58,7 @@ export function unwrapNestedApiData(response, action) {
|
|
|
52
58
|
*/
|
|
53
59
|
export function extractNestedData(response) {
|
|
54
60
|
if (!response.success) {
|
|
55
|
-
const errorMessage = response
|
|
56
|
-
response.message ||
|
|
57
|
-
"请求失败";
|
|
61
|
+
const errorMessage = readEnvelopeMessage(response) || "请求失败";
|
|
58
62
|
throw new helixlifeError(helixlifeErrorCode.REQUEST_FAILED, errorMessage);
|
|
59
63
|
}
|
|
60
64
|
if (response.data === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/core/api/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/core/api/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElE,SAAS,mBAAmB,CAAC,QAA8B;IACzD,MAAM,OAAO,GAAG,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,IAAI,GAAI,QAA6B,CAAC,IAAI,CAAC;IACjD,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,MAAM,CAAC;AAChB,CAAC;AAsBD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAI,QAAwB;IACxD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;QAC7D,MAAM,IAAI,cAAc,CAAC,kBAAkB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,gBAAgB,EACnC,QAAQ,CACT,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAI,QAAwB,EAAE,MAAc;IACvE,IAAI,QAAQ,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,cAAc,EACjC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,IAAI,CAC/C,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,gBAAgB,EACnC,GAAG,MAAM,cAAc,CACxB,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAuC,EACvC,MAAc;IAEd,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QAChE,MAAM,KAAK,GAAI,OAAwB,CAAC,IAAI,CAAC;QAC7C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,OAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAI,QAAqC;IACxE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC;QAC7D,MAAM,IAAI,cAAc,CAAC,kBAAkB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,gBAAgB,EACnC,QAAQ,CACT,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QACnE,MAAM,MAAM,GAAI,KAAwB,CAAC,IAAI,CAAC;QAC9C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,gBAAgB,EACnC,UAAU,CACX,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAqB,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAyD;IAEzD,MAAM,KAAK,GAAG,iBAAiB,CAAwB,QAAQ,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,KAAK,EAAE,QAAQ,CAAC;IAChC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,IAAI,cAAc,CACtB,kBAAkB,CAAC,gBAAgB,EACnC,eAAe,CAChB,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export declare const CONFIG_DIR_NAME = "
|
|
2
|
-
export declare const LOCAL_CONFIG_FILE_NAME = "
|
|
1
|
+
export declare const CONFIG_DIR_NAME = ".open-science-pro";
|
|
2
|
+
export declare const LOCAL_CONFIG_FILE_NAME = "platform-auth.json";
|
|
3
3
|
export declare const CONFIG_SET_KEYS: readonly ["api", "agent_api"];
|
|
4
4
|
export type ConfigSetKey = (typeof CONFIG_SET_KEYS)[number];
|
|
5
5
|
export interface LocalConfig {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../../src/core/env-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env-config.d.ts","sourceRoot":"","sources":["../../src/core/env-config.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,eAAe,sBAAiB,CAAC;AAG9C,eAAO,MAAM,sBAAsB,uBAAkB,CAAC;AAGtD,eAAO,MAAM,eAAe,+BAAgC,CAAC;AAC7D,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAG5D,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAGD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAKzE;AAGD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAGD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAiBD,wBAAgB,eAAe,IAAI,WAAW,GAAG,SAAS,CAqBzD;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAOzD;AAGD,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,MAAM,GACZ,WAAW,CAQb;AAGD,wBAAgB,gBAAgB,IAAI,IAAI,CAiBvC"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
//
|
|
2
|
-
//
|
|
3
|
-
// 仅在用户显式调用 `helixlife-expert config set`
|
|
4
|
-
//
|
|
1
|
+
// 接口基址与请求凭证同文件:~/.open-science-pro/platform-auth.json。
|
|
2
|
+
// 本模块只读写其中的 api / agent_api;token 由 token 模块读取。
|
|
3
|
+
// 仅在用户显式调用 `helixlife-expert config set` 时落盘,且不得覆盖 token。
|
|
4
|
+
// 缺省字段回退代码内生产默认值。
|
|
5
5
|
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync, } from "node:fs";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
//
|
|
9
|
-
export const CONFIG_DIR_NAME =
|
|
10
|
-
//
|
|
11
|
-
export const LOCAL_CONFIG_FILE_NAME =
|
|
6
|
+
import { dirname } from "node:path";
|
|
7
|
+
import { getTokenFilePath, TOKEN_DIR_NAME, TOKEN_FILE_NAME, } from "./token/index.js";
|
|
8
|
+
// 与 token 同一目录:~/.open-science-pro
|
|
9
|
+
export const CONFIG_DIR_NAME = TOKEN_DIR_NAME;
|
|
10
|
+
// 与 token 同一文件
|
|
11
|
+
export const LOCAL_CONFIG_FILE_NAME = TOKEN_FILE_NAME;
|
|
12
12
|
// 允许通过 `helixlife-expert config set` 覆盖的字段
|
|
13
13
|
export const CONFIG_SET_KEYS = ["api", "agent_api"];
|
|
14
14
|
// 判断是否为合法的可设置字段名
|
|
@@ -20,22 +20,31 @@ export function isValidConfigSetKey(value) {
|
|
|
20
20
|
export function normalizeConfigUrl(value) {
|
|
21
21
|
return value.trim().replace(/\/+$/, "");
|
|
22
22
|
}
|
|
23
|
-
//
|
|
23
|
+
// 解析配置文件路径:与 token 相同,~/.open-science-pro/platform-auth.json
|
|
24
24
|
export function getLocalConfigPath() {
|
|
25
|
-
return
|
|
25
|
+
return getTokenFilePath();
|
|
26
26
|
}
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
function readAuthFileObject(filePath) {
|
|
28
|
+
if (!existsSync(filePath))
|
|
29
|
+
return {};
|
|
30
|
+
const raw = readFileSync(filePath, "utf8").trim();
|
|
31
|
+
if (!raw)
|
|
32
|
+
return {};
|
|
33
|
+
const parsed = JSON.parse(raw);
|
|
34
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
35
|
+
throw new Error("platform-auth.json 不是 JSON 对象,已拒绝写入以免覆盖 token");
|
|
36
|
+
}
|
|
37
|
+
return parsed;
|
|
38
|
+
}
|
|
39
|
+
// 从 platform-auth.json 读取 api / agent_api。
|
|
40
|
+
// 文件不存在 / 解析失败 → 返回 undefined;非法字段静默丢弃。token 不在此返回。
|
|
29
41
|
export function loadLocalConfig() {
|
|
30
42
|
const filePath = getLocalConfigPath();
|
|
31
43
|
if (!existsSync(filePath)) {
|
|
32
44
|
return undefined;
|
|
33
45
|
}
|
|
34
46
|
try {
|
|
35
|
-
const
|
|
36
|
-
if (!raw)
|
|
37
|
-
return undefined;
|
|
38
|
-
const parsed = JSON.parse(raw);
|
|
47
|
+
const parsed = readAuthFileObject(filePath);
|
|
39
48
|
const result = {};
|
|
40
49
|
if (typeof parsed.api === "string" && parsed.api.trim()) {
|
|
41
50
|
result.api = normalizeConfigUrl(parsed.api);
|
|
@@ -49,13 +58,18 @@ export function loadLocalConfig() {
|
|
|
49
58
|
return undefined;
|
|
50
59
|
}
|
|
51
60
|
}
|
|
52
|
-
//
|
|
61
|
+
// 将 api / agent_api 写回 platform-auth.json,保留 token 及其他字段。
|
|
53
62
|
export function saveLocalConfig(config) {
|
|
54
63
|
const filePath = getLocalConfigPath();
|
|
55
64
|
mkdirSync(dirname(filePath), { recursive: true });
|
|
56
|
-
|
|
65
|
+
const next = readAuthFileObject(filePath);
|
|
66
|
+
if (config.api !== undefined)
|
|
67
|
+
next.api = config.api;
|
|
68
|
+
if (config.agent_api !== undefined)
|
|
69
|
+
next.agent_api = config.agent_api;
|
|
70
|
+
writeFileSync(filePath, `${JSON.stringify(next, null, 2)}\n`, "utf8");
|
|
57
71
|
}
|
|
58
|
-
//
|
|
72
|
+
// 合并更新单个字段:保留文件中未改动的其他字段(含 token),再落盘。
|
|
59
73
|
export function updateLocalConfigField(key, value) {
|
|
60
74
|
const current = loadLocalConfig() ?? {};
|
|
61
75
|
const next = {
|
|
@@ -65,14 +79,21 @@ export function updateLocalConfigField(key, value) {
|
|
|
65
79
|
saveLocalConfig(next);
|
|
66
80
|
return next;
|
|
67
81
|
}
|
|
68
|
-
//
|
|
82
|
+
// 去掉 api / agent_api,保留 token。文件里不再有其他字段时才删除文件。
|
|
69
83
|
export function clearLocalConfig() {
|
|
70
84
|
const filePath = getLocalConfigPath();
|
|
71
85
|
if (!existsSync(filePath)) {
|
|
72
86
|
return;
|
|
73
87
|
}
|
|
74
88
|
try {
|
|
75
|
-
|
|
89
|
+
const existing = readAuthFileObject(filePath);
|
|
90
|
+
delete existing.api;
|
|
91
|
+
delete existing.agent_api;
|
|
92
|
+
if (Object.keys(existing).length === 0) {
|
|
93
|
+
unlinkSync(filePath);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
writeFileSync(filePath, `${JSON.stringify(existing, null, 2)}\n`, "utf8");
|
|
76
97
|
}
|
|
77
98
|
catch {
|
|
78
99
|
// 静默失败
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-config.js","sourceRoot":"","sources":["../../src/core/env-config.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"env-config.js","sourceRoot":"","sources":["../../src/core/env-config.ts"],"names":[],"mappings":"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"}
|
package/cli/dist/core/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { helixlifeError, helixlifeErrorCode, NOT_AUTHENTICATED_MESSAGE, TOKEN_EXPIRED_MESSAGE, isNonRetryableServerMessage, type helixlifeNextAction, } from "./errors.js";
|
|
2
2
|
export { fetchWithTimeout, DEFAULT_REQUEST_TIMEOUT_MS } from "./api/http.js";
|
|
3
|
-
export { ApiClient, type BinaryResponse, type RequestOptions, } from "./api/client.js";
|
|
3
|
+
export { ApiClient, readApiErrorMessage, type BinaryResponse, type RequestOptions, } from "./api/client.js";
|
|
4
4
|
export { parseSseStream, type SseDataPayload } from "./api/sse.js";
|
|
5
5
|
export { unwrapResponse, unwrapApiData, unwrapNestedApiData, extractNestedData, extractOrderId, type ApiEnvelope, type ApiErrorEnvelope, } from "./api/response.js";
|
|
6
6
|
export { getTokenFilePath, loadTokenFromFile, TOKEN_DIR_NAME, TOKEN_FILE_NAME, } from "./token/index.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EACL,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EACL,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EAChB,KAAK,uBAAuB,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,0BAA0B,EAC1B,SAAS,EACT,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,mBAAmB,GACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EACL,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,eAAe,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EAChB,KAAK,uBAAuB,GAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,0BAA0B,EAC1B,SAAS,EACT,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
|
package/cli/dist/core/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { helixlifeError, helixlifeErrorCode, NOT_AUTHENTICATED_MESSAGE, TOKEN_EXPIRED_MESSAGE, isNonRetryableServerMessage, } from "./errors.js";
|
|
2
2
|
export { fetchWithTimeout, DEFAULT_REQUEST_TIMEOUT_MS } from "./api/http.js";
|
|
3
|
-
export { ApiClient, } from "./api/client.js";
|
|
3
|
+
export { ApiClient, readApiErrorMessage, } from "./api/client.js";
|
|
4
4
|
export { parseSseStream } from "./api/sse.js";
|
|
5
5
|
export { unwrapResponse, unwrapApiData, unwrapNestedApiData, extractNestedData, extractOrderId, } from "./api/response.js";
|
|
6
6
|
export { getTokenFilePath, loadTokenFromFile, TOKEN_DIR_NAME, TOKEN_FILE_NAME, } from "./token/index.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,GAE5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EACL,SAAS,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,yBAAyB,EACzB,qBAAqB,EACrB,2BAA2B,GAE5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EACL,SAAS,EACT,mBAAmB,GAGpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAuB,MAAM,cAAc,CAAC;AACnE,OAAO,EACL,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,GAGf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,GAEzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,sBAAsB,GAGvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,GAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,QAAQ,EACR,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,GAGlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,qBAAqB,GAEtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EACL,0BAA0B,EAC1B,SAAS,EACT,eAAe,GAChB,MAAM,kBAAkB,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { join } from "node:path";
|
|
|
5
5
|
// Windows: C:\Users\<用户名>\.open-science-pro
|
|
6
6
|
// macOS: /Users/<用户名>/.open-science-pro
|
|
7
7
|
export const TOKEN_DIR_NAME = ".open-science-pro";
|
|
8
|
-
//
|
|
8
|
+
// 凭证与接口基址同文件。内容为 JSON:{ "token", "api", "agent_api" }
|
|
9
9
|
export const TOKEN_FILE_NAME = "platform-auth.json";
|
|
10
10
|
// 解析全平台默认 token 文件路径。
|
|
11
11
|
// 相对用户主目录的路径在 Windows 与 macOS 上一致:.open-science-pro/platform-auth.json
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/token/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,qCAAqC;AACrC,4CAA4C;AAC5C,0CAA0C;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAElD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/token/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,qCAAqC;AACrC,4CAA4C;AAC5C,0CAA0C;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAElD,sDAAsD;AACtD,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEpD,sBAAsB;AACtB,uEAAuE;AACvE,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC;AAC1D,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/types/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/types/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6BD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAGD,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAGD,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { loadLocalConfig } from "../env-config.js";
|
|
2
|
-
//
|
|
3
|
-
//
|
|
2
|
+
// 生产默认地址:platform-auth.json 缺失对应字段时回退至此。
|
|
3
|
+
// 覆盖方式:外部环境写入 ~/.open-science-pro/platform-auth.json 的 api / agent_api,
|
|
4
|
+
// 或 `helixlife-expert config set api|agent_api <完整基址>`(只改这两个字段,保留 token)。
|
|
4
5
|
const DEFAULT_ENDPOINTS = {
|
|
5
6
|
api: "https://api.helixlife.cn",
|
|
6
7
|
agent_api: "https://agent.helixlife.cn",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAenD,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/types/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAenD,yCAAyC;AACzC,wEAAwE;AACxE,0EAA0E;AAC1E,MAAM,iBAAiB,GAAc;IACnC,GAAG,EAAE,0BAA0B;IAC/B,SAAS,EAAE,4BAA4B;IACvC,OAAO,EAAE,8BAA8B;CACxC,CAAC;AAEF,kCAAkC;AAClC,SAAS,gBAAgB;IACvB,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,OAAO;QACL,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,iBAAiB,CAAC,GAAG;QACxC,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,iBAAiB,CAAC,SAAS;QAC1D,OAAO,EAAE,iBAAiB,CAAC,OAAO;KACnC,CAAC;AACJ,CAAC;AAED,sBAAsB;AACtB,MAAM,UAAU,iBAAiB;IAC/B,OAAO,gBAAgB,EAAE,CAAC,GAAG,CAAC;AAChC,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,qBAAqB;IACnC,OAAO,gBAAgB,EAAE,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,wBAAwB;IACtC,OAAO,gBAAgB,EAAE,CAAC,OAAO,CAAC;AACpC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/modules/analysis/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/modules/analysis/api.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAkC,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5E,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIvD;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG3E;AAED,wBAAsB,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAShF;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3F;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE;IAAE,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5C,OAAO,CAAC,aAAa,CAAC,CAOxB;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,UAAU,CAOtF;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAiD/E;AAyJD,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAKnD"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// 数据分析 HTTP:菜单与生信入口走 agent_api 上的 /api/v1/agent/client/...,上传凭证仍走 /api/v1/agent/upload/config
|
|
2
2
|
import { readFile, stat } from "node:fs/promises";
|
|
3
3
|
import { basename } from "node:path";
|
|
4
|
-
import { fetchWithTimeout, getDefaultAuthBaseUrl, getPackageVersion, helixlifeError, helixlifeErrorCode, NOT_AUTHENTICATED_MESSAGE,
|
|
4
|
+
import { fetchWithTimeout, getDefaultAuthBaseUrl, getPackageVersion, helixlifeError, helixlifeErrorCode, NOT_AUTHENTICATED_MESSAGE, loadTokenFromFile, resolveUserPath, } from "../../core/index.js";
|
|
5
5
|
import { ANALYSIS_BIO_API_PATH, ANALYSIS_BIO_TIMEOUT_MS, ANALYSIS_BIO_VERSION, ANALYSIS_HISTORY_UUID, ANALYSIS_MENU_TIMEOUT_MS, ANALYSIS_MENUS_PATH, ANALYSIS_UPLOAD_CONFIG_PATH, DEFAULT_TOOL_PRODUCT_UUID, } from "./constants.js";
|
|
6
6
|
import { AnalysisError } from "./errors.js";
|
|
7
|
-
import { clarifyConfArgsMessage } from "./overrides.js";
|
|
8
7
|
import { asObject, isJsonObject, textOf } from "./json.js";
|
|
8
|
+
import { withAnalysisNetworkThrottle } from "./throttle.js";
|
|
9
9
|
// 菜单查询参数 f:JSON → encodeURI → base64,去掉填充等号
|
|
10
10
|
export function encryptMenuQuery(value) {
|
|
11
11
|
return Buffer.from(encodeURI(JSON.stringify(value)), "utf8")
|
|
@@ -77,11 +77,11 @@ export async function uploadLocalFile(filePath) {
|
|
|
77
77
|
const host = ticket.host;
|
|
78
78
|
let response;
|
|
79
79
|
try {
|
|
80
|
-
response = await fetchWithTimeout(host, {
|
|
80
|
+
response = await withAnalysisNetworkThrottle(() => fetchWithTimeout(host, {
|
|
81
81
|
method: "POST",
|
|
82
82
|
headers: { "x-oss-object-acl": "public-read" },
|
|
83
83
|
body: form,
|
|
84
|
-
}, ANALYSIS_MENU_TIMEOUT_MS);
|
|
84
|
+
}, ANALYSIS_MENU_TIMEOUT_MS));
|
|
85
85
|
}
|
|
86
86
|
catch (error) {
|
|
87
87
|
if (error instanceof helixlifeError)
|
|
@@ -168,11 +168,11 @@ async function requestAgentEnvelope(path, options) {
|
|
|
168
168
|
if (options.body) {
|
|
169
169
|
headers["Content-Type"] = "application/json";
|
|
170
170
|
}
|
|
171
|
-
const response = await fetchWithTimeout(url.toString(), {
|
|
171
|
+
const response = await withAnalysisNetworkThrottle(() => fetchWithTimeout(url.toString(), {
|
|
172
172
|
method: options.method,
|
|
173
173
|
headers,
|
|
174
174
|
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
175
|
-
}, options.timeoutMs);
|
|
175
|
+
}, options.timeoutMs));
|
|
176
176
|
const text = await response.text();
|
|
177
177
|
const payload = parsePayload(text, response.status);
|
|
178
178
|
if (!response.ok) {
|
|
@@ -205,53 +205,18 @@ function parsePayload(text, status) {
|
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
207
|
function mapHttpError(status, payload) {
|
|
208
|
-
if (status === 401) {
|
|
209
|
-
return new helixlifeError(helixlifeErrorCode.TOKEN_EXPIRED, TOKEN_EXPIRED_MESSAGE);
|
|
210
|
-
}
|
|
211
208
|
return mapBusinessError(payload, status);
|
|
212
209
|
}
|
|
210
|
+
// 业务与 HTTP 错误都原样透出接口 message,不再替换成固定文案。
|
|
213
211
|
function mapBusinessError(payload, status) {
|
|
214
|
-
const message =
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
return new AnalysisError("您的授权已过期或无效,请重新完成授权。");
|
|
218
|
-
}
|
|
219
|
-
if (code.startsWith("403") || message.includes("无权限") || message.includes("权限")) {
|
|
220
|
-
const link = readPurchaseLink(payload) ?? "https://www.helixlife.cn/main/vip";
|
|
221
|
-
return new AnalysisError(`您的账号暂无使用权限,需要购买会员。购买链接: ${link}`);
|
|
222
|
-
}
|
|
223
|
-
if (code === "5000000101") {
|
|
224
|
-
return new AnalysisError("当前网络状态异常,请前往 https://www.helixlife.cn 联系客服");
|
|
225
|
-
}
|
|
226
|
-
if (code === "4000020101" || code === "400008") {
|
|
227
|
-
return new AnalysisError("您的账号状态异常,请联系 https://www.helixlife.cn");
|
|
228
|
-
}
|
|
229
|
-
if (code === "400004") {
|
|
230
|
-
return new AnalysisError("该菜单或商品已下架,请更换 tool_product_uuid 或 menu uuid。");
|
|
231
|
-
}
|
|
232
|
-
if (code === "50000" || code === "40000" || code === "40004") {
|
|
233
|
-
return new AnalysisError("请前往 https://www.helixlife.cn 联系客服");
|
|
234
|
-
}
|
|
235
|
-
if (message.includes("速率限制")) {
|
|
236
|
-
return new AnalysisError("建议次日再试");
|
|
212
|
+
const message = textOf(payload.message);
|
|
213
|
+
if (message) {
|
|
214
|
+
return new AnalysisError(message);
|
|
237
215
|
}
|
|
238
216
|
if (status && status !== 200) {
|
|
239
|
-
return new AnalysisError(
|
|
217
|
+
return new AnalysisError(`请求失败 (${status})`);
|
|
240
218
|
}
|
|
241
|
-
return new AnalysisError(
|
|
242
|
-
}
|
|
243
|
-
function isAuthMessage(message) {
|
|
244
|
-
return (message.includes("未授权") ||
|
|
245
|
-
message.includes("请登录") ||
|
|
246
|
-
message.includes("重新登录") ||
|
|
247
|
-
message.includes("身份验证已过期"));
|
|
248
|
-
}
|
|
249
|
-
function readPurchaseLink(payload) {
|
|
250
|
-
const data = asObject(payload.data);
|
|
251
|
-
const link = textOf(data?.vip_buy_link);
|
|
252
|
-
if (link)
|
|
253
|
-
return link;
|
|
254
|
-
return textOf(payload.message).match(/https?:\/\/[^\s,。))]+/)?.[0];
|
|
219
|
+
return new AnalysisError("请求失败");
|
|
255
220
|
}
|
|
256
221
|
export function historyId(fuid) {
|
|
257
222
|
return {
|