@heybox/hb-sdk 0.8.4 → 0.8.5
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/CHANGELOG.md +25 -0
- package/dist/cli-chunks/{build-DgV-or9j.cjs → build-zYnPSPFa.cjs} +5 -5
- package/dist/cli-chunks/{context-DlcETCGM.cjs → context-DWoKsM_O.cjs} +2 -2
- package/dist/cli-chunks/{create-BjJ6U5qS.cjs → create-C9FcEn9Y.cjs} +1 -1
- package/dist/cli-chunks/{dev-hIWir4Bp.cjs → dev-VxeEocjt.cjs} +321 -25
- package/dist/cli-chunks/{doctor-DImHJjzI.cjs → doctor-6Cf9o1hD.cjs} +1 -1
- package/dist/cli-chunks/{index-CbDWlPpw.cjs → index-BpLYUwNe.cjs} +2 -2
- package/dist/cli-chunks/{index-CO8AEaXW.cjs → index-Brq_-WV3.cjs} +159 -67
- package/dist/cli-chunks/{index.esm-COo1T4B1.cjs → index.esm-DMvmTtIS.cjs} +7 -7
- package/dist/cli-chunks/{login-DbbuUauB.cjs → login-DeZpNrkY.cjs} +2 -2
- package/dist/cli-chunks/{project-vite-Dw04aEsD.cjs → project-vite-TFEwLzYM.cjs} +1 -1
- package/dist/cli-chunks/{remote-CWeqNVk_.cjs → remote-DOU11SNj.cjs} +7 -7
- package/dist/cli-chunks/{runtime-gate-PxUnfrPH.cjs → runtime-gate-DikSEEtm.cjs} +1 -1
- package/dist/cli-chunks/{runtime-permission-env-9GWrfOTi.cjs → runtime-permission-env-Bs_JqpTM.cjs} +1 -1
- package/dist/cli-chunks/{session-CRiCQkg-.cjs → session-CbisOcE4.cjs} +63 -1
- package/dist/cli-chunks/{skill-BZFvZvOT.cjs → skill-B82gXQhX.cjs} +2 -2
- package/dist/cli-chunks/{version-Bk5ehprU.cjs → version-UEmqQ6A-.cjs} +1 -1
- package/dist/cli.cjs +1 -1
- package/dist/devtools/browser-dev-host/assets/browser-dev-host-MOwoKrAP.js +102 -0
- package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-DnjiCJj1.js → desktop-app-launch-BcQjavzW.js} +1 -1
- package/dist/devtools/browser-dev-host/assets/{index-CjUagRoX.js → index-CS-AbGTE.js} +3 -3
- package/dist/devtools/browser-dev-host/index.html +2 -2
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/vite.cjs.js +1 -1
- package/dist/vite.esm.js +1 -1
- package/package.json +5 -5
- package/skill/skill.json +4 -4
- package/types/modules/auth/index.d.ts +4 -0
- package/types/modules/cloud/index.d.ts +25 -0
- package/types/modules/user/index.d.ts +16 -0
- package/types/protocol/dev-session.d.ts +18 -0
- package/dist/devtools/browser-dev-host/assets/browser-dev-host-C_NWoBa2.js +0 -102
|
@@ -235,19 +235,19 @@ function requireArgument () {
|
|
|
235
235
|
|
|
236
236
|
var command = {};
|
|
237
237
|
|
|
238
|
-
const require$5 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-
|
|
238
|
+
const require$5 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Brq_-WV3.cjs', document.baseURI).href)));
|
|
239
239
|
function __require$4() { return require$5("node:events"); }
|
|
240
240
|
|
|
241
|
-
const require$4 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-
|
|
241
|
+
const require$4 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Brq_-WV3.cjs', document.baseURI).href)));
|
|
242
242
|
function __require$3() { return require$4("node:child_process"); }
|
|
243
243
|
|
|
244
|
-
const require$3 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-
|
|
244
|
+
const require$3 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Brq_-WV3.cjs', document.baseURI).href)));
|
|
245
245
|
function __require$2() { return require$3("node:path"); }
|
|
246
246
|
|
|
247
|
-
const require$2 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-
|
|
247
|
+
const require$2 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Brq_-WV3.cjs', document.baseURI).href)));
|
|
248
248
|
function __require$1() { return require$2("node:fs"); }
|
|
249
249
|
|
|
250
|
-
const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-
|
|
250
|
+
const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('cli-chunks/index-Brq_-WV3.cjs', document.baseURI).href)));
|
|
251
251
|
function __require() { return require$1("node:process"); }
|
|
252
252
|
|
|
253
253
|
var help = {};
|
|
@@ -12942,6 +12942,110 @@ function defaultStreamForLevel(level) {
|
|
|
12942
12942
|
return level === 'error' || level === 'warn' || level === 'debug' ? 'stderr' : 'stdout';
|
|
12943
12943
|
}
|
|
12944
12944
|
|
|
12945
|
+
class CliError extends Error {
|
|
12946
|
+
httpStatus;
|
|
12947
|
+
verboseMessage;
|
|
12948
|
+
constructor(message, verboseMessage, options = {}) {
|
|
12949
|
+
super(message);
|
|
12950
|
+
this.name = 'CliError';
|
|
12951
|
+
this.httpStatus = options.httpStatus;
|
|
12952
|
+
this.verboseMessage = verboseMessage;
|
|
12953
|
+
}
|
|
12954
|
+
}
|
|
12955
|
+
/**
|
|
12956
|
+
* 网关限流错误(HTTP 403/429)。
|
|
12957
|
+
*
|
|
12958
|
+
* 与通用 `CliError` 分开,调用方才能区分「被限流」和「普通失败」:限流走 30s 起、
|
|
12959
|
+
* 上限 300s 的退避,并且必须提示开发者不要反复重启。
|
|
12960
|
+
*/
|
|
12961
|
+
class CliRateLimitedError extends CliError {
|
|
12962
|
+
retryAfterMs;
|
|
12963
|
+
gatewayMessage;
|
|
12964
|
+
constructor(message, options) {
|
|
12965
|
+
super(message, options.verboseMessage, { httpStatus: options.httpStatus });
|
|
12966
|
+
this.name = 'CliRateLimitedError';
|
|
12967
|
+
this.retryAfterMs = options.retryAfterMs;
|
|
12968
|
+
this.gatewayMessage = options.gatewayMessage ?? '';
|
|
12969
|
+
}
|
|
12970
|
+
/**
|
|
12971
|
+
* 转成可下发给调试页/宿主页的加性状态字段。
|
|
12972
|
+
*
|
|
12973
|
+
* 只有正数 `retryAfterMs` 才会带上时长(并据此给出 `untilTs`);缺失或非正数一律表示
|
|
12974
|
+
* 「网关没有给出时长」,由消费方回落各自的默认窗口。这样下游不需要为 `0` 维护一套
|
|
12975
|
+
* 「立即可重试」的特殊语义,也就不会出现「宿主页立即重连、CLI 仍在压制」的不一致。
|
|
12976
|
+
*/
|
|
12977
|
+
toRateLimitState(now = Date.now()) {
|
|
12978
|
+
const retryAfterMs = this.retryAfterMs;
|
|
12979
|
+
return {
|
|
12980
|
+
limited: true,
|
|
12981
|
+
...(retryAfterMs === undefined || retryAfterMs <= 0
|
|
12982
|
+
? {}
|
|
12983
|
+
: { retryAfterMs, untilTs: now + retryAfterMs }),
|
|
12984
|
+
...(this.gatewayMessage ? { message: this.gatewayMessage } : {}),
|
|
12985
|
+
};
|
|
12986
|
+
}
|
|
12987
|
+
}
|
|
12988
|
+
/** 从任意错误中读取限流状态;非限流错误返回 null。 */
|
|
12989
|
+
function readCliRateLimitState(error, now = Date.now()) {
|
|
12990
|
+
return error instanceof CliRateLimitedError ? error.toRateLimitState(now) : null;
|
|
12991
|
+
}
|
|
12992
|
+
/** 由已解析的限流状态还原错误,供缓存命中的降级路径继续走退避与提示。 */
|
|
12993
|
+
function createCliRateLimitedErrorFromState(state) {
|
|
12994
|
+
return new CliRateLimitedError(state.message ?? 'Heybox API 已被网关限流', {
|
|
12995
|
+
httpStatus: 429,
|
|
12996
|
+
...(state.retryAfterMs === undefined ? {} : { retryAfterMs: state.retryAfterMs }),
|
|
12997
|
+
...(state.message ? { gatewayMessage: state.message } : {}),
|
|
12998
|
+
});
|
|
12999
|
+
}
|
|
13000
|
+
/** 面向开发者的限流提示文案;没有可用的等待时长时不给出具体秒数。 */
|
|
13001
|
+
function formatCliRateLimitHint(state) {
|
|
13002
|
+
const retryAfterMs = state.retryAfterMs;
|
|
13003
|
+
const seconds = retryAfterMs === undefined || retryAfterMs <= 0 ? undefined : Math.max(1, Math.round(retryAfterMs / 1000));
|
|
13004
|
+
const pause = seconds === undefined ? '已暂停刷新' : `已暂停刷新(预计 ${seconds} 秒后恢复)`;
|
|
13005
|
+
return `已被网关限流,${pause},请勿反复重启。`;
|
|
13006
|
+
}
|
|
13007
|
+
function printError(error, options = {}) {
|
|
13008
|
+
const logger = options.logger ?? createCliLogger({ verbose: options.verbose });
|
|
13009
|
+
const message = readErrorMessage(error);
|
|
13010
|
+
logger.error(message);
|
|
13011
|
+
if (options.verbose && error instanceof CliError && error.verboseMessage && error.verboseMessage !== message) {
|
|
13012
|
+
logger.debug(error.verboseMessage);
|
|
13013
|
+
}
|
|
13014
|
+
}
|
|
13015
|
+
function readErrorMessage(error, options = {}) {
|
|
13016
|
+
if (options.verbose && error instanceof CliError && error.verboseMessage) {
|
|
13017
|
+
return error.verboseMessage;
|
|
13018
|
+
}
|
|
13019
|
+
if (error instanceof Error && error.message) {
|
|
13020
|
+
return error.message;
|
|
13021
|
+
}
|
|
13022
|
+
return String(error);
|
|
13023
|
+
}
|
|
13024
|
+
function readRedactedErrorMessage(error, options = {}) {
|
|
13025
|
+
return redactSensitiveUrls(readErrorMessage(error, options));
|
|
13026
|
+
}
|
|
13027
|
+
function redactSensitiveUrls(message) {
|
|
13028
|
+
return message.replace(/https?:\/\/[^\s<>"'`]+/gi, (rawUrl) => {
|
|
13029
|
+
try {
|
|
13030
|
+
const url = new URL(rawUrl);
|
|
13031
|
+
url.username = '';
|
|
13032
|
+
url.password = '';
|
|
13033
|
+
for (const key of url.searchParams.keys()) {
|
|
13034
|
+
if (/(?:authorization|cookie|password|passwd|pkey|secret|session|token)/i.test(key)) {
|
|
13035
|
+
url.searchParams.set(key, '[REDACTED]');
|
|
13036
|
+
}
|
|
13037
|
+
}
|
|
13038
|
+
if (url.hash) {
|
|
13039
|
+
url.hash = '#[REDACTED]';
|
|
13040
|
+
}
|
|
13041
|
+
return url.toString();
|
|
13042
|
+
}
|
|
13043
|
+
catch {
|
|
13044
|
+
return '[REDACTED_URL]';
|
|
13045
|
+
}
|
|
13046
|
+
});
|
|
13047
|
+
}
|
|
13048
|
+
|
|
12945
13049
|
const UPDATE_CHECK_CACHE_VERSION = 1;
|
|
12946
13050
|
const UPDATE_CHECK_TTL_MS = 24 * 60 * 60 * 1000;
|
|
12947
13051
|
const DEFAULT_TIMEOUT_MS = 1500;
|
|
@@ -12971,6 +13075,41 @@ async function printUpdateReminder(options = {}) {
|
|
|
12971
13075
|
// Version checks must never affect the actual hb-sdk command.
|
|
12972
13076
|
}
|
|
12973
13077
|
}
|
|
13078
|
+
/**
|
|
13079
|
+
* 限流强提示。
|
|
13080
|
+
*
|
|
13081
|
+
* 老版本 CLI 已被安装到开发者本机,无法强制升级,只能在限流时明确提示:
|
|
13082
|
+
* 先说明限流与暂停刷新,再引导升级到已带缓存的版本。
|
|
13083
|
+
*/
|
|
13084
|
+
async function printRateLimitUpgradeHint(options = {}) {
|
|
13085
|
+
const logger = options.logger ??
|
|
13086
|
+
createCliLogger({
|
|
13087
|
+
stderr: options.stderr,
|
|
13088
|
+
stdout: options.output,
|
|
13089
|
+
});
|
|
13090
|
+
const stream = options.stream ?? (options.output ? 'stdout' : 'stderr');
|
|
13091
|
+
let reminder = null;
|
|
13092
|
+
try {
|
|
13093
|
+
reminder = await getUpdateReminder(options);
|
|
13094
|
+
}
|
|
13095
|
+
catch {
|
|
13096
|
+
// 升级检查失败不能吞掉限流提示本身。
|
|
13097
|
+
}
|
|
13098
|
+
logger.warn(formatRateLimitUpgradeHint({
|
|
13099
|
+
...(options.gatewayMessage ? { gatewayMessage: options.gatewayMessage } : {}),
|
|
13100
|
+
...(options.retryAfterMs === undefined ? {} : { retryAfterMs: options.retryAfterMs }),
|
|
13101
|
+
...(reminder ? { reminder } : {}),
|
|
13102
|
+
}), { stream });
|
|
13103
|
+
}
|
|
13104
|
+
/** 限流提示 + 升级引导文案;`reminder` 缺失时只保留限流与升级命令。 */
|
|
13105
|
+
function formatRateLimitUpgradeHint(input) {
|
|
13106
|
+
const rateLimitHint = formatCliRateLimitHint(input.retryAfterMs === undefined ? {} : { retryAfterMs: input.retryAfterMs });
|
|
13107
|
+
const upgradeHint = input.reminder
|
|
13108
|
+
? formatUpdateReminder(input.reminder)
|
|
13109
|
+
: `请升级 ${HB_SDK_PACKAGE_NAME} 以获得 Dev Context 结果缓存与指数退避:npm i -D ${HB_SDK_PACKAGE_NAME}@latest`;
|
|
13110
|
+
const gatewayHint = input.gatewayMessage ? `网关原文:${input.gatewayMessage}` : '';
|
|
13111
|
+
return [rateLimitHint, gatewayHint, upgradeHint].filter(Boolean).join(' ');
|
|
13112
|
+
}
|
|
12974
13113
|
async function getUpdateReminder(options = {}) {
|
|
12975
13114
|
if (isUpdateCheckDisabled(options.env ?? process.env)) {
|
|
12976
13115
|
return null;
|
|
@@ -13187,58 +13326,6 @@ async function pathExists$1(filePath) {
|
|
|
13187
13326
|
}
|
|
13188
13327
|
}
|
|
13189
13328
|
|
|
13190
|
-
class CliError extends Error {
|
|
13191
|
-
httpStatus;
|
|
13192
|
-
verboseMessage;
|
|
13193
|
-
constructor(message, verboseMessage, options = {}) {
|
|
13194
|
-
super(message);
|
|
13195
|
-
this.name = 'CliError';
|
|
13196
|
-
this.httpStatus = options.httpStatus;
|
|
13197
|
-
this.verboseMessage = verboseMessage;
|
|
13198
|
-
}
|
|
13199
|
-
}
|
|
13200
|
-
function printError(error, options = {}) {
|
|
13201
|
-
const logger = options.logger ?? createCliLogger({ verbose: options.verbose });
|
|
13202
|
-
const message = readErrorMessage(error);
|
|
13203
|
-
logger.error(message);
|
|
13204
|
-
if (options.verbose && error instanceof CliError && error.verboseMessage && error.verboseMessage !== message) {
|
|
13205
|
-
logger.debug(error.verboseMessage);
|
|
13206
|
-
}
|
|
13207
|
-
}
|
|
13208
|
-
function readErrorMessage(error, options = {}) {
|
|
13209
|
-
if (options.verbose && error instanceof CliError && error.verboseMessage) {
|
|
13210
|
-
return error.verboseMessage;
|
|
13211
|
-
}
|
|
13212
|
-
if (error instanceof Error && error.message) {
|
|
13213
|
-
return error.message;
|
|
13214
|
-
}
|
|
13215
|
-
return String(error);
|
|
13216
|
-
}
|
|
13217
|
-
function readRedactedErrorMessage(error, options = {}) {
|
|
13218
|
-
return redactSensitiveUrls(readErrorMessage(error, options));
|
|
13219
|
-
}
|
|
13220
|
-
function redactSensitiveUrls(message) {
|
|
13221
|
-
return message.replace(/https?:\/\/[^\s<>"'`]+/gi, (rawUrl) => {
|
|
13222
|
-
try {
|
|
13223
|
-
const url = new URL(rawUrl);
|
|
13224
|
-
url.username = '';
|
|
13225
|
-
url.password = '';
|
|
13226
|
-
for (const key of url.searchParams.keys()) {
|
|
13227
|
-
if (/(?:authorization|cookie|password|passwd|pkey|secret|session|token)/i.test(key)) {
|
|
13228
|
-
url.searchParams.set(key, '[REDACTED]');
|
|
13229
|
-
}
|
|
13230
|
-
}
|
|
13231
|
-
if (url.hash) {
|
|
13232
|
-
url.hash = '#[REDACTED]';
|
|
13233
|
-
}
|
|
13234
|
-
return url.toString();
|
|
13235
|
-
}
|
|
13236
|
-
catch {
|
|
13237
|
-
return '[REDACTED_URL]';
|
|
13238
|
-
}
|
|
13239
|
-
});
|
|
13240
|
-
}
|
|
13241
|
-
|
|
13242
13329
|
/**
|
|
13243
13330
|
* 极简 .env 文件解析器。
|
|
13244
13331
|
*
|
|
@@ -13467,7 +13554,7 @@ function getPathname(pathWithQuery) {
|
|
|
13467
13554
|
}
|
|
13468
13555
|
|
|
13469
13556
|
const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
|
|
13470
|
-
const BUILT_CLI_VERSION = '0.8.
|
|
13557
|
+
const BUILT_CLI_VERSION = '0.8.5';
|
|
13471
13558
|
const PACKAGE_JSON_CANDIDATES = [
|
|
13472
13559
|
path.resolve(__dirname, '..', '..', 'package.json'),
|
|
13473
13560
|
path.resolve(__dirname, '..', 'package.json'),
|
|
@@ -13826,39 +13913,39 @@ function createCommandLoggerResolver(options) {
|
|
|
13826
13913
|
};
|
|
13827
13914
|
}
|
|
13828
13915
|
const defaultClearLoginStatus = async (...args) => {
|
|
13829
|
-
const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-
|
|
13916
|
+
const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-DeZpNrkY.cjs'); });
|
|
13830
13917
|
return clearLoginStatus(...args);
|
|
13831
13918
|
};
|
|
13832
13919
|
const defaultLoginToHeybox = async (...args) => {
|
|
13833
|
-
const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-
|
|
13920
|
+
const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-DeZpNrkY.cjs'); });
|
|
13834
13921
|
return loginToHeybox(...args);
|
|
13835
13922
|
};
|
|
13836
13923
|
const defaultPrintLoginStatus = async (...args) => {
|
|
13837
|
-
const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-
|
|
13924
|
+
const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-DeZpNrkY.cjs'); });
|
|
13838
13925
|
return printLoginStatus(...args);
|
|
13839
13926
|
};
|
|
13840
13927
|
const defaultRunBuildCommand = async (...args) => {
|
|
13841
|
-
const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-
|
|
13928
|
+
const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-zYnPSPFa.cjs'); });
|
|
13842
13929
|
return runBuildCommand(...args);
|
|
13843
13930
|
};
|
|
13844
13931
|
const defaultRunCreateCommand = async (...args) => {
|
|
13845
|
-
const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-
|
|
13932
|
+
const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-C9FcEn9Y.cjs'); });
|
|
13846
13933
|
return runCreateCommand(...args);
|
|
13847
13934
|
};
|
|
13848
13935
|
const defaultRunDevCommand = async (...args) => {
|
|
13849
|
-
const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-
|
|
13936
|
+
const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-VxeEocjt.cjs'); }).then(function (n) { return n.dev; });
|
|
13850
13937
|
return runDevCommand(...args);
|
|
13851
13938
|
};
|
|
13852
13939
|
const defaultRunDoctorCommand = async (...args) => {
|
|
13853
|
-
const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-
|
|
13940
|
+
const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-6Cf9o1hD.cjs'); });
|
|
13854
13941
|
return runDoctorCommand(...args);
|
|
13855
13942
|
};
|
|
13856
13943
|
const defaultRunSkillInstallCommand = async (...args) => {
|
|
13857
|
-
const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-
|
|
13944
|
+
const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-B82gXQhX.cjs'); });
|
|
13858
13945
|
return runSkillInstallCommand(...args);
|
|
13859
13946
|
};
|
|
13860
13947
|
const defaultRunRemoteCommand = async (...args) => {
|
|
13861
|
-
const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-
|
|
13948
|
+
const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-DOU11SNj.cjs'); });
|
|
13862
13949
|
return runRemoteCommand(...args);
|
|
13863
13950
|
};
|
|
13864
13951
|
function resolveStandaloneLogger(options, verbose) {
|
|
@@ -13951,15 +14038,20 @@ function parseNonNegativeInteger(value) {
|
|
|
13951
14038
|
}
|
|
13952
14039
|
|
|
13953
14040
|
exports.CliError = CliError;
|
|
14041
|
+
exports.CliRateLimitedError = CliRateLimitedError;
|
|
13954
14042
|
exports.HB_SDK_PACKAGE_NAME = HB_SDK_PACKAGE_NAME;
|
|
13955
14043
|
exports.HB_SDK_SKILL_NAME = HB_SDK_SKILL_NAME;
|
|
13956
14044
|
exports.applyServiceTagIfNeeded = applyServiceTagIfNeeded;
|
|
13957
14045
|
exports.commonjsGlobal = commonjsGlobal;
|
|
13958
14046
|
exports.createCliLogger = createCliLogger;
|
|
13959
14047
|
exports.createCliProgram = createCliProgram;
|
|
14048
|
+
exports.createCliRateLimitedErrorFromState = createCliRateLimitedErrorFromState;
|
|
13960
14049
|
exports.createSkillContentHash = createSkillContentHash;
|
|
13961
14050
|
exports.envPaths = envPaths;
|
|
14051
|
+
exports.formatCliRateLimitHint = formatCliRateLimitHint;
|
|
13962
14052
|
exports.getDefaultExportFromCjs = getDefaultExportFromCjs;
|
|
14053
|
+
exports.printRateLimitUpgradeHint = printRateLimitUpgradeHint;
|
|
14054
|
+
exports.readCliRateLimitState = readCliRateLimitState;
|
|
13963
14055
|
exports.readErrorMessage = readErrorMessage;
|
|
13964
14056
|
exports.readRedactedErrorMessage = readRedactedErrorMessage;
|
|
13965
14057
|
exports.requireEnvPaths = requireEnvPaths;
|
|
@@ -11,8 +11,8 @@ var require$$0$4 = require('url');
|
|
|
11
11
|
var require$$0 = require('zlib');
|
|
12
12
|
var require$$0$1 = require('buffer');
|
|
13
13
|
var require$$1 = require('util');
|
|
14
|
-
var index = require('./index-
|
|
15
|
-
var dev = require('./dev-
|
|
14
|
+
var index = require('./index-Brq_-WV3.cjs');
|
|
15
|
+
var dev = require('./dev-VxeEocjt.cjs');
|
|
16
16
|
require('node:module');
|
|
17
17
|
require('node:fs');
|
|
18
18
|
require('node:fs/promises');
|
|
@@ -23,12 +23,12 @@ require('node:crypto');
|
|
|
23
23
|
require('readline');
|
|
24
24
|
require('tty');
|
|
25
25
|
require('assert');
|
|
26
|
-
require('./context-
|
|
27
|
-
require('./runtime-permission-env-
|
|
28
|
-
require('./version-
|
|
26
|
+
require('./context-DWoKsM_O.cjs');
|
|
27
|
+
require('./runtime-permission-env-Bs_JqpTM.cjs');
|
|
28
|
+
require('./version-UEmqQ6A-.cjs');
|
|
29
29
|
require('node:async_hooks');
|
|
30
30
|
require('sharp');
|
|
31
|
-
require('./session-
|
|
31
|
+
require('./session-CbisOcE4.cjs');
|
|
32
32
|
require('fs');
|
|
33
33
|
require('constants');
|
|
34
34
|
require('node:os');
|
|
@@ -42,7 +42,7 @@ require('node:buffer');
|
|
|
42
42
|
require('node:url');
|
|
43
43
|
require('node:util');
|
|
44
44
|
require('node:child_process');
|
|
45
|
-
require('./project-vite-
|
|
45
|
+
require('./project-vite-TFEwLzYM.cjs');
|
|
46
46
|
require('node:zlib');
|
|
47
47
|
|
|
48
48
|
var bufferUtil = {exports: {}};
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
var promises = require('node:readline/promises');
|
|
4
4
|
var node_crypto = require('node:crypto');
|
|
5
5
|
var node_http = require('node:http');
|
|
6
|
-
var session = require('./session-
|
|
6
|
+
var session = require('./session-CbisOcE4.cjs');
|
|
7
7
|
var browser = require('./browser-RAy8e8cV.cjs');
|
|
8
|
-
var index = require('./index-
|
|
8
|
+
var index = require('./index-Brq_-WV3.cjs');
|
|
9
9
|
require('node:path');
|
|
10
10
|
require('fs');
|
|
11
11
|
require('constants');
|
|
@@ -5,7 +5,7 @@ var fs$1 = require('node:fs/promises');
|
|
|
5
5
|
var node_module = require('node:module');
|
|
6
6
|
var path = require('node:path');
|
|
7
7
|
var node_url = require('node:url');
|
|
8
|
-
var index = require('./index-
|
|
8
|
+
var index = require('./index-Brq_-WV3.cjs');
|
|
9
9
|
|
|
10
10
|
function findProjectRoot(startDir) {
|
|
11
11
|
let current = path.resolve(startDir);
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var runtimePermissionEnv = require('./runtime-permission-env-
|
|
4
|
-
var context = require('./context-
|
|
3
|
+
var runtimePermissionEnv = require('./runtime-permission-env-Bs_JqpTM.cjs');
|
|
4
|
+
var context = require('./context-DWoKsM_O.cjs');
|
|
5
5
|
var promises = require('node:readline/promises');
|
|
6
|
-
var index = require('./index-
|
|
7
|
-
var session = require('./session-
|
|
6
|
+
var index = require('./index-Brq_-WV3.cjs');
|
|
7
|
+
var session = require('./session-CbisOcE4.cjs');
|
|
8
8
|
var childProcess = require('node:child_process');
|
|
9
9
|
var fs = require('node:fs');
|
|
10
10
|
var fs$1 = require('node:fs/promises');
|
|
11
11
|
var path = require('node:path');
|
|
12
12
|
var node_crypto = require('node:crypto');
|
|
13
13
|
require('node:zlib');
|
|
14
|
-
var runtimeGate = require('./runtime-gate-
|
|
15
|
-
require('./version-
|
|
14
|
+
var runtimeGate = require('./runtime-gate-DikSEEtm.cjs');
|
|
15
|
+
require('./version-UEmqQ6A-.cjs');
|
|
16
16
|
require('node:async_hooks');
|
|
17
17
|
require('sharp');
|
|
18
18
|
require('node:module');
|
|
@@ -274,7 +274,7 @@ function createDefaultCosClient(uploadToken, COS) {
|
|
|
274
274
|
};
|
|
275
275
|
}
|
|
276
276
|
async function loadCosConstructor() {
|
|
277
|
-
const cosModule = await Promise.resolve().then(function () { return require('./index-
|
|
277
|
+
const cosModule = await Promise.resolve().then(function () { return require('./index-BpLYUwNe.cjs'); }).then(function (n) { return n.index; });
|
|
278
278
|
return cosModule.default;
|
|
279
279
|
}
|
|
280
280
|
function formatSize(bytes) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = require('./index-
|
|
3
|
+
var index = require('./index-Brq_-WV3.cjs');
|
|
4
4
|
var node_crypto = require('node:crypto');
|
|
5
5
|
var path = require('node:path');
|
|
6
6
|
var require$$0$2 = require('fs');
|
|
@@ -212,6 +212,16 @@ function getApiPathname(pathWithQuery) {
|
|
|
212
212
|
return new URL(pathWithQuery, HEYBOX_API_BASE_URL).pathname;
|
|
213
213
|
}
|
|
214
214
|
const ENVELOPE_BODY_PREVIEW_LENGTH = 1000;
|
|
215
|
+
/** 网关限流状态码;403(封禁)与 429(限速)走独立错误分支。 */
|
|
216
|
+
const RATE_LIMIT_HTTP_STATUSES = new Set([403, 429]);
|
|
217
|
+
/** HTTP-date 只接受以星期缩写开头的合法形态,避免宽松解析把垃圾值当日期。 */
|
|
218
|
+
const HTTP_DATE_RE = /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun)\b/i;
|
|
219
|
+
/** 网关原文里的等待时长;例如 `43200s内请求 ... 6127次,限制访问 86400s`。 */
|
|
220
|
+
const GATEWAY_RETRY_AFTER_PATTERNS = [
|
|
221
|
+
/限制访问\s*(\d+(?:\.\d+)?)\s*s/i,
|
|
222
|
+
/retry[\s_-]*after[^0-9]{0,12}(\d+(?:\.\d+)?)\s*s/i,
|
|
223
|
+
/(\d+(?:\.\d+)?)\s*秒后/,
|
|
224
|
+
];
|
|
215
225
|
async function readHeyboxApiEnvelope(response, options) {
|
|
216
226
|
const rawBody = await response.text();
|
|
217
227
|
let envelope = null;
|
|
@@ -235,8 +245,60 @@ async function readHeyboxApiEnvelope(response, options) {
|
|
|
235
245
|
rawBody,
|
|
236
246
|
pathWithQuery: options.pathWithQuery,
|
|
237
247
|
});
|
|
248
|
+
if (RATE_LIMIT_HTTP_STATUSES.has(response.status)) {
|
|
249
|
+
const gatewayMessage = readGatewayRateLimitMessage(envelope, rawBody);
|
|
250
|
+
const retryAfterMs = readRetryAfterMs(response, gatewayMessage);
|
|
251
|
+
throw new index.CliRateLimitedError(message, {
|
|
252
|
+
gatewayMessage,
|
|
253
|
+
httpStatus: response.status,
|
|
254
|
+
...(retryAfterMs === undefined ? {} : { retryAfterMs }),
|
|
255
|
+
verboseMessage,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
238
258
|
throw new index.CliError(message, verboseMessage, { httpStatus: response.status });
|
|
239
259
|
}
|
|
260
|
+
/**
|
|
261
|
+
* 优先读 `Retry-After` 响应头,其次从网关原文解析等待时长。
|
|
262
|
+
*
|
|
263
|
+
* 只返回**正数毫秒**:`Retry-After: 0`、已过期的 HTTP-date、负数与非法值一律按「网关没有
|
|
264
|
+
* 给出时长」处理,由消费方回落默认窗口(CLI 30s 起、宿主页 30s)。这样两端对同一个状态
|
|
265
|
+
* 的解读一致,也不会出现「宿主页立即重连、CLI 仍在压制」的分歧。
|
|
266
|
+
*/
|
|
267
|
+
function readRetryAfterMs(response, gatewayMessage) {
|
|
268
|
+
const headerValue = response.headers?.get('retry-after')?.trim();
|
|
269
|
+
if (headerValue) {
|
|
270
|
+
// 纯数字才是 delta-seconds;其余按 HTTP-date 解析,避免 `Date.parse('-5')` 产出垃圾值。
|
|
271
|
+
if (/^\d+$/.test(headerValue)) {
|
|
272
|
+
const headerMs = Number(headerValue) * 1000;
|
|
273
|
+
if (headerMs > 0)
|
|
274
|
+
return Math.round(headerMs);
|
|
275
|
+
}
|
|
276
|
+
else if (HTTP_DATE_RE.test(headerValue)) {
|
|
277
|
+
const headerDate = Date.parse(headerValue);
|
|
278
|
+
if (Number.isFinite(headerDate) && headerDate > Date.now()) {
|
|
279
|
+
return headerDate - Date.now();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
for (const pattern of GATEWAY_RETRY_AFTER_PATTERNS) {
|
|
284
|
+
const matched = gatewayMessage.match(pattern);
|
|
285
|
+
const seconds = matched ? Number(matched[1]) : Number.NaN;
|
|
286
|
+
if (Number.isFinite(seconds) && seconds > 0) {
|
|
287
|
+
return Math.round(seconds * 1000);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return undefined;
|
|
291
|
+
}
|
|
292
|
+
/** 网关原文:优先 envelope 的 msg,退化为响应体原文,最后回落到通用文案。 */
|
|
293
|
+
function readGatewayRateLimitMessage(envelope, rawBody) {
|
|
294
|
+
const msg = typeof envelope?.msg === 'string' ? envelope.msg.trim() : '';
|
|
295
|
+
if (msg)
|
|
296
|
+
return msg;
|
|
297
|
+
const sbeUserMessage = readSbeUserMessage(envelope?.result);
|
|
298
|
+
if (sbeUserMessage)
|
|
299
|
+
return sbeUserMessage;
|
|
300
|
+
return rawBody.trim() ? truncate(rawBody.trim(), ENVELOPE_BODY_PREVIEW_LENGTH) : '';
|
|
301
|
+
}
|
|
240
302
|
function formatHeyboxEnvelopeError(input) {
|
|
241
303
|
const parts = [`Heybox API ${input.pathWithQuery} failed`, `HTTP ${input.response.status}`];
|
|
242
304
|
if (input.envelope) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var version = require('./version-
|
|
3
|
+
var version = require('./version-UEmqQ6A-.cjs');
|
|
4
4
|
var fs = require('node:fs/promises');
|
|
5
5
|
var path = require('node:path');
|
|
6
6
|
var childProcess = require('node:child_process');
|
|
7
|
-
var index = require('./index-
|
|
7
|
+
var index = require('./index-Brq_-WV3.cjs');
|
|
8
8
|
require('node:module');
|
|
9
9
|
require('node:fs');
|
|
10
10
|
require('path');
|