@agentearth.ai/cli 0.1.0-beta.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 +89 -0
- package/bin/ae.mjs +31 -0
- package/dist/commands/detail.d.ts +2 -0
- package/dist/commands/detail.js +71 -0
- package/dist/commands/detail.js.map +1 -0
- package/dist/commands/execute.d.ts +2 -0
- package/dist/commands/execute.js +118 -0
- package/dist/commands/execute.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.js +94 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.js +96 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/recommend.d.ts +2 -0
- package/dist/commands/recommend.js +58 -0
- package/dist/commands/recommend.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.js +67 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/updateCheck.d.ts +10 -0
- package/dist/commands/updateCheck.js +98 -0
- package/dist/commands/updateCheck.js.map +1 -0
- package/dist/commands/updateHint.d.ts +9 -0
- package/dist/commands/updateHint.js +25 -0
- package/dist/commands/updateHint.js.map +1 -0
- package/dist/commands/updateNpm.d.ts +13 -0
- package/dist/commands/updateNpm.js +64 -0
- package/dist/commands/updateNpm.js.map +1 -0
- package/dist/constants.d.ts +20 -0
- package/dist/constants.js +34 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/args.d.ts +2 -0
- package/dist/core/args.js +110 -0
- package/dist/core/args.js.map +1 -0
- package/dist/core/backendErrors.d.ts +10 -0
- package/dist/core/backendErrors.js +69 -0
- package/dist/core/backendErrors.js.map +1 -0
- package/dist/core/errors.d.ts +20 -0
- package/dist/core/errors.js +44 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/hiddenInput.d.ts +10 -0
- package/dist/core/hiddenInput.js +53 -0
- package/dist/core/hiddenInput.js.map +1 -0
- package/dist/core/http.d.ts +9 -0
- package/dist/core/http.js +144 -0
- package/dist/core/http.js.map +1 -0
- package/dist/core/output.d.ts +11 -0
- package/dist/core/output.js +33 -0
- package/dist/core/output.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +300 -0
- package/dist/main.js.map +1 -0
- package/dist/storage/credentials.d.ts +9 -0
- package/dist/storage/credentials.js +97 -0
- package/dist/storage/credentials.js.map +1 -0
- package/dist/storage/fileProtection.d.ts +12 -0
- package/dist/storage/fileProtection.js +51 -0
- package/dist/storage/fileProtection.js.map +1 -0
- package/dist/storage/paths.d.ts +6 -0
- package/dist/storage/paths.js +55 -0
- package/dist/storage/paths.js.map +1 -0
- package/dist/storage/session.d.ts +23 -0
- package/dist/storage/session.js +175 -0
- package/dist/storage/session.js.map +1 -0
- package/dist/storage/telemetryQueue.d.ts +14 -0
- package/dist/storage/telemetryQueue.js +252 -0
- package/dist/storage/telemetryQueue.js.map +1 -0
- package/dist/storage/updateCache.d.ts +19 -0
- package/dist/storage/updateCache.js +80 -0
- package/dist/storage/updateCache.js.map +1 -0
- package/dist/telemetry/events.d.ts +42 -0
- package/dist/telemetry/events.js +80 -0
- package/dist/telemetry/events.js.map +1 -0
- package/dist/telemetry/uploader.d.ts +2 -0
- package/dist/telemetry/uploader.js +46 -0
- package/dist/telemetry/uploader.js.map +1 -0
- package/dist/types/api.d.ts +47 -0
- package/dist/types/api.js +9 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/cli.d.ts +42 -0
- package/dist/types/cli.js +9 -0
- package/dist/types/cli.js.map +1 -0
- package/package.json +29 -0
- package/skills/agentearth/SKILL.md +37 -0
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { GlobalOptions } from "../types/cli.js";
|
|
2
|
+
export interface AgentEarthCredentials {
|
|
3
|
+
api_key: string;
|
|
4
|
+
saved_at: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function readCredentials(): Promise<AgentEarthCredentials | null>;
|
|
7
|
+
export declare function writeCredentials(apiKey: string): Promise<void>;
|
|
8
|
+
export declare function resolveApiKey(options: GlobalOptions): Promise<string>;
|
|
9
|
+
export declare function resolveLoginApiKey(options: GlobalOptions): string;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API key 凭据存储模块。
|
|
3
|
+
*
|
|
4
|
+
* `ae login` 会把验证通过的 API key 写入 credentials.json。
|
|
5
|
+
* 后续业务命令读取 key 的优先级是:
|
|
6
|
+
* 1. 当前命令的 `--api-key`;
|
|
7
|
+
* 2. 环境变量 `AGENT_EARTH_API_KEY`;
|
|
8
|
+
* 3. 本地 credentials.json。
|
|
9
|
+
*
|
|
10
|
+
* 本文件只负责本地读写和优先级选择,不负责后端验证。
|
|
11
|
+
*/
|
|
12
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
13
|
+
import { CliError } from "../core/errors.js";
|
|
14
|
+
import { protectSensitiveFile } from "./fileProtection.js";
|
|
15
|
+
import { ensureAgentEarthDir, getCredentialsPath } from "./paths.js";
|
|
16
|
+
export async function readCredentials() {
|
|
17
|
+
try {
|
|
18
|
+
// readFile 读取文本文件;utf8 表示按 UTF-8 字符串解码。
|
|
19
|
+
const raw = await readFile(getCredentialsPath(), "utf8");
|
|
20
|
+
// credentials.json 可能被用户或外部程序改坏,所以解析后还要做运行时结构校验。
|
|
21
|
+
return normalizeCredentials(JSON.parse(raw));
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// 文件不存在、没有权限、JSON 损坏,都当作没有可用本地凭据。
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function writeCredentials(apiKey) {
|
|
29
|
+
// 写文件前先确保数据目录存在。
|
|
30
|
+
await ensureAgentEarthDir();
|
|
31
|
+
// 进入落盘前再做一次 trim,确保 credentials.json 不保存前后空白。
|
|
32
|
+
const normalizedApiKey = apiKey.trim();
|
|
33
|
+
const credentials = {
|
|
34
|
+
api_key: normalizedApiKey,
|
|
35
|
+
saved_at: new Date().toISOString()
|
|
36
|
+
};
|
|
37
|
+
const filePath = getCredentialsPath();
|
|
38
|
+
// mode=0o600 表示尽量只让当前用户读写;Windows 还会在写入后显式收紧 ACL。
|
|
39
|
+
await writeFile(filePath, `${JSON.stringify(credentials, null, 2)}\n`, { mode: 0o600 });
|
|
40
|
+
// 写入后立即收紧权限:Windows 用当前用户 ACL,macOS/Linux 用 0o600。
|
|
41
|
+
await protectSensitiveFile(filePath);
|
|
42
|
+
}
|
|
43
|
+
export async function resolveApiKey(options) {
|
|
44
|
+
// 1. 命令行临时 key 优先级最高,适合调试或一次性覆盖。
|
|
45
|
+
const optionApiKey = normalizeApiKey(options.apiKey);
|
|
46
|
+
if (optionApiKey) {
|
|
47
|
+
return optionApiKey;
|
|
48
|
+
}
|
|
49
|
+
// 2. 环境变量适合 CI 或不希望落盘的运行环境。
|
|
50
|
+
const envApiKey = normalizeApiKey(process.env.AGENT_EARTH_API_KEY);
|
|
51
|
+
if (envApiKey) {
|
|
52
|
+
return envApiKey;
|
|
53
|
+
}
|
|
54
|
+
// 3. 正常安装后,业务命令会从 credentials.json 读取 key。
|
|
55
|
+
const credentials = await readCredentials();
|
|
56
|
+
if (credentials?.api_key) {
|
|
57
|
+
return credentials.api_key;
|
|
58
|
+
}
|
|
59
|
+
// 三个来源都没有时,命令无法请求后端。
|
|
60
|
+
throw new CliError("auth_missing", "No API key available.", "Pipe the API key into ae login --api-key-stdin.");
|
|
61
|
+
}
|
|
62
|
+
export function resolveLoginApiKey(options) {
|
|
63
|
+
// login 是“写入新 key”的命令,所以不能读取旧 credentials。
|
|
64
|
+
const apiKey = normalizeApiKey(options.apiKey) ?? normalizeApiKey(process.env.AGENT_EARTH_API_KEY);
|
|
65
|
+
if (!apiKey) {
|
|
66
|
+
throw new CliError("auth_missing", "No API key provided.", "Pipe the API key into ae login --api-key-stdin.");
|
|
67
|
+
}
|
|
68
|
+
return apiKey;
|
|
69
|
+
}
|
|
70
|
+
function normalizeApiKey(value) {
|
|
71
|
+
// 所有来源先 trim:空白不是 key 的一部分,不能被发送给后端或写入 credentials。
|
|
72
|
+
const normalized = value?.trim();
|
|
73
|
+
if (!normalized) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return normalized;
|
|
77
|
+
}
|
|
78
|
+
function normalizeCredentials(value) {
|
|
79
|
+
// 只有非空字符串 api_key 才能作为真实凭据;损坏结构一律当作没有本地凭据。
|
|
80
|
+
if (!isRecord(value) || typeof value.api_key !== "string") {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const apiKey = value.api_key.trim();
|
|
84
|
+
if (!apiKey) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
api_key: apiKey,
|
|
89
|
+
// saved_at 只用于排查;缺失或类型不对时不影响 key 读取。
|
|
90
|
+
saved_at: typeof value.saved_at === "string" ? value.saved_at : ""
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function isRecord(value) {
|
|
94
|
+
// object 包含数组,这里明确排除数组,避免把奇怪结构当成 credentials。
|
|
95
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/storage/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface FileProtectionCommandResult {
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
}
|
|
5
|
+
export type FileProtectionCommandRunner = (command: string, args: readonly string[]) => Promise<FileProtectionCommandResult>;
|
|
6
|
+
export interface ProtectSensitiveFileOptions {
|
|
7
|
+
platform?: NodeJS.Platform;
|
|
8
|
+
runner?: FileProtectionCommandRunner;
|
|
9
|
+
}
|
|
10
|
+
export declare function pathExists(filePath: string): Promise<boolean>;
|
|
11
|
+
export declare function protectSensitiveFile(filePath: string, options?: ProtectSensitiveFileOptions): Promise<void>;
|
|
12
|
+
export declare function parseWindowsUserSid(output: string): string | null;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 敏感本地文件权限保护模块。
|
|
3
|
+
*
|
|
4
|
+
* credentials.json 保存 API key。这里集中处理“当前用户可访问”的文件权限:
|
|
5
|
+
* macOS/Linux 使用 0o600;Windows 用当前用户 SID 收紧文件 ACL。
|
|
6
|
+
*/
|
|
7
|
+
import { execFile } from "node:child_process";
|
|
8
|
+
import { chmod, stat } from "node:fs/promises";
|
|
9
|
+
import { platform as currentPlatform } from "node:os";
|
|
10
|
+
import { promisify } from "node:util";
|
|
11
|
+
const execFileAsync = promisify(execFile);
|
|
12
|
+
export async function pathExists(filePath) {
|
|
13
|
+
// 写入前只需要区分“是否已经有这个文件”,用于避免重复执行昂贵的 ACL 命令。
|
|
14
|
+
try {
|
|
15
|
+
await stat(filePath);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function protectSensitiveFile(filePath, options = {}) {
|
|
23
|
+
const targetPlatform = options.platform ?? currentPlatform();
|
|
24
|
+
if (targetPlatform === "win32") {
|
|
25
|
+
await protectWindowsSensitiveFile(filePath, options.runner ?? runCommand);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
await chmod(filePath, 0o600);
|
|
29
|
+
}
|
|
30
|
+
async function protectWindowsSensitiveFile(filePath, runner) {
|
|
31
|
+
// SID 比用户名稳定,能避开本地化用户名、域账号和空格转义问题。
|
|
32
|
+
const whoami = await runner("whoami", ["/user", "/fo", "csv", "/nh"]);
|
|
33
|
+
const sid = parseWindowsUserSid(whoami.stdout);
|
|
34
|
+
if (!sid) {
|
|
35
|
+
throw new Error("Unable to resolve current Windows user SID.");
|
|
36
|
+
}
|
|
37
|
+
// /inheritance:r 移除继承 ACE;/grant:r 用当前用户 SID 覆盖授权。
|
|
38
|
+
// 给当前用户 Full Control 是为了后续重复 login 时仍能覆盖文件和再次调整 ACL。
|
|
39
|
+
await runner("icacls", [filePath, "/inheritance:r", "/grant:r", `*${sid}:F`]);
|
|
40
|
+
}
|
|
41
|
+
export function parseWindowsUserSid(output) {
|
|
42
|
+
return output.match(/S-\d-\d+(?:-\d+)+/)?.[0] ?? null;
|
|
43
|
+
}
|
|
44
|
+
async function runCommand(command, args) {
|
|
45
|
+
const result = await execFileAsync(command, [...args], { encoding: "utf8", windowsHide: true });
|
|
46
|
+
return {
|
|
47
|
+
stdout: String(result.stdout),
|
|
48
|
+
stderr: String(result.stderr)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=fileProtection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileProtection.js","sourceRoot":"","sources":["../../src/storage/fileProtection.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAiB1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,0CAA0C;IAC1C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB,EAAE,UAAuC,EAAE;IACpG,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,EAAE,CAAC;IAE7D,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;QAC/B,MAAM,2BAA2B,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC;QAC1E,OAAO;IACT,CAAC;IAED,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,2BAA2B,CAAC,QAAgB,EAAE,MAAmC;IAC9F,mCAAmC;IACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,MAAM,GAAG,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,mDAAmD;IACnD,qDAAqD;IACrD,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,IAAuB;IAChE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;KAC9B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function getAgentEarthDir(): string;
|
|
2
|
+
export declare function getCredentialsPath(): string;
|
|
3
|
+
export declare function getSessionPath(): string;
|
|
4
|
+
export declare function getTelemetryQueuePath(): string;
|
|
5
|
+
export declare function getUpdateCachePath(): string;
|
|
6
|
+
export declare function ensureAgentEarthDir(): Promise<void>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本地文件路径管理模块。
|
|
3
|
+
*
|
|
4
|
+
* CLI 会在用户机器上保存四类本地文件:
|
|
5
|
+
* 1. credentials.json:保存 ae login 写入的 API key;
|
|
6
|
+
* 2. session.json:保存 recommend/list/detail 返回的工具缓存;
|
|
7
|
+
* 3. events.jsonl:保存尚未上传的 CLI 埋点。
|
|
8
|
+
* 4. update-cache.json:保存更新检查缓存。
|
|
9
|
+
*
|
|
10
|
+
* 这个文件只负责计算路径和创建目录,不负责读写具体文件内容。
|
|
11
|
+
*/
|
|
12
|
+
import { mkdir } from "node:fs/promises";
|
|
13
|
+
import { homedir, platform } from "node:os";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
export function getAgentEarthDir() {
|
|
16
|
+
// Windows 使用 LocalAppData,避免把 API key 放到可能漫游同步的 Roaming 目录。
|
|
17
|
+
if (platform() === "win32") {
|
|
18
|
+
// 测试里会通过 LOCALAPPDATA 环境变量指向临时目录。
|
|
19
|
+
return path.join(resolveLocalAppData(), "AgentEarth");
|
|
20
|
+
}
|
|
21
|
+
// macOS/Linux 按惯例放到 ~/.config/agentearth。
|
|
22
|
+
return path.join(homedir(), ".config", "agentearth");
|
|
23
|
+
}
|
|
24
|
+
function resolveLocalAppData() {
|
|
25
|
+
const localAppData = process.env.LOCALAPPDATA?.trim();
|
|
26
|
+
// LOCALAPPDATA 为空白时不能作为目录,否则 credentials 可能落到当前工作目录。
|
|
27
|
+
return localAppData || path.join(homedir(), "AppData", "Local");
|
|
28
|
+
}
|
|
29
|
+
export function getCredentialsPath() {
|
|
30
|
+
// credentials 文件保存敏感 API key。
|
|
31
|
+
return path.join(getAgentEarthDir(), "credentials.json");
|
|
32
|
+
}
|
|
33
|
+
export function getSessionPath() {
|
|
34
|
+
// session 文件保存工具缓存,不保存 API key。
|
|
35
|
+
return path.join(getAgentEarthDir(), "session.json");
|
|
36
|
+
}
|
|
37
|
+
export function getTelemetryQueuePath() {
|
|
38
|
+
// events.jsonl 一行一个埋点事件,上传成功后从队头删除。
|
|
39
|
+
return path.join(getAgentEarthDir(), "events.jsonl");
|
|
40
|
+
}
|
|
41
|
+
export function getUpdateCachePath() {
|
|
42
|
+
// update-cache 保存版本检查结果,不保存 API key。
|
|
43
|
+
return path.join(getAgentEarthDir(), "update-cache.json");
|
|
44
|
+
}
|
|
45
|
+
export async function ensureAgentEarthDir() {
|
|
46
|
+
const dir = getAgentEarthDir();
|
|
47
|
+
// recursive=true 表示父目录不存在时一起创建。
|
|
48
|
+
// mode=0o700 表示当前用户可读写执行,其他用户无权限;Windows 上会部分依赖 ACL。
|
|
49
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
50
|
+
// Windows 的 chmod 语义和 Unix 不完全一致,所以只在非 Windows 平台显式设置。
|
|
51
|
+
if (platform() !== "win32") {
|
|
52
|
+
await import("node:fs/promises").then((fs) => fs.chmod(dir, 0o700));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ApiTool } from "../types/api.js";
|
|
2
|
+
import { type ProtectSensitiveFileOptions } from "./fileProtection.js";
|
|
3
|
+
export interface CachedTool {
|
|
4
|
+
tool_name: string;
|
|
5
|
+
tool_url: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
when_to_use?: string;
|
|
8
|
+
credit?: number;
|
|
9
|
+
input_schema?: unknown;
|
|
10
|
+
cached_at: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ToolSessionStore {
|
|
13
|
+
version: 3;
|
|
14
|
+
updated_at: string;
|
|
15
|
+
tools: CachedTool[];
|
|
16
|
+
}
|
|
17
|
+
export interface WriteSessionOptions {
|
|
18
|
+
fileProtection?: ProtectSensitiveFileOptions;
|
|
19
|
+
}
|
|
20
|
+
export declare function writeSession(tools: ApiTool[], options?: WriteSessionOptions): Promise<CachedTool[]>;
|
|
21
|
+
export declare function protectSessionFile(filePath: string, options?: ProtectSensitiveFileOptions): Promise<void>;
|
|
22
|
+
export declare function readToolByName(toolName: string): Promise<CachedTool>;
|
|
23
|
+
export declare function extractToolName(toolUrl?: string): string | null;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 本地工具缓存模块。
|
|
3
|
+
*
|
|
4
|
+
* recommend、list、detail 都可能从后端拿到工具信息。CLI 会把这些工具信息
|
|
5
|
+
* 写入 session.json,并以 tool_name 作为本地查找主键。execute 后续只需要
|
|
6
|
+
* agent 传入 tool_name,就能从缓存里找到后端返回过的完整 tool_url。
|
|
7
|
+
*
|
|
8
|
+
* 这个缓存不保存 API key,也不输出 tool_url 给 agent。
|
|
9
|
+
*/
|
|
10
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
11
|
+
import { TOOL_CACHE_LIMIT } from "../constants.js";
|
|
12
|
+
import { CliError } from "../core/errors.js";
|
|
13
|
+
import { pathExists, protectSensitiveFile } from "./fileProtection.js";
|
|
14
|
+
import { ensureAgentEarthDir, getSessionPath } from "./paths.js";
|
|
15
|
+
export async function writeSession(tools, options = {}) {
|
|
16
|
+
try {
|
|
17
|
+
// 写缓存前先确保目录存在。
|
|
18
|
+
await ensureAgentEarthDir();
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new CliError("session_write_failed", "Failed to prepare local tool cache.", "Check write permission for the AgentEarth data directory.");
|
|
22
|
+
}
|
|
23
|
+
// 同一批工具使用相同 cached_at,方便排查来自同一次后端响应。
|
|
24
|
+
const now = new Date().toISOString();
|
|
25
|
+
// 把后端 ApiTool 转成本地 CachedTool,同时解析 tool_name。
|
|
26
|
+
const incomingTools = tools.map((tool) => toCachedTool(tool, now));
|
|
27
|
+
// 如果同一批里出现同名工具,只保留最后一个。
|
|
28
|
+
const dedupedIncomingTools = keepLatestToolByName(incomingTools);
|
|
29
|
+
// 记录本批工具名,用于从旧缓存里删除同名旧记录。
|
|
30
|
+
const incomingNames = new Set(dedupedIncomingTools.map((tool) => tool.tool_name));
|
|
31
|
+
// 读取旧缓存;文件不存在或损坏时会返回空缓存。
|
|
32
|
+
const currentStore = await readStoreForWrite();
|
|
33
|
+
const nextTools = currentStore.tools
|
|
34
|
+
// 先移除被本批覆盖的旧工具。
|
|
35
|
+
.filter((tool) => !incomingNames.has(tool.tool_name))
|
|
36
|
+
// 再把本批工具追加到末尾,表示它们更新。
|
|
37
|
+
.concat(dedupedIncomingTools)
|
|
38
|
+
// 只保留最新 200 个,防止高频使用导致文件无限增长。
|
|
39
|
+
.slice(-TOOL_CACHE_LIMIT);
|
|
40
|
+
const nextStore = {
|
|
41
|
+
version: 3,
|
|
42
|
+
updated_at: now,
|
|
43
|
+
tools: nextTools
|
|
44
|
+
};
|
|
45
|
+
try {
|
|
46
|
+
const sessionPath = getSessionPath();
|
|
47
|
+
// 已存在的 session.json 会保留首次创建时收紧的 ACL,避免高频写入反复调用 Windows icacls。
|
|
48
|
+
const sessionFileExists = await pathExists(sessionPath);
|
|
49
|
+
// mode=0o600 尽量限制当前用户读写;这里虽然不存 key,但包含内部 tool_url。
|
|
50
|
+
await writeFile(sessionPath, `${JSON.stringify(nextStore, null, 2)}\n`, { mode: 0o600 });
|
|
51
|
+
if (!sessionFileExists) {
|
|
52
|
+
await protectSessionFile(sessionPath, options.fileProtection);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new CliError("session_write_failed", "Failed to write local tool cache.", "Check write permission for the AgentEarth data directory.");
|
|
57
|
+
}
|
|
58
|
+
// 返回本批写入的工具,而不是完整缓存;命令输出只展示本次后端返回内容。
|
|
59
|
+
return dedupedIncomingTools;
|
|
60
|
+
}
|
|
61
|
+
export async function protectSessionFile(filePath, options) {
|
|
62
|
+
// session.json 不保存 API key,但包含内部 tool_url,按当前用户私有文件处理。
|
|
63
|
+
await protectSensitiveFile(filePath, options);
|
|
64
|
+
}
|
|
65
|
+
export async function readToolByName(toolName) {
|
|
66
|
+
// execute 会通过这里按 tool_name 找到完整 tool_url。
|
|
67
|
+
const store = await readStoreForRead();
|
|
68
|
+
const tool = store.tools.find((candidate) => candidate.tool_name === toolName);
|
|
69
|
+
if (!tool) {
|
|
70
|
+
throw new CliError("tool_name_invalid", "Tool name is invalid or not cached.", "Run ae recommend, ae list, or ae detail and use a returned tool_name.");
|
|
71
|
+
}
|
|
72
|
+
return tool;
|
|
73
|
+
}
|
|
74
|
+
export function extractToolName(toolUrl) {
|
|
75
|
+
// tool_url 缺失时无法解析 tool_name。
|
|
76
|
+
if (!toolUrl) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
// 后端把 tool_name 放在 URL query 中,例如 ?tool_name=xxx。
|
|
81
|
+
const toolName = new URL(toolUrl).searchParams.get("tool_name");
|
|
82
|
+
// 空字符串也视为无效。
|
|
83
|
+
return toolName && toolName.trim() ? toolName : null;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// URL 格式不合法时,也返回 null,由调用方决定错误码。
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function toCachedTool(tool, cachedAt) {
|
|
91
|
+
// 本地不信任后端响应,必须先从 tool_url 解析 tool_name。
|
|
92
|
+
const toolName = extractToolName(tool.tool_url);
|
|
93
|
+
if (!toolName || !tool.tool_url) {
|
|
94
|
+
throw new CliError("tool_name_parse_failed", "Tool response is missing tool_name or tool_url.", "Retry later.");
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
tool_name: toolName,
|
|
98
|
+
tool_url: tool.tool_url,
|
|
99
|
+
description: tool.description,
|
|
100
|
+
when_to_use: tool.when_to_use,
|
|
101
|
+
credit: tool.credit,
|
|
102
|
+
input_schema: tool.input_schema,
|
|
103
|
+
cached_at: cachedAt
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function keepLatestToolByName(tools) {
|
|
107
|
+
const result = [];
|
|
108
|
+
for (const tool of tools) {
|
|
109
|
+
// 如果前面已经有同名工具,先删除旧的,再把新的放到末尾。
|
|
110
|
+
const existingIndex = result.findIndex((candidate) => candidate.tool_name === tool.tool_name);
|
|
111
|
+
if (existingIndex >= 0) {
|
|
112
|
+
result.splice(existingIndex, 1);
|
|
113
|
+
}
|
|
114
|
+
result.push(tool);
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
async function readStoreForWrite() {
|
|
119
|
+
try {
|
|
120
|
+
// 写入前读取旧缓存,以便合并旧记录和新记录。
|
|
121
|
+
const raw = await readFile(getSessionPath(), "utf8");
|
|
122
|
+
return normalizeStore(JSON.parse(raw));
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// 文件不存在、JSON 损坏、版本不匹配,都从空缓存开始。
|
|
126
|
+
return emptyStore();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async function readStoreForRead() {
|
|
130
|
+
try {
|
|
131
|
+
// 读取缓存用于 execute 查找。
|
|
132
|
+
const raw = await readFile(getSessionPath(), "utf8");
|
|
133
|
+
return normalizeStore(JSON.parse(raw));
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
// 没有缓存时返回空缓存,随后 readToolByName 会抛 tool_name_invalid。
|
|
137
|
+
return emptyStore();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function normalizeStore(value) {
|
|
141
|
+
// 只接受 version=3 且 tools 为数组的结构。
|
|
142
|
+
if (!isRecord(value) || value.version !== 3 || !Array.isArray(value.tools)) {
|
|
143
|
+
return emptyStore();
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
version: 3,
|
|
147
|
+
updated_at: typeof value.updated_at === "string" ? value.updated_at : new Date().toISOString(),
|
|
148
|
+
// 过滤掉不完整的工具记录,并再次裁剪到最大数量。
|
|
149
|
+
tools: value.tools.filter(isCachedTool).slice(-TOOL_CACHE_LIMIT)
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function emptyStore() {
|
|
153
|
+
// 空缓存也保持合法 v3 结构,方便调用方不用处理 null。
|
|
154
|
+
return {
|
|
155
|
+
version: 3,
|
|
156
|
+
updated_at: new Date().toISOString(),
|
|
157
|
+
tools: []
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function isCachedTool(value) {
|
|
161
|
+
// 读取缓存时也要防御损坏 session:字段类型正确还不够,
|
|
162
|
+
// tool_url 必须能重新解析出同一个 tool_name,否则 execute 可能请求错误 URL。
|
|
163
|
+
if (!isRecord(value)
|
|
164
|
+
|| typeof value.tool_name !== "string"
|
|
165
|
+
|| typeof value.tool_url !== "string"
|
|
166
|
+
|| typeof value.cached_at !== "string") {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
return extractToolName(value.tool_url) === value.tool_name;
|
|
170
|
+
}
|
|
171
|
+
function isRecord(value) {
|
|
172
|
+
// object 会包含数组,所以这里排除 Array。
|
|
173
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/storage/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type TelemetryEvent } from "../telemetry/events.js";
|
|
2
|
+
import { type ProtectSensitiveFileOptions } from "./fileProtection.js";
|
|
3
|
+
export interface EnqueueTelemetryOptions {
|
|
4
|
+
fileProtection?: ProtectSensitiveFileOptions;
|
|
5
|
+
}
|
|
6
|
+
export declare function enqueueTelemetry(event: TelemetryEvent, options?: EnqueueTelemetryOptions): Promise<void>;
|
|
7
|
+
export declare function protectTelemetryQueueFile(queuePath: string, options?: ProtectSensitiveFileOptions): Promise<void>;
|
|
8
|
+
export declare function readTelemetryQueue(limit?: number): Promise<TelemetryEvent[]>;
|
|
9
|
+
export interface TelemetryQueueBatch {
|
|
10
|
+
events: TelemetryEvent[];
|
|
11
|
+
consumedLineCount: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function readTelemetryQueueBatch(limit?: number): Promise<TelemetryQueueBatch>;
|
|
14
|
+
export declare function dropTelemetryQueueHead(count: number): Promise<void>;
|