@heybox/hb-sdk 0.9.1-alpha.1 → 0.9.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 (114) hide show
  1. package/CHANGELOG.md +117 -2
  2. package/README.md +43 -5
  3. package/dist/card-controller.cjs.js +194 -0
  4. package/dist/card-controller.esm.js +159 -0
  5. package/dist/cli-chunks/_commonjs-dynamic-modules-DUamuDzp.cjs +7 -0
  6. package/dist/cli-chunks/{build-C5jFqooo.cjs → build-BK0MOduC.cjs} +15 -7
  7. package/dist/cli-chunks/{context-BkvtRlQM.cjs → context-D7AFyc_9.cjs} +14 -14
  8. package/dist/cli-chunks/{create-uHfLV3qo.cjs → create-C-pAXZR_.cjs} +5 -3
  9. package/dist/cli-chunks/{dev-BGgykbLg.cjs → dev-CONKtd6c.cjs} +59 -14
  10. package/dist/cli-chunks/{doctor-Cfn2luVo.cjs → doctor-D18leeH7.cjs} +8 -5
  11. package/dist/cli-chunks/{index-B0eNYO7I.cjs → index-BWRDIX1T.cjs} +7851 -486
  12. package/dist/cli-chunks/{index-DZQ84rXZ.cjs → index-DJoBhXcG.cjs} +9 -13
  13. package/dist/cli-chunks/{index.esm-I50IudW7.cjs → index.esm-CtAKePcf.cjs} +36 -37
  14. package/dist/cli-chunks/{login-BonS2uKg.cjs → login-BHq8vDRt.cjs} +36 -36
  15. package/dist/cli-chunks/{project-vite-BA_CFVq_.cjs → project-vite-DD3bmbqm.cjs} +1 -1
  16. package/dist/cli-chunks/{remote-NMK4n5ov.cjs → remote-DeLLzkXt.cjs} +71 -90
  17. package/dist/cli-chunks/runtime-gate-wKj1l5xM.cjs +201946 -0
  18. package/dist/cli-chunks/{runtime-permission-env-Bg7f-uj8.cjs → runtime-permission-env-DBra_0-U.cjs} +7012 -3305
  19. package/dist/cli-chunks/{skill-DV2oEH-I.cjs → skill-Cq3wjRBj.cjs} +9 -6
  20. package/dist/cli-chunks/{version-rxh3jOOI.cjs → version-BF4JQQCU.cjs} +1 -1
  21. package/dist/cli.cjs +10 -7
  22. package/dist/devtools/browser-dev-host/assets/browser-dev-host-C4b9nlYA.js +102 -0
  23. package/dist/devtools/browser-dev-host/assets/desktop-app-launch-DXmUwcoE.js +6 -0
  24. package/dist/devtools/browser-dev-host/assets/index-BRxbUJVN.css +1 -0
  25. package/dist/devtools/browser-dev-host/assets/{index-sykXQUSO.js → index-CVZ3CdPt.js} +4 -4
  26. package/dist/devtools/browser-dev-host/index.html +3 -3
  27. package/dist/index.cjs.js +6331 -280
  28. package/dist/index.esm.js +6331 -281
  29. package/dist/miniapp-publish.cjs.js +6613 -157
  30. package/dist/miniapp-publish.esm.js +6613 -158
  31. package/dist/protocol.cjs.js +5824 -0
  32. package/dist/protocol.esm.js +5823 -1
  33. package/dist/vite.cjs.js +7476 -206
  34. package/dist/vite.esm.js +7475 -207
  35. package/dist/workspace-card-build-sandbox-worker.mjs +72 -0
  36. package/package.json +33 -18
  37. package/skill/SKILL.md +15 -0
  38. package/skill/skill.json +5 -5
  39. package/types/card-controller.d.ts +3682 -0
  40. package/types/index.d.ts +7639 -35
  41. package/types/miniapp-publish/index.d.ts +542 -64
  42. package/types/protocol.d.ts +2094 -9
  43. package/types/vite/index.d.ts +25 -12
  44. package/dist/cli-chunks/runtime-gate-CKGRK3wC.cjs +0 -65
  45. package/dist/cli-chunks/session-XP1Y_N72.cjs +0 -3403
  46. package/dist/devtools/browser-dev-host/assets/browser-dev-host-CBMI8jM6.js +0 -102
  47. package/dist/devtools/browser-dev-host/assets/desktop-app-launch-DXfb_JMF.js +0 -6
  48. package/dist/devtools/browser-dev-host/assets/index-DRM3hPNc.css +0 -1
  49. package/types/core/client.d.ts +0 -108
  50. package/types/core/csp-violation.d.ts +0 -5
  51. package/types/core/errors.d.ts +0 -78
  52. package/types/core/event-bus.d.ts +0 -11
  53. package/types/core/handshake-state.d.ts +0 -54
  54. package/types/core/history-observer.d.ts +0 -4
  55. package/types/core/mini-dev-console.d.ts +0 -36
  56. package/types/core/network-sanitize.d.ts +0 -31
  57. package/types/core/sdk.d.ts +0 -104
  58. package/types/core/singleton.d.ts +0 -372
  59. package/types/core/utils.d.ts +0 -10
  60. package/types/core/version.d.ts +0 -2
  61. package/types/devtools/device-logs.d.ts +0 -48
  62. package/types/miniapp-manifest/basic-info-browser.d.ts +0 -37
  63. package/types/miniapp-manifest/basic-info-image-header.d.ts +0 -6
  64. package/types/miniapp-manifest/basic-info-node.d.ts +0 -17
  65. package/types/miniapp-manifest/basic-info-placeholder.d.ts +0 -1
  66. package/types/miniapp-manifest/basic-info.d.ts +0 -33
  67. package/types/miniapp-manifest/bindings.d.ts +0 -70
  68. package/types/miniapp-manifest/category.d.ts +0 -11
  69. package/types/miniapp-manifest/companion-directory.d.ts +0 -2
  70. package/types/miniapp-manifest/companion-executable.d.ts +0 -4
  71. package/types/miniapp-manifest/companion-types.d.ts +0 -63
  72. package/types/miniapp-manifest/companions.d.ts +0 -17
  73. package/types/miniapp-manifest/index.d.ts +0 -7
  74. package/types/miniapp-manifest/node.d.ts +0 -22
  75. package/types/miniapp-manifest/permissions.d.ts +0 -48
  76. package/types/miniapp-manifest/runtime-gate.d.ts +0 -12
  77. package/types/miniapp-manifest/schema.d.ts +0 -302
  78. package/types/modules/auth/index.d.ts +0 -204
  79. package/types/modules/cloud/index.d.ts +0 -669
  80. package/types/modules/companion/index.d.ts +0 -1619
  81. package/types/modules/device/index.d.ts +0 -193
  82. package/types/modules/environment/index.d.ts +0 -238
  83. package/types/modules/files/index.d.ts +0 -5
  84. package/types/modules/files/registry.d.ts +0 -35
  85. package/types/modules/files/types.d.ts +0 -1548
  86. package/types/modules/navigation/app-pages/index.d.ts +0 -4
  87. package/types/modules/navigation/app-pages/types.d.ts +0 -135
  88. package/types/modules/navigation/index.d.ts +0 -312
  89. package/types/modules/network/index.d.ts +0 -457
  90. package/types/modules/network/observability.d.ts +0 -38
  91. package/types/modules/network/request-shape.d.ts +0 -44
  92. package/types/modules/share/copy-link.d.ts +0 -46
  93. package/types/modules/share/extra.d.ts +0 -5
  94. package/types/modules/share/index.d.ts +0 -294
  95. package/types/modules/share/screenshot.d.ts +0 -34
  96. package/types/modules/share/show-share-menu.d.ts +0 -29
  97. package/types/modules/share/types.d.ts +0 -201
  98. package/types/modules/storage/index.d.ts +0 -214
  99. package/types/modules/ui/index.d.ts +0 -315
  100. package/types/modules/user/get-info.d.ts +0 -44
  101. package/types/modules/user/index.d.ts +0 -245
  102. package/types/modules/user/revoke-authorization.d.ts +0 -31
  103. package/types/modules/user/steam-game-list.d.ts +0 -153
  104. package/types/modules/user/types.d.ts +0 -2
  105. package/types/modules/viewport/index.d.ts +0 -319
  106. package/types/protocol/capabilities.d.ts +0 -2
  107. package/types/protocol/constants.d.ts +0 -1
  108. package/types/protocol/dev-session.d.ts +0 -74
  109. package/types/protocol/guards.d.ts +0 -1
  110. package/types/protocol/runtime-permissions.d.ts +0 -2
  111. package/types/protocol/types.d.ts +0 -22
  112. package/types/skill-metadata.d.ts +0 -18
  113. package/types/vite/html-policy.d.ts +0 -6
  114. package/types/vite/runtime-permission-env.d.ts +0 -9
package/CHANGELOG.md CHANGED
@@ -2,6 +2,118 @@
2
2
 
3
3
  本文件随 `@heybox/hb-sdk` npm 包公开分发,只记录外部小程序开发者可观察到的变化。
4
4
 
5
+ ## 0.9.1-alpha.10 - 2026-10-16
6
+
7
+ > 影响级别:必须操作
8
+ > 开发者动作:为调用 `share.screenshot()` 的页面,在目标截图区域底部预留至少 57 个逻辑像素的空白背景,避免遮挡重要内容,并按背景选择水印主题以保证对比度。
9
+ > 兼容范围:公开 API 与参数保持兼容;水印由更新后的宿主自动添加,无需自行绘制或增加调用参数。系统按键截图暂不支持,新 PC 的截图分享能力限制保持不变。
10
+
11
+ ### 新增能力
12
+
13
+ - `share.screenshot()` 增加可选 `watermarkTheme`:`light` 适合浅色背景,显示黑色水印;`dark` 适合深色背景,显示白色水印。默认 `dark`,不自动跟随系统主题。
14
+
15
+ ### 行为调整
16
+
17
+ - 小程序内截图分享自动添加小黑盒品牌搜索胶囊,搜索词使用当前小程序名称,下方显示灰色「小黑盒工坊小程序」。
18
+ - 同一小程序的连续截图请求依次处理,避免水印与分享面板重叠。
19
+
20
+ ### 问题修复
21
+
22
+ - 修复客户端尚未完成截图时水印被提前移除、导致成图没有水印的问题。
23
+ - 截图等待不再受 SDK 普通请求超时限制,支持超过 10 秒的延迟和连续排队;取消的请求不会继续从排队或延迟阶段投递原生截图。
24
+
25
+ ### 文档与工具
26
+
27
+ - 补充截图底部预留区域与背景对比度的要求,说明自定义截图区域同样适用。
28
+
29
+
30
+
31
+ ## 0.9.1-alpha.9 - 2026-10-16
32
+
33
+ ### 新增能力
34
+
35
+ - 反馈新建与追加回复支持上传本地图片和 GIF,图片和 GIF 合计最多 10 张,日志不占图片额度;普通图片单张 20 MiB、GIF 单张 10 MiB,暂不支持视频附件。
36
+ - 新建和追加回复统一通过 `--log` 提供日志:支持本地 `.log`、ZIP 日志包,字符串自动包装成 `.log` 文件;单份上传最多 10 MiB,ZIP 内最多 50 份非空 UTF-8 `.log`,解压后合计最多 20 MiB,日志独立于图片额度,正文仅保留上传返回的日志下载链接。
37
+ - 新建反馈强制校验至少 5 个字符的问题描述、问题项目的 SDK 版本、运行平台、非空日志和至少一张截图;追加回复的描述同步至少 5 个字符。
38
+ - 移除重复的 `feedback submit` 子命令,统一使用 `hb-sdk feedback` 提交;工单列表保留分页以查看超过五条的历史记录。
39
+ - 反馈命令仅直接提交工单,不再打开或输出反馈提交页面地址;缺少问题描述时提示补充。
40
+
41
+ - 反馈提交与追加回复增加检查、上传和提交阶段提示,进度不混入 JSON 结果;附件按顺序串行上传,全部成功后才提交工单;结果不明确时提示在 App 核对,不自动重试,也不保存本地恢复缓存。
42
+
43
+ ### 问题修复
44
+
45
+ - 修复反馈附件上传授权请求缺少表单类型,导致服务端无法读取上传范围并返回“参数错误:1000”的问题。
46
+ - 反馈日志上传前校验 ZIP 目录、结束记录和 CRC,拒绝损坏或未写完的压缩包;修复普通日志末尾残缺 UTF-8 字符被漏检的问题。
47
+
48
+ ### 文档与工具
49
+
50
+ - 移除开放平台与文档中的反馈页面直达入口,保留 App 帮助与反馈入口及 CLI 提交说明。
51
+
52
+ ## 0.9.1-alpha.8 - 2026-10-16
53
+
54
+ ### 问题修复
55
+
56
+ - 修复第一方小程序已声明权限在 CLI 查询、本地调试和发布检查中被误判为不可用的问题。
57
+ - 权限查询区分原始审批与有效权限,并展示第一方自动批准来源。
58
+
59
+ ## 0.9.1-alpha.7 - 2026-10-16
60
+
61
+ ### 新增能力
62
+
63
+ - 新增 `network.upload()`,使用受控文件发送 raw PUT/POST 或 multipart 上传,支持查询参数、请求头、进度、取消与响应状态校验。
64
+
65
+ ### 问题修复
66
+
67
+ - 文件和目录选择不再受普通请求超时限制,允许用户完成较长时间的系统选择操作。
68
+ - 补充上传、文件系统与下载验收,并按实际平台能力处理大小边界和多选限制。
69
+
70
+ ## 0.9.1-alpha.6 - 2026-10-15
71
+
72
+ ### 新增能力
73
+
74
+ - 新增 `hb-sdk feedback`,可打开小程序工坊反馈页面,或提交问题、复现步骤、日志与截图链接,进入现有私有客服工单。
75
+ - 新增 `hb-sdk feedback list`、`detail` 和 `reply`,查看本人小程序工坊工单并向未关闭的原工单追加信息。
76
+
77
+ ### 文档与工具
78
+
79
+ - 提交前后明确说明私有工单性质、编号与详情链接,并提示在 App「设置 → 帮助与反馈 → 我的反馈」跟进。
80
+ - 智能体新建前先查看已有工单,确认同一问题后优先补充;服务端未确认工单隔离时拒绝读取和回复。
81
+ - 补充开发常见问题及反馈入口。
82
+
83
+ ## 0.9.1-alpha.5
84
+
85
+ - 工作区卡片 Controller v2 支持在本地开发入口调试,并校验控制器依赖、权限及卡片参数。
86
+ - 旧 Host 不支持工作区卡片时,能力错误保留原始错误数据和原因,便于诊断。
87
+
88
+ ## 0.9.1-alpha.4 - 2026-10-14
89
+
90
+ ### 新增能力
91
+
92
+ - 预留 `hbSDK.device.executeProtocol()`(暂不对外开放):在获得平台批准的 `appProtocol` 权限后执行任意小黑盒协议,支持完整协议字符串与 JSON 协议对象;返回 `Promise<void>`,成功只表示已投递,不转发协议业务返回值或回调。
93
+ - 预留最高危险等级权限 `appProtocol`(暂不对外开放,不提供开发者申请入口):批准后该入口可执行任意协议,并绕过其他 SDK 能力权限及其专用授权流程;该总授权只作用于 `device.executeProtocol()`,其他 SDK 方法仍执行各自权限与授权规则。
94
+ - `hb-sdk dev` 支持为已声明但未获线上批准的 `appProtocol` 生成当前 Dev Session 的本地临时授权;浏览器调试台记录协议类型并以 Mock 投递成功,不模拟真实协议效果。
95
+
96
+ ### 问题修复
97
+
98
+ - 协议执行收到取消后停止尚未投递的后续动作;调用超时或 SDK 销毁时通知 Host 取消,已投递的系统动作不会撤销。
99
+ - 协议对象中的函数、Symbol 等无法发送的参数统一返回 `INVALID_PARAMS`,保留原始原因供排查。
100
+
101
+ ### 文档与工具
102
+
103
+ - 权限指南、API Reference、CLI 调试说明与 `hb-sdk remote permission apply` 同步 `appProtocol` 与 `device.executeProtocol`。
104
+
105
+ ## 0.9.1-alpha.3 - 2026-10-14
106
+
107
+ ### 问题修复
108
+
109
+ - 修复设置 `--service-tag` 后提交小程序时文件上传失败的问题。
110
+
111
+ ## 0.9.1-alpha.2
112
+
113
+ ### 文档与工具
114
+
115
+ - 浏览器调试台的沙箱面板统一为工作台视觉:设备选择、目录路径与文件列表改用主题 Token、图标按钮和文件类型图标,空目录与加载状态补充对应图示。
116
+
5
117
  ## 0.9.1-alpha.1
6
118
 
7
119
  ### 行为调整
@@ -123,7 +235,7 @@
123
235
 
124
236
  > 影响级别:常规
125
237
  > 开发者动作:升级至 `0.9.0-alpha.0` 并重新运行 `hb-sdk dev`;运行期间在后台调整权限后,请重启 CLI 同步。
126
- > 兼容范围:公开 SDK API 不变;调整本地真实客户端调试的详情读取与启动票可用条件。
238
+ > 兼容范围:既有公开 SDK API 保持兼容;新增工作区卡片入口,并调整本地真实客户端调试的详情读取与启动票可用条件。
127
239
 
128
240
  ### 行为调整
129
241
 
@@ -136,6 +248,9 @@
136
248
  - 修复声明连续变化时,旧详情、产物摘要或启动票覆盖最新调试状态的问题。
137
249
  - 修复详情校验失败后仍能通过本地启动入口获取续签票据的问题。
138
250
 
251
+ - 新增 `@heybox/hb-sdk/card-controller` 公开入口,用于声明工作区卡片 Controller 和卡片视图。
252
+ - 新增 `workspaceCards.requestRefresh()`、`getLaunchContext()` 和 `onLaunchContextChange()`,用于在支持工作区卡片的桌面 Host 中刷新卡片和读取启动上下文。
253
+
139
254
  ## 0.8.5 - 2026-10-02
140
255
 
141
256
  > 影响级别:必须操作
@@ -320,7 +435,6 @@
320
435
 
321
436
  - 补充游戏详情页资源位申请规则、图标制作规范和申请流程说明。
322
437
 
323
-
324
438
  ## 0.8.2 - 2026-09-21
325
439
 
326
440
  > 摘要:版本名称与图片改由项目维护,新增 Steam 账号授权,并调整部署与用户数据边界。
@@ -539,6 +653,7 @@
539
653
 
540
654
  - 目标平台声明统一迁移到 `package.json#heybox.platforms`;`miniappManifest()` 恢复无参调用,并在构建时将该声明写入 `dist/manifest.json`。
541
655
  - `hb-sdk dev`、`hb-sdk build` 和普通 `hb-sdk remote deploy` 会拒绝缺失或非法的平台声明;build/deploy 也会拒绝与项目配置不一致的 Manifest。已有项目升级时需把原 Vite 参数中的 `platforms` 移入 `package.json#heybox`。
656
+
542
657
  ## 0.8.1-alpha.2
543
658
 
544
659
  - 新增 `environment.getInfo()` 与 `environment.getInfoSync()`,用于读取运行模式、小黑盒 App 版本、canonical 小程序 ID/版本、操作系统和 SDK 版本的冻结快照。
package/README.md CHANGED
@@ -56,7 +56,7 @@ hb-sdk skill install --all-agents
56
56
 
57
57
  SDK 会在导入时启动握手,能力调用会自动等待 SDK 就绪。声明 `userInfo` 后,可通过 `user.getInfo()` 读取当前小程序内的隔离身份和已授权资料:
58
58
 
59
- 使用受保护能力前,需要在项目根 `package.json#heybox.permissions` 中显式声明。`auth.login()` 和 `user.getInfo()` 都只需要 `userInfo`,不依赖公开 `network` 权限;`network` 仅约束 `network.request()` 与 `network.download()`,线上使用仍需平台批准。`network` 和 `companion` 可在开放平台“小程序管理 → 权限申请”中提交申请,开发者不能申请访问官方域名。`hb-sdk dev` 可临时补齐普通网络和 Companion 的批准缺口,但不能补齐官方域名,调试台会持续提示发布后不可用。完整配置、本地调试边界和 0.8/0.9 迁移规则见[权限声明](https://docs.xiaoheihe.cn/hb_sdk/guide/permissions)。
59
+ 使用受保护能力前,需要在项目根 `package.json#heybox.permissions` 中显式声明。`auth.login()` 和 `user.getInfo()` 都只需要 `userInfo`,不依赖公开 `network` 权限;`network` 约束 `network.request()`、`network.download()` 与 `network.upload()`,线上使用仍需平台批准。`network` 和 `companion` 可在开放平台“小程序管理 → 权限申请”中提交申请,开发者不能申请访问官方域名。`hb-sdk dev` 可临时补齐普通网络和 Companion 的批准缺口,但不能补齐官方域名,调试台会持续提示发布后不可用。完整配置、本地调试边界和 0.8/0.9 迁移规则见[权限声明](https://docs.xiaoheihe.cn/hb_sdk/guide/permissions)。
60
60
 
61
61
  需要可信用户手势的按钮不能在点击回调里等待握手。页面加载时先用 `getHandshakeState()` 读取当前状态,再用 `onHandshakeStateChange()` 订阅并立即接收当前状态;仅在 `status === 'ready'` 时启用按钮,并在组件或页面销毁时调用订阅返回的取消函数。`ready` 生命周期事件只是握手成功瞬间派发、不会重放的边沿通知,不能用来判断当前状态。
62
62
 
@@ -181,7 +181,9 @@ console.log(info.sdk.version);
181
181
 
182
182
  `resizable` 只约束**用户手动拖拽**;**位置不开放**:开发者不能声明或设置窗口位置,位置由用户拖拽产生并由宿主按小程序身份本地记忆。完整语义见[窗口尺寸与可缩放性](https://docs.xiaoheihe.cn/hb_sdk/guide/window-size)。
183
183
 
184
- ## 文件与下载
184
+ ## 文件与传输
185
+
186
+ `network.upload()` 接收一个可读 `FileHandle`,由 Host 直接流式上传到开发者指定 URL。raw 支持 PUT(默认)/POST,multipart 固定 POST 并可携带字符串字段;支持进度、取消、空闲超时、可选大小限制和标准 HTTP 响应。文件字节不经过 iframe,上传期间应保持源文件不变;首版不自动重试、分片、续传或复制快照。PC、Android、iOS、OHOS 按真实 Host primitive 启用,旧 Host 明确拒绝。完整示例见[文件能力与沙箱](https://docs.xiaoheihe.cn/hb_sdk/guide/files-and-sandbox)。
185
187
 
186
188
  `files` 提供当前小程序私有 sandbox 和由用户选择授予的外部 File/Directory;
187
189
  `network.download()` 将 GET 响应直接流式写入受控目标,下载字节不经过 iframe bridge。
@@ -215,7 +217,8 @@ console.log(await downloaded.readText());
215
217
  不认识新 method 时返回 `METHOD_NOT_FOUND`。
216
218
  新 PC 的下载字节留在插件 Node 并直接原子落盘,不提供 Blob 或内存假实现。
217
219
 
218
- 外部 picker 必须从可信用户操作触发。`files.saveFile({ suggestedName })` 返回精确 File 授权,
220
+ 外部 picker 必须从可信用户操作触发。`files.pickFiles()`、`files.pickDirectory()` 和
221
+ `files.saveFile()` 的选择等待不设固定超时,不受 SDK 普通请求超时配置影响;确认、取消或 SDK / Runtime 会话结束后才结束操作。`files.saveFile({ suggestedName })` 返回精确 File 授权,
219
222
  不会额外保留 Directory 授权;新 PC 当前先让用户选择保存目录,再以 `suggestedName` 独占创建空文件,
220
223
  同名文件返回 `FILE_ALREADY_EXISTS`。V1 不接受 `accept`,只有 `pickFiles()` 支持扩展名过滤。完整路径、
221
224
  创建、存在性和下载语义见[快速开始](https://docs.xiaoheihe.cn/hb_sdk/guide/quick-start#文件与下载)。
@@ -326,9 +329,11 @@ SDK 还提供 `getHandshakeState()` / `onHandshakeStateChange()` 管理持久握
326
329
  | `storage` | 读写当前小程序的隔离存储 |
327
330
  | `files` | 声明受控 sandbox 与用户选择授权的文件、目录操作 |
328
331
  | `cloud` | 使用小程序云端排行榜 |
329
- | `network` | 发起经过平台授权的网络请求,并声明受控流式下载 |
332
+ | `network` | 发起经过平台授权的网络请求及受控文件传输 |
330
333
  | `companion` | 准备、启动并控制当前版本审核过的桌面辅助应用 |
331
334
 
335
+ `share.screenshot()` 会在截图区域底部添加当前小程序名称的品牌搜索胶囊及灰色「小黑盒工坊小程序」。请在目标区域底部预留至少 57 个逻辑像素的空白背景,避免遮挡重要内容,并保证背景与水印有足够对比度。`watermarkTheme: 'light'` 适合浅色背景(黑色水印),`'dark'` 适合深色背景(白色水印,默认);不自动跟随系统主题。水印仅在 SDK 截图期间展示,不增加图片尺寸;系统按键截图暂不支持。截图等待不受 SDK 普通请求超时限制;排队和延迟期间会响应会话终止,Mobile Host 从投递原生截图起最多等待 15 秒成图回调。详见 [截图分享布局要求](https://docs.xiaoheihe.cn/hb_sdk/recipes/community-share#截图分享)。
336
+
332
337
  具体方法、参数和返回值以 [API Reference](https://docs.xiaoheihe.cn/hb_sdk/reference/) 为准,常见组合写法见 [Recipes](https://docs.xiaoheihe.cn/hb_sdk/recipes/)。
333
338
 
334
339
  ## 关键约束
@@ -500,4 +505,37 @@ Host/Runtime 集成维护者请先阅读 [`@heybox/hb-sdk-runtime` README](../hb
500
505
 
501
506
  ### 终端权限申请
502
507
 
503
- 绑定小程序后,可用 `hb-sdk remote permission list` 查看平台状态和最近申请;使用 `hb-sdk remote permission apply network --reason "访问业务接口" --domains "api.example.com"` 或 `hb-sdk remote permission apply companion --reason "运行桌面辅助应用"` 提交申请。两种命令均支持 `--json`,无需上传版本;获批后仍需声明 Manifest 权限。
508
+ 绑定小程序后,可用 `hb-sdk remote permission list` 查看原始审批、本地声明下的有效状态和最近申请;使用 `hb-sdk remote permission apply network --reason "访问业务接口" --domains "api.example.com"` 或 `hb-sdk remote permission apply companion --reason "运行桌面辅助应用"` 提交申请。两种命令均支持 `--json`,无需上传版本;获批后仍需声明 Manifest 权限。第一方已声明的受审批权限自动批准,原始审批为 `disabled` 不表示有效权限被禁用;CLI 会单独标明批准来源。完整语义见[终端权限申请](https://docs.xiaoheihe.cn/hb_sdk/guide/permissions#终端权限申请)。
509
+
510
+ ### 工作区卡片(开发中)
511
+
512
+ 在支持该能力的 PC 游戏工作区展示小程序概览和操作。项目声明指定一个 Controller 文件;
513
+ Controller 使用 `@heybox/hb-sdk/card-controller` 编写,普通页面使用根 SDK 的 `workspaceCards` 模块。
514
+ 浏览器调试页只提供登录、绑定、启动和状态,不渲染卡片,须在真实 PC 验收。
515
+
516
+ 完整配置、三个示例、页面协作、调试发布与排障见 [工作区卡片指南](https://docs.xiaoheihe.cn/hb_sdk/guide/workspace-cards)。
517
+
518
+ 卡片合同只在开发构建时依赖私有 `@ai-desktop/view-contract`,发布 JS 与声明已封装所需代码和类型。
519
+ 用户安装 hb-sdk 不需要该私有包;`check:bundled-contract` 阻止未内联引用进入发布制品。
520
+
521
+ ## 开发反馈
522
+
523
+ 小程序工坊开发者反馈统一进入现有私有客服工单。登录后只能查看自己的反馈,客服通过现有后台派单和回复。
524
+
525
+ ```bash
526
+ hb-sdk feedback --desc "调用接口时发生异常" --sdk-version 0.9.1-alpha.7 --platform ios --log ./error.log --screenshot ./error.png --app-id app123 --api hb.network.request
527
+ hb-sdk feedback --desc "页面运行时出现崩溃" --sdk-version 0.9.1-alpha.7 --platform android --log ./error.log --screenshot ./error.png --json
528
+ hb-sdk feedback list --json # 先查看本人已有的小程序工坊工单
529
+ hb-sdk feedback detail 9527 --json # 查看内容和客服回复
530
+ hb-sdk feedback reply 9527 --desc "补充复现步骤" --screenshot ./error.png --log "Error: retry failed" --json
531
+ ```
532
+
533
+ CLI 仅直接提交工单,不打开或输出反馈提交页面地址。新建反馈必须提供至少 5 个字符的问题描述、问题项目实际使用的 SDK 版本、问题发生的平台、非空报错日志和至少一张截图。使用 `--sdk-version` 填写有效版本号,不能用 CLI 自身版本代替;使用 `--platform` 指定 `ios`、`android`、`windows`、`macos`、`linux` 或 `web`,不会把执行 CLI 的电脑平台当作问题平台。日志统一通过 `--log` 提供,可传本地 `.log`、ZIP 日志包路径或日志文本,提交前请脱敏。缺少或填写无效时在登录、上传和提交前拒绝。AppID、关联 API、补充运行环境、复现步骤选填。追加回复只要求至少 5 个字符的补充描述,日志和附件可选,不重复要求原工单的 SDK 版本与平台。使用 `--scene` 补充复现步骤。`--log ./error.log` 上传非空 UTF-8 `.log` 文件;`--log "Error: request failed"` 将原始文本包装成 `feedback-text.log` 后上传。`--log ./logs.zip` 支持多个日志文件打包上传:只允许非空 UTF-8 `.log` 文件,最多 50 份,解压后合计不超过 20 MiB;不接受其他附件或嵌套压缩包。日志文件或压缩包单个不超过 10 MiB;日志全文不写入正文,正文只记录日志下载链接。完整正文最多 5000 字符;使用 `--screenshot` 传本地图片路径或已上传的 HTTP(S) 图片链接,可重复,图片和 GIF 合计最多 10 张,日志不占图片额度。普通图片单张不超过 20 MiB,GIF 单张不超过 10 MiB。暂不支持视频附件。图片沿用帮助与反馈的上传流程。
534
+
535
+ 提交时从现有分类接口查找“小程序工坊”分类(兼容原“小程序工坊开发者”和“小程序工坊开发者反馈”名称)及“开发中的常见问题”问题项,再调用 `/bbs/web/feedback/user/post`。分类未配置时拒绝提交;回复前先检查原工单属于本人小程序工坊且尚未关闭。所有本地附件先校验,再使用同一登录账号上传并提交,上传失败不会继续提交工单;附件不会单独作为上传命令对外提供。日志复用现有上传接口,正文使用接口返回的完整下载链接,不要求下载地址保留 `.log` 后缀。上线前需配置分类、问题项,并绑定客服组和派单优先级。提交结果包含原有工单 ID 和详情链接,不再创建独立 SDK 反馈记录。提交前会明确提示将创建私有反馈工单;使用提交时的同一小黑盒账号,在 App「设置 → 帮助与反馈 → 我的反馈」查看进展、客服回复或补充信息,也可打开返回的工单详情链接。`--json` 的成功结果包含 `message` 和 `follow_up` 说明,提交前提示输出到 stderr,不影响 stdout JSON 解析。
536
+
537
+ 反馈命令会显示检查文件、上传附件和提交工单的阶段提示,附件按顺序串行上传,全部上传成功后才提交工单;上传失败会提示具体文件和阶段,不继续提交。进度输出到 stderr,`--json` 的 stdout 只输出最终结果。不保存本地上传进度或提交缓存。提交超时、连接中断或响应不明确时,不自动查询或重试,请先到 App「帮助与反馈 → 我的反馈」核对结果,确认未成功后再重试。
538
+
539
+ 列表支持 `--offset` 和 `--limit`(最多 50 条),详情和回复只允许访问当前登录账号在小程序工坊分类 `71` 下的工单。回复复用原工单,不占新建额度;已解决或关闭的工单不能继续回复。新能力需要后端支持范围隔离;服务未更新时会明确报错,不回退为读取全部工单。
540
+
541
+ 新建前先用 `feedback list` 查看已有工单,必要时用 `detail` 确认是否为同一问题;同一问题优先 `reply`。CLI 不会自动进行语义查重或合并,不能确认时由用户判断。
@@ -0,0 +1,194 @@
1
+ 'use strict';
2
+
3
+ /** 小程序固定受管动作入口。 */
4
+ const WORKSPACE_CARD_COMMANDS = {
5
+ invoke: 'ai-desktop.heybox-user-miniprogram.workspace-cards.invoke',
6
+ openMiniProgram: 'ai-desktop.heybox-user-miniprogram.workspace-cards.open-mini-program',
7
+ };
8
+
9
+ const VIEW_SCHEMA_VERSION = 1;
10
+ function compact(value) {
11
+ return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== void 0));
12
+ }
13
+ function vstack(children, options = {}) {
14
+ return compact({ type: "vstack", children, ...options });
15
+ }
16
+ function hstack(children, options = {}) {
17
+ return compact({ type: "hstack", children, ...options });
18
+ }
19
+ function zstack(children, options = {}) {
20
+ return compact({ type: "zstack", children, ...options });
21
+ }
22
+ function grid(columns, children, options = {}) {
23
+ return compact({ type: "grid", columns, children, ...options });
24
+ }
25
+ function carousel(id, label, children, options = {}) {
26
+ return compact({ type: "carousel", id, label, children, ...options });
27
+ }
28
+ function group(children, options = {}) {
29
+ return compact({ type: "group", children, ...options });
30
+ }
31
+ function spacer(options = {}) {
32
+ return compact({ type: "spacer", ...options });
33
+ }
34
+ function text(value, options = {}) {
35
+ return compact({ type: "text", value, ...options });
36
+ }
37
+ function image(src, options = {}) {
38
+ return compact({ type: "image", src, ...options });
39
+ }
40
+ function icon(name, options = {}) {
41
+ return compact({ type: "icon", name, ...options });
42
+ }
43
+ function fields(items, options = {}) {
44
+ return compact({ type: "fields", items, ...options });
45
+ }
46
+ function list(items, options = {}) {
47
+ return compact({ type: "list", items, ...options });
48
+ }
49
+ function badge(value, options = {}) {
50
+ return compact({ type: "badge", text: value, ...options });
51
+ }
52
+ function divider(options = {}) {
53
+ return compact({ type: "divider", ...options });
54
+ }
55
+ function button(value, options = {}) {
56
+ return compact({ type: "button", text: value, ...options });
57
+ }
58
+ function tabs(id, items, options = {}) {
59
+ return compact({ type: "tabs", id, items, ...options });
60
+ }
61
+ function textField(id, label, options = {}) {
62
+ return compact({ type: "textField", id, label, ...options });
63
+ }
64
+ function toggle(id, label, checked, options = {}) {
65
+ return compact({ type: "switch", id, label, checked, ...options });
66
+ }
67
+ function expandable(id, children, options) {
68
+ return { type: "expandable", id, children, ...options };
69
+ }
70
+ function renderer(id, rendererViewId, options = {}) {
71
+ return compact({ type: "renderer", id, rendererViewId, ...options });
72
+ }
73
+ function frame(id, frameId, options = {}) {
74
+ return compact({ type: "frame", id, frameId, ...options });
75
+ }
76
+ function meter(value, options = {}) {
77
+ return compact({ type: "meter", value, ...options });
78
+ }
79
+ function radialProgress(value, label, options = {}) {
80
+ return compact({ type: "radialProgress", value, label, ...options });
81
+ }
82
+ function barChart(label, items, options = {}) {
83
+ return compact({ type: "barChart", label, items, ...options });
84
+ }
85
+ function region(id, status, nodes = [], options = {}) {
86
+ return compact({ id, status, nodes, ...options });
87
+ }
88
+ function viewDocument(regions, options = {}) {
89
+ return compact({ schema: VIEW_SCHEMA_VERSION, regions: [...regions], ...options });
90
+ }
91
+
92
+ function defineCard(definition) { return definition; }
93
+ const actionInput = {
94
+ string: (options = {}) => ({ type: 'string', ...options }),
95
+ number: () => ({ type: 'number' }),
96
+ boolean: () => ({ type: 'boolean' }),
97
+ array: (items, options = {}) => ({ type: 'array', items, ...options }),
98
+ object: (properties) => ({
99
+ type: 'object', properties, required: Object.keys(properties), additionalProperties: false,
100
+ }),
101
+ };
102
+ function defineAction(definition) {
103
+ let actionId;
104
+ const pending = [];
105
+ const handle = ((input) => {
106
+ const value = invoke(actionId ?? '__unbound__', input);
107
+ if (!actionId)
108
+ pending.push(value);
109
+ return value;
110
+ });
111
+ handle.kind = 'invoke';
112
+ handle.input = definition.input;
113
+ handle.run = definition.run;
114
+ Object.defineProperty(handle, 'bindActionId', { value: (id) => {
115
+ if (actionId && actionId !== id)
116
+ throw new Error('Workspace Card action handle 不能绑定多个 ID');
117
+ actionId = id;
118
+ for (const value of pending)
119
+ value.input.actionId = id;
120
+ pending.length = 0;
121
+ } });
122
+ return handle;
123
+ }
124
+ function defineOpenMiniProgramAction(options = {}) {
125
+ let actionId;
126
+ const pending = [];
127
+ const handle = ((input) => {
128
+ const value = openMiniProgram(actionId ?? '__unbound__', input);
129
+ if (!actionId)
130
+ pending.push(value);
131
+ return value;
132
+ });
133
+ handle.kind = 'openMiniProgram';
134
+ handle.input = options.input;
135
+ Object.defineProperty(handle, 'bindActionId', { value: (id) => {
136
+ if (actionId && actionId !== id)
137
+ throw new Error('Workspace Card action handle 不能绑定多个 ID');
138
+ actionId = id;
139
+ for (const value of pending)
140
+ value.input.actionId = id;
141
+ pending.length = 0;
142
+ } });
143
+ return handle;
144
+ }
145
+ function defineWorkspaceCardsController(controller) {
146
+ for (const [id, action] of Object.entries(controller.actions ?? {}))
147
+ action.bindActionId?.(id);
148
+ return controller;
149
+ }
150
+ /** 定义控制器;构建器和 Host 分别验证静态 action 表。 */
151
+ function defineWorkspaceCardController(controller) { return controller; }
152
+ /** 生成固定受管 invoke 入口;身份由 Host 根据真实卡片绑定。 */
153
+ function invoke(actionId, params) {
154
+ return { commandId: WORKSPACE_CARD_COMMANDS.invoke, input: { actionId, ...(params === undefined ? {} : { params }) } };
155
+ }
156
+ /** 只允许打开当前小程序。 */
157
+ function openMiniProgram(actionId, params) {
158
+ return { commandId: WORKSPACE_CARD_COMMANDS.openMiniProgram, input: { actionId, ...(params === undefined ? {} : { params }) } };
159
+ }
160
+
161
+ exports.actionInput = actionInput;
162
+ exports.badge = badge;
163
+ exports.barChart = barChart;
164
+ exports.button = button;
165
+ exports.carousel = carousel;
166
+ exports.defineAction = defineAction;
167
+ exports.defineCard = defineCard;
168
+ exports.defineOpenMiniProgramAction = defineOpenMiniProgramAction;
169
+ exports.defineWorkspaceCardController = defineWorkspaceCardController;
170
+ exports.defineWorkspaceCardsController = defineWorkspaceCardsController;
171
+ exports.divider = divider;
172
+ exports.expandable = expandable;
173
+ exports.fields = fields;
174
+ exports.frame = frame;
175
+ exports.grid = grid;
176
+ exports.group = group;
177
+ exports.hstack = hstack;
178
+ exports.icon = icon;
179
+ exports.image = image;
180
+ exports.invoke = invoke;
181
+ exports.list = list;
182
+ exports.meter = meter;
183
+ exports.openMiniProgram = openMiniProgram;
184
+ exports.radialProgress = radialProgress;
185
+ exports.region = region;
186
+ exports.renderer = renderer;
187
+ exports.spacer = spacer;
188
+ exports.tabs = tabs;
189
+ exports.text = text;
190
+ exports.textField = textField;
191
+ exports.toggle = toggle;
192
+ exports.viewDocument = viewDocument;
193
+ exports.vstack = vstack;
194
+ exports.zstack = zstack;
@@ -0,0 +1,159 @@
1
+ /** 小程序固定受管动作入口。 */
2
+ const WORKSPACE_CARD_COMMANDS = {
3
+ invoke: 'ai-desktop.heybox-user-miniprogram.workspace-cards.invoke',
4
+ openMiniProgram: 'ai-desktop.heybox-user-miniprogram.workspace-cards.open-mini-program',
5
+ };
6
+
7
+ const VIEW_SCHEMA_VERSION = 1;
8
+ function compact(value) {
9
+ return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== void 0));
10
+ }
11
+ function vstack(children, options = {}) {
12
+ return compact({ type: "vstack", children, ...options });
13
+ }
14
+ function hstack(children, options = {}) {
15
+ return compact({ type: "hstack", children, ...options });
16
+ }
17
+ function zstack(children, options = {}) {
18
+ return compact({ type: "zstack", children, ...options });
19
+ }
20
+ function grid(columns, children, options = {}) {
21
+ return compact({ type: "grid", columns, children, ...options });
22
+ }
23
+ function carousel(id, label, children, options = {}) {
24
+ return compact({ type: "carousel", id, label, children, ...options });
25
+ }
26
+ function group(children, options = {}) {
27
+ return compact({ type: "group", children, ...options });
28
+ }
29
+ function spacer(options = {}) {
30
+ return compact({ type: "spacer", ...options });
31
+ }
32
+ function text(value, options = {}) {
33
+ return compact({ type: "text", value, ...options });
34
+ }
35
+ function image(src, options = {}) {
36
+ return compact({ type: "image", src, ...options });
37
+ }
38
+ function icon(name, options = {}) {
39
+ return compact({ type: "icon", name, ...options });
40
+ }
41
+ function fields(items, options = {}) {
42
+ return compact({ type: "fields", items, ...options });
43
+ }
44
+ function list(items, options = {}) {
45
+ return compact({ type: "list", items, ...options });
46
+ }
47
+ function badge(value, options = {}) {
48
+ return compact({ type: "badge", text: value, ...options });
49
+ }
50
+ function divider(options = {}) {
51
+ return compact({ type: "divider", ...options });
52
+ }
53
+ function button(value, options = {}) {
54
+ return compact({ type: "button", text: value, ...options });
55
+ }
56
+ function tabs(id, items, options = {}) {
57
+ return compact({ type: "tabs", id, items, ...options });
58
+ }
59
+ function textField(id, label, options = {}) {
60
+ return compact({ type: "textField", id, label, ...options });
61
+ }
62
+ function toggle(id, label, checked, options = {}) {
63
+ return compact({ type: "switch", id, label, checked, ...options });
64
+ }
65
+ function expandable(id, children, options) {
66
+ return { type: "expandable", id, children, ...options };
67
+ }
68
+ function renderer(id, rendererViewId, options = {}) {
69
+ return compact({ type: "renderer", id, rendererViewId, ...options });
70
+ }
71
+ function frame(id, frameId, options = {}) {
72
+ return compact({ type: "frame", id, frameId, ...options });
73
+ }
74
+ function meter(value, options = {}) {
75
+ return compact({ type: "meter", value, ...options });
76
+ }
77
+ function radialProgress(value, label, options = {}) {
78
+ return compact({ type: "radialProgress", value, label, ...options });
79
+ }
80
+ function barChart(label, items, options = {}) {
81
+ return compact({ type: "barChart", label, items, ...options });
82
+ }
83
+ function region(id, status, nodes = [], options = {}) {
84
+ return compact({ id, status, nodes, ...options });
85
+ }
86
+ function viewDocument(regions, options = {}) {
87
+ return compact({ schema: VIEW_SCHEMA_VERSION, regions: [...regions], ...options });
88
+ }
89
+
90
+ function defineCard(definition) { return definition; }
91
+ const actionInput = {
92
+ string: (options = {}) => ({ type: 'string', ...options }),
93
+ number: () => ({ type: 'number' }),
94
+ boolean: () => ({ type: 'boolean' }),
95
+ array: (items, options = {}) => ({ type: 'array', items, ...options }),
96
+ object: (properties) => ({
97
+ type: 'object', properties, required: Object.keys(properties), additionalProperties: false,
98
+ }),
99
+ };
100
+ function defineAction(definition) {
101
+ let actionId;
102
+ const pending = [];
103
+ const handle = ((input) => {
104
+ const value = invoke(actionId ?? '__unbound__', input);
105
+ if (!actionId)
106
+ pending.push(value);
107
+ return value;
108
+ });
109
+ handle.kind = 'invoke';
110
+ handle.input = definition.input;
111
+ handle.run = definition.run;
112
+ Object.defineProperty(handle, 'bindActionId', { value: (id) => {
113
+ if (actionId && actionId !== id)
114
+ throw new Error('Workspace Card action handle 不能绑定多个 ID');
115
+ actionId = id;
116
+ for (const value of pending)
117
+ value.input.actionId = id;
118
+ pending.length = 0;
119
+ } });
120
+ return handle;
121
+ }
122
+ function defineOpenMiniProgramAction(options = {}) {
123
+ let actionId;
124
+ const pending = [];
125
+ const handle = ((input) => {
126
+ const value = openMiniProgram(actionId ?? '__unbound__', input);
127
+ if (!actionId)
128
+ pending.push(value);
129
+ return value;
130
+ });
131
+ handle.kind = 'openMiniProgram';
132
+ handle.input = options.input;
133
+ Object.defineProperty(handle, 'bindActionId', { value: (id) => {
134
+ if (actionId && actionId !== id)
135
+ throw new Error('Workspace Card action handle 不能绑定多个 ID');
136
+ actionId = id;
137
+ for (const value of pending)
138
+ value.input.actionId = id;
139
+ pending.length = 0;
140
+ } });
141
+ return handle;
142
+ }
143
+ function defineWorkspaceCardsController(controller) {
144
+ for (const [id, action] of Object.entries(controller.actions ?? {}))
145
+ action.bindActionId?.(id);
146
+ return controller;
147
+ }
148
+ /** 定义控制器;构建器和 Host 分别验证静态 action 表。 */
149
+ function defineWorkspaceCardController(controller) { return controller; }
150
+ /** 生成固定受管 invoke 入口;身份由 Host 根据真实卡片绑定。 */
151
+ function invoke(actionId, params) {
152
+ return { commandId: WORKSPACE_CARD_COMMANDS.invoke, input: { actionId, ...(params === undefined ? {} : { params }) } };
153
+ }
154
+ /** 只允许打开当前小程序。 */
155
+ function openMiniProgram(actionId, params) {
156
+ return { commandId: WORKSPACE_CARD_COMMANDS.openMiniProgram, input: { actionId, ...(params === undefined ? {} : { params }) } };
157
+ }
158
+
159
+ export { actionInput, badge, barChart, button, carousel, defineAction, defineCard, defineOpenMiniProgramAction, defineWorkspaceCardController, defineWorkspaceCardsController, divider, expandable, fields, frame, grid, group, hstack, icon, image, invoke, list, meter, openMiniProgram, radialProgress, region, renderer, spacer, tabs, text, textField, toggle, viewDocument, vstack, zstack };
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ function commonjsRequire(path) {
4
+ throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
5
+ }
6
+
7
+ exports.commonjsRequire = commonjsRequire;
@@ -1,19 +1,23 @@
1
1
  'use strict';
2
2
 
3
+ var runtimeGate = require('./runtime-gate-wKj1l5xM.cjs');
3
4
  var fs$1 = require('node:fs');
4
5
  var fs = require('node:fs/promises');
5
6
  var path = require('node:path');
6
- var runtimePermissionEnv = require('./runtime-permission-env-Bg7f-uj8.cjs');
7
+ var runtimePermissionEnv = require('./runtime-permission-env-DBra_0-U.cjs');
8
+ var index = require('./index-BWRDIX1T.cjs');
7
9
  require('node:crypto');
8
10
  require('node:zlib');
9
- var runtimeGate = require('./runtime-gate-CKGRK3wC.cjs');
10
- var index = require('./index-B0eNYO7I.cjs');
11
- var projectVite = require('./project-vite-BA_CFVq_.cjs');
12
- require('./version-rxh3jOOI.cjs');
13
- require('node:async_hooks');
11
+ var projectVite = require('./project-vite-DD3bmbqm.cjs');
14
12
  require('node:module');
13
+ require('node:url');
14
+ require('./_commonjs-dynamic-modules-DUamuDzp.cjs');
15
+ require('fs');
15
16
  require('path');
16
17
  require('os');
18
+ require('inspector');
19
+ require('./version-BF4JQQCU.cjs');
20
+ require('node:async_hooks');
17
21
  require('readline');
18
22
  require('tty');
19
23
  require('assert');
@@ -21,7 +25,7 @@ require('events');
21
25
  require('stream');
22
26
  require('buffer');
23
27
  require('util');
24
- require('node:url');
28
+ require('constants');
25
29
 
26
30
  function areStringArraysEqual(left, right) {
27
31
  return left.length === right.length && left.every((value, index) => value === right[index]);
@@ -103,6 +107,10 @@ async function validateBuildOutput(projectRoot, logger, declaredPlatforms, decla
103
107
  logger.warn('dist/manifest.json 包含 BOM,已自动剥离');
104
108
  }
105
109
  const validated = runtimePermissionEnv.validateMiniappManifestForDeploy(manifest);
110
+ if (validated.workspaceCards) {
111
+ runtimeGate.verifyWorkspaceCardsSnapshot({ ...validated, bindAppIds: validated.bindAppIds ?? [], workspaceCards: validated.workspaceCards });
112
+ runtimeGate.verifyWorkspaceCardArtifacts(distDir, validated.workspaceCards);
113
+ }
106
114
  const { platforms, sdkVersion, version, permissions, window } = validated;
107
115
  const bindAppIds = validated.bindAppIds ?? [];
108
116
  if (validated.category !== declaredCategory) {