@playcademy/sdk 0.2.2 → 0.2.4

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.
package/dist/types.d.ts CHANGED
@@ -1,7 +1,7 @@
1
+ import { InferSelectModel } from 'drizzle-orm';
1
2
  import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
3
+ import * as drizzle_zod from 'drizzle-zod';
2
4
  import { z } from 'zod';
3
- import * as _playcademy_timeback_types from '@playcademy/timeback/types';
4
- import { CourseConfig, OrganizationConfig, ComponentConfig, ResourceConfig, ComponentResourceConfig } from '@playcademy/timeback/types';
5
5
  import { AUTH_PROVIDER_IDS } from '@playcademy/constants';
6
6
 
7
7
  /**
@@ -19,7 +19,659 @@ declare function parseOAuthState(state: string): {
19
19
  data?: Record<string, string>;
20
20
  };
21
21
 
22
- declare const userRoleEnum: drizzle_orm_pg_core.PgEnum<["admin", "player", "developer"]>;
22
+ /**
23
+ * Game Types
24
+ *
25
+ * Literal types and API DTOs. Database row types are in @playcademy/data/types.
26
+ *
27
+ * @module types/game
28
+ */
29
+ type GameType = 'hosted' | 'external';
30
+ type GamePlatform = 'web' | 'godot' | 'unity' | (string & {});
31
+ /**
32
+ * Game manifest file format (manifest.json).
33
+ * Note: createdAt is a string here because it's parsed from JSON file.
34
+ */
35
+ interface ManifestV1 {
36
+ version: string;
37
+ platform: string;
38
+ createdAt: string;
39
+ }
40
+ interface DomainValidationRecords {
41
+ ownership?: {
42
+ name?: string;
43
+ value?: string;
44
+ type?: string;
45
+ };
46
+ ssl?: Array<{
47
+ txt_name?: string;
48
+ txt_value?: string;
49
+ }>;
50
+ }
51
+
52
+ /** Permitted HTTP verbs */
53
+ type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
54
+
55
+ /**
56
+ * User Types
57
+ *
58
+ * Enums, DTOs and API response types. Database row types are in @playcademy/data/types.
59
+ *
60
+ * @module types/user
61
+ */
62
+ type UserRoleEnumType = 'admin' | 'player' | 'developer';
63
+ type DeveloperStatusEnumType = 'none' | 'pending' | 'approved';
64
+ type DeveloperStatusValue = DeveloperStatusEnumType;
65
+ type TimebackUserRole = 'administrator' | 'aide' | 'guardian' | 'parent' | 'proctor' | 'relative' | 'student' | 'teacher';
66
+ type TimebackOrgType = 'department' | 'school' | 'district' | 'local' | 'state' | 'national';
67
+ interface UserEnrollment {
68
+ gameId?: string;
69
+ courseId: string;
70
+ grade: number;
71
+ subject: string;
72
+ orgId?: string;
73
+ }
74
+ interface UserOrganization {
75
+ id: string;
76
+ name: string | null;
77
+ type: TimebackOrgType | string;
78
+ isPrimary: boolean;
79
+ }
80
+ interface TimebackStudentProfile {
81
+ role: TimebackUserRole;
82
+ organizations: UserOrganization[];
83
+ }
84
+ interface UserTimebackData extends TimebackStudentProfile {
85
+ id: string;
86
+ enrollments: UserEnrollment[];
87
+ }
88
+ /**
89
+ * OpenID Connect UserInfo claims (NOT a database row).
90
+ */
91
+ interface UserInfo {
92
+ sub: string;
93
+ email: string;
94
+ name: string | null;
95
+ email_verified?: boolean;
96
+ given_name?: string;
97
+ family_name?: string;
98
+ issuer?: string;
99
+ lti_roles?: unknown;
100
+ lti_context?: unknown;
101
+ lti_resource_link?: unknown;
102
+ timeback_id?: string;
103
+ }
104
+ interface DeveloperStatusResponse {
105
+ status: DeveloperStatusEnumType;
106
+ }
107
+ /**
108
+ * Authenticated user for API responses.
109
+ * Differs from UserRow: omits timebackId, adds hasTimebackAccount and timeback.
110
+ */
111
+ interface AuthenticatedUser {
112
+ id: string;
113
+ email: string;
114
+ emailVerified: boolean;
115
+ name: string | null;
116
+ image: string | null;
117
+ username: string | null;
118
+ role: UserRoleEnumType;
119
+ developerStatus: DeveloperStatusEnumType;
120
+ characterCreated: boolean;
121
+ createdAt: Date;
122
+ updatedAt: Date;
123
+ hasTimebackAccount: boolean;
124
+ timeback?: UserTimebackData;
125
+ }
126
+ interface GameUser {
127
+ id: string;
128
+ name: string | null;
129
+ role: UserRoleEnumType;
130
+ username: string | null;
131
+ email: string | null;
132
+ timeback?: UserTimebackData;
133
+ }
134
+
135
+ /**
136
+ * Leaderboard Types
137
+ *
138
+ * @module types/leaderboard
139
+ */
140
+ type LeaderboardTimeframe = 'all_time' | 'monthly' | 'weekly' | 'daily';
141
+ interface LeaderboardOptions {
142
+ timeframe?: LeaderboardTimeframe;
143
+ limit?: number;
144
+ offset?: number;
145
+ gameId?: string;
146
+ }
147
+ interface LeaderboardEntry {
148
+ rank: number;
149
+ userId: string;
150
+ username: string;
151
+ userImage?: string | null;
152
+ score: number;
153
+ achievedAt: Date;
154
+ metadata?: Record<string, unknown>;
155
+ gameId?: string;
156
+ gameTitle?: string;
157
+ gameSlug?: string;
158
+ }
159
+ interface UserRank {
160
+ rank: number;
161
+ totalPlayers: number;
162
+ score: number;
163
+ percentile: number;
164
+ }
165
+ interface UserRankResponse {
166
+ rank: number;
167
+ score: number;
168
+ userId: string;
169
+ }
170
+ interface UserScore {
171
+ id: string;
172
+ score: number;
173
+ achievedAt: Date;
174
+ metadata?: Record<string, unknown>;
175
+ gameId: string;
176
+ gameTitle: string;
177
+ gameSlug: string;
178
+ }
179
+ /**
180
+ * Leaderboard entry with required game context.
181
+ * Used when fetching leaderboards for a specific game.
182
+ */
183
+ interface GameLeaderboardEntry {
184
+ rank: number;
185
+ userId: string;
186
+ username: string;
187
+ userImage?: string | null;
188
+ score: number;
189
+ achievedAt: Date;
190
+ metadata?: Record<string, unknown>;
191
+ gameId: string;
192
+ gameTitle: string;
193
+ gameSlug: string;
194
+ }
195
+
196
+ /**
197
+ * Achievement Types
198
+ *
199
+ * @module types/achievement
200
+ */
201
+ type AchievementScopeType = 'daily' | 'weekly' | 'monthly' | 'yearly' | 'game' | 'global' | 'map' | 'level' | 'event';
202
+ declare enum AchievementCompletionType {
203
+ TIME_PLAYED_SESSION = "time_played_session",
204
+ INTERACTION = "interaction",
205
+ LEADERBOARD_RANK = "leaderboard_rank",
206
+ FIRST_SCORE = "first_score",
207
+ PERSONAL_BEST = "personal_best"
208
+ }
209
+ interface AchievementCurrent {
210
+ id: string;
211
+ title: string;
212
+ description?: string | null;
213
+ scope: AchievementScopeType;
214
+ rewardCredits: number;
215
+ limit: number;
216
+ completionType: string;
217
+ completionConfig: unknown;
218
+ target: unknown;
219
+ active: boolean;
220
+ createdAt?: Date | null;
221
+ updatedAt?: Date | null;
222
+ status: 'available' | 'completed';
223
+ scopeKey: string;
224
+ windowStart: string;
225
+ windowEnd: string;
226
+ }
227
+ interface AchievementWithStatus {
228
+ id: string;
229
+ title: string;
230
+ description: string | null;
231
+ scope: AchievementScopeType;
232
+ rewardCredits: number;
233
+ limit: number;
234
+ completionType: string;
235
+ completionConfig: unknown;
236
+ target: unknown;
237
+ active: boolean;
238
+ createdAt: Date | null;
239
+ updatedAt: Date | null;
240
+ status: 'available' | 'completed';
241
+ scopeKey: string;
242
+ windowStart?: string;
243
+ windowEnd?: string;
244
+ }
245
+ interface AchievementHistoryEntry {
246
+ achievementId: string;
247
+ title: string;
248
+ rewardCredits: number;
249
+ createdAt: Date;
250
+ scopeKey: string;
251
+ }
252
+ interface AchievementProgressResponse {
253
+ achievementId: string;
254
+ status: 'completed' | 'already_completed';
255
+ rewardCredits: number;
256
+ scopeKey: string;
257
+ createdAt: Date;
258
+ }
259
+
260
+ /**
261
+ * TimeBack Enums & Literal Types
262
+ *
263
+ * Basic type definitions used throughout the TimeBack integration.
264
+ *
265
+ * @module types/timeback/types
266
+ */
267
+ /**
268
+ * Valid TimeBack subject values for course configuration.
269
+ * These are the supported subject values for OneRoster courses.
270
+ */
271
+ type TimebackSubject = 'Reading' | 'Language' | 'Vocabulary' | 'Social Studies' | 'Writing' | 'Science' | 'FastMath' | 'Math' | 'None';
272
+ /**
273
+ * Grade levels per AE OneRoster GradeEnum.
274
+ * -1 = Pre-K, 0 = Kindergarten, 1-12 = Grades 1-12, 13 = AP
275
+ */
276
+ type TimebackGrade = -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13;
277
+ /**
278
+ * Valid Caliper subject values.
279
+ * Matches OneRoster subjects, with "None" as a Caliper-specific fallback.
280
+ */
281
+ type CaliperSubject = 'Reading' | 'Language' | 'Vocabulary' | 'Social Studies' | 'Writing' | 'Science' | 'FastMath' | 'Math' | 'None';
282
+ /**
283
+ * OneRoster organization types.
284
+ */
285
+ type OrganizationType = 'department' | 'school' | 'district' | 'local' | 'state' | 'national';
286
+ /**
287
+ * Lesson types for PowerPath integration.
288
+ */
289
+ type LessonType = 'powerpath-100' | 'quiz' | 'test-out' | 'placement' | 'unit-test' | 'alpha-read-article' | null;
290
+
291
+ /**
292
+ * TimeBack Configuration Types
293
+ *
294
+ * Configuration interfaces for Organization, Course, Component,
295
+ * Resource, and complete TimeBack setup.
296
+ *
297
+ * @module types/timeback/config
298
+ */
299
+
300
+ /**
301
+ * Organization configuration for TimeBack (user input - optionals allowed)
302
+ */
303
+ interface OrganizationConfig {
304
+ /** Display name for your organization */
305
+ name?: string;
306
+ /** Organization type */
307
+ type?: OrganizationType;
308
+ /** Unique identifier (defaults to Playcademy's org) */
309
+ identifier?: string;
310
+ }
311
+ /**
312
+ * Course goals for daily student targets
313
+ */
314
+ interface CourseGoals {
315
+ /** Target XP students should earn per day */
316
+ dailyXp?: number;
317
+ /** Target lessons per day */
318
+ dailyLessons?: number;
319
+ /** Target active minutes per day */
320
+ dailyActiveMinutes?: number;
321
+ /** Target accuracy percentage */
322
+ dailyAccuracy?: number;
323
+ /** Target mastered units per day */
324
+ dailyMasteredUnits?: number;
325
+ }
326
+ /**
327
+ * Course metrics and totals
328
+ */
329
+ interface CourseMetrics {
330
+ /** Total XP available in the course */
331
+ totalXp?: number;
332
+ /** Total lessons/activities in the course */
333
+ totalLessons?: number;
334
+ /** Total number of grade levels covered by this course */
335
+ totalGrades?: number;
336
+ /** The type of course (e.g. 'optional', 'hole-filling', 'base') */
337
+ courseType?: 'base' | 'hole-filling' | 'optional' | 'Base' | 'Hole-Filling' | 'Optional';
338
+ /** Indicates whether the course is supplemental content */
339
+ isSupplemental?: boolean;
340
+ }
341
+ /**
342
+ * Complete course metadata structure
343
+ */
344
+ interface CourseMetadata {
345
+ /** Define the type of course and priority for the student */
346
+ courseType?: 'base' | 'hole-filling' | 'optional';
347
+ /** Boolean value to determine if a course is supplemental to a base course */
348
+ isSupplemental?: boolean;
349
+ /** Boolean value to determine if a course is custom to an individual student */
350
+ isCustom?: boolean;
351
+ /** Signals whether a course is in production with students */
352
+ publishStatus?: 'draft' | 'testing' | 'published' | 'deactivated';
353
+ /** Who to contact when issues reported with questions */
354
+ contactEmail?: string;
355
+ /** Primary app identifier */
356
+ primaryApp?: string;
357
+ /** Learning goals for students */
358
+ goals?: CourseGoals;
359
+ /** Course metrics and totals */
360
+ metrics?: CourseMetrics;
361
+ /** Vendor-specific metadata (e.g., AlphaLearn) */
362
+ [key: string]: unknown;
363
+ }
364
+ /**
365
+ * Course configuration for TimeBack (user input)
366
+ */
367
+ interface CourseConfig {
368
+ /** Allocated OneRoster sourcedId (set after creation) */
369
+ sourcedId?: string;
370
+ /** Course title (defaults to game name) */
371
+ title?: string;
372
+ /** Subjects (REQUIRED for TimeBack integration) */
373
+ subjects: TimebackSubject[];
374
+ /** Used when recording progress/sessions if not explicitly specified per event. */
375
+ defaultSubject?: TimebackSubject;
376
+ /** Grade levels (REQUIRED for TimeBack integration) */
377
+ grades: TimebackGrade[];
378
+ /** Short course code (optional, auto-generated) */
379
+ courseCode?: string;
380
+ /** Course level (auto-derived from grades) */
381
+ level?: 'Elementary' | 'Middle' | 'High' | 'AP' | string;
382
+ /** Grading system */
383
+ gradingScheme?: 'STANDARD';
384
+ /** Total XP available in this course (REQUIRED before setup) */
385
+ totalXp?: number | null;
386
+ /** Total masterable units in this course (REQUIRED before setup) */
387
+ masterableUnits?: number | null;
388
+ /** Custom Playcademy metadata */
389
+ metadata?: CourseMetadata;
390
+ }
391
+ /**
392
+ * Component configuration for TimeBack (user input)
393
+ */
394
+ interface ComponentConfig {
395
+ /** Component title (defaults to "{course.title} Activities") */
396
+ title?: string;
397
+ /** Display order */
398
+ sortOrder?: number;
399
+ /** Required prior components */
400
+ prerequisites?: string[];
401
+ /** How prerequisites work */
402
+ prerequisiteCriteria?: 'ALL' | 'ANY';
403
+ }
404
+ /**
405
+ * Playcademy-specific resource extensions
406
+ */
407
+ interface PlaycademyResourceMetadata {
408
+ /** Mastery configuration for tracking discrete learning units */
409
+ mastery?: {
410
+ /** Total number of masterable units in the resource */
411
+ masterableUnits: number;
412
+ /** Type of mastery unit for semantic clarity */
413
+ unitType?: 'level' | 'rank' | 'skill' | 'module';
414
+ };
415
+ }
416
+ /**
417
+ * Resource configuration for TimeBack (user input)
418
+ */
419
+ interface ResourceConfig {
420
+ /** Resource title (defaults to "{course.title} Game") */
421
+ title?: string;
422
+ /** Internal resource ID (auto-generated from package.json) */
423
+ vendorResourceId?: string;
424
+ /** Vendor identifier */
425
+ vendorId?: string;
426
+ /** Application identifier */
427
+ applicationId?: string;
428
+ /** Resource roles */
429
+ roles?: ('primary' | 'secondary')[];
430
+ /** Resource importance */
431
+ importance?: 'primary' | 'secondary';
432
+ /** Interactive resource metadata */
433
+ metadata?: {
434
+ /** Resource type */
435
+ type?: 'interactive';
436
+ /** Launch URL (defaults to Playcademy game URL) */
437
+ launchUrl?: string;
438
+ /** Platform name */
439
+ toolProvider?: string;
440
+ /** Teaching method */
441
+ instructionalMethod?: 'exploratory' | 'direct-instruction';
442
+ /** Subject area */
443
+ subject?: TimebackSubject;
444
+ /** Target grades */
445
+ grades?: TimebackGrade[];
446
+ /** Content language */
447
+ language?: string;
448
+ /** Base XP for completion */
449
+ xp?: number;
450
+ /** Playcademy-specific extensions */
451
+ playcademy?: PlaycademyResourceMetadata;
452
+ };
453
+ }
454
+ /**
455
+ * Component Resource link configuration (user input)
456
+ */
457
+ interface ComponentResourceConfig {
458
+ /** Link title (defaults to "{resource.title} Activity") */
459
+ title?: string;
460
+ /** Display order */
461
+ sortOrder?: number;
462
+ /** Lesson type for PowerPath integration */
463
+ lessonType?: LessonType;
464
+ }
465
+ interface TimebackCourseConfig {
466
+ subject: string;
467
+ grade: number;
468
+ }
469
+
470
+ /**
471
+ * TimeBack Client SDK DTOs
472
+ *
473
+ * Data transfer objects for the TimeBack client SDK including
474
+ * progress tracking, session management, and activity completion.
475
+ *
476
+ * Note: TimebackClientConfig lives in @playcademy/timeback as it's
477
+ * SDK configuration, not a DTO.
478
+ *
479
+ * @module types/timeback/client
480
+ */
481
+
482
+ /**
483
+ * Activity data for ending an activity
484
+ */
485
+ interface ActivityData {
486
+ /** Unique activity identifier (required) */
487
+ activityId: string;
488
+ /** Grade level for this activity (required for multi-grade course routing) */
489
+ grade: number;
490
+ /** Subject area (required for multi-grade course routing) */
491
+ subject: CaliperSubject;
492
+ /** Activity display name (optional) */
493
+ activityName?: string;
494
+ /** Course identifier (auto-filled from config if not provided) */
495
+ courseId?: string;
496
+ /** Course display name (auto-filled from config if not provided) */
497
+ courseName?: string;
498
+ /** Student email address (optional) */
499
+ studentEmail?: string;
500
+ /** Application name for Caliper events (defaults to 'Game') */
501
+ appName?: string;
502
+ /** Sensor URL for Caliper events (defaults to baseUrl) */
503
+ sensorUrl?: string;
504
+ }
505
+ /**
506
+ * Score data with optional XP override for ending an activity
507
+ */
508
+ interface EndActivityScoreData {
509
+ /** Number of questions answered correctly */
510
+ correctQuestions: number;
511
+ /** Total number of questions */
512
+ totalQuestions: number;
513
+ /** Optional XP override - bypasses automatic XP calculation */
514
+ xpAwarded?: number;
515
+ /** Number of learning units mastered */
516
+ masteredUnits?: number;
517
+ }
518
+
519
+ /**
520
+ * TimeBack API Request/Response Types
521
+ *
522
+ * Types for TimeBack API endpoints including XP tracking,
523
+ * setup, verification, and activity completion.
524
+ *
525
+ * @module types/timeback/api
526
+ */
527
+
528
+ interface TodayXpResponse {
529
+ xp: number;
530
+ date: string;
531
+ }
532
+ interface TotalXpResponse {
533
+ totalXp: number;
534
+ }
535
+ interface XpHistoryResponse {
536
+ history: Array<{
537
+ date: string;
538
+ xp: number;
539
+ }>;
540
+ }
541
+ interface PopulateStudentResponse {
542
+ status: string;
543
+ message?: string;
544
+ }
545
+ interface GameTimebackIntegration {
546
+ id: string;
547
+ gameId: string;
548
+ courseId: string;
549
+ grade: number;
550
+ subject: string;
551
+ totalXp?: number | null;
552
+ lastVerifiedAt?: Date | null;
553
+ createdAt: Date;
554
+ updatedAt: Date;
555
+ }
556
+ interface EndActivityResponse {
557
+ status: 'ok';
558
+ courseId: string;
559
+ xpAwarded: number;
560
+ masteredUnits?: number;
561
+ pctCompleteApp?: number;
562
+ scoreStatus?: string;
563
+ inProgress?: string;
564
+ }
565
+
566
+ /**
567
+ * Inventory & Shop Types
568
+ *
569
+ * Literal types for inventory system. Database row types are in @playcademy/data/types.
570
+ *
571
+ * @module types/inventory
572
+ */
573
+ /**
574
+ * Item categories available on the platform.
575
+ */
576
+ type ItemType = 'currency' | 'badge' | 'trophy' | 'collectible' | 'consumable' | 'unlock' | 'upgrade' | 'accessory' | 'other';
577
+
578
+ /**
579
+ * Map & Placement Types
580
+ *
581
+ * Literal types and JSON shapes for maps. Database row types are in @playcademy/data/types.
582
+ *
583
+ * @module types/map
584
+ */
585
+ /**
586
+ * Allowed map interaction types.
587
+ */
588
+ type InteractionType = 'game_entry' | 'game_registry' | 'info' | 'teleport' | 'door_in' | 'door_out' | 'npc_interaction' | 'quest_trigger';
589
+ /**
590
+ * Metadata for interactive map elements.
591
+ */
592
+ interface MapElementMetadata {
593
+ description?: string;
594
+ title?: string;
595
+ targetMapIdentifier?: string;
596
+ targetSpawnTileX?: number;
597
+ targetSpawnTileY?: number;
598
+ sourceTiledObjects?: Array<Record<string, unknown>>;
599
+ [key: string]: unknown;
600
+ }
601
+ /**
602
+ * Metadata describing how an item should be placed on the map.
603
+ */
604
+ interface PlaceableItemMetadata {
605
+ tilesWide?: number;
606
+ tilesHigh?: number;
607
+ flippable?: boolean;
608
+ [key: string]: unknown;
609
+ }
610
+ /**
611
+ * Simplified map data for API responses.
612
+ */
613
+ interface MapData {
614
+ id: string;
615
+ identifier: string;
616
+ displayName: string;
617
+ description?: string | null;
618
+ metadata?: Record<string, unknown> | null;
619
+ }
620
+ /**
621
+ * Input for creating a map object.
622
+ */
623
+ interface CreateMapObjectData {
624
+ itemId: string;
625
+ worldX: number;
626
+ worldY: number;
627
+ width?: number;
628
+ height?: number;
629
+ rotation?: number;
630
+ scale?: number;
631
+ metadata?: Record<string, unknown>;
632
+ }
633
+
634
+ /**
635
+ * Character & Avatar Types
636
+ *
637
+ * Literal types for character system. Database row types are in @playcademy/data/types.
638
+ *
639
+ * @module types/character
640
+ */
641
+ /**
642
+ * Character component categories.
643
+ */
644
+ type CharacterComponentType = 'body' | 'outfit' | 'hairstyle' | 'eyes' | 'accessory';
645
+
646
+ /**
647
+ * Notification Types
648
+ *
649
+ * @module types/notification
650
+ */
651
+
652
+ declare enum NotificationType {
653
+ ACHIEVEMENT = "achievement",
654
+ SYSTEM = "system",
655
+ PROMO = "promo"
656
+ }
657
+ declare enum NotificationStatus {
658
+ PENDING = "pending",
659
+ DELIVERED = "delivered",
660
+ SEEN = "seen",
661
+ CLICKED = "clicked",
662
+ DISMISSED = "dismissed",
663
+ EXPIRED = "expired"
664
+ }
665
+ interface NotificationStats {
666
+ total: number;
667
+ delivered: number;
668
+ seen: number;
669
+ clicked: number;
670
+ dismissed: number;
671
+ expired: number;
672
+ clickThroughRate: number;
673
+ }
674
+
23
675
  declare const users: drizzle_orm_pg_core.PgTableWithColumns<{
24
676
  name: "user";
25
677
  schema: undefined;
@@ -148,7 +800,7 @@ declare const users: drizzle_orm_pg_core.PgTableWithColumns<{
148
800
  tableName: "user";
149
801
  dataType: "string";
150
802
  columnType: "PgEnumColumn";
151
- data: "admin" | "player" | "developer";
803
+ data: "admin" | "developer" | "player";
152
804
  driverParam: string;
153
805
  notNull: true;
154
806
  hasDefault: true;
@@ -165,7 +817,7 @@ declare const users: drizzle_orm_pg_core.PgTableWithColumns<{
165
817
  tableName: "user";
166
818
  dataType: "string";
167
819
  columnType: "PgEnumColumn";
168
- data: "none" | "pending" | "approved";
820
+ data: "approved" | "none" | "pending";
169
821
  driverParam: string;
170
822
  notNull: true;
171
823
  hasDefault: true;
@@ -237,6 +889,23 @@ type GameMetadata = {
237
889
  emoji?: string;
238
890
  [key: string]: unknown;
239
891
  };
892
+ /**
893
+ * DNS validation records for custom hostname
894
+ * Structure for the validationRecords JSON field in game_custom_hostnames table
895
+ */
896
+ type CustomHostnameValidationRecords = {
897
+ /** TXT record for ownership verification */
898
+ ownership?: {
899
+ name?: string;
900
+ value?: string;
901
+ type?: string;
902
+ };
903
+ /** TXT records for SSL certificate validation */
904
+ ssl?: Array<{
905
+ txt_name?: string;
906
+ txt_value?: string;
907
+ }>;
908
+ };
240
909
  declare const games: drizzle_orm_pg_core.PgTableWithColumns<{
241
910
  name: "games";
242
911
  schema: undefined;
@@ -337,7 +1006,7 @@ declare const games: drizzle_orm_pg_core.PgTableWithColumns<{
337
1006
  tableName: "games";
338
1007
  dataType: "string";
339
1008
  columnType: "PgEnumColumn";
340
- data: "hosted" | "external";
1009
+ data: "external" | "hosted";
341
1010
  driverParam: string;
342
1011
  notNull: true;
343
1012
  hasDefault: true;
@@ -388,7 +1057,7 @@ declare const games: drizzle_orm_pg_core.PgTableWithColumns<{
388
1057
  tableName: "games";
389
1058
  dataType: "string";
390
1059
  columnType: "PgEnumColumn";
391
- data: "web" | "godot" | "unity";
1060
+ data: "godot" | "unity" | "web";
392
1061
  driverParam: string;
393
1062
  notNull: true;
394
1063
  hasDefault: true;
@@ -470,55 +1139,254 @@ declare const games: drizzle_orm_pg_core.PgTableWithColumns<{
470
1139
  identity: undefined;
471
1140
  generated: undefined;
472
1141
  }, {}, {}>;
473
- };
474
- dialect: "pg";
475
- }>;
476
- declare const gameSessions: drizzle_orm_pg_core.PgTableWithColumns<{
477
- name: "game_sessions";
478
- schema: undefined;
479
- columns: {
480
- id: drizzle_orm_pg_core.PgColumn<{
481
- name: "id";
482
- tableName: "game_sessions";
1142
+ };
1143
+ dialect: "pg";
1144
+ }>;
1145
+ declare const gameSessions: drizzle_orm_pg_core.PgTableWithColumns<{
1146
+ name: "game_sessions";
1147
+ schema: undefined;
1148
+ columns: {
1149
+ id: drizzle_orm_pg_core.PgColumn<{
1150
+ name: "id";
1151
+ tableName: "game_sessions";
1152
+ dataType: "string";
1153
+ columnType: "PgUUID";
1154
+ data: string;
1155
+ driverParam: string;
1156
+ notNull: true;
1157
+ hasDefault: true;
1158
+ isPrimaryKey: true;
1159
+ isAutoincrement: false;
1160
+ hasRuntimeDefault: false;
1161
+ enumValues: undefined;
1162
+ baseColumn: never;
1163
+ identity: undefined;
1164
+ generated: undefined;
1165
+ }, {}, {}>;
1166
+ userId: drizzle_orm_pg_core.PgColumn<{
1167
+ name: "user_id";
1168
+ tableName: "game_sessions";
1169
+ dataType: "string";
1170
+ columnType: "PgText";
1171
+ data: string;
1172
+ driverParam: string;
1173
+ notNull: true;
1174
+ hasDefault: false;
1175
+ isPrimaryKey: false;
1176
+ isAutoincrement: false;
1177
+ hasRuntimeDefault: false;
1178
+ enumValues: [string, ...string[]];
1179
+ baseColumn: never;
1180
+ identity: undefined;
1181
+ generated: undefined;
1182
+ }, {}, {}>;
1183
+ gameId: drizzle_orm_pg_core.PgColumn<{
1184
+ name: "game_id";
1185
+ tableName: "game_sessions";
1186
+ dataType: "string";
1187
+ columnType: "PgUUID";
1188
+ data: string;
1189
+ driverParam: string;
1190
+ notNull: true;
1191
+ hasDefault: false;
1192
+ isPrimaryKey: false;
1193
+ isAutoincrement: false;
1194
+ hasRuntimeDefault: false;
1195
+ enumValues: undefined;
1196
+ baseColumn: never;
1197
+ identity: undefined;
1198
+ generated: undefined;
1199
+ }, {}, {}>;
1200
+ startedAt: drizzle_orm_pg_core.PgColumn<{
1201
+ name: "started_at";
1202
+ tableName: "game_sessions";
1203
+ dataType: "date";
1204
+ columnType: "PgTimestamp";
1205
+ data: Date;
1206
+ driverParam: string;
1207
+ notNull: true;
1208
+ hasDefault: true;
1209
+ isPrimaryKey: false;
1210
+ isAutoincrement: false;
1211
+ hasRuntimeDefault: false;
1212
+ enumValues: undefined;
1213
+ baseColumn: never;
1214
+ identity: undefined;
1215
+ generated: undefined;
1216
+ }, {}, {}>;
1217
+ endedAt: drizzle_orm_pg_core.PgColumn<{
1218
+ name: "ended_at";
1219
+ tableName: "game_sessions";
1220
+ dataType: "date";
1221
+ columnType: "PgTimestamp";
1222
+ data: Date;
1223
+ driverParam: string;
1224
+ notNull: false;
1225
+ hasDefault: false;
1226
+ isPrimaryKey: false;
1227
+ isAutoincrement: false;
1228
+ hasRuntimeDefault: false;
1229
+ enumValues: undefined;
1230
+ baseColumn: never;
1231
+ identity: undefined;
1232
+ generated: undefined;
1233
+ }, {}, {}>;
1234
+ };
1235
+ dialect: "pg";
1236
+ }>;
1237
+ /**
1238
+ * Custom hostnames table
1239
+ *
1240
+ * Stores custom domain mappings for games with SSL provisioning via Cloudflare.
1241
+ */
1242
+ declare const gameCustomHostnames: drizzle_orm_pg_core.PgTableWithColumns<{
1243
+ name: "game_custom_hostnames";
1244
+ schema: undefined;
1245
+ columns: {
1246
+ id: drizzle_orm_pg_core.PgColumn<{
1247
+ name: "id";
1248
+ tableName: "game_custom_hostnames";
1249
+ dataType: "string";
1250
+ columnType: "PgUUID";
1251
+ data: string;
1252
+ driverParam: string;
1253
+ notNull: true;
1254
+ hasDefault: true;
1255
+ isPrimaryKey: true;
1256
+ isAutoincrement: false;
1257
+ hasRuntimeDefault: false;
1258
+ enumValues: undefined;
1259
+ baseColumn: never;
1260
+ identity: undefined;
1261
+ generated: undefined;
1262
+ }, {}, {}>;
1263
+ gameId: drizzle_orm_pg_core.PgColumn<{
1264
+ name: "game_id";
1265
+ tableName: "game_custom_hostnames";
1266
+ dataType: "string";
1267
+ columnType: "PgUUID";
1268
+ data: string;
1269
+ driverParam: string;
1270
+ notNull: true;
1271
+ hasDefault: false;
1272
+ isPrimaryKey: false;
1273
+ isAutoincrement: false;
1274
+ hasRuntimeDefault: false;
1275
+ enumValues: undefined;
1276
+ baseColumn: never;
1277
+ identity: undefined;
1278
+ generated: undefined;
1279
+ }, {}, {}>;
1280
+ userId: drizzle_orm_pg_core.PgColumn<{
1281
+ name: "user_id";
1282
+ tableName: "game_custom_hostnames";
1283
+ dataType: "string";
1284
+ columnType: "PgText";
1285
+ data: string;
1286
+ driverParam: string;
1287
+ notNull: true;
1288
+ hasDefault: false;
1289
+ isPrimaryKey: false;
1290
+ isAutoincrement: false;
1291
+ hasRuntimeDefault: false;
1292
+ enumValues: [string, ...string[]];
1293
+ baseColumn: never;
1294
+ identity: undefined;
1295
+ generated: undefined;
1296
+ }, {}, {}>;
1297
+ hostname: drizzle_orm_pg_core.PgColumn<{
1298
+ name: "hostname";
1299
+ tableName: "game_custom_hostnames";
1300
+ dataType: "string";
1301
+ columnType: "PgText";
1302
+ data: string;
1303
+ driverParam: string;
1304
+ notNull: true;
1305
+ hasDefault: false;
1306
+ isPrimaryKey: false;
1307
+ isAutoincrement: false;
1308
+ hasRuntimeDefault: false;
1309
+ enumValues: [string, ...string[]];
1310
+ baseColumn: never;
1311
+ identity: undefined;
1312
+ generated: undefined;
1313
+ }, {}, {}>;
1314
+ cloudflareId: drizzle_orm_pg_core.PgColumn<{
1315
+ name: "cloudflare_id";
1316
+ tableName: "game_custom_hostnames";
1317
+ dataType: "string";
1318
+ columnType: "PgText";
1319
+ data: string;
1320
+ driverParam: string;
1321
+ notNull: true;
1322
+ hasDefault: false;
1323
+ isPrimaryKey: false;
1324
+ isAutoincrement: false;
1325
+ hasRuntimeDefault: false;
1326
+ enumValues: [string, ...string[]];
1327
+ baseColumn: never;
1328
+ identity: undefined;
1329
+ generated: undefined;
1330
+ }, {}, {}>;
1331
+ environment: drizzle_orm_pg_core.PgColumn<{
1332
+ name: "environment";
1333
+ tableName: "game_custom_hostnames";
1334
+ dataType: "string";
1335
+ columnType: "PgEnumColumn";
1336
+ data: "production" | "staging";
1337
+ driverParam: string;
1338
+ notNull: true;
1339
+ hasDefault: true;
1340
+ isPrimaryKey: false;
1341
+ isAutoincrement: false;
1342
+ hasRuntimeDefault: false;
1343
+ enumValues: ["staging", "production"];
1344
+ baseColumn: never;
1345
+ identity: undefined;
1346
+ generated: undefined;
1347
+ }, {}, {}>;
1348
+ status: drizzle_orm_pg_core.PgColumn<{
1349
+ name: "status";
1350
+ tableName: "game_custom_hostnames";
483
1351
  dataType: "string";
484
- columnType: "PgUUID";
485
- data: string;
1352
+ columnType: "PgEnumColumn";
1353
+ data: "active" | "blocked" | "deleted" | "pending" | "pending_deletion" | "pending_deployment" | "pending_validation";
486
1354
  driverParam: string;
487
1355
  notNull: true;
488
1356
  hasDefault: true;
489
- isPrimaryKey: true;
1357
+ isPrimaryKey: false;
490
1358
  isAutoincrement: false;
491
1359
  hasRuntimeDefault: false;
492
- enumValues: undefined;
1360
+ enumValues: ["pending", "pending_validation", "pending_deployment", "pending_deletion", "active", "blocked", "deleted"];
493
1361
  baseColumn: never;
494
1362
  identity: undefined;
495
1363
  generated: undefined;
496
1364
  }, {}, {}>;
497
- userId: drizzle_orm_pg_core.PgColumn<{
498
- name: "user_id";
499
- tableName: "game_sessions";
1365
+ sslStatus: drizzle_orm_pg_core.PgColumn<{
1366
+ name: "ssl_status";
1367
+ tableName: "game_custom_hostnames";
500
1368
  dataType: "string";
501
- columnType: "PgText";
502
- data: string;
1369
+ columnType: "PgEnumColumn";
1370
+ data: "active" | "deleted" | "initializing" | "pending_deployment" | "pending_issuance" | "pending_validation";
503
1371
  driverParam: string;
504
1372
  notNull: true;
505
- hasDefault: false;
1373
+ hasDefault: true;
506
1374
  isPrimaryKey: false;
507
1375
  isAutoincrement: false;
508
1376
  hasRuntimeDefault: false;
509
- enumValues: [string, ...string[]];
1377
+ enumValues: ["initializing", "pending_validation", "pending_issuance", "pending_deployment", "active", "deleted"];
510
1378
  baseColumn: never;
511
1379
  identity: undefined;
512
1380
  generated: undefined;
513
1381
  }, {}, {}>;
514
- gameId: drizzle_orm_pg_core.PgColumn<{
515
- name: "game_id";
516
- tableName: "game_sessions";
517
- dataType: "string";
518
- columnType: "PgUUID";
519
- data: string;
520
- driverParam: string;
521
- notNull: true;
1382
+ validationRecords: drizzle_orm_pg_core.PgColumn<{
1383
+ name: "validation_records";
1384
+ tableName: "game_custom_hostnames";
1385
+ dataType: "json";
1386
+ columnType: "PgJsonb";
1387
+ data: CustomHostnameValidationRecords;
1388
+ driverParam: unknown;
1389
+ notNull: false;
522
1390
  hasDefault: false;
523
1391
  isPrimaryKey: false;
524
1392
  isAutoincrement: false;
@@ -527,10 +1395,12 @@ declare const gameSessions: drizzle_orm_pg_core.PgTableWithColumns<{
527
1395
  baseColumn: never;
528
1396
  identity: undefined;
529
1397
  generated: undefined;
530
- }, {}, {}>;
531
- startedAt: drizzle_orm_pg_core.PgColumn<{
532
- name: "started_at";
533
- tableName: "game_sessions";
1398
+ }, {}, {
1399
+ $type: CustomHostnameValidationRecords;
1400
+ }>;
1401
+ createdAt: drizzle_orm_pg_core.PgColumn<{
1402
+ name: "created_at";
1403
+ tableName: "game_custom_hostnames";
534
1404
  dataType: "date";
535
1405
  columnType: "PgTimestamp";
536
1406
  data: Date;
@@ -545,15 +1415,15 @@ declare const gameSessions: drizzle_orm_pg_core.PgTableWithColumns<{
545
1415
  identity: undefined;
546
1416
  generated: undefined;
547
1417
  }, {}, {}>;
548
- endedAt: drizzle_orm_pg_core.PgColumn<{
549
- name: "ended_at";
550
- tableName: "game_sessions";
1418
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
1419
+ name: "updated_at";
1420
+ tableName: "game_custom_hostnames";
551
1421
  dataType: "date";
552
1422
  columnType: "PgTimestamp";
553
1423
  data: Date;
554
1424
  driverParam: string;
555
- notNull: false;
556
- hasDefault: false;
1425
+ notNull: true;
1426
+ hasDefault: true;
557
1427
  isPrimaryKey: false;
558
1428
  isAutoincrement: false;
559
1429
  hasRuntimeDefault: false;
@@ -659,7 +1529,7 @@ declare const items: drizzle_orm_pg_core.PgTableWithColumns<{
659
1529
  tableName: "items";
660
1530
  dataType: "string";
661
1531
  columnType: "PgEnumColumn";
662
- data: "currency" | "badge" | "trophy" | "collectible" | "consumable" | "unlock" | "upgrade" | "accessory" | "other";
1532
+ data: "accessory" | "badge" | "collectible" | "consumable" | "currency" | "other" | "trophy" | "unlock" | "upgrade";
663
1533
  driverParam: string;
664
1534
  notNull: true;
665
1535
  hasDefault: true;
@@ -814,15 +1684,233 @@ declare const inventoryItems: drizzle_orm_pg_core.PgTableWithColumns<{
814
1684
  identity: undefined;
815
1685
  generated: undefined;
816
1686
  }, {}, {}>;
817
- updatedAt: drizzle_orm_pg_core.PgColumn<{
818
- name: "updated_at";
819
- tableName: "inventory_items";
820
- dataType: "date";
821
- columnType: "PgTimestamp";
822
- data: Date;
823
- driverParam: string;
1687
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
1688
+ name: "updated_at";
1689
+ tableName: "inventory_items";
1690
+ dataType: "date";
1691
+ columnType: "PgTimestamp";
1692
+ data: Date;
1693
+ driverParam: string;
1694
+ notNull: false;
1695
+ hasDefault: true;
1696
+ isPrimaryKey: false;
1697
+ isAutoincrement: false;
1698
+ hasRuntimeDefault: false;
1699
+ enumValues: undefined;
1700
+ baseColumn: never;
1701
+ identity: undefined;
1702
+ generated: undefined;
1703
+ }, {}, {}>;
1704
+ };
1705
+ dialect: "pg";
1706
+ }>;
1707
+ declare const currencies: drizzle_orm_pg_core.PgTableWithColumns<{
1708
+ name: "currencies";
1709
+ schema: undefined;
1710
+ columns: {
1711
+ id: drizzle_orm_pg_core.PgColumn<{
1712
+ name: "id";
1713
+ tableName: "currencies";
1714
+ dataType: "string";
1715
+ columnType: "PgUUID";
1716
+ data: string;
1717
+ driverParam: string;
1718
+ notNull: true;
1719
+ hasDefault: true;
1720
+ isPrimaryKey: true;
1721
+ isAutoincrement: false;
1722
+ hasRuntimeDefault: false;
1723
+ enumValues: undefined;
1724
+ baseColumn: never;
1725
+ identity: undefined;
1726
+ generated: undefined;
1727
+ }, {}, {}>;
1728
+ itemId: drizzle_orm_pg_core.PgColumn<{
1729
+ name: "item_id";
1730
+ tableName: "currencies";
1731
+ dataType: "string";
1732
+ columnType: "PgUUID";
1733
+ data: string;
1734
+ driverParam: string;
1735
+ notNull: true;
1736
+ hasDefault: false;
1737
+ isPrimaryKey: false;
1738
+ isAutoincrement: false;
1739
+ hasRuntimeDefault: false;
1740
+ enumValues: undefined;
1741
+ baseColumn: never;
1742
+ identity: undefined;
1743
+ generated: undefined;
1744
+ }, {}, {}>;
1745
+ symbol: drizzle_orm_pg_core.PgColumn<{
1746
+ name: "symbol";
1747
+ tableName: "currencies";
1748
+ dataType: "string";
1749
+ columnType: "PgText";
1750
+ data: string;
1751
+ driverParam: string;
1752
+ notNull: false;
1753
+ hasDefault: false;
1754
+ isPrimaryKey: false;
1755
+ isAutoincrement: false;
1756
+ hasRuntimeDefault: false;
1757
+ enumValues: [string, ...string[]];
1758
+ baseColumn: never;
1759
+ identity: undefined;
1760
+ generated: undefined;
1761
+ }, {}, {}>;
1762
+ isPrimary: drizzle_orm_pg_core.PgColumn<{
1763
+ name: "is_primary";
1764
+ tableName: "currencies";
1765
+ dataType: "boolean";
1766
+ columnType: "PgBoolean";
1767
+ data: boolean;
1768
+ driverParam: boolean;
1769
+ notNull: true;
1770
+ hasDefault: true;
1771
+ isPrimaryKey: false;
1772
+ isAutoincrement: false;
1773
+ hasRuntimeDefault: false;
1774
+ enumValues: undefined;
1775
+ baseColumn: never;
1776
+ identity: undefined;
1777
+ generated: undefined;
1778
+ }, {}, {}>;
1779
+ createdAt: drizzle_orm_pg_core.PgColumn<{
1780
+ name: "created_at";
1781
+ tableName: "currencies";
1782
+ dataType: "date";
1783
+ columnType: "PgTimestamp";
1784
+ data: Date;
1785
+ driverParam: string;
1786
+ notNull: true;
1787
+ hasDefault: true;
1788
+ isPrimaryKey: false;
1789
+ isAutoincrement: false;
1790
+ hasRuntimeDefault: false;
1791
+ enumValues: undefined;
1792
+ baseColumn: never;
1793
+ identity: undefined;
1794
+ generated: undefined;
1795
+ }, {}, {}>;
1796
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
1797
+ name: "updated_at";
1798
+ tableName: "currencies";
1799
+ dataType: "date";
1800
+ columnType: "PgTimestamp";
1801
+ data: Date;
1802
+ driverParam: string;
1803
+ notNull: false;
1804
+ hasDefault: true;
1805
+ isPrimaryKey: false;
1806
+ isAutoincrement: false;
1807
+ hasRuntimeDefault: false;
1808
+ enumValues: undefined;
1809
+ baseColumn: never;
1810
+ identity: undefined;
1811
+ generated: undefined;
1812
+ }, {}, {}>;
1813
+ };
1814
+ dialect: "pg";
1815
+ }>;
1816
+ declare const shopListings: drizzle_orm_pg_core.PgTableWithColumns<{
1817
+ name: "shop_listings";
1818
+ schema: undefined;
1819
+ columns: {
1820
+ id: drizzle_orm_pg_core.PgColumn<{
1821
+ name: "id";
1822
+ tableName: "shop_listings";
1823
+ dataType: "string";
1824
+ columnType: "PgUUID";
1825
+ data: string;
1826
+ driverParam: string;
1827
+ notNull: true;
1828
+ hasDefault: true;
1829
+ isPrimaryKey: true;
1830
+ isAutoincrement: false;
1831
+ hasRuntimeDefault: false;
1832
+ enumValues: undefined;
1833
+ baseColumn: never;
1834
+ identity: undefined;
1835
+ generated: undefined;
1836
+ }, {}, {}>;
1837
+ itemId: drizzle_orm_pg_core.PgColumn<{
1838
+ name: "item_id";
1839
+ tableName: "shop_listings";
1840
+ dataType: "string";
1841
+ columnType: "PgUUID";
1842
+ data: string;
1843
+ driverParam: string;
1844
+ notNull: true;
1845
+ hasDefault: false;
1846
+ isPrimaryKey: false;
1847
+ isAutoincrement: false;
1848
+ hasRuntimeDefault: false;
1849
+ enumValues: undefined;
1850
+ baseColumn: never;
1851
+ identity: undefined;
1852
+ generated: undefined;
1853
+ }, {}, {}>;
1854
+ currencyId: drizzle_orm_pg_core.PgColumn<{
1855
+ name: "currency_id";
1856
+ tableName: "shop_listings";
1857
+ dataType: "string";
1858
+ columnType: "PgUUID";
1859
+ data: string;
1860
+ driverParam: string;
1861
+ notNull: true;
1862
+ hasDefault: false;
1863
+ isPrimaryKey: false;
1864
+ isAutoincrement: false;
1865
+ hasRuntimeDefault: false;
1866
+ enumValues: undefined;
1867
+ baseColumn: never;
1868
+ identity: undefined;
1869
+ generated: undefined;
1870
+ }, {}, {}>;
1871
+ price: drizzle_orm_pg_core.PgColumn<{
1872
+ name: "price";
1873
+ tableName: "shop_listings";
1874
+ dataType: "number";
1875
+ columnType: "PgInteger";
1876
+ data: number;
1877
+ driverParam: string | number;
1878
+ notNull: true;
1879
+ hasDefault: false;
1880
+ isPrimaryKey: false;
1881
+ isAutoincrement: false;
1882
+ hasRuntimeDefault: false;
1883
+ enumValues: undefined;
1884
+ baseColumn: never;
1885
+ identity: undefined;
1886
+ generated: undefined;
1887
+ }, {}, {}>;
1888
+ sellBackPercentage: drizzle_orm_pg_core.PgColumn<{
1889
+ name: "sell_back_percentage";
1890
+ tableName: "shop_listings";
1891
+ dataType: "number";
1892
+ columnType: "PgInteger";
1893
+ data: number;
1894
+ driverParam: string | number;
1895
+ notNull: false;
1896
+ hasDefault: false;
1897
+ isPrimaryKey: false;
1898
+ isAutoincrement: false;
1899
+ hasRuntimeDefault: false;
1900
+ enumValues: undefined;
1901
+ baseColumn: never;
1902
+ identity: undefined;
1903
+ generated: undefined;
1904
+ }, {}, {}>;
1905
+ stock: drizzle_orm_pg_core.PgColumn<{
1906
+ name: "stock";
1907
+ tableName: "shop_listings";
1908
+ dataType: "number";
1909
+ columnType: "PgInteger";
1910
+ data: number;
1911
+ driverParam: string | number;
824
1912
  notNull: false;
825
- hasDefault: true;
1913
+ hasDefault: false;
826
1914
  isPrimaryKey: false;
827
1915
  isAutoincrement: false;
828
1916
  hasRuntimeDefault: false;
@@ -831,23 +1919,16 @@ declare const inventoryItems: drizzle_orm_pg_core.PgTableWithColumns<{
831
1919
  identity: undefined;
832
1920
  generated: undefined;
833
1921
  }, {}, {}>;
834
- };
835
- dialect: "pg";
836
- }>;
837
- declare const currencies: drizzle_orm_pg_core.PgTableWithColumns<{
838
- name: "currencies";
839
- schema: undefined;
840
- columns: {
841
- id: drizzle_orm_pg_core.PgColumn<{
842
- name: "id";
843
- tableName: "currencies";
844
- dataType: "string";
845
- columnType: "PgUUID";
846
- data: string;
847
- driverParam: string;
1922
+ isActive: drizzle_orm_pg_core.PgColumn<{
1923
+ name: "is_active";
1924
+ tableName: "shop_listings";
1925
+ dataType: "boolean";
1926
+ columnType: "PgBoolean";
1927
+ data: boolean;
1928
+ driverParam: boolean;
848
1929
  notNull: true;
849
1930
  hasDefault: true;
850
- isPrimaryKey: true;
1931
+ isPrimaryKey: false;
851
1932
  isAutoincrement: false;
852
1933
  hasRuntimeDefault: false;
853
1934
  enumValues: undefined;
@@ -855,14 +1936,14 @@ declare const currencies: drizzle_orm_pg_core.PgTableWithColumns<{
855
1936
  identity: undefined;
856
1937
  generated: undefined;
857
1938
  }, {}, {}>;
858
- itemId: drizzle_orm_pg_core.PgColumn<{
859
- name: "item_id";
860
- tableName: "currencies";
861
- dataType: "string";
862
- columnType: "PgUUID";
863
- data: string;
1939
+ availableFrom: drizzle_orm_pg_core.PgColumn<{
1940
+ name: "available_from";
1941
+ tableName: "shop_listings";
1942
+ dataType: "date";
1943
+ columnType: "PgTimestamp";
1944
+ data: Date;
864
1945
  driverParam: string;
865
- notNull: true;
1946
+ notNull: false;
866
1947
  hasDefault: false;
867
1948
  isPrimaryKey: false;
868
1949
  isAutoincrement: false;
@@ -872,35 +1953,18 @@ declare const currencies: drizzle_orm_pg_core.PgTableWithColumns<{
872
1953
  identity: undefined;
873
1954
  generated: undefined;
874
1955
  }, {}, {}>;
875
- symbol: drizzle_orm_pg_core.PgColumn<{
876
- name: "symbol";
877
- tableName: "currencies";
878
- dataType: "string";
879
- columnType: "PgText";
880
- data: string;
1956
+ availableUntil: drizzle_orm_pg_core.PgColumn<{
1957
+ name: "available_until";
1958
+ tableName: "shop_listings";
1959
+ dataType: "date";
1960
+ columnType: "PgTimestamp";
1961
+ data: Date;
881
1962
  driverParam: string;
882
1963
  notNull: false;
883
1964
  hasDefault: false;
884
1965
  isPrimaryKey: false;
885
1966
  isAutoincrement: false;
886
1967
  hasRuntimeDefault: false;
887
- enumValues: [string, ...string[]];
888
- baseColumn: never;
889
- identity: undefined;
890
- generated: undefined;
891
- }, {}, {}>;
892
- isPrimary: drizzle_orm_pg_core.PgColumn<{
893
- name: "is_primary";
894
- tableName: "currencies";
895
- dataType: "boolean";
896
- columnType: "PgBoolean";
897
- data: boolean;
898
- driverParam: boolean;
899
- notNull: true;
900
- hasDefault: true;
901
- isPrimaryKey: false;
902
- isAutoincrement: false;
903
- hasRuntimeDefault: false;
904
1968
  enumValues: undefined;
905
1969
  baseColumn: never;
906
1970
  identity: undefined;
@@ -908,7 +1972,7 @@ declare const currencies: drizzle_orm_pg_core.PgTableWithColumns<{
908
1972
  }, {}, {}>;
909
1973
  createdAt: drizzle_orm_pg_core.PgColumn<{
910
1974
  name: "created_at";
911
- tableName: "currencies";
1975
+ tableName: "shop_listings";
912
1976
  dataType: "date";
913
1977
  columnType: "PgTimestamp";
914
1978
  data: Date;
@@ -925,7 +1989,7 @@ declare const currencies: drizzle_orm_pg_core.PgTableWithColumns<{
925
1989
  }, {}, {}>;
926
1990
  updatedAt: drizzle_orm_pg_core.PgColumn<{
927
1991
  name: "updated_at";
928
- tableName: "currencies";
1992
+ tableName: "shop_listings";
929
1993
  dataType: "date";
930
1994
  columnType: "PgTimestamp";
931
1995
  data: Date;
@@ -1156,7 +2220,7 @@ declare const mapElements: drizzle_orm_pg_core.PgTableWithColumns<{
1156
2220
  tableName: "map_elements";
1157
2221
  dataType: "string";
1158
2222
  columnType: "PgEnumColumn";
1159
- data: "game_entry" | "game_registry" | "info" | "teleport" | "door_in" | "door_out" | "npc_interaction" | "quest_trigger";
2223
+ data: "door_in" | "door_out" | "game_entry" | "game_registry" | "info" | "npc_interaction" | "quest_trigger" | "teleport";
1160
2224
  driverParam: string;
1161
2225
  notNull: true;
1162
2226
  hasDefault: false;
@@ -1709,7 +2773,7 @@ declare const characterComponents: drizzle_orm_pg_core.PgTableWithColumns<{
1709
2773
  tableName: "character_components";
1710
2774
  dataType: "string";
1711
2775
  columnType: "PgEnumColumn";
1712
- data: "accessory" | "body" | "outfit" | "hairstyle" | "eyes";
2776
+ data: "accessory" | "body" | "eyes" | "hairstyle" | "outfit";
1713
2777
  driverParam: string;
1714
2778
  notNull: true;
1715
2779
  hasDefault: false;
@@ -2120,34 +3184,47 @@ declare const playerCharacterAccessories: drizzle_orm_pg_core.PgTableWithColumns
2120
3184
  };
2121
3185
  dialect: "pg";
2122
3186
  }>;
2123
-
2124
- declare const achievementScopeEnum: drizzle_orm_pg_core.PgEnum<["daily", "weekly", "monthly", "yearly", "game", "global", "map", "level", "event"]>;
2125
- declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{
2126
- name: "achievements";
3187
+ declare const notifications: drizzle_orm_pg_core.PgTableWithColumns<{
3188
+ name: "notifications";
2127
3189
  schema: undefined;
2128
3190
  columns: {
2129
3191
  id: drizzle_orm_pg_core.PgColumn<{
2130
3192
  name: "id";
2131
- tableName: "achievements";
3193
+ tableName: "notifications";
2132
3194
  dataType: "string";
2133
- columnType: "PgVarchar";
3195
+ columnType: "PgUUID";
2134
3196
  data: string;
2135
3197
  driverParam: string;
2136
3198
  notNull: true;
2137
- hasDefault: false;
3199
+ hasDefault: true;
2138
3200
  isPrimaryKey: true;
2139
3201
  isAutoincrement: false;
2140
3202
  hasRuntimeDefault: false;
3203
+ enumValues: undefined;
3204
+ baseColumn: never;
3205
+ identity: undefined;
3206
+ generated: undefined;
3207
+ }, {}, {}>;
3208
+ userId: drizzle_orm_pg_core.PgColumn<{
3209
+ name: "user_id";
3210
+ tableName: "notifications";
3211
+ dataType: "string";
3212
+ columnType: "PgText";
3213
+ data: string;
3214
+ driverParam: string;
3215
+ notNull: true;
3216
+ hasDefault: false;
3217
+ isPrimaryKey: false;
3218
+ isAutoincrement: false;
3219
+ hasRuntimeDefault: false;
2141
3220
  enumValues: [string, ...string[]];
2142
3221
  baseColumn: never;
2143
3222
  identity: undefined;
2144
3223
  generated: undefined;
2145
- }, {}, {
2146
- length: 255;
2147
- }>;
2148
- title: drizzle_orm_pg_core.PgColumn<{
2149
- name: "title";
2150
- tableName: "achievements";
3224
+ }, {}, {}>;
3225
+ type: drizzle_orm_pg_core.PgColumn<{
3226
+ name: "type";
3227
+ tableName: "notifications";
2151
3228
  dataType: "string";
2152
3229
  columnType: "PgVarchar";
2153
3230
  data: string;
@@ -2162,16 +3239,16 @@ declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{
2162
3239
  identity: undefined;
2163
3240
  generated: undefined;
2164
3241
  }, {}, {
2165
- length: 255;
3242
+ length: 50;
2166
3243
  }>;
2167
- description: drizzle_orm_pg_core.PgColumn<{
2168
- name: "description";
2169
- tableName: "achievements";
3244
+ title: drizzle_orm_pg_core.PgColumn<{
3245
+ name: "title";
3246
+ tableName: "notifications";
2170
3247
  dataType: "string";
2171
- columnType: "PgText";
3248
+ columnType: "PgVarchar";
2172
3249
  data: string;
2173
3250
  driverParam: string;
2174
- notNull: false;
3251
+ notNull: true;
2175
3252
  hasDefault: false;
2176
3253
  isPrimaryKey: false;
2177
3254
  isAutoincrement: false;
@@ -2180,31 +3257,33 @@ declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{
2180
3257
  baseColumn: never;
2181
3258
  identity: undefined;
2182
3259
  generated: undefined;
2183
- }, {}, {}>;
2184
- scope: drizzle_orm_pg_core.PgColumn<{
2185
- name: "scope";
2186
- tableName: "achievements";
3260
+ }, {}, {
3261
+ length: 255;
3262
+ }>;
3263
+ message: drizzle_orm_pg_core.PgColumn<{
3264
+ name: "message";
3265
+ tableName: "notifications";
2187
3266
  dataType: "string";
2188
- columnType: "PgEnumColumn";
2189
- data: "map" | "game" | "level" | "daily" | "weekly" | "monthly" | "yearly" | "global" | "event";
3267
+ columnType: "PgText";
3268
+ data: string;
2190
3269
  driverParam: string;
2191
3270
  notNull: true;
2192
3271
  hasDefault: false;
2193
3272
  isPrimaryKey: false;
2194
3273
  isAutoincrement: false;
2195
3274
  hasRuntimeDefault: false;
2196
- enumValues: ["daily", "weekly", "monthly", "yearly", "game", "global", "map", "level", "event"];
3275
+ enumValues: [string, ...string[]];
2197
3276
  baseColumn: never;
2198
3277
  identity: undefined;
2199
3278
  generated: undefined;
2200
3279
  }, {}, {}>;
2201
- rewardCredits: drizzle_orm_pg_core.PgColumn<{
2202
- name: "reward_credits";
2203
- tableName: "achievements";
2204
- dataType: "number";
2205
- columnType: "PgInteger";
2206
- data: number;
2207
- driverParam: string | number;
3280
+ data: drizzle_orm_pg_core.PgColumn<{
3281
+ name: "data";
3282
+ tableName: "notifications";
3283
+ dataType: "json";
3284
+ columnType: "PgJsonb";
3285
+ data: unknown;
3286
+ driverParam: unknown;
2208
3287
  notNull: true;
2209
3288
  hasDefault: true;
2210
3289
  isPrimaryKey: false;
@@ -2215,49 +3294,47 @@ declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{
2215
3294
  identity: undefined;
2216
3295
  generated: undefined;
2217
3296
  }, {}, {}>;
2218
- limit: drizzle_orm_pg_core.PgColumn<{
2219
- name: "limit";
2220
- tableName: "achievements";
2221
- dataType: "number";
2222
- columnType: "PgInteger";
2223
- data: number;
2224
- driverParam: string | number;
3297
+ priority: drizzle_orm_pg_core.PgColumn<{
3298
+ name: "priority";
3299
+ tableName: "notifications";
3300
+ dataType: "string";
3301
+ columnType: "PgEnumColumn";
3302
+ data: "high" | "low" | "normal" | "urgent";
3303
+ driverParam: string;
2225
3304
  notNull: true;
2226
3305
  hasDefault: true;
2227
3306
  isPrimaryKey: false;
2228
3307
  isAutoincrement: false;
2229
3308
  hasRuntimeDefault: false;
2230
- enumValues: undefined;
3309
+ enumValues: ["low", "normal", "high", "urgent"];
2231
3310
  baseColumn: never;
2232
3311
  identity: undefined;
2233
3312
  generated: undefined;
2234
3313
  }, {}, {}>;
2235
- completionType: drizzle_orm_pg_core.PgColumn<{
2236
- name: "completion_type";
2237
- tableName: "achievements";
3314
+ status: drizzle_orm_pg_core.PgColumn<{
3315
+ name: "status";
3316
+ tableName: "notifications";
2238
3317
  dataType: "string";
2239
- columnType: "PgVarchar";
2240
- data: string;
3318
+ columnType: "PgEnumColumn";
3319
+ data: "clicked" | "delivered" | "dismissed" | "expired" | "pending" | "seen";
2241
3320
  driverParam: string;
2242
3321
  notNull: true;
2243
- hasDefault: false;
3322
+ hasDefault: true;
2244
3323
  isPrimaryKey: false;
2245
3324
  isAutoincrement: false;
2246
3325
  hasRuntimeDefault: false;
2247
- enumValues: [string, ...string[]];
3326
+ enumValues: ["pending", "delivered", "seen", "clicked", "dismissed", "expired"];
2248
3327
  baseColumn: never;
2249
3328
  identity: undefined;
2250
3329
  generated: undefined;
2251
- }, {}, {
2252
- length: 50;
2253
- }>;
2254
- completionConfig: drizzle_orm_pg_core.PgColumn<{
2255
- name: "completion_config";
2256
- tableName: "achievements";
2257
- dataType: "json";
2258
- columnType: "PgJsonb";
2259
- data: unknown;
2260
- driverParam: unknown;
3330
+ }, {}, {}>;
3331
+ createdAt: drizzle_orm_pg_core.PgColumn<{
3332
+ name: "created_at";
3333
+ tableName: "notifications";
3334
+ dataType: "date";
3335
+ columnType: "PgTimestamp";
3336
+ data: Date;
3337
+ driverParam: string;
2261
3338
  notNull: true;
2262
3339
  hasDefault: true;
2263
3340
  isPrimaryKey: false;
@@ -2268,15 +3345,15 @@ declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{
2268
3345
  identity: undefined;
2269
3346
  generated: undefined;
2270
3347
  }, {}, {}>;
2271
- target: drizzle_orm_pg_core.PgColumn<{
2272
- name: "target";
2273
- tableName: "achievements";
2274
- dataType: "json";
2275
- columnType: "PgJsonb";
2276
- data: unknown;
2277
- driverParam: unknown;
2278
- notNull: true;
2279
- hasDefault: true;
3348
+ deliveredAt: drizzle_orm_pg_core.PgColumn<{
3349
+ name: "delivered_at";
3350
+ tableName: "notifications";
3351
+ dataType: "date";
3352
+ columnType: "PgTimestamp";
3353
+ data: Date;
3354
+ driverParam: string;
3355
+ notNull: false;
3356
+ hasDefault: false;
2280
3357
  isPrimaryKey: false;
2281
3358
  isAutoincrement: false;
2282
3359
  hasRuntimeDefault: false;
@@ -2285,15 +3362,15 @@ declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{
2285
3362
  identity: undefined;
2286
3363
  generated: undefined;
2287
3364
  }, {}, {}>;
2288
- active: drizzle_orm_pg_core.PgColumn<{
2289
- name: "active";
2290
- tableName: "achievements";
2291
- dataType: "boolean";
2292
- columnType: "PgBoolean";
2293
- data: boolean;
2294
- driverParam: boolean;
2295
- notNull: true;
2296
- hasDefault: true;
3365
+ seenAt: drizzle_orm_pg_core.PgColumn<{
3366
+ name: "seen_at";
3367
+ tableName: "notifications";
3368
+ dataType: "date";
3369
+ columnType: "PgTimestamp";
3370
+ data: Date;
3371
+ driverParam: string;
3372
+ notNull: false;
3373
+ hasDefault: false;
2297
3374
  isPrimaryKey: false;
2298
3375
  isAutoincrement: false;
2299
3376
  hasRuntimeDefault: false;
@@ -2302,15 +3379,15 @@ declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{
2302
3379
  identity: undefined;
2303
3380
  generated: undefined;
2304
3381
  }, {}, {}>;
2305
- createdAt: drizzle_orm_pg_core.PgColumn<{
2306
- name: "created_at";
2307
- tableName: "achievements";
3382
+ clickedAt: drizzle_orm_pg_core.PgColumn<{
3383
+ name: "clicked_at";
3384
+ tableName: "notifications";
2308
3385
  dataType: "date";
2309
3386
  columnType: "PgTimestamp";
2310
3387
  data: Date;
2311
3388
  driverParam: string;
2312
3389
  notNull: false;
2313
- hasDefault: true;
3390
+ hasDefault: false;
2314
3391
  isPrimaryKey: false;
2315
3392
  isAutoincrement: false;
2316
3393
  hasRuntimeDefault: false;
@@ -2319,14 +3396,67 @@ declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{
2319
3396
  identity: undefined;
2320
3397
  generated: undefined;
2321
3398
  }, {}, {}>;
2322
- updatedAt: drizzle_orm_pg_core.PgColumn<{
2323
- name: "updated_at";
2324
- tableName: "achievements";
3399
+ expiresAt: drizzle_orm_pg_core.PgColumn<{
3400
+ name: "expires_at";
3401
+ tableName: "notifications";
2325
3402
  dataType: "date";
2326
3403
  columnType: "PgTimestamp";
2327
3404
  data: Date;
2328
3405
  driverParam: string;
2329
3406
  notNull: false;
3407
+ hasDefault: false;
3408
+ isPrimaryKey: false;
3409
+ isAutoincrement: false;
3410
+ hasRuntimeDefault: false;
3411
+ enumValues: undefined;
3412
+ baseColumn: never;
3413
+ identity: undefined;
3414
+ generated: undefined;
3415
+ }, {}, {}>;
3416
+ method: drizzle_orm_pg_core.PgColumn<{
3417
+ name: "method";
3418
+ tableName: "notifications";
3419
+ dataType: "string";
3420
+ columnType: "PgVarchar";
3421
+ data: string;
3422
+ driverParam: string;
3423
+ notNull: false;
3424
+ hasDefault: false;
3425
+ isPrimaryKey: false;
3426
+ isAutoincrement: false;
3427
+ hasRuntimeDefault: false;
3428
+ enumValues: [string, ...string[]];
3429
+ baseColumn: never;
3430
+ identity: undefined;
3431
+ generated: undefined;
3432
+ }, {}, {
3433
+ length: 50;
3434
+ }>;
3435
+ clickUrl: drizzle_orm_pg_core.PgColumn<{
3436
+ name: "click_url";
3437
+ tableName: "notifications";
3438
+ dataType: "string";
3439
+ columnType: "PgText";
3440
+ data: string;
3441
+ driverParam: string;
3442
+ notNull: false;
3443
+ hasDefault: false;
3444
+ isPrimaryKey: false;
3445
+ isAutoincrement: false;
3446
+ hasRuntimeDefault: false;
3447
+ enumValues: [string, ...string[]];
3448
+ baseColumn: never;
3449
+ identity: undefined;
3450
+ generated: undefined;
3451
+ }, {}, {}>;
3452
+ metadata: drizzle_orm_pg_core.PgColumn<{
3453
+ name: "metadata";
3454
+ tableName: "notifications";
3455
+ dataType: "json";
3456
+ columnType: "PgJsonb";
3457
+ data: unknown;
3458
+ driverParam: unknown;
3459
+ notNull: true;
2330
3460
  hasDefault: true;
2331
3461
  isPrimaryKey: false;
2332
3462
  isAutoincrement: false;
@@ -2339,88 +3469,600 @@ declare const achievements: drizzle_orm_pg_core.PgTableWithColumns<{
2339
3469
  };
2340
3470
  dialect: "pg";
2341
3471
  }>;
2342
- declare const DeveloperStatusResponseSchema: z.ZodObject<{
2343
- status: z.ZodEnum<["none", "pending", "approved"]>;
3472
+ declare const UpsertGameMetadataSchema: z.ZodEffects<z.ZodObject<{
3473
+ displayName: z.ZodString;
3474
+ mapElementId: z.ZodNullable<z.ZodOptional<z.ZodString>>;
3475
+ platform: z.ZodEnum<["web", "godot", "unity"]>;
3476
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
3477
+ gameType: z.ZodDefault<z.ZodOptional<z.ZodEnum<["hosted", "external"]>>>;
3478
+ externalUrl: z.ZodOptional<z.ZodString>;
2344
3479
  }, "strip", z.ZodTypeAny, {
2345
- status: "none" | "pending" | "approved";
3480
+ displayName: string;
3481
+ mapElementId?: string | null | undefined;
3482
+ platform: "godot" | "unity" | "web";
3483
+ metadata: Record<string, unknown>;
3484
+ gameType: "external" | "hosted";
3485
+ externalUrl?: string | undefined;
2346
3486
  }, {
2347
- status: "none" | "pending" | "approved";
3487
+ displayName: string;
3488
+ mapElementId?: string | null | undefined;
3489
+ platform: "godot" | "unity" | "web";
3490
+ metadata?: Record<string, unknown> | undefined;
3491
+ gameType?: "external" | "hosted" | undefined;
3492
+ externalUrl?: string | undefined;
3493
+ }>, {
3494
+ displayName: string;
3495
+ mapElementId?: string | null | undefined;
3496
+ platform: "godot" | "unity" | "web";
3497
+ metadata: Record<string, unknown>;
3498
+ gameType: "external" | "hosted";
3499
+ externalUrl?: string | undefined;
3500
+ }, {
3501
+ displayName: string;
3502
+ mapElementId?: string | null | undefined;
3503
+ platform: "godot" | "unity" | "web";
3504
+ metadata?: Record<string, unknown> | undefined;
3505
+ gameType?: "external" | "hosted" | undefined;
3506
+ externalUrl?: string | undefined;
2348
3507
  }>;
2349
- /**
2350
- * Simplified game manifest for Cloudflare Workers deployments
2351
- *
2352
- * The manifest is auto-generated by build tools (Godot plugin, Vite plugin, etc.)
2353
- * and provides minimal metadata about the build.
2354
- *
2355
- * Fields:
2356
- * - version: Manifest schema version (for future migrations)
2357
- * - platform: Auto-detected by build tool (e.g., 'web', 'godot@4.3', 'unity@2023')
2358
- * - createdAt: Build timestamp (ISO 8601)
2359
- *
2360
- * Note: With unified Cloudflare Workers deployments, the worker handles all routing
2361
- * internally, so we no longer need bootMode, entryPoint, or styles fields.
2362
- */
2363
- declare const ManifestV1Schema: z.ZodObject<{
2364
- version: z.ZodString;
2365
- platform: z.ZodString;
2366
- createdAt: z.ZodString;
3508
+
3509
+ declare const InsertItemSchema: drizzle_zod.BuildSchema<"insert", {
3510
+ id: drizzle_orm_pg_core.PgColumn<{
3511
+ name: "id";
3512
+ tableName: "items";
3513
+ dataType: "string";
3514
+ columnType: "PgUUID";
3515
+ data: string;
3516
+ driverParam: string;
3517
+ notNull: true;
3518
+ hasDefault: true;
3519
+ isPrimaryKey: true;
3520
+ isAutoincrement: false;
3521
+ hasRuntimeDefault: false;
3522
+ enumValues: undefined;
3523
+ baseColumn: never;
3524
+ identity: undefined;
3525
+ generated: undefined;
3526
+ }, {}, {}>;
3527
+ slug: drizzle_orm_pg_core.PgColumn<{
3528
+ name: "slug";
3529
+ tableName: "items";
3530
+ dataType: "string";
3531
+ columnType: "PgText";
3532
+ data: string;
3533
+ driverParam: string;
3534
+ notNull: true;
3535
+ hasDefault: false;
3536
+ isPrimaryKey: false;
3537
+ isAutoincrement: false;
3538
+ hasRuntimeDefault: false;
3539
+ enumValues: [string, ...string[]];
3540
+ baseColumn: never;
3541
+ identity: undefined;
3542
+ generated: undefined;
3543
+ }, {}, {}>;
3544
+ gameId: drizzle_orm_pg_core.PgColumn<{
3545
+ name: "game_id";
3546
+ tableName: "items";
3547
+ dataType: "string";
3548
+ columnType: "PgUUID";
3549
+ data: string;
3550
+ driverParam: string;
3551
+ notNull: false;
3552
+ hasDefault: false;
3553
+ isPrimaryKey: false;
3554
+ isAutoincrement: false;
3555
+ hasRuntimeDefault: false;
3556
+ enumValues: undefined;
3557
+ baseColumn: never;
3558
+ identity: undefined;
3559
+ generated: undefined;
3560
+ }, {}, {}>;
3561
+ displayName: drizzle_orm_pg_core.PgColumn<{
3562
+ name: "display_name";
3563
+ tableName: "items";
3564
+ dataType: "string";
3565
+ columnType: "PgText";
3566
+ data: string;
3567
+ driverParam: string;
3568
+ notNull: true;
3569
+ hasDefault: false;
3570
+ isPrimaryKey: false;
3571
+ isAutoincrement: false;
3572
+ hasRuntimeDefault: false;
3573
+ enumValues: [string, ...string[]];
3574
+ baseColumn: never;
3575
+ identity: undefined;
3576
+ generated: undefined;
3577
+ }, {}, {}>;
3578
+ description: drizzle_orm_pg_core.PgColumn<{
3579
+ name: "description";
3580
+ tableName: "items";
3581
+ dataType: "string";
3582
+ columnType: "PgText";
3583
+ data: string;
3584
+ driverParam: string;
3585
+ notNull: false;
3586
+ hasDefault: false;
3587
+ isPrimaryKey: false;
3588
+ isAutoincrement: false;
3589
+ hasRuntimeDefault: false;
3590
+ enumValues: [string, ...string[]];
3591
+ baseColumn: never;
3592
+ identity: undefined;
3593
+ generated: undefined;
3594
+ }, {}, {}>;
3595
+ type: drizzle_orm_pg_core.PgColumn<{
3596
+ name: "type";
3597
+ tableName: "items";
3598
+ dataType: "string";
3599
+ columnType: "PgEnumColumn";
3600
+ data: "accessory" | "badge" | "collectible" | "consumable" | "currency" | "other" | "trophy" | "unlock" | "upgrade";
3601
+ driverParam: string;
3602
+ notNull: true;
3603
+ hasDefault: true;
3604
+ isPrimaryKey: false;
3605
+ isAutoincrement: false;
3606
+ hasRuntimeDefault: false;
3607
+ enumValues: ["currency", "badge", "trophy", "collectible", "consumable", "unlock", "upgrade", "accessory", "other"];
3608
+ baseColumn: never;
3609
+ identity: undefined;
3610
+ generated: undefined;
3611
+ }, {}, {}>;
3612
+ isPlaceable: drizzle_orm_pg_core.PgColumn<{
3613
+ name: "is_placeable";
3614
+ tableName: "items";
3615
+ dataType: "boolean";
3616
+ columnType: "PgBoolean";
3617
+ data: boolean;
3618
+ driverParam: boolean;
3619
+ notNull: true;
3620
+ hasDefault: true;
3621
+ isPrimaryKey: false;
3622
+ isAutoincrement: false;
3623
+ hasRuntimeDefault: false;
3624
+ enumValues: undefined;
3625
+ baseColumn: never;
3626
+ identity: undefined;
3627
+ generated: undefined;
3628
+ }, {}, {}>;
3629
+ imageUrl: drizzle_orm_pg_core.PgColumn<{
3630
+ name: "image_url";
3631
+ tableName: "items";
3632
+ dataType: "string";
3633
+ columnType: "PgText";
3634
+ data: string;
3635
+ driverParam: string;
3636
+ notNull: false;
3637
+ hasDefault: false;
3638
+ isPrimaryKey: false;
3639
+ isAutoincrement: false;
3640
+ hasRuntimeDefault: false;
3641
+ enumValues: [string, ...string[]];
3642
+ baseColumn: never;
3643
+ identity: undefined;
3644
+ generated: undefined;
3645
+ }, {}, {}>;
3646
+ metadata: drizzle_orm_pg_core.PgColumn<{
3647
+ name: "metadata";
3648
+ tableName: "items";
3649
+ dataType: "json";
3650
+ columnType: "PgJsonb";
3651
+ data: unknown;
3652
+ driverParam: unknown;
3653
+ notNull: false;
3654
+ hasDefault: true;
3655
+ isPrimaryKey: false;
3656
+ isAutoincrement: false;
3657
+ hasRuntimeDefault: false;
3658
+ enumValues: undefined;
3659
+ baseColumn: never;
3660
+ identity: undefined;
3661
+ generated: undefined;
3662
+ }, {}, {}>;
3663
+ createdAt: drizzle_orm_pg_core.PgColumn<{
3664
+ name: "created_at";
3665
+ tableName: "items";
3666
+ dataType: "date";
3667
+ columnType: "PgTimestamp";
3668
+ data: Date;
3669
+ driverParam: string;
3670
+ notNull: true;
3671
+ hasDefault: true;
3672
+ isPrimaryKey: false;
3673
+ isAutoincrement: false;
3674
+ hasRuntimeDefault: false;
3675
+ enumValues: undefined;
3676
+ baseColumn: never;
3677
+ identity: undefined;
3678
+ generated: undefined;
3679
+ }, {}, {}>;
3680
+ }, {
3681
+ imageUrl: z.ZodNullable<z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>>;
3682
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
3683
+ }>;
3684
+ declare const UpdateItemSchema: z.ZodObject<Omit<{
3685
+ id: z.ZodOptional<z.ZodString>;
3686
+ slug: z.ZodOptional<z.ZodString>;
3687
+ gameId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
3688
+ displayName: z.ZodOptional<z.ZodString>;
3689
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
3690
+ type: z.ZodOptional<z.ZodEnum<["currency", "badge", "trophy", "collectible", "consumable", "unlock", "upgrade", "accessory", "other"]>>;
3691
+ isPlaceable: z.ZodOptional<z.ZodBoolean>;
3692
+ imageUrl: z.ZodOptional<z.ZodNullable<z.ZodString>>;
3693
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
3694
+ createdAt: z.ZodOptional<z.ZodDate>;
3695
+ }, "createdAt" | "id">, "strip", z.ZodTypeAny, {
3696
+ slug?: string | undefined;
3697
+ gameId?: string | null | undefined;
3698
+ displayName?: string | undefined;
3699
+ description?: string | null | undefined;
3700
+ type?: "accessory" | "badge" | "collectible" | "consumable" | "currency" | "other" | "trophy" | "unlock" | "upgrade" | undefined;
3701
+ isPlaceable?: boolean | undefined;
3702
+ imageUrl?: string | null | undefined;
3703
+ metadata?: Record<string, unknown> | undefined;
3704
+ }, {
3705
+ slug?: string | undefined;
3706
+ gameId?: string | null | undefined;
3707
+ displayName?: string | undefined;
3708
+ description?: string | null | undefined;
3709
+ type?: "accessory" | "badge" | "collectible" | "consumable" | "currency" | "other" | "trophy" | "unlock" | "upgrade" | undefined;
3710
+ isPlaceable?: boolean | undefined;
3711
+ imageUrl?: string | null | undefined;
3712
+ metadata?: Record<string, unknown> | undefined;
3713
+ }>;
3714
+ declare const InsertCurrencySchema: drizzle_zod.BuildSchema<"insert", {
3715
+ id: drizzle_orm_pg_core.PgColumn<{
3716
+ name: "id";
3717
+ tableName: "currencies";
3718
+ dataType: "string";
3719
+ columnType: "PgUUID";
3720
+ data: string;
3721
+ driverParam: string;
3722
+ notNull: true;
3723
+ hasDefault: true;
3724
+ isPrimaryKey: true;
3725
+ isAutoincrement: false;
3726
+ hasRuntimeDefault: false;
3727
+ enumValues: undefined;
3728
+ baseColumn: never;
3729
+ identity: undefined;
3730
+ generated: undefined;
3731
+ }, {}, {}>;
3732
+ itemId: drizzle_orm_pg_core.PgColumn<{
3733
+ name: "item_id";
3734
+ tableName: "currencies";
3735
+ dataType: "string";
3736
+ columnType: "PgUUID";
3737
+ data: string;
3738
+ driverParam: string;
3739
+ notNull: true;
3740
+ hasDefault: false;
3741
+ isPrimaryKey: false;
3742
+ isAutoincrement: false;
3743
+ hasRuntimeDefault: false;
3744
+ enumValues: undefined;
3745
+ baseColumn: never;
3746
+ identity: undefined;
3747
+ generated: undefined;
3748
+ }, {}, {}>;
3749
+ symbol: drizzle_orm_pg_core.PgColumn<{
3750
+ name: "symbol";
3751
+ tableName: "currencies";
3752
+ dataType: "string";
3753
+ columnType: "PgText";
3754
+ data: string;
3755
+ driverParam: string;
3756
+ notNull: false;
3757
+ hasDefault: false;
3758
+ isPrimaryKey: false;
3759
+ isAutoincrement: false;
3760
+ hasRuntimeDefault: false;
3761
+ enumValues: [string, ...string[]];
3762
+ baseColumn: never;
3763
+ identity: undefined;
3764
+ generated: undefined;
3765
+ }, {}, {}>;
3766
+ isPrimary: drizzle_orm_pg_core.PgColumn<{
3767
+ name: "is_primary";
3768
+ tableName: "currencies";
3769
+ dataType: "boolean";
3770
+ columnType: "PgBoolean";
3771
+ data: boolean;
3772
+ driverParam: boolean;
3773
+ notNull: true;
3774
+ hasDefault: true;
3775
+ isPrimaryKey: false;
3776
+ isAutoincrement: false;
3777
+ hasRuntimeDefault: false;
3778
+ enumValues: undefined;
3779
+ baseColumn: never;
3780
+ identity: undefined;
3781
+ generated: undefined;
3782
+ }, {}, {}>;
3783
+ createdAt: drizzle_orm_pg_core.PgColumn<{
3784
+ name: "created_at";
3785
+ tableName: "currencies";
3786
+ dataType: "date";
3787
+ columnType: "PgTimestamp";
3788
+ data: Date;
3789
+ driverParam: string;
3790
+ notNull: true;
3791
+ hasDefault: true;
3792
+ isPrimaryKey: false;
3793
+ isAutoincrement: false;
3794
+ hasRuntimeDefault: false;
3795
+ enumValues: undefined;
3796
+ baseColumn: never;
3797
+ identity: undefined;
3798
+ generated: undefined;
3799
+ }, {}, {}>;
3800
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
3801
+ name: "updated_at";
3802
+ tableName: "currencies";
3803
+ dataType: "date";
3804
+ columnType: "PgTimestamp";
3805
+ data: Date;
3806
+ driverParam: string;
3807
+ notNull: false;
3808
+ hasDefault: true;
3809
+ isPrimaryKey: false;
3810
+ isAutoincrement: false;
3811
+ hasRuntimeDefault: false;
3812
+ enumValues: undefined;
3813
+ baseColumn: never;
3814
+ identity: undefined;
3815
+ generated: undefined;
3816
+ }, {}, {}>;
3817
+ }, {
3818
+ itemId: z.ZodString;
3819
+ isPrimary: z.ZodDefault<z.ZodBoolean>;
3820
+ }>;
3821
+ declare const UpdateCurrencySchema: z.ZodObject<{
3822
+ itemId: z.ZodOptional<z.ZodString>;
3823
+ symbol: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodString>>>;
3824
+ isPrimary: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
2367
3825
  }, "strip", z.ZodTypeAny, {
2368
- createdAt: string;
2369
- version: string;
2370
- platform: string;
3826
+ itemId?: string | undefined;
3827
+ symbol?: string | null | undefined;
3828
+ isPrimary?: boolean | undefined;
2371
3829
  }, {
2372
- createdAt: string;
2373
- version: string;
2374
- platform: string;
3830
+ itemId?: string | undefined;
3831
+ symbol?: string | null | undefined;
3832
+ isPrimary?: boolean | undefined;
3833
+ }>;
3834
+ declare const InsertShopListingSchema: drizzle_zod.BuildSchema<"insert", {
3835
+ id: drizzle_orm_pg_core.PgColumn<{
3836
+ name: "id";
3837
+ tableName: "shop_listings";
3838
+ dataType: "string";
3839
+ columnType: "PgUUID";
3840
+ data: string;
3841
+ driverParam: string;
3842
+ notNull: true;
3843
+ hasDefault: true;
3844
+ isPrimaryKey: true;
3845
+ isAutoincrement: false;
3846
+ hasRuntimeDefault: false;
3847
+ enumValues: undefined;
3848
+ baseColumn: never;
3849
+ identity: undefined;
3850
+ generated: undefined;
3851
+ }, {}, {}>;
3852
+ itemId: drizzle_orm_pg_core.PgColumn<{
3853
+ name: "item_id";
3854
+ tableName: "shop_listings";
3855
+ dataType: "string";
3856
+ columnType: "PgUUID";
3857
+ data: string;
3858
+ driverParam: string;
3859
+ notNull: true;
3860
+ hasDefault: false;
3861
+ isPrimaryKey: false;
3862
+ isAutoincrement: false;
3863
+ hasRuntimeDefault: false;
3864
+ enumValues: undefined;
3865
+ baseColumn: never;
3866
+ identity: undefined;
3867
+ generated: undefined;
3868
+ }, {}, {}>;
3869
+ currencyId: drizzle_orm_pg_core.PgColumn<{
3870
+ name: "currency_id";
3871
+ tableName: "shop_listings";
3872
+ dataType: "string";
3873
+ columnType: "PgUUID";
3874
+ data: string;
3875
+ driverParam: string;
3876
+ notNull: true;
3877
+ hasDefault: false;
3878
+ isPrimaryKey: false;
3879
+ isAutoincrement: false;
3880
+ hasRuntimeDefault: false;
3881
+ enumValues: undefined;
3882
+ baseColumn: never;
3883
+ identity: undefined;
3884
+ generated: undefined;
3885
+ }, {}, {}>;
3886
+ price: drizzle_orm_pg_core.PgColumn<{
3887
+ name: "price";
3888
+ tableName: "shop_listings";
3889
+ dataType: "number";
3890
+ columnType: "PgInteger";
3891
+ data: number;
3892
+ driverParam: string | number;
3893
+ notNull: true;
3894
+ hasDefault: false;
3895
+ isPrimaryKey: false;
3896
+ isAutoincrement: false;
3897
+ hasRuntimeDefault: false;
3898
+ enumValues: undefined;
3899
+ baseColumn: never;
3900
+ identity: undefined;
3901
+ generated: undefined;
3902
+ }, {}, {}>;
3903
+ sellBackPercentage: drizzle_orm_pg_core.PgColumn<{
3904
+ name: "sell_back_percentage";
3905
+ tableName: "shop_listings";
3906
+ dataType: "number";
3907
+ columnType: "PgInteger";
3908
+ data: number;
3909
+ driverParam: string | number;
3910
+ notNull: false;
3911
+ hasDefault: false;
3912
+ isPrimaryKey: false;
3913
+ isAutoincrement: false;
3914
+ hasRuntimeDefault: false;
3915
+ enumValues: undefined;
3916
+ baseColumn: never;
3917
+ identity: undefined;
3918
+ generated: undefined;
3919
+ }, {}, {}>;
3920
+ stock: drizzle_orm_pg_core.PgColumn<{
3921
+ name: "stock";
3922
+ tableName: "shop_listings";
3923
+ dataType: "number";
3924
+ columnType: "PgInteger";
3925
+ data: number;
3926
+ driverParam: string | number;
3927
+ notNull: false;
3928
+ hasDefault: false;
3929
+ isPrimaryKey: false;
3930
+ isAutoincrement: false;
3931
+ hasRuntimeDefault: false;
3932
+ enumValues: undefined;
3933
+ baseColumn: never;
3934
+ identity: undefined;
3935
+ generated: undefined;
3936
+ }, {}, {}>;
3937
+ isActive: drizzle_orm_pg_core.PgColumn<{
3938
+ name: "is_active";
3939
+ tableName: "shop_listings";
3940
+ dataType: "boolean";
3941
+ columnType: "PgBoolean";
3942
+ data: boolean;
3943
+ driverParam: boolean;
3944
+ notNull: true;
3945
+ hasDefault: true;
3946
+ isPrimaryKey: false;
3947
+ isAutoincrement: false;
3948
+ hasRuntimeDefault: false;
3949
+ enumValues: undefined;
3950
+ baseColumn: never;
3951
+ identity: undefined;
3952
+ generated: undefined;
3953
+ }, {}, {}>;
3954
+ availableFrom: drizzle_orm_pg_core.PgColumn<{
3955
+ name: "available_from";
3956
+ tableName: "shop_listings";
3957
+ dataType: "date";
3958
+ columnType: "PgTimestamp";
3959
+ data: Date;
3960
+ driverParam: string;
3961
+ notNull: false;
3962
+ hasDefault: false;
3963
+ isPrimaryKey: false;
3964
+ isAutoincrement: false;
3965
+ hasRuntimeDefault: false;
3966
+ enumValues: undefined;
3967
+ baseColumn: never;
3968
+ identity: undefined;
3969
+ generated: undefined;
3970
+ }, {}, {}>;
3971
+ availableUntil: drizzle_orm_pg_core.PgColumn<{
3972
+ name: "available_until";
3973
+ tableName: "shop_listings";
3974
+ dataType: "date";
3975
+ columnType: "PgTimestamp";
3976
+ data: Date;
3977
+ driverParam: string;
3978
+ notNull: false;
3979
+ hasDefault: false;
3980
+ isPrimaryKey: false;
3981
+ isAutoincrement: false;
3982
+ hasRuntimeDefault: false;
3983
+ enumValues: undefined;
3984
+ baseColumn: never;
3985
+ identity: undefined;
3986
+ generated: undefined;
3987
+ }, {}, {}>;
3988
+ createdAt: drizzle_orm_pg_core.PgColumn<{
3989
+ name: "created_at";
3990
+ tableName: "shop_listings";
3991
+ dataType: "date";
3992
+ columnType: "PgTimestamp";
3993
+ data: Date;
3994
+ driverParam: string;
3995
+ notNull: true;
3996
+ hasDefault: true;
3997
+ isPrimaryKey: false;
3998
+ isAutoincrement: false;
3999
+ hasRuntimeDefault: false;
4000
+ enumValues: undefined;
4001
+ baseColumn: never;
4002
+ identity: undefined;
4003
+ generated: undefined;
4004
+ }, {}, {}>;
4005
+ updatedAt: drizzle_orm_pg_core.PgColumn<{
4006
+ name: "updated_at";
4007
+ tableName: "shop_listings";
4008
+ dataType: "date";
4009
+ columnType: "PgTimestamp";
4010
+ data: Date;
4011
+ driverParam: string;
4012
+ notNull: false;
4013
+ hasDefault: true;
4014
+ isPrimaryKey: false;
4015
+ isAutoincrement: false;
4016
+ hasRuntimeDefault: false;
4017
+ enumValues: undefined;
4018
+ baseColumn: never;
4019
+ identity: undefined;
4020
+ generated: undefined;
4021
+ }, {}, {}>;
4022
+ }, {
4023
+ price: z.ZodNumber;
4024
+ sellBackPercentage: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
4025
+ stock: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
4026
+ isActive: z.ZodDefault<z.ZodBoolean>;
4027
+ }>;
4028
+ declare const UpdateShopListingSchema: z.ZodObject<{
4029
+ id: z.ZodOptional<z.ZodOptional<z.ZodString>>;
4030
+ itemId: z.ZodOptional<z.ZodString>;
4031
+ currencyId: z.ZodOptional<z.ZodString>;
4032
+ price: z.ZodOptional<z.ZodNumber>;
4033
+ sellBackPercentage: z.ZodOptional<z.ZodNullable<z.ZodOptional<z.ZodNumber>>>;
4034
+ stock: z.ZodOptional<z.ZodNullable<z.ZodOptional<z.ZodNumber>>>;
4035
+ isActive: z.ZodOptional<z.ZodDefault<z.ZodBoolean>>;
4036
+ availableFrom: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodDate>>>;
4037
+ availableUntil: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodDate>>>;
4038
+ createdAt: z.ZodOptional<z.ZodOptional<z.ZodDate>>;
4039
+ updatedAt: z.ZodOptional<z.ZodOptional<z.ZodNullable<z.ZodDate>>>;
4040
+ }, "strip", z.ZodTypeAny, {
4041
+ id?: string | undefined;
4042
+ itemId?: string | undefined;
4043
+ currencyId?: string | undefined;
4044
+ price?: number | undefined;
4045
+ sellBackPercentage?: number | null | undefined;
4046
+ stock?: number | null | undefined;
4047
+ isActive?: boolean | undefined;
4048
+ availableFrom?: Date | null | undefined;
4049
+ availableUntil?: Date | null | undefined;
4050
+ createdAt?: Date | undefined;
4051
+ updatedAt?: Date | null | undefined;
4052
+ }, {
4053
+ id?: string | undefined;
4054
+ itemId?: string | undefined;
4055
+ currencyId?: string | undefined;
4056
+ price?: number | undefined;
4057
+ sellBackPercentage?: number | null | undefined;
4058
+ stock?: number | null | undefined;
4059
+ isActive?: boolean | undefined;
4060
+ availableFrom?: Date | null | undefined;
4061
+ availableUntil?: Date | null | undefined;
4062
+ createdAt?: Date | undefined;
4063
+ updatedAt?: Date | null | undefined;
2375
4064
  }>;
2376
4065
 
2377
- declare enum AchievementCompletionType {
2378
- TIME_PLAYED_SESSION = "time_played_session",
2379
- INTERACTION = "interaction",
2380
- LEADERBOARD_RANK = "leaderboard_rank",
2381
- FIRST_SCORE = "first_score",
2382
- PERSONAL_BEST = "personal_best"
2383
- }
2384
- type AchievementScopeType = (typeof achievementScopeEnum.enumValues)[number];
2385
- type Achievement = typeof achievements.$inferSelect;
2386
- /**
2387
- * Current-scope achievement with computed status and window metadata
2388
- */
2389
- interface AchievementCurrent {
2390
- id: string;
2391
- title: string;
2392
- description?: string | null;
2393
- scope: AchievementScopeType;
2394
- rewardCredits: number;
2395
- limit: number;
2396
- completionType: AchievementCompletionType;
2397
- completionConfig: Record<string, unknown>;
2398
- target: Record<string, unknown>;
2399
- active: boolean;
2400
- createdAt?: Date;
2401
- updatedAt?: Date;
2402
- status: 'available' | 'completed';
2403
- scopeKey: string;
2404
- windowStart: string;
2405
- windowEnd: string;
2406
- }
2407
- /**
2408
- * Achievement progress submission response
2409
- * Used in POST /api/achievements/progress
2410
- */
2411
- interface AchievementProgressResponse {
2412
- achievementId: string;
2413
- status: 'completed' | 'already_completed';
2414
- rewardCredits: number;
2415
- scopeKey: string;
2416
- createdAt: string;
2417
- }
2418
-
2419
- type CharacterComponent = typeof characterComponents.$inferSelect;
2420
- type PlayerCharacter = typeof playerCharacters.$inferSelect & {
2421
- accessories?: PlayerCharacterAccessory[];
2422
- };
2423
- type PlayerCharacterAccessory = typeof playerCharacterAccessories.$inferSelect;
2424
4066
  type GameRow = typeof games.$inferSelect;
2425
4067
  type BaseGame = Omit<GameRow, 'gameType' | 'deploymentUrl' | 'externalUrl'>;
2426
4068
  type HostedGame = BaseGame & {
@@ -2434,145 +4076,204 @@ type ExternalGame = BaseGame & {
2434
4076
  externalUrl: string;
2435
4077
  };
2436
4078
  type Game = HostedGame | ExternalGame;
2437
- type GameSession = typeof gameSessions.$inferSelect;
2438
- type GameStateData = Record<string, unknown>;
2439
- type Item = typeof items.$inferSelect;
2440
- type InventoryItem = typeof inventoryItems.$inferSelect;
2441
- type Currency = typeof currencies.$inferSelect;
2442
- interface PlaceableItemMetadata {
2443
- tilesWide?: number;
2444
- tilesHigh?: number;
2445
- flippable?: boolean;
2446
- [key: string]: unknown;
2447
- }
2448
- type Map = typeof maps.$inferSelect;
2449
- type MapElement = typeof mapElements.$inferSelect;
2450
- type MapObject = typeof mapObjects.$inferSelect;
4079
+ type GameSessionRow = typeof gameSessions.$inferSelect;
4080
+ type GameCustomHostnameRow = typeof gameCustomHostnames.$inferSelect;
4081
+
4082
+ type UpsertGameMetadataInput = z.infer<typeof UpsertGameMetadataSchema>;
4083
+
4084
+ type MapRow = typeof maps.$inferSelect;
4085
+ type MapElementRow = typeof mapElements.$inferSelect;
4086
+ type MapObjectRow = typeof mapObjects.$inferSelect;
4087
+
4088
+ type CharacterComponentRow = typeof characterComponents.$inferSelect;
4089
+ type PlayerCharacterRow = typeof playerCharacters.$inferSelect & {
4090
+ accessories?: PlayerCharacterAccessoryRow[];
4091
+ };
4092
+ type PlayerCharacterAccessoryRow = typeof playerCharacterAccessories.$inferSelect;
4093
+
4094
+ type ItemRow = typeof items.$inferSelect;
4095
+ type InventoryItemRow = typeof inventoryItems.$inferSelect;
4096
+ type CurrencyRow = typeof currencies.$inferSelect;
4097
+ type ShopListingRow = typeof shopListings.$inferSelect;
4098
+ type InsertItemInput = z.infer<typeof InsertItemSchema>;
4099
+ type UpdateItemInput = z.infer<typeof UpdateItemSchema>;
4100
+ type InsertCurrencyInput = z.infer<typeof InsertCurrencySchema>;
4101
+ type UpdateCurrencyInput = z.infer<typeof UpdateCurrencySchema>;
4102
+ type InsertShopListingInput = z.infer<typeof InsertShopListingSchema>;
4103
+ type UpdateShopListingInput = z.infer<typeof UpdateShopListingSchema>;
4104
+
4105
+ type UserRow = typeof users.$inferSelect;
2451
4106
 
2452
- type User = typeof users.$inferSelect;
2453
- type UserRoleEnumType = (typeof userRoleEnum.enumValues)[number];
2454
- type DeveloperStatusResponse = z.infer<typeof DeveloperStatusResponseSchema>;
2455
4107
  /**
2456
- * TimeBack enrollment information for a game.
4108
+ * Cross-Domain Composite Types
4109
+ * Types that combine data from multiple domains
2457
4110
  */
2458
- type UserEnrollment = {
2459
- gameId?: string;
2460
- courseId: string;
2461
- grade: number;
2462
- subject: string;
2463
- orgId?: string;
4111
+ type CharacterComponentWithSpriteUrl = CharacterComponentRow & {
4112
+ spriteSheetUrl: string;
4113
+ };
4114
+ type InventoryItemWithItem = InventoryItemRow & {
4115
+ item: ItemRow;
2464
4116
  };
2465
4117
  /**
2466
- * TimeBack user role (matches OneRoster spec).
4118
+ * Game with optional manifest metadata from build tools
2467
4119
  */
2468
- type TimebackUserRole = 'administrator' | 'aide' | 'guardian' | 'parent' | 'proctor' | 'relative' | 'student' | 'teacher';
4120
+ type FetchedGame = (HostedGame | ExternalGame | GameRow) & {
4121
+ manifest?: ManifestV1;
4122
+ };
2469
4123
  /**
2470
- * Organization type (matches OneRoster spec).
4124
+ * Session Bootstrap Payload Types
4125
+ * Complex types that combine user, inventory, game, and map data for client initialization
2471
4126
  */
2472
- type TimebackOrgType = 'department' | 'school' | 'district' | 'local' | 'state' | 'national';
4127
+ interface PlayerProfile {
4128
+ userId: UserRow['id'];
4129
+ username: UserRow['username'];
4130
+ name: UserRow['name'];
4131
+ image?: UserRow['image'];
4132
+ role?: UserRow['role'];
4133
+ level?: number;
4134
+ experience?: number;
4135
+ experienceToNextLevel?: number;
4136
+ characterCreated?: UserRow['characterCreated'];
4137
+ hasTimebackAccount?: boolean;
4138
+ }
4139
+ interface PlayerCurrency {
4140
+ currencySystemId: CurrencyRow['id'];
4141
+ itemId: ItemRow['id'];
4142
+ name: ItemRow['displayName'];
4143
+ symbol?: CurrencyRow['symbol'];
4144
+ imageUrl?: ItemRow['imageUrl'];
4145
+ isPrimary: CurrencyRow['isPrimary'];
4146
+ balance: number;
4147
+ }
4148
+ interface PlayerInventoryItem {
4149
+ inventoryItemEntryId: InventoryItemRow['id'];
4150
+ item: ItemRow;
4151
+ quantity: InventoryItemRow['quantity'];
4152
+ updatedAt: InventoryItemRow['updatedAt'];
4153
+ }
4154
+ interface PlayerLocation {
4155
+ mapIdentifier: MapRow['identifier'];
4156
+ mapDisplayName: MapRow['displayName'];
4157
+ tileX?: number;
4158
+ tileY?: number;
4159
+ worldX?: number;
4160
+ worldY?: number;
4161
+ direction?: 'up' | 'down' | 'left' | 'right';
4162
+ }
4163
+ interface PlayerSessionPayload {
4164
+ profile: PlayerProfile;
4165
+ currencies: PlayerCurrency[];
4166
+ inventory: PlayerInventoryItem[];
4167
+ ownedGameIds: Game['id'][];
4168
+ currentLocation?: PlayerLocation;
4169
+ characterCreated?: UserRow['characterCreated'];
4170
+ playerCharacter?: PlayerCharacterRow | null;
4171
+ }
2473
4172
  /**
2474
- * TimeBack organization data for a user.
2475
- * Represents schools, districts, or other educational organizations.
4173
+ * Map-related Composite Types
4174
+ * DB row + joined game/item data
2476
4175
  */
2477
- type UserOrganization = {
2478
- /** Organization ID (OneRoster sourcedId) */
2479
- id: string;
2480
- /** Organization name */
2481
- name: string | null;
2482
- /** Organization type (school, district, etc.) */
2483
- type: TimebackOrgType | string;
2484
- /** Whether this is the user's primary organization */
2485
- isPrimary: boolean;
4176
+ type MapElementWithGame = MapElementRow & {
4177
+ game: {
4178
+ id: string;
4179
+ displayName: string;
4180
+ } | null;
2486
4181
  };
2487
- /**
2488
- * TimeBack student profile (role + organizations).
2489
- * Subset of UserTimebackData returned by OneRoster API.
2490
- */
2491
- type TimebackStudentProfile = {
2492
- /** User's primary role in TimeBack (student, parent, teacher, etc.) */
2493
- role: TimebackUserRole;
2494
- /** User's organizations (schools/districts) */
2495
- organizations: UserOrganization[];
4182
+ type MapObjectWithItem = MapObjectRow & {
4183
+ item: {
4184
+ id: string;
4185
+ slug: string;
4186
+ displayName: string;
4187
+ description?: string | null;
4188
+ imageUrl?: string | null;
4189
+ isPlaceable: boolean;
4190
+ metadata?: PlaceableItemMetadata | null;
4191
+ };
2496
4192
  };
2497
4193
  /**
2498
- * TimeBack-related data for a user.
4194
+ * Game custom hostname with validation records
2499
4195
  */
2500
- type UserTimebackData = TimebackStudentProfile & {
2501
- /** User's TimeBack ID (sourcedId) */
2502
- id: string;
2503
- /** Course enrollments */
2504
- enrollments: UserEnrollment[];
4196
+ type GameCustomHostname = GameCustomHostnameRow & {
4197
+ validationRecords?: DomainValidationRecords;
2505
4198
  };
2506
- /**
2507
- * User data with authentication provider information.
2508
- * Returned by the /users/me endpoint with additional auth context.
2509
- */
2510
- type AuthenticatedUser = Omit<User, 'timebackId'> & {
2511
- /** Whether the user authenticated via Timeback SSO */
2512
- hasTimebackAccount: boolean;
2513
- /** TimeBack data (id, role, enrollments, organizations) - only present if user has a timeback account */
2514
- timeback?: UserTimebackData;
4199
+
4200
+ type UserLevelRow = typeof userLevels.$inferSelect;
4201
+ type LevelConfigRow = typeof levelConfigs.$inferSelect;
4202
+ type UserLevelWithConfig = UserLevelRow & {
4203
+ xpToNextLevel: number;
4204
+ nextLevelConfig?: LevelConfigRow;
2515
4205
  };
2516
4206
 
4207
+ type SpriteTemplateRow = typeof spriteTemplates.$inferSelect;
4208
+
4209
+ type NotificationRow = InferSelectModel<typeof notifications>;
4210
+
2517
4211
  /**
2518
- * Cross-Domain Composite Types
2519
- * Types that combine data from multiple domains
4212
+ * Level & Progression Types
4213
+ *
4214
+ * API response DTOs for level system. Database row types are in @playcademy/data/types.
4215
+ *
4216
+ * @module types/level
2520
4217
  */
2521
- type ManifestV1 = z.infer<typeof ManifestV1Schema>;
2522
4218
  /**
2523
- * Basic user information in the shape of the claims from identity providers
4219
+ * Result of adding XP to a user.
2524
4220
  */
2525
- interface UserInfo {
2526
- /** Unique user identifier (sub claim from JWT) */
2527
- sub: string;
2528
- /** User's email address */
2529
- email: string;
2530
- /** User's display name */
2531
- name: string;
2532
- /** Whether the email has been verified */
2533
- email_verified: boolean;
2534
- /** Optional given name (first name) */
2535
- given_name?: string;
2536
- /** Optional family name (last name) */
2537
- family_name?: string;
2538
- /** TimeBack student ID (if user has TimeBack integration) */
2539
- timeback_id?: string;
2540
- /** Additional user attributes from the identity provider */
2541
- [key: string]: unknown;
4221
+ interface XPAddResult {
4222
+ totalXP: number;
4223
+ newLevel: number;
4224
+ leveledUp: boolean;
4225
+ creditsAwarded: number;
4226
+ xpToNextLevel: number;
2542
4227
  }
2543
4228
  /**
2544
- * Character-related Composite Types
2545
- * Types that combine character component data with sprite sheet information
4229
+ * Result of checking whether a level up occurred.
2546
4230
  */
2547
- type CharacterComponentWithSpriteUrl = CharacterComponent & {
2548
- spriteSheetUrl: string;
2549
- };
2550
- type InventoryItemWithItem = Omit<InventoryItem, 'itemId'> & {
2551
- item: Item;
2552
- };
4231
+ interface LevelUpCheckResult {
4232
+ newLevel: number;
4233
+ remainingXp: number;
4234
+ leveledUp: boolean;
4235
+ creditsAwarded: number;
4236
+ xpToNextLevel: number;
4237
+ }
2553
4238
  /**
2554
- * Game with optional manifest metadata from build tools
4239
+ * Level progress API response.
2555
4240
  */
2556
- type FetchedGame = (HostedGame | ExternalGame | GameRow) & {
2557
- manifest?: ManifestV1;
2558
- };
4241
+ interface LevelProgressResponse {
4242
+ level: number;
4243
+ currentXp: number;
4244
+ xpToNextLevel: number;
4245
+ totalXP: number;
4246
+ }
4247
+
2559
4248
  /**
2560
- * Map-related Composite Types
2561
- * Types that combine map, game, and item data for rendering and interaction
4249
+ * Shop Types
4250
+ *
4251
+ * @module types/shop
2562
4252
  */
2563
- interface MapElementWithGame extends MapElement {
2564
- game: Pick<Game, 'id' | 'displayName'> | null;
2565
- }
2566
- interface MapObjectWithItem extends MapObject {
2567
- item: Pick<Item, 'id' | 'slug' | 'displayName' | 'description' | 'imageUrl' | 'isPlaceable'> & {
2568
- metadata: PlaceableItemMetadata;
2569
- };
4253
+ /**
4254
+ * Currency display info for shop UI.
4255
+ */
4256
+ interface ShopCurrency {
4257
+ id: string;
4258
+ symbol: string | null;
4259
+ isPrimary: boolean;
4260
+ displayName?: string | null;
4261
+ imageUrl?: string | null;
2570
4262
  }
2571
4263
  /**
2572
- * Shop-related Composite Types
2573
- * Types that combine inventory, currency, and shop listing data for commerce operations
4264
+ * Shop item for display.
4265
+ * Combines Item fields (excluding createdAt) with shop listing data.
2574
4266
  */
2575
- interface ShopDisplayItem extends Omit<Item, 'createdAt'> {
4267
+ interface ShopDisplayItem {
4268
+ id: string;
4269
+ slug: string;
4270
+ gameId?: string | null;
4271
+ displayName: string;
4272
+ description?: string | null;
4273
+ type: string;
4274
+ isPlaceable: boolean;
4275
+ imageUrl?: string | null;
4276
+ metadata?: unknown;
2576
4277
  listingId: string;
2577
4278
  shopPrice: number;
2578
4279
  currencyId: string;
@@ -2582,65 +4283,33 @@ interface ShopDisplayItem extends Omit<Item, 'createdAt'> {
2582
4283
  stock?: number | null;
2583
4284
  sellBackPercentage?: number | null;
2584
4285
  }
2585
- interface ShopCurrency {
2586
- id: string;
2587
- symbol: string | null;
2588
- isPrimary: boolean;
2589
- displayName?: string | null;
2590
- imageUrl?: string | null;
2591
- }
4286
+ /**
4287
+ * Complete shop view response.
4288
+ */
2592
4289
  interface ShopViewResponse {
2593
4290
  shopItems: ShopDisplayItem[];
2594
4291
  currencies: ShopCurrency[];
2595
4292
  }
4293
+
2596
4294
  /**
2597
- * Leaderboard Composite Types
2598
- * Types that combine leaderboard, user, and game data
4295
+ * Sprite Types
4296
+ *
4297
+ * JSON shapes for sprite configuration. Database row types are in @playcademy/data/types.
4298
+ *
4299
+ * @module types/sprite
2599
4300
  */
2600
- interface GameLeaderboardEntry {
2601
- rank: number;
2602
- userId: string;
2603
- username: string;
2604
- userImage?: string | null;
2605
- score: number;
2606
- achievedAt: Date;
2607
- metadata?: Record<string, unknown>;
2608
- gameId: string;
2609
- gameTitle: string;
2610
- gameSlug: string;
2611
- }
2612
-
2613
- type UserLevel = typeof userLevels.$inferSelect;
2614
- type LevelConfig = typeof levelConfigs.$inferSelect;
2615
- type UserLevelWithConfig = UserLevel & {
2616
- xpToNextLevel: number;
2617
- nextLevelConfig?: LevelConfig;
2618
- };
2619
- interface LeaderboardEntry {
2620
- rank: number;
2621
- userId: string;
2622
- username: string;
2623
- userImage?: string | null;
2624
- score: number;
2625
- achievedAt: Date;
2626
- metadata?: Record<string, unknown>;
2627
- gameId?: string;
2628
- gameTitle?: string;
2629
- gameSlug?: string;
2630
- }
2631
- interface UserRank {
2632
- rank: number;
2633
- totalPlayers: number;
2634
- score: number;
2635
- percentile: number;
2636
- }
2637
- interface UserRankResponse {
2638
- rank: number;
2639
- score: number;
2640
- userId: string;
4301
+ /**
4302
+ * Animation frame configuration.
4303
+ */
4304
+ interface SpriteAnimationFrame {
4305
+ row: number;
4306
+ frameStart: number;
4307
+ numFrames: number;
4308
+ fps: number;
2641
4309
  }
2642
-
2643
- type SpriteTemplate = typeof spriteTemplates.$inferSelect;
4310
+ /**
4311
+ * Sprite template data structure (stored in JSONB).
4312
+ */
2644
4313
  interface SpriteTemplateData {
2645
4314
  tileSize: number;
2646
4315
  tileHeight: number;
@@ -2648,118 +4317,31 @@ interface SpriteTemplateData {
2648
4317
  rows: number;
2649
4318
  spacing: number;
2650
4319
  animations: {
2651
- base_right: {
2652
- row: number;
2653
- frameStart: number;
2654
- numFrames: number;
2655
- fps: number;
2656
- };
2657
- base_up: {
2658
- row: number;
2659
- frameStart: number;
2660
- numFrames: number;
2661
- fps: number;
2662
- };
2663
- base_left: {
2664
- row: number;
2665
- frameStart: number;
2666
- numFrames: number;
2667
- fps: number;
2668
- };
2669
- base_down: {
2670
- row: number;
2671
- frameStart: number;
2672
- numFrames: number;
2673
- fps: number;
2674
- };
2675
- idle_right: {
2676
- row: number;
2677
- frameStart: number;
2678
- numFrames: number;
2679
- fps: number;
2680
- };
2681
- walk_right: {
2682
- row: number;
2683
- frameStart: number;
2684
- numFrames: number;
2685
- fps: number;
2686
- };
2687
- idle_up: {
2688
- row: number;
2689
- frameStart: number;
2690
- numFrames: number;
2691
- fps: number;
2692
- };
2693
- walk_up: {
2694
- row: number;
2695
- frameStart: number;
2696
- numFrames: number;
2697
- fps: number;
2698
- };
2699
- idle_left: {
2700
- row: number;
2701
- frameStart: number;
2702
- numFrames: number;
2703
- fps: number;
2704
- };
2705
- walk_left: {
2706
- row: number;
2707
- frameStart: number;
2708
- numFrames: number;
2709
- fps: number;
2710
- };
2711
- idle_down: {
2712
- row: number;
2713
- frameStart: number;
2714
- numFrames: number;
2715
- fps: number;
2716
- };
2717
- walk_down: {
2718
- row: number;
2719
- frameStart: number;
2720
- numFrames: number;
2721
- fps: number;
2722
- };
4320
+ base_right: SpriteAnimationFrame;
4321
+ base_up: SpriteAnimationFrame;
4322
+ base_left: SpriteAnimationFrame;
4323
+ base_down: SpriteAnimationFrame;
4324
+ idle_right: SpriteAnimationFrame;
4325
+ walk_right: SpriteAnimationFrame;
4326
+ idle_up: SpriteAnimationFrame;
4327
+ walk_up: SpriteAnimationFrame;
4328
+ idle_left: SpriteAnimationFrame;
4329
+ walk_left: SpriteAnimationFrame;
4330
+ idle_down: SpriteAnimationFrame;
4331
+ walk_down: SpriteAnimationFrame;
2723
4332
  };
2724
4333
  }
2725
- type TodayXpResponse = {
2726
- xp: number;
2727
- date: string;
2728
- };
2729
- type TotalXpResponse = {
2730
- totalXp: number;
2731
- };
2732
- type XpHistoryResponse = {
2733
- history: Array<{
2734
- date: string;
2735
- xp: number;
2736
- }>;
2737
- };
2738
4334
  /**
2739
- * Minimal course configuration for TimeBack integration (used in user-facing config).
2740
- *
2741
- * NOTE: Per-course overrides (title, courseCode, level, metadata) are defined
2742
- * in @playcademy/sdk/server as TimebackCourseConfigWithOverrides.
2743
- * This base type only includes the minimal required fields.
2744
- *
2745
- * For totalXp, use metadata.metrics.totalXp (aligns with upstream TimeBack structure).
4335
+ * Sprite sheet configuration with precomputed dimensions.
2746
4336
  */
2747
- type TimebackCourseConfig = {
2748
- subject: string;
2749
- grade: number;
2750
- };
2751
- type EndActivityResponse = {
2752
- status: 'ok';
2753
- courseId: string;
2754
- xpAwarded: number;
2755
- masteredUnits?: number;
2756
- pctCompleteApp?: number;
2757
- scoreStatus?: string;
2758
- inProgress?: string;
2759
- };
2760
-
2761
- /** Permitted HTTP verbs */
2762
- type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
4337
+ interface SpriteConfigWithDimensions {
4338
+ textureUrl: string;
4339
+ columns: number;
4340
+ rows: number;
4341
+ spriteWidth: number;
4342
+ spriteHeight: number;
4343
+ animations: Record<string, SpriteAnimationFrame>;
4344
+ }
2763
4345
 
2764
4346
  /**
2765
4347
  * Connection monitoring types
@@ -3294,9 +4876,6 @@ declare abstract class PlaycademyBaseClient {
3294
4876
  * Initializes connection monitoring if enabled.
3295
4877
  */
3296
4878
  private _initializeConnectionMonitor;
3297
- /**
3298
- * Initializes an internal game session for automatic session management.
3299
- */
3300
4879
  private _initializeInternalSession;
3301
4880
  /**
3302
4881
  * Current user data and inventory management.
@@ -3340,8 +4919,8 @@ declare class PlaycademyClient extends PlaycademyBaseClient {
3340
4919
  */
3341
4920
  runtime: {
3342
4921
  getGameToken: (gameId: string, options?: {
3343
- apply?: boolean;
3344
- }) => Promise<GameTokenResponse>;
4922
+ apply?: boolean | undefined;
4923
+ } | undefined) => Promise<GameTokenResponse>;
3345
4924
  exit: () => Promise<void>;
3346
4925
  onInit: (handler: (context: GameContextPayload) => void) => void;
3347
4926
  onTokenRefresh: (handler: (data: {
@@ -3365,7 +4944,7 @@ declare class PlaycademyClient extends PlaycademyBaseClient {
3365
4944
  getListenerCounts: () => Record<string, number>;
3366
4945
  assets: {
3367
4946
  url(pathOrStrings: string | TemplateStringsArray, ...values: unknown[]): string;
3368
- fetch: (path: string, options?: RequestInit) => Promise<Response>;
4947
+ fetch: (path: string, options?: RequestInit | undefined) => Promise<Response>;
3369
4948
  json: <T = unknown>(path: string) => Promise<T>;
3370
4949
  blob: (path: string) => Promise<Blob>;
3371
4950
  text: (path: string) => Promise<string>;
@@ -3388,10 +4967,10 @@ declare class PlaycademyClient extends PlaycademyBaseClient {
3388
4967
  */
3389
4968
  timeback: {
3390
4969
  readonly user: TimebackUser;
3391
- startActivity: (metadata: _playcademy_timeback_types.ActivityData) => void;
4970
+ startActivity: (metadata: ActivityData) => void;
3392
4971
  pauseActivity: () => void;
3393
4972
  resumeActivity: () => void;
3394
- endActivity: (data: _playcademy_timeback_types.EndActivityScoreData) => Promise<EndActivityResponse>;
4973
+ endActivity: (data: EndActivityScoreData) => Promise<EndActivityResponse>;
3395
4974
  };
3396
4975
  /**
3397
4976
  * Playcademy Credits (platform currency) management.
@@ -3408,7 +4987,7 @@ declare class PlaycademyClient extends PlaycademyBaseClient {
3408
4987
  * - `submit(gameId, score, metadata?)` - Record a game score
3409
4988
  */
3410
4989
  scores: {
3411
- submit: (gameId: string, score: number, metadata?: Record<string, unknown>) => Promise<ScoreSubmission>;
4990
+ submit: (gameId: string, score: number, metadata?: Record<string, unknown> | undefined) => Promise<ScoreSubmission>;
3412
4991
  };
3413
4992
  /**
3414
4993
  * Realtime multiplayer authentication.
@@ -3425,13 +5004,13 @@ declare class PlaycademyClient extends PlaycademyBaseClient {
3425
5004
  * - Routes are relative to your game's deployment (e.g., '/hello' → your-game.playcademy.gg/api/hello)
3426
5005
  */
3427
5006
  backend: {
3428
- get<T = unknown>(path: string, headers?: Record<string, string>): Promise<T>;
3429
- post<T = unknown>(path: string, body?: unknown, headers?: Record<string, string>): Promise<T>;
3430
- put<T = unknown>(path: string, body?: unknown, headers?: Record<string, string>): Promise<T>;
3431
- patch<T = unknown>(path: string, body?: unknown, headers?: Record<string, string>): Promise<T>;
3432
- delete<T = unknown>(path: string, headers?: Record<string, string>): Promise<T>;
3433
- request<T = unknown>(path: string, method: Method, body?: unknown, headers?: Record<string, string>): Promise<T>;
3434
- download(path: string, method?: Method, body?: unknown, headers?: Record<string, string>): Promise<Response>;
5007
+ get<T = unknown>(path: string, headers?: Record<string, string> | undefined): Promise<T>;
5008
+ post<T = unknown>(path: string, body?: unknown, headers?: Record<string, string> | undefined): Promise<T>;
5009
+ put<T = unknown>(path: string, body?: unknown, headers?: Record<string, string> | undefined): Promise<T>;
5010
+ patch<T = unknown>(path: string, body?: unknown, headers?: Record<string, string> | undefined): Promise<T>;
5011
+ delete<T = unknown>(path: string, headers?: Record<string, string> | undefined): Promise<T>;
5012
+ request<T = unknown>(path: string, method: Method, body?: unknown, headers?: Record<string, string> | undefined): Promise<T>;
5013
+ download(path: string, method?: Method, body?: unknown, headers?: Record<string, string> | undefined): Promise<Response>;
3435
5014
  url(pathOrStrings: string | TemplateStringsArray, ...values: unknown[]): string;
3436
5015
  };
3437
5016
  /** Auto-initializes a PlaycademyClient with context from the environment */
@@ -3447,8 +5026,8 @@ declare class PlaycademyClient extends PlaycademyBaseClient {
3447
5026
  /**
3448
5027
  * Type definitions for the game timeback namespace.
3449
5028
  *
3450
- * Re-exports core types from @playcademy/data for SDK consumers,
3451
- * plus SDK-specific types like TimebackInitContext.
5029
+ * SDK-specific types like TimebackInitContext that wrap the core types
5030
+ * from @playcademy/types/user (which are re-exported via types/data.ts).
3452
5031
  */
3453
5032
 
3454
5033
  /**
@@ -3557,8 +5136,11 @@ interface InitPayload {
3557
5136
  /**
3558
5137
  * Simplified user data passed to games via InitPayload
3559
5138
  * This is a subset of AuthenticatedUser suitable for external game consumption
5139
+ *
5140
+ * Note: Named GameInitUser to distinguish from the cross-game GameUser DTO
5141
+ * exported from @playcademy/types
3560
5142
  */
3561
- interface GameUser {
5143
+ interface GameInitUser {
3562
5144
  /** Playcademy user ID */
3563
5145
  id: string;
3564
5146
  /** Unique username */
@@ -3737,19 +5319,6 @@ interface ScoreSubmission {
3737
5319
  achievedAt: Date;
3738
5320
  }
3739
5321
 
3740
- /**
3741
- * Users namespace types
3742
- */
3743
- interface UserScore {
3744
- id: string;
3745
- score: number;
3746
- achievedAt: Date;
3747
- metadata?: Record<string, unknown>;
3748
- gameId: string;
3749
- gameTitle: string;
3750
- gameSlug: string;
3751
- }
3752
-
3753
5322
  /**
3754
5323
  * Authentication namespace types
3755
5324
  */
@@ -3888,6 +5457,8 @@ type DevUploadEvent = {
3888
5457
  } | {
3889
5458
  type: 'finalizeStatus';
3890
5459
  message: string;
5460
+ } | {
5461
+ type: 'complete';
3891
5462
  } | {
3892
5463
  type: 'close';
3893
5464
  };
@@ -4117,5 +5688,5 @@ interface PlaycademyServerClientState {
4117
5688
  courseId?: string;
4118
5689
  }
4119
5690
 
4120
- export { PlaycademyClient };
4121
- export type { Achievement, AchievementCurrent, AchievementProgressResponse, AuthCallbackPayload, AuthOptions, AuthProviderType, AuthResult, AuthServerMessage, AuthStateChangePayload, AuthStateUpdate, AuthenticatedUser, BetterAuthApiKey, BetterAuthApiKeyResponse, BetterAuthSignInResponse, BucketFile, CharacterComponent, CharacterComponentWithSpriteUrl, CharacterComponentsOptions, ClientConfig, ClientEvents, ConnectionStatePayload, CreateCharacterData, Currency, DevUploadEvent, DevUploadHooks, DeveloperStatusResponse, DisconnectContext, DisconnectHandler, DisplayAlertPayload, EventListeners, ExternalGame, FetchedGame, Game, GameContextPayload, GameLeaderboardEntry, GameSession, GameStateData, GameTokenResponse, GameUser, HostedGame, InitPayload, InventoryItem, InventoryItemWithItem, InventoryMutationResponse, Item, KeyEventPayload, LeaderboardEntry, LevelConfig, LoginResponse, ManifestV1, Map, MapElement, MapElementWithGame, MapObject, MapObjectWithItem, PlatformTimebackUser, PlatformTimebackUserContext, PlaycademyServerClientConfig, PlaycademyServerClientState, PlayerCharacter, RealtimeTokenResponse, ScoreSubmission, ShopCurrency, ShopDisplayItem, ShopViewResponse, SpriteTemplate, SpriteTemplateData, StartSessionResponse, TelemetryPayload, TimebackEnrollment, TimebackInitContext, TimebackOrganization, TimebackUser, TimebackUserContext, TimebackUserRole, TodayXpResponse, TokenRefreshPayload, TokenType, TotalXpResponse, UpdateCharacterData, User, UserEnrollment, UserInfo, UserLevel, UserLevelWithConfig, UserOrganization, UserRank, UserRankResponse, UserRoleEnumType, UserScore, UserTimebackData, XpHistoryResponse, XpSummaryResponse };
5691
+ export { AchievementCompletionType, NotificationStatus, NotificationType, PlaycademyClient };
5692
+ export type { AchievementCurrent, AchievementHistoryEntry, AchievementProgressResponse, AchievementScopeType, AchievementWithStatus, AuthCallbackPayload, AuthOptions, AuthProviderType, AuthResult, AuthServerMessage, AuthStateChangePayload, AuthStateUpdate, AuthenticatedUser, BetterAuthApiKey, BetterAuthApiKeyResponse, BetterAuthSignInResponse, BucketFile, CharacterComponentRow as CharacterComponent, CharacterComponentType, CharacterComponentWithSpriteUrl, CharacterComponentsOptions, ClientConfig, ClientEvents, ConnectionStatePayload, CreateCharacterData, CreateMapObjectData, CurrencyRow as Currency, DevUploadEvent, DevUploadHooks, DeveloperStatusEnumType, DeveloperStatusResponse, DeveloperStatusValue, DisconnectContext, DisconnectHandler, DisplayAlertPayload, EventListeners, ExternalGame, FetchedGame, Game, GameContextPayload, GameCustomHostname, GameInitUser, GameLeaderboardEntry, MapRow as GameMap, GamePlatform, GameRow as GameRecord, GameSessionRow as GameSession, GameTimebackIntegration, GameTokenResponse, GameType, GameUser, HostedGame, InitPayload, InsertCurrencyInput, InsertItemInput, InsertShopListingInput, InteractionType, InventoryItemRow as InventoryItem, InventoryItemWithItem, InventoryMutationResponse, ItemRow as Item, ItemType, KeyEventPayload, LeaderboardEntry, LeaderboardOptions, LeaderboardTimeframe, LevelConfigRow as LevelConfig, LevelProgressResponse, LevelUpCheckResult, LoginResponse, ManifestV1, MapData, MapElementRow as MapElement, MapElementMetadata, MapElementWithGame, MapObjectRow as MapObject, MapObjectWithItem, NotificationRow as Notification, NotificationStats, PlaceableItemMetadata, PlatformTimebackUser, PlatformTimebackUserContext, PlaycademyServerClientConfig, PlaycademyServerClientState, PlayerCharacterRow as PlayerCharacter, PlayerCharacterAccessoryRow as PlayerCharacterAccessory, PlayerCurrency, PlayerInventoryItem, PlayerProfile, PlayerSessionPayload, PopulateStudentResponse, RealtimeTokenResponse, ScoreSubmission, ShopCurrency, ShopDisplayItem, ShopListingRow as ShopListing, ShopViewResponse, SpriteAnimationFrame, SpriteConfigWithDimensions, SpriteTemplateRow as SpriteTemplate, SpriteTemplateData, StartSessionResponse, TelemetryPayload, TimebackEnrollment, TimebackInitContext, TimebackOrganization, TimebackUser, TimebackUserContext, TodayXpResponse, TokenRefreshPayload, TokenType, TotalXpResponse, UpdateCharacterData, UpdateCurrencyInput, UpdateItemInput, UpdateShopListingInput, UpsertGameMetadataInput, UserRow as User, UserEnrollment, UserInfo, UserLevelRow as UserLevel, UserLevelWithConfig, UserOrganization, UserRank, UserRankResponse, UserRoleEnumType, UserScore, UserTimebackData, XPAddResult, XpHistoryResponse, XpSummaryResponse };