@heybox/hb-sdk 0.8.0-alpha → 0.8.0-alpha.2

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 (52) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/README.md +67 -14
  3. package/THIRD_PARTY_NOTICES.md +1755 -0
  4. package/dist/cli-chunks/{build-DJWFSM1B.cjs → build-CCLWgXyA.cjs} +2 -2
  5. package/dist/cli-chunks/{context-DV2UK1Nz.cjs → context-Brh56h56.cjs} +1 -26
  6. package/dist/cli-chunks/{create-2HfoB48V.cjs → create-BZ-hi2s1.cjs} +1 -1
  7. package/dist/cli-chunks/{dev-Dgt2zS9k.cjs → dev-CoSXtEYa.cjs} +335 -516
  8. package/dist/cli-chunks/{doctor-C95gIao_.cjs → doctor-EsCYJGhV.cjs} +1 -1
  9. package/dist/cli-chunks/{index-D62ANeBv.cjs → index-BL5eEPap.cjs} +14 -14
  10. package/dist/cli-chunks/{index-BjoSXl8C.cjs → index-CS6Q0o5C.cjs} +1 -1
  11. package/dist/cli-chunks/{index.esm-CigcxJ2B.cjs → index.esm-BoBHPfpq.cjs} +5 -5
  12. package/dist/cli-chunks/{login-Cumknwdx.cjs → login-CILLxGuf.cjs} +2 -2
  13. package/dist/cli-chunks/{project-vite-CcE-HMmd.cjs → project-vite-Qu6Xe9Dn.cjs} +1 -1
  14. package/dist/cli-chunks/{remote-DDdP3xcE.cjs → remote-DRuTQ51u.cjs} +4 -4
  15. package/dist/cli-chunks/{session-BDi_AZSv.cjs → session-D-_N3WVL.cjs} +1 -1
  16. package/dist/cli.cjs +1 -1
  17. package/dist/devtools/browser-dev-host/assets/browser-dev-host-uq-Wac6k.js +97 -0
  18. package/dist/devtools/browser-dev-host/assets/heybox-logo-CogNENsk.svg +6 -0
  19. package/dist/devtools/browser-dev-host/assets/index-CeP6SLB3.js +567 -0
  20. package/dist/devtools/browser-dev-host/assets/index-KD2f3Jdz.css +1 -0
  21. package/dist/devtools/browser-dev-host/assets/workbench-state-D-1U0JRq.js +5 -0
  22. package/dist/devtools/browser-dev-host/index.html +6 -435
  23. package/dist/index.cjs.js +924 -28
  24. package/dist/index.esm.js +924 -29
  25. package/dist/protocol.cjs.js +208 -6
  26. package/dist/protocol.esm.js +182 -7
  27. package/dist/vite.cjs.js +1 -1
  28. package/dist/vite.esm.js +1 -1
  29. package/package.json +23 -9
  30. package/skill/SKILL.md +9 -5
  31. package/skill/references/api-protocol.md +99 -3
  32. package/skill/references/api-root.md +141 -14
  33. package/skill/references/cli.md +21 -17
  34. package/skill/references/examples.md +29 -0
  35. package/skill/references/recipes.md +105 -1
  36. package/skill/references/safety-boundaries.md +11 -0
  37. package/skill/scripts/sync-references.mjs +34 -2
  38. package/skill/skill.json +4 -4
  39. package/types/core/client.d.ts +17 -1
  40. package/types/core/sdk.d.ts +3 -0
  41. package/types/core/singleton.d.ts +3 -0
  42. package/types/index.d.ts +4 -2
  43. package/types/modules/files/index.d.ts +5 -0
  44. package/types/modules/files/registry.d.ts +35 -0
  45. package/types/modules/files/types.d.ts +159 -0
  46. package/types/modules/network/index.d.ts +50 -3
  47. package/types/protocol/capabilities.d.ts +2 -2
  48. package/types/protocol/constants.d.ts +1 -1
  49. package/types/protocol/guards.d.ts +1 -1
  50. package/types/protocol/types.d.ts +1 -1
  51. package/types/protocol.d.ts +4 -3
  52. package/dist/devtools/browser-dev-host/main.js +0 -12263
@@ -12,6 +12,22 @@ const VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD = 'viewport.setNavigationBarStyle
12
12
  const STORAGE_GET_STORAGE_METHOD = 'storage.getStorage';
13
13
  const STORAGE_SET_STORAGE_METHOD = 'storage.setStorage';
14
14
  const NETWORK_REQUEST_METHOD = 'network.request';
15
+ const NETWORK_DOWNLOAD_METHOD = 'network.download';
16
+ const FILES_PICK_FILES_METHOD = 'files.pickFiles';
17
+ const FILES_PICK_DIRECTORY_METHOD = 'files.pickDirectory';
18
+ const FILES_SAVE_FILE_METHOD = 'files.saveFile';
19
+ const FILE_CREATE_METHOD = 'file.create';
20
+ const FILE_REMOVE_METHOD = 'file.remove';
21
+ const FILE_EXISTS_METHOD = 'file.exists';
22
+ const FILE_READ_TEXT_METHOD = 'file.readText';
23
+ const FILE_WRITE_TEXT_METHOD = 'file.writeText';
24
+ const FILE_READ_BYTES_METHOD = 'file.readBytes';
25
+ const FILE_WRITE_BYTES_METHOD = 'file.writeBytes';
26
+ const FILE_STAT_METHOD = 'file.stat';
27
+ const DIRECTORY_CREATE_METHOD = 'directory.create';
28
+ const DIRECTORY_REMOVE_METHOD = 'directory.remove';
29
+ const DIRECTORY_EXISTS_METHOD = 'directory.exists';
30
+ const DIRECTORY_LIST_METHOD = 'directory.list';
15
31
  const UI_SHOW_TOAST_METHOD = 'ui.showToast';
16
32
  const UI_SHOW_LOADING_METHOD = 'ui.showLoading';
17
33
  const UI_HIDE_LOADING_METHOD = 'ui.hideLoading';
@@ -62,6 +78,46 @@ const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
62
78
  { method: STORAGE_GET_STORAGE_METHOD, module: 'storage', capability: STORAGE_GET_STORAGE_METHOD, permission: 'storage.read', risk: 'low' },
63
79
  { method: STORAGE_SET_STORAGE_METHOD, module: 'storage', capability: STORAGE_SET_STORAGE_METHOD, permission: 'storage.write', risk: 'medium' },
64
80
  { method: NETWORK_REQUEST_METHOD, module: 'network', capability: NETWORK_REQUEST_METHOD, permission: 'network.request', risk: 'high' },
81
+ { method: NETWORK_DOWNLOAD_METHOD, module: 'network', capability: NETWORK_DOWNLOAD_METHOD, permission: 'network.request', risk: 'high' },
82
+ { method: FILES_PICK_FILES_METHOD, module: 'files', capability: FILES_PICK_FILES_METHOD, permission: 'files.external', risk: 'high' },
83
+ {
84
+ method: FILES_PICK_DIRECTORY_METHOD,
85
+ module: 'files',
86
+ capability: FILES_PICK_DIRECTORY_METHOD,
87
+ permission: 'files.external',
88
+ risk: 'high',
89
+ },
90
+ { method: FILES_SAVE_FILE_METHOD, module: 'files', capability: FILES_SAVE_FILE_METHOD, permission: 'files.external', risk: 'high' },
91
+ { method: FILE_CREATE_METHOD, module: 'file', capability: FILE_CREATE_METHOD, permission: 'files.access', risk: 'high' },
92
+ { method: FILE_REMOVE_METHOD, module: 'file', capability: FILE_REMOVE_METHOD, permission: 'files.access', risk: 'high' },
93
+ { method: FILE_EXISTS_METHOD, module: 'file', capability: FILE_EXISTS_METHOD, permission: 'files.access', risk: 'high' },
94
+ { method: FILE_READ_TEXT_METHOD, module: 'file', capability: FILE_READ_TEXT_METHOD, permission: 'files.access', risk: 'high' },
95
+ { method: FILE_WRITE_TEXT_METHOD, module: 'file', capability: FILE_WRITE_TEXT_METHOD, permission: 'files.access', risk: 'high' },
96
+ { method: FILE_READ_BYTES_METHOD, module: 'file', capability: FILE_READ_BYTES_METHOD, permission: 'files.access', risk: 'high' },
97
+ { method: FILE_WRITE_BYTES_METHOD, module: 'file', capability: FILE_WRITE_BYTES_METHOD, permission: 'files.access', risk: 'high' },
98
+ { method: FILE_STAT_METHOD, module: 'file', capability: FILE_STAT_METHOD, permission: 'files.access', risk: 'high' },
99
+ {
100
+ method: DIRECTORY_CREATE_METHOD,
101
+ module: 'directory',
102
+ capability: DIRECTORY_CREATE_METHOD,
103
+ permission: 'files.access',
104
+ risk: 'high',
105
+ },
106
+ {
107
+ method: DIRECTORY_REMOVE_METHOD,
108
+ module: 'directory',
109
+ capability: DIRECTORY_REMOVE_METHOD,
110
+ permission: 'files.access',
111
+ risk: 'high',
112
+ },
113
+ {
114
+ method: DIRECTORY_EXISTS_METHOD,
115
+ module: 'directory',
116
+ capability: DIRECTORY_EXISTS_METHOD,
117
+ permission: 'files.access',
118
+ risk: 'high',
119
+ },
120
+ { method: DIRECTORY_LIST_METHOD, module: 'directory', capability: DIRECTORY_LIST_METHOD, permission: 'files.access', risk: 'high' },
65
121
  { method: UI_SHOW_TOAST_METHOD, module: 'ui', capability: UI_SHOW_TOAST_METHOD, permission: 'ui.toast', risk: 'low' },
66
122
  { method: UI_SHOW_LOADING_METHOD, module: 'ui', capability: UI_SHOW_LOADING_METHOD, permission: 'ui.loading', risk: 'low' },
67
123
  { method: UI_HIDE_LOADING_METHOD, module: 'ui', capability: UI_HIDE_LOADING_METHOD, permission: 'ui.loading', risk: 'low' },
@@ -126,15 +182,134 @@ const SDK_HANDSHAKE_METHOD = 'sdk.handshake';
126
182
  const RUNTIME_LOCATION_PROBE_METHOD = 'runtime.location.probe';
127
183
  const SDK_LOCATION_REPORT_METHOD = 'sdk.location.report';
128
184
  const SDK_CSP_VIOLATION_METHOD = 'sdk.csp.violation';
185
+ const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress';
129
186
 
130
187
  function isMiniProgramBridgeMessage(value) {
131
- if (!value || typeof value !== 'object')
188
+ if (!isRecord$1(value))
189
+ return false;
190
+ if (value.namespace !== MINI_PROGRAM_MESSAGE_NAMESPACE || (value.version !== 1 && value.version !== 2) || !isNonEmptyString(value.nonce)) {
132
191
  return false;
133
- const message = value;
134
- return (message.namespace === MINI_PROGRAM_MESSAGE_NAMESPACE &&
135
- (message.version === 1 || message.version === 2) &&
136
- typeof message.nonce === 'string' &&
137
- typeof message.type === 'string');
192
+ }
193
+ if (value.type === 'handshake') {
194
+ return isNonEmptyString(value.id) && value.method === SDK_HANDSHAKE_METHOD && value.error === undefined && isSDKHandshakePayload(value.payload);
195
+ }
196
+ if (value.type === 'request') {
197
+ return isNonEmptyString(value.id) && isNonEmptyString(value.method) && value.error === undefined;
198
+ }
199
+ if (value.type === 'response') {
200
+ return (isNonEmptyString(value.id) &&
201
+ (value.method === undefined || isNonEmptyString(value.method)) &&
202
+ (value.error === undefined || isBridgeError(value.error)));
203
+ }
204
+ if (value.type === 'event') {
205
+ if (!isNonEmptyString(value.method) || value.error !== undefined)
206
+ return false;
207
+ if (value.method === MINI_PROGRAM_OPERATION_PROGRESS_METHOD) {
208
+ return value.version === 2 && isNonEmptyString(value.id) && isMiniProgramDownloadProgressPayload(value.payload);
209
+ }
210
+ return value.id === undefined || isNonEmptyString(value.id);
211
+ }
212
+ if (value.type === 'cancel') {
213
+ return (value.version === 2 && isNonEmptyString(value.id) && value.method === undefined && value.payload === undefined && value.error === undefined);
214
+ }
215
+ return false;
216
+ }
217
+ function isMiniProgramRelativePath(value) {
218
+ if (typeof value !== 'string' || !value || value.startsWith('/') || value.endsWith('/')) {
219
+ return false;
220
+ }
221
+ if (/[\\\u0000-\u001f\u007f]/.test(value))
222
+ return false;
223
+ return value.split('/').every((segment) => Boolean(segment) && segment !== '.' && segment !== '..');
224
+ }
225
+ function isMiniProgramPathRootRef(value) {
226
+ if (!isRecord$1(value))
227
+ return false;
228
+ if (value.kind === 'sandbox')
229
+ return hasOnlyKeys(value, ['kind']);
230
+ return value.kind === 'directory' && isNonEmptyString(value.handleId) && hasOnlyKeys(value, ['kind', 'handleId']);
231
+ }
232
+ function isMiniProgramFileRef(value) {
233
+ if (!isRecord$1(value) || value.kind !== 'file')
234
+ return false;
235
+ if (isNonEmptyString(value.handleId)) {
236
+ return hasOnlyKeys(value, ['kind', 'handleId']);
237
+ }
238
+ return (isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
239
+ }
240
+ function isMiniProgramDirectoryRef(value) {
241
+ if (!isRecord$1(value) || value.kind !== 'directory')
242
+ return false;
243
+ if (isNonEmptyString(value.handleId)) {
244
+ return hasOnlyKeys(value, ['kind', 'handleId']);
245
+ }
246
+ return (isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
247
+ }
248
+ function isMiniProgramFileDescriptor(value) {
249
+ return (isRecord$1(value) &&
250
+ value.kind === 'file' &&
251
+ isNonEmptyString(value.name) &&
252
+ isFileMode(value.mode) &&
253
+ isMiniProgramFileRef(value.ref) &&
254
+ hasOnlyKeys(value, ['kind', 'name', 'mode', 'ref']));
255
+ }
256
+ function isMiniProgramDirectoryDescriptor(value) {
257
+ return (isRecord$1(value) &&
258
+ value.kind === 'directory' &&
259
+ isNonEmptyString(value.name) &&
260
+ isFileMode(value.mode) &&
261
+ isMiniProgramDirectoryRef(value.ref) &&
262
+ hasOnlyKeys(value, ['kind', 'name', 'mode', 'ref']));
263
+ }
264
+ function isMiniProgramFileSystemEntityDescriptor(value) {
265
+ return isMiniProgramFileDescriptor(value) || isMiniProgramDirectoryDescriptor(value);
266
+ }
267
+ function isMiniProgramByteArray(value) {
268
+ return value instanceof Uint8Array && value.buffer instanceof ArrayBuffer;
269
+ }
270
+ function isMiniProgramFileStat(value) {
271
+ return (isRecord$1(value) &&
272
+ value.kind === 'file' &&
273
+ isNonNegativeSafeInteger(value.size) &&
274
+ (value.modifiedAt === undefined || isNonNegativeFiniteNumber(value.modifiedAt)) &&
275
+ (value.createdAt === undefined || isNonNegativeFiniteNumber(value.createdAt)) &&
276
+ hasOnlyKeys(value, ['kind', 'size', 'modifiedAt', 'createdAt']));
277
+ }
278
+ function isMiniProgramDownloadProgressPayload(value) {
279
+ if (!isRecord$1(value) ||
280
+ !isNonNegativeSafeInteger(value.loaded) ||
281
+ typeof value.lengthComputable !== 'boolean' ||
282
+ !hasOnlyKeys(value, ['loaded', 'total', 'lengthComputable'])) {
283
+ return false;
284
+ }
285
+ if (!value.lengthComputable)
286
+ return value.total === undefined;
287
+ return isNonNegativeSafeInteger(value.total) && value.loaded <= value.total;
288
+ }
289
+ function isSDKHandshakePayload(value) {
290
+ return isRecord$1(value) && isNonEmptyString(value.href) && typeof value.userAgent === 'string' && isNonEmptyString(value.sdkVersion);
291
+ }
292
+ function isBridgeError(value) {
293
+ return isRecord$1(value) && isNonEmptyString(value.code) && typeof value.message === 'string';
294
+ }
295
+ function isFileMode(value) {
296
+ return value === 'read' || value === 'readwrite';
297
+ }
298
+ function isNonNegativeSafeInteger(value) {
299
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
300
+ }
301
+ function isNonNegativeFiniteNumber(value) {
302
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0;
303
+ }
304
+ function isNonEmptyString(value) {
305
+ return typeof value === 'string' && value.length > 0;
306
+ }
307
+ function hasOnlyKeys(value, allowedKeys) {
308
+ const allowed = new Set(allowedKeys);
309
+ return Object.keys(value).every((key) => allowed.has(key));
310
+ }
311
+ function isRecord$1(value) {
312
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
138
313
  }
139
314
 
140
315
  /** 当前用户信息与登录能力支持的完整 scope 目录。 */
@@ -187,13 +362,30 @@ exports.CLOUD_LEADERBOARD_GET_LIST_METHOD = CLOUD_LEADERBOARD_GET_LIST_METHOD;
187
362
  exports.CLOUD_LEADERBOARD_SUBMIT_METHOD = CLOUD_LEADERBOARD_SUBMIT_METHOD;
188
363
  exports.DEVICE_SET_CLIPBOARD_METHOD = DEVICE_SET_CLIPBOARD_METHOD;
189
364
  exports.DEVICE_VIBRATE_METHOD = DEVICE_VIBRATE_METHOD;
365
+ exports.DIRECTORY_CREATE_METHOD = DIRECTORY_CREATE_METHOD;
366
+ exports.DIRECTORY_EXISTS_METHOD = DIRECTORY_EXISTS_METHOD;
367
+ exports.DIRECTORY_LIST_METHOD = DIRECTORY_LIST_METHOD;
368
+ exports.DIRECTORY_REMOVE_METHOD = DIRECTORY_REMOVE_METHOD;
369
+ exports.FILES_PICK_DIRECTORY_METHOD = FILES_PICK_DIRECTORY_METHOD;
370
+ exports.FILES_PICK_FILES_METHOD = FILES_PICK_FILES_METHOD;
371
+ exports.FILES_SAVE_FILE_METHOD = FILES_SAVE_FILE_METHOD;
372
+ exports.FILE_CREATE_METHOD = FILE_CREATE_METHOD;
373
+ exports.FILE_EXISTS_METHOD = FILE_EXISTS_METHOD;
374
+ exports.FILE_READ_BYTES_METHOD = FILE_READ_BYTES_METHOD;
375
+ exports.FILE_READ_TEXT_METHOD = FILE_READ_TEXT_METHOD;
376
+ exports.FILE_REMOVE_METHOD = FILE_REMOVE_METHOD;
377
+ exports.FILE_STAT_METHOD = FILE_STAT_METHOD;
378
+ exports.FILE_WRITE_BYTES_METHOD = FILE_WRITE_BYTES_METHOD;
379
+ exports.FILE_WRITE_TEXT_METHOD = FILE_WRITE_TEXT_METHOD;
190
380
  exports.MINI_PROGRAM_BRIDGE_NONCE_PARAM = MINI_PROGRAM_BRIDGE_NONCE_PARAM;
191
381
  exports.MINI_PROGRAM_MESSAGE_NAMESPACE = MINI_PROGRAM_MESSAGE_NAMESPACE;
192
382
  exports.MINI_PROGRAM_MESSAGE_VERSION = MINI_PROGRAM_MESSAGE_VERSION;
383
+ exports.MINI_PROGRAM_OPERATION_PROGRESS_METHOD = MINI_PROGRAM_OPERATION_PROGRESS_METHOD;
193
384
  exports.MINI_PROGRAM_PROTOCOL_CAPABILITIES = MINI_PROGRAM_PROTOCOL_CAPABILITIES;
194
385
  exports.NAVIGATION_CLOSE_METHOD = NAVIGATION_CLOSE_METHOD;
195
386
  exports.NAVIGATION_OPEN_APP_PAGE_METHOD = NAVIGATION_OPEN_APP_PAGE_METHOD;
196
387
  exports.NAVIGATION_RELOAD_METHOD = NAVIGATION_RELOAD_METHOD;
388
+ exports.NETWORK_DOWNLOAD_METHOD = NETWORK_DOWNLOAD_METHOD;
197
389
  exports.NETWORK_REQUEST_METHOD = NETWORK_REQUEST_METHOD;
198
390
  exports.RUNTIME_LOCATION_PROBE_METHOD = RUNTIME_LOCATION_PROBE_METHOD;
199
391
  exports.SDK_CSP_VIOLATION_METHOD = SDK_CSP_VIOLATION_METHOD;
@@ -215,4 +407,14 @@ exports.VIEWPORT_GET_WINDOW_INFO_METHOD = VIEWPORT_GET_WINDOW_INFO_METHOD;
215
407
  exports.VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD = VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD;
216
408
  exports.isManagedMiniProgramRuntimePermissionKey = isManagedMiniProgramRuntimePermissionKey;
217
409
  exports.isMiniProgramBridgeMessage = isMiniProgramBridgeMessage;
410
+ exports.isMiniProgramByteArray = isMiniProgramByteArray;
411
+ exports.isMiniProgramDirectoryDescriptor = isMiniProgramDirectoryDescriptor;
412
+ exports.isMiniProgramDirectoryRef = isMiniProgramDirectoryRef;
413
+ exports.isMiniProgramDownloadProgressPayload = isMiniProgramDownloadProgressPayload;
414
+ exports.isMiniProgramFileDescriptor = isMiniProgramFileDescriptor;
415
+ exports.isMiniProgramFileRef = isMiniProgramFileRef;
416
+ exports.isMiniProgramFileStat = isMiniProgramFileStat;
417
+ exports.isMiniProgramFileSystemEntityDescriptor = isMiniProgramFileSystemEntityDescriptor;
418
+ exports.isMiniProgramPathRootRef = isMiniProgramPathRootRef;
419
+ exports.isMiniProgramRelativePath = isMiniProgramRelativePath;
218
420
  exports.parseMiniProgramRuntimePermissions = parseMiniProgramRuntimePermissions;
@@ -10,6 +10,22 @@ const VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD = 'viewport.setNavigationBarStyle
10
10
  const STORAGE_GET_STORAGE_METHOD = 'storage.getStorage';
11
11
  const STORAGE_SET_STORAGE_METHOD = 'storage.setStorage';
12
12
  const NETWORK_REQUEST_METHOD = 'network.request';
13
+ const NETWORK_DOWNLOAD_METHOD = 'network.download';
14
+ const FILES_PICK_FILES_METHOD = 'files.pickFiles';
15
+ const FILES_PICK_DIRECTORY_METHOD = 'files.pickDirectory';
16
+ const FILES_SAVE_FILE_METHOD = 'files.saveFile';
17
+ const FILE_CREATE_METHOD = 'file.create';
18
+ const FILE_REMOVE_METHOD = 'file.remove';
19
+ const FILE_EXISTS_METHOD = 'file.exists';
20
+ const FILE_READ_TEXT_METHOD = 'file.readText';
21
+ const FILE_WRITE_TEXT_METHOD = 'file.writeText';
22
+ const FILE_READ_BYTES_METHOD = 'file.readBytes';
23
+ const FILE_WRITE_BYTES_METHOD = 'file.writeBytes';
24
+ const FILE_STAT_METHOD = 'file.stat';
25
+ const DIRECTORY_CREATE_METHOD = 'directory.create';
26
+ const DIRECTORY_REMOVE_METHOD = 'directory.remove';
27
+ const DIRECTORY_EXISTS_METHOD = 'directory.exists';
28
+ const DIRECTORY_LIST_METHOD = 'directory.list';
13
29
  const UI_SHOW_TOAST_METHOD = 'ui.showToast';
14
30
  const UI_SHOW_LOADING_METHOD = 'ui.showLoading';
15
31
  const UI_HIDE_LOADING_METHOD = 'ui.hideLoading';
@@ -60,6 +76,46 @@ const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
60
76
  { method: STORAGE_GET_STORAGE_METHOD, module: 'storage', capability: STORAGE_GET_STORAGE_METHOD, permission: 'storage.read', risk: 'low' },
61
77
  { method: STORAGE_SET_STORAGE_METHOD, module: 'storage', capability: STORAGE_SET_STORAGE_METHOD, permission: 'storage.write', risk: 'medium' },
62
78
  { method: NETWORK_REQUEST_METHOD, module: 'network', capability: NETWORK_REQUEST_METHOD, permission: 'network.request', risk: 'high' },
79
+ { method: NETWORK_DOWNLOAD_METHOD, module: 'network', capability: NETWORK_DOWNLOAD_METHOD, permission: 'network.request', risk: 'high' },
80
+ { method: FILES_PICK_FILES_METHOD, module: 'files', capability: FILES_PICK_FILES_METHOD, permission: 'files.external', risk: 'high' },
81
+ {
82
+ method: FILES_PICK_DIRECTORY_METHOD,
83
+ module: 'files',
84
+ capability: FILES_PICK_DIRECTORY_METHOD,
85
+ permission: 'files.external',
86
+ risk: 'high',
87
+ },
88
+ { method: FILES_SAVE_FILE_METHOD, module: 'files', capability: FILES_SAVE_FILE_METHOD, permission: 'files.external', risk: 'high' },
89
+ { method: FILE_CREATE_METHOD, module: 'file', capability: FILE_CREATE_METHOD, permission: 'files.access', risk: 'high' },
90
+ { method: FILE_REMOVE_METHOD, module: 'file', capability: FILE_REMOVE_METHOD, permission: 'files.access', risk: 'high' },
91
+ { method: FILE_EXISTS_METHOD, module: 'file', capability: FILE_EXISTS_METHOD, permission: 'files.access', risk: 'high' },
92
+ { method: FILE_READ_TEXT_METHOD, module: 'file', capability: FILE_READ_TEXT_METHOD, permission: 'files.access', risk: 'high' },
93
+ { method: FILE_WRITE_TEXT_METHOD, module: 'file', capability: FILE_WRITE_TEXT_METHOD, permission: 'files.access', risk: 'high' },
94
+ { method: FILE_READ_BYTES_METHOD, module: 'file', capability: FILE_READ_BYTES_METHOD, permission: 'files.access', risk: 'high' },
95
+ { method: FILE_WRITE_BYTES_METHOD, module: 'file', capability: FILE_WRITE_BYTES_METHOD, permission: 'files.access', risk: 'high' },
96
+ { method: FILE_STAT_METHOD, module: 'file', capability: FILE_STAT_METHOD, permission: 'files.access', risk: 'high' },
97
+ {
98
+ method: DIRECTORY_CREATE_METHOD,
99
+ module: 'directory',
100
+ capability: DIRECTORY_CREATE_METHOD,
101
+ permission: 'files.access',
102
+ risk: 'high',
103
+ },
104
+ {
105
+ method: DIRECTORY_REMOVE_METHOD,
106
+ module: 'directory',
107
+ capability: DIRECTORY_REMOVE_METHOD,
108
+ permission: 'files.access',
109
+ risk: 'high',
110
+ },
111
+ {
112
+ method: DIRECTORY_EXISTS_METHOD,
113
+ module: 'directory',
114
+ capability: DIRECTORY_EXISTS_METHOD,
115
+ permission: 'files.access',
116
+ risk: 'high',
117
+ },
118
+ { method: DIRECTORY_LIST_METHOD, module: 'directory', capability: DIRECTORY_LIST_METHOD, permission: 'files.access', risk: 'high' },
63
119
  { method: UI_SHOW_TOAST_METHOD, module: 'ui', capability: UI_SHOW_TOAST_METHOD, permission: 'ui.toast', risk: 'low' },
64
120
  { method: UI_SHOW_LOADING_METHOD, module: 'ui', capability: UI_SHOW_LOADING_METHOD, permission: 'ui.loading', risk: 'low' },
65
121
  { method: UI_HIDE_LOADING_METHOD, module: 'ui', capability: UI_HIDE_LOADING_METHOD, permission: 'ui.loading', risk: 'low' },
@@ -124,15 +180,134 @@ const SDK_HANDSHAKE_METHOD = 'sdk.handshake';
124
180
  const RUNTIME_LOCATION_PROBE_METHOD = 'runtime.location.probe';
125
181
  const SDK_LOCATION_REPORT_METHOD = 'sdk.location.report';
126
182
  const SDK_CSP_VIOLATION_METHOD = 'sdk.csp.violation';
183
+ const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress';
127
184
 
128
185
  function isMiniProgramBridgeMessage(value) {
129
- if (!value || typeof value !== 'object')
186
+ if (!isRecord$1(value))
187
+ return false;
188
+ if (value.namespace !== MINI_PROGRAM_MESSAGE_NAMESPACE || (value.version !== 1 && value.version !== 2) || !isNonEmptyString(value.nonce)) {
130
189
  return false;
131
- const message = value;
132
- return (message.namespace === MINI_PROGRAM_MESSAGE_NAMESPACE &&
133
- (message.version === 1 || message.version === 2) &&
134
- typeof message.nonce === 'string' &&
135
- typeof message.type === 'string');
190
+ }
191
+ if (value.type === 'handshake') {
192
+ return isNonEmptyString(value.id) && value.method === SDK_HANDSHAKE_METHOD && value.error === undefined && isSDKHandshakePayload(value.payload);
193
+ }
194
+ if (value.type === 'request') {
195
+ return isNonEmptyString(value.id) && isNonEmptyString(value.method) && value.error === undefined;
196
+ }
197
+ if (value.type === 'response') {
198
+ return (isNonEmptyString(value.id) &&
199
+ (value.method === undefined || isNonEmptyString(value.method)) &&
200
+ (value.error === undefined || isBridgeError(value.error)));
201
+ }
202
+ if (value.type === 'event') {
203
+ if (!isNonEmptyString(value.method) || value.error !== undefined)
204
+ return false;
205
+ if (value.method === MINI_PROGRAM_OPERATION_PROGRESS_METHOD) {
206
+ return value.version === 2 && isNonEmptyString(value.id) && isMiniProgramDownloadProgressPayload(value.payload);
207
+ }
208
+ return value.id === undefined || isNonEmptyString(value.id);
209
+ }
210
+ if (value.type === 'cancel') {
211
+ return (value.version === 2 && isNonEmptyString(value.id) && value.method === undefined && value.payload === undefined && value.error === undefined);
212
+ }
213
+ return false;
214
+ }
215
+ function isMiniProgramRelativePath(value) {
216
+ if (typeof value !== 'string' || !value || value.startsWith('/') || value.endsWith('/')) {
217
+ return false;
218
+ }
219
+ if (/[\\\u0000-\u001f\u007f]/.test(value))
220
+ return false;
221
+ return value.split('/').every((segment) => Boolean(segment) && segment !== '.' && segment !== '..');
222
+ }
223
+ function isMiniProgramPathRootRef(value) {
224
+ if (!isRecord$1(value))
225
+ return false;
226
+ if (value.kind === 'sandbox')
227
+ return hasOnlyKeys(value, ['kind']);
228
+ return value.kind === 'directory' && isNonEmptyString(value.handleId) && hasOnlyKeys(value, ['kind', 'handleId']);
229
+ }
230
+ function isMiniProgramFileRef(value) {
231
+ if (!isRecord$1(value) || value.kind !== 'file')
232
+ return false;
233
+ if (isNonEmptyString(value.handleId)) {
234
+ return hasOnlyKeys(value, ['kind', 'handleId']);
235
+ }
236
+ return (isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
237
+ }
238
+ function isMiniProgramDirectoryRef(value) {
239
+ if (!isRecord$1(value) || value.kind !== 'directory')
240
+ return false;
241
+ if (isNonEmptyString(value.handleId)) {
242
+ return hasOnlyKeys(value, ['kind', 'handleId']);
243
+ }
244
+ return (isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
245
+ }
246
+ function isMiniProgramFileDescriptor(value) {
247
+ return (isRecord$1(value) &&
248
+ value.kind === 'file' &&
249
+ isNonEmptyString(value.name) &&
250
+ isFileMode(value.mode) &&
251
+ isMiniProgramFileRef(value.ref) &&
252
+ hasOnlyKeys(value, ['kind', 'name', 'mode', 'ref']));
253
+ }
254
+ function isMiniProgramDirectoryDescriptor(value) {
255
+ return (isRecord$1(value) &&
256
+ value.kind === 'directory' &&
257
+ isNonEmptyString(value.name) &&
258
+ isFileMode(value.mode) &&
259
+ isMiniProgramDirectoryRef(value.ref) &&
260
+ hasOnlyKeys(value, ['kind', 'name', 'mode', 'ref']));
261
+ }
262
+ function isMiniProgramFileSystemEntityDescriptor(value) {
263
+ return isMiniProgramFileDescriptor(value) || isMiniProgramDirectoryDescriptor(value);
264
+ }
265
+ function isMiniProgramByteArray(value) {
266
+ return value instanceof Uint8Array && value.buffer instanceof ArrayBuffer;
267
+ }
268
+ function isMiniProgramFileStat(value) {
269
+ return (isRecord$1(value) &&
270
+ value.kind === 'file' &&
271
+ isNonNegativeSafeInteger(value.size) &&
272
+ (value.modifiedAt === undefined || isNonNegativeFiniteNumber(value.modifiedAt)) &&
273
+ (value.createdAt === undefined || isNonNegativeFiniteNumber(value.createdAt)) &&
274
+ hasOnlyKeys(value, ['kind', 'size', 'modifiedAt', 'createdAt']));
275
+ }
276
+ function isMiniProgramDownloadProgressPayload(value) {
277
+ if (!isRecord$1(value) ||
278
+ !isNonNegativeSafeInteger(value.loaded) ||
279
+ typeof value.lengthComputable !== 'boolean' ||
280
+ !hasOnlyKeys(value, ['loaded', 'total', 'lengthComputable'])) {
281
+ return false;
282
+ }
283
+ if (!value.lengthComputable)
284
+ return value.total === undefined;
285
+ return isNonNegativeSafeInteger(value.total) && value.loaded <= value.total;
286
+ }
287
+ function isSDKHandshakePayload(value) {
288
+ return isRecord$1(value) && isNonEmptyString(value.href) && typeof value.userAgent === 'string' && isNonEmptyString(value.sdkVersion);
289
+ }
290
+ function isBridgeError(value) {
291
+ return isRecord$1(value) && isNonEmptyString(value.code) && typeof value.message === 'string';
292
+ }
293
+ function isFileMode(value) {
294
+ return value === 'read' || value === 'readwrite';
295
+ }
296
+ function isNonNegativeSafeInteger(value) {
297
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
298
+ }
299
+ function isNonNegativeFiniteNumber(value) {
300
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0;
301
+ }
302
+ function isNonEmptyString(value) {
303
+ return typeof value === 'string' && value.length > 0;
304
+ }
305
+ function hasOnlyKeys(value, allowedKeys) {
306
+ const allowed = new Set(allowedKeys);
307
+ return Object.keys(value).every((key) => allowed.has(key));
308
+ }
309
+ function isRecord$1(value) {
310
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
136
311
  }
137
312
 
138
313
  /** 当前用户信息与登录能力支持的完整 scope 目录。 */
@@ -177,4 +352,4 @@ function isRecord(value) {
177
352
  return typeof value === 'object' && value !== null && !Array.isArray(value);
178
353
  }
179
354
 
180
- export { AUTH_LOGIN_METHOD, CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD, CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD, CLOUD_LEADERBOARD_GET_INFO_METHOD, CLOUD_LEADERBOARD_GET_LIST_METHOD, CLOUD_LEADERBOARD_SUBMIT_METHOD, DEVICE_SET_CLIPBOARD_METHOD, DEVICE_VIBRATE_METHOD, MINI_PROGRAM_BRIDGE_NONCE_PARAM, MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_MESSAGE_VERSION, MINI_PROGRAM_PROTOCOL_CAPABILITIES, NAVIGATION_CLOSE_METHOD, NAVIGATION_OPEN_APP_PAGE_METHOD, NAVIGATION_RELOAD_METHOD, NETWORK_REQUEST_METHOD, RUNTIME_LOCATION_PROBE_METHOD, SDK_CSP_VIOLATION_METHOD, SDK_HANDSHAKE_METHOD, SDK_LOCATION_REPORT_METHOD, SHARE_COPY_LINK_METHOD, SHARE_SCREENSHOT_METHOD, SHARE_SHOW_SHARE_MENU_METHOD, STORAGE_GET_STORAGE_METHOD, STORAGE_SET_STORAGE_METHOD, UI_HIDE_LOADING_METHOD, UI_SHOW_LOADING_METHOD, UI_SHOW_TOAST_METHOD, USER_GET_INFO_METHOD, USER_GET_STEAM_GAME_LIST_METHOD, USER_INFO_AUTHORIZATION_SCOPES, USER_REVOKE_AUTHORIZATION_METHOD, VIEWPORT_GET_WINDOW_INFO_METHOD, VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD, isManagedMiniProgramRuntimePermissionKey, isMiniProgramBridgeMessage, parseMiniProgramRuntimePermissions };
355
+ export { AUTH_LOGIN_METHOD, CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD, CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD, CLOUD_LEADERBOARD_GET_INFO_METHOD, CLOUD_LEADERBOARD_GET_LIST_METHOD, CLOUD_LEADERBOARD_SUBMIT_METHOD, DEVICE_SET_CLIPBOARD_METHOD, DEVICE_VIBRATE_METHOD, DIRECTORY_CREATE_METHOD, DIRECTORY_EXISTS_METHOD, DIRECTORY_LIST_METHOD, DIRECTORY_REMOVE_METHOD, FILES_PICK_DIRECTORY_METHOD, FILES_PICK_FILES_METHOD, FILES_SAVE_FILE_METHOD, FILE_CREATE_METHOD, FILE_EXISTS_METHOD, FILE_READ_BYTES_METHOD, FILE_READ_TEXT_METHOD, FILE_REMOVE_METHOD, FILE_STAT_METHOD, FILE_WRITE_BYTES_METHOD, FILE_WRITE_TEXT_METHOD, MINI_PROGRAM_BRIDGE_NONCE_PARAM, MINI_PROGRAM_MESSAGE_NAMESPACE, MINI_PROGRAM_MESSAGE_VERSION, MINI_PROGRAM_OPERATION_PROGRESS_METHOD, MINI_PROGRAM_PROTOCOL_CAPABILITIES, NAVIGATION_CLOSE_METHOD, NAVIGATION_OPEN_APP_PAGE_METHOD, NAVIGATION_RELOAD_METHOD, NETWORK_DOWNLOAD_METHOD, NETWORK_REQUEST_METHOD, RUNTIME_LOCATION_PROBE_METHOD, SDK_CSP_VIOLATION_METHOD, SDK_HANDSHAKE_METHOD, SDK_LOCATION_REPORT_METHOD, SHARE_COPY_LINK_METHOD, SHARE_SCREENSHOT_METHOD, SHARE_SHOW_SHARE_MENU_METHOD, STORAGE_GET_STORAGE_METHOD, STORAGE_SET_STORAGE_METHOD, UI_HIDE_LOADING_METHOD, UI_SHOW_LOADING_METHOD, UI_SHOW_TOAST_METHOD, USER_GET_INFO_METHOD, USER_GET_STEAM_GAME_LIST_METHOD, USER_INFO_AUTHORIZATION_SCOPES, USER_REVOKE_AUTHORIZATION_METHOD, VIEWPORT_GET_WINDOW_INFO_METHOD, VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD, isManagedMiniProgramRuntimePermissionKey, isMiniProgramBridgeMessage, isMiniProgramByteArray, isMiniProgramDirectoryDescriptor, isMiniProgramDirectoryRef, isMiniProgramDownloadProgressPayload, isMiniProgramFileDescriptor, isMiniProgramFileRef, isMiniProgramFileStat, isMiniProgramFileSystemEntityDescriptor, isMiniProgramPathRootRef, isMiniProgramRelativePath, parseMiniProgramRuntimePermissions };
package/dist/vite.cjs.js CHANGED
@@ -8,7 +8,7 @@ var _documentCurrentScript = typeof document !== 'undefined' ? document.currentS
8
8
  /** 构建时替换为当前发布包的实际版本。 */
9
9
  const HB_SDK_VERSION = typeof undefined === 'string'
10
10
  ? undefined
11
- : '0.8.0-alpha';
11
+ : '0.8.0-alpha.2';
12
12
 
13
13
  var re = {exports: {}};
14
14
 
package/dist/vite.esm.js CHANGED
@@ -5,7 +5,7 @@ import { AsyncLocalStorage } from 'node:async_hooks';
5
5
  /** 构建时替换为当前发布包的实际版本。 */
6
6
  const HB_SDK_VERSION = typeof undefined === 'string'
7
7
  ? undefined
8
- : '0.8.0-alpha';
8
+ : '0.8.0-alpha.2';
9
9
 
10
10
  var re = {exports: {}};
11
11
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heybox/hb-sdk",
3
- "version": "0.8.0-alpha",
3
+ "version": "0.8.0-alpha.2",
4
4
  "sideEffects": [
5
5
  "./src/index.ts",
6
6
  "./src/core/singleton.ts",
@@ -44,6 +44,7 @@
44
44
  "files": [
45
45
  "README.md",
46
46
  "CHANGELOG.md",
47
+ "THIRD_PARTY_NOTICES.md",
47
48
  "bin",
48
49
  "dist",
49
50
  "skill",
@@ -57,7 +58,7 @@
57
58
  "parse5": "^7.3.0",
58
59
  "undici": "^7.28.0",
59
60
  "ws": "^8.18.0",
60
- "@heybox/hb-sdk-protocol": "0.8.0-alpha"
61
+ "@heybox/hb-sdk-protocol": "0.8.0-alpha.2"
61
62
  },
62
63
  "peerDependencies": {
63
64
  "vite": ">=5"
@@ -73,7 +74,8 @@
73
74
  "@rollup/plugin-node-resolve": "^16.0.1",
74
75
  "@heybox/hb-types": "^1.0.1",
75
76
  "@playwright/test": "^1.55.1",
76
- "@vitejs/plugin-vue2": "^2.3.3",
77
+ "@sneas/telephone": "1.1.2",
78
+ "@vitejs/plugin-vue": "^6.0.1",
77
79
  "@rollup/plugin-typescript": "^11.1.6",
78
80
  "@types/ejs": "^3.1.5",
79
81
  "@types/fs-extra": "^11.0.4",
@@ -82,6 +84,7 @@
82
84
  "@types/semver": "^7.7.1",
83
85
  "@types/ws": "^8.5.13",
84
86
  "@vitest/coverage-v8": "^3.2.4",
87
+ "@vue/test-utils": "^2",
85
88
  "commander": "^12.1.0",
86
89
  "cos-nodejs-sdk-v5": "2.15.4",
87
90
  "ejs": "^3.1.10",
@@ -89,22 +92,29 @@
89
92
  "fs-extra": "^11.3.0",
90
93
  "get-port": "^7.1.0",
91
94
  "happy-dom": "^19.0.2",
95
+ "lucide-vue-next": "1.0.0",
92
96
  "open": "^10.2.0",
93
97
  "ora": "^5.4.1",
94
98
  "picocolors": "^1.1.1",
95
99
  "qrcode": "^1.5.4",
96
100
  "rimraf": "^5.0.5",
101
+ "reka-ui": "2.10.4",
97
102
  "rollup": "^4.52.4",
98
103
  "semver": "^7.8.0",
104
+ "sass-embedded": "1.97.3",
105
+ "splitpanes": "^4.1.0",
99
106
  "typescript": "^5.9.3",
100
- "vue": "^2.7.16",
107
+ "vue": "^3.5.22",
108
+ "vue-tsc": "^3.3.7",
101
109
  "vite": "^8.0.12",
102
110
  "vitest": "^3.2.4",
111
+ "@heybox-domain/heybox-vue3-ui": "~0.1.0",
112
+ "@heybox/runtime-policy": "~0.2.0",
113
+ "@heybox-domain/heybox-theme": "~0.1.0",
114
+ "@heybox/runtime-transport-fetch": "~0.2.0",
103
115
  "@heybox/hb-api": "~1.25.23",
104
- "@heybox/hb-sdk-runtime": "~0.8.0-alpha",
105
116
  "@heybox/runtime": "~0.2.0",
106
- "@heybox/runtime-policy": "~0.2.0",
107
- "@heybox/runtime-transport-fetch": "~0.2.0"
117
+ "@heybox/hb-sdk-runtime": "~0.8.0-alpha.2"
108
118
  },
109
119
  "publishConfig": {
110
120
  "registry": "https://registry.npmjs.org/",
@@ -117,6 +127,10 @@
117
127
  "{projectRoot}/src/**/*",
118
128
  "{projectRoot}/devtools/browser-dev-host/**/*",
119
129
  "{projectRoot}/scripts/copy-browser-dev-host.cjs",
130
+ "{projectRoot}/scripts/check-browser-dev-host-assets.cjs",
131
+ "{projectRoot}/scripts/generate-browser-dev-host-notices.cjs",
132
+ "{projectRoot}/licenses/**/*",
133
+ "{projectRoot}/THIRD_PARTY_NOTICES.md",
120
134
  "{projectRoot}/rollup.config.ts",
121
135
  "{projectRoot}/tsconfig*.json",
122
136
  "{workspaceRoot}/packages/hb-sdk-runtime/src/**/*",
@@ -144,7 +158,7 @@
144
158
  "build:lib:bundle": "rollup -c rollup.config.ts --configPlugin 'typescript={\"tsconfig\":\"tsconfig.build.json\"}'",
145
159
  "build:cli": "pnpm run build:hb-sdk-protocol && pnpm run build:hb-api-contract && pnpm run build:cli:bundle",
146
160
  "build:cli:bundle": "rollup -c rollup.config.ts --environment HB_SDK_BUILD:cli --configPlugin 'typescript={\"tsconfig\":\"tsconfig.build.json\"}' && pnpm run build:browser-dev-host",
147
- "build:browser-dev-host": "node scripts/copy-browser-dev-host.cjs",
161
+ "build:browser-dev-host": "vite build --config vite.browser-dev-host.config.ts && node scripts/check-browser-dev-host-assets.cjs && node scripts/generate-browser-dev-host-notices.cjs",
148
162
  "build:templates": "node scripts/copy-cli-templates.cjs",
149
163
  "build:types": "tsc -p tsconfig.dts.json",
150
164
  "check:boundary": "node scripts/check-boundary.cjs",
@@ -154,7 +168,7 @@
154
168
  "clean": "rimraf ./dist && rimraf ./types",
155
169
  "test:unit": "NODE_OPTIONS='--conditions=heybox' vitest run",
156
170
  "test:types:characterization": "tsc -p tsconfig.characterization.json --noEmit --pretty false",
157
- "test:types:browser-dev-host": "tsc -p tsconfig.browser-dev-host.json --noEmit --pretty false",
171
+ "test:types:browser-dev-host": "vue-tsc -p tsconfig.browser-dev-host.json --noEmit --pretty false",
158
172
  "test:types": "pnpm run test:types:characterization && pnpm run test:types:browser-dev-host",
159
173
  "test:e2e:browser-dev-host": "pnpm run build:browser-dev-host && NODE_OPTIONS='--conditions=heybox' vitest run --config vitest.browser-dev-host-e2e.config.ts",
160
174
  "test:unit:coverage": "NODE_OPTIONS='--conditions=heybox' vitest run --coverage",