@bct-app/game-model 0.1.0 → 0.1.1

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 (43) hide show
  1. package/README.md +14 -10
  2. package/dist/index.d.ts +1172 -30
  3. package/dist/json-schema/ability-execution-timing.schema.json +8 -0
  4. package/dist/json-schema/ability.schema.json +2268 -0
  5. package/dist/json-schema/alignment-enum.schema.json +8 -0
  6. package/dist/json-schema/base-source.schema.json +64 -0
  7. package/dist/{schemas → json-schema}/character-basic-kind.schema.json +1 -1
  8. package/dist/{schemas → json-schema}/character-kind.schema.json +1 -1
  9. package/dist/json-schema/character.schema.json +123 -0
  10. package/dist/json-schema/chat-message-content.schema.json +65 -0
  11. package/dist/json-schema/chat-message-group.schema.json +37 -0
  12. package/dist/json-schema/chat-message-operation.schema.json +30 -0
  13. package/dist/json-schema/chat-message.schema.json +133 -0
  14. package/dist/json-schema/conversation.schema.json +252 -0
  15. package/dist/{schemas → json-schema}/effect.schema.json +375 -133
  16. package/dist/{schemas → json-schema}/game.schema.json +3 -16
  17. package/dist/json-schema/index.json +36 -0
  18. package/dist/{schemas → json-schema}/input.schema.json +108 -89
  19. package/dist/{schemas → json-schema}/message.schema.json +259 -35
  20. package/dist/json-schema/nomination.schema.json +29 -0
  21. package/dist/json-schema/operation.schema.json +28 -0
  22. package/dist/json-schema/player-display-format.schema.json +13 -0
  23. package/dist/json-schema/player-reminder.schema.json +19 -0
  24. package/dist/json-schema/player.schema.json +104 -0
  25. package/dist/json-schema/populated-character.schema.json +2344 -0
  26. package/dist/json-schema/populated-script.schema.json +2397 -0
  27. package/dist/json-schema/reminder.schema.json +24 -0
  28. package/dist/json-schema/room-create.schema.json +23 -0
  29. package/dist/json-schema/room-defaults.schema.json +72 -0
  30. package/dist/json-schema/room.schema.json +24 -0
  31. package/dist/json-schema/runtime-game.schema.json +162 -0
  32. package/dist/json-schema/script.schema.json +57 -0
  33. package/dist/json-schema/seat-side-enum.schema.json +9 -0
  34. package/dist/json-schema/special-message-kind.schema.json +7 -0
  35. package/dist/json-schema/target.schema.json +305 -0
  36. package/dist/json-schema/timeline.schema.json +87 -0
  37. package/dist/{schemas → json-schema}/view.schema.json +68 -42
  38. package/dist/zod.d.mts +4038 -0
  39. package/dist/zod.d.ts +4038 -0
  40. package/dist/zod.js +1129 -0
  41. package/dist/zod.mjs +1058 -0
  42. package/package.json +30 -15
  43. package/dist/schemas/index.json +0 -9
package/dist/zod.mjs ADDED
@@ -0,0 +1,1058 @@
1
+ // src/game.ts
2
+ import { z as z2 } from "zod";
3
+
4
+ // src/operation.ts
5
+ import { z } from "zod";
6
+ var Operation = z.object({
7
+ abilityId: z.string().min(1),
8
+ effector: z.number(),
9
+ payloads: z.array(z.any()).default([]),
10
+ visible: z.boolean().default(false).optional()
11
+ });
12
+ var Nomination = z.object({
13
+ nominator: z.number(),
14
+ nominee: z.number(),
15
+ voterSeats: z.array(z.number()).optional().default([]),
16
+ inRack: z.boolean().default(false).optional()
17
+ });
18
+
19
+ // src/game.ts
20
+ var CharacterKindCount = z2.object({
21
+ kind: z2.string(),
22
+ count: z2.number().int().nonnegative().default(0)
23
+ });
24
+ var Game = z2.object({
25
+ owner: z2.string().min(1),
26
+ scriptId: z2.string().min(1),
27
+ numberOfPlayer: z2.number().int().positive().default(8),
28
+ characterKinds: z2.array(CharacterKindCount).default([]),
29
+ characters: z2.array(z2.string()).default([]),
30
+ seats: z2.array(z2.string().nullable()).default([]),
31
+ result: z2.enum(["goodWin", "evilWin"]),
32
+ createdAt: z2.iso.datetime().default(() => (/* @__PURE__ */ new Date()).toISOString()),
33
+ startedAt: z2.iso.datetime(),
34
+ endedAt: z2.iso.datetime()
35
+ });
36
+ var Seat = z2.object({
37
+ userId: z2.string(),
38
+ ready: z2.boolean().default(false)
39
+ });
40
+ var RuntimeGame = Game.extend({
41
+ status: z2.enum(["prepare", "start", "end"]).default("prepare"),
42
+ seats: z2.array(Seat.nullable()).default([]),
43
+ result: z2.enum(["goodWin", "evilWin", "unexpectEnd"]),
44
+ settings: z2.object({
45
+ operations: Operation.array().optional().default([])
46
+ }).optional()
47
+ }).partial({
48
+ result: true,
49
+ startedAt: true,
50
+ endedAt: true
51
+ });
52
+
53
+ // src/alignment.ts
54
+ import { z as z3 } from "zod";
55
+ var AlignmentEnum = z3.enum(["GOOD", "EVIL"]);
56
+
57
+ // src/ability/effects/target.ts
58
+ import { z as z5 } from "zod";
59
+
60
+ // src/ability/seat-side.ts
61
+ import z4 from "zod";
62
+ var SeatSideEnum = z4.enum([
63
+ "BOTH_SIDES",
64
+ "LEFT_SIDE",
65
+ "RIGHT_SIDE"
66
+ ]);
67
+
68
+ // src/ability/effects/target.ts
69
+ var PayloadRef = z5.object({
70
+ from: z5.literal("PAYLOAD"),
71
+ value: z5.union([
72
+ z5.number().min(0),
73
+ z5.array(z5.number().min(0))
74
+ ])
75
+ });
76
+ var withPayloadRef = (schema) => z5.union([
77
+ schema,
78
+ PayloadRef
79
+ ]);
80
+ var TargetFromPayload = z5.object({
81
+ from: z5.literal("PAYLOAD"),
82
+ value: z5.union([
83
+ z5.number().min(0),
84
+ z5.array(z5.number().min(0))
85
+ ])
86
+ });
87
+ var DynamicAnchorFromEffector = z5.object({
88
+ from: z5.literal("EFFECTOR")
89
+ });
90
+ var DynamicAnchorFromPayload = z5.object({
91
+ from: z5.literal("PAYLOAD"),
92
+ value: z5.union([
93
+ z5.number().min(0),
94
+ z5.array(z5.number().min(0))
95
+ ])
96
+ });
97
+ var DynamicAnchorFromStatic = z5.object({
98
+ from: z5.literal("STATIC"),
99
+ value: z5.number().min(1)
100
+ });
101
+ var DynamicTargetCondition = z5.object({
102
+ field: z5.enum([
103
+ "CHARACTER_KIND",
104
+ "IS_DEAD",
105
+ "SEAT"
106
+ ]),
107
+ operator: z5.enum([
108
+ "EQ",
109
+ "IN"
110
+ ]).default("EQ"),
111
+ value: withPayloadRef(z5.union([
112
+ z5.string(),
113
+ z5.boolean(),
114
+ z5.number().min(1),
115
+ z5.array(z5.string()),
116
+ z5.array(z5.number().min(1))
117
+ ]))
118
+ });
119
+ var DynamicTargetSelector = z5.object({
120
+ scope: withPayloadRef(SeatSideEnum).default("BOTH_SIDES")
121
+ });
122
+ var TargetFromDynamic = z5.object({
123
+ from: z5.literal("DYNAMIC"),
124
+ anchor: z5.discriminatedUnion("from", [
125
+ DynamicAnchorFromEffector,
126
+ DynamicAnchorFromPayload,
127
+ DynamicAnchorFromStatic
128
+ ]).optional(),
129
+ selector: DynamicTargetSelector.optional(),
130
+ where: z5.object({
131
+ mode: z5.enum(["ALL", "ANY"]).default("ALL"),
132
+ conditions: z5.array(DynamicTargetCondition).default([])
133
+ }).optional(),
134
+ limit: withPayloadRef(z5.number().int().positive()).optional()
135
+ });
136
+ var TargetFromEffector = z5.object({
137
+ from: z5.literal("EFFECTOR")
138
+ });
139
+ var TargetFromCustom = z5.object({
140
+ from: z5.literal("CUSTOM"),
141
+ value: z5.any()
142
+ });
143
+ var Target = z5.discriminatedUnion("from", [
144
+ TargetFromPayload,
145
+ TargetFromEffector,
146
+ TargetFromDynamic,
147
+ TargetFromCustom
148
+ ]).meta({
149
+ id: "TargetModel",
150
+ title: "\u76EE\u6807\u6A21\u578B",
151
+ description: "\u8868\u793A\u6280\u80FD\u6548\u679C\u7684\u76EE\u6807\uFF0C\u5305\u542B\u6765\u81EA\u6280\u80FD\u8F7D\u8377\u3001\u6280\u80FD\u65BD\u653E\u8005\u548C\u52A8\u6001\u89C4\u5219\u4E09\u79CD\u6765\u6E90"
152
+ });
153
+
154
+ // src/ability/effects/index.ts
155
+ import { z as z18 } from "zod";
156
+
157
+ // src/ability/effects/ability.ts
158
+ import { z as z7 } from "zod";
159
+
160
+ // src/ability/source.ts
161
+ import { z as z6 } from "zod";
162
+ var SourceFromPayload = z6.object({
163
+ from: z6.literal("PAYLOAD"),
164
+ value: z6.union([
165
+ z6.number().min(0).optional().default(0),
166
+ z6.array(z6.number().min(0)).optional().default([0])
167
+ ])
168
+ });
169
+ var SourceFromEffector = z6.object({
170
+ from: z6.literal("EFFECTOR")
171
+ });
172
+ var BaseSourceFromConstant = z6.object({
173
+ from: z6.literal("CONSTANT")
174
+ });
175
+ var GenericSourceFromConstant = BaseSourceFromConstant.extend({
176
+ value: z6.any()
177
+ });
178
+ var BaseSource = z6.discriminatedUnion("from", [
179
+ SourceFromPayload,
180
+ GenericSourceFromConstant
181
+ ]).meta({
182
+ id: "BaseSource",
183
+ title: "\u57FA\u7840\u6765\u6E90\u6A21\u578B",
184
+ description: "\u57FA\u7840\u6765\u6E90\u6A21\u578B\uFF0C\u5305\u542B\u6765\u81EA\u6280\u80FD\u8F7D\u8377\u548C\u5E38\u91CF\u4E24\u79CD\u6765\u6E90\uFF0C\u5E38\u91CF\u6765\u6E90\u5305\u542B\u4E00\u4E2A\u4EFB\u610F\u503C"
185
+ });
186
+
187
+ // src/ability/effects/ability.ts
188
+ var AbilitySourceFromConstant = BaseSourceFromConstant.extend({
189
+ value: z7.string()
190
+ });
191
+ var AbilitySource = z7.discriminatedUnion("from", [
192
+ SourceFromPayload,
193
+ AbilitySourceFromConstant
194
+ ]);
195
+ var AbilityChangeEffect = z7.object({
196
+ type: z7.literal("ABILITY_CHANGE"),
197
+ source: AbilitySource,
198
+ target: Target
199
+ }).meta({
200
+ id: "AbilityChangeEffect",
201
+ title: "\u6280\u80FD\u53D8\u5316\u6548\u679C\u6A21\u578B",
202
+ description: "\u8868\u793A\u6539\u53D8\u76EE\u6807\u6280\u80FD\u7684\u6280\u80FD\u6548\u679C\u6A21\u578B\uFF0C\u5305\u542B\u4E00\u4E2A\u6765\u6E90\u548C\u4E00\u4E2A\u76EE\u6807"
203
+ });
204
+
205
+ // src/ability/effects/alignment.ts
206
+ import { z as z8 } from "zod";
207
+ var AlignmentSourceFromConstant = BaseSourceFromConstant.extend({
208
+ value: AlignmentEnum
209
+ });
210
+ var AlignmentSource = z8.discriminatedUnion("from", [
211
+ SourceFromPayload,
212
+ SourceFromEffector,
213
+ AlignmentSourceFromConstant
214
+ ]);
215
+ var AlignmentChangeEffect = z8.object({
216
+ type: z8.literal("ALIGNMENT_CHANGE"),
217
+ source: AlignmentSource,
218
+ target: Target
219
+ }).meta({
220
+ id: "AlignmentChangeEffect",
221
+ title: "\u9635\u8425\u53D8\u5316\u6548\u679C\u6A21\u578B",
222
+ description: "\u8868\u793A\u6539\u53D8\u76EE\u6807\u9635\u8425\u7684\u6280\u80FD\u6548\u679C\u6A21\u578B\uFF0C\u5305\u542B\u4E00\u4E2A\u6765\u6E90\u548C\u4E00\u4E2A\u76EE\u6807"
223
+ });
224
+
225
+ // src/ability/effects/character.ts
226
+ import { z as z9 } from "zod";
227
+ var CharacterSourceFromConstant = BaseSourceFromConstant.extend({
228
+ value: z9.string()
229
+ });
230
+ var CharacterSource = z9.discriminatedUnion("from", [
231
+ SourceFromPayload,
232
+ SourceFromEffector,
233
+ CharacterSourceFromConstant
234
+ ]);
235
+ var CharacterChangeEffect = z9.object({
236
+ type: z9.literal("CHARACTER_CHANGE"),
237
+ source: CharacterSource,
238
+ target: Target
239
+ }).meta({
240
+ id: "CharacterChangeEffect",
241
+ title: "\u89D2\u8272\u53D8\u5316\u6548\u679C\u6A21\u578B",
242
+ description: "\u8868\u793A\u6539\u53D8\u89D2\u8272\u8EAB\u4EFD\u7684\u6280\u80FD\u6548\u679C\u6A21\u578B\uFF0C\u5305\u542B\u4E00\u4E2A\u6765\u6E90\u548C\u4E00\u4E2A\u76EE\u6807"
243
+ });
244
+ var CharacterPerceptionEffect = z9.object({
245
+ type: z9.literal("PERCEIVED_CHARACTER_CHANGE"),
246
+ source: CharacterSource,
247
+ target: Target,
248
+ followPriority: z9.boolean().optional()
249
+ }).meta({
250
+ id: "CharacterPerceptionEffect",
251
+ title: "\u611F\u77E5\u89D2\u8272\u53D8\u5316\u6548\u679C\u6A21\u578B",
252
+ description: "\u8868\u793A\u6539\u53D8\u89D2\u8272\u611F\u77E5\u8EAB\u4EFD\u7684\u6280\u80FD\u6548\u679C\u6A21\u578B\uFF0C\u5305\u542B\u4E00\u4E2A\u6765\u6E90\u3001\u4E00\u4E2A\u76EE\u6807\u548C\u53EF\u9009\u4F18\u5148\u7EA7"
253
+ });
254
+
255
+ // src/ability/effects/character-count.ts
256
+ import { z as z11 } from "zod";
257
+
258
+ // src/ability/character-kind.ts
259
+ import { z as z10 } from "zod";
260
+ var CharacterKind = z10.enum(["Townsfolk", "Outsiders", "Minions", "Demons", "Travelers"]);
261
+ var CharacterBasicKind = CharacterKind.exclude(["Travelers"]).meta({
262
+ id: "CharacterBasicKind",
263
+ title: "\u89D2\u8272\u57FA\u672C\u7C7B\u522B",
264
+ description: "\u89D2\u8272\u57FA\u672C\u7C7B\u522B\u5B9A\u4E49\u4E86\u6E38\u620F\u4E2D\u89D2\u8272\u7684\u57FA\u672C\u5206\u7C7B\uFF0C\u901A\u5E38\u7528\u4E8E\u6280\u80FD\u9009\u9879\u4E2D\u9700\u8981\u6307\u5B9A\u89D2\u8272\u7C7B\u522B\u7684\u60C5\u51B5"
265
+ });
266
+ var CharacterKindCount2 = z10.object({
267
+ kind: CharacterBasicKind,
268
+ // Character kind ID
269
+ count: z10.number().default(0)
270
+ // Number of characters of this kind in the game
271
+ });
272
+ var CharacterKinds = z10.array(CharacterKindCount2);
273
+
274
+ // src/ability/effects/character-count.ts
275
+ var CharacterCountSourceFromConstant = BaseSourceFromConstant.extend({
276
+ value: z11.object({
277
+ kind: CharacterBasicKind,
278
+ value: z11.number()
279
+ })
280
+ });
281
+ var CharacterCountSource = z11.discriminatedUnion("from", [
282
+ CharacterCountSourceFromConstant
283
+ ]);
284
+ var CharacterCountEffect = z11.object({
285
+ type: z11.literal("CHARACTER_COUNT_CHANGE"),
286
+ source: CharacterCountSource.optional(),
287
+ kind: CharacterBasicKind.optional(),
288
+ value: z11.number().optional()
289
+ }).meta({
290
+ id: "CharacterCountEffect",
291
+ title: "\u89D2\u8272\u6570\u91CF\u53D8\u5316\u6548\u679C\u6A21\u578B",
292
+ description: "\u8868\u793A\u6539\u53D8\u67D0\u7C7B\u89D2\u8272\u6570\u91CF\u7684\u6280\u80FD\u6548\u679C\u6A21\u578B\uFF0C\u5305\u542B\u89D2\u8272\u7C7B\u522B\u548C\u53D8\u5316\u503C"
293
+ });
294
+
295
+ // src/ability/effects/game.ts
296
+ import { z as z12 } from "zod";
297
+ var GameSourceFromConstant = BaseSourceFromConstant.extend({
298
+ value: AlignmentEnum
299
+ });
300
+ var GameSource = z12.discriminatedUnion("from", [
301
+ SourceFromPayload,
302
+ GameSourceFromConstant
303
+ ]).meta({
304
+ id: "GameSource",
305
+ title: "\u6E38\u620F\u6765\u6E90\u6A21\u578B",
306
+ description: "\u8868\u793A\u83B7\u53D6\u6E38\u620F\u53D8\u66F4\u4FE1\u606F\u7684\u6765\u6E90\u6A21\u578B\uFF0C\u5305\u542B\u6765\u81EA\u6280\u80FD\u8F7D\u8377\u548C\u5E38\u91CF\u4E24\u79CD\u6765\u6E90"
307
+ });
308
+ var GameEffect = z12.object({
309
+ type: z12.literal("GAME_CHANGE"),
310
+ source: GameSource
311
+ }).meta({
312
+ id: "GameEffect",
313
+ title: "\u6E38\u620F\u53D8\u5316\u6548\u679C\u6A21\u578B",
314
+ description: "\u8868\u793A\u6539\u53D8\u6E38\u620F\u72B6\u6001\u7684\u6280\u80FD\u6548\u679C\u6A21\u578B\uFF0C\u5305\u542B\u4E00\u4E2A\u6765\u6E90"
315
+ });
316
+
317
+ // src/ability/effects/reminder.ts
318
+ import { z as z14 } from "zod";
319
+
320
+ // src/reminder.ts
321
+ import { z as z13 } from "zod";
322
+ var Reminder = z13.object({
323
+ mark: z13.string().min(1),
324
+ // Reminder identifier
325
+ color: z13.string().optional(),
326
+ // Color for display purposes
327
+ description: z13.string().optional(),
328
+ // Description of the reminder
329
+ duration: z13.number().min(0).optional()
330
+ // Duration in turns, if applicable
331
+ });
332
+ var PlayerReminder = z13.object({
333
+ playerSeat: z13.number().min(1),
334
+ index: z13.number().min(0)
335
+ });
336
+
337
+ // src/ability/effects/reminder.ts
338
+ var ReminderSourceFromConstant = BaseSourceFromConstant.extend({
339
+ value: Reminder
340
+ });
341
+ var ReminderSource = z14.discriminatedUnion("from", [
342
+ SourceFromPayload,
343
+ ReminderSourceFromConstant
344
+ ]);
345
+ var ReminderEffect = z14.object({
346
+ type: z14.literal("REMINDER_ADD"),
347
+ source: ReminderSource,
348
+ target: Target
349
+ }).meta({
350
+ id: "ReminderEffect",
351
+ title: "\u6DFB\u52A0\u6807\u8BB0\u6548\u679C\u6A21\u578B",
352
+ description: "\u8868\u793A\u4E3A\u76EE\u6807\u6DFB\u52A0\u6807\u8BB0\u7684\u6280\u80FD\u6548\u679C\u6A21\u578B\uFF0C\u5305\u542B\u4E00\u4E2A\u6765\u6E90\u548C\u4E00\u4E2A\u76EE\u6807"
353
+ });
354
+
355
+ // src/ability/effects/remove-reminder.ts
356
+ import { z as z15 } from "zod";
357
+ var RemoveReminderSourceFromConstant = BaseSourceFromConstant.extend({
358
+ value: z15.number().min(0)
359
+ });
360
+ var RemoveReminderSource = z15.discriminatedUnion("from", [
361
+ SourceFromPayload,
362
+ RemoveReminderSourceFromConstant
363
+ ]);
364
+ var RemoveReminderEffect = z15.object({
365
+ type: z15.literal("REMINDER_REMOVE"),
366
+ source: RemoveReminderSource,
367
+ target: Target
368
+ }).meta({
369
+ id: "RemoveReminderEffect",
370
+ title: "\u79FB\u9664\u6807\u8BB0\u6548\u679C\u6A21\u578B",
371
+ description: "\u8868\u793A\u4ECE\u76EE\u6807\u79FB\u9664\u6807\u8BB0\u7684\u6280\u80FD\u6548\u679C\u6A21\u578B\uFF0C\u5305\u542B\u4E00\u4E2A\u6765\u6E90\u548C\u4E00\u4E2A\u76EE\u6807"
372
+ });
373
+
374
+ // src/ability/effects/seat.ts
375
+ import { z as z16 } from "zod";
376
+ var SeatSourceFromConstant = BaseSourceFromConstant.extend({
377
+ value: z16.number().min(1)
378
+ });
379
+ var SeatSource = z16.discriminatedUnion("from", [
380
+ SourceFromPayload,
381
+ SourceFromEffector,
382
+ SeatSourceFromConstant
383
+ ]);
384
+ var SeatEffect = z16.object({
385
+ type: z16.literal("SEAT_CHANGE"),
386
+ source: SeatSource,
387
+ target: Target
388
+ }).meta({
389
+ id: "SeatEffect",
390
+ title: "\u5EA7\u4F4D\u53D8\u5316\u6548\u679C\u6A21\u578B",
391
+ description: "\u8868\u793A\u6539\u53D8\u76EE\u6807\u5EA7\u4F4D\u7684\u6280\u80FD\u6548\u679C\u6A21\u578B\uFF0C\u5305\u542B\u4E00\u4E2A\u6765\u6E90\u548C\u4E00\u4E2A\u76EE\u6807"
392
+ });
393
+
394
+ // src/ability/effects/status.ts
395
+ import { z as z17 } from "zod";
396
+ var StatusSourceFromConstant = BaseSourceFromConstant.extend({
397
+ value: z17.enum(["DEAD", "ALIVE"])
398
+ });
399
+ var StatusSource = z17.discriminatedUnion("from", [
400
+ SourceFromPayload,
401
+ StatusSourceFromConstant
402
+ ]);
403
+ var StatusEffect = z17.object({
404
+ type: z17.literal("STATUS_CHANGE"),
405
+ source: StatusSource,
406
+ target: Target
407
+ }).meta({
408
+ id: "StatusEffect",
409
+ title: "\u72B6\u6001\u53D8\u5316\u6548\u679C\u6A21\u578B",
410
+ description: "\u8868\u793A\u6539\u53D8\u76EE\u6807\u72B6\u6001\u7684\u6280\u80FD\u6548\u679C\u6A21\u578B\uFF0C\u5305\u542B\u4E00\u4E2A\u6765\u6E90\u548C\u4E00\u4E2A\u76EE\u6807"
411
+ });
412
+
413
+ // src/ability/effects/index.ts
414
+ var Effect = z18.discriminatedUnion("type", [
415
+ AbilityChangeEffect,
416
+ AlignmentChangeEffect,
417
+ CharacterCountEffect,
418
+ CharacterChangeEffect,
419
+ CharacterPerceptionEffect,
420
+ StatusEffect,
421
+ SeatEffect,
422
+ GameEffect,
423
+ ReminderEffect,
424
+ RemoveReminderEffect
425
+ ]);
426
+
427
+ // src/ability/inputs/index.ts
428
+ import { z as z30 } from "zod";
429
+
430
+ // src/ability/inputs/alignment.ts
431
+ import { z as z20 } from "zod";
432
+
433
+ // src/ability/inputs/basic.ts
434
+ import { z as z19 } from "zod";
435
+ var BasicInput = z19.object({
436
+ title: z19.string().optional(),
437
+ footer: z19.string().optional(),
438
+ readonly: z19.boolean().optional()
439
+ });
440
+ var Range = z19.union(
441
+ [
442
+ z19.tuple([z19.number(), z19.number()]).refine(([min, max]) => min <= max, {
443
+ message: "\u7B2C\u4E00\u4E2A\u6570\u5B57\u5FC5\u987B\u5C0F\u4E8E\u7B49\u4E8E\u7B2C\u4E8C\u4E2A\u6570\u5B57"
444
+ }),
445
+ z19.tuple([z19.number()])
446
+ ]
447
+ ).meta({
448
+ id: "Range",
449
+ title: "\u8303\u56F4\u6A21\u578B",
450
+ description: "\u8868\u793A\u4E00\u4E2A\u6570\u503C\u8303\u56F4\uFF0C\u53EF\u4EE5\u662F\u4E00\u4E2A\u56FA\u5B9A\u503C\u6216\u8005\u4E00\u4E2A\u533A\u95F4"
451
+ });
452
+
453
+ // src/ability/inputs/alignment.ts
454
+ var AlignmentInput = BasicInput.extend({
455
+ type: z20.literal("ALIGNMENT")
456
+ }).meta({
457
+ id: "AlignmentInput",
458
+ title: "\u9635\u8425\u9009\u62E9",
459
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u9635\u8425\u7684\u9009\u62E9\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u9635\u8425\u7684\u6280\u80FD\u9009\u9879"
460
+ });
461
+
462
+ // src/ability/inputs/boolean.ts
463
+ import { z as z21 } from "zod";
464
+ var BooleanInput = BasicInput.extend({
465
+ type: z21.literal("BOOLEAN"),
466
+ prompt: z21.string().optional(),
467
+ style: z21.enum(["RADIO", "SWITCH"]).optional().default("SWITCH"),
468
+ defaultValue: z21.boolean().optional().default(false),
469
+ texts: z21.tuple([z21.string(), z21.string()]).optional().default(["\u5426", "\u662F"])
470
+ }).meta({
471
+ id: "BooleanInput",
472
+ title: "\u5E03\u5C14\u9009\u62E9",
473
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u5E03\u5C14\u503C\u7684\u9009\u62E9\uFF0C\u901A\u5E38\u7528\u4E8E\u5F00\u5173\u7C7B\u7684\u9009\u9879"
474
+ });
475
+
476
+ // src/ability/inputs/character.ts
477
+ import { z as z22 } from "zod";
478
+ var CharacterInput = BasicInput.extend({
479
+ type: z22.literal("CHARACTER"),
480
+ kinds: CharacterBasicKind.array().optional().default(["Townsfolk", "Outsiders", "Minions", "Demons"]),
481
+ filterToken: z22.string().optional(),
482
+ range: Range.optional()
483
+ }).meta({
484
+ id: "CharacterInput",
485
+ title: "\u89D2\u8272\u8F93\u5165",
486
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u89D2\u8272\u7684\u8F93\u5165\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u89D2\u8272\u7684\u6280\u80FD\u9009\u9879"
487
+ });
488
+
489
+ // src/ability/inputs/character-kind.ts
490
+ import { z as z23 } from "zod";
491
+ var CharacterKindInput = BasicInput.extend({
492
+ type: z23.literal("CHARACTER_KIND")
493
+ }).meta({
494
+ id: "CharacterKindInput",
495
+ title: "\u89D2\u8272\u7C7B\u522B\u8F93\u5165",
496
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u89D2\u8272\u7C7B\u522B\u7684\u8F93\u5165\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u89D2\u8272\u7C7B\u578B\u7684\u6280\u80FD\u9009\u9879"
497
+ });
498
+
499
+ // src/ability/inputs/number.ts
500
+ import { z as z24 } from "zod";
501
+ var NumberInput = BasicInput.extend({
502
+ type: z24.literal("NUMBER"),
503
+ range: Range.optional().default([1]),
504
+ style: z24.enum(["SELECTION", "INPUT"]).optional().default("SELECTION")
505
+ }).meta({
506
+ id: "NumberInput",
507
+ title: "\u6570\u5B57\u8F93\u5165",
508
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u6570\u5B57\u7684\u8F93\u5165\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u6570\u503C\u7684\u6280\u80FD\u9009\u9879"
509
+ });
510
+
511
+ // src/ability/inputs/player.ts
512
+ import { z as z25 } from "zod";
513
+ var PlayerInput = BasicInput.extend({
514
+ type: z25.literal("PLAYER"),
515
+ layout: z25.enum(["ROUND", "ROW"]).optional().default("ROUND"),
516
+ kinds: CharacterBasicKind.array().optional().default(["Townsfolk", "Outsiders", "Minions", "Demons"]),
517
+ filterToken: z25.string().optional(),
518
+ range: Range.optional()
519
+ }).meta({
520
+ id: "PlayerInput",
521
+ title: "\u73A9\u5BB6\u8F93\u5165",
522
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u73A9\u5BB6\u7684\u8F93\u5165\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u73A9\u5BB6\u7684\u6280\u80FD\u9009\u9879"
523
+ });
524
+
525
+ // src/ability/inputs/reminder.ts
526
+ import { z as z26 } from "zod";
527
+ var ReminderInput = BasicInput.extend({
528
+ type: z26.literal("REMINDER")
529
+ }).meta({
530
+ id: "ReminderInput",
531
+ title: "\u63D0\u793A\u8F93\u5165",
532
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u63D0\u793A\u7684\u8F93\u5165\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u7ED9\u73A9\u5BB6\u5C55\u793A\u4FE1\u606F\u7684\u6280\u80FD\u9009\u9879"
533
+ });
534
+ var PlayerReminderInput = BasicInput.extend({
535
+ type: z26.literal("PLAYER_REMINDER")
536
+ }).meta({
537
+ id: "PlayerReminderInput",
538
+ title: "\u73A9\u5BB6\u63D0\u793A\u8F93\u5165",
539
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u73A9\u5BB6\u63D0\u793A\u7684\u8F93\u5165\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u7ED9\u7279\u5B9A\u73A9\u5BB6\u5C55\u793A\u4FE1\u606F\u7684\u6280\u80FD\u9009\u9879"
540
+ });
541
+
542
+ // src/ability/inputs/seat-side.ts
543
+ import { z as z27 } from "zod";
544
+ var SeatSideInput = BasicInput.extend({
545
+ type: z27.literal("SEAT_SIDE")
546
+ }).meta({
547
+ id: "SeatSideInput",
548
+ title: "\u5EA7\u4F4D\u9009\u62E9",
549
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u5EA7\u4F4D\u7684\u9009\u62E9\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u5EA7\u4F4D\u7684\u6280\u80FD\u9009\u9879"
550
+ });
551
+
552
+ // src/ability/inputs/status.ts
553
+ import { z as z28 } from "zod";
554
+ var StatusInput = BasicInput.extend({
555
+ type: z28.literal("STATUS")
556
+ }).meta({
557
+ id: "StatusInput",
558
+ title: "\u72B6\u6001\u8F93\u5165",
559
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u72B6\u6001\u7684\u8F93\u5165\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u72B6\u6001\u7684\u6280\u80FD\u9009\u9879"
560
+ });
561
+
562
+ // src/ability/inputs/text.ts
563
+ import { z as z29 } from "zod";
564
+ var TextInput = BasicInput.extend({
565
+ type: z29.literal("TEXT")
566
+ }).meta({
567
+ id: "TextInput",
568
+ title: "\u6587\u672C\u8F93\u5165",
569
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u6587\u672C\u7684\u8F93\u5165\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u6587\u672C\u7684\u6280\u80FD\u9009\u9879"
570
+ });
571
+
572
+ // src/ability/inputs/index.ts
573
+ var Input = z30.discriminatedUnion("type", [
574
+ PlayerInput,
575
+ CharacterInput,
576
+ AlignmentInput,
577
+ CharacterKindInput,
578
+ BooleanInput,
579
+ NumberInput,
580
+ TextInput,
581
+ StatusInput,
582
+ ReminderInput,
583
+ PlayerReminderInput,
584
+ SeatSideInput
585
+ ]);
586
+
587
+ // src/ability/views/index.ts
588
+ import { z as z42 } from "zod";
589
+
590
+ // src/ability/views/alignment.ts
591
+ import { z as z32 } from "zod";
592
+
593
+ // src/ability/views/basic.ts
594
+ import { z as z31 } from "zod";
595
+ var BasicView = z31.object({
596
+ source: BaseSource
597
+ });
598
+
599
+ // src/ability/views/alignment.ts
600
+ var AlignmentView = BasicView.extend({
601
+ type: z32.literal("ALIGNMENT")
602
+ }).meta({
603
+ id: "AlignmentView",
604
+ title: "\u9635\u8425\u9009\u62E9\u89C6\u56FE",
605
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u9635\u8425\u7684\u9009\u62E9\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u9635\u8425\u7684\u6280\u80FD\u9009\u9879"
606
+ });
607
+
608
+ // src/ability/views/boolean.ts
609
+ import { z as z33 } from "zod";
610
+ var BooleanView = BasicView.extend({
611
+ type: z33.literal("BOOLEAN"),
612
+ texts: z33.tuple([z33.string().default("\u5426"), z33.string().default("\u662F")]).optional().default(["\u5426", "\u662F"]),
613
+ style: z33.array(z33.enum(["ICON", "TEXT"])).optional().default(["ICON"])
614
+ }).meta({
615
+ id: "BooleanView",
616
+ title: "\u5E03\u5C14\u9009\u62E9\u89C6\u56FE",
617
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u5E03\u5C14\u9009\u62E9\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u9009\u62E9\u662F\u6216\u5426\u7684\u6280\u80FD\u9009\u9879"
618
+ });
619
+
620
+ // src/ability/views/character.ts
621
+ import { z as z34 } from "zod";
622
+ var CharacterView = BasicView.extend({
623
+ type: z34.literal("CHARACTER")
624
+ }).meta({
625
+ id: "CharacterView",
626
+ title: "\u89D2\u8272\u9009\u62E9\u89C6\u56FE",
627
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u89D2\u8272\u7684\u9009\u62E9\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u89D2\u8272\u7684\u6280\u80FD\u9009\u9879"
628
+ });
629
+
630
+ // src/ability/views/character-kind.ts
631
+ import { z as z35 } from "zod";
632
+ var CharacterKindView = BasicView.extend({
633
+ type: z35.literal("CHARACTER_KIND")
634
+ }).meta({
635
+ id: "CharacterKindView",
636
+ title: "\u89D2\u8272\u7C7B\u578B\u89C6\u56FE",
637
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u89D2\u8272\u7C7B\u578B\u7684\u9009\u62E9\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u89D2\u8272\u7C7B\u578B\u7684\u6280\u80FD\u9009\u9879"
638
+ });
639
+
640
+ // src/ability/views/number.ts
641
+ import { z as z36 } from "zod";
642
+ var NumberView = BasicView.extend({
643
+ type: z36.literal("NUMBER")
644
+ }).meta({
645
+ id: "NumberView",
646
+ title: "\u6570\u5B57\u9009\u62E9\u89C6\u56FE",
647
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u6570\u5B57\u7684\u9009\u62E9\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u6570\u5B57\u7684\u6280\u80FD\u9009\u9879"
648
+ });
649
+
650
+ // src/ability/views/player.ts
651
+ import { z as z37 } from "zod";
652
+ var PlayerView = BasicView.extend({
653
+ type: z37.literal("PLAYER")
654
+ }).meta({
655
+ id: "PlayerView",
656
+ title: "\u73A9\u5BB6\u9009\u62E9\u89C6\u56FE",
657
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u73A9\u5BB6\u7684\u9009\u62E9\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u73A9\u5BB6\u7684\u6280\u80FD\u9009\u9879"
658
+ });
659
+
660
+ // src/ability/views/reminder.ts
661
+ import { z as z38 } from "zod";
662
+ var ReminderView = BasicView.extend({
663
+ type: z38.literal("REMINDER")
664
+ }).meta({
665
+ id: "ReminderView",
666
+ title: "\u63D0\u9192\u89C6\u56FE",
667
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u63D0\u9192\u7684\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u663E\u793A\u63D0\u9192\u7684\u6280\u80FD\u9009\u9879"
668
+ });
669
+ var PlayerReminderView = BasicView.extend({
670
+ type: z38.literal("PLAYER_REMINDER")
671
+ }).meta({
672
+ id: "PlayerReminderView",
673
+ title: "\u73A9\u5BB6\u63D0\u9192\u89C6\u56FE",
674
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u73A9\u5BB6\u63D0\u9192\u7684\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u663E\u793A\u73A9\u5BB6\u63D0\u9192\u7684\u6280\u80FD\u9009\u9879"
675
+ });
676
+
677
+ // src/ability/views/seat-side.ts
678
+ import { z as z39 } from "zod";
679
+ var SeatSideView = BasicView.extend({
680
+ type: z39.literal("SEAT_SIDE")
681
+ }).meta({
682
+ id: "SeatSideView",
683
+ title: "\u5EA7\u4F4D\u89C6\u56FE",
684
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u5EA7\u4F4D\u7684\u9009\u62E9\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u5EA7\u4F4D\u7684\u6280\u80FD\u9009\u9879"
685
+ });
686
+
687
+ // src/ability/views/status.ts
688
+ import { z as z40 } from "zod";
689
+ var StatusView = BasicView.extend({
690
+ type: z40.literal("STATUS")
691
+ }).meta({
692
+ id: "StatusView",
693
+ title: "\u72B6\u6001\u89C6\u56FE",
694
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u72B6\u6001\u7684\u9009\u62E9\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u6307\u5B9A\u72B6\u6001\u7684\u6280\u80FD\u9009\u9879"
695
+ });
696
+
697
+ // src/ability/views/text.ts
698
+ import { z as z41 } from "zod";
699
+ var TextView = BasicView.extend({
700
+ type: z41.literal("TEXT"),
701
+ color: z41.string().optional().default("#000000"),
702
+ fontSize: z41.number().optional().default(14)
703
+ }).meta({
704
+ id: "TextView",
705
+ title: "\u6587\u672C\u89C6\u56FE",
706
+ description: "\u63D0\u4F9B\u4E00\u4E2A\u6587\u672C\u7684\u89C6\u56FE\uFF0C\u901A\u5E38\u7528\u4E8E\u9700\u8981\u663E\u793A\u6587\u672C\u7684\u6280\u80FD\u9009\u9879"
707
+ });
708
+
709
+ // src/ability/views/index.ts
710
+ var View = z42.discriminatedUnion("type", [
711
+ CharacterView,
712
+ CharacterKindView,
713
+ AlignmentView,
714
+ NumberView,
715
+ PlayerView,
716
+ BooleanView,
717
+ TextView,
718
+ StatusView,
719
+ ReminderView,
720
+ PlayerReminderView,
721
+ SeatSideView
722
+ ]);
723
+ var ViewTypes = View.options.map((option) => option.shape.type.value);
724
+
725
+ // src/ability/message/index.ts
726
+ import { z as z46 } from "zod";
727
+
728
+ // src/ability/message/segment.ts
729
+ import { z as z45 } from "zod";
730
+
731
+ // src/ability/message/payload-type.ts
732
+ import { z as z43 } from "zod";
733
+ var MessagePayloadTypes = [...ViewTypes];
734
+ var MessagePayloadType = z43.enum(MessagePayloadTypes);
735
+ var MessageBooleanDisplayStyle = z43.enum(["ICON", "TEXT"]);
736
+
737
+ // src/ability/message/player-display-format.ts
738
+ import { z as z44 } from "zod";
739
+ var PlayerDisplayFormat = z44.enum([
740
+ "NUMBER_AND_CHARACTER",
741
+ "NUMBER_ONLY",
742
+ "CHARACTER_ONLY",
743
+ "ALIGNMENT_ONLY"
744
+ ]).meta({
745
+ id: "PlayerDisplayFormat",
746
+ title: "\u73A9\u5BB6\u663E\u793A\u683C\u5F0F",
747
+ description: "\u5B9A\u4E49\u4E86\u73A9\u5BB6\u4FE1\u606F\u5728\u6280\u80FD\u6D88\u606F\u4E2D\u7684\u663E\u793A\u683C\u5F0F"
748
+ });
749
+
750
+ // src/ability/message/segment.ts
751
+ var TextSegment = z45.object({
752
+ type: z45.literal("TEXT"),
753
+ value: z45.string()
754
+ });
755
+ var MessageSegmentPayloadValue = z45.union([
756
+ z45.number().min(0),
757
+ z45.array(z45.number().min(0))
758
+ ]);
759
+ var PlayerSegmentOptions = z45.object({
760
+ format: PlayerDisplayFormat
761
+ }).optional().default({ format: "NUMBER_AND_CHARACTER" });
762
+ var PlayerPayloadSegment = z45.object({
763
+ type: z45.literal("PAYLOAD"),
764
+ value: MessageSegmentPayloadValue,
765
+ payloadType: z45.literal("PLAYER"),
766
+ options: PlayerSegmentOptions
767
+ });
768
+ var MessageBooleanPayloadOptions = z45.object({
769
+ texts: z45.tuple([z45.string(), z45.string()]).optional(),
770
+ style: z45.array(MessageBooleanDisplayStyle).optional(),
771
+ colors: z45.tuple([z45.string().optional(), z45.string().optional()]).optional()
772
+ }).optional();
773
+ var BooleanPayloadSegment = z45.object({
774
+ type: z45.literal("PAYLOAD"),
775
+ value: MessageSegmentPayloadValue,
776
+ payloadType: z45.literal("BOOLEAN"),
777
+ options: MessageBooleanPayloadOptions
778
+ });
779
+ var OtherNonPlayerPayloadType = z45.enum(
780
+ MessagePayloadType.options.filter((type) => type !== "PLAYER" && type !== "BOOLEAN")
781
+ );
782
+ var NonPlayerPayloadSegment = z45.object({
783
+ type: z45.literal("PAYLOAD"),
784
+ value: MessageSegmentPayloadValue,
785
+ payloadType: OtherNonPlayerPayloadType,
786
+ options: z45.object({}).optional().default({})
787
+ });
788
+ var PayloadSegment = z45.discriminatedUnion("payloadType", [
789
+ PlayerPayloadSegment,
790
+ BooleanPayloadSegment,
791
+ NonPlayerPayloadSegment
792
+ ]);
793
+ var EffectorSegment = z45.object({
794
+ type: z45.literal("EFFECTOR"),
795
+ options: PlayerSegmentOptions
796
+ });
797
+ var SpecialMessageKind = z45.enum([
798
+ "SPY"
799
+ ]);
800
+ var SpecialSegment = z45.object({
801
+ type: z45.literal("SPECIAL"),
802
+ kind: SpecialMessageKind
803
+ });
804
+ var MessageTemplateSegment = z45.union([
805
+ TextSegment,
806
+ PayloadSegment,
807
+ EffectorSegment,
808
+ SpecialSegment
809
+ ]).meta({
810
+ id: "MessageTemplateSegmentModel",
811
+ title: "\u6D88\u606F\u6A21\u677F\u6BB5\u6A21\u578B",
812
+ description: "\u6D88\u606F\u6A21\u677F\u6BB5\u6A21\u578B\u5B9A\u4E49\u4E86\u6280\u80FD\u6D88\u606F\u4E2D\u6BCF\u4E2A\u6BB5\u7684\u5185\u5BB9\u548C\u7C7B\u578B\uFF0C\u53EF\u4EE5\u662F\u7EAF\u6587\u672C\u3001\u5E26\u6709\u7279\u5B9A\u683C\u5F0F\u7684\u73A9\u5BB6\u4FE1\u606F\u3001\u5176\u4ED6\u7C7B\u578B\u7684\u6570\u503C\u4FE1\u606F\uFF0C\u6216\u8005\u7279\u6B8A\u7684\u9884\u8BBE\u4FE1\u606F"
813
+ });
814
+
815
+ // src/ability/message/index.ts
816
+ var Message = z46.object({
817
+ targets: z46.array(Target).min(1),
818
+ content: z46.array(MessageTemplateSegment).min(1)
819
+ }).meta({
820
+ id: "Message",
821
+ title: "\u6280\u80FD\u6D88\u606F\u6A21\u578B",
822
+ description: "\u6280\u80FD\u6D88\u606F\u6A21\u578B\u5B9A\u4E49\u4E86\u6280\u80FD\u6267\u884C\u8FC7\u7A0B\u4E2D\u9700\u8981\u5C55\u793A\u7684\u4FE1\u606F\u5185\u5BB9\u548C\u76F8\u5173\u7684\u76EE\u6807"
823
+ });
824
+
825
+ // src/player.ts
826
+ import { z as z47 } from "zod";
827
+ var Player = z47.object({
828
+ seat: z47.number().min(1),
829
+ user: z47.object({
830
+ userId: z47.string(),
831
+ ready: z47.boolean()
832
+ }).optional(),
833
+ characterId: z47.string(),
834
+ perceivedCharacter: z47.object({
835
+ characterId: z47.string(),
836
+ abilities: z47.array(z47.string()).default([]),
837
+ asCharacter: z47.boolean().optional()
838
+ }).optional(),
839
+ abilities: z47.array(z47.string()).default([]),
840
+ reminders: z47.array(Reminder).optional(),
841
+ alignment: AlignmentEnum.optional(),
842
+ isDead: z47.boolean().optional(),
843
+ hasUsedDeadVote: z47.boolean().optional()
844
+ });
845
+
846
+ // src/timeline.ts
847
+ import { z as z48 } from "zod";
848
+ var Timeline = z48.object({
849
+ turn: z48.number().min(0).default(0),
850
+ time: z48.enum(["day", "night"]),
851
+ operations: z48.array(Operation).default([]),
852
+ nominations: z48.array(Nomination).default([]).optional()
853
+ });
854
+
855
+ // src/room.ts
856
+ import { z as z49 } from "zod";
857
+ var Room = z49.object({
858
+ roomId: z49.string(),
859
+ hostId: z49.string(),
860
+ createdAt: z49.iso.datetime().default(() => (/* @__PURE__ */ new Date()).toISOString())
861
+ // Creation date
862
+ });
863
+ var RoomCreate = Room.partial({
864
+ createdAt: true
865
+ });
866
+
867
+ // src/config.ts
868
+ import { z as z50 } from "zod";
869
+ var characterKindCount = z50.object({
870
+ kind: CharacterBasicKind,
871
+ count: z50.number().default(0)
872
+ });
873
+ var RoomDefaults = z50.object({
874
+ defaultScriptId: z50.string().default(""),
875
+ defaultCharacterKinds: z50.array(characterKindCount).default([
876
+ { kind: "Townsfolk", count: 7 },
877
+ { kind: "Outsiders", count: 2 },
878
+ { kind: "Minions", count: 2 },
879
+ { kind: "Demons", count: 1 }
880
+ ]),
881
+ defaultNumberOfPlayer: z50.number().default(12)
882
+ });
883
+
884
+ // src/message-group.ts
885
+ import { z as z51 } from "zod";
886
+ var MessageGroup = z51.object({
887
+ groupId: z51.string(),
888
+ name: z51.string(),
889
+ userIds: z51.array(z51.string()).min(2),
890
+ createdAt: z51.iso.datetime().default(() => (/* @__PURE__ */ new Date()).toISOString())
891
+ });
892
+
893
+ // src/message.ts
894
+ import { z as z52 } from "zod";
895
+ var MessageOperation = z52.object({
896
+ type: z52.string().min(1),
897
+ payload: z52.record(z52.string(), z52.any()).default({}),
898
+ meta: z52.record(z52.string(), z52.any()).optional()
899
+ });
900
+ var MessageTextContent = z52.object({
901
+ type: z52.literal("text"),
902
+ text: z52.string()
903
+ });
904
+ var MessageOperationContent = z52.object({
905
+ type: z52.literal("operation"),
906
+ operation: MessageOperation
907
+ });
908
+ var MessageContent = z52.union([
909
+ MessageTextContent,
910
+ MessageOperationContent
911
+ // MessageCustomContent,
912
+ ]);
913
+ var Message2 = z52.object({
914
+ id: z52.string(),
915
+ roomId: z52.string(),
916
+ sender: z52.string(),
917
+ target: z52.object({
918
+ type: z52.enum(["DIRECT", "GROUP"]),
919
+ id: z52.string()
920
+ }),
921
+ content: MessageContent,
922
+ createdAt: z52.iso.datetime().default(() => (/* @__PURE__ */ new Date()).toISOString()),
923
+ updatedAt: z52.iso.datetime().optional(),
924
+ version: z52.number().int().min(1).default(1),
925
+ metadata: z52.record(z52.string(), z52.any()).optional()
926
+ });
927
+ var MessageCreate = Message2.omit({
928
+ id: true,
929
+ createdAt: true,
930
+ updatedAt: true,
931
+ version: true
932
+ }).extend({
933
+ id: z52.string().optional()
934
+ });
935
+ var BaseConversation = z52.object({
936
+ targetId: z52.string(),
937
+ lastMessage: Message2.optional(),
938
+ lastMessageTime: z52.iso.datetime().optional()
939
+ });
940
+ var DirectConversation = BaseConversation.extend({
941
+ type: z52.literal("DIRECT"),
942
+ role: z52.enum(["PLAYER", "STORYTELLER"]),
943
+ userIds: z52.tuple([z52.string(), z52.string()])
944
+ });
945
+ var GroupConversation = BaseConversation.extend({
946
+ type: z52.literal("GROUP"),
947
+ targetName: z52.string(),
948
+ groupData: MessageGroup
949
+ });
950
+ var Conversation = z52.discriminatedUnion("type", [
951
+ DirectConversation,
952
+ GroupConversation
953
+ ]);
954
+
955
+ // src/script.ts
956
+ import { z as z55 } from "zod";
957
+
958
+ // src/ability/index.ts
959
+ import { z as z53 } from "zod";
960
+ var EffectStage = z53.enum(["PREPARE", "CHARACTER_SELECTION", "PLAYING"]);
961
+ var EffectCategory = z53.enum(["CHARACTER", "STORYTELLER"]);
962
+ var AbilityExecutionTiming = z53.enum(["NORMAL", "DEFER_TO_END"]);
963
+ var Ability = z53.object({
964
+ id: z53.string(),
965
+ name: z53.string(),
966
+ description: z53.string(),
967
+ bio: z53.string().optional(),
968
+ stage: EffectStage.optional().default("PLAYING"),
969
+ category: EffectCategory.optional().default("CHARACTER"),
970
+ executionTiming: AbilityExecutionTiming.optional().default("NORMAL"),
971
+ tags: z53.array(z53.string()).optional().or(z53.null()),
972
+ inputs: z53.array(Input).optional().default([]),
973
+ views: z53.array(View).optional().default([]),
974
+ effects: z53.array(Effect).optional().default([]),
975
+ messages: z53.array(Message).optional().default([]),
976
+ scope: z53.enum(["EVERYONE", "STORYTELLER_ONLY"]).optional().default("STORYTELLER_ONLY"),
977
+ createdAt: z53.iso.datetime().default(() => (/* @__PURE__ */ new Date()).toISOString())
978
+ }).meta({
979
+ id: "Ability",
980
+ title: "\u80FD\u529B",
981
+ description: "\u6E38\u620F\u4E2D\u7684\u80FD\u529B\uFF0C\u5305\u542B\u5176\u6548\u679C\u3001\u8F93\u5165\u3001\u5C55\u793A\u7B49\u4FE1\u606F"
982
+ });
983
+
984
+ // src/character.ts
985
+ import { z as z54 } from "zod";
986
+ var Character = z54.object({
987
+ id: z54.string(),
988
+ name: z54.string(),
989
+ key: z54.string(),
990
+ icon: z54.string().optional(),
991
+ kind: CharacterBasicKind.default("Townsfolk"),
992
+ skill: z54.string().optional().or(z54.null()),
993
+ saying: z54.string().optional().or(z54.null()),
994
+ tags: z54.array(z54.string()).optional().or(z54.null()),
995
+ abilities: z54.array(z54.string()),
996
+ createdAt: z54.iso.datetime().default(() => (/* @__PURE__ */ new Date()).toISOString())
997
+ }).meta({
998
+ id: "Character",
999
+ title: "\u89D2\u8272",
1000
+ description: "\u6E38\u620F\u4E2D\u7684\u89D2\u8272\uFF0C\u5305\u542B\u5176\u57FA\u672C\u4FE1\u606F\u548C\u80FD\u529B\u5217\u8868"
1001
+ });
1002
+ var PopulatedCharacter = Character.extend({
1003
+ abilities: Ability.array().optional().default([])
1004
+ });
1005
+
1006
+ // src/script.ts
1007
+ var Script = z55.object({
1008
+ id: z55.string(),
1009
+ name: z55.string(),
1010
+ cover: z55.string(),
1011
+ characters: z55.array(z55.string()).default([]),
1012
+ orderInFirstNight: z55.array(z55.string()).default([]),
1013
+ orderInOtherNight: z55.array(z55.string()).default([]),
1014
+ isEnabled: z55.boolean().optional().default(false),
1015
+ createdAt: z55.iso.datetime().default(() => (/* @__PURE__ */ new Date()).toISOString())
1016
+ });
1017
+ var PopulatedScript = Script.extend({
1018
+ characters: Character.extend({
1019
+ abilities: Ability.array().optional().default([])
1020
+ }).array().default([])
1021
+ });
1022
+ export {
1023
+ Ability,
1024
+ AbilityExecutionTiming,
1025
+ AlignmentEnum,
1026
+ BaseSource,
1027
+ Character,
1028
+ CharacterBasicKind,
1029
+ CharacterKind,
1030
+ Message2 as ChatMessage,
1031
+ MessageContent as ChatMessageContent,
1032
+ MessageGroup as ChatMessageGroup,
1033
+ MessageOperation as ChatMessageOperation,
1034
+ Conversation,
1035
+ Effect,
1036
+ Game,
1037
+ Input,
1038
+ Message,
1039
+ Nomination,
1040
+ Operation,
1041
+ Player,
1042
+ PlayerDisplayFormat,
1043
+ PlayerReminder,
1044
+ PopulatedCharacter,
1045
+ PopulatedScript,
1046
+ Reminder,
1047
+ Room,
1048
+ RoomCreate,
1049
+ RoomDefaults,
1050
+ RuntimeGame,
1051
+ Script,
1052
+ SeatSideEnum,
1053
+ SpecialMessageKind,
1054
+ Target,
1055
+ Timeline,
1056
+ View,
1057
+ ViewTypes
1058
+ };