@heybox/hb-sdk 0.9.1-alpha.0 → 0.9.1-alpha.10

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 (114) hide show
  1. package/CHANGELOG.md +123 -2
  2. package/README.md +45 -7
  3. package/dist/card-controller.cjs.js +194 -0
  4. package/dist/card-controller.esm.js +159 -0
  5. package/dist/cli-chunks/_commonjs-dynamic-modules-DUamuDzp.cjs +7 -0
  6. package/dist/cli-chunks/{build-DqZ4DwUv.cjs → build-BK0MOduC.cjs} +15 -7
  7. package/dist/cli-chunks/{context-D_VhP5QF.cjs → context-D7AFyc_9.cjs} +14 -14
  8. package/dist/cli-chunks/{create-xNSgjouq.cjs → create-C-pAXZR_.cjs} +5 -3
  9. package/dist/cli-chunks/{dev-IsUsrbjC.cjs → dev-CONKtd6c.cjs} +59 -14
  10. package/dist/cli-chunks/{doctor-BD-IXRyP.cjs → doctor-D18leeH7.cjs} +8 -5
  11. package/dist/cli-chunks/{index-CUebAm7J.cjs → index-BWRDIX1T.cjs} +7851 -486
  12. package/dist/cli-chunks/{index-HUjK7vn8.cjs → index-DJoBhXcG.cjs} +9 -13
  13. package/dist/cli-chunks/{index.esm-Bj9uKrhv.cjs → index.esm-CtAKePcf.cjs} +36 -37
  14. package/dist/cli-chunks/{login-D8GoAMYG.cjs → login-BHq8vDRt.cjs} +36 -36
  15. package/dist/cli-chunks/{project-vite-CzIodp6y.cjs → project-vite-DD3bmbqm.cjs} +1 -1
  16. package/dist/cli-chunks/{remote-nQq3nAUy.cjs → remote-DeLLzkXt.cjs} +71 -90
  17. package/dist/cli-chunks/runtime-gate-wKj1l5xM.cjs +201946 -0
  18. package/dist/cli-chunks/{runtime-permission-env-B_poIoGP.cjs → runtime-permission-env-DBra_0-U.cjs} +7012 -3305
  19. package/dist/cli-chunks/{skill-DZK8UAXb.cjs → skill-Cq3wjRBj.cjs} +9 -6
  20. package/dist/cli-chunks/{version-CNYpJdS7.cjs → version-BF4JQQCU.cjs} +1 -1
  21. package/dist/cli.cjs +10 -7
  22. package/dist/devtools/browser-dev-host/assets/browser-dev-host-C4b9nlYA.js +102 -0
  23. package/dist/devtools/browser-dev-host/assets/desktop-app-launch-DXmUwcoE.js +6 -0
  24. package/dist/devtools/browser-dev-host/assets/index-BRxbUJVN.css +1 -0
  25. package/dist/devtools/browser-dev-host/assets/{index-IDyoULwK.js → index-CVZ3CdPt.js} +4 -4
  26. package/dist/devtools/browser-dev-host/index.html +3 -3
  27. package/dist/index.cjs.js +6333 -282
  28. package/dist/index.esm.js +6333 -283
  29. package/dist/miniapp-publish.cjs.js +6613 -157
  30. package/dist/miniapp-publish.esm.js +6613 -158
  31. package/dist/protocol.cjs.js +5824 -0
  32. package/dist/protocol.esm.js +5823 -1
  33. package/dist/vite.cjs.js +7476 -206
  34. package/dist/vite.esm.js +7475 -207
  35. package/dist/workspace-card-build-sandbox-worker.mjs +72 -0
  36. package/package.json +33 -18
  37. package/skill/SKILL.md +15 -0
  38. package/skill/skill.json +5 -5
  39. package/types/card-controller.d.ts +3682 -0
  40. package/types/index.d.ts +7639 -35
  41. package/types/miniapp-publish/index.d.ts +542 -64
  42. package/types/protocol.d.ts +2094 -9
  43. package/types/vite/index.d.ts +25 -12
  44. package/dist/cli-chunks/runtime-gate-uTsNPu3U.cjs +0 -65
  45. package/dist/cli-chunks/session-DDNple9k.cjs +0 -3403
  46. package/dist/devtools/browser-dev-host/assets/browser-dev-host-YJT0-SwX.js +0 -102
  47. package/dist/devtools/browser-dev-host/assets/desktop-app-launch-GMEmtpsR.js +0 -6
  48. package/dist/devtools/browser-dev-host/assets/index-DRM3hPNc.css +0 -1
  49. package/types/core/client.d.ts +0 -108
  50. package/types/core/csp-violation.d.ts +0 -5
  51. package/types/core/errors.d.ts +0 -78
  52. package/types/core/event-bus.d.ts +0 -11
  53. package/types/core/handshake-state.d.ts +0 -54
  54. package/types/core/history-observer.d.ts +0 -4
  55. package/types/core/mini-dev-console.d.ts +0 -36
  56. package/types/core/network-sanitize.d.ts +0 -31
  57. package/types/core/sdk.d.ts +0 -104
  58. package/types/core/singleton.d.ts +0 -372
  59. package/types/core/utils.d.ts +0 -10
  60. package/types/core/version.d.ts +0 -2
  61. package/types/devtools/device-logs.d.ts +0 -48
  62. package/types/miniapp-manifest/basic-info-browser.d.ts +0 -37
  63. package/types/miniapp-manifest/basic-info-image-header.d.ts +0 -6
  64. package/types/miniapp-manifest/basic-info-node.d.ts +0 -17
  65. package/types/miniapp-manifest/basic-info-placeholder.d.ts +0 -1
  66. package/types/miniapp-manifest/basic-info.d.ts +0 -33
  67. package/types/miniapp-manifest/bindings.d.ts +0 -70
  68. package/types/miniapp-manifest/category.d.ts +0 -11
  69. package/types/miniapp-manifest/companion-directory.d.ts +0 -2
  70. package/types/miniapp-manifest/companion-executable.d.ts +0 -4
  71. package/types/miniapp-manifest/companion-types.d.ts +0 -63
  72. package/types/miniapp-manifest/companions.d.ts +0 -17
  73. package/types/miniapp-manifest/index.d.ts +0 -7
  74. package/types/miniapp-manifest/node.d.ts +0 -22
  75. package/types/miniapp-manifest/permissions.d.ts +0 -48
  76. package/types/miniapp-manifest/runtime-gate.d.ts +0 -12
  77. package/types/miniapp-manifest/schema.d.ts +0 -302
  78. package/types/modules/auth/index.d.ts +0 -201
  79. package/types/modules/cloud/index.d.ts +0 -669
  80. package/types/modules/companion/index.d.ts +0 -1619
  81. package/types/modules/device/index.d.ts +0 -193
  82. package/types/modules/environment/index.d.ts +0 -238
  83. package/types/modules/files/index.d.ts +0 -5
  84. package/types/modules/files/registry.d.ts +0 -35
  85. package/types/modules/files/types.d.ts +0 -1548
  86. package/types/modules/navigation/app-pages/index.d.ts +0 -4
  87. package/types/modules/navigation/app-pages/types.d.ts +0 -135
  88. package/types/modules/navigation/index.d.ts +0 -312
  89. package/types/modules/network/index.d.ts +0 -457
  90. package/types/modules/network/observability.d.ts +0 -38
  91. package/types/modules/network/request-shape.d.ts +0 -44
  92. package/types/modules/share/copy-link.d.ts +0 -46
  93. package/types/modules/share/extra.d.ts +0 -5
  94. package/types/modules/share/index.d.ts +0 -294
  95. package/types/modules/share/screenshot.d.ts +0 -34
  96. package/types/modules/share/show-share-menu.d.ts +0 -29
  97. package/types/modules/share/types.d.ts +0 -201
  98. package/types/modules/storage/index.d.ts +0 -214
  99. package/types/modules/ui/index.d.ts +0 -315
  100. package/types/modules/user/get-info.d.ts +0 -44
  101. package/types/modules/user/index.d.ts +0 -245
  102. package/types/modules/user/revoke-authorization.d.ts +0 -31
  103. package/types/modules/user/steam-game-list.d.ts +0 -153
  104. package/types/modules/user/types.d.ts +0 -2
  105. package/types/modules/viewport/index.d.ts +0 -319
  106. package/types/protocol/capabilities.d.ts +0 -2
  107. package/types/protocol/constants.d.ts +0 -1
  108. package/types/protocol/dev-session.d.ts +0 -74
  109. package/types/protocol/guards.d.ts +0 -1
  110. package/types/protocol/runtime-permissions.d.ts +0 -2
  111. package/types/protocol/types.d.ts +0 -22
  112. package/types/skill-metadata.d.ts +0 -18
  113. package/types/vite/html-policy.d.ts +0 -6
  114. package/types/vite/runtime-permission-env.d.ts +0 -9
@@ -1,71 +1,38 @@
1
1
  'use strict';
2
2
 
3
- var runtimePermissionEnv = require('./runtime-permission-env-B_poIoGP.cjs');
4
- var context = require('./context-D_VhP5QF.cjs');
3
+ var runtimePermissionEnv = require('./runtime-permission-env-DBra_0-U.cjs');
4
+ var context = require('./context-D7AFyc_9.cjs');
5
5
  var promises = require('node:readline/promises');
6
- var index = require('./index-CUebAm7J.cjs');
7
- var session = require('./session-DDNple9k.cjs');
6
+ var index = require('./index-BWRDIX1T.cjs');
7
+ var runtimeGate = require('./runtime-gate-wKj1l5xM.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-uTsNPu3U.cjs');
15
- require('./version-CNYpJdS7.cjs');
14
+ require('./version-BF4JQQCU.cjs');
16
15
  require('node:async_hooks');
17
16
  require('sharp');
18
17
  require('node:module');
19
- require('path');
20
- require('os');
21
18
  require('readline');
19
+ require('os');
22
20
  require('tty');
23
21
  require('assert');
24
22
  require('events');
25
23
  require('stream');
26
24
  require('buffer');
27
25
  require('util');
26
+ require('path');
28
27
  require('fs');
29
28
  require('constants');
29
+ require('node:url');
30
+ require('./_commonjs-dynamic-modules-DUamuDzp.cjs');
31
+ require('inspector');
30
32
 
31
33
  // 脚手架开发占位图;构建可用,提审前必须替换。
32
34
  const BASIC_INFO_PLACEHOLDER_SHA256 = 'd14e54b30f5e6d1bcbf51267bc82b06a0af7c333f2945bcc16b4e1adc3b123dd';
33
35
 
34
- async function getCDNUploadInfo(options, runtime = {}) {
35
- const body = new URLSearchParams();
36
- body.set('file_infos', JSON.stringify(options.fileInfos));
37
- body.set('scope', options.scope);
38
- body.set('need_cache', options.needCache ? '1' : '0');
39
- return postHeyboxApi('/bbs/app/api/qcloud/cos/upload/info/v2', body, options.session, runtime);
40
- }
41
- async function getCDNUploadToken(options, runtime = {}) {
42
- const body = new URLSearchParams();
43
- body.set('bucket', options.bucket);
44
- body.set('keys', JSON.stringify(options.keys));
45
- body.set('mimetypes', JSON.stringify(options.mimetypes));
46
- body.set('is_multipart_upload', String(options.isMultipartUpload));
47
- return postHeyboxApi('/bbs/app/api/qcloud/cos/upload/token/v2', body, options.session, runtime);
48
- }
49
- async function postCDNUploadCallback(options, runtime = {}) {
50
- const body = new URLSearchParams();
51
- body.set('keys', JSON.stringify(options.keys));
52
- const query = options.isFinished ? '?is_finished=true' : '';
53
- return postHeyboxApi(`/bbs/app/api/qcloud/cos/upload/callback/v2${query}`, body, options.session, runtime);
54
- }
55
- async function postHeyboxApi(pathWithQuery, body, session$1, runtime) {
56
- const fetchImpl = runtime.fetchImpl ?? fetch;
57
- const context = session.createHeyboxOpenPlatformRequestContext(session$1, pathWithQuery, {
58
- contentType: 'application/x-www-form-urlencoded',
59
- });
60
- const response = await fetchImpl(session.createHeyboxApiUrl(runtime.baseUrl ?? context.baseUrl, pathWithQuery, context.platformParams), {
61
- method: 'POST',
62
- headers: context.headers,
63
- body: body.toString(),
64
- });
65
- const result = await session.readHeyboxApiEnvelope(response, { pathWithQuery, requireResult: true });
66
- return result;
67
- }
68
-
69
36
  const CREATE_USER_MINIPROGRAM_UPLOAD_SESSION_API_PATH = '/mall/developer/user_miniprogram/version/upload_session/create';
70
37
  const RECORD_USER_MINIPROGRAM_UPLOAD_RESULT_API_PATH = '/mall/developer/user_miniprogram/version/upload_session/record';
71
38
  const COMPANION_FINALIZATION_TIMEOUT_MS = 30 * 60_000;
@@ -124,7 +91,7 @@ async function recordUserMiniprogramUploadResult(options, runtime = {}) {
124
91
  }
125
92
  async function postUserMiniprogramVersionForm(path, options, fields, runtime) {
126
93
  const fetchImpl = runtime.fetchImpl ?? fetch;
127
- const context = session.createHeyboxOpenPlatformRequestContext(options.session, path, {
94
+ const context = index.createHeyboxOpenPlatformRequestContext(options.session, path, {
128
95
  contentType: 'application/x-www-form-urlencoded',
129
96
  });
130
97
  const body = new URLSearchParams();
@@ -132,12 +99,12 @@ async function postUserMiniprogramVersionForm(path, options, fields, runtime) {
132
99
  for (const [key, value] of Object.entries(fields)) {
133
100
  body.set(key, value);
134
101
  }
135
- const response = await fetchImpl(session.createHeyboxApiUrl(runtime.baseUrl ?? context.baseUrl, path, context.platformParams), {
102
+ const response = await fetchImpl(index.createHeyboxApiUrl(runtime.baseUrl ?? context.baseUrl, path, context.platformParams), {
136
103
  method: 'POST',
137
104
  headers: context.headers,
138
105
  body: body.toString(),
139
106
  });
140
- const result = await session.readHeyboxApiEnvelope(response, {
107
+ const result = await index.readHeyboxApiEnvelope(response, {
141
108
  pathWithQuery: path,
142
109
  });
143
110
  return result ?? {};
@@ -148,11 +115,12 @@ async function runUpload(options, runtime = {}) {
148
115
  const logger = runtime.logger ?? index.createCliLogger();
149
116
  const concurrency = runtime.concurrency ?? DEFAULT_CONCURRENCY;
150
117
  const fetchImpl = runtime.fetchImpl ?? fetch;
151
- const getCDNUploadInfo$1 = runtime.getCDNUploadInfo ?? getCDNUploadInfo;
152
- const getCDNUploadToken$1 = runtime.getCDNUploadToken ?? getCDNUploadToken;
153
- const postCDNUploadCallback$1 = runtime.postCDNUploadCallback ?? postCDNUploadCallback;
118
+ const getCDNUploadInfo = runtime.getCDNUploadInfo ?? index.getCDNUploadInfo;
119
+ const getCDNUploadToken = runtime.getCDNUploadToken ?? index.getCDNUploadToken;
120
+ const postCDNUploadCallback = runtime.postCDNUploadCallback ?? index.postCDNUploadCallback;
154
121
  const recordUserMiniprogramUploadResult$1 = runtime.recordUserMiniprogramUploadResult ?? recordUserMiniprogramUploadResult;
155
122
  const createReadStream = runtime.createReadStream ?? fs.createReadStream;
123
+ const cdnBaseUrl = runtime.cdnBaseUrl ?? runtime.baseUrl;
156
124
  let createCosClient = runtime.createCosClient;
157
125
  if (!createCosClient) {
158
126
  const COS = await loadCosConstructor();
@@ -173,12 +141,12 @@ async function runUpload(options, runtime = {}) {
173
141
  logger.debug(`正在处理上传批次 ${batchIndex + 1}/${batches.length},文件数: ${batch.length}`);
174
142
  logger.debug('正在获取 CDN 上传信息');
175
143
  const fileInfos = createUploadFileInfos(batch);
176
- const uploadInfo = grant ?? await getCDNUploadInfo$1({
144
+ const uploadInfo = grant ?? await getCDNUploadInfo({
177
145
  session: options.session,
178
146
  scope: runtimePermissionEnv.MINIAPP_UPLOAD_SCOPE,
179
147
  fileInfos,
180
148
  needCache: false,
181
- }, { baseUrl: runtime.baseUrl, fetchImpl });
149
+ }, { baseUrl: cdnBaseUrl, fetchImpl });
182
150
  logger.debug(`CDN bucket: ${uploadInfo.bucket}`);
183
151
  logger.debug(`CDN region: ${uploadInfo.region}`);
184
152
  validateUploadInfoKeys(batch, uploadInfo.keys);
@@ -189,13 +157,13 @@ async function runUpload(options, runtime = {}) {
189
157
  uploadToken = grant ? {
190
158
  credentials: { tmpSecretId: grant.tmp_secret_id, tmpSecretKey: grant.tmp_secret_key, sessionToken: grant.session_token },
191
159
  startTime: grant.start_time, expiredTime: grant.expired_time,
192
- } : await getCDNUploadToken$1({
160
+ } : await getCDNUploadToken({
193
161
  session: options.session,
194
162
  bucket: uploadInfo.bucket,
195
- keys: indexedFiles.map(item => item.key),
196
- mimetypes: indexedFiles.map(item => item.file.mimeType),
163
+ keys: indexedFiles.map((item) => item.key),
164
+ mimetypes: indexedFiles.map((item) => item.file.mimeType),
197
165
  isMultipartUpload: 0,
198
- }, { baseUrl: runtime.baseUrl, fetchImpl });
166
+ }, { baseUrl: cdnBaseUrl, fetchImpl });
199
167
  }
200
168
  catch (error) {
201
169
  throw new index.CliError(`获取 CDN 上传凭证失败:${readErrorMessage(error)}`);
@@ -241,7 +209,7 @@ async function runUpload(options, runtime = {}) {
241
209
  if (successfulKeys.length > 0) {
242
210
  logger.debug('正在确认 CDN 上传结果');
243
211
  if (!companion)
244
- await postCDNUploadCallback$1({ session: options.session, keys: successfulKeys, isFinished: true }, { baseUrl: runtime.baseUrl, fetchImpl });
212
+ await postCDNUploadCallback({ session: options.session, keys: successfulKeys, isFinished: true }, { baseUrl: cdnBaseUrl, fetchImpl });
245
213
  await recordUserMiniprogramUploadResult$1({
246
214
  session: options.session,
247
215
  miniProgramId: options.miniProgramId,
@@ -318,7 +286,7 @@ function createDefaultCosClient(uploadToken, COS) {
318
286
  };
319
287
  }
320
288
  async function loadCosConstructor() {
321
- const cosModule = await Promise.resolve().then(function () { return require('./index-HUjK7vn8.cjs'); }).then(function (n) { return n.index; });
289
+ const cosModule = await Promise.resolve().then(function () { return require('./index-DJoBhXcG.cjs'); }).then(function (n) { return n.index; });
322
290
  return cosModule.default;
323
291
  }
324
292
  function formatSize(bytes) {
@@ -523,18 +491,18 @@ function isNodeError(error) {
523
491
  return error instanceof Error && 'code' in error;
524
492
  }
525
493
 
526
- /** 发布提示只比较显式声明与线上批准,不消费本地调试授权。 */
527
- function getUnapprovedPermissionWarning(local, approvals) {
494
+ /** 发布提示使用显式声明与远端主体批准策略,不消费本地调试授权。 */
495
+ function getUnapprovedPermissionWarning(local, approvals, partyType) {
528
496
  if (!local.declared)
529
497
  return undefined;
530
- const { views } = runtimePermissionEnv.composeMiniappRuntimePermissions(local, approvals);
498
+ const { views } = runtimePermissionEnv.composeMiniappRuntimePermissions(local, approvals, partyType);
531
499
  const missing = [];
532
500
  for (const view of views) {
533
501
  if (!view.declared || view.access !== 'platform-approval')
534
502
  continue;
535
- if (!view.approved)
503
+ if (!view.effective)
536
504
  missing.push(view.key);
537
- if (view.key === 'network' && view.requestedConfig?.useOfficialDomain && !view.approvedConfig?.useOfficialDomain) {
505
+ if (view.key === 'network' && view.requestedConfig?.useOfficialDomain && !view.effectiveConfig?.useOfficialDomain) {
538
506
  missing.push('network.useOfficialDomain');
539
507
  }
540
508
  }
@@ -574,8 +542,8 @@ async function runDeployCommand(options, runtime = {}) {
574
542
  const miniProgramId = packageJson.heybox?.miniProgramId;
575
543
  const autoPublish = Boolean(options.autoPublish);
576
544
  const env = options.env ?? process.env;
577
- const apiBaseUrl = session.resolveHeyboxApiBaseUrl({ ...options, env });
578
- const loginBaseUrl = session.resolveHeyboxLoginBaseUrl({ ...options, env });
545
+ const apiBaseUrl = index.resolveHeyboxApiBaseUrl({ ...options, env });
546
+ const loginBaseUrl = index.resolveHeyboxLoginBaseUrl({ ...options, env });
579
547
  if (typeof miniProgramId !== 'string' || !miniProgramId.trim()) {
580
548
  throw new Error('未在 package.json 中找到 heybox.miniProgramId,请先配置 mini program id');
581
549
  }
@@ -584,7 +552,7 @@ async function runDeployCommand(options, runtime = {}) {
584
552
  const declaredBindAppIds = runtimePermissionEnv.readMiniappBindAppIdsFromPackageJson(projectRoot);
585
553
  const declaredCategory = runtimePermissionEnv.readMiniappCategoryFromPackageJson(projectRoot);
586
554
  const releaseNote = await resolveDeployReleaseNote(options, runtime);
587
- const session$1 = await logger.task('正在校验 Heybox 登录态', () => (runtime.requireAuthSession ?? session.requireHeyboxAuthSession)({ loginBaseUrl }), { successText: 'Heybox 登录态有效' });
555
+ const session = await logger.task('正在校验 Heybox 登录态', () => (runtime.requireAuthSession ?? index.requireHeyboxAuthSession)({ loginBaseUrl }), { successText: 'Heybox 登录态有效' });
588
556
  logger.debug(`Heybox API: ${apiBaseUrl}`);
589
557
  const uploadVersion = validateVersionForDeploy(packageJson.version, 'package.json.version');
590
558
  const deploy = async () => {
@@ -599,7 +567,7 @@ async function runDeployCommand(options, runtime = {}) {
599
567
  env,
600
568
  fetchImpl: runtime.fetchImpl,
601
569
  loginBaseUrl,
602
- session: session$1,
570
+ session,
603
571
  });
604
572
  await context.migrateBasicInfo(projectRoot, bound.detail, miniProgramId, runtime.fetchImpl);
605
573
  }
@@ -609,7 +577,7 @@ async function runDeployCommand(options, runtime = {}) {
609
577
  }
610
578
  precheckVersion = uploadVersion;
611
579
  await runVersionPrecheck({
612
- session: session$1,
580
+ session,
613
581
  miniProgramId,
614
582
  version: precheckVersion,
615
583
  releaseNote,
@@ -624,11 +592,11 @@ async function runDeployCommand(options, runtime = {}) {
624
592
  env,
625
593
  fetchImpl: runtime.fetchImpl,
626
594
  loginBaseUrl,
627
- session: session$1,
595
+ session,
628
596
  }), { successText: '已读取远端小程序权限' });
629
- const localNetworkEnabled = !localPermissions.declared || localPermissions.permissions?.network?.enabled === true;
630
- skipPlatformCsp = localNetworkEnabled && context.shouldSkipMiniappPlatformCsp(detail.runtime_permissions);
631
- const permissionWarning = getUnapprovedPermissionWarning(localPermissions, detail.runtime_permissions);
597
+ const effectivePermissions = runtimePermissionEnv.composeMiniappRuntimePermissions(localPermissions, detail.runtime_permissions, detail.party_type).runtimePermissions;
598
+ skipPlatformCsp = context.shouldSkipMiniappPlatformCsp(effectivePermissions);
599
+ const permissionWarning = getUnapprovedPermissionWarning(localPermissions, detail.runtime_permissions, detail.party_type);
632
600
  if (permissionWarning)
633
601
  logger.warn(permissionWarning);
634
602
  }
@@ -675,7 +643,7 @@ async function runDeployCommand(options, runtime = {}) {
675
643
  throw new Error('dist/manifest.json.bindAppIds 与 package.json#heybox.bindAppIds 不一致,请重新 build 后再 deploy');
676
644
  }
677
645
  await runVersionPrecheck({
678
- session: session$1,
646
+ session,
679
647
  miniProgramId,
680
648
  version,
681
649
  manifest,
@@ -703,6 +671,7 @@ async function runDeployCommand(options, runtime = {}) {
703
671
  // deploy 期间 dist 视为稳定构建输出;为避免持有大量文件描述符,签名和上传不会共享打开的文件句柄。
704
672
  const artifactReceipt = await logger.task('正在计算构建产物签名', () => (runtime.computeMiniappArtifactReceipt ?? computeMiniappArtifactReceipt)(uploadFiles), { successText: '构建产物签名计算完成' });
705
673
  runtimePermissionEnv.validateMiniappCompanionFileReceipts(manifest?.companions, artifactReceipt.files);
674
+ runtimePermissionEnv.validateMiniappWorkspaceCardFileReceipts(manifest?.workspaceCards, artifactReceipt.files);
706
675
  const profile = runtimePermissionEnv.parseMiniappBasicInfo(manifest, String(manifest.sdkVersion));
707
676
  if (profile) {
708
677
  const localProfile = runtimePermissionEnv.parseMiniappBasicInfo((await readPackageJson(projectRoot)).heybox ?? {});
@@ -724,7 +693,7 @@ async function runDeployCommand(options, runtime = {}) {
724
693
  }
725
694
  const createdUploadSession = await logger.task('正在创建或恢复上传会话', async () => {
726
695
  const result = await (runtime.createUserMiniprogramUploadSession ?? createUserMiniprogramUploadSession)({
727
- session: session$1,
696
+ session,
728
697
  miniProgramId,
729
698
  version,
730
699
  manifest,
@@ -770,7 +739,7 @@ async function runDeployCommand(options, runtime = {}) {
770
739
  const uploadedCompanions = createdUploadSession.files.filter(item => item.file.relativePath.startsWith('companions/') && !missingKeys.has(item.key));
771
740
  for (let index = 0; index < uploadedCompanions.length; index += runtimePermissionEnv.MINIAPP_UPLOAD_BATCH_SIZE) {
772
741
  await (runtime.recordUserMiniprogramUploadResult ?? recordUserMiniprogramUploadResult)({
773
- session: session$1, miniProgramId, version, sessionId: uploadSessionId,
742
+ session, miniProgramId, version, sessionId: uploadSessionId,
774
743
  files: uploadedCompanions.slice(index, index + runtimePermissionEnv.MINIAPP_UPLOAD_BATCH_SIZE)
775
744
  .map(({ file }) => ({ path: file.relativePath, size: file.size, sha256: file.sha256 })),
776
745
  }, { baseUrl: apiBaseUrl, fetchImpl: runtime.fetchImpl });
@@ -784,12 +753,12 @@ async function runDeployCommand(options, runtime = {}) {
784
753
  miniProgramId,
785
754
  });
786
755
  await (runtime.runUpload ?? runUpload)({
787
- session: session$1,
756
+ session,
788
757
  files: createdUploadSession.missingFiles.map(({ file, key }) => ({ ...file, key })),
789
758
  miniProgramId,
790
759
  version,
791
760
  uploadSessionId,
792
- }, { baseUrl: apiBaseUrl, fetchImpl: runtime.fetchImpl, logger });
761
+ }, { baseUrl: apiBaseUrl, cdnBaseUrl: index.HEYBOX_API_BASE_URL, fetchImpl: runtime.fetchImpl, logger });
793
762
  }
794
763
  }
795
764
  catch (error) {
@@ -797,7 +766,7 @@ async function runDeployCommand(options, runtime = {}) {
797
766
  }
798
767
  }
799
768
  try {
800
- const submitOptions = { session: session$1, miniProgramId, sessionId: uploadSessionId, preflightToken };
769
+ const submitOptions = { session, miniProgramId, sessionId: uploadSessionId, preflightToken };
801
770
  submitAuditResult = await logger.task('正在提交审核', () => (runtime.submitUserMiniprogramAudit ?? submitUserMiniprogramAudit)(submitOptions, {
802
771
  baseUrl: apiBaseUrl,
803
772
  fetchImpl: runtime.fetchImpl,
@@ -881,6 +850,10 @@ async function readDeployManifest(projectRoot, logger) {
881
850
  logger.warn('dist/manifest.json 包含 BOM,已自动剥离');
882
851
  }
883
852
  const validated = runtimePermissionEnv.validateMiniappManifestForDeploy(manifest);
853
+ if (validated.workspaceCards) {
854
+ runtimeGate.verifyWorkspaceCardsSnapshot({ ...validated, bindAppIds: validated.bindAppIds ?? [], workspaceCards: validated.workspaceCards });
855
+ runtimeGate.verifyWorkspaceCardArtifacts(distDir, validated.workspaceCards);
856
+ }
884
857
  const bindAppIds = validated.bindAppIds ?? [];
885
858
  return {
886
859
  manifest: {
@@ -1200,7 +1173,7 @@ async function runRemoteDeployCommand(options, runtime) {
1200
1173
  return finishRemoteCommand(options, runtime, output);
1201
1174
  }
1202
1175
  async function createRemoteCommandContext(options, runtime) {
1203
- index.applyServiceTagIfNeeded(options.serviceTag);
1176
+ index.applyMiniProgramServiceTagIfNeeded(options.serviceTag);
1204
1177
  const logger = resolveRemoteLogger(options, runtime);
1205
1178
  const environment = await context.resolveRemoteEnvironment({
1206
1179
  allowUnsafeApiBaseUrl: options.allowUnsafeApiBaseUrl,
@@ -1320,7 +1293,7 @@ async function remoteEntitySwitch(options, context, runtime) {
1320
1293
  throw new Error('远端响应缺少 entity_id');
1321
1294
  }
1322
1295
  const switchedOwnerHeyboxId = normalizePositiveInteger(switched.owner_heybox_id);
1323
- await session.setSelectedDeveloperEntitySnapshot({
1296
+ await index.setSelectedDeveloperEntitySnapshot({
1324
1297
  entityId: switchedEntityId,
1325
1298
  entityName: switched.entity_name || '--',
1326
1299
  ...(switchedOwnerHeyboxId !== undefined ? { ownerHeyboxId: switchedOwnerHeyboxId } : {}),
@@ -1401,7 +1374,7 @@ async function remoteInfo(options, context$1, runtime) {
1401
1374
  const miniProgramId = requireBinding(context$1);
1402
1375
  const detail = await context$1.api.getMiniProgramDetail(miniProgramId);
1403
1376
  const localPermissions = runtimePermissionEnv.readMiniappPermissionsFromPackageJson(context$1.packageJson.projectRoot, runtimePermissionEnv.resolveMiniappSdkVersion());
1404
- const permissionViews = runtimePermissionEnv.composeMiniappRuntimePermissions(localPermissions, detail.runtime_permissions).views;
1377
+ const permissionViews = runtimePermissionEnv.composeMiniappRuntimePermissions(localPermissions, detail.runtime_permissions, detail.party_type).views;
1405
1378
  const localBindAppIds = runtimePermissionEnv.readMiniappBindAppIdsFromPackageJson(context$1.packageJson.projectRoot);
1406
1379
  const currentBindApps = normalizeRemoteBoundApps(detail.bind_apps);
1407
1380
  const currentByID = new Map(currentBindApps.map((item) => [item.appid, item]));
@@ -1455,24 +1428,30 @@ async function remoteAllowlistWrite(options, context, runtime) {
1455
1428
  async function remotePermissionList(options, context, runtime) {
1456
1429
  const miniProgramId = requireBinding(context);
1457
1430
  const result = await context.api.listPermissionApplications(miniProgramId);
1431
+ const detail = await context.api.getMiniProgramDetail(miniProgramId);
1432
+ const localPermissions = runtimePermissionEnv.readMiniappPermissionsFromPackageJson(context.packageJson.projectRoot, runtimePermissionEnv.resolveMiniappSdkVersion());
1433
+ const { views } = runtimePermissionEnv.composeMiniappRuntimePermissions(localPermissions, result.runtime_permissions, detail.party_type);
1458
1434
  if (!options.json) {
1459
- for (const item of result.items) {
1460
- const application = item.latest_application;
1461
- const approval = result.runtime_permissions?.entries?.find(entry => entry.key === item.permission_key);
1462
- context.logger.info(`${item.permission_key} (${item.permission_name}) 平台状态=${approval?.status ?? 'disabled'} 最近申请=${application?.status ?? '未申请'}`);
1435
+ for (const view of views.filter(entry => entry.access === 'platform-approval')) {
1436
+ const item = result.items.find(entry => entry.permission_key === view.key);
1437
+ const application = item?.latest_application;
1438
+ const name = item?.permission_name ?? runtimePermissionEnv.MINI_PROGRAM_PERMISSION_CATALOG.find(entry => entry.key === view.key)?.name ?? view.key;
1439
+ const approval = result.runtime_permissions?.entries?.find(entry => entry.key === view.key);
1440
+ const source = view.approvalSource === 'first-party' ? ' 批准来源=第一方自动批准' : '';
1441
+ context.logger.info(`${view.key} (${name}) 原始审批=${approval?.status ?? 'disabled'}${source} 本地生效=${view.effective ? 'enabled' : 'disabled'} 最近申请=${application?.status ?? '未申请'}`);
1463
1442
  if (application?.application_id)
1464
1443
  context.logger.info(`申请 ID:${application.application_id}`);
1465
1444
  if (application?.review_remark)
1466
1445
  context.logger.info(`审核意见:${application.review_remark}`);
1467
1446
  }
1468
1447
  }
1469
- return finishRemoteCommand(options, runtime, { changed: false, miniProgramId, items: toCamelCaseDeep(result.items), runtimePermissions: toCamelCaseDeep(result.runtime_permissions) });
1448
+ return finishRemoteCommand(options, runtime, { changed: false, miniProgramId, items: toCamelCaseDeep(result.items), runtimePermissions: toCamelCaseDeep(result.runtime_permissions), permissions: views });
1470
1449
  }
1471
1450
  async function remotePermissionApply(options, context, runtime) {
1472
1451
  const miniProgramId = requireBinding(context);
1473
- const key = requireNonEmpty(options.key, '请指定申请权限 network 或 companion');
1474
- if (key !== 'network' && key !== 'companion')
1475
- throw new Error('仅支持申请 network 或 companion 权限');
1452
+ const key = requireNonEmpty(options.key, '请指定申请权限 network、companion 或 appProtocol');
1453
+ if (key !== 'network' && key !== 'companion' && key !== 'appProtocol')
1454
+ throw new Error('仅支持申请 network、companion 或 appProtocol 权限');
1476
1455
  const reason = requireNonEmpty(options.reason, '权限申请必须传 --reason');
1477
1456
  if (Array.from(reason).length > 500)
1478
1457
  throw new Error('申请理由不能超过 500 字');
@@ -1594,7 +1573,7 @@ async function remoteDangerousWrite(options, context, runtime) {
1594
1573
  status: detail.status,
1595
1574
  version,
1596
1575
  permissionWarning: options.command === 'release'
1597
- ? getUnapprovedPermissionWarning(runtimePermissionEnv.readMiniappPermissionsFromPackageJson(context.packageJson.projectRoot, runtimePermissionEnv.resolveMiniappSdkVersion()), detail.runtime_permissions)
1576
+ ? getUnapprovedPermissionWarning(runtimePermissionEnv.readMiniappPermissionsFromPackageJson(context.packageJson.projectRoot, runtimePermissionEnv.resolveMiniappSdkVersion()), detail.runtime_permissions, detail.party_type)
1598
1577
  : undefined,
1599
1578
  });
1600
1579
  if (options.command === 'release') {
@@ -1975,7 +1954,9 @@ function printMiniProgramDetail(logger, detail, permissionViews, bindings) {
1975
1954
  }
1976
1955
  logger.info('权限:');
1977
1956
  for (const view of permissionViews) {
1978
- const approval = view.access === 'platform-approval' ? ` 需申请=是 批准=${view.approved ? '是' : '否'}` : ' 需申请=否';
1957
+ const approval = view.approvalSource === 'first-party'
1958
+ ? ` 需申请=否 批准来源=第一方自动批准 原始批准=${view.approved ? '是' : '否'}`
1959
+ : view.access === 'platform-approval' ? ` 需申请=是 批准=${view.approved ? '是' : '否'}` : ' 需申请=否';
1979
1960
  const configs = view.requestedConfig
1980
1961
  ? ` requested=${JSON.stringify(view.requestedConfig)} approved=${JSON.stringify(view.approvedConfig)} effective=${JSON.stringify(view.effectiveConfig)}`
1981
1962
  : '';