@heybox/hb-sdk 0.6.3 → 0.6.4

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 CHANGED
@@ -57,7 +57,9 @@ SDK 需要在黑盒小程序 iframe 容器内运行。父容器会为页面注
57
57
  npm run dev
58
58
  ```
59
59
 
60
- 调试页会通过 iframe 加载本地页面并补齐小程序 bridge 环境;浏览器 Mock mock host 的同源只读 bootstrap 接口读取服务端保留的 Runtime 权限快照,URL query 不能提供或覆盖权限。项目已绑定 `heybox.miniProgramId` 时,可以点击调试页里的「在 Mac APP 中启动」按钮,或在「Mobile App」区域选择局域网网卡后用手机小黑盒 APP 扫码;真机 dev shell 只携带绑定的小程序 ID 和本地页面地址,H5 宿主按 ID 从公开详情接口读取可信 Runtime 权限快照。项目未绑定时仍可使用默认拒绝受管能力的浏览器 Mock,但 Mac 和手机真机入口会明确提示先运行 `hb-sdk remote create` `hb-sdk remote bind <mini-program-id>`,并保持不可用。真实容器加载开发 `mini_url` 前会提示“即将打开未经验证的开发网页。该页面可能由本机或局域网服务提供,请确认来源可信后继续。”,用户确认后才继续加载。Codex、VSCode 等内嵌浏览器可能无法唤起系统 APP;遇到这种情况时,请在系统浏览器中打开同一个调试页后重试。
60
+ 调试页会通过 iframe 加载本地页面并补齐小程序 bridge 环境。`hb-sdk dev` 的基础启动只依赖本地页面地址:即使项目未绑定、CLI 未登录或远端暂时不可用,浏览器 Mock、Mac 启动协议和手机二维码也会继续生成,真机 dev shell 以匿名本地沙箱加载 `mini_url`,不会把公开 `detail` 查询作为启动门禁。项目已绑定时会限时 3 秒读取远端 dev context;成功后 Mock Host 用真实 Runtime 权限快照初始化本地模拟,失败或超时则显示脱敏警告,并默认拒绝 `network.request` 等受管能力。需要定位降级原因时可使用 `hb-sdk dev --verbose`;详细错误只写入本地调试日志,其中 URL 用户名、密码和敏感 query/hash 会被遮蔽,不会进入 LAN bootstrap。
61
+
62
+ Mock Host 可以在内存中切换 devtools-only 的 `network.request` 权限,不会重建 iframe,因此不影响 Vite HMR;官方域名权限只读取线上快照,本地设置不会修改线上权限。调试页会对比已读取的线上快照,提示本地放开但上线后会返回 `PERMISSION_DENIED` 的差异。权限快照只通过 mock host 的同源只读 bootstrap 接口传递,URL query 不能提供或覆盖权限。真实容器加载开发 `mini_url` 前会提示“即将打开未经验证的开发网页。该页面可能由本机或局域网服务提供,请确认来源可信后继续。”,用户确认后才继续加载。Codex、VSCode 等内嵌浏览器可能无法唤起系统 APP;遇到这种情况时,请在系统浏览器中打开同一个调试页后重试。
61
63
 
62
64
  在未使用脚手架的 Vite 项目中,可以把命令加到 `package.json`:
63
65
 
@@ -579,7 +581,7 @@ meta refresh、外部 anchor、`dns-prefetch`、`preconnect`、`prerender`、外
579
581
  - `HbMiniProgramSDKError`、`HbMiniProgramNetworkError`
580
582
  - 各模块公开类型,例如 `MiniProgramNetworkRequestConfig`、`MiniProgramNetworkResponse`、`MiniProgramUserInfoResult`
581
583
 
582
- 协议常量、消息类型、能力目录、payload/result 映射和守卫只通过 `@heybox/hb-sdk/protocol` 子入口导出。iframe 小程序业务代码不应构造 raw bridge message,也不应直接处理 nonce 或 `postMessage` 信封;宿主运行时等非业务页面代码使用 `@heybox/hb-sdk/protocol`。
584
+ 协议常量、消息类型、能力目录、payload/result 映射、守卫和 Runtime 权限快照解析器只通过 `@heybox/hb-sdk/protocol` 子入口导出。`parseMiniProgramRuntimePermissions` 是正式 Runtime 与 Mock Host 共用的 fail-closed 解析 owner;`@heybox/hb-sdk-runtime` 保留同名兼容导出。iframe 小程序业务代码不应构造 raw bridge message、解析宿主权限快照,也不应直接处理 nonce 或 `postMessage` 信封;宿主运行时等非业务页面代码使用 `@heybox/hb-sdk/protocol`。
583
585
 
584
586
  构建时插件 `miniappManifest` 通过 `@heybox/hb-sdk/vite` 子入口导出,仅供 `vite.config.ts` 使用,不应在小程序业务代码里 import。
585
587
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var session = require('./session-vlPGi1Z8.cjs');
3
+ var session = require('./session-D7nmqMiy.cjs');
4
4
  var fs$1 = require('node:fs');
5
5
  var fs = require('node:fs/promises');
6
6
  var path = require('node:path');
@@ -5,7 +5,7 @@ var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
6
  var require$$0 = require('fs');
7
7
  var require$$1 = require('path');
8
- var index = require('./index--P321c8v.cjs');
8
+ var index = require('./index-B0zGksOA.cjs');
9
9
  require('node:module');
10
10
  require('os');
11
11
  require('readline');
@@ -9,8 +9,8 @@ var node_url = require('node:url');
9
9
  var net = require('node:net');
10
10
  var node_http = require('node:http');
11
11
  var browser = require('./browser-RAy8e8cV.cjs');
12
- var index = require('./index--P321c8v.cjs');
13
- var context = require('./context-Bu0Zusj_.cjs');
12
+ var index = require('./index-B0zGksOA.cjs');
13
+ var context = require('./context-BEgbP7mM.cjs');
14
14
  require('node:process');
15
15
  require('node:buffer');
16
16
  require('node:util');
@@ -24,7 +24,7 @@ require('events');
24
24
  require('stream');
25
25
  require('buffer');
26
26
  require('util');
27
- require('./session-vlPGi1Z8.cjs');
27
+ require('./session-D7nmqMiy.cjs');
28
28
  require('node:crypto');
29
29
  require('fs');
30
30
  require('constants');
@@ -223,6 +223,7 @@ async function startMiniProgramMockHostServer(options) {
223
223
  assertCompleteMiniProgramMockHostRoot(root);
224
224
  const bootstrapJson = serializeMockHostBootstrap({
225
225
  defaultLanAddressId: options.defaultLanAddressId,
226
+ devContext: options.devContext,
226
227
  lanAddresses: options.lanAddresses ?? [],
227
228
  macAppProtocol: options.macAppProtocol,
228
229
  nativeAppLaunchUnavailableReason: options.nativeAppLaunchUnavailableReason,
@@ -669,12 +670,14 @@ function createHeyboxProtocol(payload) {
669
670
  /** 构建时替换为当前发布包的实际版本。 */
670
671
  const HB_SDK_VERSION = typeof undefined === 'string'
671
672
  ? undefined
672
- : '0.6.3';
673
+ : '0.6.4';
673
674
 
674
675
  const DEFAULT_APP_PORT = 5173;
675
676
  const DEFAULT_MOCK_PORT = 5174;
677
+ const DEFAULT_DEV_CONTEXT_TIMEOUT_MS = 3000;
676
678
  const DEV_LISTEN_HOST = '0.0.0.0';
677
679
  const LOCAL_DEV_URL_HOST = '127.0.0.1';
680
+ const DEV_CONTEXT_UNAVAILABLE_WARNING = '远端 dev context 不可用,已继续匿名调试。';
678
681
  // Shared with Heybox H5 Vite plugins so hb-sdk can own the launch output.
679
682
  const MANAGED_DEV_OUTPUT_ENV = 'HEYBOX_DEV_SERVER_MANAGED_OUTPUT';
680
683
  const VITE_LOG_LEVEL = 'warn';
@@ -701,6 +704,7 @@ async function runDevCommand(options, runtime = {}) {
701
704
  fetchImpl,
702
705
  logger,
703
706
  projectRoot,
707
+ timeoutMs: runtime.devContextTimeoutMs ?? DEFAULT_DEV_CONTEXT_TIMEOUT_MS,
704
708
  });
705
709
  const vite = await logger.task('正在加载项目 Vite', () => loadProjectVite(projectRoot), { successText: '已加载项目 Vite' });
706
710
  const appServer = await logger.task('正在创建 Vite dev server', () => withManagedDevOutputEnv(() => vite.createServer(createViteServerOptions(projectRoot, resolvedOptions)), runtime.env), { successText: '已创建 Vite dev server' });
@@ -724,18 +728,16 @@ async function runDevCommand(options, runtime = {}) {
724
728
  try {
725
729
  mockHost = await logger.task('正在启动 Mock runtime host', () => startMiniProgramMockHostServer({
726
730
  appUrl,
731
+ devContext: devLaunchContext,
727
732
  fetchImpl,
728
733
  getPort: getPortImpl,
729
734
  defaultLanAddressId: lanAddresses[0]?.id,
730
735
  lanAddresses,
731
- macAppProtocol: devLaunchContext.miniProgramId
732
- ? createMacAppProtocol(appUrl, {
733
- miniProgramId: devLaunchContext.miniProgramId,
734
- runtimeUrl: options.runtimeUrl,
735
- sdkVersion: HB_SDK_VERSION,
736
- })
737
- : undefined,
738
- nativeAppLaunchUnavailableReason: devLaunchContext.nativeAppLaunchUnavailableReason,
736
+ macAppProtocol: createMacAppProtocol(appUrl, {
737
+ miniProgramId: devLaunchContext.miniProgramId,
738
+ runtimeUrl: options.runtimeUrl,
739
+ sdkVersion: HB_SDK_VERSION,
740
+ }),
739
741
  port: options.mockPort ?? DEFAULT_MOCK_PORT,
740
742
  root: runtime.mockHostRoot,
741
743
  rootCandidates: runtime.mockHostRootCandidates,
@@ -750,12 +752,10 @@ async function runDevCommand(options, runtime = {}) {
750
752
  logger.success('Mock runtime host 已就绪');
751
753
  logger.info(`Mock runtime host: ${mockHost.url}`);
752
754
  logger.info(`Mini program URL: ${appUrl}`);
753
- if (devLaunchContext.miniProgramId) {
754
- logger.info('Mac APP: use the button in Mock runtime host');
755
- logger.info('Mobile APP: scan the QR code in Mock runtime host');
756
- }
757
- else {
758
- logger.warn(`Mac/Mobile APP 真机调试不可用:${devLaunchContext.nativeAppLaunchUnavailableReason}`);
755
+ logger.info('Mac APP: use the button in Mock runtime host');
756
+ logger.info('Mobile APP: scan the QR code in Mock runtime host');
757
+ if (devLaunchContext.source === 'anonymous') {
758
+ logger.warn('当前使用匿名本地沙箱;真机调试可用,但不会携带远端小程序身份或权限。');
759
759
  }
760
760
  if (options.open !== false) {
761
761
  logger.debug('正在打开浏览器调试页');
@@ -766,40 +766,61 @@ async function runDevCommand(options, runtime = {}) {
766
766
  async function loadDevLaunchContext(options) {
767
767
  const miniProgramId = await context.readBoundMiniProgramId(options.projectRoot);
768
768
  if (!miniProgramId) {
769
- const nativeAppLaunchUnavailableReason = '当前项目未绑定小程序。请先运行 hb-sdk remote create 或 hb-sdk remote bind <mini-program-id>。';
770
- options.logger.warn(`未读取到远端 Runtime 权限,Mock runtime 将默认拒绝受管能力:${nativeAppLaunchUnavailableReason}`);
771
- return { nativeAppLaunchUnavailableReason };
769
+ const anonymousReason = '当前项目未绑定小程序。请先运行 hb-sdk remote create 或 hb-sdk remote bind <mini-program-id>。';
770
+ options.logger.warn(`未读取到远端 Runtime 权限,Mock runtime 将默认拒绝受管能力:${anonymousReason}`);
771
+ return {
772
+ source: 'anonymous',
773
+ warning: anonymousReason,
774
+ };
772
775
  }
773
776
  try {
774
- const { detail, miniProgramId: verifiedMiniProgramId } = await options.logger.task('正在读取远端小程序权限', () => context.getBoundMiniProgram({
775
- cwd: options.projectRoot,
776
- env: options.env,
777
+ const { detail, miniProgramId: verifiedMiniProgramId } = await options.logger.task('正在读取远端小程序权限', () => loadRemoteDevContextWithTimeout({
777
778
  fetchImpl: options.fetchImpl,
779
+ load: (fetchImpl) => context.getBoundMiniProgram({
780
+ cwd: options.projectRoot,
781
+ env: options.env,
782
+ fetchImpl,
783
+ }),
784
+ timeoutMs: options.timeoutMs,
778
785
  }), { successText: '已读取远端小程序权限' });
779
- return { miniProgramId: verifiedMiniProgramId, runtimePermissions: detail.runtime_permissions };
786
+ return {
787
+ source: 'remote',
788
+ miniProgramId: verifiedMiniProgramId,
789
+ runtimePermissions: detail.runtime_permissions,
790
+ };
780
791
  }
781
792
  catch (error) {
782
- if (!canFallbackToDefaultRuntimePermissions(error)) {
793
+ if (error instanceof context.MiniProgramProjectBindingError && error.code !== 'MINI_PROGRAM_UNBOUND') {
783
794
  throw error;
784
795
  }
785
- options.logger.warn(`未读取到远端 Runtime 权限,Mock runtime 将默认拒绝受管能力:${index.readErrorMessage(error)}`);
796
+ options.logger.debug(`远端 dev context 失败详情:${index.readRedactedErrorMessage(error, { verbose: true })}`);
797
+ options.logger.warn(`未读取到远端 Runtime 权限,Mock runtime 将默认拒绝受管能力:${DEV_CONTEXT_UNAVAILABLE_WARNING}`);
786
798
  return {
787
- nativeAppLaunchUnavailableReason: '当前绑定尚未通过开发者权限验证。请先运行 hb-sdk login,并确认网络可用后重试。',
799
+ source: 'anonymous',
800
+ warning: DEV_CONTEXT_UNAVAILABLE_WARNING,
788
801
  };
789
802
  }
790
803
  }
791
- function canFallbackToDefaultRuntimePermissions(error) {
792
- if (error instanceof context.MiniProgramProjectBindingError) {
793
- return error.code === 'MINI_PROGRAM_UNBOUND';
794
- }
795
- if (error instanceof TypeError && error.message === 'fetch failed') {
796
- return true;
804
+ async function loadRemoteDevContextWithTimeout(options) {
805
+ const controller = new AbortController();
806
+ const fetchImpl = ((input, init) => options.fetchImpl(input, { ...init, signal: controller.signal }));
807
+ let timeout;
808
+ try {
809
+ return await Promise.race([
810
+ options.load(fetchImpl),
811
+ new Promise((_resolve, reject) => {
812
+ timeout = setTimeout(() => {
813
+ controller.abort();
814
+ reject(new Error('dev context timeout'));
815
+ }, Math.max(1, options.timeoutMs));
816
+ }),
817
+ ]);
797
818
  }
798
- if (error instanceof index.CliError) {
799
- return (error.httpStatus === 429 ||
800
- (error.httpStatus !== undefined && error.httpStatus >= 500 && error.httpStatus < 600));
819
+ finally {
820
+ if (timeout) {
821
+ clearTimeout(timeout);
822
+ }
801
823
  }
802
- return error instanceof Error && 'code' in error && error.code === 'AUTH_SESSION_MISSING';
803
824
  }
804
825
  function findProjectRoot(startDir) {
805
826
  let current = path.resolve(startDir);
@@ -984,12 +1005,7 @@ async function closeAll(closers) {
984
1005
  await Promise.allSettled(closers.map((close) => close()));
985
1006
  }
986
1007
  function createLanAddressCandidates(options) {
987
- if (!options.miniProgramId) {
988
- return [];
989
- }
990
- const viteNetworkUrlByHost = new Map(options.viteNetworkUrls
991
- .map((url) => [readUrlHost(url), url])
992
- .filter((entry) => Boolean(entry[0])));
1008
+ const viteNetworkUrlByHost = new Map(options.viteNetworkUrls.map((url) => [readUrlHost(url), url]).filter((entry) => Boolean(entry[0])));
993
1009
  const candidates = createLanInterfaceCandidates(options.interfaces)
994
1010
  .filter(({ address }) => address === options.hmrHost)
995
1011
  .map(({ address, id, name }) => {
@@ -1100,9 +1116,7 @@ function isPrivateIPv4(address) {
1100
1116
  if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) {
1101
1117
  return false;
1102
1118
  }
1103
- return (parts[0] === 10 ||
1104
- (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) ||
1105
- (parts[0] === 192 && parts[1] === 168));
1119
+ return parts[0] === 10 || (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31) || (parts[0] === 192 && parts[1] === 168);
1106
1120
  }
1107
1121
 
1108
1122
  exports.runDevCommand = runDevCommand;
@@ -4,7 +4,7 @@ var fs$1 = require('node:fs');
4
4
  var fs = require('node:fs/promises');
5
5
  var os = require('node:os');
6
6
  var path = require('node:path');
7
- var index = require('./index--P321c8v.cjs');
7
+ var index = require('./index-B0zGksOA.cjs');
8
8
  require('node:module');
9
9
  require('path');
10
10
  require('os');
@@ -234,19 +234,19 @@ function requireArgument () {
234
234
 
235
235
  var command = {};
236
236
 
237
- 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--P321c8v.cjs', document.baseURI).href)));
237
+ 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-B0zGksOA.cjs', document.baseURI).href)));
238
238
  function __require$4() { return require$5("node:events"); }
239
239
 
240
- 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--P321c8v.cjs', document.baseURI).href)));
240
+ 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-B0zGksOA.cjs', document.baseURI).href)));
241
241
  function __require$3() { return require$4("node:child_process"); }
242
242
 
243
- 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--P321c8v.cjs', document.baseURI).href)));
243
+ 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-B0zGksOA.cjs', document.baseURI).href)));
244
244
  function __require$2() { return require$3("node:path"); }
245
245
 
246
- 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--P321c8v.cjs', document.baseURI).href)));
246
+ 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-B0zGksOA.cjs', document.baseURI).href)));
247
247
  function __require$1() { return require$2("node:fs"); }
248
248
 
249
- 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--P321c8v.cjs', document.baseURI).href)));
249
+ 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-B0zGksOA.cjs', document.baseURI).href)));
250
250
  function __require() { return require$1("node:process"); }
251
251
 
252
252
  var help = {};
@@ -13094,6 +13094,30 @@ function readErrorMessage(error, options = {}) {
13094
13094
  }
13095
13095
  return String(error);
13096
13096
  }
13097
+ function readRedactedErrorMessage(error, options = {}) {
13098
+ return redactSensitiveUrls(readErrorMessage(error, options));
13099
+ }
13100
+ function redactSensitiveUrls(message) {
13101
+ return message.replace(/https?:\/\/[^\s<>"'`]+/gi, (rawUrl) => {
13102
+ try {
13103
+ const url = new URL(rawUrl);
13104
+ url.username = '';
13105
+ url.password = '';
13106
+ for (const key of url.searchParams.keys()) {
13107
+ if (/(?:authorization|cookie|password|passwd|pkey|secret|session|token)/i.test(key)) {
13108
+ url.searchParams.set(key, '[REDACTED]');
13109
+ }
13110
+ }
13111
+ if (url.hash) {
13112
+ url.hash = '#[REDACTED]';
13113
+ }
13114
+ return url.toString();
13115
+ }
13116
+ catch {
13117
+ return '[REDACTED_URL]';
13118
+ }
13119
+ });
13120
+ }
13097
13121
 
13098
13122
  /**
13099
13123
  * 极简 .env 文件解析器。
@@ -13323,7 +13347,7 @@ function getPathname(pathWithQuery) {
13323
13347
  }
13324
13348
 
13325
13349
  const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
13326
- const BUILT_CLI_VERSION = '0.6.3';
13350
+ const BUILT_CLI_VERSION = '0.6.4';
13327
13351
  const PACKAGE_JSON_CANDIDATES = [
13328
13352
  path.resolve(__dirname, '..', '..', 'package.json'),
13329
13353
  path.resolve(__dirname, '..', 'package.json'),
@@ -13644,31 +13668,31 @@ function createCommandLoggerResolver(options) {
13644
13668
  };
13645
13669
  }
13646
13670
  const defaultClearLoginStatus = async (...args) => {
13647
- const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-DEoReXOe.cjs'); });
13671
+ const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-ClQuL2r6.cjs'); });
13648
13672
  return clearLoginStatus(...args);
13649
13673
  };
13650
13674
  const defaultLoginToHeybox = async (...args) => {
13651
- const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-DEoReXOe.cjs'); });
13675
+ const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-ClQuL2r6.cjs'); });
13652
13676
  return loginToHeybox(...args);
13653
13677
  };
13654
13678
  const defaultPrintLoginStatus = async (...args) => {
13655
- const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-DEoReXOe.cjs'); });
13679
+ const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-ClQuL2r6.cjs'); });
13656
13680
  return printLoginStatus(...args);
13657
13681
  };
13658
13682
  const defaultRunCreateCommand = async (...args) => {
13659
- const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-CgAGcRtZ.cjs'); });
13683
+ const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-BHsWWo3V.cjs'); });
13660
13684
  return runCreateCommand(...args);
13661
13685
  };
13662
13686
  const defaultRunDevCommand = async (...args) => {
13663
- const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-g35-QcIa.cjs'); });
13687
+ const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-CSjs2OYB.cjs'); });
13664
13688
  return runDevCommand(...args);
13665
13689
  };
13666
13690
  const defaultRunDoctorCommand = async (...args) => {
13667
- const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-klsQg82G.cjs'); });
13691
+ const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-B3AOQgyN.cjs'); });
13668
13692
  return runDoctorCommand(...args);
13669
13693
  };
13670
13694
  const defaultRunRemoteCommand = async (...args) => {
13671
- const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-CZ-G3RSH.cjs'); });
13695
+ const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-ib5THDbw.cjs'); });
13672
13696
  return runRemoteCommand(...args);
13673
13697
  };
13674
13698
  function resolveStandaloneLogger(options, verbose) {
@@ -13773,6 +13797,7 @@ exports.createCliProgram = createCliProgram;
13773
13797
  exports.envPaths = envPaths;
13774
13798
  exports.getDefaultExportFromCjs = getDefaultExportFromCjs;
13775
13799
  exports.readErrorMessage = readErrorMessage;
13800
+ exports.readRedactedErrorMessage = readRedactedErrorMessage;
13776
13801
  exports.requireEnvPaths = requireEnvPaths;
13777
13802
  exports.requireOnetime = requireOnetime;
13778
13803
  exports.requireSafeBuffer = requireSafeBuffer;
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var index$2 = require('./index--P321c8v.cjs');
3
+ var index$2 = require('./index-B0zGksOA.cjs');
4
4
  var require$$0$2 = require('fs');
5
5
  var require$$2$1 = require('crypto');
6
6
  var require$$1$2 = require('path');
7
7
  var require$$0$3 = require('assert');
8
8
  var require$$4$2 = require('events');
9
9
  var require$$1$1 = require('util');
10
- var context$1 = require('./context-Bu0Zusj_.cjs');
10
+ var context$1 = require('./context-BEgbP7mM.cjs');
11
11
  var require$$0$5 = require('net');
12
12
  var require$$0$4 = require('url');
13
13
  var require$$2$2 = require('http');
@@ -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-vlPGi1Z8.cjs');
6
+ var session = require('./session-D7nmqMiy.cjs');
7
7
  var browser = require('./browser-RAy8e8cV.cjs');
8
- var index = require('./index--P321c8v.cjs');
8
+ var index = require('./index-B0zGksOA.cjs');
9
9
  require('node:path');
10
10
  require('fs');
11
11
  require('constants');
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
3
  var promises = require('node:readline/promises');
4
- var index = require('./index--P321c8v.cjs');
5
- var session = require('./session-vlPGi1Z8.cjs');
4
+ var index = require('./index-B0zGksOA.cjs');
5
+ var session = require('./session-D7nmqMiy.cjs');
6
6
  var childProcess = require('node:child_process');
7
7
  var fs = require('node:fs');
8
8
  var fs$1 = require('node:fs/promises');
9
9
  var path = require('node:path');
10
- var context = require('./context-Bu0Zusj_.cjs');
10
+ var context = require('./context-BEgbP7mM.cjs');
11
11
  require('node:module');
12
12
  require('path');
13
13
  require('os');
@@ -264,7 +264,7 @@ async function createDefaultCosClient(uploadToken) {
264
264
  };
265
265
  }
266
266
  async function loadCosConstructor() {
267
- const cosModule = await Promise.resolve().then(function () { return require('./index-CbsbCgtf.cjs'); }).then(function (n) { return n.index; });
267
+ const cosModule = await Promise.resolve().then(function () { return require('./index-BGFf6g7V.cjs'); }).then(function (n) { return n.index; });
268
268
  return cosModule.default;
269
269
  }
270
270
  function formatSize(bytes) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index--P321c8v.cjs');
3
+ var index = require('./index-B0zGksOA.cjs');
4
4
  var node_crypto = require('node:crypto');
5
5
  var path = require('node:path');
6
6
  var require$$0$2 = require('fs');
package/dist/cli.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./cli-chunks/index--P321c8v.cjs');
3
+ var index = require('./cli-chunks/index-B0zGksOA.cjs');
4
4
  require('node:module');
5
5
  require('node:fs');
6
6
  require('node:fs/promises');
@@ -20,7 +20,8 @@
20
20
  }
21
21
 
22
22
  button,
23
- input {
23
+ input,
24
+ select {
24
25
  font: inherit;
25
26
  }
26
27
 
@@ -190,6 +191,23 @@
190
191
  background: #fff;
191
192
  }
192
193
 
194
+ .release-diagnostics {
195
+ display: grid;
196
+ gap: 6px;
197
+ margin: 10px 0 0;
198
+ padding: 0;
199
+ list-style: none;
200
+ }
201
+
202
+ .release-diagnostics li {
203
+ border-left: 3px solid #d97706;
204
+ padding: 7px 8px;
205
+ color: #92400e;
206
+ background: #fffbeb;
207
+ font-size: 12px;
208
+ line-height: 1.5;
209
+ }
210
+
193
211
  .mobile-qr {
194
212
  display: grid;
195
213
  justify-items: center;
@@ -353,6 +371,22 @@
353
371
  <strong id="mini-url"></strong>
354
372
  </section>
355
373
 
374
+ <section class="block">
375
+ <span>Dev Context</span>
376
+ <strong id="dev-context-status"></strong>
377
+ <label class="field" style="margin-top: 10px">
378
+ <span>network.request</span>
379
+ <select id="network-permission-select">
380
+ <option value="disabled">拒绝</option>
381
+ <option value="enabled">允许</option>
382
+ </select>
383
+ </label>
384
+ <div class="actions" style="margin-top: 10px">
385
+ <button id="reset-permissions-button" type="button">恢复初始权限</button>
386
+ </div>
387
+ <ul class="release-diagnostics" id="release-diagnostics"></ul>
388
+ </section>
389
+
356
390
  <section class="csp-violations" id="csp-violations" hidden>
357
391
  <strong>网络或资源请求已被 CSP 阻止</strong>
358
392
  </section>