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

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 (96) hide show
  1. package/CHANGELOG.md +106 -395
  2. package/README.md +107 -24
  3. package/THIRD_PARTY_NOTICES.md +1755 -0
  4. package/dist/cli-chunks/{build-DJWFSM1B.cjs → build-DNtjBmyy.cjs} +8 -5
  5. package/dist/cli-chunks/{context-DV2UK1Nz.cjs → context-CO_3KgM_.cjs} +39 -81
  6. package/dist/cli-chunks/{create-2HfoB48V.cjs → create-DG8JxrPU.cjs} +2 -2
  7. package/dist/cli-chunks/{dev-Dgt2zS9k.cjs → dev-C5U1Lo4e.cjs} +404 -577
  8. package/dist/cli-chunks/doctor-B50OXvrj.cjs +65 -0
  9. package/dist/cli-chunks/{index-D62ANeBv.cjs → index-B4nFqf-3.cjs} +50 -30
  10. package/dist/cli-chunks/{index-BjoSXl8C.cjs → index-B8FK1ojC.cjs} +2 -2
  11. package/dist/cli-chunks/{index.esm-CigcxJ2B.cjs → index.esm-DiX5WKSp.cjs} +8 -7
  12. package/dist/cli-chunks/{login-Cumknwdx.cjs → login-CBwmxsEK.cjs} +2 -2
  13. package/dist/cli-chunks/{project-vite-CcE-HMmd.cjs → project-vite-DWpmHOsV.cjs} +1 -1
  14. package/dist/cli-chunks/{remote-DDdP3xcE.cjs → remote-Dt-U4gDD.cjs} +57 -25
  15. package/dist/cli-chunks/{runtime-gate-DFjw66kF.cjs → runtime-gate-CMnGCdfq.cjs} +11 -3
  16. package/dist/cli-chunks/{runtime-permission-env-CjsCe5bp.cjs → runtime-permission-env-BcUsO3nG.cjs} +351 -0
  17. package/dist/cli-chunks/{session-BDi_AZSv.cjs → session-yy543BIB.cjs} +1 -1
  18. package/dist/cli-chunks/skill-B4SWt2o6.cjs +83 -0
  19. package/dist/cli-chunks/version-CmizPu7D.cjs +8 -0
  20. package/dist/cli.cjs +1 -1
  21. package/dist/devtools/browser-dev-host/assets/browser-dev-host-TzYf9L6C.js +99 -0
  22. package/dist/devtools/browser-dev-host/assets/heybox-logo-CogNENsk.svg +6 -0
  23. package/dist/devtools/browser-dev-host/assets/index-C5MZZDa5.js +567 -0
  24. package/dist/devtools/browser-dev-host/assets/index-P-ra4m1y.css +1 -0
  25. package/dist/devtools/browser-dev-host/assets/workbench-state-BwV7bm4n.js +5 -0
  26. package/dist/devtools/browser-dev-host/index.html +6 -435
  27. package/dist/index.cjs.js +1023 -29
  28. package/dist/index.esm.js +1023 -30
  29. package/dist/protocol.cjs.js +381 -37
  30. package/dist/protocol.esm.js +355 -38
  31. package/dist/templates/{vue3-vite-ts → vanilla-vite-js}/.gitignore.ejs +0 -1
  32. package/dist/templates/vanilla-vite-js/README.md.ejs +14 -0
  33. package/dist/templates/vanilla-vite-js/index.html.ejs +20 -0
  34. package/dist/templates/vanilla-vite-js/package.json.ejs +22 -0
  35. package/dist/templates/vanilla-vite-js/src/assets/heybox-logo.svg +8 -0
  36. package/dist/templates/vanilla-vite-js/src/main.js +39 -0
  37. package/dist/templates/vanilla-vite-js/src/styles.css +155 -0
  38. package/dist/templates/{vue3-vite-ts/vite.config.ts → vanilla-vite-js/vite.config.js} +1 -2
  39. package/dist/vite.cjs.js +281 -13
  40. package/dist/vite.esm.js +281 -13
  41. package/package.json +34 -11
  42. package/skill/SKILL.md +22 -20
  43. package/skill/references/api-protocol.md +100 -6
  44. package/skill/references/api-root.md +199 -28
  45. package/skill/references/cli.md +41 -24
  46. package/skill/references/examples.md +30 -1
  47. package/skill/references/llms-index.md +1 -1
  48. package/skill/references/recipes.md +139 -36
  49. package/skill/references/safety-boundaries.md +20 -5
  50. package/skill/skill.json +10 -5
  51. package/types/core/client.d.ts +17 -1
  52. package/types/core/mini-dev-console.d.ts +36 -0
  53. package/types/core/sdk.d.ts +3 -0
  54. package/types/core/singleton.d.ts +3 -0
  55. package/types/index.d.ts +4 -2
  56. package/types/miniapp-manifest/index.d.ts +1 -0
  57. package/types/miniapp-manifest/node.d.ts +3 -0
  58. package/types/miniapp-manifest/permissions.d.ts +37 -0
  59. package/types/miniapp-manifest/schema.d.ts +5 -0
  60. package/types/modules/files/index.d.ts +5 -0
  61. package/types/modules/files/registry.d.ts +35 -0
  62. package/types/modules/files/types.d.ts +159 -0
  63. package/types/modules/network/index.d.ts +50 -3
  64. package/types/modules/share/index.d.ts +1 -1
  65. package/types/modules/share/show-share-menu.d.ts +1 -1
  66. package/types/modules/share/types.d.ts +2 -4
  67. package/types/protocol/capabilities.d.ts +2 -2
  68. package/types/protocol/constants.d.ts +1 -1
  69. package/types/protocol/guards.d.ts +1 -1
  70. package/types/protocol/types.d.ts +1 -1
  71. package/types/protocol.d.ts +4 -3
  72. package/types/skill-metadata.d.ts +0 -4
  73. package/types/vite/index.d.ts +3 -1
  74. package/dist/cli-chunks/doctor-C95gIao_.cjs +0 -204
  75. package/dist/devtools/browser-dev-host/main.js +0 -12263
  76. package/dist/templates/vue3-vite-ts/README.md.ejs +0 -47
  77. package/dist/templates/vue3-vite-ts/index.html.ejs +0 -12
  78. package/dist/templates/vue3-vite-ts/package.json.ejs +0 -33
  79. package/dist/templates/vue3-vite-ts/src/App.vue +0 -78
  80. package/dist/templates/vue3-vite-ts/src/__tests__/App.spec.ts +0 -148
  81. package/dist/templates/vue3-vite-ts/src/auth-handoff.ts +0 -46
  82. package/dist/templates/vue3-vite-ts/src/main.ts +0 -5
  83. package/dist/templates/vue3-vite-ts/src/styles.css +0 -60
  84. package/dist/templates/vue3-vite-ts/src/vite-env.d.ts +0 -1
  85. package/dist/templates/vue3-vite-ts/tsconfig.app.json +0 -17
  86. package/dist/templates/vue3-vite-ts/tsconfig.json +0 -11
  87. package/dist/templates/vue3-vite-ts/tsconfig.node.json +0 -11
  88. package/dist/templates/vue3-vite-ts/vitest.config.ts +0 -10
  89. package/skill/scripts/check-references.mjs +0 -14
  90. package/skill/scripts/markdown-sections.mjs +0 -36
  91. package/skill/scripts/package-skill.mjs +0 -60
  92. package/skill/scripts/package-skill.sh +0 -6
  93. package/skill/scripts/skill-metadata.mjs +0 -77
  94. package/skill/scripts/sync-agent-skills-payload.mjs +0 -359
  95. package/skill/scripts/sync-references.mjs +0 -794
  96. package/skill/scripts/validate-skill.mjs +0 -263
@@ -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';
@@ -24,95 +40,249 @@ const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.getCu
24
40
  const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.deleteCurrentUserEntry';
25
41
  const CLOUD_LEADERBOARD_GET_INFO_METHOD = 'cloud.leaderboard.getInfo';
26
42
  const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
27
- { method: AUTH_LOGIN_METHOD, module: 'auth', capability: AUTH_LOGIN_METHOD, permission: 'auth.login', risk: 'medium' },
28
- { method: USER_GET_INFO_METHOD, module: 'user', capability: USER_GET_INFO_METHOD, permission: 'user.getInfo', risk: 'medium' },
43
+ {
44
+ method: AUTH_LOGIN_METHOD,
45
+ module: 'auth',
46
+ capability: AUTH_LOGIN_METHOD,
47
+ requirement: { kind: 'all', permissions: ['userInfo'] },
48
+ risk: 'medium',
49
+ },
50
+ {
51
+ method: USER_GET_INFO_METHOD,
52
+ module: 'user',
53
+ capability: USER_GET_INFO_METHOD,
54
+ requirement: { kind: 'all', permissions: ['userInfo'] },
55
+ risk: 'medium',
56
+ },
29
57
  {
30
58
  method: USER_REVOKE_AUTHORIZATION_METHOD,
31
59
  module: 'user',
32
60
  capability: USER_REVOKE_AUTHORIZATION_METHOD,
33
- permission: 'user.revokeAuthorization',
61
+ requirement: { kind: 'none' },
34
62
  risk: 'high',
35
63
  },
36
64
  {
37
65
  method: USER_GET_STEAM_GAME_LIST_METHOD,
38
66
  module: 'user',
39
67
  capability: USER_GET_STEAM_GAME_LIST_METHOD,
40
- permission: 'user.platformAccount.steam',
68
+ requirement: { kind: 'all', permissions: ['steamLibrary'] },
41
69
  risk: 'high',
42
70
  },
43
- { method: SHARE_COPY_LINK_METHOD, module: 'share', capability: SHARE_COPY_LINK_METHOD, permission: 'share.copyLink', risk: 'medium' },
44
- { method: SHARE_SHOW_SHARE_MENU_METHOD, module: 'share', capability: SHARE_SHOW_SHARE_MENU_METHOD, permission: 'share.basic', risk: 'low' },
45
- { method: SHARE_SCREENSHOT_METHOD, module: 'share', capability: SHARE_SCREENSHOT_METHOD, permission: 'share.screenshot', risk: 'medium' },
71
+ {
72
+ method: SHARE_COPY_LINK_METHOD,
73
+ module: 'share',
74
+ capability: SHARE_COPY_LINK_METHOD,
75
+ requirement: { kind: 'all', permissions: ['share'] },
76
+ risk: 'medium',
77
+ },
78
+ {
79
+ method: SHARE_SHOW_SHARE_MENU_METHOD,
80
+ module: 'share',
81
+ capability: SHARE_SHOW_SHARE_MENU_METHOD,
82
+ requirement: { kind: 'all', permissions: ['share'] },
83
+ risk: 'low',
84
+ },
85
+ {
86
+ method: SHARE_SCREENSHOT_METHOD,
87
+ module: 'share',
88
+ capability: SHARE_SCREENSHOT_METHOD,
89
+ requirement: { kind: 'all', permissions: ['share'] },
90
+ risk: 'medium',
91
+ },
46
92
  {
47
93
  method: VIEWPORT_GET_WINDOW_INFO_METHOD,
48
94
  module: 'viewport',
49
95
  capability: VIEWPORT_GET_WINDOW_INFO_METHOD,
50
- permission: 'viewport.windowInfo',
96
+ requirement: { kind: 'none' },
51
97
  risk: 'low',
52
98
  },
53
99
  {
54
100
  method: VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD,
55
101
  module: 'viewport',
56
102
  capability: VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD,
57
- permission: 'viewport.navigationBarStyle',
103
+ requirement: { kind: 'none' },
58
104
  risk: 'low',
59
105
  },
60
- { method: STORAGE_GET_STORAGE_METHOD, module: 'storage', capability: STORAGE_GET_STORAGE_METHOD, permission: 'storage.read', risk: 'low' },
61
- { method: STORAGE_SET_STORAGE_METHOD, module: 'storage', capability: STORAGE_SET_STORAGE_METHOD, permission: 'storage.write', risk: 'medium' },
62
- { method: NETWORK_REQUEST_METHOD, module: 'network', capability: NETWORK_REQUEST_METHOD, permission: 'network.request', risk: 'high' },
63
- { method: UI_SHOW_TOAST_METHOD, module: 'ui', capability: UI_SHOW_TOAST_METHOD, permission: 'ui.toast', risk: 'low' },
64
- { method: UI_SHOW_LOADING_METHOD, module: 'ui', capability: UI_SHOW_LOADING_METHOD, permission: 'ui.loading', risk: 'low' },
65
- { method: UI_HIDE_LOADING_METHOD, module: 'ui', capability: UI_HIDE_LOADING_METHOD, permission: 'ui.loading', risk: 'low' },
66
- { method: DEVICE_VIBRATE_METHOD, module: 'device', capability: DEVICE_VIBRATE_METHOD, permission: 'device.vibrate', risk: 'low' },
106
+ {
107
+ method: STORAGE_GET_STORAGE_METHOD,
108
+ module: 'storage',
109
+ capability: STORAGE_GET_STORAGE_METHOD,
110
+ requirement: { kind: 'all', permissions: ['storage'] },
111
+ risk: 'low',
112
+ },
113
+ {
114
+ method: STORAGE_SET_STORAGE_METHOD,
115
+ module: 'storage',
116
+ capability: STORAGE_SET_STORAGE_METHOD,
117
+ requirement: { kind: 'all', permissions: ['storage'] },
118
+ risk: 'medium',
119
+ },
120
+ {
121
+ method: NETWORK_REQUEST_METHOD,
122
+ module: 'network',
123
+ capability: NETWORK_REQUEST_METHOD,
124
+ requirement: { kind: 'all', permissions: ['network'] },
125
+ risk: 'high',
126
+ },
127
+ {
128
+ method: NETWORK_DOWNLOAD_METHOD,
129
+ module: 'network',
130
+ capability: NETWORK_DOWNLOAD_METHOD,
131
+ requirement: { kind: 'all', permissions: ['network', 'filesystem'] },
132
+ risk: 'high',
133
+ },
134
+ {
135
+ method: FILES_PICK_FILES_METHOD,
136
+ module: 'files',
137
+ capability: FILES_PICK_FILES_METHOD,
138
+ requirement: { kind: 'all', permissions: ['filesystem'] },
139
+ risk: 'high',
140
+ },
141
+ {
142
+ method: FILES_PICK_DIRECTORY_METHOD,
143
+ module: 'files',
144
+ capability: FILES_PICK_DIRECTORY_METHOD,
145
+ requirement: { kind: 'all', permissions: ['filesystem'] },
146
+ risk: 'high',
147
+ },
148
+ {
149
+ method: FILES_SAVE_FILE_METHOD,
150
+ module: 'files',
151
+ capability: FILES_SAVE_FILE_METHOD,
152
+ requirement: { kind: 'all', permissions: ['filesystem'] },
153
+ risk: 'high',
154
+ },
155
+ {
156
+ method: FILE_CREATE_METHOD,
157
+ module: 'file',
158
+ capability: FILE_CREATE_METHOD,
159
+ requirement: { kind: 'all', permissions: ['filesystem'] },
160
+ risk: 'high',
161
+ },
162
+ {
163
+ method: FILE_REMOVE_METHOD,
164
+ module: 'file',
165
+ capability: FILE_REMOVE_METHOD,
166
+ requirement: { kind: 'all', permissions: ['filesystem'] },
167
+ risk: 'high',
168
+ },
169
+ {
170
+ method: FILE_EXISTS_METHOD,
171
+ module: 'file',
172
+ capability: FILE_EXISTS_METHOD,
173
+ requirement: { kind: 'all', permissions: ['filesystem'] },
174
+ risk: 'high',
175
+ },
176
+ {
177
+ method: FILE_READ_TEXT_METHOD,
178
+ module: 'file',
179
+ capability: FILE_READ_TEXT_METHOD,
180
+ requirement: { kind: 'all', permissions: ['filesystem'] },
181
+ risk: 'high',
182
+ },
183
+ {
184
+ method: FILE_WRITE_TEXT_METHOD,
185
+ module: 'file',
186
+ capability: FILE_WRITE_TEXT_METHOD,
187
+ requirement: { kind: 'all', permissions: ['filesystem'] },
188
+ risk: 'high',
189
+ },
190
+ {
191
+ method: FILE_READ_BYTES_METHOD,
192
+ module: 'file',
193
+ capability: FILE_READ_BYTES_METHOD,
194
+ requirement: { kind: 'all', permissions: ['filesystem'] },
195
+ risk: 'high',
196
+ },
197
+ {
198
+ method: FILE_WRITE_BYTES_METHOD,
199
+ module: 'file',
200
+ capability: FILE_WRITE_BYTES_METHOD,
201
+ requirement: { kind: 'all', permissions: ['filesystem'] },
202
+ risk: 'high',
203
+ },
204
+ { method: FILE_STAT_METHOD, module: 'file', capability: FILE_STAT_METHOD, requirement: { kind: 'all', permissions: ['filesystem'] }, risk: 'high' },
205
+ {
206
+ method: DIRECTORY_CREATE_METHOD,
207
+ module: 'directory',
208
+ capability: DIRECTORY_CREATE_METHOD,
209
+ requirement: { kind: 'all', permissions: ['filesystem'] },
210
+ risk: 'high',
211
+ },
212
+ {
213
+ method: DIRECTORY_REMOVE_METHOD,
214
+ module: 'directory',
215
+ capability: DIRECTORY_REMOVE_METHOD,
216
+ requirement: { kind: 'all', permissions: ['filesystem'] },
217
+ risk: 'high',
218
+ },
219
+ {
220
+ method: DIRECTORY_EXISTS_METHOD,
221
+ module: 'directory',
222
+ capability: DIRECTORY_EXISTS_METHOD,
223
+ requirement: { kind: 'all', permissions: ['filesystem'] },
224
+ risk: 'high',
225
+ },
226
+ {
227
+ method: DIRECTORY_LIST_METHOD,
228
+ module: 'directory',
229
+ capability: DIRECTORY_LIST_METHOD,
230
+ requirement: { kind: 'all', permissions: ['filesystem'] },
231
+ risk: 'high',
232
+ },
233
+ { method: UI_SHOW_TOAST_METHOD, module: 'ui', capability: UI_SHOW_TOAST_METHOD, requirement: { kind: 'none' }, risk: 'low' },
234
+ { method: UI_SHOW_LOADING_METHOD, module: 'ui', capability: UI_SHOW_LOADING_METHOD, requirement: { kind: 'none' }, risk: 'low' },
235
+ { method: UI_HIDE_LOADING_METHOD, module: 'ui', capability: UI_HIDE_LOADING_METHOD, requirement: { kind: 'none' }, risk: 'low' },
236
+ { method: DEVICE_VIBRATE_METHOD, module: 'device', capability: DEVICE_VIBRATE_METHOD, requirement: { kind: 'none' }, risk: 'low' },
67
237
  {
68
238
  method: DEVICE_SET_CLIPBOARD_METHOD,
69
239
  module: 'device',
70
240
  capability: DEVICE_SET_CLIPBOARD_METHOD,
71
- permission: 'device.clipboard.write',
241
+ requirement: { kind: 'all', permissions: ['clipboard'] },
72
242
  risk: 'medium',
73
243
  },
74
- { method: NAVIGATION_CLOSE_METHOD, module: 'navigation', capability: NAVIGATION_CLOSE_METHOD, permission: 'navigation.close', risk: 'medium' },
75
- { method: NAVIGATION_RELOAD_METHOD, module: 'navigation', capability: NAVIGATION_RELOAD_METHOD, permission: 'navigation.reload', risk: 'medium' },
244
+ { method: NAVIGATION_CLOSE_METHOD, module: 'navigation', capability: NAVIGATION_CLOSE_METHOD, requirement: { kind: 'none' }, risk: 'medium' },
245
+ { method: NAVIGATION_RELOAD_METHOD, module: 'navigation', capability: NAVIGATION_RELOAD_METHOD, requirement: { kind: 'none' }, risk: 'medium' },
76
246
  {
77
247
  method: NAVIGATION_OPEN_APP_PAGE_METHOD,
78
248
  module: 'navigation',
79
249
  capability: NAVIGATION_OPEN_APP_PAGE_METHOD,
80
- permission: 'navigation.openAppPage',
250
+ requirement: { kind: 'none' },
81
251
  risk: 'medium',
82
252
  },
83
253
  {
84
254
  method: CLOUD_LEADERBOARD_SUBMIT_METHOD,
85
255
  module: 'cloud',
86
256
  capability: CLOUD_LEADERBOARD_SUBMIT_METHOD,
87
- permission: 'cloud.leaderboard.write',
257
+ requirement: { kind: 'all', permissions: ['leaderboard'] },
88
258
  risk: 'medium',
89
259
  },
90
260
  {
91
261
  method: CLOUD_LEADERBOARD_GET_LIST_METHOD,
92
262
  module: 'cloud',
93
263
  capability: CLOUD_LEADERBOARD_GET_LIST_METHOD,
94
- permission: 'cloud.leaderboard.read',
264
+ requirement: { kind: 'all', permissions: ['leaderboard'] },
95
265
  risk: 'low',
96
266
  },
97
267
  {
98
268
  method: CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
99
269
  module: 'cloud',
100
270
  capability: CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
101
- permission: 'cloud.leaderboard.currentUserEntry.read',
271
+ requirement: { kind: 'all', permissions: ['leaderboard'] },
102
272
  risk: 'medium',
103
273
  },
104
274
  {
105
275
  method: CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
106
276
  module: 'cloud',
107
277
  capability: CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
108
- permission: 'cloud.leaderboard.currentUserEntry.delete',
278
+ requirement: { kind: 'all', permissions: ['leaderboard'] },
109
279
  risk: 'medium',
110
280
  },
111
281
  {
112
282
  method: CLOUD_LEADERBOARD_GET_INFO_METHOD,
113
283
  module: 'cloud',
114
284
  capability: CLOUD_LEADERBOARD_GET_INFO_METHOD,
115
- permission: 'cloud.leaderboard.info.read',
285
+ requirement: { kind: 'all', permissions: ['leaderboard'] },
116
286
  risk: 'low',
117
287
  },
118
288
  ];
@@ -124,21 +294,152 @@ const SDK_HANDSHAKE_METHOD = 'sdk.handshake';
124
294
  const RUNTIME_LOCATION_PROBE_METHOD = 'runtime.location.probe';
125
295
  const SDK_LOCATION_REPORT_METHOD = 'sdk.location.report';
126
296
  const SDK_CSP_VIOLATION_METHOD = 'sdk.csp.violation';
297
+ const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress';
127
298
 
128
299
  function isMiniProgramBridgeMessage(value) {
129
- if (!value || typeof value !== 'object')
300
+ if (!isRecord$1(value))
301
+ return false;
302
+ if (value.namespace !== MINI_PROGRAM_MESSAGE_NAMESPACE || (value.version !== 1 && value.version !== 2) || !isNonEmptyString(value.nonce)) {
303
+ return false;
304
+ }
305
+ if (value.type === 'handshake') {
306
+ return isNonEmptyString(value.id) && value.method === SDK_HANDSHAKE_METHOD && value.error === undefined && isSDKHandshakePayload(value.payload);
307
+ }
308
+ if (value.type === 'request') {
309
+ return isNonEmptyString(value.id) && isNonEmptyString(value.method) && value.error === undefined;
310
+ }
311
+ if (value.type === 'response') {
312
+ return (isNonEmptyString(value.id) &&
313
+ (value.method === undefined || isNonEmptyString(value.method)) &&
314
+ (value.error === undefined || isBridgeError(value.error)));
315
+ }
316
+ if (value.type === 'event') {
317
+ if (!isNonEmptyString(value.method) || value.error !== undefined)
318
+ return false;
319
+ if (value.method === MINI_PROGRAM_OPERATION_PROGRESS_METHOD) {
320
+ return value.version === 2 && isNonEmptyString(value.id) && isMiniProgramDownloadProgressPayload(value.payload);
321
+ }
322
+ return value.id === undefined || isNonEmptyString(value.id);
323
+ }
324
+ if (value.type === 'cancel') {
325
+ return (value.version === 2 && isNonEmptyString(value.id) && value.method === undefined && value.payload === undefined && value.error === undefined);
326
+ }
327
+ return false;
328
+ }
329
+ function isMiniProgramRelativePath(value) {
330
+ if (typeof value !== 'string' || !value || value.startsWith('/') || value.endsWith('/')) {
331
+ return false;
332
+ }
333
+ if (/[\\\u0000-\u001f\u007f]/.test(value))
334
+ return false;
335
+ return value.split('/').every((segment) => Boolean(segment) && segment !== '.' && segment !== '..');
336
+ }
337
+ function isMiniProgramPathRootRef(value) {
338
+ if (!isRecord$1(value))
130
339
  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');
340
+ if (value.kind === 'sandbox')
341
+ return hasOnlyKeys(value, ['kind']);
342
+ return value.kind === 'directory' && isNonEmptyString(value.handleId) && hasOnlyKeys(value, ['kind', 'handleId']);
343
+ }
344
+ function isMiniProgramFileRef(value) {
345
+ if (!isRecord$1(value) || value.kind !== 'file')
346
+ return false;
347
+ if (isNonEmptyString(value.handleId)) {
348
+ return hasOnlyKeys(value, ['kind', 'handleId']);
349
+ }
350
+ return (isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
351
+ }
352
+ function isMiniProgramDirectoryRef(value) {
353
+ if (!isRecord$1(value) || value.kind !== 'directory')
354
+ return false;
355
+ if (isNonEmptyString(value.handleId)) {
356
+ return hasOnlyKeys(value, ['kind', 'handleId']);
357
+ }
358
+ return (isMiniProgramPathRootRef(value.root) && isMiniProgramRelativePath(value.relativePath) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
359
+ }
360
+ function isMiniProgramFileDescriptor(value) {
361
+ return (isRecord$1(value) &&
362
+ value.kind === 'file' &&
363
+ isNonEmptyString(value.name) &&
364
+ isFileMode(value.mode) &&
365
+ isMiniProgramFileRef(value.ref) &&
366
+ hasOnlyKeys(value, ['kind', 'name', 'mode', 'ref']));
367
+ }
368
+ function isMiniProgramDirectoryDescriptor(value) {
369
+ return (isRecord$1(value) &&
370
+ value.kind === 'directory' &&
371
+ isNonEmptyString(value.name) &&
372
+ isFileMode(value.mode) &&
373
+ isMiniProgramDirectoryRef(value.ref) &&
374
+ hasOnlyKeys(value, ['kind', 'name', 'mode', 'ref']));
375
+ }
376
+ function isMiniProgramFileSystemEntityDescriptor(value) {
377
+ return isMiniProgramFileDescriptor(value) || isMiniProgramDirectoryDescriptor(value);
378
+ }
379
+ function isMiniProgramByteArray(value) {
380
+ return value instanceof Uint8Array && value.buffer instanceof ArrayBuffer;
381
+ }
382
+ function isMiniProgramFileStat(value) {
383
+ return (isRecord$1(value) &&
384
+ value.kind === 'file' &&
385
+ isNonNegativeSafeInteger(value.size) &&
386
+ (value.modifiedAt === undefined || isNonNegativeFiniteNumber(value.modifiedAt)) &&
387
+ (value.createdAt === undefined || isNonNegativeFiniteNumber(value.createdAt)) &&
388
+ hasOnlyKeys(value, ['kind', 'size', 'modifiedAt', 'createdAt']));
389
+ }
390
+ function isMiniProgramDownloadProgressPayload(value) {
391
+ if (!isRecord$1(value) ||
392
+ !isNonNegativeSafeInteger(value.loaded) ||
393
+ typeof value.lengthComputable !== 'boolean' ||
394
+ !hasOnlyKeys(value, ['loaded', 'total', 'lengthComputable'])) {
395
+ return false;
396
+ }
397
+ if (!value.lengthComputable)
398
+ return value.total === undefined;
399
+ return isNonNegativeSafeInteger(value.total) && value.loaded <= value.total;
400
+ }
401
+ function isSDKHandshakePayload(value) {
402
+ return isRecord$1(value) && isNonEmptyString(value.href) && typeof value.userAgent === 'string' && isNonEmptyString(value.sdkVersion);
403
+ }
404
+ function isBridgeError(value) {
405
+ return isRecord$1(value) && isNonEmptyString(value.code) && typeof value.message === 'string';
406
+ }
407
+ function isFileMode(value) {
408
+ return value === 'read' || value === 'readwrite';
409
+ }
410
+ function isNonNegativeSafeInteger(value) {
411
+ return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;
412
+ }
413
+ function isNonNegativeFiniteNumber(value) {
414
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0;
415
+ }
416
+ function isNonEmptyString(value) {
417
+ return typeof value === 'string' && value.length > 0;
418
+ }
419
+ function hasOnlyKeys(value, allowedKeys) {
420
+ const allowed = new Set(allowedKeys);
421
+ return Object.keys(value).every((key) => allowed.has(key));
422
+ }
423
+ function isRecord$1(value) {
424
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
136
425
  }
137
426
 
138
427
  /** 当前用户信息与登录能力支持的完整 scope 目录。 */
139
428
  const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile'];
140
429
 
141
- const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(['network.request']);
430
+ const MINI_PROGRAM_PERMISSION_KEYS = [
431
+ 'userInfo',
432
+ 'steamLibrary',
433
+ 'share',
434
+ 'storage',
435
+ 'filesystem',
436
+ 'clipboard',
437
+ 'leaderboard',
438
+ 'network',
439
+ ];
440
+ new Set(MINI_PROGRAM_PERMISSION_KEYS);
441
+
442
+ const MANAGED_RUNTIME_PERMISSION_KEYS = new Set(MINI_PROGRAM_PERMISSION_KEYS);
142
443
  function isManagedMiniProgramRuntimePermissionKey(key) {
143
444
  return MANAGED_RUNTIME_PERMISSION_KEYS.has(key);
144
445
  }
@@ -155,20 +456,36 @@ function parseMiniProgramRuntimePermissions(snapshot) {
155
456
  if (!isRecord(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
156
457
  return { valid: false, permissions: {} };
157
458
  }
158
- const key = rawEntry.key.trim();
159
- if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled') || !isRecord(rawEntry.config)) {
459
+ const inputKey = rawEntry.key.trim();
460
+ const key = inputKey === 'network.request' ? 'network' : inputKey;
461
+ if (seenKeys.has(key) || (rawEntry.status !== 'enabled' && rawEntry.status !== 'disabled')) {
160
462
  return { valid: false, permissions: {} };
161
463
  }
162
464
  seenKeys.add(key);
163
- if (!isManagedMiniProgramRuntimePermissionKey(key))
465
+ if (!isManagedMiniProgramRuntimePermissionKey(key)) {
466
+ if (!isRecord(rawEntry.config))
467
+ return { valid: false, permissions: {} };
164
468
  continue;
165
- if (key === 'network.request' && typeof rawEntry.config.useOfficialDomain !== 'boolean') {
469
+ }
470
+ if (key === 'network') {
471
+ const config = rawEntry.config;
472
+ if (!isRecord(config) || typeof config.useOfficialDomain !== 'boolean') {
473
+ return { valid: false, permissions: {} };
474
+ }
475
+ permissions[key] = {
476
+ key,
477
+ status: rawEntry.status,
478
+ config: { useOfficialDomain: config.useOfficialDomain },
479
+ };
480
+ continue;
481
+ }
482
+ if (rawEntry.config !== null && rawEntry.config !== undefined && (!isRecord(rawEntry.config) || Object.keys(rawEntry.config).length > 0)) {
166
483
  return { valid: false, permissions: {} };
167
484
  }
168
485
  permissions[key] = {
169
486
  key,
170
487
  status: rawEntry.status,
171
- config: { useOfficialDomain: rawEntry.config.useOfficialDomain },
488
+ config: {},
172
489
  };
173
490
  }
174
491
  return { valid: true, permissions };
@@ -177,4 +494,4 @@ function isRecord(value) {
177
494
  return typeof value === 'object' && value !== null && !Array.isArray(value);
178
495
  }
179
496
 
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 };
497
+ 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 };
@@ -1,5 +1,4 @@
1
1
  node_modules
2
2
  dist
3
- coverage
4
3
  *.local
5
4
  .DS_Store
@@ -0,0 +1,14 @@
1
+ # <%= projectName %>
2
+
3
+ ## 命令
4
+
5
+ ```bash
6
+ npm install
7
+ npm run dev
8
+ npm run build
9
+ npm run deploy -- --release-note "更新说明"
10
+ ```
11
+
12
+ `vite.config.js` 默认声明 `android`、`ios`、`ohos`。发布前请在每个声明的平台完成真机验收;需要支持桌面平台时,由项目自行加入并验收。
13
+
14
+ 更多内容见 [CLI 指南](https://docs.xiaoheihe.cn/hb_sdk/guide/cli) 和 [SDK 文档](https://docs.xiaoheihe.cn/hb_sdk/)。
@@ -0,0 +1,20 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
+ <title><%= projectName %></title>
7
+ </head>
8
+ <body>
9
+ <main class="page">
10
+ <div class="content">
11
+ <img class="logo" src="/src/assets/heybox-logo.svg" alt="小黑盒" />
12
+ <h1>Hello, World!</h1>
13
+ <p class="welcome">欢迎来到小黑盒小程序工坊</p>
14
+ <button type="button" data-testid="greeting-button">打个招呼</button>
15
+ <p class="error" data-testid="greeting-error" role="status" aria-live="polite"></p>
16
+ </div>
17
+ </main>
18
+ <script type="module" src="/src/main.js"></script>
19
+ </body>
20
+ </html>
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "<%= packageName %>",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "heybox": {
7
+ "miniProgramId": "",
8
+ "permissions": {}
9
+ },
10
+ "scripts": {
11
+ "hb-sdk": "hb-sdk",
12
+ "dev": "hb-sdk dev",
13
+ "build": "hb-sdk build",
14
+ "deploy": "hb-sdk remote deploy"
15
+ },
16
+ "dependencies": {
17
+ "@heybox/hb-sdk": "^<%= sdkVersion %>"
18
+ },
19
+ "devDependencies": {
20
+ "vite": "^8.0.12"
21
+ }
22
+ }
@@ -0,0 +1,8 @@
1
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path
3
+ fill-rule="evenodd"
4
+ clip-rule="evenodd"
5
+ d="M16.5 6.59477C16.5 6.43342 16.3831 6.23597 16.2396 6.15586L10.2098 2.76306C10.0663 2.68296 9.94826 2.61751 9.94595 2.61864C9.94363 2.61977 9.82561 2.55433 9.68212 2.47422L8.89989 2.03418C8.75641 1.95407 8.63953 2.01952 8.63953 2.18086V8.42036C8.63953 8.5817 8.77376 8.71259 8.93923 8.71259H10.9584C11.1251 8.71259 11.2593 8.5817 11.2593 8.42036V6.74032C11.2593 6.57897 11.3762 6.51353 11.5197 6.59364L13.6187 7.7761C13.7622 7.85621 13.8791 8.05366 13.8791 8.21501V14.8562C13.8791 15.0175 13.9959 15.083 14.1394 15.0029L16.2396 13.8215C16.3831 13.7414 16.5 13.544 16.5 13.3826V6.59477ZM9.03937 11.2825C8.87383 11.2825 8.73954 11.4133 8.73954 11.5745L8.74301 13.2518C8.74301 13.413 8.62609 13.4784 8.48254 13.3983L6.3814 12.2181C6.23901 12.1381 6.12208 11.9408 6.12208 11.7796V5.14365C6.12208 4.98246 6.00516 4.91708 5.86161 4.99711L3.76047 6.17732C3.61692 6.25735 3.5 6.45462 3.5 6.61581V13.3972C3.5 13.5584 3.61692 13.7557 3.76047 13.8357L8.02642 16.2344C8.16997 16.3145 8.2869 16.381 8.2869 16.3821C8.2869 16.3832 8.40266 16.4497 8.54621 16.5298L11.1 17.9658C11.2435 18.0459 11.3605 17.9805 11.3605 17.8193V11.5745C11.3593 11.4133 11.225 11.2825 11.0595 11.2825H9.03937Z"
6
+ fill="#14191E"
7
+ />
8
+ </svg>
@@ -0,0 +1,39 @@
1
+ import hbSDK from '@heybox/hb-sdk';
2
+ import './styles.css';
3
+
4
+ const greetingButton = document.querySelector('[data-testid="greeting-button"]');
5
+ const greetingError = document.querySelector('[data-testid="greeting-error"]');
6
+ const colorScheme = window.matchMedia('(prefers-color-scheme: dark)');
7
+
8
+ async function greet() {
9
+ greetingButton.disabled = true;
10
+ greetingButton.setAttribute('aria-busy', 'true');
11
+ greetingError.textContent = '';
12
+
13
+ try {
14
+ await hbSDK.ui.showToast({
15
+ message: '欢迎来到小黑盒小程序工坊',
16
+ status: 'success',
17
+ });
18
+ } catch (error) {
19
+ console.error('无法显示欢迎提示', error);
20
+ greetingError.textContent = '欢迎提示无法显示,请重试';
21
+ } finally {
22
+ greetingButton.disabled = false;
23
+ greetingButton.setAttribute('aria-busy', 'false');
24
+ }
25
+ }
26
+
27
+ function syncNavigationBar() {
28
+ hbSDK.viewport
29
+ .setNavigationBarStyle({ foregroundStyle: colorScheme.matches ? 'light' : 'dark' })
30
+ .catch((error) => console.error('无法同步导航栏样式', error));
31
+ }
32
+
33
+ greetingButton.addEventListener('click', greet);
34
+ if (typeof colorScheme.addEventListener === 'function') {
35
+ colorScheme.addEventListener('change', syncNavigationBar);
36
+ } else if (typeof colorScheme.addListener === 'function') {
37
+ colorScheme.addListener(syncNavigationBar);
38
+ }
39
+ syncNavigationBar();