@heybox/hb-sdk 0.8.1-alpha.2 → 0.8.1-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 (65) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +58 -4
  3. package/dist/cli-chunks/{build-FQoALfGC.cjs → build-B0X9pazW.cjs} +16 -10
  4. package/dist/cli-chunks/{context-CA_Q1lyH.cjs → context-DVfWZ6d1.cjs} +8 -3
  5. package/dist/cli-chunks/{create-BjIl4hy4.cjs → create-CyQWVxCA.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-CiPQYsW_.cjs → dev-DP7WtQOo.cjs} +465 -117
  7. package/dist/cli-chunks/{doctor-CS6c3n-W.cjs → doctor-D6l-ONq-.cjs} +1 -1
  8. package/dist/cli-chunks/{index-BEn7WaqA.cjs → index-CDwwaNvP.cjs} +87 -15
  9. package/dist/cli-chunks/{index-CsP_x6y6.cjs → index-DvOPzPxS.cjs} +2 -2
  10. package/dist/cli-chunks/{index.esm-DeEc_-uV.cjs → index.esm-B8pX0BrZ.cjs} +9 -8
  11. package/dist/cli-chunks/{login-BENCVgaQ.cjs → login-Dt-FHzpL.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-BO8oOfcs.cjs → project-vite-CE7kyqxl.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-IiVCXcSq.cjs → remote-Be6PeR-n.cjs} +41 -28
  14. package/dist/cli-chunks/{runtime-gate-BMSY22AL.cjs → runtime-gate-BWb8QIcX.cjs} +0 -107
  15. package/dist/cli-chunks/{runtime-permission-env-BPRwn4Yc.cjs → runtime-permission-env-DWSscWBT.cjs} +304 -23
  16. package/dist/cli-chunks/{session-C0eIKZ6V.cjs → session-DZXRQ4Dp.cjs} +1 -1
  17. package/dist/cli-chunks/{skill-DpInwbiA.cjs → skill-B8GWL2KT.cjs} +83 -27
  18. package/dist/cli-chunks/{version-BONZQWPR.cjs → version-D19lZmYN.cjs} +1 -1
  19. package/dist/cli.cjs +1 -1
  20. package/dist/devtools/browser-dev-host/assets/browser-dev-host-Bb43BPMS.js +101 -0
  21. package/dist/devtools/browser-dev-host/assets/desktop-app-launch-DnPRjCa3.js +6 -0
  22. package/dist/devtools/browser-dev-host/assets/index-D-aNERAr.css +1 -0
  23. package/dist/devtools/browser-dev-host/assets/index-Dh5wRj5c.js +567 -0
  24. package/dist/devtools/browser-dev-host/index.html +3 -3
  25. package/dist/index.cjs.js +1893 -1562
  26. package/dist/index.esm.js +1893 -1563
  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 +8 -8
  37. package/skill/SKILL.md +10 -5
  38. package/skill/references/api-protocol.md +3 -3
  39. package/skill/references/api-root.md +225 -210
  40. package/skill/references/cli.md +9 -3
  41. package/skill/references/examples.md +13 -1
  42. package/skill/references/recipes.md +161 -0
  43. package/skill/references/safety-boundaries.md +7 -1
  44. package/skill/skill.json +5 -5
  45. package/types/core/client.d.ts +2 -0
  46. package/types/core/sdk.d.ts +3 -0
  47. package/types/core/singleton.d.ts +3 -0
  48. package/types/devtools/device-logs.d.ts +48 -0
  49. package/types/index.d.ts +3 -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/protocol/dev-session.d.ts +6 -0
  61. package/types/vite/index.d.ts +11 -4
  62. package/dist/devtools/browser-dev-host/assets/browser-dev-host-DzEst9n7.js +0 -99
  63. package/dist/devtools/browser-dev-host/assets/index-B-NHlLsr.js +0 -567
  64. package/dist/devtools/browser-dev-host/assets/index-P-ra4m1y.css +0 -1
  65. package/dist/devtools/browser-dev-host/assets/workbench-state-BwV7bm4n.js +0 -5
@@ -115,6 +115,12 @@ 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
+
118
124
  Browser Mock 会自动在实时与兼容链路间切换。手机调试使用 `open_inapp`/`openWindow` 包裹的 LAN 短链接二维码(先开普通 H5 跳转页,再进入小程序并关闭中间页)。
119
125
 
120
126
  ### 2. 先用浏览器 Mock 验收
@@ -125,7 +131,7 @@ Browser Mock 会自动在实时与兼容链路间切换。手机调试使用 `op
125
131
  - SDK 初始化与用户身份授权流程
126
132
  - 生命周期、Storage 和排行榜等能力
127
133
 
128
- 调试台提供紧凑的日志、当前小程序隔离作用域内的 Storage 只读快照和问题聚合。日志与网络记录只保留脱敏的诊断字段,不展示 payload、结果、查询参数、凭据或原始错误信息。工坊小程序默认不能进行网络请求,网络权限暂未开放申请,不要把本地结果当成线上能力。
134
+ 调试台提供结构化日志、当前小程序隔离作用域内的 Storage 只读快照和问题聚合。日志按 App、SDK、Network、Runtime、Host 标识来源,首行展示事件与毫秒级时间,第二行展示结果、耗时和摘要;连续重复的 console 会合并计数。每条记录可展开查看脱敏详情,并可按来源、级别或搜索词筛选。日志与网络记录不展示请求体、响应体、header、查询参数、凭据或原始错误对象。工坊小程序默认不能进行网络请求,网络权限暂未开放申请,不要把本地结果当成线上能力。
129
135
 
130
136
  右侧可切换 iPhone 16 Pro Max(`387 x 821`)与 Pixel 9 Pro(`322 x 716`)两个设备预设。尺寸对应固定上游设备外框的真实屏幕 opening;预设同时决定外框、状态栏、安全区和 viewport。切换设备不会重新加载小程序或重启 Runtime,页面状态和调试会话保持不变。授权与操作弹窗、Toast、Loading 和振动反馈均显示在设备预览内部,不会覆盖整个调试台。
131
137
 
@@ -162,7 +168,7 @@ Browser Mock uses the Node `hb-sdk login` session to send Host `heybox-session`
162
168
  hb-sdk build [--env <name>] [--verbose]
163
169
  ```
164
170
 
165
- `hb-sdk build` 直接使用项目安装的 Vite,先清理再生成固定的 `dist/`,并校验小程序入口、Manifest 和可上传产物。它不执行类型检查,不要求 CLI 登录或绑定小程序,也不访问远端服务。项目必须在 `vite.config.ts` 中显式注册 `miniappManifest()`。
171
+ `hb-sdk build` 直接使用项目安装的 Vite,先清理再生成固定的 `dist/`,并校验小程序入口、Manifest 和可上传产物。它不执行类型检查,不要求 CLI 登录或绑定小程序,也不访问远端服务。项目必须在 `package.json#heybox.platforms` 声明目标平台,并在 `vite.config.ts` 中显式注册无参的 `miniappManifest()`;配置与构建产物不一致时构建失败。
166
172
 
167
173
  直接运行 `hb-sdk build` 或 `vite build` 时默认注入平台 CSP。`hb-sdk remote deploy` 会在构建前读取绑定小程序的远端批准结果,并与当前版本声明取交集;仅当有效 `network` 权限启用时才跳过平台 CSP,`useOfficialDomain` 不参与该判定。权限缺失、非法或读取失败时继续注入,Runtime Gate、Manifest 与 HTML 构建检查始终保留。
168
174
 
@@ -181,7 +187,7 @@ hb-sdk build [--env <name>] [--verbose]
181
187
  Agent rules:
182
188
 
183
189
  - 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`.
190
+ - Require target platforms in `package.json#heybox.platforms`, keep the no-argument `miniappManifest()` configured, and keep typechecking in the project's `scripts.build`.
185
191
  - Do not claim `hb-sdk build` needs login, binding, or network access, and do not invent unsupported build flags.
186
192
  - Existing `vite build` projects remain compatible and must not be auto-migrated.
187
193
 
@@ -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
 
@@ -416,6 +420,10 @@ try {
416
420
  - `ENVIRONMENT_NOT_READY` 表示在 SDK 完成握手前调用了 `environment.getInfoSync()`;一般改用会自动等待的 `environment.getInfo()`。
417
421
  - `FILE_PICKER_CANCELLED` 表示用户取消了外部文件或目录选择,应正常结束当前操作。
418
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` 或操作系统拦截都不能绕过;停止重试并修正归档后提交新审核版本。
419
427
  - `DOWNLOAD_HTTP_STATUS` 的 `data` 只包含脱敏后的 `status`、可选 `statusText` 和安全响应头。
420
428
  - 超时或运行环境不可用时,允许用户重试或退出当前流程。
421
429
  - 上报 `code`、`message` 和必要的业务上下文,不要上报用户凭据或敏感数据。
@@ -469,6 +477,159 @@ function reportSDKError(errorCode: string, message: string, data?: unknown) {
469
477
  picker 取消、授权撤销、文件缺失、quota、下载状态或取消,不依赖 `message` 文案,也不要记录
470
478
  真实路径、内部 handle 或响应凭据头。
471
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
+
472
633
  ## Login gate recipe
473
634
 
474
635
 
@@ -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.1-alpha.2+skill.99494863257b",
3
+ "skillVersion": "0.8.1-alpha.6+skill.079dd19d1630",
4
4
  "sdk": {
5
5
  "package": "@heybox/hb-sdk",
6
- "version": "0.8.1-alpha.2",
7
- "compatibility": "0.8.1-alpha.2"
6
+ "version": "0.8.1-alpha.6",
7
+ "compatibility": "0.8.1-alpha.6"
8
8
  },
9
9
  "distribution": {
10
10
  "type": "npm",
11
11
  "package": "@heybox/hb-sdk",
12
- "version": "0.8.1-alpha.2",
12
+ "version": "0.8.1-alpha.6",
13
13
  "path": "skill"
14
14
  },
15
- "integrity": "sha256-99494863257b8e51843a42bb94c2e40555a1cc28f11ca0f7da37473e19424bdf"
15
+ "integrity": "sha256-079dd19d16302a5e71519d30312ad45aa1e0c05546e52f71dac6d7bf2fac238f"
16
16
  }
@@ -31,6 +31,8 @@ export interface MiniProgramOperationOptions<TProgress = unknown> {
31
31
  signal?: AbortSignal;
32
32
  onProgress?: (progress: TProgress) => void;
33
33
  createAbortError?: () => unknown;
34
+ /** Long Host operations can survive observer teardown. */
35
+ cancelOnAbort?: boolean;
34
36
  }
35
37
  /** 支持 request-scoped progress/cancel 的 bridge requester。 */
36
38
  export interface MiniProgramOperationRequester extends MiniProgramRequester {
@@ -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';
@@ -49,6 +50,8 @@ export declare class MiniProgramSDK {
49
50
  readonly navigation: MiniProgramNavigationModule;
50
51
  /** 云端数据相关开放能力。 */
51
52
  readonly cloud: MiniProgramCloudModule;
53
+ /** 受管桌面程序能力。 */
54
+ readonly companion: MiniProgramCompanionModule;
52
55
  /** 当前实例的环境信息。 */
53
56
  readonly environment: MiniProgramEnvironmentModule;
54
57
  constructor(options?: MiniProgramSDKOptions);
@@ -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';
@@ -104,6 +105,8 @@ export declare const device: MiniProgramDeviceModule;
104
105
  export declare const navigation: MiniProgramNavigationModule;
105
106
  /** 默认 SDK 实例的 cloud 模块。 */
106
107
  export declare const cloud: MiniProgramCloudModule;
108
+ /** 默认 SDK 实例的受管桌面程序模块。 */
109
+ export declare const companion: MiniProgramCompanionModule;
107
110
  /** 默认 SDK 实例的 environment 模块。 */
108
111
  export declare const environment: MiniProgramEnvironmentModule;
109
112
  /** 重置默认 SDK 实例,仅用于测试。 */
@@ -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, environment, 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';
@@ -34,5 +35,6 @@ declare const hbSDK: {
34
35
  environment: import(".").MiniProgramEnvironmentModule;
35
36
  navigation: import(".").MiniProgramNavigationModule;
36
37
  cloud: import(".").MiniProgramCloudModule;
38
+ companion: import(".").MiniProgramCompanionModule;
37
39
  };
38
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;
@@ -1,4 +1,5 @@
1
1
  import { type MiniappPermissionDeclarations } from './permissions';
2
+ import type { MiniappCompanionManifestDeclarations } from './companion-types';
2
3
  export declare const MINIAPP_TEMPLATE_VERSION = "0.0.0";
3
4
  export declare const MINIAPP_PLATFORM_VALUES: readonly ["android", "ios", "ohos", "windows", "macos", "linux"];
4
5
  export type MiniappPlatform = (typeof MINIAPP_PLATFORM_VALUES)[number];
@@ -8,6 +9,7 @@ export interface MiniappManifest {
8
9
  version: string;
9
10
  platforms: readonly MiniappPlatform[];
10
11
  permissions?: MiniappPermissionDeclarations;
12
+ companions?: MiniappCompanionManifestDeclarations;
11
13
  }
12
14
  export interface ParseMiniappManifestResult {
13
15
  manifest: MiniappManifest;
@@ -19,7 +21,8 @@ export declare function validateMiniappManifestVersion(version: unknown, sourceL
19
21
  export declare function renderMiniappManifest(manifest: MiniappManifest): string;
20
22
  export declare function parseMiniappManifestJson(raw: string, sourceLabel?: string): ParseMiniappManifestResult;
21
23
  export declare function validateMiniappManifestForDeploy(manifest: MiniappManifest): {
22
- permissions?: Partial<Record<"userInfo" | "steamLibrary" | "share" | "storage" | "filesystem" | "clipboard" | "leaderboard", import("./permissions").SimpleMiniappPermissionDeclaration> & {
24
+ companions?: MiniappCompanionManifestDeclarations | undefined;
25
+ permissions?: Partial<Record<"userInfo" | "steamLibrary" | "share" | "storage" | "filesystem" | "clipboard" | "leaderboard" | "companion", import("./permissions").SimpleMiniappPermissionDeclaration> & {
23
26
  network: import("./permissions").NetworkMiniappPermissionDeclaration;
24
27
  }> | undefined;
25
28
  version: string;
@@ -27,4 +30,5 @@ export declare function validateMiniappManifestForDeploy(manifest: MiniappManife
27
30
  platforms: readonly ("android" | "ios" | "ohos" | "windows" | "macos" | "linux")[];
28
31
  };
29
32
  export declare function validateMiniappPlatforms(platforms: unknown, sourceLabel?: string): readonly MiniappPlatform[];
33
+ export declare function areMiniappPlatformsEqual(left: readonly MiniappPlatform[], right: readonly MiniappPlatform[]): boolean;
30
34
  export declare function validateSdkVersion(version: unknown, sourceLabel?: string): string;
@@ -2,6 +2,8 @@ export declare const MINIAPP_UPLOAD_SCOPE = "activity";
2
2
  export declare const ACTIVITY_UPLOAD_KEY_MAX_LENGTH = 64;
3
3
  export declare const MINIAPP_UPLOAD_BATCH_SIZE = 50;
4
4
  export declare const MINIAPP_UPLOAD_TOTAL_SIZE_LIMIT_BYTES: number;
5
+ /** Phase 0 尚未冻结;当前仅作为可单点替换、可测试的保守临时上限。 */
6
+ export declare const MINIAPP_COMPANION_UPLOAD_TEMPORARY_SIZE_LIMIT_BYTES: number;
5
7
  export declare const USER_MINIPROGRAM_ACCESS_STATUS_API_PATH = "/mall/developer/user_miniprogram/access_status";
6
8
  export declare const DEVELOPER_ENTITY_LIST_API_PATH = "/mall/developer/entity/list";
7
9
  export declare const DEVELOPER_ENTITY_SWITCH_API_PATH = "/mall/developer/entity/switch";
@@ -51,6 +53,10 @@ export interface ValidateUploadTotalSizeOptions {
51
53
  limitBytes?: number;
52
54
  }
53
55
  export declare function validateUploadTotalSize(items: UploadSizeItem[], options?: ValidateUploadTotalSizeOptions): "构建产物总大小超过 100MB,请删除未引用资源或压缩图片后重新 deploy" | undefined;
56
+ export declare function validateMiniappUploadSizeBudgets(items: UploadSizeItem[], options?: {
57
+ webLimitBytes?: number;
58
+ companionLimitBytes?: number;
59
+ }): "构建产物总大小超过 100MB,请删除未引用资源或压缩图片后重新 deploy" | "Companion 归档总大小超过当前 2GiB 临时上限,请缩减归档后重新 deploy" | undefined;
54
60
  export declare function shouldUploadDistFile(relativePath: string): boolean;
55
61
  /** 参与整包签名和上传会话映射的构建产物文件。 */
56
62
  export interface MiniappArtifactFile {
@@ -59,6 +65,11 @@ export interface MiniappArtifactFile {
59
65
  /** 文件字节数。 */
60
66
  size: number;
61
67
  }
68
+ /** 上传会话 v1 使用的逐文件完整性凭据。 */
69
+ export interface MiniappArtifactFileReceipt extends MiniappArtifactFile {
70
+ /** 文件内容 SHA-256,小写十六进制。 */
71
+ sha256: string;
72
+ }
62
73
  /** 服务端上传会话返回的文件映射。 */
63
74
  export interface MiniappUploadSessionFile {
64
75
  /** 与创建会话时提交值一致的相对路径。 */
@@ -67,6 +78,8 @@ export interface MiniappUploadSessionFile {
67
78
  key: string;
68
79
  /** 服务端记录的文件字节数。 */
69
80
  size: number;
81
+ /** 服务端固化的文件内容 SHA-256。 */
82
+ sha256: string;
70
83
  }
71
84
  /**
72
85
  * 校验构建产物路径和大小,并按路径 UTF-8 字节序排序。
@@ -118,14 +131,16 @@ export declare function resolveMiniappUploadSessionFiles<T extends MiniappArtifa
118
131
  files: {
119
132
  file: T & {
120
133
  relativePath: string;
121
- };
134
+ } & Record<"sha256", unknown>;
122
135
  key: string;
123
136
  }[];
124
137
  missingFiles: {
125
138
  file: T & {
126
139
  relativePath: string;
127
- };
140
+ } & Record<"sha256", unknown>;
128
141
  key: string;
129
142
  }[];
130
143
  uploadedKeys: string[];
131
144
  };
145
+ /** 校验 Manifest 中所有 Companion 归档都精确属于当前上传 receipt。 */
146
+ export declare function validateMiniappCompanionFileReceipts(companions: unknown, files: readonly MiniappArtifactFileReceipt[]): void;