@heybox/hb-sdk 0.8.3-alpha.3 → 0.8.3-alpha.5

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/CHANGELOG.md +26 -1
  2. package/README.md +8 -6
  3. package/dist/cli-chunks/{build-Dydd4Rzd.cjs → build-8dIKgG1v.cjs} +5 -5
  4. package/dist/cli-chunks/{context-DcuY0bGO.cjs → context-DSNBFwsG.cjs} +35 -8
  5. package/dist/cli-chunks/{create-DKVTlorM.cjs → create-DmNfBoq7.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-DbrUeTqi.cjs → dev-C15G1TxE.cjs} +194 -73
  7. package/dist/cli-chunks/{doctor-D184dg_h.cjs → doctor-r6m7pK1R.cjs} +1 -1
  8. package/dist/cli-chunks/{index-B_HjHK3d.cjs → index-B6lVqj5W.cjs} +15 -15
  9. package/dist/cli-chunks/{index-BG8JJ9pA.cjs → index-CsQ1g-cL.cjs} +2 -2
  10. package/dist/cli-chunks/{index.esm-42g2R7qD.cjs → index.esm-DG1EUOV-.cjs} +7 -7
  11. package/dist/cli-chunks/{login-D3MBcgNb.cjs → login-DOUitUrc.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-CUh6Dsv5.cjs → project-vite-C-YGhyHJ.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-EBGDOJL3.cjs → remote-i3QX7A-u.cjs} +36 -9
  14. package/dist/cli-chunks/{runtime-gate-CE1ln9xc.cjs → runtime-gate-hlz0xgg8.cjs} +1 -1
  15. package/dist/cli-chunks/{runtime-permission-env-CVt4QPbX.cjs → runtime-permission-env-DNXaBBHz.cjs} +119 -6
  16. package/dist/cli-chunks/{session-CKuEz-ih.cjs → session-u4BpZqwE.cjs} +1 -1
  17. package/dist/cli-chunks/{skill-oLEQS_U6.cjs → skill-DAOCq0eg.cjs} +2 -2
  18. package/dist/cli-chunks/{version-BNNxfn8M.cjs → version-MrIy1W5p.cjs} +1 -1
  19. package/dist/cli.cjs +1 -1
  20. package/dist/devtools/browser-dev-host/assets/browser-dev-host-CJDZz8aw.js +101 -0
  21. package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-EnOYLhEx.js → desktop-app-launch-BbRQb08Y.js} +3 -3
  22. package/dist/devtools/browser-dev-host/assets/{index-8YA6OLi7.js → index-8N4og21f.js} +4 -4
  23. package/dist/devtools/browser-dev-host/assets/index-BrXEMo2-.css +1 -0
  24. package/dist/devtools/browser-dev-host/index.html +3 -3
  25. package/dist/index.cjs.js +16 -16
  26. package/dist/index.esm.js +16 -16
  27. package/dist/protocol.cjs.js +20 -20
  28. package/dist/protocol.esm.js +20 -20
  29. package/dist/vite.cjs.js +3 -3
  30. package/dist/vite.esm.js +3 -3
  31. package/docs/runtime-host-migration.md +6 -4
  32. package/package.json +5 -5
  33. package/skill/skill.json +4 -4
  34. package/types/protocol/dev-session.d.ts +13 -2
  35. package/dist/devtools/browser-dev-host/assets/browser-dev-host-u03IcCCS.js +0 -101
  36. package/dist/devtools/browser-dev-host/assets/index-D-cRoNV5.css +0 -1
@@ -442,7 +442,7 @@ const MINI_PROGRAM_PROTOCOL_CAPABILITIES = [
442
442
  * @see [parseMiniProgramRuntimePermissions](/reference/symbols/protocol/functions/parseMiniProgramRuntimePermissions) Runtime 权限快照解析器。
443
443
  */
444
444
  function isMiniProgramBridgeMessage(value) {
445
- if (!isRecord$2(value))
445
+ if (!isRecord$3(value))
446
446
  return false;
447
447
  if (value.namespace !== MINI_PROGRAM_MESSAGE_NAMESPACE || (value.version !== 1 && value.version !== 2) || !isNonEmptyString$1(value.nonce)) {
448
448
  return false;
@@ -592,7 +592,7 @@ function isMiniProgramRelativePath(value) {
592
592
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 可作为 derived path root 的目录代理。
593
593
  */
594
594
  function isMiniProgramPathRootRef(value) {
595
- if (!isRecord$2(value))
595
+ if (!isRecord$3(value))
596
596
  return false;
597
597
  if (value.kind === 'sandbox')
598
598
  return hasOnlyKeys(value, ['kind']);
@@ -658,7 +658,7 @@ function isMiniProgramPathRootRef(value) {
658
658
  * @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 使用文件引用的公开 I/O 代理。
659
659
  */
660
660
  function isMiniProgramFileRef(value) {
661
- if (!isRecord$2(value) || value.kind !== 'file')
661
+ if (!isRecord$3(value) || value.kind !== 'file')
662
662
  return false;
663
663
  if (isNonEmptyString$1(value.handleId)) {
664
664
  return hasOnlyKeys(value, ['kind', 'handleId']);
@@ -725,7 +725,7 @@ function isMiniProgramFileRef(value) {
725
725
  * @see [DirectoryHandle](/reference/symbols/root/interfaces/DirectoryHandle) 使用目录引用的公开路径操作代理。
726
726
  */
727
727
  function isMiniProgramDirectoryRef(value) {
728
- if (!isRecord$2(value) || value.kind !== 'directory')
728
+ if (!isRecord$3(value) || value.kind !== 'directory')
729
729
  return false;
730
730
  if (isNonEmptyString$1(value.handleId)) {
731
731
  return hasOnlyKeys(value, ['kind', 'handleId']);
@@ -799,7 +799,7 @@ function isMiniProgramDirectoryRef(value) {
799
799
  * @see [SaveFileResult](/reference/symbols/protocol/types/SaveFileResult) save picker 的 direct-ref 文件结果。
800
800
  */
801
801
  function isMiniProgramFileDescriptor(value) {
802
- return (isRecord$2(value) &&
802
+ return (isRecord$3(value) &&
803
803
  value.kind === 'file' &&
804
804
  isNonEmptyString$1(value.name) &&
805
805
  isFileMode(value.mode) &&
@@ -869,7 +869,7 @@ function isMiniProgramFileDescriptor(value) {
869
869
  * @see [PickDirectoryResult](/reference/symbols/protocol/types/PickDirectoryResult) picker 的 direct-ref 返回契约。
870
870
  */
871
871
  function isMiniProgramDirectoryDescriptor(value) {
872
- return (isRecord$2(value) &&
872
+ return (isRecord$3(value) &&
873
873
  value.kind === 'directory' &&
874
874
  isNonEmptyString$1(value.name) &&
875
875
  isFileMode(value.mode) &&
@@ -1048,7 +1048,7 @@ function isMiniProgramByteArray(value) {
1048
1048
  * @see [FileHandle](/reference/symbols/root/interfaces/FileHandle) 提供 `stat()` 的当前 session 文件代理。
1049
1049
  */
1050
1050
  function isMiniProgramFileStat(value) {
1051
- return (isRecord$2(value) &&
1051
+ return (isRecord$3(value) &&
1052
1052
  value.kind === 'file' &&
1053
1053
  isNonNegativeSafeInteger(value.size) &&
1054
1054
  (value.modifiedAt === undefined || isNonNegativeFiniteNumber(value.modifiedAt)) &&
@@ -1108,7 +1108,7 @@ function isMiniProgramFileStat(value) {
1108
1108
  * @see [isMiniProgramBridgeMessage](/reference/symbols/protocol/functions/isMiniProgramBridgeMessage) operation progress envelope 的最低校验。
1109
1109
  */
1110
1110
  function isMiniProgramDownloadProgressPayload(value) {
1111
- if (!isRecord$2(value) ||
1111
+ if (!isRecord$3(value) ||
1112
1112
  !isNonNegativeSafeInteger(value.loaded) ||
1113
1113
  typeof value.lengthComputable !== 'boolean' ||
1114
1114
  !hasOnlyKeys(value, ['loaded', 'total', 'lengthComputable'])) {
@@ -1119,7 +1119,7 @@ function isMiniProgramDownloadProgressPayload(value) {
1119
1119
  return isNonNegativeSafeInteger(value.total) && value.loaded <= value.total;
1120
1120
  }
1121
1121
  function isMiniProgramCompanionPrepareProgress(value) {
1122
- if (!isRecord$2(value))
1122
+ if (!isRecord$3(value))
1123
1123
  return false;
1124
1124
  if (value.phase === 'downloading') {
1125
1125
  return (isNonNegativeSafeInteger(value.loaded) &&
@@ -1137,10 +1137,10 @@ function isMiniProgramOperationProgressPayload(value) {
1137
1137
  return isMiniProgramDownloadProgressPayload(value) || isMiniProgramCompanionPrepareProgress(value);
1138
1138
  }
1139
1139
  function isSDKHandshakePayload(value) {
1140
- return isRecord$2(value) && isNonEmptyString$1(value.href) && typeof value.userAgent === 'string' && isNonEmptyString$1(value.sdkVersion);
1140
+ return isRecord$3(value) && isNonEmptyString$1(value.href) && typeof value.userAgent === 'string' && isNonEmptyString$1(value.sdkVersion);
1141
1141
  }
1142
1142
  function isBridgeError(value) {
1143
- return isRecord$2(value) && isNonEmptyString$1(value.code) && typeof value.message === 'string';
1143
+ return isRecord$3(value) && isNonEmptyString$1(value.code) && typeof value.message === 'string';
1144
1144
  }
1145
1145
  function isFileMode(value) {
1146
1146
  return value === 'read' || value === 'readwrite';
@@ -1158,13 +1158,10 @@ function hasOnlyKeys(value, allowedKeys) {
1158
1158
  const allowed = new Set(allowedKeys);
1159
1159
  return Object.keys(value).every((key) => allowed.has(key));
1160
1160
  }
1161
- function isRecord$2(value) {
1161
+ function isRecord$3(value) {
1162
1162
  return typeof value === 'object' && value !== null && !Array.isArray(value);
1163
1163
  }
1164
1164
 
1165
- /** 当前用户信息与登录能力支持的完整 scope 目录(canonical 顺序)。 */
1166
- const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile', 'steam_account'];
1167
-
1168
1165
  const MINI_PROGRAM_PERMISSION_KEYS = [
1169
1166
  'userInfo',
1170
1167
  'steamLibrary',
@@ -1308,7 +1305,7 @@ function isManagedMiniProgramRuntimePermissionKey(key) {
1308
1305
  * @see {@link https://docs.xiaoheihe.cn/hb_sdk/guide/permissions | 权限声明}
1309
1306
  */
1310
1307
  function parseMiniProgramRuntimePermissions(snapshot) {
1311
- if (!isRecord(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
1308
+ if (!isRecord$2(snapshot) || snapshot.schema_version !== 1 || !Array.isArray(snapshot.entries)) {
1312
1309
  return { valid: false, permissions: {} };
1313
1310
  }
1314
1311
  if (snapshot.revision !== undefined && (typeof snapshot.revision !== 'number' || !Number.isInteger(snapshot.revision) || snapshot.revision < 0)) {
@@ -1317,7 +1314,7 @@ function parseMiniProgramRuntimePermissions(snapshot) {
1317
1314
  const seenKeys = new Set();
1318
1315
  const permissions = {};
1319
1316
  for (const rawEntry of snapshot.entries) {
1320
- if (!isRecord(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
1317
+ if (!isRecord$2(rawEntry) || typeof rawEntry.key !== 'string' || !rawEntry.key.trim()) {
1321
1318
  return { valid: false, permissions: {} };
1322
1319
  }
1323
1320
  const inputKey = rawEntry.key.trim();
@@ -1333,7 +1330,7 @@ function parseMiniProgramRuntimePermissions(snapshot) {
1333
1330
  }
1334
1331
  if (key === 'network') {
1335
1332
  const config = rawEntry.config;
1336
- if (!isRecord(config) || typeof config.useOfficialDomain !== 'boolean') {
1333
+ if (!isRecord$2(config) || typeof config.useOfficialDomain !== 'boolean') {
1337
1334
  return { valid: false, permissions: {} };
1338
1335
  }
1339
1336
  permissions[key] = {
@@ -1343,7 +1340,7 @@ function parseMiniProgramRuntimePermissions(snapshot) {
1343
1340
  };
1344
1341
  continue;
1345
1342
  }
1346
- if (rawEntry.config !== null && rawEntry.config !== undefined && (!isRecord(rawEntry.config) || Object.keys(rawEntry.config).length > 0)) {
1343
+ if (rawEntry.config !== null && rawEntry.config !== undefined && (!isRecord$2(rawEntry.config) || Object.keys(rawEntry.config).length > 0)) {
1347
1344
  return { valid: false, permissions: {} };
1348
1345
  }
1349
1346
  permissions[key] = {
@@ -1354,8 +1351,11 @@ function parseMiniProgramRuntimePermissions(snapshot) {
1354
1351
  }
1355
1352
  return { valid: true, permissions };
1356
1353
  }
1357
- function isRecord(value) {
1354
+ function isRecord$2(value) {
1358
1355
  return typeof value === 'object' && value !== null && !Array.isArray(value);
1359
1356
  }
1360
1357
 
1358
+ /** 当前用户信息与登录能力支持的完整 scope 目录(canonical 顺序)。 */
1359
+ const USER_INFO_AUTHORIZATION_SCOPES = ['identity', 'profile', 'steam_account'];
1360
+
1361
1361
  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_DISPLAY_METHOD, VIEWPORT_SET_NAVIGATION_BAR_STYLE_METHOD, isManagedMiniProgramRuntimePermissionKey, isMiniProgramBridgeMessage, isMiniProgramByteArray, isMiniProgramDirectoryDescriptor, isMiniProgramDirectoryRef, isMiniProgramDownloadProgressPayload, isMiniProgramFileDescriptor, isMiniProgramFileRef, isMiniProgramFileStat, isMiniProgramFileSystemEntityDescriptor, isMiniProgramPathRootRef, isMiniProgramRelativePath, parseMiniProgramRuntimePermissions };
package/dist/vite.cjs.js CHANGED
@@ -2948,7 +2948,7 @@ async function ensureBasicInfoDirectory(rootPath, relative) {
2948
2948
  /** 构建时替换为当前发布包的实际版本。 */
2949
2949
  const HB_SDK_VERSION = typeof undefined === 'string'
2950
2950
  ? undefined
2951
- : '0.8.3-alpha.3';
2951
+ : '0.8.3-alpha.5';
2952
2952
 
2953
2953
  /**
2954
2954
  * iframe 与调试台页面的开发期 console 捕获转发。
@@ -3377,8 +3377,6 @@ const MINI_PROGRAM_MESSAGE_VERSION = 2;
3377
3377
  * 并在 origin 可以固定且协议模式要求时校验 origin。
3378
3378
  */
3379
3379
  const MINI_PROGRAM_BRIDGE_NONCE_PARAM = 'hb_mini_bridge_nonce';
3380
- /** Companion alias 的跨构建、Runtime 与 Host 规范。 */
3381
- const COMPANION_ALIAS_PATTERN = /^[a-z][a-z0-9-]{0,31}$/;
3382
3380
 
3383
3381
  const MINI_PROGRAM_PERMISSION_KEYS = [
3384
3382
  'userInfo',
@@ -3529,6 +3527,8 @@ const MINI_PROGRAM_PERMISSION_CATALOG = [
3529
3527
  new Set(MINI_PROGRAM_PERMISSION_KEYS);
3530
3528
 
3531
3529
  new Set(MINI_PROGRAM_PERMISSION_KEYS);
3530
+ /** Companion alias 的跨构建、Runtime 与 Host 规范。 */
3531
+ const COMPANION_ALIAS_PATTERN = /^[a-z][a-z0-9-]{0,31}$/;
3532
3532
 
3533
3533
  const MINIAPP_PERMISSION_KEYS = MINI_PROGRAM_PERMISSION_KEYS;
3534
3534
  function parseMiniappPermissions(value, options) {
package/dist/vite.esm.js CHANGED
@@ -2945,7 +2945,7 @@ async function ensureBasicInfoDirectory(rootPath, relative) {
2945
2945
  /** 构建时替换为当前发布包的实际版本。 */
2946
2946
  const HB_SDK_VERSION = typeof undefined === 'string'
2947
2947
  ? undefined
2948
- : '0.8.3-alpha.3';
2948
+ : '0.8.3-alpha.5';
2949
2949
 
2950
2950
  /**
2951
2951
  * iframe 与调试台页面的开发期 console 捕获转发。
@@ -3374,8 +3374,6 @@ const MINI_PROGRAM_MESSAGE_VERSION = 2;
3374
3374
  * 并在 origin 可以固定且协议模式要求时校验 origin。
3375
3375
  */
3376
3376
  const MINI_PROGRAM_BRIDGE_NONCE_PARAM = 'hb_mini_bridge_nonce';
3377
- /** Companion alias 的跨构建、Runtime 与 Host 规范。 */
3378
- const COMPANION_ALIAS_PATTERN = /^[a-z][a-z0-9-]{0,31}$/;
3379
3377
 
3380
3378
  const MINI_PROGRAM_PERMISSION_KEYS = [
3381
3379
  'userInfo',
@@ -3526,6 +3524,8 @@ const MINI_PROGRAM_PERMISSION_CATALOG = [
3526
3524
  new Set(MINI_PROGRAM_PERMISSION_KEYS);
3527
3525
 
3528
3526
  new Set(MINI_PROGRAM_PERMISSION_KEYS);
3527
+ /** Companion alias 的跨构建、Runtime 与 Host 规范。 */
3528
+ const COMPANION_ALIAS_PATTERN = /^[a-z][a-z0-9-]{0,31}$/;
3529
3529
 
3530
3530
  const MINIAPP_PERMISSION_KEYS = MINI_PROGRAM_PERMISSION_KEYS;
3531
3531
  function parseMiniappPermissions(value, options) {
@@ -47,9 +47,9 @@ await runtime.start();
47
47
 
48
48
  Browser Dev Host 由 SDK CLI 提供 Vue 3 调试台并注入 `@heybox/hb-sdk-runtime/web-host`。它可以在没有 CLI 登录、项目绑定或远端 Dev Context 时启动;依赖账号或远端配置的能力必须明确失败,不能阻断页面服务和基础 Browser Mock。存在 CLI 登录会话时,Node 可以代发 Host `heybox-session` 请求;小程序仍须调用 `auth.login()`。凭证留在 Node,不会下发到浏览器、URL 或日志。真机调试继续走 App 内登录。
49
49
 
50
- 调试台的 iframe 在整个会话中保持同一个 DOM 节点。iPhone 16 Pro Max(`440 x 956`)和 Pixel 9 Pro(`410 x 914`)预设只投影设备 metrics、外框、状态栏和安全区,切换时不得触发 iframe navigation 或 Runtime 重启。授权与操作弹窗、Toast、Loading 和振动反馈由 Host presentation controller 渲染在设备预览的 overlay layer 内。
50
+ 调试台的 iframe 在整个会话中保持同一个 DOM 节点。iPhone 16 Pro Max(`440 x 956`)和 Pixel 9 Pro(`410 x 914`)预设投影设备 metrics、外框、状态栏和安全区;Host presentation 返回的顶部可用偏移还需包含 `44px` 移动端宿主导航栏,以对齐手机真机。切换设备时不得触发 iframe navigation 或 Runtime 重启。授权与操作弹窗、Toast、Loading 和振动反馈由 Host presentation controller 渲染在设备预览的 overlay layer 内。
51
51
 
52
- 调试台不提供权限修改、Mac 启动、Browser/Mobile 页签或重复二维码入口。远端权限快照是 Runtime 的规范输入;唯一的 Mobile 二维码入口位于调试台右上角,并继续复用既有 LAN 网卡与 Dev Session 生命周期。
52
+ 调试台不提供权限修改、Browser/Mobile 页签或重复二维码入口。线上批准基线与 CLI 根据声明生成的本地 grant 分开传输,Browser Fake 允许白名单内临时权限并保留线上未批准提示;唯一的 Mobile 二维码入口位于调试台右上角,并复用既有 LAN 网卡与 Dev Session 生命周期。
53
53
 
54
54
  ## 新 PC 页面通道合同与窗口几何
55
55
 
@@ -89,13 +89,15 @@ Storage 面板只通过 `runtime.diagnostics.storage?.getSnapshot()` 读取 Runt
89
89
  | Mobile Release | 当前稳定客户端继续把原生 `mini_url` launch 交给详情 H5/Native Host;二维码保持 HTTPS `open_inapp` 与 `heybox://` `openWindow`,但短链这一跳是普通 H5。跳转页打开完整 sandbox query(`mini_url`、身份、启动票和 LAN Dev Context)后延迟 `closeWindow`。真机 WebView 基址是 `http://127.0.0.1` 详情页且 HTML 来自线上缓存。 | 生成真机二维码前仍需 CLI 登录、项目绑定和有效 Dev Context;这些条件不阻断 Browser 调试台启动。 |
90
90
  | Mobile Debug/Ad-Hoc H5 | `dev_context_url` 是可选的 Dev Session 输入;Runtime 权限和本地 network proxy 仅在读取成功时采用。 | Dev Context 缺失、过期、不可达或校验失败时记录脱敏诊断,继续使用原生 Host 的账号、网络与远端权限。 |
91
91
 
92
- `DevSession` 继续存在,但调试台不再创建或修改权限覆盖。Mobile Dev Session 使用远端规范权限快照,不会反向修改线上配置。Node 进程负责 CLI 的 loopback server、短跳转 registry 和 Dev Session 生命周期,但不是 Mobile Host 状态的替代 owner。
92
+ `DevSession` 同时携带本地声明、独立的 `local_dev_grant` 与 context revision,不会反向修改线上配置。真实 H5 必须先以启动票取得 canonical identity,再将可信线上基线与声明及严格解析的 grant 合成普通 Runtime 快照;没有有效票据或非法 grant 时不临时放权。临时授权仅允许 `network` / `companion`,不包含 `useOfficialDomain`,且每次启动由用户确认。
93
+
94
+ Node 负责 CLI-owned stable context endpoint、短跳转 registry 和 Launch Reference 生命周期;H5 负责持续验证 CLI lease,不能用 iframe heartbeat 代替。连续失联约 30 秒、到期、session/revision 或 Companion 摘要变化时销毁旧 Runtime;重连重新确认和创建实例。票据字符串轮换不改变授权指纹。线上权限快照在 Runtime 内不可变,临时权限来源不传给 iframe。Android、iOS 与新 PC 原生 adapter 沿用既有 operation;真实 PC Companion 还必须有私有 local-dev lease capability,缺能力继续 fail closed。
93
95
 
94
96
  多网卡环境中,CLI 从可用私有 IPv4 网卡派生候选 `mini_url`,并优先展示与 HMR 默认地址匹配的候选。用户切换网卡后,`mini_url` 和 Dev Context URL 都投影到同一选中地址。`dev_context_url` 必须嵌套在 `heybox-mini-dev://sandbox` 的 query 中,不能误放到最外层 `openWindow` payload。
95
97
 
96
98
  ## Mobile 短跳转安全边界
97
99
 
98
- 默认 Mobile 二维码编码现有 `https://api.xiaoheihe.cn/open_inapp/#heybox://...` 启动契约,但短链这一跳是普通 H5 `openWindow`(不带 `mini_program`),`webview.url` 只放局域网短链 `http://<lan-ip>:<port>/l/<token>`。短链返回 HTML 跳转页:先 `location.href` 打开完整 `heybox-mini-dev://sandbox` 协议,约 500ms 后再发 `closeWindow` 关掉中间页。不要对自定义协议做 HTTP 302,WebView 会把它当成相对路径。真机 WebView 基址是 `http://127.0.0.1/tools/user_miniprogram/detail`,HTML 来自线上详情页缓存,因此最终协议必须带上 `mini_url`、`mini_program_id`、`local_dev_launch_token`、`sdk_version` 和 LAN `dev_context_url`;不能只编码 `mini_url` 再指望线上 Host 去拉 `launch.json`。`launch.json` 仍可作为同分支详情 Host 的补充发现。Dev Context 过期或校验失败时记录脱敏诊断,继续使用原生网络与已发现的权限。
100
+ 默认 Mobile 二维码编码现有 `https://api.xiaoheihe.cn/open_inapp/#heybox://...` 启动契约,但短链这一跳是普通 H5 `openWindow`(不带 `mini_program`),`webview.url` 只放局域网短链 `http://<lan-ip>:<port>/l/<token>`。短链返回 HTML 跳转页:先 `location.href` 打开完整 `heybox-mini-dev://sandbox` 协议,约 500ms 后再发 `closeWindow` 关掉中间页。不要对自定义协议做 HTTP 302,WebView 会把它当成相对路径。真机 WebView 基址是 `http://127.0.0.1/tools/user_miniprogram/detail`,HTML 来自线上详情页缓存,因此最终协议携带 `mini_url`、`mini_program_id`、`local_dev_launch_token`、`sdk_version` 和稳定 CLI-owned `dev_context_url`;二维码短期 token 轮换不会让已打开页面失效。`launch.json` 仍可作为同分支详情 Host 的补充发现。Dev Context 过期或校验失败时记录脱敏诊断,继续使用原生网络与已发现的权限。
99
101
 
100
102
  `launch.json` 和短链都只减少二维码编码长度,不是认证、加密、签名或 HMAC:
101
103
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heybox/hb-sdk",
3
- "version": "0.8.3-alpha.3",
3
+ "version": "0.8.3-alpha.5",
4
4
  "sideEffects": [
5
5
  "./src/index.ts",
6
6
  "./src/core/singleton.ts",
@@ -65,7 +65,7 @@
65
65
  "undici": "^7.28.0",
66
66
  "ws": "^8.18.0",
67
67
  "sharp": "^0.34.5",
68
- "@heybox/hb-sdk-protocol": "0.8.3-alpha.3"
68
+ "@heybox/hb-sdk-protocol": "0.8.3-alpha.5"
69
69
  },
70
70
  "peerDependencies": {
71
71
  "vite": ">=5"
@@ -117,12 +117,12 @@
117
117
  "vite": "^8.0.12",
118
118
  "vitest": "^3.2.4",
119
119
  "@heybox-domain/heybox-theme": "~0.1.0",
120
- "@heybox/hb-api": "~1.28.9",
121
120
  "@heybox-domain/heybox-vue3-ui": "~0.1.0",
121
+ "@heybox/hb-api": "~1.28.9",
122
122
  "@heybox/runtime": "~0.2.0",
123
+ "@heybox/runtime-transport-fetch": "~0.2.0",
123
124
  "@heybox/runtime-policy": "~0.2.0",
124
- "@heybox/hb-sdk-runtime": "~0.8.3-alpha.3",
125
- "@heybox/runtime-transport-fetch": "~0.2.0"
125
+ "@heybox/hb-sdk-runtime": "~0.8.3-alpha.5"
126
126
  },
127
127
  "publishConfig": {
128
128
  "registry": "https://registry.npmjs.org/",
package/skill/skill.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "hb-sdk",
3
- "skillVersion": "0.8.3-alpha.3+skill.aa24d6656331",
3
+ "skillVersion": "0.8.3-alpha.5+skill.aa24d6656331",
4
4
  "sdk": {
5
5
  "package": "@heybox/hb-sdk",
6
- "version": "0.8.3-alpha.3",
7
- "compatibility": "0.8.3-alpha.3"
6
+ "version": "0.8.3-alpha.5",
7
+ "compatibility": "0.8.3-alpha.5"
8
8
  },
9
9
  "distribution": {
10
10
  "type": "npm",
11
11
  "package": "@heybox/hb-sdk",
12
- "version": "0.8.3-alpha.3",
12
+ "version": "0.8.3-alpha.5",
13
13
  "path": "skill"
14
14
  },
15
15
  "integrity": "sha256-aa24d6656331cbad8f6aae7735258a49d7f1a82f6e900415de53a1b93a30ddb8"
@@ -1,4 +1,15 @@
1
1
  import type { MiniProgramRuntimePermissionsSnapshot } from './runtime-permissions';
2
+ import type { MiniProgramLocalDevGrant, MiniProgramLocalDevPermissionDeclarations } from '@heybox/hb-sdk-protocol';
3
+ export interface MiniProgramLocalDevContextFields {
4
+ local_dev_grant?: MiniProgramLocalDevGrant;
5
+ context_revision?: number;
6
+ declared_permissions?: MiniProgramLocalDevPermissionDeclarations;
7
+ platforms?: readonly string[];
8
+ dev_session_id?: string;
9
+ local_dev_launch_token?: string;
10
+ mini_program_id?: string;
11
+ companion_manifest_sha256?: string;
12
+ }
2
13
  /** Dev Shell 读取局域网 Dev Session endpoint 的 query 参数。 */
3
14
  export declare const MINI_PROGRAM_DEV_CONTEXT_QUERY_PARAM = "dev_context_url";
4
15
  /** Browser Dev Host 创建和读取 Dev Session 的固定路径。 */
@@ -21,7 +32,7 @@ export interface MiniProgramDevSessionCreateResult {
21
32
  token: string;
22
33
  }
23
34
  /** Runtime Host 通过短期引用读取的不可变 Dev Session 快照。 */
24
- export interface MiniProgramDevSessionSnapshot {
35
+ export interface MiniProgramDevSessionSnapshot extends MiniProgramLocalDevContextFields {
25
36
  schema_version: typeof MINI_PROGRAM_DEV_SESSION_SCHEMA_VERSION;
26
37
  revision: number;
27
38
  expires_at: number;
@@ -29,7 +40,7 @@ export interface MiniProgramDevSessionSnapshot {
29
40
  runtime_permissions: MiniProgramRuntimePermissionsSnapshot;
30
41
  }
31
42
  /** 详情 H5 在只带 `mini_url` 启动后拉取的其余调试参数。 */
32
- export interface MiniProgramDevLaunchSnapshot {
43
+ export interface MiniProgramDevLaunchSnapshot extends MiniProgramLocalDevContextFields {
33
44
  schema_version: typeof MINI_PROGRAM_DEV_LAUNCH_SCHEMA_VERSION;
34
45
  sdk_version?: string;
35
46
  mini_program_id?: string;