@heybox/hb-sdk-protocol 0.8.2-alpha.1 → 0.8.2-alpha.2

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.
@@ -12,44 +12,81 @@ export interface LoginResult {
12
12
  expiresIn: number;
13
13
  scopes: LoginScope[];
14
14
  }
15
- /** 用户资料授权状态。 */
15
+ /**
16
+ * 单个用户信息 scope 对当前小程序的授权状态。
17
+ *
18
+ * @remarks
19
+ * - `not_required`:Host 判定该 scope 无需单独征得用户同意。
20
+ * - `not_requested`:当前授权上下文尚未申请或授予该 scope。
21
+ * - `granted`:当前小程序可以读取该 scope 对应的资料。
22
+ * - `denied`:用户拒绝过该 scope,或该 scope 已被撤销。
23
+ *
24
+ * 该状态描述用户授权,不代表 `package.json#heybox.permissions` 的声明或平台审批结果。
25
+ * 当前 Runtime 成功执行 `user.getInfo()` 时会静默授予 `identity` 与 `profile`,因此两项均为
26
+ * `granted`;其余状态仍保留在公共协议中,供兼容 Host 和授权状态事件使用。
27
+ */
16
28
  export type UserInfoAuthorizationStatus = 'not_required' | 'not_requested' | 'granted' | 'denied';
17
29
  /**
18
30
  * 当前小程序对 canonical 用户信息 scope 的授权状态。
19
31
  *
20
32
  * @remarks
21
- * `steam_account` 是可选键:新能力版本的 Runtime 必定返回,legacy Runtime/Version 可以
22
- * 缺失。已授权不代表当前一定已绑定 Steam,只有 {@link AuthorizedUserInfo.steam_id}
23
- * 存在才表示当前有主绑定。
33
+ * 该对象固定包含 `identity` `profile`,新能力版本还可能包含可选的 `steam_account`。
34
+ * `steam_account` 已授权不代表当前一定已绑定 Steam,只有
35
+ * {@link AuthorizedUserInfo.steam_id} 存在才表示当前有主绑定。该对象只反映用户授权层;开发者仍需
36
+ * 在 Manifest 中声明 `userInfo` / `steamLibrary`,两层门禁不能互相替代。
24
37
  */
25
38
  export interface UserInfoAuthorization {
39
+ /**
40
+ * 隔离身份授权状态;控制 `AuthorizedUserInfo.app_user_id` 是否可向当前小程序披露。
41
+ */
26
42
  identity: UserInfoAuthorizationStatus;
43
+ /**
44
+ * 公开资料授权状态;控制 `AuthorizedUserInfo.profile` 中昵称和头像是否可披露。
45
+ */
27
46
  profile: UserInfoAuthorizationStatus;
47
+ /** Steam 账号授权状态;legacy Runtime/Version 可能缺失该键。 */
28
48
  steam_account?: UserInfoAuthorizationStatus;
29
49
  }
30
50
  /**
31
51
  * 已获准向当前小程序披露的用户资料。
32
52
  *
33
53
  * @remarks
34
- * 未开通网络权限且当前黑盒 APP 用户已登录时,Runtime 会隐式授予 `identity` 与
35
- * `profile`,静默建立或读取隔离身份,并由 `user.getInfo()` 返回该对象。撤销授权后
36
- * 旧身份失效,调用方应停止使用并清理本地缓存;再次调用 `user.getInfo()` 会静默建立
37
- * 新的隔离身份。
54
+ * 当前黑盒 APP 用户已登录时,Runtime 会隐式授予 `identity` 与 `profile`,静默建立或
55
+ * 读取隔离身份,并由 `user.getInfo()` 返回该对象。此过程只要求 Manifest 声明
56
+ * `userInfo`,不要求公开 `network` 权限,也不会返回授权码或创建开发者服务端会话。
57
+ *
58
+ * 撤销授权后旧身份失效;调用方应停止使用旧值,并清理本地缓存与开发者服务端会话。
59
+ * 再次调用 `user.getInfo()` 会按当前账号重新建立隔离身份,不能假定新旧 `app_user_id`
60
+ * 相同。
61
+ *
62
+ * @see [auth.login](/reference/sdk/auth/login) 获取供开发者服务端换票的一次性授权码。
63
+ * @see [user.revokeAuthorization](/reference/sdk/user/revokeAuthorization) 撤销当前小程序的用户授权。
38
64
  */
39
65
  export interface AuthorizedUserInfo {
40
66
  /**
41
- * 当前黑盒用户在当前小程序内稳定且不可逆的关联标识。
67
+ * 当前用户在当前小程序与当前授权有效期内稳定的隔离标识;不是黑盒用户 ID 或登录凭据。
42
68
  *
43
69
  * @remarks
44
- * 同一用户在不同小程序中的值不同。它不是黑盒用户 ID、登录凭据或主站私有接口凭据,
45
- * 只应作为当前小程序自己的业务关联键使用。示例:
70
+ * 该值在当前授权有效期内可作为“当前用户 × 当前小程序”的稳定关联键;同一用户在不同
71
+ * 小程序中的值不同,授权撤销后旧值失效。它不是黑盒用户 ID、登录凭据或主站私有接口凭据。
72
+ * 示例:
46
73
  * `au_1_x7K9mQ2pL4vN8cR3tY6wB1zD5fH`。调用方必须把完整值视为不透明字符串,
47
- * 不应解析格式或依赖固定长度。
74
+ * 不应解析格式、依赖固定长度或尝试跨小程序关联用户。
48
75
  */
49
76
  app_user_id: string;
50
- /** `profile` 已授权时返回昵称与头像;当前 Heybox Runtime 在无网络模式下隐式授予该 scope。 */
77
+ /**
78
+ * `profile` 获准披露时返回公开资料:`nickname` 是展示昵称,`avatar` 是头像资源字符串;
79
+ * 未获准披露时为 `null`。
80
+ *
81
+ * @remarks
82
+ * 当前 Runtime 的静默读取会授予 `profile`;资料读取暂时失败时仍可能返回对象,但
83
+ * `nickname` 或 `avatar` 为空字符串。它们只适合展示,不应作为登录态、授权状态、
84
+ * 唯一用户标识或鉴权依据。
85
+ */
51
86
  profile: {
87
+ /** 当前小黑盒账号的公开展示昵称;空字符串表示本次未取得可展示昵称。 */
52
88
  nickname: string;
89
+ /** 当前小黑盒账号的公开头像资源字符串;空字符串表示本次未取得可展示头像。 */
53
90
  avatar: string;
54
91
  } | null;
55
92
  /**
@@ -65,60 +102,149 @@ export interface AuthorizedUserInfo {
65
102
  * 当前黑盒 APP 登录态、授权状态和已获准披露的用户资料。
66
103
  *
67
104
  * @remarks
68
- * 未登录时 `isHeyboxAppLoggedIn` 为 `false`,授权状态和用户资料均为 `null`。
69
- * 当前 Heybox Runtime 在无网络模式且已登录时会隐式授予 `identity` 与 `profile`,
70
- * 静默建立身份并返回 `userInfo`;Host 在已登录但身份暂不可用时仍可返回 `null`,
71
- * 调用方必须进行空值判断。
105
+ * `isHeyboxAppLoggedIn` 作为判别字段处理返回值:
106
+ *
107
+ * - `false`:当前 Host 没有已登录的小黑盒账号,`authorization` `userInfo` 固定为 `null`。
108
+ * 这是正常业务分支,不会抛出登录错误。
109
+ * - `true` 且 `userInfo` 非空:`authorization` 固定包含 `identity`、`profile` 两项状态;
110
+ * `userInfo` 包含当前小程序隔离的 `app_user_id`,而 `profile` 仍需独立判空。
111
+ * - `true` 且 `userInfo` 为 `null`:公共协议为兼容 Host 保留的“已登录但资料未披露/不可用”分支。
112
+ * 当前 Runtime 成功读取隔离身份时返回非空对象,但调用方仍应按类型处理该分支。
113
+ *
114
+ * `user.getInfo()` 不返回 `code`、token、cookie 或黑盒用户 ID。需要建立开发者服务端会话时,
115
+ * 应在可信用户操作中调用 `auth.login()`,再把一次性 `code` 交给开发者自己的服务端。
116
+ *
117
+ * @see [auth.login](/reference/sdk/auth/login)
118
+ * @see [user.revokeAuthorization](/reference/sdk/user/revokeAuthorization)
72
119
  */
73
120
  export type MiniProgramUserInfoResult = {
121
+ /** `false` 是未登录分支的稳定判别值。 */
74
122
  isHeyboxAppLoggedIn: false;
123
+ /** 未登录时没有当前小程序的用户授权上下文。 */
75
124
  authorization: null;
125
+ /** 未登录时不会披露隔离身份或公开资料。 */
76
126
  userInfo: null;
77
127
  } | {
128
+ /** `true` 表示 Host 当前有已登录的小黑盒账号,不等同于开发者服务端已建立会话。 */
78
129
  isHeyboxAppLoggedIn: true;
130
+ /** 当前小程序的用户授权状态;与 Manifest 权限声明是两层独立门禁。 */
79
131
  authorization: UserInfoAuthorization;
132
+ /** 已获准披露的隔离身份与公开资料;兼容 Host 可能返回 `null`。 */
80
133
  userInfo: AuthorizedUserInfo | null;
81
134
  };
135
+ /** `user.getInfo` 不接收入参,也不能由页面指定小程序或用户身份。 */
82
136
  export type GetUserInfoPayload = void;
137
+ /** `user.getInfo` 的判别联合返回值;先判断 `isHeyboxAppLoggedIn`,再判断 `userInfo`。 */
83
138
  export type GetUserInfoResult = MiniProgramUserInfoResult;
139
+ /**
140
+ * `user.revokeAuthorization` 不接受 wire payload。
141
+ *
142
+ * @remarks
143
+ * 小程序 ID、当前小黑盒用户和可信手势状态由 Host 注入;发送任何非 `undefined` payload
144
+ * 都会返回 `INVALID_PARAMS`。该 method 无需 Manifest 权限,但仍要求当前用户已登录且调用
145
+ * 来自可信用户操作。
146
+ *
147
+ * @see [App-facing user.revokeAuthorization](/reference/sdk/user/revokeAuthorization)
148
+ */
84
149
  export type RevokeAuthorizationPayload = void;
150
+ /**
151
+ * 撤销成功后的 wire 结果为 `undefined`。
152
+ *
153
+ * @remarks
154
+ * 成功后 Runtime 会使缓存的用户授权和隔离身份失效,并发布
155
+ * `user_info_authorization_change`;业务持久化数据和开发者服务端会话不在该结果的清理范围内。
156
+ */
85
157
  export type RevokeAuthorizationResult = void;
158
+ /**
159
+ * Steam 游戏库排序维度:`weeks` 按最近两周时长,`all` 按累计时长,`achieved` 按成就数。
160
+ */
86
161
  export type SteamGameListSort = 'weeks' | 'all' | 'achieved';
162
+ /** `user.getSteamGameList` 的 wire 请求对象;字段校验和默认值由 Host Runtime 执行。 */
87
163
  interface GetSteamGameListRequest {
164
+ /** trim 后的非空 Steam ID;省略时使用当前用户的默认绑定账号。 */
88
165
  steamId?: string;
166
+ /** 正整数页大小,默认 `20`,大于 `100` 时收窄为 `100`。 */
89
167
  limit?: number;
168
+ /** 非负整数 offset,默认 `0`。 */
90
169
  offset?: number;
170
+ /** 排序维度,默认 `weeks`。 */
91
171
  sort?: SteamGameListSort;
172
+ /** trim 后最多保留前 100 个 UTF-16 code unit;空值会被省略。 */
92
173
  q?: string;
174
+ /** 是否包含隐藏游戏,默认 `false`;仅接受 boolean。 */
93
175
  includeHidden?: boolean;
94
176
  }
177
+ /**
178
+ * `user.getSteamGameList` 的可选 wire payload;`undefined` 使用全部默认查询值。
179
+ *
180
+ * @remarks
181
+ * Host 会拒绝未知字段、数字字符串和用 `0` / `1` 代替 boolean 的值。该 method 要求
182
+ * `steamLibrary` 权限,但不要求公开 `network` 权限或可信用户手势。
183
+ *
184
+ * @see [App-facing user.getSteamGameList](/reference/sdk/user/getSteamGameList)
185
+ */
95
186
  export type GetSteamGameListPayload = GetSteamGameListRequest | undefined;
187
+ /**
188
+ * Steam 游戏价格 wire 结果。所有字段都可省略,且协议不携带币种或最小货币单位。
189
+ */
96
190
  export type SteamGamePrice = {
191
+ /** 当前售价的非空展示文本。 */
97
192
  current?: string;
193
+ /** 原价的非空展示文本。 */
98
194
  initial?: string;
195
+ /** 服务端原始折扣数值;协议不承诺比例、百分比或取值范围。 */
99
196
  discount?: number;
197
+ /** 服务端最低价数值;币种和缩放单位不属于本协议。 */
100
198
  lowestPrice?: number;
199
+ /** 截止时间展示文本,不保证可解析为日期。 */
101
200
  deadlineDate?: string;
201
+ /** 服务端原始折扣截止时间数值;协议不承诺单位或时钟来源。 */
102
202
  deadlineTimestamp?: number;
103
203
  };
204
+ /**
205
+ * 经过 Host Runtime 规范化的 Steam 游戏条目;无效必填字段会导致整条记录被移除。
206
+ */
104
207
  export interface SteamGameListItem {
208
+ /** 小黑盒游戏目录 ID。 */
105
209
  appid: number;
210
+ /** Steam App ID;缺失时由 Host 回退为 `appid`。 */
106
211
  steamAppid: number;
212
+ /** trim 后的非空名称。 */
107
213
  name: string;
214
+ /** 非空封面或主图 URL 字符串。 */
108
215
  image?: string;
216
+ /** 非空 Steam 图标 URL 字符串。 */
109
217
  icon?: string;
218
+ /** 服务端原始累计游玩时长数值;协议不承诺单位。 */
110
219
  playtimeForever?: number;
220
+ /** 服务端原始最近游玩时长数值;协议不承诺单位。 */
111
221
  playtime2Weeks?: number;
222
+ /** 非空标签列表;没有有效标签时省略。 */
112
223
  tags?: string[];
224
+ /** 至少有一个可用价格字段时存在。 */
113
225
  price?: SteamGamePrice;
114
226
  }
227
+ /** Steam 游戏库的 offset 分页结果。 */
115
228
  export interface SteamGameListData {
229
+ /** 当前页通过规范化校验的游戏条目。 */
116
230
  gameList: SteamGameListItem[];
231
+ /** 服务端游戏总数;缺失或无效时省略。 */
117
232
  total?: number;
233
+ /** 有 `total` 时按 `nextOffset < total` 计算,否则按本页是否达到有效 `limit` 推断。 */
118
234
  hasMore: boolean;
235
+ /** `请求 offset + gameList.length`;下一页应直接复用该值。 */
119
236
  nextOffset: number;
237
+ /** 服务端对结果是否属于当前用户本人的标记;不可识别时省略。 */
120
238
  isMe?: boolean;
121
239
  }
240
+ /**
241
+ * `user.getSteamGameList` 的判别联合结果。
242
+ *
243
+ * @remarks
244
+ * - `isLogin: false`:未登录,`isBound` 固定为 `false`,`data` 固定为 `null`。
245
+ * - `isLogin: true, isBound: false`:已登录但未绑定 Steam,`data` 固定为 `null`。
246
+ * - 两者均为 `true`:`data` 固定为 {@link SteamGameListData},其中 `gameList` 可以为空。
247
+ */
122
248
  export type GetSteamGameListResult = {
123
249
  isLogin: false;
124
250
  isBound: false;
@@ -132,9 +258,13 @@ export type GetSteamGameListResult = {
132
258
  isBound: true;
133
259
  data: SteamGameListData;
134
260
  };
261
+ /** 公开分享渠道;Host 可以只支持其中一部分,值区分大小写。 */
135
262
  export type MiniProgramShareChannel = 'wechatSession' | 'wechatTimeline' | 'qqFriend' | 'qzone' | 'weibo';
263
+ /** 社区发帖页的可编辑分区与话题预置。 */
136
264
  export interface MiniProgramSharePostOptions {
265
+ /** 正安全整数或 trim 后非空字符串;Runtime 转为字符串并去重。 */
137
266
  topicIds?: (string | number)[];
267
+ /** trim 后非空且不以 `#` 开头或结尾的字符串;Runtime 去重。 */
138
268
  topics?: string[];
139
269
  }
140
270
  export interface MiniProgramScreenshotRect {
@@ -143,14 +273,31 @@ export interface MiniProgramScreenshotRect {
143
273
  width: number;
144
274
  height: number;
145
275
  }
276
+ /**
277
+ * `share.showShareMenu` 的 wire payload;落地页由 Runtime 固定生成,不接受 `url` 字段。
278
+ */
146
279
  export type ShowShareMenuPayload = {
280
+ /** trim 后必须非空;原字符串会交给 Host。 */
147
281
  title: string;
282
+ /** trim 后必须非空;原字符串会交给 Host。 */
148
283
  desc: string;
284
+ /** 经 Runtime 校验并编码到固定分享 URL 的 JSON-compatible 状态。 */
149
285
  extra?: unknown;
286
+ /** 可解析的绝对 HTTP(S) 缩略图 URL。 */
150
287
  imageUrl?: string;
288
+ /** 可选站外渠道;不能与有效社区 `post` 同时使用。 */
151
289
  channel?: MiniProgramShareChannel;
290
+ /**
291
+ * 可编辑社区预置;`null` 等同省略。普通分享最多保留一个分区,开发态严格拒绝无效项,
292
+ * 生产态过滤无效项并在与 `channel` 冲突时省略 `post`。
293
+ */
152
294
  post?: MiniProgramSharePostOptions | null;
153
295
  };
296
+ /**
297
+ * Host 分享面板返回的不透明值。
298
+ *
299
+ * @remarks 可能是 `undefined` 或任意对象;不能依赖结构或真假值判断用户分享结果。
300
+ */
154
301
  export type ShowShareMenuResult = unknown;
155
302
  export type CopyLinkPayload = {
156
303
  extra?: unknown;
@@ -407,32 +554,96 @@ export interface SetClipboardPayload {
407
554
  text: string;
408
555
  }
409
556
  export type SetClipboardResult = void;
557
+ /**
558
+ * `navigation.close` 的无参 wire payload。
559
+ *
560
+ * @remarks
561
+ * App-facing API 发送 `undefined`。Host Runtime 为兼容协议也接受空普通对象,但非空对象、
562
+ * 数组或其他值会返回 `INVALID_PARAMS`;payload 不能携带强制关闭、原因或窗口标识。
563
+ *
564
+ * @see [App-facing navigation.close](/reference/sdk/navigation/close)
565
+ */
410
566
  export type ClosePayload = void;
567
+ /**
568
+ * Host 接受关闭请求后的 wire 结果为 `undefined`。
569
+ *
570
+ * @remarks
571
+ * 该结果不保证 iframe 在响应抵达后继续存活,也不包含最终关闭状态。Host 销毁环境时会尽力
572
+ * 派发 `unload`;关键持久化不能依赖 Promise 后续语句或 `unload` 回调。
573
+ */
411
574
  export type CloseResult = void;
575
+ /**
576
+ * `navigation.reload` 的无参 wire payload。
577
+ *
578
+ * @remarks
579
+ * App-facing API 发送 `undefined`。Host Runtime 为兼容协议也接受空普通对象,但非空对象、
580
+ * 数组或其他值会返回 `INVALID_PARAMS`;payload 不能指定缓存策略、目标 URL 或 reload 模式。
581
+ *
582
+ * @see [App-facing navigation.reload](/reference/sdk/navigation/reload)
583
+ */
412
584
  export type ReloadPayload = void;
585
+ /**
586
+ * Host 接受 reload 请求后的 wire 结果为 `undefined`。
587
+ *
588
+ * @remarks
589
+ * 该结果不包含新页面加载状态或新 SDK 实例。旧页面内存、监听和 pending 请求不会跨 reload
590
+ * 保留;关键持久化不能依赖 Promise 后续语句或 `unload` 回调。
591
+ */
413
592
  export type ReloadResult = void;
593
+ /** 允许打开的 App 页面目标白名单;不包含任意 URL、scheme 或内部路由。 */
414
594
  export type MiniProgramAppPageTarget = 'game_detail' | 'user_detail' | 'post_detail';
595
+ /** 游戏平台类型:PC、主机或移动游戏。 */
415
596
  export type MiniProgramGameDetailGameType = 'pc' | 'console' | 'mobile';
597
+ /** 游戏详情首屏:详情主页或百科页。 */
416
598
  export type MiniProgramGameDetailPage = 'game' | 'wiki';
599
+ /** 打开游戏详情页的规范化 wire payload。 */
417
600
  export type OpenGameDetailAppPagePayload = {
601
+ /** 固定判别值。 */
418
602
  target: 'game_detail';
603
+ /** trim 后的非空游戏 app ID 字符串。 */
419
604
  appId: string;
605
+ /** 只允许 `pc`、`console`、`mobile`。 */
420
606
  gameType: MiniProgramGameDetailGameType;
607
+ /** 可选首屏,只允许 `game` 或 `wiki`。 */
421
608
  page?: MiniProgramGameDetailPage;
609
+ /** trim 后的非空来源标识。 */
422
610
  hSrc?: string;
611
+ /** trim 后的非空 SKU ID 字符串。 */
423
612
  skuId?: string;
424
613
  };
614
+ /** 打开用户详情页的规范化 wire payload。 */
425
615
  export type OpenUserDetailAppPagePayload = {
616
+ /** 固定判别值。 */
426
617
  target: 'user_detail';
618
+ /** trim 后的非空 `heybox_id` 字符串。 */
427
619
  userId: string;
428
620
  };
621
+ /** 打开帖子详情页的规范化 wire payload。 */
429
622
  export type OpenPostDetailAppPagePayload = {
623
+ /** 固定判别值。 */
430
624
  target: 'post_detail';
625
+ /** trim 后的非空帖子 ID 字符串。 */
431
626
  linkId: string;
627
+ /** 可选的非空根评论 ID 字符串。 */
432
628
  rootCommentId?: string;
629
+ /** 可选的非空目标评论 ID 字符串。 */
433
630
  commentId?: string;
434
631
  };
632
+ /**
633
+ * `navigation.openAppPage` 的判别联合 wire payload。
634
+ *
635
+ * @remarks
636
+ * Runtime 只读取上述白名单字段并构造固定 Host 路由;额外 URL、path、scheme 或窗口字段
637
+ * 不会透传。移动端 Host 支持三个目标,当前 PC Host 只支持 `game_detail` 且只消费 `appId`。
638
+ *
639
+ * @see [App-facing navigation.openAppPage](/reference/sdk/navigation/openAppPage)
640
+ */
435
641
  export type OpenAppPagePayload = OpenGameDetailAppPagePayload | OpenUserDetailAppPagePayload | OpenPostDetailAppPagePayload;
642
+ /**
643
+ * Host 接收参数并发起受控路由后的结果为 `undefined`。
644
+ *
645
+ * @remarks 不表示目标页加载完成,也不返回目标页数据、关闭结果或回调值。
646
+ */
436
647
  export type OpenAppPageResult = void;
437
648
  export type LeaderboardOrder = 'asc' | 'desc';
438
649
  export interface LeaderboardEntry {
@@ -478,61 +689,205 @@ export interface GetLeaderboardInfoResult {
478
689
  order: LeaderboardOrder;
479
690
  rankLimit: number;
480
691
  }
481
- /** 受管桌面程序可选能力。 */
692
+ /**
693
+ * 当前 Companion 产物声明并由 Host 确认的可选能力。
694
+ *
695
+ * @remarks
696
+ * - `stdio`:启动后的 Session 可以读写原始 stdin/stdout/stderr 字节流。
697
+ * - `attachments`:Session 可以按 opaque ID 打开 Host 衰减为只读的受控附件。
698
+ * - `notifications`:Session 可以请求 Host 展示固定类别的系统通知。
699
+ *
700
+ * 能力出现在 {@link CompanionInfo.capabilities} 只描述当前产物合同,不表示已经准备完成、
701
+ * 已经启动或当前 Host 一定能成功执行每次操作。启动后仍应按 `CompanionSession` 对应可选
702
+ * 属性是否存在进行分支。
703
+ */
482
704
  export type CompanionCapability = 'stdio' | 'attachments' | 'notifications';
705
+ /**
706
+ * 当前 Host 为 Companion 选择的目标制品。
707
+ *
708
+ * @remarks
709
+ * V1 仅支持 Windows x64 与 macOS arm64。该值是当前运行 Host 选中的一个 target,不是
710
+ * Manifest 声明的全部 target 列表;当前平台没有匹配制品时 `companion.getInfo()` 会拒绝,
711
+ * 不会返回猜测值。
712
+ */
483
713
  export type CompanionTarget = 'windows-x64' | 'macos-arm64';
714
+ /**
715
+ * Host 对当前 Companion 制品给出的签名检查状态。
716
+ *
717
+ * @remarks
718
+ * `unsigned` 表示未签名,`valid` 表示 Host 已确认签名有效,`invalid` 表示签名校验失败,
719
+ * `unknown` 表示 Host 尚不能确认。该字段用于展示和诊断,不会替代准备完整性校验、Host
720
+ * 授权或操作系统安全策略;本地开发制品可以是 `unsigned`。
721
+ */
484
722
  export type CompanionSignatureStatus = 'unsigned' | 'valid' | 'invalid' | 'unknown';
485
723
  /** Companion alias 的跨构建、Runtime 与 Host 规范。 */
486
724
  export declare const COMPANION_ALIAS_PATTERN: RegExp;
487
725
  /** Companion Host 可跨 bridge 保留的稳定领域错误码。 */
488
726
  export declare const COMPANION_ERROR_CODES: readonly ["COMPANION_UNSUPPORTED", "COMPANION_PREVIEW_UNSUPPORTED", "COMPANION_NOT_DECLARED", "COMPANION_TARGET_UNSUPPORTED", "COMPANION_NOT_PREPARED", "COMPANION_PREPARATION_CANCELLED", "COMPANION_DOWNLOAD_FAILED", "COMPANION_DESCRIPTOR_UNAVAILABLE", "COMPANION_ARCHIVE_INVALID", "COMPANION_INTEGRITY_FAILED", "COMPANION_ENTRYPOINT_INVALID", "COMPANION_USER_CANCELLED", "COMPANION_ELEVATION_DENIED", "COMPANION_OS_BLOCKED", "COMPANION_LAUNCH_FAILED", "COMPANION_SESSION_VERSION_MISMATCH", "COMPANION_SESSION_OWNERSHIP_LOST", "COMPANION_SESSION_EXITED", "COMPANION_PIPE_CLOSED", "COMPANION_OUTPUT_LIMIT", "COMPANION_PROCESS_CRASHED", "COMPANION_ATTACHMENT_NOT_FOUND", "COMPANION_NOTIFICATION_UNAVAILABLE", "COMPANION_TERMINATE_FAILED"];
489
727
  export type CompanionErrorCode = (typeof COMPANION_ERROR_CODES)[number];
728
+ /**
729
+ * Host 针对当前小程序版本与当前平台确认的 Companion 描述快照。
730
+ *
731
+ * @remarks
732
+ * Runtime 会校验字段、去重并冻结 `capabilities`,再返回冻结对象;页面不应修改或缓存为
733
+ * 跨版本事实。该结构刻意不包含准备 `state`、进度、`preparedAt`、Session ID、PID、物理
734
+ * 路径、下载 URL、SHA-256、entrypoint 或单独的 Companion 版本号。
735
+ *
736
+ * 准备状态通过 `companion.getPreparationStatus()` 查询。Companion 随当前小程序审核版本、
737
+ * 精确预览版本或本地开发快照绑定;`source` 只说明来源类别,不提供版本号,也不能用于
738
+ * 比较版本新旧。
739
+ *
740
+ * @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/sdk/companion/getInfo.html | companion.getInfo}
741
+ * @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/sdk/companion/getPreparationStatus.html | companion.getPreparationStatus}
742
+ */
490
743
  export interface CompanionInfo {
744
+ /**
745
+ * 规范 alias;必须与请求值及 `package.json#heybox.companions` 中的 key 完全一致。
746
+ */
491
747
  alias: string;
748
+ /**
749
+ * Host 确认的用户可见名称,只用于展示;不要把它当作稳定标识、文件名或版本号。
750
+ */
492
751
  displayName: string;
752
+ /** 当前 Host 选中的目标制品;不是项目声明的全部 target。 */
493
753
  target: CompanionTarget;
754
+ /**
755
+ * 当前产物声明且 Host 确认的去重能力列表;可能为空,不代表产物已准备或已启动。
756
+ */
494
757
  capabilities: readonly CompanionCapability[];
758
+ /** 当前压缩归档大小,单位字节;是大于等于 `0` 的安全整数,不是解压后磁盘占用。 */
495
759
  archiveBytes: number;
760
+ /** Host 对当前制品给出的签名检查状态;不能替代完整性校验或系统安全判断。 */
496
761
  signatureStatus: CompanionSignatureStatus;
497
- /** Host 确认的产物来源;旧 Host 缺省时来源未知。 */
762
+ /**
763
+ * Host 确认的产物来源。
764
+ *
765
+ * @remarks
766
+ * `local-dev` 是当前 `hb-sdk dev` 绑定的本地快照;`preview` 是精确审核前预览版本;
767
+ * `released` 是已发布版本。旧 Host 缺省时为 `undefined`,只表示来源未知,不应回退为
768
+ * `released`。不要根据 alias、displayName、签名状态或页面 URL 自行推断来源。
769
+ */
498
770
  source?: 'local-dev' | 'preview' | 'released';
499
771
  }
772
+ /**
773
+ * Host 最近一次 Companion 准备失败的公开摘要。
774
+ *
775
+ * @remarks
776
+ * Runtime 只保留稳定领域错误码、规范化文案和重试建议;原生路径、下载地址、堆栈和其他
777
+ * Host 诊断信息不会下发。该摘要描述最近一次准备,不代表当前正在自动重试。
778
+ */
500
779
  export interface CompanionErrorSummary {
780
+ /** 稳定的 Companion 领域错误码;业务分支应比较该字段,不要比较 `message`。 */
501
781
  code: CompanionErrorCode;
782
+ /** Runtime 根据错误码生成的安全展示文案;不承诺保留 Host 原始 message。 */
502
783
  message: string;
784
+ /**
785
+ * Host 对“以新的可信用户操作再次调用 `prepare()` 是否可能成功”的建议。
786
+ *
787
+ * `true` 不会触发自动重试,也不绕过权限、授权、完整性或手势要求;调用方仍应采用
788
+ * 有界重试。`false` 表示不应原样循环重试,通常需要修改产物、配置或环境。
789
+ */
503
790
  retryable: boolean;
504
791
  }
792
+ /**
793
+ * Host 持有的 Companion 准备操作的最近进度快照。
794
+ *
795
+ * @remarks
796
+ * 三个阶段的计数都是非负安全整数。Runtime 只保证同一进度对象内当前值不大于已知总量,
797
+ * 不定义 verifying/extracting 与下载字节之间的换算,也不保证不同阶段的 total 相同;进度
798
+ * 只能用于展示当前阶段,不能作为归档完整性证据。
799
+ */
505
800
  export type CompanionPrepareProgress = {
801
+ /** 下载阶段判别值。 */
506
802
  phase: 'downloading';
803
+ /** Host 已下载的非负安全整数计数。 */
507
804
  loaded: number;
805
+ /** Host 已知总量;未知时省略,存在时为不小于 `loaded` 的非负安全整数。 */
508
806
  total?: number;
509
807
  } | {
808
+ /** 校验阶段判别值。 */
510
809
  phase: 'verifying';
810
+ /** Host 已校验的非负安全整数计数,且不大于 `total`。 */
511
811
  processed: number;
812
+ /** 当前校验阶段的非负安全整数总量。 */
512
813
  total: number;
513
814
  } | {
815
+ /** 解压阶段判别值。 */
514
816
  phase: 'extracting';
817
+ /** Host 已处理的非负安全整数计数,且不大于 `total`。 */
515
818
  processed: number;
819
+ /** 当前解压阶段的非负安全整数总量。 */
516
820
  total: number;
517
821
  };
822
+ /**
823
+ * 当前小程序版本、当前平台与指定 alias 对应的 Host 准备状态快照。
824
+ *
825
+ * @remarks
826
+ * 这是以 `state` 为判别字段的四态联合,Runtime 会冻结返回对象及嵌套的 `progress` 或
827
+ * `error`。它描述 Host 持久状态,不等同于某个页面中 `prepare()` Promise 的状态,也不会
828
+ * 随后台操作自动变化;需要最新值时重新调用 `companion.getPreparationStatus()`。
829
+ *
830
+ * @see {@link https://docs.xiaoheihe.cn/hb_sdk/reference/sdk/companion/getPreparationStatus.html | companion.getPreparationStatus}
831
+ */
518
832
  export type CompanionPreparationStatus = {
833
+ /** 当前版本与 target 尚无已原子提交的本地产物,也没有在途准备。 */
519
834
  state: 'not-prepared';
520
835
  } | {
836
+ /** Host 正在下载、校验或解压;页面 reload 或隐藏不会自动取消该操作。 */
521
837
  state: 'preparing';
838
+ /** 查询时 Host 保存的最近进度;这是快照,不是持续订阅。 */
522
839
  progress: CompanionPrepareProgress;
523
840
  } | {
841
+ /** 当前版本产物已原子提交,可以由新的可信用户操作调用 `launch()`。 */
524
842
  state: 'ready';
843
+ /**
844
+ * Host 提供的非负安全整数准备完成时间戳。
845
+ *
846
+ * 协议不公开时钟来源、时区或过期语义;只适合展示和诊断,不应用于授权、版本比较
847
+ * 或判断产物仍然有效。
848
+ */
525
849
  preparedAt: number;
526
850
  } | {
851
+ /** 最近一次准备已失败,当前没有可由该状态直接启动的新产物。 */
527
852
  state: 'failed';
853
+ /** 经过 Runtime 脱敏和规范化的失败摘要。 */
528
854
  error: CompanionErrorSummary;
529
855
  };
856
+ /**
857
+ * Host 归一化后的 Companion 进程终止原因。
858
+ *
859
+ * @remarks
860
+ * - `exited`:进程自行退出并提供 exit code;不表示 code 必然为 `0`。
861
+ * - `terminated`:Host 报告进程已被显式终止。
862
+ * - `crashed`:Host 把终态归类为异常崩溃。
863
+ * - `host-shutdown`:Host 或其进程监管环境关闭。
864
+ * - `permission-revoked`:Companion 权限撤销导致 Session 终止。
865
+ * - `output-limit`:Host 的输出上限导致 Session 终止。
866
+ *
867
+ * 该枚举描述 Host 确认的终态,不包含 controller ownership 转移;后者不会结束进程。
868
+ */
530
869
  export type CompanionExitReason = 'exited' | 'terminated' | 'crashed' | 'host-shutdown' | 'permission-revoked' | 'output-limit';
870
+ /**
871
+ * Companion Session 的一次性退出结果。
872
+ *
873
+ * @remarks
874
+ * 这是以 `reason` 判别的只读语义结果。Runtime 只接受上方固定 reason,并要求所有出现的
875
+ * `exitCode` 都是 safe integer;非法 Host 事件会被丢弃,不会进入 SDK Session。
876
+ * `reason: 'exited'` 必须携带 `exitCode`,其余 Host 终止原因可携带或省略。exit code 的正负、
877
+ * 具体编号和成功含义由 Companion 与目标操作系统决定,SDK 不把它转换为 HTTP 状态、信号或错误码。
878
+ *
879
+ * @see [CompanionSession.waitForExit()](/reference/symbols/root/interfaces/CompanionSession#waitforexit)
880
+ * @see [CompanionSession.onExit()](/reference/symbols/root/interfaces/CompanionSession#onexit)
881
+ */
531
882
  export type CompanionExit = {
883
+ /** 进程自行退出;该分支始终提供一个 safe-integer `exitCode`。 */
532
884
  reason: 'exited';
885
+ /** Companion / 操作系统提供的进程退出码;调用方应按自己的进程合同解释。 */
533
886
  exitCode: number;
534
887
  } | {
888
+ /** Host 确认的非普通退出原因;不会取值 `exited`。 */
535
889
  reason: Exclude<CompanionExitReason, 'exited'>;
890
+ /** Host 可提供的 safe-integer 进程退出码;缺失时不要自行填充 `0` 或其他哨兵值。 */
536
891
  exitCode?: number;
537
892
  };
538
893
  /** 活动 Session 的 wire 快照;不包含路径、PID 或原生句柄。 */