@heybox/hb-sdk 0.5.10 → 0.5.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 (36) hide show
  1. package/README.md +99 -55
  2. package/dist/cli-chunks/{create-D1W2pkHZ.cjs → create-Ba353lSg.cjs} +1 -1
  3. package/dist/cli-chunks/{dev-DwbE-c1x.cjs → dev-BhPFNef-.cjs} +1 -1
  4. package/dist/cli-chunks/{doctor-Bx71WFjM.cjs → doctor-CP4kwgAn.cjs} +1 -1
  5. package/dist/cli-chunks/{index-D5bZjpH9.cjs → index-BfpHPA6k.cjs} +2 -2
  6. package/dist/cli-chunks/{index-BBatNb1l.cjs → index-DeamIV1-.cjs} +57 -13
  7. package/dist/cli-chunks/{login-BX0YmVyi.cjs → login-DMNap0-y.cjs} +2 -2
  8. package/dist/cli-chunks/{remote-YDmSxyYi.cjs → remote-gXUjRvGB.cjs} +117 -3
  9. package/dist/cli-chunks/{session-BxZBXDZ-.cjs → session-D5Vf-fNZ.cjs} +1 -1
  10. package/dist/cli.cjs +1 -1
  11. package/dist/devtools/mock-host/main.js +590 -0
  12. package/dist/index.cjs.js +84 -4
  13. package/dist/index.esm.js +84 -5
  14. package/dist/miniapp-publish.cjs.js +8 -0
  15. package/dist/miniapp-publish.esm.js +5 -1
  16. package/dist/protocol.cjs.js +50 -0
  17. package/dist/protocol.esm.js +46 -1
  18. package/package.json +2 -4
  19. package/skill/SKILL.md +4 -3
  20. package/skill/references/api-protocol.md +27 -7
  21. package/skill/references/api-root.md +64 -4
  22. package/skill/references/cli.md +3 -3
  23. package/skill/references/examples.md +2 -1
  24. package/skill/references/llms-index.md +16 -37
  25. package/skill/references/recipes.md +9 -9
  26. package/skill/references/safety-boundaries.md +3 -2
  27. package/skill/scripts/sync-references.mjs +35 -25
  28. package/skill/skill.json +4 -4
  29. package/types/core/client.d.ts +5 -1
  30. package/types/core/sdk.d.ts +3 -0
  31. package/types/core/singleton.d.ts +3 -0
  32. package/types/index.d.ts +3 -1
  33. package/types/miniapp-publish/index.d.ts +4 -0
  34. package/types/modules/cloud/index.d.ts +100 -0
  35. package/types/protocol/capabilities.d.ts +55 -2
  36. package/types/protocol.d.ts +3 -2
package/dist/index.cjs.js CHANGED
@@ -211,6 +211,8 @@ class MiniProgramBridgeClient {
211
211
  readyTimer;
212
212
  handshakeRetryTimer;
213
213
  destroyed = false;
214
+ runtimeUnavailable = false;
215
+ runtimeUnavailableError;
214
216
  constructor(options = {}) {
215
217
  this.timeout = options.timeout || DEFAULT_TIMEOUT;
216
218
  this.selfWindow = options.selfWindow || getGlobalWindow();
@@ -224,15 +226,14 @@ class MiniProgramBridgeClient {
224
226
  this.rejectReady = reject;
225
227
  });
226
228
  this.readyPromise.catch(() => undefined);
229
+ this.ensureStarted();
227
230
  }
228
231
  /** 等待父容器握手完成。 */
229
232
  ready() {
230
- this.ensureStarted();
231
233
  return this.readyPromise;
232
234
  }
233
235
  /** 注册小程序事件监听。 */
234
236
  on(eventName, handler) {
235
- this.ensureStarted();
236
237
  return this.eventBus.on(eventName, handler);
237
238
  }
238
239
  /** 移除小程序事件监听。 */
@@ -241,7 +242,19 @@ class MiniProgramBridgeClient {
241
242
  }
242
243
  /** 调用父容器开放能力。 */
243
244
  async request(method, ...args) {
245
+ if (this.destroyed) {
246
+ throw createSDKError('SDK_DESTROYED', '小程序 SDK 已销毁');
247
+ }
248
+ if (this.runtimeUnavailable) {
249
+ throw this.getRuntimeUnavailableError();
250
+ }
244
251
  await this.ready();
252
+ if (this.destroyed) {
253
+ throw createSDKError('SDK_DESTROYED', '小程序 SDK 已销毁');
254
+ }
255
+ if (this.runtimeUnavailable) {
256
+ throw this.getRuntimeUnavailableError();
257
+ }
245
258
  const payload = args[0];
246
259
  const id = createMessageId();
247
260
  const message = {
@@ -286,6 +299,10 @@ class MiniProgramBridgeClient {
286
299
  this.failReady(createSDKError('SDK_DESTROYED', '小程序 SDK 已销毁'));
287
300
  return;
288
301
  }
302
+ if (this.runtimeUnavailable) {
303
+ this.failReady(this.getRuntimeUnavailableError());
304
+ return;
305
+ }
289
306
  if (this.started) {
290
307
  return;
291
308
  }
@@ -305,7 +322,14 @@ class MiniProgramBridgeClient {
305
322
  try {
306
323
  this.postHandshake();
307
324
  this.handshakeRetryTimer = setInterval(() => {
308
- this.postHandshake();
325
+ try {
326
+ this.postHandshake();
327
+ }
328
+ catch (error) {
329
+ this.failReady(error instanceof HbMiniProgramSDKError
330
+ ? error
331
+ : createSDKError('HANDSHAKE_FAILED', '小程序沙盒握手发送失败', error));
332
+ }
309
333
  }, HANDSHAKE_RETRY_INTERVAL);
310
334
  }
311
335
  catch (error) {
@@ -348,7 +372,10 @@ class MiniProgramBridgeClient {
348
372
  }
349
373
  handleEvent(message) {
350
374
  const eventName = message.method;
351
- if (eventName === 'ready') {
375
+ if (eventName === 'unload') {
376
+ this.markRuntimeUnavailable();
377
+ }
378
+ else if (eventName === 'ready' && !this.runtimeUnavailable) {
352
379
  this.resolveReadyOnce();
353
380
  }
354
381
  this.eventBus.emit(eventName, message.payload);
@@ -401,6 +428,22 @@ class MiniProgramBridgeClient {
401
428
  this.handshakeRetryTimer = undefined;
402
429
  }
403
430
  }
431
+ markRuntimeUnavailable() {
432
+ if (this.runtimeUnavailable) {
433
+ return;
434
+ }
435
+ const error = this.getRuntimeUnavailableError();
436
+ this.runtimeUnavailable = true;
437
+ this.clearReadyTimers();
438
+ this.failReady(error);
439
+ this.rejectAllPending(error);
440
+ }
441
+ getRuntimeUnavailableError() {
442
+ if (!this.runtimeUnavailableError) {
443
+ this.runtimeUnavailableError = createSDKError('RUNTIME_UNAVAILABLE', '小程序运行时已卸载');
444
+ }
445
+ return this.runtimeUnavailableError;
446
+ }
404
447
  rejectAllPending(error) {
405
448
  this.pendingRequests.forEach(pending => {
406
449
  clearTimeout(pending.timer);
@@ -499,6 +542,16 @@ const NAVIGATION_CLOSE_METHOD = 'navigation.close';
499
542
  const NAVIGATION_RELOAD_METHOD = 'navigation.reload';
500
543
  /** 打开黑盒 App 页面能力方法名。 */
501
544
  const NAVIGATION_OPEN_APP_PAGE_METHOD = 'navigation.openAppPage';
545
+ /** 提交当前用户排行榜分数能力方法名。 */
546
+ const CLOUD_LEADERBOARD_SUBMIT_METHOD = 'cloud.leaderboard.submit';
547
+ /** 读取排行榜列表能力方法名。 */
548
+ const CLOUD_LEADERBOARD_GET_LIST_METHOD = 'cloud.leaderboard.getList';
549
+ /** 读取当前用户排行榜记录能力方法名。 */
550
+ const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.getCurrentUserEntry';
551
+ /** 删除当前用户排行榜记录能力方法名。 */
552
+ const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.deleteCurrentUserEntry';
553
+ /** 读取排行榜基础信息能力方法名。 */
554
+ const CLOUD_LEADERBOARD_GET_INFO_METHOD = 'cloud.leaderboard.getInfo';
502
555
 
503
556
  /**
504
557
  * 唤起登录授权,并在流程返回后刷新用户公开基础资料。
@@ -525,6 +578,18 @@ function createAuthModule(requester) {
525
578
  };
526
579
  }
527
580
 
581
+ function createCloudModule(requester) {
582
+ return {
583
+ leaderboard: {
584
+ submit: (options) => requester.request(CLOUD_LEADERBOARD_SUBMIT_METHOD, options),
585
+ getList: (options) => requester.request(CLOUD_LEADERBOARD_GET_LIST_METHOD, options),
586
+ getCurrentUserEntry: (options) => requester.request(CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD, options),
587
+ deleteCurrentUserEntry: (options) => requester.request(CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD, options),
588
+ getInfo: (options) => requester.request(CLOUD_LEADERBOARD_GET_INFO_METHOD, options),
589
+ },
590
+ };
591
+ }
592
+
528
593
  /**
529
594
  * 截图并唤起分享。
530
595
  *
@@ -979,6 +1044,8 @@ class MiniProgramSDK {
979
1044
  device;
980
1045
  /** 导航与容器控制相关开放能力。 */
981
1046
  navigation;
1047
+ /** 云端数据相关开放能力。 */
1048
+ cloud;
982
1049
  constructor(options) {
983
1050
  this.client = new MiniProgramBridgeClient(options);
984
1051
  this.auth = createAuthModule(this.client);
@@ -990,6 +1057,7 @@ class MiniProgramSDK {
990
1057
  this.ui = createUiModule(this.client);
991
1058
  this.device = createDeviceModule(this.client);
992
1059
  this.navigation = createNavigationModule(this.client);
1060
+ this.cloud = createCloudModule(this.client);
993
1061
  }
994
1062
  /**
995
1063
  * 等待 SDK 与父容器完成握手。
@@ -1137,6 +1205,16 @@ const navigation = {
1137
1205
  reload: () => getDefaultSDK().navigation.reload(),
1138
1206
  openAppPage: options => getDefaultSDK().navigation.openAppPage(options),
1139
1207
  };
1208
+ /** 默认 SDK 实例的 cloud 模块。 */
1209
+ const cloud = {
1210
+ leaderboard: {
1211
+ submit: options => getDefaultSDK().cloud.leaderboard.submit(options),
1212
+ getList: options => getDefaultSDK().cloud.leaderboard.getList(options),
1213
+ getCurrentUserEntry: options => getDefaultSDK().cloud.leaderboard.getCurrentUserEntry(options),
1214
+ deleteCurrentUserEntry: options => getDefaultSDK().cloud.leaderboard.deleteCurrentUserEntry(options),
1215
+ getInfo: options => getDefaultSDK().cloud.leaderboard.getInfo(options),
1216
+ },
1217
+ };
1140
1218
 
1141
1219
  const hbSDK = {
1142
1220
  ready,
@@ -1151,12 +1229,14 @@ const hbSDK = {
1151
1229
  ui,
1152
1230
  device,
1153
1231
  navigation,
1232
+ cloud,
1154
1233
  };
1155
1234
 
1156
1235
  exports.HbMiniProgramNetworkError = HbMiniProgramNetworkError;
1157
1236
  exports.HbMiniProgramSDKError = HbMiniProgramSDKError;
1158
1237
  exports.MiniProgramSDK = MiniProgramSDK;
1159
1238
  exports.auth = auth;
1239
+ exports.cloud = cloud;
1160
1240
  exports.createMiniProgramSDK = createMiniProgramSDK;
1161
1241
  exports.default = hbSDK;
1162
1242
  exports.device = device;
package/dist/index.esm.js CHANGED
@@ -207,6 +207,8 @@ class MiniProgramBridgeClient {
207
207
  readyTimer;
208
208
  handshakeRetryTimer;
209
209
  destroyed = false;
210
+ runtimeUnavailable = false;
211
+ runtimeUnavailableError;
210
212
  constructor(options = {}) {
211
213
  this.timeout = options.timeout || DEFAULT_TIMEOUT;
212
214
  this.selfWindow = options.selfWindow || getGlobalWindow();
@@ -220,15 +222,14 @@ class MiniProgramBridgeClient {
220
222
  this.rejectReady = reject;
221
223
  });
222
224
  this.readyPromise.catch(() => undefined);
225
+ this.ensureStarted();
223
226
  }
224
227
  /** 等待父容器握手完成。 */
225
228
  ready() {
226
- this.ensureStarted();
227
229
  return this.readyPromise;
228
230
  }
229
231
  /** 注册小程序事件监听。 */
230
232
  on(eventName, handler) {
231
- this.ensureStarted();
232
233
  return this.eventBus.on(eventName, handler);
233
234
  }
234
235
  /** 移除小程序事件监听。 */
@@ -237,7 +238,19 @@ class MiniProgramBridgeClient {
237
238
  }
238
239
  /** 调用父容器开放能力。 */
239
240
  async request(method, ...args) {
241
+ if (this.destroyed) {
242
+ throw createSDKError('SDK_DESTROYED', '小程序 SDK 已销毁');
243
+ }
244
+ if (this.runtimeUnavailable) {
245
+ throw this.getRuntimeUnavailableError();
246
+ }
240
247
  await this.ready();
248
+ if (this.destroyed) {
249
+ throw createSDKError('SDK_DESTROYED', '小程序 SDK 已销毁');
250
+ }
251
+ if (this.runtimeUnavailable) {
252
+ throw this.getRuntimeUnavailableError();
253
+ }
241
254
  const payload = args[0];
242
255
  const id = createMessageId();
243
256
  const message = {
@@ -282,6 +295,10 @@ class MiniProgramBridgeClient {
282
295
  this.failReady(createSDKError('SDK_DESTROYED', '小程序 SDK 已销毁'));
283
296
  return;
284
297
  }
298
+ if (this.runtimeUnavailable) {
299
+ this.failReady(this.getRuntimeUnavailableError());
300
+ return;
301
+ }
285
302
  if (this.started) {
286
303
  return;
287
304
  }
@@ -301,7 +318,14 @@ class MiniProgramBridgeClient {
301
318
  try {
302
319
  this.postHandshake();
303
320
  this.handshakeRetryTimer = setInterval(() => {
304
- this.postHandshake();
321
+ try {
322
+ this.postHandshake();
323
+ }
324
+ catch (error) {
325
+ this.failReady(error instanceof HbMiniProgramSDKError
326
+ ? error
327
+ : createSDKError('HANDSHAKE_FAILED', '小程序沙盒握手发送失败', error));
328
+ }
305
329
  }, HANDSHAKE_RETRY_INTERVAL);
306
330
  }
307
331
  catch (error) {
@@ -344,7 +368,10 @@ class MiniProgramBridgeClient {
344
368
  }
345
369
  handleEvent(message) {
346
370
  const eventName = message.method;
347
- if (eventName === 'ready') {
371
+ if (eventName === 'unload') {
372
+ this.markRuntimeUnavailable();
373
+ }
374
+ else if (eventName === 'ready' && !this.runtimeUnavailable) {
348
375
  this.resolveReadyOnce();
349
376
  }
350
377
  this.eventBus.emit(eventName, message.payload);
@@ -397,6 +424,22 @@ class MiniProgramBridgeClient {
397
424
  this.handshakeRetryTimer = undefined;
398
425
  }
399
426
  }
427
+ markRuntimeUnavailable() {
428
+ if (this.runtimeUnavailable) {
429
+ return;
430
+ }
431
+ const error = this.getRuntimeUnavailableError();
432
+ this.runtimeUnavailable = true;
433
+ this.clearReadyTimers();
434
+ this.failReady(error);
435
+ this.rejectAllPending(error);
436
+ }
437
+ getRuntimeUnavailableError() {
438
+ if (!this.runtimeUnavailableError) {
439
+ this.runtimeUnavailableError = createSDKError('RUNTIME_UNAVAILABLE', '小程序运行时已卸载');
440
+ }
441
+ return this.runtimeUnavailableError;
442
+ }
400
443
  rejectAllPending(error) {
401
444
  this.pendingRequests.forEach(pending => {
402
445
  clearTimeout(pending.timer);
@@ -495,6 +538,16 @@ const NAVIGATION_CLOSE_METHOD = 'navigation.close';
495
538
  const NAVIGATION_RELOAD_METHOD = 'navigation.reload';
496
539
  /** 打开黑盒 App 页面能力方法名。 */
497
540
  const NAVIGATION_OPEN_APP_PAGE_METHOD = 'navigation.openAppPage';
541
+ /** 提交当前用户排行榜分数能力方法名。 */
542
+ const CLOUD_LEADERBOARD_SUBMIT_METHOD = 'cloud.leaderboard.submit';
543
+ /** 读取排行榜列表能力方法名。 */
544
+ const CLOUD_LEADERBOARD_GET_LIST_METHOD = 'cloud.leaderboard.getList';
545
+ /** 读取当前用户排行榜记录能力方法名。 */
546
+ const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.getCurrentUserEntry';
547
+ /** 删除当前用户排行榜记录能力方法名。 */
548
+ const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.deleteCurrentUserEntry';
549
+ /** 读取排行榜基础信息能力方法名。 */
550
+ const CLOUD_LEADERBOARD_GET_INFO_METHOD = 'cloud.leaderboard.getInfo';
498
551
 
499
552
  /**
500
553
  * 唤起登录授权,并在流程返回后刷新用户公开基础资料。
@@ -521,6 +574,18 @@ function createAuthModule(requester) {
521
574
  };
522
575
  }
523
576
 
577
+ function createCloudModule(requester) {
578
+ return {
579
+ leaderboard: {
580
+ submit: (options) => requester.request(CLOUD_LEADERBOARD_SUBMIT_METHOD, options),
581
+ getList: (options) => requester.request(CLOUD_LEADERBOARD_GET_LIST_METHOD, options),
582
+ getCurrentUserEntry: (options) => requester.request(CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD, options),
583
+ deleteCurrentUserEntry: (options) => requester.request(CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD, options),
584
+ getInfo: (options) => requester.request(CLOUD_LEADERBOARD_GET_INFO_METHOD, options),
585
+ },
586
+ };
587
+ }
588
+
524
589
  /**
525
590
  * 截图并唤起分享。
526
591
  *
@@ -975,6 +1040,8 @@ class MiniProgramSDK {
975
1040
  device;
976
1041
  /** 导航与容器控制相关开放能力。 */
977
1042
  navigation;
1043
+ /** 云端数据相关开放能力。 */
1044
+ cloud;
978
1045
  constructor(options) {
979
1046
  this.client = new MiniProgramBridgeClient(options);
980
1047
  this.auth = createAuthModule(this.client);
@@ -986,6 +1053,7 @@ class MiniProgramSDK {
986
1053
  this.ui = createUiModule(this.client);
987
1054
  this.device = createDeviceModule(this.client);
988
1055
  this.navigation = createNavigationModule(this.client);
1056
+ this.cloud = createCloudModule(this.client);
989
1057
  }
990
1058
  /**
991
1059
  * 等待 SDK 与父容器完成握手。
@@ -1133,6 +1201,16 @@ const navigation = {
1133
1201
  reload: () => getDefaultSDK().navigation.reload(),
1134
1202
  openAppPage: options => getDefaultSDK().navigation.openAppPage(options),
1135
1203
  };
1204
+ /** 默认 SDK 实例的 cloud 模块。 */
1205
+ const cloud = {
1206
+ leaderboard: {
1207
+ submit: options => getDefaultSDK().cloud.leaderboard.submit(options),
1208
+ getList: options => getDefaultSDK().cloud.leaderboard.getList(options),
1209
+ getCurrentUserEntry: options => getDefaultSDK().cloud.leaderboard.getCurrentUserEntry(options),
1210
+ deleteCurrentUserEntry: options => getDefaultSDK().cloud.leaderboard.deleteCurrentUserEntry(options),
1211
+ getInfo: options => getDefaultSDK().cloud.leaderboard.getInfo(options),
1212
+ },
1213
+ };
1136
1214
 
1137
1215
  const hbSDK = {
1138
1216
  ready,
@@ -1147,6 +1225,7 @@ const hbSDK = {
1147
1225
  ui,
1148
1226
  device,
1149
1227
  navigation,
1228
+ cloud,
1150
1229
  };
1151
1230
 
1152
- export { HbMiniProgramNetworkError, HbMiniProgramSDKError, MiniProgramSDK, auth, createMiniProgramSDK, hbSDK as default, device, navigation, network, off, on, ready, share, storage, ui, user, viewport };
1231
+ export { HbMiniProgramNetworkError, HbMiniProgramSDKError, MiniProgramSDK, auth, cloud, createMiniProgramSDK, hbSDK as default, device, navigation, network, off, on, ready, share, storage, ui, user, viewport };
@@ -2821,6 +2821,10 @@ const CREATE_USER_MINIPROGRAM_API_PATH = '/mall/developer/user_miniprogram/creat
2821
2821
  const DETAIL_USER_MINIPROGRAM_API_PATH = '/mall/developer/user_miniprogram/detail';
2822
2822
  const USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH = '/mall/developer/user_miniprogram/preview_allowlist';
2823
2823
  const UPDATE_USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH = '/mall/developer/user_miniprogram/preview_allowlist/update';
2824
+ const CREATE_USER_MINIPROGRAM_LEADERBOARD_API_PATH = '/mall/developer/user_miniprogram/leaderboard/create';
2825
+ const DETAIL_USER_MINIPROGRAM_LEADERBOARD_API_PATH = '/mall/developer/user_miniprogram/leaderboard/detail';
2826
+ const LIST_USER_MINIPROGRAM_LEADERBOARD_API_PATH = '/mall/developer/user_miniprogram/leaderboard/list';
2827
+ const DELETE_USER_MINIPROGRAM_LEADERBOARD_API_PATH = '/mall/developer/user_miniprogram/leaderboard/delete';
2824
2828
  const PRECHECK_USER_MINIPROGRAM_VERSION_API_PATH = '/mall/developer/user_miniprogram/version/precheck';
2825
2829
  const SUBMIT_USER_MINIPROGRAM_AUDIT_API_PATH = '/mall/developer/user_miniprogram/version/submit_audit';
2826
2830
  const USER_MINIPROGRAM_VERSION_PREVIEW_INFO_API_PATH = '/mall/developer/user_miniprogram/version/preview_info';
@@ -2901,10 +2905,14 @@ function shouldUploadDistFile(relativePath) {
2901
2905
 
2902
2906
  exports.ACTIVITY_UPLOAD_KEY_MAX_LENGTH = ACTIVITY_UPLOAD_KEY_MAX_LENGTH;
2903
2907
  exports.CREATE_USER_MINIPROGRAM_API_PATH = CREATE_USER_MINIPROGRAM_API_PATH;
2908
+ exports.CREATE_USER_MINIPROGRAM_LEADERBOARD_API_PATH = CREATE_USER_MINIPROGRAM_LEADERBOARD_API_PATH;
2909
+ exports.DELETE_USER_MINIPROGRAM_LEADERBOARD_API_PATH = DELETE_USER_MINIPROGRAM_LEADERBOARD_API_PATH;
2904
2910
  exports.DETAIL_USER_MINIPROGRAM_API_PATH = DETAIL_USER_MINIPROGRAM_API_PATH;
2911
+ exports.DETAIL_USER_MINIPROGRAM_LEADERBOARD_API_PATH = DETAIL_USER_MINIPROGRAM_LEADERBOARD_API_PATH;
2905
2912
  exports.DEVELOPER_ENTITY_LIST_API_PATH = DEVELOPER_ENTITY_LIST_API_PATH;
2906
2913
  exports.DEVELOPER_ENTITY_SWITCH_API_PATH = DEVELOPER_ENTITY_SWITCH_API_PATH;
2907
2914
  exports.LIST_USER_MINIPROGRAM_API_PATH = LIST_USER_MINIPROGRAM_API_PATH;
2915
+ exports.LIST_USER_MINIPROGRAM_LEADERBOARD_API_PATH = LIST_USER_MINIPROGRAM_LEADERBOARD_API_PATH;
2908
2916
  exports.LIST_USER_MINIPROGRAM_VERSION_API_PATH = LIST_USER_MINIPROGRAM_VERSION_API_PATH;
2909
2917
  exports.MINIAPP_UPLOAD_BATCH_SIZE = MINIAPP_UPLOAD_BATCH_SIZE;
2910
2918
  exports.MINIAPP_UPLOAD_SCOPE = MINIAPP_UPLOAD_SCOPE;
@@ -2819,6 +2819,10 @@ const CREATE_USER_MINIPROGRAM_API_PATH = '/mall/developer/user_miniprogram/creat
2819
2819
  const DETAIL_USER_MINIPROGRAM_API_PATH = '/mall/developer/user_miniprogram/detail';
2820
2820
  const USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH = '/mall/developer/user_miniprogram/preview_allowlist';
2821
2821
  const UPDATE_USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH = '/mall/developer/user_miniprogram/preview_allowlist/update';
2822
+ const CREATE_USER_MINIPROGRAM_LEADERBOARD_API_PATH = '/mall/developer/user_miniprogram/leaderboard/create';
2823
+ const DETAIL_USER_MINIPROGRAM_LEADERBOARD_API_PATH = '/mall/developer/user_miniprogram/leaderboard/detail';
2824
+ const LIST_USER_MINIPROGRAM_LEADERBOARD_API_PATH = '/mall/developer/user_miniprogram/leaderboard/list';
2825
+ const DELETE_USER_MINIPROGRAM_LEADERBOARD_API_PATH = '/mall/developer/user_miniprogram/leaderboard/delete';
2822
2826
  const PRECHECK_USER_MINIPROGRAM_VERSION_API_PATH = '/mall/developer/user_miniprogram/version/precheck';
2823
2827
  const SUBMIT_USER_MINIPROGRAM_AUDIT_API_PATH = '/mall/developer/user_miniprogram/version/submit_audit';
2824
2828
  const USER_MINIPROGRAM_VERSION_PREVIEW_INFO_API_PATH = '/mall/developer/user_miniprogram/version/preview_info';
@@ -2897,4 +2901,4 @@ function shouldUploadDistFile(relativePath) {
2897
2901
  return true;
2898
2902
  }
2899
2903
 
2900
- export { ACTIVITY_UPLOAD_KEY_MAX_LENGTH, CREATE_USER_MINIPROGRAM_API_PATH, DETAIL_USER_MINIPROGRAM_API_PATH, DEVELOPER_ENTITY_LIST_API_PATH, DEVELOPER_ENTITY_SWITCH_API_PATH, LIST_USER_MINIPROGRAM_API_PATH, LIST_USER_MINIPROGRAM_VERSION_API_PATH, MINIAPP_UPLOAD_BATCH_SIZE, MINIAPP_UPLOAD_SCOPE, MINIAPP_UPLOAD_TOTAL_SIZE_LIMIT_BYTES, PRECHECK_USER_MINIPROGRAM_VERSION_API_PATH, RELEASE_USER_MINIPROGRAM_VERSION_API_PATH, REOPEN_USER_MINIPROGRAM_API_PATH, SUBMIT_USER_MINIPROGRAM_AUDIT_API_PATH, TAKE_DOWN_USER_MINIPROGRAM_API_PATH, UPDATE_SQUARE_DISPLAY_API_PATH, UPDATE_USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH, USER_MINIPROGRAM_ACCESS_STATUS_API_PATH, USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH, USER_MINIPROGRAM_VERSION_PREVIEW_INFO_API_PATH, WITHDRAW_USER_MINIPROGRAM_VERSION_API_PATH, getMiniProgramUploadAlias, getMiniappUploadKey, isValidMiniappManifestVersion as isValidVersion, normalizeRelativePath, relativePathContainsNodeModulesSegment, shouldUploadDistFile, validateUploadPaths, validateUploadTotalSize };
2904
+ export { ACTIVITY_UPLOAD_KEY_MAX_LENGTH, CREATE_USER_MINIPROGRAM_API_PATH, CREATE_USER_MINIPROGRAM_LEADERBOARD_API_PATH, DELETE_USER_MINIPROGRAM_LEADERBOARD_API_PATH, DETAIL_USER_MINIPROGRAM_API_PATH, DETAIL_USER_MINIPROGRAM_LEADERBOARD_API_PATH, DEVELOPER_ENTITY_LIST_API_PATH, DEVELOPER_ENTITY_SWITCH_API_PATH, LIST_USER_MINIPROGRAM_API_PATH, LIST_USER_MINIPROGRAM_LEADERBOARD_API_PATH, LIST_USER_MINIPROGRAM_VERSION_API_PATH, MINIAPP_UPLOAD_BATCH_SIZE, MINIAPP_UPLOAD_SCOPE, MINIAPP_UPLOAD_TOTAL_SIZE_LIMIT_BYTES, PRECHECK_USER_MINIPROGRAM_VERSION_API_PATH, RELEASE_USER_MINIPROGRAM_VERSION_API_PATH, REOPEN_USER_MINIPROGRAM_API_PATH, SUBMIT_USER_MINIPROGRAM_AUDIT_API_PATH, TAKE_DOWN_USER_MINIPROGRAM_API_PATH, UPDATE_SQUARE_DISPLAY_API_PATH, UPDATE_USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH, USER_MINIPROGRAM_ACCESS_STATUS_API_PATH, USER_MINIPROGRAM_PREVIEW_ALLOWLIST_API_PATH, USER_MINIPROGRAM_VERSION_PREVIEW_INFO_API_PATH, WITHDRAW_USER_MINIPROGRAM_VERSION_API_PATH, getMiniProgramUploadAlias, getMiniappUploadKey, isValidMiniappManifestVersion as isValidVersion, normalizeRelativePath, relativePathContainsNodeModulesSegment, shouldUploadDistFile, validateUploadPaths, validateUploadTotalSize };
@@ -115,6 +115,16 @@ const NAVIGATION_CLOSE_METHOD = 'navigation.close';
115
115
  const NAVIGATION_RELOAD_METHOD = 'navigation.reload';
116
116
  /** 打开黑盒 App 页面能力方法名。 */
117
117
  const NAVIGATION_OPEN_APP_PAGE_METHOD = 'navigation.openAppPage';
118
+ /** 提交当前用户排行榜分数能力方法名。 */
119
+ const CLOUD_LEADERBOARD_SUBMIT_METHOD = 'cloud.leaderboard.submit';
120
+ /** 读取排行榜列表能力方法名。 */
121
+ const CLOUD_LEADERBOARD_GET_LIST_METHOD = 'cloud.leaderboard.getList';
122
+ /** 读取当前用户排行榜记录能力方法名。 */
123
+ const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.getCurrentUserEntry';
124
+ /** 删除当前用户排行榜记录能力方法名。 */
125
+ const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.deleteCurrentUserEntry';
126
+ /** 读取排行榜基础信息能力方法名。 */
127
+ const CLOUD_LEADERBOARD_GET_INFO_METHOD = 'cloud.leaderboard.getInfo';
118
128
  /**
119
129
  * 小程序开放能力目录。
120
130
  *
@@ -276,9 +286,49 @@ const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
276
286
  permission: 'navigation.openAppPage',
277
287
  risk: 'medium',
278
288
  },
289
+ {
290
+ method: CLOUD_LEADERBOARD_SUBMIT_METHOD,
291
+ module: 'cloud',
292
+ capability: CLOUD_LEADERBOARD_SUBMIT_METHOD,
293
+ permission: 'cloud.leaderboard.write',
294
+ risk: 'medium',
295
+ },
296
+ {
297
+ method: CLOUD_LEADERBOARD_GET_LIST_METHOD,
298
+ module: 'cloud',
299
+ capability: CLOUD_LEADERBOARD_GET_LIST_METHOD,
300
+ permission: 'cloud.leaderboard.read',
301
+ risk: 'low',
302
+ },
303
+ {
304
+ method: CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
305
+ module: 'cloud',
306
+ capability: CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
307
+ permission: 'cloud.leaderboard.currentUserEntry.read',
308
+ risk: 'medium',
309
+ },
310
+ {
311
+ method: CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
312
+ module: 'cloud',
313
+ capability: CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
314
+ permission: 'cloud.leaderboard.currentUserEntry.delete',
315
+ risk: 'medium',
316
+ },
317
+ {
318
+ method: CLOUD_LEADERBOARD_GET_INFO_METHOD,
319
+ module: 'cloud',
320
+ capability: CLOUD_LEADERBOARD_GET_INFO_METHOD,
321
+ permission: 'cloud.leaderboard.info.read',
322
+ risk: 'low',
323
+ },
279
324
  ];
280
325
 
281
326
  exports.AUTH_LOGIN_METHOD = AUTH_LOGIN_METHOD;
327
+ exports.CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD;
328
+ exports.CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD;
329
+ exports.CLOUD_LEADERBOARD_GET_INFO_METHOD = CLOUD_LEADERBOARD_GET_INFO_METHOD;
330
+ exports.CLOUD_LEADERBOARD_GET_LIST_METHOD = CLOUD_LEADERBOARD_GET_LIST_METHOD;
331
+ exports.CLOUD_LEADERBOARD_SUBMIT_METHOD = CLOUD_LEADERBOARD_SUBMIT_METHOD;
282
332
  exports.DEVICE_SET_CLIPBOARD_METHOD = DEVICE_SET_CLIPBOARD_METHOD;
283
333
  exports.DEVICE_VIBRATE_METHOD = DEVICE_VIBRATE_METHOD;
284
334
  exports.MINI_PROGRAM_BRIDGE_NONCE_PARAM = MINI_PROGRAM_BRIDGE_NONCE_PARAM;
@@ -113,6 +113,16 @@ const NAVIGATION_CLOSE_METHOD = 'navigation.close';
113
113
  const NAVIGATION_RELOAD_METHOD = 'navigation.reload';
114
114
  /** 打开黑盒 App 页面能力方法名。 */
115
115
  const NAVIGATION_OPEN_APP_PAGE_METHOD = 'navigation.openAppPage';
116
+ /** 提交当前用户排行榜分数能力方法名。 */
117
+ const CLOUD_LEADERBOARD_SUBMIT_METHOD = 'cloud.leaderboard.submit';
118
+ /** 读取排行榜列表能力方法名。 */
119
+ const CLOUD_LEADERBOARD_GET_LIST_METHOD = 'cloud.leaderboard.getList';
120
+ /** 读取当前用户排行榜记录能力方法名。 */
121
+ const CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.getCurrentUserEntry';
122
+ /** 删除当前用户排行榜记录能力方法名。 */
123
+ const CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD = 'cloud.leaderboard.deleteCurrentUserEntry';
124
+ /** 读取排行榜基础信息能力方法名。 */
125
+ const CLOUD_LEADERBOARD_GET_INFO_METHOD = 'cloud.leaderboard.getInfo';
116
126
  /**
117
127
  * 小程序开放能力目录。
118
128
  *
@@ -274,6 +284,41 @@ const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
274
284
  permission: 'navigation.openAppPage',
275
285
  risk: 'medium',
276
286
  },
287
+ {
288
+ method: CLOUD_LEADERBOARD_SUBMIT_METHOD,
289
+ module: 'cloud',
290
+ capability: CLOUD_LEADERBOARD_SUBMIT_METHOD,
291
+ permission: 'cloud.leaderboard.write',
292
+ risk: 'medium',
293
+ },
294
+ {
295
+ method: CLOUD_LEADERBOARD_GET_LIST_METHOD,
296
+ module: 'cloud',
297
+ capability: CLOUD_LEADERBOARD_GET_LIST_METHOD,
298
+ permission: 'cloud.leaderboard.read',
299
+ risk: 'low',
300
+ },
301
+ {
302
+ method: CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
303
+ module: 'cloud',
304
+ capability: CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
305
+ permission: 'cloud.leaderboard.currentUserEntry.read',
306
+ risk: 'medium',
307
+ },
308
+ {
309
+ method: CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
310
+ module: 'cloud',
311
+ capability: CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
312
+ permission: 'cloud.leaderboard.currentUserEntry.delete',
313
+ risk: 'medium',
314
+ },
315
+ {
316
+ method: CLOUD_LEADERBOARD_GET_INFO_METHOD,
317
+ module: 'cloud',
318
+ capability: CLOUD_LEADERBOARD_GET_INFO_METHOD,
319
+ permission: 'cloud.leaderboard.info.read',
320
+ risk: 'low',
321
+ },
277
322
  ];
278
323
 
279
- export { AUTH_LOGIN_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, SDK_HANDSHAKE_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_CURRENT_USER_DETAIL_METHOD, USER_GET_CURRENT_USER_PROFILE_METHOD, USER_GET_INFO_METHOD, USER_GET_PLATFORM_ACCOUNT_INFO_METHOD, USER_GET_PLATFORM_ACCOUNT_OVERVIEW_METHOD, USER_GET_STEAM_GAME_LIST_METHOD, VIEWPORT_GET_WINDOW_INFO_METHOD, VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD, isMiniProgramBridgeMessage };
324
+ 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, SDK_HANDSHAKE_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_CURRENT_USER_DETAIL_METHOD, USER_GET_CURRENT_USER_PROFILE_METHOD, USER_GET_INFO_METHOD, USER_GET_PLATFORM_ACCOUNT_INFO_METHOD, USER_GET_PLATFORM_ACCOUNT_OVERVIEW_METHOD, USER_GET_STEAM_GAME_LIST_METHOD, VIEWPORT_GET_WINDOW_INFO_METHOD, VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD, isMiniProgramBridgeMessage };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heybox/hb-sdk",
3
- "version": "0.5.10",
3
+ "version": "0.5.12",
4
4
  "description": "",
5
5
  "exports": {
6
6
  ".": {
@@ -116,9 +116,7 @@
116
116
  "build:templates": "node scripts/copy-cli-templates.cjs",
117
117
  "build:types": "tsc -p tsconfig.dts.json",
118
118
  "check:boundary": "node scripts/check-boundary.cjs",
119
- "check:docs-sync": "node scripts/check-docs-sync.cjs",
120
- "sync:agent-skills-payload": "node skill/scripts/sync-agent-skills-payload.mjs",
121
- "check:agent-skills-payload": "node skill/scripts/sync-agent-skills-payload.mjs --check",
119
+ "check:docs-sync": "pnpm -w exec hbexec hb-sdk check",
122
120
  "clean": "rimraf ./dist && rimraf ./types",
123
121
  "test:unit": "NODE_OPTIONS='--conditions=heybox' vitest run",
124
122
  "test:unit:coverage": "NODE_OPTIONS='--conditions=heybox' vitest run --coverage",
package/skill/SKILL.md CHANGED
@@ -118,6 +118,7 @@ For host/runtime/protocol-maintenance code:
118
118
  - `pnpm --filter @heybox/hb-sdk run check:boundary`
119
119
  - `pnpm --filter @heybox/hb-sdk run test:unit`
120
120
  - Verify `dist/cli.cjs` does not have any `require('cos-nodejs-sdk-v5')` left after `build:cli`; the boundary check enforces this automatically.
121
- 8. Verify public payload sync before publishing:
122
- - `pnpm --filter @heybox-spa/open run sync:agent-skills`
123
- - `pnpm --filter @heybox-spa/open run check:agent-skills`
121
+ 8. Verify the canonical payload before publishing:
122
+ - `pnpm exec hbexec hb-sdk sync`
123
+ - `pnpm exec hbexec hb-sdk check`
124
+ - For a release artifact, run `pnpm exec hbexec hb-sdk sync --out-dir <payload-dir>` and then `pnpm exec hbexec hb-sdk check-artifact --artifact-dir <payload-dir>`.
@@ -6,7 +6,7 @@
6
6
 
7
7
  - packages/hb-sdk/src/protocol.ts
8
8
  - packages/hb-sdk/README.md
9
- - apps/h5/docs/hb_sdk/src/.vuepress/public/llms/reference/README.md
9
+ - apps/docs/hb-sdk/reference/index.md
10
10
 
11
11
  ## Contents
12
12
 
@@ -38,6 +38,11 @@ export type {
38
38
  } from './protocol/types';
39
39
  export {
40
40
  AUTH_LOGIN_METHOD,
41
+ CLOUD_LEADERBOARD_DELETE_CURRENT_USER_ENTRY_METHOD,
42
+ CLOUD_LEADERBOARD_GET_CURRENT_USER_ENTRY_METHOD,
43
+ CLOUD_LEADERBOARD_GET_INFO_METHOD,
44
+ CLOUD_LEADERBOARD_GET_LIST_METHOD,
45
+ CLOUD_LEADERBOARD_SUBMIT_METHOD,
41
46
  DEVICE_SET_CLIPBOARD_METHOD,
42
47
  DEVICE_VIBRATE_METHOD,
43
48
  MINI_PROGRAM_PROTOCOL_CAPABILITIES,
@@ -72,6 +77,7 @@ export type {
72
77
  MiniProgramCapabilityResult,
73
78
  MiniProgramCapabilityResultMap,
74
79
  MiniProgramCapabilityRisk,
80
+ MiniProgramCloudMethod,
75
81
  MiniProgramNavigationMethod,
76
82
  MiniProgramNetworkMethod,
77
83
  MiniProgramShareMethod,
@@ -81,6 +87,20 @@ export type {
81
87
  MiniProgramViewportMethod,
82
88
  } from './protocol/capabilities';
83
89
  export type { LoginPayload, LoginResult } from './modules/auth';
90
+ export type {
91
+ DeleteCurrentUserLeaderboardEntryPayload,
92
+ DeleteCurrentUserLeaderboardEntryResult,
93
+ GetCurrentUserLeaderboardEntryPayload,
94
+ GetCurrentUserLeaderboardEntryResult,
95
+ GetLeaderboardInfoPayload,
96
+ GetLeaderboardInfoResult,
97
+ GetLeaderboardListPayload,
98
+ GetLeaderboardListResult,
99
+ LeaderboardEntry,
100
+ LeaderboardOrder,
101
+ SubmitLeaderboardEntryPayload,
102
+ SubmitLeaderboardEntryResult,
103
+ } from './modules/cloud';
84
104
  export type {
85
105
  GetCurrentUserDetailPayload,
86
106
  GetCurrentUserDetailResult,
@@ -177,16 +197,16 @@ export type {
177
197
 
178
198
  # Reference
179
199
 
180
- Reference 由 `packages/hb-sdk` 的公开导出与源码注释自动生成,不重复 Guide 的接入流程。
200
+ Reference 由 `@heybox/hb-sdk` 的公开导出与源码注释自动生成,不重复 Guide 的接入流程。
181
201
 
182
202
  | 导出面 | 说明 |
183
203
  | --- | --- |
184
- | [Root API](./root/README.md) | 来自 `src/index.ts` 的默认导出、命名导出与公开能力。 |
185
- | [Protocol API](./protocol/README.md) | 来自 `src/protocol.ts` 的协议常量、消息类型与 method 契约。 |
204
+ | [Root API](./root/) | 来自 `src/index.ts` 的默认导出、命名导出与公开能力。 |
205
+ | [Protocol API](./protocol/) | 来自 `src/protocol.ts` 的协议常量、消息类型与 method 契约。 |
186
206
 
187
207
  ## 查询建议
188
208
 
189
- - 想查业务接入路径:先看 [Guide](../guide/README.md)。
209
+ - 想查业务接入路径:先看 [Guide](../guide/)。
190
210
  - 想查导出符号:从 Root API 或 Protocol API 进入对应分类页。
191
211
  - 想看场景化用法:优先看 Guide / Recipes 页面中的“进一步阅读”。
192
212
 
@@ -194,5 +214,5 @@ Reference 由 `packages/hb-sdk` 的公开导出与源码注释自动生成,不
194
214
 
195
215
  | 导出面 | Classes | Functions | Interfaces | Types | Constants |
196
216
  | --- | ---: | ---: | ---: | ---: | ---: |
197
- | Root API | 3 | 4 | 53 | 45 | 3 |
198
- | Protocol API | 0 | 1 | 30 | 57 | 26 |
217
+ | Root API | 3 | 4 | 67 | 57 | 4 |
218
+ | Protocol API | 0 | 1 | 39 | 66 | 32 |