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

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 (47) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +26 -6
  3. package/dist/cli-chunks/{build-8dIKgG1v.cjs → build-Dd5EmgU1.cjs} +5 -5
  4. package/dist/cli-chunks/{context-DSNBFwsG.cjs → context-Cm0U_oeb.cjs} +2 -2
  5. package/dist/cli-chunks/{create-DmNfBoq7.cjs → create-Bj08BLVt.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-C15G1TxE.cjs → dev-BQtFwaZ6.cjs} +74 -19
  7. package/dist/cli-chunks/{doctor-r6m7pK1R.cjs → doctor-C3LLR1Hq.cjs} +1 -1
  8. package/dist/cli-chunks/{index-CsQ1g-cL.cjs → index-B2kcpr9q.cjs} +2 -2
  9. package/dist/cli-chunks/{index-B6lVqj5W.cjs → index-D4KcCSeD.cjs} +15 -15
  10. package/dist/cli-chunks/{index.esm-DG1EUOV-.cjs → index.esm-Dog1YTU_.cjs} +7 -7
  11. package/dist/cli-chunks/{login-DOUitUrc.cjs → login-C7Q6SStX.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-C-YGhyHJ.cjs → project-vite-BWhbvrXL.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-i3QX7A-u.cjs → remote-DrflbJjL.cjs} +7 -7
  14. package/dist/cli-chunks/{runtime-gate-hlz0xgg8.cjs → runtime-gate-OEku3HCR.cjs} +1 -1
  15. package/dist/cli-chunks/{runtime-permission-env-DNXaBBHz.cjs → runtime-permission-env-D7X7T6VT.cjs} +1 -1
  16. package/dist/cli-chunks/{session-u4BpZqwE.cjs → session-BC8gfXbM.cjs} +1 -1
  17. package/dist/cli-chunks/{skill-DAOCq0eg.cjs → skill-BXzVRK6G.cjs} +2 -2
  18. package/dist/cli-chunks/{version-MrIy1W5p.cjs → version-CHBZvmBz.cjs} +1 -1
  19. package/dist/cli.cjs +1 -1
  20. package/dist/devtools/browser-dev-host/assets/browser-dev-host-D820rR5R.js +102 -0
  21. package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-BbRQb08Y.js → desktop-app-launch-C0HMYsbA.js} +1 -1
  22. package/dist/devtools/browser-dev-host/assets/{index-8N4og21f.js → index-BUsHRfad.js} +3 -3
  23. package/dist/devtools/browser-dev-host/index.html +2 -2
  24. package/dist/index.cjs.js +549 -8
  25. package/dist/index.esm.js +549 -8
  26. package/dist/miniapp-publish.cjs.js +21 -6
  27. package/dist/miniapp-publish.esm.js +21 -7
  28. package/dist/templates/vanilla-vite-js/README.md.ejs +1 -1
  29. package/dist/templates/vanilla-vite-js/package.json.ejs +1 -1
  30. package/dist/vite.cjs.js +114 -8
  31. package/dist/vite.esm.js +114 -8
  32. package/docs/device-logs.md +2 -2
  33. package/docs/runtime-host-migration.md +7 -5
  34. package/package.json +7 -7
  35. package/skill/skill.json +4 -4
  36. package/types/index.d.ts +1 -1
  37. package/types/miniapp-manifest/schema.d.ts +34 -9
  38. package/types/miniapp-publish/index.d.ts +1 -1
  39. package/types/modules/navigation/app-pages/index.d.ts +1 -1
  40. package/types/modules/navigation/app-pages/types.d.ts +23 -5
  41. package/types/modules/navigation/index.d.ts +21 -12
  42. package/types/modules/share/extra.d.ts +2 -0
  43. package/types/modules/share/types.d.ts +1 -0
  44. package/types/protocol.d.ts +1 -1
  45. package/types/vite/html-policy.d.ts +1 -0
  46. package/types/vite/index.d.ts +4 -2
  47. package/dist/devtools/browser-dev-host/assets/browser-dev-host-CJDZz8aw.js +0 -101
@@ -3140,13 +3140,27 @@ const MINIAPP_PLATFORM_VALUES = ['android', 'ios', 'ohos', 'windows', 'macos', '
3140
3140
  /** 平台声明硬切点:产物 hb-sdk 版本达到该值时,必须显式声明非空 `platforms`。 */
3141
3141
  const MINIAPP_PLATFORM_HARD_CUT_SDK_VERSION = '0.9.0';
3142
3142
  /**
3143
- * 历史移动端兼容平台集合。
3143
+ * 历史兜底平台集合。
3144
3144
  *
3145
3145
  * @remarks
3146
3146
  * 仅在 `sdkVersion` 缺失或 SemVer precedence 低于 `MINIAPP_PLATFORM_HARD_CUT_SDK_VERSION`,
3147
3147
  * 且 Manifest 完全没有 `platforms` 字段时生效,不是任何非法声明的兜底。
3148
+ *
3149
+ * 不含 `linux`:客户端暂无 linux 基线,后端 `x_os_type` 也不映射该平台,声明了也进不了运行门禁。
3150
+ */
3151
+ const MINIAPP_LEGACY_DEFAULT_PLATFORM_VALUES = [
3152
+ 'android',
3153
+ 'ios',
3154
+ 'ohos',
3155
+ 'windows',
3156
+ 'macos',
3157
+ ];
3158
+ /**
3159
+ * 历史兜底平台集合的旧名称。
3160
+ *
3161
+ * @deprecated Since 0.8.3. 请改用 {@link MINIAPP_LEGACY_DEFAULT_PLATFORM_VALUES},本别名取值与之一致,仅为不破坏既有 import 保留。
3148
3162
  */
3149
- const MINIAPP_LEGACY_MOBILE_PLATFORM_VALUES = ['android', 'ios', 'ohos'];
3163
+ const MINIAPP_LEGACY_MOBILE_PLATFORM_VALUES = MINIAPP_LEGACY_DEFAULT_PLATFORM_VALUES;
3150
3164
  /** 窗口尺寸字段的脏值兜底上限;真正的上限是宿主侧显示器 workArea。 */
3151
3165
  const MINIAPP_WINDOW_SIZE_MAX = 16_384;
3152
3166
  const MINIAPP_WINDOW_NUMBER_FIELDS = ['defaultWidth', 'defaultHeight', 'minWidth', 'minHeight'];
@@ -3312,7 +3326,7 @@ const NO_MINIAPP_PLATFORMS = Object.freeze([]);
3312
3326
  * @param manifest - 待解析的不可信 Manifest。必须是非 `null`、非数组的对象;函数只读取其
3313
3327
  * 自有 `platforms` 字段,其他字段不参与平台解析。
3314
3328
  * @returns 冻结的 {@link MiniappPlatformResolution}。显式声明返回规范排序后的 declared /
3315
- * effective;历史兼容返回空 declared 与 Android/iOS/OHOS effective。
3329
+ * effective;历史兼容返回空 declared 与历史兜底平台集合 effective。
3316
3330
  * @throws `manifest` 不是对象时抛出;非空 sdkVersion 不完整、含 `v` 前缀或 build metadata、
3317
3331
  * 不是 canonical SemVer 时抛出;sdkVersion precedence 达到 `0.9.0` 但缺少 platforms 时抛出;
3318
3332
  * 显式 platforms 不是非空数组、包含未知/非字符串/重复平台时抛出。
@@ -3360,11 +3374,11 @@ const NO_MINIAPP_PLATFORMS = Object.freeze([]);
3360
3374
  * // }
3361
3375
  *
3362
3376
  * const legacy = resolveMiniappManifestPlatforms('0.9.0-alpha.1', {})
3363
- * console.log(legacy.effective) // ['android', 'ios', 'ohos']
3377
+ * console.log(legacy.effective) // ['android', 'ios', 'ohos', 'windows', 'macos']
3364
3378
  * ```
3365
3379
  *
3366
3380
  * @see {@link MINIAPP_PLATFORM_HARD_CUT_SDK_VERSION}
3367
- * @see {@link MINIAPP_LEGACY_MOBILE_PLATFORM_VALUES}
3381
+ * @see {@link MINIAPP_LEGACY_DEFAULT_PLATFORM_VALUES}
3368
3382
  * @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/symbols/miniapp-publish/functions/isValidVersion | isValidVersion}
3369
3383
  * @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/symbols/vite/functions/miniappManifest | miniappManifest}
3370
3384
  */
@@ -3387,7 +3401,7 @@ function resolveMiniappManifestPlatforms(sdkVersion, manifest) {
3387
3401
  if (normalizedSdkVersion === undefined || semverExports.lt(normalizedSdkVersion, MINIAPP_PLATFORM_HARD_CUT_SDK_VERSION)) {
3388
3402
  return Object.freeze({
3389
3403
  declared: NO_MINIAPP_PLATFORMS,
3390
- effective: MINIAPP_LEGACY_MOBILE_PLATFORM_VALUES,
3404
+ effective: MINIAPP_LEGACY_DEFAULT_PLATFORM_VALUES,
3391
3405
  platformsDeclared: false,
3392
3406
  policy: 'legacy_mobile_default',
3393
3407
  });
@@ -12598,4 +12612,4 @@ function compareBytes(left, right) {
12598
12612
  return left.length - right.length;
12599
12613
  }
12600
12614
 
12601
- export { ACTIVITY_UPLOAD_KEY_MAX_LENGTH, CREATE_USER_MINIPROGRAM_API_PATH, CREATE_USER_MINIPROGRAM_LEADERBOARD_API_PATH, CREATE_USER_MINIPROGRAM_LOCAL_DEV_LAUNCH_TOKEN_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_COMPANION_UPLOAD_TEMPORARY_SIZE_LIMIT_BYTES, MINIAPP_LEGACY_MOBILE_PLATFORM_VALUES, MINIAPP_PLATFORM_HARD_CUT_SDK_VERSION, 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, createMiniappArtifactFileHeader, createMiniappArtifactSignatureHeader, getMiniProgramUploadAlias, getMiniappUploadKey, hasMiniappRuntimeGate, isValidMiniappManifestVersion as isValidVersion, normalizeBasicInfoName, normalizeRelativePath, parseMiniappBasicInfo, parseMiniappBindAppIds, parseMiniappCategory, prepareMiniappArtifactFiles, previewMiniappBasicInfo, relativePathContainsNodeModulesSegment, resolveMiniappManifestPlatforms, resolveMiniappUploadSessionFiles, shouldUploadDistFile, validateMiniappCompanionFileReceipts, validateMiniappManifestForDeploy, validateMiniappUploadPathLengths, validateMiniappUploadSizeBudgets, validateUploadPaths, validateUploadTotalSize };
12615
+ export { ACTIVITY_UPLOAD_KEY_MAX_LENGTH, CREATE_USER_MINIPROGRAM_API_PATH, CREATE_USER_MINIPROGRAM_LEADERBOARD_API_PATH, CREATE_USER_MINIPROGRAM_LOCAL_DEV_LAUNCH_TOKEN_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_COMPANION_UPLOAD_TEMPORARY_SIZE_LIMIT_BYTES, MINIAPP_LEGACY_DEFAULT_PLATFORM_VALUES, MINIAPP_LEGACY_MOBILE_PLATFORM_VALUES, MINIAPP_PLATFORM_HARD_CUT_SDK_VERSION, 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, createMiniappArtifactFileHeader, createMiniappArtifactSignatureHeader, getMiniProgramUploadAlias, getMiniappUploadKey, hasMiniappRuntimeGate, isValidMiniappManifestVersion as isValidVersion, normalizeBasicInfoName, normalizeRelativePath, parseMiniappBasicInfo, parseMiniappBindAppIds, parseMiniappCategory, prepareMiniappArtifactFiles, previewMiniappBasicInfo, relativePathContainsNodeModulesSegment, resolveMiniappManifestPlatforms, resolveMiniappUploadSessionFiles, shouldUploadDistFile, validateMiniappCompanionFileReceipts, validateMiniappManifestForDeploy, validateMiniappUploadPathLengths, validateMiniappUploadSizeBudgets, validateUploadPaths, validateUploadTotalSize };
@@ -14,6 +14,6 @@ npm run deploy -- --release-note "更新说明"
14
14
 
15
15
  `package.json#heybox.category` 初始声明为 `other`(其他)。发布前请按实际用途选择 `tool`(工具)、`game`(游戏)或 `other`(其他);该字段为必填,修改后需重新构建。
16
16
 
17
- `package.json#heybox.platforms` 默认声明 `android`、`ios`、`ohos`。发布前请在每个声明的平台完成真机验收;需要支持桌面平台时,由项目自行加入并验收。
17
+ `package.json#heybox.platforms` 默认声明全平台 `android`、`ios`、`ohos`、`windows`、`macos`,请按项目实际完成适配并验收的平台保留,未适配的平台务必删除。`linux` 目前没有客户端基线与 API 兼容声明,暂不建议声明。
18
18
 
19
19
  更多内容见 [CLI 指南](https://docs.xiaoheihe.cn/hb_sdk/guide/cli) 和 [SDK 文档](https://docs.xiaoheihe.cn/hb_sdk/)。
@@ -9,7 +9,7 @@
9
9
  "category": "other",
10
10
  "icon": "assets/heybox-placeholder.png",
11
11
  "coverImages": ["assets/heybox-placeholder.png"],
12
- "platforms": ["android", "ios", "ohos"],
12
+ "platforms": ["android", "ios", "ohos", "windows", "macos"],
13
13
  "permissions": {}
14
14
  },
15
15
  "scripts": {
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.5';
2951
+ : '0.8.3-alpha.9';
2952
2952
 
2953
2953
  /**
2954
2954
  * iframe 与调试台页面的开发期 console 捕获转发。
@@ -3229,7 +3229,7 @@ function deviceLogBootstrap(token) {
3229
3229
  return `<script>(function(){if(window.__hb_sdk_device_logs_installed__)return;
3230
3230
  window.__hb_sdk_device_logs_installed__=true;
3231
3231
  window.__hb_sdk_mini_dev_console_installed__=true;
3232
- var endpoint='${DEVICE_LOG_PATH}',credential='${token}',id='',queue=[],seq=0,busy=false,dropped=0;
3232
+ var endpoint='${DEVICE_LOG_PATH}',credential='${token}',id='',queue=[],seq=0,busy=false,dropped=0,retryDelay=1000;
3233
3233
  var registrationId=Array.from(crypto.getRandomValues(new Uint8Array(16)),function(n){return n.toString(16).padStart(2,'0')}).join('');
3234
3234
  var send=window.fetch.bind(window);
3235
3235
  var sandboxResult;
@@ -3251,19 +3251,21 @@ window.addEventListener('error',function(e){add('error',[e.message])});
3251
3251
  window.addEventListener('unhandledrejection',function(e){add('error',[e.reason])});
3252
3252
  async function flush(){if(busy)return;
3253
3253
  busy=true;
3254
+ var success=false;
3254
3255
  try{if(!id){var ua=navigator.userAgent;
3255
3256
  var platform=window.name==='__hb_sdk_mini_dev__'?'Browser':/Android/i.test(ua)?'Android':/iPhone|iPad/i.test(ua)?'iOS':/Windows/i.test(ua)?'Windows':/Mac/i.test(ua)?'macOS':'Browser';
3256
3257
  var r=await send(endpoint,{method:'POST',headers:{'content-type':'application/json','x-hb-log-token':credential},body:JSON.stringify({register:true,platform:platform,registrationId:registrationId}),signal:AbortSignal.timeout(5000)});
3257
- if(!r.ok)return;
3258
+ if(!r.ok)throw 0;
3258
3259
  var d=await r.json();
3259
3260
  id=d.id;
3260
3261
  credential=d.token}if(dropped){add('warn',['日志缓冲已丢弃 '+dropped+' 条']);
3261
3262
  dropped=0}var batch=queue.slice(0,50);
3262
3263
  while(batch.length>1&&new TextEncoder().encode(JSON.stringify(batch)).length>48000)batch.pop();
3263
3264
  var result=await send(endpoint,{method:'POST',headers:{'content-type':'application/json','x-hb-log-token':credential},body:JSON.stringify({id:id,logs:batch,sandboxResult:sandboxResult}),signal:AbortSignal.timeout(5000)});
3264
- if(result.ok){var ack=await result.json();sandboxResult=undefined;
3265
+ if(!result.ok)throw 0;
3266
+ var ack=await result.json();sandboxResult=undefined;
3265
3267
  if(ack.sandboxRequest){try{var entries=await window.__hbSdkSandboxList(ack.sandboxRequest.path);sandboxResult={requestId:ack.sandboxRequest.requestId,entries:entries.slice(0,200),truncated:entries.length>200}}catch(e){sandboxResult={requestId:ack.sandboxRequest.requestId,error:true}}}
3266
- queue=queue.filter(function(l){return l.sequence>ack.sequence})}}catch(e){}finally{busy=false}}setInterval(flush,1000);
3268
+ queue=queue.filter(function(l){return l.sequence>ack.sequence});success=true}catch(e){}finally{retryDelay=success?1000:Math.min(retryDelay*2,30000);busy=false;setTimeout(flush,retryDelay)}}
3267
3269
  flush()})();
3268
3270
  </script>`;
3269
3271
  }
@@ -3601,6 +3603,34 @@ const MINIAPP_PLATFORM_VALUES = ['android', 'ios', 'ohos', 'windows', 'macos', '
3601
3603
  const MINIAPP_WINDOW_SIZE_MAX = 16_384;
3602
3604
  const MINIAPP_WINDOW_NUMBER_FIELDS = ['defaultWidth', 'defaultHeight', 'minWidth', 'minHeight'];
3603
3605
  const MINIAPP_WINDOW_ALLOWED_FIELDS = [...MINIAPP_WINDOW_NUMBER_FIELDS, 'resizable'];
3606
+ /**
3607
+ * 旧版模板的移动端默认声明。
3608
+ *
3609
+ * @remarks
3610
+ * 这不是平台词表的子集定义,也不参与平台解析;它只用于识别「从旧模板创建后从未调整过
3611
+ * `platforms`」的项目,以便在其构建/调试时给出非阻断提醒。刻意只做移动端的项目只要不恰好
3612
+ * 等于这组声明就不会被提醒。
3613
+ */
3614
+ const MINIAPP_LEGACY_MOBILE_TEMPLATE_PLATFORM_VALUES = ['android', 'ios', 'ohos'];
3615
+ /**
3616
+ * 判断平台声明是否仍是旧版模板的移动端默认值。
3617
+ *
3618
+ * @param platforms - 待判断的平台数组;不要求预先规范化顺序,重复项会被长度校验挡下。
3619
+ * @returns 恰好包含 `android`、`ios`、`ohos` 三个平台时返回 `true`,其余组合返回 `false`。
3620
+ */
3621
+ function isLegacyMobileTemplatePlatforms(platforms) {
3622
+ return (platforms.length === MINIAPP_LEGACY_MOBILE_TEMPLATE_PLATFORM_VALUES.length &&
3623
+ MINIAPP_LEGACY_MOBILE_TEMPLATE_PLATFORM_VALUES.every((platform) => platforms.includes(platform)));
3624
+ }
3625
+ /**
3626
+ * 生成「平台声明仍是旧模板移动端默认」的非阻断提示。
3627
+ *
3628
+ * @param sourceLabel - 提示前缀,默认指向开发者声明路径。
3629
+ * @returns 面向开发者的单行提示;调用方负责经 Vite 插件 `warn` 或等价日志通道输出,不得据此阻断构建。
3630
+ */
3631
+ function getLegacyMobileTemplatePlatformsNotice(sourceLabel = 'package.json#heybox.platforms') {
3632
+ return `${sourceLabel} 仍是旧模板的移动端默认声明(android / ios / ohos)。hb-sdk 现已支持桌面端 windows / macos,如项目已完成适配请补充声明;只做移动端可忽略本提示。`;
3633
+ }
3604
3634
  function validateMiniappPackageVersionForBuild(version) {
3605
3635
  return validateMiniappManifestVersion(version, 'package.json.version');
3606
3636
  }
@@ -13073,7 +13103,13 @@ function enforceMiniappHtmlPolicy(html, options = {}) {
13073
13103
  if (options.skipPlatformCsp) {
13074
13104
  return serialize(document);
13075
13105
  }
13076
- const content = options.hmrWebSocketUrl ? PRODUCTION_CSP.replace("connect-src 'none'", `connect-src ${options.hmrWebSocketUrl}`) : PRODUCTION_CSP;
13106
+ const connectSources = Array.from(new Set([
13107
+ options.hmrWebSocketUrl,
13108
+ ...(options.deviceLogUploadUrls ?? []),
13109
+ ].filter((source) => Boolean(source))));
13110
+ const content = connectSources.length > 0
13111
+ ? PRODUCTION_CSP.replace("connect-src 'none'", `connect-src ${connectSources.join(' ')}`)
13112
+ : PRODUCTION_CSP;
13077
13113
  head.childNodes.unshift({
13078
13114
  nodeName: 'meta',
13079
13115
  tagName: 'meta',
@@ -13313,7 +13349,9 @@ const devSnapshotStores = devSnapshotRegistry[devSnapshotStoreKey];
13313
13349
  *
13314
13350
  * - `version`:发布版本;trim 后必须是完整 SemVer,可含 prerelease,不允许 build metadata 或模板值
13315
13351
  * `0.0.0`;
13316
- * - `heybox.platforms`:项目实际承诺适配的非空、无重复平台 allowlist;输出按平台词表规范排序;
13352
+ * - `heybox.platforms`:项目实际承诺适配的非空、无重复平台 allowlist;输出按平台词表规范排序。
13353
+ * 声明仍停留在旧模板移动端默认(`android`、`ios`、`ohos`)时,`serve` 与 `build` 都只输出
13354
+ * 一条非阻断提示,不影响构建结果;
13317
13355
  * - `heybox.permissions`:严格权限对象;未知权限/字段或错误类型会失败,`enabled: false` 项不写入
13318
13356
  * Manifest。旧版本缺失声明时可能警告,新硬切版本会失败;
13319
13357
  * - `heybox.window`:可选的新 PC 开窗初值、最小尺寸和 `resizable` 声明;省略时不写该字段;
@@ -13398,6 +13436,8 @@ function miniappManifest() {
13398
13436
  let outDir = 'dist';
13399
13437
  let command = 'build';
13400
13438
  let hmrWebSocketUrl;
13439
+ let configuredDeviceLogUploadUrls = [];
13440
+ let devServer;
13401
13441
  /** 构建链路中更早的失败原因;closeBundle 不得再用产物校验覆盖它。 */
13402
13442
  let priorBuildError;
13403
13443
  return {
@@ -13427,8 +13467,22 @@ function miniappManifest() {
13427
13467
  outDir = resolved.build.outDir;
13428
13468
  command = resolved.command;
13429
13469
  hmrWebSocketUrl = resolveHmrWebSocketUrl(resolved);
13470
+ configuredDeviceLogUploadUrls = resolveConfiguredDeviceLogUploadUrls(resolved);
13430
13471
  },
13431
13472
  configureServer(server) {
13473
+ devServer = server;
13474
+ // 开发期只对「仍是旧模板移动端默认」的声明做非阻断提示。声明缺失或非法一律交由
13475
+ // build / remote deploy 链路拒绝,因此这里只容忍读取阶段的异常,保持 hb-sdk dev
13476
+ // 既有的启动语义;warn 调用留在 try 之外,避免把插件上下文错误一起吞掉。
13477
+ let legacyMobileTemplate = false;
13478
+ try {
13479
+ legacyMobileTemplate = isLegacyMobileTemplatePlatforms(readMiniappPlatformsFromPackageJson(root));
13480
+ }
13481
+ catch {
13482
+ /* package.json#heybox.platforms 缺失或非法时不提示。 */
13483
+ }
13484
+ if (legacyMobileTemplate)
13485
+ this.warn(getLegacyMobileTemplatePlatformsNotice());
13432
13486
  let unregisterLogs;
13433
13487
  const registerLogs = () => {
13434
13488
  const address = server.httpServer?.address();
@@ -13664,7 +13718,15 @@ function miniappManifest() {
13664
13718
  },
13665
13719
  transformIndexHtml(html) {
13666
13720
  const enforced = enforceMiniappHtmlPolicy(html, {
13667
- ...(command === 'serve' ? { hmrWebSocketUrl } : {}),
13721
+ ...(command === 'serve'
13722
+ ? {
13723
+ deviceLogUploadUrls: Array.from(new Set([
13724
+ ...configuredDeviceLogUploadUrls,
13725
+ ...resolveViteDeviceLogUploadUrls(devServer?.resolvedUrls),
13726
+ ])),
13727
+ hmrWebSocketUrl,
13728
+ }
13729
+ : {}),
13668
13730
  skipPlatformCsp,
13669
13731
  });
13670
13732
  return command === 'serve'
@@ -13683,6 +13745,8 @@ function miniappManifest() {
13683
13745
  const version = validateMiniappPackageVersionForBuild(readMiniappVersionFromPackageJson(root));
13684
13746
  const sdkVersion = resolveSdkVersion();
13685
13747
  const platforms = readMiniappPlatformsFromPackageJson(root);
13748
+ if (isLegacyMobileTemplatePlatforms(platforms))
13749
+ this.warn(getLegacyMobileTemplatePlatformsNotice());
13686
13750
  const parsedPermissions = readMiniappPermissionsFromPackageJson(root, sdkVersion);
13687
13751
  const windowDeclaration = readMiniappWindowFromPackageJson(root);
13688
13752
  const companionConfig = readMiniappCompanionsFromPackageJson(root);
@@ -13857,6 +13921,48 @@ function resolveHmrWebSocketUrl(resolved) {
13857
13921
  const port = options.clientPort ?? options.port ?? resolved.server.port;
13858
13922
  return `${protocol}://${host}${port ? `:${port}` : ''}`;
13859
13923
  }
13924
+ function resolveConfiguredDeviceLogUploadUrls(resolved) {
13925
+ if (resolved.command !== 'serve')
13926
+ return [];
13927
+ const protocol = resolved.server.https ? 'https' : 'http';
13928
+ const configuredHost = resolved.server.host;
13929
+ const hosts = new Set();
13930
+ if (typeof configuredHost === 'string' && configuredHost !== '0.0.0.0' && configuredHost !== '::') {
13931
+ hosts.add(configuredHost);
13932
+ }
13933
+ else {
13934
+ hosts.add('127.0.0.1');
13935
+ }
13936
+ return Array.from(hosts, host => createDeviceLogUploadUrl(protocol, host, resolved.server.port)).filter((url) => Boolean(url));
13937
+ }
13938
+ function resolveViteDeviceLogUploadUrls(resolvedUrls) {
13939
+ if (!resolvedUrls)
13940
+ return [];
13941
+ return Array.from(new Set([...resolvedUrls.local, ...resolvedUrls.network].map(url => {
13942
+ try {
13943
+ const endpoint = new URL(DEVICE_LOG_PATH, url);
13944
+ if (endpoint.protocol !== 'http:' && endpoint.protocol !== 'https:')
13945
+ return undefined;
13946
+ endpoint.username = '';
13947
+ endpoint.password = '';
13948
+ endpoint.search = '';
13949
+ endpoint.hash = '';
13950
+ return endpoint.toString();
13951
+ }
13952
+ catch {
13953
+ return undefined;
13954
+ }
13955
+ }).filter((url) => Boolean(url))));
13956
+ }
13957
+ function createDeviceLogUploadUrl(protocol, host, port) {
13958
+ try {
13959
+ const normalizedHost = host.startsWith('[') || !host.includes(':') ? host : `[${host}]`;
13960
+ return new URL(DEVICE_LOG_PATH, `${protocol}://${normalizedHost}${port === undefined ? '' : `:${port}`}`).toString();
13961
+ }
13962
+ catch {
13963
+ return undefined;
13964
+ }
13965
+ }
13860
13966
 
13861
13967
  exports.HB_SDK_COMPANION_ARTIFACT_ACCESS_TOKEN_ENV = HB_SDK_COMPANION_ARTIFACT_ACCESS_TOKEN_ENV;
13862
13968
  exports.HB_SDK_MINI_PROGRAM_MANIFEST_ACCESS_TOKEN_ENV = HB_SDK_MINI_PROGRAM_MANIFEST_ACCESS_TOKEN_ENV;
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.5';
2948
+ : '0.8.3-alpha.9';
2949
2949
 
2950
2950
  /**
2951
2951
  * iframe 与调试台页面的开发期 console 捕获转发。
@@ -3226,7 +3226,7 @@ function deviceLogBootstrap(token) {
3226
3226
  return `<script>(function(){if(window.__hb_sdk_device_logs_installed__)return;
3227
3227
  window.__hb_sdk_device_logs_installed__=true;
3228
3228
  window.__hb_sdk_mini_dev_console_installed__=true;
3229
- var endpoint='${DEVICE_LOG_PATH}',credential='${token}',id='',queue=[],seq=0,busy=false,dropped=0;
3229
+ var endpoint='${DEVICE_LOG_PATH}',credential='${token}',id='',queue=[],seq=0,busy=false,dropped=0,retryDelay=1000;
3230
3230
  var registrationId=Array.from(crypto.getRandomValues(new Uint8Array(16)),function(n){return n.toString(16).padStart(2,'0')}).join('');
3231
3231
  var send=window.fetch.bind(window);
3232
3232
  var sandboxResult;
@@ -3248,19 +3248,21 @@ window.addEventListener('error',function(e){add('error',[e.message])});
3248
3248
  window.addEventListener('unhandledrejection',function(e){add('error',[e.reason])});
3249
3249
  async function flush(){if(busy)return;
3250
3250
  busy=true;
3251
+ var success=false;
3251
3252
  try{if(!id){var ua=navigator.userAgent;
3252
3253
  var platform=window.name==='__hb_sdk_mini_dev__'?'Browser':/Android/i.test(ua)?'Android':/iPhone|iPad/i.test(ua)?'iOS':/Windows/i.test(ua)?'Windows':/Mac/i.test(ua)?'macOS':'Browser';
3253
3254
  var r=await send(endpoint,{method:'POST',headers:{'content-type':'application/json','x-hb-log-token':credential},body:JSON.stringify({register:true,platform:platform,registrationId:registrationId}),signal:AbortSignal.timeout(5000)});
3254
- if(!r.ok)return;
3255
+ if(!r.ok)throw 0;
3255
3256
  var d=await r.json();
3256
3257
  id=d.id;
3257
3258
  credential=d.token}if(dropped){add('warn',['日志缓冲已丢弃 '+dropped+' 条']);
3258
3259
  dropped=0}var batch=queue.slice(0,50);
3259
3260
  while(batch.length>1&&new TextEncoder().encode(JSON.stringify(batch)).length>48000)batch.pop();
3260
3261
  var result=await send(endpoint,{method:'POST',headers:{'content-type':'application/json','x-hb-log-token':credential},body:JSON.stringify({id:id,logs:batch,sandboxResult:sandboxResult}),signal:AbortSignal.timeout(5000)});
3261
- if(result.ok){var ack=await result.json();sandboxResult=undefined;
3262
+ if(!result.ok)throw 0;
3263
+ var ack=await result.json();sandboxResult=undefined;
3262
3264
  if(ack.sandboxRequest){try{var entries=await window.__hbSdkSandboxList(ack.sandboxRequest.path);sandboxResult={requestId:ack.sandboxRequest.requestId,entries:entries.slice(0,200),truncated:entries.length>200}}catch(e){sandboxResult={requestId:ack.sandboxRequest.requestId,error:true}}}
3263
- queue=queue.filter(function(l){return l.sequence>ack.sequence})}}catch(e){}finally{busy=false}}setInterval(flush,1000);
3265
+ queue=queue.filter(function(l){return l.sequence>ack.sequence});success=true}catch(e){}finally{retryDelay=success?1000:Math.min(retryDelay*2,30000);busy=false;setTimeout(flush,retryDelay)}}
3264
3266
  flush()})();
3265
3267
  </script>`;
3266
3268
  }
@@ -3598,6 +3600,34 @@ const MINIAPP_PLATFORM_VALUES = ['android', 'ios', 'ohos', 'windows', 'macos', '
3598
3600
  const MINIAPP_WINDOW_SIZE_MAX = 16_384;
3599
3601
  const MINIAPP_WINDOW_NUMBER_FIELDS = ['defaultWidth', 'defaultHeight', 'minWidth', 'minHeight'];
3600
3602
  const MINIAPP_WINDOW_ALLOWED_FIELDS = [...MINIAPP_WINDOW_NUMBER_FIELDS, 'resizable'];
3603
+ /**
3604
+ * 旧版模板的移动端默认声明。
3605
+ *
3606
+ * @remarks
3607
+ * 这不是平台词表的子集定义,也不参与平台解析;它只用于识别「从旧模板创建后从未调整过
3608
+ * `platforms`」的项目,以便在其构建/调试时给出非阻断提醒。刻意只做移动端的项目只要不恰好
3609
+ * 等于这组声明就不会被提醒。
3610
+ */
3611
+ const MINIAPP_LEGACY_MOBILE_TEMPLATE_PLATFORM_VALUES = ['android', 'ios', 'ohos'];
3612
+ /**
3613
+ * 判断平台声明是否仍是旧版模板的移动端默认值。
3614
+ *
3615
+ * @param platforms - 待判断的平台数组;不要求预先规范化顺序,重复项会被长度校验挡下。
3616
+ * @returns 恰好包含 `android`、`ios`、`ohos` 三个平台时返回 `true`,其余组合返回 `false`。
3617
+ */
3618
+ function isLegacyMobileTemplatePlatforms(platforms) {
3619
+ return (platforms.length === MINIAPP_LEGACY_MOBILE_TEMPLATE_PLATFORM_VALUES.length &&
3620
+ MINIAPP_LEGACY_MOBILE_TEMPLATE_PLATFORM_VALUES.every((platform) => platforms.includes(platform)));
3621
+ }
3622
+ /**
3623
+ * 生成「平台声明仍是旧模板移动端默认」的非阻断提示。
3624
+ *
3625
+ * @param sourceLabel - 提示前缀,默认指向开发者声明路径。
3626
+ * @returns 面向开发者的单行提示;调用方负责经 Vite 插件 `warn` 或等价日志通道输出,不得据此阻断构建。
3627
+ */
3628
+ function getLegacyMobileTemplatePlatformsNotice(sourceLabel = 'package.json#heybox.platforms') {
3629
+ return `${sourceLabel} 仍是旧模板的移动端默认声明(android / ios / ohos)。hb-sdk 现已支持桌面端 windows / macos,如项目已完成适配请补充声明;只做移动端可忽略本提示。`;
3630
+ }
3601
3631
  function validateMiniappPackageVersionForBuild(version) {
3602
3632
  return validateMiniappManifestVersion(version, 'package.json.version');
3603
3633
  }
@@ -13070,7 +13100,13 @@ function enforceMiniappHtmlPolicy(html, options = {}) {
13070
13100
  if (options.skipPlatformCsp) {
13071
13101
  return serialize(document);
13072
13102
  }
13073
- const content = options.hmrWebSocketUrl ? PRODUCTION_CSP.replace("connect-src 'none'", `connect-src ${options.hmrWebSocketUrl}`) : PRODUCTION_CSP;
13103
+ const connectSources = Array.from(new Set([
13104
+ options.hmrWebSocketUrl,
13105
+ ...(options.deviceLogUploadUrls ?? []),
13106
+ ].filter((source) => Boolean(source))));
13107
+ const content = connectSources.length > 0
13108
+ ? PRODUCTION_CSP.replace("connect-src 'none'", `connect-src ${connectSources.join(' ')}`)
13109
+ : PRODUCTION_CSP;
13074
13110
  head.childNodes.unshift({
13075
13111
  nodeName: 'meta',
13076
13112
  tagName: 'meta',
@@ -13310,7 +13346,9 @@ const devSnapshotStores = devSnapshotRegistry[devSnapshotStoreKey];
13310
13346
  *
13311
13347
  * - `version`:发布版本;trim 后必须是完整 SemVer,可含 prerelease,不允许 build metadata 或模板值
13312
13348
  * `0.0.0`;
13313
- * - `heybox.platforms`:项目实际承诺适配的非空、无重复平台 allowlist;输出按平台词表规范排序;
13349
+ * - `heybox.platforms`:项目实际承诺适配的非空、无重复平台 allowlist;输出按平台词表规范排序。
13350
+ * 声明仍停留在旧模板移动端默认(`android`、`ios`、`ohos`)时,`serve` 与 `build` 都只输出
13351
+ * 一条非阻断提示,不影响构建结果;
13314
13352
  * - `heybox.permissions`:严格权限对象;未知权限/字段或错误类型会失败,`enabled: false` 项不写入
13315
13353
  * Manifest。旧版本缺失声明时可能警告,新硬切版本会失败;
13316
13354
  * - `heybox.window`:可选的新 PC 开窗初值、最小尺寸和 `resizable` 声明;省略时不写该字段;
@@ -13395,6 +13433,8 @@ function miniappManifest() {
13395
13433
  let outDir = 'dist';
13396
13434
  let command = 'build';
13397
13435
  let hmrWebSocketUrl;
13436
+ let configuredDeviceLogUploadUrls = [];
13437
+ let devServer;
13398
13438
  /** 构建链路中更早的失败原因;closeBundle 不得再用产物校验覆盖它。 */
13399
13439
  let priorBuildError;
13400
13440
  return {
@@ -13424,8 +13464,22 @@ function miniappManifest() {
13424
13464
  outDir = resolved.build.outDir;
13425
13465
  command = resolved.command;
13426
13466
  hmrWebSocketUrl = resolveHmrWebSocketUrl(resolved);
13467
+ configuredDeviceLogUploadUrls = resolveConfiguredDeviceLogUploadUrls(resolved);
13427
13468
  },
13428
13469
  configureServer(server) {
13470
+ devServer = server;
13471
+ // 开发期只对「仍是旧模板移动端默认」的声明做非阻断提示。声明缺失或非法一律交由
13472
+ // build / remote deploy 链路拒绝,因此这里只容忍读取阶段的异常,保持 hb-sdk dev
13473
+ // 既有的启动语义;warn 调用留在 try 之外,避免把插件上下文错误一起吞掉。
13474
+ let legacyMobileTemplate = false;
13475
+ try {
13476
+ legacyMobileTemplate = isLegacyMobileTemplatePlatforms(readMiniappPlatformsFromPackageJson(root));
13477
+ }
13478
+ catch {
13479
+ /* package.json#heybox.platforms 缺失或非法时不提示。 */
13480
+ }
13481
+ if (legacyMobileTemplate)
13482
+ this.warn(getLegacyMobileTemplatePlatformsNotice());
13429
13483
  let unregisterLogs;
13430
13484
  const registerLogs = () => {
13431
13485
  const address = server.httpServer?.address();
@@ -13661,7 +13715,15 @@ function miniappManifest() {
13661
13715
  },
13662
13716
  transformIndexHtml(html) {
13663
13717
  const enforced = enforceMiniappHtmlPolicy(html, {
13664
- ...(command === 'serve' ? { hmrWebSocketUrl } : {}),
13718
+ ...(command === 'serve'
13719
+ ? {
13720
+ deviceLogUploadUrls: Array.from(new Set([
13721
+ ...configuredDeviceLogUploadUrls,
13722
+ ...resolveViteDeviceLogUploadUrls(devServer?.resolvedUrls),
13723
+ ])),
13724
+ hmrWebSocketUrl,
13725
+ }
13726
+ : {}),
13665
13727
  skipPlatformCsp,
13666
13728
  });
13667
13729
  return command === 'serve'
@@ -13680,6 +13742,8 @@ function miniappManifest() {
13680
13742
  const version = validateMiniappPackageVersionForBuild(readMiniappVersionFromPackageJson(root));
13681
13743
  const sdkVersion = resolveSdkVersion();
13682
13744
  const platforms = readMiniappPlatformsFromPackageJson(root);
13745
+ if (isLegacyMobileTemplatePlatforms(platforms))
13746
+ this.warn(getLegacyMobileTemplatePlatformsNotice());
13683
13747
  const parsedPermissions = readMiniappPermissionsFromPackageJson(root, sdkVersion);
13684
13748
  const windowDeclaration = readMiniappWindowFromPackageJson(root);
13685
13749
  const companionConfig = readMiniappCompanionsFromPackageJson(root);
@@ -13854,5 +13918,47 @@ function resolveHmrWebSocketUrl(resolved) {
13854
13918
  const port = options.clientPort ?? options.port ?? resolved.server.port;
13855
13919
  return `${protocol}://${host}${port ? `:${port}` : ''}`;
13856
13920
  }
13921
+ function resolveConfiguredDeviceLogUploadUrls(resolved) {
13922
+ if (resolved.command !== 'serve')
13923
+ return [];
13924
+ const protocol = resolved.server.https ? 'https' : 'http';
13925
+ const configuredHost = resolved.server.host;
13926
+ const hosts = new Set();
13927
+ if (typeof configuredHost === 'string' && configuredHost !== '0.0.0.0' && configuredHost !== '::') {
13928
+ hosts.add(configuredHost);
13929
+ }
13930
+ else {
13931
+ hosts.add('127.0.0.1');
13932
+ }
13933
+ return Array.from(hosts, host => createDeviceLogUploadUrl(protocol, host, resolved.server.port)).filter((url) => Boolean(url));
13934
+ }
13935
+ function resolveViteDeviceLogUploadUrls(resolvedUrls) {
13936
+ if (!resolvedUrls)
13937
+ return [];
13938
+ return Array.from(new Set([...resolvedUrls.local, ...resolvedUrls.network].map(url => {
13939
+ try {
13940
+ const endpoint = new URL(DEVICE_LOG_PATH, url);
13941
+ if (endpoint.protocol !== 'http:' && endpoint.protocol !== 'https:')
13942
+ return undefined;
13943
+ endpoint.username = '';
13944
+ endpoint.password = '';
13945
+ endpoint.search = '';
13946
+ endpoint.hash = '';
13947
+ return endpoint.toString();
13948
+ }
13949
+ catch {
13950
+ return undefined;
13951
+ }
13952
+ }).filter((url) => Boolean(url))));
13953
+ }
13954
+ function createDeviceLogUploadUrl(protocol, host, port) {
13955
+ try {
13956
+ const normalizedHost = host.startsWith('[') || !host.includes(':') ? host : `[${host}]`;
13957
+ return new URL(DEVICE_LOG_PATH, `${protocol}://${normalizedHost}${port === undefined ? '' : `:${port}`}`).toString();
13958
+ }
13959
+ catch {
13960
+ return undefined;
13961
+ }
13962
+ }
13857
13963
 
13858
13964
  export { HB_SDK_COMPANION_ARTIFACT_ACCESS_TOKEN_ENV, HB_SDK_MINI_PROGRAM_MANIFEST_ACCESS_TOKEN_ENV, MINIAPP_PLATFORM_VALUES, miniappManifest };
@@ -29,8 +29,8 @@ Agent 应保存 `epoch` 和 `nextCursor`,`hasMore` 为 true 时继续翻页。
29
29
 
30
30
  ## 有界行为与权限
31
31
 
32
- 每个页面最多缓冲 500 条,每批最多 50 条并限制编码后的请求体;失败后按原序号重试。服务器最多保存 5000 条、64 个设备会话,每设备每秒最多接收 200 条。设备 15 秒未心跳标记离线,旧日志保留直到被环形缓冲淘汰。超过页面缓冲时补充丢弃数量提示。开发服务凭证最长有效 12 小时,到期需重启开发服务并重新打开页面。
32
+ 每个页面最多缓冲 500 条,每批最多 50 条并限制编码后的请求体;失败后按原序号指数退避重试,最长等待 30 秒。服务器最多保存 5000 条、64 个设备会话,每设备每秒最多接收 200 条。设备 15 秒未心跳标记离线,旧日志保留直到被环形缓冲淘汰。超过页面缓冲时补充丢弃数量提示。开发服务凭证最长有效 12 小时,到期需重启开发服务并重新打开页面。
33
33
 
34
- 设备上传凭证不能读取日志或上传其他会话的记录。读取接口只开放给本机数字 loopback Host,拒绝外站 Origin;授权边界是当前机器的本地开发者进程。页面上传只使用同源路径,不依赖 HTTPS 宿主页面连接跨源明文 WebSocket。上传前移除 URL query、fragment、userinfo 和常见凭据字段,服务端再次脱敏。此功能不能代替开发者对业务日志中的个人信息做最小化处理。
34
+ 设备上传凭证不能读取日志或上传其他会话的记录。读取接口只开放给本机数字 loopback Host,拒绝外站 Origin;授权边界是当前机器的本地开发者进程。页面上传只使用同源路径,`hb-sdk dev` 的平台 CSP 仅精确放行各实际开发服务地址下的日志端点,不开放其它浏览器网络出口,也不依赖 HTTPS 宿主页面连接跨源明文 WebSocket。上传前移除 URL query、fragment、userinfo 和常见凭据字段,服务端再次脱敏。此功能不能代替开发者对业务日志中的个人信息做最小化处理。
35
35
 
36
36
  当前聚合的是小程序页面和 SDK 的日志,不包含手机原生进程、PC 原生进程或 Companion stdout/stderr。调试台自身的 Runtime/Host 本地日志仍只在该页面显示。真机本地网络权限、宿主 CSP 及系统策略可能阻止连接,需要使用实际手机和 PC Extension 验证。
@@ -51,10 +51,11 @@ Browser Dev Host 由 SDK CLI 提供 Vue 3 调试台并注入 `@heybox/hb-sdk-run
51
51
 
52
52
  调试台不提供权限修改、Browser/Mobile 页签或重复二维码入口。线上批准基线与 CLI 根据声明生成的本地 grant 分开传输,Browser Fake 允许白名单内临时权限并保留线上未批准提示;唯一的 Mobile 二维码入口位于调试台右上角,并复用既有 LAN 网卡与 Dev Session 生命周期。
53
53
 
54
- ## 新 PC 页面通道合同与窗口几何
54
+ ## 新 PC 页面通道合同与窗口导航
55
55
 
56
56
  小程序 Host 的页面通道以 `namespace` + `protocolVersion` + `contractRevision` 协商。当前详情页的
57
- `NEW_PC_HOST_CONTRACT_REVISION` 是 `1.7.0`,同时把 `1.1.0` / `1.4.0` / `1.5.0` / `1.6.0` 保留为 legacy revision。
57
+ `NEW_PC_HOST_CONTRACT_REVISION` 是 `1.8.0`,同时把 `1.1.0` / `1.4.0` / `1.5.0` / `1.6.0` / `1.7.0` 保留为 legacy revision。
58
+ `1.8.0` 新增私有 `navigation.openWindow` capability,用于把 Runtime 已收窄的 `miniProgramId` 与可选编码后 `extra` 交给桌面插件开窗;旧 revision 不得宣告该能力。
58
59
  双方必须在握手时选出**共同支持的最高 revision**,不能只读 `marker.contractRevision`:旧插件会把 marker 固定为
59
60
  其 legacy revision 供已部署页面兼容读取,真正的版本集合在 `supportedContractRevisions` 中;只回退 marker
60
61
  会把“支持到 1.5.0”的插件错误降级到 `1.1.0`。任一侧都不支持的组合必须在握手阶段明确失败,不做静默降级。
@@ -69,9 +70,10 @@ Browser Dev Host 由 SDK CLI 提供 Vue 3 调试台并注入 `@heybox/hb-sdk-run
69
70
  `source === 'program'` 的程序化变更(例如宿主恢复上次尺寸、响应系统缩放)只更新当前运行时几何,不得覆盖
70
71
  用户记忆。位置(`x` / `y`)始终不对开发者开放,页面不得声明或设置。
71
72
 
72
- detail 页面与工坊插件(Desktop Extension)共享同一通道合同,必须**成对发布和成对回滚**:只升级一侧会出现
73
- `HOST_VERSION_UNSUPPORTED` 或几何语义不一致。0.8.1 的正式发布说明需把 `0.8.1-alpha.14` 中的“合同升级到
74
- `1.6.0`”更正为 `1.7.0`,或明确写成 `1.6.0 → 1.7.0` 增量。
73
+ detail 页面与工坊插件(Desktop Extension)通过最高公共 revision 支持独立发布和回滚。单侧升级时双方继续
74
+ 协商到旧 revision;例如只有一侧支持 `1.8.0` 时仍使用 `1.7.0`,现有能力保持可用,仅新的
75
+ `mini_program` 目标返回 `REQUEST_UNSUPPORTED`。只有双方没有公共 revision 时才返回
76
+ `HOST_VERSION_UNSUPPORTED`,不得静默切换到 Mobile、Web 或旧 PC Host。
75
77
 
76
78
  ## Host diagnostics
77
79
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heybox/hb-sdk",
3
- "version": "0.8.3-alpha.5",
3
+ "version": "0.8.3-alpha.9",
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.5"
68
+ "@heybox/hb-sdk-protocol": "0.8.3-alpha.9"
69
69
  },
70
70
  "peerDependencies": {
71
71
  "vite": ">=5"
@@ -116,13 +116,13 @@
116
116
  "vue-tsc": "^3.3.7",
117
117
  "vite": "^8.0.12",
118
118
  "vitest": "^3.2.4",
119
- "@heybox-domain/heybox-theme": "~0.1.0",
120
119
  "@heybox-domain/heybox-vue3-ui": "~0.1.0",
121
- "@heybox/hb-api": "~1.28.9",
122
- "@heybox/runtime": "~0.2.0",
123
- "@heybox/runtime-transport-fetch": "~0.2.0",
120
+ "@heybox-domain/heybox-theme": "~0.1.0",
121
+ "@heybox/hb-sdk-runtime": "~0.8.3-alpha.9",
124
122
  "@heybox/runtime-policy": "~0.2.0",
125
- "@heybox/hb-sdk-runtime": "~0.8.3-alpha.5"
123
+ "@heybox/runtime-transport-fetch": "~0.2.0",
124
+ "@heybox/hb-api": "~1.28.9",
125
+ "@heybox/runtime": "~0.2.0"
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.5+skill.aa24d6656331",
3
+ "skillVersion": "0.8.3-alpha.9+skill.aa24d6656331",
4
4
  "sdk": {
5
5
  "package": "@heybox/hb-sdk",
6
- "version": "0.8.3-alpha.5",
7
- "compatibility": "0.8.3-alpha.5"
6
+ "version": "0.8.3-alpha.9",
7
+ "compatibility": "0.8.3-alpha.9"
8
8
  },
9
9
  "distribution": {
10
10
  "type": "npm",
11
11
  "package": "@heybox/hb-sdk",
12
- "version": "0.8.3-alpha.5",
12
+ "version": "0.8.3-alpha.9",
13
13
  "path": "skill"
14
14
  },
15
15
  "integrity": "sha256-aa24d6656331cbad8f6aae7735258a49d7f1a82f6e900415de53a1b93a30ddb8"
package/types/index.d.ts CHANGED
@@ -16,7 +16,7 @@ export type { CreateOptions, DirectoryHandle, FileHandle, FileMode, FileStat, Fi
16
16
  export type { HideLoadingPayload, HideLoadingResult, MiniProgramToastStatus, MiniProgramUiModule, ShowLoadingPayload, ShowLoadingResult, ShowToastPayload, ShowToastResult, } from './modules/ui';
17
17
  export type { MiniProgramDeviceModule, MiniProgramVibrateIntensity, SetClipboardPayload, SetClipboardResult, VibratePayload, VibrateResult, } from './modules/device';
18
18
  export type { MiniProgramEnvironmentInfo, MiniProgramEnvironmentModule, MiniProgramOperatingSystemName, MiniProgramRuntimeMode, } from './modules/environment';
19
- export type { ClosePayload, CloseResult, MiniProgramAppPageTarget, MiniProgramGameDetailGameType, MiniProgramGameDetailPage, MiniProgramNavigationModule, OpenAppPageOptions, OpenAppPagePayload, OpenAppPageResult, OpenGameDetailAppPagePayload, OpenGameDetailAppPageOptions, OpenPostDetailAppPagePayload, OpenPostDetailAppPageOptions, OpenUserDetailAppPagePayload, OpenUserDetailAppPageOptions, ReloadPayload, ReloadResult, } from './modules/navigation';
19
+ export type { ClosePayload, CloseResult, MiniProgramAppPageTarget, MiniProgramGameDetailGameType, MiniProgramGameDetailPage, MiniProgramNavigationModule, OpenAppPageOptions, OpenAppPagePayload, OpenAppPageResult, OpenGameDetailAppPagePayload, OpenGameDetailAppPageOptions, OpenMiniProgramAppPagePayload, OpenMiniProgramAppPageOptions, OpenPostDetailAppPagePayload, OpenPostDetailAppPageOptions, OpenUserDetailAppPagePayload, OpenUserDetailAppPageOptions, ReloadPayload, ReloadResult, } from './modules/navigation';
20
20
  import { getHandshakeState, off, on, onHandshakeStateChange } from './core/singleton';
21
21
  declare const hbSDK: {
22
22
  getHandshakeState: typeof getHandshakeState;