@agentearth.ai/cli 0.1.0-beta.2 → 0.1.0-beta.3
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 +1 -1
- package/dist/commands/execute.js +24 -1
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/list.js +10 -0
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/login.js +14 -8
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/update.js +5 -0
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/updateCheck.js +20 -3
- package/dist/commands/updateCheck.js.map +1 -1
- package/dist/commands/updateHint.js +6 -4
- package/dist/commands/updateHint.js.map +1 -1
- package/dist/commands/updateNpm.js +7 -0
- package/dist/commands/updateNpm.js.map +1 -1
- package/dist/core/backendErrors.js +3 -0
- package/dist/core/backendErrors.js.map +1 -1
- package/dist/core/errors.js +3 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/hiddenInput.js +10 -0
- package/dist/core/hiddenInput.js.map +1 -1
- package/dist/core/http.d.ts +0 -1
- package/dist/core/http.js +14 -17
- package/dist/core/http.js.map +1 -1
- package/dist/core/output.js +3 -1
- package/dist/core/output.js.map +1 -1
- package/dist/storage/credentials.d.ts +5 -1
- package/dist/storage/credentials.js +18 -6
- package/dist/storage/credentials.js.map +1 -1
- package/dist/storage/fileProtection.js +4 -0
- package/dist/storage/fileProtection.js.map +1 -1
- package/dist/storage/paths.js +3 -0
- package/dist/storage/paths.js.map +1 -1
- package/dist/storage/session.js +91 -23
- package/dist/storage/session.js.map +1 -1
- package/dist/storage/telemetryQueue.js +6 -0
- package/dist/storage/telemetryQueue.js.map +1 -1
- package/dist/storage/telemetryUploadState.js +16 -0
- package/dist/storage/telemetryUploadState.js.map +1 -1
- package/dist/storage/updateCache.js +2 -2
- package/dist/telemetry/uploader.js +33 -1
- package/dist/telemetry/uploader.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -22,7 +22,7 @@ npm install -g @agentearth.ai/cli
|
|
|
22
22
|
ae login --api-key-stdin
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
`ae login --api-key-stdin` verifies the API key and saves it to the CLI credentials file. After login,
|
|
25
|
+
`ae login --api-key-stdin` verifies the API key and saves it to the CLI credentials file. After login, follow the CLI JSON output: `next_action` tells the agent what to do, and `skill.source_dir` points to the bundled AgentEarth skill directory to install into the current agent before calling tools.
|
|
26
26
|
|
|
27
27
|
`--api-key` and `AGENTEARTH_API_KEY` are supported for compatibility and debugging, but `--api-key-stdin` is the recommended install path because it avoids putting the key in command arguments.
|
|
28
28
|
|
package/dist/commands/execute.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* `{ params }`。这样 agent 不需要知道 tool_url、recommend_id 或其他内部细节。
|
|
7
7
|
*/
|
|
8
8
|
import { readFile, stat } from "node:fs/promises";
|
|
9
|
+
import { EXECUTE_PATH } from "../constants.js";
|
|
9
10
|
import { mapBackendError } from "../core/backendErrors.js";
|
|
10
11
|
import { CliError, usageError } from "../core/errors.js";
|
|
11
12
|
import { postJson } from "../core/http.js";
|
|
@@ -30,7 +31,8 @@ export async function runExecute(context, args) {
|
|
|
30
31
|
const tool = await readToolByName(toolName);
|
|
31
32
|
// 读取 API key;execute 请求必须鉴权。
|
|
32
33
|
const apiKey = await resolveApiKey(context.options);
|
|
33
|
-
//
|
|
34
|
+
// 保留“执行后端返回的完整 tool_url”的契约,但发送 X-Api-Key 前要先校验可信边界。
|
|
35
|
+
assertTrustedToolUrl(tool.tool_url, toolName, context.options.baseUrl);
|
|
34
36
|
const response = await postJson(tool.tool_url, { params }, {
|
|
35
37
|
apiKey,
|
|
36
38
|
baseUrl: context.options.baseUrl,
|
|
@@ -51,6 +53,27 @@ export async function runExecute(context, args) {
|
|
|
51
53
|
agentearth_suggestion: response.agentearth_suggestion
|
|
52
54
|
};
|
|
53
55
|
}
|
|
56
|
+
function assertTrustedToolUrl(toolUrl, toolName, baseUrl) {
|
|
57
|
+
let parsedToolUrl;
|
|
58
|
+
let parsedBaseUrl;
|
|
59
|
+
try {
|
|
60
|
+
parsedToolUrl = new URL(toolUrl);
|
|
61
|
+
parsedBaseUrl = new URL(baseUrl);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new CliError("backend_response_invalid", "Cached tool URL is invalid.", "Run ae recommend, ae list, or ae detail again.");
|
|
65
|
+
}
|
|
66
|
+
// 本地 mock 使用 http://127.0.0.1,线上 baseUrl 是 https;这里校验“与 baseUrl 一致”,而不是硬编码协议。
|
|
67
|
+
if (parsedToolUrl.protocol !== parsedBaseUrl.protocol
|
|
68
|
+
|| parsedToolUrl.origin !== parsedBaseUrl.origin
|
|
69
|
+
|| parsedToolUrl.pathname !== EXECUTE_PATH) {
|
|
70
|
+
throw new CliError("backend_response_invalid", "Cached tool URL is not trusted.", "Run ae recommend, ae list, or ae detail again.");
|
|
71
|
+
}
|
|
72
|
+
// origin/path 证明 URL 属于当前后端,tool_name 再证明缓存记录和 URL 指向的是同一个工具。
|
|
73
|
+
if (parsedToolUrl.searchParams.get("tool_name") !== toolName) {
|
|
74
|
+
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.");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
54
77
|
async function readParams(raw, toolName) {
|
|
55
78
|
try {
|
|
56
79
|
// 先按 inline/@file/stdin 三种形式取到 JSON 文本。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,qDAAqD;AACrD,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB,EAAE,IAAc;IACtE,wCAAwC;IACxC,uEAAuE;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1B,+CAA+C;IAC/C,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,UAAU,CAAC,uCAAuC,EAAE,0CAA0C,CAAC,CAAC;IACxG,CAAC;IAED,yCAAyC;IACzC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACrD,kEAAkE;IAClE,OAAO,CAAC,SAAS,CAAC,aAAa,GAAG,MAAM,CAAC;IACzC,iDAAiD;IACjD,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,6BAA6B;IAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpD
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/commands/execute.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/list.js
CHANGED
|
@@ -71,19 +71,24 @@ async function readListQueryText(raw) {
|
|
|
71
71
|
throw invalidListQueryError();
|
|
72
72
|
}
|
|
73
73
|
if (raw.startsWith("@")) {
|
|
74
|
+
// @query.json 表示从文件读取 JSON,适合避开 PowerShell inline JSON 转义问题。
|
|
74
75
|
return readListQueryFile(raw.slice(1));
|
|
75
76
|
}
|
|
76
77
|
if (raw === "-") {
|
|
78
|
+
// 单独的 - 表示从 stdin 读取,方便 agent 用管道把 JSON 传进来。
|
|
77
79
|
return readStdin();
|
|
78
80
|
}
|
|
81
|
+
// 其他情况按 inline JSON 字符串处理。
|
|
79
82
|
return raw;
|
|
80
83
|
}
|
|
81
84
|
async function readListQueryFile(filePath) {
|
|
82
85
|
try {
|
|
86
|
+
// 先 stat 看文件大小,避免把超大文件读进内存。
|
|
83
87
|
const fileStat = await stat(filePath);
|
|
84
88
|
if (fileStat.size > MAX_LIST_QUERY_BYTES) {
|
|
85
89
|
throw invalidListQueryError();
|
|
86
90
|
}
|
|
91
|
+
// 通过大小检查后再按 UTF-8 读取文件内容。
|
|
87
92
|
return await readFile(filePath, "utf8");
|
|
88
93
|
}
|
|
89
94
|
catch (error) {
|
|
@@ -97,8 +102,11 @@ async function readStdin() {
|
|
|
97
102
|
const chunks = [];
|
|
98
103
|
let totalBytes = 0;
|
|
99
104
|
try {
|
|
105
|
+
// process.stdin 是异步可迭代对象;for await 会一块一块读取用户输入。
|
|
100
106
|
for await (const chunk of process.stdin) {
|
|
107
|
+
// stdin chunk 在 Node 里通常是 Buffer;这里兼容字符串 chunk。
|
|
101
108
|
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
109
|
+
// 边读边累计大小,超过上限立刻报 usage_error。
|
|
102
110
|
totalBytes += buffer.byteLength;
|
|
103
111
|
if (totalBytes > MAX_LIST_QUERY_BYTES) {
|
|
104
112
|
throw invalidListQueryError();
|
|
@@ -112,6 +120,7 @@ async function readStdin() {
|
|
|
112
120
|
}
|
|
113
121
|
throw invalidListQueryError();
|
|
114
122
|
}
|
|
123
|
+
// Buffer.concat 把多块 stdin 拼回完整文本,再按 UTF-8 转成字符串。
|
|
115
124
|
return Buffer.concat(chunks).toString("utf8");
|
|
116
125
|
}
|
|
117
126
|
function parseListQuery(raw) {
|
|
@@ -128,6 +137,7 @@ function parseListQuery(raw) {
|
|
|
128
137
|
throw usageError("List query must be a JSON object.", "Run ae list @query.json.");
|
|
129
138
|
}
|
|
130
139
|
const query = {};
|
|
140
|
+
// Object.entries 会把对象变成 [key, value] 列表,方便逐字段校验。
|
|
131
141
|
for (const [key, fieldValue] of Object.entries(value)) {
|
|
132
142
|
// 为了避免复杂对象序列化歧义,只允许一层 string/number/boolean。
|
|
133
143
|
if (typeof fieldValue !== "string"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* 1. 从 `--api-key-stdin`、`--api-key`、`AGENTEARTH_API_KEY` 或 TTY 隐藏输入读取 API key;
|
|
6
6
|
* 2. 调用 recommend 接口做一次轻量验证;
|
|
7
7
|
* 3. 验证成功后,把 key 写入本机 credentials.json。
|
|
8
|
-
* 4. 输出 npm 包内置 skill
|
|
8
|
+
* 4. 输出 npm 包内置 skill 的安装任务单,让 agent 知道如何安装当前 agent skill。
|
|
9
9
|
*
|
|
10
10
|
* 注意:这里不生成普通 config,也不生成机器身份 ID。后续命令会自动读取
|
|
11
11
|
* credentials.json,agent 不需要每次自己携带 API key。
|
|
@@ -18,8 +18,8 @@ import { readHiddenInput } from "../core/hiddenInput.js";
|
|
|
18
18
|
import { postJson } from "../core/http.js";
|
|
19
19
|
import { resolveLoginApiKey, writeCredentials } from "../storage/credentials.js";
|
|
20
20
|
// 编译后本文件位于 dist/commands/login.js,向上两级就是 npm 包根目录。
|
|
21
|
-
// skill
|
|
22
|
-
const
|
|
21
|
+
// skill 目录不复制进 dist,而是作为 package files 中的独立资源发布。
|
|
22
|
+
const SKILL_SOURCE_DIR = fileURLToPath(new URL("../../skills/agentearth", import.meta.url));
|
|
23
23
|
export async function runLogin(context) {
|
|
24
24
|
// login 不读旧 credentials,必须拿到本次传入的新 key。
|
|
25
25
|
const apiKey = await resolveLoginApiKeyForLogin(context);
|
|
@@ -43,16 +43,22 @@ export async function runLogin(context) {
|
|
|
43
43
|
// credentials 写失败是后端看不到的本地错误,需要用专门错误码。
|
|
44
44
|
throw new CliError("credentials_write_failed", "Failed to write local credentials.", "Check write permission for AgentEarth credentials directory.");
|
|
45
45
|
}
|
|
46
|
-
// 成功输出不包含 key
|
|
46
|
+
// 成功输出不包含 key,只返回 agent 安装当前 skill 所需的结构化任务单。
|
|
47
47
|
return {
|
|
48
48
|
version: CLI_VERSION,
|
|
49
|
+
next_action: "install_agent_skill",
|
|
49
50
|
skill: {
|
|
50
51
|
required: true,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
name: "agentearth",
|
|
53
|
+
source_dir: SKILL_SOURCE_DIR,
|
|
54
|
+
entry_file: "SKILL.md",
|
|
55
|
+
install_scope: "current_agent_only",
|
|
56
|
+
instructions: [
|
|
57
|
+
"Copy the entire source_dir directory into the current agent skills directory as agentearth.",
|
|
58
|
+
"Verify that agentearth/SKILL.md exists in the target skills directory.",
|
|
59
|
+
"Follow the current agent's restart or reload requirements before using the skill."
|
|
60
|
+
]
|
|
54
61
|
},
|
|
55
|
-
next: "Install the skill, then run ae list or ae recommend.",
|
|
56
62
|
message: "AgentEarth CLI login succeeded."
|
|
57
63
|
};
|
|
58
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAIjF,mDAAmD;AACnD,iDAAiD;AACjD,MAAM,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/update.js
CHANGED
|
@@ -19,6 +19,7 @@ export async function runUpdate(context) {
|
|
|
19
19
|
throw new CliError("version_check_failed", "npm registry version check failed.", "Retry later or check npm registry/network access.");
|
|
20
20
|
}
|
|
21
21
|
if (!cache.has_update) {
|
|
22
|
+
// 没有新版本也是一次成功的 update 命令,埋点里记录 no_update。
|
|
22
23
|
context.telemetry.updateResult = "no_update";
|
|
23
24
|
return {
|
|
24
25
|
updated: false,
|
|
@@ -44,13 +45,16 @@ export async function runUpdate(context) {
|
|
|
44
45
|
throw new CliError("update_verify_failed", "Updated CLI version could not be verified.", "Run ae --version and check that the updated ae command is on PATH.");
|
|
45
46
|
}
|
|
46
47
|
if (updatedVersion === CLI_VERSION) {
|
|
48
|
+
// npm install 成功但版本没变,通常是 PATH 指向了另一份 ae,或者全局安装位置不一致。
|
|
47
49
|
context.telemetry.updateResult = "failed";
|
|
48
50
|
throw new CliError("update_not_applied", "Update command completed but CLI version did not change.", "There may be multiple ae installations. Check PATH and npm global prefix.");
|
|
49
51
|
}
|
|
50
52
|
if (updatedVersion !== cache.latest_version) {
|
|
53
|
+
// 版本变了但不是缓存里的 latest,说明 registry/cache/PATH 之间存在不一致,不能报告 updated=true。
|
|
51
54
|
context.telemetry.updateResult = "failed";
|
|
52
55
|
throw new CliError("update_verify_failed", "Updated CLI version does not match the expected latest version.", "Run ae update again after refreshing the version cache.");
|
|
53
56
|
}
|
|
57
|
+
// 走到这里才说明 npm 安装和 ae --version 双重验证都通过。
|
|
54
58
|
context.telemetry.updateResult = "updated";
|
|
55
59
|
const result = {
|
|
56
60
|
updated: true,
|
|
@@ -58,6 +62,7 @@ export async function runUpdate(context) {
|
|
|
58
62
|
to_version: updatedVersion,
|
|
59
63
|
duration_ms: Date.now() - startedAt
|
|
60
64
|
};
|
|
65
|
+
// release_notes 是可选字段;只有缓存里确实是数组且非空时才输出。
|
|
61
66
|
const releaseNotes = Array.isArray(cache.release_notes) ? cache.release_notes : [];
|
|
62
67
|
if (releaseNotes.length > 0) {
|
|
63
68
|
result.release_notes = releaseNotes;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* npm registry 版本检查模块。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* 主动 npm 查询只属于 ae update。工具发现命令只读取 fresh update-cache,
|
|
5
|
+
* 不通过这里刷新 registry,避免 recommend/list 被 npm、代理或网络拖慢。
|
|
6
|
+
* ae update 会把检查失败映射成稳定 version_check_failed。
|
|
7
7
|
*/
|
|
8
8
|
import { CLI_VERSION, UPDATE_COMMAND_TEXT } from "../constants.js";
|
|
9
9
|
import { CliError } from "../core/errors.js";
|
|
10
10
|
import { readUpdateCache, writeUpdateCache } from "../storage/updateCache.js";
|
|
11
11
|
import { buildNpmViewVersionCommand, runProcess } from "./updateNpm.js";
|
|
12
12
|
export async function readOrRefreshUpdateCache(options = {}) {
|
|
13
|
+
// 第一优先级永远是 fresh cache,避免每次 list/recommend 都联网查 npm。
|
|
13
14
|
const cache = await readUpdateCache();
|
|
14
15
|
if (cache) {
|
|
15
16
|
return cache;
|
|
16
17
|
}
|
|
18
|
+
// env 默认使用真实 process.env;测试可以传入假的 env 控制 AE_SKIP_UPDATE_CHECK。
|
|
17
19
|
const env = options.env ?? process.env;
|
|
18
20
|
if (isUpdateCheckSkipped(env) && !options.throwOnFailure) {
|
|
21
|
+
// 后台提示可以跳过检查;返回 null 表示“本轮没有可用更新信息”,不是命令失败。
|
|
19
22
|
return null;
|
|
20
23
|
}
|
|
21
24
|
try {
|
|
@@ -23,14 +26,19 @@ export async function readOrRefreshUpdateCache(options = {}) {
|
|
|
23
26
|
}
|
|
24
27
|
catch (error) {
|
|
25
28
|
if (options.throwOnFailure) {
|
|
29
|
+
// ae update 是显式更新命令,必须把检查失败暴露给用户。
|
|
26
30
|
throw error;
|
|
27
31
|
}
|
|
32
|
+
// list/recommend 的后台提示失败不能打断主命令,所以降级成 null。
|
|
28
33
|
return null;
|
|
29
34
|
}
|
|
30
35
|
}
|
|
31
36
|
export async function refreshUpdateCacheFromNpm(env = process.env) {
|
|
37
|
+
// npm registry 是当前唯一版本来源;这里不查后端,也不查 GitHub release。
|
|
32
38
|
const latestVersion = await readLatestVersionFromNpm(env);
|
|
39
|
+
// compareVersions 返回 1 表示 registry 版本比当前 CLI 新。
|
|
33
40
|
const hasUpdate = compareVersions(latestVersion, CLI_VERSION) > 0;
|
|
41
|
+
// 把检查结果落到缓存,后续 list/recommend 可以直接读取,不必频繁访问 npm。
|
|
34
42
|
return writeUpdateCache({
|
|
35
43
|
current_version: CLI_VERSION,
|
|
36
44
|
latest_version: latestVersion,
|
|
@@ -42,11 +50,14 @@ export async function refreshUpdateCacheFromNpm(env = process.env) {
|
|
|
42
50
|
});
|
|
43
51
|
}
|
|
44
52
|
export async function readLatestVersionFromNpm(env = process.env) {
|
|
53
|
+
// buildNpmViewVersionCommand 会按平台选择 npm/npm.cmd。
|
|
45
54
|
const command = buildNpmViewVersionCommand();
|
|
55
|
+
// runProcess 只负责执行外部 npm 命令;这里根据退出码决定是否可信。
|
|
46
56
|
const result = await runProcess(command.command, command.args, env);
|
|
47
57
|
if (result.exitCode !== 0) {
|
|
48
58
|
throw versionCheckFailed();
|
|
49
59
|
}
|
|
60
|
+
// npm stdout 必须能解析出合法版本号,否则按 registry 查询失败处理。
|
|
50
61
|
const version = parseNpmViewVersionOutput(result.stdout);
|
|
51
62
|
if (!version) {
|
|
52
63
|
throw versionCheckFailed();
|
|
@@ -54,6 +65,7 @@ export async function readLatestVersionFromNpm(env = process.env) {
|
|
|
54
65
|
return version;
|
|
55
66
|
}
|
|
56
67
|
export function parseNpmViewVersionOutput(stdout) {
|
|
68
|
+
// npm view ... --json 正常输出是一个 JSON 字符串,例如 "0.1.0"。
|
|
57
69
|
try {
|
|
58
70
|
const parsed = JSON.parse(stdout.trim());
|
|
59
71
|
if (typeof parsed === "string" && isVersionString(parsed)) {
|
|
@@ -66,11 +78,13 @@ export function parseNpmViewVersionOutput(stdout) {
|
|
|
66
78
|
}
|
|
67
79
|
}
|
|
68
80
|
export function compareVersions(left, right) {
|
|
81
|
+
// 当前只比较 major/minor/patch 三段数字;预发布后缀不会影响三段比较。
|
|
69
82
|
const leftParts = parseVersionParts(left);
|
|
70
83
|
const rightParts = parseVersionParts(right);
|
|
71
84
|
if (!leftParts || !rightParts) {
|
|
72
85
|
return 0;
|
|
73
86
|
}
|
|
87
|
+
// 依次比较 major、minor、patch;任意一段分出大小后就可以返回。
|
|
74
88
|
for (let index = 0; index < 3; index += 1) {
|
|
75
89
|
if (leftParts[index] > rightParts[index])
|
|
76
90
|
return 1;
|
|
@@ -80,12 +94,15 @@ export function compareVersions(left, right) {
|
|
|
80
94
|
return 0;
|
|
81
95
|
}
|
|
82
96
|
function isUpdateCheckSkipped(env) {
|
|
97
|
+
// 这个环境变量主要给测试和离线调试使用;ae update 自身会忽略它并要求检查失败时抛错。
|
|
83
98
|
return env.AE_SKIP_UPDATE_CHECK === "1" || env.AE_SKIP_UPDATE_CHECK === "true";
|
|
84
99
|
}
|
|
85
100
|
function isVersionString(value) {
|
|
101
|
+
// 允许 1.2.3、1.2.3-beta.1、1.2.3+build 这类 npm 常见版本字符串。
|
|
86
102
|
return /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/u.test(value);
|
|
87
103
|
}
|
|
88
104
|
function parseVersionParts(value) {
|
|
105
|
+
// 只截取开头三段数字,后面的 -beta.1 或 +build 不进入大小比较。
|
|
89
106
|
const match = /^(\d+)\.(\d+)\.(\d+)/u.exec(value);
|
|
90
107
|
if (!match) {
|
|
91
108
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateCheck.js","sourceRoot":"","sources":["../../src/commands/updateCheck.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"updateCheck.js","sourceRoot":"","sources":["../../src/commands/updateCheck.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 工具发现阶段的更新提示 helper。
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* npm registry
|
|
4
|
+
* 这里只消费 fresh update-cache,不主动执行 npm view。
|
|
5
|
+
* npm registry 查询只属于 ae update,避免工具发现主流程被 npm、代理或网络拖慢。
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { readUpdateCache } from "../storage/updateCache.js";
|
|
8
8
|
export async function readUpdateHint() {
|
|
9
|
-
|
|
9
|
+
// list/recommend 调用它时只读取本地 fresh cache;没有缓存就不输出 update 字段。
|
|
10
|
+
const cache = await readUpdateCache();
|
|
10
11
|
if (!cache || !cache.has_update) {
|
|
11
12
|
return undefined;
|
|
12
13
|
}
|
|
14
|
+
// 输出给 agent 的 command 固定是 ae update,不暴露 npm install 细节。
|
|
13
15
|
const hint = {
|
|
14
16
|
has_update: true,
|
|
15
17
|
current_version: cache.current_version,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateHint.js","sourceRoot":"","sources":["../../src/commands/updateHint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"updateHint.js","sourceRoot":"","sources":["../../src/commands/updateHint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAW5D,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,2DAA2D;IAC3D,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,wDAAwD;IACxD,MAAM,IAAI,GAAe;QACvB,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,qCAAqC;QAC/D,OAAO,EAAE,WAAW;KACrB,CAAC;IACF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzE,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -9,24 +9,28 @@ import { spawn } from "node:child_process";
|
|
|
9
9
|
import { platform as currentPlatform } from "node:os";
|
|
10
10
|
import { PACKAGE_NAME } from "../constants.js";
|
|
11
11
|
export function buildNpmViewVersionCommand(platform = currentPlatform()) {
|
|
12
|
+
// npm view 只读取 registry 元数据,不安装包。
|
|
12
13
|
return {
|
|
13
14
|
command: platform === "win32" ? "npm.cmd" : "npm",
|
|
14
15
|
args: ["view", PACKAGE_NAME, "version", "--json"]
|
|
15
16
|
};
|
|
16
17
|
}
|
|
17
18
|
export function buildNpmInstallLatestCommand(platform = currentPlatform()) {
|
|
19
|
+
// 当前产品没有 beta 用户通道,ae update 固定安装 latest。
|
|
18
20
|
return {
|
|
19
21
|
command: platform === "win32" ? "npm.cmd" : "npm",
|
|
20
22
|
args: ["install", "-g", `${PACKAGE_NAME}@latest`]
|
|
21
23
|
};
|
|
22
24
|
}
|
|
23
25
|
export function buildCliVersionCommand(platform = currentPlatform()) {
|
|
26
|
+
// 安装完成后重新调用 ae --version,验证 PATH 上实际生效的是新版本。
|
|
24
27
|
return {
|
|
25
28
|
command: platform === "win32" ? "ae.cmd" : "ae",
|
|
26
29
|
args: ["--version"]
|
|
27
30
|
};
|
|
28
31
|
}
|
|
29
32
|
export async function runProcess(command, args, env = process.env) {
|
|
33
|
+
// spawn 是 Node 创建子进程的 API;这里包成 Promise,方便 update.ts 用 await 编排。
|
|
30
34
|
return new Promise((resolve) => {
|
|
31
35
|
let stdout = "";
|
|
32
36
|
let stderr = "";
|
|
@@ -37,6 +41,7 @@ export async function runProcess(command, args, env = process.env) {
|
|
|
37
41
|
windowsHide: true,
|
|
38
42
|
stdio: ["ignore", "pipe", "pipe"]
|
|
39
43
|
});
|
|
44
|
+
// stdout/stderr 都按流分块到达,所以要逐块拼接。
|
|
40
45
|
child.stdout.on("data", (chunk) => {
|
|
41
46
|
stdout += chunk.toString();
|
|
42
47
|
});
|
|
@@ -44,6 +49,7 @@ export async function runProcess(command, args, env = process.env) {
|
|
|
44
49
|
stderr += chunk.toString();
|
|
45
50
|
});
|
|
46
51
|
child.on("error", (error) => {
|
|
52
|
+
// 无法启动子进程,例如 npm 不在 PATH 上。
|
|
47
53
|
resolve({ exitCode: -1, stdout, stderr: error.message });
|
|
48
54
|
});
|
|
49
55
|
child.on("close", (code) => {
|
|
@@ -56,6 +62,7 @@ function commandLine(command, args) {
|
|
|
56
62
|
return [command, ...args].map(quoteCmdArg).join(" ");
|
|
57
63
|
}
|
|
58
64
|
function quoteCmdArg(value) {
|
|
65
|
+
// cmd.exe 中包含空格或双引号的参数需要包一层双引号。
|
|
59
66
|
if (!/[\s"]/u.test(value)) {
|
|
60
67
|
return value;
|
|
61
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateNpm.js","sourceRoot":"","sources":["../../src/commands/updateNpm.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"updateNpm.js","sourceRoot":"","sources":["../../src/commands/updateNpm.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { CliError } from "./errors.js";
|
|
9
9
|
export function mapBackendError(operation, errorMsg) {
|
|
10
|
+
// 命令模块在发现 error_no 非 0 时进入这里,把后端自由文本收敛成 CLI 稳定错误码。
|
|
10
11
|
// 后端错误文案可能为空,先兜底成空字符串,再统一转小写,方便 includes 判断。
|
|
11
12
|
const normalized = (errorMsg ?? "").toLowerCase();
|
|
12
13
|
// 鉴权错误在所有接口里含义一致:key 不可用,需要重新 login。
|
|
@@ -33,10 +34,12 @@ export function mapBackendError(operation, errorMsg) {
|
|
|
33
34
|
return backendVisibleError("backend_error", "Backend returned an error.", "Retry later.");
|
|
34
35
|
}
|
|
35
36
|
function backendVisibleError(code, message, hint) {
|
|
37
|
+
// 这里集中创建 telemetryEligible=false 的错误,避免各分支忘记关闭重复埋点。
|
|
36
38
|
// 这些错误来自后端 error_no/error_msg,后端业务日志已经可见,CLI 不重复上传。
|
|
37
39
|
return new CliError(code, message, hint, 1, { telemetryEligible: false });
|
|
38
40
|
}
|
|
39
41
|
function isAuthError(message) {
|
|
42
|
+
// 这里用 includes 而不是精确等于,是为了兼容后端包裹前缀、英文句子或网关文案。
|
|
40
43
|
// 兼容后端可能返回的几种 key 无效/无权限表达。
|
|
41
44
|
return message.includes("invalid_api_key")
|
|
42
45
|
|| message.includes("x-api-key has expired")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backendErrors.js","sourceRoot":"","sources":["../../src/core/backendErrors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"backendErrors.js","sourceRoot":"","sources":["../../src/core/backendErrors.ts"],"names":[],"mappings":"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"}
|
package/dist/core/errors.js
CHANGED
|
@@ -15,6 +15,7 @@ export class CliError extends Error {
|
|
|
15
15
|
// 是否允许作为 CLI 本地埋点上传;后端已经可见的错误会显式置为 false。
|
|
16
16
|
telemetryEligible;
|
|
17
17
|
constructor(code, message, hint, exitCode = 1, options = {}) {
|
|
18
|
+
// 构造函数把“机器可读的 code”和“人/agent 可读的 message/hint”绑在一起。
|
|
18
19
|
// 调用父类 Error,让错误对象拥有 message 和 stack。
|
|
19
20
|
super(message);
|
|
20
21
|
// 设置 name,方便调试时看出这是项目自定义错误。
|
|
@@ -22,6 +23,7 @@ export class CliError extends Error {
|
|
|
22
23
|
this.code = code;
|
|
23
24
|
this.hint = hint;
|
|
24
25
|
this.exitCode = exitCode;
|
|
26
|
+
// 默认认为本地错误需要埋点;后端可见错误由创建方显式传 telemetryEligible=false。
|
|
25
27
|
this.telemetryEligible = options.telemetryEligible ?? true;
|
|
26
28
|
}
|
|
27
29
|
}
|
|
@@ -30,6 +32,7 @@ export function usageError(message, hint = "Run ae --help.") {
|
|
|
30
32
|
return new CliError("usage_error", message, hint, 2);
|
|
31
33
|
}
|
|
32
34
|
export function normalizeUnknownError(error) {
|
|
35
|
+
// main.ts 的 catch 会调用这里,所以这个函数是所有未知异常的最后一道稳定输出防线。
|
|
33
36
|
// 如果本来就是 CliError,说明上游已经完成归因,直接返回即可。
|
|
34
37
|
if (error instanceof CliError) {
|
|
35
38
|
return error;
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmDH,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,yBAAyB;IAChB,IAAI,CAAY;IACzB,6BAA6B;IACpB,IAAI,CAAS;IACtB,oCAAoC;IAC3B,QAAQ,CAAS;IAC1B,0CAA0C;IACjC,iBAAiB,CAAU;IAEpC,YAAY,IAAe,EAAE,OAAe,EAAE,IAAY,EAAE,QAAQ,GAAG,CAAC,EAAE,UAA2B,EAAE;QACrG,oDAAoD;QACpD,sCAAsC;QACtC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,4BAA4B;QAC5B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,sDAAsD;QACtD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,IAAI,GAAG,gBAAgB;IACjE,0BAA0B;IAC1B,OAAO,IAAI,QAAQ,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,kDAAkD;IAClD,qCAAqC;IACrC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gDAAgD;IAChD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;IAC3E,CAAC;IAED,4CAA4C;IAC5C,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,yBAAyB,CAAC,CAAC;AAC3E,CAAC"}
|
package/dist/core/hiddenInput.js
CHANGED
|
@@ -9,11 +9,15 @@ import { emitKeypressEvents } from "node:readline";
|
|
|
9
9
|
import { CliError } from "./errors.js";
|
|
10
10
|
export async function readHiddenInput(promptText, input = process.stdin, output = process.stderr) {
|
|
11
11
|
// 非 TTY 场景通常是 agent/脚本调用,不能阻塞等待人工输入。
|
|
12
|
+
// isTTY 表示“这个流连接的是终端窗口”;如果 stdin 来自管道或文件,这里会是 false。
|
|
13
|
+
// setRawMode 是 Node 终端输入的低层能力;没有它就无法做到逐键读取且不回显。
|
|
12
14
|
if (!input.isTTY || !output.isTTY || typeof input.setRawMode !== "function") {
|
|
13
15
|
throw new CliError("auth_missing", "Interactive API key prompt requires a TTY.", "Pipe the API key into ae login --api-key-stdin.");
|
|
14
16
|
}
|
|
15
17
|
return new Promise((resolve, reject) => {
|
|
18
|
+
// value 是用户已经输入但尚未提交的 API key。
|
|
16
19
|
let value = "";
|
|
20
|
+
// 如果进入本函数前终端已经处于 raw mode,退出时需要恢复成原状态。
|
|
17
21
|
const previousRawMode = input.isRaw === true;
|
|
18
22
|
const cleanup = (writeNewline) => {
|
|
19
23
|
// 无论成功、取消还是异常,都恢复进入前的 raw mode。
|
|
@@ -24,16 +28,19 @@ export async function readHiddenInput(promptText, input = process.stdin, output
|
|
|
24
28
|
}
|
|
25
29
|
};
|
|
26
30
|
const onKeypress = (character, key = {}) => {
|
|
31
|
+
// Ctrl+C 代表用户取消输入。这里抛 auth_missing,而不是让进程直接异常退出。
|
|
27
32
|
if (key.ctrl && key.name === "c") {
|
|
28
33
|
cleanup(true);
|
|
29
34
|
reject(new CliError("auth_missing", "API key input cancelled.", "Pipe the API key into ae login --api-key-stdin."));
|
|
30
35
|
return;
|
|
31
36
|
}
|
|
37
|
+
// Enter/Return 表示输入结束,此时把当前 value 交给调用方。
|
|
32
38
|
if (key.name === "return" || key.name === "enter") {
|
|
33
39
|
cleanup(true);
|
|
34
40
|
resolve(value);
|
|
35
41
|
return;
|
|
36
42
|
}
|
|
43
|
+
// Backspace 只影响内存里的 value,不在终端里删除字符,因为输入本来就没有回显。
|
|
37
44
|
if (key.name === "backspace") {
|
|
38
45
|
value = value.slice(0, -1);
|
|
39
46
|
return;
|
|
@@ -43,9 +50,12 @@ export async function readHiddenInput(promptText, input = process.stdin, output
|
|
|
43
50
|
value += character;
|
|
44
51
|
}
|
|
45
52
|
};
|
|
53
|
+
// 先输出提示语,再启用 keypress 事件和 raw mode。
|
|
54
|
+
// raw mode 下,终端会把每个按键立即交给程序,而不是等用户按 Enter。
|
|
46
55
|
output.write(promptText);
|
|
47
56
|
emitKeypressEvents(input);
|
|
48
57
|
input.setRawMode(true);
|
|
58
|
+
// resume 让 stdin 从暂停状态开始发事件;否则 keypress 监听器可能收不到输入。
|
|
49
59
|
input.resume();
|
|
50
60
|
input.on("keypress", onKeypress);
|
|
51
61
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hiddenInput.js","sourceRoot":"","sources":["../../src/core/hiddenInput.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAsBvC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,QAAQ,OAAO,CAAC,KAA0B,EAC1C,SAAS,OAAO,CAAC,MAA4B;IAE7C,qCAAqC;IACrC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5E,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,4CAA4C,EAAE,iDAAiD,CAAC,CAAC;IACtI,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;QAE7C,MAAM,OAAO,GAAG,CAAC,YAAqB,EAAQ,EAAE;YAC9C,gCAAgC;YAChC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAClC,KAAK,CAAC,UAAU,EAAE,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAE,MAAoB,EAAE,EAAQ,EAAE;YACrE,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,EAAE,0BAA0B,EAAE,iDAAiD,CAAC,CAAC,CAAC;gBACpH,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,8BAA8B;YAC9B,IAAI,SAAS,IAAI,SAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC5D,KAAK,IAAI,SAAS,CAAC;YACrB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzB,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"hiddenInput.js","sourceRoot":"","sources":["../../src/core/hiddenInput.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAsBvC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,QAAQ,OAAO,CAAC,KAA0B,EAC1C,SAAS,OAAO,CAAC,MAA4B;IAE7C,qCAAqC;IACrC,qDAAqD;IACrD,gDAAgD;IAChD,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5E,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,4CAA4C,EAAE,iDAAiD,CAAC,CAAC;IACtI,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,+BAA+B;QAC/B,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,uCAAuC;QACvC,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;QAE7C,MAAM,OAAO,GAAG,CAAC,YAAqB,EAAQ,EAAE;YAC9C,gCAAgC;YAChC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAClC,KAAK,CAAC,UAAU,EAAE,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAE,MAAoB,EAAE,EAAQ,EAAE;YACrE,iDAAiD;YACjD,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,CAAC,IAAI,QAAQ,CAAC,cAAc,EAAE,0BAA0B,EAAE,iDAAiD,CAAC,CAAC,CAAC;gBACpH,OAAO;YACT,CAAC;YAED,yCAAyC;YACzC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClD,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO;YACT,CAAC;YAED,iDAAiD;YACjD,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,8BAA8B;YAC9B,IAAI,SAAS,IAAI,SAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAC5D,KAAK,IAAI,SAAS,CAAC;YACrB,CAAC;QACH,CAAC,CAAC;QAEF,oCAAoC;QACpC,2CAA2C;QAC3C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzB,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC1B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,oDAAoD;QACpD,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/core/http.d.ts
CHANGED
|
@@ -5,7 +5,6 @@ export interface HttpOptions {
|
|
|
5
5
|
}
|
|
6
6
|
export type QueryValue = string | number | boolean;
|
|
7
7
|
export declare function postJson<TResponse>(pathOrUrl: string, body: unknown, options: HttpOptions): Promise<TResponse>;
|
|
8
|
-
export declare function postJsonNoResponse(pathOrUrl: string, body: unknown, options: HttpOptions): Promise<void>;
|
|
9
8
|
export type TelemetryPostResult = {
|
|
10
9
|
kind: "success";
|
|
11
10
|
status: number;
|