@heybox/hb-sdk 0.8.4 → 0.9.0-alpha.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.
Files changed (33) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/cli-chunks/{build-DgV-or9j.cjs → build-Dv5vWsBh.cjs} +5 -5
  3. package/dist/cli-chunks/{context-DlcETCGM.cjs → context-B15FzPf9.cjs} +2 -2
  4. package/dist/cli-chunks/{create-BjJ6U5qS.cjs → create-BtZUsxJd.cjs} +1 -1
  5. package/dist/cli-chunks/{dev-hIWir4Bp.cjs → dev-tAThflC6.cjs} +414 -44
  6. package/dist/cli-chunks/{doctor-DImHJjzI.cjs → doctor-PE_MhGBX.cjs} +1 -1
  7. package/dist/cli-chunks/{index-CbDWlPpw.cjs → index-CeA8xI0T.cjs} +2 -2
  8. package/dist/cli-chunks/{index-CO8AEaXW.cjs → index-Dd_eGaDz.cjs} +159 -67
  9. package/dist/cli-chunks/{index.esm-COo1T4B1.cjs → index.esm-Bw3R5BAL.cjs} +7 -7
  10. package/dist/cli-chunks/{login-DbbuUauB.cjs → login-5FPaFRi0.cjs} +2 -2
  11. package/dist/cli-chunks/{project-vite-Dw04aEsD.cjs → project-vite-ckDtbYtt.cjs} +1 -1
  12. package/dist/cli-chunks/{remote-CWeqNVk_.cjs → remote-DCHqFvmB.cjs} +7 -7
  13. package/dist/cli-chunks/{runtime-gate-PxUnfrPH.cjs → runtime-gate-DkTbgx4d.cjs} +1 -1
  14. package/dist/cli-chunks/{runtime-permission-env-9GWrfOTi.cjs → runtime-permission-env-DR89buKQ.cjs} +1 -1
  15. package/dist/cli-chunks/{session-CRiCQkg-.cjs → session-BiT-5VHK.cjs} +63 -1
  16. package/dist/cli-chunks/{skill-BZFvZvOT.cjs → skill-C5EoUf2T.cjs} +2 -2
  17. package/dist/cli-chunks/{version-Bk5ehprU.cjs → version-CJ7rfbl-.cjs} +1 -1
  18. package/dist/cli.cjs +1 -1
  19. package/dist/devtools/browser-dev-host/assets/browser-dev-host-Cu0OUKXf.js +102 -0
  20. package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-DnjiCJj1.js → desktop-app-launch-2BQ4uwPZ.js} +1 -1
  21. package/dist/devtools/browser-dev-host/assets/{index-CjUagRoX.js → index-B1ZPOArZ.js} +3 -3
  22. package/dist/devtools/browser-dev-host/index.html +2 -2
  23. package/dist/index.cjs.js +1 -1
  24. package/dist/index.esm.js +1 -1
  25. package/dist/vite.cjs.js +1 -1
  26. package/dist/vite.esm.js +1 -1
  27. package/package.json +4 -4
  28. package/skill/skill.json +4 -4
  29. package/types/modules/auth/index.d.ts +4 -0
  30. package/types/modules/cloud/index.d.ts +25 -0
  31. package/types/modules/user/index.d.ts +16 -0
  32. package/types/protocol/dev-session.d.ts +18 -0
  33. package/dist/devtools/browser-dev-host/assets/browser-dev-host-C_NWoBa2.js +0 -102
@@ -3,7 +3,7 @@
3
3
  var fs = require('node:fs/promises');
4
4
  var os = require('node:os');
5
5
  var path = require('node:path');
6
- var index = require('./index-CO8AEaXW.cjs');
6
+ var index = require('./index-Dd_eGaDz.cjs');
7
7
  require('node:module');
8
8
  require('node:fs');
9
9
  require('path');
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var index$2 = require('./index-CO8AEaXW.cjs');
3
+ var index$2 = require('./index-Dd_eGaDz.cjs');
4
4
  var require$$0$3 = require('fs');
5
5
  var require$$0$2 = require('crypto');
6
6
  var require$$1$2 = require('path');
7
7
  var require$$0$5 = require('assert');
8
8
  var require$$0$4 = require('events');
9
9
  var require$$1$1 = require('util');
10
- var runtimePermissionEnv = require('./runtime-permission-env-9GWrfOTi.cjs');
10
+ var runtimePermissionEnv = require('./runtime-permission-env-DR89buKQ.cjs');
11
11
  var require$$0$7 = require('net');
12
12
  var require$$0$6 = require('url');
13
13
  var require$$2$1 = require('http');
@@ -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-CO8AEaXW.cjs', document.baseURI).href)));
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-Dd_eGaDz.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-CO8AEaXW.cjs', document.baseURI).href)));
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-Dd_eGaDz.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-CO8AEaXW.cjs', document.baseURI).href)));
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-Dd_eGaDz.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-CO8AEaXW.cjs', document.baseURI).href)));
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-Dd_eGaDz.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-CO8AEaXW.cjs', document.baseURI).href)));
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-Dd_eGaDz.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.4';
13557
+ const BUILT_CLI_VERSION = '0.9.0-alpha.0';
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-DbbuUauB.cjs'); });
13916
+ const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-5FPaFRi0.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-DbbuUauB.cjs'); });
13920
+ const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-5FPaFRi0.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-DbbuUauB.cjs'); });
13924
+ const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-5FPaFRi0.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-DgV-or9j.cjs'); });
13928
+ const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-Dv5vWsBh.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-BjJ6U5qS.cjs'); });
13932
+ const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-BtZUsxJd.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-hIWir4Bp.cjs'); }).then(function (n) { return n.dev; });
13936
+ const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-tAThflC6.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-DImHJjzI.cjs'); });
13940
+ const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-PE_MhGBX.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-BZFvZvOT.cjs'); });
13944
+ const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-C5EoUf2T.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-CWeqNVk_.cjs'); });
13948
+ const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-DCHqFvmB.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-CO8AEaXW.cjs');
15
- var dev = require('./dev-hIWir4Bp.cjs');
14
+ var index = require('./index-Dd_eGaDz.cjs');
15
+ var dev = require('./dev-tAThflC6.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-DlcETCGM.cjs');
27
- require('./runtime-permission-env-9GWrfOTi.cjs');
28
- require('./version-Bk5ehprU.cjs');
26
+ require('./context-B15FzPf9.cjs');
27
+ require('./runtime-permission-env-DR89buKQ.cjs');
28
+ require('./version-CJ7rfbl-.cjs');
29
29
  require('node:async_hooks');
30
30
  require('sharp');
31
- require('./session-CRiCQkg-.cjs');
31
+ require('./session-BiT-5VHK.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-Dw04aEsD.cjs');
45
+ require('./project-vite-ckDtbYtt.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-CRiCQkg-.cjs');
6
+ var session = require('./session-BiT-5VHK.cjs');
7
7
  var browser = require('./browser-RAy8e8cV.cjs');
8
- var index = require('./index-CO8AEaXW.cjs');
8
+ var index = require('./index-Dd_eGaDz.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-CO8AEaXW.cjs');
8
+ var index = require('./index-Dd_eGaDz.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-9GWrfOTi.cjs');
4
- var context = require('./context-DlcETCGM.cjs');
3
+ var runtimePermissionEnv = require('./runtime-permission-env-DR89buKQ.cjs');
4
+ var context = require('./context-B15FzPf9.cjs');
5
5
  var promises = require('node:readline/promises');
6
- var index = require('./index-CO8AEaXW.cjs');
7
- var session = require('./session-CRiCQkg-.cjs');
6
+ var index = require('./index-Dd_eGaDz.cjs');
7
+ var session = require('./session-BiT-5VHK.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-PxUnfrPH.cjs');
15
- require('./version-Bk5ehprU.cjs');
14
+ var runtimeGate = require('./runtime-gate-DkTbgx4d.cjs');
15
+ require('./version-CJ7rfbl-.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-CbDWlPpw.cjs'); }).then(function (n) { return n.index; });
277
+ const cosModule = await Promise.resolve().then(function () { return require('./index-CeA8xI0T.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 runtimePermissionEnv = require('./runtime-permission-env-9GWrfOTi.cjs');
3
+ var runtimePermissionEnv = require('./runtime-permission-env-DR89buKQ.cjs');
4
4
 
5
5
  // Shorthands
6
6
  /**
@@ -2,7 +2,7 @@
2
2
 
3
3
  var fs = require('node:fs');
4
4
  var path = require('node:path');
5
- var version = require('./version-Bk5ehprU.cjs');
5
+ var version = require('./version-CJ7rfbl-.cjs');
6
6
  require('node:crypto');
7
7
  var node_async_hooks = require('node:async_hooks');
8
8
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-CO8AEaXW.cjs');
3
+ var index = require('./index-Dd_eGaDz.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-Bk5ehprU.cjs');
3
+ var version = require('./version-CJ7rfbl-.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-CO8AEaXW.cjs');
7
+ var index = require('./index-Dd_eGaDz.cjs');
8
8
  require('node:module');
9
9
  require('node:fs');
10
10
  require('path');
@@ -3,6 +3,6 @@
3
3
  /** 构建时替换为当前发布包的实际版本。 */
4
4
  const HB_SDK_VERSION = typeof undefined === 'string'
5
5
  ? undefined
6
- : '0.8.4';
6
+ : '0.9.0-alpha.0';
7
7
 
8
8
  exports.HB_SDK_VERSION = HB_SDK_VERSION;
package/dist/cli.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./cli-chunks/index-CO8AEaXW.cjs');
3
+ var index = require('./cli-chunks/index-Dd_eGaDz.cjs');
4
4
  require('node:module');
5
5
  require('node:fs');
6
6
  require('node:fs/promises');