@playcademy/sdk 0.0.5 → 0.0.6

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 (46) hide show
  1. package/dist/index.d.ts +3998 -7
  2. package/dist/index.js +1962 -1938
  3. package/dist/types.d.ts +4219 -31
  4. package/dist/types.js +1 -748
  5. package/package.json +5 -3
  6. package/dist/core/auth/flows/popup.d.ts +0 -14
  7. package/dist/core/auth/flows/redirect.d.ts +0 -15
  8. package/dist/core/auth/flows/unified.d.ts +0 -11
  9. package/dist/core/auth/login.d.ts +0 -20
  10. package/dist/core/auth/oauth.d.ts +0 -115
  11. package/dist/core/auth/utils.d.ts +0 -23
  12. package/dist/core/cache/cooldown-cache.d.ts +0 -31
  13. package/dist/core/cache/index.d.ts +0 -14
  14. package/dist/core/cache/permanent-cache.d.ts +0 -39
  15. package/dist/core/cache/singleton-cache.d.ts +0 -29
  16. package/dist/core/cache/ttl-cache.d.ts +0 -54
  17. package/dist/core/cache/types.d.ts +0 -23
  18. package/dist/core/client.d.ts +0 -521
  19. package/dist/core/errors.d.ts +0 -11
  20. package/dist/core/namespaces/achievements.d.ts +0 -84
  21. package/dist/core/namespaces/admin.d.ts +0 -385
  22. package/dist/core/namespaces/auth.d.ts +0 -54
  23. package/dist/core/namespaces/character.d.ts +0 -205
  24. package/dist/core/namespaces/credits.d.ts +0 -51
  25. package/dist/core/namespaces/dev.d.ts +0 -323
  26. package/dist/core/namespaces/games.d.ts +0 -173
  27. package/dist/core/namespaces/identity.d.ts +0 -98
  28. package/dist/core/namespaces/index.d.ts +0 -19
  29. package/dist/core/namespaces/leaderboard.d.ts +0 -48
  30. package/dist/core/namespaces/levels.d.ts +0 -90
  31. package/dist/core/namespaces/maps.d.ts +0 -93
  32. package/dist/core/namespaces/realtime.client.d.ts +0 -129
  33. package/dist/core/namespaces/realtime.d.ts +0 -90
  34. package/dist/core/namespaces/runtime.d.ts +0 -222
  35. package/dist/core/namespaces/scores.d.ts +0 -55
  36. package/dist/core/namespaces/shop.d.ts +0 -25
  37. package/dist/core/namespaces/sprites.d.ts +0 -35
  38. package/dist/core/namespaces/telemetry.d.ts +0 -28
  39. package/dist/core/namespaces/timeback.d.ts +0 -111
  40. package/dist/core/namespaces/users.d.ts +0 -172
  41. package/dist/core/request.d.ts +0 -24
  42. package/dist/core/static/identity.d.ts +0 -37
  43. package/dist/core/static/index.d.ts +0 -3
  44. package/dist/core/static/init.d.ts +0 -21
  45. package/dist/core/static/login.d.ts +0 -34
  46. package/dist/messaging.d.ts +0 -544
package/dist/index.d.ts CHANGED
@@ -1,10 +1,4001 @@
1
+ import * as _playcademy_realtime_server_types from '@playcademy/realtime/server/types';
2
+ import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
3
+ import * as drizzle_zod from 'drizzle-zod';
4
+ import { z } from 'zod';
5
+
1
6
  /**
2
- * @fileoverview Playcademy SDK - Main Entry Point
7
+ * SDK Constants
8
+ * These are re-exported from @playcademy/data but defined here
9
+ * to avoid bundling issues with API Extractor
10
+ */
11
+ declare const CURRENCIES: {
12
+ readonly PRIMARY: "PLAYCADEMY_CREDITS";
13
+ readonly XP: "PLAYCADEMY_XP";
14
+ };
15
+ declare const BADGES: {
16
+ readonly FOUNDING_MEMBER: "FOUNDING_MEMBER_BADGE";
17
+ readonly EARLY_ADOPTER: "EARLY_ADOPTER_BADGE";
18
+ readonly FIRST_GAME: "FIRST_GAME_BADGE";
19
+ };
20
+ declare const AuthProvider: {
21
+ readonly TIMEBACK: "TIMEBACK";
22
+ };
23
+
24
+ declare const users: drizzle_orm_pg_core.PgTableWithColumns<{
25
+ name: "user";
26
+ schema: undefined;
27
+ columns: {
28
+ id: drizzle_orm_pg_core.PgColumn<{
29
+ name: "id";
30
+ tableName: "user";
31
+ dataType: "string";
32
+ columnType: "PgText";
33
+ data: string;
34
+ driverParam: string;
35
+ notNull: true;
36
+ hasDefault: true;
37
+ isPrimaryKey: true;
38
+ isAutoincrement: false;
39
+ hasRuntimeDefault: true;
40
+ enumValues: [string, ...string[]];
41
+ baseColumn: never;
42
+ identity: undefined;
43
+ generated: undefined;
44
+ }, {}, {}>;
45
+ name: drizzle_orm_pg_core.PgColumn<{
46
+ name: "name";
47
+ tableName: "user";
48
+ dataType: "string";
49
+ columnType: "PgText";
50
+ data: string;
51
+ driverParam: string;
52
+ notNull: true;
53
+ hasDefault: false;
54
+ isPrimaryKey: false;
55
+ isAutoincrement: false;
56
+ hasRuntimeDefault: false;
57
+ enumValues: [string, ...string[]];
58
+ baseColumn: never;
59
+ identity: undefined;
60
+ generated: undefined;
61
+ }, {}, {}>;
62
+ username: drizzle_orm_pg_core.PgColumn<{
63
+ name: "username";
64
+ tableName: "user";
65
+ dataType: "string";
66
+ columnType: "PgText";
67
+ data: string;
68
+ driverParam: string;
69
+ notNull: false;
70
+ hasDefault: false;
71
+ isPrimaryKey: false;
72
+ isAutoincrement: false;
73
+ hasRuntimeDefault: false;
74
+ enumValues: [string, ...string[]];
75
+ baseColumn: never;
76
+ identity: undefined;
77
+ generated: undefined;
78
+ }, {}, {}>;
79
+ email: drizzle_orm_pg_core.PgColumn<{
80
+ name: "email";
81
+ tableName: "user";
82
+ dataType: "string";
83
+ columnType: "PgText";
84
+ data: string;
85
+ driverParam: string;
86
+ notNull: true;
87
+ hasDefault: false;
88
+ isPrimaryKey: false;
89
+ isAutoincrement: false;
90
+ hasRuntimeDefault: false;
91
+ enumValues: [string, ...string[]];
92
+ baseColumn: never;
93
+ identity: undefined;
94
+ generated: undefined;
95
+ }, {}, {}>;
96
+ timebackId: drizzle_orm_pg_core.PgColumn<{
97
+ name: "timeback_id";
98
+ tableName: "user";
99
+ dataType: "string";
100
+ columnType: "PgText";
101
+ data: string;
102
+ driverParam: string;
103
+ notNull: false;
104
+ hasDefault: false;
105
+ isPrimaryKey: false;
106
+ isAutoincrement: false;
107
+ hasRuntimeDefault: false;
108
+ enumValues: [string, ...string[]];
109
+ baseColumn: never;
110
+ identity: undefined;
111
+ generated: undefined;
112
+ }, {}, {}>;
113
+ emailVerified: drizzle_orm_pg_core.PgColumn<{
114
+ name: "email_verified";
115
+ tableName: "user";
116
+ dataType: "boolean";
117
+ columnType: "PgBoolean";
118
+ data: boolean;
119
+ driverParam: boolean;
120
+ notNull: true;
121
+ hasDefault: true;
122
+ isPrimaryKey: false;
123
+ isAutoincrement: false;
124
+ hasRuntimeDefault: false;
125
+ enumValues: undefined;
126
+ baseColumn: never;
127
+ identity: undefined;
128
+ generated: undefined;
129
+ }, {}, {}>;
130
+ image: drizzle_orm_pg_core.PgColumn<{
131
+ name: "image";
132
+ tableName: "user";
133
+ dataType: "string";
134
+ columnType: "PgText";
135
+ data: string;
136
+ driverParam: string;
137
+ notNull: false;
138
+ hasDefault: false;
139
+ isPrimaryKey: false;
140
+ isAutoincrement: false;
141
+ hasRuntimeDefault: false;
142
+ enumValues: [string, ...string[]];
143
+ baseColumn: never;
144
+ identity: undefined;
145
+ generated: undefined;
146
+ }, {}, {}>;
147
+ role: drizzle_orm_pg_core.PgColumn<{
148
+ name: "role";
149
+ tableName: "user";
150
+ dataType: "string";
151
+ columnType: "PgEnumColumn";
152
+ data: "admin" | "player" | "developer";
153
+ driverParam: string;
154
+ notNull: true;
155
+ hasDefault: true;
156
+ isPrimaryKey: false;
157
+ isAutoincrement: false;
158
+ hasRuntimeDefault: false;
159
+ enumValues: ["admin", "player", "developer"];
160
+ baseColumn: never;
161
+ identity: undefined;
162
+ generated: undefined;
163
+ }, {}, {}>;
164
+ developerStatus: drizzle_orm_pg_core.PgColumn<{
165
+ name: "developer_status";
166
+ tableName: "user";
167
+ dataType: "string";
168
+ columnType: "PgEnumColumn";
169
+ data: "none" | "pending" | "approved";
170
+ driverParam: string;
171
+ notNull: true;
172
+ hasDefault: true;
173
+ isPrimaryKey: false;
174
+ isAutoincrement: false;
175
+ hasRuntimeDefault: false;
176
+ enumValues: ["none", "pending", "approved"];
177
+ baseColumn: never;
178
+ identity: undefined;
179
+ generated: undefined;
180
+ }, {}, {}>;
181
+ characterCreated: drizzle_orm_pg_core.PgColumn<{
182
+ name: "character_created";
183
+ tableName: "user";
184
+ dataType: "boolean";
185
+ columnType: "PgBoolean";
186
+ data: boolean;
187
+ driverParam: boolean;
188
+ notNull: true;
189
+ hasDefault: true;
190
+ isPrimaryKey: false;
191
+ isAutoincrement: false;
192
+ hasRuntimeDefault: false;
193
+ enumValues: undefined;
194
+ baseColumn: never;
195
+ identity: undefined;
196
+ generated: undefined;
197
+ }, {}, {}>;
198
+ createdAt: drizzle_orm_pg_core.PgColumn<{
199
+ name: "created_at";
200
+ tableName: "user";
201
+ dataType: "date";
202
+ columnType: "PgTimestamp";
203
+ data: Date;
204
+ driverParam: string;
205
+ notNull: true;
206
+ hasDefault: false;
207
+ isPrimaryKey: false;
208
+ isAutoincrement: false;
209
+ hasRuntimeDefault: false;
210
+ enumValues: undefined;
211
+ baseColumn: never;
212
+ identity: undefined;
213
+ generated: undefined;
214
+ }, {}, {}>;
215
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
216
+ name: "updated_at";
217
+ tableName: "user";
218
+ dataType: "date";
219
+ columnType: "PgTimestamp";
220
+ data: Date;
221
+ driverParam: string;
222
+ notNull: true;
223
+ hasDefault: false;
224
+ isPrimaryKey: false;
225
+ isAutoincrement: false;
226
+ hasRuntimeDefault: false;
227
+ enumValues: undefined;
228
+ baseColumn: never;
229
+ identity: undefined;
230
+ generated: undefined;
231
+ }, {}, {}>;
232
+ };
233
+ dialect: "pg";
234
+ }>;
235
+
236
+ type GameMetadata = {
237
+ description?: string;
238
+ emoji?: string;
239
+ [key: string]: unknown;
240
+ };
241
+ declare const games: drizzle_orm_pg_core.PgTableWithColumns<{
242
+ name: "games";
243
+ schema: undefined;
244
+ columns: {
245
+ id: drizzle_orm_pg_core.PgColumn<{
246
+ name: "id";
247
+ tableName: "games";
248
+ dataType: "string";
249
+ columnType: "PgUUID";
250
+ data: string;
251
+ driverParam: string;
252
+ notNull: true;
253
+ hasDefault: true;
254
+ isPrimaryKey: true;
255
+ isAutoincrement: false;
256
+ hasRuntimeDefault: false;
257
+ enumValues: undefined;
258
+ baseColumn: never;
259
+ identity: undefined;
260
+ generated: undefined;
261
+ }, {}, {}>;
262
+ developerId: drizzle_orm_pg_core.PgColumn<{
263
+ name: "developer_id";
264
+ tableName: "games";
265
+ dataType: "string";
266
+ columnType: "PgText";
267
+ data: string;
268
+ driverParam: string;
269
+ notNull: false;
270
+ hasDefault: false;
271
+ isPrimaryKey: false;
272
+ isAutoincrement: false;
273
+ hasRuntimeDefault: false;
274
+ enumValues: [string, ...string[]];
275
+ baseColumn: never;
276
+ identity: undefined;
277
+ generated: undefined;
278
+ }, {}, {}>;
279
+ slug: drizzle_orm_pg_core.PgColumn<{
280
+ name: "slug";
281
+ tableName: "games";
282
+ dataType: "string";
283
+ columnType: "PgVarchar";
284
+ data: string;
285
+ driverParam: string;
286
+ notNull: true;
287
+ hasDefault: false;
288
+ isPrimaryKey: false;
289
+ isAutoincrement: false;
290
+ hasRuntimeDefault: false;
291
+ enumValues: [string, ...string[]];
292
+ baseColumn: never;
293
+ identity: undefined;
294
+ generated: undefined;
295
+ }, {}, {
296
+ length: 255;
297
+ }>;
298
+ displayName: drizzle_orm_pg_core.PgColumn<{
299
+ name: "display_name";
300
+ tableName: "games";
301
+ dataType: "string";
302
+ columnType: "PgVarchar";
303
+ data: string;
304
+ driverParam: string;
305
+ notNull: true;
306
+ hasDefault: false;
307
+ isPrimaryKey: false;
308
+ isAutoincrement: false;
309
+ hasRuntimeDefault: false;
310
+ enumValues: [string, ...string[]];
311
+ baseColumn: never;
312
+ identity: undefined;
313
+ generated: undefined;
314
+ }, {}, {
315
+ length: 255;
316
+ }>;
317
+ version: drizzle_orm_pg_core.PgColumn<{
318
+ name: "version";
319
+ tableName: "games";
320
+ dataType: "string";
321
+ columnType: "PgVarchar";
322
+ data: string;
323
+ driverParam: string;
324
+ notNull: true;
325
+ hasDefault: false;
326
+ isPrimaryKey: false;
327
+ isAutoincrement: false;
328
+ hasRuntimeDefault: false;
329
+ enumValues: [string, ...string[]];
330
+ baseColumn: never;
331
+ identity: undefined;
332
+ generated: undefined;
333
+ }, {}, {
334
+ length: 50;
335
+ }>;
336
+ gameType: drizzle_orm_pg_core.PgColumn<{
337
+ name: "game_type";
338
+ tableName: "games";
339
+ dataType: "string";
340
+ columnType: "PgEnumColumn";
341
+ data: "hosted" | "external";
342
+ driverParam: string;
343
+ notNull: true;
344
+ hasDefault: true;
345
+ isPrimaryKey: false;
346
+ isAutoincrement: false;
347
+ hasRuntimeDefault: false;
348
+ enumValues: ["hosted", "external"];
349
+ baseColumn: never;
350
+ identity: undefined;
351
+ generated: undefined;
352
+ }, {}, {}>;
353
+ assetBundleBase: drizzle_orm_pg_core.PgColumn<{
354
+ name: "asset_bundle_base";
355
+ tableName: "games";
356
+ dataType: "string";
357
+ columnType: "PgText";
358
+ data: string;
359
+ driverParam: string;
360
+ notNull: false;
361
+ hasDefault: false;
362
+ isPrimaryKey: false;
363
+ isAutoincrement: false;
364
+ hasRuntimeDefault: false;
365
+ enumValues: [string, ...string[]];
366
+ baseColumn: never;
367
+ identity: undefined;
368
+ generated: undefined;
369
+ }, {}, {}>;
370
+ externalUrl: drizzle_orm_pg_core.PgColumn<{
371
+ name: "external_url";
372
+ tableName: "games";
373
+ dataType: "string";
374
+ columnType: "PgText";
375
+ data: string;
376
+ driverParam: string;
377
+ notNull: false;
378
+ hasDefault: false;
379
+ isPrimaryKey: false;
380
+ isAutoincrement: false;
381
+ hasRuntimeDefault: false;
382
+ enumValues: [string, ...string[]];
383
+ baseColumn: never;
384
+ identity: undefined;
385
+ generated: undefined;
386
+ }, {}, {}>;
387
+ platform: drizzle_orm_pg_core.PgColumn<{
388
+ name: "platform";
389
+ tableName: "games";
390
+ dataType: "string";
391
+ columnType: "PgEnumColumn";
392
+ data: "web" | "godot" | "unity";
393
+ driverParam: string;
394
+ notNull: true;
395
+ hasDefault: true;
396
+ isPrimaryKey: false;
397
+ isAutoincrement: false;
398
+ hasRuntimeDefault: false;
399
+ enumValues: ["web", "godot", "unity"];
400
+ baseColumn: never;
401
+ identity: undefined;
402
+ generated: undefined;
403
+ }, {}, {}>;
404
+ mapElementId: drizzle_orm_pg_core.PgColumn<{
405
+ name: "map_element_id";
406
+ tableName: "games";
407
+ dataType: "string";
408
+ columnType: "PgUUID";
409
+ data: string;
410
+ driverParam: string;
411
+ notNull: false;
412
+ hasDefault: false;
413
+ isPrimaryKey: false;
414
+ isAutoincrement: false;
415
+ hasRuntimeDefault: false;
416
+ enumValues: undefined;
417
+ baseColumn: never;
418
+ identity: undefined;
419
+ generated: undefined;
420
+ }, {}, {}>;
421
+ metadata: drizzle_orm_pg_core.PgColumn<{
422
+ name: "metadata";
423
+ tableName: "games";
424
+ dataType: "json";
425
+ columnType: "PgJsonb";
426
+ data: GameMetadata;
427
+ driverParam: unknown;
428
+ notNull: true;
429
+ hasDefault: true;
430
+ isPrimaryKey: false;
431
+ isAutoincrement: false;
432
+ hasRuntimeDefault: false;
433
+ enumValues: undefined;
434
+ baseColumn: never;
435
+ identity: undefined;
436
+ generated: undefined;
437
+ }, {}, {
438
+ $type: GameMetadata;
439
+ }>;
440
+ createdAt: drizzle_orm_pg_core.PgColumn<{
441
+ name: "created_at";
442
+ tableName: "games";
443
+ dataType: "date";
444
+ columnType: "PgTimestamp";
445
+ data: Date;
446
+ driverParam: string;
447
+ notNull: false;
448
+ hasDefault: true;
449
+ isPrimaryKey: false;
450
+ isAutoincrement: false;
451
+ hasRuntimeDefault: false;
452
+ enumValues: undefined;
453
+ baseColumn: never;
454
+ identity: undefined;
455
+ generated: undefined;
456
+ }, {}, {}>;
457
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
458
+ name: "updated_at";
459
+ tableName: "games";
460
+ dataType: "date";
461
+ columnType: "PgTimestamp";
462
+ data: Date;
463
+ driverParam: string;
464
+ notNull: false;
465
+ hasDefault: true;
466
+ isPrimaryKey: false;
467
+ isAutoincrement: false;
468
+ hasRuntimeDefault: false;
469
+ enumValues: undefined;
470
+ baseColumn: never;
471
+ identity: undefined;
472
+ generated: undefined;
473
+ }, {}, {}>;
474
+ };
475
+ dialect: "pg";
476
+ }>;
477
+ declare const items: drizzle_orm_pg_core.PgTableWithColumns<{
478
+ name: "items";
479
+ schema: undefined;
480
+ columns: {
481
+ id: drizzle_orm_pg_core.PgColumn<{
482
+ name: "id";
483
+ tableName: "items";
484
+ dataType: "string";
485
+ columnType: "PgUUID";
486
+ data: string;
487
+ driverParam: string;
488
+ notNull: true;
489
+ hasDefault: true;
490
+ isPrimaryKey: true;
491
+ isAutoincrement: false;
492
+ hasRuntimeDefault: false;
493
+ enumValues: undefined;
494
+ baseColumn: never;
495
+ identity: undefined;
496
+ generated: undefined;
497
+ }, {}, {}>;
498
+ slug: drizzle_orm_pg_core.PgColumn<{
499
+ name: "slug";
500
+ tableName: "items";
501
+ dataType: "string";
502
+ columnType: "PgText";
503
+ data: string;
504
+ driverParam: string;
505
+ notNull: true;
506
+ hasDefault: false;
507
+ isPrimaryKey: false;
508
+ isAutoincrement: false;
509
+ hasRuntimeDefault: false;
510
+ enumValues: [string, ...string[]];
511
+ baseColumn: never;
512
+ identity: undefined;
513
+ generated: undefined;
514
+ }, {}, {}>;
515
+ gameId: drizzle_orm_pg_core.PgColumn<{
516
+ name: "game_id";
517
+ tableName: "items";
518
+ dataType: "string";
519
+ columnType: "PgUUID";
520
+ data: string;
521
+ driverParam: string;
522
+ notNull: false;
523
+ hasDefault: false;
524
+ isPrimaryKey: false;
525
+ isAutoincrement: false;
526
+ hasRuntimeDefault: false;
527
+ enumValues: undefined;
528
+ baseColumn: never;
529
+ identity: undefined;
530
+ generated: undefined;
531
+ }, {}, {}>;
532
+ displayName: drizzle_orm_pg_core.PgColumn<{
533
+ name: "display_name";
534
+ tableName: "items";
535
+ dataType: "string";
536
+ columnType: "PgText";
537
+ data: string;
538
+ driverParam: string;
539
+ notNull: true;
540
+ hasDefault: false;
541
+ isPrimaryKey: false;
542
+ isAutoincrement: false;
543
+ hasRuntimeDefault: false;
544
+ enumValues: [string, ...string[]];
545
+ baseColumn: never;
546
+ identity: undefined;
547
+ generated: undefined;
548
+ }, {}, {}>;
549
+ description: drizzle_orm_pg_core.PgColumn<{
550
+ name: "description";
551
+ tableName: "items";
552
+ dataType: "string";
553
+ columnType: "PgText";
554
+ data: string;
555
+ driverParam: string;
556
+ notNull: false;
557
+ hasDefault: false;
558
+ isPrimaryKey: false;
559
+ isAutoincrement: false;
560
+ hasRuntimeDefault: false;
561
+ enumValues: [string, ...string[]];
562
+ baseColumn: never;
563
+ identity: undefined;
564
+ generated: undefined;
565
+ }, {}, {}>;
566
+ type: drizzle_orm_pg_core.PgColumn<{
567
+ name: "type";
568
+ tableName: "items";
569
+ dataType: "string";
570
+ columnType: "PgEnumColumn";
571
+ data: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
572
+ driverParam: string;
573
+ notNull: true;
574
+ hasDefault: true;
575
+ isPrimaryKey: false;
576
+ isAutoincrement: false;
577
+ hasRuntimeDefault: false;
578
+ enumValues: ["currency", "badge", "trophy", "collectible", "consumable", "unlock", "upgrade", "accessory", "other"];
579
+ baseColumn: never;
580
+ identity: undefined;
581
+ generated: undefined;
582
+ }, {}, {}>;
583
+ isPlaceable: drizzle_orm_pg_core.PgColumn<{
584
+ name: "is_placeable";
585
+ tableName: "items";
586
+ dataType: "boolean";
587
+ columnType: "PgBoolean";
588
+ data: boolean;
589
+ driverParam: boolean;
590
+ notNull: true;
591
+ hasDefault: true;
592
+ isPrimaryKey: false;
593
+ isAutoincrement: false;
594
+ hasRuntimeDefault: false;
595
+ enumValues: undefined;
596
+ baseColumn: never;
597
+ identity: undefined;
598
+ generated: undefined;
599
+ }, {}, {}>;
600
+ imageUrl: drizzle_orm_pg_core.PgColumn<{
601
+ name: "image_url";
602
+ tableName: "items";
603
+ dataType: "string";
604
+ columnType: "PgText";
605
+ data: string;
606
+ driverParam: string;
607
+ notNull: false;
608
+ hasDefault: false;
609
+ isPrimaryKey: false;
610
+ isAutoincrement: false;
611
+ hasRuntimeDefault: false;
612
+ enumValues: [string, ...string[]];
613
+ baseColumn: never;
614
+ identity: undefined;
615
+ generated: undefined;
616
+ }, {}, {}>;
617
+ metadata: drizzle_orm_pg_core.PgColumn<{
618
+ name: "metadata";
619
+ tableName: "items";
620
+ dataType: "json";
621
+ columnType: "PgJsonb";
622
+ data: unknown;
623
+ driverParam: unknown;
624
+ notNull: false;
625
+ hasDefault: true;
626
+ isPrimaryKey: false;
627
+ isAutoincrement: false;
628
+ hasRuntimeDefault: false;
629
+ enumValues: undefined;
630
+ baseColumn: never;
631
+ identity: undefined;
632
+ generated: undefined;
633
+ }, {}, {}>;
634
+ createdAt: drizzle_orm_pg_core.PgColumn<{
635
+ name: "created_at";
636
+ tableName: "items";
637
+ dataType: "date";
638
+ columnType: "PgTimestamp";
639
+ data: Date;
640
+ driverParam: string;
641
+ notNull: true;
642
+ hasDefault: true;
643
+ isPrimaryKey: false;
644
+ isAutoincrement: false;
645
+ hasRuntimeDefault: false;
646
+ enumValues: undefined;
647
+ baseColumn: never;
648
+ identity: undefined;
649
+ generated: undefined;
650
+ }, {}, {}>;
651
+ };
652
+ dialect: "pg";
653
+ }>;
654
+ declare const inventoryItems: drizzle_orm_pg_core.PgTableWithColumns<{
655
+ name: "inventory_items";
656
+ schema: undefined;
657
+ columns: {
658
+ id: drizzle_orm_pg_core.PgColumn<{
659
+ name: "id";
660
+ tableName: "inventory_items";
661
+ dataType: "string";
662
+ columnType: "PgUUID";
663
+ data: string;
664
+ driverParam: string;
665
+ notNull: true;
666
+ hasDefault: true;
667
+ isPrimaryKey: true;
668
+ isAutoincrement: false;
669
+ hasRuntimeDefault: false;
670
+ enumValues: undefined;
671
+ baseColumn: never;
672
+ identity: undefined;
673
+ generated: undefined;
674
+ }, {}, {}>;
675
+ userId: drizzle_orm_pg_core.PgColumn<{
676
+ name: "user_id";
677
+ tableName: "inventory_items";
678
+ dataType: "string";
679
+ columnType: "PgText";
680
+ data: string;
681
+ driverParam: string;
682
+ notNull: true;
683
+ hasDefault: false;
684
+ isPrimaryKey: false;
685
+ isAutoincrement: false;
686
+ hasRuntimeDefault: false;
687
+ enumValues: [string, ...string[]];
688
+ baseColumn: never;
689
+ identity: undefined;
690
+ generated: undefined;
691
+ }, {}, {}>;
692
+ itemId: drizzle_orm_pg_core.PgColumn<{
693
+ name: "item_id";
694
+ tableName: "inventory_items";
695
+ dataType: "string";
696
+ columnType: "PgUUID";
697
+ data: string;
698
+ driverParam: string;
699
+ notNull: true;
700
+ hasDefault: false;
701
+ isPrimaryKey: false;
702
+ isAutoincrement: false;
703
+ hasRuntimeDefault: false;
704
+ enumValues: undefined;
705
+ baseColumn: never;
706
+ identity: undefined;
707
+ generated: undefined;
708
+ }, {}, {}>;
709
+ quantity: drizzle_orm_pg_core.PgColumn<{
710
+ name: "quantity";
711
+ tableName: "inventory_items";
712
+ dataType: "number";
713
+ columnType: "PgInteger";
714
+ data: number;
715
+ driverParam: string | number;
716
+ notNull: true;
717
+ hasDefault: true;
718
+ isPrimaryKey: false;
719
+ isAutoincrement: false;
720
+ hasRuntimeDefault: false;
721
+ enumValues: undefined;
722
+ baseColumn: never;
723
+ identity: undefined;
724
+ generated: undefined;
725
+ }, {}, {}>;
726
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
727
+ name: "updated_at";
728
+ tableName: "inventory_items";
729
+ dataType: "date";
730
+ columnType: "PgTimestamp";
731
+ data: Date;
732
+ driverParam: string;
733
+ notNull: false;
734
+ hasDefault: true;
735
+ isPrimaryKey: false;
736
+ isAutoincrement: false;
737
+ hasRuntimeDefault: false;
738
+ enumValues: undefined;
739
+ baseColumn: never;
740
+ identity: undefined;
741
+ generated: undefined;
742
+ }, {}, {}>;
743
+ };
744
+ dialect: "pg";
745
+ }>;
746
+ declare const shopListings: drizzle_orm_pg_core.PgTableWithColumns<{
747
+ name: "shop_listings";
748
+ schema: undefined;
749
+ columns: {
750
+ id: drizzle_orm_pg_core.PgColumn<{
751
+ name: "id";
752
+ tableName: "shop_listings";
753
+ dataType: "string";
754
+ columnType: "PgUUID";
755
+ data: string;
756
+ driverParam: string;
757
+ notNull: true;
758
+ hasDefault: true;
759
+ isPrimaryKey: true;
760
+ isAutoincrement: false;
761
+ hasRuntimeDefault: false;
762
+ enumValues: undefined;
763
+ baseColumn: never;
764
+ identity: undefined;
765
+ generated: undefined;
766
+ }, {}, {}>;
767
+ itemId: drizzle_orm_pg_core.PgColumn<{
768
+ name: "item_id";
769
+ tableName: "shop_listings";
770
+ dataType: "string";
771
+ columnType: "PgUUID";
772
+ data: string;
773
+ driverParam: string;
774
+ notNull: true;
775
+ hasDefault: false;
776
+ isPrimaryKey: false;
777
+ isAutoincrement: false;
778
+ hasRuntimeDefault: false;
779
+ enumValues: undefined;
780
+ baseColumn: never;
781
+ identity: undefined;
782
+ generated: undefined;
783
+ }, {}, {}>;
784
+ currencyId: drizzle_orm_pg_core.PgColumn<{
785
+ name: "currency_id";
786
+ tableName: "shop_listings";
787
+ dataType: "string";
788
+ columnType: "PgUUID";
789
+ data: string;
790
+ driverParam: string;
791
+ notNull: true;
792
+ hasDefault: false;
793
+ isPrimaryKey: false;
794
+ isAutoincrement: false;
795
+ hasRuntimeDefault: false;
796
+ enumValues: undefined;
797
+ baseColumn: never;
798
+ identity: undefined;
799
+ generated: undefined;
800
+ }, {}, {}>;
801
+ price: drizzle_orm_pg_core.PgColumn<{
802
+ name: "price";
803
+ tableName: "shop_listings";
804
+ dataType: "number";
805
+ columnType: "PgInteger";
806
+ data: number;
807
+ driverParam: string | number;
808
+ notNull: true;
809
+ hasDefault: false;
810
+ isPrimaryKey: false;
811
+ isAutoincrement: false;
812
+ hasRuntimeDefault: false;
813
+ enumValues: undefined;
814
+ baseColumn: never;
815
+ identity: undefined;
816
+ generated: undefined;
817
+ }, {}, {}>;
818
+ sellBackPercentage: drizzle_orm_pg_core.PgColumn<{
819
+ name: "sell_back_percentage";
820
+ tableName: "shop_listings";
821
+ dataType: "number";
822
+ columnType: "PgInteger";
823
+ data: number;
824
+ driverParam: string | number;
825
+ notNull: false;
826
+ hasDefault: false;
827
+ isPrimaryKey: false;
828
+ isAutoincrement: false;
829
+ hasRuntimeDefault: false;
830
+ enumValues: undefined;
831
+ baseColumn: never;
832
+ identity: undefined;
833
+ generated: undefined;
834
+ }, {}, {}>;
835
+ stock: drizzle_orm_pg_core.PgColumn<{
836
+ name: "stock";
837
+ tableName: "shop_listings";
838
+ dataType: "number";
839
+ columnType: "PgInteger";
840
+ data: number;
841
+ driverParam: string | number;
842
+ notNull: false;
843
+ hasDefault: false;
844
+ isPrimaryKey: false;
845
+ isAutoincrement: false;
846
+ hasRuntimeDefault: false;
847
+ enumValues: undefined;
848
+ baseColumn: never;
849
+ identity: undefined;
850
+ generated: undefined;
851
+ }, {}, {}>;
852
+ isActive: drizzle_orm_pg_core.PgColumn<{
853
+ name: "is_active";
854
+ tableName: "shop_listings";
855
+ dataType: "boolean";
856
+ columnType: "PgBoolean";
857
+ data: boolean;
858
+ driverParam: boolean;
859
+ notNull: true;
860
+ hasDefault: true;
861
+ isPrimaryKey: false;
862
+ isAutoincrement: false;
863
+ hasRuntimeDefault: false;
864
+ enumValues: undefined;
865
+ baseColumn: never;
866
+ identity: undefined;
867
+ generated: undefined;
868
+ }, {}, {}>;
869
+ availableFrom: drizzle_orm_pg_core.PgColumn<{
870
+ name: "available_from";
871
+ tableName: "shop_listings";
872
+ dataType: "date";
873
+ columnType: "PgTimestamp";
874
+ data: Date;
875
+ driverParam: string;
876
+ notNull: false;
877
+ hasDefault: false;
878
+ isPrimaryKey: false;
879
+ isAutoincrement: false;
880
+ hasRuntimeDefault: false;
881
+ enumValues: undefined;
882
+ baseColumn: never;
883
+ identity: undefined;
884
+ generated: undefined;
885
+ }, {}, {}>;
886
+ availableUntil: drizzle_orm_pg_core.PgColumn<{
887
+ name: "available_until";
888
+ tableName: "shop_listings";
889
+ dataType: "date";
890
+ columnType: "PgTimestamp";
891
+ data: Date;
892
+ driverParam: string;
893
+ notNull: false;
894
+ hasDefault: false;
895
+ isPrimaryKey: false;
896
+ isAutoincrement: false;
897
+ hasRuntimeDefault: false;
898
+ enumValues: undefined;
899
+ baseColumn: never;
900
+ identity: undefined;
901
+ generated: undefined;
902
+ }, {}, {}>;
903
+ createdAt: drizzle_orm_pg_core.PgColumn<{
904
+ name: "created_at";
905
+ tableName: "shop_listings";
906
+ dataType: "date";
907
+ columnType: "PgTimestamp";
908
+ data: Date;
909
+ driverParam: string;
910
+ notNull: true;
911
+ hasDefault: true;
912
+ isPrimaryKey: false;
913
+ isAutoincrement: false;
914
+ hasRuntimeDefault: false;
915
+ enumValues: undefined;
916
+ baseColumn: never;
917
+ identity: undefined;
918
+ generated: undefined;
919
+ }, {}, {}>;
920
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
921
+ name: "updated_at";
922
+ tableName: "shop_listings";
923
+ dataType: "date";
924
+ columnType: "PgTimestamp";
925
+ data: Date;
926
+ driverParam: string;
927
+ notNull: false;
928
+ hasDefault: true;
929
+ isPrimaryKey: false;
930
+ isAutoincrement: false;
931
+ hasRuntimeDefault: false;
932
+ enumValues: undefined;
933
+ baseColumn: never;
934
+ identity: undefined;
935
+ generated: undefined;
936
+ }, {}, {}>;
937
+ };
938
+ dialect: "pg";
939
+ }>;
940
+ declare const mapElements: drizzle_orm_pg_core.PgTableWithColumns<{
941
+ name: "map_elements";
942
+ schema: undefined;
943
+ columns: {
944
+ id: drizzle_orm_pg_core.PgColumn<{
945
+ name: "id";
946
+ tableName: "map_elements";
947
+ dataType: "string";
948
+ columnType: "PgUUID";
949
+ data: string;
950
+ driverParam: string;
951
+ notNull: true;
952
+ hasDefault: true;
953
+ isPrimaryKey: true;
954
+ isAutoincrement: false;
955
+ hasRuntimeDefault: false;
956
+ enumValues: undefined;
957
+ baseColumn: never;
958
+ identity: undefined;
959
+ generated: undefined;
960
+ }, {}, {}>;
961
+ mapId: drizzle_orm_pg_core.PgColumn<{
962
+ name: "map_id";
963
+ tableName: "map_elements";
964
+ dataType: "string";
965
+ columnType: "PgUUID";
966
+ data: string;
967
+ driverParam: string;
968
+ notNull: false;
969
+ hasDefault: false;
970
+ isPrimaryKey: false;
971
+ isAutoincrement: false;
972
+ hasRuntimeDefault: false;
973
+ enumValues: undefined;
974
+ baseColumn: never;
975
+ identity: undefined;
976
+ generated: undefined;
977
+ }, {}, {}>;
978
+ elementSlug: drizzle_orm_pg_core.PgColumn<{
979
+ name: "element_slug";
980
+ tableName: "map_elements";
981
+ dataType: "string";
982
+ columnType: "PgVarchar";
983
+ data: string;
984
+ driverParam: string;
985
+ notNull: true;
986
+ hasDefault: false;
987
+ isPrimaryKey: false;
988
+ isAutoincrement: false;
989
+ hasRuntimeDefault: false;
990
+ enumValues: [string, ...string[]];
991
+ baseColumn: never;
992
+ identity: undefined;
993
+ generated: undefined;
994
+ }, {}, {
995
+ length: 255;
996
+ }>;
997
+ interactionType: drizzle_orm_pg_core.PgColumn<{
998
+ name: "interaction_type";
999
+ tableName: "map_elements";
1000
+ dataType: "string";
1001
+ columnType: "PgEnumColumn";
1002
+ data: "game_entry" | "game_registry" | "info" | "teleport" | "door_in" | "door_out" | "npc_interaction" | "quest_trigger";
1003
+ driverParam: string;
1004
+ notNull: true;
1005
+ hasDefault: false;
1006
+ isPrimaryKey: false;
1007
+ isAutoincrement: false;
1008
+ hasRuntimeDefault: false;
1009
+ enumValues: ["game_entry", "game_registry", "info", "teleport", "door_in", "door_out", "npc_interaction", "quest_trigger"];
1010
+ baseColumn: never;
1011
+ identity: undefined;
1012
+ generated: undefined;
1013
+ }, {}, {}>;
1014
+ gameId: drizzle_orm_pg_core.PgColumn<{
1015
+ name: "game_id";
1016
+ tableName: "map_elements";
1017
+ dataType: "string";
1018
+ columnType: "PgUUID";
1019
+ data: string;
1020
+ driverParam: string;
1021
+ notNull: false;
1022
+ hasDefault: false;
1023
+ isPrimaryKey: false;
1024
+ isAutoincrement: false;
1025
+ hasRuntimeDefault: false;
1026
+ enumValues: undefined;
1027
+ baseColumn: never;
1028
+ identity: undefined;
1029
+ generated: undefined;
1030
+ }, {}, {}>;
1031
+ metadata: drizzle_orm_pg_core.PgColumn<{
1032
+ name: "metadata";
1033
+ tableName: "map_elements";
1034
+ dataType: "json";
1035
+ columnType: "PgJsonb";
1036
+ data: Record<string, unknown>;
1037
+ driverParam: unknown;
1038
+ notNull: false;
1039
+ hasDefault: true;
1040
+ isPrimaryKey: false;
1041
+ isAutoincrement: false;
1042
+ hasRuntimeDefault: false;
1043
+ enumValues: undefined;
1044
+ baseColumn: never;
1045
+ identity: undefined;
1046
+ generated: undefined;
1047
+ }, {}, {
1048
+ $type: Record<string, unknown>;
1049
+ }>;
1050
+ };
1051
+ dialect: "pg";
1052
+ }>;
1053
+ declare const mapObjects: drizzle_orm_pg_core.PgTableWithColumns<{
1054
+ name: "map_objects";
1055
+ schema: undefined;
1056
+ columns: {
1057
+ id: drizzle_orm_pg_core.PgColumn<{
1058
+ name: "id";
1059
+ tableName: "map_objects";
1060
+ dataType: "string";
1061
+ columnType: "PgUUID";
1062
+ data: string;
1063
+ driverParam: string;
1064
+ notNull: true;
1065
+ hasDefault: true;
1066
+ isPrimaryKey: true;
1067
+ isAutoincrement: false;
1068
+ hasRuntimeDefault: false;
1069
+ enumValues: undefined;
1070
+ baseColumn: never;
1071
+ identity: undefined;
1072
+ generated: undefined;
1073
+ }, {}, {}>;
1074
+ userId: drizzle_orm_pg_core.PgColumn<{
1075
+ name: "user_id";
1076
+ tableName: "map_objects";
1077
+ dataType: "string";
1078
+ columnType: "PgText";
1079
+ data: string;
1080
+ driverParam: string;
1081
+ notNull: true;
1082
+ hasDefault: false;
1083
+ isPrimaryKey: false;
1084
+ isAutoincrement: false;
1085
+ hasRuntimeDefault: false;
1086
+ enumValues: [string, ...string[]];
1087
+ baseColumn: never;
1088
+ identity: undefined;
1089
+ generated: undefined;
1090
+ }, {}, {}>;
1091
+ mapId: drizzle_orm_pg_core.PgColumn<{
1092
+ name: "map_id";
1093
+ tableName: "map_objects";
1094
+ dataType: "string";
1095
+ columnType: "PgUUID";
1096
+ data: string;
1097
+ driverParam: string;
1098
+ notNull: true;
1099
+ hasDefault: false;
1100
+ isPrimaryKey: false;
1101
+ isAutoincrement: false;
1102
+ hasRuntimeDefault: false;
1103
+ enumValues: undefined;
1104
+ baseColumn: never;
1105
+ identity: undefined;
1106
+ generated: undefined;
1107
+ }, {}, {}>;
1108
+ itemId: drizzle_orm_pg_core.PgColumn<{
1109
+ name: "item_id";
1110
+ tableName: "map_objects";
1111
+ dataType: "string";
1112
+ columnType: "PgUUID";
1113
+ data: string;
1114
+ driverParam: string;
1115
+ notNull: true;
1116
+ hasDefault: false;
1117
+ isPrimaryKey: false;
1118
+ isAutoincrement: false;
1119
+ hasRuntimeDefault: false;
1120
+ enumValues: undefined;
1121
+ baseColumn: never;
1122
+ identity: undefined;
1123
+ generated: undefined;
1124
+ }, {}, {}>;
1125
+ worldX: drizzle_orm_pg_core.PgColumn<{
1126
+ name: "world_x";
1127
+ tableName: "map_objects";
1128
+ dataType: "number";
1129
+ columnType: "PgDoublePrecision";
1130
+ data: number;
1131
+ driverParam: string | number;
1132
+ notNull: true;
1133
+ hasDefault: false;
1134
+ isPrimaryKey: false;
1135
+ isAutoincrement: false;
1136
+ hasRuntimeDefault: false;
1137
+ enumValues: undefined;
1138
+ baseColumn: never;
1139
+ identity: undefined;
1140
+ generated: undefined;
1141
+ }, {}, {}>;
1142
+ worldY: drizzle_orm_pg_core.PgColumn<{
1143
+ name: "world_y";
1144
+ tableName: "map_objects";
1145
+ dataType: "number";
1146
+ columnType: "PgDoublePrecision";
1147
+ data: number;
1148
+ driverParam: string | number;
1149
+ notNull: true;
1150
+ hasDefault: false;
1151
+ isPrimaryKey: false;
1152
+ isAutoincrement: false;
1153
+ hasRuntimeDefault: false;
1154
+ enumValues: undefined;
1155
+ baseColumn: never;
1156
+ identity: undefined;
1157
+ generated: undefined;
1158
+ }, {}, {}>;
1159
+ rotation: drizzle_orm_pg_core.PgColumn<{
1160
+ name: "rotation";
1161
+ tableName: "map_objects";
1162
+ dataType: "number";
1163
+ columnType: "PgInteger";
1164
+ data: number;
1165
+ driverParam: string | number;
1166
+ notNull: true;
1167
+ hasDefault: true;
1168
+ isPrimaryKey: false;
1169
+ isAutoincrement: false;
1170
+ hasRuntimeDefault: false;
1171
+ enumValues: undefined;
1172
+ baseColumn: never;
1173
+ identity: undefined;
1174
+ generated: undefined;
1175
+ }, {}, {}>;
1176
+ scale: drizzle_orm_pg_core.PgColumn<{
1177
+ name: "scale";
1178
+ tableName: "map_objects";
1179
+ dataType: "number";
1180
+ columnType: "PgDoublePrecision";
1181
+ data: number;
1182
+ driverParam: string | number;
1183
+ notNull: true;
1184
+ hasDefault: true;
1185
+ isPrimaryKey: false;
1186
+ isAutoincrement: false;
1187
+ hasRuntimeDefault: false;
1188
+ enumValues: undefined;
1189
+ baseColumn: never;
1190
+ identity: undefined;
1191
+ generated: undefined;
1192
+ }, {}, {}>;
1193
+ createdAt: drizzle_orm_pg_core.PgColumn<{
1194
+ name: "created_at";
1195
+ tableName: "map_objects";
1196
+ dataType: "date";
1197
+ columnType: "PgTimestamp";
1198
+ data: Date;
1199
+ driverParam: string;
1200
+ notNull: true;
1201
+ hasDefault: true;
1202
+ isPrimaryKey: false;
1203
+ isAutoincrement: false;
1204
+ hasRuntimeDefault: false;
1205
+ enumValues: undefined;
1206
+ baseColumn: never;
1207
+ identity: undefined;
1208
+ generated: undefined;
1209
+ }, {}, {}>;
1210
+ };
1211
+ dialect: "pg";
1212
+ }>;
1213
+
1214
+ declare const userLevels: drizzle_orm_pg_core.PgTableWithColumns<{
1215
+ name: "user_levels";
1216
+ schema: undefined;
1217
+ columns: {
1218
+ userId: drizzle_orm_pg_core.PgColumn<{
1219
+ name: "user_id";
1220
+ tableName: "user_levels";
1221
+ dataType: "string";
1222
+ columnType: "PgText";
1223
+ data: string;
1224
+ driverParam: string;
1225
+ notNull: true;
1226
+ hasDefault: false;
1227
+ isPrimaryKey: true;
1228
+ isAutoincrement: false;
1229
+ hasRuntimeDefault: false;
1230
+ enumValues: [string, ...string[]];
1231
+ baseColumn: never;
1232
+ identity: undefined;
1233
+ generated: undefined;
1234
+ }, {}, {}>;
1235
+ currentLevel: drizzle_orm_pg_core.PgColumn<{
1236
+ name: "current_level";
1237
+ tableName: "user_levels";
1238
+ dataType: "number";
1239
+ columnType: "PgInteger";
1240
+ data: number;
1241
+ driverParam: string | number;
1242
+ notNull: true;
1243
+ hasDefault: true;
1244
+ isPrimaryKey: false;
1245
+ isAutoincrement: false;
1246
+ hasRuntimeDefault: false;
1247
+ enumValues: undefined;
1248
+ baseColumn: never;
1249
+ identity: undefined;
1250
+ generated: undefined;
1251
+ }, {}, {}>;
1252
+ currentXp: drizzle_orm_pg_core.PgColumn<{
1253
+ name: "current_xp";
1254
+ tableName: "user_levels";
1255
+ dataType: "number";
1256
+ columnType: "PgDoublePrecision";
1257
+ data: number;
1258
+ driverParam: string | number;
1259
+ notNull: true;
1260
+ hasDefault: true;
1261
+ isPrimaryKey: false;
1262
+ isAutoincrement: false;
1263
+ hasRuntimeDefault: false;
1264
+ enumValues: undefined;
1265
+ baseColumn: never;
1266
+ identity: undefined;
1267
+ generated: undefined;
1268
+ }, {}, {}>;
1269
+ totalXP: drizzle_orm_pg_core.PgColumn<{
1270
+ name: "total_xp";
1271
+ tableName: "user_levels";
1272
+ dataType: "number";
1273
+ columnType: "PgDoublePrecision";
1274
+ data: number;
1275
+ driverParam: string | number;
1276
+ notNull: true;
1277
+ hasDefault: true;
1278
+ isPrimaryKey: false;
1279
+ isAutoincrement: false;
1280
+ hasRuntimeDefault: false;
1281
+ enumValues: undefined;
1282
+ baseColumn: never;
1283
+ identity: undefined;
1284
+ generated: undefined;
1285
+ }, {}, {}>;
1286
+ lastLevelUpAt: drizzle_orm_pg_core.PgColumn<{
1287
+ name: "last_level_up_at";
1288
+ tableName: "user_levels";
1289
+ dataType: "date";
1290
+ columnType: "PgTimestamp";
1291
+ data: Date;
1292
+ driverParam: string;
1293
+ notNull: false;
1294
+ hasDefault: false;
1295
+ isPrimaryKey: false;
1296
+ isAutoincrement: false;
1297
+ hasRuntimeDefault: false;
1298
+ enumValues: undefined;
1299
+ baseColumn: never;
1300
+ identity: undefined;
1301
+ generated: undefined;
1302
+ }, {}, {}>;
1303
+ createdAt: drizzle_orm_pg_core.PgColumn<{
1304
+ name: "created_at";
1305
+ tableName: "user_levels";
1306
+ dataType: "date";
1307
+ columnType: "PgTimestamp";
1308
+ data: Date;
1309
+ driverParam: string;
1310
+ notNull: true;
1311
+ hasDefault: true;
1312
+ isPrimaryKey: false;
1313
+ isAutoincrement: false;
1314
+ hasRuntimeDefault: false;
1315
+ enumValues: undefined;
1316
+ baseColumn: never;
1317
+ identity: undefined;
1318
+ generated: undefined;
1319
+ }, {}, {}>;
1320
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
1321
+ name: "updated_at";
1322
+ tableName: "user_levels";
1323
+ dataType: "date";
1324
+ columnType: "PgTimestamp";
1325
+ data: Date;
1326
+ driverParam: string;
1327
+ notNull: false;
1328
+ hasDefault: true;
1329
+ isPrimaryKey: false;
1330
+ isAutoincrement: false;
1331
+ hasRuntimeDefault: false;
1332
+ enumValues: undefined;
1333
+ baseColumn: never;
1334
+ identity: undefined;
1335
+ generated: undefined;
1336
+ }, {}, {}>;
1337
+ };
1338
+ dialect: "pg";
1339
+ }>;
1340
+ declare const levelConfigs: drizzle_orm_pg_core.PgTableWithColumns<{
1341
+ name: "level_configs";
1342
+ schema: undefined;
1343
+ columns: {
1344
+ id: drizzle_orm_pg_core.PgColumn<{
1345
+ name: "id";
1346
+ tableName: "level_configs";
1347
+ dataType: "string";
1348
+ columnType: "PgUUID";
1349
+ data: string;
1350
+ driverParam: string;
1351
+ notNull: true;
1352
+ hasDefault: true;
1353
+ isPrimaryKey: true;
1354
+ isAutoincrement: false;
1355
+ hasRuntimeDefault: false;
1356
+ enumValues: undefined;
1357
+ baseColumn: never;
1358
+ identity: undefined;
1359
+ generated: undefined;
1360
+ }, {}, {}>;
1361
+ level: drizzle_orm_pg_core.PgColumn<{
1362
+ name: "level";
1363
+ tableName: "level_configs";
1364
+ dataType: "number";
1365
+ columnType: "PgInteger";
1366
+ data: number;
1367
+ driverParam: string | number;
1368
+ notNull: true;
1369
+ hasDefault: false;
1370
+ isPrimaryKey: false;
1371
+ isAutoincrement: false;
1372
+ hasRuntimeDefault: false;
1373
+ enumValues: undefined;
1374
+ baseColumn: never;
1375
+ identity: undefined;
1376
+ generated: undefined;
1377
+ }, {}, {}>;
1378
+ xpRequired: drizzle_orm_pg_core.PgColumn<{
1379
+ name: "xp_required";
1380
+ tableName: "level_configs";
1381
+ dataType: "number";
1382
+ columnType: "PgInteger";
1383
+ data: number;
1384
+ driverParam: string | number;
1385
+ notNull: true;
1386
+ hasDefault: false;
1387
+ isPrimaryKey: false;
1388
+ isAutoincrement: false;
1389
+ hasRuntimeDefault: false;
1390
+ enumValues: undefined;
1391
+ baseColumn: never;
1392
+ identity: undefined;
1393
+ generated: undefined;
1394
+ }, {}, {}>;
1395
+ creditsReward: drizzle_orm_pg_core.PgColumn<{
1396
+ name: "credits_reward";
1397
+ tableName: "level_configs";
1398
+ dataType: "number";
1399
+ columnType: "PgInteger";
1400
+ data: number;
1401
+ driverParam: string | number;
1402
+ notNull: true;
1403
+ hasDefault: true;
1404
+ isPrimaryKey: false;
1405
+ isAutoincrement: false;
1406
+ hasRuntimeDefault: false;
1407
+ enumValues: undefined;
1408
+ baseColumn: never;
1409
+ identity: undefined;
1410
+ generated: undefined;
1411
+ }, {}, {}>;
1412
+ createdAt: drizzle_orm_pg_core.PgColumn<{
1413
+ name: "created_at";
1414
+ tableName: "level_configs";
1415
+ dataType: "date";
1416
+ columnType: "PgTimestamp";
1417
+ data: Date;
1418
+ driverParam: string;
1419
+ notNull: true;
1420
+ hasDefault: true;
1421
+ isPrimaryKey: false;
1422
+ isAutoincrement: false;
1423
+ hasRuntimeDefault: false;
1424
+ enumValues: undefined;
1425
+ baseColumn: never;
1426
+ identity: undefined;
1427
+ generated: undefined;
1428
+ }, {}, {}>;
1429
+ };
1430
+ dialect: "pg";
1431
+ }>;
1432
+ declare const characterComponents: drizzle_orm_pg_core.PgTableWithColumns<{
1433
+ name: "character_components";
1434
+ schema: undefined;
1435
+ columns: {
1436
+ id: drizzle_orm_pg_core.PgColumn<{
1437
+ name: "id";
1438
+ tableName: "character_components";
1439
+ dataType: "string";
1440
+ columnType: "PgUUID";
1441
+ data: string;
1442
+ driverParam: string;
1443
+ notNull: true;
1444
+ hasDefault: true;
1445
+ isPrimaryKey: true;
1446
+ isAutoincrement: false;
1447
+ hasRuntimeDefault: false;
1448
+ enumValues: undefined;
1449
+ baseColumn: never;
1450
+ identity: undefined;
1451
+ generated: undefined;
1452
+ }, {}, {}>;
1453
+ componentType: drizzle_orm_pg_core.PgColumn<{
1454
+ name: "component_type";
1455
+ tableName: "character_components";
1456
+ dataType: "string";
1457
+ columnType: "PgEnumColumn";
1458
+ data: "accessory" | "body" | "outfit" | "hairstyle" | "eyes";
1459
+ driverParam: string;
1460
+ notNull: true;
1461
+ hasDefault: false;
1462
+ isPrimaryKey: false;
1463
+ isAutoincrement: false;
1464
+ hasRuntimeDefault: false;
1465
+ enumValues: ["body", "outfit", "hairstyle", "eyes", "accessory"];
1466
+ baseColumn: never;
1467
+ identity: undefined;
1468
+ generated: undefined;
1469
+ }, {}, {}>;
1470
+ slug: drizzle_orm_pg_core.PgColumn<{
1471
+ name: "slug";
1472
+ tableName: "character_components";
1473
+ dataType: "string";
1474
+ columnType: "PgVarchar";
1475
+ data: string;
1476
+ driverParam: string;
1477
+ notNull: true;
1478
+ hasDefault: false;
1479
+ isPrimaryKey: false;
1480
+ isAutoincrement: false;
1481
+ hasRuntimeDefault: false;
1482
+ enumValues: [string, ...string[]];
1483
+ baseColumn: never;
1484
+ identity: undefined;
1485
+ generated: undefined;
1486
+ }, {}, {
1487
+ length: 128;
1488
+ }>;
1489
+ displayName: drizzle_orm_pg_core.PgColumn<{
1490
+ name: "display_name";
1491
+ tableName: "character_components";
1492
+ dataType: "string";
1493
+ columnType: "PgVarchar";
1494
+ data: string;
1495
+ driverParam: string;
1496
+ notNull: true;
1497
+ hasDefault: false;
1498
+ isPrimaryKey: false;
1499
+ isAutoincrement: false;
1500
+ hasRuntimeDefault: false;
1501
+ enumValues: [string, ...string[]];
1502
+ baseColumn: never;
1503
+ identity: undefined;
1504
+ generated: undefined;
1505
+ }, {}, {
1506
+ length: 128;
1507
+ }>;
1508
+ slot: drizzle_orm_pg_core.PgColumn<{
1509
+ name: "slot";
1510
+ tableName: "character_components";
1511
+ dataType: "string";
1512
+ columnType: "PgVarchar";
1513
+ data: string;
1514
+ driverParam: string;
1515
+ notNull: true;
1516
+ hasDefault: false;
1517
+ isPrimaryKey: false;
1518
+ isAutoincrement: false;
1519
+ hasRuntimeDefault: false;
1520
+ enumValues: [string, ...string[]];
1521
+ baseColumn: never;
1522
+ identity: undefined;
1523
+ generated: undefined;
1524
+ }, {}, {
1525
+ length: 64;
1526
+ }>;
1527
+ spriteSheetId: drizzle_orm_pg_core.PgColumn<{
1528
+ name: "sprite_sheet_id";
1529
+ tableName: "character_components";
1530
+ dataType: "string";
1531
+ columnType: "PgUUID";
1532
+ data: string;
1533
+ driverParam: string;
1534
+ notNull: true;
1535
+ hasDefault: false;
1536
+ isPrimaryKey: false;
1537
+ isAutoincrement: false;
1538
+ hasRuntimeDefault: false;
1539
+ enumValues: undefined;
1540
+ baseColumn: never;
1541
+ identity: undefined;
1542
+ generated: undefined;
1543
+ }, {}, {}>;
1544
+ unlockLevel: drizzle_orm_pg_core.PgColumn<{
1545
+ name: "unlock_level";
1546
+ tableName: "character_components";
1547
+ dataType: "number";
1548
+ columnType: "PgInteger";
1549
+ data: number;
1550
+ driverParam: string | number;
1551
+ notNull: true;
1552
+ hasDefault: true;
1553
+ isPrimaryKey: false;
1554
+ isAutoincrement: false;
1555
+ hasRuntimeDefault: false;
1556
+ enumValues: undefined;
1557
+ baseColumn: never;
1558
+ identity: undefined;
1559
+ generated: undefined;
1560
+ }, {}, {}>;
1561
+ variant: drizzle_orm_pg_core.PgColumn<{
1562
+ name: "variant";
1563
+ tableName: "character_components";
1564
+ dataType: "number";
1565
+ columnType: "PgInteger";
1566
+ data: number;
1567
+ driverParam: string | number;
1568
+ notNull: true;
1569
+ hasDefault: true;
1570
+ isPrimaryKey: false;
1571
+ isAutoincrement: false;
1572
+ hasRuntimeDefault: false;
1573
+ enumValues: undefined;
1574
+ baseColumn: never;
1575
+ identity: undefined;
1576
+ generated: undefined;
1577
+ }, {}, {}>;
1578
+ createdAt: drizzle_orm_pg_core.PgColumn<{
1579
+ name: "created_at";
1580
+ tableName: "character_components";
1581
+ dataType: "date";
1582
+ columnType: "PgTimestamp";
1583
+ data: Date;
1584
+ driverParam: string;
1585
+ notNull: true;
1586
+ hasDefault: true;
1587
+ isPrimaryKey: false;
1588
+ isAutoincrement: false;
1589
+ hasRuntimeDefault: false;
1590
+ enumValues: undefined;
1591
+ baseColumn: never;
1592
+ identity: undefined;
1593
+ generated: undefined;
1594
+ }, {}, {}>;
1595
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
1596
+ name: "updated_at";
1597
+ tableName: "character_components";
1598
+ dataType: "date";
1599
+ columnType: "PgTimestamp";
1600
+ data: Date;
1601
+ driverParam: string;
1602
+ notNull: true;
1603
+ hasDefault: true;
1604
+ isPrimaryKey: false;
1605
+ isAutoincrement: false;
1606
+ hasRuntimeDefault: false;
1607
+ enumValues: undefined;
1608
+ baseColumn: never;
1609
+ identity: undefined;
1610
+ generated: undefined;
1611
+ }, {}, {}>;
1612
+ };
1613
+ dialect: "pg";
1614
+ }>;
1615
+ declare const playerCharacters: drizzle_orm_pg_core.PgTableWithColumns<{
1616
+ name: "player_characters";
1617
+ schema: undefined;
1618
+ columns: {
1619
+ id: drizzle_orm_pg_core.PgColumn<{
1620
+ name: "id";
1621
+ tableName: "player_characters";
1622
+ dataType: "string";
1623
+ columnType: "PgUUID";
1624
+ data: string;
1625
+ driverParam: string;
1626
+ notNull: true;
1627
+ hasDefault: true;
1628
+ isPrimaryKey: true;
1629
+ isAutoincrement: false;
1630
+ hasRuntimeDefault: false;
1631
+ enumValues: undefined;
1632
+ baseColumn: never;
1633
+ identity: undefined;
1634
+ generated: undefined;
1635
+ }, {}, {}>;
1636
+ userId: drizzle_orm_pg_core.PgColumn<{
1637
+ name: "user_id";
1638
+ tableName: "player_characters";
1639
+ dataType: "string";
1640
+ columnType: "PgText";
1641
+ data: string;
1642
+ driverParam: string;
1643
+ notNull: true;
1644
+ hasDefault: false;
1645
+ isPrimaryKey: false;
1646
+ isAutoincrement: false;
1647
+ hasRuntimeDefault: false;
1648
+ enumValues: [string, ...string[]];
1649
+ baseColumn: never;
1650
+ identity: undefined;
1651
+ generated: undefined;
1652
+ }, {}, {}>;
1653
+ bodyComponentId: drizzle_orm_pg_core.PgColumn<{
1654
+ name: "body_component_id";
1655
+ tableName: "player_characters";
1656
+ dataType: "string";
1657
+ columnType: "PgUUID";
1658
+ data: string;
1659
+ driverParam: string;
1660
+ notNull: true;
1661
+ hasDefault: false;
1662
+ isPrimaryKey: false;
1663
+ isAutoincrement: false;
1664
+ hasRuntimeDefault: false;
1665
+ enumValues: undefined;
1666
+ baseColumn: never;
1667
+ identity: undefined;
1668
+ generated: undefined;
1669
+ }, {}, {}>;
1670
+ eyesComponentId: drizzle_orm_pg_core.PgColumn<{
1671
+ name: "eyes_component_id";
1672
+ tableName: "player_characters";
1673
+ dataType: "string";
1674
+ columnType: "PgUUID";
1675
+ data: string;
1676
+ driverParam: string;
1677
+ notNull: true;
1678
+ hasDefault: false;
1679
+ isPrimaryKey: false;
1680
+ isAutoincrement: false;
1681
+ hasRuntimeDefault: false;
1682
+ enumValues: undefined;
1683
+ baseColumn: never;
1684
+ identity: undefined;
1685
+ generated: undefined;
1686
+ }, {}, {}>;
1687
+ hairstyleComponentId: drizzle_orm_pg_core.PgColumn<{
1688
+ name: "hairstyle_component_id";
1689
+ tableName: "player_characters";
1690
+ dataType: "string";
1691
+ columnType: "PgUUID";
1692
+ data: string;
1693
+ driverParam: string;
1694
+ notNull: true;
1695
+ hasDefault: false;
1696
+ isPrimaryKey: false;
1697
+ isAutoincrement: false;
1698
+ hasRuntimeDefault: false;
1699
+ enumValues: undefined;
1700
+ baseColumn: never;
1701
+ identity: undefined;
1702
+ generated: undefined;
1703
+ }, {}, {}>;
1704
+ outfitComponentId: drizzle_orm_pg_core.PgColumn<{
1705
+ name: "outfit_component_id";
1706
+ tableName: "player_characters";
1707
+ dataType: "string";
1708
+ columnType: "PgUUID";
1709
+ data: string;
1710
+ driverParam: string;
1711
+ notNull: true;
1712
+ hasDefault: false;
1713
+ isPrimaryKey: false;
1714
+ isAutoincrement: false;
1715
+ hasRuntimeDefault: false;
1716
+ enumValues: undefined;
1717
+ baseColumn: never;
1718
+ identity: undefined;
1719
+ generated: undefined;
1720
+ }, {}, {}>;
1721
+ createdAt: drizzle_orm_pg_core.PgColumn<{
1722
+ name: "created_at";
1723
+ tableName: "player_characters";
1724
+ dataType: "date";
1725
+ columnType: "PgTimestamp";
1726
+ data: Date;
1727
+ driverParam: string;
1728
+ notNull: true;
1729
+ hasDefault: true;
1730
+ isPrimaryKey: false;
1731
+ isAutoincrement: false;
1732
+ hasRuntimeDefault: false;
1733
+ enumValues: undefined;
1734
+ baseColumn: never;
1735
+ identity: undefined;
1736
+ generated: undefined;
1737
+ }, {}, {}>;
1738
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
1739
+ name: "updated_at";
1740
+ tableName: "player_characters";
1741
+ dataType: "date";
1742
+ columnType: "PgTimestamp";
1743
+ data: Date;
1744
+ driverParam: string;
1745
+ notNull: true;
1746
+ hasDefault: true;
1747
+ isPrimaryKey: false;
1748
+ isAutoincrement: false;
1749
+ hasRuntimeDefault: false;
1750
+ enumValues: undefined;
1751
+ baseColumn: never;
1752
+ identity: undefined;
1753
+ generated: undefined;
1754
+ }, {}, {}>;
1755
+ };
1756
+ dialect: "pg";
1757
+ }>;
1758
+ declare const playerCharacterAccessories: drizzle_orm_pg_core.PgTableWithColumns<{
1759
+ name: "player_character_accessories";
1760
+ schema: undefined;
1761
+ columns: {
1762
+ id: drizzle_orm_pg_core.PgColumn<{
1763
+ name: "id";
1764
+ tableName: "player_character_accessories";
1765
+ dataType: "string";
1766
+ columnType: "PgUUID";
1767
+ data: string;
1768
+ driverParam: string;
1769
+ notNull: true;
1770
+ hasDefault: true;
1771
+ isPrimaryKey: true;
1772
+ isAutoincrement: false;
1773
+ hasRuntimeDefault: false;
1774
+ enumValues: undefined;
1775
+ baseColumn: never;
1776
+ identity: undefined;
1777
+ generated: undefined;
1778
+ }, {}, {}>;
1779
+ playerCharacterId: drizzle_orm_pg_core.PgColumn<{
1780
+ name: "player_character_id";
1781
+ tableName: "player_character_accessories";
1782
+ dataType: "string";
1783
+ columnType: "PgUUID";
1784
+ data: string;
1785
+ driverParam: string;
1786
+ notNull: true;
1787
+ hasDefault: false;
1788
+ isPrimaryKey: false;
1789
+ isAutoincrement: false;
1790
+ hasRuntimeDefault: false;
1791
+ enumValues: undefined;
1792
+ baseColumn: never;
1793
+ identity: undefined;
1794
+ generated: undefined;
1795
+ }, {}, {}>;
1796
+ accessoryComponentId: drizzle_orm_pg_core.PgColumn<{
1797
+ name: "accessory_component_id";
1798
+ tableName: "player_character_accessories";
1799
+ dataType: "string";
1800
+ columnType: "PgUUID";
1801
+ data: string;
1802
+ driverParam: string;
1803
+ notNull: true;
1804
+ hasDefault: false;
1805
+ isPrimaryKey: false;
1806
+ isAutoincrement: false;
1807
+ hasRuntimeDefault: false;
1808
+ enumValues: undefined;
1809
+ baseColumn: never;
1810
+ identity: undefined;
1811
+ generated: undefined;
1812
+ }, {}, {}>;
1813
+ slot: drizzle_orm_pg_core.PgColumn<{
1814
+ name: "slot";
1815
+ tableName: "player_character_accessories";
1816
+ dataType: "string";
1817
+ columnType: "PgVarchar";
1818
+ data: string;
1819
+ driverParam: string;
1820
+ notNull: true;
1821
+ hasDefault: false;
1822
+ isPrimaryKey: false;
1823
+ isAutoincrement: false;
1824
+ hasRuntimeDefault: false;
1825
+ enumValues: [string, ...string[]];
1826
+ baseColumn: never;
1827
+ identity: undefined;
1828
+ generated: undefined;
1829
+ }, {}, {
1830
+ length: 64;
1831
+ }>;
1832
+ equippedAt: drizzle_orm_pg_core.PgColumn<{
1833
+ name: "equipped_at";
1834
+ tableName: "player_character_accessories";
1835
+ dataType: "date";
1836
+ columnType: "PgTimestamp";
1837
+ data: Date;
1838
+ driverParam: string;
1839
+ notNull: true;
1840
+ hasDefault: true;
1841
+ isPrimaryKey: false;
1842
+ isAutoincrement: false;
1843
+ hasRuntimeDefault: false;
1844
+ enumValues: undefined;
1845
+ baseColumn: never;
1846
+ identity: undefined;
1847
+ generated: undefined;
1848
+ }, {}, {}>;
1849
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
1850
+ name: "updated_at";
1851
+ tableName: "player_character_accessories";
1852
+ dataType: "date";
1853
+ columnType: "PgTimestamp";
1854
+ data: Date;
1855
+ driverParam: string;
1856
+ notNull: true;
1857
+ hasDefault: true;
1858
+ isPrimaryKey: false;
1859
+ isAutoincrement: false;
1860
+ hasRuntimeDefault: false;
1861
+ enumValues: undefined;
1862
+ baseColumn: never;
1863
+ identity: undefined;
1864
+ generated: undefined;
1865
+ }, {}, {}>;
1866
+ };
1867
+ dialect: "pg";
1868
+ }>;
1869
+
1870
+ declare const achievementIntervalEnum: drizzle_orm_pg_core.PgEnum<["daily", "weekly"]>;
1871
+ declare const DeveloperStatusResponseSchema: z.ZodObject<{
1872
+ status: z.ZodEnum<["none", "pending", "approved"]>;
1873
+ }, "strip", z.ZodTypeAny, {
1874
+ status: "none" | "pending" | "approved";
1875
+ }, {
1876
+ status: "none" | "pending" | "approved";
1877
+ }>;
1878
+ declare const UpsertGameMetadataSchema: z.ZodEffects<z.ZodObject<{
1879
+ displayName: z.ZodString;
1880
+ mapElementId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
1881
+ platform: z.ZodEnum<["web", "godot", "unity"]>;
1882
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
1883
+ gameType: z.ZodDefault<z.ZodOptional<z.ZodEnum<["hosted", "external"]>>>;
1884
+ externalUrl: z.ZodOptional<z.ZodString>;
1885
+ }, "strip", z.ZodTypeAny, {
1886
+ displayName: string;
1887
+ gameType: "hosted" | "external";
1888
+ platform: "web" | "godot" | "unity";
1889
+ metadata: Record<string, unknown>;
1890
+ externalUrl?: string | undefined;
1891
+ mapElementId?: string | null | undefined;
1892
+ }, {
1893
+ displayName: string;
1894
+ platform: "web" | "godot" | "unity";
1895
+ gameType?: "hosted" | "external" | undefined;
1896
+ externalUrl?: string | undefined;
1897
+ mapElementId?: string | null | undefined;
1898
+ metadata?: Record<string, unknown> | undefined;
1899
+ }>, {
1900
+ displayName: string;
1901
+ gameType: "hosted" | "external";
1902
+ platform: "web" | "godot" | "unity";
1903
+ metadata: Record<string, unknown>;
1904
+ externalUrl?: string | undefined;
1905
+ mapElementId?: string | null | undefined;
1906
+ }, {
1907
+ displayName: string;
1908
+ platform: "web" | "godot" | "unity";
1909
+ gameType?: "hosted" | "external" | undefined;
1910
+ externalUrl?: string | undefined;
1911
+ mapElementId?: string | null | undefined;
1912
+ metadata?: Record<string, unknown> | undefined;
1913
+ }>;
1914
+ declare const ManifestV1Schema: z.ZodObject<{
1915
+ version: z.ZodString;
1916
+ bootMode: z.ZodEnum<["iframe", "module"]>;
1917
+ entryPoint: z.ZodEffects<z.ZodString, string, string>;
1918
+ /**
1919
+ * An array of relative paths to CSS stylesheets.
1920
+ * Currently, this property is ONLY utilized by the 'module' boot mode
1921
+ * (`apps/cademy/src/lib/loader/boot-module.ts`) to load external
1922
+ * stylesheets into the game's shadow DOM.
1923
+ *
1924
+ * This property is under review for potential deprecation and removal.
1925
+ * The 'module' boot mode itself has not yet seen significant adoption
1926
+ * or clear use-cases, and if support for module loading is removed in
1927
+ * the future, this 'styles' property would become obsolete.
1928
+ *
1929
+ * If module-based games need styling, alternative approaches might involve
1930
+ * bundling CSS within their JavaScript or managing style injection internally.
1931
+ */
1932
+ styles: z.ZodEffects<z.ZodOptional<z.ZodArray<z.ZodString, "many">>, string[] | undefined, string[] | undefined>;
1933
+ /**
1934
+ * Specifies the game or development platform.
1935
+ * Current values include 'web', 'godot', and 'unity'.
1936
+ * The default in the database is 'web'.
1937
+ *
1938
+ * IMPORTANT: This property is NOT CURRENTLY USED by the core loader
1939
+ * or runtime systems in any functional way. It is present in the manifest
1940
+ * but does not drive any specific behavior in `boot-iframe.ts` or
1941
+ * `boot-module.ts` beyond being a piece of metadata.
1942
+ *
1943
+ * Potential Future Uses (Speculative):
1944
+ * - Analytics: Could be used to gather stats on platform popularity/usage.
1945
+ * - Developer Portal: Might inform UI/UX in the dev portal, e.g., showing
1946
+ * platform-specific guides or settings.
1947
+ * - Loader Optimizations: In the future, the loader could potentially use this
1948
+ * to apply platform-specific loading strategies or workarounds, though this
1949
+ * is unlikely given the current generic boot process.
1950
+ * - Asset Pipeline: Could hint to future asset pipeline tools about expected
1951
+ * project structures or build artifacts for different platforms.
1952
+ *
1953
+ * The field is intentionally kept somewhat generic. If finer-grained
1954
+ * distinctions are ever needed (e.g., specific web frameworks like 'phaser',
1955
+ * 'three'), this schema might need to be revisited or a separate
1956
+ * 'platformVersion' or 'framework' field could be added.
1957
+ */
1958
+ platform: z.ZodEnum<["web", "godot", "unity"]>;
1959
+ createdAt: z.ZodString;
1960
+ }, "strip", z.ZodTypeAny, {
1961
+ createdAt: string;
1962
+ version: string;
1963
+ platform: "web" | "godot" | "unity";
1964
+ bootMode: "iframe" | "module";
1965
+ entryPoint: string;
1966
+ styles?: string[] | undefined;
1967
+ }, {
1968
+ createdAt: string;
1969
+ version: string;
1970
+ platform: "web" | "godot" | "unity";
1971
+ bootMode: "iframe" | "module";
1972
+ entryPoint: string;
1973
+ styles?: string[] | undefined;
1974
+ }>;
1975
+ declare const InsertItemSchema: drizzle_zod.BuildSchema<"insert", {
1976
+ id: drizzle_orm_pg_core.PgColumn<{
1977
+ name: "id";
1978
+ tableName: "items";
1979
+ dataType: "string";
1980
+ columnType: "PgUUID";
1981
+ data: string;
1982
+ driverParam: string;
1983
+ notNull: true;
1984
+ hasDefault: true;
1985
+ isPrimaryKey: true;
1986
+ isAutoincrement: false;
1987
+ hasRuntimeDefault: false;
1988
+ enumValues: undefined;
1989
+ baseColumn: never;
1990
+ identity: undefined;
1991
+ generated: undefined;
1992
+ }, {}, {}>;
1993
+ slug: drizzle_orm_pg_core.PgColumn<{
1994
+ name: "slug";
1995
+ tableName: "items";
1996
+ dataType: "string";
1997
+ columnType: "PgText";
1998
+ data: string;
1999
+ driverParam: string;
2000
+ notNull: true;
2001
+ hasDefault: false;
2002
+ isPrimaryKey: false;
2003
+ isAutoincrement: false;
2004
+ hasRuntimeDefault: false;
2005
+ enumValues: [string, ...string[]];
2006
+ baseColumn: never;
2007
+ identity: undefined;
2008
+ generated: undefined;
2009
+ }, {}, {}>;
2010
+ gameId: drizzle_orm_pg_core.PgColumn<{
2011
+ name: "game_id";
2012
+ tableName: "items";
2013
+ dataType: "string";
2014
+ columnType: "PgUUID";
2015
+ data: string;
2016
+ driverParam: string;
2017
+ notNull: false;
2018
+ hasDefault: false;
2019
+ isPrimaryKey: false;
2020
+ isAutoincrement: false;
2021
+ hasRuntimeDefault: false;
2022
+ enumValues: undefined;
2023
+ baseColumn: never;
2024
+ identity: undefined;
2025
+ generated: undefined;
2026
+ }, {}, {}>;
2027
+ displayName: drizzle_orm_pg_core.PgColumn<{
2028
+ name: "display_name";
2029
+ tableName: "items";
2030
+ dataType: "string";
2031
+ columnType: "PgText";
2032
+ data: string;
2033
+ driverParam: string;
2034
+ notNull: true;
2035
+ hasDefault: false;
2036
+ isPrimaryKey: false;
2037
+ isAutoincrement: false;
2038
+ hasRuntimeDefault: false;
2039
+ enumValues: [string, ...string[]];
2040
+ baseColumn: never;
2041
+ identity: undefined;
2042
+ generated: undefined;
2043
+ }, {}, {}>;
2044
+ description: drizzle_orm_pg_core.PgColumn<{
2045
+ name: "description";
2046
+ tableName: "items";
2047
+ dataType: "string";
2048
+ columnType: "PgText";
2049
+ data: string;
2050
+ driverParam: string;
2051
+ notNull: false;
2052
+ hasDefault: false;
2053
+ isPrimaryKey: false;
2054
+ isAutoincrement: false;
2055
+ hasRuntimeDefault: false;
2056
+ enumValues: [string, ...string[]];
2057
+ baseColumn: never;
2058
+ identity: undefined;
2059
+ generated: undefined;
2060
+ }, {}, {}>;
2061
+ type: drizzle_orm_pg_core.PgColumn<{
2062
+ name: "type";
2063
+ tableName: "items";
2064
+ dataType: "string";
2065
+ columnType: "PgEnumColumn";
2066
+ data: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
2067
+ driverParam: string;
2068
+ notNull: true;
2069
+ hasDefault: true;
2070
+ isPrimaryKey: false;
2071
+ isAutoincrement: false;
2072
+ hasRuntimeDefault: false;
2073
+ enumValues: ["currency", "badge", "trophy", "collectible", "consumable", "unlock", "upgrade", "accessory", "other"];
2074
+ baseColumn: never;
2075
+ identity: undefined;
2076
+ generated: undefined;
2077
+ }, {}, {}>;
2078
+ isPlaceable: drizzle_orm_pg_core.PgColumn<{
2079
+ name: "is_placeable";
2080
+ tableName: "items";
2081
+ dataType: "boolean";
2082
+ columnType: "PgBoolean";
2083
+ data: boolean;
2084
+ driverParam: boolean;
2085
+ notNull: true;
2086
+ hasDefault: true;
2087
+ isPrimaryKey: false;
2088
+ isAutoincrement: false;
2089
+ hasRuntimeDefault: false;
2090
+ enumValues: undefined;
2091
+ baseColumn: never;
2092
+ identity: undefined;
2093
+ generated: undefined;
2094
+ }, {}, {}>;
2095
+ imageUrl: drizzle_orm_pg_core.PgColumn<{
2096
+ name: "image_url";
2097
+ tableName: "items";
2098
+ dataType: "string";
2099
+ columnType: "PgText";
2100
+ data: string;
2101
+ driverParam: string;
2102
+ notNull: false;
2103
+ hasDefault: false;
2104
+ isPrimaryKey: false;
2105
+ isAutoincrement: false;
2106
+ hasRuntimeDefault: false;
2107
+ enumValues: [string, ...string[]];
2108
+ baseColumn: never;
2109
+ identity: undefined;
2110
+ generated: undefined;
2111
+ }, {}, {}>;
2112
+ metadata: drizzle_orm_pg_core.PgColumn<{
2113
+ name: "metadata";
2114
+ tableName: "items";
2115
+ dataType: "json";
2116
+ columnType: "PgJsonb";
2117
+ data: unknown;
2118
+ driverParam: unknown;
2119
+ notNull: false;
2120
+ hasDefault: true;
2121
+ isPrimaryKey: false;
2122
+ isAutoincrement: false;
2123
+ hasRuntimeDefault: false;
2124
+ enumValues: undefined;
2125
+ baseColumn: never;
2126
+ identity: undefined;
2127
+ generated: undefined;
2128
+ }, {}, {}>;
2129
+ createdAt: drizzle_orm_pg_core.PgColumn<{
2130
+ name: "created_at";
2131
+ tableName: "items";
2132
+ dataType: "date";
2133
+ columnType: "PgTimestamp";
2134
+ data: Date;
2135
+ driverParam: string;
2136
+ notNull: true;
2137
+ hasDefault: true;
2138
+ isPrimaryKey: false;
2139
+ isAutoincrement: false;
2140
+ hasRuntimeDefault: false;
2141
+ enumValues: undefined;
2142
+ baseColumn: never;
2143
+ identity: undefined;
2144
+ generated: undefined;
2145
+ }, {}, {}>;
2146
+ }, {
2147
+ imageUrl: z.ZodNullable<z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>>;
2148
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
2149
+ }>;
2150
+ declare const UpdateItemSchema: z.ZodObject<Omit<{
2151
+ id: z.ZodOptional<z.ZodString>;
2152
+ slug: z.ZodOptional<z.ZodString>;
2153
+ gameId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2154
+ displayName: z.ZodOptional<z.ZodString>;
2155
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2156
+ type: z.ZodOptional<z.ZodEnum<["currency", "badge", "trophy", "collectible", "consumable", "unlock", "upgrade", "accessory", "other"]>>;
2157
+ isPlaceable: z.ZodOptional<z.ZodBoolean>;
2158
+ imageUrl: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2159
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
2160
+ createdAt: z.ZodOptional<z.ZodDate>;
2161
+ }, "id" | "createdAt">, "strip", z.ZodTypeAny, {
2162
+ description?: string | null | undefined;
2163
+ displayName?: string | undefined;
2164
+ slug?: string | undefined;
2165
+ metadata?: Record<string, unknown> | undefined;
2166
+ gameId?: string | null | undefined;
2167
+ type?: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other" | undefined;
2168
+ isPlaceable?: boolean | undefined;
2169
+ imageUrl?: string | null | undefined;
2170
+ }, {
2171
+ description?: string | null | undefined;
2172
+ displayName?: string | undefined;
2173
+ slug?: string | undefined;
2174
+ metadata?: Record<string, unknown> | undefined;
2175
+ gameId?: string | null | undefined;
2176
+ type?: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other" | undefined;
2177
+ isPlaceable?: boolean | undefined;
2178
+ imageUrl?: string | null | undefined;
2179
+ }>;
2180
+ declare const InsertCurrencySchema: z.ZodObject<Omit<{
2181
+ id: z.ZodOptional<z.ZodString>;
2182
+ itemId: z.ZodString;
2183
+ symbol: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2184
+ isPrimary: z.ZodDefault<z.ZodBoolean>;
2185
+ createdAt: z.ZodOptional<z.ZodDate>;
2186
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
2187
+ }, "id" | "createdAt" | "updatedAt">, "strip", z.ZodTypeAny, {
2188
+ itemId: string;
2189
+ isPrimary: boolean;
2190
+ symbol?: string | null | undefined;
2191
+ }, {
2192
+ itemId: string;
2193
+ symbol?: string | null | undefined;
2194
+ isPrimary?: boolean | undefined;
2195
+ }>;
2196
+ declare const UpdateCurrencySchema: z.ZodObject<{
2197
+ symbol: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
2198
+ itemId: z.ZodOptional<z.ZodString>;
2199
+ isPrimary: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
2200
+ }, "strip", z.ZodTypeAny, {
2201
+ symbol?: string | null | undefined;
2202
+ itemId?: string | undefined;
2203
+ isPrimary?: boolean | undefined;
2204
+ }, {
2205
+ symbol?: string | null | undefined;
2206
+ itemId?: string | undefined;
2207
+ isPrimary?: boolean | undefined;
2208
+ }>;
2209
+ declare const InsertShopListingSchema: z.ZodObject<Omit<{
2210
+ id: z.ZodOptional<z.ZodString>;
2211
+ itemId: z.ZodString;
2212
+ currencyId: z.ZodString;
2213
+ price: z.ZodNumber;
2214
+ sellBackPercentage: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
2215
+ stock: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
2216
+ isActive: z.ZodDefault<z.ZodBoolean>;
2217
+ availableFrom: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
2218
+ availableUntil: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
2219
+ createdAt: z.ZodOptional<z.ZodDate>;
2220
+ updatedAt: z.ZodOptional<z.ZodNullable<z.ZodDate>>;
2221
+ }, "id" | "createdAt" | "updatedAt">, "strip", z.ZodTypeAny, {
2222
+ itemId: string;
2223
+ currencyId: string;
2224
+ price: number;
2225
+ isActive: boolean;
2226
+ sellBackPercentage?: number | null | undefined;
2227
+ stock?: number | null | undefined;
2228
+ availableFrom?: Date | null | undefined;
2229
+ availableUntil?: Date | null | undefined;
2230
+ }, {
2231
+ itemId: string;
2232
+ currencyId: string;
2233
+ price: number;
2234
+ sellBackPercentage?: number | null | undefined;
2235
+ stock?: number | null | undefined;
2236
+ isActive?: boolean | undefined;
2237
+ availableFrom?: Date | null | undefined;
2238
+ availableUntil?: Date | null | undefined;
2239
+ }>;
2240
+ declare const UpdateShopListingSchema: z.ZodObject<{
2241
+ itemId: z.ZodOptional<z.ZodString>;
2242
+ currencyId: z.ZodOptional<z.ZodString>;
2243
+ price: z.ZodOptional<z.ZodNumber>;
2244
+ sellBackPercentage: z.ZodOptional<z.ZodNullable<z.ZodOptional<z.ZodNumber>>>;
2245
+ stock: z.ZodOptional<z.ZodNullable<z.ZodOptional<z.ZodNumber>>>;
2246
+ isActive: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
2247
+ availableFrom: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodDate>>>;
2248
+ availableUntil: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodDate>>>;
2249
+ }, "strip", z.ZodTypeAny, {
2250
+ itemId?: string | undefined;
2251
+ currencyId?: string | undefined;
2252
+ price?: number | undefined;
2253
+ sellBackPercentage?: number | null | undefined;
2254
+ stock?: number | null | undefined;
2255
+ isActive?: boolean | undefined;
2256
+ availableFrom?: Date | null | undefined;
2257
+ availableUntil?: Date | null | undefined;
2258
+ }, {
2259
+ itemId?: string | undefined;
2260
+ currencyId?: string | undefined;
2261
+ price?: number | undefined;
2262
+ sellBackPercentage?: number | null | undefined;
2263
+ stock?: number | null | undefined;
2264
+ isActive?: boolean | undefined;
2265
+ availableFrom?: Date | null | undefined;
2266
+ availableUntil?: Date | null | undefined;
2267
+ }>;
2268
+ /**
2269
+ * Achievement Completion Types
2270
+ */
2271
+ declare const ACHIEVEMENT_COMPLETION_TYPES: readonly ["time_played_session", "interaction", "leaderboard_rank"];
2272
+ type AchievementCompletionType = (typeof ACHIEVEMENT_COMPLETION_TYPES)[number];
2273
+
2274
+ type CharacterComponent = typeof characterComponents.$inferSelect;
2275
+ type PlayerCharacter = typeof playerCharacters.$inferSelect & {
2276
+ accessories?: PlayerCharacterAccessory[];
2277
+ };
2278
+ type PlayerCharacterAccessory = typeof playerCharacterAccessories.$inferSelect;
2279
+ type GameRow = typeof games.$inferSelect;
2280
+ type BaseGame = Omit<GameRow, 'gameType' | 'assetBundleBase' | 'externalUrl'>;
2281
+ type HostedGame = BaseGame & {
2282
+ gameType: 'hosted';
2283
+ assetBundleBase: string;
2284
+ externalUrl: null;
2285
+ };
2286
+ type ExternalGame = BaseGame & {
2287
+ gameType: 'external';
2288
+ assetBundleBase: null;
2289
+ externalUrl: string;
2290
+ };
2291
+ type Game = HostedGame | ExternalGame;
2292
+ type GameStateData = Record<string, unknown>;
2293
+ type UpsertGameMetadataInput = z.infer<typeof UpsertGameMetadataSchema>;
2294
+ type Item = typeof items.$inferSelect;
2295
+ type InventoryItem = typeof inventoryItems.$inferSelect;
2296
+ type ShopListing = typeof shopListings.$inferSelect;
2297
+ type InsertItemInput = z.infer<typeof InsertItemSchema>;
2298
+ type UpdateItemInput = z.infer<typeof UpdateItemSchema>;
2299
+ type InsertCurrencyInput = z.infer<typeof InsertCurrencySchema>;
2300
+ type UpdateCurrencyInput = z.infer<typeof UpdateCurrencySchema>;
2301
+ type InsertShopListingInput = z.infer<typeof InsertShopListingSchema>;
2302
+ type UpdateShopListingInput = z.infer<typeof UpdateShopListingSchema>;
2303
+ interface PlaceableItemMetadata {
2304
+ tilesWide?: number;
2305
+ tilesHigh?: number;
2306
+ flippable?: boolean;
2307
+ [key: string]: unknown;
2308
+ }
2309
+ type MapElement = typeof mapElements.$inferSelect;
2310
+ type MapObject = typeof mapObjects.$inferSelect;
2311
+ interface MapData {
2312
+ id: string;
2313
+ identifier: string;
2314
+ displayName: string;
2315
+ description?: string;
2316
+ metadata?: Record<string, unknown>;
2317
+ }
2318
+ interface CreateMapObjectData {
2319
+ itemId: string;
2320
+ worldX: number;
2321
+ worldY: number;
2322
+ width?: number;
2323
+ height?: number;
2324
+ rotation?: number;
2325
+ scale?: number;
2326
+ metadata?: Record<string, unknown>;
2327
+ }
2328
+
2329
+ type User = typeof users.$inferSelect;
2330
+ type DeveloperStatusResponse = z.infer<typeof DeveloperStatusResponseSchema>;
2331
+ type DeveloperStatusValue = DeveloperStatusResponse['status'];
2332
+ /**
2333
+ * User data with authentication provider information.
2334
+ * Returned by the /users/me endpoint with additional auth context.
2335
+ */
2336
+ type AuthenticatedUser = User & {
2337
+ /** Whether the user authenticated via Timeback SSO */
2338
+ hasTimebackAccount: boolean;
2339
+ };
2340
+
2341
+ /**
2342
+ * Cross-Domain Composite Types
2343
+ * Types that combine data from multiple domains
2344
+ */
2345
+ type ManifestV1 = z.infer<typeof ManifestV1Schema>;
2346
+ /**
2347
+ * Character-related Composite Types
2348
+ * Types that combine character component data with sprite sheet information
2349
+ */
2350
+ type CharacterComponentWithSpriteUrl = CharacterComponent & {
2351
+ spriteSheetUrl: string;
2352
+ };
2353
+ type InventoryItemWithItem = Omit<InventoryItem, 'itemId'> & {
2354
+ item: Item;
2355
+ };
2356
+ type HostedGameWithManifest = HostedGame & {
2357
+ manifest: ManifestV1;
2358
+ };
2359
+ type FetchedGame = HostedGameWithManifest | GameRow;
2360
+ /**
2361
+ * Map-related Composite Types
2362
+ * Types that combine map, game, and item data for rendering and interaction
2363
+ */
2364
+ interface MapElementWithGame extends MapElement {
2365
+ game: Pick<Game, 'id' | 'displayName'> | null;
2366
+ }
2367
+ interface MapObjectWithItem extends MapObject {
2368
+ item: Pick<Item, 'id' | 'slug' | 'displayName' | 'description' | 'imageUrl' | 'isPlaceable'> & {
2369
+ metadata: PlaceableItemMetadata;
2370
+ };
2371
+ }
2372
+ /**
2373
+ * Shop-related Composite Types
2374
+ * Types that combine inventory, currency, and shop listing data for commerce operations
2375
+ */
2376
+ interface ShopDisplayItem extends Omit<Item, 'createdAt'> {
2377
+ listingId: string;
2378
+ shopPrice: number;
2379
+ currencyId: string;
2380
+ currencySymbol?: string | null;
2381
+ currencyDisplayName?: string | null;
2382
+ currencyImageUrl?: string | null;
2383
+ stock?: number | null;
2384
+ sellBackPercentage?: number | null;
2385
+ }
2386
+ interface ShopCurrency {
2387
+ id: string;
2388
+ symbol: string | null;
2389
+ isPrimary: boolean;
2390
+ displayName?: string | null;
2391
+ imageUrl?: string | null;
2392
+ }
2393
+ interface ShopViewResponse {
2394
+ shopItems: ShopDisplayItem[];
2395
+ currencies: ShopCurrency[];
2396
+ }
2397
+ /**
2398
+ * Leaderboard Composite Types
2399
+ * Types that combine leaderboard, user, and game data
2400
+ */
2401
+ interface GameLeaderboardEntry {
2402
+ rank: number;
2403
+ userId: string;
2404
+ username: string;
2405
+ userImage?: string | null;
2406
+ score: number;
2407
+ achievedAt: Date;
2408
+ metadata?: Record<string, unknown>;
2409
+ gameId: string;
2410
+ gameTitle: string;
2411
+ gameSlug: string;
2412
+ }
2413
+
2414
+ type UserLevel = typeof userLevels.$inferSelect;
2415
+ type LevelConfig = typeof levelConfigs.$inferSelect;
2416
+ interface LeaderboardOptions {
2417
+ timeframe?: 'all_time' | 'monthly' | 'weekly' | 'daily';
2418
+ limit?: number;
2419
+ offset?: number;
2420
+ gameId?: string;
2421
+ }
2422
+ interface LeaderboardEntry {
2423
+ rank: number;
2424
+ userId: string;
2425
+ username: string;
2426
+ userImage?: string | null;
2427
+ score: number;
2428
+ achievedAt: Date;
2429
+ metadata?: Record<string, unknown>;
2430
+ gameId?: string;
2431
+ gameTitle?: string;
2432
+ gameSlug?: string;
2433
+ }
2434
+ interface UserRankResponse {
2435
+ rank: number;
2436
+ score: number;
2437
+ userId: string;
2438
+ }
2439
+ interface UserScore$1 {
2440
+ id: string;
2441
+ score: number;
2442
+ achievedAt: Date;
2443
+ metadata?: Record<string, unknown>;
2444
+ gameId: string;
2445
+ gameTitle: string;
2446
+ gameSlug: string;
2447
+ }
2448
+ interface SpriteTemplateData {
2449
+ tileSize: number;
2450
+ tileHeight: number;
2451
+ columns: number;
2452
+ rows: number;
2453
+ spacing: number;
2454
+ animations: {
2455
+ base_right: {
2456
+ row: number;
2457
+ frameStart: number;
2458
+ numFrames: number;
2459
+ fps: number;
2460
+ };
2461
+ base_up: {
2462
+ row: number;
2463
+ frameStart: number;
2464
+ numFrames: number;
2465
+ fps: number;
2466
+ };
2467
+ base_left: {
2468
+ row: number;
2469
+ frameStart: number;
2470
+ numFrames: number;
2471
+ fps: number;
2472
+ };
2473
+ base_down: {
2474
+ row: number;
2475
+ frameStart: number;
2476
+ numFrames: number;
2477
+ fps: number;
2478
+ };
2479
+ idle_right: {
2480
+ row: number;
2481
+ frameStart: number;
2482
+ numFrames: number;
2483
+ fps: number;
2484
+ };
2485
+ walk_right: {
2486
+ row: number;
2487
+ frameStart: number;
2488
+ numFrames: number;
2489
+ fps: number;
2490
+ };
2491
+ idle_up: {
2492
+ row: number;
2493
+ frameStart: number;
2494
+ numFrames: number;
2495
+ fps: number;
2496
+ };
2497
+ walk_up: {
2498
+ row: number;
2499
+ frameStart: number;
2500
+ numFrames: number;
2501
+ fps: number;
2502
+ };
2503
+ idle_left: {
2504
+ row: number;
2505
+ frameStart: number;
2506
+ numFrames: number;
2507
+ fps: number;
2508
+ };
2509
+ walk_left: {
2510
+ row: number;
2511
+ frameStart: number;
2512
+ numFrames: number;
2513
+ fps: number;
2514
+ };
2515
+ idle_down: {
2516
+ row: number;
2517
+ frameStart: number;
2518
+ numFrames: number;
2519
+ fps: number;
2520
+ };
2521
+ walk_down: {
2522
+ row: number;
2523
+ frameStart: number;
2524
+ numFrames: number;
2525
+ fps: number;
2526
+ };
2527
+ };
2528
+ }
2529
+ type TodayXpResponse = {
2530
+ xp: number;
2531
+ date: string;
2532
+ };
2533
+ type TotalXpResponse = {
2534
+ totalXp: number;
2535
+ };
2536
+ type XpHistoryResponse = {
2537
+ history: Array<{
2538
+ date: string;
2539
+ xp: number;
2540
+ }>;
2541
+ };
2542
+
2543
+ type AchievementIntervalType = (typeof achievementIntervalEnum.enumValues)[number];
2544
+ /**
2545
+ * Current-interval achievement with computed status and window metadata
2546
+ */
2547
+ interface AchievementCurrent {
2548
+ id: string;
2549
+ title: string;
2550
+ description?: string | null;
2551
+ intervalType: AchievementIntervalType;
2552
+ rewardCredits: number;
2553
+ limitPerInterval: number;
2554
+ completionType: AchievementCompletionType;
2555
+ completionConfig: Record<string, unknown>;
2556
+ scope: Record<string, unknown>;
2557
+ active: boolean;
2558
+ createdAt?: Date;
2559
+ updatedAt?: Date;
2560
+ status: 'available' | 'completed';
2561
+ intervalKey: string;
2562
+ windowStart: string;
2563
+ windowEnd: string;
2564
+ }
2565
+ /**
2566
+ * Historical entry representing a prior claim within an interval
2567
+ */
2568
+ interface AchievementHistoryEntry {
2569
+ achievementId: string;
2570
+ title: string;
2571
+ rewardCredits: number;
2572
+ createdAt: string;
2573
+ intervalKey: string;
2574
+ }
2575
+ /**
2576
+ * Response returned when submitting achievement progress
2577
+ */
2578
+ interface AchievementProgressResponse {
2579
+ achievementId: string;
2580
+ status: 'completed' | 'already_completed';
2581
+ rewardCredits: number;
2582
+ intervalKey: string;
2583
+ createdAt: string;
2584
+ }
2585
+
2586
+ interface ClientConfig {
2587
+ baseUrl: string;
2588
+ token?: string;
2589
+ gameId?: string;
2590
+ autoStartSession?: boolean;
2591
+ }
2592
+ type AuthProviderType = (typeof AuthProvider)[keyof typeof AuthProvider];
2593
+ interface AuthOptions {
2594
+ /** The identity provider to use for authentication */
2595
+ provider: AuthProviderType;
2596
+ /** The OAuth callback URL where your server handles the callback */
2597
+ callbackUrl: string;
2598
+ /** Authentication mode - auto detects best option based on context */
2599
+ mode?: 'auto' | 'popup' | 'redirect';
2600
+ /** Callback for authentication state changes */
2601
+ onStateChange?: (state: AuthStateUpdate) => void;
2602
+ /** Custom OAuth configuration (for users embedding the SDK outside of the Playcademy platform) */
2603
+ oauth?: {
2604
+ clientId: string;
2605
+ authorizationEndpoint?: string;
2606
+ tokenEndpoint?: string;
2607
+ scope?: string;
2608
+ };
2609
+ /**
2610
+ * Optional custom data to encode in OAuth state parameter.
2611
+ * By default, the SDK automatically includes playcademy_user_id and game_id.
2612
+ * Use this to add additional custom data if needed.
2613
+ */
2614
+ stateData?: Record<string, string>;
2615
+ }
2616
+ interface AuthStateUpdate {
2617
+ /** Current status of the authentication flow */
2618
+ status: 'opening_popup' | 'exchanging_token' | 'complete' | 'error';
2619
+ /** Human-readable message about the current state */
2620
+ message: string;
2621
+ /** Error details if status is 'error' */
2622
+ error?: Error;
2623
+ }
2624
+ interface AuthResult {
2625
+ /** Whether authentication was successful */
2626
+ success: boolean;
2627
+ /** User information if authentication was successful */
2628
+ user?: UserInfo;
2629
+ /** Error if authentication failed */
2630
+ error?: Error;
2631
+ }
2632
+ /**
2633
+ * Standard OAuth/OIDC user claims returned from identity providers
2634
+ * This is what external identity providers (like Timeback) return
2635
+ */
2636
+ interface UserInfo {
2637
+ /** Unique user identifier (sub claim from JWT) */
2638
+ sub: string;
2639
+ /** User's email address */
2640
+ email: string;
2641
+ /** User's display name */
2642
+ name: string;
2643
+ /** Whether the email has been verified */
2644
+ email_verified: boolean;
2645
+ /** Optional given name (first name) */
2646
+ given_name?: string;
2647
+ /** Optional family name (last name) */
2648
+ family_name?: string;
2649
+ /** Additional user attributes from the identity provider */
2650
+ [key: string]: unknown;
2651
+ }
2652
+ /**
2653
+ * Authentication state change event payload.
2654
+ * Used when authentication state changes in the application.
2655
+ */
2656
+ interface AuthStateChangePayload {
2657
+ /** Whether the user is currently authenticated */
2658
+ authenticated: boolean;
2659
+ /** User information if authenticated, null otherwise */
2660
+ user: UserInfo | null;
2661
+ /** Error information if authentication failed */
2662
+ error: Error | null;
2663
+ }
2664
+ /**
2665
+ * OAuth callback event payload.
2666
+ * Used when OAuth flow completes in popup/new-tab windows.
2667
+ */
2668
+ interface AuthCallbackPayload {
2669
+ /** OAuth authorization code */
2670
+ code: string;
2671
+ /** OAuth state parameter for CSRF protection */
2672
+ state: string;
2673
+ /** Error message if OAuth flow failed */
2674
+ error: string | null;
2675
+ }
2676
+ /**
2677
+ * Token refresh event payload.
2678
+ * Sent when authentication token is updated.
2679
+ */
2680
+ interface TokenRefreshPayload {
2681
+ /** New authentication token */
2682
+ token: string;
2683
+ /** Token expiration timestamp */
2684
+ exp: number;
2685
+ }
2686
+ /**
2687
+ * Telemetry event payload.
2688
+ * Performance metrics sent from the game.
2689
+ */
2690
+ interface TelemetryPayload {
2691
+ /** Frames per second */
2692
+ fps: number;
2693
+ /** Memory usage in MB */
2694
+ mem: number;
2695
+ }
2696
+ /**
2697
+ * Keyboard event payload.
2698
+ * Key events forwarded from the game.
2699
+ */
2700
+ interface KeyEventPayload {
2701
+ /** Key value (e.g., 'Escape', 'F1') */
2702
+ key: string;
2703
+ /** Key code (optional) */
2704
+ code?: string;
2705
+ /** Event type */
2706
+ type: 'keydown' | 'keyup';
2707
+ }
2708
+ interface ClientEvents {
2709
+ authChange: {
2710
+ token: string | null;
2711
+ };
2712
+ inventoryChange: {
2713
+ itemId: string;
2714
+ delta: number;
2715
+ newTotal: number;
2716
+ };
2717
+ levelUp: {
2718
+ oldLevel: number;
2719
+ newLevel: number;
2720
+ creditsAwarded: number;
2721
+ };
2722
+ xpGained: {
2723
+ amount: number;
2724
+ totalXP: number;
2725
+ leveledUp: boolean;
2726
+ };
2727
+ }
2728
+ type GameContextPayload = {
2729
+ token: string;
2730
+ baseUrl: string;
2731
+ realtimeUrl: string;
2732
+ gameId: string;
2733
+ forwardKeys?: string[];
2734
+ };
2735
+ type LoginResponse = {
2736
+ token: string;
2737
+ };
2738
+ type GameTokenResponse = {
2739
+ token: string;
2740
+ exp: number;
2741
+ };
2742
+ type StartSessionResponse = {
2743
+ sessionId: string;
2744
+ };
2745
+ type InventoryMutationResponse = {
2746
+ newTotal: number;
2747
+ };
2748
+ type DevUploadEvent = {
2749
+ type: 'init';
2750
+ } | {
2751
+ type: 's3Progress';
2752
+ loaded: number;
2753
+ total: number;
2754
+ percent: number;
2755
+ } | {
2756
+ type: 'finalizeStart';
2757
+ } | {
2758
+ type: 'finalizeProgress';
2759
+ percent: number;
2760
+ currentFileLabel?: string;
2761
+ } | {
2762
+ type: 'finalizeStatus';
2763
+ message: string;
2764
+ } | {
2765
+ type: 'close';
2766
+ };
2767
+ type DevUploadHooks = {
2768
+ onEvent?: (e: DevUploadEvent) => void;
2769
+ onClose?: () => void;
2770
+ };
2771
+
2772
+ /**
2773
+ * OAuth 2.0 implementation for the Playcademy SDK
2774
+ */
2775
+
2776
+ /**
2777
+ * Parses an OAuth state parameter to extract CSRF token and any encoded data.
2778
+ *
2779
+ * @param state - The OAuth state parameter to parse
2780
+ * @returns Object containing CSRF token and optional decoded data
2781
+ */
2782
+ declare function parseOAuthState(state: string): {
2783
+ csrfToken: string;
2784
+ data?: Record<string, string>;
2785
+ };
2786
+
2787
+ /**
2788
+ * Response type for the realtime token API
2789
+ */
2790
+ interface RealtimeTokenResponse {
2791
+ token: string;
2792
+ }
2793
+
2794
+ /**
2795
+ * Cache configuration types for runtime customization
2796
+ */
2797
+ /**
2798
+ * Runtime configuration for TTL cache behavior
2799
+ */
2800
+ interface TTLCacheConfig {
2801
+ /** Time-to-live in milliseconds. Set to 0 to disable caching for this call. */
2802
+ ttl?: number;
2803
+ /** Force refresh, bypassing cache */
2804
+ force?: boolean;
2805
+ /** Skip cache and fetch fresh data (alias for force) */
2806
+ skipCache?: boolean;
2807
+ }
2808
+ /**
2809
+ * Runtime configuration for cooldown cache behavior
2810
+ */
2811
+ interface CooldownCacheConfig {
2812
+ /** Cooldown period in milliseconds. Set to 0 to disable cooldown for this call. */
2813
+ cooldown?: number;
2814
+ /** Force refresh, bypassing cooldown */
2815
+ force?: boolean;
2816
+ }
2817
+
2818
+ interface CharacterComponentsOptions {
2819
+ /**
2820
+ * Optional level filter for components
2821
+ * When provided, only components available at this level or below are returned
2822
+ */
2823
+ level?: number;
2824
+ /**
2825
+ * Whether to bypass the cache and force a fresh API request
2826
+ * Default: false (use cache when available)
2827
+ */
2828
+ skipCache?: boolean;
2829
+ }
2830
+ interface CreateCharacterData {
2831
+ bodyComponentId: string;
2832
+ eyesComponentId: string;
2833
+ hairstyleComponentId: string;
2834
+ outfitComponentId: string;
2835
+ }
2836
+ interface UpdateCharacterData {
2837
+ bodyComponentId?: string;
2838
+ eyesComponentId?: string;
2839
+ hairstyleComponentId?: string;
2840
+ outfitComponentId?: string;
2841
+ }
2842
+
2843
+ interface ScoreSubmission {
2844
+ id: string;
2845
+ score: number;
2846
+ achievedAt: Date;
2847
+ }
2848
+
2849
+ /**
2850
+ * Combined response type for summary method
2851
+ */
2852
+ type XpSummaryResponse = {
2853
+ today: TodayXpResponse;
2854
+ total: TotalXpResponse;
2855
+ };
2856
+
2857
+ interface UserScore {
2858
+ id: string;
2859
+ score: number;
2860
+ achievedAt: Date;
2861
+ metadata?: Record<string, unknown>;
2862
+ gameId: string;
2863
+ gameTitle: string;
2864
+ gameSlug: string;
2865
+ }
2866
+
2867
+ /**
2868
+ * Auto-initializes a PlaycademyClient with context from the environment.
2869
+ * Works in both iframe mode (production/development) and standalone mode (local dev).
2870
+ *
2871
+ * This is the recommended way to initialize the SDK as it automatically:
2872
+ * - Detects the runtime environment (iframe vs standalone)
2873
+ * - Configures the client with the appropriate context
2874
+ * - Sets up event listeners for token refresh
2875
+ * - Exposes the client for debugging in development mode
2876
+ *
2877
+ * @returns Promise resolving to a fully initialized PlaycademyClient
2878
+ * @throws Error if not running in a browser context
2879
+ *
2880
+ * @example
2881
+ * ```typescript
2882
+ * const client = await PlaycademyClient.init()
2883
+ * const user = await client.users.me()
2884
+ * ```
2885
+ */
2886
+ declare function init(): Promise<PlaycademyClient>;
2887
+
2888
+ /**
2889
+ * Authenticates a user with email and password.
2890
+ *
2891
+ * This is a standalone authentication method that doesn't require an initialized client.
2892
+ * Use this for login flows before creating a client instance.
2893
+ *
2894
+ * @deprecated Use client.auth.login() instead for better error handling and automatic token management
2895
+ *
2896
+ * @param baseUrl - The base URL of the Playcademy API
2897
+ * @param email - User's email address
2898
+ * @param password - User's password
2899
+ * @returns Promise resolving to authentication response with token
2900
+ * @throws PlaycademyError if authentication fails or network error occurs
2901
+ *
2902
+ * @example
2903
+ * ```typescript
2904
+ * // Preferred approach:
2905
+ * const client = new PlaycademyClient({ baseUrl: '/api' })
2906
+ * const result = await client.auth.login({
2907
+ * email: 'user@example.com',
2908
+ * password: 'password'
2909
+ * })
2910
+ *
2911
+ * // Legacy approach (still works):
2912
+ * try {
2913
+ * const response = await PlaycademyClient.login('/api', 'user@example.com', 'password')
2914
+ * const client = new PlaycademyClient({ token: response.token })
2915
+ * } catch (error) {
2916
+ * console.error('Login failed:', error.message)
2917
+ * }
2918
+ * ```
2919
+ */
2920
+ declare function login(baseUrl: string, email: string, password: string): Promise<LoginResponse>;
2921
+
2922
+ /** Permitted HTTP verbs */
2923
+ type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
2924
+
2925
+ /**
2926
+ * Main Playcademy SDK client for interacting with the platform API.
2927
+ * Provides namespaced access to all platform features including games, users, inventory, and more.
2928
+ */
2929
+ declare class PlaycademyClient {
2930
+ private baseUrl;
2931
+ private token?;
2932
+ private gameId?;
2933
+ private config;
2934
+ private listeners;
2935
+ private internalClientSessionId?;
2936
+ private authContext?;
2937
+ private initPayload?;
2938
+ /**
2939
+ * Creates a new PlaycademyClient instance.
2940
+ *
2941
+ * @param config - Optional configuration object
2942
+ * @param config.baseUrl - Base URL for API requests (defaults to '/api')
2943
+ * @param config.token - Authentication token
2944
+ * @param config.gameId - Game ID for automatic session management
2945
+ * @param config.autoStartSession - Automatically start a game session?
2946
+ */
2947
+ constructor(config?: Partial<ClientConfig>);
2948
+ /**
2949
+ * Gets the effective base URL for API requests.
2950
+ * Converts relative URLs to absolute URLs in browser environments.
2951
+ *
2952
+ * @returns The complete base URL for API requests
2953
+ */
2954
+ getBaseUrl(): string;
2955
+ /**
2956
+ * Simple ping method for testing connectivity.
2957
+ *
2958
+ * @returns 'pong' string response
2959
+ */
2960
+ ping(): string;
2961
+ /**
2962
+ * Sets the authentication token for API requests.
2963
+ * Emits an 'authChange' event when the token changes.
2964
+ *
2965
+ * @param token - The authentication token, or null to clear
2966
+ */
2967
+ setToken(token: string | null): void;
2968
+ /**
2969
+ * Checks if the client has a valid API token for making Playcademy API requests.
2970
+ *
2971
+ * For games (iframe context): Checks if we have a valid token from the parent.
2972
+ * For Cademy (standalone): Checks if we have a token from better-auth.
2973
+ *
2974
+ * Note: This checks for API authentication, not whether a user has linked
2975
+ * their identity via OAuth.
2976
+ *
2977
+ * @returns true if API token exists, false otherwise
2978
+ *
2979
+ * @example
2980
+ * ```typescript
2981
+ * if (client.isAuthenticated()) {
2982
+ * // Can make API calls
2983
+ * const games = await client.games.list()
2984
+ * } else {
2985
+ * console.error('No API token available')
2986
+ * }
2987
+ * ```
2988
+ */
2989
+ isAuthenticated(): boolean;
2990
+ /**
2991
+ * Registers a callback to be called when authentication state changes.
2992
+ *
2993
+ * @param callback - Function to call when auth state changes
2994
+ */
2995
+ onAuthChange(callback: (token: string | null) => void): void;
2996
+ /**
2997
+ * Sets the authentication context for the client.
2998
+ * This is called during initialization to store environment info.
2999
+ * @internal
3000
+ */
3001
+ _setAuthContext(context: {
3002
+ isInIframe: boolean;
3003
+ }): void;
3004
+ /**
3005
+ * Registers an event listener for client events.
3006
+ *
3007
+ * @param event - The event type to listen for
3008
+ * @param callback - Function to call when the event is emitted
3009
+ */
3010
+ on<E extends keyof ClientEvents>(event: E, callback: (payload: ClientEvents[E]) => void): void;
3011
+ /**
3012
+ * Emits an event to all registered listeners.
3013
+ *
3014
+ * @param event - The event type to emit
3015
+ * @param payload - The event payload
3016
+ */
3017
+ private emit;
3018
+ /**
3019
+ * Makes an authenticated HTTP request to the API.
3020
+ *
3021
+ * @param path - API endpoint path
3022
+ * @param method - HTTP method
3023
+ * @param body - Request body (optional)
3024
+ * @param headers - Additional headers (optional)
3025
+ * @returns Promise resolving to the response data
3026
+ */
3027
+ protected request<T>(path: string, method: Method, body?: unknown, headers?: Record<string, string>): Promise<T>;
3028
+ /**
3029
+ * Ensures a gameId is available, throwing an error if not.
3030
+ *
3031
+ * @returns The gameId
3032
+ * @throws PlaycademyError if no gameId is configured
3033
+ */
3034
+ private _ensureGameId;
3035
+ /**
3036
+ * Detects and sets the authentication context (iframe vs standalone).
3037
+ * Safe to call in any environment - isInIframe handles browser detection.
3038
+ */
3039
+ private _detectAuthContext;
3040
+ /**
3041
+ * Initializes an internal game session for automatic session management.
3042
+ * Only starts a session if:
3043
+ * 1. A gameId is configured
3044
+ * 2. No session already exists
3045
+ * 3. autoStartSession is enabled (defaults to false)
3046
+ */
3047
+ private _initializeInternalSession;
3048
+ /** Platform API authentication methods (login, logout) */
3049
+ auth: {
3050
+ login: (credentials: {
3051
+ email: string;
3052
+ password: string;
3053
+ }) => Promise<{
3054
+ success: boolean;
3055
+ token?: string;
3056
+ error?: string;
3057
+ }>;
3058
+ logout: () => Promise<void>;
3059
+ };
3060
+ /** Identity provider connection methods (connect external accounts) */
3061
+ identity: {
3062
+ readonly user: {
3063
+ sub: string;
3064
+ email: string;
3065
+ name: string;
3066
+ email_verified: true;
3067
+ given_name: undefined;
3068
+ family_name: undefined;
3069
+ } | null;
3070
+ connect: (options: AuthOptions) => Promise<AuthResult>;
3071
+ _getContext: () => {
3072
+ isInIframe: boolean;
3073
+ };
3074
+ };
3075
+ /** Runtime methods (getGameToken, exit) */
3076
+ runtime: {
3077
+ getGameToken: (gameId: string, options?: {
3078
+ apply?: boolean;
3079
+ }) => Promise<GameTokenResponse>;
3080
+ exit: () => Promise<void>;
3081
+ onInit: (handler: (context: GameContextPayload) => void) => void;
3082
+ onTokenRefresh: (handler: (data: {
3083
+ token: string;
3084
+ exp: number;
3085
+ }) => void) => void;
3086
+ onPause: (handler: () => void) => void;
3087
+ onResume: (handler: () => void) => void;
3088
+ onForceExit: (handler: () => void) => void;
3089
+ onOverlay: (handler: (isVisible: boolean) => void) => void;
3090
+ ready: () => void;
3091
+ sendTelemetry: (data: {
3092
+ fps: number;
3093
+ mem: number;
3094
+ }) => void;
3095
+ removeListener: (eventType: MessageEvents, handler: ((context: GameContextPayload) => void) | ((data: {
3096
+ token: string;
3097
+ exp: number;
3098
+ }) => void) | (() => void) | ((isVisible: boolean) => void)) => void;
3099
+ removeAllListeners: () => void;
3100
+ getListenerCounts: () => Record<string, number>;
3101
+ };
3102
+ /** Game management methods (fetch, list, saveState, loadState, sessions) */
3103
+ games: {
3104
+ fetch: (gameIdOrSlug: string, options?: TTLCacheConfig) => Promise<FetchedGame>;
3105
+ list: (options?: TTLCacheConfig) => Promise<Array<Game>>;
3106
+ saveState: (state: Record<string, unknown>) => Promise<void>;
3107
+ loadState: () => Promise<GameStateData>;
3108
+ startSession: (gameId?: string) => Promise<StartSessionResponse>;
3109
+ endSession: (sessionId: string, gameId?: string) => Promise<void>;
3110
+ token: {
3111
+ create: (gameId: string, options?: {
3112
+ apply?: boolean;
3113
+ }) => Promise<GameTokenResponse>;
3114
+ };
3115
+ leaderboard: {
3116
+ get: (gameId: string, options?: {
3117
+ limit?: number;
3118
+ offset?: number;
3119
+ }) => Promise<LeaderboardEntry[]>;
3120
+ };
3121
+ };
3122
+ /** User methods (me, inventory management) */
3123
+ users: {
3124
+ me: () => Promise<AuthenticatedUser>;
3125
+ inventory: {
3126
+ get: () => Promise<InventoryItemWithItem[]>;
3127
+ add: (identifier: string, qty: number) => Promise<InventoryMutationResponse>;
3128
+ remove: (identifier: string, qty: number) => Promise<InventoryMutationResponse>;
3129
+ quantity: (identifier: string) => Promise<number>;
3130
+ has: (identifier: string, minQuantity?: number) => Promise<boolean>;
3131
+ };
3132
+ scores: {
3133
+ get: (userIdOrOptions?: string | {
3134
+ limit?: number;
3135
+ gameId?: string;
3136
+ }, options?: {
3137
+ limit?: number;
3138
+ gameId?: string;
3139
+ }) => Promise<UserScore[]>;
3140
+ };
3141
+ };
3142
+ /** Developer tools (auth, games, keys management) */
3143
+ dev: {
3144
+ status: {
3145
+ apply: () => Promise<void>;
3146
+ get: () => Promise<DeveloperStatusValue>;
3147
+ };
3148
+ games: {
3149
+ upsert: (slug: string, metadata: UpsertGameMetadataInput, file: File | Blob | null, hooks?: DevUploadHooks) => Promise<Game>;
3150
+ update: (gameId: string, props: Partial<Game>) => Promise<void>;
3151
+ delete: (gameId: string) => Promise<void>;
3152
+ };
3153
+ keys: {
3154
+ create: (label?: string) => Promise<{
3155
+ id: string;
3156
+ createdAt: Date;
3157
+ userId: string;
3158
+ label: string | null;
3159
+ keyHash: string;
3160
+ }>;
3161
+ list: () => Promise<{
3162
+ id: string;
3163
+ createdAt: Date;
3164
+ userId: string;
3165
+ label: string | null;
3166
+ keyHash: string;
3167
+ }[]>;
3168
+ revoke: (keyId: string) => Promise<void>;
3169
+ };
3170
+ items: {
3171
+ create: (gameId: string, slug: string, itemData: Omit<InsertItemInput, "slug" | "gameId">) => Promise<Item>;
3172
+ update: (gameId: string, itemId: string, updates: UpdateItemInput) => Promise<Item>;
3173
+ list: (gameId: string) => Promise<Array<Item>>;
3174
+ get: (gameId: string, slug: string) => Promise<Item>;
3175
+ delete: (gameId: string, itemId: string) => Promise<void>;
3176
+ shop: {
3177
+ create: (gameId: string, itemId: string, listingData: Omit<InsertShopListingInput, "itemId">) => Promise<ShopListing>;
3178
+ get: (gameId: string, itemId: string) => Promise<ShopListing | null>;
3179
+ update: (gameId: string, itemId: string, updates: UpdateShopListingInput) => Promise<ShopListing>;
3180
+ delete: (gameId: string, itemId: string) => Promise<void>;
3181
+ list: (gameId: string) => Promise<Array<ShopListing & {
3182
+ item: Item;
3183
+ }>>;
3184
+ };
3185
+ };
3186
+ };
3187
+ /** Map methods (elements) */
3188
+ maps: {
3189
+ get: (identifier: string) => Promise<MapData>;
3190
+ elements: (mapId: string) => Promise<MapElementWithGame[]>;
3191
+ objects: {
3192
+ list: (mapId: string) => Promise<MapObjectWithItem[]>;
3193
+ create: (mapId: string, objectData: CreateMapObjectData) => Promise<MapObjectWithItem>;
3194
+ delete: (mapId: string, objectId: string) => Promise<void>;
3195
+ };
3196
+ };
3197
+ /** Admin methods (games, items, currencies, shop listings) */
3198
+ admin: {
3199
+ games: {
3200
+ pauseGame: (gameId: string) => Promise<void>;
3201
+ resumeGame: (gameId: string) => Promise<void>;
3202
+ };
3203
+ items: {
3204
+ create: (props: InsertItemInput) => Promise<{
3205
+ id: string;
3206
+ createdAt: Date;
3207
+ type: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
3208
+ gameId: string | null;
3209
+ slug: string;
3210
+ displayName: string;
3211
+ metadata: unknown;
3212
+ description: string | null;
3213
+ isPlaceable: boolean;
3214
+ imageUrl: string | null;
3215
+ }>;
3216
+ get: (itemId: string) => Promise<{
3217
+ id: string;
3218
+ createdAt: Date;
3219
+ type: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
3220
+ gameId: string | null;
3221
+ slug: string;
3222
+ displayName: string;
3223
+ metadata: unknown;
3224
+ description: string | null;
3225
+ isPlaceable: boolean;
3226
+ imageUrl: string | null;
3227
+ }>;
3228
+ list: () => Promise<{
3229
+ id: string;
3230
+ createdAt: Date;
3231
+ type: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
3232
+ gameId: string | null;
3233
+ slug: string;
3234
+ displayName: string;
3235
+ metadata: unknown;
3236
+ description: string | null;
3237
+ isPlaceable: boolean;
3238
+ imageUrl: string | null;
3239
+ }[]>;
3240
+ update: (itemId: string, props: UpdateItemInput) => Promise<{
3241
+ id: string;
3242
+ createdAt: Date;
3243
+ type: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
3244
+ gameId: string | null;
3245
+ slug: string;
3246
+ displayName: string;
3247
+ metadata: unknown;
3248
+ description: string | null;
3249
+ isPlaceable: boolean;
3250
+ imageUrl: string | null;
3251
+ }>;
3252
+ delete: (itemId: string) => Promise<void>;
3253
+ };
3254
+ currencies: {
3255
+ create: (props: InsertCurrencyInput) => Promise<{
3256
+ symbol: string | null;
3257
+ id: string;
3258
+ createdAt: Date;
3259
+ updatedAt: Date | null;
3260
+ itemId: string;
3261
+ isPrimary: boolean;
3262
+ }>;
3263
+ get: (currencyId: string) => Promise<{
3264
+ symbol: string | null;
3265
+ id: string;
3266
+ createdAt: Date;
3267
+ updatedAt: Date | null;
3268
+ itemId: string;
3269
+ isPrimary: boolean;
3270
+ }>;
3271
+ list: () => Promise<{
3272
+ symbol: string | null;
3273
+ id: string;
3274
+ createdAt: Date;
3275
+ updatedAt: Date | null;
3276
+ itemId: string;
3277
+ isPrimary: boolean;
3278
+ }[]>;
3279
+ update: (currencyId: string, props: UpdateCurrencyInput) => Promise<{
3280
+ symbol: string | null;
3281
+ id: string;
3282
+ createdAt: Date;
3283
+ updatedAt: Date | null;
3284
+ itemId: string;
3285
+ isPrimary: boolean;
3286
+ }>;
3287
+ delete: (currencyId: string) => Promise<void>;
3288
+ };
3289
+ shopListings: {
3290
+ create: (props: InsertShopListingInput) => Promise<{
3291
+ id: string;
3292
+ createdAt: Date;
3293
+ updatedAt: Date | null;
3294
+ itemId: string;
3295
+ currencyId: string;
3296
+ price: number;
3297
+ sellBackPercentage: number | null;
3298
+ stock: number | null;
3299
+ isActive: boolean;
3300
+ availableFrom: Date | null;
3301
+ availableUntil: Date | null;
3302
+ }>;
3303
+ get: (listingId: string) => Promise<{
3304
+ id: string;
3305
+ createdAt: Date;
3306
+ updatedAt: Date | null;
3307
+ itemId: string;
3308
+ currencyId: string;
3309
+ price: number;
3310
+ sellBackPercentage: number | null;
3311
+ stock: number | null;
3312
+ isActive: boolean;
3313
+ availableFrom: Date | null;
3314
+ availableUntil: Date | null;
3315
+ }>;
3316
+ list: () => Promise<{
3317
+ id: string;
3318
+ createdAt: Date;
3319
+ updatedAt: Date | null;
3320
+ itemId: string;
3321
+ currencyId: string;
3322
+ price: number;
3323
+ sellBackPercentage: number | null;
3324
+ stock: number | null;
3325
+ isActive: boolean;
3326
+ availableFrom: Date | null;
3327
+ availableUntil: Date | null;
3328
+ }[]>;
3329
+ update: (listingId: string, props: UpdateShopListingInput) => Promise<{
3330
+ id: string;
3331
+ createdAt: Date;
3332
+ updatedAt: Date | null;
3333
+ itemId: string;
3334
+ currencyId: string;
3335
+ price: number;
3336
+ sellBackPercentage: number | null;
3337
+ stock: number | null;
3338
+ isActive: boolean;
3339
+ availableFrom: Date | null;
3340
+ availableUntil: Date | null;
3341
+ }>;
3342
+ delete: (listingId: string) => Promise<void>;
3343
+ };
3344
+ };
3345
+ /** Shop methods (view) */
3346
+ shop: {
3347
+ view: () => Promise<ShopViewResponse>;
3348
+ };
3349
+ /** Level methods (levels) */
3350
+ levels: {
3351
+ get: () => Promise<UserLevel>;
3352
+ progress: (options?: CooldownCacheConfig) => Promise<{
3353
+ level: number;
3354
+ currentXp: number;
3355
+ xpToNextLevel: number;
3356
+ totalXP: number;
3357
+ }>;
3358
+ config: {
3359
+ list: () => Promise<LevelConfig[]>;
3360
+ get: (level: number) => Promise<LevelConfig | null>;
3361
+ };
3362
+ };
3363
+ /** TimeBack XP methods (today, total, history) */
3364
+ timeback: {
3365
+ xp: {
3366
+ today: (options?: {
3367
+ date?: string;
3368
+ timezone?: string;
3369
+ }) => Promise<TodayXpResponse>;
3370
+ total: () => Promise<TotalXpResponse>;
3371
+ history: (options?: {
3372
+ startDate?: string;
3373
+ endDate?: string;
3374
+ }) => Promise<XpHistoryResponse>;
3375
+ summary: (options?: {
3376
+ date?: string;
3377
+ timezone?: string;
3378
+ }) => Promise<XpSummaryResponse>;
3379
+ };
3380
+ };
3381
+ /** Telemetry methods (pushMetrics) */
3382
+ telemetry: {
3383
+ pushMetrics: (metrics: Record<string, number>) => Promise<void>;
3384
+ };
3385
+ /** Credits methods (credits management) */
3386
+ credits: {
3387
+ balance: () => Promise<number>;
3388
+ add: (amount: number) => Promise<number>;
3389
+ spend: (amount: number) => Promise<number>;
3390
+ };
3391
+ /** Platform-wide leaderboard methods (fetch, getUserRank) */
3392
+ leaderboard: {
3393
+ fetch: (options?: LeaderboardOptions) => Promise<GameLeaderboardEntry[]>;
3394
+ getUserRank: (gameId: string, userId: string) => Promise<UserRankResponse>;
3395
+ };
3396
+ /** Platform-wide scores methods (submit, getUserScores) */
3397
+ scores: {
3398
+ submit: (gameId: string, score: number, metadata?: Record<string, unknown>) => Promise<ScoreSubmission>;
3399
+ getByUser: (gameId: string, userId: string, options?: {
3400
+ limit?: number;
3401
+ }) => Promise<UserScore$1[]>;
3402
+ };
3403
+ /** Character methods (get, create, update, components) */
3404
+ character: {
3405
+ get: (userId?: string) => Promise<PlayerCharacter | null>;
3406
+ create: (characterData: CreateCharacterData) => Promise<PlayerCharacter>;
3407
+ update: (updates: UpdateCharacterData) => Promise<PlayerCharacter>;
3408
+ components: {
3409
+ list: (options?: CharacterComponentsOptions & TTLCacheConfig) => Promise<CharacterComponentWithSpriteUrl[]>;
3410
+ clearCache: (key?: string) => void;
3411
+ getCacheKeys: () => string[];
3412
+ };
3413
+ accessories: {
3414
+ equip: (slot: string, componentId: string) => Promise<PlayerCharacterAccessory>;
3415
+ remove: (slot: string) => Promise<{
3416
+ success: boolean;
3417
+ }>;
3418
+ list: () => Promise<PlayerCharacterAccessory[]>;
3419
+ };
3420
+ };
3421
+ /** Sprites methods (templates) */
3422
+ sprites: {
3423
+ templates: {
3424
+ get: (slug: string) => Promise<SpriteTemplateData>;
3425
+ };
3426
+ };
3427
+ /** Realtime methods (token) */
3428
+ realtime: {
3429
+ token: {
3430
+ get: () => Promise<RealtimeTokenResponse>;
3431
+ };
3432
+ open(channel?: string, url?: string): Promise<_playcademy_realtime_server_types.RealtimeChannel>;
3433
+ };
3434
+ /** Achievements methods (list, history, progress) */
3435
+ achievements: {
3436
+ list: (options?: TTLCacheConfig) => Promise<AchievementCurrent[]>;
3437
+ history: {
3438
+ list: (queryOptions?: {
3439
+ limit?: number;
3440
+ }, cacheOptions?: TTLCacheConfig) => Promise<AchievementHistoryEntry[]>;
3441
+ };
3442
+ progress: {
3443
+ submit: (achievementId: string) => Promise<AchievementProgressResponse>;
3444
+ };
3445
+ };
3446
+ /** Auto-initializes a PlaycademyClient with context from the environment */
3447
+ static init: typeof init;
3448
+ /** Authenticates a user with email and password */
3449
+ static login: typeof login;
3450
+ /** Static identity utilities for OAuth operations */
3451
+ static identity: {
3452
+ parseOAuthState: typeof parseOAuthState;
3453
+ };
3454
+ }
3455
+
3456
+ /**
3457
+ * @fileoverview Playcademy Messaging System
3458
+ *
3459
+ * This file implements a unified messaging system for the Playcademy platform that handles
3460
+ * communication between different contexts:
3461
+ *
3462
+ * 1. **Iframe-to-Parent Communication**: When games run inside iframes (production/development),
3463
+ * they need to communicate with the parent window using postMessage API
3464
+ *
3465
+ * 2. **Local Communication**: When games run in the same context (local development),
3466
+ * they use CustomEvents for internal messaging
3467
+ *
3468
+ * The system automatically detects the runtime environment and chooses the appropriate
3469
+ * transport method, abstracting this complexity from the developer.
3470
+ *
3471
+ * **Architecture Overview**:
3472
+ * - Games run in iframes for security and isolation
3473
+ * - Parent window (Playcademy shell) manages game lifecycle
3474
+ * - Messages flow bidirectionally between parent and iframe
3475
+ * - Local development mode simulates this architecture without iframes
3476
+ */
3477
+
3478
+ /**
3479
+ * Enumeration of all message types used in the Playcademy messaging system.
3480
+ *
3481
+ * **Message Flow Patterns**:
3482
+ *
3483
+ * **Parent → Game (Overworld → Game)**:
3484
+ * - INIT: Provides game with authentication token and configuration
3485
+ * - TOKEN_REFRESH: Updates game's authentication token before expiry
3486
+ * - PAUSE/RESUME: Controls game execution state
3487
+ * - FORCE_EXIT: Immediately terminates the game
3488
+ * - OVERLAY: Shows/hides UI overlays over the game
3489
+ *
3490
+ * **Game → Parent (Game → Overworld)**:
3491
+ * - READY: Game has loaded and is ready to receive messages
3492
+ * - EXIT: Game requests to be closed (user clicked exit, game ended, etc.)
3493
+ * - TELEMETRY: Game reports performance metrics (FPS, memory usage, etc.)
3494
+ */
3495
+ declare enum MessageEvents {
3496
+ /**
3497
+ * Initializes the game with authentication context and configuration.
3498
+ * Sent immediately after game iframe loads.
3499
+ * Payload:
3500
+ * - `baseUrl`: string
3501
+ * - `token`: string
3502
+ * - `gameId`: string
3503
+ */
3504
+ INIT = "PLAYCADEMY_INIT",
3505
+ /**
3506
+ * Updates the game's authentication token before it expires.
3507
+ * Sent periodically to maintain valid authentication.
3508
+ * Payload:
3509
+ * - `token`: string
3510
+ * - `exp`: number
3511
+ */
3512
+ TOKEN_REFRESH = "PLAYCADEMY_TOKEN_REFRESH",
3513
+ /**
3514
+ * Pauses game execution (e.g., when user switches tabs).
3515
+ * Game should pause timers, animations, and user input.
3516
+ * Payload: void
3517
+ */
3518
+ PAUSE = "PLAYCADEMY_PAUSE",
3519
+ /**
3520
+ * Resumes game execution after being paused.
3521
+ * Game should restore timers, animations, and user input.
3522
+ * Payload: void
3523
+ */
3524
+ RESUME = "PLAYCADEMY_RESUME",
3525
+ /**
3526
+ * Forces immediate game termination (emergency exit).
3527
+ * Game should clean up resources and exit immediately.
3528
+ * Payload: void
3529
+ */
3530
+ FORCE_EXIT = "PLAYCADEMY_FORCE_EXIT",
3531
+ /**
3532
+ * Shows or hides UI overlays over the game.
3533
+ * Game may need to pause or adjust rendering accordingly.
3534
+ * Payload: boolean (true = show overlay, false = hide overlay)
3535
+ */
3536
+ OVERLAY = "PLAYCADEMY_OVERLAY",
3537
+ /**
3538
+ * Game has finished loading and is ready to receive messages.
3539
+ * Sent once after game initialization is complete.
3540
+ * Payload: void
3541
+ */
3542
+ READY = "PLAYCADEMY_READY",
3543
+ /**
3544
+ * Game requests to be closed/exited.
3545
+ * Sent when user clicks exit button or game naturally ends.
3546
+ * Payload: void
3547
+ */
3548
+ EXIT = "PLAYCADEMY_EXIT",
3549
+ /**
3550
+ * Game reports performance telemetry data.
3551
+ * Sent periodically for monitoring and analytics.
3552
+ * Payload:
3553
+ * - `fps`: number
3554
+ * - `mem`: number
3555
+ */
3556
+ TELEMETRY = "PLAYCADEMY_TELEMETRY",
3557
+ /**
3558
+ * Game reports key events to parent.
3559
+ * Sent when certain keys are pressed within the game iframe.
3560
+ * Payload:
3561
+ * - `key`: string
3562
+ * - `code?`: string
3563
+ * - `type`: 'keydown' | 'keyup'
3564
+ */
3565
+ KEY_EVENT = "PLAYCADEMY_KEY_EVENT",
3566
+ /**
3567
+ * Notifies about authentication state changes.
3568
+ * Can be sent in both directions depending on auth flow.
3569
+ * Payload:
3570
+ * - `authenticated`: boolean
3571
+ * - `user`: UserInfo | null
3572
+ * - `error`: Error | null
3573
+ */
3574
+ AUTH_STATE_CHANGE = "PLAYCADEMY_AUTH_STATE_CHANGE",
3575
+ /**
3576
+ * OAuth callback data from popup/new-tab windows.
3577
+ * Sent from popup window back to parent after OAuth completes.
3578
+ * Payload:
3579
+ * - `code`: string (OAuth authorization code)
3580
+ * - `state`: string (OAuth state for CSRF protection)
3581
+ * - `error`: string | null (OAuth error if any)
3582
+ */
3583
+ AUTH_CALLBACK = "PLAYCADEMY_AUTH_CALLBACK"
3584
+ }
3585
+ /**
3586
+ * Type definition for message handler functions.
3587
+ * These functions are called when a specific message type is received.
3588
+ *
3589
+ * @template T - The type of payload data the handler expects
3590
+ * @param payload - The data sent with the message
3591
+ */
3592
+ type MessageHandler<T = unknown> = (payload: T) => void;
3593
+ /**
3594
+ * Type mapping that defines the payload structure for each message type.
3595
+ * This ensures type safety when sending and receiving messages.
3596
+ *
3597
+ * **Usage Examples**:
3598
+ * ```typescript
3599
+ * // Type-safe message sending
3600
+ * messaging.send(MessageEvents.INIT, { baseUrl: '/api', token: 'abc', gameId: '123' })
3601
+ *
3602
+ * // Type-safe message handling
3603
+ * messaging.listen(MessageEvents.TOKEN_REFRESH, ({ token, exp }) => {
3604
+ * console.log(`New token expires at: ${new Date(exp)}`)
3605
+ * })
3606
+ * ```
3607
+ */
3608
+ type MessageEventMap = {
3609
+ /** Game initialization context with API endpoint, auth token, and game ID */
3610
+ [MessageEvents.INIT]: GameContextPayload;
3611
+ /** Token refresh data with new token and expiration timestamp */
3612
+ [MessageEvents.TOKEN_REFRESH]: TokenRefreshPayload;
3613
+ /** Pause message has no payload data */
3614
+ [MessageEvents.PAUSE]: void;
3615
+ /** Resume message has no payload data */
3616
+ [MessageEvents.RESUME]: void;
3617
+ /** Force exit message has no payload data */
3618
+ [MessageEvents.FORCE_EXIT]: void;
3619
+ /** Overlay visibility state (true = show, false = hide) */
3620
+ [MessageEvents.OVERLAY]: boolean;
3621
+ /** Ready message has no payload data */
3622
+ [MessageEvents.READY]: void;
3623
+ /** Exit message has no payload data */
3624
+ [MessageEvents.EXIT]: void;
3625
+ /** Performance telemetry data */
3626
+ [MessageEvents.TELEMETRY]: TelemetryPayload;
3627
+ /** Key event data */
3628
+ [MessageEvents.KEY_EVENT]: KeyEventPayload;
3629
+ /** Authentication state change notification */
3630
+ [MessageEvents.AUTH_STATE_CHANGE]: AuthStateChangePayload;
3631
+ /** OAuth callback data from popup/new-tab windows */
3632
+ [MessageEvents.AUTH_CALLBACK]: AuthCallbackPayload;
3633
+ };
3634
+ /**
3635
+ * **PlaycademyMessaging Class**
3636
+ *
3637
+ * This is the core messaging system that handles all communication in the Playcademy platform.
3638
+ * It automatically detects the runtime environment and chooses the appropriate transport method.
3639
+ *
3640
+ * **Key Features**:
3641
+ * 1. **Automatic Transport Selection**: Detects iframe vs local context and uses appropriate method
3642
+ * 2. **Type Safety**: Full TypeScript support with payload type checking
3643
+ * 3. **Bidirectional Communication**: Handles both parent→game and game→parent messages
3644
+ * 4. **Event Cleanup**: Proper listener management to prevent memory leaks
3645
+ *
3646
+ * **Transport Methods**:
3647
+ * - **postMessage**: Used for iframe-to-parent communication (production/development)
3648
+ * - **CustomEvent**: Used for local same-context communication (local development)
3649
+ *
3650
+ * **Runtime Detection Logic**:
3651
+ * - If `window.self !== window.top`: We're in an iframe, use postMessage
3652
+ * - If `window.self === window.top`: We're in the same context, use CustomEvent
3653
+ *
3654
+ * **Example Usage**:
3655
+ * ```typescript
3656
+ * // Send a message (automatically chooses transport)
3657
+ * messaging.send(MessageEvents.READY, undefined)
3658
+ *
3659
+ * // Listen for messages (handles both transports)
3660
+ * messaging.listen(MessageEvents.INIT, (payload) => {
3661
+ * console.log('Game initialized with:', payload)
3662
+ * })
3663
+ *
3664
+ * // Clean up listeners
3665
+ * messaging.unlisten(MessageEvents.INIT, handler)
3666
+ * ```
3667
+ */
3668
+ declare class PlaycademyMessaging {
3669
+ /**
3670
+ * Internal storage for message listeners.
3671
+ *
3672
+ * **Structure Explanation**:
3673
+ * - Outer Map: MessageEvents → Map of handlers for that event type
3674
+ * - Inner Map: MessageHandler → Object containing both listener types
3675
+ * - Object: { postMessage: EventListener, customEvent: EventListener }
3676
+ *
3677
+ * **Why Two Listeners Per Handler?**:
3678
+ * Since we don't know at registration time which transport will be used,
3679
+ * we register both a postMessage listener and a CustomEvent listener.
3680
+ * The appropriate one will be triggered based on the runtime context.
3681
+ */
3682
+ private listeners;
3683
+ /**
3684
+ * **Send Message Method**
3685
+ *
3686
+ * Sends a message using the appropriate transport method based on the runtime context.
3687
+ * This is the main public API for sending messages in the Playcademy system.
3688
+ *
3689
+ * **How It Works**:
3690
+ * 1. Analyzes the message type and current runtime context
3691
+ * 2. Determines if we're in an iframe and if this message should use postMessage
3692
+ * 3. Routes to the appropriate transport method (postMessage or CustomEvent)
3693
+ *
3694
+ * **Transport Selection Logic**:
3695
+ * - **postMessage**: Used when game is in iframe and sending to parent, OR when target window is specified
3696
+ * - **CustomEvent**: Used for local/same-context communication
3697
+ *
3698
+ * **Type Safety**:
3699
+ * The generic type parameter `K` ensures that the payload type matches
3700
+ * the expected type for the given message event.
3701
+ *
3702
+ * @template K - The message event type (ensures type safety)
3703
+ * @param type - The message event type to send
3704
+ * @param payload - The data to send with the message (type-checked)
3705
+ * @param options - Optional configuration for message sending
3706
+ *
3707
+ * @example
3708
+ * ```typescript
3709
+ * // Send game ready signal (no payload)
3710
+ * messaging.send(MessageEvents.READY, undefined)
3711
+ *
3712
+ * // Send telemetry data (typed payload)
3713
+ * messaging.send(MessageEvents.TELEMETRY, { fps: 60, mem: 128 })
3714
+ *
3715
+ * // Send to specific iframe window (parent to iframe communication)
3716
+ * messaging.send(MessageEvents.INIT, { baseUrl, token, gameId }, {
3717
+ * target: iframe.contentWindow,
3718
+ * origin: '*'
3719
+ * })
3720
+ *
3721
+ * // TypeScript will error if payload type is wrong
3722
+ * messaging.send(MessageEvents.INIT, "wrong type") // ❌ Error
3723
+ * ```
3724
+ */
3725
+ send<K extends MessageEvents>(type: K, payload: MessageEventMap[K], options?: {
3726
+ target?: Window;
3727
+ origin?: string;
3728
+ }): void;
3729
+ /**
3730
+ * **Listen for Messages Method**
3731
+ *
3732
+ * Registers a message listener that will be called when the specified message type is received.
3733
+ * This method automatically handles both postMessage and CustomEvent sources.
3734
+ *
3735
+ * **Why Register Two Listeners?**:
3736
+ * Since we don't know at registration time which transport method will be used to send
3737
+ * messages, we register listeners for both possible sources:
3738
+ * 1. **postMessage listener**: Handles messages from iframe-to-parent communication
3739
+ * 2. **CustomEvent listener**: Handles messages from local same-context communication
3740
+ *
3741
+ * **Message Processing**:
3742
+ * - **postMessage**: Extracts data from `event.data.payload` or `event.data`
3743
+ * - **CustomEvent**: Extracts data from `event.detail`
3744
+ *
3745
+ * **Type Safety**:
3746
+ * The handler function receives the correctly typed payload based on the message type.
3747
+ *
3748
+ * @template K - The message event type (ensures type safety)
3749
+ * @param type - The message event type to listen for
3750
+ * @param handler - Function to call when the message is received
3751
+ *
3752
+ * @example
3753
+ * ```typescript
3754
+ * // Listen for game initialization
3755
+ * messaging.listen(MessageEvents.INIT, (payload) => {
3756
+ * // payload is automatically typed as GameContextPayload
3757
+ * console.log(`Game ${payload.gameId} initialized`)
3758
+ * console.log(`API base URL: ${payload.baseUrl}`)
3759
+ * })
3760
+ *
3761
+ * // Listen for token refresh
3762
+ * messaging.listen(MessageEvents.TOKEN_REFRESH, ({ token, exp }) => {
3763
+ * // payload is automatically typed as { token: string; exp: number }
3764
+ * updateAuthToken(token)
3765
+ * scheduleTokenRefresh(exp)
3766
+ * })
3767
+ * ```
3768
+ */
3769
+ listen<K extends MessageEvents>(type: K, handler: MessageHandler<MessageEventMap[K]>): void;
3770
+ /**
3771
+ * **Remove Message Listener Method**
3772
+ *
3773
+ * Removes a previously registered message listener to prevent memory leaks and unwanted callbacks.
3774
+ * This method cleans up both the postMessage and CustomEvent listeners that were registered.
3775
+ *
3776
+ * **Why Clean Up Both Listeners?**:
3777
+ * When we registered the listener with `listen()`, we created two browser event listeners:
3778
+ * 1. A 'message' event listener for postMessage communication
3779
+ * 2. A custom event listener for local CustomEvent communication
3780
+ *
3781
+ * Both must be removed to prevent memory leaks and ensure the handler is completely unregistered.
3782
+ *
3783
+ * **Memory Management**:
3784
+ * - Removes both event listeners from the browser
3785
+ * - Cleans up internal tracking maps
3786
+ * - If no more handlers exist for a message type, removes the entire type entry
3787
+ *
3788
+ * **Safe to Call Multiple Times**:
3789
+ * This method is idempotent - calling it multiple times with the same handler is safe.
3790
+ *
3791
+ * @template K - The message event type (ensures type safety)
3792
+ * @param type - The message event type to stop listening for
3793
+ * @param handler - The exact handler function that was passed to listen()
3794
+ *
3795
+ * @example
3796
+ * ```typescript
3797
+ * // Register a handler
3798
+ * const handleInit = (payload) => console.log('Game initialized')
3799
+ * messaging.listen(MessageEvents.INIT, handleInit)
3800
+ *
3801
+ * // Later, remove the handler
3802
+ * messaging.unlisten(MessageEvents.INIT, handleInit)
3803
+ *
3804
+ * // Safe to call multiple times
3805
+ * messaging.unlisten(MessageEvents.INIT, handleInit) // No error
3806
+ * ```
3807
+ */
3808
+ unlisten<K extends MessageEvents>(type: K, handler: MessageHandler<MessageEventMap[K]>): void;
3809
+ /**
3810
+ * **Get Messaging Context Method**
3811
+ *
3812
+ * Analyzes the current runtime environment and message type to determine the appropriate
3813
+ * transport method and configuration for sending messages.
3814
+ *
3815
+ * **Runtime Environment Detection**:
3816
+ * The method detects whether the code is running in an iframe by comparing:
3817
+ * - `window.self`: Reference to the current window
3818
+ * - `window.top`: Reference to the topmost window in the hierarchy
3819
+ *
3820
+ * If they're different, we're in an iframe. If they're the same, we're in the top-level window.
3821
+ *
3822
+ * **Message Direction Analysis**:
3823
+ * Different message types flow in different directions:
3824
+ * - **Game → Parent**: READY, EXIT, TELEMETRY (use postMessage when in iframe)
3825
+ * - **Parent → Game**: INIT, TOKEN_REFRESH, PAUSE, etc. (use CustomEvent in local dev, or postMessage with target)
3826
+ *
3827
+ * **Cross-Context Communication**:
3828
+ * The messaging system supports cross-context targeting through the optional `target` parameter.
3829
+ * When a target window is specified, postMessage is used regardless of the current context.
3830
+ * This enables parent-to-iframe communication through the unified messaging API.
3831
+ *
3832
+ * **Transport Selection Logic**:
3833
+ * - **postMessage**: Used when game is in iframe AND sending to parent, OR when target window is specified
3834
+ * - **CustomEvent**: Used for all other cases (local development, same-context communication)
3835
+ *
3836
+ * **Security Considerations**:
3837
+ * The origin is currently set to '*' for development convenience, but should be
3838
+ * configurable for production security.
3839
+ *
3840
+ * @param eventType - The message event type being sent
3841
+ * @returns Configuration object with transport method and target information
3842
+ *
3843
+ * @example
3844
+ * ```typescript
3845
+ * // In iframe sending READY to parent
3846
+ * const context = getMessagingContext(MessageEvents.READY)
3847
+ * // Returns: { shouldUsePostMessage: true, target: window.parent, origin: '*' }
3848
+ *
3849
+ * // In same context sending INIT
3850
+ * const context = getMessagingContext(MessageEvents.INIT)
3851
+ * // Returns: { shouldUsePostMessage: false, target: undefined, origin: '*' }
3852
+ * ```
3853
+ */
3854
+ private getMessagingContext;
3855
+ /**
3856
+ * **Send Via PostMessage Method**
3857
+ *
3858
+ * Sends a message using the browser's postMessage API for iframe-to-parent communication.
3859
+ * This method is used when the game is running in an iframe and needs to communicate
3860
+ * with the parent window (the Playcademy shell).
3861
+ *
3862
+ * **PostMessage Protocol**:
3863
+ * The postMessage API is the standard way for iframes to communicate with their parent.
3864
+ * It's secure, cross-origin capable, and designed specifically for this use case.
3865
+ *
3866
+ * **Message Structure**:
3867
+ * The method creates a message object with the following structure:
3868
+ * - `type`: The message event type (e.g., 'PLAYCADEMY_READY')
3869
+ * - `payload`: The message data (if any)
3870
+ *
3871
+ * **Payload Handling**:
3872
+ * - **All payloads**: Wrapped in a `payload` property for consistency (e.g., { type, payload: data })
3873
+ * - **Undefined payloads**: Only the type is sent (e.g., { type })
3874
+ *
3875
+ * **Security**:
3876
+ * The origin parameter controls which domains can receive the message.
3877
+ * Currently set to '*' for development, but should be restricted in production.
3878
+ *
3879
+ * @template K - The message event type (ensures type safety)
3880
+ * @param type - The message event type to send
3881
+ * @param payload - The data to send with the message
3882
+ * @param target - The target window (defaults to parent window)
3883
+ * @param origin - The allowed origin for the message (defaults to '*')
3884
+ *
3885
+ * @example
3886
+ * ```typescript
3887
+ * // Send ready signal (no payload)
3888
+ * sendViaPostMessage(MessageEvents.READY, undefined)
3889
+ * // Sends: { type: 'PLAYCADEMY_READY' }
3890
+ *
3891
+ * // Send telemetry data (object payload)
3892
+ * sendViaPostMessage(MessageEvents.TELEMETRY, { fps: 60, mem: 128 })
3893
+ * // Sends: { type: 'PLAYCADEMY_TELEMETRY', payload: { fps: 60, mem: 128 } }
3894
+ *
3895
+ * // Send overlay state (primitive payload)
3896
+ * sendViaPostMessage(MessageEvents.OVERLAY, true)
3897
+ * // Sends: { type: 'PLAYCADEMY_OVERLAY', payload: true }
3898
+ * ```
3899
+ */
3900
+ private sendViaPostMessage;
3901
+ /**
3902
+ * **Send Via CustomEvent Method**
3903
+ *
3904
+ * Sends a message using the browser's CustomEvent API for local same-context communication.
3905
+ * This method is used when both the sender and receiver are in the same window context,
3906
+ * typically during local development or when the parent needs to send messages to the game.
3907
+ *
3908
+ * **CustomEvent Protocol**:
3909
+ * CustomEvent is a browser API for creating and dispatching custom events within the same
3910
+ * window context. It's simpler than postMessage but only works within the same origin/context.
3911
+ *
3912
+ * **Event Structure**:
3913
+ * - **type**: The event name (e.g., 'PLAYCADEMY_INIT')
3914
+ * - **detail**: The payload data attached to the event
3915
+ *
3916
+ * **When This Is Used**:
3917
+ * - Local development when game and shell run in the same context
3918
+ * - Parent-to-game communication (INIT, TOKEN_REFRESH, PAUSE, etc.)
3919
+ * - Any scenario where postMessage isn't needed
3920
+ *
3921
+ * **Event Bubbling**:
3922
+ * CustomEvents are dispatched on the window object and can be listened to by any
3923
+ * code in the same context using `addEventListener(type, handler)`.
3924
+ *
3925
+ * @template K - The message event type (ensures type safety)
3926
+ * @param type - The message event type to send (becomes the event name)
3927
+ * @param payload - The data to send with the message (stored in event.detail)
3928
+ *
3929
+ * @example
3930
+ * ```typescript
3931
+ * // Send initialization data
3932
+ * sendViaCustomEvent(MessageEvents.INIT, {
3933
+ * baseUrl: '/api',
3934
+ * token: 'abc123',
3935
+ * gameId: 'game-456'
3936
+ * })
3937
+ * // Creates: CustomEvent('PLAYCADEMY_INIT', { detail: { baseUrl, token, gameId } })
3938
+ *
3939
+ * // Send pause signal
3940
+ * sendViaCustomEvent(MessageEvents.PAUSE, undefined)
3941
+ * // Creates: CustomEvent('PLAYCADEMY_PAUSE', { detail: undefined })
3942
+ *
3943
+ * // Listeners can access the data via event.detail:
3944
+ * window.addEventListener('PLAYCADEMY_INIT', (event) => {
3945
+ * console.log(event.detail.gameId) // 'game-456'
3946
+ * })
3947
+ * ```
3948
+ */
3949
+ private sendViaCustomEvent;
3950
+ }
3951
+ /**
3952
+ * **Playcademy Messaging Singleton**
3953
+ *
3954
+ * This is the main messaging instance used throughout the Playcademy platform.
3955
+ * It's exported as a singleton to ensure consistent communication across all parts
3956
+ * of the application.
3957
+ *
3958
+ * **Why a Singleton?**:
3959
+ * - Ensures all parts of the app use the same messaging instance
3960
+ * - Prevents conflicts between multiple messaging systems
3961
+ * - Simplifies the API - no need to pass instances around
3962
+ * - Maintains consistent event listener management
3963
+ *
3964
+ * **Usage in Different Contexts**:
3965
+ *
3966
+ * **In Games**:
3967
+ * ```typescript
3968
+ * import { messaging, MessageEvents } from '@playcademy/sdk'
3969
+ *
3970
+ * // Tell parent we're ready
3971
+ * messaging.send(MessageEvents.READY, undefined)
3972
+ *
3973
+ * // Listen for pause/resume
3974
+ * messaging.listen(MessageEvents.PAUSE, () => game.pause())
3975
+ * messaging.listen(MessageEvents.RESUME, () => game.resume())
3976
+ * ```
3977
+ *
3978
+ * **In Parent Shell**:
3979
+ * ```typescript
3980
+ * import { messaging, MessageEvents } from '@playcademy/sdk'
3981
+ *
3982
+ * // Send initialization data to game
3983
+ * messaging.send(MessageEvents.INIT, { baseUrl, token, gameId })
3984
+ *
3985
+ * // Listen for game events
3986
+ * messaging.listen(MessageEvents.EXIT, () => closeGame())
3987
+ * messaging.listen(MessageEvents.READY, () => showGame())
3988
+ * ```
3989
+ *
3990
+ * **Automatic Transport Selection**:
3991
+ * The messaging system automatically chooses the right transport method:
3992
+ * - Uses postMessage when game is in iframe sending to parent
3993
+ * - Uses CustomEvent for local development and parent-to-game communication
3
3994
  *
4
- * This file serves as the primary entry point for the Playcademy SDK,
5
- * providing access to the main client class and supporting utilities.
3995
+ * **Type Safety**:
3996
+ * All message sending and receiving is fully type-safe with TypeScript.
6
3997
  */
7
- export { PlaycademyClient } from './core/client';
8
- export { messaging, MessageEvents } from './messaging';
9
- export { AuthProvider } from './types';
10
- export type { DevUploadEvent, DevUploadHooks } from './types';
3998
+ declare const messaging: PlaycademyMessaging;
3999
+
4000
+ export { AuthProvider, BADGES, CURRENCIES, MessageEvents, PlaycademyClient, messaging };
4001
+ export type { DevUploadEvent, DevUploadHooks };