@agentearth.ai/cli 0.1.0-beta.1 → 0.1.0-beta.2
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/dist/constants.d.ts +3 -2
- package/dist/constants.js +6 -3
- package/dist/constants.js.map +1 -1
- package/dist/core/args.js +15 -7
- package/dist/core/args.js.map +1 -1
- package/dist/core/http.d.ts +25 -0
- package/dist/core/http.js +58 -0
- package/dist/core/http.js.map +1 -1
- package/dist/storage/paths.d.ts +1 -0
- package/dist/storage/paths.js +3 -0
- package/dist/storage/paths.js.map +1 -1
- package/dist/storage/telemetryUploadState.d.ts +13 -0
- package/dist/storage/telemetryUploadState.js +68 -0
- package/dist/storage/telemetryUploadState.js.map +1 -0
- package/dist/telemetry/uploader.js +75 -32
- package/dist/telemetry/uploader.js.map +1 -1
- package/dist/types/cli.d.ts +1 -0
- package/package.json +1 -1
package/dist/constants.d.ts
CHANGED
|
@@ -7,13 +7,14 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export declare const PACKAGE_NAME = "@agentearth.ai/cli";
|
|
9
9
|
export declare const UPDATE_COMMAND_TEXT = "npm install -g @agentearth.ai/cli@latest";
|
|
10
|
-
export declare const CLI_VERSION = "0.1.0-beta.
|
|
10
|
+
export declare const CLI_VERSION = "0.1.0-beta.2";
|
|
11
11
|
export declare const DEFAULT_BASE_URL = "https://agentearth.ai";
|
|
12
|
+
export declare const DEFAULT_TELEMETRY_BASE_URL = "https://dev05.agentearth.ai";
|
|
12
13
|
export declare const RECOMMEND_PATH = "/agent-api/v1/tool/recommend";
|
|
13
14
|
export declare const TOOLS_LIST_PATH = "/agent-api/v1/tool/list";
|
|
14
15
|
export declare const TOOL_DETAIL_PATH = "/agent-api/v1/tool/detail";
|
|
15
16
|
export declare const EXECUTE_PATH = "/agent-api/v1/tool/execute";
|
|
16
|
-
export declare const TELEMETRY_PATH = "/
|
|
17
|
+
export declare const TELEMETRY_PATH = "/api/client/cli/logs";
|
|
17
18
|
export declare const DEFAULT_TIMEOUT_MS = 30000;
|
|
18
19
|
export declare const TOOL_CACHE_LIMIT = 200;
|
|
19
20
|
export declare const TELEMETRY_QUEUE_MAX_LINES = 1000;
|
package/dist/constants.js
CHANGED
|
@@ -10,9 +10,12 @@ export const PACKAGE_NAME = "@agentearth.ai/cli";
|
|
|
10
10
|
// 固定更新命令;ae update 实际执行也使用这个命令。
|
|
11
11
|
export const UPDATE_COMMAND_TEXT = `npm install -g ${PACKAGE_NAME}@latest`;
|
|
12
12
|
// CLI 自身版本号;login 输出、埋点字段和 --version 都会用到它。
|
|
13
|
-
export const CLI_VERSION = "0.1.0-beta.
|
|
14
|
-
//
|
|
13
|
+
export const CLI_VERSION = "0.1.0-beta.2";
|
|
14
|
+
// 默认业务后端域名;调试时可以通过 --base-url 或 AGENT_EARTH_BASE_URL 覆盖。
|
|
15
15
|
export const DEFAULT_BASE_URL = "https://agentearth.ai";
|
|
16
|
+
// 默认 CLI 埋点上传域名;当前日志上传接口只在测试环境可用。
|
|
17
|
+
// 生产日志接口上线后,把这里切回 DEFAULT_BASE_URL 即可。
|
|
18
|
+
export const DEFAULT_TELEMETRY_BASE_URL = "https://dev05.agentearth.ai";
|
|
16
19
|
// recommend 接口:agent 不确定工具类别时,用自然语言任务让后端推荐工具。
|
|
17
20
|
export const RECOMMEND_PATH = "/agent-api/v1/tool/recommend";
|
|
18
21
|
// list 接口:agent 已经知道大致工具类别时,读取工具市场/工具列表。
|
|
@@ -22,7 +25,7 @@ export const TOOL_DETAIL_PATH = "/agent-api/v1/tool/detail";
|
|
|
22
25
|
// execute 标准接口路径:实际请求使用后端返回的完整 tool_url,埋点只记录这个标准 path。
|
|
23
26
|
export const EXECUTE_PATH = "/agent-api/v1/tool/execute";
|
|
24
27
|
// CLI 埋点上传接口:只上传后端不知道的本地行为和本地错误。
|
|
25
|
-
export const TELEMETRY_PATH = "/
|
|
28
|
+
export const TELEMETRY_PATH = "/api/client/cli/logs";
|
|
26
29
|
// HTTP 默认超时时间,单位是毫秒;这里是 30 秒。
|
|
27
30
|
export const DEFAULT_TIMEOUT_MS = 30_000;
|
|
28
31
|
// 本地最多缓存 200 个工具,防止高频 recommend/list/detail 把磁盘撑大。
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wCAAwC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAEjD,gCAAgC;AAChC,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,YAAY,SAAS,CAAC;AAE3E,4CAA4C;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAE1C,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wCAAwC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AAEjD,gCAAgC;AAChC,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,YAAY,SAAS,CAAC;AAE3E,4CAA4C;AAC5C,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAE1C,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAExD,kCAAkC;AAClC,uCAAuC;AACvC,MAAM,CAAC,MAAM,0BAA0B,GAAG,6BAA6B,CAAC;AAExE,8CAA8C;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,8BAA8B,CAAC;AAE7D,yCAAyC;AACzC,MAAM,CAAC,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAEzD,6CAA6C;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;AAE5D,wDAAwD;AACxD,MAAM,CAAC,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAEzD,iCAAiC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,sBAAsB,CAAC;AAErD,8BAA8B;AAC9B,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC,mDAAmD;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,uCAAuC;AACvC,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,mDAAmD;AACnD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC"}
|
package/dist/core/args.js
CHANGED
|
@@ -7,18 +7,22 @@
|
|
|
7
7
|
*
|
|
8
8
|
* 当前项目没有引入第三方参数解析库,所以这里是一个小型手写解析器。
|
|
9
9
|
*/
|
|
10
|
-
import { DEFAULT_BASE_URL, DEFAULT_TIMEOUT_MS } from "../constants.js";
|
|
10
|
+
import { DEFAULT_BASE_URL, DEFAULT_TELEMETRY_BASE_URL, DEFAULT_TIMEOUT_MS } from "../constants.js";
|
|
11
11
|
import { usageError } from "./errors.js";
|
|
12
12
|
export function parseArgs(argv) {
|
|
13
13
|
// positionals 收集不以 -- 开头的普通参数。
|
|
14
14
|
// 第一个普通参数稍后会被当成命令名。
|
|
15
15
|
const positionals = [];
|
|
16
|
+
const envBaseUrl = readNonBlankEnv("AGENT_EARTH_BASE_URL");
|
|
17
|
+
const envTelemetryBaseUrl = readNonBlankEnv("AGENT_EARTH_TELEMETRY_BASE_URL");
|
|
16
18
|
// options 先填默认值;遇到命令行参数时再覆盖。
|
|
17
19
|
const options = {
|
|
18
20
|
apiKey: undefined,
|
|
19
21
|
apiKeyStdin: false,
|
|
20
22
|
// baseUrl 可由环境变量覆盖,方便本地联调或测试 mock server。
|
|
21
|
-
baseUrl:
|
|
23
|
+
baseUrl: envBaseUrl ?? DEFAULT_BASE_URL,
|
|
24
|
+
// telemetryBaseUrl 默认走 dev05;本地/mock 调试时跟随 AGENT_EARTH_BASE_URL 或 --base-url。
|
|
25
|
+
telemetryBaseUrl: envTelemetryBaseUrl ?? envBaseUrl ?? DEFAULT_TELEMETRY_BASE_URL,
|
|
22
26
|
json: false,
|
|
23
27
|
noColor: process.env.NO_COLOR === "1",
|
|
24
28
|
noTelemetry: process.env.AE_NO_TELEMETRY === "1",
|
|
@@ -43,7 +47,11 @@ export function parseArgs(argv) {
|
|
|
43
47
|
}
|
|
44
48
|
else if (arg === "--base-url") {
|
|
45
49
|
// 调试时可以把请求打到 mock server 或测试环境。
|
|
46
|
-
|
|
50
|
+
const baseUrl = readNonBlankOptionValue(argv, ++index, "--base-url");
|
|
51
|
+
options.baseUrl = baseUrl;
|
|
52
|
+
if (!envTelemetryBaseUrl) {
|
|
53
|
+
options.telemetryBaseUrl = baseUrl;
|
|
54
|
+
}
|
|
47
55
|
}
|
|
48
56
|
else if (arg === "--timeout") {
|
|
49
57
|
// 用户传入的是秒;内部统一换成毫秒。
|
|
@@ -102,9 +110,9 @@ function readNonBlankOptionValue(argv, index, optionName) {
|
|
|
102
110
|
}
|
|
103
111
|
return value;
|
|
104
112
|
}
|
|
105
|
-
function
|
|
106
|
-
// 空环境变量常见于 shell/CI
|
|
107
|
-
const
|
|
108
|
-
return
|
|
113
|
+
function readNonBlankEnv(name) {
|
|
114
|
+
// 空环境变量常见于 shell/CI 占位,不能覆盖默认地址。
|
|
115
|
+
const value = process.env[name]?.trim();
|
|
116
|
+
return value || undefined;
|
|
109
117
|
}
|
|
110
118
|
//# sourceMappingURL=args.js.map
|
package/dist/core/args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/core/args.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/core/args.ts"],"names":[],"mappings":"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"}
|
package/dist/core/http.d.ts
CHANGED
|
@@ -6,4 +6,29 @@ export interface HttpOptions {
|
|
|
6
6
|
export type QueryValue = string | number | boolean;
|
|
7
7
|
export declare function postJson<TResponse>(pathOrUrl: string, body: unknown, options: HttpOptions): Promise<TResponse>;
|
|
8
8
|
export declare function postJsonNoResponse(pathOrUrl: string, body: unknown, options: HttpOptions): Promise<void>;
|
|
9
|
+
export type TelemetryPostResult = {
|
|
10
|
+
kind: "success";
|
|
11
|
+
status: number;
|
|
12
|
+
} | {
|
|
13
|
+
kind: "permanent_failure";
|
|
14
|
+
status: number;
|
|
15
|
+
} | {
|
|
16
|
+
kind: "auth_failed";
|
|
17
|
+
status: 401 | 403;
|
|
18
|
+
} | {
|
|
19
|
+
kind: "payload_too_large";
|
|
20
|
+
status: 413;
|
|
21
|
+
} | {
|
|
22
|
+
kind: "rate_limited";
|
|
23
|
+
status: 429;
|
|
24
|
+
retryAfterMs?: number;
|
|
25
|
+
} | {
|
|
26
|
+
kind: "server_error";
|
|
27
|
+
status: number;
|
|
28
|
+
} | {
|
|
29
|
+
kind: "network_error";
|
|
30
|
+
} | {
|
|
31
|
+
kind: "timeout";
|
|
32
|
+
};
|
|
33
|
+
export declare function postTelemetryJson(pathOrUrl: string, body: unknown, options: HttpOptions): Promise<TelemetryPostResult>;
|
|
9
34
|
export declare function getJson<TResponse>(pathOrUrl: string, query: Record<string, QueryValue>, options: HttpOptions): Promise<TResponse>;
|
package/dist/core/http.js
CHANGED
|
@@ -25,6 +25,50 @@ export async function postJsonNoResponse(pathOrUrl, body, options) {
|
|
|
25
25
|
body: JSON.stringify(body)
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
|
+
export async function postTelemetryJson(pathOrUrl, body, options) {
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
const timeout = setTimeout(() => controller.abort(), options.timeoutMs);
|
|
31
|
+
try {
|
|
32
|
+
const response = await fetch(resolveUrl(pathOrUrl, options.baseUrl), {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
"X-Api-Key": options.apiKey
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify(body),
|
|
39
|
+
signal: controller.signal
|
|
40
|
+
});
|
|
41
|
+
if (response.ok) {
|
|
42
|
+
return { kind: "success", status: response.status };
|
|
43
|
+
}
|
|
44
|
+
if (response.status === 401 || response.status === 403) {
|
|
45
|
+
return { kind: "auth_failed", status: response.status };
|
|
46
|
+
}
|
|
47
|
+
if (response.status === 413) {
|
|
48
|
+
return { kind: "payload_too_large", status: 413 };
|
|
49
|
+
}
|
|
50
|
+
if (response.status === 429) {
|
|
51
|
+
return {
|
|
52
|
+
kind: "rate_limited",
|
|
53
|
+
status: 429,
|
|
54
|
+
retryAfterMs: parseRetryAfterMs(response.headers.get("retry-after"))
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (response.status >= 500) {
|
|
58
|
+
return { kind: "server_error", status: response.status };
|
|
59
|
+
}
|
|
60
|
+
return { kind: "permanent_failure", status: response.status };
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
64
|
+
return { kind: "timeout" };
|
|
65
|
+
}
|
|
66
|
+
return { kind: "network_error" };
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
clearTimeout(timeout);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
28
72
|
export async function getJson(pathOrUrl, query, options) {
|
|
29
73
|
// GET 请求没有 body,参数统一拼到 URL 的 query string 上。
|
|
30
74
|
return requestJson(appendQuery(pathOrUrl, query, options.baseUrl), options, {
|
|
@@ -137,6 +181,20 @@ function resolveUrl(pathOrUrl, baseUrl) {
|
|
|
137
181
|
// 其他接口通常传相对 path,这里和 baseUrl 拼起来,并处理多余斜杠。
|
|
138
182
|
return `${baseUrl.replace(/\/$/, "")}/${pathOrUrl.replace(/^\//, "")}`;
|
|
139
183
|
}
|
|
184
|
+
function parseRetryAfterMs(value) {
|
|
185
|
+
if (!value) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
const seconds = Number(value);
|
|
189
|
+
if (Number.isFinite(seconds) && seconds >= 0) {
|
|
190
|
+
return Math.floor(seconds * 1000);
|
|
191
|
+
}
|
|
192
|
+
const retryAt = Date.parse(value);
|
|
193
|
+
if (!Number.isFinite(retryAt)) {
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
return Math.max(0, retryAt - Date.now());
|
|
197
|
+
}
|
|
140
198
|
function isRecord(value) {
|
|
141
199
|
// object 会包含数组;响应 payload 的顶层必须是普通对象才可能有 error_no 字段。
|
|
142
200
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
package/dist/core/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/core/http.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/core/http.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/paths.d.ts
CHANGED
|
@@ -2,5 +2,6 @@ export declare function getAgentEarthDir(): string;
|
|
|
2
2
|
export declare function getCredentialsPath(): string;
|
|
3
3
|
export declare function getSessionPath(): string;
|
|
4
4
|
export declare function getTelemetryQueuePath(): string;
|
|
5
|
+
export declare function getTelemetryUploadStatePath(): string;
|
|
5
6
|
export declare function getUpdateCachePath(): string;
|
|
6
7
|
export declare function ensureAgentEarthDir(): Promise<void>;
|
package/dist/storage/paths.js
CHANGED
|
@@ -38,6 +38,9 @@ export function getTelemetryQueuePath() {
|
|
|
38
38
|
// events.jsonl 一行一个埋点事件,上传成功后从队头删除。
|
|
39
39
|
return path.join(getAgentEarthDir(), "events.jsonl");
|
|
40
40
|
}
|
|
41
|
+
export function getTelemetryUploadStatePath() {
|
|
42
|
+
return path.join(getAgentEarthDir(), "telemetry-upload-state.json");
|
|
43
|
+
}
|
|
41
44
|
export function getUpdateCachePath() {
|
|
42
45
|
// update-cache 保存版本检查结果,不保存 API key。
|
|
43
46
|
return path.join(getAgentEarthDir(), "update-cache.json");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,gBAAgB;IAC9B,4DAA4D;IAC5D,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,kCAAkC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,0CAA0C;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IACtD,qDAAqD;IACrD,OAAO,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,8BAA8B;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,gCAAgC;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,cAAc,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,oCAAoC;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,cAAc,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,qCAAqC;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAE/B,gCAAgC;IAChC,qDAAqD;IACrD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEnD,uDAAuD;IACvD,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,gBAAgB;IAC9B,4DAA4D;IAC5D,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,kCAAkC;QAClC,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;IAED,0CAA0C;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,mBAAmB;IAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IACtD,qDAAqD;IACrD,OAAO,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,8BAA8B;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,gCAAgC;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,cAAc,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,oCAAoC;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,cAAc,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,6BAA6B,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,qCAAqC;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;IAE/B,gCAAgC;IAChC,qDAAqD;IACrD,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEnD,uDAAuD;IACvD,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type TelemetryUploadPauseReason = "auth_failed" | "rate_limited" | "temporary_failure";
|
|
2
|
+
export interface TelemetryUploadState {
|
|
3
|
+
suspended_until: string;
|
|
4
|
+
reason: TelemetryUploadPauseReason;
|
|
5
|
+
api_key_fingerprint?: string;
|
|
6
|
+
retry_count: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function readTelemetryUploadState(): Promise<TelemetryUploadState | null>;
|
|
9
|
+
export declare function writeTelemetryUploadState(state: TelemetryUploadState): Promise<void>;
|
|
10
|
+
export declare function clearTelemetryUploadState(): Promise<void>;
|
|
11
|
+
export declare function createApiKeyFingerprint(apiKey: string): string;
|
|
12
|
+
export declare function isTelemetryUploadPaused(state: TelemetryUploadState, now?: Date): boolean;
|
|
13
|
+
export declare function createTelemetryUploadState(reason: TelemetryUploadPauseReason, delayMs: number, apiKeyFingerprint: string | undefined, previousState: TelemetryUploadState | null, now?: Date): TelemetryUploadState;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFile, unlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import { ensureAgentEarthDir, getTelemetryUploadStatePath } from "./paths.js";
|
|
4
|
+
export async function readTelemetryUploadState() {
|
|
5
|
+
try {
|
|
6
|
+
const raw = await readFile(getTelemetryUploadStatePath(), "utf8");
|
|
7
|
+
return normalizeTelemetryUploadState(JSON.parse(raw));
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export async function writeTelemetryUploadState(state) {
|
|
14
|
+
await ensureAgentEarthDir();
|
|
15
|
+
await writeFile(getTelemetryUploadStatePath(), `${JSON.stringify(state, null, 2)}\n`, {
|
|
16
|
+
encoding: "utf8",
|
|
17
|
+
mode: 0o600
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export async function clearTelemetryUploadState() {
|
|
21
|
+
try {
|
|
22
|
+
await unlink(getTelemetryUploadStatePath());
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Missing or locked state files should not affect the user command.
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function createApiKeyFingerprint(apiKey) {
|
|
29
|
+
return createHash("sha256").update(apiKey).digest("hex").slice(0, 16);
|
|
30
|
+
}
|
|
31
|
+
export function isTelemetryUploadPaused(state, now = new Date()) {
|
|
32
|
+
const suspendedUntil = Date.parse(state.suspended_until);
|
|
33
|
+
return Number.isFinite(suspendedUntil) && suspendedUntil > now.getTime();
|
|
34
|
+
}
|
|
35
|
+
export function createTelemetryUploadState(reason, delayMs, apiKeyFingerprint, previousState, now = new Date()) {
|
|
36
|
+
return {
|
|
37
|
+
suspended_until: new Date(now.getTime() + Math.max(0, delayMs)).toISOString(),
|
|
38
|
+
reason,
|
|
39
|
+
api_key_fingerprint: apiKeyFingerprint,
|
|
40
|
+
retry_count: previousState?.reason === reason ? previousState.retry_count + 1 : 1
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function normalizeTelemetryUploadState(value) {
|
|
44
|
+
if (!isRecord(value)) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
if (value.reason !== "auth_failed"
|
|
48
|
+
&& value.reason !== "rate_limited"
|
|
49
|
+
&& value.reason !== "temporary_failure") {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
if (typeof value.suspended_until !== "string" || !Number.isFinite(Date.parse(value.suspended_until))) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const retryCount = typeof value.retry_count === "number" && Number.isInteger(value.retry_count) && value.retry_count >= 0
|
|
56
|
+
? value.retry_count
|
|
57
|
+
: 0;
|
|
58
|
+
return {
|
|
59
|
+
suspended_until: value.suspended_until,
|
|
60
|
+
reason: value.reason,
|
|
61
|
+
api_key_fingerprint: typeof value.api_key_fingerprint === "string" ? value.api_key_fingerprint : undefined,
|
|
62
|
+
retry_count: retryCount
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function isRecord(value) {
|
|
66
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=telemetryUploadState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetryUploadState.js","sourceRoot":"","sources":["../../src/storage/telemetryUploadState.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,46 +1,89 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI 埋点上传模块。
|
|
3
|
-
*
|
|
4
|
-
* 本模块从本地 events.jsonl 读取待上传日志,调用后端 CLI 埋点接口。
|
|
5
|
-
* 上传成功只以 HTTP 200 为准,不解析响应体。上传失败时保留本地队列,
|
|
6
|
-
* 等下一次 CLI 命令结束后再尝试。
|
|
7
|
-
*
|
|
8
|
-
* 重要原则:埋点失败绝不能改变当前业务命令的输出和退出码。
|
|
9
|
-
*/
|
|
10
1
|
import { TELEMETRY_PATH } from "../constants.js";
|
|
11
|
-
import {
|
|
2
|
+
import { postTelemetryJson } from "../core/http.js";
|
|
12
3
|
import { resolveApiKey } from "../storage/credentials.js";
|
|
13
4
|
import { dropTelemetryQueueHead, readTelemetryQueueBatch } from "../storage/telemetryQueue.js";
|
|
5
|
+
import { clearTelemetryUploadState, createApiKeyFingerprint, createTelemetryUploadState, isTelemetryUploadPaused, readTelemetryUploadState, writeTelemetryUploadState } from "../storage/telemetryUploadState.js";
|
|
6
|
+
const DEFAULT_BATCH_SIZE = 20;
|
|
7
|
+
const AUTH_PAUSE_MS = 24 * 60 * 60 * 1000;
|
|
8
|
+
const RATE_LIMIT_PAUSE_MS = 5 * 60 * 1000;
|
|
9
|
+
const TEMPORARY_FAILURE_PAUSE_MS = 60 * 1000;
|
|
14
10
|
export async function flushTelemetry(options) {
|
|
15
|
-
// 用户或测试可以关闭埋点。
|
|
16
11
|
if (options.noTelemetry) {
|
|
17
12
|
return;
|
|
18
13
|
}
|
|
19
|
-
// 默认最多读取队头 20 条,具体限制在 readTelemetryQueueBatch 内部。
|
|
20
|
-
const batch = await readTelemetryQueueBatch();
|
|
21
|
-
const events = batch.events;
|
|
22
|
-
if (events.length === 0) {
|
|
23
|
-
if (batch.consumedLineCount > 0) {
|
|
24
|
-
// 队头只有损坏行时,不请求后端,直接清理这些无法上传的本地坏数据。
|
|
25
|
-
await dropTelemetryQueueHead(batch.consumedLineCount);
|
|
26
|
-
}
|
|
27
|
-
// 没有待上传事件时不请求后端。
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
14
|
try {
|
|
31
|
-
// 埋点接口也需要 API key,后端用它识别用户。
|
|
32
15
|
const apiKey = await resolveApiKey(options);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
16
|
+
const apiKeyFingerprint = createApiKeyFingerprint(apiKey);
|
|
17
|
+
const existingState = await readTelemetryUploadState();
|
|
18
|
+
if (await shouldSkipUpload(existingState, apiKeyFingerprint)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
let batchLimit = DEFAULT_BATCH_SIZE;
|
|
22
|
+
while (batchLimit >= 1) {
|
|
23
|
+
const batch = await readTelemetryQueueBatch(batchLimit);
|
|
24
|
+
const events = batch.events;
|
|
25
|
+
if (events.length === 0) {
|
|
26
|
+
if (batch.consumedLineCount > 0) {
|
|
27
|
+
await dropTelemetryQueueHead(batch.consumedLineCount);
|
|
28
|
+
}
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const result = await postTelemetryJson(TELEMETRY_PATH, { events }, {
|
|
32
|
+
apiKey,
|
|
33
|
+
baseUrl: options.telemetryBaseUrl || options.baseUrl,
|
|
34
|
+
timeoutMs: options.timeoutMs
|
|
35
|
+
});
|
|
36
|
+
if (result.kind === "success") {
|
|
37
|
+
await dropTelemetryQueueHead(batch.consumedLineCount);
|
|
38
|
+
await clearTelemetryUploadState();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (result.kind === "permanent_failure") {
|
|
42
|
+
await dropTelemetryQueueHead(batch.consumedLineCount);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (result.kind === "auth_failed") {
|
|
46
|
+
await pauseUpload("auth_failed", AUTH_PAUSE_MS, apiKeyFingerprint, existingState);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (result.kind === "payload_too_large") {
|
|
50
|
+
if (events.length > 1) {
|
|
51
|
+
batchLimit = Math.max(1, Math.floor(events.length / 2));
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
await dropTelemetryQueueHead(batch.consumedLineCount);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (result.kind === "rate_limited") {
|
|
58
|
+
await pauseUpload("rate_limited", result.retryAfterMs ?? RATE_LIMIT_PAUSE_MS, apiKeyFingerprint, existingState);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
await pauseUpload("temporary_failure", TEMPORARY_FAILURE_PAUSE_MS, apiKeyFingerprint, existingState);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
41
64
|
}
|
|
42
65
|
catch {
|
|
43
|
-
//
|
|
66
|
+
// Telemetry is best-effort and must never change command output or exit code.
|
|
44
67
|
}
|
|
45
68
|
}
|
|
69
|
+
async function shouldSkipUpload(state, apiKeyFingerprint) {
|
|
70
|
+
if (!state) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
if (!isTelemetryUploadPaused(state)) {
|
|
74
|
+
await clearTelemetryUploadState();
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if (state.reason !== "auth_failed") {
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
if (state.api_key_fingerprint === apiKeyFingerprint) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
await clearTelemetryUploadState();
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
async function pauseUpload(reason, delayMs, apiKeyFingerprint, previousState) {
|
|
87
|
+
await writeTelemetryUploadState(createTelemetryUploadState(reason, delayMs, apiKeyFingerprint, previousState));
|
|
88
|
+
}
|
|
46
89
|
//# sourceMappingURL=uploader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploader.js","sourceRoot":"","sources":["../../src/telemetry/uploader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"uploader.js","sourceRoot":"","sources":["../../src/telemetry/uploader.ts"],"names":[],"mappings":"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"}
|
package/dist/types/cli.d.ts
CHANGED
package/package.json
CHANGED