@heybox/hb-sdk 0.9.1-alpha.4 → 0.9.1-alpha.6

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 (112) hide show
  1. package/CHANGELOG.md +23 -2
  2. package/README.md +33 -0
  3. package/dist/card-controller.cjs.js +194 -0
  4. package/dist/card-controller.esm.js +159 -0
  5. package/dist/cli-chunks/browser-DUdEZCyq.cjs +15 -0
  6. package/dist/cli-chunks/{build-BZg2rHkW.cjs → build-DYYWRiaY.cjs} +22 -10
  7. package/dist/cli-chunks/{context-YrzmEOau.cjs → context-Bo4L-Cx_.cjs} +12 -12
  8. package/dist/cli-chunks/{create-fPvlqLbS.cjs → create-CKC4yp0J.cjs} +12 -5
  9. package/dist/cli-chunks/{dev-X8_kbp78.cjs → dev-BMX6UXUe.cjs} +58 -13
  10. package/dist/cli-chunks/{doctor-DdiucYs9.cjs → doctor-DqEYRo4I.cjs} +13 -6
  11. package/dist/cli-chunks/{index-BdbwsefW.cjs → index-DmCWB_hF.cjs} +4 -7
  12. package/dist/cli-chunks/{index-BGh-Izf8.cjs → index-J4uQvKT_.cjs} +8780 -4464
  13. package/dist/cli-chunks/{index.esm-WYIrPjkF.cjs → index.esm-eNPTDv6W.cjs} +18 -19
  14. package/dist/cli-chunks/{login-DWmNuhWc.cjs → login-BL2OE6r9.cjs} +32 -33
  15. package/dist/cli-chunks/{project-vite-BVDIeoHB.cjs → project-vite-Du1m7Y_3.cjs} +1 -1
  16. package/dist/cli-chunks/{remote-BHJFxXyc.cjs → remote-ZHJUtx6l.cjs} +49 -38
  17. package/dist/cli-chunks/runtime-gate-DedD3ynE.cjs +201950 -0
  18. package/dist/cli-chunks/{runtime-permission-env-eiq8vE62.cjs → runtime-permission-env-DWaPlchd.cjs} +9396 -2929
  19. package/dist/cli-chunks/{skill-DC3cfPj2.cjs → skill-D4z_a_BH.cjs} +14 -7
  20. package/dist/cli-chunks/{version-DYFkOykv.cjs → version-tzrFwpkl.cjs} +1 -1
  21. package/dist/cli.cjs +14 -6
  22. package/dist/devtools/browser-dev-host/assets/browser-dev-host-BL1URvGR.js +102 -0
  23. package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-CZsodKbP.js → desktop-app-launch-D6QZYpUq.js} +3 -3
  24. package/dist/devtools/browser-dev-host/assets/{index-B9tOX3zG.js → index-Bqsp608m.js} +4 -4
  25. package/dist/devtools/browser-dev-host/index.html +2 -2
  26. package/dist/index.cjs.js +6224 -275
  27. package/dist/index.esm.js +6224 -276
  28. package/dist/miniapp-publish.cjs.js +6612 -168
  29. package/dist/miniapp-publish.esm.js +6612 -169
  30. package/dist/protocol.cjs.js +5805 -0
  31. package/dist/protocol.esm.js +5805 -0
  32. package/dist/vite.cjs.js +7475 -217
  33. package/dist/vite.esm.js +7474 -218
  34. package/dist/workspace-card-build-sandbox-worker.mjs +72 -0
  35. package/package.json +25 -11
  36. package/skill/SKILL.md +15 -0
  37. package/skill/skill.json +5 -5
  38. package/types/card-controller.d.ts +3682 -0
  39. package/types/index.d.ts +7532 -35
  40. package/types/miniapp-publish/index.d.ts +542 -64
  41. package/types/protocol.d.ts +2083 -9
  42. package/types/vite/index.d.ts +25 -12
  43. package/dist/cli-chunks/browser-RAy8e8cV.cjs +0 -635
  44. package/dist/cli-chunks/runtime-gate-CR0dRMpQ.cjs +0 -65
  45. package/dist/cli-chunks/session-Dz1cGg0E.cjs +0 -3403
  46. package/dist/devtools/browser-dev-host/assets/browser-dev-host-CO2_03W0.js +0 -102
  47. package/types/core/client.d.ts +0 -108
  48. package/types/core/csp-violation.d.ts +0 -5
  49. package/types/core/errors.d.ts +0 -78
  50. package/types/core/event-bus.d.ts +0 -11
  51. package/types/core/handshake-state.d.ts +0 -54
  52. package/types/core/history-observer.d.ts +0 -4
  53. package/types/core/mini-dev-console.d.ts +0 -36
  54. package/types/core/network-sanitize.d.ts +0 -31
  55. package/types/core/sdk.d.ts +0 -104
  56. package/types/core/singleton.d.ts +0 -372
  57. package/types/core/utils.d.ts +0 -10
  58. package/types/core/version.d.ts +0 -2
  59. package/types/devtools/device-logs.d.ts +0 -48
  60. package/types/miniapp-manifest/basic-info-browser.d.ts +0 -37
  61. package/types/miniapp-manifest/basic-info-image-header.d.ts +0 -6
  62. package/types/miniapp-manifest/basic-info-node.d.ts +0 -17
  63. package/types/miniapp-manifest/basic-info-placeholder.d.ts +0 -1
  64. package/types/miniapp-manifest/basic-info.d.ts +0 -33
  65. package/types/miniapp-manifest/bindings.d.ts +0 -70
  66. package/types/miniapp-manifest/category.d.ts +0 -11
  67. package/types/miniapp-manifest/companion-directory.d.ts +0 -2
  68. package/types/miniapp-manifest/companion-executable.d.ts +0 -4
  69. package/types/miniapp-manifest/companion-types.d.ts +0 -63
  70. package/types/miniapp-manifest/companions.d.ts +0 -17
  71. package/types/miniapp-manifest/index.d.ts +0 -7
  72. package/types/miniapp-manifest/node.d.ts +0 -22
  73. package/types/miniapp-manifest/permissions.d.ts +0 -48
  74. package/types/miniapp-manifest/runtime-gate.d.ts +0 -12
  75. package/types/miniapp-manifest/schema.d.ts +0 -302
  76. package/types/modules/auth/index.d.ts +0 -204
  77. package/types/modules/cloud/index.d.ts +0 -669
  78. package/types/modules/companion/index.d.ts +0 -1619
  79. package/types/modules/device/index.d.ts +0 -269
  80. package/types/modules/environment/index.d.ts +0 -238
  81. package/types/modules/files/index.d.ts +0 -5
  82. package/types/modules/files/registry.d.ts +0 -35
  83. package/types/modules/files/types.d.ts +0 -1548
  84. package/types/modules/navigation/app-pages/index.d.ts +0 -4
  85. package/types/modules/navigation/app-pages/types.d.ts +0 -135
  86. package/types/modules/navigation/index.d.ts +0 -312
  87. package/types/modules/network/index.d.ts +0 -457
  88. package/types/modules/network/observability.d.ts +0 -38
  89. package/types/modules/network/request-shape.d.ts +0 -44
  90. package/types/modules/share/copy-link.d.ts +0 -46
  91. package/types/modules/share/extra.d.ts +0 -5
  92. package/types/modules/share/index.d.ts +0 -294
  93. package/types/modules/share/screenshot.d.ts +0 -34
  94. package/types/modules/share/show-share-menu.d.ts +0 -29
  95. package/types/modules/share/types.d.ts +0 -201
  96. package/types/modules/storage/index.d.ts +0 -214
  97. package/types/modules/ui/index.d.ts +0 -315
  98. package/types/modules/user/get-info.d.ts +0 -44
  99. package/types/modules/user/index.d.ts +0 -245
  100. package/types/modules/user/revoke-authorization.d.ts +0 -31
  101. package/types/modules/user/steam-game-list.d.ts +0 -153
  102. package/types/modules/user/types.d.ts +0 -2
  103. package/types/modules/viewport/index.d.ts +0 -319
  104. package/types/protocol/capabilities.d.ts +0 -2
  105. package/types/protocol/constants.d.ts +0 -1
  106. package/types/protocol/dev-session.d.ts +0 -74
  107. package/types/protocol/guards.d.ts +0 -1
  108. package/types/protocol/runtime-permissions.d.ts +0 -2
  109. package/types/protocol/types.d.ts +0 -22
  110. package/types/skill-metadata.d.ts +0 -18
  111. package/types/vite/html-policy.d.ts +0 -6
  112. package/types/vite/runtime-permission-env.d.ts +0 -9
@@ -11,38 +11,37 @@ 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-BGh-Izf8.cjs');
15
- var dev = require('./dev-X8_kbp78.cjs');
14
+ var index = require('./index-J4uQvKT_.cjs');
15
+ var dev = require('./dev-BMX6UXUe.cjs');
16
16
  require('node:module');
17
- require('node:fs');
18
17
  require('node:fs/promises');
19
18
  require('node:path');
20
19
  require('path');
21
20
  require('os');
22
- require('node:crypto');
23
- require('readline');
24
- require('tty');
25
- require('assert');
26
- require('./session-Dz1cGg0E.cjs');
27
21
  require('fs');
28
22
  require('constants');
29
- require('./context-YrzmEOau.cjs');
30
- require('./runtime-permission-env-eiq8vE62.cjs');
31
- require('./version-DYFkOykv.cjs');
23
+ require('assert');
24
+ require('readline');
25
+ require('tty');
26
+ require('node:crypto');
27
+ require('node:process');
28
+ require('node:buffer');
29
+ require('node:url');
30
+ require('node:util');
31
+ require('node:child_process');
32
+ require('node:os');
33
+ require('node:fs');
34
+ require('./context-Bo4L-Cx_.cjs');
35
+ require('./runtime-permission-env-DWaPlchd.cjs');
36
+ require('./version-tzrFwpkl.cjs');
32
37
  require('node:async_hooks');
33
38
  require('sharp');
34
- require('node:os');
35
39
  require('node:net');
36
40
  require('node:dns/promises');
37
41
  require('node:http');
38
42
  require('undici');
39
- require('./browser-RAy8e8cV.cjs');
40
- require('node:process');
41
- require('node:buffer');
42
- require('node:url');
43
- require('node:util');
44
- require('node:child_process');
45
- require('./project-vite-BVDIeoHB.cjs');
43
+ require('./browser-DUdEZCyq.cjs');
44
+ require('./project-vite-Du1m7Y_3.cjs');
46
45
  require('node:zlib');
47
46
 
48
47
  var bufferUtil = {exports: {}};
@@ -3,37 +3,36 @@
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-Dz1cGg0E.cjs');
7
- var browser = require('./browser-RAy8e8cV.cjs');
8
- var index = require('./index-BGh-Izf8.cjs');
6
+ var index = require('./index-J4uQvKT_.cjs');
7
+ var browser = require('./browser-DUdEZCyq.cjs');
8
+ require('node:module');
9
+ require('node:fs/promises');
9
10
  require('node:path');
11
+ require('path');
12
+ require('os');
10
13
  require('fs');
11
14
  require('constants');
12
15
  require('stream');
13
16
  require('util');
14
17
  require('assert');
15
- require('path');
18
+ require('readline');
19
+ require('tty');
20
+ require('events');
21
+ require('buffer');
16
22
  require('node:process');
17
23
  require('node:buffer');
18
24
  require('node:url');
19
25
  require('node:util');
20
26
  require('node:child_process');
21
- require('node:fs/promises');
22
27
  require('node:os');
23
28
  require('node:fs');
24
- require('node:module');
25
- require('os');
26
- require('readline');
27
- require('tty');
28
- require('events');
29
- require('buffer');
30
29
 
31
30
  const HEYBOX_CALLBACK_HOST = '127.0.0.1';
32
31
  const HEYBOX_CALLBACK_PATH = '/heybox/callback';
33
32
  const HEYBOX_CALLBACK_DONE_PATH = '/heybox/callback/done';
34
33
  const DEFAULT_HEYBOX_CALLBACK_TIMEOUT_MS = 5 * 60 * 1000;
35
34
  function createHeyboxLoginUrl(callbackUrl, state, options = {}) {
36
- const url = new URL(session.resolveHeyboxLoginBaseUrl(options));
35
+ const url = new URL(index.resolveHeyboxLoginBaseUrl(options));
37
36
  url.searchParams.set('mode', 'cli');
38
37
  url.searchParams.set('redirect_url', callbackUrl);
39
38
  url.searchParams.set('state', state);
@@ -141,7 +140,7 @@ async function loginToHeybox(options = {}) {
141
140
  const logger = options.logger ?? index.createCliLogger();
142
141
  const waitForBrowserCallback = options.waitForBrowserCallback ?? waitForHeyboxBrowserCallback;
143
142
  const env = options.env ?? process.env;
144
- const loginBaseUrl = session.resolveHeyboxLoginBaseUrl({ ...options, env });
143
+ const loginBaseUrl = index.resolveHeyboxLoginBaseUrl({ ...options, env });
145
144
  logger.section('Heybox 浏览器登录');
146
145
  logger.debug(`登录入口环境: ${loginBaseUrl}`);
147
146
  const payload = await logger.task('等待浏览器登录回调', () => waitForBrowserCallback({
@@ -162,16 +161,16 @@ async function loginToHeybox(options = {}) {
162
161
  },
163
162
  timeoutMs: options.timeoutMs,
164
163
  }), { successText: '已接收 Heybox 登录态' });
165
- const session$1 = session.createHeyboxAuthSession(payload, { ...options, loginBaseUrl });
166
- await session.writeHeyboxAuthSession(session$1, options);
167
- logger.success(`Heybox 登录成功:${session$1.heyboxId}`);
168
- await selectDeveloperEntityAfterLogin(session$1, options, logger);
169
- logger.debug(`cache: ${session.getAuthCacheFilePath(options)}`);
164
+ const session = index.createHeyboxAuthSession(payload, { ...options, loginBaseUrl });
165
+ await index.writeHeyboxAuthSession(session, options);
166
+ logger.success(`Heybox 登录成功:${session.heyboxId}`);
167
+ await selectDeveloperEntityAfterLogin(session, options, logger);
168
+ logger.debug(`cache: ${index.getAuthCacheFilePath(options)}`);
170
169
  logger.info('验证命令: hb-sdk login status');
171
170
  }
172
171
  async function printLoginStatus(options = {}) {
173
172
  const logger = options.logger ?? index.createCliLogger();
174
- const status = await session.readRedactedHeyboxAuthStatus(options);
173
+ const status = await index.readRedactedHeyboxAuthStatus(options);
175
174
  logger.section('Heybox 登录态');
176
175
  if (!status.loggedIn) {
177
176
  logger.warn('未登录');
@@ -190,16 +189,16 @@ async function printLoginStatus(options = {}) {
190
189
  }
191
190
  async function clearLoginStatus(options = {}) {
192
191
  const logger = options.logger ?? index.createCliLogger();
193
- await session.clearHeyboxAuthSession(options);
192
+ await index.clearHeyboxAuthSession(options);
194
193
  logger.success('已清理 Heybox 登录态');
195
- logger.debug(`cache: ${session.getAuthCacheFilePath(options)}`);
194
+ logger.debug(`cache: ${index.getAuthCacheFilePath(options)}`);
196
195
  }
197
- async function selectDeveloperEntityAfterLogin(session$1, options, logger) {
196
+ async function selectDeveloperEntityAfterLogin(session, options, logger) {
198
197
  if (options.noSelectEntity) {
199
198
  logger.info('已跳过开发者主体选择。后续可运行: hb-sdk remote entity switch <entity-id>');
200
199
  return;
201
200
  }
202
- const entities = await logger.task('读取开发者主体列表', () => listDeveloperEntities(session$1, options), {
201
+ const entities = await logger.task('读取开发者主体列表', () => listDeveloperEntities(session, options), {
203
202
  successText: '已读取开发者主体列表',
204
203
  });
205
204
  if (entities.length === 0) {
@@ -210,12 +209,12 @@ async function selectDeveloperEntityAfterLogin(session$1, options, logger) {
210
209
  if (entities.length === 1) {
211
210
  const [entity] = entities;
212
211
  if (!entity.isCurrent) {
213
- await switchDeveloperEntity(session$1, entity, options);
214
- await session.setSelectedDeveloperEntitySnapshot(entity, options);
212
+ await switchDeveloperEntity(session, entity, options);
213
+ await index.setSelectedDeveloperEntitySnapshot(entity, options);
215
214
  logger.success(`已切换开发者主体:${formatDeveloperEntity(entity)}`);
216
215
  return;
217
216
  }
218
- await session.setSelectedDeveloperEntitySnapshot(entity, options);
217
+ await index.setSelectedDeveloperEntitySnapshot(entity, options);
219
218
  logger.info(`当前开发者主体:${formatDeveloperEntity(entity)}`);
220
219
  return;
221
220
  }
@@ -232,8 +231,8 @@ async function selectDeveloperEntityAfterLogin(session$1, options, logger) {
232
231
  if (!selected) {
233
232
  throw new Error('必须选择一个开发者主体;如需跳过,请显式传 --no-select-entity');
234
233
  }
235
- await switchDeveloperEntity(session$1, selected, options);
236
- await session.setSelectedDeveloperEntitySnapshot(selected, options);
234
+ await switchDeveloperEntity(session, selected, options);
235
+ await index.setSelectedDeveloperEntitySnapshot(selected, options);
237
236
  logger.success(`已切换开发者主体:${formatDeveloperEntity(selected)}`);
238
237
  }
239
238
  async function listDeveloperEntities(session, options) {
@@ -246,18 +245,18 @@ async function switchDeveloperEntity(session, entity, options) {
246
245
  entity_id: entity.entityId,
247
246
  });
248
247
  }
249
- async function requestDeveloperEntityApi(path, method, session$1, options, fields = {}) {
250
- const apiBaseUrl = session.resolveHeyboxApiBaseUrl(options);
251
- const context = session.createHeyboxOpenPlatformRequestContext(session$1, path, {
248
+ async function requestDeveloperEntityApi(path, method, session, options, fields = {}) {
249
+ const apiBaseUrl = index.resolveHeyboxApiBaseUrl(options);
250
+ const context = index.createHeyboxOpenPlatformRequestContext(session, path, {
252
251
  ...(method === 'POST' ? { contentType: 'application/x-www-form-urlencoded' } : {}),
253
252
  });
254
253
  const fetchImpl = options.fetchImpl ?? fetch;
255
- const response = await fetchImpl(session.createHeyboxApiUrl(apiBaseUrl, path, context.platformParams), {
254
+ const response = await fetchImpl(index.createHeyboxApiUrl(apiBaseUrl, path, context.platformParams), {
256
255
  method,
257
256
  headers: context.headers,
258
257
  ...(method === 'POST' ? { body: new URLSearchParams(stringifyFormFields(fields)).toString() } : {}),
259
258
  });
260
- return session.readHeyboxApiEnvelope(response, { pathWithQuery: path, requireResult: method === 'GET' });
259
+ return index.readHeyboxApiEnvelope(response, { pathWithQuery: path, requireResult: method === 'GET' });
261
260
  }
262
261
  function stringifyFormFields(fields) {
263
262
  return Object.fromEntries(Object.entries(fields).map(([key, value]) => [key, String(value)]));
@@ -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-BGh-Izf8.cjs');
8
+ var index = require('./index-J4uQvKT_.cjs');
9
9
 
10
10
  function findProjectRoot(startDir) {
11
11
  let current = path.resolve(startDir);
@@ -1,32 +1,37 @@
1
1
  'use strict';
2
2
 
3
- var runtimePermissionEnv = require('./runtime-permission-env-eiq8vE62.cjs');
4
- var context = require('./context-YrzmEOau.cjs');
3
+ var runtimePermissionEnv = require('./runtime-permission-env-DWaPlchd.cjs');
4
+ var context = require('./context-Bo4L-Cx_.cjs');
5
5
  var promises = require('node:readline/promises');
6
- var index = require('./index-BGh-Izf8.cjs');
7
- var session = require('./session-Dz1cGg0E.cjs');
6
+ var index = require('./index-J4uQvKT_.cjs');
7
+ var runtimeGate = require('./runtime-gate-DedD3ynE.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-CR0dRMpQ.cjs');
15
- require('./version-DYFkOykv.cjs');
14
+ require('./version-tzrFwpkl.cjs');
16
15
  require('node:async_hooks');
17
16
  require('sharp');
18
17
  require('node:module');
19
18
  require('path');
20
19
  require('os');
20
+ require('fs');
21
+ require('constants');
22
+ require('stream');
23
+ require('util');
24
+ require('assert');
21
25
  require('readline');
22
26
  require('tty');
23
- require('assert');
24
27
  require('events');
25
- require('stream');
26
28
  require('buffer');
27
- require('util');
28
- require('fs');
29
- require('constants');
29
+ require('node:process');
30
+ require('node:buffer');
31
+ require('node:url');
32
+ require('node:util');
33
+ require('node:os');
34
+ require('inspector');
30
35
 
31
36
  // 脚手架开发占位图;构建可用,提审前必须替换。
32
37
  const BASIC_INFO_PLACEHOLDER_SHA256 = 'd14e54b30f5e6d1bcbf51267bc82b06a0af7c333f2945bcc16b4e1adc3b123dd';
@@ -52,20 +57,20 @@ async function postCDNUploadCallback(options, runtime = {}) {
52
57
  const query = options.isFinished ? '?is_finished=true' : '';
53
58
  return postHeyboxApi(`/bbs/app/api/qcloud/cos/upload/callback/v2${query}`, body, options.session, runtime);
54
59
  }
55
- async function postHeyboxApi(pathWithQuery, body, session$1, runtime) {
60
+ async function postHeyboxApi(pathWithQuery, body, session, runtime) {
56
61
  const fetchImpl = runtime.fetchImpl ?? fetch;
57
- const context = session.createHeyboxOpenPlatformRequestContext(session$1, pathWithQuery, {
62
+ const context = index.createHeyboxOpenPlatformRequestContext(session, pathWithQuery, {
58
63
  contentType: 'application/x-www-form-urlencoded',
59
64
  });
60
65
  // CDN 使用共用上传服务,不随小程序服务的个人测试 tag 切换。
61
66
  delete context.headers['x-rylai-service-tag'];
62
67
  delete context.platformParams.special_tag;
63
- const response = await fetchImpl(session.createHeyboxApiUrl(runtime.baseUrl ?? context.baseUrl, pathWithQuery, context.platformParams), {
68
+ const response = await fetchImpl(index.createHeyboxApiUrl(runtime.baseUrl ?? context.baseUrl, pathWithQuery, context.platformParams), {
64
69
  method: 'POST',
65
70
  headers: context.headers,
66
71
  body: body.toString(),
67
72
  });
68
- const result = await session.readHeyboxApiEnvelope(response, { pathWithQuery, requireResult: true });
73
+ const result = await index.readHeyboxApiEnvelope(response, { pathWithQuery, requireResult: true });
69
74
  return result;
70
75
  }
71
76
 
@@ -127,7 +132,7 @@ async function recordUserMiniprogramUploadResult(options, runtime = {}) {
127
132
  }
128
133
  async function postUserMiniprogramVersionForm(path, options, fields, runtime) {
129
134
  const fetchImpl = runtime.fetchImpl ?? fetch;
130
- const context = session.createHeyboxOpenPlatformRequestContext(options.session, path, {
135
+ const context = index.createHeyboxOpenPlatformRequestContext(options.session, path, {
131
136
  contentType: 'application/x-www-form-urlencoded',
132
137
  });
133
138
  const body = new URLSearchParams();
@@ -135,12 +140,12 @@ async function postUserMiniprogramVersionForm(path, options, fields, runtime) {
135
140
  for (const [key, value] of Object.entries(fields)) {
136
141
  body.set(key, value);
137
142
  }
138
- const response = await fetchImpl(session.createHeyboxApiUrl(runtime.baseUrl ?? context.baseUrl, path, context.platformParams), {
143
+ const response = await fetchImpl(index.createHeyboxApiUrl(runtime.baseUrl ?? context.baseUrl, path, context.platformParams), {
139
144
  method: 'POST',
140
145
  headers: context.headers,
141
146
  body: body.toString(),
142
147
  });
143
- const result = await session.readHeyboxApiEnvelope(response, {
148
+ const result = await index.readHeyboxApiEnvelope(response, {
144
149
  pathWithQuery: path,
145
150
  });
146
151
  return result ?? {};
@@ -156,6 +161,7 @@ async function runUpload(options, runtime = {}) {
156
161
  const postCDNUploadCallback$1 = runtime.postCDNUploadCallback ?? postCDNUploadCallback;
157
162
  const recordUserMiniprogramUploadResult$1 = runtime.recordUserMiniprogramUploadResult ?? recordUserMiniprogramUploadResult;
158
163
  const createReadStream = runtime.createReadStream ?? fs.createReadStream;
164
+ const cdnBaseUrl = runtime.cdnBaseUrl ?? runtime.baseUrl;
159
165
  let createCosClient = runtime.createCosClient;
160
166
  if (!createCosClient) {
161
167
  const COS = await loadCosConstructor();
@@ -181,7 +187,7 @@ async function runUpload(options, runtime = {}) {
181
187
  scope: runtimePermissionEnv.MINIAPP_UPLOAD_SCOPE,
182
188
  fileInfos,
183
189
  needCache: false,
184
- }, { baseUrl: runtime.baseUrl, fetchImpl });
190
+ }, { baseUrl: cdnBaseUrl, fetchImpl });
185
191
  logger.debug(`CDN bucket: ${uploadInfo.bucket}`);
186
192
  logger.debug(`CDN region: ${uploadInfo.region}`);
187
193
  validateUploadInfoKeys(batch, uploadInfo.keys);
@@ -195,10 +201,10 @@ async function runUpload(options, runtime = {}) {
195
201
  } : await getCDNUploadToken$1({
196
202
  session: options.session,
197
203
  bucket: uploadInfo.bucket,
198
- keys: indexedFiles.map(item => item.key),
199
- mimetypes: indexedFiles.map(item => item.file.mimeType),
204
+ keys: indexedFiles.map((item) => item.key),
205
+ mimetypes: indexedFiles.map((item) => item.file.mimeType),
200
206
  isMultipartUpload: 0,
201
- }, { baseUrl: runtime.baseUrl, fetchImpl });
207
+ }, { baseUrl: cdnBaseUrl, fetchImpl });
202
208
  }
203
209
  catch (error) {
204
210
  throw new index.CliError(`获取 CDN 上传凭证失败:${readErrorMessage(error)}`);
@@ -244,7 +250,7 @@ async function runUpload(options, runtime = {}) {
244
250
  if (successfulKeys.length > 0) {
245
251
  logger.debug('正在确认 CDN 上传结果');
246
252
  if (!companion)
247
- await postCDNUploadCallback$1({ session: options.session, keys: successfulKeys, isFinished: true }, { baseUrl: runtime.baseUrl, fetchImpl });
253
+ await postCDNUploadCallback$1({ session: options.session, keys: successfulKeys, isFinished: true }, { baseUrl: cdnBaseUrl, fetchImpl });
248
254
  await recordUserMiniprogramUploadResult$1({
249
255
  session: options.session,
250
256
  miniProgramId: options.miniProgramId,
@@ -321,7 +327,7 @@ function createDefaultCosClient(uploadToken, COS) {
321
327
  };
322
328
  }
323
329
  async function loadCosConstructor() {
324
- const cosModule = await Promise.resolve().then(function () { return require('./index-BdbwsefW.cjs'); }).then(function (n) { return n.index; });
330
+ const cosModule = await Promise.resolve().then(function () { return require('./index-DmCWB_hF.cjs'); }).then(function (n) { return n.index; });
325
331
  return cosModule.default;
326
332
  }
327
333
  function formatSize(bytes) {
@@ -577,8 +583,8 @@ async function runDeployCommand(options, runtime = {}) {
577
583
  const miniProgramId = packageJson.heybox?.miniProgramId;
578
584
  const autoPublish = Boolean(options.autoPublish);
579
585
  const env = options.env ?? process.env;
580
- const apiBaseUrl = session.resolveHeyboxApiBaseUrl({ ...options, env });
581
- const loginBaseUrl = session.resolveHeyboxLoginBaseUrl({ ...options, env });
586
+ const apiBaseUrl = index.resolveHeyboxApiBaseUrl({ ...options, env });
587
+ const loginBaseUrl = index.resolveHeyboxLoginBaseUrl({ ...options, env });
582
588
  if (typeof miniProgramId !== 'string' || !miniProgramId.trim()) {
583
589
  throw new Error('未在 package.json 中找到 heybox.miniProgramId,请先配置 mini program id');
584
590
  }
@@ -587,7 +593,7 @@ async function runDeployCommand(options, runtime = {}) {
587
593
  const declaredBindAppIds = runtimePermissionEnv.readMiniappBindAppIdsFromPackageJson(projectRoot);
588
594
  const declaredCategory = runtimePermissionEnv.readMiniappCategoryFromPackageJson(projectRoot);
589
595
  const releaseNote = await resolveDeployReleaseNote(options, runtime);
590
- const session$1 = await logger.task('正在校验 Heybox 登录态', () => (runtime.requireAuthSession ?? session.requireHeyboxAuthSession)({ loginBaseUrl }), { successText: 'Heybox 登录态有效' });
596
+ const session = await logger.task('正在校验 Heybox 登录态', () => (runtime.requireAuthSession ?? index.requireHeyboxAuthSession)({ loginBaseUrl }), { successText: 'Heybox 登录态有效' });
591
597
  logger.debug(`Heybox API: ${apiBaseUrl}`);
592
598
  const uploadVersion = validateVersionForDeploy(packageJson.version, 'package.json.version');
593
599
  const deploy = async () => {
@@ -602,7 +608,7 @@ async function runDeployCommand(options, runtime = {}) {
602
608
  env,
603
609
  fetchImpl: runtime.fetchImpl,
604
610
  loginBaseUrl,
605
- session: session$1,
611
+ session,
606
612
  });
607
613
  await context.migrateBasicInfo(projectRoot, bound.detail, miniProgramId, runtime.fetchImpl);
608
614
  }
@@ -612,7 +618,7 @@ async function runDeployCommand(options, runtime = {}) {
612
618
  }
613
619
  precheckVersion = uploadVersion;
614
620
  await runVersionPrecheck({
615
- session: session$1,
621
+ session,
616
622
  miniProgramId,
617
623
  version: precheckVersion,
618
624
  releaseNote,
@@ -627,7 +633,7 @@ async function runDeployCommand(options, runtime = {}) {
627
633
  env,
628
634
  fetchImpl: runtime.fetchImpl,
629
635
  loginBaseUrl,
630
- session: session$1,
636
+ session,
631
637
  }), { successText: '已读取远端小程序权限' });
632
638
  const localNetworkEnabled = !localPermissions.declared || localPermissions.permissions?.network?.enabled === true;
633
639
  skipPlatformCsp = localNetworkEnabled && context.shouldSkipMiniappPlatformCsp(detail.runtime_permissions);
@@ -678,7 +684,7 @@ async function runDeployCommand(options, runtime = {}) {
678
684
  throw new Error('dist/manifest.json.bindAppIds 与 package.json#heybox.bindAppIds 不一致,请重新 build 后再 deploy');
679
685
  }
680
686
  await runVersionPrecheck({
681
- session: session$1,
687
+ session,
682
688
  miniProgramId,
683
689
  version,
684
690
  manifest,
@@ -706,6 +712,7 @@ async function runDeployCommand(options, runtime = {}) {
706
712
  // deploy 期间 dist 视为稳定构建输出;为避免持有大量文件描述符,签名和上传不会共享打开的文件句柄。
707
713
  const artifactReceipt = await logger.task('正在计算构建产物签名', () => (runtime.computeMiniappArtifactReceipt ?? computeMiniappArtifactReceipt)(uploadFiles), { successText: '构建产物签名计算完成' });
708
714
  runtimePermissionEnv.validateMiniappCompanionFileReceipts(manifest?.companions, artifactReceipt.files);
715
+ runtimePermissionEnv.validateMiniappWorkspaceCardFileReceipts(manifest?.workspaceCards, artifactReceipt.files);
709
716
  const profile = runtimePermissionEnv.parseMiniappBasicInfo(manifest, String(manifest.sdkVersion));
710
717
  if (profile) {
711
718
  const localProfile = runtimePermissionEnv.parseMiniappBasicInfo((await readPackageJson(projectRoot)).heybox ?? {});
@@ -727,7 +734,7 @@ async function runDeployCommand(options, runtime = {}) {
727
734
  }
728
735
  const createdUploadSession = await logger.task('正在创建或恢复上传会话', async () => {
729
736
  const result = await (runtime.createUserMiniprogramUploadSession ?? createUserMiniprogramUploadSession)({
730
- session: session$1,
737
+ session,
731
738
  miniProgramId,
732
739
  version,
733
740
  manifest,
@@ -773,7 +780,7 @@ async function runDeployCommand(options, runtime = {}) {
773
780
  const uploadedCompanions = createdUploadSession.files.filter(item => item.file.relativePath.startsWith('companions/') && !missingKeys.has(item.key));
774
781
  for (let index = 0; index < uploadedCompanions.length; index += runtimePermissionEnv.MINIAPP_UPLOAD_BATCH_SIZE) {
775
782
  await (runtime.recordUserMiniprogramUploadResult ?? recordUserMiniprogramUploadResult)({
776
- session: session$1, miniProgramId, version, sessionId: uploadSessionId,
783
+ session, miniProgramId, version, sessionId: uploadSessionId,
777
784
  files: uploadedCompanions.slice(index, index + runtimePermissionEnv.MINIAPP_UPLOAD_BATCH_SIZE)
778
785
  .map(({ file }) => ({ path: file.relativePath, size: file.size, sha256: file.sha256 })),
779
786
  }, { baseUrl: apiBaseUrl, fetchImpl: runtime.fetchImpl });
@@ -787,12 +794,12 @@ async function runDeployCommand(options, runtime = {}) {
787
794
  miniProgramId,
788
795
  });
789
796
  await (runtime.runUpload ?? runUpload)({
790
- session: session$1,
797
+ session,
791
798
  files: createdUploadSession.missingFiles.map(({ file, key }) => ({ ...file, key })),
792
799
  miniProgramId,
793
800
  version,
794
801
  uploadSessionId,
795
- }, { baseUrl: apiBaseUrl, fetchImpl: runtime.fetchImpl, logger });
802
+ }, { baseUrl: apiBaseUrl, cdnBaseUrl: index.HEYBOX_API_BASE_URL, fetchImpl: runtime.fetchImpl, logger });
796
803
  }
797
804
  }
798
805
  catch (error) {
@@ -800,7 +807,7 @@ async function runDeployCommand(options, runtime = {}) {
800
807
  }
801
808
  }
802
809
  try {
803
- const submitOptions = { session: session$1, miniProgramId, sessionId: uploadSessionId, preflightToken };
810
+ const submitOptions = { session, miniProgramId, sessionId: uploadSessionId, preflightToken };
804
811
  submitAuditResult = await logger.task('正在提交审核', () => (runtime.submitUserMiniprogramAudit ?? submitUserMiniprogramAudit)(submitOptions, {
805
812
  baseUrl: apiBaseUrl,
806
813
  fetchImpl: runtime.fetchImpl,
@@ -884,6 +891,10 @@ async function readDeployManifest(projectRoot, logger) {
884
891
  logger.warn('dist/manifest.json 包含 BOM,已自动剥离');
885
892
  }
886
893
  const validated = runtimePermissionEnv.validateMiniappManifestForDeploy(manifest);
894
+ if (validated.workspaceCards) {
895
+ runtimeGate.verifyWorkspaceCardsSnapshot({ ...validated, bindAppIds: validated.bindAppIds ?? [], workspaceCards: validated.workspaceCards });
896
+ runtimeGate.verifyWorkspaceCardArtifacts(distDir, validated.workspaceCards);
897
+ }
887
898
  const bindAppIds = validated.bindAppIds ?? [];
888
899
  return {
889
900
  manifest: {
@@ -1203,7 +1214,7 @@ async function runRemoteDeployCommand(options, runtime) {
1203
1214
  return finishRemoteCommand(options, runtime, output);
1204
1215
  }
1205
1216
  async function createRemoteCommandContext(options, runtime) {
1206
- index.applyServiceTagIfNeeded(options.serviceTag);
1217
+ index.applyMiniProgramServiceTagIfNeeded(options.serviceTag);
1207
1218
  const logger = resolveRemoteLogger(options, runtime);
1208
1219
  const environment = await context.resolveRemoteEnvironment({
1209
1220
  allowUnsafeApiBaseUrl: options.allowUnsafeApiBaseUrl,
@@ -1323,7 +1334,7 @@ async function remoteEntitySwitch(options, context, runtime) {
1323
1334
  throw new Error('远端响应缺少 entity_id');
1324
1335
  }
1325
1336
  const switchedOwnerHeyboxId = normalizePositiveInteger(switched.owner_heybox_id);
1326
- await session.setSelectedDeveloperEntitySnapshot({
1337
+ await index.setSelectedDeveloperEntitySnapshot({
1327
1338
  entityId: switchedEntityId,
1328
1339
  entityName: switched.entity_name || '--',
1329
1340
  ...(switchedOwnerHeyboxId !== undefined ? { ownerHeyboxId: switchedOwnerHeyboxId } : {}),