@heybox/hb-sdk 0.9.4-alpha.5 → 0.9.4

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 (37) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +10 -5
  3. package/dist/cli-chunks/{artifact-jsQYkAtl.cjs → artifact-DKBVVALl.cjs} +3 -3
  4. package/dist/cli-chunks/{build-DP_wWCqD.cjs → build-ByqewdbU.cjs} +5 -5
  5. package/dist/cli-chunks/{create-BBP7d0VG.cjs → create-RucKGsv0.cjs} +1 -1
  6. package/dist/cli-chunks/{deploy-lock-CWw3roCU.cjs → deploy-lock-IBHm1WFG.cjs} +1 -1
  7. package/dist/cli-chunks/{dev-Bk5K5rIN.cjs → dev-D-_6vms0.cjs} +8 -8
  8. package/dist/cli-chunks/{dev-context-_5_wHVh2.cjs → dev-context-B4ZtDxzm.cjs} +2 -2
  9. package/dist/cli-chunks/{doctor-DUZQAmFA.cjs → doctor-DQeX2AJX.cjs} +1 -1
  10. package/dist/cli-chunks/{games-ClpE0MnF.cjs → games-BMmrK7pj.cjs} +2 -2
  11. package/dist/cli-chunks/{index-bC9zBCaD.cjs → index-DOg8iLM6.cjs} +1 -1
  12. package/dist/cli-chunks/{index-f08ccpUh.cjs → index-Dx_O9N1P.cjs} +17 -18
  13. package/dist/cli-chunks/{index.esm-CipGgSZl.cjs → index.esm-C_JZnx87.cjs} +6 -6
  14. package/dist/cli-chunks/{login-Gx4BRnFT.cjs → login-DzbMxAOa.cjs} +1 -1
  15. package/dist/cli-chunks/{project-vite-1w111P1v.cjs → project-vite-DXt33L_j.cjs} +1 -1
  16. package/dist/cli-chunks/{remote-DfxjFx2c.cjs → remote-CxGBKlIt.cjs} +10 -8
  17. package/dist/cli-chunks/{runtime-permission-env-Dxy6rI1X.cjs → runtime-permission-env-BAi5k5Hm.cjs} +18 -4
  18. package/dist/cli-chunks/{skill-B0BZ_jWO.cjs → skill-CtKW4NiU.cjs} +2 -2
  19. package/dist/cli-chunks/{version-BOTQ1B8f.cjs → version-CJsHJ4QU.cjs} +1 -1
  20. package/dist/cli.cjs +1 -1
  21. package/dist/devtools/browser-dev-host/assets/browser-dev-host-B9Gx2iIY.js +102 -0
  22. package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-TmPyZOfN.js → desktop-app-launch-BElRBLGR.js} +1 -1
  23. package/dist/devtools/browser-dev-host/assets/{index-DiXCkImS.js → index-zZH5iNv_.js} +3 -3
  24. package/dist/devtools/browser-dev-host/index.html +2 -2
  25. package/dist/index.cjs.js +77 -4
  26. package/dist/index.esm.js +77 -5
  27. package/dist/miniapp-publish.cjs.js +16 -2
  28. package/dist/miniapp-publish.esm.js +16 -2
  29. package/dist/protocol.cjs.js +19 -3
  30. package/dist/protocol.esm.js +19 -3
  31. package/dist/vite.cjs.js +17 -3
  32. package/dist/vite.esm.js +17 -3
  33. package/package.json +6 -6
  34. package/skill/skill.json +4 -4
  35. package/types/index.d.ts +80 -4
  36. package/types/miniapp-publish/index.d.ts +1 -1
  37. package/dist/devtools/browser-dev-host/assets/browser-dev-host-Mo7HHCc9.js +0 -102
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta name="theme-color" content="#f4f5f7" />
7
7
  <title>小程序工坊调试台</title>
8
- <script type="module" crossorigin src="/assets/index-DiXCkImS.js"></script>
9
- <link rel="modulepreload" crossorigin href="/assets/desktop-app-launch-TmPyZOfN.js">
8
+ <script type="module" crossorigin src="/assets/index-zZH5iNv_.js"></script>
9
+ <link rel="modulepreload" crossorigin href="/assets/desktop-app-launch-BElRBLGR.js">
10
10
  <link rel="stylesheet" crossorigin href="/assets/index-h-fYisyX.css">
11
11
  </head>
12
12
  <body>
package/dist/index.cjs.js CHANGED
@@ -415,6 +415,10 @@ const COMPANION_SESSION_OWNERSHIP_LOST_EVENT = 'companion.session.ownershipLost'
415
415
  const WORKSPACE_CARDS_REQUEST_REFRESH_METHOD = 'workspaceCards.requestRefresh';
416
416
  const AUTH_GET_ACCOUNT_STATE_METHOD = 'auth.getAccountState';
417
417
  const AUTH_LOGIN_METHOD = 'auth.login';
418
+ const GAME_SAVES_LIST_METHOD = 'gameSaves.list';
419
+ const GAME_SAVES_SYNC_METHOD = 'gameSaves.sync';
420
+ const GAME_SAVES_GET_FILE_METHOD = 'gameSaves.getFile';
421
+ const GAME_SAVES_READ_PARSED_DATA_METHOD = 'gameSaves.readParsedData';
418
422
  const USER_GET_INFO_METHOD = 'user.getInfo';
419
423
  const USER_REVOKE_AUTHORIZATION_METHOD = 'user.revokeAuthorization';
420
424
  const USER_GET_STEAM_GAME_LIST_METHOD = 'user.getSteamGameList';
@@ -840,7 +844,9 @@ function isMiniProgramDirectoryRef(value) {
840
844
  if (isNonEmptyString$1(value.handleId)) {
841
845
  return hasOnlyKeys(value, ['kind', 'handleId']);
842
846
  }
843
- return (isMiniProgramPathRootRef(value.root) && (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
847
+ return (isMiniProgramPathRootRef(value.root) &&
848
+ (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) &&
849
+ hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
844
850
  }
845
851
  /**
846
852
  * 判断未知值是否具有文件 descriptor 的最低 wire 结构。
@@ -1258,6 +1264,7 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
1258
1264
  'share',
1259
1265
  'storage',
1260
1266
  'cloud_storage',
1267
+ 'gameSaves',
1261
1268
  'filesystem',
1262
1269
  'media',
1263
1270
  'clipboard',
@@ -7485,7 +7492,7 @@ function createMessageId() {
7485
7492
  /** 构建时替换为当前发布包的实际版本。 */
7486
7493
  const HB_SDK_VERSION = typeof undefined === 'string'
7487
7494
  ? undefined
7488
- : '0.9.4-alpha.5';
7495
+ : '0.9.4';
7489
7496
 
7490
7497
  const RUNTIME_MODES = new Set(['production', 'preview', 'development', 'unknown']);
7491
7498
  const OPERATING_SYSTEM_NAMES = new Set(['android', 'ios', 'ohos', 'windows', 'macos', 'linux', 'unknown']);
@@ -8474,6 +8481,61 @@ function isMiniProgramFileSystemValue(value) {
8474
8481
  return !!value && typeof value === 'object' && brandedFileSystemValues.has(value);
8475
8482
  }
8476
8483
 
8484
+ function createGameSavesModule(requester) {
8485
+ return {
8486
+ async list(gameId) {
8487
+ const payload = { gameId };
8488
+ const result = await requester.request(GAME_SAVES_LIST_METHOD, payload);
8489
+ const accountId = result.accountId;
8490
+ return result.saves.map((save) => {
8491
+ const saveId = save.saveId;
8492
+ return {
8493
+ ...save,
8494
+ files: save.files.map((file) => {
8495
+ const fileId = file.fileId;
8496
+ return Object.freeze({
8497
+ ...file,
8498
+ async downloadFile({ signal } = {}) {
8499
+ const descriptor = await requester.requestOperation(GAME_SAVES_GET_FILE_METHOD, { gameId, accountId, saveId, fileId }, {
8500
+ ...(signal ? { signal } : {}),
8501
+ createAbortError: () => createSDKError('DOWNLOAD_CANCELLED', '存档下载已取消'),
8502
+ });
8503
+ if (!descriptor || descriptor.mode !== 'read')
8504
+ throw createSDKError('INVALID_RESPONSE', '存档必须为只读文件');
8505
+ return getFileHandleRegistry(requester).createFile(descriptor);
8506
+ },
8507
+ });
8508
+ }),
8509
+ };
8510
+ });
8511
+ },
8512
+ async getLatestStructuredData(gameId) {
8513
+ const result = await requester.request(GAME_SAVES_READ_PARSED_DATA_METHOD, { gameId });
8514
+ // 旧宿主的 overview 不能作为完整数据交付;只返回公开字段。
8515
+ if (result?.status === 'ready' && result.data && typeof result.data === 'object' && !Array.isArray(result.data)) {
8516
+ return { status: 'ready', data: result.data };
8517
+ }
8518
+ if (result?.status === 'empty' || result?.status === 'unsupported')
8519
+ return { status: result.status };
8520
+ if (result?.status === 'failed' && typeof result.error?.code === 'string' && typeof result.error?.message === 'string') {
8521
+ return { status: 'failed', error: { code: result.error.code, message: result.error.message } };
8522
+ }
8523
+ throw createSDKError('INVALID_RESPONSE', '结构化数据响应不合法');
8524
+ },
8525
+ async sync(gameId, options = {}) {
8526
+ const { signal } = options;
8527
+ const payload = { gameId };
8528
+ const result = await requester.requestOperation(GAME_SAVES_SYNC_METHOD, payload, {
8529
+ ...(signal ? { signal } : {}),
8530
+ createAbortError: () => createSDKError('REQUEST_CANCELLED', '已停止等待存档同步'),
8531
+ });
8532
+ if (result?.state !== 'succeeded')
8533
+ throw createSDKError('INVALID_RESPONSE', '同步完成响应不合法');
8534
+ // 成功不返回内部任务阶段;旧宿主的完成响应仍需校验。
8535
+ },
8536
+ };
8537
+ }
8538
+
8477
8539
  function normalizeAlias(alias) {
8478
8540
  if (typeof alias !== 'string' || !COMPANION_ALIAS_PATTERN.test(alias)) {
8479
8541
  throw createSDKError('INVALID_PARAMS', 'alias 必须是规范的 Companion alias');
@@ -11640,6 +11702,8 @@ class MiniProgramSDK {
11640
11702
  navigation;
11641
11703
  /** 云端数据相关开放能力。 */
11642
11704
  cloud;
11705
+ /** 查询、同步并读取当前用户的 Steam 游戏存档。 */
11706
+ gameSaves;
11643
11707
  /** 受管桌面程序能力。 */
11644
11708
  companion;
11645
11709
  /** 当前实例的环境信息。 */
@@ -11662,6 +11726,7 @@ class MiniProgramSDK {
11662
11726
  this.device = createDeviceModule(this.client);
11663
11727
  this.navigation = createNavigationModule(this.client);
11664
11728
  this.cloud = createCloudModule(this.client);
11729
+ this.gameSaves = createGameSavesModule(this.client);
11665
11730
  this.companion = createCompanionModule(this.client);
11666
11731
  this.environment = createEnvironmentModule(this.client);
11667
11732
  }
@@ -12224,6 +12289,12 @@ const navigation = {
12224
12289
  openAppPage: (options) => getDefaultSDK().navigation.openAppPage(options),
12225
12290
  };
12226
12291
  /** 默认 SDK 实例的 cloud 模块。 */
12292
+ /** 当前用户的游戏存档能力。 */
12293
+ const gameSaves = {
12294
+ list: (gameId) => getDefaultSDK().gameSaves.list(gameId),
12295
+ getLatestStructuredData: (gameId) => getDefaultSDK().gameSaves.getLatestStructuredData(gameId),
12296
+ sync: (gameId, options) => getDefaultSDK().gameSaves.sync(gameId, options),
12297
+ };
12227
12298
  const cloud = {
12228
12299
  leaderboard: {
12229
12300
  submit: (options) => getDefaultSDK().cloud.leaderboard.submit(options),
@@ -12255,9 +12326,9 @@ const environment = {
12255
12326
  };
12256
12327
  /** 默认 SDK 的工作区卡片模块。 */
12257
12328
  const workspaceCards = {
12258
- requestRefresh: options => getDefaultSDK().workspaceCards.requestRefresh(options),
12329
+ requestRefresh: (options) => getDefaultSDK().workspaceCards.requestRefresh(options),
12259
12330
  getLaunchContext: () => getDefaultSDK().workspaceCards.getLaunchContext(),
12260
- onLaunchContextChange: listener => getDefaultSDK().workspaceCards.onLaunchContextChange(listener),
12331
+ onLaunchContextChange: (listener) => getDefaultSDK().workspaceCards.onLaunchContextChange(listener),
12261
12332
  };
12262
12333
 
12263
12334
  const hbSDK = {
@@ -12278,6 +12349,7 @@ const hbSDK = {
12278
12349
  environment,
12279
12350
  navigation,
12280
12351
  cloud,
12352
+ gameSaves,
12281
12353
  companion,
12282
12354
  workspaceCards,
12283
12355
  };
@@ -12292,6 +12364,7 @@ exports.default = hbSDK;
12292
12364
  exports.device = device;
12293
12365
  exports.environment = environment;
12294
12366
  exports.files = files;
12367
+ exports.gameSaves = gameSaves;
12295
12368
  exports.getHandshakeState = getHandshakeState;
12296
12369
  exports.media = media;
12297
12370
  exports.navigation = navigation;
package/dist/index.esm.js CHANGED
@@ -411,6 +411,10 @@ const COMPANION_SESSION_OWNERSHIP_LOST_EVENT = 'companion.session.ownershipLost'
411
411
  const WORKSPACE_CARDS_REQUEST_REFRESH_METHOD = 'workspaceCards.requestRefresh';
412
412
  const AUTH_GET_ACCOUNT_STATE_METHOD = 'auth.getAccountState';
413
413
  const AUTH_LOGIN_METHOD = 'auth.login';
414
+ const GAME_SAVES_LIST_METHOD = 'gameSaves.list';
415
+ const GAME_SAVES_SYNC_METHOD = 'gameSaves.sync';
416
+ const GAME_SAVES_GET_FILE_METHOD = 'gameSaves.getFile';
417
+ const GAME_SAVES_READ_PARSED_DATA_METHOD = 'gameSaves.readParsedData';
414
418
  const USER_GET_INFO_METHOD = 'user.getInfo';
415
419
  const USER_REVOKE_AUTHORIZATION_METHOD = 'user.revokeAuthorization';
416
420
  const USER_GET_STEAM_GAME_LIST_METHOD = 'user.getSteamGameList';
@@ -836,7 +840,9 @@ function isMiniProgramDirectoryRef(value) {
836
840
  if (isNonEmptyString$1(value.handleId)) {
837
841
  return hasOnlyKeys(value, ['kind', 'handleId']);
838
842
  }
839
- return (isMiniProgramPathRootRef(value.root) && (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
843
+ return (isMiniProgramPathRootRef(value.root) &&
844
+ (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) &&
845
+ hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
840
846
  }
841
847
  /**
842
848
  * 判断未知值是否具有文件 descriptor 的最低 wire 结构。
@@ -1254,6 +1260,7 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
1254
1260
  'share',
1255
1261
  'storage',
1256
1262
  'cloud_storage',
1263
+ 'gameSaves',
1257
1264
  'filesystem',
1258
1265
  'media',
1259
1266
  'clipboard',
@@ -7481,7 +7488,7 @@ function createMessageId() {
7481
7488
  /** 构建时替换为当前发布包的实际版本。 */
7482
7489
  const HB_SDK_VERSION = typeof undefined === 'string'
7483
7490
  ? undefined
7484
- : '0.9.4-alpha.5';
7491
+ : '0.9.4';
7485
7492
 
7486
7493
  const RUNTIME_MODES = new Set(['production', 'preview', 'development', 'unknown']);
7487
7494
  const OPERATING_SYSTEM_NAMES = new Set(['android', 'ios', 'ohos', 'windows', 'macos', 'linux', 'unknown']);
@@ -8470,6 +8477,61 @@ function isMiniProgramFileSystemValue(value) {
8470
8477
  return !!value && typeof value === 'object' && brandedFileSystemValues.has(value);
8471
8478
  }
8472
8479
 
8480
+ function createGameSavesModule(requester) {
8481
+ return {
8482
+ async list(gameId) {
8483
+ const payload = { gameId };
8484
+ const result = await requester.request(GAME_SAVES_LIST_METHOD, payload);
8485
+ const accountId = result.accountId;
8486
+ return result.saves.map((save) => {
8487
+ const saveId = save.saveId;
8488
+ return {
8489
+ ...save,
8490
+ files: save.files.map((file) => {
8491
+ const fileId = file.fileId;
8492
+ return Object.freeze({
8493
+ ...file,
8494
+ async downloadFile({ signal } = {}) {
8495
+ const descriptor = await requester.requestOperation(GAME_SAVES_GET_FILE_METHOD, { gameId, accountId, saveId, fileId }, {
8496
+ ...(signal ? { signal } : {}),
8497
+ createAbortError: () => createSDKError('DOWNLOAD_CANCELLED', '存档下载已取消'),
8498
+ });
8499
+ if (!descriptor || descriptor.mode !== 'read')
8500
+ throw createSDKError('INVALID_RESPONSE', '存档必须为只读文件');
8501
+ return getFileHandleRegistry(requester).createFile(descriptor);
8502
+ },
8503
+ });
8504
+ }),
8505
+ };
8506
+ });
8507
+ },
8508
+ async getLatestStructuredData(gameId) {
8509
+ const result = await requester.request(GAME_SAVES_READ_PARSED_DATA_METHOD, { gameId });
8510
+ // 旧宿主的 overview 不能作为完整数据交付;只返回公开字段。
8511
+ if (result?.status === 'ready' && result.data && typeof result.data === 'object' && !Array.isArray(result.data)) {
8512
+ return { status: 'ready', data: result.data };
8513
+ }
8514
+ if (result?.status === 'empty' || result?.status === 'unsupported')
8515
+ return { status: result.status };
8516
+ if (result?.status === 'failed' && typeof result.error?.code === 'string' && typeof result.error?.message === 'string') {
8517
+ return { status: 'failed', error: { code: result.error.code, message: result.error.message } };
8518
+ }
8519
+ throw createSDKError('INVALID_RESPONSE', '结构化数据响应不合法');
8520
+ },
8521
+ async sync(gameId, options = {}) {
8522
+ const { signal } = options;
8523
+ const payload = { gameId };
8524
+ const result = await requester.requestOperation(GAME_SAVES_SYNC_METHOD, payload, {
8525
+ ...(signal ? { signal } : {}),
8526
+ createAbortError: () => createSDKError('REQUEST_CANCELLED', '已停止等待存档同步'),
8527
+ });
8528
+ if (result?.state !== 'succeeded')
8529
+ throw createSDKError('INVALID_RESPONSE', '同步完成响应不合法');
8530
+ // 成功不返回内部任务阶段;旧宿主的完成响应仍需校验。
8531
+ },
8532
+ };
8533
+ }
8534
+
8473
8535
  function normalizeAlias(alias) {
8474
8536
  if (typeof alias !== 'string' || !COMPANION_ALIAS_PATTERN.test(alias)) {
8475
8537
  throw createSDKError('INVALID_PARAMS', 'alias 必须是规范的 Companion alias');
@@ -11636,6 +11698,8 @@ class MiniProgramSDK {
11636
11698
  navigation;
11637
11699
  /** 云端数据相关开放能力。 */
11638
11700
  cloud;
11701
+ /** 查询、同步并读取当前用户的 Steam 游戏存档。 */
11702
+ gameSaves;
11639
11703
  /** 受管桌面程序能力。 */
11640
11704
  companion;
11641
11705
  /** 当前实例的环境信息。 */
@@ -11658,6 +11722,7 @@ class MiniProgramSDK {
11658
11722
  this.device = createDeviceModule(this.client);
11659
11723
  this.navigation = createNavigationModule(this.client);
11660
11724
  this.cloud = createCloudModule(this.client);
11725
+ this.gameSaves = createGameSavesModule(this.client);
11661
11726
  this.companion = createCompanionModule(this.client);
11662
11727
  this.environment = createEnvironmentModule(this.client);
11663
11728
  }
@@ -12220,6 +12285,12 @@ const navigation = {
12220
12285
  openAppPage: (options) => getDefaultSDK().navigation.openAppPage(options),
12221
12286
  };
12222
12287
  /** 默认 SDK 实例的 cloud 模块。 */
12288
+ /** 当前用户的游戏存档能力。 */
12289
+ const gameSaves = {
12290
+ list: (gameId) => getDefaultSDK().gameSaves.list(gameId),
12291
+ getLatestStructuredData: (gameId) => getDefaultSDK().gameSaves.getLatestStructuredData(gameId),
12292
+ sync: (gameId, options) => getDefaultSDK().gameSaves.sync(gameId, options),
12293
+ };
12223
12294
  const cloud = {
12224
12295
  leaderboard: {
12225
12296
  submit: (options) => getDefaultSDK().cloud.leaderboard.submit(options),
@@ -12251,9 +12322,9 @@ const environment = {
12251
12322
  };
12252
12323
  /** 默认 SDK 的工作区卡片模块。 */
12253
12324
  const workspaceCards = {
12254
- requestRefresh: options => getDefaultSDK().workspaceCards.requestRefresh(options),
12325
+ requestRefresh: (options) => getDefaultSDK().workspaceCards.requestRefresh(options),
12255
12326
  getLaunchContext: () => getDefaultSDK().workspaceCards.getLaunchContext(),
12256
- onLaunchContextChange: listener => getDefaultSDK().workspaceCards.onLaunchContextChange(listener),
12327
+ onLaunchContextChange: (listener) => getDefaultSDK().workspaceCards.onLaunchContextChange(listener),
12257
12328
  };
12258
12329
 
12259
12330
  const hbSDK = {
@@ -12274,8 +12345,9 @@ const hbSDK = {
12274
12345
  environment,
12275
12346
  navigation,
12276
12347
  cloud,
12348
+ gameSaves,
12277
12349
  companion,
12278
12350
  workspaceCards,
12279
12351
  };
12280
12352
 
12281
- export { HbMiniProgramNetworkError, HbMiniProgramSDKError, USER_INFO_AUTHORIZATION_SCOPES, auth, cloud, companion, hbSDK as default, device, environment, files, getHandshakeState, media, navigation, network, off, on, onHandshakeStateChange, share, storage, ui, user, viewport, workspaceCards };
12353
+ export { HbMiniProgramNetworkError, HbMiniProgramSDKError, USER_INFO_AUTHORIZATION_SCOPES, auth, cloud, companion, hbSDK as default, device, environment, files, gameSaves, getHandshakeState, media, navigation, network, off, on, onHandshakeStateChange, share, storage, ui, user, viewport, workspaceCards };
@@ -13,6 +13,7 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
13
13
  'share',
14
14
  'storage',
15
15
  'cloud_storage',
16
+ 'gameSaves',
16
17
  'filesystem',
17
18
  'media',
18
19
  'clipboard',
@@ -23,6 +24,16 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
23
24
  'workspaceCards',
24
25
  ];
25
26
  const MINI_PROGRAM_PERMISSION_CATALOG = [
27
+ {
28
+ key: 'gameSaves',
29
+ name: '游戏存档',
30
+ description: '获取和同步当前用户指定游戏的 Steam 云存档,并读取存档文件,无需单独弹窗确认。',
31
+ access: 'declaration',
32
+ risk: 'high',
33
+ config: {},
34
+ methods: ['gameSaves.list', 'gameSaves.sync', 'gameSaves.getFile', 'gameSaves.readParsedData'],
35
+ conditions: ['需要用户明确授权、有效 Steam 登录和支持文件读取的宿主;可按需读取受支持游戏的已有解析概览,不触发解析。'],
36
+ },
26
37
  {
27
38
  key: 'userInfo',
28
39
  name: '用户信息',
@@ -188,9 +199,12 @@ const MINI_PROGRAM_PERMISSION_CATALOG = [
188
199
  conditions: ['最高危险权限:批准后该入口可执行任意协议,并绕过其他 SDK 能力权限及专用授权流程。'],
189
200
  },
190
201
  {
191
- key: 'workspaceCards', name: '工作区卡片',
202
+ key: 'workspaceCards',
203
+ name: '工作区卡片',
192
204
  description: '在已绑定游戏的桌面工作区展示受审核卡片。',
193
- access: 'platform-approval', risk: 'high', config: {},
205
+ access: 'platform-approval',
206
+ risk: 'high',
207
+ config: {},
194
208
  methods: ['workspaceCards.requestRefresh'],
195
209
  conditions: ['需平台批准、Host 支持与有效执行租约;不隐式授予网络或存储权限。'],
196
210
  },
@@ -11,6 +11,7 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
11
11
  'share',
12
12
  'storage',
13
13
  'cloud_storage',
14
+ 'gameSaves',
14
15
  'filesystem',
15
16
  'media',
16
17
  'clipboard',
@@ -21,6 +22,16 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
21
22
  'workspaceCards',
22
23
  ];
23
24
  const MINI_PROGRAM_PERMISSION_CATALOG = [
25
+ {
26
+ key: 'gameSaves',
27
+ name: '游戏存档',
28
+ description: '获取和同步当前用户指定游戏的 Steam 云存档,并读取存档文件,无需单独弹窗确认。',
29
+ access: 'declaration',
30
+ risk: 'high',
31
+ config: {},
32
+ methods: ['gameSaves.list', 'gameSaves.sync', 'gameSaves.getFile', 'gameSaves.readParsedData'],
33
+ conditions: ['需要用户明确授权、有效 Steam 登录和支持文件读取的宿主;可按需读取受支持游戏的已有解析概览,不触发解析。'],
34
+ },
24
35
  {
25
36
  key: 'userInfo',
26
37
  name: '用户信息',
@@ -186,9 +197,12 @@ const MINI_PROGRAM_PERMISSION_CATALOG = [
186
197
  conditions: ['最高危险权限:批准后该入口可执行任意协议,并绕过其他 SDK 能力权限及专用授权流程。'],
187
198
  },
188
199
  {
189
- key: 'workspaceCards', name: '工作区卡片',
200
+ key: 'workspaceCards',
201
+ name: '工作区卡片',
190
202
  description: '在已绑定游戏的桌面工作区展示受审核卡片。',
191
- access: 'platform-approval', risk: 'high', config: {},
203
+ access: 'platform-approval',
204
+ risk: 'high',
205
+ config: {},
192
206
  methods: ['workspaceCards.requestRefresh'],
193
207
  conditions: ['需平台批准、Host 支持与有效执行租约;不隐式授予网络或存储权限。'],
194
208
  },
@@ -34,6 +34,10 @@ const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress';
34
34
  const WORKSPACE_CARDS_REQUEST_REFRESH_METHOD = 'workspaceCards.requestRefresh';
35
35
  const AUTH_GET_ACCOUNT_STATE_METHOD = 'auth.getAccountState';
36
36
  const AUTH_LOGIN_METHOD = 'auth.login';
37
+ const GAME_SAVES_LIST_METHOD = 'gameSaves.list';
38
+ const GAME_SAVES_SYNC_METHOD = 'gameSaves.sync';
39
+ const GAME_SAVES_GET_FILE_METHOD = 'gameSaves.getFile';
40
+ const GAME_SAVES_READ_PARSED_DATA_METHOD = 'gameSaves.readParsedData';
37
41
  const USER_GET_INFO_METHOD = 'user.getInfo';
38
42
  const USER_REVOKE_AUTHORIZATION_METHOD = 'user.revokeAuthorization';
39
43
  const USER_GET_STEAM_GAME_LIST_METHOD = 'user.getSteamGameList';
@@ -108,10 +112,19 @@ const COMPANION_SHOW_NOTIFICATION_METHOD = 'companion.showNotification';
108
112
  * 仅表示无需 Manifest 权限声明,不表示绕过参数校验、Host 能力、可信手势或业务策略。
109
113
  */
110
114
  const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
115
+ ...[GAME_SAVES_LIST_METHOD, GAME_SAVES_SYNC_METHOD, GAME_SAVES_GET_FILE_METHOD, GAME_SAVES_READ_PARSED_DATA_METHOD].map((method) => ({
116
+ method,
117
+ module: 'gameSaves',
118
+ capability: method,
119
+ requirement: { kind: 'all', permissions: ['gameSaves'] },
120
+ risk: 'high',
121
+ })),
111
122
  {
112
- method: WORKSPACE_CARDS_REQUEST_REFRESH_METHOD, module: 'workspaceCards',
123
+ method: WORKSPACE_CARDS_REQUEST_REFRESH_METHOD,
124
+ module: 'workspaceCards',
113
125
  capability: WORKSPACE_CARDS_REQUEST_REFRESH_METHOD,
114
- requirement: { kind: 'all', permissions: ['workspaceCards'] }, risk: 'high',
126
+ requirement: { kind: 'all', permissions: ['workspaceCards'] },
127
+ risk: 'high',
115
128
  },
116
129
  {
117
130
  method: AUTH_GET_ACCOUNT_STATE_METHOD,
@@ -807,7 +820,9 @@ function isMiniProgramDirectoryRef(value) {
807
820
  if (isNonEmptyString$1(value.handleId)) {
808
821
  return hasOnlyKeys(value, ['kind', 'handleId']);
809
822
  }
810
- return (isMiniProgramPathRootRef(value.root) && (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
823
+ return (isMiniProgramPathRootRef(value.root) &&
824
+ (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) &&
825
+ hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
811
826
  }
812
827
  /**
813
828
  * 判断未知值是否具有文件 descriptor 的最低 wire 结构。
@@ -1410,6 +1425,7 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
1410
1425
  'share',
1411
1426
  'storage',
1412
1427
  'cloud_storage',
1428
+ 'gameSaves',
1413
1429
  'filesystem',
1414
1430
  'media',
1415
1431
  'clipboard',
@@ -32,6 +32,10 @@ const MINI_PROGRAM_OPERATION_PROGRESS_METHOD = 'operation.progress';
32
32
  const WORKSPACE_CARDS_REQUEST_REFRESH_METHOD = 'workspaceCards.requestRefresh';
33
33
  const AUTH_GET_ACCOUNT_STATE_METHOD = 'auth.getAccountState';
34
34
  const AUTH_LOGIN_METHOD = 'auth.login';
35
+ const GAME_SAVES_LIST_METHOD = 'gameSaves.list';
36
+ const GAME_SAVES_SYNC_METHOD = 'gameSaves.sync';
37
+ const GAME_SAVES_GET_FILE_METHOD = 'gameSaves.getFile';
38
+ const GAME_SAVES_READ_PARSED_DATA_METHOD = 'gameSaves.readParsedData';
35
39
  const USER_GET_INFO_METHOD = 'user.getInfo';
36
40
  const USER_REVOKE_AUTHORIZATION_METHOD = 'user.revokeAuthorization';
37
41
  const USER_GET_STEAM_GAME_LIST_METHOD = 'user.getSteamGameList';
@@ -106,10 +110,19 @@ const COMPANION_SHOW_NOTIFICATION_METHOD = 'companion.showNotification';
106
110
  * 仅表示无需 Manifest 权限声明,不表示绕过参数校验、Host 能力、可信手势或业务策略。
107
111
  */
108
112
  const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
113
+ ...[GAME_SAVES_LIST_METHOD, GAME_SAVES_SYNC_METHOD, GAME_SAVES_GET_FILE_METHOD, GAME_SAVES_READ_PARSED_DATA_METHOD].map((method) => ({
114
+ method,
115
+ module: 'gameSaves',
116
+ capability: method,
117
+ requirement: { kind: 'all', permissions: ['gameSaves'] },
118
+ risk: 'high',
119
+ })),
109
120
  {
110
- method: WORKSPACE_CARDS_REQUEST_REFRESH_METHOD, module: 'workspaceCards',
121
+ method: WORKSPACE_CARDS_REQUEST_REFRESH_METHOD,
122
+ module: 'workspaceCards',
111
123
  capability: WORKSPACE_CARDS_REQUEST_REFRESH_METHOD,
112
- requirement: { kind: 'all', permissions: ['workspaceCards'] }, risk: 'high',
124
+ requirement: { kind: 'all', permissions: ['workspaceCards'] },
125
+ risk: 'high',
113
126
  },
114
127
  {
115
128
  method: AUTH_GET_ACCOUNT_STATE_METHOD,
@@ -805,7 +818,9 @@ function isMiniProgramDirectoryRef(value) {
805
818
  if (isNonEmptyString$1(value.handleId)) {
806
819
  return hasOnlyKeys(value, ['kind', 'handleId']);
807
820
  }
808
- return (isMiniProgramPathRootRef(value.root) && (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) && hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
821
+ return (isMiniProgramPathRootRef(value.root) &&
822
+ (value.relativePath === '.' || isMiniProgramRelativePath(value.relativePath)) &&
823
+ hasOnlyKeys(value, ['kind', 'root', 'relativePath']));
809
824
  }
810
825
  /**
811
826
  * 判断未知值是否具有文件 descriptor 的最低 wire 结构。
@@ -1408,6 +1423,7 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
1408
1423
  'share',
1409
1424
  'storage',
1410
1425
  'cloud_storage',
1426
+ 'gameSaves',
1411
1427
  'filesystem',
1412
1428
  'media',
1413
1429
  'clipboard',
package/dist/vite.cjs.js CHANGED
@@ -63,6 +63,7 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
63
63
  'share',
64
64
  'storage',
65
65
  'cloud_storage',
66
+ 'gameSaves',
66
67
  'filesystem',
67
68
  'media',
68
69
  'clipboard',
@@ -73,6 +74,16 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
73
74
  'workspaceCards',
74
75
  ];
75
76
  const MINI_PROGRAM_PERMISSION_CATALOG = [
77
+ {
78
+ key: 'gameSaves',
79
+ name: '游戏存档',
80
+ description: '获取和同步当前用户指定游戏的 Steam 云存档,并读取存档文件,无需单独弹窗确认。',
81
+ access: 'declaration',
82
+ risk: 'high',
83
+ config: {},
84
+ methods: ['gameSaves.list', 'gameSaves.sync', 'gameSaves.getFile', 'gameSaves.readParsedData'],
85
+ conditions: ['需要用户明确授权、有效 Steam 登录和支持文件读取的宿主;可按需读取受支持游戏的已有解析概览,不触发解析。'],
86
+ },
76
87
  {
77
88
  key: 'userInfo',
78
89
  name: '用户信息',
@@ -238,9 +249,12 @@ const MINI_PROGRAM_PERMISSION_CATALOG = [
238
249
  conditions: ['最高危险权限:批准后该入口可执行任意协议,并绕过其他 SDK 能力权限及专用授权流程。'],
239
250
  },
240
251
  {
241
- key: 'workspaceCards', name: '工作区卡片',
252
+ key: 'workspaceCards',
253
+ name: '工作区卡片',
242
254
  description: '在已绑定游戏的桌面工作区展示受审核卡片。',
243
- access: 'platform-approval', risk: 'high', config: {},
255
+ access: 'platform-approval',
256
+ risk: 'high',
257
+ config: {},
244
258
  methods: ['workspaceCards.requestRefresh'],
245
259
  conditions: ['需平台批准、Host 支持与有效执行租约;不隐式授予网络或存储权限。'],
246
260
  },
@@ -10315,7 +10329,7 @@ async function ensureBasicInfoDirectory(rootPath, relative) {
10315
10329
  /** 构建时替换为当前发布包的实际版本。 */
10316
10330
  const HB_SDK_VERSION = typeof undefined === 'string'
10317
10331
  ? undefined
10318
- : '0.9.4-alpha.5';
10332
+ : '0.9.4';
10319
10333
 
10320
10334
  /**
10321
10335
  * iframe 与调试台页面的开发期 console 捕获转发。
package/dist/vite.esm.js CHANGED
@@ -60,6 +60,7 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
60
60
  'share',
61
61
  'storage',
62
62
  'cloud_storage',
63
+ 'gameSaves',
63
64
  'filesystem',
64
65
  'media',
65
66
  'clipboard',
@@ -70,6 +71,16 @@ const MINI_PROGRAM_PERMISSION_KEYS = [
70
71
  'workspaceCards',
71
72
  ];
72
73
  const MINI_PROGRAM_PERMISSION_CATALOG = [
74
+ {
75
+ key: 'gameSaves',
76
+ name: '游戏存档',
77
+ description: '获取和同步当前用户指定游戏的 Steam 云存档,并读取存档文件,无需单独弹窗确认。',
78
+ access: 'declaration',
79
+ risk: 'high',
80
+ config: {},
81
+ methods: ['gameSaves.list', 'gameSaves.sync', 'gameSaves.getFile', 'gameSaves.readParsedData'],
82
+ conditions: ['需要用户明确授权、有效 Steam 登录和支持文件读取的宿主;可按需读取受支持游戏的已有解析概览,不触发解析。'],
83
+ },
73
84
  {
74
85
  key: 'userInfo',
75
86
  name: '用户信息',
@@ -235,9 +246,12 @@ const MINI_PROGRAM_PERMISSION_CATALOG = [
235
246
  conditions: ['最高危险权限:批准后该入口可执行任意协议,并绕过其他 SDK 能力权限及专用授权流程。'],
236
247
  },
237
248
  {
238
- key: 'workspaceCards', name: '工作区卡片',
249
+ key: 'workspaceCards',
250
+ name: '工作区卡片',
239
251
  description: '在已绑定游戏的桌面工作区展示受审核卡片。',
240
- access: 'platform-approval', risk: 'high', config: {},
252
+ access: 'platform-approval',
253
+ risk: 'high',
254
+ config: {},
241
255
  methods: ['workspaceCards.requestRefresh'],
242
256
  conditions: ['需平台批准、Host 支持与有效执行租约;不隐式授予网络或存储权限。'],
243
257
  },
@@ -10312,7 +10326,7 @@ async function ensureBasicInfoDirectory(rootPath, relative) {
10312
10326
  /** 构建时替换为当前发布包的实际版本。 */
10313
10327
  const HB_SDK_VERSION = typeof undefined === 'string'
10314
10328
  ? undefined
10315
- : '0.9.4-alpha.5';
10329
+ : '0.9.4';
10316
10330
 
10317
10331
  /**
10318
10332
  * iframe 与调试台页面的开发期 console 捕获转发。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heybox/hb-sdk",
3
- "version": "0.9.4-alpha.5",
3
+ "version": "0.9.4",
4
4
  "sideEffects": [
5
5
  "./src/index.ts",
6
6
  "./src/core/singleton.ts",
@@ -76,7 +76,7 @@
76
76
  "undici": "^7.28.0",
77
77
  "ws": "^8.18.0",
78
78
  "sharp": "^0.34.5",
79
- "@heybox/hb-sdk-protocol": "0.9.4-alpha.5"
79
+ "@heybox/hb-sdk-protocol": "0.9.4"
80
80
  },
81
81
  "peerDependencies": {
82
82
  "vite": ">=5"
@@ -128,13 +128,13 @@
128
128
  "vitest": "^3.2.4",
129
129
  "@ai-desktop/view-contract": "file:../hb-sdk-protocol/vendor/view-contract-2.2.2-6ac49bbf6410.tgz",
130
130
  "rollup-plugin-dts": "6.4.0",
131
- "@heybox-domain/heybox-vue3-ui": "~0.1.0",
132
131
  "@heybox-domain/heybox-theme": "~0.1.0",
132
+ "@heybox/hb-sdk-runtime": "~0.9.4",
133
+ "@heybox-domain/heybox-vue3-ui": "~0.1.0",
133
134
  "@heybox/hb-api": "~1.28.19",
134
- "@heybox/hb-sdk-runtime": "~0.9.4-alpha.5",
135
135
  "@heybox/runtime": "~0.2.1",
136
- "@heybox/runtime-policy": "~0.2.1",
137
- "@heybox/runtime-transport-fetch": "~0.2.1"
136
+ "@heybox/runtime-transport-fetch": "~0.2.1",
137
+ "@heybox/runtime-policy": "~0.2.1"
138
138
  },
139
139
  "publishConfig": {
140
140
  "registry": "https://registry.npmjs.org/",
package/skill/skill.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "hb-sdk",
3
- "skillVersion": "0.9.4-alpha.5+skill.d0d502673711",
3
+ "skillVersion": "0.9.4+skill.d0d502673711",
4
4
  "sdk": {
5
5
  "package": "@heybox/hb-sdk",
6
- "version": "0.9.4-alpha.5",
7
- "compatibility": "0.9.4-alpha.5"
6
+ "version": "0.9.4",
7
+ "compatibility": "0.9.4"
8
8
  },
9
9
  "distribution": {
10
10
  "type": "npm",
11
11
  "package": "@heybox/hb-sdk",
12
- "version": "0.9.4-alpha.5",
12
+ "version": "0.9.4",
13
13
  "path": "skill"
14
14
  },
15
15
  "integrity": "sha256-d0d502673711f5d077ee62e657749125788e396d5203894b7077dfe866fd2990"