@heybox/hb-sdk 0.8.0 → 0.8.1-alpha.10

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 (69) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/README.md +80 -7
  3. package/dist/cli-chunks/{build-PYCNacya.cjs → build-CtqIXxDL.cjs} +16 -10
  4. package/dist/cli-chunks/{context-m2W2XbL0.cjs → context-t57bMfbr.cjs} +17 -3
  5. package/dist/cli-chunks/{create-BdAg3WGA.cjs → create-BDOPSacf.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-CyZuw7Yn.cjs → dev-VxjconYc.cjs} +628 -147
  7. package/dist/cli-chunks/{doctor-DU8rCfUF.cjs → doctor-BkfYdlnZ.cjs} +1 -1
  8. package/dist/cli-chunks/{index-MMW2ibQm.cjs → index-DDrytLTX.cjs} +87 -15
  9. package/dist/cli-chunks/{index-DATObqzK.cjs → index-lLaHzwfT.cjs} +2 -2
  10. package/dist/cli-chunks/{index.esm-BiAaAUFC.cjs → index.esm-Dy4qRhuo.cjs} +9 -8
  11. package/dist/cli-chunks/{login-B3TThMss.cjs → login-D2EX4R5_.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-BQj8YLI4.cjs → project-vite-CFhz2THK.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-DNvI7tHH.cjs → remote-CfESZxO2.cjs} +41 -28
  14. package/dist/cli-chunks/{runtime-gate-BEFp1w_s.cjs → runtime-gate-BWb8QIcX.cjs} +0 -107
  15. package/dist/cli-chunks/{runtime-permission-env-CtL8rsjB.cjs → runtime-permission-env-BtTDFqEL.cjs} +304 -23
  16. package/dist/cli-chunks/{session-DjBkjaF8.cjs → session-Dkhwjqhm.cjs} +1 -1
  17. package/dist/cli-chunks/{skill-cR_wnaw2.cjs → skill-DOveC5jt.cjs} +83 -27
  18. package/dist/cli-chunks/{version-yEn1E2Bg.cjs → version-C4nE66sX.cjs} +1 -1
  19. package/dist/cli.cjs +1 -1
  20. package/dist/devtools/browser-dev-host/assets/browser-dev-host-BM9Qo_Ta.js +101 -0
  21. package/dist/devtools/browser-dev-host/assets/desktop-app-launch-C2I333Yn.js +6 -0
  22. package/dist/devtools/browser-dev-host/assets/index-Bnb6MMTv.js +567 -0
  23. package/dist/devtools/browser-dev-host/assets/index-D-aNERAr.css +1 -0
  24. package/dist/devtools/browser-dev-host/index.html +3 -3
  25. package/dist/index.cjs.js +1970 -1567
  26. package/dist/index.esm.js +1969 -1568
  27. package/dist/miniapp-publish.cjs.js +61 -0
  28. package/dist/miniapp-publish.esm.js +59 -1
  29. package/dist/protocol.cjs.js +64 -13
  30. package/dist/protocol.esm.js +64 -13
  31. package/dist/templates/vanilla-vite-js/README.md.ejs +1 -1
  32. package/dist/templates/vanilla-vite-js/package.json.ejs +1 -0
  33. package/dist/templates/vanilla-vite-js/vite.config.js +1 -1
  34. package/dist/vite.cjs.js +1333 -18
  35. package/dist/vite.esm.js +1334 -20
  36. package/package.json +9 -11
  37. package/skill/SKILL.md +11 -3
  38. package/skill/references/api-protocol.md +8 -4
  39. package/skill/references/api-root.md +328 -210
  40. package/skill/references/cli.md +11 -3
  41. package/skill/references/examples.md +13 -1
  42. package/skill/references/recipes.md +162 -0
  43. package/skill/references/safety-boundaries.md +9 -3
  44. package/skill/skill.json +5 -5
  45. package/types/core/client.d.ts +9 -1
  46. package/types/core/sdk.d.ts +6 -0
  47. package/types/core/singleton.d.ts +6 -0
  48. package/types/devtools/device-logs.d.ts +48 -0
  49. package/types/index.d.ts +5 -1
  50. package/types/miniapp-manifest/companion-directory.d.ts +2 -0
  51. package/types/miniapp-manifest/companion-executable.d.ts +4 -0
  52. package/types/miniapp-manifest/companion-types.d.ts +38 -0
  53. package/types/miniapp-manifest/companions.d.ts +17 -0
  54. package/types/miniapp-manifest/index.d.ts +2 -0
  55. package/types/miniapp-manifest/node.d.ts +9 -0
  56. package/types/miniapp-manifest/permissions.d.ts +1 -1
  57. package/types/miniapp-manifest/schema.d.ts +5 -1
  58. package/types/miniapp-publish/index.d.ts +17 -2
  59. package/types/modules/companion/index.d.ts +57 -0
  60. package/types/modules/environment/index.d.ts +70 -0
  61. package/types/modules/network/index.d.ts +1 -4
  62. package/types/modules/network/observability.d.ts +0 -1
  63. package/types/protocol/dev-session.d.ts +8 -1
  64. package/types/protocol.d.ts +1 -1
  65. package/types/vite/index.d.ts +11 -4
  66. package/dist/devtools/browser-dev-host/assets/browser-dev-host-TzYf9L6C.js +0 -99
  67. package/dist/devtools/browser-dev-host/assets/index-C5MZZDa5.js +0 -567
  68. package/dist/devtools/browser-dev-host/assets/index-P-ra4m1y.css +0 -1
  69. package/dist/devtools/browser-dev-host/assets/workbench-state-BwV7bm4n.js +0 -5
@@ -115,6 +115,14 @@ CLI 会启动页面服务并自动打开 Vue 3 本地调试台。左侧集中放
115
115
 
116
116
  `hb-sdk dev` 从项目 `package.json` 读取开发者声明,并在远端权限快照可用时读取平台批准结果。只有当前版本声明且平台已批准 `network` 时才跳过平台 CSP;`useOfficialDomain` 不参与该判定。调试台不提供权限或平台批准修改入口;快照缺失或无效时保留平台 CSP。
117
117
 
118
+ 调试台右上角的桌面图标与手机二维码按钮使用相同样式。点击桌面图标后选择小黑盒正式版或 Debug 版,选择后立即请求客户端打开当前本地小程序,不需要再点一次确认;上次选择的客户端会在本地记忆。桌面调试只接受无凭据的 `http://127.0.0.1:<port>`,拒绝 `localhost`、IPv6 和 LAN 地址,不提供地址选择;手机二维码仍维护独立的局域网选择。项目未绑定或本地调试启动票不可用时,菜单会显示不可用原因。
119
+
120
+ 桌面打开使用 `ai-desktop://v1/extensions/ai-desktop.heybox-user-miniprogram/open`,Debug 客户端使用 `ai-desktop-debug://`。URI 只包含 `mini_program_id` 与 `mini_url`,不包含启动票、权限快照或客户端执行参数;detail 仍从 `mini_url` 同源的 `/__hb_sdk__/launch.json` 读取最新启动事实并由后端验证。浏览器无法取得外部协议的可靠完成回执,所以界面只显示“已请求打开”,不会声明成功,也不会自动 fallback 到另一个客户端。
121
+
122
+ 本地真 PC 调试 Companion 不要求先上传版本,但必须在 `package.json#heybox.companions` 中配置本地 ZIP、绑定项目,并由 COA 批准 `companion`;`miniappManifest()` 只保留构建配置。dev server 只向 loopback 提供 canonical Manifest 与固定 ZIP 路由;CLI 在签发或刷新本地启动票时绑定 Manifest 摘要。配置或 ZIP 变化后会校验并切换到新快照,已有 Session 保持原有产物,新产物须重新准备与启动。调试台分别展示浏览器、手机与 PC Companion 的就绪状态,以及本地 alias、target 和摘要短前缀;产物缺失、校验失败或授权不可用时显示明确阻塞原因,不影响浏览器联调。没有本地 Companion 配置时仍可使用 Browser Fake 做状态联调,但真实 PC Companion 会 fail closed。
123
+
124
+ 手机 Dev Session 仅使用当前版本声明与平台批准结果求交后的有效权限,不接受调试页本地覆盖。两者均允许 `useOfficialDomain: true` 时,真机扫码调试会保留该配置;未批准、未声明或非法快照继续 fail closed。
125
+
118
126
  Browser Mock 会自动在实时与兼容链路间切换。手机调试使用 `open_inapp`/`openWindow` 包裹的 LAN 短链接二维码(先开普通 H5 跳转页,再进入小程序并关闭中间页)。
119
127
 
120
128
  ### 2. 先用浏览器 Mock 验收
@@ -125,7 +133,7 @@ Browser Mock 会自动在实时与兼容链路间切换。手机调试使用 `op
125
133
  - SDK 初始化与用户身份授权流程
126
134
  - 生命周期、Storage 和排行榜等能力
127
135
 
128
- 调试台提供紧凑的日志、当前小程序隔离作用域内的 Storage 只读快照和问题聚合。日志与网络记录只保留脱敏的诊断字段,不展示 payload、结果、查询参数、凭据或原始错误信息。工坊小程序默认不能进行网络请求,网络权限暂未开放申请,不要把本地结果当成线上能力。
136
+ 调试台提供结构化日志、当前小程序隔离作用域内的 Storage 只读快照和问题聚合。日志按 App、SDK、Network、Runtime、Host 标识来源,首行展示事件与毫秒级时间,第二行展示结果、耗时和摘要;连续重复的 console 会合并计数。每条记录可展开查看脱敏详情,并可按来源、级别或搜索词筛选。日志与网络记录不展示请求体、响应体、header、查询参数、凭据或原始错误对象。工坊小程序默认不能进行网络请求,网络权限暂未开放申请,不要把本地结果当成线上能力。
129
137
 
130
138
  右侧可切换 iPhone 16 Pro Max(`387 x 821`)与 Pixel 9 Pro(`322 x 716`)两个设备预设。尺寸对应固定上游设备外框的真实屏幕 opening;预设同时决定外框、状态栏、安全区和 viewport。切换设备不会重新加载小程序或重启 Runtime,页面状态和调试会话保持不变。授权与操作弹窗、Toast、Loading 和振动反馈均显示在设备预览内部,不会覆盖整个调试台。
131
139
 
@@ -162,7 +170,7 @@ Browser Mock uses the Node `hb-sdk login` session to send Host `heybox-session`
162
170
  hb-sdk build [--env <name>] [--verbose]
163
171
  ```
164
172
 
165
- `hb-sdk build` 直接使用项目安装的 Vite,先清理再生成固定的 `dist/`,并校验小程序入口、Manifest 和可上传产物。它不执行类型检查,不要求 CLI 登录或绑定小程序,也不访问远端服务。项目必须在 `vite.config.ts` 中显式注册 `miniappManifest()`。
173
+ `hb-sdk build` 直接使用项目安装的 Vite,先清理再生成固定的 `dist/`,并校验小程序入口、Manifest 和可上传产物。它不执行类型检查,不要求 CLI 登录或绑定小程序,也不访问远端服务。项目必须在 `package.json#heybox.platforms` 声明目标平台,并在 `vite.config.ts` 中显式注册无参的 `miniappManifest()`;配置与构建产物不一致时构建失败。
166
174
 
167
175
  直接运行 `hb-sdk build` 或 `vite build` 时默认注入平台 CSP。`hb-sdk remote deploy` 会在构建前读取绑定小程序的远端批准结果,并与当前版本声明取交集;仅当有效 `network` 权限启用时才跳过平台 CSP,`useOfficialDomain` 不参与该判定。权限缺失、非法或读取失败时继续注入,Runtime Gate、Manifest 与 HTML 构建检查始终保留。
168
176
 
@@ -181,7 +189,7 @@ hb-sdk build [--env <name>] [--verbose]
181
189
  Agent rules:
182
190
 
183
191
  - Use `hb-sdk build [--env <name>] [--verbose]` as the recommended production build entry.
184
- - Require explicit `miniappManifest()` configuration and keep typechecking in the project's `scripts.build`.
192
+ - Require target platforms in `package.json#heybox.platforms`, keep the no-argument `miniappManifest()` configured, and keep typechecking in the project's `scripts.build`.
185
193
  - Do not claim `hb-sdk build` needs login, binding, or network access, and do not invent unsupported build flags.
186
194
  - Existing `vite build` projects remain compatible and must not be auto-migrated.
187
195
 
@@ -165,13 +165,21 @@ hb-sdk login clear
165
165
 
166
166
  ### Vite manifest plugin
167
167
 
168
+ ```json
169
+ {
170
+ "heybox": {
171
+ "platforms": ["android", "ios", "ohos"]
172
+ }
173
+ }
174
+ ```
175
+
168
176
  ```ts
169
177
  import { miniappManifest } from '@heybox/hb-sdk/vite';
170
178
  import { defineConfig } from 'vite';
171
179
 
172
180
  export default defineConfig({
173
181
  base: './',
174
- plugins: [miniappManifest({ platforms: ['android', 'ios', 'ohos'] })],
182
+ plugins: [miniappManifest()],
175
183
  });
176
184
  ```
177
185
 
@@ -187,6 +195,10 @@ export default defineConfig({
187
195
  - Do not send `multipart/form-data` (or handcrafted multipart bodies) through `network.request`; use form-urlencoded string body or a dedicated upload capability.
188
196
  - Do not pass string paths, browser File System Access handles, Blob targets, Range/resume fields, or upload bodies to `network.download`; use SDK-created File/Directory handles on new PC.
189
197
  - Do not treat Mobile, Web, Browser Dev Host, or legacy PC as evidence for files/download support. Only new PC currently implements the retained contract; other Hosts return `METHOD_FORBIDDEN` and provide no memory fallback.
198
+ - Do not pass executable paths, dynamic args, cwd, environment variables, shell commands, URLs, hashes, or native process identifiers to `companion`. Only the reviewed Manifest may define launch inputs.
199
+ - Treat `companion.prepare()` and `companion.launch()` as separate trusted-user-gesture and Host-authorization operations. Launch never prepares implicitly.
200
+ - Companion stdio is raw `Uint8Array` with at-least-once output delivery. Business protocols own framing, sequence de-duplication, replay, and reconnection.
201
+ - Browser Dev Host Companion Fake is deterministic development feedback only; never cite it as Windows/macOS executable, integrity, elevation, or process-tree evidence.
190
202
  - Do not treat `hb-sdk login` as iframe SDK authentication state.
191
203
  - Do not create a second mock runtime package when `hb-sdk dev` is the supported local mock workflow.
192
204
  - Do not import `@heybox/hb-sdk/vite` from iframe business code or fetch a deployed `manifest.json` directly.
@@ -8,6 +8,7 @@
8
8
  - apps/docs/hb-sdk/guide/auth.md
9
9
  - apps/docs/hb-sdk/guide/lifecycle.md
10
10
  - apps/docs/hb-sdk/guide/error-handling.md
11
+ - apps/docs/hb-sdk/guide/companion.md
11
12
  - apps/docs/hb-sdk/recipes/login-gate.md
12
13
  - apps/docs/hb-sdk/recipes/community-share.md
13
14
  - apps/docs/hb-sdk/recipes/custom-instance.md
@@ -18,6 +19,7 @@
18
19
  - [User and login](#user-and-login)
19
20
  - [Lifecycle events](#lifecycle-events)
20
21
  - [Error handling](#error-handling)
22
+ - [Managed Companion](#managed-companion)
21
23
  - [Login gate recipe](#login-gate-recipe)
22
24
  - [Community share recipe](#community-share-recipe)
23
25
  - [Custom instance recipe](#custom-instance-recipe)
@@ -372,6 +374,8 @@ onUnmounted(stopLifecycleEvents)
372
374
  - 组件或页面销毁时清理 `on` 注册的监听,避免重复响应。
373
375
  - 生命周期事件只派发给注册当时存在的监听器,不会重放;一次性 `launch` 信息应在页面启动阶段通过业务能力调用处理。
374
376
  - 收到 `unload` 后,当前 SDK 上下文不可恢复,未完成请求会失败;不要在同一页面上下文继续重试能力调用。
377
+ - Companion preparation 与进程 Session 由 Host 持有,页面 `hide` 或 reload 不会自动取消或终止;新页面分别通过 `getPreparationStatus()` 与 `getActiveSession()` 恢复观察和控制。
378
+ - 新 Runtime generation 取得活动 Companion Session 后,旧 controller 会收到 ownership-lost 并失去写权限;stdio 输出可能 at-least-once 重放,业务必须按自身协议去重。
375
379
 
376
380
  ## Error handling
377
381
 
@@ -413,8 +417,13 @@ try {
413
417
  - `AUTHORIZATION_CANCELLED` 表示用户取消、拒绝或关闭授权页面,应正常结束当前操作。
414
418
  - `SERVER_API_REQUIRED` 表示当前用户数据必须经开发者服务端 OpenAPI 获取,不应在页面重试对应 Host API。
415
419
  - `METHOD_FORBIDDEN` 表示当前 Host 未实现或关闭对应能力。V1 files/download 在 Mobile、Web 和 Browser Dev Host 都会得到该错误。
420
+ - `ENVIRONMENT_NOT_READY` 表示在 SDK 完成握手前调用了 `environment.getInfoSync()`;一般改用会自动等待的 `environment.getInfo()`。
416
421
  - `FILE_PICKER_CANCELLED` 表示用户取消了外部文件或目录选择,应正常结束当前操作。
417
422
  - `DOWNLOAD_CANCELLED` 表示取消意图先于 Host 提交生效;Host 已完成提交时仍返回成功。`DOWNLOAD_TIMEOUT` 表示网络空闲超时,失败不会改动原目标。
423
+ - `COMPANION_NOT_PREPARED` 表示启动前尚未显式准备;应由新的用户操作调用 `companion.prepare()`,不要在 `launch()` 中自动重试。
424
+ - `COMPANION_SESSION_OWNERSHIP_LOST` 表示 Session controller 已由新的 Runtime generation 接管;停止旧 controller 写入,需要继续取得控制权时重新取得活动 Session。
425
+ - `COMPANION_DESCRIPTOR_UNAVAILABLE` 表示授权或描述符暂时不可用,Runtime 会保留 `retryable: true`。
426
+ - `COMPANION_INTEGRITY_FAILED`、`COMPANION_ARCHIVE_INVALID` 或操作系统拦截都不能绕过;停止重试并修正归档后提交新审核版本。
418
427
  - `DOWNLOAD_HTTP_STATUS` 的 `data` 只包含脱敏后的 `status`、可选 `statusText` 和安全响应头。
419
428
  - 超时或运行环境不可用时,允许用户重试或退出当前流程。
420
429
  - 上报 `code`、`message` 和必要的业务上下文,不要上报用户凭据或敏感数据。
@@ -468,6 +477,159 @@ function reportSDKError(errorCode: string, message: string, data?: unknown) {
468
477
  picker 取消、授权撤销、文件缺失、quota、下载状态或取消,不依赖 `message` 文案,也不要记录
469
478
  真实路径、内部 handle 或响应凭据头。
470
479
 
480
+ Companion 失败仍使用 `HbMiniProgramSDKError`。prepare 与 launch 的授权取消属于两次独立用户决定;业务不得在一次点击中自动串联授权,也不得用 Browser Fake 成功替代 Windows/macOS 真机错误处理验证。完整状态机见[受管桌面程序](https://docs.xiaoheihe.cn/hb_sdk/guide/companion)。
481
+
482
+ ## Managed Companion
483
+
484
+
485
+ # 受管桌面程序
486
+
487
+ `companion` 用于准备和启动随当前小程序审核版本发布的桌面辅助应用。V1 仅支持新 PC Host 的
488
+ `windows-x64` 与 `macos-arm64`;老 PC、Mobile、Web 和 Linux 不在支持范围内。
489
+
490
+ ## 声明与构建
491
+
492
+ 项目必须在 `package.json` 显式声明高风险权限:
493
+
494
+ ```json
495
+ {
496
+ "heybox": {
497
+ "permissions": {
498
+ "companion": { "enabled": true }
499
+ },
500
+ "companions": {
501
+ "runner": {
502
+ "displayName": "桌面辅助程序",
503
+ "capabilities": ["stdio"],
504
+ "targets": {
505
+ "windows-x64": {
506
+ "source": "companion/runner-windows-x64",
507
+ "entrypoint": { "kind": "executable", "path": "runner.exe" },
508
+ "elevation": "none",
509
+ "args": []
510
+ }
511
+ }
512
+ }
513
+ }
514
+ }
515
+ }
516
+ ```
517
+
518
+ 归档统一通过 `package.json#heybox.companions` 配置,`source` 相对该 `package.json` 所在目录解析。
519
+ Vite 中使用 `miniappManifest({ platforms: ['windows'] })` 等构建配置;不要在 Vite 配置中复制 Companion 声明。
520
+ 构建和本地调试读取同一份声明。构建会检查 ZIP 结构和固定入口,复制到
521
+ `dist/companions/<alias>/<target>.zip`,并生成大小与 SHA-256;Web 文件和 Companion 文件进入同一上传
522
+ session 与同一审核版本。页面不能读取部署后的 `manifest.json`,也不能取得真实 CDN URL 或本机安装路径。
523
+
524
+ `hb-sdk dev` 的真实 PC 联调可以直接使用这里声明的本地 ZIP,不要求先上传版本,但项目必须已绑定且 COA
525
+ 批准 `companion`。dev server 只向 loopback 提供固定 Manifest/ZIP 路由,CLI 用短期票据绑定当前 dev
526
+ 进程的 canonical snapshot。ZIP 或配置变化后会校验并切换到新快照,已有 Session 保持原有产物;
527
+ 新产物必须重新准备并启动。校验失败时调试台显示阻塞原因,不会悄悄使用旧文件或线上产物。
528
+ 单次开发服务最多保留 32 份快照、累计 ZIP 大小 1 GiB;达到上限后停止接纳新快照,
529
+ 请先结束调试 Session,再重启开发服务,已有快照不会被自动逐出。
530
+ 未配置本地 Companion 时使用 Browser Fake 做状态联调,真实 PC 不会回退到线上 candidate。
531
+
532
+ 构建与 PC 安装都会检查真实二进制格式:Windows 为 AMD64 PE,macOS 为包含 arm64 的 Mach-O;
533
+ 脚本即使改名或有执行权限也会被拒绝。授权弹窗展示产物来源与签名状态,本地 ZIP 明确标记
534
+ “本地开发产物,未经过版本审核”。
535
+ `.app` 从 XML 或 binary Info.plist 的 `CFBundleExecutable` 精确选择主入口。
536
+
537
+ Manifest 只接受固定入口和固定 args。V1 仅支持普通权限启动,`elevation` 只能省略或设为 `none`;
538
+ `required` 会在构建时明确失败,管理员权限启动留待后续版本。公开 API 不接受 executable path、动态 args、
539
+ cwd、environment、shell 或任意命令;不要把 `files.sandbox` 中的普通文件当作可执行对象。
540
+ `displayName` 最多 120 个 Unicode code point;args 最多 64 项,单项最多 1024 UTF-8 bytes、总计最多
541
+ 16384 UTF-8 bytes,并拒绝 NUL、CR 和 LF。
542
+
543
+ ## 准备与启动
544
+
545
+ ```ts
546
+ import { companion } from '@heybox/hb-sdk'
547
+
548
+ // 分别绑定到「准备」与「启动」按钮,不能在一个点击中串联。
549
+ function prepareFromUserAction() {
550
+ return companion.prepare('runner', {
551
+ onProgress(progress) {
552
+ renderProgress(progress)
553
+ },
554
+ })
555
+ }
556
+
557
+ function launchFromUserAction() {
558
+ return companion.launch('runner')
559
+ }
560
+ ```
561
+
562
+ `prepare()` 和 `launch()` 必须分别由新的可信用户手势触发。每次真正开始新的准备操作前,Runtime 展示一次
563
+ Host 可信授权;已 ready 或加入同一在途准备时不会重复授权。每次真正创建新进程前,`launch()` 再展示独立
564
+ 授权,不能复用 prepare 的手势或授权。`launch()` 不会隐式调用 `prepare()`,未准备时稳定失败。
565
+
566
+ 准备操作属于 Host:页面 reload、最小化或进入后台不会取消。新页面可用
567
+ `getPreparationStatus()` 查询状态,并通过相同 alias 加入在途操作;显式取消使用
568
+ `cancelPreparation(alias)` 或 `AbortSignal`。页面 reload 只断开观察者,不会向 Host 发送取消;原子提交已经开始时,最终提交结果优先于取消意图。
569
+
570
+ ## Session 与 stdio
571
+
572
+ 同一小程序 identity 与 alias 同时最多有一个活动 Session。`getActiveSession(alias)` 会取得当前活动 Session
573
+ 的控制权;新 Runtime generation 接管后,旧 controller 的写入、关闭 stdin、终止、附件和通知操作都会失败。
574
+ 进程退出后 `getActiveSession()` 返回 `undefined`,业务结果应由小程序自行持久化。
575
+
576
+ stdio 仅在 Manifest 声明 `stdio` 时存在,输入输出都是原始 `Uint8Array`。SDK 不做 UTF-8、换行、NDJSON、
577
+ RPC 或业务状态解析。输出采用 at-least-once 投递,收到 chunk 后 SDK 会确认 sequence;断连与重取控制权可能
578
+ 导致重复,因此业务 framing 必须携带可去重标识,并能处理拆包、粘包和重放。
579
+
580
+ ```ts
581
+ const session = await companion.getActiveSession('runner')
582
+ if (session?.stdio) {
583
+ const stop = session.stdio.onStdout(bytes => decodeBusinessFrame(bytes))
584
+ await session.stdio.write(encodeBusinessFrame({ type: 'status' }))
585
+ // 组件销毁时调用 stop();业务退出协议可先写入,再 closeStdin()。
586
+ }
587
+ ```
588
+
589
+ 平台不提供语义跨平台不稳定的 request-close。业务可先通过自身 stdio 协议请求正常退出,或关闭 stdin;
590
+ `terminate()` 是强制结束完整受管进程树。页面隐藏或 reload 不结束 Session,用户真正关闭小程序窗口时由 Host
591
+ 处理完整进程树生命周期。
592
+
593
+ ## 可选能力
594
+
595
+ - `attachments`:`session.attachments.open(id)` 返回只读 `FileHandle`;opaque id 来自桌面程序自身业务协议,页面无法指定物理路径。
596
+ - `notifications`:页面解析业务协议后,可请求 Host 展示固定类别通知;页面完全断开时不承诺业务通知。
597
+ - `stdio`:仅提供原始字节双向流,不提供文本编码或 RPC。
598
+
599
+ 只有 Manifest 声明且 Host 实现的能力才出现在 Session。不要根据操作系统或属性存在性猜测支持情况。
600
+
601
+ ## 调试与验收
602
+
603
+ 调试台分别显示浏览器、手机与 PC Companion 的就绪状态,以及本地 alias、平台和产物摘要短前缀。
604
+ PC 会在页面闲置时继续复核授权;明确撤销权限会结束进程树,临时网络故障只允许有时限的宽限,
605
+ 不会让已失去授权的进程无限运行。关闭开发服务前请先停止调试进程。
606
+
607
+ Browser Dev Host 只提供确定性的 Fake 场景,用于开发准备进度、Session 状态、stdio framing、错误 UI 与恢复逻辑。
608
+ Fake 不选择、不下载、不解压、不启动本机程序,也不经过操作系统安全检查或真实进程组。
609
+ 因此 Browser Fake、Mobile 或 Web 的结果不能作为桌面发布证据;发布前必须分别在目标 Windows/macOS 新 PC Host
610
+ 完成归档摘要、准备取消、启动、stdio、退出与进程树清理验收。
611
+
612
+ ## 失败处理
613
+
614
+ - `USER_GESTURE_REQUIRED`:当前 prepare 或 launch 缺少新的可信用户手势。
615
+ - `USER_CANCELLED`:用户拒绝或关闭本次 Host 授权,应正常结束流程。
616
+ - `COMPANION_NOT_PREPARED`:先由新的用户操作显式调用 `prepare()`。
617
+ - `COMPANION_INTEGRITY_FAILED` / `COMPANION_ARCHIVE_INVALID`:停止重试并提交新审核版本,不能绕过摘要或系统安全检查。
618
+ - `COMPANION_SESSION_OWNERSHIP_LOST`:当前 Runtime 已失去 controller;需要时重新调用 `getActiveSession()`。
619
+ - `COMPANION_DESCRIPTOR_UNAVAILABLE`:授权或描述符暂时不可用,可在有界重试策略下重试。
620
+ - `COMPANION_ELEVATION_DENIED`:为未来管理员权限启动保留的兼容错误码;V1 构建不接受 `elevation: 'required'`。
621
+ - `METHOD_FORBIDDEN` / `COMPANION_UNSUPPORTED`:当前 Host 或平台未实现,不要循环重试或用任意执行替代。
622
+
623
+ 完整类型与方法见 [API Reference](https://docs.xiaoheihe.cn/hb_sdk/reference/)。
624
+
625
+ ## 完成检查
626
+
627
+ - 权限、目标 ZIP、固定入口和固定参数都随同一版本提交审核。
628
+ - prepare 与 launch 使用两次独立可信用户操作和 Host 授权。
629
+ - stdio 业务协议处理了原始字节 framing、at-least-once 去重和断连恢复。
630
+ - 未向页面暴露或传入 URL、物理路径、动态 args、环境变量、shell 或 PID。
631
+ - Browser Fake 只用于开发,目标平台均已完成新 PC 真机验收。
632
+
471
633
  ## Login gate recipe
472
634
 
473
635
 
@@ -18,12 +18,12 @@
18
18
  - `auth.login()`、`user.getInfo()` 和 `user.getSteamGameList()` 的可用性不由 `network` 决定;它们分别要求 `userInfo` 或 `steamLibrary`,并继续遵循各自的用户授权和数据规则。
19
19
  - `user.revokeAuthorization()` 在两种网络模式下都要求可信用户手势;成功后必须停止使用并清理业务缓存的旧身份、资料和服务端会话。
20
20
  - `on()` 返回取消监听函数,组件卸载或页面销毁时需要调用。
21
- - 业务网络请求使用 `network.request()`,不要依赖浏览器原生网络出口。
21
+ - 现有业务网络请求仍使用 `network.request()`;该 API 已标记废弃,但目前没有替代调用入口,不要依赖浏览器原生网络出口。
22
22
  - 公开 `network.request()` 与 `network.download()` 均使用 no-follow redirect policy;3xx 不会在 Host 内静默跳转。
23
23
  - `network.request()` 不能访问平台保留的 runtime auth 与 OpenAPI 内部路径;页面不得持有或交换服务端应用凭据。
24
24
  - `network.request` 不支持 `multipart/form-data`;App Host 仅支持 form(`application/x-www-form-urlencoded`)与 JSON。表单请用 `URLSearchParams#toString()` 作为 `data`,文件上传请走专用上传能力。
25
25
  - 新 PC 开放持久 sandbox、单文件/目录 picker、精确 File 保存与公网 `network.download()`;多选和小黑盒域名流式下载暂不支持。Mobile、Web 与 Browser Dev Host 仍未开放这些 primitive。
26
- - PC 支持 `network.request`,但会忽略 `withCredentials`;它不改变请求路由或凭据行为。其他平台继续遵循各自的 Host 语义。
26
+ - `withCredentials` 不再是支持的配置字段,也不会进入新 SDK、协议或 Host contract;旧 SDK 构建产物的 wire 字段仅由 Runtime 兼容忽略。Mobile 对官方 HTTPS 默认端口目标自动启用 Native Cookie,第三方关闭;应用可显式提供 `Cookie`、`Authorization` 等请求头。`Origin`、`Referer`、`User-Agent` Host 接管;`Host`、分帧及逐跳请求头由传输层管理,不能由小程序设置。Web Host 使用浏览器 Fetch,无法发送显式 `Cookie` 等浏览器禁止的头,会返回 `REQUEST_UNSUPPORTED`;需要第三方 Cookie 会话时请在支持原始请求头的 Mobile/PC Host 验收。
27
27
  - 新 PC 不支持振动、分享菜单和截图分享;`navigation.openAppPage` 仅支持 `game_detail`,用户/帖子详情会明确失败。调用平台相关能力时应处理 `METHOD_FORBIDDEN` 或 `REQUEST_UNSUPPORTED`。
28
28
  - picker 必须来自可信用户手势;取消选择返回 `FILE_PICKER_CANCELLED`。`saveFile()` 只接受 `suggestedName`,不接受 `accept`。
29
29
  - `pickFiles()` / `pickDirectory()` 默认只读;`pickFiles()` 仅在显式传入 `multiple: true` 时允许 Host 返回多个文件。要写入或作为下载目标时显式请求 `mode: 'readwrite'`。
@@ -35,7 +35,13 @@
35
35
  - Host 文件错误只保留稳定 code 与 canonical 安全文案;原始 message、data、native path 和 credential 不会进入小程序。
36
36
  - `FileStat.size` 是非负 safe integer;`modifiedAt` / `createdAt` 若存在,单位为 Unix epoch milliseconds。
37
37
  - 仅当当前版本声明且平台已批准 `network` 时,`hb-sdk dev` 与 `hb-sdk remote deploy` 构建才会跳过平台 CSP;其他构建继续注入平台 CSP。`useOfficialDomain` 不参与 CSP 跳过判定。
38
- - 构建必须启用 `miniappManifest({ platforms })` 并显式声明实际承诺适配的平台,推荐统一使用 `hb-sdk build`。新项目模板中的 `['android', 'ios', 'ohos']` 只是初始配置,不代表已经完成真机验收。
38
+ - 构建必须启用 `miniappManifest()`,并在 `package.json#heybox.platforms` 显式声明实际承诺适配的平台,推荐统一使用 `hb-sdk build`。新项目模板中的 `['android', 'ios', 'ohos']` 只是初始配置,不代表已经完成真机验收。
39
+ - `companion.prepare()` 与 `companion.launch()` 分别需要新的可信用户手势和 Host 授权;启动不会隐式准备。
40
+ - Companion 入口、参数、平台目标和归档摘要只来自 canonical Manifest;线上与生产使用当前已发布版本,本地真 PC 调试使用 `hb-sdk dev` 固定并签发的本地 snapshot。页面不能传动态 path、args、cwd、环境变量或 shell。
41
+ - Companion V1 只支持普通权限启动;`elevation: 'required'` 会在构建阶段失败。
42
+ - Companion stdio 是原始 `Uint8Array` 且输出为 at-least-once 投递;业务自行定义 framing、去重、重放与恢复。
43
+ - Browser Dev Host 的 Companion Fake 只用于状态和 UI 开发,不能作为桌面程序可执行、签名、权限或进程监管的真机证据。
44
+ - 本地真 PC Companion 需要 `package.json#heybox.companions`、本地产物、已绑定项目和 COA `companion` 批准;未配置本地产物时使用 Browser Fake。配置或产物更新后校验并切换不可变快照;已有进程保留原产物,新产物须重新准备与启动。
39
45
 
40
46
  私有 Page Channel 适配没有修改 `@heybox/hb-sdk` 公开 API 或 iframe wire;本次 files/download
41
47
  Runtime 能力随 `0.8.0-alpha.11` release family 发布,部署 detail 前必须保证
package/skill/skill.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "hb-sdk",
3
- "skillVersion": "0.8.0+skill.7bb8515ab71e",
3
+ "skillVersion": "0.8.1-alpha.10+skill.79d09c3b6cad",
4
4
  "sdk": {
5
5
  "package": "@heybox/hb-sdk",
6
- "version": "0.8.0",
7
- "compatibility": "0.8.0"
6
+ "version": "0.8.1-alpha.10",
7
+ "compatibility": "0.8.1-alpha.10"
8
8
  },
9
9
  "distribution": {
10
10
  "type": "npm",
11
11
  "package": "@heybox/hb-sdk",
12
- "version": "0.8.0",
12
+ "version": "0.8.1-alpha.10",
13
13
  "path": "skill"
14
14
  },
15
- "integrity": "sha256-7bb8515ab71e004724601d7e09d0e5058888b53a7486b7ed15535ba9a8cdb93c"
15
+ "integrity": "sha256-79d09c3b6cad5fe22962d813b7513e2ef23eda8f6ff5fb9ddc8d6778eb73a81f"
16
16
  }
@@ -1,4 +1,5 @@
1
1
  import { type MiniProgramSDKHandshakeState, type MiniProgramSDKHandshakeStateHandler } from './handshake-state';
2
+ import { type MiniProgramEnvironmentInfo, type MiniProgramEnvironmentReader } from '../modules/environment';
2
3
  import type { MiniProgramBridgeMethod, MiniProgramCapabilityPayload, MiniProgramCapabilityResult } from '../protocol/capabilities';
3
4
  import type { MiniProgramEventHandler, MiniProgramEventName } from '../protocol/types';
4
5
  /**
@@ -30,13 +31,15 @@ export interface MiniProgramOperationOptions<TProgress = unknown> {
30
31
  signal?: AbortSignal;
31
32
  onProgress?: (progress: TProgress) => void;
32
33
  createAbortError?: () => unknown;
34
+ /** Long Host operations can survive observer teardown. */
35
+ cancelOnAbort?: boolean;
33
36
  }
34
37
  /** 支持 request-scoped progress/cancel 的 bridge requester。 */
35
38
  export interface MiniProgramOperationRequester extends MiniProgramRequester {
36
39
  requestOperation<Method extends MiniProgramBridgeMethod, TProgress = unknown>(method: Method, payload: MiniProgramCapabilityPayload<Method>, options?: MiniProgramOperationOptions<TProgress>): Promise<MiniProgramCapabilityResult<Method>>;
37
40
  }
38
41
  /** 底层 bridge client,负责握手、请求响应、事件分发与超时清理。 */
39
- export declare class MiniProgramBridgeClient implements MiniProgramOperationRequester {
42
+ export declare class MiniProgramBridgeClient implements MiniProgramOperationRequester, MiniProgramEnvironmentReader {
40
43
  private readonly timeout;
41
44
  private readonly selfWindow?;
42
45
  private readonly targetWindow;
@@ -61,6 +64,7 @@ export declare class MiniProgramBridgeClient implements MiniProgramOperationRequ
61
64
  private destroyed;
62
65
  private runtimeUnavailable;
63
66
  private runtimeUnavailableError?;
67
+ private environmentInfo?;
64
68
  constructor(options?: MiniProgramSDKOptions);
65
69
  /** 等待父容器握手完成。 */
66
70
  waitForHandshake(): Promise<void>;
@@ -68,6 +72,10 @@ export declare class MiniProgramBridgeClient implements MiniProgramOperationRequ
68
72
  getHandshakeState(): MiniProgramSDKHandshakeState;
69
73
  /** 订阅握手状态,并立即接收当前状态。 */
70
74
  onHandshakeStateChange(handler: MiniProgramSDKHandshakeStateHandler): () => void;
75
+ /** 等待握手后读取当前实例的环境快照。 */
76
+ getEnvironmentInfo(): Promise<MiniProgramEnvironmentInfo>;
77
+ /** 同步读取握手期间缓存的环境快照。 */
78
+ getEnvironmentInfoSync(): MiniProgramEnvironmentInfo;
71
79
  /** 注册小程序事件监听。 */
72
80
  on<T extends MiniProgramEventName>(eventName: T, handler: MiniProgramEventHandler<T>): () => void;
73
81
  /** 移除小程序事件监听。 */
@@ -1,6 +1,7 @@
1
1
  import { type MiniProgramSDKOptions } from './client';
2
2
  import { type MiniProgramAuthModule } from '../modules/auth';
3
3
  import { type MiniProgramCloudModule } from '../modules/cloud';
4
+ import { type MiniProgramCompanionModule } from '../modules/companion';
4
5
  import { type MiniProgramShareModule } from '../modules/share';
5
6
  import { type MiniProgramStorageModule } from '../modules/storage';
6
7
  import { type MiniProgramNetworkModule } from '../modules/network';
@@ -9,6 +10,7 @@ import { type MiniProgramViewportModule } from '../modules/viewport';
9
10
  import { type MiniProgramUserModule } from '../modules/user';
10
11
  import { type MiniProgramUiModule } from '../modules/ui';
11
12
  import { type MiniProgramDeviceModule } from '../modules/device';
13
+ import { type MiniProgramEnvironmentModule } from '../modules/environment';
12
14
  import { type MiniProgramNavigationModule } from '../modules/navigation';
13
15
  import type { MiniProgramEventHandler, MiniProgramEventName } from '../protocol/types';
14
16
  import type { MiniProgramSDKHandshakeState, MiniProgramSDKHandshakeStateHandler } from './handshake-state';
@@ -48,6 +50,10 @@ export declare class MiniProgramSDK {
48
50
  readonly navigation: MiniProgramNavigationModule;
49
51
  /** 云端数据相关开放能力。 */
50
52
  readonly cloud: MiniProgramCloudModule;
53
+ /** 受管桌面程序能力。 */
54
+ readonly companion: MiniProgramCompanionModule;
55
+ /** 当前实例的环境信息。 */
56
+ readonly environment: MiniProgramEnvironmentModule;
51
57
  constructor(options?: MiniProgramSDKOptions);
52
58
  /** 获取当前握手状态。 */
53
59
  getHandshakeState(): MiniProgramSDKHandshakeState;
@@ -1,5 +1,6 @@
1
1
  import type { MiniProgramAuthModule } from '../modules/auth';
2
2
  import type { MiniProgramCloudModule } from '../modules/cloud';
3
+ import type { MiniProgramCompanionModule } from '../modules/companion';
3
4
  import type { MiniProgramShareModule } from '../modules/share';
4
5
  import type { MiniProgramStorageModule } from '../modules/storage';
5
6
  import type { MiniProgramNetworkModule } from '../modules/network';
@@ -8,6 +9,7 @@ import type { MiniProgramViewportModule } from '../modules/viewport';
8
9
  import type { MiniProgramUserModule } from '../modules/user';
9
10
  import type { MiniProgramUiModule } from '../modules/ui';
10
11
  import type { MiniProgramDeviceModule } from '../modules/device';
12
+ import type { MiniProgramEnvironmentModule } from '../modules/environment';
11
13
  import type { MiniProgramNavigationModule } from '../modules/navigation';
12
14
  import type { MiniProgramEventHandler, MiniProgramEventName } from '../protocol/types';
13
15
  import type { MiniProgramSDKHandshakeState, MiniProgramSDKHandshakeStateHandler } from './handshake-state';
@@ -103,5 +105,9 @@ export declare const device: MiniProgramDeviceModule;
103
105
  export declare const navigation: MiniProgramNavigationModule;
104
106
  /** 默认 SDK 实例的 cloud 模块。 */
105
107
  export declare const cloud: MiniProgramCloudModule;
108
+ /** 默认 SDK 实例的受管桌面程序模块。 */
109
+ export declare const companion: MiniProgramCompanionModule;
110
+ /** 默认 SDK 实例的 environment 模块。 */
111
+ export declare const environment: MiniProgramEnvironmentModule;
106
112
  /** 重置默认 SDK 实例,仅用于测试。 */
107
113
  export declare function resetDefaultSDKForTest(): void;
@@ -0,0 +1,48 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ export declare const DEVICE_LOG_PATH = "/__hb_sdk__/device-logs";
3
+ export declare function registerDeviceLogs(port: number, store: DeviceLogStore): () => void;
4
+ export declare function getDeviceLogs(appUrl: string): any;
5
+ export declare class DeviceLogStore {
6
+ private sandboxRequests;
7
+ listSandbox(id: string, path: string): Promise<unknown>;
8
+ readonly uploadToken: string;
9
+ readonly epoch: `${string}-${string}-${string}-${string}-${string}`;
10
+ private readonly expiresAt;
11
+ private cursor;
12
+ private logs;
13
+ private devices;
14
+ query(params: URLSearchParams): {
15
+ schemaVersion: number;
16
+ epoch: `${string}-${string}-${string}-${string}-${string}`;
17
+ items: {
18
+ cursor: number;
19
+ deviceSessionId: string;
20
+ sequence: number;
21
+ timestamp: number;
22
+ receivedAt: number;
23
+ level: string;
24
+ source: string;
25
+ message: string;
26
+ truncated: boolean;
27
+ method?: string;
28
+ callId?: string;
29
+ outcome?: string;
30
+ errorCode?: string;
31
+ durationMs?: number;
32
+ }[];
33
+ nextCursor: number;
34
+ hasMore: boolean;
35
+ gap: boolean;
36
+ devices: {
37
+ id: string;
38
+ name: string;
39
+ platform: string;
40
+ connectedAt: number;
41
+ lastSeen: number;
42
+ online: boolean;
43
+ }[];
44
+ };
45
+ upload(req: IncomingMessage, res: ServerResponse): Promise<void>;
46
+ }
47
+ /** 同源开发页面使用有界批量回传;传输失败不会递归写入 console。 */
48
+ export declare function deviceLogBootstrap(token: string): string;
package/types/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  export { HbMiniProgramSDKError, HbMiniProgramNetworkError } from './core/errors';
2
- export { getHandshakeState, onHandshakeStateChange, on, off, auth, user, share, viewport, storage, files, network, ui, device, navigation, cloud, } from './core/singleton';
2
+ export { getHandshakeState, onHandshakeStateChange, on, off, auth, user, share, viewport, storage, files, network, ui, device, environment, navigation, cloud, companion, } from './core/singleton';
3
3
  export type { MiniProgramSDKHandshakeState, MiniProgramSDKHandshakeStateHandler } from './core/handshake-state';
4
4
  export type { MiniProgramEventHandler, MiniProgramEventName, MiniProgramEventPayloadMap } from './protocol/types';
5
5
  export type { LoginOptions, LoginPayload, LoginResult, LoginScope, MiniProgramAuthModule } from './modules/auth';
6
+ export type { CompanionAttachments, CompanionCapability, CompanionExit, CompanionExitHandler, CompanionInfo, CompanionNotification, CompanionNotificationCategory, CompanionNotifications, CompanionOutputHandler, CompanionOwnershipLostHandler, CompanionPreparationStatus, CompanionPrepareOptions, CompanionPrepareProgress, CompanionSession, CompanionStdio, CompanionState, CompanionStateChangeHandler, CompanionTarget, MiniProgramCompanionModule, } from './modules/companion';
6
7
  export type { DeleteCurrentUserLeaderboardEntryPayload, DeleteCurrentUserLeaderboardEntryResult, GetCurrentUserLeaderboardEntryPayload, GetCurrentUserLeaderboardEntryResult, GetLeaderboardInfoPayload, GetLeaderboardInfoResult, GetLeaderboardListPayload, GetLeaderboardListResult, LeaderboardEntry, LeaderboardOrder, MiniProgramCloudLeaderboardModule, MiniProgramCloudModule, SubmitLeaderboardEntryPayload, SubmitLeaderboardEntryResult, } from './modules/cloud';
7
8
  export type { AuthorizedUserInfo, GetUserInfoPayload, GetUserInfoResult, RevokeAuthorizationPayload, RevokeAuthorizationResult, GetSteamGameListOptions, GetSteamGameListPayload, GetSteamGameListResult, MiniProgramUserInfoResult, MiniProgramUserModule, UserInfoAuthorization, UserInfoAuthorizationStatus, SteamGameListData, SteamGameListItem, SteamGamePrice, SteamGameListSort, } from './modules/user';
8
9
  export { USER_INFO_AUTHORIZATION_SCOPES } from './modules/user';
@@ -14,6 +15,7 @@ export type { DownloadBaseOptions, DownloadOptions, DownloadProgress, MiniProgra
14
15
  export type { CreateOptions, DirectoryHandle, FileHandle, FileMode, FileStat, FileSystem, FileSystemEntity, FilesModule, ListOptions, PathRoot, PickDirectoryOptions, PickFilesOptions, RemoveOptions, SaveFileOptions, } from './modules/files';
15
16
  export type { HideLoadingPayload, HideLoadingResult, MiniProgramToastStatus, MiniProgramUiModule, ShowLoadingPayload, ShowLoadingResult, ShowToastPayload, ShowToastResult, } from './modules/ui';
16
17
  export type { MiniProgramDeviceModule, MiniProgramVibrateIntensity, SetClipboardPayload, SetClipboardResult, VibratePayload, VibrateResult, } from './modules/device';
18
+ export type { MiniProgramEnvironmentInfo, MiniProgramEnvironmentModule, MiniProgramOperatingSystemName, MiniProgramRuntimeMode, } from './modules/environment';
17
19
  export type { ClosePayload, CloseResult, MiniProgramAppPageTarget, MiniProgramGameDetailGameType, MiniProgramGameDetailPage, MiniProgramNavigationModule, OpenAppPageOptions, OpenAppPagePayload, OpenAppPageResult, OpenGameDetailAppPagePayload, OpenGameDetailAppPageOptions, OpenPostDetailAppPagePayload, OpenPostDetailAppPageOptions, OpenUserDetailAppPagePayload, OpenUserDetailAppPageOptions, ReloadPayload, ReloadResult, } from './modules/navigation';
18
20
  import { getHandshakeState, off, on, onHandshakeStateChange } from './core/singleton';
19
21
  declare const hbSDK: {
@@ -30,7 +32,9 @@ declare const hbSDK: {
30
32
  network: import(".").MiniProgramNetworkModule;
31
33
  ui: import(".").MiniProgramUiModule;
32
34
  device: import(".").MiniProgramDeviceModule;
35
+ environment: import(".").MiniProgramEnvironmentModule;
33
36
  navigation: import(".").MiniProgramNavigationModule;
34
37
  cloud: import(".").MiniProgramCloudModule;
38
+ companion: import(".").MiniProgramCompanionModule;
35
39
  };
36
40
  export default hbSDK;
@@ -0,0 +1,2 @@
1
+ /** 双次读取校验输入稳定性;保留 .app 安全链接以避免破坏签名。 */
2
+ export declare function packCompanionDirectory(root: string, label: string): Buffer;
@@ -0,0 +1,4 @@
1
+ /** 检查原生入口的文件格式与目标架构;文件后缀和执行位不能代替此门禁。 */
2
+ export declare function assertCompanionExecutable(bytes: Buffer, target: 'windows-x64' | 'macos-arm64'): void;
3
+ /** 只解析 bundle 主字典的 CFBundleExecutable,兼容 XML 与 binary plist。 */
4
+ export declare function companionBundleExecutable(plist: Buffer): string;
@@ -0,0 +1,38 @@
1
+ export declare const MINIAPP_COMPANION_TARGETS: readonly ["windows-x64", "macos-arm64"];
2
+ export declare const MINIAPP_COMPANION_CAPABILITIES: readonly ["stdio", "attachments", "notifications"];
3
+ export type MiniappCompanionTarget = (typeof MINIAPP_COMPANION_TARGETS)[number];
4
+ export type MiniappCompanionCapability = (typeof MINIAPP_COMPANION_CAPABILITIES)[number];
5
+ export interface MiniappCompanionAuthoringTarget {
6
+ /** 相对 package.json 所在目录的产物目录;SDK 在调试和构建时自动打包。 */
7
+ source: string;
8
+ entrypoint: {
9
+ kind: 'executable' | 'app-bundle';
10
+ path: string;
11
+ };
12
+ /** V1 仅支持普通权限启动;省略时等同于 `none`。 */
13
+ elevation?: 'none';
14
+ args?: readonly string[];
15
+ }
16
+ export interface MiniappCompanionAuthoringDefinition {
17
+ displayName: string;
18
+ capabilities?: readonly MiniappCompanionCapability[];
19
+ targets: Partial<Record<MiniappCompanionTarget, MiniappCompanionAuthoringTarget>>;
20
+ }
21
+ export type MiniappCompanionAuthoringDeclarations = Record<string, MiniappCompanionAuthoringDefinition>;
22
+ export interface MiniappCompanionManifestTarget {
23
+ path: string;
24
+ size: number;
25
+ sha256: string;
26
+ entrypoint: {
27
+ kind: 'executable' | 'app-bundle';
28
+ path: string;
29
+ };
30
+ elevation: 'none';
31
+ args: string[];
32
+ }
33
+ export interface MiniappCompanionManifestDefinition {
34
+ displayName: string;
35
+ capabilities: MiniappCompanionCapability[];
36
+ targets: Partial<Record<MiniappCompanionTarget, MiniappCompanionManifestTarget>>;
37
+ }
38
+ export type MiniappCompanionManifestDeclarations = Record<string, MiniappCompanionManifestDefinition>;
@@ -0,0 +1,17 @@
1
+ import { type MiniappCompanionAuthoringDeclarations, type MiniappCompanionManifestDeclarations, type MiniappCompanionTarget } from './companion-types';
2
+ export * from './companion-types';
3
+ interface PrepareMiniappCompanionsOptions {
4
+ root: string;
5
+ outputRoot: string;
6
+ platforms?: readonly string[];
7
+ /** 本地调试仅准备当前 PC 目标;构建省略此项,校验全部目标。 */
8
+ targets?: readonly MiniappCompanionTarget[];
9
+ copyArtifacts?: boolean;
10
+ onPreparedArtifact?: (artifact: {
11
+ archive: Buffer;
12
+ path: string;
13
+ size: number;
14
+ sourcePath: string;
15
+ }) => void;
16
+ }
17
+ export declare function prepareMiniappCompanions(declarations: MiniappCompanionAuthoringDeclarations | undefined, options: PrepareMiniappCompanionsOptions): MiniappCompanionManifestDeclarations | undefined;
@@ -1,3 +1,5 @@
1
1
  export * from './schema';
2
2
  export * from './node';
3
3
  export * from './permissions';
4
+ export * from './companions';
5
+ export * from './companion-types';
@@ -1,4 +1,13 @@
1
1
  import { type ParsedMiniappPermissions } from './permissions';
2
+ import type { MiniappCompanionAuthoringDeclarations } from './companion-types';
3
+ import type { MiniappPlatform } from './schema';
2
4
  export declare function readMiniappVersionFromPackageJson(root: string): string;
5
+ /** Companion source 始终相对声明所在 package.json,而非 Vite 的 HTML root。 */
6
+ export declare function readMiniappCompanionsFromPackageJson(root: string): {
7
+ declarations: MiniappCompanionAuthoringDeclarations | undefined;
8
+ projectRoot: string;
9
+ packageJsonPath: string;
10
+ };
11
+ export declare function readMiniappPlatformsFromPackageJson(root: string): readonly MiniappPlatform[];
3
12
  export declare function readMiniappPermissionsFromPackageJson(root: string, sdkVersion: string): ParsedMiniappPermissions;
4
13
  export declare function resolveMiniappSdkVersion(): string;
@@ -1,5 +1,5 @@
1
1
  import { type MiniProgramPermissionKey, type MiniProgramRuntimePermissionsSnapshot } from '@heybox/hb-sdk-protocol';
2
- export declare const MINIAPP_PERMISSION_KEYS: readonly ["userInfo", "steamLibrary", "share", "storage", "filesystem", "clipboard", "leaderboard", "network"];
2
+ export declare const MINIAPP_PERMISSION_KEYS: readonly ["userInfo", "steamLibrary", "share", "storage", "filesystem", "clipboard", "leaderboard", "network", "companion"];
3
3
  export type MiniappPermissionKey = MiniProgramPermissionKey;
4
4
  export interface SimpleMiniappPermissionDeclaration {
5
5
  enabled: true;