@heybox/hb-sdk 0.8.1-alpha.11 → 0.8.1-alpha.13

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 (38) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +2 -2
  3. package/dist/cli-chunks/{build-DXpmT9rR.cjs → build-CBPmqCVZ.cjs} +4 -4
  4. package/dist/cli-chunks/{context-cpQKdAv9.cjs → context-CvuPJq1G.cjs} +2 -2
  5. package/dist/cli-chunks/{create-BBUaKfey.cjs → create-CyMWFYrc.cjs} +1 -1
  6. package/dist/cli-chunks/{dev-jz2O-8Sf.cjs → dev-BcAPHk9L.cjs} +9 -9
  7. package/dist/cli-chunks/{doctor-8tT7UEPZ.cjs → doctor-CIwaVrM1.cjs} +1 -1
  8. package/dist/cli-chunks/{index-BV_ZCDU1.cjs → index-B0KCGR9H.cjs} +2 -2
  9. package/dist/cli-chunks/{index-IeNOfmd0.cjs → index-E0qh3FUb.cjs} +15 -15
  10. package/dist/cli-chunks/{index.esm-DiC4hnWh.cjs → index.esm-DTEOIvDp.cjs} +7 -7
  11. package/dist/cli-chunks/{login-DipFJGVa.cjs → login-DGvHzH9j.cjs} +2 -2
  12. package/dist/cli-chunks/{project-vite-DLIFCiZD.cjs → project-vite-CRnpRhSb.cjs} +1 -1
  13. package/dist/cli-chunks/{remote-DHlEJtjc.cjs → remote-C1_Hs11w.cjs} +6 -6
  14. package/dist/cli-chunks/{runtime-permission-env-B0s4KP_U.cjs → runtime-permission-env-Bn1ONUDU.cjs} +1 -1
  15. package/dist/cli-chunks/{session-CUPzN2aa.cjs → session-BvZgS7VI.cjs} +1 -1
  16. package/dist/cli-chunks/{skill-DhgXHAjs.cjs → skill-BVT6fBpQ.cjs} +2 -2
  17. package/dist/cli-chunks/{version-DOBbqU-f.cjs → version-CJTEIaOQ.cjs} +1 -1
  18. package/dist/cli.cjs +1 -1
  19. package/dist/devtools/browser-dev-host/assets/browser-dev-host-DOzYp6JS.js +101 -0
  20. package/dist/devtools/browser-dev-host/assets/{desktop-app-launch-DLQ5YSCQ.js → desktop-app-launch-DZ_umnQp.js} +1 -1
  21. package/dist/devtools/browser-dev-host/assets/{index-DsL03GcE.js → index-DoPg_zh_.js} +3 -3
  22. package/dist/devtools/browser-dev-host/index.html +2 -2
  23. package/dist/index.cjs.js +24 -24
  24. package/dist/index.esm.js +24 -24
  25. package/dist/protocol.cjs.js +27 -27
  26. package/dist/protocol.esm.js +27 -27
  27. package/dist/vite.cjs.js +1 -1
  28. package/dist/vite.esm.js +1 -1
  29. package/package.json +6 -6
  30. package/skill/SKILL.md +1 -1
  31. package/skill/references/api-root.md +7 -5
  32. package/skill/references/examples.md +2 -2
  33. package/skill/references/recipes.md +6 -4
  34. package/skill/references/safety-boundaries.md +2 -2
  35. package/skill/skill.json +5 -5
  36. package/types/modules/files/types.d.ts +10 -11
  37. package/types/modules/network/index.d.ts +2 -2
  38. package/dist/devtools/browser-dev-host/assets/browser-dev-host-C7lX5xaK.js +0 -101
package/skill/SKILL.md CHANGED
@@ -51,7 +51,7 @@ Apply these instructions when writing, reviewing, or debugging code that consume
51
51
  10. When authorization UI is required, call `auth.login()` from a trusted user action. Missing gesture returns `USER_GESTURE_REQUIRED`; cancelling, rejecting, or closing returns `AUTHORIZATION_CANCELLED` and does not confirm or change authorization. An already-authorized `auth.login()` request may return a new code silently.
52
52
  11. Use `share.showShareMenu({ post })` or `share.screenshot({ post })` to preset editable community destinations and topics. Pass partition IDs through `topicIds` and topic text without surrounding `#` through `topics`; do not construct the underlying client post protocol.
53
53
  12. Use `share.showShareMenu({ extra })` to open the share menu or `share.copyLink({ extra })` to copy and return the mini-program share link. `share.showShareMenu()` always uses the platform `common_share` landing page and does not accept a custom `url`. Read the JSON-compatible page state synchronously with `share.getExtra()` after launch, validate the developer-defined fields, and fall back to the default page when it returns `undefined`.
54
- 13. New PC enables the retained `files` and `network.download()` contract with persistent sandbox storage, single-file/directory pickers, exact File saving, and public-network streaming downloads. Mobile, Web, Browser Dev Host, and legacy PC return `METHOD_FORBIDDEN` and provide no memory/Blob fallback. Call `files.pickFiles()` / `pickDirectory()` / `saveFile()` only from trusted user actions; `saveFile()` accepts only `suggestedName`, `remove()` only deletes sandbox objects, and non-empty directories require `remove({ recursive: true })`.
54
+ 13. New PC enables the retained `files` and `network.download()` contract with persistent sandbox storage, single-file/directory pickers, exact File saving, and public-network streaming downloads. Android/iOS `1.3.396+` additionally require the Host to advertise the corresponding Native operations through `system.describe`; missing handlers, negotiation timeout, or partial operation sets fail closed per capability. Web, Browser Dev Host, and legacy PC return `METHOD_FORBIDDEN` and provide no memory/Blob fallback. Call `files.pickFiles()` / `pickDirectory()` / `saveFile()` only from trusted user actions; `saveFile()` accepts only `suggestedName`, `remove()` only deletes sandbox objects, and non-empty directories require `remove({ recursive: true })`.
55
55
  14. Use `network.download()` only with an SDK-created File/Directory target. It is GET-only, does not follow redirects, and exposes local `AbortSignal` / progress callbacks without sending functions over the bridge. Abort is a cancellation intent; a Host commit that already won still resolves successfully.
56
56
  15. Use `companion.prepare()` and `companion.launch()` only from separate trusted user actions. Launch does not prepare implicitly. Treat stdio as raw `Uint8Array` with at-least-once output delivery, and implement business framing and sequence de-duplication explicitly.
57
57
  16. Use `environment.getInfo()` for the immutable runtime, Host App, canonical Mini-program, operating-system, and SDK version snapshot. It waits for the handshake automatically. Use `environment.getInfoSync()` only after `getHandshakeState().status === 'ready'` or inside a ready-state subscription; before that it throws `ENVIRONMENT_NOT_READY`.
@@ -27,7 +27,7 @@
27
27
  ## Package metadata
28
28
 
29
29
  - Package: `@heybox/hb-sdk`
30
- - Version at generation time: `0.8.1-alpha.11`
30
+ - Version at generation time: `0.8.1-alpha.13`
31
31
  - Public root export: `@heybox/hb-sdk`
32
32
  - Protocol export: `@heybox/hb-sdk/protocol`
33
33
  - Vite plugin export: `@heybox/hb-sdk/vite`
@@ -457,13 +457,14 @@ try {
457
457
  | Host | `files.sandbox` | 外部 picker | `network.download()` |
458
458
  | ---------------- | --------------- | ----------- | -------------------- |
459
459
  | 新 PC | 支持 | 支持 | 支持 |
460
- | Mobile | 不支持 | 不支持 | 不支持 |
460
+ | Mobile | 支持 | 支持 | 支持 |
461
461
  | Web | 不支持 | 不支持 | 不支持 |
462
462
  | Browser Dev Host | 不支持 | 不支持 | 不支持 |
463
463
 
464
464
  当前 Runtime 认识但 Host 未实现时返回 `METHOD_FORBIDDEN`;旧 Runtime 收到新 method 时返回
465
- `METHOD_NOT_FOUND`。新 PC V1 注入真实文件与流式下载 primitive;其他当前 Host 未实现时仍不
466
- 提供 throwing stub、Blob 或内存假下载。
465
+ `METHOD_NOT_FOUND`。新 PC 注入真实文件与流式下载 primitive;Android/iOS `1.3.396+` 还需在
466
+ 启动时通过 `system.describe` 宣告对应 Native operations。缺失 handler、协商超时或 operation
467
+ 不完整时对应能力保持关闭,且不提供 throwing stub、Blob 或内存假下载。
467
468
 
468
469
  ### 路径与创建
469
470
 
@@ -643,7 +644,7 @@ try {
643
644
  - `USER_GESTURE_REQUIRED` 表示潜在授权 UI 缺少可信用户手势,应让用户点击按钮后重试。
644
645
  - `AUTHORIZATION_CANCELLED` 表示用户取消、拒绝或关闭授权页面,应正常结束当前操作。
645
646
  - `SERVER_API_REQUIRED` 表示当前用户数据必须经开发者服务端 OpenAPI 获取,不应在页面重试对应 Host API。
646
- - `METHOD_FORBIDDEN` 表示当前 Host 未实现或关闭对应能力。V1 files/download 在 MobileWeb 和 Browser Dev Host 都会得到该错误。
647
+ - `METHOD_FORBIDDEN` 表示当前 Host 未实现或关闭对应能力。V1 files/download 在 Web、Browser Dev Host 和未实现该能力的旧版 Host 会得到该错误;Android/iOS `1.3.396+` 需先经 `system.describe` 协商到对应 operation 集。
647
648
  - `ENVIRONMENT_NOT_READY` 表示在 SDK 完成握手前调用了 `environment.getInfoSync()`;一般改用会自动等待的 `environment.getInfo()`。
648
649
  - `FILE_PICKER_CANCELLED` 表示用户取消了外部文件或目录选择,应正常结束当前操作。
649
650
  - `DOWNLOAD_CANCELLED` 表示取消意图先于 Host 提交生效;Host 已完成提交时仍返回成功。`DOWNLOAD_TIMEOUT` 表示网络空闲超时,失败不会改动原目标。
@@ -926,6 +927,7 @@ Fake 不选择、不下载、不解压、不启动本机程序,也不经过操
926
927
  - `COMPANION_DESCRIPTOR_UNAVAILABLE`:授权或描述符暂时不可用,可在有界重试策略下重试。
927
928
  - `COMPANION_ELEVATION_DENIED`:为未来管理员权限启动保留的兼容错误码;V1 构建不接受 `elevation: 'required'`。
928
929
  - `METHOD_FORBIDDEN` / `COMPANION_UNSUPPORTED`:当前 Host 或平台未实现,不要循环重试或用任意执行替代。
930
+ - `COMPANION_PREVIEW_UNSUPPORTED`:当前 PC Host 不支持审核前预览 Companion,需要升级客户端后重试。
929
931
 
930
932
  完整类型与方法见 [API Reference](https://docs.xiaoheihe.cn/hb_sdk/reference/)。
931
933
 
@@ -193,8 +193,8 @@ export default defineConfig({
193
193
  - Do not call unsupported storage delete/clear/info operations.
194
194
  - Do not pass raw internal share/network protocol fields from mini-program code.
195
195
  - Do not send `multipart/form-data` (or handcrafted multipart bodies) through `network.request`; use form-urlencoded string body or a dedicated upload capability.
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.
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.
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, or on Android/iOS `1.3.396+` after the Native contract is negotiated.
197
+ - Do not treat Web, Browser Dev Host, or legacy PC as evidence for files/download support. New PC implements the retained contract; Android/iOS `1.3.396+` additionally require matching Native operations from `system.describe`. Missing handlers, negotiation timeout, and partial operation sets fail closed per capability; other Hosts return `METHOD_FORBIDDEN` and provide no memory fallback.
198
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
199
  - Treat `companion.prepare()` and `companion.launch()` as separate trusted-user-gesture and Host-authorization operations. Launch never prepares implicitly.
200
200
  - Companion stdio is raw `Uint8Array` with at-least-once output delivery. Business protocols own framing, sequence de-duplication, replay, and reconnection.
@@ -138,13 +138,14 @@ try {
138
138
  | Host | `files.sandbox` | 外部 picker | `network.download()` |
139
139
  | ---------------- | --------------- | ----------- | -------------------- |
140
140
  | 新 PC | 支持 | 支持 | 支持 |
141
- | Mobile | 不支持 | 不支持 | 不支持 |
141
+ | Mobile | 支持 | 支持 | 支持 |
142
142
  | Web | 不支持 | 不支持 | 不支持 |
143
143
  | Browser Dev Host | 不支持 | 不支持 | 不支持 |
144
144
 
145
145
  当前 Runtime 认识但 Host 未实现时返回 `METHOD_FORBIDDEN`;旧 Runtime 收到新 method 时返回
146
- `METHOD_NOT_FOUND`。新 PC V1 注入真实文件与流式下载 primitive;其他当前 Host 未实现时仍不
147
- 提供 throwing stub、Blob 或内存假下载。
146
+ `METHOD_NOT_FOUND`。新 PC 注入真实文件与流式下载 primitive;Android/iOS `1.3.396+` 还需在
147
+ 启动时通过 `system.describe` 宣告对应 Native operations。缺失 handler、协商超时或 operation
148
+ 不完整时对应能力保持关闭,且不提供 throwing stub、Blob 或内存假下载。
148
149
 
149
150
  ### 路径与创建
150
151
 
@@ -416,7 +417,7 @@ try {
416
417
  - `USER_GESTURE_REQUIRED` 表示潜在授权 UI 缺少可信用户手势,应让用户点击按钮后重试。
417
418
  - `AUTHORIZATION_CANCELLED` 表示用户取消、拒绝或关闭授权页面,应正常结束当前操作。
418
419
  - `SERVER_API_REQUIRED` 表示当前用户数据必须经开发者服务端 OpenAPI 获取,不应在页面重试对应 Host API。
419
- - `METHOD_FORBIDDEN` 表示当前 Host 未实现或关闭对应能力。V1 files/download 在 MobileWeb 和 Browser Dev Host 都会得到该错误。
420
+ - `METHOD_FORBIDDEN` 表示当前 Host 未实现或关闭对应能力。V1 files/download 在 Web、Browser Dev Host 和未实现该能力的旧版 Host 会得到该错误;Android/iOS `1.3.396+` 需先经 `system.describe` 协商到对应 operation 集。
420
421
  - `ENVIRONMENT_NOT_READY` 表示在 SDK 完成握手前调用了 `environment.getInfoSync()`;一般改用会自动等待的 `environment.getInfo()`。
421
422
  - `FILE_PICKER_CANCELLED` 表示用户取消了外部文件或目录选择,应正常结束当前操作。
422
423
  - `DOWNLOAD_CANCELLED` 表示取消意图先于 Host 提交生效;Host 已完成提交时仍返回成功。`DOWNLOAD_TIMEOUT` 表示网络空闲超时,失败不会改动原目标。
@@ -619,6 +620,7 @@ Fake 不选择、不下载、不解压、不启动本机程序,也不经过操
619
620
  - `COMPANION_DESCRIPTOR_UNAVAILABLE`:授权或描述符暂时不可用,可在有界重试策略下重试。
620
621
  - `COMPANION_ELEVATION_DENIED`:为未来管理员权限启动保留的兼容错误码;V1 构建不接受 `elevation: 'required'`。
621
622
  - `METHOD_FORBIDDEN` / `COMPANION_UNSUPPORTED`:当前 Host 或平台未实现,不要循环重试或用任意执行替代。
623
+ - `COMPANION_PREVIEW_UNSUPPORTED`:当前 PC Host 不支持审核前预览 Companion,需要升级客户端后重试。
622
624
 
623
625
  完整类型与方法见 [API Reference](https://docs.xiaoheihe.cn/hb_sdk/reference/)。
624
626
 
@@ -22,8 +22,8 @@
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
- - 新 PC 开放持久 sandbox、单文件/目录 picker、精确 File 保存与公网 `network.download()`;多选和小黑盒域名流式下载暂不支持。Mobile、Web 与 Browser Dev Host 仍未开放这些 primitive。
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 验收。
25
+ - 新 PC 开放持久 sandbox、单文件/目录 picker、精确 File 保存与公网 `network.download()`;Android/iOS `1.3.396+` 通过独立 Native host contract 提供 Files/Download,并用 `system.describe` 的实际 operation 集逐项启用,缺失 handler、握手超时或 operation 不完整时对应能力 fail closed。多选和小黑盒域名流式下载暂不支持;Web 与 Browser Dev Host 仍未开放这些 primitive。
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 验收。已启用的 Mobile 下载走无凭据 Native transfer;需要鉴权的下载请使用服务端签发的限时 URL。
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'`。
package/skill/skill.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "hb-sdk",
3
- "skillVersion": "0.8.1-alpha.11+skill.ee9c3d1cb222",
3
+ "skillVersion": "0.8.1-alpha.13+skill.3784ce3da843",
4
4
  "sdk": {
5
5
  "package": "@heybox/hb-sdk",
6
- "version": "0.8.1-alpha.11",
7
- "compatibility": "0.8.1-alpha.11"
6
+ "version": "0.8.1-alpha.13",
7
+ "compatibility": "0.8.1-alpha.13"
8
8
  },
9
9
  "distribution": {
10
10
  "type": "npm",
11
11
  "package": "@heybox/hb-sdk",
12
- "version": "0.8.1-alpha.11",
12
+ "version": "0.8.1-alpha.13",
13
13
  "path": "skill"
14
14
  },
15
- "integrity": "sha256-ee9c3d1cb2220befd45d58f637c9a11caa7c520cdcc31ead6a48b074831fb6cb"
15
+ "integrity": "sha256-3784ce3da8431dd675160a5c2a66e19d08f5210d3765a2cddcadee6e3dfa2a38"
16
16
  }
@@ -35,8 +35,8 @@ export interface PathRoot {
35
35
  * @hbPlatform ohos
36
36
  * @hbPlatform windows
37
37
  * @hbPlatform macos
38
- * @hbClient android none
39
- * @hbClient ios none
38
+ * @hbClient android numeric-dot \>= 1.3.396
39
+ * @hbClient ios numeric-dot \>= 1.3.396
40
40
  * @hbClient ohos none
41
41
  * @hbClient windows none
42
42
  * @hbClient macos none
@@ -53,8 +53,8 @@ export interface PathRoot {
53
53
  * @hbPlatform ohos
54
54
  * @hbPlatform windows
55
55
  * @hbPlatform macos
56
- * @hbClient android none
57
- * @hbClient ios none
56
+ * @hbClient android numeric-dot \>= 1.3.396
57
+ * @hbClient ios numeric-dot \>= 1.3.396
58
58
  * @hbClient ohos none
59
59
  * @hbClient windows none
60
60
  * @hbClient macos none
@@ -107,14 +107,15 @@ export interface FilesModule {
107
107
  *
108
108
  * @param options - 访问模式、扩展名筛选与多选设置。
109
109
  * @returns 用户选择的文件代理。
110
+ * @remarks Android `1.3.396` 的精确 SAF 文件仅支持只读选择;请求 `readwrite` 会返回 `FILE_ACCESS_DENIED`。
110
111
  * @since 0.8.0-alpha.2
111
112
  * @hbPlatform android
112
113
  * @hbPlatform ios
113
114
  * @hbPlatform ohos
114
115
  * @hbPlatform windows
115
116
  * @hbPlatform macos
116
- * @hbClient android none
117
- * @hbClient ios none
117
+ * @hbClient android numeric-dot \>= 1.3.396
118
+ * @hbClient ios numeric-dot \>= 1.3.396
118
119
  * @hbClient ohos none
119
120
  * @hbClient windows none
120
121
  * @hbClient macos none
@@ -131,8 +132,8 @@ export interface FilesModule {
131
132
  * @hbPlatform ohos
132
133
  * @hbPlatform windows
133
134
  * @hbPlatform macos
134
- * @hbClient android none
135
- * @hbClient ios none
135
+ * @hbClient android numeric-dot \>= 1.3.396
136
+ * @hbClient ios numeric-dot \>= 1.3.396
136
137
  * @hbClient ohos none
137
138
  * @hbClient windows none
138
139
  * @hbClient macos none
@@ -144,13 +145,11 @@ export interface FilesModule {
144
145
  * @param options - 建议文件名。
145
146
  * @returns 具备读写权限的目标文件代理。
146
147
  * @since 0.8.0-alpha.2
147
- * @hbPlatform android
148
148
  * @hbPlatform ios
149
149
  * @hbPlatform ohos
150
150
  * @hbPlatform windows
151
151
  * @hbPlatform macos
152
- * @hbClient android none
153
- * @hbClient ios none
152
+ * @hbClient ios numeric-dot \>= 1.3.396
154
153
  * @hbClient ohos none
155
154
  * @hbClient windows none
156
155
  * @hbClient macos none
@@ -135,8 +135,8 @@ export interface MiniProgramNetworkModule {
135
135
  * @hbPlatform ohos
136
136
  * @hbPlatform windows
137
137
  * @hbPlatform macos
138
- * @hbClient android none
139
- * @hbClient ios none
138
+ * @hbClient android numeric-dot \>= 1.3.396
139
+ * @hbClient ios numeric-dot \>= 1.3.396
140
140
  * @hbClient ohos none
141
141
  * @hbClient windows none
142
142
  * @hbClient macos none