@laplace.live/internal 1.2.57 → 1.3.0

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.
@@ -0,0 +1,1608 @@
1
+ import type { BilibiliInternal } from './bilibili'
2
+
3
+ /**
4
+ * LAPLACE 内部 typings
5
+ */
6
+ export declare namespace LaplaceInternal {
7
+ /**
8
+ * HTTP(S) 协议类型的 API
9
+ */
10
+ export namespace HTTPS {
11
+ /**
12
+ * LAPLACE Workers
13
+ */
14
+ export namespace Workers {
15
+ /**
16
+ * 获取云端弹幕机配置
17
+ * /laplace/remote-config
18
+ */
19
+ export interface RemoteConfig {
20
+ headerText?: string
21
+ headerSubtitle?: string
22
+ headerLink?: string
23
+ headerLogo?: string
24
+ headerLogoWidth?: number
25
+ headerLogoHeight?: number
26
+ footerExtraText?: string
27
+ footerText?: string
28
+ footerLink?: string
29
+ }
30
+
31
+ /**
32
+ * Gatus status response
33
+ * /laplace/network
34
+ */
35
+ export interface NetworkItem {
36
+ /** "miscs" */
37
+ group: string
38
+ /** miscs_bilibili-fingerprint-reporter */
39
+ key: string
40
+ /** bilibili-fingerprint-reporter */
41
+ name: string
42
+ results: {
43
+ status: number
44
+ duration: number
45
+ hostname?: string
46
+ success: boolean
47
+ /** 2024-04-28T08:22:07.19385135Z */
48
+ timestamp: string
49
+ errors?: string[]
50
+ conditionResults?: {
51
+ /** "[CERTIFICATE_EXPIRATION] > 48h" */
52
+ condition: string
53
+ success: boolean
54
+ }[]
55
+ }[]
56
+ }
57
+
58
+ /**
59
+ * Login Sync info
60
+ * A subset of `BilibiliInternal.HTTPS.Prod.LiveGetUserInfo`
61
+ */
62
+ export interface LoginSyncInfo {
63
+ /** 0: 成功 */
64
+ code: number
65
+ message: string
66
+ data: {
67
+ isLogin: boolean
68
+ face: string
69
+ mid: number
70
+ uname: string
71
+ /** The actual `buvid` */
72
+ ack: string
73
+ fetchMode: 'login-sync' | 'anonymous' | 'built-in'
74
+ ackMode: 'guest' | 'passthrough' | 'builtin-passthrough'
75
+ fetcher: number
76
+ syncServer: boolean
77
+ }
78
+ }
79
+
80
+ /**
81
+ * 获取云端表情包
82
+ * /laplace/remote-emotes
83
+ */
84
+ export interface PspRemoteEmotesProps {
85
+ /**
86
+ * - 0: valid result
87
+ * - 403: not valid
88
+ */
89
+ status: number
90
+ data: {
91
+ emoji: {
92
+ server_base: string
93
+ map: {
94
+ [key: string]: string
95
+ }
96
+ }
97
+ }
98
+ }
99
+
100
+ /**
101
+ * 直播间排名列表,由外部 API 聚合而来
102
+ * /laplace/ranking
103
+ */
104
+ export interface RankingItem {
105
+ /**
106
+ * @minimum 1
107
+ */
108
+ _laplace_rank: number
109
+ cate: string
110
+ uname: string
111
+ uid: number
112
+ face: string
113
+ cover: string
114
+ system_cover: string
115
+ start_time: number
116
+ roomid: number
117
+ watched?: number
118
+ watched_avg?: number
119
+ ten_minutes_counter: number
120
+ interaction_avg?: number
121
+ income?: number
122
+ income_avg?: number
123
+ danmakus?: number
124
+ danmakus_avg?: number
125
+ title: string
126
+ tags?: string[]
127
+ commentCount?: number
128
+ lastLiveIncome?: number
129
+ /**
130
+ * laplace/loveava 独有的热度/人气字段
131
+ */
132
+ count?: number
133
+ /**
134
+ * 平均观看人数
135
+ */
136
+ count_avg?: number
137
+ }
138
+
139
+ /** 关注 API 的数据库扩展 */
140
+ interface FollowingResponseExtended extends BilibiliInternal.HTTPS.Prod.GameCenterFollowingList {
141
+ /**
142
+ * 最后 KV 缓存写入时间戳
143
+ */
144
+ last: number
145
+ /**
146
+ * 数据来源
147
+ */
148
+ from: 'cache' | 'origin'
149
+ }
150
+
151
+ /**
152
+ * 由 vtbs 整理来的直播间开播状态
153
+ */
154
+ interface LiveState {
155
+ name: string
156
+ room: number
157
+ liveStatus: number
158
+ lastLive: {
159
+ time: number
160
+ }
161
+ title: string
162
+ time: number
163
+ liveStartTime: number
164
+ }
165
+
166
+ /**
167
+ * UID by Room
168
+ */
169
+ interface UidByRoom {
170
+ /**
171
+ * 0 正常,404 未找到直播间
172
+ */
173
+ status: 0 | 404
174
+ uid: number
175
+ /** 真实房间号 */
176
+ roomId: number
177
+ /** 短房间号 */
178
+ shortRoomId: number
179
+ /** 用户名 */
180
+ username: string | null
181
+ }
182
+
183
+ /**
184
+ * 哔哩哔哩装扮列表
185
+ */
186
+ interface Suit {
187
+ id: number
188
+ name: string
189
+ description: string
190
+ startTime: number
191
+ totalPurchaseCount: number
192
+ user: number
193
+ username: string
194
+ owner: number
195
+ image_cover: string | null
196
+ createdAt: string
197
+ updatedAt: string
198
+ ownerDetails: {
199
+ id: number
200
+ room: number
201
+ username: string
202
+ guild: null
203
+ avatar: string
204
+ updatedAt: string
205
+ } | null
206
+ }
207
+
208
+ /**
209
+ * 哔哩哔哩收藏集列表
210
+ */
211
+ interface Collection {
212
+ id: number
213
+ name: string
214
+ description: string
215
+ startTime: number
216
+ relatedUsers: number[]
217
+ totalPreorderCount: number
218
+ totalPurchaseCount: number
219
+ /** @deprecated use `lottery_image` */
220
+ act_square_img: string
221
+ lottery_image: string
222
+ createdAt: string
223
+ updatedAt: string
224
+ }
225
+
226
+ /**
227
+ * 日程表项目
228
+ * @link https://laplace.live/schedule
229
+ */
230
+ export interface WeekItem {
231
+ /** 年份,例如 2024 */
232
+ year: number
233
+ /** 当前周数,例如 19 */
234
+ week: number
235
+ /** 哔哩哔哩动态对应 ID,只需要填入 ID 即可 */
236
+ bilibili_url?: string
237
+ events: EventItem[]
238
+ }
239
+
240
+ /**
241
+ * Item of WeekItem events
242
+ * 此处 type 为简化版 `string`,在 laplace 本体仓库中有详细定义
243
+ */
244
+ export interface EventItem {
245
+ /** 日期字符串,格式 YYYY-MM-DD */
246
+ date: string
247
+ /** 日程类型 */
248
+ type: string
249
+ /** 日程标题 */
250
+ title: string
251
+ /** 录播链接,此应填入完整 URL */
252
+ rec?: string
253
+ /** 是否被取消,此字段用于 iCal 日历 */
254
+ cancelled?: boolean
255
+ /** 取消原因 */
256
+ reason?: string
257
+ /** 录播是否为第三方录入 */
258
+ fans_rec?: boolean
259
+ }
260
+
261
+ /** 多媒体可用语言 */
262
+ export type MediaLanguages = 'zh' | 'en' | 'ja' | 'yue' | 'kr' | 'ru' | 'es' | 'fr'
263
+
264
+ /**
265
+ * 多媒体项目
266
+ */
267
+ export interface MediaItem {
268
+ ver: number
269
+ /** 当前媒体语言,例如 `en` */
270
+ lang: MediaLanguages
271
+ /** 日期 */
272
+ date: string
273
+ /** 是否有切片,完整 URL */
274
+ clips?: string
275
+ /** 标题 */
276
+ title: string
277
+ /** alternate 名称,通常用于提供标题的无翻译原文 */
278
+ altName?: string
279
+ /** 是否为官方发布 */
280
+ official?: boolean
281
+ /** 作者/艺术家 */
282
+ author: string
283
+ /** 备注内容 */
284
+ note?: string
285
+ /** 是否为本站首发,LAPLACE 内部字段 */
286
+ exclusive?: boolean
287
+ /**
288
+ * 标签
289
+ * 如果一场直播内唱了多次同一首歌曲,会导致声称的文件名重复,用此属性定义额外后缀防止冲突
290
+ */
291
+ tags?: string
292
+ }
293
+
294
+ /**
295
+ * 时间线项目
296
+ * @link https://laplace.live/timeline
297
+ */
298
+ export interface TimelineItem {
299
+ /**
300
+ * - `hitokoto`: 一言
301
+ * - `video`: 视频
302
+ * - `event`: 事件
303
+ */
304
+ type: 'hitokoto' | 'video' | 'event'
305
+ /** 内容 */
306
+ content: string
307
+ /** 事件关联人物 */
308
+ from_who: string
309
+ /** 是否含有音声,LAPLACE 内部字段 */
310
+ hasVoice?: boolean
311
+ /** 音声对应文件名,LAPLACE 内部字段 */
312
+ voiceFilename?: string
313
+ /** 事件发生点 */
314
+ from?: string
315
+ /** 事件消息来源 */
316
+ source?: string
317
+ /** 事件日期 */
318
+ date?: string
319
+ }
320
+
321
+ /**
322
+ * 开发日志项目
323
+ * @link https://laplace.live/blog
324
+ */
325
+ export interface BlogItem {
326
+ id: number
327
+ date: string
328
+ title?: string
329
+ content: string | null
330
+ /** 给 Atom RSS 用的纯文本输出 */
331
+ plain?: string
332
+ author?: string
333
+ tags?: string[]
334
+ }
335
+
336
+ /**
337
+ * SuperChat FoS
338
+ * @link /laplace/superchat-fos
339
+ */
340
+ export interface SuperChatFoS {
341
+ code: number
342
+ /** 报错时会返回 */
343
+ message?: string
344
+ content: string
345
+ moderated: boolean
346
+ }
347
+
348
+ /**
349
+ * 用户信息
350
+ * @link /laplace/bilibili-user/:uid
351
+ */
352
+ export interface BilibiliUser {
353
+ /** 对应 UID */
354
+ id: number
355
+ username: string
356
+ /**
357
+ * 之前泄漏的工会字段
358
+ *
359
+ * @deprecated use `guildInfo` instead
360
+ */
361
+ guild: string
362
+ room: number
363
+ liveFansCount: number
364
+ liveFansMedal: string | null
365
+ avatar: string | null
366
+ /** 2024-12-15T03:44:13.788Z */
367
+ updatedAt: string
368
+ /**
369
+ * 工会详细信息
370
+ *
371
+ * @deprecated use `guildInfo` instead
372
+ */
373
+ guildDetails: {
374
+ id: number
375
+ name: string
376
+ } | null
377
+ /** 工会详细信息 */
378
+ guildInfo: {
379
+ /**
380
+ * @deprecated use `history` instead, latest guild is now migrated to history in Sep 25, 2025, 4:51:27 AM PDT
381
+ */
382
+ current: {
383
+ name: string
384
+ /** Unix timestamp
385
+ *
386
+ * @example 1758039520166
387
+ */
388
+ updatedAt: number
389
+ } | null
390
+ history: {
391
+ name: string
392
+ /** Unix timestamp
393
+ *
394
+ * @example 1758039520166
395
+ */
396
+ updatedAt: number
397
+ }[]
398
+ } | null
399
+ /** MCN 机构详细信息 (mcnId is internal-only, not exposed in public API) */
400
+ mcnInfo: {
401
+ history: {
402
+ /** MCN agency name */
403
+ mcnName: string
404
+ /** Unix timestamp
405
+ *
406
+ * @example 1758039520166
407
+ */
408
+ updatedAt: number
409
+ }[]
410
+ } | null
411
+ /** Resolved tags with usage counts. Only present when `?fields=tags` is requested. */
412
+ tags?: LaplaceInternal.HTTPS.Workers.TagWithCount[]
413
+ }
414
+
415
+ /**
416
+ * 列表哔哩哔哩用户(分页)
417
+ * @link /laplace/bilibili-users
418
+ *
419
+ * Query params:
420
+ * - `?page=1` — page number (min 1, default 1)
421
+ * - `?pageSize=100` — items per page (1–500, default 100)
422
+ * - `?all=true` — return all rows without pagination
423
+ * - `?tags=1,2,3` — filter to users who have all listed tag IDs (AND)
424
+ * - `?search=keyword` — filter by UID (exact) or username (case-insensitive partial match)
425
+ */
426
+ export interface ListBilibiliUsers {
427
+ data: ListBilibiliUsersItem[]
428
+ total: number
429
+ }
430
+
431
+ /**
432
+ * Single user item returned by the list endpoint.
433
+ *
434
+ * Differs from {@link BilibiliUser} (single-user endpoint) because the list
435
+ * query returns raw DB rows without relation joins or sanitization:
436
+ * - `guild` is a raw numeric FK (not a resolved name string)
437
+ * - `tags` is a raw `int[]` (not resolved {@link TagWithCount} objects)
438
+ * - `mcnInfo.history` entries include `mcnId` (stripped in single-user endpoint)
439
+ * - No `guildDetails` relation (only present when joined via single-user query)
440
+ */
441
+ export interface ListBilibiliUsersItem {
442
+ id: number
443
+ room: number | null
444
+ username: string
445
+ liveFansCount: number | null
446
+ liveFansMedal: string | null
447
+ liveStatus: number | null
448
+ /** @deprecated use `guildInfo` instead */
449
+ guild: number | null
450
+ avatar: string | null
451
+ guildInfo: {
452
+ history: {
453
+ name: string
454
+ /** Unix timestamp */
455
+ updatedAt: number
456
+ }[]
457
+ } | null
458
+ mcnInfo: {
459
+ history: {
460
+ mcnId: number
461
+ mcnName: string
462
+ /** Unix timestamp */
463
+ updatedAt: number
464
+ }[]
465
+ } | null
466
+ /** Raw integer tag IDs assigned to this user */
467
+ tags: number[] | null
468
+ /** ISO 8601 timestamp */
469
+ updatedAt: string
470
+ }
471
+
472
+ // ============================================
473
+ // Tag Types
474
+ // ============================================
475
+
476
+ /** Tag definition (viewer-facing, no internal fields) */
477
+ export interface Tag {
478
+ id: number
479
+ name: string
480
+ color: string | null
481
+ /** Emoji fallback -- shown when `icon` is not set. When both exist, `icon` takes priority. */
482
+ emoji: string | null
483
+ /** Icon URL -- takes priority over `emoji` when both are set. */
484
+ icon: string | null
485
+ description: string | null
486
+ }
487
+
488
+ /** Tag with usage count (viewer-facing, entity type is not exposed) */
489
+ export interface TagWithCount extends Tag {
490
+ /** Number of entities using this tag, computed on-the-fly for the requested entity type. */
491
+ count: number
492
+ }
493
+
494
+ /** Full tag definition (admin-facing, includes internal fields) */
495
+ export interface TagAdmin extends Tag {
496
+ scope: string[] | null
497
+ /** Per-entity-type usage counts, computed on-the-fly. Keys are entity type names (e.g. `bilibili_user`, `bilibili_meme`). */
498
+ entityCounts: Record<string, number>
499
+ createdAt: string
500
+ updatedAt: string
501
+ }
502
+
503
+ /** Request body for POST /laplace/tags (create tag) */
504
+ export interface TagCreateRequest {
505
+ name: string
506
+ color?: string
507
+ emoji?: string
508
+ icon?: string
509
+ description?: string
510
+ scope?: string[]
511
+ }
512
+
513
+ /** Request body for PATCH /laplace/tags/:id (update tag) */
514
+ export interface TagUpdateRequest {
515
+ name?: string
516
+ color?: string | null
517
+ emoji?: string | null
518
+ icon?: string | null
519
+ description?: string | null
520
+ scope?: string[] | null
521
+ }
522
+
523
+ /** Request body for POST /laplace/tags/assign (assign tags to entity) */
524
+ export interface TagAssignRequest {
525
+ tagIds: number[]
526
+ entityType: string
527
+ entityId: number
528
+ }
529
+
530
+ /** Request body for DELETE /laplace/tags/assign (unassign tags from entity) */
531
+ export interface TagUnassignRequest {
532
+ tagIds: number[]
533
+ entityType: string
534
+ entityId: number
535
+ }
536
+
537
+ /**
538
+ * 礼物配置信息
539
+ */
540
+ export interface RoomGiftItem extends BilibiliInternal.HTTPS.Prod.RoomGiftItemPick {
541
+ /** 出现的时间 */
542
+ firstSeen?: Date
543
+ /** 出现的直播间 */
544
+ firstSeenRoom?: number
545
+ }
546
+
547
+ /**
548
+ * 礼物配置列表
549
+ * @link /bilibili/room-gift-config/25034104?list=1
550
+ */
551
+ export interface RoomGiftConfigList {
552
+ code: number
553
+ message: string
554
+ ttl: number
555
+ gift_ttl: number
556
+ gift_version: number
557
+ data: {
558
+ list: RoomGiftItem[]
559
+ }
560
+ }
561
+
562
+ /**
563
+ * 获取直播分区列表
564
+ * @link /bilibili/live-areas
565
+ */
566
+ export interface LiveAreas {
567
+ /** 0 代表成功 */
568
+ code: number
569
+ /** 成功时返回 "success" */
570
+ message: string
571
+ /** 直播分区列表 */
572
+ data: LiveAreaItem[]
573
+ }
574
+
575
+ /**
576
+ * 直播分区项
577
+ */
578
+ export interface LiveAreaItem {
579
+ /** 分区 ID */
580
+ id: string
581
+ /** 分区名称 */
582
+ name: string
583
+ /** 父分区 ID */
584
+ parentId: string
585
+ /** 父分区名称 */
586
+ parentName: string
587
+ /** 完整分区名称,格式为 `${parentName}-${name}` */
588
+ cate: string
589
+ /** 分区图标 URL */
590
+ icon: string
591
+ }
592
+
593
+ /**
594
+ * Response interface for the transformed LiveGiftEffect data
595
+ * Used by frontend to consume the simplified gift effect data
596
+ * @example /bilibili/live-gift-effect/25034104
597
+ */
598
+ export interface LiveGiftEffect {
599
+ code: number
600
+ message: string
601
+ data: LiveGiftEffectItem[]
602
+ }
603
+
604
+ /**
605
+ * Simplified gift effect item with only necessary fields
606
+ */
607
+ export interface LiveGiftEffectItem {
608
+ type: number
609
+ id: number
610
+ bind_gift_ids: number[]
611
+ video: string
612
+ /** json config URL, only the hash part */
613
+ json: string
614
+ }
615
+
616
+ /**
617
+ * Successful response for guild members list
618
+ * @example /laplace/bilibili-guilds/:guildName
619
+ */
620
+ export interface ListGuildMembers {
621
+ success: true
622
+ guild: string
623
+ count: number
624
+ members: LaplaceInternal.HTTPS.Workers.BilibiliUser[]
625
+ }
626
+
627
+ /**
628
+ * Error response when guild is not found
629
+ * @example /laplace/bilibili-guilds/:guildName
630
+ */
631
+ export interface ListGuildMembersNotFound {
632
+ success: false
633
+ error: string
634
+ guild: string
635
+ }
636
+
637
+ /**
638
+ * Request body for guild info update
639
+ * @example POST /laplace/guild-update
640
+ */
641
+ export interface UpdateGuildInfoRequest {
642
+ uid: number
643
+ guildName: string
644
+ updatedAt?: number
645
+ }
646
+
647
+ /**
648
+ * Successful response for guild info update
649
+ * @example POST /laplace/guild-update
650
+ */
651
+ export interface UpdateGuildInfoResponse {
652
+ success: true
653
+ message: string
654
+ uid: number
655
+ guildName: string
656
+ updatedAt: number
657
+ }
658
+
659
+ /**
660
+ * Error response for guild info update
661
+ * @example POST /laplace/guild-update
662
+ */
663
+ export interface UpdateGuildInfoError {
664
+ success: false
665
+ error: string
666
+ uid?: number
667
+ details?: string
668
+ }
669
+
670
+ // ============================================
671
+ // Fertility Cycle Types
672
+ // ============================================
673
+
674
+ /**
675
+ * Fertility status enum values
676
+ *
677
+ * @since Jan 29, 2026
678
+ * @example GET /bilibili/fertility/:uid
679
+ * @example GET /bilibili/fertilities
680
+ */
681
+ export type FertilityStatus = 'menstruating' | 'fertile' | 'ovulating' | 'normal'
682
+
683
+ /**
684
+ * A single cycle history entry - tracks each period event
685
+ * Stored in the `cycleHistory` JSONB column
686
+ */
687
+ export interface CycleHistoryItem {
688
+ /** Unix timestamp (ms) - when this period started */
689
+ periodStart: number
690
+ /** Optional: days this period lasted (user may not track) */
691
+ periodLength?: number
692
+ /** Unix timestamp (ms) - when this entry was recorded */
693
+ submittedAt: number
694
+ /** Optional: URL or description of the evidence source (e.g., livestream clip, tweet) */
695
+ source?: string
696
+ }
697
+
698
+ /**
699
+ * Result of fertility status calculation
700
+ * Returned by calculateFertilityStatus utility
701
+ */
702
+ export interface CycleCalculationResult {
703
+ status: FertilityStatus
704
+ /** Current day in the menstrual cycle (1-indexed) */
705
+ dayInCycle: number
706
+ /** Calculated from history or user-stated preference */
707
+ effectiveCycleLength: number
708
+ /** Calculated from history or user-stated preference */
709
+ effectivePeriodLength: number
710
+ /** Calculated ovulation day (cycleLength - 14) */
711
+ ovulationDay: number
712
+ /** Predicted next period start date */
713
+ nextPeriod: Date
714
+ /** How many history entries used for calculation */
715
+ dataPoints: number
716
+ }
717
+
718
+ /**
719
+ * Response for GET /bilibili/fertility/:uid
720
+ */
721
+ export interface FertilityUserResponse {
722
+ uid: number
723
+ user: {
724
+ username: string
725
+ avatar: string | null
726
+ room: number | null
727
+ /** 0 = offline, 1 = live, 2 = rotating */
728
+ liveStatus: number | null
729
+ /** Number of live room membership */
730
+ liveFansCount: number | null
731
+ /** Guild membership info */
732
+ guildInfo: {
733
+ history: {
734
+ name: string
735
+ /** Unix timestamp in milliseconds */
736
+ updatedAt: number
737
+ }[]
738
+ } | null
739
+ /** MCN agency membership info */
740
+ mcnInfo: {
741
+ history: {
742
+ /** MCN agency ID */
743
+ mcnId: number
744
+ /** MCN agency name */
745
+ mcnName: string
746
+ /** Unix timestamp in milliseconds */
747
+ updatedAt: number
748
+ }[]
749
+ } | null
750
+ } | null
751
+ status: FertilityStatus
752
+ dayInCycle: number
753
+ ovulationDay: number
754
+ /** ISO date string (YYYY-MM-DD) */
755
+ nextPeriod: string
756
+ effectiveCycleLength: number
757
+ effectivePeriodLength: number
758
+ dataPoints: number
759
+ userPreferences: {
760
+ cycleLength: number
761
+ periodLength: number
762
+ }
763
+ history: CycleHistoryItem[]
764
+ }
765
+
766
+ /**
767
+ * Single user item in list response
768
+ * @example GET /bilibili/fertilities
769
+ */
770
+ export interface FertilityListItem {
771
+ uid: number
772
+ user: {
773
+ username: string
774
+ avatar: string | null
775
+ room: number | null
776
+ /** 0 = offline, 1 = live, 2 = rotating */
777
+ liveStatus: number | null
778
+ /** Number of live room followers */
779
+ liveFansCount: number | null
780
+ /** Guild membership info */
781
+ guildInfo: {
782
+ history: {
783
+ name: string
784
+ /** Unix timestamp in milliseconds */
785
+ updatedAt: number
786
+ }[]
787
+ } | null
788
+ /** MCN agency membership info */
789
+ mcnInfo: {
790
+ history: {
791
+ /** MCN agency ID */
792
+ mcnId: number
793
+ /** MCN agency name */
794
+ mcnName: string
795
+ /** Unix timestamp in milliseconds */
796
+ updatedAt: number
797
+ }[]
798
+ } | null
799
+ } | null
800
+ status: FertilityStatus
801
+ dayInCycle: number
802
+ /** Expected ovulation day in cycle (effectiveCycleLength - 14) */
803
+ ovulationDay: number
804
+ /** ISO date string (YYYY-MM-DD) */
805
+ nextPeriod: string
806
+ /** Calculated cycle length based on history (median) or user preference */
807
+ effectiveCycleLength: number
808
+ /** Calculated period length based on history (mean) or user preference */
809
+ effectivePeriodLength: number
810
+ /** Number of history entries used for calculation */
811
+ dataPoints: number
812
+ }
813
+
814
+ /**
815
+ * Response for GET /bilibili/fertilities
816
+ */
817
+ export interface FertilityListResponse {
818
+ data: FertilityListItem[]
819
+ total: number
820
+ }
821
+
822
+ /**
823
+ * Request body for POST /bilibili/fertility-submit
824
+ */
825
+ export interface FertilitySubmitRequest {
826
+ /** Bilibili user ID */
827
+ uid: number
828
+ /** Unix timestamp (ms) when period started */
829
+ periodStart: number
830
+ /** Optional: How many days this period lasted (1-15) */
831
+ periodLength?: number
832
+ /** Optional: Update user's preferred cycle length (15-60) */
833
+ cycleLength?: number
834
+ /** Optional: Evidence URL (must be a valid URL, max 256 chars) */
835
+ source?: string
836
+ }
837
+
838
+ /**
839
+ * Success response for POST /bilibili/fertility-submit
840
+ */
841
+ export interface FertilitySubmitResponse {
842
+ success: true
843
+ uid: number
844
+ historyCount: number
845
+ /** ISO timestamp string */
846
+ lastPeriodStart: string
847
+ }
848
+
849
+ // ============================================
850
+ // Fertility Cycle Entry Management (Admin)
851
+ // ============================================
852
+
853
+ /**
854
+ * Request body for PATCH /laplace/fertility-entry/:uid
855
+ * Updates a specific history entry identified by originalPeriodStart
856
+ */
857
+ export interface FertilityEntryUpdateRequest {
858
+ /** Required: periodStart of the entry to update (identifier) */
859
+ originalPeriodStart: number
860
+ /** Optional: New periodStart value (Unix timestamp ms) */
861
+ periodStart?: number
862
+ /** Optional: Period length (1-15 days), or null to clear */
863
+ periodLength?: number | null
864
+ /** Optional: Evidence URL, or null to clear */
865
+ source?: string | null
866
+ }
867
+
868
+ /**
869
+ * Request body for DELETE /laplace/fertility-entry/:uid
870
+ * Deletes a specific history entry identified by periodStart
871
+ */
872
+ export interface FertilityEntryDeleteRequest {
873
+ /** Required: periodStart of the entry to delete */
874
+ periodStart: number
875
+ }
876
+
877
+ /**
878
+ * Response for PATCH/DELETE /laplace/fertility-entry/:uid
879
+ */
880
+ export interface FertilityEntryActionResponse {
881
+ success: true
882
+ uid: number
883
+ historyCount: number
884
+ /** ISO timestamp string */
885
+ lastPeriodStart: string
886
+ }
887
+
888
+ // ============================================
889
+ // Fertility Contribution Types (Anonymous Submissions)
890
+ // ============================================
891
+
892
+ /**
893
+ * Status of a fertility contribution
894
+ */
895
+ export type ContributionStatus = 'pending' | 'approved' | 'rejected'
896
+
897
+ /**
898
+ * Request body for POST /laplace/fertility-contribute
899
+ * Anonymous users submit period data with Turnstile verification
900
+ */
901
+ export interface FertilityContributeRequest {
902
+ /** Bilibili user ID */
903
+ uid: number
904
+ /** Unix timestamp (ms) when period started */
905
+ periodStart: number
906
+ /** Optional: How many days this period lasted (1-15) */
907
+ periodLength?: number
908
+ /** Optional: Update user's preferred cycle length (15-60) */
909
+ cycleLength?: number
910
+ /** Evidence URL (required, must be HTTP/HTTPS, max 256 chars) */
911
+ source: string
912
+ /** Cloudflare Turnstile token for bot verification */
913
+ turnstileToken: string
914
+ }
915
+
916
+ /**
917
+ * A fertility contribution record
918
+ * Returned by GET /laplace/fertility-contributions
919
+ */
920
+ export interface FertilityContribution {
921
+ id: number
922
+ uid: number
923
+ periodStart: number
924
+ periodLength?: number
925
+ cycleLength?: number
926
+ source?: string
927
+ status: ContributionStatus
928
+ contributorIp?: string
929
+ /** ISO timestamp string */
930
+ createdAt: string
931
+ /** ISO timestamp string */
932
+ reviewedAt?: string
933
+ rejectReason?: string
934
+ }
935
+
936
+ /**
937
+ * Query parameters for GET /laplace/fertility-contributions
938
+ */
939
+ export interface FertilityContributionsListQuery {
940
+ /** Filter by status */
941
+ status?: ContributionStatus
942
+ /** Filter by target user UID */
943
+ uid?: number
944
+ /** Maximum number of results (1-500, default: 100) */
945
+ limit?: number
946
+ /** Offset for pagination (default: 0) */
947
+ offset?: number
948
+ /** Field to sort by (default: 'createdAt') */
949
+ sortBy?: 'createdAt' | 'reviewedAt'
950
+ /** Sort order (default: 'desc') */
951
+ sort?: 'asc' | 'desc'
952
+ }
953
+
954
+ /**
955
+ * Response for GET /laplace/fertility-contributions
956
+ */
957
+ export interface FertilityContributionsListResponse {
958
+ data: FertilityContribution[]
959
+ total: number
960
+ }
961
+
962
+ /**
963
+ * Success response for POST /laplace/fertility-contribute
964
+ */
965
+ export interface FertilityContributeResponse {
966
+ success: true
967
+ id: number
968
+ message: string
969
+ }
970
+
971
+ /**
972
+ * Request body for POST /laplace/fertility-contribution-reject/:id
973
+ */
974
+ export interface FertilityContributionRejectRequest {
975
+ reason?: string
976
+ }
977
+
978
+ /**
979
+ * Response for approve/reject endpoints
980
+ */
981
+ export interface FertilityContributionActionResponse {
982
+ success: true
983
+ id: number
984
+ status: ContributionStatus
985
+ }
986
+
987
+ /**
988
+ * Request body for PATCH /laplace/fertility-contribution-update/:id
989
+ * All fields are optional - only provided fields will be updated
990
+ */
991
+ export interface FertilityContributionUpdateRequest {
992
+ /** Bilibili user ID */
993
+ uid?: number
994
+ /** Unix timestamp (ms) when period started */
995
+ periodStart?: number
996
+ /** How many days this period lasted (1-15), or null to clear */
997
+ periodLength?: number | null
998
+ /** User's preferred cycle length (15-60), or null to clear */
999
+ cycleLength?: number | null
1000
+ /** Evidence URL (must be HTTP/HTTPS, max 256 chars), or null to remove */
1001
+ source?: string | null
1002
+ }
1003
+
1004
+ /**
1005
+ * Response for PATCH /laplace/fertility-contribution-update/:id
1006
+ */
1007
+ export interface FertilityContributionUpdateResponse {
1008
+ success: true
1009
+ id: number
1010
+ contribution?: FertilityContribution
1011
+ }
1012
+
1013
+ /**
1014
+ * Response for GET /laplace/fertility-contribution-stats
1015
+ * Public endpoint showing contribution statistics
1016
+ */
1017
+ export interface FertilityContributionStatsResponse {
1018
+ pending: number
1019
+ approved: number
1020
+ rejected: number
1021
+ total: number
1022
+ /** Average time from submission to approval/rejection in milliseconds */
1023
+ avgProcessingTimeMs: number | null
1024
+ /** Average time from submission to approval/rejection in hours (1 decimal) */
1025
+ avgProcessingTimeHours: number | null
1026
+ }
1027
+
1028
+ // ============================================
1029
+ // Meme Types
1030
+ // ============================================
1031
+
1032
+ /** Meme list item with resolved tags and user info (GET /laplace/memes) */
1033
+ export interface Meme {
1034
+ id: number
1035
+ uid: number
1036
+ content: string
1037
+ tags: TagWithCount[]
1038
+ copyCount: number
1039
+ createdAt: string
1040
+ updatedAt: string
1041
+ }
1042
+
1043
+ /** Meme with user details (list response item) */
1044
+ export interface MemeWithUser extends Meme {
1045
+ username: string | null
1046
+ avatar: string | null
1047
+ room: number | null
1048
+ }
1049
+
1050
+ /** Query params for GET /laplace/memes */
1051
+ export interface MemeListQuery {
1052
+ uid?: number
1053
+ tags?: number[]
1054
+ sortBy?: 'copyCount' | 'createdAt'
1055
+ sort?: 'asc' | 'desc'
1056
+ limit?: number
1057
+ offset?: number
1058
+ }
1059
+
1060
+ /** Response for GET /laplace/memes */
1061
+ export interface MemeListResponse {
1062
+ data: MemeWithUser[]
1063
+ total: number
1064
+ }
1065
+
1066
+ /** Request body for POST /laplace/memes (admin direct add) */
1067
+ export interface MemeCreateRequest {
1068
+ uid: number
1069
+ content: string
1070
+ }
1071
+
1072
+ /** Request body for PATCH /laplace/memes/:id (update approved meme) */
1073
+ export interface MemeUpdateRequest {
1074
+ content?: string
1075
+ tags?: number[] | null
1076
+ }
1077
+
1078
+ /** Response for POST /laplace/memes and DELETE /laplace/memes/:id (admin only) */
1079
+ export interface MemeActionResponse {
1080
+ success: true
1081
+ id: number
1082
+ }
1083
+
1084
+ /** Request body for POST /laplace/meme-contribute */
1085
+ export interface MemeContributeRequest {
1086
+ uid: number
1087
+ content: string
1088
+ note?: string
1089
+ /** Existing tag IDs to suggest for this meme (max 10) */
1090
+ tags?: number[]
1091
+ turnstileToken: string
1092
+ }
1093
+
1094
+ /** Success response for POST /laplace/meme-contribute */
1095
+ export interface MemeContributeResponse {
1096
+ success: true
1097
+ id: number
1098
+ message: string
1099
+ }
1100
+
1101
+ /** Meme contribution record (GET /laplace/meme-contributions) */
1102
+ export interface MemeContribution {
1103
+ id: number
1104
+ uid: number
1105
+ content: string
1106
+ note?: string | null
1107
+ tags?: number[] | null
1108
+ status: ContributionStatus
1109
+ contributorIp?: string
1110
+ createdAt: string
1111
+ reviewedAt?: string
1112
+ rejectReason?: string
1113
+ }
1114
+
1115
+ /** Query params for GET /laplace/meme-contributions */
1116
+ export interface MemeContributionsListQuery {
1117
+ status?: ContributionStatus
1118
+ uid?: number
1119
+ limit?: number
1120
+ offset?: number
1121
+ sortBy?: 'createdAt' | 'reviewedAt'
1122
+ sort?: 'asc' | 'desc'
1123
+ }
1124
+
1125
+ /** Response for GET /laplace/meme-contributions */
1126
+ export interface MemeContributionsListResponse {
1127
+ data: MemeContribution[]
1128
+ total: number
1129
+ }
1130
+
1131
+ /** Request body for POST /laplace/meme-contribution-reject/:id */
1132
+ export interface MemeContributionRejectRequest {
1133
+ reason?: string
1134
+ }
1135
+
1136
+ /** Response for approve/reject meme contribution */
1137
+ export interface MemeContributionActionResponse {
1138
+ success: true
1139
+ id: number
1140
+ status: ContributionStatus
1141
+ }
1142
+
1143
+ /** Request body for PATCH /laplace/meme-contribution-update/:id */
1144
+ export interface MemeContributionUpdateRequest {
1145
+ uid?: number
1146
+ content?: string
1147
+ note?: string | null
1148
+ tags?: number[] | null
1149
+ }
1150
+
1151
+ /** Response for PATCH /laplace/meme-contribution-update/:id */
1152
+ export interface MemeContributionUpdateResponse {
1153
+ success: true
1154
+ id: number
1155
+ contribution?: MemeContribution
1156
+ }
1157
+
1158
+ /** Response for GET /laplace/meme-contribution-stats */
1159
+ export interface MemeContributionStatsResponse {
1160
+ pending: number
1161
+ approved: number
1162
+ rejected: number
1163
+ total: number
1164
+ avgProcessingTimeMs: number | null
1165
+ avgProcessingTimeHours: number | null
1166
+ }
1167
+
1168
+ /** Response for POST /laplace/meme-copy/:id */
1169
+ export interface MemeCopyResponse {
1170
+ success: true
1171
+ id: number
1172
+ copyCount: number
1173
+ }
1174
+
1175
+ // ============================================
1176
+ // Guild History Types
1177
+ // ============================================
1178
+
1179
+ /**
1180
+ * A single guild history entry - tracks each guild membership change
1181
+ * Stored in the `guildInfo.history` JSONB column on bilibili_users table
1182
+ */
1183
+ export interface GuildHistoryItem {
1184
+ /** Guild name */
1185
+ name: string
1186
+ /** Unix timestamp (ms) - when this guild membership was recorded */
1187
+ updatedAt: number
1188
+ }
1189
+
1190
+ // ============================================
1191
+ // MCN History Types
1192
+ // ============================================
1193
+
1194
+ /**
1195
+ * A single MCN agency history entry - tracks each MCN membership change
1196
+ * Stored in the `mcnInfo.history` JSONB column on bilibili_users table
1197
+ */
1198
+ export interface McnHistoryItem {
1199
+ /** MCN agency ID */
1200
+ mcnId: number
1201
+ /** MCN agency name */
1202
+ mcnName: string
1203
+ /** Unix timestamp (ms) - when this MCN membership was recorded */
1204
+ updatedAt: number
1205
+ }
1206
+
1207
+ /**
1208
+ * Response for GET /laplace/guild-entry/:uid
1209
+ * Returns guild history for a specific user
1210
+ */
1211
+ export interface GuildHistoryResponse {
1212
+ success: true
1213
+ uid: number
1214
+ user: {
1215
+ id: number
1216
+ username: string
1217
+ avatar: string | null
1218
+ room: number | null
1219
+ }
1220
+ history: GuildHistoryItem[]
1221
+ historyCount: number
1222
+ }
1223
+
1224
+ /**
1225
+ * Request body for POST /laplace/guild-entry/:uid
1226
+ * Adds a new guild history entry
1227
+ */
1228
+ export interface GuildEntryAddRequest {
1229
+ /** Guild name (max 100 chars, no special characters) */
1230
+ name: string
1231
+ /** Optional: Unix timestamp (ms) - defaults to current time */
1232
+ updatedAt?: number
1233
+ }
1234
+
1235
+ /**
1236
+ * Request body for PATCH /laplace/guild-entry/:uid
1237
+ * Updates a specific guild history entry identified by originalUpdatedAt
1238
+ */
1239
+ export interface GuildEntryUpdateRequest {
1240
+ /** Required: updatedAt of the entry to update (identifier) */
1241
+ originalUpdatedAt: number
1242
+ /** Optional: New guild name */
1243
+ name?: string
1244
+ /** Optional: New timestamp (Unix timestamp ms) */
1245
+ updatedAt?: number
1246
+ }
1247
+
1248
+ /**
1249
+ * Request body for DELETE /laplace/guild-entry/:uid
1250
+ * Deletes a specific guild history entry identified by updatedAt
1251
+ */
1252
+ export interface GuildEntryDeleteRequest {
1253
+ /** Required: updatedAt of the entry to delete */
1254
+ updatedAt: number
1255
+ }
1256
+
1257
+ /**
1258
+ * Response for POST/PATCH/DELETE /laplace/guild-entry/:uid
1259
+ */
1260
+ export interface GuildEntryActionResponse {
1261
+ success: true
1262
+ uid: number
1263
+ historyCount: number
1264
+ }
1265
+
1266
+ // ============================================
1267
+ // MCN Batch Update Types
1268
+ // ============================================
1269
+
1270
+ /**
1271
+ * A single entry in the MCN batch update request
1272
+ * Maps to the raw export format from the MCN agency data (laplace-scripts)
1273
+ */
1274
+ export interface McnBatchUpdateEntry {
1275
+ /** User's Bilibili UID (maps to bilibili_users.id) */
1276
+ upper_mid: number
1277
+ /** MCN agency ID */
1278
+ mcn_id: number
1279
+ /** MCN agency company name */
1280
+ mcn_company_name: string
1281
+ }
1282
+
1283
+ /**
1284
+ * Request body for POST /laplace/mcn-batch-update
1285
+ * Batch updates MCN info for multiple users (max 10,000 entries)
1286
+ */
1287
+ export interface McnBatchUpdateRequest {
1288
+ entries: McnBatchUpdateEntry[]
1289
+ }
1290
+
1291
+ /**
1292
+ * Response for POST /laplace/mcn-batch-update
1293
+ */
1294
+ export interface McnBatchUpdateResponse {
1295
+ success: true
1296
+ /** Total entries received */
1297
+ total: number
1298
+ /** Count of users whose mcnInfo was changed */
1299
+ updated: number
1300
+ /** UIDs whose mcnInfo was changed (new MCN or MCN change) */
1301
+ updatedUids: number[]
1302
+ /** Count of users whose MCN matched the latest history entry (no-op) */
1303
+ unchanged: number
1304
+ /** UIDs whose MCN matched the latest history entry (no-op) */
1305
+ unchangedUids: number[]
1306
+ /** Count of UIDs not found in bilibili_users */
1307
+ skipped: number
1308
+ /** List of missing UIDs */
1309
+ skippedUids: number[]
1310
+ }
1311
+
1312
+ // ============================================
1313
+ // Guild Batch Update Types
1314
+ // ============================================
1315
+
1316
+ /**
1317
+ * A single entry in the guild batch update request
1318
+ * Maps to the raw export format from the agency data
1319
+ */
1320
+ export interface GuildBatchUpdateEntry {
1321
+ /** User's Bilibili UID (maps to bilibili_users.id) */
1322
+ upper_mid: number
1323
+ /** Guild name (null if user is not in any guild) */
1324
+ live_guild_name: string | null
1325
+ }
1326
+
1327
+ /**
1328
+ * Request body for POST /laplace/guild-batch-update
1329
+ * Batch updates guild info for multiple users (max 10,000 entries)
1330
+ */
1331
+ export interface GuildBatchUpdateRequest {
1332
+ entries: GuildBatchUpdateEntry[]
1333
+ }
1334
+
1335
+ /**
1336
+ * Response for POST /laplace/guild-batch-update
1337
+ */
1338
+ export interface GuildBatchUpdateResponse {
1339
+ success: true
1340
+ /** Total entries received */
1341
+ total: number
1342
+ /** Count of users whose guildInfo was changed */
1343
+ updated: number
1344
+ /** UIDs whose guildInfo was changed (new guild or guild change) */
1345
+ updatedUids: number[]
1346
+ /** Count of users whose guild matched the latest history entry (no-op) */
1347
+ unchanged: number
1348
+ /** UIDs whose guild matched the latest history entry (no-op) */
1349
+ unchangedUids: number[]
1350
+ /** Count of UIDs not found in bilibili_users */
1351
+ skipped: number
1352
+ /** List of missing UIDs */
1353
+ skippedUids: number[]
1354
+ }
1355
+ }
1356
+
1357
+ /** Migrated from experiments.sparanoid.net */
1358
+ export namespace Experiments {
1359
+ /**
1360
+ * fixer.io API
1361
+ * @link http://data.fixer.io/api/latest?access_key=
1362
+ * */
1363
+ interface Fixer {
1364
+ success: boolean
1365
+ timestamp: number
1366
+ base: string
1367
+ date: string
1368
+ rates: FixerRates
1369
+ }
1370
+
1371
+ /** Props of Fixer */
1372
+ interface FixerRates {
1373
+ [key: string]: number
1374
+ }
1375
+
1376
+ /**
1377
+ * Spotify API
1378
+ */
1379
+ export namespace Spotify {
1380
+ /**
1381
+ * Spotify get access token
1382
+ * @link https://developer.spotify.com/documentation/web-api/tutorials/getting-started
1383
+ */
1384
+ interface Token {
1385
+ access_token: string
1386
+ token_type: 'Bearer'
1387
+ expires_in: 3600
1388
+ }
1389
+
1390
+ /**
1391
+ * Search result
1392
+ */
1393
+ export interface Search {
1394
+ tracks: Tracks
1395
+ }
1396
+
1397
+ /** Track list of `Search` */
1398
+ export interface Tracks {
1399
+ href: string
1400
+ items: Track[] | []
1401
+ limit: number
1402
+ next: string | null
1403
+ offset: number
1404
+ previous: null
1405
+ total: number
1406
+ }
1407
+
1408
+ /** Track item of `Tracks` */
1409
+ export interface Track {
1410
+ album: Album
1411
+ artists: Artist[]
1412
+ available_markets: string[]
1413
+ disc_number: number
1414
+ duration_ms: number
1415
+ explicit: boolean
1416
+ external_ids: ExternalIDS
1417
+ external_urls: ExternalUrls
1418
+ href: string
1419
+ id: string
1420
+ is_local: boolean
1421
+ name: string
1422
+ popularity: number
1423
+ preview_url: null
1424
+ track_number: number
1425
+ type: string
1426
+ uri: string
1427
+ }
1428
+
1429
+ /** Album item of `Track` */
1430
+ export interface Album {
1431
+ album_type: string
1432
+ artists: Artist[]
1433
+ available_markets: string[]
1434
+ external_urls: ExternalUrls
1435
+ href: string
1436
+ id: string
1437
+ images: Image[] | []
1438
+ name: string
1439
+ release_date: Date
1440
+ release_date_precision: string
1441
+ total_tracks: number
1442
+ type: string
1443
+ uri: string
1444
+ }
1445
+
1446
+ /** Artist props */
1447
+ export interface Artist {
1448
+ external_urls: ExternalUrls
1449
+ href: string
1450
+ id: string
1451
+ name: string
1452
+ type: string
1453
+ uri: string
1454
+ }
1455
+
1456
+ /** External URLs */
1457
+ export interface ExternalUrls {
1458
+ spotify: string
1459
+ }
1460
+
1461
+ /** 专辑封面 */
1462
+ export interface Image {
1463
+ height: number
1464
+ url: string
1465
+ width: number
1466
+ }
1467
+
1468
+ /** External IDs */
1469
+ export interface ExternalIDS {
1470
+ isrc: string
1471
+ }
1472
+ }
1473
+
1474
+ /** Apple API */
1475
+ export namespace Apple {
1476
+ /** Apple Music API */
1477
+ export interface Music {
1478
+ results: MusicSearchResults
1479
+ meta: MusicSearchMeta
1480
+ }
1481
+
1482
+ /** Props of `Music` */
1483
+ export interface MusicSearchMeta {
1484
+ results: MusicSearchMetaResults
1485
+ }
1486
+
1487
+ /** Props of `MusicSearchMeta` */
1488
+ export interface MusicSearchMetaResults {
1489
+ order: string[]
1490
+ rawOrder: string[]
1491
+ }
1492
+
1493
+ /** Props of `Music` */
1494
+ export interface MusicSearchResults {
1495
+ songs: Songs
1496
+ }
1497
+
1498
+ /** Props of `Songs` */
1499
+ export interface Songs {
1500
+ href: string
1501
+ next: string
1502
+ data: Datum[]
1503
+ }
1504
+
1505
+ /** Props of `Datum` */
1506
+ export interface Datum {
1507
+ id: string
1508
+ type: string
1509
+ href: string
1510
+ attributes: Attributes
1511
+ }
1512
+
1513
+ /** Props of `Attributes` */
1514
+ export interface Attributes {
1515
+ albumName: string
1516
+ genreNames: string[]
1517
+ trackNumber: number
1518
+ durationInMillis: number
1519
+ releaseDate: Date
1520
+ isrc: string
1521
+ artwork: Artwork
1522
+ playParams: PlayParams
1523
+ url: string
1524
+ discNumber: number
1525
+ hasCredits: boolean
1526
+ isAppleDigitalMaster: boolean
1527
+ hasLyrics: boolean
1528
+ name: string
1529
+ previews: Preview[]
1530
+ artistName: string
1531
+ composerName?: string
1532
+ }
1533
+
1534
+ /** Props of `Attributes` */
1535
+ export interface Artwork {
1536
+ width: number
1537
+ height: number
1538
+ url: string
1539
+ bgColor: string
1540
+ textColor1: string
1541
+ textColor2: string
1542
+ textColor3: string
1543
+ textColor4: string
1544
+ }
1545
+
1546
+ /** Props of `Attributes` */
1547
+ export interface PlayParams {
1548
+ id: string
1549
+ kind: string
1550
+ }
1551
+
1552
+ /** Props of `Attributes` */
1553
+ export interface Preview {
1554
+ url: string
1555
+ }
1556
+ }
1557
+
1558
+ /**
1559
+ * Address Completion
1560
+ * @link /experiments/address-completion
1561
+ */
1562
+ export interface AddressCompletion {
1563
+ code: number
1564
+ /** 报错时会返回 */
1565
+ message?: string
1566
+ data: {
1567
+ /** 地址信息,通常为 `poiInfo` + `houseInfo` */
1568
+ addrInfo: string
1569
+ /** 门牌号,通常为 address line 2 */
1570
+ houseInfo: string
1571
+ /** 详细地址,通常为 address line 1 */
1572
+ poiInfo: string
1573
+ /** 街道 */
1574
+ street: string
1575
+ /** 城市 */
1576
+ city: string
1577
+ /** 地区 */
1578
+ district: string
1579
+ /** 省 */
1580
+ province: string
1581
+ /** 收件人 */
1582
+ person: string
1583
+ /** 手机/电话 */
1584
+ phone: string
1585
+ }
1586
+ }
1587
+ }
1588
+ }
1589
+
1590
+ /**
1591
+ * WebSocket 协议
1592
+ */
1593
+ export namespace WebSocket {
1594
+ /**
1595
+ * 线上环境
1596
+ */
1597
+ export namespace Prod {
1598
+ /**
1599
+ * 内置系统消息
1600
+ */
1601
+ export interface SYSTEM_MSG {
1602
+ timestamp: number
1603
+ username?: string
1604
+ message?: string
1605
+ }
1606
+ }
1607
+ }
1608
+ }