@heybox/hb-sdk 0.7.4-alpha.4 → 0.7.4-alpha.6

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 (43) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +19 -1
  3. package/dist/cli-chunks/{build-BqGFRLe-.cjs → build-DF74IHGR.cjs} +2 -2
  4. package/dist/cli-chunks/{context-DTr3hRTv.cjs → context-QemmshdY.cjs} +26 -1
  5. package/dist/cli-chunks/{create-OkiiiH4I.cjs → create-Ch9m8w8M.cjs} +1 -1
  6. package/dist/cli-chunks/dev-D2DwLxXW.cjs +15682 -0
  7. package/dist/cli-chunks/{doctor-BO0vkDny.cjs → doctor-B9xJ2j20.cjs} +1 -1
  8. package/dist/cli-chunks/{index-CZuvk1Rg.cjs → index-Cv36miWx.cjs} +83 -83
  9. package/dist/cli-chunks/{index-CyEqCbeu.cjs → index-DxQgKWRT.cjs} +31 -32
  10. package/dist/cli-chunks/index.esm-DZQrllrR.cjs +5212 -0
  11. package/dist/cli-chunks/{login-CuAGltGs.cjs → login-DEKhX1Vf.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-BUY9DgYo.cjs → project-vite-D_NNB_Ib.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-tPMcxgpi.cjs → remote-B_Bn4v81.cjs} +4 -4
  14. package/dist/cli-chunks/{session-BUjFX2U2.cjs → session-C2zY7XHn.cjs} +2 -1
  15. package/dist/cli.cjs +1 -1
  16. package/dist/devtools/browser-dev-host/index.html +128 -151
  17. package/dist/devtools/browser-dev-host/main.js +2591 -345
  18. package/dist/index.cjs.js +1187 -3
  19. package/dist/index.esm.js +1187 -3
  20. package/dist/protocol.cjs.js +3 -0
  21. package/dist/protocol.esm.js +3 -1
  22. package/dist/vite.cjs.js +1 -1
  23. package/dist/vite.esm.js +1 -1
  24. package/package.json +16 -8
  25. package/skill/SKILL.md +7 -6
  26. package/skill/references/api-protocol.md +6 -3
  27. package/skill/references/api-root.md +6 -2
  28. package/skill/references/cli.md +16 -20
  29. package/skill/references/examples.md +2 -2
  30. package/skill/references/recipes.md +37 -0
  31. package/skill/references/safety-boundaries.md +1 -1
  32. package/skill/references/smoke-evaluation.md +1 -1
  33. package/skill/scripts/sync-references.mjs +6 -6
  34. package/skill/skill.json +4 -4
  35. package/types/index.d.ts +1 -1
  36. package/types/modules/share/copy-link.d.ts +16 -0
  37. package/types/modules/share/extra.d.ts +3 -0
  38. package/types/modules/share/index.d.ts +8 -2
  39. package/types/modules/share/types.d.ts +11 -0
  40. package/types/protocol/capabilities.d.ts +1 -1
  41. package/types/protocol/dev-session.d.ts +13 -0
  42. package/types/protocol.d.ts +2 -2
  43. package/dist/cli-chunks/dev-j7W9R7ew.cjs +0 -2769
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.4-alpha.6
4
+
5
+ ### SDK / CLI
6
+
7
+ - Browser Dev Host 增加私有双栈连接,并继续保留现有 HTTP/SSE fallback;连接不可用时仍可按原调试流程工作。
8
+ - Mobile 二维码统一使用 `open_inapp` 与 `heybox://` `openWindow` 包装的局域网短链接;短链返回跳转页,打开完整 `heybox-mini-dev://sandbox` 协议后延迟调用 `closeWindow` 关闭中间页。移除不再需要的 `--raw-protocol` 与 `--runtime-url` 参数。
9
+ - `hb-sdk dev` 不再支持匿名调试;启动 Browser、Mac 或 Mobile 调试前必须完成 CLI 登录并绑定小程序,且远端 Dev Context 必须可用。
10
+ - PC/Mac 与移动端的原生启动、账号、网络、存储和权限契约保持不变,本版本不要求更新原生客户端。
11
+ - Mobile 调试短链使用 LAN HTTP,只应在受信局域网内使用;不要在公共或不受信网络中暴露调试服务。
12
+ - Browser Dev Host 的 `network.request` 代理允许办公网、Tailscale 与 Clash fake-ip 解析到的本机/局域网地址;仍拒绝 metadata、NAT64 和跨 origin redirect。
13
+ - Browser Mock 使用 Node 中的 `hb-sdk login` 会话代发 Host `heybox-session` 请求,调试页去掉 Bridge/User 状态和登录按钮,改为简单授权弹窗。凭证不下发到浏览器。
14
+
15
+ ## 0.7.4-alpha.5
16
+
17
+ ### Share extra
18
+
19
+ - `share.showShareMenu()` 支持携带 JSON-compatible `extra`,新增 `share.copyLink()` 复制并返回相同格式的通用分享链接;链接启动后可通过同步 `share.getExtra()` 恢复页面状态。
20
+
3
21
  ## 0.7.4-alpha.4
4
22
 
5
23
  ### SDK
package/README.md CHANGED
@@ -110,7 +110,7 @@ SDK 还提供 `getHandshakeState()` / `onHandshakeStateChange()` 管理持久握
110
110
  | ------------ | ------------------------------------------------------------ |
111
111
  | `auth` | 获取交给开发者服务端交换的短期授权码 |
112
112
  | `user` | 读取 Host 当前用户资料、隔离身份或撤销授权 |
113
- | `share` | 打开分享或截图分享流程 |
113
+ | `share` | 打开分享、复制链接或截图分享流程 |
114
114
  | `ui` | 展示 Toast 和 Loading |
115
115
  | `device` | 调用振动和剪贴板能力 |
116
116
  | `navigation` | 关闭、刷新页面或打开小黑盒页面 |
@@ -139,6 +139,22 @@ SDK 还提供 `getHandshakeState()` / `onHandshakeStateChange()` 管理持久握
139
139
  - 仅当远端已启用 `network.request` 时,`hb-sdk dev` 与 `hb-sdk remote deploy` 构建才会跳过平台 CSP;其他构建继续注入平台 CSP。`useOfficialDomain` 不参与 CSP 跳过判定。
140
140
  - 构建必须启用 `miniappManifest()`,推荐统一使用 `hb-sdk build`。
141
141
 
142
+ ## 分享扩展数据
143
+
144
+ 默认分享和复制链接可以携带小程序自行定义的页面状态:
145
+
146
+ ```ts
147
+ await hbSDK.share.showShareMenu({
148
+ title: '排行榜',
149
+ desc: '查看当前排名',
150
+ extra: { page: 'ranking', options: [1, 2, 3] },
151
+ });
152
+
153
+ const sharedState = hbSDK.share.getExtra();
154
+ ```
155
+
156
+ `extra` 只支持 JSON-compatible 数据,没有有效数据时 `getExtra()` 返回 `undefined`。完整的路由示例和参数限制见[社区分享预置](https://docs.xiaoheihe.cn/hb_sdk/recipes/community-share)。
157
+
142
158
  ## 云端排行榜
143
159
 
144
160
  删除当前用户的排行榜成绩属于破坏性操作,只能在明确的用户操作和二次确认后执行:
@@ -183,6 +199,8 @@ hb-sdk remote deploy --release-note "本次更新说明"
183
199
  | `hb-sdk build` | 执行生产构建与产物校验,不包含类型检查 |
184
200
  | `hb-sdk remote deploy` | 构建、上传并提交当前版本审核 |
185
201
 
202
+ `hb-sdk dev` 不要求升级 Android、iOS 或 Mac 客户端。启动前必须先运行 `hb-sdk login` 并通过 `hb-sdk remote create` 或 `hb-sdk remote bind` 绑定小程序;未登录、未绑定或远端 Dev Context 不可用时不会启动 Vite、Browser Dev Host、Mac 或 Mobile 调试入口。Browser Mock 会自动在实时与兼容链路间切换;Mobile 统一使用 `open_inapp` 与 `heybox://` `openWindow` 包装的局域网短链 `http://<lan-ip>:<browser-dev-host-port>/l/<token>`。短链返回跳转页,先打开带 `heybox-mini-dev://sandbox`、`mini_url`、身份、启动票和 LAN Dev Context 的完整协议,约 500ms 后再发 `closeWindow` 关掉中间页。调试页权限覆盖只影响本地状态,不会修改线上配置。完整操作见 [CLI 指南](https://docs.xiaoheihe.cn/hb_sdk/guide/cli),实现与安全边界由 [Runtime Host 迁移](./docs/runtime-host-migration.md) 维护。
203
+
186
204
  远端提交前需要完成 CLI 登录和小程序绑定。完整的登录、绑定、预览、版本与发布流程见 [CLI 指南](https://docs.xiaoheihe.cn/hb_sdk/guide/cli)。
187
205
 
188
206
  ## 文档
@@ -5,8 +5,8 @@ var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
6
  var runtimePermissionEnv = require('./runtime-permission-env-D-8_jPG3.cjs');
7
7
  var runtimeGate = require('./runtime-gate-CtV7rWyX.cjs');
8
- var index = require('./index-CyEqCbeu.cjs');
9
- var projectVite = require('./project-vite-BUY9DgYo.cjs');
8
+ var index = require('./index-DxQgKWRT.cjs');
9
+ var projectVite = require('./project-vite-D_NNB_Ib.cjs');
10
10
  require('node:async_hooks');
11
11
  require('node:module');
12
12
  require('path');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var session = require('./session-BUjFX2U2.cjs');
3
+ var session = require('./session-C2zY7XHn.cjs');
4
4
  var runtimePermissionEnv = require('./runtime-permission-env-D-8_jPG3.cjs');
5
5
  var fs$1 = require('node:fs');
6
6
  var fs = require('node:fs/promises');
@@ -45,6 +45,23 @@ function isRecord(value) {
45
45
  return typeof value === 'object' && value !== null && !Array.isArray(value);
46
46
  }
47
47
 
48
+ function parseBrowserDevPermissionState(value) {
49
+ if (!isPlainRecord(value) || !hasExactKeys(value, ['networkRequest']))
50
+ return undefined;
51
+ const networkRequest = value.networkRequest;
52
+ if (!isPlainRecord(networkRequest) || !hasExactKeys(networkRequest, ['status', 'useOfficialDomain']))
53
+ return undefined;
54
+ if (networkRequest.status !== 'enabled' && networkRequest.status !== 'disabled')
55
+ return undefined;
56
+ if (typeof networkRequest.useOfficialDomain !== 'boolean')
57
+ return undefined;
58
+ return {
59
+ networkRequest: {
60
+ status: networkRequest.status,
61
+ useOfficialDomain: networkRequest.useOfficialDomain,
62
+ },
63
+ };
64
+ }
48
65
  function shouldSkipMiniappPlatformCsp(runtimePermissions) {
49
66
  const parsed = parseMiniProgramRuntimePermissions(runtimePermissions);
50
67
  const networkRequest = parsed.permissions['network.request'];
@@ -87,6 +104,13 @@ function cloneDefaultPermissionState() {
87
104
  networkRequest: { ...DEFAULT_PERMISSION_STATE.networkRequest },
88
105
  };
89
106
  }
107
+ function isPlainRecord(value) {
108
+ return typeof value === 'object' && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
109
+ }
110
+ function hasExactKeys(value, keys) {
111
+ const actualKeys = Object.keys(value);
112
+ return actualKeys.length === keys.length && keys.every((key) => Object.hasOwn(value, key));
113
+ }
90
114
 
91
115
  function createRemoteApiClient(options) {
92
116
  return {
@@ -401,6 +425,7 @@ exports.createBrowserDevRuntimePermissions = createBrowserDevRuntimePermissions;
401
425
  exports.createLocalDevLaunchToken = createLocalDevLaunchToken;
402
426
  exports.createRemoteApiClientForEnvironment = createRemoteApiClientForEnvironment;
403
427
  exports.getBoundMiniProgram = getBoundMiniProgram;
428
+ exports.parseBrowserDevPermissionState = parseBrowserDevPermissionState;
404
429
  exports.parseMiniProgramRuntimePermissions = parseMiniProgramRuntimePermissions;
405
430
  exports.readBoundMiniProgramId = readBoundMiniProgramId;
406
431
  exports.readBoundMiniProgramIdFromPackageJson = readBoundMiniProgramIdFromPackageJson;
@@ -5,7 +5,7 @@ var fs = require('node:fs/promises');
5
5
  var path = require('node:path');
6
6
  var require$$0 = require('fs');
7
7
  var require$$1 = require('path');
8
- var index = require('./index-CyEqCbeu.cjs');
8
+ var index = require('./index-DxQgKWRT.cjs');
9
9
  require('node:module');
10
10
  require('os');
11
11
  require('readline');