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
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* newidea invocation 输出解析(纯函数,便于单测)
|
|
3
|
-
*
|
|
4
|
-
* newidea CLI 的 --json 输出前后可能夹带非 JSON 噪声行(更新提示、进度日志),
|
|
5
|
-
* 因此不能直接 JSON.parse(stdout)。
|
|
6
|
-
*/
|
|
7
|
-
import { helixlifeError, helixlifeErrorCode } from "../../core/index.js";
|
|
8
|
-
const SUCCESS_STATUSES = new Set([
|
|
9
|
-
"success",
|
|
10
|
-
"succeeded",
|
|
11
|
-
"completed",
|
|
12
|
-
"complete",
|
|
13
|
-
"finished",
|
|
14
|
-
]);
|
|
15
|
-
const FAILED_STATUSES = new Set([
|
|
16
|
-
"failed",
|
|
17
|
-
"failure",
|
|
18
|
-
"error",
|
|
19
|
-
"cancelled",
|
|
20
|
-
"canceled",
|
|
21
|
-
"timeout",
|
|
22
|
-
]);
|
|
23
|
-
// 从首个 '{' 或 '[' 起做括号配对扫描,跳过字符串字面量内的括号
|
|
24
|
-
function findBalancedEnd(text, start) {
|
|
25
|
-
const open = text[start];
|
|
26
|
-
const close = open === "{" ? "}" : "]";
|
|
27
|
-
let depth = 0;
|
|
28
|
-
let inString = false;
|
|
29
|
-
let escaped = false;
|
|
30
|
-
for (let i = start; i < text.length; i += 1) {
|
|
31
|
-
const ch = text[i];
|
|
32
|
-
if (inString) {
|
|
33
|
-
if (escaped) {
|
|
34
|
-
escaped = false;
|
|
35
|
-
}
|
|
36
|
-
else if (ch === "\\") {
|
|
37
|
-
escaped = true;
|
|
38
|
-
}
|
|
39
|
-
else if (ch === '"') {
|
|
40
|
-
inString = false;
|
|
41
|
-
}
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
if (ch === '"') {
|
|
45
|
-
inString = true;
|
|
46
|
-
}
|
|
47
|
-
else if (ch === open) {
|
|
48
|
-
depth += 1;
|
|
49
|
-
}
|
|
50
|
-
else if (ch === close) {
|
|
51
|
-
depth -= 1;
|
|
52
|
-
if (depth === 0) {
|
|
53
|
-
return i;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return -1;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* 从 CLI stdout 中提取首个完整 JSON 值(对象或数组)。
|
|
61
|
-
*/
|
|
62
|
-
export function extractJsonFromStdout(stdout) {
|
|
63
|
-
const text = stdout ?? "";
|
|
64
|
-
for (let i = 0; i < text.length; i += 1) {
|
|
65
|
-
const ch = text[i];
|
|
66
|
-
if (ch !== "{" && ch !== "[") {
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
const end = findBalancedEnd(text, i);
|
|
70
|
-
if (end < 0) {
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
try {
|
|
74
|
-
return JSON.parse(text.slice(i, end + 1));
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
// 该候选不是合法 JSON(例如日志里的花括号),继续向后找
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
throw new helixlifeError(helixlifeErrorCode.INVALID_RESPONSE, `无法从 newidea 输出中解析 JSON:${text.slice(0, 300)}`);
|
|
81
|
-
}
|
|
82
|
-
function asRecord(value) {
|
|
83
|
-
return value && typeof value === "object" && !Array.isArray(value)
|
|
84
|
-
? value
|
|
85
|
-
: null;
|
|
86
|
-
}
|
|
87
|
-
function pickString(source, keys) {
|
|
88
|
-
for (const key of keys) {
|
|
89
|
-
const value = source[key];
|
|
90
|
-
if (typeof value === "string" && value.trim()) {
|
|
91
|
-
return value.trim();
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return undefined;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* 从 `invocation start` / `last` 的返回中提取 run_record_id。
|
|
98
|
-
* 兼容下划线与驼峰,并向下一层 data / record / result 探一层。
|
|
99
|
-
*/
|
|
100
|
-
export function parseRunRecordId(raw) {
|
|
101
|
-
const record = asRecord(raw);
|
|
102
|
-
if (!record) {
|
|
103
|
-
return undefined;
|
|
104
|
-
}
|
|
105
|
-
const direct = pickString(record, [
|
|
106
|
-
"run_record_id",
|
|
107
|
-
"runRecordId",
|
|
108
|
-
"record_id",
|
|
109
|
-
"recordId",
|
|
110
|
-
]);
|
|
111
|
-
if (direct) {
|
|
112
|
-
return direct;
|
|
113
|
-
}
|
|
114
|
-
for (const key of ["data", "record", "result"]) {
|
|
115
|
-
const nested = asRecord(record[key]);
|
|
116
|
-
if (nested) {
|
|
117
|
-
const found = pickString(nested, [
|
|
118
|
-
"run_record_id",
|
|
119
|
-
"runRecordId",
|
|
120
|
-
"record_id",
|
|
121
|
-
"recordId",
|
|
122
|
-
]);
|
|
123
|
-
if (found) {
|
|
124
|
-
return found;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return undefined;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* 归一 `invocation process` 返回:状态、错误、产物链接与事件条数。
|
|
132
|
-
*/
|
|
133
|
-
export function normalizeInvocationProcess(raw) {
|
|
134
|
-
const record = asRecord(raw);
|
|
135
|
-
if (!record) {
|
|
136
|
-
throw new helixlifeError(helixlifeErrorCode.INVALID_RESPONSE, "newidea 进度查询返回结构异常(非对象)");
|
|
137
|
-
}
|
|
138
|
-
const source = asRecord(record.data) ?? record;
|
|
139
|
-
const rawStatus = typeof source.status === "string" ? source.status.trim() : "";
|
|
140
|
-
const normalized = rawStatus.toLowerCase();
|
|
141
|
-
const errorValue = source.error;
|
|
142
|
-
let error = null;
|
|
143
|
-
if (typeof errorValue === "string" && errorValue.trim()) {
|
|
144
|
-
error = errorValue.trim();
|
|
145
|
-
}
|
|
146
|
-
else if (asRecord(errorValue)) {
|
|
147
|
-
const nested = asRecord(errorValue);
|
|
148
|
-
error = pickString(nested, ["message", "detail", "reason"]) ?? null;
|
|
149
|
-
}
|
|
150
|
-
let status;
|
|
151
|
-
if (SUCCESS_STATUSES.has(normalized)) {
|
|
152
|
-
status = "success";
|
|
153
|
-
}
|
|
154
|
-
else if (FAILED_STATUSES.has(normalized) || error) {
|
|
155
|
-
// 未标记失败但带 error 文本时同样按失败处理,避免无限轮询
|
|
156
|
-
status = "failed";
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
status = "running";
|
|
160
|
-
}
|
|
161
|
-
const artifactsValue = source.artifacts;
|
|
162
|
-
let artifacts = null;
|
|
163
|
-
if (typeof artifactsValue === "string" && artifactsValue.trim()) {
|
|
164
|
-
artifacts = artifactsValue.trim();
|
|
165
|
-
}
|
|
166
|
-
else if (Array.isArray(artifactsValue)) {
|
|
167
|
-
const first = artifactsValue.find((item) => typeof item === "string" && Boolean(item.trim()));
|
|
168
|
-
artifacts = first ? first.trim() : null;
|
|
169
|
-
}
|
|
170
|
-
const itemCount = Array.isArray(source.items) ? source.items.length : 0;
|
|
171
|
-
return { status, rawStatus, error, artifacts, itemCount };
|
|
172
|
-
}
|
|
173
|
-
//# sourceMappingURL=parse.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/modules/proposal/parse.ts"],"names":[],"mappings":"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"}
|