@heybox/hb-sdk 0.8.1-alpha.3 → 0.8.1-alpha.7

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 (63) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +47 -3
  3. package/dist/cli-chunks/{build-B5Sbi8Sq.cjs → build-C8oN_Ms9.cjs} +7 -5
  4. package/dist/cli-chunks/{context-DuxaBL3Y.cjs → context-DZkqvg9S.cjs} +8 -3
  5. package/dist/cli-chunks/{create-CIfZrg3F.cjs → create-CToSHRfO.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-CFubP5kW.cjs → dev-CTA0lsLD.cjs} +479 -140
  7. package/dist/cli-chunks/{doctor-IPKn3PBn.cjs → doctor-DRa_kjP1.cjs} +1 -1
  8. package/dist/cli-chunks/{index-KHhdZ8eZ.cjs → index-Bkl5YmtN.cjs} +2 -2
  9. package/dist/cli-chunks/{index-DCJN-V1y.cjs → index-zNpZDWhc.cjs} +87 -15
  10. package/dist/cli-chunks/{index.esm-8hgZlNF8.cjs → index.esm-CGoUW47e.cjs} +9 -8
  11. package/dist/cli-chunks/{login-CoB9jXxC.cjs → login-CCEPk2Ok.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-DMxdOWsU.cjs → project-vite-couFw5bL.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-D4ZcngLn.cjs → remote-DQ70o-Km.cjs} +33 -24
  14. package/dist/cli-chunks/{runtime-permission-env-XAZFauvZ.cjs → runtime-permission-env-BN43V7d0.cjs} +181 -16
  15. package/dist/cli-chunks/{session-BnoHxzFq.cjs → session-C1R_39si.cjs} +1 -1
  16. package/dist/cli-chunks/{skill-CDEJtATn.cjs → skill-CVXOE5jH.cjs} +83 -27
  17. package/dist/cli-chunks/{version-BGzCIQhE.cjs → version-DbDVL6vm.cjs} +1 -1
  18. package/dist/cli.cjs +1 -1
  19. package/dist/devtools/browser-dev-host/assets/browser-dev-host-CH6L1ZJI.js +101 -0
  20. package/dist/devtools/browser-dev-host/assets/desktop-app-launch-DnPRjCa3.js +6 -0
  21. package/dist/devtools/browser-dev-host/assets/index-D-aNERAr.css +1 -0
  22. package/dist/devtools/browser-dev-host/assets/index-DocojUxT.js +567 -0
  23. package/dist/devtools/browser-dev-host/index.html +3 -3
  24. package/dist/index.cjs.js +1893 -1571
  25. package/dist/index.esm.js +1893 -1572
  26. package/dist/miniapp-publish.cjs.js +61 -0
  27. package/dist/miniapp-publish.esm.js +59 -1
  28. package/dist/protocol.cjs.js +64 -13
  29. package/dist/protocol.esm.js +64 -13
  30. package/dist/vite.cjs.js +1316 -10
  31. package/dist/vite.esm.js +1317 -12
  32. package/package.json +7 -7
  33. package/skill/SKILL.md +8 -3
  34. package/skill/references/api-protocol.md +3 -3
  35. package/skill/references/api-root.md +224 -208
  36. package/skill/references/cli.md +7 -1
  37. package/skill/references/examples.md +4 -0
  38. package/skill/references/recipes.md +161 -0
  39. package/skill/references/safety-boundaries.md +8 -2
  40. package/skill/skill.json +5 -5
  41. package/types/core/client.d.ts +2 -0
  42. package/types/core/sdk.d.ts +3 -0
  43. package/types/core/singleton.d.ts +3 -0
  44. package/types/devtools/device-logs.d.ts +48 -0
  45. package/types/index.d.ts +3 -1
  46. package/types/miniapp-manifest/companion-directory.d.ts +2 -0
  47. package/types/miniapp-manifest/companion-executable.d.ts +4 -0
  48. package/types/miniapp-manifest/companion-types.d.ts +38 -0
  49. package/types/miniapp-manifest/companions.d.ts +17 -0
  50. package/types/miniapp-manifest/index.d.ts +2 -0
  51. package/types/miniapp-manifest/node.d.ts +7 -0
  52. package/types/miniapp-manifest/permissions.d.ts +1 -1
  53. package/types/miniapp-manifest/schema.d.ts +4 -1
  54. package/types/miniapp-publish/index.d.ts +17 -2
  55. package/types/modules/companion/index.d.ts +57 -0
  56. package/types/modules/network/index.d.ts +1 -4
  57. package/types/modules/network/observability.d.ts +0 -1
  58. package/types/protocol/dev-session.d.ts +6 -0
  59. package/types/vite/index.d.ts +10 -0
  60. package/dist/devtools/browser-dev-host/assets/browser-dev-host-DzEst9n7.js +0 -99
  61. package/dist/devtools/browser-dev-host/assets/index-B-NHlLsr.js +0 -567
  62. package/dist/devtools/browser-dev-host/assets/index-P-ra4m1y.css +0 -1
  63. package/dist/devtools/browser-dev-host/assets/workbench-state-BwV7bm4n.js +0 -5
@@ -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-DCJN-V1y.cjs');
6
+ var index = require('./index-zNpZDWhc.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-DCJN-V1y.cjs');
3
+ var index$2 = require('./index-zNpZDWhc.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-XAZFauvZ.cjs');
10
+ var runtimePermissionEnv = require('./runtime-permission-env-BN43V7d0.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');
@@ -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-DCJN-V1y.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-zNpZDWhc.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-DCJN-V1y.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-zNpZDWhc.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-DCJN-V1y.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-zNpZDWhc.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-DCJN-V1y.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-zNpZDWhc.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-DCJN-V1y.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-zNpZDWhc.cjs', document.baseURI).href)));
250
250
  function __require() { return require$1("node:process"); }
251
251
 
252
252
  var help = {};
@@ -3795,6 +3795,77 @@ const {
3795
3795
  Help,
3796
3796
  } = commander;
3797
3797
 
3798
+ /** Agent 输出只使用 stdout JSON/NDJSON,不混入交互提示。 */
3799
+ function installDevLogCommands(dev) {
3800
+ dev.command('sandbox').description('查看设备沙箱').command('list')
3801
+ .requiredOption('--device <id>', '设备会话 ID').option('--path <path>', '逻辑目录', '.')
3802
+ .option('--port <port>', '调试台端口', '5174').option('--json', 'JSON 输出')
3803
+ .action(async (options, command) => {
3804
+ const port = Number(command.parent?.parent?.opts().port ?? options.port);
3805
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
3806
+ throw new Error('端口无效');
3807
+ const origin = `http://127.0.0.1:${port}`;
3808
+ const bootstrap = await (await fetch(origin + '/__hb_sdk_bootstrap__', { signal: AbortSignal.timeout(5000), redirect: 'error' })).json();
3809
+ const response = await fetch(origin + '/__hb_sdk__/sandbox', { method: 'POST', redirect: 'error', headers: { origin, 'content-type': 'application/json', 'x-hb-sdk-csrf': bootstrap.csrfToken }, body: JSON.stringify({ device: options.device, path: options.path }), signal: AbortSignal.timeout(12000) });
3810
+ if (!response.ok)
3811
+ throw new Error(`目录查询失败:HTTP ${response.status}`);
3812
+ process.stdout.write(JSON.stringify(await response.json()) + '\n');
3813
+ });
3814
+ for (const kind of ['logs', 'devices']) {
3815
+ dev
3816
+ .command(kind)
3817
+ .description(kind === 'logs' ? '读取多设备调试日志' : '列出调试设备会话')
3818
+ .option('--port <port>', '调试台端口', '5174')
3819
+ .option('--json', '输出机器可读 JSON')
3820
+ .option('--device <id>', '设备会话 ID')
3821
+ .option('--level <level>', '日志级别')
3822
+ .option('--source <source>', '日志来源')
3823
+ .option('--query <text>', '搜索输出')
3824
+ .option('--callId <id>', '关联 SDK 调用 ID')
3825
+ .option('--id <id>', '读取服务端日志 ID')
3826
+ .option('--since <timestamp>', '设备时间下界,毫秒')
3827
+ .option('--after <cursor>', '从游标后继续读取', '0')
3828
+ .option('--limit <count>', '每页条数', '100')
3829
+ .option('--follow', '持续输出 NDJSON')
3830
+ .option('--duration <seconds>', '持续读取时长,默认 60 秒', '60')
3831
+ .action(async (options, command) => {
3832
+ const port = Number(command.parent?.opts().port ?? options.port);
3833
+ const duration = Number(options.duration);
3834
+ if (!Number.isInteger(port) || port < 1 || port > 65535 || !Number.isFinite(duration) || duration <= 0)
3835
+ throw new Error('端口或持续时间无效');
3836
+ const params = new URLSearchParams();
3837
+ for (const key of ['device', 'level', 'source', 'query', 'after', 'limit', 'callId', 'id', 'since'])
3838
+ if (options[key])
3839
+ params.set(key, options[key]);
3840
+ let epoch = '';
3841
+ const deadline = Date.now() + duration * 1000;
3842
+ do {
3843
+ const response = await fetch(`http://127.0.0.1:${port}/__hb_sdk__/device-logs?${params}`, {
3844
+ signal: AbortSignal.timeout(5000),
3845
+ redirect: 'error',
3846
+ });
3847
+ if (!response.ok)
3848
+ throw new Error(`日志读取失败:HTTP ${response.status}`);
3849
+ const page = await response.json();
3850
+ if (!page.epoch)
3851
+ throw new Error('当前调试台没有设备日志服务,请确认项目使用 miniappManifest 并通过 hb-sdk dev 启动');
3852
+ if (epoch && epoch !== page.epoch) {
3853
+ params.set('after', '0');
3854
+ epoch = page.epoch;
3855
+ continue;
3856
+ }
3857
+ epoch = page.epoch;
3858
+ process.stdout.write(JSON.stringify(kind === 'devices' ? { epoch, devices: page.devices } : page) + '\n');
3859
+ params.set('after', String(page.nextCursor));
3860
+ if (!options.follow)
3861
+ break;
3862
+ if (!page.hasMore)
3863
+ await new Promise((resolve) => setTimeout(resolve, 1000));
3864
+ } while (Date.now() < deadline);
3865
+ });
3866
+ }
3867
+ }
3868
+
3798
3869
  var envPaths$1 = {exports: {}};
3799
3870
 
3800
3871
  var hasRequiredEnvPaths;
@@ -13353,7 +13424,7 @@ function getPathname(pathWithQuery) {
13353
13424
  }
13354
13425
 
13355
13426
  const CLI_VERSION_PLACEHOLDER = ['__HB', 'SDK', 'CLI', 'VERSION__'].join('_');
13356
- const BUILT_CLI_VERSION = '0.8.1-alpha.3';
13427
+ const BUILT_CLI_VERSION = '0.8.1-alpha.7';
13357
13428
  const PACKAGE_JSON_CANDIDATES = [
13358
13429
  path.resolve(__dirname, '..', '..', 'package.json'),
13359
13430
  path.resolve(__dirname, '..', 'package.json'),
@@ -13447,6 +13518,7 @@ function createCliProgram(overrides = {}) {
13447
13518
  const logger = resolveLogger(command);
13448
13519
  await handlers.runDevCommand(options, { logger });
13449
13520
  }, handlers.printUpdateReminder, resolveLogger));
13521
+ installDevLogCommands(program.commands.find(command => command.name() === 'dev'));
13450
13522
  addVerboseOption(program.command('build').description('构建当前小程序项目').option('--env <name>', '加载项目根下 .env.<name> 预设并作为 Vite mode')).action(async (...args) => {
13451
13523
  const command = readCommandFromActionArgs(args);
13452
13524
  if (!command) {
@@ -13701,39 +13773,39 @@ function createCommandLoggerResolver(options) {
13701
13773
  };
13702
13774
  }
13703
13775
  const defaultClearLoginStatus = async (...args) => {
13704
- const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-CoB9jXxC.cjs'); });
13776
+ const { clearLoginStatus } = await Promise.resolve().then(function () { return require('./login-CCEPk2Ok.cjs'); });
13705
13777
  return clearLoginStatus(...args);
13706
13778
  };
13707
13779
  const defaultLoginToHeybox = async (...args) => {
13708
- const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-CoB9jXxC.cjs'); });
13780
+ const { loginToHeybox } = await Promise.resolve().then(function () { return require('./login-CCEPk2Ok.cjs'); });
13709
13781
  return loginToHeybox(...args);
13710
13782
  };
13711
13783
  const defaultPrintLoginStatus = async (...args) => {
13712
- const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-CoB9jXxC.cjs'); });
13784
+ const { printLoginStatus } = await Promise.resolve().then(function () { return require('./login-CCEPk2Ok.cjs'); });
13713
13785
  return printLoginStatus(...args);
13714
13786
  };
13715
13787
  const defaultRunBuildCommand = async (...args) => {
13716
- const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-B5Sbi8Sq.cjs'); });
13788
+ const { runBuildCommand } = await Promise.resolve().then(function () { return require('./build-C8oN_Ms9.cjs'); });
13717
13789
  return runBuildCommand(...args);
13718
13790
  };
13719
13791
  const defaultRunCreateCommand = async (...args) => {
13720
- const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-CIfZrg3F.cjs'); });
13792
+ const { runCreateCommand } = await Promise.resolve().then(function () { return require('./create-CToSHRfO.cjs'); });
13721
13793
  return runCreateCommand(...args);
13722
13794
  };
13723
13795
  const defaultRunDevCommand = async (...args) => {
13724
- const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-CFubP5kW.cjs'); }).then(function (n) { return n.dev; });
13796
+ const { runDevCommand } = await Promise.resolve().then(function () { return require('./dev-CTA0lsLD.cjs'); }).then(function (n) { return n.dev; });
13725
13797
  return runDevCommand(...args);
13726
13798
  };
13727
13799
  const defaultRunDoctorCommand = async (...args) => {
13728
- const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-IPKn3PBn.cjs'); });
13800
+ const { runDoctorCommand } = await Promise.resolve().then(function () { return require('./doctor-DRa_kjP1.cjs'); });
13729
13801
  return runDoctorCommand(...args);
13730
13802
  };
13731
13803
  const defaultRunSkillInstallCommand = async (...args) => {
13732
- const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-CDEJtATn.cjs'); });
13804
+ const { runSkillInstallCommand } = await Promise.resolve().then(function () { return require('./skill-CVXOE5jH.cjs'); });
13733
13805
  return runSkillInstallCommand(...args);
13734
13806
  };
13735
13807
  const defaultRunRemoteCommand = async (...args) => {
13736
- const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-D4ZcngLn.cjs'); });
13808
+ const { runRemoteCommand } = await Promise.resolve().then(function () { return require('./remote-DQ70o-Km.cjs'); });
13737
13809
  return runRemoteCommand(...args);
13738
13810
  };
13739
13811
  function resolveStandaloneLogger(options, verbose) {
@@ -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-DCJN-V1y.cjs');
15
- var dev = require('./dev-CFubP5kW.cjs');
14
+ var index = require('./index-zNpZDWhc.cjs');
15
+ var dev = require('./dev-CTA0lsLD.cjs');
16
16
  require('node:module');
17
17
  require('node:fs');
18
18
  require('node:fs/promises');
@@ -22,16 +22,16 @@ require('os');
22
22
  require('readline');
23
23
  require('tty');
24
24
  require('assert');
25
+ require('node:crypto');
25
26
  require('node:os');
26
27
  require('node:net');
27
- require('node:crypto');
28
28
  require('node:dns/promises');
29
29
  require('node:http');
30
- require('./context-DuxaBL3Y.cjs');
31
- require('./runtime-permission-env-XAZFauvZ.cjs');
32
- require('./version-BGzCIQhE.cjs');
30
+ require('./context-DZkqvg9S.cjs');
31
+ require('./runtime-permission-env-BN43V7d0.cjs');
32
+ require('./version-DbDVL6vm.cjs');
33
33
  require('node:async_hooks');
34
- require('./session-BnoHxzFq.cjs');
34
+ require('./session-C1R_39si.cjs');
35
35
  require('fs');
36
36
  require('constants');
37
37
  require('undici');
@@ -41,7 +41,8 @@ require('node:buffer');
41
41
  require('node:url');
42
42
  require('node:util');
43
43
  require('node:child_process');
44
- require('./project-vite-DMxdOWsU.cjs');
44
+ require('./project-vite-couFw5bL.cjs');
45
+ require('node:zlib');
45
46
 
46
47
  var bufferUtil = {exports: {}};
47
48
 
@@ -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-BnoHxzFq.cjs');
6
+ var session = require('./session-C1R_39si.cjs');
7
7
  var browser = require('./browser-RAy8e8cV.cjs');
8
- var index = require('./index-DCJN-V1y.cjs');
8
+ var index = require('./index-zNpZDWhc.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-DCJN-V1y.cjs');
8
+ var index = require('./index-zNpZDWhc.cjs');
9
9
 
10
10
  function findProjectRoot(startDir) {
11
11
  let current = path.resolve(startDir);
@@ -1,16 +1,17 @@
1
1
  'use strict';
2
2
 
3
3
  var promises = require('node:readline/promises');
4
- var index = require('./index-DCJN-V1y.cjs');
5
- var session = require('./session-BnoHxzFq.cjs');
4
+ var index = require('./index-zNpZDWhc.cjs');
5
+ var session = require('./session-C1R_39si.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 runtimePermissionEnv = require('./runtime-permission-env-XAZFauvZ.cjs');
10
+ var runtimePermissionEnv = require('./runtime-permission-env-BN43V7d0.cjs');
11
11
  var node_crypto = require('node:crypto');
12
+ require('node:zlib');
12
13
  var runtimeGate = require('./runtime-gate-BWb8QIcX.cjs');
13
- var context = require('./context-DuxaBL3Y.cjs');
14
+ var context = require('./context-DZkqvg9S.cjs');
14
15
  require('node:module');
15
16
  require('path');
16
17
  require('os');
@@ -23,7 +24,7 @@ require('buffer');
23
24
  require('util');
24
25
  require('fs');
25
26
  require('constants');
26
- require('./version-BGzCIQhE.cjs');
27
+ require('./version-DbDVL6vm.cjs');
27
28
  require('node:async_hooks');
28
29
 
29
30
  async function getCDNUploadInfo(options, runtime = {}) {
@@ -86,15 +87,14 @@ async function createUserMiniprogramUploadSession(options, runtime = {}) {
86
87
  return postUserMiniprogramVersionForm(CREATE_USER_MINIPROGRAM_UPLOAD_SESSION_API_PATH, options, {
87
88
  version: options.version,
88
89
  artifact_signature: options.artifactSignature,
89
- relative_paths: options.relativePaths.join(','),
90
- file_sizes: options.fileSizes.map(size => String(size)).join(','),
90
+ files: JSON.stringify(options.files),
91
91
  }, runtime);
92
92
  }
93
93
  async function recordUserMiniprogramUploadResult(options, runtime = {}) {
94
94
  await postUserMiniprogramVersionForm(RECORD_USER_MINIPROGRAM_UPLOAD_RESULT_API_PATH, options, {
95
95
  version: options.version,
96
96
  session_id: options.sessionId,
97
- keys: options.keys.join(','),
97
+ files: JSON.stringify(options.files),
98
98
  }, runtime);
99
99
  }
100
100
  async function postUserMiniprogramVersionForm(path, options, fields, runtime) {
@@ -209,7 +209,9 @@ async function runUpload(options, runtime = {}) {
209
209
  miniProgramId: options.miniProgramId,
210
210
  version: options.version,
211
211
  sessionId: options.uploadSessionId,
212
- keys: successfulKeys,
212
+ files: indexedFiles
213
+ .filter((item) => successfulKeys.includes(item.key))
214
+ .map((item) => ({ path: item.file.relativePath, size: item.file.size, sha256: item.file.sha256 })),
213
215
  }, { baseUrl: runtime.baseUrl, fetchImpl });
214
216
  }
215
217
  if (firstUploadError) {
@@ -272,7 +274,7 @@ function createDefaultCosClient(uploadToken, COS) {
272
274
  };
273
275
  }
274
276
  async function loadCosConstructor() {
275
- const cosModule = await Promise.resolve().then(function () { return require('./index-KHhdZ8eZ.cjs'); }).then(function (n) { return n.index; });
277
+ const cosModule = await Promise.resolve().then(function () { return require('./index-Bkl5YmtN.cjs'); }).then(function (n) { return n.index; });
276
278
  return cosModule.default;
277
279
  }
278
280
  function formatSize(bytes) {
@@ -315,24 +317,28 @@ function isRecord(value) {
315
317
  return Object.prototype.toString.call(value) === '[object Object]';
316
318
  }
317
319
 
318
- async function computeMiniappArtifactSignature(files, runtime = {}) {
320
+ /** 单次流式读取同时生成整包签名和逐文件 SHA-256 receipt。 */
321
+ async function computeMiniappArtifactReceipt(files, runtime = {}) {
319
322
  const preparedFiles = runtimePermissionEnv.prepareMiniappArtifactFiles(files);
320
323
  const hash = node_crypto.createHash('sha256');
321
324
  const createReadStream = runtime.createReadStream ?? fs.createReadStream;
322
325
  hash.update(runtimePermissionEnv.createMiniappArtifactSignatureHeader(preparedFiles.length));
323
326
  for (const file of preparedFiles) {
324
327
  hash.update(runtimePermissionEnv.createMiniappArtifactFileHeader(file));
328
+ const fileHash = node_crypto.createHash('sha256');
325
329
  let bytesRead = 0;
326
330
  for await (const chunk of createReadStream(file.absolutePath)) {
327
331
  const bytes = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
328
332
  bytesRead += bytes.byteLength;
329
333
  hash.update(bytes);
334
+ fileHash.update(bytes);
330
335
  }
331
336
  if (bytesRead !== file.size) {
332
337
  throw new Error(`构建产物在签名期间发生变化:${file.relativePath}`);
333
338
  }
339
+ Object.assign(file, { sha256: fileHash.digest('hex') });
334
340
  }
335
- return hash.digest('hex');
341
+ return { artifactSignature: hash.digest('hex'), files: preparedFiles };
336
342
  }
337
343
 
338
344
  const DEPLOY_LOCKED_MESSAGE = '当前设备已有同版本产物正在上传,请等待完成后重试';
@@ -601,7 +607,7 @@ async function runDeployCommand(options, runtime = {}) {
601
607
  if (pathError) {
602
608
  throw new Error(pathError);
603
609
  }
604
- const sizeError = runtimePermissionEnv.validateUploadTotalSize(files);
610
+ const sizeError = runtimePermissionEnv.validateMiniappUploadSizeBudgets(files);
605
611
  if (sizeError) {
606
612
  throw new Error(sizeError);
607
613
  }
@@ -609,20 +615,23 @@ async function runDeployCommand(options, runtime = {}) {
609
615
  return files;
610
616
  }, { successText: 'dist 上传文件校验完成' });
611
617
  // deploy 期间 dist 视为稳定构建输出;为避免持有大量文件描述符,签名和上传不会共享打开的文件句柄。
612
- const artifactSignature = await logger.task('正在计算构建产物签名', () => (runtime.computeMiniappArtifactSignature ?? computeMiniappArtifactSignature)(uploadFiles), { successText: '构建产物签名计算完成' });
618
+ const artifactReceipt = await logger.task('正在计算构建产物签名', () => (runtime.computeMiniappArtifactReceipt ?? computeMiniappArtifactReceipt)(uploadFiles), { successText: '构建产物签名计算完成' });
619
+ runtimePermissionEnv.validateMiniappCompanionFileReceipts(manifest?.companions, artifactReceipt.files);
613
620
  const createdUploadSession = await logger.task('正在创建或恢复上传会话', async () => {
614
621
  const result = await (runtime.createUserMiniprogramUploadSession ?? createUserMiniprogramUploadSession)({
615
622
  session: session$1,
616
623
  miniProgramId,
617
624
  version,
618
- artifactSignature,
619
- relativePaths: uploadFiles.map((file) => file.relativePath),
620
- fileSizes: uploadFiles.map((file) => file.size),
625
+ artifactSignature: artifactReceipt.artifactSignature,
626
+ files: artifactReceipt.files.map((file) => ({ path: file.relativePath, size: file.size, sha256: file.sha256 })),
621
627
  }, { baseUrl: apiBaseUrl, fetchImpl: runtime.fetchImpl });
622
628
  if (typeof result.session_id !== 'string' || !result.session_id.trim()) {
623
629
  throw new Error('创建上传会话失败:服务端未返回 session_id');
624
630
  }
625
- const resolved = runtimePermissionEnv.resolveMiniappUploadSessionFiles(uploadFiles, Array.isArray(result.files) ? result.files : [], Array.isArray(result.uploaded_keys) ? result.uploaded_keys : []);
631
+ if (result.file_receipt_version !== 1) {
632
+ throw new Error('创建上传会话失败:服务端不支持文件完整性 receipt v1,请升级服务端后重试');
633
+ }
634
+ const resolved = runtimePermissionEnv.resolveMiniappUploadSessionFiles(artifactReceipt.files, Array.isArray(result.files) ? result.files : [], Array.isArray(result.uploaded_keys) ? result.uploaded_keys : []);
626
635
  return {
627
636
  sessionId: result.session_id.trim(),
628
637
  files: resolved.files,
@@ -637,10 +646,10 @@ async function runDeployCommand(options, runtime = {}) {
637
646
  try {
638
647
  if (createdUploadSession.missingFiles.length > 0) {
639
648
  await assertDeployUploadFilesStillMatchSignature({
640
- computeMiniappArtifactSignature: runtime.computeMiniappArtifactSignature ?? computeMiniappArtifactSignature,
649
+ computeMiniappArtifactReceipt: runtime.computeMiniappArtifactReceipt ?? computeMiniappArtifactReceipt,
641
650
  distDir,
642
- expectedFiles: uploadFiles,
643
- expectedSignature: artifactSignature,
651
+ expectedFiles: artifactReceipt.files,
652
+ expectedSignature: artifactReceipt.artifactSignature,
644
653
  miniProgramId,
645
654
  });
646
655
  await (runtime.runUpload ?? runUpload)({
@@ -912,12 +921,12 @@ async function assertDeployUploadFilesStillMatchSignature(options) {
912
921
  if (pathError) {
913
922
  throw new Error(pathError);
914
923
  }
915
- const sizeError = runtimePermissionEnv.validateUploadTotalSize(currentFiles);
924
+ const sizeError = runtimePermissionEnv.validateMiniappUploadSizeBudgets(currentFiles);
916
925
  if (sizeError) {
917
926
  throw new Error(sizeError);
918
927
  }
919
- const currentSignature = await options.computeMiniappArtifactSignature(currentFiles);
920
- if (currentSignature !== options.expectedSignature) {
928
+ const currentReceipt = await options.computeMiniappArtifactReceipt(currentFiles);
929
+ if (currentReceipt.artifactSignature !== options.expectedSignature) {
921
930
  throw new Error('dist 构建产物在签名后发生变化,请重新 build 后再 deploy');
922
931
  }
923
932
  }