@keruyun/agent-cli 1.4.8 → 1.4.9-beta.1
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/binaries.json +28 -28
- package/install.cjs +62 -8
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ npm i @keruyun/agent-cli@latest -g --registry=https://registry.npmmirror.com
|
|
|
19
19
|
| --- | --- |
|
|
20
20
|
| darwin-arm64 | 65.8 MB |
|
|
21
21
|
| darwin-x64(baseline 变体,兼容无 AVX2 的老 CPU) | 71.22 MB |
|
|
22
|
-
| linux-x64 | 95.
|
|
22
|
+
| linux-x64 | 95.46 MB |
|
|
23
23
|
| linux-arm64 | 94.6 MB |
|
|
24
24
|
| linux-x64-musl | 92.19 MB |
|
|
25
25
|
| win32-x64 | 99.16 MB |
|
package/binaries.json
CHANGED
|
@@ -1,47 +1,47 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.4.
|
|
2
|
+
"version": "1.4.9-beta.1",
|
|
3
3
|
"targets": {
|
|
4
4
|
"darwin-arm64": {
|
|
5
|
-
"url": "https://s.koubei.com/
|
|
6
|
-
"sha256": "
|
|
7
|
-
"brSha256": "
|
|
8
|
-
"brBytes":
|
|
5
|
+
"url": "https://s.koubei.com/xZ47BW3nWsjtGkQjBfy7pp45pNC7pzrh.br",
|
|
6
|
+
"sha256": "ea54eeaa4a50d423dbc87456adf4bd6d108958285ecd96201ef304b0f284b192",
|
|
7
|
+
"brSha256": "02408b29d366da078272a958b06c7cd1c61c10b2c9c1df6949f3c36f51323b57",
|
|
8
|
+
"brBytes": 19913010,
|
|
9
9
|
"bytes": 68994146
|
|
10
10
|
},
|
|
11
11
|
"darwin-x64": {
|
|
12
|
-
"url": "https://s.koubei.com/
|
|
13
|
-
"sha256": "
|
|
14
|
-
"brSha256": "
|
|
15
|
-
"brBytes":
|
|
12
|
+
"url": "https://s.koubei.com/dMxXaTxbXQb28EHG3z8DJ7m4RjjCeNdY.br",
|
|
13
|
+
"sha256": "1b6873e2b59985620a7de3f22e682eda8b01ff90aae850d2d0c1c1e3a10d634f",
|
|
14
|
+
"brSha256": "74e3726f5b99b428b9545a841f9d1db98126b407aa8a4657d534a78468cda645",
|
|
15
|
+
"brBytes": 22341831,
|
|
16
16
|
"bytes": 74678352
|
|
17
17
|
},
|
|
18
18
|
"linux-x64": {
|
|
19
|
-
"url": "https://s.koubei.com/
|
|
20
|
-
"sha256": "
|
|
21
|
-
"brSha256": "
|
|
22
|
-
"brBytes":
|
|
23
|
-
"bytes":
|
|
19
|
+
"url": "https://s.koubei.com/rtYZ7T83GkwkHQ8MatYRT8zK6yx8czNC.br",
|
|
20
|
+
"sha256": "b3bfadcb99c7eaefa955c854f641db9608fe5208292141252c429de7d728f20e",
|
|
21
|
+
"brSha256": "a2774175737722c3fc2eac6b56cd74d2b56b4b1abb8e238b96af29eba422139c",
|
|
22
|
+
"brBytes": 30768610,
|
|
23
|
+
"bytes": 100092032
|
|
24
24
|
},
|
|
25
25
|
"linux-arm64": {
|
|
26
|
-
"url": "https://s.koubei.com/
|
|
27
|
-
"sha256": "
|
|
28
|
-
"brSha256": "
|
|
29
|
-
"brBytes":
|
|
26
|
+
"url": "https://s.koubei.com/6aHQQKZSrTXpQ2X7F3HCXKdXn4D2CfGt.br",
|
|
27
|
+
"sha256": "2534df281a28b621bd1607a5eefd497861154e7fa1e99fd9d6135c6bd56a61a2",
|
|
28
|
+
"brSha256": "466fbb3e8d1ee58e27463ed6643b573f79bd177372cedb3c3771ea6a194d3303",
|
|
29
|
+
"brBytes": 30161390,
|
|
30
30
|
"bytes": 99199120
|
|
31
31
|
},
|
|
32
32
|
"linux-x64-musl": {
|
|
33
|
-
"url": "https://s.koubei.com/
|
|
34
|
-
"sha256": "
|
|
35
|
-
"brSha256": "
|
|
36
|
-
"brBytes":
|
|
37
|
-
"bytes":
|
|
33
|
+
"url": "https://s.koubei.com/mQCj5F3peG2JKry8MXhN6jPwXd3AJAJc.br",
|
|
34
|
+
"sha256": "a35aaea159f9d1c7ceb71180970c0f247e42ba356fe465a0af4fe0f26c65d3ad",
|
|
35
|
+
"brSha256": "2a247198216385bed35d64b365417584f78909626462b6a2f47fda4680cf26ed",
|
|
36
|
+
"brBytes": 29962204,
|
|
37
|
+
"bytes": 96672032
|
|
38
38
|
},
|
|
39
39
|
"win32-x64": {
|
|
40
|
-
"url": "https://s.koubei.com/
|
|
41
|
-
"sha256": "
|
|
42
|
-
"brSha256": "
|
|
43
|
-
"brBytes":
|
|
44
|
-
"bytes":
|
|
40
|
+
"url": "https://s.koubei.com/FnJSjmtxMGff5j8zKAT7m7ccXczBQdEr.br",
|
|
41
|
+
"sha256": "e0d24d73415b456df0a6869c114160509de255b8709f6ca8d1e718ce88a5f870",
|
|
42
|
+
"brSha256": "d87241b1c8ede71a11f5884138e468836133b6c67f6afab93d1754c20df5596b",
|
|
43
|
+
"brBytes": 32634139,
|
|
44
|
+
"bytes": 103980544
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
}
|
package/install.cjs
CHANGED
|
@@ -35,9 +35,10 @@
|
|
|
35
35
|
* 1. **埋点失败绝不影响安装结果** —— 全程吞异常,返回码只由安装本身决定。
|
|
36
36
|
* 2. **不打印任何东西** —— `release:verify` 有断言盯着 postinstall 的输出。
|
|
37
37
|
* 3. **必须 await** —— 本文件结尾是 `process.exit(code)`,fire-and-forget 的 fetch 会被
|
|
38
|
-
* 直接掐掉、一条都发不出去。代价是安装最多多等 TRACK_TIMEOUT_MS
|
|
38
|
+
* 直接掐掉、一条都发不出去。代价是安装最多多等 TRACK_TIMEOUT_MS(5 秒,见那个常量)。
|
|
39
39
|
*
|
|
40
|
-
*
|
|
40
|
+
* 两个开关:`KRY_CLI_NO_TRACK=1` 整体关掉(CI、离线环境、端到端验证用);
|
|
41
|
+
* `KRY_CLI_TRACK_DEBUG=1` 把上报的 HTTP 状态或失败原因打到 stderr(默认一个字都不打)。
|
|
41
42
|
*/
|
|
42
43
|
|
|
43
44
|
'use strict';
|
|
@@ -195,8 +196,18 @@ async function download(url) {
|
|
|
195
196
|
* 所以地址改错不会有任何报错,只会「首装数据从新 logstore 里悄悄消失」。
|
|
196
197
|
*/
|
|
197
198
|
const TRACK_URL = 'https://tnnm-alsc-saas-merchant-spider-fy21.cn-wulanchabu.log.aliyuncs.com/logstores/kry-cli/track?APIVersion=0.6.0';
|
|
198
|
-
/**
|
|
199
|
-
|
|
199
|
+
/**
|
|
200
|
+
* 埋点超时。安装最多为此多等这么久。
|
|
201
|
+
*
|
|
202
|
+
* **原先是 2000,实测证明定得太小。** 一台 Windows 上真实 `npm i -g` 的首装事件丢了,
|
|
203
|
+
* 而同一台机器手动跑 `node install.cjs` 又能上报成功 —— 差别是**冷启动**:
|
|
204
|
+
* npm 那次是本机对 `log.aliyuncs.com` 的首次连接(DNS + TCP + TLS 全冷),
|
|
205
|
+
* 手动那次 DNS 与 TLS 会话都已经热了(实测 529 ms)。企业网的冷解析吃掉 2 秒很正常。
|
|
206
|
+
*
|
|
207
|
+
* 而这个 POST **只有一次机会**(没有重试),对面是一次要跑 12~32 秒的安装 ——
|
|
208
|
+
* 多给 3 秒的代价可以忽略,丢一条首装数据的代价是漏斗分母永久缺一个。
|
|
209
|
+
*/
|
|
210
|
+
const TRACK_TIMEOUT_MS = 5000;
|
|
200
211
|
|
|
201
212
|
/**
|
|
202
213
|
* 埋点的 errorCode 取值。**看板与查询会依赖这些字面量,只能新增,不能改名或删除。**
|
|
@@ -235,6 +246,20 @@ function isTrackDisabled() {
|
|
|
235
246
|
return process.env.KRY_CLI_NO_TRACK === '1' || process.env.KRY_CLI_NO_TRACK === 'true';
|
|
236
247
|
}
|
|
237
248
|
|
|
249
|
+
/**
|
|
250
|
+
* 埋点调试开关:**只在显式打开时才出声**,默认一个字都不打印。
|
|
251
|
+
*
|
|
252
|
+
* 加它是因为付过一次代价:Windows 上首装事件没上报,而 track() 按约定吞掉一切异常、
|
|
253
|
+
* 不打印任何东西 —— 于是只能从外部二分(查 CDN、查 dist-tags、比对已发布的 install.cjs、
|
|
254
|
+
* 用真实端点探针、手动跑 install.cjs),来回四五轮才定位到是超时。
|
|
255
|
+
* 打开这个开关就是一条命令的事。
|
|
256
|
+
*
|
|
257
|
+
* 默认静默这条约束不能破:`release:verify` 有断言盯着 postinstall 的输出。
|
|
258
|
+
*/
|
|
259
|
+
function isTrackDebug() {
|
|
260
|
+
return process.env.KRY_CLI_TRACK_DEBUG === '1' || process.env.KRY_CLI_TRACK_DEBUG === 'true';
|
|
261
|
+
}
|
|
262
|
+
|
|
238
263
|
/**
|
|
239
264
|
* 复刻 `core/config.ts` 的 getEnv 前两级:CLIENT_CLAW_ENV > KRY_FORCE_ENV。
|
|
240
265
|
*
|
|
@@ -282,10 +307,33 @@ function compact(obj) {
|
|
|
282
307
|
}
|
|
283
308
|
|
|
284
309
|
/**
|
|
285
|
-
*
|
|
310
|
+
* 从 fetch 的错误里挖出真正有用的那一层原因(ETIMEDOUT / ENOTFOUND / 证书类 / bad port…)。
|
|
311
|
+
*
|
|
312
|
+
* `fetch` 抛的永远是 `TypeError: fetch failed` —— 那句话毫无信息量,正是这次排查最耗时的地方。
|
|
313
|
+
* 真实原因在 `cause` 里,而它有三种形态,都得照顾到:
|
|
314
|
+
* 1. `cause.code`:最常见(ENOTFOUND / ECONNREFUSED / CERT_* …)
|
|
315
|
+
* 2. `cause.errors[].code`:undici 的 happy-eyeballs 同时试 IPv4/IPv6 时会包一层
|
|
316
|
+
* `AggregateError`,此时 `cause.code` 是空的
|
|
317
|
+
* 3. 只有 `cause.message`:如 undici 按 fetch 规范拒绝「坏端口」时给的 `bad port`
|
|
318
|
+
*/
|
|
319
|
+
function causeOf(error) {
|
|
320
|
+
const cause = error && error.cause;
|
|
321
|
+
if (!cause) return '';
|
|
322
|
+
if (cause.code) return cause.code;
|
|
323
|
+
if (Array.isArray(cause.errors)) {
|
|
324
|
+
const found = cause.errors.find((e) => e && e.code);
|
|
325
|
+
if (found) return found.code;
|
|
326
|
+
}
|
|
327
|
+
return cause.message ? String(cause.message).slice(0, 100) : '';
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* 上报一次安装结果。**全程吞异常、不改变返回码,默认不打印** ——
|
|
286
332
|
* 「装不装得上」与「埋不埋得上」是两件事,后者不能影响前者。
|
|
333
|
+
* 需要看它到底发出去没有时打开 `KRY_CLI_TRACK_DEBUG=1`。
|
|
287
334
|
*/
|
|
288
335
|
async function track(outcome) {
|
|
336
|
+
const t0 = Date.now();
|
|
289
337
|
try {
|
|
290
338
|
if (isTrackDisabled()) return;
|
|
291
339
|
const self = readJson(path.join(__dirname, 'package.json')) || {};
|
|
@@ -333,9 +381,15 @@ async function track(outcome) {
|
|
|
333
381
|
__logs__: [{ traceId, level: outcome.level, message: outcome.message, tag: 'install', data: JSON.stringify(data) }],
|
|
334
382
|
__tags__: tags,
|
|
335
383
|
});
|
|
336
|
-
await fetch(TRACK_URL, { method: 'POST', headers: new Headers(), body, signal: AbortSignal.timeout(TRACK_TIMEOUT_MS) });
|
|
337
|
-
|
|
338
|
-
|
|
384
|
+
const res = await fetch(TRACK_URL, { method: 'POST', headers: new Headers(), body, signal: AbortSignal.timeout(TRACK_TIMEOUT_MS) });
|
|
385
|
+
if (isTrackDebug()) warn(`[track] HTTP ${res.status}(${Date.now() - t0} ms,body ${body.length} 字节)`);
|
|
386
|
+
} catch (error) {
|
|
387
|
+
// 埋点失败不影响安装结果,默认也不打印 —— 用户不需要为此困惑
|
|
388
|
+
if (isTrackDebug()) {
|
|
389
|
+
const name = error && error.name ? `${error.name}: ` : '';
|
|
390
|
+
const code = causeOf(error);
|
|
391
|
+
warn(`[track] 上报失败(${Date.now() - t0} ms,超时上限 ${TRACK_TIMEOUT_MS} ms):${name}${error && error.message ? error.message : String(error)}${code ? ` cause=${code}` : ''}`);
|
|
392
|
+
}
|
|
339
393
|
}
|
|
340
394
|
}
|
|
341
395
|
|